diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml new file mode 100644 index 00000000..1c284c9d --- /dev/null +++ b/.github/codeql/codeql-config.yml @@ -0,0 +1,28 @@ +name: "CodeQL config" + +packs: + - trailofbits/cpp-queries + - githubsecuritylab/codeql-cpp-queries + - githubsecuritylab/codeql-python-queries + +queries: + - uses: security-extended + - uses: security-and-quality + +query-filters: + - exclude: + query path: + - /^experimental\/.*/ + - exclude: + tags contain: + - experimental + - exclude: + problem.severity: + - recommendation + - exclude: + id: tob/cpp/use-of-legacy-algorithm # We use legacy algorithms in many places for integrity checks + - exclude: + id: cpp/dead-code-goto # Too many false positives in no-build mode + +paths-ignore: + - tests/** diff --git a/.github/scripts/process_sarif.py b/.github/scripts/process_sarif.py new file mode 100644 index 00000000..fad689b6 --- /dev/null +++ b/.github/scripts/process_sarif.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 + +# This script is used to process the SARIF file generated by CodeQL and +# to rename files back to .ino and adjust line numbers to match the original .ino files. + +import json +import sys +import os + +def process_artifact_location(artifact_location, renamed_files): + """ + Process a single artifact location to rename .cpp files back to .ino + """ + if 'uri' in artifact_location: + uri = artifact_location['uri'] + if uri in renamed_files: + print(f"Renaming file: {uri} -> {renamed_files[uri]}") + artifact_location['uri'] = renamed_files[uri] + return True + return False + +def process_region(region): + """ + Adjust line numbers in a region by decreasing them by 1 + """ + if 'startLine' in region: + region['startLine'] = max(1, region['startLine'] - 1) + if 'endLine' in region: + region['endLine'] = max(1, region['endLine'] - 1) + +def process_physical_location(physical_location, renamed_files): + """ + Process a physical location to rename files and adjust line numbers + """ + file_renamed = False + + if 'artifactLocation' in physical_location: + if process_artifact_location(physical_location['artifactLocation'], renamed_files): + file_renamed = True + + # Adjust line numbers if the file was renamed + if file_renamed and 'region' in physical_location: + process_region(physical_location['region']) + + return file_renamed + + +def process_sarif_file(sarif_file, renamed_files_file): + """ + Process SARIF file to rename files back to .ino and adjust line numbers + """ + # Read the renamed files mapping + with open(renamed_files_file, 'r') as f: + renamed_files = json.load(f) + + print(f"Loaded {len(renamed_files)} file mappings:") + for cpp_file, ino_file in renamed_files.items(): + print(f" {cpp_file} -> {ino_file}") + + + # Read the SARIF file + with open(sarif_file, 'r') as f: + sarif_data = json.load(f) + + files_processed = 0 + + # Process each run + if 'runs' in sarif_data: + for run in sarif_data['runs']: + # Process results + if 'results' in run: + for result in run['results']: + # Process all locations in the result + if 'locations' in result: + for location in result['locations']: + if 'physicalLocation' in location: + if process_physical_location(location['physicalLocation'], renamed_files): + files_processed += 1 + + # Process related locations if they exist + if 'relatedLocations' in result: + for location in result['relatedLocations']: + if 'physicalLocation' in location: + if process_physical_location(location['physicalLocation'], renamed_files): + files_processed += 1 + + # Process artifacts if they exist + if 'artifacts' in run: + for artifact in run['artifacts']: + if 'location' in artifact and 'uri' in artifact['location']: + uri = artifact['location']['uri'] + if uri in renamed_files: + artifact['location']['uri'] = renamed_files[uri] + files_processed += 1 + + print(f"Processed {files_processed} file references") + + # Write the processed SARIF file + with open(sarif_file, 'w') as f: + json.dump(sarif_data, f, indent=2) + +def main(): + if len(sys.argv) != 3: + print("Usage: python3 sarif_nobuild.py ") + sys.exit(1) + + sarif_file = sys.argv[1] + renamed_files_file = sys.argv[2] + + # Check if files exist + if not os.path.exists(sarif_file): + print(f"SARIF file not found: {sarif_file}") + sys.exit(1) + + if not os.path.exists(renamed_files_file): + print(f"Renamed files mapping not found: {renamed_files_file}") + sys.exit(1) + + try: + process_sarif_file(sarif_file, renamed_files_file) + print("SARIF file processed successfully") + except Exception as e: + print(f"Error processing SARIF file: {e}") + import traceback + traceback.print_exc() + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..26bd868c --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,94 @@ +name: CodeQL Analysis + +on: + workflow_dispatch: + push: + branches: + - master + pull_request: + paths: + - "**/*.c" + - "**/*.cpp" + - "**/*.h" + - "**/*.ino" + - "**/*.py" + - ".github/workflows/*.yml" + - ".github/workflows/*.yaml" + +permissions: + actions: read + contents: read + pull-requests: read + security-events: write + +jobs: + codeql-analysis: + name: CodeQL ${{ matrix.language }} analysis + runs-on: ubuntu-latest + strategy: + matrix: + language: [python, actions, cpp] + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Process .ino files + if: matrix.language == 'cpp' + run: | + # Create a mapping file to track renamed files + echo "{}" > renamed_files.json + + # Find all .ino files and process them + find . -name "*.ino" -type f | while read -r file; do + echo "Processing $file" + + # Get the relative path from repository root + rel_path=$(realpath --relative-to=. "$file") + cpp_path="${rel_path%.ino}.cpp" + + # Create new .cpp file with Arduino.h include + echo "#include " > "$cpp_path" + + # Append the original content + cat "$file" >> "$cpp_path" + + # Update the mapping file + jq --arg ino "$rel_path" --arg cpp "$cpp_path" '. += {($cpp): $ino}' renamed_files.json > temp.json && mv temp.json renamed_files.json + + # Remove the original .ino file + rm "$file" + + echo "Converted $file to $cpp_path" + done + + echo "Renamed files mapping:" + cat renamed_files.json + + - name: Initialize CodeQL + uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + build-mode: none + languages: ${{ matrix.language }} + config-file: ./.github/codeql/codeql-config.yml + + - name: Run CodeQL Analysis + uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + category: "/language:${{ matrix.language }}" + output: sarif-results + upload: failure-only + + - name: Process SARIF file + if: matrix.language == 'cpp' + run: | + sarif_file="sarif-results/${{ matrix.language }}.sarif" + + # Run the Python script to process the SARIF file + python3 .github/scripts/process_sarif.py "$sarif_file" "renamed_files.json" + + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + sarif_file: sarif-results/${{ matrix.language }}.sarif + category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml new file mode 100644 index 00000000..36616946 --- /dev/null +++ b/.github/workflows/make-release.yml @@ -0,0 +1,25 @@ +name: Build all and make release on tag + +on: + workflow_dispatch: + push: + tags: + - '*' + +jobs: + make-release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Drafting release + uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0 + with: + draft: true + generateReleaseNotes: true diff --git a/.github/workflows/pr-or-master-push.yml b/.github/workflows/pr-or-master-push.yml new file mode 100644 index 00000000..5c1cf651 --- /dev/null +++ b/.github/workflows/pr-or-master-push.yml @@ -0,0 +1,166 @@ +# Run whenever a PR is generated or updated. + +# Most jobs check out the code, ensure Python3 is installed, and for build +# tests the ESP8266 toolchain is cached when possible to speed up execution. + +name: ESP8266Audio + +on: + push: + branches: + - master + pull_request: + +permissions: + contents: read + pull-requests: write + + +jobs: + + build-rp2040: + name: Build RP2040 + runs-on: ubuntu-latest + strategy: + matrix: + shift: [1-, 2-, 3-, 4-, 5-] + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install Arduino-CLI, RP2040 core, this library + run: | + wget --quiet https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_64bit.tar.gz + tar xf arduino-cli_nightly-latest_Linux_64bit.tar.gz + ./arduino-cli config init + ./arduino-cli config add board_manager.additional_urls https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json + ./arduino-cli config set library.enable_unsafe_install true + ./arduino-cli core update-index + ./arduino-cli core install rp2040:rp2040 + mkdir -p ~/Arduino/libraries + cp -a /home/runner/work/ESP8266Audio/ESP8266Audio ~/Arduino/libraries/. + - name: Build examples RP2040 + run: | + ./tests/build-ci.sh rp2040 ${{matrix.shift}} "rp2040:rp2040:rpipicow:flash=2097152_262144,freq=200,opt=Small,os=none,profile=Disabled,rtti=Disabled,stackprotect=Disabled,exceptions=Disabled,dbgport=Disabled,dbglvl=None,usbstack=picosdk,wificountry=worldwide,ipbtstack=ipv4only,uploadmethod=default" 1 + + build-esp8266: + name: Build all examples on Arduino-ESP8266 latest release + runs-on: ubuntu-latest + strategy: + matrix: + shift: [1-, 2-, 3-, 4-, 5-] + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Install Arduino-CLI, ESP8266 core, this library + run: | + wget --quiet https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_64bit.tar.gz + tar xf arduino-cli_nightly-latest_Linux_64bit.tar.gz + ./arduino-cli config init + mkdir -p ~/Arduino/libraries + cp -a /home/runner/work/ESP8266Audio/ESP8266Audio ~/Arduino/libraries/. + mkdir -p ~/Arduino/hardware/esp8266com + cd ~/Arduino/hardware/esp8266com + git clone https://github.com/esp8266/Arduino.git esp8266 + cd esp8266 + git submodule update --init --recursive + cd tools + ./get.py -q + - name: Build examples ESP8266 + run: | + ./tests/build-ci.sh esp8266 ${{matrix.shift}} "esp8266com:esp8266:d1_mini:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,optim=Smallest,wipe=none,baud=921600,iramfloat=no" 1 + + build-esp32: + name: Build all examples on Arduino-ESP32 latest release + runs-on: ubuntu-latest + strategy: + matrix: + shift: [1-, 2-, 3-, 4-, 5-] + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Install Arduino-CLI, ESP32 core, this library + run: | + wget --quiet https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Linux_64bit.tar.gz + tar xf arduino-cli_nightly-latest_Linux_64bit.tar.gz + ./arduino-cli config init + ./arduino-cli config add board_manager.additional_urls https://espressif.github.io/arduino-esp32/package_esp32_index.json + ./arduino-cli config set library.enable_unsafe_install true + ./arduino-cli core update-index + ./arduino-cli core install esp32:esp32 + mkdir -p ~/Arduino/libraries + cp -a /home/runner/work/ESP8266Audio/ESP8266Audio ~/Arduino/libraries/. + - name: Build examples ESP32C6 + run: | + # TODO - Don't use -Werror on ESP32, I2S deprecation warnings + ./tests/build-ci.sh esp32c6 ${{matrix.shift}} "esp32:esp32:esp32c6:PartitionScheme=huge_app" 0 + +# Run host test suite under valgrind for runtime checking of code. + host-tests: + name: Host tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Run host tests + env: + TRAVIS_BUILD_DIR: ${{ github.workspace }} + TRAVIS_TAG: ${{ github.ref }} + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install valgrind lcov gcc-multilib g++-multilib libc6-dbg:i386 + cd ./tests/host/ + make + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./mp3 + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./aac + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./wav + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./flac + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./mod + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./wav + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./midi + valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all --error-exitcode=999 ./opus + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: arduino/arduino-lint-action@4de5fc895deecbda2f6b1cc05de7a8fdd5c4c51f # v2 + with: + library-manager: 'update' + +# Style and spelling + code-spell: + name: Spelling, Style + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Run codespell + uses: codespell-project/actions-codespell@406322ec52dd7b488e48c1c4b82e2a8b3a1bf630 # v2.1 + with: + skip: ./src/libmad,./src/libhelix-aac,./src/libopus,./src/libflac,./lib/opus,./src/libtinysoundfont,./lib/TinySoundFont + ignore_words_list: ESP8266,esp8266,esp,dout,DOUT,ser,ans,inout,numer,hist + - name: Run astyle on all code/examples + run: | + sudo apt update + sudo apt install astyle + ./tests/restyle.sh + # If anything changed, GIT should return an error and fail the test + git diff --exit-code diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000..f5236fa5 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,26 @@ +name: Close stale issues and PRs + +on: + schedule: + - cron: '55 1 * * *' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + actions: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v10 + with: + operations-per-run: 500 + days-before-issue-stale: 60 + days-before-issue-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 60 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..77c98b7a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/opus"] + path = lib/opus + url = https://gitlab.xiph.org/xiph/opus.git +[submodule "lib/TinySoundFont"] + path = lib/TinySoundFont + url = https://github.com/earlephilhower/TinySoundFont.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7f9d7c90..00000000 --- a/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -sudo: false -language: bash -os: linux -dist: trusty - -matrix: - include: - - env: - - BUILD_TYPE=build -# - env: -# - BUILD_TYPE=build_esp32 - -install: - -script: - - $TRAVIS_BUILD_DIR/tests/common.sh - -deploy: - -notifications: - email: - on_success: change - on_failure: change - webhooks: - urls: - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/README.md b/README.md index e88db0e7..64111cd5 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,31 @@ -# ESP8266Audio - supports ESP8266 & ESP32 [![Gitter](https://badges.gitter.im/ESP8266Audio/community.svg)](https://gitter.im/ESP8266Audio/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/earlephilhower/ESP8266Audio.svg?branch=master)](https://travis-ci.org/earlephilhower/ESP8266Audio) +# ESP8266Audio - supports ESP8266 & ESP32 & Raspberry Pi Pico RP2040 and Pico 2 RP2350 [![Gitter](https://badges.gitter.im/ESP8266Audio/community.svg)](https://gitter.im/ESP8266Audio/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Arduino library for parsing and decoding MOD, WAV, MP3, FLAC, MIDI, AAC, and RTTL files and playing them on an I2S DAC or even using a software-simulated delta-sigma DAC with dynamic 32x-128x oversampling. -ESP8266 is fully supported and most mature, but ESP32 is also mostly there with built-in DAC as well as external ones. +For real-time, autonomous speech synthesis, check out [ESP8266SAM](https://github.com/earlephilhower/ESP8266SAM), a library which uses this one and a port of an ancient formant-based synthesis program to allow your ESP8266 to talk with low memory and no network required. -For real-time, autonomous speech synthesis, check out [ESP8266SAM](https://github.com/earlephilhower/ESP8266SAM), a library which uses this one and a port of an ancient format-based synthesis program to allow your ESP8266 to talk with low memory and no network required. +# ESP32, Raspberry Pi Pico (RP2040 and RP2350) Users +Consider using [BackgroundAudio](https://github.com/earlephilhower/BackgroundAudio) instead of this library as it can provide a simpler usage model and better results and performance on the Pico by using an interrupt-based, frame-aligned output model. ## Disclaimer -All this code is released under the GPL, and all of it is to be used at your own risk. If you find any bugs, please let me know via the GitHub issue tracker or drop me an email. The MOD and MP3 routines were taken from StellaPlayer and libMAD respectively. The software I2S delta-sigma 32x oversampling DAC was my own creation, and sounds quite good if I do say so myself. +All this code is released under the GPL, and all of it is to be used at your own risk. If you find any bugs, please let me know via the GitHub issue tracker or drop me an email. -The AAC decode code is from the Helix project and licensed under RealNetwork's RSPL license. For commercial use you're still going to need the usual AAC licensing from [Via Licensing](http://www.via-corp.com/us/en/licensing/aac/overview.html). - -On the ESP32, AAC-SBR is supported (many webradio stations use this to reduce bandwidth even further). The ESP8266, however, does not support it due to a lack of onboard RAM. - -MIDI decoding comes from a highly ported [MIDITONES](https://github.com/LenShustek/miditones) combined with a massively memory-optimized [TinySoundFont](https://github.com/schellingb/TinySoundFont), see the respective source files for more information. +* The MOD and MP3 routines were taken from StellarPlayer and libMAD respectively. +* The software I2S delta-sigma 32x oversampling DAC was my own creation, and sounds quite good if I do say so myself. +* The AAC decode code is from the Helix project and licensed under RealNetwork's RSPL license. For commercial use you're still going to need the usual AAC licensing from [Via Licensing](http://www.via-corp.com/us/en/licensing/aac/overview.html). On the ESP32, AAC-SBR is supported (many webradio stations use this to reduce bandwidth even further). The ESP8266, however, does not support it due to a lack of onboard RAM. +* MIDI decoding comes from a highly ported [MIDITONES](https://github.com/LenShustek/miditones) combined with a massively memory-optimized [TinySoundFont](https://github.com/schellingb/TinySoundFont), see the respective source files for more information. +* Opus is from [Xiph.org](https://xiph.org) with the Xiph license and patent described in src/{opusfile,libggg,libopus}/COPYING. ## Neat Things People Have Done With ESP8266Audio If you have a neat use for this library, [I'd love to hear about it](mailto:earlephilhower@yahoo.com)! -My personal use of the ESP8266Audio library is only to drive a 3D-printed, network-time-setting alarm clock for my kids which can play an MP3 instead of a bell to wake them up, called [Psychoclock](https://github.com/earlephilhower/psychoclock). - -Erich Heinemann has developed a Stomper (instrument for playing samples in real-time during a live stage performance) that you can find more info about [here](https://github.com/ErichHeinemann/hman-stomper). - -Dagnall53 has integrated this into a really neat MQTT based model train controller to add sounds to his set. More info is available [here](https://github.com/dagnall53/ESPMQTTRocnetSound), including STL files for 3D printed components! - -JohannesMTC has built a similar project especially for model trains: https://github.com/JohannesMTC/ESP32_MAS - -A neat MQTT-driven ESP8266 light-and-sound device (alarm? toy? who can say!) was built by @CosmicMac, available at https://github.com/CosmicMac/ESParkle - -A very interesting "linear clock" with a stepper motor, NTP time keeping, and configurable recorded chimes with schematics, 3D printer plans, and source code, is now available http://home.kpn.nl/bderogee1980/projects/linear_clock/linear_clock.html +* My personal use of the ESP8266Audio library is only to drive a 3D-printed, network-time-setting alarm clock for my kids which can play an MP3 instead of a bell to wake them up, called [Psychoclock](https://github.com/earlephilhower/psychoclock). +* Harald Sattler has built a neat German [word clock with MP3 alarm](http://www.harald-sattler.de/html/mini-wecker.htm). Detailed discussion on the process and models are included. +* Erich Heinemann has developed a Stomper (instrument for playing samples in real-time during a live stage performance) that you can find more info about [here](https://github.com/ErichHeinemann/hman-stomper). +* Dagnall53 has integrated this into a really neat MQTT based model train controller to add sounds to his set. More info is available [here](https://github.com/dagnall53/ESPMQTTRocnetSound), including STL files for 3D printed components! +* JohannesMTC has built a similar project especially for model trains: https://github.com/JohannesMTC/ESP32_MAS +* A neat MQTT-driven ESP8266 light-and-sound device (alarm? toy? who can say!) was built by @CosmicMac, available at https://github.com/CosmicMac/ESParkle +* A very interesting "linear clock" with a stepper motor, NTP time keeping, and configurable recorded chimes with schematics, 3D printer plans, and source code, is now available https://janderogee.com/projects/linear_clock/linear_clock.htm +* Source and instructions for a gorgeous wooden MP3-playing clock, FM radio and a walkie-talkie using the ESP8266 and AVR microcontrollers is available https://github.com/zduka/mp3-player ## Prerequisites First, make sure you are running the 2.6.3/later or GIT head version of the Arduino libraries for ESP8266, or the latest ESP32 SDK from Espressif. @@ -53,6 +51,23 @@ Create an AudioInputXXX source pointing to your input file, an AudioOutputXXX si After creation, you need to call the AudioGeneratorXXX::loop() routine from inside your own main loop() one or more times. This will automatically read as much of the file as needed and fill up the I2S buffers and immediately return. Since this is not interrupt driven, if you have large delay()s in your code, you may end up with hiccups in playback. Either break large delays into very small ones with calls to AudioGenerator::loop(), or reduce the sampling rate to require fewer samples per second. +## ESP32 and Platform.IO + +It seems that Espressif discontinued official Platform.IO integration of their Arduino several +releases ago. The `platformio/framework-arduinoespressif32` package available is much older +than the latest Espressif Arduino core and at IDF 4.x. This library needs IDF 5.x and the new +I2S APIs to function, so if you attempt to build using ``platformio/framework-arduinoespressif32`` +you will get errors like, `cannot open source file "driver/i2s_std.h"`. + +The solution is to move to @Jason2866's community +[pioarduino](https://github.com/pioarduino/platform-espressif32) core which is built from the +current Espressif Arduino with IDF 5.x. Simply change `platform` in your `platform.ini` as below: + +```ini +; Pioarduino Arduino-ESP32 Latest +platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip +``` + ## Example See the examples directory for some simple examples, but the following snippet can play an MP3 file over the simulated I2S DAC: ```cpp @@ -96,7 +111,7 @@ AudioFileSourcePROGMEM: Reads a file from a PROGMEM array. Under UNIX you can AudioFileSourceHTTPStream: Simple implementation of a streaming HTTP reader for ShoutCast-type MP3 streaming. Not yet resilient, and at 44.1khz 128bit stutters due to CPU limitations, but it works more or less. ## AudioFileSourceBuffer - Double buffering, useful for HTTP streams -AudioFileSourceBuffer is an input source that simpy adds an additional RAM buffer of the output of any other AudioFileSource. This is particularly useful for web streaming where you need to have 1-2 packets in memory to ensure hiccup-free playback. +AudioFileSourceBuffer is an input source that simply adds an additional RAM buffer of the output of any other AudioFileSource. This is particularly useful for web streaming where you need to have 1-2 packets in memory to ensure hiccup-free playback. Create your standard input file source, create the buffer with the original source as its input, and pass this buffer object to the generator. ```cpp @@ -141,7 +156,7 @@ AudioGeneratorRTTTL: Enjoy the pleasures of monophonic, 4-octave ringtones on y ## AudioOutput classes AudioOutput: Base class for all output drivers. Takes a sample at a time and returns true/false if there is buffer space for it. If it returns false, it is the calling object's (AudioGenerator's) job to keep the data that didn't fit and try again later. -AudioOutputI2S: Interface for any I2S 16-bit DAC. Sends stereo or mono signals out at whatever frequency set. Tested with Adafruit's I2SDAC and a Beyond9032 DAC from eBay. Tested up to 44.1KHz. To use the internal DAC on ESP32, instantiate this class as `AudioOutputI2S(0,1)`, see example `PlayMODFromPROGMEMToDAC` and code in [AudioOutputI2S.cpp](src/AudioOutputI2S.cpp#L29) for details. +AudioOutputI2S: Interface for any I2S 16-bit DAC. Sends stereo or mono signals out at whatever frequency set. Tested with Adafruit's I2SDAC and a Beyond9032 DAC from eBay. Tested up to 44.1KHz. To use the internal DAC on ESP32, instantiate this class as `AudioOutputI2S(0,AudioOutputI2S::INTERNAL_DAC)`, see example `PlayMODFromPROGMEMToDAC` and code in [AudioOutputI2S.cpp](src/AudioOutputI2S.cpp#L29) for details. To use the hardware Pulse Density Modulation (PDM) on ESP32, instantiate this class as `AudioOutputI2S(0,AudioOutputI2S::INTERNAL_PDM)`. For both later cases, default output pins are GPIO25 and GPIO26. AudioOutputI2SNoDAC: Abuses the I2S interface to play music without a DAC. Turns it into a 32x (or higher) oversampling delta-sigma DAC. Use the schematic below to drive a speaker or headphone from the I2STx pin (i.e. Rx). Note that with this interface, depending on the transistor used, you may need to disconnect the Rx pin from the driver to perform serial uploads. Mono-only output, of course. @@ -154,7 +169,15 @@ AudioOutputSPIFFSWAV: Writes a binary WAV format with headers to a SPIFFS files AudioOutputNull: Just dumps samples to /dev/null. Used for speed testing as it doesn't artificially limit the AudioGenerator output speed since there are no buffers to fill/drain. ## I2S DACs -I've used both the Adafruit [I2S +3W amp DAC](https://www.adafruit.com/product/3006) and a generic PCM5102 based DAC with success. The biggest problems I've seen from users involve pinouts from the ESP8266 for GPIO and hooking up all necessary pins on the DAC board. +I've used both the Adafruit [I2S +3W amp DAC](https://www.adafruit.com/product/3006) and a generic PCM5102 based DAC with success. The biggest problems I've seen from users involve pinouts from the ESP8266 for GPIO and hooking up all necessary pins on the DAC board. The essential pins are: + +I2S pin | Common label* | ESP8266 pin +--------|---------------|------------- +LRC | D4 | GPIO2 +BCLK | D8 | GPIO15 +DIN | RX | GPIO3 + +\* The "common label" column applies to common NodeMCU and D1 Mini development boards. Unfortunately some manufacturers use different mappings so the labels listed here might not apply to your particular model. ### Adafruit I2S DAC This is quite simple and only needs the GND, VIN, LRC, BCLK< and DIN pins to be wired. Be sure to use +5V on the VIN to get the loudest sound. See the [Adafruit example page](https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp) for more info. @@ -167,7 +190,7 @@ I've used several versions of PCM5102 DAC boards purchased from eBay. They've a ### Others -There are many other variants out there, and they should all work reasonably well with this code and the ESP8266. Please be certain you've read the datasheet and are applying proper input voltages, and be sure to tie off any unused inputs to GND or VCC as appropriate. LEaving an input pin floating on any integrated circuit can cause unstable operation as it may pick up noise from the environment (very low input capacitance) and cause havoc with internal IC settings. +There are many other variants out there, and they should all work reasonably well with this code and the ESP8266. Please be certain you've read the datasheet and are applying proper input voltages, and be sure to tie off any unused inputs to GND or VCC as appropriate. Leaving an input pin floating on any integrated circuit can cause unstable operation as it may pick up noise from the environment (very low input capacitance) and cause havoc with internal IC settings. ## Software I2S Delta-Sigma DAC (i.e. playing music with a single transistor and speaker) For the best fidelity, and stereo to boot, spend the money on a real I2S DAC. Adafruit makes a great mono one with amplifier, and you can find stereo unamplified ones on eBay or elsewhere quite cheaply. However, thanks to the software delta-sigma DAC with 32x oversampling (up to 128x if the audio rate is low enough) you can still have pretty good sound! @@ -185,7 +208,8 @@ Use the `AudioOutputI2S*No*DAC` object instead of the `AudioOutputI2S` in your c ESP8266-GND ------------------+ | +------+ K| | | | E| ESP8266-I2SOUT (Rx) -----/\/\/\--+ | \ R| - | +-| +or ESP32 DOUT pin | +-| + | USB 5V -----------------------------+ You may also want to add a 220uF cap from USB5V to GND just to help filter out any voltage droop during high volume playback. @@ -198,11 +222,18 @@ ESP8266-RX(I2S tx) -- Resistor (~1K ohm, not critical) -- 2N3904 Base ESP8266-GND -- 2N3904 Emitter USB-5V -- Speaker + Terminal 2N3904-Collector -- Speaker - Terminal + +*For ESP32, default output pin is GPIO22. Note that GPIO25 ang GPIO26 are occupied by wclk/bclk and can not be used. ``` *NOTE*: A prior version of this schematic had a direct connection from the ESP8266 to the base of the transistor. While this does provide the maximum amplitude, it also can draw more current from the 8266 than is safe, and can also cause the transistor to overheat. -As of the latest ESP8266Audio release, with the software delta-sigma DAC the LRCLK and BCLK pins *can* be used by an application. Simply use normal `pinMode` and `dicitalWrite` or `digitalRead` as desired. +As of the latest ESP8266Audio release, with the software delta-sigma DAC the LRCLK and BCLK pins *can* be used by an application. Simply use normal `pinMode` and `digitalWrite` or `digitalRead` as desired. + +### Hardware PDM on ESP32 + +Hardware PDM outputs 128 * 48Khz pulses regardless of sample rate. +It seems that currently hardware PDM either does not output constant One at maximum sample level, or does not output 3.3V voltage at pulse sound is not as loud as desired. You may consider using software delta-sigma DAC instead. ### High pitched buzzing with the 1-T circuit The 1-T amp can _NOT_ drive any sort of amplified speaker. If there is a power or USB input to the speaker, or it has lights or Bluetooth or a battery, it can _NOT_ be used with this circuit. @@ -223,6 +254,13 @@ If you've built the amp but are not getting any sound, @msmcmickey wrote up a ve 2. If connected properly, do you have ~5 volts between the collector and emitter? 3. Was the transistor possibly damaged/overheated during soldering, or by connecting it improperly? Out-of-circuit diode check voltage drop test using a multimeter from base->emitter and base->collector should be between .5 and .7 volts. If it's shorted or open or conducting in both directions, then replace it and make sure it's connected properly. +### User-Submitted Improvements for 1-Bit Output Modes (Sigma-Delta I2S, PDM) + +To improve the quality of the output, a 20kHZ low pass filter (LPF) was suggested by @kimstik +![LPF Schematic](images/lpf.png) + +@MarianoSys provided a small amplification circuit that minimizes power draw when idle and provides some visual feedback, described in his [PDF](images/PWM%20audio%20amplifier%20with%20only%201%20transistor,%20power=0%20when%20RX%20signal%20is%20idle%20(high).pdf) + ## SPDIF optical output The proper way would be using optical TOSLINK transmitter (i.e. TOTXxxx). For testing, you can try with ~660nm red LED and resistor. Same as your basic Blink project with external LED, just that the LED will blink a bit faster. ``` @@ -235,7 +273,7 @@ ESP Pin -------|____|--------+ | Ground ---------------------+ ``` -For ESP8266 with red LED (~1.9Vf drop) you need minimum 150Ohm resistor (12mA max per pin), and output pin is fixed (GPIO3/RX0).On ESP32 it is confgurable with `AudioOutputSPDIF(gpio_num)`. +For ESP8266 with red LED (~1.9Vf drop) you need minimum 150Ohm resistor (12mA max per pin), and output pin is fixed (GPIO3/RX0).On ESP32 it is configurable with `AudioOutputSPDIF(gpio_num)`. ## Using external SPI RAM to increase buffer A class allows you to use a 23lc1024 SPI RAM from Microchip as input buffer. This chip connects to ESP8266 HSPI port and provides a large buffer to help avoid hiccus in playback of web streams. @@ -251,10 +289,11 @@ I've been told the Wemos SD card shield uses GPIO15 as the SD chip select. This There's no ESP8266-specific code in the AudioGenerator routines, so porting to other controllers should be relatively easy assuming they have the same endianness as the Xtensa core used. Drop me a line if you're doing this, I may be able to help point you in the right direction. ## Thanks -Thanks to the authors of StellaPlayer and libMAD for releasing their code freely, and to the maintainers and contributors to the ESP8266 Arduino port. +Thanks to the authors of StellarPlayer and libMAD for releasing their code freely, and to the maintainers and contributors to the ESP8266 Arduino port. Also, big thanks to @tueddy for getting the initial ESP32 porting into the tree! -Earle F. Philhower, III + earlephilhower@yahoo.com diff --git a/examples/MixerSample/MixerSample.ino b/examples/MixerSample/MixerSample.ino index 7a9a1e20..4265520b 100644 --- a/examples/MixerSample/MixerSample.ino +++ b/examples/MixerSample/MixerSample.ino @@ -1,8 +1,8 @@ #include -#ifdef ESP32 - #include +#ifdef ESP8266 +#include #else - #include +#include #endif #include "AudioFileSourcePROGMEM.h" @@ -19,15 +19,14 @@ AudioOutputI2S *out; AudioOutputMixer *mixer; AudioOutputMixerStub *stub[2]; -void setup() -{ - WiFi.mode(WIFI_OFF); +void setup() { + WiFi.mode(WIFI_OFF); Serial.begin(115200); delay(1000); Serial.printf("WAV start\n"); audioLogger = &Serial; - file[0] = new AudioFileSourcePROGMEM( viola, sizeof(viola) ); + file[0] = new AudioFileSourcePROGMEM(viola, sizeof(viola)); out = new AudioOutputI2S(); mixer = new AudioOutputMixer(32, out); stub[0] = mixer->NewInput(); @@ -38,31 +37,38 @@ void setup() Serial.printf("starting 1\n"); } -void loop() -{ +void loop() { static uint32_t start = 0; static bool go = false; - - if (!start) start = millis(); + + if (!start) { + start = millis(); + } if (wav[0]->isRunning()) { - if (!wav[0]->loop()) { wav[0]->stop(); stub[0]->stop(); Serial.printf("stopping 1\n"); } + if (!wav[0]->loop()) { + wav[0]->stop(); + stub[0]->stop(); + Serial.printf("stopping 1\n"); + } } - if (millis()-start > 3000) { + if (millis() - start > 3000) { if (!go) { Serial.printf("starting 2\n"); stub[1] = mixer->NewInput(); stub[1]->SetGain(0.4); wav[1] = new AudioGeneratorWAV(); - file[1] = new AudioFileSourcePROGMEM( viola, sizeof(viola) ); + file[1] = new AudioFileSourcePROGMEM(viola, sizeof(viola)); wav[1]->begin(file[1], stub[1]); go = true; } if (wav[1]->isRunning()) { - if (!wav[1]->loop()) { wav[1]->stop(); stub[1]->stop(); Serial.printf("stopping 2\n");} + if (!wav[1]->loop()) { + wav[1]->stop(); + stub[1]->stop(); + Serial.printf("stopping 2\n"); + } } } - } - diff --git a/examples/PlayAACFromPROGMEM/PlayAACFromPROGMEM.ino b/examples/PlayAACFromPROGMEM/PlayAACFromPROGMEM.ino index af7f9087..a4a03690 100644 --- a/examples/PlayAACFromPROGMEM/PlayAACFromPROGMEM.ino +++ b/examples/PlayAACFromPROGMEM/PlayAACFromPROGMEM.ino @@ -8,8 +8,7 @@ AudioFileSourcePROGMEM *in; AudioGeneratorAAC *aac; AudioOutputI2S *out; -void setup() -{ +void setup() { Serial.begin(115200); audioLogger = &Serial; @@ -20,9 +19,7 @@ void setup() aac->begin(in, out); } - -void loop() -{ +void loop() { if (aac->isRunning()) { aac->loop(); } else { @@ -30,4 +27,3 @@ void loop() delay(1000); } } - diff --git a/examples/PlayAACFromPROGMEM/homer.aac b/examples/PlayAACFromPROGMEM/homer.aac new file mode 100644 index 00000000..0502be6c Binary files /dev/null and b/examples/PlayAACFromPROGMEM/homer.aac differ diff --git a/examples/PlayFLAC-SD-SPDIF/PlayFLAC-SD-SPDIF.ino b/examples/PlayFLAC-SD-SPDIF/PlayFLAC-SD-SPDIF.ino index 3c127883..8c0629da 100644 --- a/examples/PlayFLAC-SD-SPDIF/PlayFLAC-SD-SPDIF.ino +++ b/examples/PlayFLAC-SD-SPDIF/PlayFLAC-SD-SPDIF.ino @@ -1,21 +1,25 @@ #include +#ifdef ARDUINO_ARCH_RP2040 +void setup() {} +void loop() {} +#else #include "AudioFileSourceSD.h" #include "AudioOutputSPDIF.h" #include "AudioGeneratorFLAC.h" // For this sketch, you need connected SD card with '.flac' music files in the root -// directory. Some samples with various sampling rates are available from i.e. +// directory. Some samples with various sampling rates are available from i.e. // Espressif Audio Development Framework at: // https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html // -// On ESP8266 you might need to reencode FLAC files with max '-2' compression level -// (i.e. 1152 maximum block size) or you will run out of memory. FLAC files will be +// On ESP8266 you might need to re-encode FLAC files with max '-2' compression level +// (i.e. 1152 maximum block size) or you will run out of memory. FLAC files will be // slightly bigger but you don't loose audio quality with reencoding (lossles codec). // You may need a fast SD card. Set this as high as it will work (40MHz max). #define SPI_SPEED SD_SCK_MHZ(40) -// On ESP32 you can adjust the SPDIF_OUT_PIN (GPIO number). +// On ESP32 you can adjust the SPDIF_OUT_PIN (GPIO number). // On ESP8266 it is fixed to GPIO3/RX0 and this setting has no effect #define SPDIF_OUT_PIN 27 @@ -29,40 +33,44 @@ void setup() { Serial.println(); delay(1000); - audioLogger = &Serial; + audioLogger = &Serial; source = new AudioFileSourceSD(); output = new AudioOutputSPDIF(SPDIF_OUT_PIN); decoder = new AudioGeneratorFLAC(); - // NOTE: SD.begin(...) should be called AFTER AudioOutputSPDIF() + // NOTE: SD.begin(...) should be called AFTER AudioOutputSPDIF() // to takover the the SPI pins if they share some with I2S // (i.e. D8 on Wemos D1 mini is both I2S BCK and SPI SS) - #if defined(ESP8266) - SD.begin(SS, SPI_SPEED); - #else - SD.begin(); - #endif - dir = SD.open("/"); +#if defined(ESP8266) + SD.begin(SS, SPI_SPEED); +#else + SD.begin(); +#endif + dir = SD.open("/"); } void loop() { if ((decoder) && (decoder->isRunning())) { - if (!decoder->loop()) decoder->stop(); + if (!decoder->loop()) { + decoder->stop(); + } } else { File file = dir.openNextFile(); - if (file) { + if (file) { if (String(file.name()).endsWith(".flac")) { source->close(); - if (source->open(file.name())) { + if (source->open(file.name())) { Serial.printf_P(PSTR("Playing '%s' from SD card...\n"), file.name()); decoder->begin(source, output); } else { Serial.printf_P(PSTR("Error opening '%s'\n"), file.name()); } - } + } } else { - Serial.println(F("Playback form SD card done\n")); + Serial.println(F("Playback from SD card done\n")); delay(1000); - } + } } } +#endif + diff --git a/examples/PlayFLACFromPROGMEMToDAC/PlayFLACFromPROGMEMToDAC.ino b/examples/PlayFLACFromPROGMEMToDAC/PlayFLACFromPROGMEMToDAC.ino index 847b4d97..177efbe1 100644 --- a/examples/PlayFLACFromPROGMEMToDAC/PlayFLACFromPROGMEMToDAC.ino +++ b/examples/PlayFLACFromPROGMEMToDAC/PlayFLACFromPROGMEMToDAC.ino @@ -9,25 +9,24 @@ AudioOutputI2S *out; AudioFileSourcePROGMEM *file; AudioGeneratorFLAC *flac; -void setup() -{ +void setup() { Serial.begin(115200); Serial.println("Starting up...\n"); audioLogger = &Serial; - file = new AudioFileSourcePROGMEM( sample_flac, sizeof(sample_flac) ); + file = new AudioFileSourcePROGMEM(sample_flac, sizeof(sample_flac)); out = new AudioOutputI2S(); flac = new AudioGeneratorFLAC(); flac->begin(file, out); } -void loop() -{ +void loop() { if (flac->isRunning()) { - if (!flac->loop()) flac->stop(); + if (!flac->loop()) { + flac->stop(); + } } else { Serial.printf("FLAC done\n"); delay(1000); } } - diff --git a/examples/PlayMIDIFromLittleFS/PlayMIDIFromLittleFS.ino b/examples/PlayMIDIFromLittleFS/PlayMIDIFromLittleFS.ino deleted file mode 100644 index b4f02e3c..00000000 --- a/examples/PlayMIDIFromLittleFS/PlayMIDIFromLittleFS.ino +++ /dev/null @@ -1,54 +0,0 @@ -#include -#ifdef ESP32 - void setup() { - Serial.begin(115200); - Serial.printf("ERROR - ESP32 does not support LittleFS\n"); - } - void loop() {} -#else -#include -#include -#include -#include - -AudioFileSourceLittleFS *sf2; -AudioFileSourceLittleFS *mid; -AudioOutputI2S *dac; -AudioGeneratorMIDI *midi; - -void setup() -{ - const char *soundfont = "/1mgm.sf2"; - const char *midifile = "/furelise.mid"; - - WiFi.mode(WIFI_OFF); - - Serial.begin(115200); - Serial.println("Starting up...\n"); - - audioLogger = &Serial; - sf2 = new AudioFileSourceLittleFS(soundfont); - mid = new AudioFileSourceLittleFS(midifile); - - dac = new AudioOutputI2S(); - midi = new AudioGeneratorMIDI(); - midi->SetSoundfont(sf2); - midi->SetSampleRate(22050); - Serial.printf("BEGIN...\n"); - midi->begin(mid, dac); -} - -void loop() -{ - if (midi->isRunning()) { - if (!midi->loop()) { - uint32_t e = millis(); - midi->stop(); - } - } else { - Serial.printf("MIDI done\n"); - delay(1000); - } -} - -#endif diff --git a/examples/PlayMIDIFromROM/PlayMIDIFromROM.ino b/examples/PlayMIDIFromROM/PlayMIDIFromROM.ino new file mode 100644 index 00000000..0bdbe626 --- /dev/null +++ b/examples/PlayMIDIFromROM/PlayMIDIFromROM.ino @@ -0,0 +1,73 @@ +// PlayMIDIFromROM +// Released to the public domain (2025) by Earle F. Philhower, III +#include +#ifdef ESP8266 +#include +#else +#include +#endif +#include + +// Define the SF2 (SoundFont) to use. Will be stored in PROGMEM as global _tsf +#ifdef ESP8266 +// The ESP8266 has a 1MB ROM limit so use a smaller SF2 file +#include +#else +// Pico and ESP32 can have up to 16MB ROMs, use the 1M General MIDI (1mgm) font or your own +// For ESP32 be sure to use HUGE APP or another partition mode which allows you to have sketches larger than 1-2MB + +#include +#endif + +// Select one of the following in order of CPU limitations. You can also use your own. +//#include "furelise_mid.h" +//#include "venture_mid.h" +#include "jm_mozdi_mid.h" + +// Note that the .MID file does NOT need to be in PROGMEM, it just makes the examples easier to use (no FS upload required). +AudioFileSourcePROGMEM *midfile; + +// Any AudioOutput* would work here (AudioOutputPWM, AudioOutputI2SNoDAT, etc.) +AudioOutputI2S *dac; + +// The MIDI wavetable synthesizer +AudioGeneratorMIDI *midi; + + +void setup() { + WiFi.mode(WIFI_OFF); + + Serial.begin(115200); + Serial.println("Starting up...\n"); + + audioLogger = &Serial; + midfile = new AudioFileSourcePROGMEM(_mid, sizeof(_mid)); + + dac = new AudioOutputI2S(); + dac->SetPinout(0, 1, 2); // Adjust to your I2S DAC pinout + dac->SetGain(0.5); + midi = new AudioGeneratorMIDI(); + midi->SetSoundFont(&_tsf); + // If you get audio clicks/break up then you can decrease the sample rate. You can also try increasing this if your MIDs are simple enough and the chip fast enough + midi->SetSampleRate(22050); + + Serial.printf("BEGIN...\n"); + midi->begin(midfile, dac); +} + +void loop() { + static int cnt, lcnt; + if (midi->isRunning()) { + if (!midi->loop()) { + midi->stop(); + } else { + if (++cnt == 10000) { + Serial.printf("Loop %d\n", ++lcnt * 1000); + cnt = 0; + } + } + } else { + Serial.printf("MIDI done\n"); + delay(1000); + } +} diff --git a/examples/PlayMIDIFromROM/furelise_mid.h b/examples/PlayMIDIFromROM/furelise_mid.h new file mode 100644 index 00000000..6e81d137 --- /dev/null +++ b/examples/PlayMIDIFromROM/furelise_mid.h @@ -0,0 +1,925 @@ +const unsigned char _mid[] PROGMEM = { + 0x4d, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x04, + 0x03, 0xc0, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x00, 0x33, 0x00, 0xff, + 0x7f, 0x08, 0x05, 0x0f, 0x12, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, + 0x7f, 0x0d, 0x05, 0x0f, 0x1c, 0x32, 0x30, 0x30, 0x35, 0x2e, 0x31, 0x32, + 0x2e, 0x30, 0x32, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x20, 0x30, 0x00, 0xff, 0x51, 0x03, 0x0d, 0x14, 0x37, 0x00, 0xff, 0x2f, + 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x2a, 0x40, 0x00, 0xc0, 0x00, + 0x00, 0xff, 0x7f, 0x05, 0x05, 0x0f, 0x09, 0x40, 0x48, 0x00, 0xff, 0x02, + 0x14, 0x32, 0x30, 0x30, 0x36, 0x20, 0x62, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x65, 0x6c, 0x69, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0xff, 0x04, + 0x05, 0x50, 0x69, 0x61, 0x6e, 0x6f, 0x00, 0xff, 0x03, 0x09, 0x46, 0xfc, + 0x72, 0x20, 0x45, 0x6c, 0x69, 0x73, 0x65, 0x00, 0xff, 0x7f, 0x0f, 0x05, + 0x0f, 0x06, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x4d, 0x49, + 0x44, 0x49, 0x00, 0xff, 0x58, 0x04, 0x03, 0x03, 0x0c, 0x08, 0x00, 0xff, + 0x20, 0x01, 0x00, 0x87, 0x40, 0x90, 0x4c, 0x47, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x26, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x39, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x53, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x59, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x02, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x40, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, + 0x39, 0x46, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, + 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x47, 0x53, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x02, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, + 0x90, 0x34, 0x40, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x38, 0x46, + 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, + 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x44, 0x4c, 0x81, 0x70, + 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x48, 0x53, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x40, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, + 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x53, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x02, 0x00, 0x90, 0x2d, 0x39, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x40, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x90, 0x39, 0x46, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, + 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, + 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x53, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x02, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, + 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x80, 0x38, + 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, + 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x2d, 0x40, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x90, 0x39, 0x46, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, + 0x80, 0x39, 0x00, 0x81, 0x70, 0x90, 0x4c, 0x40, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x46, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x40, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x4c, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, + 0x80, 0x45, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, + 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x53, 0x00, 0x90, + 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x47, + 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x44, 0x4c, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, + 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, + 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, + 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x46, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, + 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, + 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, + 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4c, + 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x53, + 0x00, 0x90, 0x2d, 0x4c, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, + 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x80, 0x34, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x11, 0x00, 0x90, + 0x30, 0x46, 0x81, 0x70, 0x80, 0x30, 0x00, 0x00, 0x90, 0x37, 0x4c, 0x81, + 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x3c, + 0x00, 0x00, 0x90, 0x43, 0x4c, 0x81, 0x70, 0x80, 0x43, 0x00, 0x00, 0x90, + 0x4d, 0x4c, 0x81, 0x70, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, + 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x01, 0x00, 0x90, 0x2b, 0x40, 0x81, 0x70, 0x80, 0x2b, + 0x00, 0x00, 0x90, 0x37, 0x4c, 0x81, 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, + 0x3b, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, + 0x90, 0x41, 0x4c, 0x81, 0x70, 0x80, 0x41, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, + 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, + 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, + 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, + 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4c, 0x46, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x58, 0x40, + 0x81, 0x70, 0x80, 0x58, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x46, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, + 0x48, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, + 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, + 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, + 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, + 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, + 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, + 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, + 0x00, 0x90, 0x44, 0x4c, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, + 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, + 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x39, 0x4c, + 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x47, 0x46, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, + 0x48, 0x00, 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, + 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, + 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, + 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, + 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, + 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, + 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, + 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, + 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, + 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, + 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, + 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x11, 0x00, 0x90, 0x30, 0x40, + 0x81, 0x70, 0x80, 0x30, 0x00, 0x00, 0x90, 0x37, 0x46, 0x81, 0x70, 0x80, + 0x37, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x08, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, + 0x90, 0x43, 0x4c, 0x81, 0x70, 0x80, 0x43, 0x00, 0x00, 0x90, 0x4d, 0x4c, + 0x81, 0x70, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x01, 0x00, 0x90, 0x2b, 0x40, 0x81, 0x70, 0x80, 0x2b, 0x00, 0x00, + 0x90, 0x37, 0x46, 0x81, 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, 0x3b, 0x4c, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, 0x90, 0x41, + 0x4c, 0x81, 0x70, 0x80, 0x41, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, + 0x00, 0x90, 0x48, 0x53, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4a, 0x4c, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, + 0x48, 0x00, 0x00, 0x90, 0x47, 0x53, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, + 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x40, + 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, + 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4c, + 0x46, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x58, 0x40, 0x81, 0x70, + 0x80, 0x58, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, + 0x00, 0x90, 0x4c, 0x46, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, + 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, + 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, + 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, + 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, + 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x3c, 0x46, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, + 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, + 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x38, + 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, + 0x44, 0x4c, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, 0x2d, 0x4c, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, + 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, + 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, + 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, + 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, + 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, + 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x46, 0x81, 0x70, 0x80, 0x48, 0x00, + 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, + 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, + 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x40, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x46, 0x81, 0x70, 0x80, 0x38, + 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, + 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x59, 0x00, 0x90, 0x2d, 0x46, + 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x53, 0x81, 0x70, + 0x80, 0x39, 0x00, 0x00, 0x90, 0x3a, 0x33, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x00, 0x90, 0x3c, 0x33, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x40, 0x33, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x48, 0x33, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x48, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, + 0x80, 0x3c, 0x00, 0x78, 0x90, 0x3c, 0x40, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x00, 0x90, 0x39, 0x40, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x41, 0x40, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x48, 0x40, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x48, 0x00, 0x00, 0x80, 0x41, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, + 0x80, 0x3c, 0x00, 0x78, 0x90, 0x3a, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x00, 0x90, 0x3c, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x37, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x40, 0x46, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x48, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, + 0x43, 0x46, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x43, + 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x37, + 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x78, 0x90, 0x48, + 0x5f, 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x00, + 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, + 0x08, 0x00, 0x90, 0x4d, 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x78, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x78, 0x80, + 0x4c, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x00, 0x90, + 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, 0x00, 0x90, 0x3a, 0x4c, 0x81, + 0x70, 0x80, 0x3a, 0x00, 0x00, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, + 0x00, 0x90, 0x3e, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, + 0x81, 0x70, 0x80, 0x3e, 0x00, 0x00, 0x90, 0x3a, 0x4c, 0x81, 0x70, 0x80, + 0x3a, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x3e, 0x4c, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x00, 0x90, 0x52, 0x4c, 0x81, 0x70, + 0x80, 0x3e, 0x00, 0x00, 0x90, 0x3a, 0x4c, 0x78, 0x80, 0x52, 0x00, 0x00, + 0x90, 0x51, 0x4c, 0x78, 0x80, 0x51, 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, + 0x90, 0x51, 0x4c, 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, + 0x00, 0x80, 0x51, 0x00, 0x00, 0x90, 0x4f, 0x4c, 0x00, 0x90, 0x40, 0x4c, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, + 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4d, 0x4c, 0x00, 0x90, 0x3a, + 0x40, 0x00, 0x90, 0x37, 0x46, 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, + 0x35, 0x00, 0x00, 0x80, 0x37, 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x80, + 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x00, 0x90, 0x3a, 0x40, 0x00, + 0x90, 0x37, 0x46, 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, + 0x00, 0x80, 0x37, 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x80, 0x4a, 0x00, + 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x46, 0x4c, 0x00, 0x90, 0x35, 0x4e, 0x81, 0x70, 0x80, + 0x35, 0x00, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, + 0x80, 0x46, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0x90, 0x3c, 0x4e, 0x00, + 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x39, 0x4e, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x45, + 0x00, 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x3c, 0x4e, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x78, 0x80, 0x45, 0x00, 0x00, 0x90, 0x43, + 0x4c, 0x78, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x90, 0x45, + 0x53, 0x00, 0x90, 0x39, 0x4e, 0x78, 0x80, 0x45, 0x00, 0x00, 0x90, 0x46, + 0x59, 0x78, 0x80, 0x39, 0x00, 0x00, 0x80, 0x46, 0x00, 0x00, 0x90, 0x48, + 0x5f, 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x00, + 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x3c, 0x00, + 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, + 0x3c, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4b, 0x5a, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x4b, 0x00, 0x00, + 0x90, 0x4c, 0x4e, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, + 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, + 0x3c, 0x00, 0x00, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4d, 0x5a, 0x00, 0x90, 0x3e, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, + 0x0f, 0x0f, 0x08, 0x00, 0x90, 0x32, 0x4c, 0x81, 0x70, 0x80, 0x32, 0x00, + 0x00, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x45, 0x5a, + 0x00, 0x90, 0x35, 0x4c, 0x81, 0x70, 0x80, 0x35, 0x00, 0x00, 0x80, 0x45, + 0x00, 0x00, 0x90, 0x48, 0x5a, 0x00, 0x90, 0x37, 0x4c, 0x81, 0x70, 0x80, + 0x37, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x37, 0x4c, 0x81, + 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x00, 0x90, 0x37, 0x4c, 0x81, 0x70, 0x80, + 0x37, 0x00, 0x00, 0x90, 0x41, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x08, 0x78, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x47, 0x5a, 0x78, 0x80, + 0x41, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x5a, 0x00, 0x90, + 0x3c, 0x4c, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x08, 0x78, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, + 0x4f, 0x00, 0x00, 0x90, 0x43, 0x5a, 0x78, 0x80, 0x43, 0x00, 0x00, 0x90, + 0x4f, 0x5a, 0x78, 0x80, 0x40, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, + 0x4f, 0x00, 0x00, 0x90, 0x45, 0x5a, 0x78, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x4f, 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x47, 0x5a, 0x00, 0x90, + 0x43, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, + 0x41, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, + 0x41, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x4f, 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x48, 0x5a, 0x00, 0x90, + 0x43, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, + 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, + 0x40, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x4f, 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x00, 0x90, + 0x43, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, + 0x41, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, + 0x3e, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, + 0x3e, 0x00, 0x00, 0x80, 0x41, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, + 0x4a, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, + 0x4c, 0x5a, 0x00, 0x90, 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, + 0x0c, 0x00, 0x90, 0x43, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, + 0x0c, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x43, + 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x4f, + 0x00, 0x00, 0x90, 0x54, 0x5a, 0x78, 0x80, 0x54, 0x00, 0x00, 0x90, 0x53, + 0x5a, 0x78, 0x80, 0x53, 0x00, 0x00, 0x90, 0x51, 0x5a, 0x00, 0x90, 0x35, + 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x39, 0x4c, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x51, 0x00, 0x00, + 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x39, 0x00, 0x00, 0x80, 0x35, 0x00, 0x00, + 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4d, 0x5a, 0x78, 0x80, 0x4d, 0x00, 0x00, + 0x90, 0x4a, 0x5a, 0x78, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x5a, 0x00, + 0x90, 0x37, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, + 0x3b, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x3b, 0x00, 0x00, 0x80, 0x37, + 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4d, 0x5a, 0x78, 0x80, 0x4d, + 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x78, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, + 0x5a, 0x00, 0x90, 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, + 0x0c, 0x78, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x3c, + 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x43, 0x5a, 0x78, 0x80, 0x43, + 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x45, + 0x5a, 0x78, 0x80, 0x45, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x4f, + 0x00, 0x00, 0x90, 0x47, 0x5a, 0x00, 0x90, 0x43, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, 0x41, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, 0x41, 0x00, 0x00, 0x80, 0x43, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x4f, + 0x00, 0x00, 0x90, 0x48, 0x5a, 0x00, 0x90, 0x43, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, 0x40, 0x00, 0x00, 0x80, 0x43, + 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x4f, + 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x00, 0x90, 0x43, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, 0x41, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, 0x3e, 0x4c, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x41, + 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4f, + 0x5a, 0x78, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x00, 0x90, 0x3c, + 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x40, 0x4c, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x00, 0x90, 0x43, 0x4c, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x0c, 0x78, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, 0x43, 0x00, 0x00, 0x80, 0x40, 0x00, + 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x90, 0x54, 0x5a, + 0x78, 0x80, 0x54, 0x00, 0x00, 0x90, 0x53, 0x5a, 0x78, 0x80, 0x53, 0x00, + 0x00, 0x90, 0x51, 0x5a, 0x00, 0x90, 0x35, 0x4c, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x39, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x51, 0x00, 0x00, 0x90, 0x4f, 0x5a, 0x78, 0x80, + 0x39, 0x00, 0x00, 0x80, 0x35, 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x90, + 0x4d, 0x5a, 0x78, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x78, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x5a, 0x00, 0x90, 0x37, 0x4c, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x3b, 0x4c, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4f, 0x5a, + 0x78, 0x80, 0x3b, 0x00, 0x00, 0x80, 0x37, 0x00, 0x00, 0x80, 0x4f, 0x00, + 0x00, 0x90, 0x4d, 0x5a, 0x78, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4a, 0x5a, + 0x78, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x00, 0x90, 0x38, 0x4c, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x3b, 0x4c, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x90, + 0x4d, 0x5a, 0x78, 0x80, 0x3b, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, + 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x90, + 0x4b, 0x5a, 0x78, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x78, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x47, 0x5a, 0x78, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x4c, 0x5a, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x5a, 0x78, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x90, + 0x47, 0x5a, 0x78, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4c, 0x5a, 0x78, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x5a, 0x78, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x53, 0x85, 0x50, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x53, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x53, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x46, 0x85, 0x50, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x46, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4c, 0x40, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x39, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x40, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, + 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x45, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x02, 0x00, 0x90, + 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x45, + 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, 0x70, 0x80, + 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, + 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x4c, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x02, 0x00, 0x90, 0x28, 0x40, + 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, + 0x34, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, + 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, + 0x00, 0x90, 0x44, 0x4c, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, + 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, + 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, + 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x48, + 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, + 0x48, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, + 0x0f, 0x02, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, + 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, + 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, + 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, + 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, + 0x00, 0x90, 0x47, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x02, + 0x00, 0x90, 0x28, 0x46, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, + 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, + 0x80, 0x47, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, + 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, + 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, + 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, + 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x80, 0x39, 0x00, 0x81, 0x70, 0x90, + 0x4c, 0x40, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x46, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x40, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, + 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, + 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x46, + 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x3c, + 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, + 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, + 0x00, 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, + 0x38, 0x46, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, + 0x90, 0x40, 0x46, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x44, 0x4c, + 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x48, 0x53, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, + 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, + 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, + 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, + 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, + 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, + 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, + 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, + 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x45, 0x4c, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, + 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, + 0x00, 0x90, 0x39, 0x46, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, + 0x4c, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x53, 0x81, 0x70, + 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x53, 0x81, 0x70, 0x80, 0x45, 0x00, + 0x00, 0x90, 0x47, 0x53, 0x00, 0x90, 0x28, 0x46, 0x81, 0x70, 0x80, 0x28, + 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x38, 0x46, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x48, 0x4c, + 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, + 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x45, 0x00, + 0x00, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, + 0x00, 0x00, 0x90, 0x47, 0x53, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, + 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x00, 0xff, 0x7f, 0x04, + 0x05, 0x0f, 0x0f, 0x11, 0x00, 0x90, 0x30, 0x40, 0x81, 0x70, 0x80, 0x30, + 0x00, 0x00, 0x90, 0x37, 0x46, 0x81, 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, + 0x3c, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x43, 0x4c, 0x81, + 0x70, 0x80, 0x43, 0x00, 0x00, 0x90, 0x4d, 0x4c, 0x81, 0x70, 0x80, 0x4d, + 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, + 0x4a, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x01, 0x00, 0x90, + 0x2b, 0x46, 0x81, 0x70, 0x80, 0x2b, 0x00, 0x00, 0x90, 0x37, 0x4c, 0x81, + 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, 0x3b, 0x4c, 0x81, 0x70, 0x80, 0x4a, + 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, 0x90, 0x41, 0x4c, 0x81, 0x70, 0x80, + 0x41, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4c, + 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, + 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, + 0x80, 0x39, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, + 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, + 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, + 0x47, 0x4c, 0x00, 0x90, 0x28, 0x4c, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, + 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, + 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x58, 0x4c, 0x81, 0x70, 0x80, 0x58, 0x00, 0x00, + 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, + 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x4c, + 0x00, 0x90, 0x2d, 0x4c, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, + 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, 0x81, + 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, + 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x47, 0x4c, 0x00, 0x90, 0x28, 0x4c, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, + 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, + 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x44, 0x4c, 0x81, 0x70, + 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, 0x2d, 0x4c, 0x81, 0x70, 0x80, 0x2d, + 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, + 0x48, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, + 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, + 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, + 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, + 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x53, + 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, + 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x53, 0x81, + 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x53, 0x81, 0x70, 0x80, 0x40, + 0x00, 0x00, 0x90, 0x45, 0x53, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x47, 0x59, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, + 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, + 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, + 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x53, 0x81, 0x70, 0x80, 0x47, 0x00, + 0x00, 0x90, 0x2d, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x45, 0x59, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, + 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, + 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x40, 0x4e, 0x00, 0x90, 0x43, 0x4e, 0x00, 0x90, 0x46, + 0x4e, 0x00, 0x90, 0x49, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x80, 0x40, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, 0x46, 0x00, + 0x00, 0x80, 0x49, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x4e, 0x00, 0x90, 0x41, 0x4e, 0x00, + 0x90, 0x45, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, + 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, + 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x45, 0x00, 0x00, 0x80, 0x41, 0x00, + 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x49, 0x4e, 0x00, 0x90, 0x4c, 0x4e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x49, 0x00, 0x00, + 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, + 0x4a, 0x4e, 0x00, 0x90, 0x4d, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, + 0x4d, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4d, 0x4e, 0x00, 0x90, 0x4a, + 0x4e, 0x00, 0x90, 0x44, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x44, 0x00, 0x00, 0x80, + 0x4a, 0x00, 0x00, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4d, 0x4e, 0x00, 0x90, 0x4a, + 0x4e, 0x00, 0x90, 0x44, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x80, 0x44, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x80, 0x4d, 0x00, + 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x45, 0x4e, 0x00, 0x90, 0x48, 0x4e, 0x00, 0x90, 0x4c, 0x4e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x4c, 0x00, 0x00, 0x80, + 0x48, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x2d, 0x53, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x26, 0x59, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x53, 0x00, 0x90, 0x41, 0x59, + 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x53, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x26, 0x53, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, + 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x26, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x26, 0x53, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, + 0x2d, 0x00, 0x78, 0x80, 0x41, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, + 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x26, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x48, 0x53, + 0x00, 0x90, 0x40, 0x53, 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, 0x2d, 0x00, + 0x78, 0x80, 0x40, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x2d, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x26, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x47, 0x4e, 0x00, 0x90, + 0x3e, 0x4e, 0x78, 0x80, 0x26, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x78, 0x80, + 0x3e, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x27, 0x4c, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x3c, 0x53, 0x00, 0x90, 0x42, 0x4e, + 0x00, 0x90, 0x45, 0x53, 0x78, 0x80, 0x2d, 0x00, 0x00, 0x80, 0x27, 0x00, + 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x27, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x3c, 0x80, + 0x27, 0x00, 0x3c, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x27, 0x4e, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x3c, 0x80, 0x27, 0x00, 0x3c, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x27, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x0f, 0x80, + 0x27, 0x00, 0x69, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x45, 0x00, 0x00, 0x80, + 0x42, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x3c, 0x4e, 0x00, 0x90, 0x45, + 0x4e, 0x00, 0x90, 0x27, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x3c, 0x80, 0x27, 0x00, 0x3c, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x27, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x3c, 0x80, 0x27, 0x00, 0x3c, 0x80, + 0x2d, 0x00, 0x78, 0x80, 0x45, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x90, + 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x28, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x45, 0x4e, + 0x00, 0x90, 0x3c, 0x4e, 0x78, 0x80, 0x28, 0x00, 0x00, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, + 0x90, 0x28, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, + 0x28, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x3c, 0x00, 0x00, 0x80, + 0x45, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x28, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x48, 0x4e, 0x00, 0x90, 0x40, 0x4e, 0x78, 0x80, 0x28, 0x00, + 0x00, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x28, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x28, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x78, 0x80, + 0x40, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x2c, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x28, 0x4e, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x47, 0x4e, 0x00, 0x90, 0x3e, 0x4e, + 0x78, 0x80, 0x28, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x78, 0x90, 0x2c, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x28, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x28, 0x00, 0x00, 0x80, + 0x2c, 0x00, 0x78, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, + 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x21, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x45, 0x4e, + 0x00, 0x90, 0x3c, 0x4e, 0x78, 0x80, 0x21, 0x00, 0x00, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, + 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, + 0x40, 0x53, 0x00, 0x90, 0x43, 0x4e, 0x00, 0x90, 0x46, 0x4e, 0x00, 0x90, + 0x49, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, + 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x90, 0x2d, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4c, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x53, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x40, + 0x00, 0x00, 0x80, 0x49, 0x00, 0x00, 0x80, 0x46, 0x00, 0x00, 0x80, 0x43, + 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x4a, 0x4e, 0x00, 0x90, 0x45, 0x4e, 0x00, 0x90, 0x41, 0x4e, + 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, + 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, + 0x00, 0x78, 0x80, 0x41, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x80, 0x4a, + 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x49, 0x4e, 0x00, 0x90, 0x4c, 0x4e, 0x78, 0x80, 0x2d, 0x00, + 0x78, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x49, 0x00, 0x00, 0x90, 0x2d, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x4e, 0x00, + 0x90, 0x4d, 0x4e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x4d, 0x00, 0x00, + 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x4e, 0x00, 0x90, 0x4d, 0x4e, 0x78, 0x80, + 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, + 0x80, 0x4d, 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2d, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x4e, 0x00, 0x90, + 0x4d, 0x53, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x90, 0x2d, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2d, 0x00, 0x78, 0x80, 0x4d, + 0x00, 0x00, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2e, 0x4c, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4d, 0x59, 0x00, 0x90, 0x4a, 0x4e, + 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x53, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x59, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, + 0x2e, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, + 0x00, 0x78, 0x90, 0x2e, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x4c, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x80, 0x4d, 0x00, 0x00, + 0x80, 0x4a, 0x00, 0x00, 0x90, 0x2e, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x00, 0x90, 0x4b, 0x4c, 0x00, 0x90, 0x43, 0x4e, 0x78, 0x80, + 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x4e, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x4e, + 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, + 0x80, 0x43, 0x00, 0x00, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x2e, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x4a, 0x4c, 0x00, 0x90, + 0x41, 0x4e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x80, 0x41, 0x00, 0x00, 0x80, + 0x4a, 0x00, 0x00, 0x90, 0x2e, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, + 0x0e, 0x00, 0x90, 0x48, 0x53, 0x00, 0x90, 0x3f, 0x4e, 0x78, 0x80, 0x2e, + 0x00, 0x78, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x2e, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x46, 0x53, + 0x00, 0x90, 0x41, 0x4e, 0x00, 0x90, 0x3e, 0x4e, 0x78, 0x80, 0x2e, 0x00, + 0x78, 0x90, 0x2e, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x53, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x90, 0x2e, 0x4c, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, 0x80, 0x2e, 0x00, 0x78, 0x80, 0x3e, + 0x00, 0x00, 0x80, 0x41, 0x00, 0x00, 0x80, 0x46, 0x00, 0x00, 0x90, 0x2e, + 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x3e, 0x53, + 0x00, 0x90, 0x41, 0x4e, 0x00, 0x90, 0x45, 0x4e, 0x78, 0x80, 0x2e, 0x00, + 0x78, 0x90, 0x2e, 0x59, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x78, + 0x80, 0x2e, 0x00, 0x78, 0x80, 0x45, 0x00, 0x00, 0x80, 0x41, 0x00, 0x00, + 0x80, 0x3e, 0x00, 0x00, 0x90, 0x2f, 0x4e, 0x00, 0x90, 0x3e, 0x4e, 0x00, + 0x90, 0x41, 0x4e, 0x00, 0x90, 0x44, 0x4e, 0x81, 0x70, 0x80, 0x2f, 0x00, + 0x00, 0x90, 0x2f, 0x4e, 0x81, 0x70, 0x80, 0x2f, 0x00, 0x00, 0x90, 0x2f, + 0x4e, 0x81, 0x70, 0x80, 0x2f, 0x00, 0x00, 0x90, 0x2f, 0x4e, 0x81, 0x70, + 0x80, 0x44, 0x00, 0x00, 0x80, 0x41, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x00, + 0x80, 0x2f, 0x00, 0x00, 0x90, 0x2f, 0x4e, 0x00, 0x90, 0x3e, 0x4e, 0x00, + 0x90, 0x41, 0x4e, 0x00, 0x90, 0x44, 0x4e, 0x81, 0x70, 0x80, 0x2f, 0x00, + 0x00, 0x90, 0x2f, 0x4e, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x80, 0x41, + 0x00, 0x00, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x2f, 0x00, 0x00, 0x90, 0x3c, + 0x4e, 0x00, 0x90, 0x40, 0x4e, 0x00, 0x90, 0x45, 0x4e, 0x00, 0x90, 0x30, + 0x4e, 0x87, 0x40, 0x80, 0x30, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x80, + 0x40, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x83, 0x60, 0x90, 0x47, 0x4e, 0x00, + 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x40, 0x4e, 0x00, 0xff, + 0x7f, 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x41, 0x4e, 0x00, 0xff, 0x7f, + 0x03, 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x34, 0x4e, 0x00, 0xff, 0x7f, 0x03, + 0x05, 0x0f, 0x0e, 0x00, 0x90, 0x38, 0x4e, 0x00, 0xff, 0x7f, 0x03, 0x05, + 0x0f, 0x0e, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x80, 0x34, 0x00, 0x00, + 0x80, 0x41, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x47, 0x00, 0x89, + 0x30, 0x90, 0x3c, 0x4e, 0x81, 0x20, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x3c, + 0x4e, 0x81, 0x20, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4e, 0x81, 0x20, + 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4e, 0x81, 0x20, 0x80, 0x45, 0x00, + 0x00, 0x90, 0x48, 0x4e, 0x81, 0x20, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4c, + 0x4e, 0x81, 0x20, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4a, 0x4e, 0x00, 0x90, + 0x39, 0x4e, 0x00, 0x90, 0x3c, 0x4e, 0x00, 0x90, 0x40, 0x4e, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x20, 0x80, 0x4a, 0x00, 0x00, + 0x90, 0x48, 0x4e, 0x81, 0x20, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4e, + 0x81, 0x20, 0x80, 0x40, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x39, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x4e, 0x00, 0x90, 0x40, + 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x00, 0x90, 0x3c, + 0x4e, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x20, 0x80, 0x45, 0x00, 0x00, 0x90, + 0x48, 0x4e, 0x81, 0x20, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4c, 0x4e, 0x81, + 0x20, 0x80, 0x39, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x40, 0x00, + 0x00, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x51, 0x4e, 0x81, 0x20, 0x80, 0x51, + 0x00, 0x00, 0x90, 0x54, 0x4e, 0x81, 0x20, 0x80, 0x54, 0x00, 0x00, 0x90, + 0x58, 0x4e, 0x81, 0x20, 0x80, 0x58, 0x00, 0x00, 0x90, 0x56, 0x4e, 0x00, + 0x90, 0x40, 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x00, + 0x90, 0x3c, 0x4e, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x20, 0x80, 0x56, 0x00, + 0x00, 0x90, 0x54, 0x4e, 0x81, 0x20, 0x80, 0x54, 0x00, 0x00, 0x90, 0x53, + 0x4e, 0x81, 0x20, 0x80, 0x39, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, + 0x40, 0x00, 0x00, 0x80, 0x53, 0x00, 0x00, 0x90, 0x51, 0x4e, 0x00, 0x90, + 0x40, 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x00, 0x90, + 0x3c, 0x4e, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x20, 0x80, 0x51, 0x00, 0x00, + 0x90, 0x54, 0x4e, 0x81, 0x20, 0x80, 0x54, 0x00, 0x00, 0x90, 0x58, 0x4e, + 0x81, 0x20, 0x80, 0x39, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0x80, 0x58, 0x00, 0x00, 0x90, 0x5d, 0x4e, 0x81, 0x20, 0x80, + 0x5d, 0x00, 0x00, 0x90, 0x60, 0x4e, 0x81, 0x20, 0x80, 0x60, 0x00, 0x00, + 0x90, 0x64, 0x4e, 0x81, 0x20, 0x80, 0x64, 0x00, 0x00, 0x90, 0x62, 0x4e, + 0x00, 0x90, 0x39, 0x4e, 0x00, 0x90, 0x3c, 0x4e, 0x00, 0x90, 0x40, 0x4e, + 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, 0x20, 0x80, 0x62, + 0x00, 0x00, 0x90, 0x60, 0x4e, 0x81, 0x20, 0x80, 0x60, 0x00, 0x00, 0x90, + 0x5f, 0x4e, 0x81, 0x20, 0x80, 0x40, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, + 0x80, 0x39, 0x00, 0x00, 0x80, 0x5f, 0x00, 0x00, 0x90, 0x5e, 0x4e, 0x00, + 0x90, 0x40, 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x00, + 0x90, 0x3c, 0x4e, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x20, 0x80, 0x5e, 0x00, + 0x00, 0x90, 0x5d, 0x4e, 0x81, 0x20, 0x80, 0x5d, 0x00, 0x00, 0x90, 0x5c, + 0x4e, 0x81, 0x20, 0x80, 0x39, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, + 0x40, 0x00, 0x00, 0x80, 0x5c, 0x00, 0x00, 0x90, 0x5b, 0x4e, 0x81, 0x20, + 0x80, 0x5b, 0x00, 0x00, 0x90, 0x5a, 0x4e, 0x81, 0x20, 0x80, 0x5a, 0x00, + 0x00, 0x90, 0x59, 0x4e, 0x81, 0x20, 0x80, 0x59, 0x00, 0x00, 0x90, 0x58, + 0x4e, 0x81, 0x20, 0x80, 0x58, 0x00, 0x00, 0x90, 0x57, 0x4e, 0x81, 0x20, + 0x80, 0x57, 0x00, 0x00, 0x90, 0x56, 0x4e, 0x81, 0x20, 0x80, 0x56, 0x00, + 0x00, 0x90, 0x55, 0x4e, 0x81, 0x20, 0x80, 0x55, 0x00, 0x00, 0x90, 0x54, + 0x4e, 0x81, 0x20, 0x80, 0x54, 0x00, 0x00, 0x90, 0x53, 0x4e, 0x81, 0x20, + 0x80, 0x53, 0x00, 0x00, 0x90, 0x52, 0x4e, 0x81, 0x20, 0x80, 0x52, 0x00, + 0x00, 0x90, 0x51, 0x4e, 0x81, 0x20, 0x80, 0x51, 0x00, 0x00, 0x90, 0x50, + 0x4e, 0x81, 0x20, 0x80, 0x50, 0x00, 0x00, 0x90, 0x4f, 0x4e, 0x81, 0x20, + 0x80, 0x4f, 0x00, 0x00, 0x90, 0x4e, 0x4e, 0x81, 0x20, 0x80, 0x4e, 0x00, + 0x00, 0x90, 0x4d, 0x4e, 0x81, 0x20, 0x80, 0x4d, 0x00, 0x00, 0x90, 0x4c, + 0x4e, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4e, 0x81, 0x70, + 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x81, 0x70, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x47, 0x4e, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, + 0x4e, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4e, 0x81, 0x70, + 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, 0x53, 0x00, 0x90, 0x2d, 0x46, 0x81, + 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, + 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x70, 0x80, + 0x39, 0x00, 0x00, 0x90, 0x3c, 0x46, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, + 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x53, + 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, 0x90, 0x47, 0x59, 0x00, 0x90, 0x28, + 0x4c, 0x81, 0x70, 0x80, 0x28, 0x00, 0x00, 0x90, 0x34, 0x4e, 0x81, 0x70, + 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4e, 0x81, + 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, 0x40, 0x4e, 0x81, 0x70, 0x80, 0x40, + 0x00, 0x00, 0x90, 0x44, 0x46, 0x81, 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, + 0x47, 0x46, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x48, 0x4e, 0x00, + 0x90, 0x2d, 0x53, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4e, + 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x39, + 0x4e, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4e, 0x00, 0xff, + 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x10, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, + 0x90, 0x4c, 0x4e, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4e, + 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x81, 0x70, 0x80, + 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4e, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, + 0x90, 0x4c, 0x53, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4e, + 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x46, 0x81, 0x70, 0x80, + 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4e, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, + 0x90, 0x45, 0x4e, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, + 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, + 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, + 0x3c, 0x53, 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x53, 0x81, + 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, + 0x00, 0x00, 0x90, 0x47, 0x53, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, + 0x28, 0x00, 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, + 0x80, 0x47, 0x00, 0x00, 0x90, 0x38, 0x4c, 0x81, 0x70, 0x80, 0x38, 0x00, + 0x00, 0x90, 0x40, 0x53, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x48, + 0x4e, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x4e, 0x81, 0x70, + 0x80, 0x47, 0x00, 0x00, 0x90, 0x45, 0x4e, 0x00, 0x90, 0x2d, 0x4e, 0x81, + 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4e, 0x81, 0x70, 0x80, 0x34, + 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x90, 0x39, 0x4e, 0x81, 0x70, 0x80, + 0x39, 0x00, 0x00, 0x90, 0x47, 0x4e, 0x81, 0x70, 0x80, 0x47, 0x00, 0x00, + 0x90, 0x48, 0x4e, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x4a, 0x4e, + 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x4c, 0x4e, 0x00, 0xff, 0x7f, + 0x04, 0x05, 0x0f, 0x0f, 0x10, 0x00, 0x90, 0x30, 0x46, 0x81, 0x70, 0x80, + 0x30, 0x00, 0x00, 0x90, 0x37, 0x4e, 0x81, 0x70, 0x80, 0x37, 0x00, 0x00, + 0x90, 0x3c, 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x08, 0x81, + 0x70, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x43, 0x4e, + 0x81, 0x70, 0x80, 0x43, 0x00, 0x00, 0x90, 0x4d, 0x4e, 0x81, 0x70, 0x80, + 0x4d, 0x00, 0x00, 0x90, 0x4c, 0x4e, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, + 0x90, 0x4a, 0x4e, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, 0x10, 0x00, + 0x90, 0x2b, 0x40, 0x81, 0x70, 0x80, 0x2b, 0x00, 0x00, 0x90, 0x37, 0x4e, + 0x81, 0x70, 0x80, 0x37, 0x00, 0x00, 0x90, 0x3b, 0x4e, 0x81, 0x70, 0x80, + 0x4a, 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, 0x90, 0x41, 0x4e, 0x81, 0x70, + 0x80, 0x41, 0x00, 0x00, 0x90, 0x4c, 0x4e, 0x81, 0x70, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x4a, 0x4e, 0x81, 0x70, 0x80, 0x4a, 0x00, 0x00, 0x90, 0x48, + 0x4e, 0x00, 0x90, 0x2d, 0x46, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, + 0x34, 0x4e, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x90, 0x39, 0x4e, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x90, 0x40, 0x4e, + 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4a, 0x4e, 0x81, 0x70, 0x80, + 0x4a, 0x00, 0x00, 0x90, 0x48, 0x4e, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, + 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0x90, 0x40, 0x40, 0x00, 0xff, 0x7f, 0x04, 0x05, 0x0f, 0x0f, + 0x08, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x40, 0x46, 0x81, 0x70, + 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, 0x53, 0x81, 0x70, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, + 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4c, 0x46, 0x81, 0x70, + 0x80, 0x4c, 0x00, 0x00, 0x90, 0x58, 0x4c, 0x81, 0x70, 0x80, 0x58, 0x00, + 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, + 0x46, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, + 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x4b, 0x46, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, + 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, + 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, + 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, + 0x4c, 0x00, 0x90, 0x2d, 0x40, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, + 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, + 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, + 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x45, 0x4c, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, + 0x90, 0x47, 0x4c, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, + 0x00, 0x90, 0x34, 0x46, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0x90, 0x38, 0x46, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, + 0x40, 0x46, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x44, 0x4c, 0x81, + 0x70, 0x80, 0x44, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, 0x80, 0x47, + 0x00, 0x00, 0x90, 0x48, 0x4c, 0x00, 0x90, 0x2d, 0x4c, 0x81, 0x70, 0x80, + 0x2d, 0x00, 0x00, 0x90, 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, + 0x80, 0x48, 0x00, 0x00, 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, + 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x4c, + 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, + 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, + 0x00, 0x90, 0x4b, 0x4c, 0x81, 0x70, 0x80, 0x4b, 0x00, 0x00, 0x90, 0x4c, + 0x4c, 0x81, 0x70, 0x80, 0x4c, 0x00, 0x00, 0x90, 0x47, 0x4c, 0x81, 0x70, + 0x80, 0x47, 0x00, 0x00, 0x90, 0x4a, 0x4c, 0x81, 0x70, 0x80, 0x4a, 0x00, + 0x00, 0x90, 0x48, 0x4c, 0x81, 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x45, + 0x4c, 0x00, 0x90, 0x2d, 0x4c, 0x81, 0x70, 0x80, 0x2d, 0x00, 0x00, 0x90, + 0x34, 0x4c, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, + 0x90, 0x39, 0x4c, 0x81, 0x70, 0x80, 0x39, 0x00, 0x00, 0x90, 0x3c, 0x4c, + 0x81, 0x70, 0x80, 0x3c, 0x00, 0x00, 0x90, 0x40, 0x4c, 0x81, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x90, 0x45, 0x46, 0x81, 0x70, 0x80, 0x45, 0x00, 0x00, + 0x90, 0x47, 0x40, 0x00, 0x90, 0x28, 0x40, 0x81, 0x70, 0x80, 0x28, 0x00, + 0x00, 0x90, 0x34, 0x40, 0x81, 0x70, 0x80, 0x34, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0x90, 0x38, 0x39, 0x81, 0x70, 0x80, 0x38, 0x00, 0x00, 0x90, + 0x40, 0x33, 0x81, 0x70, 0x80, 0x40, 0x00, 0x00, 0x90, 0x48, 0x33, 0x81, + 0x70, 0x80, 0x48, 0x00, 0x00, 0x90, 0x47, 0x33, 0x81, 0x55, 0xb0, 0x40, + 0x7f, 0x1b, 0x80, 0x47, 0x00, 0x00, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0e, + 0x00, 0x90, 0x3c, 0x2d, 0x00, 0x90, 0x45, 0x2d, 0x00, 0x90, 0x2d, 0x2d, + 0x00, 0x90, 0x21, 0x2d, 0x8b, 0x20, 0x80, 0x2d, 0x00, 0x00, 0x80, 0x21, + 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x45, 0x00, 0x96, 0x20, 0xb0, + 0x40, 0x00, 0x20, 0xff, 0x7f, 0x03, 0x05, 0x0f, 0x0a, 0x00, 0xff, 0x2f, + 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x00, 0x4c, 0x00, 0xff, 0x7f, + 0x05, 0x05, 0x0f, 0x09, 0x00, 0x40, 0x00, 0xff, 0x7f, 0x0f, 0x05, 0x0f, + 0x06, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x4d, 0x49, 0x44, + 0x49, 0x00, 0xff, 0x03, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x66, 0x6f, 0x72, 0x65, 0x6c, 0x69, 0x73, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x00, 0xff, 0x58, 0x04, 0x03, 0x03, 0x0c, + 0x08, 0x00, 0xc1, 0x00, 0x00, 0xff, 0x20, 0x01, 0x01, 0x00, 0xff, 0x2f, + 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x00, 0x54, 0x00, 0xff, 0x7f, + 0x05, 0x05, 0x0f, 0x09, 0x00, 0x40, 0x00, 0xff, 0x7f, 0x0f, 0x05, 0x0f, + 0x06, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x4d, 0x49, 0x44, + 0x49, 0x00, 0xff, 0x03, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x4c, 0x75, 0x64, 0x77, 0x69, 0x67, 0x20, + 0x76, 0x61, 0x6e, 0x20, 0x42, 0x65, 0x65, 0x74, 0x68, 0x6f, 0x76, 0x65, + 0x6e, 0x00, 0xff, 0x58, 0x04, 0x03, 0x03, 0x0c, 0x08, 0x00, 0xc2, 0x00, + 0x00, 0xff, 0x20, 0x01, 0x02, 0x00, 0xff, 0x2f, 0x00 +}; diff --git a/examples/PlayMIDIFromROM/jm_mozdi_mid.h b/examples/PlayMIDIFromROM/jm_mozdi_mid.h new file mode 100644 index 00000000..17c3e684 --- /dev/null +++ b/examples/PlayMIDIFromROM/jm_mozdi_mid.h @@ -0,0 +1,2583 @@ +const unsigned char _mid[] PROGMEM = { + 0x4d, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0d, + 0x01, 0xe0, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x00, 0x19, 0x00, 0xff, + 0x58, 0x04, 0x04, 0x02, 0x18, 0x08, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, + 0x00, 0xff, 0x51, 0x03, 0x06, 0x1a, 0x80, 0x00, 0xff, 0x2f, 0x00, 0x4d, + 0x54, 0x72, 0x6b, 0x00, 0x00, 0x08, 0x01, 0x00, 0xff, 0x21, 0x01, 0x00, + 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x31, 0x00, + 0xc0, 0x38, 0x00, 0xb0, 0x07, 0x64, 0x00, 0xb0, 0x0a, 0x32, 0x02, 0xb0, + 0x5b, 0x7f, 0x26, 0x90, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x87, 0x18, 0x51, + 0x50, 0x00, 0x4d, 0x50, 0x28, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x87, 0x18, + 0x51, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x58, 0x50, 0x00, 0x4f, 0x50, 0x8f, + 0x00, 0x4f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x58, 0x50, 0x00, 0x4f, 0x50, + 0x87, 0x40, 0x4f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x51, 0x50, 0x00, 0x4f, + 0x50, 0x87, 0x40, 0x4f, 0x00, 0x00, 0x51, 0x00, 0x00, 0x56, 0x50, 0x00, + 0x4a, 0x50, 0x8b, 0x20, 0x4a, 0x00, 0x00, 0x56, 0x00, 0x00, 0x56, 0x50, + 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x00, 0x51, + 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x51, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x51, 0x00, + 0x83, 0x60, 0x51, 0x50, 0x00, 0x48, 0x50, 0x83, 0x60, 0x48, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x51, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x51, 0x00, 0x00, 0x51, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x51, 0x00, 0x00, 0x51, 0x50, 0x83, 0x60, 0x4d, 0x50, 0x83, + 0x60, 0x4d, 0x00, 0x00, 0x51, 0x00, 0x00, 0x4a, 0x50, 0x83, 0x60, 0x4a, + 0x00, 0x00, 0x59, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, + 0x59, 0x00, 0x00, 0x58, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x56, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x56, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, + 0x51, 0x00, 0x00, 0x56, 0x00, 0x00, 0x55, 0x50, 0x00, 0x51, 0x50, 0x83, + 0x60, 0x51, 0x00, 0x00, 0x55, 0x00, 0x8f, 0x00, 0x54, 0x50, 0x00, 0x48, + 0x50, 0x81, 0x70, 0x48, 0x00, 0x00, 0x54, 0x00, 0x00, 0x55, 0x50, 0x00, + 0x4d, 0x50, 0x81, 0x70, 0x55, 0x00, 0x00, 0x56, 0x50, 0x81, 0x70, 0x56, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x58, 0x50, 0x00, 0x52, 0x50, 0x81, 0x70, + 0x52, 0x00, 0x00, 0x58, 0x00, 0x00, 0x51, 0x50, 0x00, 0x59, 0x50, 0x8b, + 0x20, 0x59, 0x00, 0x00, 0x54, 0x50, 0x83, 0x60, 0x54, 0x00, 0x00, 0x51, + 0x00, 0x00, 0x4d, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, + 0x4d, 0x00, 0x00, 0x48, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x4d, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x51, 0x50, 0x00, 0x54, 0x50, 0x83, 0x60, + 0x54, 0x00, 0x00, 0x51, 0x00, 0x00, 0x57, 0x50, 0x00, 0x54, 0x50, 0x87, + 0x40, 0x54, 0x00, 0x00, 0x57, 0x00, 0x00, 0x56, 0x50, 0x00, 0x51, 0x50, + 0x87, 0x40, 0x51, 0x00, 0x00, 0x56, 0x00, 0x00, 0x4f, 0x50, 0x00, 0x4f, + 0x50, 0x8b, 0x20, 0x56, 0x50, 0x83, 0x60, 0x56, 0x00, 0x00, 0x4f, 0x00, + 0x00, 0x53, 0x50, 0x83, 0x60, 0x53, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x4f, + 0x50, 0x00, 0x4a, 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x53, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x53, 0x00, + 0x00, 0x56, 0x50, 0x00, 0x53, 0x50, 0x83, 0x60, 0x53, 0x00, 0x00, 0x56, + 0x00, 0x00, 0x59, 0x50, 0x00, 0x56, 0x50, 0x87, 0x40, 0x56, 0x00, 0x00, + 0x59, 0x00, 0x00, 0x58, 0x50, 0x00, 0x53, 0x50, 0x87, 0x40, 0x53, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x51, 0x50, 0x00, 0x58, 0x50, 0x87, 0x40, 0x51, + 0x00, 0x00, 0x50, 0x50, 0x87, 0x40, 0x50, 0x00, 0x00, 0x51, 0x50, 0x83, + 0x60, 0x51, 0x00, 0x00, 0x54, 0x50, 0x83, 0x60, 0x58, 0x00, 0x00, 0x56, + 0x50, 0x83, 0x60, 0x54, 0x00, 0x00, 0x53, 0x50, 0x81, 0x70, 0x53, 0x00, + 0x00, 0x51, 0x50, 0x81, 0x70, 0x51, 0x00, 0x00, 0x56, 0x00, 0x00, 0x50, + 0x50, 0x83, 0x60, 0x50, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x83, + 0x60, 0x54, 0x00, 0x00, 0x53, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x50, + 0x50, 0x83, 0x60, 0x50, 0x00, 0x00, 0x53, 0x00, 0x00, 0x51, 0x50, 0x83, + 0x60, 0x51, 0x00, 0xa9, 0x20, 0x54, 0x50, 0x00, 0x51, 0x50, 0x87, 0x40, + 0x51, 0x00, 0x00, 0x54, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x87, + 0x40, 0x51, 0x00, 0x00, 0x54, 0x00, 0x00, 0x56, 0x50, 0x00, 0x53, 0x50, + 0x8f, 0x00, 0x53, 0x00, 0x00, 0x56, 0x00, 0x00, 0x51, 0x50, 0x00, 0x4e, + 0x50, 0x87, 0x40, 0x4e, 0x00, 0x00, 0x51, 0x00, 0x00, 0x51, 0x50, 0x00, + 0x4e, 0x50, 0x87, 0x40, 0x4e, 0x00, 0x00, 0x51, 0x00, 0x00, 0x54, 0x50, + 0x00, 0x51, 0x50, 0x8f, 0x00, 0x51, 0x00, 0x00, 0x54, 0x00, 0x00, 0x59, + 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x59, 0x00, 0x00, + 0x58, 0x50, 0x00, 0x54, 0x50, 0x83, 0x60, 0x54, 0x00, 0x00, 0x58, 0x00, + 0x83, 0x60, 0x58, 0x50, 0x00, 0x54, 0x50, 0x83, 0x60, 0x54, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x56, 0x50, 0x00, 0x50, 0x50, 0x83, 0x60, 0x50, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, + 0x00, 0x00, 0x54, 0x00, 0x83, 0x60, 0x53, 0x50, 0x00, 0x4f, 0x50, 0x81, + 0x70, 0x4f, 0x00, 0x00, 0x4e, 0x50, 0x81, 0x70, 0x4e, 0x00, 0x00, 0x53, + 0x00, 0x00, 0x56, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x54, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, + 0x00, 0x54, 0x00, 0x00, 0x52, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x51, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, + 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, 0x51, 0x50, 0x00, 0x4c, 0x50, 0x83, + 0x60, 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, 0x50, 0x50, 0x00, 0x4c, 0x50, + 0x83, 0x60, 0x4c, 0x00, 0x00, 0x50, 0x00, 0x00, 0x53, 0x50, 0x00, 0x4f, + 0x50, 0x87, 0x40, 0x4f, 0x00, 0x00, 0x50, 0x50, 0x87, 0x40, 0x50, 0x00, + 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x4d, 0x50, 0x83, 0x60, + 0x4d, 0x00, 0x00, 0x53, 0x00, 0x00, 0x54, 0x50, 0x00, 0x4b, 0x50, 0x87, + 0x40, 0x4b, 0x00, 0x00, 0x54, 0x00, 0x00, 0x54, 0x50, 0x00, 0x4b, 0x50, + 0x87, 0x40, 0x4b, 0x00, 0x00, 0x54, 0x00, 0x00, 0x57, 0x50, 0x00, 0x4f, + 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x57, 0x00, 0x00, 0x54, 0x50, 0x00, + 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x54, 0x00, 0x00, 0x4f, 0x50, + 0x83, 0x60, 0x4f, 0x00, 0x00, 0x54, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, + 0x4f, 0x00, 0x00, 0x54, 0x00, 0x00, 0x54, 0x50, 0x00, 0x4f, 0x50, 0x83, + 0x60, 0x54, 0x00, 0x00, 0x55, 0x50, 0x83, 0x60, 0x55, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x55, 0x50, 0x00, 0x4f, 0x50, 0x87, 0x40, 0x4f, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x55, 0x50, 0x00, 0x4f, 0x50, 0x87, 0x40, 0x4f, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x55, 0x50, 0x00, 0x4c, 0x50, 0x87, 0x40, 0x4c, + 0x00, 0x00, 0x55, 0x00, 0x00, 0x58, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, + 0x4f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x55, 0x50, 0x00, 0x4f, 0x50, 0x83, + 0x60, 0x4f, 0x00, 0x00, 0x55, 0x00, 0x00, 0x51, 0x50, 0x00, 0x4c, 0x50, + 0x83, 0x60, 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, 0x55, 0x50, 0x00, 0x51, + 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x55, 0x00, 0x00, 0x51, 0x50, 0x00, + 0x55, 0x50, 0x83, 0x60, 0x55, 0x00, 0x00, 0x56, 0x50, 0x83, 0x60, 0x56, + 0x00, 0x00, 0x51, 0x00, 0x00, 0x51, 0x50, 0x00, 0x56, 0x50, 0x87, 0x40, + 0x56, 0x00, 0x00, 0x51, 0x00, 0x00, 0x57, 0x50, 0x00, 0x52, 0x50, 0x87, + 0x40, 0x52, 0x00, 0x00, 0x57, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, + 0x87, 0x40, 0x51, 0x00, 0x00, 0x54, 0x00, 0x00, 0x52, 0x50, 0x00, 0x4f, + 0x50, 0x87, 0x40, 0x4f, 0x00, 0x00, 0x52, 0x00, 0x00, 0x59, 0x50, 0x00, + 0x51, 0x50, 0x87, 0x40, 0x51, 0x00, 0x00, 0x59, 0x00, 0x00, 0x57, 0x50, + 0x00, 0x52, 0x50, 0x87, 0x40, 0x52, 0x00, 0x00, 0x57, 0x00, 0x00, 0x56, + 0x50, 0x00, 0x53, 0x50, 0x87, 0x40, 0x53, 0x00, 0x00, 0x56, 0x00, 0x00, + 0x51, 0x50, 0x00, 0x56, 0x50, 0x83, 0x60, 0x56, 0x00, 0x00, 0x55, 0x50, + 0x83, 0x60, 0x55, 0x00, 0x00, 0x51, 0x00, 0x9e, 0x00, 0x51, 0x50, 0x00, + 0x4c, 0x50, 0x87, 0x40, 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, 0x50, 0x50, + 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x50, 0x00, 0x00, 0x51, + 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x51, 0x50, 0x00, 0x4c, 0x50, 0x87, 0x40, 0x4c, 0x00, 0x00, 0x51, 0x00, + 0x00, 0x50, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x50, + 0x00, 0x00, 0x51, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, + 0x51, 0x00, 0x9e, 0x00, 0x58, 0x50, 0x00, 0x51, 0x50, 0x87, 0x40, 0x51, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x59, 0x50, 0x00, 0x50, 0x50, 0x83, 0x60, + 0x50, 0x00, 0x00, 0x59, 0x00, 0x00, 0x58, 0x50, 0x00, 0x51, 0x50, 0x83, + 0x60, 0x51, 0x00, 0x00, 0x58, 0x00, 0x00, 0x58, 0x50, 0x00, 0x51, 0x50, + 0x87, 0x40, 0x51, 0x00, 0x00, 0x58, 0x00, 0x00, 0x59, 0x50, 0x00, 0x50, + 0x50, 0x83, 0x60, 0x50, 0x00, 0x00, 0x59, 0x00, 0x00, 0x58, 0x50, 0x00, + 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x58, 0x00, 0x9e, 0x00, 0x56, + 0x50, 0x00, 0x4f, 0x50, 0x87, 0x40, 0x4f, 0x00, 0x00, 0x56, 0x00, 0x00, + 0x54, 0x50, 0x00, 0x51, 0x50, 0x81, 0x70, 0x51, 0x00, 0x00, 0x54, 0x00, + 0x00, 0x56, 0x50, 0x00, 0x52, 0x50, 0x81, 0x70, 0x52, 0x00, 0x00, 0x56, + 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x81, 0x70, 0x51, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x56, 0x50, 0x00, 0x52, 0x50, 0x81, 0x70, 0x52, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x81, 0x70, 0x51, + 0x00, 0x00, 0x54, 0x00, 0x00, 0x56, 0x50, 0x00, 0x52, 0x50, 0x81, 0x70, + 0x52, 0x00, 0x00, 0x56, 0x00, 0x00, 0x54, 0x50, 0x00, 0x51, 0x50, 0x81, + 0x70, 0x51, 0x00, 0x00, 0x54, 0x00, 0x00, 0x56, 0x50, 0x00, 0x52, 0x50, + 0x81, 0x70, 0x52, 0x00, 0x00, 0x56, 0x00, 0x00, 0x58, 0x50, 0x00, 0x51, + 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x58, 0x00, 0x00, 0x55, 0x50, 0x00, + 0x51, 0x50, 0x83, 0x60, 0x51, 0x00, 0x00, 0x55, 0x00, 0x83, 0x60, 0x55, + 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x55, 0x00, 0x00, + 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, + 0x00, 0x55, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x55, + 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x55, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, 0x4c, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x55, 0x50, 0x00, 0x4c, 0x50, 0x83, 0x60, + 0x4c, 0x00, 0x00, 0x55, 0x00, 0x83, 0x60, 0x56, 0x50, 0x00, 0x4d, 0x50, + 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x00, 0x58, 0x50, 0x00, 0x4f, + 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x56, 0x50, 0x00, + 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x00, 0x58, 0x50, + 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x56, + 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x00, + 0x58, 0x50, 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x58, 0x00, + 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, + 0x00, 0x8b, 0x20, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x87, 0x40, 0x4d, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x59, 0x50, 0x00, 0x51, 0x50, 0x83, 0x60, + 0x51, 0x00, 0x00, 0x59, 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, + 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x8f, 0x00, 0x56, 0x50, 0x00, 0x4f, + 0x50, 0x85, 0x50, 0x4f, 0x00, 0x00, 0x56, 0x00, 0x00, 0x56, 0x50, 0x00, + 0x4f, 0x50, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x56, 0x00, 0x00, 0x55, 0x50, + 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x55, 0x00, 0x00, 0x4d, + 0x50, 0x00, 0x56, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x50, 0x83, + 0x60, 0x56, 0x00, 0x00, 0x55, 0x50, 0x83, 0x60, 0x55, 0x00, 0x00, 0x4c, + 0x00, 0x00, 0x56, 0x50, 0x00, 0x4a, 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x87, 0x40, 0x4d, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x56, 0x50, 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x59, 0x50, 0x00, 0x56, 0x50, 0x83, 0x60, + 0x56, 0x00, 0x00, 0x59, 0x00, 0x00, 0x56, 0x50, 0x00, 0x52, 0x50, 0x83, + 0x60, 0x52, 0x00, 0x00, 0x56, 0x00, 0x8f, 0x00, 0x57, 0x50, 0x00, 0x4f, + 0x50, 0x85, 0x50, 0x4f, 0x00, 0x00, 0x57, 0x00, 0x00, 0x56, 0x50, 0x00, + 0x4f, 0x50, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x56, 0x00, 0x00, 0x55, 0x50, + 0x00, 0x4f, 0x50, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x55, 0x00, 0x00, 0x4d, + 0x50, 0x00, 0x56, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x50, 0x83, + 0x60, 0x56, 0x00, 0x00, 0x55, 0x50, 0x83, 0x60, 0x55, 0x00, 0x00, 0x4c, + 0x00, 0x00, 0x56, 0x50, 0x00, 0x4a, 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, + 0x56, 0x00, 0x96, 0x40, 0x51, 0x50, 0x81, 0x70, 0x51, 0x00, 0x00, 0x55, + 0x50, 0x00, 0x4f, 0x50, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x55, 0x00, 0x00, + 0x4d, 0x50, 0x00, 0x56, 0x50, 0x81, 0x70, 0x4d, 0x00, 0x00, 0x51, 0x50, + 0x81, 0x70, 0x51, 0x00, 0x00, 0x56, 0x00, 0x00, 0x52, 0x50, 0x00, 0x56, + 0x50, 0x81, 0x70, 0x52, 0x00, 0x00, 0x4f, 0x50, 0x81, 0x70, 0x4f, 0x00, + 0x00, 0x4d, 0x50, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x56, 0x00, 0x00, 0x4c, + 0x50, 0x00, 0x55, 0x50, 0x83, 0x60, 0x55, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x56, 0x50, 0x00, 0x4a, 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x56, 0x00, + 0x00, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x0b, 0x4c, + 0x00, 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x20, 0x32, 0x00, 0xc1, 0x46, 0x00, 0xb1, 0x07, 0x6c, 0x00, + 0xb1, 0x0a, 0x4b, 0x08, 0xb1, 0x5b, 0x46, 0x20, 0x91, 0x41, 0x50, 0x00, + 0x3e, 0x50, 0x87, 0x18, 0x41, 0x50, 0x00, 0x3e, 0x50, 0x28, 0x3e, 0x00, + 0x00, 0x41, 0x00, 0x87, 0x18, 0x3e, 0x00, 0x00, 0x41, 0x00, 0x00, 0x43, + 0x50, 0x00, 0x40, 0x50, 0x8f, 0x00, 0x40, 0x00, 0x00, 0x43, 0x00, 0x00, + 0x40, 0x50, 0x00, 0x3d, 0x50, 0x87, 0x40, 0x3d, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x50, 0x00, 0x3d, 0x50, 0x87, 0x40, 0x3d, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x41, 0x50, 0x00, 0x3e, 0x50, 0x8b, 0x20, 0x3e, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x41, 0x50, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, + 0x00, 0x41, 0x00, 0x00, 0x40, 0x50, 0x00, 0x34, 0x50, 0x83, 0x60, 0x34, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x35, 0x50, 0x83, 0x60, + 0x35, 0x00, 0x00, 0x3e, 0x00, 0x83, 0x60, 0x39, 0x50, 0x00, 0x35, 0x50, + 0x83, 0x60, 0x35, 0x00, 0x00, 0x39, 0x00, 0x00, 0x40, 0x50, 0x00, 0x31, + 0x50, 0x83, 0x60, 0x31, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3e, 0x50, 0x00, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, 0x3e, 0x00, 0x83, 0x60, 0x41, + 0x50, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3c, 0x50, 0x81, + 0x70, 0x3c, 0x00, 0x00, 0x41, 0x00, 0x00, 0x43, 0x50, 0x00, 0x3a, 0x50, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x43, 0x00, 0x00, 0x41, 0x50, 0x00, 0x39, + 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x41, 0x00, 0x00, 0x3d, 0x50, 0x00, + 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x3e, 0x50, + 0x00, 0x35, 0x50, 0x83, 0x60, 0x35, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x41, + 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x41, 0x00, 0x00, + 0x40, 0x50, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x40, 0x00, + 0x96, 0x40, 0x41, 0x50, 0x00, 0x35, 0x50, 0x8b, 0x20, 0x35, 0x00, 0x00, + 0x35, 0x50, 0x83, 0x60, 0x35, 0x00, 0x00, 0x35, 0x50, 0x83, 0x60, 0x35, + 0x00, 0x00, 0x35, 0x50, 0x83, 0x60, 0x35, 0x00, 0x00, 0x35, 0x50, 0x83, + 0x60, 0x35, 0x00, 0x00, 0x41, 0x00, 0x00, 0x3c, 0x50, 0x00, 0x35, 0x50, + 0x83, 0x60, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x36, 0x50, 0x00, 0x39, + 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x36, 0x50, 0x83, 0x60, 0x36, 0x00, + 0x00, 0x36, 0x00, 0x00, 0x36, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x36, 0x00, 0x00, + 0x3c, 0x50, 0x00, 0x37, 0x50, 0x87, 0x40, 0x3c, 0x00, 0x00, 0x3b, 0x50, + 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x43, 0x50, 0x00, 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, + 0x00, 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, 0x50, 0x83, 0x60, + 0x37, 0x00, 0x00, 0x43, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x37, 0x50, 0x83, + 0x60, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3b, 0x50, 0x00, 0x38, 0x50, + 0x83, 0x60, 0x3b, 0x00, 0x00, 0x38, 0x50, 0x83, 0x60, 0x38, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x3b, 0x50, 0x00, 0x38, 0x50, 0x83, 0x60, 0x3b, 0x00, + 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x39, + 0x50, 0x00, 0x3c, 0x50, 0x85, 0x50, 0x3c, 0x00, 0x00, 0x39, 0x50, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3b, 0x50, 0x00, 0x3e, 0x50, + 0x85, 0x50, 0x3e, 0x00, 0x00, 0x3b, 0x50, 0x81, 0x70, 0x3b, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x3c, 0x50, 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, 0x00, + 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3e, + 0x50, 0x83, 0x60, 0x41, 0x50, 0x83, 0x60, 0x41, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, 0x39, + 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, + 0x34, 0x50, 0x87, 0x40, 0x34, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, + 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x00, 0x85, 0x50, + 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3b, 0x50, 0x81, 0x70, 0x3b, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, + 0x70, 0x38, 0x00, 0x00, 0x41, 0x50, 0x81, 0x70, 0x41, 0x00, 0x00, 0x3e, + 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, + 0x00, 0x3b, 0x50, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x3b, 0x50, + 0x81, 0x70, 0x3b, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x30, 0x50, 0x81, 0x70, 0x30, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, + 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x34, 0x50, 0x81, + 0x70, 0x34, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x34, + 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x28, 0x50, 0x81, 0x70, 0x28, 0x00, + 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, 0x50, 0x81, 0x70, + 0x30, 0x00, 0x00, 0x34, 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x30, 0x50, 0x81, 0x70, 0x30, 0x00, 0x00, 0x34, 0x50, 0x81, 0x70, 0x34, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x50, 0x83, + 0x60, 0x2d, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x3b, 0x50, 0x87, 0x40, 0x3b, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x3b, 0x50, 0x83, 0x60, + 0x3b, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x2c, 0x50, 0x81, 0x70, 0x2c, 0x00, + 0x00, 0x2f, 0x50, 0x81, 0x70, 0x2f, 0x00, 0x00, 0x34, 0x50, 0x81, 0x70, + 0x34, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x2c, 0x50, + 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2f, 0x50, 0x81, 0x70, 0x2f, 0x00, 0x00, + 0x34, 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x40, 0x50, 0x00, + 0x3c, 0x50, 0x87, 0x40, 0x3c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, + 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3e, + 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, 0x00, + 0x83, 0x60, 0x40, 0x50, 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, 0x3b, 0x50, 0x83, 0x60, 0x3b, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x40, 0x00, 0x81, 0x70, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x41, 0x50, + 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x50, 0x81, 0x70, 0x40, 0x00, 0x00, + 0x34, 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, + 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x39, 0x50, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x34, + 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x40, 0x50, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x34, 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x34, 0x50, 0x81, 0x70, + 0x34, 0x00, 0x00, 0x37, 0x50, 0x00, 0x34, 0x50, 0x87, 0x40, 0x34, 0x00, + 0x00, 0x37, 0x00, 0x00, 0x38, 0x50, 0x00, 0x35, 0x50, 0x87, 0x40, 0x35, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x37, 0x50, 0x87, 0x40, 0x37, 0x00, 0x00, + 0x30, 0x50, 0x81, 0x70, 0x30, 0x00, 0x00, 0x33, 0x50, 0x81, 0x70, 0x33, + 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3c, 0x50, 0x81, + 0x70, 0x3c, 0x00, 0x00, 0x30, 0x50, 0x81, 0x70, 0x30, 0x00, 0x00, 0x33, + 0x50, 0x81, 0x70, 0x33, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x30, 0x50, 0x83, 0x60, + 0x30, 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x83, 0x60, 0x3c, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x83, 0x60, + 0x3c, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x83, + 0x60, 0x3c, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x40, 0x50, 0x00, 0x3a, 0x50, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, 0x3a, + 0x50, 0x87, 0x40, 0x3a, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, + 0x3a, 0x50, 0x8b, 0x20, 0x3a, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3d, 0x50, + 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x3d, + 0x50, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x3d, 0x00, 0x00, + 0x40, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x3d, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3d, + 0x00, 0x00, 0x40, 0x50, 0x00, 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x37, 0x50, 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, 0x00, + 0x00, 0x37, 0x00, 0x00, 0x35, 0x50, 0x00, 0x41, 0x50, 0x83, 0x60, 0x41, + 0x00, 0x00, 0x35, 0x00, 0x00, 0x35, 0x50, 0x00, 0x41, 0x50, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x50, + 0x81, 0x70, 0x2d, 0x00, 0x00, 0x29, 0x50, 0x81, 0x70, 0x29, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x2b, 0x50, 0x00, 0x3f, 0x50, 0x81, 0x70, 0x2b, 0x00, + 0x00, 0x2e, 0x50, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x33, 0x50, 0x81, 0x70, + 0x33, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3f, 0x00, + 0x00, 0x2d, 0x50, 0x00, 0x3f, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, + 0x50, 0x81, 0x70, 0x30, 0x00, 0x00, 0x36, 0x50, 0x81, 0x70, 0x36, 0x00, + 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x2e, + 0x50, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3a, + 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x2d, 0x50, 0x00, + 0x3c, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, 0x50, 0x81, 0x70, 0x30, + 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x50, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x2b, 0x50, 0x00, 0x3a, 0x50, + 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, 0x50, 0x81, 0x70, 0x2e, 0x00, 0x00, + 0x33, 0x50, 0x81, 0x70, 0x33, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x2c, 0x50, 0x00, 0x41, 0x50, 0x81, 0x70, + 0x2c, 0x00, 0x00, 0x2f, 0x50, 0x81, 0x70, 0x2f, 0x00, 0x00, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x41, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, + 0x00, 0x41, 0x00, 0x00, 0x40, 0x50, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x39, 0x50, 0x85, 0x50, 0x39, 0x00, 0x00, + 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, + 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, + 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x50, + 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x50, 0x87, 0x40, 0x40, 0x00, 0x00, + 0x41, 0x50, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, + 0x00, 0x00, 0x40, 0x50, 0x87, 0x40, 0x40, 0x00, 0x00, 0x41, 0x50, 0x83, + 0x60, 0x41, 0x00, 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, 0x00, 0x00, 0x39, + 0x50, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, + 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x50, 0x83, + 0x60, 0x3a, 0x00, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, + 0x50, 0x87, 0x40, 0x40, 0x00, 0x00, 0x41, 0x50, 0x83, 0x60, 0x41, 0x00, + 0x00, 0x40, 0x50, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x50, 0x87, 0x40, + 0x40, 0x00, 0x00, 0x41, 0x50, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x50, + 0x83, 0x60, 0x40, 0x00, 0x00, 0x39, 0x50, 0x85, 0x50, 0x39, 0x00, 0x00, + 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x50, 0x81, + 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, + 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x38, 0x50, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x2e, 0x50, + 0x81, 0x70, 0x2e, 0x00, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x3a, 0x50, + 0x87, 0x40, 0x3a, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, + 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3e, 0x50, 0x00, + 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x50, + 0x00, 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3f, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x3f, 0x50, 0x00, 0x3c, 0x50, 0x81, 0x70, 0x3c, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0x3d, 0x50, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x3d, 0x00, 0x00, 0x40, 0x50, 0x00, 0x2d, 0x50, 0x83, 0x60, + 0x2d, 0x00, 0x00, 0x40, 0x00, 0x83, 0x60, 0x39, 0x50, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x39, 0x50, 0x83, 0x60, 0x39, + 0x00, 0x83, 0x60, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x31, 0x50, 0x81, 0x70, 0x31, 0x00, 0x00, + 0x3d, 0x50, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x31, 0x50, 0x81, + 0x70, 0x31, 0x00, 0x00, 0x3d, 0x50, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, + 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x31, 0x50, 0x81, 0x70, 0x31, 0x00, 0x00, 0x3d, 0x50, 0x81, 0x70, + 0x3d, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, + 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, + 0x81, 0x70, 0x3e, 0x00, 0x00, 0x35, 0x50, 0x83, 0x60, 0x35, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x35, 0x50, 0x87, 0x40, 0x35, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x35, 0x50, 0x83, 0x60, 0x35, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x41, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0x37, 0x50, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x37, + 0x00, 0x00, 0x34, 0x50, 0x83, 0x60, 0x34, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, + 0x70, 0x35, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, + 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x2e, 0x50, 0x83, 0x60, 0x2e, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x3a, 0x50, 0x87, 0x40, 0x3a, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x43, 0x50, 0x00, 0x3a, 0x50, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x43, + 0x00, 0x00, 0x3f, 0x50, 0x00, 0x37, 0x50, 0x83, 0x60, 0x37, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x2b, 0x50, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, 0x50, + 0x81, 0x70, 0x2e, 0x00, 0x00, 0x33, 0x50, 0x81, 0x70, 0x33, 0x00, 0x00, + 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, + 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, + 0x2d, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x81, 0x70, 0x39, + 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x41, 0x50, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x50, 0x81, 0x70, + 0x40, 0x00, 0x00, 0x3e, 0x50, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x50, + 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x34, 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x31, 0x50, 0x81, 0x70, 0x31, 0x00, 0x00, 0x34, + 0x50, 0x81, 0x70, 0x34, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x35, 0x50, 0x81, 0x70, 0x35, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x3a, 0x50, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x39, 0x50, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x50, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x39, 0x50, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, 0xff, 0x2f, 0x00, + 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x06, 0x8b, 0x00, 0xff, 0x21, 0x01, + 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x33, + 0x00, 0xc2, 0x39, 0x00, 0xb2, 0x07, 0x6a, 0x00, 0xb2, 0x0a, 0x2d, 0x0b, + 0xb2, 0x5b, 0x50, 0x1d, 0x92, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x83, 0x38, 0x4a, 0x50, 0x00, 0x3e, 0x50, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x87, 0x40, 0x3e, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x83, 0x60, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x39, 0x00, 0x87, 0x40, 0x3e, 0x50, 0x00, 0x45, 0x50, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, + 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, + 0x83, 0x60, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x3e, 0x00, 0x87, 0x40, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, + 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x83, 0x60, 0x4a, 0x50, + 0x00, 0x3e, 0x50, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x4a, + 0x50, 0x00, 0x43, 0x50, 0x83, 0x60, 0x43, 0x00, 0x00, 0x4a, 0x00, 0x00, + 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, + 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, + 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, + 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0xb0, 0x60, 0x3e, 0x50, + 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x4a, 0x00, 0xa1, 0x60, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, + 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, + 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x45, + 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x4c, 0x00, 0x83, 0x60, 0x4c, 0x50, + 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4c, 0x00, 0x83, 0x60, + 0x4c, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x4c, 0x00, + 0x83, 0x60, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x4a, 0x00, 0x83, 0x60, 0x4a, 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4a, + 0x50, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, + 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, 0x50, 0x81, 0x70, + 0x4a, 0x00, 0x00, 0x4a, 0x50, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4c, 0x50, + 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x4c, 0x00, 0xa9, 0x20, + 0x4c, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x4c, 0x00, + 0x83, 0x60, 0x4c, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x4c, 0x00, 0x83, 0x60, 0x4c, 0x50, 0x8f, 0x00, 0x4c, 0x00, 0x00, 0x4c, + 0x50, 0x83, 0x60, 0x4c, 0x00, 0x83, 0x60, 0x4c, 0x50, 0x83, 0x60, 0x4c, + 0x00, 0x83, 0x60, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x50, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x50, 0x78, 0x45, 0x00, 0x00, 0x45, 0x50, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x50, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x87, 0x40, 0x39, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, + 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x81, + 0xb7, 0x60, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x78, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x78, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x39, 0x00, 0xb8, 0x20, 0x39, 0x50, 0x00, 0x45, 0x50, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0xb8, 0x20, 0x39, 0x50, 0x00, + 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x9a, 0x20, 0x4a, + 0x50, 0x00, 0x3e, 0x50, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x8f, + 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x78, 0x45, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x78, 0x45, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, + 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x39, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, + 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, + 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x39, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, + 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x87, 0x40, 0x4a, 0x50, 0x00, + 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x8b, 0x20, 0x4a, + 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x8b, + 0x20, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, + 0x00, 0x8b, 0x20, 0x4c, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x4c, 0x00, 0x00, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, 0x60, 0x3e, + 0x00, 0x00, 0x4a, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x87, 0x40, + 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x8b, 0x20, 0x4a, 0x50, 0x00, 0x3e, + 0x50, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x9a, 0x20, 0x39, 0x50, + 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x3e, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x3e, 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x3e, 0x00, 0x9a, 0x20, 0x4a, 0x50, 0x00, 0x3e, 0x50, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x83, 0x60, 0x39, 0x50, 0x00, 0x45, + 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, 0x00, + 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x39, 0x50, + 0x00, 0x45, 0x50, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x00, 0x00, 0x3e, + 0x50, 0x00, 0x45, 0x50, 0x83, 0x60, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x20, 0x34, 0x00, 0xc3, 0x2f, 0x00, 0xb3, 0x07, 0x71, 0x00, 0xb3, + 0x0a, 0x40, 0x0e, 0xb3, 0x5b, 0x5a, 0x1a, 0x93, 0x32, 0x50, 0x83, 0x60, + 0x32, 0x00, 0x83, 0x38, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x87, 0x40, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, + 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, + 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, + 0x83, 0x60, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x87, 0x40, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, + 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, + 0x70, 0x32, 0x00, 0x83, 0x60, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, + 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, + 0x00, 0x87, 0x40, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x83, + 0x60, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, + 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, + 0x2d, 0x00, 0xb0, 0x60, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, + 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, + 0x32, 0x00, 0xa9, 0x20, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x83, 0x60, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x83, 0x60, 0x2d, 0x50, 0x83, 0x60, + 0x2d, 0x00, 0x83, 0x60, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x92, 0x60, + 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0xa9, 0x20, 0x2d, 0x50, 0x83, 0x60, + 0x2d, 0x00, 0x83, 0x60, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x83, 0x60, + 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, + 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x8b, 0x20, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, + 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, + 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x32, 0x50, + 0x83, 0x60, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x89, 0x30, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, + 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x81, + 0xb7, 0x60, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, + 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x83, 0x60, 0x2d, 0x00, 0xb8, 0x20, 0x2d, 0x50, 0x83, 0x60, 0x2d, + 0x00, 0xb8, 0x20, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x9a, 0x20, 0x32, + 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x78, 0x32, 0x00, 0x00, + 0x32, 0x50, 0x78, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x8f, 0x00, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, + 0x78, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, + 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, + 0x83, 0x60, 0x2d, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, + 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, + 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, + 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, + 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x32, 0x50, + 0x83, 0x60, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x87, 0x40, 0x32, 0x50, 0x83, 0x60, + 0x32, 0x00, 0x8b, 0x20, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x8b, 0x20, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x8b, 0x20, 0x2d, 0x50, 0x83, 0x60, + 0x2d, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, + 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x8b, 0x20, 0x32, 0x50, + 0x83, 0x60, 0x32, 0x00, 0x9a, 0x20, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, + 0x00, 0x32, 0x50, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x50, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x2d, 0x50, + 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x9a, 0x20, 0x32, 0x50, 0x83, 0x60, + 0x32, 0x00, 0x83, 0x60, 0x2d, 0x50, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x2d, + 0x50, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2d, 0x50, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x32, 0x50, 0x83, 0x60, 0x32, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x4d, + 0x54, 0x72, 0x6b, 0x00, 0x00, 0x15, 0x2d, 0x00, 0xff, 0x21, 0x01, 0x00, + 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x35, 0x00, + 0xc4, 0x30, 0x00, 0xb4, 0x07, 0x72, 0x00, 0xb4, 0x0a, 0x1e, 0x11, 0xb4, + 0x5b, 0x50, 0x17, 0x94, 0x4a, 0x5a, 0x50, 0x45, 0x5a, 0x28, 0x4a, 0x00, + 0x50, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x4c, 0x5a, 0x81, 0x70, 0x4c, 0x00, 0x00, 0x45, + 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x4d, 0x5a, 0x81, 0x70, 0x4d, 0x00, 0x00, 0x45, 0x5a, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x4a, 0x5a, 0x81, 0x70, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x83, + 0x60, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x51, 0x5a, 0x81, 0x70, 0x51, 0x00, 0x00, 0x51, + 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x85, 0x50, 0x51, 0x00, + 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, + 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, + 0x00, 0x56, 0x5a, 0x81, 0x70, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x83, 0x60, + 0x56, 0x00, 0x00, 0x56, 0x5a, 0x81, 0x70, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x81, 0x70, 0x56, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, + 0x5a, 0x78, 0x56, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, + 0x5a, 0x78, 0x55, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, + 0x5a, 0x78, 0x56, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x82, 0x68, 0x4d, 0x00, 0x00, + 0x4c, 0x5a, 0x3c, 0x4c, 0x00, 0x00, 0x4d, 0x5a, 0x3c, 0x4d, 0x00, 0x00, + 0x4c, 0x5a, 0x81, 0x70, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x81, 0x70, 0x51, + 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x49, + 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4b, + 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x50, + 0x5a, 0x78, 0x50, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x50, + 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x54, + 0x5a, 0x78, 0x54, 0x00, 0x00, 0x54, 0x5a, 0x78, 0x54, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4b, + 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4e, + 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x53, + 0x5a, 0x78, 0x53, 0x00, 0x00, 0x53, 0x5a, 0x78, 0x53, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x50, + 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x50, + 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x53, + 0x5a, 0x81, 0x70, 0x53, 0x00, 0x00, 0x47, 0x5a, 0x83, 0x60, 0x47, 0x00, + 0x00, 0x47, 0x5a, 0x83, 0x60, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x83, 0x60, + 0x47, 0x00, 0x00, 0x47, 0x5a, 0x81, 0x70, 0x47, 0x00, 0x00, 0x53, 0x5a, + 0x78, 0x53, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x53, 0x5a, + 0x78, 0x53, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x54, 0x5a, + 0x81, 0x70, 0x54, 0x00, 0x00, 0x48, 0x5a, 0x83, 0x60, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x83, 0x60, 0x48, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x3e, 0x5a, 0x00, 0x45, 0x5a, 0x00, 0x4d, 0x5a, + 0x83, 0x60, 0x4d, 0x00, 0x00, 0x45, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, + 0x5a, 0x81, 0x70, 0x51, 0x00, 0x00, 0x4c, 0x5a, 0x83, 0x60, 0x4c, 0x00, + 0x00, 0x4c, 0x5a, 0x85, 0x50, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, + 0x00, 0x00, 0x54, 0x5a, 0x78, 0x54, 0x00, 0x00, 0x58, 0x5a, 0x81, 0x70, + 0x58, 0x00, 0x00, 0x58, 0x5a, 0x83, 0x60, 0x58, 0x00, 0x00, 0x58, 0x5a, + 0x81, 0x70, 0x58, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, + 0x5a, 0x78, 0x56, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x54, 0x5a, 0x78, 0x54, 0x00, 0x00, 0x54, + 0x5a, 0x78, 0x54, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, + 0x5a, 0x78, 0x52, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x82, 0x68, 0x51, 0x00, 0x00, + 0x50, 0x5a, 0x3c, 0x50, 0x00, 0x00, 0x51, 0x5a, 0x3c, 0x51, 0x00, 0x00, + 0x50, 0x5a, 0x81, 0x70, 0x50, 0x00, 0x00, 0x4c, 0x5a, 0x83, 0x60, 0x4c, + 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x4c, 0x5a, 0x81, + 0x70, 0x4c, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, + 0x78, 0x50, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x37, 0x5a, 0x00, 0x3f, 0x5a, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x37, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x81, 0x70, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x81, 0x70, 0x48, 0x00, 0x00, 0x49, 0x5a, 0x81, 0x70, 0x49, 0x00, + 0x00, 0x49, 0x5a, 0x83, 0x60, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x83, 0x60, + 0x49, 0x00, 0x00, 0x49, 0x5a, 0x81, 0x70, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x4c, 0x5a, + 0x78, 0x4c, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, + 0x78, 0x4c, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x81, 0x70, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x81, 0x70, 0x49, 0x00, 0x00, + 0x4a, 0x5a, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x83, 0x60, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x81, + 0x70, 0x4a, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, + 0x78, 0x48, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, + 0x78, 0x47, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x83, 0x60, 0x3a, 0x00, + 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, + 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, + 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, + 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, + 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, + 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, + 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3a, 0x5a, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, 0x50, 0x5a, 0x78, 0x50, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, + 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, + 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, + 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, + 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, + 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x43, 0x5a, 0x78, + 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x46, 0x5a, 0x78, + 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x4a, 0x5a, 0x78, + 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4f, 0x5a, 0x81, + 0x70, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, + 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, + 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, + 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, + 0x4e, 0x5a, 0x78, 0x4e, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x81, 0x70, 0x51, 0x00, + 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, + 0x51, 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, + 0x51, 0x5a, 0x85, 0x50, 0x51, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, + 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, + 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x81, 0x70, 0x51, + 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x81, + 0x70, 0x51, 0x00, 0x81, 0x70, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, + 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, + 0x00, 0x00, 0x51, 0x5a, 0x83, 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x83, + 0x60, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, + 0x78, 0x55, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, + 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, + 0x78, 0x4c, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, + 0x78, 0x4c, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, + 0x78, 0x55, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, + 0x78, 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, + 0x78, 0x52, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, + 0x78, 0x52, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x57, 0x5a, 0x78, 0x57, 0x00, 0x00, 0x57, 0x5a, + 0x78, 0x57, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, + 0x78, 0x52, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, + 0x78, 0x4f, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4b, 0x5a, + 0x78, 0x4b, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, + 0x78, 0x52, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, + 0x78, 0x4f, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4b, 0x5a, + 0x78, 0x4b, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, + 0x78, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, + 0x78, 0x49, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, + 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x78, 0x4d, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, + 0x78, 0x4c, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, + 0x78, 0x56, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, + 0x78, 0x55, 0x00, 0x00, 0x56, 0x5a, 0x81, 0x70, 0x56, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x44, + 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x47, + 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4a, + 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x49, + 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x52, + 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x51, + 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x56, + 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x52, + 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x56, + 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x4c, + 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x55, + 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x56, + 0x5a, 0x83, 0x60, 0x56, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x14, 0x4d, + 0x00, 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x20, 0x36, 0x00, 0xc5, 0x30, 0x00, 0xb5, 0x07, 0x70, 0x00, + 0xb5, 0x0a, 0x32, 0x14, 0xb5, 0x5b, 0x50, 0x14, 0x95, 0x41, 0x5a, 0x50, + 0x41, 0x5a, 0x28, 0x41, 0x00, 0x50, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x43, 0x5a, 0x81, + 0x70, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x83, 0x60, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x43, 0x5a, 0x83, 0x60, 0x43, + 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, + 0x70, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, + 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, + 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x82, 0x68, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x3c, 0x49, 0x00, + 0x00, 0x4a, 0x5a, 0x3c, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x81, 0x70, 0x49, + 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, + 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, + 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, + 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, + 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, + 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, + 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, + 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, + 0x81, 0x70, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, + 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, + 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, + 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, + 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, + 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, + 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, 0x00, 0x00, 0x47, 0x5a, 0x78, 0x47, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, + 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, + 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x44, 0x5a, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x4c, 0x5a, 0x81, 0x70, + 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x4c, 0x5a, + 0x81, 0x70, 0x4c, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x48, 0x5a, 0x78, 0x48, 0x00, 0x00, 0x48, + 0x5a, 0x78, 0x48, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x48, 0x5a, 0x82, 0x68, 0x48, 0x00, 0x00, + 0x47, 0x5a, 0x3c, 0x47, 0x00, 0x00, 0x48, 0x5a, 0x3c, 0x48, 0x00, 0x00, + 0x47, 0x5a, 0x81, 0x70, 0x47, 0x00, 0x00, 0x44, 0x5a, 0x81, 0x70, 0x44, + 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x83, + 0x60, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x44, + 0x5a, 0x81, 0x70, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x81, 0x70, 0x44, 0x00, + 0x00, 0x44, 0x5a, 0x81, 0x70, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x81, 0x70, + 0x44, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3b, 0x5a, + 0x81, 0x70, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, + 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, + 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, + 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x83, + 0x60, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, + 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, + 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, + 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, + 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, + 0x5a, 0x78, 0x43, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x83, 0x60, 0x3a, + 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x45, 0x5a, 0x85, + 0x50, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x44, + 0x5a, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x5a, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x45, 0x5a, 0x85, 0x50, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x44, 0x5a, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x5a, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x83, 0x60, 0x3a, + 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x40, 0x5a, 0x85, + 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, + 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, + 0x40, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x5a, + 0x83, 0x60, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, + 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4f, 0x5a, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x43, 0x5a, 0x83, + 0x60, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, + 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, + 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x49, + 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, + 0x5a, 0x81, 0x70, 0x51, 0x00, 0x00, 0x49, 0x5a, 0x83, 0x60, 0x49, 0x00, + 0x00, 0x49, 0x5a, 0x81, 0x70, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x51, 0x5a, 0x81, 0x70, + 0x51, 0x00, 0x00, 0x4d, 0x5a, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4d, 0x5a, + 0x81, 0x70, 0x4d, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, + 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, + 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4d, 0x5a, 0x81, 0x70, 0x4d, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, + 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, 0x51, 0x5a, 0x78, 0x51, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x57, 0x5a, 0x78, 0x57, 0x00, 0x00, 0x57, 0x5a, 0x78, 0x57, 0x00, 0x00, + 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, + 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, 0x52, 0x5a, 0x78, 0x52, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, 0x4b, 0x5a, 0x78, 0x4b, 0x00, 0x00, + 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, + 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, + 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, 0x4f, 0x5a, 0x78, 0x4f, 0x00, 0x00, + 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, + 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, 0x56, 0x5a, 0x78, 0x56, 0x00, 0x00, + 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, + 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, 0x55, 0x5a, 0x78, 0x55, 0x00, 0x00, + 0x4a, 0x5a, 0x83, 0x60, 0x4a, 0x00, 0x81, 0x70, 0x41, 0x5a, 0x78, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, + 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, + 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, + 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, + 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, + 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, + 0x00, 0x00, 0x4a, 0x5a, 0x78, 0x4a, 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, + 0x00, 0x00, 0x4d, 0x5a, 0x78, 0x4d, 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, + 0x00, 0x00, 0x49, 0x5a, 0x78, 0x49, 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, + 0x00, 0x00, 0x4c, 0x5a, 0x78, 0x4c, 0x00, 0x00, 0x4a, 0x5a, 0x83, 0x60, + 0x4a, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0xff, 0x2f, + 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x10, 0xd2, 0x00, 0xff, 0x21, + 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, + 0x37, 0x00, 0xc6, 0x30, 0x00, 0xb6, 0x07, 0x70, 0x00, 0xb6, 0x0a, 0x5a, + 0x17, 0xb6, 0x5b, 0x50, 0x11, 0x96, 0x39, 0x5a, 0x50, 0x3e, 0x5a, 0x28, + 0x39, 0x00, 0x50, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, + 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x3a, 0x5a, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x40, 0x5a, + 0x83, 0x60, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, + 0x70, 0x41, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, + 0x3d, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, + 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, + 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, + 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x43, 0x5a, 0x81, + 0x70, 0x43, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x36, 0x5a, 0x78, 0x36, 0x00, 0x00, 0x36, 0x5a, + 0x78, 0x36, 0x00, 0x00, 0x36, 0x5a, 0x78, 0x36, 0x00, 0x00, 0x36, 0x5a, + 0x78, 0x36, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x78, 0x39, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, + 0x78, 0x43, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x38, 0x5a, + 0x78, 0x38, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x44, 0x5a, + 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, + 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, + 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, 0x78, 0x44, 0x00, 0x00, 0x44, 0x5a, + 0x78, 0x44, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x78, 0x41, 0x00, 0x00, 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3b, 0x5a, + 0x78, 0x3b, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x78, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x78, 0x3c, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x78, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x85, 0x50, + 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x42, 0x5a, 0x81, 0x70, 0x42, + 0x00, 0x00, 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, + 0x41, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x40, 0x5a, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, + 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x40, + 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, + 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x38, 0x5a, 0x78, 0x38, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3c, 0x5a, 0x81, + 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, + 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, + 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x83, 0x60, 0x3c, + 0x00, 0x81, 0x70, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, + 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, + 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x3b, + 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, + 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x37, 0x5a, 0x78, 0x37, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x37, 0x5a, 0x78, 0x37, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x81, 0x70, 0x3f, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, + 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x37, 0x5a, 0x78, 0x37, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x37, 0x5a, 0x78, 0x37, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, + 0x41, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, + 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, + 0x3a, 0x5a, 0x78, 0x3a, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, + 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, + 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, + 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, 0x42, 0x5a, 0x78, 0x42, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, 0x43, 0x5a, 0x78, 0x43, 0x00, 0x00, + 0x3c, 0x5a, 0x78, 0x3c, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, + 0x3a, 0x5a, 0x78, 0x3a, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, 0x3f, 0x5a, 0x78, 0x3f, 0x00, 0x00, + 0x3b, 0x5a, 0x78, 0x3b, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, + 0x39, 0x5a, 0x78, 0x39, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x78, 0x3d, 0x00, 0x00, + 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, + 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x83, + 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, + 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, + 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x83, 0x60, 0x3a, 0x00, + 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3d, 0x5a, 0x85, 0x50, + 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x5a, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x5a, 0x83, 0x60, 0x3d, 0x00, 0x00, + 0x3d, 0x5a, 0x85, 0x50, 0x3d, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, 0x3d, + 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x5a, 0x83, + 0x60, 0x3d, 0x00, 0x00, 0x39, 0x5a, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, + 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, + 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, + 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3f, 0x5a, + 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x5a, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x5a, 0x83, 0x60, 0x3d, 0x00, + 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x83, 0x60, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, + 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, + 0x5a, 0x78, 0x41, 0x00, 0x00, 0x41, 0x5a, 0x78, 0x41, 0x00, 0x00, 0x40, + 0x5a, 0x83, 0x60, 0x40, 0x00, 0x83, 0x60, 0x3e, 0x5a, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x78, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x78, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x78, 0x3e, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, + 0x40, 0x00, 0x00, 0x40, 0x5a, 0x78, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x41, + 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, + 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x4a, 0x5a, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x4a, 0x5a, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x35, + 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, + 0x41, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, + 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, + 0x70, 0x41, 0x00, 0x00, 0x46, 0x5a, 0x81, 0x70, 0x46, 0x00, 0x00, 0x34, + 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, + 0x40, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x45, 0x5a, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x45, 0x5a, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, + 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x4a, 0x5a, 0x81, 0x70, + 0x4a, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, + 0x81, 0x70, 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x4a, 0x5a, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, + 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, + 0x70, 0x41, 0x00, 0x00, 0x46, 0x5a, 0x81, 0x70, 0x46, 0x00, 0x00, 0x3a, + 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x46, 0x5a, 0x81, 0x70, + 0x46, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3a, 0x5a, + 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3f, 0x5a, 0x81, 0x70, 0x3f, 0x00, 0x00, + 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, + 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3f, 0x5a, 0x81, + 0x70, 0x3f, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, + 0x41, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x43, 0x5a, + 0x81, 0x70, 0x43, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, + 0x00, 0x81, 0x70, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, + 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, 0x41, + 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, + 0x3d, 0x00, 0x00, 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, + 0x78, 0x45, 0x00, 0x00, 0x45, 0x5a, 0x78, 0x45, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, + 0x78, 0x46, 0x00, 0x00, 0x46, 0x5a, 0x78, 0x46, 0x00, 0x00, 0x45, 0x5a, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x43, 0x5a, 0x81, 0x70, 0x43, 0x00, 0x00, + 0x45, 0x5a, 0x81, 0x70, 0x45, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x83, + 0x60, 0x32, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, + 0x00, 0x04, 0xa3, 0x00, 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x38, 0x00, 0xc7, 0x34, 0x00, 0xb7, + 0x07, 0x7f, 0x00, 0xb7, 0x0a, 0x32, 0x1a, 0xb7, 0x5b, 0x5a, 0x0e, 0x97, + 0x4a, 0x64, 0x87, 0x18, 0x45, 0x64, 0x28, 0x4a, 0x00, 0x87, 0x18, 0x45, + 0x00, 0x00, 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x87, 0x40, 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, + 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, + 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x83, 0x60, 0x4a, 0x64, + 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, 0x64, 0x81, 0x70, 0x4a, 0x00, 0x00, + 0x49, 0x64, 0x83, 0x60, 0x49, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, + 0x00, 0x83, 0x60, 0x4a, 0x64, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, 0x64, + 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, 0x00, + 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4a, 0x64, 0x85, 0x50, 0x4a, + 0x00, 0x00, 0x4a, 0x64, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4f, 0x64, 0x83, + 0x60, 0x4f, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, + 0x64, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, + 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, + 0x49, 0x00, 0x96, 0x40, 0x4d, 0x64, 0x8b, 0x20, 0x4d, 0x00, 0x00, 0x48, + 0x64, 0x83, 0x60, 0x48, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, 0x00, 0x00, 0x4b, 0x64, + 0x87, 0x40, 0x4b, 0x00, 0x00, 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, + 0x4f, 0x64, 0x8b, 0x20, 0x4f, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, + 0x00, 0x00, 0x47, 0x64, 0x83, 0x60, 0x47, 0x00, 0x00, 0x43, 0x64, 0x83, + 0x60, 0x43, 0x00, 0x00, 0x47, 0x64, 0x83, 0x60, 0x47, 0x00, 0x00, 0x4a, + 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4d, 0x64, 0x87, 0x40, 0x4d, 0x00, + 0x00, 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x87, 0x40, + 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4c, 0x64, + 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, + 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, + 0x00, 0x00, 0x47, 0x64, 0x87, 0x40, 0x47, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0xa9, 0x20, 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, + 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x83, 0x60, 0x4c, + 0x00, 0x00, 0x47, 0x64, 0x83, 0x60, 0x47, 0x00, 0x87, 0x40, 0x4c, 0x64, + 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x87, 0x40, 0x4c, 0x00, 0x00, + 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, + 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, + 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x4a, 0x64, + 0x83, 0x60, 0x4a, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, 0x00, 0x00, + 0x4c, 0x64, 0x85, 0x50, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x81, 0x70, 0x4c, + 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x48, 0x64, 0x83, + 0x60, 0x48, 0x00, 0x00, 0x46, 0x64, 0x83, 0x60, 0x46, 0x00, 0x00, 0x45, + 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, 0x00, 0x96, 0x40, 0x48, 0x64, 0x8b, + 0x20, 0x48, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x4b, + 0x64, 0x83, 0x60, 0x4b, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, 0x00, + 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, + 0x48, 0x00, 0x00, 0x48, 0x64, 0x83, 0x60, 0x48, 0x00, 0x00, 0x49, 0x64, + 0x83, 0x60, 0x49, 0x00, 0x00, 0x49, 0x64, 0x87, 0x40, 0x49, 0x00, 0x00, + 0x49, 0x64, 0x8b, 0x20, 0x49, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, 0x4f, + 0x00, 0x00, 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, 0x00, 0x49, 0x64, 0x83, + 0x60, 0x49, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x49, + 0x64, 0x83, 0x60, 0x49, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, 0x49, 0x00, + 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x4a, 0x64, 0x87, 0x40, + 0x4a, 0x00, 0x00, 0x4b, 0x64, 0x87, 0x40, 0x4b, 0x00, 0x00, 0x4e, 0x64, + 0x87, 0x40, 0x4e, 0x00, 0x00, 0x4f, 0x64, 0x87, 0x40, 0x4f, 0x00, 0x00, + 0x4d, 0x64, 0x87, 0x40, 0x4d, 0x00, 0x00, 0x4b, 0x64, 0x87, 0x40, 0x4b, + 0x00, 0x00, 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, 0x4a, 0x64, 0x83, + 0x60, 0x4a, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, 0x49, 0x00, 0x9e, 0x00, + 0x45, 0x64, 0x85, 0x50, 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x85, 0x50, 0x45, 0x00, 0x00, 0x45, + 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, 0x00, + 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x9e, 0x00, 0x4c, 0x64, 0x85, + 0x50, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x81, 0x70, 0x4c, 0x00, 0x00, 0x4d, + 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x64, 0x83, 0x60, 0x4c, 0x00, + 0x00, 0x4c, 0x64, 0x85, 0x50, 0x4c, 0x00, 0x00, 0x4c, 0x64, 0x81, 0x70, + 0x4c, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x64, + 0x83, 0x60, 0x4c, 0x00, 0x9e, 0x00, 0x4f, 0x64, 0x85, 0x50, 0x4f, 0x00, + 0x00, 0x4f, 0x64, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x4e, 0x64, 0x81, 0x70, + 0x4e, 0x00, 0x00, 0x4f, 0x64, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x4e, 0x64, + 0x81, 0x70, 0x4e, 0x00, 0x00, 0x4f, 0x64, 0x81, 0x70, 0x4f, 0x00, 0x00, + 0x4e, 0x64, 0x81, 0x70, 0x4e, 0x00, 0x00, 0x4f, 0x64, 0x81, 0x70, 0x4f, + 0x00, 0x00, 0x4e, 0x64, 0x81, 0x70, 0x4e, 0x00, 0x00, 0x4f, 0x64, 0x81, + 0x70, 0x4f, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, 0x4f, 0x00, 0x00, 0x49, + 0x64, 0x83, 0x60, 0x49, 0x00, 0x83, 0x60, 0x49, 0x64, 0x81, 0x70, 0x49, + 0x00, 0x00, 0x49, 0x64, 0x81, 0x70, 0x49, 0x00, 0x00, 0x4a, 0x64, 0x83, + 0x60, 0x4a, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, 0x49, 0x00, 0x00, 0x4a, + 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, 0x49, 0x00, + 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x49, 0x64, 0x83, 0x60, + 0x49, 0x00, 0x83, 0x60, 0x4a, 0x64, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4a, + 0x64, 0x81, 0x70, 0x4a, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, 0x4f, 0x00, + 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, + 0x4f, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4f, 0x64, + 0x83, 0x60, 0x4f, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x8b, + 0x20, 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, + 0x4a, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4a, 0x64, + 0x83, 0x60, 0x4a, 0x00, 0x8f, 0x00, 0x4f, 0x64, 0x85, 0x50, 0x4f, 0x00, + 0x00, 0x4f, 0x64, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, + 0x4f, 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x64, + 0x87, 0x40, 0x4c, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, + 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, + 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4a, 0x64, 0x83, + 0x60, 0x4a, 0x00, 0x8f, 0x00, 0x4f, 0x64, 0x85, 0x50, 0x4f, 0x00, 0x00, + 0x4f, 0x64, 0x81, 0x70, 0x4f, 0x00, 0x00, 0x4f, 0x64, 0x83, 0x60, 0x4f, + 0x00, 0x00, 0x4d, 0x64, 0x83, 0x60, 0x4d, 0x00, 0x00, 0x4c, 0x64, 0x87, + 0x40, 0x4c, 0x00, 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x04, 0xb3, 0x00, 0xff, + 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x07, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x20, 0x39, 0x00, 0xc8, 0x34, 0x00, 0xb8, 0x07, 0x7f, 0x00, 0xb8, 0x0a, + 0x3c, 0x1d, 0xb8, 0x5b, 0x5a, 0x0b, 0x98, 0x45, 0x64, 0x87, 0x18, 0x45, + 0x64, 0x28, 0x45, 0x00, 0x87, 0x18, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x87, 0x40, + 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x45, 0x64, 0x87, 0x40, 0x45, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x83, 0x60, 0x45, 0x64, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, + 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x46, 0x64, 0x83, 0x60, 0x46, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x96, 0x40, + 0x45, 0x64, 0x8b, 0x20, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x3c, 0x64, 0x83, + 0x60, 0x3c, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x45, + 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x48, 0x64, 0x87, 0x40, 0x48, 0x00, + 0x00, 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x3e, 0x64, 0x8b, 0x20, + 0x3e, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x3e, 0x64, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x47, 0x64, 0x83, 0x60, 0x47, + 0x00, 0x00, 0x4a, 0x64, 0x87, 0x40, 0x4a, 0x00, 0x00, 0x47, 0x64, 0x87, + 0x40, 0x47, 0x00, 0x00, 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x44, + 0x64, 0x87, 0x40, 0x44, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x48, 0x64, 0x87, 0x40, 0x48, 0x00, 0x00, 0x47, 0x64, 0x81, 0x70, + 0x47, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x44, 0x64, + 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0xa9, 0x20, 0x48, 0x64, + 0x87, 0x40, 0x48, 0x00, 0x00, 0x48, 0x64, 0x87, 0x40, 0x48, 0x00, 0x00, + 0x47, 0x64, 0x83, 0x60, 0x47, 0x00, 0x00, 0x47, 0x64, 0x83, 0x60, 0x47, + 0x00, 0x87, 0x40, 0x47, 0x64, 0x87, 0x40, 0x47, 0x00, 0x00, 0x47, 0x64, + 0x87, 0x40, 0x47, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x83, + 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, + 0x45, 0x00, 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x64, + 0x83, 0x60, 0x45, 0x00, 0x83, 0x60, 0x40, 0x64, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x40, 0x64, 0x81, 0x70, 0x40, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x41, 0x64, + 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, + 0x00, 0x96, 0x40, 0x43, 0x64, 0x8b, 0x20, 0x43, 0x00, 0x00, 0x43, 0x64, + 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, + 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, + 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x64, 0x87, + 0x40, 0x43, 0x00, 0x00, 0x43, 0x64, 0x87, 0x40, 0x43, 0x00, 0x00, 0x43, + 0x64, 0x8b, 0x20, 0x43, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, + 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, + 0x43, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x45, 0x64, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x46, 0x64, 0x87, 0x40, 0x46, + 0x00, 0x00, 0x48, 0x64, 0x85, 0x50, 0x48, 0x00, 0x00, 0x45, 0x64, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x43, 0x64, 0x87, 0x40, 0x43, 0x00, 0x00, 0x45, + 0x64, 0x87, 0x40, 0x45, 0x00, 0x00, 0x46, 0x64, 0x87, 0x40, 0x46, 0x00, + 0x00, 0x47, 0x64, 0x87, 0x40, 0x47, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x9e, 0x00, 0x40, + 0x64, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x64, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x40, 0x64, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x64, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x9e, 0x00, 0x45, 0x64, 0x85, 0x50, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x44, 0x64, + 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x85, 0x50, 0x45, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x44, 0x64, 0x83, 0x60, 0x44, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x9e, 0x00, 0x43, 0x64, 0x85, 0x50, 0x43, 0x00, 0x00, + 0x43, 0x64, 0x81, 0x70, 0x43, 0x00, 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, + 0x00, 0x00, 0x46, 0x64, 0x81, 0x70, 0x46, 0x00, 0x00, 0x45, 0x64, 0x81, + 0x70, 0x45, 0x00, 0x00, 0x46, 0x64, 0x81, 0x70, 0x46, 0x00, 0x00, 0x45, + 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x46, 0x64, 0x81, 0x70, 0x46, 0x00, + 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x46, 0x64, 0x81, 0x70, + 0x46, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x45, 0x64, + 0x83, 0x60, 0x45, 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, + 0x00, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, + 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, + 0x00, 0x83, 0x60, 0x45, 0x64, 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, + 0x81, 0x70, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, + 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, + 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x8b, 0x20, + 0x41, 0x64, 0x87, 0x40, 0x41, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x41, 0x64, 0x83, + 0x60, 0x41, 0x00, 0x8f, 0x00, 0x46, 0x64, 0x85, 0x50, 0x46, 0x00, 0x00, + 0x46, 0x64, 0x81, 0x70, 0x46, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, + 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x87, + 0x40, 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x41, + 0x64, 0x87, 0x40, 0x41, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, + 0x00, 0x4a, 0x64, 0x83, 0x60, 0x4a, 0x00, 0x00, 0x46, 0x64, 0x83, 0x60, + 0x46, 0x00, 0x8f, 0x00, 0x46, 0x64, 0x85, 0x50, 0x46, 0x00, 0x00, 0x46, + 0x64, 0x81, 0x70, 0x46, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, + 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0x45, 0x64, 0x87, 0x40, + 0x45, 0x00, 0x00, 0x45, 0x64, 0x83, 0x60, 0x45, 0x00, 0x00, 0xff, 0x2f, + 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x04, 0xd0, 0x00, 0xff, 0x21, + 0x01, 0x00, 0x00, 0xff, 0x03, 0x08, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, + 0x31, 0x30, 0x00, 0xca, 0x34, 0x00, 0xba, 0x07, 0x7f, 0x00, 0xba, 0x0a, + 0x46, 0x20, 0xba, 0x5b, 0x5a, 0x08, 0x9a, 0x41, 0x64, 0x87, 0x18, 0x41, + 0x64, 0x28, 0x41, 0x00, 0x87, 0x18, 0x41, 0x00, 0x00, 0x43, 0x64, 0x83, + 0x60, 0x43, 0x00, 0x00, 0x43, 0x64, 0x83, 0x60, 0x43, 0x00, 0x87, 0x40, + 0x43, 0x64, 0x87, 0x40, 0x43, 0x00, 0x00, 0x43, 0x64, 0x87, 0x40, 0x43, + 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x64, 0x83, + 0x60, 0x41, 0x00, 0x83, 0x60, 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, 0x00, + 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, + 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x83, 0x60, 0x39, 0x64, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, + 0x00, 0x83, 0x60, 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, 0x00, 0x41, 0x64, + 0x81, 0x70, 0x41, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, + 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x64, 0x83, + 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x96, 0x40, + 0x3c, 0x64, 0x8b, 0x20, 0x3c, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, + 0x00, 0x00, 0x41, 0x64, 0x8b, 0x20, 0x41, 0x00, 0x00, 0x3c, 0x64, 0x83, + 0x60, 0x3c, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x36, + 0x64, 0x83, 0x60, 0x36, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, + 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x87, 0x40, + 0x3c, 0x00, 0x00, 0x3b, 0x64, 0x87, 0x40, 0x3b, 0x00, 0x00, 0x43, 0x64, + 0x8b, 0x20, 0x43, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x3b, 0x64, 0x83, 0x60, 0x3b, 0x00, 0x00, 0x38, 0x64, 0x83, 0x60, 0x38, + 0x00, 0x00, 0x3b, 0x64, 0x83, 0x60, 0x3b, 0x00, 0x00, 0x3e, 0x64, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x3c, 0x64, 0x85, 0x50, 0x3c, 0x00, 0x00, 0x39, + 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x85, 0x50, 0x3e, 0x00, + 0x00, 0x3b, 0x64, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x83, 0x60, 0x41, + 0x64, 0x81, 0x70, 0x41, 0x00, 0x00, 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, + 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x40, 0x64, 0x87, 0x40, 0x40, 0x00, 0x00, 0x40, 0x64, + 0x83, 0x60, 0x40, 0x00, 0xa9, 0x20, 0x40, 0x64, 0x87, 0x40, 0x40, 0x00, + 0x00, 0x40, 0x64, 0x87, 0x40, 0x40, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x87, 0x40, 0x3e, + 0x64, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x87, 0x40, 0x3e, 0x00, + 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, + 0x3c, 0x00, 0x83, 0x60, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, + 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x83, 0x60, 0x40, 0x64, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x64, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, + 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, + 0x83, 0x60, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3b, 0x64, 0x81, + 0x70, 0x3b, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3c, + 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, + 0x3c, 0x00, 0x00, 0x3b, 0x64, 0x83, 0x60, 0x3b, 0x00, 0x96, 0x40, 0x3f, + 0x64, 0x8b, 0x20, 0x3f, 0x00, 0x00, 0x3f, 0x64, 0x83, 0x60, 0x3f, 0x00, + 0x00, 0x3f, 0x64, 0x83, 0x60, 0x3f, 0x00, 0x00, 0x3f, 0x64, 0x83, 0x60, + 0x3f, 0x00, 0x00, 0x3f, 0x64, 0x83, 0x60, 0x3f, 0x00, 0x00, 0x3f, 0x64, + 0x83, 0x60, 0x3f, 0x00, 0x00, 0x3f, 0x64, 0x83, 0x60, 0x3f, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x64, 0x87, 0x40, 0x40, + 0x00, 0x00, 0x40, 0x64, 0x8b, 0x20, 0x40, 0x00, 0x00, 0x3d, 0x64, 0x83, + 0x60, 0x3d, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x40, + 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, + 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x41, 0x64, + 0x87, 0x40, 0x41, 0x00, 0x00, 0x3f, 0x64, 0x87, 0x40, 0x3f, 0x00, 0x00, + 0x3f, 0x64, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x3e, 0x64, 0x87, 0x40, 0x3e, + 0x00, 0x00, 0x3c, 0x64, 0x87, 0x40, 0x3c, 0x00, 0x00, 0x3a, 0x64, 0x87, + 0x40, 0x3a, 0x00, 0x00, 0x41, 0x64, 0x87, 0x40, 0x41, 0x00, 0x00, 0x41, + 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, + 0x9e, 0x00, 0x3d, 0x64, 0x85, 0x50, 0x3d, 0x00, 0x00, 0x3d, 0x64, 0x81, + 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, + 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x3d, 0x64, 0x85, 0x50, 0x3d, 0x00, + 0x00, 0x3d, 0x64, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x9e, 0x00, 0x3d, + 0x64, 0x85, 0x50, 0x3d, 0x00, 0x00, 0x3d, 0x64, 0x81, 0x70, 0x3d, 0x00, + 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, + 0x3d, 0x00, 0x00, 0x3d, 0x64, 0x85, 0x50, 0x3d, 0x00, 0x00, 0x3d, 0x64, + 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x9e, 0x00, 0x3e, 0x64, 0x85, 0x50, + 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3f, 0x64, + 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x3f, 0x64, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x3f, 0x64, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, 0x64, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x3f, 0x64, 0x81, 0x70, 0x3f, 0x00, 0x00, 0x3e, + 0x64, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, + 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x83, 0x60, 0x40, 0x64, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x64, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, + 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, + 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x64, + 0x83, 0x60, 0x40, 0x00, 0x83, 0x60, 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, + 0x00, 0x41, 0x64, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x64, 0x83, 0x60, + 0x40, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x40, 0x64, + 0x83, 0x60, 0x40, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, + 0x00, 0x9a, 0x20, 0x3e, 0x64, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x3e, 0x64, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x41, 0x64, 0x83, 0x60, 0x41, 0x00, 0x00, + 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x85, 0x50, 0x3e, + 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, + 0x60, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, + 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, + 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x8f, 0x00, 0x3e, 0x64, 0x87, + 0x40, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x43, + 0x64, 0x83, 0x60, 0x43, 0x00, 0x00, 0x3f, 0x64, 0x83, 0x60, 0x3f, 0x00, + 0x00, 0x3f, 0x64, 0x85, 0x50, 0x3f, 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, + 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x3e, 0x64, + 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, + 0x00, 0x00, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x05, + 0x30, 0x00, 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, 0x03, 0x08, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x20, 0x31, 0x31, 0x00, 0xcb, 0x34, 0x00, 0xbb, 0x07, + 0x7f, 0x00, 0xbb, 0x0a, 0x50, 0x23, 0xbb, 0x5b, 0x5a, 0x05, 0x9b, 0x3e, + 0x64, 0x87, 0x18, 0x3e, 0x64, 0x28, 0x3e, 0x00, 0x87, 0x18, 0x3e, 0x00, + 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, + 0x3e, 0x00, 0x87, 0x40, 0x3d, 0x64, 0x87, 0x40, 0x3d, 0x00, 0x00, 0x3d, + 0x64, 0x87, 0x40, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x83, 0x60, 0x32, 0x64, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x32, 0x64, 0x81, 0x70, 0x32, 0x00, 0x00, 0x34, + 0x64, 0x83, 0x60, 0x34, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, + 0x83, 0x60, 0x35, 0x64, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x64, 0x81, + 0x70, 0x35, 0x00, 0x00, 0x31, 0x64, 0x83, 0x60, 0x31, 0x00, 0x00, 0x32, + 0x64, 0x83, 0x60, 0x32, 0x00, 0x83, 0x60, 0x3e, 0x64, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, 0x64, 0x83, + 0x60, 0x3a, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x37, + 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x32, 0x64, 0x83, 0x60, 0x32, 0x00, + 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, + 0x39, 0x00, 0x96, 0x40, 0x35, 0x64, 0x8b, 0x20, 0x35, 0x00, 0x00, 0x35, + 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, + 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, + 0x35, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x36, 0x64, + 0x87, 0x40, 0x36, 0x00, 0x00, 0x36, 0x64, 0x87, 0x40, 0x36, 0x00, 0x00, + 0x37, 0x64, 0x8b, 0x20, 0x37, 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, + 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, 0x64, 0x83, + 0x60, 0x37, 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, + 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x38, 0x64, 0x87, 0x40, 0x38, 0x00, + 0x00, 0x38, 0x64, 0x87, 0x40, 0x38, 0x00, 0x00, 0x39, 0x64, 0x87, 0x40, + 0x39, 0x00, 0x00, 0x3b, 0x64, 0x87, 0x40, 0x3b, 0x00, 0x00, 0x3c, 0x64, + 0x87, 0x40, 0x3c, 0x00, 0x00, 0x3e, 0x64, 0x87, 0x40, 0x3e, 0x00, 0x00, + 0x40, 0x64, 0x83, 0x60, 0x40, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x34, 0x64, 0x87, 0x40, 0x34, 0x00, 0x00, 0x39, 0x64, 0x83, + 0x60, 0x39, 0x00, 0xa9, 0x20, 0x39, 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, + 0x39, 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, + 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x87, 0x40, 0x38, 0x64, + 0x87, 0x40, 0x38, 0x00, 0x00, 0x38, 0x64, 0x87, 0x40, 0x38, 0x00, 0x00, + 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, + 0x00, 0x83, 0x60, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x64, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x83, 0x60, 0x3c, 0x64, 0x81, 0x70, + 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3b, 0x64, + 0x83, 0x60, 0x3b, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x83, + 0x60, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x64, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x34, 0x64, + 0x83, 0x60, 0x34, 0x00, 0x00, 0x32, 0x64, 0x83, 0x60, 0x32, 0x00, 0x00, + 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x34, 0x64, 0x83, 0x60, 0x34, + 0x00, 0x00, 0x34, 0x64, 0x83, 0x60, 0x34, 0x00, 0x96, 0x40, 0x3c, 0x64, + 0x8b, 0x20, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, + 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, + 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, + 0x60, 0x3c, 0x00, 0x00, 0x3c, 0x64, 0x83, 0x60, 0x3c, 0x00, 0x00, 0x3a, + 0x64, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x3a, 0x64, 0x87, 0x40, 0x3a, 0x00, + 0x00, 0x3a, 0x64, 0x8b, 0x20, 0x3a, 0x00, 0x00, 0x3a, 0x64, 0x83, 0x60, + 0x3a, 0x00, 0x00, 0x3a, 0x64, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x64, + 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, + 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x35, 0x64, 0x87, + 0x40, 0x35, 0x00, 0x00, 0x37, 0x64, 0x87, 0x40, 0x37, 0x00, 0x00, 0x39, + 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, 0x3a, 0x64, 0x87, 0x40, 0x3a, 0x00, + 0x00, 0x39, 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, 0x37, 0x64, 0x87, 0x40, + 0x37, 0x00, 0x00, 0x38, 0x64, 0x87, 0x40, 0x38, 0x00, 0x00, 0x39, 0x64, + 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x39, 0x64, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x64, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, + 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, + 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x64, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x9e, + 0x00, 0x39, 0x64, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x64, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, 0x00, + 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, + 0x70, 0x38, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, + 0x64, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, + 0x9e, 0x00, 0x39, 0x64, 0x85, 0x50, 0x39, 0x00, 0x00, 0x39, 0x64, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, + 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, 0x38, 0x00, + 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x64, + 0x81, 0x70, 0x38, 0x00, 0x00, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x3a, 0x64, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x2e, 0x64, 0x83, 0x60, 0x2e, + 0x00, 0x00, 0x3a, 0x64, 0x85, 0x50, 0x3a, 0x00, 0x00, 0x3a, 0x64, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, + 0x64, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x64, 0x81, 0x70, 0x3c, 0x00, + 0x00, 0x3a, 0x64, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x64, 0x81, 0x70, + 0x3c, 0x00, 0x00, 0x3a, 0x64, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x64, + 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, 0x64, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, + 0x00, 0x83, 0x60, 0x39, 0x64, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x64, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, + 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, + 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x83, 0x60, + 0x3e, 0x64, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3e, 0x64, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x3e, 0x64, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, 0x00, 0x3e, + 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3d, 0x64, 0x83, 0x60, 0x3d, 0x00, + 0x00, 0x3e, 0x64, 0x83, 0x60, 0x3e, 0x00, 0x9a, 0x20, 0x35, 0x64, 0x87, + 0x40, 0x35, 0x00, 0x00, 0x35, 0x64, 0x83, 0x60, 0x35, 0x00, 0x00, 0x3e, + 0x64, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3a, 0x64, 0x83, 0x60, 0x3a, 0x00, + 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x34, 0x64, 0x83, 0x60, + 0x34, 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x32, 0x64, + 0x83, 0x60, 0x32, 0x00, 0x00, 0x39, 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, + 0x32, 0x64, 0x83, 0x60, 0x32, 0x00, 0x8f, 0x00, 0x3a, 0x64, 0x87, 0x40, + 0x3a, 0x00, 0x00, 0x3a, 0x64, 0x83, 0x60, 0x3a, 0x00, 0x00, 0x3a, 0x64, + 0x83, 0x60, 0x3a, 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, + 0x37, 0x64, 0x83, 0x60, 0x37, 0x00, 0x00, 0x37, 0x64, 0x83, 0x60, 0x37, + 0x00, 0x00, 0x39, 0x64, 0x83, 0x60, 0x39, 0x00, 0x00, 0x3e, 0x64, 0x83, + 0x60, 0x3e, 0x00, 0x00, 0x39, 0x64, 0x87, 0x40, 0x39, 0x00, 0x00, 0x32, + 0x64, 0x83, 0x60, 0x32, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, + 0x6b, 0x00, 0x00, 0x0c, 0xf9, 0x00, 0xff, 0x21, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x08, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x31, 0x32, 0x00, 0xcc, + 0x30, 0x00, 0xbc, 0x07, 0x78, 0x00, 0xbc, 0x0a, 0x6e, 0x26, 0xbc, 0x5b, + 0x50, 0x02, 0x9c, 0x32, 0x5a, 0x81, 0x48, 0x35, 0x5a, 0x28, 0x32, 0x00, + 0x81, 0x48, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, + 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, + 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, + 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x31, 0x5a, + 0x81, 0x70, 0x31, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, 0x3d, + 0x00, 0x00, 0x31, 0x5a, 0x81, 0x70, 0x31, 0x00, 0x00, 0x34, 0x5a, 0x81, + 0x70, 0x34, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3d, + 0x5a, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, + 0x3e, 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x32, 0x5a, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x34, 0x5a, 0x83, 0x60, 0x34, 0x00, 0x00, + 0x35, 0x5a, 0x83, 0x60, 0x35, 0x00, 0x83, 0x60, 0x35, 0x5a, 0x83, 0x60, + 0x35, 0x00, 0x00, 0x31, 0x5a, 0x83, 0x60, 0x31, 0x00, 0x00, 0x32, 0x5a, + 0x83, 0x60, 0x32, 0x00, 0x81, 0x70, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, + 0x3c, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x2e, 0x5a, + 0x81, 0x70, 0x2e, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, + 0x00, 0x00, 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x32, 0x5a, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3a, 0x5a, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x3c, + 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, + 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, + 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, + 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, + 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, + 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, + 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, + 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x36, 0x5a, 0x81, 0x70, 0x36, + 0x00, 0x00, 0x2a, 0x5a, 0x81, 0x70, 0x2a, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x30, 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x36, + 0x5a, 0x81, 0x70, 0x36, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x36, 0x5a, 0x81, 0x70, + 0x36, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, + 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, + 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, + 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2f, 0x5a, 0x81, + 0x70, 0x2f, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x38, + 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, 0x5a, + 0x81, 0x70, 0x30, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2f, 0x5a, 0x81, 0x70, 0x2f, + 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x38, 0x5a, 0x81, + 0x70, 0x38, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x30, + 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, + 0x3c, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, + 0x81, 0x70, 0x35, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, + 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, + 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x40, + 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, + 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, + 0x34, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x85, 0x50, 0x3c, + 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x3e, 0x5a, + 0x81, 0x70, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, + 0x3b, 0x5a, 0x81, 0x70, 0x3b, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x3b, 0x5a, 0x81, + 0x70, 0x3b, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x30, + 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, + 0x34, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x34, 0x5a, + 0x81, 0x70, 0x34, 0x00, 0x00, 0x28, 0x5a, 0x81, 0x70, 0x28, 0x00, 0x00, + 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, 0x5a, 0x81, 0x70, 0x30, + 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, + 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, + 0x2d, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x5a, + 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, + 0x00, 0x00, 0x2f, 0x5a, 0x81, 0x70, 0x2f, 0x00, 0x00, 0x34, 0x5a, 0x81, + 0x70, 0x34, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, 0x2c, + 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2f, 0x5a, 0x81, 0x70, 0x2f, 0x00, + 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, + 0x38, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x5a, + 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x3e, 0x5a, 0x83, 0x60, 0x3e, 0x00, 0x00, 0x3c, 0x5a, 0x83, + 0x60, 0x3c, 0x00, 0x83, 0x60, 0x3c, 0x5a, 0x83, 0x60, 0x3c, 0x00, 0x00, + 0x3b, 0x5a, 0x83, 0x60, 0x3b, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, 0x39, + 0x00, 0x81, 0x70, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x5a, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, + 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x34, 0x5a, 0x81, + 0x70, 0x34, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, + 0x34, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x34, 0x5a, + 0x81, 0x70, 0x34, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, + 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, + 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x34, 0x5a, 0x81, + 0x70, 0x34, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, + 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, + 0x30, 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x33, 0x5a, 0x81, 0x70, 0x33, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3c, 0x5a, 0x81, + 0x70, 0x3c, 0x00, 0x00, 0x30, 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x33, + 0x5a, 0x81, 0x70, 0x33, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x30, 0x5a, 0x81, 0x70, + 0x30, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, + 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, + 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, + 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, + 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3c, + 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, + 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, + 0x2e, 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x3a, 0x5a, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x34, + 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, + 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x39, 0x5a, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, + 0x70, 0x37, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x37, + 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, + 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x5a, + 0x81, 0x70, 0x2d, 0x00, 0x00, 0x29, 0x5a, 0x81, 0x70, 0x29, 0x00, 0x00, + 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, 0x2e, + 0x00, 0x00, 0x33, 0x5a, 0x81, 0x70, 0x33, 0x00, 0x00, 0x37, 0x5a, 0x81, + 0x70, 0x37, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, + 0x5a, 0x81, 0x70, 0x30, 0x00, 0x00, 0x36, 0x5a, 0x81, 0x70, 0x36, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, + 0x2e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x30, 0x5a, 0x81, 0x70, 0x30, + 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, + 0x70, 0x39, 0x00, 0x00, 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, + 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x33, 0x5a, 0x81, 0x70, 0x33, 0x00, + 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, + 0x2c, 0x00, 0x00, 0x2f, 0x5a, 0x81, 0x70, 0x2f, 0x00, 0x00, 0x32, 0x5a, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x38, 0x5a, 0x81, 0x70, 0x38, 0x00, 0x00, + 0x39, 0x5a, 0x83, 0x60, 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x83, 0x60, 0x2d, + 0x00, 0x00, 0x2d, 0x5a, 0x85, 0x50, 0x2d, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, + 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, + 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, + 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, + 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x2e, 0x5a, 0x83, 0x60, 0x2e, 0x00, 0x00, 0x2d, 0x5a, 0x83, 0x60, 0x2d, + 0x00, 0x00, 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, + 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, + 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, + 0x41, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x2d, 0x5a, + 0x85, 0x50, 0x2d, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, + 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, + 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2e, 0x5a, 0x83, 0x60, + 0x2e, 0x00, 0x00, 0x2d, 0x5a, 0x83, 0x60, 0x2d, 0x00, 0x00, 0x40, 0x5a, + 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, 0x70, 0x40, 0x00, 0x00, + 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, 0x5a, 0x83, 0x60, 0x40, + 0x00, 0x00, 0x40, 0x5a, 0x85, 0x50, 0x40, 0x00, 0x00, 0x40, 0x5a, 0x81, + 0x70, 0x40, 0x00, 0x00, 0x41, 0x5a, 0x83, 0x60, 0x41, 0x00, 0x00, 0x40, + 0x5a, 0x83, 0x60, 0x40, 0x00, 0x00, 0x2d, 0x5a, 0x85, 0x50, 0x2d, 0x00, + 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, + 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x2c, 0x5a, + 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, + 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x2c, 0x5a, 0x81, 0x70, 0x2c, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x2e, + 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, + 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, + 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, + 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, 0x5a, 0x81, + 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, 0x00, 0x3a, + 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x3c, 0x5a, 0x81, 0x70, 0x3c, 0x00, + 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x39, 0x5a, 0x83, 0x60, + 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x83, 0x60, 0x2d, 0x00, 0x83, 0x60, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x5a, + 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, + 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x39, + 0x5a, 0x83, 0x60, 0x39, 0x00, 0x83, 0x60, 0x3e, 0x5a, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x31, 0x5a, 0x81, + 0x70, 0x31, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, + 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, + 0x00, 0x31, 0x5a, 0x81, 0x70, 0x31, 0x00, 0x00, 0x3d, 0x5a, 0x81, 0x70, + 0x3d, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, + 0x81, 0x70, 0x32, 0x00, 0x00, 0x31, 0x5a, 0x81, 0x70, 0x31, 0x00, 0x00, + 0x3d, 0x5a, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x35, 0x5a, 0x81, + 0x70, 0x35, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, + 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, + 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, + 0x81, 0x70, 0x3e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, + 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, 0x29, 0x5a, 0x81, + 0x70, 0x29, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x32, + 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, + 0x00, 0x29, 0x5a, 0x81, 0x70, 0x29, 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, + 0x2d, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, + 0x81, 0x70, 0x35, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, + 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x28, 0x5a, 0x81, + 0x70, 0x28, 0x00, 0x00, 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, + 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, + 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, + 0x39, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, + 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, + 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, + 0x00, 0x00, 0x2d, 0x5a, 0x81, 0x70, 0x2d, 0x00, 0x00, 0x32, 0x5a, 0x81, + 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x39, + 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, + 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, + 0x35, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, + 0x81, 0x70, 0x3e, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, + 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, + 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, 0x2e, 0x5a, 0x81, + 0x70, 0x2e, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, + 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, + 0x00, 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, 0x2e, 0x5a, 0x81, 0x70, + 0x2e, 0x00, 0x00, 0x33, 0x5a, 0x81, 0x70, 0x33, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x2b, 0x5a, 0x81, 0x70, 0x2b, 0x00, 0x00, + 0x2e, 0x5a, 0x81, 0x70, 0x2e, 0x00, 0x00, 0x33, 0x5a, 0x81, 0x70, 0x33, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x32, + 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, + 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, + 0x37, 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x5a, + 0x81, 0x70, 0x2d, 0x00, 0x00, 0x32, 0x5a, 0x83, 0x60, 0x32, 0x00, 0x81, + 0x70, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, + 0x3e, 0x00, 0x00, 0x41, 0x5a, 0x81, 0x70, 0x41, 0x00, 0x00, 0x40, 0x5a, + 0x81, 0x70, 0x40, 0x00, 0x00, 0x3e, 0x5a, 0x81, 0x70, 0x3e, 0x00, 0x00, + 0x3d, 0x5a, 0x81, 0x70, 0x3d, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, + 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, 0x00, 0x00, 0x35, 0x5a, 0x81, + 0x70, 0x35, 0x00, 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x32, + 0x5a, 0x81, 0x70, 0x32, 0x00, 0x00, 0x31, 0x5a, 0x81, 0x70, 0x31, 0x00, + 0x00, 0x34, 0x5a, 0x81, 0x70, 0x34, 0x00, 0x00, 0x32, 0x5a, 0x81, 0x70, + 0x32, 0x00, 0x00, 0x35, 0x5a, 0x81, 0x70, 0x35, 0x00, 0x00, 0x37, 0x5a, + 0x81, 0x70, 0x37, 0x00, 0x00, 0x3a, 0x5a, 0x81, 0x70, 0x3a, 0x00, 0x00, + 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x37, 0x5a, 0x81, 0x70, 0x37, + 0x00, 0x00, 0x39, 0x5a, 0x81, 0x70, 0x39, 0x00, 0x00, 0x2d, 0x5a, 0x81, + 0x70, 0x2d, 0x00, 0x00, 0x32, 0x5a, 0x83, 0x60, 0x32, 0x00, 0x00, 0xff, + 0x2f, 0x00 +}; diff --git a/examples/PlayMIDIFromROM/venture_mid.h b/examples/PlayMIDIFromROM/venture_mid.h new file mode 100644 index 00000000..711134d1 --- /dev/null +++ b/examples/PlayMIDIFromROM/venture_mid.h @@ -0,0 +1,639 @@ +const unsigned char _mid[] PROGMEM = { + 0x4d, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x09, + 0x01, 0xe0, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x01, 0x21, 0x00, 0xff, + 0x58, 0x04, 0x04, 0x02, 0x18, 0x08, 0x00, 0xff, 0x59, 0x02, 0x02, 0x00, + 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, + 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, + 0x00, 0xff, 0x51, 0x03, 0x07, 0xa1, 0x20, 0x00, 0xb0, 0x79, 0x00, 0x00, + 0xc0, 0x34, 0x00, 0xb0, 0x07, 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, + 0x00, 0x5d, 0x00, 0x00, 0xff, 0x21, 0x01, 0x00, 0xbc, 0x00, 0xff, 0x58, + 0x04, 0x04, 0x02, 0x18, 0x08, 0x00, 0xff, 0x59, 0x02, 0x02, 0x00, 0x00, + 0xff, 0x51, 0x03, 0x07, 0xa1, 0x20, 0x81, 0xb4, 0x00, 0x90, 0x3b, 0x60, + 0x87, 0x3f, 0x3b, 0x00, 0x01, 0x42, 0x60, 0x00, 0x4e, 0x60, 0x83, 0x5f, + 0x42, 0x00, 0x00, 0x4e, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4c, 0x60, 0x83, + 0x5f, 0x40, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x3e, 0x60, 0x00, 0x4f, 0x60, + 0x87, 0x3f, 0x3e, 0x00, 0x00, 0x4f, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4e, + 0x60, 0x87, 0x3f, 0x40, 0x00, 0x00, 0x4e, 0x00, 0x01, 0x3e, 0x60, 0x87, + 0x3f, 0x3e, 0x00, 0x01, 0x42, 0x60, 0x00, 0x4e, 0x60, 0x83, 0x5f, 0x42, + 0x00, 0x00, 0x4e, 0x00, 0x01, 0x3e, 0x60, 0x00, 0x51, 0x60, 0x83, 0x5f, + 0x3e, 0x00, 0x00, 0x51, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4c, 0x60, 0x8e, + 0x7f, 0x40, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x3b, 0x60, 0x87, 0x3f, 0x3b, + 0x00, 0x01, 0x42, 0x60, 0x00, 0x4e, 0x60, 0x83, 0x5f, 0x42, 0x00, 0x00, + 0x4e, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4c, 0x60, 0x83, 0x5f, 0x40, 0x00, + 0x00, 0x4c, 0x00, 0x01, 0x3e, 0x60, 0x00, 0x4f, 0x60, 0x87, 0x3f, 0x3e, + 0x00, 0x00, 0x4f, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4e, 0x60, 0x87, 0x3f, + 0x40, 0x00, 0x00, 0x4e, 0x00, 0x01, 0x3e, 0x60, 0x00, 0x4a, 0x60, 0x8e, + 0x7f, 0x3e, 0x00, 0x00, 0x4a, 0x00, 0x01, 0x40, 0x60, 0x00, 0x4c, 0x60, + 0x8e, 0x7f, 0x40, 0x00, 0x00, 0x4c, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, + 0x54, 0x72, 0x6b, 0x00, 0x00, 0x04, 0xbd, 0x00, 0xff, 0x59, 0x02, 0x02, + 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, + 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, + 0x00, 0x00, 0xb1, 0x79, 0x00, 0x00, 0xc1, 0x28, 0x00, 0xb1, 0x07, 0x64, + 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, 0x21, + 0x01, 0x00, 0x00, 0xb2, 0x79, 0x00, 0x00, 0xc2, 0x2d, 0x00, 0xb2, 0x07, + 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, + 0x21, 0x01, 0x00, 0x00, 0xb3, 0x79, 0x00, 0x00, 0xc3, 0x2c, 0x00, 0xb3, + 0x07, 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, + 0xff, 0x21, 0x01, 0x00, 0x85, 0x50, 0x91, 0x47, 0x50, 0x3d, 0x47, 0x00, + 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, 0x4e, 0x50, 0x82, 0x62, 0x4e, + 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, 0x50, 0x77, + 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x47, 0x50, 0x87, + 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, 0x42, 0x00, 0x01, 0x47, 0x50, + 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, 0x42, 0x50, + 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, 0x4a, 0x00, 0x5b, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4e, + 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, + 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x87, 0x3f, 0x4c, 0x00, + 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, + 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, + 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x45, 0x50, 0x81, 0x6f, + 0x45, 0x00, 0x01, 0xff, 0x59, 0x02, 0x02, 0x00, 0x85, 0x50, 0x91, 0x47, + 0x50, 0x3d, 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, 0x4e, + 0x50, 0x82, 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, + 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, + 0x01, 0x47, 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, 0x42, + 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, + 0x00, 0x79, 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, 0x4a, + 0x00, 0x5b, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, 0x5f, + 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x77, + 0x51, 0x00, 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, + 0x87, 0x3f, 0x4c, 0x00, 0x8d, 0x11, 0x47, 0x60, 0x3d, 0x47, 0x00, 0x01, + 0x49, 0x60, 0x3d, 0x49, 0x00, 0x01, 0x4e, 0x60, 0x82, 0x62, 0x4e, 0x00, + 0x02, 0x51, 0x60, 0x77, 0x51, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, + 0x01, 0x4a, 0x60, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, + 0x00, 0x01, 0x49, 0x60, 0x77, 0x49, 0x00, 0x01, 0x47, 0x60, 0x87, 0x3f, + 0x47, 0x00, 0x01, 0x42, 0x60, 0x77, 0x42, 0x00, 0x01, 0x47, 0x60, 0x77, + 0x47, 0x00, 0x01, 0x49, 0x60, 0x77, 0x49, 0x00, 0x79, 0x42, 0x60, 0x3d, + 0x42, 0x00, 0x01, 0x4a, 0x60, 0x57, 0x4a, 0x00, 0x5b, 0x4c, 0x60, 0x77, + 0x4c, 0x00, 0x79, 0x4e, 0x60, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x60, + 0x77, 0x4c, 0x00, 0x01, 0x51, 0x60, 0x77, 0x51, 0x00, 0x01, 0x4e, 0x60, + 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, 0x51, + 0x60, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x79, 0x4a, + 0x60, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x60, 0x87, 0x3f, 0x4c, 0x00, 0x01, + 0x47, 0x60, 0x77, 0x47, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, + 0x4a, 0x60, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x60, 0x77, 0x47, 0x00, + 0x01, 0x49, 0x60, 0x77, 0x49, 0x00, 0x01, 0x45, 0x60, 0x81, 0x6f, 0x45, + 0x00, 0x85, 0x51, 0x47, 0x60, 0x3d, 0x47, 0x00, 0x01, 0x49, 0x60, 0x3d, + 0x49, 0x00, 0x01, 0x4e, 0x60, 0x82, 0x62, 0x4e, 0x00, 0x02, 0x51, 0x60, + 0x77, 0x51, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x60, + 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, 0x49, + 0x60, 0x77, 0x49, 0x00, 0x01, 0x47, 0x60, 0x87, 0x3f, 0x47, 0x00, 0x01, + 0x42, 0x60, 0x77, 0x42, 0x00, 0x01, 0x47, 0x60, 0x77, 0x47, 0x00, 0x01, + 0x49, 0x60, 0x77, 0x49, 0x00, 0x79, 0x42, 0x60, 0x3d, 0x42, 0x00, 0x01, + 0x4a, 0x60, 0x57, 0x4a, 0x00, 0x5b, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x79, + 0x4e, 0x60, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, + 0x01, 0x51, 0x60, 0x77, 0x51, 0x00, 0x01, 0x4e, 0x60, 0x83, 0x5f, 0x4e, + 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x60, 0x3b, 0x51, + 0x00, 0x3d, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x79, 0x4a, 0x60, 0x77, 0x4a, + 0x00, 0x79, 0x4c, 0x60, 0x87, 0x3f, 0x4c, 0x00, 0x01, 0x47, 0x60, 0x77, + 0x47, 0x00, 0x01, 0x4c, 0x60, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x60, 0x81, + 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x60, 0x77, 0x47, 0x00, 0x01, 0x49, 0x60, + 0x77, 0x49, 0x00, 0x01, 0x45, 0x60, 0x81, 0x6f, 0x45, 0x00, 0x85, 0x51, + 0x47, 0x50, 0x3d, 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, + 0x4e, 0x50, 0x82, 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, + 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, + 0x00, 0x01, 0x47, 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, + 0x42, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, + 0x49, 0x00, 0x79, 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, + 0x4a, 0x00, 0x5b, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, + 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, + 0x77, 0x51, 0x00, 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, + 0x50, 0x87, 0x3f, 0x4c, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, + 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, + 0x01, 0x45, 0x50, 0x81, 0x6f, 0x45, 0x00, 0x85, 0x51, 0x47, 0x50, 0x3d, + 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, 0x4e, 0x50, 0x82, + 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x47, + 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, 0x42, 0x00, 0x01, + 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, + 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, 0x4a, 0x00, 0x5b, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, + 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x77, 0x51, 0x00, + 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x87, 0x3f, + 0x4c, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x4c, 0x50, 0x77, + 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x50, + 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x45, 0x50, + 0x81, 0x6f, 0x45, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, + 0x00, 0x00, 0x03, 0xc4, 0x00, 0xff, 0x59, 0x02, 0x02, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xb4, + 0x79, 0x00, 0x00, 0xc4, 0x00, 0x00, 0xb4, 0x07, 0x64, 0x00, 0x0a, 0x40, + 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, 0x21, 0x01, 0x00, 0xbc, + 0x00, 0xff, 0x59, 0x02, 0x02, 0x00, 0xbc, 0x00, 0x94, 0x3e, 0x50, 0x81, + 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, + 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, + 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, + 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, + 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, + 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, + 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, + 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, + 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, + 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3d, 0x50, 0x81, + 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, + 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, + 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, + 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, + 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, + 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, + 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, + 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, + 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, + 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, + 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, + 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, + 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, + 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, + 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, + 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, + 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, + 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, + 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, + 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, + 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, + 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, + 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, + 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, + 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3b, 0x50, 0x81, + 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, + 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, + 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, + 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, + 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, + 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, + 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, + 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, + 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, + 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, + 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3e, 0x50, 0x81, + 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3e, + 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, 0x42, 0x00, + 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, 0x81, 0x63, + 0x42, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x42, 0x50, + 0x81, 0x63, 0x42, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, 0x63, 0x3b, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, 0x50, 0x81, + 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3b, + 0x50, 0x81, 0x63, 0x3b, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, + 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, + 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, 0x3e, 0x50, + 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, 0x00, 0x0d, + 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x39, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x0d, 0x3e, 0x50, 0x81, 0x63, 0x3e, 0x00, 0x0d, 0x3d, 0x50, 0x81, + 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, 0x0d, 0x3d, + 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, 0x40, 0x00, + 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, 0x81, 0x63, + 0x40, 0x00, 0x0d, 0x3d, 0x50, 0x81, 0x63, 0x3d, 0x00, 0x0d, 0x40, 0x50, + 0x81, 0x63, 0x40, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, + 0x00, 0x00, 0x07, 0x88, 0x00, 0xff, 0x59, 0x02, 0x02, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x21, 0x01, 0x00, 0x00, 0x94, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0xff, 0x59, 0x02, 0x02, 0x00, 0x00, 0x94, 0x23, 0x50, 0x81, 0x63, + 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, + 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, + 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, + 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, + 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, + 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, + 0x00, 0x36, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, + 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, + 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, + 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, + 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, + 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, + 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, + 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, + 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, + 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, + 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, + 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, + 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, + 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, + 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, 0x00, + 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, + 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, 0x87, + 0x4d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, + 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, + 0x00, 0x00, 0x36, 0x00, 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, + 0x2f, 0x50, 0x00, 0x36, 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, + 0x0d, 0x23, 0x50, 0x81, 0x63, 0x23, 0x00, 0x0d, 0x2f, 0x50, 0x00, 0x36, + 0x50, 0x81, 0x63, 0x2f, 0x00, 0x00, 0x36, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, + 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2b, 0x50, 0x81, 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x37, 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x2b, 0x50, 0x81, + 0x63, 0x2b, 0x00, 0x0d, 0x37, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x37, + 0x00, 0x00, 0x3e, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, + 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, + 0x63, 0x26, 0x00, 0x0d, 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, + 0x00, 0x00, 0x39, 0x00, 0x0d, 0x26, 0x50, 0x81, 0x63, 0x26, 0x00, 0x0d, + 0x32, 0x50, 0x00, 0x39, 0x50, 0x81, 0x63, 0x32, 0x00, 0x00, 0x39, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, + 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x40, 0x50, 0x81, 0x63, 0x39, + 0x00, 0x00, 0x40, 0x00, 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, + 0x39, 0x50, 0x00, 0x3e, 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, + 0x0d, 0x2d, 0x50, 0x81, 0x63, 0x2d, 0x00, 0x0d, 0x39, 0x50, 0x00, 0x3e, + 0x50, 0x81, 0x63, 0x39, 0x00, 0x00, 0x3e, 0x00, 0x01, 0xff, 0x2f, 0x00, + 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x03, 0x84, 0x00, 0xff, 0x59, 0x02, + 0x02, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xb5, 0x79, 0x00, 0x00, 0xc5, 0x19, 0x00, 0xb5, 0x07, + 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, + 0x21, 0x01, 0x00, 0x98, 0x30, 0x95, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, + 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x8a, + 0x29, 0x51, 0x50, 0x77, 0x51, 0x00, 0x79, 0x4c, 0x50, 0x77, 0x4c, 0x00, + 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x8f, 0x79, 0xff, 0x59, 0x02, 0x02, + 0x00, 0x98, 0x30, 0x95, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, 0x4a, 0x50, + 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x8a, 0x29, 0x51, + 0x50, 0x77, 0x51, 0x00, 0x79, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4a, + 0x50, 0x77, 0x4a, 0x00, 0x95, 0x49, 0x47, 0x50, 0x3d, 0x47, 0x00, 0x01, + 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, 0x4e, 0x50, 0x82, 0x62, 0x4e, 0x00, + 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, + 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x47, 0x50, 0x87, 0x3f, + 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, 0x42, 0x00, 0x01, 0x47, 0x50, 0x77, + 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, 0x42, 0x50, 0x3d, + 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, 0x4a, 0x00, 0x5b, 0x4c, 0x50, 0x77, + 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4e, 0x50, + 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, + 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4a, + 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x87, 0x3f, 0x4c, 0x00, 0x01, + 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, + 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x45, 0x50, 0x81, 0x6f, 0x45, + 0x00, 0x85, 0x51, 0x47, 0x50, 0x3d, 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, + 0x49, 0x00, 0x01, 0x4e, 0x50, 0x82, 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, + 0x77, 0x51, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, + 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, + 0x50, 0x77, 0x49, 0x00, 0x01, 0x47, 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, + 0x42, 0x50, 0x77, 0x42, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, + 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, + 0x4a, 0x50, 0x57, 0x4a, 0x00, 0x5b, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, + 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, + 0x01, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, + 0x00, 0x3d, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, + 0x00, 0x79, 0x4c, 0x50, 0x87, 0x3f, 0x4c, 0x00, 0x01, 0x47, 0x50, 0x77, + 0x47, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, + 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, + 0x77, 0x49, 0x00, 0x01, 0x45, 0x50, 0x81, 0x6f, 0x45, 0x00, 0x85, 0x51, + 0x47, 0x50, 0x3d, 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, + 0x4e, 0x50, 0x82, 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, + 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, + 0x00, 0x01, 0x47, 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, + 0x42, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, + 0x49, 0x00, 0x79, 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, + 0x4a, 0x00, 0x5b, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, + 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, + 0x77, 0x51, 0x00, 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, + 0x50, 0x87, 0x3f, 0x4c, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, + 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, + 0x01, 0x45, 0x50, 0x81, 0x6f, 0x45, 0x00, 0x85, 0x51, 0x47, 0x50, 0x3d, + 0x47, 0x00, 0x01, 0x49, 0x50, 0x3d, 0x49, 0x00, 0x01, 0x4e, 0x50, 0x82, + 0x62, 0x4e, 0x00, 0x02, 0x51, 0x50, 0x77, 0x51, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x4c, + 0x50, 0x77, 0x4c, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x47, + 0x50, 0x87, 0x3f, 0x47, 0x00, 0x01, 0x42, 0x50, 0x77, 0x42, 0x00, 0x01, + 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x79, + 0x42, 0x50, 0x3d, 0x42, 0x00, 0x01, 0x4a, 0x50, 0x57, 0x4a, 0x00, 0x5b, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x79, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, + 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x51, 0x50, 0x77, 0x51, 0x00, + 0x01, 0x4e, 0x50, 0x83, 0x5f, 0x4e, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x51, 0x50, 0x3b, 0x51, 0x00, 0x3d, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x79, 0x4a, 0x50, 0x77, 0x4a, 0x00, 0x79, 0x4c, 0x50, 0x87, 0x3f, + 0x4c, 0x00, 0x01, 0x47, 0x50, 0x77, 0x47, 0x00, 0x01, 0x4c, 0x50, 0x77, + 0x4c, 0x00, 0x01, 0x4a, 0x50, 0x81, 0x6f, 0x4a, 0x00, 0x01, 0x47, 0x50, + 0x77, 0x47, 0x00, 0x01, 0x49, 0x50, 0x77, 0x49, 0x00, 0x01, 0x45, 0x50, + 0x81, 0x6f, 0x45, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, + 0x00, 0x00, 0x00, 0xc2, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x02, 0x00, 0x00, 0x00, 0xb9, 0x79, 0x00, 0x00, 0xc9, 0x00, 0x00, + 0xb9, 0x07, 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, + 0x00, 0xff, 0x21, 0x01, 0x00, 0xff, 0x40, 0x99, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, + 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, + 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, + 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, + 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, + 0x26, 0x50, 0x87, 0x3f, 0x26, 0x00, 0x87, 0x41, 0x26, 0x50, 0x87, 0x3f, + 0x26, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, + 0x01, 0x72, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xb9, 0x79, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xb9, 0x07, + 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, + 0x21, 0x01, 0x00, 0xf8, 0x00, 0x99, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, + 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, 0x50, 0x81, + 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, + 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x87, 0x41, 0x23, 0x50, 0x85, 0x4f, + 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, + 0x50, 0x81, 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, + 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x87, 0x41, 0x23, 0x50, + 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, + 0x61, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, + 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x87, 0x41, + 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, + 0x00, 0x83, 0x61, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, + 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, + 0x87, 0x41, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, + 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x81, + 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, + 0x23, 0x00, 0x87, 0x41, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, + 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, 0x50, 0x81, 0x6f, 0x23, + 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, 0x23, 0x50, + 0x81, 0x6f, 0x23, 0x00, 0x87, 0x41, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, + 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, 0x50, 0x81, + 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, 0x00, 0x01, + 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x87, 0x41, 0x23, 0x50, 0x85, 0x4f, + 0x23, 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x83, 0x61, 0x23, + 0x50, 0x81, 0x6f, 0x23, 0x00, 0x81, 0x71, 0x23, 0x50, 0x85, 0x4f, 0x23, + 0x00, 0x01, 0x23, 0x50, 0x81, 0x6f, 0x23, 0x00, 0x01, 0xff, 0x2f, 0x00, + 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, 0x01, 0x42, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xb9, 0x79, 0x00, + 0x00, 0xc9, 0x00, 0x00, 0xb9, 0x07, 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, + 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, 0x21, 0x01, 0x00, 0xf8, 0x00, 0x99, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x83, 0x5f, 0x4c, 0x00, 0x96, 0x41, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x83, 0x5f, + 0x4c, 0x00, 0x96, 0x41, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x83, 0x5f, 0x4c, 0x00, 0x96, 0x41, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x83, 0x5f, 0x4c, 0x00, 0x96, 0x41, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x83, 0x5f, + 0x4c, 0x00, 0x96, 0x41, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, + 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x83, 0x5f, 0x4c, 0x00, 0x96, 0x41, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, + 0x4c, 0x50, 0x83, 0x5f, 0x4c, 0x00, 0x96, 0x41, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, + 0x00, 0x01, 0x4c, 0x50, 0x77, 0x4c, 0x00, 0x01, 0x4c, 0x50, 0x83, 0x5f, + 0x4c, 0x00, 0x01, 0xff, 0x2f, 0x00, 0x4d, 0x54, 0x72, 0x6b, 0x00, 0x00, + 0x05, 0x5b, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, 0x00, 0x00, 0x00, 0xff, 0x59, 0x02, + 0x00, 0x00, 0x00, 0xb9, 0x79, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xb9, 0x07, + 0x64, 0x00, 0x0a, 0x40, 0x00, 0x5b, 0x00, 0x00, 0x5d, 0x00, 0x00, 0xff, + 0x21, 0x01, 0x00, 0xf8, 0x00, 0x99, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x79, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x79, 0x36, 0x31, 0x81, 0x6f, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x79, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, + 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x79, 0x36, 0x31, + 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, + 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x79, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, + 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x79, + 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, + 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x79, 0x36, 0x31, 0x81, 0x6f, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, + 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, + 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, + 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, + 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, + 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, + 0x01, 0x36, 0x31, 0x81, 0x6f, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, + 0x00, 0x01, 0x36, 0x31, 0x3b, 0x36, 0x00, 0x01, 0x36, 0x31, 0x77, 0x36, + 0x00, 0x01, 0xff, 0x2f, 0x00 +}; diff --git a/examples/PlayMIDIFromSPIFFS/PlayMIDIFromSPIFFS.ino b/examples/PlayMIDIFromSPIFFS/PlayMIDIFromSPIFFS.ino deleted file mode 100644 index dcfa8f98..00000000 --- a/examples/PlayMIDIFromSPIFFS/PlayMIDIFromSPIFFS.ino +++ /dev/null @@ -1,55 +0,0 @@ -#include -#ifdef ESP32 - #include - #include "SPIFFS.h" -#else - #include -#endif - - -#include -#include -#include -#include - -AudioFileSourceSPIFFS *sf2; -AudioFileSourceSPIFFS *mid; -AudioOutputI2S *dac; -AudioGeneratorMIDI *midi; - -void setup() -{ - const char *soundfont = "/1mgm.sf2"; - const char *midifile = "/furelise.mid"; - - WiFi.mode(WIFI_OFF); - - Serial.begin(115200); - Serial.println("Starting up...\n"); - - audioLogger = &Serial; - sf2 = new AudioFileSourceSPIFFS(soundfont); - mid = new AudioFileSourceSPIFFS(midifile); - - dac = new AudioOutputI2S(); - midi = new AudioGeneratorMIDI(); - midi->SetSoundfont(sf2); - midi->SetSampleRate(22050); - Serial.printf("BEGIN...\n"); - midi->begin(mid, dac); -} - -void loop() -{ - if (midi->isRunning()) { - if (!midi->loop()) { - uint32_t e = millis(); - midi->stop(); - } - } else { - Serial.printf("MIDI done\n"); - delay(1000); - } -} - - diff --git a/examples/PlayMIDIFromSPIFFS/data/1mgm.sf2 b/examples/PlayMIDIFromSPIFFS/data/1mgm.sf2 deleted file mode 100644 index 00862e96..00000000 Binary files a/examples/PlayMIDIFromSPIFFS/data/1mgm.sf2 and /dev/null differ diff --git a/examples/PlayMIDIFromSPIFFS/data/furelise.mid b/examples/PlayMIDIFromSPIFFS/data/furelise.mid deleted file mode 100644 index b50146cd..00000000 Binary files a/examples/PlayMIDIFromSPIFFS/data/furelise.mid and /dev/null differ diff --git a/examples/PlayMODFromPROGMEMToDAC/PlayMODFromPROGMEMToDAC.ino b/examples/PlayMODFromPROGMEMToDAC/PlayMODFromPROGMEMToDAC.ino index 44aac59e..6792925a 100644 --- a/examples/PlayMODFromPROGMEMToDAC/PlayMODFromPROGMEMToDAC.ino +++ b/examples/PlayMODFromPROGMEMToDAC/PlayMODFromPROGMEMToDAC.ino @@ -2,10 +2,11 @@ #include "AudioFileSourcePROGMEM.h" #include "AudioGeneratorMOD.h" #include "AudioOutputI2S.h" -#ifdef ESP32 - #include + +#ifdef ESP8266 +#include #else - #include +#include #endif // enigma.mod sample from the mod archive: https://modarchive.org/index.php?request=view_by_moduleid&query=42146 @@ -15,30 +16,29 @@ AudioGeneratorMOD *mod; AudioFileSourcePROGMEM *file; AudioOutputI2S *out; -void setup() -{ +void setup() { WiFi.mode(WIFI_OFF); //WiFi.forceSleepBegin(); Serial.begin(115200); delay(1000); audioLogger = &Serial; - file = new AudioFileSourcePROGMEM( enigma_mod, sizeof(enigma_mod) ); + file = new AudioFileSourcePROGMEM(enigma_mod, sizeof(enigma_mod)); // out = new AudioOutputI2S(0, 1); Uncomment this line, comment the next one to use the internal DAC channel 1 (pin25) on ESP32 out = new AudioOutputI2S(); mod = new AudioGeneratorMOD(); - mod->SetBufferSize(3*1024); + mod->SetBufferSize(3 * 1024); mod->SetSampleRate(44100); mod->SetStereoSeparation(32); mod->begin(file, out); } -void loop() -{ +void loop() { if (mod->isRunning()) { - if (!mod->loop()) mod->stop(); + if (!mod->loop()) { + mod->stop(); + } } else { Serial.printf("MOD done\n"); delay(1000); } } - diff --git a/examples/PlayMODFromPROGMEMToPDM/5steps.h b/examples/PlayMODFromPROGMEMToPDM/5steps.h new file mode 100644 index 00000000..312e4efa --- /dev/null +++ b/examples/PlayMODFromPROGMEMToPDM/5steps.h @@ -0,0 +1,11253 @@ +const unsigned char steps_mod[] = { + 0x35, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x20, 0x76, 0x69, + 0x6e, 0x6e, 0x69, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x20, 0x00, 0x03, 0xed, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xd1, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe1, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, 0x6d, + 0x65, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, + 0x05, 0xf4, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x20, 0x70, 0x61, 0x61, + 0x6c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x06, 0x6a, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x67, 0x65, 0x6f, 0x72, 0x67, 0x20, 0x73, 0x74, 0x61, + 0x6e, 0x67, 0x73, 0x20, 0x67, 0x74, 0x20, 0x36, 0x20, 0x20, 0x20, 0x00, + 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x20, 0x31, 0x37, 0x37, + 0x37, 0x20, 0x68, 0x61, 0x6c, 0x64, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x06, 0x52, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x6e, 0x6f, 0x72, 0x77, 0x61, 0x79, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, + 0x05, 0xef, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x0c, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0x00, 0x40, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x50, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x61, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x93, 0x00, 0x40, 0x04, 0x08, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x70, 0x00, 0x40, 0x00, 0x63, 0x02, 0xf6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xcc, 0x00, 0x40, 0x00, 0xc2, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x20, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x22, 0x7f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x00, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x2e, 0x4b, 0x2e, 0x00, 0xd6, 0x5c, 0x00, 0x00, 0x00, 0x0f, 0x0f, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0x92, 0x00, 0xf0, 0x9c, 0x00, 0x00, 0x00, 0x0f, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x28, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x10, 0x00, 0xa0, 0x5c, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x06, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x20, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xdc, 0x20, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xbc, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xe2, 0x9c, 0x08, 0x01, 0x53, 0xac, 0x00, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0xd6, 0x03, 0x03, 0x00, 0x00, 0x0a, 0x10, + 0x01, 0xac, 0xfc, 0x11, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x04, 0xe2, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x7c, 0x20, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0xd6, 0x0e, 0xc1, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x6c, 0x10, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0xbc, 0x30, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0a, 0x04, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0xd6, 0x0e, 0xc2, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x01, 0xe0, 0xfc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xd6, 0x09, 0x05, 0x01, 0x53, 0x09, 0x05, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x10, 0xd6, 0x0c, 0x10, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0xd6, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0xac, 0x03, 0xf0, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x01, 0x68, 0x03, 0xf9, + 0x01, 0x40, 0x01, 0x01, 0x00, 0xa0, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x02, 0x01, 0x40, 0x03, 0x03, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x01, 0x53, 0xec, 0x11, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x99, 0x03, + 0x01, 0x7d, 0xac, 0x20, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0xf0, 0x03, 0xf0, 0x00, 0x00, 0x0e, 0x11, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xfc, 0x21, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xf0, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x20, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x30, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xd6, 0x50, 0x00, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xf0, 0xfc, 0x20, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0xe2, 0x03, 0xd0, 0x01, 0x68, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xd6, 0x5c, 0x30, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xe2, 0x9c, 0x20, 0x01, 0x53, 0xac, 0x18, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0xd6, 0x03, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x01, 0xac, 0xfc, 0x1f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x03, 0xd0, 0x00, 0xa0, 0x8c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xec, 0x0f, + 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xec, 0x30, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xec, 0x10, 0x00, 0xa0, 0x6c, 0x10, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x0e, 0xc1, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xdc, 0x30, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x2e, 0x03, 0x06, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xdc, 0x10, + 0x00, 0xa0, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xd6, 0x04, 0xe4, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xea, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xdc, 0x1f, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x03, 0x07, 0x01, 0x53, 0x03, 0x0f, + 0x00, 0xd6, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0xde, 0xc1, 0x00, 0xa0, 0x80, 0x00, 0x00, 0xe2, 0x03, 0xf0, + 0x01, 0x68, 0x03, 0x02, 0x00, 0xe2, 0xdc, 0x21, 0x00, 0xaa, 0x5c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0xaa, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xed, 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xfe, 0x09, 0x03, 0x01, 0x7d, 0xac, 0x20, 0x00, 0xf0, 0xec, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0xf0, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xdc, 0x10, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0e, 0xc1, + 0x00, 0xd6, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x40, 0xec, 0x10, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x0d, 0xec, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xdc, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0xe0, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0a, 0x50, 0x00, 0xa0, 0x8c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x78, 0x0a, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x87, 0xdc, 0x10, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0x00, 0x9c, 0x20, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0xe0, 0xfc, 0x2f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0xb4, 0xac, 0x05, 0x00, 0xf0, 0xdc, 0x26, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x5c, 0x09, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x10, 0x10, 0x87, 0x0c, 0x10, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x01, 0xc5, 0xfc, 0x20, 0x00, 0xa0, 0xcf, 0x08, 0x00, 0xe2, 0x9c, 0x20, + 0x00, 0xaa, 0xac, 0x30, 0x01, 0xac, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x03, 0x03, 0x00, 0x00, 0x0a, 0x03, 0x10, 0xd6, 0x0c, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x10, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0xd6, 0xec, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0xdc, 0x1a, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0x0e, 0xc1, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0x03, 0x36, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x68, 0xdc, 0x18, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0x03, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xb4, 0x03, 0xf2, 0x00, 0xe2, 0xdc, 0x21, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x90, 0x00, 0x00, 0xbe, 0xac, 0x20, + 0x00, 0xf0, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xf0, 0x93, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x20, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x20, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x5c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x10, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xdc, 0x10, + 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x24, + 0x00, 0xaa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xfc, 0x20, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xf0, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x20, 0x00, 0xa0, 0xcd, 0x00, 0x00, 0xd6, 0x90, 0x00, + 0x00, 0xaa, 0xac, 0x30, 0x10, 0xd6, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x04, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x7f, 0x7c, 0x20, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xf0, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xfc, 0x10, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xfc, 0x30, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe2, 0x0f, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xdc, 0x30, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x1d, 0xdc, 0x10, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x0e, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0x03, 0x06, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xdc, 0x10, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x03, 0xf0, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0xda, 0x0f, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xb4, 0x0e, 0xb2, + 0x00, 0xe2, 0xdc, 0x21, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x90, 0x00, + 0x00, 0xbe, 0xac, 0x20, 0x00, 0xf0, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0xf0, 0x93, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x09, 0x10, + 0x00, 0x7f, 0x7c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x20, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xec, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x10, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xec, 0x20, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xec, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x40, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0a, 0x0f, 0x00, 0xa0, 0x0e, 0x93, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x87, 0xdc, 0x10, 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x20, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x78, 0x0a, 0x0f, + 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x7d, 0xec, 0x10, 0x00, 0xbe, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 0xbe, 0x4c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x40, + 0x00, 0xbe, 0x4c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0x03, 0x30, 0x00, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xcf, 0x08, 0x00, 0xaa, 0x9c, 0x30, 0x00, 0xfe, 0xac, 0x30, + 0x01, 0x40, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x03, + 0x00, 0x00, 0x0a, 0x01, 0x10, 0xa0, 0x0c, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xdc, 0x20, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xec, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x30, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x68, 0xfc, 0x40, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfa, 0x0f, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xea, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0xec, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, 0x00, 0xaa, 0x03, 0xf0, + 0x01, 0x0d, 0x03, 0xf2, 0x00, 0xaa, 0xdc, 0x21, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xbe, 0x9c, 0x29, 0x01, 0x1d, 0xac, 0x20, 0x00, 0xb4, 0xec, 0x30, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xb4, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x10, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xfc, 0x20, + 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd0, 0x00, 0x00, 0xa0, 0x1c, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xe2, 0x0f, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xec, 0x20, 0x00, 0xaa, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x05, 0x02, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb4, 0xdc, 0x22, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xf0, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x0c, 0x20, + 0x00, 0xa0, 0xcd, 0x00, 0x00, 0xaa, 0x9c, 0x30, 0x00, 0xfe, 0xac, 0x30, + 0x10, 0xa0, 0x04, 0xe4, 0x00, 0x00, 0x0f, 0x08, 0x00, 0xa0, 0x03, 0xf3, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xf0, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xfc, 0x30, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xec, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x30, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x40, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfa, 0x0f, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xb4, 0x0c, 0x20, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfc, 0x20, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xec, 0x20, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0xec, 0x30, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xdc, 0x20, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xaa, 0x03, 0xf0, 0x01, 0x0d, 0x03, 0xf2, 0x00, 0xaa, 0xdc, 0x21, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xbe, 0x9c, 0x29, 0x01, 0x1d, 0xac, 0x20, + 0x00, 0xb4, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xb4, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xca, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x04, 0xec, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xca, 0xec, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xb4, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xb4, 0xdc, 0x20, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xdc, 0x20, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x40, 0xdc, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xa0, 0x03, 0x30, + 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x53, 0xec, 0x17, 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xaa, 0x03, 0xf0, 0x00, 0xa0, 0x8c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x20, + 0x00, 0xbe, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xb4, 0x03, 0xf0, 0x00, 0xbe, 0x4c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x7d, 0xec, 0x1a, 0x00, 0xbe, 0x4c, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x03, 0xf0, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x94, 0xec, 0x1a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xca, 0x03, 0xf0, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x9f, 0x08, 0x00, 0x00, 0x0a, 0x01, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0x05, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xa0, 0x8c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xd6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0xd6, 0x3c, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x07, 0x00, 0xd6, 0x3c, 0x08, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0xd6, 0x3c, 0x28, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x08, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x20, + 0x00, 0xa0, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x15, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xec, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0d, 0x00, 0xd6, 0x3c, 0x08, 0x00, 0x00, 0x9a, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0d, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x9a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x06, + 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xdc, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe1, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x30, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x9a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xda, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xbe, 0x0e, 0x93, + 0x00, 0x00, 0x9a, 0x06, 0x11, 0x1d, 0x1c, 0x10, 0x01, 0x68, 0xda, 0x0f, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x0c, 0x00, + 0x10, 0xa0, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x14, 0x00, 0x00, 0x9a, 0x06, + 0x10, 0xf0, 0x1c, 0x12, 0x10, 0xa0, 0x03, 0x02, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x0c, 0x02, 0x10, 0xb4, 0x0c, 0x10, + 0x00, 0xbe, 0x4c, 0x30, 0x00, 0x00, 0x9a, 0x06, 0x10, 0xd6, 0x1c, 0x10, + 0x10, 0xa0, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x0c, 0x00, 0x10, 0xa0, 0x03, 0x02, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x9f, 0x02, 0x10, 0xca, 0x1c, 0x1a, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x04, 0xe1, 0x10, 0xbe, 0x10, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x08, 0x10, 0xbe, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x11, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x10, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0xb4, 0x0e, 0xd3, 0x00, 0xd6, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0a, 0x01, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0xaa, 0x0e, 0xd2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xd6, 0x9c, 0x20, 0x10, 0xaa, 0x1c, 0x15, 0x10, 0xd6, 0x0f, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x06, 0x10, 0xa0, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1d, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xaa, 0x1c, 0x0a, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xb4, 0x1c, 0x14, 0x10, 0xaa, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0xa0, 0x03, 0xd3, + 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xca, 0x1c, 0x10, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x1a, + 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x10, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, + 0x11, 0x0d, 0x10, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x02, + 0x10, 0xb4, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x0e, 0x11, 0x10, 0xb4, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x11, 0x0d, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x07, 0x11, 0x0d, 0x1c, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x11, 0x0d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xfc, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0x97, 0x1e, 0xd3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x8f, 0x10, 0x00, 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0x97, 0x1e, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x8f, 0x1c, 0x10, 0x10, 0x8f, 0x1e, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x87, 0x1c, 0x10, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0x8f, 0x1c, 0x20, + 0x10, 0x87, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x94, 0xe1, 0x10, 0x97, 0x1c, 0x06, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x10, 0xa0, 0x1c, 0x10, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x8f, 0x03, 0xd0, + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xa0, 0x03, 0xf0, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x08, 0x01, 0x1d, 0xde, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x10, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x05, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xd6, 0x94, 0xe1, 0x10, 0xca, 0x1f, 0x01, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x10, 0xbe, 0x1f, 0x07, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, + 0x00, 0x00, 0x9a, 0x02, 0x11, 0x1d, 0x1c, 0x10, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, + 0x00, 0x00, 0x0c, 0x06, 0x11, 0x1d, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1c, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x30, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xb4, 0x0e, 0xd3, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x03, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0xaa, 0x0e, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, 0x00, 0xd6, 0x9c, 0x20, + 0x10, 0xa0, 0x10, 0x00, 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x0f, 0x06, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x0a, 0x10, 0xa0, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xbe, 0x1c, 0x10, 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x10, 0x00, 0xd6, 0xe3, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x10, 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x10, 0xf0, 0x1c, 0x0a, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, + 0x00, 0x00, 0x04, 0xe4, 0x10, 0xca, 0x10, 0x00, 0x10, 0xf0, 0x1c, 0x0a, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x04, 0xe8, 0x10, 0xbe, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0e, 0x11, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0x8f, 0x1c, 0x10, + 0x10, 0xf0, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x10, 0x8f, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x1d, 0x1c, 0x10, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x20, 0x11, 0x1d, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xe2, 0x1c, 0x14, 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, 0x10, 0xd6, 0x10, 0x00, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x9a, 0x02, 0x11, 0x40, 0x1c, 0x10, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x40, 0x1c, 0x0a, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x05, 0x01, 0x68, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x06, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x11, 0x40, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xfe, 0x9c, 0x20, 0x11, 0x53, 0x10, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xe2, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x8c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x01, 0x0d, 0x9a, 0x04, 0x11, 0x68, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x0c, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x01, 0x1d, 0x9a, 0x04, 0x11, 0x7d, 0x1c, 0x13, 0x01, 0x7d, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbe, 0xc3, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x0a, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x10, 0xd6, 0x44, 0xe1, 0x10, 0xbe, 0x1c, 0x1a, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0xa0, 0x60, 0x00, 0x10, 0x00, 0x4c, 0x19, + 0x00, 0x00, 0x01, 0x01, 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x0c, 0x08, + 0x10, 0xbe, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x00, 0xbe, 0x4c, 0x08, + 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x09, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x10, 0x00, 0x44, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x10, 0x00, 0x4a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x10, 0x00, 0x4c, 0x20, 0x10, 0xd6, 0x1c, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4c, 0x1a, + 0x10, 0xbe, 0x10, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x10, 0x00, 0x4c, 0x15, 0x00, 0xb4, 0x0e, 0xd3, + 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x7c, 0x10, + 0x10, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x0a, 0x01, 0x10, 0xb4, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, 0x00, 0xaa, 0x0e, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xd6, 0x9c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x9c, 0x20, 0x10, 0xaa, 0x1c, 0x15, + 0x10, 0xd6, 0x0f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x0f, 0x06, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x10, 0xa0, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0c, 0x10, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xaa, 0x1c, 0x0a, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x14, 0x10, 0xaa, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xa0, 0x03, 0xd3, 0x00, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x00, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x00, 0xbe, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x1a, 0x00, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x10, + 0x00, 0xf0, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xf0, 0x94, 0xe1, 0x11, 0x0d, 0x1c, 0x1a, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0xb4, 0x0c, 0x10, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, + 0x00, 0x00, 0x0c, 0x0a, 0x11, 0x0d, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0xf0, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x11, 0x0d, 0x1c, 0x0a, 0x10, 0xb4, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0c, 0x0a, + 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfa, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x03, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x10, + 0x01, 0x68, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0x97, 0x1c, 0x0a, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, + 0x10, 0x8f, 0x10, 0x00, 0x01, 0x68, 0xf4, 0xe5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0x87, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x87, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x78, 0x1c, 0x0a, 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0x7f, 0x1c, 0x10, 0x01, 0x40, 0xe3, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x87, 0x1c, 0x20, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x78, 0x03, 0xf0, + 0x01, 0x68, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x10, 0x8f, 0x10, 0x00, 0x01, 0x40, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe3, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xa0, 0x1c, 0x10, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0xbe, 0x0e, 0xd3, + 0x00, 0xd6, 0xde, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x06, 0x10, 0xf0, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0xf0, 0x0e, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xe2, 0x0c, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xd6, 0x94, 0xe1, 0x10, 0xbe, 0x1c, 0x15, + 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x05, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x10, 0xca, 0x10, 0x00, 0x01, 0xac, 0xfc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xca, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x05, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x0a, 0x01, 0x40, 0xef, 0x02, 0x00, 0x00, 0x0f, 0x06, + 0x00, 0x00, 0x0a, 0x04, 0x10, 0xca, 0x1c, 0x10, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4f, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x0a, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, + 0x00, 0xd6, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xca, 0x1c, 0x10, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, + 0x10, 0xca, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x05, 0x00, 0xf0, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x97, 0x10, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x10, 0xd6, 0x10, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x02, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6f, 0x04, + 0x00, 0x00, 0x9a, 0x08, 0x10, 0xa0, 0x1c, 0x12, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0xca, 0x0e, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4f, 0x04, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x10, + 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xca, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, + 0x10, 0xd6, 0x10, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x02, + 0x11, 0x40, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x10, 0xd6, 0x1c, 0x06, + 0x11, 0x40, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x11, 0x40, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x2e, 0x1c, 0x10, + 0x10, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x9c, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xd6, 0x9c, 0x20, 0x11, 0x1d, 0x1c, 0x0a, + 0x10, 0x8f, 0x0c, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0a, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x97, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x9c, 0x10, 0x01, 0x2e, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0xa0, 0x6f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x01, 0x1d, 0x9c, 0x10, 0x01, 0x40, 0x00, 0x00, + 0x10, 0xb4, 0x0c, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x40, 0x9c, 0x10, 0x00, 0xfe, 0xac, 0x10, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x12, + 0x01, 0x53, 0xac, 0x12, 0x01, 0x1d, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x48, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x40, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xbe, 0x1c, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xca, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xd6, 0x9c, 0x12, 0x10, 0xd6, 0x1c, 0x10, 0x01, 0x1d, 0xec, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x40, 0x9c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x02, 0x10, 0xca, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8e, 0xd6, 0x00, 0x00, 0x0f, 0x0e, + 0x10, 0xbe, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x0f, 0x08, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x12, 0x10, 0xd6, 0x1c, 0x10, + 0x01, 0x1d, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x1d, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x40, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x40, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0e, 0x93, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x40, 0x9c, 0x10, 0x11, 0x40, 0x4c, 0x00, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x2e, 0x0c, 0x12, + 0x10, 0xca, 0x4c, 0x0a, 0x10, 0xca, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x05, + 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xe2, 0x4c, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x2e, 0x9c, 0x17, 0x10, 0xe2, 0x4c, 0x08, + 0x00, 0xfe, 0xec, 0x24, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xec, 0x10, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x0d, 0x9c, 0x22, 0x10, 0xb4, 0x4c, 0x14, 0x01, 0x68, 0xec, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x0c, 0x10, + 0x00, 0x00, 0x0c, 0x10, 0x01, 0x0d, 0xec, 0x20, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x9c, 0x18, + 0x11, 0x53, 0x4c, 0x16, 0x00, 0xfe, 0xec, 0x24, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x22, 0x11, 0x40, 0x4c, 0x0a, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xf0, 0x9c, 0x18, 0x10, 0xf0, 0x4c, 0x15, 0x01, 0x0d, 0xec, 0x24, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x20, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x0e, 0x21, 0x00, 0x00, 0x0e, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0xe2, 0x03, 0xd0, 0x00, 0xe2, 0x03, 0xf0, + 0x00, 0xe2, 0xec, 0x10, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x22, + 0x10, 0xd6, 0x4c, 0x0a, 0x01, 0xac, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x10, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x4c, 0x00, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x0e, 0x93, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x4c, 0x30, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x90, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xea, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xd6, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2e, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xe2, 0x9c, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9c, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x78, 0x9c, 0x00, 0x00, 0xa0, 0xec, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, + 0x03, 0x58, 0x03, 0x0a, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x05, 0x50, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x04, 0xf2, + 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x04, 0xf3, 0x00, 0x00, 0x05, 0x05, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xf5, 0x10, 0xa0, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x04, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x04, 0x01, 0x40, 0xea, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x03, + 0x01, 0x68, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x18, 0x10, 0xa0, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x2f, 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x01, 0x03, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x15, + 0x01, 0x40, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x06, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x06, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xde, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xe2, 0x0c, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcf, 0x04, + 0x00, 0xd6, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x10, 0xd6, 0x4c, 0x00, + 0x01, 0xac, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xea, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0x7f, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0x78, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xe2, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x9c, 0x20, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe3, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xec, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x97, 0xec, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x8f, 0x03, 0x33, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xe1, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x05, 0x08, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x05, 0x20, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0x05, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xfe, 0x05, 0x20, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x2e, 0x05, 0x20, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x19, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x38, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe4, 0xf2, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x2e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x70, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0xd6, 0x94, 0xe1, + 0x10, 0xd6, 0x4c, 0x06, 0x10, 0x8f, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3a, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x8f, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, + 0x00, 0xa0, 0xbe, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x10, 0xd6, 0x44, 0xe1, 0x00, 0xb4, 0xac, 0x23, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0xaa, 0x03, 0x07, + 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x04, 0xe3, 0x01, 0xac, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x4c, 0x19, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xd6, 0xea, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0x4c, 0x08, + 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x09, 0x19, + 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x10, 0x00, 0x44, 0xe1, 0x10, 0xd6, 0x4c, 0x00, + 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x10, 0x00, 0x4a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x10, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x07, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x01, 0x03, + 0x00, 0xbe, 0xbc, 0x18, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xe3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x10, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xd6, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x2e, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x9c, 0x19, 0x00, 0xe2, 0x03, 0xf0, + 0x01, 0x68, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x10, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x13, + 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x10, 0xf0, 0x4c, 0x07, 0x03, 0x58, 0x03, 0x0a, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x50, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x10, 0xf0, 0x4c, 0x17, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xe3, 0x00, 0x00, 0x05, 0x05, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x04, 0xe4, + 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x05, 0x01, 0x40, 0xea, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0c, 0x09, 0x01, 0x68, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0c, 0x0b, + 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0c, 0x0d, 0x01, 0x40, 0xec, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x0e, + 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0c, 0x0f, 0x01, 0x40, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2e, 0xe3, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0xc0, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x00, 0x0a, 0x01, + 0x01, 0x40, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0xbe, 0x4c, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0xbe, 0x4c, 0x13, + 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x01, 0x40, 0xfe, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x7c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, 0x10, 0xd6, 0x44, 0xe1, + 0x00, 0xb4, 0xac, 0x23, 0x10, 0xd6, 0x0c, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0xaa, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x10, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x78, 0x9c, 0x00, 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, 0x03, 0x58, 0x03, 0x0a, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x05, 0x50, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x05, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xf3, + 0x00, 0x00, 0x05, 0x05, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x04, 0xf5, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0xf7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x04, + 0x01, 0x40, 0xea, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x03, 0x01, 0x68, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x18, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x2f, + 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x15, 0x01, 0x40, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x06, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x9c, 0x06, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x10, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x11, 0x1d, 0x1c, 0x02, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x10, 0xd6, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0xb4, 0x03, 0xf0, 0x01, 0x68, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x0c, 0x08, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0xb4, 0x03, 0xd0, + 0x01, 0x2e, 0xe3, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x1c, 0x0a, 0x10, 0x7f, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, 0x00, 0xd6, 0x94, 0xe1, + 0x00, 0xd6, 0x03, 0xd0, 0x00, 0x78, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x10, 0xfe, 0x1c, 0x10, + 0x00, 0x8f, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x1c, 0x08, 0x00, 0xf0, 0x03, 0xd0, 0x00, 0xa0, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x03, 0xf0, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0xb4, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x10, 0x00, 0xfe, 0x03, 0xf0, + 0x00, 0xd6, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1d, 0x05, 0x10, 0x01, 0x40, 0x03, 0xf0, 0x00, 0xf0, 0x05, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1f, 0x08, 0x11, 0x2e, 0x10, 0x00, + 0x11, 0x68, 0x1c, 0x20, 0x10, 0xd6, 0x1c, 0x20, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0c, 0x03, + 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xe3, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0xff, 0xf3, 0xf3, 0x05, 0x40, 0x3e, + 0x09, 0xc4, 0xa9, 0xfd, 0x3e, 0x68, 0x20, 0x03, 0xbd, 0x09, 0x0b, 0x0b, + 0x3c, 0x1b, 0x55, 0x3a, 0xe3, 0xc2, 0xa9, 0x05, 0x43, 0x53, 0x05, 0xbf, + 0xab, 0x13, 0x3a, 0x4b, 0xf5, 0x03, 0xc2, 0x0b, 0x20, 0x55, 0xf5, 0xef, + 0xe0, 0x0f, 0x0d, 0x4f, 0x4d, 0x0f, 0xda, 0x2e, 0xe7, 0xf7, 0x11, 0xd2, + 0xca, 0xc2, 0xfb, 0xe7, 0x1d, 0xf1, 0xe0, 0xf1, 0xe0, 0xfb, 0xeb, 0xb7, + 0xb9, 0xd6, 0xef, 0x13, 0xd8, 0xf7, 0xde, 0x09, 0xe0, 0x15, 0xc4, 0xb1, + 0xcc, 0x1d, 0xf7, 0xde, 0x0b, 0xc8, 0xaf, 0x9e, 0x88, 0x82, 0xd0, 0x15, + 0x1f, 0xc6, 0xc8, 0xe0, 0x09, 0xe9, 0xe5, 0xce, 0xbb, 0xbd, 0xb3, 0xd4, + 0xb1, 0xfd, 0x03, 0xc8, 0xe9, 0xbb, 0xfd, 0xd2, 0x20, 0xfb, 0xf9, 0xde, + 0x03, 0x1b, 0xdc, 0xf9, 0x0d, 0x0b, 0x0b, 0x26, 0xe1, 0x34, 0x38, 0x24, + 0xff, 0x22, 0x03, 0x26, 0x09, 0x4d, 0x09, 0x34, 0x28, 0x22, 0x11, 0x3a, + 0x20, 0x30, 0x1b, 0x30, 0x1d, 0x1d, 0x2e, 0x32, 0x4f, 0x57, 0x38, 0x68, + 0x20, 0x3c, 0xe1, 0x40, 0x2a, 0x40, 0x3c, 0x26, 0x2e, 0x40, 0x53, 0x61, + 0x1b, 0x45, 0x05, 0x49, 0x0b, 0x4b, 0x4b, 0x40, 0x49, 0x32, 0x30, 0x2e, + 0x59, 0x3a, 0x4d, 0xff, 0x1f, 0x4d, 0x22, 0x4b, 0x00, 0x05, 0x3e, 0x4b, + 0x1d, 0x03, 0x07, 0x45, 0x2e, 0x1d, 0x34, 0x01, 0x20, 0x11, 0x0b, 0xfb, + 0x30, 0x0b, 0xe5, 0x09, 0x13, 0x1b, 0x0d, 0xff, 0xc8, 0x0b, 0xd4, 0x26, + 0x11, 0xe3, 0xc0, 0xd2, 0x0d, 0xfb, 0xc2, 0xda, 0xcc, 0xef, 0xd6, 0xfb, + 0xd2, 0xed, 0xb1, 0xca, 0xe5, 0xc0, 0xd4, 0xbb, 0xb9, 0xbd, 0xd6, 0xcc, + 0xb3, 0xd6, 0xb5, 0xc0, 0xce, 0xce, 0xbb, 0xbd, 0xb3, 0xd0, 0xbf, 0xb5, + 0xb3, 0xbd, 0xbd, 0xc4, 0xc4, 0xc4, 0xa7, 0xc2, 0xab, 0xd8, 0xb7, 0xc6, + 0xc2, 0xb1, 0xbd, 0xd6, 0xca, 0xc4, 0xbb, 0xc4, 0xe3, 0xb5, 0xe1, 0xbb, + 0xd6, 0xdc, 0xde, 0xc0, 0xca, 0xd4, 0xeb, 0xd8, 0xd6, 0xcc, 0xcc, 0xed, + 0xde, 0xe9, 0xe1, 0xe1, 0xf5, 0xdc, 0xda, 0xed, 0xf1, 0xf1, 0xe3, 0xda, + 0xe9, 0xf5, 0xf7, 0xf3, 0xff, 0x03, 0x0f, 0x07, 0xff, 0xff, 0x03, 0x07, + 0x1b, 0x07, 0x07, 0x05, 0x24, 0x13, 0x19, 0x0f, 0x1f, 0x0d, 0x1f, 0x20, + 0x11, 0x20, 0x1f, 0x32, 0x28, 0x3a, 0x20, 0x2e, 0x1b, 0x30, 0x2c, 0x3c, + 0x2e, 0x2a, 0x30, 0x3e, 0x38, 0x34, 0x24, 0x2e, 0x22, 0x2e, 0x32, 0x47, + 0x30, 0x34, 0x38, 0x2c, 0x3a, 0x41, 0x38, 0x2c, 0x45, 0x2c, 0x26, 0x38, + 0x24, 0x22, 0x3e, 0x36, 0x3e, 0x28, 0x24, 0x20, 0x2e, 0x28, 0x3a, 0x32, + 0x32, 0x2c, 0x34, 0x17, 0x2e, 0x1d, 0x2e, 0x2e, 0x32, 0x30, 0x2a, 0x26, + 0x28, 0x19, 0x28, 0x24, 0x26, 0x32, 0x1d, 0x1f, 0x26, 0x20, 0x24, 0x22, + 0x1b, 0x17, 0x17, 0x1f, 0x24, 0x24, 0x17, 0x1b, 0x17, 0x19, 0x13, 0x1d, + 0x0f, 0x11, 0x0f, 0x0f, 0x0d, 0x0f, 0x09, 0x11, 0x00, 0x0b, 0x05, 0x0d, + 0x00, 0x0d, 0x01, 0x03, 0x03, 0xf7, 0x01, 0xfd, 0x03, 0x07, 0xfb, 0x01, + 0xf9, 0xf7, 0xf5, 0xfd, 0xf7, 0xf5, 0xf7, 0xe9, 0xf1, 0x00, 0xf7, 0xeb, + 0xde, 0xe1, 0xde, 0xe9, 0xf1, 0xef, 0xed, 0xe3, 0xd4, 0xde, 0xe3, 0xe3, + 0xe0, 0xe0, 0xdc, 0xde, 0xd8, 0xda, 0xd8, 0xd8, 0xd4, 0xd2, 0xcc, 0xd0, + 0xcc, 0xc8, 0xce, 0xd6, 0xcc, 0xca, 0xc8, 0xc8, 0xc6, 0xcc, 0xc4, 0xca, + 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xc2, 0xc0, 0xc4, 0xc8, 0xca, 0xcc, + 0xca, 0xc4, 0xc8, 0xc6, 0xce, 0xc4, 0xce, 0xc8, 0xc6, 0xce, 0xce, 0xd0, + 0xd4, 0xd4, 0xd4, 0xd6, 0xd6, 0xd8, 0xd8, 0xd4, 0xd8, 0xde, 0xde, 0xde, + 0xe0, 0xe1, 0xde, 0xe1, 0xe1, 0xe5, 0xe7, 0xeb, 0xed, 0xed, 0xe9, 0xeb, + 0xef, 0xf1, 0xf3, 0xef, 0xf7, 0xfd, 0xfb, 0xf7, 0xf5, 0xf9, 0xff, 0xfd, + 0xff, 0xff, 0x03, 0x07, 0x05, 0x00, 0x09, 0x07, 0x0d, 0x09, 0x0d, 0x09, + 0x11, 0x15, 0x1b, 0x15, 0x0f, 0x0d, 0x13, 0x13, 0x15, 0x17, 0x1d, 0x17, + 0x17, 0x17, 0x1d, 0x1d, 0x24, 0x24, 0x22, 0x1d, 0x1d, 0x22, 0x26, 0x26, + 0x26, 0x20, 0x22, 0x22, 0x22, 0x24, 0x26, 0x26, 0x28, 0x2a, 0x28, 0x20, + 0x22, 0x26, 0x26, 0x2a, 0x2a, 0x2a, 0x28, 0x2a, 0x26, 0x24, 0x22, 0x28, + 0x2a, 0x2a, 0x28, 0x2a, 0x2c, 0x2e, 0x2c, 0x28, 0x26, 0x26, 0x26, 0x26, + 0x2a, 0x28, 0x26, 0x26, 0x26, 0x22, 0x1f, 0x24, 0x28, 0x2a, 0x2a, 0x22, + 0x24, 0x26, 0x24, 0x20, 0x1f, 0x20, 0x1f, 0x1d, 0x1d, 0x19, 0x1b, 0x1b, + 0x1f, 0x1f, 0x1b, 0x15, 0x17, 0x1b, 0x1f, 0x1b, 0x15, 0x13, 0x13, 0x11, + 0x11, 0x13, 0x15, 0x13, 0x11, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, + 0x05, 0x03, 0x03, 0x03, 0x05, 0x09, 0x09, 0x05, 0xff, 0xf9, 0xf7, 0xfd, + 0x01, 0x01, 0x00, 0xff, 0xfb, 0xf9, 0xf9, 0xf9, 0xf5, 0xf5, 0xf9, 0xf9, + 0xf5, 0xef, 0xef, 0xed, 0xf1, 0xf3, 0xf1, 0xef, 0xeb, 0xe9, 0xe9, 0xeb, + 0xeb, 0xeb, 0xe7, 0xe7, 0xe5, 0xe7, 0xed, 0xeb, 0xe3, 0xe0, 0xe1, 0xe3, + 0xe3, 0xe1, 0xe3, 0xe5, 0xe7, 0xe7, 0xe1, 0xe0, 0xde, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe3, 0xe3, 0xe5, 0xe7, 0xe3, 0xde, 0xde, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe0, 0xdc, 0xe1, 0xe3, 0xe1, 0xe3, 0xe1, 0xe1, 0xe0, 0xe0, 0xe1, + 0xe0, 0xe1, 0xe3, 0xe7, 0xeb, 0xe7, 0xe3, 0xe0, 0xe0, 0xe3, 0xe5, 0xe7, + 0xe3, 0xe1, 0xe3, 0xe7, 0xed, 0xed, 0xeb, 0xe9, 0xed, 0xed, 0xef, 0xed, + 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, 0xf3, 0xf5, 0xf5, 0xf3, 0xf1, 0xef, + 0xef, 0xf1, 0xf5, 0xf5, 0xf3, 0xf1, 0xed, 0xf1, 0xf5, 0xf9, 0xfd, 0xfd, + 0xf7, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, + 0xfb, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xfd, + 0xfd, 0x00, 0x01, 0x01, 0xff, 0xfd, 0xfd, 0x00, 0x01, 0x03, 0x03, 0x03, + 0x01, 0x00, 0xff, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, 0x01, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x05, 0x03, 0x01, 0x03, 0x07, 0x09, 0x07, 0x03, 0x01, + 0x05, 0x07, 0x09, 0x07, 0x05, 0x05, 0x07, 0x0b, 0x09, 0x05, 0x03, 0x01, + 0x03, 0x07, 0x09, 0x0b, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0b, 0x07, 0x09, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x13, 0x13, 0x11, 0x0f, 0x0d, 0x0d, 0x0f, 0x11, 0x11, 0x0f, 0x0d, 0x0f, + 0x0f, 0x11, 0x0f, 0x11, 0x13, 0x0f, 0x0f, 0x0f, 0x13, 0x13, 0x15, 0x13, + 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0d, 0x13, 0x17, 0x13, 0x11, 0x11, 0x13, + 0x15, 0x13, 0x13, 0x15, 0x15, 0x17, 0x15, 0x11, 0x11, 0x15, 0x17, 0x15, + 0x13, 0x15, 0x19, 0x19, 0x19, 0x15, 0x13, 0x13, 0x15, 0x15, 0x15, 0x17, + 0x17, 0x15, 0x13, 0x13, 0x13, 0x13, 0x11, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x17, 0x17, 0x15, 0x15, 0x13, 0x0f, 0x0f, 0x17, 0x1d, 0x1b, 0x17, 0x15, + 0x13, 0x15, 0x1b, 0x1b, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, + 0x11, 0x13, 0x15, 0x17, 0x11, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0b, + 0x09, 0x0b, 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x09, 0x0b, 0x0b, 0x09, 0x01, + 0x00, 0x01, 0x03, 0x03, 0x03, 0x00, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, + 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf3, 0xf3, 0xf5, 0xf7, 0xf5, 0xf1, 0xf1, + 0xf3, 0xf3, 0xf1, 0xed, 0xeb, 0xe9, 0xed, 0xed, 0xed, 0xeb, 0xe9, 0xe7, + 0xe7, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe0, + 0xe0, 0xe0, 0xe0, 0xde, 0xdc, 0xde, 0xe0, 0xe0, 0xdc, 0xd8, 0xd8, 0xdc, + 0xde, 0xda, 0xd8, 0xd8, 0xde, 0xe0, 0xdc, 0xda, 0xda, 0xdc, 0xde, 0xe0, + 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xdc, + 0xde, 0xe1, 0xe3, 0xe1, 0xe0, 0xe0, 0xde, 0xe0, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe9, 0xed, 0xed, 0xe9, 0xe5, 0xe3, 0xe7, 0xeb, 0xed, 0xeb, 0xeb, + 0xeb, 0xe9, 0xeb, 0xed, 0xf1, 0xf1, 0xf1, 0xef, 0xed, 0xeb, 0xed, 0xf1, + 0xf3, 0xf1, 0xed, 0xed, 0xef, 0xf1, 0xf5, 0xf3, 0xf3, 0xf5, 0xf5, 0xf5, + 0xf7, 0xf7, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xfd, 0xfd, 0xff, 0xfd, 0xfb, + 0xf9, 0xfd, 0xfd, 0xff, 0xfd, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x05, 0x07, 0x07, + 0x09, 0x09, 0x05, 0x05, 0x01, 0x03, 0x05, 0x07, 0x05, 0x05, 0x05, 0x07, + 0x0b, 0x0d, 0x07, 0x05, 0x05, 0x07, 0x0d, 0x0d, 0x0b, 0x09, 0x0d, 0x0f, + 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x13, 0x17, + 0x15, 0x11, 0x0f, 0x11, 0x13, 0x15, 0x15, 0x17, 0x17, 0x19, 0x19, 0x19, + 0x15, 0x11, 0x11, 0x15, 0x1b, 0x1f, 0x1b, 0x17, 0x11, 0x15, 0x19, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, 0x19, 0x19, 0x1b, 0x1f, 0x1f, 0x1d, + 0x1d, 0x1d, 0x1b, 0x19, 0x1b, 0x1d, 0x1d, 0x1b, 0x1d, 0x1f, 0x1f, 0x1f, + 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1b, 0x1d, 0x1d, 0x1b, 0x1d, 0x1d, 0x1f, + 0x1f, 0x19, 0x15, 0x17, 0x1b, 0x20, 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x19, 0x19, 0x17, 0x15, 0x15, + 0x17, 0x19, 0x17, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x0f, 0x0f, 0x0d, + 0x09, 0x07, 0x09, 0x0d, 0x0f, 0x0f, 0x0d, 0x07, 0x07, 0x07, 0x09, 0x09, + 0x09, 0x05, 0x05, 0x03, 0x05, 0x07, 0x07, 0x03, 0x01, 0x00, 0x01, 0x03, + 0x05, 0x05, 0x03, 0x00, 0xff, 0xff, 0x00, 0x01, 0x01, 0xff, 0xff, 0xfd, + 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, + 0xf9, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, + 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf1, 0xf1, 0xf3, 0xf7, 0xf9, 0xf5, 0xf1, + 0xf1, 0xf3, 0xf5, 0xf5, 0xf1, 0xef, 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xf1, 0xf3, 0xf1, 0xef, 0xed, 0xeb, 0xeb, 0xeb, + 0xef, 0xef, 0xed, 0xeb, 0xe7, 0xe9, 0xe9, 0xeb, 0xed, 0xed, 0xeb, 0xe9, + 0xeb, 0xeb, 0xe5, 0xe3, 0xe5, 0xe9, 0xed, 0xed, 0xe7, 0xe1, 0xe1, 0xe5, + 0xe7, 0xe7, 0xe7, 0xeb, 0xe9, 0xe5, 0xe3, 0xe1, 0xe3, 0xe9, 0xeb, 0xe9, + 0xe3, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe7, + 0xe9, 0xe7, 0xe3, 0xe1, 0xe1, 0xe3, 0xe5, 0xe5, 0xe3, 0xe5, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe3, 0xe3, 0xe7, 0xe9, 0xed, 0xeb, 0xe9, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, 0xeb, 0xed, 0xed, 0xed, 0xeb, 0xeb, + 0xeb, 0xe7, 0xe9, 0xe9, 0xf1, 0xf7, 0xf7, 0xf1, 0xeb, 0xeb, 0xf3, 0xf7, + 0xf5, 0xf1, 0xef, 0xf1, 0xf3, 0xf3, 0xf3, 0xf3, 0xf5, 0xf7, 0xf7, 0xf3, + 0xf3, 0xf5, 0xf9, 0xf9, 0xf7, 0xf7, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, + 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0x00, 0x01, 0x00, 0xfd, 0xf9, 0xfb, 0xff, + 0x01, 0x07, 0x09, 0x07, 0x03, 0xfd, 0xf9, 0xfb, 0x03, 0x09, 0x07, 0x03, + 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 0x09, 0x07, 0x05, 0x05, 0x05, 0x0b, + 0x0d, 0x0b, 0x07, 0x07, 0x0b, 0x0d, 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x07, + 0x0b, 0x0f, 0x11, 0x11, 0x0d, 0x0b, 0x0b, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0f, 0x15, 0x17, 0x15, 0x0f, 0x0b, 0x0f, 0x11, 0x13, 0x13, 0x15, + 0x15, 0x15, 0x13, 0x11, 0x13, 0x19, 0x1d, 0x19, 0x13, 0x0d, 0x11, 0x17, + 0x19, 0x17, 0x13, 0x11, 0x17, 0x1d, 0x1f, 0x19, 0x17, 0x15, 0x15, 0x17, + 0x1d, 0x1f, 0x1f, 0x1b, 0x17, 0x15, 0x17, 0x19, 0x1d, 0x1d, 0x1b, 0x19, + 0x1b, 0x1d, 0x1f, 0x1d, 0x1b, 0x19, 0x19, 0x17, 0x1b, 0x1d, 0x1f, 0x1f, + 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1f, 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x1b, + 0x1f, 0x22, 0x1f, 0x19, 0x15, 0x17, 0x19, 0x1f, 0x22, 0x20, 0x1d, 0x19, + 0x19, 0x1b, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x17, 0x19, 0x17, 0x17, 0x17, + 0x15, 0x13, 0x13, 0x15, 0x17, 0x17, 0x11, 0x0b, 0x09, 0x0b, 0x0d, 0x0f, + 0x0f, 0x0f, 0x0b, 0x05, 0x03, 0x05, 0x07, 0x09, 0x09, 0x05, 0x01, 0x00, + 0x00, 0x05, 0x07, 0x05, 0x00, 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0xff, 0x00, + 0x00, 0xfd, 0xf9, 0xf9, 0xf9, 0xfb, 0xfb, 0xf7, 0xf3, 0xf3, 0xf7, 0xf7, + 0xf7, 0xf3, 0xf1, 0xef, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xef, 0xeb, 0xe9, + 0xeb, 0xf1, 0xf1, 0xed, 0xe9, 0xe7, 0xe7, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, + 0xe9, 0xe7, 0xe7, 0xe9, 0xeb, 0xe9, 0xe3, 0xe1, 0xe3, 0xe5, 0xe9, 0xeb, + 0xeb, 0xe5, 0xe3, 0xe3, 0xe1, 0xe1, 0xe5, 0xe7, 0xe7, 0xe5, 0xe3, 0xe3, + 0xe7, 0xeb, 0xeb, 0xe7, 0xe3, 0xe1, 0xe3, 0xe7, 0xe9, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, 0xe7, 0xe9, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe9, 0xe7, 0xe9, 0xeb, 0xed, 0xeb, 0xe7, 0xe7, 0xeb, + 0xed, 0xeb, 0xeb, 0xe9, 0xed, 0xef, 0xf1, 0xef, 0xed, 0xeb, 0xef, 0xf1, + 0xf3, 0xf5, 0xf3, 0xed, 0xeb, 0xed, 0xf3, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, + 0xfb, 0xf9, 0xf7, 0xf5, 0xf9, 0xfb, 0xfb, 0xf9, 0xf7, 0xf7, 0xfb, 0xfd, + 0xfd, 0xfb, 0xfb, 0xff, 0x03, 0x01, 0xfd, 0xf7, 0xf9, 0xfd, 0x03, 0x03, + 0x00, 0xff, 0xff, 0x00, 0x03, 0x03, 0x01, 0x03, 0x05, 0x07, 0x05, 0x03, + 0x01, 0x03, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x03, 0x07, 0x09, 0x07, 0x05, 0x05, 0x05, 0x07, 0x05, 0x05, + 0x05, 0x05, 0x07, 0x09, 0x07, 0x05, 0x03, 0x07, 0x07, 0x05, 0x03, 0x03, + 0x07, 0x0b, 0x0b, 0x09, 0x03, 0x01, 0x03, 0x07, 0x05, 0x05, 0x01, 0x03, + 0x05, 0x07, 0x03, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0xff, 0x00, 0x03, + 0x09, 0x0b, 0x0b, 0x05, 0xff, 0xfb, 0x00, 0x03, 0x05, 0x03, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0xff, 0xff, 0x00, 0x03, + 0x05, 0x05, 0x03, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x05, 0x09, 0x07, 0x01, 0xff, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x01, 0x05, 0x07, 0x07, 0x03, 0x00, 0xff, 0xff, 0x00, 0x01, 0x03, 0x01, + 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xfb, 0xf9, 0x00, 0x00, 0x00, + 0x00, 0xf3, 0x05, 0x01, 0x00, 0xf7, 0x05, 0xf3, 0x11, 0x00, 0xeb, 0x09, + 0x05, 0xfb, 0xfb, 0x05, 0xf3, 0x15, 0xff, 0xd3, 0x2d, 0xf7, 0xf3, 0xef, + 0x21, 0xef, 0xf7, 0x0d, 0xfb, 0x00, 0xff, 0x00, 0x01, 0xef, 0x01, 0x0d, + 0xf3, 0xe7, 0x2d, 0xf3, 0xdb, 0x29, 0xf7, 0xfb, 0xef, 0x19, 0xfb, 0xf7, + 0xf3, 0x15, 0xff, 0x09, 0xd3, 0x25, 0x00, 0xeb, 0xff, 0x19, 0xff, 0xdf, + 0x1d, 0xff, 0xe7, 0x19, 0x00, 0xe7, 0x01, 0x09, 0xff, 0xf3, 0x0d, 0xfb, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x05, 0xef, + 0x15, 0x01, 0xcf, 0x21, 0x00, 0xe3, 0x11, 0x01, 0xff, 0xdf, 0x2d, 0xef, + 0xe3, 0x1d, 0xf3, 0x09, 0xff, 0xff, 0x01, 0x05, 0xdb, 0x1d, 0xfb, 0x00, + 0x01, 0xf7, 0x00, 0x0d, 0xe7, 0x05, 0x09, 0x05, 0xeb, 0xf3, 0x21, 0xf7, + 0xe7, 0x15, 0x05, 0xef, 0xff, 0x0d, 0xf3, 0x0d, 0x01, 0xe3, 0x0d, 0xfb, + 0x15, 0xef, 0xef, 0x1d, 0xf7, 0x09, 0xeb, 0x05, 0x05, 0x05, 0xe7, 0xff, + 0x1d, 0xfb, 0xe3, 0x19, 0x00, 0xff, 0xf3, 0x05, 0x09, 0x00, 0xdb, 0x25, + 0xfb, 0xf3, 0x09, 0x09, 0xf3, 0xf7, 0x05, 0x00, 0x0d, 0xeb, 0xff, 0x19, + 0xdf, 0x0d, 0x09, 0xf7, 0xeb, 0x1d, 0x00, 0xe7, 0x00, 0x15, 0xf3, 0x00, + 0x00, 0x00, 0xff, 0xfb, 0x05, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, + 0x01, 0x05, 0xf3, 0xeb, 0x21, 0xff, 0xf7, 0xeb, 0x21, 0x00, 0xe3, 0x01, + 0x0d, 0x00, 0xdf, 0x1d, 0xfb, 0xfb, 0x00, 0x0d, 0xef, 0xf7, 0x11, 0x00, + 0xf3, 0x05, 0x0d, 0xeb, 0xf3, 0x19, 0xf3, 0x09, 0xef, 0x00, 0x05, 0x01, + 0x00, 0xf7, 0x01, 0x09, 0xe3, 0x05, 0x09, 0x00, 0xdf, 0x1d, 0x00, 0xef, + 0xff, 0x11, 0xf7, 0x01, 0x09, 0xdb, 0x11, 0x09, 0xf7, 0xf3, 0x11, 0xff, + 0xf7, 0xff, 0x09, 0xfb, 0xf7, 0x19, 0xe7, 0xfb, 0x11, 0x01, 0xdf, 0x11, + 0x00, 0x09, 0xeb, 0xff, 0x15, 0xfb, 0xef, 0x0d, 0xf7, 0x01, 0x05, 0xf7, + 0x01, 0x05, 0xf3, 0x00, 0x09, 0xeb, 0x05, 0x01, 0x01, 0xe3, 0x1d, 0x00, + 0xe7, 0x11, 0xf3, 0x15, 0xfb, 0xe7, 0x1d, 0xf3, 0xf7, 0x05, 0x09, 0xf7, + 0xeb, 0x1d, 0xff, 0xef, 0x00, 0x0d, 0xf7, 0x09, 0x00, 0xd7, 0x29, 0xfb, + 0xef, 0x00, 0x0d, 0x00, 0xdb, 0x29, 0xef, 0xeb, 0x19, 0x00, 0xe7, 0x0d, + 0x01, 0x09, 0xdf, 0x09, 0x09, 0x01, 0xdb, 0x15, 0x01, 0xfb, 0xf3, 0x15, + 0xf3, 0xef, 0x0d, 0x01, 0xff, 0xeb, 0x15, 0xff, 0xfb, 0xf7, 0x09, 0x01, + 0xfb, 0xef, 0x19, 0xff, 0xe3, 0x15, 0x00, 0xeb, 0x11, 0xef, 0x05, 0x0d, + 0xe7, 0x00, 0x09, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x05, 0xe7, 0x00, 0x11, + 0x01, 0xdf, 0x11, 0x05, 0x00, 0xeb, 0x11, 0xff, 0x09, 0xeb, 0x01, 0x00, + 0x0d, 0xeb, 0xff, 0x09, 0x01, 0xf7, 0xf7, 0x0d, 0xfb, 0x0d, 0xf7, 0xe3, + 0x25, 0xfb, 0xe7, 0x05, 0x0d, 0x00, 0xdb, 0x21, 0xfb, 0xfb, 0xf7, 0x11, + 0xfb, 0xfb, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x05, 0xef, 0xf7, 0x15, 0xe7, + 0x09, 0x0d, 0xef, 0xf3, 0x25, 0xdb, 0x01, 0x09, 0x01, 0xdf, 0x15, 0x00, + 0xff, 0xf7, 0x09, 0xfb, 0x00, 0xff, 0xff, 0x00, 0xff, 0x05, 0x00, 0xe7, + 0x19, 0x01, 0xe3, 0x11, 0x05, 0x00, 0xe3, 0x15, 0xf7, 0x11, 0xf7, 0xe7, + 0x19, 0xff, 0x01, 0xdf, 0x25, 0xef, 0xf7, 0x09, 0x00, 0xfb, 0xfb, 0x09, + 0xfb, 0xf7, 0x09, 0xff, 0xfb, 0x00, 0x09, 0x00, 0xdb, 0x1d, 0xf7, 0x05, + 0xf3, 0x09, 0x09, 0xdf, 0x09, 0x09, 0x00, 0xe3, 0x1d, 0xeb, 0x09, 0x01, + 0xef, 0x05, 0x05, 0x00, 0xe3, 0x19, 0xf7, 0xff, 0x0d, 0xff, 0xdb, 0x25, + 0xff, 0xef, 0xff, 0x19, 0xeb, 0xff, 0x0d, 0x01, 0xef, 0x00, 0x15, 0xe3, + 0x09, 0x05, 0x00, 0xe7, 0x11, 0xff, 0x00, 0xfb, 0x09, 0xfb, 0xf3, 0x11, + 0x01, 0xdb, 0x1d, 0x00, 0xff, 0xf3, 0x15, 0xfb, 0xf3, 0x09, 0x05, 0xe7, + 0x01, 0x0d, 0xff, 0xeb, 0x0d, 0x01, 0xfb, 0xfb, 0x05, 0x00, 0xfb, 0x01, + 0x01, 0xf3, 0x05, 0x05, 0xff, 0xef, 0x15, 0xfb, 0xef, 0x0d, 0x00, 0xfb, + 0x0d, 0xf3, 0xf3, 0x19, 0xff, 0xe7, 0x0d, 0x01, 0xff, 0xf7, 0x09, 0xf7, + 0x05, 0x05, 0xef, 0x01, 0x00, 0x09, 0xf7, 0xf7, 0x15, 0xe7, 0x15, 0xf7, + 0xeb, 0x15, 0xff, 0xf7, 0x00, 0x01, 0x00, 0x00, 0x00, 0xeb, 0x15, 0xfb, + 0xfb, 0x01, 0xff, 0x05, 0x01, 0xeb, 0x19, 0x00, 0xf3, 0xff, 0x11, 0xf3, + 0xfb, 0x09, 0x09, 0xe3, 0x11, 0xf7, 0x00, 0x00, 0x09, 0xf7, 0xf3, 0x11, + 0x01, 0xe3, 0x0d, 0x00, 0x01, 0x01, 0xe3, 0x11, 0x01, 0xfb, 0xf7, 0x0d, + 0xff, 0xfb, 0xff, 0x00, 0x01, 0x05, 0xe7, 0x0d, 0xf7, 0x09, 0xf7, 0x01, + 0x01, 0xeb, 0x11, 0x01, 0xe7, 0x01, 0x0d, 0xff, 0xe7, 0x21, 0xfb, 0xe7, + 0x11, 0x00, 0xfb, 0xff, 0x0d, 0xef, 0xfb, 0x09, 0x00, 0x05, 0xef, 0x0d, + 0x01, 0xe7, 0x0d, 0xfb, 0x00, 0x05, 0xf7, 0xff, 0x0d, 0xfb, 0xf3, 0x11, + 0x05, 0xeb, 0x01, 0x05, 0x00, 0x01, 0xe7, 0x09, 0x01, 0x01, 0xfb, 0xeb, + 0x15, 0xff, 0x01, 0xef, 0x11, 0x00, 0xf7, 0xff, 0x05, 0x09, 0xeb, 0x05, + 0xff, 0x00, 0x05, 0xf7, 0xfb, 0x09, 0x05, 0xf3, 0xf3, 0x15, 0x00, 0xe7, + 0x09, 0x01, 0xff, 0xf3, 0x0d, 0x00, 0xfb, 0x00, 0x01, 0xff, 0x01, 0x09, + 0xe7, 0xff, 0x11, 0xf3, 0x05, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x05, 0xf3, + 0x00, 0x05, 0xf7, 0x05, 0xff, 0xf7, 0x01, 0x09, 0xef, 0xf7, 0x15, 0xf7, + 0xff, 0x0d, 0xf7, 0xeb, 0x21, 0xfb, 0xeb, 0x05, 0x01, 0x05, 0xe3, 0x11, + 0x01, 0xff, 0xeb, 0x21, 0xe3, 0x00, 0x0d, 0x00, 0xe7, 0x0d, 0x01, 0x01, + 0xe3, 0x19, 0x00, 0xf7, 0xff, 0x05, 0xfb, 0x05, 0xf7, 0x00, 0x00, 0xfb, + 0x00, 0x0d, 0xf7, 0xef, 0x15, 0xfb, 0xfb, 0x09, 0x01, 0xe3, 0x11, 0x01, + 0xff, 0xef, 0x15, 0xff, 0xf7, 0x01, 0x00, 0xff, 0x09, 0xfb, 0xeb, 0x15, + 0xff, 0xef, 0x01, 0x01, 0x00, 0x09, 0xe3, 0x09, 0x05, 0x01, 0xe3, 0x19, + 0x00, 0xf7, 0xfb, 0x05, 0xf7, 0x09, 0x00, 0xe7, 0x11, 0xfb, 0x05, 0xf7, + 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe3, 0x15, 0x00, 0x00, + 0xeb, 0x19, 0xff, 0xeb, 0x0d, 0x09, 0xef, 0x00, 0x09, 0x01, 0xe3, 0x11, + 0x01, 0xf7, 0xf3, 0x1d, 0xe3, 0x01, 0x09, 0x01, 0xe7, 0x11, 0xf7, 0x09, + 0xfb, 0x01, 0x09, 0xe3, 0x09, 0x05, 0xff, 0xe7, 0x15, 0x00, 0x00, 0xe7, + 0x1d, 0xff, 0xef, 0x01, 0x09, 0xfb, 0xfb, 0x00, 0xff, 0x09, 0xfb, 0xf7, + 0x09, 0x00, 0xff, 0xff, 0x01, 0xf3, 0x0d, 0x01, 0xef, 0xff, 0x0d, 0x00, + 0xe7, 0x11, 0x01, 0xe7, 0x11, 0x01, 0xfb, 0xfb, 0x0d, 0xfb, 0xfb, 0x05, + 0x00, 0xfb, 0xff, 0x01, 0x05, 0xfb, 0xef, 0x15, 0xef, 0x01, 0x0d, 0xfb, + 0xeb, 0x21, 0xeb, 0xfb, 0x0d, 0x01, 0xeb, 0x09, 0x05, 0xff, 0xf3, 0x09, + 0xff, 0x00, 0x01, 0xfb, 0xf3, 0x15, 0xfb, 0xf3, 0x09, 0x00, 0x05, 0xeb, + 0x0d, 0x00, 0xfb, 0x05, 0xfb, 0x01, 0xff, 0x00, 0xff, 0xff, 0x01, 0x05, + 0xef, 0xff, 0x0d, 0x00, 0xeb, 0x19, 0xff, 0xeb, 0x0d, 0x00, 0xf7, 0xff, + 0x09, 0xff, 0xf3, 0x11, 0x00, 0xe7, 0x11, 0x00, 0x05, 0xe7, 0x11, 0x01, + 0xf3, 0x05, 0x00, 0x09, 0xe3, 0x11, 0x01, 0xeb, 0x0d, 0xfb, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0xff, 0x05, 0x05, 0xdf, 0x15, 0x00, 0xf7, 0xff, + 0x0d, 0xfb, 0xf7, 0x05, 0x00, 0x00, 0xfb, 0x01, 0xfb, 0x00, 0x01, 0x05, + 0xef, 0x09, 0xfb, 0x09, 0x00, 0xeb, 0x0d, 0xfb, 0x09, 0xeb, 0x09, 0x00, + 0x09, 0xe7, 0x05, 0x01, 0x01, 0xe3, 0x15, 0x00, 0xff, 0xf7, 0x0d, 0xf7, + 0x00, 0x09, 0xef, 0x01, 0x11, 0xef, 0xf7, 0x11, 0xff, 0xef, 0x09, 0xfb, + 0x01, 0x01, 0x00, 0xeb, 0x15, 0xff, 0xf7, 0x01, 0x00, 0x09, 0xf7, 0xf3, + 0x0d, 0x01, 0xf3, 0xfb, 0x11, 0x00, 0xeb, 0x0d, 0xfb, 0x00, 0x01, 0x00, + 0xf7, 0x00, 0x05, 0x01, 0xef, 0x09, 0x00, 0xff, 0xff, 0x09, 0xeb, 0x00, + 0x11, 0xfb, 0xe7, 0x19, 0xff, 0xfb, 0xfb, 0x11, 0xfb, 0xfb, 0x01, 0xfb, + 0x01, 0x05, 0xff, 0xf7, 0x0d, 0xff, 0xfb, 0x01, 0x00, 0xf7, 0x05, 0x05, + 0xf7, 0xff, 0x09, 0xf7, 0x00, 0x01, 0x05, 0xeb, 0x05, 0x09, 0xff, 0xeb, + 0x15, 0xfb, 0x05, 0xf7, 0xf3, 0x19, 0xff, 0xeb, 0x0d, 0x00, 0xff, 0xf3, + 0x09, 0xfb, 0x09, 0xef, 0x00, 0x01, 0xff, 0x00, 0xff, 0x09, 0xe7, 0x09, + 0x05, 0xf3, 0xff, 0x0d, 0x00, 0xe7, 0x11, 0x00, 0xf3, 0xfb, 0x0d, 0x00, + 0xeb, 0x0d, 0x01, 0xff, 0xf7, 0x09, 0xfb, 0x00, 0x01, 0x01, 0xef, 0x05, + 0x00, 0xff, 0x00, 0x09, 0xeb, 0x05, 0x09, 0xef, 0x01, 0x05, 0x00, 0xeb, + 0x0d, 0x00, 0xfb, 0xf3, 0x11, 0xfb, 0x00, 0x00, 0xfb, 0x05, 0xff, 0xff, + 0x00, 0x00, 0xff, 0x01, 0xef, 0x05, 0x09, 0xfb, 0xf3, 0x0d, 0xfb, 0x01, + 0xff, 0x00, 0xff, 0x01, 0x05, 0xef, 0x00, 0x0d, 0xfb, 0xf3, 0x09, 0x00, + 0xfb, 0xff, 0x01, 0x05, 0xf3, 0xff, 0x09, 0x00, 0xfb, 0xf7, 0x09, 0x01, + 0xf3, 0x01, 0x05, 0xf3, 0xff, 0x01, 0xfb, 0x05, 0x00, 0xf7, 0x05, 0xfb, + 0x01, 0x00, 0xf7, 0x05, 0x00, 0xf7, 0x09, 0x00, 0xeb, 0x0d, 0x01, 0xff, + 0xeb, 0x1d, 0xf7, 0xff, 0xf3, 0x11, 0xfb, 0xf7, 0x05, 0x00, 0xfb, 0xff, + 0x01, 0xfb, 0x00, 0x01, 0x01, 0xe7, 0x0d, 0xff, 0x05, 0xe7, 0x09, 0x01, + 0xff, 0xf3, 0x09, 0xfb, 0x09, 0xf7, 0xfb, 0x09, 0x00, 0xeb, 0x0d, 0x00, + 0xff, 0xef, 0x15, 0xff, 0xef, 0x09, 0x05, 0xef, 0x00, 0x09, 0xf3, 0xfb, + 0x09, 0x00, 0xf3, 0x05, 0xff, 0x09, 0xf3, 0xfb, 0x09, 0x01, 0xeb, 0x09, + 0x01, 0xeb, 0x0d, 0x00, 0xeb, 0x11, 0xff, 0xf7, 0x01, 0x05, 0xef, 0x01, + 0x05, 0xf3, 0x05, 0x00, 0x00, 0xff, 0xef, 0x11, 0x00, 0xf3, 0x09, 0xff, + 0x01, 0xff, 0xef, 0x09, 0x00, 0x01, 0xef, 0x09, 0x00, 0xfb, 0xff, 0x09, + 0xf3, 0x01, 0x05, 0xf7, 0xff, 0x01, 0x09, 0xef, 0xfb, 0x11, 0x00, 0xe7, + 0x11, 0x00, 0xef, 0x09, 0x00, 0x00, 0xef, 0x0d, 0xff, 0x00, 0x00, 0x05, + 0xe7, 0x05, 0x09, 0xff, 0xef, 0x0d, 0xff, 0x05, 0xe7, 0x0d, 0x01, 0x00, + 0xeb, 0x11, 0xfb, 0x00, 0x00, 0xf3, 0x09, 0x01, 0xff, 0xf3, 0x0d, 0xfb, + 0xff, 0x05, 0xff, 0xfb, 0x05, 0x01, 0xeb, 0x09, 0x01, 0xfb, 0xf7, 0x0d, + 0x00, 0xe7, 0x11, 0x00, 0x01, 0xeb, 0x15, 0xff, 0xf7, 0xff, 0x0d, 0xfb, + 0xef, 0x11, 0x00, 0xef, 0x01, 0x0d, 0xeb, 0x09, 0x01, 0x00, 0xef, 0x0d, + 0xf7, 0x09, 0xff, 0xf3, 0x09, 0xff, 0xfb, 0xff, 0x05, 0xfb, 0x00, 0x05, + 0x01, 0xdf, 0x1d, 0xfb, 0xfb, 0xfb, 0x0d, 0xfb, 0xf3, 0x09, 0xfb, 0x01, + 0x01, 0xef, 0x05, 0x01, 0x05, 0xeb, 0x09, 0x00, 0x05, 0xf7, 0xf7, 0x15, + 0xff, 0xef, 0x09, 0x05, 0xef, 0x09, 0x00, 0x00, 0xf3, 0x05, 0x00, 0xfb, + 0x00, 0x05, 0xfb, 0xeb, 0x19, 0xf7, 0x01, 0xef, 0x0d, 0x00, 0xfb, 0xfb, + 0x05, 0x00, 0x01, 0xf3, 0x00, 0x09, 0xfb, 0xf7, 0x09, 0x01, 0xf3, 0x01, + 0x05, 0xfb, 0xff, 0x0d, 0xf3, 0xf7, 0x11, 0x00, 0xef, 0x05, 0x00, 0x05, + 0xf3, 0xff, 0x05, 0xff, 0xff, 0x05, 0xef, 0x05, 0x05, 0xf3, 0xfb, 0x0d, + 0xff, 0x01, 0xef, 0x09, 0x01, 0xff, 0xf7, 0x05, 0x01, 0xf7, 0x05, 0x01, + 0xf7, 0xfb, 0x0d, 0xfb, 0xf7, 0x05, 0x00, 0xff, 0xff, 0x01, 0x05, 0xf7, + 0xf7, 0x11, 0xf7, 0xf7, 0x05, 0x05, 0xf7, 0xfb, 0x09, 0x00, 0xff, 0xfb, + 0x09, 0xf7, 0xfb, 0x0d, 0x00, 0xf3, 0x00, 0x0d, 0xf3, 0xf7, 0x11, 0xfb, + 0xff, 0x01, 0xff, 0xff, 0x09, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0x01, 0x00, + 0x05, 0xfb, 0xff, 0x05, 0xfb, 0xf7, 0x09, 0x01, 0xe7, 0x11, 0x00, 0xff, + 0xef, 0x11, 0xff, 0xf3, 0x09, 0x00, 0xff, 0x00, 0xff, 0x00, 0x01, 0x00, + 0xf3, 0x09, 0x01, 0xfb, 0xf3, 0x15, 0xff, 0xeb, 0x11, 0x00, 0xef, 0x05, + 0xfb, 0x09, 0xf7, 0x01, 0x01, 0xf7, 0xff, 0x09, 0xfb, 0xfb, 0x01, 0x01, + 0x01, 0xe3, 0x15, 0xff, 0xff, 0xef, 0x11, 0xff, 0xf3, 0x00, 0x00, 0x05, + 0xfb, 0xf3, 0x11, 0xf3, 0x09, 0xfb, 0xf7, 0x0d, 0xfb, 0x00, 0xff, 0x05, + 0xff, 0xe7, 0x21, 0xef, 0x05, 0xfb, 0xff, 0x01, 0x01, 0xfb, 0xff, 0x01, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x05, 0xeb, 0x11, 0xff, 0xf3, 0x09, + 0x00, 0x01, 0xeb, 0x11, 0xfb, 0xf7, 0x09, 0xf7, 0x01, 0x01, 0xff, 0xfb, + 0x01, 0x00, 0xfb, 0x01, 0x01, 0xfb, 0xef, 0x19, 0xff, 0xeb, 0x09, 0x00, + 0x01, 0xfb, 0xf3, 0x11, 0x00, 0xf3, 0x00, 0x01, 0x01, 0x00, 0xf3, 0x09, + 0xfb, 0x09, 0xfb, 0xef, 0x15, 0xf7, 0x00, 0x00, 0xf7, 0x01, 0x01, 0xf7, + 0x05, 0x00, 0xff, 0xfb, 0xff, 0x09, 0x00, 0xeb, 0x0d, 0xff, 0x05, 0xf3, + 0xff, 0x0d, 0xfb, 0xf3, 0x09, 0x01, 0xf7, 0xff, 0x05, 0xf7, 0x01, 0xfb, + 0x00, 0x05, 0xf3, 0x01, 0x01, 0xf7, 0xff, 0x01, 0x01, 0xfb, 0xf3, 0x15, + 0xff, 0xf3, 0x05, 0x00, 0xfb, 0xff, 0x05, 0xf3, 0x05, 0x00, 0xfb, 0xff, + 0x01, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0x01, 0xeb, 0x05, 0x01, 0xff, 0xfb, + 0x05, 0xff, 0x09, 0xef, 0x00, 0x09, 0x00, 0xef, 0x0d, 0x00, 0xf3, 0x05, + 0x00, 0x00, 0xf3, 0x15, 0xf3, 0xf3, 0x15, 0xf3, 0xfb, 0x09, 0x01, 0xef, + 0x05, 0xff, 0x01, 0x00, 0xf7, 0x01, 0x05, 0xf7, 0x00, 0x09, 0xe7, 0x0d, + 0x01, 0xfb, 0xf7, 0x09, 0x00, 0xef, 0x05, 0x01, 0xff, 0xf7, 0x05, 0xfb, + 0x05, 0xfb, 0xfb, 0x05, 0xfb, 0x01, 0x00, 0x00, 0xff, 0xff, 0x05, 0xff, + 0xfb, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xf7, 0x09, 0xff, 0x01, 0xef, + 0x09, 0xfb, 0x09, 0xef, 0x00, 0x01, 0x01, 0xfb, 0xf7, 0x0d, 0xff, 0xf3, + 0x05, 0xff, 0x01, 0x00, 0xef, 0x0d, 0xff, 0x05, 0xff, 0xf3, 0x0d, 0x00, + 0xf7, 0xff, 0x05, 0xff, 0x05, 0xf7, 0xfb, 0x09, 0x01, 0xef, 0x01, 0x05, + 0x00, 0xef, 0x09, 0x00, 0x01, 0xeb, 0x0d, 0x00, 0xf3, 0x01, 0x05, 0x00, + 0xf3, 0x11, 0xff, 0xef, 0x11, 0xff, 0xff, 0xf7, 0x0d, 0xff, 0xef, 0x0d, + 0xff, 0x01, 0xeb, 0x0d, 0xff, 0x00, 0xfb, 0xff, 0x01, 0xfb, 0x00, 0x01, + 0x00, 0xe7, 0x19, 0xf7, 0xfb, 0x05, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xfb, 0x05, 0xff, 0xff, 0x00, 0x00, 0x01, 0x05, 0xe7, 0x15, + 0x00, 0xfb, 0xfb, 0x01, 0x05, 0xf7, 0xfb, 0x09, 0x00, 0xff, 0x00, 0x01, + 0xf3, 0x0d, 0xff, 0xf3, 0x0d, 0x00, 0xff, 0xf3, 0x11, 0xff, 0xf7, 0x00, + 0x05, 0xff, 0xfb, 0xff, 0x05, 0x01, 0xf7, 0xf7, 0x11, 0x00, 0xf3, 0xff, + 0x09, 0xff, 0xff, 0x00, 0xff, 0x00, 0x01, 0xfb, 0xf7, 0x0d, 0x00, 0xf7, + 0x00, 0x00, 0x01, 0xff, 0xf7, 0x09, 0x00, 0xf3, 0x00, 0x05, 0xff, 0xef, + 0x11, 0xff, 0xf3, 0x05, 0x01, 0x00, 0xef, 0x11, 0xff, 0xf3, 0x05, 0x01, + 0xf7, 0xf7, 0x11, 0xff, 0xef, 0x0d, 0x00, 0xfb, 0xf7, 0x0d, 0xff, 0xef, + 0x0d, 0x00, 0x00, 0xf7, 0x09, 0x01, 0xf3, 0x01, 0x00, 0x05, 0xef, 0x01, + 0x05, 0x00, 0xef, 0x0d, 0xff, 0xff, 0xff, 0x05, 0xfb, 0x00, 0x01, 0x05, + 0xe3, 0x11, 0xff, 0x01, 0xff, 0xf3, 0x11, 0x00, 0xef, 0x09, 0x00, 0x00, + 0xef, 0x0d, 0xff, 0xfb, 0x01, 0x01, 0xf3, 0x00, 0x09, 0xfb, 0xfb, 0x00, + 0x00, 0x05, 0xf3, 0x05, 0x01, 0xf7, 0x00, 0x05, 0xfb, 0xfb, 0x05, 0x00, + 0xfb, 0xfb, 0x0d, 0xef, 0xfb, 0x0d, 0xff, 0xef, 0x09, 0x01, 0xfb, 0xf7, + 0x09, 0x01, 0xf7, 0xfb, 0x0d, 0xf7, 0xfb, 0x09, 0x00, 0xf3, 0x01, 0x09, + 0xfb, 0xf3, 0x11, 0xff, 0xef, 0x09, 0xff, 0x01, 0xef, 0x09, 0xff, 0x01, + 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x05, 0xef, 0xff, + 0x0d, 0xfb, 0xff, 0x01, 0xff, 0xfb, 0x00, 0x00, 0x01, 0xfb, 0xff, 0x0d, + 0xeb, 0x05, 0x01, 0x05, 0xeb, 0x09, 0x01, 0xfb, 0xf7, 0x0d, 0xf7, 0xff, + 0x09, 0x00, 0xf7, 0x00, 0x01, 0x01, 0xff, 0xf3, 0x11, 0xfb, 0xfb, 0xff, + 0x09, 0xf7, 0xf7, 0x11, 0xff, 0xef, 0x09, 0x00, 0x01, 0xef, 0x0d, 0xff, + 0x01, 0xf3, 0x05, 0x01, 0x00, 0xf3, 0x09, 0x00, 0xff, 0xff, 0x05, 0xff, + 0x00, 0x05, 0xfb, 0xef, 0x15, 0xff, 0xf3, 0x05, 0x05, 0xfb, 0xf3, 0x0d, + 0x00, 0xff, 0xf7, 0x09, 0xfb, 0xf7, 0x11, 0xf7, 0xfb, 0x05, 0x01, 0xfb, + 0xf7, 0x15, 0xf7, 0xef, 0x11, 0xff, 0xff, 0xfb, 0x01, 0x01, 0xff, 0xf7, + 0x09, 0xff, 0x00, 0xfb, 0x00, 0x01, 0xff, 0x05, 0xff, 0xf3, 0x11, 0xff, + 0xf3, 0x05, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xfb, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0xe7, 0x0d, 0x00, 0xff, 0xf7, + 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x01, + 0xf3, 0x00, 0x01, 0x01, 0xef, 0x09, 0x00, 0xf7, 0x00, 0xff, 0x09, 0xf3, + 0xff, 0x05, 0x01, 0xef, 0x05, 0x01, 0x00, 0xef, 0x0d, 0xff, 0xfb, 0x01, + 0x05, 0xeb, 0x09, 0x00, 0xff, 0xf3, 0x0d, 0x00, 0xf7, 0x00, 0x01, 0x00, + 0xff, 0x01, 0xff, 0x00, 0x01, 0xff, 0xef, 0x0d, 0xfb, 0x01, 0xff, 0xfb, + 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xf7, 0x09, 0x00, 0xff, 0xfb, + 0x09, 0xf3, 0x05, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfb, 0x01, 0x01, 0xfb, + 0xfb, 0x09, 0x00, 0xfb, 0xff, 0x05, 0x01, 0xf3, 0x00, 0x09, 0xf7, 0x01, + 0xff, 0x00, 0x00, 0x00, 0x01, 0xf7, 0xff, 0x09, 0xff, 0xfb, 0x01, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xf3, 0x05, 0x00, 0xff, 0x00, 0x00, + 0xff, 0x00, 0x05, 0xeb, 0x05, 0x01, 0xff, 0xf3, 0x09, 0xff, 0xf7, 0x05, + 0xfb, 0x05, 0xfb, 0xff, 0x05, 0xf7, 0x01, 0x01, 0x01, 0xef, 0x11, 0xff, + 0xf3, 0x05, 0x01, 0x00, 0xef, 0x11, 0xff, 0xf3, 0x05, 0xfb, 0x09, 0xf3, + 0x00, 0x05, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x01, 0x00, 0xfb, 0xfb, + 0x0d, 0xf7, 0xff, 0x05, 0x00, 0xf7, 0x00, 0x01, 0x01, 0xf7, 0x00, 0x00, + 0x01, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x00, 0xeb, 0x11, 0xfb, 0x05, + 0xf3, 0x05, 0x01, 0xf3, 0x01, 0x00, 0x00, 0xef, 0x11, 0xfb, 0xf7, 0x09, + 0xfb, 0xff, 0x01, 0x01, 0xf3, 0x01, 0x05, 0x00, 0xf7, 0x05, 0x00, 0xff, + 0xff, 0x00, 0x05, 0xfb, 0xfb, 0x05, 0x01, 0xfb, 0xf7, 0x11, 0xfb, 0xfb, + 0x05, 0x00, 0xf7, 0x00, 0x09, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0x01, 0x05, + 0xff, 0xf7, 0x11, 0xfb, 0xf3, 0x11, 0xf3, 0x01, 0x00, 0x00, 0x01, 0xfb, + 0xf3, 0x11, 0xf7, 0x01, 0xfb, 0x00, 0x05, 0x00, 0xfb, 0xff, 0x01, 0x01, + 0xff, 0xf7, 0x05, 0x00, 0x01, 0xf3, 0x09, 0x01, 0xf7, 0x00, 0x01, 0x01, + 0xf7, 0xfb, 0x09, 0x01, 0xef, 0x01, 0x01, 0x01, 0xef, 0x05, 0x01, 0xf7, + 0x00, 0x05, 0x00, 0xf3, 0x0d, 0xff, 0xf3, 0x09, 0x01, 0xfb, 0xf7, 0x09, + 0x01, 0xf3, 0x05, 0xff, 0x05, 0xff, 0xef, 0x11, 0xfb, 0xff, 0xff, 0x05, + 0xfb, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, + 0xeb, 0x19, 0xf7, 0xfb, 0x05, 0x00, 0xef, 0x0d, 0x00, 0x00, 0xef, 0x15, + 0xfb, 0xf3, 0x09, 0xff, 0xff, 0xf7, 0x0d, 0xfb, 0xf3, 0x09, 0xff, 0x01, + 0xef, 0x0d, 0x00, 0xf7, 0x05, 0x01, 0xfb, 0xfb, 0x09, 0x00, 0xef, 0x09, + 0xff, 0x01, 0xef, 0x09, 0xff, 0x01, 0xf7, 0xff, 0x05, 0xff, 0x00, 0xf3, + 0x0d, 0xff, 0xff, 0x00, 0x01, 0xff, 0x00, 0x01, 0xef, 0x05, 0x00, 0xff, + 0xfb, 0x00, 0x01, 0xfb, 0x00, 0x01, 0x01, 0xf3, 0x01, 0x05, 0xf3, 0x01, + 0x01, 0x00, 0xf3, 0x11, 0xfb, 0xf3, 0x09, 0xff, 0xff, 0xfb, 0x0d, 0xff, + 0xf3, 0x09, 0xff, 0x05, 0xef, 0x05, 0x01, 0xff, 0xf3, 0x09, 0x00, 0xf7, + 0x00, 0x09, 0xef, 0x01, 0x00, 0x05, 0xef, 0x05, 0x00, 0x01, 0xef, 0x09, + 0xff, 0x00, 0xef, 0x11, 0xfb, 0xff, 0xff, 0x01, 0xff, 0xff, 0x01, 0x05, + 0xeb, 0x09, 0x01, 0xfb, 0xfb, 0x09, 0xfb, 0xf3, 0x09, 0xff, 0x00, 0xff, + 0x00, 0x01, 0x00, 0xef, 0x09, 0xff, 0x01, 0x00, 0x00, 0xfb, 0x05, 0xff, + 0xef, 0x11, 0xff, 0xff, 0xfb, 0x05, 0xff, 0x05, 0xf7, 0xfb, 0x09, 0x00, + 0xfb, 0xf7, 0x0d, 0xfb, 0xff, 0x01, 0xff, 0xfb, 0x05, 0x01, 0xf3, 0x05, + 0x01, 0x01, 0xef, 0x09, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xf7, 0x09, 0x00, + 0xf3, 0x09, 0x00, 0x01, 0xef, 0x09, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x00, + 0xfb, 0xff, 0x01, 0xff, 0xff, 0x05, 0xf7, 0xff, 0x05, 0xff, 0xff, 0xff, + 0x05, 0xef, 0x05, 0x05, 0xfb, 0xf3, 0x09, 0x01, 0xfb, 0xf7, 0x09, 0x00, + 0xff, 0xf7, 0x0d, 0xff, 0xf7, 0x00, 0x05, 0xfb, 0xff, 0x09, 0xef, 0x00, + 0x05, 0x00, 0xef, 0x0d, 0x00, 0xfb, 0xfb, 0x09, 0x00, 0xf3, 0x01, 0x01, + 0xff, 0xf7, 0x05, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x01, 0xef, 0x01, 0x05, 0x00, 0xf7, 0x09, 0xf3, 0x05, + 0x00, 0x01, 0xf7, 0x00, 0x05, 0x00, 0xff, 0xf7, 0x0d, 0xfb, 0xff, 0x01, + 0x01, 0xf7, 0xfb, 0x0d, 0xfb, 0xf3, 0x11, 0xf7, 0x00, 0x01, 0xff, 0xff, + 0x00, 0x01, 0xff, 0xef, 0x19, 0xf7, 0xf7, 0x09, 0x00, 0xff, 0xfb, 0x05, + 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x09, 0x00, + 0xf3, 0x05, 0x00, 0x00, 0xf3, 0x0d, 0xff, 0xf7, 0x05, 0xff, 0x05, 0xf3, + 0x05, 0x05, 0xf7, 0x00, 0x05, 0xff, 0xfb, 0x05, 0x01, 0xf3, 0x01, 0x01, + 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xfb, 0x0d, 0xff, 0xf3, 0x0d, 0xfb, + 0x01, 0x00, 0xef, 0x0d, 0xfb, 0x01, 0xf7, 0xff, 0x01, 0xff, 0x00, 0xff, + 0x01, 0x01, 0xfb, 0xff, 0x01, 0x01, 0xff, 0xfb, 0x09, 0xf3, 0x01, 0x00, + 0x01, 0xf3, 0x01, 0x05, 0xf7, 0x00, 0x05, 0x01, 0xef, 0x09, 0x00, 0x00, + 0xf7, 0x05, 0x00, 0x00, 0xf7, 0x09, 0xfb, 0xfb, 0x01, 0x00, 0xfb, 0x00, + 0x05, 0xff, 0xf3, 0x11, 0xfb, 0xfb, 0x00, 0x01, 0x00, 0x05, 0xef, 0x09, + 0x01, 0xfb, 0xff, 0x05, 0x00, 0xff, 0xfb, 0x05, 0xff, 0x00, 0x00, 0xf3, + 0x05, 0x01, 0xf7, 0x00, 0x01, 0x01, 0xf3, 0x01, 0x00, 0x01, 0xf7, 0x09, + 0xfb, 0xff, 0x01, 0x01, 0xf3, 0x01, 0x00, 0x01, 0xf3, 0x00, 0x05, 0x00, + 0xef, 0x0d, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, + 0xfb, 0x05, 0xff, 0xff, 0x01, 0xff, 0x00, 0xff, 0x00, 0x01, 0xf3, 0x09, + 0x00, 0x00, 0xf7, 0x09, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0xfc, 0xf0, 0x10, 0xfc, 0xf8, 0x04, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0c, 0xfc, 0x00, 0x00, 0x04, + 0xfc, 0xf8, 0x0b, 0x00, 0xf8, 0x00, 0x04, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0xfc, 0x04, 0x00, 0xf5, 0x00, 0x00, 0x00, 0xf2, 0x07, 0x00, 0xf9, 0x00, + 0x04, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xf6, 0x07, + 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfd, 0x00, + 0x00, 0x00, 0xfd, 0xfd, 0x00, 0xfd, 0x03, 0x00, 0xf7, 0x06, 0x00, 0xfd, + 0x00, 0x03, 0x00, 0x00, 0x00, 0xf7, 0x03, 0x00, 0xfa, 0x00, 0x00, 0x00, + 0xf7, 0x03, 0x00, 0x00, 0xf7, 0x06, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xf5, + 0x09, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfa, 0x08, 0xfd, 0xfa, 0x06, 0xfd, + 0x05, 0xfb, 0x00, 0x03, 0x00, 0xfd, 0xfd, 0x08, 0x00, 0xfb, 0x03, 0x00, + 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, + 0x00, 0xf7, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x00, 0x04, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xfa, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x09, 0xfc, 0xfe, 0x02, 0x00, 0xfe, + 0xfe, 0x04, 0x00, 0xfb, 0x03, 0x00, 0xfe, 0x00, 0x03, 0x00, 0xfd, 0x03, + 0x00, 0xfe, 0xfe, 0x05, 0x00, 0xfb, 0x03, 0x00, 0xfd, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfc, + 0x04, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x02, + 0x00, 0x00, 0xff, 0x02, 0xff, 0x00, 0x01, 0x00, 0xfd, 0x02, 0x00, 0x00, + 0xfa, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xfe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfd, 0x01, + 0x00, 0xff, 0x00, 0x01, 0x00, 0xfe, 0x02, 0x00, 0xff, 0x01, 0x00, 0x00, + 0xff, 0x02, 0x00, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, + 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0x01, 0xf8, 0xf9, 0xf6, 0xee, 0xff, + 0xfb, 0xf7, 0xf5, 0xf5, 0x09, 0xea, 0x0f, 0x27, 0x48, 0x00, 0x25, 0xd5, + 0xe7, 0x23, 0x1c, 0xe7, 0x02, 0xc2, 0xab, 0xb6, 0xaf, 0xb5, 0xc8, 0xa1, + 0x07, 0x1a, 0xce, 0xeb, 0x0a, 0x33, 0x5f, 0x73, 0x63, 0x7f, 0x7f, 0x7d, + 0x7c, 0x52, 0x5b, 0x73, 0x64, 0xf2, 0xc9, 0xdf, 0xf8, 0xdb, 0xef, 0xd0, + 0xa4, 0x80, 0x8b, 0x80, 0x80, 0x80, 0x80, 0x89, 0xb2, 0xd3, 0xf7, 0xff, + 0xf1, 0xfe, 0x3f, 0x74, 0x77, 0x7f, 0x79, 0x68, 0x42, 0x10, 0xf7, 0xf1, + 0xf9, 0xf8, 0xdc, 0xa2, 0x9d, 0xc7, 0xb0, 0x80, 0x80, 0x97, 0xa2, 0xbf, + 0x17, 0x4d, 0x5f, 0x51, 0x5e, 0x7f, 0x7f, 0x7f, 0x7f, 0x72, 0x5a, 0x54, + 0x4d, 0x30, 0x16, 0xfc, 0xe8, 0xcf, 0xc0, 0xa0, 0x8d, 0x80, 0x80, 0x80, + 0x8d, 0xb3, 0xc3, 0xa0, 0xa3, 0xca, 0xdd, 0xe7, 0xf7, 0x03, 0x0a, 0x0b, + 0x1d, 0x30, 0x3d, 0x4f, 0x5d, 0x54, 0x51, 0x5a, 0x55, 0x46, 0x30, 0x2d, + 0x28, 0x04, 0xe6, 0xc7, 0xc3, 0xcf, 0xc7, 0xb5, 0xa8, 0xb0, 0xc7, 0xec, + 0xea, 0xf2, 0xfb, 0x09, 0x0a, 0x29, 0x49, 0x4b, 0x51, 0x36, 0x45, 0x5a, + 0x30, 0x00, 0xcc, 0xd2, 0xd1, 0xbe, 0xbc, 0xa8, 0x94, 0xa9, 0xd5, 0xe7, + 0xd6, 0xdf, 0xf7, 0x09, 0x19, 0x0d, 0x25, 0x3f, 0x49, 0x44, 0x3c, 0x39, + 0x2e, 0x30, 0x19, 0x08, 0x02, 0xf9, 0xff, 0x0c, 0x02, 0xfc, 0xf3, 0xe3, + 0xd2, 0xd3, 0xcc, 0xcd, 0xe1, 0xf0, 0xec, 0xe0, 0xc7, 0xcd, 0xd8, 0xe1, + 0xde, 0xeb, 0x0d, 0x2d, 0x39, 0x43, 0x43, 0x3f, 0x3a, 0x3e, 0x3f, 0x3c, + 0x22, 0x1c, 0x0d, 0xfe, 0xf0, 0xd1, 0xc6, 0xb6, 0xaa, 0xad, 0xb2, 0xb3, + 0xc5, 0xef, 0x03, 0x11, 0x1c, 0x19, 0x17, 0x1a, 0x17, 0x23, 0x31, 0x2e, + 0x37, 0x32, 0x1b, 0x06, 0xf8, 0xe5, 0xca, 0xcd, 0xd2, 0xd3, 0xd4, 0xd7, + 0xef, 0x06, 0xf0, 0xec, 0xf8, 0xf1, 0x07, 0x08, 0x0d, 0x14, 0x19, 0x10, + 0x0a, 0x04, 0xfc, 0x0c, 0x10, 0x0b, 0x12, 0x12, 0x22, 0x1e, 0x22, 0x10, + 0x04, 0x05, 0x00, 0xf0, 0xdf, 0xd4, 0xc6, 0xc9, 0xd3, 0xd3, 0xd5, 0xca, + 0xcc, 0xd1, 0xe5, 0xf3, 0x01, 0x0d, 0x2a, 0x39, 0x43, 0x43, 0x39, 0x28, + 0x1c, 0x1e, 0x18, 0x13, 0x08, 0x01, 0xf5, 0xe3, 0xd5, 0xd3, 0xce, 0xc2, + 0xbf, 0xcb, 0xdf, 0xf7, 0x07, 0x06, 0x0e, 0x1c, 0x12, 0x12, 0x10, 0x0c, + 0x08, 0x0d, 0x0b, 0x10, 0x0a, 0xfb, 0xfa, 0x00, 0xf8, 0xf1, 0xfb, 0xfc, + 0xfe, 0x07, 0x15, 0x10, 0x09, 0x00, 0xee, 0xe6, 0xdf, 0xdb, 0xdf, 0xdf, + 0xe8, 0xfa, 0xfc, 0xf3, 0xfa, 0xf4, 0xf8, 0x0a, 0x17, 0x20, 0x2a, 0x2b, + 0x33, 0x32, 0x21, 0x15, 0x06, 0xfc, 0xf2, 0xed, 0xe3, 0xda, 0xce, 0xc5, + 0xc2, 0xc3, 0xc8, 0xca, 0xd4, 0xe1, 0xec, 0xff, 0x15, 0x1d, 0x28, 0x30, + 0x31, 0x2e, 0x2e, 0x20, 0x12, 0x0c, 0x11, 0x16, 0x14, 0x14, 0x01, 0xf2, + 0xf4, 0xf5, 0xf6, 0xec, 0xe0, 0xe6, 0xe9, 0xf1, 0xfd, 0xf8, 0xf1, 0xec, + 0xe8, 0xe7, 0xee, 0xf6, 0xfb, 0x04, 0x00, 0xfd, 0x06, 0x0a, 0x0d, 0x0a, + 0x04, 0x0f, 0x1e, 0x24, 0x21, 0x08, 0xff, 0xfa, 0xf5, 0xee, 0xec, 0xe0, + 0xd5, 0xd0, 0xda, 0xed, 0xf7, 0xf7, 0xf4, 0xf9, 0x03, 0x05, 0x0d, 0x12, + 0x17, 0x1f, 0x25, 0x2c, 0x28, 0x1c, 0x08, 0xf7, 0xec, 0xe3, 0xe4, 0xea, + 0xef, 0xed, 0xef, 0xe8, 0xe1, 0xe0, 0xdf, 0xe0, 0xed, 0xf4, 0xff, 0x0b, + 0x11, 0x0d, 0x04, 0x05, 0x10, 0x10, 0x12, 0x12, 0x10, 0x09, 0x0a, 0x13, + 0x13, 0x14, 0x10, 0x0d, 0x0a, 0x03, 0x00, 0xf9, 0xf4, 0xf5, 0xf5, 0xf2, + 0xe7, 0xdf, 0xe3, 0xdd, 0xd3, 0xde, 0xe4, 0xec, 0xf3, 0xfd, 0xfb, 0x03, + 0x08, 0x0b, 0x08, 0x06, 0x0c, 0x17, 0x1b, 0x1c, 0x19, 0x11, 0x05, 0x01, + 0x04, 0x00, 0xf6, 0xf9, 0xf1, 0xf1, 0xf3, 0xef, 0xea, 0xef, 0xf7, 0x02, + 0x00, 0xfc, 0x00, 0xfe, 0x07, 0x18, 0x19, 0x16, 0x0e, 0x08, 0xfc, 0xf6, + 0xec, 0xea, 0xf0, 0xf1, 0xfa, 0xf7, 0xf8, 0xef, 0xe9, 0xe5, 0xeb, 0xe8, + 0xea, 0xf2, 0xfe, 0x04, 0x06, 0x0c, 0x11, 0x0d, 0x09, 0x08, 0x06, 0x0a, + 0x10, 0x12, 0x0e, 0x10, 0x0a, 0x05, 0x04, 0x05, 0x03, 0xff, 0xfe, 0x04, + 0xff, 0xfa, 0xf4, 0xf3, 0xf1, 0xea, 0xe7, 0xe6, 0xe4, 0xe7, 0xe7, 0xf7, + 0xfa, 0xfc, 0x03, 0x06, 0x03, 0x06, 0x00, 0xff, 0x04, 0x10, 0x13, 0x13, + 0x12, 0x08, 0x00, 0xfa, 0xf1, 0xea, 0xe7, 0xe7, 0xf2, 0xfd, 0xfc, 0xfc, + 0xfd, 0x06, 0x08, 0x0d, 0x13, 0x12, 0x12, 0x10, 0x12, 0x11, 0x0c, 0x06, + 0xfd, 0xf9, 0xf2, 0xe9, 0xe7, 0xe6, 0xe1, 0xe5, 0xe7, 0xeb, 0xf5, 0x04, + 0x05, 0x04, 0x04, 0x06, 0x0c, 0x0c, 0x09, 0x07, 0x04, 0xff, 0xf8, 0xef, + 0xe9, 0xe4, 0xeb, 0xf4, 0xfa, 0x01, 0x0b, 0x0a, 0x07, 0x06, 0x0a, 0x0b, + 0x0c, 0x0c, 0x10, 0x10, 0x09, 0x00, 0xf7, 0xef, 0xef, 0xe9, 0xe6, 0xe5, + 0xf1, 0xf2, 0xf5, 0xf9, 0xff, 0x0b, 0x15, 0x16, 0x13, 0x15, 0x14, 0x11, + 0x0c, 0x0b, 0x05, 0x00, 0xf6, 0xec, 0xe4, 0xd7, 0xd9, 0xd9, 0xdf, 0xef, + 0xfa, 0xff, 0x03, 0x0a, 0x10, 0x10, 0x10, 0x12, 0x0c, 0x0c, 0x10, 0x0a, + 0x02, 0xfb, 0xfc, 0xf7, 0xf0, 0xee, 0xf5, 0xfd, 0xff, 0xff, 0x01, 0xfe, + 0xff, 0x05, 0x08, 0x07, 0x07, 0x01, 0xf8, 0xf0, 0xef, 0xeb, 0xe4, 0xe4, + 0xe2, 0xe6, 0xe7, 0xef, 0xf1, 0xf8, 0x04, 0x10, 0x1d, 0x28, 0x2c, 0x29, + 0x20, 0x18, 0x16, 0x10, 0x05, 0xff, 0xf4, 0xea, 0xe6, 0xe4, 0xe2, 0xdc, + 0xdf, 0xe4, 0xec, 0xf3, 0xff, 0x08, 0x0c, 0x10, 0x17, 0x17, 0x14, 0x10, + 0x0b, 0x00, 0xf4, 0xf6, 0xf6, 0xf3, 0xf5, 0xef, 0xe8, 0xe7, 0xed, 0xf7, + 0x00, 0x04, 0x09, 0x09, 0x0b, 0x11, 0x14, 0x11, 0x08, 0xfe, 0xfa, 0xf1, + 0xf4, 0xf0, 0xea, 0xe9, 0xe9, 0xeb, 0xee, 0xf4, 0xfb, 0xff, 0x03, 0x12, + 0x1e, 0x29, 0x28, 0x22, 0x12, 0x07, 0xfe, 0xf1, 0xef, 0xea, 0xe3, 0xdd, + 0xd8, 0xdd, 0xe2, 0xe3, 0xec, 0xf5, 0xfb, 0x06, 0x12, 0x18, 0x18, 0x19, + 0x1b, 0x1c, 0x1d, 0x1b, 0x10, 0x08, 0xfd, 0xee, 0xe8, 0xe5, 0xe7, 0xea, + 0xec, 0xec, 0xef, 0xf9, 0xfb, 0xff, 0x09, 0x12, 0x10, 0x10, 0x18, 0x12, + 0x05, 0xfa, 0xf4, 0xec, 0xea, 0xea, 0xed, 0xec, 0xf1, 0xf6, 0xfb, 0xfd, + 0x06, 0x0b, 0x0f, 0x10, 0x13, 0x10, 0x10, 0x0c, 0x01, 0xfa, 0xf4, 0xee, + 0xe5, 0xe0, 0xde, 0xde, 0xdd, 0xe1, 0xef, 0xff, 0x08, 0x0d, 0x11, 0x12, + 0x16, 0x1d, 0x1e, 0x23, 0x26, 0x20, 0x16, 0x09, 0xfc, 0xec, 0xe3, 0xdf, + 0xe1, 0xe2, 0xe4, 0xe7, 0xeb, 0xf3, 0xf5, 0xf5, 0xf6, 0xfc, 0x04, 0x0d, + 0x11, 0x0d, 0x09, 0x0a, 0x08, 0x04, 0xfe, 0xf7, 0xf2, 0xf2, 0xf7, 0xfa, + 0x01, 0x05, 0x08, 0x08, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x00, 0xfd, 0xfd, + 0xfa, 0xf6, 0xee, 0xe7, 0xdf, 0xe1, 0xe6, 0xed, 0xf1, 0xf6, 0x01, 0x0a, + 0x0f, 0x12, 0x12, 0x10, 0x13, 0x12, 0x0d, 0x0c, 0x08, 0x02, 0xfe, 0xf5, + 0xeb, 0xe1, 0xe1, 0xe3, 0xe8, 0xeb, 0xf1, 0xf6, 0xfb, 0x04, 0x0d, 0x0e, + 0x0c, 0x0f, 0x10, 0x14, 0x16, 0x10, 0x02, 0xfd, 0xfa, 0xf7, 0xf6, 0xf2, + 0xf0, 0xf3, 0xf3, 0xf5, 0xfb, 0x00, 0x02, 0x06, 0x08, 0x06, 0x05, 0x00, + 0xfe, 0xfc, 0xf8, 0xf7, 0xf7, 0xf5, 0xf7, 0xf3, 0xed, 0xed, 0xef, 0xf4, + 0xf7, 0x00, 0x06, 0x0a, 0x12, 0x13, 0x11, 0x0d, 0x0b, 0x0c, 0x05, 0x03, + 0xff, 0xf4, 0xee, 0xed, 0xea, 0xea, 0xe9, 0xed, 0xf2, 0xf8, 0xfa, 0x01, + 0x05, 0x0c, 0x13, 0x15, 0x16, 0x15, 0x10, 0x09, 0x04, 0xff, 0xfb, 0xf9, + 0xf8, 0xf5, 0xf1, 0xed, 0xe8, 0xeb, 0xf2, 0xf3, 0xf7, 0xfd, 0xff, 0x03, + 0x08, 0x07, 0x04, 0x06, 0x05, 0x08, 0x0a, 0x06, 0x01, 0xfa, 0xf7, 0xfb, + 0xfe, 0xf9, 0xfb, 0xfc, 0xfb, 0xf9, 0xf8, 0xf7, 0xf9, 0xfb, 0xfc, 0xfd, + 0xff, 0xfc, 0xf7, 0xf8, 0xf9, 0xf2, 0xf3, 0xf8, 0xfd, 0xff, 0xfe, 0x03, + 0x05, 0x0a, 0x0e, 0x10, 0x0d, 0x0e, 0x0d, 0x0b, 0x09, 0x08, 0x01, 0xfb, + 0xf7, 0xf9, 0xf5, 0xf1, 0xf1, 0xf5, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, + 0xff, 0xff, 0xfd, 0xff, 0x05, 0x07, 0x05, 0x02, 0x04, 0x02, 0xfd, 0xf8, + 0xf4, 0xf3, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf5, 0xf7, 0xf8, 0xfa, 0xfb, + 0xfc, 0x02, 0x05, 0x05, 0x08, 0x09, 0x08, 0x07, 0x07, 0x05, 0x04, 0x07, + 0x0b, 0x0b, 0x0b, 0x09, 0x08, 0x03, 0x00, 0x00, 0xfe, 0xfd, 0xfc, 0xfc, + 0xf7, 0xf6, 0xf5, 0xef, 0xed, 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xf0, 0xef, + 0xf2, 0xf5, 0xf6, 0xfb, 0x02, 0x04, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0a, + 0x08, 0x09, 0x06, 0x03, 0x01, 0xfe, 0xfe, 0xfb, 0xfd, 0xfd, 0xff, 0x00, + 0xfc, 0xfb, 0xfe, 0xff, 0xff, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x01, 0xff, 0xfd, 0xfe, 0xfb, 0xf6, 0xf4, 0xf4, 0xf2, 0xf5, 0xf9, + 0xfb, 0xf8, 0xf7, 0xfa, 0xfa, 0xfb, 0xff, 0x02, 0x02, 0x01, 0xff, 0xfd, + 0xfd, 0xfc, 0xfb, 0xfe, 0x02, 0x03, 0x05, 0x04, 0x01, 0xfe, 0x00, 0x03, + 0x04, 0x04, 0x07, 0x08, 0x06, 0x04, 0x04, 0x00, 0xfe, 0xfd, 0xfd, 0xf9, + 0xf7, 0xf7, 0xf3, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf5, 0xf6, 0xf5, 0xf5, + 0xf8, 0xff, 0x01, 0x00, 0x03, 0x06, 0x02, 0xfe, 0xff, 0x01, 0x01, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x06, 0x06, 0x06, 0x06, 0x05, 0x00, + 0xfd, 0xfc, 0xfb, 0xf9, 0xf8, 0xf7, 0xf8, 0xf7, 0xf9, 0xf9, 0xfb, 0xfd, + 0xfc, 0xfd, 0xff, 0xff, 0x00, 0x02, 0x02, 0x01, 0xff, 0xfc, 0xf7, 0xf6, + 0xf5, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf4, 0xf5, 0xfa, 0xff, 0x02, 0x07, + 0x0d, 0x10, 0x11, 0x13, 0x13, 0x11, 0x0f, 0x10, 0x0c, 0x06, 0x00, 0xfb, + 0xf7, 0xf4, 0xf3, 0xf1, 0xf1, 0xf2, 0xf4, 0xf6, 0xf7, 0xf9, 0xfa, 0xfa, + 0xfa, 0xfe, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xfd, 0xfb, 0xfc, 0xfd, + 0xfc, 0xfc, 0xfd, 0xff, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05, 0x06, 0x04, + 0x00, 0xff, 0xfe, 0xfb, 0xf9, 0xf8, 0xf5, 0xf2, 0xf0, 0xf3, 0xf7, 0xfc, + 0xff, 0x00, 0x04, 0x07, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x05, 0x02, 0xfe, + 0xf8, 0xf5, 0xef, 0xed, 0xee, 0xef, 0xef, 0xf2, 0xf5, 0xf8, 0xfc, 0xfe, + 0xff, 0x04, 0x09, 0x0e, 0x11, 0x10, 0x0c, 0x08, 0x06, 0x03, 0x01, 0x02, + 0x00, 0xfe, 0xfc, 0xfd, 0xfc, 0xfb, 0xfa, 0xfb, 0xfc, 0xff, 0xfe, 0xfe, + 0xfe, 0xfb, 0xf9, 0xf7, 0xf6, 0xf6, 0xf5, 0xf2, 0xef, 0xf0, 0xf2, 0xf5, + 0xfa, 0xfe, 0xff, 0x04, 0x09, 0x0f, 0x10, 0x10, 0x10, 0x0e, 0x0b, 0x07, + 0x03, 0xff, 0xf8, 0xf3, 0xef, 0xee, 0xf0, 0xf1, 0xef, 0xf2, 0xf5, 0xf5, + 0xf9, 0xfe, 0x03, 0x07, 0x0b, 0x0d, 0x10, 0x11, 0x10, 0x09, 0x02, 0xfe, + 0xfc, 0xfb, 0xfa, 0xf8, 0xf3, 0xf2, 0xf4, 0xf2, 0xf2, 0xf4, 0xf7, 0xf9, + 0xfa, 0xfc, 0xfe, 0x00, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfd, 0xfc, 0xfc, + 0xfb, 0xfd, 0x00, 0x01, 0x07, 0x0b, 0x0b, 0x0c, 0x0d, 0x0c, 0x0c, 0x08, + 0x06, 0x03, 0xff, 0xfb, 0xf7, 0xf1, 0xee, 0xed, 0xeb, 0xea, 0xed, 0xf0, + 0xf3, 0xf6, 0xfc, 0x01, 0x04, 0x07, 0x0b, 0x0e, 0x10, 0x10, 0x0e, 0x09, + 0x05, 0x02, 0xfd, 0xf9, 0xf5, 0xf0, 0xee, 0xef, 0xef, 0xef, 0xf1, 0xf3, + 0xf9, 0xfe, 0x00, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x05, 0x04, 0x02, + 0x00, 0xff, 0xfd, 0xfc, 0xfb, 0xfd, 0xff, 0xff, 0x01, 0x02, 0x02, 0x01, + 0x00, 0xff, 0xfb, 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf3, 0xf0, 0xef, 0xf0, + 0xf2, 0xf5, 0xf9, 0xff, 0x05, 0x08, 0x0d, 0x10, 0x11, 0x12, 0x11, 0x10, + 0x0d, 0x0a, 0x06, 0x00, 0xfa, 0xf6, 0xf3, 0xef, 0xed, 0xed, 0xeb, 0xec, + 0xf0, 0xf4, 0xf9, 0xfe, 0x02, 0x06, 0x08, 0x08, 0x08, 0x07, 0x04, 0x03, + 0x03, 0x03, 0x01, 0x00, 0xfd, 0xf9, 0xf7, 0xfa, 0xfc, 0xfc, 0xfd, 0xfc, + 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfb, + 0xf9, 0xfb, 0xfd, 0x00, 0x01, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x02, 0x00, 0xfb, 0xf7, 0xf5, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf5, 0xf8, 0xfb, 0xfe, 0x00, 0x02, 0x05, 0x07, 0x07, 0x05, 0x04, + 0x04, 0x01, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, + 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0x01, 0x03, 0x04, 0x03, 0x03, 0x01, 0xff, + 0xfc, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xff, + 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, + 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0xff, 0xfd, 0xfc, 0xfa, 0xf9, 0xf9, 0xf9, + 0xf9, 0xfa, 0xfb, 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfc, 0xfb, 0xfc, + 0xfb, 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x03, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0xfd, 0xfe, + 0xfe, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0xc8, 0x18, 0x65, 0xbb, 0xbb, 0x2b, 0x07, + 0xfd, 0xe1, 0xb4, 0x5f, 0x38, 0xb2, 0xd0, 0x40, 0x06, 0x7f, 0x0f, 0x37, + 0xfc, 0xb7, 0x13, 0x64, 0x08, 0x0f, 0x1f, 0x40, 0xf3, 0xd2, 0xa8, 0x44, + 0x63, 0x2e, 0x1a, 0x01, 0x99, 0xfc, 0x57, 0xe3, 0x30, 0xe3, 0xa7, 0xb5, + 0x61, 0x4e, 0xf3, 0x33, 0xf1, 0xea, 0x09, 0xc3, 0xd0, 0x62, 0xbb, 0xe3, + 0xcc, 0xba, 0x24, 0xb1, 0xe0, 0xca, 0x07, 0x02, 0xa2, 0xcf, 0xee, 0xd6, + 0xc3, 0x01, 0xf6, 0xd5, 0xac, 0xe4, 0xa8, 0xec, 0x2a, 0xed, 0xc3, 0x2c, + 0x03, 0xf6, 0xce, 0xf6, 0xff, 0x35, 0xf1, 0xa0, 0x0e, 0xba, 0x0f, 0x2e, + 0x3a, 0x48, 0xf0, 0xaa, 0xcd, 0x01, 0xe4, 0xf6, 0xf3, 0x02, 0x01, 0x17, + 0x13, 0x22, 0x61, 0xf8, 0xdb, 0x37, 0xee, 0x12, 0x35, 0x3f, 0x20, 0x49, + 0x58, 0x42, 0x6e, 0x63, 0x3e, 0xfc, 0x5f, 0x43, 0x42, 0x08, 0x33, 0x7f, + 0x22, 0x49, 0x54, 0x37, 0x35, 0xf2, 0x5e, 0x18, 0x59, 0x38, 0x20, 0x04, + 0x53, 0x03, 0x2a, 0x27, 0x1a, 0x1c, 0x15, 0x0f, 0x0d, 0x06, 0x0a, 0xfe, + 0xfb, 0xff, 0xfc, 0xf9, 0xfc, 0xf9, 0xf2, 0xec, 0xed, 0xed, 0xe2, 0xd9, + 0xe6, 0xdd, 0xd8, 0xd6, 0xe3, 0xd4, 0xcb, 0xd4, 0xdd, 0xea, 0xbf, 0x9e, + 0x9b, 0x84, 0x9a, 0xa2, 0xa7, 0xad, 0x9d, 0xa3, 0xa3, 0xae, 0xa9, 0xa9, + 0xc3, 0xbe, 0xc5, 0xc4, 0xa6, 0xd1, 0xbb, 0xd4, 0xd7, 0xdc, 0xed, 0xd1, + 0xe0, 0x18, 0xf8, 0xc5, 0x18, 0x07, 0xeb, 0x04, 0x1b, 0x7f, 0x00, 0x28, + 0x7f, 0x0f, 0x1b, 0x4b, 0x51, 0x14, 0xc8, 0x3e, 0x7c, 0x2d, 0x15, 0x35, + 0x4a, 0xd4, 0xbb, 0x1b, 0xee, 0x2d, 0x0c, 0x0d, 0x2b, 0x50, 0x02, 0xec, + 0x0c, 0xfd, 0x05, 0x22, 0x31, 0x14, 0x2a, 0x25, 0x13, 0x3e, 0x48, 0x36, + 0x20, 0xd4, 0x26, 0x3d, 0x1d, 0x25, 0x2f, 0x1c, 0x26, 0x2b, 0x11, 0xf2, + 0x0a, 0x32, 0x2a, 0xda, 0xea, 0x19, 0xec, 0x04, 0x17, 0x01, 0x1e, 0xf1, + 0xd1, 0xe6, 0xeb, 0x04, 0x23, 0xfb, 0xec, 0xcc, 0x9b, 0xec, 0x15, 0xea, + 0x04, 0xb9, 0xc4, 0x06, 0xb7, 0x88, 0xb9, 0xcc, 0xd9, 0xc0, 0xae, 0xaf, + 0xba, 0xb8, 0xc3, 0xd7, 0xc8, 0xbb, 0xd4, 0xc9, 0xd9, 0xd6, 0xe0, 0xe1, + 0x1b, 0xc4, 0xd0, 0xf0, 0xdb, 0xed, 0x0e, 0x25, 0x05, 0xfd, 0x05, 0x0f, + 0x06, 0xf6, 0x0a, 0x0a, 0x1c, 0x0e, 0x1f, 0x1f, 0x0d, 0x17, 0x1d, 0x1c, + 0x23, 0x25, 0x32, 0x4e, 0x4f, 0x2d, 0xd8, 0x5b, 0x54, 0x7f, 0x43, 0x3f, + 0x3f, 0x51, 0x29, 0x4e, 0x4f, 0x34, 0x3c, 0x35, 0x3d, 0x2a, 0x2d, 0x30, + 0x01, 0x07, 0x32, 0x0e, 0xfc, 0x61, 0x21, 0x27, 0x0e, 0x1a, 0x24, 0x01, + 0xc3, 0x98, 0x20, 0xe7, 0xc9, 0xfb, 0xec, 0x39, 0xff, 0xb7, 0xf6, 0x18, + 0xec, 0xfa, 0x00, 0x1f, 0xee, 0xf9, 0xfc, 0x01, 0x08, 0xf6, 0xd4, 0xdb, + 0xfc, 0xf9, 0xf2, 0xfe, 0xf9, 0xf6, 0xdc, 0xe1, 0xec, 0xe7, 0xe4, 0x0c, + 0xe0, 0x01, 0xdb, 0xa7, 0xe2, 0x25, 0xcd, 0x8e, 0xbe, 0xfe, 0xf7, 0xc3, + 0xbb, 0xc9, 0xd6, 0x1b, 0xf1, 0x9e, 0x00, 0x18, 0xe8, 0xbd, 0x01, 0x02, + 0xd6, 0xf0, 0xfc, 0x00, 0xc1, 0xf8, 0xe9, 0x0e, 0x1d, 0xe6, 0x10, 0x0a, + 0xee, 0xe8, 0xf1, 0xfb, 0x19, 0x10, 0x17, 0x21, 0x22, 0x17, 0x50, 0xf8, + 0x21, 0x56, 0x09, 0x0b, 0xe5, 0x2b, 0x70, 0x63, 0x27, 0xeb, 0x3d, 0x4a, + 0xea, 0x1c, 0x2f, 0x0a, 0x01, 0x3b, 0x01, 0x07, 0x19, 0x07, 0xf1, 0x46, + 0x0b, 0x4d, 0x2c, 0x1f, 0x04, 0xdb, 0x22, 0x28, 0x0f, 0x1e, 0x2d, 0xe6, + 0xf6, 0x33, 0x16, 0x03, 0xfd, 0x1b, 0xeb, 0xd9, 0xbe, 0x35, 0xfe, 0xf3, + 0x16, 0xec, 0xfe, 0xe6, 0xed, 0xc9, 0xf8, 0x14, 0xe9, 0x10, 0xdb, 0xfa, + 0xd2, 0xdf, 0x15, 0xc6, 0xd6, 0xf6, 0x02, 0x8c, 0x16, 0x47, 0xe6, 0x12, + 0xb6, 0xdd, 0x0b, 0xcc, 0x05, 0x0d, 0xd7, 0xb2, 0xb0, 0x03, 0xbc, 0x0e, + 0xae, 0xdc, 0xfe, 0xb4, 0x0f, 0x3c, 0xd5, 0xa5, 0xfb, 0x1c, 0xfc, 0xb2, + 0xec, 0xeb, 0xed, 0x35, 0x12, 0xa1, 0x22, 0x1f, 0xde, 0xd8, 0x08, 0x01, + 0x3f, 0x0f, 0xb4, 0x26, 0x2f, 0x2a, 0x1d, 0xe1, 0xfc, 0x4c, 0x47, 0xef, + 0xfb, 0xdb, 0xfb, 0xfd, 0x2f, 0x27, 0x25, 0x0b, 0xc0, 0x2b, 0xff, 0xcf, + 0x1a, 0xfe, 0x0c, 0x57, 0x11, 0x0d, 0x74, 0xc5, 0xdd, 0x57, 0x3c, 0xe9, + 0xdb, 0x4f, 0x06, 0xe5, 0x11, 0xfd, 0x0c, 0x2e, 0x16, 0x2a, 0x16, 0xab, + 0x3a, 0x3e, 0x2a, 0xfe, 0xbb, 0x38, 0xcd, 0xd4, 0x17, 0x3d, 0x3e, 0xf6, + 0xf3, 0x29, 0xe8, 0xe8, 0x5f, 0xd7, 0x15, 0xc9, 0x1a, 0x1f, 0xbd, 0xdd, + 0x58, 0xc2, 0xf1, 0x40, 0x1f, 0xf7, 0x09, 0x07, 0xd4, 0xff, 0xe7, 0xf9, + 0xce, 0xcb, 0x04, 0x12, 0xc9, 0xdc, 0x15, 0xd7, 0xc1, 0xc0, 0xe1, 0x15, + 0xa0, 0xc4, 0xec, 0xcb, 0x0c, 0x26, 0xf7, 0x34, 0xa7, 0xf0, 0x05, 0xb2, + 0xec, 0xc0, 0xfe, 0x03, 0xd0, 0xc7, 0x21, 0xfc, 0xaa, 0x21, 0xf8, 0x31, + 0xff, 0xf2, 0x29, 0x5d, 0xf9, 0xcd, 0xf2, 0x0d, 0xf2, 0x3a, 0x61, 0x3d, + 0xf9, 0x00, 0xcc, 0x0b, 0x3f, 0x0f, 0x25, 0xdc, 0xfc, 0x49, 0x3c, 0xfe, + 0xe6, 0x44, 0xf4, 0xc4, 0xf8, 0x1b, 0xe8, 0xf0, 0x52, 0x3c, 0xb5, 0xe9, + 0x4a, 0xf3, 0xe5, 0x00, 0x0d, 0x0d, 0xfe, 0x4e, 0xb1, 0xe9, 0x46, 0x3a, + 0x1d, 0x1b, 0xfb, 0x00, 0x05, 0xdc, 0xfa, 0xe4, 0xb8, 0xf4, 0xdf, 0x07, + 0x3c, 0x10, 0x13, 0x1e, 0xc9, 0x9a, 0x26, 0xfc, 0xbd, 0xea, 0x31, 0x3b, + 0x33, 0xf4, 0xd6, 0xed, 0x15, 0xe2, 0x28, 0x0d, 0xc4, 0xef, 0x45, 0xeb, + 0x32, 0xc2, 0xfe, 0xf6, 0x25, 0x1c, 0xf4, 0x18, 0x0c, 0x0d, 0x06, 0xfa, + 0xe6, 0xe7, 0xdc, 0xc9, 0xdc, 0x09, 0xf4, 0x01, 0x1b, 0xd8, 0xfe, 0xdb, + 0xec, 0xdf, 0xd7, 0xe6, 0xf6, 0x08, 0x4a, 0xb9, 0xd3, 0xf7, 0xfb, 0xf2, + 0xf6, 0xfd, 0x01, 0x05, 0xcb, 0x1a, 0x06, 0xdc, 0x31, 0x1f, 0xfa, 0xb9, + 0xfe, 0x3f, 0x42, 0xca, 0xf0, 0x44, 0xf2, 0xf8, 0xe7, 0x49, 0xff, 0xd3, + 0x36, 0x13, 0xf6, 0x62, 0x29, 0x0c, 0x2c, 0xf7, 0xd2, 0x00, 0x0e, 0x48, + 0xda, 0xf4, 0x5d, 0xfb, 0xfd, 0x23, 0x31, 0x1c, 0xca, 0x24, 0x25, 0xc3, + 0xfa, 0xf6, 0x4d, 0xfe, 0x15, 0x3b, 0xf2, 0xc8, 0xaa, 0x0a, 0x19, 0xfa, + 0x94, 0xef, 0x38, 0x27, 0xd0, 0x02, 0x27, 0xb5, 0xac, 0xe9, 0xba, 0x1c, + 0x41, 0xf2, 0xa7, 0xef, 0xcb, 0x11, 0xb4, 0xe0, 0x08, 0xe5, 0x00, 0x27, + 0xf0, 0xf2, 0xd9, 0xf8, 0xd3, 0xdb, 0x08, 0x34, 0xf5, 0x23, 0xe9, 0xc4, + 0x0e, 0x3f, 0xf4, 0xe5, 0x04, 0x31, 0x3d, 0x1d, 0x33, 0x23, 0x0b, 0x17, + 0xfa, 0x09, 0xfd, 0x38, 0xe1, 0x05, 0x3b, 0xef, 0xf5, 0x25, 0x47, 0x01, + 0xfe, 0x2a, 0x1f, 0xd2, 0xc8, 0x3d, 0x12, 0xbb, 0x0b, 0x0c, 0xcd, 0xdf, + 0x4f, 0x2e, 0xbc, 0xfe, 0xbf, 0x1d, 0x06, 0xdf, 0xea, 0x05, 0xff, 0x05, + 0xdc, 0x37, 0x0b, 0x97, 0xf5, 0x1e, 0x2c, 0xdb, 0xe7, 0x05, 0xc8, 0x14, + 0xf2, 0xe7, 0x24, 0xe2, 0x04, 0x30, 0xc6, 0x16, 0x44, 0xa3, 0x0a, 0xf5, + 0xd8, 0xde, 0x0d, 0xd9, 0xe8, 0x37, 0x2a, 0xd3, 0x07, 0x1b, 0xb7, 0xf5, + 0x04, 0x00, 0xb9, 0xce, 0xf5, 0x33, 0x41, 0x9f, 0x00, 0x43, 0xeb, 0xe3, + 0xee, 0xfc, 0x12, 0xed, 0x0c, 0xc6, 0x02, 0x5b, 0xee, 0xda, 0x1b, 0x1f, + 0xe9, 0x04, 0xf0, 0x0c, 0xfd, 0x0c, 0xff, 0x0c, 0x3d, 0x00, 0x0d, 0xfc, + 0x2a, 0x25, 0xdf, 0x06, 0xfb, 0x39, 0x3f, 0x09, 0x08, 0xee, 0x0f, 0x1c, + 0x0e, 0x2c, 0x1d, 0x01, 0xfd, 0x23, 0xba, 0x04, 0x63, 0xe0, 0xd8, 0x07, + 0x01, 0x04, 0x33, 0xde, 0xf4, 0xf6, 0xeb, 0xf0, 0xda, 0x09, 0x10, 0x2d, + 0x03, 0x0a, 0xaf, 0xf8, 0xff, 0xf1, 0xfe, 0xe6, 0xdf, 0xf0, 0xd4, 0xf5, + 0x1f, 0xd8, 0xe1, 0xf3, 0xe9, 0xd5, 0xca, 0x07, 0xf9, 0xdf, 0xf6, 0xc0, + 0xea, 0x07, 0xf8, 0xdf, 0xe4, 0x26, 0xfa, 0xf4, 0x25, 0x06, 0xea, 0xff, + 0x39, 0x02, 0xbe, 0x11, 0x0f, 0x1f, 0xe2, 0x11, 0xf5, 0x21, 0xfb, 0x01, + 0x3f, 0x13, 0x28, 0x16, 0x03, 0xd4, 0x11, 0x0a, 0xea, 0x05, 0x2e, 0x32, + 0xe0, 0xb2, 0x37, 0xe8, 0xb9, 0x0a, 0x11, 0xed, 0xf0, 0x10, 0x11, 0xdd, + 0xee, 0xff, 0x1c, 0xd8, 0x02, 0xf5, 0xe7, 0xf9, 0xbc, 0x22, 0x3f, 0xf3, + 0xcc, 0xfe, 0x16, 0x09, 0xe6, 0xed, 0x06, 0x04, 0x2d, 0x32, 0xf9, 0xfe, + 0x0c, 0x48, 0x20, 0xf6, 0x09, 0xee, 0x0c, 0x3e, 0x1e, 0xe4, 0xda, 0xfc, + 0x12, 0xfd, 0x08, 0x3a, 0x29, 0x11, 0xe3, 0xed, 0xe6, 0x34, 0x0b, 0xe1, + 0xfc, 0x1d, 0xe3, 0xf8, 0x21, 0xdf, 0xea, 0xd1, 0x1a, 0x1c, 0xe2, 0x1c, + 0x08, 0x11, 0xdd, 0x07, 0xf0, 0xd3, 0xdb, 0xf5, 0x10, 0xf9, 0xfc, 0xdb, + 0x06, 0x14, 0xd9, 0x02, 0x09, 0xf6, 0xfc, 0x09, 0xd0, 0xb7, 0x0b, 0xfc, + 0x11, 0xc9, 0xd9, 0x09, 0x3f, 0x17, 0x8d, 0xe1, 0x0b, 0x01, 0x00, 0x0c, + 0xd0, 0xfc, 0x21, 0xcc, 0x19, 0xcf, 0xfc, 0x2d, 0x04, 0xd0, 0xe6, 0xef, + 0x33, 0x3e, 0xe9, 0x00, 0x27, 0xd9, 0x3a, 0xed, 0xf9, 0x36, 0x15, 0xf9, + 0x31, 0x03, 0x0a, 0x0a, 0xf9, 0x0d, 0x28, 0xf7, 0xe5, 0x45, 0x24, 0xbe, + 0x0a, 0x47, 0xed, 0xe2, 0x55, 0x10, 0x12, 0xf7, 0x06, 0xf7, 0xe7, 0xf1, + 0x1b, 0xeb, 0xc0, 0x25, 0x16, 0xd4, 0xe1, 0x07, 0x0c, 0xf1, 0xef, 0xd4, + 0x08, 0x1b, 0x0f, 0xdd, 0xf9, 0xd8, 0xed, 0x19, 0x01, 0xb4, 0x0d, 0x23, + 0x11, 0xd5, 0x1f, 0x1a, 0xc6, 0xf2, 0x09, 0xf3, 0x01, 0x14, 0xf7, 0x02, + 0xf7, 0x32, 0x16, 0xf5, 0xea, 0xff, 0xff, 0x4b, 0x14, 0xde, 0xf1, 0x2e, + 0x3e, 0x0a, 0xe0, 0x00, 0xfc, 0xea, 0x40, 0x05, 0xed, 0xd9, 0x07, 0xd2, + 0xe6, 0xcb, 0x03, 0xf2, 0x08, 0x01, 0xe1, 0x34, 0xd8, 0x0b, 0xcf, 0xd2, + 0x06, 0x02, 0xcc, 0x09, 0xf8, 0xf2, 0x08, 0xe4, 0x0a, 0x01, 0xdd, 0xef, + 0x11, 0xe2, 0xe3, 0x2a, 0xe9, 0x22, 0x28, 0xf7, 0xec, 0xd0, 0xf6, 0xf7, + 0x07, 0xfa, 0xf5, 0xe7, 0x12, 0x35, 0xfa, 0xe0, 0xfd, 0x01, 0x2a, 0x0c, + 0x09, 0x1c, 0x03, 0x00, 0x1b, 0xfb, 0xf0, 0x03, 0x26, 0xfe, 0xdc, 0xef, + 0x2b, 0x26, 0x2f, 0xfa, 0xfa, 0x48, 0xf3, 0x01, 0x1f, 0x12, 0x13, 0x2f, + 0xe6, 0x13, 0x3c, 0x17, 0x0a, 0x06, 0xf2, 0x37, 0xff, 0xd8, 0x36, 0xf2, + 0xe6, 0xdf, 0xda, 0x0e, 0xe4, 0xed, 0xf4, 0x08, 0xef, 0xec, 0xf4, 0xe4, + 0x0f, 0xd0, 0xdb, 0x04, 0xd7, 0xf8, 0xfe, 0xf1, 0xf6, 0x0f, 0xdf, 0xd2, + 0xfe, 0xf3, 0xd5, 0xea, 0x07, 0xe8, 0xd1, 0x26, 0x07, 0xdb, 0xef, 0x06, + 0x26, 0x14, 0xbf, 0x11, 0x29, 0xcd, 0xdb, 0xe6, 0xe7, 0xf9, 0x01, 0x31, + 0x03, 0xc6, 0xec, 0x06, 0xf8, 0xea, 0xea, 0x1d, 0xfa, 0xd6, 0x08, 0x23, + 0x1c, 0x0a, 0xba, 0xdf, 0x09, 0xf8, 0xea, 0xf8, 0x0b, 0x19, 0xfa, 0x0c, + 0xea, 0xe9, 0x0a, 0x64, 0xfc, 0xe2, 0x2c, 0x22, 0x10, 0x10, 0xf7, 0x35, + 0x2d, 0xdd, 0x2b, 0x38, 0xf9, 0x22, 0x31, 0x20, 0x10, 0x2c, 0x1a, 0x19, + 0x0e, 0x01, 0x07, 0x16, 0xfa, 0x0c, 0x24, 0x05, 0xd3, 0x1c, 0xf7, 0xf9, + 0x0a, 0xf6, 0x24, 0xfb, 0xf0, 0x08, 0xff, 0xd6, 0xfc, 0x1a, 0xeb, 0xf0, + 0xde, 0xec, 0x00, 0x11, 0xcf, 0xea, 0xea, 0x00, 0x09, 0xd4, 0x08, 0xfb, + 0xc5, 0xe1, 0xfc, 0x16, 0xf0, 0x29, 0xf9, 0xec, 0xe9, 0xce, 0x0a, 0x1b, + 0xd8, 0xf3, 0x10, 0xdb, 0xfa, 0xe7, 0x04, 0xfc, 0xe6, 0xe3, 0xf6, 0xf0, + 0xf0, 0x02, 0xfc, 0xfc, 0x01, 0xec, 0x02, 0x01, 0xdd, 0xf3, 0x05, 0x17, + 0xe8, 0xda, 0x11, 0x04, 0x01, 0x08, 0x04, 0x04, 0xdc, 0x0f, 0x21, 0x0d, + 0xd2, 0x0d, 0xff, 0x1b, 0x45, 0xf0, 0xe9, 0xff, 0x35, 0x3c, 0xf2, 0xec, + 0x0c, 0xf6, 0xf2, 0xf6, 0xf3, 0xec, 0x09, 0x0b, 0xf9, 0x18, 0xeb, 0xf6, + 0x0b, 0x21, 0x06, 0x15, 0xe8, 0x02, 0x18, 0x04, 0xee, 0x1b, 0x1e, 0x0a, + 0xfe, 0x00, 0x14, 0x1b, 0x2a, 0xf5, 0xf8, 0xfc, 0x09, 0x12, 0x26, 0x1f, + 0x01, 0xf2, 0x12, 0xed, 0x17, 0x05, 0xfa, 0xff, 0x09, 0x00, 0xf0, 0xfa, + 0x0e, 0xf1, 0xdc, 0xf7, 0x13, 0xfc, 0xed, 0xc8, 0xf0, 0x05, 0xff, 0x05, + 0xef, 0xcf, 0xef, 0xf1, 0xff, 0x01, 0xd2, 0xfc, 0x03, 0xcc, 0xe3, 0x09, + 0xff, 0x01, 0xe8, 0xd7, 0xfc, 0x0f, 0x11, 0xe5, 0xd7, 0xf5, 0xda, 0xed, + 0xdf, 0x07, 0x05, 0xe4, 0xf5, 0x03, 0x00, 0xd6, 0x03, 0x24, 0xfe, 0xfa, + 0xf9, 0x03, 0x08, 0x07, 0x07, 0x21, 0x0d, 0x10, 0xec, 0x22, 0x19, 0xd7, + 0x17, 0x38, 0xf9, 0xf3, 0x0b, 0xe3, 0x1d, 0x08, 0x28, 0x17, 0x1c, 0xed, + 0xeb, 0x0d, 0xf2, 0xf3, 0x0f, 0x1c, 0x32, 0x20, 0x1f, 0xe5, 0xe9, 0x06, + 0x22, 0x29, 0xf7, 0x00, 0x26, 0xec, 0x03, 0x17, 0x10, 0xfb, 0x10, 0x06, + 0x2c, 0xfc, 0xfa, 0xfc, 0x1c, 0xee, 0xbf, 0x04, 0x01, 0xe1, 0x12, 0xf1, + 0xf6, 0x01, 0xed, 0xfb, 0xf2, 0xfe, 0xea, 0xf4, 0x03, 0xf0, 0xd5, 0xfc, + 0x1e, 0xee, 0x03, 0xf0, 0x04, 0xff, 0xff, 0xe9, 0xe2, 0xe1, 0x06, 0x18, + 0xd9, 0xef, 0xea, 0x00, 0xe6, 0x12, 0x07, 0x04, 0x07, 0xff, 0xe9, 0xed, + 0xf4, 0xf0, 0xf3, 0xfe, 0x18, 0xf3, 0x01, 0x05, 0xff, 0xff, 0xfc, 0xed, + 0x04, 0xf0, 0x0f, 0x03, 0xe8, 0x06, 0x1f, 0xf1, 0xf6, 0xe7, 0x0e, 0x00, + 0x01, 0x01, 0xec, 0x09, 0xfa, 0xf5, 0x29, 0x05, 0xee, 0xf6, 0x25, 0xfe, + 0xe8, 0x18, 0x17, 0x00, 0x0f, 0xe2, 0x0a, 0x13, 0x0d, 0x0a, 0xe6, 0x2b, + 0x22, 0xfd, 0xd9, 0x18, 0x23, 0xfa, 0x00, 0x01, 0x04, 0x13, 0x1f, 0x06, + 0x07, 0xfa, 0x02, 0x2e, 0xf8, 0xe8, 0x04, 0x05, 0x25, 0xf4, 0x06, 0x29, + 0x0c, 0xe5, 0xff, 0x24, 0x06, 0xe6, 0xf4, 0x08, 0xf3, 0x12, 0x14, 0xfa, + 0xed, 0x04, 0xec, 0x02, 0xe5, 0x00, 0x18, 0xf7, 0xd3, 0xc2, 0xfe, 0x08, + 0xef, 0xfe, 0xf9, 0xbf, 0xc3, 0xf7, 0x03, 0xf8, 0xdb, 0x10, 0xf6, 0xea, + 0xd7, 0xf5, 0x18, 0x05, 0xdc, 0xdd, 0x1c, 0xfe, 0x00, 0x23, 0x1f, 0xec, + 0xe7, 0x28, 0x23, 0xf3, 0xfc, 0xf5, 0x01, 0x14, 0xf0, 0xf6, 0x01, 0x00, + 0xf8, 0xfc, 0xf1, 0x03, 0xe1, 0x06, 0x14, 0x0d, 0x0d, 0xcc, 0x21, 0xe0, + 0xf1, 0x47, 0xff, 0xfd, 0xff, 0xfc, 0x1c, 0x13, 0x01, 0x13, 0xec, 0xf6, + 0x03, 0x04, 0x07, 0x04, 0x2d, 0x07, 0xde, 0x01, 0x11, 0x10, 0x05, 0xeb, + 0xed, 0xed, 0x15, 0xed, 0xd9, 0xff, 0x12, 0x06, 0xdf, 0x07, 0x10, 0xfe, + 0x0c, 0xf1, 0x21, 0x12, 0x1a, 0x19, 0xe6, 0xe9, 0x15, 0x1c, 0x07, 0xee, + 0x1e, 0x0b, 0xf1, 0x07, 0x07, 0xfd, 0x00, 0x01, 0x00, 0x01, 0x1b, 0x19, + 0xf5, 0xde, 0xf6, 0x03, 0xf8, 0xf9, 0x01, 0xdd, 0x07, 0x23, 0xf4, 0xdb, + 0xe4, 0x05, 0x00, 0xec, 0xf0, 0x04, 0xf8, 0xe7, 0x06, 0x0c, 0xf1, 0xdc, + 0xd7, 0xea, 0x16, 0xfe, 0xfb, 0x01, 0x08, 0x0e, 0x10, 0x0d, 0xde, 0x01, + 0xff, 0xf8, 0xf6, 0xf9, 0xfc, 0xfc, 0xf1, 0xec, 0x20, 0x07, 0xf5, 0xf6, + 0xf9, 0x12, 0xf8, 0xe2, 0x0b, 0x07, 0x16, 0xcd, 0xfc, 0x01, 0x09, 0xee, + 0x03, 0x05, 0xf7, 0xfc, 0xff, 0x27, 0x09, 0x06, 0x00, 0xff, 0xf0, 0x22, + 0x07, 0x0a, 0x0a, 0xfe, 0x17, 0x10, 0xf4, 0x00, 0x01, 0x26, 0x2c, 0xf1, + 0xdb, 0x1b, 0x0d, 0xed, 0x13, 0xe9, 0x02, 0x00, 0xff, 0x1b, 0x04, 0xeb, + 0xf0, 0x02, 0x09, 0x07, 0xf2, 0xf9, 0xfc, 0xed, 0x05, 0x1f, 0xff, 0xe4, + 0x2c, 0x05, 0xf9, 0xf1, 0xfe, 0x24, 0xe5, 0xe1, 0x0f, 0x00, 0xfb, 0xff, + 0xf0, 0x0f, 0xff, 0xf4, 0x01, 0xf4, 0x03, 0xf7, 0x0a, 0xeb, 0xff, 0x02, + 0xdd, 0x05, 0xed, 0x02, 0x1f, 0xee, 0xe7, 0xed, 0x20, 0xfb, 0xf0, 0x04, + 0x0c, 0xee, 0xf6, 0x07, 0x0b, 0xf5, 0xf9, 0x12, 0xfe, 0xff, 0x01, 0xec, + 0xff, 0x02, 0xf7, 0xf2, 0xdd, 0x02, 0x02, 0xf7, 0xfc, 0xf1, 0xf6, 0xfd, + 0xea, 0x0d, 0x00, 0xe5, 0xf1, 0xf7, 0xeb, 0x0d, 0x0a, 0xee, 0xf0, 0x09, + 0xfe, 0xf4, 0xfd, 0x15, 0x17, 0xfa, 0xe5, 0x06, 0xf7, 0xf2, 0x1b, 0x01, + 0x2d, 0xf7, 0xf0, 0x0f, 0xff, 0xe1, 0x01, 0x20, 0x0a, 0xf4, 0x06, 0x0f, + 0x1c, 0xee, 0x0b, 0x07, 0x12, 0x22, 0xf7, 0xff, 0x14, 0xfe, 0x22, 0x11, + 0x13, 0x16, 0x07, 0x0d, 0x02, 0xff, 0x2e, 0x00, 0x19, 0x07, 0x07, 0x19, + 0x07, 0xf5, 0x01, 0x01, 0x22, 0x02, 0xeb, 0xed, 0xea, 0x21, 0x00, 0xd9, + 0x06, 0xf0, 0x02, 0xe5, 0xd1, 0xdc, 0xde, 0xf4, 0xfb, 0x00, 0x01, 0xff, + 0xe9, 0xed, 0xf8, 0xeb, 0x03, 0x00, 0xff, 0xf0, 0xfa, 0xfc, 0xf1, 0xf6, + 0x01, 0xf4, 0xfd, 0xf9, 0xe3, 0xea, 0xf5, 0x08, 0xf7, 0xdb, 0xe8, 0x05, + 0x00, 0x05, 0xf7, 0x03, 0x10, 0xfd, 0x01, 0x1b, 0xe3, 0xed, 0x27, 0x06, + 0x03, 0xf3, 0xfd, 0x01, 0x0c, 0x1c, 0xe6, 0xfb, 0x0e, 0xfe, 0x01, 0x01, + 0x10, 0xf8, 0x02, 0x01, 0x04, 0xfa, 0x11, 0xfd, 0x00, 0x10, 0xfc, 0xff, + 0x09, 0xee, 0xf3, 0xfe, 0x02, 0x00, 0x01, 0x04, 0x0b, 0xf5, 0xfc, 0xf1, + 0x04, 0x1f, 0x07, 0xf9, 0xfc, 0xfc, 0x11, 0x02, 0xef, 0xfe, 0x15, 0xf7, + 0x15, 0xfb, 0xed, 0x18, 0x0d, 0x10, 0x01, 0x1a, 0x0b, 0xf4, 0xf9, 0x0e, + 0x1c, 0x0e, 0x17, 0x0f, 0xf0, 0x07, 0x0b, 0xff, 0x04, 0xfe, 0xe5, 0xea, + 0xed, 0xe6, 0xf2, 0xde, 0x09, 0x17, 0xeb, 0xe8, 0xed, 0xf4, 0xe1, 0xef, + 0xf8, 0x0f, 0xf5, 0xe7, 0x04, 0xe9, 0xe6, 0xe0, 0x07, 0x1f, 0x16, 0xfb, + 0xf0, 0xf3, 0xfa, 0x00, 0x05, 0x25, 0x01, 0x00, 0xf4, 0xfd, 0x02, 0x1f, + 0x03, 0xeb, 0x09, 0x04, 0x01, 0x04, 0xfe, 0xf4, 0xf6, 0xf3, 0xfe, 0x01, + 0x00, 0x23, 0xf9, 0x00, 0xf8, 0xf6, 0x12, 0xf8, 0xea, 0xf4, 0x0f, 0x0d, + 0xf8, 0xe6, 0xf5, 0x03, 0x05, 0x04, 0x07, 0x04, 0x0b, 0x07, 0xff, 0xf8, + 0x00, 0x05, 0x01, 0xf0, 0xf3, 0x02, 0x10, 0x0a, 0xf5, 0xee, 0xf3, 0x0c, + 0xfd, 0xf4, 0x07, 0x04, 0x0b, 0x19, 0xee, 0x02, 0x17, 0xf7, 0x09, 0x0a, + 0x2b, 0x25, 0xf6, 0xf8, 0xf9, 0x06, 0x04, 0x01, 0xff, 0xf8, 0x06, 0x0b, + 0xd7, 0xfb, 0x02, 0xf4, 0xe4, 0x16, 0x2b, 0xdc, 0xe7, 0x0b, 0x01, 0xff, + 0xfc, 0xf1, 0x1b, 0x16, 0xf6, 0xfc, 0x06, 0x0f, 0x06, 0xeb, 0xf7, 0x0f, + 0xfd, 0xfc, 0x01, 0x26, 0x18, 0xf5, 0x02, 0x01, 0x08, 0xeb, 0xf3, 0x03, + 0xf8, 0xf9, 0xdb, 0xda, 0x0e, 0x0b, 0xea, 0xf7, 0x02, 0xf8, 0xfc, 0xde, + 0xe4, 0xf6, 0xf3, 0x03, 0xff, 0x00, 0x01, 0xfb, 0xf1, 0xfe, 0x09, 0x12, + 0x0f, 0xfd, 0x00, 0x00, 0x00, 0x12, 0xf5, 0x01, 0x21, 0x14, 0xf7, 0xfd, + 0x00, 0x07, 0xff, 0xf5, 0xfa, 0xfd, 0x0f, 0x1b, 0xfa, 0xee, 0xf1, 0xea, + 0xfa, 0x02, 0xf9, 0xf7, 0xec, 0x04, 0xfd, 0xf6, 0xfe, 0x00, 0x07, 0xec, + 0xee, 0xf1, 0x03, 0x16, 0xf4, 0xe1, 0x0e, 0x11, 0xfd, 0x00, 0x00, 0x00, + 0x07, 0x06, 0x13, 0x00, 0xfc, 0x00, 0x00, 0xeb, 0x08, 0x18, 0x0d, 0xf9, + 0x08, 0x06, 0xff, 0xf1, 0xfb, 0xfd, 0x00, 0x1c, 0xfe, 0x00, 0x07, 0x0d, + 0x09, 0xdf, 0xf8, 0x0e, 0x06, 0xf7, 0xed, 0x0b, 0x1a, 0x02, 0x13, 0x07, + 0xfe, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0x11, 0x0e, 0xfd, 0xeb, 0xf2, + 0xfc, 0x01, 0x07, 0xff, 0x03, 0xf8, 0xf4, 0x0a, 0x12, 0x1d, 0xfa, 0xdf, + 0xeb, 0x05, 0x03, 0x00, 0x00, 0xef, 0xea, 0x05, 0xfd, 0x04, 0x06, 0xf1, + 0x02, 0xf6, 0x02, 0xf6, 0xf5, 0xeb, 0xf0, 0x04, 0xf3, 0xff, 0x0a, 0xf1, + 0x02, 0x00, 0x00, 0x03, 0x0f, 0xfd, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x0d, + 0xfd, 0xea, 0xf0, 0xf3, 0xff, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x0a, 0xfe, + 0xf6, 0x02, 0x0c, 0xfe, 0x03, 0xf9, 0x01, 0x03, 0xfc, 0x00, 0x0c, 0x08, + 0x02, 0x09, 0x0a, 0xfe, 0xf6, 0xfe, 0x00, 0x0a, 0x05, 0xff, 0x00, 0x00, + 0x00, 0xf1, 0xdf, 0x03, 0x07, 0x05, 0x03, 0xfc, 0xfb, 0x01, 0x03, 0x00, + 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f, 0x04, 0xff, 0x06, 0xff, 0xfd, 0xf5, + 0x11, 0x04, 0xf9, 0x07, 0xff, 0x00, 0xfd, 0xec, 0x10, 0x0a, 0xef, 0xf2, + 0xec, 0xdb, 0xf7, 0xff, 0x00, 0x06, 0x03, 0x05, 0x03, 0xf9, 0xf6, 0x0b, + 0x0d, 0xfd, 0x00, 0x0b, 0x1d, 0x0c, 0x03, 0xf4, 0xff, 0x06, 0x07, 0xff, + 0x00, 0x14, 0x10, 0x05, 0x07, 0x12, 0x0d, 0xf4, 0xf9, 0xff, 0xf8, 0x01, + 0x00, 0x06, 0xf6, 0xf4, 0x00, 0x09, 0xf8, 0x03, 0x00, 0xf0, 0x00, 0xec, + 0xf1, 0x03, 0x08, 0xf6, 0xf4, 0xf7, 0x02, 0x05, 0xfd, 0x00, 0xf3, 0xf3, + 0xf8, 0xff, 0xee, 0xf3, 0xfb, 0x06, 0x04, 0x04, 0xfa, 0x01, 0x00, 0xfe, + 0xfe, 0x00, 0xee, 0xf9, 0x04, 0x00, 0xfb, 0xfa, 0x01, 0x12, 0x04, 0xff, + 0xfb, 0xf2, 0x03, 0x0c, 0xfe, 0xf9, 0xee, 0xff, 0x03, 0x00, 0x05, 0xfd, + 0x03, 0x09, 0x14, 0x08, 0xf9, 0x01, 0x0a, 0xfe, 0x05, 0x02, 0x00, 0xfb, + 0x01, 0xfb, 0x12, 0x0c, 0xfd, 0x00, 0x05, 0xff, 0xfb, 0x01, 0x0a, 0x06, + 0xfc, 0xfc, 0x01, 0xfb, 0xfc, 0x10, 0x0d, 0xfd, 0xf4, 0xfd, 0x01, 0xf6, + 0xfa, 0xff, 0x05, 0xff, 0xfe, 0x05, 0xff, 0xee, 0xfc, 0x01, 0x05, 0xff, + 0xfe, 0x00, 0x02, 0xfd, 0xfc, 0x06, 0x0c, 0x06, 0x01, 0xf2, 0xf5, 0x02, + 0x07, 0x0c, 0xfe, 0xfb, 0x0e, 0x06, 0xff, 0xfa, 0x01, 0x02, 0xf2, 0xf7, + 0xf5, 0xf4, 0xfa, 0x01, 0xfe, 0xf8, 0xf9, 0xff, 0x05, 0xf9, 0x0a, 0x0a, + 0xf9, 0xf0, 0x01, 0xfc, 0xf6, 0xfd, 0x04, 0x03, 0x02, 0x03, 0x02, 0x00, + 0x03, 0x02, 0x00, 0xfa, 0xf5, 0xf8, 0x0c, 0x0d, 0xfd, 0xfa, 0xf8, 0x02, + 0x03, 0x0e, 0x06, 0xff, 0x00, 0x00, 0xf3, 0x00, 0x06, 0x03, 0xfc, 0xfb, + 0x05, 0x00, 0xfa, 0xfa, 0xff, 0x08, 0xff, 0x02, 0xfd, 0xfd, 0x08, 0x01, + 0xfa, 0x05, 0x06, 0xf9, 0xfd, 0x07, 0xfd, 0xf7, 0xfe, 0xfe, 0x06, 0x03, + 0xf9, 0xfd, 0x00, 0x02, 0x02, 0x00, 0x02, 0x09, 0x01, 0x05, 0xff, 0x03, + 0x03, 0x08, 0x0d, 0x02, 0xfe, 0x00, 0x01, 0x07, 0x06, 0xf7, 0x01, 0x0b, + 0xfe, 0x01, 0x07, 0x00, 0xff, 0xf8, 0xf9, 0xfe, 0xfc, 0xf6, 0xfd, 0x08, + 0x04, 0xff, 0xfb, 0xfd, 0xfc, 0x01, 0x03, 0xfb, 0xfa, 0x01, 0x00, 0x00, + 0xfd, 0xfc, 0xfd, 0xf8, 0xfe, 0x00, 0xff, 0xf8, 0xf9, 0x01, 0xfd, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, 0x23, 0xd4, 0xaf, 0xdd, 0x2e, 0x53, + 0x16, 0xd0, 0xd6, 0x30, 0xe5, 0xb1, 0xa0, 0xd4, 0x07, 0xc9, 0xf0, 0xb8, + 0xa4, 0xda, 0x0c, 0xcf, 0xbc, 0x9b, 0x99, 0xee, 0xc0, 0xb5, 0xd2, 0x0c, + 0xc7, 0xf7, 0xd6, 0xee, 0xcd, 0x25, 0x33, 0xda, 0xe7, 0xf5, 0x4a, 0x19, + 0xcf, 0x18, 0x25, 0x28, 0x4b, 0xff, 0x16, 0x37, 0xfb, 0xd2, 0x14, 0x4b, + 0x4a, 0x16, 0x5e, 0x7a, 0x7d, 0x39, 0x37, 0x1b, 0x51, 0x2a, 0x14, 0x53, + 0x3d, 0x18, 0x4b, 0x5c, 0x5e, 0x56, 0x4b, 0x37, 0x40, 0x4f, 0x48, 0x37, + 0x3d, 0x37, 0x37, 0x39, 0x28, 0x16, 0x28, 0x23, 0x07, 0x10, 0xf9, 0x18, + 0xf7, 0x28, 0x0b, 0xea, 0xe7, 0x07, 0xe3, 0xd6, 0xc5, 0xc2, 0xd4, 0xc2, + 0xc9, 0xe1, 0xf5, 0xd0, 0xd8, 0xc7, 0xb8, 0xbc, 0xd2, 0xc5, 0xc5, 0xad, + 0xcd, 0xba, 0xc5, 0xbc, 0xcb, 0xda, 0xd2, 0xcf, 0xd0, 0xd2, 0xd2, 0xd8, + 0xee, 0xec, 0xdf, 0xe5, 0xf0, 0xf9, 0xf5, 0xfb, 0x03, 0x0c, 0xfb, 0x1b, + 0x16, 0x05, 0x37, 0x2e, 0x19, 0x14, 0x26, 0x2a, 0x4f, 0x67, 0x16, 0x28, + 0x58, 0x6d, 0x4d, 0x31, 0xf2, 0x3b, 0x40, 0x07, 0x4d, 0x2a, 0x1d, 0x18, + 0x2c, 0x55, 0x58, 0x39, 0x30, 0x31, 0x46, 0x3d, 0x31, 0x30, 0x2c, 0x2a, + 0x2e, 0x19, 0x10, 0x2e, 0x25, 0x1d, 0x12, 0x07, 0x07, 0x1f, 0x19, 0x0e, + 0xff, 0xdf, 0xe8, 0x14, 0xff, 0xe7, 0xd0, 0xf2, 0xdd, 0xd2, 0xe8, 0xf5, + 0xee, 0xc0, 0xe1, 0xc7, 0xb8, 0xf9, 0xbe, 0xa4, 0xd2, 0xc9, 0xc2, 0xbc, + 0xc5, 0xcd, 0xd0, 0xb8, 0xc5, 0xcd, 0xd6, 0xcf, 0xc9, 0xd4, 0xe3, 0xd4, + 0xe7, 0xea, 0xe1, 0xea, 0xe8, 0xe1, 0xf2, 0x01, 0xf4, 0xf5, 0xea, 0x03, + 0x00, 0x03, 0x07, 0x10, 0xff, 0x10, 0x07, 0x0e, 0x10, 0x25, 0x33, 0x23, + 0x23, 0x01, 0x23, 0x2c, 0x2a, 0x23, 0x3b, 0x37, 0x1f, 0x3d, 0x3b, 0x1d, + 0x21, 0x3d, 0x28, 0x23, 0x30, 0x23, 0x28, 0x23, 0x19, 0x1d, 0x1d, 0x19, + 0x1d, 0x1b, 0x14, 0x0e, 0x0b, 0x0c, 0x10, 0x0e, 0x01, 0xf2, 0x0b, 0x05, + 0x12, 0x03, 0xfd, 0xdf, 0xf2, 0xf0, 0xbc, 0xe1, 0xff, 0xf9, 0xc0, 0xc3, + 0xd2, 0xf9, 0xe5, 0xd4, 0xbc, 0xcf, 0xd0, 0xcf, 0xcb, 0xdb, 0xc5, 0xc2, + 0xc9, 0xf2, 0xe8, 0xba, 0xc9, 0xd2, 0xd0, 0xcf, 0xd8, 0xdd, 0xdb, 0xdd, + 0xd4, 0xe8, 0xe1, 0xe3, 0xee, 0xee, 0xf4, 0xe1, 0xe7, 0xec, 0x00, 0xf9, + 0xea, 0xf9, 0x0e, 0xfd, 0x01, 0x10, 0xf2, 0xf9, 0x10, 0x01, 0x09, 0x18, + 0x19, 0x05, 0x2c, 0x23, 0x1b, 0x16, 0x0c, 0x25, 0x28, 0x1d, 0x31, 0x33, + 0x42, 0x21, 0x31, 0x39, 0x33, 0x30, 0x1d, 0x2c, 0x1b, 0x1d, 0x23, 0x2a, + 0x25, 0x1d, 0x1d, 0x18, 0x18, 0x18, 0x18, 0x10, 0x0e, 0x0b, 0x07, 0x09, + 0x05, 0x0b, 0x10, 0x07, 0xfd, 0xff, 0xf5, 0xf7, 0xf0, 0xf5, 0x07, 0x00, + 0xf5, 0xf5, 0xee, 0xda, 0xc9, 0xea, 0xdd, 0x07, 0xda, 0xba, 0xbc, 0xdb, + 0xcf, 0xd0, 0xd8, 0xc9, 0xc7, 0xd4, 0xcf, 0xd4, 0xc7, 0xc5, 0xd0, 0xd2, + 0xd6, 0xd4, 0xd2, 0xe5, 0xe1, 0xdb, 0xe5, 0xe7, 0xe1, 0xe7, 0xea, 0xee, + 0xee, 0xec, 0xf5, 0x00, 0xee, 0xf2, 0x05, 0xf5, 0xf4, 0x09, 0x19, 0x03, + 0x0e, 0x03, 0x16, 0x12, 0x0c, 0x0c, 0x19, 0x30, 0x1f, 0x16, 0x30, 0x23, + 0x21, 0x16, 0x10, 0x35, 0x2c, 0x1b, 0x19, 0x1d, 0x1f, 0x2c, 0x1d, 0x1d, + 0x0b, 0x23, 0x2c, 0x19, 0x1b, 0x18, 0x10, 0x1b, 0x0e, 0x0c, 0x10, 0x0c, + 0x10, 0x0e, 0x0e, 0x14, 0x12, 0x01, 0x00, 0x05, 0xfd, 0xf9, 0xff, 0xfb, + 0x00, 0xf5, 0xe7, 0xea, 0xf0, 0xf7, 0xe8, 0xe3, 0xda, 0xf0, 0xdb, 0xe1, + 0xdb, 0xc2, 0xcf, 0xdb, 0xe1, 0xd8, 0xd0, 0xd8, 0xdb, 0xcf, 0xd8, 0xe5, + 0xcd, 0xd8, 0xd6, 0xd8, 0xe3, 0xdd, 0xda, 0xdb, 0xe7, 0xd8, 0xdd, 0xe3, + 0xec, 0xf4, 0xf0, 0xf0, 0xf2, 0xec, 0xf0, 0xfb, 0xfd, 0xff, 0xf5, 0xfd, + 0x18, 0x09, 0xf4, 0x05, 0x10, 0x0b, 0x12, 0x10, 0x1f, 0x0e, 0x16, 0x19, + 0x0e, 0x14, 0x09, 0x14, 0x10, 0x0b, 0x2e, 0x1d, 0x1d, 0x28, 0x21, 0x26, + 0x28, 0x1f, 0x2c, 0x2c, 0x19, 0x16, 0x19, 0x1f, 0x26, 0x1b, 0x0c, 0x1d, + 0x21, 0x21, 0x1b, 0x12, 0x14, 0x10, 0x0c, 0x09, 0x09, 0x07, 0x03, 0x0b, + 0x09, 0x03, 0x03, 0xf9, 0xf2, 0xfb, 0x03, 0xf4, 0xec, 0xff, 0xff, 0xf2, + 0xec, 0xf0, 0xf2, 0xf5, 0xf7, 0xe5, 0xea, 0xe3, 0xe3, 0xe5, 0xe3, 0xd6, + 0xe3, 0xe8, 0xdd, 0xe3, 0xe5, 0xdf, 0xda, 0xd8, 0xe5, 0xea, 0xdf, 0xdd, + 0xdf, 0xe1, 0xe8, 0xe7, 0xe7, 0xee, 0xf0, 0xe3, 0xec, 0xf5, 0xf5, 0xee, + 0xea, 0xf5, 0xf9, 0xff, 0x09, 0xee, 0xe8, 0xf5, 0xfd, 0xec, 0x07, 0xff, + 0x00, 0xf5, 0x03, 0x05, 0xf9, 0x00, 0x23, 0x2e, 0x1b, 0x0e, 0xf0, 0x19, + 0x1b, 0x30, 0xfb, 0x0c, 0x35, 0x18, 0x0c, 0x26, 0x01, 0x18, 0x25, 0x12, + 0x1b, 0x25, 0x25, 0x12, 0x12, 0x25, 0x26, 0x0e, 0x12, 0x1f, 0x18, 0x16, + 0x1d, 0x1d, 0x14, 0x12, 0x10, 0x12, 0x0c, 0xff, 0x03, 0x10, 0x0c, 0xff, + 0xf7, 0xff, 0x00, 0x10, 0xfd, 0x09, 0xfd, 0x00, 0x03, 0xff, 0xdf, 0xec, + 0xf7, 0xff, 0xe1, 0xdd, 0xf2, 0xe8, 0xdd, 0xda, 0xe3, 0xdd, 0xe5, 0xda, + 0xdd, 0xdf, 0xd8, 0xd6, 0xd4, 0xdf, 0xe3, 0xd8, 0xd6, 0xe5, 0xe5, 0xea, + 0xe3, 0xe7, 0xee, 0xe7, 0xea, 0xee, 0xf0, 0xe7, 0xea, 0xf4, 0xf5, 0xf2, + 0xf7, 0xf2, 0x03, 0x01, 0xf5, 0xf7, 0xfd, 0xfd, 0x07, 0xfb, 0x0b, 0x01, + 0xf9, 0x03, 0x0e, 0x00, 0x03, 0x09, 0x05, 0x07, 0x05, 0x26, 0x19, 0x0b, + 0x2e, 0x1b, 0xfd, 0x0c, 0x30, 0x21, 0x03, 0x0e, 0x2a, 0x30, 0x28, 0x1b, + 0x1f, 0x18, 0x1d, 0x2a, 0x33, 0x19, 0x14, 0x1d, 0x16, 0x19, 0x19, 0x14, + 0x16, 0x16, 0x19, 0x14, 0x14, 0x12, 0x0e, 0x0b, 0x00, 0x10, 0x16, 0x0c, + 0x07, 0x05, 0x09, 0x01, 0xfb, 0xfb, 0x05, 0xf5, 0xf4, 0xf7, 0xe8, 0xff, + 0xee, 0xf0, 0xf2, 0xea, 0xdf, 0xdf, 0xe8, 0xe8, 0xdf, 0xd6, 0xdd, 0xe1, + 0xe8, 0xe1, 0xd6, 0xd2, 0xd6, 0xdf, 0xdd, 0xea, 0xe8, 0xdb, 0xdb, 0xd6, + 0xda, 0xe7, 0xe1, 0xe7, 0xe1, 0xe3, 0xe7, 0xec, 0xe8, 0xf2, 0xf0, 0xf7, + 0xf2, 0xf5, 0xf4, 0xee, 0xf0, 0xf7, 0xfd, 0xfb, 0xf7, 0x05, 0x0b, 0xff, + 0xff, 0x09, 0x1f, 0x0c, 0x12, 0x18, 0x14, 0x07, 0x16, 0x2a, 0x23, 0x1f, + 0x1d, 0x0c, 0x19, 0x25, 0x2a, 0x19, 0x16, 0x2a, 0x37, 0x1f, 0x28, 0x30, + 0x28, 0x1f, 0x25, 0x25, 0x16, 0x23, 0x21, 0x1d, 0x1b, 0x19, 0x21, 0x1b, + 0x12, 0x18, 0x16, 0x07, 0x12, 0x14, 0x0c, 0xff, 0xfd, 0x0b, 0x0c, 0x0c, + 0x07, 0x00, 0x03, 0xf5, 0xf2, 0xf0, 0xf2, 0xf0, 0xdf, 0xff, 0xec, 0xf2, + 0xe7, 0xdb, 0xe3, 0xe5, 0xd2, 0xdb, 0xe1, 0xdf, 0xdd, 0xd6, 0xd2, 0xd4, + 0xd0, 0xcf, 0xd8, 0xda, 0xe1, 0xdb, 0xd6, 0xd0, 0xd6, 0xda, 0xe1, 0xda, + 0xdb, 0xe3, 0xf0, 0xe8, 0xdf, 0xe1, 0xea, 0xee, 0xf0, 0xf4, 0xee, 0xf5, + 0xfb, 0xf4, 0xf4, 0xf4, 0xfb, 0xf9, 0x00, 0x01, 0x00, 0x03, 0x03, 0x12, + 0x18, 0x0b, 0x0e, 0x14, 0x12, 0x18, 0x21, 0x1f, 0x12, 0x21, 0x26, 0x21, + 0x1f, 0x26, 0x2a, 0x2c, 0x28, 0x1d, 0x1f, 0x25, 0x37, 0x2c, 0x21, 0x23, + 0x2e, 0x2a, 0x25, 0x1d, 0x16, 0x1f, 0x23, 0x23, 0x16, 0x14, 0x16, 0x1d, + 0x23, 0x12, 0x09, 0x12, 0x1d, 0x16, 0x0c, 0x07, 0x0e, 0x03, 0x03, 0x01, + 0x01, 0xfd, 0xf4, 0xf7, 0x01, 0xfd, 0xf7, 0xea, 0xe3, 0xea, 0xe8, 0xdd, + 0xe1, 0xe1, 0xdf, 0xe5, 0xdd, 0xda, 0xd2, 0xd4, 0xcd, 0xd6, 0xd4, 0xd0, + 0xda, 0xd6, 0xd8, 0xdd, 0xd8, 0xd4, 0xd8, 0xdb, 0xdd, 0xd8, 0xdf, 0xdf, + 0xe1, 0xdd, 0xe5, 0xea, 0xea, 0xea, 0xea, 0xea, 0xf0, 0xf0, 0xf2, 0xf9, + 0xff, 0xfd, 0xff, 0x00, 0x09, 0x05, 0x00, 0x07, 0x03, 0x01, 0x07, 0x10, + 0x18, 0x18, 0x12, 0x18, 0x1f, 0x14, 0x19, 0x21, 0x23, 0x23, 0x2c, 0x23, + 0x21, 0x23, 0x2a, 0x2a, 0x23, 0x21, 0x23, 0x21, 0x25, 0x1d, 0x21, 0x1f, + 0x18, 0x19, 0x1b, 0x1d, 0x23, 0x1b, 0x0c, 0x19, 0x1b, 0x19, 0x1b, 0x14, + 0x0e, 0x0e, 0x0c, 0x0b, 0x0b, 0x07, 0x05, 0x01, 0x01, 0x01, 0xff, 0xf7, + 0xf5, 0xf2, 0xf0, 0xf2, 0xee, 0xec, 0xea, 0xf0, 0xe5, 0xea, 0xee, 0xe7, + 0xdd, 0xe1, 0xe5, 0xe3, 0xe1, 0xe3, 0xd6, 0xd0, 0xdb, 0xe5, 0xe5, 0xd4, + 0xd8, 0xdf, 0xdb, 0xe5, 0xe5, 0xdf, 0xdd, 0xe7, 0xe5, 0xe7, 0xe8, 0xe7, + 0xee, 0xee, 0xea, 0xea, 0xea, 0xf5, 0xf5, 0xf4, 0xf4, 0xf5, 0xfb, 0xff, + 0x00, 0x01, 0x01, 0xff, 0x05, 0x09, 0x09, 0x07, 0x09, 0x10, 0x0c, 0x12, + 0x14, 0x12, 0x0c, 0x12, 0x14, 0x16, 0x18, 0x16, 0x10, 0x14, 0x12, 0x10, + 0x1b, 0x1f, 0x25, 0x16, 0x12, 0x12, 0x18, 0x18, 0x16, 0x12, 0x18, 0x19, + 0x1b, 0x19, 0x10, 0x0e, 0x14, 0x10, 0x14, 0x18, 0x12, 0x10, 0x18, 0x10, + 0x0b, 0x09, 0x10, 0x0e, 0x03, 0xfd, 0x07, 0x07, 0x0c, 0x05, 0xf9, 0xf9, + 0x05, 0xff, 0xf5, 0xfd, 0xf5, 0xf9, 0xf5, 0xee, 0xf5, 0xf4, 0xf4, 0xf0, + 0xf5, 0xf9, 0xf2, 0xec, 0xea, 0xe1, 0xe5, 0xee, 0xec, 0xec, 0xe7, 0xf0, + 0xec, 0xee, 0xf0, 0xee, 0xe8, 0xe7, 0xec, 0xf0, 0xf0, 0xf0, 0xf4, 0xf2, + 0xee, 0xe8, 0xf4, 0xf7, 0xf7, 0xf5, 0xf2, 0xf7, 0xf9, 0xf5, 0xf4, 0xf9, + 0xff, 0xf9, 0xf4, 0xfb, 0xf7, 0xf4, 0xf7, 0xfd, 0xff, 0x03, 0x01, 0x00, + 0x01, 0x05, 0x00, 0x07, 0x03, 0x01, 0x07, 0x07, 0x0b, 0x09, 0x0c, 0x10, + 0x0e, 0x0b, 0x10, 0x0e, 0x0b, 0x09, 0x03, 0x03, 0x0b, 0x0c, 0x0b, 0x12, + 0x0e, 0x12, 0x14, 0x12, 0x10, 0x0e, 0x16, 0x14, 0x12, 0x0e, 0x12, 0x16, + 0x16, 0x12, 0x18, 0x14, 0x12, 0x14, 0x18, 0x0e, 0x0e, 0x16, 0x12, 0x01, + 0x09, 0x12, 0x10, 0x09, 0x07, 0x09, 0x10, 0x07, 0xfd, 0xfd, 0x09, 0x05, + 0xf9, 0xf5, 0x03, 0x03, 0xfb, 0xf2, 0xf9, 0xf2, 0xfb, 0xff, 0xf0, 0xec, + 0xf0, 0xee, 0xf0, 0xec, 0xea, 0xfb, 0xf2, 0xe3, 0xe7, 0xe8, 0xe7, 0xe5, + 0xea, 0xea, 0xe7, 0xec, 0xe8, 0xe8, 0xe8, 0xf0, 0xec, 0xe7, 0xea, 0xec, + 0xec, 0xe5, 0xea, 0xec, 0xf4, 0xf4, 0xf2, 0xf2, 0xf2, 0xf5, 0xf5, 0xf0, + 0xf2, 0xf2, 0xf4, 0xfb, 0xfd, 0xfb, 0xf5, 0xf4, 0xf9, 0xf7, 0xfb, 0xf7, + 0xf5, 0x00, 0x05, 0x07, 0x07, 0x07, 0x0c, 0x09, 0x0b, 0x0c, 0x10, 0x10, + 0x14, 0x16, 0x14, 0x12, 0x14, 0x1b, 0x1f, 0x21, 0x23, 0x23, 0x21, 0x1d, + 0x1b, 0x1b, 0x21, 0x1d, 0x1d, 0x21, 0x1b, 0x1d, 0x16, 0x1d, 0x1b, 0x19, + 0x1b, 0x18, 0x12, 0x12, 0x16, 0x0e, 0x0e, 0x0b, 0x05, 0x0e, 0x10, 0x07, + 0x05, 0x03, 0x05, 0x00, 0xf7, 0xff, 0x00, 0xfb, 0xf9, 0xf9, 0xfb, 0xf9, + 0xf4, 0xf4, 0xf2, 0xe8, 0xf0, 0xea, 0xec, 0xea, 0xe8, 0xe7, 0xe3, 0xdd, + 0xdb, 0xdf, 0xe7, 0xdf, 0xda, 0xe3, 0xdd, 0xe5, 0xe1, 0xdd, 0xdf, 0xe3, + 0xe1, 0xe5, 0xe7, 0xe5, 0xe5, 0xdd, 0xe7, 0xee, 0xe7, 0xe8, 0xea, 0xf2, + 0xf4, 0xee, 0xf0, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xff, 0x00, 0x01, 0x03, + 0xfd, 0x00, 0x0b, 0x10, 0x0e, 0x05, 0x12, 0x14, 0x12, 0x18, 0x16, 0x16, + 0x18, 0x16, 0x19, 0x1f, 0x21, 0x1d, 0x1f, 0x1d, 0x23, 0x1f, 0x21, 0x23, + 0x23, 0x21, 0x1f, 0x21, 0x23, 0x1f, 0x21, 0x1b, 0x1b, 0x19, 0x23, 0x23, + 0x1d, 0x14, 0x16, 0x1d, 0x18, 0x18, 0x12, 0x10, 0x0e, 0x16, 0x10, 0x0e, + 0x07, 0x05, 0x07, 0x05, 0x05, 0xff, 0xfd, 0x01, 0xfd, 0xfb, 0xf7, 0xf4, + 0xf2, 0xee, 0xee, 0xf7, 0xea, 0xe3, 0xe7, 0xee, 0xea, 0xe5, 0xe3, 0xea, + 0xe8, 0xe3, 0xe3, 0xe7, 0xdd, 0xe3, 0xe5, 0xe5, 0xdf, 0xdd, 0xdd, 0xdb, + 0xe1, 0xdf, 0xdb, 0xe3, 0xe5, 0xe3, 0xe7, 0xe3, 0xdf, 0xe3, 0xe5, 0xea, + 0xea, 0xe7, 0xec, 0xf0, 0xee, 0xf0, 0xf4, 0xf4, 0xf2, 0xf0, 0x00, 0x01, + 0xf9, 0xf9, 0x00, 0x09, 0x09, 0x05, 0x03, 0x09, 0x0c, 0x12, 0x14, 0x14, + 0x12, 0x12, 0x16, 0x19, 0x10, 0x12, 0x12, 0x14, 0x18, 0x1b, 0x1b, 0x19, + 0x1b, 0x1d, 0x21, 0x1f, 0x1b, 0x19, 0x1f, 0x23, 0x1b, 0x19, 0x1b, 0x16, + 0x1d, 0x18, 0x14, 0x18, 0x16, 0x14, 0x14, 0x16, 0x10, 0x0e, 0x0e, 0x14, + 0x12, 0x0c, 0x0b, 0x03, 0x0b, 0x07, 0x01, 0x01, 0x03, 0x01, 0x03, 0xfb, + 0xfd, 0xf9, 0xf9, 0xf5, 0xf2, 0xf2, 0xf5, 0xf7, 0xf0, 0xea, 0xf0, 0xf9, + 0xf2, 0xea, 0xf0, 0xf7, 0xf2, 0xe7, 0xe8, 0xf0, 0xf0, 0xee, 0xea, 0xea, + 0xf4, 0xf4, 0xe8, 0xec, 0xee, 0xe8, 0xe7, 0xea, 0xea, 0xee, 0xe5, 0xec, + 0xf2, 0xf2, 0xf0, 0xf0, 0xf2, 0xf9, 0xf2, 0xf4, 0xfb, 0xf5, 0xee, 0xf0, + 0xfd, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x05, 0x09, 0x0e, 0x0c, 0x03, 0x07, 0x09, 0x0e, 0x0e, 0x0e, 0x07, + 0x07, 0x0c, 0x0b, 0x0c, 0x14, 0x10, 0x0c, 0x0c, 0x09, 0x12, 0x0c, 0x09, + 0x09, 0x0e, 0x12, 0x0c, 0x0c, 0x0e, 0x0c, 0x0e, 0x0e, 0x0b, 0x0c, 0x0b, + 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x07, 0x05, 0x05, 0x0c, 0x05, 0x07, 0x05, + 0x09, 0x09, 0x09, 0x07, 0x05, 0x07, 0x03, 0x03, 0x09, 0x09, 0x05, 0x00, + 0x00, 0xff, 0xff, 0x03, 0x01, 0xff, 0x00, 0x01, 0xfd, 0xf5, 0xf9, 0x00, + 0xfb, 0xf5, 0xf4, 0xf7, 0xfb, 0xf7, 0xfb, 0xfb, 0xfb, 0xf0, 0xf4, 0xf5, + 0xf7, 0xf4, 0xec, 0xf2, 0xf2, 0xf5, 0xf5, 0xf2, 0xee, 0xec, 0xf0, 0xee, + 0xf2, 0xf5, 0xf2, 0xec, 0xf4, 0xf7, 0xf0, 0xf4, 0xf9, 0xf7, 0xf2, 0xf4, + 0xf5, 0xf5, 0xf7, 0xf5, 0xf9, 0xf4, 0xf5, 0xfd, 0x00, 0xf9, 0xf9, 0xf9, + 0xf9, 0xff, 0x01, 0xfd, 0x00, 0xfd, 0x03, 0x05, 0xfd, 0x01, 0x03, 0x03, + 0x01, 0x03, 0x01, 0x05, 0x0c, 0x0b, 0x09, 0x05, 0x09, 0x0b, 0x09, 0x0c, + 0x10, 0x0c, 0x09, 0x0c, 0x0b, 0x12, 0x0b, 0x09, 0x0c, 0x0c, 0x0e, 0x12, + 0x0e, 0x0e, 0x0c, 0x0b, 0x0e, 0x14, 0x0c, 0x10, 0x12, 0x18, 0x16, 0x0b, + 0x03, 0x07, 0x0b, 0x0c, 0x0b, 0x0c, 0x0e, 0x09, 0x09, 0x01, 0x05, 0x0c, + 0x05, 0x05, 0x0b, 0x03, 0xfd, 0xfd, 0x00, 0xfb, 0xff, 0xfd, 0xfd, 0xff, + 0xfd, 0xff, 0xf9, 0xf5, 0xf4, 0xf5, 0xf5, 0xf5, 0xf9, 0xf7, 0xf2, 0xf2, + 0xea, 0xf0, 0xf4, 0xf2, 0xee, 0xec, 0xf0, 0xf2, 0xe8, 0xe8, 0xee, 0xea, + 0xe5, 0xe8, 0xe8, 0xee, 0xe8, 0xec, 0xe7, 0xe8, 0xe8, 0xee, 0xf0, 0xf4, + 0xf2, 0xf4, 0xf4, 0xf4, 0xf2, 0xf2, 0xf5, 0xf7, 0xf9, 0xf9, 0xff, 0x00, + 0xfb, 0xfd, 0x01, 0x03, 0x03, 0x09, 0x01, 0x01, 0x05, 0x09, 0x09, 0x07, + 0x03, 0x07, 0x0c, 0x0e, 0x0b, 0x10, 0x0e, 0x09, 0x0c, 0x0c, 0x0e, 0x0e, + 0x0e, 0x0c, 0x10, 0x12, 0x14, 0x16, 0x10, 0x0e, 0x0e, 0x0e, 0x0c, 0x0e, + 0x12, 0x10, 0x0b, 0x12, 0x10, 0x0e, 0x0c, 0x0e, 0x0e, 0x10, 0x0b, 0x0e, + 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x03, 0x0b, 0x09, 0x01, 0x01, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x05, 0xff, 0xfd, 0xfb, 0xf9, 0xfd, + 0xfb, 0xf0, 0xf9, 0xf5, 0xfb, 0xf5, 0xf2, 0xf0, 0xfb, 0xf7, 0xf4, 0xee, + 0xf0, 0xea, 0xea, 0xe5, 0xec, 0xf0, 0xec, 0xe8, 0xee, 0xf5, 0xf4, 0xee, + 0xee, 0xf0, 0xee, 0xea, 0xec, 0xec, 0xf4, 0xf5, 0xec, 0xf2, 0xf2, 0xf4, + 0xf0, 0xee, 0xf0, 0xf5, 0xf2, 0xf4, 0xf5, 0xf9, 0xfd, 0xfb, 0xf4, 0xff, + 0xff, 0xfd, 0xfb, 0xfd, 0x01, 0x00, 0xff, 0x00, 0x09, 0x00, 0x05, 0x09, + 0x09, 0x09, 0x0c, 0x05, 0x03, 0xff, 0x03, 0x0c, 0x0c, 0x00, 0x01, 0x09, + 0x0e, 0x0b, 0x09, 0x10, 0x10, 0x0b, 0x0e, 0x0b, 0x07, 0x0b, 0x0c, 0x0b, + 0x0e, 0x12, 0x10, 0x0e, 0x0c, 0x0e, 0x0e, 0x0c, 0x0c, 0x0e, 0x09, 0x10, + 0x0c, 0x14, 0x14, 0x10, 0x0e, 0x0c, 0x0b, 0x0e, 0x0e, 0x0e, 0x09, 0x09, + 0x0c, 0x0c, 0x0b, 0x0c, 0x07, 0x07, 0x0b, 0x05, 0x01, 0xff, 0x00, 0xfb, + 0x03, 0x01, 0x00, 0x01, 0x05, 0x05, 0xff, 0xf9, 0xf5, 0xfb, 0xf9, 0xf7, + 0xfb, 0xf2, 0xf4, 0xf4, 0xf5, 0xf2, 0xf4, 0xf5, 0xf2, 0xec, 0xee, 0xf0, + 0xea, 0xe7, 0xec, 0xee, 0xec, 0xea, 0xec, 0xf0, 0xee, 0xea, 0xec, 0xea, + 0xec, 0xea, 0xea, 0xf0, 0xec, 0xee, 0xea, 0xec, 0xf2, 0xf4, 0xf4, 0xee, + 0xf4, 0xf5, 0xf0, 0xf0, 0xf7, 0xfb, 0xfb, 0xf7, 0xf5, 0xf9, 0xfd, 0xfb, + 0xfd, 0x00, 0x00, 0xff, 0x00, 0x03, 0x01, 0x01, 0x05, 0x05, 0x01, 0x05, + 0x0b, 0x0e, 0x09, 0x05, 0x0b, 0x10, 0x09, 0x09, 0x0b, 0x10, 0x18, 0x14, + 0x12, 0x12, 0x12, 0x16, 0x12, 0x0c, 0x14, 0x19, 0x18, 0x18, 0x19, 0x1b, + 0x1b, 0x19, 0x16, 0x16, 0x1b, 0x1d, 0x1d, 0x1f, 0x16, 0x12, 0x16, 0x18, + 0x18, 0x12, 0x16, 0x19, 0x10, 0x12, 0x12, 0x10, 0x0e, 0x0b, 0x07, 0x09, + 0x0c, 0x05, 0x03, 0x03, 0x03, 0x05, 0x00, 0xfb, 0xfb, 0xfd, 0xf9, 0xf4, + 0xf5, 0xf7, 0xf4, 0xec, 0xea, 0xea, 0xf0, 0xee, 0xec, 0xe5, 0xe3, 0xea, + 0xe5, 0xe8, 0xdf, 0xdd, 0xe1, 0xe3, 0xdd, 0xdd, 0xe1, 0xe5, 0xdd, 0xdd, + 0xdd, 0xe1, 0xe3, 0xe7, 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe8, 0xe1, 0xe7, + 0xec, 0xec, 0xe8, 0xec, 0xf0, 0xf2, 0xee, 0xec, 0xee, 0xfb, 0xff, 0xf9, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x05, 0x09, 0x09, 0x0b, 0x07, + 0x07, 0x0c, 0x10, 0x10, 0x0e, 0x0e, 0x16, 0x16, 0x10, 0x10, 0x14, 0x18, + 0x16, 0x16, 0x18, 0x18, 0x19, 0x16, 0x16, 0x12, 0x16, 0x19, 0x19, 0x1b, + 0x1b, 0x18, 0x18, 0x19, 0x1f, 0x18, 0x18, 0x19, 0x18, 0x1d, 0x19, 0x18, + 0x16, 0x18, 0x18, 0x19, 0x16, 0x12, 0x0c, 0x0e, 0x10, 0x0c, 0x0c, 0x0b, + 0x09, 0x05, 0x09, 0x05, 0xff, 0x00, 0xfb, 0xfd, 0xff, 0xf7, 0xf4, 0xf7, + 0xf7, 0xf7, 0xf4, 0xf0, 0xf4, 0xf0, 0xf0, 0xe7, 0xe5, 0xe8, 0xe7, 0xe7, + 0xea, 0xe8, 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe1, 0xe3, 0xe1, 0xe3, 0xe5, + 0xe1, 0xdf, 0xe1, 0xe5, 0xea, 0xe7, 0xe3, 0xe5, 0xe8, 0xee, 0xf2, 0xec, + 0xe8, 0xe7, 0xec, 0xf4, 0xf7, 0xf5, 0xf7, 0xf4, 0xf9, 0xfd, 0xfd, 0xfb, + 0xfb, 0xfb, 0xff, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x07, 0x0b, + 0x05, 0x05, 0x09, 0x07, 0x0c, 0x0c, 0x0c, 0x14, 0x14, 0x14, 0x0c, 0x0c, + 0x0e, 0x0e, 0x10, 0x0c, 0x10, 0x16, 0x16, 0x10, 0x14, 0x16, 0x14, 0x16, + 0x14, 0x12, 0x18, 0x19, 0x14, 0x10, 0x1b, 0x1b, 0x19, 0x18, 0x14, 0x19, + 0x18, 0x14, 0x12, 0x14, 0x16, 0x12, 0x0c, 0x10, 0x12, 0x10, 0x0e, 0x0c, + 0x0b, 0x09, 0x07, 0x07, 0x07, 0x05, 0x03, 0x05, 0x03, 0x07, 0x00, 0xfb, + 0xf9, 0xff, 0x00, 0xfd, 0xf7, 0xf9, 0xf4, 0xf2, 0xf5, 0xf4, 0xf0, 0xf5, + 0xf2, 0xee, 0xea, 0xec, 0xec, 0xea, 0xe8, 0xea, 0xe3, 0xe5, 0xe7, 0xea, + 0xe8, 0xe5, 0xe7, 0xe8, 0xe7, 0xe1, 0xdf, 0xe3, 0xe7, 0xe3, 0xe5, 0xea, + 0xe8, 0xe8, 0xea, 0xee, 0xea, 0xe5, 0xe8, 0xee, 0xee, 0xf0, 0xf0, 0xf0, + 0xf4, 0xf4, 0xf0, 0xf2, 0xf2, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfb, + 0x00, 0x00, 0xfb, 0xff, 0x05, 0x09, 0x01, 0x09, 0x09, 0x07, 0x07, 0x0b, + 0x0e, 0x10, 0x0c, 0x12, 0x16, 0x12, 0x0e, 0x14, 0x16, 0x19, 0x1b, 0x18, + 0x18, 0x19, 0x1b, 0x1b, 0x1b, 0x18, 0x1b, 0x1d, 0x1f, 0x23, 0x1f, 0x1b, + 0x1b, 0x18, 0x19, 0x1b, 0x1d, 0x1f, 0x1d, 0x1b, 0x1d, 0x1b, 0x18, 0x18, + 0x16, 0x14, 0x16, 0x12, 0x12, 0x14, 0x10, 0x0e, 0x0e, 0x0c, 0x09, 0x05, + 0x07, 0x09, 0x07, 0x00, 0xfb, 0xfd, 0xf9, 0xf7, 0xf5, 0xf2, 0xf0, 0xf0, + 0xf0, 0xea, 0xec, 0xe7, 0xe8, 0xe5, 0xe5, 0xe7, 0xe3, 0xe3, 0xe1, 0xe1, + 0xda, 0xdb, 0xe5, 0xdf, 0xdb, 0xdd, 0xdb, 0xdf, 0xdd, 0xdd, 0xdb, 0xdd, + 0xdb, 0xdd, 0xdb, 0xdd, 0xe3, 0xe5, 0xe5, 0xe3, 0xe1, 0xe5, 0xe5, 0xe7, + 0xea, 0xea, 0xee, 0xf2, 0xf4, 0xf5, 0xf2, 0xf4, 0xf7, 0xfb, 0xfd, 0xfd, + 0xfd, 0xff, 0x01, 0x05, 0x07, 0x07, 0x07, 0x09, 0x07, 0x0c, 0x0b, 0x0e, + 0x0e, 0x12, 0x16, 0x16, 0x14, 0x19, 0x1b, 0x1b, 0x19, 0x19, 0x1b, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1b, 0x1f, 0x23, 0x21, 0x1b, 0x1b, 0x1d, 0x19, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x16, 0x18, 0x16, 0x12, 0x12, + 0x12, 0x10, 0x0e, 0x0c, 0x09, 0x0b, 0x0b, 0x09, 0x05, 0x00, 0x03, 0xff, + 0x00, 0xfd, 0xfd, 0xfb, 0xf7, 0xfd, 0xf9, 0xf4, 0xf4, 0xf2, 0xf0, 0xee, + 0xea, 0xea, 0xea, 0xea, 0xe7, 0xe7, 0xe5, 0xe7, 0xe5, 0xe3, 0xe1, 0xe1, + 0xe3, 0xe3, 0xe3, 0xe5, 0xe1, 0xe1, 0xe3, 0xe7, 0xe7, 0xe7, 0xe8, 0xe5, + 0xe7, 0xe8, 0xea, 0xec, 0xea, 0xee, 0xf2, 0xf2, 0xf2, 0xee, 0xf4, 0xf4, + 0xf4, 0xf2, 0xf4, 0xf7, 0xf9, 0xf9, 0xf9, 0xfb, 0x00, 0x03, 0x01, 0x00, + 0x00, 0x03, 0x05, 0x05, 0x07, 0x0b, 0x0e, 0x0c, 0x0c, 0x10, 0x10, 0x0e, + 0x0c, 0x10, 0x14, 0x14, 0x12, 0x12, 0x12, 0x12, 0x12, 0x14, 0x12, 0x14, + 0x14, 0x12, 0x10, 0x10, 0x12, 0x0e, 0x0c, 0x0c, 0x10, 0x10, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0e, 0x0c, 0x0e, 0x09, 0x09, 0x0b, 0x09, 0x07, 0x05, 0x09, + 0x0c, 0x0b, 0x01, 0x07, 0x09, 0x05, 0x07, 0x01, 0x01, 0x00, 0xff, 0x00, + 0xff, 0xfb, 0xfb, 0xfd, 0xfd, 0xfb, 0xf7, 0xfb, 0xfd, 0xf7, 0xf5, 0xf5, + 0xf5, 0xf9, 0xf5, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xf7, 0xf4, 0xf4, 0xf4, + 0xf9, 0xf7, 0xf4, 0xf5, 0xf9, 0xfb, 0xf9, 0xf5, 0xf4, 0xf7, 0xf2, 0xf5, + 0xf4, 0xf4, 0xf2, 0xf2, 0xf5, 0xf5, 0xf7, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, + 0xf5, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, 0xff, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, + 0x01, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0xfd, 0xff, 0x03, 0x01, + 0x01, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x05, 0x05, 0x05, 0x07, 0x07, + 0x07, 0x09, 0x07, 0x07, 0x05, 0x05, 0x0b, 0x09, 0x07, 0x09, 0x07, 0x09, + 0x09, 0x07, 0x05, 0x03, 0x05, 0x09, 0x07, 0x07, 0x09, 0x07, 0x05, 0x01, + 0x00, 0x03, 0x07, 0x07, 0x05, 0x03, 0x05, 0x01, 0x01, 0x03, 0x03, 0x01, + 0x07, 0x07, 0x03, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0xfd, + 0xfb, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xfb, 0xf9, 0xf5, 0xf5, 0xf5, 0xf7, + 0xf5, 0xf5, 0xf9, 0xf7, 0xf9, 0xf7, 0xf4, 0xf4, 0xf5, 0xf7, 0xf5, 0xf4, + 0xf2, 0xf4, 0xf7, 0xf7, 0xf9, 0xfb, 0xf9, 0xf4, 0xf5, 0xf9, 0xf9, 0xf7, + 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, 0xfb, 0xf9, 0xfb, 0xfd, 0xfd, 0xfb, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0x01, 0x01, 0x00, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x01, 0x05, 0x05, 0x07, 0x09, 0x07, 0x07, 0x0b, 0x09, + 0x09, 0x07, 0x07, 0x07, 0x0b, 0x0c, 0x09, 0x05, 0x07, 0x09, 0x09, 0x07, + 0x07, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x03, 0x03, 0x03, 0x09, 0x05, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x00, 0xfd, 0xff, 0x00, 0xff, 0xfd, 0xf9, 0xfb, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf7, 0xf7, 0xf5, 0xf5, 0xf7, 0xfb, 0xf7, 0xf7, 0xf5, 0xf7, + 0xf9, 0xfb, 0xf9, 0xf9, 0xf9, 0xfb, 0xfb, 0xfb, 0xff, 0xfb, 0xf7, 0xfb, + 0xfd, 0xff, 0xfd, 0xf7, 0xf7, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0x00, 0x00, + 0x01, 0x00, 0xff, 0x00, 0xff, 0x01, 0x01, 0x00, 0x03, 0x03, 0x01, 0x03, + 0x03, 0x03, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07, + 0x07, 0x07, 0x05, 0x07, 0x09, 0x09, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, + 0x03, 0x03, 0x01, 0x00, 0x01, 0x05, 0x03, 0x00, 0xff, 0x01, 0x03, 0xff, + 0xfb, 0x00, 0xff, 0xfb, 0xfb, 0xff, 0xfd, 0xf9, 0xf9, 0xf7, 0xf9, 0xf7, + 0xf7, 0xf9, 0xfb, 0xf9, 0xf9, 0xf7, 0xf9, 0xf9, 0xf7, 0xf7, 0x00, 0x00, + 0xfe, 0xfc, 0xf4, 0xf4, 0xeb, 0xf4, 0xe4, 0xff, 0x01, 0xe7, 0xf4, 0xdb, + 0xff, 0xe3, 0x17, 0xfd, 0xfb, 0xe5, 0x02, 0x18, 0xdc, 0xf9, 0x0d, 0x0b, + 0x0b, 0x26, 0xe1, 0x34, 0x38, 0x24, 0xff, 0x22, 0x03, 0x26, 0x09, 0x4d, + 0x09, 0x34, 0x28, 0x22, 0x11, 0x3a, 0x20, 0x30, 0x1b, 0x30, 0x1d, 0x1d, + 0x2e, 0x32, 0x4f, 0x57, 0x38, 0x68, 0x20, 0x3c, 0xe1, 0x40, 0x2a, 0x40, + 0x3c, 0x26, 0x2e, 0x40, 0x53, 0x61, 0x1b, 0x45, 0x05, 0x49, 0x0b, 0x4b, + 0x4b, 0x40, 0x49, 0x32, 0x30, 0x2e, 0x59, 0x3a, 0x4d, 0xff, 0x1f, 0x4d, + 0x22, 0x4b, 0x00, 0x05, 0x3e, 0x4b, 0x1d, 0x03, 0x07, 0x45, 0x2e, 0x1d, + 0x34, 0x01, 0x20, 0x11, 0x0b, 0xfb, 0x30, 0x0b, 0xe5, 0x09, 0x13, 0x1b, + 0x0d, 0xff, 0xc8, 0x0b, 0xd4, 0x26, 0x11, 0xe3, 0xc0, 0xd2, 0x0d, 0xfb, + 0xc2, 0xda, 0xcc, 0xef, 0xd6, 0xfb, 0xd2, 0xed, 0xb1, 0xca, 0xe5, 0xc0, + 0xd4, 0xbb, 0xb9, 0xbd, 0xd6, 0xcc, 0xb3, 0xd6, 0xb5, 0xc0, 0xce, 0xce, + 0xbb, 0xbd, 0xb3, 0xd0, 0xbf, 0xb5, 0xb3, 0xbd, 0xbd, 0xc4, 0xc4, 0xc4, + 0xa7, 0xc2, 0xab, 0xd8, 0xb7, 0xc6, 0xc2, 0xb1, 0xbd, 0xd6, 0xca, 0xc4, + 0xbb, 0xc4, 0xe3, 0xb5, 0xe1, 0xbb, 0xd6, 0xdc, 0xde, 0xc0, 0xca, 0xd4, + 0xeb, 0xd8, 0xd6, 0xcc, 0xcc, 0xed, 0xde, 0xe9, 0xe1, 0xe1, 0xf5, 0xdc, + 0xda, 0xed, 0xf1, 0xf1, 0xe3, 0xda, 0xe9, 0xf5, 0xf7, 0xf3, 0xff, 0x03, + 0x0f, 0x07, 0xff, 0xff, 0x03, 0x07, 0x1b, 0x07, 0x07, 0x05, 0x24, 0x13, + 0x19, 0x0f, 0x1f, 0x0d, 0x1f, 0x20, 0x11, 0x20, 0x1f, 0x32, 0x28, 0x3a, + 0x20, 0x2e, 0x1b, 0x30, 0x2c, 0x3c, 0x2e, 0x2a, 0x30, 0x3e, 0x38, 0x34, + 0x24, 0x2e, 0x22, 0x2e, 0x32, 0x47, 0x30, 0x34, 0x38, 0x2c, 0x3a, 0x41, + 0x38, 0x2c, 0x45, 0x2c, 0x26, 0x38, 0x24, 0x22, 0x3e, 0x36, 0x3e, 0x28, + 0x24, 0x20, 0x2e, 0x28, 0x3a, 0x32, 0x32, 0x2c, 0x34, 0x17, 0x2e, 0x1d, + 0x2e, 0x2e, 0x32, 0x30, 0x2a, 0x26, 0x28, 0x19, 0x28, 0x24, 0x26, 0x32, + 0x1d, 0x1f, 0x26, 0x20, 0x24, 0x22, 0x1b, 0x17, 0x17, 0x1f, 0x24, 0x24, + 0x17, 0x1b, 0x17, 0x19, 0x13, 0x1d, 0x0f, 0x11, 0x0f, 0x0f, 0x0d, 0x0f, + 0x09, 0x11, 0x00, 0x0b, 0x05, 0x0d, 0x00, 0x0d, 0x01, 0x03, 0x03, 0xf7, + 0x01, 0xfd, 0x03, 0x07, 0xfb, 0x01, 0xf9, 0xf7, 0xf5, 0xfd, 0xf7, 0xf5, + 0xf7, 0xe9, 0xf1, 0x00, 0xf7, 0xeb, 0xde, 0xe1, 0xde, 0xe9, 0xf1, 0xef, + 0xed, 0xe3, 0xd4, 0xde, 0xe3, 0xe3, 0xe0, 0xe0, 0xdc, 0xde, 0xd8, 0xda, + 0xd8, 0xd8, 0xd4, 0xd2, 0xcc, 0xd0, 0xcc, 0xc8, 0xce, 0xd6, 0xcc, 0xca, + 0xc8, 0xc8, 0xc6, 0xcc, 0xc4, 0xca, 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, + 0xc2, 0xc0, 0xc4, 0xc8, 0xca, 0xcc, 0xca, 0xc4, 0xc8, 0xc6, 0xce, 0xc4, + 0xce, 0xc8, 0xc6, 0xce, 0xce, 0xd0, 0xd4, 0xd4, 0xd4, 0xd6, 0xd6, 0xd8, + 0xd8, 0xd4, 0xd8, 0xde, 0xde, 0xde, 0xe0, 0xe1, 0xde, 0xe1, 0xe1, 0xe5, + 0xe7, 0xeb, 0xed, 0xed, 0xe9, 0xeb, 0xef, 0xf1, 0xf3, 0xef, 0xf7, 0xfd, + 0xfb, 0xf7, 0xf5, 0xf9, 0xff, 0xfd, 0xff, 0xff, 0x03, 0x07, 0x05, 0x00, + 0x09, 0x07, 0x0d, 0x09, 0x0d, 0x09, 0x11, 0x15, 0x1b, 0x15, 0x0f, 0x0d, + 0x13, 0x13, 0x15, 0x17, 0x1d, 0x17, 0x17, 0x17, 0x1d, 0x1d, 0x24, 0x24, + 0x22, 0x1d, 0x1d, 0x22, 0x26, 0x26, 0x26, 0x20, 0x22, 0x22, 0x22, 0x24, + 0x26, 0x26, 0x28, 0x2a, 0x28, 0x20, 0x22, 0x26, 0x26, 0x2a, 0x2a, 0x2a, + 0x28, 0x2a, 0x26, 0x24, 0x22, 0x28, 0x2a, 0x2a, 0x28, 0x2a, 0x2c, 0x2e, + 0x2c, 0x28, 0x26, 0x26, 0x26, 0x26, 0x2a, 0x28, 0x26, 0x26, 0x26, 0x22, + 0x1f, 0x24, 0x28, 0x2a, 0x2a, 0x22, 0x24, 0x26, 0x24, 0x20, 0x1f, 0x20, + 0x1f, 0x1d, 0x1d, 0x19, 0x1b, 0x1b, 0x1f, 0x1f, 0x1b, 0x15, 0x17, 0x1b, + 0x1f, 0x1b, 0x15, 0x13, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x11, 0x0d, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, 0x05, 0x03, 0x03, 0x03, 0x05, 0x09, + 0x09, 0x05, 0xff, 0xf9, 0xf7, 0xfd, 0x01, 0x01, 0x00, 0xff, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf5, 0xf5, 0xf9, 0xf9, 0xf5, 0xef, 0xef, 0xed, 0xf1, 0xf3, + 0xf1, 0xef, 0xeb, 0xe9, 0xe9, 0xeb, 0xeb, 0xeb, 0xe7, 0xe7, 0xe5, 0xe7, + 0xed, 0xeb, 0xe3, 0xe0, 0xe1, 0xe3, 0xe3, 0xe1, 0xe3, 0xe5, 0xe7, 0xe7, + 0xe1, 0xe0, 0xde, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe3, 0xe3, 0xe5, 0xe7, + 0xe3, 0xde, 0xde, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xdc, 0xe1, 0xe3, 0xe1, + 0xe3, 0xe1, 0xe1, 0xe0, 0xe0, 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xeb, 0xe7, + 0xe3, 0xe0, 0xe0, 0xe3, 0xe5, 0xe7, 0xe3, 0xe1, 0xe3, 0xe7, 0xed, 0xed, + 0xeb, 0xe9, 0xed, 0xed, 0xef, 0xed, 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, + 0xf3, 0xf5, 0xf5, 0xf3, 0xf1, 0xef, 0xef, 0xf1, 0xf5, 0xf5, 0xf3, 0xf1, + 0xed, 0xf1, 0xf5, 0xf9, 0xfd, 0xfd, 0xf7, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, + 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xfd, 0xff, 0xfd, 0xff, 0xfd, + 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xfd, 0xfd, 0x00, 0x01, 0x01, 0xff, 0xfd, + 0xfd, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0xff, 0x01, 0x01, 0x03, + 0x03, 0x00, 0x00, 0x01, 0x05, 0x05, 0x05, 0x03, 0x03, 0x05, 0x03, 0x01, + 0x03, 0x07, 0x09, 0x07, 0x03, 0x01, 0x05, 0x07, 0x09, 0x07, 0x05, 0x05, + 0x07, 0x0b, 0x09, 0x05, 0x03, 0x01, 0x03, 0x07, 0x09, 0x0b, 0x09, 0x09, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x07, 0x09, + 0x0b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x13, 0x13, 0x11, 0x0f, 0x0d, 0x0d, + 0x0f, 0x11, 0x11, 0x0f, 0x0d, 0x0f, 0x0f, 0x11, 0x0f, 0x11, 0x13, 0x0f, + 0x0f, 0x0f, 0x13, 0x13, 0x15, 0x13, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0d, + 0x13, 0x17, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x13, 0x15, 0x15, 0x17, + 0x15, 0x11, 0x11, 0x15, 0x17, 0x15, 0x13, 0x15, 0x19, 0x19, 0x19, 0x15, + 0x13, 0x13, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x13, 0x13, 0x13, 0x13, + 0x11, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x13, 0x0f, + 0x0f, 0x17, 0x1d, 0x1b, 0x17, 0x15, 0x13, 0x15, 0x1b, 0x1b, 0x17, 0x17, + 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, 0x11, 0x13, 0x15, 0x17, 0x11, 0x0d, + 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0b, 0x09, 0x0b, 0x0f, 0x0d, 0x09, 0x09, + 0x07, 0x09, 0x0b, 0x0b, 0x09, 0x01, 0x00, 0x01, 0x03, 0x03, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf3, + 0xf3, 0xf5, 0xf7, 0xf5, 0xf1, 0xf1, 0xf3, 0xf3, 0xf1, 0xed, 0xeb, 0xe9, + 0xed, 0xed, 0xed, 0xeb, 0xe9, 0xe7, 0xe7, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe0, 0xe0, 0xe0, 0xe0, 0xde, 0xdc, 0xde, + 0xe0, 0xe0, 0xdc, 0xd8, 0xd8, 0xdc, 0xde, 0xda, 0xd8, 0xd8, 0xde, 0xe0, + 0xdc, 0xda, 0xda, 0xdc, 0xde, 0xe0, 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, + 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xdc, 0xde, 0xe1, 0xe3, 0xe1, 0xe0, 0xe0, + 0xde, 0xe0, 0xe0, 0xe1, 0xe3, 0xe5, 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, + 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, 0xe5, 0xe9, 0xed, 0xed, 0xe9, 0xe5, + 0xe3, 0xe7, 0xeb, 0xed, 0xeb, 0xeb, 0xeb, 0xe9, 0xeb, 0xed, 0xf1, 0xf1, + 0xf1, 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, 0xf1, 0xed, 0xed, 0xef, 0xf1, + 0xf5, 0xf3, 0xf3, 0xf5, 0xf5, 0xf5, 0xf7, 0xf7, 0xf9, 0xf9, 0xf9, 0xf9, + 0xfb, 0xfd, 0xfd, 0xff, 0xfd, 0xfb, 0xf9, 0xfd, 0xfd, 0xff, 0xfd, 0xfd, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x01, 0x01, 0x05, 0x07, 0x07, 0x09, 0x09, 0x05, 0x05, 0x01, 0x03, + 0x05, 0x07, 0x05, 0x05, 0x05, 0x07, 0x0b, 0x0d, 0x07, 0x05, 0x05, 0x07, + 0x0d, 0x0d, 0x0b, 0x09, 0x0d, 0x0f, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0d, 0x0f, 0x0f, 0x13, 0x17, 0x15, 0x11, 0x0f, 0x11, 0x13, 0x15, + 0x15, 0x17, 0x17, 0x19, 0x19, 0x19, 0x15, 0x11, 0x11, 0x15, 0x1b, 0x1f, + 0x1b, 0x17, 0x11, 0x15, 0x19, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, + 0x19, 0x19, 0x1b, 0x1f, 0x1f, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, 0x1b, 0x1d, + 0x1d, 0x1b, 0x1d, 0x1f, 0x1f, 0x1f, 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1d, 0x1d, 0x1f, 0x1f, 0x19, 0x15, 0x17, 0x1b, 0x20, + 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x19, 0x17, + 0x17, 0x19, 0x19, 0x17, 0x15, 0x15, 0x17, 0x19, 0x17, 0x13, 0x11, 0x11, + 0x13, 0x15, 0x13, 0x0f, 0x0f, 0x0d, 0x09, 0x07, 0x09, 0x0d, 0x0f, 0x0f, + 0x0d, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x05, 0x05, 0x03, 0x05, 0x07, + 0x07, 0x03, 0x01, 0x00, 0x01, 0x03, 0x05, 0x05, 0x03, 0x00, 0xff, 0xff, + 0x00, 0x01, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, + 0xf9, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf1, + 0xf1, 0xf3, 0xf7, 0xf9, 0xf5, 0xf1, 0xf1, 0xf3, 0xf5, 0xf5, 0xf1, 0xef, + 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf1, 0xf3, + 0xf1, 0xef, 0xed, 0xeb, 0xeb, 0xeb, 0xef, 0xef, 0xed, 0xeb, 0xe7, 0xe9, + 0xe9, 0xeb, 0xed, 0xed, 0xeb, 0xe9, 0xeb, 0xeb, 0xe5, 0xe3, 0xe5, 0xe9, + 0xed, 0xed, 0xe7, 0xe1, 0xe1, 0xe5, 0xe7, 0xe7, 0xe7, 0xeb, 0xe9, 0xe5, + 0xe3, 0xe1, 0xe3, 0xe9, 0xeb, 0xe9, 0xe3, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe7, 0xe9, 0xe7, 0xe3, 0xe1, 0xe1, 0xe3, + 0xe5, 0xe5, 0xe3, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe3, 0xe3, 0xe7, 0xe9, + 0xed, 0xeb, 0xe9, 0xeb, 0xe9, 0xe7, 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, + 0xeb, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xe7, 0xe9, 0xe9, 0xf1, 0xf7, + 0xf7, 0xf1, 0xeb, 0xeb, 0xf3, 0xf7, 0xf5, 0xf1, 0xef, 0xf1, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf5, 0xf7, 0xf7, 0xf3, 0xf3, 0xf5, 0xf9, 0xf9, 0xf7, 0xf7, + 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0x00, + 0x01, 0x00, 0xfd, 0xf9, 0xfb, 0xff, 0x01, 0x07, 0x09, 0x07, 0x03, 0xfd, + 0xf9, 0xfb, 0x03, 0x09, 0x07, 0x03, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, + 0x09, 0x07, 0x05, 0x05, 0x05, 0x0b, 0x0d, 0x0b, 0x07, 0x07, 0x0b, 0x0d, + 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x07, 0x0b, 0x0f, 0x11, 0x11, 0x0d, 0x0b, + 0x0b, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0f, 0x15, 0x17, 0x15, 0x0f, + 0x0b, 0x0f, 0x11, 0x13, 0x13, 0x15, 0x15, 0x15, 0x13, 0x11, 0x13, 0x19, + 0x1d, 0x19, 0x13, 0x0d, 0x11, 0x17, 0x19, 0x17, 0x13, 0x11, 0x17, 0x1d, + 0x1f, 0x19, 0x17, 0x15, 0x15, 0x17, 0x1d, 0x1f, 0x1f, 0x1b, 0x00, 0x00, + 0xff, 0xf6, 0x01, 0xff, 0xff, 0xf9, 0x01, 0xf6, 0x09, 0xff, 0xf1, 0x03, + 0x01, 0xfb, 0xfd, 0x02, 0xf3, 0x07, 0xfa, 0xdd, 0x16, 0xf0, 0xee, 0xf2, + 0x13, 0xf1, 0xf5, 0x01, 0xf6, 0xf9, 0xf9, 0x00, 0x01, 0xea, 0xfb, 0x10, + 0x09, 0x0b, 0x46, 0x14, 0xea, 0x27, 0x0a, 0xee, 0xdd, 0xff, 0x00, 0x0f, + 0x0a, 0x14, 0xf2, 0xfe, 0xe0, 0xfd, 0xd3, 0xbd, 0xcb, 0xe0, 0xcc, 0xb6, + 0xe1, 0xd4, 0xca, 0xdc, 0xd0, 0xe8, 0x09, 0x16, 0xf2, 0xdb, 0xf6, 0xf6, + 0x05, 0x14, 0x24, 0x35, 0x42, 0x48, 0x43, 0x42, 0x4c, 0x51, 0x54, 0x46, + 0x5d, 0x50, 0x28, 0x4c, 0x37, 0x28, 0x50, 0x48, 0x41, 0x09, 0x12, 0xdb, + 0xcc, 0xfb, 0xe9, 0x00, 0xee, 0xea, 0xf3, 0xf0, 0xc9, 0xe3, 0xbd, 0xb2, + 0xb0, 0xad, 0xb0, 0xb5, 0x9c, 0xb0, 0xb2, 0xb0, 0xa0, 0xa8, 0xd0, 0xc5, + 0xc7, 0xf2, 0xf6, 0xf1, 0xfe, 0x02, 0xee, 0x03, 0x09, 0x0e, 0x3f, 0x47, + 0x59, 0x42, 0x46, 0x62, 0x47, 0x4c, 0x30, 0x32, 0x20, 0x0e, 0xf1, 0xf9, + 0x09, 0xf5, 0xe8, 0x0a, 0xf9, 0xed, 0xd4, 0xc9, 0xc7, 0xc2, 0xba, 0xee, + 0xca, 0xb4, 0xb2, 0xb2, 0xa8, 0xb4, 0xc2, 0xc3, 0xd7, 0xd6, 0x03, 0x2d, + 0x1c, 0x41, 0x41, 0x30, 0x29, 0x4f, 0x48, 0x41, 0x51, 0x5e, 0x48, 0x51, + 0x50, 0x4b, 0x43, 0x37, 0x3a, 0x35, 0x31, 0x2a, 0x20, 0x16, 0x09, 0x02, + 0xfa, 0xf5, 0xe0, 0xd2, 0xf0, 0xd0, 0xbe, 0xaf, 0xca, 0xb0, 0x9a, 0xad, + 0xb5, 0xad, 0x9c, 0xcc, 0xc6, 0xcf, 0xd8, 0xd3, 0xb6, 0xbd, 0xd7, 0xdc, + 0xdb, 0xed, 0xf6, 0xe5, 0xf1, 0x0e, 0xfa, 0x0a, 0xfb, 0x06, 0x0f, 0x13, + 0x1a, 0x1b, 0x27, 0x32, 0x20, 0x3b, 0x3f, 0x36, 0x1f, 0x47, 0x37, 0x2d, + 0x36, 0x3d, 0x27, 0x25, 0x24, 0x05, 0x27, 0x1f, 0x06, 0xf7, 0xff, 0xe8, + 0xd6, 0xd8, 0xdf, 0xdb, 0xd8, 0xec, 0xc5, 0xcb, 0xd4, 0xc9, 0xb6, 0xdd, + 0xdc, 0xf1, 0xe5, 0xf1, 0x01, 0xf3, 0xf0, 0x06, 0xfe, 0x06, 0x09, 0x0b, + 0x1f, 0x2d, 0x27, 0x30, 0x37, 0x23, 0x29, 0x27, 0x2c, 0x20, 0x48, 0x25, + 0x03, 0x0d, 0xe6, 0xec, 0xdd, 0xd2, 0xf5, 0xd3, 0xcf, 0xd7, 0xd6, 0xc2, + 0xb2, 0xce, 0xc2, 0xc3, 0xdf, 0xf1, 0xe9, 0xee, 0xe5, 0xcf, 0x0a, 0xf6, + 0xf6, 0x06, 0x16, 0x0d, 0xf1, 0x2a, 0x0f, 0x16, 0x3a, 0x2e, 0x1c, 0x32, + 0x28, 0x2c, 0x0f, 0x27, 0x23, 0x1f, 0x02, 0x1f, 0x0a, 0x01, 0xfa, 0x0d, + 0xf3, 0xf2, 0x07, 0x05, 0x05, 0xf5, 0x0d, 0xfd, 0xf6, 0xf0, 0xf5, 0xe9, + 0xdf, 0xd7, 0xf2, 0xdf, 0xcb, 0xec, 0xe5, 0xe0, 0xfe, 0xe9, 0xf6, 0xf7, + 0xd9, 0xe0, 0xe1, 0xdf, 0xdf, 0xe6, 0xe9, 0xec, 0xed, 0xdd, 0xf3, 0x0b, + 0x0d, 0x03, 0x2a, 0x28, 0x28, 0x1c, 0x35, 0x29, 0x2e, 0x18, 0x25, 0x27, + 0x30, 0x1a, 0x27, 0x29, 0x1a, 0x0e, 0x0b, 0x14, 0x03, 0x09, 0xf6, 0xe4, + 0x02, 0xdd, 0xcc, 0xdb, 0xd9, 0xcc, 0xb0, 0xdf, 0xc7, 0xca, 0xc7, 0xd9, + 0xd2, 0xdc, 0xf3, 0xfa, 0xff, 0x06, 0x0f, 0x13, 0x05, 0x0a, 0x1c, 0xff, + 0x16, 0x17, 0x03, 0x0a, 0x30, 0x05, 0x1f, 0x23, 0x20, 0x0d, 0x2e, 0x1b, + 0x12, 0x03, 0x07, 0xfa, 0xf7, 0xf0, 0xe5, 0xdd, 0xdd, 0xe3, 0xe1, 0xd2, + 0xf3, 0xe4, 0xd0, 0xf0, 0xee, 0xf5, 0xea, 0x0e, 0xf2, 0xff, 0xed, 0xe6, + 0x09, 0xf6, 0xfb, 0xee, 0x1c, 0xfa, 0x01, 0x0f, 0x0b, 0x0a, 0x0b, 0x10, + 0x05, 0x00, 0x0a, 0x01, 0xfb, 0x00, 0x0b, 0x07, 0xf2, 0x1a, 0x01, 0x0d, + 0x02, 0x10, 0x17, 0x00, 0x18, 0x1a, 0x14, 0xfd, 0x1b, 0xf6, 0x07, 0x02, + 0xf6, 0x01, 0xfb, 0xf2, 0xd8, 0xf7, 0xdc, 0xdc, 0xe3, 0xdb, 0xc7, 0xfb, + 0xe3, 0xd8, 0xe3, 0xf1, 0xcf, 0xdd, 0xe8, 0xe1, 0xdc, 0xee, 0x01, 0xe6, + 0x03, 0x06, 0x07, 0x02, 0x27, 0x21, 0x27, 0x27, 0x30, 0x27, 0x1d, 0x2c, + 0x1a, 0xfe, 0x24, 0x12, 0x10, 0x06, 0x1b, 0x07, 0xff, 0x09, 0x03, 0xed, + 0xf9, 0xf9, 0xea, 0xd7, 0xec, 0xe3, 0xdd, 0xdb, 0xdc, 0xd7, 0xd3, 0xdb, + 0xe1, 0xe0, 0xf3, 0xfd, 0xff, 0xf9, 0x10, 0x01, 0xfe, 0x16, 0x10, 0x09, + 0x13, 0x02, 0x01, 0x1a, 0x07, 0xf6, 0x0d, 0x06, 0x06, 0x01, 0x0d, 0x03, + 0x0b, 0x09, 0xf5, 0xfd, 0xfd, 0x02, 0xfa, 0xf6, 0x06, 0xe6, 0x06, 0xf7, + 0xf0, 0x0a, 0xfe, 0xfb, 0x03, 0x0a, 0x0d, 0x0a, 0x07, 0xf9, 0x0f, 0xfb, + 0xf3, 0xf3, 0xee, 0xf0, 0xea, 0xdb, 0xf9, 0xea, 0xe3, 0xea, 0xfa, 0xea, + 0xf7, 0x01, 0x02, 0xe6, 0x02, 0xf5, 0xfa, 0xf9, 0xff, 0xf7, 0xfb, 0x14, + 0x0e, 0xff, 0x1d, 0x18, 0x1b, 0x1b, 0x0b, 0x2a, 0x20, 0x18, 0x0f, 0x18, + 0x0b, 0x02, 0x00, 0xfe, 0xfa, 0xfa, 0xe4, 0xfa, 0xe8, 0xf0, 0xe1, 0xe3, + 0xdf, 0xcc, 0xe4, 0xd8, 0xc7, 0xd9, 0xe4, 0xdb, 0xcc, 0xf6, 0xe1, 0xd9, + 0xfa, 0xf2, 0xf6, 0x00, 0x12, 0x03, 0x0e, 0x1b, 0x1a, 0x20, 0x13, 0x27, + 0x1f, 0x0d, 0x25, 0x17, 0x14, 0x13, 0x05, 0x07, 0x10, 0x06, 0x03, 0x18, + 0x0f, 0xff, 0x0d, 0x0a, 0x00, 0xfb, 0xe6, 0xfe, 0xf9, 0xf9, 0xf6, 0xea, + 0x01, 0xf0, 0xec, 0xe3, 0xfa, 0xf1, 0xed, 0xf5, 0xfe, 0x02, 0xee, 0xfd, + 0xf6, 0xf5, 0xf6, 0xec, 0xed, 0xf6, 0xf5, 0xec, 0xf0, 0x07, 0xfd, 0xf0, + 0x07, 0x01, 0xff, 0xf6, 0x07, 0x03, 0x01, 0x06, 0x07, 0x06, 0x06, 0x09, + 0xf3, 0x06, 0x17, 0x0a, 0x18, 0x16, 0x12, 0x0f, 0x05, 0x02, 0x01, 0xf5, + 0xfb, 0xfd, 0xf1, 0xf7, 0xf2, 0xea, 0xed, 0xed, 0xd8, 0xdc, 0xf0, 0xe0, + 0xec, 0xfd, 0xf2, 0xed, 0x0f, 0xf6, 0xea, 0xfd, 0xfd, 0x02, 0xf0, 0x0d, + 0x06, 0x07, 0xfd, 0x21, 0xfb, 0x10, 0x1c, 0x16, 0x09, 0x24, 0x1b, 0x18, + 0x01, 0x1d, 0x06, 0xfa, 0xf9, 0xf9, 0xee, 0xf1, 0xe8, 0xee, 0xf0, 0xf0, + 0xf5, 0xfd, 0xee, 0xe9, 0x01, 0xee, 0xec, 0xf2, 0xec, 0xd8, 0xf6, 0xec, + 0xea, 0xe5, 0x01, 0xf6, 0xf5, 0xff, 0x02, 0x06, 0x0f, 0x06, 0xfb, 0x12, + 0x01, 0xf7, 0x05, 0x09, 0x09, 0x0f, 0xf9, 0x10, 0x0e, 0x0b, 0xf7, 0x17, + 0x05, 0x00, 0x05, 0x0e, 0x05, 0x12, 0x0b, 0xfb, 0x14, 0x05, 0x0a, 0x00, + 0x05, 0x02, 0x00, 0xff, 0xfd, 0xfa, 0xf9, 0xf9, 0xe6, 0x06, 0xf9, 0xf7, + 0xe5, 0xff, 0xec, 0xdd, 0xf5, 0xf1, 0xdd, 0xe5, 0xea, 0xe9, 0xd8, 0xf9, + 0xf1, 0xee, 0xee, 0x0b, 0xea, 0xfe, 0x02, 0x01, 0xf2, 0x0f, 0x00, 0x0b, + 0x01, 0x05, 0x09, 0xf3, 0x0e, 0x0f, 0x0e, 0x00, 0x1f, 0x10, 0x0f, 0xfe, + 0x1d, 0x06, 0xf7, 0x01, 0x06, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xf7, 0xf3, + 0xfd, 0xf6, 0xf6, 0xf6, 0xf7, 0xed, 0xfb, 0xf2, 0xe9, 0xf6, 0x01, 0xfe, + 0xf1, 0x0a, 0xff, 0xed, 0x09, 0x00, 0xfb, 0xfd, 0x0b, 0x06, 0x0b, 0x12, + 0x0f, 0x0a, 0x0a, 0x09, 0x09, 0x00, 0xf3, 0x09, 0xee, 0xf6, 0xfb, 0xee, + 0xe5, 0x0a, 0xe8, 0xf3, 0x02, 0xfb, 0xed, 0x00, 0xfd, 0xf6, 0xea, 0xf7, + 0xee, 0xee, 0xf2, 0xee, 0xe8, 0xfe, 0xee, 0xed, 0xff, 0xfe, 0x02, 0xf5, + 0x0b, 0x03, 0x03, 0x0b, 0x06, 0x09, 0x06, 0x05, 0x03, 0x03, 0x03, 0x06, + 0xfb, 0x06, 0x12, 0x0a, 0xfe, 0x18, 0x07, 0xfd, 0x0f, 0x05, 0xfe, 0x01, + 0x07, 0x01, 0xfa, 0x0d, 0x00, 0xf0, 0x09, 0xff, 0x03, 0xf1, 0x0a, 0xfe, + 0xf3, 0xfd, 0xf7, 0xfe, 0xe4, 0x00, 0xf3, 0xe4, 0xf9, 0xec, 0xf0, 0xee, + 0xee, 0xee, 0xf0, 0xf0, 0xf5, 0xfe, 0xff, 0xe6, 0x0a, 0xff, 0xfd, 0x02, + 0x0b, 0xff, 0xfd, 0x06, 0x00, 0xff, 0xfd, 0x01, 0xff, 0x06, 0x0a, 0x0e, + 0x00, 0x10, 0x07, 0x0f, 0x05, 0xf5, 0x07, 0xfa, 0x00, 0xe9, 0xfa, 0xf2, + 0xf6, 0xe0, 0xf3, 0xf2, 0xf7, 0xe8, 0x0a, 0xfe, 0xfd, 0xf7, 0x05, 0xf9, + 0x01, 0x09, 0xfa, 0x06, 0x13, 0x00, 0x05, 0x16, 0x0a, 0x00, 0x0f, 0x06, + 0x0b, 0x0b, 0x0a, 0xfb, 0x13, 0x03, 0xfb, 0xff, 0xfd, 0x00, 0xf2, 0xec, + 0xfa, 0xf1, 0xe6, 0xec, 0xf9, 0xec, 0xe0, 0xf7, 0xec, 0xf1, 0xf2, 0xf6, + 0xf3, 0xff, 0x05, 0x02, 0xf7, 0x07, 0x01, 0x01, 0x02, 0x0a, 0xfa, 0x06, + 0x12, 0x02, 0xf5, 0x13, 0x02, 0xff, 0xfd, 0x07, 0xf7, 0xf3, 0xf5, 0xee, + 0xf1, 0xf1, 0xf0, 0xed, 0xff, 0xf9, 0xf9, 0xff, 0x01, 0xff, 0x09, 0x09, + 0xff, 0x02, 0x09, 0xff, 0x05, 0x06, 0x0a, 0xfa, 0x0a, 0x0d, 0x07, 0xfd, + 0x17, 0x05, 0x09, 0xfe, 0xf7, 0x0b, 0xf9, 0xe8, 0xfe, 0xf5, 0xf2, 0xe8, + 0xf5, 0xec, 0xf5, 0xe8, 0xf6, 0xf7, 0xf6, 0xf9, 0xfa, 0x01, 0xee, 0x06, + 0x09, 0x01, 0x0d, 0x16, 0x0d, 0xfd, 0x17, 0x0d, 0x03, 0x09, 0x13, 0x09, + 0xfa, 0x0f, 0x06, 0x02, 0xfd, 0x05, 0xf9, 0xf9, 0xf5, 0xf2, 0xe3, 0xec, + 0xe5, 0xe5, 0xe6, 0xed, 0xdb, 0xee, 0xf7, 0xec, 0xfb, 0x00, 0xff, 0xf3, + 0x0a, 0x05, 0x03, 0x01, 0x14, 0x06, 0x09, 0x0a, 0x07, 0x0b, 0x06, 0x06, + 0x07, 0x09, 0x06, 0x05, 0xf7, 0x02, 0x02, 0xfa, 0xf5, 0x02, 0xf5, 0xf6, + 0xf3, 0xf5, 0xf7, 0xfb, 0x00, 0xf3, 0xff, 0x07, 0xfd, 0xf7, 0x05, 0xff, + 0xfb, 0xff, 0x02, 0x06, 0xfd, 0x03, 0x09, 0x03, 0xff, 0xfa, 0x02, 0xfa, + 0xee, 0xf6, 0xf9, 0xea, 0xf1, 0xf0, 0xea, 0xf1, 0xed, 0xe6, 0xf1, 0xec, + 0xf0, 0xf2, 0xf0, 0xf9, 0xf7, 0xf5, 0x03, 0x02, 0xfa, 0x14, 0x12, 0x14, + 0x0b, 0x2d, 0x16, 0x1a, 0x0f, 0x1f, 0x0d, 0x09, 0x10, 0x0b, 0x06, 0x05, + 0x02, 0xfd, 0xfd, 0xf9, 0xf5, 0xe1, 0xf7, 0xee, 0xf1, 0xdc, 0xf2, 0xea, + 0xe8, 0xe1, 0xf2, 0xea, 0xf7, 0xee, 0xf3, 0x00, 0xff, 0xf6, 0x0e, 0x06, + 0x07, 0xff, 0x1a, 0x0d, 0x02, 0x13, 0x0f, 0x00, 0x09, 0x0d, 0xfb, 0xfd, + 0x01, 0xf9, 0xf1, 0xfd, 0xf9, 0xfe, 0xf0, 0xf5, 0xfd, 0xf6, 0xe5, 0xf6, + 0xf1, 0xe3, 0xfb, 0xf6, 0xed, 0x09, 0x00, 0xfd, 0x03, 0x07, 0xfa, 0x06, + 0x09, 0x00, 0x0e, 0x0b, 0x0b, 0x0a, 0xfe, 0x0f, 0x01, 0xf6, 0x01, 0xf9, + 0xf7, 0xf6, 0xed, 0xfb, 0xf3, 0xf2, 0xe6, 0xf7, 0xf1, 0xee, 0xf1, 0xf9, + 0xec, 0xf7, 0xfd, 0xf6, 0xfd, 0x00, 0x06, 0xf9, 0x06, 0x1a, 0x13, 0x07, + 0x24, 0x1a, 0x0d, 0x1b, 0x0f, 0x09, 0xfb, 0x0a, 0xfe, 0xfa, 0xf6, 0xf9, + 0xe4, 0xf5, 0xf5, 0xec, 0xdf, 0xf1, 0xe5, 0xea, 0xd9, 0xf3, 0xed, 0xed, + 0xe3, 0xfe, 0xf3, 0xfa, 0xfd, 0xf7, 0x09, 0x09, 0x0b, 0x06, 0x17, 0x0b, + 0x0e, 0x13, 0x0f, 0x0e, 0x14, 0x12, 0x03, 0x17, 0x0e, 0x06, 0x01, 0x0b, + 0xff, 0xea, 0xff, 0xf2, 0xf1, 0xe1, 0xfd, 0xee, 0xea, 0xf1, 0xfb, 0xf0, + 0xe8, 0xff, 0xf5, 0xee, 0xfd, 0x03, 0xf0, 0x05, 0x03, 0x06, 0xff, 0x13, + 0x03, 0x0f, 0x0a, 0x05, 0x13, 0x0a, 0x02, 0x00, 0x00, 0xf7, 0xf9, 0xf9, + 0xf3, 0xdc, 0x03, 0xee, 0xf0, 0xf0, 0xfb, 0xf1, 0xed, 0xfe, 0xf6, 0xfd, + 0xfe, 0xf2, 0x03, 0x03, 0x09, 0xfa, 0x0e, 0x09, 0x0d, 0x05, 0x05, 0x17, + 0x09, 0xff, 0x0e, 0x09, 0xf7, 0x03, 0xfd, 0xfa, 0xee, 0xf9, 0xf2, 0xec, + 0xed, 0xee, 0xe6, 0xdc, 0xfa, 0xe4, 0xea, 0xe0, 0xf7, 0xf3, 0xf6, 0xfd, + 0x06, 0x05, 0x07, 0x00, 0x0a, 0x10, 0x07, 0x07, 0x16, 0x13, 0x0a, 0x14, + 0x18, 0x13, 0x17, 0x1d, 0x0a, 0x09, 0x16, 0x05, 0xf6, 0xff, 0xf6, 0xf3, + 0xe5, 0xea, 0xee, 0xea, 0xec, 0xf0, 0xe3, 0xf1, 0xf2, 0xe8, 0xee, 0xfd, + 0xf7, 0xf9, 0xee, 0xff, 0xfa, 0xf9, 0xf6, 0x01, 0x01, 0xff, 0x0b, 0x0a, + 0x03, 0x05, 0x0f, 0x02, 0x00, 0x09, 0x05, 0x02, 0x01, 0x00, 0x01, 0xf5, + 0xf3, 0x01, 0xf1, 0xf1, 0xfd, 0xfe, 0xf6, 0xfb, 0x06, 0x01, 0x02, 0x01, + 0x0a, 0xff, 0x02, 0x0e, 0x06, 0xff, 0x06, 0x0f, 0xff, 0x00, 0x0e, 0xfd, + 0xfe, 0xff, 0xfe, 0xfd, 0x01, 0xf2, 0xf7, 0xfb, 0xf2, 0xe8, 0xed, 0xea, + 0xee, 0xe9, 0xee, 0xf5, 0xf1, 0xf0, 0xfd, 0xfa, 0xed, 0x0b, 0x03, 0x06, + 0xfe, 0x14, 0x0a, 0x02, 0x10, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x09, 0x07, + 0xff, 0x0b, 0x03, 0xff, 0xf7, 0x0b, 0xfb, 0xea, 0xff, 0xf0, 0xe1, 0xf0, + 0xe9, 0xf2, 0xe8, 0xf1, 0xf2, 0xed, 0xf5, 0xfd, 0xf6, 0xf7, 0xfe, 0x00, + 0x03, 0xf5, 0x16, 0x07, 0x06, 0xfd, 0x13, 0x09, 0x01, 0x0b, 0x0d, 0x10, + 0x09, 0x01, 0x0f, 0xf9, 0x03, 0xfa, 0xf6, 0x02, 0xf6, 0xfa, 0xf7, 0xfa, + 0xf5, 0xe5, 0x0b, 0xed, 0xfb, 0xf5, 0xf9, 0xfd, 0xfe, 0xfd, 0xff, 0x01, + 0x01, 0x02, 0x03, 0x03, 0x02, 0x02, 0x05, 0xf3, 0x0a, 0xfe, 0xf5, 0x02, + 0xfb, 0xfb, 0xed, 0x05, 0xf6, 0xf3, 0xff, 0xf3, 0xf9, 0xf7, 0xf3, 0xf1, + 0xf5, 0xf3, 0xf2, 0xf7, 0xf9, 0xf6, 0xf2, 0x0f, 0x01, 0xf6, 0x0b, 0x07, + 0x0b, 0x07, 0x02, 0x16, 0x09, 0xff, 0x06, 0x07, 0x07, 0x05, 0xfb, 0x07, + 0xfe, 0x05, 0xfa, 0xed, 0x02, 0xee, 0xf3, 0xf3, 0xec, 0xf2, 0xf2, 0xec, + 0xf5, 0xf3, 0xf5, 0xf3, 0xf9, 0x00, 0xfb, 0xf1, 0x09, 0x01, 0x06, 0xfe, + 0x07, 0x14, 0x09, 0x05, 0x13, 0x0e, 0x07, 0x0a, 0x0b, 0x00, 0x05, 0xff, + 0x00, 0x01, 0xf5, 0xfd, 0xfd, 0xf5, 0xfa, 0xfa, 0xf9, 0xf3, 0xed, 0x00, + 0xf1, 0xe8, 0xf5, 0xf5, 0xf3, 0xf6, 0xfb, 0xf1, 0xff, 0xfe, 0xfb, 0xff, + 0x01, 0x03, 0x01, 0x05, 0x00, 0x02, 0x02, 0xf6, 0x06, 0x03, 0x03, 0x01, + 0x09, 0x03, 0x09, 0xf6, 0xff, 0x01, 0xfb, 0xf0, 0x03, 0xfd, 0xf6, 0x00, + 0xfb, 0xfd, 0xf5, 0x0a, 0xf5, 0xf3, 0x09, 0xf2, 0xf7, 0x00, 0xfb, 0xf0, + 0xff, 0xfb, 0xfe, 0xfd, 0xf7, 0xff, 0x01, 0xf9, 0xfe, 0x01, 0xea, 0x02, + 0xfb, 0xf7, 0xf3, 0xfd, 0xf7, 0xed, 0xfe, 0xfd, 0xfe, 0xf9, 0x01, 0xfb, + 0x02, 0xff, 0xff, 0x06, 0x02, 0x07, 0x09, 0x09, 0x09, 0x07, 0x0b, 0x07, + 0x05, 0x07, 0x06, 0x05, 0x05, 0x05, 0x03, 0xfb, 0x03, 0xfd, 0xfb, 0xf0, + 0x00, 0xf7, 0xff, 0xec, 0xf6, 0xf7, 0xf7, 0xf5, 0xf3, 0x02, 0xfa, 0xf2, + 0xfe, 0xfa, 0xfe, 0xfe, 0xf3, 0x06, 0xfe, 0x02, 0xff, 0xf6, 0x06, 0xfe, + 0xf9, 0x00, 0x06, 0x02, 0x06, 0xfe, 0xff, 0x06, 0x02, 0xf7, 0x01, 0x02, + 0xfe, 0xf1, 0xff, 0xf9, 0xf9, 0xea, 0x00, 0xf7, 0xf0, 0xf9, 0xfb, 0xf9, + 0xf1, 0x03, 0xf9, 0xee, 0x03, 0xfa, 0xfa, 0xf5, 0x03, 0xfb, 0xf2, 0x05, + 0xfe, 0x01, 0xf5, 0x0a, 0x01, 0x03, 0x01, 0x03, 0x05, 0x01, 0x03, 0x05, + 0x03, 0xf3, 0x13, 0xfd, 0xff, 0x06, 0x03, 0x05, 0x00, 0x06, 0x06, 0x06, + 0x05, 0x03, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x0a, + 0xfe, 0xfa, 0xfa, 0xfd, 0xfd, 0xf3, 0xf6, 0xff, 0xf6, 0xf3, 0xf3, 0xf5, + 0xec, 0xfe, 0xf6, 0xee, 0xff, 0xf6, 0xf5, 0xed, 0x00, 0xf5, 0xf0, 0xf6, + 0xfa, 0xf7, 0xf6, 0xf9, 0xfe, 0xfe, 0xfa, 0xfb, 0x0d, 0x01, 0xfa, 0x01, + 0x09, 0x02, 0x03, 0x05, 0x05, 0x06, 0x06, 0x02, 0xff, 0x0d, 0x05, 0xfe, + 0x02, 0x01, 0x01, 0xff, 0xf9, 0x03, 0xff, 0xf5, 0xfd, 0x00, 0xfe, 0xf3, + 0x09, 0xff, 0xf7, 0x02, 0xfe, 0xfd, 0xf2, 0x07, 0xfe, 0xf6, 0x02, 0x00, + 0xfa, 0xfa, 0x0a, 0xff, 0xf5, 0x07, 0x00, 0xfd, 0xfa, 0x07, 0xff, 0xf5, + 0x07, 0xff, 0x00, 0xfa, 0x03, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf0, 0xfa, + 0xfb, 0xf9, 0xed, 0xff, 0xf6, 0xf7, 0xf9, 0xfe, 0xf9, 0xfd, 0xfb, 0xfe, + 0xe8, 0x05, 0xfb, 0xfd, 0xfb, 0xf3, 0x09, 0xff, 0xf6, 0x06, 0x00, 0x00, + 0xf5, 0x07, 0xfe, 0xfb, 0xff, 0xfe, 0xf5, 0xfd, 0x02, 0xfa, 0xfb, 0x00, + 0x01, 0x03, 0xfa, 0x05, 0x02, 0xfd, 0x00, 0x02, 0xfb, 0xfd, 0x02, 0x01, + 0xff, 0xff, 0x0a, 0xf7, 0x00, 0x0d, 0x03, 0xf9, 0x09, 0x02, 0xff, 0xfd, + 0x06, 0x00, 0xf9, 0xfb, 0x06, 0xf9, 0xfa, 0x01, 0xfb, 0xf2, 0xfb, 0xff, + 0xf5, 0xee, 0x01, 0xf6, 0xec, 0xfd, 0xf6, 0xf7, 0xed, 0xfe, 0xf7, 0xfa, + 0xf9, 0xf9, 0xf9, 0xfa, 0xf9, 0xfa, 0xfd, 0xff, 0xff, 0x02, 0xf5, 0xff, + 0x09, 0xff, 0x02, 0x02, 0xff, 0xfb, 0xff, 0xff, 0x00, 0xfd, 0xff, 0x09, + 0xf3, 0x03, 0x01, 0x03, 0xf3, 0x06, 0x01, 0xfe, 0xfb, 0x0a, 0xfd, 0x02, + 0x09, 0x02, 0xfe, 0x02, 0x03, 0x03, 0x02, 0xfa, 0x0a, 0xfb, 0xfa, 0xfd, + 0x02, 0xf7, 0xf6, 0x05, 0xfa, 0xf0, 0x00, 0xfa, 0xfb, 0xf0, 0x02, 0xfa, + 0xfd, 0xf3, 0xff, 0xfe, 0xfe, 0xf5, 0x02, 0xfe, 0xfe, 0xfe, 0x02, 0xff, + 0xff, 0x02, 0xfe, 0xf6, 0x0e, 0x00, 0xf7, 0x02, 0x01, 0xfa, 0xf3, 0x01, + 0xfa, 0xf9, 0xf3, 0xfe, 0xf3, 0xf1, 0x01, 0xf1, 0xf3, 0xfa, 0xf7, 0xf3, + 0xf2, 0x05, 0xf2, 0xf0, 0x06, 0xfe, 0xff, 0xfe, 0x02, 0x05, 0x06, 0x02, + 0x0f, 0x09, 0x0a, 0x07, 0x0b, 0x0b, 0x0a, 0x0d, 0x09, 0x01, 0x14, 0x07, + 0xff, 0x07, 0x02, 0x00, 0xf3, 0xff, 0xfa, 0xfa, 0xf5, 0xf7, 0xf7, 0xf6, + 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf9, 0xfa, 0xe9, 0x01, 0xfb, 0xfb, 0xf6, + 0x01, 0xfb, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xf7, 0xff, 0xff, 0xff, 0xf3, 0x02, 0xfd, 0xf7, 0xfe, 0xfd, 0x02, 0xf5, + 0xfd, 0x00, 0xfe, 0xf3, 0x01, 0x00, 0x00, 0xf5, 0x09, 0x01, 0xff, 0x02, + 0x05, 0xf5, 0x07, 0x02, 0x02, 0xfa, 0x09, 0x00, 0xfa, 0xff, 0xff, 0xfe, + 0xfd, 0xfd, 0xfa, 0xfb, 0xfb, 0xf9, 0xed, 0xff, 0xf2, 0xf6, 0xf6, 0xf5, + 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0x00, 0xfd, 0x09, 0x03, 0x05, 0x02, + 0x0b, 0xfd, 0x06, 0x02, 0x02, 0x03, 0x02, 0x02, 0xfe, 0x00, 0xff, 0xf9, + 0xf7, 0xff, 0xf7, 0xf1, 0xf3, 0xf7, 0xf5, 0xec, 0xf5, 0xfb, 0xf0, 0xf7, + 0xf7, 0xf9, 0xfa, 0xfb, 0xfd, 0xf7, 0xfe, 0x03, 0xff, 0xfe, 0x03, 0x05, + 0x06, 0x07, 0x0a, 0x0a, 0x0a, 0x09, 0xff, 0x09, 0x03, 0x02, 0x02, 0x01, + 0x00, 0x00, 0x03, 0xf3, 0x02, 0xff, 0xfe, 0xf5, 0x02, 0xfd, 0xf7, 0x00, + 0xfa, 0xff, 0xf9, 0xfb, 0x00, 0xf7, 0xfe, 0xff, 0xff, 0xf3, 0x09, 0xfe, + 0xf6, 0x00, 0xfd, 0xfb, 0xf0, 0x05, 0xf9, 0xf1, 0xfd, 0xf6, 0xff, 0xf0, + 0xf6, 0xf9, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, 0xfb, + 0x07, 0xfb, 0x02, 0x07, 0x07, 0x03, 0x09, 0x0a, 0x0a, 0x03, 0x09, 0x09, + 0x09, 0x06, 0x02, 0x03, 0x02, 0x01, 0x00, 0xfd, 0xed, 0x02, 0xf3, 0xf9, + 0xec, 0xf7, 0xf6, 0xed, 0xf6, 0xf6, 0xf5, 0xea, 0x01, 0xf5, 0xf3, 0xff, + 0xf7, 0xfb, 0xfe, 0x00, 0xf9, 0x03, 0x07, 0x05, 0x01, 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0d, 0x03, 0x01, 0x05, 0x01, 0xfb, 0xf9, 0x07, 0xfa, 0xf9, + 0xff, 0xfb, 0xf5, 0xf9, 0xfd, 0xee, 0xf6, 0xfe, 0xf7, 0xee, 0xf7, 0xfa, + 0xf7, 0xf3, 0x05, 0xf7, 0xf3, 0x06, 0xf3, 0xfe, 0xfe, 0xff, 0x00, 0xfd, + 0xf7, 0x0a, 0xf9, 0xff, 0xfa, 0xfe, 0x00, 0xfe, 0xfb, 0xfd, 0xfe, 0xfe, + 0xfd, 0xf7, 0x00, 0xfe, 0xff, 0xf7, 0x05, 0x02, 0xfe, 0x05, 0x06, 0x06, + 0x01, 0x03, 0x0d, 0x07, 0xfd, 0x07, 0x07, 0x06, 0xfa, 0x06, 0x03, 0xfd, + 0x00, 0x01, 0xfe, 0xf3, 0x02, 0xf7, 0xed, 0xfb, 0xf5, 0xf1, 0xed, 0xf9, + 0xf2, 0xe9, 0xf6, 0xf3, 0xf9, 0xf6, 0xed, 0x03, 0xf7, 0xfd, 0xfe, 0x03, + 0xff, 0x02, 0x03, 0x05, 0x03, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, + 0xf9, 0x14, 0xfd, 0xff, 0x02, 0xfe, 0xf2, 0x02, 0xfa, 0xf9, 0xec, 0x02, + 0xf1, 0xec, 0xfb, 0xf5, 0xf5, 0xf0, 0xfe, 0xf3, 0xee, 0xfe, 0xfa, 0xfe, + 0xf3, 0x07, 0x00, 0xfd, 0x06, 0x03, 0x00, 0x00, 0x09, 0x03, 0xfa, 0x0a, + 0x02, 0x03, 0xf7, 0x07, 0x00, 0x01, 0xfa, 0xff, 0x02, 0xfe, 0xfe, 0xf5, + 0x05, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0x00, 0xf6, 0x03, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xfd, 0xf3, 0xfd, 0xff, 0xf3, 0xfb, + 0xfb, 0xfa, 0xf1, 0x02, 0xf3, 0xee, 0xfb, 0xf5, 0xf5, 0xf2, 0xff, 0xf6, + 0xf0, 0xff, 0xfa, 0x00, 0xf5, 0x05, 0x03, 0x03, 0xfe, 0x0e, 0x09, 0x03, + 0x0a, 0x10, 0x00, 0x0b, 0x0a, 0x0d, 0xfe, 0x0a, 0x06, 0x06, 0xf9, 0x07, + 0xff, 0xfe, 0xf1, 0x03, 0xf5, 0xf7, 0xf5, 0xf5, 0xf3, 0xf3, 0xf5, 0xf6, + 0xe5, 0xf9, 0xf5, 0xf2, 0xf3, 0xfe, 0xf7, 0xf3, 0x03, 0xff, 0x01, 0x01, + 0x03, 0x05, 0x03, 0xfa, 0x0a, 0x03, 0x05, 0x03, 0x02, 0xff, 0x05, 0x01, + 0xf7, 0x0d, 0x00, 0x00, 0xfd, 0x01, 0xfd, 0xff, 0xf5, 0xf6, 0x00, 0xfb, + 0xf9, 0xf7, 0x05, 0xfa, 0xfd, 0xfe, 0xfd, 0xfa, 0x00, 0xfe, 0xf5, 0x00, + 0xfe, 0xfe, 0xf2, 0x02, 0xfe, 0xfb, 0xfe, 0xff, 0xfe, 0xf7, 0x02, 0xfd, + 0xf5, 0x01, 0xfd, 0xfb, 0xf0, 0x01, 0xfb, 0xfe, 0xf6, 0x02, 0x00, 0x01, + 0xfe, 0x01, 0x03, 0x02, 0x03, 0x07, 0x00, 0x05, 0x09, 0x05, 0x05, 0x05, + 0x07, 0xfa, 0x06, 0x06, 0xff, 0xf9, 0x05, 0xff, 0xf9, 0xf5, 0xfe, 0xf7, + 0xf6, 0xf0, 0xfe, 0xf5, 0xf0, 0xf5, 0xf9, 0xf2, 0xf5, 0xfb, 0xec, 0xf9, + 0xfd, 0xfb, 0xf2, 0x06, 0xff, 0xfd, 0xfe, 0x07, 0x03, 0xfd, 0x05, 0x05, + 0x03, 0xfe, 0x06, 0x02, 0x02, 0x01, 0x01, 0xff, 0xff, 0xfe, 0xfe, 0xfd, + 0xfd, 0xfd, 0xfd, 0xfe, 0xf2, 0xfd, 0xff, 0xfd, 0xf6, 0x01, 0xf5, 0x00, + 0xfe, 0xfe, 0xf7, 0xfd, 0x00, 0xfe, 0xfe, 0xf9, 0x07, 0xfe, 0x01, 0x03, + 0x03, 0xfe, 0xff, 0x0a, 0xff, 0xf9, 0x0a, 0xf9, 0xfd, 0xfd, 0xfa, 0xfa, + 0xfa, 0xfb, 0xfa, 0xf0, 0x0b, 0xf6, 0xf6, 0x01, 0xfd, 0xfb, 0xf9, 0x00, + 0xfd, 0xfd, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x01, 0xfe, 0x00, 0x06, 0x00, + 0xf7, 0x02, 0xff, 0xff, 0xf6, 0x05, 0xfe, 0xf8, 0x00, 0xfc, 0x00, 0xf4, + 0x00, 0x00, 0xf7, 0xff, 0x00, 0xff, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0xfc, 0x09, 0x00, + 0x01, 0x00, 0xf7, 0x06, 0xfc, 0x00, 0xf9, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, + 0xfb, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0xf9, 0xf8, 0x00, 0xf5, 0xfc, 0xfc, + 0xff, 0xf8, 0x00, 0x00, 0xfc, 0x00, 0x01, 0x00, 0xf8, 0x04, 0x00, 0x00, + 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x03, 0xfe, 0xfd, 0x00, 0xff, 0xfc, 0xfe, + 0x00, 0xfe, 0xf9, 0x05, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0x00, 0xf7, 0x02, + 0x00, 0xfe, 0x00, 0x01, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x01, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x03, + 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0xfa, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, + 0xfb, 0xff, 0xfc, 0xfc, 0xfd, 0xfc, 0xfd, 0xfc, 0xfd, 0xfd, 0xf9, 0x00, + 0xfc, 0xfe, 0xfb, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x00, 0x05, 0x00, 0xfe, 0x05, 0x00, 0xff, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x01, 0xfe, 0xff, 0xff, 0x00, + 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfd, 0x01, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xf8, 0xfc, 0x06, + 0x25, 0x29, 0x21, 0xe6, 0xcb, 0x1b, 0x37, 0x30, 0x07, 0x01, 0xc7, 0x02, + 0x08, 0xe2, 0x07, 0xdf, 0x48, 0x3e, 0xf7, 0xb2, 0x09, 0x2e, 0x5e, 0x5d, + 0x0e, 0xff, 0xd8, 0x07, 0xd8, 0x0d, 0xe3, 0x06, 0xbb, 0xee, 0x52, 0x5d, + 0x01, 0xce, 0xfa, 0x31, 0x11, 0x7a, 0x54, 0x1f, 0x05, 0x0e, 0x1e, 0x18, + 0x12, 0xc7, 0xaf, 0xb1, 0xb0, 0xb5, 0xd4, 0xb7, 0xb3, 0xc2, 0xc7, 0xe1, + 0xc9, 0xc2, 0xc3, 0x10, 0x18, 0x13, 0xe5, 0xe4, 0xc9, 0xf0, 0xee, 0xf2, + 0xd0, 0x9f, 0xc9, 0xff, 0xe8, 0x0f, 0xf7, 0xe2, 0x03, 0x06, 0xfb, 0xfa, + 0x25, 0x29, 0xf3, 0xa5, 0xc6, 0xc7, 0x28, 0xdb, 0xcd, 0xea, 0xe3, 0xdb, + 0xe7, 0xc0, 0x9f, 0xe4, 0xcd, 0xf3, 0xef, 0xc4, 0xf8, 0xdb, 0x28, 0x1c, + 0x1e, 0x2a, 0x3c, 0x40, 0x12, 0x10, 0x32, 0x14, 0xed, 0xfa, 0xbe, 0xd7, + 0xf0, 0xf9, 0xd4, 0xed, 0xe8, 0x0e, 0x1a, 0x29, 0xf4, 0x21, 0x43, 0x2c, + 0x54, 0x45, 0x25, 0x01, 0xef, 0xff, 0x10, 0xf7, 0xfe, 0x1a, 0x55, 0x60, + 0x43, 0x70, 0x51, 0x5d, 0x26, 0x5e, 0x4e, 0x3e, 0x3e, 0x05, 0x00, 0x27, + 0x4d, 0x6a, 0x29, 0x05, 0xf2, 0x04, 0xf1, 0x58, 0x42, 0x4b, 0x49, 0x2c, + 0x2a, 0x27, 0x35, 0x2e, 0x48, 0x09, 0x10, 0x1b, 0xe5, 0xef, 0xc7, 0xc7, + 0xf8, 0x16, 0x11, 0x2c, 0x32, 0x4d, 0x3c, 0x42, 0x5b, 0x3d, 0x45, 0x09, + 0xdf, 0xd8, 0xef, 0xcb, 0xc4, 0xf4, 0x08, 0x07, 0xf1, 0xdc, 0xd0, 0xd8, + 0xf0, 0xfc, 0xdb, 0xde, 0xd8, 0xf1, 0x40, 0x30, 0xde, 0xea, 0xe8, 0xc7, + 0xb2, 0xcd, 0xbc, 0xdf, 0xd0, 0xed, 0xfc, 0xde, 0xd9, 0xbc, 0xcf, 0xe4, + 0xfd, 0xf7, 0xe3, 0xec, 0xd3, 0xd6, 0xcf, 0xcf, 0xc0, 0xa8, 0xb3, 0xb2, + 0xd8, 0xf1, 0x09, 0x10, 0x0f, 0x11, 0x0d, 0xf8, 0xda, 0xed, 0xdc, 0xf1, + 0xf0, 0x0d, 0xff, 0xe3, 0xea, 0xcf, 0xc4, 0xd3, 0xd4, 0xcd, 0xd6, 0xbe, + 0xf7, 0xf8, 0x03, 0xfa, 0xef, 0xc8, 0xc0, 0xc6, 0xd0, 0xd0, 0xd9, 0xde, + 0xf2, 0x1d, 0x1e, 0x2a, 0x1f, 0x08, 0x03, 0xe4, 0xbb, 0xb7, 0xbe, 0xc3, + 0xe1, 0xf9, 0xf7, 0xe3, 0xd0, 0xc8, 0xcd, 0xcd, 0xde, 0xf0, 0x0c, 0x27, + 0x32, 0x30, 0x25, 0x0d, 0x18, 0x26, 0x43, 0x3e, 0x34, 0x1e, 0x19, 0xff, + 0x07, 0x12, 0xfc, 0xf2, 0xf7, 0x04, 0xfa, 0xfd, 0xfa, 0x18, 0x0d, 0x12, + 0x07, 0x11, 0x1b, 0x2a, 0x31, 0x31, 0x30, 0x27, 0x18, 0x1a, 0xfb, 0x0d, + 0x26, 0x45, 0x3c, 0x38, 0x26, 0x06, 0xfa, 0xf2, 0xe8, 0xdc, 0xf1, 0xfc, + 0x09, 0x13, 0x1b, 0x31, 0x55, 0x5a, 0x5e, 0x43, 0x29, 0x1c, 0x1c, 0x10, + 0x16, 0x1c, 0x22, 0x1b, 0x22, 0x0c, 0x1e, 0x01, 0xf2, 0xf1, 0xf9, 0xf2, + 0xfe, 0x16, 0x21, 0x1c, 0x43, 0x46, 0x44, 0x46, 0x27, 0xfd, 0xe1, 0xe5, + 0xfb, 0x07, 0x1e, 0x25, 0x1e, 0x22, 0xfe, 0xe2, 0xe5, 0xff, 0xef, 0xed, + 0x06, 0x22, 0x28, 0x3a, 0x34, 0x24, 0x12, 0xf4, 0xda, 0xd7, 0xd0, 0xdc, + 0xef, 0xea, 0x0d, 0x0c, 0x08, 0x1c, 0x16, 0xfc, 0xf8, 0xf9, 0x0d, 0x26, + 0x26, 0x32, 0x33, 0x32, 0x16, 0xf0, 0xd8, 0xde, 0xdf, 0xbe, 0xb7, 0xc9, + 0xcc, 0xd6, 0xd4, 0xd4, 0xe5, 0xf0, 0xf9, 0xf8, 0xf9, 0xf9, 0xe8, 0xe7, + 0xf2, 0xff, 0xfc, 0xf1, 0xea, 0xe6, 0xdb, 0xe1, 0xf1, 0xf8, 0xf0, 0x01, + 0x01, 0xf2, 0xf3, 0xfc, 0xef, 0xef, 0xf2, 0xf7, 0xe7, 0xc7, 0xcc, 0xd6, + 0xbc, 0xc2, 0xcb, 0xc8, 0xba, 0xd4, 0xf9, 0xf7, 0xee, 0xff, 0xf8, 0xf0, + 0xe2, 0xd9, 0xcf, 0xbc, 0xd9, 0xec, 0xec, 0xdc, 0xda, 0xc3, 0xd2, 0xfb, + 0xef, 0xf2, 0xff, 0x02, 0x09, 0xf8, 0xe7, 0xdb, 0xdc, 0xe4, 0xf2, 0xf7, + 0xed, 0xed, 0xde, 0xd8, 0xf0, 0xf4, 0xfd, 0xfa, 0xf0, 0xf8, 0xf7, 0xea, + 0xee, 0xe6, 0xd8, 0xdb, 0xe2, 0xdc, 0xd7, 0xd6, 0xe6, 0xf3, 0xfa, 0x08, + 0xfc, 0xfe, 0x10, 0x27, 0x37, 0x3d, 0x35, 0x09, 0xf8, 0x18, 0x12, 0xfa, + 0xf8, 0x03, 0xfc, 0xfc, 0xf7, 0xf2, 0xfb, 0x07, 0x13, 0x16, 0x13, 0x08, + 0x0c, 0x19, 0x10, 0x0d, 0x0e, 0x09, 0x1b, 0x1b, 0x18, 0x13, 0x0d, 0x13, + 0x1f, 0x1a, 0x1a, 0x1b, 0x1f, 0x0d, 0xfd, 0x27, 0x2c, 0x2d, 0x33, 0x1a, + 0x05, 0x08, 0x16, 0x1f, 0x18, 0x19, 0x1b, 0x0c, 0xfd, 0x06, 0x01, 0x14, + 0x18, 0x1b, 0x27, 0x2d, 0x1b, 0x12, 0x1b, 0x1d, 0x1c, 0x25, 0x28, 0x2d, + 0x21, 0x0e, 0x0f, 0x0c, 0x10, 0x0f, 0x09, 0x10, 0x1e, 0x22, 0x13, 0x12, + 0x22, 0x10, 0x03, 0x0f, 0x26, 0x32, 0x34, 0x44, 0x3d, 0x28, 0x1d, 0x0d, + 0x02, 0x06, 0x08, 0x07, 0xfc, 0x02, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x02, + 0x01, 0xfb, 0x05, 0x18, 0x11, 0x18, 0x34, 0x11, 0xfc, 0xec, 0xe5, 0xde, + 0xd3, 0xed, 0xfd, 0x01, 0x12, 0x11, 0x04, 0x0d, 0xfd, 0xe7, 0xf1, 0xdf, + 0xf7, 0x03, 0x11, 0x26, 0x2a, 0x16, 0x0c, 0x16, 0x0e, 0xfa, 0xf9, 0xf7, + 0xf1, 0xfc, 0xfb, 0x02, 0xfa, 0xfc, 0x00, 0xf9, 0xf8, 0xfa, 0xfb, 0xff, + 0x07, 0x0d, 0xf8, 0xf8, 0xfb, 0xf0, 0xe7, 0xf4, 0xf7, 0xf3, 0xf2, 0xde, + 0xd7, 0xe8, 0xe2, 0xd9, 0xe5, 0xf4, 0xfa, 0xee, 0xe6, 0xe6, 0xef, 0xfa, + 0xfa, 0xfc, 0xfd, 0xee, 0xdc, 0xe5, 0xf9, 0xfc, 0xf8, 0xee, 0xed, 0xed, + 0xf1, 0xe4, 0xd7, 0xdb, 0xdb, 0xdf, 0xe6, 0xf1, 0xf9, 0xf3, 0xf8, 0xef, + 0xe7, 0xf2, 0xe4, 0xd4, 0xe3, 0xfa, 0xfb, 0x02, 0x04, 0xef, 0xe4, 0xec, + 0xf3, 0xf4, 0xec, 0xf4, 0xe7, 0xf8, 0x00, 0x09, 0x07, 0x00, 0xfe, 0xfa, + 0xfa, 0xf2, 0xe4, 0xec, 0xef, 0xf1, 0xed, 0xfa, 0xf9, 0xf9, 0xf3, 0xf9, + 0x00, 0xe4, 0xd4, 0xf1, 0x04, 0x00, 0xf3, 0xfe, 0xf9, 0xea, 0xe3, 0xe4, + 0x01, 0xf4, 0xe6, 0xf2, 0xfd, 0x03, 0xfd, 0xec, 0xec, 0xf4, 0xfc, 0xfc, + 0xfd, 0xfc, 0x00, 0x01, 0xf9, 0xfe, 0xf9, 0xe5, 0xe7, 0xea, 0xe8, 0xf8, + 0x00, 0x04, 0x0d, 0x01, 0x04, 0xf9, 0xf1, 0xff, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x08, 0xff, 0xfc, 0x03, 0xf4, 0x02, 0x01, 0xe7, 0xed, 0x03, + 0x08, 0x03, 0x16, 0x24, 0x0f, 0xfb, 0x07, 0x0d, 0xf1, 0x03, 0x02, 0xed, + 0x07, 0x1d, 0x0e, 0x09, 0x01, 0xee, 0xfb, 0x08, 0x0f, 0x06, 0xfc, 0x05, + 0x03, 0x02, 0x0c, 0x14, 0x02, 0xf4, 0xf9, 0x01, 0x05, 0xfd, 0xf2, 0x0e, + 0x08, 0x05, 0x08, 0x03, 0xf8, 0xf9, 0xfb, 0xfd, 0x0e, 0x0e, 0xff, 0x02, + 0x04, 0x05, 0x26, 0x35, 0x2c, 0x1f, 0x16, 0x09, 0xf2, 0xfd, 0x03, 0xfa, + 0xfd, 0x02, 0xf1, 0xe8, 0xef, 0xf3, 0xf4, 0xf4, 0x06, 0x12, 0x16, 0x02, + 0x09, 0x18, 0x1b, 0x1b, 0x1f, 0x27, 0x1f, 0xff, 0xf3, 0x04, 0x00, 0xf7, + 0xf7, 0x0e, 0x1b, 0x06, 0x07, 0xff, 0xfc, 0x19, 0x1d, 0x11, 0x1b, 0x18, + 0xff, 0x03, 0x13, 0x0d, 0x0e, 0x09, 0xff, 0x00, 0x09, 0xff, 0xee, 0xfb, + 0x07, 0x0e, 0x09, 0x03, 0x14, 0x13, 0x1b, 0x10, 0x07, 0x0d, 0x16, 0x04, + 0xf2, 0x06, 0x1a, 0x10, 0x0f, 0x18, 0x09, 0x03, 0x11, 0x13, 0x13, 0x13, + 0x22, 0x27, 0x1d, 0x13, 0x0f, 0x16, 0x14, 0xfd, 0xf0, 0x03, 0x09, 0x02, + 0xf7, 0x07, 0x13, 0x1a, 0x14, 0x08, 0x08, 0x14, 0x16, 0x13, 0x18, 0x13, + 0x05, 0xf4, 0xf8, 0x06, 0x04, 0xfc, 0x01, 0x0e, 0x09, 0x03, 0x02, 0x04, + 0x16, 0x09, 0xfd, 0x08, 0x00, 0x07, 0x05, 0xfb, 0xf7, 0xfb, 0xf1, 0xe1, + 0xea, 0xf1, 0xed, 0x06, 0x0c, 0x08, 0x08, 0x02, 0x0c, 0x05, 0x01, 0x09, + 0x04, 0xf3, 0xf4, 0xfc, 0xfe, 0xff, 0xf3, 0xea, 0xe6, 0xe3, 0xd9, 0xd9, + 0xe6, 0xe7, 0xea, 0xfa, 0x07, 0x00, 0xf3, 0xf8, 0xf9, 0xe8, 0xd9, 0xdb, + 0xe6, 0xe8, 0xe4, 0xed, 0xf7, 0xf2, 0xf8, 0xf0, 0xe3, 0xea, 0xea, 0xdf, + 0xf4, 0xfd, 0xf4, 0xff, 0xf8, 0xef, 0xf0, 0xef, 0xea, 0xe6, 0xe3, 0xe2, + 0xe4, 0xe8, 0xe1, 0xd9, 0xec, 0xf2, 0xf9, 0xfa, 0xf9, 0xfb, 0x09, 0x08, + 0xfa, 0xfa, 0xfa, 0xea, 0xee, 0xfa, 0xec, 0xd9, 0xe1, 0xde, 0xde, 0xdf, + 0xee, 0xff, 0xf7, 0xf7, 0xfd, 0xfb, 0x07, 0x09, 0xf3, 0xea, 0xf9, 0xfc, + 0xef, 0xf1, 0xe7, 0xf3, 0xf1, 0xec, 0xfa, 0xf4, 0xe5, 0xf0, 0xf9, 0xfd, + 0xf9, 0xf3, 0xfd, 0x00, 0xf8, 0xf1, 0xf7, 0xef, 0xe7, 0xdf, 0xdc, 0xe3, + 0xea, 0xec, 0xef, 0xef, 0xf4, 0xff, 0x0d, 0x19, 0x07, 0xfc, 0xfe, 0x09, + 0x0f, 0x07, 0x03, 0x03, 0x06, 0xfb, 0xe2, 0xf3, 0xe8, 0xdf, 0xef, 0xf0, + 0xf8, 0xfd, 0xff, 0x08, 0x14, 0x16, 0x06, 0x04, 0x0d, 0x02, 0xf4, 0xfa, + 0xfe, 0x03, 0x00, 0xf1, 0xf9, 0x01, 0xff, 0xf8, 0xf3, 0x00, 0x12, 0x13, + 0x07, 0x19, 0x10, 0x0c, 0x05, 0x10, 0x05, 0x01, 0x01, 0x00, 0xff, 0x00, + 0x05, 0x11, 0x0d, 0x03, 0x03, 0x08, 0x00, 0xf3, 0xf0, 0x00, 0xfe, 0xf7, + 0x07, 0x16, 0x13, 0x11, 0x07, 0x02, 0x0c, 0xfd, 0xf2, 0xfd, 0x04, 0x01, + 0x06, 0x05, 0x07, 0x09, 0x09, 0x14, 0x1f, 0x19, 0x10, 0x13, 0x1a, 0x22, + 0x1b, 0x19, 0x14, 0x0e, 0x0d, 0x0f, 0x0e, 0x0d, 0x08, 0x01, 0x00, 0x00, + 0xf9, 0x01, 0x0d, 0x0e, 0x13, 0x13, 0x0c, 0x0d, 0x0f, 0x0e, 0x12, 0x19, + 0x1a, 0x18, 0x1c, 0x24, 0x14, 0xfd, 0x05, 0x1c, 0x11, 0x05, 0x0c, 0x0c, + 0x06, 0x06, 0x03, 0x04, 0x02, 0x09, 0x16, 0x1a, 0x1d, 0x1f, 0x10, 0x06, + 0x07, 0x08, 0x04, 0xfd, 0xfb, 0x03, 0x0c, 0x12, 0x0d, 0xfe, 0x03, 0x11, + 0x1a, 0x16, 0x0d, 0x0c, 0x16, 0x12, 0x0d, 0x11, 0x0f, 0x0e, 0x13, 0x10, + 0x0d, 0x0c, 0x05, 0x00, 0x03, 0x00, 0x04, 0x13, 0x14, 0x11, 0x13, 0x0d, + 0x08, 0x08, 0x12, 0x05, 0x05, 0x11, 0x00, 0xfb, 0x02, 0x03, 0x05, 0x05, + 0x03, 0x03, 0x04, 0x02, 0xfe, 0xfe, 0xff, 0x09, 0x07, 0x04, 0x08, 0xff, + 0xfc, 0x02, 0x03, 0x08, 0x0c, 0xfa, 0xfa, 0xfe, 0xf1, 0xfe, 0xf0, 0xfd, + 0x05, 0xfa, 0xef, 0xf8, 0x04, 0x03, 0xfa, 0xff, 0x0e, 0x06, 0xfe, 0x07, + 0x03, 0xfb, 0xfb, 0x04, 0x03, 0xf8, 0xed, 0xea, 0xf9, 0xfe, 0xfc, 0xfb, + 0xf3, 0xff, 0x0c, 0xf9, 0xf8, 0xfb, 0xfe, 0xfc, 0xf4, 0xf8, 0x04, 0x02, + 0xfb, 0xfd, 0xee, 0xea, 0xf1, 0xe8, 0xe1, 0xed, 0xfa, 0xf1, 0xf2, 0xfb, + 0xfb, 0xfb, 0x00, 0xfb, 0xf0, 0xf4, 0xfb, 0xf8, 0xf4, 0xea, 0xe4, 0xea, + 0xef, 0xee, 0xed, 0xf4, 0xfc, 0xf4, 0xe7, 0xef, 0xfa, 0xf9, 0xf8, 0xfe, + 0x09, 0x01, 0xfa, 0xf7, 0xef, 0xe4, 0xe2, 0xe6, 0xe6, 0xf2, 0xf9, 0xea, + 0xfb, 0xfe, 0xf0, 0xf1, 0xf2, 0xf8, 0xf9, 0xf3, 0xef, 0xf1, 0xf2, 0xf2, + 0xfb, 0x00, 0xf2, 0xee, 0xed, 0xdc, 0xdc, 0xe5, 0xed, 0xee, 0xe4, 0xe4, + 0xee, 0xee, 0xe8, 0xf1, 0xf0, 0xe5, 0xe4, 0xe5, 0xe6, 0xe1, 0xed, 0xfa, + 0xfc, 0xfc, 0xfb, 0xf2, 0xee, 0xf0, 0xf2, 0xf1, 0xf4, 0xf3, 0xee, 0xea, + 0xe1, 0xdc, 0xe8, 0xea, 0xea, 0xf1, 0xf2, 0xec, 0xef, 0xfc, 0xfd, 0xff, + 0xff, 0x02, 0x01, 0xf2, 0xfa, 0xf4, 0xf3, 0xf2, 0xf1, 0xee, 0xea, 0xea, + 0xf0, 0xf2, 0xf7, 0xf9, 0xef, 0xf0, 0xee, 0xea, 0xf4, 0xfc, 0x03, 0x06, + 0x03, 0xfe, 0xfc, 0xfa, 0xf1, 0xec, 0xf2, 0xf2, 0xf7, 0xf4, 0xf7, 0xfe, + 0xff, 0xfb, 0xfe, 0x05, 0xfb, 0xfc, 0x07, 0x06, 0x09, 0x01, 0x04, 0x03, + 0xfc, 0xfc, 0xff, 0x00, 0xf8, 0xf2, 0xee, 0xed, 0xf1, 0xf3, 0xfe, 0x03, + 0x07, 0x0e, 0x0e, 0x0d, 0x0e, 0x05, 0x08, 0x19, 0x11, 0x02, 0x01, 0x00, + 0xfc, 0xfd, 0x07, 0x0c, 0xf9, 0xff, 0x03, 0x04, 0x08, 0x07, 0x06, 0x0f, + 0x16, 0x18, 0x16, 0x12, 0x03, 0xfe, 0xff, 0x00, 0xfe, 0xf7, 0xfa, 0x00, + 0xfe, 0x00, 0x05, 0x08, 0x0e, 0x0c, 0x0f, 0x0f, 0x04, 0x08, 0x13, 0x19, + 0x0d, 0x0c, 0x0c, 0x0c, 0x09, 0x10, 0x0e, 0x06, 0x0f, 0x12, 0x09, 0x04, + 0x10, 0x14, 0x0d, 0x0c, 0x0e, 0x01, 0x08, 0x19, 0x0d, 0x06, 0x19, 0x14, + 0x0d, 0x05, 0x10, 0x13, 0x19, 0x16, 0x0f, 0x0f, 0x10, 0x10, 0x07, 0x06, + 0x10, 0x0e, 0x06, 0x0c, 0x0f, 0x07, 0x0e, 0x0d, 0x07, 0x14, 0x16, 0x0f, + 0x10, 0x11, 0x10, 0x10, 0x0e, 0x07, 0x07, 0x0d, 0x11, 0x07, 0x0c, 0x09, + 0x05, 0x0d, 0x14, 0x1a, 0x1c, 0x18, 0x11, 0x10, 0x11, 0x19, 0x1f, 0x19, + 0x10, 0x0c, 0x09, 0x0f, 0x10, 0x10, 0x0f, 0x0d, 0x08, 0x0d, 0x18, 0x10, + 0x10, 0x13, 0x12, 0x10, 0x13, 0x12, 0x13, 0x16, 0x09, 0x05, 0x04, 0x01, + 0x05, 0x05, 0x01, 0x00, 0x05, 0x01, 0xf9, 0x01, 0x03, 0x08, 0x06, 0x00, + 0xff, 0x00, 0x00, 0x03, 0x03, 0x04, 0x09, 0x01, 0xfd, 0xf1, 0xf8, 0xfc, + 0xf7, 0xff, 0xff, 0xf9, 0xfd, 0x02, 0xfb, 0xf3, 0xfd, 0x01, 0xfe, 0x01, + 0xff, 0xfb, 0xfb, 0xfc, 0xff, 0xfa, 0xff, 0x03, 0xfc, 0xf8, 0xfa, 0xf7, + 0xf2, 0xfc, 0xfb, 0xf1, 0xf8, 0xee, 0xee, 0xf2, 0xf1, 0xec, 0xf1, 0xf3, + 0xf7, 0xfe, 0xfe, 0xf8, 0xf2, 0xef, 0xfd, 0xfe, 0xf2, 0xf1, 0xef, 0xf0, + 0xf1, 0xed, 0xee, 0xec, 0xf2, 0xf2, 0xe5, 0xee, 0xf8, 0xf1, 0xed, 0xee, + 0xf1, 0xef, 0xf0, 0xfb, 0xfb, 0xf4, 0xf2, 0xee, 0xf1, 0xf2, 0xe8, 0xed, + 0xf1, 0xe8, 0xee, 0xf3, 0xea, 0xf1, 0xfd, 0xf8, 0xf3, 0xf8, 0xf8, 0xfa, + 0xee, 0xf0, 0xef, 0xf0, 0xee, 0xef, 0xf2, 0xf2, 0xed, 0xef, 0xee, 0xed, + 0xf2, 0xf8, 0xee, 0xf0, 0xf3, 0xf1, 0xfa, 0xf9, 0xf9, 0xfb, 0xfc, 0xf4, + 0xf2, 0xf7, 0xfb, 0xfd, 0xf8, 0xf4, 0xf9, 0x00, 0x03, 0x02, 0xfe, 0xf8, + 0xf7, 0xfc, 0x00, 0x02, 0x05, 0x05, 0x05, 0xfe, 0xfd, 0xfc, 0xfe, 0x03, + 0x05, 0x07, 0xff, 0xf9, 0xfa, 0xff, 0x01, 0x01, 0x00, 0xfc, 0xfd, 0x04, + 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xfc, 0x04, 0x06, 0x01, + 0x02, 0x05, 0x03, 0x08, 0x08, 0x08, 0x01, 0xfb, 0xfb, 0xfd, 0xfd, 0xf8, + 0xf8, 0xfe, 0xfb, 0xfd, 0x07, 0x05, 0xfd, 0x00, 0x03, 0x05, 0x05, 0x08, + 0x03, 0x03, 0x08, 0x06, 0x06, 0x05, 0x00, 0x01, 0x04, 0x08, 0x0d, 0x0e, + 0x06, 0x00, 0xfe, 0x02, 0x02, 0x03, 0x02, 0xff, 0xfd, 0xf9, 0xf4, 0x03, + 0x00, 0xfd, 0x03, 0x08, 0x04, 0x03, 0x06, 0x07, 0x06, 0x00, 0x00, 0x04, + 0x01, 0x01, 0x07, 0x05, 0x02, 0x01, 0x00, 0xf9, 0xfa, 0xfe, 0xff, 0xfe, + 0xfc, 0x01, 0x03, 0x05, 0x06, 0x00, 0x05, 0x04, 0x01, 0x03, 0x00, 0xfe, + 0xff, 0x01, 0x01, 0xff, 0x01, 0xff, 0xf7, 0xfd, 0xff, 0x03, 0x04, 0x06, + 0x08, 0x05, 0x01, 0x02, 0x07, 0x08, 0x02, 0xfe, 0xfe, 0xfa, 0xfe, 0x02, + 0xfd, 0x00, 0x03, 0x04, 0x03, 0xfe, 0xf9, 0xfa, 0x01, 0x03, 0x04, 0x0c, + 0x07, 0xfd, 0xfa, 0xf8, 0xfb, 0xfe, 0xff, 0xff, 0xfd, 0xfb, 0xfc, 0xfd, + 0xff, 0x00, 0x00, 0xff, 0x03, 0x04, 0x04, 0x01, 0x01, 0x01, 0x00, 0xfd, + 0xff, 0x01, 0xfe, 0x00, 0x02, 0x01, 0xff, 0x03, 0x04, 0x02, 0x00, 0x01, + 0xfc, 0xfa, 0xfd, 0xfe, 0xff, 0xfe, 0xfc, 0xfd, 0xfe, 0x01, 0x06, 0x0d, + 0x09, 0x02, 0x03, 0x04, 0x02, 0xfd, 0xff, 0x03, 0x03, 0x04, 0x05, 0x00, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x05, 0x04, 0x00, 0x01, 0x03, 0x02, 0x05, + 0x08, 0x0e, 0x08, 0x04, 0x04, 0x05, 0x05, 0x02, 0x07, 0x0c, 0x07, 0x07, + 0x07, 0x09, 0x09, 0x04, 0x02, 0x03, 0x09, 0x08, 0x0e, 0x10, 0x09, 0x09, + 0x06, 0x00, 0xfc, 0xfd, 0x03, 0x05, 0xfd, 0xfb, 0x02, 0x01, 0x06, 0x12, + 0x16, 0x0c, 0x05, 0x02, 0xff, 0xfc, 0xfb, 0xf9, 0xfd, 0x03, 0x01, 0x00, + 0x01, 0x03, 0x00, 0xfc, 0xfc, 0xfe, 0xff, 0x00, 0x04, 0x09, 0x05, 0x04, + 0x02, 0x02, 0x01, 0x01, 0x00, 0xfe, 0x04, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x00, 0x02, 0x03, 0x03, 0xfe, 0xfe, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, + 0xfb, 0xfc, 0xfe, 0xfb, 0xfa, 0xfb, 0xfc, 0xff, 0x02, 0x01, 0x00, 0xff, + 0xfc, 0xf3, 0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xfc, 0xf9, 0xf7, 0xf9, 0xf4, + 0xfb, 0xfc, 0xf9, 0xfa, 0xfb, 0xf9, 0xfb, 0xfd, 0xfb, 0xfc, 0xff, 0x01, + 0xfc, 0xf3, 0xf4, 0xfc, 0xff, 0xfd, 0xf7, 0xf9, 0xfb, 0xfb, 0xf8, 0xf4, + 0xf4, 0xfc, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf8, 0xfa, 0xfc, 0xf9, 0xfc, + 0xfe, 0xf9, 0xf9, 0xfe, 0xfb, 0xf7, 0xfa, 0xfc, 0xfc, 0xf7, 0xf8, 0xf9, + 0xf9, 0xf9, 0xf9, 0xfd, 0xff, 0xfd, 0xfa, 0xf9, 0xf8, 0xf7, 0xf4, 0xf3, + 0xf7, 0xf8, 0xfc, 0xff, 0x00, 0xfe, 0xfb, 0xfa, 0xfb, 0xff, 0xfe, 0xfd, + 0xff, 0xfb, 0xf3, 0xf7, 0xf3, 0xf4, 0xf8, 0xfe, 0x04, 0x04, 0xfc, 0xf7, + 0xfa, 0xfe, 0xff, 0xfd, 0xfe, 0x00, 0xfd, 0xfe, 0xfc, 0xf8, 0xf3, 0xfa, + 0xfe, 0xfe, 0xfa, 0xfb, 0xfc, 0xfa, 0xfc, 0x01, 0xff, 0xfc, 0xf9, 0xfa, + 0xfc, 0xff, 0xfb, 0xf2, 0xf3, 0xf7, 0xfb, 0xfc, 0xfa, 0xfb, 0xf4, 0xf2, + 0xef, 0xf1, 0xf4, 0xf1, 0xea, 0xed, 0xf3, 0xfc, 0xfd, 0xfc, 0xff, 0xff, + 0xfc, 0xfd, 0xfc, 0xf4, 0xf8, 0xfc, 0xf9, 0xfa, 0xf4, 0xed, 0xf0, 0xfb, + 0xfb, 0xf1, 0xef, 0xfa, 0x04, 0x08, 0x07, 0x01, 0xfe, 0x01, 0x02, 0xfe, + 0xfc, 0xfd, 0xfc, 0xf7, 0xf2, 0xf8, 0xf8, 0xf9, 0xfa, 0xf7, 0xf9, 0xfb, + 0xfe, 0xfe, 0xff, 0xfe, 0x00, 0x03, 0x04, 0x03, 0x05, 0x00, 0xfc, 0xfc, + 0xff, 0xfd, 0xfc, 0xfd, 0x00, 0xff, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xfd, + 0xfd, 0xfe, 0xfe, 0xfd, 0xf9, 0xfc, 0x02, 0x05, 0x03, 0x01, 0xfd, 0xfc, + 0xfe, 0xfd, 0x04, 0x0c, 0x06, 0x08, 0x08, 0x07, 0x03, 0x02, 0x02, 0x01, + 0x01, 0xff, 0x00, 0x06, 0x04, 0x00, 0x06, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, + 0x08, 0x0c, 0x0e, 0x0d, 0x0e, 0x0f, 0x09, 0x05, 0x03, 0x04, 0x04, 0xfc, + 0x00, 0x08, 0x0c, 0x09, 0x0c, 0x11, 0x18, 0x18, 0x13, 0x14, 0x0f, 0x08, + 0x08, 0x08, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x05, 0x08, + 0x0e, 0x11, 0x13, 0x12, 0x13, 0x12, 0x0f, 0x0e, 0x0c, 0x08, 0x07, 0x05, + 0x07, 0x07, 0x08, 0x06, 0x06, 0x04, 0x03, 0x05, 0x08, 0x05, 0x02, 0x08, + 0x0e, 0x09, 0x09, 0x0e, 0x0c, 0x10, 0x11, 0x0e, 0x0e, 0x0d, 0x09, 0x04, + 0x04, 0x07, 0x04, 0x01, 0x03, 0x06, 0x03, 0xfe, 0xfc, 0xfe, 0x01, 0x03, + 0x08, 0x0c, 0x0c, 0x08, 0x07, 0x06, 0x05, 0x03, 0x02, 0x02, 0x02, 0x01, + 0x01, 0xfe, 0xf8, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x05, + 0x04, 0x00, 0xfc, 0xf8, 0xf4, 0xfb, 0xff, 0xfd, 0xf8, 0xfd, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0x03, 0x00, 0xfb, 0xfb, 0xfb, + 0xfa, 0xfc, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xff, 0x00, 0x00, 0x00, + 0xfe, 0xfe, 0xfc, 0xfe, 0x00, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xfd, 0xff, 0x00, 0xfc, 0xfb, 0xfe, 0xff, 0x00, 0x02, 0x00, 0xfe, + 0xfe, 0xfb, 0xfb, 0xfc, 0xfb, 0xfd, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xfc, + 0x00, 0x00, 0xff, 0xfc, 0xfc, 0xfe, 0xfe, 0xfb, 0xfc, 0x00, 0x03, 0x02, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0xfd, 0xfb, + 0xfc, 0xfd, 0xf9, 0xf6, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, 0xfd, 0x00, + 0x02, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0xfd, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0xfc, 0xfb, 0xfa, 0xfb, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xfd, 0xf8, 0xf5, 0xf7, 0xfa, 0xfd, 0xfe, 0xfe, 0xfd, + 0xfe, 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfc, 0xff, 0x02, 0x02, 0x03, 0x04, + 0x00, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfd, 0xfe, 0xff, 0x00, 0x00, 0xff, + 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x01, 0x03, 0x01, 0x01, 0x04, 0x04, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, + 0xfd, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x02, 0x05, 0x05, 0x05, 0x02, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x03, 0x04, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x04, 0x07, 0x04, 0x01, 0x01, 0x01, + 0x00, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfc, 0xfe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, + 0xfe, 0xfd, 0xfd, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xff, 0xfe, 0xfe, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, + 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x01, 0x0a, 0x0e, 0x0b, 0x08, 0x06, 0x07, 0x06, 0xf8, 0x02, 0x09, 0x09, + 0x07, 0x0e, 0x0e, 0x09, 0x11, 0x06, 0x00, 0x0a, 0x0f, 0x09, 0xfd, 0xfa, + 0xfb, 0xfc, 0xf6, 0xf9, 0xfc, 0xfc, 0xfb, 0xff, 0xfb, 0xf8, 0xfc, 0xfc, + 0xff, 0x01, 0x04, 0x07, 0x04, 0x04, 0xff, 0x01, 0x00, 0xfb, 0x00, 0x05, + 0x09, 0x09, 0x03, 0x05, 0x0e, 0x11, 0x0d, 0x07, 0x04, 0x14, 0x03, 0xfd, + 0x07, 0x0d, 0x0d, 0x08, 0x00, 0xfb, 0x04, 0x0c, 0x02, 0xfe, 0xfd, 0xfd, + 0x00, 0xf8, 0xf7, 0xff, 0x07, 0x02, 0xfc, 0xfe, 0xf5, 0xfb, 0xfd, 0xfc, + 0x02, 0xfd, 0x01, 0x06, 0x03, 0x0d, 0x11, 0x01, 0xf6, 0xff, 0x11, 0x07, + 0x08, 0x03, 0xff, 0x10, 0x0e, 0x09, 0x05, 0x03, 0x02, 0xf5, 0xfa, 0x00, + 0xfc, 0x07, 0x05, 0x05, 0x07, 0x02, 0x03, 0x09, 0x06, 0x01, 0x06, 0xff, + 0xfa, 0xfc, 0x00, 0xfb, 0xfc, 0xf7, 0xfa, 0xfb, 0xfb, 0xf1, 0xf6, 0x03, + 0xfa, 0x05, 0x07, 0x07, 0x19, 0x0e, 0x0d, 0x0a, 0x07, 0x03, 0x10, 0x12, + 0x08, 0x08, 0x0b, 0x11, 0x15, 0x13, 0x09, 0x08, 0x0c, 0xff, 0x00, 0x00, + 0x01, 0x06, 0x08, 0x05, 0xf9, 0xf0, 0xf6, 0xfe, 0xfc, 0xfa, 0xf5, 0xfb, + 0xfe, 0xff, 0xf8, 0xef, 0xf6, 0xf9, 0xf9, 0xf5, 0xf4, 0xf5, 0xf5, 0xfc, + 0x00, 0x02, 0x04, 0x0a, 0x0d, 0x1e, 0x0c, 0xfb, 0x02, 0x10, 0x13, 0x0f, + 0x08, 0x01, 0x09, 0x11, 0x11, 0x0f, 0x09, 0x11, 0x0c, 0x01, 0xfb, 0xfe, + 0x02, 0x02, 0x07, 0x09, 0x02, 0x01, 0xfc, 0xfd, 0x03, 0x02, 0x01, 0x01, + 0x00, 0x02, 0xfc, 0xf7, 0xf5, 0xfe, 0xfd, 0xf3, 0xef, 0xfa, 0x0d, 0x04, + 0x08, 0x0c, 0x0a, 0x13, 0x0b, 0x07, 0x05, 0xf8, 0xf8, 0xfb, 0x06, 0x08, + 0xff, 0x04, 0x0f, 0x13, 0x10, 0x04, 0x0d, 0x0a, 0x01, 0xfa, 0xf7, 0xfc, + 0xfc, 0x00, 0xfe, 0xfb, 0x01, 0xfe, 0xfe, 0xfd, 0x03, 0x08, 0x09, 0x08, + 0x09, 0xfb, 0xf2, 0xf5, 0xf9, 0xf5, 0xf7, 0xf7, 0xf6, 0xfa, 0xfc, 0xf9, + 0x00, 0xfc, 0x0e, 0x0e, 0x0a, 0x05, 0x03, 0x08, 0x0f, 0x14, 0x18, 0x0e, + 0x03, 0x0b, 0x0e, 0x08, 0x0a, 0x03, 0x0e, 0x0d, 0x09, 0x09, 0x0e, 0x08, + 0x04, 0x05, 0x08, 0x03, 0x07, 0x06, 0x00, 0x00, 0x01, 0xfc, 0xfc, 0xfa, + 0xfd, 0xf7, 0xf5, 0xf2, 0x00, 0x02, 0xfd, 0xf9, 0xfd, 0xf7, 0xed, 0xf4, + 0xf8, 0x00, 0x11, 0x0d, 0x02, 0x02, 0xfd, 0x00, 0x0b, 0x12, 0x09, 0xff, + 0x01, 0x03, 0x0e, 0x0b, 0x08, 0x0e, 0x08, 0xfd, 0xfe, 0x02, 0x04, 0x00, + 0xfe, 0xfb, 0xf8, 0xfe, 0x02, 0x00, 0x04, 0x07, 0x08, 0x00, 0xfe, 0x06, + 0x07, 0xf8, 0xf9, 0x04, 0x00, 0x05, 0x05, 0xfb, 0xfe, 0x05, 0x04, 0xfb, + 0x08, 0x16, 0x0e, 0x10, 0x06, 0x04, 0x03, 0x00, 0xfb, 0x09, 0x0b, 0x07, + 0x0b, 0x0e, 0x07, 0x00, 0xf9, 0x01, 0xfe, 0x03, 0x03, 0x07, 0x05, 0x04, + 0x06, 0x02, 0x01, 0x01, 0xf7, 0xfb, 0x04, 0x0a, 0x09, 0x0a, 0xf5, 0xf6, + 0xf9, 0xf8, 0xfa, 0x06, 0x01, 0x05, 0xfd, 0x05, 0x08, 0x00, 0xfe, 0xfd, + 0x06, 0x10, 0x07, 0x00, 0xfa, 0x01, 0x06, 0x03, 0x08, 0x0c, 0x05, 0x0b, + 0x0c, 0x0d, 0x09, 0x06, 0x0f, 0x0a, 0x00, 0x00, 0x02, 0x04, 0x09, 0x09, + 0x03, 0xf9, 0xfe, 0x05, 0xf4, 0xe8, 0xf4, 0x02, 0x08, 0xff, 0x00, 0xfe, + 0xfc, 0xfd, 0xff, 0xef, 0xee, 0xf1, 0xee, 0xfb, 0xfc, 0xfa, 0xfc, 0x04, + 0x15, 0x13, 0x0c, 0x07, 0x05, 0x09, 0x14, 0x17, 0x14, 0x11, 0x0c, 0x14, + 0x1a, 0x0e, 0x07, 0x11, 0x11, 0x06, 0x06, 0x03, 0x01, 0x04, 0x06, 0xfa, + 0xfd, 0x04, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xfa, 0x03, 0x04, 0xfc, 0xef, + 0xf4, 0xef, 0xf0, 0xf9, 0xfc, 0xfa, 0xfc, 0x08, 0x02, 0x03, 0x01, 0x09, + 0x12, 0x08, 0xfe, 0xf9, 0xfe, 0x02, 0x00, 0x00, 0x0f, 0x12, 0x1b, 0x1a, + 0x0c, 0x0c, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x00, 0xf9, 0xf3, 0xf4, 0xf5, + 0x02, 0x0f, 0xff, 0xf1, 0xec, 0xf7, 0xff, 0xfe, 0xfe, 0xf9, 0xf2, 0xfe, + 0xfb, 0xfa, 0xf6, 0xf7, 0xf9, 0xf9, 0x1a, 0x13, 0xff, 0xfe, 0xfe, 0x0e, + 0x17, 0x17, 0x13, 0x15, 0x0e, 0xff, 0x04, 0x0b, 0x07, 0x12, 0x18, 0x06, + 0x07, 0x08, 0x08, 0x0d, 0x0e, 0x09, 0x11, 0x13, 0x08, 0x04, 0x08, 0x04, + 0x08, 0x09, 0xff, 0xf9, 0xf5, 0xe3, 0xe5, 0xf3, 0xef, 0xef, 0xf4, 0xf3, + 0xf8, 0xf6, 0xef, 0xf2, 0xed, 0xea, 0x03, 0x01, 0xf9, 0xfe, 0x05, 0xff, + 0xfc, 0x09, 0x0c, 0x07, 0x0b, 0x06, 0x04, 0x0f, 0x0a, 0x0e, 0x19, 0x1f, + 0x18, 0x0d, 0x0c, 0x0f, 0x13, 0x0e, 0x04, 0x00, 0xfc, 0x00, 0xfe, 0xfb, + 0xf9, 0x02, 0x05, 0xff, 0xff, 0x05, 0x01, 0xfd, 0x04, 0x02, 0x00, 0x06, + 0x05, 0x00, 0xfe, 0xf5, 0xf7, 0x05, 0x10, 0x08, 0x03, 0x08, 0x15, 0x12, + 0x04, 0x02, 0x03, 0x07, 0x0e, 0x10, 0x07, 0x06, 0x02, 0xfe, 0x04, 0x0e, + 0x02, 0xff, 0xfb, 0xf8, 0x04, 0x0e, 0x05, 0xff, 0xfe, 0xfe, 0xf8, 0xfe, + 0xf9, 0xf4, 0xf1, 0xf0, 0xe3, 0xe7, 0xf2, 0xf5, 0xee, 0xf6, 0xf7, 0xfe, + 0xff, 0xfc, 0x03, 0xf6, 0xf2, 0x13, 0x1f, 0x19, 0x10, 0x0a, 0x0e, 0x13, + 0x10, 0x0e, 0x0a, 0x08, 0x06, 0x06, 0x0e, 0x12, 0x0d, 0x09, 0x0d, 0x0e, + 0x0b, 0x0d, 0x0e, 0x13, 0x15, 0x12, 0x08, 0x01, 0x09, 0x07, 0x00, 0xf7, + 0xf6, 0xf8, 0xfc, 0xfe, 0xfb, 0xee, 0xee, 0xfc, 0xfe, 0xf6, 0xed, 0xed, + 0xe6, 0xe5, 0xe3, 0xde, 0xed, 0x0b, 0x13, 0x15, 0x0c, 0x0a, 0x10, 0x09, + 0x09, 0x06, 0x08, 0x0f, 0x16, 0x1d, 0x1c, 0x1b, 0x14, 0x12, 0x0f, 0x12, + 0x0f, 0x0e, 0x16, 0x13, 0x0e, 0x02, 0xf9, 0xfb, 0xfa, 0xf9, 0xfb, 0xfc, + 0xf6, 0xf0, 0xf4, 0xf5, 0xef, 0xe6, 0xe8, 0xeb, 0xf5, 0xf3, 0xf8, 0xfd, + 0x01, 0xfd, 0xf7, 0xf9, 0x14, 0x28, 0x1a, 0x0b, 0x09, 0x07, 0x08, 0x00, + 0x00, 0x0a, 0x0d, 0x0e, 0x0e, 0x0d, 0x16, 0x17, 0x09, 0x07, 0x0d, 0x18, + 0x12, 0x06, 0x02, 0x04, 0x07, 0xfe, 0xf5, 0xf6, 0xf3, 0xf9, 0xf8, 0xf9, + 0xf8, 0xf0, 0xee, 0xee, 0xf4, 0xf9, 0xf8, 0xf4, 0xf2, 0xf8, 0xf8, 0xf0, + 0xf8, 0xf8, 0xed, 0xf8, 0x19, 0x19, 0x1a, 0x19, 0x12, 0x15, 0x13, 0x11, + 0x15, 0x18, 0x0a, 0x05, 0x06, 0x03, 0x1c, 0x1e, 0x0d, 0x0c, 0x0d, 0x15, + 0x16, 0x0e, 0x07, 0x0c, 0x0b, 0x05, 0x0a, 0x09, 0x06, 0x07, 0xfc, 0xf4, + 0xf4, 0xfc, 0xff, 0xf7, 0xee, 0xe8, 0xe3, 0xe5, 0xe7, 0xf4, 0xe5, 0xe2, + 0xe2, 0xde, 0xe3, 0xfc, 0x19, 0x0a, 0x02, 0x05, 0x05, 0x06, 0xfd, 0x00, + 0x04, 0x07, 0x09, 0x19, 0x1b, 0x1b, 0x32, 0x32, 0x25, 0x23, 0x21, 0x1c, + 0x0d, 0x0a, 0x02, 0x05, 0xfe, 0xfb, 0xfe, 0xfd, 0x01, 0x08, 0x06, 0xfe, + 0xf5, 0xf2, 0xf2, 0xf7, 0xf2, 0xed, 0xef, 0xf2, 0xf6, 0xf5, 0xf5, 0xf3, + 0xe8, 0xe7, 0xf2, 0x20, 0x23, 0x11, 0x07, 0x01, 0x0b, 0x14, 0x0d, 0x06, + 0x0b, 0x0a, 0x03, 0xfe, 0xf8, 0xfa, 0x15, 0x1e, 0x15, 0x10, 0x12, 0x0a, + 0x0b, 0x0e, 0x08, 0x04, 0xfc, 0xfc, 0x03, 0xfc, 0xf1, 0xea, 0xeb, 0xe7, + 0xef, 0xf2, 0xf7, 0x02, 0xff, 0x00, 0x03, 0xf9, 0xfc, 0xfc, 0xf9, 0xef, + 0xf0, 0xf1, 0x01, 0x1f, 0x15, 0x11, 0x0f, 0x0c, 0x13, 0x17, 0x10, 0x0f, + 0x0e, 0x10, 0x0d, 0x00, 0x02, 0x01, 0x11, 0x15, 0x0f, 0x19, 0x21, 0x10, + 0x01, 0xfd, 0x07, 0x0c, 0x10, 0x0c, 0x02, 0x01, 0x06, 0x08, 0xff, 0xf8, + 0xfb, 0x00, 0xfc, 0xf7, 0xf5, 0xf1, 0xe4, 0xde, 0xe5, 0xe4, 0xe3, 0xe3, + 0xea, 0xf1, 0x11, 0x0e, 0xff, 0xfa, 0xfc, 0x03, 0x07, 0x05, 0x04, 0x05, + 0x00, 0x05, 0x10, 0x0e, 0x0b, 0x0c, 0x1c, 0x1a, 0x10, 0x1a, 0x1d, 0x11, + 0x0f, 0x09, 0x00, 0xfb, 0xfc, 0x00, 0x0b, 0x0a, 0x04, 0x01, 0x00, 0xfc, + 0x02, 0xff, 0xf8, 0xfd, 0x02, 0xfa, 0xff, 0x07, 0xf7, 0xf1, 0xf3, 0xf7, + 0xfe, 0x0a, 0x21, 0x14, 0x10, 0x0b, 0x01, 0x07, 0x11, 0x12, 0x12, 0x10, + 0x08, 0x02, 0x00, 0xff, 0xfb, 0xff, 0x0e, 0x0a, 0x06, 0x05, 0xfc, 0xfb, + 0xfa, 0xf8, 0xf7, 0xf8, 0xf6, 0xf2, 0xf2, 0xf3, 0xf5, 0xf1, 0xec, 0xe6, + 0xea, 0xff, 0x17, 0x12, 0x01, 0xfa, 0xfa, 0xfa, 0xfd, 0xf8, 0xf1, 0xf9, + 0xff, 0x20, 0x27, 0x1d, 0x17, 0x1c, 0x14, 0x0e, 0x14, 0x12, 0x0f, 0x07, + 0x06, 0x0b, 0x0b, 0x06, 0x04, 0x08, 0x19, 0x1b, 0x1f, 0x13, 0x0d, 0x10, + 0x0b, 0x04, 0x01, 0x06, 0x06, 0x04, 0x01, 0xfd, 0xf4, 0xf0, 0xf7, 0xf7, + 0xf2, 0xf3, 0xf0, 0xee, 0xec, 0xe8, 0xe2, 0xdc, 0xda, 0xd7, 0xe7, 0xf8, + 0x05, 0x07, 0xfa, 0x00, 0x00, 0x04, 0x00, 0x04, 0x11, 0x0f, 0x05, 0x0e, + 0x27, 0x28, 0x21, 0x18, 0x0e, 0x11, 0x1e, 0x1f, 0x16, 0x0c, 0x0b, 0x0b, + 0x0e, 0x09, 0x04, 0x02, 0xff, 0x07, 0x0c, 0x04, 0xf9, 0xf7, 0xf7, 0xf7, + 0xfa, 0xef, 0xe7, 0xe6, 0xe7, 0xe8, 0xe3, 0xe7, 0xed, 0xe6, 0xe2, 0xf1, + 0x10, 0x08, 0x09, 0x0f, 0x09, 0x07, 0x0a, 0x2e, 0x33, 0x1f, 0x17, 0x1a, + 0x13, 0x0d, 0x0a, 0x0a, 0x06, 0x13, 0x23, 0x1c, 0x1a, 0x1a, 0x16, 0x0e, + 0x0c, 0x07, 0xff, 0xf7, 0xf6, 0xf9, 0xfd, 0xf5, 0xeb, 0xe9, 0xf0, 0x07, + 0x06, 0xf1, 0xf3, 0xf8, 0xf1, 0xea, 0xe6, 0xe5, 0xdf, 0xe4, 0xe8, 0x07, + 0x0d, 0x01, 0xf8, 0xfa, 0x00, 0x03, 0x01, 0x09, 0x14, 0x0f, 0x0a, 0x05, + 0xff, 0xfc, 0xfe, 0x19, 0x1b, 0x20, 0x2b, 0x23, 0x15, 0x10, 0x12, 0x17, + 0x08, 0x00, 0x04, 0x03, 0x06, 0x16, 0x15, 0x05, 0xfc, 0xfe, 0x02, 0xfc, + 0xf9, 0xee, 0xef, 0xef, 0xf2, 0xe9, 0xe6, 0xe4, 0xdf, 0xdf, 0xfc, 0x19, + 0x06, 0xfd, 0xfd, 0xfa, 0xfd, 0x06, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x10, + 0x10, 0x12, 0x13, 0x0d, 0x0e, 0x1d, 0x23, 0x1d, 0x10, 0x07, 0x03, 0x15, + 0x21, 0x09, 0xf9, 0xfa, 0xff, 0xfb, 0xfb, 0xff, 0xf9, 0xfe, 0xfb, 0xf3, + 0xf0, 0xf4, 0x04, 0x01, 0xf8, 0xf5, 0xf6, 0xef, 0xea, 0xf1, 0x0e, 0x06, + 0xff, 0x03, 0x0a, 0x08, 0x0b, 0x0f, 0x0e, 0x13, 0x17, 0x11, 0x0a, 0x02, + 0xfb, 0xf9, 0xfa, 0xf9, 0xfa, 0x08, 0x02, 0xfc, 0x01, 0xfe, 0xf8, 0xf3, + 0xf5, 0xf6, 0xed, 0xea, 0xea, 0xe9, 0xea, 0xfc, 0x1b, 0x20, 0x1c, 0x0e, + 0x03, 0x02, 0x04, 0x09, 0xfb, 0xfa, 0xff, 0xfb, 0xff, 0x1b, 0x24, 0x28, + 0x1d, 0x16, 0x10, 0x11, 0x16, 0x27, 0x24, 0x27, 0x24, 0x19, 0x11, 0x09, + 0x03, 0xfc, 0xeb, 0xea, 0xfa, 0x11, 0x09, 0x09, 0x0a, 0x06, 0x03, 0xfd, + 0xfc, 0xfd, 0xf9, 0xf1, 0xef, 0xee, 0xea, 0xf0, 0xf1, 0xeb, 0xe9, 0xe4, + 0xdf, 0xde, 0xde, 0xe5, 0xfe, 0xfd, 0xf5, 0xf0, 0x03, 0x06, 0xfc, 0xfd, + 0xf9, 0xf4, 0xf0, 0xeb, 0xf6, 0x10, 0x11, 0x27, 0x32, 0x22, 0x17, 0x15, + 0x15, 0x12, 0x12, 0x16, 0x26, 0x17, 0x0d, 0x18, 0x1c, 0x18, 0x11, 0x10, + 0x09, 0xfd, 0x03, 0x06, 0x0a, 0x06, 0x08, 0x0a, 0x03, 0x02, 0x01, 0xf9, + 0xf6, 0xf7, 0xf6, 0xf0, 0xf4, 0xf6, 0xf4, 0x03, 0x13, 0x06, 0xf7, 0xf8, + 0x22, 0x1a, 0xfe, 0xf4, 0xfc, 0x0b, 0x03, 0x0e, 0x0d, 0x04, 0x05, 0x04, + 0xfb, 0xf7, 0xf5, 0x0d, 0x1f, 0x08, 0x01, 0x02, 0x06, 0xff, 0xfe, 0x01, + 0xf9, 0xf0, 0xe8, 0xe9, 0xea, 0xf5, 0x01, 0x03, 0xfe, 0xf9, 0xf2, 0xf6, + 0xf9, 0xf4, 0xf6, 0xf2, 0xe8, 0xe6, 0xf3, 0x0e, 0x08, 0x02, 0xf9, 0xfb, + 0xfc, 0xfb, 0xfe, 0xfc, 0x04, 0x0f, 0x0d, 0x15, 0x2a, 0x34, 0x2b, 0x20, + 0x15, 0x10, 0x14, 0x2a, 0x21, 0x11, 0x0f, 0x13, 0x1a, 0x18, 0x18, 0x1b, + 0x27, 0x1e, 0x14, 0x0d, 0x0b, 0x08, 0x04, 0xff, 0x03, 0x03, 0xf6, 0xea, + 0xe6, 0xe8, 0xd8, 0xcc, 0xd1, 0xd7, 0xef, 0xeb, 0xf6, 0xf4, 0xf0, 0xf0, + 0xeb, 0xe3, 0xe2, 0xea, 0xf3, 0x09, 0x16, 0x11, 0x0a, 0x09, 0x08, 0x07, + 0x03, 0xfc, 0x13, 0x18, 0x1e, 0x22, 0x1a, 0x1d, 0x1c, 0x17, 0x10, 0x0c, + 0x0b, 0x02, 0xfc, 0xfb, 0x02, 0x01, 0xfa, 0xfb, 0x0a, 0x06, 0xfb, 0xf8, + 0xf6, 0xed, 0xeb, 0xee, 0xf9, 0x16, 0x0d, 0x03, 0xfe, 0x02, 0x13, 0x0d, + 0x06, 0xfc, 0xfb, 0xfd, 0x03, 0x1b, 0x1e, 0x1b, 0x12, 0x0e, 0x0b, 0x05, + 0x04, 0x10, 0x1e, 0x0b, 0x05, 0xff, 0xff, 0x06, 0x06, 0x03, 0xfb, 0xf0, + 0x03, 0x0a, 0xf1, 0xf2, 0xfd, 0xfd, 0xf6, 0xfa, 0xfd, 0xf4, 0xef, 0xf0, + 0xef, 0xed, 0xee, 0xf2, 0x12, 0x1c, 0x09, 0x04, 0xfe, 0x01, 0xff, 0xff, + 0xff, 0xfd, 0x00, 0xfb, 0x04, 0x11, 0x17, 0x1e, 0x1c, 0x14, 0x0b, 0x03, + 0x05, 0x1c, 0x16, 0x0d, 0x05, 0xfe, 0xf9, 0x03, 0x0a, 0x0b, 0x08, 0x01, + 0xfa, 0xf5, 0xf5, 0xfb, 0xf6, 0xf0, 0xee, 0xf6, 0x08, 0x0c, 0x03, 0xfa, + 0xf5, 0xf3, 0xf0, 0x06, 0x10, 0x07, 0xfe, 0xfb, 0xfb, 0xfb, 0xf7, 0xfa, + 0x00, 0x11, 0x12, 0x13, 0x1b, 0x1d, 0x1f, 0x19, 0x15, 0x17, 0x15, 0x0c, + 0x14, 0x15, 0xfa, 0xfa, 0x06, 0x01, 0xf7, 0x00, 0x04, 0x03, 0x08, 0x06, + 0xfc, 0xf5, 0xf6, 0xf7, 0xf8, 0xf2, 0xf1, 0xfa, 0xf3, 0xf1, 0xee, 0xea, + 0xea, 0xeb, 0xfb, 0x03, 0x15, 0x19, 0x0f, 0x10, 0x16, 0x0d, 0x04, 0xfe, + 0x05, 0x08, 0xfb, 0xfc, 0x0d, 0x09, 0x10, 0x09, 0x07, 0x0f, 0x0b, 0x10, + 0x10, 0xfe, 0xf9, 0xf6, 0xf9, 0xfc, 0xff, 0x04, 0xfd, 0xf7, 0xf0, 0xec, + 0xfd, 0x13, 0x0c, 0x02, 0xff, 0xfc, 0xfe, 0x00, 0x01, 0xf7, 0xf7, 0xf3, + 0xfe, 0x18, 0x12, 0x0f, 0x0c, 0x07, 0x0a, 0x0b, 0x08, 0x00, 0x02, 0x00, + 0x12, 0x15, 0xfe, 0x03, 0x0d, 0x11, 0x15, 0x08, 0x0c, 0x0e, 0x15, 0x1d, + 0x0b, 0x07, 0x01, 0x00, 0x04, 0x0c, 0x13, 0x1a, 0x0d, 0x02, 0xfc, 0xf7, + 0xf6, 0xfe, 0xfe, 0xf5, 0xf2, 0xee, 0xea, 0xef, 0xf4, 0xf9, 0xf1, 0xe7, + 0xfb, 0xfd, 0xf8, 0xf3, 0xf6, 0xf9, 0xf3, 0xee, 0xe6, 0xe4, 0xe7, 0xf8, + 0xfc, 0xfa, 0xf9, 0x05, 0x02, 0x08, 0x0f, 0x0c, 0x1d, 0x2b, 0x30, 0x22, + 0x1c, 0x17, 0x11, 0x0e, 0x0d, 0x12, 0x1b, 0x1b, 0x12, 0x0c, 0x06, 0x04, + 0x0b, 0x1b, 0x17, 0x10, 0x09, 0x06, 0xff, 0x00, 0xfc, 0xfe, 0xfe, 0x0e, + 0x07, 0xf5, 0xe7, 0xe5, 0xf5, 0x07, 0x02, 0xf6, 0xef, 0xf0, 0xf3, 0xf1, + 0xf2, 0xf7, 0x02, 0xfd, 0xfc, 0x05, 0x05, 0xff, 0x05, 0x10, 0x06, 0xfe, + 0xfd, 0xf8, 0xf5, 0xf7, 0x0b, 0x12, 0x14, 0x08, 0x02, 0x06, 0x0d, 0x05, + 0x02, 0x06, 0x07, 0x07, 0x02, 0xfa, 0xfa, 0xf4, 0xec, 0xfd, 0x1a, 0x18, + 0x08, 0x04, 0x01, 0xfc, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0xff, 0xf8, + 0xf5, 0x02, 0x10, 0x07, 0x04, 0x0c, 0x0c, 0x10, 0x19, 0x18, 0x1b, 0x15, + 0x10, 0x0d, 0x0a, 0x0c, 0x13, 0x1a, 0x16, 0x0b, 0x03, 0xff, 0xfc, 0xf7, + 0x10, 0x09, 0xf8, 0xf5, 0xf6, 0xf4, 0xf5, 0xf0, 0xed, 0xfc, 0xfd, 0xfb, + 0xf6, 0xf3, 0xee, 0xf6, 0xf8, 0x00, 0xfc, 0xf4, 0xfd, 0x03, 0x00, 0xf8, + 0xf8, 0x05, 0x00, 0xfa, 0x05, 0x07, 0x06, 0x12, 0x0e, 0x18, 0x1a, 0x13, + 0x0f, 0x09, 0x05, 0x01, 0x06, 0x09, 0x0b, 0x07, 0xfd, 0xf5, 0xf4, 0xf8, + 0xfc, 0xfe, 0xfe, 0xfb, 0xf4, 0xf4, 0xf2, 0xfb, 0x21, 0x1f, 0x15, 0x09, + 0x06, 0x04, 0x0a, 0x0e, 0x0a, 0x05, 0x01, 0x02, 0x0b, 0x0b, 0x06, 0x02, + 0x0d, 0x19, 0x15, 0x10, 0x11, 0x10, 0x1d, 0x15, 0x0f, 0x10, 0x03, 0xf9, + 0xfb, 0xed, 0xdf, 0xec, 0xf6, 0xf4, 0xfe, 0xff, 0xf7, 0xef, 0xef, 0xee, + 0xec, 0xeb, 0xf3, 0x00, 0xf9, 0xef, 0xeb, 0x01, 0x0a, 0x08, 0x05, 0xfe, + 0xfd, 0xfc, 0xfb, 0x04, 0x15, 0x0b, 0x09, 0x0d, 0x0c, 0x0b, 0x05, 0x09, + 0x0d, 0x0a, 0x06, 0x0f, 0x1c, 0x24, 0x1c, 0x14, 0x16, 0x15, 0x10, 0x0c, + 0x0e, 0x0c, 0x07, 0x0a, 0x08, 0x04, 0xfd, 0xf5, 0xf8, 0xf9, 0xf8, 0xf9, + 0xfa, 0xf3, 0xfa, 0xf8, 0xf1, 0xee, 0x01, 0x04, 0xfa, 0xf5, 0xf3, 0xfb, + 0xf9, 0xf9, 0xfb, 0xfe, 0xfd, 0x05, 0x0d, 0x07, 0x01, 0xfd, 0xfa, 0x06, + 0x0d, 0xfd, 0xfc, 0x17, 0x19, 0x0a, 0x0b, 0x19, 0x1c, 0x13, 0x0a, 0x08, + 0x04, 0x02, 0x09, 0x0e, 0x16, 0x0f, 0x07, 0x02, 0xfe, 0xfd, 0xf9, 0xfc, + 0x01, 0x01, 0xfd, 0xf1, 0xf1, 0x05, 0x09, 0x02, 0xff, 0xfa, 0x04, 0x08, + 0xff, 0xfd, 0xfe, 0xfd, 0xf8, 0xfa, 0xfa, 0x00, 0xfe, 0xf8, 0xfc, 0xf9, + 0xf6, 0xf7, 0x10, 0x13, 0x01, 0xfd, 0x01, 0x10, 0x19, 0x0f, 0x05, 0x01, + 0x07, 0x00, 0xff, 0x06, 0x09, 0x03, 0x04, 0x05, 0x01, 0xff, 0xfc, 0x07, + 0x19, 0x13, 0x0e, 0x06, 0x12, 0x1b, 0x14, 0x11, 0x0c, 0x04, 0xfc, 0xf8, + 0xf6, 0xeb, 0xeb, 0xf7, 0xfc, 0xf9, 0xf8, 0xfe, 0x01, 0x04, 0xf9, 0xf4, + 0xfb, 0x06, 0x0d, 0x07, 0x06, 0x07, 0x0c, 0x0d, 0x0d, 0x08, 0x08, 0x0a, + 0x03, 0x00, 0xfc, 0xfc, 0x0b, 0x06, 0x03, 0x01, 0x02, 0x02, 0xfb, 0xfb, + 0x03, 0xfe, 0xf9, 0x08, 0x0e, 0x06, 0x02, 0x0a, 0x08, 0xfc, 0xf2, 0xef, + 0xf2, 0xf6, 0x04, 0x07, 0xff, 0xfc, 0xfb, 0x00, 0x01, 0xf8, 0xf2, 0xfe, + 0x09, 0x13, 0x11, 0x09, 0x06, 0x0b, 0x14, 0x11, 0x0d, 0x08, 0x08, 0x06, + 0x08, 0x0f, 0x09, 0x06, 0x08, 0x04, 0x04, 0x06, 0xfd, 0xf3, 0xf1, 0x02, + 0x18, 0x01, 0x00, 0x0d, 0x09, 0x09, 0x09, 0x08, 0x03, 0x02, 0xff, 0xfa, + 0xf8, 0xfb, 0x06, 0x0a, 0x06, 0x08, 0x0b, 0x0c, 0x04, 0x03, 0x07, 0x03, + 0x0a, 0x0c, 0x02, 0xfb, 0xfc, 0xff, 0xfa, 0xfb, 0xfe, 0xfd, 0xfc, 0xfa, + 0xfd, 0x00, 0xfb, 0xf7, 0xf9, 0xfa, 0xf8, 0xf4, 0xed, 0xec, 0xed, 0xee, + 0xf2, 0xfd, 0x10, 0x0d, 0x07, 0x03, 0xfd, 0xfd, 0x0d, 0x0d, 0x08, 0xfd, + 0x05, 0x0b, 0x0c, 0x0b, 0x04, 0x08, 0x0d, 0x10, 0x18, 0x1a, 0x20, 0x21, + 0x27, 0x20, 0x1a, 0x1b, 0x24, 0x21, 0x1c, 0x11, 0x0a, 0x0d, 0x07, 0x07, + 0x01, 0xec, 0xe0, 0xec, 0xf6, 0xf9, 0xfc, 0xfc, 0xf3, 0xec, 0xef, 0xea, + 0xee, 0xfe, 0xf9, 0xf6, 0xf3, 0xf4, 0xf2, 0xe6, 0xea, 0xed, 0xe6, 0xf2, + 0x06, 0x00, 0xf5, 0xf5, 0x0c, 0x13, 0x0a, 0x10, 0x0b, 0x03, 0x02, 0x08, + 0x12, 0x11, 0x0e, 0x14, 0x1c, 0x1f, 0x22, 0x1c, 0x0f, 0x09, 0x07, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0xff, 0xfb, 0xf5, 0xf1, 0xef, 0xf4, + 0x0f, 0x17, 0x16, 0x10, 0x0b, 0x03, 0xfa, 0xf9, 0xf9, 0xf8, 0xf8, 0xfe, + 0x04, 0x04, 0x09, 0x08, 0x09, 0x0d, 0x0f, 0x08, 0x05, 0x01, 0xfe, 0x0a, + 0x14, 0x0f, 0xfe, 0x01, 0xff, 0xfd, 0xff, 0x03, 0x02, 0x02, 0x03, 0x08, + 0x00, 0x06, 0x03, 0xfe, 0xfd, 0xfa, 0xf5, 0xef, 0xed, 0xf0, 0xef, 0xfe, + 0x17, 0x0d, 0x06, 0x05, 0x03, 0xfc, 0xf3, 0xef, 0xf2, 0xfa, 0xff, 0xff, + 0x00, 0x00, 0x05, 0x03, 0x0d, 0x10, 0x05, 0x00, 0x01, 0x04, 0x16, 0x14, + 0x10, 0x0f, 0x0e, 0x11, 0x0e, 0x0b, 0x05, 0x02, 0x0b, 0x16, 0x0e, 0x05, + 0x00, 0xff, 0xfc, 0x00, 0x02, 0x02, 0xff, 0xfd, 0x05, 0x05, 0x05, 0x18, + 0x18, 0x0d, 0x02, 0x03, 0x02, 0xfc, 0xf0, 0xed, 0xf5, 0xfd, 0x05, 0x06, + 0x09, 0x02, 0xf2, 0xfa, 0xfc, 0xff, 0x00, 0x02, 0x01, 0x05, 0x0b, 0x00, + 0xf9, 0xfe, 0x03, 0x01, 0xff, 0xff, 0x09, 0x08, 0xfd, 0xf6, 0xf9, 0xfc, + 0xfb, 0xf7, 0xf7, 0xf8, 0xfd, 0x07, 0x06, 0x00, 0xfc, 0xfc, 0x0e, 0x15, + 0x10, 0x08, 0x0a, 0x10, 0x18, 0x0f, 0x02, 0xff, 0x02, 0x01, 0x01, 0x07, + 0x0d, 0x0e, 0x19, 0x11, 0x0b, 0x05, 0x04, 0x01, 0x02, 0x0a, 0x03, 0xfd, + 0xff, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x00, 0x02, 0x03, 0xfd, 0xfa, + 0xf8, 0xf4, 0xfd, 0x01, 0xfb, 0xef, 0xec, 0xf4, 0xf4, 0xfc, 0x04, 0x03, + 0x0d, 0x19, 0x10, 0x02, 0xf9, 0xf4, 0xf5, 0xf6, 0xf7, 0xfb, 0x05, 0x11, + 0x24, 0x1f, 0x17, 0x0f, 0x0b, 0x09, 0x09, 0x09, 0x17, 0x12, 0x0c, 0x14, + 0x11, 0x0b, 0x08, 0x0c, 0x0d, 0x08, 0x01, 0x00, 0x06, 0x00, 0xf9, 0xf9, + 0xf9, 0xf8, 0xfa, 0xf5, 0xf0, 0xe6, 0xe0, 0xe2, 0xeb, 0xfa, 0xf9, 0x05, + 0x02, 0x00, 0xff, 0xfb, 0xf4, 0xf1, 0xef, 0xf1, 0xfd, 0x0c, 0x15, 0x13, + 0x11, 0x0b, 0x07, 0x05, 0x06, 0x09, 0x09, 0x1c, 0x28, 0x23, 0x1c, 0x1d, + 0x1d, 0x15, 0x11, 0x16, 0x0f, 0x07, 0x01, 0x06, 0x08, 0x04, 0x01, 0x05, + 0x01, 0x04, 0xff, 0xf7, 0xf0, 0xed, 0xf1, 0xf6, 0x06, 0x08, 0x06, 0x06, + 0x01, 0xf9, 0xf3, 0xee, 0xef, 0xec, 0xf3, 0xff, 0xfe, 0x01, 0x01, 0x02, + 0x09, 0x03, 0xfd, 0xfc, 0xfc, 0xfb, 0x13, 0x1a, 0x0c, 0x07, 0x04, 0x00, + 0xfc, 0xfe, 0x02, 0x0c, 0x08, 0x08, 0x0f, 0x14, 0x0b, 0x06, 0x02, 0xfc, + 0xfd, 0xfb, 0xfd, 0xfb, 0xfa, 0xf6, 0xee, 0xf8, 0x03, 0x03, 0x0f, 0x0a, + 0x06, 0x02, 0xfe, 0xfb, 0xfa, 0xff, 0x02, 0xff, 0x04, 0x0f, 0x0a, 0x06, + 0x08, 0x09, 0x0f, 0x18, 0x12, 0x12, 0x1c, 0x19, 0x16, 0x0f, 0x0d, 0x0c, + 0x0b, 0x0a, 0x18, 0x10, 0x04, 0xff, 0xfc, 0xfe, 0xfa, 0xf8, 0xfc, 0x06, + 0x06, 0xf9, 0xf6, 0xf5, 0xf1, 0xeb, 0xec, 0xf9, 0xf6, 0xf8, 0xf6, 0xf7, + 0xfb, 0xf9, 0xf6, 0xf7, 0xfc, 0x02, 0x05, 0xfd, 0x03, 0x02, 0xff, 0xfe, + 0xff, 0x05, 0x02, 0xfc, 0xfa, 0x05, 0x07, 0x06, 0x03, 0x08, 0x11, 0x1a, + 0x12, 0x0a, 0x05, 0x09, 0x0b, 0x04, 0x02, 0xfe, 0xf9, 0xf7, 0xfe, 0x0b, + 0x09, 0x02, 0x00, 0xfd, 0xf9, 0xfa, 0x09, 0x1a, 0x1b, 0x1d, 0x18, 0x16, + 0x19, 0x15, 0x0f, 0x0b, 0x04, 0xfb, 0xfa, 0x08, 0x0e, 0x0d, 0x0c, 0x05, + 0x0c, 0x14, 0x0f, 0x04, 0x05, 0x00, 0xff, 0xfd, 0xfa, 0xfe, 0xfc, 0xfb, + 0xf8, 0xf2, 0xf1, 0xf1, 0xf3, 0xf8, 0xfa, 0x04, 0xfd, 0xf7, 0xf1, 0xf2, + 0xf3, 0xee, 0xe6, 0xe2, 0xe1, 0xe5, 0xf9, 0x0b, 0x12, 0x0f, 0x08, 0x02, + 0x07, 0x06, 0xfe, 0x06, 0x07, 0x01, 0x08, 0x10, 0x0e, 0x0c, 0x0b, 0x0c, + 0x10, 0x14, 0x19, 0x26, 0x25, 0x20, 0x23, 0x1c, 0x18, 0x12, 0x0e, 0x09, + 0x07, 0x04, 0x02, 0x06, 0x00, 0xfb, 0xfc, 0xfc, 0x00, 0x00, 0xfe, 0xfa, + 0xf7, 0xf1, 0xf0, 0xf8, 0xf0, 0xee, 0xf2, 0xf7, 0xff, 0x00, 0xfe, 0xfe, + 0x02, 0xfd, 0xfa, 0xfc, 0x01, 0x00, 0x07, 0x05, 0x00, 0xfd, 0xff, 0x06, + 0x08, 0x09, 0x11, 0x0f, 0x0d, 0x0d, 0x14, 0x0e, 0x0b, 0x07, 0x00, 0x01, + 0x03, 0x04, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0xfe, 0xfd, 0xfa, 0xfa, 0xf9, + 0xf1, 0xec, 0xeb, 0xeb, 0xf3, 0x02, 0x02, 0x05, 0x03, 0x02, 0x0c, 0x15, + 0x11, 0x09, 0x02, 0xfc, 0xfc, 0x0b, 0x0b, 0x02, 0xf8, 0xf9, 0xf8, 0xf8, + 0x0b, 0x23, 0x1b, 0x11, 0x0a, 0x0b, 0x0b, 0x10, 0x13, 0x12, 0x0e, 0x0b, + 0x08, 0x09, 0x09, 0x0e, 0x12, 0x01, 0xfd, 0x00, 0x00, 0xfc, 0x02, 0x02, + 0xf7, 0xf2, 0xf2, 0xf2, 0xfd, 0x00, 0xfa, 0x03, 0x00, 0xfe, 0x00, 0xff, + 0xfa, 0xef, 0xf0, 0xf1, 0xfb, 0xff, 0x00, 0x05, 0x00, 0x01, 0xfb, 0xff, + 0x1b, 0x1f, 0x18, 0x16, 0x0e, 0x0c, 0x0d, 0x06, 0x06, 0x0f, 0x0e, 0x09, + 0x02, 0x04, 0x02, 0x03, 0x08, 0x09, 0x07, 0x01, 0xfa, 0xf9, 0xf6, 0xf0, + 0xee, 0xec, 0xea, 0xec, 0xfc, 0x03, 0x12, 0x16, 0x0a, 0x04, 0x00, 0xfc, + 0xfa, 0xf8, 0xfb, 0x09, 0x0b, 0x01, 0xfe, 0xfd, 0xfe, 0xf9, 0xff, 0x13, + 0x1b, 0x1b, 0x1f, 0x29, 0x1f, 0x15, 0x0f, 0x06, 0x01, 0x08, 0x0c, 0x09, + 0x08, 0x02, 0x01, 0xff, 0xff, 0x07, 0x04, 0xf8, 0xfc, 0xfd, 0xf9, 0xfa, + 0xf7, 0xf4, 0xf4, 0xf7, 0x06, 0x0b, 0x0c, 0x05, 0x00, 0x03, 0xff, 0xfd, + 0xff, 0xfe, 0x06, 0x12, 0x0a, 0x03, 0xff, 0xfd, 0xfb, 0xfe, 0x0c, 0x09, + 0x07, 0x07, 0xfe, 0xfd, 0x02, 0x02, 0xfc, 0xfb, 0xfb, 0x00, 0x05, 0x08, + 0x05, 0x05, 0x04, 0x03, 0x01, 0x03, 0xfd, 0xf3, 0xec, 0xe7, 0xe5, 0xe3, + 0xe2, 0xed, 0xf9, 0x0d, 0x1e, 0x19, 0x0b, 0x06, 0x13, 0x15, 0x0e, 0x0b, + 0x08, 0x05, 0x0e, 0x11, 0x0b, 0x05, 0x06, 0x06, 0x0e, 0x24, 0x28, 0x28, + 0x2a, 0x26, 0x1e, 0x1a, 0x18, 0x14, 0x10, 0x06, 0xff, 0x02, 0xfd, 0xfb, + 0xf9, 0xf3, 0xf2, 0xf6, 0xf7, 0xf2, 0xf9, 0xfb, 0xec, 0xe8, 0xe4, 0xe0, + 0xe1, 0xe1, 0xe6, 0x00, 0x00, 0xfa, 0xf4, 0xf2, 0xf3, 0xef, 0xf3, 0xfe, + 0xfe, 0x04, 0x0c, 0x05, 0x00, 0x08, 0x0b, 0x0c, 0x15, 0x0d, 0x07, 0x0e, + 0x14, 0x11, 0x10, 0x17, 0x16, 0x18, 0x1b, 0x17, 0x11, 0x0d, 0x09, 0x05, + 0xff, 0x05, 0x06, 0x03, 0x02, 0xfe, 0xf9, 0xf3, 0xf6, 0xf9, 0xf3, 0xf2, + 0xf9, 0xfd, 0x16, 0x28, 0x1b, 0x12, 0x0c, 0x06, 0xff, 0xfd, 0xff, 0xff, + 0xfe, 0x07, 0x06, 0xff, 0xfe, 0x01, 0x03, 0x16, 0x15, 0x08, 0x01, 0x03, + 0x02, 0x07, 0x09, 0x05, 0x02, 0x01, 0xfd, 0xfc, 0xf9, 0xf5, 0xf9, 0xfc, + 0xff, 0x08, 0x0a, 0x08, 0x00, 0xfa, 0xf4, 0xeb, 0xe4, 0xe7, 0xf0, 0xed, + 0xee, 0xfb, 0x04, 0x06, 0x03, 0x00, 0xff, 0xfd, 0xfc, 0xfc, 0x04, 0x0d, + 0x09, 0x0a, 0x05, 0x05, 0x05, 0x08, 0x18, 0x17, 0x0e, 0x0c, 0x0d, 0x10, + 0x0d, 0x0f, 0x12, 0x12, 0x1b, 0x1d, 0x12, 0x0e, 0x0b, 0x0b, 0x11, 0x0e, + 0x0d, 0x07, 0x04, 0x02, 0xfd, 0xf8, 0xf7, 0xf4, 0xf0, 0xf2, 0xfa, 0xfc, + 0x07, 0x05, 0x08, 0x03, 0xfc, 0xfe, 0xfe, 0xfd, 0xfc, 0xf4, 0xf3, 0xf3, + 0xf5, 0xfa, 0xf5, 0xf0, 0xf0, 0x03, 0x14, 0x11, 0x0a, 0x08, 0x0c, 0x09, + 0x07, 0x0d, 0x09, 0x06, 0x05, 0x07, 0x06, 0x04, 0x02, 0xff, 0xfb, 0xfa, + 0xfc, 0x05, 0x05, 0xfe, 0xf9, 0xf9, 0xfb, 0x02, 0xfe, 0xf9, 0xfe, 0x07, + 0x01, 0xff, 0x0a, 0x0a, 0x0b, 0x11, 0x11, 0x06, 0x03, 0x0c, 0x07, 0x00, + 0x03, 0x05, 0x03, 0xfe, 0x0a, 0x13, 0x0d, 0x0a, 0x04, 0x04, 0x05, 0x01, + 0x04, 0x06, 0x14, 0x16, 0x12, 0x0e, 0x0f, 0x0d, 0x06, 0x00, 0xf8, 0xf9, + 0xfe, 0x01, 0xfe, 0xf5, 0xf6, 0xf3, 0xf1, 0xf6, 0xf4, 0xfc, 0x08, 0x02, + 0xf2, 0xee, 0xfb, 0x02, 0x03, 0xfd, 0xf8, 0xf9, 0xfb, 0xfa, 0xfb, 0xfb, + 0x03, 0x0c, 0x0f, 0x15, 0x1a, 0x18, 0x13, 0x12, 0x10, 0x10, 0x0d, 0x0d, + 0x0e, 0x0f, 0x10, 0x10, 0x0d, 0x0a, 0x0b, 0x07, 0x04, 0x03, 0x0c, 0x0f, + 0x08, 0xff, 0xf6, 0xf3, 0xf4, 0xf5, 0xec, 0xe1, 0xea, 0xf2, 0xf9, 0xf4, + 0xf1, 0xf7, 0xfa, 0xf6, 0xf8, 0xf6, 0xf8, 0x03, 0x03, 0x00, 0xf8, 0xfe, + 0x0f, 0x0c, 0x0d, 0x15, 0x0c, 0x0e, 0x16, 0x11, 0x13, 0x25, 0x21, 0x14, + 0x14, 0x17, 0x17, 0x16, 0x0d, 0x0b, 0x0d, 0x0c, 0x0a, 0x06, 0x06, 0x02, + 0xf3, 0xe8, 0xea, 0xed, 0xec, 0xeb, 0xf9, 0x07, 0x04, 0x08, 0x03, 0xfb, + 0xf6, 0x05, 0x03, 0xff, 0xfa, 0xfa, 0x00, 0x05, 0x06, 0xff, 0xf8, 0xf8, + 0xf8, 0xfd, 0x0c, 0x0a, 0x0c, 0x0a, 0x07, 0x06, 0x08, 0x08, 0x0b, 0x08, + 0x02, 0x02, 0x06, 0x03, 0x07, 0x10, 0x09, 0x04, 0x00, 0xff, 0xfd, 0xff, + 0xfe, 0xf5, 0xf4, 0xf6, 0xf6, 0xfc, 0x01, 0x04, 0x03, 0xfd, 0xf6, 0xf4, + 0xf7, 0x01, 0x0a, 0x10, 0x09, 0x0b, 0x10, 0x0f, 0x07, 0x08, 0x08, 0x01, + 0x02, 0x13, 0x14, 0x0f, 0x0f, 0x0e, 0x0f, 0x17, 0x15, 0x15, 0x14, 0x10, + 0x07, 0x07, 0x04, 0x06, 0x04, 0x03, 0x04, 0x02, 0xfb, 0xfa, 0xfb, 0xf9, + 0xf7, 0xfc, 0xfc, 0xf6, 0xfb, 0xfb, 0xf7, 0xfa, 0xf6, 0xf0, 0xed, 0xeb, + 0xee, 0xf4, 0xf9, 0xf9, 0xfe, 0xff, 0xfe, 0xf9, 0xf4, 0xf5, 0xfc, 0x0e, + 0x1a, 0x16, 0x0d, 0x11, 0x15, 0x10, 0x0f, 0x09, 0x07, 0x0a, 0x07, 0x06, + 0x0b, 0x0b, 0x0a, 0x0b, 0x08, 0x03, 0x02, 0x00, 0x03, 0x04, 0x06, 0x02, + 0xfd, 0xfb, 0xf8, 0x02, 0x02, 0xfe, 0x05, 0x0f, 0x0d, 0x0c, 0x0f, 0x06, + 0x07, 0x0c, 0x0b, 0x0c, 0x12, 0x0d, 0x06, 0x00, 0x00, 0xfe, 0xfe, 0x0a, + 0x0f, 0x00, 0xfa, 0xf4, 0xf7, 0x00, 0x02, 0x09, 0x06, 0x07, 0x05, 0x03, + 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfd, 0xfa, 0xf8, 0xfb, 0xfa, 0xfa, 0xf8, + 0xf5, 0xfa, 0x01, 0xfe, 0xfb, 0xfa, 0xfd, 0xff, 0xfb, 0xfa, 0xf8, 0xf2, + 0xf6, 0x09, 0x0e, 0x11, 0x0b, 0x06, 0x07, 0x03, 0xff, 0x01, 0x00, 0x14, + 0x12, 0x0b, 0x06, 0x05, 0x0e, 0x13, 0x14, 0x16, 0x10, 0x0e, 0x0d, 0x0a, + 0x0d, 0x0b, 0x0f, 0x18, 0x17, 0x0e, 0x09, 0x0b, 0x0c, 0x07, 0x05, 0xfc, + 0x02, 0x00, 0xfa, 0xf6, 0xf6, 0xf6, 0xf6, 0xf9, 0xf5, 0xf4, 0xed, 0xe7, + 0xef, 0xf7, 0xf7, 0xfb, 0xf9, 0xf2, 0xed, 0xe8, 0xeb, 0xf3, 0x0d, 0x16, + 0x10, 0x11, 0x16, 0x17, 0x14, 0x10, 0x09, 0x08, 0x0c, 0x0c, 0x09, 0x08, + 0x07, 0x09, 0x08, 0x0a, 0x06, 0x02, 0x02, 0x03, 0xfe, 0xff, 0x03, 0x13, + 0x12, 0x06, 0xff, 0xff, 0x01, 0x01, 0xff, 0x00, 0xfe, 0xfa, 0xf3, 0xf6, + 0x02, 0x0d, 0x09, 0x05, 0x02, 0xfe, 0xfd, 0xfb, 0xf9, 0xff, 0x06, 0x00, + 0x00, 0x0b, 0x0d, 0x07, 0x07, 0x08, 0x15, 0x11, 0x09, 0x0c, 0x0d, 0x0e, + 0x0c, 0x0c, 0x09, 0x07, 0xff, 0xfc, 0xfd, 0xfc, 0xfe, 0x01, 0x0b, 0x08, + 0x08, 0xfb, 0xf7, 0xf8, 0xf5, 0xee, 0xec, 0xf5, 0xfc, 0xf4, 0xf3, 0xfc, + 0x09, 0x0b, 0x06, 0x02, 0x00, 0xfd, 0xfe, 0xff, 0x02, 0x0e, 0x09, 0x05, + 0x07, 0x0c, 0x10, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x12, 0x0e, + 0x0b, 0x13, 0x14, 0x0a, 0x06, 0x04, 0x03, 0x00, 0x05, 0x08, 0xfd, 0xf7, + 0xf3, 0xf3, 0xf5, 0xf4, 0xf3, 0xf1, 0xf0, 0xef, 0xe8, 0xe9, 0xf1, 0xf7, + 0xfa, 0x00, 0xfd, 0xfd, 0x06, 0x04, 0x00, 0x03, 0x18, 0x17, 0x09, 0x10, + 0x1f, 0x1c, 0x13, 0x14, 0x15, 0x10, 0x0b, 0x0a, 0x0c, 0x0f, 0x11, 0x0e, + 0x0d, 0x07, 0xfe, 0xfb, 0xfa, 0xf6, 0xf5, 0xff, 0x04, 0x08, 0x03, 0xfc, + 0xfd, 0x06, 0xff, 0xfb, 0xff, 0xfe, 0xfd, 0xf9, 0xf4, 0xf9, 0xfd, 0xff, + 0x05, 0x07, 0x03, 0x00, 0xff, 0xfc, 0xfc, 0x03, 0x09, 0x02, 0xff, 0x07, + 0x13, 0x19, 0x0b, 0x07, 0x08, 0x07, 0x07, 0x04, 0x03, 0x04, 0x04, 0x04, + 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xf6, 0x06, 0x08, 0x01, 0xfc, 0x01, 0x01, + 0xfb, 0xf9, 0xf7, 0xf9, 0xff, 0x05, 0xfe, 0xfc, 0x05, 0x09, 0x05, 0x06, + 0x07, 0x0e, 0x06, 0x05, 0x06, 0x02, 0x04, 0x0e, 0x0d, 0x0e, 0x0f, 0x13, + 0x14, 0x10, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x09, 0x07, 0x14, 0x0f, 0x0b, + 0x0a, 0x09, 0x07, 0x01, 0xfe, 0x04, 0x06, 0x00, 0xfb, 0xfb, 0xfa, 0xf8, + 0xf6, 0xf5, 0xf4, 0xf3, 0xf1, 0xef, 0xef, 0xf6, 0xf9, 0xf3, 0xf1, 0xef, + 0xfd, 0x0a, 0xfb, 0xfa, 0x01, 0x05, 0x0d, 0x11, 0x09, 0x0d, 0x10, 0x11, + 0x0b, 0x07, 0x07, 0x09, 0x0b, 0x0c, 0x09, 0x06, 0x06, 0x0a, 0x0a, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x06, 0x12, 0x0f, 0x08, 0x08, 0x09, 0x07, 0x04, + 0x02, 0x01, 0x01, 0x04, 0x01, 0x02, 0x08, 0x07, 0x01, 0xfd, 0xfd, 0x02, + 0x07, 0x08, 0xff, 0xf8, 0xf4, 0xf6, 0x02, 0x06, 0x0a, 0x04, 0x02, 0x05, + 0x0e, 0x0a, 0x06, 0x08, 0x05, 0x00, 0x01, 0x03, 0x01, 0xfe, 0xfe, 0xfd, + 0xfc, 0xfd, 0xfd, 0x07, 0x09, 0x01, 0xfb, 0xfa, 0xfe, 0x01, 0x00, 0x00, + 0xfc, 0xff, 0x00, 0xf9, 0xfb, 0xff, 0x00, 0xfe, 0xfe, 0xfd, 0x00, 0x02, + 0x00, 0x00, 0xfb, 0xfc, 0xfe, 0x09, 0x16, 0x13, 0x0c, 0x09, 0x09, 0x0a, + 0x0d, 0x0c, 0x0c, 0x0c, 0x14, 0x17, 0x18, 0x1b, 0x19, 0x12, 0x0f, 0x0e, + 0x0c, 0x06, 0x09, 0x0a, 0x06, 0x01, 0x02, 0xff, 0xfb, 0xfc, 0xfd, 0xfc, + 0xfb, 0xf5, 0xf0, 0xe8, 0xe6, 0xea, 0xec, 0xee, 0xee, 0xeb, 0xf4, 0xf3, + 0xf8, 0xf9, 0xfc, 0x00, 0x06, 0x19, 0x0f, 0x0e, 0x0f, 0x0a, 0x10, 0x0e, + 0x0f, 0x0e, 0x0e, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0b, 0x04, + 0x06, 0x0c, 0x06, 0x0a, 0x0b, 0x09, 0x09, 0x05, 0x01, 0x01, 0xfb, 0xf7, + 0xf6, 0xf6, 0xf7, 0xfb, 0xfe, 0xfb, 0xf9, 0xfa, 0xfa, 0xfa, 0xf7, 0xf5, + 0xfa, 0xf6, 0xf5, 0xfd, 0x0f, 0x11, 0x0a, 0x10, 0x08, 0x03, 0x09, 0x0c, + 0x0f, 0x0d, 0x0e, 0x10, 0x13, 0x11, 0x0d, 0x06, 0x04, 0x04, 0x01, 0xfe, + 0x06, 0x0d, 0x09, 0x05, 0xf9, 0xf2, 0xf5, 0xfa, 0xff, 0x05, 0x00, 0x00, + 0xff, 0xfc, 0xfe, 0x03, 0xfe, 0xfc, 0xf7, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, + 0xfd, 0xf8, 0xff, 0x0c, 0x1b, 0x19, 0x12, 0x09, 0x03, 0x06, 0x08, 0x0b, + 0x0e, 0x0d, 0x04, 0x0b, 0x1d, 0x14, 0x0c, 0x0b, 0x10, 0x0a, 0x07, 0x0c, + 0x10, 0x05, 0x03, 0xfe, 0xfa, 0xf9, 0xf7, 0xf7, 0xf5, 0xf5, 0xf2, 0xf3, + 0xf4, 0xf5, 0xfa, 0xfb, 0xfc, 0xfc, 0xf6, 0xf7, 0xf1, 0xf3, 0xf9, 0x00, + 0xff, 0x01, 0x07, 0x0a, 0x12, 0x0c, 0x12, 0x13, 0x0f, 0x11, 0x0e, 0x0a, + 0x11, 0x14, 0x11, 0x10, 0x0b, 0xfd, 0xf7, 0xfe, 0x03, 0xff, 0xff, 0x06, + 0x0f, 0x0c, 0x07, 0x07, 0x05, 0xff, 0xfe, 0x02, 0x02, 0x04, 0x00, 0xfe, + 0xfc, 0xfe, 0x02, 0x03, 0x02, 0xfe, 0xfb, 0xfb, 0xfb, 0xfb, 0xfe, 0x00, + 0x06, 0x11, 0x07, 0x11, 0x12, 0x0b, 0x0b, 0x09, 0x09, 0x07, 0x05, 0x02, + 0x02, 0x02, 0x04, 0x01, 0xff, 0xfd, 0xfa, 0xf7, 0xf4, 0xf9, 0x05, 0x03, + 0xfc, 0xf8, 0xf6, 0xf8, 0xfb, 0xfb, 0x00, 0xf7, 0xfa, 0x0c, 0x09, 0x04, + 0x04, 0x02, 0x04, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x05, + 0x0d, 0x0b, 0x0a, 0x1d, 0x1c, 0x15, 0x05, 0x05, 0x07, 0x11, 0x16, 0x15, + 0x15, 0x13, 0x0e, 0x0f, 0x0a, 0x08, 0x09, 0x05, 0x00, 0x07, 0x0b, 0x02, + 0x00, 0xfe, 0xf9, 0xf7, 0xf7, 0xf9, 0xfc, 0xfd, 0xfd, 0xf7, 0xed, 0xef, + 0xf5, 0xf2, 0xf1, 0xea, 0xe5, 0xef, 0xf8, 0xf5, 0xf1, 0xf5, 0xfd, 0x02, + 0xfe, 0xff, 0x0a, 0x14, 0x0b, 0x11, 0x11, 0x0e, 0x0b, 0x0b, 0x08, 0x0b, + 0x0f, 0x11, 0x0f, 0x0e, 0x0e, 0x15, 0x1b, 0x11, 0x08, 0x10, 0x10, 0x10, + 0x0c, 0x07, 0x08, 0x05, 0x01, 0xff, 0xff, 0x00, 0x02, 0x00, 0xfa, 0xfa, + 0xfe, 0x01, 0x01, 0x01, 0xfe, 0xf9, 0xf0, 0xe6, 0xe8, 0xf0, 0xfc, 0xf7, + 0xf5, 0xfa, 0x14, 0x1c, 0x0d, 0x06, 0x0d, 0x0d, 0x08, 0x09, 0x0d, 0x0f, + 0x0a, 0x06, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0x0b, 0x0d, 0x04, 0x02, + 0x01, 0x05, 0x0e, 0x05, 0x00, 0x01, 0x01, 0x07, 0x03, 0xfd, 0xfc, 0xfe, + 0xfc, 0xfb, 0xfa, 0xf5, 0xf4, 0xf4, 0xf2, 0xef, 0xf0, 0xff, 0x01, 0xfd, + 0x00, 0x04, 0x11, 0x0f, 0x09, 0x0c, 0x0b, 0x03, 0x00, 0x0d, 0x14, 0x22, + 0x1d, 0x14, 0x15, 0x14, 0x10, 0x0b, 0x0d, 0x12, 0x16, 0x0f, 0x0a, 0x06, + 0x01, 0x02, 0x03, 0xfd, 0xfd, 0x01, 0x05, 0xfb, 0xef, 0xef, 0x00, 0x05, + 0xfd, 0xf5, 0xef, 0xe8, 0xe9, 0xe7, 0xe8, 0xf2, 0xfb, 0x00, 0xfa, 0xf7, + 0xf8, 0xfd, 0x0e, 0x08, 0x0a, 0x0f, 0x0f, 0x11, 0x16, 0x16, 0x10, 0x09, + 0x07, 0x05, 0x04, 0x01, 0xfa, 0xfd, 0x03, 0x14, 0x1e, 0x17, 0x0e, 0x07, + 0x02, 0x02, 0x02, 0xff, 0x03, 0x04, 0x01, 0xfc, 0xfb, 0xfe, 0xfe, 0xfb, + 0xfc, 0xf7, 0xf9, 0xfd, 0xfd, 0xfe, 0x04, 0x11, 0x0d, 0x07, 0x04, 0x01, + 0x00, 0x0d, 0x17, 0x11, 0x11, 0x0f, 0x0d, 0x0c, 0x09, 0x06, 0x06, 0x03, + 0xfd, 0xfa, 0xfb, 0xfc, 0xfa, 0xfa, 0x02, 0x09, 0x02, 0xf0, 0xeb, 0xec, + 0xf1, 0xf2, 0xf7, 0xfa, 0x03, 0x10, 0x0b, 0x05, 0x02, 0x03, 0x00, 0xff, + 0xff, 0xfb, 0xfb, 0xfc, 0xfe, 0xfc, 0x01, 0x0a, 0x0b, 0x07, 0x07, 0x06, + 0x04, 0x17, 0x20, 0x24, 0x20, 0x16, 0x17, 0x14, 0x0f, 0x15, 0x0f, 0x0a, + 0x06, 0x06, 0x05, 0x03, 0x00, 0xfe, 0x05, 0x0c, 0x04, 0xfa, 0xf5, 0xf4, + 0xf8, 0xf9, 0xf9, 0xfe, 0xf7, 0xf2, 0xf4, 0xf3, 0xef, 0xed, 0xee, 0xf0, + 0xef, 0xf8, 0xff, 0xfd, 0xf6, 0xf5, 0x00, 0x04, 0x02, 0xfe, 0xfc, 0xfe, + 0x04, 0x17, 0x14, 0x14, 0x1e, 0x21, 0x1c, 0x18, 0x14, 0x0f, 0x0c, 0x0d, + 0x13, 0x14, 0x0f, 0x0b, 0x02, 0x02, 0x13, 0x12, 0x06, 0x02, 0x04, 0x02, + 0x01, 0xfe, 0x00, 0xfe, 0xfa, 0xf8, 0xf9, 0xfc, 0x00, 0xfd, 0xfa, 0xf9, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf8, 0xf9, 0xfe, 0x01, 0xfd, 0x01, 0x07, + 0x08, 0x17, 0x13, 0x0c, 0x0e, 0x08, 0x08, 0x0a, 0x0a, 0x05, 0x00, 0x00, + 0xfe, 0xfc, 0xfc, 0xfd, 0xf9, 0xfe, 0x10, 0x14, 0x09, 0x08, 0x07, 0x04, + 0x02, 0x04, 0x06, 0x0c, 0x0c, 0x05, 0x00, 0x00, 0x00, 0xfe, 0xfc, 0xf8, + 0xf8, 0xf5, 0xf1, 0xf3, 0xfb, 0x07, 0x08, 0x08, 0x02, 0xfd, 0xfe, 0xfc, + 0xf8, 0x09, 0x0b, 0x0c, 0x12, 0x0d, 0x09, 0x11, 0x1a, 0x15, 0x0f, 0x0c, + 0x09, 0x04, 0x02, 0x06, 0x09, 0x0b, 0x12, 0x0b, 0x06, 0x08, 0x07, 0x05, + 0x03, 0x01, 0xfa, 0xfc, 0x02, 0x02, 0x03, 0xfd, 0xf8, 0xf4, 0xf5, 0xf2, + 0xf0, 0xe7, 0xe6, 0xe7, 0xef, 0xf8, 0xfb, 0xfc, 0xf9, 0xf5, 0xf3, 0xf4, + 0xfa, 0x0f, 0x15, 0x1a, 0x16, 0x0f, 0x0c, 0x08, 0x09, 0x04, 0x04, 0x04, + 0x09, 0x07, 0x03, 0x05, 0x11, 0x21, 0x1f, 0x12, 0x0c, 0x0a, 0x08, 0x08, + 0x0b, 0x05, 0x00, 0x00, 0x02, 0x02, 0x08, 0x0a, 0x00, 0xfc, 0xfd, 0xfc, + 0x01, 0xfd, 0xf7, 0x07, 0x0a, 0x06, 0x06, 0x05, 0x03, 0x03, 0xfa, 0xf6, + 0x04, 0x19, 0x13, 0x0c, 0x09, 0x05, 0x01, 0x02, 0x01, 0xfd, 0xfe, 0xfc, + 0xf7, 0xf5, 0xf3, 0xf1, 0xf4, 0x00, 0x06, 0xfb, 0xfa, 0xfb, 0xf9, 0xf9, + 0xf7, 0xff, 0x0b, 0x0a, 0x06, 0xfd, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xf9, + 0xf5, 0xf7, 0xff, 0x0a, 0x0b, 0x09, 0x06, 0x06, 0x0e, 0x12, 0x06, 0x05, + 0x1a, 0x2c, 0x29, 0x24, 0x23, 0x1c, 0x12, 0x0b, 0x07, 0x08, 0x0a, 0x0a, + 0x07, 0x03, 0x02, 0x02, 0x02, 0x07, 0x0b, 0x0a, 0x05, 0x00, 0x00, 0xff, + 0xfb, 0xf7, 0xed, 0xe4, 0xea, 0xf2, 0xf4, 0xec, 0xe8, 0xe8, 0xed, 0xf7, + 0xf3, 0xef, 0xf3, 0xf9, 0xfd, 0xff, 0x02, 0x02, 0xfd, 0xfa, 0xff, 0x08, + 0x13, 0x1d, 0x18, 0x1d, 0x1b, 0x1e, 0x1b, 0x13, 0x0d, 0x16, 0x11, 0x0d, + 0x0b, 0x05, 0x04, 0x06, 0x00, 0x04, 0x0b, 0x0b, 0x0a, 0x05, 0x00, 0xff, + 0xfd, 0xf9, 0xfd, 0xfe, 0xfa, 0xfc, 0xfa, 0xf6, 0xf8, 0xf6, 0xf1, 0xeb, + 0xf1, 0xf8, 0x06, 0x0b, 0x03, 0x04, 0x05, 0x08, 0x10, 0x08, 0x04, 0x06, + 0x0e, 0x1a, 0x12, 0x0e, 0x0e, 0x0b, 0x09, 0x09, 0x05, 0x05, 0x04, 0xff, + 0xfb, 0xfe, 0x03, 0x02, 0xf4, 0x00, 0x15, 0x0d, 0x08, 0x05, 0x02, 0x00, + 0xfc, 0xf5, 0xf8, 0x04, 0x04, 0x01, 0xfc, 0xf6, 0xf7, 0xf6, 0xf5, 0xf4, + 0xf3, 0xfa, 0x07, 0x02, 0x03, 0x07, 0x06, 0xfd, 0xfa, 0x01, 0x06, 0x03, + 0x09, 0x12, 0x0a, 0x0a, 0x10, 0x16, 0x0c, 0x0c, 0x0a, 0x09, 0x0a, 0x05, + 0x04, 0x05, 0x08, 0x07, 0x08, 0x0d, 0x14, 0x0a, 0x07, 0x08, 0x06, 0x03, + 0xff, 0xfe, 0x00, 0x07, 0x0b, 0x04, 0xfe, 0xfc, 0xfb, 0xf3, 0xe7, 0xe8, + 0xee, 0xf7, 0xfc, 0xf9, 0xf7, 0xff, 0x01, 0xfb, 0xfc, 0x02, 0x03, 0x02, + 0x0a, 0x13, 0x13, 0x13, 0x0c, 0x07, 0xff, 0x00, 0x02, 0x01, 0xff, 0xfd, + 0xfe, 0x02, 0x0f, 0x0d, 0x0b, 0x11, 0x18, 0x0f, 0x08, 0x08, 0x07, 0x04, + 0x02, 0x04, 0x01, 0x00, 0x03, 0x03, 0xff, 0xff, 0x06, 0x02, 0xfd, 0xfe, + 0x08, 0x0d, 0x0a, 0x0a, 0x09, 0x03, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xff, + 0x06, 0x10, 0x0b, 0x07, 0x04, 0x02, 0x02, 0xfc, 0xfb, 0xfb, 0xf6, 0xf3, + 0xf1, 0xf0, 0xf4, 0xf6, 0xf8, 0x02, 0x0d, 0x04, 0xfd, 0xfb, 0x01, 0x0b, + 0x04, 0x00, 0x06, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0xff, 0xfe, 0x00, + 0x05, 0x0a, 0x10, 0x10, 0x14, 0x19, 0x13, 0x07, 0x07, 0x08, 0x0c, 0x0d, + 0x1c, 0x1f, 0x13, 0x11, 0x11, 0x0d, 0x0b, 0x07, 0x03, 0x00, 0x04, 0x06, + 0x02, 0x02, 0x00, 0xfc, 0xfc, 0x04, 0x0d, 0xff, 0xf8, 0xfa, 0xf8, 0xf7, + 0xf5, 0xf9, 0xf1, 0xea, 0xef, 0xeb, 0xe8, 0xef, 0xf7, 0xee, 0xee, 0xf1, + 0xf1, 0xf8, 0x01, 0xff, 0xff, 0x04, 0x05, 0x07, 0x0b, 0x06, 0x03, 0x05, + 0x17, 0x1d, 0x1f, 0x1d, 0x19, 0x0f, 0x12, 0x1a, 0x11, 0x0e, 0x10, 0x0d, + 0x0d, 0x0e, 0x0a, 0x06, 0x07, 0x14, 0x12, 0x03, 0x00, 0x04, 0x02, 0x00, + 0xfe, 0xfc, 0xfb, 0x00, 0xff, 0xfb, 0xfb, 0xf8, 0xed, 0xeb, 0xf5, 0xf9, + 0xf7, 0xfb, 0xff, 0xff, 0x04, 0x0e, 0x0a, 0x0a, 0x04, 0x00, 0x00, 0x04, + 0x15, 0x13, 0x0e, 0x0e, 0x0b, 0x07, 0x04, 0x01, 0xfd, 0xfd, 0xff, 0x04, + 0x02, 0xfc, 0xfa, 0x00, 0x03, 0x0c, 0x08, 0xfe, 0x00, 0x03, 0x00, 0xf8, + 0xf1, 0xf5, 0x00, 0x00, 0xfe, 0xfc, 0xfc, 0xfb, 0xf6, 0xf6, 0xf8, 0xfc, + 0x01, 0x06, 0x10, 0x0c, 0x05, 0x03, 0x06, 0x06, 0x00, 0xfd, 0x01, 0x09, + 0x1c, 0x20, 0x23, 0x16, 0x11, 0x0e, 0x0d, 0x08, 0x08, 0x0d, 0x0e, 0x0e, + 0x0a, 0x0c, 0x0a, 0x09, 0x08, 0x0f, 0x07, 0x01, 0x0c, 0x07, 0xf8, 0xf5, + 0xff, 0x00, 0xfc, 0xfc, 0xfd, 0xfb, 0xf8, 0xf2, 0xeb, 0xec, 0xee, 0xee, + 0xee, 0xf6, 0xfe, 0xf9, 0xfa, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfc, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x08, 0x00, 0xfc, 0xfe, 0xfd, 0x00, 0x0e, 0x11, + 0x08, 0x08, 0x0c, 0x0a, 0x10, 0x14, 0x0c, 0x02, 0x04, 0x0a, 0x0a, 0x06, + 0x04, 0xff, 0xff, 0x07, 0x0b, 0x07, 0x00, 0xff, 0x02, 0x0b, 0x09, 0x07, + 0x09, 0x11, 0x14, 0x0e, 0x07, 0x03, 0x02, 0xfe, 0xff, 0x01, 0x01, 0x13, + 0x15, 0x08, 0x05, 0x06, 0x04, 0x00, 0xfb, 0xf9, 0xf9, 0xf9, 0xf3, 0xe9, + 0xe8, 0xed, 0xec, 0xec, 0xfe, 0x00, 0xf8, 0x04, 0x06, 0x01, 0xfd, 0xfa, + 0xfb, 0x00, 0xff, 0x01, 0x00, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x03, + 0x06, 0x05, 0x11, 0x15, 0x13, 0x18, 0x11, 0x09, 0x09, 0x0d, 0x16, 0x25, + 0x19, 0x0d, 0x0a, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x05, 0x04, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xfc, 0xf5, 0xf0, 0xf4, 0xf6, 0xf5, + 0xf3, 0xf2, 0xf4, 0xfa, 0x04, 0x00, 0xfb, 0xf6, 0xf4, 0xf4, 0xf2, 0xf2, + 0xf8, 0xfd, 0x07, 0x0f, 0x10, 0x0c, 0x06, 0x00, 0x01, 0x04, 0x0b, 0x13, + 0x0c, 0x14, 0x1c, 0x15, 0x0e, 0x10, 0x10, 0x12, 0x12, 0x0e, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xfe, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf4, 0xf0, 0xf0, 0xf0, 0xf2, 0xf6, + 0x00, 0x0a, 0x0a, 0x0a, 0x0b, 0x0c, 0x05, 0x00, 0x00, 0x05, 0x15, 0x1a, + 0x16, 0x10, 0x0c, 0x08, 0x06, 0x04, 0x00, 0xff, 0x00, 0x00, 0x02, 0x06, + 0x01, 0x00, 0x06, 0x16, 0x10, 0x0a, 0xfe, 0xf6, 0xf6, 0xfc, 0xf8, 0xf9, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x02, 0x02, 0x02, 0xfd, 0xf9, 0xfb, 0x00, + 0xf8, 0xec, 0xf6, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x16, 0x29, 0x20, + 0x18, 0x12, 0x0e, 0x0c, 0x08, 0x0a, 0x0d, 0x0b, 0x0a, 0x0b, 0x0a, 0x04, + 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x00, 0x03, 0x00, 0x06, 0x04, 0x00, + 0xff, 0x00, 0xf8, 0xf6, 0xf6, 0xf3, 0xf0, 0xec, 0xee, 0xf0, 0xf5, 0xf9, + 0xf6, 0xf6, 0x00, 0x08, 0x08, 0x01, 0xfc, 0xfd, 0xfe, 0x0a, 0x12, 0x0a, + 0x02, 0x07, 0x08, 0x06, 0x08, 0x12, 0x1c, 0x14, 0x0e, 0x0c, 0x07, 0x00, + 0x00, 0x07, 0x13, 0x12, 0x10, 0x0a, 0x0a, 0x0c, 0x08, 0x06, 0x04, 0x00, + 0x00, 0xf8, 0xf0, 0x04, 0x0e, 0x0b, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, + 0xff, 0xfa, 0x00, 0x03, 0x02, 0x00, 0x00, 0xfe, 0x02, 0x14, 0x10, 0x0a, + 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xfa, 0xf4, 0xee, 0xe8, 0xea, 0xed, 0xec, + 0xf2, 0x02, 0x08, 0x0b, 0x00, 0xfc, 0xff, 0x00, 0xff, 0xff, 0x02, 0x05, + 0x04, 0x01, 0x05, 0x0c, 0x0d, 0x04, 0x00, 0xff, 0x00, 0x02, 0x04, 0x04, + 0x0c, 0x0e, 0x1a, 0x1e, 0x17, 0x16, 0x12, 0x10, 0x18, 0x23, 0x14, 0x0e, + 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x06, 0x08, 0x08, 0x04, 0xfc, 0xf8, + 0x00, 0x04, 0xf8, 0xea, 0xe9, 0xec, 0xf3, 0xf4, 0xf2, 0xf6, 0xf8, 0x05, + 0x01, 0xfa, 0xfa, 0xfa, 0xf6, 0xf2, 0xf0, 0xf0, 0xf0, 0xf6, 0xf8, 0xfc, + 0x01, 0xff, 0x00, 0xfe, 0x00, 0x05, 0x04, 0x02, 0x15, 0x1f, 0x24, 0x1c, + 0x16, 0x16, 0x12, 0x10, 0x0e, 0x0e, 0x0a, 0x04, 0x02, 0x00, 0xfe, 0x04, + 0x12, 0x0a, 0x08, 0x06, 0x02, 0x04, 0x06, 0x02, 0x00, 0x00, 0xfc, 0xfc, + 0xfa, 0xf9, 0xf5, 0xf5, 0xfd, 0xfb, 0xf9, 0x04, 0x0f, 0x07, 0x01, 0x03, + 0x04, 0x01, 0x05, 0x05, 0x03, 0x05, 0x05, 0x12, 0x23, 0x1d, 0x11, 0x04, + 0x01, 0x03, 0x02, 0xf5, 0xfd, 0x01, 0x07, 0x0b, 0x00, 0xf9, 0xfe, 0x0d, + 0x05, 0xfb, 0xf9, 0xf5, 0xf5, 0xfb, 0xfb, 0xf7, 0xfd, 0x07, 0x02, 0xff, + 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xf9, 0xf9, 0xf6, 0xf1, 0xed, 0xf1, 0xef, + 0xf7, 0x01, 0x09, 0x09, 0x17, 0x19, 0x15, 0x24, 0x21, 0x17, 0x11, 0x0d, + 0x0c, 0x0b, 0x0d, 0x12, 0x13, 0x0f, 0x0b, 0x03, 0xfd, 0x04, 0x11, 0x0d, + 0x0f, 0x0d, 0x09, 0x0d, 0x07, 0x05, 0x03, 0x03, 0x05, 0x01, 0xfd, 0xfb, + 0xf5, 0xf8, 0xfb, 0xf7, 0xf3, 0xf1, 0xf1, 0xf5, 0xf7, 0xfb, 0xf9, 0xf5, + 0xef, 0xf5, 0xfb, 0xee, 0xe3, 0xee, 0x01, 0x0f, 0x13, 0x13, 0x0b, 0x07, + 0x0f, 0x19, 0x15, 0x14, 0x0b, 0x07, 0x03, 0x00, 0x00, 0x0b, 0x0b, 0x09, + 0x08, 0x0b, 0x0b, 0x07, 0x05, 0x03, 0x03, 0x07, 0x06, 0x03, 0xfe, 0x01, + 0x0a, 0x0d, 0x07, 0x05, 0x03, 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xff, 0xfd, + 0xfd, 0x04, 0x05, 0x00, 0xfc, 0x02, 0x17, 0x14, 0x0e, 0x0a, 0x05, 0x00, + 0xfb, 0x00, 0x00, 0xfe, 0xf6, 0xf0, 0xf6, 0xf8, 0x0a, 0x16, 0x0a, 0x04, + 0x00, 0xfd, 0xfc, 0xfa, 0xfa, 0xfa, 0x00, 0x0e, 0x0e, 0x08, 0x00, 0x00, + 0x05, 0x02, 0x00, 0xfe, 0xfa, 0x00, 0x02, 0x02, 0x0a, 0x0e, 0x04, 0x02, + 0x06, 0x12, 0x0c, 0x08, 0x08, 0x17, 0x21, 0x16, 0x10, 0x0c, 0x08, 0x06, + 0x08, 0x0c, 0x08, 0x02, 0x00, 0xfe, 0x00, 0x06, 0xfa, 0xf4, 0xf3, 0xf2, + 0xf0, 0xf2, 0xf4, 0xf7, 0xf6, 0x00, 0x0a, 0x08, 0x00, 0xf9, 0xf6, 0xf8, + 0xfa, 0xfa, 0xf6, 0xf7, 0xfb, 0xfd, 0xff, 0xfd, 0xfc, 0xfc, 0xf8, 0xf8, + 0x06, 0x10, 0x06, 0x08, 0x10, 0x26, 0x28, 0x24, 0x1c, 0x18, 0x12, 0x0e, + 0x12, 0x10, 0x0c, 0x07, 0x04, 0x0a, 0x16, 0x10, 0x08, 0x04, 0x00, 0x00, + 0x06, 0x06, 0x01, 0xfd, 0xf8, 0xed, 0xf6, 0xf6, 0xf2, 0xf0, 0xf6, 0x00, + 0xfe, 0xff, 0x07, 0x02, 0x00, 0xff, 0xfe, 0xfe, 0xfc, 0xfa, 0xf5, 0xf8, + 0x05, 0x04, 0x00, 0xfa, 0x0a, 0x16, 0x12, 0x05, 0x08, 0x0a, 0x05, 0x07, + 0x04, 0x02, 0x04, 0x00, 0x06, 0x14, 0x0b, 0x02, 0xfc, 0xfc, 0xfa, 0xf9, + 0xf8, 0xfa, 0xfc, 0xfa, 0xfc, 0x0a, 0x0c, 0x02, 0xfe, 0xfc, 0xfe, 0x00, + 0x00, 0xfc, 0xf8, 0xfc, 0xff, 0xfe, 0xfa, 0xfe, 0xfe, 0xfe, 0x0d, 0x18, + 0x1a, 0x14, 0x0e, 0x14, 0x1f, 0x1a, 0x14, 0x0e, 0x13, 0x12, 0x0e, 0x0e, + 0x0a, 0x06, 0x04, 0x0a, 0x1a, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0xfe, 0xfc, 0xf8, 0xff, 0x00, 0xfc, 0xf6, 0xee, 0xef, 0xf8, 0xfc, + 0xf9, 0xf6, 0xf5, 0xf6, 0xf6, 0xf8, 0xf0, 0xe8, 0xe8, 0xe6, 0xe7, 0xf4, + 0xf6, 0xf0, 0xf5, 0x12, 0x1b, 0x16, 0x1c, 0x1f, 0x14, 0x10, 0x10, 0x0c, + 0x0a, 0x08, 0x11, 0x12, 0x0f, 0x13, 0x0b, 0x06, 0x04, 0x01, 0x06, 0x0e, + 0x14, 0x10, 0x0c, 0x0e, 0x0e, 0x08, 0x08, 0x02, 0xfe, 0x01, 0x0c, 0x08, + 0x02, 0x00, 0xfe, 0xfb, 0xfe, 0xfc, 0xfe, 0x00, 0xfd, 0xfa, 0xfe, 0x00, + 0x00, 0xfe, 0x0d, 0x0f, 0x08, 0x00, 0xf6, 0xf9, 0xf8, 0xf8, 0xf9, 0xfa, + 0x00, 0x10, 0x14, 0x14, 0x05, 0x00, 0x00, 0xfe, 0xf8, 0xf6, 0xf7, 0xf3, + 0xf6, 0xfc, 0x00, 0x08, 0x06, 0x03, 0xfc, 0xfa, 0xfe, 0x05, 0x04, 0x02, + 0x01, 0xfd, 0x00, 0x08, 0x06, 0x03, 0x04, 0x01, 0x00, 0x06, 0x10, 0x08, + 0x06, 0x13, 0x18, 0x12, 0x13, 0x15, 0x12, 0x0b, 0x0a, 0x0a, 0x06, 0x06, + 0x0f, 0x0b, 0x07, 0x03, 0x01, 0xfd, 0xfb, 0xf8, 0xf8, 0xfb, 0xfe, 0x05, + 0xff, 0x03, 0x09, 0x03, 0x00, 0xfe, 0xfa, 0xf7, 0xf8, 0xfd, 0x00, 0x01, + 0xff, 0xfb, 0xfc, 0x02, 0xfb, 0xf7, 0xee, 0xef, 0xf4, 0xfe, 0x00, 0x02, + 0x0d, 0x1e, 0x1f, 0x18, 0x14, 0x14, 0x10, 0x08, 0x02, 0x00, 0x0b, 0x12, + 0x11, 0x10, 0x0a, 0x06, 0x04, 0x00, 0xf8, 0xf8, 0xfc, 0xfd, 0xf7, 0xf7, + 0xf9, 0xfc, 0xf6, 0xfc, 0xfc, 0xfe, 0x00, 0x08, 0x02, 0x00, 0x01, 0x00, + 0xfa, 0xfa, 0xfc, 0xfb, 0xf9, 0xfe, 0x01, 0x00, 0x05, 0x01, 0x07, 0x0f, + 0x1c, 0x14, 0x11, 0x11, 0x15, 0x13, 0x0c, 0x06, 0x08, 0x19, 0x17, 0x14, + 0x0d, 0x0a, 0x06, 0x01, 0xfc, 0xf8, 0xf5, 0xf8, 0xf9, 0xf6, 0xf3, 0xf8, + 0x06, 0x07, 0x02, 0x00, 0xfc, 0xf8, 0xec, 0xed, 0xf0, 0xf3, 0xf4, 0xf3, + 0xf5, 0xfc, 0x06, 0x0e, 0x08, 0x04, 0x07, 0x12, 0x0e, 0x06, 0x0a, 0x1c, + 0x15, 0x0f, 0x11, 0x13, 0x13, 0x0b, 0x11, 0x0f, 0x14, 0x0d, 0x08, 0x06, + 0x08, 0x06, 0x04, 0x03, 0x03, 0x00, 0x00, 0xfc, 0xf9, 0xf2, 0xf3, 0xfb, + 0xfa, 0xf5, 0xf2, 0xf2, 0xf7, 0xfa, 0xf9, 0x01, 0xfe, 0xfe, 0xfa, 0xf2, + 0xf0, 0xf2, 0xf4, 0xf6, 0xf4, 0xf4, 0xfc, 0xfa, 0xf3, 0xf8, 0x17, 0x30, + 0x28, 0x1d, 0x19, 0x1b, 0x19, 0x13, 0x19, 0x17, 0x13, 0x0e, 0x0b, 0x0d, + 0x11, 0x1a, 0x1c, 0x12, 0x0a, 0x04, 0xfb, 0xfa, 0xf9, 0xfc, 0x02, 0x02, + 0x07, 0x04, 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfc, 0xf8, 0xf4, 0xf1, 0xed, + 0xef, 0xf6, 0xf8, 0xf6, 0xf1, 0xf8, 0xfc, 0xf6, 0xf0, 0xff, 0x04, 0xff, + 0x00, 0x00, 0x00, 0x03, 0x08, 0x15, 0x15, 0x1e, 0x17, 0x0c, 0x04, 0x02, + 0x04, 0x02, 0x00, 0xfa, 0xf6, 0xf8, 0xfa, 0xf7, 0xfd, 0x0f, 0x13, 0x0e, + 0x0a, 0x07, 0x06, 0x03, 0xfe, 0x00, 0x04, 0x02, 0x03, 0xff, 0xfd, 0xff, + 0x05, 0x07, 0x05, 0x04, 0x0e, 0x0d, 0x05, 0x01, 0x11, 0x15, 0x0e, 0x0f, + 0x0e, 0x0c, 0x10, 0x18, 0x1b, 0x09, 0xfc, 0xfa, 0xf9, 0xf9, 0xfa, 0xfc, + 0xfe, 0xfe, 0xfe, 0x08, 0x0c, 0x09, 0xfe, 0xf5, 0xf6, 0xf8, 0xfb, 0xfc, + 0xf8, 0xf8, 0xfd, 0xfa, 0xff, 0x03, 0x02, 0x03, 0xfa, 0xf5, 0xf1, 0xf2, + 0xf2, 0xf4, 0xf7, 0x02, 0x09, 0x00, 0xfc, 0x0c, 0x1a, 0x12, 0x0a, 0x08, + 0x06, 0x08, 0x15, 0x13, 0x0d, 0x06, 0x06, 0x07, 0x06, 0x05, 0x09, 0x0a, + 0x0a, 0x07, 0x03, 0x01, 0xff, 0xfd, 0xfc, 0xfb, 0xf8, 0xfd, 0x02, 0x12, + 0x16, 0x0f, 0x07, 0x04, 0x08, 0x04, 0x00, 0x00, 0xfc, 0xf9, 0xfa, 0x04, + 0x08, 0x03, 0x0a, 0x11, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x00, 0xfe, 0x05, + 0x15, 0x21, 0x19, 0x11, 0x0b, 0x08, 0x02, 0x00, 0x00, 0xfa, 0xf7, 0xf8, + 0xf6, 0xf1, 0xed, 0xec, 0xec, 0xee, 0xf7, 0xfc, 0xf6, 0xf4, 0xf5, 0xf4, + 0xf3, 0xf4, 0xf7, 0xfd, 0xfe, 0xfa, 0xfe, 0x0b, 0x0a, 0x05, 0x04, 0x03, + 0x06, 0x0d, 0x0b, 0x08, 0x03, 0x0e, 0x1b, 0x23, 0x22, 0x18, 0x13, 0x1d, + 0x25, 0x20, 0x1b, 0x15, 0x0f, 0x09, 0x02, 0x03, 0x07, 0x09, 0x0b, 0x06, + 0x02, 0xff, 0xff, 0xfe, 0xfe, 0xf4, 0xef, 0xef, 0xf1, 0xf4, 0xf9, 0xfc, + 0xf8, 0xf5, 0xfb, 0x00, 0xfd, 0xf3, 0xe8, 0xe8, 0xe6, 0xe9, 0xeb, 0xee, + 0xf8, 0xf9, 0xfc, 0x0c, 0x19, 0x2a, 0x22, 0x18, 0x14, 0x0b, 0x0b, 0x15, + 0x18, 0x12, 0x0b, 0x10, 0x0d, 0x09, 0x08, 0x09, 0x0c, 0x0b, 0x0c, 0x0c, + 0x0a, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0xfc, 0xfc, 0xfb, 0xf9, 0xf8, + 0xf7, 0xf5, 0xf6, 0xf6, 0xf7, 0xf5, 0xf2, 0xf4, 0xf8, 0xf8, 0xf9, 0x00, + 0xfc, 0xfc, 0xf8, 0x04, 0x0f, 0x07, 0x02, 0x00, 0xff, 0x12, 0x1d, 0x2a, + 0x26, 0x1e, 0x17, 0x11, 0x0d, 0x0b, 0x06, 0x03, 0x02, 0x00, 0x02, 0x0a, + 0x08, 0x06, 0x03, 0x04, 0x0b, 0xfe, 0xf1, 0xf2, 0xf2, 0xf5, 0xfa, 0x00, + 0xfd, 0xff, 0x04, 0x01, 0xfe, 0xf8, 0xf7, 0xfb, 0xff, 0x03, 0x03, 0xff, + 0xfd, 0xfa, 0x00, 0x0b, 0x06, 0x01, 0x03, 0x05, 0x0b, 0x13, 0x0e, 0x0d, + 0x09, 0x08, 0x02, 0xff, 0xfe, 0x00, 0x04, 0x13, 0x11, 0x0a, 0x07, 0x07, + 0x09, 0x00, 0xf9, 0xf2, 0xee, 0xeb, 0xf4, 0x06, 0x08, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x03, 0x03, 0xfe, 0xfb, 0xfd, 0xff, 0x02, 0xff, 0x00, 0xfc, + 0xfc, 0x07, 0x1b, 0x16, 0x11, 0x09, 0x04, 0x0d, 0x14, 0x12, 0x10, 0x10, + 0x0e, 0x0a, 0x04, 0x00, 0x00, 0xfc, 0xf8, 0xfd, 0x02, 0x01, 0x00, 0xff, + 0xfe, 0xfa, 0xfd, 0x09, 0x05, 0xff, 0x05, 0x05, 0x04, 0x02, 0xff, 0x00, + 0xfe, 0xfc, 0xf7, 0xfe, 0xfe, 0xf9, 0xfe, 0x09, 0x05, 0x03, 0x01, 0xfe, + 0x01, 0x13, 0x10, 0x08, 0x07, 0x08, 0x11, 0x1b, 0x14, 0x0d, 0x06, 0x03, + 0x01, 0xfc, 0xf7, 0xf5, 0xf6, 0xf9, 0xfa, 0xfa, 0xfb, 0xfd, 0xfa, 0xf7, + 0xf7, 0xfb, 0xf8, 0xf8, 0xf7, 0xf2, 0xf4, 0xf5, 0xf8, 0xf8, 0x01, 0x15, + 0x16, 0x10, 0x0d, 0x0a, 0x09, 0x0e, 0x14, 0x12, 0x0c, 0x05, 0x05, 0x15, + 0x24, 0x1b, 0x15, 0x15, 0x17, 0x12, 0x13, 0x13, 0x12, 0x15, 0x15, 0x0d, + 0x09, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x03, 0x01, 0xf8, 0xf3, 0xec, + 0xed, 0xe9, 0xe4, 0xe1, 0xe6, 0xee, 0xec, 0xea, 0xe9, 0xf0, 0xf6, 0xf7, + 0xf5, 0xf5, 0xf7, 0xf8, 0xfb, 0xfb, 0x00, 0x0d, 0x07, 0x01, 0x06, 0x1c, + 0x1a, 0x12, 0x0d, 0x0d, 0x0f, 0x19, 0x1c, 0x1f, 0x18, 0x14, 0x13, 0x12, + 0x0e, 0x0e, 0x0a, 0x0b, 0x0e, 0x14, 0x16, 0x0f, 0x0b, 0x08, 0x00, 0xff, + 0x00, 0xfc, 0xfb, 0xfd, 0xfc, 0xf4, 0xf3, 0xf5, 0xf9, 0xfe, 0x01, 0xff, + 0xfc, 0xfb, 0x00, 0x01, 0xfe, 0xf1, 0xeb, 0xf0, 0xf1, 0xf5, 0x06, 0x02, + 0xff, 0xff, 0xfe, 0x14, 0x26, 0x25, 0x1d, 0x16, 0x13, 0x0d, 0x06, 0x02, + 0xff, 0xfe, 0xfb, 0x00, 0x03, 0x01, 0xff, 0x00, 0xfa, 0xfa, 0x00, 0x01, + 0x00, 0x02, 0xff, 0xfe, 0xfd, 0xf8, 0xf8, 0xfc, 0xff, 0xfb, 0xfa, 0xfc, + 0xfc, 0xfc, 0x04, 0x02, 0xfc, 0xfe, 0x01, 0xfd, 0xfc, 0x0e, 0x0d, 0x06, + 0x06, 0x03, 0x08, 0x15, 0x17, 0x10, 0x12, 0x11, 0x0c, 0x08, 0x07, 0x17, + 0x16, 0x14, 0x16, 0x16, 0x10, 0x0c, 0x0a, 0x03, 0xfc, 0xfa, 0xfb, 0xfd, + 0xfc, 0xfa, 0xfd, 0x00, 0xfa, 0xec, 0xea, 0xf4, 0xff, 0x02, 0xfd, 0xfd, + 0x00, 0x04, 0x03, 0xfe, 0xfb, 0xf6, 0xf1, 0xf6, 0x08, 0x0f, 0x04, 0x00, + 0xfe, 0xfe, 0x08, 0x10, 0x09, 0x09, 0x05, 0x03, 0x01, 0x02, 0x00, 0xff, + 0x00, 0x06, 0x07, 0x07, 0x07, 0x04, 0x02, 0x0c, 0x0d, 0x09, 0x05, 0x01, + 0xfe, 0xff, 0xff, 0xfc, 0xfa, 0xfb, 0xfe, 0x03, 0x09, 0x06, 0x06, 0x03, + 0x0d, 0x0f, 0x08, 0x03, 0x04, 0x06, 0xff, 0x0b, 0x13, 0x0a, 0x04, 0x01, + 0x03, 0x0c, 0x1a, 0x15, 0x10, 0x09, 0x06, 0x00, 0xfe, 0xfe, 0x01, 0xfd, + 0xff, 0x02, 0x03, 0x02, 0x00, 0xf2, 0xe4, 0xed, 0xf6, 0xf5, 0xf2, 0xf2, + 0xf7, 0xf8, 0xf8, 0x04, 0x08, 0x05, 0x03, 0x06, 0x06, 0x01, 0x05, 0x0e, + 0x0e, 0x0a, 0x06, 0x00, 0x02, 0x01, 0x0a, 0x16, 0x0d, 0x09, 0x05, 0x05, + 0x13, 0x27, 0x25, 0x1d, 0x19, 0x13, 0x0e, 0x09, 0x03, 0x05, 0x04, 0x05, + 0x02, 0xfc, 0xfc, 0xfa, 0xf7, 0xef, 0xee, 0xee, 0xed, 0xec, 0xec, 0xea, + 0xf2, 0xfa, 0xf2, 0xf1, 0xeb, 0xeb, 0xf2, 0xf5, 0xf7, 0xfb, 0x02, 0x0c, + 0x16, 0x10, 0x0d, 0x08, 0x00, 0x04, 0x20, 0x1e, 0x14, 0x0d, 0x0e, 0x13, + 0x1f, 0x28, 0x25, 0x1f, 0x16, 0x09, 0xfc, 0xfe, 0x07, 0x16, 0x18, 0x13, + 0x0c, 0x09, 0x09, 0x06, 0x00, 0xfc, 0xf9, 0xf7, 0xf2, 0xee, 0xf2, 0xf2, + 0xf3, 0xf3, 0xf4, 0xee, 0xe7, 0xed, 0xf2, 0xf5, 0xf9, 0x05, 0x02, 0xfb, + 0xfd, 0xfc, 0xfa, 0xf2, 0xf5, 0x08, 0x08, 0x0d, 0x13, 0x09, 0x0c, 0x12, + 0x1c, 0x18, 0x12, 0x10, 0x0c, 0x05, 0x03, 0x01, 0x04, 0x10, 0x0c, 0x06, + 0x01, 0x01, 0x01, 0xfb, 0xfd, 0x0a, 0x09, 0x05, 0x01, 0x00, 0xff, 0xfc, + 0xfd, 0xfe, 0xfe, 0xfc, 0xf6, 0xf2, 0xfb, 0x01, 0x07, 0x09, 0x06, 0x02, + 0x03, 0x03, 0x03, 0x00, 0x0e, 0x0f, 0xfc, 0xfa, 0xfd, 0x01, 0x02, 0x09, + 0x17, 0x13, 0x11, 0x18, 0x1f, 0x15, 0x11, 0x10, 0x13, 0x10, 0x09, 0x04, + 0x02, 0x00, 0xfb, 0xf6, 0xee, 0xf3, 0xf6, 0xf3, 0xf5, 0xf4, 0xef, 0xf4, + 0xfc, 0x00, 0xfb, 0xf9, 0xf9, 0xfb, 0xfb, 0xfd, 0x02, 0x01, 0xfd, 0xfc, + 0xf8, 0xf1, 0xf3, 0x04, 0x15, 0x09, 0x03, 0x04, 0x03, 0x04, 0x02, 0x0d, + 0x16, 0x12, 0x0d, 0x0a, 0x05, 0x03, 0x06, 0x0f, 0x12, 0x09, 0x06, 0x0b, + 0x1c, 0x13, 0x0c, 0x0b, 0x0b, 0x05, 0xfe, 0xfe, 0x03, 0x02, 0x00, 0x01, + 0x02, 0x01, 0x05, 0x04, 0xff, 0xff, 0xfc, 0x01, 0x06, 0x0a, 0x05, 0x02, + 0x03, 0x00, 0x03, 0x0f, 0x09, 0x03, 0x01, 0xff, 0xfb, 0xf4, 0xfc, 0x0c, + 0x09, 0x02, 0x00, 0xfa, 0xfb, 0xf6, 0xf7, 0xfd, 0xfd, 0xfa, 0xf6, 0xf7, + 0xf6, 0xf2, 0xf6, 0x00, 0x00, 0xfd, 0xfc, 0xfc, 0x05, 0x09, 0x07, 0x07, + 0x02, 0x00, 0xff, 0xfd, 0xfc, 0x00, 0x0c, 0x0e, 0x09, 0x06, 0x03, 0x09, + 0x0a, 0x09, 0x16, 0x16, 0x13, 0x11, 0x13, 0x12, 0x10, 0x0f, 0x13, 0x1c, + 0x18, 0x15, 0x11, 0x0f, 0x0c, 0x0a, 0x0d, 0x09, 0x02, 0x00, 0x00, 0xfb, + 0xf6, 0xf5, 0xf6, 0xf4, 0xf0, 0xed, 0xe7, 0xe2, 0xe7, 0xec, 0xf3, 0xf2, + 0xf2, 0xf5, 0xfc, 0xf7, 0xf9, 0x09, 0x0e, 0x07, 0x04, 0x02, 0x00, 0xfb, + 0xfb, 0x07, 0x1b, 0x18, 0x0f, 0x08, 0x01, 0xff, 0x09, 0x0a, 0x10, 0x16, + 0x13, 0x13, 0x14, 0x11, 0x11, 0x13, 0x10, 0x0f, 0x09, 0x06, 0x06, 0x02, + 0xfe, 0xfc, 0xf9, 0xf9, 0xf7, 0xf5, 0xf3, 0xf4, 0xf7, 0xf6, 0xf4, 0xf6, + 0xf8, 0xfa, 0xfb, 0xfa, 0xff, 0x04, 0x08, 0x04, 0x01, 0x02, 0x03, 0xfc, + 0x00, 0x1d, 0x21, 0x16, 0x0d, 0x0c, 0x0b, 0x08, 0x06, 0x04, 0x0f, 0x15, + 0x12, 0x0c, 0x07, 0x06, 0x07, 0x0c, 0x07, 0xfc, 0xfa, 0xfe, 0xff, 0xfe, + 0xfe, 0x07, 0x04, 0x01, 0xfe, 0xf8, 0xf8, 0xff, 0xfb, 0xf6, 0xf4, 0xf2, + 0xf2, 0xf3, 0xf6, 0xf9, 0xfc, 0x01, 0x04, 0x00, 0xfc, 0xfc, 0xf8, 0xf9, + 0x08, 0x18, 0x10, 0x0a, 0x04, 0x05, 0x0c, 0x0c, 0x06, 0x0d, 0x1e, 0x20, + 0x18, 0x16, 0x14, 0x17, 0x17, 0x0f, 0x05, 0xff, 0x02, 0x00, 0xf9, 0xf7, + 0xf4, 0xf7, 0xfc, 0xf9, 0xfb, 0xf7, 0xfb, 0x02, 0xfb, 0xf9, 0xfc, 0xfa, + 0xfb, 0xfc, 0xfc, 0xfc, 0x02, 0x07, 0x04, 0xfe, 0xf9, 0xf6, 0xf6, 0x00, + 0x1d, 0x1b, 0x0e, 0x08, 0x04, 0x06, 0x09, 0x03, 0xfa, 0xfc, 0x09, 0x0d, + 0x0b, 0x0a, 0x11, 0x16, 0x0f, 0x0b, 0x11, 0x10, 0x09, 0x07, 0x04, 0x00, + 0x02, 0x00, 0xfa, 0xf6, 0xf8, 0xfa, 0xfb, 0xf8, 0xf8, 0xf2, 0xf5, 0x01, + 0x02, 0x04, 0x05, 0x10, 0x11, 0x07, 0x06, 0x00, 0xfc, 0xfc, 0x00, 0x0b, + 0x14, 0x0c, 0x02, 0xfd, 0xfd, 0xfc, 0xfb, 0xf9, 0xf8, 0xfd, 0x0a, 0x06, + 0x00, 0x02, 0x07, 0x06, 0x03, 0x00, 0xfe, 0xfa, 0xfa, 0xf9, 0xfd, 0x05, + 0x05, 0x02, 0x05, 0x08, 0x05, 0x0c, 0x0a, 0x08, 0x05, 0x03, 0x02, 0xfe, + 0xfe, 0x01, 0x04, 0x10, 0x0a, 0x06, 0x03, 0x03, 0x07, 0x03, 0x09, 0x1b, + 0x1e, 0x16, 0x10, 0x0b, 0x08, 0x06, 0x05, 0x06, 0x07, 0x07, 0x0d, 0x0a, + 0x06, 0x08, 0x08, 0x05, 0x01, 0x00, 0xfc, 0xf4, 0xef, 0xf1, 0xf4, 0xf0, + 0xf1, 0xf3, 0xf2, 0xf2, 0xf2, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xfc, 0x05, + 0x02, 0x01, 0x04, 0x08, 0x05, 0x05, 0x00, 0xfb, 0xfe, 0x01, 0x0d, 0x1c, + 0x13, 0x0a, 0x06, 0x0a, 0x0c, 0x13, 0x12, 0x10, 0x0d, 0x0f, 0x13, 0x16, + 0x11, 0x15, 0x16, 0x15, 0x0f, 0x0d, 0x09, 0x01, 0x00, 0x00, 0xfd, 0xfb, + 0xfd, 0xfe, 0xfe, 0xfe, 0xf9, 0xf2, 0xf5, 0xff, 0x01, 0xf7, 0xf1, 0xf5, + 0xfa, 0xfd, 0x05, 0x08, 0x00, 0x00, 0xfc, 0xfe, 0x0a, 0x07, 0x15, 0x12, + 0x0b, 0x07, 0x05, 0x01, 0xfc, 0xfb, 0xfa, 0xfa, 0xf8, 0xf9, 0x07, 0x0a, + 0x03, 0x03, 0x08, 0x09, 0x06, 0x06, 0x03, 0xfc, 0xfb, 0xfd, 0x00, 0x03, + 0x04, 0x03, 0x05, 0xfc, 0xf9, 0xfa, 0xfd, 0xfb, 0xfa, 0xfb, 0xfe, 0xff, + 0xfe, 0xf9, 0xfe, 0x04, 0x09, 0x0b, 0x06, 0x07, 0x05, 0x0a, 0x1c, 0x14, + 0x0d, 0x0f, 0x0e, 0x0d, 0x15, 0x16, 0x15, 0x10, 0x0f, 0x10, 0x14, 0x18, + 0x16, 0x12, 0x0b, 0x07, 0x04, 0x00, 0xfa, 0xf7, 0xf7, 0xf6, 0xef, 0xf1, + 0xfa, 0xfe, 0xfe, 0xf7, 0xf5, 0xf6, 0xf2, 0xef, 0xf1, 0xfa, 0xfe, 0xf8, + 0xf1, 0xed, 0xf2, 0xf6, 0xfa, 0xfa, 0xfb, 0xfb, 0xfa, 0x0c, 0x0f, 0x0b, + 0x0e, 0x10, 0x0e, 0x07, 0x05, 0x05, 0x06, 0x05, 0x05, 0x07, 0x0f, 0x12, + 0x14, 0x1e, 0x1b, 0x14, 0x0e, 0x0a, 0x05, 0x02, 0x04, 0x03, 0xff, 0xfd, + 0xff, 0x01, 0xfe, 0xfd, 0x00, 0xfe, 0xfc, 0xfb, 0x04, 0x09, 0x07, 0x05, + 0x06, 0x02, 0x05, 0x08, 0x07, 0x06, 0x07, 0x03, 0x01, 0x0e, 0x0d, 0x05, + 0x04, 0x05, 0x01, 0x00, 0xfc, 0xf8, 0xfa, 0xf8, 0xf8, 0x02, 0x0e, 0x01, + 0xfe, 0xfa, 0xfe, 0x02, 0xff, 0xfb, 0xf5, 0xf2, 0xfc, 0x09, 0x0f, 0x0b, + 0x0a, 0x03, 0xff, 0xff, 0xfe, 0xfc, 0xf8, 0xf9, 0xfb, 0xff, 0xff, 0xfd, + 0xfa, 0xfd, 0x02, 0x01, 0x03, 0x10, 0x0e, 0x08, 0x12, 0x1e, 0x17, 0x0f, + 0x0e, 0x0e, 0x11, 0x0e, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x06, 0x12, 0x11, + 0x0c, 0x06, 0x05, 0x00, 0xfc, 0xf8, 0xfb, 0xfe, 0xfe, 0xfc, 0xfb, 0xfd, + 0xf9, 0xfa, 0xf6, 0xf7, 0xfa, 0xf9, 0x00, 0x02, 0x00, 0x00, 0xff, 0xfc, + 0xfa, 0xfa, 0xfd, 0x00, 0x03, 0x02, 0xff, 0x03, 0x14, 0x13, 0x10, 0x0b, + 0x02, 0x03, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x06, 0x00, 0x06, 0x12, 0x12, + 0x0c, 0x07, 0x03, 0x02, 0xff, 0xfd, 0xfe, 0xff, 0xfe, 0xfc, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x02, 0xfb, 0xf5, 0xf4, 0xfa, 0x00, 0x00, 0xfe, 0xfd, + 0xfd, 0xfe, 0x06, 0x16, 0x11, 0x07, 0x02, 0x04, 0x14, 0x12, 0x09, 0x05, + 0x05, 0x04, 0x04, 0x04, 0xff, 0xfe, 0xf9, 0xf3, 0xf6, 0x03, 0x11, 0x14, + 0x0d, 0x04, 0x01, 0x04, 0x03, 0xfe, 0xfb, 0x06, 0x0c, 0x07, 0x0a, 0x06, + 0x02, 0x01, 0x00, 0x00, 0xfb, 0xfb, 0xfc, 0xfd, 0xff, 0xfe, 0xfa, 0xfa, + 0xfa, 0xf2, 0xfc, 0x06, 0x0b, 0x08, 0x05, 0x07, 0x13, 0x10, 0x0f, 0x13, + 0x1c, 0x14, 0x0a, 0x06, 0x03, 0x01, 0xff, 0x00, 0x05, 0x10, 0x12, 0x10, + 0x09, 0x07, 0x01, 0xfa, 0xf9, 0xf3, 0xf2, 0xfe, 0x01, 0xff, 0xfc, 0xfa, + 0xfc, 0xfc, 0xf9, 0xf7, 0xfa, 0xf6, 0xf3, 0xf2, 0xf8, 0xfa, 0xf6, 0xf4, + 0xf5, 0xf2, 0xfd, 0x05, 0x04, 0xfe, 0x00, 0x0e, 0x1a, 0x18, 0x13, 0x11, + 0x11, 0x0f, 0x10, 0x0c, 0x09, 0x06, 0x05, 0x05, 0x15, 0x23, 0x16, 0x11, + 0x0d, 0x0b, 0x0e, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x06, 0x03, 0xfe, + 0xfa, 0xf8, 0xef, 0xf0, 0x01, 0x03, 0xff, 0xfb, 0xf8, 0xf8, 0xfe, 0xfd, + 0xff, 0x00, 0xff, 0x03, 0x01, 0xfd, 0xfc, 0x05, 0x08, 0x03, 0x05, 0x04, + 0x00, 0xff, 0x00, 0xfc, 0xf7, 0xf5, 0xf3, 0xf4, 0x05, 0x0d, 0x05, 0x03, + 0x01, 0x01, 0xfe, 0xfd, 0xff, 0x07, 0x0d, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, + 0x0b, 0x06, 0x03, 0x02, 0x00, 0xfe, 0xfd, 0xfc, 0xfa, 0xf7, 0xf9, 0xf9, + 0x04, 0x0b, 0x0b, 0x15, 0x11, 0x07, 0x08, 0x1d, 0x21, 0x1b, 0x15, 0x0d, + 0x09, 0x09, 0x09, 0x05, 0x02, 0x01, 0x03, 0x07, 0x13, 0x0c, 0x08, 0x07, + 0x04, 0xff, 0xfb, 0xf8, 0xef, 0xf6, 0xfd, 0xfd, 0x01, 0xf9, 0xf4, 0xf7, + 0xf7, 0xf6, 0xfe, 0xfd, 0xf7, 0xf2, 0xf2, 0xf8, 0xfb, 0xf6, 0xf4, 0xf3, + 0xf5, 0xf8, 0xfd, 0x01, 0x00, 0xfb, 0x06, 0x17, 0x17, 0x1b, 0x14, 0x10, + 0x0b, 0x06, 0x03, 0x04, 0x09, 0x0a, 0x09, 0x13, 0x13, 0x0b, 0x07, 0x08, + 0x08, 0x05, 0x05, 0x07, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0xff, 0xff, + 0x03, 0x00, 0x03, 0x04, 0x07, 0x07, 0x01, 0xfd, 0xfd, 0xfb, 0xfb, 0x05, + 0x07, 0x02, 0x04, 0x0b, 0x0d, 0x08, 0x0c, 0x15, 0x0b, 0x01, 0x00, 0xfe, + 0xfb, 0xf9, 0xf8, 0xf4, 0xf6, 0xf8, 0x05, 0x0d, 0x05, 0xfe, 0xf7, 0xfa, + 0xfe, 0x02, 0x05, 0x01, 0xff, 0x00, 0x05, 0x08, 0x01, 0xff, 0x03, 0x05, + 0x04, 0x03, 0x00, 0xfb, 0xfc, 0xfc, 0xfb, 0xf8, 0xf4, 0xf4, 0xf4, 0xfe, + 0x04, 0x04, 0x07, 0x0e, 0x0d, 0x09, 0x0b, 0x18, 0x1b, 0x18, 0x13, 0x10, + 0x0e, 0x0b, 0x09, 0x06, 0x04, 0x04, 0x0e, 0x0a, 0x07, 0x05, 0x08, 0x06, + 0x04, 0x03, 0x07, 0x06, 0x09, 0x04, 0x01, 0xff, 0xfa, 0xfa, 0x06, 0x07, + 0xff, 0xfb, 0xfa, 0xf7, 0xf8, 0xfa, 0xf9, 0xf6, 0xf0, 0xee, 0xf0, 0xf6, + 0xf4, 0xf9, 0x02, 0x05, 0xff, 0x05, 0x0e, 0x14, 0x15, 0x14, 0x0f, 0x06, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x13, 0x18, 0x10, 0x0c, 0x07, 0x08, 0x09, + 0x07, 0x03, 0x02, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x01, 0x0a, 0x09, + 0x03, 0xfe, 0xfb, 0xfc, 0xfc, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0x04, 0x00, + 0xfc, 0x02, 0x07, 0x05, 0x04, 0x02, 0x02, 0x0b, 0x05, 0x01, 0x03, 0xfe, + 0xfd, 0xf9, 0xf8, 0xfe, 0x08, 0x12, 0x0b, 0x06, 0x03, 0xff, 0xfc, 0xfa, + 0xf9, 0xfb, 0x0c, 0x0d, 0x0c, 0x10, 0x11, 0x0f, 0x0d, 0x0b, 0x02, 0xfd, + 0xfb, 0xfd, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xf7, 0xfb, 0x00, 0xfc, + 0xff, 0x00, 0x09, 0x15, 0x15, 0x0d, 0x0c, 0x14, 0x0f, 0x0e, 0x0a, 0x01, + 0x00, 0x00, 0x02, 0x02, 0x0a, 0x0a, 0x06, 0x05, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xfc, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfd, 0x03, + 0x05, 0x01, 0xfe, 0xfc, 0xfc, 0xf9, 0xef, 0xee, 0xf1, 0xf4, 0xf6, 0xfc, + 0xff, 0xfe, 0x09, 0x13, 0x0c, 0x0e, 0x19, 0x21, 0x19, 0x12, 0x0c, 0x09, + 0x08, 0x0e, 0x0d, 0x12, 0x13, 0x0e, 0x09, 0x07, 0x06, 0x08, 0x06, 0x03, + 0x00, 0x02, 0x05, 0x05, 0x03, 0x04, 0x03, 0x06, 0x08, 0x01, 0xfa, 0xfa, + 0xf9, 0xf9, 0xf9, 0xf7, 0xf7, 0xf6, 0xf6, 0xf6, 0x06, 0x0d, 0x08, 0x01, + 0xfc, 0xfb, 0x00, 0xff, 0xfa, 0xfb, 0x06, 0x12, 0x08, 0xfb, 0xfe, 0x03, + 0x00, 0x01, 0x09, 0x06, 0x03, 0xff, 0xfe, 0x02, 0x00, 0x06, 0x08, 0x04, + 0x05, 0x03, 0x03, 0x01, 0x08, 0x10, 0x0d, 0x09, 0x06, 0x03, 0xfe, 0xfc, + 0xfd, 0xfe, 0xfc, 0xff, 0xfe, 0xfd, 0xfe, 0x02, 0x08, 0x07, 0x06, 0x03, + 0xff, 0x02, 0x0c, 0x08, 0x04, 0x0f, 0x1c, 0x1f, 0x14, 0x0b, 0x06, 0x00, + 0x00, 0x06, 0x08, 0x0b, 0x0d, 0x08, 0x08, 0x0e, 0x0f, 0x0c, 0x09, 0xfc, + 0xf6, 0xf6, 0xf8, 0xfe, 0x01, 0x02, 0x06, 0x06, 0x02, 0xff, 0xfb, 0xf6, + 0xf6, 0xf6, 0xf2, 0xed, 0xef, 0xf3, 0xf8, 0xfa, 0xf1, 0xeb, 0xed, 0xf5, + 0xfb, 0xfe, 0x05, 0x05, 0x05, 0x07, 0x14, 0x17, 0x0c, 0x09, 0x07, 0x05, + 0x0c, 0x0e, 0x17, 0x16, 0x0f, 0x0a, 0x07, 0x05, 0x07, 0x07, 0x06, 0x09, + 0x09, 0x04, 0x07, 0x0e, 0x11, 0x0d, 0x0c, 0x09, 0x05, 0x02, 0x01, 0x03, + 0x00, 0xfb, 0xfc, 0x02, 0x03, 0x04, 0x08, 0x04, 0x02, 0x00, 0x00, 0xfb, + 0xf8, 0xfd, 0x00, 0x00, 0xfe, 0xfc, 0x03, 0x08, 0x03, 0x04, 0x06, 0x0f, + 0xfe, 0xf5, 0xf8, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfb, 0xfa, 0x09, + 0x0a, 0x01, 0xfd, 0xff, 0x04, 0x07, 0x0a, 0x07, 0xff, 0xfa, 0x01, 0x06, + 0x02, 0x00, 0xfd, 0xf9, 0xfe, 0x05, 0x04, 0x06, 0x06, 0x06, 0x07, 0x08, + 0x0d, 0x13, 0x12, 0x0e, 0x09, 0x07, 0x10, 0x11, 0x0a, 0x09, 0x0d, 0x0a, + 0x07, 0x04, 0x01, 0x01, 0x02, 0x06, 0x0b, 0x0d, 0x08, 0x03, 0x02, 0x02, + 0xfe, 0xfe, 0xfc, 0xfd, 0xff, 0xf9, 0xf5, 0xf8, 0x01, 0x07, 0xfe, 0xf5, + 0xf2, 0xf2, 0xf0, 0xf5, 0x00, 0xff, 0x03, 0x04, 0x01, 0x02, 0x01, 0xff, + 0xfb, 0xfe, 0x00, 0x05, 0x06, 0x0a, 0x15, 0x15, 0x17, 0x1e, 0x18, 0x11, + 0x0f, 0x0d, 0x05, 0x01, 0x02, 0x07, 0x0b, 0x08, 0x01, 0xfc, 0x00, 0x02, + 0x01, 0x00, 0x02, 0x05, 0x04, 0x03, 0xff, 0xfb, 0xfa, 0xfd, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf7, 0xff, 0x03, 0x0a, 0x08, 0x02, 0x00, 0xfc, 0xf9, 0xfc, + 0x01, 0x02, 0x09, 0x06, 0x01, 0x02, 0x0f, 0x14, 0x16, 0x0b, 0x08, 0x0b, + 0x0d, 0x06, 0x00, 0xfb, 0x03, 0x0b, 0x0b, 0x04, 0x03, 0x03, 0x07, 0x04, + 0x02, 0x01, 0x02, 0x00, 0x03, 0x06, 0x04, 0xff, 0xfc, 0xfd, 0xff, 0x00, + 0xfb, 0xfb, 0x02, 0xfc, 0xf5, 0xfa, 0x03, 0x04, 0x04, 0xff, 0xff, 0x03, + 0x03, 0x03, 0x09, 0x04, 0xff, 0x01, 0x14, 0x13, 0x0a, 0x08, 0x0f, 0x0e, + 0x0a, 0x08, 0x04, 0x00, 0x05, 0x08, 0x07, 0x08, 0x09, 0x05, 0x07, 0x02, + 0x02, 0x04, 0x02, 0x06, 0x06, 0x07, 0x04, 0xfe, 0xfa, 0xf7, 0xf4, 0xf3, + 0xf0, 0xf5, 0xfd, 0xfa, 0xf5, 0xf5, 0xfb, 0xfd, 0xfe, 0xfa, 0xfc, 0x02, + 0xfe, 0xfe, 0x02, 0x01, 0x06, 0x14, 0x19, 0x0e, 0x08, 0x08, 0x0f, 0x16, + 0x0f, 0x07, 0x05, 0x0a, 0x0f, 0x11, 0x10, 0x0d, 0x0c, 0x10, 0x14, 0x0c, + 0x00, 0xfd, 0x03, 0x0a, 0x02, 0xfe, 0x00, 0xfc, 0xfd, 0x01, 0x00, 0x00, + 0x06, 0x0a, 0x05, 0x01, 0xfd, 0xfd, 0xf8, 0xf3, 0xf1, 0xf4, 0xfa, 0xf8, + 0xf4, 0xf4, 0xf9, 0xfa, 0x05, 0x10, 0x0e, 0x06, 0x02, 0x01, 0x00, 0xff, + 0xff, 0xfa, 0xfc, 0xfd, 0xfe, 0xfb, 0x00, 0x05, 0x08, 0x06, 0x09, 0x04, + 0x03, 0x08, 0x07, 0x0b, 0x0d, 0x09, 0x04, 0xfe, 0xfe, 0x00, 0x02, 0x0a, + 0x14, 0x10, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x04, 0x07, 0x0d, 0x0b, 0x08, + 0x05, 0x05, 0x05, 0x08, 0x08, 0x12, 0x0e, 0x09, 0x08, 0x08, 0x09, 0x04, + 0xfd, 0x00, 0x04, 0x01, 0x00, 0xfd, 0xf6, 0xf8, 0x00, 0x05, 0x03, 0xfc, + 0xf7, 0xf9, 0xf7, 0xf7, 0x01, 0xfb, 0xf1, 0xf2, 0xfb, 0xfb, 0xfc, 0x03, + 0x00, 0xfb, 0xfa, 0xf7, 0xf9, 0xfb, 0xfa, 0xfe, 0x08, 0x07, 0x02, 0xfc, + 0xfb, 0x07, 0x0f, 0x12, 0x1b, 0x20, 0x19, 0x17, 0x15, 0x12, 0x0f, 0x07, + 0x03, 0x00, 0x00, 0x04, 0x07, 0x06, 0x06, 0x05, 0x05, 0x08, 0x09, 0x06, + 0x01, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xf7, 0xf6, 0xf3, 0xf8, 0xff, 0x00, + 0x03, 0x0c, 0x08, 0x08, 0x0e, 0x0a, 0x06, 0x06, 0x05, 0x02, 0xff, 0x00, + 0x07, 0x06, 0x03, 0x07, 0x14, 0x13, 0x09, 0x03, 0x02, 0x02, 0x05, 0x07, + 0x02, 0xfe, 0x01, 0x05, 0x02, 0xfb, 0xf9, 0xf7, 0xf4, 0xf5, 0xfb, 0xfa, + 0xf8, 0xfa, 0x01, 0x04, 0xfc, 0xf9, 0xf8, 0xfb, 0x00, 0x04, 0x07, 0x03, + 0x01, 0xff, 0x02, 0x00, 0xff, 0xfe, 0x04, 0x03, 0x00, 0x02, 0x13, 0x1a, + 0x16, 0x0f, 0x09, 0x0a, 0x13, 0x11, 0x0d, 0x0c, 0x0d, 0x09, 0x0c, 0x0f, + 0x0e, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x09, 0x06, 0x06, 0x09, 0x08, 0x05, + 0x04, 0x00, 0x00, 0xfc, 0xf8, 0xf7, 0xf7, 0xf7, 0xfa, 0xfe, 0x02, 0xfd, + 0xf8, 0xf8, 0xf7, 0xf6, 0xfa, 0xfd, 0xfc, 0xf2, 0xf2, 0xfb, 0xfd, 0xfe, + 0xfb, 0xfb, 0x02, 0x07, 0x08, 0x04, 0x12, 0x1e, 0x14, 0x11, 0x0b, 0x05, + 0x05, 0x05, 0x02, 0x01, 0x04, 0x07, 0x05, 0x07, 0x09, 0x0a, 0x09, 0x02, + 0xff, 0xfe, 0x03, 0x01, 0x01, 0x01, 0x04, 0x08, 0x07, 0x0b, 0x0a, 0x07, + 0x02, 0xfd, 0xf9, 0xfb, 0xff, 0x04, 0x03, 0x05, 0x08, 0x00, 0xfd, 0xfd, + 0xfe, 0x00, 0x01, 0x09, 0x07, 0x05, 0x06, 0x02, 0x01, 0xfe, 0xfb, 0xfa, + 0xfc, 0xfc, 0x06, 0x12, 0x10, 0x0d, 0x06, 0x02, 0x03, 0x04, 0x01, 0xf9, + 0xf9, 0x04, 0x0a, 0x09, 0x0b, 0x0b, 0x0b, 0x05, 0x00, 0x03, 0x07, 0x08, + 0x08, 0x04, 0x01, 0x05, 0x07, 0x03, 0x08, 0x05, 0x00, 0xfd, 0xfa, 0xf8, + 0xf9, 0xfd, 0x07, 0x0e, 0x04, 0x02, 0x00, 0xff, 0x01, 0x01, 0xff, 0xfe, + 0xfc, 0xf8, 0xfa, 0xff, 0xff, 0xfe, 0xfc, 0xfd, 0xfd, 0x00, 0x04, 0x07, + 0x0a, 0x09, 0x08, 0x02, 0x02, 0x05, 0x00, 0xfd, 0xfe, 0x04, 0x07, 0x0c, + 0x0a, 0x07, 0x05, 0x02, 0x02, 0x0a, 0x09, 0x05, 0x05, 0x03, 0x03, 0x04, + 0x08, 0x0f, 0x1c, 0x1b, 0x12, 0x11, 0x0d, 0x06, 0x09, 0x0b, 0x08, 0x01, + 0xfc, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0x03, 0xff, 0xf8, 0xf7, 0xf8, + 0xf9, 0xf5, 0xf2, 0xf2, 0xfb, 0xfd, 0x00, 0x00, 0x06, 0x07, 0x08, 0x04, + 0x02, 0x04, 0x05, 0x08, 0x0d, 0x02, 0x01, 0x07, 0x08, 0x05, 0x01, 0xff, + 0xff, 0x06, 0x10, 0x0a, 0x0a, 0x07, 0x08, 0x07, 0x07, 0x07, 0x04, 0x00, + 0xfd, 0xfd, 0xfc, 0xf7, 0xf8, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf9, 0xfc, + 0x00, 0x02, 0x00, 0x04, 0x06, 0x03, 0x01, 0x04, 0x08, 0x02, 0xff, 0x04, + 0x09, 0x0f, 0x12, 0x15, 0x14, 0x15, 0x12, 0x10, 0x0e, 0x0a, 0x08, 0x05, + 0x00, 0x0b, 0x11, 0x17, 0x18, 0x15, 0x0d, 0x06, 0x05, 0x03, 0xfe, 0xfc, + 0xfb, 0xff, 0xfd, 0xfd, 0xfa, 0xfc, 0xfc, 0xf7, 0xf4, 0xf7, 0xfa, 0xf8, + 0xf3, 0xf6, 0xf9, 0xfa, 0xfb, 0xf7, 0xf1, 0xf2, 0xfc, 0xf9, 0xf8, 0xfb, + 0xfd, 0xfe, 0x02, 0x00, 0xfb, 0xfc, 0xfc, 0xfd, 0xfb, 0x00, 0x05, 0x09, + 0x11, 0x25, 0x1f, 0x18, 0x16, 0x13, 0x0e, 0x0b, 0x07, 0x08, 0x06, 0x0c, + 0x10, 0x0a, 0x03, 0x02, 0x04, 0x06, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, + 0x05, 0x0c, 0x0e, 0x0b, 0x04, 0xfe, 0xfe, 0x02, 0x05, 0x06, 0x08, 0x02, + 0x05, 0x0c, 0x09, 0x03, 0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfa, 0xf5, 0xf7, + 0x01, 0xff, 0xfe, 0xfe, 0xfd, 0x00, 0xff, 0xff, 0xfc, 0x03, 0x02, 0xfc, + 0xfa, 0xf8, 0xf8, 0xf9, 0xf7, 0xf6, 0xfa, 0xff, 0x01, 0x03, 0x04, 0x03, + 0x0c, 0x11, 0x0c, 0x08, 0x02, 0x01, 0x02, 0x0a, 0x11, 0x0e, 0x0c, 0x0c, + 0x12, 0x10, 0x0c, 0x09, 0x07, 0x09, 0x05, 0x02, 0xff, 0x00, 0x04, 0x0a, + 0x0b, 0x05, 0x02, 0x02, 0x01, 0x00, 0xff, 0xfd, 0x01, 0x02, 0x00, 0x02, + 0x00, 0x05, 0x05, 0x01, 0xfd, 0x04, 0x0a, 0x04, 0x02, 0x05, 0x01, 0x02, + 0x08, 0x05, 0x00, 0x00, 0x03, 0x04, 0x08, 0x0e, 0x0f, 0x08, 0x02, 0x01, + 0x01, 0xfe, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xfb, 0xfb, 0x01, 0x09, 0x0f, + 0x0b, 0x07, 0x04, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0xf9, 0xf5, 0xf6, + 0xf8, 0xf9, 0xfa, 0xfa, 0xfb, 0xff, 0xff, 0xff, 0x00, 0x04, 0x02, 0x0b, + 0x09, 0x08, 0x0d, 0x07, 0x03, 0x02, 0x09, 0x0a, 0x08, 0x08, 0x0f, 0x14, + 0x12, 0x0a, 0x08, 0x0c, 0x0b, 0x05, 0x04, 0x04, 0x01, 0x02, 0x12, 0x14, + 0x0c, 0x07, 0x06, 0x06, 0x09, 0x0b, 0x05, 0x00, 0xff, 0xfe, 0xf9, 0xf5, + 0xf5, 0xf4, 0xf7, 0xf6, 0xf5, 0xf6, 0xf7, 0xf7, 0xfd, 0xfe, 0x03, 0xff, + 0xfd, 0xfb, 0xf6, 0xf7, 0x02, 0x0b, 0x07, 0x02, 0x01, 0x0a, 0x12, 0x12, + 0x09, 0x04, 0x0a, 0x0c, 0x07, 0x06, 0x09, 0x06, 0x08, 0x0f, 0x15, 0x11, + 0x0a, 0x08, 0x07, 0x03, 0x00, 0x01, 0x00, 0x03, 0x06, 0x03, 0x01, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xf8, 0xf8, 0xfa, 0xfb, 0x00, 0x03, 0xfe, + 0xfa, 0xf4, 0xf6, 0xff, 0xfe, 0xfb, 0xf8, 0xfa, 0x02, 0x08, 0x08, 0x05, + 0x02, 0x0b, 0x0b, 0x03, 0x04, 0x06, 0x0c, 0x12, 0x12, 0x1a, 0x18, 0x16, + 0x0d, 0x0c, 0x0e, 0x0b, 0x0c, 0x0b, 0x0f, 0x0f, 0x0b, 0x06, 0x03, 0xfc, + 0xf7, 0xfa, 0xfb, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0x01, 0x07, 0x06, 0x02, + 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf7, 0xf8, 0x04, 0x09, 0x05, 0x00, 0xfb, + 0xfa, 0xfb, 0xfc, 0xfc, 0xf8, 0xf8, 0xfa, 0xff, 0x08, 0x0a, 0x0d, 0x09, + 0x04, 0x03, 0x0a, 0x10, 0x08, 0x02, 0xff, 0x02, 0x01, 0x00, 0xfa, 0xf7, + 0xf9, 0xff, 0x00, 0xff, 0x01, 0x00, 0x06, 0x06, 0x0f, 0x12, 0x11, 0x0f, + 0x10, 0x10, 0x09, 0x07, 0x07, 0x07, 0x0c, 0x16, 0x14, 0x0c, 0x09, 0x0a, + 0x09, 0x07, 0x09, 0x07, 0x02, 0x00, 0x00, 0x0b, 0x0a, 0x06, 0x02, 0xf9, + 0xf2, 0xf6, 0xf3, 0xf2, 0xf6, 0xfb, 0x01, 0x00, 0xff, 0xfd, 0xf8, 0xfe, + 0xfa, 0xf7, 0xf6, 0xf8, 0xfa, 0xfc, 0xfb, 0x04, 0x06, 0x08, 0x09, 0x09, + 0x05, 0x04, 0x03, 0xfe, 0xfb, 0xfd, 0x08, 0x0e, 0x09, 0x09, 0x04, 0x03, + 0x06, 0x06, 0x04, 0x04, 0x08, 0x08, 0x0d, 0x12, 0x0d, 0x0a, 0x04, 0xff, + 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfd, 0x00, 0xfe, 0xfd, 0xfc, 0xfc, 0xfe, + 0xff, 0x03, 0x0a, 0x08, 0x07, 0x04, 0x08, 0x17, 0x12, 0x0b, 0x0d, 0x0b, + 0x0a, 0x04, 0xff, 0xfe, 0xff, 0x0e, 0x19, 0x14, 0x0f, 0x09, 0x09, 0x03, + 0xff, 0xff, 0xfc, 0xf8, 0xf9, 0x01, 0x07, 0x03, 0x01, 0xff, 0xfc, 0xfb, + 0xff, 0x02, 0xff, 0xfb, 0xf4, 0xf0, 0xf3, 0xf8, 0xf8, 0xf3, 0xef, 0xef, + 0xef, 0xf3, 0xf6, 0xf6, 0xf5, 0xf6, 0x03, 0x09, 0x0b, 0x0c, 0x0d, 0x0d, + 0x0c, 0x08, 0x07, 0x0b, 0x0d, 0x13, 0x14, 0x11, 0x12, 0x11, 0x0d, 0x0c, + 0x0d, 0x0f, 0x14, 0x0d, 0x0b, 0x12, 0x14, 0x10, 0x0e, 0x0c, 0x09, 0x05, + 0x04, 0x02, 0x03, 0x06, 0x04, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0xfe, 0xff, + 0xfc, 0xf4, 0xf1, 0xf3, 0xf3, 0xf9, 0x02, 0x01, 0xff, 0x02, 0x03, 0xfc, + 0xf2, 0xee, 0xec, 0xec, 0xf2, 0x01, 0x02, 0x03, 0x05, 0x04, 0x02, 0x08, + 0x05, 0x02, 0x03, 0x03, 0x0f, 0x12, 0x0f, 0x10, 0x0e, 0x0b, 0x0a, 0x06, + 0x04, 0x03, 0x05, 0x04, 0x03, 0x03, 0x06, 0x06, 0x05, 0x03, 0x01, 0x05, + 0x02, 0x00, 0x03, 0x02, 0x00, 0x0b, 0x11, 0x11, 0x05, 0x00, 0xfb, 0xf8, + 0xf6, 0xf6, 0xf7, 0xfb, 0x07, 0x0e, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0xff, 0x0b, 0x15, 0x0d, 0x08, 0x10, 0x0f, 0x08, 0x07, 0x08, + 0x07, 0x07, 0xfe, 0xfb, 0xfc, 0xfd, 0x02, 0x04, 0xfe, 0xfb, 0xfc, 0xfe, + 0xfb, 0xff, 0xfe, 0xfc, 0x02, 0x0c, 0x0d, 0x09, 0x05, 0x02, 0xfe, 0xfc, + 0xfb, 0xfc, 0xfe, 0x05, 0x0e, 0x0a, 0x06, 0x08, 0x09, 0x06, 0x03, 0x02, + 0x04, 0x04, 0x0a, 0x0b, 0x04, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfb, 0xfe, + 0x03, 0x06, 0x04, 0x0c, 0x0e, 0x07, 0x04, 0x00, 0xfe, 0xfc, 0xf8, 0xf9, + 0xfc, 0xfd, 0xfd, 0x00, 0x0a, 0x0d, 0x06, 0x06, 0x09, 0x0b, 0x0d, 0x0a, + 0x03, 0x02, 0x02, 0x09, 0x10, 0x0b, 0x04, 0x06, 0x06, 0x04, 0x05, 0x0c, + 0x0b, 0x0e, 0x0f, 0x09, 0x05, 0x03, 0x02, 0x04, 0x06, 0x02, 0xff, 0xfa, + 0xf6, 0xf5, 0xf2, 0xf2, 0xf5, 0xf8, 0xfb, 0xfd, 0xfb, 0xfb, 0x00, 0x0b, + 0x08, 0x02, 0xfe, 0x02, 0x0f, 0x0e, 0x06, 0x02, 0x02, 0x03, 0x02, 0xfe, + 0x03, 0x01, 0x02, 0x08, 0x0f, 0x0d, 0x0c, 0x0c, 0x09, 0x04, 0x01, 0x04, + 0x0c, 0x0c, 0x06, 0x02, 0x04, 0x05, 0x02, 0x01, 0x01, 0xff, 0xfd, 0xf8, + 0xf7, 0xf7, 0xf4, 0xf4, 0xf8, 0xfa, 0xf9, 0xf7, 0xf7, 0xfb, 0xff, 0xf8, + 0xf8, 0xfd, 0x01, 0x13, 0x16, 0x0e, 0x0e, 0x19, 0x15, 0x0f, 0x0c, 0x0c, + 0x0e, 0x0d, 0x0b, 0x0a, 0x12, 0x16, 0x10, 0x0b, 0x0e, 0x0e, 0x0b, 0x0e, + 0x0e, 0x09, 0x06, 0x09, 0x09, 0x05, 0xff, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, + 0xf7, 0xf7, 0xf6, 0xf7, 0xf9, 0xf6, 0xf7, 0xf5, 0xf4, 0xf3, 0xf2, 0xf2, + 0xf1, 0xf3, 0xfe, 0x05, 0x02, 0xff, 0xfa, 0xf7, 0xfc, 0x00, 0xfe, 0x00, + 0x00, 0xfd, 0xfc, 0x13, 0x1d, 0x15, 0x0e, 0x0b, 0x0f, 0x0c, 0x0e, 0x11, + 0x0d, 0x11, 0x0f, 0x0b, 0x0a, 0x0f, 0x0a, 0x08, 0x08, 0x05, 0x06, 0x07, + 0x07, 0x06, 0x04, 0x08, 0x0a, 0x07, 0x04, 0x09, 0x06, 0xff, 0xfe, 0xff, + 0xff, 0x03, 0x0f, 0x0e, 0x04, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xf6, + 0xf4, 0xf3, 0xf3, 0xfe, 0x02, 0xfe, 0xfc, 0xfc, 0xf9, 0x00, 0x04, 0x08, + 0x08, 0x08, 0x07, 0x0a, 0x04, 0x01, 0x01, 0x00, 0xff, 0xfe, 0xfc, 0xf9, + 0xf7, 0xfc, 0x00, 0xfd, 0xfb, 0xfe, 0x06, 0x09, 0x04, 0x02, 0x01, 0x02, + 0x05, 0x09, 0x12, 0x11, 0x0d, 0x0a, 0x08, 0x07, 0x04, 0xfd, 0xfb, 0x01, + 0xff, 0xff, 0x07, 0x12, 0x11, 0x0b, 0x07, 0x08, 0x0f, 0x11, 0x08, 0x02, + 0x00, 0x04, 0x06, 0x05, 0x04, 0x04, 0x04, 0x0a, 0x06, 0x08, 0x09, 0x08, + 0x08, 0x06, 0x04, 0xfe, 0xfb, 0xff, 0xf7, 0xf3, 0xf2, 0xf3, 0xfa, 0xfa, + 0xfc, 0x02, 0x08, 0x03, 0x07, 0x07, 0x04, 0x04, 0x00, 0xf8, 0xf9, 0xfa, + 0xf7, 0xf7, 0xf9, 0x02, 0x04, 0x04, 0x0a, 0x0f, 0x0e, 0x08, 0x09, 0x07, + 0x06, 0x08, 0x05, 0x01, 0x02, 0x01, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0x01, + 0x05, 0x02, 0x05, 0x0f, 0x0d, 0x09, 0x0c, 0x0e, 0x05, 0xfe, 0xfa, 0xff, + 0x03, 0x0c, 0x0d, 0x03, 0x02, 0x03, 0x04, 0x09, 0x08, 0x08, 0x05, 0x02, + 0x00, 0x03, 0x09, 0x0e, 0x0d, 0x07, 0x0a, 0x10, 0x09, 0x05, 0x03, 0x01, + 0x02, 0x00, 0x02, 0x03, 0x01, 0xff, 0xfe, 0xfb, 0xfa, 0xfa, 0xf8, 0xf1, + 0xf0, 0xf2, 0xf6, 0xf5, 0xf8, 0xfd, 0xfc, 0xf9, 0xf9, 0xf7, 0x00, 0x0a, + 0x05, 0x0c, 0x0f, 0x11, 0x13, 0x0c, 0x03, 0x01, 0x02, 0x01, 0x05, 0x05, + 0x02, 0x03, 0x08, 0x11, 0x19, 0x19, 0x18, 0x15, 0x0e, 0x0a, 0x0b, 0x0c, + 0x0b, 0x0b, 0x07, 0x04, 0x03, 0x04, 0x04, 0xfe, 0xf7, 0xf3, 0xf6, 0xf7, + 0xf9, 0x00, 0xfb, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf1, 0xf3, 0xf7, 0xfb, + 0xfc, 0x04, 0x03, 0x03, 0x04, 0x00, 0x02, 0x0d, 0x09, 0x09, 0x0a, 0x04, + 0x04, 0x0c, 0x0e, 0x13, 0x1b, 0x1d, 0x17, 0x0e, 0x03, 0x02, 0x06, 0x02, + 0x06, 0x0c, 0x07, 0x05, 0x05, 0x05, 0x05, 0x04, 0x01, 0x02, 0x06, 0x09, + 0x04, 0xfb, 0xfb, 0xfd, 0xfa, 0xf6, 0xf6, 0xf7, 0xfa, 0xff, 0x02, 0x00, + 0x06, 0x0b, 0x07, 0x05, 0x04, 0xfe, 0xfd, 0xfc, 0xfa, 0xfa, 0xfa, 0xf6, + 0xf9, 0xfd, 0x02, 0x12, 0x1a, 0x19, 0x11, 0x08, 0x01, 0x03, 0x06, 0x01, + 0x01, 0x01, 0xff, 0xfa, 0xfc, 0xfc, 0xfe, 0xfe, 0xfd, 0x04, 0x0c, 0x05, + 0x03, 0x05, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x04, 0x06, 0x07, 0x07, + 0x0d, 0x0e, 0x09, 0x06, 0x05, 0x0a, 0x08, 0x07, 0x08, 0x02, 0xfb, 0xfa, + 0xfb, 0xfa, 0x03, 0x10, 0x0f, 0x0c, 0x08, 0x05, 0x03, 0x03, 0x05, 0x0b, + 0x0b, 0x0c, 0x06, 0x00, 0xff, 0x00, 0xfd, 0x00, 0xfe, 0xfd, 0xf9, 0xf6, + 0xf4, 0xf6, 0xf7, 0xf6, 0xf7, 0xfa, 0xfe, 0x00, 0xfd, 0xfe, 0x01, 0x04, + 0x0d, 0x0a, 0x04, 0x03, 0x05, 0x06, 0x01, 0xfe, 0xff, 0xfb, 0xfb, 0xff, + 0x01, 0x07, 0x15, 0x18, 0x13, 0x0e, 0x0a, 0x07, 0x07, 0x06, 0x08, 0x05, + 0x04, 0x06, 0x05, 0x04, 0x03, 0x02, 0x07, 0x14, 0x16, 0x11, 0x0e, 0x0a, + 0x02, 0x02, 0x00, 0x00, 0x06, 0x02, 0xfe, 0xfc, 0xff, 0x06, 0xfe, 0xfa, + 0x03, 0x00, 0xfc, 0x06, 0x07, 0x02, 0x00, 0xff, 0xfc, 0xf9, 0xf6, 0xf5, + 0xfa, 0x09, 0x09, 0x05, 0x01, 0x00, 0xff, 0xf8, 0xf7, 0xfd, 0xff, 0xfe, + 0x01, 0xff, 0xfd, 0xfd, 0xff, 0x05, 0x08, 0x05, 0x01, 0x00, 0x02, 0x04, + 0x01, 0x02, 0x03, 0x0d, 0x0f, 0x09, 0x05, 0x05, 0x06, 0x0a, 0x07, 0x07, + 0x0e, 0x0a, 0x05, 0x02, 0x02, 0x02, 0x07, 0x02, 0x00, 0xff, 0xff, 0x04, + 0x11, 0x14, 0x17, 0x1a, 0x12, 0x0c, 0x07, 0x05, 0x06, 0x0a, 0x09, 0x06, + 0x04, 0x01, 0x00, 0x00, 0x02, 0x05, 0x00, 0xfe, 0xff, 0xfc, 0xf8, 0xee, + 0xeb, 0xf0, 0xf2, 0xf5, 0xf7, 0xf2, 0xef, 0xf5, 0xfb, 0xfc, 0xff, 0x09, + 0x0f, 0x0a, 0x04, 0x02, 0xff, 0x00, 0x01, 0xfd, 0xfb, 0xfe, 0x00, 0x05, + 0x0c, 0x0b, 0x10, 0x10, 0x0e, 0x0a, 0x08, 0x07, 0x08, 0x0f, 0x10, 0x0f, + 0x0b, 0x09, 0x08, 0x0b, 0x11, 0x0b, 0x06, 0x03, 0x02, 0x01, 0xff, 0xfe, + 0xff, 0x00, 0xff, 0x00, 0x01, 0xfb, 0xfb, 0xfe, 0x03, 0x03, 0xfe, 0x03, + 0x10, 0x06, 0x04, 0x06, 0xff, 0xf9, 0xfa, 0x04, 0x06, 0x02, 0x04, 0x09, + 0x09, 0x0e, 0x0d, 0x08, 0x04, 0xff, 0xfd, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, + 0xf7, 0xf3, 0xf6, 0xff, 0xff, 0x00, 0x05, 0x07, 0x08, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x03, 0x00, 0xfe, 0xf8, 0xf5, 0xfb, 0x01, 0x00, 0x00, 0x09, + 0x10, 0x0b, 0x0b, 0x0c, 0x09, 0x03, 0x02, 0x05, 0x06, 0x0a, 0x13, 0x0d, + 0x0a, 0x11, 0x14, 0x1e, 0x15, 0x0a, 0x08, 0x09, 0x0b, 0x0a, 0x07, 0x03, + 0x01, 0x00, 0x05, 0x05, 0xfe, 0xf5, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf6, + 0xf8, 0xf8, 0xfb, 0xff, 0xf9, 0xf8, 0xfa, 0xfa, 0xfd, 0x03, 0x02, 0x06, + 0x09, 0x02, 0x01, 0x01, 0x02, 0x03, 0x05, 0x07, 0x0a, 0x10, 0x10, 0x0c, + 0x0b, 0x0e, 0x08, 0x02, 0x03, 0x04, 0x07, 0x07, 0x06, 0x04, 0x04, 0x0e, + 0x14, 0x16, 0x10, 0x08, 0x05, 0x04, 0xff, 0xfb, 0xfc, 0xf9, 0xfc, 0x01, + 0x03, 0xff, 0xfc, 0xf8, 0xf5, 0xfb, 0x00, 0x01, 0x05, 0x02, 0x03, 0x08, + 0x10, 0x0e, 0x0b, 0x04, 0xfd, 0xfb, 0xfc, 0xfd, 0x04, 0x04, 0x00, 0x00, + 0x07, 0x07, 0x04, 0x00, 0x00, 0xff, 0xfa, 0xfe, 0xfd, 0xfb, 0xfb, 0xfe, + 0x08, 0x0b, 0x0b, 0x01, 0x01, 0x03, 0x05, 0x0a, 0x0c, 0x0b, 0x0b, 0x08, + 0x06, 0x06, 0x02, 0xff, 0xff, 0xfd, 0x00, 0x04, 0x0b, 0x06, 0x05, 0x0a, + 0x06, 0x02, 0x06, 0x01, 0xf8, 0xf8, 0xfb, 0x00, 0x05, 0x0a, 0x0c, 0x0e, + 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x01, 0xfe, 0xfc, 0xfd, 0xff, 0xff, 0x03, + 0x07, 0x02, 0x01, 0xff, 0xfe, 0xfb, 0xfa, 0xfb, 0x00, 0x05, 0x07, 0x01, + 0xfd, 0xfa, 0xf8, 0xfd, 0x01, 0x02, 0xfd, 0xfd, 0x02, 0x00, 0x00, 0x09, + 0x09, 0x01, 0xfe, 0xfd, 0x05, 0x09, 0x05, 0x05, 0x02, 0xfd, 0x01, 0x0e, + 0x10, 0x0a, 0x08, 0x03, 0x02, 0x06, 0x0c, 0x0e, 0x0e, 0x0b, 0x0e, 0x14, + 0x0e, 0x04, 0x02, 0x02, 0x00, 0xff, 0x00, 0x01, 0x04, 0x07, 0x08, 0x07, + 0x02, 0xfc, 0xfb, 0xfc, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xff, 0xfc, 0x08, + 0x0b, 0x0b, 0x07, 0x04, 0xff, 0xfd, 0x00, 0x02, 0xfd, 0xfa, 0xfb, 0xfd, + 0xff, 0x03, 0x02, 0xfe, 0xf9, 0xf8, 0xf7, 0xf8, 0xfb, 0x02, 0x07, 0x06, + 0x03, 0x01, 0x01, 0x07, 0x0e, 0x09, 0x08, 0x09, 0x04, 0x02, 0x02, 0xff, + 0x00, 0x00, 0xff, 0x02, 0x02, 0x03, 0x06, 0x06, 0x03, 0x00, 0x01, 0x0e, + 0x0e, 0x10, 0x0e, 0x05, 0x02, 0x04, 0x09, 0x0e, 0x0c, 0x10, 0x15, 0x10, + 0x0e, 0x0f, 0x0e, 0x0c, 0x08, 0x04, 0x01, 0xff, 0x02, 0x0a, 0x09, 0x04, + 0xfe, 0xf9, 0xf5, 0xf3, 0xf2, 0xf8, 0xf8, 0xf4, 0xf5, 0xf7, 0xf3, 0xf1, + 0xfc, 0xfd, 0xfe, 0xff, 0xf9, 0xf6, 0xf6, 0xf6, 0xf0, 0xf1, 0xfb, 0x07, + 0x05, 0x03, 0x05, 0x0b, 0x0b, 0x0c, 0x10, 0x0b, 0x0d, 0x11, 0x12, 0x10, + 0x11, 0x10, 0x0d, 0x12, 0x15, 0x11, 0x0f, 0x0c, 0x10, 0x0f, 0x0c, 0x0d, + 0x0b, 0x05, 0xfe, 0xfa, 0xfa, 0x00, 0x01, 0xfe, 0xfb, 0xfa, 0xf8, 0xf5, + 0xf6, 0xfe, 0x00, 0xf9, 0xf9, 0xfb, 0x00, 0xfe, 0xfe, 0x06, 0x0c, 0x0f, + 0x07, 0x03, 0x01, 0xfc, 0xfc, 0x05, 0x09, 0x04, 0x05, 0x03, 0x04, 0x05, + 0x05, 0x03, 0xff, 0x02, 0x04, 0x01, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x09, 0x0c, 0x07, 0x02, 0x05, 0x05, 0x00, 0xfe, 0xfb, 0xf6, + 0xf6, 0xfd, 0x01, 0x03, 0x03, 0x01, 0x02, 0xfb, 0xf9, 0xfe, 0x0a, 0x10, + 0x0d, 0x0b, 0x08, 0x04, 0x08, 0x10, 0x0f, 0x0f, 0x0e, 0x0a, 0x07, 0x0a, + 0x0a, 0x06, 0x05, 0x07, 0x06, 0x04, 0x04, 0x09, 0x05, 0xff, 0xff, 0x00, + 0x03, 0x02, 0x00, 0xfa, 0xfa, 0xfe, 0xfe, 0xfc, 0x00, 0xfd, 0xfe, 0x01, + 0xfe, 0xf9, 0xf9, 0xfd, 0x00, 0xfe, 0xfa, 0xf5, 0xf7, 0xfe, 0x09, 0x08, + 0x03, 0x04, 0x03, 0x00, 0x05, 0x05, 0x05, 0x0d, 0x0a, 0x06, 0x03, 0x06, + 0x05, 0x09, 0x13, 0x17, 0x0f, 0x07, 0x0a, 0x07, 0x03, 0x00, 0xff, 0x04, + 0x00, 0x02, 0x04, 0x00, 0x00, 0x01, 0x01, 0x04, 0x07, 0x06, 0x03, 0x05, + 0x04, 0x04, 0x00, 0xfd, 0x07, 0x08, 0x00, 0x04, 0x05, 0x00, 0x06, 0x07, + 0x04, 0x01, 0xff, 0x01, 0x05, 0x00, 0x05, 0xff, 0xf9, 0xfb, 0xfc, 0xfb, + 0xfa, 0xf8, 0xf8, 0xf9, 0xfc, 0x00, 0x02, 0x03, 0x02, 0x01, 0x02, 0x07, + 0x09, 0x05, 0x05, 0x03, 0x04, 0x06, 0x02, 0x02, 0x01, 0x02, 0x08, 0x08, + 0x04, 0x05, 0x08, 0x07, 0x0a, 0x08, 0x06, 0x04, 0x04, 0x08, 0x09, 0x01, + 0x02, 0x08, 0x07, 0x0f, 0x14, 0x14, 0x0d, 0x06, 0x05, 0x05, 0x04, 0x07, + 0x04, 0x02, 0x03, 0xff, 0xff, 0x03, 0x03, 0x00, 0xfe, 0xf8, 0xf7, 0xfd, + 0x02, 0x03, 0x00, 0xfd, 0xfc, 0xfb, 0xf9, 0xf5, 0xfb, 0xff, 0xff, 0xfb, + 0xf5, 0xf5, 0xf7, 0xf9, 0xf9, 0xf8, 0xfa, 0xfe, 0xfb, 0x00, 0x03, 0xff, + 0x05, 0x0c, 0x0f, 0x11, 0x12, 0x0e, 0x08, 0x09, 0x0a, 0x0e, 0x12, 0x14, + 0x19, 0x18, 0x12, 0x0d, 0x0c, 0x0c, 0x0b, 0x09, 0x03, 0x05, 0x08, 0x07, + 0x04, 0x00, 0x00, 0x01, 0xfd, 0xf8, 0xf7, 0xf9, 0x02, 0x05, 0x00, 0xf9, + 0xf5, 0xf6, 0xfc, 0xfd, 0xfe, 0x03, 0x01, 0xfa, 0xf9, 0x01, 0x00, 0xfc, + 0xfe, 0x00, 0x04, 0x09, 0x07, 0x01, 0x00, 0x02, 0x03, 0x09, 0x09, 0x06, + 0x02, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x0b, 0x05, 0x08, 0x09, 0x07, + 0x04, 0x05, 0x05, 0xff, 0xff, 0x03, 0x01, 0xfe, 0xff, 0xfc, 0xfb, 0xfb, + 0xfe, 0x00, 0xff, 0xfd, 0xfe, 0xfe, 0xfc, 0xfc, 0x01, 0x09, 0x08, 0x04, + 0x01, 0x0b, 0x1b, 0x17, 0x12, 0x0d, 0x0e, 0x0d, 0x0c, 0x0d, 0x09, 0x07, + 0x06, 0x05, 0x05, 0x05, 0x0c, 0x0d, 0x0b, 0x06, 0x05, 0x05, 0x05, 0x05, + 0xfb, 0xf5, 0xf5, 0xfb, 0xfd, 0xfe, 0xfe, 0xfd, 0xfd, 0xf6, 0xf2, 0xee, + 0xf1, 0xfc, 0xfe, 0xf9, 0xf4, 0xf2, 0xf3, 0xf5, 0x01, 0x02, 0xf9, 0xfb, + 0x07, 0x13, 0x16, 0x13, 0x12, 0x0e, 0x0d, 0x09, 0x09, 0x07, 0x0f, 0x12, + 0x0f, 0x0b, 0x09, 0x07, 0x0c, 0x09, 0x04, 0x02, 0x02, 0x03, 0x01, 0x00, + 0x00, 0x01, 0x04, 0x03, 0x04, 0x00, 0xff, 0x02, 0x00, 0xfe, 0xfd, 0x01, + 0x08, 0x0c, 0x0d, 0x0a, 0x02, 0xff, 0xfd, 0xfd, 0x09, 0x0a, 0x07, 0x06, + 0x06, 0x08, 0x08, 0x04, 0x04, 0x06, 0xfd, 0xfa, 0xfc, 0xfb, 0xfe, 0xff, + 0xfa, 0xf3, 0xf5, 0xf8, 0xfa, 0xf9, 0xfe, 0x09, 0x07, 0x01, 0xff, 0xff, + 0x02, 0x04, 0x04, 0xff, 0xfe, 0xfe, 0xfe, 0x04, 0x06, 0x06, 0x08, 0x0e, + 0x0e, 0x0e, 0x09, 0x02, 0xfe, 0xfd, 0xff, 0x09, 0x0f, 0x10, 0x10, 0x0d, + 0x11, 0x14, 0x14, 0x0f, 0x0f, 0x0c, 0x08, 0x04, 0x01, 0x00, 0xfc, 0xf7, + 0xf9, 0xfc, 0xfc, 0xff, 0x05, 0xfe, 0xfe, 0x02, 0x01, 0x00, 0xff, 0xfe, + 0xfa, 0xf9, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfb, 0xfd, 0x00, 0xfe, + 0x00, 0xff, 0xfa, 0xf6, 0xf8, 0xfd, 0x04, 0x0f, 0x0b, 0x07, 0x08, 0x11, + 0x14, 0x11, 0x0a, 0x0a, 0x09, 0x07, 0x0a, 0x0b, 0x10, 0x10, 0x0c, 0x08, + 0x07, 0x05, 0x02, 0x02, 0x06, 0x02, 0x01, 0x00, 0xff, 0xfd, 0xfd, 0xff, + 0x01, 0xff, 0xfe, 0xfb, 0xf9, 0xfd, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x05, + 0x0a, 0x05, 0x03, 0xfd, 0xfd, 0x00, 0x08, 0x0d, 0x04, 0xff, 0xfc, 0x00, + 0x05, 0x09, 0x08, 0x09, 0x0d, 0x07, 0x00, 0xfc, 0xfa, 0xfb, 0xfd, 0xfe, + 0xfe, 0xfc, 0xfc, 0x03, 0x0b, 0x0f, 0x10, 0x0b, 0x03, 0x02, 0x08, 0x0a, + 0x07, 0x04, 0xfe, 0xf9, 0xfc, 0x01, 0x02, 0x07, 0x08, 0x03, 0x02, 0x05, + 0x03, 0x01, 0xf8, 0xf4, 0xf7, 0xfc, 0x0a, 0x06, 0x08, 0x09, 0x0a, 0x0a, + 0x0d, 0x12, 0x10, 0x0e, 0x09, 0x03, 0xff, 0xff, 0x01, 0x02, 0x02, 0x03, + 0x08, 0x08, 0x03, 0x07, 0x0b, 0x08, 0x05, 0x04, 0x01, 0x02, 0x00, 0xff, + 0x01, 0xff, 0xfd, 0xfa, 0xfd, 0xfd, 0xfc, 0xf9, 0xf6, 0xf5, 0xf8, 0xf9, + 0xf3, 0xee, 0xe9, 0xf1, 0xfd, 0x0a, 0x09, 0xfe, 0xfa, 0x02, 0x0e, 0x0d, + 0x12, 0x13, 0x0e, 0x0b, 0x10, 0x13, 0x0d, 0x0d, 0x0e, 0x0c, 0x0b, 0x09, + 0x04, 0x02, 0xfe, 0x06, 0x0f, 0x0d, 0x0b, 0x08, 0x09, 0x0d, 0x08, 0x04, + 0x00, 0xfe, 0xfc, 0xf6, 0xf6, 0xfd, 0xfe, 0xfc, 0x00, 0x06, 0x0c, 0x0b, + 0x05, 0x02, 0xff, 0x02, 0x04, 0x06, 0x02, 0x02, 0x00, 0xfd, 0xfa, 0x00, + 0x0a, 0x09, 0x04, 0x00, 0xfc, 0xfa, 0xf9, 0xf9, 0xfb, 0xfd, 0xfc, 0xf9, + 0xf8, 0xfc, 0xfd, 0xfd, 0x04, 0x07, 0x07, 0x02, 0x01, 0x04, 0x01, 0xfe, + 0xfb, 0xfb, 0xfc, 0xfb, 0x06, 0x0d, 0x0f, 0x0d, 0x08, 0x07, 0x06, 0x04, + 0x02, 0x04, 0x06, 0x07, 0x13, 0x12, 0x0f, 0x12, 0x15, 0x13, 0x12, 0x0f, + 0x12, 0x10, 0x0b, 0x0b, 0x08, 0x01, 0xfd, 0x02, 0x08, 0x09, 0x08, 0x01, + 0xf9, 0xf7, 0xfa, 0xf8, 0xfe, 0xff, 0xfe, 0xf9, 0xfb, 0x00, 0xff, 0xf3, + 0xf5, 0xf9, 0xf5, 0xf8, 0xfe, 0xf9, 0xf6, 0xf9, 0xfb, 0xfa, 0xf9, 0xfa, + 0xfc, 0xfc, 0xfd, 0x06, 0x0c, 0x05, 0x05, 0x07, 0x0d, 0x10, 0x10, 0x12, + 0x18, 0x15, 0x0c, 0x0c, 0x11, 0x0e, 0x09, 0x0a, 0x05, 0x02, 0xfd, 0xfc, + 0xfb, 0xf7, 0xf8, 0xfc, 0x08, 0x0c, 0x08, 0x04, 0x03, 0xff, 0xfb, 0xfa, + 0xfa, 0xfb, 0xfc, 0xff, 0x03, 0x07, 0x0c, 0x09, 0x0b, 0x0a, 0x0a, 0x0c, + 0x06, 0x03, 0x05, 0x10, 0x0d, 0x07, 0x04, 0x07, 0x07, 0x07, 0x09, 0x0c, + 0x0d, 0x08, 0x01, 0xfd, 0xf5, 0xf5, 0xf8, 0xf8, 0xfd, 0xfc, 0xf4, 0xf0, + 0xf1, 0xf9, 0xfc, 0xff, 0x06, 0x04, 0x03, 0x04, 0x03, 0x03, 0x01, 0xf8, + 0xf7, 0xfa, 0xfb, 0xfe, 0x01, 0x01, 0x05, 0x01, 0x02, 0x04, 0x06, 0x04, + 0x03, 0x07, 0x19, 0x17, 0x10, 0x0c, 0x0c, 0x0c, 0x0a, 0x08, 0x06, 0x04, + 0x09, 0x0a, 0x07, 0x03, 0x02, 0x02, 0x05, 0x05, 0x06, 0x08, 0x04, 0xff, + 0xff, 0xff, 0x00, 0x05, 0x0f, 0x0b, 0x04, 0x01, 0x00, 0x01, 0xff, 0x00, + 0xfc, 0xf8, 0xf8, 0xfc, 0x01, 0x02, 0xff, 0xfb, 0xf9, 0xfb, 0x01, 0x01, + 0xff, 0x01, 0x03, 0xfb, 0xf8, 0xfd, 0x04, 0x03, 0x03, 0x06, 0x0d, 0x0e, + 0x0d, 0x07, 0x07, 0x09, 0x07, 0x02, 0x03, 0x04, 0x02, 0xff, 0x00, 0xff, + 0xff, 0xfd, 0x00, 0x06, 0x06, 0x05, 0x07, 0x06, 0x04, 0x04, 0x01, 0x00, + 0x03, 0x03, 0x00, 0x02, 0x06, 0x07, 0x0a, 0x09, 0x0a, 0x05, 0x03, 0x01, + 0x05, 0x0f, 0x08, 0x02, 0xfc, 0xfe, 0x03, 0x06, 0x06, 0x04, 0x03, 0x04, + 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xf8, 0x01, 0x07, 0x02, 0xfd, 0xf9, 0xfa, + 0xfb, 0xfb, 0xfd, 0x03, 0x0d, 0x10, 0x0e, 0x09, 0x05, 0x03, 0xfe, 0xfb, + 0xfa, 0xfb, 0xfe, 0x02, 0x06, 0x03, 0x07, 0x08, 0x07, 0x03, 0x02, 0x06, + 0x0e, 0x0b, 0x08, 0x0c, 0x0c, 0x0d, 0x09, 0x0a, 0x0b, 0x07, 0x04, 0x06, + 0x09, 0x03, 0x02, 0x03, 0x05, 0x01, 0x00, 0xfc, 0xfc, 0xfb, 0xf6, 0xf7, + 0xfc, 0xfe, 0x01, 0x10, 0x0e, 0x07, 0x04, 0x05, 0xfd, 0xf6, 0xf3, 0xf1, + 0xf3, 0xf5, 0xfb, 0xf9, 0xfb, 0xfc, 0xfd, 0xfc, 0xf9, 0xf9, 0xfd, 0x09, + 0x12, 0x11, 0x0c, 0x10, 0x16, 0x10, 0x0a, 0x0c, 0x0b, 0x0a, 0x07, 0x0b, + 0x0f, 0x0c, 0x0e, 0x10, 0x0c, 0x0d, 0x0d, 0x05, 0x00, 0xfc, 0xfe, 0xff, + 0x04, 0x05, 0x08, 0x08, 0x07, 0xfe, 0xfa, 0xf5, 0xf4, 0xf5, 0xf8, 0xfe, + 0xfe, 0x00, 0xfc, 0x00, 0x09, 0x0b, 0x05, 0x02, 0xfe, 0xfc, 0x0c, 0x14, + 0x09, 0x04, 0x03, 0x00, 0xfc, 0xfc, 0xfb, 0xfd, 0xff, 0x02, 0x09, 0x0a, + 0x0c, 0x08, 0x02, 0xfe, 0xfc, 0xf8, 0xf8, 0xf8, 0xf9, 0xf6, 0xf5, 0xfb, + 0xfb, 0x04, 0x0d, 0x0d, 0x0b, 0x05, 0x00, 0xfa, 0xfa, 0xfd, 0xfb, 0xfa, + 0x00, 0x04, 0x00, 0x02, 0x0c, 0x0d, 0x0f, 0x15, 0x0e, 0x13, 0x20, 0x19, + 0x15, 0x0d, 0x0c, 0x0d, 0x0b, 0x0a, 0x0c, 0x0e, 0x0b, 0x07, 0x05, 0x08, + 0x07, 0x04, 0x04, 0x03, 0x01, 0xf9, 0xf7, 0xfc, 0xfb, 0xf7, 0xf6, 0xf8, + 0xf6, 0xff, 0x01, 0x00, 0xfe, 0x02, 0xfe, 0xfc, 0xfc, 0xf7, 0xf5, 0xf3, + 0xf4, 0xf1, 0xf4, 0xf7, 0xf9, 0xfe, 0xfd, 0xfa, 0xfe, 0x0b, 0x09, 0x06, + 0x06, 0x0c, 0x11, 0x18, 0x10, 0x08, 0x04, 0x09, 0x0b, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x05, 0x04, 0x04, 0x02, 0x01, 0xfd, 0xfa, 0xfa, 0xfc, 0xfd, + 0x07, 0x10, 0x0e, 0x0f, 0x16, 0x11, 0x04, 0x00, 0xfe, 0xfe, 0xfe, 0x03, + 0x03, 0x05, 0x0b, 0x08, 0x0e, 0x11, 0x0c, 0x0b, 0x15, 0x11, 0x0b, 0x09, + 0x04, 0x03, 0x03, 0x04, 0x02, 0xfa, 0xfb, 0xfb, 0xf7, 0xf7, 0xfc, 0x09, + 0x02, 0xfd, 0xf6, 0xf5, 0xf8, 0xf7, 0xf2, 0xf1, 0xf3, 0xf4, 0xf6, 0xfd, + 0x06, 0x09, 0x05, 0x00, 0x00, 0xfa, 0xf5, 0xf6, 0xf8, 0xf7, 0xfb, 0xfe, + 0x03, 0x06, 0x07, 0x09, 0x09, 0x0d, 0x0f, 0x1d, 0x1b, 0x16, 0x1b, 0x11, + 0x0b, 0x0d, 0x0e, 0x09, 0x07, 0x06, 0x05, 0x06, 0x03, 0x00, 0x03, 0x08, + 0x0c, 0x0c, 0x07, 0x05, 0x04, 0x00, 0xff, 0x08, 0x03, 0xfe, 0xfe, 0x03, + 0x08, 0x0a, 0x07, 0x00, 0x01, 0x00, 0x00, 0xfb, 0xf7, 0xf9, 0xf9, 0xf5, + 0xf7, 0xf7, 0xf4, 0xf4, 0xf8, 0xfc, 0x09, 0x09, 0x07, 0x05, 0x0b, 0x0c, + 0x0a, 0x05, 0x01, 0x01, 0x01, 0x01, 0x08, 0x05, 0x03, 0x02, 0x08, 0x09, + 0x07, 0x04, 0x03, 0x01, 0xff, 0xfb, 0xfb, 0xf9, 0xfe, 0x03, 0x05, 0x09, + 0x07, 0x02, 0x04, 0x0d, 0x0d, 0x06, 0x00, 0xfd, 0xfc, 0x03, 0x06, 0x03, + 0x01, 0x01, 0x00, 0xfd, 0x04, 0x17, 0x12, 0x08, 0x03, 0x03, 0x03, 0x06, + 0x06, 0x08, 0x07, 0x04, 0x04, 0x09, 0x09, 0x09, 0x06, 0xfe, 0x02, 0x04, + 0x01, 0xfb, 0xff, 0xfc, 0xf7, 0xf9, 0xfb, 0x01, 0x06, 0x06, 0x0a, 0x0e, + 0x09, 0x01, 0xfe, 0xff, 0xfb, 0xf1, 0xf5, 0xfa, 0xfd, 0xf9, 0xfb, 0x09, + 0x07, 0x03, 0xfe, 0xfe, 0x15, 0x1d, 0x1a, 0x14, 0x0c, 0x0a, 0x0c, 0x09, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x01, 0xfe, 0xfe, 0x00, 0x04, 0x09, 0x04, + 0xfe, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xfe, 0x01, 0x0a, 0x0a, + 0x00, 0xfc, 0xfc, 0xfe, 0x01, 0xfc, 0xfb, 0xf9, 0xf8, 0xf5, 0xf6, 0xfb, + 0xfa, 0xf5, 0xf9, 0x0b, 0x16, 0x17, 0x18, 0x23, 0x1d, 0x17, 0x13, 0x0c, + 0x06, 0x0c, 0x0d, 0x0a, 0x09, 0x03, 0x05, 0x06, 0x06, 0x0b, 0x0b, 0x03, + 0x03, 0x03, 0xfb, 0xfa, 0xf8, 0xf8, 0xf8, 0xf8, 0xfc, 0x04, 0x04, 0x00, + 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0xfb, 0xfe, 0x05, 0xff, 0xfc, 0xff, 0xff, + 0x02, 0x01, 0x0b, 0x0c, 0x10, 0x0f, 0x07, 0x05, 0x09, 0x07, 0x03, 0x02, + 0x02, 0x04, 0x08, 0x0c, 0x07, 0x04, 0x00, 0xfc, 0xfc, 0x06, 0x05, 0xfb, + 0xf6, 0xf3, 0xef, 0xf2, 0xf7, 0xff, 0xfc, 0xfb, 0x05, 0x04, 0x00, 0xfc, + 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0x04, 0x06, 0x04, 0x04, 0x0c, 0x0c, + 0x0c, 0x16, 0x15, 0x17, 0x1c, 0x1b, 0x15, 0x11, 0x12, 0x14, 0x14, 0x11, + 0x0e, 0x0d, 0x09, 0x04, 0xff, 0xfb, 0xfb, 0xfe, 0x01, 0x05, 0x0a, 0x0b, + 0xfd, 0xf9, 0xf4, 0xf7, 0xf9, 0xf8, 0xfa, 0x03, 0x00, 0xfe, 0xfa, 0xf4, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf4, 0xf4, 0xf2, 0xf1, 0xef, 0xf5, 0xf8, 0xfb, + 0x05, 0x00, 0xfc, 0x07, 0x11, 0x0c, 0x0b, 0x14, 0x12, 0x0f, 0x11, 0x11, + 0x0a, 0x06, 0x03, 0xff, 0xfd, 0x05, 0x0c, 0x09, 0x0b, 0x0a, 0x04, 0x01, + 0x02, 0x02, 0xff, 0xff, 0x03, 0x06, 0x15, 0x1c, 0x15, 0x0f, 0x09, 0x06, + 0x03, 0x04, 0x07, 0x05, 0x01, 0x04, 0x03, 0xfe, 0xff, 0x04, 0x05, 0x11, + 0x0f, 0x06, 0x00, 0x06, 0x00, 0xfd, 0x01, 0x02, 0x00, 0xff, 0xfd, 0xff, + 0xfc, 0xf5, 0xf7, 0xff, 0xff, 0xfc, 0xff, 0x01, 0x01, 0xfb, 0xf5, 0xf0, + 0xec, 0xf1, 0x00, 0x01, 0xff, 0x04, 0x05, 0x06, 0x01, 0xfd, 0xfb, 0xfb, + 0xfb, 0xfd, 0x07, 0x0e, 0x09, 0x06, 0x01, 0x01, 0x02, 0x08, 0x1a, 0x19, + 0x0b, 0x06, 0x0b, 0x10, 0x0c, 0x0d, 0x0e, 0x0e, 0x0e, 0x0b, 0x08, 0x06, + 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x05, 0x02, 0x02, 0x03, + 0x04, 0xfe, 0x02, 0x04, 0x0c, 0x07, 0x03, 0xfe, 0xfa, 0xfb, 0xfd, 0x03, + 0x02, 0x01, 0x03, 0x00, 0xf2, 0xed, 0xed, 0xee, 0xed, 0x01, 0x14, 0x0f, + 0x07, 0x06, 0x0b, 0x0b, 0x08, 0x0d, 0x0c, 0x08, 0x08, 0x09, 0x09, 0x06, + 0x02, 0xfd, 0xfd, 0xff, 0x03, 0x03, 0x01, 0x01, 0xfd, 0xff, 0xfe, 0x00, + 0xfd, 0xf9, 0xff, 0x07, 0xff, 0xfe, 0x02, 0x04, 0x05, 0x05, 0x0a, 0x03, + 0x02, 0x08, 0x04, 0xfd, 0xf8, 0xfb, 0xfd, 0xfd, 0x0d, 0x16, 0x0e, 0x06, + 0x02, 0x05, 0x08, 0x04, 0x05, 0x06, 0x14, 0x18, 0x14, 0x10, 0x0f, 0x0d, + 0x06, 0x06, 0x00, 0xfe, 0xff, 0xff, 0x02, 0xff, 0xfc, 0xf9, 0xfa, 0x02, + 0x01, 0x05, 0x0b, 0x05, 0xf6, 0xf0, 0xf1, 0xf5, 0xf3, 0xf3, 0xf5, 0xf7, + 0xfa, 0xf9, 0xf9, 0xf9, 0xfd, 0x04, 0x05, 0x0c, 0x15, 0x13, 0x0b, 0x06, + 0x04, 0x09, 0x0a, 0x0c, 0x0f, 0x10, 0x12, 0x11, 0x0e, 0x0c, 0x0c, 0x09, + 0x05, 0x05, 0x0e, 0x12, 0x0c, 0x08, 0x05, 0x04, 0x02, 0x04, 0xfd, 0xf5, + 0xfd, 0x01, 0x03, 0xfe, 0xfa, 0xf9, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xfa, + 0xf9, 0xf9, 0xf4, 0xf3, 0xf4, 0xf1, 0xfa, 0x07, 0x00, 0x01, 0x09, 0x08, + 0x0e, 0x20, 0x1c, 0x0f, 0x0b, 0x0d, 0x0f, 0x10, 0x0b, 0x08, 0x09, 0x0a, + 0x0b, 0x0a, 0x0c, 0x0d, 0x02, 0xfd, 0xff, 0xfe, 0xfa, 0xf9, 0x06, 0x11, + 0x0e, 0x0e, 0x09, 0x00, 0xfd, 0x00, 0xfe, 0xff, 0xfe, 0xfe, 0x02, 0x05, + 0x05, 0x00, 0xfb, 0xf9, 0xf7, 0xfc, 0x0e, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x03, 0x02, 0xfd, 0xfd, 0x02, 0x01, 0x06, 0x0e, 0x09, 0x01, + 0xfd, 0xfb, 0xfa, 0xfb, 0xfa, 0xf8, 0xf7, 0xf8, 0xfd, 0x09, 0x0e, 0x0d, + 0x07, 0x03, 0xfe, 0xf9, 0xf8, 0xf9, 0x02, 0x0b, 0x08, 0x0c, 0x0f, 0x0f, + 0x08, 0x0a, 0x08, 0x00, 0x02, 0x12, 0x12, 0x0b, 0x0d, 0x0d, 0x0c, 0x14, + 0x13, 0x12, 0x11, 0x10, 0x07, 0x06, 0x04, 0x04, 0x00, 0xff, 0xfd, 0xfb, + 0xf7, 0xf7, 0xf8, 0xf7, 0xfe, 0x06, 0x04, 0x00, 0x06, 0x04, 0xff, 0xfd, + 0xfc, 0xf7, 0xf4, 0xf3, 0xf4, 0xf8, 0xfa, 0xfa, 0xfe, 0xfe, 0xfe, 0xfb, + 0xf7, 0xf6, 0xfa, 0x05, 0x0e, 0x0f, 0x06, 0x09, 0x11, 0x0e, 0x0d, 0x0b, + 0x0a, 0x09, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0b, 0x09, 0x03, 0x01, 0x03, + 0x06, 0x05, 0x00, 0x02, 0x01, 0xfe, 0xfd, 0x05, 0x04, 0x01, 0x04, 0x09, + 0x0c, 0x0b, 0x0c, 0x05, 0x01, 0x00, 0x02, 0x05, 0x09, 0x07, 0x04, 0x00, + 0x00, 0x00, 0x01, 0x08, 0x0c, 0x01, 0xfc, 0xf8, 0xfb, 0x03, 0x03, 0x0b, + 0x0b, 0x0a, 0x09, 0x06, 0x06, 0x01, 0xff, 0xfe, 0x00, 0xfd, 0xfb, 0xfa, + 0xfd, 0xfb, 0xfc, 0xff, 0xfd, 0x00, 0x0a, 0x0d, 0x09, 0x05, 0xff, 0xfc, + 0xf9, 0xf9, 0xf7, 0xf2, 0xf2, 0xf8, 0xfe, 0x07, 0x04, 0x03, 0x06, 0x05, + 0x02, 0xff, 0xfe, 0x0e, 0x09, 0x02, 0xfc, 0xfd, 0x08, 0x11, 0x13, 0x12, + 0x0d, 0x0b, 0x0b, 0x0a, 0x0c, 0x0a, 0x0c, 0x15, 0x15, 0x0d, 0x0b, 0x0b, + 0x0c, 0x07, 0x08, 0x02, 0x0c, 0x07, 0x04, 0x07, 0x06, 0x01, 0x01, 0x02, + 0xff, 0xff, 0xf6, 0xf4, 0xf7, 0xf3, 0xf3, 0xf8, 0xf5, 0xf1, 0xee, 0xe9, + 0xeb, 0xee, 0x03, 0x09, 0xff, 0x02, 0x08, 0x0c, 0x0b, 0x08, 0x03, 0x02, + 0x05, 0x04, 0x03, 0x02, 0x03, 0x07, 0x0a, 0x0b, 0x08, 0x04, 0x05, 0x06, + 0x00, 0x05, 0x0b, 0x18, 0x17, 0x0c, 0x0a, 0x0c, 0x0b, 0x08, 0x04, 0x03, + 0x02, 0x00, 0xfa, 0xfd, 0x04, 0x04, 0x02, 0x02, 0x02, 0x00, 0x00, 0xfd, + 0xfb, 0x02, 0x09, 0xff, 0xfb, 0xfd, 0x01, 0xff, 0x00, 0x03, 0x0d, 0x09, + 0x05, 0x09, 0x09, 0x07, 0x04, 0x04, 0x02, 0x00, 0xfd, 0xfd, 0xfc, 0xfc, + 0xff, 0x05, 0x12, 0x0e, 0x0d, 0x04, 0x02, 0x01, 0xfa, 0xf5, 0xf5, 0xfc, + 0x03, 0xfc, 0xfa, 0x01, 0x08, 0x03, 0x01, 0x01, 0x00, 0xfe, 0xfe, 0x00, + 0x05, 0x10, 0x09, 0x01, 0x00, 0x09, 0x0f, 0x0f, 0x10, 0x0f, 0x0d, 0x0c, + 0x0d, 0x0b, 0x09, 0x06, 0x04, 0x0c, 0x0e, 0x05, 0x00, 0x02, 0x00, 0xfd, + 0x07, 0x0b, 0x02, 0xfd, 0xf9, 0xfb, 0xff, 0xfc, 0xf7, 0xf5, 0xf6, 0xf9, + 0xf3, 0xf4, 0xf8, 0xf9, 0xf8, 0xf8, 0xf8, 0xfb, 0x03, 0x00, 0xfd, 0x02, + 0x18, 0x17, 0x07, 0x07, 0x12, 0x10, 0x09, 0x0b, 0x0e, 0x0b, 0x0b, 0x0a, + 0x0a, 0x0f, 0x10, 0x0e, 0x0e, 0x09, 0xff, 0xfd, 0xfe, 0xfa, 0xf8, 0x02, + 0x0a, 0x0c, 0x08, 0x01, 0x02, 0x08, 0x05, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, + 0xf6, 0xfb, 0xfd, 0xfc, 0x00, 0x00, 0x01, 0x02, 0xff, 0xfc, 0xfc, 0x04, + 0x0b, 0x04, 0x00, 0x04, 0x0d, 0x11, 0x03, 0x03, 0x08, 0x08, 0x08, 0x06, + 0x03, 0x03, 0x05, 0x06, 0x00, 0xff, 0xfd, 0xfd, 0xf9, 0xf9, 0x0b, 0x10, + 0x09, 0x06, 0x09, 0x06, 0x01, 0x01, 0xff, 0xf9, 0xf9, 0xfe, 0xfc, 0xfc, + 0x06, 0x08, 0x01, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xfe, 0xfb, 0xff, 0x0d, + 0x0d, 0x0d, 0x0f, 0x10, 0x0c, 0x08, 0xff, 0x02, 0x06, 0x03, 0x04, 0x06, + 0x08, 0x15, 0x0f, 0x0b, 0x09, 0x06, 0x05, 0x02, 0xfd, 0x04, 0x0a, 0x06, + 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xfe, 0xfb, 0xfa, 0xf9, 0xf9, 0x00, + 0x01, 0xfb, 0xf8, 0xf4, 0xfb, 0xff, 0xf3, 0xf2, 0xfc, 0x02, 0x0b, 0x0d, + 0x06, 0x0b, 0x0a, 0x04, 0x00, 0xfe, 0xff, 0x01, 0x04, 0x06, 0x05, 0x06, + 0x06, 0x0a, 0x0a, 0x05, 0x02, 0x01, 0x01, 0x00, 0x05, 0x15, 0x12, 0x0b, + 0x0c, 0x0d, 0x0b, 0x09, 0x08, 0x06, 0x06, 0x07, 0x04, 0x04, 0x09, 0x09, + 0x04, 0x02, 0x02, 0x05, 0x06, 0x05, 0xfc, 0xf5, 0xf2, 0xf7, 0x04, 0x07, + 0x0e, 0x09, 0x01, 0xff, 0x06, 0x02, 0x02, 0x02, 0xfd, 0xfb, 0xfc, 0xff, + 0xfd, 0xfb, 0xfa, 0xf8, 0xf8, 0xf8, 0xfa, 0x07, 0x0f, 0x08, 0x01, 0x02, + 0x06, 0x0a, 0x05, 0x02, 0xff, 0x02, 0x02, 0xfb, 0xfc, 0x01, 0x03, 0x02, + 0x03, 0x04, 0x03, 0x03, 0x02, 0xfe, 0xf9, 0xfb, 0xfe, 0x09, 0x16, 0x16, + 0x11, 0x0c, 0x09, 0x06, 0x08, 0x09, 0x0a, 0x09, 0x0f, 0x10, 0x10, 0x13, + 0x12, 0x0c, 0x0a, 0x0a, 0x04, 0xfe, 0x03, 0x07, 0x03, 0x02, 0x04, 0x01, + 0xfe, 0x02, 0x03, 0x03, 0x02, 0xfd, 0xf7, 0xef, 0xee, 0xf0, 0xf0, 0xf3, + 0xf3, 0xef, 0xf5, 0xf7, 0xf6, 0xf2, 0xf7, 0xfd, 0x05, 0x17, 0x0d, 0x0d, + 0x0f, 0x08, 0x07, 0x04, 0x07, 0x09, 0x0a, 0x08, 0x07, 0x0e, 0x12, 0x12, + 0x11, 0x0e, 0x0e, 0x08, 0x0a, 0x0e, 0x0a, 0x0d, 0x0a, 0x0a, 0x0c, 0x09, + 0x05, 0x01, 0xfc, 0xf8, 0xf7, 0xfa, 0xfc, 0x00, 0xfe, 0xfa, 0xfa, 0xfe, + 0xff, 0xfe, 0xf9, 0xf6, 0xf5, 0xf2, 0xf2, 0xfb, 0x0b, 0x0f, 0x08, 0x0e, + 0x07, 0x00, 0x02, 0x04, 0x0a, 0x0a, 0x0a, 0x0b, 0x0e, 0x0e, 0x0b, 0x05, + 0x02, 0x02, 0x00, 0xfe, 0x06, 0x10, 0x0f, 0x09, 0xfc, 0xf6, 0xfb, 0x02, + 0x07, 0x0a, 0x02, 0x04, 0x01, 0xfd, 0xff, 0x03, 0xfd, 0xf9, 0xf7, 0xf4, + 0xf6, 0xf7, 0xf9, 0xf9, 0xf5, 0xf2, 0xfb, 0x0b, 0x19, 0x18, 0x11, 0x0a, + 0x05, 0x04, 0x04, 0x06, 0x0b, 0x0a, 0x00, 0x07, 0x18, 0x11, 0x0a, 0x09, + 0x0e, 0x0a, 0x07, 0x0a, 0x11, 0x08, 0x06, 0x02, 0xff, 0xff, 0xff, 0xfe, + 0xfd, 0xfd, 0xfb, 0xfd, 0xfe, 0xfd, 0x00, 0x01, 0x00, 0x00, 0xfc, 0xfe, + 0xf4, 0xf1, 0xf5, 0xf9, 0xf8, 0xfa, 0xfe, 0x02, 0x0c, 0x07, 0x0c, 0x0e, + 0x08, 0x05, 0x04, 0x06, 0x0b, 0x0d, 0x0c, 0x0c, 0x09, 0xfc, 0xf7, 0xfc, + 0x02, 0xff, 0xfd, 0x07, 0x10, 0x0e, 0x09, 0x09, 0x07, 0x02, 0x02, 0x05, + 0x04, 0x07, 0x03, 0x02, 0x02, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x02, 0xff, 0xfc, 0x04, 0x11, 0x08, 0x13, 0x14, 0x0a, 0x09, 0x08, + 0x03, 0x02, 0xff, 0xfc, 0xfc, 0xff, 0x03, 0x00, 0xfe, 0xfc, 0xfa, 0xf7, + 0xf3, 0xf7, 0x06, 0x05, 0xff, 0xfd, 0xf9, 0xfa, 0xfc, 0xfb, 0x00, 0xf7, + 0xfa, 0x0b, 0x09, 0x05, 0x07, 0x04, 0x05, 0x0c, 0x08, 0x03, 0x04, 0x03, + 0x02, 0xff, 0xfe, 0x02, 0x0b, 0x0a, 0x0a, 0x1d, 0x1b, 0x13, 0x05, 0x03, + 0x04, 0x10, 0x16, 0x13, 0x11, 0x11, 0x0a, 0x0a, 0x05, 0x03, 0x02, 0xfe, + 0xfc, 0x05, 0x09, 0x00, 0x00, 0xfe, 0xfa, 0xfc, 0xfb, 0xfc, 0xff, 0x00, + 0x02, 0xff, 0xf7, 0xf7, 0xfc, 0xf9, 0xf4, 0xec, 0xe8, 0xf2, 0xfc, 0xf9, + 0xf4, 0xf7, 0xfa, 0xff, 0xfe, 0xfe, 0x08, 0x12, 0x0a, 0x0f, 0x10, 0x0b, + 0x06, 0x06, 0x04, 0x08, 0x0d, 0x10, 0x10, 0x0d, 0x0e, 0x15, 0x1c, 0x11, + 0x09, 0x11, 0x0f, 0x0d, 0x0b, 0x07, 0x07, 0x02, 0xff, 0xff, 0xff, 0x01, + 0x04, 0x03, 0xff, 0x01, 0x03, 0x00, 0xff, 0x01, 0x00, 0xfc, 0xf3, 0xe9, + 0xe9, 0xed, 0xf5, 0xf1, 0xef, 0xf4, 0x10, 0x1b, 0x0c, 0x06, 0x0b, 0x0b, + 0x05, 0x06, 0x09, 0x0c, 0x08, 0x05, 0x01, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x0c, 0x0e, 0x09, 0x09, 0x07, 0x0b, 0x14, 0x0b, 0x06, 0x09, 0x08, 0x07, + 0x02, 0xfe, 0xfc, 0xfd, 0xfc, 0xfc, 0xfb, 0xf8, 0xf9, 0xf9, 0xf6, 0xf4, + 0xf5, 0xfc, 0xfb, 0xf9, 0xfc, 0x00, 0x10, 0x0e, 0x07, 0x07, 0x06, 0xfe, + 0xfa, 0x06, 0x0d, 0x1c, 0x17, 0x10, 0x11, 0x10, 0x0d, 0x09, 0x0c, 0x11, + 0x14, 0x0d, 0x08, 0x07, 0x04, 0x03, 0x05, 0x02, 0x02, 0x05, 0x09, 0x00, + 0xf5, 0xf6, 0x07, 0x0b, 0x01, 0xfa, 0xf3, 0xed, 0xec, 0xe9, 0xe9, 0xf0, + 0xf8, 0xfa, 0xf4, 0xf1, 0xf5, 0xfb, 0x0b, 0x06, 0x07, 0x0b, 0x09, 0x0a, + 0x0f, 0x10, 0x0d, 0x09, 0x06, 0x04, 0x03, 0x00, 0xfa, 0xfe, 0x05, 0x15, + 0x1e, 0x17, 0x10, 0x09, 0x03, 0x04, 0x04, 0x01, 0x06, 0x07, 0x04, 0x00, + 0x01, 0x04, 0x01, 0xfd, 0xfc, 0xf9, 0xfb, 0x00, 0x01, 0x02, 0x09, 0x14, + 0x0c, 0x03, 0x03, 0x00, 0xfb, 0x09, 0x14, 0x0c, 0x09, 0x0a, 0x09, 0x07, + 0x05, 0x03, 0x03, 0x02, 0xfc, 0xf8, 0xf7, 0xf9, 0xfb, 0xfc, 0x02, 0x09, + 0x01, 0xf1, 0xec, 0xec, 0xf0, 0xf1, 0xf6, 0xf9, 0x07, 0x14, 0x0c, 0x09, + 0x06, 0x06, 0x02, 0x01, 0x02, 0xfe, 0xfd, 0xfe, 0x00, 0xfe, 0x03, 0x0b, + 0x09, 0x05, 0x06, 0x07, 0x05, 0x17, 0x21, 0x23, 0x20, 0x18, 0x1a, 0x14, + 0x0e, 0x0e, 0x08, 0x01, 0xff, 0x01, 0x01, 0x03, 0x03, 0x00, 0x08, 0x0d, + 0x04, 0xfc, 0xf8, 0xf6, 0xfa, 0xfb, 0xfb, 0xff, 0xf9, 0xf4, 0xf7, 0xf6, + 0xf1, 0xee, 0xee, 0xf0, 0xf1, 0xfa, 0x01, 0xfe, 0xf7, 0xf5, 0x00, 0x01, + 0xfe, 0xfc, 0xf9, 0xfd, 0x02, 0x14, 0x11, 0x13, 0x1c, 0x1d, 0x1a, 0x17, + 0x14, 0x0f, 0x0b, 0x0d, 0x11, 0x12, 0x10, 0x0e, 0x04, 0x03, 0x12, 0x0f, + 0x04, 0x02, 0x04, 0x02, 0x02, 0xfe, 0x02, 0x02, 0xfc, 0xfa, 0xfc, 0xfe, + 0x01, 0xfe, 0xfb, 0xfb, 0xf9, 0xf6, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xfa, + 0xfe, 0xfc, 0x01, 0x06, 0x06, 0x14, 0x12, 0x0c, 0x0e, 0x08, 0x07, 0x0a, + 0x09, 0x04, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfe, 0xfa, 0x00, 0x12, 0x16, + 0x0b, 0x0a, 0x09, 0x06, 0x04, 0x05, 0x04, 0x08, 0x09, 0x04, 0x00, 0x01, + 0x02, 0x01, 0x00, 0xfe, 0xfc, 0xf7, 0xf3, 0xf5, 0xfc, 0x07, 0x05, 0x03, + 0x00, 0xfc, 0xfc, 0xf7, 0xf1, 0x05, 0x07, 0x08, 0x0e, 0x0a, 0x09, 0x10, + 0x17, 0x11, 0x0b, 0x08, 0x08, 0x05, 0x03, 0x06, 0x09, 0x0b, 0x12, 0x0b, + 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x01, 0x02, 0x09, 0x09, 0x0a, 0x04, + 0xfe, 0xf8, 0xf5, 0xf1, 0xf0, 0xe7, 0xe6, 0xe8, 0xf0, 0xf8, 0xfa, 0xfb, + 0xf7, 0xf3, 0xf0, 0xf1, 0xf8, 0x0d, 0x11, 0x15, 0x12, 0x0c, 0x08, 0x04, + 0x05, 0x00, 0x00, 0x00, 0x07, 0x06, 0x03, 0x06, 0x12, 0x21, 0x1e, 0x12, + 0x0c, 0x0b, 0x0a, 0x09, 0x0b, 0x06, 0x02, 0x03, 0x04, 0x03, 0x09, 0x0b, + 0x03, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xf9, 0x08, 0x0a, 0x05, 0x04, 0x00, + 0xfe, 0xfe, 0xf7, 0xf5, 0x04, 0x19, 0x12, 0x0b, 0x07, 0x03, 0xfe, 0xfe, + 0xfe, 0xfc, 0xfc, 0xfc, 0xfa, 0xf6, 0xf3, 0xf1, 0xf4, 0x00, 0x06, 0xfc, + 0xfa, 0xfb, 0xfa, 0xfa, 0xf9, 0x00, 0x0b, 0x0c, 0x09, 0x01, 0x01, 0x02, + 0x00, 0x01, 0x00, 0xfc, 0xf7, 0xf8, 0x00, 0x0b, 0x0b, 0x08, 0x06, 0x05, + 0x0c, 0x11, 0x06, 0x05, 0x1a, 0x2a, 0x23, 0x1d, 0x1d, 0x16, 0x0e, 0x08, + 0x04, 0x06, 0x09, 0x0c, 0x08, 0x03, 0x02, 0x02, 0x02, 0x08, 0x0c, 0x0a, + 0x06, 0x01, 0x01, 0x00, 0xfb, 0xf7, 0xef, 0xe6, 0xec, 0xf4, 0xf7, 0xf0, + 0xec, 0xec, 0xf0, 0xf9, 0xf4, 0xf0, 0xf4, 0xf9, 0xfb, 0xfd, 0xff, 0xfe, + 0xfb, 0xf9, 0xfe, 0x06, 0x12, 0x1d, 0x18, 0x1c, 0x1c, 0x1f, 0x1c, 0x13, + 0x0d, 0x15, 0x10, 0x0b, 0x08, 0x05, 0x05, 0x06, 0x00, 0x04, 0x0c, 0x0c, + 0x0a, 0x07, 0x01, 0x00, 0xfe, 0xfc, 0xfe, 0xff, 0xfb, 0xfd, 0xfb, 0xf7, + 0xf8, 0xf6, 0xf1, 0xeb, 0xf1, 0xf8, 0x05, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x0f, 0x08, 0x04, 0x06, 0x0d, 0x19, 0x11, 0x0d, 0x0d, 0x0a, 0x08, 0x07, + 0x04, 0x05, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x03, 0xf5, 0xff, 0x16, 0x0d, + 0x08, 0x05, 0x03, 0x00, 0xfd, 0xf6, 0xfa, 0x05, 0x06, 0x04, 0xfe, 0xf7, + 0xf7, 0xf7, 0xf6, 0xf5, 0xf5, 0xfc, 0x06, 0x01, 0x01, 0x05, 0x05, 0xfd, + 0xfa, 0xff, 0x04, 0x02, 0x08, 0x11, 0x08, 0x08, 0x0f, 0x15, 0x0b, 0x0a, + 0x08, 0x09, 0x0b, 0x06, 0x04, 0x05, 0x08, 0x07, 0x08, 0x0d, 0x15, 0x0b, + 0x08, 0x0a, 0x09, 0x07, 0x00, 0xfe, 0x00, 0x06, 0x0b, 0x05, 0xff, 0xfc, + 0xfc, 0xf5, 0xea, 0xe9, 0xee, 0xf7, 0xfa, 0xf7, 0xf6, 0xfd, 0x00, 0xfa, + 0xfa, 0x00, 0x00, 0x00, 0x08, 0x10, 0x10, 0x11, 0x0b, 0x06, 0xfe, 0x00, + 0x02, 0x01, 0xff, 0xfd, 0xfe, 0x02, 0x0f, 0x0d, 0x0b, 0x11, 0x18, 0x0f, + 0x08, 0x08, 0x08, 0x06, 0x05, 0x06, 0x02, 0x02, 0x06, 0x06, 0x02, 0x02, + 0x08, 0x03, 0xfe, 0xfe, 0x06, 0x0a, 0x09, 0x09, 0x07, 0x02, 0xfe, 0xfb, + 0xfe, 0x01, 0x00, 0xfe, 0x05, 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0xfa, + 0xfb, 0xfa, 0xf6, 0xf3, 0xf1, 0xf0, 0xf4, 0xf6, 0xf8, 0x02, 0x0d, 0x04, + 0xff, 0xfd, 0x03, 0x0d, 0x04, 0x00, 0x07, 0x06, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x10, 0x0f, 0x12, 0x16, 0x10, 0x06, + 0x06, 0x08, 0x0c, 0x0c, 0x1a, 0x1c, 0x11, 0x0f, 0x0f, 0x0c, 0x0a, 0x07, + 0x03, 0x01, 0x04, 0x06, 0x02, 0x02, 0x00, 0xfc, 0xfc, 0x04, 0x0e, 0x01, + 0xfa, 0xfc, 0xfa, 0xf7, 0xf6, 0xfa, 0xf2, 0xeb, 0xf0, 0xed, 0xe9, 0xf1, + 0xf8, 0xef, 0xee, 0xf0, 0xf1, 0xf8, 0x00, 0xfe, 0xfe, 0x03, 0x04, 0x07, + 0x0a, 0x06, 0x02, 0x03, 0x15, 0x1b, 0x1e, 0x1c, 0x15, 0x0c, 0x12, 0x1b, + 0x12, 0x0f, 0x10, 0x0d, 0x0d, 0x0f, 0x0b, 0x07, 0x07, 0x15, 0x14, 0x04, + 0x01, 0x04, 0x02, 0x00, 0xfe, 0xfd, 0xfc, 0x00, 0x00, 0xfc, 0xfc, 0xfa, + 0xef, 0xeb, 0xf4, 0xf8, 0xf7, 0xfa, 0xfe, 0xfe, 0x04, 0x0e, 0x0a, 0x0a, + 0x04, 0x00, 0x00, 0x03, 0x14, 0x12, 0x0d, 0x0d, 0x0a, 0x07, 0x04, 0x01, + 0xfe, 0xfe, 0x00, 0x05, 0x02, 0xfc, 0xfa, 0x00, 0x04, 0x0d, 0x08, 0xfe, + 0x00, 0x04, 0x01, 0xf9, 0xf3, 0xf7, 0x01, 0x01, 0xfe, 0xfc, 0xfc, 0xfa, + 0xf5, 0xf4, 0xf6, 0xfc, 0x00, 0x04, 0x0e, 0x0b, 0x04, 0x02, 0x06, 0x06, + 0x00, 0xfc, 0x00, 0x08, 0x1b, 0x1f, 0x22, 0x15, 0x10, 0x0f, 0x0d, 0x08, + 0x08, 0x0d, 0x0e, 0x0e, 0x0b, 0x0c, 0x0a, 0x09, 0x08, 0x10, 0x08, 0x03, + 0x0c, 0x07, 0xf8, 0xf6, 0x00, 0x00, 0xfc, 0xfc, 0xfd, 0xfc, 0xf8, 0xf2, + 0xeb, 0xec, 0xee, 0xee, 0xee, 0xf6, 0xfe, 0xf9, 0xfa, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0xfc, 0x03, 0x11, 0x0b, 0x0a, 0x08, 0x08, 0x01, 0xfd, 0xfe, + 0xfd, 0x00, 0x0e, 0x11, 0x08, 0x09, 0x0c, 0x0a, 0x10, 0x14, 0x0c, 0x02, + 0x04, 0x0a, 0x0a, 0x06, 0x04, 0x00, 0x00, 0x08, 0x0b, 0x06, 0x00, 0xff, + 0x01, 0x0a, 0x08, 0x06, 0x08, 0x10, 0x14, 0x0e, 0x08, 0x04, 0x03, 0xfe, + 0xff, 0x00, 0x00, 0x12, 0x14, 0x07, 0x05, 0x06, 0x04, 0x00, 0xfc, 0xfa, + 0xfa, 0xfa, 0xf4, 0xea, 0xe9, 0xee, 0xec, 0xec, 0xfe, 0x00, 0xf8, 0x04, + 0x07, 0x02, 0xfe, 0xfa, 0xfc, 0x01, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, + 0x02, 0x01, 0x00, 0x02, 0x04, 0x04, 0x10, 0x15, 0x12, 0x16, 0x10, 0x08, + 0x08, 0x0c, 0x16, 0x25, 0x19, 0x0d, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x04, + 0x05, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xfc, 0xf6, + 0xf0, 0xf4, 0xf7, 0xf6, 0xf3, 0xf2, 0xf4, 0xfa, 0x04, 0x00, 0xfb, 0xf6, + 0xf4, 0xf4, 0xf2, 0xf2, 0xf8, 0xfd, 0x06, 0x0e, 0x10, 0x0c, 0x06, 0x00, + 0x00, 0x03, 0x0a, 0x12, 0x0c, 0x14, 0x1c, 0x15, 0x0e, 0x10, 0x10, 0x12, + 0x12, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x05, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x00, 0xfe, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf4, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf6, 0x00, 0x0a, 0x0a, 0x0a, 0x0b, 0x0c, 0x05, 0x00, + 0x00, 0x04, 0x14, 0x1a, 0x16, 0x10, 0x0c, 0x08, 0x07, 0x05, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x06, 0x16, 0x10, 0x0b, 0xff, 0xf7, + 0xf6, 0xfc, 0xf8, 0xf9, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x02, 0x02, 0x02, + 0xfd, 0xf9, 0xfb, 0x00, 0xf8, 0xec, 0xf6, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x02, 0x16, 0x29, 0x20, 0x18, 0x12, 0x0e, 0x0c, 0x08, 0x0a, 0x0d, 0x0b, + 0x0a, 0x0b, 0x0a, 0x04, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x06, 0x04, 0x00, 0xff, 0x00, 0xf8, 0xf6, 0xf6, 0xf3, 0xf0, 0xec, + 0xee, 0xf0, 0xf4, 0xf8, 0xf6, 0xf6, 0x00, 0x08, 0x08, 0x01, 0xfc, 0xfd, + 0xfe, 0x0a, 0x12, 0x0a, 0x02, 0x07, 0x08, 0x06, 0x08, 0x12, 0x1c, 0x14, + 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x07, 0x13, 0x12, 0x10, 0x0a, 0x0a, 0x0c, + 0x08, 0x06, 0x04, 0x00, 0x00, 0xf8, 0xf0, 0x04, 0x0e, 0x0b, 0x04, 0x00, + 0x00, 0x03, 0x04, 0x00, 0xff, 0xfa, 0x00, 0x03, 0x02, 0x00, 0x00, 0xfe, + 0x02, 0x14, 0x10, 0x0a, 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xfa, 0xf4, 0xee, + 0xe8, 0xea, 0xed, 0xec, 0xf2, 0x02, 0x08, 0x0b, 0x00, 0xfc, 0xff, 0x00, + 0xff, 0xff, 0x02, 0x05, 0x04, 0x01, 0x05, 0x0c, 0x0c, 0x04, 0x00, 0xff, + 0x00, 0x02, 0x04, 0x04, 0x0c, 0x0e, 0x1a, 0x1e, 0x17, 0x16, 0x12, 0x10, + 0x18, 0x23, 0x14, 0x0e, 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x06, 0x08, + 0x08, 0x04, 0xfc, 0xf8, 0x00, 0x04, 0xf8, 0xea, 0xe9, 0xec, 0xf3, 0xf4, + 0xf2, 0xf6, 0xf8, 0x05, 0x01, 0xfa, 0xfa, 0xfa, 0xf6, 0xf2, 0xf0, 0xf0, + 0xf0, 0xf6, 0xf8, 0xfc, 0x00, 0xff, 0x00, 0xfe, 0x00, 0x05, 0x04, 0x02, + 0x15, 0x1f, 0x24, 0x1c, 0x16, 0x16, 0x12, 0x10, 0x0e, 0x0e, 0x0a, 0x04, + 0x02, 0x00, 0xfe, 0x04, 0x12, 0x0a, 0x08, 0x06, 0x02, 0x04, 0x06, 0x02, + 0x00, 0x00, 0xfc, 0xfc, 0xfa, 0xf9, 0xf5, 0xf5, 0xfd, 0xfb, 0xf9, 0x04, + 0x0f, 0x07, 0x01, 0x03, 0x04, 0x01, 0x05, 0x05, 0x03, 0x05, 0x05, 0x12, + 0x23, 0x1d, 0x11, 0x04, 0x01, 0x03, 0x02, 0xf5, 0xfd, 0x01, 0x07, 0x0b, + 0x00, 0xf9, 0xfe, 0x0d, 0x05, 0xfb, 0xf9, 0xf5, 0xf5, 0xfb, 0xfb, 0xf7, + 0xfd, 0x07, 0x02, 0xff, 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xf9, 0xf9, 0xf6, + 0xf1, 0xed, 0xf1, 0xef, 0xf7, 0x01, 0x09, 0x09, 0x17, 0x19, 0x15, 0x24, + 0x21, 0x17, 0x11, 0x0d, 0x0c, 0x0b, 0x0d, 0x12, 0x13, 0x0f, 0x0b, 0x03, + 0x00, 0x00, 0xf5, 0xf9, 0xf5, 0xf1, 0xf1, 0xf5, 0xfb, 0xfb, 0xf7, 0xf7, + 0xfd, 0xfb, 0xf1, 0xf5, 0xfb, 0xfd, 0x05, 0x13, 0x19, 0x17, 0x13, 0x11, + 0x11, 0x17, 0x1f, 0x23, 0x23, 0x23, 0x21, 0x23, 0x21, 0x17, 0x09, 0x00, + 0xfb, 0xf1, 0xeb, 0xef, 0xef, 0xed, 0xe7, 0xe5, 0xeb, 0xf7, 0xf9, 0xf7, + 0xfb, 0xf9, 0xf5, 0xf9, 0xf9, 0xf8, 0xfd, 0x09, 0x0d, 0x07, 0x03, 0x03, + 0x00, 0x03, 0x0b, 0x0f, 0x07, 0x00, 0xfd, 0xf1, 0xeb, 0xf3, 0xfd, 0x09, + 0x0b, 0x05, 0x07, 0x18, 0x20, 0x1d, 0x1c, 0x21, 0x20, 0x17, 0x13, 0x13, + 0x0d, 0x05, 0xff, 0xf7, 0xf1, 0xf7, 0x02, 0x09, 0x08, 0x00, 0xf3, 0xed, + 0xed, 0xee, 0xf3, 0xfa, 0x01, 0x05, 0x00, 0xf5, 0xfb, 0x04, 0x03, 0xfd, + 0xf9, 0xf3, 0xf4, 0xfa, 0xf9, 0xf5, 0xfe, 0x08, 0x06, 0x00, 0x00, 0x02, + 0x01, 0x07, 0x0e, 0x0a, 0x08, 0x12, 0x1c, 0x1a, 0x16, 0x12, 0x0e, 0x0e, + 0x0b, 0x06, 0x10, 0x1d, 0x1c, 0x0d, 0x02, 0xfd, 0xfe, 0x00, 0xff, 0xf7, + 0xea, 0xe8, 0xef, 0xf0, 0xec, 0xec, 0xf6, 0x00, 0x02, 0x02, 0xfe, 0xfc, + 0xf8, 0xf6, 0xf8, 0xfc, 0x06, 0x10, 0x12, 0x0c, 0x0e, 0x14, 0x12, 0x10, + 0x0b, 0x04, 0x08, 0x0c, 0x04, 0xfa, 0xf0, 0xf2, 0xf7, 0xfc, 0xff, 0x00, + 0x00, 0x07, 0x10, 0x0c, 0x04, 0x08, 0x10, 0x0e, 0x0a, 0x08, 0x08, 0x06, + 0x00, 0xfc, 0xfe, 0x04, 0x08, 0x0e, 0x0c, 0x00, 0xf9, 0xf6, 0xf4, 0xf6, + 0xfa, 0x02, 0x0c, 0x0e, 0x04, 0x00, 0x0a, 0x16, 0x1a, 0x10, 0xff, 0xf4, + 0xf0, 0xf6, 0xf8, 0xf3, 0xf2, 0xf6, 0xf4, 0xf0, 0xf6, 0xfd, 0xfa, 0xf6, + 0xf4, 0xf0, 0xfa, 0x0c, 0x1a, 0x1c, 0x16, 0x0e, 0x0e, 0x10, 0x11, 0x13, + 0x16, 0x21, 0x28, 0x1c, 0x04, 0xfd, 0xff, 0x05, 0x07, 0x06, 0x00, 0xf5, + 0xef, 0xf6, 0xfc, 0xfe, 0x00, 0x08, 0x08, 0xfe, 0xfe, 0x00, 0xfc, 0xf6, + 0xf2, 0xec, 0xf5, 0xfe, 0x00, 0x02, 0x07, 0x09, 0x08, 0x00, 0xf7, 0xf4, + 0xfa, 0x02, 0x02, 0xf6, 0xf0, 0xf3, 0xfb, 0x04, 0x0d, 0x0e, 0x0a, 0x08, + 0x09, 0x0a, 0x08, 0x0a, 0x16, 0x1c, 0x18, 0x10, 0x12, 0x0e, 0x08, 0x0a, + 0x11, 0x18, 0x20, 0x1e, 0x0c, 0x00, 0xfb, 0xf7, 0xed, 0xea, 0xee, 0xee, + 0xf2, 0xfc, 0xfe, 0xf9, 0xfa, 0x00, 0xff, 0xfc, 0xfa, 0xf8, 0xf2, 0xf2, + 0xf7, 0xf5, 0xf4, 0xf9, 0xfd, 0xfe, 0x00, 0x04, 0x08, 0x00, 0xf4, 0xf0, + 0xfa, 0x0e, 0x21, 0x25, 0x20, 0x18, 0x15, 0x14, 0x1c, 0x28, 0x28, 0x25, + 0x21, 0x19, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf8, 0xef, 0xe6, 0xef, + 0xfb, 0xf7, 0xf5, 0xf4, 0xf1, 0xf4, 0xfa, 0xfe, 0xfa, 0xf4, 0xf0, 0xf0, + 0xf6, 0x00, 0x06, 0x0a, 0x0a, 0x0a, 0x02, 0xfc, 0xfd, 0xff, 0xfe, 0x02, + 0x06, 0x00, 0xfb, 0x01, 0x05, 0x17, 0x26, 0x29, 0x26, 0x14, 0x04, 0x03, + 0x06, 0x04, 0x03, 0x08, 0x0a, 0x07, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x03, 0x08, 0x0a, 0x06, 0xff, 0xfa, 0xf2, 0xed, 0xf4, 0xf6, 0xf8, 0x01, + 0x06, 0x04, 0x05, 0x03, 0xfb, 0xfd, 0x01, 0x01, 0xff, 0xf7, 0xf9, 0x00, + 0xfe, 0xfa, 0x00, 0x0c, 0x12, 0x0c, 0x04, 0xfe, 0xf8, 0xf2, 0xf3, 0x00, + 0x0c, 0x10, 0x14, 0x0e, 0x0a, 0x14, 0x17, 0x1b, 0x1c, 0x14, 0x06, 0x08, + 0x0a, 0x04, 0x01, 0x01, 0x05, 0x09, 0x01, 0xfb, 0xf7, 0xf4, 0xf9, 0xfe, + 0xf4, 0xee, 0xf6, 0x00, 0x03, 0x03, 0xfe, 0xfa, 0xfb, 0xfa, 0x00, 0x12, + 0x1c, 0x1f, 0x1c, 0x0c, 0x00, 0xf9, 0xf5, 0xf0, 0xec, 0xea, 0xf0, 0xf4, + 0xf0, 0xf2, 0xff, 0x0b, 0x12, 0x13, 0x0d, 0x0c, 0x06, 0x06, 0x0a, 0x0c, + 0x04, 0x06, 0x14, 0x15, 0x12, 0x11, 0x0d, 0x0b, 0x0a, 0x03, 0x02, 0x0c, + 0x14, 0x10, 0x00, 0xfb, 0x00, 0xfe, 0xfa, 0xfc, 0x02, 0x06, 0x06, 0x03, + 0x01, 0xfd, 0xf7, 0xf2, 0xf0, 0xf2, 0xec, 0xec, 0xf2, 0xf5, 0xfb, 0xfa, + 0xf8, 0xff, 0x05, 0xff, 0xfa, 0xfd, 0xfc, 0xf7, 0xf4, 0x00, 0x15, 0x1c, + 0x17, 0x10, 0x11, 0x14, 0x19, 0x19, 0x17, 0x15, 0x13, 0x0d, 0x0b, 0x0b, + 0x06, 0x08, 0x10, 0x15, 0x15, 0x13, 0x10, 0x0e, 0x0a, 0xff, 0xef, 0xe6, + 0xe8, 0xe9, 0xea, 0xf0, 0xf7, 0xf3, 0xeb, 0xe7, 0xed, 0xfb, 0x04, 0x02, + 0x04, 0x04, 0x00, 0xfd, 0xfd, 0xf8, 0xf0, 0xf3, 0xf6, 0xf8, 0xfe, 0x04, + 0x09, 0x16, 0x1d, 0x1a, 0x11, 0x13, 0x16, 0x0f, 0x07, 0x0d, 0x12, 0x13, + 0x16, 0x1b, 0x1f, 0x1b, 0x17, 0x0e, 0x02, 0xfa, 0xfc, 0x02, 0x02, 0xfe, + 0xf6, 0xf3, 0xf5, 0xfd, 0xff, 0xf9, 0xf7, 0xfa, 0xf8, 0xf4, 0xf8, 0xfe, + 0xfb, 0xf1, 0xef, 0xf7, 0xf9, 0xfb, 0xfd, 0xfc, 0xfa, 0xfa, 0xf8, 0xfa, + 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0xfc, 0x08, 0x1c, 0x29, 0x29, 0x25, + 0x21, 0x21, 0x21, 0x19, 0x0c, 0x05, 0x00, 0xf2, 0xec, 0xf8, 0x03, 0x03, + 0x01, 0x04, 0x06, 0x00, 0xfe, 0x02, 0x00, 0xfc, 0xf7, 0xf5, 0xf3, 0xef, + 0xf1, 0xf4, 0xfc, 0x04, 0xfe, 0xf4, 0xf4, 0x00, 0x0a, 0x0a, 0x07, 0x04, + 0xfe, 0xfd, 0x01, 0x01, 0xff, 0xfc, 0xf6, 0xf6, 0xff, 0x0b, 0x14, 0x14, + 0x12, 0x09, 0x03, 0x04, 0x04, 0x00, 0x00, 0x02, 0x0b, 0x12, 0x10, 0x12, + 0x12, 0x11, 0x12, 0x0f, 0x03, 0xfd, 0xfe, 0x01, 0x04, 0x08, 0x02, 0xfa, + 0xfc, 0x00, 0x02, 0xff, 0xfc, 0xf2, 0xee, 0xf0, 0xfa, 0x02, 0x02, 0xfc, + 0xf8, 0xf9, 0x02, 0x0c, 0x0c, 0x0d, 0x0c, 0x03, 0xfc, 0xf4, 0xf2, 0xf0, + 0xea, 0xec, 0xf7, 0xfd, 0x00, 0x01, 0x09, 0x13, 0x15, 0x12, 0x0c, 0x12, + 0x19, 0x19, 0x17, 0x12, 0x05, 0xf9, 0xf6, 0xfd, 0x0b, 0x14, 0x14, 0x10, + 0x0e, 0x0c, 0x0f, 0x0d, 0x07, 0x00, 0xfa, 0xfa, 0xfd, 0x00, 0x00, 0xfe, + 0xfc, 0x02, 0x00, 0xfc, 0xf4, 0xf4, 0xf8, 0xf8, 0xf8, 0xf2, 0xec, 0xee, + 0xf3, 0xf7, 0xfd, 0xf9, 0xee, 0xec, 0xf4, 0x00, 0x10, 0x1a, 0x14, 0x07, + 0x05, 0x09, 0x0e, 0x12, 0x15, 0x13, 0x10, 0x0e, 0x11, 0x14, 0x15, 0x13, + 0x11, 0x11, 0x10, 0x0a, 0x06, 0x0c, 0x0c, 0x0c, 0x0e, 0x0a, 0x06, 0x0a, + 0x0e, 0x0b, 0x01, 0xf0, 0xda, 0xd2, 0xd8, 0xe0, 0xed, 0xf6, 0xf2, 0xf0, + 0xf0, 0xf4, 0xfa, 0x00, 0x02, 0x00, 0xf9, 0xf9, 0xfc, 0xfe, 0xfa, 0xf8, + 0xff, 0x09, 0x10, 0x11, 0x16, 0x1b, 0x1c, 0x1c, 0x1c, 0x1a, 0x12, 0x13, + 0x19, 0x16, 0x0f, 0x05, 0x01, 0x03, 0x05, 0x0a, 0x12, 0x12, 0x0c, 0x03, + 0xfd, 0xfc, 0xfd, 0xf8, 0xf7, 0xf3, 0xf3, 0xf8, 0xfc, 0xfc, 0xf1, 0xf1, + 0xfa, 0xfe, 0xfe, 0xfe, 0xf7, 0xf2, 0xf5, 0xf4, 0xf7, 0xfc, 0xfd, 0xfe, + 0xfe, 0xf9, 0xf2, 0xf3, 0xf8, 0x00, 0x07, 0x12, 0x1c, 0x1a, 0x11, 0x10, + 0x11, 0x15, 0x1c, 0x24, 0x20, 0x16, 0x12, 0x15, 0x18, 0x0c, 0xfa, 0xf8, + 0xfb, 0xfb, 0x03, 0x0a, 0x04, 0xfe, 0xfb, 0xf8, 0xfd, 0x02, 0x06, 0x08, + 0x04, 0xf8, 0xeb, 0xe2, 0xe2, 0xe4, 0xea, 0xf4, 0x01, 0x03, 0xfe, 0xff, + 0x02, 0x06, 0x0c, 0x0a, 0xfd, 0xf6, 0xfa, 0x03, 0x07, 0x06, 0x07, 0x0d, + 0x0f, 0x10, 0x15, 0x13, 0x0e, 0x0a, 0x05, 0x06, 0x08, 0x07, 0x09, 0x0a, + 0x04, 0xfa, 0xfd, 0x02, 0xfe, 0xff, 0x06, 0x17, 0x1b, 0x0e, 0x00, 0xfc, + 0xfc, 0x00, 0x08, 0x0c, 0x02, 0xfe, 0x00, 0x00, 0xfe, 0xf9, 0xf7, 0xf8, + 0xfe, 0x03, 0x02, 0xfc, 0xfc, 0xfa, 0xf8, 0xf6, 0x00, 0x02, 0xfe, 0xf8, + 0xf3, 0xf5, 0xf9, 0xf6, 0xef, 0xef, 0xfa, 0x08, 0x0f, 0x0c, 0x07, 0x06, + 0x0a, 0x10, 0x1e, 0x20, 0x16, 0x14, 0x18, 0x17, 0x0f, 0x06, 0x07, 0x0d, + 0x11, 0x0c, 0x0d, 0x0d, 0x08, 0x04, 0x05, 0x0e, 0x0d, 0x0b, 0x04, 0xf6, + 0xed, 0xef, 0xef, 0xe6, 0xe2, 0xeb, 0xf4, 0xf7, 0xfc, 0xfa, 0xf4, 0xf6, + 0xf8, 0xf8, 0xf7, 0xf2, 0xef, 0xf8, 0xfd, 0xfd, 0x01, 0x07, 0x0a, 0x14, + 0x1b, 0x1b, 0x17, 0x12, 0x07, 0x01, 0x08, 0x14, 0x1a, 0x13, 0x09, 0x03, + 0x05, 0x0a, 0x0c, 0x05, 0x04, 0x0a, 0x15, 0x18, 0x0f, 0x05, 0x04, 0x06, + 0x04, 0x08, 0x11, 0x0b, 0xfe, 0xff, 0x01, 0xf7, 0xed, 0xec, 0xea, 0xe8, + 0xec, 0xf3, 0xf7, 0xf1, 0xed, 0xee, 0xf1, 0xf5, 0xfc, 0xf8, 0xf5, 0xfc, + 0x01, 0x00, 0xfc, 0xfb, 0x02, 0x09, 0x10, 0x12, 0x11, 0x14, 0x16, 0x1c, + 0x23, 0x27, 0x28, 0x20, 0x17, 0x14, 0x0f, 0x10, 0x12, 0x0e, 0x10, 0x11, + 0x09, 0x02, 0xff, 0xfa, 0xf7, 0xfc, 0x00, 0xfe, 0xf1, 0xec, 0xf0, 0xee, + 0xe7, 0xdd, 0xd8, 0xda, 0xe5, 0xf6, 0x02, 0x04, 0x02, 0x00, 0xfa, 0xf5, + 0xfa, 0x04, 0x03, 0xff, 0x06, 0x0e, 0x10, 0x15, 0x17, 0x18, 0x1a, 0x1b, + 0x18, 0x11, 0x0a, 0x0b, 0x0e, 0x15, 0x14, 0x09, 0x01, 0x01, 0x02, 0x03, + 0x00, 0x00, 0xfe, 0xff, 0xfa, 0xfa, 0x02, 0x02, 0x00, 0xfd, 0xff, 0x01, + 0x09, 0x12, 0x10, 0x09, 0x07, 0x03, 0xfb, 0xee, 0xef, 0xfd, 0xff, 0xf9, + 0xf9, 0xf6, 0xf5, 0xfb, 0x01, 0x01, 0xf9, 0xf5, 0xfa, 0x04, 0x03, 0xff, + 0x01, 0x00, 0xfe, 0xff, 0x03, 0x0b, 0x0d, 0x09, 0x0a, 0x0b, 0x11, 0x1a, + 0x1d, 0x14, 0x0c, 0x0d, 0x0f, 0x0d, 0x08, 0x06, 0x0e, 0x14, 0x10, 0x0b, + 0x07, 0x05, 0x02, 0x06, 0x03, 0xfd, 0xfa, 0xf9, 0xf8, 0xf8, 0xf7, 0xf2, + 0xe8, 0xe6, 0xeb, 0xf0, 0xf9, 0x04, 0x06, 0xfe, 0x00, 0x00, 0xfa, 0xfc, + 0xfd, 0xfc, 0xfe, 0x07, 0x0e, 0x06, 0x06, 0x13, 0x1c, 0x14, 0x05, 0xfd, + 0xfc, 0xfe, 0x01, 0x0a, 0x11, 0x0b, 0x02, 0x02, 0x0b, 0x0f, 0x0c, 0x08, + 0x01, 0xff, 0x05, 0x07, 0x07, 0x0a, 0x04, 0x02, 0x06, 0x0f, 0x12, 0x13, + 0x18, 0x18, 0x14, 0x0d, 0x00, 0xef, 0xef, 0xf9, 0xf7, 0xee, 0xf0, 0xf4, + 0xf0, 0xee, 0xf0, 0xf1, 0xed, 0xe8, 0xe4, 0xed, 0xff, 0x02, 0xfa, 0xf9, + 0xf6, 0xf6, 0xfa, 0x02, 0x0a, 0x0e, 0x14, 0x18, 0x1d, 0x1f, 0x1f, 0x1d, + 0x1a, 0x1a, 0x18, 0x18, 0x1b, 0x1d, 0x23, 0x26, 0x1c, 0x11, 0x0b, 0x04, + 0xfe, 0x00, 0x06, 0x01, 0xf5, 0xec, 0xea, 0xec, 0xee, 0xe6, 0xda, 0xd3, + 0xdb, 0xe4, 0xed, 0xf1, 0xf3, 0xf1, 0xf1, 0xf6, 0xf6, 0xf9, 0xff, 0x04, + 0x10, 0x19, 0x1b, 0x17, 0x15, 0x19, 0x1d, 0x1d, 0x15, 0x0a, 0x06, 0x02, + 0x05, 0x0d, 0x11, 0x0c, 0x06, 0x08, 0x0e, 0x13, 0x13, 0x0f, 0x09, 0xff, + 0xfb, 0xfb, 0xf8, 0xfb, 0x02, 0x01, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x0f, + 0x0b, 0x07, 0xfb, 0xf1, 0xf0, 0xf5, 0xf5, 0xef, 0xeb, 0xec, 0xf2, 0xf7, + 0xfd, 0xfe, 0xf8, 0xf1, 0xf2, 0xf6, 0xfb, 0x01, 0x05, 0x0a, 0x0b, 0x09, + 0x0b, 0x0d, 0x0d, 0x0d, 0x11, 0x14, 0x17, 0x1e, 0x1a, 0x16, 0x14, 0x12, + 0x12, 0x0d, 0x03, 0x06, 0x11, 0x16, 0x16, 0x10, 0x0a, 0x02, 0xf6, 0xee, + 0xf0, 0xef, 0xf0, 0xf9, 0xfc, 0xfb, 0xf8, 0xf9, 0xf5, 0xec, 0xe3, 0xe2, + 0xea, 0xf3, 0xf3, 0xf7, 0xfc, 0x01, 0x01, 0xfd, 0xf9, 0x04, 0x19, 0x21, + 0x24, 0x1d, 0x1d, 0x23, 0x23, 0x14, 0x01, 0xfc, 0xfc, 0xfe, 0xfe, 0x04, + 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x02, 0xfe, 0xfb, 0xfc, + 0xff, 0xfa, 0xf0, 0xfa, 0x0a, 0x11, 0x0f, 0x0f, 0x16, 0x1c, 0x1e, 0x13, + 0x01, 0xfc, 0x06, 0x0b, 0x06, 0x00, 0x00, 0x02, 0xfd, 0xf5, 0xf2, 0xf4, + 0xf3, 0xef, 0xf0, 0xea, 0xea, 0xef, 0xf5, 0xf3, 0xee, 0xf1, 0xf9, 0xfb, + 0xff, 0x02, 0x06, 0x0d, 0x12, 0x09, 0x04, 0x10, 0x1a, 0x22, 0x28, 0x2b, + 0x22, 0x20, 0x26, 0x23, 0x1a, 0x1b, 0x18, 0x0b, 0xff, 0xfa, 0xfa, 0xf8, + 0xf7, 0xf5, 0xf4, 0xfa, 0xfd, 0xfa, 0xf6, 0xf8, 0xf5, 0xed, 0xe4, 0xd8, + 0xd4, 0xdf, 0xea, 0xf8, 0xfc, 0xfb, 0xfe, 0x01, 0x06, 0x0e, 0x17, 0x1b, + 0x17, 0x18, 0x19, 0x10, 0x0d, 0x08, 0xff, 0xf6, 0xf7, 0xff, 0x03, 0x07, + 0x0d, 0x10, 0x13, 0x10, 0x0d, 0x02, 0x03, 0x12, 0x12, 0x0e, 0x0c, 0x0d, + 0x0d, 0x0b, 0x0a, 0x07, 0x09, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x02, 0xf7, + 0xf0, 0xee, 0xec, 0xeb, 0xf2, 0xf3, 0xee, 0xef, 0xf1, 0xe8, 0xe7, 0xe6, + 0xe9, 0xf6, 0xfb, 0xfc, 0x00, 0x09, 0x14, 0x11, 0x07, 0x00, 0x02, 0x05, + 0x07, 0x0b, 0x10, 0x16, 0x19, 0x16, 0x0f, 0x15, 0x25, 0x2e, 0x2f, 0x2d, + 0x28, 0x26, 0x22, 0x19, 0x0f, 0xff, 0xf0, 0xf0, 0xea, 0xe7, 0xec, 0xf4, + 0xf9, 0xf7, 0xf0, 0xe8, 0xe9, 0xf0, 0xef, 0xe7, 0xe1, 0xde, 0xdd, 0xde, + 0xe2, 0xe8, 0xf5, 0x01, 0x08, 0x0c, 0x12, 0x1f, 0x26, 0x26, 0x29, 0x25, + 0x22, 0x26, 0x21, 0x1a, 0x17, 0x14, 0x0d, 0x06, 0xff, 0xfd, 0x03, 0x02, + 0x02, 0x03, 0xfe, 0xf7, 0xf4, 0xf6, 0xf3, 0xf0, 0xef, 0xf2, 0xf9, 0xfe, + 0xfe, 0x01, 0x04, 0x06, 0x04, 0x00, 0x07, 0x17, 0x18, 0x15, 0x1a, 0x17, + 0x0e, 0x07, 0x01, 0x01, 0xfd, 0xf1, 0xeb, 0xeb, 0xef, 0xf6, 0xf7, 0xf6, + 0xf5, 0xf4, 0xf5, 0xfc, 0x0a, 0x13, 0x0f, 0x03, 0xf9, 0xf7, 0xf9, 0xf8, + 0xfc, 0x01, 0x07, 0x09, 0x0d, 0x15, 0x21, 0x29, 0x28, 0x28, 0x25, 0x1b, + 0x15, 0x15, 0x14, 0x0e, 0xfb, 0xec, 0xe6, 0xe6, 0xee, 0xf4, 0xfc, 0x02, + 0x02, 0xfd, 0xf6, 0xf6, 0xfd, 0xff, 0xfa, 0xf4, 0xef, 0xf2, 0xf7, 0xfd, + 0x02, 0x02, 0x08, 0x0a, 0x03, 0x06, 0x12, 0x15, 0x16, 0x15, 0x0a, 0x03, + 0xfe, 0xff, 0x00, 0xfd, 0xf7, 0xf6, 0xf4, 0xf5, 0xfa, 0xff, 0x05, 0x07, + 0x0b, 0x0b, 0x09, 0x11, 0x19, 0x16, 0x0d, 0x09, 0x0a, 0x0a, 0x05, 0x04, + 0x04, 0x09, 0x0f, 0x07, 0xfe, 0x09, 0x13, 0x15, 0x15, 0x12, 0x0b, 0x0a, + 0x06, 0xfe, 0xf1, 0xe6, 0xdc, 0xda, 0xde, 0xe4, 0xec, 0xf4, 0xf9, 0xfa, + 0xf3, 0xf5, 0xfc, 0x03, 0x03, 0xfd, 0xf8, 0xf7, 0xf7, 0xf8, 0xfa, 0xfd, + 0x00, 0x07, 0x11, 0x15, 0x1e, 0x33, 0x40, 0x3c, 0x37, 0x33, 0x2b, 0x29, + 0x29, 0x22, 0x19, 0x09, 0xfc, 0xf5, 0xf7, 0xfd, 0xf9, 0xf0, 0xec, 0xe8, + 0xe6, 0xe6, 0xe2, 0xdd, 0xd9, 0xd8, 0xd6, 0xd6, 0xd9, 0xe1, 0xe7, 0xf2, + 0xf7, 0xfc, 0x05, 0x0c, 0x14, 0x24, 0x2b, 0x29, 0x29, 0x2b, 0x29, 0x24, + 0x20, 0x1c, 0x0e, 0xff, 0xf4, 0xf8, 0x01, 0x05, 0x02, 0x02, 0x04, 0x07, + 0x08, 0x09, 0x09, 0x07, 0x02, 0x01, 0x02, 0xff, 0xfd, 0xfb, 0xf9, 0xfa, + 0xfa, 0xfa, 0xfe, 0x03, 0x0d, 0x18, 0x1b, 0x15, 0x0c, 0x05, 0x01, 0xfe, + 0xf9, 0xeb, 0xdb, 0xd4, 0xda, 0xe5, 0xef, 0xf7, 0xfd, 0x00, 0xfd, 0xff, + 0x07, 0x09, 0x0f, 0x11, 0x0c, 0x0b, 0x0f, 0x0f, 0x0f, 0x11, 0x0e, 0x0a, + 0x0e, 0x13, 0x18, 0x1d, 0x29, 0x2c, 0x26, 0x18, 0x10, 0x0e, 0x08, 0x02, + 0xfe, 0xf0, 0xe5, 0xdf, 0xe0, 0xe7, 0xee, 0xed, 0xed, 0xf1, 0xf7, 0xfb, + 0xfe, 0x00, 0x01, 0xfd, 0xfc, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xfe, 0xfe, + 0x04, 0x08, 0x10, 0x1b, 0x25, 0x22, 0x1e, 0x1d, 0x1b, 0x17, 0x0b, 0x01, + 0xfd, 0xf7, 0xef, 0xeb, 0xf0, 0xf7, 0xfd, 0xff, 0x00, 0x03, 0x06, 0x08, + 0x0a, 0x08, 0x03, 0xfd, 0xfa, 0xfb, 0xf9, 0xf7, 0xfb, 0xf9, 0xf7, 0xf6, + 0xfc, 0x07, 0x13, 0x1f, 0x1c, 0x19, 0x21, 0x25, 0x21, 0x1b, 0x0e, 0x00, + 0x01, 0xfe, 0xf3, 0xf0, 0xf7, 0xfa, 0xfa, 0xf9, 0xfb, 0xf8, 0xf3, 0xed, + 0xe8, 0xe9, 0xe9, 0xec, 0xed, 0xef, 0xf2, 0xf5, 0xf4, 0xf2, 0xef, 0xf5, + 0x0a, 0x1e, 0x2c, 0x36, 0x39, 0x37, 0x3b, 0x3b, 0x36, 0x28, 0x18, 0x10, + 0x0f, 0x06, 0xfc, 0xfc, 0xfb, 0xef, 0xe7, 0xea, 0xee, 0xf3, 0xf5, 0xf6, + 0xf6, 0xef, 0xe9, 0xe3, 0xe6, 0xeb, 0xf4, 0xf4, 0xec, 0xf0, 0xf7, 0xfd, + 0x13, 0x20, 0x1b, 0x1b, 0x1e, 0x18, 0x15, 0x1c, 0x19, 0x04, 0xf2, 0xec, + 0xee, 0xed, 0xec, 0xf4, 0xfa, 0xff, 0x07, 0x0b, 0x0f, 0x11, 0x0e, 0x0f, + 0x18, 0x1b, 0x13, 0x10, 0x14, 0x13, 0x1a, 0x16, 0x07, 0x00, 0xfc, 0xfb, + 0x0a, 0x14, 0x14, 0x0f, 0x05, 0xfc, 0x01, 0x01, 0xf4, 0xe6, 0xe3, 0xe5, + 0xdf, 0xd9, 0xd6, 0xdd, 0xe3, 0xe9, 0xf4, 0xf9, 0xfe, 0x05, 0x05, 0x06, + 0x11, 0x14, 0x0f, 0x14, 0x15, 0x12, 0x12, 0x12, 0x11, 0x0c, 0x08, 0x13, + 0x23, 0x29, 0x2a, 0x2e, 0x2d, 0x2c, 0x27, 0x15, 0x00, 0xf7, 0xf2, 0xf3, + 0xef, 0xea, 0xe9, 0xe9, 0xea, 0xec, 0xf0, 0xf6, 0xf2, 0xf1, 0xf3, 0xf2, + 0xef, 0xf1, 0xf2, 0xee, 0xe7, 0xe6, 0xe8, 0xed, 0xf5, 0xfe, 0x0f, 0x1d, + 0x22, 0x20, 0x21, 0x22, 0x22, 0x24, 0x21, 0x1a, 0x17, 0x13, 0x0d, 0x0c, + 0x09, 0x07, 0x02, 0xfc, 0xfd, 0x02, 0x06, 0x0b, 0x05, 0xfc, 0xf8, 0xf8, + 0xf4, 0xf3, 0xf4, 0xf5, 0xf6, 0xf2, 0xef, 0xe9, 0xe5, 0xed, 0xf7, 0xfd, + 0xff, 0x0a, 0x17, 0x21, 0x26, 0x24, 0x1f, 0x21, 0x1a, 0x0a, 0x02, 0xff, + 0xff, 0x01, 0xfd, 0xf4, 0xf6, 0xfc, 0xfd, 0xfb, 0xf9, 0xfd, 0xfb, 0xf5, + 0xf4, 0xf3, 0xf8, 0xf9, 0xf6, 0xf5, 0xf3, 0xfa, 0x05, 0x15, 0x1f, 0x20, + 0x24, 0x30, 0x31, 0x28, 0x22, 0x15, 0x0d, 0x0b, 0xff, 0xef, 0xeb, 0xe7, + 0xe2, 0xe4, 0xed, 0xf3, 0xf7, 0xf6, 0xf4, 0xf7, 0x00, 0x07, 0x09, 0x03, + 0xff, 0x05, 0x0d, 0x0b, 0x09, 0x08, 0x0a, 0x13, 0x16, 0x13, 0x12, 0x10, + 0x15, 0x15, 0x0d, 0x04, 0xfb, 0xf4, 0xf5, 0xfa, 0xf8, 0xf2, 0xed, 0xe7, + 0xe2, 0xe3, 0xe9, 0xf3, 0xf7, 0xf9, 0xfb, 0x06, 0x11, 0x16, 0x1a, 0x1d, + 0x24, 0x29, 0x1e, 0x10, 0x0d, 0x10, 0x12, 0x13, 0x0f, 0x06, 0xfd, 0x02, + 0x09, 0x13, 0x18, 0x13, 0x05, 0xff, 0xfe, 0xfa, 0xf2, 0xeb, 0xe7, 0xe2, + 0xdf, 0xe7, 0xf6, 0xfc, 0xfe, 0xfe, 0x00, 0x02, 0xfc, 0xf6, 0xf1, 0xf6, + 0xf8, 0xf3, 0xf2, 0xf2, 0xf2, 0xf4, 0xfe, 0x16, 0x24, 0x22, 0x21, 0x21, + 0x28, 0x34, 0x35, 0x2c, 0x21, 0x1b, 0x19, 0x18, 0x13, 0x0c, 0x05, 0xfc, + 0xfd, 0xfd, 0xf5, 0xef, 0xed, 0xf0, 0xee, 0xeb, 0xf0, 0xef, 0xeb, 0xea, + 0xe8, 0xe6, 0xea, 0xed, 0xee, 0xee, 0xfc, 0x01, 0xff, 0xfd, 0xfc, 0xff, + 0x0b, 0x11, 0x10, 0x10, 0x1a, 0x2a, 0x30, 0x28, 0x19, 0x0e, 0x07, 0x0a, + 0x07, 0x04, 0x09, 0x08, 0x05, 0x05, 0x08, 0x0b, 0x0a, 0x07, 0x03, 0xfe, + 0xf8, 0xf6, 0xf7, 0xf2, 0xef, 0xf7, 0x01, 0xfe, 0xfe, 0x00, 0x03, 0x10, + 0x1c, 0x19, 0x10, 0x07, 0x04, 0x01, 0xf7, 0xf2, 0xee, 0xea, 0xe3, 0xe3, + 0xeb, 0xf9, 0x06, 0x08, 0xfe, 0xfc, 0x02, 0x06, 0x08, 0x06, 0x05, 0x05, + 0x07, 0x0b, 0x0e, 0x14, 0x1e, 0x29, 0x25, 0x20, 0x1f, 0x18, 0x14, 0x18, + 0x17, 0x0e, 0x0b, 0x07, 0x03, 0xff, 0xfd, 0xf4, 0xec, 0xe4, 0xda, 0xd6, + 0xd9, 0xde, 0xe0, 0xde, 0xe1, 0xef, 0xfc, 0xfd, 0x03, 0x10, 0x18, 0x1c, + 0x18, 0x17, 0x1c, 0x24, 0x25, 0x1e, 0x1a, 0x16, 0x14, 0x08, 0x03, 0x08, + 0x08, 0x01, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xfb, 0xf3, 0xe9, 0xe6, 0xed, + 0xf7, 0xf8, 0xfb, 0x08, 0x13, 0x14, 0x0e, 0x0d, 0x0d, 0x07, 0xfa, 0xf2, + 0xf2, 0xf5, 0xfb, 0xfc, 0xf9, 0x00, 0x03, 0x04, 0x07, 0x09, 0x0e, 0x18, + 0x1d, 0x1c, 0x1c, 0x18, 0x14, 0x13, 0x10, 0x07, 0x01, 0x04, 0x05, 0x02, + 0x00, 0x00, 0xff, 0xfa, 0xf0, 0xeb, 0xee, 0xef, 0xec, 0xe6, 0xe5, 0xed, + 0xf3, 0xfa, 0xfd, 0x02, 0x03, 0x02, 0x01, 0x03, 0x06, 0x04, 0x09, 0x13, + 0x15, 0x14, 0x1c, 0x2b, 0x30, 0x29, 0x22, 0x1d, 0x12, 0x06, 0xfc, 0xf7, + 0xf9, 0xfb, 0xfb, 0xf9, 0xfc, 0x01, 0x00, 0xf8, 0xf4, 0xf1, 0xf0, 0xf2, + 0xf8, 0xfe, 0x04, 0x05, 0x07, 0x03, 0xff, 0xfc, 0xfd, 0x01, 0x09, 0x08, + 0x05, 0x09, 0x07, 0x02, 0xfc, 0xfa, 0xfc, 0xf6, 0xf1, 0xeb, 0xef, 0xf9, + 0x03, 0x08, 0x0e, 0x16, 0x1a, 0x1a, 0x16, 0x12, 0x10, 0x0d, 0x0f, 0x13, + 0x12, 0x0f, 0x12, 0x15, 0x12, 0x0a, 0x07, 0x09, 0x04, 0xfd, 0xff, 0x02, + 0x06, 0x05, 0xfd, 0xf7, 0xf5, 0xf9, 0xf6, 0xef, 0xe9, 0xe5, 0xe2, 0xe2, + 0xe1, 0xe2, 0xe7, 0xee, 0xf4, 0xf5, 0xf3, 0xfa, 0x03, 0x0f, 0x1b, 0x22, + 0x2c, 0x35, 0x31, 0x27, 0x21, 0x1e, 0x1f, 0x1c, 0x13, 0x0d, 0x0d, 0x13, + 0x11, 0x09, 0x06, 0x07, 0x05, 0xfd, 0xf4, 0xe8, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe8, 0xf3, 0xfa, 0x03, 0x08, 0x02, 0xfd, 0xfd, 0xf9, 0xf6, 0xfd, 0x00, + 0x07, 0x09, 0x06, 0x05, 0x03, 0x04, 0x01, 0xfd, 0xff, 0x09, 0x13, 0x17, + 0x13, 0x0f, 0x12, 0x16, 0x16, 0x1a, 0x14, 0x07, 0xfe, 0x00, 0x05, 0x06, + 0x0c, 0x10, 0x09, 0x05, 0x03, 0xfb, 0xf8, 0xf7, 0xf5, 0xf7, 0xf8, 0xfa, + 0xfa, 0xf5, 0xf4, 0xf4, 0xf3, 0xf1, 0xee, 0xed, 0xf3, 0xfd, 0x0b, 0x10, + 0x12, 0x17, 0x19, 0x19, 0x20, 0x25, 0x24, 0x18, 0x09, 0x05, 0x04, 0xfd, + 0xff, 0x01, 0x01, 0xfa, 0xef, 0xec, 0xed, 0xef, 0xf3, 0xfd, 0x05, 0x05, + 0x05, 0x04, 0x07, 0x0c, 0x0b, 0x05, 0x06, 0x05, 0x02, 0x07, 0x12, 0x11, + 0x10, 0x0d, 0x09, 0x08, 0x04, 0xfa, 0xee, 0xe4, 0xe2, 0xe7, 0xed, 0xf7, + 0xff, 0x07, 0x0e, 0x0f, 0x0f, 0x0c, 0x07, 0x07, 0x10, 0x1c, 0x1d, 0x21, + 0x24, 0x19, 0x0f, 0x09, 0x02, 0xfb, 0xfb, 0xf9, 0xf4, 0xfc, 0x04, 0x00, + 0xf7, 0xf7, 0xf8, 0xf8, 0xf4, 0xf6, 0xef, 0xe8, 0xe9, 0xed, 0xf4, 0xf8, + 0xfa, 0xfb, 0xfb, 0xfd, 0x01, 0x0b, 0x14, 0x19, 0x1b, 0x1b, 0x20, 0x24, + 0x22, 0x1d, 0x1b, 0x19, 0x12, 0x0b, 0x0a, 0x08, 0x08, 0x0a, 0x05, 0xfd, + 0xfe, 0x04, 0x04, 0x01, 0x00, 0xfe, 0xf1, 0xe7, 0xe8, 0xe6, 0xe7, 0xf2, + 0xf6, 0xf3, 0xee, 0xee, 0xf2, 0xf6, 0xf8, 0xfc, 0xff, 0x07, 0x13, 0x0f, + 0x08, 0x0b, 0x12, 0x0c, 0x03, 0x06, 0x0a, 0x0c, 0x12, 0x1c, 0x1f, 0x1e, + 0x20, 0x1f, 0x1a, 0x17, 0x17, 0x10, 0xff, 0xf2, 0xf1, 0xf3, 0xfb, 0x01, + 0x00, 0xfd, 0xff, 0xfd, 0xfd, 0xfc, 0xfa, 0xfb, 0xfe, 0x01, 0xff, 0xfc, + 0xfa, 0xfb, 0xf2, 0xe6, 0xe1, 0xe8, 0xe9, 0xee, 0xf8, 0x00, 0x0c, 0x15, + 0x16, 0x12, 0x15, 0x1a, 0x1b, 0x19, 0x10, 0x10, 0x17, 0x1a, 0x1b, 0x16, + 0x0c, 0x05, 0x00, 0xfc, 0xff, 0x02, 0x02, 0x01, 0x05, 0x06, 0x02, 0xfc, + 0xf8, 0xf9, 0xf8, 0xf5, 0xff, 0x02, 0xfe, 0x00, 0xff, 0xfd, 0xff, 0x04, + 0x05, 0x09, 0x0b, 0x0a, 0x08, 0xfd, 0xee, 0xea, 0xee, 0xed, 0xee, 0xf6, + 0xfb, 0xfd, 0xff, 0x04, 0x0d, 0x0e, 0x0a, 0x13, 0x1f, 0x28, 0x29, 0x23, + 0x1e, 0x14, 0x08, 0xff, 0x00, 0xfe, 0xff, 0x05, 0x08, 0x0e, 0x0f, 0x0d, + 0x05, 0xfe, 0xfa, 0xf2, 0xe9, 0xdd, 0xd6, 0xe1, 0xec, 0xee, 0xf1, 0xf6, + 0xf5, 0xf5, 0xfb, 0x09, 0x15, 0x15, 0x17, 0x20, 0x25, 0x20, 0x18, 0x14, + 0x17, 0x13, 0x0b, 0x09, 0x0a, 0x09, 0x01, 0xfc, 0xfd, 0xfe, 0xfb, 0xf9, + 0xfa, 0xff, 0x01, 0x03, 0x01, 0xf6, 0xef, 0xf6, 0xfb, 0x00, 0x01, 0xfd, + 0xfa, 0xfb, 0xfe, 0xfc, 0xf9, 0xfa, 0x08, 0x12, 0x13, 0x0d, 0x06, 0x04, + 0xff, 0xfb, 0xff, 0x03, 0x04, 0x06, 0x07, 0x07, 0x0e, 0x18, 0x1d, 0x1e, + 0x1d, 0x1e, 0x20, 0x1c, 0x0d, 0xfe, 0xf9, 0xf6, 0xed, 0xe6, 0xe4, 0xec, + 0xf9, 0xff, 0xfe, 0xfd, 0xfa, 0xfa, 0xfe, 0x00, 0x05, 0x03, 0xff, 0xfa, + 0xf2, 0xf1, 0xf6, 0xf6, 0xf4, 0xf7, 0x00, 0x04, 0x13, 0x1e, 0x1d, 0x1f, + 0x1f, 0x1d, 0x14, 0x06, 0xf5, 0xf6, 0x0b, 0x15, 0x17, 0x17, 0x17, 0x11, + 0x05, 0xfd, 0x01, 0x03, 0x00, 0x01, 0x04, 0x07, 0x09, 0x07, 0xfe, 0xef, + 0xea, 0xed, 0xf6, 0xf3, 0xf2, 0xf7, 0xf7, 0xf7, 0xf7, 0xf3, 0xee, 0xf7, + 0x07, 0x0f, 0x12, 0x10, 0x05, 0x01, 0xfe, 0xf9, 0xf9, 0xff, 0x04, 0x05, + 0x05, 0x09, 0x0f, 0x14, 0x19, 0x1f, 0x27, 0x2a, 0x23, 0x16, 0x09, 0x07, + 0x0c, 0x0b, 0x00, 0xf2, 0xec, 0xf7, 0x02, 0x09, 0x0e, 0x10, 0x0b, 0x07, + 0x02, 0xfb, 0xf5, 0xeb, 0xdf, 0xda, 0xd5, 0xd7, 0xe1, 0xed, 0xf0, 0xf3, + 0xfe, 0x03, 0x04, 0x07, 0x11, 0x1e, 0x28, 0x28, 0x20, 0x0d, 0x00, 0x09, + 0x19, 0x1d, 0x17, 0x13, 0x13, 0x13, 0x0b, 0x09, 0x0e, 0x0e, 0x06, 0x00, + 0xfc, 0xfa, 0xf9, 0xf4, 0xed, 0xef, 0xf6, 0xff, 0x04, 0xff, 0xfa, 0xfc, + 0xfd, 0xfa, 0xf5, 0xf3, 0xf8, 0x06, 0x13, 0x18, 0x10, 0x02, 0xfc, 0xfa, + 0xf9, 0xf8, 0xf6, 0xf7, 0xfc, 0xfc, 0xf9, 0x00, 0x0e, 0x13, 0x13, 0x1b, + 0x27, 0x2a, 0x1f, 0x10, 0x05, 0x02, 0x01, 0xfc, 0xf3, 0xee, 0xf5, 0xff, + 0x06, 0x07, 0x09, 0x0c, 0x0e, 0x0d, 0x08, 0xfb, 0xf0, 0xea, 0xec, 0xf1, + 0xf3, 0xf3, 0xef, 0xf4, 0xfa, 0x00, 0x10, 0x1a, 0x19, 0x17, 0x18, 0x1d, + 0x1c, 0x12, 0x01, 0xf2, 0xea, 0xf1, 0x02, 0x0f, 0x10, 0x11, 0x0e, 0x06, + 0xfb, 0xf8, 0xfd, 0x06, 0x09, 0x06, 0x06, 0x05, 0x01, 0xfd, 0xf9, 0xfd, + 0x02, 0xf9, 0xf5, 0xff, 0x00, 0xff, 0x04, 0x05, 0xfd, 0xf8, 0xfb, 0x00, + 0x0b, 0x0d, 0x07, 0xfd, 0xff, 0x04, 0x07, 0x05, 0x05, 0x06, 0x02, 0xff, + 0x00, 0x06, 0x11, 0x1d, 0x20, 0x28, 0x28, 0x19, 0x0a, 0x03, 0x02, 0x01, + 0xf9, 0xed, 0xe7, 0xeb, 0xef, 0xf5, 0x03, 0x0a, 0x05, 0x01, 0x03, 0x06, + 0x06, 0xfe, 0xf0, 0xe6, 0xe1, 0xe2, 0xe5, 0xee, 0xf9, 0x01, 0x04, 0x09, + 0x0f, 0x13, 0x1f, 0x26, 0x25, 0x22, 0x18, 0x06, 0x00, 0x05, 0x07, 0x09, + 0x13, 0x14, 0x13, 0x13, 0x15, 0x12, 0x12, 0x0e, 0x03, 0xff, 0xfe, 0xfe, + 0xf9, 0xee, 0xea, 0xe8, 0xea, 0xf4, 0xf6, 0xf8, 0xfb, 0xf8, 0xf2, 0xf0, + 0xf1, 0xf4, 0xfa, 0x00, 0x03, 0x07, 0x0f, 0x10, 0x0b, 0x06, 0x03, 0x03, + 0x03, 0x02, 0x02, 0x05, 0x06, 0x08, 0x0d, 0x11, 0x0f, 0x16, 0x23, 0x27, + 0x1b, 0x13, 0x0e, 0x09, 0x06, 0x05, 0x02, 0xfd, 0xf8, 0xf7, 0xf3, 0xf8, + 0x06, 0x0d, 0x09, 0x09, 0x08, 0xff, 0xf8, 0xf4, 0xe8, 0xe1, 0xe0, 0xdf, + 0xde, 0xe5, 0xf0, 0xfb, 0x05, 0x0c, 0x0e, 0x12, 0x17, 0x1e, 0x1d, 0x19, + 0x0d, 0x01, 0xfb, 0xfa, 0xfa, 0x02, 0x15, 0x1d, 0x18, 0x12, 0x0f, 0x0f, + 0x14, 0x15, 0x0e, 0x08, 0x04, 0xff, 0xfd, 0xfc, 0xfc, 0xfe, 0x02, 0xfd, + 0xf6, 0xfa, 0x03, 0x02, 0xff, 0xfd, 0xf6, 0xf1, 0xf6, 0xfa, 0xfa, 0xfd, + 0x01, 0xfe, 0xfa, 0xfc, 0xfe, 0x06, 0x0c, 0x06, 0xf8, 0xf5, 0xf9, 0x00, + 0x06, 0x0f, 0x13, 0x1d, 0x27, 0x25, 0x1b, 0x13, 0x0e, 0x07, 0x00, 0xf9, + 0xf7, 0xfa, 0xff, 0xff, 0xfd, 0x02, 0x0a, 0x0a, 0x07, 0x06, 0x05, 0x01, + 0xfd, 0xf9, 0xec, 0xe6, 0xee, 0xf6, 0xf5, 0xf4, 0xf7, 0x01, 0x0a, 0x0d, + 0x13, 0x1a, 0x1e, 0x1b, 0x14, 0x0e, 0x02, 0xfb, 0xfc, 0xf9, 0xf6, 0xf7, + 0x05, 0x0f, 0x13, 0x10, 0x0e, 0x0e, 0x10, 0x0a, 0x00, 0x00, 0x01, 0xfb, + 0xf6, 0xf3, 0xef, 0xf8, 0x05, 0x05, 0xff, 0xfb, 0xfc, 0xfd, 0xff, 0x02, + 0x00, 0x00, 0x04, 0x04, 0x05, 0x05, 0x07, 0x0b, 0x0b, 0x09, 0x07, 0x07, + 0x0d, 0x0e, 0x05, 0xff, 0x02, 0x03, 0x04, 0x05, 0x0d, 0x1b, 0x1b, 0x14, + 0x0f, 0x08, 0x03, 0x04, 0x05, 0xfd, 0xf2, 0xf0, 0xf2, 0xf4, 0xfb, 0xfe, + 0x03, 0x09, 0x06, 0x02, 0x00, 0xff, 0xfb, 0xf4, 0xe9, 0xe2, 0xe6, 0xee, + 0xf6, 0xfa, 0x02, 0x0c, 0x12, 0x17, 0x1a, 0x1d, 0x1f, 0x1e, 0x17, 0x10, + 0x09, 0x01, 0x03, 0x09, 0x0c, 0x09, 0x0a, 0x0e, 0x0f, 0x0f, 0x12, 0x10, + 0x12, 0x0e, 0xff, 0xfb, 0xfe, 0xf7, 0xf2, 0xed, 0xef, 0xf1, 0xf2, 0xf5, + 0xf9, 0xf9, 0xfb, 0xfc, 0xf8, 0xf7, 0xf4, 0xf7, 0xfd, 0xfd, 0xfd, 0xfd, + 0xff, 0x02, 0x0c, 0x15, 0x12, 0x0c, 0x0a, 0x07, 0x04, 0x07, 0x0d, 0x10, + 0x12, 0x13, 0x1d, 0x25, 0x21, 0x1c, 0x16, 0x11, 0x09, 0x06, 0x03, 0xfe, + 0xf9, 0xfa, 0xf9, 0xf5, 0xf7, 0xf8, 0xf8, 0xff, 0x01, 0xfd, 0xfa, 0xf8, + 0xf5, 0xf3, 0xec, 0xea, 0xea, 0xeb, 0xed, 0xf2, 0xfe, 0x0a, 0x12, 0x18, + 0x1a, 0x17, 0x18, 0x15, 0x0d, 0x07, 0x02, 0xfe, 0xfc, 0xfe, 0x02, 0x06, + 0x0c, 0x14, 0x16, 0x17, 0x17, 0x15, 0x15, 0x15, 0x0b, 0x03, 0x02, 0xff, + 0xfa, 0xfd, 0x03, 0x00, 0xfa, 0xf6, 0xf5, 0xf4, 0xfb, 0xff, 0xfa, 0xf7, + 0xf7, 0xfb, 0xff, 0xfc, 0xfa, 0xfa, 0xfa, 0xfd, 0x00, 0x02, 0x06, 0x08, + 0x0a, 0x08, 0x03, 0x03, 0x03, 0x02, 0x07, 0x0d, 0x11, 0x13, 0x14, 0x16, + 0x16, 0x15, 0x14, 0x0b, 0xff, 0xf8, 0xf5, 0xf9, 0x03, 0x04, 0x01, 0x03, + 0x05, 0x0b, 0x0b, 0x05, 0x00, 0xfe, 0xfb, 0xf4, 0xea, 0xeb, 0xf2, 0xf4, + 0xf6, 0xfa, 0x00, 0x04, 0x07, 0x11, 0x17, 0x15, 0x12, 0x0e, 0x06, 0x07, + 0x05, 0x00, 0xfe, 0xfb, 0xfd, 0xff, 0x00, 0x0d, 0x17, 0x18, 0x12, 0x0d, + 0x0b, 0x08, 0x00, 0xfb, 0xfd, 0xfa, 0xf5, 0xf2, 0xf5, 0xfb, 0xf9, 0xfa, + 0xff, 0x03, 0x05, 0x01, 0xff, 0x03, 0x07, 0x06, 0x04, 0x01, 0x05, 0x09, + 0x08, 0x0d, 0x0f, 0x0a, 0x02, 0x00, 0x07, 0x09, 0x05, 0x03, 0x03, 0x04, + 0x0e, 0x10, 0x0f, 0x0d, 0x0e, 0x0e, 0x07, 0x02, 0x03, 0x00, 0xf9, 0xfa, + 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xfa, 0xf7, 0xf8, 0xfb, 0x00, 0x06, 0x06, + 0x01, 0xfc, 0xf3, 0xed, 0xed, 0xf4, 0x00, 0x0a, 0x13, 0x17, 0x19, 0x1e, + 0x24, 0x20, 0x1a, 0x12, 0x0c, 0x05, 0xfd, 0xfd, 0xfe, 0xfd, 0x01, 0x04, + 0x00, 0x04, 0x0d, 0x10, 0x12, 0x13, 0x11, 0x07, 0xfd, 0xff, 0x03, 0xfd, + 0xf6, 0xf5, 0xf2, 0xef, 0xed, 0xf2, 0xfe, 0x07, 0x03, 0xf7, 0xf1, 0xf5, + 0xf7, 0xfa, 0xfe, 0x01, 0x03, 0x00, 0xfe, 0x05, 0x09, 0x0a, 0x0b, 0x0d, + 0x0f, 0x0e, 0x0f, 0x0f, 0x11, 0x17, 0x17, 0x13, 0x17, 0x1c, 0x1e, 0x18, + 0x13, 0x0d, 0x02, 0xf9, 0xf4, 0xf7, 0xfb, 0xfe, 0xf8, 0xf5, 0xf9, 0xfe, + 0xfa, 0xfa, 0xfd, 0xfe, 0xf8, 0xf3, 0xf1, 0xf1, 0xf0, 0xec, 0xf0, 0xf9, + 0xfc, 0x02, 0x09, 0x0c, 0x0a, 0x0a, 0x10, 0x15, 0x18, 0x1a, 0x15, 0x0a, + 0x02, 0xff, 0xfb, 0xfc, 0x02, 0x0b, 0x14, 0x1a, 0x1c, 0x1a, 0x1a, 0x1b, + 0x17, 0x10, 0x08, 0xfe, 0xf7, 0xf2, 0xf0, 0xf3, 0xf1, 0xef, 0xef, 0xf0, + 0xf4, 0xfd, 0xfe, 0xfc, 0xfe, 0xfc, 0xf9, 0xfd, 0x05, 0x09, 0x06, 0xfe, + 0xfd, 0xff, 0x00, 0x01, 0x08, 0x12, 0x16, 0x0d, 0x01, 0xf9, 0xfe, 0x09, + 0x0d, 0x11, 0x14, 0x0f, 0x0a, 0x0b, 0x0f, 0x09, 0xff, 0x00, 0x02, 0xff, + 0x00, 0x06, 0x06, 0x07, 0x04, 0xfe, 0xff, 0x09, 0x10, 0x09, 0xfc, 0xf7, + 0xf7, 0xf1, 0xe9, 0xe8, 0xf6, 0xff, 0xff, 0x02, 0x08, 0x0c, 0x12, 0x15, + 0x14, 0x12, 0x0a, 0x01, 0xfe, 0xfe, 0xfb, 0xf9, 0xfa, 0x00, 0x00, 0xfe, + 0x06, 0x0f, 0x0f, 0x09, 0x07, 0x0c, 0x14, 0x18, 0x13, 0x03, 0xfc, 0xf9, + 0xf4, 0xee, 0xef, 0xf8, 0x04, 0x09, 0x08, 0x04, 0x02, 0x04, 0x07, 0x08, + 0x06, 0x04, 0xfe, 0xf9, 0xf9, 0xfa, 0xfd, 0x01, 0x03, 0x00, 0xff, 0x07, + 0x11, 0x13, 0x0b, 0x04, 0x09, 0x0f, 0x13, 0x17, 0x14, 0x10, 0x0a, 0x09, + 0x04, 0xfe, 0xfc, 0x02, 0x08, 0x00, 0xf2, 0xf0, 0xef, 0xf0, 0xf7, 0xfc, + 0x00, 0x02, 0xff, 0xf9, 0xf9, 0xfb, 0xf7, 0xf5, 0xf5, 0xf6, 0xfe, 0x06, + 0x11, 0x16, 0x16, 0x15, 0x1a, 0x20, 0x23, 0x1d, 0x12, 0x05, 0xfe, 0xfb, + 0xf6, 0xf6, 0xfb, 0x03, 0x04, 0x02, 0x06, 0x10, 0x12, 0x12, 0x16, 0x13, + 0x0b, 0x05, 0xfb, 0xf3, 0xf6, 0xf1, 0xee, 0xee, 0xef, 0xf2, 0xf8, 0xfc, + 0xff, 0xf6, 0xee, 0xf5, 0x04, 0x0a, 0x0b, 0x0e, 0x06, 0xfe, 0xfc, 0x00, + 0x00, 0x06, 0x0e, 0x14, 0x19, 0x17, 0x13, 0x12, 0x0e, 0x13, 0x19, 0x14, + 0x0d, 0x0b, 0x03, 0x06, 0x0a, 0x06, 0x02, 0xfc, 0xf6, 0xfa, 0xfe, 0x02, + 0xff, 0xfd, 0xfb, 0xfd, 0xfe, 0x00, 0x02, 0x04, 0xfb, 0xf4, 0xf6, 0xf5, + 0xf2, 0xf6, 0xfb, 0xff, 0xfd, 0xf7, 0xf6, 0xfe, 0x07, 0x14, 0x17, 0x16, + 0x15, 0x0c, 0x04, 0x06, 0x03, 0xfc, 0xfc, 0x01, 0x03, 0x07, 0x0e, 0x16, + 0x19, 0x1a, 0x19, 0x1c, 0x22, 0x1f, 0x16, 0x06, 0xf7, 0xf2, 0xf4, 0xee, + 0xea, 0xee, 0xf7, 0xfc, 0xfa, 0xfb, 0xfd, 0xfa, 0xff, 0x03, 0x02, 0xfb, + 0xf9, 0xf9, 0xfa, 0xf9, 0xf7, 0xfa, 0x00, 0x02, 0x02, 0x05, 0x0a, 0x0a, + 0x08, 0x02, 0x09, 0x15, 0x1d, 0x1b, 0x15, 0x0d, 0x09, 0x0d, 0x0c, 0x08, + 0x05, 0x07, 0x0b, 0x0a, 0x05, 0x00, 0x01, 0x05, 0x06, 0x04, 0xff, 0xf8, + 0xf6, 0xf6, 0xf3, 0xf2, 0xf3, 0xf0, 0xee, 0xf1, 0xf8, 0xfd, 0x02, 0x07, + 0x06, 0x0b, 0x17, 0x1e, 0x19, 0x15, 0x0f, 0x06, 0x01, 0x02, 0xfe, 0xfa, + 0xff, 0x04, 0x02, 0xfc, 0xf9, 0xff, 0x07, 0x10, 0x16, 0x16, 0x15, 0x0e, + 0x07, 0x03, 0xfe, 0xf9, 0xf5, 0xf1, 0xf1, 0xf8, 0xfd, 0x04, 0x09, 0x09, + 0x00, 0x04, 0x0c, 0x10, 0x0b, 0x04, 0xfb, 0xf4, 0xf5, 0xf8, 0xf6, 0xfb, + 0x04, 0x0a, 0x08, 0x08, 0x0d, 0x0c, 0x0d, 0x12, 0x11, 0x09, 0x05, 0x03, + 0x08, 0x0b, 0x09, 0x07, 0x04, 0x03, 0x00, 0xfc, 0xf9, 0xfe, 0x00, 0xf8, + 0xf5, 0x00, 0x07, 0x05, 0x04, 0x01, 0xfe, 0xff, 0xfe, 0xfa, 0xf6, 0xf8, + 0x01, 0x05, 0x03, 0x00, 0x04, 0x07, 0x11, 0x18, 0x17, 0x12, 0x0c, 0x05, + 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xfa, 0xfe, 0x04, 0x0a, 0x0d, 0x0e, + 0x16, 0x1d, 0x1a, 0x15, 0x11, 0x0a, 0x04, 0x00, 0xfa, 0xf2, 0xf1, 0xf2, + 0xf6, 0xf2, 0xee, 0xf2, 0xf6, 0xfb, 0xfa, 0xfc, 0x02, 0x04, 0x04, 0x02, + 0xff, 0xff, 0xfe, 0xf9, 0xfd, 0x02, 0x08, 0x0f, 0x11, 0x17, 0x16, 0x16, + 0x1a, 0x20, 0x1b, 0x13, 0x0a, 0x03, 0x00, 0x02, 0x03, 0x02, 0x04, 0x07, + 0x02, 0xff, 0xfe, 0x04, 0x07, 0x01, 0xfa, 0xfb, 0xf7, 0xf3, 0xf5, 0xfa, + 0xfd, 0xfa, 0xf6, 0xf2, 0xf0, 0xef, 0xf5, 0xf7, 0xfb, 0xff, 0xff, 0x04, + 0x10, 0x19, 0x1c, 0x1d, 0x17, 0x0c, 0x03, 0x04, 0x02, 0x01, 0x07, 0x08, + 0x06, 0x06, 0x0a, 0x0f, 0x12, 0x13, 0x17, 0x18, 0x11, 0x08, 0x03, 0xff, + 0xfe, 0xfa, 0xf2, 0xed, 0xed, 0xf1, 0xf5, 0xfa, 0x04, 0x06, 0x03, 0x02, + 0x01, 0x01, 0x03, 0x08, 0x04, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0x00, 0x00, + 0x00, 0x03, 0x06, 0x07, 0x06, 0x08, 0x0f, 0x13, 0x11, 0x0d, 0x0c, 0x0e, + 0x0e, 0x0a, 0x07, 0x06, 0x08, 0x04, 0x01, 0x09, 0x10, 0x0e, 0x0a, 0x08, + 0x08, 0x04, 0x00, 0xfa, 0xf2, 0xf0, 0xf4, 0xf6, 0xf1, 0xf4, 0xf9, 0xf7, + 0xfb, 0x04, 0x05, 0x02, 0x02, 0x03, 0x06, 0x0b, 0x0c, 0x0f, 0x11, 0x06, + 0xff, 0x00, 0xfc, 0xfc, 0xfb, 0xf8, 0xfd, 0x06, 0x08, 0x07, 0x0d, 0x16, + 0x1e, 0x21, 0x1c, 0x15, 0x08, 0x03, 0x04, 0xfe, 0xf8, 0xfa, 0xfa, 0xf7, + 0xfb, 0x02, 0x06, 0x06, 0x03, 0xfc, 0xf9, 0xfa, 0xfa, 0xfc, 0xfc, 0xf6, + 0xf6, 0xf7, 0xf5, 0xf7, 0xfd, 0x06, 0x11, 0x16, 0x11, 0x0e, 0x0f, 0x13, + 0x16, 0x18, 0x13, 0x0a, 0x05, 0x03, 0x04, 0x05, 0x07, 0x0a, 0x03, 0xf8, + 0xf8, 0xfe, 0x02, 0x01, 0xfc, 0xfb, 0x00, 0x00, 0xff, 0x01, 0xff, 0xfc, + 0xfd, 0xfb, 0xf4, 0xf2, 0xf5, 0xff, 0x08, 0x0e, 0x0c, 0x0a, 0x10, 0x12, + 0x15, 0x13, 0x0f, 0x07, 0xff, 0xf8, 0xf8, 0xfd, 0x04, 0x09, 0x04, 0x01, + 0x09, 0x0a, 0x08, 0x06, 0x05, 0x09, 0x11, 0x12, 0x0f, 0x0a, 0x03, 0x01, + 0xff, 0xf6, 0xee, 0xec, 0xed, 0xf0, 0xf9, 0x00, 0x01, 0x03, 0x05, 0x05, + 0x07, 0x0b, 0x07, 0x00, 0xfe, 0xfd, 0xfd, 0xfc, 0x00, 0x01, 0x01, 0x0a, + 0x15, 0x14, 0x0b, 0x06, 0x07, 0x0c, 0x0c, 0x0a, 0x07, 0x04, 0x02, 0x01, + 0x01, 0x01, 0x06, 0x0a, 0x07, 0x06, 0x06, 0x07, 0x08, 0x09, 0x07, 0x04, + 0x05, 0x02, 0xf8, 0xf2, 0xf3, 0xf5, 0xf8, 0xfc, 0xf6, 0xec, 0xee, 0xfa, + 0xff, 0x00, 0xfd, 0xfe, 0x02, 0x09, 0x14, 0x18, 0x19, 0x13, 0x08, 0xfe, + 0xfb, 0xfe, 0x05, 0x09, 0x0a, 0x0e, 0x0f, 0x0f, 0x11, 0x13, 0x17, 0x18, + 0x18, 0x0e, 0xfd, 0xf7, 0xf9, 0xfd, 0x00, 0x01, 0xfb, 0xf4, 0xf8, 0xfd, + 0xfe, 0xfc, 0xfa, 0xfa, 0xfa, 0xfa, 0xfc, 0x01, 0x05, 0x01, 0xfb, 0xf8, + 0xf4, 0xf1, 0xf4, 0xfa, 0x02, 0x0a, 0x11, 0x12, 0x0c, 0x10, 0x19, 0x21, + 0x1d, 0x14, 0x0a, 0x07, 0x06, 0x08, 0x0a, 0x0d, 0x0a, 0x0b, 0x09, 0x05, + 0x00, 0x01, 0x02, 0x02, 0x02, 0xfd, 0xf8, 0xfa, 0xf8, 0xf3, 0xf0, 0xf3, + 0xf8, 0xfb, 0xf9, 0xf8, 0x00, 0x06, 0x0a, 0x08, 0x07, 0x0a, 0x0d, 0x12, + 0x10, 0x09, 0x04, 0x04, 0x02, 0xfb, 0xf9, 0xfd, 0x01, 0x01, 0x05, 0x05, + 0x04, 0x02, 0x02, 0x08, 0x12, 0x1c, 0x21, 0x19, 0x0a, 0x00, 0x01, 0xfe, + 0xfb, 0xfa, 0xf6, 0xf7, 0xfc, 0x05, 0x08, 0x07, 0x09, 0x0a, 0x03, 0xfa, + 0xf5, 0xf3, 0xf6, 0xfc, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x05, 0x09, + 0x0b, 0x06, 0xff, 0x01, 0x0f, 0x17, 0x12, 0x0b, 0x06, 0x04, 0xfe, 0xfc, + 0x01, 0x07, 0x07, 0x07, 0x05, 0x03, 0x03, 0x08, 0x10, 0x14, 0x13, 0x07, + 0xfc, 0xf7, 0xf7, 0xf8, 0xf8, 0xfb, 0xfd, 0xf8, 0xf2, 0xf6, 0x00, 0x01, + 0x01, 0x01, 0xfe, 0xfe, 0x03, 0x0b, 0x0d, 0x0e, 0x0b, 0x08, 0xfb, 0xfa, + 0x01, 0x06, 0x08, 0x0b, 0x11, 0x0f, 0x0b, 0x0b, 0x10, 0x14, 0x16, 0x12, + 0x0b, 0x03, 0xfa, 0xf9, 0xfd, 0xff, 0xfe, 0xf7, 0xf1, 0xf0, 0xf2, 0xf6, + 0xfb, 0xfd, 0x02, 0x09, 0x07, 0x00, 0x02, 0x01, 0x02, 0xff, 0xfd, 0xf5, + 0xf5, 0xf9, 0x01, 0x0a, 0x13, 0x17, 0x18, 0x13, 0x0e, 0x0e, 0x0f, 0x0b, + 0x08, 0x04, 0x03, 0x04, 0x06, 0x0d, 0x0f, 0x0c, 0x0c, 0x09, 0x00, 0xf7, + 0xf7, 0xfd, 0x07, 0x0d, 0x08, 0xfe, 0xf7, 0xf5, 0xf2, 0xee, 0xed, 0xf4, + 0xf8, 0xf3, 0xf2, 0xfd, 0x07, 0x09, 0x0d, 0x11, 0x0e, 0x0c, 0x0a, 0x0d, + 0x0f, 0x0e, 0x0d, 0x09, 0x01, 0xfa, 0xfb, 0x01, 0x09, 0x0c, 0x0a, 0x06, + 0x03, 0x05, 0x07, 0x0d, 0x11, 0x14, 0x12, 0x06, 0xfb, 0xfb, 0x02, 0x03, + 0x02, 0xfa, 0xf9, 0xff, 0xff, 0x01, 0x05, 0x09, 0x08, 0x05, 0xfa, 0xef, + 0xee, 0xf5, 0xfe, 0xff, 0xff, 0xf9, 0xf4, 0xf6, 0xfd, 0x00, 0x03, 0x0a, + 0x0e, 0x0e, 0x0f, 0x16, 0x18, 0x14, 0x14, 0x0e, 0x02, 0xfd, 0xfd, 0x02, + 0x07, 0x0f, 0x1a, 0x1a, 0x0a, 0x02, 0x04, 0x08, 0x0c, 0x09, 0xff, 0xf7, + 0xf2, 0xf5, 0xf8, 0xfa, 0xfd, 0xff, 0xfa, 0xf4, 0xf1, 0xf5, 0xf9, 0xfe, + 0x06, 0x04, 0x03, 0x03, 0x00, 0x05, 0x0c, 0x09, 0x03, 0x00, 0xfb, 0xf7, + 0xfa, 0x07, 0x13, 0x15, 0x12, 0x11, 0x10, 0x13, 0x15, 0x12, 0x11, 0x11, + 0x0c, 0x02, 0xfd, 0x00, 0xfe, 0xfd, 0xfe, 0xf8, 0xf3, 0xf5, 0xf7, 0xfb, + 0x00, 0x04, 0x05, 0x00, 0xf6, 0xf8, 0xfc, 0xff, 0x04, 0x03, 0xfd, 0xf8, + 0xf9, 0x02, 0x0b, 0x0d, 0x0f, 0x10, 0x13, 0x11, 0x0c, 0x0b, 0x04, 0x03, + 0x05, 0x01, 0xfe, 0x02, 0x02, 0x03, 0x08, 0x08, 0x08, 0x05, 0xfe, 0x00, + 0x08, 0x11, 0x14, 0x0c, 0x05, 0x01, 0xf9, 0xf2, 0xf0, 0xee, 0xef, 0xf6, + 0xff, 0x04, 0x06, 0x05, 0x03, 0x08, 0x0d, 0x04, 0xff, 0xfc, 0xfd, 0x08, + 0x0f, 0x10, 0x0f, 0x08, 0xfe, 0xfa, 0xff, 0x03, 0x07, 0x05, 0x08, 0x0a, + 0x08, 0x0b, 0x0d, 0x09, 0x0a, 0x0b, 0x02, 0xfa, 0xfb, 0xfd, 0xfa, 0x02, + 0x08, 0x02, 0xfd, 0xfc, 0x00, 0x0a, 0x0f, 0x0e, 0x0b, 0x01, 0xf4, 0xf3, + 0xf7, 0xfc, 0x01, 0xfd, 0xf7, 0xf8, 0xf8, 0xfb, 0xff, 0x04, 0x0c, 0x0d, + 0x0c, 0x0e, 0x0e, 0x0d, 0x0f, 0x13, 0x0d, 0x05, 0x02, 0xfd, 0xff, 0x0e, + 0x1a, 0x17, 0x12, 0x0b, 0x02, 0x02, 0x09, 0x0e, 0x07, 0xfa, 0xf5, 0xf3, + 0xef, 0xf1, 0xf8, 0xf5, 0xf3, 0xf4, 0xf2, 0xf0, 0xf9, 0x03, 0x09, 0x0e, + 0x0e, 0x08, 0x03, 0x03, 0x07, 0x0b, 0x09, 0x04, 0x02, 0xfc, 0xfb, 0x07, + 0x12, 0x13, 0x12, 0x12, 0x11, 0x10, 0x0e, 0x0b, 0x08, 0x07, 0x09, 0x09, + 0x07, 0x05, 0x04, 0xff, 0xfd, 0xfe, 0xf6, 0xf0, 0xf3, 0xf7, 0xfc, 0x02, + 0x07, 0x04, 0x00, 0xf8, 0xef, 0xf0, 0xf6, 0xfd, 0xfe, 0xfa, 0x01, 0x08, + 0x03, 0x03, 0x0a, 0x10, 0x16, 0x18, 0x16, 0x10, 0x0b, 0x07, 0x06, 0x09, + 0x06, 0x00, 0xfb, 0xfc, 0x01, 0x08, 0x0c, 0x0e, 0x0f, 0x07, 0xff, 0x05, + 0x0b, 0x0a, 0x09, 0x07, 0x04, 0xfd, 0xf5, 0xef, 0xf0, 0xf5, 0xfe, 0x02, + 0xff, 0xfc, 0xfe, 0x05, 0x0c, 0x0e, 0x05, 0xf8, 0xef, 0xf1, 0xf7, 0x04, + 0x0d, 0x0e, 0x08, 0xff, 0xf8, 0xfd, 0x03, 0x0b, 0x12, 0x14, 0x14, 0x14, + 0x0f, 0x0d, 0x0d, 0x09, 0x06, 0x01, 0xfd, 0xfa, 0xfb, 0x04, 0x0f, 0x0f, + 0x04, 0xfa, 0xf9, 0xfc, 0x03, 0x0b, 0x0a, 0x03, 0xfc, 0xf6, 0xf3, 0xf9, + 0x00, 0x01, 0xff, 0xfc, 0xfc, 0xf6, 0xf4, 0xfc, 0x06, 0x08, 0x0c, 0x0d, + 0x0a, 0x06, 0x06, 0x05, 0x07, 0x07, 0x01, 0xfb, 0xfc, 0x07, 0x10, 0x15, + 0x17, 0x17, 0x16, 0x11, 0x0c, 0x0e, 0x09, 0x02, 0xff, 0xfc, 0xf8, 0xf4, + 0xf1, 0xf0, 0xef, 0xf3, 0xf6, 0xf5, 0xf7, 0xfd, 0x03, 0x07, 0x0e, 0x0c, + 0x04, 0xff, 0xfe, 0xfe, 0x03, 0x07, 0x09, 0x07, 0x0a, 0x0b, 0x06, 0x06, + 0x0b, 0x0f, 0x15, 0x16, 0x11, 0x0a, 0x02, 0xfc, 0xfb, 0xfc, 0x02, 0x06, + 0x03, 0x02, 0x01, 0x00, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfe, 0x06, 0x0a, + 0x09, 0x02, 0xfa, 0xf2, 0xf3, 0xf6, 0xf4, 0xfd, 0x09, 0x0a, 0x05, 0x04, + 0x05, 0x07, 0x0b, 0x10, 0x14, 0x0f, 0x08, 0x07, 0x09, 0x0b, 0x0c, 0x09, + 0x03, 0x01, 0xfb, 0xfb, 0xfc, 0x09, 0x10, 0x10, 0x0c, 0x07, 0x04, 0x04, + 0x01, 0x00, 0xfe, 0xfb, 0xf8, 0xf2, 0xf2, 0xf9, 0xfb, 0xfc, 0x01, 0x01, + 0x04, 0x09, 0x10, 0x11, 0x10, 0x04, 0xf6, 0xf0, 0xf1, 0xf6, 0xfd, 0x05, + 0x0c, 0x0b, 0x04, 0xfd, 0xfd, 0x06, 0x0b, 0x12, 0x16, 0x18, 0x13, 0x0f, + 0x0c, 0x07, 0x02, 0x05, 0x05, 0x00, 0x02, 0x09, 0x0b, 0x09, 0x09, 0x04, + 0xff, 0xfd, 0xf9, 0xf8, 0xfa, 0xfa, 0xf9, 0xf8, 0xf4, 0xf0, 0xf3, 0xfb, + 0xff, 0x01, 0xff, 0xfb, 0xfb, 0x02, 0x07, 0x06, 0x07, 0x10, 0x12, 0x0b, + 0x04, 0x02, 0x07, 0x09, 0x07, 0x03, 0x03, 0x0a, 0x07, 0x09, 0x0f, 0x17, + 0x1a, 0x19, 0x14, 0x0e, 0x07, 0x02, 0x02, 0x06, 0x04, 0xfb, 0xf8, 0xf5, + 0xf4, 0xf0, 0xec, 0xf0, 0xf7, 0xf9, 0xfc, 0xff, 0x07, 0x08, 0x03, 0xfc, + 0xf6, 0xf1, 0xf2, 0xf8, 0xfd, 0x06, 0x13, 0x18, 0x10, 0x0f, 0x10, 0x11, + 0x13, 0x19, 0x1a, 0x13, 0x09, 0x01, 0xff, 0xfa, 0xfb, 0x03, 0x04, 0x02, + 0x02, 0x04, 0x04, 0x04, 0x05, 0x03, 0xfe, 0xff, 0xff, 0x00, 0x01, 0x04, + 0x05, 0x00, 0xfb, 0xf5, 0xf3, 0xf9, 0x07, 0x0b, 0x08, 0x05, 0x05, 0x05, + 0x02, 0xfd, 0x00, 0x06, 0x05, 0x02, 0xff, 0x03, 0x07, 0x06, 0x07, 0x04, + 0x02, 0xfd, 0xfc, 0x02, 0x0b, 0x13, 0x18, 0x16, 0x0e, 0x06, 0x00, 0xfc, + 0xfe, 0x02, 0x02, 0xf9, 0xf7, 0xff, 0x00, 0xfa, 0xfe, 0x04, 0x07, 0x05, + 0x05, 0x0b, 0x0c, 0x09, 0x04, 0xfc, 0xf8, 0xf7, 0xf4, 0xf5, 0xfb, 0x03, + 0x0c, 0x09, 0x02, 0x04, 0x05, 0x05, 0x0a, 0x0e, 0x0e, 0x0a, 0x04, 0x00, + 0xfc, 0xfa, 0xfc, 0x02, 0x06, 0x0d, 0x0f, 0x11, 0x13, 0x11, 0x0c, 0x07, + 0x00, 0xfb, 0xf6, 0xf5, 0xf4, 0xfa, 0xff, 0xfb, 0xf5, 0xf5, 0xf7, 0xfc, + 0x00, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x09, 0x0e, 0x0c, 0x08, + 0x07, 0x06, 0x05, 0x03, 0x09, 0x0d, 0x09, 0x05, 0x04, 0x0a, 0x0d, 0x0f, + 0x10, 0x09, 0x03, 0x00, 0xfd, 0xfb, 0xfc, 0x01, 0xff, 0xf9, 0xf7, 0xf5, + 0xf3, 0xf2, 0xfa, 0x01, 0x01, 0x00, 0x05, 0x07, 0x04, 0x00, 0xfc, 0xf7, + 0xf1, 0xf3, 0xf5, 0xfe, 0x0b, 0x16, 0x1c, 0x18, 0x17, 0x15, 0x0e, 0x0f, + 0x14, 0x14, 0x0f, 0x09, 0x06, 0x01, 0xfb, 0xfa, 0xfb, 0xff, 0x00, 0x03, + 0x04, 0x05, 0x06, 0x04, 0xff, 0xfb, 0xf8, 0xf6, 0xf5, 0xf8, 0xf7, 0xf7, + 0xfb, 0xf9, 0xfa, 0x01, 0x07, 0x09, 0x0c, 0x10, 0x0d, 0x08, 0x05, 0x02, + 0xfc, 0xf7, 0xfe, 0x04, 0x03, 0x05, 0x09, 0x08, 0x06, 0x08, 0x06, 0x06, + 0x02, 0x03, 0x05, 0x0a, 0x11, 0x17, 0x16, 0x10, 0x0c, 0x08, 0xff, 0xf9, + 0xfc, 0x00, 0x00, 0x04, 0x04, 0xff, 0xf9, 0xfa, 0xfd, 0xfe, 0x00, 0x00, + 0xff, 0x01, 0x02, 0xfd, 0xf7, 0xf6, 0xf4, 0xf3, 0xf5, 0xfa, 0x01, 0x0c, + 0x12, 0x0f, 0x0e, 0x0f, 0x0b, 0x07, 0x09, 0x0b, 0x08, 0x01, 0xfb, 0xf9, + 0xfa, 0x02, 0x0d, 0x15, 0x16, 0x14, 0x16, 0x11, 0x0f, 0x0c, 0x0b, 0x06, + 0x00, 0xf9, 0xf8, 0xf9, 0xfb, 0xfc, 0xf8, 0xf2, 0xf6, 0xfc, 0xfd, 0xfb, + 0xfd, 0x01, 0x00, 0xfe, 0xfb, 0xf9, 0xf8, 0xfb, 0x01, 0x00, 0x00, 0x03, + 0x07, 0x0b, 0x13, 0x15, 0x11, 0x0f, 0x09, 0x07, 0x0a, 0x0c, 0x0c, 0x0b, + 0x08, 0x02, 0x05, 0x06, 0x01, 0xff, 0x01, 0x05, 0x02, 0x01, 0xfd, 0xf9, + 0xf7, 0xfb, 0x01, 0x04, 0x07, 0x0a, 0x07, 0x06, 0xff, 0xf6, 0xf2, 0xf2, + 0xf2, 0xfb, 0x05, 0x09, 0x0c, 0x11, 0x0f, 0x0d, 0x0f, 0x0e, 0x0a, 0x03, + 0x03, 0x07, 0x06, 0x02, 0xfd, 0xf7, 0xf5, 0xfb, 0x04, 0x08, 0x09, 0x0a, + 0x0b, 0x09, 0x05, 0x01, 0x00, 0xfb, 0xf8, 0xf7, 0xf3, 0xf0, 0xf6, 0x01, + 0x07, 0x0c, 0x12, 0x10, 0x0f, 0x0c, 0x0b, 0x0b, 0x0c, 0x0c, 0x02, 0xf7, + 0xf5, 0xff, 0x06, 0x06, 0x03, 0x01, 0xff, 0x03, 0x07, 0x03, 0xff, 0xfe, + 0xfe, 0x01, 0x04, 0x08, 0x08, 0x09, 0x07, 0xff, 0xfd, 0xfc, 0xfd, 0x00, + 0x0a, 0x12, 0x0f, 0x0a, 0x04, 0xfe, 0xf9, 0xfb, 0x02, 0x00, 0xfc, 0xfc, + 0x02, 0x04, 0x01, 0xfb, 0xf8, 0xf8, 0xfb, 0xff, 0x02, 0x04, 0x0a, 0x10, + 0x12, 0x13, 0x15, 0x15, 0x0f, 0x0a, 0x03, 0xfd, 0xfa, 0xf9, 0xf7, 0xfc, + 0x04, 0x0e, 0x0f, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x07, 0xff, 0xf7, 0xf5, + 0xfa, 0xfe, 0xfa, 0xf2, 0xf2, 0xf8, 0xfb, 0x00, 0x05, 0x06, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xfc, 0xf7, 0xf6, 0xf1, 0xf7, 0x03, 0x09, 0x10, 0x1a, + 0x1e, 0x1c, 0x16, 0x0d, 0x08, 0x0b, 0x10, 0x13, 0x11, 0x0a, 0x03, 0x06, + 0x0c, 0x08, 0xff, 0xfa, 0xf9, 0xfa, 0xff, 0x01, 0x00, 0xf7, 0xf2, 0xf2, + 0xf1, 0xf9, 0x00, 0x01, 0xff, 0xfe, 0xf7, 0xf5, 0xf7, 0xf6, 0xfb, 0x05, + 0x0a, 0x0a, 0x0a, 0x09, 0x0a, 0x11, 0x12, 0x0c, 0x09, 0x05, 0x03, 0x07, + 0x09, 0x07, 0x04, 0x01, 0xfe, 0xff, 0x03, 0x0c, 0x0d, 0x0b, 0x0c, 0x0e, + 0x0e, 0x0f, 0x0d, 0x01, 0xf9, 0xf6, 0xf2, 0xf1, 0xf1, 0xf2, 0xf9, 0x09, + 0x10, 0x0a, 0x09, 0x06, 0x07, 0x06, 0x06, 0x03, 0xfa, 0xf2, 0xf1, 0xf6, + 0xf9, 0xfe, 0x00, 0x02, 0x05, 0x0a, 0x0c, 0x08, 0x03, 0xfe, 0xfe, 0xff, + 0x01, 0x07, 0x08, 0x04, 0xff, 0x00, 0x02, 0x04, 0x0a, 0x10, 0x18, 0x1c, + 0x19, 0x11, 0x09, 0x06, 0x04, 0x01, 0xff, 0x01, 0xfd, 0xfd, 0x04, 0x06, + 0xfe, 0xf4, 0xf2, 0xed, 0xf2, 0xfa, 0xfc, 0xfd, 0xfc, 0xfb, 0xfe, 0x0a, + 0x10, 0x0e, 0x0a, 0x03, 0xfb, 0xf8, 0xfc, 0xfe, 0xfb, 0x01, 0x0d, 0x0e, + 0x0c, 0x0f, 0x0f, 0x0e, 0x0d, 0x09, 0x06, 0x03, 0xfc, 0xfa, 0x02, 0x05, + 0x02, 0x03, 0x00, 0xfb, 0xfe, 0x05, 0x0b, 0x0b, 0x09, 0x06, 0x06, 0x0c, + 0x0d, 0x05, 0xf6, 0xee, 0xec, 0xeb, 0xf2, 0xf9, 0x01, 0x10, 0x19, 0x17, + 0x11, 0x08, 0x01, 0xfe, 0x03, 0x07, 0x09, 0x07, 0x02, 0x01, 0x05, 0x09, + 0x03, 0xfe, 0xff, 0x04, 0x07, 0x08, 0x07, 0xff, 0xf6, 0xf6, 0xf8, 0xf5, + 0xf8, 0xfc, 0xfa, 0xfb, 0x02, 0x07, 0x04, 0x02, 0x09, 0x0e, 0x0f, 0x0f, + 0x0e, 0x0e, 0x0d, 0x0b, 0x0f, 0x14, 0x11, 0x09, 0x05, 0x05, 0x03, 0xff, + 0xf9, 0xf3, 0xf3, 0xf8, 0xfd, 0xfd, 0xfe, 0x01, 0x00, 0x04, 0x0b, 0x0d, + 0x09, 0x01, 0xf5, 0xef, 0xf4, 0xf9, 0xfa, 0xfe, 0x03, 0x06, 0x0b, 0x0d, + 0x0c, 0x0c, 0x0a, 0x04, 0x03, 0x06, 0x00, 0xf6, 0xf7, 0xfd, 0xfd, 0xfc, + 0x01, 0x09, 0x0c, 0x10, 0x13, 0x11, 0x09, 0x05, 0x01, 0x01, 0x06, 0x0d, + 0x0a, 0x04, 0xfc, 0xf9, 0xff, 0xff, 0xfd, 0x00, 0x0e, 0x15, 0x17, 0x12, + 0x08, 0x00, 0xfe, 0xfd, 0xfc, 0xf7, 0xf4, 0xf6, 0xfc, 0x02, 0x03, 0x01, + 0xf9, 0xf8, 0xf9, 0xf8, 0xfa, 0xfd, 0xfd, 0xfe, 0xfc, 0xff, 0x0a, 0x0d, + 0x08, 0x03, 0x04, 0x06, 0x0a, 0x09, 0x05, 0x08, 0x14, 0x16, 0x12, 0x0f, + 0x12, 0x15, 0x12, 0x0f, 0x0e, 0x0b, 0x04, 0x00, 0xfa, 0xf4, 0xf6, 0xf7, + 0xf5, 0xf9, 0xf6, 0xf7, 0xfc, 0xff, 0x00, 0x02, 0x04, 0x07, 0x0c, 0x07, + 0xf7, 0xe9, 0xea, 0xf0, 0xf2, 0xf0, 0xfb, 0x0f, 0x18, 0x17, 0x15, 0x10, + 0x08, 0x01, 0xfd, 0xfb, 0x02, 0x05, 0x0a, 0x0d, 0x0d, 0x0f, 0x12, 0x0e, + 0x0b, 0x0c, 0x0c, 0x0e, 0x12, 0x0d, 0x05, 0xff, 0xff, 0x01, 0xff, 0xf6, + 0xf1, 0xf3, 0xf9, 0xfc, 0xf8, 0xf8, 0xfe, 0x07, 0x07, 0x05, 0x06, 0x05, + 0x06, 0x03, 0x03, 0x08, 0x07, 0x03, 0x00, 0x02, 0x00, 0x02, 0x03, 0x00, + 0xfa, 0xf8, 0xfb, 0xfe, 0xfd, 0xfd, 0x01, 0x04, 0x06, 0x09, 0x0b, 0x07, + 0x02, 0x03, 0x03, 0x01, 0x03, 0x09, 0x10, 0x12, 0x12, 0x13, 0x13, 0x11, + 0x0f, 0x0e, 0x0b, 0x0d, 0x09, 0xfe, 0xf2, 0xf0, 0xf0, 0xed, 0xee, 0xf3, + 0xf9, 0x00, 0x04, 0x04, 0x04, 0x03, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, + 0xfd, 0xfd, 0x01, 0x02, 0x01, 0x03, 0x0c, 0x16, 0x17, 0x16, 0x13, 0x08, + 0x00, 0xfb, 0xfc, 0xfc, 0xf8, 0xf7, 0xff, 0x09, 0x0a, 0x0d, 0x10, 0x08, + 0x02, 0x01, 0xfe, 0xfe, 0x02, 0x03, 0x01, 0x00, 0x0b, 0x0c, 0x03, 0xfe, + 0xfa, 0xfa, 0xf8, 0xfa, 0xfc, 0xff, 0x05, 0x0c, 0x0e, 0x0c, 0x09, 0x06, + 0x0a, 0x0c, 0x09, 0x06, 0x03, 0xff, 0xfc, 0xfc, 0xfe, 0xfc, 0xfc, 0xf9, + 0xf5, 0xf7, 0xfc, 0xfe, 0xfd, 0xfe, 0x02, 0x06, 0x0b, 0x0b, 0x07, 0x01, + 0xfc, 0xfb, 0xfc, 0xfb, 0xfd, 0x0b, 0x18, 0x20, 0x1c, 0x15, 0x11, 0x0d, + 0x09, 0x04, 0x00, 0xfe, 0xfe, 0x00, 0xfe, 0x01, 0x05, 0x04, 0xfe, 0xfd, + 0x00, 0x05, 0x09, 0x0b, 0x09, 0x04, 0xfe, 0xfd, 0xfc, 0xf2, 0xeb, 0xec, + 0xf5, 0xfa, 0xfa, 0xfc, 0x05, 0x0b, 0x0d, 0x09, 0x02, 0xfc, 0xfd, 0x00, + 0xff, 0x05, 0x0c, 0x0a, 0x06, 0x09, 0x0e, 0x0f, 0x12, 0x10, 0x06, 0x01, + 0x01, 0x05, 0x06, 0x04, 0x02, 0x03, 0x0a, 0x0f, 0x09, 0x03, 0x00, 0xfc, + 0xfa, 0xf5, 0xf5, 0xf8, 0x00, 0x07, 0x0d, 0x10, 0x0d, 0x09, 0x09, 0x07, + 0x06, 0x07, 0x05, 0xfc, 0xf6, 0xf6, 0xf4, 0xf5, 0xf5, 0xf1, 0xed, 0xf3, + 0xfe, 0x01, 0xfc, 0xfe, 0xff, 0xff, 0x03, 0x06, 0x02, 0x02, 0x08, 0x0b, + 0x0c, 0x12, 0x13, 0x10, 0x14, 0x1d, 0x21, 0x1b, 0x18, 0x16, 0x11, 0x0a, + 0x04, 0x00, 0xf5, 0xed, 0xec, 0xf0, 0xf8, 0xfe, 0xfc, 0xfb, 0xfb, 0xfb, + 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0x00, 0x04, 0x00, 0xfc, 0xf7, 0xf5, + 0xf8, 0xfe, 0x02, 0x05, 0x0a, 0x0d, 0x07, 0x05, 0x04, 0x03, 0x02, 0x08, + 0x0f, 0x0c, 0x0a, 0x11, 0x13, 0x11, 0x12, 0x0f, 0x06, 0xfe, 0xfd, 0x01, + 0x07, 0x08, 0x06, 0x02, 0x03, 0x09, 0x0a, 0x05, 0x02, 0xfc, 0xf3, 0xed, + 0xec, 0xf0, 0xf1, 0xf7, 0x03, 0x0d, 0x12, 0x0e, 0x0b, 0x09, 0x04, 0x02, + 0xfe, 0xf9, 0xf8, 0xf6, 0xf8, 0x02, 0x0b, 0x09, 0x00, 0xfa, 0xfd, 0x02, + 0x04, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x07, 0x05, 0xff, 0xfa, 0xfb, 0x01, + 0x0b, 0x0c, 0x0c, 0x14, 0x1a, 0x17, 0x0d, 0x07, 0x03, 0xfd, 0xfe, 0x00, + 0x01, 0x01, 0xfd, 0xf8, 0xf8, 0xfd, 0xfe, 0xfc, 0xfc, 0xfd, 0x02, 0x02, + 0x01, 0x02, 0x00, 0xfe, 0xff, 0x05, 0x05, 0x01, 0xfe, 0xfd, 0xfd, 0xfe, + 0xff, 0x01, 0x00, 0x02, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0e, 0x0d, 0x0b, 0x07, 0x01, 0xfb, 0xf5, 0xf7, 0xff, 0x04, + 0x04, 0xff, 0x01, 0x05, 0x09, 0x07, 0x01, 0xf8, 0xf2, 0xee, 0xf6, 0x02, + 0x07, 0x09, 0x0a, 0x13, 0x1a, 0x19, 0x17, 0x13, 0x0e, 0x09, 0x07, 0xff, + 0xf9, 0xf6, 0xf0, 0xef, 0xf5, 0xfd, 0xfb, 0xf6, 0xf6, 0xfd, 0xfe, 0xf8, + 0xf5, 0xf5, 0xf5, 0xfa, 0x05, 0x0b, 0x0b, 0x0a, 0x06, 0x05, 0x0a, 0x0a, + 0x09, 0x0b, 0x14, 0x1d, 0x15, 0x0d, 0x0d, 0x0c, 0x05, 0x03, 0x03, 0x02, + 0x03, 0x01, 0x02, 0x03, 0x01, 0xff, 0xfd, 0xfb, 0xfa, 0xfb, 0x01, 0x05, + 0x06, 0x02, 0xfe, 0x02, 0x05, 0x01, 0xfc, 0xf8, 0xf6, 0xf8, 0xf7, 0xf3, + 0xf3, 0xf6, 0xfc, 0xff, 0xff, 0x01, 0x04, 0x04, 0x09, 0x0a, 0x09, 0x0c, + 0x0e, 0x0d, 0x08, 0x09, 0x11, 0x12, 0x0c, 0x09, 0x07, 0x0d, 0x0f, 0x0c, + 0x06, 0x06, 0x0c, 0x10, 0x08, 0xfe, 0xf7, 0xf0, 0xec, 0xf1, 0xf7, 0xfd, + 0x01, 0x09, 0x12, 0x15, 0x10, 0x0b, 0x03, 0xfb, 0xf0, 0xee, 0xf7, 0x00, + 0xff, 0xf8, 0xf7, 0xfc, 0xfc, 0xf7, 0xf5, 0xf7, 0xff, 0x02, 0xfd, 0xfb, + 0x01, 0x07, 0x08, 0x0c, 0x0d, 0x0d, 0x10, 0x14, 0x15, 0x10, 0x0c, 0x0c, + 0x0f, 0x12, 0x10, 0x0b, 0x09, 0x0d, 0x0e, 0x06, 0xff, 0x02, 0x05, 0x03, + 0xfb, 0xf9, 0xfc, 0xfc, 0xf7, 0xf2, 0xf2, 0xf5, 0xf8, 0xfe, 0xfc, 0xfc, + 0xfd, 0xfb, 0xff, 0x01, 0xfd, 0xfb, 0xfa, 0xf7, 0xf6, 0xf9, 0x00, 0x07, + 0x0a, 0x0b, 0x0e, 0x0f, 0x11, 0x13, 0x0c, 0x09, 0x0f, 0x17, 0x1a, 0x13, + 0x0d, 0x06, 0x03, 0x04, 0x01, 0xfc, 0x00, 0x06, 0x07, 0x01, 0xfe, 0xff, + 0xfc, 0xf8, 0xf7, 0xf5, 0xf6, 0xfa, 0xfb, 0xf8, 0xf8, 0xfd, 0x00, 0x02, + 0x08, 0x12, 0x1a, 0x15, 0x0e, 0x06, 0xfd, 0xf9, 0xfd, 0x05, 0x05, 0x01, + 0x02, 0x04, 0x03, 0xfd, 0xf8, 0xf9, 0xfe, 0xfc, 0xf8, 0xf5, 0xff, 0x07, + 0x09, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x0c, 0x09, 0x07, 0x05, 0x02, 0x01, + 0x04, 0x04, 0x03, 0x04, 0x03, 0xff, 0xfd, 0xff, 0x02, 0x01, 0x00, 0xfd, + 0xfb, 0xfb, 0xfd, 0xfa, 0x00, 0x0a, 0x0b, 0x0a, 0x0f, 0x10, 0x0e, 0x00, + 0xfa, 0x02, 0x09, 0x08, 0x01, 0xfc, 0xf8, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, + 0x06, 0x0b, 0x09, 0x05, 0x01, 0xfe, 0xfe, 0x05, 0x08, 0x0b, 0x0f, 0x0e, + 0x07, 0x04, 0x01, 0xff, 0x01, 0x01, 0xff, 0x04, 0x08, 0x07, 0x01, 0x00, + 0x01, 0x03, 0x00, 0xfe, 0xfe, 0x03, 0x07, 0x06, 0x03, 0x05, 0x07, 0x0f, + 0x17, 0x18, 0x0c, 0x03, 0xfe, 0xfc, 0xfd, 0x00, 0x05, 0x07, 0x01, 0xf7, + 0xf2, 0xf3, 0xf5, 0xf1, 0xed, 0xee, 0xf1, 0xf3, 0xf7, 0xf8, 0xf5, 0xfc, + 0x0b, 0x10, 0x0f, 0x12, 0x13, 0x0f, 0x07, 0x06, 0x07, 0x0b, 0x11, 0x15, + 0x15, 0x15, 0x16, 0x17, 0x0f, 0x06, 0x03, 0x09, 0x0f, 0x0c, 0x02, 0xfc, + 0xf8, 0xf9, 0xf9, 0xf8, 0xfc, 0x04, 0x07, 0x01, 0xfc, 0xf3, 0xed, 0xf1, + 0xf8, 0xf9, 0xf7, 0xf7, 0xfa, 0xf5, 0xf0, 0xf3, 0xf9, 0xfd, 0x02, 0x08, + 0x0a, 0x0c, 0x0d, 0x07, 0x08, 0x0e, 0x14, 0x19, 0x1b, 0x16, 0x12, 0x13, + 0x14, 0x0b, 0x03, 0x01, 0x02, 0x03, 0x04, 0x06, 0x03, 0xfd, 0xff, 0x01, + 0xfd, 0xff, 0x03, 0x08, 0x02, 0xf6, 0xf5, 0xfc, 0x02, 0x03, 0x06, 0x06, + 0x02, 0xfe, 0xf8, 0xf3, 0xf7, 0xfc, 0x01, 0x02, 0x01, 0xfd, 0xf5, 0xf5, + 0xf6, 0xf7, 0xf9, 0xfc, 0x01, 0x02, 0x02, 0x09, 0x0c, 0x0c, 0x0f, 0x13, + 0x15, 0x1c, 0x22, 0x1c, 0x0f, 0x07, 0x04, 0x03, 0x02, 0x01, 0x05, 0x0b, + 0x09, 0x02, 0xfd, 0xfb, 0xf8, 0xf7, 0xfa, 0xfe, 0xfc, 0xf8, 0xf7, 0xf8, + 0xf5, 0xfa, 0x01, 0x05, 0x04, 0x00, 0x00, 0xfe, 0xfa, 0xf9, 0x00, 0x05, + 0x08, 0x07, 0x04, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0a, + 0x0a, 0x0a, 0x0b, 0x0d, 0x0f, 0x10, 0x14, 0x19, 0x17, 0x0e, 0x03, 0xfd, + 0xfa, 0xfd, 0xfc, 0xf6, 0xf5, 0xf6, 0xf6, 0xf4, 0xf1, 0xf4, 0xfc, 0xfe, + 0x00, 0x05, 0x03, 0xfb, 0xf5, 0xfa, 0x07, 0x13, 0x17, 0x14, 0x12, 0x0b, + 0x08, 0x0d, 0x12, 0x0e, 0x0a, 0x09, 0x0a, 0x0c, 0x07, 0xfe, 0xf8, 0xf8, + 0xf7, 0xf4, 0xf4, 0xf9, 0xfe, 0xf9, 0xf4, 0xf1, 0xf5, 0xfd, 0x07, 0x0b, + 0x0e, 0x0f, 0x0a, 0x00, 0xfc, 0xff, 0x02, 0x04, 0x05, 0x08, 0x08, 0x06, + 0x07, 0x0a, 0x08, 0x03, 0x03, 0x09, 0x0c, 0x0b, 0x07, 0x06, 0x0a, 0x0a, + 0x07, 0x0a, 0x06, 0x01, 0xfe, 0xfb, 0xfb, 0x00, 0x04, 0x04, 0x01, 0x00, + 0x01, 0xfe, 0xf7, 0xf0, 0xef, 0xf5, 0xfb, 0xfe, 0xff, 0xfa, 0xf4, 0xf8, + 0xff, 0x01, 0x05, 0x0b, 0x12, 0x11, 0x14, 0x13, 0x08, 0x00, 0xfe, 0xfc, + 0x00, 0x08, 0x0a, 0x04, 0x00, 0x00, 0x03, 0x09, 0x0e, 0x0e, 0x0c, 0x0e, + 0x0e, 0x09, 0x03, 0x01, 0x05, 0x10, 0x10, 0x09, 0x05, 0x02, 0xff, 0xfa, + 0xf7, 0xfa, 0xf8, 0xf7, 0xf7, 0xf7, 0xfa, 0xf9, 0xf4, 0xee, 0xed, 0xed, + 0xf5, 0xfc, 0xfe, 0xfc, 0xf8, 0xf9, 0xff, 0x08, 0x12, 0x17, 0x1c, 0x1e, + 0x15, 0x0f, 0x0d, 0x10, 0x13, 0x11, 0x0b, 0x09, 0x05, 0x03, 0x04, 0x09, + 0x0f, 0x12, 0x0b, 0x05, 0x03, 0x05, 0x05, 0x02, 0xfe, 0xf8, 0xf8, 0xfe, + 0x01, 0xff, 0xf6, 0xe8, 0xe5, 0xec, 0xf2, 0xf8, 0x00, 0x04, 0x02, 0xf8, + 0xf4, 0xf4, 0xf1, 0xf4, 0xfb, 0x04, 0x0b, 0x0e, 0x09, 0x04, 0x09, 0x0f, + 0x18, 0x1f, 0x21, 0x1f, 0x1e, 0x1c, 0x1c, 0x16, 0x08, 0x00, 0x02, 0x05, + 0x02, 0xff, 0xf8, 0xf5, 0xf3, 0xed, 0xee, 0xf5, 0xfb, 0xfc, 0xf9, 0xf8, + 0xfc, 0xfc, 0xfa, 0x01, 0x08, 0x06, 0x05, 0x02, 0xfd, 0xfe, 0x03, 0x06, + 0x08, 0x0b, 0x07, 0x05, 0x06, 0x06, 0x04, 0xff, 0xfe, 0x04, 0x07, 0x03, + 0x01, 0xfd, 0xf6, 0xf4, 0xfa, 0x06, 0x15, 0x1e, 0x1e, 0x19, 0x11, 0x0a, + 0x05, 0x00, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xfb, 0xf8, 0xf8, 0xfb, 0xfd, + 0xfe, 0x00, 0x02, 0x05, 0x06, 0x00, 0xfe, 0xfe, 0xfe, 0xff, 0x02, 0x0a, + 0x0b, 0xfd, 0xf6, 0xfa, 0x00, 0x06, 0x11, 0x19, 0x14, 0x0a, 0x03, 0xff, + 0x00, 0x03, 0x03, 0x06, 0x09, 0x03, 0x00, 0xfe, 0x00, 0x03, 0x00, 0xfe, + 0x00, 0x06, 0x07, 0x07, 0x06, 0x06, 0x01, 0xf7, 0xf3, 0xfb, 0xfe, 0xfe, + 0xfb, 0xf4, 0xf3, 0xf8, 0xfc, 0x00, 0x0b, 0x11, 0x0b, 0x08, 0x08, 0x07, + 0x0b, 0x11, 0x19, 0x1c, 0x15, 0x07, 0xff, 0x02, 0x02, 0x04, 0x08, 0x13, + 0x13, 0x08, 0x05, 0x03, 0xfd, 0xf9, 0xf6, 0xf0, 0xee, 0xf2, 0xf5, 0xf4, + 0xee, 0xea, 0xe9, 0xed, 0xf8, 0x03, 0x10, 0x15, 0x12, 0x0c, 0x04, 0xfc, + 0xfb, 0x00, 0x03, 0x03, 0x05, 0x0d, 0x0e, 0x08, 0x0a, 0x10, 0x12, 0x16, + 0x18, 0x19, 0x16, 0x12, 0x10, 0x0f, 0x10, 0x0c, 0x09, 0x09, 0x06, 0xfc, + 0xf1, 0xee, 0xf3, 0xf5, 0xf3, 0xf2, 0xf7, 0xf6, 0xee, 0xe9, 0xef, 0xf4, + 0xf3, 0xf4, 0xfa, 0xfe, 0xfd, 0xff, 0x01, 0xfe, 0x04, 0x0b, 0x0f, 0x14, + 0x1c, 0x1c, 0x15, 0x11, 0x10, 0x0b, 0x06, 0x0a, 0x11, 0x11, 0x07, 0xf9, + 0xf4, 0xf9, 0xfd, 0x00, 0x09, 0x15, 0x10, 0x07, 0x07, 0x0a, 0x04, 0x02, + 0x05, 0x00, 0xfa, 0xf6, 0xf9, 0xf9, 0xf7, 0xf9, 0xf7, 0xfa, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xfa, 0xf6, 0xf0, 0xf1, 0xf6, 0xfc, 0xfc, 0xfb, 0xf8, + 0xf8, 0x00, 0x08, 0x12, 0x1c, 0x25, 0x23, 0x1b, 0x16, 0x11, 0x0b, 0x0d, + 0x10, 0x0c, 0x06, 0x07, 0x09, 0x04, 0xff, 0x01, 0x02, 0xff, 0xfc, 0xf4, + 0xf5, 0xfc, 0x00, 0xff, 0xff, 0xfa, 0xf7, 0xfa, 0xfe, 0xfb, 0xf4, 0xf4, + 0xf5, 0xf3, 0xf9, 0x01, 0x0a, 0x0b, 0x06, 0x03, 0x00, 0x01, 0x04, 0x06, + 0x07, 0x0c, 0x0f, 0x0f, 0x0d, 0x04, 0x02, 0x0a, 0x14, 0x18, 0x19, 0x15, + 0x12, 0x0d, 0x0b, 0x09, 0x06, 0xff, 0xfa, 0xf7, 0xef, 0xe8, 0xe8, 0xee, + 0xf2, 0xf2, 0xf5, 0xfa, 0x00, 0x00, 0x05, 0x0a, 0x08, 0x03, 0x01, 0xfc, + 0xf8, 0xfd, 0x04, 0x0b, 0x0c, 0x04, 0x02, 0x0b, 0x14, 0x19, 0x18, 0x18, + 0x10, 0x0b, 0x09, 0x07, 0x06, 0x07, 0x09, 0x05, 0xf9, 0xf5, 0xf4, 0xf2, + 0xf9, 0x01, 0x01, 0xff, 0xff, 0xf7, 0xf5, 0xfa, 0xfc, 0xfb, 0xfa, 0xf6, + 0xf5, 0xfb, 0x04, 0x0d, 0x08, 0x01, 0x02, 0x09, 0x09, 0x08, 0x0b, 0x12, + 0x15, 0x13, 0x10, 0x0f, 0x0d, 0x0c, 0x0d, 0x09, 0x02, 0x00, 0xff, 0xf9, + 0xfb, 0x01, 0x08, 0x0d, 0x09, 0x03, 0x00, 0xfd, 0xfe, 0x02, 0x00, 0xf9, + 0xf5, 0xf3, 0xf8, 0xf8, 0xf6, 0xfb, 0x04, 0x06, 0x02, 0x02, 0x04, 0x04, + 0x07, 0x05, 0x00, 0x00, 0xfe, 0xf9, 0xf5, 0xf5, 0xfa, 0xfc, 0xfc, 0x00, + 0x07, 0x0a, 0x10, 0x1a, 0x1f, 0x1e, 0x1b, 0x18, 0x14, 0x10, 0x0d, 0x0a, + 0x0c, 0x0d, 0x0d, 0x04, 0xfa, 0xfd, 0x06, 0x02, 0xfb, 0xfa, 0xf5, 0xed, + 0xee, 0xed, 0xf0, 0xf0, 0xef, 0xed, 0xeb, 0xf0, 0xf4, 0xfd, 0x02, 0x03, + 0x00, 0x01, 0x03, 0x08, 0x0d, 0x0b, 0x0d, 0x0e, 0x0e, 0x0d, 0x0c, 0x10, + 0x12, 0x13, 0x15, 0x13, 0x0d, 0x0e, 0x0e, 0x0c, 0x0f, 0x10, 0x0f, 0x0d, + 0x08, 0x04, 0x08, 0x0c, 0x06, 0xf7, 0xec, 0xec, 0xeb, 0xec, 0xed, 0xeb, + 0xef, 0xf3, 0xf9, 0xfe, 0xfe, 0xff, 0xfc, 0xf8, 0xf8, 0xf8, 0xfa, 0xfa, + 0xfd, 0x04, 0x0a, 0x08, 0x0c, 0x17, 0x19, 0x16, 0x18, 0x1c, 0x1c, 0x19, + 0x16, 0x14, 0x12, 0x12, 0x09, 0x01, 0x00, 0x00, 0xfa, 0xf5, 0xf8, 0xfd, + 0xfa, 0xf9, 0xfb, 0xfe, 0xfc, 0xf8, 0xf6, 0xf3, 0xf3, 0xf4, 0xf5, 0xf9, + 0x00, 0x08, 0x0a, 0x07, 0x09, 0x07, 0x02, 0x03, 0x08, 0x0c, 0x0b, 0x04, + 0x02, 0x06, 0x08, 0x09, 0x07, 0x02, 0x00, 0x00, 0x06, 0x0c, 0x0d, 0x06, + 0x01, 0x00, 0x07, 0x0a, 0x07, 0x03, 0x01, 0x01, 0x09, 0x0d, 0x05, 0xfe, + 0xfd, 0xfe, 0xfb, 0xfe, 0xff, 0xfa, 0xfc, 0x02, 0x04, 0x05, 0x08, 0x06, + 0xff, 0x00, 0x00, 0xfb, 0xf8, 0xf6, 0xf8, 0xf5, 0xf6, 0xfc, 0xfe, 0x02, + 0x09, 0x12, 0x1d, 0x1e, 0x16, 0x0d, 0x07, 0x0d, 0x0f, 0x0c, 0x06, 0x08, + 0x0e, 0x0c, 0x07, 0x05, 0x07, 0x00, 0xfb, 0xf8, 0xf5, 0xf9, 0xfa, 0xf5, + 0xf1, 0xed, 0xf1, 0xf1, 0xf1, 0xf2, 0xf4, 0xf9, 0x03, 0x04, 0x02, 0x01, + 0x01, 0x09, 0x10, 0x0f, 0x08, 0x05, 0x0d, 0x15, 0x13, 0x12, 0x15, 0x15, + 0x16, 0x12, 0x13, 0x13, 0x10, 0x0a, 0x07, 0x06, 0x0a, 0x08, 0xfd, 0xf4, + 0xf6, 0xfa, 0x00, 0x01, 0xfa, 0xf0, 0xed, 0xf2, 0xf4, 0xef, 0xe8, 0xe9, + 0xf0, 0xf8, 0xfb, 0xfd, 0xfc, 0xfe, 0x04, 0x05, 0x03, 0x05, 0x08, 0x08, + 0x07, 0x08, 0x0c, 0x10, 0x11, 0x18, 0x1e, 0x21, 0x23, 0x21, 0x1a, 0x18, + 0x13, 0x12, 0x14, 0x0a, 0xff, 0xfb, 0xfb, 0xf8, 0xef, 0xee, 0xf2, 0xf6, + 0xfc, 0x00, 0xfb, 0xf2, 0xec, 0xea, 0xe8, 0xe9, 0xf0, 0xf7, 0xfc, 0x04, + 0x0d, 0x13, 0x10, 0x09, 0x03, 0xff, 0xfe, 0x03, 0x08, 0x05, 0x04, 0x05, + 0x0a, 0x15, 0x16, 0x0e, 0x08, 0x07, 0x08, 0x07, 0x0a, 0x0e, 0x10, 0x0c, + 0x06, 0x02, 0x00, 0x00, 0x01, 0x04, 0x07, 0x09, 0x08, 0x0b, 0x0c, 0x0a, + 0x07, 0x01, 0xf8, 0xee, 0xef, 0xf7, 0xff, 0x03, 0xfd, 0xf7, 0xf0, 0xf0, + 0xf6, 0xfe, 0xfc, 0xf8, 0xf8, 0xf6, 0xf3, 0xf3, 0xf9, 0xff, 0x05, 0x09, + 0x0f, 0x11, 0x13, 0x18, 0x1d, 0x20, 0x21, 0x1c, 0x16, 0x12, 0x0f, 0x0f, + 0x0d, 0x09, 0x01, 0xfd, 0xfe, 0x01, 0x02, 0x02, 0xff, 0xf9, 0xf4, 0xec, + 0xea, 0xed, 0xee, 0xf1, 0xf4, 0xf6, 0xf7, 0xf9, 0xfb, 0x02, 0x05, 0x09, + 0x09, 0x03, 0xfd, 0xfc, 0xff, 0x06, 0x0e, 0x14, 0x19, 0x1b, 0x1d, 0x20, + 0x1c, 0x14, 0x0a, 0x09, 0x09, 0x02, 0xfd, 0xfb, 0xfa, 0xf8, 0xfb, 0x00, + 0x06, 0x06, 0x02, 0x00, 0xfd, 0xfa, 0xf7, 0xf1, 0xf2, 0xf1, 0xf0, 0xf3, + 0xf7, 0xfc, 0x00, 0x04, 0x06, 0x04, 0x06, 0x0a, 0x0d, 0x11, 0x0f, 0x0a, + 0x00, 0xfc, 0x02, 0x0d, 0x19, 0x20, 0x20, 0x17, 0x0e, 0x0c, 0x0f, 0x16, + 0x18, 0x10, 0x08, 0xff, 0xf5, 0xef, 0xe9, 0xec, 0xed, 0xe9, 0xe8, 0xeb, + 0xf2, 0xfa, 0x00, 0x02, 0xfa, 0xf2, 0xf3, 0xfa, 0x01, 0x09, 0x11, 0x14, + 0x11, 0x08, 0x07, 0x0a, 0x0f, 0x12, 0x0c, 0x00, 0xfd, 0xff, 0x07, 0x0f, + 0x13, 0x19, 0x14, 0x0b, 0x04, 0xff, 0x01, 0x09, 0x0c, 0x0a, 0x05, 0xff, + 0xf8, 0xf5, 0xf6, 0xf7, 0xf9, 0xff, 0x06, 0x0d, 0x13, 0x17, 0x16, 0x0c, + 0xfb, 0xe8, 0xe0, 0xe5, 0xec, 0xea, 0xed, 0xf7, 0xfa, 0x00, 0x03, 0x04, + 0x07, 0x09, 0x03, 0xf9, 0xf2, 0xf3, 0xf8, 0x02, 0x0a, 0x0c, 0x0f, 0x1a, + 0x22, 0x20, 0x21, 0x22, 0x25, 0x25, 0x23, 0x21, 0x19, 0x0f, 0x04, 0xfa, + 0xf4, 0xf6, 0xf9, 0xff, 0xfe, 0xf8, 0xf2, 0xf3, 0xf0, 0xeb, 0xe8, 0xe8, + 0xe9, 0xee, 0xee, 0xed, 0xee, 0xf2, 0xf2, 0xf2, 0xf3, 0xf5, 0xfb, 0x05, + 0x07, 0x07, 0x08, 0x0d, 0x12, 0x19, 0x27, 0x2f, 0x2c, 0x29, 0x24, 0x1b, + 0x13, 0x13, 0x11, 0x0b, 0x08, 0xfa, 0xef, 0xf4, 0xfb, 0xfc, 0x02, 0x0a, + 0x08, 0x02, 0xfd, 0xf9, 0xf7, 0xf5, 0xf4, 0xed, 0xe5, 0xe5, 0xec, 0xf5, + 0xfb, 0xfe, 0xfd, 0xfb, 0xfe, 0x08, 0x16, 0x19, 0x10, 0x06, 0xfd, 0xf1, + 0xef, 0xfa, 0x04, 0x0b, 0x0c, 0x10, 0x14, 0x1b, 0x20, 0x23, 0x25, 0x20, + 0x17, 0x0d, 0xfd, 0xf0, 0xeb, 0xee, 0xf1, 0xf1, 0xf3, 0xf5, 0xfa, 0x00, + 0x04, 0x07, 0x03, 0xfd, 0x00, 0x02, 0x03, 0x05, 0x08, 0x06, 0x06, 0x04, + 0x00, 0x02, 0x0a, 0x0b, 0x02, 0xfe, 0xff, 0xfc, 0xfa, 0x02, 0x09, 0x10, + 0x12, 0x0e, 0x06, 0xfd, 0xfb, 0xf9, 0xf8, 0xf9, 0xfa, 0xfb, 0xfe, 0xfd, + 0xfb, 0xff, 0x01, 0x05, 0x14, 0x21, 0x1e, 0x19, 0x1c, 0x18, 0x0b, 0x00, + 0xfa, 0xf7, 0xed, 0xe3, 0xe9, 0xf5, 0xfc, 0x02, 0x07, 0x07, 0x07, 0x07, + 0x04, 0xf9, 0xee, 0xec, 0xf0, 0xf3, 0xfb, 0x07, 0x0c, 0x12, 0x1f, 0x22, + 0x1e, 0x1c, 0x1c, 0x21, 0x29, 0x2b, 0x20, 0x11, 0x01, 0xf3, 0xe6, 0xe1, + 0xe6, 0xe9, 0xe8, 0xe9, 0xf2, 0xf9, 0xfc, 0xff, 0x01, 0xff, 0xfb, 0xf5, + 0xef, 0xf0, 0xf0, 0xf2, 0xf5, 0xfa, 0xfd, 0x03, 0x07, 0x0a, 0x0e, 0x11, + 0x10, 0x10, 0x14, 0x21, 0x2d, 0x2b, 0x25, 0x25, 0x27, 0x1e, 0x12, 0x0e, + 0x0a, 0xff, 0xf9, 0xfb, 0xfc, 0xf6, 0xed, 0xee, 0xf2, 0xf9, 0x01, 0xfe, + 0xf9, 0xf3, 0xec, 0xe4, 0xe4, 0xe9, 0xe8, 0xe3, 0xe6, 0xed, 0xf7, 0xfd, + 0x02, 0x08, 0x15, 0x21, 0x22, 0x1b, 0x14, 0x10, 0x0d, 0x04, 0x00, 0x02, + 0xfe, 0xfe, 0x0b, 0x19, 0x21, 0x25, 0x28, 0x27, 0x25, 0x1d, 0x15, 0x09, + 0xff, 0xf2, 0xe7, 0xe5, 0xe8, 0xea, 0xec, 0xf2, 0xfd, 0x00, 0xff, 0xfd, + 0xf9, 0xfd, 0x08, 0x0c, 0x06, 0xff, 0xf9, 0xf9, 0xf7, 0xf3, 0xf0, 0xed, + 0xef, 0xf4, 0xfc, 0x00, 0x04, 0x0a, 0x0b, 0x0d, 0x15, 0x1a, 0x16, 0x11, + 0x0d, 0x09, 0x0a, 0x0c, 0x0b, 0x04, 0x02, 0x04, 0x08, 0x09, 0x0b, 0x07, + 0x04, 0x0f, 0x18, 0x17, 0x14, 0x15, 0x16, 0x14, 0x0d, 0x00, 0xf6, 0xec, + 0xe4, 0xe8, 0xf3, 0xf6, 0xf1, 0xef, 0xee, 0xf4, 0xff, 0xfe, 0xf7, 0xed, + 0xe4, 0xe1, 0xe3, 0xe5, 0xf0, 0xf8, 0xff, 0x0a, 0x14, 0x1d, 0x25, 0x2c, + 0x38, 0x40, 0x39, 0x2e, 0x26, 0x1c, 0x12, 0x0d, 0x04, 0xf4, 0xe3, 0xdd, + 0xe5, 0xf2, 0x01, 0x07, 0x01, 0xfe, 0x00, 0x01, 0xfd, 0xf7, 0xf1, 0xeb, + 0xe7, 0xe9, 0xee, 0xf2, 0xf8, 0xff, 0x07, 0x0c, 0x08, 0x07, 0x08, 0x0b, + 0x16, 0x1e, 0x22, 0x21, 0x1b, 0x19, 0x19, 0x13, 0x0c, 0xfb, 0xf0, 0xef, + 0xf7, 0xfa, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0x01, 0x05, 0x01, 0xfc, 0xf9, + 0xfa, 0xfa, 0xf5, 0xf4, 0xf3, 0xf2, 0xf8, 0x00, 0x07, 0x09, 0x0a, 0x0f, + 0x15, 0x15, 0x17, 0x14, 0x11, 0x11, 0x10, 0x0a, 0xfb, 0xf0, 0xf4, 0x00, + 0x08, 0x12, 0x1a, 0x1b, 0x19, 0x17, 0x19, 0x17, 0x09, 0xfb, 0xef, 0xe7, + 0xe3, 0xe5, 0xe5, 0xe4, 0xe3, 0xe8, 0xee, 0xf4, 0xfb, 0x04, 0x0e, 0x19, + 0x1c, 0x16, 0x0f, 0x10, 0x12, 0x0e, 0x06, 0xfa, 0xec, 0xe9, 0xf3, 0xfe, + 0x09, 0x0f, 0x10, 0x0d, 0x08, 0x0b, 0x12, 0x14, 0x10, 0x0d, 0x08, 0x05, + 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x01, 0x01, 0x07, 0x0f, 0x0e, + 0x08, 0x01, 0x05, 0x0c, 0x0a, 0x04, 0xfc, 0xef, 0xe2, 0xde, 0xe1, 0xe9, + 0xf5, 0xff, 0xff, 0xfd, 0xfb, 0xfc, 0xfd, 0xfd, 0xf8, 0xf5, 0xf4, 0xf8, + 0xf9, 0xf7, 0xf8, 0xff, 0x0a, 0x17, 0x1e, 0x23, 0x30, 0x3c, 0x41, 0x39, + 0x2e, 0x29, 0x28, 0x1d, 0x11, 0x0a, 0x02, 0xf4, 0xe9, 0xe7, 0xe9, 0xeb, + 0xee, 0xf0, 0xed, 0xf0, 0xf4, 0xf3, 0xee, 0xe7, 0xe2, 0xdf, 0xe4, 0xe8, + 0xe8, 0xe6, 0xec, 0xf4, 0xfb, 0x02, 0x04, 0x0c, 0x1b, 0x23, 0x20, 0x23, + 0x2b, 0x2f, 0x30, 0x2d, 0x27, 0x18, 0x09, 0xfd, 0xfa, 0x00, 0x08, 0x0a, + 0x07, 0x04, 0x03, 0x01, 0x00, 0x00, 0xfc, 0xf6, 0xf5, 0xf6, 0xf9, 0xfb, + 0xf7, 0xf6, 0xf7, 0xf0, 0xf1, 0xfc, 0x02, 0x0a, 0x13, 0x10, 0x04, 0xfe, + 0xfe, 0xfd, 0xfd, 0x02, 0xfe, 0xf4, 0xee, 0xec, 0xf0, 0xfa, 0x06, 0x0e, + 0x16, 0x1d, 0x20, 0x1d, 0x1e, 0x1b, 0x12, 0x09, 0x00, 0xf6, 0xf5, 0xfa, + 0xf9, 0xf8, 0xfa, 0xfb, 0xfe, 0xfc, 0xfd, 0x08, 0x12, 0x13, 0x14, 0x13, + 0x12, 0x13, 0x11, 0x08, 0xfe, 0xf6, 0xf5, 0xf6, 0xf4, 0xfa, 0xfc, 0xfe, + 0x02, 0x06, 0xfe, 0xf7, 0xfc, 0xff, 0xfd, 0xfe, 0xff, 0x02, 0x01, 0xff, + 0xf6, 0xf3, 0xfa, 0x07, 0x0f, 0x0d, 0x0e, 0x15, 0x15, 0x13, 0x14, 0x18, + 0x1e, 0x1c, 0x0f, 0x02, 0xf9, 0xf6, 0xf5, 0xf5, 0xf2, 0xf2, 0xfd, 0x03, + 0x06, 0x06, 0x06, 0x01, 0xf8, 0xed, 0xe6, 0xeb, 0xef, 0xfa, 0x01, 0x00, + 0xfe, 0x01, 0x05, 0x09, 0x12, 0x1e, 0x2f, 0x32, 0x2a, 0x21, 0x1d, 0x20, + 0x1b, 0x0f, 0xfb, 0xf0, 0xf1, 0xf1, 0xee, 0xef, 0xf4, 0xf4, 0xf3, 0xe9, + 0xe6, 0xec, 0xf0, 0xf6, 0xfa, 0xf8, 0xf6, 0xf5, 0xf6, 0xf3, 0xf5, 0xf8, + 0x03, 0x05, 0x03, 0x08, 0x13, 0x19, 0x1e, 0x23, 0x1e, 0x1d, 0x27, 0x2e, + 0x2b, 0x24, 0x1c, 0x13, 0x08, 0x02, 0xfb, 0xf9, 0xfb, 0x00, 0x03, 0xfd, + 0xf8, 0xf4, 0xee, 0xe5, 0xe6, 0xeb, 0xf2, 0xef, 0xea, 0xec, 0xed, 0xf0, + 0xf0, 0xf1, 0xf7, 0x05, 0x0d, 0x0a, 0x11, 0x14, 0x16, 0x17, 0x14, 0x0c, + 0x02, 0xfb, 0xf5, 0xfa, 0x04, 0x09, 0x07, 0x07, 0x0b, 0x10, 0x14, 0x1f, + 0x25, 0x1f, 0x11, 0x0d, 0x0d, 0x0d, 0x07, 0xfd, 0xfb, 0xfd, 0xfe, 0xfc, + 0xf8, 0xfa, 0x01, 0x02, 0xfa, 0xf7, 0xfa, 0xfb, 0xfb, 0x01, 0x08, 0x01, + 0xfa, 0xf5, 0xed, 0xea, 0xf3, 0xff, 0x06, 0x03, 0xfc, 0xfa, 0xfc, 0x00, + 0xfd, 0xfb, 0x01, 0x06, 0x0a, 0x0e, 0x0e, 0x0f, 0x0d, 0x06, 0x03, 0x06, + 0x05, 0x0c, 0x13, 0x16, 0x1a, 0x1a, 0x18, 0x17, 0x15, 0x16, 0x16, 0x16, + 0x12, 0x05, 0xfa, 0xfa, 0xfd, 0xfa, 0xed, 0xea, 0xf2, 0xf8, 0xf7, 0xf3, + 0xf0, 0xed, 0xea, 0xe3, 0xe0, 0xe2, 0xe1, 0xe7, 0xec, 0xf5, 0x03, 0x09, + 0x0e, 0x15, 0x1b, 0x1d, 0x21, 0x27, 0x2b, 0x2f, 0x2d, 0x2a, 0x24, 0x16, + 0x04, 0xfd, 0x02, 0x04, 0x06, 0x04, 0xfd, 0xfb, 0xfd, 0xf7, 0xf0, 0xed, + 0xeb, 0xe9, 0xeb, 0xf0, 0xfa, 0xfe, 0xfb, 0xfa, 0xf6, 0xf9, 0x03, 0x08, + 0x0b, 0x10, 0x0b, 0x08, 0x0a, 0x09, 0x0d, 0x16, 0x16, 0x12, 0x14, 0x10, + 0x0b, 0x08, 0x02, 0x00, 0x06, 0x05, 0x00, 0xfb, 0xfa, 0xf4, 0xf6, 0xf8, + 0xf3, 0xf4, 0xf8, 0xfb, 0x00, 0x02, 0x01, 0x02, 0xfd, 0xff, 0x00, 0xfe, + 0x02, 0x0f, 0x14, 0x12, 0x0e, 0x11, 0x17, 0x16, 0x0c, 0x0a, 0x05, 0x00, + 0xfb, 0xfc, 0xff, 0x02, 0x08, 0x07, 0x02, 0x02, 0x02, 0x05, 0x09, 0x05, + 0x01, 0x04, 0x06, 0x00, 0xfa, 0xf1, 0xf4, 0xfb, 0xff, 0x02, 0x05, 0x08, + 0x07, 0x02, 0xfe, 0xfa, 0xf7, 0xfe, 0x04, 0x02, 0xff, 0x01, 0x02, 0x00, + 0xfe, 0x00, 0x05, 0x09, 0x0c, 0x0b, 0x0a, 0x0b, 0x08, 0x00, 0xf6, 0xf5, + 0x00, 0x0a, 0x0f, 0x10, 0x13, 0x11, 0x0c, 0x06, 0x04, 0x05, 0x0b, 0x0c, + 0x07, 0x03, 0xff, 0xfe, 0x06, 0x0e, 0x08, 0x02, 0x02, 0x04, 0xfe, 0xfb, + 0x03, 0x08, 0x06, 0xfe, 0xf4, 0xee, 0xf2, 0xf6, 0xf1, 0xed, 0xed, 0xef, + 0xf1, 0xf1, 0xf3, 0xf4, 0xf6, 0xfb, 0xfd, 0x00, 0x04, 0x10, 0x18, 0x1c, + 0x23, 0x25, 0x22, 0x21, 0x20, 0x21, 0x27, 0x2d, 0x28, 0x17, 0x06, 0x08, + 0x0e, 0x0a, 0x04, 0x04, 0xfe, 0xef, 0xe2, 0xe0, 0xe2, 0xe2, 0xe3, 0xe3, + 0xe3, 0xe0, 0xe0, 0xe6, 0xee, 0xf6, 0xfa, 0xfe, 0x0c, 0x13, 0x0d, 0x0b, + 0x14, 0x18, 0x12, 0x07, 0xfe, 0x09, 0x1a, 0x1f, 0x1b, 0x18, 0x17, 0x12, + 0x0a, 0x09, 0x0c, 0x0e, 0x0b, 0x07, 0x00, 0xfa, 0xf2, 0xf2, 0xf6, 0xfd, + 0x02, 0x01, 0x05, 0x06, 0x04, 0x01, 0x05, 0x0f, 0x11, 0xfe, 0xf2, 0xfa, + 0x00, 0x02, 0x00, 0xfd, 0xfc, 0xfa, 0xfd, 0xfa, 0xf9, 0xfe, 0x04, 0x07, + 0x07, 0x02, 0xff, 0x03, 0x04, 0x02, 0xff, 0x00, 0xff, 0xfc, 0xfe, 0x06, + 0x09, 0x0c, 0x0a, 0x03, 0xff, 0x03, 0x0f, 0x18, 0x18, 0x13, 0x0d, 0x07, + 0x05, 0x00, 0xfd, 0xfd, 0x02, 0x0b, 0x0a, 0x02, 0xfe, 0x00, 0x00, 0x02, + 0x04, 0x05, 0x05, 0x01, 0xf7, 0xf3, 0xf8, 0xff, 0xfb, 0xf3, 0xf5, 0xfa, + 0xff, 0x06, 0x0b, 0x0a, 0x02, 0x03, 0x0a, 0x0f, 0x0f, 0x0c, 0x0b, 0x09, + 0x04, 0xfc, 0xf3, 0xf5, 0xff, 0x06, 0x0b, 0x0d, 0x0e, 0x0d, 0x0c, 0x0e, + 0x0f, 0x10, 0x0d, 0x05, 0xf9, 0xf2, 0xf4, 0xf7, 0xf5, 0xf4, 0xf4, 0xf7, + 0xf9, 0xfd, 0x00, 0x01, 0x08, 0x0e, 0x0d, 0x05, 0x02, 0x07, 0x0e, 0x0d, + 0x0b, 0x07, 0x07, 0x0d, 0x14, 0x17, 0x17, 0x14, 0x10, 0x0f, 0x0e, 0x0a, + 0x08, 0x0b, 0x07, 0xf9, 0xea, 0xe2, 0xe1, 0xe1, 0xe1, 0xe6, 0xed, 0xef, + 0xf0, 0xef, 0xf0, 0xf8, 0x03, 0x08, 0x10, 0x19, 0x1b, 0x17, 0x17, 0x15, + 0x0f, 0x0f, 0x14, 0x17, 0x1a, 0x1d, 0x21, 0x22, 0x1e, 0x0f, 0x06, 0x01, + 0x01, 0xff, 0xfc, 0xf8, 0xef, 0xe7, 0xe8, 0xe9, 0xe9, 0xf0, 0xf6, 0xf6, + 0xfc, 0x02, 0x03, 0x06, 0x0c, 0x0d, 0x0e, 0x13, 0x11, 0x0b, 0x00, 0xf5, + 0xf2, 0xf6, 0xf6, 0xf1, 0xf5, 0xfd, 0x03, 0x09, 0x0d, 0x0f, 0x12, 0x0f, + 0x0b, 0x0c, 0x0b, 0x09, 0x03, 0xfc, 0xff, 0x05, 0x07, 0x0c, 0x13, 0x10, + 0x0f, 0x0e, 0x0d, 0x12, 0x11, 0x0b, 0x0b, 0x0f, 0x08, 0xf9, 0xf1, 0xea, + 0xe8, 0xf1, 0xfb, 0x00, 0x04, 0x04, 0x03, 0xfe, 0xfb, 0xfe, 0xff, 0xfc, + 0xfe, 0x03, 0x00, 0xfd, 0xfa, 0xf7, 0xf8, 0xf9, 0xf7, 0xfc, 0x02, 0x07, + 0x10, 0x14, 0x11, 0x0b, 0x0d, 0x11, 0x17, 0x1b, 0x15, 0x0b, 0x01, 0xf9, + 0xfc, 0x07, 0x0c, 0x0a, 0x0f, 0x13, 0x12, 0x10, 0x0c, 0x08, 0x01, 0xfc, + 0xff, 0x01, 0xfd, 0xf6, 0xec, 0xe5, 0xe8, 0xeb, 0xec, 0xec, 0xf4, 0xf9, + 0xff, 0x06, 0x0b, 0x0d, 0x10, 0x0e, 0x11, 0x15, 0x0f, 0x05, 0xf9, 0xf5, + 0xfd, 0x05, 0x04, 0x05, 0x12, 0x1a, 0x17, 0x16, 0x17, 0x19, 0x18, 0x12, + 0x0b, 0x05, 0xfc, 0xf0, 0xea, 0xe9, 0xed, 0xf0, 0xf8, 0xff, 0x02, 0xff, + 0x01, 0x02, 0xfd, 0xfc, 0xfd, 0x02, 0x07, 0x08, 0x03, 0xfc, 0xfb, 0x02, + 0x0f, 0x13, 0x14, 0x1e, 0x28, 0x20, 0x12, 0x0c, 0x08, 0x01, 0xff, 0xfe, + 0xfe, 0xfe, 0xfa, 0xf1, 0xe8, 0xe3, 0xe1, 0xe5, 0xeb, 0xf7, 0xfd, 0x05, + 0x0b, 0x0e, 0x11, 0x13, 0x17, 0x1e, 0x1b, 0x11, 0x07, 0x01, 0x02, 0x02, + 0x02, 0x00, 0xff, 0x01, 0x08, 0x0b, 0x0a, 0x09, 0x08, 0x04, 0x01, 0x01, + 0x04, 0x04, 0xfb, 0xf2, 0xed, 0xf0, 0xf6, 0x01, 0x0d, 0x0f, 0x14, 0x16, + 0x0f, 0x0c, 0x0f, 0x15, 0x1b, 0x15, 0x08, 0xfb, 0xf0, 0xe7, 0xe7, 0xea, + 0xea, 0xea, 0xf4, 0xfe, 0x06, 0x09, 0x09, 0x0c, 0x09, 0x04, 0xff, 0x01, + 0x03, 0x02, 0x06, 0x04, 0x04, 0x08, 0x07, 0x0e, 0x17, 0x1f, 0x23, 0x16, + 0x05, 0x03, 0x03, 0x03, 0x07, 0x08, 0xff, 0xf4, 0xf2, 0xf0, 0xf5, 0xfc, + 0x02, 0x07, 0x0d, 0x0e, 0x0e, 0x0d, 0x06, 0x05, 0x04, 0x01, 0x05, 0x07, + 0xfe, 0xfa, 0xfb, 0xf4, 0xeb, 0xe1, 0xdb, 0xe3, 0xee, 0xfa, 0x05, 0x0a, + 0x0d, 0x11, 0x1b, 0x1f, 0x1d, 0x15, 0x10, 0x0b, 0x04, 0x00, 0x07, 0x0d, + 0x08, 0x0a, 0x11, 0x18, 0x1c, 0x15, 0x07, 0x07, 0x06, 0x05, 0x06, 0xfd, + 0xf3, 0xf3, 0xee, 0xe3, 0xe3, 0xed, 0xf2, 0xff, 0x0a, 0x09, 0x02, 0x03, + 0x05, 0x04, 0x05, 0x05, 0x02, 0xfd, 0xf8, 0xf8, 0xf9, 0x02, 0x06, 0xfe, + 0xfe, 0x0c, 0x17, 0x21, 0x23, 0x17, 0x0f, 0x0f, 0x08, 0x01, 0x01, 0x02, + 0x00, 0xff, 0xfd, 0xf3, 0xf3, 0xf7, 0xfe, 0x08, 0x0a, 0x06, 0x06, 0x03, + 0xff, 0x01, 0x0c, 0x10, 0x08, 0xfd, 0xfa, 0xfd, 0x03, 0x09, 0x04, 0x00, + 0x01, 0x03, 0x03, 0x05, 0x09, 0x07, 0x05, 0x04, 0x05, 0x05, 0x09, 0x09, + 0x02, 0xfb, 0xee, 0xe3, 0xe4, 0xe8, 0xf4, 0x01, 0x0e, 0x18, 0x18, 0x12, + 0x14, 0x1e, 0x1f, 0x12, 0x07, 0x02, 0x02, 0x02, 0x01, 0xf8, 0xf7, 0xfe, + 0x00, 0xfd, 0x00, 0x06, 0x08, 0x05, 0x02, 0xfc, 0xf6, 0xf6, 0xf9, 0xf6, + 0xf6, 0xf9, 0xff, 0x06, 0x0a, 0x0f, 0x1e, 0x2a, 0x27, 0x1b, 0x0e, 0x09, + 0x0c, 0x0d, 0x04, 0xf9, 0xf8, 0xf9, 0xf4, 0xf1, 0xec, 0xe7, 0xeb, 0xf3, + 0xf4, 0xfa, 0x03, 0x10, 0x15, 0x10, 0x08, 0x03, 0x09, 0x0e, 0x07, 0x03, + 0x09, 0x0c, 0x05, 0xfd, 0xfc, 0x03, 0x05, 0x03, 0xfe, 0xfa, 0x01, 0x06, + 0x0a, 0x0a, 0x09, 0x07, 0x0a, 0x09, 0x03, 0xfe, 0xfd, 0x01, 0x08, 0x0a, + 0x0a, 0x0c, 0x16, 0x19, 0x0f, 0x04, 0x05, 0x0a, 0x08, 0xfe, 0xf7, 0xf8, + 0xf5, 0xea, 0xdb, 0xd7, 0xe4, 0xf2, 0xf6, 0xf9, 0x01, 0x0a, 0x0f, 0x14, + 0x15, 0x0a, 0x02, 0x02, 0x07, 0x07, 0x07, 0x08, 0x0c, 0x10, 0x13, 0x11, + 0x14, 0x1c, 0x1b, 0x14, 0x0a, 0x07, 0x04, 0xfe, 0xf8, 0xf4, 0xf7, 0xf7, + 0xf7, 0xf4, 0xf5, 0xfc, 0x06, 0x0a, 0x0b, 0x07, 0x07, 0x06, 0x06, 0x08, + 0x04, 0x02, 0x02, 0x05, 0xff, 0xf6, 0xf7, 0xf5, 0xf1, 0xf3, 0xfa, 0xfb, + 0xfc, 0x00, 0x05, 0x09, 0x0d, 0x0e, 0x0b, 0x0a, 0x0f, 0x14, 0x12, 0x0f, + 0x07, 0xfe, 0xff, 0x01, 0x03, 0x03, 0x07, 0x0b, 0x0b, 0x0b, 0x09, 0x06, + 0x05, 0x05, 0x05, 0x01, 0x00, 0x03, 0x03, 0xfc, 0xfb, 0xfd, 0xff, 0x01, + 0x01, 0x01, 0x04, 0x03, 0x02, 0x03, 0x00, 0xff, 0xfe, 0xf7, 0xf2, 0xf4, + 0xf6, 0xf5, 0xf7, 0xfd, 0x05, 0x0c, 0x17, 0x1b, 0x19, 0x1b, 0x19, 0x10, + 0x08, 0x06, 0x04, 0x03, 0x03, 0x02, 0xf8, 0xf5, 0xfc, 0xfe, 0xfa, 0xfb, + 0xfc, 0x02, 0x06, 0x05, 0x03, 0x01, 0x04, 0x02, 0xfd, 0xfc, 0xff, 0x04, + 0x09, 0x0a, 0x09, 0x0e, 0x14, 0x18, 0x0f, 0x04, 0xff, 0x01, 0x01, 0x00, + 0x03, 0x0a, 0x0a, 0x07, 0xfe, 0xf5, 0xec, 0xf0, 0xf5, 0xf3, 0xf3, 0xfe, + 0x07, 0x0e, 0x13, 0x10, 0x0a, 0x09, 0x0a, 0x06, 0x04, 0x0a, 0x0b, 0x0a, + 0x09, 0xff, 0xf4, 0xf1, 0xf7, 0xfc, 0xfe, 0x00, 0x05, 0x04, 0x00, 0x02, + 0x09, 0x0a, 0x07, 0x00, 0xff, 0x04, 0x09, 0x0a, 0x0e, 0x12, 0x19, 0x1a, + 0x17, 0x14, 0x0e, 0x0d, 0x0c, 0x08, 0x02, 0xf5, 0xef, 0xed, 0xed, 0xef, + 0xed, 0xe9, 0xea, 0xef, 0xf8, 0xfe, 0x05, 0x0e, 0x11, 0x06, 0x06, 0x0d, + 0x0e, 0x0e, 0x0c, 0x05, 0x01, 0xff, 0xfe, 0xff, 0x01, 0x07, 0x09, 0x08, + 0x05, 0x03, 0x01, 0x02, 0x04, 0x05, 0x04, 0x08, 0x0b, 0x0c, 0x0f, 0x11, + 0x0c, 0x07, 0x08, 0x09, 0x0f, 0x11, 0x0e, 0x0c, 0x02, 0xfa, 0xfc, 0x02, + 0x02, 0xfd, 0xf7, 0xf4, 0xef, 0xef, 0xf2, 0xf1, 0xea, 0xe8, 0xef, 0xfa, + 0x02, 0x09, 0x0b, 0x08, 0x06, 0x09, 0x0f, 0x14, 0x0e, 0x09, 0x11, 0x11, + 0x04, 0xff, 0x02, 0x07, 0x13, 0x16, 0x14, 0x12, 0x0e, 0x0a, 0x0d, 0x0f, + 0x0b, 0x03, 0xfd, 0xfb, 0xf7, 0xf9, 0xff, 0x01, 0xfe, 0xff, 0x03, 0x00, + 0x00, 0x04, 0x04, 0x04, 0x03, 0xff, 0xf9, 0xf6, 0xf2, 0xf4, 0xfa, 0xf7, + 0xee, 0xf0, 0x00, 0x0d, 0x11, 0x14, 0x17, 0x0c, 0xff, 0x00, 0x0a, 0x13, + 0x17, 0x15, 0x0c, 0x03, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0x01, 0x06, 0x05, + 0x08, 0x09, 0x02, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x10, 0x14, 0x14, 0x10, + 0x09, 0x03, 0x00, 0xfd, 0xfd, 0x04, 0x04, 0xf8, 0xf6, 0xfc, 0x06, 0x06, + 0x06, 0x00, 0xf8, 0xf4, 0xf2, 0xf5, 0xf7, 0xfa, 0xfb, 0x00, 0x0d, 0x10, + 0x13, 0x18, 0x15, 0x10, 0x11, 0x12, 0x0e, 0x09, 0x03, 0x00, 0xfa, 0xf3, + 0xef, 0xf2, 0xf5, 0xfa, 0x03, 0x08, 0x04, 0x00, 0x06, 0x0f, 0x0f, 0x0b, + 0x08, 0x06, 0xff, 0xf8, 0xfe, 0x01, 0x04, 0x0d, 0x13, 0x19, 0x16, 0x0f, + 0x0b, 0x02, 0xf8, 0xf6, 0xfc, 0x01, 0x01, 0x00, 0x01, 0x01, 0xfd, 0xf3, + 0xf4, 0xfa, 0x00, 0x0a, 0x0f, 0x0d, 0x06, 0x03, 0x02, 0x01, 0x08, 0x07, + 0x06, 0x07, 0x00, 0xfa, 0xfd, 0xfd, 0xfb, 0xf8, 0xf3, 0xf6, 0xf8, 0xfd, + 0x04, 0x01, 0xfe, 0x04, 0x0a, 0x11, 0x1b, 0x21, 0x21, 0x19, 0x0f, 0x0b, + 0x09, 0x0c, 0x0d, 0x10, 0x11, 0x09, 0x07, 0x0a, 0x0d, 0x0c, 0x08, 0x02, + 0xfb, 0xef, 0xe1, 0xdb, 0xe0, 0xe6, 0xe5, 0xe9, 0xf4, 0xfa, 0xfb, 0x05, + 0x0a, 0x09, 0x0d, 0x10, 0x0f, 0x11, 0x11, 0x0b, 0xfe, 0xf7, 0xf5, 0xf6, + 0x00, 0x0b, 0x16, 0x1d, 0x1c, 0x12, 0x0c, 0x07, 0x02, 0x04, 0x0c, 0x12, + 0x10, 0x06, 0x02, 0x06, 0x05, 0x03, 0x05, 0x0e, 0x10, 0x08, 0x02, 0x02, + 0xfe, 0xf3, 0xef, 0xec, 0xf0, 0xfd, 0x03, 0x00, 0xfe, 0xfe, 0xf7, 0xf4, + 0xf8, 0xfa, 0xfa, 0xfc, 0xfd, 0xff, 0x02, 0x05, 0x0c, 0x10, 0x13, 0x13, + 0x0e, 0x08, 0x02, 0xfe, 0xf9, 0xfc, 0x03, 0x05, 0x05, 0x00, 0x04, 0x11, + 0x13, 0x10, 0x12, 0x17, 0x1f, 0x24, 0x1b, 0x0d, 0x03, 0xfb, 0xf6, 0xf6, + 0xf9, 0xff, 0x04, 0xff, 0xfc, 0xfe, 0xff, 0x04, 0x05, 0x02, 0xff, 0xfa, + 0xee, 0xe2, 0xde, 0xda, 0xe5, 0xf9, 0x03, 0x08, 0x0f, 0x14, 0x18, 0x16, + 0x0d, 0x05, 0x06, 0x0f, 0x18, 0x13, 0x0b, 0x08, 0x05, 0xfe, 0xfc, 0xff, + 0x08, 0x14, 0x13, 0x0c, 0x0a, 0x07, 0x01, 0xfd, 0xfd, 0xfe, 0x02, 0x0a, + 0x07, 0x00, 0x01, 0x06, 0x06, 0x05, 0x04, 0x01, 0xf9, 0xf4, 0xf7, 0xf5, + 0xf2, 0xf9, 0x01, 0x08, 0x0f, 0x0e, 0x10, 0x0b, 0x03, 0xfc, 0xf7, 0xf8, + 0x02, 0x06, 0x02, 0xfd, 0x06, 0x13, 0x17, 0x19, 0x1c, 0x18, 0x11, 0x03, + 0xf3, 0xe9, 0xe4, 0xe4, 0xe8, 0xf0, 0xf8, 0xfb, 0xfb, 0xfd, 0x05, 0x09, + 0x0b, 0x11, 0x1a, 0x22, 0x21, 0x18, 0x0c, 0x05, 0xfb, 0xf3, 0xf8, 0x0e, + 0x1a, 0x19, 0x18, 0x18, 0x11, 0x08, 0x00, 0xfd, 0xfb, 0xfb, 0xfc, 0xf2, + 0xe6, 0xe9, 0xee, 0xef, 0xf8, 0x00, 0x04, 0x05, 0x07, 0x08, 0x08, 0x03, + 0xff, 0x01, 0x01, 0x01, 0xfe, 0x06, 0x09, 0x06, 0x02, 0xfe, 0x01, 0x08, + 0x09, 0x05, 0x01, 0xfe, 0xff, 0x01, 0x09, 0x12, 0x15, 0x16, 0x16, 0x10, + 0x0e, 0x0c, 0x0b, 0x07, 0x07, 0x07, 0x08, 0x00, 0xf5, 0xf2, 0xf9, 0x04, + 0x0c, 0x13, 0x18, 0x12, 0x0a, 0x01, 0xfa, 0xf0, 0xe3, 0xdf, 0xe7, 0xee, + 0xf4, 0xf8, 0xfa, 0x02, 0x08, 0x10, 0x13, 0x10, 0x0e, 0x07, 0xfa, 0xef, + 0xec, 0xe5, 0xe8, 0xf3, 0x01, 0x10, 0x16, 0x15, 0x19, 0x1a, 0x18, 0x14, + 0x19, 0x20, 0x1d, 0x17, 0x16, 0x0f, 0x0b, 0x07, 0x02, 0x03, 0x0e, 0x13, + 0x0f, 0x0b, 0x07, 0x00, 0xfa, 0xf5, 0xf2, 0xec, 0xe9, 0xe4, 0xe0, 0xe8, + 0xee, 0xf1, 0xf8, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x0c, + 0x17, 0x18, 0x0f, 0x10, 0x18, 0x15, 0x0f, 0x0e, 0x0b, 0x08, 0x0c, 0x0f, + 0x0c, 0x03, 0xff, 0x01, 0x0b, 0x1e, 0x24, 0x22, 0x1d, 0x12, 0x02, 0xfb, + 0xfa, 0xf5, 0xee, 0xef, 0xf5, 0xf6, 0xf6, 0xf2, 0xed, 0xf4, 0x02, 0x0b, + 0x0e, 0x0c, 0x0a, 0x05, 0xfd, 0xf5, 0xf1, 0xe7, 0xe8, 0xf0, 0xfc, 0x0a, + 0x12, 0x15, 0x19, 0x1b, 0x1d, 0x17, 0x0b, 0x03, 0xff, 0xf3, 0xf0, 0xf2, + 0xf6, 0xf9, 0xff, 0x0a, 0x13, 0x0f, 0x0b, 0x0a, 0x09, 0x0a, 0x12, 0x16, + 0x0f, 0x05, 0x04, 0x00, 0x03, 0x0d, 0x0e, 0x09, 0x05, 0x07, 0x08, 0x03, + 0xfd, 0xf6, 0xf3, 0xf3, 0xfc, 0xfe, 0x00, 0xff, 0xf6, 0xf6, 0xfb, 0xfc, + 0xfe, 0x01, 0x00, 0xfd, 0xfc, 0x00, 0xfd, 0xf4, 0xf9, 0x07, 0x16, 0x22, + 0x20, 0x18, 0x12, 0x0d, 0x0a, 0x04, 0xff, 0xf8, 0xf2, 0xf6, 0xfd, 0xfd, + 0xfb, 0xfc, 0x05, 0x15, 0x1b, 0x17, 0x15, 0x0e, 0x03, 0xfc, 0xfc, 0xfa, + 0xf2, 0xf1, 0xfa, 0xfe, 0x06, 0x11, 0x0d, 0x05, 0x09, 0x16, 0x19, 0x14, + 0x08, 0x02, 0xfc, 0xfa, 0xfa, 0xf9, 0xf8, 0xf2, 0xf7, 0x03, 0x07, 0x03, + 0x06, 0x0e, 0x12, 0x0c, 0x04, 0xf9, 0xeb, 0xe1, 0xe0, 0xe2, 0xf1, 0xff, + 0x03, 0x06, 0x09, 0x0a, 0x07, 0x01, 0xfb, 0x00, 0x0b, 0x1a, 0x21, 0x20, + 0x18, 0x14, 0x18, 0x1f, 0x1c, 0x19, 0x14, 0x0d, 0x0b, 0x0b, 0x07, 0xff, + 0xf4, 0xf1, 0xf8, 0xfc, 0x04, 0x0c, 0x06, 0xfa, 0xf0, 0xf1, 0xf4, 0xef, + 0xeb, 0xe9, 0xe3, 0xe4, 0xec, 0xf2, 0xf2, 0xfb, 0x0f, 0x1b, 0x16, 0x0c, + 0x09, 0x09, 0x08, 0x08, 0x09, 0x05, 0xfa, 0xfb, 0x02, 0x05, 0x0c, 0x17, + 0x1d, 0x20, 0x26, 0x27, 0x20, 0x16, 0x0a, 0x00, 0xfb, 0xfb, 0xfd, 0xfc, + 0xfd, 0xff, 0x09, 0x0e, 0x07, 0xfd, 0xf5, 0x01, 0x0f, 0x0b, 0x03, 0xf6, + 0xe9, 0xe7, 0xeb, 0xf0, 0xf9, 0xfe, 0xfa, 0xf7, 0xf8, 0xfb, 0xfe, 0x00, + 0x02, 0x06, 0x05, 0x01, 0x03, 0x03, 0xfb, 0xf8, 0x03, 0x0c, 0x09, 0x0d, + 0x12, 0x12, 0x11, 0x0d, 0x0b, 0xff, 0xfe, 0x11, 0x1d, 0x1b, 0x1d, 0x23, + 0x21, 0x1a, 0x14, 0x10, 0x0b, 0x03, 0xfb, 0xf9, 0xf4, 0xf0, 0xf0, 0xef, + 0xf2, 0xf8, 0xff, 0x00, 0xfe, 0xf9, 0xee, 0xec, 0xee, 0xf1, 0xf3, 0xef, + 0xe7, 0xe9, 0xf3, 0xfe, 0x04, 0x0c, 0x1b, 0x22, 0x20, 0x19, 0x13, 0x0e, + 0x0b, 0x0d, 0x0a, 0x07, 0x0a, 0x05, 0x03, 0x08, 0x12, 0x12, 0x0e, 0x11, + 0x16, 0x19, 0x15, 0x10, 0x08, 0xf7, 0xe5, 0xe6, 0xee, 0xf3, 0xf9, 0x01, + 0x05, 0x03, 0x01, 0xf9, 0xf1, 0xf1, 0xfe, 0x09, 0x07, 0x02, 0x00, 0x01, + 0x02, 0x07, 0x0f, 0x10, 0x09, 0x02, 0x00, 0x03, 0x04, 0x07, 0x09, 0x03, + 0xfb, 0xfb, 0xfd, 0x03, 0x08, 0x08, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, + 0xff, 0xff, 0xf6, 0xef, 0xf5, 0x02, 0x12, 0x1b, 0x1c, 0x18, 0x16, 0x14, + 0x11, 0x0f, 0x0e, 0x0d, 0x04, 0xfc, 0xf8, 0xfa, 0xfd, 0x02, 0x07, 0x0b, + 0x0e, 0x0c, 0x09, 0x07, 0x00, 0xf3, 0xef, 0xf2, 0xed, 0xee, 0xef, 0xf1, + 0xf4, 0xfe, 0x05, 0x05, 0x03, 0x0a, 0x0f, 0x10, 0x0a, 0x08, 0x03, 0xfb, + 0xf4, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x0a, 0x06, 0x07, 0x07, 0x08, 0x0c, + 0x13, 0x17, 0x0f, 0x09, 0x06, 0x00, 0x04, 0x0a, 0x0d, 0x10, 0x11, 0x0f, + 0x0c, 0x0b, 0x03, 0xfc, 0xfc, 0xfe, 0xfc, 0xfc, 0xff, 0x03, 0x09, 0x0c, + 0x0a, 0x05, 0x00, 0xf8, 0xf0, 0xec, 0xf1, 0xf6, 0xf1, 0xef, 0xf3, 0xf8, + 0xfc, 0xff, 0x03, 0x04, 0xfe, 0xfa, 0xfe, 0x01, 0x02, 0x07, 0x07, 0x02, + 0xfe, 0xff, 0x05, 0x0f, 0x1f, 0x2c, 0x2c, 0x25, 0x22, 0x21, 0x1b, 0x15, + 0x11, 0x0f, 0x07, 0xff, 0xfd, 0x02, 0x05, 0x05, 0x04, 0x01, 0xfe, 0xfc, + 0xfe, 0x01, 0xfb, 0xf4, 0xe7, 0xe0, 0xd9, 0xdc, 0xe6, 0xe9, 0xed, 0xf2, + 0xf8, 0xf8, 0xfc, 0xff, 0xfe, 0x04, 0x0d, 0x0d, 0x0d, 0x0e, 0x11, 0x15, + 0x18, 0x1c, 0x19, 0x12, 0x12, 0x15, 0x16, 0x14, 0x12, 0x10, 0x0f, 0x0b, + 0x05, 0x03, 0x08, 0x08, 0x06, 0x05, 0x06, 0x06, 0x05, 0x01, 0xfc, 0xfa, + 0xf9, 0xf3, 0xec, 0xea, 0xf1, 0xfa, 0xfd, 0xfe, 0x04, 0x05, 0x02, 0x00, + 0x00, 0xfd, 0xf8, 0xf2, 0xf5, 0xf8, 0xf6, 0xf9, 0x00, 0x07, 0x0b, 0x10, + 0x14, 0x12, 0x10, 0x0a, 0x05, 0x04, 0x04, 0x06, 0x03, 0x02, 0x05, 0x08, + 0x07, 0x0e, 0x15, 0x16, 0x1c, 0x1b, 0x16, 0x17, 0x15, 0x0c, 0x04, 0xfd, + 0xf7, 0xf6, 0xf7, 0xfb, 0xfb, 0xfc, 0xfd, 0xfa, 0xf8, 0xf3, 0xf2, 0xfa, + 0x00, 0xff, 0xf6, 0xf1, 0xf7, 0xfe, 0x00, 0x01, 0x01, 0xfd, 0x00, 0x03, + 0x08, 0x08, 0x03, 0x02, 0x06, 0x06, 0x03, 0x0c, 0x13, 0x15, 0x12, 0x16, + 0x13, 0x0b, 0x08, 0x03, 0x03, 0x06, 0x03, 0x02, 0xff, 0x00, 0x04, 0x07, + 0x05, 0x05, 0x04, 0x01, 0x00, 0xff, 0x01, 0x07, 0x06, 0x00, 0xfd, 0xfa, + 0xf8, 0xfa, 0xfe, 0x05, 0x0b, 0x11, 0x15, 0x14, 0x11, 0x09, 0x04, 0x03, + 0xfc, 0xf3, 0xec, 0xee, 0xfa, 0xfe, 0xfe, 0x03, 0x03, 0x03, 0x04, 0x05, + 0x05, 0x07, 0x05, 0xfe, 0xf9, 0xf5, 0xf1, 0xf8, 0xfa, 0xfa, 0xfb, 0x05, + 0x0b, 0x0c, 0x0d, 0x0e, 0x14, 0x1a, 0x1d, 0x1a, 0x12, 0x0e, 0x14, 0x16, + 0x14, 0x11, 0x10, 0x0e, 0x0e, 0x09, 0x05, 0x01, 0xfb, 0xf7, 0xf6, 0xf4, + 0xef, 0xf4, 0xf8, 0xf4, 0xf6, 0xfb, 0xfb, 0xf5, 0xee, 0xe9, 0xef, 0xfa, + 0xfb, 0xf2, 0xf3, 0xfd, 0x06, 0x08, 0x0b, 0x11, 0x0f, 0x0d, 0x0e, 0x08, + 0x06, 0x08, 0x0c, 0x0b, 0x08, 0x05, 0x06, 0x0d, 0x14, 0x14, 0x13, 0x1a, + 0x1d, 0x17, 0x0e, 0x07, 0x09, 0x09, 0x05, 0xfe, 0xf7, 0xf9, 0x02, 0x01, + 0xfc, 0xfb, 0x00, 0x07, 0x07, 0x04, 0x02, 0x02, 0x00, 0xff, 0xf6, 0xe6, + 0xdf, 0xe4, 0xe6, 0xe5, 0xeb, 0xf7, 0xfc, 0xff, 0xfc, 0xfa, 0x03, 0x0d, + 0x14, 0x0c, 0x06, 0x0a, 0x10, 0x0e, 0x10, 0x13, 0x13, 0x14, 0x17, 0x16, + 0x14, 0x17, 0x18, 0x15, 0x12, 0x0d, 0x0a, 0x0c, 0x0f, 0x0d, 0x08, 0x0a, + 0x0c, 0x05, 0xfc, 0xf4, 0xf9, 0xfa, 0xf4, 0xed, 0xe7, 0xea, 0xf1, 0xf2, + 0xf4, 0xf6, 0xf8, 0xf6, 0xf2, 0xf0, 0xf0, 0xf3, 0xf4, 0xf9, 0xfc, 0xf9, + 0xfc, 0x0c, 0x15, 0x17, 0x1d, 0x25, 0x24, 0x22, 0x1d, 0x10, 0x08, 0x08, + 0x0a, 0x04, 0x02, 0x06, 0x08, 0x0c, 0x11, 0x11, 0x0d, 0x0d, 0x0c, 0x0a, + 0x08, 0x08, 0x04, 0xfe, 0xfc, 0xf0, 0xeb, 0xee, 0xef, 0xf2, 0xf5, 0xf6, + 0xf7, 0xfc, 0xfc, 0xfc, 0x01, 0x07, 0x0a, 0x07, 0x06, 0x04, 0x00, 0xfd, + 0xff, 0x00, 0xff, 0x01, 0x06, 0x0a, 0x0a, 0x08, 0x06, 0x06, 0x0a, 0x08, + 0x06, 0x03, 0x01, 0x01, 0x02, 0x07, 0x06, 0x04, 0x01, 0x02, 0x05, 0x0b, + 0x12, 0x10, 0x0b, 0x09, 0x06, 0x06, 0x0d, 0x12, 0x0d, 0x05, 0x00, 0x03, + 0x04, 0x05, 0x00, 0xfc, 0xfd, 0xf8, 0xf6, 0xf8, 0xfa, 0xfc, 0x07, 0x13, + 0x0d, 0x05, 0x01, 0xfa, 0xf2, 0xee, 0xec, 0xec, 0xf2, 0xfb, 0xfc, 0x00, + 0x0f, 0x18, 0x13, 0x11, 0x13, 0x13, 0x15, 0x17, 0x0f, 0x02, 0xfc, 0xf7, + 0xf1, 0xf1, 0xf2, 0xf8, 0x01, 0x09, 0x09, 0x05, 0x05, 0x0d, 0x13, 0x15, + 0x10, 0x09, 0x0d, 0x0e, 0x08, 0x08, 0x0b, 0x0e, 0x0c, 0x07, 0x04, 0x06, + 0x09, 0x04, 0xfc, 0xfe, 0x00, 0xfd, 0xff, 0x00, 0xf7, 0xf0, 0xf1, 0xf3, + 0xef, 0xed, 0xf2, 0xf8, 0xfd, 0x02, 0x01, 0xfd, 0x03, 0x07, 0x06, 0x03, + 0x04, 0x01, 0xfe, 0xfc, 0xfe, 0x03, 0x08, 0x0b, 0x0b, 0x0d, 0x13, 0x18, + 0x1b, 0x17, 0x17, 0x16, 0x1c, 0x24, 0x24, 0x1c, 0x10, 0x08, 0x00, 0x00, + 0xfe, 0xf9, 0xf9, 0xf7, 0xf2, 0xf0, 0xf4, 0xfa, 0xfe, 0x00, 0x02, 0x01, + 0xff, 0xfc, 0xf4, 0xeb, 0xe4, 0xdd, 0xdd, 0xe1, 0xea, 0xf0, 0xfc, 0x0a, + 0x0d, 0x0d, 0x11, 0x11, 0x15, 0x1c, 0x19, 0x10, 0x0c, 0x0a, 0x07, 0x09, + 0x10, 0x14, 0x15, 0x17, 0x19, 0x17, 0x12, 0x0e, 0x0f, 0x10, 0x0c, 0x04, + 0xfa, 0xfb, 0xfc, 0xfc, 0xfe, 0x01, 0xfd, 0xfb, 0xfc, 0xf7, 0xf8, 0xfe, + 0xfe, 0xf8, 0xf6, 0xf6, 0xf8, 0xfe, 0x00, 0xf7, 0xeb, 0xe8, 0xeb, 0xf3, + 0xf9, 0xfe, 0x02, 0x03, 0x08, 0x0d, 0x0e, 0x10, 0x17, 0x1a, 0x1c, 0x18, + 0x10, 0x0e, 0x08, 0xfe, 0xff, 0x01, 0x03, 0x08, 0x08, 0x07, 0x0e, 0x15, + 0x16, 0x18, 0x13, 0x12, 0x16, 0x18, 0x15, 0x07, 0xff, 0xfc, 0xf8, 0xf3, + 0xe9, 0xe5, 0xe4, 0xe0, 0xe8, 0xee, 0xef, 0xfd, 0x04, 0x01, 0x04, 0x03, + 0xff, 0xfc, 0xf7, 0xf1, 0xf6, 0xfd, 0x09, 0x0f, 0x0d, 0x18, 0x23, 0x21, + 0x19, 0x15, 0x10, 0x10, 0x11, 0x0b, 0xfb, 0xf4, 0xf6, 0xf8, 0xfe, 0x01, + 0x00, 0x04, 0x07, 0x07, 0x09, 0x0c, 0x12, 0x10, 0x0a, 0x03, 0xfd, 0xfa, + 0xfe, 0xfd, 0xf8, 0xfe, 0x02, 0x06, 0x04, 0xfd, 0xfa, 0xff, 0x04, 0x02, + 0xfe, 0x00, 0x07, 0x0d, 0x16, 0x12, 0x04, 0xfb, 0xf2, 0xe9, 0xec, 0xf5, + 0xfc, 0xfd, 0xfc, 0xfe, 0x04, 0x0f, 0x1a, 0x1a, 0x12, 0x11, 0x0c, 0x09, + 0x05, 0xfc, 0xfa, 0xfe, 0xff, 0xfb, 0xf5, 0xf6, 0xfb, 0x01, 0x0b, 0x0f, + 0x10, 0x13, 0x15, 0x15, 0x17, 0x14, 0x0f, 0x09, 0x05, 0x05, 0x04, 0x06, + 0x09, 0x04, 0x00, 0x01, 0x03, 0x05, 0x01, 0xfb, 0xff, 0xff, 0xfa, 0xf0, + 0xe3, 0xdc, 0xe3, 0xf0, 0xf8, 0xfb, 0xff, 0x02, 0x09, 0x10, 0x15, 0x18, + 0x15, 0x0d, 0x04, 0x02, 0xfb, 0xf6, 0xf6, 0xf6, 0xf8, 0xff, 0x05, 0x0d, + 0x0d, 0x0d, 0x0f, 0x14, 0x1b, 0x1d, 0x18, 0x14, 0x14, 0x12, 0x15, 0x14, + 0x0c, 0x07, 0x05, 0xff, 0xfd, 0xfc, 0xf7, 0xed, 0xee, 0xf4, 0xf8, 0xfe, + 0x02, 0x05, 0x07, 0x0a, 0x05, 0xfc, 0xf0, 0xe8, 0xeb, 0xf0, 0xf7, 0xf3, + 0xe8, 0xe8, 0xf2, 0xff, 0x0c, 0x10, 0x0f, 0x10, 0x0d, 0x09, 0x08, 0x08, + 0x02, 0x04, 0x0a, 0x0b, 0x0f, 0x14, 0x19, 0x21, 0x28, 0x2b, 0x25, 0x1d, + 0x11, 0x0a, 0x0d, 0x0c, 0x03, 0xf7, 0xf1, 0xef, 0xf4, 0xf7, 0xfd, 0xf4, + 0xee, 0xf1, 0xf3, 0xf9, 0xff, 0x00, 0xff, 0xfb, 0xf8, 0xee, 0xe5, 0xdf, + 0xe3, 0xee, 0xfc, 0x02, 0x06, 0x08, 0x06, 0x0f, 0x1b, 0x23, 0x23, 0x1c, + 0x13, 0x0e, 0x12, 0x12, 0x0f, 0x0a, 0x04, 0xfe, 0xfc, 0xfd, 0x00, 0x04, + 0x05, 0x02, 0x06, 0x0c, 0x11, 0x10, 0x14, 0x15, 0x13, 0x0e, 0x08, 0x04, + 0xfe, 0x02, 0x04, 0xff, 0xf4, 0xe5, 0xdb, 0xdc, 0xe8, 0xf0, 0xf8, 0xfa, + 0x02, 0x06, 0x05, 0x00, 0xf9, 0xf9, 0xf2, 0xf7, 0x00, 0x04, 0x04, 0x0a, + 0x17, 0x1f, 0x29, 0x2c, 0x23, 0x15, 0x08, 0x03, 0x02, 0xfd, 0xf3, 0xf0, + 0xf3, 0xf9, 0xf9, 0xfe, 0x05, 0x09, 0x12, 0x19, 0x18, 0x14, 0x12, 0x14, + 0x0f, 0x07, 0x00, 0xf7, 0xed, 0xed, 0xf6, 0xfc, 0x00, 0x00, 0xfc, 0xf5, + 0xf2, 0xfb, 0x09, 0x0d, 0x0b, 0x08, 0x04, 0x02, 0x00, 0xfd, 0xfa, 0xff, + 0x05, 0x03, 0xfd, 0xf7, 0xfb, 0x04, 0x09, 0x0c, 0x0d, 0x0d, 0x09, 0x0c, + 0x10, 0x11, 0x0b, 0x06, 0x00, 0xf9, 0xf5, 0xf7, 0x01, 0x07, 0x05, 0xfe, + 0xf7, 0xf9, 0x01, 0x06, 0x0e, 0x11, 0x11, 0x10, 0x06, 0xfd, 0x05, 0x14, + 0x12, 0x09, 0x02, 0xfc, 0xf7, 0x01, 0x11, 0x15, 0x15, 0x0f, 0x0a, 0xff, + 0xf9, 0xf9, 0xf6, 0xee, 0xe6, 0xe3, 0xe6, 0xed, 0xf6, 0xfa, 0x01, 0x08, + 0x10, 0x16, 0x13, 0x11, 0x11, 0x0d, 0x04, 0xf8, 0xec, 0xe3, 0xeb, 0xf6, + 0xff, 0x03, 0x0a, 0x13, 0x19, 0x1d, 0x1c, 0x1d, 0x21, 0x21, 0x1d, 0x1a, + 0x14, 0x0d, 0x07, 0x04, 0x06, 0x09, 0x08, 0x00, 0xf1, 0xe7, 0xe8, 0xec, + 0xef, 0xf1, 0xf6, 0xf8, 0xf8, 0xfe, 0x06, 0x03, 0xfc, 0xfc, 0x01, 0x01, + 0xfd, 0xfe, 0x00, 0x01, 0x08, 0x08, 0x00, 0xfb, 0xfb, 0xff, 0x07, 0x0c, + 0x0c, 0x05, 0xfa, 0xf5, 0xfc, 0x00, 0xff, 0x03, 0x0a, 0x11, 0x16, 0x21, + 0x2b, 0x2d, 0x2c, 0x26, 0x1c, 0x11, 0x04, 0xfe, 0xfa, 0xfe, 0x02, 0xfe, + 0xf8, 0xea, 0xe3, 0xea, 0xf9, 0x01, 0xff, 0xfe, 0xf9, 0xfc, 0x02, 0x00, + 0xfb, 0xf2, 0xdf, 0xd6, 0xdd, 0xed, 0x00, 0x06, 0x0a, 0x0d, 0x13, 0x18, + 0x16, 0x19, 0x1e, 0x1d, 0x16, 0x10, 0x0d, 0x01, 0xf9, 0x05, 0x0e, 0x09, + 0x01, 0xfe, 0x00, 0x09, 0x16, 0x13, 0x09, 0x07, 0x09, 0x09, 0x09, 0x10, + 0x16, 0x08, 0x00, 0xff, 0x04, 0x00, 0xf7, 0xf1, 0xec, 0xef, 0xf2, 0xf0, + 0xec, 0xea, 0xea, 0xf5, 0xfe, 0x04, 0x00, 0xf6, 0xf8, 0x02, 0x0b, 0x09, + 0x04, 0x06, 0x0b, 0x18, 0x1f, 0x23, 0x26, 0x27, 0x24, 0x18, 0x11, 0x0b, + 0xfa, 0xe8, 0xe5, 0xea, 0xf0, 0xf4, 0xf6, 0xf4, 0xfd, 0x0e, 0x18, 0x18, + 0x16, 0x14, 0x11, 0x0f, 0x0f, 0x06, 0xfb, 0xf5, 0xf7, 0xf7, 0xf2, 0xf2, + 0xf6, 0xf8, 0x00, 0x06, 0x08, 0x07, 0x04, 0x05, 0x08, 0x0b, 0x10, 0x0d, + 0x01, 0xeb, 0xee, 0x03, 0x0d, 0x0d, 0x03, 0xfe, 0x00, 0x05, 0x06, 0x04, + 0x04, 0x04, 0x02, 0x02, 0xff, 0x02, 0x02, 0x05, 0x08, 0x05, 0x02, 0x01, + 0xff, 0x08, 0x15, 0x1a, 0x15, 0x0b, 0x02, 0xf9, 0xff, 0x0b, 0x13, 0x0b, + 0xfa, 0xf0, 0xfc, 0x07, 0x04, 0xfa, 0xf3, 0xf7, 0xff, 0x01, 0x04, 0x0d, + 0x17, 0x16, 0x12, 0x09, 0x04, 0xff, 0xf6, 0xf5, 0xf7, 0xfb, 0xfe, 0xfd, + 0xfb, 0xfe, 0x07, 0x0e, 0x11, 0x0e, 0x09, 0x09, 0x0a, 0x08, 0x03, 0xf2, + 0xde, 0xda, 0xe5, 0xec, 0xef, 0xf6, 0x04, 0x15, 0x20, 0x21, 0x25, 0x24, + 0x1f, 0x1d, 0x1d, 0x18, 0x16, 0x12, 0x0d, 0x09, 0x0a, 0x0a, 0x02, 0xf8, + 0xf1, 0xf6, 0xf7, 0xf7, 0xf0, 0xed, 0xef, 0xf5, 0xf7, 0xfd, 0x03, 0xf6, + 0xf1, 0xfa, 0x04, 0x09, 0x0b, 0x08, 0x02, 0x04, 0x08, 0x08, 0x07, 0x05, + 0xff, 0xfa, 0xfa, 0xfc, 0xfe, 0x00, 0xfe, 0xfe, 0xfe, 0x05, 0x04, 0x04, + 0x0f, 0x1c, 0x24, 0x23, 0x1e, 0x22, 0x2b, 0x29, 0x1f, 0x18, 0x0b, 0xf3, + 0xe6, 0xed, 0xf3, 0xf1, 0xed, 0xe7, 0xe8, 0xf3, 0xf8, 0xfa, 0x00, 0x00, + 0xfb, 0xfd, 0xfe, 0xfd, 0xfa, 0xfa, 0xf8, 0xf3, 0xf8, 0xfc, 0xfc, 0x00, + 0x10, 0x1b, 0x1b, 0x17, 0x1d, 0x1b, 0x12, 0x10, 0x11, 0x0f, 0xff, 0xed, + 0xeb, 0xfb, 0x03, 0x06, 0x05, 0x06, 0x0b, 0x11, 0x0f, 0x0d, 0x09, 0x05, + 0x04, 0x02, 0x00, 0x00, 0x04, 0x0b, 0x0c, 0x07, 0x01, 0xfd, 0xfe, 0xfc, + 0xfb, 0xfc, 0xf9, 0xfa, 0xf8, 0xf2, 0xf0, 0xf8, 0xfe, 0xfb, 0xf1, 0xe9, + 0xf3, 0x02, 0x0b, 0x0a, 0x07, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x18, 0x18, + 0x1d, 0x14, 0x07, 0x02, 0x06, 0xfc, 0xef, 0xf0, 0xf9, 0xfd, 0x00, 0x05, + 0x0f, 0x19, 0x17, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x08, 0xf7, 0xe6, 0xe3, + 0xe6, 0xea, 0xea, 0xe8, 0xec, 0xf5, 0xff, 0x08, 0x0a, 0x0e, 0x0f, 0x0a, + 0x08, 0x08, 0x0a, 0x11, 0x12, 0x0a, 0x09, 0x11, 0x12, 0x0e, 0x0d, 0x0c, + 0x09, 0x07, 0x02, 0xfc, 0xfa, 0xfc, 0xfa, 0xf8, 0xf1, 0xe5, 0xe0, 0xeb, + 0xfb, 0x03, 0x07, 0x15, 0x1b, 0x13, 0x13, 0x15, 0x13, 0x10, 0x0b, 0x03, + 0xfe, 0xff, 0xfe, 0x04, 0x08, 0x01, 0xfd, 0xfe, 0xff, 0xfb, 0xfe, 0x03, + 0x06, 0x06, 0x04, 0x06, 0x08, 0x0f, 0x15, 0x13, 0x03, 0xf9, 0xf3, 0xeb, + 0xf1, 0xfa, 0x03, 0x04, 0xfe, 0xfc, 0x06, 0x0b, 0x09, 0x06, 0x06, 0x03, + 0xfc, 0xf9, 0xf9, 0xfb, 0xf4, 0xef, 0xef, 0xfa, 0xff, 0x00, 0x0e, 0x1f, + 0x25, 0x25, 0x25, 0x29, 0x21, 0x17, 0x17, 0x0e, 0x00, 0xf9, 0xf6, 0xf3, + 0xfa, 0x01, 0xff, 0xfd, 0xfb, 0xfa, 0xf7, 0xf5, 0xf1, 0xee, 0xf0, 0xf3, + 0xf3, 0xf7, 0xfe, 0x06, 0x04, 0x04, 0x0c, 0x13, 0x13, 0x19, 0x17, 0x0e, + 0x08, 0x06, 0x06, 0x02, 0xfa, 0xf8, 0xf8, 0xec, 0xe1, 0xe5, 0xeb, 0xf4, + 0x00, 0x0d, 0x15, 0x17, 0x17, 0x1b, 0x1f, 0x1f, 0x1d, 0x19, 0x14, 0x12, + 0x12, 0x13, 0x19, 0x14, 0xfb, 0xeb, 0xeb, 0xec, 0xf0, 0xf6, 0xf8, 0xf8, + 0xfe, 0xff, 0xfa, 0xfc, 0x00, 0x05, 0xfe, 0xf2, 0xed, 0xeb, 0xe7, 0xf0, + 0xfe, 0x03, 0x01, 0xfe, 0x00, 0x06, 0x14, 0x1b, 0x1f, 0x19, 0x0a, 0x00, + 0x02, 0x0a, 0x10, 0x0a, 0x02, 0x03, 0x0e, 0x16, 0x18, 0x1f, 0x1f, 0x1b, + 0x13, 0x0a, 0x04, 0xfe, 0xfc, 0xfd, 0xf0, 0xe7, 0xe7, 0xe5, 0xe5, 0xed, + 0xff, 0x09, 0x0b, 0x05, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xf8, 0xf6, 0xf8, + 0xff, 0x09, 0x0c, 0x0a, 0x07, 0x08, 0x0a, 0x10, 0x14, 0x13, 0x11, 0x11, + 0x11, 0x0f, 0x0c, 0x08, 0x06, 0xfe, 0xf6, 0xf8, 0xf9, 0xec, 0xe5, 0xf7, + 0x09, 0x11, 0x0d, 0x0a, 0x0c, 0x12, 0x18, 0x14, 0x06, 0x01, 0xfe, 0xff, + 0x03, 0x09, 0x00, 0xec, 0xe7, 0xe9, 0xed, 0xf2, 0xf7, 0xfc, 0xfe, 0x01, + 0x0a, 0x15, 0x19, 0x12, 0x06, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0x04, 0x14, + 0x1b, 0x13, 0x06, 0x04, 0x01, 0x03, 0x00, 0xf9, 0xee, 0xe8, 0xe9, 0xec, + 0xfa, 0xff, 0xfa, 0xf8, 0x00, 0x0c, 0x1e, 0x31, 0x33, 0x26, 0x1a, 0x17, + 0x13, 0x0b, 0x04, 0xfd, 0xf2, 0xea, 0xec, 0xeb, 0xe7, 0xe9, 0xf7, 0x00, + 0x02, 0x04, 0x02, 0xfd, 0x00, 0x04, 0x08, 0x03, 0x01, 0x05, 0x02, 0x0c, + 0x1d, 0x1e, 0x0d, 0xff, 0xfb, 0xff, 0x03, 0x09, 0x06, 0x01, 0x01, 0x02, + 0x04, 0x00, 0xfc, 0xf3, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xf0, 0x02, 0x10, + 0x14, 0x11, 0x0d, 0x0e, 0x18, 0x1f, 0x1f, 0x1e, 0x15, 0x0b, 0x0c, 0x17, + 0x17, 0x09, 0x00, 0xfc, 0xf9, 0x00, 0x0d, 0x0b, 0x03, 0xfe, 0xfb, 0xf8, + 0xf7, 0xfc, 0xf4, 0xe5, 0xe5, 0xe9, 0xec, 0xee, 0xf1, 0xfb, 0x07, 0x0c, + 0x16, 0x18, 0x0e, 0x06, 0x06, 0x03, 0xfb, 0xf4, 0xee, 0xf0, 0xf7, 0x04, + 0x08, 0x02, 0x04, 0x0b, 0x17, 0x23, 0x2d, 0x30, 0x27, 0x1e, 0x1a, 0x17, + 0x14, 0x0c, 0x01, 0xf8, 0xf4, 0xf2, 0xfa, 0xf8, 0xec, 0xea, 0xf0, 0xf4, + 0xf4, 0xf2, 0xf0, 0xf6, 0xf9, 0xff, 0xfe, 0xfa, 0xfb, 0xff, 0x0b, 0x13, + 0x0e, 0x06, 0xfe, 0xfa, 0xfc, 0x03, 0x08, 0x04, 0x00, 0x00, 0x04, 0x0c, + 0x14, 0x0e, 0x00, 0xf9, 0xf7, 0xfa, 0xfe, 0x00, 0x09, 0x19, 0x20, 0x26, + 0x26, 0x1b, 0x14, 0x11, 0x0a, 0xfe, 0xf7, 0xf8, 0xf1, 0xf6, 0x00, 0x00, + 0xf6, 0xee, 0xec, 0xee, 0xf8, 0x08, 0x17, 0x10, 0x04, 0x02, 0x04, 0x04, + 0x00, 0xf6, 0xec, 0xe8, 0xea, 0xfa, 0xfd, 0xfc, 0x04, 0x0c, 0x11, 0x11, + 0x12, 0x0e, 0x08, 0x05, 0x00, 0xfb, 0xfc, 0xfe, 0x00, 0x08, 0x0f, 0x0f, + 0x0f, 0x0d, 0x0c, 0x0e, 0x14, 0x1c, 0x1c, 0x13, 0x10, 0x0e, 0x0a, 0x08, + 0x00, 0xf2, 0xeb, 0xeb, 0xef, 0xee, 0xef, 0xee, 0xec, 0xef, 0xf2, 0xf4, + 0xf4, 0xf4, 0xf8, 0xfe, 0x00, 0x08, 0x16, 0x10, 0x14, 0x20, 0x1e, 0x15, + 0x0e, 0x0a, 0x09, 0x0b, 0x15, 0x1e, 0x13, 0x03, 0x00, 0xfc, 0xf7, 0xf0, + 0xee, 0xe4, 0xdc, 0xe1, 0xe8, 0xf3, 0xfd, 0x04, 0x0a, 0x12, 0x1b, 0x28, + 0x28, 0x20, 0x16, 0x0a, 0x00, 0xff, 0xfb, 0xf7, 0xff, 0x01, 0x00, 0x00, + 0xfc, 0xf7, 0xf9, 0x03, 0x0d, 0x10, 0x0e, 0x0b, 0x08, 0x0a, 0x06, 0x00, + 0xfc, 0xf8, 0xf4, 0xf6, 0xff, 0x05, 0x01, 0xff, 0x01, 0x01, 0x00, 0x00, + 0xfc, 0xf8, 0xf3, 0xee, 0xf0, 0xf8, 0xf8, 0x00, 0x0c, 0x0c, 0x0a, 0x0c, + 0x14, 0x11, 0x0e, 0x16, 0x1b, 0x18, 0x12, 0x10, 0x10, 0x0c, 0x0a, 0x0c, + 0x08, 0x00, 0xfc, 0xfc, 0xfe, 0xfc, 0xf5, 0xf6, 0xfc, 0x00, 0x04, 0x09, + 0x01, 0xfa, 0xf8, 0xf4, 0xf6, 0xfa, 0xff, 0x00, 0x03, 0x02, 0x00, 0xfe, + 0xfe, 0xfc, 0xfe, 0x05, 0x12, 0x14, 0x0e, 0x08, 0x04, 0xf8, 0xf3, 0xf6, + 0xee, 0xe6, 0xec, 0xf6, 0x04, 0x0e, 0x10, 0x16, 0x1f, 0x24, 0x28, 0x28, + 0x22, 0x12, 0x06, 0x00, 0x00, 0x02, 0x06, 0x0a, 0x08, 0x00, 0xfe, 0xfc, + 0xf4, 0xf2, 0xf8, 0xfc, 0xfc, 0xfc, 0xff, 0x03, 0x00, 0xf6, 0xf8, 0xfa, + 0xee, 0xef, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xfe, 0xfa, + 0xf4, 0xf0, 0xf0, 0xfa, 0x07, 0x10, 0x1a, 0x24, 0x1f, 0x1c, 0x1e, 0x1c, + 0x19, 0x1b, 0x24, 0x26, 0x24, 0x22, 0x16, 0x07, 0xf9, 0xf3, 0xf6, 0xf2, + 0xe7, 0xde, 0xe6, 0xeb, 0xea, 0xe8, 0xea, 0xee, 0xf0, 0xfc, 0x04, 0x06, + 0x04, 0x00, 0x00, 0xff, 0x00, 0x02, 0x08, 0x0a, 0x04, 0x02, 0x08, 0x0c, + 0x06, 0x0a, 0x12, 0x13, 0x14, 0x18, 0x10, 0xfe, 0xf4, 0xf6, 0xfc, 0xf9, + 0xf7, 0xfe, 0x04, 0x09, 0x08, 0x08, 0x14, 0x17, 0x14, 0x0e, 0x0b, 0x06, + 0x00, 0xfe, 0xfe, 0xf8, 0xfe, 0x06, 0x04, 0x00, 0xfe, 0xfc, 0xfc, 0xfe, + 0xfa, 0xf8, 0xfc, 0xfe, 0x00, 0x02, 0x01, 0xfd, 0xfb, 0x03, 0x03, 0xfe, + 0x06, 0x0d, 0x0d, 0x05, 0x03, 0x07, 0x09, 0x07, 0x07, 0x05, 0x05, 0xfb, + 0xed, 0xe9, 0xeb, 0xf5, 0x05, 0x15, 0x11, 0x07, 0x09, 0x0d, 0x0f, 0x0d, + 0x0f, 0x16, 0x1a, 0x1e, 0x1c, 0x19, 0x10, 0x02, 0xfb, 0xfb, 0xf1, 0xe7, + 0xe9, 0xef, 0xef, 0xeb, 0xf6, 0xfe, 0xfd, 0xff, 0x05, 0x09, 0x11, 0x15, + 0x0b, 0x00, 0xfb, 0x02, 0x0b, 0x13, 0x11, 0x0b, 0x05, 0x03, 0xfb, 0xfb, + 0x05, 0x07, 0x01, 0xfb, 0xfc, 0xf8, 0xef, 0xed, 0xf3, 0xf5, 0xf9, 0xfb, + 0xff, 0x07, 0x08, 0x09, 0x17, 0x21, 0x1a, 0x11, 0x0d, 0x0b, 0x05, 0x01, + 0x00, 0x00, 0x05, 0x0f, 0x11, 0x15, 0x17, 0x0d, 0x07, 0x00, 0xf9, 0xfb, + 0x03, 0x07, 0x06, 0x0b, 0x0f, 0x00, 0xee, 0xef, 0xf2, 0xef, 0x00, 0x00, + 0xc8, 0xcb, 0x0f, 0x20, 0xc0, 0xff, 0x50, 0xd8, 0xbb, 0x2f, 0x40, 0xe0, + 0xdf, 0xf1, 0x0f, 0x04, 0xf7, 0x0a, 0x0b, 0x00, 0xa7, 0x37, 0x28, 0xfb, + 0x13, 0xf4, 0xc2, 0xff, 0x5a, 0x18, 0xe8, 0xf7, 0x55, 0x4e, 0x42, 0x20, + 0x07, 0x3f, 0x00, 0xe2, 0xd7, 0x3f, 0x10, 0xf9, 0x03, 0xf0, 0x0f, 0x00, + 0xdb, 0xff, 0xf0, 0xdf, 0xe8, 0xe6, 0xf0, 0xd7, 0xf2, 0xcc, 0xbd, 0xe2, + 0xc0, 0x89, 0x80, 0xab, 0xa8, 0x9a, 0x97, 0xea, 0xc0, 0xa0, 0xbf, 0x00, + 0xb0, 0xbf, 0x00, 0xca, 0xed, 0xed, 0xf3, 0xf8, 0xef, 0x13, 0x04, 0xe7, + 0x37, 0x02, 0x1f, 0x37, 0x2f, 0x4f, 0x42, 0x3f, 0x58, 0x2d, 0x71, 0x20, + 0x3f, 0x7b, 0x50, 0x3f, 0x50, 0x39, 0x30, 0x2d, 0x4e, 0x20, 0x16, 0x22, + 0x23, 0x14, 0xff, 0x1e, 0x08, 0xca, 0xff, 0x28, 0xe0, 0xe3, 0x1f, 0xc0, + 0xbf, 0x2e, 0xd8, 0xf7, 0xc0, 0xbf, 0x13, 0x08, 0xdb, 0xfe, 0xf1, 0xe8, + 0xdf, 0xe0, 0xe7, 0xd0, 0xcf, 0x0c, 0x0b, 0xf2, 0xe4, 0xbf, 0xe7, 0x10, + 0xc8, 0xc5, 0xe8, 0xe7, 0xcc, 0xc9, 0xb6, 0xcf, 0x03, 0xea, 0xfb, 0x06, + 0xe0, 0xd5, 0xff, 0x00, 0xf1, 0xfb, 0x23, 0x04, 0xdf, 0x2f, 0x1c, 0xf4, + 0x17, 0x38, 0x05, 0x13, 0x21, 0x2f, 0x00, 0x1f, 0x48, 0xf0, 0x37, 0x48, + 0xf2, 0x2f, 0x38, 0x1c, 0x1f, 0x27, 0x37, 0x40, 0xff, 0x52, 0x20, 0x27, + 0x55, 0x64, 0x52, 0x20, 0x3b, 0x55, 0x69, 0x68, 0x17, 0x6f, 0x50, 0x2b, + 0x5b, 0x40, 0x14, 0x12, 0x27, 0x30, 0x02, 0x34, 0xf4, 0x07, 0x16, 0x00, + 0xff, 0xfb, 0x1a, 0xf4, 0xcf, 0x0a, 0x00, 0xe2, 0xe0, 0xbf, 0x0b, 0x00, + 0xde, 0xd9, 0xe1, 0xd8, 0xb6, 0xcf, 0xd5, 0xde, 0xd0, 0xdb, 0xc0, 0xaf, + 0xc8, 0xbd, 0xe5, 0xcc, 0x80, 0xbf, 0xe0, 0xc8, 0xaf, 0xb6, 0xe5, 0xd0, + 0xaf, 0xf7, 0xe4, 0xc8, 0xef, 0xe8, 0xfa, 0xd0, 0x0f, 0xf8, 0xe0, 0xfb, + 0x10, 0xec, 0xfb, 0x11, 0xfd, 0x08, 0x0b, 0x0c, 0xff, 0x0a, 0x15, 0x12, + 0x07, 0x26, 0x09, 0x1a, 0x19, 0x3b, 0x34, 0x1a, 0x34, 0x03, 0x30, 0xf3, + 0x7b, 0x48, 0x00, 0x2f, 0x30, 0x27, 0x37, 0x34, 0x01, 0x2b, 0x50, 0x2c, + 0xf0, 0x37, 0x14, 0x09, 0x0d, 0x2f, 0x08, 0x0f, 0x14, 0xfc, 0x0f, 0x04, + 0xb9, 0xff, 0x20, 0xd4, 0x17, 0xf0, 0xd4, 0xd7, 0x12, 0xf0, 0xd8, 0xdf, + 0xf0, 0xa8, 0xdf, 0xf8, 0xd0, 0xc7, 0xfb, 0xe0, 0xbf, 0xd4, 0xcb, 0xd9, + 0x02, 0xe5, 0xd5, 0xe2, 0xca, 0xcf, 0xeb, 0x04, 0xef, 0xe8, 0xd0, 0xcf, + 0x0c, 0xe2, 0xe7, 0x0f, 0xd0, 0xef, 0xf0, 0xe4, 0xe7, 0x00, 0xbb, 0xff, + 0x08, 0xd5, 0x0d, 0x13, 0xf0, 0xdf, 0x1f, 0x1a, 0x00, 0xdf, 0xf4, 0xfb, + 0x2f, 0x08, 0xdd, 0x0f, 0x05, 0x00, 0xdf, 0x1e, 0xf0, 0x0d, 0x00, 0x02, + 0xfb, 0x2b, 0x00, 0x0b, 0xf6, 0x2d, 0x2c, 0x08, 0xfd, 0x09, 0x1c, 0x0d, + 0x1f, 0x34, 0x1a, 0xea, 0x27, 0x28, 0x00, 0xe5, 0x1f, 0x4c, 0x1c, 0x06, + 0x06, 0x07, 0x10, 0x1b, 0x06, 0xf9, 0x15, 0x02, 0x0c, 0x0f, 0x00, 0xff, + 0x00, 0xcb, 0xff, 0x1c, 0x0a, 0xf8, 0xef, 0x13, 0x14, 0xec, 0xcb, 0xff, + 0xeb, 0x1f, 0x08, 0xdb, 0xff, 0x08, 0xf0, 0xe3, 0x0b, 0xe0, 0xcf, 0x0f, + 0x20, 0xec, 0xcb, 0xfd, 0xfc, 0xf6, 0xff, 0xc8, 0xcf, 0x17, 0xf0, 0xc8, + 0xdf, 0x07, 0xe4, 0xcf, 0xf7, 0xfa, 0xe0, 0xe7, 0xe3, 0xeb, 0xea, 0xe1, + 0xfe, 0xe0, 0xc1, 0xd3, 0x0c, 0xd4, 0xbf, 0xe3, 0xe3, 0xfd, 0xf0, 0xc7, + 0xff, 0xdd, 0xfd, 0xd2, 0xea, 0xc7, 0x17, 0xf4, 0xe1, 0xd3, 0x07, 0x00, + 0xda, 0xff, 0x12, 0xd8, 0xe3, 0xf7, 0x00, 0xef, 0x1c, 0x0c, 0xe0, 0xef, + 0x18, 0x00, 0xf7, 0x17, 0x02, 0xfe, 0x0a, 0xfa, 0x17, 0x14, 0x07, 0x13, + 0x17, 0x10, 0x0f, 0x14, 0x1f, 0x30, 0x16, 0x05, 0x25, 0x2e, 0x25, 0xf8, + 0x1f, 0x28, 0x10, 0x03, 0x2b, 0x2e, 0x18, 0x04, 0x07, 0x19, 0x1d, 0x37, + 0xf0, 0xe7, 0x3f, 0x20, 0xed, 0x12, 0x26, 0xf0, 0xdb, 0x15, 0xf8, 0xfb, + 0x0a, 0xf9, 0x00, 0xf3, 0xe0, 0xff, 0x09, 0xf0, 0xf5, 0xfb, 0xf4, 0xea, + 0xe3, 0x0d, 0x04, 0xee, 0x09, 0xcc, 0xf7, 0x1a, 0xf0, 0xe7, 0xef, 0xfe, + 0xfc, 0xf7, 0x0a, 0xd3, 0xef, 0x06, 0xf4, 0xf0, 0xd5, 0xfb, 0x00, 0xe6, + 0xff, 0xe4, 0xef, 0xf3, 0x00, 0xff, 0xf0, 0xff, 0x02, 0x0a, 0xd4, 0xef, + 0xff, 0x10, 0xdb, 0x13, 0xea, 0xfc, 0xe7, 0xf4, 0x07, 0x00, 0xfc, 0xe8, + 0xef, 0x13, 0x14, 0xe6, 0xf7, 0x27, 0x00, 0xdb, 0x15, 0x10, 0xea, 0x1f, + 0x18, 0xf2, 0xfb, 0x0f, 0x28, 0xf4, 0x0b, 0x22, 0xf8, 0xff, 0x00, 0xfe, + 0x07, 0x18, 0xf2, 0xf7, 0x1b, 0x0d, 0x1b, 0x00, 0xff, 0x2c, 0x06, 0xf2, + 0x0f, 0x22, 0x20, 0xf0, 0x0f, 0x30, 0x08, 0xea, 0x07, 0x1f, 0x22, 0x0c, + 0xe7, 0x17, 0x31, 0xf4, 0x0f, 0x30, 0x04, 0xfe, 0x2d, 0x10, 0xec, 0x13, + 0x14, 0x09, 0x22, 0x08, 0x17, 0x06, 0x03, 0x15, 0x00, 0xf2, 0x1b, 0x10, + 0x11, 0x07, 0x18, 0x02, 0x10, 0x07, 0x19, 0x12, 0xe3, 0x0a, 0x1f, 0x00, + 0xf7, 0x1f, 0x18, 0xfe, 0xfa, 0x13, 0x0c, 0x03, 0x16, 0x06, 0x04, 0x07, + 0x0a, 0x16, 0xe8, 0xff, 0x00, 0xe9, 0xff, 0x00, 0x0b, 0x0e, 0xf0, 0xff, + 0x08, 0xf8, 0xe0, 0xef, 0x0a, 0xfc, 0x06, 0xe9, 0x0b, 0xfa, 0xf0, 0xef, + 0xfe, 0xf8, 0xec, 0xdf, 0xf9, 0xfd, 0xfc, 0xfa, 0xf1, 0xf1, 0xf5, 0xf9, + 0xe0, 0xfb, 0x06, 0xfb, 0xe9, 0xfe, 0xff, 0x00, 0xf5, 0xff, 0x00, 0xf8, + 0xf5, 0x00, 0xe3, 0x0b, 0x18, 0x10, 0x00, 0x07, 0x04, 0x17, 0x00, 0xfb, + 0x09, 0xff, 0x20, 0xf0, 0x17, 0x18, 0xff, 0x1f, 0x20, 0xef, 0x13, 0xfa, + 0x0f, 0x10, 0x1b, 0x32, 0xfd, 0x1f, 0x22, 0x03, 0x09, 0x1b, 0x18, 0x19, + 0x1d, 0x25, 0x0c, 0x01, 0x1f, 0x28, 0x18, 0x05, 0x1e, 0x12, 0x00, 0x0c, + 0x0b, 0x1b, 0x12, 0x10, 0xf7, 0x2a, 0x12, 0xf5, 0x0d, 0x18, 0xec, 0xf7, + 0x0a, 0xff, 0x0e, 0x0c, 0xfd, 0xfe, 0xf0, 0xfb, 0x0a, 0xf1, 0xf7, 0x10, + 0xf0, 0xe7, 0x06, 0xfe, 0xf0, 0xee, 0xff, 0x03, 0xf2, 0xef, 0xff, 0xf0, + 0xdf, 0xff, 0x00, 0xee, 0xef, 0xe0, 0xe7, 0xef, 0xf3, 0xf9, 0xe4, 0xee, + 0xf3, 0xf8, 0xe6, 0xf0, 0xe5, 0xe4, 0xd3, 0xe5, 0x03, 0xfd, 0xec, 0xd7, + 0xef, 0xf8, 0xe9, 0xe6, 0xe9, 0xe6, 0xf3, 0x05, 0xfc, 0xea, 0xf1, 0xf3, + 0xf8, 0xfd, 0xf0, 0xeb, 0xf2, 0x12, 0x00, 0xee, 0xff, 0x08, 0x01, 0xf8, + 0xfb, 0x11, 0x09, 0x04, 0xef, 0x0f, 0x00, 0x03, 0x00, 0x12, 0x0a, 0x08, + 0x0a, 0xf9, 0xfb, 0xff, 0x01, 0x09, 0x12, 0x0e, 0x09, 0x14, 0x07, 0xfc, + 0x07, 0xfa, 0x05, 0x0e, 0x0d, 0xf9, 0x0d, 0x0c, 0xe7, 0xfb, 0x10, 0x02, + 0x03, 0x02, 0xf8, 0x0c, 0xf6, 0xfd, 0xfc, 0x00, 0xf5, 0x03, 0x10, 0xf6, + 0xdf, 0xff, 0x16, 0xf8, 0xef, 0x0b, 0xf8, 0xe2, 0xff, 0xf4, 0xf3, 0xf1, + 0xf5, 0xe6, 0xf3, 0x05, 0xf8, 0xf5, 0xe8, 0xf1, 0xf7, 0xf8, 0xe0, 0xe7, + 0xf8, 0xe7, 0xf3, 0xea, 0xeb, 0x00, 0xf2, 0xdc, 0xdf, 0xf5, 0xe9, 0xf0, + 0xe9, 0xf6, 0x02, 0xe0, 0xef, 0x0a, 0xe5, 0xf8, 0xe3, 0xf5, 0x00, 0xf8, + 0xf0, 0xe0, 0xef, 0x03, 0xec, 0xe5, 0xf3, 0xfe, 0xfc, 0xed, 0x01, 0xf4, + 0xe8, 0xf3, 0x01, 0xfc, 0x04, 0xe1, 0xfd, 0xfa, 0xf2, 0xe7, 0xf5, 0x07, + 0x08, 0xf8, 0xe8, 0xf6, 0xfb, 0x05, 0x01, 0x09, 0xf8, 0xf3, 0xfd, 0x00, + 0xed, 0xfb, 0x06, 0xf4, 0xf8, 0x02, 0xf8, 0xe8, 0xed, 0x0e, 0xfa, 0xf7, + 0x05, 0x07, 0xf0, 0xf3, 0x06, 0xf9, 0xf7, 0x01, 0xfc, 0xfc, 0xfc, 0xfc, + 0x02, 0xf2, 0xf5, 0xfd, 0x02, 0x0f, 0x04, 0xfb, 0xff, 0x0c, 0x02, 0x02, + 0x00, 0xf7, 0x0f, 0x08, 0x07, 0x03, 0x05, 0x0d, 0x00, 0xff, 0x13, 0x00, + 0x0f, 0x04, 0xfb, 0x08, 0xfe, 0x0a, 0x09, 0xfc, 0xfa, 0x03, 0x08, 0xff, + 0x09, 0x03, 0xf0, 0x03, 0x04, 0xfb, 0xf9, 0xee, 0x07, 0x09, 0xf8, 0xfa, + 0xf2, 0xf3, 0xec, 0xee, 0xf7, 0xff, 0x0c, 0xf4, 0xf2, 0xf7, 0x0c, 0xf2, + 0xf2, 0xf2, 0xf4, 0x02, 0x01, 0xf9, 0xf2, 0xf7, 0xf7, 0xf5, 0xf0, 0xfd, + 0x00, 0xf0, 0xf3, 0xf7, 0xf8, 0xf0, 0x03, 0xf4, 0xf9, 0x03, 0xf1, 0xff, + 0xf2, 0xde, 0xff, 0x04, 0xf5, 0xe8, 0xfd, 0x04, 0xfb, 0xfa, 0x03, 0xfb, + 0xf0, 0xf5, 0xfe, 0xfa, 0x05, 0xf8, 0xff, 0x12, 0x00, 0xf3, 0x05, 0x00, + 0xf7, 0x0a, 0x0a, 0xf8, 0x03, 0xfe, 0x0e, 0x0c, 0x02, 0xf6, 0x07, 0x10, + 0xf8, 0x0b, 0x06, 0xf8, 0xf7, 0x03, 0x0a, 0x09, 0x0b, 0x0b, 0x04, 0x02, + 0xf9, 0xf7, 0x0d, 0x06, 0x03, 0x00, 0xff, 0x06, 0x0f, 0x08, 0x07, 0x00, + 0xf9, 0x0b, 0x13, 0x00, 0x03, 0x0a, 0x00, 0x02, 0x05, 0x05, 0x0d, 0x0f, + 0x0f, 0x0c, 0x07, 0x00, 0x02, 0x03, 0x11, 0x16, 0x0c, 0xf6, 0x07, 0x18, + 0x06, 0x04, 0x08, 0x05, 0x15, 0x0e, 0x06, 0xf7, 0x0e, 0x06, 0x02, 0x03, + 0x07, 0x0a, 0x05, 0x00, 0x07, 0x00, 0x02, 0xfa, 0x06, 0x0e, 0x10, 0xfd, + 0xfd, 0x00, 0xf5, 0x03, 0xfa, 0xfc, 0x04, 0x03, 0xfb, 0x00, 0xfc, 0xfc, + 0x03, 0x04, 0x05, 0x01, 0xf6, 0xff, 0x02, 0xf8, 0xf1, 0xfb, 0x15, 0x0e, + 0xf8, 0xf9, 0x10, 0x02, 0xff, 0x06, 0xf0, 0xfd, 0x12, 0xfa, 0x07, 0xfc, + 0xfb, 0x11, 0x14, 0x00, 0xf9, 0x0d, 0x0b, 0x06, 0x00, 0xf5, 0x01, 0x0a, + 0x08, 0x07, 0x08, 0xfb, 0x0b, 0x0b, 0xf9, 0xff, 0x10, 0x0c, 0x14, 0x05, + 0xf7, 0xff, 0x12, 0x0c, 0x09, 0x12, 0x0c, 0xfc, 0x03, 0x00, 0x0f, 0x14, + 0x16, 0x12, 0xf8, 0xfd, 0x13, 0x1c, 0x0c, 0x11, 0x00, 0x02, 0x12, 0x0d, + 0x0f, 0x18, 0x03, 0x09, 0x12, 0x14, 0x08, 0xff, 0x02, 0x0f, 0x11, 0x07, + 0x05, 0x05, 0xfd, 0x17, 0x0c, 0x00, 0x03, 0x0e, 0x00, 0x07, 0x10, 0x07, + 0x00, 0x03, 0x09, 0x05, 0xf0, 0xf5, 0x0f, 0x18, 0x04, 0x04, 0xff, 0x02, + 0x06, 0x00, 0x01, 0x01, 0x03, 0xfc, 0xff, 0x03, 0x03, 0xf6, 0xf9, 0x01, + 0x0a, 0x04, 0x04, 0xf8, 0xfb, 0xfd, 0xf9, 0xfe, 0x00, 0x07, 0x00, 0xfa, + 0x05, 0x09, 0xf8, 0xfb, 0xfa, 0xf7, 0xf9, 0x04, 0x02, 0x02, 0xf7, 0x09, + 0x06, 0xf0, 0xea, 0xff, 0x00, 0xff, 0x10, 0x00, 0xec, 0xf3, 0xfe, 0x07, + 0x03, 0xf6, 0xff, 0xfe, 0xf4, 0xf8, 0xf7, 0x07, 0x05, 0xfc, 0xf2, 0x0b, + 0x0a, 0xf0, 0xf7, 0x09, 0x01, 0x01, 0xf5, 0xff, 0x05, 0x00, 0xf7, 0xfb, + 0xf8, 0x02, 0x00, 0xf4, 0x06, 0x09, 0xfd, 0x02, 0x00, 0x00, 0xf8, 0xfa, + 0xfe, 0xfc, 0xfd, 0x00, 0x01, 0x03, 0x04, 0x08, 0xf6, 0xf5, 0x0e, 0x00, + 0xf6, 0x09, 0x08, 0xf3, 0xff, 0x07, 0x09, 0x06, 0xfd, 0x07, 0x07, 0x05, + 0xff, 0xfd, 0x09, 0x0c, 0x0a, 0x07, 0x0a, 0x02, 0xfa, 0xff, 0x02, 0x0d, + 0x10, 0x08, 0xfb, 0xfd, 0x04, 0x07, 0x08, 0xfa, 0xfe, 0x05, 0xfc, 0xf9, + 0xfb, 0x03, 0x04, 0xf7, 0xf6, 0xf2, 0xf7, 0x04, 0x04, 0xfa, 0xf2, 0xf5, + 0xff, 0xfa, 0xea, 0xef, 0xfc, 0xf4, 0xee, 0x02, 0xf4, 0xef, 0xf1, 0xee, + 0xf9, 0xfe, 0xf7, 0xf1, 0xed, 0xf7, 0xfd, 0xfb, 0xf8, 0xf6, 0xf6, 0xef, + 0xf0, 0xf7, 0x05, 0xfd, 0xf6, 0xef, 0xf7, 0xf7, 0xfa, 0xed, 0xf5, 0xfe, + 0x00, 0xf5, 0xf6, 0xf4, 0xf5, 0xfc, 0xf9, 0xfa, 0xee, 0xf8, 0xf2, 0xf5, + 0xfb, 0x02, 0x04, 0xf4, 0xfb, 0xf0, 0xed, 0xfb, 0x03, 0x02, 0xfc, 0xf0, + 0xfb, 0x07, 0x00, 0xf0, 0xf7, 0x03, 0x02, 0x02, 0x00, 0xff, 0xfe, 0xf8, + 0xfa, 0x03, 0xfe, 0x05, 0x08, 0xfc, 0x05, 0x00, 0xf7, 0xf5, 0xf9, 0x08, + 0x00, 0x00, 0x02, 0x04, 0xf8, 0xf3, 0xf5, 0x09, 0x0a, 0x00, 0xfa, 0xfb, + 0xf8, 0xef, 0xf8, 0xff, 0x02, 0xfd, 0xfd, 0xfc, 0xed, 0xef, 0x01, 0x01, + 0x00, 0xec, 0xeb, 0x07, 0x0c, 0xf2, 0xff, 0x00, 0xf7, 0xfd, 0xfc, 0xf4, + 0xfe, 0x0a, 0xf4, 0xe6, 0x07, 0x0a, 0xf0, 0xf7, 0x04, 0x04, 0x04, 0xf8, + 0xff, 0x00, 0xf9, 0xf3, 0xfa, 0x03, 0x00, 0x03, 0x00, 0xf4, 0xee, 0xf2, + 0x0f, 0x08, 0xf8, 0xea, 0xef, 0x07, 0x04, 0xfd, 0xf6, 0xe6, 0xfd, 0x08, + 0xf1, 0xf5, 0x03, 0xfa, 0xf2, 0xfa, 0xf2, 0xff, 0xfc, 0xfa, 0xf8, 0xf1, + 0xfe, 0xf8, 0xf7, 0x08, 0xf4, 0xf5, 0xfb, 0xf9, 0xf2, 0xfa, 0xf5, 0xf9, + 0xf7, 0xf0, 0xff, 0x09, 0xf4, 0xf1, 0xfe, 0xf8, 0xef, 0x03, 0x00, 0xf8, + 0xff, 0x00, 0xf8, 0xf0, 0xfd, 0x0a, 0xfe, 0xfd, 0xf6, 0xf4, 0x07, 0x02, + 0xf5, 0xfb, 0xfc, 0x06, 0x03, 0xfe, 0x07, 0x0a, 0x00, 0xf2, 0x05, 0x06, + 0xff, 0x0b, 0x0a, 0xfc, 0xff, 0x0d, 0x09, 0x05, 0xfe, 0x0d, 0xf9, 0x06, + 0x04, 0xfe, 0x0d, 0x0c, 0x00, 0xf6, 0x03, 0x06, 0x07, 0x04, 0x05, 0x0d, + 0x08, 0xfa, 0xff, 0xf9, 0xfb, 0x0b, 0x04, 0xff, 0x02, 0x06, 0xfd, 0xff, + 0xfa, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x06, 0x01, 0xfa, 0xf6, 0x0a, 0x00, + 0xf9, 0xff, 0xfe, 0xf2, 0xff, 0x0e, 0xf8, 0xf9, 0xf6, 0xf9, 0x05, 0x01, + 0xf1, 0xf6, 0xff, 0x02, 0xfc, 0xf2, 0xfd, 0xf4, 0xec, 0xfb, 0x09, 0xf6, + 0xf4, 0xfb, 0xfc, 0x00, 0xf4, 0xf5, 0x08, 0xf6, 0xf3, 0x03, 0x02, 0xf6, + 0xf0, 0xf3, 0xfe, 0x08, 0xfb, 0xf8, 0xef, 0xfd, 0x04, 0xf1, 0xff, 0x0b, + 0x00, 0xf2, 0xff, 0x02, 0x05, 0x06, 0x00, 0xf2, 0x07, 0x0e, 0xf8, 0x0b, + 0x0c, 0xf6, 0x05, 0x10, 0x08, 0xfc, 0xf5, 0x0d, 0x12, 0x04, 0xf9, 0x0b, + 0x12, 0x02, 0x08, 0x02, 0x07, 0x11, 0x04, 0x0d, 0x0a, 0x02, 0xfe, 0xfd, + 0xfe, 0x0b, 0x08, 0x03, 0x0f, 0x09, 0xfa, 0xf3, 0x07, 0x03, 0x02, 0x02, + 0xff, 0x09, 0x0a, 0x05, 0x03, 0xff, 0xfd, 0xfc, 0x02, 0xfd, 0x01, 0x08, + 0x00, 0xfa, 0x01, 0x04, 0x00, 0xf7, 0x0c, 0x08, 0xfd, 0x0c, 0x04, 0x01, + 0xf1, 0x07, 0x0a, 0xfc, 0x06, 0x03, 0x07, 0x05, 0x00, 0xf8, 0xfb, 0x04, + 0x00, 0x02, 0xfe, 0x00, 0x05, 0xfc, 0xfa, 0x02, 0x04, 0xf9, 0xff, 0x0a, + 0x02, 0xf0, 0xfc, 0x03, 0x07, 0xfc, 0xfc, 0xf3, 0xff, 0x09, 0xff, 0x05, + 0xf8, 0xfb, 0x09, 0x04, 0xf4, 0xed, 0xff, 0x0b, 0x08, 0x00, 0xf3, 0x05, + 0x08, 0xff, 0x00, 0xee, 0xfa, 0x0e, 0x02, 0xfa, 0x07, 0x06, 0xf4, 0xf5, + 0xf8, 0xff, 0x0b, 0x0a, 0xf4, 0xfd, 0x0b, 0x05, 0xf7, 0x02, 0xfc, 0xfa, + 0xf9, 0xfa, 0x09, 0x0b, 0x09, 0xf8, 0xef, 0x0d, 0x08, 0xf1, 0x0b, 0x10, + 0xfc, 0xf5, 0x07, 0x0e, 0xfa, 0xfb, 0x0e, 0x00, 0x02, 0x04, 0x07, 0x06, + 0x00, 0xff, 0x13, 0x00, 0xf9, 0x05, 0x06, 0x05, 0x05, 0x05, 0x02, 0x00, + 0x03, 0x09, 0x00, 0xf1, 0x05, 0x06, 0x06, 0x0d, 0xfa, 0xfb, 0x02, 0xfd, + 0xf4, 0xff, 0x0a, 0x00, 0xf8, 0xf8, 0xf8, 0xfd, 0x0a, 0xf9, 0xf1, 0xfc, + 0xfa, 0xf9, 0xfe, 0xf9, 0xfa, 0xfc, 0xfb, 0xf6, 0xef, 0xff, 0x00, 0xfd, + 0xf9, 0xfa, 0xfe, 0xf7, 0xf1, 0xf5, 0xf9, 0xfb, 0xff, 0xf8, 0xfa, 0x03, + 0x00, 0xed, 0xf7, 0xf5, 0xff, 0x04, 0xf4, 0xff, 0xff, 0xfb, 0xf5, 0xf9, + 0xf0, 0xf7, 0xfb, 0xf9, 0x0b, 0x04, 0xf3, 0xfa, 0xfc, 0xfb, 0xf0, 0xfd, + 0x0c, 0x01, 0xfa, 0xf0, 0xff, 0x04, 0xfd, 0xfa, 0xf8, 0xfb, 0xfe, 0x0a, + 0x0a, 0x04, 0xf4, 0xfa, 0xff, 0xff, 0x03, 0x02, 0xf7, 0x0d, 0x0c, 0xec, + 0xfd, 0x18, 0xf8, 0xf5, 0x11, 0x06, 0xf4, 0x03, 0x04, 0x02, 0x0a, 0x02, + 0xfd, 0xfd, 0xf6, 0xf7, 0x01, 0x09, 0x0a, 0x05, 0xfa, 0xf6, 0x05, 0x02, + 0x06, 0xf6, 0xfd, 0x04, 0x00, 0xf6, 0x02, 0x04, 0x01, 0xfe, 0xff, 0xfb, + 0xf9, 0xf9, 0xf8, 0xfa, 0xff, 0x06, 0xfe, 0xff, 0x01, 0xfc, 0xf8, 0xf5, + 0xfe, 0x00, 0x06, 0x00, 0xf3, 0xff, 0x01, 0xf5, 0x07, 0x04, 0xf4, 0xff, + 0x00, 0x00, 0xfb, 0xfd, 0x00, 0xff, 0xf2, 0xf9, 0x0c, 0x05, 0x03, 0x08, + 0xf6, 0xfd, 0x02, 0xfc, 0xfe, 0x06, 0x00, 0xf1, 0x09, 0x0c, 0xfc, 0xfa, + 0xf9, 0x03, 0x03, 0x01, 0xf8, 0xf5, 0x0a, 0x0b, 0xf6, 0xf5, 0x06, 0x05, + 0xf3, 0xff, 0x09, 0xfa, 0xff, 0x01, 0xfb, 0x09, 0x08, 0xfe, 0xfa, 0xf5, + 0xff, 0x04, 0xfe, 0xff, 0x06, 0xfa, 0xf9, 0x05, 0x02, 0xfe, 0xf8, 0xfa, + 0x07, 0x06, 0xfa, 0xf4, 0xfd, 0x03, 0xff, 0xf4, 0xf9, 0x0a, 0x04, 0xee, + 0xfd, 0x06, 0x00, 0xfa, 0xfa, 0xed, 0xff, 0x10, 0x04, 0xf4, 0xed, 0xff, + 0x0b, 0x02, 0xf8, 0xf7, 0x01, 0x06, 0x00, 0xfb, 0x09, 0x05, 0x02, 0x05, + 0xfa, 0x00, 0xfe, 0x06, 0x05, 0x0b, 0x08, 0x00, 0xf9, 0x0a, 0x0e, 0x00, + 0x02, 0x0c, 0x00, 0xf7, 0x13, 0x0a, 0x04, 0x06, 0x05, 0xfb, 0xff, 0x06, + 0x10, 0x04, 0xf8, 0xf4, 0xff, 0x0e, 0x04, 0x00, 0xfd, 0xf7, 0x07, 0x06, + 0xf6, 0xfa, 0x0b, 0xfc, 0xff, 0x05, 0xf6, 0xf9, 0x05, 0x05, 0x02, 0xf3, + 0xff, 0x02, 0xf3, 0x07, 0x04, 0xfb, 0xfd, 0x05, 0xfd, 0xf6, 0xf4, 0xfa, + 0xff, 0x08, 0xfc, 0xfb, 0x06, 0x05, 0xf8, 0xff, 0xf8, 0xf2, 0xff, 0x04, + 0xfe, 0x03, 0x03, 0x00, 0xf7, 0xfe, 0xfa, 0xf9, 0x05, 0x04, 0xf7, 0x05, + 0x05, 0xf6, 0xfa, 0x0b, 0x10, 0xfc, 0xff, 0x04, 0x02, 0x06, 0xfa, 0xfb, + 0x0b, 0x02, 0x00, 0xf5, 0x03, 0x10, 0x08, 0x05, 0xfc, 0xff, 0x12, 0x04, + 0x00, 0xf6, 0x05, 0x14, 0x08, 0x06, 0x04, 0xfb, 0x02, 0x03, 0x00, 0xfe, + 0x17, 0x10, 0xfc, 0x09, 0x04, 0xff, 0x03, 0x01, 0xf9, 0xff, 0x03, 0x01, + 0x07, 0x04, 0x07, 0x08, 0xf9, 0xf5, 0xfb, 0x04, 0x00, 0x09, 0x05, 0xf0, + 0x0f, 0x10, 0xf8, 0xf8, 0xf6, 0xff, 0x02, 0x01, 0x00, 0xfb, 0x05, 0x06, + 0xf6, 0xf1, 0xfc, 0xff, 0x07, 0x06, 0xff, 0xfb, 0xfc, 0xfd, 0x02, 0xf8, + 0xf5, 0x06, 0x04, 0xf1, 0xff, 0x0a, 0xf2, 0xee, 0x0b, 0x08, 0xfd, 0xfe, + 0xf6, 0x05, 0x07, 0xfa, 0xfd, 0xfe, 0xf7, 0xff, 0xf4, 0xf5, 0x03, 0x0b, + 0x00, 0xf3, 0x0e, 0x08, 0xf9, 0x01, 0xfe, 0x06, 0xfa, 0xf5, 0xfe, 0x02, + 0x00, 0xf7, 0xff, 0x03, 0x0b, 0x03, 0x02, 0x01, 0x02, 0xfc, 0xf9, 0x09, + 0x05, 0xf8, 0xfe, 0x04, 0xfd, 0xfe, 0xff, 0x07, 0x0e, 0xf8, 0xfb, 0x0c, + 0x03, 0x01, 0xf5, 0xff, 0x0a, 0xf8, 0xf7, 0x04, 0x00, 0xfb, 0x05, 0x01, + 0xf9, 0xfb, 0xfe, 0xf9, 0xfc, 0xfe, 0x04, 0x00, 0xf5, 0xfb, 0x00, 0xfb, + 0x07, 0x00, 0xf0, 0xed, 0x09, 0x02, 0xfb, 0x0d, 0x00, 0xf7, 0x04, 0xfc, + 0xf6, 0xf5, 0x02, 0x00, 0xfe, 0xfd, 0xf9, 0xf5, 0x05, 0x07, 0xf8, 0xf7, + 0x04, 0x02, 0x02, 0xfc, 0xf7, 0x00, 0x01, 0xfc, 0xf5, 0xfd, 0x06, 0x00, + 0xf6, 0xf7, 0x0a, 0x05, 0xf8, 0xfd, 0x0a, 0x06, 0xfd, 0x06, 0x08, 0xf4, + 0xfc, 0x01, 0x0a, 0x00, 0xf7, 0x06, 0x00, 0xfa, 0xfc, 0x00, 0xfc, 0xfe, + 0x05, 0xfe, 0x02, 0x00, 0xff, 0x0a, 0xf5, 0xff, 0x01, 0xf8, 0xf8, 0xf8, + 0x02, 0xff, 0x05, 0xfd, 0x01, 0xf3, 0x05, 0x00, 0xf6, 0xff, 0x00, 0x05, + 0x02, 0xfd, 0x00, 0xf3, 0xfb, 0x09, 0x02, 0xf2, 0xef, 0x05, 0x00, 0xfb, + 0x02, 0xfb, 0xfc, 0xfd, 0xf5, 0xf3, 0xfd, 0x02, 0x02, 0x00, 0xf0, 0xeb, + 0x0e, 0x04, 0xf6, 0xfe, 0xf4, 0xf5, 0x00, 0xf8, 0xfb, 0x05, 0x00, 0xea, + 0xf7, 0xff, 0xfc, 0xf0, 0xef, 0x09, 0x0a, 0xf0, 0xf7, 0x05, 0xfa, 0xfd, + 0x00, 0xf3, 0xfa, 0xf5, 0xfa, 0xfe, 0xfc, 0x04, 0x08, 0xfa, 0xfb, 0x03, + 0xfa, 0xfa, 0xf5, 0x05, 0x02, 0xff, 0xf4, 0xff, 0x08, 0xff, 0x01, 0x03, + 0xf9, 0xfc, 0xfe, 0xfe, 0x06, 0xfa, 0xf3, 0xf9, 0x08, 0x04, 0xfe, 0xfb, + 0xfc, 0xf7, 0x05, 0xfc, 0xf2, 0x03, 0x00, 0xfe, 0xfe, 0xf4, 0xf0, 0xf9, + 0x04, 0xee, 0xff, 0x12, 0xf8, 0xe7, 0x0a, 0x02, 0xf2, 0x07, 0x06, 0xf2, + 0xf7, 0x04, 0x04, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xf8, 0xef, 0xff, 0x05, + 0x01, 0x0b, 0x04, 0xfc, 0xf0, 0xef, 0xff, 0x0b, 0x06, 0xfc, 0xf5, 0x03, + 0x06, 0x00, 0xf1, 0xfe, 0x06, 0x01, 0xfc, 0xf7, 0xff, 0xff, 0x00, 0x03, + 0x04, 0xf8, 0xf6, 0xff, 0x00, 0xfa, 0xfd, 0xfa, 0x06, 0x00, 0xff, 0x03, + 0x00, 0xf5, 0x06, 0x00, 0xfb, 0x04, 0xf8, 0xff, 0x01, 0xfd, 0x04, 0xf6, + 0xff, 0x06, 0xfd, 0x01, 0xfb, 0xf7, 0xfb, 0x00, 0xf8, 0xf2, 0xff, 0x0a, + 0x02, 0xf3, 0xf5, 0x0d, 0x0b, 0xf9, 0xff, 0x03, 0xfd, 0xff, 0x06, 0x02, + 0xf6, 0xff, 0x04, 0xf8, 0x0e, 0x08, 0xfc, 0xfa, 0x06, 0xfe, 0x05, 0x06, + 0x00, 0xf9, 0xfa, 0x02, 0x06, 0xfe, 0x02, 0x0b, 0x00, 0xee, 0x0e, 0x0f, + 0xfd, 0xfd, 0xf8, 0x05, 0x05, 0xf8, 0x0c, 0x00, 0xf6, 0x00, 0x0d, 0x01, + 0x00, 0x02, 0x00, 0xfe, 0xf7, 0xfe, 0x09, 0x00, 0xfb, 0x0a, 0x09, 0xf3, + 0xf4, 0x0c, 0x0b, 0xfc, 0x04, 0x00, 0xfb, 0xfd, 0x01, 0x01, 0xfa, 0xfc, + 0x03, 0x05, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, 0xfd, + 0x03, 0xfd, 0xfa, 0xfb, 0xf8, 0xfc, 0x05, 0x05, 0xfd, 0xf9, 0x05, 0x00, + 0xf9, 0xff, 0xfb, 0x00, 0x05, 0xfd, 0xf7, 0x01, 0x00, 0x00, 0xfd, 0xfc, + 0x01, 0x00, 0xfa, 0xfb, 0x00, 0xfc, 0x04, 0x04, 0x05, 0x03, 0xfd, 0xf8, + 0x00, 0x05, 0xfd, 0x00, 0x03, 0x01, 0x02, 0xfe, 0xfe, 0x00, 0xf6, 0xfd, + 0x07, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0xfe, 0x00, 0x02, 0x00, 0xfe, + 0x02, 0xfe, 0x00, 0x0d, 0x04, 0x00, 0xf9, 0xfb, 0x01, 0x08, 0x07, 0x04, + 0x00, 0xf7, 0xfd, 0x04, 0x04, 0x00, 0x02, 0xfa, 0x00, 0x06, 0x02, 0xfe, + 0xfa, 0x03, 0x05, 0xfe, 0xfc, 0x05, 0x00, 0xfb, 0x03, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x01, 0xfd, 0x00, 0x05, 0x00, 0xff, 0x01, 0x03, 0x05, 0x00, + 0x00, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0xfe, + 0x02, 0x07, 0x00, 0xf9, 0xfe, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x06, 0x05, 0xfe, 0xfd, 0xfe, 0x01, 0x02, 0x01, 0x02, 0x02, + 0xfb, 0xfa, 0xfe, 0x01, 0x01, 0x04, 0xfd, 0xfe, 0x03, 0x01, 0xfc, 0xfe, + 0x01, 0x01, 0x00, 0xf9, 0x01, 0x01, 0xfe, 0xfd, 0x00, 0xfd, 0x00, 0x06, + 0x00, 0xf8, 0x02, 0x00, 0xfc, 0x03, 0x00, 0xfe, 0xfd, 0xff, 0xff, 0x01, + 0x00, 0x02, 0xfd, 0xfa, 0xfe, 0x03, 0x05, 0x00, 0xfd, 0x00, 0x00, 0xfd, + 0xfc, 0x01, 0x04, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x04, 0x01, 0xfe, 0xfe, + 0xff, 0x00, 0x04, 0x00, 0xff, 0xfd, 0x01, 0x02, 0xfe, 0xff, 0xfd, 0x03, + 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x01, 0xfe, 0xfd, 0xfe, 0x01, 0xff, + 0x00, 0x02, 0xfe, 0xfd, 0x03, 0x00, 0xff, 0xfd, 0xfd, 0x02, 0x00, 0xfe, + 0xfd, 0x00, 0x02, 0xfd, 0x00, 0x01, 0xfd, 0xfe, 0x04, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0xff, 0xfe, 0xfd, 0x01, 0x02, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xfd, 0xff, 0x01, 0xff, 0x01, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, + 0x01, 0x01, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, 0x01, 0x01, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, 0xf6, 0x03, 0x30, 0x32, 0x07, 0xca, + 0xba, 0xfd, 0x20, 0x54, 0x20, 0x01, 0xc9, 0x1b, 0x01, 0xf4, 0x36, 0x20, + 0x54, 0x3b, 0xf2, 0xc9, 0xa3, 0x03, 0x48, 0x49, 0xfd, 0xc1, 0xb3, 0x09, + 0x27, 0x42, 0x0c, 0x03, 0xa3, 0xf4, 0x27, 0x5b, 0xf6, 0xf6, 0xe4, 0x0c, + 0x07, 0x46, 0x44, 0x0e, 0xdc, 0x1c, 0xdb, 0xf9, 0x22, 0xd5, 0xce, 0xcc, + 0xfb, 0xf6, 0x1b, 0xe4, 0xcc, 0xf7, 0xe7, 0xf0, 0xee, 0xd9, 0xcc, 0xd2, + 0xf0, 0x1c, 0xdc, 0xf9, 0xed, 0x09, 0xdb, 0x1b, 0xe4, 0xb1, 0xbe, 0x19, + 0xed, 0xca, 0xff, 0xbe, 0xa1, 0x9f, 0x8f, 0x80, 0xd3, 0x13, 0x0c, 0xcc, + 0xd9, 0xdb, 0xf9, 0x05, 0xf7, 0xd2, 0xce, 0xc3, 0xba, 0xeb, 0xc1, 0xfd, + 0x07, 0xcc, 0xd5, 0xc1, 0x10, 0xd7, 0x17, 0x19, 0x05, 0xd2, 0x03, 0x2e, + 0xe0, 0xf6, 0x13, 0x15, 0x09, 0x22, 0xe5, 0x29, 0x1e, 0x10, 0xf4, 0x1c, + 0x03, 0x22, 0xf6, 0x1c, 0xf2, 0x2e, 0x32, 0x29, 0x07, 0x0a, 0x01, 0x22, + 0x10, 0x1e, 0x15, 0x1b, 0x34, 0x4d, 0x52, 0x49, 0x2d, 0x5b, 0x1b, 0x48, + 0x05, 0x48, 0x37, 0x4f, 0x36, 0x1c, 0x30, 0x30, 0x30, 0x5b, 0x20, 0x2e, + 0x03, 0x42, 0xff, 0x37, 0x42, 0x39, 0x49, 0x27, 0x13, 0x0a, 0x44, 0x34, + 0x58, 0x0a, 0x20, 0x4d, 0x1e, 0x3b, 0x00, 0x10, 0x49, 0x42, 0x03, 0xfb, + 0x0e, 0x3d, 0x20, 0x19, 0x1b, 0xdc, 0x1c, 0x29, 0x1c, 0xf4, 0x22, 0x05, + 0xdc, 0x0c, 0x2e, 0x24, 0x03, 0xe9, 0xc1, 0x01, 0xc9, 0x22, 0x1b, 0xe5, + 0xb3, 0xd7, 0x07, 0xf0, 0xc9, 0xde, 0xcc, 0x03, 0xf4, 0x00, 0xd5, 0x05, + 0xcc, 0xd0, 0xe7, 0xc1, 0xd0, 0xd9, 0xe9, 0xc5, 0xce, 0xd0, 0xb3, 0xca, + 0xc9, 0xca, 0xc0, 0xe9, 0xce, 0x9f, 0x9a, 0xd0, 0xbe, 0xbc, 0xc3, 0xbc, + 0x98, 0xb3, 0xca, 0xd2, 0xaf, 0xcc, 0xa8, 0xcc, 0xc7, 0xc7, 0xbc, 0xc5, + 0xd0, 0xb1, 0xb1, 0xd2, 0xe0, 0xeb, 0xee, 0xbc, 0xca, 0xa5, 0xd5, 0xf6, + 0x09, 0xe4, 0xd0, 0xd9, 0x00, 0xe0, 0xd5, 0xe0, 0xee, 0xf7, 0xd9, 0xf7, + 0xe4, 0xe0, 0xfb, 0xbe, 0xc0, 0x05, 0x17, 0xe7, 0xcc, 0xde, 0xdc, 0xce, + 0xf7, 0x0e, 0x00, 0xed, 0x01, 0xed, 0xf0, 0x0a, 0x07, 0xfb, 0x09, 0xfb, + 0x0a, 0x05, 0x20, 0x1c, 0x07, 0xf4, 0x09, 0x0c, 0x39, 0x27, 0xf2, 0xfb, + 0x1b, 0x3f, 0x2b, 0x42, 0x24, 0x29, 0x17, 0x4b, 0x32, 0x1b, 0x27, 0x51, + 0x48, 0x3b, 0x36, 0x39, 0x2e, 0x27, 0x15, 0x29, 0x3f, 0x5a, 0x2b, 0x22, + 0x25, 0x1e, 0x32, 0x42, 0x2d, 0x05, 0x20, 0x13, 0x22, 0x32, 0x13, 0x03, + 0x15, 0x15, 0x2b, 0x1b, 0x13, 0x1c, 0x27, 0x1b, 0x42, 0x34, 0x27, 0x2e, + 0x2e, 0xed, 0x1c, 0x3b, 0x30, 0x29, 0x3b, 0x32, 0x24, 0x22, 0x2b, 0x07, + 0x1e, 0x39, 0x30, 0x2d, 0x46, 0x40, 0x29, 0x24, 0x32, 0x2d, 0x19, 0x19, + 0x20, 0x1b, 0x17, 0x0c, 0xfb, 0x05, 0x10, 0x00, 0xff, 0x0a, 0xde, 0xfd, + 0x05, 0x0c, 0xee, 0x0c, 0x0c, 0xeb, 0x15, 0x2e, 0x03, 0xdc, 0xe9, 0x0a, + 0x00, 0x24, 0x24, 0xf9, 0x05, 0xff, 0xe2, 0xff, 0x27, 0x22, 0xeb, 0xf9, + 0x2d, 0x0c, 0xf7, 0xeb, 0xe5, 0xfb, 0x13, 0xf0, 0xde, 0xed, 0xe2, 0xca, + 0xce, 0xe7, 0x01, 0x19, 0xfb, 0xc5, 0xaf, 0xe0, 0xee, 0xcc, 0xd0, 0xeb, + 0xfd, 0xf7, 0xdc, 0xc3, 0xac, 0xd0, 0xf2, 0xde, 0xd2, 0xe7, 0xbe, 0xa1, + 0xc0, 0xdb, 0xd9, 0xde, 0xe0, 0xb3, 0x9c, 0xc5, 0xdc, 0xdb, 0xc9, 0xcc, + 0xb8, 0xcc, 0xe9, 0xee, 0xc9, 0xb3, 0xb7, 0xba, 0xc0, 0xdc, 0xf7, 0xd9, + 0xc9, 0xcc, 0xc3, 0xb3, 0xdb, 0xeb, 0xe5, 0xdb, 0xd3, 0xc9, 0xc5, 0xee, + 0xf6, 0xe9, 0xe2, 0xcc, 0xba, 0xd9, 0x03, 0xe5, 0xbc, 0xb8, 0xd3, 0x09, + 0x01, 0xca, 0xb1, 0xd5, 0xf2, 0xd0, 0xce, 0xdc, 0xd9, 0xf2, 0x03, 0xd9, + 0xc5, 0x00, 0x0e, 0x05, 0xf4, 0x07, 0x05, 0xfb, 0x0a, 0x05, 0xf0, 0x03, + 0x24, 0x24, 0x09, 0xed, 0xee, 0x05, 0x1b, 0x10, 0x17, 0x1e, 0x10, 0xfd, + 0x19, 0x13, 0xff, 0x22, 0x20, 0x01, 0x17, 0x2e, 0x1b, 0x05, 0x05, 0xf4, + 0xf6, 0x00, 0x17, 0x17, 0x07, 0x0a, 0x03, 0x0e, 0x22, 0x34, 0x29, 0x01, + 0x15, 0x37, 0x46, 0x44, 0x37, 0x25, 0x2e, 0x3b, 0x22, 0x17, 0x1c, 0x0e, + 0x22, 0x3b, 0xf9, 0x00, 0x3d, 0x46, 0x0a, 0xf0, 0x15, 0x1e, 0x30, 0x4d, + 0x24, 0x0a, 0x27, 0x34, 0x13, 0x17, 0x42, 0x37, 0x29, 0x29, 0x25, 0x1e, + 0x20, 0x29, 0x19, 0x00, 0x01, 0x10, 0x39, 0x3f, 0x19, 0xfd, 0x39, 0x4d, + 0x27, 0x10, 0x17, 0x24, 0x01, 0xfd, 0x03, 0x12, 0x24, 0x20, 0x17, 0x1b, + 0x0c, 0xeb, 0xf4, 0x17, 0x24, 0x0c, 0x13, 0x27, 0xf7, 0xeb, 0x17, 0x2e, + 0x0a, 0x0c, 0x29, 0x0a, 0x01, 0x17, 0x34, 0x27, 0x13, 0xf7, 0xee, 0x15, + 0x24, 0x0e, 0x13, 0x07, 0xeb, 0xee, 0xff, 0xff, 0x12, 0xfd, 0x00, 0xf9, + 0xd3, 0xde, 0x00, 0x1b, 0x13, 0xe0, 0xd2, 0xdc, 0xe4, 0x09, 0x0c, 0xcc, + 0xc5, 0x01, 0x1b, 0x12, 0xe0, 0xc5, 0xc5, 0xe0, 0xeb, 0xf6, 0x03, 0xed, + 0xe5, 0x19, 0xf4, 0xc9, 0xee, 0x2e, 0x03, 0xe2, 0xd5, 0xd0, 0xe2, 0xff, + 0xfd, 0xe0, 0xe5, 0xe9, 0xed, 0xf9, 0xe2, 0xba, 0xaf, 0xcc, 0xf4, 0x05, + 0xfd, 0xcc, 0xb1, 0xd3, 0x03, 0x01, 0xce, 0xb8, 0xe9, 0xe0, 0xf0, 0xf6, + 0xb3, 0xb5, 0xe7, 0xff, 0x07, 0xe5, 0xd5, 0xd0, 0xf2, 0x17, 0xf2, 0xe4, + 0xf2, 0xfd, 0xdb, 0xd7, 0xde, 0xc5, 0xbe, 0xf2, 0x01, 0xe2, 0xe7, 0x1b, + 0xe2, 0xcc, 0xfb, 0xff, 0xba, 0xca, 0xff, 0x17, 0x03, 0xce, 0xc5, 0xf0, + 0x19, 0x09, 0xeb, 0xcc, 0xcc, 0xfb, 0x1b, 0x12, 0xd9, 0xd3, 0x19, 0x17, + 0xe0, 0xc3, 0xd7, 0x09, 0x1b, 0x05, 0xce, 0xd2, 0xf2, 0x13, 0x24, 0x07, + 0xcc, 0xd3, 0x05, 0xfd, 0xd7, 0x2e, 0x17, 0xdc, 0xee, 0x1b, 0xf0, 0x05, + 0x0a, 0xe7, 0x00, 0x05, 0xe7, 0xfd, 0x07, 0x1c, 0xfd, 0xd9, 0xd5, 0xf7, + 0x1b, 0x29, 0x1c, 0xe7, 0xd2, 0xe9, 0x29, 0x36, 0x0e, 0xf0, 0x0c, 0xff, + 0xe9, 0xe0, 0xe7, 0x01, 0x24, 0x27, 0xf4, 0xce, 0xe4, 0x05, 0x1e, 0x2b, + 0x03, 0xd5, 0xe5, 0x1e, 0x36, 0x19, 0xee, 0xde, 0xe2, 0x1b, 0x2d, 0x12, + 0x00, 0xde, 0xd9, 0x10, 0x24, 0x01, 0x00, 0x1e, 0x0e, 0x01, 0xfb, 0xd3, + 0xf2, 0x27, 0x34, 0x1b, 0xff, 0x05, 0xe9, 0xf9, 0x15, 0xf6, 0xf6, 0x34, + 0x29, 0xe5, 0xd0, 0x03, 0x12, 0x12, 0x39, 0x0c, 0xdb, 0xff, 0x40, 0x3d, + 0x0e, 0xe5, 0xe4, 0x0a, 0x3d, 0x2d, 0x0e, 0xf0, 0xd9, 0xfb, 0x20, 0x30, + 0x39, 0x13, 0xfb, 0xed, 0x12, 0x2b, 0x10, 0xfb, 0x1b, 0x39, 0x03, 0xfd, + 0x0e, 0x01, 0x1c, 0x0c, 0xd7, 0xf4, 0x1c, 0x25, 0x22, 0x10, 0xe4, 0x01, + 0x39, 0x42, 0x12, 0xed, 0xf2, 0x03, 0x10, 0x2d, 0x15, 0x0a, 0x15, 0xf6, + 0x15, 0x3f, 0xfd, 0xd9, 0x01, 0x2b, 0x1e, 0x07, 0x29, 0x19, 0x09, 0x51, + 0x20, 0xf7, 0xf0, 0x20, 0x3f, 0x30, 0x1b, 0x07, 0xfd, 0x07, 0x24, 0xf0, + 0xe4, 0x0e, 0x24, 0x2e, 0x01, 0xdb, 0x0a, 0x2e, 0x3d, 0x2d, 0xfb, 0xe7, + 0xf4, 0x27, 0x3d, 0x0c, 0xdb, 0x13, 0x22, 0x12, 0x40, 0x25, 0xee, 0xf7, + 0x3b, 0x13, 0xeb, 0x37, 0x46, 0x19, 0x09, 0x05, 0xee, 0xf0, 0x25, 0x36, + 0xf7, 0xd5, 0xee, 0x0c, 0x12, 0x22, 0x24, 0xf0, 0xd5, 0xee, 0x24, 0x22, + 0xe9, 0xd0, 0xfb, 0xff, 0xff, 0x2b, 0x15, 0xe0, 0xce, 0x07, 0x15, 0xd3, + 0x01, 0x2d, 0x0e, 0xf4, 0xed, 0xdc, 0xde, 0x10, 0x25, 0x17, 0xf4, 0xe9, + 0xd9, 0xdc, 0x00, 0x01, 0xd9, 0xc7, 0x05, 0x0e, 0xce, 0xb3, 0xcc, 0xed, + 0x03, 0x12, 0xe9, 0xba, 0xcc, 0x07, 0x15, 0xe4, 0xb7, 0xcc, 0xf9, 0x0e, + 0xf6, 0xc7, 0xaf, 0xc0, 0xf9, 0x03, 0xd0, 0xb7, 0x03, 0xfd, 0xc7, 0xae, + 0xd3, 0x00, 0x09, 0xfd, 0xcc, 0xb8, 0xce, 0x0a, 0x13, 0xe7, 0xca, 0xcc, + 0xc5, 0xd2, 0x01, 0x03, 0xcc, 0xae, 0xc0, 0xe4, 0xf2, 0xee, 0xf0, 0xd5, + 0xba, 0xdc, 0x0e, 0xee, 0xb1, 0xd7, 0x19, 0xfb, 0xcc, 0xc7, 0xd2, 0xd0, + 0xf4, 0x0e, 0xde, 0xae, 0xd9, 0xff, 0x07, 0xf6, 0xce, 0xde, 0x13, 0x17, + 0xee, 0xd2, 0xed, 0xf7, 0xd7, 0x0a, 0x0a, 0xd5, 0xdb, 0xf9, 0xf2, 0xd2, + 0xb7, 0xd9, 0xfb, 0x0c, 0x10, 0xf2, 0xd5, 0xc5, 0xff, 0x22, 0x0e, 0xdc, + 0xc0, 0xe0, 0x20, 0x1b, 0xee, 0xcc, 0xde, 0x01, 0x1e, 0xfb, 0xc9, 0xe5, + 0x1e, 0x17, 0xd9, 0xc3, 0xf7, 0x29, 0x22, 0xff, 0xd9, 0xd0, 0xeb, 0x17, + 0x25, 0x12, 0xdc, 0xce, 0xd3, 0x00, 0x07, 0x03, 0x19, 0x1c, 0xe2, 0xdb, + 0x05, 0x25, 0xf6, 0xd2, 0x03, 0x2d, 0x00, 0xee, 0x12, 0x12, 0x13, 0x17, + 0x03, 0xd9, 0xf9, 0x32, 0x1b, 0xe2, 0xd5, 0x09, 0x37, 0x2b, 0xff, 0xe4, + 0xe9, 0xfd, 0xf9, 0x27, 0x1e, 0xe4, 0xfb, 0x3f, 0x1e, 0xe9, 0xdb, 0xf6, + 0x25, 0x32, 0x27, 0xfb, 0xe4, 0xee, 0x20, 0x39, 0x36, 0x15, 0x0e, 0xee, + 0xe5, 0x13, 0x40, 0x1e, 0xf6, 0x15, 0x32, 0xfd, 0xee, 0x22, 0x42, 0x07, + 0xd9, 0xf2, 0x27, 0x40, 0x3d, 0x0c, 0xeb, 0xf2, 0x15, 0x46, 0x3b, 0x19, + 0xee, 0xf2, 0x24, 0x49, 0x15, 0xeb, 0x20, 0x40, 0x05, 0xe4, 0x07, 0x29, + 0x39, 0x3b, 0x0c, 0xe7, 0x07, 0x3d, 0x3f, 0x1b, 0x1b, 0x20, 0xe4, 0x17, + 0x46, 0x46, 0x19, 0x01, 0xf9, 0xf9, 0x05, 0x1e, 0x3f, 0x24, 0xe9, 0x07, + 0x17, 0x13, 0x39, 0x2e, 0x19, 0x1b, 0xfb, 0xee, 0x22, 0x3f, 0x42, 0x17, + 0xf4, 0xfb, 0x2d, 0x4b, 0x19, 0xee, 0xf9, 0x2b, 0x12, 0xf2, 0x2e, 0x49, + 0x24, 0xf7, 0xeb, 0xfd, 0x2b, 0x00, 0xe2, 0x1c, 0x3d, 0x17, 0xdc, 0xde, + 0xf9, 0x1e, 0x32, 0x12, 0xd9, 0xd7, 0x05, 0x2b, 0x2d, 0x07, 0xd9, 0x03, + 0x29, 0xe9, 0xd9, 0x20, 0x39, 0x1c, 0xf2, 0xe2, 0xf2, 0x27, 0x25, 0xf2, + 0xd0, 0xde, 0x0e, 0x20, 0x1c, 0x17, 0xee, 0xd7, 0xf0, 0x34, 0x1c, 0xe2, + 0xe5, 0xfb, 0xcc, 0xe2, 0x00, 0x09, 0x15, 0x07, 0xd0, 0xc7, 0x01, 0x20, + 0x05, 0xeb, 0x25, 0x09, 0xca, 0xe2, 0x01, 0x20, 0x29, 0xf7, 0xd5, 0xe4, + 0x25, 0xfd, 0xce, 0x13, 0xf4, 0xb3, 0xe5, 0x05, 0x09, 0x1b, 0xeb, 0xc1, + 0xf6, 0x09, 0xce, 0x0a, 0x20, 0xee, 0xc0, 0xd9, 0x0e, 0x15, 0x0a, 0x00, + 0xe2, 0xd0, 0xca, 0xf4, 0xf4, 0xfd, 0x22, 0xee, 0xc5, 0xd0, 0xfd, 0x1c, + 0xee, 0xc1, 0xeb, 0x17, 0xd9, 0xb3, 0xdc, 0x0c, 0xfd, 0xf0, 0xf9, 0xc1, + 0xce, 0x00, 0x17, 0xeb, 0xb8, 0xce, 0xf2, 0xfb, 0x13, 0x01, 0xd7, 0xde, + 0xe5, 0xbe, 0xf4, 0x17, 0x0e, 0xe5, 0xdb, 0xce, 0xbe, 0xeb, 0x0e, 0x13, + 0xee, 0xc9, 0xcc, 0xc9, 0xf2, 0x17, 0x07, 0xd5, 0xba, 0xcc, 0x01, 0x07, + 0xe7, 0xce, 0xae, 0xd0, 0xfb, 0x0c, 0xee, 0xb5, 0xd7, 0x15, 0xf2, 0xb3, + 0xd0, 0x0e, 0x19, 0xff, 0xd5, 0xcc, 0xc7, 0xfd, 0x1e, 0xf2, 0xbc, 0xc3, + 0xe0, 0x07, 0x12, 0xdc, 0xbe, 0x01, 0x13, 0xdc, 0xf6, 0x12, 0xc9, 0xc5, + 0xff, 0x1e, 0xf7, 0xde, 0x0e, 0x09, 0xde, 0xee, 0xf9, 0xd7, 0xe0, 0x0c, + 0x20, 0xf4, 0xc5, 0xde, 0x15, 0x24, 0xf2, 0xcc, 0xd3, 0xe9, 0x00, 0x09, + 0xe0, 0xe7, 0x20, 0x15, 0xed, 0xc9, 0xd3, 0x03, 0x1b, 0x1e, 0xf7, 0xc9, + 0xd0, 0x03, 0x17, 0xf4, 0x30, 0x20, 0xe7, 0xd2, 0xe9, 0x15, 0x34, 0x19, + 0xeb, 0xe2, 0xed, 0xf9, 0xfb, 0x1c, 0x12, 0xe4, 0xd0, 0x01, 0x22, 0x2b, + 0x19, 0xf4, 0xdc, 0xee, 0x29, 0x36, 0x00, 0xd9, 0xd5, 0xff, 0x25, 0x2b, + 0x19, 0xff, 0x09, 0xe7, 0xf7, 0x3b, 0x1e, 0xe4, 0x05, 0x36, 0xe9, 0xe5, + 0x25, 0x37, 0xee, 0xd7, 0xf4, 0x0a, 0xf6, 0x0e, 0x2b, 0x12, 0xf9, 0x0e, + 0x25, 0xf7, 0x13, 0x27, 0xed, 0x0c, 0x17, 0x01, 0x27, 0x4d, 0x1b, 0x03, + 0xff, 0x13, 0x15, 0x34, 0x0e, 0xee, 0x19, 0x30, 0xf9, 0xe5, 0x15, 0x40, + 0x19, 0xe0, 0xe2, 0x12, 0x32, 0x37, 0x27, 0xf2, 0xfd, 0x05, 0x25, 0x3d, + 0xff, 0x01, 0x3d, 0x25, 0xf0, 0xf6, 0x3b, 0x25, 0xf0, 0x2d, 0x19, 0xe0, + 0x10, 0x3b, 0x2e, 0x12, 0x15, 0xff, 0x0c, 0x4d, 0x20, 0xf0, 0x15, 0x44, + 0x15, 0xfd, 0x39, 0x1b, 0xf2, 0x2e, 0x4b, 0x2d, 0x00, 0x01, 0x40, 0x34, + 0xf0, 0xf9, 0x07, 0x05, 0x22, 0x3d, 0x2d, 0xf4, 0xf9, 0x30, 0x3b, 0x01, + 0xe2, 0x10, 0x3b, 0x15, 0xfb, 0x44, 0x25, 0xed, 0x05, 0x19, 0x03, 0x2b, + 0x19, 0xe0, 0xfb, 0x19, 0x2d, 0x2e, 0x03, 0xde, 0x03, 0x36, 0x20, 0xe9, + 0xde, 0x09, 0x2e, 0x03, 0xe5, 0x34, 0x22, 0xe7, 0xfd, 0x0e, 0xcc, 0xfd, + 0x36, 0x10, 0xd7, 0xfd, 0xf2, 0x22, 0x2b, 0xff, 0xd7, 0xde, 0x15, 0x34, + 0x09, 0xd9, 0xd5, 0x07, 0x36, 0xf9, 0xcc, 0xdb, 0xf4, 0x07, 0x15, 0xd7, + 0xbc, 0xe5, 0x07, 0x07, 0xf4, 0xf0, 0xd3, 0xc1, 0xf6, 0x10, 0xe2, 0xb5, + 0xf4, 0x09, 0xeb, 0xdb, 0xfd, 0x1b, 0x0c, 0xed, 0xde, 0xc3, 0xd5, 0x03, + 0x12, 0x17, 0xed, 0xd2, 0xbe, 0xe0, 0x19, 0xff, 0xca, 0xc1, 0xf9, 0x1b, + 0xde, 0xaf, 0xe5, 0xf7, 0xb1, 0xf9, 0x07, 0xca, 0xdb, 0x15, 0xeb, 0xc9, + 0xf2, 0x20, 0xe7, 0xbc, 0xc9, 0xeb, 0xf0, 0x00, 0xe4, 0xbe, 0xfb, 0x17, + 0xf7, 0xce, 0xba, 0xd7, 0x0c, 0xfd, 0xe5, 0x09, 0xe9, 0xc5, 0xe2, 0xfd, + 0xd3, 0xc7, 0x0e, 0x01, 0xba, 0xd5, 0x15, 0x12, 0xe5, 0xba, 0xca, 0xf9, + 0x19, 0x13, 0xee, 0xd3, 0xe4, 0xf6, 0xce, 0xf2, 0x20, 0x05, 0xe9, 0xfb, + 0xd3, 0xee, 0x0a, 0xf4, 0xcc, 0xd3, 0x07, 0x24, 0xf9, 0xd7, 0x1c, 0x05, + 0xc1, 0xe0, 0x13, 0x27, 0x0a, 0xee, 0xe9, 0xd7, 0xe5, 0xf6, 0x09, 0x24, + 0xfd, 0xcc, 0xf4, 0x25, 0x09, 0xf4, 0x01, 0xeb, 0xe9, 0xf7, 0x07, 0x15, + 0x1c, 0xe5, 0xd3, 0xf4, 0x10, 0x20, 0x2d, 0x07, 0xe0, 0x01, 0x34, 0x07, + 0x03, 0x15, 0x10, 0xe9, 0xf4, 0x12, 0x05, 0xeb, 0x0c, 0xf6, 0xdb, 0x15, + 0x2b, 0x0a, 0xe4, 0xe5, 0x05, 0x30, 0x1b, 0xf4, 0xd9, 0xe4, 0x00, 0x09, + 0x27, 0x17, 0xde, 0xe4, 0x0e, 0x05, 0xf7, 0x25, 0x0a, 0xde, 0xdb, 0x09, + 0x2b, 0x2d, 0x03, 0xd5, 0xe2, 0x15, 0x2d, 0x1b, 0x09, 0x03, 0xe4, 0x05, + 0x27, 0xf0, 0xe2, 0x1b, 0x15, 0xe5, 0xdb, 0x0e, 0x24, 0xf7, 0xeb, 0x2e, + 0x15, 0xd9, 0xde, 0x0e, 0x2e, 0x20, 0xfd, 0xf0, 0xdb, 0xf4, 0x01, 0x17, + 0x17, 0xce, 0xd9, 0x0c, 0x1c, 0xe0, 0xf4, 0x15, 0x03, 0x0e, 0xd5, 0xee, + 0x2b, 0x2b, 0x07, 0xe4, 0xdc, 0xe9, 0x15, 0x29, 0x07, 0xd3, 0xd5, 0x09, + 0x30, 0x19, 0x00, 0xf0, 0xd7, 0x00, 0x20, 0x03, 0xe7, 0x27, 0x09, 0xe0, + 0x07, 0x20, 0xe5, 0x07, 0x2e, 0xfb, 0xdb, 0xe0, 0x19, 0x29, 0xff, 0xd7, + 0xf0, 0x24, 0xf0, 0xd5, 0x20, 0x19, 0xe4, 0xe0, 0x25, 0x10, 0xd7, 0xe2, + 0x1c, 0x36, 0x1e, 0xf6, 0xe2, 0xe9, 0xf4, 0xed, 0x25, 0x15, 0xdc, 0xed, + 0x32, 0x19, 0xd7, 0xdb, 0x1c, 0x29, 0xee, 0xd0, 0x00, 0x2b, 0x00, 0xd0, + 0x0c, 0x24, 0x00, 0xe0, 0xf6, 0x1e, 0x24, 0xf4, 0xd0, 0xf7, 0x2b, 0x34, + 0x20, 0xeb, 0xdb, 0xe5, 0x24, 0x30, 0x13, 0xde, 0x20, 0x3d, 0x00, 0xf2, + 0x13, 0xf6, 0xe9, 0x2d, 0x1b, 0xd7, 0xed, 0x2d, 0x24, 0xd5, 0xf7, 0x19, + 0x01, 0x34, 0xff, 0xd3, 0xfb, 0x34, 0x24, 0xe7, 0xdc, 0x25, 0x19, 0xd5, + 0x20, 0x2b, 0xe4, 0xe7, 0x2b, 0x3d, 0x17, 0xee, 0xde, 0x07, 0x34, 0xf7, + 0xf9, 0x30, 0x19, 0xd5, 0xed, 0x30, 0x3b, 0x0c, 0xe9, 0x13, 0x09, 0xf2, + 0x09, 0x36, 0x19, 0xe5, 0xdb, 0xf4, 0x2b, 0x32, 0x10, 0xe4, 0xdc, 0xe7, + 0x1c, 0x2b, 0x25, 0xf0, 0xdb, 0xde, 0x03, 0x07, 0xf6, 0x05, 0x15, 0xe2, + 0x12, 0x3b, 0xed, 0x00, 0x24, 0xdb, 0xd2, 0x05, 0x36, 0x2d, 0x01, 0xd9, + 0xd3, 0xf4, 0x24, 0x17, 0x00, 0x0c, 0xf6, 0xd7, 0x22, 0x27, 0xf0, 0xd2, + 0xff, 0x30, 0x2b, 0x00, 0xe7, 0xde, 0xe5, 0x05, 0x25, 0x20, 0xff, 0xde, + 0xd3, 0xd0, 0xf4, 0xfb, 0xf9, 0x19, 0x09, 0xe7, 0xdb, 0x05, 0x27, 0xff, + 0xd2, 0xd2, 0x09, 0x0a, 0xf2, 0x24, 0xed, 0xce, 0xc9, 0xf2, 0x19, 0x1e, + 0xfd, 0xc5, 0xc7, 0xf0, 0x0c, 0xfb, 0x12, 0x19, 0xed, 0xde, 0xf6, 0x00, + 0xd7, 0xf7, 0x24, 0xf7, 0xbe, 0xdb, 0x13, 0x20, 0x03, 0xee, 0xe4, 0xd3, + 0x05, 0x25, 0x0a, 0xdc, 0xd3, 0x01, 0x1c, 0xe9, 0xf9, 0x25, 0xe5, 0xd0, + 0x0a, 0x39, 0x0e, 0xe7, 0xe5, 0xd7, 0xe9, 0x07, 0x13, 0xf7, 0xfb, 0x01, + 0xc5, 0xe0, 0x10, 0x20, 0xe5, 0xbc, 0xe7, 0x19, 0x07, 0xc5, 0xde, 0x05, + 0x01, 0xed, 0xed, 0x13, 0xf7, 0xdc, 0x0e, 0x25, 0x0e, 0x03, 0xeb, 0x0a, + 0x30, 0xee, 0xde, 0x0e, 0x32, 0xf4, 0xe5, 0xe9, 0xf4, 0xf7, 0xf6, 0x17, + 0xdc, 0xc9, 0xf9, 0x1e, 0x0a, 0xc9, 0xc5, 0xf7, 0x1c, 0xf6, 0xbe, 0xfb, + 0x13, 0xf0, 0xfd, 0xf9, 0xc5, 0xfb, 0x20, 0xfb, 0xd0, 0xf0, 0x2e, 0xf6, + 0xc5, 0xf9, 0x17, 0xf6, 0xcc, 0xf7, 0x2e, 0xf9, 0xd2, 0xf2, 0x2b, 0x07, + 0xe0, 0xdc, 0xe4, 0x13, 0x12, 0xdc, 0xc0, 0xf0, 0x19, 0xfd, 0xf6, 0xfd, + 0xd5, 0xe7, 0x0e, 0x12, 0xd9, 0xd0, 0x10, 0xfb, 0xd0, 0x03, 0x17, 0xe2, + 0xf6, 0x22, 0xf7, 0xd5, 0xed, 0x24, 0x17, 0xe4, 0xfd, 0x1b, 0xdc, 0xd2, + 0x00, 0x24, 0x0a, 0xd9, 0xdb, 0x05, 0x22, 0x03, 0xe7, 0x05, 0xf0, 0xd3, + 0x10, 0x2d, 0x15, 0xeb, 0xee, 0xf2, 0xd5, 0xff, 0x1b, 0x24, 0x00, 0xe2, + 0xdc, 0xde, 0x0e, 0x2b, 0x1b, 0xe7, 0xce, 0xe7, 0x0e, 0x1e, 0x07, 0xf9, + 0x17, 0xf2, 0xe5, 0x1c, 0x2b, 0x00, 0xe5, 0x17, 0x22, 0xde, 0x0e, 0x3d, + 0x12, 0xeb, 0xe4, 0xf7, 0x15, 0xeb, 0x09, 0x32, 0x24, 0x0c, 0xe7, 0x07, + 0x3f, 0x12, 0xe2, 0x1e, 0x27, 0xe5, 0x0c, 0x32, 0x00, 0xdc, 0x10, 0x3b, + 0x1e, 0xff, 0x19, 0x12, 0xe4, 0x25, 0x46, 0x12, 0xe9, 0xe9, 0x01, 0x24, + 0x1c, 0xed, 0xf9, 0x36, 0x10, 0x24, 0x37, 0xfb, 0x0c, 0x42, 0x15, 0xe7, + 0xf7, 0x2b, 0x32, 0x0e, 0x1c, 0xf4, 0xdc, 0x0e, 0x42, 0x2d, 0xf2, 0xd5, + 0xf6, 0x2e, 0x36, 0x1b, 0xf4, 0xe2, 0xde, 0x0c, 0x1e, 0x17, 0x07, 0x1b, + 0xfd, 0xe0, 0x19, 0x34, 0x0c, 0x0a, 0x20, 0xe2, 0xeb, 0x24, 0x2e, 0xee, + 0xf4, 0x2b, 0xf6, 0xf0, 0x22, 0x2b, 0xfd, 0xd3, 0xdc, 0x0a, 0x1e, 0x15, + 0x10, 0xd7, 0xdc, 0x10, 0x32, 0x15, 0xe5, 0xed, 0xed, 0xfd, 0x25, 0xe5, + 0xd3, 0x09, 0x2e, 0xfd, 0xc7, 0xd2, 0x03, 0x24, 0x12, 0xf9, 0xe9, 0xc1, + 0xf4, 0x1e, 0x27, 0x0a, 0xd3, 0xdc, 0xeb, 0x0c, 0x27, 0x07, 0xe0, 0xee, + 0x25, 0x0c, 0xca, 0xf2, 0x1e, 0x00, 0xf9, 0x15, 0xfd, 0xe0, 0xd3, 0x0c, + 0x2b, 0xe2, 0xd5, 0x24, 0x20, 0xe2, 0xed, 0xe7, 0xfb, 0x2d, 0xf9, 0xca, + 0xe0, 0x13, 0xe9, 0xc9, 0x07, 0xfd, 0xed, 0x00, 0xf4, 0x05, 0x27, 0xf2, + 0xc1, 0xde, 0x1b, 0x2b, 0x1c, 0xf4, 0xd9, 0xde, 0x20, 0x32, 0x12, 0xe7, + 0xd7, 0xe2, 0x12, 0x29, 0x12, 0xd0, 0xf7, 0x0a, 0xd7, 0xd3, 0xff, 0x1c, + 0x17, 0xf2, 0xc3, 0xe9, 0x22, 0x27, 0x05, 0xd9, 0xd5, 0xee, 0x10, 0x22, + 0x1c, 0xe5, 0xc9, 0xe9, 0x24, 0x22, 0xf0, 0xc5, 0xe7, 0x05, 0xee, 0xe7, + 0x22, 0x15, 0xf2, 0x01, 0xfb, 0xde, 0xf9, 0x29, 0xf9, 0xd5, 0x17, 0xf9, + 0xce, 0x15, 0x20, 0xe2, 0xc7, 0xde, 0x12, 0x1c, 0xf4, 0x01, 0x0c, 0xc0, + 0xee, 0x15, 0xf6, 0xed, 0xf9, 0xf0, 0xf7, 0x25, 0xdc, 0xf0, 0x27, 0x12, + 0xd0, 0xdc, 0x1e, 0x10, 0xcc, 0x00, 0x2b, 0xe7, 0xc9, 0xfd, 0x03, 0x0a, + 0xff, 0xd7, 0xf6, 0x00, 0x2d, 0xff, 0xe2, 0xfb, 0x09, 0x2b, 0x10, 0xe9, + 0xed, 0xf0, 0xe5, 0x01, 0x0c, 0xd9, 0xf7, 0x17, 0x17, 0xe5, 0x03, 0x2b, + 0xdb, 0xd7, 0xf7, 0x15, 0x1c, 0x15, 0xe5, 0xce, 0x05, 0x32, 0x0a, 0xf4, + 0x20, 0xe9, 0xeb, 0x1c, 0xf6, 0xdc, 0x30, 0x2b, 0xf4, 0xd5, 0xdb, 0xff, + 0x20, 0x25, 0x01, 0xd0, 0xee, 0x0c, 0x00, 0x19, 0x03, 0xd7, 0xf9, 0x2d, + 0x1b, 0xd7, 0xe9, 0x2b, 0xff, 0xd2, 0x20, 0x1b, 0x01, 0x30, 0x07, 0xe4, + 0x01, 0x09, 0xff, 0x39, 0x09, 0xde, 0xd7, 0x05, 0x1e, 0x0c, 0x24, 0xde, + 0xcc, 0xe7, 0x1e, 0x24, 0x10, 0xdc, 0xd0, 0x01, 0x2d, 0x05, 0xce, 0xf4, + 0x2e, 0x22, 0xee, 0xd7, 0x05, 0x2e, 0x17, 0xf2, 0xd5, 0xde, 0x0a, 0x17, + 0x25, 0x0e, 0xf4, 0xe0, 0xf0, 0x32, 0x2d, 0xf7, 0xd7, 0xfd, 0x19, 0x0a, + 0x01, 0x00, 0xe2, 0xf7, 0x2b, 0x03, 0xd3, 0xf6, 0x34, 0x19, 0xe0, 0xd5, + 0x01, 0xff, 0xdc, 0x17, 0x1c, 0xf4, 0xca, 0xf9, 0x29, 0x12, 0xe5, 0xff, + 0x27, 0x03, 0xd0, 0xe7, 0x03, 0x05, 0x15, 0xfb, 0xe9, 0x07, 0x0e, 0xd3, + 0x00, 0x27, 0xf4, 0xe2, 0x2e, 0x0e, 0xd0, 0xfb, 0x27, 0xed, 0xc5, 0x00, + 0x27, 0x03, 0xf0, 0x24, 0xee, 0xc9, 0x00, 0x2e, 0x00, 0xcc, 0xfd, 0x2e, + 0xf6, 0xd0, 0xed, 0x19, 0x2d, 0xfd, 0xcc, 0xf2, 0x17, 0xfd, 0xfd, 0x29, + 0x01, 0xd0, 0xed, 0x25, 0x1c, 0xdb, 0xe5, 0xe9, 0xde, 0x1b, 0x0a, 0xe0, + 0xfd, 0x19, 0xe9, 0xe0, 0xe4, 0xfb, 0x22, 0x15, 0xf6, 0xd3, 0x07, 0x03, + 0xdc, 0x1b, 0x24, 0xf9, 0xd3, 0xff, 0x25, 0xe0, 0xf2, 0x32, 0x00, 0xd3, + 0xed, 0x27, 0xfb, 0xc7, 0xf6, 0x2b, 0x0a, 0xcc, 0xfd, 0x3b, 0xfd, 0xd0, + 0xde, 0x03, 0xfd, 0xee, 0x05, 0x29, 0xee, 0xc3, 0xe7, 0x13, 0x22, 0x0c, + 0xf9, 0x17, 0xe0, 0xd9, 0x17, 0x24, 0xdb, 0xe5, 0x32, 0x0c, 0xca, 0xde, + 0x15, 0x1c, 0xed, 0x20, 0x0a, 0xcc, 0x07, 0x36, 0xf7, 0xd0, 0xd7, 0x00, + 0x1c, 0x20, 0xfb, 0xdb, 0xe5, 0xfb, 0x0e, 0x00, 0x15, 0x20, 0x07, 0xfb, + 0xd7, 0xe2, 0x0e, 0x2e, 0x00, 0xd7, 0x15, 0x0e, 0xcc, 0x12, 0x24, 0xde, + 0xd3, 0x12, 0x32, 0x0a, 0xdb, 0xf0, 0x1c, 0xf0, 0xd7, 0xfb, 0x1c, 0x27, + 0xf0, 0xd0, 0x07, 0x2e, 0xf7, 0xe9, 0x20, 0xde, 0xdb, 0x1c, 0x27, 0xe5, + 0xc5, 0xfb, 0x27, 0x1c, 0x00, 0xe9, 0xf4, 0x12, 0xdb, 0xd7, 0x15, 0x20, + 0x19, 0x07, 0xed, 0xcc, 0xf4, 0x2b, 0x27, 0x00, 0xf4, 0xde, 0xe2, 0x24, + 0x2e, 0x00, 0xd3, 0xe2, 0x07, 0x00, 0xff, 0x1c, 0xf0, 0x00, 0xf7, 0xd3, + 0x2b, 0x32, 0x0a, 0xf0, 0xde, 0xd0, 0xf0, 0x0e, 0x24, 0x19, 0xdb, 0xc9, + 0xff, 0x27, 0x19, 0x00, 0xff, 0xd7, 0xe2, 0x0e, 0x2b, 0x27, 0xf7, 0xf4, + 0x03, 0xe5, 0x15, 0x27, 0xf4, 0xd0, 0xe5, 0x20, 0x00, 0xd3, 0x2b, 0x24, + 0xe5, 0xd0, 0x00, 0x2b, 0xe2, 0xc5, 0x0e, 0x2b, 0x03, 0xe2, 0x12, 0xfb, + 0xc5, 0xf0, 0x03, 0x0a, 0x1c, 0xf7, 0xe5, 0x1c, 0xed, 0xe9, 0x07, 0x36, + 0x07, 0xdb, 0x00, 0x0e, 0xcc, 0xfb, 0x32, 0x12, 0xe2, 0x03, 0x19, 0xdb, + 0xd7, 0x0e, 0x24, 0x19, 0xf4, 0xe5, 0x19, 0x0a, 0xd0, 0xfb, 0x15, 0xd0, + 0xf0, 0x20, 0x27, 0xf4, 0xcc, 0xe5, 0x24, 0x00, 0xed, 0x32, 0xed, 0xc5, + 0xe5, 0x07, 0x07, 0xf4, 0x07, 0x20, 0xfb, 0xe5, 0x03, 0x20, 0xe9, 0x0a, + 0x0e, 0xd0, 0xf0, 0x2b, 0x27, 0xe5, 0xd7, 0x0e, 0xff, 0x15, 0x2e, 0xfb, + 0xfb, 0xe9, 0xe2, 0xed, 0x27, 0x0e, 0xd0, 0xfb, 0x27, 0xf4, 0xd3, 0x19, + 0x27, 0xf0, 0xc9, 0xf4, 0x24, 0xff, 0xf0, 0x3d, 0x00, 0xdb, 0xd3, 0xf7, + 0x15, 0x19, 0x00, 0xf4, 0x03, 0xde, 0xfb, 0x32, 0x24, 0xf7, 0xdb, 0xf0, + 0x03, 0xe2, 0x03, 0x1c, 0x20, 0xe2, 0xc9, 0xf0, 0x24, 0x20, 0x03, 0x00, + 0xe9, 0xc9, 0xe9, 0x19, 0x24, 0x00, 0xcc, 0xd7, 0x07, 0x24, 0x00, 0xe9, + 0x32, 0x19, 0xe2, 0x00, 0x07, 0xe9, 0x1c, 0x12, 0xde, 0xe9, 0xfb, 0xe5, + 0x1c, 0x1c, 0x24, 0xf0, 0xdb, 0x00, 0x20, 0xd7, 0xf7, 0x20, 0xd3, 0xe5, + 0x27, 0x07, 0xc5, 0xe9, 0x20, 0x20, 0xfb, 0xc9, 0xe2, 0x12, 0x1c, 0x20, + 0x00, 0xd7, 0xe9, 0x2e, 0x15, 0xd3, 0xde, 0x19, 0x20, 0xed, 0xd3, 0x00, + 0x24, 0x27, 0x03, 0xe2, 0xd3, 0xde, 0x15, 0x20, 0x03, 0xf7, 0xe9, 0xfb, + 0xf0, 0xfb, 0x15, 0x03, 0x2b, 0xf4, 0xd3, 0x00, 0x32, 0x0a, 0xe5, 0xd0, + 0xe9, 0x0e, 0x07, 0x1c, 0x00, 0xc9, 0xd7, 0x03, 0x1c, 0x24, 0x15, 0xff, + 0xe5, 0xd3, 0xf7, 0x20, 0x24, 0x00, 0xd3, 0xdb, 0x03, 0x27, 0x27, 0x0e, + 0xf4, 0xe5, 0xd0, 0xf4, 0x20, 0x2b, 0x19, 0xed, 0xe2, 0xd3, 0x0a, 0x2b, + 0x1c, 0xf7, 0xe2, 0xfb, 0xe9, 0xe2, 0x20, 0x20, 0xf7, 0xc9, 0xd3, 0xff, + 0x12, 0x20, 0x20, 0xe9, 0xcc, 0xde, 0x07, 0x19, 0x24, 0x07, 0xe2, 0xf7, + 0x2b, 0xe5, 0xdb, 0x2b, 0x32, 0x00, 0xe5, 0xde, 0x0e, 0x2e, 0xe5, 0xcc, + 0x07, 0x32, 0x07, 0xcc, 0xed, 0x2e, 0x0e, 0xc9, 0xf0, 0x2b, 0x00, 0xd3, + 0x24, 0x27, 0xe5, 0xcc, 0xd3, 0x00, 0x15, 0x1c, 0x12, 0x00, 0xf7, 0xdb, + 0xd7, 0x19, 0x24, 0x0a, 0x0a, 0xe5, 0xcc, 0xf7, 0x24, 0x2b, 0x03, 0xe5, + 0x0e, 0xe2, 0xde, 0x24, 0x27, 0xe9, 0xc5, 0xf0, 0x20, 0x2b, 0x0e, 0xf0, + 0xff, 0xc9, 0xe2, 0x12, 0x27, 0x19, 0x00, 0x00, 0xd0, 0xe2, 0x12, 0x32, + 0x19, 0xed, 0xdb, 0xd3, 0xff, 0x24, 0x2b, 0x00, 0xcc, 0xff, 0x24, 0xf0, + 0xcc, 0x19, 0x27, 0xe2, 0xc9, 0xff, 0x0e, 0x19, 0x0a, 0x00, 0xe9, 0xe9, + 0xff, 0xf7, 0x2b, 0x2b, 0x03, 0xde, 0xe2, 0x03, 0xfb, 0x0e, 0x39, 0xed, + 0xd0, 0xed, 0x1c, 0xf7, 0x00, 0x3d, 0x00, 0xd7, 0xed, 0x00, 0xde, 0x1c, + 0x27, 0xed, 0xc1, 0xfb, 0x27, 0x1c, 0xf7, 0xde, 0xe2, 0x27, 0x19, 0xd7, + 0x03, 0x2b, 0xe5, 0xc9, 0xde, 0x07, 0x15, 0xff, 0x0a, 0x19, 0xc5, 0xe5, + 0x20, 0x2b, 0xf0, 0xcc, 0x00, 0x20, 0xf4, 0xdb, 0x36, 0x15, 0xde, 0xed, + 0x1c, 0x27, 0xf0, 0xd7, 0xf4, 0x0e, 0xf0, 0x1c, 0x15, 0xf4, 0xfb, 0xf7, + 0xff, 0x0e, 0xdb, 0xcc, 0x12, 0x27, 0x0a, 0xed, 0x03, 0xe2, 0xcc, 0x03, + 0x0e, 0x03, 0x0e, 0xf7, 0xf4, 0xf0, 0xd7, 0x0a, 0x27, 0x27, 0xff, 0xe5, + 0xf7, 0xe9, 0x0e, 0x32, 0x00, 0xd0, 0xde, 0x1c, 0x19, 0xf7, 0x0a, 0xf0, + 0xcc, 0xff, 0x24, 0x2e, 0x19, 0xf0, 0xf4, 0xde, 0xd7, 0x12, 0x2b, 0x27, + 0xf7, 0xe2, 0xe9, 0xe9, 0x00, 0x2b, 0x03, 0xd3, 0xc9, 0xf4, 0x19, 0x0e, + 0xed, 0xe9, 0xfb, 0x27, 0xde, 0xd3, 0x24, 0x24, 0xf0, 0xcc, 0xed, 0x24, + 0x1c, 0xfb, 0x0a, 0x24, 0xde, 0xe5, 0x00, 0x1c, 0xf7, 0xdb, 0x12, 0x0e, + 0xf4, 0xd0, 0x0e, 0x36, 0x0e, 0xed, 0xe2, 0xdb, 0x0e, 0x19, 0xd3, 0xe2, + 0x2b, 0x12, 0xd0, 0xf0, 0x2e, 0xe5, 0xc9, 0x0a, 0x20, 0xe9, 0x07, 0x36, + 0xed, 0xd0, 0xe2, 0x0e, 0x07, 0x12, 0x27, 0xe9, 0xdb, 0x0e, 0x20, 0xd3, + 0xfb, 0x2b, 0x0a, 0xdb, 0xe9, 0x19, 0x03, 0xf4, 0x0a, 0xdb, 0x00, 0x32, + 0x03, 0xd7, 0xd3, 0xfb, 0x03, 0xe5, 0x12, 0x27, 0xff, 0xed, 0xf7, 0xf0, + 0xfb, 0x32, 0x00, 0xc5, 0xff, 0x32, 0x19, 0xe2, 0xcc, 0xed, 0x0e, 0x20, + 0x27, 0xf0, 0xed, 0x0e, 0xed, 0xdb, 0x27, 0x32, 0x1c, 0xf7, 0xf4, 0xe5, + 0xd3, 0xff, 0x20, 0x27, 0x07, 0xe5, 0xdb, 0xdb, 0x0e, 0x1c, 0x0a, 0xd7, + 0xe9, 0x07, 0x15, 0x0a, 0xff, 0xc9, 0xd7, 0x07, 0x1c, 0xf0, 0xe5, 0x00, + 0x15, 0x20, 0xf0, 0xd3, 0x07, 0x3d, 0x0a, 0xe5, 0xd7, 0xe9, 0x24, 0x2b, + 0x00, 0xcc, 0x00, 0x3d, 0x15, 0xe5, 0xfb, 0x0e, 0xdb, 0xf7, 0x32, 0x20, + 0xed, 0xdb, 0x0e, 0x24, 0xd3, 0xd7, 0x07, 0x2b, 0xff, 0xc5, 0x00, 0x2b, + 0xe9, 0xde, 0x32, 0x00, 0xc1, 0xd0, 0xf7, 0x0a, 0x19, 0x19, 0xde, 0xe2, + 0x32, 0x15, 0xde, 0x12, 0x12, 0xcc, 0xf7, 0x27, 0xfb, 0xd7, 0x2b, 0x27, + 0xe9, 0xd3, 0x00, 0x2e, 0xed, 0xed, 0x39, 0x07, 0xd7, 0x00, 0x39, 0xff, + 0xd7, 0xed, 0x24, 0xf7, 0xcc, 0x20, 0x0e, 0xd0, 0xfb, 0x32, 0x07, 0xd3, + 0xf0, 0x0e, 0xc9, 0xf0, 0x24, 0x20, 0xed, 0xe5, 0x1c, 0xcc, 0xf0, 0x2b, + 0x0a, 0xf7, 0xff, 0xf4, 0xde, 0x0a, 0x32, 0x20, 0xf0, 0xdb, 0xdb, 0x07, + 0x32, 0x15, 0xdb, 0xd0, 0x0a, 0x27, 0x00, 0x2b, 0x07, 0xe9, 0xe2, 0xf4, + 0xf0, 0xff, 0x1c, 0x0a, 0xe5, 0xf4, 0xe5, 0x00, 0x2b, 0xff, 0xc5, 0xf4, + 0x24, 0x03, 0x00, 0x15, 0x0e, 0xe9, 0xd7, 0x00, 0x39, 0x15, 0xde, 0xde, + 0x03, 0xf4, 0x03, 0x36, 0xf7, 0xd0, 0xf4, 0x20, 0xe5, 0xf0, 0x36, 0xfb, + 0xc9, 0xe5, 0x24, 0x2b, 0x07, 0xf7, 0x00, 0xd7, 0xe9, 0x1c, 0x27, 0xfb, + 0xf4, 0xe2, 0xde, 0x12, 0x27, 0xff, 0xfb, 0x24, 0xe2, 0xd0, 0x03, 0x36, + 0x0e, 0xd7, 0xd7, 0x00, 0x1c, 0x03, 0x00, 0xff, 0xd7, 0x0a, 0x20, 0xd0, + 0xe5, 0x27, 0x20, 0xe9, 0xd0, 0x00, 0x07, 0xf4, 0x00, 0x19, 0xfb, 0xd7, + 0x12, 0x2b, 0xf4, 0xc9, 0xe9, 0x20, 0x27, 0x15, 0x00, 0xe9, 0xe5, 0x27, + 0x19, 0xd0, 0x03, 0x19, 0xde, 0xf0, 0x24, 0xed, 0xdb, 0x12, 0x24, 0xf0, + 0xc9, 0x07, 0x00, 0x1c, 0x19, 0xd0, 0xe5, 0x24, 0x24, 0xe2, 0xc9, 0xed, + 0x1c, 0x27, 0x19, 0xfb, 0xe2, 0xd3, 0xf7, 0x19, 0x19, 0xe5, 0xde, 0x27, + 0x19, 0xd3, 0xe5, 0xff, 0x00, 0x2e, 0x0e, 0xd7, 0xd7, 0x19, 0x32, 0x0e, + 0x00, 0xe9, 0xe9, 0xff, 0x0e, 0x0e, 0x03, 0xde, 0xd0, 0x12, 0x2b, 0x15, + 0xe2, 0xd3, 0x12, 0x2b, 0xdb, 0xcc, 0x07, 0x2b, 0x1c, 0xe2, 0xcc, 0xf4, + 0x15, 0x2b, 0x1c, 0xe9, 0xf7, 0xe9, 0xdb, 0x15, 0x0a, 0x03, 0x00, 0xf0, + 0x36, 0xff, 0xc9, 0xff, 0x32, 0x07, 0xd3, 0xf0, 0x15, 0x1c, 0x0e, 0xd0, + 0xdb, 0x03, 0x00, 0xf7, 0x32, 0x0e, 0xd0, 0xd0, 0x03, 0x24, 0x0e, 0x03, + 0x19, 0x00, 0xfb, 0xff, 0xe5, 0xdb, 0x03, 0x0e, 0xdb, 0x03, 0x15, 0xde, + 0xfb, 0x07, 0xf4, 0x0e, 0x00, 0xff, 0x00, 0x07, 0x1c, 0xc9, 0xdb, 0x15, + 0x2b, 0x19, 0x00, 0xff, 0xde, 0xf4, 0x19, 0xf4, 0x00, 0x0e, 0x12, 0xff, + 0xed, 0xc5, 0xe2, 0x00, 0x0e, 0x15, 0x12, 0xe5, 0xd0, 0x0e, 0x0a, 0xff, + 0x36, 0x0a, 0xe9, 0xe9, 0x00, 0xed, 0xf7, 0x00, 0x07, 0x1c, 0xf0, 0xe5, + 0x00, 0x19, 0xfb, 0xff, 0xf4, 0xde, 0x2b, 0x2b, 0x00, 0xd7, 0xf7, 0x12, + 0x07, 0x0e, 0xf4, 0xed, 0xf4, 0x2e, 0x07, 0xe9, 0xd0, 0x03, 0x32, 0x03, + 0xcc, 0xd0, 0xfb, 0x15, 0x0e, 0x00, 0xd7, 0x00, 0x2e, 0x00, 0xc9, 0xdb, + 0x07, 0x07, 0xfb, 0x27, 0x12, 0xed, 0xf7, 0x2b, 0xe5, 0xd0, 0x1c, 0x2e, + 0xf0, 0xed, 0x19, 0xd3, 0xff, 0x39, 0x1c, 0xe9, 0xf0, 0x19, 0xf7, 0xd0, + 0x03, 0xfb, 0x00, 0x36, 0x0a, 0xd7, 0xd7, 0x07, 0x0e, 0xf4, 0x0e, 0xe2, + 0xd3, 0x0e, 0x2e, 0x15, 0xdb, 0xd0, 0xe9, 0xff, 0x0e, 0x24, 0xe2, 0xe9, + 0x36, 0x00, 0xc9, 0xf7, 0x20, 0x24, 0x12, 0x00, 0xdb, 0xdb, 0x07, 0x2e, + 0x1c, 0xe2, 0xdb, 0x24, 0x2e, 0xed, 0xdb, 0xd3, 0xf4, 0x15, 0x1c, 0xe9, + 0xd3, 0x12, 0x24, 0x0e, 0xd7, 0xde, 0x00, 0x19, 0x15, 0xf7, 0xd3, 0xe9, + 0x2e, 0x07, 0xc9, 0xf4, 0x2b, 0xff, 0x07, 0x15, 0xc9, 0xde, 0x15, 0x27, + 0x0a, 0x00, 0x19, 0xde, 0xd3, 0xf0, 0x27, 0x19, 0xed, 0xf4, 0x07, 0x20, + 0xd7, 0xdb, 0x27, 0x15, 0xd0, 0xfb, 0x32, 0x07, 0xf7, 0xff, 0xe2, 0xcc, + 0xf0, 0x12, 0x20, 0x19, 0xf0, 0xd0, 0xd3, 0x0a, 0x24, 0x15, 0xff, 0x00, + 0xd3, 0xde, 0x1c, 0x27, 0x00, 0xf4, 0xff, 0xde, 0x0a, 0x3d, 0x0a, 0xdb, + 0xe5, 0x12, 0xf4, 0xf0, 0x40, 0x0a, 0xdb, 0xfb, 0xfb, 0xd0, 0x19, 0x2e, + 0x1c, 0xe9, 0xd3, 0xd7, 0x0e, 0x2e, 0x1c, 0xe9, 0xd7, 0xde, 0xff, 0x20, + 0x1c, 0xdb, 0xd7, 0x00, 0x0e, 0xf0, 0xff, 0x2b, 0x12, 0xde, 0xc9, 0xf7, + 0x27, 0x19, 0x00, 0x0e, 0x03, 0xd0, 0xe9, 0x20, 0x27, 0xed, 0xf7, 0x20, + 0xfb, 0xdb, 0x03, 0x2e, 0xde, 0xc5, 0xf4, 0x19, 0x15, 0xff, 0x15, 0xff, + 0xd3, 0x07, 0x00, 0xff, 0x19, 0xe2, 0x00, 0x27, 0xde, 0xd0, 0x0a, 0x27, + 0xe9, 0xed, 0x32, 0xf4, 0xcc, 0x00, 0x32, 0x15, 0xde, 0xff, 0x27, 0xd3, + 0xd7, 0x0a, 0x15, 0xff, 0x03, 0xf0, 0x19, 0x20, 0xe2, 0xed, 0x19, 0xf4, + 0xd0, 0x00, 0x32, 0x12, 0xf7, 0xed, 0xd0, 0xf4, 0x19, 0x2e, 0x12, 0xe5, + 0xd7, 0xdb, 0x15, 0x1c, 0xf0, 0x03, 0x24, 0xd7, 0xc9, 0xf7, 0x1c, 0xff, + 0x19, 0x19, 0xd7, 0xe5, 0x2b, 0x20, 0xe5, 0xd0, 0xff, 0x1c, 0xd7, 0x03, + 0x2e, 0xff, 0xd7, 0x03, 0x0a, 0xd3, 0x00, 0x36, 0x0a, 0xe9, 0xe2, 0xdb, + 0xff, 0x03, 0xff, 0x0e, 0x19, 0x00, 0xd7, 0xd7, 0x07, 0x19, 0x2b, 0x00, + 0xdb, 0xff, 0x1c, 0x03, 0x00, 0xdb, 0xdb, 0x24, 0x27, 0xde, 0xcc, 0x0a, + 0x2b, 0xf0, 0xff, 0x15, 0xd3, 0x07, 0x1c, 0xd7, 0xd7, 0x12, 0x27, 0xed, + 0xe5, 0x36, 0xf4, 0xd0, 0x19, 0x1c, 0xc9, 0xed, 0x2e, 0x27, 0xf0, 0xdb, + 0xde, 0xfb, 0x20, 0x27, 0xed, 0xc9, 0xf0, 0x19, 0x0a, 0x19, 0x12, 0xe9, + 0xde, 0x0e, 0x36, 0xfb, 0xdb, 0x00, 0x24, 0xde, 0xe2, 0x24, 0x0a, 0xcc, + 0xf0, 0x2e, 0x00, 0xc1, 0xf4, 0x2b, 0x0a, 0xd3, 0xf7, 0x00, 0xd7, 0x1c, + 0x27, 0xfb, 0xe9, 0x24, 0xf7, 0xc5, 0xf4, 0x24, 0x24, 0x0a, 0x00, 0xe5, + 0xde, 0x07, 0x24, 0xf7, 0xde, 0x15, 0x1c, 0xe5, 0xc5, 0xf4, 0x19, 0x19, + 0x20, 0xfb, 0xd3, 0xf0, 0x2e, 0x0a, 0xd0, 0x00, 0x24, 0xe2, 0x0a, 0x07, + 0xd7, 0xfb, 0xff, 0xe5, 0xf0, 0x07, 0x24, 0x19, 0xde, 0xd7, 0x0a, 0x00, + 0xf4, 0x0e, 0x27, 0xf0, 0xcc, 0x00, 0x2b, 0x03, 0xf4, 0x32, 0x0a, 0xdb, + 0xed, 0x03, 0x00, 0x12, 0xff, 0xd0, 0x00, 0x32, 0x0e, 0xd7, 0xe9, 0x27, + 0xf7, 0xc1, 0x00, 0x1c, 0x00, 0x0a, 0x03, 0xc9, 0xe2, 0x19, 0x2b, 0x15, + 0xed, 0xe9, 0xdb, 0xf7, 0x27, 0x1c, 0xf0, 0xe5, 0x03, 0xff, 0x00, 0xf4, + 0xed, 0x39, 0x12, 0xd7, 0xde, 0x0e, 0x24, 0xff, 0xe5, 0x07, 0x15, 0x00, + 0xd3, 0xfb, 0x2e, 0x15, 0xd7, 0xe5, 0x2b, 0x24, 0xd7, 0xde, 0x1c, 0x19, + 0xd3, 0x00, 0x2b, 0xed, 0xd0, 0x15, 0x19, 0xff, 0xf0, 0xdb, 0xfb, 0x27, + 0x0e, 0xe2, 0x03, 0x32, 0xff, 0xde, 0xe5, 0x0a, 0x00, 0x0e, 0x00, 0xc9, + 0x07, 0x2b, 0x07, 0xd0, 0xe2, 0x19, 0x0e, 0xf4, 0x03, 0x00, 0xf4, 0xe2, + 0x15, 0x15, 0xed, 0xe9, 0x24, 0x2e, 0xf0, 0xd3, 0x00, 0x39, 0x00, 0xd3, + 0x0a, 0x27, 0xf4, 0xd7, 0xf0, 0xf4, 0xff, 0x12, 0xfb, 0xf4, 0xd7, 0x0e, + 0x27, 0xff, 0xd0, 0xed, 0x2b, 0x2b, 0x00, 0xe2, 0xed, 0xed, 0xf7, 0x24, + 0x27, 0xe9, 0xe5, 0x24, 0xf4, 0xcc, 0x03, 0x2e, 0x20, 0xed, 0x03, 0x0e, + 0xde, 0xdb, 0xe9, 0x19, 0x1c, 0xe9, 0xf7, 0x36, 0xf0, 0xde, 0x20, 0xff, + 0xd0, 0x0e, 0x32, 0x00, 0xd3, 0xd7, 0x00, 0x03, 0xf4, 0x32, 0xfb, 0xd7, + 0x19, 0x0a, 0xc1, 0xe9, 0x20, 0x27, 0x00, 0xed, 0x07, 0xf0, 0xf0, 0x03, + 0x19, 0xdb, 0xed, 0x32, 0x20, 0xf0, 0xe9, 0x12, 0xe5, 0xed, 0x2b, 0xff, + 0xdb, 0x00, 0x1c, 0xed, 0xcc, 0x0a, 0x20, 0xe2, 0xf0, 0x3d, 0x03, 0xd3, + 0xd0, 0xf4, 0x19, 0x1c, 0x07, 0xe9, 0xed, 0x19, 0x0e, 0xd7, 0xde, 0x19, + 0x24, 0x0a, 0xe9, 0xe2, 0x15, 0xfb, 0xfb, 0x27, 0x00, 0xd7, 0xd7, 0x0e, + 0x2b, 0xf0, 0xc9, 0x03, 0x32, 0x07, 0xd3, 0x07, 0x24, 0xdb, 0xe9, 0x00, + 0xff, 0xfb, 0xf4, 0xed, 0x0a, 0x2b, 0x0e, 0xf0, 0xd7, 0xed, 0x19, 0x0a, + 0x00, 0x0e, 0xff, 0xf0, 0x03, 0x27, 0xe2, 0xe5, 0x0e, 0x32, 0xe9, 0xd0, + 0x12, 0x2b, 0xdb, 0xe2, 0x12, 0xfb, 0x03, 0x19, 0xd7, 0xc9, 0xe9, 0x0e, + 0x12, 0x03, 0x07, 0xf0, 0x0a, 0x07, 0xde, 0xdb, 0x00, 0x27, 0x15, 0xd7, + 0xdb, 0x07, 0x03, 0xe5, 0x19, 0x20, 0xdb, 0xf7, 0x3d, 0x07, 0xd7, 0xd3, + 0x00, 0x20, 0xfb, 0x19, 0x20, 0x00, 0xe9, 0xd0, 0xf0, 0x24, 0x00, 0x03, + 0x36, 0xff, 0xdb, 0x07, 0x19, 0xde, 0xff, 0xf0, 0xed, 0x24, 0xfb, 0xc5, + 0x0a, 0x24, 0xe5, 0xf7, 0x39, 0xf4, 0xcc, 0xe9, 0x1c, 0xfb, 0xd3, 0x0e, + 0x24, 0x19, 0x00, 0xff, 0xde, 0xd7, 0x0a, 0x1c, 0x00, 0x0a, 0x12, 0xde, + 0x24, 0x15, 0xd3, 0xf4, 0x2b, 0x12, 0xe5, 0xed, 0xf4, 0xde, 0x00, 0x27, + 0x12, 0xf7, 0xdb, 0x07, 0x24, 0xd7, 0xc9, 0xff, 0x15, 0xfb, 0xf4, 0x19, + 0x0a, 0xd0, 0x0e, 0x20, 0xde, 0xf4, 0x27, 0x0e, 0xdb, 0x12, 0x07, 0xd7, + 0x00, 0x36, 0x15, 0xde, 0xde, 0xf7, 0x00, 0x2b, 0x0e, 0xe9, 0xf4, 0x0e, + 0xf7, 0x07, 0x19, 0xd0, 0xd3, 0x0e, 0x2e, 0x07, 0xdb, 0xe2, 0xff, 0x24, + 0x15, 0xe9, 0xd7, 0x00, 0x12, 0x19, 0xf7, 0xd3, 0xfb, 0x24, 0x20, 0xed, + 0xc9, 0xe5, 0x1c, 0x1c, 0x00, 0xf7, 0xf4, 0xed, 0x32, 0x0e, 0xd3, 0xde, + 0x1c, 0x32, 0xff, 0xde, 0xf7, 0x07, 0x15, 0xfb, 0xe9, 0x2e, 0x00, 0xcc, + 0xf4, 0x27, 0xfb, 0xd0, 0x24, 0x1c, 0xd3, 0xed, 0x36, 0xfb, 0xcc, 0x0e, + 0x32, 0xe5, 0xd3, 0x19, 0x27, 0xd0, 0xd3, 0x0a, 0x0a, 0xe2, 0x32, 0x24, + 0xe9, 0xd0, 0xe9, 0x24, 0x0e, 0xdb, 0x00, 0x32, 0x0e, 0xde, 0xd7, 0xff, + 0x12, 0x0e, 0x20, 0x00, 0xfb, 0xf4, 0xdb, 0x15, 0x36, 0x0a, 0xde, 0xfb, + 0x00, 0xe5, 0xe5, 0x15, 0x15, 0xd0, 0xf4, 0x32, 0x12, 0xed, 0x00, 0xdb, + 0xd7, 0x07, 0x2b, 0x15, 0xdb, 0xde, 0x19, 0x0e, 0xc5, 0xed, 0x27, 0x20, + 0xf7, 0xe5, 0x20, 0x00, 0xcc, 0xf0, 0x32, 0x1c, 0xed, 0xfb, 0xf4, 0xe2, + 0x00, 0xff, 0xed, 0x0a, 0x2e, 0x07, 0xe9, 0xf7, 0xde, 0xed, 0x15, 0x12, + 0x00, 0xe5, 0xe2, 0x2b, 0x19, 0xf4, 0xd3, 0xed, 0x27, 0x2b, 0x00, 0xd3, + 0xde, 0x12, 0x12, 0xfb, 0xff, 0xde, 0x2b, 0x27, 0xe2, 0xd7, 0xf7, 0x00, + 0xf4, 0x0a, 0xff, 0xe9, 0xf7, 0x24, 0x07, 0xf4, 0xc9, 0x00, 0x27, 0xff, + 0x00, 0x00, 0xc9, 0xe9, 0x20, 0x20, 0x03, 0x00, 0x27, 0x00, 0xde, 0xf0, + 0x12, 0xf7, 0xf4, 0x20, 0x07, 0xd0, 0xd3, 0x0a, 0x24, 0xf0, 0xf7, 0x12, + 0xc5, 0x03, 0x32, 0x03, 0xd0, 0xcc, 0x00, 0x20, 0x24, 0x12, 0xd7, 0xe2, + 0x0e, 0x03, 0xe2, 0x1c, 0x1c, 0xed, 0xf7, 0x20, 0xde, 0xd3, 0x19, 0x20, + 0xe2, 0x00, 0x24, 0xe2, 0xe9, 0xf7, 0xff, 0x24, 0xe5, 0xed, 0x39, 0x1c, + 0xed, 0xd7, 0xe9, 0x1c, 0xff, 0xed, 0x2b, 0xe9, 0xc9, 0x15, 0x2b, 0xf7, + 0xe9, 0x24, 0xf7, 0xf4, 0x0e, 0xe2, 0x00, 0x00, 0xf7, 0xf7, 0xf4, 0xfb, + 0x24, 0x24, 0xe5, 0xd0, 0xe9, 0x1c, 0x2b, 0x03, 0xd7, 0x00, 0x00, 0xd0, + 0xe9, 0x1c, 0x1c, 0x00, 0xf4, 0x00, 0xf7, 0xed, 0xff, 0x27, 0x03, 0xd3, + 0x0e, 0x32, 0xf7, 0xde, 0xfb, 0xed, 0xf7, 0x27, 0x15, 0xde, 0x07, 0x1c, + 0xd0, 0xd7, 0x0a, 0x2e, 0x15, 0xf7, 0xe2, 0xd7, 0xfb, 0x1c, 0x15, 0xe9, + 0xe9, 0x0e, 0xed, 0xe9, 0x2b, 0x12, 0xd7, 0x00, 0x3d, 0x00, 0xdb, 0xff, + 0xff, 0xdb, 0x00, 0x2b, 0xfb, 0xc9, 0x00, 0x24, 0x00, 0x0a, 0x12, 0xd0, + 0xde, 0x19, 0x2e, 0x00, 0xcc, 0xe9, 0x27, 0x19, 0xd3, 0xf4, 0x39, 0x19, + 0xed, 0xd3, 0xe9, 0x27, 0x2e, 0x03, 0xf0, 0xdb, 0xd7, 0x03, 0x24, 0x12, + 0xde, 0xde, 0xf0, 0x20, 0x07, 0xed, 0x20, 0xf0, 0xd7, 0x00, 0x2e, 0xfb, + 0xd3, 0x19, 0x12, 0xc5, 0xed, 0x2b, 0x19, 0xe5, 0xf4, 0x24, 0xfb, 0xfb, + 0x0e, 0x07, 0xf4, 0x0a, 0xe9, 0xe2, 0x12, 0x24, 0xfb, 0xfb, 0x15, 0xe2, + 0x00, 0x20, 0xed, 0xd7, 0x07, 0x00, 0xf7, 0x0e, 0xf7, 0xf4, 0x00, 0xed, + 0xf0, 0x1c, 0x19, 0xd7, 0xde, 0x12, 0x00, 0x19, 0x1c, 0xe2, 0xe2, 0x12, + 0x2e, 0xe5, 0xdb, 0xff, 0xed, 0xff, 0x27, 0xf0, 0xf0, 0x39, 0xf7, 0xcc, + 0xd7, 0x0a, 0x20, 0x1c, 0x00, 0xd0, 0xd3, 0x0a, 0x27, 0x0a, 0xff, 0x1c, + 0xdb, 0xe5, 0x2e, 0x27, 0xde, 0xe5, 0x0e, 0xe9, 0xfb, 0x2e, 0x1c, 0xf0, + 0xe2, 0xd7, 0xff, 0x27, 0x1c, 0xfb, 0x03, 0xf4, 0xc9, 0x00, 0x2e, 0x03, + 0xd7, 0x12, 0x00, 0xbe, 0xf7, 0x20, 0x07, 0x00, 0x07, 0xd0, 0x1c, 0x2b, + 0xe5, 0xcc, 0xff, 0x20, 0xe9, 0x12, 0x32, 0xf0, 0xd7, 0x15, 0x20, 0xd3, + 0xff, 0x32, 0xe5, 0xe9, 0x2b, 0x03, 0xc9, 0xe5, 0x0a, 0x1c, 0x0e, 0xdb, + 0xe2, 0x24, 0x0e, 0xd0, 0xdb, 0x15, 0x2b, 0x20, 0x03, 0xed, 0xd7, 0xde, + 0x0a, 0x20, 0xed, 0xd3, 0x27, 0x20, 0xe5, 0xf4, 0x24, 0xed, 0xd0, 0x12, + 0x20, 0xe5, 0xde, 0x19, 0x1c, 0xd7, 0xe2, 0x12, 0x32, 0x1c, 0xfb, 0xf4, + 0xd7, 0xe2, 0x12, 0x2e, 0x1c, 0xe2, 0xe9, 0x1c, 0xfb, 0xc1, 0x00, 0x2b, + 0x03, 0xcc, 0xfb, 0x15, 0x03, 0x15, 0xf7, 0xe5, 0xde, 0x00, 0x24, 0x20, + 0xf7, 0xc9, 0xdb, 0x0a, 0x15, 0x15, 0x15, 0x07, 0xed, 0xdb, 0xf7, 0xff, + 0x07, 0x32, 0x19, 0xf0, 0xe9, 0xe9, 0xe5, 0x19, 0x12, 0xd0, 0x03, 0x32, + 0x0a, 0xde, 0xe2, 0x0e, 0xff, 0x0a, 0x24, 0xd7, 0xd0, 0x07, 0x27, 0xf4, + 0xf7, 0x07, 0xe2, 0x19, 0x36, 0xf7, 0xdb, 0xde, 0xf4, 0x00, 0x12, 0x12, + 0x0e, 0x03, 0xd0, 0xd7, 0x0a, 0x19, 0xfb, 0x24, 0x0e, 0xcc, 0xdb, 0x12, + 0x24, 0xf4, 0x00, 0x00, 0xd7, 0x0e, 0x32, 0xfb, 0xc5, 0xe5, 0x15, 0x15, + 0x15, 0x19, 0xed, 0xd7, 0xe2, 0x07, 0x00, 0x24, 0x24, 0xe9, 0xf0, 0xff, + 0xf0, 0xfb, 0xff, 0x24, 0x0e, 0xfb, 0xf4, 0xdb, 0x1c, 0x00, 0xc9, 0x07, + 0x32, 0x00, 0xd3, 0xf7, 0x07, 0xe9, 0xf0, 0x07, 0x0e, 0x1c, 0xed, 0xde, + 0x0a, 0x27, 0xe2, 0xf0, 0x0a, 0xe2, 0xff, 0x24, 0x1c, 0xd7, 0xe2, 0x20, + 0x0e, 0xf4, 0x0e, 0x12, 0xf7, 0xcc, 0x00, 0x24, 0xd3, 0xe9, 0x2e, 0x15, + 0xdb, 0xcc, 0xff, 0x2b, 0x24, 0xff, 0xc9, 0xed, 0x20, 0xfb, 0xed, 0x32, + 0x07, 0xd3, 0xe5, 0x27, 0x15, 0xcc, 0x00, 0x32, 0xf0, 0xdb, 0x27, 0x15, + 0xd0, 0x03, 0x24, 0xd0, 0xd3, 0x0e, 0x24, 0xd7, 0xe2, 0x27, 0x03, 0xde, + 0x27, 0x20, 0xd7, 0xdb, 0x1c, 0x2e, 0xf0, 0xde, 0x00, 0x0a, 0x0e, 0xf4, + 0xe9, 0xed, 0x00, 0x2b, 0x27, 0xf0, 0xd3, 0xed, 0x15, 0xfb, 0x20, 0x0e, + 0xd7, 0xd3, 0x03, 0x20, 0xf4, 0x07, 0xff, 0xd3, 0x07, 0x15, 0xde, 0x07, + 0x24, 0xdb, 0xc9, 0x00, 0x1c, 0xf7, 0x12, 0x20, 0xcc, 0xd0, 0x00, 0x1c, + 0x15, 0x0e, 0x03, 0xf0, 0xf4, 0x36, 0xfb, 0xf0, 0x12, 0xfb, 0xf7, 0x00, + 0xff, 0x0a, 0x00, 0x03, 0xde, 0xf7, 0x0e, 0x07, 0x19, 0xde, 0xd3, 0x03, + 0x07, 0xe2, 0x19, 0x12, 0xd3, 0xe5, 0x2b, 0x15, 0xd3, 0xde, 0x27, 0x0a, + 0xd3, 0x12, 0x1c, 0xcc, 0xd3, 0x0a, 0x19, 0xff, 0x20, 0x15, 0xd7, 0xde, + 0x1c, 0x2b, 0xe2, 0x03, 0x32, 0xe5, 0xd0, 0xed, 0x27, 0x15, 0xdb, 0xfb, + 0x20, 0xe2, 0x00, 0x36, 0xf0, 0xdb, 0xe9, 0xf0, 0x0a, 0x19, 0x2b, 0xf0, + 0xd3, 0xde, 0x00, 0x12, 0x00, 0x19, 0x0e, 0xed, 0xd0, 0xf0, 0x24, 0x27, + 0x15, 0xed, 0xdb, 0xf0, 0x2b, 0x00, 0xc1, 0x00, 0x27, 0xf7, 0xf4, 0x3d, + 0x00, 0xd7, 0xf0, 0x1c, 0x12, 0xdb, 0xe9, 0x2b, 0x03, 0xd7, 0xde, 0x19, + 0xff, 0x03, 0x20, 0xf0, 0x00, 0xf4, 0x0e, 0x0a, 0xc9, 0xed, 0x27, 0x24, + 0xed, 0xde, 0x00, 0xe9, 0xe5, 0x24, 0x20, 0xe2, 0xdb, 0x2b, 0x20, 0xde, + 0xe5, 0x24, 0x0e, 0xf7, 0xf7, 0xf7, 0xff, 0x1c, 0xf4, 0xe9, 0xff, 0xed, + 0xf7, 0x24, 0x19, 0xde, 0xd0, 0x00, 0x2e, 0xff, 0xe2, 0xf7, 0x12, 0xf4, + 0xdb, 0x20, 0x03, 0xe5, 0xf4, 0x24, 0x12, 0xde, 0xe2, 0xfb, 0x20, 0x1c, + 0xf7, 0xed, 0x07, 0xf7, 0xed, 0x2e, 0x0e, 0xf7, 0x0e, 0x03, 0xde, 0xf0, + 0x2e, 0x1c, 0xde, 0xd3, 0xf4, 0x0a, 0xf0, 0x12, 0x15, 0xd7, 0xdb, 0x00, + 0x20, 0x19, 0xde, 0xcc, 0xf0, 0x12, 0xf7, 0x03, 0x32, 0x03, 0xf7, 0xf7, + 0xdb, 0xfb, 0x32, 0x20, 0xf0, 0xd3, 0xe2, 0x0a, 0x20, 0x07, 0x00, 0x19, + 0xed, 0xcc, 0xf4, 0x27, 0x1c, 0xe9, 0xe2, 0x19, 0x1c, 0xf4, 0xff, 0x07, + 0x00, 0xcc, 0xde, 0x15, 0x2b, 0x1c, 0xf0, 0xe9, 0xe2, 0xde, 0x12, 0x2e, + 0x0a, 0xd3, 0xe2, 0xf4, 0xed, 0x0a, 0x24, 0xff, 0xcc, 0x00, 0x36, 0xfb, + 0xc9, 0xed, 0x27, 0x0e, 0xe5, 0x0a, 0x15, 0x00, 0xc9, 0xf0, 0x24, 0xfb, + 0xe5, 0x24, 0x2e, 0xf7, 0xdb, 0xed, 0x0a, 0x00, 0x00, 0xfb, 0xfb, 0x07, + 0x19, 0x07, 0xe9, 0xcc, 0x00, 0x27, 0xf0, 0x03, 0x0e, 0xc1, 0xe2, 0x0e, + 0x24, 0x15, 0xf0, 0x00, 0xf0, 0x07, 0x00, 0xe2, 0xf0, 0x07, 0x27, 0xe5, + 0xe5, 0x27, 0x03, 0xd7, 0xde, 0x19, 0xff, 0xfb, 0x32, 0x0e, 0xde, 0xd0, + 0xed, 0x20, 0x24, 0x12, 0xf4, 0xdb, 0xf0, 0x19, 0x19, 0xff, 0xde, 0x0e, + 0x24, 0xdb, 0xde, 0x20, 0xf7, 0xc9, 0x20, 0x20, 0xd7, 0xd7, 0x24, 0x0e, + 0xc9, 0xf7, 0x32, 0xf7, 0xe5, 0x0e, 0x03, 0xf4, 0xf7, 0xf4, 0x00, 0x03, + 0xff, 0xf4, 0x12, 0x24, 0xff, 0xe5, 0xde, 0x03, 0x2e, 0x12, 0xe2, 0xcc, + 0xff, 0x24, 0xf4, 0x00, 0x19, 0xd7, 0xe9, 0x36, 0x27, 0xed, 0xe2, 0x03, + 0xed, 0xe2, 0x24, 0xfb, 0xde, 0x0e, 0x0e, 0xf0, 0xd7, 0x19, 0x32, 0x00, + 0xd0, 0xdb, 0x12, 0x32, 0x0a, 0xdb, 0xed, 0xf7, 0xfb, 0x32, 0x20, 0xed, + 0xd0, 0xde, 0x12, 0x27, 0x19, 0x03, 0xf4, 0xfb, 0xde, 0xe2, 0x00, 0x1c, + 0x24, 0xf4, 0xcc, 0xde, 0x0a, 0x12, 0xf7, 0x1c, 0x00, 0xc5, 0x00, 0x39, + 0x0a, 0xe9, 0xf4, 0xe2, 0xf0, 0x19, 0x20, 0xed, 0xf0, 0x03, 0xde, 0x00, + 0x2e, 0x27, 0x00, 0xf0, 0xe5, 0xe2, 0xff, 0x1c, 0x20, 0xe5, 0xd7, 0xf0, + 0x12, 0x2e, 0x0e, 0xf0, 0xe9, 0xdb, 0xfb, 0x2b, 0x15, 0xd3, 0xcc, 0x03, + 0x19, 0xdb, 0x07, 0x36, 0xfb, 0xcc, 0xf0, 0x2b, 0x07, 0xe5, 0xff, 0x19, + 0x00, 0xd3, 0x07, 0x2b, 0xf0, 0xc9, 0x00, 0x2e, 0x00, 0xde, 0x1c, 0x0a, + 0xc9, 0x03, 0x32, 0x00, 0xdb, 0x19, 0xff, 0xc9, 0x07, 0x2b, 0xe9, 0xd7, + 0x19, 0xff, 0xde, 0x19, 0x03, 0x00, 0x07, 0xf4, 0xd7, 0x12, 0x2b, 0xf4, + 0xe9, 0x20, 0xe9, 0xd7, 0x27, 0x19, 0xd3, 0xed, 0x27, 0x03, 0xf0, 0x15, + 0xe2, 0xe2, 0x03, 0x07, 0xff, 0x19, 0x00, 0xd0, 0x0a, 0x27, 0xe2, 0xed, + 0x2b, 0x0a, 0xd3, 0xed, 0x27, 0x00, 0xc9, 0xff, 0x2b, 0x03, 0xd7, 0x24, + 0x20, 0xd7, 0xd0, 0xf4, 0x20, 0x15, 0x03, 0x03, 0xe2, 0xde, 0x03, 0x32, + 0x12, 0xd7, 0xd7, 0x0a, 0x24, 0xf0, 0xe5, 0x12, 0x1c, 0xd0, 0xfb, 0x2e, + 0x27, 0xf4, 0xdb, 0xe2, 0xf0, 0xf4, 0x19, 0x2b, 0x12, 0xde, 0xdb, 0xf4, + 0x07, 0x15, 0x12, 0xf4, 0xde, 0xde, 0x15, 0x2b, 0x0e, 0xe5, 0xdb, 0xf0, + 0x0e, 0x32, 0x0e, 0xdb, 0xdb, 0x03, 0x0e, 0x0a, 0x2e, 0x00, 0xe9, 0xf4, + 0xdb, 0xf4, 0x15, 0x27, 0x00, 0xf0, 0x00, 0xf7, 0xdb, 0x03, 0x2b, 0xed, + 0xc9, 0x03, 0x2e, 0x19, 0xf0, 0xf0, 0xdb, 0xe2, 0x19, 0x27, 0x12, 0xd7, + 0xd3, 0xed, 0x12, 0x19, 0x0a, 0x19, 0x00, 0xd3, 0xed, 0x20, 0xfb, 0xed, + 0x1c, 0x0a, 0xde, 0xfb, 0x2e, 0x00, 0x0a, 0xf0, 0xcc, 0xff, 0x20, 0x24, + 0xf7, 0xfb, 0xe2, 0xd7, 0x19, 0x2e, 0x03, 0xd7, 0x00, 0xf4, 0xc9, 0x15, + 0x27, 0x03, 0xc9, 0xff, 0x2e, 0xfb, 0xde, 0xff, 0x00, 0xf4, 0x07, 0x00, + 0x03, 0x00, 0xf7, 0x0a, 0x24, 0xe5, 0xdb, 0x20, 0x2b, 0xf7, 0xf7, 0xf0, + 0xd3, 0x12, 0x32, 0x0e, 0xd3, 0xe9, 0x20, 0x0e, 0xe5, 0xed, 0xe9, 0xfb, + 0x19, 0x1c, 0xe9, 0xe9, 0x20, 0xed, 0xde, 0x0e, 0xed, 0xf7, 0x36, 0x19, + 0xde, 0xd7, 0x00, 0x03, 0xed, 0x27, 0x12, 0xd3, 0xe5, 0x15, 0xf0, 0xe5, + 0x12, 0x24, 0x0a, 0xf0, 0xfb, 0x07, 0xfb, 0xe2, 0xf7, 0x19, 0x15, 0x0a, + 0xf4, 0xff, 0x20, 0xf7, 0xe2, 0xe9, 0x07, 0x1c, 0x0e, 0x00, 0xe9, 0xd0, + 0xe5, 0x12, 0x27, 0x0a, 0xd0, 0xd3, 0x00, 0x0e, 0xff, 0x03, 0xe2, 0xff, + 0x27, 0x24, 0xf4, 0xd3, 0xff, 0x0a, 0xff, 0x19, 0xfb, 0xed, 0x15, 0x1c, + 0xf0, 0xde, 0xf7, 0x2b, 0x19, 0xd7, 0xd3, 0x03, 0x07, 0xe2, 0x24, 0x19, + 0xd7, 0xdb, 0x20, 0x2e, 0xf7, 0xd0, 0xf0, 0x20, 0x1c, 0xe2, 0xd7, 0x03, + 0xff, 0x12, 0x19, 0xd3, 0xd7, 0x12, 0x27, 0x03, 0xde, 0xfb, 0xf7, 0x07, + 0x24, 0x03, 0xde, 0xe2, 0x19, 0x19, 0x07, 0xe9, 0xe9, 0x19, 0x15, 0xff, + 0xd7, 0xdb, 0x15, 0x2e, 0x03, 0xdb, 0xdb, 0xfb, 0x0e, 0x00, 0x00, 0xff, + 0xe9, 0xf7, 0x15, 0x07, 0xed, 0xf7, 0x00, 0xff, 0x00, 0x0e, 0xf7, 0xe9, + 0x2b, 0x03, 0xd0, 0xf7, 0x0a, 0x19, 0x0a, 0x00, 0xf7, 0xdb, 0xf0, 0x32, + 0x12, 0xe2, 0x00, 0x0a, 0xd3, 0xed, 0x24, 0x15, 0xe2, 0xf4, 0x2e, 0x07, + 0xf0, 0xe5, 0xde, 0x07, 0x27, 0xf4, 0xe2, 0x1c, 0xfb, 0xc9, 0x00, 0x2e, + 0x00, 0xe9, 0x07, 0x0a, 0xe2, 0xd7, 0x03, 0x1c, 0x15, 0xf4, 0xe5, 0x0e, + 0x15, 0xfb, 0xed, 0xed, 0x12, 0xed, 0x1c, 0x32, 0xf7, 0xdb, 0xde, 0xf0, + 0x0a, 0x27, 0x12, 0x03, 0xfb, 0xd7, 0xe5, 0x07, 0x20, 0x1c, 0xf4, 0xf4, + 0xe5, 0xf0, 0x24, 0x00, 0xfb, 0xf7, 0xf7, 0xf0, 0x1c, 0x20, 0xd3, 0xd0, + 0x0a, 0x07, 0xe2, 0x2e, 0x24, 0xf7, 0xd7, 0xe9, 0xff, 0xf7, 0x12, 0x24, + 0x00, 0xcc, 0xe2, 0x20, 0x2b, 0x00, 0xd7, 0xf4, 0x0e, 0xed, 0x0e, 0x24, + 0xe9, 0xcc, 0xff, 0x2b, 0x15, 0x00, 0x00, 0x03, 0xd3, 0xdb, 0x03, 0x24, + 0x24, 0xff, 0xd7, 0x00, 0x00, 0xe5, 0x2e, 0x12, 0xd3, 0xde, 0x12, 0x1c, + 0xf7, 0x07, 0xf0, 0xd3, 0x00, 0x24, 0x15, 0xe2, 0xf7, 0x19, 0xe2, 0xd7, + 0x12, 0x27, 0x0e, 0xfb, 0xd7, 0xe5, 0x0e, 0x00, 0x0a, 0x19, 0xe9, 0xcc, + 0x00, 0x27, 0x0e, 0xe9, 0xe9, 0xed, 0x07, 0x27, 0x0e, 0xdb, 0xf4, 0x15, + 0xed, 0xf7, 0x19, 0xff, 0xff, 0x27, 0xf4, 0xdb, 0xff, 0x32, 0x20, 0xff, + 0xf4, 0xed, 0xde, 0xff, 0x2e, 0xff, 0xc5, 0xfb, 0x27, 0x00, 0xcc, 0x0e, + 0x1c, 0xd0, 0xe2, 0x1c, 0x07, 0xdb, 0x0a, 0x2b, 0x00, 0xf4, 0xed, 0xed, + 0x15, 0x0e, 0xf0, 0xf4, 0xed, 0xff, 0x15, 0x15, 0xff, 0x12, 0x00, 0xe9, + 0x00, 0x07, 0xf7, 0xe9, 0x1c, 0x24, 0xe5, 0xe9, 0x15, 0x07, 0xe5, 0x0e, + 0x07, 0xcc, 0x03, 0x39, 0x07, 0xd7, 0xe9, 0x0e, 0xf4, 0xfb, 0x2b, 0xed, + 0xc1, 0xe2, 0x07, 0x15, 0x19, 0x00, 0xff, 0xe5, 0xe5, 0x00, 0x00, 0x00, + 0xed, 0x03, 0x0a, 0xd3, 0x07, 0x2b, 0x00, 0xf4, 0xed, 0x00, 0x00, 0x03, + 0x27, 0x07, 0xde, 0xe2, 0x00, 0x27, 0x27, 0xf7, 0xd7, 0xd7, 0x0e, 0x2e, + 0x03, 0xf4, 0xf7, 0xe2, 0x0a, 0x20, 0xfb, 0xed, 0x19, 0xf7, 0xc1, 0xff, + 0x19, 0xfb, 0xff, 0x03, 0xd0, 0x03, 0x27, 0xe2, 0xf4, 0x20, 0xd3, 0xe2, + 0x24, 0x2b, 0xfb, 0xd3, 0x1c, 0x07, 0xc9, 0x19, 0x36, 0x07, 0xd7, 0x00, + 0x15, 0xe9, 0x27, 0x0a, 0xcc, 0xf0, 0x2b, 0x07, 0xe2, 0x19, 0x00, 0xf0, + 0xfb, 0xd0, 0x00, 0x2e, 0x19, 0xdb, 0xd3, 0xe9, 0xf4, 0x07, 0x20, 0x07, + 0xed, 0xf7, 0xe2, 0xf7, 0x27, 0x03, 0xdb, 0x03, 0x15, 0xf7, 0xf4, 0x0a, + 0x00, 0xe9, 0xff, 0xff, 0x0a, 0x07, 0x07, 0xe9, 0xed, 0x1c, 0x0a, 0xed, + 0x03, 0x1c, 0xe2, 0xdb, 0x20, 0x19, 0xd7, 0xf7, 0x36, 0x0a, 0xdb, 0xf0, + 0x12, 0xe9, 0xfb, 0x1c, 0x0e, 0xf7, 0xed, 0x00, 0xe9, 0xf4, 0x03, 0x00, + 0x20, 0xff, 0xcc, 0xe5, 0x12, 0x20, 0x03, 0xfb, 0xe2, 0xe9, 0x15, 0x12, + 0xfb, 0xd3, 0xf4, 0x24, 0x0e, 0x00, 0x07, 0xfb, 0xdb, 0xf0, 0x07, 0x19, + 0x27, 0xf4, 0xdb, 0x03, 0x0e, 0xe5, 0x0a, 0x20, 0xe2, 0xdb, 0x19, 0x1c, + 0xd7, 0xf4, 0x19, 0xe2, 0xe9, 0x12, 0x20, 0x00, 0xf0, 0xf7, 0xdb, 0xed, + 0x20, 0x27, 0x00, 0xcc, 0xdb, 0x0e, 0x24, 0x00, 0xe9, 0xf7, 0x0a, 0xff, + 0x0e, 0x27, 0xf4, 0xd3, 0xe9, 0x0a, 0x07, 0x12, 0x0a, 0x03, 0x00, 0xe9, + 0xd3, 0x00, 0x20, 0x1c, 0x00, 0xe5, 0xd7, 0xf0, 0x20, 0x2b, 0xff, 0xe2, + 0xed, 0xdb, 0x15, 0x2b, 0xf7, 0xcc, 0xff, 0x07, 0x07, 0x03, 0x0e, 0xf7, + 0xdb, 0x15, 0x00, 0xd0, 0x0a, 0x32, 0x03, 0xf4, 0xf4, 0xe9, 0x0e, 0x2b, + 0xf0, 0xc9, 0xe2, 0x15, 0x27, 0x15, 0xfb, 0xed, 0xe2, 0xe9, 0x12, 0x1c, + 0xe5, 0xed, 0x12, 0xfb, 0xe9, 0x07, 0x0e, 0x0e, 0xff, 0xf7, 0xff, 0xdb, + 0x0a, 0x15, 0xe2, 0xed, 0x07, 0x15, 0x19, 0x0a, 0xe2, 0xf0, 0xf0, 0xed, + 0x27, 0x24, 0xed, 0xe2, 0x12, 0xf7, 0xff, 0x1c, 0x00, 0xd0, 0xf0, 0x2b, + 0x03, 0xdb, 0x07, 0x2b, 0xf0, 0xd0, 0xfb, 0x0e, 0x03, 0x12, 0xfb, 0xe5, + 0xf7, 0xff, 0x2b, 0x2b, 0xf7, 0xe2, 0xe9, 0xf7, 0xed, 0xff, 0x0e, 0x24, + 0xf7, 0xd7, 0xf4, 0x0e, 0x15, 0x0e, 0xf4, 0xd3, 0xe2, 0x12, 0x19, 0x0e, + 0x12, 0xe5, 0xcc, 0xf7, 0x20, 0xff, 0x03, 0x1c, 0xdb, 0xe2, 0x27, 0x32, + 0x00, 0xe9, 0x15, 0xe9, 0xc9, 0x00, 0x27, 0x12, 0xf0, 0x00, 0xf7, 0xd7, + 0x15, 0x2b, 0x00, 0xd7, 0xe2, 0xf7, 0x15, 0x27, 0xf4, 0xe9, 0x0a, 0xe2, + 0xf4, 0x19, 0x12, 0xed, 0xd7, 0xff, 0x0a, 0xf4, 0x12, 0x2b, 0xfb, 0xe2, + 0xd0, 0xf4, 0x24, 0x0e, 0xf4, 0xf4, 0xe5, 0x0e, 0x2e, 0x00, 0xd0, 0xf4, + 0x2b, 0x00, 0xed, 0x19, 0x00, 0xd7, 0x19, 0x24, 0xe5, 0xf4, 0x19, 0x19, + 0xe9, 0xcc, 0xe5, 0x0a, 0x15, 0x20, 0x00, 0xdb, 0xe9, 0x0a, 0x20, 0x12, + 0xe5, 0xd0, 0xf0, 0x15, 0x2b, 0x12, 0xdb, 0xf0, 0x15, 0xe5, 0xe9, 0x15, + 0x12, 0xe2, 0xf0, 0x24, 0xf0, 0xd7, 0x07, 0x27, 0x0a, 0xcc, 0xe2, 0x24, + 0x1c, 0xe9, 0x07, 0x00, 0xd3, 0x24, 0x36, 0x00, 0xe2, 0xf7, 0x0e, 0xe9, + 0xe9, 0x07, 0x24, 0x12, 0xf7, 0xed, 0x00, 0xfb, 0x00, 0x2b, 0xed, 0xe2, + 0x20, 0x03, 0xd3, 0xf7, 0x00, 0xf7, 0x12, 0x0e, 0xe2, 0xde, 0x03, 0x2b, + 0x00, 0xde, 0xf0, 0x00, 0xf0, 0x12, 0xff, 0xde, 0x0a, 0x0e, 0xff, 0xe2, + 0xfb, 0x1c, 0x1c, 0xff, 0xed, 0xf0, 0x12, 0x19, 0x19, 0x00, 0xdb, 0xe9, + 0x27, 0x0a, 0xd0, 0x0a, 0x27, 0xe9, 0xe2, 0x2e, 0x19, 0xe2, 0xf4, 0x00, + 0xdb, 0x07, 0x15, 0xe2, 0xde, 0x00, 0x03, 0x07, 0x03, 0xf7, 0xe5, 0xf0, + 0x20, 0x03, 0xdb, 0x0e, 0x2e, 0xf7, 0xe5, 0xff, 0xe5, 0x00, 0x12, 0x07, + 0xf4, 0xf7, 0x2e, 0x19, 0xed, 0xf4, 0xfb, 0xf7, 0x03, 0x1c, 0x0e, 0xed, + 0xcc, 0xe9, 0x1c, 0x27, 0x15, 0xe2, 0xde, 0xfb, 0x15, 0x00, 0xe2, 0x00, + 0x03, 0x00, 0x0e, 0xfb, 0xd3, 0x07, 0x0e, 0xf4, 0xf4, 0xe2, 0x00, 0x2b, + 0x1c, 0xf7, 0xd3, 0xdb, 0x15, 0x32, 0x15, 0xde, 0xd0, 0xf7, 0x24, 0xf4, + 0xf4, 0x27, 0x12, 0xf4, 0x00, 0xff, 0xd0, 0x00, 0x2e, 0x1c, 0xe5, 0xd3, + 0xf7, 0x2e, 0x15, 0xe5, 0xde, 0xed, 0xf0, 0x15, 0x2b, 0x0a, 0xe2, 0xd7, + 0xff, 0x20, 0xf4, 0xde, 0x12, 0x07, 0xd0, 0xf0, 0x24, 0x07, 0xe2, 0x15, + 0x2b, 0xe5, 0xdb, 0x03, 0x0e, 0xff, 0xed, 0x0e, 0x03, 0xfb, 0x19, 0x0a, + 0xe2, 0xd3, 0x07, 0x12, 0xf7, 0x0a, 0x0a, 0x00, 0xfb, 0xfb, 0x00, 0x00, + 0xe2, 0xed, 0x0e, 0x1c, 0xde, 0xd7, 0x19, 0x0e, 0xf4, 0x0e, 0x0a, 0xf7, + 0xd0, 0xf0, 0x15, 0xf7, 0x00, 0x27, 0x12, 0xe2, 0xe2, 0x00, 0x0a, 0xf7, + 0x12, 0x20, 0xed, 0xd7, 0xf4, 0x15, 0x12, 0x00, 0xf4, 0x03, 0xe9, 0xe2, + 0x00, 0x1c, 0x15, 0xe9, 0xf0, 0x12, 0xf4, 0xfb, 0x27, 0x07, 0xd7, 0xe2, + 0xf7, 0xff, 0x27, 0x12, 0xff, 0xf4, 0xd3, 0xff, 0x07, 0x24, 0x12, 0xd7, + 0xe2, 0x07, 0xff, 0x07, 0x27, 0x00, 0xe9, 0xd0, 0xe9, 0x1c, 0x20, 0x12, + 0xf4, 0xd3, 0xe5, 0x1c, 0x2b, 0x07, 0xe5, 0xed, 0xf4, 0xf0, 0x15, 0x15, + 0xf0, 0x03, 0xfb, 0xfb, 0x00, 0x12, 0xed, 0x03, 0x24, 0xe2, 0xd0, 0x00, + 0x2e, 0x0e, 0xe2, 0xd7, 0xe5, 0x0a, 0x24, 0x0e, 0xe5, 0xd7, 0x03, 0x20, + 0xf0, 0x00, 0x19, 0xd0, 0x00, 0x36, 0x00, 0xd0, 0xe2, 0x07, 0x20, 0x12, + 0xe5, 0xff, 0xfb, 0x07, 0x19, 0xe9, 0xe2, 0x0a, 0x15, 0xed, 0xf4, 0xfb, + 0x00, 0xff, 0x19, 0x15, 0xdb, 0xd7, 0x15, 0x39, 0x12, 0xe9, 0xe9, 0xf7, + 0xed, 0x20, 0x27, 0xed, 0xd7, 0xf0, 0xfb, 0xf7, 0xff, 0x20, 0x07, 0xed, + 0xff, 0xe5, 0xff, 0x2b, 0x03, 0xd7, 0xf0, 0x00, 0xe9, 0x15, 0x2e, 0x07, + 0xde, 0xde, 0x03, 0x0a, 0x03, 0x24, 0x00, 0xd7, 0xed, 0x0a, 0x20, 0x19, + 0xdb, 0xde, 0x07, 0x00, 0xf4, 0x0e, 0xff, 0xf0, 0x15, 0x19, 0xe5, 0xe2, + 0x12, 0x19, 0xff, 0xfb, 0xde, 0xf0, 0x15, 0x1c, 0xe9, 0xe2, 0x24, 0x00, + 0xc9, 0x03, 0x20, 0xf7, 0xf0, 0x0a, 0xf0, 0xf0, 0x07, 0x07, 0xed, 0x00, + 0x19, 0xfb, 0xdb, 0x00, 0x0e, 0x00, 0x15, 0x0e, 0xdb, 0xe9, 0x0e, 0x12, + 0x0e, 0xf7, 0xd3, 0x0a, 0x36, 0x0e, 0xe5, 0xf7, 0x03, 0xde, 0x03, 0x32, + 0xf7, 0xd0, 0xed, 0x0e, 0xf7, 0xfb, 0x0a, 0xf4, 0x0a, 0x15, 0xed, 0xd3, + 0xed, 0x00, 0x0e, 0x27, 0x00, 0xcc, 0xf7, 0x32, 0x03, 0xd0, 0xf0, 0x20, + 0x1c, 0x07, 0x03, 0xde, 0xd3, 0x00, 0x24, 0x20, 0xf4, 0xd7, 0x07, 0x36, + 0x00, 0xd3, 0xfb, 0x15, 0x03, 0xff, 0x19, 0x00, 0xd7, 0xf4, 0x12, 0xed, + 0xe5, 0x24, 0x27, 0xf4, 0xed, 0xff, 0xd7, 0xed, 0x20, 0x24, 0xff, 0xdb, + 0xf0, 0xed, 0x03, 0x2b, 0x00, 0xde, 0xe5, 0x00, 0x24, 0x15, 0xff, 0xed, + 0xe5, 0x00, 0x0e, 0x15, 0xff, 0xe2, 0x07, 0x07, 0xe2, 0xf7, 0x27, 0x27, + 0x00, 0xf7, 0xde, 0xde, 0x15, 0x32, 0x00, 0xe5, 0x0e, 0xde, 0xde, 0x19, + 0x19, 0xe2, 0xc9, 0x07, 0x20, 0x03, 0xf7, 0x03, 0xe5, 0xd3, 0x0e, 0x20, + 0x0a, 0xe2, 0xed, 0x0e, 0x07, 0xf7, 0x03, 0x15, 0x0a, 0xff, 0xfb, 0xed, + 0xe2, 0x0a, 0x27, 0x12, 0xde, 0xf7, 0x20, 0xff, 0xdb, 0xe2, 0x19, 0x27, + 0x03, 0xe5, 0xf0, 0x00, 0x03, 0x03, 0xf7, 0xff, 0x07, 0xe5, 0xd3, 0x15, + 0x1c, 0xd7, 0xf0, 0x32, 0xff, 0xe2, 0x12, 0x07, 0xe2, 0x00, 0xff, 0xf4, + 0x2e, 0x1c, 0xe2, 0xd7, 0x0a, 0x19, 0xed, 0xf4, 0xff, 0xf4, 0x2b, 0x0e, + 0xd7, 0xed, 0x20, 0x00, 0xdb, 0x0e, 0x12, 0xe9, 0x00, 0x00, 0xf4, 0xff, + 0x15, 0xff, 0x0e, 0x0e, 0xe9, 0xe2, 0xe2, 0x00, 0x1c, 0x19, 0xf7, 0xe2, + 0x15, 0x19, 0xd7, 0xe9, 0x19, 0xf4, 0xde, 0x24, 0x20, 0xe9, 0xde, 0x07, + 0x0e, 0xfb, 0x03, 0xff, 0xe5, 0x12, 0xff, 0xd3, 0x0e, 0x36, 0x20, 0xfb, + 0xed, 0xf0, 0xe5, 0xf4, 0x24, 0x15, 0xde, 0xed, 0x07, 0xf4, 0x1c, 0x24, + 0xe9, 0xd0, 0xde, 0x0e, 0x24, 0x07, 0xe9, 0xf0, 0xf7, 0xf0, 0x15, 0x2b, + 0xff, 0xd7, 0xf4, 0x00, 0xde, 0x03, 0x2e, 0x20, 0xf4, 0xd3, 0xdb, 0x07, + 0x27, 0x24, 0xe9, 0xc9, 0xf4, 0x2b, 0x24, 0x00, 0xfb, 0xf4, 0xe5, 0xfb, + 0x12, 0x24, 0xe9, 0xe2, 0x0a, 0x00, 0xd7, 0x07, 0x2b, 0x03, 0xe5, 0xd0, + 0xf4, 0x0a, 0x1c, 0x00, 0xf0, 0x12, 0x00, 0xed, 0x0a, 0x12, 0xd0, 0xde, + 0x1c, 0x24, 0xff, 0xff, 0x2e, 0xf7, 0xd7, 0xf4, 0x0e, 0xf4, 0x00, 0x27, + 0xf7, 0xd3, 0x00, 0x12, 0x00, 0xff, 0xed, 0xe2, 0x1c, 0x1c, 0xfb, 0xfb, + 0xe2, 0xed, 0x20, 0x32, 0xff, 0xdb, 0xe9, 0xed, 0x00, 0x15, 0xfb, 0xfb, + 0x20, 0x03, 0xd0, 0xe5, 0x07, 0x07, 0x15, 0x12, 0xe9, 0xdb, 0x19, 0x24, + 0xfb, 0xf4, 0xfb, 0xed, 0xed, 0x0a, 0x1c, 0x00, 0xe5, 0xfb, 0x07, 0x0e, + 0x00, 0xfb, 0x03, 0xff, 0xdb, 0xe2, 0x00, 0x0a, 0x0a, 0x24, 0x0a, 0xde, + 0xde, 0x0a, 0x20, 0x03, 0x00, 0xed, 0xe5, 0x03, 0x24, 0x07, 0xdb, 0xf0, + 0xf7, 0x0a, 0x03, 0xfb, 0x00, 0x0a, 0x15, 0xe9, 0xd7, 0x03, 0x12, 0x00, + 0x0e, 0xf7, 0xcc, 0xff, 0x24, 0x00, 0xe9, 0x12, 0x0a, 0xed, 0xff, 0xed, + 0xff, 0x2b, 0x12, 0xd3, 0xe9, 0x0a, 0xf0, 0x03, 0x03, 0xfb, 0xf7, 0x0e, + 0x12, 0x07, 0x07, 0xed, 0xed, 0x03, 0x0a, 0xf4, 0x00, 0x12, 0xe2, 0xd0, + 0x0e, 0x12, 0xff, 0x0e, 0x0a, 0xf0, 0xf4, 0xfb, 0xfb, 0x00, 0xff, 0x15, + 0x03, 0xe2, 0xf0, 0x1c, 0x07, 0xe5, 0xe9, 0x1c, 0x20, 0xe5, 0xe5, 0x0a, + 0x00, 0x00, 0x24, 0xf4, 0xcc, 0xe2, 0x0a, 0x15, 0x15, 0x15, 0xe2, 0xde, + 0x15, 0x12, 0xf0, 0xfb, 0x1c, 0x00, 0xf7, 0xf0, 0xff, 0x07, 0x19, 0x00, + 0xcc, 0xf4, 0x20, 0x00, 0xf7, 0xfb, 0xfb, 0x0e, 0xf0, 0xf7, 0x20, 0x1c, + 0xde, 0xd0, 0xe5, 0x0e, 0x12, 0x0e, 0x12, 0xed, 0xde, 0x07, 0x1c, 0xed, + 0xe5, 0x0e, 0x20, 0xed, 0xdb, 0x0e, 0x00, 0xfb, 0x2e, 0x03, 0xd7, 0xf7, + 0x1c, 0x0a, 0xe2, 0xf4, 0x27, 0x03, 0xe9, 0x03, 0x0e, 0xff, 0xd7, 0xe2, + 0x07, 0xfb, 0x07, 0x20, 0xe9, 0xf7, 0x19, 0xf4, 0xed, 0x03, 0xff, 0x00, + 0xfb, 0xe9, 0x12, 0x12, 0xf0, 0xf7, 0x15, 0x00, 0xdb, 0x00, 0x0e, 0x00, + 0xf7, 0x15, 0x0a, 0xf7, 0xf7, 0xed, 0x00, 0x19, 0x00, 0xfb, 0xdb, 0xf7, + 0x20, 0x07, 0xfb, 0x19, 0xe5, 0xd3, 0x00, 0x12, 0x12, 0x0a, 0x03, 0xde, + 0xde, 0x00, 0x1c, 0x20, 0x00, 0xe9, 0xe2, 0x03, 0x0a, 0xf4, 0xff, 0xfb, + 0x12, 0x07, 0xe5, 0xe9, 0x07, 0x0a, 0x0a, 0x00, 0xd7, 0xfb, 0x20, 0x24, + 0xf0, 0xd3, 0xf7, 0x1c, 0x0e, 0x00, 0x00, 0xf7, 0xe2, 0x00, 0x1c, 0x00, + 0xe2, 0x0e, 0x0a, 0xff, 0x03, 0xd3, 0xfb, 0x2e, 0xff, 0xe2, 0x0a, 0x00, + 0xd0, 0x00, 0x20, 0x03, 0xff, 0x07, 0xf0, 0xcc, 0x0a, 0x32, 0x00, 0xd7, + 0xff, 0x03, 0xf0, 0xf0, 0x1c, 0x15, 0xe5, 0xed, 0xf4, 0xf7, 0x12, 0x03, + 0xf4, 0x07, 0xff, 0xf4, 0x0e, 0xf7, 0x00, 0x03, 0xe5, 0xed, 0x12, 0x27, + 0x12, 0xf0, 0xde, 0xf7, 0x15, 0x00, 0xf0, 0x0e, 0x15, 0xf4, 0xe9, 0x00, + 0xfb, 0xed, 0xf7, 0x1c, 0x24, 0xe9, 0xcc, 0xed, 0x27, 0x12, 0xdb, 0xfb, + 0x19, 0x12, 0x0e, 0xf0, 0xdb, 0xdb, 0x00, 0x27, 0x12, 0xde, 0xe2, 0x1c, + 0x27, 0xf4, 0xe5, 0xed, 0xff, 0x00, 0x20, 0x1c, 0xde, 0xd7, 0x15, 0x36, + 0x00, 0xd7, 0xfb, 0x20, 0x00, 0xed, 0xf7, 0xed, 0x03, 0x32, 0x0e, 0xf4, + 0xe2, 0xd0, 0x00, 0x24, 0x1c, 0xe9, 0xde, 0xf7, 0x00, 0x24, 0x00, 0xd3, + 0xed, 0x12, 0x0e, 0xde, 0xff, 0x0a, 0x03, 0xff, 0xe5, 0xf4, 0x03, 0x24, + 0x12, 0xe2, 0xd7, 0xe9, 0x0e, 0x24, 0x27, 0xfb, 0xe2, 0x0e, 0x00, 0xde, + 0x00, 0x1c, 0xff, 0xf7, 0x1c, 0xe5, 0xe5, 0x20, 0x20, 0xe9, 0xe5, 0xf7, + 0xe5, 0x00, 0x15, 0xff, 0xf0, 0x15, 0x15, 0xf0, 0xde, 0x00, 0x19, 0xf0, + 0xe5, 0x07, 0x03, 0xe2, 0x0a, 0x20, 0xf4, 0xdb, 0xf0, 0x0e, 0x0e, 0x00, + 0x0a, 0xf7, 0xd0, 0x03, 0x32, 0x07, 0xdb, 0xff, 0x19, 0x03, 0xdb, 0xed, + 0x1c, 0x24, 0x00, 0xfb, 0xf0, 0xd3, 0x03, 0x2b, 0x03, 0xe5, 0xe2, 0xed, + 0x0e, 0x24, 0x0e, 0xe9, 0xed, 0x07, 0x07, 0xff, 0xed, 0xe5, 0xf7, 0x19, + 0x19, 0xe5, 0xed, 0x1c, 0x00, 0xc5, 0xe2, 0x15, 0x12, 0x03, 0x03, 0xf0, + 0xf4, 0x1c, 0x19, 0xe2, 0xed, 0x12, 0x00, 0xfb, 0x03, 0x12, 0x12, 0xed, + 0xdb, 0x0e, 0x2e, 0xf4, 0xd7, 0xff, 0xfb, 0xdb, 0x0e, 0x2b, 0x12, 0xe5, + 0xe5, 0x03, 0xff, 0xdb, 0x19, 0x0e, 0xe9, 0xf7, 0x00, 0x03, 0x15, 0x00, + 0xd7, 0xe2, 0x0a, 0x03, 0x00, 0x12, 0xf7, 0xe2, 0x00, 0x15, 0xff, 0x0e, + 0x1c, 0xff, 0xd7, 0xe2, 0x0e, 0x24, 0x12, 0xf7, 0xf4, 0xfb, 0x00, 0x07, + 0x00, 0xe2, 0xed, 0x03, 0x07, 0x0a, 0x00, 0xff, 0xff, 0xe9, 0xe9, 0x03, + 0x07, 0xf7, 0x0e, 0x03, 0xd7, 0xf4, 0x24, 0x0a, 0xe5, 0x07, 0xfb, 0xed, + 0xed, 0x07, 0x1c, 0x00, 0xfb, 0xde, 0xfb, 0x20, 0x15, 0xfb, 0xde, 0xed, + 0x0e, 0x20, 0x0e, 0xf4, 0xd7, 0xe9, 0x12, 0x19, 0x0a, 0xff, 0xe5, 0xe9, + 0x1c, 0x19, 0xde, 0xe2, 0x12, 0x12, 0xe9, 0xed, 0xf7, 0x0e, 0x15, 0xf7, + 0xed, 0xed, 0xf0, 0x12, 0x27, 0x00, 0xd7, 0xe9, 0x07, 0x2b, 0x03, 0xe5, + 0xf4, 0x00, 0xf4, 0x19, 0x1c, 0xe9, 0xd7, 0x00, 0x32, 0x1c, 0xf0, 0xde, + 0xf0, 0x0a, 0x0e, 0xed, 0xde, 0x0a, 0x2b, 0x03, 0xde, 0xd3, 0x00, 0x2b, + 0x12, 0xf4, 0xe9, 0xf4, 0x07, 0x07, 0x07, 0x00, 0xd0, 0xf4, 0x1c, 0x0e, + 0xf0, 0xe9, 0xf4, 0xf4, 0x20, 0x20, 0xfb, 0xf0, 0xed, 0xff, 0x0a, 0x00, + 0xf4, 0x00, 0x00, 0xff, 0x0a, 0xf7, 0xe9, 0xff, 0x24, 0x1c, 0xde, 0xde, + 0x15, 0x1c, 0x00, 0xed, 0xf4, 0xff, 0x0a, 0x0e, 0xed, 0xfb, 0xff, 0xf0, + 0xf0, 0x15, 0x12, 0xe2, 0x00, 0x1c, 0xed, 0xde, 0x07, 0xf7, 0xe9, 0x00, + 0x12, 0x00, 0x0a, 0x0a, 0xf7, 0xe9, 0x0a, 0x24, 0xf4, 0xd7, 0x03, 0x20, + 0xf7, 0x00, 0x15, 0xd7, 0xf0, 0x27, 0xf4, 0xd7, 0x19, 0x12, 0xde, 0xf0, + 0x15, 0x24, 0x03, 0xf0, 0xe5, 0xf0, 0x00, 0x00, 0x20, 0x03, 0xd7, 0xf0, + 0x20, 0x1c, 0xff, 0xe9, 0xf4, 0x03, 0xff, 0xe2, 0xff, 0x24, 0x07, 0xe5, + 0xe5, 0x0e, 0x27, 0x00, 0xd7, 0xdb, 0x15, 0x12, 0x00, 0x03, 0xf0, 0xff, + 0xfb, 0x0a, 0x00, 0xff, 0xe2, 0xfb, 0x20, 0xf7, 0xed, 0x00, 0x0e, 0x19, + 0xf7, 0xe9, 0xfb, 0x00, 0x0e, 0x12, 0xe5, 0xd7, 0x19, 0x2b, 0x00, 0xf0, + 0xf0, 0xe5, 0xf7, 0x12, 0x2b, 0x07, 0xde, 0xd7, 0xfb, 0x2e, 0x15, 0xdb, + 0xcc, 0x00, 0x27, 0x03, 0xe2, 0xde, 0x00, 0x1c, 0x03, 0xe2, 0xf7, 0x0e, + 0x00, 0xff, 0xf4, 0xff, 0xf4, 0x20, 0x24, 0xfb, 0xdb, 0xe2, 0x0a, 0x27, + 0x20, 0xe9, 0xd3, 0xf7, 0x32, 0x12, 0xdb, 0xed, 0x07, 0xf7, 0x0a, 0x0e, + 0x03, 0xfb, 0xe2, 0x03, 0x03, 0x0a, 0x03, 0xf0, 0x03, 0x00, 0xe5, 0xe5, + 0x0a, 0x24, 0xff, 0xf4, 0xe2, 0xe9, 0x00, 0x20, 0x12, 0xde, 0xe9, 0x0a, + 0x03, 0x03, 0x1c, 0xf0, 0xcc, 0xf7, 0x27, 0x2b, 0x0e, 0xf0, 0xde, 0xf7, + 0x07, 0x0a, 0xff, 0x0a, 0x00, 0xe2, 0x00, 0x0e, 0x0a, 0x03, 0xf7, 0xd7, + 0xe9, 0x0e, 0x07, 0xfb, 0x12, 0xfb, 0xd3, 0x0a, 0x24, 0x00, 0x00, 0xfb, + 0xd0, 0xde, 0x15, 0x27, 0x12, 0xed, 0xe9, 0xdb, 0x0e, 0x32, 0x0a, 0xdb, + 0xe5, 0x00, 0x00, 0x0a, 0x20, 0x03, 0xde, 0xed, 0x07, 0xf4, 0x0a, 0x15, + 0xf7, 0xd7, 0xff, 0x19, 0x0e, 0x0e, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf7, + 0x0e, 0xfb, 0xd7, 0xfb, 0x19, 0x1c, 0x0a, 0xf4, 0xd7, 0xe2, 0xff, 0x20, + 0x27, 0x00, 0xd7, 0xde, 0x19, 0x27, 0xe2, 0xd7, 0x07, 0xff, 0xff, 0x1c, + 0x0e, 0xf7, 0xed, 0x00, 0x00, 0xf0, 0x00, 0x0a, 0x07, 0x00, 0xd3, 0xe9, + 0x27, 0x20, 0x0a, 0x00, 0xe9, 0xd3, 0xf0, 0x20, 0x24, 0xe9, 0xd3, 0x07, + 0x07, 0x00, 0x07, 0xf0, 0xdb, 0xf4, 0x19, 0xff, 0x00, 0xf4, 0xf7, 0x15, + 0x19, 0xf4, 0xd0, 0x0e, 0x2b, 0x07, 0xe5, 0xd3, 0x03, 0x2e, 0x19, 0xfb, + 0xfb, 0x00, 0xe5, 0xf0, 0x19, 0x12, 0xe5, 0xff, 0x15, 0xe2, 0xe5, 0x15, + 0x0a, 0x00, 0xed, 0xdb, 0x00, 0x15, 0x12, 0xed, 0xe9, 0x12, 0xff, 0xcc, + 0x00, 0x27, 0x0a, 0xe2, 0xe2, 0x0a, 0x15, 0x0e, 0x19, 0xf7, 0xdb, 0xed, + 0x1c, 0x07, 0xe9, 0x00, 0xf7, 0xf7, 0x20, 0x0e, 0xdb, 0xe2, 0x12, 0xfb, + 0xed, 0x27, 0x12, 0xe5, 0xe5, 0x00, 0x03, 0x0e, 0x00, 0x00, 0xff, 0xdb, + 0xf7, 0x1c, 0x20, 0xe2, 0xed, 0x2b, 0x00, 0xd0, 0x03, 0x20, 0xe9, 0xe9, + 0xf7, 0xf4, 0x07, 0x20, 0x0e, 0xe5, 0xd3, 0x00, 0x12, 0x0a, 0x0e, 0xe2, + 0xdb, 0x15, 0x24, 0xe9, 0xf7, 0x24, 0xf4, 0xcc, 0xf4, 0x0e, 0x24, 0x0e, + 0xf0, 0xf7, 0xfb, 0x00, 0xf7, 0x15, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xe9, + 0x0e, 0x20, 0xe9, 0xdb, 0xfb, 0x19, 0x1c, 0xf7, 0xd7, 0xe9, 0x07, 0x2b, + 0x19, 0xdb, 0xd3, 0x00, 0x19, 0x00, 0xf4, 0xf4, 0x0a, 0x0a, 0xf7, 0x07, + 0x12, 0xe9, 0xde, 0xf7, 0x07, 0x1c, 0x03, 0xed, 0xde, 0x07, 0x15, 0xf0, + 0xf0, 0x24, 0x1c, 0xdb, 0xde, 0x07, 0x15, 0x03, 0x0a, 0xf7, 0xc5, 0xfb, + 0x20, 0x20, 0x03, 0xd3, 0xd7, 0x00, 0x2b, 0x20, 0xf0, 0xd3, 0xf4, 0x03, + 0xf7, 0x15, 0x19, 0xf7, 0xed, 0xff, 0x0e, 0xf7, 0xe9, 0x12, 0x12, 0xf4, + 0xe9, 0xfb, 0x0e, 0x20, 0x0e, 0xe2, 0xd3, 0xfb, 0x20, 0x20, 0x00, 0xe9, + 0xdb, 0xf4, 0x20, 0x24, 0xff, 0xd7, 0xe9, 0x0e, 0x00, 0xff, 0x19, 0xff, + 0xde, 0xff, 0x1c, 0x00, 0xe5, 0x03, 0x03, 0xe9, 0x0e, 0xff, 0xe9, 0x19, + 0x20, 0xe5, 0xdb, 0x00, 0x15, 0x00, 0xde, 0x00, 0x00, 0xf7, 0x0e, 0x12, + 0xfb, 0x00, 0x00, 0xe9, 0x00, 0x0a, 0x12, 0xff, 0xe5, 0xe9, 0x00, 0x1c, + 0x15, 0xe5, 0xcc, 0x03, 0x2b, 0x03, 0xde, 0xed, 0x19, 0x1c, 0x00, 0xf7, + 0xed, 0xe9, 0x0e, 0x0e, 0xf7, 0xe5, 0xf4, 0x0e, 0x20, 0x07, 0xe9, 0xe5, + 0x00, 0x1c, 0x00, 0xd7, 0xe2, 0xfb, 0x03, 0x15, 0x27, 0xfb, 0xcc, 0xf4, + 0x1c, 0x0a, 0xdb, 0xf0, 0x12, 0x20, 0x0e, 0xe5, 0xe9, 0x03, 0x19, 0x00, + 0x00, 0xf4, 0xf0, 0xff, 0x15, 0x07, 0xf0, 0x03, 0x20, 0x07, 0xe2, 0xd7, + 0xed, 0x0e, 0x00, 0xed, 0x03, 0x0e, 0x07, 0xff, 0xf7, 0xe5, 0xde, 0x07, + 0x19, 0xed, 0x00, 0x24, 0xfb, 0xe5, 0x00, 0x0e, 0x00, 0xfb, 0x00, 0xf7, + 0xf0, 0xfb, 0x19, 0x19, 0xff, 0xf7, 0xf0, 0x00, 0x12, 0x00, 0xcc, 0xf7, + 0x2b, 0x0e, 0xf4, 0x0a, 0x12, 0xf4, 0xf4, 0x00, 0xf4, 0xe9, 0x03, 0x20, + 0xff, 0xd3, 0xe9, 0x0a, 0x12, 0x03, 0xf4, 0xde, 0xfb, 0x19, 0x0a, 0xde, + 0xf0, 0x19, 0x03, 0x03, 0x19, 0xf4, 0xd3, 0xed, 0x0e, 0x27, 0x00, 0xdb, + 0x03, 0x27, 0xff, 0xde, 0x00, 0x0e, 0xff, 0xfb, 0x00, 0x00, 0x03, 0x00, + 0xf4, 0xf7, 0xff, 0x07, 0x12, 0x0a, 0xd3, 0xd7, 0x19, 0x24, 0xe5, 0xde, + 0x1c, 0x0e, 0xf0, 0xe9, 0xf7, 0xf4, 0x0a, 0x15, 0x03, 0xf0, 0xe2, 0x03, + 0x15, 0x0a, 0xde, 0xf0, 0x1c, 0x15, 0xf4, 0xd7, 0x07, 0x12, 0x00, 0x00, + 0xf4, 0x1c, 0xff, 0xe2, 0x12, 0x12, 0xe2, 0xe2, 0x27, 0x1c, 0xe2, 0xde, + 0x0a, 0x20, 0x15, 0xf0, 0xdb, 0xdb, 0x0e, 0x19, 0xfb, 0x03, 0xf4, 0xe5, + 0x0a, 0x2b, 0x00, 0xd3, 0xe9, 0x19, 0x24, 0xf7, 0xf4, 0xf7, 0xde, 0x1c, + 0x19, 0xf7, 0xf4, 0x12, 0x00, 0xf4, 0xde, 0xe5, 0x0a, 0x24, 0x19, 0xf4, + 0xe9, 0xe9, 0xfb, 0x24, 0x12, 0xed, 0xe5, 0xfb, 0x0e, 0x15, 0x12, 0xfb, + 0xf4, 0xe5, 0xe5, 0x0a, 0x20, 0x0e, 0xe2, 0xd3, 0xfb, 0x12, 0x1c, 0x0e, + 0xde, 0xde, 0xfb, 0x07, 0x00, 0x00, 0x00, 0xff, 0xf4, 0x07, 0x20, 0x00, + 0xe9, 0x0e, 0xf7, 0xd3, 0x03, 0x2e, 0x0e, 0xde, 0xf4, 0x12, 0xfb, 0x00, + 0x0a, 0xed, 0xf4, 0x0e, 0xed, 0xf4, 0x0e, 0x12, 0x03, 0xe9, 0xf0, 0x00, + 0x00, 0x03, 0x00, 0xe5, 0xdb, 0x12, 0x2b, 0x00, 0xe2, 0x00, 0x0e, 0xd3, + 0xe5, 0x19, 0x20, 0xfb, 0xde, 0xf0, 0x15, 0x20, 0x0a, 0xf0, 0xd3, 0xf0, + 0x0a, 0x19, 0x12, 0xf7, 0xfb, 0x00, 0x00, 0xed, 0x03, 0x0e, 0x0e, 0xf7, + 0xde, 0xf7, 0x00, 0x12, 0x07, 0xff, 0xfb, 0xf4, 0x00, 0x03, 0xf7, 0xf0, + 0x00, 0x0a, 0x00, 0x00, 0xf7, 0x0e, 0x0e, 0xe9, 0xd0, 0xf4, 0x19, 0x19, + 0x0e, 0xfb, 0xe5, 0xe2, 0x0e, 0x24, 0xf7, 0xe9, 0x03, 0x03, 0xff, 0xf7, + 0xf0, 0x00, 0x15, 0x15, 0x00, 0xed, 0xe2, 0xfb, 0x00, 0x0a, 0x15, 0x0e, + 0xff, 0xe2, 0xf7, 0x1c, 0x07, 0xde, 0xe5, 0x00, 0x12, 0x19, 0xff, 0xed, + 0x03, 0x00, 0xe9, 0xed, 0xf7, 0x24, 0x12, 0xff, 0xe5, 0xde, 0xf4, 0x1c, + 0x20, 0xed, 0xd7, 0x0a, 0x20, 0xf0, 0xe5, 0x0a, 0x0a, 0xf0, 0x03, 0x00, + 0xff, 0xff, 0x00, 0xff, 0xe5, 0x03, 0x12, 0x12, 0x0e, 0xe5, 0xe2, 0xfb, + 0xff, 0xff, 0x0e, 0x19, 0xff, 0xff, 0xf7, 0xe5, 0x00, 0x07, 0x0e, 0x00, + 0xe9, 0x00, 0x15, 0xff, 0xf4, 0xe5, 0xf4, 0x24, 0x15, 0xed, 0xf7, 0xe5, + 0xed, 0x03, 0x15, 0x07, 0xfb, 0x07, 0xfb, 0xff, 0x00, 0xf0, 0xf4, 0x07, + 0x15, 0x00, 0x00, 0xf4, 0xf7, 0xff, 0xe9, 0x03, 0x0e, 0x03, 0x00, 0x0a, + 0x0a, 0x00, 0xed, 0xe2, 0xfb, 0x27, 0x1c, 0xe5, 0xd0, 0xff, 0x1c, 0x00, + 0x00, 0xfb, 0xed, 0xf4, 0x0a, 0x0e, 0xfb, 0xe5, 0xf7, 0x03, 0xff, 0xe5, + 0x12, 0x27, 0xf7, 0xc9, 0xf0, 0x24, 0x00, 0xf7, 0x15, 0x15, 0xf4, 0xe2, + 0x03, 0x00, 0x00, 0x15, 0x00, 0xe9, 0xed, 0x12, 0x19, 0x00, 0xde, 0xed, + 0x27, 0x19, 0xf4, 0xed, 0xe2, 0x0a, 0x0e, 0xed, 0xf4, 0x0a, 0x15, 0xf7, + 0xe5, 0xe9, 0xff, 0x0e, 0x03, 0x15, 0xf7, 0xd3, 0x00, 0x1c, 0xf7, 0xf0, + 0x12, 0xff, 0xde, 0x07, 0x27, 0x00, 0xe9, 0xf4, 0x27, 0x0e, 0xd3, 0xe2, + 0x0e, 0x1c, 0xed, 0xe5, 0x0e, 0x00, 0xfb, 0x15, 0x00, 0xf0, 0xf7, 0x07, + 0x12, 0xf7, 0xfb, 0xf4, 0x00, 0x0a, 0x12, 0x0a, 0xe5, 0xe5, 0xff, 0xff, + 0x03, 0x03, 0x0a, 0x00, 0xff, 0xf4, 0xff, 0x0a, 0xfb, 0xfb, 0xfb, 0xe9, + 0x00, 0x15, 0x07, 0x07, 0xe9, 0xed, 0x12, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x0a, 0xf4, 0xfb, 0x0a, 0xf7, 0xed, 0x12, 0x07, 0xe5, 0xf4, 0x1c, 0x15, + 0xe5, 0xf7, 0x20, 0x00, 0xed, 0xff, 0xe9, 0xf0, 0x0e, 0x07, 0xfb, 0xf4, + 0x15, 0x03, 0x00, 0xf4, 0xe2, 0x03, 0x0e, 0x00, 0x07, 0xf7, 0xf4, 0xf4, + 0x00, 0x19, 0x15, 0xe9, 0xdb, 0x07, 0x19, 0x07, 0xd7, 0xf0, 0x27, 0x19, + 0xe9, 0xe5, 0xf4, 0x07, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x07, 0xdb, + 0xe2, 0x00, 0x0e, 0x20, 0xfb, 0xdb, 0x00, 0x00, 0xfb, 0x00, 0x07, 0xff, + 0xe9, 0xfb, 0x12, 0xfb, 0x00, 0x00, 0xf0, 0xff, 0x0a, 0x24, 0xfb, 0xe2, + 0xe2, 0xfb, 0x12, 0xff, 0x07, 0x1c, 0xfb, 0xdb, 0xff, 0x1c, 0xf0, 0xf0, + 0x12, 0x03, 0xed, 0xf0, 0xfb, 0x20, 0x07, 0xe5, 0xed, 0x07, 0x1c, 0xf7, + 0xf7, 0x19, 0xff, 0xd3, 0x03, 0x24, 0xf0, 0xe5, 0x0a, 0x12, 0xde, 0xde, + 0x15, 0x0e, 0xe5, 0x00, 0x0e, 0xf7, 0xf4, 0x00, 0x03, 0x00, 0xed, 0x07, + 0x0a, 0xff, 0x00, 0x00, 0xe5, 0xed, 0x0a, 0x1c, 0x0e, 0xf0, 0xf0, 0x0e, + 0x00, 0xf0, 0x00, 0x00, 0x03, 0x07, 0xf4, 0xe2, 0x07, 0x20, 0xf4, 0xdb, + 0x19, 0x0a, 0xde, 0xf7, 0x07, 0xfb, 0x00, 0x07, 0xed, 0xe2, 0x07, 0x12, + 0xf7, 0xfb, 0x00, 0xf7, 0x07, 0x03, 0xfb, 0xf0, 0x00, 0x1c, 0x00, 0xf0, + 0xf4, 0xf7, 0xf7, 0x15, 0x19, 0xde, 0xf7, 0x15, 0x00, 0xff, 0xf7, 0x00, + 0x07, 0xed, 0x03, 0x24, 0xff, 0xde, 0xfb, 0x15, 0x0a, 0xe9, 0xf4, 0x07, + 0xed, 0x0e, 0x1c, 0xdb, 0xdb, 0x20, 0x19, 0xd7, 0xde, 0x07, 0x07, 0xfb, + 0xf7, 0xf7, 0xff, 0x12, 0x15, 0x00, 0x00, 0xf0, 0xde, 0x0a, 0x20, 0xde, + 0xdb, 0x27, 0x24, 0xed, 0xf0, 0x1c, 0xf4, 0xcc, 0x07, 0x2b, 0x0e, 0xe5, + 0xff, 0x12, 0xf0, 0xff, 0x12, 0x00, 0xff, 0xe9, 0xdb, 0x12, 0x19, 0xe9, + 0xed, 0x24, 0x03, 0xe9, 0xf4, 0x03, 0x00, 0xe5, 0xf4, 0x0a, 0xed, 0xf7, + 0x24, 0x15, 0xf0, 0xe5, 0xe5, 0x12, 0x15, 0xed, 0xfb, 0x12, 0x07, 0xf0, + 0x07, 0x0e, 0xed, 0xe9, 0x07, 0x0e, 0xed, 0x00, 0x03, 0xf0, 0x0e, 0x19, + 0xff, 0xe9, 0xe9, 0xfb, 0x12, 0x0e, 0xe2, 0xd3, 0x07, 0x27, 0x19, 0xf4, + 0xe5, 0xf7, 0x00, 0x00, 0xff, 0xf4, 0x00, 0x0e, 0x00, 0xfb, 0xfb, 0x07, + 0x00, 0xe2, 0xf4, 0x03, 0x00, 0x0e, 0x07, 0xed, 0xed, 0x15, 0x12, 0x00, + 0x07, 0xe2, 0xde, 0xfb, 0x12, 0x0e, 0x00, 0x0e, 0x03, 0xeb, 0xe7, 0x0e, + 0x1c, 0xf9, 0xee, 0xf2, 0xfd, 0x1c, 0x20, 0xf6, 0xd9, 0xe7, 0x15, 0x1c, + 0xf6, 0xee, 0x00, 0xfd, 0xe4, 0x03, 0x1c, 0x03, 0xfd, 0x00, 0xe7, 0xe7, + 0xfd, 0x0e, 0x20, 0x0a, 0xe4, 0xd9, 0x19, 0x24, 0xf2, 0x00, 0x12, 0xee, + 0xd9, 0x1c, 0x2e, 0x00, 0xe0, 0xfd, 0x19, 0xf2, 0xf9, 0x15, 0x03, 0xe0, + 0xf6, 0x12, 0x07, 0xf9, 0xf2, 0xf6, 0x19, 0x03, 0xca, 0xf2, 0x24, 0x20, + 0xeb, 0xd2, 0x00, 0x0e, 0x07, 0x00, 0xee, 0xf6, 0x07, 0x12, 0x03, 0xfd, + 0xe7, 0xfd, 0x15, 0x03, 0xf6, 0xf6, 0x00, 0x07, 0x0e, 0x00, 0x00, 0xf9, + 0xf6, 0x00, 0x00, 0x03, 0xfd, 0xf9, 0x00, 0x0a, 0x03, 0xeb, 0x00, 0x24, + 0xeb, 0xe0, 0xf2, 0x00, 0x00, 0x15, 0x24, 0xe7, 0xd2, 0xeb, 0x1c, 0x19, + 0x00, 0xf2, 0xe0, 0x00, 0x0e, 0x12, 0x07, 0xeb, 0x00, 0x00, 0xf6, 0x03, + 0x0a, 0xeb, 0xee, 0x12, 0x03, 0xfd, 0x0e, 0x15, 0x00, 0xe7, 0xe4, 0xf9, + 0x12, 0x29, 0x07, 0xf2, 0x00, 0x03, 0x00, 0xee, 0xf9, 0x03, 0x00, 0x07, + 0x03, 0x0a, 0xf9, 0xfd, 0xfd, 0xf9, 0xf6, 0x0e, 0x19, 0xe7, 0xdc, 0xee, + 0x03, 0x29, 0x12, 0xe4, 0xe7, 0x07, 0x0a, 0xf2, 0xf2, 0x03, 0x00, 0xe7, + 0x15, 0x22, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x0e, 0x2d, 0x0a, 0xdc, 0xf2, + 0x07, 0x00, 0x07, 0x0e, 0x00, 0xeb, 0xee, 0x00, 0x1b, 0x00, 0xf6, 0x03, + 0xf9, 0xfd, 0x1b, 0x12, 0xe0, 0xe0, 0xfd, 0x00, 0x00, 0x0a, 0x00, 0x07, + 0x0a, 0xee, 0xe0, 0xf6, 0xfd, 0x0e, 0x12, 0x00, 0x00, 0xf9, 0x00, 0x0a, + 0xdc, 0xee, 0x1b, 0x1b, 0xf6, 0xd7, 0x0a, 0x25, 0xeb, 0xee, 0x30, 0x00, + 0xdc, 0x00, 0x03, 0xf2, 0x0a, 0x17, 0xf6, 0xeb, 0x07, 0x13, 0x00, 0x00, + 0xf2, 0xdb, 0xf9, 0x17, 0x0e, 0x0a, 0x0a, 0xe0, 0xdb, 0xf6, 0x1e, 0x17, + 0xf6, 0x00, 0x00, 0xdc, 0xee, 0x17, 0x29, 0x00, 0xdb, 0xee, 0x07, 0xf9, + 0x0a, 0x25, 0x00, 0xd7, 0xe4, 0x1b, 0x22, 0xf9, 0x00, 0x03, 0xe4, 0xe7, + 0x03, 0x25, 0x22, 0xf9, 0xe0, 0xe4, 0x00, 0x1b, 0x0e, 0x03, 0xf2, 0xdb, + 0x00, 0x1e, 0x10, 0xe7, 0xee, 0x03, 0x07, 0xeb, 0x00, 0x1b, 0xf9, 0xd7, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xf6, 0x0a, 0x0e, 0x00, 0xf9, + 0x0a, 0xfd, 0x0c, 0x0c, 0xeb, 0xe2, 0x10, 0x0a, 0xeb, 0x0c, 0x0a, 0xeb, + 0xf9, 0x17, 0x13, 0xf9, 0xf6, 0x00, 0xf6, 0xf6, 0x07, 0x0a, 0x0a, 0x00, + 0xf9, 0xe2, 0xf6, 0x13, 0x0a, 0xe7, 0xf9, 0x0c, 0xeb, 0x00, 0x2b, 0xf9, + 0xd3, 0x00, 0x13, 0x00, 0xf6, 0x07, 0x00, 0x03, 0xfd, 0xfd, 0x07, 0x13, + 0x03, 0xee, 0xf6, 0x10, 0xf9, 0xee, 0x1b, 0x1e, 0xeb, 0xde, 0x0a, 0x17, + 0xeb, 0xe2, 0xfd, 0x1e, 0x10, 0x00, 0xf6, 0xf9, 0xfd, 0x00, 0x07, 0xfd, + 0xee, 0xf9, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x0c, 0x00, 0xe2, 0xf9, 0x13, + 0x00, 0xe9, 0xfd, 0xfd, 0x10, 0x17, 0xfd, 0x00, 0xeb, 0xe5, 0x07, 0x10, + 0x09, 0x07, 0x03, 0x07, 0xf6, 0xee, 0x0c, 0x07, 0xe5, 0x07, 0x1b, 0xe9, + 0xf2, 0x13, 0x0c, 0xed, 0xed, 0x07, 0x00, 0x09, 0x00, 0xf9, 0xfd, 0xf9, + 0xf9, 0xfd, 0x07, 0x13, 0xfd, 0xed, 0xf9, 0xf2, 0xfd, 0x09, 0x0c, 0x09, + 0x00, 0xfd, 0x00, 0xee, 0xe2, 0x10, 0x10, 0xed, 0xf9, 0x09, 0x0c, 0x0c, + 0x07, 0xe9, 0xf2, 0x00, 0x10, 0x1b, 0xf6, 0xf2, 0x00, 0x00, 0xf6, 0x00, + 0x1b, 0x07, 0xf9, 0xed, 0xed, 0xf9, 0x17, 0x13, 0xf2, 0xf9, 0x17, 0x00, + 0xdc, 0xe9, 0xee, 0x00, 0x10, 0x03, 0x00, 0x07, 0x00, 0xee, 0xfd, 0xed, + 0x00, 0x24, 0x13, 0xf6, 0xe9, 0xfd, 0x00, 0x07, 0x0c, 0x07, 0xee, 0x00, + 0x17, 0xed, 0xe9, 0x17, 0x20, 0xf0, 0xf9, 0x17, 0x00, 0xf2, 0xf2, 0xfd, + 0xf9, 0x00, 0x03, 0x20, 0x13, 0xf2, 0xdc, 0xe5, 0x0c, 0x13, 0x00, 0x00, + 0x00, 0xf0, 0xe2, 0x00, 0x24, 0x00, 0xd2, 0xfd, 0x0c, 0xed, 0x03, 0x09, + 0x00, 0x00, 0xfd, 0xf6, 0x0c, 0x1c, 0x00, 0xe5, 0xdc, 0xf6, 0x10, 0x15, + 0x1c, 0x03, 0xe5, 0xd5, 0x00, 0x25, 0x20, 0x07, 0xed, 0xf9, 0x03, 0xf9, + 0x0c, 0x10, 0xf9, 0xf2, 0xfd, 0xfd, 0x00, 0x15, 0x00, 0xd5, 0xe9, 0x10, + 0x15, 0xf6, 0x00, 0x09, 0xd9, 0xd5, 0x03, 0x19, 0x13, 0x03, 0x00, 0xf0, + 0xe5, 0x00, 0x1c, 0x1c, 0xf9, 0xed, 0xed, 0x05, 0x00, 0xf2, 0x00, 0x09, + 0x10, 0xfd, 0xf9, 0xf2, 0x03, 0x03, 0x00, 0x00, 0xf9, 0x05, 0x10, 0x05, + 0xe5, 0xf9, 0x0c, 0x00, 0xf9, 0x00, 0x13, 0xe4, 0xe5, 0x15, 0x09, 0xe0, + 0xf4, 0x19, 0x0c, 0xf4, 0xfd, 0x00, 0xed, 0xf6, 0x09, 0x15, 0x00, 0xf9, + 0x00, 0xf9, 0xf9, 0xfd, 0x0c, 0x15, 0x00, 0xe9, 0xf6, 0x09, 0xe9, 0x00, + 0x19, 0x10, 0xed, 0xe9, 0x0c, 0x15, 0x05, 0xe7, 0xe7, 0x05, 0x0c, 0x03, + 0x00, 0x09, 0xe4, 0xe0, 0x10, 0x09, 0xf0, 0x09, 0x15, 0xf0, 0xe4, 0x00, + 0x10, 0x00, 0x05, 0xfd, 0xed, 0x00, 0x15, 0x03, 0xe7, 0xf9, 0x00, 0xf9, + 0x15, 0x15, 0xf4, 0xf4, 0x0c, 0xf6, 0xe0, 0x09, 0x22, 0x0c, 0xf4, 0xfd, + 0x03, 0xf0, 0xfd, 0x09, 0xf6, 0xf9, 0x15, 0x0c, 0xf9, 0xf9, 0xf6, 0xf6, + 0x00, 0x19, 0x05, 0xed, 0xe7, 0xed, 0x00, 0x1c, 0x10, 0xf0, 0xf9, 0x05, + 0x00, 0xf4, 0xf4, 0xf9, 0x00, 0x0c, 0x00, 0xfd, 0x00, 0x09, 0x15, 0x00, + 0xdb, 0xed, 0x12, 0x10, 0x05, 0xf6, 0xf6, 0x10, 0x03, 0xe7, 0x00, 0x22, + 0xfd, 0xde, 0x00, 0x15, 0xf0, 0xeb, 0x19, 0x1e, 0xf9, 0xeb, 0xf6, 0x09, + 0x00, 0xeb, 0xfd, 0x05, 0x03, 0x09, 0x15, 0xf4, 0xde, 0xf9, 0x03, 0xf9, + 0x00, 0x12, 0x03, 0xfd, 0x00, 0xfd, 0xfd, 0xf9, 0x05, 0x00, 0xed, 0xfd, + 0x00, 0x00, 0x19, 0x09, 0xe4, 0x05, 0x19, 0x00, 0xeb, 0xed, 0x03, 0x15, + 0x00, 0xfd, 0x00, 0x05, 0x00, 0xf4, 0x00, 0x12, 0xf9, 0xed, 0x0e, 0x03, + 0xeb, 0xf4, 0x0c, 0x03, 0xf0, 0xfd, 0xfd, 0x03, 0x03, 0xf6, 0xf0, 0xed, + 0x00, 0x05, 0x15, 0x12, 0xe7, 0xe2, 0x0c, 0x0c, 0xf0, 0x05, 0x24, 0x00, + 0xed, 0xfd, 0xeb, 0xf4, 0x15, 0x20, 0x00, 0xeb, 0xf4, 0x00, 0x00, 0x09, + 0x0c, 0xed, 0xed, 0x09, 0x05, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xe4, 0xf4, 0x09, 0x00, 0x00, 0x1b, 0xf4, 0xd5, 0xf4, + 0x1b, 0x09, 0xf7, 0x00, 0x12, 0xf9, 0xf4, 0x0c, 0x09, 0xf7, 0xeb, 0x09, + 0x0e, 0xf4, 0x00, 0x00, 0xf9, 0xee, 0xfd, 0x0e, 0x09, 0x00, 0x09, 0xf0, + 0xdc, 0x00, 0x0e, 0x0c, 0x0e, 0x00, 0xeb, 0xf9, 0x00, 0xf0, 0x05, 0x1b, + 0x00, 0xe7, 0x00, 0x20, 0xf7, 0xe5, 0xee, 0x00, 0x03, 0x03, 0x0e, 0x03, + 0xee, 0xe7, 0x03, 0x09, 0x15, 0x00, 0xe2, 0xf4, 0x0c, 0xf4, 0xf0, 0x1c, + 0x17, 0xf4, 0xee, 0x09, 0x05, 0xf0, 0xfd, 0xf7, 0xf9, 0x0c, 0x13, 0x09, + 0x00, 0xeb, 0xf7, 0xfd, 0x00, 0x13, 0x0a, 0xfd, 0xe2, 0xee, 0x0a, 0x13, + 0x00, 0xee, 0xfd, 0x0a, 0x00, 0xf0, 0x00, 0x05, 0xf4, 0x00, 0x05, 0x05, + 0x0a, 0xfd, 0xf4, 0x00, 0x00, 0xf0, 0x00, 0x20, 0x12, 0xf0, 0xee, 0x09, + 0x00, 0xf4, 0x12, 0x00, 0xf4, 0x03, 0xf9, 0xf0, 0x13, 0x13, 0xe9, 0xeb, + 0x12, 0x0e, 0xf4, 0xf9, 0xf9, 0xf0, 0x09, 0x09, 0x00, 0x09, 0x00, 0xeb, + 0xeb, 0xf9, 0x03, 0x00, 0x12, 0x1b, 0xf9, 0xeb, 0xf7, 0x0a, 0x0e, 0xf9, + 0xf0, 0x00, 0x05, 0xfd, 0x05, 0x00, 0xf4, 0x00, 0x03, 0x09, 0x0e, 0xeb, + 0xe9, 0x00, 0x00, 0x00, 0x13, 0x05, 0xee, 0xf9, 0x0a, 0xf4, 0xee, 0x17, + 0x12, 0xe9, 0xf4, 0x05, 0x00, 0x00, 0x00, 0xee, 0xf7, 0x0e, 0x03, 0xfd, + 0x12, 0xf2, 0xe4, 0x00, 0x0e, 0x00, 0x0a, 0xfd, 0xee, 0x05, 0xf9, 0xfd, + 0x17, 0x12, 0xf7, 0xe9, 0x05, 0x00, 0xeb, 0x17, 0x13, 0xee, 0xeb, 0x05, + 0x01, 0x01, 0x01, 0xf2, 0xf2, 0x00, 0x01, 0x00, 0xf7, 0x05, 0x01, 0xeb, + 0x00, 0x00, 0x00, 0x0a, 0x13, 0xf2, 0xe0, 0x0a, 0x19, 0xf2, 0xf7, 0x05, + 0xf7, 0xf7, 0x17, 0x09, 0xf9, 0xf4, 0xfd, 0x01, 0x00, 0x01, 0xf9, 0xf7, + 0x05, 0x00, 0xf2, 0x00, 0x01, 0x05, 0x09, 0xfd, 0xf2, 0xfd, 0xf9, 0x00, + 0x0a, 0x10, 0xfd, 0xe9, 0xfd, 0x09, 0x00, 0xf9, 0x00, 0x01, 0x01, 0x00, + 0xee, 0xf9, 0x05, 0x05, 0x00, 0x01, 0x09, 0xed, 0xe4, 0x09, 0x0e, 0xf9, + 0x00, 0x09, 0xf7, 0xe5, 0x09, 0x19, 0xfd, 0xf9, 0x09, 0xe9, 0xee, 0x19, + 0x15, 0xfd, 0xf4, 0x00, 0xf7, 0xf7, 0x19, 0x10, 0xf4, 0xf9, 0x00, 0xee, + 0x05, 0x19, 0x01, 0xe7, 0xed, 0x0a, 0x00, 0xfd, 0x10, 0x01, 0xe7, 0xed, + 0x00, 0x09, 0x0a, 0xf7, 0x00, 0x00, 0xe4, 0xf4, 0x09, 0x1b, 0x10, 0xf2, + 0xde, 0xfd, 0x13, 0x00, 0xfb, 0x00, 0x0a, 0x00, 0xed, 0x0e, 0x1b, 0xf7, + 0xf2, 0x01, 0x00, 0xf2, 0x10, 0x13, 0xed, 0xf4, 0x0a, 0x00, 0x00, 0x0e, + 0x00, 0xee, 0xf7, 0x00, 0x00, 0x01, 0x09, 0x05, 0xf7, 0x00, 0xf7, 0xed, + 0x15, 0x0a, 0xe9, 0xf4, 0x05, 0x09, 0x00, 0xee, 0xf7, 0x00, 0x00, 0x00, + 0x05, 0x00, 0xf7, 0xf7, 0x00, 0x20, 0x13, 0xed, 0xe7, 0xf7, 0x00, 0x05, + 0x15, 0x0e, 0xf2, 0xe7, 0xfd, 0x00, 0x13, 0x15, 0xf6, 0xe2, 0xf7, 0x07, + 0x01, 0x00, 0x13, 0x01, 0xed, 0xe9, 0x07, 0x1b, 0x0a, 0xf7, 0xe9, 0xf7, + 0xfb, 0x13, 0x20, 0xee, 0xdc, 0xee, 0x05, 0x0a, 0x00, 0x00, 0x00, 0xf6, + 0xf7, 0x05, 0x00, 0x00, 0x15, 0xfd, 0xe9, 0xf7, 0x00, 0x07, 0x1b, 0xfd, + 0xe7, 0xf6, 0x0c, 0x17, 0x01, 0xf6, 0xfb, 0x01, 0xf6, 0xfd, 0x17, 0x0c, + 0xe5, 0xeb, 0x15, 0x12, 0xf0, 0xf2, 0xf7, 0x01, 0x10, 0x0a, 0x00, 0xf6, + 0xed, 0xed, 0x00, 0x01, 0x07, 0x05, 0x00, 0xf7, 0xed, 0xf2, 0x0c, 0x1c, + 0x05, 0xeb, 0xf0, 0xfd, 0x07, 0x1b, 0xf7, 0xdc, 0xfd, 0x12, 0x0c, 0x01, + 0xfd, 0xf6, 0x00, 0xfb, 0x00, 0x12, 0x12, 0x00, 0xed, 0xed, 0xfd, 0x01, + 0x0c, 0x12, 0x07, 0xfb, 0xe2, 0xed, 0x0c, 0x22, 0x01, 0xe2, 0xf6, 0x00, + 0xfb, 0x0a, 0x0c, 0xf6, 0xe7, 0xf0, 0xfd, 0x12, 0x0a, 0xf2, 0xf0, 0x00, + 0x0a, 0x00, 0xf7, 0x07, 0x12, 0xf0, 0xdc, 0x00, 0x15, 0x07, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0xed, 0xf7, 0x10, 0x07, 0xfd, 0x05, 0x00, + 0xf7, 0xfd, 0x01, 0xf6, 0xf6, 0x12, 0x10, 0xe7, 0xeb, 0x12, 0x01, 0xed, + 0xfd, 0x00, 0xf7, 0x05, 0x07, 0xeb, 0xf0, 0x0a, 0x15, 0x01, 0xf7, 0xfd, + 0x00, 0xf0, 0x00, 0x15, 0x00, 0xf6, 0xfd, 0x0a, 0x07, 0xfd, 0xf6, 0x0c, + 0x0a, 0xe4, 0x00, 0x17, 0x0c, 0xf6, 0xf0, 0x07, 0x05, 0xfd, 0x00, 0x00, + 0xfb, 0xfb, 0xfb, 0xfb, 0x0c, 0x01, 0xf2, 0x07, 0x05, 0xf2, 0x00, 0x00, + 0x00, 0xfd, 0xf2, 0x07, 0x01, 0xf7, 0x00, 0x00, 0x05, 0x01, 0xf6, 0xeb, + 0x01, 0x07, 0x00, 0x00, 0x05, 0xf2, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0xfb, 0xf6, 0x00, 0x10, 0x00, 0xf0, 0x07, 0x0c, 0x00, 0x01, 0xf6, 0xeb, + 0x01, 0x12, 0x00, 0xee, 0x00, 0x0c, 0x00, 0xfb, 0x00, 0xf6, 0x00, 0x19, + 0x01, 0xeb, 0xf0, 0xfd, 0x12, 0x0e, 0xeb, 0xee, 0x0c, 0x00, 0xf7, 0x00, + 0xf7, 0xfd, 0x0c, 0x13, 0xfb, 0xe4, 0xfd, 0x0c, 0x07, 0xfb, 0xfb, 0xfd, + 0x00, 0x07, 0xfb, 0xfd, 0x0a, 0x07, 0xfb, 0xfd, 0xfd, 0xf7, 0x00, 0x0a, + 0x05, 0x00, 0xfb, 0x00, 0x05, 0xf6, 0x05, 0x05, 0xe9, 0x00, 0x0e, 0xf4, + 0x00, 0x12, 0xee, 0xeb, 0x0c, 0x13, 0xf6, 0xee, 0x00, 0x00, 0xf7, 0x05, + 0x09, 0xfd, 0x05, 0x05, 0xf4, 0xf7, 0xf6, 0xfb, 0x12, 0x0e, 0xee, 0xeb, + 0x07, 0x0c, 0x00, 0x05, 0xf4, 0xf4, 0x05, 0x05, 0x00, 0x05, 0x0c, 0xf0, + 0xee, 0x00, 0x0c, 0x0c, 0xfd, 0xfb, 0xf0, 0x00, 0x09, 0x00, 0x00, 0x07, + 0x05, 0xfb, 0xf4, 0xf7, 0x05, 0x0c, 0xfd, 0xf0, 0x00, 0x07, 0x07, 0x05, + 0xf6, 0xe7, 0xf6, 0x12, 0x1b, 0x01, 0xee, 0xf4, 0x00, 0xf6, 0xfd, 0x00, + 0x0e, 0x0c, 0xfb, 0xed, 0xf4, 0x12, 0x01, 0xf4, 0x07, 0x09, 0x00, 0x00, + 0x00, 0xee, 0xf0, 0x00, 0x05, 0x15, 0x0c, 0xf0, 0xf9, 0x01, 0xfb, 0xf9, + 0x07, 0x13, 0x00, 0xf6, 0xf4, 0xf4, 0x05, 0x0e, 0x00, 0xe9, 0x09, 0x1b, + 0xfb, 0xed, 0x00, 0x09, 0xf0, 0x00, 0x19, 0x05, 0xe9, 0xfd, 0x15, 0xf9, + 0xe2, 0x05, 0x15, 0x01, 0x00, 0x01, 0xf4, 0xe9, 0xfb, 0x19, 0x0c, 0xf6, + 0xfb, 0xfd, 0xee, 0xfb, 0x15, 0x0c, 0xee, 0xf0, 0x0e, 0x10, 0xfd, 0xf0, + 0xf9, 0x00, 0x07, 0x0c, 0xfb, 0xfd, 0x09, 0x00, 0xf2, 0xed, 0x00, 0x0e, + 0x01, 0x05, 0x01, 0xee, 0xe7, 0x0e, 0x15, 0xe9, 0xee, 0x15, 0x09, 0xed, + 0x00, 0x05, 0xe2, 0xfb, 0x10, 0x09, 0xfd, 0x07, 0xf9, 0xe2, 0x05, 0x17, + 0xfd, 0xf2, 0x01, 0x09, 0x05, 0xfd, 0xed, 0xf9, 0x10, 0x0e, 0x00, 0xfd, + 0xf2, 0xf4, 0x05, 0x13, 0xf9, 0xee, 0x07, 0x0e, 0x00, 0xf4, 0xf2, 0xf6, + 0x09, 0x0e, 0x00, 0xfb, 0xfd, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x09, 0xfb, + 0xee, 0x01, 0x03, 0xf9, 0x00, 0x10, 0x01, 0xe7, 0xf6, 0x10, 0x07, 0xeb, + 0x00, 0x01, 0xf9, 0x00, 0x0e, 0x00, 0xf2, 0x00, 0xfb, 0x00, 0x0a, 0x07, + 0xf2, 0xf4, 0x03, 0x00, 0x03, 0x09, 0xf4, 0xfd, 0x01, 0x00, 0x01, 0x03, + 0x00, 0xfd, 0x09, 0x01, 0xee, 0xfb, 0x10, 0x01, 0xf2, 0x00, 0x00, 0x00, + 0x10, 0x01, 0xf2, 0xfd, 0x00, 0xf2, 0xfb, 0x0a, 0x01, 0xf4, 0xfb, 0x00, + 0xfb, 0x00, 0x00, 0xf4, 0x00, 0x12, 0x01, 0xeb, 0xf0, 0x01, 0x03, 0x01, + 0x09, 0x01, 0xf9, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0xf2, + 0xf4, 0x12, 0x01, 0xe9, 0xfd, 0x19, 0x00, 0xf9, 0x07, 0xf9, 0xed, 0xfd, + 0x03, 0x07, 0x0a, 0x01, 0xf2, 0xe5, 0xf6, 0x0a, 0x0a, 0x00, 0x01, 0xf9, + 0xeb, 0xf9, 0x07, 0x07, 0xf9, 0xed, 0x00, 0x17, 0x00, 0xf2, 0xf9, 0x00, + 0xfd, 0x00, 0x0e, 0x07, 0x00, 0x00, 0xf2, 0xf2, 0x00, 0x0a, 0x03, 0x0a, + 0x01, 0xf2, 0xf0, 0x01, 0x07, 0x00, 0x00, 0x00, 0xf7, 0x03, 0x17, 0xf7, + 0xe7, 0xfb, 0x03, 0x00, 0x00, 0x0a, 0x0c, 0xf2, 0xe7, 0x00, 0x0c, 0xfd, + 0xf7, 0x01, 0x10, 0x00, 0xe7, 0xf7, 0x07, 0x09, 0x03, 0xfd, 0xfd, 0x00, + 0xf7, 0x03, 0x07, 0xeb, 0xf7, 0x0a, 0x0a, 0x03, 0x01, 0xf7, 0xe4, 0xfb, + 0x15, 0x10, 0xf9, 0x00, 0x07, 0xf0, 0xf2, 0x10, 0x03, 0xfb, 0x03, 0xfb, + 0x00, 0x03, 0x00, 0xf0, 0x00, 0x10, 0xf9, 0xfd, 0x0a, 0x00, 0xfd, 0xfb, + 0xf4, 0xfb, 0x09, 0x0a, 0x00, 0xfd, 0x00, 0xee, 0xf4, 0x15, 0x03, 0xf2, + 0x09, 0x03, 0xf0, 0x03, 0x01, 0xeb, 0x01, 0x12, 0x00, 0xeb, 0xf4, 0x09, + 0x10, 0x01, 0x00, 0x00, 0xf2, 0x00, 0x10, 0xfd, 0xf7, 0x00, 0xf7, 0xfb, + 0x0a, 0x09, 0xf9, 0xfd, 0x0a, 0x00, 0xee, 0xfb, 0x09, 0x00, 0xf7, 0x00, + 0x07, 0xfb, 0xf4, 0x03, 0x0a, 0x00, 0xe7, 0x00, 0x12, 0xfb, 0x00, 0x12, + 0xf7, 0xed, 0x03, 0x0c, 0xfd, 0xf9, 0x00, 0x00, 0xfb, 0x00, 0x09, 0x07, + 0x00, 0x03, 0x00, 0xf7, 0xf9, 0x00, 0x09, 0x09, 0xfb, 0xf7, 0xfd, 0xf9, + 0x00, 0x13, 0x0a, 0xee, 0xe9, 0xfd, 0x05, 0x00, 0x00, 0x09, 0xf7, 0xed, + 0x00, 0x03, 0x00, 0x00, 0xfb, 0xfd, 0x09, 0x03, 0xfb, 0x01, 0x03, 0xf9, + 0xf7, 0x00, 0x0a, 0x00, 0x00, 0x01, 0xf2, 0xee, 0x0c, 0x17, 0x00, 0xf6, + 0x03, 0xfb, 0xed, 0x09, 0x0a, 0x01, 0xf7, 0xf9, 0x0a, 0x05, 0xed, 0xf7, + 0x0e, 0x00, 0xf2, 0x00, 0x05, 0xfd, 0xfd, 0x00, 0xf9, 0xf9, 0x0a, 0x09, + 0xf9, 0xfd, 0xfd, 0xf7, 0x00, 0x00, 0x01, 0x05, 0x00, 0xfd, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf9, 0x00, 0x00, 0x00, + 0x01, 0x10, 0x00, 0xed, 0xf6, 0x0a, 0x03, 0x00, 0xff, 0x00, 0x00, 0xf4, + 0xff, 0x09, 0xff, 0xf6, 0x01, 0x00, 0xfb, 0x00, 0x00, 0x01, 0xfb, 0xf6, + 0xfb, 0x00, 0x05, 0x09, 0xfb, 0x00, 0x00, 0xed, 0x01, 0x1c, 0x03, 0xee, + 0x00, 0x05, 0xf6, 0xf9, 0x10, 0x05, 0xf4, 0x01, 0x05, 0xf9, 0xf9, 0x00, + 0x03, 0xff, 0xfb, 0x07, 0x03, 0xf6, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x05, + 0xf2, 0xf2, 0x0e, 0x05, 0xf2, 0xfb, 0x03, 0x00, 0x01, 0x0e, 0x00, 0xee, + 0xf6, 0x03, 0x00, 0x00, 0x13, 0x00, 0xeb, 0xf6, 0x05, 0x03, 0x03, 0x05, + 0x00, 0xf6, 0xf6, 0x05, 0x0c, 0x00, 0xfb, 0x03, 0x00, 0xeb, 0xfb, 0x0e, + 0x0a, 0xf7, 0xf6, 0xfb, 0x07, 0x0c, 0xff, 0x00, 0xf9, 0xf7, 0x00, 0x07, + 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0x01, 0x03, 0x00, 0xf6, 0xfb, 0x05, + 0x00, 0x00, 0x0c, 0x00, 0xed, 0xfb, 0x0c, 0x05, 0x00, 0xff, 0xf9, 0x01, + 0x00, 0x00, 0x07, 0x01, 0xf7, 0xf4, 0x07, 0x00, 0xf6, 0x0c, 0xff, 0xeb, + 0x05, 0x12, 0x00, 0xf6, 0x00, 0x00, 0xff, 0x00, 0xff, 0xf9, 0x00, 0x00, + 0xf6, 0x00, 0x09, 0x00, 0x00, 0x00, 0xf0, 0xf4, 0x07, 0x17, 0x03, 0xe7, + 0xf9, 0x0e, 0x00, 0x00, 0x0c, 0xfb, 0xf2, 0x01, 0x03, 0xfb, 0x00, 0x05, + 0x00, 0xf7, 0xff, 0x05, 0x03, 0x00, 0xf9, 0xf7, 0x00, 0xf9, 0xff, 0x09, + 0x0c, 0x00, 0xf0, 0xfb, 0xff, 0x00, 0x12, 0x0e, 0xf2, 0xf7, 0x03, 0xf6, + 0xfb, 0x09, 0x00, 0xf4, 0x03, 0x01, 0xf6, 0x00, 0x09, 0xff, 0xf7, 0x00, + 0x00, 0x00, 0x09, 0x00, 0xf0, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0xff, + 0x05, 0xff, 0xeb, 0x00, 0x13, 0x01, 0xf4, 0xfd, 0x05, 0x05, 0x00, 0xf2, + 0xf4, 0x03, 0x0a, 0x00, 0xf9, 0xff, 0xfd, 0x03, 0x0c, 0x00, 0xeb, 0xff, + 0x15, 0x07, 0xf4, 0xf4, 0xf9, 0xf9, 0x01, 0x13, 0x01, 0xf4, 0x00, 0x03, + 0x00, 0xf4, 0xf9, 0x07, 0x12, 0xff, 0xf4, 0xf6, 0xfd, 0x01, 0x0c, 0x09, + 0xfd, 0xf4, 0x00, 0x00, 0x00, 0x03, 0x09, 0xff, 0xee, 0x00, 0x13, 0x00, + 0xf0, 0xfd, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0xfd, + 0x0a, 0x0c, 0x00, 0xf2, 0xed, 0xff, 0x09, 0x01, 0xf6, 0x00, 0x00, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0xfb, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x01, 0x00, 0x00, 0x03, 0xfb, 0xf4, 0xff, 0x07, 0x07, + 0xfb, 0xf7, 0xfb, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xfd, 0x00, 0x01, 0xfd, + 0xf7, 0x01, 0x07, 0xfb, 0xf2, 0xff, 0x09, 0x01, 0xff, 0x00, 0x00, 0x05, + 0x00, 0x00, 0xff, 0x03, 0x00, 0xff, 0x01, 0xfb, 0x00, 0x0c, 0x03, 0xfb, + 0xfd, 0xf6, 0xf9, 0x09, 0x0a, 0x00, 0xff, 0xfd, 0xf9, 0xf6, 0x01, 0x09, + 0x00, 0xfd, 0x00, 0xf6, 0xfd, 0x0e, 0x03, 0xf6, 0xff, 0x05, 0x03, 0xff, + 0xf7, 0x01, 0x01, 0xf7, 0xfd, 0x0a, 0x09, 0xfb, 0x00, 0xff, 0xff, 0xfd, + 0x05, 0x0a, 0xfb, 0xf7, 0x01, 0x0a, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x05, + 0xff, 0xf6, 0x00, 0x05, 0xfb, 0xff, 0x0c, 0x01, 0xf6, 0xf9, 0x00, 0x00, + 0x0c, 0x07, 0xf0, 0xf4, 0x03, 0x0a, 0x00, 0xff, 0x00, 0xff, 0xfd, 0xff, + 0x09, 0x0a, 0xfd, 0xf6, 0xfd, 0x00, 0xfd, 0x00, 0x12, 0x00, 0xed, 0xfb, + 0x05, 0x00, 0x00, 0x0a, 0x00, 0xf4, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfd, 0x00, 0x09, 0x07, 0xfb, 0xf6, 0x00, 0x01, 0xfd, 0x00, 0x0c, + 0xfb, 0xf2, 0xff, 0x03, 0xfd, 0x05, 0x0a, 0x00, 0xf0, 0xf0, 0x07, 0x10, + 0x00, 0xf4, 0x00, 0x00, 0xfb, 0x00, 0x09, 0x09, 0x03, 0xfb, 0xf4, 0xf7, + 0x03, 0x0e, 0x09, 0xfb, 0xee, 0xfb, 0x09, 0x05, 0x00, 0x01, 0xff, 0xf9, + 0xfb, 0x00, 0x07, 0xff, 0xfd, 0x0a, 0xff, 0xee, 0xfb, 0x0e, 0x05, 0xee, + 0xf7, 0x09, 0x09, 0xf9, 0xff, 0x09, 0xfb, 0xf2, 0x00, 0x0a, 0xfd, 0x00, + 0x0a, 0xff, 0xf0, 0xff, 0x0a, 0x03, 0x01, 0xff, 0xf2, 0x00, 0x0e, 0x00, + 0xee, 0x00, 0x0c, 0x00, 0xfd, 0x05, 0x01, 0xf2, 0xfd, 0x0c, 0x03, 0xfb, + 0xff, 0x07, 0x01, 0xf4, 0xf6, 0x00, 0x0a, 0x00, 0x00, 0xfd, 0xf7, 0x00, + 0x05, 0x09, 0x00, 0xf0, 0xf7, 0x05, 0x0e, 0x01, 0xfb, 0xf4, 0xff, 0x09, + 0x07, 0x00, 0x00, 0xf6, 0xf4, 0x05, 0x07, 0xf6, 0x00, 0x0e, 0x00, 0xf0, + 0xfb, 0x05, 0x07, 0x07, 0x00, 0xf2, 0xf4, 0x01, 0x0c, 0x05, 0x00, 0xf4, + 0xf2, 0x09, 0x0a, 0xfd, 0xf7, 0x03, 0x03, 0xf9, 0xee, 0x00, 0x10, 0x05, + 0xf9, 0xfb, 0xfd, 0x01, 0x07, 0x05, 0xff, 0xf9, 0x05, 0x00, 0xf7, 0x00, + 0x09, 0x05, 0xfd, 0xff, 0xfd, 0xfb, 0xff, 0x09, 0x07, 0xfd, 0xfb, 0xfd, + 0x00, 0xff, 0x00, 0x03, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xf7, 0x01, 0x0e, 0xff, 0xf4, 0xff, 0x03, 0x00, 0x00, 0x0e, 0x05, + 0xed, 0xf4, 0x03, 0x00, 0x01, 0x12, 0x05, 0xf7, 0xee, 0xf7, 0x05, 0x0a, + 0x03, 0xff, 0x00, 0xfd, 0xf4, 0xff, 0x0c, 0x03, 0xfb, 0xf6, 0xff, 0x09, + 0x07, 0xff, 0xf7, 0x00, 0xf7, 0xfd, 0x0a, 0x0e, 0xf7, 0xee, 0x00, 0x00, + 0xf9, 0x00, 0x12, 0x07, 0xf2, 0xee, 0x00, 0x0c, 0x00, 0xfd, 0x00, 0x00, + 0x00, 0xfb, 0xfd, 0x01, 0xf9, 0xff, 0x03, 0x00, 0x00, 0x0a, 0x05, 0xf7, + 0xee, 0xfd, 0x0a, 0x09, 0x00, 0xf9, 0xf9, 0x00, 0x03, 0x01, 0x01, 0x00, + 0x00, 0x07, 0xff, 0xf9, 0x00, 0x01, 0xfd, 0xfb, 0x01, 0x01, 0x01, 0x01, + 0xff, 0xf0, 0xf7, 0x03, 0x0a, 0x05, 0xfd, 0xfd, 0x00, 0xf4, 0xf2, 0x03, + 0x0c, 0xff, 0xf4, 0x00, 0x07, 0xfd, 0xfd, 0x03, 0x03, 0xff, 0xfb, 0x0a, + 0x07, 0xf9, 0xf7, 0x00, 0x00, 0x00, 0x05, 0x03, 0x00, 0xfd, 0xf9, 0xf7, + 0xff, 0x0c, 0x0c, 0x00, 0xf9, 0xfd, 0xfb, 0x00, 0x07, 0xff, 0xf6, 0x00, + 0x09, 0x00, 0xf6, 0xff, 0x0a, 0x03, 0xf4, 0xf6, 0x05, 0x03, 0xf9, 0xf9, + 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xfb, 0x00, + 0x0a, 0x00, 0xf6, 0x00, 0x0c, 0xff, 0xf0, 0x00, 0x01, 0x05, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x07, 0x00, 0xf7, 0x00, + 0x00, 0x00, 0xfb, 0x01, 0x09, 0x03, 0xf6, 0xf0, 0x03, 0x0c, 0xf7, 0xf7, + 0x0c, 0xff, 0xee, 0x00, 0x05, 0xf7, 0x00, 0x0e, 0x00, 0xf2, 0xf9, 0x0e, + 0x03, 0xf4, 0xf9, 0x00, 0x00, 0x05, 0x03, 0xf9, 0xf7, 0x00, 0x05, 0x09, + 0xff, 0xf9, 0x01, 0x03, 0x00, 0xf7, 0xf9, 0x01, 0x05, 0x03, 0xfb, 0xf7, + 0x00, 0x05, 0x01, 0x00, 0xf9, 0xff, 0x05, 0x07, 0xf9, 0xf6, 0x00, 0x01, + 0xf9, 0x00, 0x09, 0xfd, 0xfb, 0x05, 0xfb, 0xf4, 0x01, 0x0c, 0x00, 0xf2, + 0x01, 0x09, 0xfd, 0xf9, 0xff, 0xff, 0x00, 0x01, 0xfd, 0x00, 0x01, 0xf9, + 0xfb, 0x00, 0x05, 0x07, 0x01, 0xff, 0xf2, 0xf9, 0x07, 0x10, 0x01, 0xf4, + 0xf7, 0x01, 0x09, 0xfb, 0x00, 0x0c, 0xff, 0xf2, 0xfb, 0x0a, 0x07, 0xf9, + 0xfd, 0xff, 0xf4, 0xff, 0x0c, 0x0a, 0xf6, 0xee, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0xfd, 0xf7, 0xff, 0x09, 0x01, 0xfd, 0x03, 0x00, 0xf9, 0xfd, + 0x03, 0x01, 0x01, 0x01, 0xfd, 0xf9, 0xff, 0x01, 0x00, 0xfb, 0x00, 0x07, + 0x00, 0xf9, 0x00, 0x01, 0xff, 0xfb, 0x09, 0x09, 0xf7, 0xf7, 0x01, 0x00, + 0x00, 0xfd, 0x01, 0x01, 0x00, 0x01, 0xfb, 0xf6, 0xfb, 0x09, 0x0c, 0x00, + 0xfb, 0xfb, 0x00, 0x00, 0xfb, 0x00, 0x01, 0x09, 0x00, 0xfb, 0xfd, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x05, 0x00, 0xf7, 0x00, 0x09, 0x00, + 0xfb, 0xfd, 0x03, 0x01, 0xfd, 0xfb, 0x01, 0x05, 0x00, 0xfb, 0x00, 0x07, + 0xfb, 0xf4, 0xff, 0x01, 0x01, 0x07, 0x07, 0xf9, 0xf0, 0xfb, 0x07, 0x07, + 0x00, 0x00, 0x03, 0x00, 0xf0, 0xfd, 0x09, 0x01, 0xfb, 0xff, 0x00, 0xfb, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf7, 0xfb, 0xff, + 0x00, 0xff, 0x07, 0x07, 0xff, 0xf9, 0xf6, 0xfd, 0x03, 0x07, 0x07, 0xff, + 0xf4, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfb, 0xf9, 0x00, 0x07, 0x03, + 0xff, 0x00, 0x00, 0xfb, 0xfb, 0x03, 0x01, 0xf9, 0xfb, 0x03, 0x05, 0xff, + 0x00, 0x00, 0xf9, 0xfd, 0x00, 0x00, 0x00, 0x07, 0xfd, 0xf6, 0x00, 0x01, + 0x00, 0xfb, 0x00, 0x03, 0x00, 0xfb, 0xf6, 0x00, 0x0a, 0x00, 0xfb, 0x01, + 0x01, 0xf6, 0xfb, 0x07, 0xfd, 0x00, 0x05, 0x00, 0xfb, 0xfd, 0xfd, 0x05, + 0x05, 0x01, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x03, + 0x00, 0x00, 0x01, 0xff, 0xf6, 0xff, 0x0a, 0x0a, 0x00, 0xf7, 0xf7, 0xfb, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xf9, 0xfb, 0x00, 0x0a, 0x05, + 0xfd, 0xf6, 0xfd, 0x05, 0x00, 0xf7, 0xf9, 0x00, 0x05, 0x05, 0x00, 0xff, + 0x00, 0xf9, 0xfd, 0x05, 0x01, 0xfd, 0x01, 0x00, 0xf7, 0xf9, 0x00, 0x01, + 0x00, 0x00, 0x03, 0xfd, 0xf9, 0xfd, 0x00, 0x03, 0x05, 0x00, 0xf9, 0xf9, + 0x00, 0xfd, 0xff, 0x00, 0x05, 0x05, 0x00, 0xfd, 0xf7, 0x03, 0x07, 0xfd, + 0xf6, 0x00, 0x05, 0xff, 0x00, 0x00, 0xf9, 0xfd, 0x00, 0xff, 0x00, 0x03, + 0x00, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x05, 0x05, 0xfb, 0xf4, 0x00, 0x05, + 0xfd, 0xfd, 0x01, 0x03, 0xfd, 0xfd, 0x03, 0x05, 0x00, 0xfb, 0xfd, 0x00, + 0xfb, 0x03, 0x0e, 0x00, 0xf4, 0xf4, 0x00, 0x09, 0x01, 0x00, 0x00, 0xfd, + 0xfd, 0x00, 0x00, 0xfb, 0x00, 0x07, 0x00, 0xf6, 0xfb, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xfd, 0xfd, 0x05, 0xfd, 0xf9, 0x03, 0x00, 0xf6, 0xfd, + 0x07, 0x05, 0xf6, 0xf7, 0x05, 0x09, 0x00, 0xf9, 0xf7, 0x01, 0x09, 0x00, + 0xf9, 0xf9, 0x03, 0x09, 0x00, 0xfd, 0xff, 0xfd, 0x00, 0x03, 0xfd, 0xff, + 0x07, 0x00, 0xf7, 0xfb, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf9, 0xfd, 0x07, + 0x0c, 0x00, 0xf6, 0xfd, 0x00, 0xff, 0x00, 0x09, 0x00, 0xf4, 0xf6, 0x05, + 0x0c, 0x01, 0xf6, 0xf7, 0x01, 0x09, 0xfd, 0xf9, 0x03, 0x01, 0xfb, 0xfd, + 0xfd, 0x00, 0x03, 0x05, 0xfb, 0xf4, 0xf9, 0x07, 0x0a, 0x00, 0xfb, 0x00, + 0xf6, 0xfd, 0x0c, 0x09, 0xf6, 0xf4, 0x07, 0x05, 0xf7, 0x03, 0x07, 0xfd, + 0xfd, 0x00, 0x00, 0xfd, 0x01, 0x03, 0x00, 0xff, 0x00, 0xff, 0x00, 0x01, + 0x00, 0xff, 0x00, 0x00, 0xff, 0xfb, 0x00, 0x09, 0x00, 0xf9, 0x00, 0x00, + 0xfd, 0xfb, 0x00, 0x05, 0x00, 0x00, 0xff, 0xf6, 0xff, 0x07, 0x07, 0xff, + 0xfd, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, + 0x05, 0xff, 0xf6, 0xff, 0x07, 0x05, 0x03, 0xff, 0xf7, 0xff, 0x00, 0xff, + 0x00, 0x09, 0x05, 0xf6, 0xf7, 0x00, 0x03, 0x00, 0x00, 0xff, 0xf7, 0xff, + 0x03, 0x01, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x05, 0x03, 0xfd, 0xf7, + 0xff, 0x00, 0x05, 0x03, 0x00, 0xff, 0xf7, 0xff, 0x03, 0x03, 0x00, 0xff, + 0xfd, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0xff, 0xfd, 0xff, 0x01, 0x03, 0x00, 0xfd, 0xf9, 0x01, 0x03, 0xfb, 0xf9, + 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xfd, 0x03, 0x07, 0x00, 0xfb, + 0xfd, 0xf9, 0xfd, 0x07, 0x09, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xfd, 0x01, + 0x05, 0xff, 0xfb, 0xff, 0x00, 0x03, 0x05, 0x00, 0xf9, 0xf9, 0x01, 0x0a, + 0xff, 0xf2, 0xff, 0x0a, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xfd, + 0x05, 0x05, 0x00, 0xfb, 0xf9, 0xfd, 0x03, 0x05, 0x00, 0xfd, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x01, 0x01, 0xfd, 0xf6, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0x00, 0x00, 0xff, 0xfb, + 0x00, 0x01, 0x05, 0x05, 0xf7, 0xf6, 0x00, 0x01, 0xfd, 0x01, 0x07, 0x00, + 0xf6, 0xf9, 0x01, 0x05, 0x01, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0x07, 0x01, + 0xf7, 0xf7, 0x00, 0x07, 0x01, 0xfd, 0x00, 0x01, 0xf9, 0xfb, 0x00, 0x09, + 0x09, 0xff, 0xf6, 0xf6, 0x01, 0x0a, 0x01, 0xff, 0xff, 0xfd, 0x00, 0x00, + 0xfd, 0x00, 0x07, 0x00, 0xfb, 0xfd, 0xff, 0x03, 0x07, 0x00, 0xfd, 0xfd, + 0x01, 0x07, 0x00, 0xfd, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf9, + 0xf9, 0xff, 0x01, 0x01, 0x01, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0xfb, 0x03, + 0x03, 0xff, 0xfb, 0x00, 0x07, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x03, + 0x00, 0xf7, 0xfb, 0x03, 0x03, 0xfb, 0xf9, 0x00, 0x0a, 0x00, 0xf6, 0xf6, + 0x01, 0x09, 0x00, 0xff, 0x00, 0xff, 0xf7, 0xfd, 0x03, 0x01, 0xff, 0x03, + 0x05, 0xfb, 0xf4, 0x00, 0x0a, 0x05, 0xfd, 0xf9, 0xff, 0x01, 0x00, 0x00, + 0xff, 0xfb, 0x00, 0x01, 0xff, 0x00, 0x03, 0x00, 0xfb, 0xf9, 0xfd, 0x07, + 0x09, 0xff, 0xf9, 0xff, 0xff, 0xfd, 0xff, 0x05, 0x05, 0xfd, 0xfb, 0x01, + 0x03, 0xfd, 0x00, 0x03, 0x01, 0xf9, 0xfd, 0x07, 0x00, 0xf7, 0x01, 0x09, + 0xff, 0xf7, 0xff, 0x05, 0x00, 0xfd, 0x00, 0xff, 0x00, 0x03, 0x01, 0xf7, + 0xfd, 0x03, 0xff, 0xfd, 0x00, 0x00, 0x03, 0x00, 0xfd, 0xfd, 0xff, 0x00, + 0x03, 0x01, 0xfd, 0xfd, 0x00, 0xff, 0xff, 0x00, 0x03, 0x03, 0x00, 0xfd, + 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0x00, 0x01, 0x00, 0x01, 0x05, 0xfd, 0xf7, 0xfd, 0x00, 0x05, 0x07, + 0xfd, 0xf7, 0xfd, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xfd, 0xf9, + 0x03, 0x09, 0x00, 0xf7, 0xfd, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, + 0x01, 0xff, 0xf9, 0xfd, 0x01, 0x01, 0xfd, 0xfd, 0x01, 0x03, 0x00, 0xf9, + 0xff, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0xf9, 0xfd, 0x03, 0x03, 0xff, + 0x00, 0x00, 0xff, 0xfd, 0x00, 0x01, 0x01, 0xff, 0x00, 0xff, 0xf9, 0x00, + 0x05, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0x01, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x01, 0xfb, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0x01, + 0x00, 0xff, 0xfd, 0xfb, 0x03, 0x07, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x01, + 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x01, 0x01, 0xfd, 0xfb, + 0x00, 0x01, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, + 0xfd, 0xfd, 0x01, 0x01, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xfd, 0x00, + 0x01, 0xff, 0xfb, 0x01, 0x03, 0xff, 0x01, 0x01, 0xfb, 0xfd, 0x01, 0x01, + 0xff, 0x00, 0x01, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0x00, 0x01, 0xff, + 0xff, 0x03, 0x00, 0xfd, 0xff, 0x00, 0x01, 0xff, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xfd, 0xff, 0x03, 0x03, 0xfd, + 0xfb, 0x01, 0x05, 0xfb, 0xf9, 0x00, 0x05, 0x00, 0x00, 0x00, 0xf9, 0xff, + 0x03, 0x05, 0x00, 0xfb, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x00, 0xff, 0x01, 0x00, 0xff, 0xfd, 0xff, 0x01, 0x01, 0x00, 0xff, 0xfd, + 0xfb, 0x00, 0x05, 0x05, 0x00, 0xff, 0xfb, 0xf9, 0x00, 0x07, 0x01, 0xfb, + 0xfd, 0x05, 0x00, 0xfb, 0xfb, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xff, 0xfb, 0xff, 0x05, 0x03, 0xfd, 0xf9, 0xfd, 0x00, 0x00, 0x03, + 0x01, 0xfb, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0xff, 0xfd, 0x01, + 0x03, 0x00, 0xff, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x05, 0x00, 0xfb, 0xfd, + 0x01, 0x03, 0x00, 0xfd, 0xf9, 0x00, 0x03, 0x03, 0x00, 0xfb, 0xfd, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x01, 0xff, 0xfd, + 0xfd, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, + 0xfd, 0xff, 0x00, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0xfd, 0x00, 0x01, 0x03, 0x00, 0xfd, 0xfb, 0xff, 0x00, 0x01, 0x01, 0x00, + 0xff, 0xfd, 0xff, 0x00, 0x00, 0x01, 0x03, 0x00, 0xfd, 0xfb, 0xff, 0x01, + 0x03, 0x00, 0xfb, 0x00, 0x03, 0x01, 0x00, 0xff, 0xfb, 0xfd, 0x05, 0x05, + 0xff, 0xff, 0x00, 0xff, 0xfb, 0x00, 0x03, 0x01, 0x00, 0x00, 0xfb, 0xfd, + 0x01, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0x03, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x05, 0x00, 0xfd, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x03, 0xff, 0xfb, 0x00, 0x05, 0x00, 0xfd, + 0x00, 0x00, 0xff, 0x01, 0x03, 0xff, 0xfd, 0x00, 0x01, 0xff, 0xff, 0x01, + 0x01, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, + 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfd, 0x01, + 0x01, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0x00, 0x03, 0x00, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x03, 0x00, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x00, + 0xff, 0x00, 0x00, 0xfd, 0xfd, 0x03, 0x01, 0x00, 0x00, 0x00, 0xfd, 0xfd, + 0x00, 0x03, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x03, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xff, + 0xff, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, + 0x01, 0xff, 0xfd, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x01, 0x00, 0xfd, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x00, 0x01, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, + 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf8, + 0xf7, 0xf5, 0xf2, 0xf1, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe4, 0xe1, 0xe0, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, 0xe3, 0xe5, 0xe5, + 0xe3, 0xe2, 0xe3, 0xe8, 0xea, 0xec, 0xee, 0xec, 0xed, 0xf4, 0xf7, 0xf7, + 0xf7, 0xf8, 0xfa, 0xf8, 0xfa, 0xff, 0x02, 0x02, 0x05, 0x04, 0x02, 0x0c, + 0x0e, 0x02, 0xfb, 0x04, 0x10, 0x1f, 0x22, 0x20, 0x1e, 0x14, 0x14, 0x14, + 0x0e, 0x0e, 0x14, 0x0f, 0x0d, 0x12, 0x11, 0x11, 0x14, 0x12, 0x10, 0x0a, + 0x00, 0xfa, 0xf4, 0xee, 0xef, 0xed, 0xe2, 0xdb, 0xd7, 0xd5, 0xd7, 0xd4, + 0xcb, 0xbf, 0xb3, 0xa8, 0xa2, 0xa0, 0x9a, 0x99, 0x99, 0x9d, 0x9f, 0xa3, + 0xaa, 0xae, 0xb1, 0xb1, 0xb6, 0xb8, 0xb8, 0xbd, 0xbe, 0xb9, 0xbf, 0xc8, + 0xcc, 0xcf, 0xd3, 0xd7, 0xd4, 0xcf, 0xde, 0xed, 0xe3, 0xe9, 0xf8, 0xf3, + 0xeb, 0xf4, 0x04, 0x0d, 0x15, 0x16, 0x0c, 0x03, 0x0c, 0x24, 0x34, 0x44, + 0x4f, 0x45, 0x37, 0x37, 0x3c, 0x45, 0x54, 0x5c, 0x5b, 0x52, 0x4a, 0x4c, + 0x57, 0x5d, 0x5d, 0x5d, 0x61, 0x61, 0x5b, 0x5e, 0x6b, 0x74, 0x72, 0x70, + 0x6d, 0x67, 0x66, 0x6e, 0x78, 0x76, 0x70, 0x68, 0x5f, 0x5b, 0x55, 0x55, + 0x5f, 0x65, 0x61, 0x59, 0x56, 0x56, 0x51, 0x4a, 0x4c, 0x58, 0x5b, 0x55, + 0x4c, 0x3c, 0x40, 0x4e, 0x47, 0x3a, 0x3b, 0x3d, 0x36, 0x2f, 0x2e, 0x32, + 0x34, 0x31, 0x2d, 0x23, 0x1c, 0x29, 0x37, 0x2f, 0x21, 0x25, 0x2e, 0x2d, + 0x20, 0x16, 0x22, 0x37, 0x41, 0x37, 0x22, 0x1e, 0x2c, 0x38, 0x3a, 0x3a, + 0x3b, 0x38, 0x34, 0x30, 0x34, 0x3f, 0x40, 0x3b, 0x3a, 0x3b, 0x40, 0x4b, + 0x51, 0x4a, 0x44, 0x48, 0x4e, 0x4e, 0x4b, 0x4b, 0x51, 0x56, 0x56, 0x53, + 0x4c, 0x46, 0x46, 0x4c, 0x54, 0x54, 0x4b, 0x42, 0x44, 0x4a, 0x4c, 0x48, + 0x44, 0x46, 0x49, 0x4b, 0x4a, 0x4a, 0x4b, 0x45, 0x3c, 0x35, 0x38, 0x40, + 0x44, 0x3f, 0x36, 0x31, 0x2f, 0x2e, 0x2f, 0x31, 0x38, 0x3d, 0x37, 0x28, + 0x1a, 0x1d, 0x2a, 0x34, 0x33, 0x2c, 0x2a, 0x2a, 0x2a, 0x28, 0x26, 0x2c, + 0x38, 0x38, 0x2a, 0x24, 0x2b, 0x31, 0x32, 0x33, 0x31, 0x2a, 0x26, 0x2a, + 0x2d, 0x30, 0x3c, 0x44, 0x3b, 0x2a, 0x28, 0x30, 0x35, 0x3d, 0x43, 0x3b, + 0x32, 0x33, 0x33, 0x2f, 0x2b, 0x31, 0x38, 0x37, 0x30, 0x29, 0x24, 0x20, + 0x1f, 0x1c, 0x11, 0x06, 0x00, 0xfb, 0xfa, 0xfb, 0xfa, 0xf8, 0xee, 0xe3, + 0xdf, 0xde, 0xde, 0xdb, 0xd7, 0xd3, 0xc9, 0xc3, 0xc5, 0xc7, 0xc6, 0xcc, + 0xd4, 0xd3, 0xd0, 0xd2, 0xd9, 0xe4, 0xed, 0xef, 0xea, 0xe4, 0xe0, 0xe2, + 0xeb, 0xf4, 0xf1, 0xef, 0xf1, 0xeb, 0xe7, 0xea, 0xf1, 0xf9, 0xfa, 0xf5, + 0xef, 0xea, 0xee, 0xf7, 0xfb, 0xff, 0x0b, 0x0b, 0xfd, 0xf9, 0x02, 0x11, + 0x17, 0x0f, 0x09, 0x0c, 0x15, 0x1b, 0x18, 0x14, 0x1a, 0x24, 0x20, 0x0f, + 0x07, 0x13, 0x25, 0x25, 0x16, 0x13, 0x1e, 0x21, 0x1c, 0x19, 0x1d, 0x2a, + 0x33, 0x27, 0x15, 0x17, 0x25, 0x29, 0x1c, 0x0d, 0x0e, 0x19, 0x20, 0x1a, + 0x0e, 0x06, 0x08, 0x0d, 0x07, 0xff, 0x00, 0x05, 0x09, 0x05, 0xfd, 0xfa, + 0xfa, 0xf5, 0xf2, 0xf6, 0xf8, 0xf4, 0xec, 0xdf, 0xd7, 0xd8, 0xde, 0xe3, + 0xe2, 0xda, 0xd4, 0xd4, 0xd7, 0xdb, 0xdb, 0xd2, 0xcd, 0xd1, 0xd7, 0xd9, + 0xdb, 0xde, 0xe4, 0xe7, 0xdf, 0xda, 0xe3, 0xf1, 0xfc, 0xff, 0xfe, 0xfd, + 0xf9, 0xf6, 0xf7, 0xfc, 0x0b, 0x20, 0x1a, 0x08, 0x0e, 0x18, 0x1c, 0x1e, + 0x28, 0x32, 0x37, 0x37, 0x39, 0x3a, 0x3a, 0x48, 0x4d, 0x3a, 0x2d, 0x35, + 0x3e, 0x49, 0x50, 0x48, 0x39, 0x33, 0x33, 0x38, 0x3d, 0x45, 0x4b, 0x48, + 0x40, 0x3d, 0x41, 0x41, 0x46, 0x4e, 0x50, 0x4e, 0x42, 0x33, 0x2e, 0x31, + 0x31, 0x36, 0x3d, 0x37, 0x2b, 0x23, 0x26, 0x2e, 0x33, 0x2f, 0x23, 0x18, + 0x1a, 0x25, 0x29, 0x26, 0x28, 0x22, 0x1b, 0x1d, 0x1e, 0x20, 0x24, 0x2c, + 0x31, 0x27, 0x1d, 0x1e, 0x1c, 0x1a, 0x28, 0x32, 0x29, 0x1f, 0x22, 0x28, + 0x2c, 0x35, 0x3a, 0x33, 0x2b, 0x28, 0x2b, 0x38, 0x48, 0x45, 0x38, 0x30, + 0x2e, 0x32, 0x3d, 0x47, 0x49, 0x42, 0x38, 0x2f, 0x26, 0x24, 0x2b, 0x33, + 0x37, 0x30, 0x1e, 0x10, 0x0b, 0x0d, 0x11, 0x15, 0x14, 0x05, 0xf0, 0xe2, + 0xe4, 0xed, 0xf0, 0xea, 0xe0, 0xdc, 0xd6, 0xc9, 0xc4, 0xce, 0xd8, 0xd7, + 0xd3, 0xcc, 0xc4, 0xca, 0xd9, 0xe5, 0xe8, 0xea, 0xf0, 0xe8, 0xdd, 0xde, + 0xe7, 0xf2, 0xfb, 0xf6, 0xe6, 0xe3, 0xee, 0xf2, 0xed, 0xed, 0xef, 0xf4, + 0xf4, 0xf0, 0xee, 0xf2, 0xfb, 0x01, 0x01, 0xfc, 0xf8, 0xfb, 0x06, 0x0d, + 0x0b, 0x05, 0x06, 0x0e, 0x13, 0x14, 0x14, 0x12, 0x11, 0x0d, 0x0a, 0x0f, + 0x19, 0x1b, 0x16, 0x0e, 0x08, 0x0c, 0x19, 0x23, 0x22, 0x1b, 0x1a, 0x1f, + 0x21, 0x1a, 0x16, 0x1a, 0x25, 0x2c, 0x1f, 0x0e, 0x0d, 0x10, 0x0c, 0x0e, + 0x14, 0x10, 0x04, 0xfc, 0xfe, 0x07, 0x0d, 0x0b, 0x03, 0xfa, 0xfb, 0x02, + 0x03, 0xff, 0xfe, 0xfc, 0xf5, 0xeb, 0xe6, 0xe9, 0xef, 0xf2, 0xec, 0xe2, + 0xdd, 0xdc, 0xdb, 0xd8, 0xd8, 0xe0, 0xe9, 0xe5, 0xd5, 0xc9, 0xcd, 0xdc, + 0xe8, 0xe9, 0xe3, 0xda, 0xd8, 0xe1, 0xed, 0xf8, 0xfd, 0xf5, 0xec, 0xea, + 0xf0, 0xfa, 0x01, 0x06, 0x06, 0x02, 0xff, 0xff, 0x01, 0x0a, 0x1a, 0x23, + 0x26, 0x25, 0x1f, 0x16, 0x18, 0x28, 0x37, 0x40, 0x41, 0x35, 0x25, 0x21, + 0x2e, 0x3d, 0x41, 0x3a, 0x2f, 0x28, 0x29, 0x2d, 0x2f, 0x2f, 0x30, 0x35, + 0x38, 0x37, 0x33, 0x30, 0x32, 0x36, 0x37, 0x31, 0x28, 0x24, 0x20, 0x21, + 0x25, 0x26, 0x25, 0x21, 0x18, 0x0f, 0x11, 0x1a, 0x1a, 0x11, 0x0b, 0x0b, + 0x10, 0x16, 0x13, 0x08, 0x03, 0x06, 0x0b, 0x11, 0x18, 0x17, 0x10, 0x08, + 0x04, 0x06, 0x07, 0x0a, 0x10, 0x12, 0x13, 0x13, 0x09, 0xff, 0x02, 0x0d, + 0x1e, 0x27, 0x1c, 0x0d, 0x0b, 0x14, 0x1e, 0x20, 0x1e, 0x24, 0x2a, 0x26, + 0x20, 0x20, 0x2a, 0x37, 0x33, 0x21, 0x17, 0x1b, 0x25, 0x28, 0x20, 0x1a, + 0x23, 0x2c, 0x23, 0x12, 0x09, 0x12, 0x20, 0x1e, 0x07, 0xf3, 0xf4, 0xfd, + 0xfc, 0xee, 0xe5, 0xec, 0xf4, 0xec, 0xd8, 0xcb, 0xce, 0xda, 0xda, 0xcf, + 0xc8, 0xcf, 0xd6, 0xd5, 0xd2, 0xd5, 0xe0, 0xe6, 0xe8, 0xe6, 0xe4, 0xef, + 0xfa, 0xf6, 0xe6, 0xe0, 0xec, 0xfa, 0xfc, 0xf5, 0xed, 0xe8, 0xe9, 0xf0, + 0xf6, 0xf6, 0xf4, 0xf1, 0xf0, 0xf1, 0xf6, 0xfb, 0xf7, 0xf6, 0x03, 0x0b, + 0x05, 0xfd, 0xfc, 0x03, 0x0f, 0x17, 0x13, 0x0a, 0x03, 0x01, 0x07, 0x10, + 0x13, 0x13, 0x0e, 0x05, 0x00, 0x0b, 0x1d, 0x22, 0x19, 0x13, 0x18, 0x22, + 0x28, 0x2a, 0x27, 0x22, 0x23, 0x26, 0x22, 0x1b, 0x1b, 0x1e, 0x1a, 0x15, + 0x18, 0x14, 0x0a, 0x05, 0x08, 0x11, 0x17, 0x16, 0x0e, 0x07, 0x07, 0x11, + 0x18, 0x11, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf1, 0xe9, + 0xea, 0xef, 0xf1, 0xeb, 0xe4, 0xe2, 0xe3, 0xe5, 0xdf, 0xd5, 0xd4, 0xe0, + 0xeb, 0xed, 0xe7, 0xe2, 0xdc, 0xe2, 0xf1, 0xf9, 0xf5, 0xed, 0xed, 0xef, + 0xf0, 0xf5, 0xfa, 0xfb, 0xfb, 0xfe, 0x02, 0x06, 0x08, 0x0b, 0x0d, 0x0f, + 0x11, 0x18, 0x1e, 0x1b, 0x19, 0x1d, 0x26, 0x2e, 0x2d, 0x2a, 0x28, 0x26, + 0x2d, 0x34, 0x2a, 0x1d, 0x1a, 0x1f, 0x25, 0x28, 0x2d, 0x2d, 0x25, 0x21, + 0x2e, 0x39, 0x3a, 0x36, 0x29, 0x1e, 0x22, 0x2a, 0x28, 0x28, 0x2d, 0x30, + 0x2a, 0x1b, 0x12, 0x16, 0x1d, 0x21, 0x20, 0x19, 0x12, 0x0e, 0x08, 0x03, + 0x06, 0x14, 0x21, 0x1a, 0x03, 0xf6, 0x02, 0x13, 0x15, 0x0a, 0x03, 0x09, + 0x11, 0x0a, 0xff, 0xfe, 0x09, 0x16, 0x12, 0x04, 0xff, 0x08, 0x11, 0x11, + 0x0f, 0x0d, 0x11, 0x16, 0x14, 0x12, 0x16, 0x20, 0x2c, 0x2c, 0x22, 0x21, + 0x27, 0x2b, 0x2b, 0x28, 0x28, 0x2c, 0x29, 0x23, 0x21, 0x20, 0x22, 0x2a, + 0x2c, 0x2a, 0x28, 0x23, 0x21, 0x20, 0x1a, 0x11, 0x09, 0x08, 0x0e, 0x0d, + 0x01, 0xf5, 0xeb, 0xe3, 0xe6, 0xec, 0xea, 0xe0, 0xd6, 0xd3, 0xd2, 0xcc, + 0xca, 0xd0, 0xd3, 0xcf, 0xca, 0xc8, 0xcc, 0xd4, 0xd7, 0xd5, 0xda, 0xe4, + 0xea, 0xe6, 0xdf, 0xde, 0xe7, 0xf0, 0xf0, 0xe6, 0xdd, 0xdf, 0xe7, 0xef, + 0xf2, 0xef, 0xec, 0xea, 0xea, 0xec, 0xf6, 0x01, 0x02, 0xf9, 0xf4, 0xff, + 0x0f, 0x14, 0x0b, 0x06, 0x0d, 0x17, 0x17, 0x10, 0x0e, 0x12, 0x1b, 0x1d, + 0x11, 0x06, 0x0b, 0x15, 0x17, 0x17, 0x1d, 0x23, 0x20, 0x18, 0x15, 0x1b, + 0x28, 0x34, 0x2f, 0x1e, 0x14, 0x1a, 0x24, 0x20, 0x18, 0x15, 0x12, 0x0f, + 0x0d, 0x09, 0x04, 0x05, 0x08, 0x09, 0x07, 0x03, 0xfe, 0xf9, 0xfa, 0x00, + 0x01, 0xff, 0xfc, 0xf6, 0xf0, 0xee, 0xef, 0xf0, 0xef, 0xea, 0xe4, 0xe2, + 0xe3, 0xe5, 0xe3, 0xdb, 0xd4, 0xd3, 0xd8, 0xdb, 0xd7, 0xd0, 0xcd, 0xd2, + 0xd8, 0xd9, 0xd6, 0xd4, 0xd7, 0xdc, 0xde, 0xe0, 0xe1, 0xde, 0xdd, 0xe0, + 0xe4, 0xe6, 0xe4, 0xe3, 0xe7, 0xee, 0xf5, 0xf8, 0xf5, 0xf2, 0xf4, 0xf6, + 0xfa, 0x03, 0x0b, 0x0d, 0x0b, 0x09, 0x0a, 0x11, 0x17, 0x1a, 0x1b, 0x1a, + 0x1a, 0x18, 0x10, 0x08, 0x09, 0x14, 0x22, 0x27, 0x1f, 0x17, 0x15, 0x1a, + 0x21, 0x22, 0x23, 0x28, 0x26, 0x1e, 0x18, 0x18, 0x1f, 0x24, 0x1f, 0x18, + 0x15, 0x18, 0x1a, 0x14, 0x0e, 0x0f, 0x13, 0x12, 0x0c, 0x07, 0x06, 0x07, + 0x09, 0x05, 0xff, 0x00, 0x05, 0x04, 0xfd, 0xfc, 0x00, 0x04, 0x03, 0xfc, + 0xf7, 0xf9, 0xff, 0x02, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xfc, 0xfd, 0x00, + 0x00, 0xff, 0x04, 0x09, 0x09, 0x07, 0x05, 0x06, 0x0d, 0x16, 0x1c, 0x1c, + 0x16, 0x10, 0x0c, 0x0c, 0x10, 0x14, 0x16, 0x15, 0x14, 0x14, 0x15, 0x14, + 0x13, 0x13, 0x14, 0x18, 0x1a, 0x16, 0x11, 0x0f, 0x0c, 0x09, 0x04, 0xfb, + 0xf5, 0xef, 0xe9, 0xe8, 0xeb, 0xea, 0xe2, 0xd8, 0xd0, 0xd1, 0xd7, 0xdc, + 0xdc, 0xd4, 0xcb, 0xcb, 0xcd, 0xce, 0xcf, 0xd2, 0xd7, 0xd9, 0xd9, 0xdb, + 0xe2, 0xea, 0xec, 0xe9, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xee, 0xf4, 0xf8, + 0xf4, 0xed, 0xeb, 0xf2, 0xfc, 0x05, 0x09, 0x04, 0xff, 0xff, 0x02, 0x06, + 0x0b, 0x12, 0x14, 0x10, 0x0b, 0x09, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0b, + 0x06, 0x02, 0x00, 0x01, 0x05, 0x08, 0x06, 0x04, 0x05, 0x07, 0x0a, 0x0f, + 0x11, 0x0d, 0x09, 0x06, 0x04, 0x05, 0x07, 0x07, 0x03, 0xfe, 0xfd, 0xff, + 0xff, 0xfc, 0xfa, 0xfc, 0xff, 0xff, 0xfc, 0xf8, 0xf4, 0xf5, 0xf8, 0xf8, + 0xf8, 0xf7, 0xf6, 0xf6, 0xf4, 0xef, 0xed, 0xef, 0xee, 0xec, 0xeb, 0xec, + 0xed, 0xeb, 0xe7, 0xe3, 0xe4, 0xe8, 0xeb, 0xe6, 0xe0, 0xde, 0xde, 0xe0, + 0xe2, 0xe0, 0xdf, 0xe0, 0xe4, 0xe6, 0xe1, 0xde, 0xe2, 0xe6, 0xe6, 0xe4, + 0xe3, 0xe7, 0xea, 0xe8, 0xe3, 0xe4, 0xee, 0xf6, 0xf2, 0xea, 0xea, 0xf2, + 0xfa, 0xfd, 0xfb, 0xfc, 0x01, 0x06, 0x04, 0x00, 0x00, 0x04, 0x07, 0x02, + 0xfe, 0x00, 0x04, 0x03, 0xfe, 0xfd, 0x00, 0x07, 0x0d, 0x0b, 0x05, 0x04, + 0x0a, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x10, 0x11, 0x0d, 0x09, + 0x08, 0x09, 0x0a, 0x0c, 0x0c, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, + 0x06, 0x08, 0x0d, 0x0d, 0x05, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0xff, + 0xfe, 0xff, 0x01, 0xfd, 0xf9, 0xfb, 0xfd, 0xfb, 0xfb, 0xfc, 0xf9, 0xf5, + 0xf3, 0xf4, 0xf9, 0xfe, 0xff, 0xfe, 0xfe, 0x01, 0x05, 0x05, 0x02, 0x00, + 0x00, 0x03, 0x06, 0x05, 0x06, 0x08, 0x05, 0x02, 0x04, 0x07, 0x08, 0x0a, + 0x0d, 0x0b, 0x09, 0x0b, 0x10, 0x11, 0x0c, 0x09, 0x09, 0x08, 0x03, 0xfd, + 0xf6, 0xf2, 0xef, 0xe9, 0xe1, 0xda, 0xd6, 0xd8, 0xd9, 0xd9, 0xda, 0xdb, + 0xd6, 0xcf, 0xca, 0xca, 0xce, 0xd1, 0xd1, 0xce, 0xcc, 0xcf, 0xd5, 0xd7, + 0xd7, 0xdd, 0xe4, 0xe6, 0xe6, 0xe5, 0xe5, 0xe6, 0xe9, 0xec, 0xee, 0xf1, + 0xf2, 0xf2, 0xf1, 0xf3, 0xf9, 0xfe, 0x01, 0x00, 0xff, 0x03, 0x08, 0x0a, + 0x09, 0x09, 0x0c, 0x11, 0x14, 0x10, 0x0f, 0x11, 0x13, 0x11, 0x0f, 0x0d, + 0x0b, 0x08, 0x08, 0x08, 0x0c, 0x11, 0x12, 0x0f, 0x0b, 0x0c, 0x12, 0x18, + 0x1a, 0x15, 0x10, 0x0d, 0x0b, 0x09, 0x09, 0x0b, 0x0f, 0x11, 0x0d, 0x09, + 0x09, 0x09, 0x0b, 0x0b, 0x09, 0x0b, 0x0d, 0x0a, 0x07, 0x07, 0x0b, 0x0d, + 0x0b, 0x07, 0x04, 0x02, 0x04, 0x06, 0x04, 0x01, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0xff, 0xfb, 0xf8, 0xf9, 0xfc, 0xfe, 0xfd, 0xf9, 0xf6, 0xf6, + 0xf7, 0xf7, 0xf7, 0xfa, 0xfb, 0xf9, 0xf7, 0xf7, 0xf7, 0xf4, 0xf5, 0xf9, + 0xfd, 0xfd, 0xf9, 0xf6, 0xf6, 0xf7, 0xfb, 0xff, 0xfd, 0xfa, 0xf9, 0xfc, + 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0x07, 0x0c, 0x0e, 0x0d, 0x0a, 0x07, + 0x07, 0x0b, 0x0b, 0x09, 0x09, 0x0e, 0x12, 0x11, 0x0d, 0x09, 0x0b, 0x10, + 0x16, 0x19, 0x17, 0x11, 0x0c, 0x0e, 0x14, 0x17, 0x19, 0x16, 0x10, 0x0f, + 0x13, 0x17, 0x17, 0x12, 0x10, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x14, + 0x12, 0x10, 0x0e, 0x0f, 0x10, 0x0f, 0x0e, 0x0f, 0x0e, 0x09, 0x04, 0x05, + 0x0b, 0x10, 0x10, 0x0b, 0x08, 0x08, 0x0b, 0x0b, 0x09, 0x08, 0x06, 0x02, + 0x00, 0x00, 0x02, 0x05, 0x06, 0x05, 0x03, 0x02, 0x03, 0x05, 0x07, 0x09, + 0x09, 0x08, 0x08, 0x07, 0x06, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, + 0x07, 0x09, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07, 0x03, 0xfe, 0xfa, + 0xf5, 0xee, 0xe6, 0xe1, 0xe0, 0xdc, 0xd8, 0xd4, 0xd1, 0xcf, 0xcd, 0xcd, + 0xcd, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xcb, + 0xd0, 0xd3, 0xd7, 0xdc, 0xe2, 0xe8, 0xea, 0xea, 0xea, 0xed, 0xf1, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf5, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0x00, 0x02, 0x05, + 0x07, 0x08, 0x08, 0x07, 0x07, 0x0a, 0x0e, 0x0f, 0x0d, 0x0b, 0x09, 0x09, + 0x0a, 0x09, 0x07, 0x07, 0x0a, 0x0b, 0x08, 0x07, 0x05, 0x04, 0x06, 0x09, + 0x08, 0x05, 0x06, 0x08, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, 0x08, 0x08, + 0x08, 0x08, 0x07, 0x04, 0x02, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, 0x08, + 0x08, 0x06, 0x03, 0x03, 0x05, 0x06, 0x04, 0x00, 0xff, 0xff, 0xff, 0x01, + 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x06, 0x05, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x04, 0x07, 0x07, 0x05, 0x02, 0xff, 0x00, 0x02, + 0x04, 0x04, 0x03, 0x01, 0x01, 0x01, 0x02, 0x04, 0x06, 0x05, 0x04, 0x05, + 0x07, 0x08, 0x09, 0x08, 0x09, 0x0c, 0x0d, 0x0b, 0x09, 0x0c, 0x12, 0x15, + 0x15, 0x13, 0x12, 0x13, 0x17, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x19, 0x19, + 0x1a, 0x1b, 0x1b, 0x1a, 0x18, 0x16, 0x17, 0x17, 0x15, 0x15, 0x15, 0x16, + 0x14, 0x11, 0x0e, 0x0d, 0x0f, 0x10, 0x0f, 0x0c, 0x09, 0x08, 0x08, 0x09, + 0x08, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x02, 0x00, 0xff, 0xfe, + 0xfe, 0xff, 0xff, 0xfd, 0xfb, 0xfa, 0xfa, 0xfb, 0xfd, 0xfd, 0xfc, 0xfb, + 0xfa, 0xf9, 0xf7, 0xf7, 0xf9, 0xfc, 0xfe, 0xfc, 0xf8, 0xf7, 0xf7, 0xfa, + 0xfd, 0xfc, 0xf8, 0xf7, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, 0xf4, + 0xf0, 0xed, 0xec, 0xe8, 0xe2, 0xdb, 0xd7, 0xd6, 0xd3, 0xce, 0xcd, 0xd0, + 0xd3, 0xd2, 0xce, 0xca, 0xc8, 0xcb, 0xcb, 0xc6, 0xc2, 0xc3, 0xc9, 0xcc, + 0xcd, 0xcd, 0xce, 0xd2, 0xd8, 0xdd, 0xe0, 0xe3, 0xe6, 0xe8, 0xea, 0xec, + 0xf0, 0xf4, 0xf4, 0xf3, 0xf4, 0xf6, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0x01, + 0x03, 0x03, 0x03, 0x06, 0x09, 0x09, 0x08, 0x07, 0x06, 0x07, 0x09, 0x0a, + 0x0a, 0x09, 0x08, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, + 0x09, 0x07, 0x06, 0x07, 0x09, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x0a, + 0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0a, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, + 0x09, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x06, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, + 0x0f, 0x0f, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x15, + 0x13, 0x12, 0x14, 0x15, 0x16, 0x16, 0x17, 0x19, 0x1a, 0x19, 0x17, 0x18, + 0x1a, 0x1b, 0x1a, 0x17, 0x15, 0x18, 0x19, 0x16, 0x11, 0x11, 0x12, 0x13, + 0x12, 0x12, 0x12, 0x14, 0x15, 0x14, 0x11, 0x11, 0x13, 0x15, 0x14, 0x11, + 0x11, 0x13, 0x15, 0x14, 0x13, 0x13, 0x14, 0x14, 0x12, 0x11, 0x10, 0x11, + 0x14, 0x12, 0x0f, 0x0f, 0x11, 0x10, 0x0c, 0x0a, 0x0c, 0x10, 0x10, 0x0c, + 0x09, 0x08, 0x09, 0x0a, 0x09, 0x07, 0x07, 0x08, 0x08, 0x06, 0x04, 0x04, + 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x03, 0x05, 0x05, 0x04, 0x00, 0x00, 0x0f, 0x11, 0x11, 0x0f, + 0x0d, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, + 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x07, 0x08, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x05, 0x05, 0x07, 0x07, + 0x09, 0x09, 0x09, 0x08, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x07, 0x06, + 0x07, 0x07, 0x08, 0x08, 0x07, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x02, 0x01, 0xf5, 0xe5, 0xdd, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, + 0xcb, 0xc9, 0xc9, 0xc9, 0xc6, 0xc3, 0xc1, 0xc0, 0xc0, 0xbd, 0xbb, 0xb9, + 0xb9, 0xb8, 0xb8, 0xc3, 0xd3, 0xd7, 0xd9, 0xdc, 0xde, 0xe1, 0xe1, 0xe2, + 0xe5, 0xe7, 0xe8, 0xeb, 0xed, 0xef, 0xef, 0xf2, 0xf5, 0xf7, 0xf8, 0xf9, + 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x01, 0x03, 0x03, 0x05, 0x07, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x05, 0x05, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, 0x05, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x0b, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x0d, + 0x0d, 0x0f, 0x0f, 0x11, 0x11, 0x12, 0x11, 0x12, 0x13, 0x11, 0x11, 0x11, + 0x11, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, + 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x09, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x04, + 0x03, 0x05, 0x05, 0x04, 0x03, 0x03, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, + 0x05, 0x05, 0x07, 0x08, 0x09, 0x07, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, + 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0xef, 0xe0, 0xdd, 0xd9, 0xd7, 0xd5, 0xd1, + 0xcf, 0xcf, 0xcd, 0xcb, 0xc7, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbc, + 0xbb, 0xb9, 0xb8, 0xb7, 0xb9, 0xcb, 0xd6, 0xd7, 0xd8, 0xdb, 0xde, 0xe1, + 0xe3, 0xe4, 0xe5, 0xe8, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf3, 0xf5, 0xf7, + 0xf9, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x02, 0x03, 0x05, 0x05, 0x05, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0a, 0x09, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x11, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0e, 0x0d, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x08, 0x09, 0x09, 0x09, 0x09, 0x08, + 0x08, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, + 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0xfc, 0xe9, 0xdf, 0xdb, 0xd8, 0xd5, 0xd3, + 0xd1, 0xcf, 0xcd, 0xc9, 0xc9, 0xc8, 0xc7, 0xc5, 0xc2, 0xbf, 0xbd, 0xbd, + 0xbc, 0xbb, 0xb9, 0xb7, 0xb7, 0xbb, 0xd1, 0xd5, 0xd9, 0xdb, 0xdb, 0xdf, + 0xe2, 0xe5, 0xe7, 0xe8, 0xe9, 0xeb, 0xef, 0xef, 0xf3, 0xf5, 0xf7, 0xf8, + 0xfa, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x05, 0x07, 0x08, + 0x09, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x11, 0x0f, 0x11, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0f, 0x0f, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x09, 0x09, 0x0b, 0x09, 0x09, + 0x09, 0x09, 0x0b, 0x09, 0x09, 0x08, 0x07, 0x08, 0x09, 0x09, 0x08, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, + 0x05, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0xe8, 0xdd, 0xdb, 0xd9, 0xd5, + 0xd3, 0xd1, 0xcf, 0xcb, 0xc9, 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbc, 0xbb, 0xb9, 0xbb, 0xd3, 0xd9, 0xda, 0xdd, 0xdf, + 0xe1, 0xe4, 0xe5, 0xe8, 0xeb, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, + 0xf9, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x05, 0x07, + 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, + 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x0d, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x06, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x03, 0x05, 0x04, 0x04, 0x03, 0x03, 0x03, 0x05, 0x05, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0xf7, 0xdf, 0xe1, 0xdd, + 0xd9, 0xd7, 0xd3, 0xd1, 0xcf, 0xcd, 0xcb, 0xc9, 0xc9, 0xc7, 0xc7, 0xc5, + 0xc3, 0xc1, 0xbd, 0xbf, 0xbd, 0xbd, 0xbb, 0xb9, 0xc3, 0xd9, 0xd9, 0xdb, + 0xdf, 0xdf, 0xe1, 0xe5, 0xe7, 0xe9, 0xe9, 0xed, 0xef, 0xf1, 0xf3, 0xf5, + 0xf5, 0xf8, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x06, + 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, + 0x0d, 0x0b, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, + 0x0d, 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0d, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, + 0x0b, 0x0b, 0x0c, 0x0b, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0a, + 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x09, 0x08, 0x08, 0x07, 0x07, + 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x07, 0x05, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x07, 0x05, + 0x05, 0x05, 0x04, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, + 0x03, 0x03, 0x03, 0x02, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x01, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xf5, 0xde, + 0xe0, 0xdd, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, 0xcd, 0xcc, 0xca, 0xc9, + 0xc8, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, 0xc0, 0xbd, 0xbd, 0xbb, 0xc5, 0xdb, + 0xda, 0xdd, 0xdf, 0xe1, 0xe3, 0xe6, 0xe8, 0xe9, 0xeb, 0xed, 0xef, 0xf2, + 0xf3, 0xf5, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0x03, 0x05, 0x05, + 0x07, 0x07, 0x09, 0x0a, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0c, + 0x0d, 0x0d, 0x0c, 0x0d, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x0d, 0x0c, 0x0d, + 0x0b, 0x0c, 0x0b, 0x0b, 0x0c, 0x0d, 0x0b, 0x0c, 0x0d, 0x0c, 0x0d, 0x0d, + 0x0c, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0f, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0f, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0b, 0x0c, + 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, 0x09, 0x09, + 0x07, 0x08, 0x09, 0x09, 0x08, 0x09, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, + 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, + 0x07, 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0xfe, 0xe0, 0xe3, 0xdf, 0xdb, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xd1, 0xcd, + 0xcb, 0xca, 0xca, 0xc7, 0xc6, 0xc4, 0xc3, 0xc1, 0xc1, 0xc0, 0xbe, 0xbd, + 0xc0, 0xdd, 0xdb, 0xdd, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, 0xea, 0xed, 0xef, + 0xf1, 0xf3, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xff, 0x00, 0x01, 0x03, + 0x05, 0x05, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, 0x0c, 0x0c, 0x0d, 0x0b, 0x0d, + 0x0d, 0x0d, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, + 0x0b, 0x0c, 0x0c, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, + 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, + 0x0d, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0xf2, 0xe9, 0xeb, 0xe1, 0xd7, + 0xd2, 0xc9, 0xba, 0xb3, 0xb4, 0xb4, 0xb7, 0xb7, 0xbe, 0xbb, 0xb9, 0xc8, + 0xd4, 0xcc, 0xec, 0xe0, 0xe6, 0xe5, 0xfe, 0x03, 0x03, 0x32, 0xe1, 0x14, + 0x55, 0x31, 0x1b, 0x32, 0x23, 0x20, 0x3a, 0x26, 0x27, 0x29, 0x33, 0x20, + 0x35, 0x18, 0x2e, 0x3b, 0x17, 0x07, 0x12, 0x0a, 0x15, 0x0e, 0x05, 0x06, + 0x13, 0x13, 0xd7, 0x1a, 0xfd, 0xfd, 0xd0, 0x21, 0xf5, 0xd1, 0xef, 0x07, + 0x0a, 0xc3, 0x0b, 0x28, 0xe3, 0xe8, 0x1b, 0x2f, 0xf1, 0x07, 0x1c, 0x17, + 0x12, 0x1a, 0x3e, 0x2d, 0x01, 0x25, 0x35, 0x20, 0x0d, 0x1e, 0x33, 0x0a, + 0x1d, 0x00, 0x46, 0x0f, 0xf6, 0x3b, 0xf5, 0x1c, 0x08, 0x06, 0x07, 0xf6, + 0x3a, 0xdf, 0x0f, 0x1a, 0xdb, 0x39, 0xfc, 0x0c, 0x21, 0x02, 0x13, 0x00, + 0x27, 0xfc, 0x12, 0x39, 0xe5, 0x1a, 0x22, 0x0b, 0x16, 0x10, 0x0a, 0x1b, + 0x01, 0xf6, 0x1f, 0x0d, 0xf4, 0x14, 0x1e, 0xe4, 0xf5, 0x1a, 0x02, 0xea, + 0xfb, 0x19, 0xfd, 0xdc, 0xf5, 0x1d, 0x01, 0xd8, 0xfc, 0x15, 0xf0, 0xf5, + 0x0e, 0x09, 0xd7, 0x09, 0x0b, 0x0e, 0xea, 0x05, 0x26, 0xf2, 0x05, 0xed, + 0x1b, 0xf2, 0xf7, 0xfc, 0xf6, 0xfd, 0x02, 0x00, 0xfd, 0xfc, 0xfd, 0xe7, + 0xe9, 0xf3, 0xef, 0xf7, 0xd7, 0xf7, 0x03, 0xd7, 0xd8, 0xf9, 0xec, 0xd9, + 0xd6, 0xde, 0xe9, 0xd2, 0xd7, 0xe8, 0xf9, 0xd0, 0xe4, 0x15, 0xbe, 0x0c, + 0x0d, 0x01, 0x08, 0xce, 0x42, 0xf1, 0x25, 0x10, 0x0b, 0x50, 0xec, 0x39, + 0x1d, 0xfc, 0x4b, 0xff, 0x0b, 0x1b, 0x0d, 0x24, 0xff, 0x2a, 0x09, 0x13, + 0x13, 0xe9, 0x16, 0x08, 0xed, 0x0d, 0x09, 0xe1, 0x05, 0x0d, 0xf7, 0x07, + 0x0c, 0x17, 0x15, 0xf7, 0x04, 0x27, 0x16, 0xfd, 0x19, 0x2e, 0xed, 0x17, + 0x26, 0x21, 0xfc, 0x1e, 0x28, 0x00, 0xfb, 0x0e, 0x26, 0x08, 0xf4, 0x17, + 0x26, 0xea, 0xf6, 0x0d, 0x13, 0xf6, 0xf8, 0x0d, 0xf0, 0xf0, 0x02, 0x07, + 0xf1, 0xe1, 0x00, 0x14, 0xe7, 0xf4, 0x03, 0xfd, 0xf3, 0xfc, 0xfe, 0x01, + 0x0d, 0x10, 0xf6, 0x05, 0x0e, 0x01, 0x02, 0xeb, 0x00, 0xff, 0xe5, 0xfa, + 0x10, 0x00, 0xf0, 0xfd, 0x02, 0xdd, 0xfb, 0xd1, 0x03, 0xf0, 0xd7, 0x00, + 0xd4, 0xff, 0xcf, 0xf2, 0xed, 0xb6, 0x02, 0xc3, 0xd9, 0xe1, 0xbf, 0x17, + 0xc6, 0xce, 0xf3, 0xdc, 0x02, 0xea, 0x08, 0xe3, 0xfd, 0x21, 0xdc, 0x06, + 0x1a, 0x12, 0x22, 0x0e, 0x0f, 0x3a, 0x0e, 0x15, 0x1a, 0x29, 0xf6, 0x24, + 0x11, 0x11, 0x18, 0x1c, 0x1b, 0x05, 0x09, 0xfe, 0x17, 0xf5, 0xec, 0x0f, + 0x09, 0xdf, 0xf1, 0x0a, 0x03, 0xe8, 0x1f, 0x05, 0xfb, 0x02, 0x00, 0x29, + 0xec, 0xfc, 0x24, 0x14, 0xf5, 0xfd, 0x2b, 0x25, 0xf7, 0x1a, 0x1a, 0x0f, + 0x0a, 0x12, 0x1e, 0x19, 0x0a, 0x19, 0x12, 0x07, 0x0b, 0x1a, 0x18, 0xf2, + 0x10, 0x06, 0x0d, 0x06, 0x00, 0xf7, 0xfb, 0x05, 0xf7, 0xf9, 0x00, 0x04, + 0x02, 0xe2, 0xf8, 0x1f, 0xe0, 0x0b, 0x05, 0x0c, 0xff, 0xf7, 0x1c, 0xf7, + 0x02, 0xf2, 0xeb, 0x0b, 0xe0, 0xfb, 0x0d, 0xeb, 0x0b, 0xec, 0xfd, 0xec, + 0xe0, 0xf9, 0xe6, 0xeb, 0xe1, 0xf7, 0xee, 0xe3, 0xe3, 0xfd, 0xe1, 0xf1, + 0xd9, 0xd1, 0xf1, 0xeb, 0xeb, 0xe6, 0xdd, 0xce, 0xf9, 0xd0, 0xd0, 0xef, + 0xee, 0xbe, 0xce, 0xdd, 0xc0, 0xd9, 0xe6, 0xd9, 0xe2, 0xd2, 0xf0, 0xec, + 0xe6, 0xe2, 0xf9, 0x06, 0xc0, 0xf7, 0x19, 0xee, 0x04, 0x26, 0x04, 0x10, + 0x2a, 0x3e, 0x00, 0x17, 0x1a, 0x17, 0x28, 0xfd, 0x0a, 0x3b, 0x45, 0x03, + 0x43, 0x2d, 0x34, 0x1c, 0x32, 0x34, 0x1d, 0x1a, 0x27, 0x36, 0x13, 0x19, + 0x4d, 0x2a, 0xf6, 0x2e, 0x16, 0x05, 0xe5, 0x32, 0x0a, 0x00, 0xf4, 0x08, + 0x1b, 0xe2, 0x10, 0x15, 0xee, 0x01, 0x13, 0x1f, 0xf1, 0x0a, 0x22, 0xdf, + 0x29, 0x09, 0x1c, 0x20, 0xfa, 0x3d, 0x07, 0x14, 0x11, 0x16, 0x2e, 0x01, + 0x2e, 0x11, 0x1c, 0x31, 0x17, 0x2f, 0xf8, 0x14, 0x19, 0xed, 0x05, 0xfa, + 0x2f, 0x02, 0xf0, 0x1a, 0xdf, 0x20, 0xf5, 0xe7, 0x18, 0xef, 0xff, 0xf3, + 0x05, 0xe8, 0x06, 0x24, 0xdc, 0xe3, 0x0a, 0x01, 0xe1, 0xf9, 0xf7, 0xeb, + 0x01, 0xcf, 0xfc, 0x0e, 0xd2, 0x1b, 0x03, 0xe6, 0xf9, 0x06, 0x1e, 0xd5, + 0x19, 0x1b, 0x00, 0x14, 0x00, 0x1f, 0x27, 0x05, 0x0d, 0x12, 0x07, 0x09, + 0x24, 0x09, 0xf9, 0x22, 0x1c, 0x02, 0xfb, 0x1b, 0x17, 0x10, 0xf3, 0x05, + 0xfc, 0xf8, 0xf4, 0x10, 0xfe, 0xe9, 0x22, 0x06, 0xf8, 0x0d, 0x09, 0x13, + 0xf3, 0xef, 0x19, 0xfb, 0x09, 0xf2, 0x1f, 0x1c, 0xdd, 0x08, 0xf7, 0xed, + 0x03, 0xe9, 0xfc, 0xe3, 0xf3, 0xf6, 0xe1, 0xfe, 0xdb, 0x04, 0xda, 0xe6, + 0x19, 0xe5, 0x06, 0xde, 0xfe, 0x05, 0xde, 0x1e, 0xe9, 0x23, 0x09, 0x01, + 0x26, 0xd2, 0x38, 0x0e, 0xfc, 0x12, 0x08, 0x31, 0xff, 0x23, 0x16, 0x17, + 0x19, 0xec, 0x04, 0x03, 0xf4, 0x03, 0x10, 0xed, 0xf1, 0x1e, 0xeb, 0xec, + 0x06, 0x01, 0x07, 0xe0, 0xec, 0x06, 0x03, 0xef, 0xf3, 0x16, 0xe7, 0xed, + 0x1b, 0xf3, 0xe0, 0x0d, 0x03, 0xe3, 0xdf, 0xfc, 0x01, 0xf9, 0xea, 0xff, + 0x13, 0xe5, 0xf7, 0x13, 0x03, 0xf9, 0x1a, 0x16, 0xf0, 0x0d, 0x2c, 0x18, + 0x00, 0x0f, 0x1c, 0x26, 0xf1, 0x07, 0x2f, 0xff, 0x0c, 0x17, 0x10, 0x02, + 0x03, 0x2b, 0x00, 0xfb, 0x13, 0x00, 0x05, 0xdd, 0x08, 0x12, 0xe5, 0x01, + 0x09, 0x05, 0xff, 0x00, 0x06, 0xf1, 0x05, 0xee, 0xf8, 0xff, 0xf2, 0x13, + 0xf8, 0xfb, 0xf4, 0xfb, 0x00, 0xd2, 0x09, 0xe4, 0xe8, 0xf5, 0xdd, 0x11, + 0xda, 0xe1, 0xfa, 0xdc, 0x01, 0xe7, 0xfc, 0xe4, 0xf8, 0x0e, 0xe1, 0xf5, + 0x04, 0x07, 0x08, 0x00, 0x08, 0x1b, 0xfe, 0x0e, 0x0c, 0x16, 0xf3, 0x29, + 0x10, 0x0e, 0x15, 0x21, 0x30, 0xf4, 0x10, 0x0f, 0x0f, 0xfe, 0xf2, 0x18, + 0x0f, 0xeb, 0x02, 0x0e, 0x04, 0xf1, 0x1a, 0x03, 0xe5, 0x00, 0x0b, 0x0d, + 0xe6, 0xfe, 0x14, 0x03, 0xec, 0xfb, 0x1e, 0xfe, 0xea, 0x0f, 0xfe, 0xe5, + 0x00, 0x04, 0xfc, 0xf6, 0xfe, 0x13, 0xf6, 0xea, 0x17, 0x14, 0x07, 0xf5, + 0x17, 0x18, 0x03, 0x1b, 0x03, 0x13, 0x18, 0x0c, 0x11, 0x0a, 0x09, 0x16, + 0x11, 0xfd, 0x15, 0x11, 0x00, 0x0a, 0x07, 0x0e, 0x01, 0x0b, 0x0a, 0xef, + 0xfc, 0xf6, 0x06, 0xf1, 0xf3, 0x0e, 0xfd, 0xf5, 0xfe, 0xf6, 0x06, 0xe8, + 0xef, 0xfe, 0xec, 0xf9, 0xf4, 0x09, 0xee, 0xf3, 0x03, 0xee, 0xf3, 0xee, + 0xe8, 0xf0, 0xf1, 0xf6, 0xeb, 0xef, 0xe7, 0xf4, 0xfa, 0xe2, 0x02, 0xfe, + 0xe8, 0x06, 0xf5, 0x0b, 0xee, 0xfe, 0x04, 0xfe, 0xf8, 0xfc, 0x11, 0xf7, + 0xea, 0xf9, 0x08, 0xe5, 0xf0, 0x05, 0x03, 0xf9, 0xfd, 0x0e, 0x0a, 0xee, + 0x11, 0x0b, 0xfc, 0xf3, 0x18, 0x09, 0xf8, 0x0a, 0x09, 0x24, 0x0b, 0x19, + 0x1f, 0x11, 0x0c, 0x12, 0x20, 0x1f, 0x05, 0x1a, 0x24, 0x11, 0x1a, 0x26, + 0x27, 0x20, 0x12, 0x1c, 0x10, 0x0d, 0x19, 0x12, 0x24, 0x06, 0x06, 0x1c, + 0xf9, 0x13, 0x00, 0xfe, 0xff, 0x01, 0xff, 0xee, 0x02, 0xf8, 0xf1, 0xf8, + 0xf1, 0x02, 0xf3, 0xe9, 0x04, 0xfd, 0xf3, 0xf5, 0x07, 0xfc, 0xfb, 0x07, + 0x11, 0x0f, 0x08, 0x09, 0x18, 0x09, 0xff, 0x06, 0x06, 0x0c, 0x10, 0x03, + 0x0f, 0x12, 0xff, 0x0a, 0xf8, 0xfd, 0xf8, 0xfe, 0x00, 0xe4, 0x02, 0xf1, + 0xe9, 0x0b, 0xd6, 0xf8, 0xf5, 0xdc, 0xfb, 0xe6, 0xfa, 0xeb, 0xed, 0xef, + 0xe3, 0x14, 0xe6, 0xf3, 0x16, 0xee, 0xff, 0x03, 0x05, 0xff, 0x05, 0x11, + 0xfd, 0x1a, 0x0b, 0x17, 0x22, 0x0e, 0x13, 0x15, 0x10, 0x07, 0x18, 0x21, + 0x10, 0x11, 0x16, 0x0e, 0x11, 0x0c, 0x07, 0x0e, 0x12, 0xf8, 0x0e, 0x06, + 0xff, 0x03, 0x06, 0x0e, 0x01, 0x0f, 0x01, 0x14, 0x13, 0x02, 0x11, 0x11, + 0x04, 0x05, 0x0a, 0x0f, 0x0b, 0x1c, 0x12, 0x1a, 0x08, 0x04, 0x23, 0x07, + 0x10, 0x0f, 0x19, 0x08, 0x06, 0x17, 0x04, 0x07, 0x00, 0x01, 0x08, 0xf6, + 0xfb, 0x05, 0xf2, 0xf0, 0xf8, 0xfc, 0xec, 0xf9, 0xf2, 0xf5, 0xf7, 0xf5, + 0x0c, 0xf3, 0xf0, 0x07, 0x01, 0xfc, 0xf6, 0x1a, 0x0c, 0xf9, 0x0a, 0xee, + 0x09, 0x00, 0xf5, 0x07, 0xfc, 0x02, 0x01, 0x03, 0xf4, 0xf0, 0x0b, 0xec, + 0xef, 0xef, 0xe7, 0xfd, 0xe8, 0xed, 0xef, 0xef, 0xea, 0xe3, 0xee, 0xeb, + 0xf5, 0xf8, 0xe1, 0xea, 0xfd, 0xed, 0xf1, 0xf8, 0x01, 0xf3, 0xfb, 0x02, + 0xfc, 0x00, 0x03, 0xfe, 0x09, 0x04, 0xfe, 0x18, 0x07, 0x0e, 0x14, 0x11, + 0x02, 0x0c, 0x0c, 0x0f, 0x11, 0x16, 0x17, 0x10, 0x11, 0x0a, 0x1a, 0x0d, + 0x08, 0x18, 0x13, 0xff, 0x0a, 0x0e, 0x0c, 0x0b, 0x08, 0x0d, 0x0d, 0x08, + 0x0b, 0x15, 0x09, 0x09, 0x15, 0x0c, 0xf4, 0x09, 0x07, 0x11, 0x0a, 0x0b, + 0x0e, 0x0d, 0x08, 0x06, 0x13, 0x04, 0x08, 0x0e, 0x0b, 0x0b, 0x06, 0x0e, + 0x05, 0xfb, 0x09, 0xf7, 0x0a, 0xf8, 0xfe, 0xff, 0xeb, 0x0a, 0xf6, 0xf9, + 0xf2, 0xf5, 0xfc, 0xf6, 0xf9, 0xf7, 0xfa, 0x07, 0xec, 0xfd, 0xfb, 0xfd, + 0x0e, 0xff, 0x00, 0xfd, 0x07, 0xf6, 0xfb, 0x05, 0xf6, 0x05, 0x04, 0xf7, + 0xfa, 0x00, 0x04, 0xfc, 0xf7, 0xf8, 0xf5, 0xfd, 0xea, 0xf4, 0xfd, 0xf1, + 0xe9, 0xf0, 0xf4, 0xe9, 0xf2, 0xf8, 0xf5, 0xf3, 0xeb, 0xf9, 0xfd, 0xec, + 0x01, 0xff, 0x01, 0xf7, 0x00, 0x10, 0xfc, 0x09, 0x09, 0x02, 0x08, 0x02, + 0x0f, 0x0f, 0x03, 0x16, 0x0d, 0x08, 0xfd, 0x10, 0x0e, 0x06, 0x13, 0x0f, + 0x0f, 0x0f, 0x05, 0x0e, 0x0f, 0x0a, 0x0d, 0x0d, 0x08, 0x01, 0x14, 0x07, + 0x04, 0x0d, 0x06, 0x09, 0x09, 0x07, 0x0c, 0x10, 0x11, 0x02, 0x05, 0x05, + 0xfe, 0x0b, 0xfd, 0x06, 0x07, 0x04, 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x01, 0x0b, 0x04, 0xfb, 0x00, 0x01, 0x02, 0x01, 0xfe, 0xfb, + 0xfb, 0x00, 0xff, 0xfd, 0xfb, 0xf6, 0x08, 0xf1, 0xf5, 0x09, 0x02, 0x00, + 0xfa, 0x08, 0x01, 0xfc, 0x0d, 0x0b, 0x09, 0x04, 0x07, 0x0f, 0xfe, 0xfc, + 0x09, 0x09, 0xfa, 0x02, 0x06, 0xff, 0xfa, 0xfb, 0x03, 0x00, 0xf0, 0xfd, + 0xfb, 0xf1, 0xf8, 0xf7, 0xfe, 0xec, 0xf1, 0xfb, 0xf2, 0xf5, 0xfa, 0xfe, + 0x00, 0xf5, 0x03, 0x06, 0x02, 0x03, 0x05, 0x11, 0xfe, 0x08, 0x13, 0x05, + 0x0e, 0x0f, 0x0a, 0x0b, 0x09, 0x0b, 0x0c, 0x12, 0x05, 0x06, 0x0e, 0x01, + 0x03, 0x09, 0x07, 0x0c, 0x06, 0x07, 0x07, 0x0d, 0x04, 0x00, 0x12, 0x04, + 0x03, 0x08, 0x09, 0x07, 0x04, 0x05, 0x0c, 0x0b, 0x04, 0x07, 0x09, 0x08, + 0x0e, 0x0f, 0x0c, 0x09, 0x09, 0x0c, 0x06, 0x02, 0x09, 0x07, 0x07, 0x00, + 0x02, 0x03, 0x00, 0x01, 0xf5, 0x01, 0xff, 0xfa, 0x01, 0xfa, 0xf5, 0xfe, + 0xfd, 0xf8, 0xf6, 0xf7, 0xfe, 0xf3, 0xf3, 0xf5, 0xfd, 0xf9, 0xf2, 0xfa, + 0xfe, 0xf1, 0xff, 0xff, 0xfc, 0xfb, 0xfd, 0x02, 0x01, 0x03, 0x01, 0x0b, + 0x03, 0x05, 0x05, 0x07, 0x05, 0x00, 0x08, 0x02, 0x05, 0x08, 0x00, 0x03, + 0x04, 0x03, 0x00, 0xfe, 0x04, 0xf9, 0x02, 0x00, 0xf8, 0x00, 0xfe, 0xf8, + 0xf7, 0xf9, 0xfe, 0xfb, 0x00, 0xf5, 0x03, 0x06, 0xf9, 0x0a, 0x05, 0x03, + 0x0a, 0x09, 0x0a, 0x05, 0x11, 0x0f, 0x0a, 0x0d, 0x08, 0x13, 0x0c, 0x08, + 0x0c, 0x12, 0x0a, 0x01, 0x0e, 0x06, 0x05, 0x05, 0x05, 0x0c, 0x03, 0x06, + 0x08, 0x05, 0x07, 0xff, 0x07, 0x04, 0x02, 0x05, 0x00, 0x03, 0x03, 0x08, + 0x07, 0x00, 0x08, 0x01, 0x05, 0x08, 0x05, 0x06, 0x07, 0x09, 0xff, 0x03, + 0x05, 0x03, 0x08, 0x00, 0xff, 0x09, 0xfd, 0xfd, 0xff, 0x01, 0xf7, 0x03, + 0x01, 0xf7, 0x01, 0xfe, 0x01, 0xfc, 0xfe, 0xf8, 0x00, 0xfa, 0xf4, 0xff, + 0xfd, 0xfa, 0xfb, 0xfb, 0xf9, 0xfa, 0x01, 0xfd, 0xfe, 0x00, 0xfe, 0x04, + 0x00, 0x00, 0x05, 0x0b, 0x05, 0x01, 0x0e, 0x07, 0x08, 0x08, 0x06, 0x08, + 0x08, 0x08, 0x02, 0x06, 0x09, 0x02, 0x06, 0xff, 0x00, 0x05, 0xff, 0xfb, + 0x01, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xfe, 0xfe, 0xfc, 0xfa, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x09, 0x07, 0xfd, 0x07, 0x06, 0x07, 0x06, 0x05, 0x0a, + 0x04, 0x05, 0x0a, 0x06, 0x09, 0x04, 0x06, 0x05, 0x04, 0x06, 0xff, 0x06, + 0xff, 0x05, 0x02, 0x02, 0x02, 0x05, 0xff, 0xff, 0x04, 0x02, 0xfd, 0x03, + 0x00, 0xfe, 0x00, 0xfe, 0x04, 0x00, 0xfe, 0x00, 0x03, 0xfc, 0xfe, 0x06, + 0xff, 0xfd, 0x02, 0x02, 0xfd, 0x03, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, + 0xfc, 0x00, 0x02, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0x03, 0x02, 0x01, + 0x00, 0x01, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xfb, 0xff, 0x04, 0xfb, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x04, + 0x04, 0xff, 0x02, 0x05, 0x02, 0x01, 0x03, 0x04, 0x04, 0x01, 0x07, 0x04, + 0x02, 0x02, 0x04, 0x04, 0xff, 0x02, 0x03, 0x00, 0xff, 0x02, 0x03, 0x00, + 0xfe, 0x04, 0x00, 0xff, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x02, 0x00, + 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x02, 0x05, 0x04, 0x02, 0x03, 0x04, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0x04, 0x02, 0x00, 0x03, 0x02, + 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xf9, 0xf3, 0xed, 0xe9, 0xe5, 0xe3, 0xe1, 0xdf, + 0xdd, 0xdb, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, 0xcd, 0xcb, 0xc9, 0xc8, + 0xc7, 0xc5, 0xc3, 0xc2, 0xc1, 0xbf, 0xbd, 0xbc, 0xbb, 0xb9, 0xb7, 0xb6, + 0xb5, 0xb3, 0xb2, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xb3, 0xb9, 0xc1, 0xc9, 0xd0, 0xd7, 0xdd, 0xe2, 0xe6, 0xe9, 0xec, + 0xef, 0xf2, 0xf5, 0xf7, 0xf9, 0xfc, 0xfd, 0xff, 0x01, 0x03, 0x05, 0x07, + 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x15, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x22, 0x23, 0x24, + 0x25, 0x27, 0x29, 0x2a, 0x2b, 0x2b, 0x2d, 0x2f, 0x31, 0x30, 0x2f, 0x30, + 0x33, 0x36, 0x37, 0x37, 0x36, 0x35, 0x33, 0x33, 0x33, 0x35, 0x38, 0x3b, + 0x3e, 0x41, 0x44, 0x44, 0x44, 0x46, 0x49, 0x49, 0x47, 0x46, 0x46, 0x47, + 0x48, 0x48, 0x47, 0x46, 0x46, 0x46, 0x48, 0x49, 0x48, 0x47, 0x46, 0x46, + 0x46, 0x47, 0x48, 0x47, 0x47, 0x47, 0x48, 0x49, 0x48, 0x47, 0x47, 0x47, + 0x48, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, + 0x48, 0x48, 0x47, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, + 0x47, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x40, 0x40, + 0x3f, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, + 0x3a, 0x3a, 0x3a, 0x39, 0x38, 0x38, 0x37, 0x36, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x34, 0x33, 0x31, 0x2f, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2f, 0x2f, 0x2e, 0x2d, 0x2d, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, + 0x27, 0x25, 0x26, 0x28, 0x2b, 0x2c, 0x2a, 0x27, 0x26, 0x26, 0x27, 0x28, + 0x27, 0x25, 0x22, 0x1f, 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x25, + 0x25, 0x26, 0x26, 0x25, 0x22, 0x20, 0x1e, 0x1e, 0x20, 0x21, 0x22, 0x22, + 0x23, 0x26, 0x29, 0x29, 0x28, 0x27, 0x25, 0x23, 0x21, 0x21, 0x21, 0x22, + 0x23, 0x25, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2b, 0x2a, 0x28, 0x26, + 0x25, 0x25, 0x26, 0x27, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, + 0x2a, 0x29, 0x28, 0x27, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x2f, + 0x2f, 0x2f, 0x30, 0x30, 0x2f, 0x2d, 0x2c, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x31, 0x31, 0x31, 0x30, 0x2f, 0x2d, 0x2d, 0x2c, 0x2b, 0x2a, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2e, 0x2d, 0x2c, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x26, 0x26, 0x28, 0x2a, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2a, 0x29, 0x27, 0x25, 0x25, 0x27, 0x28, 0x29, 0x29, 0x27, + 0x25, 0x23, 0x23, 0x24, 0x25, 0x24, 0x24, 0x24, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x20, 0x1f, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, + 0x1d, 0x1f, 0x21, 0x21, 0x20, 0x1d, 0x1a, 0x18, 0x18, 0x19, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1e, 0x1b, 0x19, 0x17, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x1f, + 0x1f, 0x1e, 0x1c, 0x1a, 0x19, 0x19, 0x1b, 0x1d, 0x1e, 0x1f, 0x1e, 0x1d, + 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1d, 0x1e, + 0x20, 0x21, 0x22, 0x22, 0x20, 0x1e, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1f, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1d, + 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1b, 0x1a, 0x19, + 0x18, 0x15, 0x12, 0x0e, 0x0a, 0x06, 0x02, 0xfe, 0xfb, 0xf8, 0xf4, 0xf1, + 0xee, 0xe9, 0xe4, 0xdf, 0xd9, 0xd5, 0xd1, 0xcd, 0xcb, 0xc9, 0xc8, 0xc7, + 0xc5, 0xc4, 0xc3, 0xc1, 0xbf, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb3, 0xb5, 0xb9, 0xbd, 0xc1, 0xc5, 0xc9, 0xce, 0xd1, 0xd4, 0xd7, + 0xd9, 0xdc, 0xdf, 0xe1, 0xe5, 0xe8, 0xeb, 0xef, 0xf3, 0xf7, 0xfb, 0xfe, + 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x07, 0x09, + 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x15, 0x14, 0x13, 0x11, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x15, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x19, 0x18, + 0x17, 0x16, 0x16, 0x16, 0x16, 0x17, 0x18, 0x18, 0x19, 0x1b, 0x1c, 0x1d, + 0x1d, 0x1c, 0x1b, 0x19, 0x19, 0x19, 0x1a, 0x19, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1b, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x18, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x18, 0x17, 0x16, 0x15, 0x15, 0x15, + 0x15, 0x14, 0x13, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x12, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x10, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x0e, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0e, 0x0f, 0x0f, 0x0d, 0x0b, 0x0b, 0x0a, 0x09, + 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x05, 0x05, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, + 0x05, 0x05, 0x06, 0x07, 0x08, 0x07, 0x06, 0x05, 0x03, 0x03, 0x05, 0x07, + 0x09, 0x0b, 0x0c, 0x0c, 0x0b, 0x09, 0x07, 0x07, 0x07, 0x07, 0x09, 0x0b, + 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x11, 0x13, 0x14, 0x13, 0x12, + 0x11, 0x0f, 0x0d, 0x0c, 0x0d, 0x11, 0x14, 0x17, 0x19, 0x19, 0x17, 0x15, + 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1b, + 0x1d, 0x1f, 0x21, 0x23, 0x24, 0x22, 0x20, 0x1e, 0x1d, 0x1e, 0x20, 0x22, + 0x25, 0x27, 0x26, 0x24, 0x22, 0x20, 0x1f, 0x1f, 0x21, 0x23, 0x25, 0x26, + 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x22, 0x23, 0x23, 0x22, 0x21, 0x20, 0x1f, + 0x1f, 0x20, 0x21, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1a, + 0x1b, 0x1c, 0x1b, 0x1a, 0x18, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, + 0x17, 0x17, 0x17, 0x16, 0x15, 0x13, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x07, + 0x10, 0x16, 0x18, 0x16, 0x0f, 0x04, 0xfd, 0xf9, 0xfa, 0xfe, 0x02, 0x07, + 0x0a, 0x0a, 0x08, 0x05, 0x03, 0x02, 0x01, 0x01, 0xfd, 0xfa, 0xf8, 0xf5, + 0xf3, 0xf1, 0xee, 0xed, 0xec, 0xef, 0xf5, 0x00, 0x0b, 0x18, 0x1f, 0x21, + 0x1e, 0x19, 0x15, 0x12, 0x12, 0x15, 0x15, 0x12, 0x0d, 0x05, 0xfd, 0xf5, + 0xf2, 0xf9, 0xec, 0xe0, 0xda, 0xdb, 0xdd, 0xe0, 0xeb, 0xfd, 0x0e, 0x11, + 0x07, 0x02, 0x0d, 0x22, 0x2d, 0x21, 0x0d, 0xff, 0x01, 0x0a, 0x07, 0xf9, + 0xf0, 0xf0, 0xf9, 0xff, 0x01, 0x04, 0x0d, 0x17, 0x19, 0x10, 0x07, 0x07, + 0x0c, 0x09, 0xf5, 0xdc, 0xdb, 0xd8, 0xe4, 0xf0, 0xec, 0xe6, 0xea, 0xfa, + 0x0f, 0x1e, 0x29, 0x31, 0x33, 0x2d, 0x26, 0x19, 0x19, 0x25, 0x28, 0x1b, + 0x00, 0xe6, 0xe0, 0xeb, 0xf3, 0xf0, 0xe5, 0xdd, 0xdc, 0xde, 0xdf, 0xe5, + 0xf3, 0x02, 0x0a, 0x07, 0x00, 0x03, 0x15, 0x26, 0x2a, 0x1c, 0x0b, 0x01, + 0x02, 0x06, 0x00, 0xf8, 0xf5, 0xfa, 0x00, 0x03, 0x04, 0x06, 0x0c, 0x14, + 0x11, 0x08, 0x04, 0x05, 0x06, 0xfe, 0xea, 0xdb, 0xd9, 0xdd, 0xea, 0xee, + 0xeb, 0xed, 0xf8, 0x0b, 0x1d, 0x27, 0x2c, 0x30, 0x2e, 0x27, 0x1b, 0x16, + 0x1b, 0x24, 0x23, 0x0d, 0xf4, 0xe4, 0xe3, 0xec, 0xef, 0xe9, 0xe2, 0xde, + 0xde, 0xe1, 0xe4, 0xeb, 0xf7, 0x03, 0x06, 0x01, 0xff, 0x0a, 0x1c, 0x2a, + 0x26, 0x17, 0x08, 0x03, 0x02, 0x00, 0xfc, 0xf9, 0xfb, 0x01, 0x07, 0x05, + 0x04, 0x07, 0x0d, 0x0f, 0x0a, 0x05, 0x02, 0x03, 0x01, 0xf6, 0xe4, 0xdb, + 0xd9, 0xe2, 0xeb, 0xed, 0xee, 0xf6, 0x07, 0x19, 0x26, 0x2b, 0x2d, 0x2c, + 0x26, 0x1d, 0x15, 0x16, 0x1f, 0x22, 0x18, 0x03, 0xed, 0xe3, 0xe6, 0xec, + 0xeb, 0xe5, 0xe0, 0xe0, 0xe1, 0xe4, 0xe8, 0xf0, 0xfa, 0x01, 0x00, 0x00, + 0x05, 0x11, 0x25, 0x2d, 0x24, 0x13, 0x07, 0x01, 0x00, 0xfe, 0xfc, 0xfc, + 0x02, 0x09, 0x0a, 0x07, 0x05, 0x07, 0x0a, 0x09, 0x05, 0x00, 0xff, 0xff, + 0xfc, 0xef, 0xe1, 0xdc, 0xe0, 0xea, 0xef, 0xf2, 0xf8, 0x06, 0x1a, 0x29, + 0x30, 0x30, 0x2c, 0x29, 0x24, 0x1c, 0x1a, 0x1e, 0x24, 0x22, 0x11, 0xfa, + 0xe9, 0xe3, 0xe5, 0xe7, 0xe3, 0xdd, 0xda, 0xdb, 0xde, 0xe1, 0xe6, 0xef, + 0xf7, 0xfb, 0xfc, 0xfc, 0x07, 0x17, 0x26, 0x26, 0x1a, 0x0c, 0x00, 0xfc, + 0xfc, 0xfd, 0xfe, 0x04, 0x0b, 0x0e, 0x0c, 0x08, 0x06, 0x07, 0x0a, 0x07, + 0x02, 0xfd, 0xfc, 0xfc, 0xf6, 0xea, 0xe1, 0xe0, 0xe5, 0xed, 0xf2, 0xf8, + 0x03, 0x16, 0x26, 0x30, 0x31, 0x2d, 0x27, 0x22, 0x1d, 0x1a, 0x1c, 0x20, + 0x21, 0x17, 0x04, 0xf0, 0xe5, 0xe3, 0xe5, 0xe2, 0xde, 0xdc, 0xdb, 0xde, + 0xe0, 0xe5, 0xea, 0xf2, 0xf7, 0xfa, 0xfb, 0x02, 0x12, 0x21, 0x27, 0x23, + 0x14, 0x06, 0xfe, 0xfb, 0xfc, 0xff, 0x04, 0x0a, 0x0e, 0x0d, 0x09, 0x05, + 0x05, 0x08, 0x07, 0x04, 0xfe, 0xfc, 0xfb, 0xf9, 0xf1, 0xe8, 0xe3, 0xe3, + 0xe9, 0xef, 0xf6, 0xff, 0x11, 0x21, 0x2e, 0x32, 0x2e, 0x28, 0x21, 0x1d, + 0x1a, 0x1a, 0x1d, 0x20, 0x1a, 0x0d, 0xf9, 0xe9, 0xe1, 0xe0, 0xe2, 0xdf, + 0xdd, 0xdb, 0xdc, 0xdf, 0xe3, 0xe8, 0xed, 0xf3, 0xf8, 0xfb, 0xfe, 0x0b, + 0x1a, 0x26, 0x28, 0x1d, 0x0c, 0x00, 0xfb, 0xfb, 0x00, 0x04, 0x0a, 0x0e, + 0x0e, 0x0b, 0x07, 0x04, 0x05, 0x07, 0x04, 0x00, 0xfb, 0xf9, 0xf8, 0xf5, + 0xed, 0xe7, 0xe4, 0xe6, 0xec, 0xf3, 0xfc, 0x0b, 0x1d, 0x2b, 0x32, 0x30, + 0x28, 0x22, 0x1d, 0x1a, 0x1a, 0x1b, 0x1d, 0x1a, 0x12, 0x02, 0xef, 0xe3, + 0xdf, 0xe0, 0xe0, 0xde, 0xdb, 0xdc, 0xde, 0xe2, 0xe6, 0xeb, 0xef, 0xf3, + 0xf7, 0xfc, 0x06, 0x14, 0x22, 0x29, 0x22, 0x14, 0x03, 0xfb, 0xf9, 0xfc, + 0x01, 0x07, 0x0c, 0x0e, 0x0b, 0x07, 0x01, 0x01, 0x02, 0x01, 0xff, 0xf9, + 0xf4, 0xf3, 0xf2, 0xee, 0xe8, 0xe5, 0xe5, 0xea, 0xf1, 0xfb, 0x08, 0x1a, + 0x29, 0x32, 0x33, 0x2b, 0x23, 0x1c, 0x18, 0x19, 0x1c, 0x1d, 0x1e, 0x16, + 0x0a, 0xfa, 0xed, 0xe5, 0xe2, 0xe2, 0xe1, 0xdf, 0xdd, 0xde, 0xe2, 0xe6, + 0xea, 0xef, 0xf3, 0xf7, 0xfc, 0x04, 0x10, 0x1e, 0x27, 0x27, 0x1b, 0x0b, + 0xfe, 0xf9, 0xfa, 0xff, 0x07, 0x0c, 0x0f, 0x0e, 0x09, 0x04, 0x01, 0x01, + 0x01, 0x00, 0xfb, 0xf7, 0xf4, 0xf3, 0xf1, 0xed, 0xe9, 0xe7, 0xe8, 0xee, + 0xf9, 0x04, 0x15, 0x25, 0x31, 0x34, 0x2e, 0x24, 0x1d, 0x18, 0x17, 0x1a, + 0x1c, 0x1c, 0x18, 0x0d, 0xfe, 0xf0, 0xe7, 0xe3, 0xe1, 0xe0, 0xdf, 0xde, + 0xdf, 0xe0, 0xe4, 0xe8, 0xec, 0xf0, 0xf3, 0xf9, 0xff, 0x0c, 0x19, 0x26, + 0x28, 0x20, 0x12, 0x04, 0xfd, 0xfc, 0xfe, 0x04, 0x0b, 0x0f, 0x0f, 0x0b, + 0x05, 0x01, 0x01, 0x01, 0x00, 0xff, 0xfa, 0xf6, 0xf4, 0xf3, 0xef, 0xeb, + 0xe8, 0xe8, 0xeb, 0xf3, 0xff, 0x0f, 0x21, 0x2f, 0x33, 0x30, 0x29, 0x1e, + 0x19, 0x17, 0x19, 0x1b, 0x1c, 0x18, 0x10, 0x03, 0xf5, 0xe9, 0xe3, 0xe1, + 0xe0, 0xde, 0xdd, 0xde, 0xe0, 0xe1, 0xe6, 0xea, 0xed, 0xf0, 0xf5, 0xfb, + 0x07, 0x15, 0x21, 0x28, 0x26, 0x19, 0x0a, 0xff, 0xfc, 0xfe, 0x04, 0x0b, + 0x0f, 0x10, 0x0d, 0x07, 0x03, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xf7, 0xf4, + 0xf2, 0xf1, 0xed, 0xeb, 0xe9, 0xea, 0xef, 0xfb, 0x09, 0x1a, 0x2b, 0x34, + 0x33, 0x2b, 0x21, 0x19, 0x16, 0x17, 0x1b, 0x1c, 0x1a, 0x11, 0x05, 0xf6, + 0xea, 0xe4, 0xe0, 0xdf, 0xde, 0xdd, 0xdd, 0xdf, 0xe2, 0xe5, 0xe8, 0xeb, + 0xed, 0xf1, 0xf8, 0x02, 0x10, 0x1d, 0x27, 0x28, 0x20, 0x11, 0x04, 0xfd, + 0xfd, 0x02, 0x0a, 0x0f, 0x11, 0x0e, 0x09, 0x04, 0xff, 0xfe, 0x00, 0x00, + 0xfd, 0xf9, 0xf5, 0xf4, 0xf3, 0xf0, 0xed, 0xea, 0xea, 0xee, 0xf7, 0x04, + 0x14, 0x26, 0x33, 0x35, 0x30, 0x25, 0x1a, 0x16, 0x16, 0x18, 0x1a, 0x19, + 0x12, 0x08, 0xfb, 0xee, 0xe5, 0xe0, 0xe0, 0xdf, 0xdd, 0xdd, 0xde, 0xe0, + 0xe3, 0xe7, 0xe9, 0xec, 0xee, 0xf4, 0xfd, 0x0b, 0x19, 0x26, 0x2b, 0x25, + 0x19, 0x09, 0x01, 0xfe, 0x02, 0x08, 0x0e, 0x11, 0x0f, 0x0b, 0x06, 0x00, + 0xff, 0xff, 0x00, 0xfe, 0xfc, 0xf8, 0xf5, 0xf3, 0xf2, 0xef, 0xec, 0xe9, + 0xec, 0xf3, 0xff, 0x0f, 0x21, 0x2e, 0x35, 0x32, 0x28, 0x1d, 0x17, 0x15, + 0x16, 0x19, 0x18, 0x15, 0x0c, 0xff, 0xf1, 0xe7, 0xe0, 0xdf, 0xdf, 0xdd, + 0xdd, 0xdd, 0xde, 0xe2, 0xe6, 0xe8, 0xe9, 0xec, 0xf1, 0xfa, 0x05, 0x15, + 0x21, 0x2a, 0x29, 0x20, 0x10, 0x05, 0x00, 0x02, 0x08, 0x0f, 0x11, 0x10, + 0x0c, 0x07, 0x01, 0xff, 0xfe, 0xff, 0xfe, 0xfc, 0xf9, 0xf5, 0xf5, 0xf3, + 0xf1, 0xed, 0xea, 0xea, 0xef, 0xfb, 0x09, 0x1b, 0x2b, 0x33, 0x33, 0x2c, + 0x21, 0x18, 0x15, 0x16, 0x18, 0x19, 0x14, 0x0d, 0x01, 0xf4, 0xe8, 0xe1, + 0xde, 0xdd, 0xde, 0xdd, 0xdd, 0xdf, 0xe2, 0xe4, 0xe7, 0xe9, 0xea, 0xee, + 0xf6, 0x01, 0x10, 0x1e, 0x28, 0x2a, 0x24, 0x16, 0x09, 0x02, 0x01, 0x05, + 0x0d, 0x11, 0x11, 0x0e, 0x08, 0x02, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfc, + 0xf8, 0xf5, 0xf5, 0xf3, 0xf0, 0xeb, 0xea, 0xed, 0xf7, 0x04, 0x16, 0x26, + 0x32, 0x35, 0x2f, 0x25, 0x1b, 0x15, 0x15, 0x17, 0x19, 0x16, 0x0e, 0x04, + 0xf7, 0xeb, 0xe2, 0xde, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xe4, 0xe6, + 0xe7, 0xe9, 0xeb, 0xf0, 0xfb, 0x0a, 0x18, 0x25, 0x2b, 0x27, 0x1c, 0x10, + 0x06, 0x02, 0x05, 0x0d, 0x12, 0x12, 0x0f, 0x09, 0x04, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xfa, 0xf5, 0xf5, 0xf4, 0xf2, 0xee, 0xec, 0xec, 0xf1, + 0x00, 0x10, 0x21, 0x2f, 0x35, 0x31, 0x28, 0x1e, 0x17, 0x13, 0x16, 0x18, + 0x17, 0x0f, 0x06, 0xfa, 0xee, 0xe4, 0xdf, 0xdd, 0xdd, 0xde, 0xdd, 0xdd, + 0xdf, 0xe1, 0xe4, 0xe7, 0xe7, 0xe9, 0xec, 0xf7, 0x04, 0x14, 0x22, 0x29, + 0x2b, 0x22, 0x16, 0x09, 0x05, 0x05, 0x0b, 0x11, 0x14, 0x11, 0x0c, 0x05, + 0x01, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfc, 0xf8, 0xf6, 0xf4, 0xf4, 0xf1, + 0xed, 0xec, 0xf1, 0xfd, 0x0a, 0x1c, 0x2c, 0x33, 0x34, 0x2b, 0x20, 0x17, + 0x14, 0x15, 0x17, 0x18, 0x12, 0x08, 0xfb, 0xef, 0xe6, 0xdf, 0xdd, 0xdd, + 0xdc, 0xdd, 0xdd, 0xde, 0xe1, 0xe2, 0xe5, 0xe5, 0xe6, 0xe8, 0xf1, 0xff, + 0x0d, 0x1d, 0x28, 0x2a, 0x25, 0x1b, 0x10, 0x09, 0x07, 0x0b, 0x11, 0x15, + 0x12, 0x0d, 0x07, 0x01, 0xfd, 0xfc, 0xfe, 0x00, 0x00, 0xfe, 0xfa, 0xf6, + 0xf6, 0xf4, 0xf3, 0xef, 0xec, 0xee, 0xf8, 0x07, 0x16, 0x27, 0x32, 0x34, + 0x2e, 0x25, 0x19, 0x14, 0x13, 0x15, 0x18, 0x13, 0x0a, 0xfe, 0xf2, 0xe8, + 0xe1, 0xdd, 0xdc, 0xdd, 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, 0xe3, 0xe5, 0xe4, + 0xe6, 0xec, 0xf9, 0x08, 0x17, 0x25, 0x2a, 0x28, 0x20, 0x15, 0x0c, 0x09, + 0x0b, 0x11, 0x16, 0x16, 0x10, 0x09, 0x02, 0xfe, 0xfc, 0xfd, 0xfe, 0xff, + 0xff, 0xfc, 0xf9, 0xf7, 0xf5, 0xf5, 0xf1, 0xee, 0xee, 0xf4, 0x00, 0x11, + 0x23, 0x30, 0x34, 0x30, 0x28, 0x1d, 0x14, 0x11, 0x14, 0x16, 0x16, 0x0d, + 0x02, 0xf5, 0xea, 0xe3, 0xdd, 0xdc, 0xdb, 0xdd, 0xdd, 0xdf, 0xdf, 0xe0, + 0xe1, 0xe4, 0xe3, 0xe3, 0xe8, 0xf3, 0x02, 0x13, 0x22, 0x2a, 0x2a, 0x25, + 0x1a, 0x0f, 0x0a, 0x0c, 0x10, 0x16, 0x17, 0x13, 0x0c, 0x05, 0xfe, 0xfd, + 0xfc, 0xfe, 0x00, 0x01, 0xfe, 0xfb, 0xf7, 0xf7, 0xf5, 0xf2, 0xef, 0xee, + 0xf2, 0xfd, 0x0c, 0x1e, 0x2d, 0x33, 0x32, 0x2a, 0x1f, 0x17, 0x12, 0x13, + 0x15, 0x15, 0x10, 0x05, 0xf8, 0xec, 0xe3, 0xdd, 0xdc, 0xdb, 0xda, 0xdd, + 0xdc, 0xde, 0xdf, 0xe1, 0xe1, 0xe2, 0xe3, 0xe6, 0xed, 0xfd, 0x0e, 0x1d, + 0x29, 0x2c, 0x27, 0x1d, 0x12, 0x0d, 0x0c, 0x10, 0x16, 0x18, 0x16, 0x0f, + 0x08, 0x01, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfa, 0xf8, 0xf6, + 0xf4, 0xf1, 0xee, 0xf0, 0xf9, 0x08, 0x18, 0x2a, 0x34, 0x34, 0x2c, 0x22, + 0x18, 0x14, 0x11, 0x14, 0x14, 0x11, 0x08, 0xfb, 0xef, 0xe5, 0xdf, 0xdc, + 0xda, 0xda, 0xdc, 0xdc, 0xde, 0xde, 0xe0, 0xdf, 0xe0, 0xe0, 0xe2, 0xe8, + 0xf4, 0x06, 0x17, 0x26, 0x2c, 0x2a, 0x23, 0x18, 0x11, 0x0d, 0x0f, 0x16, + 0x1a, 0x18, 0x12, 0x0a, 0x02, 0xfe, 0xfd, 0xfc, 0xfe, 0xff, 0xff, 0xfe, + 0xfb, 0xf8, 0xf9, 0xf6, 0xf2, 0xf2, 0xef, 0xf4, 0x01, 0x13, 0x25, 0x31, + 0x34, 0x2f, 0x25, 0x1b, 0x12, 0x0f, 0x11, 0x14, 0x13, 0x0b, 0xff, 0xf3, + 0xe7, 0xe0, 0xdd, 0xdc, 0xda, 0xdb, 0xdd, 0xdd, 0xde, 0xde, 0xdf, 0xde, + 0xdf, 0xe0, 0xe4, 0xee, 0xfe, 0x11, 0x22, 0x2b, 0x2c, 0x26, 0x1e, 0x14, + 0x11, 0x10, 0x15, 0x1b, 0x1c, 0x17, 0x0e, 0x05, 0xff, 0xfd, 0xfd, 0xfc, + 0xff, 0xff, 0xfe, 0xfc, 0xf9, 0xf9, 0xf7, 0xf6, 0xf2, 0xf0, 0xf3, 0xfd, + 0x0d, 0x1f, 0x2d, 0x35, 0x31, 0x28, 0x1e, 0x15, 0x0f, 0x10, 0x12, 0x12, + 0x0b, 0x03, 0xf6, 0xeb, 0xe3, 0xdd, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, + 0xdc, 0xdd, 0xdf, 0xdf, 0xde, 0xe0, 0xe8, 0xf9, 0x0a, 0x1d, 0x2a, 0x2e, + 0x2a, 0x21, 0x19, 0x12, 0x12, 0x15, 0x1a, 0x1d, 0x19, 0x11, 0x08, 0x01, + 0xfe, 0xfd, 0xfd, 0xff, 0x00, 0xff, 0xfd, 0xfb, 0xf9, 0xf9, 0xf6, 0xf3, + 0xf1, 0xf2, 0xfb, 0x0a, 0x19, 0x2a, 0x33, 0x33, 0x2b, 0x20, 0x16, 0x0f, + 0x0e, 0x10, 0x11, 0x0d, 0x07, 0xfb, 0xed, 0xe5, 0xdf, 0xdc, 0xdb, 0xdd, + 0xdd, 0xdc, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xe5, 0xf3, 0x03, + 0x15, 0x25, 0x2d, 0x2c, 0x25, 0x1c, 0x15, 0x12, 0x15, 0x19, 0x1c, 0x1c, + 0x15, 0x0c, 0x03, 0xff, 0xfe, 0xfd, 0x00, 0x01, 0x00, 0xff, 0xfc, 0xfa, + 0xfa, 0xf8, 0xf6, 0xf1, 0xf1, 0xf8, 0x04, 0x14, 0x26, 0x31, 0x35, 0x2e, + 0x23, 0x17, 0x0f, 0x0d, 0x10, 0x10, 0x0e, 0x08, 0xfe, 0xf2, 0xe8, 0xe1, + 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdc, 0xdd, 0xdc, 0xdc, 0xdb, 0xda, 0xdb, + 0xe1, 0xed, 0xff, 0x0f, 0x20, 0x2b, 0x2d, 0x28, 0x1f, 0x17, 0x13, 0x15, + 0x1a, 0x1d, 0x1e, 0x18, 0x10, 0x07, 0xff, 0xfe, 0xfe, 0x00, 0x01, 0x01, + 0xff, 0xfd, 0xfa, 0xfa, 0xf9, 0xf6, 0xf3, 0xf2, 0xf6, 0xfe, 0x0e, 0x20, + 0x2e, 0x33, 0x30, 0x27, 0x1a, 0x11, 0x0c, 0x0d, 0x0f, 0x0f, 0x0a, 0x01, + 0xf3, 0xe9, 0xe2, 0xdd, 0xdc, 0xdc, 0xdd, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, + 0xdb, 0xd9, 0xda, 0xdd, 0xe6, 0xf8, 0x09, 0x1c, 0x29, 0x2d, 0x2b, 0x22, + 0x19, 0x14, 0x15, 0x18, 0x1e, 0x20, 0x1b, 0x13, 0x0b, 0x03, 0xfe, 0xfe, + 0xfe, 0x01, 0x01, 0x01, 0xfe, 0xfb, 0xfb, 0xfb, 0xf7, 0xf4, 0xf2, 0xf4, + 0xfe, 0x0b, 0x1b, 0x2b, 0x34, 0x32, 0x2a, 0x1e, 0x12, 0x0c, 0x0b, 0x0c, + 0x0f, 0x0b, 0x05, 0xf7, 0xed, 0xe4, 0xdf, 0xdc, 0xde, 0xde, 0xdd, 0xdd, + 0xdc, 0xdb, 0xdb, 0xdb, 0xda, 0xd9, 0xda, 0xe2, 0xf0, 0x02, 0x15, 0x25, + 0x2d, 0x2c, 0x25, 0x1b, 0x15, 0x14, 0x17, 0x1c, 0x21, 0x1e, 0x17, 0x0f, + 0x06, 0x01, 0xfe, 0x00, 0x01, 0x02, 0x02, 0xff, 0xfc, 0xfb, 0xfa, 0xf8, + 0xf4, 0xf3, 0xf3, 0xfa, 0x05, 0x16, 0x28, 0x32, 0x33, 0x2e, 0x23, 0x16, + 0x0d, 0x0a, 0x0b, 0x0d, 0x0b, 0x04, 0xfc, 0xf1, 0xe6, 0xdf, 0xde, 0xde, + 0xdd, 0xdc, 0xdc, 0xdb, 0xda, 0xd9, 0xda, 0xd9, 0xd9, 0xd9, 0xde, 0xe9, + 0xfc, 0x0f, 0x1f, 0x2b, 0x2d, 0x28, 0x1f, 0x18, 0x14, 0x17, 0x1c, 0x21, + 0x20, 0x1b, 0x12, 0x0a, 0x03, 0x01, 0x00, 0x02, 0x02, 0x02, 0x01, 0xfc, + 0xfc, 0xfc, 0xf9, 0xf6, 0xf4, 0xf3, 0xf7, 0x02, 0x12, 0x22, 0x2f, 0x34, + 0x30, 0x25, 0x19, 0x10, 0x09, 0x09, 0x0b, 0x0b, 0x07, 0xff, 0xf3, 0xe9, + 0xe1, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdc, 0xda, 0xda, 0xda, 0xd9, 0xd9, + 0xd9, 0xdb, 0xe4, 0xf6, 0x08, 0x1a, 0x27, 0x2d, 0x29, 0x21, 0x19, 0x15, + 0x15, 0x19, 0x21, 0x23, 0x1d, 0x15, 0x0e, 0x07, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x01, 0xff, 0xfc, 0xfb, 0xf9, 0xf8, 0xf5, 0xf4, 0xf6, 0xff, 0x0d, + 0x1e, 0x2c, 0x34, 0x33, 0x2a, 0x1c, 0x11, 0x09, 0x06, 0x0a, 0x0b, 0x08, + 0x01, 0xf6, 0xea, 0xe3, 0xe0, 0xde, 0xdd, 0xdd, 0xdd, 0xdb, 0xda, 0xd9, + 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xe0, 0xf0, 0x01, 0x14, 0x23, 0x2b, 0x29, + 0x22, 0x1c, 0x15, 0x14, 0x18, 0x1e, 0x22, 0x20, 0x1b, 0x11, 0x0a, 0x05, + 0x04, 0x03, 0x03, 0x04, 0x03, 0xff, 0xfd, 0xfb, 0xfa, 0xf8, 0xf7, 0xf5, + 0xf5, 0xfd, 0x09, 0x18, 0x29, 0x34, 0x33, 0x2b, 0x20, 0x13, 0x0a, 0x06, + 0x06, 0x09, 0x07, 0x03, 0xf9, 0xee, 0xe5, 0xe3, 0xdf, 0xde, 0xdf, 0xdf, + 0xdc, 0xda, 0xd9, 0xd8, 0xd8, 0xd7, 0xd7, 0xd8, 0xde, 0xea, 0xfd, 0x0e, + 0x1f, 0x29, 0x2a, 0x25, 0x1d, 0x17, 0x14, 0x16, 0x1d, 0x21, 0x23, 0x1e, + 0x16, 0x0e, 0x08, 0x05, 0x05, 0x05, 0x04, 0x03, 0x01, 0xfd, 0xfc, 0xfa, + 0xf8, 0xf7, 0xf5, 0xf5, 0xfb, 0x04, 0x14, 0x24, 0x32, 0x35, 0x2f, 0x23, + 0x17, 0x0a, 0x05, 0x05, 0x08, 0x08, 0x04, 0xfd, 0xf2, 0xe8, 0xe2, 0xe0, + 0xe0, 0xdf, 0xdf, 0xdb, 0xda, 0xd9, 0xd8, 0xd7, 0xd8, 0xd8, 0xd8, 0xdb, + 0xe5, 0xf6, 0x08, 0x1b, 0x27, 0x2a, 0x27, 0x1f, 0x17, 0x14, 0x15, 0x1a, + 0x1f, 0x22, 0x20, 0x19, 0x11, 0x0c, 0x08, 0x07, 0x07, 0x07, 0x05, 0x02, + 0xfe, 0xfd, 0xf9, 0xf8, 0xf8, 0xf5, 0xf5, 0xfa, 0x01, 0x0f, 0x20, 0x2e, + 0x34, 0x30, 0x27, 0x19, 0x0d, 0x05, 0x03, 0x05, 0x07, 0x05, 0xff, 0xf3, + 0xe9, 0xe4, 0xe2, 0xe0, 0xe1, 0xe0, 0xdd, 0xdb, 0xd9, 0xd7, 0xd5, 0xd7, + 0xd7, 0xd7, 0xda, 0xe2, 0xf1, 0x02, 0x14, 0x23, 0x29, 0x26, 0x20, 0x18, + 0x13, 0x13, 0x18, 0x1d, 0x22, 0x22, 0x1d, 0x14, 0x0f, 0x0b, 0x08, 0x08, + 0x09, 0x07, 0x04, 0x00, 0xfe, 0xfa, 0xf8, 0xf6, 0xf5, 0xf6, 0xf9, 0xff, + 0x0c, 0x1b, 0x2b, 0x34, 0x34, 0x2a, 0x1d, 0x0f, 0x06, 0x02, 0x03, 0x06, + 0x05, 0x02, 0xf8, 0xee, 0xe6, 0xe1, 0xe0, 0xe1, 0xe0, 0xde, 0xdb, 0xda, + 0xd6, 0xd5, 0xd5, 0xd5, 0xd7, 0xd8, 0xde, 0xeb, 0xfe, 0x10, 0x20, 0x28, + 0x28, 0x21, 0x1a, 0x14, 0x12, 0x14, 0x1b, 0x21, 0x24, 0x20, 0x1a, 0x13, + 0x0e, 0x0b, 0x0a, 0x0a, 0x09, 0x06, 0x03, 0xff, 0xfa, 0xf8, 0xf7, 0xf6, + 0xf6, 0xf7, 0xfc, 0x06, 0x16, 0x27, 0x33, 0x34, 0x2d, 0x21, 0x12, 0x06, + 0x00, 0x00, 0x03, 0x06, 0x01, 0xfa, 0xf1, 0xe8, 0xe4, 0xe2, 0xe2, 0xe1, + 0xde, 0xdc, 0xd9, 0xd7, 0xd5, 0xd7, 0xd4, 0xd4, 0xd7, 0xdd, 0xe7, 0xf7, + 0x0a, 0x1a, 0x26, 0x27, 0x22, 0x1b, 0x14, 0x11, 0x12, 0x17, 0x1f, 0x23, + 0x22, 0x1d, 0x17, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x08, 0x03, 0xff, 0xfc, + 0xf9, 0xf6, 0xf5, 0xf5, 0xf6, 0xfa, 0x02, 0x12, 0x23, 0x31, 0x36, 0x32, + 0x24, 0x16, 0x08, 0x00, 0x00, 0x02, 0x04, 0x03, 0xfe, 0xf5, 0xeb, 0xe4, + 0xe3, 0xe3, 0xe2, 0xe0, 0xde, 0xda, 0xd8, 0xd7, 0xd5, 0xd5, 0xd5, 0xd7, + 0xda, 0xe2, 0xf1, 0x04, 0x16, 0x23, 0x29, 0x24, 0x1d, 0x14, 0x0f, 0x0f, + 0x14, 0x1b, 0x21, 0x22, 0x1f, 0x19, 0x13, 0x0f, 0x0f, 0x0e, 0x0c, 0x0a, + 0x06, 0x02, 0xfd, 0xfa, 0xf6, 0xf5, 0xf6, 0xf6, 0xfa, 0x00, 0x0c, 0x1f, + 0x2d, 0x36, 0x34, 0x29, 0x19, 0x0c, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, + 0xf8, 0xef, 0xe6, 0xe3, 0xe3, 0xe2, 0xe0, 0xdf, 0xdc, 0xd7, 0xd7, 0xd5, + 0xd4, 0xd4, 0xd7, 0xd8, 0xdf, 0xec, 0x00, 0x11, 0x21, 0x2a, 0x26, 0x1e, + 0x15, 0x0e, 0x0b, 0x0f, 0x18, 0x20, 0x23, 0x22, 0x1c, 0x16, 0x12, 0x10, + 0x10, 0x0f, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf8, 0xf6, 0xf5, 0xf6, 0xf7, + 0xfe, 0x08, 0x1a, 0x2a, 0x35, 0x36, 0x2d, 0x1e, 0x0f, 0x03, 0xff, 0x00, + 0x00, 0x02, 0x00, 0xfb, 0xf1, 0xe9, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdd, + 0xd9, 0xd7, 0xd5, 0xd4, 0xd4, 0xd6, 0xd7, 0xdc, 0xe8, 0xfa, 0x0b, 0x1c, + 0x27, 0x27, 0x20, 0x16, 0x0d, 0x09, 0x0b, 0x14, 0x1c, 0x21, 0x22, 0x1e, + 0x18, 0x15, 0x13, 0x12, 0x10, 0x0f, 0x0b, 0x05, 0x00, 0xfd, 0xfa, 0xf6, + 0xf5, 0xf5, 0xf6, 0xfb, 0x04, 0x14, 0x25, 0x33, 0x37, 0x30, 0x24, 0x15, + 0x06, 0xff, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf4, 0xeb, 0xe7, 0xe4, 0xe3, + 0xe3, 0xe2, 0xde, 0xda, 0xd6, 0xd5, 0xd3, 0xd3, 0xd3, 0xd6, 0xda, 0xe3, + 0xf3, 0x04, 0x17, 0x24, 0x28, 0x22, 0x1a, 0x10, 0x09, 0x0a, 0x10, 0x19, + 0x21, 0x23, 0x21, 0x1c, 0x17, 0x15, 0x15, 0x13, 0x12, 0x0f, 0x07, 0x01, + 0xfd, 0xfa, 0xf6, 0xf5, 0xf4, 0xf5, 0xf9, 0x01, 0x10, 0x22, 0x31, 0x37, + 0x34, 0x28, 0x18, 0x09, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xf7, 0xef, + 0xe9, 0xe7, 0xe5, 0xe4, 0xe4, 0xe1, 0xdc, 0xd8, 0xd5, 0xd2, 0xd2, 0xd3, + 0xd4, 0xd7, 0xdf, 0xed, 0x00, 0x12, 0x21, 0x28, 0x25, 0x1c, 0x10, 0x08, + 0x06, 0x0b, 0x14, 0x1c, 0x22, 0x21, 0x1d, 0x18, 0x15, 0x14, 0x15, 0x14, + 0x10, 0x0a, 0x03, 0x00, 0xfb, 0xf8, 0xf6, 0xf5, 0xf4, 0xf7, 0x00, 0x0b, + 0x1b, 0x2c, 0x36, 0x35, 0x2b, 0x1b, 0x0b, 0x00, 0xfc, 0xfd, 0x00, 0x00, + 0x00, 0xfb, 0xf4, 0xef, 0xea, 0xe8, 0xe7, 0xe6, 0xe3, 0xe0, 0xdc, 0xd7, + 0xd4, 0xd3, 0xd3, 0xd3, 0xd7, 0xde, 0xe9, 0xfa, 0x0b, 0x1c, 0x26, 0x26, + 0x1e, 0x12, 0x09, 0x04, 0x07, 0x0f, 0x18, 0x20, 0x21, 0x1e, 0x1b, 0x17, + 0x15, 0x15, 0x15, 0x12, 0x0d, 0x06, 0x00, 0xfd, 0xfa, 0xf7, 0xf5, 0xf4, + 0xf5, 0xfc, 0x05, 0x15, 0x27, 0x33, 0x36, 0x2f, 0x21, 0x0f, 0x00, 0xfc, + 0xfb, 0xfe, 0x00, 0x00, 0xfe, 0xf8, 0xf0, 0xeb, 0xe9, 0xe8, 0xe7, 0xe4, + 0xe2, 0xde, 0xd9, 0xd7, 0xd4, 0xd4, 0xd5, 0xd7, 0xdc, 0xe5, 0xf5, 0x05, + 0x17, 0x23, 0x27, 0x22, 0x15, 0x0a, 0x03, 0x04, 0x0b, 0x14, 0x1d, 0x21, + 0x20, 0x1c, 0x19, 0x17, 0x17, 0x16, 0x14, 0x0f, 0x0a, 0x02, 0xfd, 0xfa, + 0xf7, 0xf5, 0xf4, 0xf5, 0xfa, 0x01, 0x10, 0x21, 0x30, 0x35, 0x32, 0x24, + 0x15, 0x04, 0xfd, 0xfa, 0xfb, 0x00, 0x00, 0xff, 0xf9, 0xf3, 0xef, 0xeb, + 0xea, 0xe9, 0xe6, 0xe3, 0xe0, 0xda, 0xd8, 0xd5, 0xd5, 0xd4, 0xd7, 0xdb, + 0xe2, 0xef, 0x00, 0x12, 0x20, 0x26, 0x22, 0x19, 0x0c, 0x04, 0x02, 0x06, + 0x10, 0x19, 0x1f, 0x1f, 0x1d, 0x1a, 0x17, 0x17, 0x17, 0x15, 0x11, 0x0b, + 0x03, 0xff, 0xfa, 0xf7, 0xf5, 0xf5, 0xf5, 0xf9, 0x00, 0x0c, 0x1c, 0x2d, + 0x34, 0x34, 0x2a, 0x19, 0x09, 0xfe, 0xf8, 0xf9, 0xfd, 0x00, 0x01, 0xfb, + 0xf6, 0xf0, 0xed, 0xec, 0xea, 0xe8, 0xe5, 0xe1, 0xdd, 0xd9, 0xd8, 0xd6, + 0xd6, 0xd5, 0xd8, 0xde, 0xea, 0xfc, 0x0c, 0x1b, 0x24, 0x24, 0x1b, 0x10, + 0x05, 0x00, 0x03, 0x0b, 0x15, 0x1d, 0x20, 0x1e, 0x1b, 0x19, 0x17, 0x17, + 0x15, 0x14, 0x0e, 0x07, 0xff, 0xfb, 0xf9, 0xf6, 0xf5, 0xf5, 0xf6, 0xfc, + 0x07, 0x17, 0x27, 0x32, 0x35, 0x2d, 0x1e, 0x0d, 0x01, 0xf8, 0xf6, 0xfb, + 0x00, 0x01, 0xfe, 0xf8, 0xf2, 0xf0, 0xee, 0xed, 0xeb, 0xe9, 0xe4, 0xdf, + 0xdb, 0xd9, 0xd7, 0xd5, 0xd7, 0xd8, 0xdd, 0xe6, 0xf6, 0x06, 0x16, 0x23, + 0x25, 0x1e, 0x12, 0x06, 0x00, 0x00, 0x07, 0x11, 0x19, 0x1f, 0x1f, 0x1c, + 0x1a, 0x19, 0x17, 0x16, 0x14, 0x10, 0x09, 0x02, 0xff, 0xfa, 0xf5, 0xf5, + 0xf5, 0xf6, 0xfa, 0x01, 0x11, 0x20, 0x2e, 0x34, 0x30, 0x23, 0x13, 0x03, + 0xf9, 0xf6, 0xf8, 0xfd, 0x01, 0xff, 0xfc, 0xf4, 0xf1, 0xf0, 0xee, 0xed, + 0xea, 0xe6, 0xe2, 0xde, 0xda, 0xd8, 0xd7, 0xd8, 0xd9, 0xdd, 0xe3, 0xf0, + 0x00, 0x11, 0x1f, 0x24, 0x20, 0x14, 0x09, 0x00, 0x00, 0x02, 0x0c, 0x16, + 0x1b, 0x1e, 0x1c, 0x1a, 0x1a, 0x19, 0x17, 0x14, 0x10, 0x0b, 0x04, 0xfe, + 0xfb, 0xf8, 0xf4, 0xf5, 0xf5, 0xf9, 0xff, 0x0d, 0x1b, 0x2a, 0x34, 0x32, + 0x27, 0x17, 0x07, 0xfc, 0xf5, 0xf7, 0xfb, 0x00, 0x02, 0xfe, 0xf8, 0xf3, + 0xf1, 0xf0, 0xee, 0xec, 0xe9, 0xe4, 0xdf, 0xdb, 0xd8, 0xd8, 0xd9, 0xda, + 0xdc, 0xe1, 0xec, 0xfd, 0x0b, 0x1b, 0x23, 0x22, 0x18, 0x0c, 0x00, 0xfe, + 0xff, 0x08, 0x11, 0x1a, 0x1e, 0x1c, 0x1b, 0x19, 0x19, 0x18, 0x17, 0x13, + 0x0c, 0x05, 0xff, 0xfc, 0xf8, 0xf5, 0xf4, 0xf5, 0xf9, 0xff, 0x0a, 0x17, + 0x27, 0x31, 0x33, 0x2b, 0x1c, 0x0b, 0xfe, 0xf6, 0xf5, 0xf8, 0xfe, 0x01, + 0xff, 0xf9, 0xf5, 0xf1, 0xf1, 0xf0, 0xee, 0xeb, 0xe6, 0xe1, 0xdf, 0xdb, + 0xda, 0xda, 0xdb, 0xdc, 0xe0, 0xea, 0xf8, 0x08, 0x16, 0x21, 0x22, 0x18, + 0x0e, 0x02, 0xfe, 0xff, 0x04, 0x0c, 0x16, 0x1d, 0x1e, 0x1c, 0x1a, 0x18, + 0x18, 0x16, 0x14, 0x0f, 0x09, 0x01, 0xfc, 0xf9, 0xf6, 0xf5, 0xf5, 0xf8, + 0xfe, 0x05, 0x11, 0x21, 0x2e, 0x34, 0x2e, 0x21, 0x10, 0x02, 0xf7, 0xf5, + 0xf7, 0xfc, 0x00, 0xff, 0xfa, 0xf7, 0xf4, 0xf1, 0xf1, 0xf0, 0xee, 0xe8, + 0xe3, 0xe0, 0xdc, 0xdc, 0xdb, 0xdb, 0xde, 0xe1, 0xe9, 0xf5, 0x03, 0x13, + 0x1e, 0x21, 0x1c, 0x11, 0x04, 0xfe, 0xfc, 0xff, 0x08, 0x12, 0x1a, 0x1b, + 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x15, 0x10, 0x0a, 0x03, 0xfe, 0xf9, 0xf7, + 0xf6, 0xf6, 0xf6, 0xfc, 0x02, 0x0e, 0x1d, 0x2b, 0x31, 0x31, 0x27, 0x15, + 0x04, 0xf9, 0xf5, 0xf6, 0xfa, 0xfe, 0x00, 0xfe, 0xf9, 0xf4, 0xf1, 0xf1, + 0xf1, 0xef, 0xea, 0xe6, 0xe2, 0xde, 0xdc, 0xdd, 0xdd, 0xde, 0xe1, 0xe7, + 0xf1, 0x00, 0x0e, 0x1a, 0x21, 0x1d, 0x13, 0x05, 0xfd, 0xfa, 0xfc, 0x03, + 0x0f, 0x18, 0x1b, 0x1d, 0x1b, 0x19, 0x18, 0x18, 0x16, 0x12, 0x0d, 0x06, + 0xfe, 0xfa, 0xf8, 0xf6, 0xf6, 0xf6, 0xf9, 0xff, 0x09, 0x18, 0x26, 0x30, + 0x33, 0x2a, 0x1a, 0x08, 0xfc, 0xf3, 0xf3, 0xf8, 0xfe, 0x00, 0xff, 0xfb, + 0xf6, 0xf3, 0xf2, 0xf1, 0xef, 0xec, 0xe9, 0xe3, 0xe0, 0xdf, 0xde, 0xdf, + 0xe0, 0xe2, 0xe6, 0xee, 0xfc, 0x09, 0x17, 0x1e, 0x1f, 0x16, 0x09, 0x00, + 0xf9, 0xf9, 0xff, 0x0c, 0x15, 0x1a, 0x1d, 0x1d, 0x1a, 0x18, 0x18, 0x16, + 0x12, 0x0e, 0x07, 0x00, 0xfb, 0xf8, 0xf6, 0xf6, 0xf8, 0xf9, 0xfe, 0x06, + 0x15, 0x23, 0x2d, 0x32, 0x2d, 0x1f, 0x0d, 0xff, 0xf6, 0xf2, 0xf6, 0xfd, + 0x00, 0x00, 0xfd, 0xf9, 0xf4, 0xf3, 0xf2, 0xef, 0xec, 0xea, 0xe5, 0xe1, + 0xdf, 0xde, 0xdf, 0xe1, 0xe3, 0xe5, 0xec, 0xf8, 0x06, 0x13, 0x1d, 0x20, + 0x19, 0x0d, 0x01, 0xfa, 0xf7, 0xfd, 0x05, 0x11, 0x19, 0x1c, 0x1c, 0x1a, + 0x19, 0x19, 0x17, 0x13, 0x0f, 0x0a, 0x02, 0xfd, 0xf8, 0xf7, 0xf6, 0xf7, + 0xf9, 0xfc, 0x03, 0x10, 0x1d, 0x2a, 0x32, 0x2e, 0x23, 0x12, 0x03, 0xf7, + 0xf2, 0xf3, 0xfa, 0xff, 0x01, 0xfe, 0xfa, 0xf5, 0xf3, 0xf2, 0xf1, 0xed, + 0xec, 0xe8, 0xe4, 0xe1, 0xdf, 0xdf, 0xe1, 0xe5, 0xe6, 0xeb, 0xf4, 0x00, + 0x0e, 0x1b, 0x1f, 0x1c, 0x10, 0x02, 0xfa, 0xf6, 0xf8, 0x01, 0x0d, 0x17, + 0x1c, 0x1c, 0x1a, 0x19, 0x18, 0x18, 0x13, 0x11, 0x0b, 0x04, 0xfd, 0xfa, + 0xf7, 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x0b, 0x19, 0x26, 0x30, 0x31, 0x27, + 0x17, 0x08, 0xfb, 0xf3, 0xf4, 0xf8, 0xfe, 0x01, 0x00, 0xfb, 0xf8, 0xf4, + 0xf2, 0xf1, 0xef, 0xee, 0xea, 0xe7, 0xe3, 0xe2, 0xe1, 0xe2, 0xe4, 0xe6, + 0xea, 0xf2, 0xfe, 0x09, 0x16, 0x1e, 0x1c, 0x13, 0x06, 0xfb, 0xf5, 0xf5, + 0xfd, 0x08, 0x13, 0x1c, 0x1c, 0x1c, 0x1a, 0x19, 0x17, 0x15, 0x11, 0x0c, + 0x05, 0xfe, 0xfa, 0xf8, 0xf6, 0xf6, 0xf9, 0xf9, 0xfe, 0x07, 0x14, 0x22, + 0x2f, 0x32, 0x2b, 0x1e, 0x0d, 0xfe, 0xf5, 0xf2, 0xf6, 0xfc, 0x01, 0x02, + 0xff, 0xf9, 0xf5, 0xf2, 0xf1, 0xf0, 0xee, 0xeb, 0xe8, 0xe5, 0xe3, 0xe3, + 0xe4, 0xe5, 0xe8, 0xea, 0xf0, 0xfb, 0x05, 0x12, 0x1c, 0x1c, 0x15, 0x08, + 0xfd, 0xf6, 0xf4, 0xf9, 0x02, 0x10, 0x1a, 0x1d, 0x1d, 0x1b, 0x19, 0x18, + 0x16, 0x13, 0x0e, 0x06, 0x00, 0xfc, 0xf7, 0xf5, 0xf6, 0xf7, 0xf9, 0xfd, + 0x03, 0x0f, 0x1e, 0x2b, 0x31, 0x2e, 0x22, 0x13, 0x03, 0xf7, 0xf2, 0xf4, + 0xf9, 0xff, 0x01, 0xff, 0xfb, 0xf8, 0xf4, 0xf2, 0xf1, 0xef, 0xec, 0xe9, + 0xe6, 0xe5, 0xe3, 0xe5, 0xe6, 0xe7, 0xeb, 0xf0, 0xf7, 0x00, 0x0d, 0x18, + 0x1c, 0x18, 0x0e, 0x00, 0xf7, 0xf2, 0xf4, 0xfd, 0x0b, 0x18, 0x1c, 0x1d, + 0x1c, 0x1b, 0x18, 0x17, 0x13, 0x10, 0x09, 0x02, 0xfd, 0xf9, 0xf5, 0xf5, + 0xf7, 0xf9, 0xfb, 0x00, 0x09, 0x18, 0x28, 0x31, 0x32, 0x28, 0x18, 0x06, + 0xf9, 0xf2, 0xf3, 0xf7, 0xfe, 0x01, 0x00, 0xfd, 0xfa, 0xf5, 0xf3, 0xf1, + 0xef, 0xee, 0xeb, 0xe9, 0xe6, 0xe5, 0xe5, 0xe6, 0xe8, 0xe9, 0xed, 0xf5, + 0x00, 0x0a, 0x15, 0x1b, 0x19, 0x0f, 0x03, 0xf7, 0xf1, 0xf3, 0xfa, 0x06, + 0x12, 0x1b, 0x1e, 0x1d, 0x1b, 0x18, 0x16, 0x16, 0x11, 0x0a, 0x03, 0xfd, + 0xf9, 0xf5, 0xf5, 0xf6, 0xf8, 0xfa, 0xfe, 0x06, 0x13, 0x22, 0x2e, 0x32, + 0x2a, 0x1e, 0x0a, 0xfe, 0xf3, 0xf2, 0xf6, 0xfd, 0x01, 0x01, 0xff, 0xfc, + 0xf6, 0xf4, 0xf2, 0xef, 0xee, 0xec, 0xe9, 0xe7, 0xe6, 0xe6, 0xe7, 0xe9, + 0xea, 0xed, 0xf2, 0xfc, 0x05, 0x12, 0x1a, 0x1a, 0x13, 0x07, 0xfa, 0xf2, + 0xf0, 0xf7, 0x00, 0x0f, 0x19, 0x1d, 0x1e, 0x1c, 0x1a, 0x17, 0x14, 0x11, + 0x0b, 0x06, 0xff, 0xf9, 0xf6, 0xf5, 0xf6, 0xf6, 0xfa, 0xfd, 0x03, 0x0f, + 0x1d, 0x29, 0x30, 0x2e, 0x23, 0x12, 0x01, 0xf5, 0xf1, 0xf4, 0xfb, 0x01, + 0x02, 0x01, 0xfc, 0xf8, 0xf5, 0xf2, 0xf0, 0xef, 0xec, 0xea, 0xe7, 0xe6, + 0xe7, 0xe8, 0xe8, 0xea, 0xec, 0xf1, 0xf7, 0x03, 0x0e, 0x18, 0x1c, 0x16, + 0x0a, 0xfe, 0xf4, 0xf0, 0xf3, 0xfc, 0x09, 0x16, 0x1b, 0x20, 0x1c, 0x1b, + 0x17, 0x15, 0x12, 0x0e, 0x07, 0x01, 0xfb, 0xf7, 0xf5, 0xf6, 0xf6, 0xf9, + 0xfc, 0x01, 0x0a, 0x18, 0x25, 0x2f, 0x31, 0x28, 0x17, 0x06, 0xf9, 0xf2, + 0xf3, 0xf8, 0xff, 0x02, 0x02, 0xfe, 0xfa, 0xf5, 0xf3, 0xf1, 0xf0, 0xee, + 0xec, 0xe8, 0xe7, 0xe7, 0xe8, 0xea, 0xec, 0xec, 0xef, 0xf5, 0x00, 0x0a, + 0x15, 0x1b, 0x18, 0x0d, 0x01, 0xf6, 0xf0, 0xf1, 0xf9, 0x06, 0x12, 0x1b, + 0x1e, 0x1e, 0x1b, 0x1a, 0x16, 0x11, 0x0d, 0x09, 0x02, 0xfd, 0xf9, 0xf5, + 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x07, 0x13, 0x21, 0x2e, 0x31, 0x2b, 0x1e, + 0x0d, 0xfd, 0xf2, 0xf2, 0xf6, 0xfd, 0x02, 0x03, 0x00, 0xfb, 0xf6, 0xf3, + 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe7, 0xe8, 0xeb, 0xed, 0xed, 0xef, + 0xf4, 0xfd, 0x08, 0x12, 0x19, 0x1a, 0x11, 0x05, 0xfa, 0xf1, 0xef, 0xf6, + 0x00, 0x0e, 0x19, 0x1e, 0x1f, 0x1c, 0x1a, 0x17, 0x12, 0x0f, 0x09, 0x04, + 0xfd, 0xfa, 0xf6, 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x04, 0x10, 0x1d, 0x29, + 0x30, 0x2e, 0x22, 0x12, 0x02, 0xf4, 0xf0, 0xf4, 0xfa, 0x00, 0x04, 0x02, + 0xfd, 0xf8, 0xf5, 0xf3, 0xf2, 0xf0, 0xed, 0xea, 0xe8, 0xe8, 0xe9, 0xea, + 0xec, 0xed, 0xee, 0xf2, 0xfb, 0x02, 0x0e, 0x18, 0x1b, 0x15, 0x0a, 0xfe, + 0xf3, 0xf0, 0xf3, 0xfb, 0x09, 0x15, 0x1c, 0x1e, 0x1c, 0x1a, 0x17, 0x14, + 0x0f, 0x0b, 0x05, 0xfe, 0xfa, 0xf6, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x02, + 0x0c, 0x17, 0x25, 0x2e, 0x2f, 0x26, 0x18, 0x05, 0xf9, 0xf2, 0xf3, 0xf7, + 0xff, 0x02, 0x03, 0xfe, 0xf9, 0xf5, 0xf3, 0xf2, 0xf2, 0xef, 0xeb, 0xea, + 0xe9, 0xe9, 0xeb, 0xed, 0xee, 0xf0, 0xf2, 0xf7, 0x00, 0x0b, 0x15, 0x1a, + 0x17, 0x0d, 0x01, 0xf4, 0xf0, 0xf1, 0xfb, 0x05, 0x13, 0x1a, 0x1d, 0x1d, + 0x1b, 0x19, 0x15, 0x11, 0x0c, 0x06, 0x00, 0xfd, 0xf7, 0xf4, 0xf4, 0xf6, + 0xf9, 0xfb, 0xff, 0x07, 0x12, 0x21, 0x2c, 0x30, 0x29, 0x1d, 0x0b, 0xfc, + 0xf3, 0xf2, 0xf5, 0xfc, 0x02, 0x03, 0x00, 0xfc, 0xf7, 0xf3, 0xf2, 0xf2, + 0xf0, 0xed, 0xea, 0xe9, 0xe9, 0xea, 0xee, 0xef, 0xf0, 0xf2, 0xf6, 0xfd, + 0x06, 0x12, 0x19, 0x1a, 0x12, 0x06, 0xf9, 0xf2, 0xf0, 0xf6, 0x00, 0x0d, + 0x18, 0x1d, 0x1d, 0x1c, 0x19, 0x15, 0x11, 0x0e, 0x08, 0x02, 0xfd, 0xf8, + 0xf5, 0xf4, 0xf5, 0xf7, 0xfa, 0xff, 0x04, 0x0e, 0x1b, 0x28, 0x2f, 0x2d, + 0x23, 0x10, 0x02, 0xf5, 0xf1, 0xf5, 0xf9, 0x01, 0x04, 0x01, 0xfd, 0xf7, + 0xf3, 0xf2, 0xf2, 0xf0, 0xed, 0xeb, 0xea, 0xe9, 0xeb, 0xed, 0xf0, 0xf1, + 0xf2, 0xf4, 0xfb, 0x03, 0x0f, 0x18, 0x19, 0x15, 0x09, 0xfc, 0xf3, 0xef, + 0xf2, 0xfc, 0x09, 0x15, 0x1c, 0x1d, 0x1c, 0x19, 0x16, 0x13, 0x0f, 0x0a, + 0x03, 0xfd, 0xf9, 0xf5, 0xf4, 0xf4, 0xf6, 0xf9, 0xfd, 0x01, 0x0a, 0x17, + 0x24, 0x2e, 0x2e, 0x26, 0x17, 0x05, 0xf9, 0xf3, 0xf2, 0xf8, 0xff, 0x03, + 0x02, 0xfe, 0xf9, 0xf5, 0xf3, 0xf3, 0xf2, 0xef, 0xed, 0xeb, 0xea, 0xea, + 0xed, 0xf0, 0xf1, 0xf2, 0xf4, 0xf9, 0x00, 0x0a, 0x14, 0x1a, 0x18, 0x0e, + 0x01, 0xf5, 0xf0, 0xf1, 0xf9, 0x05, 0x12, 0x1a, 0x1d, 0x1c, 0x1a, 0x17, + 0x14, 0x10, 0x0c, 0x05, 0xff, 0xfb, 0xf7, 0xf5, 0xf5, 0xf5, 0xf6, 0xfb, + 0xff, 0x06, 0x12, 0x20, 0x2a, 0x2f, 0x2a, 0x1c, 0x0c, 0xff, 0xf5, 0xf3, + 0xf6, 0xfc, 0x02, 0x03, 0x00, 0xfb, 0xf6, 0xf2, 0xf2, 0xf2, 0xf1, 0xee, + 0xec, 0xeb, 0xea, 0xee, 0xef, 0xf2, 0xf4, 0xf4, 0xf6, 0xfe, 0x06, 0x12, + 0x19, 0x1a, 0x11, 0x05, 0xf8, 0xf0, 0xef, 0xf5, 0x01, 0x0e, 0x17, 0x1d, + 0x1e, 0x1a, 0x17, 0x15, 0x11, 0x0e, 0x07, 0x01, 0xfc, 0xf8, 0xf4, 0xf4, + 0xf4, 0xf6, 0xf8, 0xfd, 0x02, 0x0d, 0x1b, 0x27, 0x2f, 0x2d, 0x22, 0x12, + 0x04, 0xf7, 0xf3, 0xf4, 0xf9, 0xff, 0x03, 0x02, 0xfd, 0xf6, 0xf3, 0xf2, + 0xf1, 0xf1, 0xf0, 0xee, 0xed, 0xec, 0xed, 0xef, 0xf1, 0xf4, 0xf4, 0xf6, + 0xfc, 0x02, 0x0d, 0x16, 0x1a, 0x14, 0x08, 0xfc, 0xf3, 0xf0, 0xf2, 0xfc, + 0x0a, 0x15, 0x1b, 0x1e, 0x1b, 0x18, 0x15, 0x12, 0x0e, 0x09, 0x03, 0xfc, + 0xf7, 0xf4, 0xf4, 0xf4, 0xf6, 0xf6, 0xfb, 0xff, 0x09, 0x16, 0x23, 0x2d, + 0x2f, 0x27, 0x17, 0x08, 0xfb, 0xf5, 0xf4, 0xf8, 0xfe, 0x01, 0x02, 0xfd, + 0xf8, 0xf4, 0xf2, 0xf1, 0xf1, 0xf1, 0xf0, 0xed, 0xee, 0xee, 0xef, 0xf1, + 0xf3, 0xf4, 0xf5, 0xfa, 0x01, 0x0a, 0x13, 0x1a, 0x17, 0x0d, 0x02, 0xf5, + 0xf0, 0xf1, 0xf9, 0x05, 0x12, 0x19, 0x1d, 0x1b, 0x19, 0x15, 0x13, 0x10, + 0x0b, 0x05, 0xff, 0xf9, 0xf7, 0xf4, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, 0x04, + 0x0f, 0x1e, 0x2a, 0x2f, 0x2a, 0x1d, 0x0c, 0xff, 0xf5, 0xf4, 0xf8, 0xfb, + 0x01, 0x02, 0xff, 0xfa, 0xf4, 0xf2, 0xf1, 0xf1, 0xf1, 0xef, 0xed, 0xed, + 0xed, 0xef, 0xf2, 0xf4, 0xf4, 0xf4, 0xf8, 0xfe, 0x06, 0x11, 0x19, 0x1a, + 0x12, 0x07, 0xfa, 0xf2, 0xf0, 0xf7, 0x00, 0x0d, 0x18, 0x1c, 0x1d, 0x1a, + 0x18, 0x13, 0x11, 0x0e, 0x07, 0x01, 0xfc, 0xf7, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf7, 0xfb, 0x00, 0x0b, 0x18, 0x26, 0x2e, 0x2c, 0x22, 0x12, 0x03, 0xf8, + 0xf5, 0xf6, 0xfa, 0x00, 0x01, 0x00, 0xfb, 0xf7, 0xf3, 0xf2, 0xf2, 0xf1, + 0xef, 0xee, 0xee, 0xed, 0xf0, 0xf1, 0xf3, 0xf5, 0xf5, 0xf7, 0xfa, 0x03, + 0x0d, 0x16, 0x1b, 0x15, 0x0c, 0xff, 0xf4, 0xf0, 0xf3, 0xfc, 0x09, 0x16, + 0x1c, 0x1d, 0x1b, 0x18, 0x15, 0x12, 0x0f, 0x09, 0x04, 0xfc, 0xf8, 0xf3, + 0xf3, 0xf2, 0xf3, 0xf5, 0xf7, 0xfd, 0x04, 0x12, 0x22, 0x2c, 0x2e, 0x28, + 0x1a, 0x09, 0xfd, 0xf6, 0xf5, 0xfa, 0xff, 0x02, 0x00, 0xfe, 0xf8, 0xf3, + 0xf2, 0xf0, 0xf1, 0xef, 0xee, 0xee, 0xed, 0xee, 0xf0, 0xf3, 0xf4, 0xf5, + 0xf6, 0xf9, 0x01, 0x09, 0x14, 0x19, 0x18, 0x0f, 0x04, 0xf8, 0xf1, 0xf2, + 0xf9, 0x04, 0x11, 0x19, 0x1c, 0x1b, 0x19, 0x15, 0x12, 0x0f, 0x0b, 0x05, + 0xfe, 0xfa, 0xf6, 0xf2, 0xf3, 0xf3, 0xf4, 0xf6, 0xfa, 0x00, 0x0d, 0x1b, + 0x28, 0x2f, 0x2b, 0x1e, 0x0f, 0x01, 0xf8, 0xf6, 0xf8, 0xfe, 0x02, 0x03, + 0xff, 0xfb, 0xf5, 0xf1, 0xf1, 0xf0, 0xf0, 0xee, 0xef, 0xee, 0xee, 0xf1, + 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xfe, 0x06, 0x11, 0x19, 0x1a, 0x13, 0x08, + 0xfb, 0xf2, 0xf0, 0xf7, 0x00, 0x0c, 0x17, 0x1b, 0x1d, 0x1a, 0x17, 0x14, + 0x11, 0x0d, 0x07, 0x01, 0xfc, 0xf7, 0xf3, 0xf3, 0xf2, 0xf2, 0xf4, 0xf7, + 0xfe, 0x07, 0x15, 0x24, 0x2d, 0x2d, 0x24, 0x14, 0x06, 0xfa, 0xf6, 0xf8, + 0xfd, 0x01, 0x02, 0x00, 0xfb, 0xf6, 0xf2, 0xf1, 0xf1, 0xf0, 0xef, 0xee, + 0xee, 0xef, 0xf1, 0xf2, 0xf4, 0xf5, 0xf5, 0xf7, 0xfb, 0x03, 0x0e, 0x17, + 0x1b, 0x16, 0x0c, 0xff, 0xf5, 0xf0, 0xf4, 0xfb, 0x09, 0x14, 0x19, 0x1c, + 0x1b, 0x18, 0x14, 0x12, 0x0e, 0x0a, 0x05, 0xfd, 0xf9, 0xf4, 0xf2, 0xf2, + 0xf1, 0xf2, 0xf5, 0xfa, 0x01, 0x0f, 0x1d, 0x29, 0x2e, 0x28, 0x1b, 0x0b, + 0xff, 0xf8, 0xf7, 0xfc, 0x00, 0x03, 0x02, 0xfd, 0xf7, 0xf3, 0xf2, 0xf0, + 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xf0, 0xf3, 0xf4, 0xf5, 0xf6, 0xf6, 0xfa, + 0x02, 0x0a, 0x15, 0x1b, 0x19, 0x10, 0x05, 0xf8, 0xf2, 0xf2, 0xf8, 0x03, + 0x0f, 0x17, 0x1c, 0x1c, 0x19, 0x15, 0x13, 0x0f, 0x0b, 0x06, 0x00, 0xfb, + 0xf6, 0xf3, 0xf1, 0xf0, 0xf1, 0xf2, 0xf6, 0xff, 0x09, 0x18, 0x26, 0x2d, + 0x2b, 0x20, 0x10, 0x04, 0xf9, 0xf7, 0xfb, 0xff, 0x03, 0x03, 0x00, 0xfa, + 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xef, 0xf0, 0xf3, 0xf4, + 0xf5, 0xf5, 0xf7, 0xfe, 0x06, 0x11, 0x19, 0x1b, 0x15, 0x09, 0xfc, 0xf3, + 0xf0, 0xf6, 0xff, 0x0b, 0x16, 0x1a, 0x1b, 0x19, 0x17, 0x14, 0x11, 0x0e, + 0x09, 0x02, 0xfc, 0xf7, 0xf4, 0xf1, 0xf0, 0xf0, 0xf1, 0xf3, 0xfb, 0x03, + 0x11, 0x20, 0x2a, 0x2c, 0x24, 0x17, 0x08, 0xfc, 0xf8, 0xfa, 0xff, 0x02, + 0x04, 0x02, 0xfc, 0xf7, 0xf4, 0xf1, 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xef, + 0xf0, 0xf1, 0xf3, 0xf5, 0xf5, 0xf7, 0xfb, 0x03, 0x0e, 0x18, 0x1c, 0x18, + 0x0c, 0x01, 0xf6, 0xf0, 0xf3, 0xfb, 0x07, 0x13, 0x19, 0x1c, 0x19, 0x18, + 0x15, 0x13, 0x0f, 0x0b, 0x06, 0xff, 0xfa, 0xf6, 0xf2, 0xf2, 0xf0, 0xf0, + 0xf1, 0xf5, 0xff, 0x0c, 0x1b, 0x28, 0x2c, 0x27, 0x1b, 0x0c, 0x00, 0xf9, + 0xf9, 0xfd, 0x01, 0x04, 0x03, 0xfe, 0xf9, 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, + 0xee, 0xee, 0xef, 0xef, 0xf3, 0xf4, 0xf5, 0xf5, 0xf6, 0xf9, 0x01, 0x0a, + 0x15, 0x1c, 0x1b, 0x13, 0x06, 0xf9, 0xf2, 0xf2, 0xf7, 0x02, 0x0e, 0x17, + 0x1c, 0x1a, 0x19, 0x16, 0x13, 0x10, 0x0d, 0x07, 0x02, 0xfc, 0xf7, 0xf3, + 0xf2, 0xf0, 0xf0, 0xf0, 0xf5, 0xfc, 0x05, 0x14, 0x23, 0x2a, 0x29, 0x20, + 0x11, 0x04, 0xfb, 0xfa, 0xfc, 0x01, 0x04, 0x05, 0x01, 0xfb, 0xf6, 0xf2, + 0xf0, 0xf2, 0xf0, 0xed, 0xed, 0xed, 0xef, 0xf0, 0xf3, 0xf4, 0xf5, 0xf5, + 0xf7, 0xfd, 0x06, 0x12, 0x1b, 0x1d, 0x16, 0x0b, 0xfd, 0xf5, 0xf1, 0xf6, + 0xfe, 0x0b, 0x14, 0x19, 0x1a, 0x18, 0x16, 0x14, 0x11, 0x0f, 0x0a, 0x04, + 0xfe, 0xfa, 0xf6, 0xf3, 0xf2, 0xf0, 0xef, 0xf2, 0xf8, 0x01, 0x0f, 0x1d, + 0x27, 0x29, 0x24, 0x17, 0x08, 0xfe, 0xf9, 0xfa, 0xff, 0x03, 0x05, 0x04, + 0xfd, 0xf7, 0xf3, 0xf1, 0xf0, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xee, 0xf1, + 0xf3, 0xf4, 0xf4, 0xf7, 0xfc, 0x03, 0x0f, 0x1a, 0x1d, 0x19, 0x0f, 0x03, + 0xf8, 0xf3, 0xf4, 0xfa, 0x07, 0x12, 0x17, 0x19, 0x19, 0x17, 0x14, 0x13, + 0x10, 0x0c, 0x06, 0x01, 0xfd, 0xf8, 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, 0xf4, + 0xfd, 0x09, 0x18, 0x24, 0x29, 0x26, 0x1a, 0x0d, 0x01, 0xfa, 0xfa, 0xfe, + 0x03, 0x05, 0x06, 0x00, 0xfa, 0xf6, 0xf3, 0xf2, 0xf1, 0xef, 0xef, 0xec, + 0xec, 0xed, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf9, 0x01, 0x0c, 0x16, 0x1d, + 0x1d, 0x14, 0x09, 0xfb, 0xf4, 0xf4, 0xf7, 0x01, 0x0d, 0x15, 0x18, 0x18, + 0x16, 0x14, 0x13, 0x11, 0x0d, 0x08, 0x04, 0xff, 0xfa, 0xf7, 0xf4, 0xf2, + 0xef, 0xf0, 0xf1, 0xf8, 0x03, 0x11, 0x1f, 0x27, 0x26, 0x1d, 0x10, 0x04, + 0xfc, 0xfa, 0xfd, 0x02, 0x06, 0x06, 0x03, 0xfd, 0xf7, 0xf3, 0xf2, 0xf0, + 0xef, 0xee, 0xec, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf3, 0xf5, 0xf7, 0xfe, + 0x07, 0x14, 0x1c, 0x1f, 0x1a, 0x0e, 0x00, 0xf8, 0xf2, 0xf5, 0xff, 0x0a, + 0x13, 0x16, 0x18, 0x16, 0x14, 0x13, 0x12, 0x0f, 0x0c, 0x07, 0x00, 0xfd, + 0xf9, 0xf4, 0xf2, 0xf0, 0xee, 0xef, 0xf4, 0xfe, 0x0c, 0x1a, 0x25, 0x26, + 0x21, 0x14, 0x08, 0xfe, 0xf9, 0xfc, 0x01, 0x04, 0x06, 0x06, 0x01, 0xf9, + 0xf6, 0xf2, 0xf1, 0xf0, 0xef, 0xed, 0xeb, 0xec, 0xed, 0xee, 0xf0, 0xf2, + 0xf3, 0xf5, 0xfc, 0x03, 0x10, 0x1a, 0x20, 0x1d, 0x13, 0x06, 0xf9, 0xf5, + 0xf6, 0xfc, 0x07, 0x10, 0x16, 0x17, 0x16, 0x14, 0x12, 0x11, 0x10, 0x0e, + 0x09, 0x03, 0xff, 0xfa, 0xf8, 0xf4, 0xf2, 0xef, 0xee, 0xf2, 0xfb, 0x06, + 0x14, 0x20, 0x25, 0x21, 0x17, 0x0c, 0x00, 0xfb, 0xfa, 0x00, 0x04, 0x06, + 0x06, 0x03, 0xfc, 0xf8, 0xf3, 0xf2, 0xf0, 0xee, 0xed, 0xeb, 0xeb, 0xec, + 0xed, 0xef, 0xf0, 0xf1, 0xf3, 0xfa, 0x01, 0x0c, 0x17, 0x20, 0x20, 0x18, + 0x0c, 0xff, 0xf6, 0xf4, 0xf9, 0x03, 0x0c, 0x14, 0x16, 0x16, 0x14, 0x12, + 0x11, 0x10, 0x0e, 0x0b, 0x04, 0x00, 0xfd, 0xf9, 0xf6, 0xf4, 0xf0, 0xee, + 0xef, 0xf7, 0x01, 0x0f, 0x1c, 0x24, 0x23, 0x1a, 0x0f, 0x03, 0xfb, 0xf9, + 0xfe, 0x03, 0x08, 0x08, 0x06, 0x00, 0xfb, 0xf5, 0xf1, 0xf1, 0xf0, 0xee, + 0xec, 0xeb, 0xeb, 0xec, 0xee, 0xf0, 0xf0, 0xf2, 0xf6, 0xff, 0x08, 0x14, + 0x1f, 0x21, 0x1c, 0x11, 0x04, 0xf9, 0xf5, 0xf6, 0xfe, 0x09, 0x13, 0x16, + 0x16, 0x14, 0x12, 0x11, 0x10, 0x0f, 0x0c, 0x07, 0x01, 0xfe, 0xfa, 0xf7, + 0xf3, 0xf1, 0xef, 0xef, 0xf2, 0xfc, 0x08, 0x16, 0x21, 0x24, 0x1e, 0x13, + 0x07, 0xfd, 0xfa, 0xfd, 0x02, 0x07, 0x09, 0x06, 0x01, 0xfd, 0xf8, 0xf3, + 0xf1, 0xef, 0xee, 0xec, 0xea, 0xea, 0xea, 0xed, 0xef, 0xf0, 0xf1, 0xf5, + 0xfc, 0x04, 0x11, 0x1c, 0x21, 0x1f, 0x15, 0x09, 0xfc, 0xf5, 0xf6, 0xfb, + 0x07, 0x11, 0x15, 0x16, 0x15, 0x14, 0x11, 0x10, 0x0f, 0x0d, 0x09, 0x03, + 0x00, 0xfb, 0xf8, 0xf5, 0xf3, 0xf0, 0xee, 0xf1, 0xf9, 0x05, 0x11, 0x1c, + 0x22, 0x1f, 0x17, 0x0a, 0xff, 0xf9, 0xfb, 0x01, 0x06, 0x0a, 0x09, 0x04, + 0xff, 0xfc, 0xf6, 0xf2, 0xef, 0xed, 0xeb, 0xe9, 0xe8, 0xe8, 0xeb, 0xed, + 0xef, 0xf0, 0xf3, 0xf9, 0x00, 0x0d, 0x19, 0x20, 0x21, 0x1a, 0x0e, 0x01, + 0xf8, 0xf5, 0xf8, 0x02, 0x0e, 0x14, 0x17, 0x16, 0x15, 0x12, 0x10, 0x0f, + 0x0f, 0x0b, 0x06, 0x00, 0xfb, 0xf8, 0xf7, 0xf3, 0xf1, 0xef, 0xef, 0xf5, + 0xff, 0x0d, 0x1a, 0x21, 0x21, 0x19, 0x0d, 0x02, 0xfb, 0xfa, 0xfe, 0x06, + 0x0a, 0x0a, 0x06, 0x02, 0xfd, 0xf8, 0xf3, 0xf0, 0xed, 0xeb, 0xe9, 0xe7, + 0xe7, 0xe9, 0xeb, 0xed, 0xee, 0xf2, 0xf7, 0xff, 0x0a, 0x16, 0x1f, 0x23, + 0x1e, 0x13, 0x05, 0xfb, 0xf5, 0xf6, 0xff, 0x0b, 0x12, 0x16, 0x17, 0x15, + 0x13, 0x11, 0x10, 0x0f, 0x0c, 0x08, 0x03, 0xff, 0xfa, 0xf7, 0xf5, 0xf2, + 0xf1, 0xef, 0xf3, 0xfb, 0x07, 0x14, 0x1e, 0x21, 0x1b, 0x10, 0x05, 0xfd, + 0xf9, 0xfd, 0x05, 0x0a, 0x0b, 0x09, 0x03, 0xff, 0xfa, 0xf6, 0xf2, 0xef, + 0xec, 0xe9, 0xe7, 0xe6, 0xe7, 0xea, 0xec, 0xef, 0xf1, 0xf4, 0xfc, 0x04, + 0x12, 0x1d, 0x23, 0x20, 0x17, 0x0b, 0xfe, 0xf7, 0xf6, 0xfc, 0x07, 0x11, + 0x15, 0x17, 0x15, 0x13, 0x11, 0x10, 0x0e, 0x0c, 0x09, 0x04, 0x00, 0xfc, + 0xf9, 0xf6, 0xf4, 0xf3, 0xf0, 0xf1, 0xf7, 0x02, 0x0f, 0x1b, 0x22, 0x1e, + 0x16, 0x09, 0xff, 0xf9, 0xfa, 0x01, 0x08, 0x0b, 0x0b, 0x05, 0x00, 0xfa, + 0xf7, 0xf3, 0xee, 0xec, 0xea, 0xe7, 0xe6, 0xe7, 0xe9, 0xec, 0xef, 0xf1, + 0xf3, 0xf9, 0x00, 0x0e, 0x1b, 0x22, 0x23, 0x1b, 0x0e, 0x02, 0xfa, 0xf7, + 0xf9, 0x03, 0x0d, 0x14, 0x17, 0x16, 0x13, 0x11, 0x10, 0x0f, 0x0d, 0x0a, + 0x05, 0x01, 0xfd, 0xf9, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0xf5, 0xfe, 0x0b, + 0x17, 0x20, 0x1f, 0x19, 0x0d, 0x01, 0xfa, 0xf9, 0xff, 0x06, 0x0b, 0x0c, + 0x07, 0x00, 0xfb, 0xf7, 0xf3, 0xf0, 0xec, 0xe9, 0xe7, 0xe6, 0xe7, 0xe8, + 0xeb, 0xed, 0xf0, 0xf2, 0xf6, 0x00, 0x0a, 0x16, 0x21, 0x24, 0x1e, 0x11, + 0x07, 0xfd, 0xf7, 0xf7, 0x00, 0x0b, 0x13, 0x17, 0x17, 0x15, 0x12, 0x10, + 0x0f, 0x0e, 0x0b, 0x07, 0x02, 0x00, 0xfc, 0xf8, 0xf5, 0xf3, 0xf1, 0xf1, + 0xf4, 0xfa, 0x06, 0x13, 0x1f, 0x21, 0x1c, 0x11, 0x04, 0xfc, 0xfa, 0xfd, + 0x04, 0x09, 0x0c, 0x0a, 0x03, 0xfc, 0xf7, 0xf3, 0xf0, 0xee, 0xea, 0xe8, + 0xe6, 0xe6, 0xe8, 0xea, 0xed, 0xef, 0xf1, 0xf4, 0xfc, 0x05, 0x12, 0x1e, + 0x24, 0x21, 0x17, 0x0a, 0xfe, 0xf9, 0xf8, 0xfe, 0x08, 0x10, 0x17, 0x17, + 0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf9, 0xf6, + 0xf5, 0xf2, 0xf1, 0xf3, 0xf8, 0x02, 0x0e, 0x1b, 0x21, 0x1e, 0x15, 0x09, + 0xfe, 0xfa, 0xfa, 0x01, 0x08, 0x0c, 0x0c, 0x05, 0xfe, 0xf7, 0xf3, 0xf0, + 0xee, 0xeb, 0xe8, 0xe6, 0xe6, 0xe6, 0xe9, 0xeb, 0xee, 0xf1, 0xf3, 0xf9, + 0x00, 0x0d, 0x1b, 0x24, 0x23, 0x1b, 0x0e, 0x02, 0xfb, 0xf8, 0xfb, 0x04, + 0x0e, 0x15, 0x19, 0x16, 0x13, 0x11, 0x0f, 0x0d, 0x0c, 0x08, 0x04, 0x01, + 0xfe, 0xfa, 0xf7, 0xf5, 0xf3, 0xf1, 0xf2, 0xf6, 0xfe, 0x0a, 0x18, 0x20, + 0x1f, 0x18, 0x0e, 0x01, 0xfb, 0xfa, 0xff, 0x07, 0x0c, 0x0e, 0x08, 0x02, + 0xfa, 0xf3, 0xf0, 0xee, 0xea, 0xe8, 0xe6, 0xe5, 0xe5, 0xe8, 0xeb, 0xee, + 0xf0, 0xf3, 0xf8, 0xff, 0x09, 0x17, 0x21, 0x24, 0x1f, 0x13, 0x06, 0xfc, + 0xf9, 0xfa, 0x02, 0x0b, 0x12, 0x17, 0x17, 0x15, 0x12, 0x0f, 0x0d, 0x0c, + 0x0a, 0x06, 0x02, 0xff, 0xfc, 0xf9, 0xf6, 0xf4, 0xf2, 0xf2, 0xf4, 0xfb, + 0x06, 0x12, 0x1e, 0x21, 0x1e, 0x12, 0x06, 0xfd, 0xfa, 0xfd, 0x05, 0x0b, + 0x0d, 0x09, 0x03, 0xfc, 0xf5, 0xef, 0xec, 0xea, 0xe7, 0xe4, 0xe4, 0xe5, + 0xe5, 0xea, 0xed, 0xef, 0xf2, 0xf6, 0xfd, 0x04, 0x12, 0x1d, 0x23, 0x21, + 0x18, 0x0a, 0xff, 0xf9, 0xf9, 0xfe, 0x0a, 0x11, 0x16, 0x18, 0x16, 0x12, + 0x11, 0x0e, 0x0c, 0x0b, 0x07, 0x03, 0xff, 0xfc, 0xfa, 0xf8, 0xf5, 0xf2, + 0xf2, 0xf3, 0xf8, 0x03, 0x0f, 0x1a, 0x20, 0x20, 0x17, 0x0c, 0x01, 0xfb, + 0xfc, 0x02, 0x09, 0x0c, 0x0b, 0x05, 0xfe, 0xf6, 0xf0, 0xec, 0xea, 0xe7, + 0xe4, 0xe4, 0xe3, 0xe5, 0xe9, 0xec, 0xef, 0xf2, 0xf5, 0xfa, 0x01, 0x0d, + 0x1a, 0x21, 0x22, 0x1c, 0x10, 0x02, 0xfc, 0xf8, 0xfd, 0x06, 0x0f, 0x16, + 0x18, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x09, 0x08, 0x04, 0x00, 0xfd, 0xfb, + 0xf9, 0xf7, 0xf4, 0xf2, 0xf2, 0xf6, 0xff, 0x0b, 0x16, 0x1f, 0x20, 0x1a, + 0x0f, 0x03, 0xfe, 0xfc, 0x00, 0x09, 0x0d, 0x0d, 0x08, 0x00, 0xf8, 0xf0, + 0xeb, 0xe9, 0xe7, 0xe6, 0xe4, 0xe2, 0xe4, 0xe7, 0xeb, 0xed, 0xf1, 0xf4, + 0xf8, 0x00, 0x0a, 0x16, 0x21, 0x24, 0x20, 0x14, 0x07, 0xff, 0xf9, 0xfa, + 0x02, 0x0d, 0x15, 0x19, 0x18, 0x14, 0x11, 0x0d, 0x0b, 0x09, 0x09, 0x06, + 0x02, 0xff, 0xfc, 0xf9, 0xf8, 0xf5, 0xf4, 0xf3, 0xf4, 0xfb, 0x07, 0x12, + 0x1d, 0x20, 0x1d, 0x12, 0x06, 0xff, 0xfc, 0x00, 0x06, 0x0c, 0x0d, 0x0a, + 0x03, 0xf9, 0xf1, 0xec, 0xe8, 0xe6, 0xe5, 0xe2, 0xe1, 0xe2, 0xe4, 0xe9, + 0xee, 0xf1, 0xf2, 0xf6, 0xfd, 0x05, 0x13, 0x1d, 0x24, 0x22, 0x19, 0x0b, + 0x00, 0xfb, 0xfb, 0x01, 0x0c, 0x14, 0x18, 0x18, 0x15, 0x11, 0x0d, 0x0b, + 0x0a, 0x08, 0x06, 0x04, 0x00, 0xfe, 0xfc, 0xf9, 0xf7, 0xf6, 0xf3, 0xf4, + 0xf9, 0x03, 0x0f, 0x1a, 0x20, 0x1f, 0x17, 0x0a, 0x01, 0xfc, 0xff, 0x05, + 0x0b, 0x0e, 0x0d, 0x05, 0xfc, 0xf3, 0xeb, 0xe7, 0xe5, 0xe4, 0xe2, 0xe1, + 0xe1, 0xe3, 0xe7, 0xeb, 0xef, 0xf2, 0xf5, 0xfa, 0x01, 0x0f, 0x1a, 0x23, + 0x23, 0x1c, 0x10, 0x05, 0xfc, 0xf9, 0xff, 0x09, 0x12, 0x18, 0x1a, 0x15, + 0x12, 0x0e, 0x0b, 0x09, 0x08, 0x07, 0x05, 0x02, 0xff, 0xfd, 0xfa, 0xf8, + 0xf6, 0xf3, 0xf3, 0xf6, 0xff, 0x0a, 0x17, 0x1e, 0x21, 0x1b, 0x10, 0x04, + 0xfd, 0xfe, 0x04, 0x0a, 0x0f, 0x0e, 0x08, 0x00, 0xf6, 0xec, 0xe6, 0xe4, + 0xe2, 0xe2, 0xe0, 0xe0, 0xe2, 0xe5, 0xe9, 0xee, 0xf1, 0xf4, 0xf8, 0x00, + 0x0a, 0x17, 0x22, 0x26, 0x20, 0x15, 0x09, 0xff, 0xfa, 0xfe, 0x06, 0x0f, + 0x17, 0x1a, 0x18, 0x13, 0x0f, 0x0b, 0x09, 0x07, 0x06, 0x05, 0x02, 0xff, + 0xfe, 0xfc, 0xf9, 0xf7, 0xf4, 0xf3, 0xf4, 0xfb, 0x06, 0x13, 0x1f, 0x21, + 0x1e, 0x14, 0x07, 0xff, 0xff, 0x01, 0x09, 0x0e, 0x10, 0x0b, 0x03, 0xf9, + 0xef, 0xe7, 0xe3, 0xe1, 0xe0, 0xde, 0xdf, 0xe1, 0xe4, 0xe8, 0xec, 0xf0, + 0xf3, 0xf6, 0xfd, 0x05, 0x12, 0x1e, 0x25, 0x23, 0x1b, 0x0f, 0x03, 0xfc, + 0xfc, 0x04, 0x0c, 0x16, 0x1a, 0x1a, 0x15, 0x10, 0x0b, 0x08, 0x08, 0x07, + 0x06, 0x02, 0x00, 0xfe, 0xfd, 0xfa, 0xf8, 0xf6, 0xf3, 0xf4, 0xf9, 0x03, + 0x0e, 0x1c, 0x21, 0x21, 0x19, 0x0c, 0x02, 0xfe, 0x01, 0x07, 0x0e, 0x11, + 0x0e, 0x05, 0xfb, 0xf0, 0xe9, 0xe4, 0xe1, 0xde, 0xdc, 0xdd, 0xdf, 0xe2, + 0xe5, 0xeb, 0xee, 0xf3, 0xf5, 0xfb, 0x01, 0x0f, 0x1c, 0x24, 0x25, 0x1f, + 0x13, 0x07, 0xff, 0xfc, 0x00, 0x0a, 0x14, 0x1a, 0x1a, 0x17, 0x11, 0x0b, + 0x08, 0x08, 0x07, 0x07, 0x04, 0x02, 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf5, + 0xf4, 0xf6, 0xfe, 0x0a, 0x17, 0x1f, 0x21, 0x1b, 0x11, 0x07, 0x00, 0x00, + 0x05, 0x0d, 0x11, 0x10, 0x08, 0xff, 0xf3, 0xea, 0xe3, 0xde, 0xdd, 0xdb, + 0xdc, 0xdd, 0xe0, 0xe3, 0xe8, 0xed, 0xf1, 0xf5, 0xf9, 0x00, 0x0a, 0x18, + 0x22, 0x26, 0x23, 0x18, 0x0b, 0x01, 0xfd, 0xff, 0x08, 0x11, 0x18, 0x1a, + 0x18, 0x12, 0x0c, 0x09, 0x07, 0x07, 0x05, 0x04, 0x02, 0xff, 0xff, 0xfd, + 0xfb, 0xf9, 0xf6, 0xf4, 0xf5, 0xfc, 0x06, 0x13, 0x1e, 0x21, 0x1e, 0x14, + 0x0a, 0x03, 0x00, 0x04, 0x0b, 0x10, 0x11, 0x0b, 0x03, 0xf8, 0xec, 0xe3, + 0xde, 0xdc, 0xda, 0xda, 0xda, 0xdd, 0xe1, 0xe6, 0xeb, 0xf0, 0xf3, 0xf6, + 0xfd, 0x05, 0x13, 0x1f, 0x26, 0x26, 0x1c, 0x10, 0x04, 0xfe, 0xff, 0x05, + 0x0f, 0x17, 0x1a, 0x19, 0x13, 0x0f, 0x09, 0x07, 0x06, 0x05, 0x05, 0x03, + 0xff, 0xfe, 0xfd, 0xfc, 0xf9, 0xf8, 0xf5, 0xf6, 0xf9, 0x03, 0x0e, 0x1b, + 0x21, 0x21, 0x1a, 0x0f, 0x06, 0x01, 0x03, 0x0b, 0x10, 0x11, 0x0e, 0x04, + 0xf9, 0xee, 0xe5, 0xdf, 0xdb, 0xda, 0xd9, 0xda, 0xdb, 0xdf, 0xe4, 0xea, + 0xee, 0xf3, 0xf6, 0xfb, 0x02, 0x0f, 0x1a, 0x25, 0x26, 0x20, 0x15, 0x09, + 0x00, 0xfe, 0x03, 0x0b, 0x16, 0x1a, 0x1b, 0x16, 0x0f, 0x0a, 0x07, 0x06, + 0x05, 0x05, 0x03, 0x01, 0x00, 0xfe, 0xfc, 0xfb, 0xfa, 0xf6, 0xf5, 0xf8, + 0x00, 0x0a, 0x18, 0x20, 0x23, 0x1d, 0x12, 0x08, 0x03, 0x03, 0x08, 0x0f, + 0x12, 0x11, 0x09, 0xfc, 0xef, 0xe6, 0xe0, 0xdd, 0xda, 0xd7, 0xd8, 0xd9, + 0xdd, 0xe1, 0xe7, 0xeb, 0xf0, 0xf4, 0xf9, 0xff, 0x09, 0x17, 0x22, 0x29, + 0x23, 0x19, 0x0d, 0x04, 0x01, 0x04, 0x0a, 0x12, 0x19, 0x1a, 0x17, 0x10, + 0x0b, 0x07, 0x06, 0x06, 0x05, 0x04, 0x02, 0x02, 0x00, 0xfe, 0xfc, 0xfa, + 0xf8, 0xf6, 0xf7, 0xfc, 0x05, 0x12, 0x1e, 0x23, 0x1e, 0x15, 0x0d, 0x04, + 0x04, 0x07, 0x0e, 0x12, 0x12, 0x0c, 0x01, 0xf4, 0xe8, 0xe0, 0xdc, 0xda, + 0xd8, 0xd6, 0xd7, 0xdb, 0xdf, 0xe3, 0xea, 0xee, 0xf2, 0xf6, 0xfc, 0x03, + 0x12, 0x1f, 0x27, 0x27, 0x1f, 0x12, 0x08, 0x00, 0x03, 0x09, 0x11, 0x18, + 0x1b, 0x19, 0x13, 0x0b, 0x07, 0x05, 0x06, 0x06, 0x04, 0x02, 0x01, 0x00, + 0xff, 0xfe, 0xfc, 0xf9, 0xf7, 0xf7, 0xf9, 0x03, 0x0e, 0x19, 0x21, 0x22, + 0x1b, 0x10, 0x08, 0x04, 0x06, 0x0c, 0x11, 0x14, 0x10, 0x04, 0xf7, 0xea, + 0xe1, 0xdc, 0xd9, 0xd7, 0xd5, 0xd6, 0xd8, 0xdd, 0xe2, 0xe8, 0xec, 0xf0, + 0xf3, 0xf9, 0x00, 0x0c, 0x1b, 0x25, 0x28, 0x23, 0x19, 0x0c, 0x04, 0x02, + 0x07, 0x0e, 0x17, 0x1b, 0x1a, 0x15, 0x0e, 0x08, 0x04, 0x04, 0x05, 0x04, + 0x03, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xfb, 0xf8, 0xf7, 0xf9, 0xff, 0x09, + 0x15, 0x1f, 0x24, 0x1e, 0x15, 0x0b, 0x04, 0x06, 0x0b, 0x10, 0x13, 0x10, + 0x08, 0xfc, 0xee, 0xe3, 0xdc, 0xd9, 0xd7, 0xd6, 0xd4, 0xd7, 0xda, 0xdf, + 0xe4, 0xea, 0xed, 0xf1, 0xf5, 0xfd, 0x08, 0x15, 0x23, 0x2a, 0x28, 0x1f, + 0x12, 0x08, 0x03, 0x06, 0x0d, 0x15, 0x19, 0x1a, 0x16, 0x0f, 0x08, 0x04, + 0x03, 0x04, 0x04, 0x02, 0x03, 0x01, 0x00, 0xff, 0x00, 0xfc, 0xf9, 0xf6, + 0xf7, 0xfd, 0x05, 0x12, 0x1c, 0x22, 0x21, 0x18, 0x0e, 0x07, 0x06, 0x09, + 0x0e, 0x12, 0x11, 0x0c, 0x01, 0xf4, 0xe6, 0xdd, 0xd8, 0xd7, 0xd6, 0xd5, + 0xd6, 0xd8, 0xdc, 0xe3, 0xe8, 0xec, 0xee, 0xf3, 0xf9, 0x04, 0x10, 0x1e, + 0x27, 0x2a, 0x24, 0x19, 0x0c, 0x05, 0x06, 0x0c, 0x14, 0x1a, 0x1a, 0x17, + 0x11, 0x0a, 0x04, 0x02, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, + 0xfe, 0xfa, 0xf7, 0xf6, 0xf9, 0x03, 0x0e, 0x19, 0x21, 0x22, 0x1c, 0x13, + 0x0a, 0x06, 0x08, 0x0e, 0x12, 0x12, 0x0d, 0x04, 0xf7, 0xea, 0xdf, 0xd9, + 0xd6, 0xd4, 0xd5, 0xd5, 0xd7, 0xdb, 0xe1, 0xe5, 0xea, 0xed, 0xf1, 0xf5, + 0xff, 0x0c, 0x1a, 0x25, 0x2a, 0x27, 0x1e, 0x11, 0x08, 0x06, 0x0a, 0x10, + 0x18, 0x1a, 0x19, 0x13, 0x0b, 0x05, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x02, 0x00, 0xfc, 0xf7, 0xf5, 0xf7, 0xff, 0x09, 0x15, 0x1f, + 0x24, 0x21, 0x17, 0x0e, 0x09, 0x08, 0x0d, 0x11, 0x13, 0x0f, 0x06, 0xfb, + 0xed, 0xe1, 0xda, 0xd6, 0xd4, 0xd4, 0xd4, 0xd5, 0xd8, 0xde, 0xe4, 0xe8, + 0xeb, 0xee, 0xf2, 0xf9, 0x06, 0x15, 0x22, 0x2a, 0x2a, 0x22, 0x17, 0x0e, + 0x08, 0x09, 0x10, 0x17, 0x1b, 0x1a, 0x15, 0x0c, 0x06, 0x03, 0x02, 0x02, + 0x02, 0x03, 0x03, 0x02, 0x00, 0x01, 0x01, 0xff, 0xfb, 0xf7, 0xf6, 0xfb, + 0x06, 0x12, 0x1d, 0x24, 0x22, 0x1a, 0x11, 0x0a, 0x08, 0x0a, 0x11, 0x13, + 0x11, 0x09, 0xfe, 0xf1, 0xe4, 0xdb, 0xd7, 0xd4, 0xd4, 0xd4, 0xd5, 0xd7, + 0xdb, 0xe0, 0xe5, 0xea, 0xec, 0xf0, 0xf4, 0x02, 0x0e, 0x1d, 0x28, 0x2a, + 0x27, 0x1c, 0x12, 0x09, 0x0a, 0x0e, 0x15, 0x1a, 0x1c, 0x17, 0x0f, 0x07, + 0x03, 0x01, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xfc, + 0xf8, 0xf6, 0xfb, 0x04, 0x0e, 0x1a, 0x23, 0x24, 0x1f, 0x15, 0x0c, 0x08, + 0x0b, 0x10, 0x12, 0x14, 0x0c, 0x01, 0xf3, 0xe7, 0xdd, 0xd8, 0xd5, 0xd5, + 0xd4, 0xd5, 0xd7, 0xd9, 0xdf, 0xe3, 0xe7, 0xe9, 0xeb, 0xef, 0xfa, 0x09, + 0x17, 0x24, 0x2a, 0x28, 0x20, 0x16, 0x0e, 0x0c, 0x0e, 0x15, 0x1b, 0x1d, + 0x18, 0x11, 0x08, 0x03, 0xff, 0xfe, 0x01, 0x03, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x00, 0xfe, 0xf9, 0xf6, 0xf7, 0x00, 0x0b, 0x17, 0x21, 0x26, 0x22, + 0x1a, 0x11, 0x0a, 0x0a, 0x0e, 0x11, 0x14, 0x0e, 0x04, 0xf7, 0xea, 0xdf, + 0xd9, 0xd5, 0xd4, 0xd4, 0xd4, 0xd7, 0xd9, 0xdc, 0xe1, 0xe4, 0xe8, 0xe9, + 0xec, 0xf4, 0x03, 0x12, 0x20, 0x29, 0x2a, 0x24, 0x1b, 0x12, 0x0d, 0x0e, + 0x13, 0x1a, 0x1d, 0x1c, 0x14, 0x0b, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x03, + 0x04, 0x03, 0x02, 0x01, 0x01, 0x00, 0xfb, 0xf8, 0xf7, 0xfc, 0x06, 0x14, + 0x20, 0x26, 0x24, 0x1d, 0x14, 0x0c, 0x09, 0x0b, 0x10, 0x13, 0x12, 0x08, + 0xfb, 0xed, 0xe2, 0xdb, 0xd6, 0xd4, 0xd3, 0xd4, 0xd6, 0xd9, 0xdb, 0xde, + 0xe1, 0xe5, 0xe6, 0xe9, 0xef, 0xfc, 0x0b, 0x1c, 0x27, 0x2b, 0x28, 0x21, + 0x16, 0x10, 0x0e, 0x14, 0x19, 0x1e, 0x1d, 0x17, 0x0e, 0x05, 0xff, 0xfe, + 0xfe, 0x00, 0x02, 0x05, 0x04, 0x03, 0x01, 0x02, 0x00, 0xfc, 0xf8, 0xf7, + 0xfa, 0x04, 0x10, 0x1c, 0x25, 0x26, 0x20, 0x17, 0x0e, 0x0a, 0x0b, 0x0f, + 0x13, 0x12, 0x0c, 0xff, 0xf1, 0xe5, 0xdb, 0xd6, 0xd5, 0xd3, 0xd2, 0xd5, + 0xd6, 0xda, 0xdc, 0xe0, 0xe2, 0xe4, 0xe7, 0xec, 0xf5, 0x06, 0x16, 0x23, + 0x2b, 0x2b, 0x24, 0x1a, 0x12, 0x10, 0x12, 0x18, 0x1e, 0x1e, 0x1a, 0x12, + 0x08, 0x02, 0xff, 0xfe, 0x00, 0x01, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, + 0xfe, 0xfa, 0xf6, 0xf8, 0xff, 0x0b, 0x19, 0x25, 0x2a, 0x25, 0x1a, 0x12, + 0x0b, 0x0c, 0x0e, 0x12, 0x12, 0x0e, 0x03, 0xf6, 0xe8, 0xde, 0xd9, 0xd5, + 0xd3, 0xd2, 0xd5, 0xd6, 0xd9, 0xdb, 0xdf, 0xe0, 0xe2, 0xe4, 0xe7, 0xef, + 0xfd, 0x0e, 0x1e, 0x2a, 0x2c, 0x27, 0x1f, 0x17, 0x12, 0x12, 0x17, 0x1e, + 0x21, 0x1d, 0x15, 0x0b, 0x03, 0xff, 0xfe, 0xfe, 0x00, 0x02, 0x03, 0x04, + 0x02, 0x01, 0x02, 0xff, 0xfb, 0xf9, 0xf6, 0xfb, 0x06, 0x15, 0x21, 0x29, + 0x28, 0x20, 0x15, 0x0e, 0x09, 0x0a, 0x0f, 0x12, 0x10, 0x06, 0xfa, 0xec, + 0xe0, 0xda, 0xd6, 0xd4, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdd, 0xdf, 0xe0, + 0xe2, 0xe4, 0xe9, 0xf6, 0x06, 0x18, 0x27, 0x2c, 0x2a, 0x23, 0x1c, 0x15, + 0x14, 0x17, 0x1d, 0x21, 0x21, 0x1a, 0x0f, 0x05, 0xff, 0xfe, 0xfe, 0xfe, + 0x02, 0x02, 0x03, 0x03, 0x01, 0x02, 0x00, 0xfe, 0xf9, 0xf7, 0xfa, 0x03, + 0x10, 0x1e, 0x27, 0x2a, 0x23, 0x19, 0x11, 0x0b, 0x0a, 0x0e, 0x10, 0x10, + 0x08, 0xfe, 0xf0, 0xe4, 0xdd, 0xd7, 0xd4, 0xd5, 0xd5, 0xd5, 0xd6, 0xd9, + 0xda, 0xdd, 0xe0, 0xe0, 0xe1, 0xe4, 0xef, 0x00, 0x11, 0x22, 0x2c, 0x2c, + 0x28, 0x1f, 0x19, 0x15, 0x17, 0x1d, 0x21, 0x21, 0x1c, 0x12, 0x08, 0x01, + 0xfe, 0xfe, 0xfe, 0x01, 0x03, 0x03, 0x03, 0x02, 0x01, 0x02, 0xfe, 0xfa, + 0xf8, 0xf8, 0x01, 0x0d, 0x1a, 0x26, 0x2b, 0x28, 0x1d, 0x14, 0x0c, 0x09, + 0x0c, 0x0f, 0x0f, 0x0b, 0x02, 0xf5, 0xe7, 0xdf, 0xda, 0xd6, 0xd5, 0xd6, + 0xd6, 0xd7, 0xd8, 0xda, 0xdb, 0xdc, 0xdd, 0xdf, 0xe1, 0xea, 0xfa, 0x0a, + 0x1b, 0x29, 0x2d, 0x2a, 0x23, 0x1b, 0x16, 0x17, 0x1b, 0x20, 0x21, 0x1f, + 0x16, 0x0c, 0x03, 0xff, 0xfe, 0xfe, 0x01, 0x03, 0x04, 0x04, 0x02, 0x01, + 0x02, 0x00, 0xfd, 0xf8, 0xf7, 0xfd, 0x07, 0x16, 0x24, 0x2b, 0x2b, 0x21, + 0x16, 0x0e, 0x09, 0x0b, 0x0e, 0x0f, 0x0d, 0x04, 0xf9, 0xed, 0xe2, 0xdc, + 0xd7, 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xda, 0xdb, 0xdb, 0xdc, 0xdc, 0xde, + 0xe5, 0xf3, 0x05, 0x15, 0x24, 0x2c, 0x2c, 0x26, 0x1e, 0x18, 0x16, 0x1a, + 0x20, 0x22, 0x21, 0x1a, 0x10, 0x07, 0xff, 0xfe, 0xfe, 0x01, 0x03, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x00, 0xfd, 0xf8, 0xf7, 0xfb, 0x02, 0x11, 0x20, + 0x29, 0x2b, 0x25, 0x1c, 0x10, 0x0a, 0x09, 0x0c, 0x0e, 0x0d, 0x07, 0xfd, + 0xef, 0xe4, 0xdd, 0xd8, 0xd7, 0xd6, 0xd8, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, + 0xdb, 0xda, 0xdd, 0xe0, 0xeb, 0xfd, 0x0f, 0x20, 0x2b, 0x2c, 0x2a, 0x20, + 0x19, 0x16, 0x1a, 0x1e, 0x23, 0x23, 0x1d, 0x13, 0x0b, 0x03, 0xfe, 0xfe, + 0xff, 0x02, 0x04, 0x05, 0x03, 0x00, 0x01, 0x02, 0xfe, 0xf9, 0xf6, 0xf8, + 0x02, 0x0d, 0x1c, 0x28, 0x2e, 0x2a, 0x20, 0x15, 0x0b, 0x08, 0x0a, 0x0c, + 0x0e, 0x09, 0x01, 0xf3, 0xe8, 0xe0, 0xda, 0xd8, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd9, 0xd9, 0xda, 0xdb, 0xda, 0xdb, 0xdd, 0xe6, 0xf5, 0x07, 0x1a, 0x28, + 0x2e, 0x2b, 0x24, 0x1b, 0x16, 0x17, 0x1c, 0x22, 0x25, 0x20, 0x18, 0x0f, + 0x06, 0x00, 0xfe, 0x00, 0x01, 0x04, 0x04, 0x03, 0x00, 0x01, 0x00, 0xfd, + 0xf9, 0xf7, 0xf7, 0xfe, 0x08, 0x18, 0x26, 0x2d, 0x2c, 0x25, 0x1a, 0x0f, + 0x08, 0x08, 0x0a, 0x0c, 0x0a, 0x01, 0xf8, 0xec, 0xe2, 0xdb, 0xda, 0xd9, + 0xd8, 0xd8, 0xd9, 0xd8, 0xd8, 0xd8, 0xda, 0xd9, 0xda, 0xdc, 0xe0, 0xed, + 0x01, 0x14, 0x22, 0x2c, 0x2c, 0x27, 0x1e, 0x19, 0x17, 0x1b, 0x21, 0x25, + 0x22, 0x1c, 0x12, 0x09, 0x03, 0x00, 0x00, 0x02, 0x03, 0x04, 0x04, 0x00, + 0x00, 0x01, 0xfe, 0xfb, 0xf8, 0xf7, 0xfa, 0x05, 0x14, 0x22, 0x2c, 0x2f, + 0x28, 0x1d, 0x13, 0x0b, 0x07, 0x08, 0x0b, 0x0a, 0x04, 0xfc, 0xef, 0xe5, + 0xde, 0xda, 0xda, 0xd9, 0xda, 0xda, 0xd9, 0xd7, 0xd9, 0xd9, 0xd9, 0xda, + 0xda, 0xdd, 0xe7, 0xfa, 0x0c, 0x1e, 0x28, 0x2c, 0x28, 0x20, 0x1a, 0x17, + 0x18, 0x1e, 0x25, 0x25, 0x1e, 0x15, 0x0e, 0x07, 0x03, 0x01, 0x02, 0x03, + 0x04, 0x04, 0x02, 0x00, 0x00, 0xfe, 0xfc, 0xf9, 0xf8, 0xf9, 0x01, 0x0f, + 0x1e, 0x2a, 0x30, 0x2d, 0x23, 0x16, 0x0d, 0x07, 0x06, 0x09, 0x0a, 0x06, + 0xff, 0xf2, 0xe7, 0xe0, 0xdd, 0xdb, 0xd9, 0xda, 0xd9, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd9, 0xd9, 0xda, 0xe3, 0xf3, 0x05, 0x17, 0x25, 0x2b, 0x28, + 0x22, 0x1c, 0x16, 0x17, 0x1c, 0x22, 0x25, 0x21, 0x1b, 0x11, 0x09, 0x05, + 0x04, 0x03, 0x04, 0x05, 0x05, 0x02, 0x00, 0xfe, 0xfe, 0xfc, 0xfb, 0xf7, + 0xf8, 0xff, 0x0a, 0x19, 0x28, 0x30, 0x2f, 0x26, 0x1a, 0x0f, 0x08, 0x05, + 0x06, 0x09, 0x06, 0x01, 0xf6, 0xeb, 0xe2, 0xe0, 0xdc, 0xdb, 0xdc, 0xdc, + 0xda, 0xd8, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xda, 0xe0, 0xec, 0x00, 0x11, + 0x22, 0x29, 0x29, 0x25, 0x1d, 0x18, 0x15, 0x19, 0x20, 0x24, 0x24, 0x1e, + 0x16, 0x0e, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x00, 0xff, 0xfd, + 0xfc, 0xfa, 0xf7, 0xf7, 0xfd, 0x06, 0x15, 0x24, 0x2f, 0x31, 0x2a, 0x1e, + 0x12, 0x08, 0x04, 0x05, 0x07, 0x07, 0x03, 0xfa, 0xef, 0xe5, 0xe0, 0xde, + 0xdd, 0xdd, 0xdd, 0xd9, 0xd8, 0xd7, 0xd8, 0xd7, 0xd8, 0xd8, 0xd8, 0xdc, + 0xe7, 0xf8, 0x0b, 0x1d, 0x28, 0x29, 0x27, 0x1f, 0x18, 0x15, 0x18, 0x1d, + 0x22, 0x23, 0x20, 0x19, 0x11, 0x0b, 0x08, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x00, 0xff, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0xfb, 0x03, 0x10, 0x20, 0x2d, + 0x31, 0x2d, 0x23, 0x16, 0x0b, 0x04, 0x03, 0x05, 0x07, 0x03, 0xfd, 0xf1, + 0xe7, 0xe2, 0xe0, 0xde, 0xdf, 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd5, 0xd7, + 0xd7, 0xd7, 0xdb, 0xe3, 0xf2, 0x04, 0x17, 0x25, 0x29, 0x26, 0x1f, 0x18, + 0x14, 0x14, 0x1b, 0x20, 0x23, 0x23, 0x1d, 0x14, 0x0e, 0x0a, 0x08, 0x08, + 0x09, 0x08, 0x05, 0x02, 0x00, 0xfc, 0xfa, 0xf8, 0xf7, 0xf7, 0xfa, 0x00, + 0x0d, 0x1c, 0x2b, 0x32, 0x31, 0x27, 0x1a, 0x0d, 0x05, 0x02, 0x03, 0x05, + 0x04, 0x00, 0xf6, 0xec, 0xe4, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xda, 0xd9, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd7, 0xd9, 0xdf, 0xed, 0x00, 0x12, 0x21, 0x29, + 0x27, 0x21, 0x1a, 0x15, 0x13, 0x15, 0x1c, 0x22, 0x24, 0x20, 0x1a, 0x13, + 0x0e, 0x0a, 0x0a, 0x0b, 0x0a, 0x07, 0x04, 0x00, 0xfc, 0xfa, 0xf8, 0xf7, + 0xf7, 0xf8, 0xfd, 0x06, 0x17, 0x27, 0x31, 0x32, 0x2b, 0x1f, 0x10, 0x06, + 0x00, 0x00, 0x03, 0x05, 0x00, 0xf8, 0xef, 0xe7, 0xe3, 0xe1, 0xe1, 0xe0, + 0xdd, 0xdb, 0xd8, 0xd6, 0xd4, 0xd6, 0xd5, 0xd5, 0xd8, 0xde, 0xe7, 0xf8, + 0x0b, 0x1c, 0x27, 0x27, 0x22, 0x1b, 0x14, 0x12, 0x13, 0x18, 0x20, 0x23, + 0x22, 0x1d, 0x17, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x09, 0x04, 0x00, 0xfd, + 0xfa, 0xf7, 0xf6, 0xf6, 0xf7, 0xfb, 0x02, 0x13, 0x24, 0x30, 0x35, 0x30, + 0x23, 0x15, 0x08, 0x00, 0x00, 0x02, 0x04, 0x02, 0xfd, 0xf4, 0xea, 0xe3, + 0xe2, 0xe3, 0xe2, 0xe0, 0xde, 0xda, 0xd8, 0xd7, 0xd5, 0xd5, 0xd5, 0xd7, + 0xda, 0xe2, 0xf1, 0x05, 0x17, 0x23, 0x29, 0x24, 0x1c, 0x14, 0x0f, 0x0f, + 0x15, 0x1c, 0x21, 0x22, 0x1f, 0x19, 0x13, 0x0f, 0x0f, 0x0e, 0x0c, 0x0a, + 0x06, 0x02, 0xfe, 0xfb, 0xf7, 0xf6, 0xf6, 0xf6, 0xfa, 0x00, 0x0c, 0x1f, + 0x2d, 0x35, 0x33, 0x28, 0x18, 0x0c, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, + 0xf7, 0xee, 0xe6, 0xe3, 0xe3, 0xe2, 0xe0, 0xdf, 0xdc, 0xd7, 0xd7, 0xd5, + 0xd4, 0xd4, 0xd7, 0xd8, 0xdf, 0xec, 0x00, 0x12, 0x22, 0x2a, 0x26, 0x1e, + 0x15, 0x0e, 0x0b, 0x0f, 0x18, 0x20, 0x23, 0x22, 0x1c, 0x16, 0x12, 0x10, + 0x10, 0x0f, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf8, 0xf6, 0xf5, 0xf6, 0xf7, + 0xfe, 0x08, 0x1a, 0x2a, 0x35, 0x35, 0x2c, 0x1d, 0x0f, 0x03, 0xff, 0x00, + 0x00, 0x02, 0x00, 0xfb, 0xf1, 0xe9, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdd, + 0xd9, 0xd7, 0xd5, 0xd4, 0xd4, 0xd6, 0xd7, 0xdc, 0xe8, 0xfa, 0x0b, 0x1c, + 0x27, 0x27, 0x20, 0x16, 0x0d, 0x09, 0x0b, 0x14, 0x1c, 0x21, 0x22, 0x1e, + 0x18, 0x15, 0x13, 0x12, 0x10, 0x0f, 0x0b, 0x05, 0x00, 0xfd, 0xfa, 0xf6, + 0xf5, 0xf5, 0xf6, 0xfb, 0x04, 0x14, 0x25, 0x33, 0x37, 0x30, 0x24, 0x15, + 0x06, 0xff, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf4, 0xeb, 0xe7, 0xe4, 0xe3, + 0xe3, 0xe2, 0xde, 0xda, 0xd6, 0xd5, 0xd3, 0xd3, 0xd3, 0xd6, 0xda, 0xe3, + 0xf3, 0x04, 0x17, 0x24, 0x28, 0x22, 0x1a, 0x10, 0x09, 0x0a, 0x10, 0x19, + 0x21, 0x23, 0x21, 0x1c, 0x17, 0x15, 0x15, 0x13, 0x12, 0x0f, 0x00, 0x00, + 0x02, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xfd, 0xfe, 0x06, 0x0b, 0x07, 0x05, + 0x07, 0x06, 0xfd, 0xfe, 0x00, 0x03, 0x02, 0x01, 0x0b, 0x03, 0x01, 0xfe, + 0xff, 0x02, 0x07, 0x09, 0x07, 0x03, 0x03, 0x06, 0x0a, 0x05, 0x06, 0x07, + 0x07, 0x10, 0x0f, 0x07, 0x07, 0x06, 0x00, 0xff, 0x00, 0x09, 0x07, 0x06, + 0x06, 0x02, 0x00, 0xfa, 0xf9, 0xf9, 0xfe, 0xfa, 0xfd, 0xfe, 0x02, 0x03, + 0x0b, 0x06, 0x02, 0x01, 0x0a, 0x0e, 0x05, 0x02, 0x03, 0xff, 0xff, 0x00, + 0x00, 0x03, 0x07, 0x06, 0x05, 0x02, 0x00, 0x00, 0x03, 0x07, 0x07, 0x09, + 0x03, 0x00, 0xfb, 0xf7, 0xfa, 0xfb, 0xff, 0x02, 0x0a, 0x10, 0x07, 0x0d, + 0x0f, 0x0e, 0x03, 0x01, 0x00, 0xff, 0xfb, 0x01, 0xfe, 0x01, 0x02, 0x02, + 0x05, 0x07, 0x03, 0x06, 0x06, 0x06, 0x02, 0x01, 0x02, 0xff, 0x02, 0x05, + 0x0e, 0x12, 0x0d, 0x0a, 0x05, 0x03, 0x00, 0x01, 0x00, 0xff, 0xfb, 0xfb, + 0x02, 0x07, 0xf7, 0xfa, 0xfa, 0xf9, 0xfb, 0xfb, 0xff, 0xfb, 0x00, 0x00, + 0x05, 0x01, 0x01, 0x01, 0x06, 0x0b, 0x07, 0x05, 0x07, 0x0f, 0x10, 0x10, + 0x0a, 0x09, 0x07, 0x03, 0x06, 0x07, 0x00, 0xff, 0xfb, 0xf9, 0xf7, 0x00, + 0x03, 0xff, 0x07, 0x0a, 0x07, 0x02, 0x05, 0x05, 0x0a, 0x10, 0x0a, 0x0b, + 0x0b, 0x06, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x09, 0x03, 0xff, 0xff, + 0xfd, 0xfa, 0xff, 0x01, 0x01, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0x00, + 0x07, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x01, 0xfe, 0xfe, 0x03, 0x02, 0x05, + 0x0a, 0x0b, 0x09, 0x03, 0x09, 0x03, 0x00, 0x06, 0x03, 0x06, 0x07, 0x03, + 0xff, 0xfb, 0x02, 0x09, 0x0d, 0x0f, 0x0d, 0x07, 0x09, 0x0d, 0x07, 0x01, + 0xfe, 0xfa, 0xf7, 0xf6, 0xf7, 0x01, 0xfd, 0xfd, 0x00, 0x02, 0x05, 0x07, + 0x02, 0x05, 0x03, 0x02, 0x02, 0x02, 0x00, 0x02, 0x07, 0x0f, 0x0d, 0x09, + 0x0a, 0x05, 0x00, 0x05, 0x09, 0x0d, 0x05, 0xff, 0x00, 0x05, 0x00, 0xfe, + 0xf5, 0xf5, 0xf1, 0xf7, 0xfd, 0x01, 0x07, 0x07, 0x02, 0xfe, 0x0a, 0x0b, + 0x06, 0x0b, 0x0e, 0x0d, 0x09, 0x0e, 0x0e, 0x05, 0x03, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x05, 0x01, 0xfd, 0xff, 0xff, 0x00, 0x01, 0x02, + 0x03, 0x01, 0xfe, 0x00, 0xfe, 0xfa, 0xff, 0x00, 0x02, 0x07, 0x07, 0x03, + 0x02, 0x00, 0xff, 0x03, 0x03, 0x02, 0x06, 0x03, 0x01, 0xfe, 0xfd, 0x01, + 0x06, 0xfe, 0x02, 0x05, 0x02, 0xfe, 0x02, 0x0d, 0x12, 0x14, 0x14, 0x0d, + 0x0b, 0x03, 0xfd, 0xfe, 0x00, 0xf7, 0xf5, 0xfa, 0xfb, 0x06, 0x0a, 0x07, + 0x09, 0x05, 0x06, 0x0a, 0x09, 0x0b, 0x05, 0x0a, 0x0d, 0x05, 0x00, 0xff, + 0x02, 0x03, 0x0a, 0x0b, 0x09, 0x03, 0xff, 0xff, 0x03, 0x05, 0xfe, 0xf5, + 0xf7, 0xf6, 0xf3, 0xfb, 0xf9, 0xf7, 0xf7, 0xf9, 0x05, 0x05, 0xff, 0x06, + 0x0d, 0x0a, 0x0e, 0x07, 0x07, 0x0d, 0x12, 0x0f, 0x0d, 0x09, 0x0b, 0x0a, + 0x0b, 0x0e, 0x06, 0x03, 0xfd, 0x01, 0x00, 0x01, 0x03, 0xff, 0xf9, 0xfd, + 0x00, 0xfb, 0xfd, 0xfe, 0xf9, 0xff, 0xff, 0xfd, 0x03, 0x06, 0x09, 0x07, + 0x03, 0x09, 0x0e, 0x0a, 0x0d, 0x07, 0x0b, 0x0b, 0x07, 0x02, 0x00, 0x02, + 0x03, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0x05, 0x06, 0xff, 0x03, 0x01, 0x01, + 0x03, 0x07, 0x09, 0x03, 0x01, 0x00, 0xff, 0x01, 0x03, 0xfa, 0xfe, 0xfe, + 0xfa, 0xfe, 0x02, 0x0a, 0x0f, 0x0a, 0x05, 0x0d, 0x07, 0x06, 0x06, 0x09, + 0x02, 0x07, 0x01, 0x00, 0x00, 0x02, 0x10, 0x12, 0x0b, 0x05, 0x09, 0xfe, + 0xfe, 0x01, 0x05, 0xfb, 0xfe, 0x02, 0xff, 0x09, 0x06, 0xff, 0x01, 0xfe, + 0xfb, 0xff, 0xfe, 0xfd, 0xfe, 0x01, 0x07, 0x09, 0x09, 0x02, 0x06, 0x09, + 0x0e, 0x07, 0x02, 0x06, 0x01, 0x00, 0x09, 0x05, 0xfb, 0xf5, 0xf9, 0xfd, + 0xf7, 0xfb, 0xf7, 0x01, 0x07, 0x09, 0x09, 0x14, 0x0d, 0x0d, 0x06, 0x02, + 0x02, 0xff, 0x06, 0x07, 0x01, 0x02, 0x0a, 0x0a, 0x09, 0x0b, 0x0e, 0x0f, + 0x09, 0x06, 0x03, 0x02, 0x06, 0x09, 0x03, 0x02, 0xf9, 0xfe, 0xff, 0x02, + 0xff, 0xfe, 0x00, 0xf9, 0xfd, 0x05, 0x03, 0x03, 0x07, 0x05, 0x00, 0xfe, + 0xfd, 0xfd, 0x02, 0x01, 0xfd, 0xff, 0xfd, 0x05, 0x09, 0x0e, 0x0f, 0x07, + 0x06, 0x07, 0x09, 0x02, 0x06, 0x06, 0x0d, 0x01, 0x02, 0x02, 0x05, 0x00, + 0x12, 0x09, 0x00, 0xfb, 0x01, 0x02, 0x0e, 0x10, 0x02, 0xfd, 0xfd, 0xff, + 0x02, 0xff, 0xfe, 0xfb, 0x00, 0xfd, 0xf9, 0xff, 0x03, 0x01, 0x0d, 0x09, + 0x10, 0x0d, 0x07, 0x05, 0x0f, 0x14, 0x07, 0x00, 0x03, 0xff, 0xf9, 0xf3, + 0xf9, 0xfe, 0xfd, 0xfb, 0xfd, 0x07, 0x0b, 0xfd, 0x05, 0x05, 0x05, 0x10, + 0x0d, 0x03, 0xfb, 0xfe, 0x02, 0x03, 0x01, 0xfe, 0x03, 0x01, 0x07, 0x06, + 0x0e, 0x13, 0x0d, 0x0e, 0x0d, 0x01, 0x01, 0xff, 0x00, 0xff, 0xfd, 0xfe, + 0xf7, 0xfd, 0x01, 0x06, 0x05, 0x02, 0x06, 0x07, 0x03, 0x00, 0x02, 0x00, + 0x09, 0x0a, 0x00, 0x05, 0x02, 0xfe, 0xfe, 0x06, 0x01, 0x02, 0x00, 0x02, + 0x01, 0x09, 0x0e, 0x0d, 0x07, 0x05, 0xfd, 0x00, 0x06, 0xfe, 0xec, 0xfd, + 0xf9, 0xfe, 0xff, 0xff, 0x0d, 0x0d, 0xfe, 0x02, 0x06, 0x03, 0xfb, 0x0a, + 0x09, 0x00, 0x07, 0x09, 0x07, 0x0a, 0x0a, 0x0a, 0x01, 0x0a, 0x03, 0x06, + 0x06, 0x01, 0x03, 0x0e, 0x0b, 0x07, 0xff, 0x01, 0xfe, 0x03, 0x0a, 0x07, + 0xfb, 0xfa, 0x03, 0x09, 0x05, 0x00, 0x02, 0x00, 0xf7, 0xfe, 0xf9, 0xf7, + 0xf9, 0xfa, 0x07, 0x0a, 0x09, 0x03, 0x01, 0x0b, 0x05, 0x09, 0x0a, 0x01, + 0xfb, 0xfe, 0x02, 0x09, 0x14, 0x10, 0x10, 0x09, 0xfe, 0xf1, 0xf3, 0xf7, + 0xfd, 0xf6, 0x05, 0x09, 0xff, 0xfd, 0x09, 0x0e, 0x0a, 0x0d, 0x05, 0x06, + 0x02, 0xff, 0x0d, 0x0d, 0x0e, 0x0b, 0x17, 0x12, 0x0e, 0x06, 0x00, 0x02, + 0x00, 0xf7, 0xfe, 0x01, 0xfd, 0xff, 0xff, 0x03, 0x02, 0xfb, 0xfd, 0xf9, + 0x05, 0x0a, 0xff, 0xfd, 0x02, 0x00, 0xfa, 0xf6, 0x06, 0x02, 0x01, 0xfd, + 0xfd, 0x05, 0x0a, 0xfb, 0x01, 0x02, 0x10, 0x14, 0x12, 0x10, 0x12, 0x0d, + 0xff, 0xff, 0x01, 0x00, 0xfe, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x06, + 0x07, 0x09, 0x0a, 0x09, 0x0e, 0x12, 0x00, 0xfa, 0x06, 0x03, 0x00, 0x01, + 0xfb, 0xff, 0x0a, 0x09, 0x02, 0x0f, 0x20, 0x14, 0x13, 0x13, 0x05, 0xfe, + 0xfb, 0xf9, 0xf7, 0xf7, 0xf1, 0xf1, 0xf5, 0xf5, 0x00, 0xfd, 0xfb, 0x06, + 0x0b, 0x05, 0x01, 0x00, 0x00, 0x02, 0x00, 0xf7, 0xf6, 0xf2, 0xf9, 0x01, + 0x02, 0x0d, 0x07, 0xff, 0x03, 0x1a, 0x1a, 0x13, 0x14, 0x0e, 0x0e, 0x14, + 0x12, 0x12, 0x0d, 0x06, 0x07, 0x06, 0xf9, 0xf0, 0xf9, 0x00, 0x03, 0x05, + 0x0d, 0x0b, 0x09, 0x02, 0xfb, 0xfd, 0x00, 0xfe, 0xfd, 0xfb, 0xf9, 0xf9, + 0xff, 0x07, 0x07, 0x07, 0x0e, 0x1b, 0x0e, 0x03, 0x00, 0x0b, 0x01, 0xfa, + 0xfe, 0xf6, 0xfe, 0x01, 0xfb, 0xfa, 0xff, 0xfb, 0xfa, 0xfa, 0x03, 0x02, + 0xf7, 0xf5, 0x05, 0x0e, 0x05, 0xfa, 0xf7, 0x03, 0x0b, 0x09, 0xfa, 0xfa, + 0x01, 0x0d, 0x0e, 0x02, 0x1b, 0x21, 0x20, 0x21, 0x14, 0x10, 0x0d, 0x13, + 0x10, 0x06, 0x10, 0x0e, 0x01, 0xf3, 0xed, 0xf3, 0xea, 0xf2, 0xf3, 0xfd, + 0x0d, 0x05, 0x00, 0x07, 0x07, 0x02, 0xfd, 0xf7, 0xf6, 0xf3, 0x01, 0x00, + 0x05, 0x0a, 0xff, 0x05, 0x1b, 0x16, 0x13, 0x09, 0x02, 0x06, 0xff, 0xfe, + 0x00, 0xfb, 0xf2, 0xfb, 0x03, 0x01, 0x09, 0x01, 0xf9, 0x00, 0xff, 0xfe, + 0xfb, 0x00, 0x03, 0x0b, 0x01, 0x02, 0x0a, 0x06, 0x05, 0x02, 0x0a, 0x0e, + 0x17, 0x0d, 0x05, 0x17, 0x23, 0x18, 0x0f, 0x10, 0x10, 0x0f, 0x12, 0x03, + 0x00, 0x01, 0x03, 0xfa, 0xf5, 0xf6, 0xfe, 0x05, 0x02, 0x00, 0xf9, 0xfa, + 0xf9, 0xf0, 0xf3, 0xfb, 0xf9, 0xf6, 0xf3, 0xf2, 0xf7, 0xf1, 0xf1, 0x02, + 0x0e, 0x1b, 0x13, 0x1f, 0x07, 0x00, 0x01, 0xfd, 0xfd, 0x06, 0x12, 0x13, + 0x0b, 0x07, 0x06, 0x06, 0x06, 0x02, 0x00, 0x01, 0x06, 0x0b, 0x00, 0xf7, + 0xfa, 0xfe, 0xff, 0xfe, 0x01, 0x03, 0x02, 0x03, 0x05, 0x00, 0x05, 0x10, + 0x06, 0x03, 0x0f, 0x34, 0x30, 0x28, 0x1d, 0x13, 0x0e, 0x0a, 0x07, 0x07, + 0x00, 0xfd, 0xfb, 0xf7, 0xec, 0xee, 0xed, 0xf0, 0xee, 0xf9, 0xfd, 0xf1, + 0xe5, 0xe5, 0xee, 0xf1, 0xee, 0xee, 0xf3, 0xf9, 0xfb, 0xfe, 0x03, 0x09, + 0x12, 0x1b, 0x24, 0x21, 0x1a, 0x1a, 0x16, 0x0e, 0x02, 0xfd, 0x01, 0x09, + 0x0d, 0x07, 0x0a, 0x0d, 0x06, 0x05, 0x0b, 0x0a, 0x01, 0xff, 0x05, 0x07, + 0x0f, 0x06, 0x0a, 0xfe, 0xf7, 0xf6, 0xf7, 0x02, 0xfb, 0xfa, 0x06, 0x01, + 0xff, 0x10, 0x23, 0x13, 0x0d, 0x06, 0x13, 0x17, 0x0b, 0xfd, 0xf6, 0xf0, + 0xf5, 0xf6, 0xf2, 0xf2, 0x02, 0xff, 0x06, 0x01, 0x00, 0x00, 0xfa, 0xf1, + 0xec, 0xed, 0xf7, 0xf5, 0x01, 0x06, 0x03, 0x02, 0xfe, 0x07, 0x07, 0x09, + 0x05, 0x1a, 0x18, 0x16, 0x16, 0x0d, 0x0a, 0x0a, 0x32, 0x31, 0x1d, 0x0e, + 0x07, 0x06, 0x09, 0x03, 0xff, 0xfe, 0x03, 0x00, 0xf3, 0xf0, 0xf6, 0xf7, + 0xf1, 0xf3, 0xfb, 0xf7, 0xf3, 0xf5, 0xee, 0xee, 0x00, 0x02, 0xfd, 0xfe, + 0x1c, 0x2c, 0x21, 0x17, 0x13, 0x1b, 0x13, 0x02, 0x05, 0x0e, 0x12, 0x0d, + 0xfb, 0xf5, 0xed, 0xed, 0xe4, 0xe8, 0xec, 0xfd, 0x05, 0xf7, 0xf5, 0xf7, + 0xf9, 0xf3, 0xf2, 0xf1, 0x0d, 0x17, 0x18, 0x1b, 0x14, 0x0b, 0x06, 0x0a, + 0x21, 0x21, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x07, 0x06, 0x01, 0x03, 0x13, + 0x12, 0x0e, 0x02, 0x02, 0x09, 0x07, 0x03, 0x03, 0x0d, 0x17, 0x0f, 0x07, + 0xfe, 0xff, 0xfd, 0xf3, 0xf2, 0xf0, 0xec, 0x00, 0xfd, 0xf3, 0xf3, 0x03, + 0x07, 0x09, 0x00, 0xf3, 0xf5, 0xf9, 0xee, 0xee, 0xf7, 0xf1, 0xfe, 0x01, + 0x14, 0x3b, 0x28, 0x17, 0x12, 0x06, 0xf7, 0xfb, 0x06, 0x06, 0x02, 0xff, + 0xfb, 0x01, 0x06, 0x0b, 0x0d, 0x10, 0x0b, 0x0d, 0x03, 0x03, 0x0e, 0x1a, + 0x16, 0x0b, 0x03, 0xff, 0xfd, 0x13, 0x0a, 0x0b, 0x0b, 0x06, 0x07, 0xff, + 0xfe, 0xfb, 0x12, 0x17, 0x0e, 0xfe, 0xf6, 0xe9, 0xe5, 0xe9, 0xea, 0xe4, + 0xe3, 0xed, 0xee, 0xf1, 0x07, 0x05, 0x05, 0xfe, 0xfe, 0x13, 0x21, 0x25, + 0x21, 0x20, 0x24, 0x12, 0x0e, 0x10, 0x03, 0xfd, 0xf5, 0xf7, 0xfa, 0xf7, + 0xf3, 0xf5, 0xfa, 0xfe, 0x07, 0x00, 0x06, 0x06, 0x0a, 0x05, 0xfd, 0xfa, + 0xfa, 0x16, 0x16, 0x1a, 0x14, 0x14, 0x13, 0x01, 0xfb, 0x03, 0x10, 0x0f, + 0x0f, 0x06, 0x01, 0x00, 0xff, 0xfa, 0xfa, 0xf2, 0xec, 0xec, 0xe9, 0xf3, + 0x09, 0x0a, 0x03, 0x01, 0x09, 0x30, 0x30, 0x1b, 0x1a, 0x10, 0xea, 0xe3, + 0xe4, 0xf7, 0xf9, 0xee, 0xf6, 0x0b, 0x05, 0x02, 0x07, 0x10, 0x07, 0x05, + 0x02, 0xfe, 0x00, 0x09, 0x14, 0x0a, 0xf7, 0xee, 0xf5, 0x0b, 0x0b, 0xff, + 0x00, 0x06, 0x0b, 0x01, 0xf6, 0xfd, 0x0f, 0x1a, 0x0d, 0x0a, 0x06, 0x03, + 0xfd, 0x07, 0x13, 0x13, 0x10, 0x09, 0x05, 0x09, 0x2c, 0x1d, 0x07, 0x09, + 0x03, 0x12, 0x14, 0x09, 0xff, 0xff, 0xfb, 0xf3, 0xee, 0xf0, 0xec, 0xe5, + 0xe5, 0xe1, 0xec, 0xfa, 0xee, 0xdd, 0xd9, 0xe8, 0x12, 0x0a, 0xfe, 0xfe, + 0x10, 0x12, 0x05, 0x0d, 0x0a, 0x1b, 0x2c, 0x25, 0x2d, 0x28, 0x25, 0x24, + 0x1a, 0x17, 0x0b, 0x07, 0x07, 0x06, 0x02, 0x03, 0xfa, 0xe4, 0xe4, 0xe4, + 0xed, 0xea, 0xe5, 0xe9, 0x02, 0x03, 0xf6, 0xf1, 0xf2, 0x13, 0x34, 0x1d, + 0x1c, 0x23, 0x1d, 0x03, 0xfa, 0xfb, 0x01, 0x0b, 0x09, 0x06, 0x0d, 0x05, + 0x00, 0x00, 0xfb, 0xf9, 0xf2, 0xf2, 0xee, 0xf2, 0xfd, 0xfe, 0xfd, 0xff, + 0xfa, 0x09, 0x1c, 0x0b, 0x01, 0x09, 0x07, 0xf7, 0xe8, 0xf1, 0xf5, 0x0f, + 0x1d, 0x1d, 0x1d, 0x0a, 0x02, 0x00, 0x06, 0x12, 0x0e, 0x14, 0x0e, 0x0d, + 0x16, 0x14, 0x05, 0xfa, 0xf5, 0xfd, 0x13, 0x0e, 0x03, 0xfe, 0xfe, 0xf7, + 0xf6, 0xf3, 0xf6, 0xee, 0xea, 0xea, 0xee, 0xfb, 0xfa, 0xf6, 0xee, 0xf6, + 0x14, 0x25, 0x1a, 0x18, 0x1f, 0x1b, 0x23, 0x02, 0xff, 0x1a, 0x28, 0x17, + 0x0f, 0x12, 0x1a, 0x07, 0x02, 0xfe, 0xfd, 0xf2, 0xf0, 0xec, 0xec, 0xf1, + 0xfa, 0xec, 0xdf, 0xdf, 0xdc, 0xe3, 0xe5, 0xed, 0x05, 0xfa, 0xf3, 0xfd, + 0x06, 0x17, 0x3f, 0x2e, 0x2d, 0x3a, 0x32, 0x27, 0x25, 0x23, 0x21, 0x17, + 0x0f, 0x0f, 0x0e, 0x0e, 0x0b, 0x06, 0xf6, 0xe3, 0xe4, 0xe5, 0xe5, 0xee, + 0xf2, 0xf0, 0xec, 0xe8, 0xe3, 0xe5, 0xfe, 0xfa, 0xf9, 0x01, 0x07, 0x07, + 0xf9, 0xf1, 0xf1, 0x00, 0x1b, 0x31, 0x2a, 0x1d, 0x17, 0x17, 0x09, 0x02, + 0x01, 0x01, 0x03, 0x0f, 0x0f, 0x07, 0xfd, 0xfd, 0xff, 0x00, 0x0f, 0x0b, + 0x09, 0x0a, 0x00, 0xfd, 0xfe, 0xf3, 0xe5, 0xec, 0xed, 0xfb, 0x17, 0x0a, + 0x0d, 0x0a, 0xfe, 0xf9, 0x12, 0x21, 0x1c, 0x28, 0x2a, 0x1a, 0x06, 0xf2, + 0xf6, 0xf9, 0x0a, 0x0b, 0x09, 0x0b, 0x03, 0xf5, 0xf5, 0xf3, 0xed, 0xee, + 0xec, 0xee, 0xf0, 0xec, 0xe8, 0xee, 0xed, 0xf1, 0x02, 0x03, 0x05, 0x1c, + 0x1d, 0x0e, 0x06, 0x10, 0x09, 0x0a, 0x37, 0x37, 0x30, 0x2d, 0x29, 0x17, + 0x0e, 0x0a, 0xff, 0x00, 0xfd, 0xfa, 0xfa, 0xf3, 0xf5, 0xf0, 0xe6, 0xe5, + 0xe5, 0xe8, 0xf3, 0xf7, 0xf2, 0xed, 0xea, 0xf2, 0x00, 0x02, 0x0b, 0x0b, + 0x18, 0x20, 0x27, 0x1a, 0x0f, 0x14, 0x0f, 0x18, 0x20, 0x18, 0x1a, 0x14, + 0x0e, 0x0d, 0x09, 0xf1, 0xe4, 0xe9, 0xfd, 0xfe, 0xf9, 0xf3, 0xf2, 0xfa, + 0xf6, 0x01, 0x0a, 0xfb, 0xfd, 0x00, 0x05, 0x09, 0xee, 0xee, 0xf0, 0xf2, + 0xf5, 0x02, 0x17, 0x10, 0x13, 0x0f, 0x09, 0x02, 0x05, 0x17, 0x13, 0x12, + 0x16, 0x1d, 0x12, 0x00, 0xf7, 0x07, 0x18, 0x10, 0x13, 0x1c, 0x16, 0x0e, + 0x03, 0x01, 0xf6, 0xe4, 0xf1, 0xf9, 0x06, 0xfe, 0xf2, 0xf2, 0xf5, 0xf9, + 0xfa, 0x0a, 0x0e, 0x0a, 0x09, 0x03, 0xf5, 0xe4, 0xe1, 0xee, 0x12, 0x05, + 0x09, 0x20, 0x1b, 0x16, 0x0d, 0x00, 0xf7, 0xfa, 0xfa, 0x03, 0x05, 0x06, + 0x02, 0xff, 0xfe, 0xf9, 0xff, 0x14, 0x0d, 0x02, 0x00, 0xfd, 0xfa, 0x02, + 0x10, 0x0d, 0x0b, 0x21, 0x2d, 0x29, 0x18, 0x0a, 0x0d, 0x09, 0x03, 0x09, + 0x0f, 0x02, 0x05, 0x0a, 0xfe, 0xf3, 0xe5, 0xe1, 0xe3, 0xf1, 0xf1, 0xf2, + 0xf2, 0xf2, 0xf0, 0xf6, 0xfa, 0xff, 0x06, 0x01, 0x09, 0x07, 0x05, 0x12, + 0x0d, 0x0a, 0x09, 0x0a, 0x23, 0x21, 0x17, 0x18, 0x0f, 0x01, 0x05, 0x0a, + 0x07, 0x0b, 0x02, 0x03, 0xff, 0xfb, 0xf7, 0xf9, 0xf7, 0x00, 0x03, 0x06, + 0x10, 0x12, 0x0f, 0x0b, 0xf3, 0xee, 0xf0, 0xf0, 0xf3, 0xf3, 0x09, 0x10, + 0x07, 0x07, 0x05, 0x06, 0x12, 0x1b, 0x0e, 0x05, 0x00, 0xff, 0xf5, 0xf2, + 0xfb, 0x0a, 0x17, 0x0e, 0x17, 0x16, 0x06, 0x01, 0x00, 0x05, 0xff, 0xec, + 0xe1, 0x02, 0x12, 0x0a, 0xfb, 0xf6, 0xfa, 0x07, 0x12, 0x18, 0x1f, 0x16, + 0x0f, 0x06, 0xfa, 0xed, 0xf1, 0x00, 0x0a, 0x06, 0x0a, 0x03, 0xff, 0xf7, + 0xec, 0xed, 0xf6, 0x02, 0xff, 0x00, 0xff, 0xfa, 0x00, 0x03, 0x03, 0x0e, + 0x1f, 0x17, 0x17, 0x14, 0x0f, 0x06, 0x07, 0x06, 0x0a, 0x2c, 0x18, 0x0e, + 0x23, 0x1f, 0x10, 0x00, 0xff, 0xfd, 0xfb, 0x02, 0xfb, 0xf9, 0xfe, 0xfb, + 0xf1, 0xd3, 0xd2, 0xe1, 0xf3, 0xf1, 0xe8, 0xe9, 0xe4, 0xf1, 0xf9, 0xfb, + 0x0d, 0x1a, 0x0d, 0x0f, 0x21, 0x24, 0x17, 0x0e, 0x1b, 0x23, 0x18, 0x14, + 0x10, 0x10, 0x18, 0x0b, 0x0f, 0x09, 0x07, 0x0d, 0x16, 0x02, 0xf2, 0xfb, + 0xfb, 0xed, 0xe6, 0xe5, 0xec, 0x01, 0x0e, 0x06, 0x17, 0x1c, 0x1a, 0x02, + 0xf1, 0xf9, 0xfa, 0xf0, 0xe9, 0xec, 0xfe, 0x0b, 0x12, 0x14, 0x0a, 0x0e, + 0x05, 0x01, 0x03, 0x01, 0xff, 0xf9, 0xf5, 0xf3, 0xf5, 0x0e, 0x09, 0x09, + 0x14, 0x18, 0x0e, 0x02, 0xf7, 0xf7, 0xfd, 0x0a, 0x03, 0x07, 0x09, 0x0d, + 0x09, 0xff, 0x00, 0x0e, 0x0d, 0x02, 0x0d, 0x1b, 0x23, 0x1d, 0x07, 0xf6, + 0xf9, 0x0d, 0x03, 0x02, 0x00, 0x06, 0xff, 0xfb, 0xf6, 0xf7, 0xfa, 0xfa, + 0xf7, 0xf6, 0xf7, 0xf9, 0xf3, 0xed, 0xf2, 0xfe, 0x14, 0x17, 0x18, 0x16, + 0x07, 0x01, 0xfd, 0xf3, 0xfe, 0x1d, 0x24, 0x14, 0x12, 0x27, 0x1a, 0x09, + 0x01, 0x02, 0x01, 0x09, 0x01, 0xfe, 0xff, 0x01, 0x06, 0xf7, 0xfe, 0xfb, + 0xf5, 0xf0, 0xe4, 0xe8, 0xe4, 0xe0, 0xe3, 0xea, 0xf6, 0x0e, 0x1c, 0x1a, + 0x13, 0x16, 0x12, 0x09, 0x07, 0x0d, 0x10, 0x23, 0x21, 0x1d, 0x20, 0x18, + 0x24, 0x24, 0x20, 0x16, 0x0a, 0x05, 0xf9, 0xee, 0xf2, 0xea, 0xea, 0xec, + 0xf7, 0x05, 0x01, 0xfa, 0xf1, 0xfb, 0x03, 0xfd, 0xec, 0xe3, 0xe3, 0xf7, + 0xfb, 0xf0, 0xf2, 0xf1, 0xfe, 0x0b, 0x1d, 0x1b, 0x14, 0x14, 0x10, 0x1a, + 0x1a, 0x12, 0x0f, 0x03, 0x01, 0x14, 0x16, 0x0e, 0x05, 0x0a, 0x10, 0x05, + 0xfe, 0xfb, 0xf9, 0xf5, 0xff, 0xfd, 0xf7, 0xf3, 0xf0, 0xff, 0x02, 0xff, + 0x0b, 0x18, 0x0e, 0x1a, 0x18, 0x16, 0x0b, 0x00, 0x01, 0x12, 0x0a, 0x0b, + 0x03, 0x07, 0x10, 0x01, 0xfa, 0xf2, 0xf3, 0xf0, 0xf1, 0xf3, 0xf2, 0xf1, + 0xee, 0xfb, 0xfe, 0x00, 0x01, 0x01, 0x00, 0xff, 0xfd, 0x07, 0x05, 0xfd, + 0xff, 0x1d, 0x36, 0x34, 0x1d, 0x12, 0x14, 0x0f, 0x09, 0x01, 0x00, 0x01, + 0x0b, 0x10, 0x07, 0x06, 0xff, 0x09, 0x02, 0x02, 0xff, 0xf5, 0xec, 0xec, + 0xe5, 0xe1, 0xe0, 0xf2, 0x0e, 0x18, 0x0b, 0x06, 0xff, 0x05, 0x0e, 0x02, + 0xfb, 0xfd, 0x0a, 0x21, 0x21, 0x1d, 0x1b, 0x16, 0x0a, 0x17, 0x18, 0x10, + 0x03, 0xfe, 0x0b, 0x02, 0xf1, 0xe9, 0xe9, 0xed, 0xfd, 0x02, 0xfa, 0xfb, + 0x02, 0x00, 0x09, 0x09, 0xfe, 0xfb, 0xf9, 0xf9, 0xfa, 0xf2, 0xec, 0xec, + 0xf2, 0x05, 0x10, 0x10, 0x14, 0x1d, 0x1a, 0x10, 0x0b, 0x0a, 0x05, 0x07, + 0x14, 0x12, 0x09, 0x0b, 0x0e, 0x0d, 0x16, 0x12, 0x10, 0x0b, 0x07, 0x01, + 0xf7, 0xff, 0x03, 0xe6, 0xe4, 0xf5, 0x03, 0x02, 0xff, 0x05, 0x00, 0xfb, + 0x02, 0x06, 0xf9, 0xf5, 0x05, 0x1a, 0x1b, 0x0d, 0x01, 0xf5, 0xf9, 0xfa, + 0xf3, 0xf3, 0xf6, 0xf9, 0xfe, 0x03, 0x01, 0x06, 0x0a, 0x0d, 0x13, 0x07, + 0x06, 0x0a, 0x09, 0x07, 0xff, 0xfb, 0xfa, 0xfe, 0x0e, 0x1b, 0x0f, 0x10, + 0x18, 0x13, 0xf9, 0xfd, 0x03, 0x0a, 0x0a, 0x14, 0x0f, 0x07, 0x05, 0x09, + 0x14, 0x0f, 0x05, 0xfd, 0xf7, 0xfb, 0xfe, 0xff, 0xec, 0xea, 0xf1, 0xfb, + 0x02, 0x07, 0xff, 0xf6, 0xf3, 0xf9, 0xf7, 0xfb, 0x03, 0x0a, 0x0b, 0x0f, + 0x09, 0x03, 0x01, 0x02, 0x0a, 0x1c, 0x29, 0x1d, 0x1a, 0x1f, 0x1f, 0x13, + 0xfe, 0xe9, 0xed, 0xf1, 0xf7, 0x02, 0xfd, 0xf7, 0xfe, 0x06, 0x09, 0x0d, + 0x0d, 0x06, 0xfb, 0xf3, 0xf3, 0xf5, 0xf1, 0xec, 0xee, 0xfe, 0x0f, 0x18, + 0x0b, 0x07, 0x10, 0x1a, 0x12, 0x07, 0x0a, 0x09, 0x0a, 0x0f, 0x18, 0x14, + 0x07, 0x03, 0x02, 0x09, 0x0f, 0x03, 0xfe, 0xf9, 0xf3, 0x00, 0x00, 0xfd, + 0xf3, 0xf3, 0xfb, 0xfa, 0xf1, 0xf1, 0xf7, 0xfb, 0x02, 0x10, 0x10, 0x03, + 0x0d, 0x0f, 0x09, 0x12, 0x0d, 0x0b, 0x00, 0xf3, 0xff, 0xff, 0x00, 0x02, + 0x00, 0xfd, 0xff, 0x00, 0x01, 0x09, 0x07, 0x07, 0x07, 0x06, 0x0b, 0x0a, + 0x07, 0x09, 0x0a, 0x02, 0x03, 0x0f, 0x0d, 0x12, 0x18, 0x18, 0x06, 0xfa, + 0xfb, 0x06, 0x12, 0x06, 0x01, 0xfe, 0x01, 0x00, 0xff, 0x07, 0x06, 0x05, + 0xf7, 0xfe, 0x02, 0x00, 0xf7, 0xf1, 0xe4, 0xe0, 0xe1, 0xfa, 0xf9, 0xf2, + 0xfe, 0x07, 0x06, 0x01, 0x0d, 0x0f, 0x0f, 0x0d, 0x17, 0x1a, 0x12, 0x07, + 0x09, 0x12, 0x20, 0x25, 0x1b, 0x16, 0x14, 0x0b, 0x05, 0x02, 0xf9, 0xe1, + 0xe6, 0xf9, 0xfd, 0x00, 0xff, 0x02, 0xfb, 0xfd, 0x0f, 0x16, 0x0e, 0xff, + 0xed, 0xe9, 0xf0, 0x02, 0xfe, 0xf7, 0x03, 0x0b, 0x14, 0x18, 0x0d, 0x06, + 0x0b, 0x10, 0x06, 0x01, 0xfe, 0x10, 0x09, 0x03, 0x01, 0x06, 0xfe, 0xf7, + 0x03, 0x09, 0x02, 0x02, 0x0d, 0x05, 0xfb, 0xfb, 0x00, 0x03, 0xfe, 0xff, + 0x01, 0xfb, 0xf2, 0xf5, 0x0a, 0x0e, 0x09, 0x0a, 0x0f, 0x14, 0x13, 0x06, + 0x0a, 0x0b, 0x09, 0xfd, 0xfe, 0xfb, 0xfd, 0xff, 0xfe, 0xf9, 0xf5, 0xfe, + 0x0d, 0x09, 0x0e, 0x10, 0x0d, 0x09, 0x0b, 0x0d, 0x14, 0x0b, 0x01, 0xfa, + 0xf7, 0xfd, 0x00, 0xfe, 0xff, 0x01, 0x09, 0x09, 0x13, 0x0e, 0xfd, 0x03, + 0x09, 0xff, 0xfd, 0xfa, 0xfb, 0xfe, 0x09, 0x14, 0x14, 0x09, 0xff, 0xfa, + 0x05, 0x07, 0x00, 0xf1, 0xe0, 0xe5, 0xf1, 0x02, 0x06, 0x02, 0xfe, 0xfa, + 0x07, 0x0b, 0x07, 0x09, 0x03, 0xfb, 0x02, 0x10, 0x1a, 0x13, 0x16, 0x2a, + 0x2a, 0x21, 0x1d, 0x21, 0x10, 0x03, 0x01, 0xf9, 0xee, 0xea, 0xfd, 0xfb, + 0xfa, 0xfe, 0x02, 0xfd, 0xfd, 0x01, 0xff, 0x01, 0xff, 0xfd, 0xed, 0xec, + 0xed, 0xf5, 0xfd, 0x05, 0xfd, 0xfa, 0xfb, 0xff, 0x0a, 0x14, 0x14, 0x0e, + 0x09, 0x0d, 0x1b, 0x14, 0x10, 0x10, 0x0a, 0x07, 0x0b, 0x0d, 0x02, 0x06, + 0x0a, 0x03, 0xfb, 0xf6, 0xfd, 0xf9, 0x01, 0x13, 0xfd, 0xf1, 0xfa, 0x02, + 0xff, 0xfe, 0xfe, 0xff, 0xfa, 0x07, 0x18, 0x13, 0x07, 0x02, 0x12, 0x13, + 0x16, 0x17, 0x06, 0xff, 0xfe, 0xfa, 0xfa, 0xf7, 0xf6, 0xfa, 0x00, 0x14, + 0x0e, 0x0d, 0x05, 0x00, 0xff, 0x02, 0x03, 0xfe, 0xf5, 0xe9, 0xf1, 0xf9, + 0x0a, 0x0b, 0xfb, 0xfa, 0x0b, 0x18, 0x17, 0x0d, 0x00, 0x02, 0xfe, 0x05, + 0x0f, 0x0e, 0x0d, 0x17, 0x17, 0x17, 0x12, 0x0e, 0x06, 0xf2, 0xf6, 0xfd, + 0xf0, 0xe1, 0xe8, 0xf3, 0xf0, 0xf7, 0x01, 0x00, 0x0a, 0x13, 0x0b, 0x03, + 0x06, 0x05, 0x03, 0x00, 0x09, 0x12, 0x16, 0x1f, 0x25, 0x1d, 0x16, 0x13, + 0x07, 0x09, 0x06, 0x05, 0xf9, 0xf9, 0xfb, 0xf6, 0xf1, 0xf5, 0xff, 0xf6, + 0xfd, 0xff, 0xf5, 0xf7, 0x02, 0x03, 0xfa, 0xfb, 0xf5, 0xff, 0x05, 0x0b, + 0x05, 0xfa, 0xf7, 0x0a, 0x0e, 0x07, 0x06, 0x0a, 0x13, 0x0f, 0x0b, 0x13, + 0x09, 0x03, 0x0a, 0x0e, 0x17, 0x17, 0x0e, 0x07, 0x03, 0x06, 0x05, 0x01, + 0x00, 0x00, 0x01, 0xff, 0x0a, 0x07, 0xff, 0xfd, 0xfe, 0xff, 0xfe, 0xfa, + 0xf3, 0xf1, 0xf3, 0x06, 0x06, 0x0e, 0x0d, 0x10, 0x16, 0x17, 0x0e, 0xfd, + 0xf3, 0xf1, 0xec, 0xed, 0xfa, 0xfd, 0x03, 0x0b, 0x10, 0x12, 0x12, 0x0f, + 0x0a, 0x06, 0x01, 0x00, 0x01, 0xfd, 0xfb, 0x0a, 0x0a, 0x05, 0x09, 0x03, + 0x06, 0x06, 0x02, 0x0b, 0x03, 0x00, 0xfb, 0x02, 0x09, 0x09, 0x07, 0x0b, + 0x09, 0x09, 0x0f, 0x13, 0x09, 0x0d, 0x0b, 0x05, 0xff, 0xf6, 0xf2, 0xf5, + 0xf7, 0xf2, 0xf9, 0xfe, 0x02, 0x0a, 0x07, 0x05, 0x05, 0x05, 0x01, 0xfd, + 0xff, 0xff, 0x0a, 0x07, 0x0b, 0x13, 0x14, 0x13, 0x0f, 0x06, 0x05, 0x05, + 0xf7, 0xf6, 0xf7, 0xfb, 0x03, 0xf7, 0xfb, 0x06, 0x0b, 0x14, 0x09, 0x03, + 0xfb, 0x00, 0xff, 0xfb, 0x02, 0x07, 0x10, 0x07, 0xfd, 0xfa, 0xf5, 0xfd, + 0x00, 0xfe, 0x00, 0xff, 0x06, 0x0e, 0x13, 0x13, 0x1a, 0x0a, 0x0f, 0x0e, + 0x0f, 0x16, 0x0e, 0x0a, 0xff, 0xff, 0xff, 0xfe, 0x03, 0x01, 0x05, 0xfb, + 0xf9, 0xfd, 0x02, 0x0b, 0x07, 0xf5, 0xfb, 0xff, 0xf3, 0xea, 0xea, 0xee, + 0xfa, 0x02, 0x12, 0x0f, 0x1f, 0x29, 0x1c, 0x10, 0x03, 0xfa, 0xf6, 0xf9, + 0x00, 0x01, 0xff, 0xfb, 0x02, 0x02, 0x09, 0x0e, 0x0d, 0x0d, 0x05, 0x00, + 0xfb, 0xf7, 0xfa, 0x00, 0x0d, 0x0b, 0x05, 0x06, 0x12, 0x1d, 0x07, 0x02, + 0x06, 0x06, 0x06, 0x12, 0x0d, 0x06, 0x0d, 0x07, 0x01, 0xff, 0xfd, 0x05, + 0x03, 0x03, 0x02, 0x00, 0xfb, 0xfe, 0xfa, 0xed, 0xe3, 0xec, 0xf6, 0xfe, + 0xfe, 0x02, 0x06, 0x06, 0x0b, 0x0f, 0x0e, 0x07, 0x06, 0x0e, 0x06, 0x05, + 0x09, 0x0d, 0x17, 0x20, 0x17, 0x18, 0x12, 0x0b, 0xfd, 0xf2, 0xf1, 0xf7, + 0xf9, 0xfb, 0xfb, 0xff, 0xff, 0x07, 0x06, 0x00, 0xf9, 0xf6, 0xf9, 0x03, + 0x12, 0x10, 0x0e, 0x18, 0x14, 0x0f, 0x06, 0xfb, 0xfd, 0xfe, 0xfd, 0xff, + 0xfd, 0x03, 0x0b, 0x07, 0x03, 0x07, 0x0a, 0x0e, 0x18, 0x13, 0x0d, 0x02, + 0xfb, 0xfd, 0xf6, 0xf6, 0xff, 0x03, 0xfa, 0xee, 0xf7, 0xfa, 0xf9, 0xfd, + 0x02, 0x0f, 0x12, 0x0a, 0x00, 0x00, 0xfe, 0xfa, 0xfb, 0xfe, 0x00, 0x05, + 0x1d, 0x2e, 0x2c, 0x1c, 0x13, 0x0b, 0xfd, 0xf3, 0xfe, 0xff, 0xff, 0xf7, + 0xf6, 0xf7, 0x00, 0x07, 0x0d, 0x0b, 0x0a, 0x09, 0xfe, 0xf9, 0xf7, 0xf2, + 0xf7, 0xfe, 0x09, 0x13, 0x18, 0x0b, 0x03, 0x02, 0x01, 0x02, 0x03, 0x0a, + 0x1b, 0x1d, 0x1b, 0x07, 0x03, 0x01, 0xfd, 0xf7, 0xf5, 0xf9, 0x00, 0x00, + 0x03, 0xfe, 0xf9, 0xfa, 0xf5, 0xf3, 0xf6, 0xf2, 0x00, 0x07, 0x03, 0x05, + 0x06, 0x02, 0x00, 0x0d, 0x16, 0x0e, 0x0f, 0x09, 0x06, 0x02, 0x02, 0x12, + 0x1b, 0x10, 0x16, 0x16, 0x06, 0x06, 0x06, 0x00, 0xf9, 0xf5, 0xfa, 0x03, + 0x0b, 0x0d, 0x10, 0x02, 0xfa, 0xfa, 0xfd, 0x02, 0xf9, 0xf5, 0x00, 0x06, + 0x05, 0x03, 0xfd, 0xfa, 0xf5, 0x00, 0x05, 0xff, 0xf6, 0xf3, 0xfd, 0x07, + 0x07, 0x0a, 0x09, 0x13, 0x24, 0x29, 0x23, 0x12, 0x07, 0x02, 0xfd, 0x00, + 0x00, 0x06, 0x03, 0xf5, 0xf6, 0xf6, 0xf2, 0xf9, 0xfe, 0x00, 0x00, 0x02, + 0x02, 0xff, 0xf6, 0xed, 0xea, 0xea, 0xfa, 0x0f, 0x1d, 0x27, 0x34, 0x2d, + 0x23, 0x20, 0x1b, 0x12, 0x0e, 0x0a, 0x0b, 0xff, 0xfb, 0xfb, 0xf5, 0xf2, + 0xf5, 0xfa, 0xfe, 0x01, 0x01, 0xfb, 0xfa, 0xf3, 0xfa, 0xfe, 0xf9, 0xf7, + 0x06, 0xfe, 0xff, 0x02, 0xfb, 0xf9, 0xff, 0x07, 0x1a, 0x1f, 0x1c, 0x1b, + 0x17, 0x16, 0x0b, 0x06, 0x07, 0x02, 0xff, 0x05, 0x01, 0x00, 0xfb, 0xf7, + 0xfb, 0xf6, 0xea, 0xee, 0x06, 0x0d, 0x03, 0xf7, 0xfe, 0x03, 0x10, 0x0f, + 0x0a, 0x01, 0xfb, 0x00, 0x0b, 0x0b, 0x00, 0xfd, 0x07, 0x18, 0x18, 0x17, + 0x0d, 0x09, 0x07, 0x01, 0xfd, 0xfa, 0xfb, 0xfe, 0x13, 0x1a, 0x10, 0x0a, + 0x0a, 0x06, 0x00, 0xf5, 0xee, 0xf2, 0xfe, 0xff, 0xfb, 0xff, 0x01, 0x03, + 0xfe, 0xf1, 0xee, 0xf2, 0xf7, 0xfe, 0x00, 0xff, 0xfe, 0xfb, 0x0b, 0x16, + 0x24, 0x2c, 0x25, 0x1a, 0x14, 0x1a, 0x14, 0x05, 0xff, 0xff, 0xff, 0xfa, + 0xfe, 0x09, 0x05, 0xfa, 0xf2, 0xfb, 0xff, 0x01, 0x03, 0xfe, 0xfe, 0xfe, + 0xfb, 0xf2, 0xee, 0xf6, 0x02, 0x0b, 0x13, 0x16, 0x14, 0x16, 0x18, 0x13, + 0x16, 0x0f, 0x0a, 0x09, 0x0a, 0x05, 0xfe, 0xf5, 0xf3, 0xf5, 0xfa, 0x02, + 0x02, 0xfe, 0x00, 0xfe, 0x01, 0xfd, 0xf6, 0xf7, 0x03, 0x07, 0x07, 0xfa, + 0xfe, 0x06, 0x06, 0x02, 0x05, 0x07, 0x0d, 0x09, 0x06, 0x0e, 0x12, 0x0a, + 0x03, 0x05, 0x02, 0x05, 0x0d, 0x09, 0x03, 0x02, 0x02, 0x01, 0xfe, 0xfa, + 0x0b, 0x0f, 0x14, 0x0d, 0x0e, 0x0f, 0x06, 0xfb, 0xf6, 0xf9, 0xf6, 0xf5, + 0xfb, 0xff, 0x03, 0x05, 0x03, 0x0f, 0x0a, 0x02, 0xf7, 0xf9, 0xfb, 0x01, + 0xfe, 0xf6, 0xfa, 0x03, 0x0e, 0x12, 0x14, 0x12, 0x13, 0x14, 0x0b, 0x0f, + 0x0a, 0x02, 0x00, 0x02, 0x05, 0x03, 0xff, 0xff, 0xfe, 0xf3, 0xe6, 0xed, + 0xf2, 0xf2, 0xf9, 0x05, 0x0a, 0x02, 0xfb, 0x09, 0x1c, 0x21, 0x17, 0x14, + 0x14, 0x18, 0x14, 0x0d, 0x0d, 0x0a, 0x03, 0xfb, 0xfe, 0xfb, 0xff, 0x01, + 0xfd, 0xff, 0x05, 0x00, 0x01, 0x00, 0x00, 0xff, 0xfd, 0xf6, 0xf2, 0xf3, + 0x02, 0x03, 0x03, 0x14, 0x24, 0x1a, 0x0e, 0x0a, 0x0b, 0x09, 0x06, 0x05, + 0x02, 0x01, 0xf9, 0xfa, 0xfb, 0xfd, 0xfb, 0xfb, 0x00, 0xff, 0xfd, 0x01, + 0x07, 0x05, 0x01, 0x06, 0x17, 0x10, 0xff, 0xfb, 0x03, 0x07, 0x07, 0x01, + 0x00, 0x02, 0x0a, 0x12, 0x0f, 0x16, 0x13, 0x0b, 0x07, 0x07, 0x0b, 0x07, + 0x05, 0xfb, 0xf2, 0xee, 0xec, 0xf2, 0xfe, 0x07, 0x09, 0x06, 0x06, 0x09, + 0x1a, 0x14, 0x0a, 0x09, 0x0d, 0x0a, 0xfd, 0xf9, 0xfa, 0xf9, 0xfb, 0xfa, + 0xfb, 0xfd, 0x06, 0x0d, 0x05, 0xf9, 0xf9, 0xff, 0x00, 0x05, 0xff, 0x06, + 0x18, 0x0d, 0x03, 0xff, 0x07, 0x0a, 0xff, 0x03, 0x0d, 0x0d, 0x0a, 0x13, + 0x0e, 0x03, 0x02, 0x09, 0x0a, 0x07, 0x06, 0xf9, 0xf7, 0xf9, 0xf9, 0xfd, + 0xfe, 0x05, 0x0d, 0x0d, 0x16, 0x0b, 0x03, 0x06, 0x1b, 0x20, 0x14, 0x0e, + 0x05, 0x02, 0xff, 0xfe, 0xf1, 0xe8, 0xec, 0xee, 0xee, 0xf6, 0x06, 0x02, + 0x00, 0xfe, 0xff, 0xfb, 0xfd, 0x03, 0x05, 0x0a, 0x13, 0x0d, 0x0a, 0x0b, + 0x12, 0x1b, 0x13, 0x0e, 0x0e, 0x09, 0x05, 0xfb, 0x01, 0x03, 0x06, 0x06, + 0x01, 0xfd, 0xfd, 0x00, 0xff, 0xf6, 0xf9, 0xf6, 0xf7, 0xfb, 0xff, 0x14, + 0x1b, 0x12, 0x07, 0xfe, 0x00, 0x02, 0x07, 0x09, 0x03, 0x01, 0x05, 0x03, + 0x0a, 0x0e, 0x09, 0x07, 0x06, 0x01, 0x01, 0x02, 0x05, 0x06, 0x09, 0x09, + 0xff, 0xfa, 0xfd, 0x01, 0x0e, 0x07, 0xf9, 0xf9, 0x02, 0x01, 0x00, 0x00, + 0x02, 0x09, 0x09, 0x02, 0xf7, 0xf2, 0xf9, 0x03, 0x06, 0x0a, 0x02, 0x03, + 0x0a, 0x09, 0x02, 0xfa, 0xfd, 0xfe, 0x00, 0x07, 0x18, 0x18, 0x0e, 0x09, + 0x14, 0x13, 0x0a, 0x09, 0x06, 0x02, 0x03, 0x03, 0x05, 0x01, 0xfe, 0xfe, + 0xf6, 0xee, 0xf9, 0x00, 0x01, 0xf3, 0xf2, 0xf6, 0x00, 0x07, 0x0e, 0x16, + 0x23, 0x20, 0x14, 0x0e, 0x0e, 0x07, 0x01, 0x09, 0x0e, 0x07, 0xff, 0xfd, + 0xf7, 0xf3, 0xf6, 0xf6, 0xf0, 0xf6, 0xf7, 0xfb, 0x00, 0xfb, 0xff, 0xfb, + 0xfa, 0xf3, 0xee, 0xfa, 0x0e, 0x14, 0x13, 0x0e, 0x12, 0x10, 0x1c, 0x2e, + 0x29, 0x17, 0x12, 0x14, 0x06, 0xff, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, + 0xfe, 0xfa, 0xfb, 0xf7, 0xf9, 0xf9, 0xff, 0x09, 0x09, 0x09, 0x05, 0xff, + 0x00, 0xf3, 0xea, 0xee, 0xf7, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x0d, 0x0f, + 0x12, 0x0d, 0x0b, 0x0a, 0x06, 0x02, 0x05, 0x0a, 0x09, 0x07, 0x07, 0x07, + 0x09, 0x0f, 0x09, 0x01, 0xff, 0x07, 0x05, 0x05, 0x03, 0x0e, 0x07, 0x01, + 0xfe, 0xfb, 0xfe, 0xf9, 0xf2, 0xf6, 0xfe, 0x03, 0xfd, 0x03, 0x0d, 0x06, + 0xff, 0x05, 0x0f, 0x0b, 0x09, 0x13, 0x0e, 0x0d, 0x0f, 0x0d, 0x03, 0x02, + 0xff, 0x03, 0x01, 0xff, 0xf7, 0xfd, 0x0e, 0x0e, 0x05, 0x05, 0x05, 0x03, + 0xfe, 0xfa, 0xff, 0xf2, 0xf1, 0xf6, 0xf6, 0xf3, 0x00, 0x1b, 0x18, 0x16, + 0x12, 0x0f, 0x09, 0x0e, 0x0b, 0x0b, 0x0b, 0x09, 0x05, 0xff, 0xfb, 0xfa, + 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0x02, 0x03, 0x03, 0x07, 0x06, 0x06, 0x03, + 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x09, 0x05, 0xff, 0x02, 0x0b, 0x1a, 0x14, + 0x05, 0x06, 0x06, 0x00, 0x09, 0x03, 0x06, 0x05, 0x05, 0x06, 0x07, 0x06, + 0xfe, 0xf7, 0xfa, 0xfb, 0xfe, 0x09, 0x01, 0x01, 0xfb, 0x00, 0xfb, 0xf2, + 0xf6, 0xf7, 0xfd, 0x06, 0xff, 0xfa, 0xf7, 0xfa, 0x05, 0x02, 0x05, 0x05, + 0x07, 0x05, 0x07, 0x0d, 0x0b, 0x0e, 0x18, 0x18, 0x1c, 0x23, 0x24, 0x1c, + 0x0d, 0x07, 0xfe, 0xfb, 0x00, 0x02, 0x00, 0xff, 0xfe, 0xfe, 0x00, 0x01, + 0xfd, 0xfd, 0x02, 0xff, 0xf6, 0xf7, 0x00, 0xff, 0x00, 0xfe, 0xf5, 0xf5, + 0xf6, 0x09, 0x17, 0x0d, 0x05, 0x06, 0x12, 0x13, 0x0b, 0x06, 0x06, 0x05, + 0x00, 0xfe, 0xfb, 0xfe, 0x02, 0x02, 0x05, 0x02, 0xfd, 0xfe, 0x03, 0x02, + 0x02, 0x02, 0x02, 0x01, 0xff, 0x09, 0x14, 0x1b, 0x13, 0x0a, 0x0a, 0x0a, + 0x02, 0xfe, 0x01, 0x06, 0x05, 0x00, 0xff, 0x07, 0x0e, 0x06, 0xff, 0xfb, + 0xf6, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x00, 0x02, 0x02, 0x07, 0x00, + 0x03, 0x06, 0x09, 0x0d, 0x0b, 0x0b, 0x0f, 0x18, 0x1a, 0x16, 0x0e, 0x03, + 0xfe, 0xf3, 0xf5, 0xf2, 0xf6, 0x00, 0x05, 0x02, 0xff, 0x09, 0x0e, 0x09, + 0x01, 0xfb, 0x06, 0x0d, 0x0a, 0x03, 0xfe, 0xfb, 0xfb, 0xf5, 0xf3, 0xf5, + 0xfb, 0xff, 0x02, 0x03, 0x0b, 0x0f, 0x14, 0x0f, 0x0b, 0x0d, 0x0a, 0x06, + 0x03, 0x02, 0x05, 0x01, 0x00, 0x01, 0x18, 0x20, 0x1a, 0x14, 0x0f, 0x18, + 0x03, 0xf9, 0xfe, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0xfe, 0xfd, 0x01, + 0xf6, 0xf2, 0xf3, 0xf5, 0xf3, 0xfa, 0x0d, 0x0a, 0x00, 0xfa, 0x00, 0x0d, + 0x0a, 0x07, 0xff, 0xfb, 0xfb, 0xf7, 0xff, 0x02, 0x12, 0x0f, 0x05, 0x01, + 0x07, 0x10, 0x13, 0x0d, 0x05, 0x05, 0x14, 0x14, 0x0e, 0x07, 0x06, 0x02, + 0xfa, 0xf7, 0xfb, 0x06, 0x09, 0x13, 0x0d, 0x0d, 0x0f, 0x05, 0x06, 0x00, + 0x05, 0x09, 0x06, 0x01, 0xfa, 0xf3, 0xf6, 0xf3, 0xf3, 0xf2, 0x00, 0xfe, + 0xfe, 0x00, 0x09, 0x0b, 0x05, 0x01, 0x02, 0x0a, 0x09, 0x06, 0x02, 0xfe, + 0xff, 0xfd, 0xff, 0x01, 0x03, 0x0f, 0x13, 0x14, 0x13, 0x13, 0x1a, 0x03, + 0xfd, 0x00, 0x06, 0x09, 0x00, 0xfb, 0xfe, 0x00, 0xfb, 0xff, 0xff, 0x0d, + 0x13, 0x0b, 0x06, 0x00, 0x03, 0x03, 0x02, 0x00, 0xf7, 0xfa, 0x03, 0x05, + 0xff, 0xf7, 0xf7, 0x00, 0x07, 0x0b, 0x09, 0x01, 0xff, 0x01, 0x0a, 0x10, + 0x09, 0x02, 0x09, 0x1b, 0x1f, 0x1c, 0x13, 0x05, 0x05, 0x03, 0xf9, 0xe6, + 0xf0, 0x02, 0x09, 0x05, 0x02, 0x01, 0xff, 0xff, 0xfd, 0x00, 0xfe, 0xfb, + 0xfa, 0xf9, 0xfa, 0xfd, 0x06, 0x02, 0x01, 0x01, 0x03, 0x06, 0x0b, 0x02, + 0x01, 0x17, 0x12, 0x0b, 0x0d, 0x0d, 0x10, 0x14, 0x0a, 0x00, 0xfa, 0xf7, + 0xfa, 0x00, 0x06, 0x12, 0x0f, 0x0b, 0x0d, 0x14, 0x13, 0x0f, 0xfd, 0xf2, + 0x05, 0x07, 0x03, 0xfe, 0xff, 0x03, 0x01, 0x06, 0x06, 0x06, 0x01, 0x01, + 0x00, 0x00, 0xfb, 0xff, 0xfe, 0x00, 0x02, 0x00, 0xfa, 0xf5, 0xf2, 0xee, + 0xed, 0xf6, 0xf9, 0xfd, 0x0d, 0x17, 0x0d, 0x06, 0x02, 0x0f, 0x0b, 0x09, + 0x09, 0x0b, 0x12, 0x1f, 0x23, 0x17, 0x13, 0x1a, 0x16, 0x07, 0xf6, 0xfa, + 0x00, 0xfe, 0xfd, 0xfe, 0x00, 0x03, 0x01, 0x05, 0x0b, 0x0b, 0x00, 0xf9, + 0xf1, 0xf9, 0xf9, 0xf7, 0xfa, 0xf7, 0x02, 0x0a, 0x07, 0x00, 0x00, 0x06, + 0x05, 0x03, 0x00, 0x09, 0x07, 0x02, 0x01, 0xff, 0x03, 0x03, 0xff, 0xfe, + 0x02, 0x12, 0x0d, 0x09, 0x07, 0x06, 0x14, 0x1c, 0x17, 0x02, 0xfb, 0x00, + 0x05, 0x07, 0xfb, 0xf9, 0xfa, 0xf6, 0xf7, 0x00, 0x0f, 0x0e, 0x07, 0x05, + 0x07, 0xff, 0x01, 0x0a, 0x06, 0x0b, 0x0f, 0x09, 0xfb, 0xf5, 0xfe, 0x07, + 0x02, 0xff, 0x05, 0x0b, 0x09, 0x06, 0xff, 0x00, 0x06, 0x05, 0x00, 0x03, + 0x09, 0x10, 0x0d, 0x07, 0x03, 0xff, 0xfe, 0x03, 0x00, 0xfa, 0x0e, 0x0d, + 0x01, 0xf9, 0xfe, 0x0f, 0x0e, 0x09, 0x0a, 0x0b, 0x01, 0xff, 0xfa, 0x00, + 0x03, 0xf7, 0xf5, 0xfe, 0x01, 0x01, 0xff, 0xf6, 0xf1, 0xf5, 0xfb, 0x05, + 0x0f, 0x14, 0x1b, 0x0f, 0x00, 0xf9, 0xf7, 0x02, 0x09, 0x07, 0x0e, 0x13, + 0x1a, 0x16, 0x1f, 0x20, 0x1c, 0x1b, 0x17, 0x0f, 0x06, 0xf5, 0xf2, 0xf2, + 0xf0, 0xf5, 0xfb, 0xf9, 0xf7, 0xf9, 0x02, 0x01, 0xfa, 0xf1, 0xee, 0xf9, + 0x07, 0x16, 0x10, 0x0b, 0x01, 0x00, 0x01, 0xfa, 0xf2, 0xf9, 0xf7, 0xf7, + 0xfb, 0x03, 0x17, 0x0b, 0x07, 0x12, 0x0f, 0x10, 0x0a, 0x09, 0x0b, 0x0d, + 0x07, 0x05, 0x05, 0x0e, 0x1b, 0x1a, 0x14, 0x12, 0x00, 0xf3, 0xf7, 0xfb, + 0x00, 0x01, 0xff, 0x07, 0x03, 0x02, 0x02, 0xfa, 0xfb, 0xfa, 0xfb, 0xf5, + 0xee, 0xfb, 0x06, 0x16, 0x17, 0x0b, 0x01, 0x01, 0xff, 0x0b, 0x07, 0x09, + 0x06, 0x00, 0xff, 0x00, 0x02, 0x02, 0x00, 0xfb, 0x01, 0xfd, 0xfb, 0xfa, + 0x03, 0x0a, 0x0a, 0x06, 0x0a, 0x14, 0x16, 0x18, 0x09, 0xf9, 0xf1, 0xf1, + 0xfa, 0x07, 0x12, 0x0f, 0x0d, 0x13, 0x12, 0x0f, 0x10, 0x10, 0x0d, 0x02, + 0xff, 0xfa, 0xf7, 0xf2, 0xf7, 0xf7, 0x00, 0xfe, 0xf0, 0xf2, 0xf5, 0x00, + 0x09, 0x02, 0xfb, 0xf7, 0xfe, 0x0b, 0x16, 0x1f, 0x1a, 0x0f, 0x0d, 0x09, + 0x07, 0x13, 0x0e, 0x10, 0x13, 0x0b, 0x07, 0x0b, 0xfe, 0xf6, 0xfa, 0x00, + 0xff, 0xf9, 0xf6, 0xf5, 0xfd, 0xfa, 0xf1, 0xf3, 0xfd, 0xfe, 0xff, 0x06, + 0x03, 0x03, 0x00, 0x05, 0x05, 0x0a, 0x0b, 0x0d, 0x01, 0x02, 0x06, 0x0a, + 0x07, 0x10, 0x09, 0x07, 0x02, 0x00, 0x00, 0x01, 0x0a, 0x1b, 0x14, 0x0b, + 0x0f, 0x14, 0x17, 0x1b, 0x13, 0x09, 0x00, 0xfd, 0xed, 0xf2, 0xf9, 0xf9, + 0xf7, 0xfa, 0xf7, 0xf9, 0xfb, 0xfa, 0xf7, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x05, 0x17, 0x07, 0x03, 0x01, 0xfe, 0x00, 0x03, 0x02, 0x00, 0xfd, 0x0a, + 0x0b, 0x06, 0x07, 0x0d, 0x0a, 0x05, 0x01, 0x01, 0x00, 0x00, 0x02, 0x03, + 0x0b, 0x09, 0x0b, 0x0e, 0x0e, 0x16, 0x0e, 0xff, 0xf2, 0xfe, 0x03, 0x06, + 0x12, 0x20, 0x1a, 0x10, 0x0a, 0x02, 0x01, 0x00, 0xfd, 0xf7, 0xf9, 0xf5, + 0xf2, 0xfd, 0xff, 0xfd, 0x00, 0x06, 0x03, 0xf3, 0xe4, 0xea, 0xfa, 0x00, + 0x05, 0x09, 0x05, 0x07, 0x0f, 0x17, 0x0f, 0x0e, 0x0d, 0x0b, 0x0e, 0x10, + 0x18, 0x16, 0x12, 0x10, 0x0e, 0x0a, 0x07, 0xfa, 0xe9, 0xf5, 0xf3, 0xf6, + 0xf3, 0xf3, 0xfe, 0x0b, 0x07, 0x03, 0x07, 0x12, 0x0b, 0x0b, 0x05, 0x00, + 0x00, 0x00, 0x03, 0x05, 0x03, 0x09, 0x09, 0x00, 0xf6, 0xfb, 0xfe, 0x00, + 0x09, 0x0e, 0x07, 0x00, 0x00, 0x07, 0x0b, 0x14, 0x0b, 0x07, 0x07, 0x07, + 0x01, 0x07, 0x0e, 0x10, 0x0e, 0x12, 0x0a, 0xf9, 0xf5, 0xfb, 0xf7, 0xf0, + 0xf6, 0xfb, 0xf9, 0xf7, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, + 0x0b, 0x0a, 0x0b, 0x10, 0x10, 0x0b, 0x16, 0x0a, 0x05, 0x02, 0x0b, 0x0d, + 0x03, 0xf9, 0xf7, 0xfb, 0xff, 0x00, 0x00, 0x0a, 0x06, 0x05, 0x0f, 0x10, + 0x0b, 0x01, 0xfe, 0x02, 0x0b, 0x07, 0x06, 0xfd, 0xfe, 0x01, 0x01, 0x07, + 0x0f, 0x0d, 0x09, 0x09, 0x06, 0x00, 0xfe, 0x00, 0x02, 0x0a, 0x05, 0xfd, + 0xf6, 0xf2, 0xf6, 0xf9, 0xf1, 0xf1, 0xf0, 0xe8, 0xf6, 0x07, 0x07, 0x0e, + 0x14, 0x0f, 0x0a, 0x13, 0x12, 0x13, 0x0f, 0x10, 0x13, 0x0e, 0x0f, 0x0d, + 0x13, 0x0f, 0x12, 0x13, 0x09, 0x03, 0x00, 0xf7, 0xf3, 0xf3, 0xf7, 0x00, + 0x05, 0x0f, 0x0a, 0x03, 0xfe, 0xf9, 0xf5, 0x02, 0x02, 0x00, 0xfd, 0x0a, + 0x03, 0x03, 0x02, 0x00, 0x00, 0x06, 0xff, 0xf5, 0xf6, 0xfa, 0xff, 0x09, + 0x13, 0x05, 0x00, 0x02, 0x07, 0x18, 0x14, 0x0d, 0x0d, 0x0f, 0x0d, 0x10, + 0x12, 0x18, 0x0b, 0x07, 0x05, 0xfe, 0xf6, 0xe3, 0xdf, 0xf0, 0xf7, 0xff, + 0x00, 0x05, 0x05, 0x01, 0x00, 0x03, 0x09, 0x09, 0x01, 0x03, 0x0b, 0x0e, + 0x0e, 0x13, 0x12, 0x0f, 0x1a, 0x13, 0x06, 0xfe, 0x03, 0x05, 0xfd, 0xf7, + 0xf6, 0xfd, 0x00, 0x05, 0x02, 0x02, 0xfa, 0xf6, 0xf3, 0xfb, 0xfd, 0xff, + 0xff, 0xff, 0x0e, 0x1c, 0x18, 0x1b, 0x10, 0x00, 0x01, 0x03, 0x00, 0x05, + 0x0d, 0x0a, 0x07, 0x03, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02, 0xfa, 0xf5, + 0xec, 0xf2, 0xfa, 0xfb, 0x02, 0x00, 0x00, 0x09, 0x00, 0x02, 0x0e, 0x0d, + 0x0a, 0x0e, 0x10, 0x0a, 0x09, 0x1a, 0x1b, 0x10, 0x07, 0x07, 0x0a, 0x0e, + 0x0b, 0x03, 0x01, 0x03, 0x00, 0xff, 0xfd, 0xf2, 0xf2, 0xf9, 0x00, 0x07, + 0x02, 0x00, 0x05, 0x00, 0x00, 0x06, 0x10, 0x0e, 0x03, 0x02, 0x02, 0xf9, + 0xf2, 0xf5, 0xf9, 0xfe, 0x00, 0xfb, 0xf7, 0x00, 0x01, 0xfa, 0xf9, 0x0a, + 0x13, 0x0a, 0x05, 0x13, 0x20, 0x18, 0x17, 0x16, 0x14, 0x1a, 0x14, 0x0f, + 0x05, 0x00, 0x06, 0x06, 0xfd, 0xfb, 0xfb, 0xee, 0xfa, 0x05, 0x06, 0x01, + 0xff, 0xf5, 0xf2, 0xf6, 0xf9, 0xfd, 0xfe, 0xfe, 0x0d, 0x0d, 0x0a, 0x13, + 0x10, 0x0f, 0x13, 0x0e, 0x07, 0x00, 0xff, 0xfe, 0xfe, 0x03, 0x00, 0xfe, + 0x01, 0x01, 0x00, 0xfe, 0xfd, 0xfd, 0xf5, 0xf7, 0x02, 0x10, 0x13, 0x0b, + 0x13, 0x1a, 0x0f, 0x06, 0x05, 0x10, 0x0a, 0xfb, 0xfe, 0xfd, 0xfb, 0x0d, + 0x0a, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x05, 0x05, 0x01, 0xf9, 0xf5, 0xf9, + 0xfb, 0xff, 0x00, 0xff, 0xf7, 0x05, 0x01, 0xfe, 0x06, 0x13, 0x13, 0x16, + 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0x01, 0xff, 0x06, + 0x00, 0x0b, 0x0f, 0x09, 0x0a, 0x0a, 0x02, 0xf7, 0xfd, 0x06, 0x0d, 0x02, + 0x09, 0x10, 0x0d, 0x07, 0x03, 0x01, 0xf9, 0xf9, 0x00, 0xfb, 0xfb, 0xfe, + 0x00, 0x09, 0x00, 0xf7, 0xf6, 0x00, 0xfd, 0xf5, 0xf3, 0xfd, 0x09, 0x16, + 0x0d, 0x0e, 0x1a, 0x1c, 0x27, 0x29, 0x20, 0x13, 0x12, 0x0a, 0xfe, 0xfa, + 0xfd, 0xfb, 0xfb, 0xfe, 0x00, 0x00, 0xf7, 0xf3, 0xf9, 0xf9, 0xf5, 0xf9, + 0xfa, 0xfd, 0x03, 0x05, 0x0b, 0x0e, 0x14, 0x0e, 0x07, 0x07, 0x0d, 0x0f, + 0x07, 0x07, 0x01, 0xf6, 0xf7, 0x03, 0x02, 0x00, 0xfb, 0xfe, 0xff, 0xfb, + 0xfa, 0xf9, 0xff, 0x01, 0x00, 0x00, 0x07, 0x0d, 0x0d, 0x07, 0x0d, 0x16, + 0x0e, 0x16, 0x1b, 0x16, 0x1d, 0x1c, 0x0b, 0xfa, 0xf7, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xfe, 0xf3, 0xf1, 0x00, 0xfd, 0xf6, 0xf9, 0xfb, + 0xf3, 0xf6, 0xf5, 0x09, 0x0b, 0x09, 0x17, 0x18, 0x17, 0x10, 0x09, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x07, 0x0f, 0x12, 0x0a, 0x03, 0xff, 0x05, 0x09, + 0x03, 0x00, 0x00, 0x07, 0x0a, 0x07, 0xf9, 0xf9, 0x03, 0x0f, 0x16, 0x06, + 0x01, 0x01, 0x01, 0xfe, 0xf9, 0x00, 0x09, 0x05, 0x00, 0x00, 0xfe, 0xfb, + 0xf6, 0xf3, 0xf3, 0xfe, 0x01, 0xfd, 0x00, 0x07, 0x02, 0x05, 0x0f, 0x10, + 0x1c, 0x23, 0x21, 0x1a, 0x12, 0x09, 0x02, 0xfe, 0xf9, 0xf6, 0xfe, 0x07, + 0x05, 0x00, 0x00, 0x02, 0x07, 0x05, 0xf6, 0xfe, 0xfe, 0xfb, 0xfe, 0x00, + 0xfd, 0xfe, 0x00, 0x02, 0x0f, 0x17, 0x12, 0x0a, 0x0d, 0x0d, 0x14, 0x06, + 0x00, 0xfb, 0x00, 0x01, 0x00, 0xf6, 0xf3, 0xf6, 0xf7, 0xfd, 0xfe, 0xfd, + 0xfd, 0x07, 0x06, 0x02, 0x0a, 0x07, 0x06, 0x0a, 0x0d, 0x20, 0x1c, 0x0a, + 0x0a, 0x0d, 0x0e, 0x12, 0x0e, 0x00, 0xf1, 0xf1, 0xf6, 0x06, 0x09, 0x07, + 0x09, 0x0b, 0x09, 0x07, 0x03, 0xfd, 0xf9, 0xf3, 0xf3, 0xf1, 0xf0, 0xed, + 0xf3, 0x0d, 0x16, 0x1a, 0x10, 0x06, 0x03, 0x06, 0x00, 0xfd, 0xff, 0xfe, + 0x02, 0x05, 0x07, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x0f, 0x0f, + 0x12, 0x1a, 0x1f, 0x1a, 0x0f, 0x0d, 0x10, 0x06, 0xfe, 0xfe, 0xf9, 0xf7, + 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0x03, 0x00, 0xf7, 0xf6, 0xf9, 0xf2, 0xec, + 0xf3, 0x00, 0x05, 0x00, 0x01, 0x02, 0x00, 0x01, 0x07, 0x1c, 0x32, 0x25, + 0x21, 0x20, 0x1f, 0x14, 0x0a, 0x02, 0x00, 0x00, 0xfb, 0xf9, 0xf6, 0xf9, + 0xf6, 0x00, 0x0a, 0x07, 0x02, 0xf5, 0xf3, 0xfe, 0xf3, 0xf6, 0xfe, 0x00, + 0x00, 0x05, 0x21, 0x1c, 0x0f, 0x09, 0x07, 0x05, 0x03, 0x02, 0xf9, 0xfb, + 0x00, 0x0d, 0x0b, 0x02, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, + 0xfe, 0x05, 0x00, 0x00, 0x01, 0x07, 0x1a, 0x1f, 0x12, 0x0f, 0x07, 0x0d, + 0x12, 0x14, 0x0d, 0x05, 0x00, 0xf6, 0xf9, 0xf9, 0x00, 0x05, 0x02, 0x05, + 0x02, 0x00, 0x05, 0x07, 0xff, 0x01, 0x00, 0xfb, 0xf6, 0xf1, 0x00, 0x0d, + 0x0d, 0x07, 0x02, 0x00, 0xfe, 0xfe, 0xfb, 0xf9, 0xfb, 0x00, 0x05, 0x07, + 0x02, 0x0d, 0x07, 0x05, 0x00, 0x00, 0x00, 0x05, 0x14, 0x0d, 0x05, 0x0b, + 0x16, 0x1c, 0x1c, 0x24, 0x1b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xf3, 0xe6, 0xec, 0xf0, 0xf1, + 0x07, 0x05, 0x00, 0x00, 0xfe, 0x05, 0x06, 0x17, 0x27, 0x1a, 0x0d, 0x0e, + 0x0d, 0x07, 0x05, 0x05, 0x05, 0x0d, 0x03, 0x00, 0x02, 0x02, 0x07, 0x0d, + 0x14, 0x0f, 0x0a, 0x05, 0xf7, 0xf6, 0xf3, 0xf1, 0xf9, 0x02, 0x02, 0x01, + 0x0d, 0x07, 0x07, 0x00, 0x05, 0x05, 0xfe, 0xf6, 0xf9, 0xf9, 0xfb, 0x02, + 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0d, 0x0f, 0x0a, + 0x07, 0x10, 0x0f, 0x0d, 0x1a, 0x12, 0x06, 0x02, 0x02, 0x00, 0x02, 0x05, + 0x02, 0xfe, 0xfd, 0xfb, 0xf7, 0xff, 0x02, 0x0a, 0x03, 0x00, 0xfe, 0xfb, + 0xfe, 0x05, 0x00, 0xff, 0x07, 0x0d, 0xfb, 0xfb, 0x0d, 0x13, 0x0d, 0x07, + 0x03, 0x02, 0x02, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x05, 0x00, + 0xfe, 0xfb, 0xfd, 0x00, 0x00, 0x0d, 0x17, 0x1a, 0x14, 0x1a, 0x14, 0x12, + 0x1a, 0x21, 0x1a, 0x00, 0xf6, 0xf7, 0xfa, 0xfe, 0x0a, 0x0d, 0x00, 0xfb, + 0xfe, 0x05, 0x07, 0x00, 0xf6, 0xee, 0xee, 0xf1, 0xf0, 0xfb, 0xfb, 0xfb, + 0x00, 0x01, 0xfe, 0xf9, 0xfb, 0x07, 0x0f, 0x1f, 0x1a, 0x12, 0x0f, 0x0a, + 0x05, 0x02, 0x03, 0x01, 0x01, 0x01, 0x09, 0x0e, 0x0b, 0x10, 0x13, 0x0e, + 0x0b, 0x13, 0x06, 0xf5, 0x03, 0x09, 0x06, 0x03, 0x03, 0x0b, 0x06, 0x06, + 0xfd, 0xf7, 0xfb, 0xf6, 0xf0, 0xf0, 0xfa, 0xf2, 0xf2, 0x0a, 0x13, 0x0e, + 0x03, 0x00, 0xfd, 0xfd, 0xf7, 0xfd, 0x03, 0x03, 0x0d, 0x0b, 0x0d, 0x13, + 0x0b, 0x17, 0x1c, 0x1b, 0x10, 0x06, 0x06, 0x09, 0x09, 0x03, 0x06, 0x0d, + 0x09, 0x06, 0xfa, 0xf2, 0xf5, 0xfb, 0xfd, 0xf7, 0xf1, 0xf2, 0x01, 0x18, + 0x1d, 0x0b, 0xf2, 0xf2, 0xf2, 0x03, 0x09, 0x09, 0x03, 0xff, 0x01, 0x09, + 0x13, 0x0d, 0x06, 0x03, 0x02, 0x06, 0x0b, 0x0d, 0x07, 0x01, 0xfe, 0xfe, + 0xff, 0x03, 0x03, 0x09, 0x10, 0x16, 0x0e, 0x06, 0x01, 0x03, 0x13, 0x10, + 0x20, 0x13, 0xf6, 0xf7, 0x02, 0x01, 0xff, 0xfb, 0xf2, 0xf2, 0xff, 0x02, + 0xf7, 0xfd, 0x02, 0x00, 0x02, 0x03, 0xfd, 0x01, 0x03, 0x00, 0x00, 0xfd, + 0xfd, 0xfd, 0x0b, 0x09, 0x0e, 0x09, 0x01, 0x01, 0x03, 0x09, 0x0b, 0x03, + 0x00, 0x09, 0x25, 0x23, 0x13, 0x09, 0x06, 0x03, 0x09, 0x0b, 0x06, 0x10, + 0x13, 0x05, 0x03, 0x07, 0x06, 0x01, 0x05, 0x05, 0x01, 0x00, 0xfb, 0xf1, + 0xf6, 0xee, 0xec, 0xf6, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xf6, + 0xf6, 0xf7, 0xfe, 0x0f, 0x1a, 0x14, 0x0f, 0x07, 0x05, 0x02, 0x0d, 0x0e, + 0x09, 0x0f, 0x0a, 0x12, 0x17, 0x14, 0x0f, 0x09, 0x07, 0x07, 0x07, 0x0a, + 0x07, 0xf9, 0xf9, 0xfb, 0x05, 0x00, 0x00, 0x02, 0x03, 0x02, 0xfe, 0xf9, + 0xf2, 0xf3, 0xf7, 0x00, 0x00, 0x0a, 0x07, 0xfe, 0xfe, 0x02, 0x02, 0x00, + 0x00, 0xfe, 0x00, 0x03, 0x0f, 0x0a, 0x00, 0xff, 0x02, 0x06, 0x0d, 0x0f, + 0x0d, 0x0b, 0x07, 0x0d, 0x07, 0x02, 0x01, 0x12, 0x14, 0x1c, 0x12, 0x0d, + 0x00, 0xf5, 0xf6, 0xf6, 0xf1, 0xf1, 0xfb, 0x09, 0x02, 0x00, 0xfb, 0xf6, + 0xf6, 0xff, 0x0f, 0x07, 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, + 0x05, 0x05, 0x07, 0x0d, 0x09, 0x05, 0x00, 0x02, 0x09, 0x0a, 0x10, 0x14, + 0x0f, 0x0a, 0x02, 0xff, 0x00, 0xfe, 0x0a, 0x09, 0x0f, 0x18, 0x0d, 0x01, + 0xfb, 0xfb, 0xfd, 0x02, 0xfe, 0xf6, 0xfe, 0xfb, 0xfd, 0xf6, 0xf1, 0xf5, + 0xfe, 0x02, 0x0d, 0x05, 0x01, 0xfe, 0xf9, 0xfb, 0x02, 0x0a, 0x17, 0x0f, + 0x07, 0x05, 0x05, 0x00, 0xfe, 0xf9, 0xf6, 0x07, 0x0f, 0x0d, 0x1c, 0x1a, + 0x14, 0x17, 0x0e, 0x07, 0x05, 0x05, 0x07, 0x0f, 0x0f, 0x0a, 0x02, 0xf6, + 0xfe, 0x0a, 0x0f, 0x06, 0x00, 0xf7, 0xf9, 0xfd, 0xfe, 0xf9, 0xf6, 0xfb, + 0x00, 0xfb, 0x00, 0xfe, 0xf3, 0xf3, 0xf3, 0xf3, 0xfb, 0xff, 0xfe, 0x02, + 0x10, 0x07, 0x00, 0x07, 0x0a, 0x0f, 0x0d, 0x0b, 0x0f, 0x0e, 0x0b, 0x09, + 0x0a, 0x14, 0x12, 0x12, 0x1c, 0x0f, 0x14, 0x1c, 0x18, 0x0f, 0xfb, 0xf3, + 0xfb, 0x01, 0xfe, 0xf5, 0xec, 0xf1, 0xf3, 0xf9, 0xf3, 0xfe, 0x00, 0x00, + 0x00, 0x07, 0x07, 0xfe, 0xfa, 0xfb, 0xfb, 0xfb, 0x02, 0x02, 0x09, 0x0b, + 0x0a, 0x10, 0x07, 0x02, 0x06, 0x0d, 0x12, 0x17, 0x12, 0x0d, 0x06, 0x07, + 0x06, 0x0a, 0x05, 0x02, 0x05, 0x07, 0x0a, 0x0f, 0x07, 0xf9, 0xf1, 0xf9, + 0x00, 0xf9, 0xf3, 0xfa, 0xf9, 0xfe, 0xfe, 0xf6, 0xf3, 0xfe, 0x02, 0x07, + 0x0f, 0x07, 0x02, 0x05, 0x0d, 0x17, 0x1a, 0x14, 0x0d, 0x07, 0x03, 0x00, + 0xfe, 0xfa, 0xf6, 0xfe, 0x07, 0x03, 0x09, 0x10, 0x0f, 0x07, 0x07, 0x07, + 0x06, 0x00, 0x00, 0x02, 0x0b, 0x0b, 0x0a, 0x0a, 0x05, 0xf9, 0xf9, 0x07, + 0x0d, 0x01, 0xf6, 0xf9, 0xfb, 0xfe, 0x00, 0x00, 0x05, 0x02, 0x03, 0x00, + 0x00, 0xfb, 0xf6, 0xf1, 0xf5, 0xfb, 0x00, 0x07, 0x0a, 0x05, 0x07, 0x07, + 0x12, 0x0a, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0f, 0x07, 0x05, 0x0d, 0x0f, + 0x17, 0x1f, 0x1a, 0x17, 0x20, 0x17, 0x14, 0x12, 0x00, 0xfb, 0xfd, 0xfe, + 0xee, 0xe9, 0xf3, 0xf3, 0xf6, 0xf6, 0xfb, 0x00, 0x00, 0x00, 0xfb, 0xf6, + 0xf1, 0xf0, 0xf0, 0xea, 0xf9, 0xfb, 0xfa, 0x02, 0x07, 0x00, 0x06, 0x0b, + 0x0d, 0x0f, 0x1a, 0x23, 0x1d, 0x1a, 0x18, 0x17, 0x1a, 0x14, 0x16, 0x12, + 0x12, 0x07, 0x0a, 0x07, 0x0a, 0x06, 0x03, 0xf2, 0xf9, 0x00, 0x00, 0xf1, + 0xf3, 0xf0, 0xea, 0xf1, 0xee, 0xee, 0xec, 0xf1, 0xf9, 0x0f, 0x0e, 0x09, + 0x0e, 0x06, 0x09, 0x17, 0x1d, 0x18, 0x10, 0x0b, 0x06, 0x00, 0x02, 0x02, + 0x0d, 0x0a, 0x00, 0xfb, 0x07, 0x0a, 0x05, 0x01, 0x02, 0x00, 0x00, 0x05, + 0x07, 0x05, 0x00, 0x05, 0x17, 0x07, 0xf9, 0xf1, 0xf3, 0xfe, 0xfb, 0xf9, + 0xf9, 0xfb, 0x00, 0x00, 0x14, 0x23, 0x14, 0x03, 0x0a, 0x07, 0xfe, 0x02, + 0x02, 0xfb, 0xfd, 0x02, 0x0d, 0x0d, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, + 0x06, 0x07, 0x01, 0xfd, 0x01, 0x01, 0xff, 0xfa, 0x10, 0x16, 0x0d, 0x0d, + 0x20, 0x20, 0x16, 0x16, 0x14, 0x07, 0x00, 0x00, 0x02, 0xf6, 0xf1, 0xf1, + 0xf9, 0xfe, 0x00, 0x00, 0x00, 0xfb, 0xf3, 0xfb, 0xfb, 0xf9, 0xf1, 0xec, + 0xf6, 0xfe, 0xfb, 0xfd, 0x00, 0x05, 0x00, 0x0a, 0x12, 0x06, 0x02, 0x0b, + 0x18, 0x1d, 0x1b, 0x1d, 0x1b, 0x14, 0x14, 0x20, 0x23, 0x18, 0x0b, 0x06, + 0x06, 0x0e, 0x0a, 0x05, 0x0b, 0x00, 0xf9, 0xf3, 0xea, 0xe3, 0xe8, 0xf1, + 0xee, 0xed, 0xee, 0xf9, 0xfd, 0xf9, 0xfb, 0x0a, 0x03, 0xff, 0xff, 0x00, + 0xfd, 0xfe, 0x0e, 0x12, 0x09, 0x02, 0xff, 0xff, 0x0e, 0x1c, 0x1b, 0x13, + 0x0f, 0x0d, 0x0f, 0x0e, 0x0d, 0x07, 0x07, 0x0f, 0x0f, 0x06, 0x07, 0x10, + 0x0f, 0x07, 0x05, 0x02, 0xf3, 0xf1, 0xfb, 0xf9, 0xea, 0xea, 0xf6, 0xf2, + 0xfe, 0x03, 0x01, 0x01, 0x0d, 0x02, 0x01, 0x02, 0x01, 0x01, 0x0a, 0x0d, + 0x09, 0x0b, 0x07, 0x0e, 0x0f, 0x0d, 0x10, 0x0b, 0x06, 0x02, 0x00, 0xfd, + 0xf7, 0xf7, 0xf6, 0xf6, 0x00, 0x0f, 0x12, 0x10, 0x0b, 0x0d, 0x0f, 0x0d, + 0x0d, 0x0f, 0x0a, 0xff, 0xf6, 0x00, 0xfb, 0xed, 0xf3, 0xf9, 0x03, 0x0f, + 0x0d, 0x0b, 0x06, 0x00, 0xfe, 0x00, 0xfe, 0xff, 0x05, 0x05, 0xfd, 0xfe, + 0xfd, 0xfb, 0xfe, 0xfe, 0x01, 0x07, 0x07, 0x06, 0x0a, 0x10, 0x0b, 0x12, + 0x16, 0x12, 0x0f, 0x0b, 0x0a, 0x07, 0x0d, 0x16, 0x0f, 0x0a, 0x06, 0x06, + 0x10, 0x1b, 0x01, 0x00, 0xf9, 0xed, 0xe6, 0xe8, 0xf1, 0xf6, 0xf9, 0xf5, + 0xf1, 0xf1, 0xf0, 0xf6, 0x0d, 0x02, 0x00, 0x00, 0x02, 0xfe, 0x01, 0x02, + 0x06, 0x09, 0x05, 0x00, 0x0d, 0x0f, 0x0a, 0x13, 0x1d, 0x14, 0x10, 0x0d, + 0x0b, 0x0e, 0x18, 0x18, 0x13, 0x0f, 0x0e, 0x0d, 0x0d, 0x0a, 0x0e, 0x0e, + 0x06, 0xf5, 0xf1, 0xf5, 0xf1, 0xe5, 0xe4, 0xea, 0xfb, 0x02, 0x05, 0x07, + 0x0b, 0x02, 0xfe, 0xfe, 0xfd, 0xfb, 0xfb, 0xfb, 0xf6, 0xfe, 0x02, 0xfd, + 0x05, 0x03, 0x03, 0x09, 0x16, 0x14, 0x12, 0x0e, 0x06, 0x00, 0x00, 0x01, + 0x0e, 0x10, 0x16, 0x1a, 0x10, 0x0e, 0x07, 0x0e, 0x10, 0x17, 0x17, 0x12, + 0x01, 0xfe, 0xf9, 0xf2, 0xf6, 0xf0, 0xf3, 0xf2, 0xf5, 0xf5, 0xf9, 0x00, + 0xf9, 0xf3, 0xf6, 0xf9, 0x03, 0x10, 0x10, 0x07, 0x01, 0x05, 0x01, 0x02, + 0x07, 0x17, 0x20, 0x13, 0x09, 0x02, 0x05, 0x01, 0x05, 0x0a, 0x0f, 0x0b, + 0x0d, 0x0e, 0x0a, 0x03, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x0e, 0x0a, 0xf7, + 0xfd, 0xfb, 0xf6, 0xf3, 0xf2, 0xf5, 0xfb, 0x02, 0xff, 0xfa, 0x00, 0x00, + 0x05, 0x13, 0x0d, 0x0d, 0x0d, 0x0a, 0x07, 0xfb, 0xfa, 0xfe, 0x00, 0x02, + 0x10, 0x10, 0x10, 0x13, 0x0e, 0x0a, 0x05, 0x01, 0x06, 0x06, 0x02, 0x01, + 0xfe, 0x09, 0x16, 0x0b, 0x0a, 0x10, 0x0b, 0x0a, 0x0b, 0x0f, 0x00, 0xf7, + 0x00, 0xfd, 0xf1, 0xe9, 0xfd, 0x01, 0x00, 0xfb, 0xfd, 0x00, 0xfe, 0xfd, + 0x07, 0x05, 0x03, 0x03, 0x01, 0xfb, 0xf7, 0xf3, 0xf6, 0x01, 0xff, 0xfb, + 0x00, 0x05, 0x0f, 0x17, 0x0b, 0x06, 0x01, 0x03, 0x17, 0x1b, 0x1a, 0x21, + 0x24, 0x1d, 0x16, 0x0a, 0x0b, 0x14, 0x17, 0x0e, 0x0b, 0xf7, 0xf3, 0xee, + 0xf0, 0xfe, 0x00, 0xf2, 0xf3, 0x00, 0xfe, 0xf7, 0xf3, 0xed, 0xe9, 0xed, + 0x00, 0xff, 0xfb, 0xfe, 0x0a, 0x00, 0xfd, 0xfb, 0x00, 0x01, 0x10, 0x12, + 0x14, 0x0b, 0x0e, 0x14, 0x0d, 0x13, 0x12, 0x13, 0x14, 0x16, 0x0e, 0x07, + 0x07, 0x07, 0x00, 0xff, 0x13, 0x1c, 0x18, 0x0a, 0xfd, 0xf2, 0xf2, 0xf6, + 0xfb, 0xf6, 0xea, 0xe6, 0xe9, 0xf5, 0xf6, 0xf3, 0xf1, 0xff, 0x0f, 0x0b, + 0x02, 0x07, 0x0e, 0x0a, 0x0b, 0x05, 0x02, 0x09, 0x20, 0x21, 0x17, 0x12, + 0x16, 0x0e, 0x07, 0x01, 0x03, 0x03, 0x05, 0x05, 0x00, 0xfd, 0xf9, 0xfb, + 0xf6, 0xf7, 0x05, 0xff, 0xf9, 0x02, 0x0d, 0x00, 0xfb, 0x00, 0xfb, 0xfe, + 0x0e, 0x0a, 0xfb, 0x00, 0x0d, 0x07, 0x05, 0x06, 0x07, 0x0a, 0x0f, 0x0e, + 0x06, 0x00, 0xfd, 0xf7, 0xf6, 0xf6, 0x02, 0x00, 0x00, 0x07, 0x05, 0x01, + 0xff, 0x01, 0xfd, 0xfe, 0x0e, 0x0a, 0x05, 0x0b, 0x25, 0x20, 0x16, 0x12, + 0x0f, 0x0f, 0x0f, 0x10, 0x0e, 0x0a, 0x00, 0xf6, 0xf7, 0xfe, 0x05, 0x07, + 0x00, 0xf6, 0xed, 0xf0, 0xed, 0xe9, 0xe6, 0xf2, 0x06, 0x09, 0x0a, 0x05, + 0x01, 0xff, 0xf9, 0xf9, 0xf7, 0xfb, 0xfe, 0x02, 0x03, 0x0d, 0x0b, 0x0b, + 0x0b, 0x0a, 0x0b, 0x1f, 0x1c, 0x1c, 0x16, 0x16, 0x1a, 0x17, 0x12, 0x16, + 0x1f, 0x17, 0x0f, 0x0a, 0x05, 0xf5, 0xed, 0xf1, 0xf9, 0xf3, 0xf7, 0xfe, + 0xfb, 0xed, 0xe6, 0xea, 0xea, 0xe6, 0xf2, 0x02, 0xfe, 0xfd, 0x02, 0x09, + 0x03, 0xfd, 0xfe, 0x09, 0x1b, 0x13, 0x0e, 0x0e, 0x10, 0x16, 0x17, 0x1f, + 0x17, 0x10, 0x13, 0x13, 0x07, 0x00, 0xfb, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, + 0x09, 0x07, 0x03, 0x02, 0xfa, 0xf6, 0xfb, 0x02, 0x0d, 0x02, 0xfe, 0x02, + 0x09, 0xfb, 0xfe, 0x07, 0xff, 0xfd, 0x00, 0x07, 0x03, 0xff, 0xfe, 0x07, + 0x00, 0xfe, 0x01, 0x0a, 0x10, 0x09, 0x05, 0x03, 0x00, 0xfe, 0x01, 0x06, + 0x10, 0x0a, 0x0e, 0x0b, 0x0b, 0x12, 0x0e, 0x07, 0x02, 0x03, 0xff, 0xff, + 0xfb, 0x02, 0x0d, 0x00, 0xfa, 0xfa, 0xfd, 0x02, 0x0d, 0x0a, 0x07, 0x00, + 0xf7, 0xf9, 0xfb, 0x00, 0x0b, 0x09, 0x00, 0x00, 0x03, 0x01, 0xfe, 0xfe, + 0xfb, 0xfe, 0x00, 0x07, 0x0e, 0x05, 0x01, 0xfe, 0xfe, 0x00, 0xfe, 0xfe, + 0x02, 0x0a, 0x1b, 0x1b, 0x0f, 0x13, 0x18, 0x1b, 0x24, 0x20, 0x14, 0x0e, + 0x09, 0x06, 0x00, 0x00, 0xf9, 0xfd, 0xff, 0xfd, 0xf9, 0xf2, 0xee, 0xe9, + 0xdf, 0xe1, 0xe6, 0xf0, 0xfd, 0x0e, 0x07, 0x03, 0x01, 0x00, 0x00, 0xff, + 0x05, 0x09, 0x0d, 0x09, 0x12, 0x13, 0x14, 0x16, 0x17, 0x0f, 0x0f, 0x0f, + 0x12, 0x0d, 0x03, 0x00, 0x05, 0x0b, 0x09, 0x09, 0x07, 0x06, 0x06, 0x03, + 0x00, 0xf5, 0xf6, 0xff, 0x0a, 0x09, 0x09, 0x03, 0x03, 0x03, 0x03, 0xfe, + 0xf7, 0xf0, 0xf3, 0xfa, 0xfb, 0x01, 0xfe, 0xfd, 0x00, 0x00, 0xfa, 0xfb, + 0x00, 0x01, 0x0a, 0x05, 0xfe, 0x01, 0x03, 0x10, 0x24, 0x1f, 0x17, 0x13, + 0x0f, 0x0d, 0x13, 0x0e, 0x0d, 0x07, 0x05, 0x02, 0x02, 0x00, 0xfe, 0x00, + 0xf3, 0xea, 0xf1, 0xf1, 0xfb, 0x01, 0x09, 0x17, 0x0b, 0x0d, 0x09, 0x07, + 0x05, 0x00, 0x02, 0x01, 0xfd, 0xf5, 0xf7, 0xfb, 0x03, 0x05, 0x03, 0x05, + 0x02, 0x0b, 0x0a, 0x01, 0xfe, 0xfd, 0xfa, 0x00, 0x05, 0x03, 0x0a, 0x10, + 0x0b, 0x0b, 0x10, 0x10, 0x18, 0x0e, 0x09, 0x06, 0x0d, 0x09, 0x0d, 0x0e, + 0x03, 0x02, 0x00, 0x00, 0xfe, 0xf9, 0xf3, 0xf1, 0xed, 0xf1, 0xf7, 0xff, + 0xfa, 0x02, 0x02, 0x05, 0xff, 0xfa, 0xfb, 0x03, 0x10, 0x0a, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0f, 0x10, 0x12, 0x0a, 0x06, 0x05, 0x03, 0x09, 0x0e, 0x0b, + 0x05, 0x05, 0x05, 0x07, 0x05, 0x03, 0xff, 0x00, 0x06, 0x05, 0xff, 0xfb, + 0x1b, 0x18, 0x0f, 0x06, 0x00, 0xff, 0xfa, 0xfd, 0xfe, 0xfb, 0xf7, 0xee, + 0xea, 0xfa, 0x02, 0x00, 0xfd, 0xfd, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0x0a, + 0x12, 0x0f, 0x0d, 0x0f, 0x1a, 0x16, 0x12, 0x0a, 0x05, 0x05, 0x05, 0x0e, + 0x1c, 0x1d, 0x1d, 0x17, 0x0b, 0x02, 0xff, 0x00, 0xfa, 0xf2, 0xe8, 0xea, + 0xea, 0xf5, 0x09, 0x0a, 0x06, 0x0a, 0x07, 0x0d, 0x0f, 0x05, 0x02, 0xfd, + 0xff, 0x02, 0x01, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0xfe, 0xf9, 0xf9, 0x02, + 0x00, 0xfb, 0xfe, 0x00, 0x06, 0x13, 0x0f, 0x10, 0x0f, 0x10, 0x0f, 0x10, + 0x16, 0x14, 0x17, 0x14, 0x12, 0x0b, 0x09, 0x07, 0x02, 0xfe, 0xfa, 0xf9, + 0xee, 0xf1, 0xfd, 0xfb, 0xfb, 0xfd, 0xff, 0xfe, 0xfa, 0xfe, 0x03, 0x00, + 0xf9, 0xfb, 0x00, 0x00, 0x09, 0x09, 0x0f, 0x13, 0x06, 0x02, 0x03, 0x03, + 0xff, 0x0f, 0x17, 0x12, 0x0b, 0x0b, 0x0e, 0x09, 0x03, 0x03, 0x05, 0x00, + 0xfd, 0xfa, 0xf5, 0xfd, 0x01, 0x01, 0x06, 0x0b, 0x14, 0x12, 0x16, 0x0f, + 0x05, 0x01, 0xff, 0xfb, 0xfa, 0x03, 0x09, 0x03, 0x00, 0x03, 0xfa, 0xf3, + 0xe9, 0xf5, 0xfa, 0xf6, 0xf7, 0xfa, 0xfd, 0x05, 0x12, 0x0f, 0x0d, 0x12, + 0x16, 0x12, 0x06, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x0b, 0x1a, 0x1d, 0x14, + 0x0d, 0x06, 0x01, 0xfb, 0xfb, 0xfd, 0x00, 0xfe, 0xf2, 0xf5, 0xfa, 0xfb, + 0xff, 0x09, 0x07, 0x09, 0x12, 0x10, 0x03, 0xff, 0x03, 0x07, 0x02, 0x01, + 0xf9, 0xf5, 0xfa, 0xf7, 0xf7, 0xf5, 0xfd, 0x00, 0x05, 0x06, 0x02, 0x05, + 0x07, 0x06, 0x02, 0x02, 0x06, 0x07, 0x09, 0x0d, 0x1f, 0x1f, 0x0f, 0x0a, + 0x1d, 0x29, 0x16, 0x07, 0x06, 0x03, 0x06, 0xfd, 0xff, 0xfe, 0xf7, 0xf9, + 0xf5, 0xf3, 0xf0, 0xea, 0xed, 0xf1, 0xf0, 0xf9, 0x0d, 0x0b, 0x09, 0x05, + 0x06, 0x0f, 0x0a, 0x02, 0x03, 0x06, 0x00, 0xfd, 0xfe, 0xff, 0x00, 0x0a, + 0x0d, 0x13, 0x17, 0x17, 0x0e, 0x09, 0x09, 0x09, 0x05, 0x05, 0x01, 0x00, + 0x00, 0x06, 0x02, 0x01, 0x05, 0x0f, 0xff, 0xfe, 0x02, 0x07, 0x05, 0xfe, + 0xff, 0x01, 0x01, 0x0a, 0x0a, 0x05, 0x00, 0xfd, 0xf5, 0xf2, 0xf6, 0xf9, + 0xf9, 0x01, 0xfd, 0xfb, 0x05, 0x0d, 0x06, 0x02, 0x06, 0x1a, 0x13, 0x09, + 0x09, 0x09, 0x07, 0x09, 0x05, 0x02, 0x02, 0x0f, 0x0d, 0x06, 0xfe, 0x05, + 0x05, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xfe, 0xfe, 0xfd, 0x00, 0xfd, 0x02, + 0x0b, 0x24, 0x1d, 0x10, 0x0d, 0x0b, 0x0a, 0x07, 0xfb, 0xfa, 0xf6, 0xf1, + 0xf5, 0xf1, 0xf1, 0xf5, 0xf9, 0xfa, 0x02, 0x06, 0x05, 0xfe, 0xfe, 0xfd, + 0x05, 0x16, 0x14, 0x0e, 0x0d, 0x1d, 0x20, 0x14, 0x12, 0x10, 0x05, 0x07, + 0x0b, 0x12, 0x13, 0x0f, 0x13, 0x06, 0xff, 0xfb, 0xfe, 0xf7, 0xf0, 0xf1, + 0xf0, 0xf0, 0xf2, 0xf0, 0xee, 0xf6, 0x06, 0x06, 0x03, 0x0d, 0x14, 0x06, + 0x05, 0x00, 0x00, 0x09, 0x03, 0x01, 0x06, 0x0a, 0x07, 0x0b, 0x06, 0x07, + 0x0e, 0x0e, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x05, 0x00, 0x01, 0x09, 0x09, + 0x05, 0x0d, 0x18, 0x0d, 0x06, 0x05, 0x02, 0x00, 0x02, 0xff, 0xf9, 0xfb, + 0xfe, 0xfe, 0xf6, 0xf1, 0xfb, 0x01, 0xfe, 0xfb, 0xfe, 0xfd, 0xfa, 0xfa, + 0x02, 0x03, 0x06, 0x09, 0x0a, 0x0d, 0x1a, 0x14, 0x0f, 0x05, 0xfa, 0x00, + 0x10, 0x0d, 0x06, 0x01, 0x05, 0x10, 0x0d, 0x09, 0x02, 0x05, 0x06, 0x07, + 0x03, 0x01, 0xf7, 0xf2, 0xed, 0xf6, 0x03, 0x05, 0x02, 0x00, 0x0a, 0x1f, + 0x24, 0x17, 0x07, 0x0a, 0x0b, 0x0b, 0x03, 0x00, 0xfa, 0xfd, 0xf9, 0xed, + 0xea, 0xf2, 0xf6, 0xf6, 0xff, 0xff, 0xfb, 0xfd, 0xfa, 0x01, 0x09, 0x0d, + 0x10, 0x0d, 0x0a, 0x16, 0x16, 0x0d, 0x05, 0x0a, 0x12, 0x0e, 0x05, 0x0e, + 0x12, 0x12, 0x12, 0x0f, 0x05, 0x00, 0x00, 0x00, 0xfb, 0xf9, 0xf5, 0xf5, + 0xf7, 0xf7, 0xf6, 0xfd, 0x07, 0x05, 0x03, 0x0a, 0x0e, 0x0a, 0xfe, 0xf7, + 0xfd, 0x00, 0x00, 0xff, 0xfe, 0xfb, 0xff, 0x07, 0x01, 0x07, 0x13, 0x17, + 0x0f, 0x0d, 0x10, 0x0f, 0x09, 0x05, 0x01, 0x01, 0x07, 0x09, 0x06, 0x10, + 0x14, 0x0f, 0x05, 0xfb, 0xff, 0x05, 0x03, 0xfe, 0xfb, 0xfd, 0xfb, 0xfe, + 0xfb, 0xf2, 0xf5, 0xf2, 0xf6, 0xf6, 0xf7, 0xfe, 0xfe, 0xfa, 0xff, 0x13, + 0x18, 0x14, 0x10, 0x1c, 0x23, 0x18, 0x0b, 0x02, 0x02, 0x07, 0x06, 0x01, + 0xfd, 0xfe, 0x01, 0x09, 0x07, 0xff, 0xff, 0x0a, 0x06, 0x03, 0x07, 0x0a, + 0x03, 0x02, 0xfd, 0xf3, 0xf7, 0xfd, 0x01, 0x0b, 0x12, 0x06, 0x0a, 0x07, + 0x0b, 0x16, 0x0d, 0xff, 0xfa, 0xfb, 0xff, 0x01, 0xfd, 0xf0, 0xf0, 0xfb, + 0xfd, 0xf6, 0xfe, 0x03, 0xff, 0xfb, 0xfb, 0xfe, 0x03, 0x0f, 0x13, 0x14, + 0x20, 0x1d, 0x0f, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x10, + 0x0f, 0x09, 0xff, 0x00, 0xfe, 0xfa, 0xfe, 0x00, 0xff, 0xfa, 0xf6, 0xf9, + 0xfe, 0x05, 0x0d, 0x0f, 0x16, 0x13, 0x0b, 0x02, 0xf6, 0xf5, 0x00, 0x00, + 0xfd, 0xf9, 0xf7, 0xfa, 0xfa, 0xfb, 0xfd, 0xff, 0xff, 0x05, 0x0a, 0x10, + 0x0d, 0x07, 0x02, 0x00, 0x0d, 0x12, 0x0f, 0x0a, 0x16, 0x1a, 0x17, 0x10, + 0x09, 0x05, 0x06, 0x0a, 0x09, 0x05, 0xff, 0x01, 0xfe, 0xfa, 0xf5, 0xf7, + 0xff, 0xfa, 0xf5, 0xf6, 0xf5, 0xf7, 0xf9, 0xf3, 0xf3, 0x03, 0x0f, 0x0e, + 0x14, 0x1c, 0x0e, 0x07, 0x06, 0x0b, 0x12, 0x0d, 0x0b, 0x02, 0x00, 0x00, + 0xff, 0x05, 0x0a, 0x09, 0x09, 0x06, 0x06, 0x05, 0x02, 0x01, 0xfe, 0xf9, + 0xfa, 0xf7, 0xfe, 0x03, 0x07, 0x16, 0x0e, 0x0d, 0x0b, 0x05, 0x03, 0x06, + 0x02, 0xfb, 0xf6, 0xf3, 0xf6, 0x00, 0xfe, 0xfb, 0x02, 0xff, 0x00, 0xfe, + 0xff, 0x07, 0x06, 0x06, 0x09, 0x0d, 0x0b, 0x0b, 0x07, 0x17, 0x10, 0x07, + 0x06, 0x00, 0x00, 0x07, 0x0a, 0x07, 0x07, 0x0d, 0x10, 0x10, 0x16, 0x10, + 0x09, 0xf7, 0xf6, 0xf9, 0xf7, 0xf9, 0xfd, 0xf9, 0xf2, 0xff, 0x02, 0xfd, + 0x00, 0x16, 0x0d, 0x0e, 0x0f, 0x09, 0xff, 0xfd, 0x00, 0xff, 0xfd, 0xfd, + 0xf3, 0xf0, 0xf5, 0xf9, 0x01, 0x03, 0x06, 0x07, 0x07, 0x10, 0x0f, 0x0d, + 0x07, 0x06, 0x0b, 0x0a, 0x0b, 0x1a, 0x1d, 0x17, 0x16, 0x0b, 0x01, 0x06, + 0x05, 0xff, 0xff, 0x00, 0xfe, 0x03, 0x01, 0x01, 0xff, 0xfa, 0xf9, 0xfd, + 0xfd, 0xfa, 0xf7, 0xf6, 0xf6, 0xf9, 0x02, 0x02, 0x09, 0x1a, 0x1c, 0x14, + 0x0a, 0x05, 0x01, 0x00, 0xfe, 0xf9, 0xf7, 0xf9, 0xfd, 0xfe, 0xff, 0x01, + 0x07, 0x14, 0x10, 0x0d, 0x0b, 0x05, 0x09, 0x09, 0x05, 0x06, 0x09, 0x05, + 0xff, 0x0a, 0x10, 0x14, 0x0d, 0x09, 0x05, 0x07, 0x0a, 0x03, 0xff, 0xfe, + 0xfb, 0xf7, 0xf7, 0xfb, 0xf3, 0xf5, 0xf3, 0xf5, 0xfa, 0xf9, 0xf9, 0xfb, + 0x01, 0x03, 0x0a, 0x18, 0x14, 0x17, 0x12, 0x16, 0x13, 0x0f, 0x07, 0x07, + 0x06, 0x03, 0x01, 0x07, 0x0a, 0x0b, 0x03, 0x03, 0x07, 0x0d, 0x09, 0x01, + 0xfb, 0xfe, 0xfb, 0xf9, 0xfd, 0xfe, 0xfb, 0xfa, 0xf9, 0xfe, 0xff, 0x0a, + 0x16, 0x0f, 0x05, 0xfb, 0xfb, 0x03, 0xff, 0x00, 0x00, 0xff, 0x05, 0x06, + 0x06, 0x05, 0x03, 0x05, 0x07, 0x05, 0x00, 0xff, 0xff, 0x02, 0x07, 0x0d, + 0x0f, 0x13, 0x0e, 0x1a, 0x1d, 0x1a, 0x13, 0x0b, 0x07, 0x02, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xf9, 0xf9, 0xfe, 0xfa, 0xf6, 0xf2, 0xf2, + 0xf3, 0xfd, 0x01, 0x00, 0x03, 0x0b, 0x0d, 0x13, 0x13, 0x0d, 0x05, 0x06, + 0x03, 0x01, 0x00, 0xfd, 0xfe, 0xfd, 0xfa, 0xfe, 0x07, 0x05, 0x06, 0x0a, + 0x10, 0x10, 0x0d, 0x0b, 0x06, 0x05, 0x02, 0x00, 0x07, 0x18, 0x0b, 0x02, + 0x07, 0x0e, 0x13, 0x0e, 0x07, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfd, + 0x03, 0xfe, 0xf9, 0xf7, 0xf7, 0xf9, 0xfa, 0xf9, 0xf7, 0xfd, 0xfe, 0x03, + 0x09, 0x0d, 0x09, 0x03, 0x07, 0x0a, 0x0a, 0x05, 0x03, 0x00, 0x00, 0x05, + 0x05, 0x0d, 0x0e, 0x12, 0x1b, 0x1c, 0x13, 0x06, 0x06, 0x07, 0x01, 0xfa, + 0xf9, 0xff, 0x02, 0x02, 0x02, 0x03, 0x07, 0xff, 0xff, 0x09, 0x03, 0x0e, + 0x03, 0xfb, 0xf5, 0xf0, 0xf2, 0xfa, 0xfd, 0x01, 0xfe, 0xfd, 0xfe, 0xfe, + 0x05, 0x0d, 0x07, 0x06, 0x03, 0x0b, 0x0f, 0x0a, 0x0e, 0x12, 0x12, 0x10, + 0x0e, 0x16, 0x10, 0x13, 0x0a, 0x05, 0x00, 0xfd, 0xff, 0xff, 0x03, 0x06, + 0x06, 0x05, 0xfb, 0xf9, 0xf3, 0xf6, 0xfb, 0xf5, 0xf3, 0xf6, 0xf2, 0xf5, + 0xfa, 0xf9, 0xff, 0x0e, 0x0f, 0x16, 0x1c, 0x1c, 0x17, 0x0b, 0x02, 0x00, + 0xfd, 0xfd, 0xfd, 0x00, 0x05, 0x05, 0x00, 0x00, 0x02, 0x02, 0x06, 0x0f, + 0x0f, 0x0f, 0x0b, 0x0b, 0x0f, 0x0f, 0x0e, 0x0f, 0x0b, 0x06, 0x12, 0x07, + 0x00, 0xfe, 0xf9, 0xf0, 0xf9, 0x00, 0xf9, 0xfd, 0x06, 0x02, 0xfa, 0xf6, + 0xfa, 0xfb, 0xf7, 0xf6, 0xf9, 0xff, 0xfd, 0x00, 0x02, 0x00, 0x0b, 0x14, + 0x0e, 0x06, 0x09, 0x10, 0x07, 0x03, 0xfe, 0xff, 0x03, 0x0d, 0x13, 0x0e, + 0x14, 0x12, 0x0b, 0x09, 0x06, 0x03, 0x03, 0x09, 0x07, 0x0a, 0x06, 0xfe, + 0x07, 0x00, 0xf9, 0x00, 0x01, 0xff, 0x01, 0x0e, 0x07, 0xfd, 0xff, 0x00, + 0xfa, 0xf9, 0xfa, 0xfd, 0x05, 0x05, 0x01, 0xfb, 0xff, 0x03, 0xfe, 0xfa, + 0xfd, 0xfb, 0x01, 0x03, 0x05, 0x03, 0x01, 0x06, 0x0e, 0x13, 0x10, 0x1d, + 0x21, 0x1b, 0x0d, 0x05, 0x05, 0x03, 0xff, 0x01, 0x0d, 0x0d, 0x09, 0x06, + 0x07, 0xff, 0xfa, 0xf9, 0xfb, 0xf7, 0xf3, 0xfb, 0xfe, 0xfb, 0xf9, 0xfe, + 0x03, 0x03, 0x00, 0x03, 0x0a, 0x06, 0x03, 0xfb, 0xf6, 0xf5, 0xfe, 0x0a, + 0x10, 0x14, 0x0f, 0x0b, 0x05, 0x02, 0x00, 0x00, 0x05, 0x0b, 0x10, 0x14, + 0x0f, 0x0d, 0x06, 0x07, 0x0d, 0x0b, 0x06, 0x09, 0x16, 0x14, 0x07, 0xfa, + 0xf5, 0xfa, 0xfa, 0xfe, 0x03, 0x00, 0xfd, 0xf0, 0xf0, 0xf0, 0xf1, 0xec, + 0xf5, 0xfd, 0x00, 0x0b, 0x0d, 0x0b, 0x05, 0x02, 0x01, 0x09, 0x14, 0x0a, + 0x0a, 0x16, 0x0f, 0x03, 0x00, 0x01, 0x05, 0x07, 0x14, 0x17, 0x10, 0x0d, + 0x10, 0x0d, 0x0f, 0x0e, 0x0a, 0x09, 0x05, 0x05, 0x01, 0x01, 0xfd, 0xed, + 0xe8, 0xee, 0xfb, 0x05, 0xff, 0x00, 0x00, 0xfb, 0xfa, 0xfb, 0x01, 0x05, + 0x07, 0x07, 0x03, 0x00, 0x03, 0x06, 0x03, 0x02, 0xfe, 0xfd, 0x00, 0x07, + 0x05, 0x06, 0x05, 0x05, 0x05, 0x09, 0x0b, 0x0e, 0x12, 0x10, 0x16, 0x09, + 0x01, 0xfd, 0xfa, 0xfd, 0x0a, 0x17, 0x12, 0x0b, 0x0f, 0x0d, 0x06, 0xfd, + 0x00, 0xfe, 0xfd, 0xfd, 0xfe, 0xfe, 0x00, 0x00, 0xfb, 0xfe, 0x02, 0x03, + 0xff, 0x01, 0x0a, 0x07, 0x01, 0x01, 0xfd, 0xfe, 0x02, 0x05, 0x01, 0xff, + 0xff, 0xfa, 0xf5, 0xf7, 0xf5, 0xfb, 0x06, 0x16, 0x12, 0x10, 0x1a, 0x14, + 0x10, 0x13, 0x16, 0x17, 0x0d, 0x09, 0x0d, 0x14, 0x0d, 0x05, 0xf9, 0xfb, + 0x05, 0x07, 0x03, 0xfa, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfd, 0xf6, + 0xf9, 0xf9, 0xf5, 0xea, 0xed, 0xf1, 0xf6, 0xfe, 0x05, 0x0f, 0x16, 0x18, + 0x1a, 0x13, 0x17, 0x10, 0x0e, 0x14, 0x12, 0x0f, 0x10, 0x10, 0x0a, 0x06, + 0x07, 0x0e, 0x0d, 0x05, 0x02, 0x03, 0x05, 0x06, 0x00, 0xfe, 0xfb, 0xf9, + 0xf7, 0xf0, 0xea, 0xea, 0xf9, 0xf1, 0xed, 0xee, 0xf1, 0x00, 0x0d, 0x0e, + 0x0b, 0x0b, 0x0a, 0x0e, 0x13, 0x12, 0x06, 0x03, 0x06, 0x09, 0x07, 0x05, + 0x03, 0x05, 0x0a, 0x0d, 0x07, 0x06, 0x07, 0x07, 0x0f, 0x0f, 0x09, 0x0e, + 0x0a, 0x0a, 0x09, 0x02, 0xff, 0x00, 0xfd, 0xf3, 0xf2, 0xff, 0xfa, 0xf6, + 0xf5, 0x01, 0xff, 0x07, 0x0f, 0x07, 0x01, 0x02, 0x02, 0x05, 0x03, 0x05, + 0x0a, 0x0b, 0x00, 0x00, 0x03, 0x05, 0x03, 0x06, 0x05, 0x05, 0x02, 0xff, + 0x02, 0x07, 0x02, 0xfe, 0xfe, 0x00, 0xff, 0x00, 0x01, 0x06, 0x0d, 0x0e, + 0x0d, 0x0e, 0x09, 0x14, 0x17, 0x27, 0x20, 0x13, 0x0d, 0x0b, 0xfb, 0xfa, + 0xfd, 0xfd, 0xfd, 0xfe, 0x01, 0xfd, 0xf9, 0xf6, 0xf6, 0xfb, 0xfd, 0xfb, + 0xf2, 0xf1, 0xf6, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0x00, 0x0a, 0x0d, 0x05, + 0x07, 0x0d, 0x13, 0x0f, 0x0d, 0x1d, 0x21, 0x1d, 0x1c, 0x18, 0x12, 0x0d, + 0x09, 0x06, 0x03, 0x06, 0x02, 0xfe, 0x00, 0x00, 0xff, 0xf6, 0xe8, 0xf6, + 0xfd, 0xf9, 0xfe, 0xfe, 0xfe, 0x00, 0xfe, 0x00, 0x02, 0x06, 0x00, 0xf6, + 0xfb, 0xf9, 0xfa, 0xfb, 0x01, 0x00, 0x05, 0x1c, 0x17, 0x12, 0x0d, 0x0a, + 0x0d, 0x0d, 0x0b, 0x0a, 0x07, 0x05, 0x0b, 0x10, 0x0d, 0x0f, 0x09, 0x07, + 0x07, 0x01, 0x00, 0x05, 0x03, 0x01, 0x01, 0x00, 0xfd, 0xf9, 0xf1, 0xf3, + 0xf5, 0xf3, 0xf3, 0xf6, 0xf7, 0xfb, 0xf7, 0xff, 0x0b, 0x18, 0x12, 0x0f, + 0x0a, 0x0a, 0x0a, 0x07, 0x0b, 0x0b, 0x07, 0x06, 0x0a, 0x02, 0x02, 0x00, + 0xfe, 0x00, 0x03, 0x03, 0x01, 0x01, 0x02, 0x0a, 0x0a, 0x14, 0x0e, 0x07, + 0x06, 0x05, 0x02, 0x05, 0x09, 0x05, 0x06, 0x00, 0xfd, 0xfd, 0xfb, 0x14, + 0x14, 0x09, 0x01, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf7, 0xf6, + 0xf3, 0xf3, 0xf9, 0xff, 0x05, 0x0f, 0x0b, 0x06, 0x13, 0x16, 0x13, 0x16, + 0x14, 0x0e, 0x09, 0x09, 0x03, 0x00, 0x03, 0x06, 0x0a, 0x02, 0x05, 0x09, + 0x0e, 0x12, 0x0a, 0x09, 0x03, 0x00, 0xfa, 0xf9, 0xfd, 0xf9, 0xf2, 0xf6, + 0xfe, 0x02, 0x00, 0xff, 0x01, 0x01, 0x01, 0x07, 0x0a, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0x03, 0x09, + 0x13, 0x17, 0x16, 0x16, 0x14, 0x1a, 0x16, 0x12, 0x0f, 0x0a, 0x01, 0xff, + 0x01, 0x00, 0x00, 0xff, 0xfe, 0xf9, 0xf9, 0xfb, 0xff, 0xfb, 0x01, 0x07, + 0x05, 0xff, 0xfb, 0xff, 0x01, 0x02, 0xfe, 0xf6, 0xf6, 0x00, 0x07, 0x03, + 0xfe, 0x01, 0x03, 0x0f, 0x14, 0x12, 0x0b, 0x05, 0x00, 0xfe, 0x03, 0x03, + 0x00, 0x01, 0x00, 0x06, 0x0b, 0x07, 0x07, 0x0f, 0x18, 0x17, 0x13, 0x10, + 0x0f, 0x17, 0x14, 0x0a, 0x01, 0x01, 0x00, 0x02, 0xfa, 0xf0, 0xf5, 0xf5, + 0xf6, 0xf0, 0xf6, 0xf9, 0xf7, 0xf7, 0xfe, 0x05, 0xff, 0xf9, 0xf7, 0xfd, + 0xff, 0x00, 0x09, 0x0d, 0x0b, 0x13, 0x23, 0x1d, 0x1b, 0x16, 0x13, 0x18, + 0x1a, 0x12, 0x0b, 0x07, 0x00, 0xfd, 0xfe, 0x00, 0xf9, 0xf6, 0xf6, 0xf7, + 0xf9, 0xfa, 0xf5, 0xf7, 0xff, 0xff, 0x00, 0x02, 0x02, 0x07, 0x0e, 0x0e, + 0x05, 0x02, 0x09, 0x0a, 0x02, 0x01, 0x02, 0x12, 0x09, 0x00, 0xfe, 0xff, + 0x01, 0x06, 0x0a, 0x06, 0x03, 0x01, 0x00, 0x01, 0x02, 0x01, 0x01, 0x05, + 0x02, 0x06, 0x0d, 0x0a, 0x07, 0x06, 0x0d, 0x0a, 0x06, 0x09, 0x0f, 0x0a, + 0x01, 0xfb, 0xf3, 0xf9, 0xfd, 0xff, 0x09, 0x12, 0x05, 0x02, 0x03, 0x00, + 0xff, 0x02, 0x03, 0x01, 0x00, 0x05, 0x07, 0x06, 0x01, 0x00, 0xff, 0x02, + 0xfe, 0x00, 0xff, 0xfe, 0xff, 0xfd, 0x00, 0x01, 0xfe, 0x01, 0x03, 0x09, + 0x12, 0x09, 0x06, 0x09, 0x0e, 0x0d, 0x09, 0x0f, 0x17, 0x1d, 0x17, 0x1b, + 0x0a, 0x00, 0x05, 0x0b, 0x07, 0x06, 0x05, 0xfb, 0xf1, 0xf0, 0xf2, 0xf6, + 0xf6, 0xf6, 0xf2, 0xed, 0xea, 0xf3, 0xf5, 0xf3, 0xfb, 0xf9, 0xfa, 0x01, + 0x01, 0x0b, 0x10, 0x1b, 0x23, 0x20, 0x23, 0x1d, 0x14, 0x18, 0x21, 0x1a, + 0x10, 0x05, 0x00, 0xfd, 0xfd, 0xfe, 0x00, 0x0a, 0x0b, 0x06, 0x00, 0xf9, + 0xf2, 0xf1, 0xf2, 0xf3, 0xfa, 0xfa, 0xff, 0xfd, 0x00, 0x03, 0x06, 0x03, + 0xff, 0x00, 0xff, 0x07, 0x0a, 0x07, 0x06, 0x06, 0x01, 0x01, 0x05, 0x0b, + 0x0d, 0x12, 0x12, 0x0b, 0x05, 0x03, 0x03, 0x03, 0x0a, 0x0a, 0x0a, 0x09, + 0x0b, 0x05, 0x02, 0xfe, 0xf2, 0xf3, 0xf9, 0x00, 0x00, 0xf7, 0xf7, 0xf2, + 0xf3, 0xfb, 0x00, 0x06, 0x0a, 0x1c, 0x17, 0x05, 0x05, 0x07, 0x07, 0x0b, + 0x17, 0x14, 0x0d, 0x07, 0x09, 0x03, 0x05, 0x06, 0x00, 0x01, 0x02, 0x03, + 0xff, 0xf6, 0xf2, 0xf1, 0xf2, 0xfa, 0xf9, 0xfb, 0x00, 0x09, 0x05, 0x03, + 0x05, 0xff, 0xfd, 0x01, 0x0b, 0x1b, 0x1d, 0x25, 0x1f, 0x1d, 0x16, 0x0f, + 0x0b, 0x0d, 0x0b, 0x09, 0x06, 0xfe, 0xee, 0xe8, 0xf1, 0xf6, 0xf7, 0xfb, + 0xfe, 0xfd, 0xf7, 0xf5, 0xf0, 0xf0, 0xf0, 0xf1, 0xfd, 0xff, 0xff, 0x03, + 0x0d, 0x1f, 0x25, 0x21, 0x18, 0x1c, 0x17, 0x10, 0x12, 0x16, 0x0d, 0x07, + 0x02, 0x02, 0x02, 0x03, 0x06, 0x09, 0x05, 0xff, 0xfe, 0xfa, 0xf7, 0xf9, + 0x00, 0x02, 0xfe, 0xfe, 0x00, 0x02, 0xf9, 0xfb, 0xfd, 0xfe, 0xfe, 0x01, + 0x00, 0xff, 0x01, 0xff, 0x00, 0x00, 0xfd, 0x01, 0x09, 0x06, 0x0d, 0x0f, + 0x0a, 0x06, 0x0a, 0x0d, 0x0f, 0x10, 0x0d, 0x0d, 0x0b, 0x16, 0x0e, 0x09, + 0x05, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xfa, 0xf6, 0xf2, 0xf2, 0xf6, + 0xff, 0x05, 0x06, 0x0b, 0x17, 0x0a, 0xfe, 0xff, 0x01, 0x05, 0x06, 0x06, + 0x0d, 0x14, 0x16, 0x0b, 0x09, 0x02, 0x05, 0x05, 0x03, 0xfb, 0xf7, 0xf9, + 0x01, 0x05, 0x02, 0x02, 0x02, 0x01, 0x01, 0xff, 0xfd, 0xf5, 0xf1, 0xf9, + 0x00, 0xff, 0x03, 0x0b, 0x13, 0x17, 0x20, 0x1a, 0x10, 0x0a, 0x0b, 0x03, + 0x00, 0x05, 0x09, 0x01, 0xfe, 0xfa, 0xff, 0x06, 0x07, 0x03, 0x02, 0x00, + 0xfe, 0xfd, 0xfa, 0xf7, 0xf9, 0xfa, 0x00, 0x02, 0x00, 0x02, 0x0b, 0x0b, + 0x0b, 0x07, 0x07, 0x10, 0x14, 0x10, 0x0a, 0x09, 0x06, 0x02, 0xff, 0xfe, + 0xfe, 0xfb, 0xff, 0x0b, 0x10, 0x0a, 0x07, 0x09, 0x06, 0x07, 0x05, 0xff, + 0xfd, 0xfd, 0x06, 0x09, 0x06, 0xfe, 0xfd, 0xf9, 0xfb, 0xfb, 0xff, 0xff, + 0xfa, 0xfb, 0xfe, 0x03, 0x02, 0x05, 0x07, 0x07, 0x0a, 0x0d, 0x0e, 0x09, + 0x0d, 0x0d, 0x06, 0x03, 0x0a, 0x12, 0x14, 0x0e, 0x0e, 0x0d, 0x06, 0x06, + 0x05, 0xfe, 0xf7, 0xf9, 0xfa, 0xff, 0x02, 0xfe, 0xfd, 0x00, 0x01, 0xfe, + 0xfe, 0x02, 0x05, 0x05, 0xff, 0xfd, 0x05, 0x12, 0x0a, 0x05, 0x0d, 0x16, + 0x12, 0x06, 0xfa, 0xf3, 0xf5, 0xf9, 0x00, 0x07, 0x02, 0x00, 0x01, 0x07, + 0x09, 0x07, 0x02, 0x02, 0x05, 0x06, 0x00, 0xff, 0x06, 0x0a, 0x00, 0x00, + 0x01, 0x07, 0x13, 0x1a, 0x16, 0x14, 0x0b, 0x03, 0x09, 0x06, 0x01, 0xfe, + 0xfe, 0x02, 0x01, 0xfd, 0xf3, 0xf2, 0xf3, 0xfa, 0x02, 0x06, 0x05, 0x02, + 0x07, 0x07, 0xfd, 0xfb, 0xfd, 0xfa, 0x01, 0x0a, 0x0f, 0x17, 0x13, 0x0b, + 0x0d, 0x14, 0x13, 0x0b, 0x03, 0xfb, 0xfa, 0xf9, 0xfa, 0xff, 0x03, 0xff, + 0xfa, 0xfb, 0x03, 0x09, 0x06, 0x07, 0xfe, 0xf9, 0xff, 0xff, 0x07, 0x12, + 0x10, 0x0d, 0x05, 0xff, 0x06, 0x07, 0x01, 0x00, 0x03, 0x05, 0x0a, 0x0b, + 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x01, 0x03, 0x00, 0x01, 0x05, 0x02, 0x03, + 0x05, 0x02, 0x02, 0x06, 0x07, 0x07, 0x01, 0xfa, 0xf5, 0xfa, 0xfb, 0x01, + 0xff, 0x09, 0x0f, 0x0a, 0x0b, 0x0d, 0x05, 0x03, 0xfe, 0xfd, 0x01, 0x07, + 0x16, 0x14, 0x06, 0xfe, 0x01, 0x00, 0xfd, 0x05, 0x0a, 0x09, 0x06, 0x03, + 0x06, 0x02, 0xff, 0xfd, 0xf9, 0xfb, 0x07, 0x0b, 0x01, 0xfb, 0xfd, 0x01, + 0x03, 0x0a, 0x03, 0x02, 0x05, 0x0b, 0x0b, 0x06, 0x01, 0xff, 0x01, 0x0d, + 0x1c, 0x1c, 0x1b, 0x16, 0x10, 0x07, 0x00, 0xfd, 0xf9, 0xf6, 0xfa, 0xf9, + 0xf7, 0xf6, 0xf5, 0xf7, 0x00, 0x01, 0xff, 0x00, 0x09, 0x0a, 0xff, 0xf5, + 0xf2, 0xf0, 0xfa, 0x06, 0x13, 0x0f, 0x10, 0x10, 0x0d, 0x0f, 0x0f, 0x16, + 0x16, 0x10, 0x14, 0x0e, 0x06, 0x01, 0xfe, 0xfb, 0xfb, 0xf7, 0xfb, 0xfe, + 0x05, 0x0b, 0x02, 0x05, 0x06, 0x00, 0xfa, 0xfb, 0x03, 0x00, 0x05, 0x03, + 0xfb, 0xf1, 0xf3, 0xff, 0x0a, 0x0b, 0x0a, 0x0a, 0x07, 0x06, 0x10, 0x12, + 0x07, 0x01, 0x03, 0x03, 0x0d, 0x10, 0x0a, 0x06, 0x05, 0x03, 0x00, 0x01, + 0x05, 0xfd, 0xf9, 0xf9, 0xff, 0xff, 0xf7, 0xfb, 0xf9, 0xf6, 0xfd, 0x00, + 0x02, 0xfd, 0xfe, 0x06, 0x09, 0x07, 0x0a, 0x0a, 0x0e, 0x18, 0x18, 0x0d, + 0x05, 0x0d, 0x0b, 0x0f, 0x1a, 0x0f, 0x0d, 0x0a, 0x0e, 0x07, 0x03, 0xff, + 0xf7, 0xf2, 0xf5, 0xfd, 0xfd, 0xf9, 0x00, 0xfe, 0xfb, 0xfb, 0xfa, 0xfa, + 0xf9, 0xfa, 0xfd, 0x01, 0x00, 0xf7, 0xf9, 0x05, 0x12, 0x18, 0x1b, 0x1c, + 0x20, 0x1c, 0x17, 0x12, 0x0b, 0x02, 0x03, 0x06, 0x02, 0x01, 0xfe, 0xf6, + 0xf5, 0xf5, 0xf5, 0xf9, 0x00, 0x05, 0x01, 0xfe, 0x00, 0x00, 0xff, 0xf7, + 0xfe, 0xfb, 0xff, 0x06, 0x0f, 0x0d, 0x09, 0x07, 0x16, 0x1c, 0x1a, 0x18, + 0x0e, 0x0a, 0x0b, 0x07, 0xff, 0xfe, 0xfe, 0x03, 0x09, 0x0e, 0x0b, 0x03, + 0xff, 0xfe, 0xfb, 0xfb, 0xfa, 0xf5, 0xf6, 0xf6, 0xf5, 0xfd, 0xf7, 0xf1, + 0xf5, 0xf9, 0x03, 0x0b, 0x03, 0x06, 0x0b, 0x09, 0x0b, 0x0b, 0x0f, 0x0e, + 0x0e, 0x12, 0x0d, 0x09, 0x0a, 0x05, 0x03, 0x09, 0x18, 0x13, 0x09, 0x02, + 0x00, 0xff, 0x01, 0xf9, 0xf3, 0xf3, 0xf1, 0xfa, 0xfb, 0xfd, 0x00, 0x00, + 0xff, 0x00, 0x07, 0x0b, 0x05, 0x05, 0x07, 0x0b, 0x0f, 0x0b, 0x01, 0x05, + 0x12, 0x14, 0x10, 0x0e, 0x09, 0x03, 0x07, 0x09, 0x06, 0x03, 0xfe, 0x00, + 0xfe, 0xfa, 0xfb, 0xfd, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0xfd, 0xf6, 0xf2, + 0xf9, 0xfe, 0x02, 0xff, 0x03, 0x03, 0x09, 0x12, 0x0f, 0x0d, 0x12, 0x17, + 0x14, 0x1a, 0x16, 0x14, 0x0d, 0x05, 0x06, 0x07, 0x03, 0xfe, 0xff, 0x02, + 0x05, 0x0d, 0x0e, 0x05, 0x01, 0x00, 0xfd, 0xf9, 0xff, 0xf7, 0xf5, 0xfb, + 0xf5, 0xf9, 0x02, 0x06, 0x07, 0x09, 0x0f, 0x0f, 0x0a, 0x06, 0xff, 0x00, + 0x03, 0x03, 0x07, 0x00, 0x00, 0x01, 0x0a, 0x0b, 0x0d, 0x09, 0x03, 0x00, + 0x0b, 0x10, 0x0d, 0x06, 0xfe, 0xf6, 0xf3, 0xf9, 0xf5, 0xee, 0xf1, 0xf3, + 0x00, 0x03, 0x03, 0x06, 0x0d, 0x14, 0x17, 0x0a, 0x05, 0x07, 0x10, 0x09, + 0x03, 0x06, 0x09, 0x09, 0x12, 0x17, 0x0f, 0x0d, 0x07, 0x01, 0xfd, 0x00, + 0x03, 0x03, 0xfd, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0xfd, 0xff, 0xfd, 0xf7, + 0xfb, 0xff, 0x07, 0x05, 0x05, 0x0b, 0x0b, 0x02, 0x06, 0x06, 0x09, 0x0f, + 0x09, 0x02, 0xff, 0xfe, 0x03, 0x14, 0x0f, 0x05, 0x01, 0x02, 0x00, 0x00, + 0xff, 0x02, 0xff, 0xfe, 0x00, 0x01, 0x06, 0x06, 0x01, 0xf9, 0xf7, 0xfb, + 0x03, 0xff, 0x02, 0x0b, 0x0f, 0x0d, 0x07, 0x0d, 0x0f, 0x10, 0x12, 0x10, + 0x0f, 0x0b, 0x09, 0x03, 0x00, 0x01, 0x03, 0x01, 0xfd, 0xff, 0x03, 0x07, + 0x02, 0x03, 0x00, 0xfd, 0x00, 0x01, 0xff, 0xfd, 0xfb, 0xf9, 0xf9, 0xfb, + 0xfb, 0xff, 0x0d, 0x0a, 0x07, 0x0b, 0x09, 0x01, 0x05, 0x0e, 0x0a, 0x06, + 0x03, 0xfe, 0x00, 0x05, 0x05, 0x02, 0x00, 0x03, 0x13, 0x14, 0x0f, 0x0f, + 0x06, 0x00, 0x00, 0xfe, 0xf9, 0xfa, 0xfd, 0x00, 0xfe, 0x06, 0x06, 0x07, + 0x0d, 0x0e, 0x12, 0x0d, 0x07, 0x05, 0x01, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x0a, 0x09, 0x05, 0x07, 0x03, 0xfa, 0xf9, 0xf7, 0xf3, 0xff, 0xff, 0x01, + 0xf7, 0xf6, 0xfa, 0xfb, 0x01, 0x05, 0x01, 0xff, 0xfd, 0x00, 0x02, 0x0e, + 0x17, 0x18, 0x18, 0x0f, 0x0e, 0x05, 0x05, 0x03, 0x01, 0x01, 0x00, 0x03, + 0x07, 0x0a, 0x0b, 0x09, 0x00, 0xfb, 0xfe, 0xfd, 0xff, 0xfe, 0xff, 0x00, + 0xfe, 0xfd, 0xfe, 0x01, 0x06, 0x06, 0x03, 0xff, 0x05, 0x07, 0x0e, 0x12, + 0x0b, 0x0f, 0x0a, 0x0b, 0x0f, 0x0b, 0x06, 0x02, 0x05, 0x02, 0x03, 0x05, + 0x05, 0x06, 0x09, 0x00, 0xf7, 0xf7, 0xf7, 0xfb, 0x03, 0xfe, 0xf6, 0xf9, + 0x09, 0x03, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xf9, 0xfb, 0x02, 0x0d, 0x06, + 0x09, 0x0a, 0x12, 0x1f, 0x1b, 0x12, 0x0d, 0x03, 0x02, 0xff, 0xfd, 0xfa, + 0x00, 0x02, 0x05, 0x09, 0x18, 0x13, 0x0b, 0x09, 0x02, 0xfe, 0xfb, 0xf9, + 0xfa, 0x00, 0x00, 0xf2, 0xf6, 0xfa, 0xfd, 0x06, 0x06, 0x09, 0x0d, 0x0d, + 0x0d, 0x09, 0x06, 0x07, 0x0e, 0x0a, 0x06, 0x07, 0x0e, 0x0b, 0x06, 0x00, + 0xf7, 0xfb, 0xf9, 0xf9, 0xfa, 0x01, 0x03, 0xfe, 0xfe, 0xfe, 0xf7, 0xf9, + 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xff, 0x06, 0x16, 0x1b, 0x1b, 0x18, + 0x1b, 0x1b, 0x17, 0x13, 0x0b, 0x09, 0x09, 0x0b, 0x09, 0x07, 0x07, 0x02, + 0xfe, 0xf9, 0xfe, 0x00, 0xfe, 0xfe, 0x00, 0x05, 0xfb, 0xf1, 0xf2, 0xf2, + 0xf2, 0xf7, 0xf7, 0xfa, 0x07, 0x07, 0x05, 0x03, 0x06, 0x0d, 0x0d, 0x02, + 0x0a, 0x12, 0x10, 0x0e, 0x0b, 0x07, 0x0d, 0x0b, 0x0e, 0x10, 0x0e, 0x0a, + 0x02, 0xfe, 0xfe, 0xf5, 0xf6, 0xfd, 0xfb, 0xfe, 0x0a, 0x0b, 0x0a, 0x03, + 0xfd, 0xf6, 0xf1, 0xec, 0xf2, 0xfd, 0x03, 0x00, 0x00, 0x0a, 0x17, 0x14, + 0x1a, 0x1b, 0x13, 0x10, 0x0f, 0x0b, 0x0a, 0x06, 0x07, 0x0a, 0x03, 0x09, + 0x13, 0x0b, 0x06, 0x02, 0xfe, 0xf6, 0xf5, 0xf3, 0xf5, 0xfb, 0xfd, 0xfa, + 0xf5, 0xf6, 0xf9, 0xf3, 0xfb, 0x03, 0x06, 0x09, 0x0e, 0x05, 0x01, 0x01, + 0x0b, 0x0d, 0x0f, 0x10, 0x1b, 0x1b, 0x13, 0x09, 0x07, 0x02, 0xff, 0x01, + 0xff, 0x02, 0x03, 0x01, 0x01, 0xfd, 0xfa, 0xf7, 0xf5, 0xf7, 0xfb, 0xfd, + 0xfd, 0xfd, 0xfd, 0x00, 0x06, 0x02, 0x06, 0x14, 0x2d, 0x29, 0x17, 0x0d, + 0x10, 0x10, 0x09, 0x03, 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x00, 0xfe, 0xf9, 0xf5, 0xf2, 0xf3, 0xee, 0xec, 0xf3, 0xfb, + 0x05, 0x01, 0x02, 0x0a, 0x0a, 0x01, 0xff, 0x0a, 0x0f, 0x0b, 0x0b, 0x0b, + 0x07, 0x09, 0x0d, 0x10, 0x0e, 0x0d, 0x10, 0x12, 0x0f, 0x06, 0x01, 0x03, + 0x03, 0x01, 0xfe, 0x05, 0x0f, 0x0f, 0x0d, 0x03, 0xfb, 0xf5, 0xec, 0xe9, + 0xed, 0xf7, 0xf9, 0xfe, 0x02, 0x05, 0x07, 0x0a, 0x09, 0x06, 0x0e, 0x14, + 0x0d, 0x06, 0x03, 0x05, 0x05, 0x03, 0x01, 0x0d, 0x17, 0x14, 0x0e, 0x09, + 0x09, 0x06, 0x00, 0xfa, 0xf9, 0xf7, 0xfa, 0xfd, 0xf9, 0xf7, 0xfa, 0xfd, + 0xfa, 0xf3, 0xf9, 0x03, 0x03, 0x05, 0x0b, 0x0b, 0x02, 0x01, 0x03, 0x16, + 0x28, 0x1c, 0x0f, 0x09, 0x05, 0x05, 0x02, 0xfe, 0x00, 0x03, 0x0b, 0x09, + 0x03, 0x06, 0x09, 0x06, 0x06, 0xff, 0xff, 0x00, 0xfb, 0xf1, 0xf3, 0xf3, + 0xf0, 0xf1, 0xf7, 0x06, 0x20, 0x18, 0x13, 0x10, 0x0f, 0x0e, 0x0a, 0x07, + 0x06, 0x05, 0x09, 0x09, 0x05, 0x05, 0xfe, 0xfb, 0x05, 0x00, 0xfd, 0xfe, + 0x03, 0x03, 0x00, 0xfa, 0xf7, 0xf9, 0xf9, 0xff, 0x0b, 0x06, 0x01, 0xfd, + 0x00, 0x06, 0x03, 0x02, 0x02, 0x05, 0x0e, 0x0e, 0x05, 0x09, 0x12, 0x0e, + 0x0b, 0x0b, 0x12, 0x14, 0x12, 0x09, 0x02, 0xfd, 0x00, 0x01, 0x02, 0x09, + 0x0f, 0x0e, 0x09, 0x01, 0xfe, 0x00, 0xfd, 0xf6, 0xed, 0xea, 0xf1, 0xf5, + 0xf7, 0xfb, 0xfb, 0x05, 0x03, 0x00, 0x06, 0x0d, 0x0b, 0x0d, 0x07, 0x02, + 0x06, 0x09, 0x02, 0x0f, 0x24, 0x25, 0x1a, 0x10, 0x02, 0xfe, 0xfd, 0xfd, + 0xfb, 0xf7, 0xf7, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x01, 0xfd, 0xfb, + 0xfd, 0x00, 0x05, 0xff, 0xff, 0x01, 0x06, 0x0e, 0x1b, 0x1d, 0x13, 0x0d, + 0x0a, 0x02, 0x01, 0x03, 0xff, 0x02, 0x02, 0x03, 0x03, 0x05, 0x01, 0xff, + 0x01, 0xff, 0xfd, 0xfe, 0xfe, 0xff, 0x02, 0xff, 0xf6, 0xf5, 0xf9, 0x05, + 0x0d, 0x14, 0x18, 0x0e, 0x05, 0x00, 0x07, 0x0f, 0x10, 0x0e, 0x09, 0x02, + 0x01, 0x01, 0x01, 0x03, 0x06, 0x01, 0x00, 0x02, 0x01, 0x02, 0x03, 0xff, + 0xf3, 0xed, 0xf5, 0x02, 0x09, 0x06, 0x0a, 0x06, 0x03, 0x03, 0x0a, 0x07, + 0x0b, 0x0b, 0x06, 0x06, 0x03, 0x09, 0x13, 0x12, 0x06, 0x07, 0x06, 0x06, + 0x03, 0x01, 0x03, 0x00, 0xf5, 0xfb, 0x05, 0x09, 0x14, 0x12, 0x0e, 0x0b, + 0x03, 0xfa, 0xf5, 0xf5, 0xf7, 0xf5, 0xf0, 0xf0, 0xf1, 0xfa, 0x03, 0x09, + 0x0d, 0x09, 0x06, 0x01, 0x03, 0x07, 0x0e, 0x0d, 0x06, 0x05, 0x06, 0x10, + 0x18, 0x18, 0x17, 0x12, 0x0a, 0x06, 0x02, 0x01, 0xfe, 0x00, 0xff, 0xfd, + 0x01, 0x03, 0x06, 0xfd, 0xfa, 0x00, 0xff, 0xfd, 0xfb, 0xfb, 0x00, 0x06, + 0x02, 0x02, 0x03, 0x09, 0x0d, 0x0f, 0x13, 0x0b, 0x0b, 0x07, 0xfd, 0xfd, + 0x02, 0x01, 0x00, 0xff, 0x00, 0xff, 0x00, 0xfd, 0xfb, 0x03, 0x06, 0x05, + 0x00, 0x02, 0x0a, 0x05, 0xff, 0xfe, 0xfe, 0x02, 0x01, 0x07, 0x0a, 0x0d, + 0x16, 0x10, 0x05, 0x07, 0x0d, 0x12, 0x0e, 0x07, 0x03, 0x02, 0x07, 0x05, + 0xfe, 0xff, 0x01, 0x01, 0x00, 0x00, 0xfb, 0xfa, 0xf3, 0xf3, 0xf5, 0xfe, + 0x0b, 0x0a, 0x05, 0x02, 0x07, 0x05, 0xfd, 0xf6, 0x00, 0x00, 0x03, 0x03, + 0x06, 0x06, 0x09, 0x0d, 0x13, 0x1f, 0x18, 0x0e, 0x02, 0x00, 0x01, 0x06, + 0x02, 0xfe, 0xfd, 0x06, 0x10, 0x14, 0x0b, 0xff, 0xff, 0x02, 0xf7, 0xf1, + 0xf2, 0xf6, 0xfe, 0xfa, 0xfb, 0xf7, 0xfa, 0xff, 0x01, 0x09, 0x02, 0xff, + 0x03, 0x03, 0x05, 0x07, 0x09, 0x0e, 0x16, 0x17, 0x18, 0x1c, 0x17, 0x0d, + 0x0b, 0x0e, 0x0b, 0x09, 0x06, 0x00, 0xfe, 0xfe, 0xfa, 0xf7, 0xf3, 0xfa, + 0xfb, 0xf7, 0xf7, 0xfd, 0x00, 0x00, 0xfe, 0x00, 0x06, 0x02, 0x03, 0x0e, + 0x0d, 0x09, 0x09, 0x09, 0x07, 0x0d, 0x0b, 0x06, 0x0d, 0x06, 0xff, 0xff, + 0xfe, 0xfe, 0x00, 0x03, 0x05, 0x01, 0xff, 0xff, 0x00, 0x07, 0x03, 0xff, + 0xfa, 0xfa, 0xfb, 0x00, 0x07, 0x0f, 0x12, 0x0d, 0x09, 0x09, 0x0e, 0x10, + 0x09, 0x07, 0x05, 0x05, 0x07, 0x07, 0x05, 0x0a, 0x0f, 0x07, 0x05, 0x01, + 0xfb, 0xfe, 0xfd, 0xfe, 0xfb, 0xf6, 0xf6, 0xfb, 0x03, 0x03, 0x03, 0x01, + 0xfe, 0xfa, 0xf7, 0xfe, 0xf9, 0xf5, 0xfb, 0x09, 0x0f, 0x0b, 0x0a, 0x0b, + 0x16, 0x17, 0x12, 0x0b, 0x09, 0x16, 0x0f, 0x06, 0x02, 0x05, 0x06, 0x0a, + 0x12, 0x17, 0x0d, 0x07, 0xff, 0xfd, 0xfe, 0x03, 0xfe, 0xf6, 0xf3, 0xec, + 0xf2, 0xf3, 0xf2, 0xf2, 0xf6, 0xf6, 0xfd, 0x01, 0x00, 0x09, 0x10, 0x0d, + 0x0a, 0x07, 0x0e, 0x12, 0x16, 0x1a, 0x16, 0x12, 0x0d, 0x06, 0x03, 0x09, + 0x0f, 0x0b, 0x0a, 0x03, 0xff, 0xfe, 0xff, 0xfe, 0x00, 0xfe, 0xfb, 0xf3, + 0xf7, 0xfb, 0xfe, 0xf7, 0xf3, 0xf6, 0x01, 0x05, 0x09, 0x0f, 0x0b, 0x0d, + 0x13, 0x0a, 0x06, 0x0a, 0x10, 0x10, 0x05, 0x00, 0xfd, 0xfe, 0x02, 0x05, + 0x05, 0x05, 0x03, 0x03, 0x01, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x06, 0x0b, 0x05, 0x02, 0x07, 0x05, 0x09, 0x03, 0x01, 0x03, 0x00, 0x02, + 0x00, 0x02, 0x09, 0x0d, 0x10, 0x1a, 0x0f, 0x03, 0x00, 0xff, 0x00, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x05, 0x0a, 0x06, 0x03, 0xfe, 0xfd, 0xf9, 0xfa, + 0xfa, 0xfb, 0xfb, 0xf5, 0xf2, 0x00, 0x0b, 0x0d, 0x09, 0x0a, 0x06, 0x02, + 0x07, 0x13, 0x10, 0x10, 0x18, 0x1b, 0x1b, 0x0e, 0x0b, 0x0e, 0x0a, 0x09, + 0x06, 0x05, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf0, 0xec, 0xf2, 0xfd, + 0xf9, 0xf7, 0xf5, 0xf2, 0xf9, 0x00, 0x02, 0x05, 0x07, 0x05, 0x02, 0x05, + 0x07, 0x0e, 0x14, 0x13, 0x13, 0x13, 0x13, 0x14, 0x10, 0x09, 0x06, 0x02, + 0x02, 0x03, 0x03, 0x09, 0x0a, 0x06, 0x03, 0xfd, 0xfe, 0xfb, 0xfd, 0xf9, + 0xfb, 0xfb, 0xf6, 0xfa, 0x05, 0x12, 0x0f, 0x07, 0x03, 0x02, 0x01, 0xff, + 0x00, 0xfd, 0xfa, 0xfd, 0x02, 0x07, 0x09, 0x0a, 0x0f, 0x0d, 0x0b, 0x09, + 0x03, 0x03, 0x03, 0x01, 0x03, 0x02, 0xff, 0xff, 0x02, 0x07, 0x0d, 0x07, + 0x05, 0x03, 0x00, 0x02, 0x07, 0x0b, 0x07, 0x05, 0xfe, 0xf5, 0xfa, 0x01, + 0x03, 0xff, 0xfe, 0x02, 0x0a, 0x07, 0x03, 0x00, 0x07, 0x0e, 0x10, 0x06, + 0x03, 0x0a, 0x0d, 0x07, 0x03, 0x00, 0xfd, 0xfe, 0xff, 0xfd, 0xf7, 0xf9, + 0xf9, 0xf5, 0xfa, 0x02, 0x0b, 0x0d, 0x06, 0x02, 0x05, 0x0a, 0x09, 0x07, + 0x09, 0x0b, 0x0e, 0x0a, 0x13, 0x16, 0x12, 0x0d, 0x06, 0x05, 0x07, 0x05, + 0x0b, 0x07, 0x01, 0xfa, 0xfb, 0xf3, 0xf6, 0xf9, 0xfb, 0xfa, 0xf7, 0xf7, + 0xf7, 0xf9, 0xf9, 0x00, 0x0a, 0x0d, 0x09, 0x05, 0x02, 0x07, 0x12, 0x12, + 0x09, 0x03, 0x02, 0x09, 0x12, 0x0a, 0x02, 0xfd, 0xfe, 0x0b, 0x0b, 0x0f, + 0x0e, 0x0d, 0x13, 0x0b, 0x06, 0x05, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0xf6, + 0xfb, 0x05, 0x0d, 0x12, 0x0b, 0x09, 0x03, 0x00, 0x01, 0x01, 0xfd, 0xf5, + 0xf7, 0x00, 0xfd, 0xfa, 0x01, 0x0a, 0x0d, 0x02, 0x00, 0x05, 0x02, 0x06, + 0x0d, 0x10, 0x0b, 0x05, 0x03, 0x05, 0x09, 0x06, 0x02, 0x02, 0x03, 0x07, + 0x05, 0x06, 0x0e, 0x0d, 0x0a, 0x0f, 0x02, 0xfb, 0xff, 0x02, 0x00, 0xfe, + 0xfa, 0xff, 0x01, 0x02, 0x02, 0x00, 0xff, 0x01, 0x07, 0x07, 0x03, 0x05, + 0x09, 0x0e, 0x01, 0xff, 0x02, 0x0d, 0x06, 0xfa, 0xf6, 0xfd, 0xff, 0xfd, + 0xff, 0x07, 0x09, 0x05, 0x02, 0x01, 0x00, 0x05, 0x12, 0x16, 0x10, 0x09, + 0x06, 0x07, 0x0e, 0x1f, 0x17, 0x0a, 0xfb, 0xf9, 0xff, 0xfe, 0xfa, 0xf9, + 0xfa, 0xf9, 0x02, 0xfd, 0xfa, 0xfb, 0xfa, 0x00, 0x05, 0xfe, 0xf9, 0x00, + 0x07, 0x0d, 0x0d, 0x07, 0x07, 0x0a, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x02, + 0x01, 0x00, 0x00, 0x03, 0x03, 0x01, 0x06, 0x07, 0x06, 0x05, 0x03, 0x05, + 0x0d, 0x05, 0x02, 0x06, 0x0d, 0x01, 0xf3, 0xfd, 0xfb, 0x02, 0x00, 0x0a, + 0x12, 0x12, 0x0b, 0x03, 0x00, 0x00, 0x02, 0x03, 0x01, 0xf6, 0xfb, 0x00, + 0xff, 0xfd, 0x01, 0x06, 0x05, 0x03, 0x03, 0x05, 0x05, 0x03, 0x05, 0x07, + 0x05, 0xfd, 0xfe, 0x06, 0x0b, 0x0b, 0x0b, 0x03, 0xff, 0x03, 0x09, 0x10, + 0x10, 0x0a, 0x06, 0x0b, 0x09, 0xfe, 0xfd, 0x03, 0xff, 0xfb, 0xf9, 0xfa, + 0x06, 0x06, 0x0e, 0x07, 0x02, 0x02, 0x03, 0x06, 0x09, 0x03, 0xff, 0xfd, + 0xf9, 0xf7, 0xfb, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x05, 0x06, 0x01, 0x00, + 0x05, 0x0b, 0x07, 0x02, 0x06, 0x13, 0x13, 0x0b, 0x09, 0x0a, 0x0b, 0x0b, + 0x12, 0x14, 0x1b, 0x16, 0x0a, 0xfa, 0x00, 0x00, 0xfa, 0xf9, 0xf6, 0xfb, + 0xf9, 0xf3, 0xf5, 0xf1, 0xf2, 0xf2, 0xfa, 0xff, 0x03, 0x09, 0x01, 0x00, + 0x07, 0x09, 0x0a, 0x13, 0x1b, 0x1b, 0x17, 0x0b, 0x02, 0x01, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x07, 0x12, 0x0d, 0x07, 0x05, 0x07, 0x09, 0x02, 0x00, + 0xff, 0x02, 0x05, 0x02, 0xf9, 0xf1, 0xf6, 0xfe, 0x06, 0x05, 0x02, 0x05, + 0x00, 0xff, 0x00, 0x02, 0x10, 0x0b, 0x05, 0x05, 0x0d, 0x05, 0x01, 0xff, + 0x06, 0x10, 0x07, 0x02, 0x05, 0x07, 0x0b, 0x03, 0x05, 0x00, 0xfd, 0xfa, + 0xfb, 0x03, 0x01, 0x00, 0xff, 0xff, 0x03, 0x0b, 0x09, 0x05, 0x01, 0x03, + 0x0e, 0x0f, 0x0a, 0x05, 0xff, 0x03, 0x06, 0x01, 0xff, 0x01, 0x09, 0x0b, + 0x0b, 0x0f, 0x07, 0x03, 0x02, 0x00, 0x05, 0x02, 0x00, 0xfb, 0xff, 0xff, + 0xfd, 0xfa, 0xfa, 0xfa, 0xfe, 0x02, 0x05, 0x01, 0xff, 0xfd, 0xfb, 0xff, + 0x07, 0x07, 0x0a, 0x12, 0x12, 0x0b, 0x0b, 0x13, 0x16, 0x0e, 0x16, 0x14, + 0x14, 0x13, 0x12, 0x06, 0xfe, 0xf9, 0xf2, 0xf1, 0xf3, 0xff, 0xff, 0xfd, + 0xfe, 0xfd, 0xf5, 0xf7, 0xf7, 0xfa, 0x00, 0x06, 0x01, 0xfa, 0xfd, 0x02, + 0x0a, 0x0b, 0x10, 0x13, 0x12, 0x10, 0x07, 0xff, 0x02, 0x06, 0x03, 0x01, + 0x0b, 0x14, 0x0e, 0x0b, 0x09, 0x07, 0x03, 0x02, 0xfb, 0xfd, 0x03, 0x0a, + 0x0e, 0x0b, 0x0d, 0xff, 0xf7, 0xfa, 0xf9, 0xff, 0xfd, 0xfb, 0xfe, 0xfa, + 0xfd, 0x01, 0xff, 0xfa, 0x00, 0x06, 0x0a, 0x06, 0x01, 0x01, 0x01, 0x10, + 0x14, 0x12, 0x12, 0x0d, 0x10, 0x0d, 0x02, 0xfe, 0xf9, 0xfa, 0xfb, 0x01, + 0x05, 0x06, 0x09, 0x07, 0x05, 0x03, 0x03, 0x00, 0xfd, 0x01, 0x0a, 0x0b, + 0x09, 0x06, 0x01, 0xfa, 0xf9, 0xf6, 0xff, 0xff, 0x05, 0x07, 0x03, 0x0a, + 0x0b, 0x10, 0x0d, 0x0e, 0x0d, 0x0a, 0x07, 0x02, 0xfd, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0x0a, 0x05, 0x00, 0xfb, 0xf6, 0xf2, 0xf7, 0xf9, 0x00, 0x01, + 0x05, 0x0d, 0x0a, 0x0e, 0x0d, 0x0e, 0x0b, 0x0b, 0x0d, 0x0d, 0x14, 0x18, + 0x0e, 0x09, 0x01, 0xff, 0xff, 0x00, 0x07, 0x02, 0xff, 0xfe, 0x02, 0xff, + 0xfe, 0xfd, 0xfd, 0xfd, 0x00, 0x02, 0x00, 0xfe, 0xfb, 0xfd, 0x05, 0x05, + 0x06, 0x0a, 0x0b, 0x09, 0x01, 0xff, 0xfe, 0x00, 0xfd, 0x00, 0x10, 0x13, + 0x13, 0x0a, 0x05, 0x03, 0x0a, 0x0b, 0x0d, 0x06, 0x01, 0x0d, 0x13, 0x10, + 0x0a, 0x01, 0xf7, 0xf6, 0xf9, 0xfe, 0xfd, 0xfd, 0xfa, 0x02, 0x01, 0xfe, + 0xfb, 0x01, 0x0d, 0x09, 0x03, 0x02, 0x02, 0x02, 0xff, 0x01, 0x0b, 0x0b, + 0x05, 0x0d, 0x16, 0x0e, 0x01, 0xf9, 0x02, 0x03, 0x07, 0x0a, 0x05, 0x05, + 0x06, 0x05, 0x03, 0x02, 0x00, 0x01, 0x05, 0x07, 0x02, 0x07, 0x07, 0x06, + 0x02, 0xff, 0x00, 0xfe, 0x00, 0x01, 0x05, 0x03, 0x00, 0x05, 0x09, 0x03, + 0x00, 0x05, 0x02, 0x05, 0x07, 0x00, 0xfa, 0xfd, 0x05, 0x07, 0x0a, 0x0b, + 0x0a, 0x0a, 0x09, 0x01, 0xf5, 0xf2, 0xfb, 0xfd, 0xff, 0x07, 0x0d, 0x06, + 0x03, 0x12, 0x10, 0x0a, 0x07, 0x0a, 0x0e, 0x07, 0x09, 0x13, 0x0e, 0x03, + 0xfb, 0xf3, 0xfb, 0x01, 0xfd, 0xff, 0x01, 0xf9, 0xfb, 0x05, 0x07, 0x03, + 0x03, 0x09, 0x12, 0x0a, 0x03, 0x02, 0x01, 0x01, 0xff, 0x03, 0x03, 0xff, + 0x00, 0x0a, 0x02, 0xfd, 0xf6, 0xfa, 0xfb, 0x07, 0x0b, 0x09, 0x09, 0x06, + 0x02, 0x02, 0x00, 0x06, 0x13, 0x0f, 0x0b, 0x0b, 0x0b, 0x07, 0x0a, 0x0e, + 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff, 0x00, 0xfa, 0xfa, 0x03, 0x05, 0x06, + 0x0b, 0x0d, 0x06, 0x01, 0xfe, 0xff, 0xff, 0x00, 0x06, 0x0d, 0x0e, 0x07, + 0x05, 0x05, 0x02, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0x02, 0x03, 0x05, 0x02, + 0x07, 0x0a, 0x05, 0x0b, 0x0f, 0x0d, 0x06, 0x01, 0x02, 0x05, 0x01, 0xfd, + 0x02, 0x06, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x12, 0x0f, 0x05, 0x01, 0x00, + 0x02, 0x02, 0x07, 0x07, 0xfd, 0xf7, 0xfa, 0x02, 0x0a, 0x05, 0xff, 0xfb, + 0xfa, 0x02, 0x03, 0xff, 0x00, 0x05, 0x09, 0x09, 0x05, 0x07, 0x07, 0x0b, + 0x0f, 0x0b, 0x09, 0x02, 0x05, 0x01, 0x03, 0x14, 0x0f, 0x07, 0x01, 0xfd, + 0x05, 0x03, 0x02, 0x00, 0xf9, 0xf7, 0xfa, 0xff, 0x00, 0x05, 0x03, 0x03, + 0xff, 0x00, 0x02, 0x05, 0x06, 0x00, 0xff, 0xff, 0x05, 0x0b, 0x09, 0x0b, + 0x0f, 0x06, 0xfb, 0xfb, 0x03, 0x06, 0x0b, 0x07, 0x03, 0x03, 0x07, 0x06, + 0x07, 0x0e, 0x10, 0x10, 0x07, 0x07, 0x07, 0x09, 0x05, 0xfd, 0xf2, 0xf1, + 0xf3, 0xfe, 0xf9, 0xf1, 0xff, 0x06, 0x03, 0x02, 0x0b, 0x0f, 0x0f, 0x0e, + 0x0e, 0x0a, 0x09, 0x02, 0xff, 0x05, 0x0f, 0x0f, 0x05, 0x02, 0x02, 0x05, + 0x05, 0xfd, 0xf6, 0xf2, 0xf3, 0xf9, 0x02, 0xff, 0x01, 0x00, 0xfa, 0xff, + 0x10, 0x13, 0x0d, 0x06, 0x01, 0xfb, 0x03, 0x0f, 0x0f, 0x06, 0x0a, 0x12, + 0x0f, 0x0e, 0x02, 0x03, 0x0a, 0x0e, 0x03, 0x01, 0xff, 0x02, 0x09, 0x0a, + 0x03, 0x05, 0xff, 0xf6, 0xff, 0x05, 0x01, 0x01, 0xff, 0xf9, 0xf7, 0xfa, + 0xf9, 0xfe, 0x02, 0x07, 0x06, 0x03, 0xfd, 0xff, 0x14, 0x13, 0x0e, 0x0d, + 0x0d, 0x07, 0x09, 0x0a, 0x0d, 0x0d, 0x0a, 0x02, 0x01, 0x00, 0x01, 0x01, + 0x02, 0xfd, 0xf5, 0xfb, 0x03, 0x03, 0x09, 0x0e, 0x09, 0x05, 0x00, 0x05, + 0x05, 0x02, 0xfd, 0xfb, 0xf9, 0xf5, 0xf9, 0xff, 0x01, 0x03, 0x0e, 0x05, + 0x0b, 0x10, 0x0a, 0x0b, 0x0f, 0x07, 0x05, 0x05, 0x0a, 0x0a, 0x0e, 0x13, + 0x0f, 0x07, 0x03, 0x01, 0x05, 0x07, 0x02, 0xfd, 0xf1, 0xf1, 0xf6, 0xff, + 0x02, 0x00, 0xfb, 0xf9, 0x00, 0x03, 0x02, 0x02, 0x03, 0xfd, 0xfb, 0x03, + 0x0e, 0x0a, 0x0a, 0x1a, 0x14, 0x0d, 0x0e, 0x12, 0x0f, 0x0b, 0x01, 0xfb, + 0xfa, 0xf6, 0xf7, 0xfb, 0x00, 0x01, 0x02, 0x01, 0x02, 0x0d, 0x0a, 0x09, + 0x0a, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x05, 0x06, 0x07, 0x03, 0xfd, 0xff, + 0x05, 0x09, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x06, 0x0e, 0x0f, 0x09, 0x09, + 0x09, 0x0a, 0x00, 0xff, 0xff, 0xfe, 0xf7, 0xf3, 0xf9, 0xfa, 0xfb, 0x06, + 0x03, 0x00, 0xfd, 0xff, 0x00, 0xfe, 0xfe, 0x01, 0x03, 0x06, 0x06, 0x06, + 0x05, 0x0a, 0x16, 0x12, 0x18, 0x1b, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x01, + 0x01, 0x02, 0x02, 0x0d, 0x0a, 0x07, 0x01, 0xfd, 0xfb, 0xff, 0x00, 0xfe, + 0xfd, 0xf6, 0xf1, 0xf3, 0xfa, 0x00, 0xfe, 0xfd, 0x07, 0x05, 0x03, 0x07, + 0x07, 0x0a, 0x02, 0x07, 0x10, 0x0f, 0x10, 0x1a, 0x18, 0x13, 0x0e, 0x0a, + 0x09, 0x00, 0x00, 0x00, 0xfb, 0xf3, 0xec, 0xf0, 0xf5, 0xf6, 0xfb, 0x01, + 0x0b, 0x13, 0x0b, 0x05, 0x06, 0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0e, + 0x14, 0x10, 0x06, 0x01, 0x01, 0x0d, 0x0b, 0x02, 0xfb, 0xfe, 0x00, 0xfd, + 0xfb, 0xff, 0x06, 0x06, 0x0d, 0x0d, 0x07, 0x07, 0x05, 0x01, 0xfe, 0xfd, + 0xfe, 0x05, 0x0a, 0x10, 0x07, 0x00, 0xff, 0x03, 0x03, 0x00, 0x01, 0x07, + 0x0b, 0x05, 0xff, 0xfd, 0xfd, 0xfe, 0x05, 0x09, 0x0b, 0x0a, 0x0b, 0x06, + 0x01, 0xfe, 0xfe, 0x03, 0x09, 0x03, 0x03, 0x02, 0x06, 0x05, 0x02, 0x00, + 0xfb, 0xfb, 0x00, 0x00, 0xfb, 0xfd, 0x00, 0x03, 0x03, 0x05, 0x09, 0x16, + 0x1d, 0x1c, 0x12, 0x05, 0xff, 0x03, 0xff, 0xfd, 0x02, 0x00, 0x06, 0x0b, + 0x0a, 0x07, 0x05, 0x07, 0x07, 0x06, 0x01, 0x00, 0x00, 0xfd, 0xfe, 0xff, + 0xfa, 0xfa, 0xfa, 0xfe, 0x03, 0x02, 0xfe, 0x02, 0x01, 0x01, 0x03, 0x01, + 0x02, 0x06, 0x09, 0x0b, 0x0a, 0x09, 0x0d, 0x0f, 0x06, 0x0a, 0x0a, 0x05, + 0x00, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0x01, 0x03, 0x0d, 0x13, 0x0f, 0x0d, + 0x0d, 0x09, 0x01, 0xfa, 0xf7, 0xfa, 0x01, 0x05, 0x0a, 0x0f, 0x10, 0x0d, + 0x05, 0xfd, 0x00, 0x01, 0xf5, 0xf1, 0xf7, 0xf9, 0xfb, 0xf7, 0xff, 0x02, + 0x0a, 0x13, 0x09, 0x0b, 0x0d, 0x0b, 0x07, 0x06, 0x02, 0x07, 0x12, 0x0f, + 0x0d, 0x03, 0xf9, 0xfa, 0xf9, 0xf5, 0xf6, 0xfa, 0x05, 0x0e, 0x12, 0x0f, + 0x0d, 0x02, 0xff, 0x01, 0x0e, 0x16, 0x0a, 0x03, 0xfd, 0xfd, 0xfb, 0xfa, + 0xfd, 0xfb, 0x03, 0xfd, 0xfd, 0x02, 0x01, 0x05, 0x05, 0x01, 0x07, 0x0d, + 0x03, 0xfd, 0xfd, 0xfd, 0x00, 0xff, 0xff, 0x03, 0x1a, 0x25, 0x1c, 0x16, + 0x0d, 0x03, 0x01, 0xff, 0xff, 0x01, 0x02, 0x00, 0x05, 0x02, 0xfe, 0xff, + 0x00, 0x03, 0xfe, 0xfa, 0xf9, 0xf6, 0xf7, 0xfd, 0x00, 0x06, 0x02, 0x03, + 0x13, 0x20, 0x09, 0x01, 0x03, 0x02, 0x03, 0x09, 0x07, 0x07, 0x0b, 0x0a, + 0x09, 0x06, 0x05, 0x05, 0x07, 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfb, 0xf5, + 0xea, 0xf3, 0xff, 0x05, 0x05, 0x0b, 0x0f, 0x0d, 0x10, 0x13, 0x13, 0x0a, + 0x06, 0x0f, 0x09, 0x07, 0x05, 0x07, 0x13, 0x12, 0x0d, 0x07, 0x00, 0xff, + 0xf6, 0xf0, 0xf1, 0xf6, 0xf6, 0xf2, 0xf7, 0xf7, 0xfd, 0x09, 0x0b, 0x06, + 0xfe, 0xfd, 0xfe, 0x0a, 0x14, 0x0f, 0x0b, 0x14, 0x14, 0x13, 0x09, 0x00, + 0xff, 0x01, 0x02, 0x06, 0xfe, 0x07, 0x12, 0x0b, 0x07, 0x02, 0x03, 0x01, + 0x09, 0x0d, 0x0b, 0x06, 0xff, 0xff, 0xfa, 0xff, 0x03, 0xff, 0xf9, 0xf5, + 0xfb, 0xfa, 0xf7, 0xfa, 0xf9, 0x07, 0x0e, 0x06, 0x01, 0x00, 0x01, 0xff, + 0xfe, 0x00, 0x00, 0x06, 0x1a, 0x30, 0x30, 0x21, 0x10, 0x09, 0x00, 0xfe, + 0x03, 0x00, 0x00, 0xfd, 0xfa, 0xfe, 0x06, 0x07, 0x07, 0x07, 0x06, 0xfd, + 0xf7, 0xf5, 0xf6, 0xf2, 0xf6, 0xfa, 0x00, 0x0a, 0x0f, 0x03, 0x00, 0x02, + 0x02, 0x00, 0x02, 0x06, 0x16, 0x1d, 0x1d, 0x13, 0x10, 0x0d, 0x09, 0x05, + 0x00, 0xff, 0x02, 0x00, 0xfe, 0xfa, 0xfa, 0xfb, 0xf6, 0xf7, 0xfa, 0xfa, + 0x03, 0x05, 0x06, 0x09, 0x0b, 0x09, 0x03, 0x09, 0x13, 0x0b, 0x05, 0xfe, + 0xff, 0xff, 0x01, 0x0b, 0x10, 0x0e, 0x10, 0x0f, 0x00, 0x06, 0x06, 0x00, + 0xfb, 0xf7, 0xf6, 0xf6, 0x01, 0x06, 0x07, 0x05, 0x03, 0x01, 0x05, 0x09, + 0x02, 0xff, 0x01, 0x06, 0x07, 0x07, 0x01, 0xfe, 0xf1, 0x00, 0x05, 0x00, + 0xfa, 0xfa, 0x02, 0x0d, 0x0f, 0x12, 0x0e, 0x0a, 0x1b, 0x25, 0x21, 0x13, + 0x0b, 0x03, 0x00, 0x01, 0xff, 0xff, 0xfd, 0xf2, 0xf3, 0xf6, 0xf3, 0xfa, + 0xfa, 0xfd, 0xff, 0xfd, 0xf9, 0xf6, 0xf7, 0xf2, 0xf0, 0xf2, 0xfa, 0x06, + 0x16, 0x1f, 0x2a, 0x24, 0x23, 0x1d, 0x14, 0x0a, 0x0b, 0x0e, 0x13, 0x0d, + 0x09, 0x06, 0x00, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfa, 0xf3, 0xee, + 0xf9, 0x00, 0xfe, 0xfb, 0x06, 0x00, 0x00, 0x00, 0xfe, 0xfb, 0xfd, 0x02, + 0x0f, 0x18, 0x12, 0x0e, 0x10, 0x12, 0x0b, 0x0b, 0x0a, 0x03, 0x09, 0x0b, + 0x02, 0x02, 0xff, 0xfa, 0xfe, 0xf9, 0xed, 0xed, 0xfb, 0x06, 0x05, 0xff, + 0x02, 0x0b, 0x18, 0x14, 0x0d, 0x06, 0x02, 0x02, 0x02, 0x01, 0xfa, 0xfb, + 0x07, 0x12, 0x0f, 0x0e, 0x00, 0xf7, 0xfb, 0xfa, 0xf7, 0xf9, 0xfd, 0x00, + 0x0e, 0x12, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x03, 0xfb, 0xfd, 0x03, 0x03, + 0x06, 0x07, 0x09, 0x0a, 0x02, 0xf3, 0xf3, 0xf5, 0xfa, 0xfd, 0xfa, 0x00, + 0x00, 0xfb, 0x07, 0x12, 0x18, 0x17, 0x16, 0x0f, 0x0f, 0x10, 0x0d, 0x00, + 0xfd, 0x01, 0x01, 0xfd, 0x00, 0x0a, 0x0a, 0xff, 0xfb, 0xfe, 0xfb, 0x00, + 0xfe, 0xf9, 0xfa, 0xfe, 0xfb, 0xf9, 0xfa, 0xfd, 0x05, 0x07, 0x0f, 0x14, + 0x10, 0x13, 0x13, 0x0e, 0x0b, 0x05, 0x03, 0x07, 0x0a, 0x07, 0x03, 0x01, + 0x00, 0x00, 0x05, 0x0f, 0x0d, 0x06, 0x01, 0xfe, 0xff, 0xf9, 0xf9, 0xfd, + 0x06, 0x02, 0xff, 0xf7, 0x00, 0x09, 0x02, 0xfe, 0x00, 0x01, 0x09, 0x07, + 0x06, 0x05, 0x05, 0x01, 0xfb, 0x03, 0x05, 0x06, 0x0f, 0x0b, 0x01, 0xff, + 0xff, 0xff, 0xfe, 0xfd, 0x0f, 0x13, 0x0f, 0x0b, 0x0f, 0x13, 0x0f, 0x06, + 0xff, 0xfe, 0xfb, 0xfa, 0x00, 0x03, 0x09, 0x06, 0x01, 0x0b, 0x07, 0x01, + 0xfa, 0xf9, 0xfa, 0xf7, 0xf2, 0xf0, 0xf6, 0x01, 0x10, 0x12, 0x0a, 0x02, + 0x06, 0x0f, 0x0a, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0a, 0x07, 0x05, 0x06, + 0x03, 0xfd, 0xee, 0xf1, 0xf6, 0xf7, 0xf9, 0x01, 0x0a, 0x06, 0x00, 0x0b, + 0x21, 0x20, 0x10, 0x09, 0x0e, 0x13, 0x0b, 0x03, 0x06, 0x05, 0xfe, 0xf7, + 0xfb, 0xfb, 0xfb, 0xfd, 0xf7, 0xfb, 0x02, 0x01, 0x03, 0x02, 0x00, 0xfd, + 0xfb, 0xfa, 0xf7, 0xf9, 0x0b, 0x13, 0x0d, 0x13, 0x25, 0x1d, 0x14, 0x13, + 0x10, 0x05, 0x00, 0xfd, 0x00, 0x02, 0xfe, 0xfd, 0xfd, 0x00, 0x01, 0x01, + 0x01, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xfa, 0xff, 0x13, 0x13, 0x01, 0xf9, + 0x01, 0x07, 0x0a, 0x05, 0x02, 0x03, 0x06, 0x10, 0x0e, 0x13, 0x12, 0x0d, + 0x09, 0x03, 0x02, 0x01, 0x02, 0x00, 0xf9, 0xf2, 0xee, 0xee, 0xf9, 0x06, + 0x09, 0x09, 0x05, 0x03, 0x10, 0x0b, 0x06, 0x0d, 0x0f, 0x0d, 0x07, 0x0a, + 0x0a, 0x03, 0x06, 0x06, 0x09, 0x06, 0x09, 0x0a, 0x01, 0xf7, 0xfb, 0x00, + 0xfb, 0xfb, 0xf7, 0xfe, 0x0a, 0x05, 0x02, 0xff, 0x00, 0x00, 0xfd, 0x00, + 0x06, 0x05, 0x01, 0x0b, 0x0b, 0x0a, 0x07, 0x09, 0x0a, 0x0a, 0x0a, 0xff, + 0x00, 0xff, 0xfe, 0x02, 0x01, 0x02, 0x0d, 0x0d, 0x16, 0x10, 0x0d, 0x0e, + 0x17, 0x12, 0x0d, 0x0e, 0x06, 0x00, 0xf7, 0xfa, 0xf3, 0xec, 0xf0, 0xf5, + 0xf6, 0xf6, 0x05, 0x00, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfd, 0xfe, 0x06, + 0x0f, 0x0d, 0x0f, 0x13, 0x1a, 0x1d, 0x13, 0x10, 0x0f, 0x0b, 0x07, 0xfe, + 0x01, 0x03, 0x06, 0x06, 0x02, 0xfe, 0xfe, 0x01, 0x05, 0x00, 0xfe, 0xfd, + 0xfb, 0xfb, 0xfe, 0x0e, 0x12, 0x03, 0x02, 0xfd, 0xff, 0xfe, 0xfe, 0x05, + 0x02, 0xff, 0x02, 0x03, 0x0b, 0x0e, 0x09, 0x07, 0x05, 0x03, 0x06, 0x03, + 0x03, 0x06, 0x09, 0x09, 0x02, 0x00, 0xff, 0x05, 0x0f, 0x07, 0xfa, 0xff, + 0x07, 0x03, 0xfa, 0xfe, 0x02, 0x06, 0x03, 0x02, 0xfe, 0xfb, 0xff, 0x03, + 0x03, 0x0a, 0x06, 0x06, 0x07, 0x09, 0x00, 0xf7, 0xfd, 0xfe, 0xfe, 0x03, + 0x12, 0x10, 0x09, 0x07, 0x13, 0x12, 0x06, 0x05, 0x05, 0x03, 0x00, 0x01, + 0x02, 0x00, 0xfd, 0xfd, 0xf6, 0xf6, 0x01, 0x00, 0xff, 0xf3, 0xf3, 0xf7, + 0x00, 0x06, 0x0a, 0x10, 0x1b, 0x1f, 0x16, 0x13, 0x1b, 0x17, 0x0a, 0x0d, + 0x10, 0x0a, 0x02, 0xfe, 0xf9, 0xf7, 0xf6, 0xf7, 0xf6, 0xf9, 0xfa, 0xfd, + 0xfe, 0xf7, 0xf9, 0xf5, 0xf2, 0xf0, 0xea, 0xf7, 0x0b, 0x0d, 0x0a, 0x0a, + 0x10, 0x10, 0x17, 0x24, 0x23, 0x18, 0x13, 0x14, 0x0b, 0x03, 0x07, 0x05, + 0x03, 0x02, 0x03, 0x01, 0x00, 0xfe, 0x00, 0x03, 0x02, 0xff, 0xff, 0x05, + 0x07, 0x07, 0xff, 0xf9, 0xfd, 0xf3, 0xec, 0xf2, 0xfa, 0x03, 0x05, 0x01, + 0xfe, 0xff, 0x0b, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x07, 0x05, 0x09, 0x0a, + 0x05, 0x01, 0x01, 0x01, 0x07, 0x10, 0x0a, 0x02, 0x00, 0x0b, 0x07, 0x09, + 0x09, 0x0a, 0x03, 0xfd, 0xfb, 0xfd, 0x01, 0x02, 0xfd, 0xfb, 0x01, 0x0b, + 0x03, 0x05, 0x05, 0x01, 0xfb, 0xfd, 0x06, 0x03, 0x03, 0x0d, 0x0a, 0x0a, + 0x09, 0x09, 0x02, 0x00, 0xfe, 0x02, 0x02, 0x01, 0xfa, 0xff, 0x0f, 0x12, + 0x09, 0x06, 0x06, 0x05, 0x02, 0xff, 0x01, 0xf7, 0xf6, 0xfa, 0xf7, 0xf3, + 0x01, 0x1b, 0x14, 0x0e, 0x0e, 0x12, 0x12, 0x16, 0x10, 0x0b, 0x06, 0x03, + 0x01, 0xfe, 0xfa, 0xf7, 0xf2, 0xf3, 0xf7, 0xf9, 0xfb, 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x01, 0xfe, 0x01, 0x0e, 0x07, 0x05, 0x06, 0x0a, 0x07, 0x00, + 0x02, 0x07, 0x13, 0x10, 0x07, 0x0a, 0x05, 0xfb, 0x05, 0x02, 0x05, 0x02, + 0x01, 0x05, 0x09, 0x0a, 0x05, 0x02, 0x03, 0xfe, 0x01, 0x0b, 0x06, 0x06, + 0xff, 0x03, 0xff, 0xf6, 0xfe, 0xfd, 0xfb, 0x00, 0xfb, 0xf7, 0xf5, 0xf9, + 0x00, 0xfd, 0xff, 0x00, 0x0a, 0x0a, 0x0b, 0x0a, 0x07, 0x0a, 0x10, 0x0a, + 0x0f, 0x18, 0x1b, 0x17, 0x10, 0x0e, 0x03, 0xfe, 0x06, 0x07, 0x03, 0x00, + 0xff, 0xfe, 0x00, 0x02, 0x00, 0x03, 0x09, 0x02, 0xfa, 0xfa, 0xff, 0xfd, + 0xfb, 0xfa, 0xf1, 0xed, 0xf3, 0x09, 0x1a, 0x10, 0x07, 0x06, 0x0d, 0x0e, + 0x0b, 0x03, 0x03, 0x01, 0xff, 0x00, 0xfd, 0xff, 0x05, 0x05, 0x05, 0x02, + 0xfd, 0x00, 0x06, 0x03, 0x06, 0x06, 0x02, 0xff, 0xfe, 0x06, 0x0f, 0x10, + 0x0b, 0x06, 0x0a, 0x0f, 0x10, 0x07, 0x09, 0x0d, 0x07, 0x05, 0x02, 0x00, + 0x03, 0xfe, 0xf9, 0xf9, 0xf5, 0xfa, 0xff, 0x00, 0xff, 0xfe, 0xfe, 0xfa, + 0xfb, 0xfe, 0x03, 0x00, 0x05, 0x06, 0x0b, 0x10, 0x12, 0x13, 0x12, 0x18, + 0x13, 0x0d, 0x0b, 0x06, 0x03, 0xf6, 0xf5, 0xf3, 0xf9, 0x07, 0x0b, 0x06, + 0x00, 0x06, 0x09, 0x02, 0xfe, 0xfb, 0x05, 0x0b, 0x0d, 0x05, 0xfe, 0xfd, + 0x01, 0xf9, 0xf7, 0xf6, 0xfa, 0xfe, 0x02, 0x05, 0x0b, 0x0e, 0x12, 0x0f, + 0x0b, 0x0b, 0x09, 0x06, 0x03, 0x00, 0x01, 0xfd, 0xfa, 0xfd, 0x13, 0x1c, + 0x16, 0x12, 0x0e, 0x14, 0x03, 0xf7, 0xfe, 0x02, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03, 0x06, 0xff, 0xfd, 0xff, 0x00, 0xfb, 0xfd, 0x0e, 0x09, + 0x00, 0xfa, 0x00, 0x0b, 0x07, 0x02, 0xfa, 0xfb, 0xfe, 0xf9, 0xfb, 0x00, + 0x0f, 0x0d, 0x02, 0x00, 0x05, 0x09, 0x0a, 0x09, 0x05, 0x05, 0x13, 0x14, + 0x0e, 0x07, 0x05, 0x02, 0xfa, 0xf7, 0xfb, 0x06, 0x09, 0x13, 0x0e, 0x0f, + 0x18, 0x10, 0x0e, 0x0a, 0x07, 0x05, 0x00, 0xfe, 0xf7, 0xf1, 0xf1, 0xf0, + 0xf1, 0xf3, 0x02, 0xff, 0xfe, 0x01, 0x0b, 0x05, 0xfe, 0xfd, 0x00, 0x09, + 0x09, 0x07, 0x03, 0x01, 0x06, 0x02, 0x03, 0x06, 0x07, 0x12, 0x0f, 0x10, + 0x10, 0x12, 0x18, 0x05, 0xfe, 0x01, 0x02, 0x05, 0xff, 0xfa, 0xfb, 0xfa, + 0xfa, 0xfe, 0xfe, 0x0d, 0x16, 0x0f, 0x0b, 0x05, 0x07, 0x02, 0x02, 0x02, + 0xfa, 0xfa, 0x00, 0x00, 0xfd, 0xf7, 0xf7, 0xfe, 0x06, 0x0b, 0x09, 0x02, + 0x00, 0x03, 0x0a, 0x0d, 0x05, 0x01, 0x07, 0x16, 0x1a, 0x16, 0x0d, 0x03, + 0x06, 0x03, 0xfa, 0xed, 0xf9, 0x0a, 0x0b, 0x05, 0x02, 0x03, 0x02, 0x01, + 0xfe, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xfa, 0xfa, 0x02, 0x01, 0x02, 0x00, + 0x02, 0x06, 0x0b, 0x03, 0x03, 0x18, 0x14, 0x0f, 0x0d, 0x07, 0x06, 0x09, + 0x03, 0xfd, 0xf9, 0xf5, 0xf9, 0x00, 0x06, 0x10, 0x0e, 0x0b, 0x0b, 0x0f, + 0x0b, 0x06, 0xf9, 0xf1, 0x02, 0x05, 0x05, 0x02, 0x06, 0x0d, 0x0d, 0x12, + 0x10, 0x0f, 0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0xff, 0x00, 0x00, 0xfd, + 0xf5, 0xf2, 0xee, 0xec, 0xe9, 0xf0, 0xf6, 0xfa, 0x0b, 0x16, 0x0d, 0x09, + 0x09, 0x10, 0x09, 0x05, 0x05, 0x0b, 0x12, 0x1d, 0x20, 0x17, 0x12, 0x17, + 0x14, 0x07, 0xfa, 0xfe, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x03, 0x00, 0x00, + 0x06, 0x09, 0x00, 0xfa, 0xf2, 0xfb, 0xfb, 0xfd, 0xfd, 0xfb, 0x05, 0x0a, + 0x03, 0xff, 0x00, 0x06, 0x02, 0x02, 0x01, 0x0b, 0x0a, 0x03, 0x01, 0x01, + 0x05, 0x03, 0xff, 0xfe, 0x02, 0x13, 0x0f, 0x0d, 0x07, 0x03, 0x12, 0x18, + 0x13, 0x00, 0xfb, 0x00, 0x01, 0x02, 0xf9, 0xf9, 0xfd, 0xf9, 0xf9, 0x02, + 0x12, 0x0e, 0x05, 0x03, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x0d, 0x0f, 0x0a, + 0xfe, 0xf6, 0xfe, 0x09, 0x05, 0x01, 0x06, 0x0a, 0x03, 0x01, 0xfd, 0x00, + 0x05, 0x01, 0xfd, 0x00, 0x07, 0x0d, 0x09, 0x05, 0x00, 0xfe, 0xfd, 0x00, + 0xfe, 0xfa, 0x0f, 0x12, 0x09, 0x02, 0x0b, 0x1a, 0x14, 0x0e, 0x0e, 0x0e, + 0x02, 0xfd, 0xf9, 0x00, 0x05, 0xf9, 0xf6, 0xfe, 0x00, 0xfe, 0xfd, 0xf3, + 0xee, 0xf1, 0xf6, 0x01, 0x0b, 0x12, 0x18, 0x0d, 0x01, 0xf9, 0xf7, 0x05, + 0x09, 0x07, 0x0e, 0x14, 0x1b, 0x16, 0x1f, 0x1f, 0x1b, 0x18, 0x12, 0x0b, + 0x05, 0xf5, 0xf2, 0xf2, 0xf1, 0xf9, 0xfd, 0xf9, 0xfa, 0xfb, 0x05, 0x07, + 0x00, 0xf5, 0xf1, 0xfa, 0x0a, 0x16, 0x10, 0x0e, 0x02, 0xfe, 0xff, 0xf7, + 0xee, 0xf7, 0xf7, 0xf7, 0xf9, 0x02, 0x17, 0x0b, 0x07, 0x12, 0x0f, 0x0b, + 0x06, 0x06, 0x0a, 0x0f, 0x0a, 0x07, 0x05, 0x0e, 0x1a, 0x17, 0x13, 0x12, + 0x02, 0xf5, 0xf9, 0xfb, 0x00, 0x02, 0xff, 0x06, 0x01, 0xff, 0x00, 0xf7, + 0xf9, 0xf9, 0xfb, 0xf7, 0xf1, 0xfb, 0x09, 0x1b, 0x1a, 0x0e, 0x05, 0x05, + 0x02, 0x0b, 0x09, 0x0a, 0x07, 0x00, 0xfe, 0xff, 0x01, 0x02, 0x00, 0xfb, + 0x00, 0xfb, 0xf9, 0xf9, 0x00, 0x05, 0x05, 0x00, 0x00, 0x0b, 0x0f, 0x17, + 0x0d, 0xfd, 0xf6, 0xf7, 0x00, 0x0d, 0x13, 0x12, 0x10, 0x17, 0x12, 0x0f, + 0x10, 0x12, 0x0e, 0x02, 0xfe, 0xf9, 0xf7, 0xf2, 0xf6, 0xf7, 0x00, 0xfe, + 0xf0, 0xf1, 0xf5, 0x01, 0x0a, 0x02, 0xfb, 0xf7, 0xfe, 0x09, 0x13, 0x1c, + 0x18, 0x0f, 0x0f, 0x0b, 0x07, 0x13, 0x0f, 0x0e, 0x10, 0x0a, 0x07, 0x0e, + 0x02, 0xfb, 0x00, 0x06, 0x00, 0xf7, 0xf6, 0xfa, 0x01, 0xfe, 0xf2, 0xf5, + 0xfd, 0xff, 0x00, 0x09, 0x05, 0x03, 0xfe, 0xff, 0xff, 0x03, 0x06, 0x06, + 0xfd, 0x00, 0x05, 0x0a, 0x07, 0x10, 0x09, 0x09, 0x02, 0x00, 0x00, 0x03, + 0x0e, 0x1d, 0x17, 0x0e, 0x10, 0x13, 0x12, 0x17, 0x10, 0x09, 0x00, 0xfd, + 0xed, 0xf2, 0xf9, 0xf9, 0xf9, 0xfa, 0xf7, 0xf9, 0xf7, 0xf7, 0xf9, 0x01, + 0x03, 0x03, 0x01, 0x06, 0x0b, 0x1c, 0x0a, 0x05, 0x02, 0x00, 0x01, 0x05, + 0x03, 0x00, 0xfd, 0x09, 0x0a, 0x03, 0x05, 0x0a, 0x05, 0x00, 0xfd, 0xfd, + 0xfb, 0xfd, 0x00, 0x01, 0x07, 0x07, 0x0a, 0x0e, 0x0d, 0x14, 0x10, 0x03, + 0xf9, 0x01, 0x05, 0x07, 0x14, 0x23, 0x1c, 0x10, 0x09, 0x01, 0x00, 0xff, + 0xfb, 0xf7, 0xf9, 0xf3, 0xf1, 0xfd, 0x00, 0xff, 0x01, 0x03, 0x01, 0xf6, + 0xe6, 0xed, 0xfb, 0x00, 0x05, 0x0a, 0x07, 0x0a, 0x10, 0x16, 0x0e, 0x0d, + 0x0b, 0x07, 0x07, 0x0b, 0x13, 0x10, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0xfb, + 0xea, 0xf5, 0xf5, 0xf9, 0xf6, 0xf7, 0x00, 0x0e, 0x0a, 0x05, 0x07, 0x10, + 0x0b, 0x0b, 0x05, 0xff, 0xff, 0xfe, 0x01, 0x03, 0x02, 0x07, 0x07, 0xfe, + 0xf6, 0xfd, 0xff, 0xff, 0x07, 0x0b, 0x06, 0x02, 0x02, 0x09, 0x0d, 0x16, + 0x0d, 0x07, 0x07, 0x07, 0x01, 0x07, 0x0e, 0x10, 0x0e, 0x13, 0x0b, 0xf9, + 0xf2, 0xf9, 0xf6, 0xf0, 0xf7, 0xfd, 0xfa, 0xf9, 0xfd, 0x01, 0x03, 0x03, + 0x02, 0x02, 0xfe, 0x07, 0x0b, 0x09, 0x0a, 0x0f, 0x0f, 0x0a, 0x16, 0x0b, + 0x03, 0x01, 0x09, 0x0a, 0x02, 0xf7, 0xf5, 0xfa, 0xfe, 0x00, 0x00, 0x0a, + 0x05, 0x02, 0x0b, 0x0f, 0x0d, 0x02, 0xff, 0x03, 0x0f, 0x0d, 0x0b, 0x00, + 0x00, 0x03, 0x02, 0x09, 0x0e, 0x0a, 0x07, 0x07, 0x05, 0x00, 0xfe, 0x00, + 0x02, 0x0b, 0x06, 0xfe, 0xf6, 0xf2, 0xf6, 0xfa, 0xf2, 0xf2, 0xf2, 0xe9, + 0xf5, 0x07, 0x07, 0x0d, 0x13, 0x0e, 0x09, 0x10, 0x0e, 0x0f, 0x0d, 0x0e, + 0x10, 0x0b, 0x0a, 0x0a, 0x10, 0x0f, 0x10, 0x13, 0x0b, 0x05, 0x00, 0xfa, + 0xf7, 0xf6, 0xfa, 0x02, 0x05, 0x10, 0x0b, 0x05, 0xfe, 0xf7, 0xf3, 0x01, + 0x00, 0xfe, 0xfa, 0x0a, 0x02, 0x00, 0x00, 0xff, 0x02, 0x09, 0x02, 0xf7, + 0xf7, 0xfd, 0x01, 0x0b, 0x14, 0x06, 0x00, 0x03, 0x07, 0x18, 0x13, 0x0b, + 0x0d, 0x0e, 0x0b, 0x0e, 0x0e, 0x14, 0x0a, 0x07, 0x05, 0xfd, 0xf5, 0xe1, + 0xdf, 0xf0, 0xf9, 0x00, 0x00, 0x06, 0x05, 0x02, 0x02, 0x06, 0x0b, 0x0b, + 0x02, 0x05, 0x0d, 0x0f, 0x0e, 0x12, 0x12, 0x0f, 0x17, 0x0f, 0x03, 0xfb, + 0xff, 0x00, 0xf9, 0xf5, 0xf3, 0xfd, 0x02, 0x06, 0x01, 0x01, 0xf9, 0xf6, + 0xf5, 0xfb, 0xff, 0x01, 0x02, 0x02, 0x14, 0x21, 0x1a, 0x1c, 0x10, 0x00, + 0x01, 0x02, 0x00, 0x05, 0x0d, 0x0a, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0xf9, 0xf2, 0xec, 0xf2, 0xfa, 0xfb, 0x02, 0xff, 0xff, 0x07, + 0xff, 0x01, 0x0d, 0x0b, 0x09, 0x0d, 0x10, 0x09, 0x07, 0x18, 0x17, 0x0e, + 0x06, 0x09, 0x0b, 0x0f, 0x0e, 0x07, 0x03, 0x06, 0x02, 0x01, 0xff, 0xf3, + 0xf3, 0xf9, 0x00, 0x07, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x0f, 0x0d, + 0x02, 0x01, 0x02, 0xf9, 0xf2, 0xf6, 0xfd, 0x00, 0x00, 0xfd, 0xf7, 0x00, + 0x02, 0xfb, 0xfa, 0x0b, 0x14, 0x0a, 0x05, 0x13, 0x1f, 0x14, 0x13, 0x13, + 0x10, 0x16, 0x10, 0x0d, 0x03, 0x00, 0x05, 0x05, 0xfe, 0xfd, 0xfd, 0xf1, + 0xfd, 0x05, 0x07, 0x02, 0x00, 0xf7, 0xf3, 0xf9, 0xfb, 0xfd, 0x00, 0x00, + 0x0e, 0x0d, 0x0a, 0x13, 0x10, 0x0f, 0x13, 0x0e, 0x07, 0x00, 0xfe, 0xfb, + 0xfb, 0x03, 0x01, 0xff, 0x01, 0xff, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf9, + 0x02, 0x10, 0x13, 0x0d, 0x16, 0x1b, 0x0f, 0x07, 0x05, 0x0f, 0x0a, 0xfb, + 0xfe, 0xfd, 0xfb, 0x0d, 0x0a, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x05, 0x05, + 0x00, 0xf9, 0xf5, 0xf9, 0xfb, 0xff, 0x00, 0xff, 0xf7, 0x05, 0x01, 0xfe, + 0x05, 0x10, 0x12, 0x16, 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x09, 0x02, 0x0e, 0x10, 0x0a, 0x0a, 0x0b, 0x03, 0xf7, + 0xfb, 0x05, 0x0b, 0x00, 0x05, 0x0d, 0x0a, 0x03, 0x00, 0xff, 0xf9, 0xf9, + 0x00, 0xfb, 0xfb, 0xfe, 0x00, 0x09, 0x00, 0xf9, 0xf6, 0x00, 0xfe, 0xf6, + 0xf5, 0xfe, 0x0a, 0x16, 0x0d, 0x0d, 0x18, 0x1b, 0x23, 0x25, 0x1d, 0x12, + 0x10, 0x09, 0xfe, 0xf9, 0xfb, 0xfb, 0xfb, 0xff, 0x01, 0x01, 0xf7, 0xf3, + 0xf9, 0xfa, 0xf7, 0xfa, 0xfd, 0xfe, 0x05, 0x06, 0x0d, 0x10, 0x16, 0x0f, + 0x07, 0x07, 0x0d, 0x0e, 0x06, 0x07, 0x00, 0xf3, 0xf6, 0x03, 0x03, 0x01, + 0xfd, 0xff, 0xfe, 0xf9, 0xf7, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x07, 0x0d, + 0x0d, 0x07, 0x0d, 0x16, 0x0e, 0x14, 0x1b, 0x16, 0x1d, 0x1c, 0x0d, 0xfb, + 0xf9, 0xfb, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf5, 0xf2, 0x01, + 0xfe, 0xf6, 0xf9, 0xfb, 0xf3, 0xf6, 0xf3, 0x07, 0x0a, 0x07, 0x16, 0x17, + 0x16, 0x0f, 0x07, 0x00, 0x00, 0xff, 0x01, 0x03, 0x09, 0x0f, 0x12, 0x0a, + 0x05, 0x01, 0x06, 0x0a, 0x05, 0x00, 0x00, 0x07, 0x0a, 0x09, 0xf7, 0xf9, + 0x02, 0x0d, 0x14, 0x05, 0x00, 0xff, 0xff, 0xfe, 0xf9, 0x00, 0x09, 0x05, + 0x00, 0x00, 0xfe, 0xfb, 0xf6, 0xf5, 0xf5, 0xff, 0x02, 0xfe, 0x00, 0x07, + 0x02, 0x05, 0x0f, 0x10, 0x1b, 0x20, 0x20, 0x1a, 0x12, 0x09, 0x02, 0xff, + 0xf9, 0xf7, 0xff, 0x09, 0x06, 0x01, 0x00, 0x02, 0x07, 0x05, 0xf6, 0xfe, + 0xfe, 0xfb, 0xfe, 0x00, 0xfd, 0xfe, 0x00, 0x02, 0x0f, 0x17, 0x12, 0x0a, + 0x0d, 0x0d, 0x14, 0x06, 0x00, 0xfb, 0x00, 0x01, 0x00, 0xf6, 0xf3, 0xf6, + 0xf6, 0xfb, 0xfe, 0xfd, 0xfd, 0x07, 0x06, 0x02, 0x0a, 0x07, 0x06, 0x0a, + 0x0d, 0x1f, 0x1c, 0x0a, 0x0a, 0x0d, 0x0e, 0x12, 0x0f, 0x00, 0xf1, 0xf1, + 0xf6, 0x06, 0x0a, 0x07, 0x09, 0x0d, 0x0a, 0x09, 0x05, 0xfe, 0xf9, 0xf3, + 0xf3, 0xf1, 0xee, 0xec, 0xf2, 0x0a, 0x14, 0x1a, 0x0f, 0x05, 0x02, 0x05, + 0x00, 0xfb, 0xfe, 0xfe, 0x02, 0x05, 0x07, 0x0a, 0x05, 0x00, 0x01, 0x01, + 0x01, 0x0f, 0x0f, 0x0f, 0x12, 0x1a, 0x1f, 0x1a, 0x0f, 0x0d, 0x10, 0x06, + 0xfe, 0xfe, 0xf9, 0xf7, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0x03, 0x00, 0xf7, + 0xf6, 0xf9, 0xf2, 0xec, 0xf3, 0x00, 0x05, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x07, 0x1b, 0x30, 0x24, 0x21, 0x1f, 0x1f, 0x14, 0x0a, 0x02, 0x00, 0x00, + 0xfb, 0xf9, 0xf6, 0xf9, 0xf6, 0x00, 0x0a, 0x09, 0x02, 0xf5, 0xf3, 0xfe, + 0xf3, 0xf6, 0xfe, 0x00, 0x00, 0x05, 0x21, 0x1c, 0x0f, 0x09, 0x07, 0x05, + 0x03, 0x02, 0xf9, 0xfb, 0x00, 0x0d, 0x0b, 0x02, 0xfe, 0x00, 0x00, 0xfe, + 0xfe, 0xfe, 0xfe, 0xfb, 0xfe, 0x05, 0x00, 0x00, 0x01, 0x07, 0x1a, 0x1f, + 0x12, 0x0f, 0x07, 0x0d, 0x12, 0x14, 0x0d, 0x05, 0x00, 0xf6, 0xf9, 0xf9, + 0x00, 0x05, 0x02, 0x05, 0x02, 0x00, 0x05, 0x07, 0xff, 0x01, 0x00, 0xfb, + 0xf6, 0xf1, 0x00, 0x0d, 0x0d, 0x07, 0x02, 0x00, 0xfe, 0xfe, 0xfb, 0xf9, + 0xfb, 0x00, 0x05, 0x07, 0x02, 0x0d, 0x07, 0x05, 0x00, 0x00, 0x00, 0x05, + 0x14, 0x0d, 0x05, 0x0b, 0x16, 0x1d, 0x1c, 0x24, 0x1b, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xf3, + 0xe6, 0xec, 0xf0, 0xf1, 0x07, 0x05, 0x00, 0x00, 0xfe, 0x05, 0x05, 0x16, + 0x25, 0x1a, 0x0d, 0x0e, 0x0d, 0x07, 0x05, 0x05, 0x05, 0x0d, 0x03, 0x00, + 0x02, 0x02, 0x07, 0x0d, 0x14, 0x0f, 0x0a, 0x05, 0xf7, 0xf6, 0xf3, 0xf1, + 0xf9, 0x02, 0x02, 0x01, 0x0d, 0x07, 0x07, 0x00, 0x05, 0x05, 0xfe, 0xf6, + 0xf9, 0xf9, 0xfb, 0x02, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x02, 0x03, + 0x00, 0x0d, 0x0f, 0x0a, 0x07, 0x10, 0x0f, 0x0d, 0x1a, 0x12, 0x06, 0x02, + 0x02, 0x00, 0x02, 0x05, 0x02, 0xfe, 0xfd, 0xfb, 0xf7, 0xff, 0x02, 0x0a, + 0x03, 0x00, 0xfe, 0xfb, 0xfe, 0x05, 0x00, 0xff, 0x07, 0x0d, 0xfb, 0xfb, + 0x0d, 0x13, 0x0d, 0x07, 0x03, 0x02, 0x02, 0x00, 0x00, 0xfe, 0xfe, 0xfe, + 0xff, 0x00, 0x05, 0x00, 0xfe, 0xfb, 0xfd, 0x00, 0x00, 0x0d, 0x17, 0x1a, + 0x14, 0x1a, 0x14, 0x12, 0x1a, 0x21, 0x1a, 0x00, 0xf6, 0xf7, 0xfa, 0xfe, + 0x0a, 0x0d, 0x00, 0xfb, 0xfe, 0x05, 0x07, 0x00, 0xf6, 0xee, 0xee, 0xf1, + 0xf0, 0xfb, 0xfb, 0xfb, 0x00, 0x01, 0xfe, 0xf9, 0xfb, 0x07, 0x0f, 0x1f, + 0x1a, 0x12, 0x0f, 0x0a, 0x05, 0x02, 0x03, 0x01, 0x01, 0x01, 0x09, 0x0e, + 0x0b, 0x10, 0x13, 0x0e, 0x0b, 0x13, 0x06, 0xf5, 0x03, 0x09, 0x06, 0x03, + 0x03, 0x0b, 0x06, 0x06, 0xfd, 0xf7, 0xfb, 0xf6, 0xf0, 0xf0, 0xfa, 0xf2, + 0xf2, 0x0a, 0x13, 0x0e, 0x03, 0x00, 0xfd, 0xfd, 0xf7, 0xfd, 0x03, 0x03, + 0x0d, 0x0b, 0x0d, 0x13, 0x0b, 0x17, 0x1c, 0x1b, 0x10, 0x06, 0x06, 0x09, + 0x09, 0x03, 0x06, 0x0d, 0x09, 0x06, 0xfa, 0xf2, 0xf5, 0xfb, 0xfd, 0xf7, + 0xf1, 0xf2, 0x01, 0x18, 0x1d, 0x0b, 0xf2, 0xf2, 0xf2, 0x03, 0x09, 0x09, + 0x03, 0x00 +}; diff --git a/examples/PlayMODFromPROGMEMToPDM/PlayMODFromPROGMEMToPDM.ino b/examples/PlayMODFromPROGMEMToPDM/PlayMODFromPROGMEMToPDM.ino new file mode 100644 index 00000000..7a67be72 --- /dev/null +++ b/examples/PlayMODFromPROGMEMToPDM/PlayMODFromPROGMEMToPDM.ino @@ -0,0 +1,47 @@ +#include +#include "AudioFileSourcePROGMEM.h" +#include "AudioGeneratorMOD.h" +#include "AudioOutputPDM.h" + +#if defined(ESP8266) || defined(ARDUINO_ARCH_RP2040) +void setup() { + Serial.begin(115200); + Serial.printf("Only for the ESP32\n"); +} + +void loop() { +} +#else + +// 5_steps.mod sample from the mod archive: https://modarchive.org/ +#include "5steps.h" + +AudioGeneratorMOD *mod; +AudioFileSourcePROGMEM *file; +AudioOutputPDM *out; + +void setup() { + Serial.begin(115200); + delay(1000); + + audioLogger = &Serial; + file = new AudioFileSourcePROGMEM(steps_mod, sizeof(steps_mod)); + out = new AudioOutputPDM(5 /* change to your PDM output pim*/); + mod = new AudioGeneratorMOD(); + mod->SetBufferSize(3 * 1024); + mod->SetSampleRate(44100); + mod->SetStereoSeparation(32); + mod->begin(file, out); +} + +void loop() { + if (mod->isRunning()) { + if (!mod->loop()) { + mod->stop(); + } + } else { + Serial.printf("MOD done\n"); + delay(1000); + } +} +#endif diff --git a/examples/PlayMODFromPROGMEMToPWM/5steps.h b/examples/PlayMODFromPROGMEMToPWM/5steps.h new file mode 100644 index 00000000..312e4efa --- /dev/null +++ b/examples/PlayMODFromPROGMEMToPWM/5steps.h @@ -0,0 +1,11253 @@ +const unsigned char steps_mod[] = { + 0x35, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x20, 0x76, 0x69, + 0x6e, 0x6e, 0x69, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x20, 0x00, 0x03, 0xed, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xd1, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe1, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, 0x6d, + 0x65, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, + 0x05, 0xf4, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x20, 0x70, 0x61, 0x61, + 0x6c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x06, 0x6a, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x67, 0x65, 0x6f, 0x72, 0x67, 0x20, 0x73, 0x74, 0x61, + 0x6e, 0x67, 0x73, 0x20, 0x67, 0x74, 0x20, 0x36, 0x20, 0x20, 0x20, 0x00, + 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x20, 0x31, 0x37, 0x37, + 0x37, 0x20, 0x68, 0x61, 0x6c, 0x64, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x06, 0x52, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x6e, 0x6f, 0x72, 0x77, 0x61, 0x79, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, + 0x05, 0xef, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x0c, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0x00, 0x40, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x50, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x61, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x93, 0x00, 0x40, 0x04, 0x08, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x70, 0x00, 0x40, 0x00, 0x63, 0x02, 0xf6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xcc, 0x00, 0x40, 0x00, 0xc2, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x20, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x22, 0x7f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x00, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x2e, 0x4b, 0x2e, 0x00, 0xd6, 0x5c, 0x00, 0x00, 0x00, 0x0f, 0x0f, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0x92, 0x00, 0xf0, 0x9c, 0x00, 0x00, 0x00, 0x0f, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x28, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x10, 0x00, 0xa0, 0x5c, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x06, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x20, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xdc, 0x20, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xbc, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xe2, 0x9c, 0x08, 0x01, 0x53, 0xac, 0x00, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0xd6, 0x03, 0x03, 0x00, 0x00, 0x0a, 0x10, + 0x01, 0xac, 0xfc, 0x11, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x04, 0xe2, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x7c, 0x20, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0xd6, 0x0e, 0xc1, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x6c, 0x10, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0xbc, 0x30, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0a, 0x04, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0xd6, 0x0e, 0xc2, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa2, 0x01, 0xe0, 0xfc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xd6, 0x09, 0x05, 0x01, 0x53, 0x09, 0x05, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x10, 0xd6, 0x0c, 0x10, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0xd6, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0xac, 0x03, 0xf0, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x01, 0x68, 0x03, 0xf9, + 0x01, 0x40, 0x01, 0x01, 0x00, 0xa0, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x02, 0x01, 0x40, 0x03, 0x03, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x01, 0x53, 0xec, 0x11, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x99, 0x03, + 0x01, 0x7d, 0xac, 0x20, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0xf0, 0x03, 0xf0, 0x00, 0x00, 0x0e, 0x11, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xfc, 0x21, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xf0, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x20, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x30, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xd6, 0x50, 0x00, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xf0, 0xfc, 0x20, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0xe2, 0x03, 0xd0, 0x01, 0x68, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xd6, 0x5c, 0x30, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xe2, 0x9c, 0x20, 0x01, 0x53, 0xac, 0x18, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0xd6, 0x03, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x01, 0xac, 0xfc, 0x1f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x03, 0xd0, 0x00, 0xa0, 0x8c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xec, 0x0f, + 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xec, 0x30, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xec, 0x10, 0x00, 0xa0, 0x6c, 0x10, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x0e, 0xc1, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xdc, 0x30, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x2e, 0x03, 0x06, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xdc, 0x10, + 0x00, 0xa0, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xd6, 0x04, 0xe4, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xea, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xdc, 0x1f, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x03, 0x07, 0x01, 0x53, 0x03, 0x0f, + 0x00, 0xd6, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0xde, 0xc1, 0x00, 0xa0, 0x80, 0x00, 0x00, 0xe2, 0x03, 0xf0, + 0x01, 0x68, 0x03, 0x02, 0x00, 0xe2, 0xdc, 0x21, 0x00, 0xaa, 0x5c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0xaa, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xed, 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xfe, 0x09, 0x03, 0x01, 0x7d, 0xac, 0x20, 0x00, 0xf0, 0xec, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0xf0, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xdc, 0x10, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0e, 0xc1, + 0x00, 0xd6, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x40, 0xec, 0x10, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x0d, 0xec, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xdc, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0xe0, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0a, 0x50, 0x00, 0xa0, 0x8c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x78, 0x0a, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x87, 0xdc, 0x10, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0x00, 0x9c, 0x20, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0xe0, 0xfc, 0x2f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0xb4, 0xac, 0x05, 0x00, 0xf0, 0xdc, 0x26, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x5c, 0x09, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x10, 0x10, 0x87, 0x0c, 0x10, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x01, 0xc5, 0xfc, 0x20, 0x00, 0xa0, 0xcf, 0x08, 0x00, 0xe2, 0x9c, 0x20, + 0x00, 0xaa, 0xac, 0x30, 0x01, 0xac, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x03, 0x03, 0x00, 0x00, 0x0a, 0x03, 0x10, 0xd6, 0x0c, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x10, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0xd6, 0xec, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0xdc, 0x1a, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0x0e, 0xc1, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0x03, 0x36, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x68, 0xdc, 0x18, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0x03, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xb4, 0x03, 0xf2, 0x00, 0xe2, 0xdc, 0x21, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x90, 0x00, 0x00, 0xbe, 0xac, 0x20, + 0x00, 0xf0, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xf0, 0x93, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x20, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x20, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x5c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x10, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xdc, 0x10, + 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x24, + 0x00, 0xaa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xfc, 0x20, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xf0, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x20, 0x00, 0xa0, 0xcd, 0x00, 0x00, 0xd6, 0x90, 0x00, + 0x00, 0xaa, 0xac, 0x30, 0x10, 0xd6, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x04, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x7f, 0x7c, 0x20, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xf0, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xfc, 0x10, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xfc, 0x30, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe2, 0x0f, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xdc, 0x30, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x1d, 0xdc, 0x10, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0x0e, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0x03, 0x06, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xdc, 0x10, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x03, 0xf0, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0xda, 0x0f, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x03, 0xf0, 0x00, 0xb4, 0x0e, 0xb2, + 0x00, 0xe2, 0xdc, 0x21, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x90, 0x00, + 0x00, 0xbe, 0xac, 0x20, 0x00, 0xf0, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0xf0, 0x93, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x09, 0x10, + 0x00, 0x7f, 0x7c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0xec, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x20, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xec, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x10, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0d, 0xec, 0x20, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xec, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x40, 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0a, 0x0f, 0x00, 0xa0, 0x0e, 0x93, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x87, 0xdc, 0x10, 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x20, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x78, 0x0a, 0x0f, + 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x7d, 0xec, 0x10, 0x00, 0xbe, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 0xbe, 0x4c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x40, + 0x00, 0xbe, 0x4c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0x03, 0x30, 0x00, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xcf, 0x08, 0x00, 0xaa, 0x9c, 0x30, 0x00, 0xfe, 0xac, 0x30, + 0x01, 0x40, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x03, + 0x00, 0x00, 0x0a, 0x01, 0x10, 0xa0, 0x0c, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xdc, 0x20, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xec, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x30, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x68, 0xfc, 0x40, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfa, 0x0f, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xea, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0xec, 0x10, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xdc, 0x30, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0xda, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, 0x00, 0xaa, 0x03, 0xf0, + 0x01, 0x0d, 0x03, 0xf2, 0x00, 0xaa, 0xdc, 0x21, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xbe, 0x9c, 0x29, 0x01, 0x1d, 0xac, 0x20, 0x00, 0xb4, 0xec, 0x30, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xb4, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x10, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xec, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xfc, 0x20, + 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd0, 0x00, 0x00, 0xa0, 0x1c, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xe2, 0x0f, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xec, 0x20, 0x00, 0xaa, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x05, 0x02, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb4, 0xdc, 0x22, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xf0, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x0c, 0x20, + 0x00, 0xa0, 0xcd, 0x00, 0x00, 0xaa, 0x9c, 0x30, 0x00, 0xfe, 0xac, 0x30, + 0x10, 0xa0, 0x04, 0xe4, 0x00, 0x00, 0x0f, 0x08, 0x00, 0xa0, 0x03, 0xf3, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xf0, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xfc, 0x30, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xec, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0a, 0x60, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0xdc, 0x20, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x30, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xfc, 0x40, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfa, 0x0f, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xb4, 0x0c, 0x20, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfc, 0x20, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xea, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xfc, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xec, 0x20, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0xec, 0x30, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x03, 0xf0, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xdc, 0x20, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0xde, 0xc1, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xaa, 0x03, 0xf0, 0x01, 0x0d, 0x03, 0xf2, 0x00, 0xaa, 0xdc, 0x21, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x04, 0xed, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb2, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xbe, 0x9c, 0x29, 0x01, 0x1d, 0xac, 0x20, + 0x00, 0xb4, 0xec, 0x30, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0xb4, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x09, 0x10, 0x00, 0x7f, 0x7c, 0x30, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xca, 0xdc, 0x10, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xdc, 0x10, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xec, 0x10, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xec, 0x20, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x04, 0xe8, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x04, 0xec, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xf0, 0xec, 0x10, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xca, 0xec, 0x20, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xb4, 0xdc, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xb4, 0xdc, 0x20, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xdc, 0x20, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0x8c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x40, 0xdc, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xa0, 0x03, 0x30, + 0x00, 0xa0, 0x1c, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x53, 0xec, 0x17, 0x00, 0xa0, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xaa, 0x03, 0xf0, 0x00, 0xa0, 0x8c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x68, 0xec, 0x20, + 0x00, 0xbe, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xb4, 0x03, 0xf0, 0x00, 0xbe, 0x4c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x01, 0x7d, 0xec, 0x1a, 0x00, 0xbe, 0x4c, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x03, 0xf0, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x01, 0x94, 0xec, 0x1a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xca, 0x03, 0xf0, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x9f, 0x08, 0x00, 0x00, 0x0a, 0x01, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0x05, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xa0, 0x8c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0xd6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x93, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x50, 0x00, + 0x00, 0xd6, 0x3c, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x0a, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x07, 0x00, 0xd6, 0x3c, 0x08, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x10, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x5c, 0x20, 0x00, 0xd6, 0x3c, 0x28, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5c, 0x08, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x20, + 0x00, 0xa0, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x15, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xec, 0x30, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0d, 0x00, 0xd6, 0x3c, 0x08, 0x00, 0x00, 0x9a, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0d, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x7f, 0x7c, 0x20, 0x00, 0x00, 0x9a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xda, 0x0f, 0x00, 0x7f, 0x2c, 0x06, + 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xdc, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xec, 0x10, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe1, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x30, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x9a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xda, 0x0f, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xbe, 0x0e, 0x93, + 0x00, 0x00, 0x9a, 0x06, 0x11, 0x1d, 0x1c, 0x10, 0x01, 0x68, 0xda, 0x0f, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x0c, 0x00, + 0x10, 0xa0, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x14, 0x00, 0x00, 0x9a, 0x06, + 0x10, 0xf0, 0x1c, 0x12, 0x10, 0xa0, 0x03, 0x02, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x0c, 0x02, 0x10, 0xb4, 0x0c, 0x10, + 0x00, 0xbe, 0x4c, 0x30, 0x00, 0x00, 0x9a, 0x06, 0x10, 0xd6, 0x1c, 0x10, + 0x10, 0xa0, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x06, + 0x00, 0x00, 0x0c, 0x00, 0x10, 0xa0, 0x03, 0x02, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x9f, 0x02, 0x10, 0xca, 0x1c, 0x1a, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x04, 0xe1, 0x10, 0xbe, 0x10, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x08, 0x10, 0xbe, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x11, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x10, 0x00, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0xb4, 0x0e, 0xd3, 0x00, 0xd6, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0a, 0x01, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0xaa, 0x0e, 0xd2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xd6, 0x9c, 0x20, 0x10, 0xaa, 0x1c, 0x15, 0x10, 0xd6, 0x0f, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x06, 0x10, 0xa0, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1d, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xaa, 0x1c, 0x0a, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xb4, 0x1c, 0x14, 0x10, 0xaa, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0xa0, 0x03, 0xd3, + 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xca, 0x1c, 0x10, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x1a, + 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x10, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, + 0x11, 0x0d, 0x10, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x02, + 0x10, 0xb4, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x0e, 0x11, 0x10, 0xb4, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x11, 0x0d, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x07, 0x11, 0x0d, 0x1c, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x11, 0x0d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xfc, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0x97, 0x1e, 0xd3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x8f, 0x10, 0x00, 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0x97, 0x1e, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x8f, 0x1c, 0x10, 0x10, 0x8f, 0x1e, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x87, 0x1c, 0x10, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0x8f, 0x1c, 0x20, + 0x10, 0x87, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x94, 0xe1, 0x10, 0x97, 0x1c, 0x06, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x10, 0xa0, 0x1c, 0x10, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x8f, 0x03, 0xd0, + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xa0, 0x03, 0xf0, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x08, 0x01, 0x1d, 0xde, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x10, 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x05, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xd6, 0x94, 0xe1, 0x10, 0xca, 0x1f, 0x01, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x10, 0xbe, 0x1f, 0x07, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, + 0x00, 0x00, 0x9a, 0x02, 0x11, 0x1d, 0x1c, 0x10, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, + 0x00, 0x00, 0x0c, 0x06, 0x11, 0x1d, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1c, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x30, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xb4, 0x0e, 0xd3, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0a, 0x03, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0xaa, 0x0e, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, 0x00, 0xd6, 0x9c, 0x20, + 0x10, 0xa0, 0x10, 0x00, 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x0f, 0x06, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x0a, 0x10, 0xa0, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xbe, 0x1c, 0x10, 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x10, 0x00, 0xd6, 0xe3, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x10, 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x10, 0xf0, 0x1c, 0x0a, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, + 0x00, 0x00, 0x04, 0xe4, 0x10, 0xca, 0x10, 0x00, 0x10, 0xf0, 0x1c, 0x0a, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x04, 0xe8, 0x10, 0xbe, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0e, 0x11, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0x8f, 0x1c, 0x10, + 0x10, 0xf0, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x10, 0x8f, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x1d, 0x1c, 0x10, + 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x20, 0x11, 0x1d, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xe2, 0x1c, 0x14, 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, 0x10, 0xd6, 0x10, 0x00, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x9a, 0x02, 0x11, 0x40, 0x1c, 0x10, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x40, 0x1c, 0x0a, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x05, 0x01, 0x68, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x06, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x11, 0x40, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xfe, 0x9c, 0x20, 0x11, 0x53, 0x10, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xe2, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x8c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x01, 0x0d, 0x9a, 0x04, 0x11, 0x68, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x0c, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x01, 0x1d, 0x9a, 0x04, 0x11, 0x7d, 0x1c, 0x13, 0x01, 0x7d, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbe, 0xc3, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x0a, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x10, 0xd6, 0x44, 0xe1, 0x10, 0xbe, 0x1c, 0x1a, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0xa0, 0x60, 0x00, 0x10, 0x00, 0x4c, 0x19, + 0x00, 0x00, 0x01, 0x01, 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x0c, 0x08, + 0x10, 0xbe, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x00, 0xbe, 0x4c, 0x08, + 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x09, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x10, 0x00, 0x44, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x10, 0x00, 0x4a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x10, 0x00, 0x4c, 0x20, 0x10, 0xd6, 0x1c, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4c, 0x1a, + 0x10, 0xbe, 0x10, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x10, 0x00, 0x4c, 0x15, 0x00, 0xb4, 0x0e, 0xd3, + 0x00, 0xd6, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x7f, 0x7c, 0x10, + 0x10, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x0a, 0x01, 0x10, 0xb4, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, 0x00, 0xaa, 0x0e, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xd6, 0x9c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x9c, 0x20, 0x10, 0xaa, 0x1c, 0x15, + 0x10, 0xd6, 0x0f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x0f, 0x06, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x10, 0xa0, 0x1c, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0c, 0x10, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xaa, 0x1c, 0x0a, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x14, 0x10, 0xaa, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0xa0, 0x03, 0xd3, 0x00, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x00, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x00, 0xbe, 0x0c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x1a, 0x00, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xfe, 0x1c, 0x10, + 0x00, 0xf0, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xf0, 0x94, 0xe1, 0x11, 0x0d, 0x1c, 0x1a, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0xb4, 0x0c, 0x10, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, + 0x00, 0x00, 0x0c, 0x0a, 0x11, 0x0d, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0xf0, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x11, 0x0d, 0x1c, 0x0a, 0x10, 0xb4, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0c, 0x0a, + 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfa, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xb4, 0x1c, 0x03, + 0x10, 0xa0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xa0, 0x1c, 0x10, + 0x01, 0x68, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x10, 0x97, 0x1c, 0x0a, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, + 0x10, 0x8f, 0x10, 0x00, 0x01, 0x68, 0xf4, 0xe5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x10, 0x87, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x87, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x78, 0x1c, 0x0a, 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0x7f, 0x1c, 0x10, 0x01, 0x40, 0xe3, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0x87, 0x1c, 0x20, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x78, 0x03, 0xf0, + 0x01, 0x68, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x10, 0x8f, 0x10, 0x00, 0x01, 0x40, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x10, 0xb4, 0x1c, 0x10, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe3, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x10, 0x01, 0x68, 0xec, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xa0, 0x1c, 0x10, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0xbe, 0x0e, 0xd3, + 0x00, 0xd6, 0xde, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x0c, 0x06, 0x10, 0xf0, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0xf0, 0x0e, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xe2, 0x0c, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xd6, 0x94, 0xe1, 0x10, 0xbe, 0x1c, 0x15, + 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x99, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x05, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xd6, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x10, 0xca, 0x10, 0x00, 0x01, 0xac, 0xfc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xca, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x05, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xd6, 0x1c, 0x0a, 0x01, 0x40, 0xef, 0x02, 0x00, 0x00, 0x0f, 0x06, + 0x00, 0x00, 0x0a, 0x04, 0x10, 0xca, 0x1c, 0x10, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4f, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xf0, 0x1c, 0x0a, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x02, + 0x00, 0xd6, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x6f, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x10, 0xca, 0x1c, 0x10, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xd6, 0x1c, 0x0a, + 0x10, 0xca, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xf0, 0x1c, 0x05, 0x00, 0xf0, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x97, 0x10, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x1c, 0x10, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x10, 0xd6, 0x10, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x02, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x6f, 0x04, + 0x00, 0x00, 0x9a, 0x08, 0x10, 0xa0, 0x1c, 0x12, 0x10, 0xd6, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0xca, 0x0e, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4f, 0x04, + 0x00, 0x00, 0x9a, 0x04, 0x10, 0xbe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x04, 0x10, 0xca, 0x1c, 0x10, + 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xca, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x94, 0xe1, + 0x10, 0xd6, 0x10, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x02, + 0x11, 0x40, 0x1c, 0x10, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x99, 0x19, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0xf0, 0x99, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x10, 0xd6, 0x1c, 0x06, + 0x11, 0x40, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x11, 0x40, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x04, 0x11, 0x2e, 0x1c, 0x10, + 0x10, 0xb4, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x9c, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xd6, 0x9c, 0x20, 0x11, 0x1d, 0x1c, 0x0a, + 0x10, 0x8f, 0x0c, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0a, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x97, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x9c, 0x10, 0x01, 0x2e, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x20, + 0x00, 0xa0, 0x6f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x01, 0x1d, 0x9c, 0x10, 0x01, 0x40, 0x00, 0x00, + 0x10, 0xb4, 0x0c, 0x10, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x40, 0x9c, 0x10, 0x00, 0xfe, 0xac, 0x10, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x12, + 0x01, 0x53, 0xac, 0x12, 0x01, 0x1d, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x48, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x40, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xbe, 0x1c, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xca, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xd6, 0x9c, 0x12, 0x10, 0xd6, 0x1c, 0x10, 0x01, 0x1d, 0xec, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x40, 0x9c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x02, 0x10, 0xca, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8e, 0xd6, 0x00, 0x00, 0x0f, 0x0e, + 0x10, 0xbe, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x0f, 0x08, 0x10, 0xb4, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xaa, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb4, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xbe, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x12, 0x10, 0xd6, 0x1c, 0x10, + 0x01, 0x1d, 0xec, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x1d, 0x1c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x40, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x40, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x1d, 0x1c, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0e, 0x93, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x40, 0x9c, 0x10, 0x11, 0x40, 0x4c, 0x00, 0x10, 0xd6, 0x0c, 0x10, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x2e, 0x0c, 0x12, + 0x10, 0xca, 0x4c, 0x0a, 0x10, 0xca, 0x0c, 0x10, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x05, + 0x01, 0x0d, 0xec, 0x10, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xe2, 0x4c, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0x1f, 0x08, 0x01, 0x2e, 0x9c, 0x17, 0x10, 0xe2, 0x4c, 0x08, + 0x00, 0xfe, 0xec, 0x24, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xec, 0x10, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x01, 0x0d, 0x9c, 0x22, 0x10, 0xb4, 0x4c, 0x14, 0x01, 0x68, 0xec, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x0c, 0x10, + 0x00, 0x00, 0x0c, 0x10, 0x01, 0x0d, 0xec, 0x20, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xfe, 0x9c, 0x18, + 0x11, 0x53, 0x4c, 0x16, 0x00, 0xfe, 0xec, 0x24, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x22, 0x11, 0x40, 0x4c, 0x0a, + 0x01, 0x68, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, + 0x00, 0xf0, 0x9c, 0x18, 0x10, 0xf0, 0x4c, 0x15, 0x01, 0x0d, 0xec, 0x24, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xec, 0x20, 0x00, 0xa0, 0x8c, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x7c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0xc1, + 0x00, 0x00, 0x0e, 0x21, 0x00, 0x00, 0x0e, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0xe2, 0x03, 0xd0, 0x00, 0xe2, 0x03, 0xf0, + 0x00, 0xe2, 0xec, 0x10, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xbc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x08, 0x00, 0xd6, 0x9c, 0x22, + 0x10, 0xd6, 0x4c, 0x0a, 0x01, 0xac, 0xec, 0x20, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x10, + 0x00, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x4c, 0x00, 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x0a, 0x20, 0x00, 0xa0, 0x7c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x0e, 0x93, + 0x00, 0xa0, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xa0, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0xbe, 0x4c, 0x30, 0x10, 0xd6, 0x0c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x7f, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x00, 0xd6, 0x90, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0x10, 0xd6, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xac, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xea, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0xd6, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2e, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0xe2, 0x9c, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9c, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x78, 0x9c, 0x00, 0x00, 0xa0, 0xec, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, + 0x03, 0x58, 0x03, 0x0a, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x05, 0x50, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x04, 0xf2, + 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x04, 0xf3, 0x00, 0x00, 0x05, 0x05, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xf5, 0x10, 0xa0, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x04, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x04, 0x01, 0x40, 0xea, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x03, + 0x01, 0x68, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x18, 0x10, 0xa0, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x2f, 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x01, 0x03, + 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x15, + 0x01, 0x40, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x06, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x06, 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0xf0, 0x9c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0xb0, 0x00, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe3, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xd6, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xde, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xe2, 0x0c, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcf, 0x04, + 0x00, 0xd6, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd6, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x10, 0xd6, 0x4c, 0x00, + 0x01, 0xac, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xd6, 0xea, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0x7f, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0x78, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xf0, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xe2, 0x0c, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xd6, 0x9c, 0x20, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0xac, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe3, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, + 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xa0, 0xec, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x97, 0xec, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x8f, 0x03, 0x33, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0xe1, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xa0, 0x05, 0x08, + 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xb4, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0x05, 0x20, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0x05, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xfe, 0x05, 0x20, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x2e, 0x05, 0x20, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x19, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x38, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xaa, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xe4, 0xf2, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x1c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x2e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x70, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0xd6, 0x94, 0xe1, + 0x10, 0xd6, 0x4c, 0x06, 0x10, 0x8f, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3a, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0xbe, 0x4c, 0x10, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x8f, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, + 0x00, 0xa0, 0xbe, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, + 0x10, 0xd6, 0x44, 0xe1, 0x00, 0xb4, 0xac, 0x23, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0xaa, 0x03, 0x07, + 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0xe1, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x04, 0xe3, 0x01, 0xac, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x4c, 0x19, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xd6, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x04, 0xe3, + 0x00, 0xd6, 0xea, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0x00, 0x02, 0x0f, 0x00, 0xbe, 0x4c, 0x08, + 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x09, 0x19, + 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xbe, 0xbc, 0x30, 0x10, 0x00, 0x44, 0xe1, 0x10, 0xd6, 0x4c, 0x00, + 0x01, 0xac, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, 0x10, 0x00, 0x4a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x10, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, + 0x10, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x0e, 0xa1, 0x10, 0xd6, 0x0c, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x10, 0x00, 0x4a, 0x07, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x01, 0x03, + 0x00, 0xbe, 0xbc, 0x18, 0x10, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x40, 0xe3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, + 0x10, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x68, 0xec, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xd6, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x00, 0x0e, 0xa1, + 0x10, 0xd6, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0xf0, 0xe4, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xd6, 0xe3, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x02, 0x1f, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0xac, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x40, 0xdc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, + 0x01, 0x2e, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0e, 0xa1, 0x01, 0x1d, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xa1, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0e, 0xa1, 0x00, 0xf0, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0e, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0xe2, 0x9c, 0x19, 0x00, 0xe2, 0x03, 0xf0, + 0x01, 0x68, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0xbc, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x10, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x7c, 0x07, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xfc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x13, + 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x10, 0xf0, 0x4c, 0x07, 0x03, 0x58, 0x03, 0x0a, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x50, 0x00, 0xbe, 0xbc, 0x30, 0x00, 0x00, 0x94, 0xe1, + 0x10, 0xf0, 0x4c, 0x17, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xe3, 0x00, 0x00, 0x05, 0x05, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe8, 0x00, 0x00, 0x04, 0xe4, + 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x05, 0x01, 0x40, 0xea, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0c, 0x09, 0x01, 0x68, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0c, 0x0b, + 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0c, 0x0d, 0x01, 0x40, 0xec, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x0e, + 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0c, 0x0f, 0x01, 0x40, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xbc, 0x10, + 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0x04, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xec, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xbe, 0x4c, 0x08, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2e, 0xe3, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0xa0, 0xc0, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x00, 0x0a, 0x01, + 0x01, 0x40, 0xdc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0c, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0xbe, 0x4c, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0xbe, 0x4c, 0x13, + 0x00, 0xa0, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x01, 0x40, 0xfe, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xaa, 0x4c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x7c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, 0x10, 0xd6, 0x44, 0xe1, + 0x00, 0xb4, 0xac, 0x23, 0x10, 0xd6, 0x0c, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0xaa, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0x1f, 0x04, 0x00, 0xf0, 0x9c, 0x20, 0x10, 0xf0, 0x4c, 0x10, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0f, 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x7f, 0x7c, 0x07, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x78, 0x9c, 0x00, 0x00, 0xa0, 0xec, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x20, 0x03, 0x58, 0x03, 0x0a, + 0x00, 0x7f, 0x2c, 0x10, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x20, + 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x05, 0x50, 0x00, 0xbe, 0xbc, 0x30, + 0x00, 0x00, 0x94, 0xe1, 0x00, 0x00, 0x04, 0xf2, 0x00, 0x00, 0x05, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x04, 0xf3, + 0x00, 0x00, 0x05, 0x05, 0x00, 0xa0, 0x1f, 0x04, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x04, 0xf5, 0x10, 0xa0, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0xf7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x04, + 0x01, 0x40, 0xea, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x2c, 0x20, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x0a, 0x03, 0x01, 0x68, 0xdc, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x3c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x18, 0x10, 0xa0, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x2f, + 0x01, 0x40, 0xec, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x01, 0x03, 0x00, 0xbe, 0xbc, 0x18, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9c, 0x15, 0x01, 0x40, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x10, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x9c, 0x06, 0x01, 0x68, 0xec, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xbc, 0x10, 0x00, 0xf0, 0x9c, 0x10, 0x00, 0x00, 0x9c, 0x06, + 0x10, 0xa0, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x04, 0xe3, 0x00, 0xa0, 0x1f, 0x04, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x4c, 0x10, 0x00, 0x00, 0x04, 0xe5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x00, 0x9a, 0x09, + 0x11, 0x1d, 0x1c, 0x02, 0x01, 0x40, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x2c, 0x20, 0x00, 0x00, 0x9a, 0x09, 0x10, 0xd6, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9a, 0x09, 0x00, 0xb4, 0x03, 0xf0, 0x01, 0x68, 0xec, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe4, 0x00, 0xbe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x0c, 0x08, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0xbe, 0x4c, 0x08, 0x00, 0x00, 0x9a, 0x09, 0x00, 0xb4, 0x03, 0xd0, + 0x01, 0x2e, 0xe3, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0x00, 0x7f, 0x2c, 0x10, + 0x00, 0x00, 0x9a, 0x09, 0x10, 0xf0, 0x1c, 0x0a, 0x10, 0x7f, 0x1c, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, 0x00, 0xd6, 0x94, 0xe1, + 0x00, 0xd6, 0x03, 0xd0, 0x00, 0x78, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x04, 0xe4, 0x10, 0xfe, 0x1c, 0x10, + 0x00, 0x8f, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x1c, 0x08, 0x00, 0xf0, 0x03, 0xd0, 0x00, 0xa0, 0x03, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x03, 0xf0, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0xb4, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x10, 0x00, 0xfe, 0x03, 0xf0, + 0x00, 0xd6, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1d, 0x05, 0x10, 0x01, 0x40, 0x03, 0xf0, 0x00, 0xf0, 0x05, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x05, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x1f, 0x08, 0x11, 0x2e, 0x10, 0x00, + 0x11, 0x68, 0x1c, 0x20, 0x10, 0xd6, 0x1c, 0x20, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0c, 0x03, + 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xe3, + 0x01, 0x1d, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0xff, 0xf3, 0xf3, 0x05, 0x40, 0x3e, + 0x09, 0xc4, 0xa9, 0xfd, 0x3e, 0x68, 0x20, 0x03, 0xbd, 0x09, 0x0b, 0x0b, + 0x3c, 0x1b, 0x55, 0x3a, 0xe3, 0xc2, 0xa9, 0x05, 0x43, 0x53, 0x05, 0xbf, + 0xab, 0x13, 0x3a, 0x4b, 0xf5, 0x03, 0xc2, 0x0b, 0x20, 0x55, 0xf5, 0xef, + 0xe0, 0x0f, 0x0d, 0x4f, 0x4d, 0x0f, 0xda, 0x2e, 0xe7, 0xf7, 0x11, 0xd2, + 0xca, 0xc2, 0xfb, 0xe7, 0x1d, 0xf1, 0xe0, 0xf1, 0xe0, 0xfb, 0xeb, 0xb7, + 0xb9, 0xd6, 0xef, 0x13, 0xd8, 0xf7, 0xde, 0x09, 0xe0, 0x15, 0xc4, 0xb1, + 0xcc, 0x1d, 0xf7, 0xde, 0x0b, 0xc8, 0xaf, 0x9e, 0x88, 0x82, 0xd0, 0x15, + 0x1f, 0xc6, 0xc8, 0xe0, 0x09, 0xe9, 0xe5, 0xce, 0xbb, 0xbd, 0xb3, 0xd4, + 0xb1, 0xfd, 0x03, 0xc8, 0xe9, 0xbb, 0xfd, 0xd2, 0x20, 0xfb, 0xf9, 0xde, + 0x03, 0x1b, 0xdc, 0xf9, 0x0d, 0x0b, 0x0b, 0x26, 0xe1, 0x34, 0x38, 0x24, + 0xff, 0x22, 0x03, 0x26, 0x09, 0x4d, 0x09, 0x34, 0x28, 0x22, 0x11, 0x3a, + 0x20, 0x30, 0x1b, 0x30, 0x1d, 0x1d, 0x2e, 0x32, 0x4f, 0x57, 0x38, 0x68, + 0x20, 0x3c, 0xe1, 0x40, 0x2a, 0x40, 0x3c, 0x26, 0x2e, 0x40, 0x53, 0x61, + 0x1b, 0x45, 0x05, 0x49, 0x0b, 0x4b, 0x4b, 0x40, 0x49, 0x32, 0x30, 0x2e, + 0x59, 0x3a, 0x4d, 0xff, 0x1f, 0x4d, 0x22, 0x4b, 0x00, 0x05, 0x3e, 0x4b, + 0x1d, 0x03, 0x07, 0x45, 0x2e, 0x1d, 0x34, 0x01, 0x20, 0x11, 0x0b, 0xfb, + 0x30, 0x0b, 0xe5, 0x09, 0x13, 0x1b, 0x0d, 0xff, 0xc8, 0x0b, 0xd4, 0x26, + 0x11, 0xe3, 0xc0, 0xd2, 0x0d, 0xfb, 0xc2, 0xda, 0xcc, 0xef, 0xd6, 0xfb, + 0xd2, 0xed, 0xb1, 0xca, 0xe5, 0xc0, 0xd4, 0xbb, 0xb9, 0xbd, 0xd6, 0xcc, + 0xb3, 0xd6, 0xb5, 0xc0, 0xce, 0xce, 0xbb, 0xbd, 0xb3, 0xd0, 0xbf, 0xb5, + 0xb3, 0xbd, 0xbd, 0xc4, 0xc4, 0xc4, 0xa7, 0xc2, 0xab, 0xd8, 0xb7, 0xc6, + 0xc2, 0xb1, 0xbd, 0xd6, 0xca, 0xc4, 0xbb, 0xc4, 0xe3, 0xb5, 0xe1, 0xbb, + 0xd6, 0xdc, 0xde, 0xc0, 0xca, 0xd4, 0xeb, 0xd8, 0xd6, 0xcc, 0xcc, 0xed, + 0xde, 0xe9, 0xe1, 0xe1, 0xf5, 0xdc, 0xda, 0xed, 0xf1, 0xf1, 0xe3, 0xda, + 0xe9, 0xf5, 0xf7, 0xf3, 0xff, 0x03, 0x0f, 0x07, 0xff, 0xff, 0x03, 0x07, + 0x1b, 0x07, 0x07, 0x05, 0x24, 0x13, 0x19, 0x0f, 0x1f, 0x0d, 0x1f, 0x20, + 0x11, 0x20, 0x1f, 0x32, 0x28, 0x3a, 0x20, 0x2e, 0x1b, 0x30, 0x2c, 0x3c, + 0x2e, 0x2a, 0x30, 0x3e, 0x38, 0x34, 0x24, 0x2e, 0x22, 0x2e, 0x32, 0x47, + 0x30, 0x34, 0x38, 0x2c, 0x3a, 0x41, 0x38, 0x2c, 0x45, 0x2c, 0x26, 0x38, + 0x24, 0x22, 0x3e, 0x36, 0x3e, 0x28, 0x24, 0x20, 0x2e, 0x28, 0x3a, 0x32, + 0x32, 0x2c, 0x34, 0x17, 0x2e, 0x1d, 0x2e, 0x2e, 0x32, 0x30, 0x2a, 0x26, + 0x28, 0x19, 0x28, 0x24, 0x26, 0x32, 0x1d, 0x1f, 0x26, 0x20, 0x24, 0x22, + 0x1b, 0x17, 0x17, 0x1f, 0x24, 0x24, 0x17, 0x1b, 0x17, 0x19, 0x13, 0x1d, + 0x0f, 0x11, 0x0f, 0x0f, 0x0d, 0x0f, 0x09, 0x11, 0x00, 0x0b, 0x05, 0x0d, + 0x00, 0x0d, 0x01, 0x03, 0x03, 0xf7, 0x01, 0xfd, 0x03, 0x07, 0xfb, 0x01, + 0xf9, 0xf7, 0xf5, 0xfd, 0xf7, 0xf5, 0xf7, 0xe9, 0xf1, 0x00, 0xf7, 0xeb, + 0xde, 0xe1, 0xde, 0xe9, 0xf1, 0xef, 0xed, 0xe3, 0xd4, 0xde, 0xe3, 0xe3, + 0xe0, 0xe0, 0xdc, 0xde, 0xd8, 0xda, 0xd8, 0xd8, 0xd4, 0xd2, 0xcc, 0xd0, + 0xcc, 0xc8, 0xce, 0xd6, 0xcc, 0xca, 0xc8, 0xc8, 0xc6, 0xcc, 0xc4, 0xca, + 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xc2, 0xc0, 0xc4, 0xc8, 0xca, 0xcc, + 0xca, 0xc4, 0xc8, 0xc6, 0xce, 0xc4, 0xce, 0xc8, 0xc6, 0xce, 0xce, 0xd0, + 0xd4, 0xd4, 0xd4, 0xd6, 0xd6, 0xd8, 0xd8, 0xd4, 0xd8, 0xde, 0xde, 0xde, + 0xe0, 0xe1, 0xde, 0xe1, 0xe1, 0xe5, 0xe7, 0xeb, 0xed, 0xed, 0xe9, 0xeb, + 0xef, 0xf1, 0xf3, 0xef, 0xf7, 0xfd, 0xfb, 0xf7, 0xf5, 0xf9, 0xff, 0xfd, + 0xff, 0xff, 0x03, 0x07, 0x05, 0x00, 0x09, 0x07, 0x0d, 0x09, 0x0d, 0x09, + 0x11, 0x15, 0x1b, 0x15, 0x0f, 0x0d, 0x13, 0x13, 0x15, 0x17, 0x1d, 0x17, + 0x17, 0x17, 0x1d, 0x1d, 0x24, 0x24, 0x22, 0x1d, 0x1d, 0x22, 0x26, 0x26, + 0x26, 0x20, 0x22, 0x22, 0x22, 0x24, 0x26, 0x26, 0x28, 0x2a, 0x28, 0x20, + 0x22, 0x26, 0x26, 0x2a, 0x2a, 0x2a, 0x28, 0x2a, 0x26, 0x24, 0x22, 0x28, + 0x2a, 0x2a, 0x28, 0x2a, 0x2c, 0x2e, 0x2c, 0x28, 0x26, 0x26, 0x26, 0x26, + 0x2a, 0x28, 0x26, 0x26, 0x26, 0x22, 0x1f, 0x24, 0x28, 0x2a, 0x2a, 0x22, + 0x24, 0x26, 0x24, 0x20, 0x1f, 0x20, 0x1f, 0x1d, 0x1d, 0x19, 0x1b, 0x1b, + 0x1f, 0x1f, 0x1b, 0x15, 0x17, 0x1b, 0x1f, 0x1b, 0x15, 0x13, 0x13, 0x11, + 0x11, 0x13, 0x15, 0x13, 0x11, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, + 0x05, 0x03, 0x03, 0x03, 0x05, 0x09, 0x09, 0x05, 0xff, 0xf9, 0xf7, 0xfd, + 0x01, 0x01, 0x00, 0xff, 0xfb, 0xf9, 0xf9, 0xf9, 0xf5, 0xf5, 0xf9, 0xf9, + 0xf5, 0xef, 0xef, 0xed, 0xf1, 0xf3, 0xf1, 0xef, 0xeb, 0xe9, 0xe9, 0xeb, + 0xeb, 0xeb, 0xe7, 0xe7, 0xe5, 0xe7, 0xed, 0xeb, 0xe3, 0xe0, 0xe1, 0xe3, + 0xe3, 0xe1, 0xe3, 0xe5, 0xe7, 0xe7, 0xe1, 0xe0, 0xde, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe3, 0xe3, 0xe5, 0xe7, 0xe3, 0xde, 0xde, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe0, 0xdc, 0xe1, 0xe3, 0xe1, 0xe3, 0xe1, 0xe1, 0xe0, 0xe0, 0xe1, + 0xe0, 0xe1, 0xe3, 0xe7, 0xeb, 0xe7, 0xe3, 0xe0, 0xe0, 0xe3, 0xe5, 0xe7, + 0xe3, 0xe1, 0xe3, 0xe7, 0xed, 0xed, 0xeb, 0xe9, 0xed, 0xed, 0xef, 0xed, + 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, 0xf3, 0xf5, 0xf5, 0xf3, 0xf1, 0xef, + 0xef, 0xf1, 0xf5, 0xf5, 0xf3, 0xf1, 0xed, 0xf1, 0xf5, 0xf9, 0xfd, 0xfd, + 0xf7, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, + 0xfb, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xfd, + 0xfd, 0x00, 0x01, 0x01, 0xff, 0xfd, 0xfd, 0x00, 0x01, 0x03, 0x03, 0x03, + 0x01, 0x00, 0xff, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, 0x01, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x05, 0x03, 0x01, 0x03, 0x07, 0x09, 0x07, 0x03, 0x01, + 0x05, 0x07, 0x09, 0x07, 0x05, 0x05, 0x07, 0x0b, 0x09, 0x05, 0x03, 0x01, + 0x03, 0x07, 0x09, 0x0b, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0b, 0x07, 0x09, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x13, 0x13, 0x11, 0x0f, 0x0d, 0x0d, 0x0f, 0x11, 0x11, 0x0f, 0x0d, 0x0f, + 0x0f, 0x11, 0x0f, 0x11, 0x13, 0x0f, 0x0f, 0x0f, 0x13, 0x13, 0x15, 0x13, + 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0d, 0x13, 0x17, 0x13, 0x11, 0x11, 0x13, + 0x15, 0x13, 0x13, 0x15, 0x15, 0x17, 0x15, 0x11, 0x11, 0x15, 0x17, 0x15, + 0x13, 0x15, 0x19, 0x19, 0x19, 0x15, 0x13, 0x13, 0x15, 0x15, 0x15, 0x17, + 0x17, 0x15, 0x13, 0x13, 0x13, 0x13, 0x11, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x17, 0x17, 0x15, 0x15, 0x13, 0x0f, 0x0f, 0x17, 0x1d, 0x1b, 0x17, 0x15, + 0x13, 0x15, 0x1b, 0x1b, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, + 0x11, 0x13, 0x15, 0x17, 0x11, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0b, + 0x09, 0x0b, 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x09, 0x0b, 0x0b, 0x09, 0x01, + 0x00, 0x01, 0x03, 0x03, 0x03, 0x00, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, + 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf3, 0xf3, 0xf5, 0xf7, 0xf5, 0xf1, 0xf1, + 0xf3, 0xf3, 0xf1, 0xed, 0xeb, 0xe9, 0xed, 0xed, 0xed, 0xeb, 0xe9, 0xe7, + 0xe7, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe0, + 0xe0, 0xe0, 0xe0, 0xde, 0xdc, 0xde, 0xe0, 0xe0, 0xdc, 0xd8, 0xd8, 0xdc, + 0xde, 0xda, 0xd8, 0xd8, 0xde, 0xe0, 0xdc, 0xda, 0xda, 0xdc, 0xde, 0xe0, + 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xdc, + 0xde, 0xe1, 0xe3, 0xe1, 0xe0, 0xe0, 0xde, 0xe0, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe9, 0xed, 0xed, 0xe9, 0xe5, 0xe3, 0xe7, 0xeb, 0xed, 0xeb, 0xeb, + 0xeb, 0xe9, 0xeb, 0xed, 0xf1, 0xf1, 0xf1, 0xef, 0xed, 0xeb, 0xed, 0xf1, + 0xf3, 0xf1, 0xed, 0xed, 0xef, 0xf1, 0xf5, 0xf3, 0xf3, 0xf5, 0xf5, 0xf5, + 0xf7, 0xf7, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xfd, 0xfd, 0xff, 0xfd, 0xfb, + 0xf9, 0xfd, 0xfd, 0xff, 0xfd, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x05, 0x07, 0x07, + 0x09, 0x09, 0x05, 0x05, 0x01, 0x03, 0x05, 0x07, 0x05, 0x05, 0x05, 0x07, + 0x0b, 0x0d, 0x07, 0x05, 0x05, 0x07, 0x0d, 0x0d, 0x0b, 0x09, 0x0d, 0x0f, + 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x13, 0x17, + 0x15, 0x11, 0x0f, 0x11, 0x13, 0x15, 0x15, 0x17, 0x17, 0x19, 0x19, 0x19, + 0x15, 0x11, 0x11, 0x15, 0x1b, 0x1f, 0x1b, 0x17, 0x11, 0x15, 0x19, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, 0x19, 0x19, 0x1b, 0x1f, 0x1f, 0x1d, + 0x1d, 0x1d, 0x1b, 0x19, 0x1b, 0x1d, 0x1d, 0x1b, 0x1d, 0x1f, 0x1f, 0x1f, + 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1b, 0x1d, 0x1d, 0x1b, 0x1d, 0x1d, 0x1f, + 0x1f, 0x19, 0x15, 0x17, 0x1b, 0x20, 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x19, 0x19, 0x17, 0x15, 0x15, + 0x17, 0x19, 0x17, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x0f, 0x0f, 0x0d, + 0x09, 0x07, 0x09, 0x0d, 0x0f, 0x0f, 0x0d, 0x07, 0x07, 0x07, 0x09, 0x09, + 0x09, 0x05, 0x05, 0x03, 0x05, 0x07, 0x07, 0x03, 0x01, 0x00, 0x01, 0x03, + 0x05, 0x05, 0x03, 0x00, 0xff, 0xff, 0x00, 0x01, 0x01, 0xff, 0xff, 0xfd, + 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, + 0xf9, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, + 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf1, 0xf1, 0xf3, 0xf7, 0xf9, 0xf5, 0xf1, + 0xf1, 0xf3, 0xf5, 0xf5, 0xf1, 0xef, 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xf1, 0xf3, 0xf1, 0xef, 0xed, 0xeb, 0xeb, 0xeb, + 0xef, 0xef, 0xed, 0xeb, 0xe7, 0xe9, 0xe9, 0xeb, 0xed, 0xed, 0xeb, 0xe9, + 0xeb, 0xeb, 0xe5, 0xe3, 0xe5, 0xe9, 0xed, 0xed, 0xe7, 0xe1, 0xe1, 0xe5, + 0xe7, 0xe7, 0xe7, 0xeb, 0xe9, 0xe5, 0xe3, 0xe1, 0xe3, 0xe9, 0xeb, 0xe9, + 0xe3, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe7, + 0xe9, 0xe7, 0xe3, 0xe1, 0xe1, 0xe3, 0xe5, 0xe5, 0xe3, 0xe5, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe3, 0xe3, 0xe7, 0xe9, 0xed, 0xeb, 0xe9, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, 0xeb, 0xed, 0xed, 0xed, 0xeb, 0xeb, + 0xeb, 0xe7, 0xe9, 0xe9, 0xf1, 0xf7, 0xf7, 0xf1, 0xeb, 0xeb, 0xf3, 0xf7, + 0xf5, 0xf1, 0xef, 0xf1, 0xf3, 0xf3, 0xf3, 0xf3, 0xf5, 0xf7, 0xf7, 0xf3, + 0xf3, 0xf5, 0xf9, 0xf9, 0xf7, 0xf7, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, + 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0x00, 0x01, 0x00, 0xfd, 0xf9, 0xfb, 0xff, + 0x01, 0x07, 0x09, 0x07, 0x03, 0xfd, 0xf9, 0xfb, 0x03, 0x09, 0x07, 0x03, + 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 0x09, 0x07, 0x05, 0x05, 0x05, 0x0b, + 0x0d, 0x0b, 0x07, 0x07, 0x0b, 0x0d, 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x07, + 0x0b, 0x0f, 0x11, 0x11, 0x0d, 0x0b, 0x0b, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0f, 0x15, 0x17, 0x15, 0x0f, 0x0b, 0x0f, 0x11, 0x13, 0x13, 0x15, + 0x15, 0x15, 0x13, 0x11, 0x13, 0x19, 0x1d, 0x19, 0x13, 0x0d, 0x11, 0x17, + 0x19, 0x17, 0x13, 0x11, 0x17, 0x1d, 0x1f, 0x19, 0x17, 0x15, 0x15, 0x17, + 0x1d, 0x1f, 0x1f, 0x1b, 0x17, 0x15, 0x17, 0x19, 0x1d, 0x1d, 0x1b, 0x19, + 0x1b, 0x1d, 0x1f, 0x1d, 0x1b, 0x19, 0x19, 0x17, 0x1b, 0x1d, 0x1f, 0x1f, + 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1f, 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x1b, + 0x1f, 0x22, 0x1f, 0x19, 0x15, 0x17, 0x19, 0x1f, 0x22, 0x20, 0x1d, 0x19, + 0x19, 0x1b, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x17, 0x19, 0x17, 0x17, 0x17, + 0x15, 0x13, 0x13, 0x15, 0x17, 0x17, 0x11, 0x0b, 0x09, 0x0b, 0x0d, 0x0f, + 0x0f, 0x0f, 0x0b, 0x05, 0x03, 0x05, 0x07, 0x09, 0x09, 0x05, 0x01, 0x00, + 0x00, 0x05, 0x07, 0x05, 0x00, 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0xff, 0x00, + 0x00, 0xfd, 0xf9, 0xf9, 0xf9, 0xfb, 0xfb, 0xf7, 0xf3, 0xf3, 0xf7, 0xf7, + 0xf7, 0xf3, 0xf1, 0xef, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xef, 0xeb, 0xe9, + 0xeb, 0xf1, 0xf1, 0xed, 0xe9, 0xe7, 0xe7, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, + 0xe9, 0xe7, 0xe7, 0xe9, 0xeb, 0xe9, 0xe3, 0xe1, 0xe3, 0xe5, 0xe9, 0xeb, + 0xeb, 0xe5, 0xe3, 0xe3, 0xe1, 0xe1, 0xe5, 0xe7, 0xe7, 0xe5, 0xe3, 0xe3, + 0xe7, 0xeb, 0xeb, 0xe7, 0xe3, 0xe1, 0xe3, 0xe7, 0xe9, 0xeb, 0xe9, 0xe7, + 0xe5, 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, 0xe7, 0xe9, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe9, 0xe7, 0xe9, 0xeb, 0xed, 0xeb, 0xe7, 0xe7, 0xeb, + 0xed, 0xeb, 0xeb, 0xe9, 0xed, 0xef, 0xf1, 0xef, 0xed, 0xeb, 0xef, 0xf1, + 0xf3, 0xf5, 0xf3, 0xed, 0xeb, 0xed, 0xf3, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, + 0xfb, 0xf9, 0xf7, 0xf5, 0xf9, 0xfb, 0xfb, 0xf9, 0xf7, 0xf7, 0xfb, 0xfd, + 0xfd, 0xfb, 0xfb, 0xff, 0x03, 0x01, 0xfd, 0xf7, 0xf9, 0xfd, 0x03, 0x03, + 0x00, 0xff, 0xff, 0x00, 0x03, 0x03, 0x01, 0x03, 0x05, 0x07, 0x05, 0x03, + 0x01, 0x03, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x03, 0x07, 0x09, 0x07, 0x05, 0x05, 0x05, 0x07, 0x05, 0x05, + 0x05, 0x05, 0x07, 0x09, 0x07, 0x05, 0x03, 0x07, 0x07, 0x05, 0x03, 0x03, + 0x07, 0x0b, 0x0b, 0x09, 0x03, 0x01, 0x03, 0x07, 0x05, 0x05, 0x01, 0x03, + 0x05, 0x07, 0x03, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0xff, 0x00, 0x03, + 0x09, 0x0b, 0x0b, 0x05, 0xff, 0xfb, 0x00, 0x03, 0x05, 0x03, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0xff, 0xff, 0x00, 0x03, + 0x05, 0x05, 0x03, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x05, 0x09, 0x07, 0x01, 0xff, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x01, 0x05, 0x07, 0x07, 0x03, 0x00, 0xff, 0xff, 0x00, 0x01, 0x03, 0x01, + 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xfb, 0xf9, 0x00, 0x00, 0x00, + 0x00, 0xf3, 0x05, 0x01, 0x00, 0xf7, 0x05, 0xf3, 0x11, 0x00, 0xeb, 0x09, + 0x05, 0xfb, 0xfb, 0x05, 0xf3, 0x15, 0xff, 0xd3, 0x2d, 0xf7, 0xf3, 0xef, + 0x21, 0xef, 0xf7, 0x0d, 0xfb, 0x00, 0xff, 0x00, 0x01, 0xef, 0x01, 0x0d, + 0xf3, 0xe7, 0x2d, 0xf3, 0xdb, 0x29, 0xf7, 0xfb, 0xef, 0x19, 0xfb, 0xf7, + 0xf3, 0x15, 0xff, 0x09, 0xd3, 0x25, 0x00, 0xeb, 0xff, 0x19, 0xff, 0xdf, + 0x1d, 0xff, 0xe7, 0x19, 0x00, 0xe7, 0x01, 0x09, 0xff, 0xf3, 0x0d, 0xfb, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x05, 0xef, + 0x15, 0x01, 0xcf, 0x21, 0x00, 0xe3, 0x11, 0x01, 0xff, 0xdf, 0x2d, 0xef, + 0xe3, 0x1d, 0xf3, 0x09, 0xff, 0xff, 0x01, 0x05, 0xdb, 0x1d, 0xfb, 0x00, + 0x01, 0xf7, 0x00, 0x0d, 0xe7, 0x05, 0x09, 0x05, 0xeb, 0xf3, 0x21, 0xf7, + 0xe7, 0x15, 0x05, 0xef, 0xff, 0x0d, 0xf3, 0x0d, 0x01, 0xe3, 0x0d, 0xfb, + 0x15, 0xef, 0xef, 0x1d, 0xf7, 0x09, 0xeb, 0x05, 0x05, 0x05, 0xe7, 0xff, + 0x1d, 0xfb, 0xe3, 0x19, 0x00, 0xff, 0xf3, 0x05, 0x09, 0x00, 0xdb, 0x25, + 0xfb, 0xf3, 0x09, 0x09, 0xf3, 0xf7, 0x05, 0x00, 0x0d, 0xeb, 0xff, 0x19, + 0xdf, 0x0d, 0x09, 0xf7, 0xeb, 0x1d, 0x00, 0xe7, 0x00, 0x15, 0xf3, 0x00, + 0x00, 0x00, 0xff, 0xfb, 0x05, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, + 0x01, 0x05, 0xf3, 0xeb, 0x21, 0xff, 0xf7, 0xeb, 0x21, 0x00, 0xe3, 0x01, + 0x0d, 0x00, 0xdf, 0x1d, 0xfb, 0xfb, 0x00, 0x0d, 0xef, 0xf7, 0x11, 0x00, + 0xf3, 0x05, 0x0d, 0xeb, 0xf3, 0x19, 0xf3, 0x09, 0xef, 0x00, 0x05, 0x01, + 0x00, 0xf7, 0x01, 0x09, 0xe3, 0x05, 0x09, 0x00, 0xdf, 0x1d, 0x00, 0xef, + 0xff, 0x11, 0xf7, 0x01, 0x09, 0xdb, 0x11, 0x09, 0xf7, 0xf3, 0x11, 0xff, + 0xf7, 0xff, 0x09, 0xfb, 0xf7, 0x19, 0xe7, 0xfb, 0x11, 0x01, 0xdf, 0x11, + 0x00, 0x09, 0xeb, 0xff, 0x15, 0xfb, 0xef, 0x0d, 0xf7, 0x01, 0x05, 0xf7, + 0x01, 0x05, 0xf3, 0x00, 0x09, 0xeb, 0x05, 0x01, 0x01, 0xe3, 0x1d, 0x00, + 0xe7, 0x11, 0xf3, 0x15, 0xfb, 0xe7, 0x1d, 0xf3, 0xf7, 0x05, 0x09, 0xf7, + 0xeb, 0x1d, 0xff, 0xef, 0x00, 0x0d, 0xf7, 0x09, 0x00, 0xd7, 0x29, 0xfb, + 0xef, 0x00, 0x0d, 0x00, 0xdb, 0x29, 0xef, 0xeb, 0x19, 0x00, 0xe7, 0x0d, + 0x01, 0x09, 0xdf, 0x09, 0x09, 0x01, 0xdb, 0x15, 0x01, 0xfb, 0xf3, 0x15, + 0xf3, 0xef, 0x0d, 0x01, 0xff, 0xeb, 0x15, 0xff, 0xfb, 0xf7, 0x09, 0x01, + 0xfb, 0xef, 0x19, 0xff, 0xe3, 0x15, 0x00, 0xeb, 0x11, 0xef, 0x05, 0x0d, + 0xe7, 0x00, 0x09, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x05, 0xe7, 0x00, 0x11, + 0x01, 0xdf, 0x11, 0x05, 0x00, 0xeb, 0x11, 0xff, 0x09, 0xeb, 0x01, 0x00, + 0x0d, 0xeb, 0xff, 0x09, 0x01, 0xf7, 0xf7, 0x0d, 0xfb, 0x0d, 0xf7, 0xe3, + 0x25, 0xfb, 0xe7, 0x05, 0x0d, 0x00, 0xdb, 0x21, 0xfb, 0xfb, 0xf7, 0x11, + 0xfb, 0xfb, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x05, 0xef, 0xf7, 0x15, 0xe7, + 0x09, 0x0d, 0xef, 0xf3, 0x25, 0xdb, 0x01, 0x09, 0x01, 0xdf, 0x15, 0x00, + 0xff, 0xf7, 0x09, 0xfb, 0x00, 0xff, 0xff, 0x00, 0xff, 0x05, 0x00, 0xe7, + 0x19, 0x01, 0xe3, 0x11, 0x05, 0x00, 0xe3, 0x15, 0xf7, 0x11, 0xf7, 0xe7, + 0x19, 0xff, 0x01, 0xdf, 0x25, 0xef, 0xf7, 0x09, 0x00, 0xfb, 0xfb, 0x09, + 0xfb, 0xf7, 0x09, 0xff, 0xfb, 0x00, 0x09, 0x00, 0xdb, 0x1d, 0xf7, 0x05, + 0xf3, 0x09, 0x09, 0xdf, 0x09, 0x09, 0x00, 0xe3, 0x1d, 0xeb, 0x09, 0x01, + 0xef, 0x05, 0x05, 0x00, 0xe3, 0x19, 0xf7, 0xff, 0x0d, 0xff, 0xdb, 0x25, + 0xff, 0xef, 0xff, 0x19, 0xeb, 0xff, 0x0d, 0x01, 0xef, 0x00, 0x15, 0xe3, + 0x09, 0x05, 0x00, 0xe7, 0x11, 0xff, 0x00, 0xfb, 0x09, 0xfb, 0xf3, 0x11, + 0x01, 0xdb, 0x1d, 0x00, 0xff, 0xf3, 0x15, 0xfb, 0xf3, 0x09, 0x05, 0xe7, + 0x01, 0x0d, 0xff, 0xeb, 0x0d, 0x01, 0xfb, 0xfb, 0x05, 0x00, 0xfb, 0x01, + 0x01, 0xf3, 0x05, 0x05, 0xff, 0xef, 0x15, 0xfb, 0xef, 0x0d, 0x00, 0xfb, + 0x0d, 0xf3, 0xf3, 0x19, 0xff, 0xe7, 0x0d, 0x01, 0xff, 0xf7, 0x09, 0xf7, + 0x05, 0x05, 0xef, 0x01, 0x00, 0x09, 0xf7, 0xf7, 0x15, 0xe7, 0x15, 0xf7, + 0xeb, 0x15, 0xff, 0xf7, 0x00, 0x01, 0x00, 0x00, 0x00, 0xeb, 0x15, 0xfb, + 0xfb, 0x01, 0xff, 0x05, 0x01, 0xeb, 0x19, 0x00, 0xf3, 0xff, 0x11, 0xf3, + 0xfb, 0x09, 0x09, 0xe3, 0x11, 0xf7, 0x00, 0x00, 0x09, 0xf7, 0xf3, 0x11, + 0x01, 0xe3, 0x0d, 0x00, 0x01, 0x01, 0xe3, 0x11, 0x01, 0xfb, 0xf7, 0x0d, + 0xff, 0xfb, 0xff, 0x00, 0x01, 0x05, 0xe7, 0x0d, 0xf7, 0x09, 0xf7, 0x01, + 0x01, 0xeb, 0x11, 0x01, 0xe7, 0x01, 0x0d, 0xff, 0xe7, 0x21, 0xfb, 0xe7, + 0x11, 0x00, 0xfb, 0xff, 0x0d, 0xef, 0xfb, 0x09, 0x00, 0x05, 0xef, 0x0d, + 0x01, 0xe7, 0x0d, 0xfb, 0x00, 0x05, 0xf7, 0xff, 0x0d, 0xfb, 0xf3, 0x11, + 0x05, 0xeb, 0x01, 0x05, 0x00, 0x01, 0xe7, 0x09, 0x01, 0x01, 0xfb, 0xeb, + 0x15, 0xff, 0x01, 0xef, 0x11, 0x00, 0xf7, 0xff, 0x05, 0x09, 0xeb, 0x05, + 0xff, 0x00, 0x05, 0xf7, 0xfb, 0x09, 0x05, 0xf3, 0xf3, 0x15, 0x00, 0xe7, + 0x09, 0x01, 0xff, 0xf3, 0x0d, 0x00, 0xfb, 0x00, 0x01, 0xff, 0x01, 0x09, + 0xe7, 0xff, 0x11, 0xf3, 0x05, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x05, 0xf3, + 0x00, 0x05, 0xf7, 0x05, 0xff, 0xf7, 0x01, 0x09, 0xef, 0xf7, 0x15, 0xf7, + 0xff, 0x0d, 0xf7, 0xeb, 0x21, 0xfb, 0xeb, 0x05, 0x01, 0x05, 0xe3, 0x11, + 0x01, 0xff, 0xeb, 0x21, 0xe3, 0x00, 0x0d, 0x00, 0xe7, 0x0d, 0x01, 0x01, + 0xe3, 0x19, 0x00, 0xf7, 0xff, 0x05, 0xfb, 0x05, 0xf7, 0x00, 0x00, 0xfb, + 0x00, 0x0d, 0xf7, 0xef, 0x15, 0xfb, 0xfb, 0x09, 0x01, 0xe3, 0x11, 0x01, + 0xff, 0xef, 0x15, 0xff, 0xf7, 0x01, 0x00, 0xff, 0x09, 0xfb, 0xeb, 0x15, + 0xff, 0xef, 0x01, 0x01, 0x00, 0x09, 0xe3, 0x09, 0x05, 0x01, 0xe3, 0x19, + 0x00, 0xf7, 0xfb, 0x05, 0xf7, 0x09, 0x00, 0xe7, 0x11, 0xfb, 0x05, 0xf7, + 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe3, 0x15, 0x00, 0x00, + 0xeb, 0x19, 0xff, 0xeb, 0x0d, 0x09, 0xef, 0x00, 0x09, 0x01, 0xe3, 0x11, + 0x01, 0xf7, 0xf3, 0x1d, 0xe3, 0x01, 0x09, 0x01, 0xe7, 0x11, 0xf7, 0x09, + 0xfb, 0x01, 0x09, 0xe3, 0x09, 0x05, 0xff, 0xe7, 0x15, 0x00, 0x00, 0xe7, + 0x1d, 0xff, 0xef, 0x01, 0x09, 0xfb, 0xfb, 0x00, 0xff, 0x09, 0xfb, 0xf7, + 0x09, 0x00, 0xff, 0xff, 0x01, 0xf3, 0x0d, 0x01, 0xef, 0xff, 0x0d, 0x00, + 0xe7, 0x11, 0x01, 0xe7, 0x11, 0x01, 0xfb, 0xfb, 0x0d, 0xfb, 0xfb, 0x05, + 0x00, 0xfb, 0xff, 0x01, 0x05, 0xfb, 0xef, 0x15, 0xef, 0x01, 0x0d, 0xfb, + 0xeb, 0x21, 0xeb, 0xfb, 0x0d, 0x01, 0xeb, 0x09, 0x05, 0xff, 0xf3, 0x09, + 0xff, 0x00, 0x01, 0xfb, 0xf3, 0x15, 0xfb, 0xf3, 0x09, 0x00, 0x05, 0xeb, + 0x0d, 0x00, 0xfb, 0x05, 0xfb, 0x01, 0xff, 0x00, 0xff, 0xff, 0x01, 0x05, + 0xef, 0xff, 0x0d, 0x00, 0xeb, 0x19, 0xff, 0xeb, 0x0d, 0x00, 0xf7, 0xff, + 0x09, 0xff, 0xf3, 0x11, 0x00, 0xe7, 0x11, 0x00, 0x05, 0xe7, 0x11, 0x01, + 0xf3, 0x05, 0x00, 0x09, 0xe3, 0x11, 0x01, 0xeb, 0x0d, 0xfb, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0xff, 0x05, 0x05, 0xdf, 0x15, 0x00, 0xf7, 0xff, + 0x0d, 0xfb, 0xf7, 0x05, 0x00, 0x00, 0xfb, 0x01, 0xfb, 0x00, 0x01, 0x05, + 0xef, 0x09, 0xfb, 0x09, 0x00, 0xeb, 0x0d, 0xfb, 0x09, 0xeb, 0x09, 0x00, + 0x09, 0xe7, 0x05, 0x01, 0x01, 0xe3, 0x15, 0x00, 0xff, 0xf7, 0x0d, 0xf7, + 0x00, 0x09, 0xef, 0x01, 0x11, 0xef, 0xf7, 0x11, 0xff, 0xef, 0x09, 0xfb, + 0x01, 0x01, 0x00, 0xeb, 0x15, 0xff, 0xf7, 0x01, 0x00, 0x09, 0xf7, 0xf3, + 0x0d, 0x01, 0xf3, 0xfb, 0x11, 0x00, 0xeb, 0x0d, 0xfb, 0x00, 0x01, 0x00, + 0xf7, 0x00, 0x05, 0x01, 0xef, 0x09, 0x00, 0xff, 0xff, 0x09, 0xeb, 0x00, + 0x11, 0xfb, 0xe7, 0x19, 0xff, 0xfb, 0xfb, 0x11, 0xfb, 0xfb, 0x01, 0xfb, + 0x01, 0x05, 0xff, 0xf7, 0x0d, 0xff, 0xfb, 0x01, 0x00, 0xf7, 0x05, 0x05, + 0xf7, 0xff, 0x09, 0xf7, 0x00, 0x01, 0x05, 0xeb, 0x05, 0x09, 0xff, 0xeb, + 0x15, 0xfb, 0x05, 0xf7, 0xf3, 0x19, 0xff, 0xeb, 0x0d, 0x00, 0xff, 0xf3, + 0x09, 0xfb, 0x09, 0xef, 0x00, 0x01, 0xff, 0x00, 0xff, 0x09, 0xe7, 0x09, + 0x05, 0xf3, 0xff, 0x0d, 0x00, 0xe7, 0x11, 0x00, 0xf3, 0xfb, 0x0d, 0x00, + 0xeb, 0x0d, 0x01, 0xff, 0xf7, 0x09, 0xfb, 0x00, 0x01, 0x01, 0xef, 0x05, + 0x00, 0xff, 0x00, 0x09, 0xeb, 0x05, 0x09, 0xef, 0x01, 0x05, 0x00, 0xeb, + 0x0d, 0x00, 0xfb, 0xf3, 0x11, 0xfb, 0x00, 0x00, 0xfb, 0x05, 0xff, 0xff, + 0x00, 0x00, 0xff, 0x01, 0xef, 0x05, 0x09, 0xfb, 0xf3, 0x0d, 0xfb, 0x01, + 0xff, 0x00, 0xff, 0x01, 0x05, 0xef, 0x00, 0x0d, 0xfb, 0xf3, 0x09, 0x00, + 0xfb, 0xff, 0x01, 0x05, 0xf3, 0xff, 0x09, 0x00, 0xfb, 0xf7, 0x09, 0x01, + 0xf3, 0x01, 0x05, 0xf3, 0xff, 0x01, 0xfb, 0x05, 0x00, 0xf7, 0x05, 0xfb, + 0x01, 0x00, 0xf7, 0x05, 0x00, 0xf7, 0x09, 0x00, 0xeb, 0x0d, 0x01, 0xff, + 0xeb, 0x1d, 0xf7, 0xff, 0xf3, 0x11, 0xfb, 0xf7, 0x05, 0x00, 0xfb, 0xff, + 0x01, 0xfb, 0x00, 0x01, 0x01, 0xe7, 0x0d, 0xff, 0x05, 0xe7, 0x09, 0x01, + 0xff, 0xf3, 0x09, 0xfb, 0x09, 0xf7, 0xfb, 0x09, 0x00, 0xeb, 0x0d, 0x00, + 0xff, 0xef, 0x15, 0xff, 0xef, 0x09, 0x05, 0xef, 0x00, 0x09, 0xf3, 0xfb, + 0x09, 0x00, 0xf3, 0x05, 0xff, 0x09, 0xf3, 0xfb, 0x09, 0x01, 0xeb, 0x09, + 0x01, 0xeb, 0x0d, 0x00, 0xeb, 0x11, 0xff, 0xf7, 0x01, 0x05, 0xef, 0x01, + 0x05, 0xf3, 0x05, 0x00, 0x00, 0xff, 0xef, 0x11, 0x00, 0xf3, 0x09, 0xff, + 0x01, 0xff, 0xef, 0x09, 0x00, 0x01, 0xef, 0x09, 0x00, 0xfb, 0xff, 0x09, + 0xf3, 0x01, 0x05, 0xf7, 0xff, 0x01, 0x09, 0xef, 0xfb, 0x11, 0x00, 0xe7, + 0x11, 0x00, 0xef, 0x09, 0x00, 0x00, 0xef, 0x0d, 0xff, 0x00, 0x00, 0x05, + 0xe7, 0x05, 0x09, 0xff, 0xef, 0x0d, 0xff, 0x05, 0xe7, 0x0d, 0x01, 0x00, + 0xeb, 0x11, 0xfb, 0x00, 0x00, 0xf3, 0x09, 0x01, 0xff, 0xf3, 0x0d, 0xfb, + 0xff, 0x05, 0xff, 0xfb, 0x05, 0x01, 0xeb, 0x09, 0x01, 0xfb, 0xf7, 0x0d, + 0x00, 0xe7, 0x11, 0x00, 0x01, 0xeb, 0x15, 0xff, 0xf7, 0xff, 0x0d, 0xfb, + 0xef, 0x11, 0x00, 0xef, 0x01, 0x0d, 0xeb, 0x09, 0x01, 0x00, 0xef, 0x0d, + 0xf7, 0x09, 0xff, 0xf3, 0x09, 0xff, 0xfb, 0xff, 0x05, 0xfb, 0x00, 0x05, + 0x01, 0xdf, 0x1d, 0xfb, 0xfb, 0xfb, 0x0d, 0xfb, 0xf3, 0x09, 0xfb, 0x01, + 0x01, 0xef, 0x05, 0x01, 0x05, 0xeb, 0x09, 0x00, 0x05, 0xf7, 0xf7, 0x15, + 0xff, 0xef, 0x09, 0x05, 0xef, 0x09, 0x00, 0x00, 0xf3, 0x05, 0x00, 0xfb, + 0x00, 0x05, 0xfb, 0xeb, 0x19, 0xf7, 0x01, 0xef, 0x0d, 0x00, 0xfb, 0xfb, + 0x05, 0x00, 0x01, 0xf3, 0x00, 0x09, 0xfb, 0xf7, 0x09, 0x01, 0xf3, 0x01, + 0x05, 0xfb, 0xff, 0x0d, 0xf3, 0xf7, 0x11, 0x00, 0xef, 0x05, 0x00, 0x05, + 0xf3, 0xff, 0x05, 0xff, 0xff, 0x05, 0xef, 0x05, 0x05, 0xf3, 0xfb, 0x0d, + 0xff, 0x01, 0xef, 0x09, 0x01, 0xff, 0xf7, 0x05, 0x01, 0xf7, 0x05, 0x01, + 0xf7, 0xfb, 0x0d, 0xfb, 0xf7, 0x05, 0x00, 0xff, 0xff, 0x01, 0x05, 0xf7, + 0xf7, 0x11, 0xf7, 0xf7, 0x05, 0x05, 0xf7, 0xfb, 0x09, 0x00, 0xff, 0xfb, + 0x09, 0xf7, 0xfb, 0x0d, 0x00, 0xf3, 0x00, 0x0d, 0xf3, 0xf7, 0x11, 0xfb, + 0xff, 0x01, 0xff, 0xff, 0x09, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0x01, 0x00, + 0x05, 0xfb, 0xff, 0x05, 0xfb, 0xf7, 0x09, 0x01, 0xe7, 0x11, 0x00, 0xff, + 0xef, 0x11, 0xff, 0xf3, 0x09, 0x00, 0xff, 0x00, 0xff, 0x00, 0x01, 0x00, + 0xf3, 0x09, 0x01, 0xfb, 0xf3, 0x15, 0xff, 0xeb, 0x11, 0x00, 0xef, 0x05, + 0xfb, 0x09, 0xf7, 0x01, 0x01, 0xf7, 0xff, 0x09, 0xfb, 0xfb, 0x01, 0x01, + 0x01, 0xe3, 0x15, 0xff, 0xff, 0xef, 0x11, 0xff, 0xf3, 0x00, 0x00, 0x05, + 0xfb, 0xf3, 0x11, 0xf3, 0x09, 0xfb, 0xf7, 0x0d, 0xfb, 0x00, 0xff, 0x05, + 0xff, 0xe7, 0x21, 0xef, 0x05, 0xfb, 0xff, 0x01, 0x01, 0xfb, 0xff, 0x01, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x05, 0xeb, 0x11, 0xff, 0xf3, 0x09, + 0x00, 0x01, 0xeb, 0x11, 0xfb, 0xf7, 0x09, 0xf7, 0x01, 0x01, 0xff, 0xfb, + 0x01, 0x00, 0xfb, 0x01, 0x01, 0xfb, 0xef, 0x19, 0xff, 0xeb, 0x09, 0x00, + 0x01, 0xfb, 0xf3, 0x11, 0x00, 0xf3, 0x00, 0x01, 0x01, 0x00, 0xf3, 0x09, + 0xfb, 0x09, 0xfb, 0xef, 0x15, 0xf7, 0x00, 0x00, 0xf7, 0x01, 0x01, 0xf7, + 0x05, 0x00, 0xff, 0xfb, 0xff, 0x09, 0x00, 0xeb, 0x0d, 0xff, 0x05, 0xf3, + 0xff, 0x0d, 0xfb, 0xf3, 0x09, 0x01, 0xf7, 0xff, 0x05, 0xf7, 0x01, 0xfb, + 0x00, 0x05, 0xf3, 0x01, 0x01, 0xf7, 0xff, 0x01, 0x01, 0xfb, 0xf3, 0x15, + 0xff, 0xf3, 0x05, 0x00, 0xfb, 0xff, 0x05, 0xf3, 0x05, 0x00, 0xfb, 0xff, + 0x01, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0x01, 0xeb, 0x05, 0x01, 0xff, 0xfb, + 0x05, 0xff, 0x09, 0xef, 0x00, 0x09, 0x00, 0xef, 0x0d, 0x00, 0xf3, 0x05, + 0x00, 0x00, 0xf3, 0x15, 0xf3, 0xf3, 0x15, 0xf3, 0xfb, 0x09, 0x01, 0xef, + 0x05, 0xff, 0x01, 0x00, 0xf7, 0x01, 0x05, 0xf7, 0x00, 0x09, 0xe7, 0x0d, + 0x01, 0xfb, 0xf7, 0x09, 0x00, 0xef, 0x05, 0x01, 0xff, 0xf7, 0x05, 0xfb, + 0x05, 0xfb, 0xfb, 0x05, 0xfb, 0x01, 0x00, 0x00, 0xff, 0xff, 0x05, 0xff, + 0xfb, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xf7, 0x09, 0xff, 0x01, 0xef, + 0x09, 0xfb, 0x09, 0xef, 0x00, 0x01, 0x01, 0xfb, 0xf7, 0x0d, 0xff, 0xf3, + 0x05, 0xff, 0x01, 0x00, 0xef, 0x0d, 0xff, 0x05, 0xff, 0xf3, 0x0d, 0x00, + 0xf7, 0xff, 0x05, 0xff, 0x05, 0xf7, 0xfb, 0x09, 0x01, 0xef, 0x01, 0x05, + 0x00, 0xef, 0x09, 0x00, 0x01, 0xeb, 0x0d, 0x00, 0xf3, 0x01, 0x05, 0x00, + 0xf3, 0x11, 0xff, 0xef, 0x11, 0xff, 0xff, 0xf7, 0x0d, 0xff, 0xef, 0x0d, + 0xff, 0x01, 0xeb, 0x0d, 0xff, 0x00, 0xfb, 0xff, 0x01, 0xfb, 0x00, 0x01, + 0x00, 0xe7, 0x19, 0xf7, 0xfb, 0x05, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xfb, 0x05, 0xff, 0xff, 0x00, 0x00, 0x01, 0x05, 0xe7, 0x15, + 0x00, 0xfb, 0xfb, 0x01, 0x05, 0xf7, 0xfb, 0x09, 0x00, 0xff, 0x00, 0x01, + 0xf3, 0x0d, 0xff, 0xf3, 0x0d, 0x00, 0xff, 0xf3, 0x11, 0xff, 0xf7, 0x00, + 0x05, 0xff, 0xfb, 0xff, 0x05, 0x01, 0xf7, 0xf7, 0x11, 0x00, 0xf3, 0xff, + 0x09, 0xff, 0xff, 0x00, 0xff, 0x00, 0x01, 0xfb, 0xf7, 0x0d, 0x00, 0xf7, + 0x00, 0x00, 0x01, 0xff, 0xf7, 0x09, 0x00, 0xf3, 0x00, 0x05, 0xff, 0xef, + 0x11, 0xff, 0xf3, 0x05, 0x01, 0x00, 0xef, 0x11, 0xff, 0xf3, 0x05, 0x01, + 0xf7, 0xf7, 0x11, 0xff, 0xef, 0x0d, 0x00, 0xfb, 0xf7, 0x0d, 0xff, 0xef, + 0x0d, 0x00, 0x00, 0xf7, 0x09, 0x01, 0xf3, 0x01, 0x00, 0x05, 0xef, 0x01, + 0x05, 0x00, 0xef, 0x0d, 0xff, 0xff, 0xff, 0x05, 0xfb, 0x00, 0x01, 0x05, + 0xe3, 0x11, 0xff, 0x01, 0xff, 0xf3, 0x11, 0x00, 0xef, 0x09, 0x00, 0x00, + 0xef, 0x0d, 0xff, 0xfb, 0x01, 0x01, 0xf3, 0x00, 0x09, 0xfb, 0xfb, 0x00, + 0x00, 0x05, 0xf3, 0x05, 0x01, 0xf7, 0x00, 0x05, 0xfb, 0xfb, 0x05, 0x00, + 0xfb, 0xfb, 0x0d, 0xef, 0xfb, 0x0d, 0xff, 0xef, 0x09, 0x01, 0xfb, 0xf7, + 0x09, 0x01, 0xf7, 0xfb, 0x0d, 0xf7, 0xfb, 0x09, 0x00, 0xf3, 0x01, 0x09, + 0xfb, 0xf3, 0x11, 0xff, 0xef, 0x09, 0xff, 0x01, 0xef, 0x09, 0xff, 0x01, + 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x05, 0xef, 0xff, + 0x0d, 0xfb, 0xff, 0x01, 0xff, 0xfb, 0x00, 0x00, 0x01, 0xfb, 0xff, 0x0d, + 0xeb, 0x05, 0x01, 0x05, 0xeb, 0x09, 0x01, 0xfb, 0xf7, 0x0d, 0xf7, 0xff, + 0x09, 0x00, 0xf7, 0x00, 0x01, 0x01, 0xff, 0xf3, 0x11, 0xfb, 0xfb, 0xff, + 0x09, 0xf7, 0xf7, 0x11, 0xff, 0xef, 0x09, 0x00, 0x01, 0xef, 0x0d, 0xff, + 0x01, 0xf3, 0x05, 0x01, 0x00, 0xf3, 0x09, 0x00, 0xff, 0xff, 0x05, 0xff, + 0x00, 0x05, 0xfb, 0xef, 0x15, 0xff, 0xf3, 0x05, 0x05, 0xfb, 0xf3, 0x0d, + 0x00, 0xff, 0xf7, 0x09, 0xfb, 0xf7, 0x11, 0xf7, 0xfb, 0x05, 0x01, 0xfb, + 0xf7, 0x15, 0xf7, 0xef, 0x11, 0xff, 0xff, 0xfb, 0x01, 0x01, 0xff, 0xf7, + 0x09, 0xff, 0x00, 0xfb, 0x00, 0x01, 0xff, 0x05, 0xff, 0xf3, 0x11, 0xff, + 0xf3, 0x05, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xfb, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0xe7, 0x0d, 0x00, 0xff, 0xf7, + 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x01, + 0xf3, 0x00, 0x01, 0x01, 0xef, 0x09, 0x00, 0xf7, 0x00, 0xff, 0x09, 0xf3, + 0xff, 0x05, 0x01, 0xef, 0x05, 0x01, 0x00, 0xef, 0x0d, 0xff, 0xfb, 0x01, + 0x05, 0xeb, 0x09, 0x00, 0xff, 0xf3, 0x0d, 0x00, 0xf7, 0x00, 0x01, 0x00, + 0xff, 0x01, 0xff, 0x00, 0x01, 0xff, 0xef, 0x0d, 0xfb, 0x01, 0xff, 0xfb, + 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xf7, 0x09, 0x00, 0xff, 0xfb, + 0x09, 0xf3, 0x05, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfb, 0x01, 0x01, 0xfb, + 0xfb, 0x09, 0x00, 0xfb, 0xff, 0x05, 0x01, 0xf3, 0x00, 0x09, 0xf7, 0x01, + 0xff, 0x00, 0x00, 0x00, 0x01, 0xf7, 0xff, 0x09, 0xff, 0xfb, 0x01, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xf3, 0x05, 0x00, 0xff, 0x00, 0x00, + 0xff, 0x00, 0x05, 0xeb, 0x05, 0x01, 0xff, 0xf3, 0x09, 0xff, 0xf7, 0x05, + 0xfb, 0x05, 0xfb, 0xff, 0x05, 0xf7, 0x01, 0x01, 0x01, 0xef, 0x11, 0xff, + 0xf3, 0x05, 0x01, 0x00, 0xef, 0x11, 0xff, 0xf3, 0x05, 0xfb, 0x09, 0xf3, + 0x00, 0x05, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x01, 0x00, 0xfb, 0xfb, + 0x0d, 0xf7, 0xff, 0x05, 0x00, 0xf7, 0x00, 0x01, 0x01, 0xf7, 0x00, 0x00, + 0x01, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x00, 0xeb, 0x11, 0xfb, 0x05, + 0xf3, 0x05, 0x01, 0xf3, 0x01, 0x00, 0x00, 0xef, 0x11, 0xfb, 0xf7, 0x09, + 0xfb, 0xff, 0x01, 0x01, 0xf3, 0x01, 0x05, 0x00, 0xf7, 0x05, 0x00, 0xff, + 0xff, 0x00, 0x05, 0xfb, 0xfb, 0x05, 0x01, 0xfb, 0xf7, 0x11, 0xfb, 0xfb, + 0x05, 0x00, 0xf7, 0x00, 0x09, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0x01, 0x05, + 0xff, 0xf7, 0x11, 0xfb, 0xf3, 0x11, 0xf3, 0x01, 0x00, 0x00, 0x01, 0xfb, + 0xf3, 0x11, 0xf7, 0x01, 0xfb, 0x00, 0x05, 0x00, 0xfb, 0xff, 0x01, 0x01, + 0xff, 0xf7, 0x05, 0x00, 0x01, 0xf3, 0x09, 0x01, 0xf7, 0x00, 0x01, 0x01, + 0xf7, 0xfb, 0x09, 0x01, 0xef, 0x01, 0x01, 0x01, 0xef, 0x05, 0x01, 0xf7, + 0x00, 0x05, 0x00, 0xf3, 0x0d, 0xff, 0xf3, 0x09, 0x01, 0xfb, 0xf7, 0x09, + 0x01, 0xf3, 0x05, 0xff, 0x05, 0xff, 0xef, 0x11, 0xfb, 0xff, 0xff, 0x05, + 0xfb, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, + 0xeb, 0x19, 0xf7, 0xfb, 0x05, 0x00, 0xef, 0x0d, 0x00, 0x00, 0xef, 0x15, + 0xfb, 0xf3, 0x09, 0xff, 0xff, 0xf7, 0x0d, 0xfb, 0xf3, 0x09, 0xff, 0x01, + 0xef, 0x0d, 0x00, 0xf7, 0x05, 0x01, 0xfb, 0xfb, 0x09, 0x00, 0xef, 0x09, + 0xff, 0x01, 0xef, 0x09, 0xff, 0x01, 0xf7, 0xff, 0x05, 0xff, 0x00, 0xf3, + 0x0d, 0xff, 0xff, 0x00, 0x01, 0xff, 0x00, 0x01, 0xef, 0x05, 0x00, 0xff, + 0xfb, 0x00, 0x01, 0xfb, 0x00, 0x01, 0x01, 0xf3, 0x01, 0x05, 0xf3, 0x01, + 0x01, 0x00, 0xf3, 0x11, 0xfb, 0xf3, 0x09, 0xff, 0xff, 0xfb, 0x0d, 0xff, + 0xf3, 0x09, 0xff, 0x05, 0xef, 0x05, 0x01, 0xff, 0xf3, 0x09, 0x00, 0xf7, + 0x00, 0x09, 0xef, 0x01, 0x00, 0x05, 0xef, 0x05, 0x00, 0x01, 0xef, 0x09, + 0xff, 0x00, 0xef, 0x11, 0xfb, 0xff, 0xff, 0x01, 0xff, 0xff, 0x01, 0x05, + 0xeb, 0x09, 0x01, 0xfb, 0xfb, 0x09, 0xfb, 0xf3, 0x09, 0xff, 0x00, 0xff, + 0x00, 0x01, 0x00, 0xef, 0x09, 0xff, 0x01, 0x00, 0x00, 0xfb, 0x05, 0xff, + 0xef, 0x11, 0xff, 0xff, 0xfb, 0x05, 0xff, 0x05, 0xf7, 0xfb, 0x09, 0x00, + 0xfb, 0xf7, 0x0d, 0xfb, 0xff, 0x01, 0xff, 0xfb, 0x05, 0x01, 0xf3, 0x05, + 0x01, 0x01, 0xef, 0x09, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xf7, 0x09, 0x00, + 0xf3, 0x09, 0x00, 0x01, 0xef, 0x09, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x00, + 0xfb, 0xff, 0x01, 0xff, 0xff, 0x05, 0xf7, 0xff, 0x05, 0xff, 0xff, 0xff, + 0x05, 0xef, 0x05, 0x05, 0xfb, 0xf3, 0x09, 0x01, 0xfb, 0xf7, 0x09, 0x00, + 0xff, 0xf7, 0x0d, 0xff, 0xf7, 0x00, 0x05, 0xfb, 0xff, 0x09, 0xef, 0x00, + 0x05, 0x00, 0xef, 0x0d, 0x00, 0xfb, 0xfb, 0x09, 0x00, 0xf3, 0x01, 0x01, + 0xff, 0xf7, 0x05, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x01, 0xef, 0x01, 0x05, 0x00, 0xf7, 0x09, 0xf3, 0x05, + 0x00, 0x01, 0xf7, 0x00, 0x05, 0x00, 0xff, 0xf7, 0x0d, 0xfb, 0xff, 0x01, + 0x01, 0xf7, 0xfb, 0x0d, 0xfb, 0xf3, 0x11, 0xf7, 0x00, 0x01, 0xff, 0xff, + 0x00, 0x01, 0xff, 0xef, 0x19, 0xf7, 0xf7, 0x09, 0x00, 0xff, 0xfb, 0x05, + 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x09, 0x00, + 0xf3, 0x05, 0x00, 0x00, 0xf3, 0x0d, 0xff, 0xf7, 0x05, 0xff, 0x05, 0xf3, + 0x05, 0x05, 0xf7, 0x00, 0x05, 0xff, 0xfb, 0x05, 0x01, 0xf3, 0x01, 0x01, + 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xfb, 0x0d, 0xff, 0xf3, 0x0d, 0xfb, + 0x01, 0x00, 0xef, 0x0d, 0xfb, 0x01, 0xf7, 0xff, 0x01, 0xff, 0x00, 0xff, + 0x01, 0x01, 0xfb, 0xff, 0x01, 0x01, 0xff, 0xfb, 0x09, 0xf3, 0x01, 0x00, + 0x01, 0xf3, 0x01, 0x05, 0xf7, 0x00, 0x05, 0x01, 0xef, 0x09, 0x00, 0x00, + 0xf7, 0x05, 0x00, 0x00, 0xf7, 0x09, 0xfb, 0xfb, 0x01, 0x00, 0xfb, 0x00, + 0x05, 0xff, 0xf3, 0x11, 0xfb, 0xfb, 0x00, 0x01, 0x00, 0x05, 0xef, 0x09, + 0x01, 0xfb, 0xff, 0x05, 0x00, 0xff, 0xfb, 0x05, 0xff, 0x00, 0x00, 0xf3, + 0x05, 0x01, 0xf7, 0x00, 0x01, 0x01, 0xf3, 0x01, 0x00, 0x01, 0xf7, 0x09, + 0xfb, 0xff, 0x01, 0x01, 0xf3, 0x01, 0x00, 0x01, 0xf3, 0x00, 0x05, 0x00, + 0xef, 0x0d, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, + 0xfb, 0x05, 0xff, 0xff, 0x01, 0xff, 0x00, 0xff, 0x00, 0x01, 0xf3, 0x09, + 0x00, 0x00, 0xf7, 0x09, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0xfc, 0xf0, 0x10, 0xfc, 0xf8, 0x04, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0c, 0xfc, 0x00, 0x00, 0x04, + 0xfc, 0xf8, 0x0b, 0x00, 0xf8, 0x00, 0x04, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0xfc, 0x04, 0x00, 0xf5, 0x00, 0x00, 0x00, 0xf2, 0x07, 0x00, 0xf9, 0x00, + 0x04, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xf6, 0x07, + 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfd, 0x00, + 0x00, 0x00, 0xfd, 0xfd, 0x00, 0xfd, 0x03, 0x00, 0xf7, 0x06, 0x00, 0xfd, + 0x00, 0x03, 0x00, 0x00, 0x00, 0xf7, 0x03, 0x00, 0xfa, 0x00, 0x00, 0x00, + 0xf7, 0x03, 0x00, 0x00, 0xf7, 0x06, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xf5, + 0x09, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfa, 0x08, 0xfd, 0xfa, 0x06, 0xfd, + 0x05, 0xfb, 0x00, 0x03, 0x00, 0xfd, 0xfd, 0x08, 0x00, 0xfb, 0x03, 0x00, + 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, + 0x00, 0xf7, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x00, 0x04, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xfa, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x09, 0xfc, 0xfe, 0x02, 0x00, 0xfe, + 0xfe, 0x04, 0x00, 0xfb, 0x03, 0x00, 0xfe, 0x00, 0x03, 0x00, 0xfd, 0x03, + 0x00, 0xfe, 0xfe, 0x05, 0x00, 0xfb, 0x03, 0x00, 0xfd, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfc, + 0x04, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x02, + 0x00, 0x00, 0xff, 0x02, 0xff, 0x00, 0x01, 0x00, 0xfd, 0x02, 0x00, 0x00, + 0xfa, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xfe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfd, 0x01, + 0x00, 0xff, 0x00, 0x01, 0x00, 0xfe, 0x02, 0x00, 0xff, 0x01, 0x00, 0x00, + 0xff, 0x02, 0x00, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, + 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0x01, 0xf8, 0xf9, 0xf6, 0xee, 0xff, + 0xfb, 0xf7, 0xf5, 0xf5, 0x09, 0xea, 0x0f, 0x27, 0x48, 0x00, 0x25, 0xd5, + 0xe7, 0x23, 0x1c, 0xe7, 0x02, 0xc2, 0xab, 0xb6, 0xaf, 0xb5, 0xc8, 0xa1, + 0x07, 0x1a, 0xce, 0xeb, 0x0a, 0x33, 0x5f, 0x73, 0x63, 0x7f, 0x7f, 0x7d, + 0x7c, 0x52, 0x5b, 0x73, 0x64, 0xf2, 0xc9, 0xdf, 0xf8, 0xdb, 0xef, 0xd0, + 0xa4, 0x80, 0x8b, 0x80, 0x80, 0x80, 0x80, 0x89, 0xb2, 0xd3, 0xf7, 0xff, + 0xf1, 0xfe, 0x3f, 0x74, 0x77, 0x7f, 0x79, 0x68, 0x42, 0x10, 0xf7, 0xf1, + 0xf9, 0xf8, 0xdc, 0xa2, 0x9d, 0xc7, 0xb0, 0x80, 0x80, 0x97, 0xa2, 0xbf, + 0x17, 0x4d, 0x5f, 0x51, 0x5e, 0x7f, 0x7f, 0x7f, 0x7f, 0x72, 0x5a, 0x54, + 0x4d, 0x30, 0x16, 0xfc, 0xe8, 0xcf, 0xc0, 0xa0, 0x8d, 0x80, 0x80, 0x80, + 0x8d, 0xb3, 0xc3, 0xa0, 0xa3, 0xca, 0xdd, 0xe7, 0xf7, 0x03, 0x0a, 0x0b, + 0x1d, 0x30, 0x3d, 0x4f, 0x5d, 0x54, 0x51, 0x5a, 0x55, 0x46, 0x30, 0x2d, + 0x28, 0x04, 0xe6, 0xc7, 0xc3, 0xcf, 0xc7, 0xb5, 0xa8, 0xb0, 0xc7, 0xec, + 0xea, 0xf2, 0xfb, 0x09, 0x0a, 0x29, 0x49, 0x4b, 0x51, 0x36, 0x45, 0x5a, + 0x30, 0x00, 0xcc, 0xd2, 0xd1, 0xbe, 0xbc, 0xa8, 0x94, 0xa9, 0xd5, 0xe7, + 0xd6, 0xdf, 0xf7, 0x09, 0x19, 0x0d, 0x25, 0x3f, 0x49, 0x44, 0x3c, 0x39, + 0x2e, 0x30, 0x19, 0x08, 0x02, 0xf9, 0xff, 0x0c, 0x02, 0xfc, 0xf3, 0xe3, + 0xd2, 0xd3, 0xcc, 0xcd, 0xe1, 0xf0, 0xec, 0xe0, 0xc7, 0xcd, 0xd8, 0xe1, + 0xde, 0xeb, 0x0d, 0x2d, 0x39, 0x43, 0x43, 0x3f, 0x3a, 0x3e, 0x3f, 0x3c, + 0x22, 0x1c, 0x0d, 0xfe, 0xf0, 0xd1, 0xc6, 0xb6, 0xaa, 0xad, 0xb2, 0xb3, + 0xc5, 0xef, 0x03, 0x11, 0x1c, 0x19, 0x17, 0x1a, 0x17, 0x23, 0x31, 0x2e, + 0x37, 0x32, 0x1b, 0x06, 0xf8, 0xe5, 0xca, 0xcd, 0xd2, 0xd3, 0xd4, 0xd7, + 0xef, 0x06, 0xf0, 0xec, 0xf8, 0xf1, 0x07, 0x08, 0x0d, 0x14, 0x19, 0x10, + 0x0a, 0x04, 0xfc, 0x0c, 0x10, 0x0b, 0x12, 0x12, 0x22, 0x1e, 0x22, 0x10, + 0x04, 0x05, 0x00, 0xf0, 0xdf, 0xd4, 0xc6, 0xc9, 0xd3, 0xd3, 0xd5, 0xca, + 0xcc, 0xd1, 0xe5, 0xf3, 0x01, 0x0d, 0x2a, 0x39, 0x43, 0x43, 0x39, 0x28, + 0x1c, 0x1e, 0x18, 0x13, 0x08, 0x01, 0xf5, 0xe3, 0xd5, 0xd3, 0xce, 0xc2, + 0xbf, 0xcb, 0xdf, 0xf7, 0x07, 0x06, 0x0e, 0x1c, 0x12, 0x12, 0x10, 0x0c, + 0x08, 0x0d, 0x0b, 0x10, 0x0a, 0xfb, 0xfa, 0x00, 0xf8, 0xf1, 0xfb, 0xfc, + 0xfe, 0x07, 0x15, 0x10, 0x09, 0x00, 0xee, 0xe6, 0xdf, 0xdb, 0xdf, 0xdf, + 0xe8, 0xfa, 0xfc, 0xf3, 0xfa, 0xf4, 0xf8, 0x0a, 0x17, 0x20, 0x2a, 0x2b, + 0x33, 0x32, 0x21, 0x15, 0x06, 0xfc, 0xf2, 0xed, 0xe3, 0xda, 0xce, 0xc5, + 0xc2, 0xc3, 0xc8, 0xca, 0xd4, 0xe1, 0xec, 0xff, 0x15, 0x1d, 0x28, 0x30, + 0x31, 0x2e, 0x2e, 0x20, 0x12, 0x0c, 0x11, 0x16, 0x14, 0x14, 0x01, 0xf2, + 0xf4, 0xf5, 0xf6, 0xec, 0xe0, 0xe6, 0xe9, 0xf1, 0xfd, 0xf8, 0xf1, 0xec, + 0xe8, 0xe7, 0xee, 0xf6, 0xfb, 0x04, 0x00, 0xfd, 0x06, 0x0a, 0x0d, 0x0a, + 0x04, 0x0f, 0x1e, 0x24, 0x21, 0x08, 0xff, 0xfa, 0xf5, 0xee, 0xec, 0xe0, + 0xd5, 0xd0, 0xda, 0xed, 0xf7, 0xf7, 0xf4, 0xf9, 0x03, 0x05, 0x0d, 0x12, + 0x17, 0x1f, 0x25, 0x2c, 0x28, 0x1c, 0x08, 0xf7, 0xec, 0xe3, 0xe4, 0xea, + 0xef, 0xed, 0xef, 0xe8, 0xe1, 0xe0, 0xdf, 0xe0, 0xed, 0xf4, 0xff, 0x0b, + 0x11, 0x0d, 0x04, 0x05, 0x10, 0x10, 0x12, 0x12, 0x10, 0x09, 0x0a, 0x13, + 0x13, 0x14, 0x10, 0x0d, 0x0a, 0x03, 0x00, 0xf9, 0xf4, 0xf5, 0xf5, 0xf2, + 0xe7, 0xdf, 0xe3, 0xdd, 0xd3, 0xde, 0xe4, 0xec, 0xf3, 0xfd, 0xfb, 0x03, + 0x08, 0x0b, 0x08, 0x06, 0x0c, 0x17, 0x1b, 0x1c, 0x19, 0x11, 0x05, 0x01, + 0x04, 0x00, 0xf6, 0xf9, 0xf1, 0xf1, 0xf3, 0xef, 0xea, 0xef, 0xf7, 0x02, + 0x00, 0xfc, 0x00, 0xfe, 0x07, 0x18, 0x19, 0x16, 0x0e, 0x08, 0xfc, 0xf6, + 0xec, 0xea, 0xf0, 0xf1, 0xfa, 0xf7, 0xf8, 0xef, 0xe9, 0xe5, 0xeb, 0xe8, + 0xea, 0xf2, 0xfe, 0x04, 0x06, 0x0c, 0x11, 0x0d, 0x09, 0x08, 0x06, 0x0a, + 0x10, 0x12, 0x0e, 0x10, 0x0a, 0x05, 0x04, 0x05, 0x03, 0xff, 0xfe, 0x04, + 0xff, 0xfa, 0xf4, 0xf3, 0xf1, 0xea, 0xe7, 0xe6, 0xe4, 0xe7, 0xe7, 0xf7, + 0xfa, 0xfc, 0x03, 0x06, 0x03, 0x06, 0x00, 0xff, 0x04, 0x10, 0x13, 0x13, + 0x12, 0x08, 0x00, 0xfa, 0xf1, 0xea, 0xe7, 0xe7, 0xf2, 0xfd, 0xfc, 0xfc, + 0xfd, 0x06, 0x08, 0x0d, 0x13, 0x12, 0x12, 0x10, 0x12, 0x11, 0x0c, 0x06, + 0xfd, 0xf9, 0xf2, 0xe9, 0xe7, 0xe6, 0xe1, 0xe5, 0xe7, 0xeb, 0xf5, 0x04, + 0x05, 0x04, 0x04, 0x06, 0x0c, 0x0c, 0x09, 0x07, 0x04, 0xff, 0xf8, 0xef, + 0xe9, 0xe4, 0xeb, 0xf4, 0xfa, 0x01, 0x0b, 0x0a, 0x07, 0x06, 0x0a, 0x0b, + 0x0c, 0x0c, 0x10, 0x10, 0x09, 0x00, 0xf7, 0xef, 0xef, 0xe9, 0xe6, 0xe5, + 0xf1, 0xf2, 0xf5, 0xf9, 0xff, 0x0b, 0x15, 0x16, 0x13, 0x15, 0x14, 0x11, + 0x0c, 0x0b, 0x05, 0x00, 0xf6, 0xec, 0xe4, 0xd7, 0xd9, 0xd9, 0xdf, 0xef, + 0xfa, 0xff, 0x03, 0x0a, 0x10, 0x10, 0x10, 0x12, 0x0c, 0x0c, 0x10, 0x0a, + 0x02, 0xfb, 0xfc, 0xf7, 0xf0, 0xee, 0xf5, 0xfd, 0xff, 0xff, 0x01, 0xfe, + 0xff, 0x05, 0x08, 0x07, 0x07, 0x01, 0xf8, 0xf0, 0xef, 0xeb, 0xe4, 0xe4, + 0xe2, 0xe6, 0xe7, 0xef, 0xf1, 0xf8, 0x04, 0x10, 0x1d, 0x28, 0x2c, 0x29, + 0x20, 0x18, 0x16, 0x10, 0x05, 0xff, 0xf4, 0xea, 0xe6, 0xe4, 0xe2, 0xdc, + 0xdf, 0xe4, 0xec, 0xf3, 0xff, 0x08, 0x0c, 0x10, 0x17, 0x17, 0x14, 0x10, + 0x0b, 0x00, 0xf4, 0xf6, 0xf6, 0xf3, 0xf5, 0xef, 0xe8, 0xe7, 0xed, 0xf7, + 0x00, 0x04, 0x09, 0x09, 0x0b, 0x11, 0x14, 0x11, 0x08, 0xfe, 0xfa, 0xf1, + 0xf4, 0xf0, 0xea, 0xe9, 0xe9, 0xeb, 0xee, 0xf4, 0xfb, 0xff, 0x03, 0x12, + 0x1e, 0x29, 0x28, 0x22, 0x12, 0x07, 0xfe, 0xf1, 0xef, 0xea, 0xe3, 0xdd, + 0xd8, 0xdd, 0xe2, 0xe3, 0xec, 0xf5, 0xfb, 0x06, 0x12, 0x18, 0x18, 0x19, + 0x1b, 0x1c, 0x1d, 0x1b, 0x10, 0x08, 0xfd, 0xee, 0xe8, 0xe5, 0xe7, 0xea, + 0xec, 0xec, 0xef, 0xf9, 0xfb, 0xff, 0x09, 0x12, 0x10, 0x10, 0x18, 0x12, + 0x05, 0xfa, 0xf4, 0xec, 0xea, 0xea, 0xed, 0xec, 0xf1, 0xf6, 0xfb, 0xfd, + 0x06, 0x0b, 0x0f, 0x10, 0x13, 0x10, 0x10, 0x0c, 0x01, 0xfa, 0xf4, 0xee, + 0xe5, 0xe0, 0xde, 0xde, 0xdd, 0xe1, 0xef, 0xff, 0x08, 0x0d, 0x11, 0x12, + 0x16, 0x1d, 0x1e, 0x23, 0x26, 0x20, 0x16, 0x09, 0xfc, 0xec, 0xe3, 0xdf, + 0xe1, 0xe2, 0xe4, 0xe7, 0xeb, 0xf3, 0xf5, 0xf5, 0xf6, 0xfc, 0x04, 0x0d, + 0x11, 0x0d, 0x09, 0x0a, 0x08, 0x04, 0xfe, 0xf7, 0xf2, 0xf2, 0xf7, 0xfa, + 0x01, 0x05, 0x08, 0x08, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x00, 0xfd, 0xfd, + 0xfa, 0xf6, 0xee, 0xe7, 0xdf, 0xe1, 0xe6, 0xed, 0xf1, 0xf6, 0x01, 0x0a, + 0x0f, 0x12, 0x12, 0x10, 0x13, 0x12, 0x0d, 0x0c, 0x08, 0x02, 0xfe, 0xf5, + 0xeb, 0xe1, 0xe1, 0xe3, 0xe8, 0xeb, 0xf1, 0xf6, 0xfb, 0x04, 0x0d, 0x0e, + 0x0c, 0x0f, 0x10, 0x14, 0x16, 0x10, 0x02, 0xfd, 0xfa, 0xf7, 0xf6, 0xf2, + 0xf0, 0xf3, 0xf3, 0xf5, 0xfb, 0x00, 0x02, 0x06, 0x08, 0x06, 0x05, 0x00, + 0xfe, 0xfc, 0xf8, 0xf7, 0xf7, 0xf5, 0xf7, 0xf3, 0xed, 0xed, 0xef, 0xf4, + 0xf7, 0x00, 0x06, 0x0a, 0x12, 0x13, 0x11, 0x0d, 0x0b, 0x0c, 0x05, 0x03, + 0xff, 0xf4, 0xee, 0xed, 0xea, 0xea, 0xe9, 0xed, 0xf2, 0xf8, 0xfa, 0x01, + 0x05, 0x0c, 0x13, 0x15, 0x16, 0x15, 0x10, 0x09, 0x04, 0xff, 0xfb, 0xf9, + 0xf8, 0xf5, 0xf1, 0xed, 0xe8, 0xeb, 0xf2, 0xf3, 0xf7, 0xfd, 0xff, 0x03, + 0x08, 0x07, 0x04, 0x06, 0x05, 0x08, 0x0a, 0x06, 0x01, 0xfa, 0xf7, 0xfb, + 0xfe, 0xf9, 0xfb, 0xfc, 0xfb, 0xf9, 0xf8, 0xf7, 0xf9, 0xfb, 0xfc, 0xfd, + 0xff, 0xfc, 0xf7, 0xf8, 0xf9, 0xf2, 0xf3, 0xf8, 0xfd, 0xff, 0xfe, 0x03, + 0x05, 0x0a, 0x0e, 0x10, 0x0d, 0x0e, 0x0d, 0x0b, 0x09, 0x08, 0x01, 0xfb, + 0xf7, 0xf9, 0xf5, 0xf1, 0xf1, 0xf5, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, + 0xff, 0xff, 0xfd, 0xff, 0x05, 0x07, 0x05, 0x02, 0x04, 0x02, 0xfd, 0xf8, + 0xf4, 0xf3, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf5, 0xf7, 0xf8, 0xfa, 0xfb, + 0xfc, 0x02, 0x05, 0x05, 0x08, 0x09, 0x08, 0x07, 0x07, 0x05, 0x04, 0x07, + 0x0b, 0x0b, 0x0b, 0x09, 0x08, 0x03, 0x00, 0x00, 0xfe, 0xfd, 0xfc, 0xfc, + 0xf7, 0xf6, 0xf5, 0xef, 0xed, 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xf0, 0xef, + 0xf2, 0xf5, 0xf6, 0xfb, 0x02, 0x04, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0a, + 0x08, 0x09, 0x06, 0x03, 0x01, 0xfe, 0xfe, 0xfb, 0xfd, 0xfd, 0xff, 0x00, + 0xfc, 0xfb, 0xfe, 0xff, 0xff, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x01, 0xff, 0xfd, 0xfe, 0xfb, 0xf6, 0xf4, 0xf4, 0xf2, 0xf5, 0xf9, + 0xfb, 0xf8, 0xf7, 0xfa, 0xfa, 0xfb, 0xff, 0x02, 0x02, 0x01, 0xff, 0xfd, + 0xfd, 0xfc, 0xfb, 0xfe, 0x02, 0x03, 0x05, 0x04, 0x01, 0xfe, 0x00, 0x03, + 0x04, 0x04, 0x07, 0x08, 0x06, 0x04, 0x04, 0x00, 0xfe, 0xfd, 0xfd, 0xf9, + 0xf7, 0xf7, 0xf3, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf5, 0xf6, 0xf5, 0xf5, + 0xf8, 0xff, 0x01, 0x00, 0x03, 0x06, 0x02, 0xfe, 0xff, 0x01, 0x01, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x06, 0x06, 0x06, 0x06, 0x05, 0x00, + 0xfd, 0xfc, 0xfb, 0xf9, 0xf8, 0xf7, 0xf8, 0xf7, 0xf9, 0xf9, 0xfb, 0xfd, + 0xfc, 0xfd, 0xff, 0xff, 0x00, 0x02, 0x02, 0x01, 0xff, 0xfc, 0xf7, 0xf6, + 0xf5, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf4, 0xf5, 0xfa, 0xff, 0x02, 0x07, + 0x0d, 0x10, 0x11, 0x13, 0x13, 0x11, 0x0f, 0x10, 0x0c, 0x06, 0x00, 0xfb, + 0xf7, 0xf4, 0xf3, 0xf1, 0xf1, 0xf2, 0xf4, 0xf6, 0xf7, 0xf9, 0xfa, 0xfa, + 0xfa, 0xfe, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xfd, 0xfb, 0xfc, 0xfd, + 0xfc, 0xfc, 0xfd, 0xff, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05, 0x06, 0x04, + 0x00, 0xff, 0xfe, 0xfb, 0xf9, 0xf8, 0xf5, 0xf2, 0xf0, 0xf3, 0xf7, 0xfc, + 0xff, 0x00, 0x04, 0x07, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x05, 0x02, 0xfe, + 0xf8, 0xf5, 0xef, 0xed, 0xee, 0xef, 0xef, 0xf2, 0xf5, 0xf8, 0xfc, 0xfe, + 0xff, 0x04, 0x09, 0x0e, 0x11, 0x10, 0x0c, 0x08, 0x06, 0x03, 0x01, 0x02, + 0x00, 0xfe, 0xfc, 0xfd, 0xfc, 0xfb, 0xfa, 0xfb, 0xfc, 0xff, 0xfe, 0xfe, + 0xfe, 0xfb, 0xf9, 0xf7, 0xf6, 0xf6, 0xf5, 0xf2, 0xef, 0xf0, 0xf2, 0xf5, + 0xfa, 0xfe, 0xff, 0x04, 0x09, 0x0f, 0x10, 0x10, 0x10, 0x0e, 0x0b, 0x07, + 0x03, 0xff, 0xf8, 0xf3, 0xef, 0xee, 0xf0, 0xf1, 0xef, 0xf2, 0xf5, 0xf5, + 0xf9, 0xfe, 0x03, 0x07, 0x0b, 0x0d, 0x10, 0x11, 0x10, 0x09, 0x02, 0xfe, + 0xfc, 0xfb, 0xfa, 0xf8, 0xf3, 0xf2, 0xf4, 0xf2, 0xf2, 0xf4, 0xf7, 0xf9, + 0xfa, 0xfc, 0xfe, 0x00, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfd, 0xfc, 0xfc, + 0xfb, 0xfd, 0x00, 0x01, 0x07, 0x0b, 0x0b, 0x0c, 0x0d, 0x0c, 0x0c, 0x08, + 0x06, 0x03, 0xff, 0xfb, 0xf7, 0xf1, 0xee, 0xed, 0xeb, 0xea, 0xed, 0xf0, + 0xf3, 0xf6, 0xfc, 0x01, 0x04, 0x07, 0x0b, 0x0e, 0x10, 0x10, 0x0e, 0x09, + 0x05, 0x02, 0xfd, 0xf9, 0xf5, 0xf0, 0xee, 0xef, 0xef, 0xef, 0xf1, 0xf3, + 0xf9, 0xfe, 0x00, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x05, 0x04, 0x02, + 0x00, 0xff, 0xfd, 0xfc, 0xfb, 0xfd, 0xff, 0xff, 0x01, 0x02, 0x02, 0x01, + 0x00, 0xff, 0xfb, 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf3, 0xf0, 0xef, 0xf0, + 0xf2, 0xf5, 0xf9, 0xff, 0x05, 0x08, 0x0d, 0x10, 0x11, 0x12, 0x11, 0x10, + 0x0d, 0x0a, 0x06, 0x00, 0xfa, 0xf6, 0xf3, 0xef, 0xed, 0xed, 0xeb, 0xec, + 0xf0, 0xf4, 0xf9, 0xfe, 0x02, 0x06, 0x08, 0x08, 0x08, 0x07, 0x04, 0x03, + 0x03, 0x03, 0x01, 0x00, 0xfd, 0xf9, 0xf7, 0xfa, 0xfc, 0xfc, 0xfd, 0xfc, + 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfb, + 0xf9, 0xfb, 0xfd, 0x00, 0x01, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x02, 0x00, 0xfb, 0xf7, 0xf5, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf5, 0xf8, 0xfb, 0xfe, 0x00, 0x02, 0x05, 0x07, 0x07, 0x05, 0x04, + 0x04, 0x01, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, + 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0x01, 0x03, 0x04, 0x03, 0x03, 0x01, 0xff, + 0xfc, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xff, + 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, + 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0xff, 0xfd, 0xfc, 0xfa, 0xf9, 0xf9, 0xf9, + 0xf9, 0xfa, 0xfb, 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfc, 0xfb, 0xfc, + 0xfb, 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x03, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0xfd, 0xfe, + 0xfe, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0xc8, 0x18, 0x65, 0xbb, 0xbb, 0x2b, 0x07, + 0xfd, 0xe1, 0xb4, 0x5f, 0x38, 0xb2, 0xd0, 0x40, 0x06, 0x7f, 0x0f, 0x37, + 0xfc, 0xb7, 0x13, 0x64, 0x08, 0x0f, 0x1f, 0x40, 0xf3, 0xd2, 0xa8, 0x44, + 0x63, 0x2e, 0x1a, 0x01, 0x99, 0xfc, 0x57, 0xe3, 0x30, 0xe3, 0xa7, 0xb5, + 0x61, 0x4e, 0xf3, 0x33, 0xf1, 0xea, 0x09, 0xc3, 0xd0, 0x62, 0xbb, 0xe3, + 0xcc, 0xba, 0x24, 0xb1, 0xe0, 0xca, 0x07, 0x02, 0xa2, 0xcf, 0xee, 0xd6, + 0xc3, 0x01, 0xf6, 0xd5, 0xac, 0xe4, 0xa8, 0xec, 0x2a, 0xed, 0xc3, 0x2c, + 0x03, 0xf6, 0xce, 0xf6, 0xff, 0x35, 0xf1, 0xa0, 0x0e, 0xba, 0x0f, 0x2e, + 0x3a, 0x48, 0xf0, 0xaa, 0xcd, 0x01, 0xe4, 0xf6, 0xf3, 0x02, 0x01, 0x17, + 0x13, 0x22, 0x61, 0xf8, 0xdb, 0x37, 0xee, 0x12, 0x35, 0x3f, 0x20, 0x49, + 0x58, 0x42, 0x6e, 0x63, 0x3e, 0xfc, 0x5f, 0x43, 0x42, 0x08, 0x33, 0x7f, + 0x22, 0x49, 0x54, 0x37, 0x35, 0xf2, 0x5e, 0x18, 0x59, 0x38, 0x20, 0x04, + 0x53, 0x03, 0x2a, 0x27, 0x1a, 0x1c, 0x15, 0x0f, 0x0d, 0x06, 0x0a, 0xfe, + 0xfb, 0xff, 0xfc, 0xf9, 0xfc, 0xf9, 0xf2, 0xec, 0xed, 0xed, 0xe2, 0xd9, + 0xe6, 0xdd, 0xd8, 0xd6, 0xe3, 0xd4, 0xcb, 0xd4, 0xdd, 0xea, 0xbf, 0x9e, + 0x9b, 0x84, 0x9a, 0xa2, 0xa7, 0xad, 0x9d, 0xa3, 0xa3, 0xae, 0xa9, 0xa9, + 0xc3, 0xbe, 0xc5, 0xc4, 0xa6, 0xd1, 0xbb, 0xd4, 0xd7, 0xdc, 0xed, 0xd1, + 0xe0, 0x18, 0xf8, 0xc5, 0x18, 0x07, 0xeb, 0x04, 0x1b, 0x7f, 0x00, 0x28, + 0x7f, 0x0f, 0x1b, 0x4b, 0x51, 0x14, 0xc8, 0x3e, 0x7c, 0x2d, 0x15, 0x35, + 0x4a, 0xd4, 0xbb, 0x1b, 0xee, 0x2d, 0x0c, 0x0d, 0x2b, 0x50, 0x02, 0xec, + 0x0c, 0xfd, 0x05, 0x22, 0x31, 0x14, 0x2a, 0x25, 0x13, 0x3e, 0x48, 0x36, + 0x20, 0xd4, 0x26, 0x3d, 0x1d, 0x25, 0x2f, 0x1c, 0x26, 0x2b, 0x11, 0xf2, + 0x0a, 0x32, 0x2a, 0xda, 0xea, 0x19, 0xec, 0x04, 0x17, 0x01, 0x1e, 0xf1, + 0xd1, 0xe6, 0xeb, 0x04, 0x23, 0xfb, 0xec, 0xcc, 0x9b, 0xec, 0x15, 0xea, + 0x04, 0xb9, 0xc4, 0x06, 0xb7, 0x88, 0xb9, 0xcc, 0xd9, 0xc0, 0xae, 0xaf, + 0xba, 0xb8, 0xc3, 0xd7, 0xc8, 0xbb, 0xd4, 0xc9, 0xd9, 0xd6, 0xe0, 0xe1, + 0x1b, 0xc4, 0xd0, 0xf0, 0xdb, 0xed, 0x0e, 0x25, 0x05, 0xfd, 0x05, 0x0f, + 0x06, 0xf6, 0x0a, 0x0a, 0x1c, 0x0e, 0x1f, 0x1f, 0x0d, 0x17, 0x1d, 0x1c, + 0x23, 0x25, 0x32, 0x4e, 0x4f, 0x2d, 0xd8, 0x5b, 0x54, 0x7f, 0x43, 0x3f, + 0x3f, 0x51, 0x29, 0x4e, 0x4f, 0x34, 0x3c, 0x35, 0x3d, 0x2a, 0x2d, 0x30, + 0x01, 0x07, 0x32, 0x0e, 0xfc, 0x61, 0x21, 0x27, 0x0e, 0x1a, 0x24, 0x01, + 0xc3, 0x98, 0x20, 0xe7, 0xc9, 0xfb, 0xec, 0x39, 0xff, 0xb7, 0xf6, 0x18, + 0xec, 0xfa, 0x00, 0x1f, 0xee, 0xf9, 0xfc, 0x01, 0x08, 0xf6, 0xd4, 0xdb, + 0xfc, 0xf9, 0xf2, 0xfe, 0xf9, 0xf6, 0xdc, 0xe1, 0xec, 0xe7, 0xe4, 0x0c, + 0xe0, 0x01, 0xdb, 0xa7, 0xe2, 0x25, 0xcd, 0x8e, 0xbe, 0xfe, 0xf7, 0xc3, + 0xbb, 0xc9, 0xd6, 0x1b, 0xf1, 0x9e, 0x00, 0x18, 0xe8, 0xbd, 0x01, 0x02, + 0xd6, 0xf0, 0xfc, 0x00, 0xc1, 0xf8, 0xe9, 0x0e, 0x1d, 0xe6, 0x10, 0x0a, + 0xee, 0xe8, 0xf1, 0xfb, 0x19, 0x10, 0x17, 0x21, 0x22, 0x17, 0x50, 0xf8, + 0x21, 0x56, 0x09, 0x0b, 0xe5, 0x2b, 0x70, 0x63, 0x27, 0xeb, 0x3d, 0x4a, + 0xea, 0x1c, 0x2f, 0x0a, 0x01, 0x3b, 0x01, 0x07, 0x19, 0x07, 0xf1, 0x46, + 0x0b, 0x4d, 0x2c, 0x1f, 0x04, 0xdb, 0x22, 0x28, 0x0f, 0x1e, 0x2d, 0xe6, + 0xf6, 0x33, 0x16, 0x03, 0xfd, 0x1b, 0xeb, 0xd9, 0xbe, 0x35, 0xfe, 0xf3, + 0x16, 0xec, 0xfe, 0xe6, 0xed, 0xc9, 0xf8, 0x14, 0xe9, 0x10, 0xdb, 0xfa, + 0xd2, 0xdf, 0x15, 0xc6, 0xd6, 0xf6, 0x02, 0x8c, 0x16, 0x47, 0xe6, 0x12, + 0xb6, 0xdd, 0x0b, 0xcc, 0x05, 0x0d, 0xd7, 0xb2, 0xb0, 0x03, 0xbc, 0x0e, + 0xae, 0xdc, 0xfe, 0xb4, 0x0f, 0x3c, 0xd5, 0xa5, 0xfb, 0x1c, 0xfc, 0xb2, + 0xec, 0xeb, 0xed, 0x35, 0x12, 0xa1, 0x22, 0x1f, 0xde, 0xd8, 0x08, 0x01, + 0x3f, 0x0f, 0xb4, 0x26, 0x2f, 0x2a, 0x1d, 0xe1, 0xfc, 0x4c, 0x47, 0xef, + 0xfb, 0xdb, 0xfb, 0xfd, 0x2f, 0x27, 0x25, 0x0b, 0xc0, 0x2b, 0xff, 0xcf, + 0x1a, 0xfe, 0x0c, 0x57, 0x11, 0x0d, 0x74, 0xc5, 0xdd, 0x57, 0x3c, 0xe9, + 0xdb, 0x4f, 0x06, 0xe5, 0x11, 0xfd, 0x0c, 0x2e, 0x16, 0x2a, 0x16, 0xab, + 0x3a, 0x3e, 0x2a, 0xfe, 0xbb, 0x38, 0xcd, 0xd4, 0x17, 0x3d, 0x3e, 0xf6, + 0xf3, 0x29, 0xe8, 0xe8, 0x5f, 0xd7, 0x15, 0xc9, 0x1a, 0x1f, 0xbd, 0xdd, + 0x58, 0xc2, 0xf1, 0x40, 0x1f, 0xf7, 0x09, 0x07, 0xd4, 0xff, 0xe7, 0xf9, + 0xce, 0xcb, 0x04, 0x12, 0xc9, 0xdc, 0x15, 0xd7, 0xc1, 0xc0, 0xe1, 0x15, + 0xa0, 0xc4, 0xec, 0xcb, 0x0c, 0x26, 0xf7, 0x34, 0xa7, 0xf0, 0x05, 0xb2, + 0xec, 0xc0, 0xfe, 0x03, 0xd0, 0xc7, 0x21, 0xfc, 0xaa, 0x21, 0xf8, 0x31, + 0xff, 0xf2, 0x29, 0x5d, 0xf9, 0xcd, 0xf2, 0x0d, 0xf2, 0x3a, 0x61, 0x3d, + 0xf9, 0x00, 0xcc, 0x0b, 0x3f, 0x0f, 0x25, 0xdc, 0xfc, 0x49, 0x3c, 0xfe, + 0xe6, 0x44, 0xf4, 0xc4, 0xf8, 0x1b, 0xe8, 0xf0, 0x52, 0x3c, 0xb5, 0xe9, + 0x4a, 0xf3, 0xe5, 0x00, 0x0d, 0x0d, 0xfe, 0x4e, 0xb1, 0xe9, 0x46, 0x3a, + 0x1d, 0x1b, 0xfb, 0x00, 0x05, 0xdc, 0xfa, 0xe4, 0xb8, 0xf4, 0xdf, 0x07, + 0x3c, 0x10, 0x13, 0x1e, 0xc9, 0x9a, 0x26, 0xfc, 0xbd, 0xea, 0x31, 0x3b, + 0x33, 0xf4, 0xd6, 0xed, 0x15, 0xe2, 0x28, 0x0d, 0xc4, 0xef, 0x45, 0xeb, + 0x32, 0xc2, 0xfe, 0xf6, 0x25, 0x1c, 0xf4, 0x18, 0x0c, 0x0d, 0x06, 0xfa, + 0xe6, 0xe7, 0xdc, 0xc9, 0xdc, 0x09, 0xf4, 0x01, 0x1b, 0xd8, 0xfe, 0xdb, + 0xec, 0xdf, 0xd7, 0xe6, 0xf6, 0x08, 0x4a, 0xb9, 0xd3, 0xf7, 0xfb, 0xf2, + 0xf6, 0xfd, 0x01, 0x05, 0xcb, 0x1a, 0x06, 0xdc, 0x31, 0x1f, 0xfa, 0xb9, + 0xfe, 0x3f, 0x42, 0xca, 0xf0, 0x44, 0xf2, 0xf8, 0xe7, 0x49, 0xff, 0xd3, + 0x36, 0x13, 0xf6, 0x62, 0x29, 0x0c, 0x2c, 0xf7, 0xd2, 0x00, 0x0e, 0x48, + 0xda, 0xf4, 0x5d, 0xfb, 0xfd, 0x23, 0x31, 0x1c, 0xca, 0x24, 0x25, 0xc3, + 0xfa, 0xf6, 0x4d, 0xfe, 0x15, 0x3b, 0xf2, 0xc8, 0xaa, 0x0a, 0x19, 0xfa, + 0x94, 0xef, 0x38, 0x27, 0xd0, 0x02, 0x27, 0xb5, 0xac, 0xe9, 0xba, 0x1c, + 0x41, 0xf2, 0xa7, 0xef, 0xcb, 0x11, 0xb4, 0xe0, 0x08, 0xe5, 0x00, 0x27, + 0xf0, 0xf2, 0xd9, 0xf8, 0xd3, 0xdb, 0x08, 0x34, 0xf5, 0x23, 0xe9, 0xc4, + 0x0e, 0x3f, 0xf4, 0xe5, 0x04, 0x31, 0x3d, 0x1d, 0x33, 0x23, 0x0b, 0x17, + 0xfa, 0x09, 0xfd, 0x38, 0xe1, 0x05, 0x3b, 0xef, 0xf5, 0x25, 0x47, 0x01, + 0xfe, 0x2a, 0x1f, 0xd2, 0xc8, 0x3d, 0x12, 0xbb, 0x0b, 0x0c, 0xcd, 0xdf, + 0x4f, 0x2e, 0xbc, 0xfe, 0xbf, 0x1d, 0x06, 0xdf, 0xea, 0x05, 0xff, 0x05, + 0xdc, 0x37, 0x0b, 0x97, 0xf5, 0x1e, 0x2c, 0xdb, 0xe7, 0x05, 0xc8, 0x14, + 0xf2, 0xe7, 0x24, 0xe2, 0x04, 0x30, 0xc6, 0x16, 0x44, 0xa3, 0x0a, 0xf5, + 0xd8, 0xde, 0x0d, 0xd9, 0xe8, 0x37, 0x2a, 0xd3, 0x07, 0x1b, 0xb7, 0xf5, + 0x04, 0x00, 0xb9, 0xce, 0xf5, 0x33, 0x41, 0x9f, 0x00, 0x43, 0xeb, 0xe3, + 0xee, 0xfc, 0x12, 0xed, 0x0c, 0xc6, 0x02, 0x5b, 0xee, 0xda, 0x1b, 0x1f, + 0xe9, 0x04, 0xf0, 0x0c, 0xfd, 0x0c, 0xff, 0x0c, 0x3d, 0x00, 0x0d, 0xfc, + 0x2a, 0x25, 0xdf, 0x06, 0xfb, 0x39, 0x3f, 0x09, 0x08, 0xee, 0x0f, 0x1c, + 0x0e, 0x2c, 0x1d, 0x01, 0xfd, 0x23, 0xba, 0x04, 0x63, 0xe0, 0xd8, 0x07, + 0x01, 0x04, 0x33, 0xde, 0xf4, 0xf6, 0xeb, 0xf0, 0xda, 0x09, 0x10, 0x2d, + 0x03, 0x0a, 0xaf, 0xf8, 0xff, 0xf1, 0xfe, 0xe6, 0xdf, 0xf0, 0xd4, 0xf5, + 0x1f, 0xd8, 0xe1, 0xf3, 0xe9, 0xd5, 0xca, 0x07, 0xf9, 0xdf, 0xf6, 0xc0, + 0xea, 0x07, 0xf8, 0xdf, 0xe4, 0x26, 0xfa, 0xf4, 0x25, 0x06, 0xea, 0xff, + 0x39, 0x02, 0xbe, 0x11, 0x0f, 0x1f, 0xe2, 0x11, 0xf5, 0x21, 0xfb, 0x01, + 0x3f, 0x13, 0x28, 0x16, 0x03, 0xd4, 0x11, 0x0a, 0xea, 0x05, 0x2e, 0x32, + 0xe0, 0xb2, 0x37, 0xe8, 0xb9, 0x0a, 0x11, 0xed, 0xf0, 0x10, 0x11, 0xdd, + 0xee, 0xff, 0x1c, 0xd8, 0x02, 0xf5, 0xe7, 0xf9, 0xbc, 0x22, 0x3f, 0xf3, + 0xcc, 0xfe, 0x16, 0x09, 0xe6, 0xed, 0x06, 0x04, 0x2d, 0x32, 0xf9, 0xfe, + 0x0c, 0x48, 0x20, 0xf6, 0x09, 0xee, 0x0c, 0x3e, 0x1e, 0xe4, 0xda, 0xfc, + 0x12, 0xfd, 0x08, 0x3a, 0x29, 0x11, 0xe3, 0xed, 0xe6, 0x34, 0x0b, 0xe1, + 0xfc, 0x1d, 0xe3, 0xf8, 0x21, 0xdf, 0xea, 0xd1, 0x1a, 0x1c, 0xe2, 0x1c, + 0x08, 0x11, 0xdd, 0x07, 0xf0, 0xd3, 0xdb, 0xf5, 0x10, 0xf9, 0xfc, 0xdb, + 0x06, 0x14, 0xd9, 0x02, 0x09, 0xf6, 0xfc, 0x09, 0xd0, 0xb7, 0x0b, 0xfc, + 0x11, 0xc9, 0xd9, 0x09, 0x3f, 0x17, 0x8d, 0xe1, 0x0b, 0x01, 0x00, 0x0c, + 0xd0, 0xfc, 0x21, 0xcc, 0x19, 0xcf, 0xfc, 0x2d, 0x04, 0xd0, 0xe6, 0xef, + 0x33, 0x3e, 0xe9, 0x00, 0x27, 0xd9, 0x3a, 0xed, 0xf9, 0x36, 0x15, 0xf9, + 0x31, 0x03, 0x0a, 0x0a, 0xf9, 0x0d, 0x28, 0xf7, 0xe5, 0x45, 0x24, 0xbe, + 0x0a, 0x47, 0xed, 0xe2, 0x55, 0x10, 0x12, 0xf7, 0x06, 0xf7, 0xe7, 0xf1, + 0x1b, 0xeb, 0xc0, 0x25, 0x16, 0xd4, 0xe1, 0x07, 0x0c, 0xf1, 0xef, 0xd4, + 0x08, 0x1b, 0x0f, 0xdd, 0xf9, 0xd8, 0xed, 0x19, 0x01, 0xb4, 0x0d, 0x23, + 0x11, 0xd5, 0x1f, 0x1a, 0xc6, 0xf2, 0x09, 0xf3, 0x01, 0x14, 0xf7, 0x02, + 0xf7, 0x32, 0x16, 0xf5, 0xea, 0xff, 0xff, 0x4b, 0x14, 0xde, 0xf1, 0x2e, + 0x3e, 0x0a, 0xe0, 0x00, 0xfc, 0xea, 0x40, 0x05, 0xed, 0xd9, 0x07, 0xd2, + 0xe6, 0xcb, 0x03, 0xf2, 0x08, 0x01, 0xe1, 0x34, 0xd8, 0x0b, 0xcf, 0xd2, + 0x06, 0x02, 0xcc, 0x09, 0xf8, 0xf2, 0x08, 0xe4, 0x0a, 0x01, 0xdd, 0xef, + 0x11, 0xe2, 0xe3, 0x2a, 0xe9, 0x22, 0x28, 0xf7, 0xec, 0xd0, 0xf6, 0xf7, + 0x07, 0xfa, 0xf5, 0xe7, 0x12, 0x35, 0xfa, 0xe0, 0xfd, 0x01, 0x2a, 0x0c, + 0x09, 0x1c, 0x03, 0x00, 0x1b, 0xfb, 0xf0, 0x03, 0x26, 0xfe, 0xdc, 0xef, + 0x2b, 0x26, 0x2f, 0xfa, 0xfa, 0x48, 0xf3, 0x01, 0x1f, 0x12, 0x13, 0x2f, + 0xe6, 0x13, 0x3c, 0x17, 0x0a, 0x06, 0xf2, 0x37, 0xff, 0xd8, 0x36, 0xf2, + 0xe6, 0xdf, 0xda, 0x0e, 0xe4, 0xed, 0xf4, 0x08, 0xef, 0xec, 0xf4, 0xe4, + 0x0f, 0xd0, 0xdb, 0x04, 0xd7, 0xf8, 0xfe, 0xf1, 0xf6, 0x0f, 0xdf, 0xd2, + 0xfe, 0xf3, 0xd5, 0xea, 0x07, 0xe8, 0xd1, 0x26, 0x07, 0xdb, 0xef, 0x06, + 0x26, 0x14, 0xbf, 0x11, 0x29, 0xcd, 0xdb, 0xe6, 0xe7, 0xf9, 0x01, 0x31, + 0x03, 0xc6, 0xec, 0x06, 0xf8, 0xea, 0xea, 0x1d, 0xfa, 0xd6, 0x08, 0x23, + 0x1c, 0x0a, 0xba, 0xdf, 0x09, 0xf8, 0xea, 0xf8, 0x0b, 0x19, 0xfa, 0x0c, + 0xea, 0xe9, 0x0a, 0x64, 0xfc, 0xe2, 0x2c, 0x22, 0x10, 0x10, 0xf7, 0x35, + 0x2d, 0xdd, 0x2b, 0x38, 0xf9, 0x22, 0x31, 0x20, 0x10, 0x2c, 0x1a, 0x19, + 0x0e, 0x01, 0x07, 0x16, 0xfa, 0x0c, 0x24, 0x05, 0xd3, 0x1c, 0xf7, 0xf9, + 0x0a, 0xf6, 0x24, 0xfb, 0xf0, 0x08, 0xff, 0xd6, 0xfc, 0x1a, 0xeb, 0xf0, + 0xde, 0xec, 0x00, 0x11, 0xcf, 0xea, 0xea, 0x00, 0x09, 0xd4, 0x08, 0xfb, + 0xc5, 0xe1, 0xfc, 0x16, 0xf0, 0x29, 0xf9, 0xec, 0xe9, 0xce, 0x0a, 0x1b, + 0xd8, 0xf3, 0x10, 0xdb, 0xfa, 0xe7, 0x04, 0xfc, 0xe6, 0xe3, 0xf6, 0xf0, + 0xf0, 0x02, 0xfc, 0xfc, 0x01, 0xec, 0x02, 0x01, 0xdd, 0xf3, 0x05, 0x17, + 0xe8, 0xda, 0x11, 0x04, 0x01, 0x08, 0x04, 0x04, 0xdc, 0x0f, 0x21, 0x0d, + 0xd2, 0x0d, 0xff, 0x1b, 0x45, 0xf0, 0xe9, 0xff, 0x35, 0x3c, 0xf2, 0xec, + 0x0c, 0xf6, 0xf2, 0xf6, 0xf3, 0xec, 0x09, 0x0b, 0xf9, 0x18, 0xeb, 0xf6, + 0x0b, 0x21, 0x06, 0x15, 0xe8, 0x02, 0x18, 0x04, 0xee, 0x1b, 0x1e, 0x0a, + 0xfe, 0x00, 0x14, 0x1b, 0x2a, 0xf5, 0xf8, 0xfc, 0x09, 0x12, 0x26, 0x1f, + 0x01, 0xf2, 0x12, 0xed, 0x17, 0x05, 0xfa, 0xff, 0x09, 0x00, 0xf0, 0xfa, + 0x0e, 0xf1, 0xdc, 0xf7, 0x13, 0xfc, 0xed, 0xc8, 0xf0, 0x05, 0xff, 0x05, + 0xef, 0xcf, 0xef, 0xf1, 0xff, 0x01, 0xd2, 0xfc, 0x03, 0xcc, 0xe3, 0x09, + 0xff, 0x01, 0xe8, 0xd7, 0xfc, 0x0f, 0x11, 0xe5, 0xd7, 0xf5, 0xda, 0xed, + 0xdf, 0x07, 0x05, 0xe4, 0xf5, 0x03, 0x00, 0xd6, 0x03, 0x24, 0xfe, 0xfa, + 0xf9, 0x03, 0x08, 0x07, 0x07, 0x21, 0x0d, 0x10, 0xec, 0x22, 0x19, 0xd7, + 0x17, 0x38, 0xf9, 0xf3, 0x0b, 0xe3, 0x1d, 0x08, 0x28, 0x17, 0x1c, 0xed, + 0xeb, 0x0d, 0xf2, 0xf3, 0x0f, 0x1c, 0x32, 0x20, 0x1f, 0xe5, 0xe9, 0x06, + 0x22, 0x29, 0xf7, 0x00, 0x26, 0xec, 0x03, 0x17, 0x10, 0xfb, 0x10, 0x06, + 0x2c, 0xfc, 0xfa, 0xfc, 0x1c, 0xee, 0xbf, 0x04, 0x01, 0xe1, 0x12, 0xf1, + 0xf6, 0x01, 0xed, 0xfb, 0xf2, 0xfe, 0xea, 0xf4, 0x03, 0xf0, 0xd5, 0xfc, + 0x1e, 0xee, 0x03, 0xf0, 0x04, 0xff, 0xff, 0xe9, 0xe2, 0xe1, 0x06, 0x18, + 0xd9, 0xef, 0xea, 0x00, 0xe6, 0x12, 0x07, 0x04, 0x07, 0xff, 0xe9, 0xed, + 0xf4, 0xf0, 0xf3, 0xfe, 0x18, 0xf3, 0x01, 0x05, 0xff, 0xff, 0xfc, 0xed, + 0x04, 0xf0, 0x0f, 0x03, 0xe8, 0x06, 0x1f, 0xf1, 0xf6, 0xe7, 0x0e, 0x00, + 0x01, 0x01, 0xec, 0x09, 0xfa, 0xf5, 0x29, 0x05, 0xee, 0xf6, 0x25, 0xfe, + 0xe8, 0x18, 0x17, 0x00, 0x0f, 0xe2, 0x0a, 0x13, 0x0d, 0x0a, 0xe6, 0x2b, + 0x22, 0xfd, 0xd9, 0x18, 0x23, 0xfa, 0x00, 0x01, 0x04, 0x13, 0x1f, 0x06, + 0x07, 0xfa, 0x02, 0x2e, 0xf8, 0xe8, 0x04, 0x05, 0x25, 0xf4, 0x06, 0x29, + 0x0c, 0xe5, 0xff, 0x24, 0x06, 0xe6, 0xf4, 0x08, 0xf3, 0x12, 0x14, 0xfa, + 0xed, 0x04, 0xec, 0x02, 0xe5, 0x00, 0x18, 0xf7, 0xd3, 0xc2, 0xfe, 0x08, + 0xef, 0xfe, 0xf9, 0xbf, 0xc3, 0xf7, 0x03, 0xf8, 0xdb, 0x10, 0xf6, 0xea, + 0xd7, 0xf5, 0x18, 0x05, 0xdc, 0xdd, 0x1c, 0xfe, 0x00, 0x23, 0x1f, 0xec, + 0xe7, 0x28, 0x23, 0xf3, 0xfc, 0xf5, 0x01, 0x14, 0xf0, 0xf6, 0x01, 0x00, + 0xf8, 0xfc, 0xf1, 0x03, 0xe1, 0x06, 0x14, 0x0d, 0x0d, 0xcc, 0x21, 0xe0, + 0xf1, 0x47, 0xff, 0xfd, 0xff, 0xfc, 0x1c, 0x13, 0x01, 0x13, 0xec, 0xf6, + 0x03, 0x04, 0x07, 0x04, 0x2d, 0x07, 0xde, 0x01, 0x11, 0x10, 0x05, 0xeb, + 0xed, 0xed, 0x15, 0xed, 0xd9, 0xff, 0x12, 0x06, 0xdf, 0x07, 0x10, 0xfe, + 0x0c, 0xf1, 0x21, 0x12, 0x1a, 0x19, 0xe6, 0xe9, 0x15, 0x1c, 0x07, 0xee, + 0x1e, 0x0b, 0xf1, 0x07, 0x07, 0xfd, 0x00, 0x01, 0x00, 0x01, 0x1b, 0x19, + 0xf5, 0xde, 0xf6, 0x03, 0xf8, 0xf9, 0x01, 0xdd, 0x07, 0x23, 0xf4, 0xdb, + 0xe4, 0x05, 0x00, 0xec, 0xf0, 0x04, 0xf8, 0xe7, 0x06, 0x0c, 0xf1, 0xdc, + 0xd7, 0xea, 0x16, 0xfe, 0xfb, 0x01, 0x08, 0x0e, 0x10, 0x0d, 0xde, 0x01, + 0xff, 0xf8, 0xf6, 0xf9, 0xfc, 0xfc, 0xf1, 0xec, 0x20, 0x07, 0xf5, 0xf6, + 0xf9, 0x12, 0xf8, 0xe2, 0x0b, 0x07, 0x16, 0xcd, 0xfc, 0x01, 0x09, 0xee, + 0x03, 0x05, 0xf7, 0xfc, 0xff, 0x27, 0x09, 0x06, 0x00, 0xff, 0xf0, 0x22, + 0x07, 0x0a, 0x0a, 0xfe, 0x17, 0x10, 0xf4, 0x00, 0x01, 0x26, 0x2c, 0xf1, + 0xdb, 0x1b, 0x0d, 0xed, 0x13, 0xe9, 0x02, 0x00, 0xff, 0x1b, 0x04, 0xeb, + 0xf0, 0x02, 0x09, 0x07, 0xf2, 0xf9, 0xfc, 0xed, 0x05, 0x1f, 0xff, 0xe4, + 0x2c, 0x05, 0xf9, 0xf1, 0xfe, 0x24, 0xe5, 0xe1, 0x0f, 0x00, 0xfb, 0xff, + 0xf0, 0x0f, 0xff, 0xf4, 0x01, 0xf4, 0x03, 0xf7, 0x0a, 0xeb, 0xff, 0x02, + 0xdd, 0x05, 0xed, 0x02, 0x1f, 0xee, 0xe7, 0xed, 0x20, 0xfb, 0xf0, 0x04, + 0x0c, 0xee, 0xf6, 0x07, 0x0b, 0xf5, 0xf9, 0x12, 0xfe, 0xff, 0x01, 0xec, + 0xff, 0x02, 0xf7, 0xf2, 0xdd, 0x02, 0x02, 0xf7, 0xfc, 0xf1, 0xf6, 0xfd, + 0xea, 0x0d, 0x00, 0xe5, 0xf1, 0xf7, 0xeb, 0x0d, 0x0a, 0xee, 0xf0, 0x09, + 0xfe, 0xf4, 0xfd, 0x15, 0x17, 0xfa, 0xe5, 0x06, 0xf7, 0xf2, 0x1b, 0x01, + 0x2d, 0xf7, 0xf0, 0x0f, 0xff, 0xe1, 0x01, 0x20, 0x0a, 0xf4, 0x06, 0x0f, + 0x1c, 0xee, 0x0b, 0x07, 0x12, 0x22, 0xf7, 0xff, 0x14, 0xfe, 0x22, 0x11, + 0x13, 0x16, 0x07, 0x0d, 0x02, 0xff, 0x2e, 0x00, 0x19, 0x07, 0x07, 0x19, + 0x07, 0xf5, 0x01, 0x01, 0x22, 0x02, 0xeb, 0xed, 0xea, 0x21, 0x00, 0xd9, + 0x06, 0xf0, 0x02, 0xe5, 0xd1, 0xdc, 0xde, 0xf4, 0xfb, 0x00, 0x01, 0xff, + 0xe9, 0xed, 0xf8, 0xeb, 0x03, 0x00, 0xff, 0xf0, 0xfa, 0xfc, 0xf1, 0xf6, + 0x01, 0xf4, 0xfd, 0xf9, 0xe3, 0xea, 0xf5, 0x08, 0xf7, 0xdb, 0xe8, 0x05, + 0x00, 0x05, 0xf7, 0x03, 0x10, 0xfd, 0x01, 0x1b, 0xe3, 0xed, 0x27, 0x06, + 0x03, 0xf3, 0xfd, 0x01, 0x0c, 0x1c, 0xe6, 0xfb, 0x0e, 0xfe, 0x01, 0x01, + 0x10, 0xf8, 0x02, 0x01, 0x04, 0xfa, 0x11, 0xfd, 0x00, 0x10, 0xfc, 0xff, + 0x09, 0xee, 0xf3, 0xfe, 0x02, 0x00, 0x01, 0x04, 0x0b, 0xf5, 0xfc, 0xf1, + 0x04, 0x1f, 0x07, 0xf9, 0xfc, 0xfc, 0x11, 0x02, 0xef, 0xfe, 0x15, 0xf7, + 0x15, 0xfb, 0xed, 0x18, 0x0d, 0x10, 0x01, 0x1a, 0x0b, 0xf4, 0xf9, 0x0e, + 0x1c, 0x0e, 0x17, 0x0f, 0xf0, 0x07, 0x0b, 0xff, 0x04, 0xfe, 0xe5, 0xea, + 0xed, 0xe6, 0xf2, 0xde, 0x09, 0x17, 0xeb, 0xe8, 0xed, 0xf4, 0xe1, 0xef, + 0xf8, 0x0f, 0xf5, 0xe7, 0x04, 0xe9, 0xe6, 0xe0, 0x07, 0x1f, 0x16, 0xfb, + 0xf0, 0xf3, 0xfa, 0x00, 0x05, 0x25, 0x01, 0x00, 0xf4, 0xfd, 0x02, 0x1f, + 0x03, 0xeb, 0x09, 0x04, 0x01, 0x04, 0xfe, 0xf4, 0xf6, 0xf3, 0xfe, 0x01, + 0x00, 0x23, 0xf9, 0x00, 0xf8, 0xf6, 0x12, 0xf8, 0xea, 0xf4, 0x0f, 0x0d, + 0xf8, 0xe6, 0xf5, 0x03, 0x05, 0x04, 0x07, 0x04, 0x0b, 0x07, 0xff, 0xf8, + 0x00, 0x05, 0x01, 0xf0, 0xf3, 0x02, 0x10, 0x0a, 0xf5, 0xee, 0xf3, 0x0c, + 0xfd, 0xf4, 0x07, 0x04, 0x0b, 0x19, 0xee, 0x02, 0x17, 0xf7, 0x09, 0x0a, + 0x2b, 0x25, 0xf6, 0xf8, 0xf9, 0x06, 0x04, 0x01, 0xff, 0xf8, 0x06, 0x0b, + 0xd7, 0xfb, 0x02, 0xf4, 0xe4, 0x16, 0x2b, 0xdc, 0xe7, 0x0b, 0x01, 0xff, + 0xfc, 0xf1, 0x1b, 0x16, 0xf6, 0xfc, 0x06, 0x0f, 0x06, 0xeb, 0xf7, 0x0f, + 0xfd, 0xfc, 0x01, 0x26, 0x18, 0xf5, 0x02, 0x01, 0x08, 0xeb, 0xf3, 0x03, + 0xf8, 0xf9, 0xdb, 0xda, 0x0e, 0x0b, 0xea, 0xf7, 0x02, 0xf8, 0xfc, 0xde, + 0xe4, 0xf6, 0xf3, 0x03, 0xff, 0x00, 0x01, 0xfb, 0xf1, 0xfe, 0x09, 0x12, + 0x0f, 0xfd, 0x00, 0x00, 0x00, 0x12, 0xf5, 0x01, 0x21, 0x14, 0xf7, 0xfd, + 0x00, 0x07, 0xff, 0xf5, 0xfa, 0xfd, 0x0f, 0x1b, 0xfa, 0xee, 0xf1, 0xea, + 0xfa, 0x02, 0xf9, 0xf7, 0xec, 0x04, 0xfd, 0xf6, 0xfe, 0x00, 0x07, 0xec, + 0xee, 0xf1, 0x03, 0x16, 0xf4, 0xe1, 0x0e, 0x11, 0xfd, 0x00, 0x00, 0x00, + 0x07, 0x06, 0x13, 0x00, 0xfc, 0x00, 0x00, 0xeb, 0x08, 0x18, 0x0d, 0xf9, + 0x08, 0x06, 0xff, 0xf1, 0xfb, 0xfd, 0x00, 0x1c, 0xfe, 0x00, 0x07, 0x0d, + 0x09, 0xdf, 0xf8, 0x0e, 0x06, 0xf7, 0xed, 0x0b, 0x1a, 0x02, 0x13, 0x07, + 0xfe, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0x11, 0x0e, 0xfd, 0xeb, 0xf2, + 0xfc, 0x01, 0x07, 0xff, 0x03, 0xf8, 0xf4, 0x0a, 0x12, 0x1d, 0xfa, 0xdf, + 0xeb, 0x05, 0x03, 0x00, 0x00, 0xef, 0xea, 0x05, 0xfd, 0x04, 0x06, 0xf1, + 0x02, 0xf6, 0x02, 0xf6, 0xf5, 0xeb, 0xf0, 0x04, 0xf3, 0xff, 0x0a, 0xf1, + 0x02, 0x00, 0x00, 0x03, 0x0f, 0xfd, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x0d, + 0xfd, 0xea, 0xf0, 0xf3, 0xff, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x0a, 0xfe, + 0xf6, 0x02, 0x0c, 0xfe, 0x03, 0xf9, 0x01, 0x03, 0xfc, 0x00, 0x0c, 0x08, + 0x02, 0x09, 0x0a, 0xfe, 0xf6, 0xfe, 0x00, 0x0a, 0x05, 0xff, 0x00, 0x00, + 0x00, 0xf1, 0xdf, 0x03, 0x07, 0x05, 0x03, 0xfc, 0xfb, 0x01, 0x03, 0x00, + 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f, 0x04, 0xff, 0x06, 0xff, 0xfd, 0xf5, + 0x11, 0x04, 0xf9, 0x07, 0xff, 0x00, 0xfd, 0xec, 0x10, 0x0a, 0xef, 0xf2, + 0xec, 0xdb, 0xf7, 0xff, 0x00, 0x06, 0x03, 0x05, 0x03, 0xf9, 0xf6, 0x0b, + 0x0d, 0xfd, 0x00, 0x0b, 0x1d, 0x0c, 0x03, 0xf4, 0xff, 0x06, 0x07, 0xff, + 0x00, 0x14, 0x10, 0x05, 0x07, 0x12, 0x0d, 0xf4, 0xf9, 0xff, 0xf8, 0x01, + 0x00, 0x06, 0xf6, 0xf4, 0x00, 0x09, 0xf8, 0x03, 0x00, 0xf0, 0x00, 0xec, + 0xf1, 0x03, 0x08, 0xf6, 0xf4, 0xf7, 0x02, 0x05, 0xfd, 0x00, 0xf3, 0xf3, + 0xf8, 0xff, 0xee, 0xf3, 0xfb, 0x06, 0x04, 0x04, 0xfa, 0x01, 0x00, 0xfe, + 0xfe, 0x00, 0xee, 0xf9, 0x04, 0x00, 0xfb, 0xfa, 0x01, 0x12, 0x04, 0xff, + 0xfb, 0xf2, 0x03, 0x0c, 0xfe, 0xf9, 0xee, 0xff, 0x03, 0x00, 0x05, 0xfd, + 0x03, 0x09, 0x14, 0x08, 0xf9, 0x01, 0x0a, 0xfe, 0x05, 0x02, 0x00, 0xfb, + 0x01, 0xfb, 0x12, 0x0c, 0xfd, 0x00, 0x05, 0xff, 0xfb, 0x01, 0x0a, 0x06, + 0xfc, 0xfc, 0x01, 0xfb, 0xfc, 0x10, 0x0d, 0xfd, 0xf4, 0xfd, 0x01, 0xf6, + 0xfa, 0xff, 0x05, 0xff, 0xfe, 0x05, 0xff, 0xee, 0xfc, 0x01, 0x05, 0xff, + 0xfe, 0x00, 0x02, 0xfd, 0xfc, 0x06, 0x0c, 0x06, 0x01, 0xf2, 0xf5, 0x02, + 0x07, 0x0c, 0xfe, 0xfb, 0x0e, 0x06, 0xff, 0xfa, 0x01, 0x02, 0xf2, 0xf7, + 0xf5, 0xf4, 0xfa, 0x01, 0xfe, 0xf8, 0xf9, 0xff, 0x05, 0xf9, 0x0a, 0x0a, + 0xf9, 0xf0, 0x01, 0xfc, 0xf6, 0xfd, 0x04, 0x03, 0x02, 0x03, 0x02, 0x00, + 0x03, 0x02, 0x00, 0xfa, 0xf5, 0xf8, 0x0c, 0x0d, 0xfd, 0xfa, 0xf8, 0x02, + 0x03, 0x0e, 0x06, 0xff, 0x00, 0x00, 0xf3, 0x00, 0x06, 0x03, 0xfc, 0xfb, + 0x05, 0x00, 0xfa, 0xfa, 0xff, 0x08, 0xff, 0x02, 0xfd, 0xfd, 0x08, 0x01, + 0xfa, 0x05, 0x06, 0xf9, 0xfd, 0x07, 0xfd, 0xf7, 0xfe, 0xfe, 0x06, 0x03, + 0xf9, 0xfd, 0x00, 0x02, 0x02, 0x00, 0x02, 0x09, 0x01, 0x05, 0xff, 0x03, + 0x03, 0x08, 0x0d, 0x02, 0xfe, 0x00, 0x01, 0x07, 0x06, 0xf7, 0x01, 0x0b, + 0xfe, 0x01, 0x07, 0x00, 0xff, 0xf8, 0xf9, 0xfe, 0xfc, 0xf6, 0xfd, 0x08, + 0x04, 0xff, 0xfb, 0xfd, 0xfc, 0x01, 0x03, 0xfb, 0xfa, 0x01, 0x00, 0x00, + 0xfd, 0xfc, 0xfd, 0xf8, 0xfe, 0x00, 0xff, 0xf8, 0xf9, 0x01, 0xfd, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, 0x23, 0xd4, 0xaf, 0xdd, 0x2e, 0x53, + 0x16, 0xd0, 0xd6, 0x30, 0xe5, 0xb1, 0xa0, 0xd4, 0x07, 0xc9, 0xf0, 0xb8, + 0xa4, 0xda, 0x0c, 0xcf, 0xbc, 0x9b, 0x99, 0xee, 0xc0, 0xb5, 0xd2, 0x0c, + 0xc7, 0xf7, 0xd6, 0xee, 0xcd, 0x25, 0x33, 0xda, 0xe7, 0xf5, 0x4a, 0x19, + 0xcf, 0x18, 0x25, 0x28, 0x4b, 0xff, 0x16, 0x37, 0xfb, 0xd2, 0x14, 0x4b, + 0x4a, 0x16, 0x5e, 0x7a, 0x7d, 0x39, 0x37, 0x1b, 0x51, 0x2a, 0x14, 0x53, + 0x3d, 0x18, 0x4b, 0x5c, 0x5e, 0x56, 0x4b, 0x37, 0x40, 0x4f, 0x48, 0x37, + 0x3d, 0x37, 0x37, 0x39, 0x28, 0x16, 0x28, 0x23, 0x07, 0x10, 0xf9, 0x18, + 0xf7, 0x28, 0x0b, 0xea, 0xe7, 0x07, 0xe3, 0xd6, 0xc5, 0xc2, 0xd4, 0xc2, + 0xc9, 0xe1, 0xf5, 0xd0, 0xd8, 0xc7, 0xb8, 0xbc, 0xd2, 0xc5, 0xc5, 0xad, + 0xcd, 0xba, 0xc5, 0xbc, 0xcb, 0xda, 0xd2, 0xcf, 0xd0, 0xd2, 0xd2, 0xd8, + 0xee, 0xec, 0xdf, 0xe5, 0xf0, 0xf9, 0xf5, 0xfb, 0x03, 0x0c, 0xfb, 0x1b, + 0x16, 0x05, 0x37, 0x2e, 0x19, 0x14, 0x26, 0x2a, 0x4f, 0x67, 0x16, 0x28, + 0x58, 0x6d, 0x4d, 0x31, 0xf2, 0x3b, 0x40, 0x07, 0x4d, 0x2a, 0x1d, 0x18, + 0x2c, 0x55, 0x58, 0x39, 0x30, 0x31, 0x46, 0x3d, 0x31, 0x30, 0x2c, 0x2a, + 0x2e, 0x19, 0x10, 0x2e, 0x25, 0x1d, 0x12, 0x07, 0x07, 0x1f, 0x19, 0x0e, + 0xff, 0xdf, 0xe8, 0x14, 0xff, 0xe7, 0xd0, 0xf2, 0xdd, 0xd2, 0xe8, 0xf5, + 0xee, 0xc0, 0xe1, 0xc7, 0xb8, 0xf9, 0xbe, 0xa4, 0xd2, 0xc9, 0xc2, 0xbc, + 0xc5, 0xcd, 0xd0, 0xb8, 0xc5, 0xcd, 0xd6, 0xcf, 0xc9, 0xd4, 0xe3, 0xd4, + 0xe7, 0xea, 0xe1, 0xea, 0xe8, 0xe1, 0xf2, 0x01, 0xf4, 0xf5, 0xea, 0x03, + 0x00, 0x03, 0x07, 0x10, 0xff, 0x10, 0x07, 0x0e, 0x10, 0x25, 0x33, 0x23, + 0x23, 0x01, 0x23, 0x2c, 0x2a, 0x23, 0x3b, 0x37, 0x1f, 0x3d, 0x3b, 0x1d, + 0x21, 0x3d, 0x28, 0x23, 0x30, 0x23, 0x28, 0x23, 0x19, 0x1d, 0x1d, 0x19, + 0x1d, 0x1b, 0x14, 0x0e, 0x0b, 0x0c, 0x10, 0x0e, 0x01, 0xf2, 0x0b, 0x05, + 0x12, 0x03, 0xfd, 0xdf, 0xf2, 0xf0, 0xbc, 0xe1, 0xff, 0xf9, 0xc0, 0xc3, + 0xd2, 0xf9, 0xe5, 0xd4, 0xbc, 0xcf, 0xd0, 0xcf, 0xcb, 0xdb, 0xc5, 0xc2, + 0xc9, 0xf2, 0xe8, 0xba, 0xc9, 0xd2, 0xd0, 0xcf, 0xd8, 0xdd, 0xdb, 0xdd, + 0xd4, 0xe8, 0xe1, 0xe3, 0xee, 0xee, 0xf4, 0xe1, 0xe7, 0xec, 0x00, 0xf9, + 0xea, 0xf9, 0x0e, 0xfd, 0x01, 0x10, 0xf2, 0xf9, 0x10, 0x01, 0x09, 0x18, + 0x19, 0x05, 0x2c, 0x23, 0x1b, 0x16, 0x0c, 0x25, 0x28, 0x1d, 0x31, 0x33, + 0x42, 0x21, 0x31, 0x39, 0x33, 0x30, 0x1d, 0x2c, 0x1b, 0x1d, 0x23, 0x2a, + 0x25, 0x1d, 0x1d, 0x18, 0x18, 0x18, 0x18, 0x10, 0x0e, 0x0b, 0x07, 0x09, + 0x05, 0x0b, 0x10, 0x07, 0xfd, 0xff, 0xf5, 0xf7, 0xf0, 0xf5, 0x07, 0x00, + 0xf5, 0xf5, 0xee, 0xda, 0xc9, 0xea, 0xdd, 0x07, 0xda, 0xba, 0xbc, 0xdb, + 0xcf, 0xd0, 0xd8, 0xc9, 0xc7, 0xd4, 0xcf, 0xd4, 0xc7, 0xc5, 0xd0, 0xd2, + 0xd6, 0xd4, 0xd2, 0xe5, 0xe1, 0xdb, 0xe5, 0xe7, 0xe1, 0xe7, 0xea, 0xee, + 0xee, 0xec, 0xf5, 0x00, 0xee, 0xf2, 0x05, 0xf5, 0xf4, 0x09, 0x19, 0x03, + 0x0e, 0x03, 0x16, 0x12, 0x0c, 0x0c, 0x19, 0x30, 0x1f, 0x16, 0x30, 0x23, + 0x21, 0x16, 0x10, 0x35, 0x2c, 0x1b, 0x19, 0x1d, 0x1f, 0x2c, 0x1d, 0x1d, + 0x0b, 0x23, 0x2c, 0x19, 0x1b, 0x18, 0x10, 0x1b, 0x0e, 0x0c, 0x10, 0x0c, + 0x10, 0x0e, 0x0e, 0x14, 0x12, 0x01, 0x00, 0x05, 0xfd, 0xf9, 0xff, 0xfb, + 0x00, 0xf5, 0xe7, 0xea, 0xf0, 0xf7, 0xe8, 0xe3, 0xda, 0xf0, 0xdb, 0xe1, + 0xdb, 0xc2, 0xcf, 0xdb, 0xe1, 0xd8, 0xd0, 0xd8, 0xdb, 0xcf, 0xd8, 0xe5, + 0xcd, 0xd8, 0xd6, 0xd8, 0xe3, 0xdd, 0xda, 0xdb, 0xe7, 0xd8, 0xdd, 0xe3, + 0xec, 0xf4, 0xf0, 0xf0, 0xf2, 0xec, 0xf0, 0xfb, 0xfd, 0xff, 0xf5, 0xfd, + 0x18, 0x09, 0xf4, 0x05, 0x10, 0x0b, 0x12, 0x10, 0x1f, 0x0e, 0x16, 0x19, + 0x0e, 0x14, 0x09, 0x14, 0x10, 0x0b, 0x2e, 0x1d, 0x1d, 0x28, 0x21, 0x26, + 0x28, 0x1f, 0x2c, 0x2c, 0x19, 0x16, 0x19, 0x1f, 0x26, 0x1b, 0x0c, 0x1d, + 0x21, 0x21, 0x1b, 0x12, 0x14, 0x10, 0x0c, 0x09, 0x09, 0x07, 0x03, 0x0b, + 0x09, 0x03, 0x03, 0xf9, 0xf2, 0xfb, 0x03, 0xf4, 0xec, 0xff, 0xff, 0xf2, + 0xec, 0xf0, 0xf2, 0xf5, 0xf7, 0xe5, 0xea, 0xe3, 0xe3, 0xe5, 0xe3, 0xd6, + 0xe3, 0xe8, 0xdd, 0xe3, 0xe5, 0xdf, 0xda, 0xd8, 0xe5, 0xea, 0xdf, 0xdd, + 0xdf, 0xe1, 0xe8, 0xe7, 0xe7, 0xee, 0xf0, 0xe3, 0xec, 0xf5, 0xf5, 0xee, + 0xea, 0xf5, 0xf9, 0xff, 0x09, 0xee, 0xe8, 0xf5, 0xfd, 0xec, 0x07, 0xff, + 0x00, 0xf5, 0x03, 0x05, 0xf9, 0x00, 0x23, 0x2e, 0x1b, 0x0e, 0xf0, 0x19, + 0x1b, 0x30, 0xfb, 0x0c, 0x35, 0x18, 0x0c, 0x26, 0x01, 0x18, 0x25, 0x12, + 0x1b, 0x25, 0x25, 0x12, 0x12, 0x25, 0x26, 0x0e, 0x12, 0x1f, 0x18, 0x16, + 0x1d, 0x1d, 0x14, 0x12, 0x10, 0x12, 0x0c, 0xff, 0x03, 0x10, 0x0c, 0xff, + 0xf7, 0xff, 0x00, 0x10, 0xfd, 0x09, 0xfd, 0x00, 0x03, 0xff, 0xdf, 0xec, + 0xf7, 0xff, 0xe1, 0xdd, 0xf2, 0xe8, 0xdd, 0xda, 0xe3, 0xdd, 0xe5, 0xda, + 0xdd, 0xdf, 0xd8, 0xd6, 0xd4, 0xdf, 0xe3, 0xd8, 0xd6, 0xe5, 0xe5, 0xea, + 0xe3, 0xe7, 0xee, 0xe7, 0xea, 0xee, 0xf0, 0xe7, 0xea, 0xf4, 0xf5, 0xf2, + 0xf7, 0xf2, 0x03, 0x01, 0xf5, 0xf7, 0xfd, 0xfd, 0x07, 0xfb, 0x0b, 0x01, + 0xf9, 0x03, 0x0e, 0x00, 0x03, 0x09, 0x05, 0x07, 0x05, 0x26, 0x19, 0x0b, + 0x2e, 0x1b, 0xfd, 0x0c, 0x30, 0x21, 0x03, 0x0e, 0x2a, 0x30, 0x28, 0x1b, + 0x1f, 0x18, 0x1d, 0x2a, 0x33, 0x19, 0x14, 0x1d, 0x16, 0x19, 0x19, 0x14, + 0x16, 0x16, 0x19, 0x14, 0x14, 0x12, 0x0e, 0x0b, 0x00, 0x10, 0x16, 0x0c, + 0x07, 0x05, 0x09, 0x01, 0xfb, 0xfb, 0x05, 0xf5, 0xf4, 0xf7, 0xe8, 0xff, + 0xee, 0xf0, 0xf2, 0xea, 0xdf, 0xdf, 0xe8, 0xe8, 0xdf, 0xd6, 0xdd, 0xe1, + 0xe8, 0xe1, 0xd6, 0xd2, 0xd6, 0xdf, 0xdd, 0xea, 0xe8, 0xdb, 0xdb, 0xd6, + 0xda, 0xe7, 0xe1, 0xe7, 0xe1, 0xe3, 0xe7, 0xec, 0xe8, 0xf2, 0xf0, 0xf7, + 0xf2, 0xf5, 0xf4, 0xee, 0xf0, 0xf7, 0xfd, 0xfb, 0xf7, 0x05, 0x0b, 0xff, + 0xff, 0x09, 0x1f, 0x0c, 0x12, 0x18, 0x14, 0x07, 0x16, 0x2a, 0x23, 0x1f, + 0x1d, 0x0c, 0x19, 0x25, 0x2a, 0x19, 0x16, 0x2a, 0x37, 0x1f, 0x28, 0x30, + 0x28, 0x1f, 0x25, 0x25, 0x16, 0x23, 0x21, 0x1d, 0x1b, 0x19, 0x21, 0x1b, + 0x12, 0x18, 0x16, 0x07, 0x12, 0x14, 0x0c, 0xff, 0xfd, 0x0b, 0x0c, 0x0c, + 0x07, 0x00, 0x03, 0xf5, 0xf2, 0xf0, 0xf2, 0xf0, 0xdf, 0xff, 0xec, 0xf2, + 0xe7, 0xdb, 0xe3, 0xe5, 0xd2, 0xdb, 0xe1, 0xdf, 0xdd, 0xd6, 0xd2, 0xd4, + 0xd0, 0xcf, 0xd8, 0xda, 0xe1, 0xdb, 0xd6, 0xd0, 0xd6, 0xda, 0xe1, 0xda, + 0xdb, 0xe3, 0xf0, 0xe8, 0xdf, 0xe1, 0xea, 0xee, 0xf0, 0xf4, 0xee, 0xf5, + 0xfb, 0xf4, 0xf4, 0xf4, 0xfb, 0xf9, 0x00, 0x01, 0x00, 0x03, 0x03, 0x12, + 0x18, 0x0b, 0x0e, 0x14, 0x12, 0x18, 0x21, 0x1f, 0x12, 0x21, 0x26, 0x21, + 0x1f, 0x26, 0x2a, 0x2c, 0x28, 0x1d, 0x1f, 0x25, 0x37, 0x2c, 0x21, 0x23, + 0x2e, 0x2a, 0x25, 0x1d, 0x16, 0x1f, 0x23, 0x23, 0x16, 0x14, 0x16, 0x1d, + 0x23, 0x12, 0x09, 0x12, 0x1d, 0x16, 0x0c, 0x07, 0x0e, 0x03, 0x03, 0x01, + 0x01, 0xfd, 0xf4, 0xf7, 0x01, 0xfd, 0xf7, 0xea, 0xe3, 0xea, 0xe8, 0xdd, + 0xe1, 0xe1, 0xdf, 0xe5, 0xdd, 0xda, 0xd2, 0xd4, 0xcd, 0xd6, 0xd4, 0xd0, + 0xda, 0xd6, 0xd8, 0xdd, 0xd8, 0xd4, 0xd8, 0xdb, 0xdd, 0xd8, 0xdf, 0xdf, + 0xe1, 0xdd, 0xe5, 0xea, 0xea, 0xea, 0xea, 0xea, 0xf0, 0xf0, 0xf2, 0xf9, + 0xff, 0xfd, 0xff, 0x00, 0x09, 0x05, 0x00, 0x07, 0x03, 0x01, 0x07, 0x10, + 0x18, 0x18, 0x12, 0x18, 0x1f, 0x14, 0x19, 0x21, 0x23, 0x23, 0x2c, 0x23, + 0x21, 0x23, 0x2a, 0x2a, 0x23, 0x21, 0x23, 0x21, 0x25, 0x1d, 0x21, 0x1f, + 0x18, 0x19, 0x1b, 0x1d, 0x23, 0x1b, 0x0c, 0x19, 0x1b, 0x19, 0x1b, 0x14, + 0x0e, 0x0e, 0x0c, 0x0b, 0x0b, 0x07, 0x05, 0x01, 0x01, 0x01, 0xff, 0xf7, + 0xf5, 0xf2, 0xf0, 0xf2, 0xee, 0xec, 0xea, 0xf0, 0xe5, 0xea, 0xee, 0xe7, + 0xdd, 0xe1, 0xe5, 0xe3, 0xe1, 0xe3, 0xd6, 0xd0, 0xdb, 0xe5, 0xe5, 0xd4, + 0xd8, 0xdf, 0xdb, 0xe5, 0xe5, 0xdf, 0xdd, 0xe7, 0xe5, 0xe7, 0xe8, 0xe7, + 0xee, 0xee, 0xea, 0xea, 0xea, 0xf5, 0xf5, 0xf4, 0xf4, 0xf5, 0xfb, 0xff, + 0x00, 0x01, 0x01, 0xff, 0x05, 0x09, 0x09, 0x07, 0x09, 0x10, 0x0c, 0x12, + 0x14, 0x12, 0x0c, 0x12, 0x14, 0x16, 0x18, 0x16, 0x10, 0x14, 0x12, 0x10, + 0x1b, 0x1f, 0x25, 0x16, 0x12, 0x12, 0x18, 0x18, 0x16, 0x12, 0x18, 0x19, + 0x1b, 0x19, 0x10, 0x0e, 0x14, 0x10, 0x14, 0x18, 0x12, 0x10, 0x18, 0x10, + 0x0b, 0x09, 0x10, 0x0e, 0x03, 0xfd, 0x07, 0x07, 0x0c, 0x05, 0xf9, 0xf9, + 0x05, 0xff, 0xf5, 0xfd, 0xf5, 0xf9, 0xf5, 0xee, 0xf5, 0xf4, 0xf4, 0xf0, + 0xf5, 0xf9, 0xf2, 0xec, 0xea, 0xe1, 0xe5, 0xee, 0xec, 0xec, 0xe7, 0xf0, + 0xec, 0xee, 0xf0, 0xee, 0xe8, 0xe7, 0xec, 0xf0, 0xf0, 0xf0, 0xf4, 0xf2, + 0xee, 0xe8, 0xf4, 0xf7, 0xf7, 0xf5, 0xf2, 0xf7, 0xf9, 0xf5, 0xf4, 0xf9, + 0xff, 0xf9, 0xf4, 0xfb, 0xf7, 0xf4, 0xf7, 0xfd, 0xff, 0x03, 0x01, 0x00, + 0x01, 0x05, 0x00, 0x07, 0x03, 0x01, 0x07, 0x07, 0x0b, 0x09, 0x0c, 0x10, + 0x0e, 0x0b, 0x10, 0x0e, 0x0b, 0x09, 0x03, 0x03, 0x0b, 0x0c, 0x0b, 0x12, + 0x0e, 0x12, 0x14, 0x12, 0x10, 0x0e, 0x16, 0x14, 0x12, 0x0e, 0x12, 0x16, + 0x16, 0x12, 0x18, 0x14, 0x12, 0x14, 0x18, 0x0e, 0x0e, 0x16, 0x12, 0x01, + 0x09, 0x12, 0x10, 0x09, 0x07, 0x09, 0x10, 0x07, 0xfd, 0xfd, 0x09, 0x05, + 0xf9, 0xf5, 0x03, 0x03, 0xfb, 0xf2, 0xf9, 0xf2, 0xfb, 0xff, 0xf0, 0xec, + 0xf0, 0xee, 0xf0, 0xec, 0xea, 0xfb, 0xf2, 0xe3, 0xe7, 0xe8, 0xe7, 0xe5, + 0xea, 0xea, 0xe7, 0xec, 0xe8, 0xe8, 0xe8, 0xf0, 0xec, 0xe7, 0xea, 0xec, + 0xec, 0xe5, 0xea, 0xec, 0xf4, 0xf4, 0xf2, 0xf2, 0xf2, 0xf5, 0xf5, 0xf0, + 0xf2, 0xf2, 0xf4, 0xfb, 0xfd, 0xfb, 0xf5, 0xf4, 0xf9, 0xf7, 0xfb, 0xf7, + 0xf5, 0x00, 0x05, 0x07, 0x07, 0x07, 0x0c, 0x09, 0x0b, 0x0c, 0x10, 0x10, + 0x14, 0x16, 0x14, 0x12, 0x14, 0x1b, 0x1f, 0x21, 0x23, 0x23, 0x21, 0x1d, + 0x1b, 0x1b, 0x21, 0x1d, 0x1d, 0x21, 0x1b, 0x1d, 0x16, 0x1d, 0x1b, 0x19, + 0x1b, 0x18, 0x12, 0x12, 0x16, 0x0e, 0x0e, 0x0b, 0x05, 0x0e, 0x10, 0x07, + 0x05, 0x03, 0x05, 0x00, 0xf7, 0xff, 0x00, 0xfb, 0xf9, 0xf9, 0xfb, 0xf9, + 0xf4, 0xf4, 0xf2, 0xe8, 0xf0, 0xea, 0xec, 0xea, 0xe8, 0xe7, 0xe3, 0xdd, + 0xdb, 0xdf, 0xe7, 0xdf, 0xda, 0xe3, 0xdd, 0xe5, 0xe1, 0xdd, 0xdf, 0xe3, + 0xe1, 0xe5, 0xe7, 0xe5, 0xe5, 0xdd, 0xe7, 0xee, 0xe7, 0xe8, 0xea, 0xf2, + 0xf4, 0xee, 0xf0, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xff, 0x00, 0x01, 0x03, + 0xfd, 0x00, 0x0b, 0x10, 0x0e, 0x05, 0x12, 0x14, 0x12, 0x18, 0x16, 0x16, + 0x18, 0x16, 0x19, 0x1f, 0x21, 0x1d, 0x1f, 0x1d, 0x23, 0x1f, 0x21, 0x23, + 0x23, 0x21, 0x1f, 0x21, 0x23, 0x1f, 0x21, 0x1b, 0x1b, 0x19, 0x23, 0x23, + 0x1d, 0x14, 0x16, 0x1d, 0x18, 0x18, 0x12, 0x10, 0x0e, 0x16, 0x10, 0x0e, + 0x07, 0x05, 0x07, 0x05, 0x05, 0xff, 0xfd, 0x01, 0xfd, 0xfb, 0xf7, 0xf4, + 0xf2, 0xee, 0xee, 0xf7, 0xea, 0xe3, 0xe7, 0xee, 0xea, 0xe5, 0xe3, 0xea, + 0xe8, 0xe3, 0xe3, 0xe7, 0xdd, 0xe3, 0xe5, 0xe5, 0xdf, 0xdd, 0xdd, 0xdb, + 0xe1, 0xdf, 0xdb, 0xe3, 0xe5, 0xe3, 0xe7, 0xe3, 0xdf, 0xe3, 0xe5, 0xea, + 0xea, 0xe7, 0xec, 0xf0, 0xee, 0xf0, 0xf4, 0xf4, 0xf2, 0xf0, 0x00, 0x01, + 0xf9, 0xf9, 0x00, 0x09, 0x09, 0x05, 0x03, 0x09, 0x0c, 0x12, 0x14, 0x14, + 0x12, 0x12, 0x16, 0x19, 0x10, 0x12, 0x12, 0x14, 0x18, 0x1b, 0x1b, 0x19, + 0x1b, 0x1d, 0x21, 0x1f, 0x1b, 0x19, 0x1f, 0x23, 0x1b, 0x19, 0x1b, 0x16, + 0x1d, 0x18, 0x14, 0x18, 0x16, 0x14, 0x14, 0x16, 0x10, 0x0e, 0x0e, 0x14, + 0x12, 0x0c, 0x0b, 0x03, 0x0b, 0x07, 0x01, 0x01, 0x03, 0x01, 0x03, 0xfb, + 0xfd, 0xf9, 0xf9, 0xf5, 0xf2, 0xf2, 0xf5, 0xf7, 0xf0, 0xea, 0xf0, 0xf9, + 0xf2, 0xea, 0xf0, 0xf7, 0xf2, 0xe7, 0xe8, 0xf0, 0xf0, 0xee, 0xea, 0xea, + 0xf4, 0xf4, 0xe8, 0xec, 0xee, 0xe8, 0xe7, 0xea, 0xea, 0xee, 0xe5, 0xec, + 0xf2, 0xf2, 0xf0, 0xf0, 0xf2, 0xf9, 0xf2, 0xf4, 0xfb, 0xf5, 0xee, 0xf0, + 0xfd, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x05, 0x09, 0x0e, 0x0c, 0x03, 0x07, 0x09, 0x0e, 0x0e, 0x0e, 0x07, + 0x07, 0x0c, 0x0b, 0x0c, 0x14, 0x10, 0x0c, 0x0c, 0x09, 0x12, 0x0c, 0x09, + 0x09, 0x0e, 0x12, 0x0c, 0x0c, 0x0e, 0x0c, 0x0e, 0x0e, 0x0b, 0x0c, 0x0b, + 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x07, 0x05, 0x05, 0x0c, 0x05, 0x07, 0x05, + 0x09, 0x09, 0x09, 0x07, 0x05, 0x07, 0x03, 0x03, 0x09, 0x09, 0x05, 0x00, + 0x00, 0xff, 0xff, 0x03, 0x01, 0xff, 0x00, 0x01, 0xfd, 0xf5, 0xf9, 0x00, + 0xfb, 0xf5, 0xf4, 0xf7, 0xfb, 0xf7, 0xfb, 0xfb, 0xfb, 0xf0, 0xf4, 0xf5, + 0xf7, 0xf4, 0xec, 0xf2, 0xf2, 0xf5, 0xf5, 0xf2, 0xee, 0xec, 0xf0, 0xee, + 0xf2, 0xf5, 0xf2, 0xec, 0xf4, 0xf7, 0xf0, 0xf4, 0xf9, 0xf7, 0xf2, 0xf4, + 0xf5, 0xf5, 0xf7, 0xf5, 0xf9, 0xf4, 0xf5, 0xfd, 0x00, 0xf9, 0xf9, 0xf9, + 0xf9, 0xff, 0x01, 0xfd, 0x00, 0xfd, 0x03, 0x05, 0xfd, 0x01, 0x03, 0x03, + 0x01, 0x03, 0x01, 0x05, 0x0c, 0x0b, 0x09, 0x05, 0x09, 0x0b, 0x09, 0x0c, + 0x10, 0x0c, 0x09, 0x0c, 0x0b, 0x12, 0x0b, 0x09, 0x0c, 0x0c, 0x0e, 0x12, + 0x0e, 0x0e, 0x0c, 0x0b, 0x0e, 0x14, 0x0c, 0x10, 0x12, 0x18, 0x16, 0x0b, + 0x03, 0x07, 0x0b, 0x0c, 0x0b, 0x0c, 0x0e, 0x09, 0x09, 0x01, 0x05, 0x0c, + 0x05, 0x05, 0x0b, 0x03, 0xfd, 0xfd, 0x00, 0xfb, 0xff, 0xfd, 0xfd, 0xff, + 0xfd, 0xff, 0xf9, 0xf5, 0xf4, 0xf5, 0xf5, 0xf5, 0xf9, 0xf7, 0xf2, 0xf2, + 0xea, 0xf0, 0xf4, 0xf2, 0xee, 0xec, 0xf0, 0xf2, 0xe8, 0xe8, 0xee, 0xea, + 0xe5, 0xe8, 0xe8, 0xee, 0xe8, 0xec, 0xe7, 0xe8, 0xe8, 0xee, 0xf0, 0xf4, + 0xf2, 0xf4, 0xf4, 0xf4, 0xf2, 0xf2, 0xf5, 0xf7, 0xf9, 0xf9, 0xff, 0x00, + 0xfb, 0xfd, 0x01, 0x03, 0x03, 0x09, 0x01, 0x01, 0x05, 0x09, 0x09, 0x07, + 0x03, 0x07, 0x0c, 0x0e, 0x0b, 0x10, 0x0e, 0x09, 0x0c, 0x0c, 0x0e, 0x0e, + 0x0e, 0x0c, 0x10, 0x12, 0x14, 0x16, 0x10, 0x0e, 0x0e, 0x0e, 0x0c, 0x0e, + 0x12, 0x10, 0x0b, 0x12, 0x10, 0x0e, 0x0c, 0x0e, 0x0e, 0x10, 0x0b, 0x0e, + 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x03, 0x0b, 0x09, 0x01, 0x01, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x01, 0x00, 0x05, 0xff, 0xfd, 0xfb, 0xf9, 0xfd, + 0xfb, 0xf0, 0xf9, 0xf5, 0xfb, 0xf5, 0xf2, 0xf0, 0xfb, 0xf7, 0xf4, 0xee, + 0xf0, 0xea, 0xea, 0xe5, 0xec, 0xf0, 0xec, 0xe8, 0xee, 0xf5, 0xf4, 0xee, + 0xee, 0xf0, 0xee, 0xea, 0xec, 0xec, 0xf4, 0xf5, 0xec, 0xf2, 0xf2, 0xf4, + 0xf0, 0xee, 0xf0, 0xf5, 0xf2, 0xf4, 0xf5, 0xf9, 0xfd, 0xfb, 0xf4, 0xff, + 0xff, 0xfd, 0xfb, 0xfd, 0x01, 0x00, 0xff, 0x00, 0x09, 0x00, 0x05, 0x09, + 0x09, 0x09, 0x0c, 0x05, 0x03, 0xff, 0x03, 0x0c, 0x0c, 0x00, 0x01, 0x09, + 0x0e, 0x0b, 0x09, 0x10, 0x10, 0x0b, 0x0e, 0x0b, 0x07, 0x0b, 0x0c, 0x0b, + 0x0e, 0x12, 0x10, 0x0e, 0x0c, 0x0e, 0x0e, 0x0c, 0x0c, 0x0e, 0x09, 0x10, + 0x0c, 0x14, 0x14, 0x10, 0x0e, 0x0c, 0x0b, 0x0e, 0x0e, 0x0e, 0x09, 0x09, + 0x0c, 0x0c, 0x0b, 0x0c, 0x07, 0x07, 0x0b, 0x05, 0x01, 0xff, 0x00, 0xfb, + 0x03, 0x01, 0x00, 0x01, 0x05, 0x05, 0xff, 0xf9, 0xf5, 0xfb, 0xf9, 0xf7, + 0xfb, 0xf2, 0xf4, 0xf4, 0xf5, 0xf2, 0xf4, 0xf5, 0xf2, 0xec, 0xee, 0xf0, + 0xea, 0xe7, 0xec, 0xee, 0xec, 0xea, 0xec, 0xf0, 0xee, 0xea, 0xec, 0xea, + 0xec, 0xea, 0xea, 0xf0, 0xec, 0xee, 0xea, 0xec, 0xf2, 0xf4, 0xf4, 0xee, + 0xf4, 0xf5, 0xf0, 0xf0, 0xf7, 0xfb, 0xfb, 0xf7, 0xf5, 0xf9, 0xfd, 0xfb, + 0xfd, 0x00, 0x00, 0xff, 0x00, 0x03, 0x01, 0x01, 0x05, 0x05, 0x01, 0x05, + 0x0b, 0x0e, 0x09, 0x05, 0x0b, 0x10, 0x09, 0x09, 0x0b, 0x10, 0x18, 0x14, + 0x12, 0x12, 0x12, 0x16, 0x12, 0x0c, 0x14, 0x19, 0x18, 0x18, 0x19, 0x1b, + 0x1b, 0x19, 0x16, 0x16, 0x1b, 0x1d, 0x1d, 0x1f, 0x16, 0x12, 0x16, 0x18, + 0x18, 0x12, 0x16, 0x19, 0x10, 0x12, 0x12, 0x10, 0x0e, 0x0b, 0x07, 0x09, + 0x0c, 0x05, 0x03, 0x03, 0x03, 0x05, 0x00, 0xfb, 0xfb, 0xfd, 0xf9, 0xf4, + 0xf5, 0xf7, 0xf4, 0xec, 0xea, 0xea, 0xf0, 0xee, 0xec, 0xe5, 0xe3, 0xea, + 0xe5, 0xe8, 0xdf, 0xdd, 0xe1, 0xe3, 0xdd, 0xdd, 0xe1, 0xe5, 0xdd, 0xdd, + 0xdd, 0xe1, 0xe3, 0xe7, 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe8, 0xe1, 0xe7, + 0xec, 0xec, 0xe8, 0xec, 0xf0, 0xf2, 0xee, 0xec, 0xee, 0xfb, 0xff, 0xf9, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x05, 0x09, 0x09, 0x0b, 0x07, + 0x07, 0x0c, 0x10, 0x10, 0x0e, 0x0e, 0x16, 0x16, 0x10, 0x10, 0x14, 0x18, + 0x16, 0x16, 0x18, 0x18, 0x19, 0x16, 0x16, 0x12, 0x16, 0x19, 0x19, 0x1b, + 0x1b, 0x18, 0x18, 0x19, 0x1f, 0x18, 0x18, 0x19, 0x18, 0x1d, 0x19, 0x18, + 0x16, 0x18, 0x18, 0x19, 0x16, 0x12, 0x0c, 0x0e, 0x10, 0x0c, 0x0c, 0x0b, + 0x09, 0x05, 0x09, 0x05, 0xff, 0x00, 0xfb, 0xfd, 0xff, 0xf7, 0xf4, 0xf7, + 0xf7, 0xf7, 0xf4, 0xf0, 0xf4, 0xf0, 0xf0, 0xe7, 0xe5, 0xe8, 0xe7, 0xe7, + 0xea, 0xe8, 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe1, 0xe3, 0xe1, 0xe3, 0xe5, + 0xe1, 0xdf, 0xe1, 0xe5, 0xea, 0xe7, 0xe3, 0xe5, 0xe8, 0xee, 0xf2, 0xec, + 0xe8, 0xe7, 0xec, 0xf4, 0xf7, 0xf5, 0xf7, 0xf4, 0xf9, 0xfd, 0xfd, 0xfb, + 0xfb, 0xfb, 0xff, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x07, 0x0b, + 0x05, 0x05, 0x09, 0x07, 0x0c, 0x0c, 0x0c, 0x14, 0x14, 0x14, 0x0c, 0x0c, + 0x0e, 0x0e, 0x10, 0x0c, 0x10, 0x16, 0x16, 0x10, 0x14, 0x16, 0x14, 0x16, + 0x14, 0x12, 0x18, 0x19, 0x14, 0x10, 0x1b, 0x1b, 0x19, 0x18, 0x14, 0x19, + 0x18, 0x14, 0x12, 0x14, 0x16, 0x12, 0x0c, 0x10, 0x12, 0x10, 0x0e, 0x0c, + 0x0b, 0x09, 0x07, 0x07, 0x07, 0x05, 0x03, 0x05, 0x03, 0x07, 0x00, 0xfb, + 0xf9, 0xff, 0x00, 0xfd, 0xf7, 0xf9, 0xf4, 0xf2, 0xf5, 0xf4, 0xf0, 0xf5, + 0xf2, 0xee, 0xea, 0xec, 0xec, 0xea, 0xe8, 0xea, 0xe3, 0xe5, 0xe7, 0xea, + 0xe8, 0xe5, 0xe7, 0xe8, 0xe7, 0xe1, 0xdf, 0xe3, 0xe7, 0xe3, 0xe5, 0xea, + 0xe8, 0xe8, 0xea, 0xee, 0xea, 0xe5, 0xe8, 0xee, 0xee, 0xf0, 0xf0, 0xf0, + 0xf4, 0xf4, 0xf0, 0xf2, 0xf2, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfb, + 0x00, 0x00, 0xfb, 0xff, 0x05, 0x09, 0x01, 0x09, 0x09, 0x07, 0x07, 0x0b, + 0x0e, 0x10, 0x0c, 0x12, 0x16, 0x12, 0x0e, 0x14, 0x16, 0x19, 0x1b, 0x18, + 0x18, 0x19, 0x1b, 0x1b, 0x1b, 0x18, 0x1b, 0x1d, 0x1f, 0x23, 0x1f, 0x1b, + 0x1b, 0x18, 0x19, 0x1b, 0x1d, 0x1f, 0x1d, 0x1b, 0x1d, 0x1b, 0x18, 0x18, + 0x16, 0x14, 0x16, 0x12, 0x12, 0x14, 0x10, 0x0e, 0x0e, 0x0c, 0x09, 0x05, + 0x07, 0x09, 0x07, 0x00, 0xfb, 0xfd, 0xf9, 0xf7, 0xf5, 0xf2, 0xf0, 0xf0, + 0xf0, 0xea, 0xec, 0xe7, 0xe8, 0xe5, 0xe5, 0xe7, 0xe3, 0xe3, 0xe1, 0xe1, + 0xda, 0xdb, 0xe5, 0xdf, 0xdb, 0xdd, 0xdb, 0xdf, 0xdd, 0xdd, 0xdb, 0xdd, + 0xdb, 0xdd, 0xdb, 0xdd, 0xe3, 0xe5, 0xe5, 0xe3, 0xe1, 0xe5, 0xe5, 0xe7, + 0xea, 0xea, 0xee, 0xf2, 0xf4, 0xf5, 0xf2, 0xf4, 0xf7, 0xfb, 0xfd, 0xfd, + 0xfd, 0xff, 0x01, 0x05, 0x07, 0x07, 0x07, 0x09, 0x07, 0x0c, 0x0b, 0x0e, + 0x0e, 0x12, 0x16, 0x16, 0x14, 0x19, 0x1b, 0x1b, 0x19, 0x19, 0x1b, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1b, 0x1f, 0x23, 0x21, 0x1b, 0x1b, 0x1d, 0x19, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x16, 0x18, 0x16, 0x12, 0x12, + 0x12, 0x10, 0x0e, 0x0c, 0x09, 0x0b, 0x0b, 0x09, 0x05, 0x00, 0x03, 0xff, + 0x00, 0xfd, 0xfd, 0xfb, 0xf7, 0xfd, 0xf9, 0xf4, 0xf4, 0xf2, 0xf0, 0xee, + 0xea, 0xea, 0xea, 0xea, 0xe7, 0xe7, 0xe5, 0xe7, 0xe5, 0xe3, 0xe1, 0xe1, + 0xe3, 0xe3, 0xe3, 0xe5, 0xe1, 0xe1, 0xe3, 0xe7, 0xe7, 0xe7, 0xe8, 0xe5, + 0xe7, 0xe8, 0xea, 0xec, 0xea, 0xee, 0xf2, 0xf2, 0xf2, 0xee, 0xf4, 0xf4, + 0xf4, 0xf2, 0xf4, 0xf7, 0xf9, 0xf9, 0xf9, 0xfb, 0x00, 0x03, 0x01, 0x00, + 0x00, 0x03, 0x05, 0x05, 0x07, 0x0b, 0x0e, 0x0c, 0x0c, 0x10, 0x10, 0x0e, + 0x0c, 0x10, 0x14, 0x14, 0x12, 0x12, 0x12, 0x12, 0x12, 0x14, 0x12, 0x14, + 0x14, 0x12, 0x10, 0x10, 0x12, 0x0e, 0x0c, 0x0c, 0x10, 0x10, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0e, 0x0c, 0x0e, 0x09, 0x09, 0x0b, 0x09, 0x07, 0x05, 0x09, + 0x0c, 0x0b, 0x01, 0x07, 0x09, 0x05, 0x07, 0x01, 0x01, 0x00, 0xff, 0x00, + 0xff, 0xfb, 0xfb, 0xfd, 0xfd, 0xfb, 0xf7, 0xfb, 0xfd, 0xf7, 0xf5, 0xf5, + 0xf5, 0xf9, 0xf5, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xf7, 0xf4, 0xf4, 0xf4, + 0xf9, 0xf7, 0xf4, 0xf5, 0xf9, 0xfb, 0xf9, 0xf5, 0xf4, 0xf7, 0xf2, 0xf5, + 0xf4, 0xf4, 0xf2, 0xf2, 0xf5, 0xf5, 0xf7, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, + 0xf5, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, 0xff, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, + 0x01, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0xfd, 0xff, 0x03, 0x01, + 0x01, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x05, 0x05, 0x05, 0x07, 0x07, + 0x07, 0x09, 0x07, 0x07, 0x05, 0x05, 0x0b, 0x09, 0x07, 0x09, 0x07, 0x09, + 0x09, 0x07, 0x05, 0x03, 0x05, 0x09, 0x07, 0x07, 0x09, 0x07, 0x05, 0x01, + 0x00, 0x03, 0x07, 0x07, 0x05, 0x03, 0x05, 0x01, 0x01, 0x03, 0x03, 0x01, + 0x07, 0x07, 0x03, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0xfd, + 0xfb, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xfb, 0xf9, 0xf5, 0xf5, 0xf5, 0xf7, + 0xf5, 0xf5, 0xf9, 0xf7, 0xf9, 0xf7, 0xf4, 0xf4, 0xf5, 0xf7, 0xf5, 0xf4, + 0xf2, 0xf4, 0xf7, 0xf7, 0xf9, 0xfb, 0xf9, 0xf4, 0xf5, 0xf9, 0xf9, 0xf7, + 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, 0xfb, 0xf9, 0xfb, 0xfd, 0xfd, 0xfb, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0x01, 0x01, 0x00, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x01, 0x05, 0x05, 0x07, 0x09, 0x07, 0x07, 0x0b, 0x09, + 0x09, 0x07, 0x07, 0x07, 0x0b, 0x0c, 0x09, 0x05, 0x07, 0x09, 0x09, 0x07, + 0x07, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x03, 0x03, 0x03, 0x09, 0x05, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x00, 0xfd, 0xff, 0x00, 0xff, 0xfd, 0xf9, 0xfb, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf7, 0xf7, 0xf5, 0xf5, 0xf7, 0xfb, 0xf7, 0xf7, 0xf5, 0xf7, + 0xf9, 0xfb, 0xf9, 0xf9, 0xf9, 0xfb, 0xfb, 0xfb, 0xff, 0xfb, 0xf7, 0xfb, + 0xfd, 0xff, 0xfd, 0xf7, 0xf7, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0x00, 0x00, + 0x01, 0x00, 0xff, 0x00, 0xff, 0x01, 0x01, 0x00, 0x03, 0x03, 0x01, 0x03, + 0x03, 0x03, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07, + 0x07, 0x07, 0x05, 0x07, 0x09, 0x09, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, + 0x03, 0x03, 0x01, 0x00, 0x01, 0x05, 0x03, 0x00, 0xff, 0x01, 0x03, 0xff, + 0xfb, 0x00, 0xff, 0xfb, 0xfb, 0xff, 0xfd, 0xf9, 0xf9, 0xf7, 0xf9, 0xf7, + 0xf7, 0xf9, 0xfb, 0xf9, 0xf9, 0xf7, 0xf9, 0xf9, 0xf7, 0xf7, 0x00, 0x00, + 0xfe, 0xfc, 0xf4, 0xf4, 0xeb, 0xf4, 0xe4, 0xff, 0x01, 0xe7, 0xf4, 0xdb, + 0xff, 0xe3, 0x17, 0xfd, 0xfb, 0xe5, 0x02, 0x18, 0xdc, 0xf9, 0x0d, 0x0b, + 0x0b, 0x26, 0xe1, 0x34, 0x38, 0x24, 0xff, 0x22, 0x03, 0x26, 0x09, 0x4d, + 0x09, 0x34, 0x28, 0x22, 0x11, 0x3a, 0x20, 0x30, 0x1b, 0x30, 0x1d, 0x1d, + 0x2e, 0x32, 0x4f, 0x57, 0x38, 0x68, 0x20, 0x3c, 0xe1, 0x40, 0x2a, 0x40, + 0x3c, 0x26, 0x2e, 0x40, 0x53, 0x61, 0x1b, 0x45, 0x05, 0x49, 0x0b, 0x4b, + 0x4b, 0x40, 0x49, 0x32, 0x30, 0x2e, 0x59, 0x3a, 0x4d, 0xff, 0x1f, 0x4d, + 0x22, 0x4b, 0x00, 0x05, 0x3e, 0x4b, 0x1d, 0x03, 0x07, 0x45, 0x2e, 0x1d, + 0x34, 0x01, 0x20, 0x11, 0x0b, 0xfb, 0x30, 0x0b, 0xe5, 0x09, 0x13, 0x1b, + 0x0d, 0xff, 0xc8, 0x0b, 0xd4, 0x26, 0x11, 0xe3, 0xc0, 0xd2, 0x0d, 0xfb, + 0xc2, 0xda, 0xcc, 0xef, 0xd6, 0xfb, 0xd2, 0xed, 0xb1, 0xca, 0xe5, 0xc0, + 0xd4, 0xbb, 0xb9, 0xbd, 0xd6, 0xcc, 0xb3, 0xd6, 0xb5, 0xc0, 0xce, 0xce, + 0xbb, 0xbd, 0xb3, 0xd0, 0xbf, 0xb5, 0xb3, 0xbd, 0xbd, 0xc4, 0xc4, 0xc4, + 0xa7, 0xc2, 0xab, 0xd8, 0xb7, 0xc6, 0xc2, 0xb1, 0xbd, 0xd6, 0xca, 0xc4, + 0xbb, 0xc4, 0xe3, 0xb5, 0xe1, 0xbb, 0xd6, 0xdc, 0xde, 0xc0, 0xca, 0xd4, + 0xeb, 0xd8, 0xd6, 0xcc, 0xcc, 0xed, 0xde, 0xe9, 0xe1, 0xe1, 0xf5, 0xdc, + 0xda, 0xed, 0xf1, 0xf1, 0xe3, 0xda, 0xe9, 0xf5, 0xf7, 0xf3, 0xff, 0x03, + 0x0f, 0x07, 0xff, 0xff, 0x03, 0x07, 0x1b, 0x07, 0x07, 0x05, 0x24, 0x13, + 0x19, 0x0f, 0x1f, 0x0d, 0x1f, 0x20, 0x11, 0x20, 0x1f, 0x32, 0x28, 0x3a, + 0x20, 0x2e, 0x1b, 0x30, 0x2c, 0x3c, 0x2e, 0x2a, 0x30, 0x3e, 0x38, 0x34, + 0x24, 0x2e, 0x22, 0x2e, 0x32, 0x47, 0x30, 0x34, 0x38, 0x2c, 0x3a, 0x41, + 0x38, 0x2c, 0x45, 0x2c, 0x26, 0x38, 0x24, 0x22, 0x3e, 0x36, 0x3e, 0x28, + 0x24, 0x20, 0x2e, 0x28, 0x3a, 0x32, 0x32, 0x2c, 0x34, 0x17, 0x2e, 0x1d, + 0x2e, 0x2e, 0x32, 0x30, 0x2a, 0x26, 0x28, 0x19, 0x28, 0x24, 0x26, 0x32, + 0x1d, 0x1f, 0x26, 0x20, 0x24, 0x22, 0x1b, 0x17, 0x17, 0x1f, 0x24, 0x24, + 0x17, 0x1b, 0x17, 0x19, 0x13, 0x1d, 0x0f, 0x11, 0x0f, 0x0f, 0x0d, 0x0f, + 0x09, 0x11, 0x00, 0x0b, 0x05, 0x0d, 0x00, 0x0d, 0x01, 0x03, 0x03, 0xf7, + 0x01, 0xfd, 0x03, 0x07, 0xfb, 0x01, 0xf9, 0xf7, 0xf5, 0xfd, 0xf7, 0xf5, + 0xf7, 0xe9, 0xf1, 0x00, 0xf7, 0xeb, 0xde, 0xe1, 0xde, 0xe9, 0xf1, 0xef, + 0xed, 0xe3, 0xd4, 0xde, 0xe3, 0xe3, 0xe0, 0xe0, 0xdc, 0xde, 0xd8, 0xda, + 0xd8, 0xd8, 0xd4, 0xd2, 0xcc, 0xd0, 0xcc, 0xc8, 0xce, 0xd6, 0xcc, 0xca, + 0xc8, 0xc8, 0xc6, 0xcc, 0xc4, 0xca, 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, + 0xc2, 0xc0, 0xc4, 0xc8, 0xca, 0xcc, 0xca, 0xc4, 0xc8, 0xc6, 0xce, 0xc4, + 0xce, 0xc8, 0xc6, 0xce, 0xce, 0xd0, 0xd4, 0xd4, 0xd4, 0xd6, 0xd6, 0xd8, + 0xd8, 0xd4, 0xd8, 0xde, 0xde, 0xde, 0xe0, 0xe1, 0xde, 0xe1, 0xe1, 0xe5, + 0xe7, 0xeb, 0xed, 0xed, 0xe9, 0xeb, 0xef, 0xf1, 0xf3, 0xef, 0xf7, 0xfd, + 0xfb, 0xf7, 0xf5, 0xf9, 0xff, 0xfd, 0xff, 0xff, 0x03, 0x07, 0x05, 0x00, + 0x09, 0x07, 0x0d, 0x09, 0x0d, 0x09, 0x11, 0x15, 0x1b, 0x15, 0x0f, 0x0d, + 0x13, 0x13, 0x15, 0x17, 0x1d, 0x17, 0x17, 0x17, 0x1d, 0x1d, 0x24, 0x24, + 0x22, 0x1d, 0x1d, 0x22, 0x26, 0x26, 0x26, 0x20, 0x22, 0x22, 0x22, 0x24, + 0x26, 0x26, 0x28, 0x2a, 0x28, 0x20, 0x22, 0x26, 0x26, 0x2a, 0x2a, 0x2a, + 0x28, 0x2a, 0x26, 0x24, 0x22, 0x28, 0x2a, 0x2a, 0x28, 0x2a, 0x2c, 0x2e, + 0x2c, 0x28, 0x26, 0x26, 0x26, 0x26, 0x2a, 0x28, 0x26, 0x26, 0x26, 0x22, + 0x1f, 0x24, 0x28, 0x2a, 0x2a, 0x22, 0x24, 0x26, 0x24, 0x20, 0x1f, 0x20, + 0x1f, 0x1d, 0x1d, 0x19, 0x1b, 0x1b, 0x1f, 0x1f, 0x1b, 0x15, 0x17, 0x1b, + 0x1f, 0x1b, 0x15, 0x13, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x11, 0x0d, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, 0x05, 0x03, 0x03, 0x03, 0x05, 0x09, + 0x09, 0x05, 0xff, 0xf9, 0xf7, 0xfd, 0x01, 0x01, 0x00, 0xff, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf5, 0xf5, 0xf9, 0xf9, 0xf5, 0xef, 0xef, 0xed, 0xf1, 0xf3, + 0xf1, 0xef, 0xeb, 0xe9, 0xe9, 0xeb, 0xeb, 0xeb, 0xe7, 0xe7, 0xe5, 0xe7, + 0xed, 0xeb, 0xe3, 0xe0, 0xe1, 0xe3, 0xe3, 0xe1, 0xe3, 0xe5, 0xe7, 0xe7, + 0xe1, 0xe0, 0xde, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe3, 0xe3, 0xe5, 0xe7, + 0xe3, 0xde, 0xde, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xdc, 0xe1, 0xe3, 0xe1, + 0xe3, 0xe1, 0xe1, 0xe0, 0xe0, 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xeb, 0xe7, + 0xe3, 0xe0, 0xe0, 0xe3, 0xe5, 0xe7, 0xe3, 0xe1, 0xe3, 0xe7, 0xed, 0xed, + 0xeb, 0xe9, 0xed, 0xed, 0xef, 0xed, 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, + 0xf3, 0xf5, 0xf5, 0xf3, 0xf1, 0xef, 0xef, 0xf1, 0xf5, 0xf5, 0xf3, 0xf1, + 0xed, 0xf1, 0xf5, 0xf9, 0xfd, 0xfd, 0xf7, 0xf3, 0xf3, 0xf7, 0xf9, 0xfb, + 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xf9, 0xfb, 0xfd, 0xff, 0xfd, 0xff, 0xfd, + 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xfd, 0xfd, 0x00, 0x01, 0x01, 0xff, 0xfd, + 0xfd, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0xff, 0x01, 0x01, 0x03, + 0x03, 0x00, 0x00, 0x01, 0x05, 0x05, 0x05, 0x03, 0x03, 0x05, 0x03, 0x01, + 0x03, 0x07, 0x09, 0x07, 0x03, 0x01, 0x05, 0x07, 0x09, 0x07, 0x05, 0x05, + 0x07, 0x0b, 0x09, 0x05, 0x03, 0x01, 0x03, 0x07, 0x09, 0x0b, 0x09, 0x09, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x07, 0x09, + 0x0b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x13, 0x13, 0x11, 0x0f, 0x0d, 0x0d, + 0x0f, 0x11, 0x11, 0x0f, 0x0d, 0x0f, 0x0f, 0x11, 0x0f, 0x11, 0x13, 0x0f, + 0x0f, 0x0f, 0x13, 0x13, 0x15, 0x13, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0d, + 0x13, 0x17, 0x13, 0x11, 0x11, 0x13, 0x15, 0x13, 0x13, 0x15, 0x15, 0x17, + 0x15, 0x11, 0x11, 0x15, 0x17, 0x15, 0x13, 0x15, 0x19, 0x19, 0x19, 0x15, + 0x13, 0x13, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x13, 0x13, 0x13, 0x13, + 0x11, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x13, 0x0f, + 0x0f, 0x17, 0x1d, 0x1b, 0x17, 0x15, 0x13, 0x15, 0x1b, 0x1b, 0x17, 0x17, + 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, 0x11, 0x13, 0x15, 0x17, 0x11, 0x0d, + 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0b, 0x09, 0x0b, 0x0f, 0x0d, 0x09, 0x09, + 0x07, 0x09, 0x0b, 0x0b, 0x09, 0x01, 0x00, 0x01, 0x03, 0x03, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf3, + 0xf3, 0xf5, 0xf7, 0xf5, 0xf1, 0xf1, 0xf3, 0xf3, 0xf1, 0xed, 0xeb, 0xe9, + 0xed, 0xed, 0xed, 0xeb, 0xe9, 0xe7, 0xe7, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe5, 0xe3, 0xe0, 0xe0, 0xe0, 0xe0, 0xde, 0xdc, 0xde, + 0xe0, 0xe0, 0xdc, 0xd8, 0xd8, 0xdc, 0xde, 0xda, 0xd8, 0xd8, 0xde, 0xe0, + 0xdc, 0xda, 0xda, 0xdc, 0xde, 0xe0, 0xde, 0xdc, 0xdc, 0xde, 0xde, 0xdc, + 0xdc, 0xde, 0xde, 0xdc, 0xdc, 0xdc, 0xde, 0xe1, 0xe3, 0xe1, 0xe0, 0xe0, + 0xde, 0xe0, 0xe0, 0xe1, 0xe3, 0xe5, 0xe1, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, + 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xe7, 0xe5, 0xe9, 0xed, 0xed, 0xe9, 0xe5, + 0xe3, 0xe7, 0xeb, 0xed, 0xeb, 0xeb, 0xeb, 0xe9, 0xeb, 0xed, 0xf1, 0xf1, + 0xf1, 0xef, 0xed, 0xeb, 0xed, 0xf1, 0xf3, 0xf1, 0xed, 0xed, 0xef, 0xf1, + 0xf5, 0xf3, 0xf3, 0xf5, 0xf5, 0xf5, 0xf7, 0xf7, 0xf9, 0xf9, 0xf9, 0xf9, + 0xfb, 0xfd, 0xfd, 0xff, 0xfd, 0xfb, 0xf9, 0xfd, 0xfd, 0xff, 0xfd, 0xfd, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x01, 0x01, 0x05, 0x07, 0x07, 0x09, 0x09, 0x05, 0x05, 0x01, 0x03, + 0x05, 0x07, 0x05, 0x05, 0x05, 0x07, 0x0b, 0x0d, 0x07, 0x05, 0x05, 0x07, + 0x0d, 0x0d, 0x0b, 0x09, 0x0d, 0x0f, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0d, 0x0f, 0x0f, 0x13, 0x17, 0x15, 0x11, 0x0f, 0x11, 0x13, 0x15, + 0x15, 0x17, 0x17, 0x19, 0x19, 0x19, 0x15, 0x11, 0x11, 0x15, 0x1b, 0x1f, + 0x1b, 0x17, 0x11, 0x15, 0x19, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, + 0x19, 0x19, 0x1b, 0x1f, 0x1f, 0x1d, 0x1d, 0x1d, 0x1b, 0x19, 0x1b, 0x1d, + 0x1d, 0x1b, 0x1d, 0x1f, 0x1f, 0x1f, 0x1d, 0x1b, 0x19, 0x19, 0x1b, 0x1b, + 0x1d, 0x1d, 0x1b, 0x1d, 0x1d, 0x1f, 0x1f, 0x19, 0x15, 0x17, 0x1b, 0x20, + 0x22, 0x1f, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x19, 0x17, + 0x17, 0x19, 0x19, 0x17, 0x15, 0x15, 0x17, 0x19, 0x17, 0x13, 0x11, 0x11, + 0x13, 0x15, 0x13, 0x0f, 0x0f, 0x0d, 0x09, 0x07, 0x09, 0x0d, 0x0f, 0x0f, + 0x0d, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x05, 0x05, 0x03, 0x05, 0x07, + 0x07, 0x03, 0x01, 0x00, 0x01, 0x03, 0x05, 0x05, 0x03, 0x00, 0xff, 0xff, + 0x00, 0x01, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, + 0xf9, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, 0xf9, 0xf9, 0xf9, 0xf7, 0xf5, 0xf1, + 0xf1, 0xf3, 0xf7, 0xf9, 0xf5, 0xf1, 0xf1, 0xf3, 0xf5, 0xf5, 0xf1, 0xef, + 0xef, 0xf1, 0xf1, 0xf1, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf1, 0xf3, + 0xf1, 0xef, 0xed, 0xeb, 0xeb, 0xeb, 0xef, 0xef, 0xed, 0xeb, 0xe7, 0xe9, + 0xe9, 0xeb, 0xed, 0xed, 0xeb, 0xe9, 0xeb, 0xeb, 0xe5, 0xe3, 0xe5, 0xe9, + 0xed, 0xed, 0xe7, 0xe1, 0xe1, 0xe5, 0xe7, 0xe7, 0xe7, 0xeb, 0xe9, 0xe5, + 0xe3, 0xe1, 0xe3, 0xe9, 0xeb, 0xe9, 0xe3, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe5, 0xe3, 0xe1, 0xe3, 0xe7, 0xe9, 0xe7, 0xe3, 0xe1, 0xe1, 0xe3, + 0xe5, 0xe5, 0xe3, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe3, 0xe3, 0xe7, 0xe9, + 0xed, 0xeb, 0xe9, 0xeb, 0xe9, 0xe7, 0xe5, 0xe5, 0xe9, 0xeb, 0xeb, 0xe9, + 0xeb, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xe7, 0xe9, 0xe9, 0xf1, 0xf7, + 0xf7, 0xf1, 0xeb, 0xeb, 0xf3, 0xf7, 0xf5, 0xf1, 0xef, 0xf1, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf5, 0xf7, 0xf7, 0xf3, 0xf3, 0xf5, 0xf9, 0xf9, 0xf7, 0xf7, + 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0x00, + 0x01, 0x00, 0xfd, 0xf9, 0xfb, 0xff, 0x01, 0x07, 0x09, 0x07, 0x03, 0xfd, + 0xf9, 0xfb, 0x03, 0x09, 0x07, 0x03, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, + 0x09, 0x07, 0x05, 0x05, 0x05, 0x0b, 0x0d, 0x0b, 0x07, 0x07, 0x0b, 0x0d, + 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x07, 0x0b, 0x0f, 0x11, 0x11, 0x0d, 0x0b, + 0x0b, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0f, 0x15, 0x17, 0x15, 0x0f, + 0x0b, 0x0f, 0x11, 0x13, 0x13, 0x15, 0x15, 0x15, 0x13, 0x11, 0x13, 0x19, + 0x1d, 0x19, 0x13, 0x0d, 0x11, 0x17, 0x19, 0x17, 0x13, 0x11, 0x17, 0x1d, + 0x1f, 0x19, 0x17, 0x15, 0x15, 0x17, 0x1d, 0x1f, 0x1f, 0x1b, 0x00, 0x00, + 0xff, 0xf6, 0x01, 0xff, 0xff, 0xf9, 0x01, 0xf6, 0x09, 0xff, 0xf1, 0x03, + 0x01, 0xfb, 0xfd, 0x02, 0xf3, 0x07, 0xfa, 0xdd, 0x16, 0xf0, 0xee, 0xf2, + 0x13, 0xf1, 0xf5, 0x01, 0xf6, 0xf9, 0xf9, 0x00, 0x01, 0xea, 0xfb, 0x10, + 0x09, 0x0b, 0x46, 0x14, 0xea, 0x27, 0x0a, 0xee, 0xdd, 0xff, 0x00, 0x0f, + 0x0a, 0x14, 0xf2, 0xfe, 0xe0, 0xfd, 0xd3, 0xbd, 0xcb, 0xe0, 0xcc, 0xb6, + 0xe1, 0xd4, 0xca, 0xdc, 0xd0, 0xe8, 0x09, 0x16, 0xf2, 0xdb, 0xf6, 0xf6, + 0x05, 0x14, 0x24, 0x35, 0x42, 0x48, 0x43, 0x42, 0x4c, 0x51, 0x54, 0x46, + 0x5d, 0x50, 0x28, 0x4c, 0x37, 0x28, 0x50, 0x48, 0x41, 0x09, 0x12, 0xdb, + 0xcc, 0xfb, 0xe9, 0x00, 0xee, 0xea, 0xf3, 0xf0, 0xc9, 0xe3, 0xbd, 0xb2, + 0xb0, 0xad, 0xb0, 0xb5, 0x9c, 0xb0, 0xb2, 0xb0, 0xa0, 0xa8, 0xd0, 0xc5, + 0xc7, 0xf2, 0xf6, 0xf1, 0xfe, 0x02, 0xee, 0x03, 0x09, 0x0e, 0x3f, 0x47, + 0x59, 0x42, 0x46, 0x62, 0x47, 0x4c, 0x30, 0x32, 0x20, 0x0e, 0xf1, 0xf9, + 0x09, 0xf5, 0xe8, 0x0a, 0xf9, 0xed, 0xd4, 0xc9, 0xc7, 0xc2, 0xba, 0xee, + 0xca, 0xb4, 0xb2, 0xb2, 0xa8, 0xb4, 0xc2, 0xc3, 0xd7, 0xd6, 0x03, 0x2d, + 0x1c, 0x41, 0x41, 0x30, 0x29, 0x4f, 0x48, 0x41, 0x51, 0x5e, 0x48, 0x51, + 0x50, 0x4b, 0x43, 0x37, 0x3a, 0x35, 0x31, 0x2a, 0x20, 0x16, 0x09, 0x02, + 0xfa, 0xf5, 0xe0, 0xd2, 0xf0, 0xd0, 0xbe, 0xaf, 0xca, 0xb0, 0x9a, 0xad, + 0xb5, 0xad, 0x9c, 0xcc, 0xc6, 0xcf, 0xd8, 0xd3, 0xb6, 0xbd, 0xd7, 0xdc, + 0xdb, 0xed, 0xf6, 0xe5, 0xf1, 0x0e, 0xfa, 0x0a, 0xfb, 0x06, 0x0f, 0x13, + 0x1a, 0x1b, 0x27, 0x32, 0x20, 0x3b, 0x3f, 0x36, 0x1f, 0x47, 0x37, 0x2d, + 0x36, 0x3d, 0x27, 0x25, 0x24, 0x05, 0x27, 0x1f, 0x06, 0xf7, 0xff, 0xe8, + 0xd6, 0xd8, 0xdf, 0xdb, 0xd8, 0xec, 0xc5, 0xcb, 0xd4, 0xc9, 0xb6, 0xdd, + 0xdc, 0xf1, 0xe5, 0xf1, 0x01, 0xf3, 0xf0, 0x06, 0xfe, 0x06, 0x09, 0x0b, + 0x1f, 0x2d, 0x27, 0x30, 0x37, 0x23, 0x29, 0x27, 0x2c, 0x20, 0x48, 0x25, + 0x03, 0x0d, 0xe6, 0xec, 0xdd, 0xd2, 0xf5, 0xd3, 0xcf, 0xd7, 0xd6, 0xc2, + 0xb2, 0xce, 0xc2, 0xc3, 0xdf, 0xf1, 0xe9, 0xee, 0xe5, 0xcf, 0x0a, 0xf6, + 0xf6, 0x06, 0x16, 0x0d, 0xf1, 0x2a, 0x0f, 0x16, 0x3a, 0x2e, 0x1c, 0x32, + 0x28, 0x2c, 0x0f, 0x27, 0x23, 0x1f, 0x02, 0x1f, 0x0a, 0x01, 0xfa, 0x0d, + 0xf3, 0xf2, 0x07, 0x05, 0x05, 0xf5, 0x0d, 0xfd, 0xf6, 0xf0, 0xf5, 0xe9, + 0xdf, 0xd7, 0xf2, 0xdf, 0xcb, 0xec, 0xe5, 0xe0, 0xfe, 0xe9, 0xf6, 0xf7, + 0xd9, 0xe0, 0xe1, 0xdf, 0xdf, 0xe6, 0xe9, 0xec, 0xed, 0xdd, 0xf3, 0x0b, + 0x0d, 0x03, 0x2a, 0x28, 0x28, 0x1c, 0x35, 0x29, 0x2e, 0x18, 0x25, 0x27, + 0x30, 0x1a, 0x27, 0x29, 0x1a, 0x0e, 0x0b, 0x14, 0x03, 0x09, 0xf6, 0xe4, + 0x02, 0xdd, 0xcc, 0xdb, 0xd9, 0xcc, 0xb0, 0xdf, 0xc7, 0xca, 0xc7, 0xd9, + 0xd2, 0xdc, 0xf3, 0xfa, 0xff, 0x06, 0x0f, 0x13, 0x05, 0x0a, 0x1c, 0xff, + 0x16, 0x17, 0x03, 0x0a, 0x30, 0x05, 0x1f, 0x23, 0x20, 0x0d, 0x2e, 0x1b, + 0x12, 0x03, 0x07, 0xfa, 0xf7, 0xf0, 0xe5, 0xdd, 0xdd, 0xe3, 0xe1, 0xd2, + 0xf3, 0xe4, 0xd0, 0xf0, 0xee, 0xf5, 0xea, 0x0e, 0xf2, 0xff, 0xed, 0xe6, + 0x09, 0xf6, 0xfb, 0xee, 0x1c, 0xfa, 0x01, 0x0f, 0x0b, 0x0a, 0x0b, 0x10, + 0x05, 0x00, 0x0a, 0x01, 0xfb, 0x00, 0x0b, 0x07, 0xf2, 0x1a, 0x01, 0x0d, + 0x02, 0x10, 0x17, 0x00, 0x18, 0x1a, 0x14, 0xfd, 0x1b, 0xf6, 0x07, 0x02, + 0xf6, 0x01, 0xfb, 0xf2, 0xd8, 0xf7, 0xdc, 0xdc, 0xe3, 0xdb, 0xc7, 0xfb, + 0xe3, 0xd8, 0xe3, 0xf1, 0xcf, 0xdd, 0xe8, 0xe1, 0xdc, 0xee, 0x01, 0xe6, + 0x03, 0x06, 0x07, 0x02, 0x27, 0x21, 0x27, 0x27, 0x30, 0x27, 0x1d, 0x2c, + 0x1a, 0xfe, 0x24, 0x12, 0x10, 0x06, 0x1b, 0x07, 0xff, 0x09, 0x03, 0xed, + 0xf9, 0xf9, 0xea, 0xd7, 0xec, 0xe3, 0xdd, 0xdb, 0xdc, 0xd7, 0xd3, 0xdb, + 0xe1, 0xe0, 0xf3, 0xfd, 0xff, 0xf9, 0x10, 0x01, 0xfe, 0x16, 0x10, 0x09, + 0x13, 0x02, 0x01, 0x1a, 0x07, 0xf6, 0x0d, 0x06, 0x06, 0x01, 0x0d, 0x03, + 0x0b, 0x09, 0xf5, 0xfd, 0xfd, 0x02, 0xfa, 0xf6, 0x06, 0xe6, 0x06, 0xf7, + 0xf0, 0x0a, 0xfe, 0xfb, 0x03, 0x0a, 0x0d, 0x0a, 0x07, 0xf9, 0x0f, 0xfb, + 0xf3, 0xf3, 0xee, 0xf0, 0xea, 0xdb, 0xf9, 0xea, 0xe3, 0xea, 0xfa, 0xea, + 0xf7, 0x01, 0x02, 0xe6, 0x02, 0xf5, 0xfa, 0xf9, 0xff, 0xf7, 0xfb, 0x14, + 0x0e, 0xff, 0x1d, 0x18, 0x1b, 0x1b, 0x0b, 0x2a, 0x20, 0x18, 0x0f, 0x18, + 0x0b, 0x02, 0x00, 0xfe, 0xfa, 0xfa, 0xe4, 0xfa, 0xe8, 0xf0, 0xe1, 0xe3, + 0xdf, 0xcc, 0xe4, 0xd8, 0xc7, 0xd9, 0xe4, 0xdb, 0xcc, 0xf6, 0xe1, 0xd9, + 0xfa, 0xf2, 0xf6, 0x00, 0x12, 0x03, 0x0e, 0x1b, 0x1a, 0x20, 0x13, 0x27, + 0x1f, 0x0d, 0x25, 0x17, 0x14, 0x13, 0x05, 0x07, 0x10, 0x06, 0x03, 0x18, + 0x0f, 0xff, 0x0d, 0x0a, 0x00, 0xfb, 0xe6, 0xfe, 0xf9, 0xf9, 0xf6, 0xea, + 0x01, 0xf0, 0xec, 0xe3, 0xfa, 0xf1, 0xed, 0xf5, 0xfe, 0x02, 0xee, 0xfd, + 0xf6, 0xf5, 0xf6, 0xec, 0xed, 0xf6, 0xf5, 0xec, 0xf0, 0x07, 0xfd, 0xf0, + 0x07, 0x01, 0xff, 0xf6, 0x07, 0x03, 0x01, 0x06, 0x07, 0x06, 0x06, 0x09, + 0xf3, 0x06, 0x17, 0x0a, 0x18, 0x16, 0x12, 0x0f, 0x05, 0x02, 0x01, 0xf5, + 0xfb, 0xfd, 0xf1, 0xf7, 0xf2, 0xea, 0xed, 0xed, 0xd8, 0xdc, 0xf0, 0xe0, + 0xec, 0xfd, 0xf2, 0xed, 0x0f, 0xf6, 0xea, 0xfd, 0xfd, 0x02, 0xf0, 0x0d, + 0x06, 0x07, 0xfd, 0x21, 0xfb, 0x10, 0x1c, 0x16, 0x09, 0x24, 0x1b, 0x18, + 0x01, 0x1d, 0x06, 0xfa, 0xf9, 0xf9, 0xee, 0xf1, 0xe8, 0xee, 0xf0, 0xf0, + 0xf5, 0xfd, 0xee, 0xe9, 0x01, 0xee, 0xec, 0xf2, 0xec, 0xd8, 0xf6, 0xec, + 0xea, 0xe5, 0x01, 0xf6, 0xf5, 0xff, 0x02, 0x06, 0x0f, 0x06, 0xfb, 0x12, + 0x01, 0xf7, 0x05, 0x09, 0x09, 0x0f, 0xf9, 0x10, 0x0e, 0x0b, 0xf7, 0x17, + 0x05, 0x00, 0x05, 0x0e, 0x05, 0x12, 0x0b, 0xfb, 0x14, 0x05, 0x0a, 0x00, + 0x05, 0x02, 0x00, 0xff, 0xfd, 0xfa, 0xf9, 0xf9, 0xe6, 0x06, 0xf9, 0xf7, + 0xe5, 0xff, 0xec, 0xdd, 0xf5, 0xf1, 0xdd, 0xe5, 0xea, 0xe9, 0xd8, 0xf9, + 0xf1, 0xee, 0xee, 0x0b, 0xea, 0xfe, 0x02, 0x01, 0xf2, 0x0f, 0x00, 0x0b, + 0x01, 0x05, 0x09, 0xf3, 0x0e, 0x0f, 0x0e, 0x00, 0x1f, 0x10, 0x0f, 0xfe, + 0x1d, 0x06, 0xf7, 0x01, 0x06, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xf7, 0xf3, + 0xfd, 0xf6, 0xf6, 0xf6, 0xf7, 0xed, 0xfb, 0xf2, 0xe9, 0xf6, 0x01, 0xfe, + 0xf1, 0x0a, 0xff, 0xed, 0x09, 0x00, 0xfb, 0xfd, 0x0b, 0x06, 0x0b, 0x12, + 0x0f, 0x0a, 0x0a, 0x09, 0x09, 0x00, 0xf3, 0x09, 0xee, 0xf6, 0xfb, 0xee, + 0xe5, 0x0a, 0xe8, 0xf3, 0x02, 0xfb, 0xed, 0x00, 0xfd, 0xf6, 0xea, 0xf7, + 0xee, 0xee, 0xf2, 0xee, 0xe8, 0xfe, 0xee, 0xed, 0xff, 0xfe, 0x02, 0xf5, + 0x0b, 0x03, 0x03, 0x0b, 0x06, 0x09, 0x06, 0x05, 0x03, 0x03, 0x03, 0x06, + 0xfb, 0x06, 0x12, 0x0a, 0xfe, 0x18, 0x07, 0xfd, 0x0f, 0x05, 0xfe, 0x01, + 0x07, 0x01, 0xfa, 0x0d, 0x00, 0xf0, 0x09, 0xff, 0x03, 0xf1, 0x0a, 0xfe, + 0xf3, 0xfd, 0xf7, 0xfe, 0xe4, 0x00, 0xf3, 0xe4, 0xf9, 0xec, 0xf0, 0xee, + 0xee, 0xee, 0xf0, 0xf0, 0xf5, 0xfe, 0xff, 0xe6, 0x0a, 0xff, 0xfd, 0x02, + 0x0b, 0xff, 0xfd, 0x06, 0x00, 0xff, 0xfd, 0x01, 0xff, 0x06, 0x0a, 0x0e, + 0x00, 0x10, 0x07, 0x0f, 0x05, 0xf5, 0x07, 0xfa, 0x00, 0xe9, 0xfa, 0xf2, + 0xf6, 0xe0, 0xf3, 0xf2, 0xf7, 0xe8, 0x0a, 0xfe, 0xfd, 0xf7, 0x05, 0xf9, + 0x01, 0x09, 0xfa, 0x06, 0x13, 0x00, 0x05, 0x16, 0x0a, 0x00, 0x0f, 0x06, + 0x0b, 0x0b, 0x0a, 0xfb, 0x13, 0x03, 0xfb, 0xff, 0xfd, 0x00, 0xf2, 0xec, + 0xfa, 0xf1, 0xe6, 0xec, 0xf9, 0xec, 0xe0, 0xf7, 0xec, 0xf1, 0xf2, 0xf6, + 0xf3, 0xff, 0x05, 0x02, 0xf7, 0x07, 0x01, 0x01, 0x02, 0x0a, 0xfa, 0x06, + 0x12, 0x02, 0xf5, 0x13, 0x02, 0xff, 0xfd, 0x07, 0xf7, 0xf3, 0xf5, 0xee, + 0xf1, 0xf1, 0xf0, 0xed, 0xff, 0xf9, 0xf9, 0xff, 0x01, 0xff, 0x09, 0x09, + 0xff, 0x02, 0x09, 0xff, 0x05, 0x06, 0x0a, 0xfa, 0x0a, 0x0d, 0x07, 0xfd, + 0x17, 0x05, 0x09, 0xfe, 0xf7, 0x0b, 0xf9, 0xe8, 0xfe, 0xf5, 0xf2, 0xe8, + 0xf5, 0xec, 0xf5, 0xe8, 0xf6, 0xf7, 0xf6, 0xf9, 0xfa, 0x01, 0xee, 0x06, + 0x09, 0x01, 0x0d, 0x16, 0x0d, 0xfd, 0x17, 0x0d, 0x03, 0x09, 0x13, 0x09, + 0xfa, 0x0f, 0x06, 0x02, 0xfd, 0x05, 0xf9, 0xf9, 0xf5, 0xf2, 0xe3, 0xec, + 0xe5, 0xe5, 0xe6, 0xed, 0xdb, 0xee, 0xf7, 0xec, 0xfb, 0x00, 0xff, 0xf3, + 0x0a, 0x05, 0x03, 0x01, 0x14, 0x06, 0x09, 0x0a, 0x07, 0x0b, 0x06, 0x06, + 0x07, 0x09, 0x06, 0x05, 0xf7, 0x02, 0x02, 0xfa, 0xf5, 0x02, 0xf5, 0xf6, + 0xf3, 0xf5, 0xf7, 0xfb, 0x00, 0xf3, 0xff, 0x07, 0xfd, 0xf7, 0x05, 0xff, + 0xfb, 0xff, 0x02, 0x06, 0xfd, 0x03, 0x09, 0x03, 0xff, 0xfa, 0x02, 0xfa, + 0xee, 0xf6, 0xf9, 0xea, 0xf1, 0xf0, 0xea, 0xf1, 0xed, 0xe6, 0xf1, 0xec, + 0xf0, 0xf2, 0xf0, 0xf9, 0xf7, 0xf5, 0x03, 0x02, 0xfa, 0x14, 0x12, 0x14, + 0x0b, 0x2d, 0x16, 0x1a, 0x0f, 0x1f, 0x0d, 0x09, 0x10, 0x0b, 0x06, 0x05, + 0x02, 0xfd, 0xfd, 0xf9, 0xf5, 0xe1, 0xf7, 0xee, 0xf1, 0xdc, 0xf2, 0xea, + 0xe8, 0xe1, 0xf2, 0xea, 0xf7, 0xee, 0xf3, 0x00, 0xff, 0xf6, 0x0e, 0x06, + 0x07, 0xff, 0x1a, 0x0d, 0x02, 0x13, 0x0f, 0x00, 0x09, 0x0d, 0xfb, 0xfd, + 0x01, 0xf9, 0xf1, 0xfd, 0xf9, 0xfe, 0xf0, 0xf5, 0xfd, 0xf6, 0xe5, 0xf6, + 0xf1, 0xe3, 0xfb, 0xf6, 0xed, 0x09, 0x00, 0xfd, 0x03, 0x07, 0xfa, 0x06, + 0x09, 0x00, 0x0e, 0x0b, 0x0b, 0x0a, 0xfe, 0x0f, 0x01, 0xf6, 0x01, 0xf9, + 0xf7, 0xf6, 0xed, 0xfb, 0xf3, 0xf2, 0xe6, 0xf7, 0xf1, 0xee, 0xf1, 0xf9, + 0xec, 0xf7, 0xfd, 0xf6, 0xfd, 0x00, 0x06, 0xf9, 0x06, 0x1a, 0x13, 0x07, + 0x24, 0x1a, 0x0d, 0x1b, 0x0f, 0x09, 0xfb, 0x0a, 0xfe, 0xfa, 0xf6, 0xf9, + 0xe4, 0xf5, 0xf5, 0xec, 0xdf, 0xf1, 0xe5, 0xea, 0xd9, 0xf3, 0xed, 0xed, + 0xe3, 0xfe, 0xf3, 0xfa, 0xfd, 0xf7, 0x09, 0x09, 0x0b, 0x06, 0x17, 0x0b, + 0x0e, 0x13, 0x0f, 0x0e, 0x14, 0x12, 0x03, 0x17, 0x0e, 0x06, 0x01, 0x0b, + 0xff, 0xea, 0xff, 0xf2, 0xf1, 0xe1, 0xfd, 0xee, 0xea, 0xf1, 0xfb, 0xf0, + 0xe8, 0xff, 0xf5, 0xee, 0xfd, 0x03, 0xf0, 0x05, 0x03, 0x06, 0xff, 0x13, + 0x03, 0x0f, 0x0a, 0x05, 0x13, 0x0a, 0x02, 0x00, 0x00, 0xf7, 0xf9, 0xf9, + 0xf3, 0xdc, 0x03, 0xee, 0xf0, 0xf0, 0xfb, 0xf1, 0xed, 0xfe, 0xf6, 0xfd, + 0xfe, 0xf2, 0x03, 0x03, 0x09, 0xfa, 0x0e, 0x09, 0x0d, 0x05, 0x05, 0x17, + 0x09, 0xff, 0x0e, 0x09, 0xf7, 0x03, 0xfd, 0xfa, 0xee, 0xf9, 0xf2, 0xec, + 0xed, 0xee, 0xe6, 0xdc, 0xfa, 0xe4, 0xea, 0xe0, 0xf7, 0xf3, 0xf6, 0xfd, + 0x06, 0x05, 0x07, 0x00, 0x0a, 0x10, 0x07, 0x07, 0x16, 0x13, 0x0a, 0x14, + 0x18, 0x13, 0x17, 0x1d, 0x0a, 0x09, 0x16, 0x05, 0xf6, 0xff, 0xf6, 0xf3, + 0xe5, 0xea, 0xee, 0xea, 0xec, 0xf0, 0xe3, 0xf1, 0xf2, 0xe8, 0xee, 0xfd, + 0xf7, 0xf9, 0xee, 0xff, 0xfa, 0xf9, 0xf6, 0x01, 0x01, 0xff, 0x0b, 0x0a, + 0x03, 0x05, 0x0f, 0x02, 0x00, 0x09, 0x05, 0x02, 0x01, 0x00, 0x01, 0xf5, + 0xf3, 0x01, 0xf1, 0xf1, 0xfd, 0xfe, 0xf6, 0xfb, 0x06, 0x01, 0x02, 0x01, + 0x0a, 0xff, 0x02, 0x0e, 0x06, 0xff, 0x06, 0x0f, 0xff, 0x00, 0x0e, 0xfd, + 0xfe, 0xff, 0xfe, 0xfd, 0x01, 0xf2, 0xf7, 0xfb, 0xf2, 0xe8, 0xed, 0xea, + 0xee, 0xe9, 0xee, 0xf5, 0xf1, 0xf0, 0xfd, 0xfa, 0xed, 0x0b, 0x03, 0x06, + 0xfe, 0x14, 0x0a, 0x02, 0x10, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x09, 0x07, + 0xff, 0x0b, 0x03, 0xff, 0xf7, 0x0b, 0xfb, 0xea, 0xff, 0xf0, 0xe1, 0xf0, + 0xe9, 0xf2, 0xe8, 0xf1, 0xf2, 0xed, 0xf5, 0xfd, 0xf6, 0xf7, 0xfe, 0x00, + 0x03, 0xf5, 0x16, 0x07, 0x06, 0xfd, 0x13, 0x09, 0x01, 0x0b, 0x0d, 0x10, + 0x09, 0x01, 0x0f, 0xf9, 0x03, 0xfa, 0xf6, 0x02, 0xf6, 0xfa, 0xf7, 0xfa, + 0xf5, 0xe5, 0x0b, 0xed, 0xfb, 0xf5, 0xf9, 0xfd, 0xfe, 0xfd, 0xff, 0x01, + 0x01, 0x02, 0x03, 0x03, 0x02, 0x02, 0x05, 0xf3, 0x0a, 0xfe, 0xf5, 0x02, + 0xfb, 0xfb, 0xed, 0x05, 0xf6, 0xf3, 0xff, 0xf3, 0xf9, 0xf7, 0xf3, 0xf1, + 0xf5, 0xf3, 0xf2, 0xf7, 0xf9, 0xf6, 0xf2, 0x0f, 0x01, 0xf6, 0x0b, 0x07, + 0x0b, 0x07, 0x02, 0x16, 0x09, 0xff, 0x06, 0x07, 0x07, 0x05, 0xfb, 0x07, + 0xfe, 0x05, 0xfa, 0xed, 0x02, 0xee, 0xf3, 0xf3, 0xec, 0xf2, 0xf2, 0xec, + 0xf5, 0xf3, 0xf5, 0xf3, 0xf9, 0x00, 0xfb, 0xf1, 0x09, 0x01, 0x06, 0xfe, + 0x07, 0x14, 0x09, 0x05, 0x13, 0x0e, 0x07, 0x0a, 0x0b, 0x00, 0x05, 0xff, + 0x00, 0x01, 0xf5, 0xfd, 0xfd, 0xf5, 0xfa, 0xfa, 0xf9, 0xf3, 0xed, 0x00, + 0xf1, 0xe8, 0xf5, 0xf5, 0xf3, 0xf6, 0xfb, 0xf1, 0xff, 0xfe, 0xfb, 0xff, + 0x01, 0x03, 0x01, 0x05, 0x00, 0x02, 0x02, 0xf6, 0x06, 0x03, 0x03, 0x01, + 0x09, 0x03, 0x09, 0xf6, 0xff, 0x01, 0xfb, 0xf0, 0x03, 0xfd, 0xf6, 0x00, + 0xfb, 0xfd, 0xf5, 0x0a, 0xf5, 0xf3, 0x09, 0xf2, 0xf7, 0x00, 0xfb, 0xf0, + 0xff, 0xfb, 0xfe, 0xfd, 0xf7, 0xff, 0x01, 0xf9, 0xfe, 0x01, 0xea, 0x02, + 0xfb, 0xf7, 0xf3, 0xfd, 0xf7, 0xed, 0xfe, 0xfd, 0xfe, 0xf9, 0x01, 0xfb, + 0x02, 0xff, 0xff, 0x06, 0x02, 0x07, 0x09, 0x09, 0x09, 0x07, 0x0b, 0x07, + 0x05, 0x07, 0x06, 0x05, 0x05, 0x05, 0x03, 0xfb, 0x03, 0xfd, 0xfb, 0xf0, + 0x00, 0xf7, 0xff, 0xec, 0xf6, 0xf7, 0xf7, 0xf5, 0xf3, 0x02, 0xfa, 0xf2, + 0xfe, 0xfa, 0xfe, 0xfe, 0xf3, 0x06, 0xfe, 0x02, 0xff, 0xf6, 0x06, 0xfe, + 0xf9, 0x00, 0x06, 0x02, 0x06, 0xfe, 0xff, 0x06, 0x02, 0xf7, 0x01, 0x02, + 0xfe, 0xf1, 0xff, 0xf9, 0xf9, 0xea, 0x00, 0xf7, 0xf0, 0xf9, 0xfb, 0xf9, + 0xf1, 0x03, 0xf9, 0xee, 0x03, 0xfa, 0xfa, 0xf5, 0x03, 0xfb, 0xf2, 0x05, + 0xfe, 0x01, 0xf5, 0x0a, 0x01, 0x03, 0x01, 0x03, 0x05, 0x01, 0x03, 0x05, + 0x03, 0xf3, 0x13, 0xfd, 0xff, 0x06, 0x03, 0x05, 0x00, 0x06, 0x06, 0x06, + 0x05, 0x03, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x0a, + 0xfe, 0xfa, 0xfa, 0xfd, 0xfd, 0xf3, 0xf6, 0xff, 0xf6, 0xf3, 0xf3, 0xf5, + 0xec, 0xfe, 0xf6, 0xee, 0xff, 0xf6, 0xf5, 0xed, 0x00, 0xf5, 0xf0, 0xf6, + 0xfa, 0xf7, 0xf6, 0xf9, 0xfe, 0xfe, 0xfa, 0xfb, 0x0d, 0x01, 0xfa, 0x01, + 0x09, 0x02, 0x03, 0x05, 0x05, 0x06, 0x06, 0x02, 0xff, 0x0d, 0x05, 0xfe, + 0x02, 0x01, 0x01, 0xff, 0xf9, 0x03, 0xff, 0xf5, 0xfd, 0x00, 0xfe, 0xf3, + 0x09, 0xff, 0xf7, 0x02, 0xfe, 0xfd, 0xf2, 0x07, 0xfe, 0xf6, 0x02, 0x00, + 0xfa, 0xfa, 0x0a, 0xff, 0xf5, 0x07, 0x00, 0xfd, 0xfa, 0x07, 0xff, 0xf5, + 0x07, 0xff, 0x00, 0xfa, 0x03, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf0, 0xfa, + 0xfb, 0xf9, 0xed, 0xff, 0xf6, 0xf7, 0xf9, 0xfe, 0xf9, 0xfd, 0xfb, 0xfe, + 0xe8, 0x05, 0xfb, 0xfd, 0xfb, 0xf3, 0x09, 0xff, 0xf6, 0x06, 0x00, 0x00, + 0xf5, 0x07, 0xfe, 0xfb, 0xff, 0xfe, 0xf5, 0xfd, 0x02, 0xfa, 0xfb, 0x00, + 0x01, 0x03, 0xfa, 0x05, 0x02, 0xfd, 0x00, 0x02, 0xfb, 0xfd, 0x02, 0x01, + 0xff, 0xff, 0x0a, 0xf7, 0x00, 0x0d, 0x03, 0xf9, 0x09, 0x02, 0xff, 0xfd, + 0x06, 0x00, 0xf9, 0xfb, 0x06, 0xf9, 0xfa, 0x01, 0xfb, 0xf2, 0xfb, 0xff, + 0xf5, 0xee, 0x01, 0xf6, 0xec, 0xfd, 0xf6, 0xf7, 0xed, 0xfe, 0xf7, 0xfa, + 0xf9, 0xf9, 0xf9, 0xfa, 0xf9, 0xfa, 0xfd, 0xff, 0xff, 0x02, 0xf5, 0xff, + 0x09, 0xff, 0x02, 0x02, 0xff, 0xfb, 0xff, 0xff, 0x00, 0xfd, 0xff, 0x09, + 0xf3, 0x03, 0x01, 0x03, 0xf3, 0x06, 0x01, 0xfe, 0xfb, 0x0a, 0xfd, 0x02, + 0x09, 0x02, 0xfe, 0x02, 0x03, 0x03, 0x02, 0xfa, 0x0a, 0xfb, 0xfa, 0xfd, + 0x02, 0xf7, 0xf6, 0x05, 0xfa, 0xf0, 0x00, 0xfa, 0xfb, 0xf0, 0x02, 0xfa, + 0xfd, 0xf3, 0xff, 0xfe, 0xfe, 0xf5, 0x02, 0xfe, 0xfe, 0xfe, 0x02, 0xff, + 0xff, 0x02, 0xfe, 0xf6, 0x0e, 0x00, 0xf7, 0x02, 0x01, 0xfa, 0xf3, 0x01, + 0xfa, 0xf9, 0xf3, 0xfe, 0xf3, 0xf1, 0x01, 0xf1, 0xf3, 0xfa, 0xf7, 0xf3, + 0xf2, 0x05, 0xf2, 0xf0, 0x06, 0xfe, 0xff, 0xfe, 0x02, 0x05, 0x06, 0x02, + 0x0f, 0x09, 0x0a, 0x07, 0x0b, 0x0b, 0x0a, 0x0d, 0x09, 0x01, 0x14, 0x07, + 0xff, 0x07, 0x02, 0x00, 0xf3, 0xff, 0xfa, 0xfa, 0xf5, 0xf7, 0xf7, 0xf6, + 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf9, 0xfa, 0xe9, 0x01, 0xfb, 0xfb, 0xf6, + 0x01, 0xfb, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xf7, 0xff, 0xff, 0xff, 0xf3, 0x02, 0xfd, 0xf7, 0xfe, 0xfd, 0x02, 0xf5, + 0xfd, 0x00, 0xfe, 0xf3, 0x01, 0x00, 0x00, 0xf5, 0x09, 0x01, 0xff, 0x02, + 0x05, 0xf5, 0x07, 0x02, 0x02, 0xfa, 0x09, 0x00, 0xfa, 0xff, 0xff, 0xfe, + 0xfd, 0xfd, 0xfa, 0xfb, 0xfb, 0xf9, 0xed, 0xff, 0xf2, 0xf6, 0xf6, 0xf5, + 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0x00, 0xfd, 0x09, 0x03, 0x05, 0x02, + 0x0b, 0xfd, 0x06, 0x02, 0x02, 0x03, 0x02, 0x02, 0xfe, 0x00, 0xff, 0xf9, + 0xf7, 0xff, 0xf7, 0xf1, 0xf3, 0xf7, 0xf5, 0xec, 0xf5, 0xfb, 0xf0, 0xf7, + 0xf7, 0xf9, 0xfa, 0xfb, 0xfd, 0xf7, 0xfe, 0x03, 0xff, 0xfe, 0x03, 0x05, + 0x06, 0x07, 0x0a, 0x0a, 0x0a, 0x09, 0xff, 0x09, 0x03, 0x02, 0x02, 0x01, + 0x00, 0x00, 0x03, 0xf3, 0x02, 0xff, 0xfe, 0xf5, 0x02, 0xfd, 0xf7, 0x00, + 0xfa, 0xff, 0xf9, 0xfb, 0x00, 0xf7, 0xfe, 0xff, 0xff, 0xf3, 0x09, 0xfe, + 0xf6, 0x00, 0xfd, 0xfb, 0xf0, 0x05, 0xf9, 0xf1, 0xfd, 0xf6, 0xff, 0xf0, + 0xf6, 0xf9, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0xf9, 0xfb, 0xfd, 0xfb, 0xfb, + 0x07, 0xfb, 0x02, 0x07, 0x07, 0x03, 0x09, 0x0a, 0x0a, 0x03, 0x09, 0x09, + 0x09, 0x06, 0x02, 0x03, 0x02, 0x01, 0x00, 0xfd, 0xed, 0x02, 0xf3, 0xf9, + 0xec, 0xf7, 0xf6, 0xed, 0xf6, 0xf6, 0xf5, 0xea, 0x01, 0xf5, 0xf3, 0xff, + 0xf7, 0xfb, 0xfe, 0x00, 0xf9, 0x03, 0x07, 0x05, 0x01, 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0d, 0x03, 0x01, 0x05, 0x01, 0xfb, 0xf9, 0x07, 0xfa, 0xf9, + 0xff, 0xfb, 0xf5, 0xf9, 0xfd, 0xee, 0xf6, 0xfe, 0xf7, 0xee, 0xf7, 0xfa, + 0xf7, 0xf3, 0x05, 0xf7, 0xf3, 0x06, 0xf3, 0xfe, 0xfe, 0xff, 0x00, 0xfd, + 0xf7, 0x0a, 0xf9, 0xff, 0xfa, 0xfe, 0x00, 0xfe, 0xfb, 0xfd, 0xfe, 0xfe, + 0xfd, 0xf7, 0x00, 0xfe, 0xff, 0xf7, 0x05, 0x02, 0xfe, 0x05, 0x06, 0x06, + 0x01, 0x03, 0x0d, 0x07, 0xfd, 0x07, 0x07, 0x06, 0xfa, 0x06, 0x03, 0xfd, + 0x00, 0x01, 0xfe, 0xf3, 0x02, 0xf7, 0xed, 0xfb, 0xf5, 0xf1, 0xed, 0xf9, + 0xf2, 0xe9, 0xf6, 0xf3, 0xf9, 0xf6, 0xed, 0x03, 0xf7, 0xfd, 0xfe, 0x03, + 0xff, 0x02, 0x03, 0x05, 0x03, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, + 0xf9, 0x14, 0xfd, 0xff, 0x02, 0xfe, 0xf2, 0x02, 0xfa, 0xf9, 0xec, 0x02, + 0xf1, 0xec, 0xfb, 0xf5, 0xf5, 0xf0, 0xfe, 0xf3, 0xee, 0xfe, 0xfa, 0xfe, + 0xf3, 0x07, 0x00, 0xfd, 0x06, 0x03, 0x00, 0x00, 0x09, 0x03, 0xfa, 0x0a, + 0x02, 0x03, 0xf7, 0x07, 0x00, 0x01, 0xfa, 0xff, 0x02, 0xfe, 0xfe, 0xf5, + 0x05, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0x00, 0xf6, 0x03, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xfd, 0xf3, 0xfd, 0xff, 0xf3, 0xfb, + 0xfb, 0xfa, 0xf1, 0x02, 0xf3, 0xee, 0xfb, 0xf5, 0xf5, 0xf2, 0xff, 0xf6, + 0xf0, 0xff, 0xfa, 0x00, 0xf5, 0x05, 0x03, 0x03, 0xfe, 0x0e, 0x09, 0x03, + 0x0a, 0x10, 0x00, 0x0b, 0x0a, 0x0d, 0xfe, 0x0a, 0x06, 0x06, 0xf9, 0x07, + 0xff, 0xfe, 0xf1, 0x03, 0xf5, 0xf7, 0xf5, 0xf5, 0xf3, 0xf3, 0xf5, 0xf6, + 0xe5, 0xf9, 0xf5, 0xf2, 0xf3, 0xfe, 0xf7, 0xf3, 0x03, 0xff, 0x01, 0x01, + 0x03, 0x05, 0x03, 0xfa, 0x0a, 0x03, 0x05, 0x03, 0x02, 0xff, 0x05, 0x01, + 0xf7, 0x0d, 0x00, 0x00, 0xfd, 0x01, 0xfd, 0xff, 0xf5, 0xf6, 0x00, 0xfb, + 0xf9, 0xf7, 0x05, 0xfa, 0xfd, 0xfe, 0xfd, 0xfa, 0x00, 0xfe, 0xf5, 0x00, + 0xfe, 0xfe, 0xf2, 0x02, 0xfe, 0xfb, 0xfe, 0xff, 0xfe, 0xf7, 0x02, 0xfd, + 0xf5, 0x01, 0xfd, 0xfb, 0xf0, 0x01, 0xfb, 0xfe, 0xf6, 0x02, 0x00, 0x01, + 0xfe, 0x01, 0x03, 0x02, 0x03, 0x07, 0x00, 0x05, 0x09, 0x05, 0x05, 0x05, + 0x07, 0xfa, 0x06, 0x06, 0xff, 0xf9, 0x05, 0xff, 0xf9, 0xf5, 0xfe, 0xf7, + 0xf6, 0xf0, 0xfe, 0xf5, 0xf0, 0xf5, 0xf9, 0xf2, 0xf5, 0xfb, 0xec, 0xf9, + 0xfd, 0xfb, 0xf2, 0x06, 0xff, 0xfd, 0xfe, 0x07, 0x03, 0xfd, 0x05, 0x05, + 0x03, 0xfe, 0x06, 0x02, 0x02, 0x01, 0x01, 0xff, 0xff, 0xfe, 0xfe, 0xfd, + 0xfd, 0xfd, 0xfd, 0xfe, 0xf2, 0xfd, 0xff, 0xfd, 0xf6, 0x01, 0xf5, 0x00, + 0xfe, 0xfe, 0xf7, 0xfd, 0x00, 0xfe, 0xfe, 0xf9, 0x07, 0xfe, 0x01, 0x03, + 0x03, 0xfe, 0xff, 0x0a, 0xff, 0xf9, 0x0a, 0xf9, 0xfd, 0xfd, 0xfa, 0xfa, + 0xfa, 0xfb, 0xfa, 0xf0, 0x0b, 0xf6, 0xf6, 0x01, 0xfd, 0xfb, 0xf9, 0x00, + 0xfd, 0xfd, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x01, 0xfe, 0x00, 0x06, 0x00, + 0xf7, 0x02, 0xff, 0xff, 0xf6, 0x05, 0xfe, 0xf8, 0x00, 0xfc, 0x00, 0xf4, + 0x00, 0x00, 0xf7, 0xff, 0x00, 0xff, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0xfc, 0x09, 0x00, + 0x01, 0x00, 0xf7, 0x06, 0xfc, 0x00, 0xf9, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, + 0xfb, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0xf9, 0xf8, 0x00, 0xf5, 0xfc, 0xfc, + 0xff, 0xf8, 0x00, 0x00, 0xfc, 0x00, 0x01, 0x00, 0xf8, 0x04, 0x00, 0x00, + 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x03, 0xfe, 0xfd, 0x00, 0xff, 0xfc, 0xfe, + 0x00, 0xfe, 0xf9, 0x05, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0x00, 0xf7, 0x02, + 0x00, 0xfe, 0x00, 0x01, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x01, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x03, + 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0xfa, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, + 0xfb, 0xff, 0xfc, 0xfc, 0xfd, 0xfc, 0xfd, 0xfc, 0xfd, 0xfd, 0xf9, 0x00, + 0xfc, 0xfe, 0xfb, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x00, 0x05, 0x00, 0xfe, 0x05, 0x00, 0xff, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x01, 0xfe, 0xff, 0xff, 0x00, + 0xfd, 0xfd, 0x00, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfd, 0x01, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xf8, 0xfc, 0x06, + 0x25, 0x29, 0x21, 0xe6, 0xcb, 0x1b, 0x37, 0x30, 0x07, 0x01, 0xc7, 0x02, + 0x08, 0xe2, 0x07, 0xdf, 0x48, 0x3e, 0xf7, 0xb2, 0x09, 0x2e, 0x5e, 0x5d, + 0x0e, 0xff, 0xd8, 0x07, 0xd8, 0x0d, 0xe3, 0x06, 0xbb, 0xee, 0x52, 0x5d, + 0x01, 0xce, 0xfa, 0x31, 0x11, 0x7a, 0x54, 0x1f, 0x05, 0x0e, 0x1e, 0x18, + 0x12, 0xc7, 0xaf, 0xb1, 0xb0, 0xb5, 0xd4, 0xb7, 0xb3, 0xc2, 0xc7, 0xe1, + 0xc9, 0xc2, 0xc3, 0x10, 0x18, 0x13, 0xe5, 0xe4, 0xc9, 0xf0, 0xee, 0xf2, + 0xd0, 0x9f, 0xc9, 0xff, 0xe8, 0x0f, 0xf7, 0xe2, 0x03, 0x06, 0xfb, 0xfa, + 0x25, 0x29, 0xf3, 0xa5, 0xc6, 0xc7, 0x28, 0xdb, 0xcd, 0xea, 0xe3, 0xdb, + 0xe7, 0xc0, 0x9f, 0xe4, 0xcd, 0xf3, 0xef, 0xc4, 0xf8, 0xdb, 0x28, 0x1c, + 0x1e, 0x2a, 0x3c, 0x40, 0x12, 0x10, 0x32, 0x14, 0xed, 0xfa, 0xbe, 0xd7, + 0xf0, 0xf9, 0xd4, 0xed, 0xe8, 0x0e, 0x1a, 0x29, 0xf4, 0x21, 0x43, 0x2c, + 0x54, 0x45, 0x25, 0x01, 0xef, 0xff, 0x10, 0xf7, 0xfe, 0x1a, 0x55, 0x60, + 0x43, 0x70, 0x51, 0x5d, 0x26, 0x5e, 0x4e, 0x3e, 0x3e, 0x05, 0x00, 0x27, + 0x4d, 0x6a, 0x29, 0x05, 0xf2, 0x04, 0xf1, 0x58, 0x42, 0x4b, 0x49, 0x2c, + 0x2a, 0x27, 0x35, 0x2e, 0x48, 0x09, 0x10, 0x1b, 0xe5, 0xef, 0xc7, 0xc7, + 0xf8, 0x16, 0x11, 0x2c, 0x32, 0x4d, 0x3c, 0x42, 0x5b, 0x3d, 0x45, 0x09, + 0xdf, 0xd8, 0xef, 0xcb, 0xc4, 0xf4, 0x08, 0x07, 0xf1, 0xdc, 0xd0, 0xd8, + 0xf0, 0xfc, 0xdb, 0xde, 0xd8, 0xf1, 0x40, 0x30, 0xde, 0xea, 0xe8, 0xc7, + 0xb2, 0xcd, 0xbc, 0xdf, 0xd0, 0xed, 0xfc, 0xde, 0xd9, 0xbc, 0xcf, 0xe4, + 0xfd, 0xf7, 0xe3, 0xec, 0xd3, 0xd6, 0xcf, 0xcf, 0xc0, 0xa8, 0xb3, 0xb2, + 0xd8, 0xf1, 0x09, 0x10, 0x0f, 0x11, 0x0d, 0xf8, 0xda, 0xed, 0xdc, 0xf1, + 0xf0, 0x0d, 0xff, 0xe3, 0xea, 0xcf, 0xc4, 0xd3, 0xd4, 0xcd, 0xd6, 0xbe, + 0xf7, 0xf8, 0x03, 0xfa, 0xef, 0xc8, 0xc0, 0xc6, 0xd0, 0xd0, 0xd9, 0xde, + 0xf2, 0x1d, 0x1e, 0x2a, 0x1f, 0x08, 0x03, 0xe4, 0xbb, 0xb7, 0xbe, 0xc3, + 0xe1, 0xf9, 0xf7, 0xe3, 0xd0, 0xc8, 0xcd, 0xcd, 0xde, 0xf0, 0x0c, 0x27, + 0x32, 0x30, 0x25, 0x0d, 0x18, 0x26, 0x43, 0x3e, 0x34, 0x1e, 0x19, 0xff, + 0x07, 0x12, 0xfc, 0xf2, 0xf7, 0x04, 0xfa, 0xfd, 0xfa, 0x18, 0x0d, 0x12, + 0x07, 0x11, 0x1b, 0x2a, 0x31, 0x31, 0x30, 0x27, 0x18, 0x1a, 0xfb, 0x0d, + 0x26, 0x45, 0x3c, 0x38, 0x26, 0x06, 0xfa, 0xf2, 0xe8, 0xdc, 0xf1, 0xfc, + 0x09, 0x13, 0x1b, 0x31, 0x55, 0x5a, 0x5e, 0x43, 0x29, 0x1c, 0x1c, 0x10, + 0x16, 0x1c, 0x22, 0x1b, 0x22, 0x0c, 0x1e, 0x01, 0xf2, 0xf1, 0xf9, 0xf2, + 0xfe, 0x16, 0x21, 0x1c, 0x43, 0x46, 0x44, 0x46, 0x27, 0xfd, 0xe1, 0xe5, + 0xfb, 0x07, 0x1e, 0x25, 0x1e, 0x22, 0xfe, 0xe2, 0xe5, 0xff, 0xef, 0xed, + 0x06, 0x22, 0x28, 0x3a, 0x34, 0x24, 0x12, 0xf4, 0xda, 0xd7, 0xd0, 0xdc, + 0xef, 0xea, 0x0d, 0x0c, 0x08, 0x1c, 0x16, 0xfc, 0xf8, 0xf9, 0x0d, 0x26, + 0x26, 0x32, 0x33, 0x32, 0x16, 0xf0, 0xd8, 0xde, 0xdf, 0xbe, 0xb7, 0xc9, + 0xcc, 0xd6, 0xd4, 0xd4, 0xe5, 0xf0, 0xf9, 0xf8, 0xf9, 0xf9, 0xe8, 0xe7, + 0xf2, 0xff, 0xfc, 0xf1, 0xea, 0xe6, 0xdb, 0xe1, 0xf1, 0xf8, 0xf0, 0x01, + 0x01, 0xf2, 0xf3, 0xfc, 0xef, 0xef, 0xf2, 0xf7, 0xe7, 0xc7, 0xcc, 0xd6, + 0xbc, 0xc2, 0xcb, 0xc8, 0xba, 0xd4, 0xf9, 0xf7, 0xee, 0xff, 0xf8, 0xf0, + 0xe2, 0xd9, 0xcf, 0xbc, 0xd9, 0xec, 0xec, 0xdc, 0xda, 0xc3, 0xd2, 0xfb, + 0xef, 0xf2, 0xff, 0x02, 0x09, 0xf8, 0xe7, 0xdb, 0xdc, 0xe4, 0xf2, 0xf7, + 0xed, 0xed, 0xde, 0xd8, 0xf0, 0xf4, 0xfd, 0xfa, 0xf0, 0xf8, 0xf7, 0xea, + 0xee, 0xe6, 0xd8, 0xdb, 0xe2, 0xdc, 0xd7, 0xd6, 0xe6, 0xf3, 0xfa, 0x08, + 0xfc, 0xfe, 0x10, 0x27, 0x37, 0x3d, 0x35, 0x09, 0xf8, 0x18, 0x12, 0xfa, + 0xf8, 0x03, 0xfc, 0xfc, 0xf7, 0xf2, 0xfb, 0x07, 0x13, 0x16, 0x13, 0x08, + 0x0c, 0x19, 0x10, 0x0d, 0x0e, 0x09, 0x1b, 0x1b, 0x18, 0x13, 0x0d, 0x13, + 0x1f, 0x1a, 0x1a, 0x1b, 0x1f, 0x0d, 0xfd, 0x27, 0x2c, 0x2d, 0x33, 0x1a, + 0x05, 0x08, 0x16, 0x1f, 0x18, 0x19, 0x1b, 0x0c, 0xfd, 0x06, 0x01, 0x14, + 0x18, 0x1b, 0x27, 0x2d, 0x1b, 0x12, 0x1b, 0x1d, 0x1c, 0x25, 0x28, 0x2d, + 0x21, 0x0e, 0x0f, 0x0c, 0x10, 0x0f, 0x09, 0x10, 0x1e, 0x22, 0x13, 0x12, + 0x22, 0x10, 0x03, 0x0f, 0x26, 0x32, 0x34, 0x44, 0x3d, 0x28, 0x1d, 0x0d, + 0x02, 0x06, 0x08, 0x07, 0xfc, 0x02, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x02, + 0x01, 0xfb, 0x05, 0x18, 0x11, 0x18, 0x34, 0x11, 0xfc, 0xec, 0xe5, 0xde, + 0xd3, 0xed, 0xfd, 0x01, 0x12, 0x11, 0x04, 0x0d, 0xfd, 0xe7, 0xf1, 0xdf, + 0xf7, 0x03, 0x11, 0x26, 0x2a, 0x16, 0x0c, 0x16, 0x0e, 0xfa, 0xf9, 0xf7, + 0xf1, 0xfc, 0xfb, 0x02, 0xfa, 0xfc, 0x00, 0xf9, 0xf8, 0xfa, 0xfb, 0xff, + 0x07, 0x0d, 0xf8, 0xf8, 0xfb, 0xf0, 0xe7, 0xf4, 0xf7, 0xf3, 0xf2, 0xde, + 0xd7, 0xe8, 0xe2, 0xd9, 0xe5, 0xf4, 0xfa, 0xee, 0xe6, 0xe6, 0xef, 0xfa, + 0xfa, 0xfc, 0xfd, 0xee, 0xdc, 0xe5, 0xf9, 0xfc, 0xf8, 0xee, 0xed, 0xed, + 0xf1, 0xe4, 0xd7, 0xdb, 0xdb, 0xdf, 0xe6, 0xf1, 0xf9, 0xf3, 0xf8, 0xef, + 0xe7, 0xf2, 0xe4, 0xd4, 0xe3, 0xfa, 0xfb, 0x02, 0x04, 0xef, 0xe4, 0xec, + 0xf3, 0xf4, 0xec, 0xf4, 0xe7, 0xf8, 0x00, 0x09, 0x07, 0x00, 0xfe, 0xfa, + 0xfa, 0xf2, 0xe4, 0xec, 0xef, 0xf1, 0xed, 0xfa, 0xf9, 0xf9, 0xf3, 0xf9, + 0x00, 0xe4, 0xd4, 0xf1, 0x04, 0x00, 0xf3, 0xfe, 0xf9, 0xea, 0xe3, 0xe4, + 0x01, 0xf4, 0xe6, 0xf2, 0xfd, 0x03, 0xfd, 0xec, 0xec, 0xf4, 0xfc, 0xfc, + 0xfd, 0xfc, 0x00, 0x01, 0xf9, 0xfe, 0xf9, 0xe5, 0xe7, 0xea, 0xe8, 0xf8, + 0x00, 0x04, 0x0d, 0x01, 0x04, 0xf9, 0xf1, 0xff, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x08, 0xff, 0xfc, 0x03, 0xf4, 0x02, 0x01, 0xe7, 0xed, 0x03, + 0x08, 0x03, 0x16, 0x24, 0x0f, 0xfb, 0x07, 0x0d, 0xf1, 0x03, 0x02, 0xed, + 0x07, 0x1d, 0x0e, 0x09, 0x01, 0xee, 0xfb, 0x08, 0x0f, 0x06, 0xfc, 0x05, + 0x03, 0x02, 0x0c, 0x14, 0x02, 0xf4, 0xf9, 0x01, 0x05, 0xfd, 0xf2, 0x0e, + 0x08, 0x05, 0x08, 0x03, 0xf8, 0xf9, 0xfb, 0xfd, 0x0e, 0x0e, 0xff, 0x02, + 0x04, 0x05, 0x26, 0x35, 0x2c, 0x1f, 0x16, 0x09, 0xf2, 0xfd, 0x03, 0xfa, + 0xfd, 0x02, 0xf1, 0xe8, 0xef, 0xf3, 0xf4, 0xf4, 0x06, 0x12, 0x16, 0x02, + 0x09, 0x18, 0x1b, 0x1b, 0x1f, 0x27, 0x1f, 0xff, 0xf3, 0x04, 0x00, 0xf7, + 0xf7, 0x0e, 0x1b, 0x06, 0x07, 0xff, 0xfc, 0x19, 0x1d, 0x11, 0x1b, 0x18, + 0xff, 0x03, 0x13, 0x0d, 0x0e, 0x09, 0xff, 0x00, 0x09, 0xff, 0xee, 0xfb, + 0x07, 0x0e, 0x09, 0x03, 0x14, 0x13, 0x1b, 0x10, 0x07, 0x0d, 0x16, 0x04, + 0xf2, 0x06, 0x1a, 0x10, 0x0f, 0x18, 0x09, 0x03, 0x11, 0x13, 0x13, 0x13, + 0x22, 0x27, 0x1d, 0x13, 0x0f, 0x16, 0x14, 0xfd, 0xf0, 0x03, 0x09, 0x02, + 0xf7, 0x07, 0x13, 0x1a, 0x14, 0x08, 0x08, 0x14, 0x16, 0x13, 0x18, 0x13, + 0x05, 0xf4, 0xf8, 0x06, 0x04, 0xfc, 0x01, 0x0e, 0x09, 0x03, 0x02, 0x04, + 0x16, 0x09, 0xfd, 0x08, 0x00, 0x07, 0x05, 0xfb, 0xf7, 0xfb, 0xf1, 0xe1, + 0xea, 0xf1, 0xed, 0x06, 0x0c, 0x08, 0x08, 0x02, 0x0c, 0x05, 0x01, 0x09, + 0x04, 0xf3, 0xf4, 0xfc, 0xfe, 0xff, 0xf3, 0xea, 0xe6, 0xe3, 0xd9, 0xd9, + 0xe6, 0xe7, 0xea, 0xfa, 0x07, 0x00, 0xf3, 0xf8, 0xf9, 0xe8, 0xd9, 0xdb, + 0xe6, 0xe8, 0xe4, 0xed, 0xf7, 0xf2, 0xf8, 0xf0, 0xe3, 0xea, 0xea, 0xdf, + 0xf4, 0xfd, 0xf4, 0xff, 0xf8, 0xef, 0xf0, 0xef, 0xea, 0xe6, 0xe3, 0xe2, + 0xe4, 0xe8, 0xe1, 0xd9, 0xec, 0xf2, 0xf9, 0xfa, 0xf9, 0xfb, 0x09, 0x08, + 0xfa, 0xfa, 0xfa, 0xea, 0xee, 0xfa, 0xec, 0xd9, 0xe1, 0xde, 0xde, 0xdf, + 0xee, 0xff, 0xf7, 0xf7, 0xfd, 0xfb, 0x07, 0x09, 0xf3, 0xea, 0xf9, 0xfc, + 0xef, 0xf1, 0xe7, 0xf3, 0xf1, 0xec, 0xfa, 0xf4, 0xe5, 0xf0, 0xf9, 0xfd, + 0xf9, 0xf3, 0xfd, 0x00, 0xf8, 0xf1, 0xf7, 0xef, 0xe7, 0xdf, 0xdc, 0xe3, + 0xea, 0xec, 0xef, 0xef, 0xf4, 0xff, 0x0d, 0x19, 0x07, 0xfc, 0xfe, 0x09, + 0x0f, 0x07, 0x03, 0x03, 0x06, 0xfb, 0xe2, 0xf3, 0xe8, 0xdf, 0xef, 0xf0, + 0xf8, 0xfd, 0xff, 0x08, 0x14, 0x16, 0x06, 0x04, 0x0d, 0x02, 0xf4, 0xfa, + 0xfe, 0x03, 0x00, 0xf1, 0xf9, 0x01, 0xff, 0xf8, 0xf3, 0x00, 0x12, 0x13, + 0x07, 0x19, 0x10, 0x0c, 0x05, 0x10, 0x05, 0x01, 0x01, 0x00, 0xff, 0x00, + 0x05, 0x11, 0x0d, 0x03, 0x03, 0x08, 0x00, 0xf3, 0xf0, 0x00, 0xfe, 0xf7, + 0x07, 0x16, 0x13, 0x11, 0x07, 0x02, 0x0c, 0xfd, 0xf2, 0xfd, 0x04, 0x01, + 0x06, 0x05, 0x07, 0x09, 0x09, 0x14, 0x1f, 0x19, 0x10, 0x13, 0x1a, 0x22, + 0x1b, 0x19, 0x14, 0x0e, 0x0d, 0x0f, 0x0e, 0x0d, 0x08, 0x01, 0x00, 0x00, + 0xf9, 0x01, 0x0d, 0x0e, 0x13, 0x13, 0x0c, 0x0d, 0x0f, 0x0e, 0x12, 0x19, + 0x1a, 0x18, 0x1c, 0x24, 0x14, 0xfd, 0x05, 0x1c, 0x11, 0x05, 0x0c, 0x0c, + 0x06, 0x06, 0x03, 0x04, 0x02, 0x09, 0x16, 0x1a, 0x1d, 0x1f, 0x10, 0x06, + 0x07, 0x08, 0x04, 0xfd, 0xfb, 0x03, 0x0c, 0x12, 0x0d, 0xfe, 0x03, 0x11, + 0x1a, 0x16, 0x0d, 0x0c, 0x16, 0x12, 0x0d, 0x11, 0x0f, 0x0e, 0x13, 0x10, + 0x0d, 0x0c, 0x05, 0x00, 0x03, 0x00, 0x04, 0x13, 0x14, 0x11, 0x13, 0x0d, + 0x08, 0x08, 0x12, 0x05, 0x05, 0x11, 0x00, 0xfb, 0x02, 0x03, 0x05, 0x05, + 0x03, 0x03, 0x04, 0x02, 0xfe, 0xfe, 0xff, 0x09, 0x07, 0x04, 0x08, 0xff, + 0xfc, 0x02, 0x03, 0x08, 0x0c, 0xfa, 0xfa, 0xfe, 0xf1, 0xfe, 0xf0, 0xfd, + 0x05, 0xfa, 0xef, 0xf8, 0x04, 0x03, 0xfa, 0xff, 0x0e, 0x06, 0xfe, 0x07, + 0x03, 0xfb, 0xfb, 0x04, 0x03, 0xf8, 0xed, 0xea, 0xf9, 0xfe, 0xfc, 0xfb, + 0xf3, 0xff, 0x0c, 0xf9, 0xf8, 0xfb, 0xfe, 0xfc, 0xf4, 0xf8, 0x04, 0x02, + 0xfb, 0xfd, 0xee, 0xea, 0xf1, 0xe8, 0xe1, 0xed, 0xfa, 0xf1, 0xf2, 0xfb, + 0xfb, 0xfb, 0x00, 0xfb, 0xf0, 0xf4, 0xfb, 0xf8, 0xf4, 0xea, 0xe4, 0xea, + 0xef, 0xee, 0xed, 0xf4, 0xfc, 0xf4, 0xe7, 0xef, 0xfa, 0xf9, 0xf8, 0xfe, + 0x09, 0x01, 0xfa, 0xf7, 0xef, 0xe4, 0xe2, 0xe6, 0xe6, 0xf2, 0xf9, 0xea, + 0xfb, 0xfe, 0xf0, 0xf1, 0xf2, 0xf8, 0xf9, 0xf3, 0xef, 0xf1, 0xf2, 0xf2, + 0xfb, 0x00, 0xf2, 0xee, 0xed, 0xdc, 0xdc, 0xe5, 0xed, 0xee, 0xe4, 0xe4, + 0xee, 0xee, 0xe8, 0xf1, 0xf0, 0xe5, 0xe4, 0xe5, 0xe6, 0xe1, 0xed, 0xfa, + 0xfc, 0xfc, 0xfb, 0xf2, 0xee, 0xf0, 0xf2, 0xf1, 0xf4, 0xf3, 0xee, 0xea, + 0xe1, 0xdc, 0xe8, 0xea, 0xea, 0xf1, 0xf2, 0xec, 0xef, 0xfc, 0xfd, 0xff, + 0xff, 0x02, 0x01, 0xf2, 0xfa, 0xf4, 0xf3, 0xf2, 0xf1, 0xee, 0xea, 0xea, + 0xf0, 0xf2, 0xf7, 0xf9, 0xef, 0xf0, 0xee, 0xea, 0xf4, 0xfc, 0x03, 0x06, + 0x03, 0xfe, 0xfc, 0xfa, 0xf1, 0xec, 0xf2, 0xf2, 0xf7, 0xf4, 0xf7, 0xfe, + 0xff, 0xfb, 0xfe, 0x05, 0xfb, 0xfc, 0x07, 0x06, 0x09, 0x01, 0x04, 0x03, + 0xfc, 0xfc, 0xff, 0x00, 0xf8, 0xf2, 0xee, 0xed, 0xf1, 0xf3, 0xfe, 0x03, + 0x07, 0x0e, 0x0e, 0x0d, 0x0e, 0x05, 0x08, 0x19, 0x11, 0x02, 0x01, 0x00, + 0xfc, 0xfd, 0x07, 0x0c, 0xf9, 0xff, 0x03, 0x04, 0x08, 0x07, 0x06, 0x0f, + 0x16, 0x18, 0x16, 0x12, 0x03, 0xfe, 0xff, 0x00, 0xfe, 0xf7, 0xfa, 0x00, + 0xfe, 0x00, 0x05, 0x08, 0x0e, 0x0c, 0x0f, 0x0f, 0x04, 0x08, 0x13, 0x19, + 0x0d, 0x0c, 0x0c, 0x0c, 0x09, 0x10, 0x0e, 0x06, 0x0f, 0x12, 0x09, 0x04, + 0x10, 0x14, 0x0d, 0x0c, 0x0e, 0x01, 0x08, 0x19, 0x0d, 0x06, 0x19, 0x14, + 0x0d, 0x05, 0x10, 0x13, 0x19, 0x16, 0x0f, 0x0f, 0x10, 0x10, 0x07, 0x06, + 0x10, 0x0e, 0x06, 0x0c, 0x0f, 0x07, 0x0e, 0x0d, 0x07, 0x14, 0x16, 0x0f, + 0x10, 0x11, 0x10, 0x10, 0x0e, 0x07, 0x07, 0x0d, 0x11, 0x07, 0x0c, 0x09, + 0x05, 0x0d, 0x14, 0x1a, 0x1c, 0x18, 0x11, 0x10, 0x11, 0x19, 0x1f, 0x19, + 0x10, 0x0c, 0x09, 0x0f, 0x10, 0x10, 0x0f, 0x0d, 0x08, 0x0d, 0x18, 0x10, + 0x10, 0x13, 0x12, 0x10, 0x13, 0x12, 0x13, 0x16, 0x09, 0x05, 0x04, 0x01, + 0x05, 0x05, 0x01, 0x00, 0x05, 0x01, 0xf9, 0x01, 0x03, 0x08, 0x06, 0x00, + 0xff, 0x00, 0x00, 0x03, 0x03, 0x04, 0x09, 0x01, 0xfd, 0xf1, 0xf8, 0xfc, + 0xf7, 0xff, 0xff, 0xf9, 0xfd, 0x02, 0xfb, 0xf3, 0xfd, 0x01, 0xfe, 0x01, + 0xff, 0xfb, 0xfb, 0xfc, 0xff, 0xfa, 0xff, 0x03, 0xfc, 0xf8, 0xfa, 0xf7, + 0xf2, 0xfc, 0xfb, 0xf1, 0xf8, 0xee, 0xee, 0xf2, 0xf1, 0xec, 0xf1, 0xf3, + 0xf7, 0xfe, 0xfe, 0xf8, 0xf2, 0xef, 0xfd, 0xfe, 0xf2, 0xf1, 0xef, 0xf0, + 0xf1, 0xed, 0xee, 0xec, 0xf2, 0xf2, 0xe5, 0xee, 0xf8, 0xf1, 0xed, 0xee, + 0xf1, 0xef, 0xf0, 0xfb, 0xfb, 0xf4, 0xf2, 0xee, 0xf1, 0xf2, 0xe8, 0xed, + 0xf1, 0xe8, 0xee, 0xf3, 0xea, 0xf1, 0xfd, 0xf8, 0xf3, 0xf8, 0xf8, 0xfa, + 0xee, 0xf0, 0xef, 0xf0, 0xee, 0xef, 0xf2, 0xf2, 0xed, 0xef, 0xee, 0xed, + 0xf2, 0xf8, 0xee, 0xf0, 0xf3, 0xf1, 0xfa, 0xf9, 0xf9, 0xfb, 0xfc, 0xf4, + 0xf2, 0xf7, 0xfb, 0xfd, 0xf8, 0xf4, 0xf9, 0x00, 0x03, 0x02, 0xfe, 0xf8, + 0xf7, 0xfc, 0x00, 0x02, 0x05, 0x05, 0x05, 0xfe, 0xfd, 0xfc, 0xfe, 0x03, + 0x05, 0x07, 0xff, 0xf9, 0xfa, 0xff, 0x01, 0x01, 0x00, 0xfc, 0xfd, 0x04, + 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xfc, 0x04, 0x06, 0x01, + 0x02, 0x05, 0x03, 0x08, 0x08, 0x08, 0x01, 0xfb, 0xfb, 0xfd, 0xfd, 0xf8, + 0xf8, 0xfe, 0xfb, 0xfd, 0x07, 0x05, 0xfd, 0x00, 0x03, 0x05, 0x05, 0x08, + 0x03, 0x03, 0x08, 0x06, 0x06, 0x05, 0x00, 0x01, 0x04, 0x08, 0x0d, 0x0e, + 0x06, 0x00, 0xfe, 0x02, 0x02, 0x03, 0x02, 0xff, 0xfd, 0xf9, 0xf4, 0x03, + 0x00, 0xfd, 0x03, 0x08, 0x04, 0x03, 0x06, 0x07, 0x06, 0x00, 0x00, 0x04, + 0x01, 0x01, 0x07, 0x05, 0x02, 0x01, 0x00, 0xf9, 0xfa, 0xfe, 0xff, 0xfe, + 0xfc, 0x01, 0x03, 0x05, 0x06, 0x00, 0x05, 0x04, 0x01, 0x03, 0x00, 0xfe, + 0xff, 0x01, 0x01, 0xff, 0x01, 0xff, 0xf7, 0xfd, 0xff, 0x03, 0x04, 0x06, + 0x08, 0x05, 0x01, 0x02, 0x07, 0x08, 0x02, 0xfe, 0xfe, 0xfa, 0xfe, 0x02, + 0xfd, 0x00, 0x03, 0x04, 0x03, 0xfe, 0xf9, 0xfa, 0x01, 0x03, 0x04, 0x0c, + 0x07, 0xfd, 0xfa, 0xf8, 0xfb, 0xfe, 0xff, 0xff, 0xfd, 0xfb, 0xfc, 0xfd, + 0xff, 0x00, 0x00, 0xff, 0x03, 0x04, 0x04, 0x01, 0x01, 0x01, 0x00, 0xfd, + 0xff, 0x01, 0xfe, 0x00, 0x02, 0x01, 0xff, 0x03, 0x04, 0x02, 0x00, 0x01, + 0xfc, 0xfa, 0xfd, 0xfe, 0xff, 0xfe, 0xfc, 0xfd, 0xfe, 0x01, 0x06, 0x0d, + 0x09, 0x02, 0x03, 0x04, 0x02, 0xfd, 0xff, 0x03, 0x03, 0x04, 0x05, 0x00, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x05, 0x04, 0x00, 0x01, 0x03, 0x02, 0x05, + 0x08, 0x0e, 0x08, 0x04, 0x04, 0x05, 0x05, 0x02, 0x07, 0x0c, 0x07, 0x07, + 0x07, 0x09, 0x09, 0x04, 0x02, 0x03, 0x09, 0x08, 0x0e, 0x10, 0x09, 0x09, + 0x06, 0x00, 0xfc, 0xfd, 0x03, 0x05, 0xfd, 0xfb, 0x02, 0x01, 0x06, 0x12, + 0x16, 0x0c, 0x05, 0x02, 0xff, 0xfc, 0xfb, 0xf9, 0xfd, 0x03, 0x01, 0x00, + 0x01, 0x03, 0x00, 0xfc, 0xfc, 0xfe, 0xff, 0x00, 0x04, 0x09, 0x05, 0x04, + 0x02, 0x02, 0x01, 0x01, 0x00, 0xfe, 0x04, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x00, 0x02, 0x03, 0x03, 0xfe, 0xfe, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, + 0xfb, 0xfc, 0xfe, 0xfb, 0xfa, 0xfb, 0xfc, 0xff, 0x02, 0x01, 0x00, 0xff, + 0xfc, 0xf3, 0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xfc, 0xf9, 0xf7, 0xf9, 0xf4, + 0xfb, 0xfc, 0xf9, 0xfa, 0xfb, 0xf9, 0xfb, 0xfd, 0xfb, 0xfc, 0xff, 0x01, + 0xfc, 0xf3, 0xf4, 0xfc, 0xff, 0xfd, 0xf7, 0xf9, 0xfb, 0xfb, 0xf8, 0xf4, + 0xf4, 0xfc, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf8, 0xfa, 0xfc, 0xf9, 0xfc, + 0xfe, 0xf9, 0xf9, 0xfe, 0xfb, 0xf7, 0xfa, 0xfc, 0xfc, 0xf7, 0xf8, 0xf9, + 0xf9, 0xf9, 0xf9, 0xfd, 0xff, 0xfd, 0xfa, 0xf9, 0xf8, 0xf7, 0xf4, 0xf3, + 0xf7, 0xf8, 0xfc, 0xff, 0x00, 0xfe, 0xfb, 0xfa, 0xfb, 0xff, 0xfe, 0xfd, + 0xff, 0xfb, 0xf3, 0xf7, 0xf3, 0xf4, 0xf8, 0xfe, 0x04, 0x04, 0xfc, 0xf7, + 0xfa, 0xfe, 0xff, 0xfd, 0xfe, 0x00, 0xfd, 0xfe, 0xfc, 0xf8, 0xf3, 0xfa, + 0xfe, 0xfe, 0xfa, 0xfb, 0xfc, 0xfa, 0xfc, 0x01, 0xff, 0xfc, 0xf9, 0xfa, + 0xfc, 0xff, 0xfb, 0xf2, 0xf3, 0xf7, 0xfb, 0xfc, 0xfa, 0xfb, 0xf4, 0xf2, + 0xef, 0xf1, 0xf4, 0xf1, 0xea, 0xed, 0xf3, 0xfc, 0xfd, 0xfc, 0xff, 0xff, + 0xfc, 0xfd, 0xfc, 0xf4, 0xf8, 0xfc, 0xf9, 0xfa, 0xf4, 0xed, 0xf0, 0xfb, + 0xfb, 0xf1, 0xef, 0xfa, 0x04, 0x08, 0x07, 0x01, 0xfe, 0x01, 0x02, 0xfe, + 0xfc, 0xfd, 0xfc, 0xf7, 0xf2, 0xf8, 0xf8, 0xf9, 0xfa, 0xf7, 0xf9, 0xfb, + 0xfe, 0xfe, 0xff, 0xfe, 0x00, 0x03, 0x04, 0x03, 0x05, 0x00, 0xfc, 0xfc, + 0xff, 0xfd, 0xfc, 0xfd, 0x00, 0xff, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xfd, + 0xfd, 0xfe, 0xfe, 0xfd, 0xf9, 0xfc, 0x02, 0x05, 0x03, 0x01, 0xfd, 0xfc, + 0xfe, 0xfd, 0x04, 0x0c, 0x06, 0x08, 0x08, 0x07, 0x03, 0x02, 0x02, 0x01, + 0x01, 0xff, 0x00, 0x06, 0x04, 0x00, 0x06, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, + 0x08, 0x0c, 0x0e, 0x0d, 0x0e, 0x0f, 0x09, 0x05, 0x03, 0x04, 0x04, 0xfc, + 0x00, 0x08, 0x0c, 0x09, 0x0c, 0x11, 0x18, 0x18, 0x13, 0x14, 0x0f, 0x08, + 0x08, 0x08, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x05, 0x08, + 0x0e, 0x11, 0x13, 0x12, 0x13, 0x12, 0x0f, 0x0e, 0x0c, 0x08, 0x07, 0x05, + 0x07, 0x07, 0x08, 0x06, 0x06, 0x04, 0x03, 0x05, 0x08, 0x05, 0x02, 0x08, + 0x0e, 0x09, 0x09, 0x0e, 0x0c, 0x10, 0x11, 0x0e, 0x0e, 0x0d, 0x09, 0x04, + 0x04, 0x07, 0x04, 0x01, 0x03, 0x06, 0x03, 0xfe, 0xfc, 0xfe, 0x01, 0x03, + 0x08, 0x0c, 0x0c, 0x08, 0x07, 0x06, 0x05, 0x03, 0x02, 0x02, 0x02, 0x01, + 0x01, 0xfe, 0xf8, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x05, + 0x04, 0x00, 0xfc, 0xf8, 0xf4, 0xfb, 0xff, 0xfd, 0xf8, 0xfd, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0x03, 0x00, 0xfb, 0xfb, 0xfb, + 0xfa, 0xfc, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xff, 0x00, 0x00, 0x00, + 0xfe, 0xfe, 0xfc, 0xfe, 0x00, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xfd, 0xff, 0x00, 0xfc, 0xfb, 0xfe, 0xff, 0x00, 0x02, 0x00, 0xfe, + 0xfe, 0xfb, 0xfb, 0xfc, 0xfb, 0xfd, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xfc, + 0x00, 0x00, 0xff, 0xfc, 0xfc, 0xfe, 0xfe, 0xfb, 0xfc, 0x00, 0x03, 0x02, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0xfd, 0xfb, + 0xfc, 0xfd, 0xf9, 0xf6, 0xf7, 0xf7, 0xf7, 0xfb, 0xfd, 0xfd, 0xfd, 0x00, + 0x02, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0xfd, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0xfc, 0xfb, 0xfa, 0xfb, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xfd, 0xf8, 0xf5, 0xf7, 0xfa, 0xfd, 0xfe, 0xfe, 0xfd, + 0xfe, 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfc, 0xff, 0x02, 0x02, 0x03, 0x04, + 0x00, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfd, 0xfe, 0xff, 0x00, 0x00, 0xff, + 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x01, 0x03, 0x01, 0x01, 0x04, 0x04, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, + 0xfd, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x02, 0x05, 0x05, 0x05, 0x02, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x03, 0x04, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x04, 0x07, 0x04, 0x01, 0x01, 0x01, + 0x00, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfc, 0xfe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, + 0xfe, 0xfd, 0xfd, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xff, 0xfe, 0xfe, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, + 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x01, 0x0a, 0x0e, 0x0b, 0x08, 0x06, 0x07, 0x06, 0xf8, 0x02, 0x09, 0x09, + 0x07, 0x0e, 0x0e, 0x09, 0x11, 0x06, 0x00, 0x0a, 0x0f, 0x09, 0xfd, 0xfa, + 0xfb, 0xfc, 0xf6, 0xf9, 0xfc, 0xfc, 0xfb, 0xff, 0xfb, 0xf8, 0xfc, 0xfc, + 0xff, 0x01, 0x04, 0x07, 0x04, 0x04, 0xff, 0x01, 0x00, 0xfb, 0x00, 0x05, + 0x09, 0x09, 0x03, 0x05, 0x0e, 0x11, 0x0d, 0x07, 0x04, 0x14, 0x03, 0xfd, + 0x07, 0x0d, 0x0d, 0x08, 0x00, 0xfb, 0x04, 0x0c, 0x02, 0xfe, 0xfd, 0xfd, + 0x00, 0xf8, 0xf7, 0xff, 0x07, 0x02, 0xfc, 0xfe, 0xf5, 0xfb, 0xfd, 0xfc, + 0x02, 0xfd, 0x01, 0x06, 0x03, 0x0d, 0x11, 0x01, 0xf6, 0xff, 0x11, 0x07, + 0x08, 0x03, 0xff, 0x10, 0x0e, 0x09, 0x05, 0x03, 0x02, 0xf5, 0xfa, 0x00, + 0xfc, 0x07, 0x05, 0x05, 0x07, 0x02, 0x03, 0x09, 0x06, 0x01, 0x06, 0xff, + 0xfa, 0xfc, 0x00, 0xfb, 0xfc, 0xf7, 0xfa, 0xfb, 0xfb, 0xf1, 0xf6, 0x03, + 0xfa, 0x05, 0x07, 0x07, 0x19, 0x0e, 0x0d, 0x0a, 0x07, 0x03, 0x10, 0x12, + 0x08, 0x08, 0x0b, 0x11, 0x15, 0x13, 0x09, 0x08, 0x0c, 0xff, 0x00, 0x00, + 0x01, 0x06, 0x08, 0x05, 0xf9, 0xf0, 0xf6, 0xfe, 0xfc, 0xfa, 0xf5, 0xfb, + 0xfe, 0xff, 0xf8, 0xef, 0xf6, 0xf9, 0xf9, 0xf5, 0xf4, 0xf5, 0xf5, 0xfc, + 0x00, 0x02, 0x04, 0x0a, 0x0d, 0x1e, 0x0c, 0xfb, 0x02, 0x10, 0x13, 0x0f, + 0x08, 0x01, 0x09, 0x11, 0x11, 0x0f, 0x09, 0x11, 0x0c, 0x01, 0xfb, 0xfe, + 0x02, 0x02, 0x07, 0x09, 0x02, 0x01, 0xfc, 0xfd, 0x03, 0x02, 0x01, 0x01, + 0x00, 0x02, 0xfc, 0xf7, 0xf5, 0xfe, 0xfd, 0xf3, 0xef, 0xfa, 0x0d, 0x04, + 0x08, 0x0c, 0x0a, 0x13, 0x0b, 0x07, 0x05, 0xf8, 0xf8, 0xfb, 0x06, 0x08, + 0xff, 0x04, 0x0f, 0x13, 0x10, 0x04, 0x0d, 0x0a, 0x01, 0xfa, 0xf7, 0xfc, + 0xfc, 0x00, 0xfe, 0xfb, 0x01, 0xfe, 0xfe, 0xfd, 0x03, 0x08, 0x09, 0x08, + 0x09, 0xfb, 0xf2, 0xf5, 0xf9, 0xf5, 0xf7, 0xf7, 0xf6, 0xfa, 0xfc, 0xf9, + 0x00, 0xfc, 0x0e, 0x0e, 0x0a, 0x05, 0x03, 0x08, 0x0f, 0x14, 0x18, 0x0e, + 0x03, 0x0b, 0x0e, 0x08, 0x0a, 0x03, 0x0e, 0x0d, 0x09, 0x09, 0x0e, 0x08, + 0x04, 0x05, 0x08, 0x03, 0x07, 0x06, 0x00, 0x00, 0x01, 0xfc, 0xfc, 0xfa, + 0xfd, 0xf7, 0xf5, 0xf2, 0x00, 0x02, 0xfd, 0xf9, 0xfd, 0xf7, 0xed, 0xf4, + 0xf8, 0x00, 0x11, 0x0d, 0x02, 0x02, 0xfd, 0x00, 0x0b, 0x12, 0x09, 0xff, + 0x01, 0x03, 0x0e, 0x0b, 0x08, 0x0e, 0x08, 0xfd, 0xfe, 0x02, 0x04, 0x00, + 0xfe, 0xfb, 0xf8, 0xfe, 0x02, 0x00, 0x04, 0x07, 0x08, 0x00, 0xfe, 0x06, + 0x07, 0xf8, 0xf9, 0x04, 0x00, 0x05, 0x05, 0xfb, 0xfe, 0x05, 0x04, 0xfb, + 0x08, 0x16, 0x0e, 0x10, 0x06, 0x04, 0x03, 0x00, 0xfb, 0x09, 0x0b, 0x07, + 0x0b, 0x0e, 0x07, 0x00, 0xf9, 0x01, 0xfe, 0x03, 0x03, 0x07, 0x05, 0x04, + 0x06, 0x02, 0x01, 0x01, 0xf7, 0xfb, 0x04, 0x0a, 0x09, 0x0a, 0xf5, 0xf6, + 0xf9, 0xf8, 0xfa, 0x06, 0x01, 0x05, 0xfd, 0x05, 0x08, 0x00, 0xfe, 0xfd, + 0x06, 0x10, 0x07, 0x00, 0xfa, 0x01, 0x06, 0x03, 0x08, 0x0c, 0x05, 0x0b, + 0x0c, 0x0d, 0x09, 0x06, 0x0f, 0x0a, 0x00, 0x00, 0x02, 0x04, 0x09, 0x09, + 0x03, 0xf9, 0xfe, 0x05, 0xf4, 0xe8, 0xf4, 0x02, 0x08, 0xff, 0x00, 0xfe, + 0xfc, 0xfd, 0xff, 0xef, 0xee, 0xf1, 0xee, 0xfb, 0xfc, 0xfa, 0xfc, 0x04, + 0x15, 0x13, 0x0c, 0x07, 0x05, 0x09, 0x14, 0x17, 0x14, 0x11, 0x0c, 0x14, + 0x1a, 0x0e, 0x07, 0x11, 0x11, 0x06, 0x06, 0x03, 0x01, 0x04, 0x06, 0xfa, + 0xfd, 0x04, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xfa, 0x03, 0x04, 0xfc, 0xef, + 0xf4, 0xef, 0xf0, 0xf9, 0xfc, 0xfa, 0xfc, 0x08, 0x02, 0x03, 0x01, 0x09, + 0x12, 0x08, 0xfe, 0xf9, 0xfe, 0x02, 0x00, 0x00, 0x0f, 0x12, 0x1b, 0x1a, + 0x0c, 0x0c, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x00, 0xf9, 0xf3, 0xf4, 0xf5, + 0x02, 0x0f, 0xff, 0xf1, 0xec, 0xf7, 0xff, 0xfe, 0xfe, 0xf9, 0xf2, 0xfe, + 0xfb, 0xfa, 0xf6, 0xf7, 0xf9, 0xf9, 0x1a, 0x13, 0xff, 0xfe, 0xfe, 0x0e, + 0x17, 0x17, 0x13, 0x15, 0x0e, 0xff, 0x04, 0x0b, 0x07, 0x12, 0x18, 0x06, + 0x07, 0x08, 0x08, 0x0d, 0x0e, 0x09, 0x11, 0x13, 0x08, 0x04, 0x08, 0x04, + 0x08, 0x09, 0xff, 0xf9, 0xf5, 0xe3, 0xe5, 0xf3, 0xef, 0xef, 0xf4, 0xf3, + 0xf8, 0xf6, 0xef, 0xf2, 0xed, 0xea, 0x03, 0x01, 0xf9, 0xfe, 0x05, 0xff, + 0xfc, 0x09, 0x0c, 0x07, 0x0b, 0x06, 0x04, 0x0f, 0x0a, 0x0e, 0x19, 0x1f, + 0x18, 0x0d, 0x0c, 0x0f, 0x13, 0x0e, 0x04, 0x00, 0xfc, 0x00, 0xfe, 0xfb, + 0xf9, 0x02, 0x05, 0xff, 0xff, 0x05, 0x01, 0xfd, 0x04, 0x02, 0x00, 0x06, + 0x05, 0x00, 0xfe, 0xf5, 0xf7, 0x05, 0x10, 0x08, 0x03, 0x08, 0x15, 0x12, + 0x04, 0x02, 0x03, 0x07, 0x0e, 0x10, 0x07, 0x06, 0x02, 0xfe, 0x04, 0x0e, + 0x02, 0xff, 0xfb, 0xf8, 0x04, 0x0e, 0x05, 0xff, 0xfe, 0xfe, 0xf8, 0xfe, + 0xf9, 0xf4, 0xf1, 0xf0, 0xe3, 0xe7, 0xf2, 0xf5, 0xee, 0xf6, 0xf7, 0xfe, + 0xff, 0xfc, 0x03, 0xf6, 0xf2, 0x13, 0x1f, 0x19, 0x10, 0x0a, 0x0e, 0x13, + 0x10, 0x0e, 0x0a, 0x08, 0x06, 0x06, 0x0e, 0x12, 0x0d, 0x09, 0x0d, 0x0e, + 0x0b, 0x0d, 0x0e, 0x13, 0x15, 0x12, 0x08, 0x01, 0x09, 0x07, 0x00, 0xf7, + 0xf6, 0xf8, 0xfc, 0xfe, 0xfb, 0xee, 0xee, 0xfc, 0xfe, 0xf6, 0xed, 0xed, + 0xe6, 0xe5, 0xe3, 0xde, 0xed, 0x0b, 0x13, 0x15, 0x0c, 0x0a, 0x10, 0x09, + 0x09, 0x06, 0x08, 0x0f, 0x16, 0x1d, 0x1c, 0x1b, 0x14, 0x12, 0x0f, 0x12, + 0x0f, 0x0e, 0x16, 0x13, 0x0e, 0x02, 0xf9, 0xfb, 0xfa, 0xf9, 0xfb, 0xfc, + 0xf6, 0xf0, 0xf4, 0xf5, 0xef, 0xe6, 0xe8, 0xeb, 0xf5, 0xf3, 0xf8, 0xfd, + 0x01, 0xfd, 0xf7, 0xf9, 0x14, 0x28, 0x1a, 0x0b, 0x09, 0x07, 0x08, 0x00, + 0x00, 0x0a, 0x0d, 0x0e, 0x0e, 0x0d, 0x16, 0x17, 0x09, 0x07, 0x0d, 0x18, + 0x12, 0x06, 0x02, 0x04, 0x07, 0xfe, 0xf5, 0xf6, 0xf3, 0xf9, 0xf8, 0xf9, + 0xf8, 0xf0, 0xee, 0xee, 0xf4, 0xf9, 0xf8, 0xf4, 0xf2, 0xf8, 0xf8, 0xf0, + 0xf8, 0xf8, 0xed, 0xf8, 0x19, 0x19, 0x1a, 0x19, 0x12, 0x15, 0x13, 0x11, + 0x15, 0x18, 0x0a, 0x05, 0x06, 0x03, 0x1c, 0x1e, 0x0d, 0x0c, 0x0d, 0x15, + 0x16, 0x0e, 0x07, 0x0c, 0x0b, 0x05, 0x0a, 0x09, 0x06, 0x07, 0xfc, 0xf4, + 0xf4, 0xfc, 0xff, 0xf7, 0xee, 0xe8, 0xe3, 0xe5, 0xe7, 0xf4, 0xe5, 0xe2, + 0xe2, 0xde, 0xe3, 0xfc, 0x19, 0x0a, 0x02, 0x05, 0x05, 0x06, 0xfd, 0x00, + 0x04, 0x07, 0x09, 0x19, 0x1b, 0x1b, 0x32, 0x32, 0x25, 0x23, 0x21, 0x1c, + 0x0d, 0x0a, 0x02, 0x05, 0xfe, 0xfb, 0xfe, 0xfd, 0x01, 0x08, 0x06, 0xfe, + 0xf5, 0xf2, 0xf2, 0xf7, 0xf2, 0xed, 0xef, 0xf2, 0xf6, 0xf5, 0xf5, 0xf3, + 0xe8, 0xe7, 0xf2, 0x20, 0x23, 0x11, 0x07, 0x01, 0x0b, 0x14, 0x0d, 0x06, + 0x0b, 0x0a, 0x03, 0xfe, 0xf8, 0xfa, 0x15, 0x1e, 0x15, 0x10, 0x12, 0x0a, + 0x0b, 0x0e, 0x08, 0x04, 0xfc, 0xfc, 0x03, 0xfc, 0xf1, 0xea, 0xeb, 0xe7, + 0xef, 0xf2, 0xf7, 0x02, 0xff, 0x00, 0x03, 0xf9, 0xfc, 0xfc, 0xf9, 0xef, + 0xf0, 0xf1, 0x01, 0x1f, 0x15, 0x11, 0x0f, 0x0c, 0x13, 0x17, 0x10, 0x0f, + 0x0e, 0x10, 0x0d, 0x00, 0x02, 0x01, 0x11, 0x15, 0x0f, 0x19, 0x21, 0x10, + 0x01, 0xfd, 0x07, 0x0c, 0x10, 0x0c, 0x02, 0x01, 0x06, 0x08, 0xff, 0xf8, + 0xfb, 0x00, 0xfc, 0xf7, 0xf5, 0xf1, 0xe4, 0xde, 0xe5, 0xe4, 0xe3, 0xe3, + 0xea, 0xf1, 0x11, 0x0e, 0xff, 0xfa, 0xfc, 0x03, 0x07, 0x05, 0x04, 0x05, + 0x00, 0x05, 0x10, 0x0e, 0x0b, 0x0c, 0x1c, 0x1a, 0x10, 0x1a, 0x1d, 0x11, + 0x0f, 0x09, 0x00, 0xfb, 0xfc, 0x00, 0x0b, 0x0a, 0x04, 0x01, 0x00, 0xfc, + 0x02, 0xff, 0xf8, 0xfd, 0x02, 0xfa, 0xff, 0x07, 0xf7, 0xf1, 0xf3, 0xf7, + 0xfe, 0x0a, 0x21, 0x14, 0x10, 0x0b, 0x01, 0x07, 0x11, 0x12, 0x12, 0x10, + 0x08, 0x02, 0x00, 0xff, 0xfb, 0xff, 0x0e, 0x0a, 0x06, 0x05, 0xfc, 0xfb, + 0xfa, 0xf8, 0xf7, 0xf8, 0xf6, 0xf2, 0xf2, 0xf3, 0xf5, 0xf1, 0xec, 0xe6, + 0xea, 0xff, 0x17, 0x12, 0x01, 0xfa, 0xfa, 0xfa, 0xfd, 0xf8, 0xf1, 0xf9, + 0xff, 0x20, 0x27, 0x1d, 0x17, 0x1c, 0x14, 0x0e, 0x14, 0x12, 0x0f, 0x07, + 0x06, 0x0b, 0x0b, 0x06, 0x04, 0x08, 0x19, 0x1b, 0x1f, 0x13, 0x0d, 0x10, + 0x0b, 0x04, 0x01, 0x06, 0x06, 0x04, 0x01, 0xfd, 0xf4, 0xf0, 0xf7, 0xf7, + 0xf2, 0xf3, 0xf0, 0xee, 0xec, 0xe8, 0xe2, 0xdc, 0xda, 0xd7, 0xe7, 0xf8, + 0x05, 0x07, 0xfa, 0x00, 0x00, 0x04, 0x00, 0x04, 0x11, 0x0f, 0x05, 0x0e, + 0x27, 0x28, 0x21, 0x18, 0x0e, 0x11, 0x1e, 0x1f, 0x16, 0x0c, 0x0b, 0x0b, + 0x0e, 0x09, 0x04, 0x02, 0xff, 0x07, 0x0c, 0x04, 0xf9, 0xf7, 0xf7, 0xf7, + 0xfa, 0xef, 0xe7, 0xe6, 0xe7, 0xe8, 0xe3, 0xe7, 0xed, 0xe6, 0xe2, 0xf1, + 0x10, 0x08, 0x09, 0x0f, 0x09, 0x07, 0x0a, 0x2e, 0x33, 0x1f, 0x17, 0x1a, + 0x13, 0x0d, 0x0a, 0x0a, 0x06, 0x13, 0x23, 0x1c, 0x1a, 0x1a, 0x16, 0x0e, + 0x0c, 0x07, 0xff, 0xf7, 0xf6, 0xf9, 0xfd, 0xf5, 0xeb, 0xe9, 0xf0, 0x07, + 0x06, 0xf1, 0xf3, 0xf8, 0xf1, 0xea, 0xe6, 0xe5, 0xdf, 0xe4, 0xe8, 0x07, + 0x0d, 0x01, 0xf8, 0xfa, 0x00, 0x03, 0x01, 0x09, 0x14, 0x0f, 0x0a, 0x05, + 0xff, 0xfc, 0xfe, 0x19, 0x1b, 0x20, 0x2b, 0x23, 0x15, 0x10, 0x12, 0x17, + 0x08, 0x00, 0x04, 0x03, 0x06, 0x16, 0x15, 0x05, 0xfc, 0xfe, 0x02, 0xfc, + 0xf9, 0xee, 0xef, 0xef, 0xf2, 0xe9, 0xe6, 0xe4, 0xdf, 0xdf, 0xfc, 0x19, + 0x06, 0xfd, 0xfd, 0xfa, 0xfd, 0x06, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x10, + 0x10, 0x12, 0x13, 0x0d, 0x0e, 0x1d, 0x23, 0x1d, 0x10, 0x07, 0x03, 0x15, + 0x21, 0x09, 0xf9, 0xfa, 0xff, 0xfb, 0xfb, 0xff, 0xf9, 0xfe, 0xfb, 0xf3, + 0xf0, 0xf4, 0x04, 0x01, 0xf8, 0xf5, 0xf6, 0xef, 0xea, 0xf1, 0x0e, 0x06, + 0xff, 0x03, 0x0a, 0x08, 0x0b, 0x0f, 0x0e, 0x13, 0x17, 0x11, 0x0a, 0x02, + 0xfb, 0xf9, 0xfa, 0xf9, 0xfa, 0x08, 0x02, 0xfc, 0x01, 0xfe, 0xf8, 0xf3, + 0xf5, 0xf6, 0xed, 0xea, 0xea, 0xe9, 0xea, 0xfc, 0x1b, 0x20, 0x1c, 0x0e, + 0x03, 0x02, 0x04, 0x09, 0xfb, 0xfa, 0xff, 0xfb, 0xff, 0x1b, 0x24, 0x28, + 0x1d, 0x16, 0x10, 0x11, 0x16, 0x27, 0x24, 0x27, 0x24, 0x19, 0x11, 0x09, + 0x03, 0xfc, 0xeb, 0xea, 0xfa, 0x11, 0x09, 0x09, 0x0a, 0x06, 0x03, 0xfd, + 0xfc, 0xfd, 0xf9, 0xf1, 0xef, 0xee, 0xea, 0xf0, 0xf1, 0xeb, 0xe9, 0xe4, + 0xdf, 0xde, 0xde, 0xe5, 0xfe, 0xfd, 0xf5, 0xf0, 0x03, 0x06, 0xfc, 0xfd, + 0xf9, 0xf4, 0xf0, 0xeb, 0xf6, 0x10, 0x11, 0x27, 0x32, 0x22, 0x17, 0x15, + 0x15, 0x12, 0x12, 0x16, 0x26, 0x17, 0x0d, 0x18, 0x1c, 0x18, 0x11, 0x10, + 0x09, 0xfd, 0x03, 0x06, 0x0a, 0x06, 0x08, 0x0a, 0x03, 0x02, 0x01, 0xf9, + 0xf6, 0xf7, 0xf6, 0xf0, 0xf4, 0xf6, 0xf4, 0x03, 0x13, 0x06, 0xf7, 0xf8, + 0x22, 0x1a, 0xfe, 0xf4, 0xfc, 0x0b, 0x03, 0x0e, 0x0d, 0x04, 0x05, 0x04, + 0xfb, 0xf7, 0xf5, 0x0d, 0x1f, 0x08, 0x01, 0x02, 0x06, 0xff, 0xfe, 0x01, + 0xf9, 0xf0, 0xe8, 0xe9, 0xea, 0xf5, 0x01, 0x03, 0xfe, 0xf9, 0xf2, 0xf6, + 0xf9, 0xf4, 0xf6, 0xf2, 0xe8, 0xe6, 0xf3, 0x0e, 0x08, 0x02, 0xf9, 0xfb, + 0xfc, 0xfb, 0xfe, 0xfc, 0x04, 0x0f, 0x0d, 0x15, 0x2a, 0x34, 0x2b, 0x20, + 0x15, 0x10, 0x14, 0x2a, 0x21, 0x11, 0x0f, 0x13, 0x1a, 0x18, 0x18, 0x1b, + 0x27, 0x1e, 0x14, 0x0d, 0x0b, 0x08, 0x04, 0xff, 0x03, 0x03, 0xf6, 0xea, + 0xe6, 0xe8, 0xd8, 0xcc, 0xd1, 0xd7, 0xef, 0xeb, 0xf6, 0xf4, 0xf0, 0xf0, + 0xeb, 0xe3, 0xe2, 0xea, 0xf3, 0x09, 0x16, 0x11, 0x0a, 0x09, 0x08, 0x07, + 0x03, 0xfc, 0x13, 0x18, 0x1e, 0x22, 0x1a, 0x1d, 0x1c, 0x17, 0x10, 0x0c, + 0x0b, 0x02, 0xfc, 0xfb, 0x02, 0x01, 0xfa, 0xfb, 0x0a, 0x06, 0xfb, 0xf8, + 0xf6, 0xed, 0xeb, 0xee, 0xf9, 0x16, 0x0d, 0x03, 0xfe, 0x02, 0x13, 0x0d, + 0x06, 0xfc, 0xfb, 0xfd, 0x03, 0x1b, 0x1e, 0x1b, 0x12, 0x0e, 0x0b, 0x05, + 0x04, 0x10, 0x1e, 0x0b, 0x05, 0xff, 0xff, 0x06, 0x06, 0x03, 0xfb, 0xf0, + 0x03, 0x0a, 0xf1, 0xf2, 0xfd, 0xfd, 0xf6, 0xfa, 0xfd, 0xf4, 0xef, 0xf0, + 0xef, 0xed, 0xee, 0xf2, 0x12, 0x1c, 0x09, 0x04, 0xfe, 0x01, 0xff, 0xff, + 0xff, 0xfd, 0x00, 0xfb, 0x04, 0x11, 0x17, 0x1e, 0x1c, 0x14, 0x0b, 0x03, + 0x05, 0x1c, 0x16, 0x0d, 0x05, 0xfe, 0xf9, 0x03, 0x0a, 0x0b, 0x08, 0x01, + 0xfa, 0xf5, 0xf5, 0xfb, 0xf6, 0xf0, 0xee, 0xf6, 0x08, 0x0c, 0x03, 0xfa, + 0xf5, 0xf3, 0xf0, 0x06, 0x10, 0x07, 0xfe, 0xfb, 0xfb, 0xfb, 0xf7, 0xfa, + 0x00, 0x11, 0x12, 0x13, 0x1b, 0x1d, 0x1f, 0x19, 0x15, 0x17, 0x15, 0x0c, + 0x14, 0x15, 0xfa, 0xfa, 0x06, 0x01, 0xf7, 0x00, 0x04, 0x03, 0x08, 0x06, + 0xfc, 0xf5, 0xf6, 0xf7, 0xf8, 0xf2, 0xf1, 0xfa, 0xf3, 0xf1, 0xee, 0xea, + 0xea, 0xeb, 0xfb, 0x03, 0x15, 0x19, 0x0f, 0x10, 0x16, 0x0d, 0x04, 0xfe, + 0x05, 0x08, 0xfb, 0xfc, 0x0d, 0x09, 0x10, 0x09, 0x07, 0x0f, 0x0b, 0x10, + 0x10, 0xfe, 0xf9, 0xf6, 0xf9, 0xfc, 0xff, 0x04, 0xfd, 0xf7, 0xf0, 0xec, + 0xfd, 0x13, 0x0c, 0x02, 0xff, 0xfc, 0xfe, 0x00, 0x01, 0xf7, 0xf7, 0xf3, + 0xfe, 0x18, 0x12, 0x0f, 0x0c, 0x07, 0x0a, 0x0b, 0x08, 0x00, 0x02, 0x00, + 0x12, 0x15, 0xfe, 0x03, 0x0d, 0x11, 0x15, 0x08, 0x0c, 0x0e, 0x15, 0x1d, + 0x0b, 0x07, 0x01, 0x00, 0x04, 0x0c, 0x13, 0x1a, 0x0d, 0x02, 0xfc, 0xf7, + 0xf6, 0xfe, 0xfe, 0xf5, 0xf2, 0xee, 0xea, 0xef, 0xf4, 0xf9, 0xf1, 0xe7, + 0xfb, 0xfd, 0xf8, 0xf3, 0xf6, 0xf9, 0xf3, 0xee, 0xe6, 0xe4, 0xe7, 0xf8, + 0xfc, 0xfa, 0xf9, 0x05, 0x02, 0x08, 0x0f, 0x0c, 0x1d, 0x2b, 0x30, 0x22, + 0x1c, 0x17, 0x11, 0x0e, 0x0d, 0x12, 0x1b, 0x1b, 0x12, 0x0c, 0x06, 0x04, + 0x0b, 0x1b, 0x17, 0x10, 0x09, 0x06, 0xff, 0x00, 0xfc, 0xfe, 0xfe, 0x0e, + 0x07, 0xf5, 0xe7, 0xe5, 0xf5, 0x07, 0x02, 0xf6, 0xef, 0xf0, 0xf3, 0xf1, + 0xf2, 0xf7, 0x02, 0xfd, 0xfc, 0x05, 0x05, 0xff, 0x05, 0x10, 0x06, 0xfe, + 0xfd, 0xf8, 0xf5, 0xf7, 0x0b, 0x12, 0x14, 0x08, 0x02, 0x06, 0x0d, 0x05, + 0x02, 0x06, 0x07, 0x07, 0x02, 0xfa, 0xfa, 0xf4, 0xec, 0xfd, 0x1a, 0x18, + 0x08, 0x04, 0x01, 0xfc, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0xff, 0xf8, + 0xf5, 0x02, 0x10, 0x07, 0x04, 0x0c, 0x0c, 0x10, 0x19, 0x18, 0x1b, 0x15, + 0x10, 0x0d, 0x0a, 0x0c, 0x13, 0x1a, 0x16, 0x0b, 0x03, 0xff, 0xfc, 0xf7, + 0x10, 0x09, 0xf8, 0xf5, 0xf6, 0xf4, 0xf5, 0xf0, 0xed, 0xfc, 0xfd, 0xfb, + 0xf6, 0xf3, 0xee, 0xf6, 0xf8, 0x00, 0xfc, 0xf4, 0xfd, 0x03, 0x00, 0xf8, + 0xf8, 0x05, 0x00, 0xfa, 0x05, 0x07, 0x06, 0x12, 0x0e, 0x18, 0x1a, 0x13, + 0x0f, 0x09, 0x05, 0x01, 0x06, 0x09, 0x0b, 0x07, 0xfd, 0xf5, 0xf4, 0xf8, + 0xfc, 0xfe, 0xfe, 0xfb, 0xf4, 0xf4, 0xf2, 0xfb, 0x21, 0x1f, 0x15, 0x09, + 0x06, 0x04, 0x0a, 0x0e, 0x0a, 0x05, 0x01, 0x02, 0x0b, 0x0b, 0x06, 0x02, + 0x0d, 0x19, 0x15, 0x10, 0x11, 0x10, 0x1d, 0x15, 0x0f, 0x10, 0x03, 0xf9, + 0xfb, 0xed, 0xdf, 0xec, 0xf6, 0xf4, 0xfe, 0xff, 0xf7, 0xef, 0xef, 0xee, + 0xec, 0xeb, 0xf3, 0x00, 0xf9, 0xef, 0xeb, 0x01, 0x0a, 0x08, 0x05, 0xfe, + 0xfd, 0xfc, 0xfb, 0x04, 0x15, 0x0b, 0x09, 0x0d, 0x0c, 0x0b, 0x05, 0x09, + 0x0d, 0x0a, 0x06, 0x0f, 0x1c, 0x24, 0x1c, 0x14, 0x16, 0x15, 0x10, 0x0c, + 0x0e, 0x0c, 0x07, 0x0a, 0x08, 0x04, 0xfd, 0xf5, 0xf8, 0xf9, 0xf8, 0xf9, + 0xfa, 0xf3, 0xfa, 0xf8, 0xf1, 0xee, 0x01, 0x04, 0xfa, 0xf5, 0xf3, 0xfb, + 0xf9, 0xf9, 0xfb, 0xfe, 0xfd, 0x05, 0x0d, 0x07, 0x01, 0xfd, 0xfa, 0x06, + 0x0d, 0xfd, 0xfc, 0x17, 0x19, 0x0a, 0x0b, 0x19, 0x1c, 0x13, 0x0a, 0x08, + 0x04, 0x02, 0x09, 0x0e, 0x16, 0x0f, 0x07, 0x02, 0xfe, 0xfd, 0xf9, 0xfc, + 0x01, 0x01, 0xfd, 0xf1, 0xf1, 0x05, 0x09, 0x02, 0xff, 0xfa, 0x04, 0x08, + 0xff, 0xfd, 0xfe, 0xfd, 0xf8, 0xfa, 0xfa, 0x00, 0xfe, 0xf8, 0xfc, 0xf9, + 0xf6, 0xf7, 0x10, 0x13, 0x01, 0xfd, 0x01, 0x10, 0x19, 0x0f, 0x05, 0x01, + 0x07, 0x00, 0xff, 0x06, 0x09, 0x03, 0x04, 0x05, 0x01, 0xff, 0xfc, 0x07, + 0x19, 0x13, 0x0e, 0x06, 0x12, 0x1b, 0x14, 0x11, 0x0c, 0x04, 0xfc, 0xf8, + 0xf6, 0xeb, 0xeb, 0xf7, 0xfc, 0xf9, 0xf8, 0xfe, 0x01, 0x04, 0xf9, 0xf4, + 0xfb, 0x06, 0x0d, 0x07, 0x06, 0x07, 0x0c, 0x0d, 0x0d, 0x08, 0x08, 0x0a, + 0x03, 0x00, 0xfc, 0xfc, 0x0b, 0x06, 0x03, 0x01, 0x02, 0x02, 0xfb, 0xfb, + 0x03, 0xfe, 0xf9, 0x08, 0x0e, 0x06, 0x02, 0x0a, 0x08, 0xfc, 0xf2, 0xef, + 0xf2, 0xf6, 0x04, 0x07, 0xff, 0xfc, 0xfb, 0x00, 0x01, 0xf8, 0xf2, 0xfe, + 0x09, 0x13, 0x11, 0x09, 0x06, 0x0b, 0x14, 0x11, 0x0d, 0x08, 0x08, 0x06, + 0x08, 0x0f, 0x09, 0x06, 0x08, 0x04, 0x04, 0x06, 0xfd, 0xf3, 0xf1, 0x02, + 0x18, 0x01, 0x00, 0x0d, 0x09, 0x09, 0x09, 0x08, 0x03, 0x02, 0xff, 0xfa, + 0xf8, 0xfb, 0x06, 0x0a, 0x06, 0x08, 0x0b, 0x0c, 0x04, 0x03, 0x07, 0x03, + 0x0a, 0x0c, 0x02, 0xfb, 0xfc, 0xff, 0xfa, 0xfb, 0xfe, 0xfd, 0xfc, 0xfa, + 0xfd, 0x00, 0xfb, 0xf7, 0xf9, 0xfa, 0xf8, 0xf4, 0xed, 0xec, 0xed, 0xee, + 0xf2, 0xfd, 0x10, 0x0d, 0x07, 0x03, 0xfd, 0xfd, 0x0d, 0x0d, 0x08, 0xfd, + 0x05, 0x0b, 0x0c, 0x0b, 0x04, 0x08, 0x0d, 0x10, 0x18, 0x1a, 0x20, 0x21, + 0x27, 0x20, 0x1a, 0x1b, 0x24, 0x21, 0x1c, 0x11, 0x0a, 0x0d, 0x07, 0x07, + 0x01, 0xec, 0xe0, 0xec, 0xf6, 0xf9, 0xfc, 0xfc, 0xf3, 0xec, 0xef, 0xea, + 0xee, 0xfe, 0xf9, 0xf6, 0xf3, 0xf4, 0xf2, 0xe6, 0xea, 0xed, 0xe6, 0xf2, + 0x06, 0x00, 0xf5, 0xf5, 0x0c, 0x13, 0x0a, 0x10, 0x0b, 0x03, 0x02, 0x08, + 0x12, 0x11, 0x0e, 0x14, 0x1c, 0x1f, 0x22, 0x1c, 0x0f, 0x09, 0x07, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0xff, 0xfb, 0xf5, 0xf1, 0xef, 0xf4, + 0x0f, 0x17, 0x16, 0x10, 0x0b, 0x03, 0xfa, 0xf9, 0xf9, 0xf8, 0xf8, 0xfe, + 0x04, 0x04, 0x09, 0x08, 0x09, 0x0d, 0x0f, 0x08, 0x05, 0x01, 0xfe, 0x0a, + 0x14, 0x0f, 0xfe, 0x01, 0xff, 0xfd, 0xff, 0x03, 0x02, 0x02, 0x03, 0x08, + 0x00, 0x06, 0x03, 0xfe, 0xfd, 0xfa, 0xf5, 0xef, 0xed, 0xf0, 0xef, 0xfe, + 0x17, 0x0d, 0x06, 0x05, 0x03, 0xfc, 0xf3, 0xef, 0xf2, 0xfa, 0xff, 0xff, + 0x00, 0x00, 0x05, 0x03, 0x0d, 0x10, 0x05, 0x00, 0x01, 0x04, 0x16, 0x14, + 0x10, 0x0f, 0x0e, 0x11, 0x0e, 0x0b, 0x05, 0x02, 0x0b, 0x16, 0x0e, 0x05, + 0x00, 0xff, 0xfc, 0x00, 0x02, 0x02, 0xff, 0xfd, 0x05, 0x05, 0x05, 0x18, + 0x18, 0x0d, 0x02, 0x03, 0x02, 0xfc, 0xf0, 0xed, 0xf5, 0xfd, 0x05, 0x06, + 0x09, 0x02, 0xf2, 0xfa, 0xfc, 0xff, 0x00, 0x02, 0x01, 0x05, 0x0b, 0x00, + 0xf9, 0xfe, 0x03, 0x01, 0xff, 0xff, 0x09, 0x08, 0xfd, 0xf6, 0xf9, 0xfc, + 0xfb, 0xf7, 0xf7, 0xf8, 0xfd, 0x07, 0x06, 0x00, 0xfc, 0xfc, 0x0e, 0x15, + 0x10, 0x08, 0x0a, 0x10, 0x18, 0x0f, 0x02, 0xff, 0x02, 0x01, 0x01, 0x07, + 0x0d, 0x0e, 0x19, 0x11, 0x0b, 0x05, 0x04, 0x01, 0x02, 0x0a, 0x03, 0xfd, + 0xff, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x00, 0x02, 0x03, 0xfd, 0xfa, + 0xf8, 0xf4, 0xfd, 0x01, 0xfb, 0xef, 0xec, 0xf4, 0xf4, 0xfc, 0x04, 0x03, + 0x0d, 0x19, 0x10, 0x02, 0xf9, 0xf4, 0xf5, 0xf6, 0xf7, 0xfb, 0x05, 0x11, + 0x24, 0x1f, 0x17, 0x0f, 0x0b, 0x09, 0x09, 0x09, 0x17, 0x12, 0x0c, 0x14, + 0x11, 0x0b, 0x08, 0x0c, 0x0d, 0x08, 0x01, 0x00, 0x06, 0x00, 0xf9, 0xf9, + 0xf9, 0xf8, 0xfa, 0xf5, 0xf0, 0xe6, 0xe0, 0xe2, 0xeb, 0xfa, 0xf9, 0x05, + 0x02, 0x00, 0xff, 0xfb, 0xf4, 0xf1, 0xef, 0xf1, 0xfd, 0x0c, 0x15, 0x13, + 0x11, 0x0b, 0x07, 0x05, 0x06, 0x09, 0x09, 0x1c, 0x28, 0x23, 0x1c, 0x1d, + 0x1d, 0x15, 0x11, 0x16, 0x0f, 0x07, 0x01, 0x06, 0x08, 0x04, 0x01, 0x05, + 0x01, 0x04, 0xff, 0xf7, 0xf0, 0xed, 0xf1, 0xf6, 0x06, 0x08, 0x06, 0x06, + 0x01, 0xf9, 0xf3, 0xee, 0xef, 0xec, 0xf3, 0xff, 0xfe, 0x01, 0x01, 0x02, + 0x09, 0x03, 0xfd, 0xfc, 0xfc, 0xfb, 0x13, 0x1a, 0x0c, 0x07, 0x04, 0x00, + 0xfc, 0xfe, 0x02, 0x0c, 0x08, 0x08, 0x0f, 0x14, 0x0b, 0x06, 0x02, 0xfc, + 0xfd, 0xfb, 0xfd, 0xfb, 0xfa, 0xf6, 0xee, 0xf8, 0x03, 0x03, 0x0f, 0x0a, + 0x06, 0x02, 0xfe, 0xfb, 0xfa, 0xff, 0x02, 0xff, 0x04, 0x0f, 0x0a, 0x06, + 0x08, 0x09, 0x0f, 0x18, 0x12, 0x12, 0x1c, 0x19, 0x16, 0x0f, 0x0d, 0x0c, + 0x0b, 0x0a, 0x18, 0x10, 0x04, 0xff, 0xfc, 0xfe, 0xfa, 0xf8, 0xfc, 0x06, + 0x06, 0xf9, 0xf6, 0xf5, 0xf1, 0xeb, 0xec, 0xf9, 0xf6, 0xf8, 0xf6, 0xf7, + 0xfb, 0xf9, 0xf6, 0xf7, 0xfc, 0x02, 0x05, 0xfd, 0x03, 0x02, 0xff, 0xfe, + 0xff, 0x05, 0x02, 0xfc, 0xfa, 0x05, 0x07, 0x06, 0x03, 0x08, 0x11, 0x1a, + 0x12, 0x0a, 0x05, 0x09, 0x0b, 0x04, 0x02, 0xfe, 0xf9, 0xf7, 0xfe, 0x0b, + 0x09, 0x02, 0x00, 0xfd, 0xf9, 0xfa, 0x09, 0x1a, 0x1b, 0x1d, 0x18, 0x16, + 0x19, 0x15, 0x0f, 0x0b, 0x04, 0xfb, 0xfa, 0x08, 0x0e, 0x0d, 0x0c, 0x05, + 0x0c, 0x14, 0x0f, 0x04, 0x05, 0x00, 0xff, 0xfd, 0xfa, 0xfe, 0xfc, 0xfb, + 0xf8, 0xf2, 0xf1, 0xf1, 0xf3, 0xf8, 0xfa, 0x04, 0xfd, 0xf7, 0xf1, 0xf2, + 0xf3, 0xee, 0xe6, 0xe2, 0xe1, 0xe5, 0xf9, 0x0b, 0x12, 0x0f, 0x08, 0x02, + 0x07, 0x06, 0xfe, 0x06, 0x07, 0x01, 0x08, 0x10, 0x0e, 0x0c, 0x0b, 0x0c, + 0x10, 0x14, 0x19, 0x26, 0x25, 0x20, 0x23, 0x1c, 0x18, 0x12, 0x0e, 0x09, + 0x07, 0x04, 0x02, 0x06, 0x00, 0xfb, 0xfc, 0xfc, 0x00, 0x00, 0xfe, 0xfa, + 0xf7, 0xf1, 0xf0, 0xf8, 0xf0, 0xee, 0xf2, 0xf7, 0xff, 0x00, 0xfe, 0xfe, + 0x02, 0xfd, 0xfa, 0xfc, 0x01, 0x00, 0x07, 0x05, 0x00, 0xfd, 0xff, 0x06, + 0x08, 0x09, 0x11, 0x0f, 0x0d, 0x0d, 0x14, 0x0e, 0x0b, 0x07, 0x00, 0x01, + 0x03, 0x04, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0xfe, 0xfd, 0xfa, 0xfa, 0xf9, + 0xf1, 0xec, 0xeb, 0xeb, 0xf3, 0x02, 0x02, 0x05, 0x03, 0x02, 0x0c, 0x15, + 0x11, 0x09, 0x02, 0xfc, 0xfc, 0x0b, 0x0b, 0x02, 0xf8, 0xf9, 0xf8, 0xf8, + 0x0b, 0x23, 0x1b, 0x11, 0x0a, 0x0b, 0x0b, 0x10, 0x13, 0x12, 0x0e, 0x0b, + 0x08, 0x09, 0x09, 0x0e, 0x12, 0x01, 0xfd, 0x00, 0x00, 0xfc, 0x02, 0x02, + 0xf7, 0xf2, 0xf2, 0xf2, 0xfd, 0x00, 0xfa, 0x03, 0x00, 0xfe, 0x00, 0xff, + 0xfa, 0xef, 0xf0, 0xf1, 0xfb, 0xff, 0x00, 0x05, 0x00, 0x01, 0xfb, 0xff, + 0x1b, 0x1f, 0x18, 0x16, 0x0e, 0x0c, 0x0d, 0x06, 0x06, 0x0f, 0x0e, 0x09, + 0x02, 0x04, 0x02, 0x03, 0x08, 0x09, 0x07, 0x01, 0xfa, 0xf9, 0xf6, 0xf0, + 0xee, 0xec, 0xea, 0xec, 0xfc, 0x03, 0x12, 0x16, 0x0a, 0x04, 0x00, 0xfc, + 0xfa, 0xf8, 0xfb, 0x09, 0x0b, 0x01, 0xfe, 0xfd, 0xfe, 0xf9, 0xff, 0x13, + 0x1b, 0x1b, 0x1f, 0x29, 0x1f, 0x15, 0x0f, 0x06, 0x01, 0x08, 0x0c, 0x09, + 0x08, 0x02, 0x01, 0xff, 0xff, 0x07, 0x04, 0xf8, 0xfc, 0xfd, 0xf9, 0xfa, + 0xf7, 0xf4, 0xf4, 0xf7, 0x06, 0x0b, 0x0c, 0x05, 0x00, 0x03, 0xff, 0xfd, + 0xff, 0xfe, 0x06, 0x12, 0x0a, 0x03, 0xff, 0xfd, 0xfb, 0xfe, 0x0c, 0x09, + 0x07, 0x07, 0xfe, 0xfd, 0x02, 0x02, 0xfc, 0xfb, 0xfb, 0x00, 0x05, 0x08, + 0x05, 0x05, 0x04, 0x03, 0x01, 0x03, 0xfd, 0xf3, 0xec, 0xe7, 0xe5, 0xe3, + 0xe2, 0xed, 0xf9, 0x0d, 0x1e, 0x19, 0x0b, 0x06, 0x13, 0x15, 0x0e, 0x0b, + 0x08, 0x05, 0x0e, 0x11, 0x0b, 0x05, 0x06, 0x06, 0x0e, 0x24, 0x28, 0x28, + 0x2a, 0x26, 0x1e, 0x1a, 0x18, 0x14, 0x10, 0x06, 0xff, 0x02, 0xfd, 0xfb, + 0xf9, 0xf3, 0xf2, 0xf6, 0xf7, 0xf2, 0xf9, 0xfb, 0xec, 0xe8, 0xe4, 0xe0, + 0xe1, 0xe1, 0xe6, 0x00, 0x00, 0xfa, 0xf4, 0xf2, 0xf3, 0xef, 0xf3, 0xfe, + 0xfe, 0x04, 0x0c, 0x05, 0x00, 0x08, 0x0b, 0x0c, 0x15, 0x0d, 0x07, 0x0e, + 0x14, 0x11, 0x10, 0x17, 0x16, 0x18, 0x1b, 0x17, 0x11, 0x0d, 0x09, 0x05, + 0xff, 0x05, 0x06, 0x03, 0x02, 0xfe, 0xf9, 0xf3, 0xf6, 0xf9, 0xf3, 0xf2, + 0xf9, 0xfd, 0x16, 0x28, 0x1b, 0x12, 0x0c, 0x06, 0xff, 0xfd, 0xff, 0xff, + 0xfe, 0x07, 0x06, 0xff, 0xfe, 0x01, 0x03, 0x16, 0x15, 0x08, 0x01, 0x03, + 0x02, 0x07, 0x09, 0x05, 0x02, 0x01, 0xfd, 0xfc, 0xf9, 0xf5, 0xf9, 0xfc, + 0xff, 0x08, 0x0a, 0x08, 0x00, 0xfa, 0xf4, 0xeb, 0xe4, 0xe7, 0xf0, 0xed, + 0xee, 0xfb, 0x04, 0x06, 0x03, 0x00, 0xff, 0xfd, 0xfc, 0xfc, 0x04, 0x0d, + 0x09, 0x0a, 0x05, 0x05, 0x05, 0x08, 0x18, 0x17, 0x0e, 0x0c, 0x0d, 0x10, + 0x0d, 0x0f, 0x12, 0x12, 0x1b, 0x1d, 0x12, 0x0e, 0x0b, 0x0b, 0x11, 0x0e, + 0x0d, 0x07, 0x04, 0x02, 0xfd, 0xf8, 0xf7, 0xf4, 0xf0, 0xf2, 0xfa, 0xfc, + 0x07, 0x05, 0x08, 0x03, 0xfc, 0xfe, 0xfe, 0xfd, 0xfc, 0xf4, 0xf3, 0xf3, + 0xf5, 0xfa, 0xf5, 0xf0, 0xf0, 0x03, 0x14, 0x11, 0x0a, 0x08, 0x0c, 0x09, + 0x07, 0x0d, 0x09, 0x06, 0x05, 0x07, 0x06, 0x04, 0x02, 0xff, 0xfb, 0xfa, + 0xfc, 0x05, 0x05, 0xfe, 0xf9, 0xf9, 0xfb, 0x02, 0xfe, 0xf9, 0xfe, 0x07, + 0x01, 0xff, 0x0a, 0x0a, 0x0b, 0x11, 0x11, 0x06, 0x03, 0x0c, 0x07, 0x00, + 0x03, 0x05, 0x03, 0xfe, 0x0a, 0x13, 0x0d, 0x0a, 0x04, 0x04, 0x05, 0x01, + 0x04, 0x06, 0x14, 0x16, 0x12, 0x0e, 0x0f, 0x0d, 0x06, 0x00, 0xf8, 0xf9, + 0xfe, 0x01, 0xfe, 0xf5, 0xf6, 0xf3, 0xf1, 0xf6, 0xf4, 0xfc, 0x08, 0x02, + 0xf2, 0xee, 0xfb, 0x02, 0x03, 0xfd, 0xf8, 0xf9, 0xfb, 0xfa, 0xfb, 0xfb, + 0x03, 0x0c, 0x0f, 0x15, 0x1a, 0x18, 0x13, 0x12, 0x10, 0x10, 0x0d, 0x0d, + 0x0e, 0x0f, 0x10, 0x10, 0x0d, 0x0a, 0x0b, 0x07, 0x04, 0x03, 0x0c, 0x0f, + 0x08, 0xff, 0xf6, 0xf3, 0xf4, 0xf5, 0xec, 0xe1, 0xea, 0xf2, 0xf9, 0xf4, + 0xf1, 0xf7, 0xfa, 0xf6, 0xf8, 0xf6, 0xf8, 0x03, 0x03, 0x00, 0xf8, 0xfe, + 0x0f, 0x0c, 0x0d, 0x15, 0x0c, 0x0e, 0x16, 0x11, 0x13, 0x25, 0x21, 0x14, + 0x14, 0x17, 0x17, 0x16, 0x0d, 0x0b, 0x0d, 0x0c, 0x0a, 0x06, 0x06, 0x02, + 0xf3, 0xe8, 0xea, 0xed, 0xec, 0xeb, 0xf9, 0x07, 0x04, 0x08, 0x03, 0xfb, + 0xf6, 0x05, 0x03, 0xff, 0xfa, 0xfa, 0x00, 0x05, 0x06, 0xff, 0xf8, 0xf8, + 0xf8, 0xfd, 0x0c, 0x0a, 0x0c, 0x0a, 0x07, 0x06, 0x08, 0x08, 0x0b, 0x08, + 0x02, 0x02, 0x06, 0x03, 0x07, 0x10, 0x09, 0x04, 0x00, 0xff, 0xfd, 0xff, + 0xfe, 0xf5, 0xf4, 0xf6, 0xf6, 0xfc, 0x01, 0x04, 0x03, 0xfd, 0xf6, 0xf4, + 0xf7, 0x01, 0x0a, 0x10, 0x09, 0x0b, 0x10, 0x0f, 0x07, 0x08, 0x08, 0x01, + 0x02, 0x13, 0x14, 0x0f, 0x0f, 0x0e, 0x0f, 0x17, 0x15, 0x15, 0x14, 0x10, + 0x07, 0x07, 0x04, 0x06, 0x04, 0x03, 0x04, 0x02, 0xfb, 0xfa, 0xfb, 0xf9, + 0xf7, 0xfc, 0xfc, 0xf6, 0xfb, 0xfb, 0xf7, 0xfa, 0xf6, 0xf0, 0xed, 0xeb, + 0xee, 0xf4, 0xf9, 0xf9, 0xfe, 0xff, 0xfe, 0xf9, 0xf4, 0xf5, 0xfc, 0x0e, + 0x1a, 0x16, 0x0d, 0x11, 0x15, 0x10, 0x0f, 0x09, 0x07, 0x0a, 0x07, 0x06, + 0x0b, 0x0b, 0x0a, 0x0b, 0x08, 0x03, 0x02, 0x00, 0x03, 0x04, 0x06, 0x02, + 0xfd, 0xfb, 0xf8, 0x02, 0x02, 0xfe, 0x05, 0x0f, 0x0d, 0x0c, 0x0f, 0x06, + 0x07, 0x0c, 0x0b, 0x0c, 0x12, 0x0d, 0x06, 0x00, 0x00, 0xfe, 0xfe, 0x0a, + 0x0f, 0x00, 0xfa, 0xf4, 0xf7, 0x00, 0x02, 0x09, 0x06, 0x07, 0x05, 0x03, + 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfd, 0xfa, 0xf8, 0xfb, 0xfa, 0xfa, 0xf8, + 0xf5, 0xfa, 0x01, 0xfe, 0xfb, 0xfa, 0xfd, 0xff, 0xfb, 0xfa, 0xf8, 0xf2, + 0xf6, 0x09, 0x0e, 0x11, 0x0b, 0x06, 0x07, 0x03, 0xff, 0x01, 0x00, 0x14, + 0x12, 0x0b, 0x06, 0x05, 0x0e, 0x13, 0x14, 0x16, 0x10, 0x0e, 0x0d, 0x0a, + 0x0d, 0x0b, 0x0f, 0x18, 0x17, 0x0e, 0x09, 0x0b, 0x0c, 0x07, 0x05, 0xfc, + 0x02, 0x00, 0xfa, 0xf6, 0xf6, 0xf6, 0xf6, 0xf9, 0xf5, 0xf4, 0xed, 0xe7, + 0xef, 0xf7, 0xf7, 0xfb, 0xf9, 0xf2, 0xed, 0xe8, 0xeb, 0xf3, 0x0d, 0x16, + 0x10, 0x11, 0x16, 0x17, 0x14, 0x10, 0x09, 0x08, 0x0c, 0x0c, 0x09, 0x08, + 0x07, 0x09, 0x08, 0x0a, 0x06, 0x02, 0x02, 0x03, 0xfe, 0xff, 0x03, 0x13, + 0x12, 0x06, 0xff, 0xff, 0x01, 0x01, 0xff, 0x00, 0xfe, 0xfa, 0xf3, 0xf6, + 0x02, 0x0d, 0x09, 0x05, 0x02, 0xfe, 0xfd, 0xfb, 0xf9, 0xff, 0x06, 0x00, + 0x00, 0x0b, 0x0d, 0x07, 0x07, 0x08, 0x15, 0x11, 0x09, 0x0c, 0x0d, 0x0e, + 0x0c, 0x0c, 0x09, 0x07, 0xff, 0xfc, 0xfd, 0xfc, 0xfe, 0x01, 0x0b, 0x08, + 0x08, 0xfb, 0xf7, 0xf8, 0xf5, 0xee, 0xec, 0xf5, 0xfc, 0xf4, 0xf3, 0xfc, + 0x09, 0x0b, 0x06, 0x02, 0x00, 0xfd, 0xfe, 0xff, 0x02, 0x0e, 0x09, 0x05, + 0x07, 0x0c, 0x10, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x12, 0x0e, + 0x0b, 0x13, 0x14, 0x0a, 0x06, 0x04, 0x03, 0x00, 0x05, 0x08, 0xfd, 0xf7, + 0xf3, 0xf3, 0xf5, 0xf4, 0xf3, 0xf1, 0xf0, 0xef, 0xe8, 0xe9, 0xf1, 0xf7, + 0xfa, 0x00, 0xfd, 0xfd, 0x06, 0x04, 0x00, 0x03, 0x18, 0x17, 0x09, 0x10, + 0x1f, 0x1c, 0x13, 0x14, 0x15, 0x10, 0x0b, 0x0a, 0x0c, 0x0f, 0x11, 0x0e, + 0x0d, 0x07, 0xfe, 0xfb, 0xfa, 0xf6, 0xf5, 0xff, 0x04, 0x08, 0x03, 0xfc, + 0xfd, 0x06, 0xff, 0xfb, 0xff, 0xfe, 0xfd, 0xf9, 0xf4, 0xf9, 0xfd, 0xff, + 0x05, 0x07, 0x03, 0x00, 0xff, 0xfc, 0xfc, 0x03, 0x09, 0x02, 0xff, 0x07, + 0x13, 0x19, 0x0b, 0x07, 0x08, 0x07, 0x07, 0x04, 0x03, 0x04, 0x04, 0x04, + 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xf6, 0x06, 0x08, 0x01, 0xfc, 0x01, 0x01, + 0xfb, 0xf9, 0xf7, 0xf9, 0xff, 0x05, 0xfe, 0xfc, 0x05, 0x09, 0x05, 0x06, + 0x07, 0x0e, 0x06, 0x05, 0x06, 0x02, 0x04, 0x0e, 0x0d, 0x0e, 0x0f, 0x13, + 0x14, 0x10, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x09, 0x07, 0x14, 0x0f, 0x0b, + 0x0a, 0x09, 0x07, 0x01, 0xfe, 0x04, 0x06, 0x00, 0xfb, 0xfb, 0xfa, 0xf8, + 0xf6, 0xf5, 0xf4, 0xf3, 0xf1, 0xef, 0xef, 0xf6, 0xf9, 0xf3, 0xf1, 0xef, + 0xfd, 0x0a, 0xfb, 0xfa, 0x01, 0x05, 0x0d, 0x11, 0x09, 0x0d, 0x10, 0x11, + 0x0b, 0x07, 0x07, 0x09, 0x0b, 0x0c, 0x09, 0x06, 0x06, 0x0a, 0x0a, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x06, 0x12, 0x0f, 0x08, 0x08, 0x09, 0x07, 0x04, + 0x02, 0x01, 0x01, 0x04, 0x01, 0x02, 0x08, 0x07, 0x01, 0xfd, 0xfd, 0x02, + 0x07, 0x08, 0xff, 0xf8, 0xf4, 0xf6, 0x02, 0x06, 0x0a, 0x04, 0x02, 0x05, + 0x0e, 0x0a, 0x06, 0x08, 0x05, 0x00, 0x01, 0x03, 0x01, 0xfe, 0xfe, 0xfd, + 0xfc, 0xfd, 0xfd, 0x07, 0x09, 0x01, 0xfb, 0xfa, 0xfe, 0x01, 0x00, 0x00, + 0xfc, 0xff, 0x00, 0xf9, 0xfb, 0xff, 0x00, 0xfe, 0xfe, 0xfd, 0x00, 0x02, + 0x00, 0x00, 0xfb, 0xfc, 0xfe, 0x09, 0x16, 0x13, 0x0c, 0x09, 0x09, 0x0a, + 0x0d, 0x0c, 0x0c, 0x0c, 0x14, 0x17, 0x18, 0x1b, 0x19, 0x12, 0x0f, 0x0e, + 0x0c, 0x06, 0x09, 0x0a, 0x06, 0x01, 0x02, 0xff, 0xfb, 0xfc, 0xfd, 0xfc, + 0xfb, 0xf5, 0xf0, 0xe8, 0xe6, 0xea, 0xec, 0xee, 0xee, 0xeb, 0xf4, 0xf3, + 0xf8, 0xf9, 0xfc, 0x00, 0x06, 0x19, 0x0f, 0x0e, 0x0f, 0x0a, 0x10, 0x0e, + 0x0f, 0x0e, 0x0e, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0b, 0x04, + 0x06, 0x0c, 0x06, 0x0a, 0x0b, 0x09, 0x09, 0x05, 0x01, 0x01, 0xfb, 0xf7, + 0xf6, 0xf6, 0xf7, 0xfb, 0xfe, 0xfb, 0xf9, 0xfa, 0xfa, 0xfa, 0xf7, 0xf5, + 0xfa, 0xf6, 0xf5, 0xfd, 0x0f, 0x11, 0x0a, 0x10, 0x08, 0x03, 0x09, 0x0c, + 0x0f, 0x0d, 0x0e, 0x10, 0x13, 0x11, 0x0d, 0x06, 0x04, 0x04, 0x01, 0xfe, + 0x06, 0x0d, 0x09, 0x05, 0xf9, 0xf2, 0xf5, 0xfa, 0xff, 0x05, 0x00, 0x00, + 0xff, 0xfc, 0xfe, 0x03, 0xfe, 0xfc, 0xf7, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, + 0xfd, 0xf8, 0xff, 0x0c, 0x1b, 0x19, 0x12, 0x09, 0x03, 0x06, 0x08, 0x0b, + 0x0e, 0x0d, 0x04, 0x0b, 0x1d, 0x14, 0x0c, 0x0b, 0x10, 0x0a, 0x07, 0x0c, + 0x10, 0x05, 0x03, 0xfe, 0xfa, 0xf9, 0xf7, 0xf7, 0xf5, 0xf5, 0xf2, 0xf3, + 0xf4, 0xf5, 0xfa, 0xfb, 0xfc, 0xfc, 0xf6, 0xf7, 0xf1, 0xf3, 0xf9, 0x00, + 0xff, 0x01, 0x07, 0x0a, 0x12, 0x0c, 0x12, 0x13, 0x0f, 0x11, 0x0e, 0x0a, + 0x11, 0x14, 0x11, 0x10, 0x0b, 0xfd, 0xf7, 0xfe, 0x03, 0xff, 0xff, 0x06, + 0x0f, 0x0c, 0x07, 0x07, 0x05, 0xff, 0xfe, 0x02, 0x02, 0x04, 0x00, 0xfe, + 0xfc, 0xfe, 0x02, 0x03, 0x02, 0xfe, 0xfb, 0xfb, 0xfb, 0xfb, 0xfe, 0x00, + 0x06, 0x11, 0x07, 0x11, 0x12, 0x0b, 0x0b, 0x09, 0x09, 0x07, 0x05, 0x02, + 0x02, 0x02, 0x04, 0x01, 0xff, 0xfd, 0xfa, 0xf7, 0xf4, 0xf9, 0x05, 0x03, + 0xfc, 0xf8, 0xf6, 0xf8, 0xfb, 0xfb, 0x00, 0xf7, 0xfa, 0x0c, 0x09, 0x04, + 0x04, 0x02, 0x04, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x05, + 0x0d, 0x0b, 0x0a, 0x1d, 0x1c, 0x15, 0x05, 0x05, 0x07, 0x11, 0x16, 0x15, + 0x15, 0x13, 0x0e, 0x0f, 0x0a, 0x08, 0x09, 0x05, 0x00, 0x07, 0x0b, 0x02, + 0x00, 0xfe, 0xf9, 0xf7, 0xf7, 0xf9, 0xfc, 0xfd, 0xfd, 0xf7, 0xed, 0xef, + 0xf5, 0xf2, 0xf1, 0xea, 0xe5, 0xef, 0xf8, 0xf5, 0xf1, 0xf5, 0xfd, 0x02, + 0xfe, 0xff, 0x0a, 0x14, 0x0b, 0x11, 0x11, 0x0e, 0x0b, 0x0b, 0x08, 0x0b, + 0x0f, 0x11, 0x0f, 0x0e, 0x0e, 0x15, 0x1b, 0x11, 0x08, 0x10, 0x10, 0x10, + 0x0c, 0x07, 0x08, 0x05, 0x01, 0xff, 0xff, 0x00, 0x02, 0x00, 0xfa, 0xfa, + 0xfe, 0x01, 0x01, 0x01, 0xfe, 0xf9, 0xf0, 0xe6, 0xe8, 0xf0, 0xfc, 0xf7, + 0xf5, 0xfa, 0x14, 0x1c, 0x0d, 0x06, 0x0d, 0x0d, 0x08, 0x09, 0x0d, 0x0f, + 0x0a, 0x06, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0x0b, 0x0d, 0x04, 0x02, + 0x01, 0x05, 0x0e, 0x05, 0x00, 0x01, 0x01, 0x07, 0x03, 0xfd, 0xfc, 0xfe, + 0xfc, 0xfb, 0xfa, 0xf5, 0xf4, 0xf4, 0xf2, 0xef, 0xf0, 0xff, 0x01, 0xfd, + 0x00, 0x04, 0x11, 0x0f, 0x09, 0x0c, 0x0b, 0x03, 0x00, 0x0d, 0x14, 0x22, + 0x1d, 0x14, 0x15, 0x14, 0x10, 0x0b, 0x0d, 0x12, 0x16, 0x0f, 0x0a, 0x06, + 0x01, 0x02, 0x03, 0xfd, 0xfd, 0x01, 0x05, 0xfb, 0xef, 0xef, 0x00, 0x05, + 0xfd, 0xf5, 0xef, 0xe8, 0xe9, 0xe7, 0xe8, 0xf2, 0xfb, 0x00, 0xfa, 0xf7, + 0xf8, 0xfd, 0x0e, 0x08, 0x0a, 0x0f, 0x0f, 0x11, 0x16, 0x16, 0x10, 0x09, + 0x07, 0x05, 0x04, 0x01, 0xfa, 0xfd, 0x03, 0x14, 0x1e, 0x17, 0x0e, 0x07, + 0x02, 0x02, 0x02, 0xff, 0x03, 0x04, 0x01, 0xfc, 0xfb, 0xfe, 0xfe, 0xfb, + 0xfc, 0xf7, 0xf9, 0xfd, 0xfd, 0xfe, 0x04, 0x11, 0x0d, 0x07, 0x04, 0x01, + 0x00, 0x0d, 0x17, 0x11, 0x11, 0x0f, 0x0d, 0x0c, 0x09, 0x06, 0x06, 0x03, + 0xfd, 0xfa, 0xfb, 0xfc, 0xfa, 0xfa, 0x02, 0x09, 0x02, 0xf0, 0xeb, 0xec, + 0xf1, 0xf2, 0xf7, 0xfa, 0x03, 0x10, 0x0b, 0x05, 0x02, 0x03, 0x00, 0xff, + 0xff, 0xfb, 0xfb, 0xfc, 0xfe, 0xfc, 0x01, 0x0a, 0x0b, 0x07, 0x07, 0x06, + 0x04, 0x17, 0x20, 0x24, 0x20, 0x16, 0x17, 0x14, 0x0f, 0x15, 0x0f, 0x0a, + 0x06, 0x06, 0x05, 0x03, 0x00, 0xfe, 0x05, 0x0c, 0x04, 0xfa, 0xf5, 0xf4, + 0xf8, 0xf9, 0xf9, 0xfe, 0xf7, 0xf2, 0xf4, 0xf3, 0xef, 0xed, 0xee, 0xf0, + 0xef, 0xf8, 0xff, 0xfd, 0xf6, 0xf5, 0x00, 0x04, 0x02, 0xfe, 0xfc, 0xfe, + 0x04, 0x17, 0x14, 0x14, 0x1e, 0x21, 0x1c, 0x18, 0x14, 0x0f, 0x0c, 0x0d, + 0x13, 0x14, 0x0f, 0x0b, 0x02, 0x02, 0x13, 0x12, 0x06, 0x02, 0x04, 0x02, + 0x01, 0xfe, 0x00, 0xfe, 0xfa, 0xf8, 0xf9, 0xfc, 0x00, 0xfd, 0xfa, 0xf9, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf8, 0xf9, 0xfe, 0x01, 0xfd, 0x01, 0x07, + 0x08, 0x17, 0x13, 0x0c, 0x0e, 0x08, 0x08, 0x0a, 0x0a, 0x05, 0x00, 0x00, + 0xfe, 0xfc, 0xfc, 0xfd, 0xf9, 0xfe, 0x10, 0x14, 0x09, 0x08, 0x07, 0x04, + 0x02, 0x04, 0x06, 0x0c, 0x0c, 0x05, 0x00, 0x00, 0x00, 0xfe, 0xfc, 0xf8, + 0xf8, 0xf5, 0xf1, 0xf3, 0xfb, 0x07, 0x08, 0x08, 0x02, 0xfd, 0xfe, 0xfc, + 0xf8, 0x09, 0x0b, 0x0c, 0x12, 0x0d, 0x09, 0x11, 0x1a, 0x15, 0x0f, 0x0c, + 0x09, 0x04, 0x02, 0x06, 0x09, 0x0b, 0x12, 0x0b, 0x06, 0x08, 0x07, 0x05, + 0x03, 0x01, 0xfa, 0xfc, 0x02, 0x02, 0x03, 0xfd, 0xf8, 0xf4, 0xf5, 0xf2, + 0xf0, 0xe7, 0xe6, 0xe7, 0xef, 0xf8, 0xfb, 0xfc, 0xf9, 0xf5, 0xf3, 0xf4, + 0xfa, 0x0f, 0x15, 0x1a, 0x16, 0x0f, 0x0c, 0x08, 0x09, 0x04, 0x04, 0x04, + 0x09, 0x07, 0x03, 0x05, 0x11, 0x21, 0x1f, 0x12, 0x0c, 0x0a, 0x08, 0x08, + 0x0b, 0x05, 0x00, 0x00, 0x02, 0x02, 0x08, 0x0a, 0x00, 0xfc, 0xfd, 0xfc, + 0x01, 0xfd, 0xf7, 0x07, 0x0a, 0x06, 0x06, 0x05, 0x03, 0x03, 0xfa, 0xf6, + 0x04, 0x19, 0x13, 0x0c, 0x09, 0x05, 0x01, 0x02, 0x01, 0xfd, 0xfe, 0xfc, + 0xf7, 0xf5, 0xf3, 0xf1, 0xf4, 0x00, 0x06, 0xfb, 0xfa, 0xfb, 0xf9, 0xf9, + 0xf7, 0xff, 0x0b, 0x0a, 0x06, 0xfd, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xf9, + 0xf5, 0xf7, 0xff, 0x0a, 0x0b, 0x09, 0x06, 0x06, 0x0e, 0x12, 0x06, 0x05, + 0x1a, 0x2c, 0x29, 0x24, 0x23, 0x1c, 0x12, 0x0b, 0x07, 0x08, 0x0a, 0x0a, + 0x07, 0x03, 0x02, 0x02, 0x02, 0x07, 0x0b, 0x0a, 0x05, 0x00, 0x00, 0xff, + 0xfb, 0xf7, 0xed, 0xe4, 0xea, 0xf2, 0xf4, 0xec, 0xe8, 0xe8, 0xed, 0xf7, + 0xf3, 0xef, 0xf3, 0xf9, 0xfd, 0xff, 0x02, 0x02, 0xfd, 0xfa, 0xff, 0x08, + 0x13, 0x1d, 0x18, 0x1d, 0x1b, 0x1e, 0x1b, 0x13, 0x0d, 0x16, 0x11, 0x0d, + 0x0b, 0x05, 0x04, 0x06, 0x00, 0x04, 0x0b, 0x0b, 0x0a, 0x05, 0x00, 0xff, + 0xfd, 0xf9, 0xfd, 0xfe, 0xfa, 0xfc, 0xfa, 0xf6, 0xf8, 0xf6, 0xf1, 0xeb, + 0xf1, 0xf8, 0x06, 0x0b, 0x03, 0x04, 0x05, 0x08, 0x10, 0x08, 0x04, 0x06, + 0x0e, 0x1a, 0x12, 0x0e, 0x0e, 0x0b, 0x09, 0x09, 0x05, 0x05, 0x04, 0xff, + 0xfb, 0xfe, 0x03, 0x02, 0xf4, 0x00, 0x15, 0x0d, 0x08, 0x05, 0x02, 0x00, + 0xfc, 0xf5, 0xf8, 0x04, 0x04, 0x01, 0xfc, 0xf6, 0xf7, 0xf6, 0xf5, 0xf4, + 0xf3, 0xfa, 0x07, 0x02, 0x03, 0x07, 0x06, 0xfd, 0xfa, 0x01, 0x06, 0x03, + 0x09, 0x12, 0x0a, 0x0a, 0x10, 0x16, 0x0c, 0x0c, 0x0a, 0x09, 0x0a, 0x05, + 0x04, 0x05, 0x08, 0x07, 0x08, 0x0d, 0x14, 0x0a, 0x07, 0x08, 0x06, 0x03, + 0xff, 0xfe, 0x00, 0x07, 0x0b, 0x04, 0xfe, 0xfc, 0xfb, 0xf3, 0xe7, 0xe8, + 0xee, 0xf7, 0xfc, 0xf9, 0xf7, 0xff, 0x01, 0xfb, 0xfc, 0x02, 0x03, 0x02, + 0x0a, 0x13, 0x13, 0x13, 0x0c, 0x07, 0xff, 0x00, 0x02, 0x01, 0xff, 0xfd, + 0xfe, 0x02, 0x0f, 0x0d, 0x0b, 0x11, 0x18, 0x0f, 0x08, 0x08, 0x07, 0x04, + 0x02, 0x04, 0x01, 0x00, 0x03, 0x03, 0xff, 0xff, 0x06, 0x02, 0xfd, 0xfe, + 0x08, 0x0d, 0x0a, 0x0a, 0x09, 0x03, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xff, + 0x06, 0x10, 0x0b, 0x07, 0x04, 0x02, 0x02, 0xfc, 0xfb, 0xfb, 0xf6, 0xf3, + 0xf1, 0xf0, 0xf4, 0xf6, 0xf8, 0x02, 0x0d, 0x04, 0xfd, 0xfb, 0x01, 0x0b, + 0x04, 0x00, 0x06, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0xff, 0xfe, 0x00, + 0x05, 0x0a, 0x10, 0x10, 0x14, 0x19, 0x13, 0x07, 0x07, 0x08, 0x0c, 0x0d, + 0x1c, 0x1f, 0x13, 0x11, 0x11, 0x0d, 0x0b, 0x07, 0x03, 0x00, 0x04, 0x06, + 0x02, 0x02, 0x00, 0xfc, 0xfc, 0x04, 0x0d, 0xff, 0xf8, 0xfa, 0xf8, 0xf7, + 0xf5, 0xf9, 0xf1, 0xea, 0xef, 0xeb, 0xe8, 0xef, 0xf7, 0xee, 0xee, 0xf1, + 0xf1, 0xf8, 0x01, 0xff, 0xff, 0x04, 0x05, 0x07, 0x0b, 0x06, 0x03, 0x05, + 0x17, 0x1d, 0x1f, 0x1d, 0x19, 0x0f, 0x12, 0x1a, 0x11, 0x0e, 0x10, 0x0d, + 0x0d, 0x0e, 0x0a, 0x06, 0x07, 0x14, 0x12, 0x03, 0x00, 0x04, 0x02, 0x00, + 0xfe, 0xfc, 0xfb, 0x00, 0xff, 0xfb, 0xfb, 0xf8, 0xed, 0xeb, 0xf5, 0xf9, + 0xf7, 0xfb, 0xff, 0xff, 0x04, 0x0e, 0x0a, 0x0a, 0x04, 0x00, 0x00, 0x04, + 0x15, 0x13, 0x0e, 0x0e, 0x0b, 0x07, 0x04, 0x01, 0xfd, 0xfd, 0xff, 0x04, + 0x02, 0xfc, 0xfa, 0x00, 0x03, 0x0c, 0x08, 0xfe, 0x00, 0x03, 0x00, 0xf8, + 0xf1, 0xf5, 0x00, 0x00, 0xfe, 0xfc, 0xfc, 0xfb, 0xf6, 0xf6, 0xf8, 0xfc, + 0x01, 0x06, 0x10, 0x0c, 0x05, 0x03, 0x06, 0x06, 0x00, 0xfd, 0x01, 0x09, + 0x1c, 0x20, 0x23, 0x16, 0x11, 0x0e, 0x0d, 0x08, 0x08, 0x0d, 0x0e, 0x0e, + 0x0a, 0x0c, 0x0a, 0x09, 0x08, 0x0f, 0x07, 0x01, 0x0c, 0x07, 0xf8, 0xf5, + 0xff, 0x00, 0xfc, 0xfc, 0xfd, 0xfb, 0xf8, 0xf2, 0xeb, 0xec, 0xee, 0xee, + 0xee, 0xf6, 0xfe, 0xf9, 0xfa, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfc, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x08, 0x00, 0xfc, 0xfe, 0xfd, 0x00, 0x0e, 0x11, + 0x08, 0x08, 0x0c, 0x0a, 0x10, 0x14, 0x0c, 0x02, 0x04, 0x0a, 0x0a, 0x06, + 0x04, 0xff, 0xff, 0x07, 0x0b, 0x07, 0x00, 0xff, 0x02, 0x0b, 0x09, 0x07, + 0x09, 0x11, 0x14, 0x0e, 0x07, 0x03, 0x02, 0xfe, 0xff, 0x01, 0x01, 0x13, + 0x15, 0x08, 0x05, 0x06, 0x04, 0x00, 0xfb, 0xf9, 0xf9, 0xf9, 0xf3, 0xe9, + 0xe8, 0xed, 0xec, 0xec, 0xfe, 0x00, 0xf8, 0x04, 0x06, 0x01, 0xfd, 0xfa, + 0xfb, 0x00, 0xff, 0x01, 0x00, 0x00, 0x05, 0x05, 0x02, 0x01, 0x00, 0x03, + 0x06, 0x05, 0x11, 0x15, 0x13, 0x18, 0x11, 0x09, 0x09, 0x0d, 0x16, 0x25, + 0x19, 0x0d, 0x0a, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x05, 0x04, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xfc, 0xf5, 0xf0, 0xf4, 0xf6, 0xf5, + 0xf3, 0xf2, 0xf4, 0xfa, 0x04, 0x00, 0xfb, 0xf6, 0xf4, 0xf4, 0xf2, 0xf2, + 0xf8, 0xfd, 0x07, 0x0f, 0x10, 0x0c, 0x06, 0x00, 0x01, 0x04, 0x0b, 0x13, + 0x0c, 0x14, 0x1c, 0x15, 0x0e, 0x10, 0x10, 0x12, 0x12, 0x0e, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xfe, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf4, 0xf0, 0xf0, 0xf0, 0xf2, 0xf6, + 0x00, 0x0a, 0x0a, 0x0a, 0x0b, 0x0c, 0x05, 0x00, 0x00, 0x05, 0x15, 0x1a, + 0x16, 0x10, 0x0c, 0x08, 0x06, 0x04, 0x00, 0xff, 0x00, 0x00, 0x02, 0x06, + 0x01, 0x00, 0x06, 0x16, 0x10, 0x0a, 0xfe, 0xf6, 0xf6, 0xfc, 0xf8, 0xf9, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x02, 0x02, 0x02, 0xfd, 0xf9, 0xfb, 0x00, + 0xf8, 0xec, 0xf6, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x16, 0x29, 0x20, + 0x18, 0x12, 0x0e, 0x0c, 0x08, 0x0a, 0x0d, 0x0b, 0x0a, 0x0b, 0x0a, 0x04, + 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x00, 0x03, 0x00, 0x06, 0x04, 0x00, + 0xff, 0x00, 0xf8, 0xf6, 0xf6, 0xf3, 0xf0, 0xec, 0xee, 0xf0, 0xf5, 0xf9, + 0xf6, 0xf6, 0x00, 0x08, 0x08, 0x01, 0xfc, 0xfd, 0xfe, 0x0a, 0x12, 0x0a, + 0x02, 0x07, 0x08, 0x06, 0x08, 0x12, 0x1c, 0x14, 0x0e, 0x0c, 0x07, 0x00, + 0x00, 0x07, 0x13, 0x12, 0x10, 0x0a, 0x0a, 0x0c, 0x08, 0x06, 0x04, 0x00, + 0x00, 0xf8, 0xf0, 0x04, 0x0e, 0x0b, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, + 0xff, 0xfa, 0x00, 0x03, 0x02, 0x00, 0x00, 0xfe, 0x02, 0x14, 0x10, 0x0a, + 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xfa, 0xf4, 0xee, 0xe8, 0xea, 0xed, 0xec, + 0xf2, 0x02, 0x08, 0x0b, 0x00, 0xfc, 0xff, 0x00, 0xff, 0xff, 0x02, 0x05, + 0x04, 0x01, 0x05, 0x0c, 0x0d, 0x04, 0x00, 0xff, 0x00, 0x02, 0x04, 0x04, + 0x0c, 0x0e, 0x1a, 0x1e, 0x17, 0x16, 0x12, 0x10, 0x18, 0x23, 0x14, 0x0e, + 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x06, 0x08, 0x08, 0x04, 0xfc, 0xf8, + 0x00, 0x04, 0xf8, 0xea, 0xe9, 0xec, 0xf3, 0xf4, 0xf2, 0xf6, 0xf8, 0x05, + 0x01, 0xfa, 0xfa, 0xfa, 0xf6, 0xf2, 0xf0, 0xf0, 0xf0, 0xf6, 0xf8, 0xfc, + 0x01, 0xff, 0x00, 0xfe, 0x00, 0x05, 0x04, 0x02, 0x15, 0x1f, 0x24, 0x1c, + 0x16, 0x16, 0x12, 0x10, 0x0e, 0x0e, 0x0a, 0x04, 0x02, 0x00, 0xfe, 0x04, + 0x12, 0x0a, 0x08, 0x06, 0x02, 0x04, 0x06, 0x02, 0x00, 0x00, 0xfc, 0xfc, + 0xfa, 0xf9, 0xf5, 0xf5, 0xfd, 0xfb, 0xf9, 0x04, 0x0f, 0x07, 0x01, 0x03, + 0x04, 0x01, 0x05, 0x05, 0x03, 0x05, 0x05, 0x12, 0x23, 0x1d, 0x11, 0x04, + 0x01, 0x03, 0x02, 0xf5, 0xfd, 0x01, 0x07, 0x0b, 0x00, 0xf9, 0xfe, 0x0d, + 0x05, 0xfb, 0xf9, 0xf5, 0xf5, 0xfb, 0xfb, 0xf7, 0xfd, 0x07, 0x02, 0xff, + 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xf9, 0xf9, 0xf6, 0xf1, 0xed, 0xf1, 0xef, + 0xf7, 0x01, 0x09, 0x09, 0x17, 0x19, 0x15, 0x24, 0x21, 0x17, 0x11, 0x0d, + 0x0c, 0x0b, 0x0d, 0x12, 0x13, 0x0f, 0x0b, 0x03, 0xfd, 0x04, 0x11, 0x0d, + 0x0f, 0x0d, 0x09, 0x0d, 0x07, 0x05, 0x03, 0x03, 0x05, 0x01, 0xfd, 0xfb, + 0xf5, 0xf8, 0xfb, 0xf7, 0xf3, 0xf1, 0xf1, 0xf5, 0xf7, 0xfb, 0xf9, 0xf5, + 0xef, 0xf5, 0xfb, 0xee, 0xe3, 0xee, 0x01, 0x0f, 0x13, 0x13, 0x0b, 0x07, + 0x0f, 0x19, 0x15, 0x14, 0x0b, 0x07, 0x03, 0x00, 0x00, 0x0b, 0x0b, 0x09, + 0x08, 0x0b, 0x0b, 0x07, 0x05, 0x03, 0x03, 0x07, 0x06, 0x03, 0xfe, 0x01, + 0x0a, 0x0d, 0x07, 0x05, 0x03, 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xff, 0xfd, + 0xfd, 0x04, 0x05, 0x00, 0xfc, 0x02, 0x17, 0x14, 0x0e, 0x0a, 0x05, 0x00, + 0xfb, 0x00, 0x00, 0xfe, 0xf6, 0xf0, 0xf6, 0xf8, 0x0a, 0x16, 0x0a, 0x04, + 0x00, 0xfd, 0xfc, 0xfa, 0xfa, 0xfa, 0x00, 0x0e, 0x0e, 0x08, 0x00, 0x00, + 0x05, 0x02, 0x00, 0xfe, 0xfa, 0x00, 0x02, 0x02, 0x0a, 0x0e, 0x04, 0x02, + 0x06, 0x12, 0x0c, 0x08, 0x08, 0x17, 0x21, 0x16, 0x10, 0x0c, 0x08, 0x06, + 0x08, 0x0c, 0x08, 0x02, 0x00, 0xfe, 0x00, 0x06, 0xfa, 0xf4, 0xf3, 0xf2, + 0xf0, 0xf2, 0xf4, 0xf7, 0xf6, 0x00, 0x0a, 0x08, 0x00, 0xf9, 0xf6, 0xf8, + 0xfa, 0xfa, 0xf6, 0xf7, 0xfb, 0xfd, 0xff, 0xfd, 0xfc, 0xfc, 0xf8, 0xf8, + 0x06, 0x10, 0x06, 0x08, 0x10, 0x26, 0x28, 0x24, 0x1c, 0x18, 0x12, 0x0e, + 0x12, 0x10, 0x0c, 0x07, 0x04, 0x0a, 0x16, 0x10, 0x08, 0x04, 0x00, 0x00, + 0x06, 0x06, 0x01, 0xfd, 0xf8, 0xed, 0xf6, 0xf6, 0xf2, 0xf0, 0xf6, 0x00, + 0xfe, 0xff, 0x07, 0x02, 0x00, 0xff, 0xfe, 0xfe, 0xfc, 0xfa, 0xf5, 0xf8, + 0x05, 0x04, 0x00, 0xfa, 0x0a, 0x16, 0x12, 0x05, 0x08, 0x0a, 0x05, 0x07, + 0x04, 0x02, 0x04, 0x00, 0x06, 0x14, 0x0b, 0x02, 0xfc, 0xfc, 0xfa, 0xf9, + 0xf8, 0xfa, 0xfc, 0xfa, 0xfc, 0x0a, 0x0c, 0x02, 0xfe, 0xfc, 0xfe, 0x00, + 0x00, 0xfc, 0xf8, 0xfc, 0xff, 0xfe, 0xfa, 0xfe, 0xfe, 0xfe, 0x0d, 0x18, + 0x1a, 0x14, 0x0e, 0x14, 0x1f, 0x1a, 0x14, 0x0e, 0x13, 0x12, 0x0e, 0x0e, + 0x0a, 0x06, 0x04, 0x0a, 0x1a, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0xfe, 0xfc, 0xf8, 0xff, 0x00, 0xfc, 0xf6, 0xee, 0xef, 0xf8, 0xfc, + 0xf9, 0xf6, 0xf5, 0xf6, 0xf6, 0xf8, 0xf0, 0xe8, 0xe8, 0xe6, 0xe7, 0xf4, + 0xf6, 0xf0, 0xf5, 0x12, 0x1b, 0x16, 0x1c, 0x1f, 0x14, 0x10, 0x10, 0x0c, + 0x0a, 0x08, 0x11, 0x12, 0x0f, 0x13, 0x0b, 0x06, 0x04, 0x01, 0x06, 0x0e, + 0x14, 0x10, 0x0c, 0x0e, 0x0e, 0x08, 0x08, 0x02, 0xfe, 0x01, 0x0c, 0x08, + 0x02, 0x00, 0xfe, 0xfb, 0xfe, 0xfc, 0xfe, 0x00, 0xfd, 0xfa, 0xfe, 0x00, + 0x00, 0xfe, 0x0d, 0x0f, 0x08, 0x00, 0xf6, 0xf9, 0xf8, 0xf8, 0xf9, 0xfa, + 0x00, 0x10, 0x14, 0x14, 0x05, 0x00, 0x00, 0xfe, 0xf8, 0xf6, 0xf7, 0xf3, + 0xf6, 0xfc, 0x00, 0x08, 0x06, 0x03, 0xfc, 0xfa, 0xfe, 0x05, 0x04, 0x02, + 0x01, 0xfd, 0x00, 0x08, 0x06, 0x03, 0x04, 0x01, 0x00, 0x06, 0x10, 0x08, + 0x06, 0x13, 0x18, 0x12, 0x13, 0x15, 0x12, 0x0b, 0x0a, 0x0a, 0x06, 0x06, + 0x0f, 0x0b, 0x07, 0x03, 0x01, 0xfd, 0xfb, 0xf8, 0xf8, 0xfb, 0xfe, 0x05, + 0xff, 0x03, 0x09, 0x03, 0x00, 0xfe, 0xfa, 0xf7, 0xf8, 0xfd, 0x00, 0x01, + 0xff, 0xfb, 0xfc, 0x02, 0xfb, 0xf7, 0xee, 0xef, 0xf4, 0xfe, 0x00, 0x02, + 0x0d, 0x1e, 0x1f, 0x18, 0x14, 0x14, 0x10, 0x08, 0x02, 0x00, 0x0b, 0x12, + 0x11, 0x10, 0x0a, 0x06, 0x04, 0x00, 0xf8, 0xf8, 0xfc, 0xfd, 0xf7, 0xf7, + 0xf9, 0xfc, 0xf6, 0xfc, 0xfc, 0xfe, 0x00, 0x08, 0x02, 0x00, 0x01, 0x00, + 0xfa, 0xfa, 0xfc, 0xfb, 0xf9, 0xfe, 0x01, 0x00, 0x05, 0x01, 0x07, 0x0f, + 0x1c, 0x14, 0x11, 0x11, 0x15, 0x13, 0x0c, 0x06, 0x08, 0x19, 0x17, 0x14, + 0x0d, 0x0a, 0x06, 0x01, 0xfc, 0xf8, 0xf5, 0xf8, 0xf9, 0xf6, 0xf3, 0xf8, + 0x06, 0x07, 0x02, 0x00, 0xfc, 0xf8, 0xec, 0xed, 0xf0, 0xf3, 0xf4, 0xf3, + 0xf5, 0xfc, 0x06, 0x0e, 0x08, 0x04, 0x07, 0x12, 0x0e, 0x06, 0x0a, 0x1c, + 0x15, 0x0f, 0x11, 0x13, 0x13, 0x0b, 0x11, 0x0f, 0x14, 0x0d, 0x08, 0x06, + 0x08, 0x06, 0x04, 0x03, 0x03, 0x00, 0x00, 0xfc, 0xf9, 0xf2, 0xf3, 0xfb, + 0xfa, 0xf5, 0xf2, 0xf2, 0xf7, 0xfa, 0xf9, 0x01, 0xfe, 0xfe, 0xfa, 0xf2, + 0xf0, 0xf2, 0xf4, 0xf6, 0xf4, 0xf4, 0xfc, 0xfa, 0xf3, 0xf8, 0x17, 0x30, + 0x28, 0x1d, 0x19, 0x1b, 0x19, 0x13, 0x19, 0x17, 0x13, 0x0e, 0x0b, 0x0d, + 0x11, 0x1a, 0x1c, 0x12, 0x0a, 0x04, 0xfb, 0xfa, 0xf9, 0xfc, 0x02, 0x02, + 0x07, 0x04, 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfc, 0xf8, 0xf4, 0xf1, 0xed, + 0xef, 0xf6, 0xf8, 0xf6, 0xf1, 0xf8, 0xfc, 0xf6, 0xf0, 0xff, 0x04, 0xff, + 0x00, 0x00, 0x00, 0x03, 0x08, 0x15, 0x15, 0x1e, 0x17, 0x0c, 0x04, 0x02, + 0x04, 0x02, 0x00, 0xfa, 0xf6, 0xf8, 0xfa, 0xf7, 0xfd, 0x0f, 0x13, 0x0e, + 0x0a, 0x07, 0x06, 0x03, 0xfe, 0x00, 0x04, 0x02, 0x03, 0xff, 0xfd, 0xff, + 0x05, 0x07, 0x05, 0x04, 0x0e, 0x0d, 0x05, 0x01, 0x11, 0x15, 0x0e, 0x0f, + 0x0e, 0x0c, 0x10, 0x18, 0x1b, 0x09, 0xfc, 0xfa, 0xf9, 0xf9, 0xfa, 0xfc, + 0xfe, 0xfe, 0xfe, 0x08, 0x0c, 0x09, 0xfe, 0xf5, 0xf6, 0xf8, 0xfb, 0xfc, + 0xf8, 0xf8, 0xfd, 0xfa, 0xff, 0x03, 0x02, 0x03, 0xfa, 0xf5, 0xf1, 0xf2, + 0xf2, 0xf4, 0xf7, 0x02, 0x09, 0x00, 0xfc, 0x0c, 0x1a, 0x12, 0x0a, 0x08, + 0x06, 0x08, 0x15, 0x13, 0x0d, 0x06, 0x06, 0x07, 0x06, 0x05, 0x09, 0x0a, + 0x0a, 0x07, 0x03, 0x01, 0xff, 0xfd, 0xfc, 0xfb, 0xf8, 0xfd, 0x02, 0x12, + 0x16, 0x0f, 0x07, 0x04, 0x08, 0x04, 0x00, 0x00, 0xfc, 0xf9, 0xfa, 0x04, + 0x08, 0x03, 0x0a, 0x11, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x00, 0xfe, 0x05, + 0x15, 0x21, 0x19, 0x11, 0x0b, 0x08, 0x02, 0x00, 0x00, 0xfa, 0xf7, 0xf8, + 0xf6, 0xf1, 0xed, 0xec, 0xec, 0xee, 0xf7, 0xfc, 0xf6, 0xf4, 0xf5, 0xf4, + 0xf3, 0xf4, 0xf7, 0xfd, 0xfe, 0xfa, 0xfe, 0x0b, 0x0a, 0x05, 0x04, 0x03, + 0x06, 0x0d, 0x0b, 0x08, 0x03, 0x0e, 0x1b, 0x23, 0x22, 0x18, 0x13, 0x1d, + 0x25, 0x20, 0x1b, 0x15, 0x0f, 0x09, 0x02, 0x03, 0x07, 0x09, 0x0b, 0x06, + 0x02, 0xff, 0xff, 0xfe, 0xfe, 0xf4, 0xef, 0xef, 0xf1, 0xf4, 0xf9, 0xfc, + 0xf8, 0xf5, 0xfb, 0x00, 0xfd, 0xf3, 0xe8, 0xe8, 0xe6, 0xe9, 0xeb, 0xee, + 0xf8, 0xf9, 0xfc, 0x0c, 0x19, 0x2a, 0x22, 0x18, 0x14, 0x0b, 0x0b, 0x15, + 0x18, 0x12, 0x0b, 0x10, 0x0d, 0x09, 0x08, 0x09, 0x0c, 0x0b, 0x0c, 0x0c, + 0x0a, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0xfc, 0xfc, 0xfb, 0xf9, 0xf8, + 0xf7, 0xf5, 0xf6, 0xf6, 0xf7, 0xf5, 0xf2, 0xf4, 0xf8, 0xf8, 0xf9, 0x00, + 0xfc, 0xfc, 0xf8, 0x04, 0x0f, 0x07, 0x02, 0x00, 0xff, 0x12, 0x1d, 0x2a, + 0x26, 0x1e, 0x17, 0x11, 0x0d, 0x0b, 0x06, 0x03, 0x02, 0x00, 0x02, 0x0a, + 0x08, 0x06, 0x03, 0x04, 0x0b, 0xfe, 0xf1, 0xf2, 0xf2, 0xf5, 0xfa, 0x00, + 0xfd, 0xff, 0x04, 0x01, 0xfe, 0xf8, 0xf7, 0xfb, 0xff, 0x03, 0x03, 0xff, + 0xfd, 0xfa, 0x00, 0x0b, 0x06, 0x01, 0x03, 0x05, 0x0b, 0x13, 0x0e, 0x0d, + 0x09, 0x08, 0x02, 0xff, 0xfe, 0x00, 0x04, 0x13, 0x11, 0x0a, 0x07, 0x07, + 0x09, 0x00, 0xf9, 0xf2, 0xee, 0xeb, 0xf4, 0x06, 0x08, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x03, 0x03, 0xfe, 0xfb, 0xfd, 0xff, 0x02, 0xff, 0x00, 0xfc, + 0xfc, 0x07, 0x1b, 0x16, 0x11, 0x09, 0x04, 0x0d, 0x14, 0x12, 0x10, 0x10, + 0x0e, 0x0a, 0x04, 0x00, 0x00, 0xfc, 0xf8, 0xfd, 0x02, 0x01, 0x00, 0xff, + 0xfe, 0xfa, 0xfd, 0x09, 0x05, 0xff, 0x05, 0x05, 0x04, 0x02, 0xff, 0x00, + 0xfe, 0xfc, 0xf7, 0xfe, 0xfe, 0xf9, 0xfe, 0x09, 0x05, 0x03, 0x01, 0xfe, + 0x01, 0x13, 0x10, 0x08, 0x07, 0x08, 0x11, 0x1b, 0x14, 0x0d, 0x06, 0x03, + 0x01, 0xfc, 0xf7, 0xf5, 0xf6, 0xf9, 0xfa, 0xfa, 0xfb, 0xfd, 0xfa, 0xf7, + 0xf7, 0xfb, 0xf8, 0xf8, 0xf7, 0xf2, 0xf4, 0xf5, 0xf8, 0xf8, 0x01, 0x15, + 0x16, 0x10, 0x0d, 0x0a, 0x09, 0x0e, 0x14, 0x12, 0x0c, 0x05, 0x05, 0x15, + 0x24, 0x1b, 0x15, 0x15, 0x17, 0x12, 0x13, 0x13, 0x12, 0x15, 0x15, 0x0d, + 0x09, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x03, 0x01, 0xf8, 0xf3, 0xec, + 0xed, 0xe9, 0xe4, 0xe1, 0xe6, 0xee, 0xec, 0xea, 0xe9, 0xf0, 0xf6, 0xf7, + 0xf5, 0xf5, 0xf7, 0xf8, 0xfb, 0xfb, 0x00, 0x0d, 0x07, 0x01, 0x06, 0x1c, + 0x1a, 0x12, 0x0d, 0x0d, 0x0f, 0x19, 0x1c, 0x1f, 0x18, 0x14, 0x13, 0x12, + 0x0e, 0x0e, 0x0a, 0x0b, 0x0e, 0x14, 0x16, 0x0f, 0x0b, 0x08, 0x00, 0xff, + 0x00, 0xfc, 0xfb, 0xfd, 0xfc, 0xf4, 0xf3, 0xf5, 0xf9, 0xfe, 0x01, 0xff, + 0xfc, 0xfb, 0x00, 0x01, 0xfe, 0xf1, 0xeb, 0xf0, 0xf1, 0xf5, 0x06, 0x02, + 0xff, 0xff, 0xfe, 0x14, 0x26, 0x25, 0x1d, 0x16, 0x13, 0x0d, 0x06, 0x02, + 0xff, 0xfe, 0xfb, 0x00, 0x03, 0x01, 0xff, 0x00, 0xfa, 0xfa, 0x00, 0x01, + 0x00, 0x02, 0xff, 0xfe, 0xfd, 0xf8, 0xf8, 0xfc, 0xff, 0xfb, 0xfa, 0xfc, + 0xfc, 0xfc, 0x04, 0x02, 0xfc, 0xfe, 0x01, 0xfd, 0xfc, 0x0e, 0x0d, 0x06, + 0x06, 0x03, 0x08, 0x15, 0x17, 0x10, 0x12, 0x11, 0x0c, 0x08, 0x07, 0x17, + 0x16, 0x14, 0x16, 0x16, 0x10, 0x0c, 0x0a, 0x03, 0xfc, 0xfa, 0xfb, 0xfd, + 0xfc, 0xfa, 0xfd, 0x00, 0xfa, 0xec, 0xea, 0xf4, 0xff, 0x02, 0xfd, 0xfd, + 0x00, 0x04, 0x03, 0xfe, 0xfb, 0xf6, 0xf1, 0xf6, 0x08, 0x0f, 0x04, 0x00, + 0xfe, 0xfe, 0x08, 0x10, 0x09, 0x09, 0x05, 0x03, 0x01, 0x02, 0x00, 0xff, + 0x00, 0x06, 0x07, 0x07, 0x07, 0x04, 0x02, 0x0c, 0x0d, 0x09, 0x05, 0x01, + 0xfe, 0xff, 0xff, 0xfc, 0xfa, 0xfb, 0xfe, 0x03, 0x09, 0x06, 0x06, 0x03, + 0x0d, 0x0f, 0x08, 0x03, 0x04, 0x06, 0xff, 0x0b, 0x13, 0x0a, 0x04, 0x01, + 0x03, 0x0c, 0x1a, 0x15, 0x10, 0x09, 0x06, 0x00, 0xfe, 0xfe, 0x01, 0xfd, + 0xff, 0x02, 0x03, 0x02, 0x00, 0xf2, 0xe4, 0xed, 0xf6, 0xf5, 0xf2, 0xf2, + 0xf7, 0xf8, 0xf8, 0x04, 0x08, 0x05, 0x03, 0x06, 0x06, 0x01, 0x05, 0x0e, + 0x0e, 0x0a, 0x06, 0x00, 0x02, 0x01, 0x0a, 0x16, 0x0d, 0x09, 0x05, 0x05, + 0x13, 0x27, 0x25, 0x1d, 0x19, 0x13, 0x0e, 0x09, 0x03, 0x05, 0x04, 0x05, + 0x02, 0xfc, 0xfc, 0xfa, 0xf7, 0xef, 0xee, 0xee, 0xed, 0xec, 0xec, 0xea, + 0xf2, 0xfa, 0xf2, 0xf1, 0xeb, 0xeb, 0xf2, 0xf5, 0xf7, 0xfb, 0x02, 0x0c, + 0x16, 0x10, 0x0d, 0x08, 0x00, 0x04, 0x20, 0x1e, 0x14, 0x0d, 0x0e, 0x13, + 0x1f, 0x28, 0x25, 0x1f, 0x16, 0x09, 0xfc, 0xfe, 0x07, 0x16, 0x18, 0x13, + 0x0c, 0x09, 0x09, 0x06, 0x00, 0xfc, 0xf9, 0xf7, 0xf2, 0xee, 0xf2, 0xf2, + 0xf3, 0xf3, 0xf4, 0xee, 0xe7, 0xed, 0xf2, 0xf5, 0xf9, 0x05, 0x02, 0xfb, + 0xfd, 0xfc, 0xfa, 0xf2, 0xf5, 0x08, 0x08, 0x0d, 0x13, 0x09, 0x0c, 0x12, + 0x1c, 0x18, 0x12, 0x10, 0x0c, 0x05, 0x03, 0x01, 0x04, 0x10, 0x0c, 0x06, + 0x01, 0x01, 0x01, 0xfb, 0xfd, 0x0a, 0x09, 0x05, 0x01, 0x00, 0xff, 0xfc, + 0xfd, 0xfe, 0xfe, 0xfc, 0xf6, 0xf2, 0xfb, 0x01, 0x07, 0x09, 0x06, 0x02, + 0x03, 0x03, 0x03, 0x00, 0x0e, 0x0f, 0xfc, 0xfa, 0xfd, 0x01, 0x02, 0x09, + 0x17, 0x13, 0x11, 0x18, 0x1f, 0x15, 0x11, 0x10, 0x13, 0x10, 0x09, 0x04, + 0x02, 0x00, 0xfb, 0xf6, 0xee, 0xf3, 0xf6, 0xf3, 0xf5, 0xf4, 0xef, 0xf4, + 0xfc, 0x00, 0xfb, 0xf9, 0xf9, 0xfb, 0xfb, 0xfd, 0x02, 0x01, 0xfd, 0xfc, + 0xf8, 0xf1, 0xf3, 0x04, 0x15, 0x09, 0x03, 0x04, 0x03, 0x04, 0x02, 0x0d, + 0x16, 0x12, 0x0d, 0x0a, 0x05, 0x03, 0x06, 0x0f, 0x12, 0x09, 0x06, 0x0b, + 0x1c, 0x13, 0x0c, 0x0b, 0x0b, 0x05, 0xfe, 0xfe, 0x03, 0x02, 0x00, 0x01, + 0x02, 0x01, 0x05, 0x04, 0xff, 0xff, 0xfc, 0x01, 0x06, 0x0a, 0x05, 0x02, + 0x03, 0x00, 0x03, 0x0f, 0x09, 0x03, 0x01, 0xff, 0xfb, 0xf4, 0xfc, 0x0c, + 0x09, 0x02, 0x00, 0xfa, 0xfb, 0xf6, 0xf7, 0xfd, 0xfd, 0xfa, 0xf6, 0xf7, + 0xf6, 0xf2, 0xf6, 0x00, 0x00, 0xfd, 0xfc, 0xfc, 0x05, 0x09, 0x07, 0x07, + 0x02, 0x00, 0xff, 0xfd, 0xfc, 0x00, 0x0c, 0x0e, 0x09, 0x06, 0x03, 0x09, + 0x0a, 0x09, 0x16, 0x16, 0x13, 0x11, 0x13, 0x12, 0x10, 0x0f, 0x13, 0x1c, + 0x18, 0x15, 0x11, 0x0f, 0x0c, 0x0a, 0x0d, 0x09, 0x02, 0x00, 0x00, 0xfb, + 0xf6, 0xf5, 0xf6, 0xf4, 0xf0, 0xed, 0xe7, 0xe2, 0xe7, 0xec, 0xf3, 0xf2, + 0xf2, 0xf5, 0xfc, 0xf7, 0xf9, 0x09, 0x0e, 0x07, 0x04, 0x02, 0x00, 0xfb, + 0xfb, 0x07, 0x1b, 0x18, 0x0f, 0x08, 0x01, 0xff, 0x09, 0x0a, 0x10, 0x16, + 0x13, 0x13, 0x14, 0x11, 0x11, 0x13, 0x10, 0x0f, 0x09, 0x06, 0x06, 0x02, + 0xfe, 0xfc, 0xf9, 0xf9, 0xf7, 0xf5, 0xf3, 0xf4, 0xf7, 0xf6, 0xf4, 0xf6, + 0xf8, 0xfa, 0xfb, 0xfa, 0xff, 0x04, 0x08, 0x04, 0x01, 0x02, 0x03, 0xfc, + 0x00, 0x1d, 0x21, 0x16, 0x0d, 0x0c, 0x0b, 0x08, 0x06, 0x04, 0x0f, 0x15, + 0x12, 0x0c, 0x07, 0x06, 0x07, 0x0c, 0x07, 0xfc, 0xfa, 0xfe, 0xff, 0xfe, + 0xfe, 0x07, 0x04, 0x01, 0xfe, 0xf8, 0xf8, 0xff, 0xfb, 0xf6, 0xf4, 0xf2, + 0xf2, 0xf3, 0xf6, 0xf9, 0xfc, 0x01, 0x04, 0x00, 0xfc, 0xfc, 0xf8, 0xf9, + 0x08, 0x18, 0x10, 0x0a, 0x04, 0x05, 0x0c, 0x0c, 0x06, 0x0d, 0x1e, 0x20, + 0x18, 0x16, 0x14, 0x17, 0x17, 0x0f, 0x05, 0xff, 0x02, 0x00, 0xf9, 0xf7, + 0xf4, 0xf7, 0xfc, 0xf9, 0xfb, 0xf7, 0xfb, 0x02, 0xfb, 0xf9, 0xfc, 0xfa, + 0xfb, 0xfc, 0xfc, 0xfc, 0x02, 0x07, 0x04, 0xfe, 0xf9, 0xf6, 0xf6, 0x00, + 0x1d, 0x1b, 0x0e, 0x08, 0x04, 0x06, 0x09, 0x03, 0xfa, 0xfc, 0x09, 0x0d, + 0x0b, 0x0a, 0x11, 0x16, 0x0f, 0x0b, 0x11, 0x10, 0x09, 0x07, 0x04, 0x00, + 0x02, 0x00, 0xfa, 0xf6, 0xf8, 0xfa, 0xfb, 0xf8, 0xf8, 0xf2, 0xf5, 0x01, + 0x02, 0x04, 0x05, 0x10, 0x11, 0x07, 0x06, 0x00, 0xfc, 0xfc, 0x00, 0x0b, + 0x14, 0x0c, 0x02, 0xfd, 0xfd, 0xfc, 0xfb, 0xf9, 0xf8, 0xfd, 0x0a, 0x06, + 0x00, 0x02, 0x07, 0x06, 0x03, 0x00, 0xfe, 0xfa, 0xfa, 0xf9, 0xfd, 0x05, + 0x05, 0x02, 0x05, 0x08, 0x05, 0x0c, 0x0a, 0x08, 0x05, 0x03, 0x02, 0xfe, + 0xfe, 0x01, 0x04, 0x10, 0x0a, 0x06, 0x03, 0x03, 0x07, 0x03, 0x09, 0x1b, + 0x1e, 0x16, 0x10, 0x0b, 0x08, 0x06, 0x05, 0x06, 0x07, 0x07, 0x0d, 0x0a, + 0x06, 0x08, 0x08, 0x05, 0x01, 0x00, 0xfc, 0xf4, 0xef, 0xf1, 0xf4, 0xf0, + 0xf1, 0xf3, 0xf2, 0xf2, 0xf2, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xfc, 0x05, + 0x02, 0x01, 0x04, 0x08, 0x05, 0x05, 0x00, 0xfb, 0xfe, 0x01, 0x0d, 0x1c, + 0x13, 0x0a, 0x06, 0x0a, 0x0c, 0x13, 0x12, 0x10, 0x0d, 0x0f, 0x13, 0x16, + 0x11, 0x15, 0x16, 0x15, 0x0f, 0x0d, 0x09, 0x01, 0x00, 0x00, 0xfd, 0xfb, + 0xfd, 0xfe, 0xfe, 0xfe, 0xf9, 0xf2, 0xf5, 0xff, 0x01, 0xf7, 0xf1, 0xf5, + 0xfa, 0xfd, 0x05, 0x08, 0x00, 0x00, 0xfc, 0xfe, 0x0a, 0x07, 0x15, 0x12, + 0x0b, 0x07, 0x05, 0x01, 0xfc, 0xfb, 0xfa, 0xfa, 0xf8, 0xf9, 0x07, 0x0a, + 0x03, 0x03, 0x08, 0x09, 0x06, 0x06, 0x03, 0xfc, 0xfb, 0xfd, 0x00, 0x03, + 0x04, 0x03, 0x05, 0xfc, 0xf9, 0xfa, 0xfd, 0xfb, 0xfa, 0xfb, 0xfe, 0xff, + 0xfe, 0xf9, 0xfe, 0x04, 0x09, 0x0b, 0x06, 0x07, 0x05, 0x0a, 0x1c, 0x14, + 0x0d, 0x0f, 0x0e, 0x0d, 0x15, 0x16, 0x15, 0x10, 0x0f, 0x10, 0x14, 0x18, + 0x16, 0x12, 0x0b, 0x07, 0x04, 0x00, 0xfa, 0xf7, 0xf7, 0xf6, 0xef, 0xf1, + 0xfa, 0xfe, 0xfe, 0xf7, 0xf5, 0xf6, 0xf2, 0xef, 0xf1, 0xfa, 0xfe, 0xf8, + 0xf1, 0xed, 0xf2, 0xf6, 0xfa, 0xfa, 0xfb, 0xfb, 0xfa, 0x0c, 0x0f, 0x0b, + 0x0e, 0x10, 0x0e, 0x07, 0x05, 0x05, 0x06, 0x05, 0x05, 0x07, 0x0f, 0x12, + 0x14, 0x1e, 0x1b, 0x14, 0x0e, 0x0a, 0x05, 0x02, 0x04, 0x03, 0xff, 0xfd, + 0xff, 0x01, 0xfe, 0xfd, 0x00, 0xfe, 0xfc, 0xfb, 0x04, 0x09, 0x07, 0x05, + 0x06, 0x02, 0x05, 0x08, 0x07, 0x06, 0x07, 0x03, 0x01, 0x0e, 0x0d, 0x05, + 0x04, 0x05, 0x01, 0x00, 0xfc, 0xf8, 0xfa, 0xf8, 0xf8, 0x02, 0x0e, 0x01, + 0xfe, 0xfa, 0xfe, 0x02, 0xff, 0xfb, 0xf5, 0xf2, 0xfc, 0x09, 0x0f, 0x0b, + 0x0a, 0x03, 0xff, 0xff, 0xfe, 0xfc, 0xf8, 0xf9, 0xfb, 0xff, 0xff, 0xfd, + 0xfa, 0xfd, 0x02, 0x01, 0x03, 0x10, 0x0e, 0x08, 0x12, 0x1e, 0x17, 0x0f, + 0x0e, 0x0e, 0x11, 0x0e, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x06, 0x12, 0x11, + 0x0c, 0x06, 0x05, 0x00, 0xfc, 0xf8, 0xfb, 0xfe, 0xfe, 0xfc, 0xfb, 0xfd, + 0xf9, 0xfa, 0xf6, 0xf7, 0xfa, 0xf9, 0x00, 0x02, 0x00, 0x00, 0xff, 0xfc, + 0xfa, 0xfa, 0xfd, 0x00, 0x03, 0x02, 0xff, 0x03, 0x14, 0x13, 0x10, 0x0b, + 0x02, 0x03, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x06, 0x00, 0x06, 0x12, 0x12, + 0x0c, 0x07, 0x03, 0x02, 0xff, 0xfd, 0xfe, 0xff, 0xfe, 0xfc, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x02, 0xfb, 0xf5, 0xf4, 0xfa, 0x00, 0x00, 0xfe, 0xfd, + 0xfd, 0xfe, 0x06, 0x16, 0x11, 0x07, 0x02, 0x04, 0x14, 0x12, 0x09, 0x05, + 0x05, 0x04, 0x04, 0x04, 0xff, 0xfe, 0xf9, 0xf3, 0xf6, 0x03, 0x11, 0x14, + 0x0d, 0x04, 0x01, 0x04, 0x03, 0xfe, 0xfb, 0x06, 0x0c, 0x07, 0x0a, 0x06, + 0x02, 0x01, 0x00, 0x00, 0xfb, 0xfb, 0xfc, 0xfd, 0xff, 0xfe, 0xfa, 0xfa, + 0xfa, 0xf2, 0xfc, 0x06, 0x0b, 0x08, 0x05, 0x07, 0x13, 0x10, 0x0f, 0x13, + 0x1c, 0x14, 0x0a, 0x06, 0x03, 0x01, 0xff, 0x00, 0x05, 0x10, 0x12, 0x10, + 0x09, 0x07, 0x01, 0xfa, 0xf9, 0xf3, 0xf2, 0xfe, 0x01, 0xff, 0xfc, 0xfa, + 0xfc, 0xfc, 0xf9, 0xf7, 0xfa, 0xf6, 0xf3, 0xf2, 0xf8, 0xfa, 0xf6, 0xf4, + 0xf5, 0xf2, 0xfd, 0x05, 0x04, 0xfe, 0x00, 0x0e, 0x1a, 0x18, 0x13, 0x11, + 0x11, 0x0f, 0x10, 0x0c, 0x09, 0x06, 0x05, 0x05, 0x15, 0x23, 0x16, 0x11, + 0x0d, 0x0b, 0x0e, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x06, 0x03, 0xfe, + 0xfa, 0xf8, 0xef, 0xf0, 0x01, 0x03, 0xff, 0xfb, 0xf8, 0xf8, 0xfe, 0xfd, + 0xff, 0x00, 0xff, 0x03, 0x01, 0xfd, 0xfc, 0x05, 0x08, 0x03, 0x05, 0x04, + 0x00, 0xff, 0x00, 0xfc, 0xf7, 0xf5, 0xf3, 0xf4, 0x05, 0x0d, 0x05, 0x03, + 0x01, 0x01, 0xfe, 0xfd, 0xff, 0x07, 0x0d, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, + 0x0b, 0x06, 0x03, 0x02, 0x00, 0xfe, 0xfd, 0xfc, 0xfa, 0xf7, 0xf9, 0xf9, + 0x04, 0x0b, 0x0b, 0x15, 0x11, 0x07, 0x08, 0x1d, 0x21, 0x1b, 0x15, 0x0d, + 0x09, 0x09, 0x09, 0x05, 0x02, 0x01, 0x03, 0x07, 0x13, 0x0c, 0x08, 0x07, + 0x04, 0xff, 0xfb, 0xf8, 0xef, 0xf6, 0xfd, 0xfd, 0x01, 0xf9, 0xf4, 0xf7, + 0xf7, 0xf6, 0xfe, 0xfd, 0xf7, 0xf2, 0xf2, 0xf8, 0xfb, 0xf6, 0xf4, 0xf3, + 0xf5, 0xf8, 0xfd, 0x01, 0x00, 0xfb, 0x06, 0x17, 0x17, 0x1b, 0x14, 0x10, + 0x0b, 0x06, 0x03, 0x04, 0x09, 0x0a, 0x09, 0x13, 0x13, 0x0b, 0x07, 0x08, + 0x08, 0x05, 0x05, 0x07, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0xff, 0xff, + 0x03, 0x00, 0x03, 0x04, 0x07, 0x07, 0x01, 0xfd, 0xfd, 0xfb, 0xfb, 0x05, + 0x07, 0x02, 0x04, 0x0b, 0x0d, 0x08, 0x0c, 0x15, 0x0b, 0x01, 0x00, 0xfe, + 0xfb, 0xf9, 0xf8, 0xf4, 0xf6, 0xf8, 0x05, 0x0d, 0x05, 0xfe, 0xf7, 0xfa, + 0xfe, 0x02, 0x05, 0x01, 0xff, 0x00, 0x05, 0x08, 0x01, 0xff, 0x03, 0x05, + 0x04, 0x03, 0x00, 0xfb, 0xfc, 0xfc, 0xfb, 0xf8, 0xf4, 0xf4, 0xf4, 0xfe, + 0x04, 0x04, 0x07, 0x0e, 0x0d, 0x09, 0x0b, 0x18, 0x1b, 0x18, 0x13, 0x10, + 0x0e, 0x0b, 0x09, 0x06, 0x04, 0x04, 0x0e, 0x0a, 0x07, 0x05, 0x08, 0x06, + 0x04, 0x03, 0x07, 0x06, 0x09, 0x04, 0x01, 0xff, 0xfa, 0xfa, 0x06, 0x07, + 0xff, 0xfb, 0xfa, 0xf7, 0xf8, 0xfa, 0xf9, 0xf6, 0xf0, 0xee, 0xf0, 0xf6, + 0xf4, 0xf9, 0x02, 0x05, 0xff, 0x05, 0x0e, 0x14, 0x15, 0x14, 0x0f, 0x06, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x13, 0x18, 0x10, 0x0c, 0x07, 0x08, 0x09, + 0x07, 0x03, 0x02, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x01, 0x0a, 0x09, + 0x03, 0xfe, 0xfb, 0xfc, 0xfc, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0x04, 0x00, + 0xfc, 0x02, 0x07, 0x05, 0x04, 0x02, 0x02, 0x0b, 0x05, 0x01, 0x03, 0xfe, + 0xfd, 0xf9, 0xf8, 0xfe, 0x08, 0x12, 0x0b, 0x06, 0x03, 0xff, 0xfc, 0xfa, + 0xf9, 0xfb, 0x0c, 0x0d, 0x0c, 0x10, 0x11, 0x0f, 0x0d, 0x0b, 0x02, 0xfd, + 0xfb, 0xfd, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xf7, 0xfb, 0x00, 0xfc, + 0xff, 0x00, 0x09, 0x15, 0x15, 0x0d, 0x0c, 0x14, 0x0f, 0x0e, 0x0a, 0x01, + 0x00, 0x00, 0x02, 0x02, 0x0a, 0x0a, 0x06, 0x05, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xfc, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfd, 0x03, + 0x05, 0x01, 0xfe, 0xfc, 0xfc, 0xf9, 0xef, 0xee, 0xf1, 0xf4, 0xf6, 0xfc, + 0xff, 0xfe, 0x09, 0x13, 0x0c, 0x0e, 0x19, 0x21, 0x19, 0x12, 0x0c, 0x09, + 0x08, 0x0e, 0x0d, 0x12, 0x13, 0x0e, 0x09, 0x07, 0x06, 0x08, 0x06, 0x03, + 0x00, 0x02, 0x05, 0x05, 0x03, 0x04, 0x03, 0x06, 0x08, 0x01, 0xfa, 0xfa, + 0xf9, 0xf9, 0xf9, 0xf7, 0xf7, 0xf6, 0xf6, 0xf6, 0x06, 0x0d, 0x08, 0x01, + 0xfc, 0xfb, 0x00, 0xff, 0xfa, 0xfb, 0x06, 0x12, 0x08, 0xfb, 0xfe, 0x03, + 0x00, 0x01, 0x09, 0x06, 0x03, 0xff, 0xfe, 0x02, 0x00, 0x06, 0x08, 0x04, + 0x05, 0x03, 0x03, 0x01, 0x08, 0x10, 0x0d, 0x09, 0x06, 0x03, 0xfe, 0xfc, + 0xfd, 0xfe, 0xfc, 0xff, 0xfe, 0xfd, 0xfe, 0x02, 0x08, 0x07, 0x06, 0x03, + 0xff, 0x02, 0x0c, 0x08, 0x04, 0x0f, 0x1c, 0x1f, 0x14, 0x0b, 0x06, 0x00, + 0x00, 0x06, 0x08, 0x0b, 0x0d, 0x08, 0x08, 0x0e, 0x0f, 0x0c, 0x09, 0xfc, + 0xf6, 0xf6, 0xf8, 0xfe, 0x01, 0x02, 0x06, 0x06, 0x02, 0xff, 0xfb, 0xf6, + 0xf6, 0xf6, 0xf2, 0xed, 0xef, 0xf3, 0xf8, 0xfa, 0xf1, 0xeb, 0xed, 0xf5, + 0xfb, 0xfe, 0x05, 0x05, 0x05, 0x07, 0x14, 0x17, 0x0c, 0x09, 0x07, 0x05, + 0x0c, 0x0e, 0x17, 0x16, 0x0f, 0x0a, 0x07, 0x05, 0x07, 0x07, 0x06, 0x09, + 0x09, 0x04, 0x07, 0x0e, 0x11, 0x0d, 0x0c, 0x09, 0x05, 0x02, 0x01, 0x03, + 0x00, 0xfb, 0xfc, 0x02, 0x03, 0x04, 0x08, 0x04, 0x02, 0x00, 0x00, 0xfb, + 0xf8, 0xfd, 0x00, 0x00, 0xfe, 0xfc, 0x03, 0x08, 0x03, 0x04, 0x06, 0x0f, + 0xfe, 0xf5, 0xf8, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfb, 0xfa, 0x09, + 0x0a, 0x01, 0xfd, 0xff, 0x04, 0x07, 0x0a, 0x07, 0xff, 0xfa, 0x01, 0x06, + 0x02, 0x00, 0xfd, 0xf9, 0xfe, 0x05, 0x04, 0x06, 0x06, 0x06, 0x07, 0x08, + 0x0d, 0x13, 0x12, 0x0e, 0x09, 0x07, 0x10, 0x11, 0x0a, 0x09, 0x0d, 0x0a, + 0x07, 0x04, 0x01, 0x01, 0x02, 0x06, 0x0b, 0x0d, 0x08, 0x03, 0x02, 0x02, + 0xfe, 0xfe, 0xfc, 0xfd, 0xff, 0xf9, 0xf5, 0xf8, 0x01, 0x07, 0xfe, 0xf5, + 0xf2, 0xf2, 0xf0, 0xf5, 0x00, 0xff, 0x03, 0x04, 0x01, 0x02, 0x01, 0xff, + 0xfb, 0xfe, 0x00, 0x05, 0x06, 0x0a, 0x15, 0x15, 0x17, 0x1e, 0x18, 0x11, + 0x0f, 0x0d, 0x05, 0x01, 0x02, 0x07, 0x0b, 0x08, 0x01, 0xfc, 0x00, 0x02, + 0x01, 0x00, 0x02, 0x05, 0x04, 0x03, 0xff, 0xfb, 0xfa, 0xfd, 0xfb, 0xf9, + 0xf9, 0xf9, 0xf7, 0xff, 0x03, 0x0a, 0x08, 0x02, 0x00, 0xfc, 0xf9, 0xfc, + 0x01, 0x02, 0x09, 0x06, 0x01, 0x02, 0x0f, 0x14, 0x16, 0x0b, 0x08, 0x0b, + 0x0d, 0x06, 0x00, 0xfb, 0x03, 0x0b, 0x0b, 0x04, 0x03, 0x03, 0x07, 0x04, + 0x02, 0x01, 0x02, 0x00, 0x03, 0x06, 0x04, 0xff, 0xfc, 0xfd, 0xff, 0x00, + 0xfb, 0xfb, 0x02, 0xfc, 0xf5, 0xfa, 0x03, 0x04, 0x04, 0xff, 0xff, 0x03, + 0x03, 0x03, 0x09, 0x04, 0xff, 0x01, 0x14, 0x13, 0x0a, 0x08, 0x0f, 0x0e, + 0x0a, 0x08, 0x04, 0x00, 0x05, 0x08, 0x07, 0x08, 0x09, 0x05, 0x07, 0x02, + 0x02, 0x04, 0x02, 0x06, 0x06, 0x07, 0x04, 0xfe, 0xfa, 0xf7, 0xf4, 0xf3, + 0xf0, 0xf5, 0xfd, 0xfa, 0xf5, 0xf5, 0xfb, 0xfd, 0xfe, 0xfa, 0xfc, 0x02, + 0xfe, 0xfe, 0x02, 0x01, 0x06, 0x14, 0x19, 0x0e, 0x08, 0x08, 0x0f, 0x16, + 0x0f, 0x07, 0x05, 0x0a, 0x0f, 0x11, 0x10, 0x0d, 0x0c, 0x10, 0x14, 0x0c, + 0x00, 0xfd, 0x03, 0x0a, 0x02, 0xfe, 0x00, 0xfc, 0xfd, 0x01, 0x00, 0x00, + 0x06, 0x0a, 0x05, 0x01, 0xfd, 0xfd, 0xf8, 0xf3, 0xf1, 0xf4, 0xfa, 0xf8, + 0xf4, 0xf4, 0xf9, 0xfa, 0x05, 0x10, 0x0e, 0x06, 0x02, 0x01, 0x00, 0xff, + 0xff, 0xfa, 0xfc, 0xfd, 0xfe, 0xfb, 0x00, 0x05, 0x08, 0x06, 0x09, 0x04, + 0x03, 0x08, 0x07, 0x0b, 0x0d, 0x09, 0x04, 0xfe, 0xfe, 0x00, 0x02, 0x0a, + 0x14, 0x10, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x04, 0x07, 0x0d, 0x0b, 0x08, + 0x05, 0x05, 0x05, 0x08, 0x08, 0x12, 0x0e, 0x09, 0x08, 0x08, 0x09, 0x04, + 0xfd, 0x00, 0x04, 0x01, 0x00, 0xfd, 0xf6, 0xf8, 0x00, 0x05, 0x03, 0xfc, + 0xf7, 0xf9, 0xf7, 0xf7, 0x01, 0xfb, 0xf1, 0xf2, 0xfb, 0xfb, 0xfc, 0x03, + 0x00, 0xfb, 0xfa, 0xf7, 0xf9, 0xfb, 0xfa, 0xfe, 0x08, 0x07, 0x02, 0xfc, + 0xfb, 0x07, 0x0f, 0x12, 0x1b, 0x20, 0x19, 0x17, 0x15, 0x12, 0x0f, 0x07, + 0x03, 0x00, 0x00, 0x04, 0x07, 0x06, 0x06, 0x05, 0x05, 0x08, 0x09, 0x06, + 0x01, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xf7, 0xf6, 0xf3, 0xf8, 0xff, 0x00, + 0x03, 0x0c, 0x08, 0x08, 0x0e, 0x0a, 0x06, 0x06, 0x05, 0x02, 0xff, 0x00, + 0x07, 0x06, 0x03, 0x07, 0x14, 0x13, 0x09, 0x03, 0x02, 0x02, 0x05, 0x07, + 0x02, 0xfe, 0x01, 0x05, 0x02, 0xfb, 0xf9, 0xf7, 0xf4, 0xf5, 0xfb, 0xfa, + 0xf8, 0xfa, 0x01, 0x04, 0xfc, 0xf9, 0xf8, 0xfb, 0x00, 0x04, 0x07, 0x03, + 0x01, 0xff, 0x02, 0x00, 0xff, 0xfe, 0x04, 0x03, 0x00, 0x02, 0x13, 0x1a, + 0x16, 0x0f, 0x09, 0x0a, 0x13, 0x11, 0x0d, 0x0c, 0x0d, 0x09, 0x0c, 0x0f, + 0x0e, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x09, 0x06, 0x06, 0x09, 0x08, 0x05, + 0x04, 0x00, 0x00, 0xfc, 0xf8, 0xf7, 0xf7, 0xf7, 0xfa, 0xfe, 0x02, 0xfd, + 0xf8, 0xf8, 0xf7, 0xf6, 0xfa, 0xfd, 0xfc, 0xf2, 0xf2, 0xfb, 0xfd, 0xfe, + 0xfb, 0xfb, 0x02, 0x07, 0x08, 0x04, 0x12, 0x1e, 0x14, 0x11, 0x0b, 0x05, + 0x05, 0x05, 0x02, 0x01, 0x04, 0x07, 0x05, 0x07, 0x09, 0x0a, 0x09, 0x02, + 0xff, 0xfe, 0x03, 0x01, 0x01, 0x01, 0x04, 0x08, 0x07, 0x0b, 0x0a, 0x07, + 0x02, 0xfd, 0xf9, 0xfb, 0xff, 0x04, 0x03, 0x05, 0x08, 0x00, 0xfd, 0xfd, + 0xfe, 0x00, 0x01, 0x09, 0x07, 0x05, 0x06, 0x02, 0x01, 0xfe, 0xfb, 0xfa, + 0xfc, 0xfc, 0x06, 0x12, 0x10, 0x0d, 0x06, 0x02, 0x03, 0x04, 0x01, 0xf9, + 0xf9, 0x04, 0x0a, 0x09, 0x0b, 0x0b, 0x0b, 0x05, 0x00, 0x03, 0x07, 0x08, + 0x08, 0x04, 0x01, 0x05, 0x07, 0x03, 0x08, 0x05, 0x00, 0xfd, 0xfa, 0xf8, + 0xf9, 0xfd, 0x07, 0x0e, 0x04, 0x02, 0x00, 0xff, 0x01, 0x01, 0xff, 0xfe, + 0xfc, 0xf8, 0xfa, 0xff, 0xff, 0xfe, 0xfc, 0xfd, 0xfd, 0x00, 0x04, 0x07, + 0x0a, 0x09, 0x08, 0x02, 0x02, 0x05, 0x00, 0xfd, 0xfe, 0x04, 0x07, 0x0c, + 0x0a, 0x07, 0x05, 0x02, 0x02, 0x0a, 0x09, 0x05, 0x05, 0x03, 0x03, 0x04, + 0x08, 0x0f, 0x1c, 0x1b, 0x12, 0x11, 0x0d, 0x06, 0x09, 0x0b, 0x08, 0x01, + 0xfc, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0x03, 0xff, 0xf8, 0xf7, 0xf8, + 0xf9, 0xf5, 0xf2, 0xf2, 0xfb, 0xfd, 0x00, 0x00, 0x06, 0x07, 0x08, 0x04, + 0x02, 0x04, 0x05, 0x08, 0x0d, 0x02, 0x01, 0x07, 0x08, 0x05, 0x01, 0xff, + 0xff, 0x06, 0x10, 0x0a, 0x0a, 0x07, 0x08, 0x07, 0x07, 0x07, 0x04, 0x00, + 0xfd, 0xfd, 0xfc, 0xf7, 0xf8, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf9, 0xfc, + 0x00, 0x02, 0x00, 0x04, 0x06, 0x03, 0x01, 0x04, 0x08, 0x02, 0xff, 0x04, + 0x09, 0x0f, 0x12, 0x15, 0x14, 0x15, 0x12, 0x10, 0x0e, 0x0a, 0x08, 0x05, + 0x00, 0x0b, 0x11, 0x17, 0x18, 0x15, 0x0d, 0x06, 0x05, 0x03, 0xfe, 0xfc, + 0xfb, 0xff, 0xfd, 0xfd, 0xfa, 0xfc, 0xfc, 0xf7, 0xf4, 0xf7, 0xfa, 0xf8, + 0xf3, 0xf6, 0xf9, 0xfa, 0xfb, 0xf7, 0xf1, 0xf2, 0xfc, 0xf9, 0xf8, 0xfb, + 0xfd, 0xfe, 0x02, 0x00, 0xfb, 0xfc, 0xfc, 0xfd, 0xfb, 0x00, 0x05, 0x09, + 0x11, 0x25, 0x1f, 0x18, 0x16, 0x13, 0x0e, 0x0b, 0x07, 0x08, 0x06, 0x0c, + 0x10, 0x0a, 0x03, 0x02, 0x04, 0x06, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, + 0x05, 0x0c, 0x0e, 0x0b, 0x04, 0xfe, 0xfe, 0x02, 0x05, 0x06, 0x08, 0x02, + 0x05, 0x0c, 0x09, 0x03, 0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfa, 0xf5, 0xf7, + 0x01, 0xff, 0xfe, 0xfe, 0xfd, 0x00, 0xff, 0xff, 0xfc, 0x03, 0x02, 0xfc, + 0xfa, 0xf8, 0xf8, 0xf9, 0xf7, 0xf6, 0xfa, 0xff, 0x01, 0x03, 0x04, 0x03, + 0x0c, 0x11, 0x0c, 0x08, 0x02, 0x01, 0x02, 0x0a, 0x11, 0x0e, 0x0c, 0x0c, + 0x12, 0x10, 0x0c, 0x09, 0x07, 0x09, 0x05, 0x02, 0xff, 0x00, 0x04, 0x0a, + 0x0b, 0x05, 0x02, 0x02, 0x01, 0x00, 0xff, 0xfd, 0x01, 0x02, 0x00, 0x02, + 0x00, 0x05, 0x05, 0x01, 0xfd, 0x04, 0x0a, 0x04, 0x02, 0x05, 0x01, 0x02, + 0x08, 0x05, 0x00, 0x00, 0x03, 0x04, 0x08, 0x0e, 0x0f, 0x08, 0x02, 0x01, + 0x01, 0xfe, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xfb, 0xfb, 0x01, 0x09, 0x0f, + 0x0b, 0x07, 0x04, 0x03, 0x00, 0x02, 0x03, 0x01, 0x00, 0xf9, 0xf5, 0xf6, + 0xf8, 0xf9, 0xfa, 0xfa, 0xfb, 0xff, 0xff, 0xff, 0x00, 0x04, 0x02, 0x0b, + 0x09, 0x08, 0x0d, 0x07, 0x03, 0x02, 0x09, 0x0a, 0x08, 0x08, 0x0f, 0x14, + 0x12, 0x0a, 0x08, 0x0c, 0x0b, 0x05, 0x04, 0x04, 0x01, 0x02, 0x12, 0x14, + 0x0c, 0x07, 0x06, 0x06, 0x09, 0x0b, 0x05, 0x00, 0xff, 0xfe, 0xf9, 0xf5, + 0xf5, 0xf4, 0xf7, 0xf6, 0xf5, 0xf6, 0xf7, 0xf7, 0xfd, 0xfe, 0x03, 0xff, + 0xfd, 0xfb, 0xf6, 0xf7, 0x02, 0x0b, 0x07, 0x02, 0x01, 0x0a, 0x12, 0x12, + 0x09, 0x04, 0x0a, 0x0c, 0x07, 0x06, 0x09, 0x06, 0x08, 0x0f, 0x15, 0x11, + 0x0a, 0x08, 0x07, 0x03, 0x00, 0x01, 0x00, 0x03, 0x06, 0x03, 0x01, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xf8, 0xf8, 0xfa, 0xfb, 0x00, 0x03, 0xfe, + 0xfa, 0xf4, 0xf6, 0xff, 0xfe, 0xfb, 0xf8, 0xfa, 0x02, 0x08, 0x08, 0x05, + 0x02, 0x0b, 0x0b, 0x03, 0x04, 0x06, 0x0c, 0x12, 0x12, 0x1a, 0x18, 0x16, + 0x0d, 0x0c, 0x0e, 0x0b, 0x0c, 0x0b, 0x0f, 0x0f, 0x0b, 0x06, 0x03, 0xfc, + 0xf7, 0xfa, 0xfb, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0x01, 0x07, 0x06, 0x02, + 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf7, 0xf8, 0x04, 0x09, 0x05, 0x00, 0xfb, + 0xfa, 0xfb, 0xfc, 0xfc, 0xf8, 0xf8, 0xfa, 0xff, 0x08, 0x0a, 0x0d, 0x09, + 0x04, 0x03, 0x0a, 0x10, 0x08, 0x02, 0xff, 0x02, 0x01, 0x00, 0xfa, 0xf7, + 0xf9, 0xff, 0x00, 0xff, 0x01, 0x00, 0x06, 0x06, 0x0f, 0x12, 0x11, 0x0f, + 0x10, 0x10, 0x09, 0x07, 0x07, 0x07, 0x0c, 0x16, 0x14, 0x0c, 0x09, 0x0a, + 0x09, 0x07, 0x09, 0x07, 0x02, 0x00, 0x00, 0x0b, 0x0a, 0x06, 0x02, 0xf9, + 0xf2, 0xf6, 0xf3, 0xf2, 0xf6, 0xfb, 0x01, 0x00, 0xff, 0xfd, 0xf8, 0xfe, + 0xfa, 0xf7, 0xf6, 0xf8, 0xfa, 0xfc, 0xfb, 0x04, 0x06, 0x08, 0x09, 0x09, + 0x05, 0x04, 0x03, 0xfe, 0xfb, 0xfd, 0x08, 0x0e, 0x09, 0x09, 0x04, 0x03, + 0x06, 0x06, 0x04, 0x04, 0x08, 0x08, 0x0d, 0x12, 0x0d, 0x0a, 0x04, 0xff, + 0x00, 0x00, 0xfe, 0xfd, 0xfe, 0xfd, 0x00, 0xfe, 0xfd, 0xfc, 0xfc, 0xfe, + 0xff, 0x03, 0x0a, 0x08, 0x07, 0x04, 0x08, 0x17, 0x12, 0x0b, 0x0d, 0x0b, + 0x0a, 0x04, 0xff, 0xfe, 0xff, 0x0e, 0x19, 0x14, 0x0f, 0x09, 0x09, 0x03, + 0xff, 0xff, 0xfc, 0xf8, 0xf9, 0x01, 0x07, 0x03, 0x01, 0xff, 0xfc, 0xfb, + 0xff, 0x02, 0xff, 0xfb, 0xf4, 0xf0, 0xf3, 0xf8, 0xf8, 0xf3, 0xef, 0xef, + 0xef, 0xf3, 0xf6, 0xf6, 0xf5, 0xf6, 0x03, 0x09, 0x0b, 0x0c, 0x0d, 0x0d, + 0x0c, 0x08, 0x07, 0x0b, 0x0d, 0x13, 0x14, 0x11, 0x12, 0x11, 0x0d, 0x0c, + 0x0d, 0x0f, 0x14, 0x0d, 0x0b, 0x12, 0x14, 0x10, 0x0e, 0x0c, 0x09, 0x05, + 0x04, 0x02, 0x03, 0x06, 0x04, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0xfe, 0xff, + 0xfc, 0xf4, 0xf1, 0xf3, 0xf3, 0xf9, 0x02, 0x01, 0xff, 0x02, 0x03, 0xfc, + 0xf2, 0xee, 0xec, 0xec, 0xf2, 0x01, 0x02, 0x03, 0x05, 0x04, 0x02, 0x08, + 0x05, 0x02, 0x03, 0x03, 0x0f, 0x12, 0x0f, 0x10, 0x0e, 0x0b, 0x0a, 0x06, + 0x04, 0x03, 0x05, 0x04, 0x03, 0x03, 0x06, 0x06, 0x05, 0x03, 0x01, 0x05, + 0x02, 0x00, 0x03, 0x02, 0x00, 0x0b, 0x11, 0x11, 0x05, 0x00, 0xfb, 0xf8, + 0xf6, 0xf6, 0xf7, 0xfb, 0x07, 0x0e, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0xff, 0x0b, 0x15, 0x0d, 0x08, 0x10, 0x0f, 0x08, 0x07, 0x08, + 0x07, 0x07, 0xfe, 0xfb, 0xfc, 0xfd, 0x02, 0x04, 0xfe, 0xfb, 0xfc, 0xfe, + 0xfb, 0xff, 0xfe, 0xfc, 0x02, 0x0c, 0x0d, 0x09, 0x05, 0x02, 0xfe, 0xfc, + 0xfb, 0xfc, 0xfe, 0x05, 0x0e, 0x0a, 0x06, 0x08, 0x09, 0x06, 0x03, 0x02, + 0x04, 0x04, 0x0a, 0x0b, 0x04, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfb, 0xfe, + 0x03, 0x06, 0x04, 0x0c, 0x0e, 0x07, 0x04, 0x00, 0xfe, 0xfc, 0xf8, 0xf9, + 0xfc, 0xfd, 0xfd, 0x00, 0x0a, 0x0d, 0x06, 0x06, 0x09, 0x0b, 0x0d, 0x0a, + 0x03, 0x02, 0x02, 0x09, 0x10, 0x0b, 0x04, 0x06, 0x06, 0x04, 0x05, 0x0c, + 0x0b, 0x0e, 0x0f, 0x09, 0x05, 0x03, 0x02, 0x04, 0x06, 0x02, 0xff, 0xfa, + 0xf6, 0xf5, 0xf2, 0xf2, 0xf5, 0xf8, 0xfb, 0xfd, 0xfb, 0xfb, 0x00, 0x0b, + 0x08, 0x02, 0xfe, 0x02, 0x0f, 0x0e, 0x06, 0x02, 0x02, 0x03, 0x02, 0xfe, + 0x03, 0x01, 0x02, 0x08, 0x0f, 0x0d, 0x0c, 0x0c, 0x09, 0x04, 0x01, 0x04, + 0x0c, 0x0c, 0x06, 0x02, 0x04, 0x05, 0x02, 0x01, 0x01, 0xff, 0xfd, 0xf8, + 0xf7, 0xf7, 0xf4, 0xf4, 0xf8, 0xfa, 0xf9, 0xf7, 0xf7, 0xfb, 0xff, 0xf8, + 0xf8, 0xfd, 0x01, 0x13, 0x16, 0x0e, 0x0e, 0x19, 0x15, 0x0f, 0x0c, 0x0c, + 0x0e, 0x0d, 0x0b, 0x0a, 0x12, 0x16, 0x10, 0x0b, 0x0e, 0x0e, 0x0b, 0x0e, + 0x0e, 0x09, 0x06, 0x09, 0x09, 0x05, 0xff, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, + 0xf7, 0xf7, 0xf6, 0xf7, 0xf9, 0xf6, 0xf7, 0xf5, 0xf4, 0xf3, 0xf2, 0xf2, + 0xf1, 0xf3, 0xfe, 0x05, 0x02, 0xff, 0xfa, 0xf7, 0xfc, 0x00, 0xfe, 0x00, + 0x00, 0xfd, 0xfc, 0x13, 0x1d, 0x15, 0x0e, 0x0b, 0x0f, 0x0c, 0x0e, 0x11, + 0x0d, 0x11, 0x0f, 0x0b, 0x0a, 0x0f, 0x0a, 0x08, 0x08, 0x05, 0x06, 0x07, + 0x07, 0x06, 0x04, 0x08, 0x0a, 0x07, 0x04, 0x09, 0x06, 0xff, 0xfe, 0xff, + 0xff, 0x03, 0x0f, 0x0e, 0x04, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xf6, + 0xf4, 0xf3, 0xf3, 0xfe, 0x02, 0xfe, 0xfc, 0xfc, 0xf9, 0x00, 0x04, 0x08, + 0x08, 0x08, 0x07, 0x0a, 0x04, 0x01, 0x01, 0x00, 0xff, 0xfe, 0xfc, 0xf9, + 0xf7, 0xfc, 0x00, 0xfd, 0xfb, 0xfe, 0x06, 0x09, 0x04, 0x02, 0x01, 0x02, + 0x05, 0x09, 0x12, 0x11, 0x0d, 0x0a, 0x08, 0x07, 0x04, 0xfd, 0xfb, 0x01, + 0xff, 0xff, 0x07, 0x12, 0x11, 0x0b, 0x07, 0x08, 0x0f, 0x11, 0x08, 0x02, + 0x00, 0x04, 0x06, 0x05, 0x04, 0x04, 0x04, 0x0a, 0x06, 0x08, 0x09, 0x08, + 0x08, 0x06, 0x04, 0xfe, 0xfb, 0xff, 0xf7, 0xf3, 0xf2, 0xf3, 0xfa, 0xfa, + 0xfc, 0x02, 0x08, 0x03, 0x07, 0x07, 0x04, 0x04, 0x00, 0xf8, 0xf9, 0xfa, + 0xf7, 0xf7, 0xf9, 0x02, 0x04, 0x04, 0x0a, 0x0f, 0x0e, 0x08, 0x09, 0x07, + 0x06, 0x08, 0x05, 0x01, 0x02, 0x01, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0x01, + 0x05, 0x02, 0x05, 0x0f, 0x0d, 0x09, 0x0c, 0x0e, 0x05, 0xfe, 0xfa, 0xff, + 0x03, 0x0c, 0x0d, 0x03, 0x02, 0x03, 0x04, 0x09, 0x08, 0x08, 0x05, 0x02, + 0x00, 0x03, 0x09, 0x0e, 0x0d, 0x07, 0x0a, 0x10, 0x09, 0x05, 0x03, 0x01, + 0x02, 0x00, 0x02, 0x03, 0x01, 0xff, 0xfe, 0xfb, 0xfa, 0xfa, 0xf8, 0xf1, + 0xf0, 0xf2, 0xf6, 0xf5, 0xf8, 0xfd, 0xfc, 0xf9, 0xf9, 0xf7, 0x00, 0x0a, + 0x05, 0x0c, 0x0f, 0x11, 0x13, 0x0c, 0x03, 0x01, 0x02, 0x01, 0x05, 0x05, + 0x02, 0x03, 0x08, 0x11, 0x19, 0x19, 0x18, 0x15, 0x0e, 0x0a, 0x0b, 0x0c, + 0x0b, 0x0b, 0x07, 0x04, 0x03, 0x04, 0x04, 0xfe, 0xf7, 0xf3, 0xf6, 0xf7, + 0xf9, 0x00, 0xfb, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf1, 0xf3, 0xf7, 0xfb, + 0xfc, 0x04, 0x03, 0x03, 0x04, 0x00, 0x02, 0x0d, 0x09, 0x09, 0x0a, 0x04, + 0x04, 0x0c, 0x0e, 0x13, 0x1b, 0x1d, 0x17, 0x0e, 0x03, 0x02, 0x06, 0x02, + 0x06, 0x0c, 0x07, 0x05, 0x05, 0x05, 0x05, 0x04, 0x01, 0x02, 0x06, 0x09, + 0x04, 0xfb, 0xfb, 0xfd, 0xfa, 0xf6, 0xf6, 0xf7, 0xfa, 0xff, 0x02, 0x00, + 0x06, 0x0b, 0x07, 0x05, 0x04, 0xfe, 0xfd, 0xfc, 0xfa, 0xfa, 0xfa, 0xf6, + 0xf9, 0xfd, 0x02, 0x12, 0x1a, 0x19, 0x11, 0x08, 0x01, 0x03, 0x06, 0x01, + 0x01, 0x01, 0xff, 0xfa, 0xfc, 0xfc, 0xfe, 0xfe, 0xfd, 0x04, 0x0c, 0x05, + 0x03, 0x05, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x04, 0x06, 0x07, 0x07, + 0x0d, 0x0e, 0x09, 0x06, 0x05, 0x0a, 0x08, 0x07, 0x08, 0x02, 0xfb, 0xfa, + 0xfb, 0xfa, 0x03, 0x10, 0x0f, 0x0c, 0x08, 0x05, 0x03, 0x03, 0x05, 0x0b, + 0x0b, 0x0c, 0x06, 0x00, 0xff, 0x00, 0xfd, 0x00, 0xfe, 0xfd, 0xf9, 0xf6, + 0xf4, 0xf6, 0xf7, 0xf6, 0xf7, 0xfa, 0xfe, 0x00, 0xfd, 0xfe, 0x01, 0x04, + 0x0d, 0x0a, 0x04, 0x03, 0x05, 0x06, 0x01, 0xfe, 0xff, 0xfb, 0xfb, 0xff, + 0x01, 0x07, 0x15, 0x18, 0x13, 0x0e, 0x0a, 0x07, 0x07, 0x06, 0x08, 0x05, + 0x04, 0x06, 0x05, 0x04, 0x03, 0x02, 0x07, 0x14, 0x16, 0x11, 0x0e, 0x0a, + 0x02, 0x02, 0x00, 0x00, 0x06, 0x02, 0xfe, 0xfc, 0xff, 0x06, 0xfe, 0xfa, + 0x03, 0x00, 0xfc, 0x06, 0x07, 0x02, 0x00, 0xff, 0xfc, 0xf9, 0xf6, 0xf5, + 0xfa, 0x09, 0x09, 0x05, 0x01, 0x00, 0xff, 0xf8, 0xf7, 0xfd, 0xff, 0xfe, + 0x01, 0xff, 0xfd, 0xfd, 0xff, 0x05, 0x08, 0x05, 0x01, 0x00, 0x02, 0x04, + 0x01, 0x02, 0x03, 0x0d, 0x0f, 0x09, 0x05, 0x05, 0x06, 0x0a, 0x07, 0x07, + 0x0e, 0x0a, 0x05, 0x02, 0x02, 0x02, 0x07, 0x02, 0x00, 0xff, 0xff, 0x04, + 0x11, 0x14, 0x17, 0x1a, 0x12, 0x0c, 0x07, 0x05, 0x06, 0x0a, 0x09, 0x06, + 0x04, 0x01, 0x00, 0x00, 0x02, 0x05, 0x00, 0xfe, 0xff, 0xfc, 0xf8, 0xee, + 0xeb, 0xf0, 0xf2, 0xf5, 0xf7, 0xf2, 0xef, 0xf5, 0xfb, 0xfc, 0xff, 0x09, + 0x0f, 0x0a, 0x04, 0x02, 0xff, 0x00, 0x01, 0xfd, 0xfb, 0xfe, 0x00, 0x05, + 0x0c, 0x0b, 0x10, 0x10, 0x0e, 0x0a, 0x08, 0x07, 0x08, 0x0f, 0x10, 0x0f, + 0x0b, 0x09, 0x08, 0x0b, 0x11, 0x0b, 0x06, 0x03, 0x02, 0x01, 0xff, 0xfe, + 0xff, 0x00, 0xff, 0x00, 0x01, 0xfb, 0xfb, 0xfe, 0x03, 0x03, 0xfe, 0x03, + 0x10, 0x06, 0x04, 0x06, 0xff, 0xf9, 0xfa, 0x04, 0x06, 0x02, 0x04, 0x09, + 0x09, 0x0e, 0x0d, 0x08, 0x04, 0xff, 0xfd, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, + 0xf7, 0xf3, 0xf6, 0xff, 0xff, 0x00, 0x05, 0x07, 0x08, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x03, 0x00, 0xfe, 0xf8, 0xf5, 0xfb, 0x01, 0x00, 0x00, 0x09, + 0x10, 0x0b, 0x0b, 0x0c, 0x09, 0x03, 0x02, 0x05, 0x06, 0x0a, 0x13, 0x0d, + 0x0a, 0x11, 0x14, 0x1e, 0x15, 0x0a, 0x08, 0x09, 0x0b, 0x0a, 0x07, 0x03, + 0x01, 0x00, 0x05, 0x05, 0xfe, 0xf5, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf6, + 0xf8, 0xf8, 0xfb, 0xff, 0xf9, 0xf8, 0xfa, 0xfa, 0xfd, 0x03, 0x02, 0x06, + 0x09, 0x02, 0x01, 0x01, 0x02, 0x03, 0x05, 0x07, 0x0a, 0x10, 0x10, 0x0c, + 0x0b, 0x0e, 0x08, 0x02, 0x03, 0x04, 0x07, 0x07, 0x06, 0x04, 0x04, 0x0e, + 0x14, 0x16, 0x10, 0x08, 0x05, 0x04, 0xff, 0xfb, 0xfc, 0xf9, 0xfc, 0x01, + 0x03, 0xff, 0xfc, 0xf8, 0xf5, 0xfb, 0x00, 0x01, 0x05, 0x02, 0x03, 0x08, + 0x10, 0x0e, 0x0b, 0x04, 0xfd, 0xfb, 0xfc, 0xfd, 0x04, 0x04, 0x00, 0x00, + 0x07, 0x07, 0x04, 0x00, 0x00, 0xff, 0xfa, 0xfe, 0xfd, 0xfb, 0xfb, 0xfe, + 0x08, 0x0b, 0x0b, 0x01, 0x01, 0x03, 0x05, 0x0a, 0x0c, 0x0b, 0x0b, 0x08, + 0x06, 0x06, 0x02, 0xff, 0xff, 0xfd, 0x00, 0x04, 0x0b, 0x06, 0x05, 0x0a, + 0x06, 0x02, 0x06, 0x01, 0xf8, 0xf8, 0xfb, 0x00, 0x05, 0x0a, 0x0c, 0x0e, + 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x01, 0xfe, 0xfc, 0xfd, 0xff, 0xff, 0x03, + 0x07, 0x02, 0x01, 0xff, 0xfe, 0xfb, 0xfa, 0xfb, 0x00, 0x05, 0x07, 0x01, + 0xfd, 0xfa, 0xf8, 0xfd, 0x01, 0x02, 0xfd, 0xfd, 0x02, 0x00, 0x00, 0x09, + 0x09, 0x01, 0xfe, 0xfd, 0x05, 0x09, 0x05, 0x05, 0x02, 0xfd, 0x01, 0x0e, + 0x10, 0x0a, 0x08, 0x03, 0x02, 0x06, 0x0c, 0x0e, 0x0e, 0x0b, 0x0e, 0x14, + 0x0e, 0x04, 0x02, 0x02, 0x00, 0xff, 0x00, 0x01, 0x04, 0x07, 0x08, 0x07, + 0x02, 0xfc, 0xfb, 0xfc, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xff, 0xfc, 0x08, + 0x0b, 0x0b, 0x07, 0x04, 0xff, 0xfd, 0x00, 0x02, 0xfd, 0xfa, 0xfb, 0xfd, + 0xff, 0x03, 0x02, 0xfe, 0xf9, 0xf8, 0xf7, 0xf8, 0xfb, 0x02, 0x07, 0x06, + 0x03, 0x01, 0x01, 0x07, 0x0e, 0x09, 0x08, 0x09, 0x04, 0x02, 0x02, 0xff, + 0x00, 0x00, 0xff, 0x02, 0x02, 0x03, 0x06, 0x06, 0x03, 0x00, 0x01, 0x0e, + 0x0e, 0x10, 0x0e, 0x05, 0x02, 0x04, 0x09, 0x0e, 0x0c, 0x10, 0x15, 0x10, + 0x0e, 0x0f, 0x0e, 0x0c, 0x08, 0x04, 0x01, 0xff, 0x02, 0x0a, 0x09, 0x04, + 0xfe, 0xf9, 0xf5, 0xf3, 0xf2, 0xf8, 0xf8, 0xf4, 0xf5, 0xf7, 0xf3, 0xf1, + 0xfc, 0xfd, 0xfe, 0xff, 0xf9, 0xf6, 0xf6, 0xf6, 0xf0, 0xf1, 0xfb, 0x07, + 0x05, 0x03, 0x05, 0x0b, 0x0b, 0x0c, 0x10, 0x0b, 0x0d, 0x11, 0x12, 0x10, + 0x11, 0x10, 0x0d, 0x12, 0x15, 0x11, 0x0f, 0x0c, 0x10, 0x0f, 0x0c, 0x0d, + 0x0b, 0x05, 0xfe, 0xfa, 0xfa, 0x00, 0x01, 0xfe, 0xfb, 0xfa, 0xf8, 0xf5, + 0xf6, 0xfe, 0x00, 0xf9, 0xf9, 0xfb, 0x00, 0xfe, 0xfe, 0x06, 0x0c, 0x0f, + 0x07, 0x03, 0x01, 0xfc, 0xfc, 0x05, 0x09, 0x04, 0x05, 0x03, 0x04, 0x05, + 0x05, 0x03, 0xff, 0x02, 0x04, 0x01, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x09, 0x0c, 0x07, 0x02, 0x05, 0x05, 0x00, 0xfe, 0xfb, 0xf6, + 0xf6, 0xfd, 0x01, 0x03, 0x03, 0x01, 0x02, 0xfb, 0xf9, 0xfe, 0x0a, 0x10, + 0x0d, 0x0b, 0x08, 0x04, 0x08, 0x10, 0x0f, 0x0f, 0x0e, 0x0a, 0x07, 0x0a, + 0x0a, 0x06, 0x05, 0x07, 0x06, 0x04, 0x04, 0x09, 0x05, 0xff, 0xff, 0x00, + 0x03, 0x02, 0x00, 0xfa, 0xfa, 0xfe, 0xfe, 0xfc, 0x00, 0xfd, 0xfe, 0x01, + 0xfe, 0xf9, 0xf9, 0xfd, 0x00, 0xfe, 0xfa, 0xf5, 0xf7, 0xfe, 0x09, 0x08, + 0x03, 0x04, 0x03, 0x00, 0x05, 0x05, 0x05, 0x0d, 0x0a, 0x06, 0x03, 0x06, + 0x05, 0x09, 0x13, 0x17, 0x0f, 0x07, 0x0a, 0x07, 0x03, 0x00, 0xff, 0x04, + 0x00, 0x02, 0x04, 0x00, 0x00, 0x01, 0x01, 0x04, 0x07, 0x06, 0x03, 0x05, + 0x04, 0x04, 0x00, 0xfd, 0x07, 0x08, 0x00, 0x04, 0x05, 0x00, 0x06, 0x07, + 0x04, 0x01, 0xff, 0x01, 0x05, 0x00, 0x05, 0xff, 0xf9, 0xfb, 0xfc, 0xfb, + 0xfa, 0xf8, 0xf8, 0xf9, 0xfc, 0x00, 0x02, 0x03, 0x02, 0x01, 0x02, 0x07, + 0x09, 0x05, 0x05, 0x03, 0x04, 0x06, 0x02, 0x02, 0x01, 0x02, 0x08, 0x08, + 0x04, 0x05, 0x08, 0x07, 0x0a, 0x08, 0x06, 0x04, 0x04, 0x08, 0x09, 0x01, + 0x02, 0x08, 0x07, 0x0f, 0x14, 0x14, 0x0d, 0x06, 0x05, 0x05, 0x04, 0x07, + 0x04, 0x02, 0x03, 0xff, 0xff, 0x03, 0x03, 0x00, 0xfe, 0xf8, 0xf7, 0xfd, + 0x02, 0x03, 0x00, 0xfd, 0xfc, 0xfb, 0xf9, 0xf5, 0xfb, 0xff, 0xff, 0xfb, + 0xf5, 0xf5, 0xf7, 0xf9, 0xf9, 0xf8, 0xfa, 0xfe, 0xfb, 0x00, 0x03, 0xff, + 0x05, 0x0c, 0x0f, 0x11, 0x12, 0x0e, 0x08, 0x09, 0x0a, 0x0e, 0x12, 0x14, + 0x19, 0x18, 0x12, 0x0d, 0x0c, 0x0c, 0x0b, 0x09, 0x03, 0x05, 0x08, 0x07, + 0x04, 0x00, 0x00, 0x01, 0xfd, 0xf8, 0xf7, 0xf9, 0x02, 0x05, 0x00, 0xf9, + 0xf5, 0xf6, 0xfc, 0xfd, 0xfe, 0x03, 0x01, 0xfa, 0xf9, 0x01, 0x00, 0xfc, + 0xfe, 0x00, 0x04, 0x09, 0x07, 0x01, 0x00, 0x02, 0x03, 0x09, 0x09, 0x06, + 0x02, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x0b, 0x05, 0x08, 0x09, 0x07, + 0x04, 0x05, 0x05, 0xff, 0xff, 0x03, 0x01, 0xfe, 0xff, 0xfc, 0xfb, 0xfb, + 0xfe, 0x00, 0xff, 0xfd, 0xfe, 0xfe, 0xfc, 0xfc, 0x01, 0x09, 0x08, 0x04, + 0x01, 0x0b, 0x1b, 0x17, 0x12, 0x0d, 0x0e, 0x0d, 0x0c, 0x0d, 0x09, 0x07, + 0x06, 0x05, 0x05, 0x05, 0x0c, 0x0d, 0x0b, 0x06, 0x05, 0x05, 0x05, 0x05, + 0xfb, 0xf5, 0xf5, 0xfb, 0xfd, 0xfe, 0xfe, 0xfd, 0xfd, 0xf6, 0xf2, 0xee, + 0xf1, 0xfc, 0xfe, 0xf9, 0xf4, 0xf2, 0xf3, 0xf5, 0x01, 0x02, 0xf9, 0xfb, + 0x07, 0x13, 0x16, 0x13, 0x12, 0x0e, 0x0d, 0x09, 0x09, 0x07, 0x0f, 0x12, + 0x0f, 0x0b, 0x09, 0x07, 0x0c, 0x09, 0x04, 0x02, 0x02, 0x03, 0x01, 0x00, + 0x00, 0x01, 0x04, 0x03, 0x04, 0x00, 0xff, 0x02, 0x00, 0xfe, 0xfd, 0x01, + 0x08, 0x0c, 0x0d, 0x0a, 0x02, 0xff, 0xfd, 0xfd, 0x09, 0x0a, 0x07, 0x06, + 0x06, 0x08, 0x08, 0x04, 0x04, 0x06, 0xfd, 0xfa, 0xfc, 0xfb, 0xfe, 0xff, + 0xfa, 0xf3, 0xf5, 0xf8, 0xfa, 0xf9, 0xfe, 0x09, 0x07, 0x01, 0xff, 0xff, + 0x02, 0x04, 0x04, 0xff, 0xfe, 0xfe, 0xfe, 0x04, 0x06, 0x06, 0x08, 0x0e, + 0x0e, 0x0e, 0x09, 0x02, 0xfe, 0xfd, 0xff, 0x09, 0x0f, 0x10, 0x10, 0x0d, + 0x11, 0x14, 0x14, 0x0f, 0x0f, 0x0c, 0x08, 0x04, 0x01, 0x00, 0xfc, 0xf7, + 0xf9, 0xfc, 0xfc, 0xff, 0x05, 0xfe, 0xfe, 0x02, 0x01, 0x00, 0xff, 0xfe, + 0xfa, 0xf9, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfb, 0xfd, 0x00, 0xfe, + 0x00, 0xff, 0xfa, 0xf6, 0xf8, 0xfd, 0x04, 0x0f, 0x0b, 0x07, 0x08, 0x11, + 0x14, 0x11, 0x0a, 0x0a, 0x09, 0x07, 0x0a, 0x0b, 0x10, 0x10, 0x0c, 0x08, + 0x07, 0x05, 0x02, 0x02, 0x06, 0x02, 0x01, 0x00, 0xff, 0xfd, 0xfd, 0xff, + 0x01, 0xff, 0xfe, 0xfb, 0xf9, 0xfd, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x05, + 0x0a, 0x05, 0x03, 0xfd, 0xfd, 0x00, 0x08, 0x0d, 0x04, 0xff, 0xfc, 0x00, + 0x05, 0x09, 0x08, 0x09, 0x0d, 0x07, 0x00, 0xfc, 0xfa, 0xfb, 0xfd, 0xfe, + 0xfe, 0xfc, 0xfc, 0x03, 0x0b, 0x0f, 0x10, 0x0b, 0x03, 0x02, 0x08, 0x0a, + 0x07, 0x04, 0xfe, 0xf9, 0xfc, 0x01, 0x02, 0x07, 0x08, 0x03, 0x02, 0x05, + 0x03, 0x01, 0xf8, 0xf4, 0xf7, 0xfc, 0x0a, 0x06, 0x08, 0x09, 0x0a, 0x0a, + 0x0d, 0x12, 0x10, 0x0e, 0x09, 0x03, 0xff, 0xff, 0x01, 0x02, 0x02, 0x03, + 0x08, 0x08, 0x03, 0x07, 0x0b, 0x08, 0x05, 0x04, 0x01, 0x02, 0x00, 0xff, + 0x01, 0xff, 0xfd, 0xfa, 0xfd, 0xfd, 0xfc, 0xf9, 0xf6, 0xf5, 0xf8, 0xf9, + 0xf3, 0xee, 0xe9, 0xf1, 0xfd, 0x0a, 0x09, 0xfe, 0xfa, 0x02, 0x0e, 0x0d, + 0x12, 0x13, 0x0e, 0x0b, 0x10, 0x13, 0x0d, 0x0d, 0x0e, 0x0c, 0x0b, 0x09, + 0x04, 0x02, 0xfe, 0x06, 0x0f, 0x0d, 0x0b, 0x08, 0x09, 0x0d, 0x08, 0x04, + 0x00, 0xfe, 0xfc, 0xf6, 0xf6, 0xfd, 0xfe, 0xfc, 0x00, 0x06, 0x0c, 0x0b, + 0x05, 0x02, 0xff, 0x02, 0x04, 0x06, 0x02, 0x02, 0x00, 0xfd, 0xfa, 0x00, + 0x0a, 0x09, 0x04, 0x00, 0xfc, 0xfa, 0xf9, 0xf9, 0xfb, 0xfd, 0xfc, 0xf9, + 0xf8, 0xfc, 0xfd, 0xfd, 0x04, 0x07, 0x07, 0x02, 0x01, 0x04, 0x01, 0xfe, + 0xfb, 0xfb, 0xfc, 0xfb, 0x06, 0x0d, 0x0f, 0x0d, 0x08, 0x07, 0x06, 0x04, + 0x02, 0x04, 0x06, 0x07, 0x13, 0x12, 0x0f, 0x12, 0x15, 0x13, 0x12, 0x0f, + 0x12, 0x10, 0x0b, 0x0b, 0x08, 0x01, 0xfd, 0x02, 0x08, 0x09, 0x08, 0x01, + 0xf9, 0xf7, 0xfa, 0xf8, 0xfe, 0xff, 0xfe, 0xf9, 0xfb, 0x00, 0xff, 0xf3, + 0xf5, 0xf9, 0xf5, 0xf8, 0xfe, 0xf9, 0xf6, 0xf9, 0xfb, 0xfa, 0xf9, 0xfa, + 0xfc, 0xfc, 0xfd, 0x06, 0x0c, 0x05, 0x05, 0x07, 0x0d, 0x10, 0x10, 0x12, + 0x18, 0x15, 0x0c, 0x0c, 0x11, 0x0e, 0x09, 0x0a, 0x05, 0x02, 0xfd, 0xfc, + 0xfb, 0xf7, 0xf8, 0xfc, 0x08, 0x0c, 0x08, 0x04, 0x03, 0xff, 0xfb, 0xfa, + 0xfa, 0xfb, 0xfc, 0xff, 0x03, 0x07, 0x0c, 0x09, 0x0b, 0x0a, 0x0a, 0x0c, + 0x06, 0x03, 0x05, 0x10, 0x0d, 0x07, 0x04, 0x07, 0x07, 0x07, 0x09, 0x0c, + 0x0d, 0x08, 0x01, 0xfd, 0xf5, 0xf5, 0xf8, 0xf8, 0xfd, 0xfc, 0xf4, 0xf0, + 0xf1, 0xf9, 0xfc, 0xff, 0x06, 0x04, 0x03, 0x04, 0x03, 0x03, 0x01, 0xf8, + 0xf7, 0xfa, 0xfb, 0xfe, 0x01, 0x01, 0x05, 0x01, 0x02, 0x04, 0x06, 0x04, + 0x03, 0x07, 0x19, 0x17, 0x10, 0x0c, 0x0c, 0x0c, 0x0a, 0x08, 0x06, 0x04, + 0x09, 0x0a, 0x07, 0x03, 0x02, 0x02, 0x05, 0x05, 0x06, 0x08, 0x04, 0xff, + 0xff, 0xff, 0x00, 0x05, 0x0f, 0x0b, 0x04, 0x01, 0x00, 0x01, 0xff, 0x00, + 0xfc, 0xf8, 0xf8, 0xfc, 0x01, 0x02, 0xff, 0xfb, 0xf9, 0xfb, 0x01, 0x01, + 0xff, 0x01, 0x03, 0xfb, 0xf8, 0xfd, 0x04, 0x03, 0x03, 0x06, 0x0d, 0x0e, + 0x0d, 0x07, 0x07, 0x09, 0x07, 0x02, 0x03, 0x04, 0x02, 0xff, 0x00, 0xff, + 0xff, 0xfd, 0x00, 0x06, 0x06, 0x05, 0x07, 0x06, 0x04, 0x04, 0x01, 0x00, + 0x03, 0x03, 0x00, 0x02, 0x06, 0x07, 0x0a, 0x09, 0x0a, 0x05, 0x03, 0x01, + 0x05, 0x0f, 0x08, 0x02, 0xfc, 0xfe, 0x03, 0x06, 0x06, 0x04, 0x03, 0x04, + 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xf8, 0x01, 0x07, 0x02, 0xfd, 0xf9, 0xfa, + 0xfb, 0xfb, 0xfd, 0x03, 0x0d, 0x10, 0x0e, 0x09, 0x05, 0x03, 0xfe, 0xfb, + 0xfa, 0xfb, 0xfe, 0x02, 0x06, 0x03, 0x07, 0x08, 0x07, 0x03, 0x02, 0x06, + 0x0e, 0x0b, 0x08, 0x0c, 0x0c, 0x0d, 0x09, 0x0a, 0x0b, 0x07, 0x04, 0x06, + 0x09, 0x03, 0x02, 0x03, 0x05, 0x01, 0x00, 0xfc, 0xfc, 0xfb, 0xf6, 0xf7, + 0xfc, 0xfe, 0x01, 0x10, 0x0e, 0x07, 0x04, 0x05, 0xfd, 0xf6, 0xf3, 0xf1, + 0xf3, 0xf5, 0xfb, 0xf9, 0xfb, 0xfc, 0xfd, 0xfc, 0xf9, 0xf9, 0xfd, 0x09, + 0x12, 0x11, 0x0c, 0x10, 0x16, 0x10, 0x0a, 0x0c, 0x0b, 0x0a, 0x07, 0x0b, + 0x0f, 0x0c, 0x0e, 0x10, 0x0c, 0x0d, 0x0d, 0x05, 0x00, 0xfc, 0xfe, 0xff, + 0x04, 0x05, 0x08, 0x08, 0x07, 0xfe, 0xfa, 0xf5, 0xf4, 0xf5, 0xf8, 0xfe, + 0xfe, 0x00, 0xfc, 0x00, 0x09, 0x0b, 0x05, 0x02, 0xfe, 0xfc, 0x0c, 0x14, + 0x09, 0x04, 0x03, 0x00, 0xfc, 0xfc, 0xfb, 0xfd, 0xff, 0x02, 0x09, 0x0a, + 0x0c, 0x08, 0x02, 0xfe, 0xfc, 0xf8, 0xf8, 0xf8, 0xf9, 0xf6, 0xf5, 0xfb, + 0xfb, 0x04, 0x0d, 0x0d, 0x0b, 0x05, 0x00, 0xfa, 0xfa, 0xfd, 0xfb, 0xfa, + 0x00, 0x04, 0x00, 0x02, 0x0c, 0x0d, 0x0f, 0x15, 0x0e, 0x13, 0x20, 0x19, + 0x15, 0x0d, 0x0c, 0x0d, 0x0b, 0x0a, 0x0c, 0x0e, 0x0b, 0x07, 0x05, 0x08, + 0x07, 0x04, 0x04, 0x03, 0x01, 0xf9, 0xf7, 0xfc, 0xfb, 0xf7, 0xf6, 0xf8, + 0xf6, 0xff, 0x01, 0x00, 0xfe, 0x02, 0xfe, 0xfc, 0xfc, 0xf7, 0xf5, 0xf3, + 0xf4, 0xf1, 0xf4, 0xf7, 0xf9, 0xfe, 0xfd, 0xfa, 0xfe, 0x0b, 0x09, 0x06, + 0x06, 0x0c, 0x11, 0x18, 0x10, 0x08, 0x04, 0x09, 0x0b, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x05, 0x04, 0x04, 0x02, 0x01, 0xfd, 0xfa, 0xfa, 0xfc, 0xfd, + 0x07, 0x10, 0x0e, 0x0f, 0x16, 0x11, 0x04, 0x00, 0xfe, 0xfe, 0xfe, 0x03, + 0x03, 0x05, 0x0b, 0x08, 0x0e, 0x11, 0x0c, 0x0b, 0x15, 0x11, 0x0b, 0x09, + 0x04, 0x03, 0x03, 0x04, 0x02, 0xfa, 0xfb, 0xfb, 0xf7, 0xf7, 0xfc, 0x09, + 0x02, 0xfd, 0xf6, 0xf5, 0xf8, 0xf7, 0xf2, 0xf1, 0xf3, 0xf4, 0xf6, 0xfd, + 0x06, 0x09, 0x05, 0x00, 0x00, 0xfa, 0xf5, 0xf6, 0xf8, 0xf7, 0xfb, 0xfe, + 0x03, 0x06, 0x07, 0x09, 0x09, 0x0d, 0x0f, 0x1d, 0x1b, 0x16, 0x1b, 0x11, + 0x0b, 0x0d, 0x0e, 0x09, 0x07, 0x06, 0x05, 0x06, 0x03, 0x00, 0x03, 0x08, + 0x0c, 0x0c, 0x07, 0x05, 0x04, 0x00, 0xff, 0x08, 0x03, 0xfe, 0xfe, 0x03, + 0x08, 0x0a, 0x07, 0x00, 0x01, 0x00, 0x00, 0xfb, 0xf7, 0xf9, 0xf9, 0xf5, + 0xf7, 0xf7, 0xf4, 0xf4, 0xf8, 0xfc, 0x09, 0x09, 0x07, 0x05, 0x0b, 0x0c, + 0x0a, 0x05, 0x01, 0x01, 0x01, 0x01, 0x08, 0x05, 0x03, 0x02, 0x08, 0x09, + 0x07, 0x04, 0x03, 0x01, 0xff, 0xfb, 0xfb, 0xf9, 0xfe, 0x03, 0x05, 0x09, + 0x07, 0x02, 0x04, 0x0d, 0x0d, 0x06, 0x00, 0xfd, 0xfc, 0x03, 0x06, 0x03, + 0x01, 0x01, 0x00, 0xfd, 0x04, 0x17, 0x12, 0x08, 0x03, 0x03, 0x03, 0x06, + 0x06, 0x08, 0x07, 0x04, 0x04, 0x09, 0x09, 0x09, 0x06, 0xfe, 0x02, 0x04, + 0x01, 0xfb, 0xff, 0xfc, 0xf7, 0xf9, 0xfb, 0x01, 0x06, 0x06, 0x0a, 0x0e, + 0x09, 0x01, 0xfe, 0xff, 0xfb, 0xf1, 0xf5, 0xfa, 0xfd, 0xf9, 0xfb, 0x09, + 0x07, 0x03, 0xfe, 0xfe, 0x15, 0x1d, 0x1a, 0x14, 0x0c, 0x0a, 0x0c, 0x09, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x01, 0xfe, 0xfe, 0x00, 0x04, 0x09, 0x04, + 0xfe, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xfe, 0x01, 0x0a, 0x0a, + 0x00, 0xfc, 0xfc, 0xfe, 0x01, 0xfc, 0xfb, 0xf9, 0xf8, 0xf5, 0xf6, 0xfb, + 0xfa, 0xf5, 0xf9, 0x0b, 0x16, 0x17, 0x18, 0x23, 0x1d, 0x17, 0x13, 0x0c, + 0x06, 0x0c, 0x0d, 0x0a, 0x09, 0x03, 0x05, 0x06, 0x06, 0x0b, 0x0b, 0x03, + 0x03, 0x03, 0xfb, 0xfa, 0xf8, 0xf8, 0xf8, 0xf8, 0xfc, 0x04, 0x04, 0x00, + 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0xfb, 0xfe, 0x05, 0xff, 0xfc, 0xff, 0xff, + 0x02, 0x01, 0x0b, 0x0c, 0x10, 0x0f, 0x07, 0x05, 0x09, 0x07, 0x03, 0x02, + 0x02, 0x04, 0x08, 0x0c, 0x07, 0x04, 0x00, 0xfc, 0xfc, 0x06, 0x05, 0xfb, + 0xf6, 0xf3, 0xef, 0xf2, 0xf7, 0xff, 0xfc, 0xfb, 0x05, 0x04, 0x00, 0xfc, + 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0x04, 0x06, 0x04, 0x04, 0x0c, 0x0c, + 0x0c, 0x16, 0x15, 0x17, 0x1c, 0x1b, 0x15, 0x11, 0x12, 0x14, 0x14, 0x11, + 0x0e, 0x0d, 0x09, 0x04, 0xff, 0xfb, 0xfb, 0xfe, 0x01, 0x05, 0x0a, 0x0b, + 0xfd, 0xf9, 0xf4, 0xf7, 0xf9, 0xf8, 0xfa, 0x03, 0x00, 0xfe, 0xfa, 0xf4, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf4, 0xf4, 0xf2, 0xf1, 0xef, 0xf5, 0xf8, 0xfb, + 0x05, 0x00, 0xfc, 0x07, 0x11, 0x0c, 0x0b, 0x14, 0x12, 0x0f, 0x11, 0x11, + 0x0a, 0x06, 0x03, 0xff, 0xfd, 0x05, 0x0c, 0x09, 0x0b, 0x0a, 0x04, 0x01, + 0x02, 0x02, 0xff, 0xff, 0x03, 0x06, 0x15, 0x1c, 0x15, 0x0f, 0x09, 0x06, + 0x03, 0x04, 0x07, 0x05, 0x01, 0x04, 0x03, 0xfe, 0xff, 0x04, 0x05, 0x11, + 0x0f, 0x06, 0x00, 0x06, 0x00, 0xfd, 0x01, 0x02, 0x00, 0xff, 0xfd, 0xff, + 0xfc, 0xf5, 0xf7, 0xff, 0xff, 0xfc, 0xff, 0x01, 0x01, 0xfb, 0xf5, 0xf0, + 0xec, 0xf1, 0x00, 0x01, 0xff, 0x04, 0x05, 0x06, 0x01, 0xfd, 0xfb, 0xfb, + 0xfb, 0xfd, 0x07, 0x0e, 0x09, 0x06, 0x01, 0x01, 0x02, 0x08, 0x1a, 0x19, + 0x0b, 0x06, 0x0b, 0x10, 0x0c, 0x0d, 0x0e, 0x0e, 0x0e, 0x0b, 0x08, 0x06, + 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x05, 0x02, 0x02, 0x03, + 0x04, 0xfe, 0x02, 0x04, 0x0c, 0x07, 0x03, 0xfe, 0xfa, 0xfb, 0xfd, 0x03, + 0x02, 0x01, 0x03, 0x00, 0xf2, 0xed, 0xed, 0xee, 0xed, 0x01, 0x14, 0x0f, + 0x07, 0x06, 0x0b, 0x0b, 0x08, 0x0d, 0x0c, 0x08, 0x08, 0x09, 0x09, 0x06, + 0x02, 0xfd, 0xfd, 0xff, 0x03, 0x03, 0x01, 0x01, 0xfd, 0xff, 0xfe, 0x00, + 0xfd, 0xf9, 0xff, 0x07, 0xff, 0xfe, 0x02, 0x04, 0x05, 0x05, 0x0a, 0x03, + 0x02, 0x08, 0x04, 0xfd, 0xf8, 0xfb, 0xfd, 0xfd, 0x0d, 0x16, 0x0e, 0x06, + 0x02, 0x05, 0x08, 0x04, 0x05, 0x06, 0x14, 0x18, 0x14, 0x10, 0x0f, 0x0d, + 0x06, 0x06, 0x00, 0xfe, 0xff, 0xff, 0x02, 0xff, 0xfc, 0xf9, 0xfa, 0x02, + 0x01, 0x05, 0x0b, 0x05, 0xf6, 0xf0, 0xf1, 0xf5, 0xf3, 0xf3, 0xf5, 0xf7, + 0xfa, 0xf9, 0xf9, 0xf9, 0xfd, 0x04, 0x05, 0x0c, 0x15, 0x13, 0x0b, 0x06, + 0x04, 0x09, 0x0a, 0x0c, 0x0f, 0x10, 0x12, 0x11, 0x0e, 0x0c, 0x0c, 0x09, + 0x05, 0x05, 0x0e, 0x12, 0x0c, 0x08, 0x05, 0x04, 0x02, 0x04, 0xfd, 0xf5, + 0xfd, 0x01, 0x03, 0xfe, 0xfa, 0xf9, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xfa, + 0xf9, 0xf9, 0xf4, 0xf3, 0xf4, 0xf1, 0xfa, 0x07, 0x00, 0x01, 0x09, 0x08, + 0x0e, 0x20, 0x1c, 0x0f, 0x0b, 0x0d, 0x0f, 0x10, 0x0b, 0x08, 0x09, 0x0a, + 0x0b, 0x0a, 0x0c, 0x0d, 0x02, 0xfd, 0xff, 0xfe, 0xfa, 0xf9, 0x06, 0x11, + 0x0e, 0x0e, 0x09, 0x00, 0xfd, 0x00, 0xfe, 0xff, 0xfe, 0xfe, 0x02, 0x05, + 0x05, 0x00, 0xfb, 0xf9, 0xf7, 0xfc, 0x0e, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x03, 0x02, 0xfd, 0xfd, 0x02, 0x01, 0x06, 0x0e, 0x09, 0x01, + 0xfd, 0xfb, 0xfa, 0xfb, 0xfa, 0xf8, 0xf7, 0xf8, 0xfd, 0x09, 0x0e, 0x0d, + 0x07, 0x03, 0xfe, 0xf9, 0xf8, 0xf9, 0x02, 0x0b, 0x08, 0x0c, 0x0f, 0x0f, + 0x08, 0x0a, 0x08, 0x00, 0x02, 0x12, 0x12, 0x0b, 0x0d, 0x0d, 0x0c, 0x14, + 0x13, 0x12, 0x11, 0x10, 0x07, 0x06, 0x04, 0x04, 0x00, 0xff, 0xfd, 0xfb, + 0xf7, 0xf7, 0xf8, 0xf7, 0xfe, 0x06, 0x04, 0x00, 0x06, 0x04, 0xff, 0xfd, + 0xfc, 0xf7, 0xf4, 0xf3, 0xf4, 0xf8, 0xfa, 0xfa, 0xfe, 0xfe, 0xfe, 0xfb, + 0xf7, 0xf6, 0xfa, 0x05, 0x0e, 0x0f, 0x06, 0x09, 0x11, 0x0e, 0x0d, 0x0b, + 0x0a, 0x09, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0b, 0x09, 0x03, 0x01, 0x03, + 0x06, 0x05, 0x00, 0x02, 0x01, 0xfe, 0xfd, 0x05, 0x04, 0x01, 0x04, 0x09, + 0x0c, 0x0b, 0x0c, 0x05, 0x01, 0x00, 0x02, 0x05, 0x09, 0x07, 0x04, 0x00, + 0x00, 0x00, 0x01, 0x08, 0x0c, 0x01, 0xfc, 0xf8, 0xfb, 0x03, 0x03, 0x0b, + 0x0b, 0x0a, 0x09, 0x06, 0x06, 0x01, 0xff, 0xfe, 0x00, 0xfd, 0xfb, 0xfa, + 0xfd, 0xfb, 0xfc, 0xff, 0xfd, 0x00, 0x0a, 0x0d, 0x09, 0x05, 0xff, 0xfc, + 0xf9, 0xf9, 0xf7, 0xf2, 0xf2, 0xf8, 0xfe, 0x07, 0x04, 0x03, 0x06, 0x05, + 0x02, 0xff, 0xfe, 0x0e, 0x09, 0x02, 0xfc, 0xfd, 0x08, 0x11, 0x13, 0x12, + 0x0d, 0x0b, 0x0b, 0x0a, 0x0c, 0x0a, 0x0c, 0x15, 0x15, 0x0d, 0x0b, 0x0b, + 0x0c, 0x07, 0x08, 0x02, 0x0c, 0x07, 0x04, 0x07, 0x06, 0x01, 0x01, 0x02, + 0xff, 0xff, 0xf6, 0xf4, 0xf7, 0xf3, 0xf3, 0xf8, 0xf5, 0xf1, 0xee, 0xe9, + 0xeb, 0xee, 0x03, 0x09, 0xff, 0x02, 0x08, 0x0c, 0x0b, 0x08, 0x03, 0x02, + 0x05, 0x04, 0x03, 0x02, 0x03, 0x07, 0x0a, 0x0b, 0x08, 0x04, 0x05, 0x06, + 0x00, 0x05, 0x0b, 0x18, 0x17, 0x0c, 0x0a, 0x0c, 0x0b, 0x08, 0x04, 0x03, + 0x02, 0x00, 0xfa, 0xfd, 0x04, 0x04, 0x02, 0x02, 0x02, 0x00, 0x00, 0xfd, + 0xfb, 0x02, 0x09, 0xff, 0xfb, 0xfd, 0x01, 0xff, 0x00, 0x03, 0x0d, 0x09, + 0x05, 0x09, 0x09, 0x07, 0x04, 0x04, 0x02, 0x00, 0xfd, 0xfd, 0xfc, 0xfc, + 0xff, 0x05, 0x12, 0x0e, 0x0d, 0x04, 0x02, 0x01, 0xfa, 0xf5, 0xf5, 0xfc, + 0x03, 0xfc, 0xfa, 0x01, 0x08, 0x03, 0x01, 0x01, 0x00, 0xfe, 0xfe, 0x00, + 0x05, 0x10, 0x09, 0x01, 0x00, 0x09, 0x0f, 0x0f, 0x10, 0x0f, 0x0d, 0x0c, + 0x0d, 0x0b, 0x09, 0x06, 0x04, 0x0c, 0x0e, 0x05, 0x00, 0x02, 0x00, 0xfd, + 0x07, 0x0b, 0x02, 0xfd, 0xf9, 0xfb, 0xff, 0xfc, 0xf7, 0xf5, 0xf6, 0xf9, + 0xf3, 0xf4, 0xf8, 0xf9, 0xf8, 0xf8, 0xf8, 0xfb, 0x03, 0x00, 0xfd, 0x02, + 0x18, 0x17, 0x07, 0x07, 0x12, 0x10, 0x09, 0x0b, 0x0e, 0x0b, 0x0b, 0x0a, + 0x0a, 0x0f, 0x10, 0x0e, 0x0e, 0x09, 0xff, 0xfd, 0xfe, 0xfa, 0xf8, 0x02, + 0x0a, 0x0c, 0x08, 0x01, 0x02, 0x08, 0x05, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, + 0xf6, 0xfb, 0xfd, 0xfc, 0x00, 0x00, 0x01, 0x02, 0xff, 0xfc, 0xfc, 0x04, + 0x0b, 0x04, 0x00, 0x04, 0x0d, 0x11, 0x03, 0x03, 0x08, 0x08, 0x08, 0x06, + 0x03, 0x03, 0x05, 0x06, 0x00, 0xff, 0xfd, 0xfd, 0xf9, 0xf9, 0x0b, 0x10, + 0x09, 0x06, 0x09, 0x06, 0x01, 0x01, 0xff, 0xf9, 0xf9, 0xfe, 0xfc, 0xfc, + 0x06, 0x08, 0x01, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xfe, 0xfb, 0xff, 0x0d, + 0x0d, 0x0d, 0x0f, 0x10, 0x0c, 0x08, 0xff, 0x02, 0x06, 0x03, 0x04, 0x06, + 0x08, 0x15, 0x0f, 0x0b, 0x09, 0x06, 0x05, 0x02, 0xfd, 0x04, 0x0a, 0x06, + 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xfe, 0xfb, 0xfa, 0xf9, 0xf9, 0x00, + 0x01, 0xfb, 0xf8, 0xf4, 0xfb, 0xff, 0xf3, 0xf2, 0xfc, 0x02, 0x0b, 0x0d, + 0x06, 0x0b, 0x0a, 0x04, 0x00, 0xfe, 0xff, 0x01, 0x04, 0x06, 0x05, 0x06, + 0x06, 0x0a, 0x0a, 0x05, 0x02, 0x01, 0x01, 0x00, 0x05, 0x15, 0x12, 0x0b, + 0x0c, 0x0d, 0x0b, 0x09, 0x08, 0x06, 0x06, 0x07, 0x04, 0x04, 0x09, 0x09, + 0x04, 0x02, 0x02, 0x05, 0x06, 0x05, 0xfc, 0xf5, 0xf2, 0xf7, 0x04, 0x07, + 0x0e, 0x09, 0x01, 0xff, 0x06, 0x02, 0x02, 0x02, 0xfd, 0xfb, 0xfc, 0xff, + 0xfd, 0xfb, 0xfa, 0xf8, 0xf8, 0xf8, 0xfa, 0x07, 0x0f, 0x08, 0x01, 0x02, + 0x06, 0x0a, 0x05, 0x02, 0xff, 0x02, 0x02, 0xfb, 0xfc, 0x01, 0x03, 0x02, + 0x03, 0x04, 0x03, 0x03, 0x02, 0xfe, 0xf9, 0xfb, 0xfe, 0x09, 0x16, 0x16, + 0x11, 0x0c, 0x09, 0x06, 0x08, 0x09, 0x0a, 0x09, 0x0f, 0x10, 0x10, 0x13, + 0x12, 0x0c, 0x0a, 0x0a, 0x04, 0xfe, 0x03, 0x07, 0x03, 0x02, 0x04, 0x01, + 0xfe, 0x02, 0x03, 0x03, 0x02, 0xfd, 0xf7, 0xef, 0xee, 0xf0, 0xf0, 0xf3, + 0xf3, 0xef, 0xf5, 0xf7, 0xf6, 0xf2, 0xf7, 0xfd, 0x05, 0x17, 0x0d, 0x0d, + 0x0f, 0x08, 0x07, 0x04, 0x07, 0x09, 0x0a, 0x08, 0x07, 0x0e, 0x12, 0x12, + 0x11, 0x0e, 0x0e, 0x08, 0x0a, 0x0e, 0x0a, 0x0d, 0x0a, 0x0a, 0x0c, 0x09, + 0x05, 0x01, 0xfc, 0xf8, 0xf7, 0xfa, 0xfc, 0x00, 0xfe, 0xfa, 0xfa, 0xfe, + 0xff, 0xfe, 0xf9, 0xf6, 0xf5, 0xf2, 0xf2, 0xfb, 0x0b, 0x0f, 0x08, 0x0e, + 0x07, 0x00, 0x02, 0x04, 0x0a, 0x0a, 0x0a, 0x0b, 0x0e, 0x0e, 0x0b, 0x05, + 0x02, 0x02, 0x00, 0xfe, 0x06, 0x10, 0x0f, 0x09, 0xfc, 0xf6, 0xfb, 0x02, + 0x07, 0x0a, 0x02, 0x04, 0x01, 0xfd, 0xff, 0x03, 0xfd, 0xf9, 0xf7, 0xf4, + 0xf6, 0xf7, 0xf9, 0xf9, 0xf5, 0xf2, 0xfb, 0x0b, 0x19, 0x18, 0x11, 0x0a, + 0x05, 0x04, 0x04, 0x06, 0x0b, 0x0a, 0x00, 0x07, 0x18, 0x11, 0x0a, 0x09, + 0x0e, 0x0a, 0x07, 0x0a, 0x11, 0x08, 0x06, 0x02, 0xff, 0xff, 0xff, 0xfe, + 0xfd, 0xfd, 0xfb, 0xfd, 0xfe, 0xfd, 0x00, 0x01, 0x00, 0x00, 0xfc, 0xfe, + 0xf4, 0xf1, 0xf5, 0xf9, 0xf8, 0xfa, 0xfe, 0x02, 0x0c, 0x07, 0x0c, 0x0e, + 0x08, 0x05, 0x04, 0x06, 0x0b, 0x0d, 0x0c, 0x0c, 0x09, 0xfc, 0xf7, 0xfc, + 0x02, 0xff, 0xfd, 0x07, 0x10, 0x0e, 0x09, 0x09, 0x07, 0x02, 0x02, 0x05, + 0x04, 0x07, 0x03, 0x02, 0x02, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x02, 0xff, 0xfc, 0x04, 0x11, 0x08, 0x13, 0x14, 0x0a, 0x09, 0x08, + 0x03, 0x02, 0xff, 0xfc, 0xfc, 0xff, 0x03, 0x00, 0xfe, 0xfc, 0xfa, 0xf7, + 0xf3, 0xf7, 0x06, 0x05, 0xff, 0xfd, 0xf9, 0xfa, 0xfc, 0xfb, 0x00, 0xf7, + 0xfa, 0x0b, 0x09, 0x05, 0x07, 0x04, 0x05, 0x0c, 0x08, 0x03, 0x04, 0x03, + 0x02, 0xff, 0xfe, 0x02, 0x0b, 0x0a, 0x0a, 0x1d, 0x1b, 0x13, 0x05, 0x03, + 0x04, 0x10, 0x16, 0x13, 0x11, 0x11, 0x0a, 0x0a, 0x05, 0x03, 0x02, 0xfe, + 0xfc, 0x05, 0x09, 0x00, 0x00, 0xfe, 0xfa, 0xfc, 0xfb, 0xfc, 0xff, 0x00, + 0x02, 0xff, 0xf7, 0xf7, 0xfc, 0xf9, 0xf4, 0xec, 0xe8, 0xf2, 0xfc, 0xf9, + 0xf4, 0xf7, 0xfa, 0xff, 0xfe, 0xfe, 0x08, 0x12, 0x0a, 0x0f, 0x10, 0x0b, + 0x06, 0x06, 0x04, 0x08, 0x0d, 0x10, 0x10, 0x0d, 0x0e, 0x15, 0x1c, 0x11, + 0x09, 0x11, 0x0f, 0x0d, 0x0b, 0x07, 0x07, 0x02, 0xff, 0xff, 0xff, 0x01, + 0x04, 0x03, 0xff, 0x01, 0x03, 0x00, 0xff, 0x01, 0x00, 0xfc, 0xf3, 0xe9, + 0xe9, 0xed, 0xf5, 0xf1, 0xef, 0xf4, 0x10, 0x1b, 0x0c, 0x06, 0x0b, 0x0b, + 0x05, 0x06, 0x09, 0x0c, 0x08, 0x05, 0x01, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x0c, 0x0e, 0x09, 0x09, 0x07, 0x0b, 0x14, 0x0b, 0x06, 0x09, 0x08, 0x07, + 0x02, 0xfe, 0xfc, 0xfd, 0xfc, 0xfc, 0xfb, 0xf8, 0xf9, 0xf9, 0xf6, 0xf4, + 0xf5, 0xfc, 0xfb, 0xf9, 0xfc, 0x00, 0x10, 0x0e, 0x07, 0x07, 0x06, 0xfe, + 0xfa, 0x06, 0x0d, 0x1c, 0x17, 0x10, 0x11, 0x10, 0x0d, 0x09, 0x0c, 0x11, + 0x14, 0x0d, 0x08, 0x07, 0x04, 0x03, 0x05, 0x02, 0x02, 0x05, 0x09, 0x00, + 0xf5, 0xf6, 0x07, 0x0b, 0x01, 0xfa, 0xf3, 0xed, 0xec, 0xe9, 0xe9, 0xf0, + 0xf8, 0xfa, 0xf4, 0xf1, 0xf5, 0xfb, 0x0b, 0x06, 0x07, 0x0b, 0x09, 0x0a, + 0x0f, 0x10, 0x0d, 0x09, 0x06, 0x04, 0x03, 0x00, 0xfa, 0xfe, 0x05, 0x15, + 0x1e, 0x17, 0x10, 0x09, 0x03, 0x04, 0x04, 0x01, 0x06, 0x07, 0x04, 0x00, + 0x01, 0x04, 0x01, 0xfd, 0xfc, 0xf9, 0xfb, 0x00, 0x01, 0x02, 0x09, 0x14, + 0x0c, 0x03, 0x03, 0x00, 0xfb, 0x09, 0x14, 0x0c, 0x09, 0x0a, 0x09, 0x07, + 0x05, 0x03, 0x03, 0x02, 0xfc, 0xf8, 0xf7, 0xf9, 0xfb, 0xfc, 0x02, 0x09, + 0x01, 0xf1, 0xec, 0xec, 0xf0, 0xf1, 0xf6, 0xf9, 0x07, 0x14, 0x0c, 0x09, + 0x06, 0x06, 0x02, 0x01, 0x02, 0xfe, 0xfd, 0xfe, 0x00, 0xfe, 0x03, 0x0b, + 0x09, 0x05, 0x06, 0x07, 0x05, 0x17, 0x21, 0x23, 0x20, 0x18, 0x1a, 0x14, + 0x0e, 0x0e, 0x08, 0x01, 0xff, 0x01, 0x01, 0x03, 0x03, 0x00, 0x08, 0x0d, + 0x04, 0xfc, 0xf8, 0xf6, 0xfa, 0xfb, 0xfb, 0xff, 0xf9, 0xf4, 0xf7, 0xf6, + 0xf1, 0xee, 0xee, 0xf0, 0xf1, 0xfa, 0x01, 0xfe, 0xf7, 0xf5, 0x00, 0x01, + 0xfe, 0xfc, 0xf9, 0xfd, 0x02, 0x14, 0x11, 0x13, 0x1c, 0x1d, 0x1a, 0x17, + 0x14, 0x0f, 0x0b, 0x0d, 0x11, 0x12, 0x10, 0x0e, 0x04, 0x03, 0x12, 0x0f, + 0x04, 0x02, 0x04, 0x02, 0x02, 0xfe, 0x02, 0x02, 0xfc, 0xfa, 0xfc, 0xfe, + 0x01, 0xfe, 0xfb, 0xfb, 0xf9, 0xf6, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xfa, + 0xfe, 0xfc, 0x01, 0x06, 0x06, 0x14, 0x12, 0x0c, 0x0e, 0x08, 0x07, 0x0a, + 0x09, 0x04, 0x00, 0xff, 0xfd, 0xfc, 0xfd, 0xfe, 0xfa, 0x00, 0x12, 0x16, + 0x0b, 0x0a, 0x09, 0x06, 0x04, 0x05, 0x04, 0x08, 0x09, 0x04, 0x00, 0x01, + 0x02, 0x01, 0x00, 0xfe, 0xfc, 0xf7, 0xf3, 0xf5, 0xfc, 0x07, 0x05, 0x03, + 0x00, 0xfc, 0xfc, 0xf7, 0xf1, 0x05, 0x07, 0x08, 0x0e, 0x0a, 0x09, 0x10, + 0x17, 0x11, 0x0b, 0x08, 0x08, 0x05, 0x03, 0x06, 0x09, 0x0b, 0x12, 0x0b, + 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x01, 0x02, 0x09, 0x09, 0x0a, 0x04, + 0xfe, 0xf8, 0xf5, 0xf1, 0xf0, 0xe7, 0xe6, 0xe8, 0xf0, 0xf8, 0xfa, 0xfb, + 0xf7, 0xf3, 0xf0, 0xf1, 0xf8, 0x0d, 0x11, 0x15, 0x12, 0x0c, 0x08, 0x04, + 0x05, 0x00, 0x00, 0x00, 0x07, 0x06, 0x03, 0x06, 0x12, 0x21, 0x1e, 0x12, + 0x0c, 0x0b, 0x0a, 0x09, 0x0b, 0x06, 0x02, 0x03, 0x04, 0x03, 0x09, 0x0b, + 0x03, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xf9, 0x08, 0x0a, 0x05, 0x04, 0x00, + 0xfe, 0xfe, 0xf7, 0xf5, 0x04, 0x19, 0x12, 0x0b, 0x07, 0x03, 0xfe, 0xfe, + 0xfe, 0xfc, 0xfc, 0xfc, 0xfa, 0xf6, 0xf3, 0xf1, 0xf4, 0x00, 0x06, 0xfc, + 0xfa, 0xfb, 0xfa, 0xfa, 0xf9, 0x00, 0x0b, 0x0c, 0x09, 0x01, 0x01, 0x02, + 0x00, 0x01, 0x00, 0xfc, 0xf7, 0xf8, 0x00, 0x0b, 0x0b, 0x08, 0x06, 0x05, + 0x0c, 0x11, 0x06, 0x05, 0x1a, 0x2a, 0x23, 0x1d, 0x1d, 0x16, 0x0e, 0x08, + 0x04, 0x06, 0x09, 0x0c, 0x08, 0x03, 0x02, 0x02, 0x02, 0x08, 0x0c, 0x0a, + 0x06, 0x01, 0x01, 0x00, 0xfb, 0xf7, 0xef, 0xe6, 0xec, 0xf4, 0xf7, 0xf0, + 0xec, 0xec, 0xf0, 0xf9, 0xf4, 0xf0, 0xf4, 0xf9, 0xfb, 0xfd, 0xff, 0xfe, + 0xfb, 0xf9, 0xfe, 0x06, 0x12, 0x1d, 0x18, 0x1c, 0x1c, 0x1f, 0x1c, 0x13, + 0x0d, 0x15, 0x10, 0x0b, 0x08, 0x05, 0x05, 0x06, 0x00, 0x04, 0x0c, 0x0c, + 0x0a, 0x07, 0x01, 0x00, 0xfe, 0xfc, 0xfe, 0xff, 0xfb, 0xfd, 0xfb, 0xf7, + 0xf8, 0xf6, 0xf1, 0xeb, 0xf1, 0xf8, 0x05, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x0f, 0x08, 0x04, 0x06, 0x0d, 0x19, 0x11, 0x0d, 0x0d, 0x0a, 0x08, 0x07, + 0x04, 0x05, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x03, 0xf5, 0xff, 0x16, 0x0d, + 0x08, 0x05, 0x03, 0x00, 0xfd, 0xf6, 0xfa, 0x05, 0x06, 0x04, 0xfe, 0xf7, + 0xf7, 0xf7, 0xf6, 0xf5, 0xf5, 0xfc, 0x06, 0x01, 0x01, 0x05, 0x05, 0xfd, + 0xfa, 0xff, 0x04, 0x02, 0x08, 0x11, 0x08, 0x08, 0x0f, 0x15, 0x0b, 0x0a, + 0x08, 0x09, 0x0b, 0x06, 0x04, 0x05, 0x08, 0x07, 0x08, 0x0d, 0x15, 0x0b, + 0x08, 0x0a, 0x09, 0x07, 0x00, 0xfe, 0x00, 0x06, 0x0b, 0x05, 0xff, 0xfc, + 0xfc, 0xf5, 0xea, 0xe9, 0xee, 0xf7, 0xfa, 0xf7, 0xf6, 0xfd, 0x00, 0xfa, + 0xfa, 0x00, 0x00, 0x00, 0x08, 0x10, 0x10, 0x11, 0x0b, 0x06, 0xfe, 0x00, + 0x02, 0x01, 0xff, 0xfd, 0xfe, 0x02, 0x0f, 0x0d, 0x0b, 0x11, 0x18, 0x0f, + 0x08, 0x08, 0x08, 0x06, 0x05, 0x06, 0x02, 0x02, 0x06, 0x06, 0x02, 0x02, + 0x08, 0x03, 0xfe, 0xfe, 0x06, 0x0a, 0x09, 0x09, 0x07, 0x02, 0xfe, 0xfb, + 0xfe, 0x01, 0x00, 0xfe, 0x05, 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0xfa, + 0xfb, 0xfa, 0xf6, 0xf3, 0xf1, 0xf0, 0xf4, 0xf6, 0xf8, 0x02, 0x0d, 0x04, + 0xff, 0xfd, 0x03, 0x0d, 0x04, 0x00, 0x07, 0x06, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x10, 0x0f, 0x12, 0x16, 0x10, 0x06, + 0x06, 0x08, 0x0c, 0x0c, 0x1a, 0x1c, 0x11, 0x0f, 0x0f, 0x0c, 0x0a, 0x07, + 0x03, 0x01, 0x04, 0x06, 0x02, 0x02, 0x00, 0xfc, 0xfc, 0x04, 0x0e, 0x01, + 0xfa, 0xfc, 0xfa, 0xf7, 0xf6, 0xfa, 0xf2, 0xeb, 0xf0, 0xed, 0xe9, 0xf1, + 0xf8, 0xef, 0xee, 0xf0, 0xf1, 0xf8, 0x00, 0xfe, 0xfe, 0x03, 0x04, 0x07, + 0x0a, 0x06, 0x02, 0x03, 0x15, 0x1b, 0x1e, 0x1c, 0x15, 0x0c, 0x12, 0x1b, + 0x12, 0x0f, 0x10, 0x0d, 0x0d, 0x0f, 0x0b, 0x07, 0x07, 0x15, 0x14, 0x04, + 0x01, 0x04, 0x02, 0x00, 0xfe, 0xfd, 0xfc, 0x00, 0x00, 0xfc, 0xfc, 0xfa, + 0xef, 0xeb, 0xf4, 0xf8, 0xf7, 0xfa, 0xfe, 0xfe, 0x04, 0x0e, 0x0a, 0x0a, + 0x04, 0x00, 0x00, 0x03, 0x14, 0x12, 0x0d, 0x0d, 0x0a, 0x07, 0x04, 0x01, + 0xfe, 0xfe, 0x00, 0x05, 0x02, 0xfc, 0xfa, 0x00, 0x04, 0x0d, 0x08, 0xfe, + 0x00, 0x04, 0x01, 0xf9, 0xf3, 0xf7, 0x01, 0x01, 0xfe, 0xfc, 0xfc, 0xfa, + 0xf5, 0xf4, 0xf6, 0xfc, 0x00, 0x04, 0x0e, 0x0b, 0x04, 0x02, 0x06, 0x06, + 0x00, 0xfc, 0x00, 0x08, 0x1b, 0x1f, 0x22, 0x15, 0x10, 0x0f, 0x0d, 0x08, + 0x08, 0x0d, 0x0e, 0x0e, 0x0b, 0x0c, 0x0a, 0x09, 0x08, 0x10, 0x08, 0x03, + 0x0c, 0x07, 0xf8, 0xf6, 0x00, 0x00, 0xfc, 0xfc, 0xfd, 0xfc, 0xf8, 0xf2, + 0xeb, 0xec, 0xee, 0xee, 0xee, 0xf6, 0xfe, 0xf9, 0xfa, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0xfc, 0x03, 0x11, 0x0b, 0x0a, 0x08, 0x08, 0x01, 0xfd, 0xfe, + 0xfd, 0x00, 0x0e, 0x11, 0x08, 0x09, 0x0c, 0x0a, 0x10, 0x14, 0x0c, 0x02, + 0x04, 0x0a, 0x0a, 0x06, 0x04, 0x00, 0x00, 0x08, 0x0b, 0x06, 0x00, 0xff, + 0x01, 0x0a, 0x08, 0x06, 0x08, 0x10, 0x14, 0x0e, 0x08, 0x04, 0x03, 0xfe, + 0xff, 0x00, 0x00, 0x12, 0x14, 0x07, 0x05, 0x06, 0x04, 0x00, 0xfc, 0xfa, + 0xfa, 0xfa, 0xf4, 0xea, 0xe9, 0xee, 0xec, 0xec, 0xfe, 0x00, 0xf8, 0x04, + 0x07, 0x02, 0xfe, 0xfa, 0xfc, 0x01, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, + 0x02, 0x01, 0x00, 0x02, 0x04, 0x04, 0x10, 0x15, 0x12, 0x16, 0x10, 0x08, + 0x08, 0x0c, 0x16, 0x25, 0x19, 0x0d, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x04, + 0x05, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xfc, 0xf6, + 0xf0, 0xf4, 0xf7, 0xf6, 0xf3, 0xf2, 0xf4, 0xfa, 0x04, 0x00, 0xfb, 0xf6, + 0xf4, 0xf4, 0xf2, 0xf2, 0xf8, 0xfd, 0x06, 0x0e, 0x10, 0x0c, 0x06, 0x00, + 0x00, 0x03, 0x0a, 0x12, 0x0c, 0x14, 0x1c, 0x15, 0x0e, 0x10, 0x10, 0x12, + 0x12, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x05, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x00, 0xfe, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf4, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf6, 0x00, 0x0a, 0x0a, 0x0a, 0x0b, 0x0c, 0x05, 0x00, + 0x00, 0x04, 0x14, 0x1a, 0x16, 0x10, 0x0c, 0x08, 0x07, 0x05, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x06, 0x16, 0x10, 0x0b, 0xff, 0xf7, + 0xf6, 0xfc, 0xf8, 0xf9, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x02, 0x02, 0x02, + 0xfd, 0xf9, 0xfb, 0x00, 0xf8, 0xec, 0xf6, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x02, 0x16, 0x29, 0x20, 0x18, 0x12, 0x0e, 0x0c, 0x08, 0x0a, 0x0d, 0x0b, + 0x0a, 0x0b, 0x0a, 0x04, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x06, 0x04, 0x00, 0xff, 0x00, 0xf8, 0xf6, 0xf6, 0xf3, 0xf0, 0xec, + 0xee, 0xf0, 0xf4, 0xf8, 0xf6, 0xf6, 0x00, 0x08, 0x08, 0x01, 0xfc, 0xfd, + 0xfe, 0x0a, 0x12, 0x0a, 0x02, 0x07, 0x08, 0x06, 0x08, 0x12, 0x1c, 0x14, + 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x07, 0x13, 0x12, 0x10, 0x0a, 0x0a, 0x0c, + 0x08, 0x06, 0x04, 0x00, 0x00, 0xf8, 0xf0, 0x04, 0x0e, 0x0b, 0x04, 0x00, + 0x00, 0x03, 0x04, 0x00, 0xff, 0xfa, 0x00, 0x03, 0x02, 0x00, 0x00, 0xfe, + 0x02, 0x14, 0x10, 0x0a, 0x06, 0x02, 0x00, 0xfe, 0xfc, 0xfa, 0xf4, 0xee, + 0xe8, 0xea, 0xed, 0xec, 0xf2, 0x02, 0x08, 0x0b, 0x00, 0xfc, 0xff, 0x00, + 0xff, 0xff, 0x02, 0x05, 0x04, 0x01, 0x05, 0x0c, 0x0c, 0x04, 0x00, 0xff, + 0x00, 0x02, 0x04, 0x04, 0x0c, 0x0e, 0x1a, 0x1e, 0x17, 0x16, 0x12, 0x10, + 0x18, 0x23, 0x14, 0x0e, 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x06, 0x08, + 0x08, 0x04, 0xfc, 0xf8, 0x00, 0x04, 0xf8, 0xea, 0xe9, 0xec, 0xf3, 0xf4, + 0xf2, 0xf6, 0xf8, 0x05, 0x01, 0xfa, 0xfa, 0xfa, 0xf6, 0xf2, 0xf0, 0xf0, + 0xf0, 0xf6, 0xf8, 0xfc, 0x00, 0xff, 0x00, 0xfe, 0x00, 0x05, 0x04, 0x02, + 0x15, 0x1f, 0x24, 0x1c, 0x16, 0x16, 0x12, 0x10, 0x0e, 0x0e, 0x0a, 0x04, + 0x02, 0x00, 0xfe, 0x04, 0x12, 0x0a, 0x08, 0x06, 0x02, 0x04, 0x06, 0x02, + 0x00, 0x00, 0xfc, 0xfc, 0xfa, 0xf9, 0xf5, 0xf5, 0xfd, 0xfb, 0xf9, 0x04, + 0x0f, 0x07, 0x01, 0x03, 0x04, 0x01, 0x05, 0x05, 0x03, 0x05, 0x05, 0x12, + 0x23, 0x1d, 0x11, 0x04, 0x01, 0x03, 0x02, 0xf5, 0xfd, 0x01, 0x07, 0x0b, + 0x00, 0xf9, 0xfe, 0x0d, 0x05, 0xfb, 0xf9, 0xf5, 0xf5, 0xfb, 0xfb, 0xf7, + 0xfd, 0x07, 0x02, 0xff, 0xfc, 0xfd, 0x01, 0x00, 0xfd, 0xf9, 0xf9, 0xf6, + 0xf1, 0xed, 0xf1, 0xef, 0xf7, 0x01, 0x09, 0x09, 0x17, 0x19, 0x15, 0x24, + 0x21, 0x17, 0x11, 0x0d, 0x0c, 0x0b, 0x0d, 0x12, 0x13, 0x0f, 0x0b, 0x03, + 0x00, 0x00, 0xf5, 0xf9, 0xf5, 0xf1, 0xf1, 0xf5, 0xfb, 0xfb, 0xf7, 0xf7, + 0xfd, 0xfb, 0xf1, 0xf5, 0xfb, 0xfd, 0x05, 0x13, 0x19, 0x17, 0x13, 0x11, + 0x11, 0x17, 0x1f, 0x23, 0x23, 0x23, 0x21, 0x23, 0x21, 0x17, 0x09, 0x00, + 0xfb, 0xf1, 0xeb, 0xef, 0xef, 0xed, 0xe7, 0xe5, 0xeb, 0xf7, 0xf9, 0xf7, + 0xfb, 0xf9, 0xf5, 0xf9, 0xf9, 0xf8, 0xfd, 0x09, 0x0d, 0x07, 0x03, 0x03, + 0x00, 0x03, 0x0b, 0x0f, 0x07, 0x00, 0xfd, 0xf1, 0xeb, 0xf3, 0xfd, 0x09, + 0x0b, 0x05, 0x07, 0x18, 0x20, 0x1d, 0x1c, 0x21, 0x20, 0x17, 0x13, 0x13, + 0x0d, 0x05, 0xff, 0xf7, 0xf1, 0xf7, 0x02, 0x09, 0x08, 0x00, 0xf3, 0xed, + 0xed, 0xee, 0xf3, 0xfa, 0x01, 0x05, 0x00, 0xf5, 0xfb, 0x04, 0x03, 0xfd, + 0xf9, 0xf3, 0xf4, 0xfa, 0xf9, 0xf5, 0xfe, 0x08, 0x06, 0x00, 0x00, 0x02, + 0x01, 0x07, 0x0e, 0x0a, 0x08, 0x12, 0x1c, 0x1a, 0x16, 0x12, 0x0e, 0x0e, + 0x0b, 0x06, 0x10, 0x1d, 0x1c, 0x0d, 0x02, 0xfd, 0xfe, 0x00, 0xff, 0xf7, + 0xea, 0xe8, 0xef, 0xf0, 0xec, 0xec, 0xf6, 0x00, 0x02, 0x02, 0xfe, 0xfc, + 0xf8, 0xf6, 0xf8, 0xfc, 0x06, 0x10, 0x12, 0x0c, 0x0e, 0x14, 0x12, 0x10, + 0x0b, 0x04, 0x08, 0x0c, 0x04, 0xfa, 0xf0, 0xf2, 0xf7, 0xfc, 0xff, 0x00, + 0x00, 0x07, 0x10, 0x0c, 0x04, 0x08, 0x10, 0x0e, 0x0a, 0x08, 0x08, 0x06, + 0x00, 0xfc, 0xfe, 0x04, 0x08, 0x0e, 0x0c, 0x00, 0xf9, 0xf6, 0xf4, 0xf6, + 0xfa, 0x02, 0x0c, 0x0e, 0x04, 0x00, 0x0a, 0x16, 0x1a, 0x10, 0xff, 0xf4, + 0xf0, 0xf6, 0xf8, 0xf3, 0xf2, 0xf6, 0xf4, 0xf0, 0xf6, 0xfd, 0xfa, 0xf6, + 0xf4, 0xf0, 0xfa, 0x0c, 0x1a, 0x1c, 0x16, 0x0e, 0x0e, 0x10, 0x11, 0x13, + 0x16, 0x21, 0x28, 0x1c, 0x04, 0xfd, 0xff, 0x05, 0x07, 0x06, 0x00, 0xf5, + 0xef, 0xf6, 0xfc, 0xfe, 0x00, 0x08, 0x08, 0xfe, 0xfe, 0x00, 0xfc, 0xf6, + 0xf2, 0xec, 0xf5, 0xfe, 0x00, 0x02, 0x07, 0x09, 0x08, 0x00, 0xf7, 0xf4, + 0xfa, 0x02, 0x02, 0xf6, 0xf0, 0xf3, 0xfb, 0x04, 0x0d, 0x0e, 0x0a, 0x08, + 0x09, 0x0a, 0x08, 0x0a, 0x16, 0x1c, 0x18, 0x10, 0x12, 0x0e, 0x08, 0x0a, + 0x11, 0x18, 0x20, 0x1e, 0x0c, 0x00, 0xfb, 0xf7, 0xed, 0xea, 0xee, 0xee, + 0xf2, 0xfc, 0xfe, 0xf9, 0xfa, 0x00, 0xff, 0xfc, 0xfa, 0xf8, 0xf2, 0xf2, + 0xf7, 0xf5, 0xf4, 0xf9, 0xfd, 0xfe, 0x00, 0x04, 0x08, 0x00, 0xf4, 0xf0, + 0xfa, 0x0e, 0x21, 0x25, 0x20, 0x18, 0x15, 0x14, 0x1c, 0x28, 0x28, 0x25, + 0x21, 0x19, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf8, 0xef, 0xe6, 0xef, + 0xfb, 0xf7, 0xf5, 0xf4, 0xf1, 0xf4, 0xfa, 0xfe, 0xfa, 0xf4, 0xf0, 0xf0, + 0xf6, 0x00, 0x06, 0x0a, 0x0a, 0x0a, 0x02, 0xfc, 0xfd, 0xff, 0xfe, 0x02, + 0x06, 0x00, 0xfb, 0x01, 0x05, 0x17, 0x26, 0x29, 0x26, 0x14, 0x04, 0x03, + 0x06, 0x04, 0x03, 0x08, 0x0a, 0x07, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x03, 0x08, 0x0a, 0x06, 0xff, 0xfa, 0xf2, 0xed, 0xf4, 0xf6, 0xf8, 0x01, + 0x06, 0x04, 0x05, 0x03, 0xfb, 0xfd, 0x01, 0x01, 0xff, 0xf7, 0xf9, 0x00, + 0xfe, 0xfa, 0x00, 0x0c, 0x12, 0x0c, 0x04, 0xfe, 0xf8, 0xf2, 0xf3, 0x00, + 0x0c, 0x10, 0x14, 0x0e, 0x0a, 0x14, 0x17, 0x1b, 0x1c, 0x14, 0x06, 0x08, + 0x0a, 0x04, 0x01, 0x01, 0x05, 0x09, 0x01, 0xfb, 0xf7, 0xf4, 0xf9, 0xfe, + 0xf4, 0xee, 0xf6, 0x00, 0x03, 0x03, 0xfe, 0xfa, 0xfb, 0xfa, 0x00, 0x12, + 0x1c, 0x1f, 0x1c, 0x0c, 0x00, 0xf9, 0xf5, 0xf0, 0xec, 0xea, 0xf0, 0xf4, + 0xf0, 0xf2, 0xff, 0x0b, 0x12, 0x13, 0x0d, 0x0c, 0x06, 0x06, 0x0a, 0x0c, + 0x04, 0x06, 0x14, 0x15, 0x12, 0x11, 0x0d, 0x0b, 0x0a, 0x03, 0x02, 0x0c, + 0x14, 0x10, 0x00, 0xfb, 0x00, 0xfe, 0xfa, 0xfc, 0x02, 0x06, 0x06, 0x03, + 0x01, 0xfd, 0xf7, 0xf2, 0xf0, 0xf2, 0xec, 0xec, 0xf2, 0xf5, 0xfb, 0xfa, + 0xf8, 0xff, 0x05, 0xff, 0xfa, 0xfd, 0xfc, 0xf7, 0xf4, 0x00, 0x15, 0x1c, + 0x17, 0x10, 0x11, 0x14, 0x19, 0x19, 0x17, 0x15, 0x13, 0x0d, 0x0b, 0x0b, + 0x06, 0x08, 0x10, 0x15, 0x15, 0x13, 0x10, 0x0e, 0x0a, 0xff, 0xef, 0xe6, + 0xe8, 0xe9, 0xea, 0xf0, 0xf7, 0xf3, 0xeb, 0xe7, 0xed, 0xfb, 0x04, 0x02, + 0x04, 0x04, 0x00, 0xfd, 0xfd, 0xf8, 0xf0, 0xf3, 0xf6, 0xf8, 0xfe, 0x04, + 0x09, 0x16, 0x1d, 0x1a, 0x11, 0x13, 0x16, 0x0f, 0x07, 0x0d, 0x12, 0x13, + 0x16, 0x1b, 0x1f, 0x1b, 0x17, 0x0e, 0x02, 0xfa, 0xfc, 0x02, 0x02, 0xfe, + 0xf6, 0xf3, 0xf5, 0xfd, 0xff, 0xf9, 0xf7, 0xfa, 0xf8, 0xf4, 0xf8, 0xfe, + 0xfb, 0xf1, 0xef, 0xf7, 0xf9, 0xfb, 0xfd, 0xfc, 0xfa, 0xfa, 0xf8, 0xfa, + 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0xfc, 0x08, 0x1c, 0x29, 0x29, 0x25, + 0x21, 0x21, 0x21, 0x19, 0x0c, 0x05, 0x00, 0xf2, 0xec, 0xf8, 0x03, 0x03, + 0x01, 0x04, 0x06, 0x00, 0xfe, 0x02, 0x00, 0xfc, 0xf7, 0xf5, 0xf3, 0xef, + 0xf1, 0xf4, 0xfc, 0x04, 0xfe, 0xf4, 0xf4, 0x00, 0x0a, 0x0a, 0x07, 0x04, + 0xfe, 0xfd, 0x01, 0x01, 0xff, 0xfc, 0xf6, 0xf6, 0xff, 0x0b, 0x14, 0x14, + 0x12, 0x09, 0x03, 0x04, 0x04, 0x00, 0x00, 0x02, 0x0b, 0x12, 0x10, 0x12, + 0x12, 0x11, 0x12, 0x0f, 0x03, 0xfd, 0xfe, 0x01, 0x04, 0x08, 0x02, 0xfa, + 0xfc, 0x00, 0x02, 0xff, 0xfc, 0xf2, 0xee, 0xf0, 0xfa, 0x02, 0x02, 0xfc, + 0xf8, 0xf9, 0x02, 0x0c, 0x0c, 0x0d, 0x0c, 0x03, 0xfc, 0xf4, 0xf2, 0xf0, + 0xea, 0xec, 0xf7, 0xfd, 0x00, 0x01, 0x09, 0x13, 0x15, 0x12, 0x0c, 0x12, + 0x19, 0x19, 0x17, 0x12, 0x05, 0xf9, 0xf6, 0xfd, 0x0b, 0x14, 0x14, 0x10, + 0x0e, 0x0c, 0x0f, 0x0d, 0x07, 0x00, 0xfa, 0xfa, 0xfd, 0x00, 0x00, 0xfe, + 0xfc, 0x02, 0x00, 0xfc, 0xf4, 0xf4, 0xf8, 0xf8, 0xf8, 0xf2, 0xec, 0xee, + 0xf3, 0xf7, 0xfd, 0xf9, 0xee, 0xec, 0xf4, 0x00, 0x10, 0x1a, 0x14, 0x07, + 0x05, 0x09, 0x0e, 0x12, 0x15, 0x13, 0x10, 0x0e, 0x11, 0x14, 0x15, 0x13, + 0x11, 0x11, 0x10, 0x0a, 0x06, 0x0c, 0x0c, 0x0c, 0x0e, 0x0a, 0x06, 0x0a, + 0x0e, 0x0b, 0x01, 0xf0, 0xda, 0xd2, 0xd8, 0xe0, 0xed, 0xf6, 0xf2, 0xf0, + 0xf0, 0xf4, 0xfa, 0x00, 0x02, 0x00, 0xf9, 0xf9, 0xfc, 0xfe, 0xfa, 0xf8, + 0xff, 0x09, 0x10, 0x11, 0x16, 0x1b, 0x1c, 0x1c, 0x1c, 0x1a, 0x12, 0x13, + 0x19, 0x16, 0x0f, 0x05, 0x01, 0x03, 0x05, 0x0a, 0x12, 0x12, 0x0c, 0x03, + 0xfd, 0xfc, 0xfd, 0xf8, 0xf7, 0xf3, 0xf3, 0xf8, 0xfc, 0xfc, 0xf1, 0xf1, + 0xfa, 0xfe, 0xfe, 0xfe, 0xf7, 0xf2, 0xf5, 0xf4, 0xf7, 0xfc, 0xfd, 0xfe, + 0xfe, 0xf9, 0xf2, 0xf3, 0xf8, 0x00, 0x07, 0x12, 0x1c, 0x1a, 0x11, 0x10, + 0x11, 0x15, 0x1c, 0x24, 0x20, 0x16, 0x12, 0x15, 0x18, 0x0c, 0xfa, 0xf8, + 0xfb, 0xfb, 0x03, 0x0a, 0x04, 0xfe, 0xfb, 0xf8, 0xfd, 0x02, 0x06, 0x08, + 0x04, 0xf8, 0xeb, 0xe2, 0xe2, 0xe4, 0xea, 0xf4, 0x01, 0x03, 0xfe, 0xff, + 0x02, 0x06, 0x0c, 0x0a, 0xfd, 0xf6, 0xfa, 0x03, 0x07, 0x06, 0x07, 0x0d, + 0x0f, 0x10, 0x15, 0x13, 0x0e, 0x0a, 0x05, 0x06, 0x08, 0x07, 0x09, 0x0a, + 0x04, 0xfa, 0xfd, 0x02, 0xfe, 0xff, 0x06, 0x17, 0x1b, 0x0e, 0x00, 0xfc, + 0xfc, 0x00, 0x08, 0x0c, 0x02, 0xfe, 0x00, 0x00, 0xfe, 0xf9, 0xf7, 0xf8, + 0xfe, 0x03, 0x02, 0xfc, 0xfc, 0xfa, 0xf8, 0xf6, 0x00, 0x02, 0xfe, 0xf8, + 0xf3, 0xf5, 0xf9, 0xf6, 0xef, 0xef, 0xfa, 0x08, 0x0f, 0x0c, 0x07, 0x06, + 0x0a, 0x10, 0x1e, 0x20, 0x16, 0x14, 0x18, 0x17, 0x0f, 0x06, 0x07, 0x0d, + 0x11, 0x0c, 0x0d, 0x0d, 0x08, 0x04, 0x05, 0x0e, 0x0d, 0x0b, 0x04, 0xf6, + 0xed, 0xef, 0xef, 0xe6, 0xe2, 0xeb, 0xf4, 0xf7, 0xfc, 0xfa, 0xf4, 0xf6, + 0xf8, 0xf8, 0xf7, 0xf2, 0xef, 0xf8, 0xfd, 0xfd, 0x01, 0x07, 0x0a, 0x14, + 0x1b, 0x1b, 0x17, 0x12, 0x07, 0x01, 0x08, 0x14, 0x1a, 0x13, 0x09, 0x03, + 0x05, 0x0a, 0x0c, 0x05, 0x04, 0x0a, 0x15, 0x18, 0x0f, 0x05, 0x04, 0x06, + 0x04, 0x08, 0x11, 0x0b, 0xfe, 0xff, 0x01, 0xf7, 0xed, 0xec, 0xea, 0xe8, + 0xec, 0xf3, 0xf7, 0xf1, 0xed, 0xee, 0xf1, 0xf5, 0xfc, 0xf8, 0xf5, 0xfc, + 0x01, 0x00, 0xfc, 0xfb, 0x02, 0x09, 0x10, 0x12, 0x11, 0x14, 0x16, 0x1c, + 0x23, 0x27, 0x28, 0x20, 0x17, 0x14, 0x0f, 0x10, 0x12, 0x0e, 0x10, 0x11, + 0x09, 0x02, 0xff, 0xfa, 0xf7, 0xfc, 0x00, 0xfe, 0xf1, 0xec, 0xf0, 0xee, + 0xe7, 0xdd, 0xd8, 0xda, 0xe5, 0xf6, 0x02, 0x04, 0x02, 0x00, 0xfa, 0xf5, + 0xfa, 0x04, 0x03, 0xff, 0x06, 0x0e, 0x10, 0x15, 0x17, 0x18, 0x1a, 0x1b, + 0x18, 0x11, 0x0a, 0x0b, 0x0e, 0x15, 0x14, 0x09, 0x01, 0x01, 0x02, 0x03, + 0x00, 0x00, 0xfe, 0xff, 0xfa, 0xfa, 0x02, 0x02, 0x00, 0xfd, 0xff, 0x01, + 0x09, 0x12, 0x10, 0x09, 0x07, 0x03, 0xfb, 0xee, 0xef, 0xfd, 0xff, 0xf9, + 0xf9, 0xf6, 0xf5, 0xfb, 0x01, 0x01, 0xf9, 0xf5, 0xfa, 0x04, 0x03, 0xff, + 0x01, 0x00, 0xfe, 0xff, 0x03, 0x0b, 0x0d, 0x09, 0x0a, 0x0b, 0x11, 0x1a, + 0x1d, 0x14, 0x0c, 0x0d, 0x0f, 0x0d, 0x08, 0x06, 0x0e, 0x14, 0x10, 0x0b, + 0x07, 0x05, 0x02, 0x06, 0x03, 0xfd, 0xfa, 0xf9, 0xf8, 0xf8, 0xf7, 0xf2, + 0xe8, 0xe6, 0xeb, 0xf0, 0xf9, 0x04, 0x06, 0xfe, 0x00, 0x00, 0xfa, 0xfc, + 0xfd, 0xfc, 0xfe, 0x07, 0x0e, 0x06, 0x06, 0x13, 0x1c, 0x14, 0x05, 0xfd, + 0xfc, 0xfe, 0x01, 0x0a, 0x11, 0x0b, 0x02, 0x02, 0x0b, 0x0f, 0x0c, 0x08, + 0x01, 0xff, 0x05, 0x07, 0x07, 0x0a, 0x04, 0x02, 0x06, 0x0f, 0x12, 0x13, + 0x18, 0x18, 0x14, 0x0d, 0x00, 0xef, 0xef, 0xf9, 0xf7, 0xee, 0xf0, 0xf4, + 0xf0, 0xee, 0xf0, 0xf1, 0xed, 0xe8, 0xe4, 0xed, 0xff, 0x02, 0xfa, 0xf9, + 0xf6, 0xf6, 0xfa, 0x02, 0x0a, 0x0e, 0x14, 0x18, 0x1d, 0x1f, 0x1f, 0x1d, + 0x1a, 0x1a, 0x18, 0x18, 0x1b, 0x1d, 0x23, 0x26, 0x1c, 0x11, 0x0b, 0x04, + 0xfe, 0x00, 0x06, 0x01, 0xf5, 0xec, 0xea, 0xec, 0xee, 0xe6, 0xda, 0xd3, + 0xdb, 0xe4, 0xed, 0xf1, 0xf3, 0xf1, 0xf1, 0xf6, 0xf6, 0xf9, 0xff, 0x04, + 0x10, 0x19, 0x1b, 0x17, 0x15, 0x19, 0x1d, 0x1d, 0x15, 0x0a, 0x06, 0x02, + 0x05, 0x0d, 0x11, 0x0c, 0x06, 0x08, 0x0e, 0x13, 0x13, 0x0f, 0x09, 0xff, + 0xfb, 0xfb, 0xf8, 0xfb, 0x02, 0x01, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x0f, + 0x0b, 0x07, 0xfb, 0xf1, 0xf0, 0xf5, 0xf5, 0xef, 0xeb, 0xec, 0xf2, 0xf7, + 0xfd, 0xfe, 0xf8, 0xf1, 0xf2, 0xf6, 0xfb, 0x01, 0x05, 0x0a, 0x0b, 0x09, + 0x0b, 0x0d, 0x0d, 0x0d, 0x11, 0x14, 0x17, 0x1e, 0x1a, 0x16, 0x14, 0x12, + 0x12, 0x0d, 0x03, 0x06, 0x11, 0x16, 0x16, 0x10, 0x0a, 0x02, 0xf6, 0xee, + 0xf0, 0xef, 0xf0, 0xf9, 0xfc, 0xfb, 0xf8, 0xf9, 0xf5, 0xec, 0xe3, 0xe2, + 0xea, 0xf3, 0xf3, 0xf7, 0xfc, 0x01, 0x01, 0xfd, 0xf9, 0x04, 0x19, 0x21, + 0x24, 0x1d, 0x1d, 0x23, 0x23, 0x14, 0x01, 0xfc, 0xfc, 0xfe, 0xfe, 0x04, + 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x02, 0xfe, 0xfb, 0xfc, + 0xff, 0xfa, 0xf0, 0xfa, 0x0a, 0x11, 0x0f, 0x0f, 0x16, 0x1c, 0x1e, 0x13, + 0x01, 0xfc, 0x06, 0x0b, 0x06, 0x00, 0x00, 0x02, 0xfd, 0xf5, 0xf2, 0xf4, + 0xf3, 0xef, 0xf0, 0xea, 0xea, 0xef, 0xf5, 0xf3, 0xee, 0xf1, 0xf9, 0xfb, + 0xff, 0x02, 0x06, 0x0d, 0x12, 0x09, 0x04, 0x10, 0x1a, 0x22, 0x28, 0x2b, + 0x22, 0x20, 0x26, 0x23, 0x1a, 0x1b, 0x18, 0x0b, 0xff, 0xfa, 0xfa, 0xf8, + 0xf7, 0xf5, 0xf4, 0xfa, 0xfd, 0xfa, 0xf6, 0xf8, 0xf5, 0xed, 0xe4, 0xd8, + 0xd4, 0xdf, 0xea, 0xf8, 0xfc, 0xfb, 0xfe, 0x01, 0x06, 0x0e, 0x17, 0x1b, + 0x17, 0x18, 0x19, 0x10, 0x0d, 0x08, 0xff, 0xf6, 0xf7, 0xff, 0x03, 0x07, + 0x0d, 0x10, 0x13, 0x10, 0x0d, 0x02, 0x03, 0x12, 0x12, 0x0e, 0x0c, 0x0d, + 0x0d, 0x0b, 0x0a, 0x07, 0x09, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x02, 0xf7, + 0xf0, 0xee, 0xec, 0xeb, 0xf2, 0xf3, 0xee, 0xef, 0xf1, 0xe8, 0xe7, 0xe6, + 0xe9, 0xf6, 0xfb, 0xfc, 0x00, 0x09, 0x14, 0x11, 0x07, 0x00, 0x02, 0x05, + 0x07, 0x0b, 0x10, 0x16, 0x19, 0x16, 0x0f, 0x15, 0x25, 0x2e, 0x2f, 0x2d, + 0x28, 0x26, 0x22, 0x19, 0x0f, 0xff, 0xf0, 0xf0, 0xea, 0xe7, 0xec, 0xf4, + 0xf9, 0xf7, 0xf0, 0xe8, 0xe9, 0xf0, 0xef, 0xe7, 0xe1, 0xde, 0xdd, 0xde, + 0xe2, 0xe8, 0xf5, 0x01, 0x08, 0x0c, 0x12, 0x1f, 0x26, 0x26, 0x29, 0x25, + 0x22, 0x26, 0x21, 0x1a, 0x17, 0x14, 0x0d, 0x06, 0xff, 0xfd, 0x03, 0x02, + 0x02, 0x03, 0xfe, 0xf7, 0xf4, 0xf6, 0xf3, 0xf0, 0xef, 0xf2, 0xf9, 0xfe, + 0xfe, 0x01, 0x04, 0x06, 0x04, 0x00, 0x07, 0x17, 0x18, 0x15, 0x1a, 0x17, + 0x0e, 0x07, 0x01, 0x01, 0xfd, 0xf1, 0xeb, 0xeb, 0xef, 0xf6, 0xf7, 0xf6, + 0xf5, 0xf4, 0xf5, 0xfc, 0x0a, 0x13, 0x0f, 0x03, 0xf9, 0xf7, 0xf9, 0xf8, + 0xfc, 0x01, 0x07, 0x09, 0x0d, 0x15, 0x21, 0x29, 0x28, 0x28, 0x25, 0x1b, + 0x15, 0x15, 0x14, 0x0e, 0xfb, 0xec, 0xe6, 0xe6, 0xee, 0xf4, 0xfc, 0x02, + 0x02, 0xfd, 0xf6, 0xf6, 0xfd, 0xff, 0xfa, 0xf4, 0xef, 0xf2, 0xf7, 0xfd, + 0x02, 0x02, 0x08, 0x0a, 0x03, 0x06, 0x12, 0x15, 0x16, 0x15, 0x0a, 0x03, + 0xfe, 0xff, 0x00, 0xfd, 0xf7, 0xf6, 0xf4, 0xf5, 0xfa, 0xff, 0x05, 0x07, + 0x0b, 0x0b, 0x09, 0x11, 0x19, 0x16, 0x0d, 0x09, 0x0a, 0x0a, 0x05, 0x04, + 0x04, 0x09, 0x0f, 0x07, 0xfe, 0x09, 0x13, 0x15, 0x15, 0x12, 0x0b, 0x0a, + 0x06, 0xfe, 0xf1, 0xe6, 0xdc, 0xda, 0xde, 0xe4, 0xec, 0xf4, 0xf9, 0xfa, + 0xf3, 0xf5, 0xfc, 0x03, 0x03, 0xfd, 0xf8, 0xf7, 0xf7, 0xf8, 0xfa, 0xfd, + 0x00, 0x07, 0x11, 0x15, 0x1e, 0x33, 0x40, 0x3c, 0x37, 0x33, 0x2b, 0x29, + 0x29, 0x22, 0x19, 0x09, 0xfc, 0xf5, 0xf7, 0xfd, 0xf9, 0xf0, 0xec, 0xe8, + 0xe6, 0xe6, 0xe2, 0xdd, 0xd9, 0xd8, 0xd6, 0xd6, 0xd9, 0xe1, 0xe7, 0xf2, + 0xf7, 0xfc, 0x05, 0x0c, 0x14, 0x24, 0x2b, 0x29, 0x29, 0x2b, 0x29, 0x24, + 0x20, 0x1c, 0x0e, 0xff, 0xf4, 0xf8, 0x01, 0x05, 0x02, 0x02, 0x04, 0x07, + 0x08, 0x09, 0x09, 0x07, 0x02, 0x01, 0x02, 0xff, 0xfd, 0xfb, 0xf9, 0xfa, + 0xfa, 0xfa, 0xfe, 0x03, 0x0d, 0x18, 0x1b, 0x15, 0x0c, 0x05, 0x01, 0xfe, + 0xf9, 0xeb, 0xdb, 0xd4, 0xda, 0xe5, 0xef, 0xf7, 0xfd, 0x00, 0xfd, 0xff, + 0x07, 0x09, 0x0f, 0x11, 0x0c, 0x0b, 0x0f, 0x0f, 0x0f, 0x11, 0x0e, 0x0a, + 0x0e, 0x13, 0x18, 0x1d, 0x29, 0x2c, 0x26, 0x18, 0x10, 0x0e, 0x08, 0x02, + 0xfe, 0xf0, 0xe5, 0xdf, 0xe0, 0xe7, 0xee, 0xed, 0xed, 0xf1, 0xf7, 0xfb, + 0xfe, 0x00, 0x01, 0xfd, 0xfc, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xfe, 0xfe, + 0x04, 0x08, 0x10, 0x1b, 0x25, 0x22, 0x1e, 0x1d, 0x1b, 0x17, 0x0b, 0x01, + 0xfd, 0xf7, 0xef, 0xeb, 0xf0, 0xf7, 0xfd, 0xff, 0x00, 0x03, 0x06, 0x08, + 0x0a, 0x08, 0x03, 0xfd, 0xfa, 0xfb, 0xf9, 0xf7, 0xfb, 0xf9, 0xf7, 0xf6, + 0xfc, 0x07, 0x13, 0x1f, 0x1c, 0x19, 0x21, 0x25, 0x21, 0x1b, 0x0e, 0x00, + 0x01, 0xfe, 0xf3, 0xf0, 0xf7, 0xfa, 0xfa, 0xf9, 0xfb, 0xf8, 0xf3, 0xed, + 0xe8, 0xe9, 0xe9, 0xec, 0xed, 0xef, 0xf2, 0xf5, 0xf4, 0xf2, 0xef, 0xf5, + 0x0a, 0x1e, 0x2c, 0x36, 0x39, 0x37, 0x3b, 0x3b, 0x36, 0x28, 0x18, 0x10, + 0x0f, 0x06, 0xfc, 0xfc, 0xfb, 0xef, 0xe7, 0xea, 0xee, 0xf3, 0xf5, 0xf6, + 0xf6, 0xef, 0xe9, 0xe3, 0xe6, 0xeb, 0xf4, 0xf4, 0xec, 0xf0, 0xf7, 0xfd, + 0x13, 0x20, 0x1b, 0x1b, 0x1e, 0x18, 0x15, 0x1c, 0x19, 0x04, 0xf2, 0xec, + 0xee, 0xed, 0xec, 0xf4, 0xfa, 0xff, 0x07, 0x0b, 0x0f, 0x11, 0x0e, 0x0f, + 0x18, 0x1b, 0x13, 0x10, 0x14, 0x13, 0x1a, 0x16, 0x07, 0x00, 0xfc, 0xfb, + 0x0a, 0x14, 0x14, 0x0f, 0x05, 0xfc, 0x01, 0x01, 0xf4, 0xe6, 0xe3, 0xe5, + 0xdf, 0xd9, 0xd6, 0xdd, 0xe3, 0xe9, 0xf4, 0xf9, 0xfe, 0x05, 0x05, 0x06, + 0x11, 0x14, 0x0f, 0x14, 0x15, 0x12, 0x12, 0x12, 0x11, 0x0c, 0x08, 0x13, + 0x23, 0x29, 0x2a, 0x2e, 0x2d, 0x2c, 0x27, 0x15, 0x00, 0xf7, 0xf2, 0xf3, + 0xef, 0xea, 0xe9, 0xe9, 0xea, 0xec, 0xf0, 0xf6, 0xf2, 0xf1, 0xf3, 0xf2, + 0xef, 0xf1, 0xf2, 0xee, 0xe7, 0xe6, 0xe8, 0xed, 0xf5, 0xfe, 0x0f, 0x1d, + 0x22, 0x20, 0x21, 0x22, 0x22, 0x24, 0x21, 0x1a, 0x17, 0x13, 0x0d, 0x0c, + 0x09, 0x07, 0x02, 0xfc, 0xfd, 0x02, 0x06, 0x0b, 0x05, 0xfc, 0xf8, 0xf8, + 0xf4, 0xf3, 0xf4, 0xf5, 0xf6, 0xf2, 0xef, 0xe9, 0xe5, 0xed, 0xf7, 0xfd, + 0xff, 0x0a, 0x17, 0x21, 0x26, 0x24, 0x1f, 0x21, 0x1a, 0x0a, 0x02, 0xff, + 0xff, 0x01, 0xfd, 0xf4, 0xf6, 0xfc, 0xfd, 0xfb, 0xf9, 0xfd, 0xfb, 0xf5, + 0xf4, 0xf3, 0xf8, 0xf9, 0xf6, 0xf5, 0xf3, 0xfa, 0x05, 0x15, 0x1f, 0x20, + 0x24, 0x30, 0x31, 0x28, 0x22, 0x15, 0x0d, 0x0b, 0xff, 0xef, 0xeb, 0xe7, + 0xe2, 0xe4, 0xed, 0xf3, 0xf7, 0xf6, 0xf4, 0xf7, 0x00, 0x07, 0x09, 0x03, + 0xff, 0x05, 0x0d, 0x0b, 0x09, 0x08, 0x0a, 0x13, 0x16, 0x13, 0x12, 0x10, + 0x15, 0x15, 0x0d, 0x04, 0xfb, 0xf4, 0xf5, 0xfa, 0xf8, 0xf2, 0xed, 0xe7, + 0xe2, 0xe3, 0xe9, 0xf3, 0xf7, 0xf9, 0xfb, 0x06, 0x11, 0x16, 0x1a, 0x1d, + 0x24, 0x29, 0x1e, 0x10, 0x0d, 0x10, 0x12, 0x13, 0x0f, 0x06, 0xfd, 0x02, + 0x09, 0x13, 0x18, 0x13, 0x05, 0xff, 0xfe, 0xfa, 0xf2, 0xeb, 0xe7, 0xe2, + 0xdf, 0xe7, 0xf6, 0xfc, 0xfe, 0xfe, 0x00, 0x02, 0xfc, 0xf6, 0xf1, 0xf6, + 0xf8, 0xf3, 0xf2, 0xf2, 0xf2, 0xf4, 0xfe, 0x16, 0x24, 0x22, 0x21, 0x21, + 0x28, 0x34, 0x35, 0x2c, 0x21, 0x1b, 0x19, 0x18, 0x13, 0x0c, 0x05, 0xfc, + 0xfd, 0xfd, 0xf5, 0xef, 0xed, 0xf0, 0xee, 0xeb, 0xf0, 0xef, 0xeb, 0xea, + 0xe8, 0xe6, 0xea, 0xed, 0xee, 0xee, 0xfc, 0x01, 0xff, 0xfd, 0xfc, 0xff, + 0x0b, 0x11, 0x10, 0x10, 0x1a, 0x2a, 0x30, 0x28, 0x19, 0x0e, 0x07, 0x0a, + 0x07, 0x04, 0x09, 0x08, 0x05, 0x05, 0x08, 0x0b, 0x0a, 0x07, 0x03, 0xfe, + 0xf8, 0xf6, 0xf7, 0xf2, 0xef, 0xf7, 0x01, 0xfe, 0xfe, 0x00, 0x03, 0x10, + 0x1c, 0x19, 0x10, 0x07, 0x04, 0x01, 0xf7, 0xf2, 0xee, 0xea, 0xe3, 0xe3, + 0xeb, 0xf9, 0x06, 0x08, 0xfe, 0xfc, 0x02, 0x06, 0x08, 0x06, 0x05, 0x05, + 0x07, 0x0b, 0x0e, 0x14, 0x1e, 0x29, 0x25, 0x20, 0x1f, 0x18, 0x14, 0x18, + 0x17, 0x0e, 0x0b, 0x07, 0x03, 0xff, 0xfd, 0xf4, 0xec, 0xe4, 0xda, 0xd6, + 0xd9, 0xde, 0xe0, 0xde, 0xe1, 0xef, 0xfc, 0xfd, 0x03, 0x10, 0x18, 0x1c, + 0x18, 0x17, 0x1c, 0x24, 0x25, 0x1e, 0x1a, 0x16, 0x14, 0x08, 0x03, 0x08, + 0x08, 0x01, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xfb, 0xf3, 0xe9, 0xe6, 0xed, + 0xf7, 0xf8, 0xfb, 0x08, 0x13, 0x14, 0x0e, 0x0d, 0x0d, 0x07, 0xfa, 0xf2, + 0xf2, 0xf5, 0xfb, 0xfc, 0xf9, 0x00, 0x03, 0x04, 0x07, 0x09, 0x0e, 0x18, + 0x1d, 0x1c, 0x1c, 0x18, 0x14, 0x13, 0x10, 0x07, 0x01, 0x04, 0x05, 0x02, + 0x00, 0x00, 0xff, 0xfa, 0xf0, 0xeb, 0xee, 0xef, 0xec, 0xe6, 0xe5, 0xed, + 0xf3, 0xfa, 0xfd, 0x02, 0x03, 0x02, 0x01, 0x03, 0x06, 0x04, 0x09, 0x13, + 0x15, 0x14, 0x1c, 0x2b, 0x30, 0x29, 0x22, 0x1d, 0x12, 0x06, 0xfc, 0xf7, + 0xf9, 0xfb, 0xfb, 0xf9, 0xfc, 0x01, 0x00, 0xf8, 0xf4, 0xf1, 0xf0, 0xf2, + 0xf8, 0xfe, 0x04, 0x05, 0x07, 0x03, 0xff, 0xfc, 0xfd, 0x01, 0x09, 0x08, + 0x05, 0x09, 0x07, 0x02, 0xfc, 0xfa, 0xfc, 0xf6, 0xf1, 0xeb, 0xef, 0xf9, + 0x03, 0x08, 0x0e, 0x16, 0x1a, 0x1a, 0x16, 0x12, 0x10, 0x0d, 0x0f, 0x13, + 0x12, 0x0f, 0x12, 0x15, 0x12, 0x0a, 0x07, 0x09, 0x04, 0xfd, 0xff, 0x02, + 0x06, 0x05, 0xfd, 0xf7, 0xf5, 0xf9, 0xf6, 0xef, 0xe9, 0xe5, 0xe2, 0xe2, + 0xe1, 0xe2, 0xe7, 0xee, 0xf4, 0xf5, 0xf3, 0xfa, 0x03, 0x0f, 0x1b, 0x22, + 0x2c, 0x35, 0x31, 0x27, 0x21, 0x1e, 0x1f, 0x1c, 0x13, 0x0d, 0x0d, 0x13, + 0x11, 0x09, 0x06, 0x07, 0x05, 0xfd, 0xf4, 0xe8, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe8, 0xf3, 0xfa, 0x03, 0x08, 0x02, 0xfd, 0xfd, 0xf9, 0xf6, 0xfd, 0x00, + 0x07, 0x09, 0x06, 0x05, 0x03, 0x04, 0x01, 0xfd, 0xff, 0x09, 0x13, 0x17, + 0x13, 0x0f, 0x12, 0x16, 0x16, 0x1a, 0x14, 0x07, 0xfe, 0x00, 0x05, 0x06, + 0x0c, 0x10, 0x09, 0x05, 0x03, 0xfb, 0xf8, 0xf7, 0xf5, 0xf7, 0xf8, 0xfa, + 0xfa, 0xf5, 0xf4, 0xf4, 0xf3, 0xf1, 0xee, 0xed, 0xf3, 0xfd, 0x0b, 0x10, + 0x12, 0x17, 0x19, 0x19, 0x20, 0x25, 0x24, 0x18, 0x09, 0x05, 0x04, 0xfd, + 0xff, 0x01, 0x01, 0xfa, 0xef, 0xec, 0xed, 0xef, 0xf3, 0xfd, 0x05, 0x05, + 0x05, 0x04, 0x07, 0x0c, 0x0b, 0x05, 0x06, 0x05, 0x02, 0x07, 0x12, 0x11, + 0x10, 0x0d, 0x09, 0x08, 0x04, 0xfa, 0xee, 0xe4, 0xe2, 0xe7, 0xed, 0xf7, + 0xff, 0x07, 0x0e, 0x0f, 0x0f, 0x0c, 0x07, 0x07, 0x10, 0x1c, 0x1d, 0x21, + 0x24, 0x19, 0x0f, 0x09, 0x02, 0xfb, 0xfb, 0xf9, 0xf4, 0xfc, 0x04, 0x00, + 0xf7, 0xf7, 0xf8, 0xf8, 0xf4, 0xf6, 0xef, 0xe8, 0xe9, 0xed, 0xf4, 0xf8, + 0xfa, 0xfb, 0xfb, 0xfd, 0x01, 0x0b, 0x14, 0x19, 0x1b, 0x1b, 0x20, 0x24, + 0x22, 0x1d, 0x1b, 0x19, 0x12, 0x0b, 0x0a, 0x08, 0x08, 0x0a, 0x05, 0xfd, + 0xfe, 0x04, 0x04, 0x01, 0x00, 0xfe, 0xf1, 0xe7, 0xe8, 0xe6, 0xe7, 0xf2, + 0xf6, 0xf3, 0xee, 0xee, 0xf2, 0xf6, 0xf8, 0xfc, 0xff, 0x07, 0x13, 0x0f, + 0x08, 0x0b, 0x12, 0x0c, 0x03, 0x06, 0x0a, 0x0c, 0x12, 0x1c, 0x1f, 0x1e, + 0x20, 0x1f, 0x1a, 0x17, 0x17, 0x10, 0xff, 0xf2, 0xf1, 0xf3, 0xfb, 0x01, + 0x00, 0xfd, 0xff, 0xfd, 0xfd, 0xfc, 0xfa, 0xfb, 0xfe, 0x01, 0xff, 0xfc, + 0xfa, 0xfb, 0xf2, 0xe6, 0xe1, 0xe8, 0xe9, 0xee, 0xf8, 0x00, 0x0c, 0x15, + 0x16, 0x12, 0x15, 0x1a, 0x1b, 0x19, 0x10, 0x10, 0x17, 0x1a, 0x1b, 0x16, + 0x0c, 0x05, 0x00, 0xfc, 0xff, 0x02, 0x02, 0x01, 0x05, 0x06, 0x02, 0xfc, + 0xf8, 0xf9, 0xf8, 0xf5, 0xff, 0x02, 0xfe, 0x00, 0xff, 0xfd, 0xff, 0x04, + 0x05, 0x09, 0x0b, 0x0a, 0x08, 0xfd, 0xee, 0xea, 0xee, 0xed, 0xee, 0xf6, + 0xfb, 0xfd, 0xff, 0x04, 0x0d, 0x0e, 0x0a, 0x13, 0x1f, 0x28, 0x29, 0x23, + 0x1e, 0x14, 0x08, 0xff, 0x00, 0xfe, 0xff, 0x05, 0x08, 0x0e, 0x0f, 0x0d, + 0x05, 0xfe, 0xfa, 0xf2, 0xe9, 0xdd, 0xd6, 0xe1, 0xec, 0xee, 0xf1, 0xf6, + 0xf5, 0xf5, 0xfb, 0x09, 0x15, 0x15, 0x17, 0x20, 0x25, 0x20, 0x18, 0x14, + 0x17, 0x13, 0x0b, 0x09, 0x0a, 0x09, 0x01, 0xfc, 0xfd, 0xfe, 0xfb, 0xf9, + 0xfa, 0xff, 0x01, 0x03, 0x01, 0xf6, 0xef, 0xf6, 0xfb, 0x00, 0x01, 0xfd, + 0xfa, 0xfb, 0xfe, 0xfc, 0xf9, 0xfa, 0x08, 0x12, 0x13, 0x0d, 0x06, 0x04, + 0xff, 0xfb, 0xff, 0x03, 0x04, 0x06, 0x07, 0x07, 0x0e, 0x18, 0x1d, 0x1e, + 0x1d, 0x1e, 0x20, 0x1c, 0x0d, 0xfe, 0xf9, 0xf6, 0xed, 0xe6, 0xe4, 0xec, + 0xf9, 0xff, 0xfe, 0xfd, 0xfa, 0xfa, 0xfe, 0x00, 0x05, 0x03, 0xff, 0xfa, + 0xf2, 0xf1, 0xf6, 0xf6, 0xf4, 0xf7, 0x00, 0x04, 0x13, 0x1e, 0x1d, 0x1f, + 0x1f, 0x1d, 0x14, 0x06, 0xf5, 0xf6, 0x0b, 0x15, 0x17, 0x17, 0x17, 0x11, + 0x05, 0xfd, 0x01, 0x03, 0x00, 0x01, 0x04, 0x07, 0x09, 0x07, 0xfe, 0xef, + 0xea, 0xed, 0xf6, 0xf3, 0xf2, 0xf7, 0xf7, 0xf7, 0xf7, 0xf3, 0xee, 0xf7, + 0x07, 0x0f, 0x12, 0x10, 0x05, 0x01, 0xfe, 0xf9, 0xf9, 0xff, 0x04, 0x05, + 0x05, 0x09, 0x0f, 0x14, 0x19, 0x1f, 0x27, 0x2a, 0x23, 0x16, 0x09, 0x07, + 0x0c, 0x0b, 0x00, 0xf2, 0xec, 0xf7, 0x02, 0x09, 0x0e, 0x10, 0x0b, 0x07, + 0x02, 0xfb, 0xf5, 0xeb, 0xdf, 0xda, 0xd5, 0xd7, 0xe1, 0xed, 0xf0, 0xf3, + 0xfe, 0x03, 0x04, 0x07, 0x11, 0x1e, 0x28, 0x28, 0x20, 0x0d, 0x00, 0x09, + 0x19, 0x1d, 0x17, 0x13, 0x13, 0x13, 0x0b, 0x09, 0x0e, 0x0e, 0x06, 0x00, + 0xfc, 0xfa, 0xf9, 0xf4, 0xed, 0xef, 0xf6, 0xff, 0x04, 0xff, 0xfa, 0xfc, + 0xfd, 0xfa, 0xf5, 0xf3, 0xf8, 0x06, 0x13, 0x18, 0x10, 0x02, 0xfc, 0xfa, + 0xf9, 0xf8, 0xf6, 0xf7, 0xfc, 0xfc, 0xf9, 0x00, 0x0e, 0x13, 0x13, 0x1b, + 0x27, 0x2a, 0x1f, 0x10, 0x05, 0x02, 0x01, 0xfc, 0xf3, 0xee, 0xf5, 0xff, + 0x06, 0x07, 0x09, 0x0c, 0x0e, 0x0d, 0x08, 0xfb, 0xf0, 0xea, 0xec, 0xf1, + 0xf3, 0xf3, 0xef, 0xf4, 0xfa, 0x00, 0x10, 0x1a, 0x19, 0x17, 0x18, 0x1d, + 0x1c, 0x12, 0x01, 0xf2, 0xea, 0xf1, 0x02, 0x0f, 0x10, 0x11, 0x0e, 0x06, + 0xfb, 0xf8, 0xfd, 0x06, 0x09, 0x06, 0x06, 0x05, 0x01, 0xfd, 0xf9, 0xfd, + 0x02, 0xf9, 0xf5, 0xff, 0x00, 0xff, 0x04, 0x05, 0xfd, 0xf8, 0xfb, 0x00, + 0x0b, 0x0d, 0x07, 0xfd, 0xff, 0x04, 0x07, 0x05, 0x05, 0x06, 0x02, 0xff, + 0x00, 0x06, 0x11, 0x1d, 0x20, 0x28, 0x28, 0x19, 0x0a, 0x03, 0x02, 0x01, + 0xf9, 0xed, 0xe7, 0xeb, 0xef, 0xf5, 0x03, 0x0a, 0x05, 0x01, 0x03, 0x06, + 0x06, 0xfe, 0xf0, 0xe6, 0xe1, 0xe2, 0xe5, 0xee, 0xf9, 0x01, 0x04, 0x09, + 0x0f, 0x13, 0x1f, 0x26, 0x25, 0x22, 0x18, 0x06, 0x00, 0x05, 0x07, 0x09, + 0x13, 0x14, 0x13, 0x13, 0x15, 0x12, 0x12, 0x0e, 0x03, 0xff, 0xfe, 0xfe, + 0xf9, 0xee, 0xea, 0xe8, 0xea, 0xf4, 0xf6, 0xf8, 0xfb, 0xf8, 0xf2, 0xf0, + 0xf1, 0xf4, 0xfa, 0x00, 0x03, 0x07, 0x0f, 0x10, 0x0b, 0x06, 0x03, 0x03, + 0x03, 0x02, 0x02, 0x05, 0x06, 0x08, 0x0d, 0x11, 0x0f, 0x16, 0x23, 0x27, + 0x1b, 0x13, 0x0e, 0x09, 0x06, 0x05, 0x02, 0xfd, 0xf8, 0xf7, 0xf3, 0xf8, + 0x06, 0x0d, 0x09, 0x09, 0x08, 0xff, 0xf8, 0xf4, 0xe8, 0xe1, 0xe0, 0xdf, + 0xde, 0xe5, 0xf0, 0xfb, 0x05, 0x0c, 0x0e, 0x12, 0x17, 0x1e, 0x1d, 0x19, + 0x0d, 0x01, 0xfb, 0xfa, 0xfa, 0x02, 0x15, 0x1d, 0x18, 0x12, 0x0f, 0x0f, + 0x14, 0x15, 0x0e, 0x08, 0x04, 0xff, 0xfd, 0xfc, 0xfc, 0xfe, 0x02, 0xfd, + 0xf6, 0xfa, 0x03, 0x02, 0xff, 0xfd, 0xf6, 0xf1, 0xf6, 0xfa, 0xfa, 0xfd, + 0x01, 0xfe, 0xfa, 0xfc, 0xfe, 0x06, 0x0c, 0x06, 0xf8, 0xf5, 0xf9, 0x00, + 0x06, 0x0f, 0x13, 0x1d, 0x27, 0x25, 0x1b, 0x13, 0x0e, 0x07, 0x00, 0xf9, + 0xf7, 0xfa, 0xff, 0xff, 0xfd, 0x02, 0x0a, 0x0a, 0x07, 0x06, 0x05, 0x01, + 0xfd, 0xf9, 0xec, 0xe6, 0xee, 0xf6, 0xf5, 0xf4, 0xf7, 0x01, 0x0a, 0x0d, + 0x13, 0x1a, 0x1e, 0x1b, 0x14, 0x0e, 0x02, 0xfb, 0xfc, 0xf9, 0xf6, 0xf7, + 0x05, 0x0f, 0x13, 0x10, 0x0e, 0x0e, 0x10, 0x0a, 0x00, 0x00, 0x01, 0xfb, + 0xf6, 0xf3, 0xef, 0xf8, 0x05, 0x05, 0xff, 0xfb, 0xfc, 0xfd, 0xff, 0x02, + 0x00, 0x00, 0x04, 0x04, 0x05, 0x05, 0x07, 0x0b, 0x0b, 0x09, 0x07, 0x07, + 0x0d, 0x0e, 0x05, 0xff, 0x02, 0x03, 0x04, 0x05, 0x0d, 0x1b, 0x1b, 0x14, + 0x0f, 0x08, 0x03, 0x04, 0x05, 0xfd, 0xf2, 0xf0, 0xf2, 0xf4, 0xfb, 0xfe, + 0x03, 0x09, 0x06, 0x02, 0x00, 0xff, 0xfb, 0xf4, 0xe9, 0xe2, 0xe6, 0xee, + 0xf6, 0xfa, 0x02, 0x0c, 0x12, 0x17, 0x1a, 0x1d, 0x1f, 0x1e, 0x17, 0x10, + 0x09, 0x01, 0x03, 0x09, 0x0c, 0x09, 0x0a, 0x0e, 0x0f, 0x0f, 0x12, 0x10, + 0x12, 0x0e, 0xff, 0xfb, 0xfe, 0xf7, 0xf2, 0xed, 0xef, 0xf1, 0xf2, 0xf5, + 0xf9, 0xf9, 0xfb, 0xfc, 0xf8, 0xf7, 0xf4, 0xf7, 0xfd, 0xfd, 0xfd, 0xfd, + 0xff, 0x02, 0x0c, 0x15, 0x12, 0x0c, 0x0a, 0x07, 0x04, 0x07, 0x0d, 0x10, + 0x12, 0x13, 0x1d, 0x25, 0x21, 0x1c, 0x16, 0x11, 0x09, 0x06, 0x03, 0xfe, + 0xf9, 0xfa, 0xf9, 0xf5, 0xf7, 0xf8, 0xf8, 0xff, 0x01, 0xfd, 0xfa, 0xf8, + 0xf5, 0xf3, 0xec, 0xea, 0xea, 0xeb, 0xed, 0xf2, 0xfe, 0x0a, 0x12, 0x18, + 0x1a, 0x17, 0x18, 0x15, 0x0d, 0x07, 0x02, 0xfe, 0xfc, 0xfe, 0x02, 0x06, + 0x0c, 0x14, 0x16, 0x17, 0x17, 0x15, 0x15, 0x15, 0x0b, 0x03, 0x02, 0xff, + 0xfa, 0xfd, 0x03, 0x00, 0xfa, 0xf6, 0xf5, 0xf4, 0xfb, 0xff, 0xfa, 0xf7, + 0xf7, 0xfb, 0xff, 0xfc, 0xfa, 0xfa, 0xfa, 0xfd, 0x00, 0x02, 0x06, 0x08, + 0x0a, 0x08, 0x03, 0x03, 0x03, 0x02, 0x07, 0x0d, 0x11, 0x13, 0x14, 0x16, + 0x16, 0x15, 0x14, 0x0b, 0xff, 0xf8, 0xf5, 0xf9, 0x03, 0x04, 0x01, 0x03, + 0x05, 0x0b, 0x0b, 0x05, 0x00, 0xfe, 0xfb, 0xf4, 0xea, 0xeb, 0xf2, 0xf4, + 0xf6, 0xfa, 0x00, 0x04, 0x07, 0x11, 0x17, 0x15, 0x12, 0x0e, 0x06, 0x07, + 0x05, 0x00, 0xfe, 0xfb, 0xfd, 0xff, 0x00, 0x0d, 0x17, 0x18, 0x12, 0x0d, + 0x0b, 0x08, 0x00, 0xfb, 0xfd, 0xfa, 0xf5, 0xf2, 0xf5, 0xfb, 0xf9, 0xfa, + 0xff, 0x03, 0x05, 0x01, 0xff, 0x03, 0x07, 0x06, 0x04, 0x01, 0x05, 0x09, + 0x08, 0x0d, 0x0f, 0x0a, 0x02, 0x00, 0x07, 0x09, 0x05, 0x03, 0x03, 0x04, + 0x0e, 0x10, 0x0f, 0x0d, 0x0e, 0x0e, 0x07, 0x02, 0x03, 0x00, 0xf9, 0xfa, + 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xfa, 0xf7, 0xf8, 0xfb, 0x00, 0x06, 0x06, + 0x01, 0xfc, 0xf3, 0xed, 0xed, 0xf4, 0x00, 0x0a, 0x13, 0x17, 0x19, 0x1e, + 0x24, 0x20, 0x1a, 0x12, 0x0c, 0x05, 0xfd, 0xfd, 0xfe, 0xfd, 0x01, 0x04, + 0x00, 0x04, 0x0d, 0x10, 0x12, 0x13, 0x11, 0x07, 0xfd, 0xff, 0x03, 0xfd, + 0xf6, 0xf5, 0xf2, 0xef, 0xed, 0xf2, 0xfe, 0x07, 0x03, 0xf7, 0xf1, 0xf5, + 0xf7, 0xfa, 0xfe, 0x01, 0x03, 0x00, 0xfe, 0x05, 0x09, 0x0a, 0x0b, 0x0d, + 0x0f, 0x0e, 0x0f, 0x0f, 0x11, 0x17, 0x17, 0x13, 0x17, 0x1c, 0x1e, 0x18, + 0x13, 0x0d, 0x02, 0xf9, 0xf4, 0xf7, 0xfb, 0xfe, 0xf8, 0xf5, 0xf9, 0xfe, + 0xfa, 0xfa, 0xfd, 0xfe, 0xf8, 0xf3, 0xf1, 0xf1, 0xf0, 0xec, 0xf0, 0xf9, + 0xfc, 0x02, 0x09, 0x0c, 0x0a, 0x0a, 0x10, 0x15, 0x18, 0x1a, 0x15, 0x0a, + 0x02, 0xff, 0xfb, 0xfc, 0x02, 0x0b, 0x14, 0x1a, 0x1c, 0x1a, 0x1a, 0x1b, + 0x17, 0x10, 0x08, 0xfe, 0xf7, 0xf2, 0xf0, 0xf3, 0xf1, 0xef, 0xef, 0xf0, + 0xf4, 0xfd, 0xfe, 0xfc, 0xfe, 0xfc, 0xf9, 0xfd, 0x05, 0x09, 0x06, 0xfe, + 0xfd, 0xff, 0x00, 0x01, 0x08, 0x12, 0x16, 0x0d, 0x01, 0xf9, 0xfe, 0x09, + 0x0d, 0x11, 0x14, 0x0f, 0x0a, 0x0b, 0x0f, 0x09, 0xff, 0x00, 0x02, 0xff, + 0x00, 0x06, 0x06, 0x07, 0x04, 0xfe, 0xff, 0x09, 0x10, 0x09, 0xfc, 0xf7, + 0xf7, 0xf1, 0xe9, 0xe8, 0xf6, 0xff, 0xff, 0x02, 0x08, 0x0c, 0x12, 0x15, + 0x14, 0x12, 0x0a, 0x01, 0xfe, 0xfe, 0xfb, 0xf9, 0xfa, 0x00, 0x00, 0xfe, + 0x06, 0x0f, 0x0f, 0x09, 0x07, 0x0c, 0x14, 0x18, 0x13, 0x03, 0xfc, 0xf9, + 0xf4, 0xee, 0xef, 0xf8, 0x04, 0x09, 0x08, 0x04, 0x02, 0x04, 0x07, 0x08, + 0x06, 0x04, 0xfe, 0xf9, 0xf9, 0xfa, 0xfd, 0x01, 0x03, 0x00, 0xff, 0x07, + 0x11, 0x13, 0x0b, 0x04, 0x09, 0x0f, 0x13, 0x17, 0x14, 0x10, 0x0a, 0x09, + 0x04, 0xfe, 0xfc, 0x02, 0x08, 0x00, 0xf2, 0xf0, 0xef, 0xf0, 0xf7, 0xfc, + 0x00, 0x02, 0xff, 0xf9, 0xf9, 0xfb, 0xf7, 0xf5, 0xf5, 0xf6, 0xfe, 0x06, + 0x11, 0x16, 0x16, 0x15, 0x1a, 0x20, 0x23, 0x1d, 0x12, 0x05, 0xfe, 0xfb, + 0xf6, 0xf6, 0xfb, 0x03, 0x04, 0x02, 0x06, 0x10, 0x12, 0x12, 0x16, 0x13, + 0x0b, 0x05, 0xfb, 0xf3, 0xf6, 0xf1, 0xee, 0xee, 0xef, 0xf2, 0xf8, 0xfc, + 0xff, 0xf6, 0xee, 0xf5, 0x04, 0x0a, 0x0b, 0x0e, 0x06, 0xfe, 0xfc, 0x00, + 0x00, 0x06, 0x0e, 0x14, 0x19, 0x17, 0x13, 0x12, 0x0e, 0x13, 0x19, 0x14, + 0x0d, 0x0b, 0x03, 0x06, 0x0a, 0x06, 0x02, 0xfc, 0xf6, 0xfa, 0xfe, 0x02, + 0xff, 0xfd, 0xfb, 0xfd, 0xfe, 0x00, 0x02, 0x04, 0xfb, 0xf4, 0xf6, 0xf5, + 0xf2, 0xf6, 0xfb, 0xff, 0xfd, 0xf7, 0xf6, 0xfe, 0x07, 0x14, 0x17, 0x16, + 0x15, 0x0c, 0x04, 0x06, 0x03, 0xfc, 0xfc, 0x01, 0x03, 0x07, 0x0e, 0x16, + 0x19, 0x1a, 0x19, 0x1c, 0x22, 0x1f, 0x16, 0x06, 0xf7, 0xf2, 0xf4, 0xee, + 0xea, 0xee, 0xf7, 0xfc, 0xfa, 0xfb, 0xfd, 0xfa, 0xff, 0x03, 0x02, 0xfb, + 0xf9, 0xf9, 0xfa, 0xf9, 0xf7, 0xfa, 0x00, 0x02, 0x02, 0x05, 0x0a, 0x0a, + 0x08, 0x02, 0x09, 0x15, 0x1d, 0x1b, 0x15, 0x0d, 0x09, 0x0d, 0x0c, 0x08, + 0x05, 0x07, 0x0b, 0x0a, 0x05, 0x00, 0x01, 0x05, 0x06, 0x04, 0xff, 0xf8, + 0xf6, 0xf6, 0xf3, 0xf2, 0xf3, 0xf0, 0xee, 0xf1, 0xf8, 0xfd, 0x02, 0x07, + 0x06, 0x0b, 0x17, 0x1e, 0x19, 0x15, 0x0f, 0x06, 0x01, 0x02, 0xfe, 0xfa, + 0xff, 0x04, 0x02, 0xfc, 0xf9, 0xff, 0x07, 0x10, 0x16, 0x16, 0x15, 0x0e, + 0x07, 0x03, 0xfe, 0xf9, 0xf5, 0xf1, 0xf1, 0xf8, 0xfd, 0x04, 0x09, 0x09, + 0x00, 0x04, 0x0c, 0x10, 0x0b, 0x04, 0xfb, 0xf4, 0xf5, 0xf8, 0xf6, 0xfb, + 0x04, 0x0a, 0x08, 0x08, 0x0d, 0x0c, 0x0d, 0x12, 0x11, 0x09, 0x05, 0x03, + 0x08, 0x0b, 0x09, 0x07, 0x04, 0x03, 0x00, 0xfc, 0xf9, 0xfe, 0x00, 0xf8, + 0xf5, 0x00, 0x07, 0x05, 0x04, 0x01, 0xfe, 0xff, 0xfe, 0xfa, 0xf6, 0xf8, + 0x01, 0x05, 0x03, 0x00, 0x04, 0x07, 0x11, 0x18, 0x17, 0x12, 0x0c, 0x05, + 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xfa, 0xfe, 0x04, 0x0a, 0x0d, 0x0e, + 0x16, 0x1d, 0x1a, 0x15, 0x11, 0x0a, 0x04, 0x00, 0xfa, 0xf2, 0xf1, 0xf2, + 0xf6, 0xf2, 0xee, 0xf2, 0xf6, 0xfb, 0xfa, 0xfc, 0x02, 0x04, 0x04, 0x02, + 0xff, 0xff, 0xfe, 0xf9, 0xfd, 0x02, 0x08, 0x0f, 0x11, 0x17, 0x16, 0x16, + 0x1a, 0x20, 0x1b, 0x13, 0x0a, 0x03, 0x00, 0x02, 0x03, 0x02, 0x04, 0x07, + 0x02, 0xff, 0xfe, 0x04, 0x07, 0x01, 0xfa, 0xfb, 0xf7, 0xf3, 0xf5, 0xfa, + 0xfd, 0xfa, 0xf6, 0xf2, 0xf0, 0xef, 0xf5, 0xf7, 0xfb, 0xff, 0xff, 0x04, + 0x10, 0x19, 0x1c, 0x1d, 0x17, 0x0c, 0x03, 0x04, 0x02, 0x01, 0x07, 0x08, + 0x06, 0x06, 0x0a, 0x0f, 0x12, 0x13, 0x17, 0x18, 0x11, 0x08, 0x03, 0xff, + 0xfe, 0xfa, 0xf2, 0xed, 0xed, 0xf1, 0xf5, 0xfa, 0x04, 0x06, 0x03, 0x02, + 0x01, 0x01, 0x03, 0x08, 0x04, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0x00, 0x00, + 0x00, 0x03, 0x06, 0x07, 0x06, 0x08, 0x0f, 0x13, 0x11, 0x0d, 0x0c, 0x0e, + 0x0e, 0x0a, 0x07, 0x06, 0x08, 0x04, 0x01, 0x09, 0x10, 0x0e, 0x0a, 0x08, + 0x08, 0x04, 0x00, 0xfa, 0xf2, 0xf0, 0xf4, 0xf6, 0xf1, 0xf4, 0xf9, 0xf7, + 0xfb, 0x04, 0x05, 0x02, 0x02, 0x03, 0x06, 0x0b, 0x0c, 0x0f, 0x11, 0x06, + 0xff, 0x00, 0xfc, 0xfc, 0xfb, 0xf8, 0xfd, 0x06, 0x08, 0x07, 0x0d, 0x16, + 0x1e, 0x21, 0x1c, 0x15, 0x08, 0x03, 0x04, 0xfe, 0xf8, 0xfa, 0xfa, 0xf7, + 0xfb, 0x02, 0x06, 0x06, 0x03, 0xfc, 0xf9, 0xfa, 0xfa, 0xfc, 0xfc, 0xf6, + 0xf6, 0xf7, 0xf5, 0xf7, 0xfd, 0x06, 0x11, 0x16, 0x11, 0x0e, 0x0f, 0x13, + 0x16, 0x18, 0x13, 0x0a, 0x05, 0x03, 0x04, 0x05, 0x07, 0x0a, 0x03, 0xf8, + 0xf8, 0xfe, 0x02, 0x01, 0xfc, 0xfb, 0x00, 0x00, 0xff, 0x01, 0xff, 0xfc, + 0xfd, 0xfb, 0xf4, 0xf2, 0xf5, 0xff, 0x08, 0x0e, 0x0c, 0x0a, 0x10, 0x12, + 0x15, 0x13, 0x0f, 0x07, 0xff, 0xf8, 0xf8, 0xfd, 0x04, 0x09, 0x04, 0x01, + 0x09, 0x0a, 0x08, 0x06, 0x05, 0x09, 0x11, 0x12, 0x0f, 0x0a, 0x03, 0x01, + 0xff, 0xf6, 0xee, 0xec, 0xed, 0xf0, 0xf9, 0x00, 0x01, 0x03, 0x05, 0x05, + 0x07, 0x0b, 0x07, 0x00, 0xfe, 0xfd, 0xfd, 0xfc, 0x00, 0x01, 0x01, 0x0a, + 0x15, 0x14, 0x0b, 0x06, 0x07, 0x0c, 0x0c, 0x0a, 0x07, 0x04, 0x02, 0x01, + 0x01, 0x01, 0x06, 0x0a, 0x07, 0x06, 0x06, 0x07, 0x08, 0x09, 0x07, 0x04, + 0x05, 0x02, 0xf8, 0xf2, 0xf3, 0xf5, 0xf8, 0xfc, 0xf6, 0xec, 0xee, 0xfa, + 0xff, 0x00, 0xfd, 0xfe, 0x02, 0x09, 0x14, 0x18, 0x19, 0x13, 0x08, 0xfe, + 0xfb, 0xfe, 0x05, 0x09, 0x0a, 0x0e, 0x0f, 0x0f, 0x11, 0x13, 0x17, 0x18, + 0x18, 0x0e, 0xfd, 0xf7, 0xf9, 0xfd, 0x00, 0x01, 0xfb, 0xf4, 0xf8, 0xfd, + 0xfe, 0xfc, 0xfa, 0xfa, 0xfa, 0xfa, 0xfc, 0x01, 0x05, 0x01, 0xfb, 0xf8, + 0xf4, 0xf1, 0xf4, 0xfa, 0x02, 0x0a, 0x11, 0x12, 0x0c, 0x10, 0x19, 0x21, + 0x1d, 0x14, 0x0a, 0x07, 0x06, 0x08, 0x0a, 0x0d, 0x0a, 0x0b, 0x09, 0x05, + 0x00, 0x01, 0x02, 0x02, 0x02, 0xfd, 0xf8, 0xfa, 0xf8, 0xf3, 0xf0, 0xf3, + 0xf8, 0xfb, 0xf9, 0xf8, 0x00, 0x06, 0x0a, 0x08, 0x07, 0x0a, 0x0d, 0x12, + 0x10, 0x09, 0x04, 0x04, 0x02, 0xfb, 0xf9, 0xfd, 0x01, 0x01, 0x05, 0x05, + 0x04, 0x02, 0x02, 0x08, 0x12, 0x1c, 0x21, 0x19, 0x0a, 0x00, 0x01, 0xfe, + 0xfb, 0xfa, 0xf6, 0xf7, 0xfc, 0x05, 0x08, 0x07, 0x09, 0x0a, 0x03, 0xfa, + 0xf5, 0xf3, 0xf6, 0xfc, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x05, 0x09, + 0x0b, 0x06, 0xff, 0x01, 0x0f, 0x17, 0x12, 0x0b, 0x06, 0x04, 0xfe, 0xfc, + 0x01, 0x07, 0x07, 0x07, 0x05, 0x03, 0x03, 0x08, 0x10, 0x14, 0x13, 0x07, + 0xfc, 0xf7, 0xf7, 0xf8, 0xf8, 0xfb, 0xfd, 0xf8, 0xf2, 0xf6, 0x00, 0x01, + 0x01, 0x01, 0xfe, 0xfe, 0x03, 0x0b, 0x0d, 0x0e, 0x0b, 0x08, 0xfb, 0xfa, + 0x01, 0x06, 0x08, 0x0b, 0x11, 0x0f, 0x0b, 0x0b, 0x10, 0x14, 0x16, 0x12, + 0x0b, 0x03, 0xfa, 0xf9, 0xfd, 0xff, 0xfe, 0xf7, 0xf1, 0xf0, 0xf2, 0xf6, + 0xfb, 0xfd, 0x02, 0x09, 0x07, 0x00, 0x02, 0x01, 0x02, 0xff, 0xfd, 0xf5, + 0xf5, 0xf9, 0x01, 0x0a, 0x13, 0x17, 0x18, 0x13, 0x0e, 0x0e, 0x0f, 0x0b, + 0x08, 0x04, 0x03, 0x04, 0x06, 0x0d, 0x0f, 0x0c, 0x0c, 0x09, 0x00, 0xf7, + 0xf7, 0xfd, 0x07, 0x0d, 0x08, 0xfe, 0xf7, 0xf5, 0xf2, 0xee, 0xed, 0xf4, + 0xf8, 0xf3, 0xf2, 0xfd, 0x07, 0x09, 0x0d, 0x11, 0x0e, 0x0c, 0x0a, 0x0d, + 0x0f, 0x0e, 0x0d, 0x09, 0x01, 0xfa, 0xfb, 0x01, 0x09, 0x0c, 0x0a, 0x06, + 0x03, 0x05, 0x07, 0x0d, 0x11, 0x14, 0x12, 0x06, 0xfb, 0xfb, 0x02, 0x03, + 0x02, 0xfa, 0xf9, 0xff, 0xff, 0x01, 0x05, 0x09, 0x08, 0x05, 0xfa, 0xef, + 0xee, 0xf5, 0xfe, 0xff, 0xff, 0xf9, 0xf4, 0xf6, 0xfd, 0x00, 0x03, 0x0a, + 0x0e, 0x0e, 0x0f, 0x16, 0x18, 0x14, 0x14, 0x0e, 0x02, 0xfd, 0xfd, 0x02, + 0x07, 0x0f, 0x1a, 0x1a, 0x0a, 0x02, 0x04, 0x08, 0x0c, 0x09, 0xff, 0xf7, + 0xf2, 0xf5, 0xf8, 0xfa, 0xfd, 0xff, 0xfa, 0xf4, 0xf1, 0xf5, 0xf9, 0xfe, + 0x06, 0x04, 0x03, 0x03, 0x00, 0x05, 0x0c, 0x09, 0x03, 0x00, 0xfb, 0xf7, + 0xfa, 0x07, 0x13, 0x15, 0x12, 0x11, 0x10, 0x13, 0x15, 0x12, 0x11, 0x11, + 0x0c, 0x02, 0xfd, 0x00, 0xfe, 0xfd, 0xfe, 0xf8, 0xf3, 0xf5, 0xf7, 0xfb, + 0x00, 0x04, 0x05, 0x00, 0xf6, 0xf8, 0xfc, 0xff, 0x04, 0x03, 0xfd, 0xf8, + 0xf9, 0x02, 0x0b, 0x0d, 0x0f, 0x10, 0x13, 0x11, 0x0c, 0x0b, 0x04, 0x03, + 0x05, 0x01, 0xfe, 0x02, 0x02, 0x03, 0x08, 0x08, 0x08, 0x05, 0xfe, 0x00, + 0x08, 0x11, 0x14, 0x0c, 0x05, 0x01, 0xf9, 0xf2, 0xf0, 0xee, 0xef, 0xf6, + 0xff, 0x04, 0x06, 0x05, 0x03, 0x08, 0x0d, 0x04, 0xff, 0xfc, 0xfd, 0x08, + 0x0f, 0x10, 0x0f, 0x08, 0xfe, 0xfa, 0xff, 0x03, 0x07, 0x05, 0x08, 0x0a, + 0x08, 0x0b, 0x0d, 0x09, 0x0a, 0x0b, 0x02, 0xfa, 0xfb, 0xfd, 0xfa, 0x02, + 0x08, 0x02, 0xfd, 0xfc, 0x00, 0x0a, 0x0f, 0x0e, 0x0b, 0x01, 0xf4, 0xf3, + 0xf7, 0xfc, 0x01, 0xfd, 0xf7, 0xf8, 0xf8, 0xfb, 0xff, 0x04, 0x0c, 0x0d, + 0x0c, 0x0e, 0x0e, 0x0d, 0x0f, 0x13, 0x0d, 0x05, 0x02, 0xfd, 0xff, 0x0e, + 0x1a, 0x17, 0x12, 0x0b, 0x02, 0x02, 0x09, 0x0e, 0x07, 0xfa, 0xf5, 0xf3, + 0xef, 0xf1, 0xf8, 0xf5, 0xf3, 0xf4, 0xf2, 0xf0, 0xf9, 0x03, 0x09, 0x0e, + 0x0e, 0x08, 0x03, 0x03, 0x07, 0x0b, 0x09, 0x04, 0x02, 0xfc, 0xfb, 0x07, + 0x12, 0x13, 0x12, 0x12, 0x11, 0x10, 0x0e, 0x0b, 0x08, 0x07, 0x09, 0x09, + 0x07, 0x05, 0x04, 0xff, 0xfd, 0xfe, 0xf6, 0xf0, 0xf3, 0xf7, 0xfc, 0x02, + 0x07, 0x04, 0x00, 0xf8, 0xef, 0xf0, 0xf6, 0xfd, 0xfe, 0xfa, 0x01, 0x08, + 0x03, 0x03, 0x0a, 0x10, 0x16, 0x18, 0x16, 0x10, 0x0b, 0x07, 0x06, 0x09, + 0x06, 0x00, 0xfb, 0xfc, 0x01, 0x08, 0x0c, 0x0e, 0x0f, 0x07, 0xff, 0x05, + 0x0b, 0x0a, 0x09, 0x07, 0x04, 0xfd, 0xf5, 0xef, 0xf0, 0xf5, 0xfe, 0x02, + 0xff, 0xfc, 0xfe, 0x05, 0x0c, 0x0e, 0x05, 0xf8, 0xef, 0xf1, 0xf7, 0x04, + 0x0d, 0x0e, 0x08, 0xff, 0xf8, 0xfd, 0x03, 0x0b, 0x12, 0x14, 0x14, 0x14, + 0x0f, 0x0d, 0x0d, 0x09, 0x06, 0x01, 0xfd, 0xfa, 0xfb, 0x04, 0x0f, 0x0f, + 0x04, 0xfa, 0xf9, 0xfc, 0x03, 0x0b, 0x0a, 0x03, 0xfc, 0xf6, 0xf3, 0xf9, + 0x00, 0x01, 0xff, 0xfc, 0xfc, 0xf6, 0xf4, 0xfc, 0x06, 0x08, 0x0c, 0x0d, + 0x0a, 0x06, 0x06, 0x05, 0x07, 0x07, 0x01, 0xfb, 0xfc, 0x07, 0x10, 0x15, + 0x17, 0x17, 0x16, 0x11, 0x0c, 0x0e, 0x09, 0x02, 0xff, 0xfc, 0xf8, 0xf4, + 0xf1, 0xf0, 0xef, 0xf3, 0xf6, 0xf5, 0xf7, 0xfd, 0x03, 0x07, 0x0e, 0x0c, + 0x04, 0xff, 0xfe, 0xfe, 0x03, 0x07, 0x09, 0x07, 0x0a, 0x0b, 0x06, 0x06, + 0x0b, 0x0f, 0x15, 0x16, 0x11, 0x0a, 0x02, 0xfc, 0xfb, 0xfc, 0x02, 0x06, + 0x03, 0x02, 0x01, 0x00, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfe, 0x06, 0x0a, + 0x09, 0x02, 0xfa, 0xf2, 0xf3, 0xf6, 0xf4, 0xfd, 0x09, 0x0a, 0x05, 0x04, + 0x05, 0x07, 0x0b, 0x10, 0x14, 0x0f, 0x08, 0x07, 0x09, 0x0b, 0x0c, 0x09, + 0x03, 0x01, 0xfb, 0xfb, 0xfc, 0x09, 0x10, 0x10, 0x0c, 0x07, 0x04, 0x04, + 0x01, 0x00, 0xfe, 0xfb, 0xf8, 0xf2, 0xf2, 0xf9, 0xfb, 0xfc, 0x01, 0x01, + 0x04, 0x09, 0x10, 0x11, 0x10, 0x04, 0xf6, 0xf0, 0xf1, 0xf6, 0xfd, 0x05, + 0x0c, 0x0b, 0x04, 0xfd, 0xfd, 0x06, 0x0b, 0x12, 0x16, 0x18, 0x13, 0x0f, + 0x0c, 0x07, 0x02, 0x05, 0x05, 0x00, 0x02, 0x09, 0x0b, 0x09, 0x09, 0x04, + 0xff, 0xfd, 0xf9, 0xf8, 0xfa, 0xfa, 0xf9, 0xf8, 0xf4, 0xf0, 0xf3, 0xfb, + 0xff, 0x01, 0xff, 0xfb, 0xfb, 0x02, 0x07, 0x06, 0x07, 0x10, 0x12, 0x0b, + 0x04, 0x02, 0x07, 0x09, 0x07, 0x03, 0x03, 0x0a, 0x07, 0x09, 0x0f, 0x17, + 0x1a, 0x19, 0x14, 0x0e, 0x07, 0x02, 0x02, 0x06, 0x04, 0xfb, 0xf8, 0xf5, + 0xf4, 0xf0, 0xec, 0xf0, 0xf7, 0xf9, 0xfc, 0xff, 0x07, 0x08, 0x03, 0xfc, + 0xf6, 0xf1, 0xf2, 0xf8, 0xfd, 0x06, 0x13, 0x18, 0x10, 0x0f, 0x10, 0x11, + 0x13, 0x19, 0x1a, 0x13, 0x09, 0x01, 0xff, 0xfa, 0xfb, 0x03, 0x04, 0x02, + 0x02, 0x04, 0x04, 0x04, 0x05, 0x03, 0xfe, 0xff, 0xff, 0x00, 0x01, 0x04, + 0x05, 0x00, 0xfb, 0xf5, 0xf3, 0xf9, 0x07, 0x0b, 0x08, 0x05, 0x05, 0x05, + 0x02, 0xfd, 0x00, 0x06, 0x05, 0x02, 0xff, 0x03, 0x07, 0x06, 0x07, 0x04, + 0x02, 0xfd, 0xfc, 0x02, 0x0b, 0x13, 0x18, 0x16, 0x0e, 0x06, 0x00, 0xfc, + 0xfe, 0x02, 0x02, 0xf9, 0xf7, 0xff, 0x00, 0xfa, 0xfe, 0x04, 0x07, 0x05, + 0x05, 0x0b, 0x0c, 0x09, 0x04, 0xfc, 0xf8, 0xf7, 0xf4, 0xf5, 0xfb, 0x03, + 0x0c, 0x09, 0x02, 0x04, 0x05, 0x05, 0x0a, 0x0e, 0x0e, 0x0a, 0x04, 0x00, + 0xfc, 0xfa, 0xfc, 0x02, 0x06, 0x0d, 0x0f, 0x11, 0x13, 0x11, 0x0c, 0x07, + 0x00, 0xfb, 0xf6, 0xf5, 0xf4, 0xfa, 0xff, 0xfb, 0xf5, 0xf5, 0xf7, 0xfc, + 0x00, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x09, 0x0e, 0x0c, 0x08, + 0x07, 0x06, 0x05, 0x03, 0x09, 0x0d, 0x09, 0x05, 0x04, 0x0a, 0x0d, 0x0f, + 0x10, 0x09, 0x03, 0x00, 0xfd, 0xfb, 0xfc, 0x01, 0xff, 0xf9, 0xf7, 0xf5, + 0xf3, 0xf2, 0xfa, 0x01, 0x01, 0x00, 0x05, 0x07, 0x04, 0x00, 0xfc, 0xf7, + 0xf1, 0xf3, 0xf5, 0xfe, 0x0b, 0x16, 0x1c, 0x18, 0x17, 0x15, 0x0e, 0x0f, + 0x14, 0x14, 0x0f, 0x09, 0x06, 0x01, 0xfb, 0xfa, 0xfb, 0xff, 0x00, 0x03, + 0x04, 0x05, 0x06, 0x04, 0xff, 0xfb, 0xf8, 0xf6, 0xf5, 0xf8, 0xf7, 0xf7, + 0xfb, 0xf9, 0xfa, 0x01, 0x07, 0x09, 0x0c, 0x10, 0x0d, 0x08, 0x05, 0x02, + 0xfc, 0xf7, 0xfe, 0x04, 0x03, 0x05, 0x09, 0x08, 0x06, 0x08, 0x06, 0x06, + 0x02, 0x03, 0x05, 0x0a, 0x11, 0x17, 0x16, 0x10, 0x0c, 0x08, 0xff, 0xf9, + 0xfc, 0x00, 0x00, 0x04, 0x04, 0xff, 0xf9, 0xfa, 0xfd, 0xfe, 0x00, 0x00, + 0xff, 0x01, 0x02, 0xfd, 0xf7, 0xf6, 0xf4, 0xf3, 0xf5, 0xfa, 0x01, 0x0c, + 0x12, 0x0f, 0x0e, 0x0f, 0x0b, 0x07, 0x09, 0x0b, 0x08, 0x01, 0xfb, 0xf9, + 0xfa, 0x02, 0x0d, 0x15, 0x16, 0x14, 0x16, 0x11, 0x0f, 0x0c, 0x0b, 0x06, + 0x00, 0xf9, 0xf8, 0xf9, 0xfb, 0xfc, 0xf8, 0xf2, 0xf6, 0xfc, 0xfd, 0xfb, + 0xfd, 0x01, 0x00, 0xfe, 0xfb, 0xf9, 0xf8, 0xfb, 0x01, 0x00, 0x00, 0x03, + 0x07, 0x0b, 0x13, 0x15, 0x11, 0x0f, 0x09, 0x07, 0x0a, 0x0c, 0x0c, 0x0b, + 0x08, 0x02, 0x05, 0x06, 0x01, 0xff, 0x01, 0x05, 0x02, 0x01, 0xfd, 0xf9, + 0xf7, 0xfb, 0x01, 0x04, 0x07, 0x0a, 0x07, 0x06, 0xff, 0xf6, 0xf2, 0xf2, + 0xf2, 0xfb, 0x05, 0x09, 0x0c, 0x11, 0x0f, 0x0d, 0x0f, 0x0e, 0x0a, 0x03, + 0x03, 0x07, 0x06, 0x02, 0xfd, 0xf7, 0xf5, 0xfb, 0x04, 0x08, 0x09, 0x0a, + 0x0b, 0x09, 0x05, 0x01, 0x00, 0xfb, 0xf8, 0xf7, 0xf3, 0xf0, 0xf6, 0x01, + 0x07, 0x0c, 0x12, 0x10, 0x0f, 0x0c, 0x0b, 0x0b, 0x0c, 0x0c, 0x02, 0xf7, + 0xf5, 0xff, 0x06, 0x06, 0x03, 0x01, 0xff, 0x03, 0x07, 0x03, 0xff, 0xfe, + 0xfe, 0x01, 0x04, 0x08, 0x08, 0x09, 0x07, 0xff, 0xfd, 0xfc, 0xfd, 0x00, + 0x0a, 0x12, 0x0f, 0x0a, 0x04, 0xfe, 0xf9, 0xfb, 0x02, 0x00, 0xfc, 0xfc, + 0x02, 0x04, 0x01, 0xfb, 0xf8, 0xf8, 0xfb, 0xff, 0x02, 0x04, 0x0a, 0x10, + 0x12, 0x13, 0x15, 0x15, 0x0f, 0x0a, 0x03, 0xfd, 0xfa, 0xf9, 0xf7, 0xfc, + 0x04, 0x0e, 0x0f, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x07, 0xff, 0xf7, 0xf5, + 0xfa, 0xfe, 0xfa, 0xf2, 0xf2, 0xf8, 0xfb, 0x00, 0x05, 0x06, 0x03, 0x00, + 0xff, 0xff, 0xff, 0xfc, 0xf7, 0xf6, 0xf1, 0xf7, 0x03, 0x09, 0x10, 0x1a, + 0x1e, 0x1c, 0x16, 0x0d, 0x08, 0x0b, 0x10, 0x13, 0x11, 0x0a, 0x03, 0x06, + 0x0c, 0x08, 0xff, 0xfa, 0xf9, 0xfa, 0xff, 0x01, 0x00, 0xf7, 0xf2, 0xf2, + 0xf1, 0xf9, 0x00, 0x01, 0xff, 0xfe, 0xf7, 0xf5, 0xf7, 0xf6, 0xfb, 0x05, + 0x0a, 0x0a, 0x0a, 0x09, 0x0a, 0x11, 0x12, 0x0c, 0x09, 0x05, 0x03, 0x07, + 0x09, 0x07, 0x04, 0x01, 0xfe, 0xff, 0x03, 0x0c, 0x0d, 0x0b, 0x0c, 0x0e, + 0x0e, 0x0f, 0x0d, 0x01, 0xf9, 0xf6, 0xf2, 0xf1, 0xf1, 0xf2, 0xf9, 0x09, + 0x10, 0x0a, 0x09, 0x06, 0x07, 0x06, 0x06, 0x03, 0xfa, 0xf2, 0xf1, 0xf6, + 0xf9, 0xfe, 0x00, 0x02, 0x05, 0x0a, 0x0c, 0x08, 0x03, 0xfe, 0xfe, 0xff, + 0x01, 0x07, 0x08, 0x04, 0xff, 0x00, 0x02, 0x04, 0x0a, 0x10, 0x18, 0x1c, + 0x19, 0x11, 0x09, 0x06, 0x04, 0x01, 0xff, 0x01, 0xfd, 0xfd, 0x04, 0x06, + 0xfe, 0xf4, 0xf2, 0xed, 0xf2, 0xfa, 0xfc, 0xfd, 0xfc, 0xfb, 0xfe, 0x0a, + 0x10, 0x0e, 0x0a, 0x03, 0xfb, 0xf8, 0xfc, 0xfe, 0xfb, 0x01, 0x0d, 0x0e, + 0x0c, 0x0f, 0x0f, 0x0e, 0x0d, 0x09, 0x06, 0x03, 0xfc, 0xfa, 0x02, 0x05, + 0x02, 0x03, 0x00, 0xfb, 0xfe, 0x05, 0x0b, 0x0b, 0x09, 0x06, 0x06, 0x0c, + 0x0d, 0x05, 0xf6, 0xee, 0xec, 0xeb, 0xf2, 0xf9, 0x01, 0x10, 0x19, 0x17, + 0x11, 0x08, 0x01, 0xfe, 0x03, 0x07, 0x09, 0x07, 0x02, 0x01, 0x05, 0x09, + 0x03, 0xfe, 0xff, 0x04, 0x07, 0x08, 0x07, 0xff, 0xf6, 0xf6, 0xf8, 0xf5, + 0xf8, 0xfc, 0xfa, 0xfb, 0x02, 0x07, 0x04, 0x02, 0x09, 0x0e, 0x0f, 0x0f, + 0x0e, 0x0e, 0x0d, 0x0b, 0x0f, 0x14, 0x11, 0x09, 0x05, 0x05, 0x03, 0xff, + 0xf9, 0xf3, 0xf3, 0xf8, 0xfd, 0xfd, 0xfe, 0x01, 0x00, 0x04, 0x0b, 0x0d, + 0x09, 0x01, 0xf5, 0xef, 0xf4, 0xf9, 0xfa, 0xfe, 0x03, 0x06, 0x0b, 0x0d, + 0x0c, 0x0c, 0x0a, 0x04, 0x03, 0x06, 0x00, 0xf6, 0xf7, 0xfd, 0xfd, 0xfc, + 0x01, 0x09, 0x0c, 0x10, 0x13, 0x11, 0x09, 0x05, 0x01, 0x01, 0x06, 0x0d, + 0x0a, 0x04, 0xfc, 0xf9, 0xff, 0xff, 0xfd, 0x00, 0x0e, 0x15, 0x17, 0x12, + 0x08, 0x00, 0xfe, 0xfd, 0xfc, 0xf7, 0xf4, 0xf6, 0xfc, 0x02, 0x03, 0x01, + 0xf9, 0xf8, 0xf9, 0xf8, 0xfa, 0xfd, 0xfd, 0xfe, 0xfc, 0xff, 0x0a, 0x0d, + 0x08, 0x03, 0x04, 0x06, 0x0a, 0x09, 0x05, 0x08, 0x14, 0x16, 0x12, 0x0f, + 0x12, 0x15, 0x12, 0x0f, 0x0e, 0x0b, 0x04, 0x00, 0xfa, 0xf4, 0xf6, 0xf7, + 0xf5, 0xf9, 0xf6, 0xf7, 0xfc, 0xff, 0x00, 0x02, 0x04, 0x07, 0x0c, 0x07, + 0xf7, 0xe9, 0xea, 0xf0, 0xf2, 0xf0, 0xfb, 0x0f, 0x18, 0x17, 0x15, 0x10, + 0x08, 0x01, 0xfd, 0xfb, 0x02, 0x05, 0x0a, 0x0d, 0x0d, 0x0f, 0x12, 0x0e, + 0x0b, 0x0c, 0x0c, 0x0e, 0x12, 0x0d, 0x05, 0xff, 0xff, 0x01, 0xff, 0xf6, + 0xf1, 0xf3, 0xf9, 0xfc, 0xf8, 0xf8, 0xfe, 0x07, 0x07, 0x05, 0x06, 0x05, + 0x06, 0x03, 0x03, 0x08, 0x07, 0x03, 0x00, 0x02, 0x00, 0x02, 0x03, 0x00, + 0xfa, 0xf8, 0xfb, 0xfe, 0xfd, 0xfd, 0x01, 0x04, 0x06, 0x09, 0x0b, 0x07, + 0x02, 0x03, 0x03, 0x01, 0x03, 0x09, 0x10, 0x12, 0x12, 0x13, 0x13, 0x11, + 0x0f, 0x0e, 0x0b, 0x0d, 0x09, 0xfe, 0xf2, 0xf0, 0xf0, 0xed, 0xee, 0xf3, + 0xf9, 0x00, 0x04, 0x04, 0x04, 0x03, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, + 0xfd, 0xfd, 0x01, 0x02, 0x01, 0x03, 0x0c, 0x16, 0x17, 0x16, 0x13, 0x08, + 0x00, 0xfb, 0xfc, 0xfc, 0xf8, 0xf7, 0xff, 0x09, 0x0a, 0x0d, 0x10, 0x08, + 0x02, 0x01, 0xfe, 0xfe, 0x02, 0x03, 0x01, 0x00, 0x0b, 0x0c, 0x03, 0xfe, + 0xfa, 0xfa, 0xf8, 0xfa, 0xfc, 0xff, 0x05, 0x0c, 0x0e, 0x0c, 0x09, 0x06, + 0x0a, 0x0c, 0x09, 0x06, 0x03, 0xff, 0xfc, 0xfc, 0xfe, 0xfc, 0xfc, 0xf9, + 0xf5, 0xf7, 0xfc, 0xfe, 0xfd, 0xfe, 0x02, 0x06, 0x0b, 0x0b, 0x07, 0x01, + 0xfc, 0xfb, 0xfc, 0xfb, 0xfd, 0x0b, 0x18, 0x20, 0x1c, 0x15, 0x11, 0x0d, + 0x09, 0x04, 0x00, 0xfe, 0xfe, 0x00, 0xfe, 0x01, 0x05, 0x04, 0xfe, 0xfd, + 0x00, 0x05, 0x09, 0x0b, 0x09, 0x04, 0xfe, 0xfd, 0xfc, 0xf2, 0xeb, 0xec, + 0xf5, 0xfa, 0xfa, 0xfc, 0x05, 0x0b, 0x0d, 0x09, 0x02, 0xfc, 0xfd, 0x00, + 0xff, 0x05, 0x0c, 0x0a, 0x06, 0x09, 0x0e, 0x0f, 0x12, 0x10, 0x06, 0x01, + 0x01, 0x05, 0x06, 0x04, 0x02, 0x03, 0x0a, 0x0f, 0x09, 0x03, 0x00, 0xfc, + 0xfa, 0xf5, 0xf5, 0xf8, 0x00, 0x07, 0x0d, 0x10, 0x0d, 0x09, 0x09, 0x07, + 0x06, 0x07, 0x05, 0xfc, 0xf6, 0xf6, 0xf4, 0xf5, 0xf5, 0xf1, 0xed, 0xf3, + 0xfe, 0x01, 0xfc, 0xfe, 0xff, 0xff, 0x03, 0x06, 0x02, 0x02, 0x08, 0x0b, + 0x0c, 0x12, 0x13, 0x10, 0x14, 0x1d, 0x21, 0x1b, 0x18, 0x16, 0x11, 0x0a, + 0x04, 0x00, 0xf5, 0xed, 0xec, 0xf0, 0xf8, 0xfe, 0xfc, 0xfb, 0xfb, 0xfb, + 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0x00, 0x04, 0x00, 0xfc, 0xf7, 0xf5, + 0xf8, 0xfe, 0x02, 0x05, 0x0a, 0x0d, 0x07, 0x05, 0x04, 0x03, 0x02, 0x08, + 0x0f, 0x0c, 0x0a, 0x11, 0x13, 0x11, 0x12, 0x0f, 0x06, 0xfe, 0xfd, 0x01, + 0x07, 0x08, 0x06, 0x02, 0x03, 0x09, 0x0a, 0x05, 0x02, 0xfc, 0xf3, 0xed, + 0xec, 0xf0, 0xf1, 0xf7, 0x03, 0x0d, 0x12, 0x0e, 0x0b, 0x09, 0x04, 0x02, + 0xfe, 0xf9, 0xf8, 0xf6, 0xf8, 0x02, 0x0b, 0x09, 0x00, 0xfa, 0xfd, 0x02, + 0x04, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x07, 0x05, 0xff, 0xfa, 0xfb, 0x01, + 0x0b, 0x0c, 0x0c, 0x14, 0x1a, 0x17, 0x0d, 0x07, 0x03, 0xfd, 0xfe, 0x00, + 0x01, 0x01, 0xfd, 0xf8, 0xf8, 0xfd, 0xfe, 0xfc, 0xfc, 0xfd, 0x02, 0x02, + 0x01, 0x02, 0x00, 0xfe, 0xff, 0x05, 0x05, 0x01, 0xfe, 0xfd, 0xfd, 0xfe, + 0xff, 0x01, 0x00, 0x02, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0e, 0x0d, 0x0b, 0x07, 0x01, 0xfb, 0xf5, 0xf7, 0xff, 0x04, + 0x04, 0xff, 0x01, 0x05, 0x09, 0x07, 0x01, 0xf8, 0xf2, 0xee, 0xf6, 0x02, + 0x07, 0x09, 0x0a, 0x13, 0x1a, 0x19, 0x17, 0x13, 0x0e, 0x09, 0x07, 0xff, + 0xf9, 0xf6, 0xf0, 0xef, 0xf5, 0xfd, 0xfb, 0xf6, 0xf6, 0xfd, 0xfe, 0xf8, + 0xf5, 0xf5, 0xf5, 0xfa, 0x05, 0x0b, 0x0b, 0x0a, 0x06, 0x05, 0x0a, 0x0a, + 0x09, 0x0b, 0x14, 0x1d, 0x15, 0x0d, 0x0d, 0x0c, 0x05, 0x03, 0x03, 0x02, + 0x03, 0x01, 0x02, 0x03, 0x01, 0xff, 0xfd, 0xfb, 0xfa, 0xfb, 0x01, 0x05, + 0x06, 0x02, 0xfe, 0x02, 0x05, 0x01, 0xfc, 0xf8, 0xf6, 0xf8, 0xf7, 0xf3, + 0xf3, 0xf6, 0xfc, 0xff, 0xff, 0x01, 0x04, 0x04, 0x09, 0x0a, 0x09, 0x0c, + 0x0e, 0x0d, 0x08, 0x09, 0x11, 0x12, 0x0c, 0x09, 0x07, 0x0d, 0x0f, 0x0c, + 0x06, 0x06, 0x0c, 0x10, 0x08, 0xfe, 0xf7, 0xf0, 0xec, 0xf1, 0xf7, 0xfd, + 0x01, 0x09, 0x12, 0x15, 0x10, 0x0b, 0x03, 0xfb, 0xf0, 0xee, 0xf7, 0x00, + 0xff, 0xf8, 0xf7, 0xfc, 0xfc, 0xf7, 0xf5, 0xf7, 0xff, 0x02, 0xfd, 0xfb, + 0x01, 0x07, 0x08, 0x0c, 0x0d, 0x0d, 0x10, 0x14, 0x15, 0x10, 0x0c, 0x0c, + 0x0f, 0x12, 0x10, 0x0b, 0x09, 0x0d, 0x0e, 0x06, 0xff, 0x02, 0x05, 0x03, + 0xfb, 0xf9, 0xfc, 0xfc, 0xf7, 0xf2, 0xf2, 0xf5, 0xf8, 0xfe, 0xfc, 0xfc, + 0xfd, 0xfb, 0xff, 0x01, 0xfd, 0xfb, 0xfa, 0xf7, 0xf6, 0xf9, 0x00, 0x07, + 0x0a, 0x0b, 0x0e, 0x0f, 0x11, 0x13, 0x0c, 0x09, 0x0f, 0x17, 0x1a, 0x13, + 0x0d, 0x06, 0x03, 0x04, 0x01, 0xfc, 0x00, 0x06, 0x07, 0x01, 0xfe, 0xff, + 0xfc, 0xf8, 0xf7, 0xf5, 0xf6, 0xfa, 0xfb, 0xf8, 0xf8, 0xfd, 0x00, 0x02, + 0x08, 0x12, 0x1a, 0x15, 0x0e, 0x06, 0xfd, 0xf9, 0xfd, 0x05, 0x05, 0x01, + 0x02, 0x04, 0x03, 0xfd, 0xf8, 0xf9, 0xfe, 0xfc, 0xf8, 0xf5, 0xff, 0x07, + 0x09, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x0c, 0x09, 0x07, 0x05, 0x02, 0x01, + 0x04, 0x04, 0x03, 0x04, 0x03, 0xff, 0xfd, 0xff, 0x02, 0x01, 0x00, 0xfd, + 0xfb, 0xfb, 0xfd, 0xfa, 0x00, 0x0a, 0x0b, 0x0a, 0x0f, 0x10, 0x0e, 0x00, + 0xfa, 0x02, 0x09, 0x08, 0x01, 0xfc, 0xf8, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, + 0x06, 0x0b, 0x09, 0x05, 0x01, 0xfe, 0xfe, 0x05, 0x08, 0x0b, 0x0f, 0x0e, + 0x07, 0x04, 0x01, 0xff, 0x01, 0x01, 0xff, 0x04, 0x08, 0x07, 0x01, 0x00, + 0x01, 0x03, 0x00, 0xfe, 0xfe, 0x03, 0x07, 0x06, 0x03, 0x05, 0x07, 0x0f, + 0x17, 0x18, 0x0c, 0x03, 0xfe, 0xfc, 0xfd, 0x00, 0x05, 0x07, 0x01, 0xf7, + 0xf2, 0xf3, 0xf5, 0xf1, 0xed, 0xee, 0xf1, 0xf3, 0xf7, 0xf8, 0xf5, 0xfc, + 0x0b, 0x10, 0x0f, 0x12, 0x13, 0x0f, 0x07, 0x06, 0x07, 0x0b, 0x11, 0x15, + 0x15, 0x15, 0x16, 0x17, 0x0f, 0x06, 0x03, 0x09, 0x0f, 0x0c, 0x02, 0xfc, + 0xf8, 0xf9, 0xf9, 0xf8, 0xfc, 0x04, 0x07, 0x01, 0xfc, 0xf3, 0xed, 0xf1, + 0xf8, 0xf9, 0xf7, 0xf7, 0xfa, 0xf5, 0xf0, 0xf3, 0xf9, 0xfd, 0x02, 0x08, + 0x0a, 0x0c, 0x0d, 0x07, 0x08, 0x0e, 0x14, 0x19, 0x1b, 0x16, 0x12, 0x13, + 0x14, 0x0b, 0x03, 0x01, 0x02, 0x03, 0x04, 0x06, 0x03, 0xfd, 0xff, 0x01, + 0xfd, 0xff, 0x03, 0x08, 0x02, 0xf6, 0xf5, 0xfc, 0x02, 0x03, 0x06, 0x06, + 0x02, 0xfe, 0xf8, 0xf3, 0xf7, 0xfc, 0x01, 0x02, 0x01, 0xfd, 0xf5, 0xf5, + 0xf6, 0xf7, 0xf9, 0xfc, 0x01, 0x02, 0x02, 0x09, 0x0c, 0x0c, 0x0f, 0x13, + 0x15, 0x1c, 0x22, 0x1c, 0x0f, 0x07, 0x04, 0x03, 0x02, 0x01, 0x05, 0x0b, + 0x09, 0x02, 0xfd, 0xfb, 0xf8, 0xf7, 0xfa, 0xfe, 0xfc, 0xf8, 0xf7, 0xf8, + 0xf5, 0xfa, 0x01, 0x05, 0x04, 0x00, 0x00, 0xfe, 0xfa, 0xf9, 0x00, 0x05, + 0x08, 0x07, 0x04, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0a, + 0x0a, 0x0a, 0x0b, 0x0d, 0x0f, 0x10, 0x14, 0x19, 0x17, 0x0e, 0x03, 0xfd, + 0xfa, 0xfd, 0xfc, 0xf6, 0xf5, 0xf6, 0xf6, 0xf4, 0xf1, 0xf4, 0xfc, 0xfe, + 0x00, 0x05, 0x03, 0xfb, 0xf5, 0xfa, 0x07, 0x13, 0x17, 0x14, 0x12, 0x0b, + 0x08, 0x0d, 0x12, 0x0e, 0x0a, 0x09, 0x0a, 0x0c, 0x07, 0xfe, 0xf8, 0xf8, + 0xf7, 0xf4, 0xf4, 0xf9, 0xfe, 0xf9, 0xf4, 0xf1, 0xf5, 0xfd, 0x07, 0x0b, + 0x0e, 0x0f, 0x0a, 0x00, 0xfc, 0xff, 0x02, 0x04, 0x05, 0x08, 0x08, 0x06, + 0x07, 0x0a, 0x08, 0x03, 0x03, 0x09, 0x0c, 0x0b, 0x07, 0x06, 0x0a, 0x0a, + 0x07, 0x0a, 0x06, 0x01, 0xfe, 0xfb, 0xfb, 0x00, 0x04, 0x04, 0x01, 0x00, + 0x01, 0xfe, 0xf7, 0xf0, 0xef, 0xf5, 0xfb, 0xfe, 0xff, 0xfa, 0xf4, 0xf8, + 0xff, 0x01, 0x05, 0x0b, 0x12, 0x11, 0x14, 0x13, 0x08, 0x00, 0xfe, 0xfc, + 0x00, 0x08, 0x0a, 0x04, 0x00, 0x00, 0x03, 0x09, 0x0e, 0x0e, 0x0c, 0x0e, + 0x0e, 0x09, 0x03, 0x01, 0x05, 0x10, 0x10, 0x09, 0x05, 0x02, 0xff, 0xfa, + 0xf7, 0xfa, 0xf8, 0xf7, 0xf7, 0xf7, 0xfa, 0xf9, 0xf4, 0xee, 0xed, 0xed, + 0xf5, 0xfc, 0xfe, 0xfc, 0xf8, 0xf9, 0xff, 0x08, 0x12, 0x17, 0x1c, 0x1e, + 0x15, 0x0f, 0x0d, 0x10, 0x13, 0x11, 0x0b, 0x09, 0x05, 0x03, 0x04, 0x09, + 0x0f, 0x12, 0x0b, 0x05, 0x03, 0x05, 0x05, 0x02, 0xfe, 0xf8, 0xf8, 0xfe, + 0x01, 0xff, 0xf6, 0xe8, 0xe5, 0xec, 0xf2, 0xf8, 0x00, 0x04, 0x02, 0xf8, + 0xf4, 0xf4, 0xf1, 0xf4, 0xfb, 0x04, 0x0b, 0x0e, 0x09, 0x04, 0x09, 0x0f, + 0x18, 0x1f, 0x21, 0x1f, 0x1e, 0x1c, 0x1c, 0x16, 0x08, 0x00, 0x02, 0x05, + 0x02, 0xff, 0xf8, 0xf5, 0xf3, 0xed, 0xee, 0xf5, 0xfb, 0xfc, 0xf9, 0xf8, + 0xfc, 0xfc, 0xfa, 0x01, 0x08, 0x06, 0x05, 0x02, 0xfd, 0xfe, 0x03, 0x06, + 0x08, 0x0b, 0x07, 0x05, 0x06, 0x06, 0x04, 0xff, 0xfe, 0x04, 0x07, 0x03, + 0x01, 0xfd, 0xf6, 0xf4, 0xfa, 0x06, 0x15, 0x1e, 0x1e, 0x19, 0x11, 0x0a, + 0x05, 0x00, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xfb, 0xf8, 0xf8, 0xfb, 0xfd, + 0xfe, 0x00, 0x02, 0x05, 0x06, 0x00, 0xfe, 0xfe, 0xfe, 0xff, 0x02, 0x0a, + 0x0b, 0xfd, 0xf6, 0xfa, 0x00, 0x06, 0x11, 0x19, 0x14, 0x0a, 0x03, 0xff, + 0x00, 0x03, 0x03, 0x06, 0x09, 0x03, 0x00, 0xfe, 0x00, 0x03, 0x00, 0xfe, + 0x00, 0x06, 0x07, 0x07, 0x06, 0x06, 0x01, 0xf7, 0xf3, 0xfb, 0xfe, 0xfe, + 0xfb, 0xf4, 0xf3, 0xf8, 0xfc, 0x00, 0x0b, 0x11, 0x0b, 0x08, 0x08, 0x07, + 0x0b, 0x11, 0x19, 0x1c, 0x15, 0x07, 0xff, 0x02, 0x02, 0x04, 0x08, 0x13, + 0x13, 0x08, 0x05, 0x03, 0xfd, 0xf9, 0xf6, 0xf0, 0xee, 0xf2, 0xf5, 0xf4, + 0xee, 0xea, 0xe9, 0xed, 0xf8, 0x03, 0x10, 0x15, 0x12, 0x0c, 0x04, 0xfc, + 0xfb, 0x00, 0x03, 0x03, 0x05, 0x0d, 0x0e, 0x08, 0x0a, 0x10, 0x12, 0x16, + 0x18, 0x19, 0x16, 0x12, 0x10, 0x0f, 0x10, 0x0c, 0x09, 0x09, 0x06, 0xfc, + 0xf1, 0xee, 0xf3, 0xf5, 0xf3, 0xf2, 0xf7, 0xf6, 0xee, 0xe9, 0xef, 0xf4, + 0xf3, 0xf4, 0xfa, 0xfe, 0xfd, 0xff, 0x01, 0xfe, 0x04, 0x0b, 0x0f, 0x14, + 0x1c, 0x1c, 0x15, 0x11, 0x10, 0x0b, 0x06, 0x0a, 0x11, 0x11, 0x07, 0xf9, + 0xf4, 0xf9, 0xfd, 0x00, 0x09, 0x15, 0x10, 0x07, 0x07, 0x0a, 0x04, 0x02, + 0x05, 0x00, 0xfa, 0xf6, 0xf9, 0xf9, 0xf7, 0xf9, 0xf7, 0xfa, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xfa, 0xf6, 0xf0, 0xf1, 0xf6, 0xfc, 0xfc, 0xfb, 0xf8, + 0xf8, 0x00, 0x08, 0x12, 0x1c, 0x25, 0x23, 0x1b, 0x16, 0x11, 0x0b, 0x0d, + 0x10, 0x0c, 0x06, 0x07, 0x09, 0x04, 0xff, 0x01, 0x02, 0xff, 0xfc, 0xf4, + 0xf5, 0xfc, 0x00, 0xff, 0xff, 0xfa, 0xf7, 0xfa, 0xfe, 0xfb, 0xf4, 0xf4, + 0xf5, 0xf3, 0xf9, 0x01, 0x0a, 0x0b, 0x06, 0x03, 0x00, 0x01, 0x04, 0x06, + 0x07, 0x0c, 0x0f, 0x0f, 0x0d, 0x04, 0x02, 0x0a, 0x14, 0x18, 0x19, 0x15, + 0x12, 0x0d, 0x0b, 0x09, 0x06, 0xff, 0xfa, 0xf7, 0xef, 0xe8, 0xe8, 0xee, + 0xf2, 0xf2, 0xf5, 0xfa, 0x00, 0x00, 0x05, 0x0a, 0x08, 0x03, 0x01, 0xfc, + 0xf8, 0xfd, 0x04, 0x0b, 0x0c, 0x04, 0x02, 0x0b, 0x14, 0x19, 0x18, 0x18, + 0x10, 0x0b, 0x09, 0x07, 0x06, 0x07, 0x09, 0x05, 0xf9, 0xf5, 0xf4, 0xf2, + 0xf9, 0x01, 0x01, 0xff, 0xff, 0xf7, 0xf5, 0xfa, 0xfc, 0xfb, 0xfa, 0xf6, + 0xf5, 0xfb, 0x04, 0x0d, 0x08, 0x01, 0x02, 0x09, 0x09, 0x08, 0x0b, 0x12, + 0x15, 0x13, 0x10, 0x0f, 0x0d, 0x0c, 0x0d, 0x09, 0x02, 0x00, 0xff, 0xf9, + 0xfb, 0x01, 0x08, 0x0d, 0x09, 0x03, 0x00, 0xfd, 0xfe, 0x02, 0x00, 0xf9, + 0xf5, 0xf3, 0xf8, 0xf8, 0xf6, 0xfb, 0x04, 0x06, 0x02, 0x02, 0x04, 0x04, + 0x07, 0x05, 0x00, 0x00, 0xfe, 0xf9, 0xf5, 0xf5, 0xfa, 0xfc, 0xfc, 0x00, + 0x07, 0x0a, 0x10, 0x1a, 0x1f, 0x1e, 0x1b, 0x18, 0x14, 0x10, 0x0d, 0x0a, + 0x0c, 0x0d, 0x0d, 0x04, 0xfa, 0xfd, 0x06, 0x02, 0xfb, 0xfa, 0xf5, 0xed, + 0xee, 0xed, 0xf0, 0xf0, 0xef, 0xed, 0xeb, 0xf0, 0xf4, 0xfd, 0x02, 0x03, + 0x00, 0x01, 0x03, 0x08, 0x0d, 0x0b, 0x0d, 0x0e, 0x0e, 0x0d, 0x0c, 0x10, + 0x12, 0x13, 0x15, 0x13, 0x0d, 0x0e, 0x0e, 0x0c, 0x0f, 0x10, 0x0f, 0x0d, + 0x08, 0x04, 0x08, 0x0c, 0x06, 0xf7, 0xec, 0xec, 0xeb, 0xec, 0xed, 0xeb, + 0xef, 0xf3, 0xf9, 0xfe, 0xfe, 0xff, 0xfc, 0xf8, 0xf8, 0xf8, 0xfa, 0xfa, + 0xfd, 0x04, 0x0a, 0x08, 0x0c, 0x17, 0x19, 0x16, 0x18, 0x1c, 0x1c, 0x19, + 0x16, 0x14, 0x12, 0x12, 0x09, 0x01, 0x00, 0x00, 0xfa, 0xf5, 0xf8, 0xfd, + 0xfa, 0xf9, 0xfb, 0xfe, 0xfc, 0xf8, 0xf6, 0xf3, 0xf3, 0xf4, 0xf5, 0xf9, + 0x00, 0x08, 0x0a, 0x07, 0x09, 0x07, 0x02, 0x03, 0x08, 0x0c, 0x0b, 0x04, + 0x02, 0x06, 0x08, 0x09, 0x07, 0x02, 0x00, 0x00, 0x06, 0x0c, 0x0d, 0x06, + 0x01, 0x00, 0x07, 0x0a, 0x07, 0x03, 0x01, 0x01, 0x09, 0x0d, 0x05, 0xfe, + 0xfd, 0xfe, 0xfb, 0xfe, 0xff, 0xfa, 0xfc, 0x02, 0x04, 0x05, 0x08, 0x06, + 0xff, 0x00, 0x00, 0xfb, 0xf8, 0xf6, 0xf8, 0xf5, 0xf6, 0xfc, 0xfe, 0x02, + 0x09, 0x12, 0x1d, 0x1e, 0x16, 0x0d, 0x07, 0x0d, 0x0f, 0x0c, 0x06, 0x08, + 0x0e, 0x0c, 0x07, 0x05, 0x07, 0x00, 0xfb, 0xf8, 0xf5, 0xf9, 0xfa, 0xf5, + 0xf1, 0xed, 0xf1, 0xf1, 0xf1, 0xf2, 0xf4, 0xf9, 0x03, 0x04, 0x02, 0x01, + 0x01, 0x09, 0x10, 0x0f, 0x08, 0x05, 0x0d, 0x15, 0x13, 0x12, 0x15, 0x15, + 0x16, 0x12, 0x13, 0x13, 0x10, 0x0a, 0x07, 0x06, 0x0a, 0x08, 0xfd, 0xf4, + 0xf6, 0xfa, 0x00, 0x01, 0xfa, 0xf0, 0xed, 0xf2, 0xf4, 0xef, 0xe8, 0xe9, + 0xf0, 0xf8, 0xfb, 0xfd, 0xfc, 0xfe, 0x04, 0x05, 0x03, 0x05, 0x08, 0x08, + 0x07, 0x08, 0x0c, 0x10, 0x11, 0x18, 0x1e, 0x21, 0x23, 0x21, 0x1a, 0x18, + 0x13, 0x12, 0x14, 0x0a, 0xff, 0xfb, 0xfb, 0xf8, 0xef, 0xee, 0xf2, 0xf6, + 0xfc, 0x00, 0xfb, 0xf2, 0xec, 0xea, 0xe8, 0xe9, 0xf0, 0xf7, 0xfc, 0x04, + 0x0d, 0x13, 0x10, 0x09, 0x03, 0xff, 0xfe, 0x03, 0x08, 0x05, 0x04, 0x05, + 0x0a, 0x15, 0x16, 0x0e, 0x08, 0x07, 0x08, 0x07, 0x0a, 0x0e, 0x10, 0x0c, + 0x06, 0x02, 0x00, 0x00, 0x01, 0x04, 0x07, 0x09, 0x08, 0x0b, 0x0c, 0x0a, + 0x07, 0x01, 0xf8, 0xee, 0xef, 0xf7, 0xff, 0x03, 0xfd, 0xf7, 0xf0, 0xf0, + 0xf6, 0xfe, 0xfc, 0xf8, 0xf8, 0xf6, 0xf3, 0xf3, 0xf9, 0xff, 0x05, 0x09, + 0x0f, 0x11, 0x13, 0x18, 0x1d, 0x20, 0x21, 0x1c, 0x16, 0x12, 0x0f, 0x0f, + 0x0d, 0x09, 0x01, 0xfd, 0xfe, 0x01, 0x02, 0x02, 0xff, 0xf9, 0xf4, 0xec, + 0xea, 0xed, 0xee, 0xf1, 0xf4, 0xf6, 0xf7, 0xf9, 0xfb, 0x02, 0x05, 0x09, + 0x09, 0x03, 0xfd, 0xfc, 0xff, 0x06, 0x0e, 0x14, 0x19, 0x1b, 0x1d, 0x20, + 0x1c, 0x14, 0x0a, 0x09, 0x09, 0x02, 0xfd, 0xfb, 0xfa, 0xf8, 0xfb, 0x00, + 0x06, 0x06, 0x02, 0x00, 0xfd, 0xfa, 0xf7, 0xf1, 0xf2, 0xf1, 0xf0, 0xf3, + 0xf7, 0xfc, 0x00, 0x04, 0x06, 0x04, 0x06, 0x0a, 0x0d, 0x11, 0x0f, 0x0a, + 0x00, 0xfc, 0x02, 0x0d, 0x19, 0x20, 0x20, 0x17, 0x0e, 0x0c, 0x0f, 0x16, + 0x18, 0x10, 0x08, 0xff, 0xf5, 0xef, 0xe9, 0xec, 0xed, 0xe9, 0xe8, 0xeb, + 0xf2, 0xfa, 0x00, 0x02, 0xfa, 0xf2, 0xf3, 0xfa, 0x01, 0x09, 0x11, 0x14, + 0x11, 0x08, 0x07, 0x0a, 0x0f, 0x12, 0x0c, 0x00, 0xfd, 0xff, 0x07, 0x0f, + 0x13, 0x19, 0x14, 0x0b, 0x04, 0xff, 0x01, 0x09, 0x0c, 0x0a, 0x05, 0xff, + 0xf8, 0xf5, 0xf6, 0xf7, 0xf9, 0xff, 0x06, 0x0d, 0x13, 0x17, 0x16, 0x0c, + 0xfb, 0xe8, 0xe0, 0xe5, 0xec, 0xea, 0xed, 0xf7, 0xfa, 0x00, 0x03, 0x04, + 0x07, 0x09, 0x03, 0xf9, 0xf2, 0xf3, 0xf8, 0x02, 0x0a, 0x0c, 0x0f, 0x1a, + 0x22, 0x20, 0x21, 0x22, 0x25, 0x25, 0x23, 0x21, 0x19, 0x0f, 0x04, 0xfa, + 0xf4, 0xf6, 0xf9, 0xff, 0xfe, 0xf8, 0xf2, 0xf3, 0xf0, 0xeb, 0xe8, 0xe8, + 0xe9, 0xee, 0xee, 0xed, 0xee, 0xf2, 0xf2, 0xf2, 0xf3, 0xf5, 0xfb, 0x05, + 0x07, 0x07, 0x08, 0x0d, 0x12, 0x19, 0x27, 0x2f, 0x2c, 0x29, 0x24, 0x1b, + 0x13, 0x13, 0x11, 0x0b, 0x08, 0xfa, 0xef, 0xf4, 0xfb, 0xfc, 0x02, 0x0a, + 0x08, 0x02, 0xfd, 0xf9, 0xf7, 0xf5, 0xf4, 0xed, 0xe5, 0xe5, 0xec, 0xf5, + 0xfb, 0xfe, 0xfd, 0xfb, 0xfe, 0x08, 0x16, 0x19, 0x10, 0x06, 0xfd, 0xf1, + 0xef, 0xfa, 0x04, 0x0b, 0x0c, 0x10, 0x14, 0x1b, 0x20, 0x23, 0x25, 0x20, + 0x17, 0x0d, 0xfd, 0xf0, 0xeb, 0xee, 0xf1, 0xf1, 0xf3, 0xf5, 0xfa, 0x00, + 0x04, 0x07, 0x03, 0xfd, 0x00, 0x02, 0x03, 0x05, 0x08, 0x06, 0x06, 0x04, + 0x00, 0x02, 0x0a, 0x0b, 0x02, 0xfe, 0xff, 0xfc, 0xfa, 0x02, 0x09, 0x10, + 0x12, 0x0e, 0x06, 0xfd, 0xfb, 0xf9, 0xf8, 0xf9, 0xfa, 0xfb, 0xfe, 0xfd, + 0xfb, 0xff, 0x01, 0x05, 0x14, 0x21, 0x1e, 0x19, 0x1c, 0x18, 0x0b, 0x00, + 0xfa, 0xf7, 0xed, 0xe3, 0xe9, 0xf5, 0xfc, 0x02, 0x07, 0x07, 0x07, 0x07, + 0x04, 0xf9, 0xee, 0xec, 0xf0, 0xf3, 0xfb, 0x07, 0x0c, 0x12, 0x1f, 0x22, + 0x1e, 0x1c, 0x1c, 0x21, 0x29, 0x2b, 0x20, 0x11, 0x01, 0xf3, 0xe6, 0xe1, + 0xe6, 0xe9, 0xe8, 0xe9, 0xf2, 0xf9, 0xfc, 0xff, 0x01, 0xff, 0xfb, 0xf5, + 0xef, 0xf0, 0xf0, 0xf2, 0xf5, 0xfa, 0xfd, 0x03, 0x07, 0x0a, 0x0e, 0x11, + 0x10, 0x10, 0x14, 0x21, 0x2d, 0x2b, 0x25, 0x25, 0x27, 0x1e, 0x12, 0x0e, + 0x0a, 0xff, 0xf9, 0xfb, 0xfc, 0xf6, 0xed, 0xee, 0xf2, 0xf9, 0x01, 0xfe, + 0xf9, 0xf3, 0xec, 0xe4, 0xe4, 0xe9, 0xe8, 0xe3, 0xe6, 0xed, 0xf7, 0xfd, + 0x02, 0x08, 0x15, 0x21, 0x22, 0x1b, 0x14, 0x10, 0x0d, 0x04, 0x00, 0x02, + 0xfe, 0xfe, 0x0b, 0x19, 0x21, 0x25, 0x28, 0x27, 0x25, 0x1d, 0x15, 0x09, + 0xff, 0xf2, 0xe7, 0xe5, 0xe8, 0xea, 0xec, 0xf2, 0xfd, 0x00, 0xff, 0xfd, + 0xf9, 0xfd, 0x08, 0x0c, 0x06, 0xff, 0xf9, 0xf9, 0xf7, 0xf3, 0xf0, 0xed, + 0xef, 0xf4, 0xfc, 0x00, 0x04, 0x0a, 0x0b, 0x0d, 0x15, 0x1a, 0x16, 0x11, + 0x0d, 0x09, 0x0a, 0x0c, 0x0b, 0x04, 0x02, 0x04, 0x08, 0x09, 0x0b, 0x07, + 0x04, 0x0f, 0x18, 0x17, 0x14, 0x15, 0x16, 0x14, 0x0d, 0x00, 0xf6, 0xec, + 0xe4, 0xe8, 0xf3, 0xf6, 0xf1, 0xef, 0xee, 0xf4, 0xff, 0xfe, 0xf7, 0xed, + 0xe4, 0xe1, 0xe3, 0xe5, 0xf0, 0xf8, 0xff, 0x0a, 0x14, 0x1d, 0x25, 0x2c, + 0x38, 0x40, 0x39, 0x2e, 0x26, 0x1c, 0x12, 0x0d, 0x04, 0xf4, 0xe3, 0xdd, + 0xe5, 0xf2, 0x01, 0x07, 0x01, 0xfe, 0x00, 0x01, 0xfd, 0xf7, 0xf1, 0xeb, + 0xe7, 0xe9, 0xee, 0xf2, 0xf8, 0xff, 0x07, 0x0c, 0x08, 0x07, 0x08, 0x0b, + 0x16, 0x1e, 0x22, 0x21, 0x1b, 0x19, 0x19, 0x13, 0x0c, 0xfb, 0xf0, 0xef, + 0xf7, 0xfa, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0x01, 0x05, 0x01, 0xfc, 0xf9, + 0xfa, 0xfa, 0xf5, 0xf4, 0xf3, 0xf2, 0xf8, 0x00, 0x07, 0x09, 0x0a, 0x0f, + 0x15, 0x15, 0x17, 0x14, 0x11, 0x11, 0x10, 0x0a, 0xfb, 0xf0, 0xf4, 0x00, + 0x08, 0x12, 0x1a, 0x1b, 0x19, 0x17, 0x19, 0x17, 0x09, 0xfb, 0xef, 0xe7, + 0xe3, 0xe5, 0xe5, 0xe4, 0xe3, 0xe8, 0xee, 0xf4, 0xfb, 0x04, 0x0e, 0x19, + 0x1c, 0x16, 0x0f, 0x10, 0x12, 0x0e, 0x06, 0xfa, 0xec, 0xe9, 0xf3, 0xfe, + 0x09, 0x0f, 0x10, 0x0d, 0x08, 0x0b, 0x12, 0x14, 0x10, 0x0d, 0x08, 0x05, + 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x01, 0x01, 0x07, 0x0f, 0x0e, + 0x08, 0x01, 0x05, 0x0c, 0x0a, 0x04, 0xfc, 0xef, 0xe2, 0xde, 0xe1, 0xe9, + 0xf5, 0xff, 0xff, 0xfd, 0xfb, 0xfc, 0xfd, 0xfd, 0xf8, 0xf5, 0xf4, 0xf8, + 0xf9, 0xf7, 0xf8, 0xff, 0x0a, 0x17, 0x1e, 0x23, 0x30, 0x3c, 0x41, 0x39, + 0x2e, 0x29, 0x28, 0x1d, 0x11, 0x0a, 0x02, 0xf4, 0xe9, 0xe7, 0xe9, 0xeb, + 0xee, 0xf0, 0xed, 0xf0, 0xf4, 0xf3, 0xee, 0xe7, 0xe2, 0xdf, 0xe4, 0xe8, + 0xe8, 0xe6, 0xec, 0xf4, 0xfb, 0x02, 0x04, 0x0c, 0x1b, 0x23, 0x20, 0x23, + 0x2b, 0x2f, 0x30, 0x2d, 0x27, 0x18, 0x09, 0xfd, 0xfa, 0x00, 0x08, 0x0a, + 0x07, 0x04, 0x03, 0x01, 0x00, 0x00, 0xfc, 0xf6, 0xf5, 0xf6, 0xf9, 0xfb, + 0xf7, 0xf6, 0xf7, 0xf0, 0xf1, 0xfc, 0x02, 0x0a, 0x13, 0x10, 0x04, 0xfe, + 0xfe, 0xfd, 0xfd, 0x02, 0xfe, 0xf4, 0xee, 0xec, 0xf0, 0xfa, 0x06, 0x0e, + 0x16, 0x1d, 0x20, 0x1d, 0x1e, 0x1b, 0x12, 0x09, 0x00, 0xf6, 0xf5, 0xfa, + 0xf9, 0xf8, 0xfa, 0xfb, 0xfe, 0xfc, 0xfd, 0x08, 0x12, 0x13, 0x14, 0x13, + 0x12, 0x13, 0x11, 0x08, 0xfe, 0xf6, 0xf5, 0xf6, 0xf4, 0xfa, 0xfc, 0xfe, + 0x02, 0x06, 0xfe, 0xf7, 0xfc, 0xff, 0xfd, 0xfe, 0xff, 0x02, 0x01, 0xff, + 0xf6, 0xf3, 0xfa, 0x07, 0x0f, 0x0d, 0x0e, 0x15, 0x15, 0x13, 0x14, 0x18, + 0x1e, 0x1c, 0x0f, 0x02, 0xf9, 0xf6, 0xf5, 0xf5, 0xf2, 0xf2, 0xfd, 0x03, + 0x06, 0x06, 0x06, 0x01, 0xf8, 0xed, 0xe6, 0xeb, 0xef, 0xfa, 0x01, 0x00, + 0xfe, 0x01, 0x05, 0x09, 0x12, 0x1e, 0x2f, 0x32, 0x2a, 0x21, 0x1d, 0x20, + 0x1b, 0x0f, 0xfb, 0xf0, 0xf1, 0xf1, 0xee, 0xef, 0xf4, 0xf4, 0xf3, 0xe9, + 0xe6, 0xec, 0xf0, 0xf6, 0xfa, 0xf8, 0xf6, 0xf5, 0xf6, 0xf3, 0xf5, 0xf8, + 0x03, 0x05, 0x03, 0x08, 0x13, 0x19, 0x1e, 0x23, 0x1e, 0x1d, 0x27, 0x2e, + 0x2b, 0x24, 0x1c, 0x13, 0x08, 0x02, 0xfb, 0xf9, 0xfb, 0x00, 0x03, 0xfd, + 0xf8, 0xf4, 0xee, 0xe5, 0xe6, 0xeb, 0xf2, 0xef, 0xea, 0xec, 0xed, 0xf0, + 0xf0, 0xf1, 0xf7, 0x05, 0x0d, 0x0a, 0x11, 0x14, 0x16, 0x17, 0x14, 0x0c, + 0x02, 0xfb, 0xf5, 0xfa, 0x04, 0x09, 0x07, 0x07, 0x0b, 0x10, 0x14, 0x1f, + 0x25, 0x1f, 0x11, 0x0d, 0x0d, 0x0d, 0x07, 0xfd, 0xfb, 0xfd, 0xfe, 0xfc, + 0xf8, 0xfa, 0x01, 0x02, 0xfa, 0xf7, 0xfa, 0xfb, 0xfb, 0x01, 0x08, 0x01, + 0xfa, 0xf5, 0xed, 0xea, 0xf3, 0xff, 0x06, 0x03, 0xfc, 0xfa, 0xfc, 0x00, + 0xfd, 0xfb, 0x01, 0x06, 0x0a, 0x0e, 0x0e, 0x0f, 0x0d, 0x06, 0x03, 0x06, + 0x05, 0x0c, 0x13, 0x16, 0x1a, 0x1a, 0x18, 0x17, 0x15, 0x16, 0x16, 0x16, + 0x12, 0x05, 0xfa, 0xfa, 0xfd, 0xfa, 0xed, 0xea, 0xf2, 0xf8, 0xf7, 0xf3, + 0xf0, 0xed, 0xea, 0xe3, 0xe0, 0xe2, 0xe1, 0xe7, 0xec, 0xf5, 0x03, 0x09, + 0x0e, 0x15, 0x1b, 0x1d, 0x21, 0x27, 0x2b, 0x2f, 0x2d, 0x2a, 0x24, 0x16, + 0x04, 0xfd, 0x02, 0x04, 0x06, 0x04, 0xfd, 0xfb, 0xfd, 0xf7, 0xf0, 0xed, + 0xeb, 0xe9, 0xeb, 0xf0, 0xfa, 0xfe, 0xfb, 0xfa, 0xf6, 0xf9, 0x03, 0x08, + 0x0b, 0x10, 0x0b, 0x08, 0x0a, 0x09, 0x0d, 0x16, 0x16, 0x12, 0x14, 0x10, + 0x0b, 0x08, 0x02, 0x00, 0x06, 0x05, 0x00, 0xfb, 0xfa, 0xf4, 0xf6, 0xf8, + 0xf3, 0xf4, 0xf8, 0xfb, 0x00, 0x02, 0x01, 0x02, 0xfd, 0xff, 0x00, 0xfe, + 0x02, 0x0f, 0x14, 0x12, 0x0e, 0x11, 0x17, 0x16, 0x0c, 0x0a, 0x05, 0x00, + 0xfb, 0xfc, 0xff, 0x02, 0x08, 0x07, 0x02, 0x02, 0x02, 0x05, 0x09, 0x05, + 0x01, 0x04, 0x06, 0x00, 0xfa, 0xf1, 0xf4, 0xfb, 0xff, 0x02, 0x05, 0x08, + 0x07, 0x02, 0xfe, 0xfa, 0xf7, 0xfe, 0x04, 0x02, 0xff, 0x01, 0x02, 0x00, + 0xfe, 0x00, 0x05, 0x09, 0x0c, 0x0b, 0x0a, 0x0b, 0x08, 0x00, 0xf6, 0xf5, + 0x00, 0x0a, 0x0f, 0x10, 0x13, 0x11, 0x0c, 0x06, 0x04, 0x05, 0x0b, 0x0c, + 0x07, 0x03, 0xff, 0xfe, 0x06, 0x0e, 0x08, 0x02, 0x02, 0x04, 0xfe, 0xfb, + 0x03, 0x08, 0x06, 0xfe, 0xf4, 0xee, 0xf2, 0xf6, 0xf1, 0xed, 0xed, 0xef, + 0xf1, 0xf1, 0xf3, 0xf4, 0xf6, 0xfb, 0xfd, 0x00, 0x04, 0x10, 0x18, 0x1c, + 0x23, 0x25, 0x22, 0x21, 0x20, 0x21, 0x27, 0x2d, 0x28, 0x17, 0x06, 0x08, + 0x0e, 0x0a, 0x04, 0x04, 0xfe, 0xef, 0xe2, 0xe0, 0xe2, 0xe2, 0xe3, 0xe3, + 0xe3, 0xe0, 0xe0, 0xe6, 0xee, 0xf6, 0xfa, 0xfe, 0x0c, 0x13, 0x0d, 0x0b, + 0x14, 0x18, 0x12, 0x07, 0xfe, 0x09, 0x1a, 0x1f, 0x1b, 0x18, 0x17, 0x12, + 0x0a, 0x09, 0x0c, 0x0e, 0x0b, 0x07, 0x00, 0xfa, 0xf2, 0xf2, 0xf6, 0xfd, + 0x02, 0x01, 0x05, 0x06, 0x04, 0x01, 0x05, 0x0f, 0x11, 0xfe, 0xf2, 0xfa, + 0x00, 0x02, 0x00, 0xfd, 0xfc, 0xfa, 0xfd, 0xfa, 0xf9, 0xfe, 0x04, 0x07, + 0x07, 0x02, 0xff, 0x03, 0x04, 0x02, 0xff, 0x00, 0xff, 0xfc, 0xfe, 0x06, + 0x09, 0x0c, 0x0a, 0x03, 0xff, 0x03, 0x0f, 0x18, 0x18, 0x13, 0x0d, 0x07, + 0x05, 0x00, 0xfd, 0xfd, 0x02, 0x0b, 0x0a, 0x02, 0xfe, 0x00, 0x00, 0x02, + 0x04, 0x05, 0x05, 0x01, 0xf7, 0xf3, 0xf8, 0xff, 0xfb, 0xf3, 0xf5, 0xfa, + 0xff, 0x06, 0x0b, 0x0a, 0x02, 0x03, 0x0a, 0x0f, 0x0f, 0x0c, 0x0b, 0x09, + 0x04, 0xfc, 0xf3, 0xf5, 0xff, 0x06, 0x0b, 0x0d, 0x0e, 0x0d, 0x0c, 0x0e, + 0x0f, 0x10, 0x0d, 0x05, 0xf9, 0xf2, 0xf4, 0xf7, 0xf5, 0xf4, 0xf4, 0xf7, + 0xf9, 0xfd, 0x00, 0x01, 0x08, 0x0e, 0x0d, 0x05, 0x02, 0x07, 0x0e, 0x0d, + 0x0b, 0x07, 0x07, 0x0d, 0x14, 0x17, 0x17, 0x14, 0x10, 0x0f, 0x0e, 0x0a, + 0x08, 0x0b, 0x07, 0xf9, 0xea, 0xe2, 0xe1, 0xe1, 0xe1, 0xe6, 0xed, 0xef, + 0xf0, 0xef, 0xf0, 0xf8, 0x03, 0x08, 0x10, 0x19, 0x1b, 0x17, 0x17, 0x15, + 0x0f, 0x0f, 0x14, 0x17, 0x1a, 0x1d, 0x21, 0x22, 0x1e, 0x0f, 0x06, 0x01, + 0x01, 0xff, 0xfc, 0xf8, 0xef, 0xe7, 0xe8, 0xe9, 0xe9, 0xf0, 0xf6, 0xf6, + 0xfc, 0x02, 0x03, 0x06, 0x0c, 0x0d, 0x0e, 0x13, 0x11, 0x0b, 0x00, 0xf5, + 0xf2, 0xf6, 0xf6, 0xf1, 0xf5, 0xfd, 0x03, 0x09, 0x0d, 0x0f, 0x12, 0x0f, + 0x0b, 0x0c, 0x0b, 0x09, 0x03, 0xfc, 0xff, 0x05, 0x07, 0x0c, 0x13, 0x10, + 0x0f, 0x0e, 0x0d, 0x12, 0x11, 0x0b, 0x0b, 0x0f, 0x08, 0xf9, 0xf1, 0xea, + 0xe8, 0xf1, 0xfb, 0x00, 0x04, 0x04, 0x03, 0xfe, 0xfb, 0xfe, 0xff, 0xfc, + 0xfe, 0x03, 0x00, 0xfd, 0xfa, 0xf7, 0xf8, 0xf9, 0xf7, 0xfc, 0x02, 0x07, + 0x10, 0x14, 0x11, 0x0b, 0x0d, 0x11, 0x17, 0x1b, 0x15, 0x0b, 0x01, 0xf9, + 0xfc, 0x07, 0x0c, 0x0a, 0x0f, 0x13, 0x12, 0x10, 0x0c, 0x08, 0x01, 0xfc, + 0xff, 0x01, 0xfd, 0xf6, 0xec, 0xe5, 0xe8, 0xeb, 0xec, 0xec, 0xf4, 0xf9, + 0xff, 0x06, 0x0b, 0x0d, 0x10, 0x0e, 0x11, 0x15, 0x0f, 0x05, 0xf9, 0xf5, + 0xfd, 0x05, 0x04, 0x05, 0x12, 0x1a, 0x17, 0x16, 0x17, 0x19, 0x18, 0x12, + 0x0b, 0x05, 0xfc, 0xf0, 0xea, 0xe9, 0xed, 0xf0, 0xf8, 0xff, 0x02, 0xff, + 0x01, 0x02, 0xfd, 0xfc, 0xfd, 0x02, 0x07, 0x08, 0x03, 0xfc, 0xfb, 0x02, + 0x0f, 0x13, 0x14, 0x1e, 0x28, 0x20, 0x12, 0x0c, 0x08, 0x01, 0xff, 0xfe, + 0xfe, 0xfe, 0xfa, 0xf1, 0xe8, 0xe3, 0xe1, 0xe5, 0xeb, 0xf7, 0xfd, 0x05, + 0x0b, 0x0e, 0x11, 0x13, 0x17, 0x1e, 0x1b, 0x11, 0x07, 0x01, 0x02, 0x02, + 0x02, 0x00, 0xff, 0x01, 0x08, 0x0b, 0x0a, 0x09, 0x08, 0x04, 0x01, 0x01, + 0x04, 0x04, 0xfb, 0xf2, 0xed, 0xf0, 0xf6, 0x01, 0x0d, 0x0f, 0x14, 0x16, + 0x0f, 0x0c, 0x0f, 0x15, 0x1b, 0x15, 0x08, 0xfb, 0xf0, 0xe7, 0xe7, 0xea, + 0xea, 0xea, 0xf4, 0xfe, 0x06, 0x09, 0x09, 0x0c, 0x09, 0x04, 0xff, 0x01, + 0x03, 0x02, 0x06, 0x04, 0x04, 0x08, 0x07, 0x0e, 0x17, 0x1f, 0x23, 0x16, + 0x05, 0x03, 0x03, 0x03, 0x07, 0x08, 0xff, 0xf4, 0xf2, 0xf0, 0xf5, 0xfc, + 0x02, 0x07, 0x0d, 0x0e, 0x0e, 0x0d, 0x06, 0x05, 0x04, 0x01, 0x05, 0x07, + 0xfe, 0xfa, 0xfb, 0xf4, 0xeb, 0xe1, 0xdb, 0xe3, 0xee, 0xfa, 0x05, 0x0a, + 0x0d, 0x11, 0x1b, 0x1f, 0x1d, 0x15, 0x10, 0x0b, 0x04, 0x00, 0x07, 0x0d, + 0x08, 0x0a, 0x11, 0x18, 0x1c, 0x15, 0x07, 0x07, 0x06, 0x05, 0x06, 0xfd, + 0xf3, 0xf3, 0xee, 0xe3, 0xe3, 0xed, 0xf2, 0xff, 0x0a, 0x09, 0x02, 0x03, + 0x05, 0x04, 0x05, 0x05, 0x02, 0xfd, 0xf8, 0xf8, 0xf9, 0x02, 0x06, 0xfe, + 0xfe, 0x0c, 0x17, 0x21, 0x23, 0x17, 0x0f, 0x0f, 0x08, 0x01, 0x01, 0x02, + 0x00, 0xff, 0xfd, 0xf3, 0xf3, 0xf7, 0xfe, 0x08, 0x0a, 0x06, 0x06, 0x03, + 0xff, 0x01, 0x0c, 0x10, 0x08, 0xfd, 0xfa, 0xfd, 0x03, 0x09, 0x04, 0x00, + 0x01, 0x03, 0x03, 0x05, 0x09, 0x07, 0x05, 0x04, 0x05, 0x05, 0x09, 0x09, + 0x02, 0xfb, 0xee, 0xe3, 0xe4, 0xe8, 0xf4, 0x01, 0x0e, 0x18, 0x18, 0x12, + 0x14, 0x1e, 0x1f, 0x12, 0x07, 0x02, 0x02, 0x02, 0x01, 0xf8, 0xf7, 0xfe, + 0x00, 0xfd, 0x00, 0x06, 0x08, 0x05, 0x02, 0xfc, 0xf6, 0xf6, 0xf9, 0xf6, + 0xf6, 0xf9, 0xff, 0x06, 0x0a, 0x0f, 0x1e, 0x2a, 0x27, 0x1b, 0x0e, 0x09, + 0x0c, 0x0d, 0x04, 0xf9, 0xf8, 0xf9, 0xf4, 0xf1, 0xec, 0xe7, 0xeb, 0xf3, + 0xf4, 0xfa, 0x03, 0x10, 0x15, 0x10, 0x08, 0x03, 0x09, 0x0e, 0x07, 0x03, + 0x09, 0x0c, 0x05, 0xfd, 0xfc, 0x03, 0x05, 0x03, 0xfe, 0xfa, 0x01, 0x06, + 0x0a, 0x0a, 0x09, 0x07, 0x0a, 0x09, 0x03, 0xfe, 0xfd, 0x01, 0x08, 0x0a, + 0x0a, 0x0c, 0x16, 0x19, 0x0f, 0x04, 0x05, 0x0a, 0x08, 0xfe, 0xf7, 0xf8, + 0xf5, 0xea, 0xdb, 0xd7, 0xe4, 0xf2, 0xf6, 0xf9, 0x01, 0x0a, 0x0f, 0x14, + 0x15, 0x0a, 0x02, 0x02, 0x07, 0x07, 0x07, 0x08, 0x0c, 0x10, 0x13, 0x11, + 0x14, 0x1c, 0x1b, 0x14, 0x0a, 0x07, 0x04, 0xfe, 0xf8, 0xf4, 0xf7, 0xf7, + 0xf7, 0xf4, 0xf5, 0xfc, 0x06, 0x0a, 0x0b, 0x07, 0x07, 0x06, 0x06, 0x08, + 0x04, 0x02, 0x02, 0x05, 0xff, 0xf6, 0xf7, 0xf5, 0xf1, 0xf3, 0xfa, 0xfb, + 0xfc, 0x00, 0x05, 0x09, 0x0d, 0x0e, 0x0b, 0x0a, 0x0f, 0x14, 0x12, 0x0f, + 0x07, 0xfe, 0xff, 0x01, 0x03, 0x03, 0x07, 0x0b, 0x0b, 0x0b, 0x09, 0x06, + 0x05, 0x05, 0x05, 0x01, 0x00, 0x03, 0x03, 0xfc, 0xfb, 0xfd, 0xff, 0x01, + 0x01, 0x01, 0x04, 0x03, 0x02, 0x03, 0x00, 0xff, 0xfe, 0xf7, 0xf2, 0xf4, + 0xf6, 0xf5, 0xf7, 0xfd, 0x05, 0x0c, 0x17, 0x1b, 0x19, 0x1b, 0x19, 0x10, + 0x08, 0x06, 0x04, 0x03, 0x03, 0x02, 0xf8, 0xf5, 0xfc, 0xfe, 0xfa, 0xfb, + 0xfc, 0x02, 0x06, 0x05, 0x03, 0x01, 0x04, 0x02, 0xfd, 0xfc, 0xff, 0x04, + 0x09, 0x0a, 0x09, 0x0e, 0x14, 0x18, 0x0f, 0x04, 0xff, 0x01, 0x01, 0x00, + 0x03, 0x0a, 0x0a, 0x07, 0xfe, 0xf5, 0xec, 0xf0, 0xf5, 0xf3, 0xf3, 0xfe, + 0x07, 0x0e, 0x13, 0x10, 0x0a, 0x09, 0x0a, 0x06, 0x04, 0x0a, 0x0b, 0x0a, + 0x09, 0xff, 0xf4, 0xf1, 0xf7, 0xfc, 0xfe, 0x00, 0x05, 0x04, 0x00, 0x02, + 0x09, 0x0a, 0x07, 0x00, 0xff, 0x04, 0x09, 0x0a, 0x0e, 0x12, 0x19, 0x1a, + 0x17, 0x14, 0x0e, 0x0d, 0x0c, 0x08, 0x02, 0xf5, 0xef, 0xed, 0xed, 0xef, + 0xed, 0xe9, 0xea, 0xef, 0xf8, 0xfe, 0x05, 0x0e, 0x11, 0x06, 0x06, 0x0d, + 0x0e, 0x0e, 0x0c, 0x05, 0x01, 0xff, 0xfe, 0xff, 0x01, 0x07, 0x09, 0x08, + 0x05, 0x03, 0x01, 0x02, 0x04, 0x05, 0x04, 0x08, 0x0b, 0x0c, 0x0f, 0x11, + 0x0c, 0x07, 0x08, 0x09, 0x0f, 0x11, 0x0e, 0x0c, 0x02, 0xfa, 0xfc, 0x02, + 0x02, 0xfd, 0xf7, 0xf4, 0xef, 0xef, 0xf2, 0xf1, 0xea, 0xe8, 0xef, 0xfa, + 0x02, 0x09, 0x0b, 0x08, 0x06, 0x09, 0x0f, 0x14, 0x0e, 0x09, 0x11, 0x11, + 0x04, 0xff, 0x02, 0x07, 0x13, 0x16, 0x14, 0x12, 0x0e, 0x0a, 0x0d, 0x0f, + 0x0b, 0x03, 0xfd, 0xfb, 0xf7, 0xf9, 0xff, 0x01, 0xfe, 0xff, 0x03, 0x00, + 0x00, 0x04, 0x04, 0x04, 0x03, 0xff, 0xf9, 0xf6, 0xf2, 0xf4, 0xfa, 0xf7, + 0xee, 0xf0, 0x00, 0x0d, 0x11, 0x14, 0x17, 0x0c, 0xff, 0x00, 0x0a, 0x13, + 0x17, 0x15, 0x0c, 0x03, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0x01, 0x06, 0x05, + 0x08, 0x09, 0x02, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x10, 0x14, 0x14, 0x10, + 0x09, 0x03, 0x00, 0xfd, 0xfd, 0x04, 0x04, 0xf8, 0xf6, 0xfc, 0x06, 0x06, + 0x06, 0x00, 0xf8, 0xf4, 0xf2, 0xf5, 0xf7, 0xfa, 0xfb, 0x00, 0x0d, 0x10, + 0x13, 0x18, 0x15, 0x10, 0x11, 0x12, 0x0e, 0x09, 0x03, 0x00, 0xfa, 0xf3, + 0xef, 0xf2, 0xf5, 0xfa, 0x03, 0x08, 0x04, 0x00, 0x06, 0x0f, 0x0f, 0x0b, + 0x08, 0x06, 0xff, 0xf8, 0xfe, 0x01, 0x04, 0x0d, 0x13, 0x19, 0x16, 0x0f, + 0x0b, 0x02, 0xf8, 0xf6, 0xfc, 0x01, 0x01, 0x00, 0x01, 0x01, 0xfd, 0xf3, + 0xf4, 0xfa, 0x00, 0x0a, 0x0f, 0x0d, 0x06, 0x03, 0x02, 0x01, 0x08, 0x07, + 0x06, 0x07, 0x00, 0xfa, 0xfd, 0xfd, 0xfb, 0xf8, 0xf3, 0xf6, 0xf8, 0xfd, + 0x04, 0x01, 0xfe, 0x04, 0x0a, 0x11, 0x1b, 0x21, 0x21, 0x19, 0x0f, 0x0b, + 0x09, 0x0c, 0x0d, 0x10, 0x11, 0x09, 0x07, 0x0a, 0x0d, 0x0c, 0x08, 0x02, + 0xfb, 0xef, 0xe1, 0xdb, 0xe0, 0xe6, 0xe5, 0xe9, 0xf4, 0xfa, 0xfb, 0x05, + 0x0a, 0x09, 0x0d, 0x10, 0x0f, 0x11, 0x11, 0x0b, 0xfe, 0xf7, 0xf5, 0xf6, + 0x00, 0x0b, 0x16, 0x1d, 0x1c, 0x12, 0x0c, 0x07, 0x02, 0x04, 0x0c, 0x12, + 0x10, 0x06, 0x02, 0x06, 0x05, 0x03, 0x05, 0x0e, 0x10, 0x08, 0x02, 0x02, + 0xfe, 0xf3, 0xef, 0xec, 0xf0, 0xfd, 0x03, 0x00, 0xfe, 0xfe, 0xf7, 0xf4, + 0xf8, 0xfa, 0xfa, 0xfc, 0xfd, 0xff, 0x02, 0x05, 0x0c, 0x10, 0x13, 0x13, + 0x0e, 0x08, 0x02, 0xfe, 0xf9, 0xfc, 0x03, 0x05, 0x05, 0x00, 0x04, 0x11, + 0x13, 0x10, 0x12, 0x17, 0x1f, 0x24, 0x1b, 0x0d, 0x03, 0xfb, 0xf6, 0xf6, + 0xf9, 0xff, 0x04, 0xff, 0xfc, 0xfe, 0xff, 0x04, 0x05, 0x02, 0xff, 0xfa, + 0xee, 0xe2, 0xde, 0xda, 0xe5, 0xf9, 0x03, 0x08, 0x0f, 0x14, 0x18, 0x16, + 0x0d, 0x05, 0x06, 0x0f, 0x18, 0x13, 0x0b, 0x08, 0x05, 0xfe, 0xfc, 0xff, + 0x08, 0x14, 0x13, 0x0c, 0x0a, 0x07, 0x01, 0xfd, 0xfd, 0xfe, 0x02, 0x0a, + 0x07, 0x00, 0x01, 0x06, 0x06, 0x05, 0x04, 0x01, 0xf9, 0xf4, 0xf7, 0xf5, + 0xf2, 0xf9, 0x01, 0x08, 0x0f, 0x0e, 0x10, 0x0b, 0x03, 0xfc, 0xf7, 0xf8, + 0x02, 0x06, 0x02, 0xfd, 0x06, 0x13, 0x17, 0x19, 0x1c, 0x18, 0x11, 0x03, + 0xf3, 0xe9, 0xe4, 0xe4, 0xe8, 0xf0, 0xf8, 0xfb, 0xfb, 0xfd, 0x05, 0x09, + 0x0b, 0x11, 0x1a, 0x22, 0x21, 0x18, 0x0c, 0x05, 0xfb, 0xf3, 0xf8, 0x0e, + 0x1a, 0x19, 0x18, 0x18, 0x11, 0x08, 0x00, 0xfd, 0xfb, 0xfb, 0xfc, 0xf2, + 0xe6, 0xe9, 0xee, 0xef, 0xf8, 0x00, 0x04, 0x05, 0x07, 0x08, 0x08, 0x03, + 0xff, 0x01, 0x01, 0x01, 0xfe, 0x06, 0x09, 0x06, 0x02, 0xfe, 0x01, 0x08, + 0x09, 0x05, 0x01, 0xfe, 0xff, 0x01, 0x09, 0x12, 0x15, 0x16, 0x16, 0x10, + 0x0e, 0x0c, 0x0b, 0x07, 0x07, 0x07, 0x08, 0x00, 0xf5, 0xf2, 0xf9, 0x04, + 0x0c, 0x13, 0x18, 0x12, 0x0a, 0x01, 0xfa, 0xf0, 0xe3, 0xdf, 0xe7, 0xee, + 0xf4, 0xf8, 0xfa, 0x02, 0x08, 0x10, 0x13, 0x10, 0x0e, 0x07, 0xfa, 0xef, + 0xec, 0xe5, 0xe8, 0xf3, 0x01, 0x10, 0x16, 0x15, 0x19, 0x1a, 0x18, 0x14, + 0x19, 0x20, 0x1d, 0x17, 0x16, 0x0f, 0x0b, 0x07, 0x02, 0x03, 0x0e, 0x13, + 0x0f, 0x0b, 0x07, 0x00, 0xfa, 0xf5, 0xf2, 0xec, 0xe9, 0xe4, 0xe0, 0xe8, + 0xee, 0xf1, 0xf8, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x0c, + 0x17, 0x18, 0x0f, 0x10, 0x18, 0x15, 0x0f, 0x0e, 0x0b, 0x08, 0x0c, 0x0f, + 0x0c, 0x03, 0xff, 0x01, 0x0b, 0x1e, 0x24, 0x22, 0x1d, 0x12, 0x02, 0xfb, + 0xfa, 0xf5, 0xee, 0xef, 0xf5, 0xf6, 0xf6, 0xf2, 0xed, 0xf4, 0x02, 0x0b, + 0x0e, 0x0c, 0x0a, 0x05, 0xfd, 0xf5, 0xf1, 0xe7, 0xe8, 0xf0, 0xfc, 0x0a, + 0x12, 0x15, 0x19, 0x1b, 0x1d, 0x17, 0x0b, 0x03, 0xff, 0xf3, 0xf0, 0xf2, + 0xf6, 0xf9, 0xff, 0x0a, 0x13, 0x0f, 0x0b, 0x0a, 0x09, 0x0a, 0x12, 0x16, + 0x0f, 0x05, 0x04, 0x00, 0x03, 0x0d, 0x0e, 0x09, 0x05, 0x07, 0x08, 0x03, + 0xfd, 0xf6, 0xf3, 0xf3, 0xfc, 0xfe, 0x00, 0xff, 0xf6, 0xf6, 0xfb, 0xfc, + 0xfe, 0x01, 0x00, 0xfd, 0xfc, 0x00, 0xfd, 0xf4, 0xf9, 0x07, 0x16, 0x22, + 0x20, 0x18, 0x12, 0x0d, 0x0a, 0x04, 0xff, 0xf8, 0xf2, 0xf6, 0xfd, 0xfd, + 0xfb, 0xfc, 0x05, 0x15, 0x1b, 0x17, 0x15, 0x0e, 0x03, 0xfc, 0xfc, 0xfa, + 0xf2, 0xf1, 0xfa, 0xfe, 0x06, 0x11, 0x0d, 0x05, 0x09, 0x16, 0x19, 0x14, + 0x08, 0x02, 0xfc, 0xfa, 0xfa, 0xf9, 0xf8, 0xf2, 0xf7, 0x03, 0x07, 0x03, + 0x06, 0x0e, 0x12, 0x0c, 0x04, 0xf9, 0xeb, 0xe1, 0xe0, 0xe2, 0xf1, 0xff, + 0x03, 0x06, 0x09, 0x0a, 0x07, 0x01, 0xfb, 0x00, 0x0b, 0x1a, 0x21, 0x20, + 0x18, 0x14, 0x18, 0x1f, 0x1c, 0x19, 0x14, 0x0d, 0x0b, 0x0b, 0x07, 0xff, + 0xf4, 0xf1, 0xf8, 0xfc, 0x04, 0x0c, 0x06, 0xfa, 0xf0, 0xf1, 0xf4, 0xef, + 0xeb, 0xe9, 0xe3, 0xe4, 0xec, 0xf2, 0xf2, 0xfb, 0x0f, 0x1b, 0x16, 0x0c, + 0x09, 0x09, 0x08, 0x08, 0x09, 0x05, 0xfa, 0xfb, 0x02, 0x05, 0x0c, 0x17, + 0x1d, 0x20, 0x26, 0x27, 0x20, 0x16, 0x0a, 0x00, 0xfb, 0xfb, 0xfd, 0xfc, + 0xfd, 0xff, 0x09, 0x0e, 0x07, 0xfd, 0xf5, 0x01, 0x0f, 0x0b, 0x03, 0xf6, + 0xe9, 0xe7, 0xeb, 0xf0, 0xf9, 0xfe, 0xfa, 0xf7, 0xf8, 0xfb, 0xfe, 0x00, + 0x02, 0x06, 0x05, 0x01, 0x03, 0x03, 0xfb, 0xf8, 0x03, 0x0c, 0x09, 0x0d, + 0x12, 0x12, 0x11, 0x0d, 0x0b, 0xff, 0xfe, 0x11, 0x1d, 0x1b, 0x1d, 0x23, + 0x21, 0x1a, 0x14, 0x10, 0x0b, 0x03, 0xfb, 0xf9, 0xf4, 0xf0, 0xf0, 0xef, + 0xf2, 0xf8, 0xff, 0x00, 0xfe, 0xf9, 0xee, 0xec, 0xee, 0xf1, 0xf3, 0xef, + 0xe7, 0xe9, 0xf3, 0xfe, 0x04, 0x0c, 0x1b, 0x22, 0x20, 0x19, 0x13, 0x0e, + 0x0b, 0x0d, 0x0a, 0x07, 0x0a, 0x05, 0x03, 0x08, 0x12, 0x12, 0x0e, 0x11, + 0x16, 0x19, 0x15, 0x10, 0x08, 0xf7, 0xe5, 0xe6, 0xee, 0xf3, 0xf9, 0x01, + 0x05, 0x03, 0x01, 0xf9, 0xf1, 0xf1, 0xfe, 0x09, 0x07, 0x02, 0x00, 0x01, + 0x02, 0x07, 0x0f, 0x10, 0x09, 0x02, 0x00, 0x03, 0x04, 0x07, 0x09, 0x03, + 0xfb, 0xfb, 0xfd, 0x03, 0x08, 0x08, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, + 0xff, 0xff, 0xf6, 0xef, 0xf5, 0x02, 0x12, 0x1b, 0x1c, 0x18, 0x16, 0x14, + 0x11, 0x0f, 0x0e, 0x0d, 0x04, 0xfc, 0xf8, 0xfa, 0xfd, 0x02, 0x07, 0x0b, + 0x0e, 0x0c, 0x09, 0x07, 0x00, 0xf3, 0xef, 0xf2, 0xed, 0xee, 0xef, 0xf1, + 0xf4, 0xfe, 0x05, 0x05, 0x03, 0x0a, 0x0f, 0x10, 0x0a, 0x08, 0x03, 0xfb, + 0xf4, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x0a, 0x06, 0x07, 0x07, 0x08, 0x0c, + 0x13, 0x17, 0x0f, 0x09, 0x06, 0x00, 0x04, 0x0a, 0x0d, 0x10, 0x11, 0x0f, + 0x0c, 0x0b, 0x03, 0xfc, 0xfc, 0xfe, 0xfc, 0xfc, 0xff, 0x03, 0x09, 0x0c, + 0x0a, 0x05, 0x00, 0xf8, 0xf0, 0xec, 0xf1, 0xf6, 0xf1, 0xef, 0xf3, 0xf8, + 0xfc, 0xff, 0x03, 0x04, 0xfe, 0xfa, 0xfe, 0x01, 0x02, 0x07, 0x07, 0x02, + 0xfe, 0xff, 0x05, 0x0f, 0x1f, 0x2c, 0x2c, 0x25, 0x22, 0x21, 0x1b, 0x15, + 0x11, 0x0f, 0x07, 0xff, 0xfd, 0x02, 0x05, 0x05, 0x04, 0x01, 0xfe, 0xfc, + 0xfe, 0x01, 0xfb, 0xf4, 0xe7, 0xe0, 0xd9, 0xdc, 0xe6, 0xe9, 0xed, 0xf2, + 0xf8, 0xf8, 0xfc, 0xff, 0xfe, 0x04, 0x0d, 0x0d, 0x0d, 0x0e, 0x11, 0x15, + 0x18, 0x1c, 0x19, 0x12, 0x12, 0x15, 0x16, 0x14, 0x12, 0x10, 0x0f, 0x0b, + 0x05, 0x03, 0x08, 0x08, 0x06, 0x05, 0x06, 0x06, 0x05, 0x01, 0xfc, 0xfa, + 0xf9, 0xf3, 0xec, 0xea, 0xf1, 0xfa, 0xfd, 0xfe, 0x04, 0x05, 0x02, 0x00, + 0x00, 0xfd, 0xf8, 0xf2, 0xf5, 0xf8, 0xf6, 0xf9, 0x00, 0x07, 0x0b, 0x10, + 0x14, 0x12, 0x10, 0x0a, 0x05, 0x04, 0x04, 0x06, 0x03, 0x02, 0x05, 0x08, + 0x07, 0x0e, 0x15, 0x16, 0x1c, 0x1b, 0x16, 0x17, 0x15, 0x0c, 0x04, 0xfd, + 0xf7, 0xf6, 0xf7, 0xfb, 0xfb, 0xfc, 0xfd, 0xfa, 0xf8, 0xf3, 0xf2, 0xfa, + 0x00, 0xff, 0xf6, 0xf1, 0xf7, 0xfe, 0x00, 0x01, 0x01, 0xfd, 0x00, 0x03, + 0x08, 0x08, 0x03, 0x02, 0x06, 0x06, 0x03, 0x0c, 0x13, 0x15, 0x12, 0x16, + 0x13, 0x0b, 0x08, 0x03, 0x03, 0x06, 0x03, 0x02, 0xff, 0x00, 0x04, 0x07, + 0x05, 0x05, 0x04, 0x01, 0x00, 0xff, 0x01, 0x07, 0x06, 0x00, 0xfd, 0xfa, + 0xf8, 0xfa, 0xfe, 0x05, 0x0b, 0x11, 0x15, 0x14, 0x11, 0x09, 0x04, 0x03, + 0xfc, 0xf3, 0xec, 0xee, 0xfa, 0xfe, 0xfe, 0x03, 0x03, 0x03, 0x04, 0x05, + 0x05, 0x07, 0x05, 0xfe, 0xf9, 0xf5, 0xf1, 0xf8, 0xfa, 0xfa, 0xfb, 0x05, + 0x0b, 0x0c, 0x0d, 0x0e, 0x14, 0x1a, 0x1d, 0x1a, 0x12, 0x0e, 0x14, 0x16, + 0x14, 0x11, 0x10, 0x0e, 0x0e, 0x09, 0x05, 0x01, 0xfb, 0xf7, 0xf6, 0xf4, + 0xef, 0xf4, 0xf8, 0xf4, 0xf6, 0xfb, 0xfb, 0xf5, 0xee, 0xe9, 0xef, 0xfa, + 0xfb, 0xf2, 0xf3, 0xfd, 0x06, 0x08, 0x0b, 0x11, 0x0f, 0x0d, 0x0e, 0x08, + 0x06, 0x08, 0x0c, 0x0b, 0x08, 0x05, 0x06, 0x0d, 0x14, 0x14, 0x13, 0x1a, + 0x1d, 0x17, 0x0e, 0x07, 0x09, 0x09, 0x05, 0xfe, 0xf7, 0xf9, 0x02, 0x01, + 0xfc, 0xfb, 0x00, 0x07, 0x07, 0x04, 0x02, 0x02, 0x00, 0xff, 0xf6, 0xe6, + 0xdf, 0xe4, 0xe6, 0xe5, 0xeb, 0xf7, 0xfc, 0xff, 0xfc, 0xfa, 0x03, 0x0d, + 0x14, 0x0c, 0x06, 0x0a, 0x10, 0x0e, 0x10, 0x13, 0x13, 0x14, 0x17, 0x16, + 0x14, 0x17, 0x18, 0x15, 0x12, 0x0d, 0x0a, 0x0c, 0x0f, 0x0d, 0x08, 0x0a, + 0x0c, 0x05, 0xfc, 0xf4, 0xf9, 0xfa, 0xf4, 0xed, 0xe7, 0xea, 0xf1, 0xf2, + 0xf4, 0xf6, 0xf8, 0xf6, 0xf2, 0xf0, 0xf0, 0xf3, 0xf4, 0xf9, 0xfc, 0xf9, + 0xfc, 0x0c, 0x15, 0x17, 0x1d, 0x25, 0x24, 0x22, 0x1d, 0x10, 0x08, 0x08, + 0x0a, 0x04, 0x02, 0x06, 0x08, 0x0c, 0x11, 0x11, 0x0d, 0x0d, 0x0c, 0x0a, + 0x08, 0x08, 0x04, 0xfe, 0xfc, 0xf0, 0xeb, 0xee, 0xef, 0xf2, 0xf5, 0xf6, + 0xf7, 0xfc, 0xfc, 0xfc, 0x01, 0x07, 0x0a, 0x07, 0x06, 0x04, 0x00, 0xfd, + 0xff, 0x00, 0xff, 0x01, 0x06, 0x0a, 0x0a, 0x08, 0x06, 0x06, 0x0a, 0x08, + 0x06, 0x03, 0x01, 0x01, 0x02, 0x07, 0x06, 0x04, 0x01, 0x02, 0x05, 0x0b, + 0x12, 0x10, 0x0b, 0x09, 0x06, 0x06, 0x0d, 0x12, 0x0d, 0x05, 0x00, 0x03, + 0x04, 0x05, 0x00, 0xfc, 0xfd, 0xf8, 0xf6, 0xf8, 0xfa, 0xfc, 0x07, 0x13, + 0x0d, 0x05, 0x01, 0xfa, 0xf2, 0xee, 0xec, 0xec, 0xf2, 0xfb, 0xfc, 0x00, + 0x0f, 0x18, 0x13, 0x11, 0x13, 0x13, 0x15, 0x17, 0x0f, 0x02, 0xfc, 0xf7, + 0xf1, 0xf1, 0xf2, 0xf8, 0x01, 0x09, 0x09, 0x05, 0x05, 0x0d, 0x13, 0x15, + 0x10, 0x09, 0x0d, 0x0e, 0x08, 0x08, 0x0b, 0x0e, 0x0c, 0x07, 0x04, 0x06, + 0x09, 0x04, 0xfc, 0xfe, 0x00, 0xfd, 0xff, 0x00, 0xf7, 0xf0, 0xf1, 0xf3, + 0xef, 0xed, 0xf2, 0xf8, 0xfd, 0x02, 0x01, 0xfd, 0x03, 0x07, 0x06, 0x03, + 0x04, 0x01, 0xfe, 0xfc, 0xfe, 0x03, 0x08, 0x0b, 0x0b, 0x0d, 0x13, 0x18, + 0x1b, 0x17, 0x17, 0x16, 0x1c, 0x24, 0x24, 0x1c, 0x10, 0x08, 0x00, 0x00, + 0xfe, 0xf9, 0xf9, 0xf7, 0xf2, 0xf0, 0xf4, 0xfa, 0xfe, 0x00, 0x02, 0x01, + 0xff, 0xfc, 0xf4, 0xeb, 0xe4, 0xdd, 0xdd, 0xe1, 0xea, 0xf0, 0xfc, 0x0a, + 0x0d, 0x0d, 0x11, 0x11, 0x15, 0x1c, 0x19, 0x10, 0x0c, 0x0a, 0x07, 0x09, + 0x10, 0x14, 0x15, 0x17, 0x19, 0x17, 0x12, 0x0e, 0x0f, 0x10, 0x0c, 0x04, + 0xfa, 0xfb, 0xfc, 0xfc, 0xfe, 0x01, 0xfd, 0xfb, 0xfc, 0xf7, 0xf8, 0xfe, + 0xfe, 0xf8, 0xf6, 0xf6, 0xf8, 0xfe, 0x00, 0xf7, 0xeb, 0xe8, 0xeb, 0xf3, + 0xf9, 0xfe, 0x02, 0x03, 0x08, 0x0d, 0x0e, 0x10, 0x17, 0x1a, 0x1c, 0x18, + 0x10, 0x0e, 0x08, 0xfe, 0xff, 0x01, 0x03, 0x08, 0x08, 0x07, 0x0e, 0x15, + 0x16, 0x18, 0x13, 0x12, 0x16, 0x18, 0x15, 0x07, 0xff, 0xfc, 0xf8, 0xf3, + 0xe9, 0xe5, 0xe4, 0xe0, 0xe8, 0xee, 0xef, 0xfd, 0x04, 0x01, 0x04, 0x03, + 0xff, 0xfc, 0xf7, 0xf1, 0xf6, 0xfd, 0x09, 0x0f, 0x0d, 0x18, 0x23, 0x21, + 0x19, 0x15, 0x10, 0x10, 0x11, 0x0b, 0xfb, 0xf4, 0xf6, 0xf8, 0xfe, 0x01, + 0x00, 0x04, 0x07, 0x07, 0x09, 0x0c, 0x12, 0x10, 0x0a, 0x03, 0xfd, 0xfa, + 0xfe, 0xfd, 0xf8, 0xfe, 0x02, 0x06, 0x04, 0xfd, 0xfa, 0xff, 0x04, 0x02, + 0xfe, 0x00, 0x07, 0x0d, 0x16, 0x12, 0x04, 0xfb, 0xf2, 0xe9, 0xec, 0xf5, + 0xfc, 0xfd, 0xfc, 0xfe, 0x04, 0x0f, 0x1a, 0x1a, 0x12, 0x11, 0x0c, 0x09, + 0x05, 0xfc, 0xfa, 0xfe, 0xff, 0xfb, 0xf5, 0xf6, 0xfb, 0x01, 0x0b, 0x0f, + 0x10, 0x13, 0x15, 0x15, 0x17, 0x14, 0x0f, 0x09, 0x05, 0x05, 0x04, 0x06, + 0x09, 0x04, 0x00, 0x01, 0x03, 0x05, 0x01, 0xfb, 0xff, 0xff, 0xfa, 0xf0, + 0xe3, 0xdc, 0xe3, 0xf0, 0xf8, 0xfb, 0xff, 0x02, 0x09, 0x10, 0x15, 0x18, + 0x15, 0x0d, 0x04, 0x02, 0xfb, 0xf6, 0xf6, 0xf6, 0xf8, 0xff, 0x05, 0x0d, + 0x0d, 0x0d, 0x0f, 0x14, 0x1b, 0x1d, 0x18, 0x14, 0x14, 0x12, 0x15, 0x14, + 0x0c, 0x07, 0x05, 0xff, 0xfd, 0xfc, 0xf7, 0xed, 0xee, 0xf4, 0xf8, 0xfe, + 0x02, 0x05, 0x07, 0x0a, 0x05, 0xfc, 0xf0, 0xe8, 0xeb, 0xf0, 0xf7, 0xf3, + 0xe8, 0xe8, 0xf2, 0xff, 0x0c, 0x10, 0x0f, 0x10, 0x0d, 0x09, 0x08, 0x08, + 0x02, 0x04, 0x0a, 0x0b, 0x0f, 0x14, 0x19, 0x21, 0x28, 0x2b, 0x25, 0x1d, + 0x11, 0x0a, 0x0d, 0x0c, 0x03, 0xf7, 0xf1, 0xef, 0xf4, 0xf7, 0xfd, 0xf4, + 0xee, 0xf1, 0xf3, 0xf9, 0xff, 0x00, 0xff, 0xfb, 0xf8, 0xee, 0xe5, 0xdf, + 0xe3, 0xee, 0xfc, 0x02, 0x06, 0x08, 0x06, 0x0f, 0x1b, 0x23, 0x23, 0x1c, + 0x13, 0x0e, 0x12, 0x12, 0x0f, 0x0a, 0x04, 0xfe, 0xfc, 0xfd, 0x00, 0x04, + 0x05, 0x02, 0x06, 0x0c, 0x11, 0x10, 0x14, 0x15, 0x13, 0x0e, 0x08, 0x04, + 0xfe, 0x02, 0x04, 0xff, 0xf4, 0xe5, 0xdb, 0xdc, 0xe8, 0xf0, 0xf8, 0xfa, + 0x02, 0x06, 0x05, 0x00, 0xf9, 0xf9, 0xf2, 0xf7, 0x00, 0x04, 0x04, 0x0a, + 0x17, 0x1f, 0x29, 0x2c, 0x23, 0x15, 0x08, 0x03, 0x02, 0xfd, 0xf3, 0xf0, + 0xf3, 0xf9, 0xf9, 0xfe, 0x05, 0x09, 0x12, 0x19, 0x18, 0x14, 0x12, 0x14, + 0x0f, 0x07, 0x00, 0xf7, 0xed, 0xed, 0xf6, 0xfc, 0x00, 0x00, 0xfc, 0xf5, + 0xf2, 0xfb, 0x09, 0x0d, 0x0b, 0x08, 0x04, 0x02, 0x00, 0xfd, 0xfa, 0xff, + 0x05, 0x03, 0xfd, 0xf7, 0xfb, 0x04, 0x09, 0x0c, 0x0d, 0x0d, 0x09, 0x0c, + 0x10, 0x11, 0x0b, 0x06, 0x00, 0xf9, 0xf5, 0xf7, 0x01, 0x07, 0x05, 0xfe, + 0xf7, 0xf9, 0x01, 0x06, 0x0e, 0x11, 0x11, 0x10, 0x06, 0xfd, 0x05, 0x14, + 0x12, 0x09, 0x02, 0xfc, 0xf7, 0x01, 0x11, 0x15, 0x15, 0x0f, 0x0a, 0xff, + 0xf9, 0xf9, 0xf6, 0xee, 0xe6, 0xe3, 0xe6, 0xed, 0xf6, 0xfa, 0x01, 0x08, + 0x10, 0x16, 0x13, 0x11, 0x11, 0x0d, 0x04, 0xf8, 0xec, 0xe3, 0xeb, 0xf6, + 0xff, 0x03, 0x0a, 0x13, 0x19, 0x1d, 0x1c, 0x1d, 0x21, 0x21, 0x1d, 0x1a, + 0x14, 0x0d, 0x07, 0x04, 0x06, 0x09, 0x08, 0x00, 0xf1, 0xe7, 0xe8, 0xec, + 0xef, 0xf1, 0xf6, 0xf8, 0xf8, 0xfe, 0x06, 0x03, 0xfc, 0xfc, 0x01, 0x01, + 0xfd, 0xfe, 0x00, 0x01, 0x08, 0x08, 0x00, 0xfb, 0xfb, 0xff, 0x07, 0x0c, + 0x0c, 0x05, 0xfa, 0xf5, 0xfc, 0x00, 0xff, 0x03, 0x0a, 0x11, 0x16, 0x21, + 0x2b, 0x2d, 0x2c, 0x26, 0x1c, 0x11, 0x04, 0xfe, 0xfa, 0xfe, 0x02, 0xfe, + 0xf8, 0xea, 0xe3, 0xea, 0xf9, 0x01, 0xff, 0xfe, 0xf9, 0xfc, 0x02, 0x00, + 0xfb, 0xf2, 0xdf, 0xd6, 0xdd, 0xed, 0x00, 0x06, 0x0a, 0x0d, 0x13, 0x18, + 0x16, 0x19, 0x1e, 0x1d, 0x16, 0x10, 0x0d, 0x01, 0xf9, 0x05, 0x0e, 0x09, + 0x01, 0xfe, 0x00, 0x09, 0x16, 0x13, 0x09, 0x07, 0x09, 0x09, 0x09, 0x10, + 0x16, 0x08, 0x00, 0xff, 0x04, 0x00, 0xf7, 0xf1, 0xec, 0xef, 0xf2, 0xf0, + 0xec, 0xea, 0xea, 0xf5, 0xfe, 0x04, 0x00, 0xf6, 0xf8, 0x02, 0x0b, 0x09, + 0x04, 0x06, 0x0b, 0x18, 0x1f, 0x23, 0x26, 0x27, 0x24, 0x18, 0x11, 0x0b, + 0xfa, 0xe8, 0xe5, 0xea, 0xf0, 0xf4, 0xf6, 0xf4, 0xfd, 0x0e, 0x18, 0x18, + 0x16, 0x14, 0x11, 0x0f, 0x0f, 0x06, 0xfb, 0xf5, 0xf7, 0xf7, 0xf2, 0xf2, + 0xf6, 0xf8, 0x00, 0x06, 0x08, 0x07, 0x04, 0x05, 0x08, 0x0b, 0x10, 0x0d, + 0x01, 0xeb, 0xee, 0x03, 0x0d, 0x0d, 0x03, 0xfe, 0x00, 0x05, 0x06, 0x04, + 0x04, 0x04, 0x02, 0x02, 0xff, 0x02, 0x02, 0x05, 0x08, 0x05, 0x02, 0x01, + 0xff, 0x08, 0x15, 0x1a, 0x15, 0x0b, 0x02, 0xf9, 0xff, 0x0b, 0x13, 0x0b, + 0xfa, 0xf0, 0xfc, 0x07, 0x04, 0xfa, 0xf3, 0xf7, 0xff, 0x01, 0x04, 0x0d, + 0x17, 0x16, 0x12, 0x09, 0x04, 0xff, 0xf6, 0xf5, 0xf7, 0xfb, 0xfe, 0xfd, + 0xfb, 0xfe, 0x07, 0x0e, 0x11, 0x0e, 0x09, 0x09, 0x0a, 0x08, 0x03, 0xf2, + 0xde, 0xda, 0xe5, 0xec, 0xef, 0xf6, 0x04, 0x15, 0x20, 0x21, 0x25, 0x24, + 0x1f, 0x1d, 0x1d, 0x18, 0x16, 0x12, 0x0d, 0x09, 0x0a, 0x0a, 0x02, 0xf8, + 0xf1, 0xf6, 0xf7, 0xf7, 0xf0, 0xed, 0xef, 0xf5, 0xf7, 0xfd, 0x03, 0xf6, + 0xf1, 0xfa, 0x04, 0x09, 0x0b, 0x08, 0x02, 0x04, 0x08, 0x08, 0x07, 0x05, + 0xff, 0xfa, 0xfa, 0xfc, 0xfe, 0x00, 0xfe, 0xfe, 0xfe, 0x05, 0x04, 0x04, + 0x0f, 0x1c, 0x24, 0x23, 0x1e, 0x22, 0x2b, 0x29, 0x1f, 0x18, 0x0b, 0xf3, + 0xe6, 0xed, 0xf3, 0xf1, 0xed, 0xe7, 0xe8, 0xf3, 0xf8, 0xfa, 0x00, 0x00, + 0xfb, 0xfd, 0xfe, 0xfd, 0xfa, 0xfa, 0xf8, 0xf3, 0xf8, 0xfc, 0xfc, 0x00, + 0x10, 0x1b, 0x1b, 0x17, 0x1d, 0x1b, 0x12, 0x10, 0x11, 0x0f, 0xff, 0xed, + 0xeb, 0xfb, 0x03, 0x06, 0x05, 0x06, 0x0b, 0x11, 0x0f, 0x0d, 0x09, 0x05, + 0x04, 0x02, 0x00, 0x00, 0x04, 0x0b, 0x0c, 0x07, 0x01, 0xfd, 0xfe, 0xfc, + 0xfb, 0xfc, 0xf9, 0xfa, 0xf8, 0xf2, 0xf0, 0xf8, 0xfe, 0xfb, 0xf1, 0xe9, + 0xf3, 0x02, 0x0b, 0x0a, 0x07, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x18, 0x18, + 0x1d, 0x14, 0x07, 0x02, 0x06, 0xfc, 0xef, 0xf0, 0xf9, 0xfd, 0x00, 0x05, + 0x0f, 0x19, 0x17, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x08, 0xf7, 0xe6, 0xe3, + 0xe6, 0xea, 0xea, 0xe8, 0xec, 0xf5, 0xff, 0x08, 0x0a, 0x0e, 0x0f, 0x0a, + 0x08, 0x08, 0x0a, 0x11, 0x12, 0x0a, 0x09, 0x11, 0x12, 0x0e, 0x0d, 0x0c, + 0x09, 0x07, 0x02, 0xfc, 0xfa, 0xfc, 0xfa, 0xf8, 0xf1, 0xe5, 0xe0, 0xeb, + 0xfb, 0x03, 0x07, 0x15, 0x1b, 0x13, 0x13, 0x15, 0x13, 0x10, 0x0b, 0x03, + 0xfe, 0xff, 0xfe, 0x04, 0x08, 0x01, 0xfd, 0xfe, 0xff, 0xfb, 0xfe, 0x03, + 0x06, 0x06, 0x04, 0x06, 0x08, 0x0f, 0x15, 0x13, 0x03, 0xf9, 0xf3, 0xeb, + 0xf1, 0xfa, 0x03, 0x04, 0xfe, 0xfc, 0x06, 0x0b, 0x09, 0x06, 0x06, 0x03, + 0xfc, 0xf9, 0xf9, 0xfb, 0xf4, 0xef, 0xef, 0xfa, 0xff, 0x00, 0x0e, 0x1f, + 0x25, 0x25, 0x25, 0x29, 0x21, 0x17, 0x17, 0x0e, 0x00, 0xf9, 0xf6, 0xf3, + 0xfa, 0x01, 0xff, 0xfd, 0xfb, 0xfa, 0xf7, 0xf5, 0xf1, 0xee, 0xf0, 0xf3, + 0xf3, 0xf7, 0xfe, 0x06, 0x04, 0x04, 0x0c, 0x13, 0x13, 0x19, 0x17, 0x0e, + 0x08, 0x06, 0x06, 0x02, 0xfa, 0xf8, 0xf8, 0xec, 0xe1, 0xe5, 0xeb, 0xf4, + 0x00, 0x0d, 0x15, 0x17, 0x17, 0x1b, 0x1f, 0x1f, 0x1d, 0x19, 0x14, 0x12, + 0x12, 0x13, 0x19, 0x14, 0xfb, 0xeb, 0xeb, 0xec, 0xf0, 0xf6, 0xf8, 0xf8, + 0xfe, 0xff, 0xfa, 0xfc, 0x00, 0x05, 0xfe, 0xf2, 0xed, 0xeb, 0xe7, 0xf0, + 0xfe, 0x03, 0x01, 0xfe, 0x00, 0x06, 0x14, 0x1b, 0x1f, 0x19, 0x0a, 0x00, + 0x02, 0x0a, 0x10, 0x0a, 0x02, 0x03, 0x0e, 0x16, 0x18, 0x1f, 0x1f, 0x1b, + 0x13, 0x0a, 0x04, 0xfe, 0xfc, 0xfd, 0xf0, 0xe7, 0xe7, 0xe5, 0xe5, 0xed, + 0xff, 0x09, 0x0b, 0x05, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xf8, 0xf6, 0xf8, + 0xff, 0x09, 0x0c, 0x0a, 0x07, 0x08, 0x0a, 0x10, 0x14, 0x13, 0x11, 0x11, + 0x11, 0x0f, 0x0c, 0x08, 0x06, 0xfe, 0xf6, 0xf8, 0xf9, 0xec, 0xe5, 0xf7, + 0x09, 0x11, 0x0d, 0x0a, 0x0c, 0x12, 0x18, 0x14, 0x06, 0x01, 0xfe, 0xff, + 0x03, 0x09, 0x00, 0xec, 0xe7, 0xe9, 0xed, 0xf2, 0xf7, 0xfc, 0xfe, 0x01, + 0x0a, 0x15, 0x19, 0x12, 0x06, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0x04, 0x14, + 0x1b, 0x13, 0x06, 0x04, 0x01, 0x03, 0x00, 0xf9, 0xee, 0xe8, 0xe9, 0xec, + 0xfa, 0xff, 0xfa, 0xf8, 0x00, 0x0c, 0x1e, 0x31, 0x33, 0x26, 0x1a, 0x17, + 0x13, 0x0b, 0x04, 0xfd, 0xf2, 0xea, 0xec, 0xeb, 0xe7, 0xe9, 0xf7, 0x00, + 0x02, 0x04, 0x02, 0xfd, 0x00, 0x04, 0x08, 0x03, 0x01, 0x05, 0x02, 0x0c, + 0x1d, 0x1e, 0x0d, 0xff, 0xfb, 0xff, 0x03, 0x09, 0x06, 0x01, 0x01, 0x02, + 0x04, 0x00, 0xfc, 0xf3, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xf0, 0x02, 0x10, + 0x14, 0x11, 0x0d, 0x0e, 0x18, 0x1f, 0x1f, 0x1e, 0x15, 0x0b, 0x0c, 0x17, + 0x17, 0x09, 0x00, 0xfc, 0xf9, 0x00, 0x0d, 0x0b, 0x03, 0xfe, 0xfb, 0xf8, + 0xf7, 0xfc, 0xf4, 0xe5, 0xe5, 0xe9, 0xec, 0xee, 0xf1, 0xfb, 0x07, 0x0c, + 0x16, 0x18, 0x0e, 0x06, 0x06, 0x03, 0xfb, 0xf4, 0xee, 0xf0, 0xf7, 0x04, + 0x08, 0x02, 0x04, 0x0b, 0x17, 0x23, 0x2d, 0x30, 0x27, 0x1e, 0x1a, 0x17, + 0x14, 0x0c, 0x01, 0xf8, 0xf4, 0xf2, 0xfa, 0xf8, 0xec, 0xea, 0xf0, 0xf4, + 0xf4, 0xf2, 0xf0, 0xf6, 0xf9, 0xff, 0xfe, 0xfa, 0xfb, 0xff, 0x0b, 0x13, + 0x0e, 0x06, 0xfe, 0xfa, 0xfc, 0x03, 0x08, 0x04, 0x00, 0x00, 0x04, 0x0c, + 0x14, 0x0e, 0x00, 0xf9, 0xf7, 0xfa, 0xfe, 0x00, 0x09, 0x19, 0x20, 0x26, + 0x26, 0x1b, 0x14, 0x11, 0x0a, 0xfe, 0xf7, 0xf8, 0xf1, 0xf6, 0x00, 0x00, + 0xf6, 0xee, 0xec, 0xee, 0xf8, 0x08, 0x17, 0x10, 0x04, 0x02, 0x04, 0x04, + 0x00, 0xf6, 0xec, 0xe8, 0xea, 0xfa, 0xfd, 0xfc, 0x04, 0x0c, 0x11, 0x11, + 0x12, 0x0e, 0x08, 0x05, 0x00, 0xfb, 0xfc, 0xfe, 0x00, 0x08, 0x0f, 0x0f, + 0x0f, 0x0d, 0x0c, 0x0e, 0x14, 0x1c, 0x1c, 0x13, 0x10, 0x0e, 0x0a, 0x08, + 0x00, 0xf2, 0xeb, 0xeb, 0xef, 0xee, 0xef, 0xee, 0xec, 0xef, 0xf2, 0xf4, + 0xf4, 0xf4, 0xf8, 0xfe, 0x00, 0x08, 0x16, 0x10, 0x14, 0x20, 0x1e, 0x15, + 0x0e, 0x0a, 0x09, 0x0b, 0x15, 0x1e, 0x13, 0x03, 0x00, 0xfc, 0xf7, 0xf0, + 0xee, 0xe4, 0xdc, 0xe1, 0xe8, 0xf3, 0xfd, 0x04, 0x0a, 0x12, 0x1b, 0x28, + 0x28, 0x20, 0x16, 0x0a, 0x00, 0xff, 0xfb, 0xf7, 0xff, 0x01, 0x00, 0x00, + 0xfc, 0xf7, 0xf9, 0x03, 0x0d, 0x10, 0x0e, 0x0b, 0x08, 0x0a, 0x06, 0x00, + 0xfc, 0xf8, 0xf4, 0xf6, 0xff, 0x05, 0x01, 0xff, 0x01, 0x01, 0x00, 0x00, + 0xfc, 0xf8, 0xf3, 0xee, 0xf0, 0xf8, 0xf8, 0x00, 0x0c, 0x0c, 0x0a, 0x0c, + 0x14, 0x11, 0x0e, 0x16, 0x1b, 0x18, 0x12, 0x10, 0x10, 0x0c, 0x0a, 0x0c, + 0x08, 0x00, 0xfc, 0xfc, 0xfe, 0xfc, 0xf5, 0xf6, 0xfc, 0x00, 0x04, 0x09, + 0x01, 0xfa, 0xf8, 0xf4, 0xf6, 0xfa, 0xff, 0x00, 0x03, 0x02, 0x00, 0xfe, + 0xfe, 0xfc, 0xfe, 0x05, 0x12, 0x14, 0x0e, 0x08, 0x04, 0xf8, 0xf3, 0xf6, + 0xee, 0xe6, 0xec, 0xf6, 0x04, 0x0e, 0x10, 0x16, 0x1f, 0x24, 0x28, 0x28, + 0x22, 0x12, 0x06, 0x00, 0x00, 0x02, 0x06, 0x0a, 0x08, 0x00, 0xfe, 0xfc, + 0xf4, 0xf2, 0xf8, 0xfc, 0xfc, 0xfc, 0xff, 0x03, 0x00, 0xf6, 0xf8, 0xfa, + 0xee, 0xef, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xfe, 0xfa, + 0xf4, 0xf0, 0xf0, 0xfa, 0x07, 0x10, 0x1a, 0x24, 0x1f, 0x1c, 0x1e, 0x1c, + 0x19, 0x1b, 0x24, 0x26, 0x24, 0x22, 0x16, 0x07, 0xf9, 0xf3, 0xf6, 0xf2, + 0xe7, 0xde, 0xe6, 0xeb, 0xea, 0xe8, 0xea, 0xee, 0xf0, 0xfc, 0x04, 0x06, + 0x04, 0x00, 0x00, 0xff, 0x00, 0x02, 0x08, 0x0a, 0x04, 0x02, 0x08, 0x0c, + 0x06, 0x0a, 0x12, 0x13, 0x14, 0x18, 0x10, 0xfe, 0xf4, 0xf6, 0xfc, 0xf9, + 0xf7, 0xfe, 0x04, 0x09, 0x08, 0x08, 0x14, 0x17, 0x14, 0x0e, 0x0b, 0x06, + 0x00, 0xfe, 0xfe, 0xf8, 0xfe, 0x06, 0x04, 0x00, 0xfe, 0xfc, 0xfc, 0xfe, + 0xfa, 0xf8, 0xfc, 0xfe, 0x00, 0x02, 0x01, 0xfd, 0xfb, 0x03, 0x03, 0xfe, + 0x06, 0x0d, 0x0d, 0x05, 0x03, 0x07, 0x09, 0x07, 0x07, 0x05, 0x05, 0xfb, + 0xed, 0xe9, 0xeb, 0xf5, 0x05, 0x15, 0x11, 0x07, 0x09, 0x0d, 0x0f, 0x0d, + 0x0f, 0x16, 0x1a, 0x1e, 0x1c, 0x19, 0x10, 0x02, 0xfb, 0xfb, 0xf1, 0xe7, + 0xe9, 0xef, 0xef, 0xeb, 0xf6, 0xfe, 0xfd, 0xff, 0x05, 0x09, 0x11, 0x15, + 0x0b, 0x00, 0xfb, 0x02, 0x0b, 0x13, 0x11, 0x0b, 0x05, 0x03, 0xfb, 0xfb, + 0x05, 0x07, 0x01, 0xfb, 0xfc, 0xf8, 0xef, 0xed, 0xf3, 0xf5, 0xf9, 0xfb, + 0xff, 0x07, 0x08, 0x09, 0x17, 0x21, 0x1a, 0x11, 0x0d, 0x0b, 0x05, 0x01, + 0x00, 0x00, 0x05, 0x0f, 0x11, 0x15, 0x17, 0x0d, 0x07, 0x00, 0xf9, 0xfb, + 0x03, 0x07, 0x06, 0x0b, 0x0f, 0x00, 0xee, 0xef, 0xf2, 0xef, 0x00, 0x00, + 0xc8, 0xcb, 0x0f, 0x20, 0xc0, 0xff, 0x50, 0xd8, 0xbb, 0x2f, 0x40, 0xe0, + 0xdf, 0xf1, 0x0f, 0x04, 0xf7, 0x0a, 0x0b, 0x00, 0xa7, 0x37, 0x28, 0xfb, + 0x13, 0xf4, 0xc2, 0xff, 0x5a, 0x18, 0xe8, 0xf7, 0x55, 0x4e, 0x42, 0x20, + 0x07, 0x3f, 0x00, 0xe2, 0xd7, 0x3f, 0x10, 0xf9, 0x03, 0xf0, 0x0f, 0x00, + 0xdb, 0xff, 0xf0, 0xdf, 0xe8, 0xe6, 0xf0, 0xd7, 0xf2, 0xcc, 0xbd, 0xe2, + 0xc0, 0x89, 0x80, 0xab, 0xa8, 0x9a, 0x97, 0xea, 0xc0, 0xa0, 0xbf, 0x00, + 0xb0, 0xbf, 0x00, 0xca, 0xed, 0xed, 0xf3, 0xf8, 0xef, 0x13, 0x04, 0xe7, + 0x37, 0x02, 0x1f, 0x37, 0x2f, 0x4f, 0x42, 0x3f, 0x58, 0x2d, 0x71, 0x20, + 0x3f, 0x7b, 0x50, 0x3f, 0x50, 0x39, 0x30, 0x2d, 0x4e, 0x20, 0x16, 0x22, + 0x23, 0x14, 0xff, 0x1e, 0x08, 0xca, 0xff, 0x28, 0xe0, 0xe3, 0x1f, 0xc0, + 0xbf, 0x2e, 0xd8, 0xf7, 0xc0, 0xbf, 0x13, 0x08, 0xdb, 0xfe, 0xf1, 0xe8, + 0xdf, 0xe0, 0xe7, 0xd0, 0xcf, 0x0c, 0x0b, 0xf2, 0xe4, 0xbf, 0xe7, 0x10, + 0xc8, 0xc5, 0xe8, 0xe7, 0xcc, 0xc9, 0xb6, 0xcf, 0x03, 0xea, 0xfb, 0x06, + 0xe0, 0xd5, 0xff, 0x00, 0xf1, 0xfb, 0x23, 0x04, 0xdf, 0x2f, 0x1c, 0xf4, + 0x17, 0x38, 0x05, 0x13, 0x21, 0x2f, 0x00, 0x1f, 0x48, 0xf0, 0x37, 0x48, + 0xf2, 0x2f, 0x38, 0x1c, 0x1f, 0x27, 0x37, 0x40, 0xff, 0x52, 0x20, 0x27, + 0x55, 0x64, 0x52, 0x20, 0x3b, 0x55, 0x69, 0x68, 0x17, 0x6f, 0x50, 0x2b, + 0x5b, 0x40, 0x14, 0x12, 0x27, 0x30, 0x02, 0x34, 0xf4, 0x07, 0x16, 0x00, + 0xff, 0xfb, 0x1a, 0xf4, 0xcf, 0x0a, 0x00, 0xe2, 0xe0, 0xbf, 0x0b, 0x00, + 0xde, 0xd9, 0xe1, 0xd8, 0xb6, 0xcf, 0xd5, 0xde, 0xd0, 0xdb, 0xc0, 0xaf, + 0xc8, 0xbd, 0xe5, 0xcc, 0x80, 0xbf, 0xe0, 0xc8, 0xaf, 0xb6, 0xe5, 0xd0, + 0xaf, 0xf7, 0xe4, 0xc8, 0xef, 0xe8, 0xfa, 0xd0, 0x0f, 0xf8, 0xe0, 0xfb, + 0x10, 0xec, 0xfb, 0x11, 0xfd, 0x08, 0x0b, 0x0c, 0xff, 0x0a, 0x15, 0x12, + 0x07, 0x26, 0x09, 0x1a, 0x19, 0x3b, 0x34, 0x1a, 0x34, 0x03, 0x30, 0xf3, + 0x7b, 0x48, 0x00, 0x2f, 0x30, 0x27, 0x37, 0x34, 0x01, 0x2b, 0x50, 0x2c, + 0xf0, 0x37, 0x14, 0x09, 0x0d, 0x2f, 0x08, 0x0f, 0x14, 0xfc, 0x0f, 0x04, + 0xb9, 0xff, 0x20, 0xd4, 0x17, 0xf0, 0xd4, 0xd7, 0x12, 0xf0, 0xd8, 0xdf, + 0xf0, 0xa8, 0xdf, 0xf8, 0xd0, 0xc7, 0xfb, 0xe0, 0xbf, 0xd4, 0xcb, 0xd9, + 0x02, 0xe5, 0xd5, 0xe2, 0xca, 0xcf, 0xeb, 0x04, 0xef, 0xe8, 0xd0, 0xcf, + 0x0c, 0xe2, 0xe7, 0x0f, 0xd0, 0xef, 0xf0, 0xe4, 0xe7, 0x00, 0xbb, 0xff, + 0x08, 0xd5, 0x0d, 0x13, 0xf0, 0xdf, 0x1f, 0x1a, 0x00, 0xdf, 0xf4, 0xfb, + 0x2f, 0x08, 0xdd, 0x0f, 0x05, 0x00, 0xdf, 0x1e, 0xf0, 0x0d, 0x00, 0x02, + 0xfb, 0x2b, 0x00, 0x0b, 0xf6, 0x2d, 0x2c, 0x08, 0xfd, 0x09, 0x1c, 0x0d, + 0x1f, 0x34, 0x1a, 0xea, 0x27, 0x28, 0x00, 0xe5, 0x1f, 0x4c, 0x1c, 0x06, + 0x06, 0x07, 0x10, 0x1b, 0x06, 0xf9, 0x15, 0x02, 0x0c, 0x0f, 0x00, 0xff, + 0x00, 0xcb, 0xff, 0x1c, 0x0a, 0xf8, 0xef, 0x13, 0x14, 0xec, 0xcb, 0xff, + 0xeb, 0x1f, 0x08, 0xdb, 0xff, 0x08, 0xf0, 0xe3, 0x0b, 0xe0, 0xcf, 0x0f, + 0x20, 0xec, 0xcb, 0xfd, 0xfc, 0xf6, 0xff, 0xc8, 0xcf, 0x17, 0xf0, 0xc8, + 0xdf, 0x07, 0xe4, 0xcf, 0xf7, 0xfa, 0xe0, 0xe7, 0xe3, 0xeb, 0xea, 0xe1, + 0xfe, 0xe0, 0xc1, 0xd3, 0x0c, 0xd4, 0xbf, 0xe3, 0xe3, 0xfd, 0xf0, 0xc7, + 0xff, 0xdd, 0xfd, 0xd2, 0xea, 0xc7, 0x17, 0xf4, 0xe1, 0xd3, 0x07, 0x00, + 0xda, 0xff, 0x12, 0xd8, 0xe3, 0xf7, 0x00, 0xef, 0x1c, 0x0c, 0xe0, 0xef, + 0x18, 0x00, 0xf7, 0x17, 0x02, 0xfe, 0x0a, 0xfa, 0x17, 0x14, 0x07, 0x13, + 0x17, 0x10, 0x0f, 0x14, 0x1f, 0x30, 0x16, 0x05, 0x25, 0x2e, 0x25, 0xf8, + 0x1f, 0x28, 0x10, 0x03, 0x2b, 0x2e, 0x18, 0x04, 0x07, 0x19, 0x1d, 0x37, + 0xf0, 0xe7, 0x3f, 0x20, 0xed, 0x12, 0x26, 0xf0, 0xdb, 0x15, 0xf8, 0xfb, + 0x0a, 0xf9, 0x00, 0xf3, 0xe0, 0xff, 0x09, 0xf0, 0xf5, 0xfb, 0xf4, 0xea, + 0xe3, 0x0d, 0x04, 0xee, 0x09, 0xcc, 0xf7, 0x1a, 0xf0, 0xe7, 0xef, 0xfe, + 0xfc, 0xf7, 0x0a, 0xd3, 0xef, 0x06, 0xf4, 0xf0, 0xd5, 0xfb, 0x00, 0xe6, + 0xff, 0xe4, 0xef, 0xf3, 0x00, 0xff, 0xf0, 0xff, 0x02, 0x0a, 0xd4, 0xef, + 0xff, 0x10, 0xdb, 0x13, 0xea, 0xfc, 0xe7, 0xf4, 0x07, 0x00, 0xfc, 0xe8, + 0xef, 0x13, 0x14, 0xe6, 0xf7, 0x27, 0x00, 0xdb, 0x15, 0x10, 0xea, 0x1f, + 0x18, 0xf2, 0xfb, 0x0f, 0x28, 0xf4, 0x0b, 0x22, 0xf8, 0xff, 0x00, 0xfe, + 0x07, 0x18, 0xf2, 0xf7, 0x1b, 0x0d, 0x1b, 0x00, 0xff, 0x2c, 0x06, 0xf2, + 0x0f, 0x22, 0x20, 0xf0, 0x0f, 0x30, 0x08, 0xea, 0x07, 0x1f, 0x22, 0x0c, + 0xe7, 0x17, 0x31, 0xf4, 0x0f, 0x30, 0x04, 0xfe, 0x2d, 0x10, 0xec, 0x13, + 0x14, 0x09, 0x22, 0x08, 0x17, 0x06, 0x03, 0x15, 0x00, 0xf2, 0x1b, 0x10, + 0x11, 0x07, 0x18, 0x02, 0x10, 0x07, 0x19, 0x12, 0xe3, 0x0a, 0x1f, 0x00, + 0xf7, 0x1f, 0x18, 0xfe, 0xfa, 0x13, 0x0c, 0x03, 0x16, 0x06, 0x04, 0x07, + 0x0a, 0x16, 0xe8, 0xff, 0x00, 0xe9, 0xff, 0x00, 0x0b, 0x0e, 0xf0, 0xff, + 0x08, 0xf8, 0xe0, 0xef, 0x0a, 0xfc, 0x06, 0xe9, 0x0b, 0xfa, 0xf0, 0xef, + 0xfe, 0xf8, 0xec, 0xdf, 0xf9, 0xfd, 0xfc, 0xfa, 0xf1, 0xf1, 0xf5, 0xf9, + 0xe0, 0xfb, 0x06, 0xfb, 0xe9, 0xfe, 0xff, 0x00, 0xf5, 0xff, 0x00, 0xf8, + 0xf5, 0x00, 0xe3, 0x0b, 0x18, 0x10, 0x00, 0x07, 0x04, 0x17, 0x00, 0xfb, + 0x09, 0xff, 0x20, 0xf0, 0x17, 0x18, 0xff, 0x1f, 0x20, 0xef, 0x13, 0xfa, + 0x0f, 0x10, 0x1b, 0x32, 0xfd, 0x1f, 0x22, 0x03, 0x09, 0x1b, 0x18, 0x19, + 0x1d, 0x25, 0x0c, 0x01, 0x1f, 0x28, 0x18, 0x05, 0x1e, 0x12, 0x00, 0x0c, + 0x0b, 0x1b, 0x12, 0x10, 0xf7, 0x2a, 0x12, 0xf5, 0x0d, 0x18, 0xec, 0xf7, + 0x0a, 0xff, 0x0e, 0x0c, 0xfd, 0xfe, 0xf0, 0xfb, 0x0a, 0xf1, 0xf7, 0x10, + 0xf0, 0xe7, 0x06, 0xfe, 0xf0, 0xee, 0xff, 0x03, 0xf2, 0xef, 0xff, 0xf0, + 0xdf, 0xff, 0x00, 0xee, 0xef, 0xe0, 0xe7, 0xef, 0xf3, 0xf9, 0xe4, 0xee, + 0xf3, 0xf8, 0xe6, 0xf0, 0xe5, 0xe4, 0xd3, 0xe5, 0x03, 0xfd, 0xec, 0xd7, + 0xef, 0xf8, 0xe9, 0xe6, 0xe9, 0xe6, 0xf3, 0x05, 0xfc, 0xea, 0xf1, 0xf3, + 0xf8, 0xfd, 0xf0, 0xeb, 0xf2, 0x12, 0x00, 0xee, 0xff, 0x08, 0x01, 0xf8, + 0xfb, 0x11, 0x09, 0x04, 0xef, 0x0f, 0x00, 0x03, 0x00, 0x12, 0x0a, 0x08, + 0x0a, 0xf9, 0xfb, 0xff, 0x01, 0x09, 0x12, 0x0e, 0x09, 0x14, 0x07, 0xfc, + 0x07, 0xfa, 0x05, 0x0e, 0x0d, 0xf9, 0x0d, 0x0c, 0xe7, 0xfb, 0x10, 0x02, + 0x03, 0x02, 0xf8, 0x0c, 0xf6, 0xfd, 0xfc, 0x00, 0xf5, 0x03, 0x10, 0xf6, + 0xdf, 0xff, 0x16, 0xf8, 0xef, 0x0b, 0xf8, 0xe2, 0xff, 0xf4, 0xf3, 0xf1, + 0xf5, 0xe6, 0xf3, 0x05, 0xf8, 0xf5, 0xe8, 0xf1, 0xf7, 0xf8, 0xe0, 0xe7, + 0xf8, 0xe7, 0xf3, 0xea, 0xeb, 0x00, 0xf2, 0xdc, 0xdf, 0xf5, 0xe9, 0xf0, + 0xe9, 0xf6, 0x02, 0xe0, 0xef, 0x0a, 0xe5, 0xf8, 0xe3, 0xf5, 0x00, 0xf8, + 0xf0, 0xe0, 0xef, 0x03, 0xec, 0xe5, 0xf3, 0xfe, 0xfc, 0xed, 0x01, 0xf4, + 0xe8, 0xf3, 0x01, 0xfc, 0x04, 0xe1, 0xfd, 0xfa, 0xf2, 0xe7, 0xf5, 0x07, + 0x08, 0xf8, 0xe8, 0xf6, 0xfb, 0x05, 0x01, 0x09, 0xf8, 0xf3, 0xfd, 0x00, + 0xed, 0xfb, 0x06, 0xf4, 0xf8, 0x02, 0xf8, 0xe8, 0xed, 0x0e, 0xfa, 0xf7, + 0x05, 0x07, 0xf0, 0xf3, 0x06, 0xf9, 0xf7, 0x01, 0xfc, 0xfc, 0xfc, 0xfc, + 0x02, 0xf2, 0xf5, 0xfd, 0x02, 0x0f, 0x04, 0xfb, 0xff, 0x0c, 0x02, 0x02, + 0x00, 0xf7, 0x0f, 0x08, 0x07, 0x03, 0x05, 0x0d, 0x00, 0xff, 0x13, 0x00, + 0x0f, 0x04, 0xfb, 0x08, 0xfe, 0x0a, 0x09, 0xfc, 0xfa, 0x03, 0x08, 0xff, + 0x09, 0x03, 0xf0, 0x03, 0x04, 0xfb, 0xf9, 0xee, 0x07, 0x09, 0xf8, 0xfa, + 0xf2, 0xf3, 0xec, 0xee, 0xf7, 0xff, 0x0c, 0xf4, 0xf2, 0xf7, 0x0c, 0xf2, + 0xf2, 0xf2, 0xf4, 0x02, 0x01, 0xf9, 0xf2, 0xf7, 0xf7, 0xf5, 0xf0, 0xfd, + 0x00, 0xf0, 0xf3, 0xf7, 0xf8, 0xf0, 0x03, 0xf4, 0xf9, 0x03, 0xf1, 0xff, + 0xf2, 0xde, 0xff, 0x04, 0xf5, 0xe8, 0xfd, 0x04, 0xfb, 0xfa, 0x03, 0xfb, + 0xf0, 0xf5, 0xfe, 0xfa, 0x05, 0xf8, 0xff, 0x12, 0x00, 0xf3, 0x05, 0x00, + 0xf7, 0x0a, 0x0a, 0xf8, 0x03, 0xfe, 0x0e, 0x0c, 0x02, 0xf6, 0x07, 0x10, + 0xf8, 0x0b, 0x06, 0xf8, 0xf7, 0x03, 0x0a, 0x09, 0x0b, 0x0b, 0x04, 0x02, + 0xf9, 0xf7, 0x0d, 0x06, 0x03, 0x00, 0xff, 0x06, 0x0f, 0x08, 0x07, 0x00, + 0xf9, 0x0b, 0x13, 0x00, 0x03, 0x0a, 0x00, 0x02, 0x05, 0x05, 0x0d, 0x0f, + 0x0f, 0x0c, 0x07, 0x00, 0x02, 0x03, 0x11, 0x16, 0x0c, 0xf6, 0x07, 0x18, + 0x06, 0x04, 0x08, 0x05, 0x15, 0x0e, 0x06, 0xf7, 0x0e, 0x06, 0x02, 0x03, + 0x07, 0x0a, 0x05, 0x00, 0x07, 0x00, 0x02, 0xfa, 0x06, 0x0e, 0x10, 0xfd, + 0xfd, 0x00, 0xf5, 0x03, 0xfa, 0xfc, 0x04, 0x03, 0xfb, 0x00, 0xfc, 0xfc, + 0x03, 0x04, 0x05, 0x01, 0xf6, 0xff, 0x02, 0xf8, 0xf1, 0xfb, 0x15, 0x0e, + 0xf8, 0xf9, 0x10, 0x02, 0xff, 0x06, 0xf0, 0xfd, 0x12, 0xfa, 0x07, 0xfc, + 0xfb, 0x11, 0x14, 0x00, 0xf9, 0x0d, 0x0b, 0x06, 0x00, 0xf5, 0x01, 0x0a, + 0x08, 0x07, 0x08, 0xfb, 0x0b, 0x0b, 0xf9, 0xff, 0x10, 0x0c, 0x14, 0x05, + 0xf7, 0xff, 0x12, 0x0c, 0x09, 0x12, 0x0c, 0xfc, 0x03, 0x00, 0x0f, 0x14, + 0x16, 0x12, 0xf8, 0xfd, 0x13, 0x1c, 0x0c, 0x11, 0x00, 0x02, 0x12, 0x0d, + 0x0f, 0x18, 0x03, 0x09, 0x12, 0x14, 0x08, 0xff, 0x02, 0x0f, 0x11, 0x07, + 0x05, 0x05, 0xfd, 0x17, 0x0c, 0x00, 0x03, 0x0e, 0x00, 0x07, 0x10, 0x07, + 0x00, 0x03, 0x09, 0x05, 0xf0, 0xf5, 0x0f, 0x18, 0x04, 0x04, 0xff, 0x02, + 0x06, 0x00, 0x01, 0x01, 0x03, 0xfc, 0xff, 0x03, 0x03, 0xf6, 0xf9, 0x01, + 0x0a, 0x04, 0x04, 0xf8, 0xfb, 0xfd, 0xf9, 0xfe, 0x00, 0x07, 0x00, 0xfa, + 0x05, 0x09, 0xf8, 0xfb, 0xfa, 0xf7, 0xf9, 0x04, 0x02, 0x02, 0xf7, 0x09, + 0x06, 0xf0, 0xea, 0xff, 0x00, 0xff, 0x10, 0x00, 0xec, 0xf3, 0xfe, 0x07, + 0x03, 0xf6, 0xff, 0xfe, 0xf4, 0xf8, 0xf7, 0x07, 0x05, 0xfc, 0xf2, 0x0b, + 0x0a, 0xf0, 0xf7, 0x09, 0x01, 0x01, 0xf5, 0xff, 0x05, 0x00, 0xf7, 0xfb, + 0xf8, 0x02, 0x00, 0xf4, 0x06, 0x09, 0xfd, 0x02, 0x00, 0x00, 0xf8, 0xfa, + 0xfe, 0xfc, 0xfd, 0x00, 0x01, 0x03, 0x04, 0x08, 0xf6, 0xf5, 0x0e, 0x00, + 0xf6, 0x09, 0x08, 0xf3, 0xff, 0x07, 0x09, 0x06, 0xfd, 0x07, 0x07, 0x05, + 0xff, 0xfd, 0x09, 0x0c, 0x0a, 0x07, 0x0a, 0x02, 0xfa, 0xff, 0x02, 0x0d, + 0x10, 0x08, 0xfb, 0xfd, 0x04, 0x07, 0x08, 0xfa, 0xfe, 0x05, 0xfc, 0xf9, + 0xfb, 0x03, 0x04, 0xf7, 0xf6, 0xf2, 0xf7, 0x04, 0x04, 0xfa, 0xf2, 0xf5, + 0xff, 0xfa, 0xea, 0xef, 0xfc, 0xf4, 0xee, 0x02, 0xf4, 0xef, 0xf1, 0xee, + 0xf9, 0xfe, 0xf7, 0xf1, 0xed, 0xf7, 0xfd, 0xfb, 0xf8, 0xf6, 0xf6, 0xef, + 0xf0, 0xf7, 0x05, 0xfd, 0xf6, 0xef, 0xf7, 0xf7, 0xfa, 0xed, 0xf5, 0xfe, + 0x00, 0xf5, 0xf6, 0xf4, 0xf5, 0xfc, 0xf9, 0xfa, 0xee, 0xf8, 0xf2, 0xf5, + 0xfb, 0x02, 0x04, 0xf4, 0xfb, 0xf0, 0xed, 0xfb, 0x03, 0x02, 0xfc, 0xf0, + 0xfb, 0x07, 0x00, 0xf0, 0xf7, 0x03, 0x02, 0x02, 0x00, 0xff, 0xfe, 0xf8, + 0xfa, 0x03, 0xfe, 0x05, 0x08, 0xfc, 0x05, 0x00, 0xf7, 0xf5, 0xf9, 0x08, + 0x00, 0x00, 0x02, 0x04, 0xf8, 0xf3, 0xf5, 0x09, 0x0a, 0x00, 0xfa, 0xfb, + 0xf8, 0xef, 0xf8, 0xff, 0x02, 0xfd, 0xfd, 0xfc, 0xed, 0xef, 0x01, 0x01, + 0x00, 0xec, 0xeb, 0x07, 0x0c, 0xf2, 0xff, 0x00, 0xf7, 0xfd, 0xfc, 0xf4, + 0xfe, 0x0a, 0xf4, 0xe6, 0x07, 0x0a, 0xf0, 0xf7, 0x04, 0x04, 0x04, 0xf8, + 0xff, 0x00, 0xf9, 0xf3, 0xfa, 0x03, 0x00, 0x03, 0x00, 0xf4, 0xee, 0xf2, + 0x0f, 0x08, 0xf8, 0xea, 0xef, 0x07, 0x04, 0xfd, 0xf6, 0xe6, 0xfd, 0x08, + 0xf1, 0xf5, 0x03, 0xfa, 0xf2, 0xfa, 0xf2, 0xff, 0xfc, 0xfa, 0xf8, 0xf1, + 0xfe, 0xf8, 0xf7, 0x08, 0xf4, 0xf5, 0xfb, 0xf9, 0xf2, 0xfa, 0xf5, 0xf9, + 0xf7, 0xf0, 0xff, 0x09, 0xf4, 0xf1, 0xfe, 0xf8, 0xef, 0x03, 0x00, 0xf8, + 0xff, 0x00, 0xf8, 0xf0, 0xfd, 0x0a, 0xfe, 0xfd, 0xf6, 0xf4, 0x07, 0x02, + 0xf5, 0xfb, 0xfc, 0x06, 0x03, 0xfe, 0x07, 0x0a, 0x00, 0xf2, 0x05, 0x06, + 0xff, 0x0b, 0x0a, 0xfc, 0xff, 0x0d, 0x09, 0x05, 0xfe, 0x0d, 0xf9, 0x06, + 0x04, 0xfe, 0x0d, 0x0c, 0x00, 0xf6, 0x03, 0x06, 0x07, 0x04, 0x05, 0x0d, + 0x08, 0xfa, 0xff, 0xf9, 0xfb, 0x0b, 0x04, 0xff, 0x02, 0x06, 0xfd, 0xff, + 0xfa, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x06, 0x01, 0xfa, 0xf6, 0x0a, 0x00, + 0xf9, 0xff, 0xfe, 0xf2, 0xff, 0x0e, 0xf8, 0xf9, 0xf6, 0xf9, 0x05, 0x01, + 0xf1, 0xf6, 0xff, 0x02, 0xfc, 0xf2, 0xfd, 0xf4, 0xec, 0xfb, 0x09, 0xf6, + 0xf4, 0xfb, 0xfc, 0x00, 0xf4, 0xf5, 0x08, 0xf6, 0xf3, 0x03, 0x02, 0xf6, + 0xf0, 0xf3, 0xfe, 0x08, 0xfb, 0xf8, 0xef, 0xfd, 0x04, 0xf1, 0xff, 0x0b, + 0x00, 0xf2, 0xff, 0x02, 0x05, 0x06, 0x00, 0xf2, 0x07, 0x0e, 0xf8, 0x0b, + 0x0c, 0xf6, 0x05, 0x10, 0x08, 0xfc, 0xf5, 0x0d, 0x12, 0x04, 0xf9, 0x0b, + 0x12, 0x02, 0x08, 0x02, 0x07, 0x11, 0x04, 0x0d, 0x0a, 0x02, 0xfe, 0xfd, + 0xfe, 0x0b, 0x08, 0x03, 0x0f, 0x09, 0xfa, 0xf3, 0x07, 0x03, 0x02, 0x02, + 0xff, 0x09, 0x0a, 0x05, 0x03, 0xff, 0xfd, 0xfc, 0x02, 0xfd, 0x01, 0x08, + 0x00, 0xfa, 0x01, 0x04, 0x00, 0xf7, 0x0c, 0x08, 0xfd, 0x0c, 0x04, 0x01, + 0xf1, 0x07, 0x0a, 0xfc, 0x06, 0x03, 0x07, 0x05, 0x00, 0xf8, 0xfb, 0x04, + 0x00, 0x02, 0xfe, 0x00, 0x05, 0xfc, 0xfa, 0x02, 0x04, 0xf9, 0xff, 0x0a, + 0x02, 0xf0, 0xfc, 0x03, 0x07, 0xfc, 0xfc, 0xf3, 0xff, 0x09, 0xff, 0x05, + 0xf8, 0xfb, 0x09, 0x04, 0xf4, 0xed, 0xff, 0x0b, 0x08, 0x00, 0xf3, 0x05, + 0x08, 0xff, 0x00, 0xee, 0xfa, 0x0e, 0x02, 0xfa, 0x07, 0x06, 0xf4, 0xf5, + 0xf8, 0xff, 0x0b, 0x0a, 0xf4, 0xfd, 0x0b, 0x05, 0xf7, 0x02, 0xfc, 0xfa, + 0xf9, 0xfa, 0x09, 0x0b, 0x09, 0xf8, 0xef, 0x0d, 0x08, 0xf1, 0x0b, 0x10, + 0xfc, 0xf5, 0x07, 0x0e, 0xfa, 0xfb, 0x0e, 0x00, 0x02, 0x04, 0x07, 0x06, + 0x00, 0xff, 0x13, 0x00, 0xf9, 0x05, 0x06, 0x05, 0x05, 0x05, 0x02, 0x00, + 0x03, 0x09, 0x00, 0xf1, 0x05, 0x06, 0x06, 0x0d, 0xfa, 0xfb, 0x02, 0xfd, + 0xf4, 0xff, 0x0a, 0x00, 0xf8, 0xf8, 0xf8, 0xfd, 0x0a, 0xf9, 0xf1, 0xfc, + 0xfa, 0xf9, 0xfe, 0xf9, 0xfa, 0xfc, 0xfb, 0xf6, 0xef, 0xff, 0x00, 0xfd, + 0xf9, 0xfa, 0xfe, 0xf7, 0xf1, 0xf5, 0xf9, 0xfb, 0xff, 0xf8, 0xfa, 0x03, + 0x00, 0xed, 0xf7, 0xf5, 0xff, 0x04, 0xf4, 0xff, 0xff, 0xfb, 0xf5, 0xf9, + 0xf0, 0xf7, 0xfb, 0xf9, 0x0b, 0x04, 0xf3, 0xfa, 0xfc, 0xfb, 0xf0, 0xfd, + 0x0c, 0x01, 0xfa, 0xf0, 0xff, 0x04, 0xfd, 0xfa, 0xf8, 0xfb, 0xfe, 0x0a, + 0x0a, 0x04, 0xf4, 0xfa, 0xff, 0xff, 0x03, 0x02, 0xf7, 0x0d, 0x0c, 0xec, + 0xfd, 0x18, 0xf8, 0xf5, 0x11, 0x06, 0xf4, 0x03, 0x04, 0x02, 0x0a, 0x02, + 0xfd, 0xfd, 0xf6, 0xf7, 0x01, 0x09, 0x0a, 0x05, 0xfa, 0xf6, 0x05, 0x02, + 0x06, 0xf6, 0xfd, 0x04, 0x00, 0xf6, 0x02, 0x04, 0x01, 0xfe, 0xff, 0xfb, + 0xf9, 0xf9, 0xf8, 0xfa, 0xff, 0x06, 0xfe, 0xff, 0x01, 0xfc, 0xf8, 0xf5, + 0xfe, 0x00, 0x06, 0x00, 0xf3, 0xff, 0x01, 0xf5, 0x07, 0x04, 0xf4, 0xff, + 0x00, 0x00, 0xfb, 0xfd, 0x00, 0xff, 0xf2, 0xf9, 0x0c, 0x05, 0x03, 0x08, + 0xf6, 0xfd, 0x02, 0xfc, 0xfe, 0x06, 0x00, 0xf1, 0x09, 0x0c, 0xfc, 0xfa, + 0xf9, 0x03, 0x03, 0x01, 0xf8, 0xf5, 0x0a, 0x0b, 0xf6, 0xf5, 0x06, 0x05, + 0xf3, 0xff, 0x09, 0xfa, 0xff, 0x01, 0xfb, 0x09, 0x08, 0xfe, 0xfa, 0xf5, + 0xff, 0x04, 0xfe, 0xff, 0x06, 0xfa, 0xf9, 0x05, 0x02, 0xfe, 0xf8, 0xfa, + 0x07, 0x06, 0xfa, 0xf4, 0xfd, 0x03, 0xff, 0xf4, 0xf9, 0x0a, 0x04, 0xee, + 0xfd, 0x06, 0x00, 0xfa, 0xfa, 0xed, 0xff, 0x10, 0x04, 0xf4, 0xed, 0xff, + 0x0b, 0x02, 0xf8, 0xf7, 0x01, 0x06, 0x00, 0xfb, 0x09, 0x05, 0x02, 0x05, + 0xfa, 0x00, 0xfe, 0x06, 0x05, 0x0b, 0x08, 0x00, 0xf9, 0x0a, 0x0e, 0x00, + 0x02, 0x0c, 0x00, 0xf7, 0x13, 0x0a, 0x04, 0x06, 0x05, 0xfb, 0xff, 0x06, + 0x10, 0x04, 0xf8, 0xf4, 0xff, 0x0e, 0x04, 0x00, 0xfd, 0xf7, 0x07, 0x06, + 0xf6, 0xfa, 0x0b, 0xfc, 0xff, 0x05, 0xf6, 0xf9, 0x05, 0x05, 0x02, 0xf3, + 0xff, 0x02, 0xf3, 0x07, 0x04, 0xfb, 0xfd, 0x05, 0xfd, 0xf6, 0xf4, 0xfa, + 0xff, 0x08, 0xfc, 0xfb, 0x06, 0x05, 0xf8, 0xff, 0xf8, 0xf2, 0xff, 0x04, + 0xfe, 0x03, 0x03, 0x00, 0xf7, 0xfe, 0xfa, 0xf9, 0x05, 0x04, 0xf7, 0x05, + 0x05, 0xf6, 0xfa, 0x0b, 0x10, 0xfc, 0xff, 0x04, 0x02, 0x06, 0xfa, 0xfb, + 0x0b, 0x02, 0x00, 0xf5, 0x03, 0x10, 0x08, 0x05, 0xfc, 0xff, 0x12, 0x04, + 0x00, 0xf6, 0x05, 0x14, 0x08, 0x06, 0x04, 0xfb, 0x02, 0x03, 0x00, 0xfe, + 0x17, 0x10, 0xfc, 0x09, 0x04, 0xff, 0x03, 0x01, 0xf9, 0xff, 0x03, 0x01, + 0x07, 0x04, 0x07, 0x08, 0xf9, 0xf5, 0xfb, 0x04, 0x00, 0x09, 0x05, 0xf0, + 0x0f, 0x10, 0xf8, 0xf8, 0xf6, 0xff, 0x02, 0x01, 0x00, 0xfb, 0x05, 0x06, + 0xf6, 0xf1, 0xfc, 0xff, 0x07, 0x06, 0xff, 0xfb, 0xfc, 0xfd, 0x02, 0xf8, + 0xf5, 0x06, 0x04, 0xf1, 0xff, 0x0a, 0xf2, 0xee, 0x0b, 0x08, 0xfd, 0xfe, + 0xf6, 0x05, 0x07, 0xfa, 0xfd, 0xfe, 0xf7, 0xff, 0xf4, 0xf5, 0x03, 0x0b, + 0x00, 0xf3, 0x0e, 0x08, 0xf9, 0x01, 0xfe, 0x06, 0xfa, 0xf5, 0xfe, 0x02, + 0x00, 0xf7, 0xff, 0x03, 0x0b, 0x03, 0x02, 0x01, 0x02, 0xfc, 0xf9, 0x09, + 0x05, 0xf8, 0xfe, 0x04, 0xfd, 0xfe, 0xff, 0x07, 0x0e, 0xf8, 0xfb, 0x0c, + 0x03, 0x01, 0xf5, 0xff, 0x0a, 0xf8, 0xf7, 0x04, 0x00, 0xfb, 0x05, 0x01, + 0xf9, 0xfb, 0xfe, 0xf9, 0xfc, 0xfe, 0x04, 0x00, 0xf5, 0xfb, 0x00, 0xfb, + 0x07, 0x00, 0xf0, 0xed, 0x09, 0x02, 0xfb, 0x0d, 0x00, 0xf7, 0x04, 0xfc, + 0xf6, 0xf5, 0x02, 0x00, 0xfe, 0xfd, 0xf9, 0xf5, 0x05, 0x07, 0xf8, 0xf7, + 0x04, 0x02, 0x02, 0xfc, 0xf7, 0x00, 0x01, 0xfc, 0xf5, 0xfd, 0x06, 0x00, + 0xf6, 0xf7, 0x0a, 0x05, 0xf8, 0xfd, 0x0a, 0x06, 0xfd, 0x06, 0x08, 0xf4, + 0xfc, 0x01, 0x0a, 0x00, 0xf7, 0x06, 0x00, 0xfa, 0xfc, 0x00, 0xfc, 0xfe, + 0x05, 0xfe, 0x02, 0x00, 0xff, 0x0a, 0xf5, 0xff, 0x01, 0xf8, 0xf8, 0xf8, + 0x02, 0xff, 0x05, 0xfd, 0x01, 0xf3, 0x05, 0x00, 0xf6, 0xff, 0x00, 0x05, + 0x02, 0xfd, 0x00, 0xf3, 0xfb, 0x09, 0x02, 0xf2, 0xef, 0x05, 0x00, 0xfb, + 0x02, 0xfb, 0xfc, 0xfd, 0xf5, 0xf3, 0xfd, 0x02, 0x02, 0x00, 0xf0, 0xeb, + 0x0e, 0x04, 0xf6, 0xfe, 0xf4, 0xf5, 0x00, 0xf8, 0xfb, 0x05, 0x00, 0xea, + 0xf7, 0xff, 0xfc, 0xf0, 0xef, 0x09, 0x0a, 0xf0, 0xf7, 0x05, 0xfa, 0xfd, + 0x00, 0xf3, 0xfa, 0xf5, 0xfa, 0xfe, 0xfc, 0x04, 0x08, 0xfa, 0xfb, 0x03, + 0xfa, 0xfa, 0xf5, 0x05, 0x02, 0xff, 0xf4, 0xff, 0x08, 0xff, 0x01, 0x03, + 0xf9, 0xfc, 0xfe, 0xfe, 0x06, 0xfa, 0xf3, 0xf9, 0x08, 0x04, 0xfe, 0xfb, + 0xfc, 0xf7, 0x05, 0xfc, 0xf2, 0x03, 0x00, 0xfe, 0xfe, 0xf4, 0xf0, 0xf9, + 0x04, 0xee, 0xff, 0x12, 0xf8, 0xe7, 0x0a, 0x02, 0xf2, 0x07, 0x06, 0xf2, + 0xf7, 0x04, 0x04, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xf8, 0xef, 0xff, 0x05, + 0x01, 0x0b, 0x04, 0xfc, 0xf0, 0xef, 0xff, 0x0b, 0x06, 0xfc, 0xf5, 0x03, + 0x06, 0x00, 0xf1, 0xfe, 0x06, 0x01, 0xfc, 0xf7, 0xff, 0xff, 0x00, 0x03, + 0x04, 0xf8, 0xf6, 0xff, 0x00, 0xfa, 0xfd, 0xfa, 0x06, 0x00, 0xff, 0x03, + 0x00, 0xf5, 0x06, 0x00, 0xfb, 0x04, 0xf8, 0xff, 0x01, 0xfd, 0x04, 0xf6, + 0xff, 0x06, 0xfd, 0x01, 0xfb, 0xf7, 0xfb, 0x00, 0xf8, 0xf2, 0xff, 0x0a, + 0x02, 0xf3, 0xf5, 0x0d, 0x0b, 0xf9, 0xff, 0x03, 0xfd, 0xff, 0x06, 0x02, + 0xf6, 0xff, 0x04, 0xf8, 0x0e, 0x08, 0xfc, 0xfa, 0x06, 0xfe, 0x05, 0x06, + 0x00, 0xf9, 0xfa, 0x02, 0x06, 0xfe, 0x02, 0x0b, 0x00, 0xee, 0x0e, 0x0f, + 0xfd, 0xfd, 0xf8, 0x05, 0x05, 0xf8, 0x0c, 0x00, 0xf6, 0x00, 0x0d, 0x01, + 0x00, 0x02, 0x00, 0xfe, 0xf7, 0xfe, 0x09, 0x00, 0xfb, 0x0a, 0x09, 0xf3, + 0xf4, 0x0c, 0x0b, 0xfc, 0x04, 0x00, 0xfb, 0xfd, 0x01, 0x01, 0xfa, 0xfc, + 0x03, 0x05, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, 0xfd, + 0x03, 0xfd, 0xfa, 0xfb, 0xf8, 0xfc, 0x05, 0x05, 0xfd, 0xf9, 0x05, 0x00, + 0xf9, 0xff, 0xfb, 0x00, 0x05, 0xfd, 0xf7, 0x01, 0x00, 0x00, 0xfd, 0xfc, + 0x01, 0x00, 0xfa, 0xfb, 0x00, 0xfc, 0x04, 0x04, 0x05, 0x03, 0xfd, 0xf8, + 0x00, 0x05, 0xfd, 0x00, 0x03, 0x01, 0x02, 0xfe, 0xfe, 0x00, 0xf6, 0xfd, + 0x07, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0xfe, 0x00, 0x02, 0x00, 0xfe, + 0x02, 0xfe, 0x00, 0x0d, 0x04, 0x00, 0xf9, 0xfb, 0x01, 0x08, 0x07, 0x04, + 0x00, 0xf7, 0xfd, 0x04, 0x04, 0x00, 0x02, 0xfa, 0x00, 0x06, 0x02, 0xfe, + 0xfa, 0x03, 0x05, 0xfe, 0xfc, 0x05, 0x00, 0xfb, 0x03, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x01, 0xfd, 0x00, 0x05, 0x00, 0xff, 0x01, 0x03, 0x05, 0x00, + 0x00, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0xfe, + 0x02, 0x07, 0x00, 0xf9, 0xfe, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x06, 0x05, 0xfe, 0xfd, 0xfe, 0x01, 0x02, 0x01, 0x02, 0x02, + 0xfb, 0xfa, 0xfe, 0x01, 0x01, 0x04, 0xfd, 0xfe, 0x03, 0x01, 0xfc, 0xfe, + 0x01, 0x01, 0x00, 0xf9, 0x01, 0x01, 0xfe, 0xfd, 0x00, 0xfd, 0x00, 0x06, + 0x00, 0xf8, 0x02, 0x00, 0xfc, 0x03, 0x00, 0xfe, 0xfd, 0xff, 0xff, 0x01, + 0x00, 0x02, 0xfd, 0xfa, 0xfe, 0x03, 0x05, 0x00, 0xfd, 0x00, 0x00, 0xfd, + 0xfc, 0x01, 0x04, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x04, 0x01, 0xfe, 0xfe, + 0xff, 0x00, 0x04, 0x00, 0xff, 0xfd, 0x01, 0x02, 0xfe, 0xff, 0xfd, 0x03, + 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x01, 0xfe, 0xfd, 0xfe, 0x01, 0xff, + 0x00, 0x02, 0xfe, 0xfd, 0x03, 0x00, 0xff, 0xfd, 0xfd, 0x02, 0x00, 0xfe, + 0xfd, 0x00, 0x02, 0xfd, 0x00, 0x01, 0xfd, 0xfe, 0x04, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0xff, 0xfe, 0xfd, 0x01, 0x02, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xfd, 0xff, 0x01, 0xff, 0x01, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, + 0x01, 0x01, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, 0x01, 0x01, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, 0xf6, 0x03, 0x30, 0x32, 0x07, 0xca, + 0xba, 0xfd, 0x20, 0x54, 0x20, 0x01, 0xc9, 0x1b, 0x01, 0xf4, 0x36, 0x20, + 0x54, 0x3b, 0xf2, 0xc9, 0xa3, 0x03, 0x48, 0x49, 0xfd, 0xc1, 0xb3, 0x09, + 0x27, 0x42, 0x0c, 0x03, 0xa3, 0xf4, 0x27, 0x5b, 0xf6, 0xf6, 0xe4, 0x0c, + 0x07, 0x46, 0x44, 0x0e, 0xdc, 0x1c, 0xdb, 0xf9, 0x22, 0xd5, 0xce, 0xcc, + 0xfb, 0xf6, 0x1b, 0xe4, 0xcc, 0xf7, 0xe7, 0xf0, 0xee, 0xd9, 0xcc, 0xd2, + 0xf0, 0x1c, 0xdc, 0xf9, 0xed, 0x09, 0xdb, 0x1b, 0xe4, 0xb1, 0xbe, 0x19, + 0xed, 0xca, 0xff, 0xbe, 0xa1, 0x9f, 0x8f, 0x80, 0xd3, 0x13, 0x0c, 0xcc, + 0xd9, 0xdb, 0xf9, 0x05, 0xf7, 0xd2, 0xce, 0xc3, 0xba, 0xeb, 0xc1, 0xfd, + 0x07, 0xcc, 0xd5, 0xc1, 0x10, 0xd7, 0x17, 0x19, 0x05, 0xd2, 0x03, 0x2e, + 0xe0, 0xf6, 0x13, 0x15, 0x09, 0x22, 0xe5, 0x29, 0x1e, 0x10, 0xf4, 0x1c, + 0x03, 0x22, 0xf6, 0x1c, 0xf2, 0x2e, 0x32, 0x29, 0x07, 0x0a, 0x01, 0x22, + 0x10, 0x1e, 0x15, 0x1b, 0x34, 0x4d, 0x52, 0x49, 0x2d, 0x5b, 0x1b, 0x48, + 0x05, 0x48, 0x37, 0x4f, 0x36, 0x1c, 0x30, 0x30, 0x30, 0x5b, 0x20, 0x2e, + 0x03, 0x42, 0xff, 0x37, 0x42, 0x39, 0x49, 0x27, 0x13, 0x0a, 0x44, 0x34, + 0x58, 0x0a, 0x20, 0x4d, 0x1e, 0x3b, 0x00, 0x10, 0x49, 0x42, 0x03, 0xfb, + 0x0e, 0x3d, 0x20, 0x19, 0x1b, 0xdc, 0x1c, 0x29, 0x1c, 0xf4, 0x22, 0x05, + 0xdc, 0x0c, 0x2e, 0x24, 0x03, 0xe9, 0xc1, 0x01, 0xc9, 0x22, 0x1b, 0xe5, + 0xb3, 0xd7, 0x07, 0xf0, 0xc9, 0xde, 0xcc, 0x03, 0xf4, 0x00, 0xd5, 0x05, + 0xcc, 0xd0, 0xe7, 0xc1, 0xd0, 0xd9, 0xe9, 0xc5, 0xce, 0xd0, 0xb3, 0xca, + 0xc9, 0xca, 0xc0, 0xe9, 0xce, 0x9f, 0x9a, 0xd0, 0xbe, 0xbc, 0xc3, 0xbc, + 0x98, 0xb3, 0xca, 0xd2, 0xaf, 0xcc, 0xa8, 0xcc, 0xc7, 0xc7, 0xbc, 0xc5, + 0xd0, 0xb1, 0xb1, 0xd2, 0xe0, 0xeb, 0xee, 0xbc, 0xca, 0xa5, 0xd5, 0xf6, + 0x09, 0xe4, 0xd0, 0xd9, 0x00, 0xe0, 0xd5, 0xe0, 0xee, 0xf7, 0xd9, 0xf7, + 0xe4, 0xe0, 0xfb, 0xbe, 0xc0, 0x05, 0x17, 0xe7, 0xcc, 0xde, 0xdc, 0xce, + 0xf7, 0x0e, 0x00, 0xed, 0x01, 0xed, 0xf0, 0x0a, 0x07, 0xfb, 0x09, 0xfb, + 0x0a, 0x05, 0x20, 0x1c, 0x07, 0xf4, 0x09, 0x0c, 0x39, 0x27, 0xf2, 0xfb, + 0x1b, 0x3f, 0x2b, 0x42, 0x24, 0x29, 0x17, 0x4b, 0x32, 0x1b, 0x27, 0x51, + 0x48, 0x3b, 0x36, 0x39, 0x2e, 0x27, 0x15, 0x29, 0x3f, 0x5a, 0x2b, 0x22, + 0x25, 0x1e, 0x32, 0x42, 0x2d, 0x05, 0x20, 0x13, 0x22, 0x32, 0x13, 0x03, + 0x15, 0x15, 0x2b, 0x1b, 0x13, 0x1c, 0x27, 0x1b, 0x42, 0x34, 0x27, 0x2e, + 0x2e, 0xed, 0x1c, 0x3b, 0x30, 0x29, 0x3b, 0x32, 0x24, 0x22, 0x2b, 0x07, + 0x1e, 0x39, 0x30, 0x2d, 0x46, 0x40, 0x29, 0x24, 0x32, 0x2d, 0x19, 0x19, + 0x20, 0x1b, 0x17, 0x0c, 0xfb, 0x05, 0x10, 0x00, 0xff, 0x0a, 0xde, 0xfd, + 0x05, 0x0c, 0xee, 0x0c, 0x0c, 0xeb, 0x15, 0x2e, 0x03, 0xdc, 0xe9, 0x0a, + 0x00, 0x24, 0x24, 0xf9, 0x05, 0xff, 0xe2, 0xff, 0x27, 0x22, 0xeb, 0xf9, + 0x2d, 0x0c, 0xf7, 0xeb, 0xe5, 0xfb, 0x13, 0xf0, 0xde, 0xed, 0xe2, 0xca, + 0xce, 0xe7, 0x01, 0x19, 0xfb, 0xc5, 0xaf, 0xe0, 0xee, 0xcc, 0xd0, 0xeb, + 0xfd, 0xf7, 0xdc, 0xc3, 0xac, 0xd0, 0xf2, 0xde, 0xd2, 0xe7, 0xbe, 0xa1, + 0xc0, 0xdb, 0xd9, 0xde, 0xe0, 0xb3, 0x9c, 0xc5, 0xdc, 0xdb, 0xc9, 0xcc, + 0xb8, 0xcc, 0xe9, 0xee, 0xc9, 0xb3, 0xb7, 0xba, 0xc0, 0xdc, 0xf7, 0xd9, + 0xc9, 0xcc, 0xc3, 0xb3, 0xdb, 0xeb, 0xe5, 0xdb, 0xd3, 0xc9, 0xc5, 0xee, + 0xf6, 0xe9, 0xe2, 0xcc, 0xba, 0xd9, 0x03, 0xe5, 0xbc, 0xb8, 0xd3, 0x09, + 0x01, 0xca, 0xb1, 0xd5, 0xf2, 0xd0, 0xce, 0xdc, 0xd9, 0xf2, 0x03, 0xd9, + 0xc5, 0x00, 0x0e, 0x05, 0xf4, 0x07, 0x05, 0xfb, 0x0a, 0x05, 0xf0, 0x03, + 0x24, 0x24, 0x09, 0xed, 0xee, 0x05, 0x1b, 0x10, 0x17, 0x1e, 0x10, 0xfd, + 0x19, 0x13, 0xff, 0x22, 0x20, 0x01, 0x17, 0x2e, 0x1b, 0x05, 0x05, 0xf4, + 0xf6, 0x00, 0x17, 0x17, 0x07, 0x0a, 0x03, 0x0e, 0x22, 0x34, 0x29, 0x01, + 0x15, 0x37, 0x46, 0x44, 0x37, 0x25, 0x2e, 0x3b, 0x22, 0x17, 0x1c, 0x0e, + 0x22, 0x3b, 0xf9, 0x00, 0x3d, 0x46, 0x0a, 0xf0, 0x15, 0x1e, 0x30, 0x4d, + 0x24, 0x0a, 0x27, 0x34, 0x13, 0x17, 0x42, 0x37, 0x29, 0x29, 0x25, 0x1e, + 0x20, 0x29, 0x19, 0x00, 0x01, 0x10, 0x39, 0x3f, 0x19, 0xfd, 0x39, 0x4d, + 0x27, 0x10, 0x17, 0x24, 0x01, 0xfd, 0x03, 0x12, 0x24, 0x20, 0x17, 0x1b, + 0x0c, 0xeb, 0xf4, 0x17, 0x24, 0x0c, 0x13, 0x27, 0xf7, 0xeb, 0x17, 0x2e, + 0x0a, 0x0c, 0x29, 0x0a, 0x01, 0x17, 0x34, 0x27, 0x13, 0xf7, 0xee, 0x15, + 0x24, 0x0e, 0x13, 0x07, 0xeb, 0xee, 0xff, 0xff, 0x12, 0xfd, 0x00, 0xf9, + 0xd3, 0xde, 0x00, 0x1b, 0x13, 0xe0, 0xd2, 0xdc, 0xe4, 0x09, 0x0c, 0xcc, + 0xc5, 0x01, 0x1b, 0x12, 0xe0, 0xc5, 0xc5, 0xe0, 0xeb, 0xf6, 0x03, 0xed, + 0xe5, 0x19, 0xf4, 0xc9, 0xee, 0x2e, 0x03, 0xe2, 0xd5, 0xd0, 0xe2, 0xff, + 0xfd, 0xe0, 0xe5, 0xe9, 0xed, 0xf9, 0xe2, 0xba, 0xaf, 0xcc, 0xf4, 0x05, + 0xfd, 0xcc, 0xb1, 0xd3, 0x03, 0x01, 0xce, 0xb8, 0xe9, 0xe0, 0xf0, 0xf6, + 0xb3, 0xb5, 0xe7, 0xff, 0x07, 0xe5, 0xd5, 0xd0, 0xf2, 0x17, 0xf2, 0xe4, + 0xf2, 0xfd, 0xdb, 0xd7, 0xde, 0xc5, 0xbe, 0xf2, 0x01, 0xe2, 0xe7, 0x1b, + 0xe2, 0xcc, 0xfb, 0xff, 0xba, 0xca, 0xff, 0x17, 0x03, 0xce, 0xc5, 0xf0, + 0x19, 0x09, 0xeb, 0xcc, 0xcc, 0xfb, 0x1b, 0x12, 0xd9, 0xd3, 0x19, 0x17, + 0xe0, 0xc3, 0xd7, 0x09, 0x1b, 0x05, 0xce, 0xd2, 0xf2, 0x13, 0x24, 0x07, + 0xcc, 0xd3, 0x05, 0xfd, 0xd7, 0x2e, 0x17, 0xdc, 0xee, 0x1b, 0xf0, 0x05, + 0x0a, 0xe7, 0x00, 0x05, 0xe7, 0xfd, 0x07, 0x1c, 0xfd, 0xd9, 0xd5, 0xf7, + 0x1b, 0x29, 0x1c, 0xe7, 0xd2, 0xe9, 0x29, 0x36, 0x0e, 0xf0, 0x0c, 0xff, + 0xe9, 0xe0, 0xe7, 0x01, 0x24, 0x27, 0xf4, 0xce, 0xe4, 0x05, 0x1e, 0x2b, + 0x03, 0xd5, 0xe5, 0x1e, 0x36, 0x19, 0xee, 0xde, 0xe2, 0x1b, 0x2d, 0x12, + 0x00, 0xde, 0xd9, 0x10, 0x24, 0x01, 0x00, 0x1e, 0x0e, 0x01, 0xfb, 0xd3, + 0xf2, 0x27, 0x34, 0x1b, 0xff, 0x05, 0xe9, 0xf9, 0x15, 0xf6, 0xf6, 0x34, + 0x29, 0xe5, 0xd0, 0x03, 0x12, 0x12, 0x39, 0x0c, 0xdb, 0xff, 0x40, 0x3d, + 0x0e, 0xe5, 0xe4, 0x0a, 0x3d, 0x2d, 0x0e, 0xf0, 0xd9, 0xfb, 0x20, 0x30, + 0x39, 0x13, 0xfb, 0xed, 0x12, 0x2b, 0x10, 0xfb, 0x1b, 0x39, 0x03, 0xfd, + 0x0e, 0x01, 0x1c, 0x0c, 0xd7, 0xf4, 0x1c, 0x25, 0x22, 0x10, 0xe4, 0x01, + 0x39, 0x42, 0x12, 0xed, 0xf2, 0x03, 0x10, 0x2d, 0x15, 0x0a, 0x15, 0xf6, + 0x15, 0x3f, 0xfd, 0xd9, 0x01, 0x2b, 0x1e, 0x07, 0x29, 0x19, 0x09, 0x51, + 0x20, 0xf7, 0xf0, 0x20, 0x3f, 0x30, 0x1b, 0x07, 0xfd, 0x07, 0x24, 0xf0, + 0xe4, 0x0e, 0x24, 0x2e, 0x01, 0xdb, 0x0a, 0x2e, 0x3d, 0x2d, 0xfb, 0xe7, + 0xf4, 0x27, 0x3d, 0x0c, 0xdb, 0x13, 0x22, 0x12, 0x40, 0x25, 0xee, 0xf7, + 0x3b, 0x13, 0xeb, 0x37, 0x46, 0x19, 0x09, 0x05, 0xee, 0xf0, 0x25, 0x36, + 0xf7, 0xd5, 0xee, 0x0c, 0x12, 0x22, 0x24, 0xf0, 0xd5, 0xee, 0x24, 0x22, + 0xe9, 0xd0, 0xfb, 0xff, 0xff, 0x2b, 0x15, 0xe0, 0xce, 0x07, 0x15, 0xd3, + 0x01, 0x2d, 0x0e, 0xf4, 0xed, 0xdc, 0xde, 0x10, 0x25, 0x17, 0xf4, 0xe9, + 0xd9, 0xdc, 0x00, 0x01, 0xd9, 0xc7, 0x05, 0x0e, 0xce, 0xb3, 0xcc, 0xed, + 0x03, 0x12, 0xe9, 0xba, 0xcc, 0x07, 0x15, 0xe4, 0xb7, 0xcc, 0xf9, 0x0e, + 0xf6, 0xc7, 0xaf, 0xc0, 0xf9, 0x03, 0xd0, 0xb7, 0x03, 0xfd, 0xc7, 0xae, + 0xd3, 0x00, 0x09, 0xfd, 0xcc, 0xb8, 0xce, 0x0a, 0x13, 0xe7, 0xca, 0xcc, + 0xc5, 0xd2, 0x01, 0x03, 0xcc, 0xae, 0xc0, 0xe4, 0xf2, 0xee, 0xf0, 0xd5, + 0xba, 0xdc, 0x0e, 0xee, 0xb1, 0xd7, 0x19, 0xfb, 0xcc, 0xc7, 0xd2, 0xd0, + 0xf4, 0x0e, 0xde, 0xae, 0xd9, 0xff, 0x07, 0xf6, 0xce, 0xde, 0x13, 0x17, + 0xee, 0xd2, 0xed, 0xf7, 0xd7, 0x0a, 0x0a, 0xd5, 0xdb, 0xf9, 0xf2, 0xd2, + 0xb7, 0xd9, 0xfb, 0x0c, 0x10, 0xf2, 0xd5, 0xc5, 0xff, 0x22, 0x0e, 0xdc, + 0xc0, 0xe0, 0x20, 0x1b, 0xee, 0xcc, 0xde, 0x01, 0x1e, 0xfb, 0xc9, 0xe5, + 0x1e, 0x17, 0xd9, 0xc3, 0xf7, 0x29, 0x22, 0xff, 0xd9, 0xd0, 0xeb, 0x17, + 0x25, 0x12, 0xdc, 0xce, 0xd3, 0x00, 0x07, 0x03, 0x19, 0x1c, 0xe2, 0xdb, + 0x05, 0x25, 0xf6, 0xd2, 0x03, 0x2d, 0x00, 0xee, 0x12, 0x12, 0x13, 0x17, + 0x03, 0xd9, 0xf9, 0x32, 0x1b, 0xe2, 0xd5, 0x09, 0x37, 0x2b, 0xff, 0xe4, + 0xe9, 0xfd, 0xf9, 0x27, 0x1e, 0xe4, 0xfb, 0x3f, 0x1e, 0xe9, 0xdb, 0xf6, + 0x25, 0x32, 0x27, 0xfb, 0xe4, 0xee, 0x20, 0x39, 0x36, 0x15, 0x0e, 0xee, + 0xe5, 0x13, 0x40, 0x1e, 0xf6, 0x15, 0x32, 0xfd, 0xee, 0x22, 0x42, 0x07, + 0xd9, 0xf2, 0x27, 0x40, 0x3d, 0x0c, 0xeb, 0xf2, 0x15, 0x46, 0x3b, 0x19, + 0xee, 0xf2, 0x24, 0x49, 0x15, 0xeb, 0x20, 0x40, 0x05, 0xe4, 0x07, 0x29, + 0x39, 0x3b, 0x0c, 0xe7, 0x07, 0x3d, 0x3f, 0x1b, 0x1b, 0x20, 0xe4, 0x17, + 0x46, 0x46, 0x19, 0x01, 0xf9, 0xf9, 0x05, 0x1e, 0x3f, 0x24, 0xe9, 0x07, + 0x17, 0x13, 0x39, 0x2e, 0x19, 0x1b, 0xfb, 0xee, 0x22, 0x3f, 0x42, 0x17, + 0xf4, 0xfb, 0x2d, 0x4b, 0x19, 0xee, 0xf9, 0x2b, 0x12, 0xf2, 0x2e, 0x49, + 0x24, 0xf7, 0xeb, 0xfd, 0x2b, 0x00, 0xe2, 0x1c, 0x3d, 0x17, 0xdc, 0xde, + 0xf9, 0x1e, 0x32, 0x12, 0xd9, 0xd7, 0x05, 0x2b, 0x2d, 0x07, 0xd9, 0x03, + 0x29, 0xe9, 0xd9, 0x20, 0x39, 0x1c, 0xf2, 0xe2, 0xf2, 0x27, 0x25, 0xf2, + 0xd0, 0xde, 0x0e, 0x20, 0x1c, 0x17, 0xee, 0xd7, 0xf0, 0x34, 0x1c, 0xe2, + 0xe5, 0xfb, 0xcc, 0xe2, 0x00, 0x09, 0x15, 0x07, 0xd0, 0xc7, 0x01, 0x20, + 0x05, 0xeb, 0x25, 0x09, 0xca, 0xe2, 0x01, 0x20, 0x29, 0xf7, 0xd5, 0xe4, + 0x25, 0xfd, 0xce, 0x13, 0xf4, 0xb3, 0xe5, 0x05, 0x09, 0x1b, 0xeb, 0xc1, + 0xf6, 0x09, 0xce, 0x0a, 0x20, 0xee, 0xc0, 0xd9, 0x0e, 0x15, 0x0a, 0x00, + 0xe2, 0xd0, 0xca, 0xf4, 0xf4, 0xfd, 0x22, 0xee, 0xc5, 0xd0, 0xfd, 0x1c, + 0xee, 0xc1, 0xeb, 0x17, 0xd9, 0xb3, 0xdc, 0x0c, 0xfd, 0xf0, 0xf9, 0xc1, + 0xce, 0x00, 0x17, 0xeb, 0xb8, 0xce, 0xf2, 0xfb, 0x13, 0x01, 0xd7, 0xde, + 0xe5, 0xbe, 0xf4, 0x17, 0x0e, 0xe5, 0xdb, 0xce, 0xbe, 0xeb, 0x0e, 0x13, + 0xee, 0xc9, 0xcc, 0xc9, 0xf2, 0x17, 0x07, 0xd5, 0xba, 0xcc, 0x01, 0x07, + 0xe7, 0xce, 0xae, 0xd0, 0xfb, 0x0c, 0xee, 0xb5, 0xd7, 0x15, 0xf2, 0xb3, + 0xd0, 0x0e, 0x19, 0xff, 0xd5, 0xcc, 0xc7, 0xfd, 0x1e, 0xf2, 0xbc, 0xc3, + 0xe0, 0x07, 0x12, 0xdc, 0xbe, 0x01, 0x13, 0xdc, 0xf6, 0x12, 0xc9, 0xc5, + 0xff, 0x1e, 0xf7, 0xde, 0x0e, 0x09, 0xde, 0xee, 0xf9, 0xd7, 0xe0, 0x0c, + 0x20, 0xf4, 0xc5, 0xde, 0x15, 0x24, 0xf2, 0xcc, 0xd3, 0xe9, 0x00, 0x09, + 0xe0, 0xe7, 0x20, 0x15, 0xed, 0xc9, 0xd3, 0x03, 0x1b, 0x1e, 0xf7, 0xc9, + 0xd0, 0x03, 0x17, 0xf4, 0x30, 0x20, 0xe7, 0xd2, 0xe9, 0x15, 0x34, 0x19, + 0xeb, 0xe2, 0xed, 0xf9, 0xfb, 0x1c, 0x12, 0xe4, 0xd0, 0x01, 0x22, 0x2b, + 0x19, 0xf4, 0xdc, 0xee, 0x29, 0x36, 0x00, 0xd9, 0xd5, 0xff, 0x25, 0x2b, + 0x19, 0xff, 0x09, 0xe7, 0xf7, 0x3b, 0x1e, 0xe4, 0x05, 0x36, 0xe9, 0xe5, + 0x25, 0x37, 0xee, 0xd7, 0xf4, 0x0a, 0xf6, 0x0e, 0x2b, 0x12, 0xf9, 0x0e, + 0x25, 0xf7, 0x13, 0x27, 0xed, 0x0c, 0x17, 0x01, 0x27, 0x4d, 0x1b, 0x03, + 0xff, 0x13, 0x15, 0x34, 0x0e, 0xee, 0x19, 0x30, 0xf9, 0xe5, 0x15, 0x40, + 0x19, 0xe0, 0xe2, 0x12, 0x32, 0x37, 0x27, 0xf2, 0xfd, 0x05, 0x25, 0x3d, + 0xff, 0x01, 0x3d, 0x25, 0xf0, 0xf6, 0x3b, 0x25, 0xf0, 0x2d, 0x19, 0xe0, + 0x10, 0x3b, 0x2e, 0x12, 0x15, 0xff, 0x0c, 0x4d, 0x20, 0xf0, 0x15, 0x44, + 0x15, 0xfd, 0x39, 0x1b, 0xf2, 0x2e, 0x4b, 0x2d, 0x00, 0x01, 0x40, 0x34, + 0xf0, 0xf9, 0x07, 0x05, 0x22, 0x3d, 0x2d, 0xf4, 0xf9, 0x30, 0x3b, 0x01, + 0xe2, 0x10, 0x3b, 0x15, 0xfb, 0x44, 0x25, 0xed, 0x05, 0x19, 0x03, 0x2b, + 0x19, 0xe0, 0xfb, 0x19, 0x2d, 0x2e, 0x03, 0xde, 0x03, 0x36, 0x20, 0xe9, + 0xde, 0x09, 0x2e, 0x03, 0xe5, 0x34, 0x22, 0xe7, 0xfd, 0x0e, 0xcc, 0xfd, + 0x36, 0x10, 0xd7, 0xfd, 0xf2, 0x22, 0x2b, 0xff, 0xd7, 0xde, 0x15, 0x34, + 0x09, 0xd9, 0xd5, 0x07, 0x36, 0xf9, 0xcc, 0xdb, 0xf4, 0x07, 0x15, 0xd7, + 0xbc, 0xe5, 0x07, 0x07, 0xf4, 0xf0, 0xd3, 0xc1, 0xf6, 0x10, 0xe2, 0xb5, + 0xf4, 0x09, 0xeb, 0xdb, 0xfd, 0x1b, 0x0c, 0xed, 0xde, 0xc3, 0xd5, 0x03, + 0x12, 0x17, 0xed, 0xd2, 0xbe, 0xe0, 0x19, 0xff, 0xca, 0xc1, 0xf9, 0x1b, + 0xde, 0xaf, 0xe5, 0xf7, 0xb1, 0xf9, 0x07, 0xca, 0xdb, 0x15, 0xeb, 0xc9, + 0xf2, 0x20, 0xe7, 0xbc, 0xc9, 0xeb, 0xf0, 0x00, 0xe4, 0xbe, 0xfb, 0x17, + 0xf7, 0xce, 0xba, 0xd7, 0x0c, 0xfd, 0xe5, 0x09, 0xe9, 0xc5, 0xe2, 0xfd, + 0xd3, 0xc7, 0x0e, 0x01, 0xba, 0xd5, 0x15, 0x12, 0xe5, 0xba, 0xca, 0xf9, + 0x19, 0x13, 0xee, 0xd3, 0xe4, 0xf6, 0xce, 0xf2, 0x20, 0x05, 0xe9, 0xfb, + 0xd3, 0xee, 0x0a, 0xf4, 0xcc, 0xd3, 0x07, 0x24, 0xf9, 0xd7, 0x1c, 0x05, + 0xc1, 0xe0, 0x13, 0x27, 0x0a, 0xee, 0xe9, 0xd7, 0xe5, 0xf6, 0x09, 0x24, + 0xfd, 0xcc, 0xf4, 0x25, 0x09, 0xf4, 0x01, 0xeb, 0xe9, 0xf7, 0x07, 0x15, + 0x1c, 0xe5, 0xd3, 0xf4, 0x10, 0x20, 0x2d, 0x07, 0xe0, 0x01, 0x34, 0x07, + 0x03, 0x15, 0x10, 0xe9, 0xf4, 0x12, 0x05, 0xeb, 0x0c, 0xf6, 0xdb, 0x15, + 0x2b, 0x0a, 0xe4, 0xe5, 0x05, 0x30, 0x1b, 0xf4, 0xd9, 0xe4, 0x00, 0x09, + 0x27, 0x17, 0xde, 0xe4, 0x0e, 0x05, 0xf7, 0x25, 0x0a, 0xde, 0xdb, 0x09, + 0x2b, 0x2d, 0x03, 0xd5, 0xe2, 0x15, 0x2d, 0x1b, 0x09, 0x03, 0xe4, 0x05, + 0x27, 0xf0, 0xe2, 0x1b, 0x15, 0xe5, 0xdb, 0x0e, 0x24, 0xf7, 0xeb, 0x2e, + 0x15, 0xd9, 0xde, 0x0e, 0x2e, 0x20, 0xfd, 0xf0, 0xdb, 0xf4, 0x01, 0x17, + 0x17, 0xce, 0xd9, 0x0c, 0x1c, 0xe0, 0xf4, 0x15, 0x03, 0x0e, 0xd5, 0xee, + 0x2b, 0x2b, 0x07, 0xe4, 0xdc, 0xe9, 0x15, 0x29, 0x07, 0xd3, 0xd5, 0x09, + 0x30, 0x19, 0x00, 0xf0, 0xd7, 0x00, 0x20, 0x03, 0xe7, 0x27, 0x09, 0xe0, + 0x07, 0x20, 0xe5, 0x07, 0x2e, 0xfb, 0xdb, 0xe0, 0x19, 0x29, 0xff, 0xd7, + 0xf0, 0x24, 0xf0, 0xd5, 0x20, 0x19, 0xe4, 0xe0, 0x25, 0x10, 0xd7, 0xe2, + 0x1c, 0x36, 0x1e, 0xf6, 0xe2, 0xe9, 0xf4, 0xed, 0x25, 0x15, 0xdc, 0xed, + 0x32, 0x19, 0xd7, 0xdb, 0x1c, 0x29, 0xee, 0xd0, 0x00, 0x2b, 0x00, 0xd0, + 0x0c, 0x24, 0x00, 0xe0, 0xf6, 0x1e, 0x24, 0xf4, 0xd0, 0xf7, 0x2b, 0x34, + 0x20, 0xeb, 0xdb, 0xe5, 0x24, 0x30, 0x13, 0xde, 0x20, 0x3d, 0x00, 0xf2, + 0x13, 0xf6, 0xe9, 0x2d, 0x1b, 0xd7, 0xed, 0x2d, 0x24, 0xd5, 0xf7, 0x19, + 0x01, 0x34, 0xff, 0xd3, 0xfb, 0x34, 0x24, 0xe7, 0xdc, 0x25, 0x19, 0xd5, + 0x20, 0x2b, 0xe4, 0xe7, 0x2b, 0x3d, 0x17, 0xee, 0xde, 0x07, 0x34, 0xf7, + 0xf9, 0x30, 0x19, 0xd5, 0xed, 0x30, 0x3b, 0x0c, 0xe9, 0x13, 0x09, 0xf2, + 0x09, 0x36, 0x19, 0xe5, 0xdb, 0xf4, 0x2b, 0x32, 0x10, 0xe4, 0xdc, 0xe7, + 0x1c, 0x2b, 0x25, 0xf0, 0xdb, 0xde, 0x03, 0x07, 0xf6, 0x05, 0x15, 0xe2, + 0x12, 0x3b, 0xed, 0x00, 0x24, 0xdb, 0xd2, 0x05, 0x36, 0x2d, 0x01, 0xd9, + 0xd3, 0xf4, 0x24, 0x17, 0x00, 0x0c, 0xf6, 0xd7, 0x22, 0x27, 0xf0, 0xd2, + 0xff, 0x30, 0x2b, 0x00, 0xe7, 0xde, 0xe5, 0x05, 0x25, 0x20, 0xff, 0xde, + 0xd3, 0xd0, 0xf4, 0xfb, 0xf9, 0x19, 0x09, 0xe7, 0xdb, 0x05, 0x27, 0xff, + 0xd2, 0xd2, 0x09, 0x0a, 0xf2, 0x24, 0xed, 0xce, 0xc9, 0xf2, 0x19, 0x1e, + 0xfd, 0xc5, 0xc7, 0xf0, 0x0c, 0xfb, 0x12, 0x19, 0xed, 0xde, 0xf6, 0x00, + 0xd7, 0xf7, 0x24, 0xf7, 0xbe, 0xdb, 0x13, 0x20, 0x03, 0xee, 0xe4, 0xd3, + 0x05, 0x25, 0x0a, 0xdc, 0xd3, 0x01, 0x1c, 0xe9, 0xf9, 0x25, 0xe5, 0xd0, + 0x0a, 0x39, 0x0e, 0xe7, 0xe5, 0xd7, 0xe9, 0x07, 0x13, 0xf7, 0xfb, 0x01, + 0xc5, 0xe0, 0x10, 0x20, 0xe5, 0xbc, 0xe7, 0x19, 0x07, 0xc5, 0xde, 0x05, + 0x01, 0xed, 0xed, 0x13, 0xf7, 0xdc, 0x0e, 0x25, 0x0e, 0x03, 0xeb, 0x0a, + 0x30, 0xee, 0xde, 0x0e, 0x32, 0xf4, 0xe5, 0xe9, 0xf4, 0xf7, 0xf6, 0x17, + 0xdc, 0xc9, 0xf9, 0x1e, 0x0a, 0xc9, 0xc5, 0xf7, 0x1c, 0xf6, 0xbe, 0xfb, + 0x13, 0xf0, 0xfd, 0xf9, 0xc5, 0xfb, 0x20, 0xfb, 0xd0, 0xf0, 0x2e, 0xf6, + 0xc5, 0xf9, 0x17, 0xf6, 0xcc, 0xf7, 0x2e, 0xf9, 0xd2, 0xf2, 0x2b, 0x07, + 0xe0, 0xdc, 0xe4, 0x13, 0x12, 0xdc, 0xc0, 0xf0, 0x19, 0xfd, 0xf6, 0xfd, + 0xd5, 0xe7, 0x0e, 0x12, 0xd9, 0xd0, 0x10, 0xfb, 0xd0, 0x03, 0x17, 0xe2, + 0xf6, 0x22, 0xf7, 0xd5, 0xed, 0x24, 0x17, 0xe4, 0xfd, 0x1b, 0xdc, 0xd2, + 0x00, 0x24, 0x0a, 0xd9, 0xdb, 0x05, 0x22, 0x03, 0xe7, 0x05, 0xf0, 0xd3, + 0x10, 0x2d, 0x15, 0xeb, 0xee, 0xf2, 0xd5, 0xff, 0x1b, 0x24, 0x00, 0xe2, + 0xdc, 0xde, 0x0e, 0x2b, 0x1b, 0xe7, 0xce, 0xe7, 0x0e, 0x1e, 0x07, 0xf9, + 0x17, 0xf2, 0xe5, 0x1c, 0x2b, 0x00, 0xe5, 0x17, 0x22, 0xde, 0x0e, 0x3d, + 0x12, 0xeb, 0xe4, 0xf7, 0x15, 0xeb, 0x09, 0x32, 0x24, 0x0c, 0xe7, 0x07, + 0x3f, 0x12, 0xe2, 0x1e, 0x27, 0xe5, 0x0c, 0x32, 0x00, 0xdc, 0x10, 0x3b, + 0x1e, 0xff, 0x19, 0x12, 0xe4, 0x25, 0x46, 0x12, 0xe9, 0xe9, 0x01, 0x24, + 0x1c, 0xed, 0xf9, 0x36, 0x10, 0x24, 0x37, 0xfb, 0x0c, 0x42, 0x15, 0xe7, + 0xf7, 0x2b, 0x32, 0x0e, 0x1c, 0xf4, 0xdc, 0x0e, 0x42, 0x2d, 0xf2, 0xd5, + 0xf6, 0x2e, 0x36, 0x1b, 0xf4, 0xe2, 0xde, 0x0c, 0x1e, 0x17, 0x07, 0x1b, + 0xfd, 0xe0, 0x19, 0x34, 0x0c, 0x0a, 0x20, 0xe2, 0xeb, 0x24, 0x2e, 0xee, + 0xf4, 0x2b, 0xf6, 0xf0, 0x22, 0x2b, 0xfd, 0xd3, 0xdc, 0x0a, 0x1e, 0x15, + 0x10, 0xd7, 0xdc, 0x10, 0x32, 0x15, 0xe5, 0xed, 0xed, 0xfd, 0x25, 0xe5, + 0xd3, 0x09, 0x2e, 0xfd, 0xc7, 0xd2, 0x03, 0x24, 0x12, 0xf9, 0xe9, 0xc1, + 0xf4, 0x1e, 0x27, 0x0a, 0xd3, 0xdc, 0xeb, 0x0c, 0x27, 0x07, 0xe0, 0xee, + 0x25, 0x0c, 0xca, 0xf2, 0x1e, 0x00, 0xf9, 0x15, 0xfd, 0xe0, 0xd3, 0x0c, + 0x2b, 0xe2, 0xd5, 0x24, 0x20, 0xe2, 0xed, 0xe7, 0xfb, 0x2d, 0xf9, 0xca, + 0xe0, 0x13, 0xe9, 0xc9, 0x07, 0xfd, 0xed, 0x00, 0xf4, 0x05, 0x27, 0xf2, + 0xc1, 0xde, 0x1b, 0x2b, 0x1c, 0xf4, 0xd9, 0xde, 0x20, 0x32, 0x12, 0xe7, + 0xd7, 0xe2, 0x12, 0x29, 0x12, 0xd0, 0xf7, 0x0a, 0xd7, 0xd3, 0xff, 0x1c, + 0x17, 0xf2, 0xc3, 0xe9, 0x22, 0x27, 0x05, 0xd9, 0xd5, 0xee, 0x10, 0x22, + 0x1c, 0xe5, 0xc9, 0xe9, 0x24, 0x22, 0xf0, 0xc5, 0xe7, 0x05, 0xee, 0xe7, + 0x22, 0x15, 0xf2, 0x01, 0xfb, 0xde, 0xf9, 0x29, 0xf9, 0xd5, 0x17, 0xf9, + 0xce, 0x15, 0x20, 0xe2, 0xc7, 0xde, 0x12, 0x1c, 0xf4, 0x01, 0x0c, 0xc0, + 0xee, 0x15, 0xf6, 0xed, 0xf9, 0xf0, 0xf7, 0x25, 0xdc, 0xf0, 0x27, 0x12, + 0xd0, 0xdc, 0x1e, 0x10, 0xcc, 0x00, 0x2b, 0xe7, 0xc9, 0xfd, 0x03, 0x0a, + 0xff, 0xd7, 0xf6, 0x00, 0x2d, 0xff, 0xe2, 0xfb, 0x09, 0x2b, 0x10, 0xe9, + 0xed, 0xf0, 0xe5, 0x01, 0x0c, 0xd9, 0xf7, 0x17, 0x17, 0xe5, 0x03, 0x2b, + 0xdb, 0xd7, 0xf7, 0x15, 0x1c, 0x15, 0xe5, 0xce, 0x05, 0x32, 0x0a, 0xf4, + 0x20, 0xe9, 0xeb, 0x1c, 0xf6, 0xdc, 0x30, 0x2b, 0xf4, 0xd5, 0xdb, 0xff, + 0x20, 0x25, 0x01, 0xd0, 0xee, 0x0c, 0x00, 0x19, 0x03, 0xd7, 0xf9, 0x2d, + 0x1b, 0xd7, 0xe9, 0x2b, 0xff, 0xd2, 0x20, 0x1b, 0x01, 0x30, 0x07, 0xe4, + 0x01, 0x09, 0xff, 0x39, 0x09, 0xde, 0xd7, 0x05, 0x1e, 0x0c, 0x24, 0xde, + 0xcc, 0xe7, 0x1e, 0x24, 0x10, 0xdc, 0xd0, 0x01, 0x2d, 0x05, 0xce, 0xf4, + 0x2e, 0x22, 0xee, 0xd7, 0x05, 0x2e, 0x17, 0xf2, 0xd5, 0xde, 0x0a, 0x17, + 0x25, 0x0e, 0xf4, 0xe0, 0xf0, 0x32, 0x2d, 0xf7, 0xd7, 0xfd, 0x19, 0x0a, + 0x01, 0x00, 0xe2, 0xf7, 0x2b, 0x03, 0xd3, 0xf6, 0x34, 0x19, 0xe0, 0xd5, + 0x01, 0xff, 0xdc, 0x17, 0x1c, 0xf4, 0xca, 0xf9, 0x29, 0x12, 0xe5, 0xff, + 0x27, 0x03, 0xd0, 0xe7, 0x03, 0x05, 0x15, 0xfb, 0xe9, 0x07, 0x0e, 0xd3, + 0x00, 0x27, 0xf4, 0xe2, 0x2e, 0x0e, 0xd0, 0xfb, 0x27, 0xed, 0xc5, 0x00, + 0x27, 0x03, 0xf0, 0x24, 0xee, 0xc9, 0x00, 0x2e, 0x00, 0xcc, 0xfd, 0x2e, + 0xf6, 0xd0, 0xed, 0x19, 0x2d, 0xfd, 0xcc, 0xf2, 0x17, 0xfd, 0xfd, 0x29, + 0x01, 0xd0, 0xed, 0x25, 0x1c, 0xdb, 0xe5, 0xe9, 0xde, 0x1b, 0x0a, 0xe0, + 0xfd, 0x19, 0xe9, 0xe0, 0xe4, 0xfb, 0x22, 0x15, 0xf6, 0xd3, 0x07, 0x03, + 0xdc, 0x1b, 0x24, 0xf9, 0xd3, 0xff, 0x25, 0xe0, 0xf2, 0x32, 0x00, 0xd3, + 0xed, 0x27, 0xfb, 0xc7, 0xf6, 0x2b, 0x0a, 0xcc, 0xfd, 0x3b, 0xfd, 0xd0, + 0xde, 0x03, 0xfd, 0xee, 0x05, 0x29, 0xee, 0xc3, 0xe7, 0x13, 0x22, 0x0c, + 0xf9, 0x17, 0xe0, 0xd9, 0x17, 0x24, 0xdb, 0xe5, 0x32, 0x0c, 0xca, 0xde, + 0x15, 0x1c, 0xed, 0x20, 0x0a, 0xcc, 0x07, 0x36, 0xf7, 0xd0, 0xd7, 0x00, + 0x1c, 0x20, 0xfb, 0xdb, 0xe5, 0xfb, 0x0e, 0x00, 0x15, 0x20, 0x07, 0xfb, + 0xd7, 0xe2, 0x0e, 0x2e, 0x00, 0xd7, 0x15, 0x0e, 0xcc, 0x12, 0x24, 0xde, + 0xd3, 0x12, 0x32, 0x0a, 0xdb, 0xf0, 0x1c, 0xf0, 0xd7, 0xfb, 0x1c, 0x27, + 0xf0, 0xd0, 0x07, 0x2e, 0xf7, 0xe9, 0x20, 0xde, 0xdb, 0x1c, 0x27, 0xe5, + 0xc5, 0xfb, 0x27, 0x1c, 0x00, 0xe9, 0xf4, 0x12, 0xdb, 0xd7, 0x15, 0x20, + 0x19, 0x07, 0xed, 0xcc, 0xf4, 0x2b, 0x27, 0x00, 0xf4, 0xde, 0xe2, 0x24, + 0x2e, 0x00, 0xd3, 0xe2, 0x07, 0x00, 0xff, 0x1c, 0xf0, 0x00, 0xf7, 0xd3, + 0x2b, 0x32, 0x0a, 0xf0, 0xde, 0xd0, 0xf0, 0x0e, 0x24, 0x19, 0xdb, 0xc9, + 0xff, 0x27, 0x19, 0x00, 0xff, 0xd7, 0xe2, 0x0e, 0x2b, 0x27, 0xf7, 0xf4, + 0x03, 0xe5, 0x15, 0x27, 0xf4, 0xd0, 0xe5, 0x20, 0x00, 0xd3, 0x2b, 0x24, + 0xe5, 0xd0, 0x00, 0x2b, 0xe2, 0xc5, 0x0e, 0x2b, 0x03, 0xe2, 0x12, 0xfb, + 0xc5, 0xf0, 0x03, 0x0a, 0x1c, 0xf7, 0xe5, 0x1c, 0xed, 0xe9, 0x07, 0x36, + 0x07, 0xdb, 0x00, 0x0e, 0xcc, 0xfb, 0x32, 0x12, 0xe2, 0x03, 0x19, 0xdb, + 0xd7, 0x0e, 0x24, 0x19, 0xf4, 0xe5, 0x19, 0x0a, 0xd0, 0xfb, 0x15, 0xd0, + 0xf0, 0x20, 0x27, 0xf4, 0xcc, 0xe5, 0x24, 0x00, 0xed, 0x32, 0xed, 0xc5, + 0xe5, 0x07, 0x07, 0xf4, 0x07, 0x20, 0xfb, 0xe5, 0x03, 0x20, 0xe9, 0x0a, + 0x0e, 0xd0, 0xf0, 0x2b, 0x27, 0xe5, 0xd7, 0x0e, 0xff, 0x15, 0x2e, 0xfb, + 0xfb, 0xe9, 0xe2, 0xed, 0x27, 0x0e, 0xd0, 0xfb, 0x27, 0xf4, 0xd3, 0x19, + 0x27, 0xf0, 0xc9, 0xf4, 0x24, 0xff, 0xf0, 0x3d, 0x00, 0xdb, 0xd3, 0xf7, + 0x15, 0x19, 0x00, 0xf4, 0x03, 0xde, 0xfb, 0x32, 0x24, 0xf7, 0xdb, 0xf0, + 0x03, 0xe2, 0x03, 0x1c, 0x20, 0xe2, 0xc9, 0xf0, 0x24, 0x20, 0x03, 0x00, + 0xe9, 0xc9, 0xe9, 0x19, 0x24, 0x00, 0xcc, 0xd7, 0x07, 0x24, 0x00, 0xe9, + 0x32, 0x19, 0xe2, 0x00, 0x07, 0xe9, 0x1c, 0x12, 0xde, 0xe9, 0xfb, 0xe5, + 0x1c, 0x1c, 0x24, 0xf0, 0xdb, 0x00, 0x20, 0xd7, 0xf7, 0x20, 0xd3, 0xe5, + 0x27, 0x07, 0xc5, 0xe9, 0x20, 0x20, 0xfb, 0xc9, 0xe2, 0x12, 0x1c, 0x20, + 0x00, 0xd7, 0xe9, 0x2e, 0x15, 0xd3, 0xde, 0x19, 0x20, 0xed, 0xd3, 0x00, + 0x24, 0x27, 0x03, 0xe2, 0xd3, 0xde, 0x15, 0x20, 0x03, 0xf7, 0xe9, 0xfb, + 0xf0, 0xfb, 0x15, 0x03, 0x2b, 0xf4, 0xd3, 0x00, 0x32, 0x0a, 0xe5, 0xd0, + 0xe9, 0x0e, 0x07, 0x1c, 0x00, 0xc9, 0xd7, 0x03, 0x1c, 0x24, 0x15, 0xff, + 0xe5, 0xd3, 0xf7, 0x20, 0x24, 0x00, 0xd3, 0xdb, 0x03, 0x27, 0x27, 0x0e, + 0xf4, 0xe5, 0xd0, 0xf4, 0x20, 0x2b, 0x19, 0xed, 0xe2, 0xd3, 0x0a, 0x2b, + 0x1c, 0xf7, 0xe2, 0xfb, 0xe9, 0xe2, 0x20, 0x20, 0xf7, 0xc9, 0xd3, 0xff, + 0x12, 0x20, 0x20, 0xe9, 0xcc, 0xde, 0x07, 0x19, 0x24, 0x07, 0xe2, 0xf7, + 0x2b, 0xe5, 0xdb, 0x2b, 0x32, 0x00, 0xe5, 0xde, 0x0e, 0x2e, 0xe5, 0xcc, + 0x07, 0x32, 0x07, 0xcc, 0xed, 0x2e, 0x0e, 0xc9, 0xf0, 0x2b, 0x00, 0xd3, + 0x24, 0x27, 0xe5, 0xcc, 0xd3, 0x00, 0x15, 0x1c, 0x12, 0x00, 0xf7, 0xdb, + 0xd7, 0x19, 0x24, 0x0a, 0x0a, 0xe5, 0xcc, 0xf7, 0x24, 0x2b, 0x03, 0xe5, + 0x0e, 0xe2, 0xde, 0x24, 0x27, 0xe9, 0xc5, 0xf0, 0x20, 0x2b, 0x0e, 0xf0, + 0xff, 0xc9, 0xe2, 0x12, 0x27, 0x19, 0x00, 0x00, 0xd0, 0xe2, 0x12, 0x32, + 0x19, 0xed, 0xdb, 0xd3, 0xff, 0x24, 0x2b, 0x00, 0xcc, 0xff, 0x24, 0xf0, + 0xcc, 0x19, 0x27, 0xe2, 0xc9, 0xff, 0x0e, 0x19, 0x0a, 0x00, 0xe9, 0xe9, + 0xff, 0xf7, 0x2b, 0x2b, 0x03, 0xde, 0xe2, 0x03, 0xfb, 0x0e, 0x39, 0xed, + 0xd0, 0xed, 0x1c, 0xf7, 0x00, 0x3d, 0x00, 0xd7, 0xed, 0x00, 0xde, 0x1c, + 0x27, 0xed, 0xc1, 0xfb, 0x27, 0x1c, 0xf7, 0xde, 0xe2, 0x27, 0x19, 0xd7, + 0x03, 0x2b, 0xe5, 0xc9, 0xde, 0x07, 0x15, 0xff, 0x0a, 0x19, 0xc5, 0xe5, + 0x20, 0x2b, 0xf0, 0xcc, 0x00, 0x20, 0xf4, 0xdb, 0x36, 0x15, 0xde, 0xed, + 0x1c, 0x27, 0xf0, 0xd7, 0xf4, 0x0e, 0xf0, 0x1c, 0x15, 0xf4, 0xfb, 0xf7, + 0xff, 0x0e, 0xdb, 0xcc, 0x12, 0x27, 0x0a, 0xed, 0x03, 0xe2, 0xcc, 0x03, + 0x0e, 0x03, 0x0e, 0xf7, 0xf4, 0xf0, 0xd7, 0x0a, 0x27, 0x27, 0xff, 0xe5, + 0xf7, 0xe9, 0x0e, 0x32, 0x00, 0xd0, 0xde, 0x1c, 0x19, 0xf7, 0x0a, 0xf0, + 0xcc, 0xff, 0x24, 0x2e, 0x19, 0xf0, 0xf4, 0xde, 0xd7, 0x12, 0x2b, 0x27, + 0xf7, 0xe2, 0xe9, 0xe9, 0x00, 0x2b, 0x03, 0xd3, 0xc9, 0xf4, 0x19, 0x0e, + 0xed, 0xe9, 0xfb, 0x27, 0xde, 0xd3, 0x24, 0x24, 0xf0, 0xcc, 0xed, 0x24, + 0x1c, 0xfb, 0x0a, 0x24, 0xde, 0xe5, 0x00, 0x1c, 0xf7, 0xdb, 0x12, 0x0e, + 0xf4, 0xd0, 0x0e, 0x36, 0x0e, 0xed, 0xe2, 0xdb, 0x0e, 0x19, 0xd3, 0xe2, + 0x2b, 0x12, 0xd0, 0xf0, 0x2e, 0xe5, 0xc9, 0x0a, 0x20, 0xe9, 0x07, 0x36, + 0xed, 0xd0, 0xe2, 0x0e, 0x07, 0x12, 0x27, 0xe9, 0xdb, 0x0e, 0x20, 0xd3, + 0xfb, 0x2b, 0x0a, 0xdb, 0xe9, 0x19, 0x03, 0xf4, 0x0a, 0xdb, 0x00, 0x32, + 0x03, 0xd7, 0xd3, 0xfb, 0x03, 0xe5, 0x12, 0x27, 0xff, 0xed, 0xf7, 0xf0, + 0xfb, 0x32, 0x00, 0xc5, 0xff, 0x32, 0x19, 0xe2, 0xcc, 0xed, 0x0e, 0x20, + 0x27, 0xf0, 0xed, 0x0e, 0xed, 0xdb, 0x27, 0x32, 0x1c, 0xf7, 0xf4, 0xe5, + 0xd3, 0xff, 0x20, 0x27, 0x07, 0xe5, 0xdb, 0xdb, 0x0e, 0x1c, 0x0a, 0xd7, + 0xe9, 0x07, 0x15, 0x0a, 0xff, 0xc9, 0xd7, 0x07, 0x1c, 0xf0, 0xe5, 0x00, + 0x15, 0x20, 0xf0, 0xd3, 0x07, 0x3d, 0x0a, 0xe5, 0xd7, 0xe9, 0x24, 0x2b, + 0x00, 0xcc, 0x00, 0x3d, 0x15, 0xe5, 0xfb, 0x0e, 0xdb, 0xf7, 0x32, 0x20, + 0xed, 0xdb, 0x0e, 0x24, 0xd3, 0xd7, 0x07, 0x2b, 0xff, 0xc5, 0x00, 0x2b, + 0xe9, 0xde, 0x32, 0x00, 0xc1, 0xd0, 0xf7, 0x0a, 0x19, 0x19, 0xde, 0xe2, + 0x32, 0x15, 0xde, 0x12, 0x12, 0xcc, 0xf7, 0x27, 0xfb, 0xd7, 0x2b, 0x27, + 0xe9, 0xd3, 0x00, 0x2e, 0xed, 0xed, 0x39, 0x07, 0xd7, 0x00, 0x39, 0xff, + 0xd7, 0xed, 0x24, 0xf7, 0xcc, 0x20, 0x0e, 0xd0, 0xfb, 0x32, 0x07, 0xd3, + 0xf0, 0x0e, 0xc9, 0xf0, 0x24, 0x20, 0xed, 0xe5, 0x1c, 0xcc, 0xf0, 0x2b, + 0x0a, 0xf7, 0xff, 0xf4, 0xde, 0x0a, 0x32, 0x20, 0xf0, 0xdb, 0xdb, 0x07, + 0x32, 0x15, 0xdb, 0xd0, 0x0a, 0x27, 0x00, 0x2b, 0x07, 0xe9, 0xe2, 0xf4, + 0xf0, 0xff, 0x1c, 0x0a, 0xe5, 0xf4, 0xe5, 0x00, 0x2b, 0xff, 0xc5, 0xf4, + 0x24, 0x03, 0x00, 0x15, 0x0e, 0xe9, 0xd7, 0x00, 0x39, 0x15, 0xde, 0xde, + 0x03, 0xf4, 0x03, 0x36, 0xf7, 0xd0, 0xf4, 0x20, 0xe5, 0xf0, 0x36, 0xfb, + 0xc9, 0xe5, 0x24, 0x2b, 0x07, 0xf7, 0x00, 0xd7, 0xe9, 0x1c, 0x27, 0xfb, + 0xf4, 0xe2, 0xde, 0x12, 0x27, 0xff, 0xfb, 0x24, 0xe2, 0xd0, 0x03, 0x36, + 0x0e, 0xd7, 0xd7, 0x00, 0x1c, 0x03, 0x00, 0xff, 0xd7, 0x0a, 0x20, 0xd0, + 0xe5, 0x27, 0x20, 0xe9, 0xd0, 0x00, 0x07, 0xf4, 0x00, 0x19, 0xfb, 0xd7, + 0x12, 0x2b, 0xf4, 0xc9, 0xe9, 0x20, 0x27, 0x15, 0x00, 0xe9, 0xe5, 0x27, + 0x19, 0xd0, 0x03, 0x19, 0xde, 0xf0, 0x24, 0xed, 0xdb, 0x12, 0x24, 0xf0, + 0xc9, 0x07, 0x00, 0x1c, 0x19, 0xd0, 0xe5, 0x24, 0x24, 0xe2, 0xc9, 0xed, + 0x1c, 0x27, 0x19, 0xfb, 0xe2, 0xd3, 0xf7, 0x19, 0x19, 0xe5, 0xde, 0x27, + 0x19, 0xd3, 0xe5, 0xff, 0x00, 0x2e, 0x0e, 0xd7, 0xd7, 0x19, 0x32, 0x0e, + 0x00, 0xe9, 0xe9, 0xff, 0x0e, 0x0e, 0x03, 0xde, 0xd0, 0x12, 0x2b, 0x15, + 0xe2, 0xd3, 0x12, 0x2b, 0xdb, 0xcc, 0x07, 0x2b, 0x1c, 0xe2, 0xcc, 0xf4, + 0x15, 0x2b, 0x1c, 0xe9, 0xf7, 0xe9, 0xdb, 0x15, 0x0a, 0x03, 0x00, 0xf0, + 0x36, 0xff, 0xc9, 0xff, 0x32, 0x07, 0xd3, 0xf0, 0x15, 0x1c, 0x0e, 0xd0, + 0xdb, 0x03, 0x00, 0xf7, 0x32, 0x0e, 0xd0, 0xd0, 0x03, 0x24, 0x0e, 0x03, + 0x19, 0x00, 0xfb, 0xff, 0xe5, 0xdb, 0x03, 0x0e, 0xdb, 0x03, 0x15, 0xde, + 0xfb, 0x07, 0xf4, 0x0e, 0x00, 0xff, 0x00, 0x07, 0x1c, 0xc9, 0xdb, 0x15, + 0x2b, 0x19, 0x00, 0xff, 0xde, 0xf4, 0x19, 0xf4, 0x00, 0x0e, 0x12, 0xff, + 0xed, 0xc5, 0xe2, 0x00, 0x0e, 0x15, 0x12, 0xe5, 0xd0, 0x0e, 0x0a, 0xff, + 0x36, 0x0a, 0xe9, 0xe9, 0x00, 0xed, 0xf7, 0x00, 0x07, 0x1c, 0xf0, 0xe5, + 0x00, 0x19, 0xfb, 0xff, 0xf4, 0xde, 0x2b, 0x2b, 0x00, 0xd7, 0xf7, 0x12, + 0x07, 0x0e, 0xf4, 0xed, 0xf4, 0x2e, 0x07, 0xe9, 0xd0, 0x03, 0x32, 0x03, + 0xcc, 0xd0, 0xfb, 0x15, 0x0e, 0x00, 0xd7, 0x00, 0x2e, 0x00, 0xc9, 0xdb, + 0x07, 0x07, 0xfb, 0x27, 0x12, 0xed, 0xf7, 0x2b, 0xe5, 0xd0, 0x1c, 0x2e, + 0xf0, 0xed, 0x19, 0xd3, 0xff, 0x39, 0x1c, 0xe9, 0xf0, 0x19, 0xf7, 0xd0, + 0x03, 0xfb, 0x00, 0x36, 0x0a, 0xd7, 0xd7, 0x07, 0x0e, 0xf4, 0x0e, 0xe2, + 0xd3, 0x0e, 0x2e, 0x15, 0xdb, 0xd0, 0xe9, 0xff, 0x0e, 0x24, 0xe2, 0xe9, + 0x36, 0x00, 0xc9, 0xf7, 0x20, 0x24, 0x12, 0x00, 0xdb, 0xdb, 0x07, 0x2e, + 0x1c, 0xe2, 0xdb, 0x24, 0x2e, 0xed, 0xdb, 0xd3, 0xf4, 0x15, 0x1c, 0xe9, + 0xd3, 0x12, 0x24, 0x0e, 0xd7, 0xde, 0x00, 0x19, 0x15, 0xf7, 0xd3, 0xe9, + 0x2e, 0x07, 0xc9, 0xf4, 0x2b, 0xff, 0x07, 0x15, 0xc9, 0xde, 0x15, 0x27, + 0x0a, 0x00, 0x19, 0xde, 0xd3, 0xf0, 0x27, 0x19, 0xed, 0xf4, 0x07, 0x20, + 0xd7, 0xdb, 0x27, 0x15, 0xd0, 0xfb, 0x32, 0x07, 0xf7, 0xff, 0xe2, 0xcc, + 0xf0, 0x12, 0x20, 0x19, 0xf0, 0xd0, 0xd3, 0x0a, 0x24, 0x15, 0xff, 0x00, + 0xd3, 0xde, 0x1c, 0x27, 0x00, 0xf4, 0xff, 0xde, 0x0a, 0x3d, 0x0a, 0xdb, + 0xe5, 0x12, 0xf4, 0xf0, 0x40, 0x0a, 0xdb, 0xfb, 0xfb, 0xd0, 0x19, 0x2e, + 0x1c, 0xe9, 0xd3, 0xd7, 0x0e, 0x2e, 0x1c, 0xe9, 0xd7, 0xde, 0xff, 0x20, + 0x1c, 0xdb, 0xd7, 0x00, 0x0e, 0xf0, 0xff, 0x2b, 0x12, 0xde, 0xc9, 0xf7, + 0x27, 0x19, 0x00, 0x0e, 0x03, 0xd0, 0xe9, 0x20, 0x27, 0xed, 0xf7, 0x20, + 0xfb, 0xdb, 0x03, 0x2e, 0xde, 0xc5, 0xf4, 0x19, 0x15, 0xff, 0x15, 0xff, + 0xd3, 0x07, 0x00, 0xff, 0x19, 0xe2, 0x00, 0x27, 0xde, 0xd0, 0x0a, 0x27, + 0xe9, 0xed, 0x32, 0xf4, 0xcc, 0x00, 0x32, 0x15, 0xde, 0xff, 0x27, 0xd3, + 0xd7, 0x0a, 0x15, 0xff, 0x03, 0xf0, 0x19, 0x20, 0xe2, 0xed, 0x19, 0xf4, + 0xd0, 0x00, 0x32, 0x12, 0xf7, 0xed, 0xd0, 0xf4, 0x19, 0x2e, 0x12, 0xe5, + 0xd7, 0xdb, 0x15, 0x1c, 0xf0, 0x03, 0x24, 0xd7, 0xc9, 0xf7, 0x1c, 0xff, + 0x19, 0x19, 0xd7, 0xe5, 0x2b, 0x20, 0xe5, 0xd0, 0xff, 0x1c, 0xd7, 0x03, + 0x2e, 0xff, 0xd7, 0x03, 0x0a, 0xd3, 0x00, 0x36, 0x0a, 0xe9, 0xe2, 0xdb, + 0xff, 0x03, 0xff, 0x0e, 0x19, 0x00, 0xd7, 0xd7, 0x07, 0x19, 0x2b, 0x00, + 0xdb, 0xff, 0x1c, 0x03, 0x00, 0xdb, 0xdb, 0x24, 0x27, 0xde, 0xcc, 0x0a, + 0x2b, 0xf0, 0xff, 0x15, 0xd3, 0x07, 0x1c, 0xd7, 0xd7, 0x12, 0x27, 0xed, + 0xe5, 0x36, 0xf4, 0xd0, 0x19, 0x1c, 0xc9, 0xed, 0x2e, 0x27, 0xf0, 0xdb, + 0xde, 0xfb, 0x20, 0x27, 0xed, 0xc9, 0xf0, 0x19, 0x0a, 0x19, 0x12, 0xe9, + 0xde, 0x0e, 0x36, 0xfb, 0xdb, 0x00, 0x24, 0xde, 0xe2, 0x24, 0x0a, 0xcc, + 0xf0, 0x2e, 0x00, 0xc1, 0xf4, 0x2b, 0x0a, 0xd3, 0xf7, 0x00, 0xd7, 0x1c, + 0x27, 0xfb, 0xe9, 0x24, 0xf7, 0xc5, 0xf4, 0x24, 0x24, 0x0a, 0x00, 0xe5, + 0xde, 0x07, 0x24, 0xf7, 0xde, 0x15, 0x1c, 0xe5, 0xc5, 0xf4, 0x19, 0x19, + 0x20, 0xfb, 0xd3, 0xf0, 0x2e, 0x0a, 0xd0, 0x00, 0x24, 0xe2, 0x0a, 0x07, + 0xd7, 0xfb, 0xff, 0xe5, 0xf0, 0x07, 0x24, 0x19, 0xde, 0xd7, 0x0a, 0x00, + 0xf4, 0x0e, 0x27, 0xf0, 0xcc, 0x00, 0x2b, 0x03, 0xf4, 0x32, 0x0a, 0xdb, + 0xed, 0x03, 0x00, 0x12, 0xff, 0xd0, 0x00, 0x32, 0x0e, 0xd7, 0xe9, 0x27, + 0xf7, 0xc1, 0x00, 0x1c, 0x00, 0x0a, 0x03, 0xc9, 0xe2, 0x19, 0x2b, 0x15, + 0xed, 0xe9, 0xdb, 0xf7, 0x27, 0x1c, 0xf0, 0xe5, 0x03, 0xff, 0x00, 0xf4, + 0xed, 0x39, 0x12, 0xd7, 0xde, 0x0e, 0x24, 0xff, 0xe5, 0x07, 0x15, 0x00, + 0xd3, 0xfb, 0x2e, 0x15, 0xd7, 0xe5, 0x2b, 0x24, 0xd7, 0xde, 0x1c, 0x19, + 0xd3, 0x00, 0x2b, 0xed, 0xd0, 0x15, 0x19, 0xff, 0xf0, 0xdb, 0xfb, 0x27, + 0x0e, 0xe2, 0x03, 0x32, 0xff, 0xde, 0xe5, 0x0a, 0x00, 0x0e, 0x00, 0xc9, + 0x07, 0x2b, 0x07, 0xd0, 0xe2, 0x19, 0x0e, 0xf4, 0x03, 0x00, 0xf4, 0xe2, + 0x15, 0x15, 0xed, 0xe9, 0x24, 0x2e, 0xf0, 0xd3, 0x00, 0x39, 0x00, 0xd3, + 0x0a, 0x27, 0xf4, 0xd7, 0xf0, 0xf4, 0xff, 0x12, 0xfb, 0xf4, 0xd7, 0x0e, + 0x27, 0xff, 0xd0, 0xed, 0x2b, 0x2b, 0x00, 0xe2, 0xed, 0xed, 0xf7, 0x24, + 0x27, 0xe9, 0xe5, 0x24, 0xf4, 0xcc, 0x03, 0x2e, 0x20, 0xed, 0x03, 0x0e, + 0xde, 0xdb, 0xe9, 0x19, 0x1c, 0xe9, 0xf7, 0x36, 0xf0, 0xde, 0x20, 0xff, + 0xd0, 0x0e, 0x32, 0x00, 0xd3, 0xd7, 0x00, 0x03, 0xf4, 0x32, 0xfb, 0xd7, + 0x19, 0x0a, 0xc1, 0xe9, 0x20, 0x27, 0x00, 0xed, 0x07, 0xf0, 0xf0, 0x03, + 0x19, 0xdb, 0xed, 0x32, 0x20, 0xf0, 0xe9, 0x12, 0xe5, 0xed, 0x2b, 0xff, + 0xdb, 0x00, 0x1c, 0xed, 0xcc, 0x0a, 0x20, 0xe2, 0xf0, 0x3d, 0x03, 0xd3, + 0xd0, 0xf4, 0x19, 0x1c, 0x07, 0xe9, 0xed, 0x19, 0x0e, 0xd7, 0xde, 0x19, + 0x24, 0x0a, 0xe9, 0xe2, 0x15, 0xfb, 0xfb, 0x27, 0x00, 0xd7, 0xd7, 0x0e, + 0x2b, 0xf0, 0xc9, 0x03, 0x32, 0x07, 0xd3, 0x07, 0x24, 0xdb, 0xe9, 0x00, + 0xff, 0xfb, 0xf4, 0xed, 0x0a, 0x2b, 0x0e, 0xf0, 0xd7, 0xed, 0x19, 0x0a, + 0x00, 0x0e, 0xff, 0xf0, 0x03, 0x27, 0xe2, 0xe5, 0x0e, 0x32, 0xe9, 0xd0, + 0x12, 0x2b, 0xdb, 0xe2, 0x12, 0xfb, 0x03, 0x19, 0xd7, 0xc9, 0xe9, 0x0e, + 0x12, 0x03, 0x07, 0xf0, 0x0a, 0x07, 0xde, 0xdb, 0x00, 0x27, 0x15, 0xd7, + 0xdb, 0x07, 0x03, 0xe5, 0x19, 0x20, 0xdb, 0xf7, 0x3d, 0x07, 0xd7, 0xd3, + 0x00, 0x20, 0xfb, 0x19, 0x20, 0x00, 0xe9, 0xd0, 0xf0, 0x24, 0x00, 0x03, + 0x36, 0xff, 0xdb, 0x07, 0x19, 0xde, 0xff, 0xf0, 0xed, 0x24, 0xfb, 0xc5, + 0x0a, 0x24, 0xe5, 0xf7, 0x39, 0xf4, 0xcc, 0xe9, 0x1c, 0xfb, 0xd3, 0x0e, + 0x24, 0x19, 0x00, 0xff, 0xde, 0xd7, 0x0a, 0x1c, 0x00, 0x0a, 0x12, 0xde, + 0x24, 0x15, 0xd3, 0xf4, 0x2b, 0x12, 0xe5, 0xed, 0xf4, 0xde, 0x00, 0x27, + 0x12, 0xf7, 0xdb, 0x07, 0x24, 0xd7, 0xc9, 0xff, 0x15, 0xfb, 0xf4, 0x19, + 0x0a, 0xd0, 0x0e, 0x20, 0xde, 0xf4, 0x27, 0x0e, 0xdb, 0x12, 0x07, 0xd7, + 0x00, 0x36, 0x15, 0xde, 0xde, 0xf7, 0x00, 0x2b, 0x0e, 0xe9, 0xf4, 0x0e, + 0xf7, 0x07, 0x19, 0xd0, 0xd3, 0x0e, 0x2e, 0x07, 0xdb, 0xe2, 0xff, 0x24, + 0x15, 0xe9, 0xd7, 0x00, 0x12, 0x19, 0xf7, 0xd3, 0xfb, 0x24, 0x20, 0xed, + 0xc9, 0xe5, 0x1c, 0x1c, 0x00, 0xf7, 0xf4, 0xed, 0x32, 0x0e, 0xd3, 0xde, + 0x1c, 0x32, 0xff, 0xde, 0xf7, 0x07, 0x15, 0xfb, 0xe9, 0x2e, 0x00, 0xcc, + 0xf4, 0x27, 0xfb, 0xd0, 0x24, 0x1c, 0xd3, 0xed, 0x36, 0xfb, 0xcc, 0x0e, + 0x32, 0xe5, 0xd3, 0x19, 0x27, 0xd0, 0xd3, 0x0a, 0x0a, 0xe2, 0x32, 0x24, + 0xe9, 0xd0, 0xe9, 0x24, 0x0e, 0xdb, 0x00, 0x32, 0x0e, 0xde, 0xd7, 0xff, + 0x12, 0x0e, 0x20, 0x00, 0xfb, 0xf4, 0xdb, 0x15, 0x36, 0x0a, 0xde, 0xfb, + 0x00, 0xe5, 0xe5, 0x15, 0x15, 0xd0, 0xf4, 0x32, 0x12, 0xed, 0x00, 0xdb, + 0xd7, 0x07, 0x2b, 0x15, 0xdb, 0xde, 0x19, 0x0e, 0xc5, 0xed, 0x27, 0x20, + 0xf7, 0xe5, 0x20, 0x00, 0xcc, 0xf0, 0x32, 0x1c, 0xed, 0xfb, 0xf4, 0xe2, + 0x00, 0xff, 0xed, 0x0a, 0x2e, 0x07, 0xe9, 0xf7, 0xde, 0xed, 0x15, 0x12, + 0x00, 0xe5, 0xe2, 0x2b, 0x19, 0xf4, 0xd3, 0xed, 0x27, 0x2b, 0x00, 0xd3, + 0xde, 0x12, 0x12, 0xfb, 0xff, 0xde, 0x2b, 0x27, 0xe2, 0xd7, 0xf7, 0x00, + 0xf4, 0x0a, 0xff, 0xe9, 0xf7, 0x24, 0x07, 0xf4, 0xc9, 0x00, 0x27, 0xff, + 0x00, 0x00, 0xc9, 0xe9, 0x20, 0x20, 0x03, 0x00, 0x27, 0x00, 0xde, 0xf0, + 0x12, 0xf7, 0xf4, 0x20, 0x07, 0xd0, 0xd3, 0x0a, 0x24, 0xf0, 0xf7, 0x12, + 0xc5, 0x03, 0x32, 0x03, 0xd0, 0xcc, 0x00, 0x20, 0x24, 0x12, 0xd7, 0xe2, + 0x0e, 0x03, 0xe2, 0x1c, 0x1c, 0xed, 0xf7, 0x20, 0xde, 0xd3, 0x19, 0x20, + 0xe2, 0x00, 0x24, 0xe2, 0xe9, 0xf7, 0xff, 0x24, 0xe5, 0xed, 0x39, 0x1c, + 0xed, 0xd7, 0xe9, 0x1c, 0xff, 0xed, 0x2b, 0xe9, 0xc9, 0x15, 0x2b, 0xf7, + 0xe9, 0x24, 0xf7, 0xf4, 0x0e, 0xe2, 0x00, 0x00, 0xf7, 0xf7, 0xf4, 0xfb, + 0x24, 0x24, 0xe5, 0xd0, 0xe9, 0x1c, 0x2b, 0x03, 0xd7, 0x00, 0x00, 0xd0, + 0xe9, 0x1c, 0x1c, 0x00, 0xf4, 0x00, 0xf7, 0xed, 0xff, 0x27, 0x03, 0xd3, + 0x0e, 0x32, 0xf7, 0xde, 0xfb, 0xed, 0xf7, 0x27, 0x15, 0xde, 0x07, 0x1c, + 0xd0, 0xd7, 0x0a, 0x2e, 0x15, 0xf7, 0xe2, 0xd7, 0xfb, 0x1c, 0x15, 0xe9, + 0xe9, 0x0e, 0xed, 0xe9, 0x2b, 0x12, 0xd7, 0x00, 0x3d, 0x00, 0xdb, 0xff, + 0xff, 0xdb, 0x00, 0x2b, 0xfb, 0xc9, 0x00, 0x24, 0x00, 0x0a, 0x12, 0xd0, + 0xde, 0x19, 0x2e, 0x00, 0xcc, 0xe9, 0x27, 0x19, 0xd3, 0xf4, 0x39, 0x19, + 0xed, 0xd3, 0xe9, 0x27, 0x2e, 0x03, 0xf0, 0xdb, 0xd7, 0x03, 0x24, 0x12, + 0xde, 0xde, 0xf0, 0x20, 0x07, 0xed, 0x20, 0xf0, 0xd7, 0x00, 0x2e, 0xfb, + 0xd3, 0x19, 0x12, 0xc5, 0xed, 0x2b, 0x19, 0xe5, 0xf4, 0x24, 0xfb, 0xfb, + 0x0e, 0x07, 0xf4, 0x0a, 0xe9, 0xe2, 0x12, 0x24, 0xfb, 0xfb, 0x15, 0xe2, + 0x00, 0x20, 0xed, 0xd7, 0x07, 0x00, 0xf7, 0x0e, 0xf7, 0xf4, 0x00, 0xed, + 0xf0, 0x1c, 0x19, 0xd7, 0xde, 0x12, 0x00, 0x19, 0x1c, 0xe2, 0xe2, 0x12, + 0x2e, 0xe5, 0xdb, 0xff, 0xed, 0xff, 0x27, 0xf0, 0xf0, 0x39, 0xf7, 0xcc, + 0xd7, 0x0a, 0x20, 0x1c, 0x00, 0xd0, 0xd3, 0x0a, 0x27, 0x0a, 0xff, 0x1c, + 0xdb, 0xe5, 0x2e, 0x27, 0xde, 0xe5, 0x0e, 0xe9, 0xfb, 0x2e, 0x1c, 0xf0, + 0xe2, 0xd7, 0xff, 0x27, 0x1c, 0xfb, 0x03, 0xf4, 0xc9, 0x00, 0x2e, 0x03, + 0xd7, 0x12, 0x00, 0xbe, 0xf7, 0x20, 0x07, 0x00, 0x07, 0xd0, 0x1c, 0x2b, + 0xe5, 0xcc, 0xff, 0x20, 0xe9, 0x12, 0x32, 0xf0, 0xd7, 0x15, 0x20, 0xd3, + 0xff, 0x32, 0xe5, 0xe9, 0x2b, 0x03, 0xc9, 0xe5, 0x0a, 0x1c, 0x0e, 0xdb, + 0xe2, 0x24, 0x0e, 0xd0, 0xdb, 0x15, 0x2b, 0x20, 0x03, 0xed, 0xd7, 0xde, + 0x0a, 0x20, 0xed, 0xd3, 0x27, 0x20, 0xe5, 0xf4, 0x24, 0xed, 0xd0, 0x12, + 0x20, 0xe5, 0xde, 0x19, 0x1c, 0xd7, 0xe2, 0x12, 0x32, 0x1c, 0xfb, 0xf4, + 0xd7, 0xe2, 0x12, 0x2e, 0x1c, 0xe2, 0xe9, 0x1c, 0xfb, 0xc1, 0x00, 0x2b, + 0x03, 0xcc, 0xfb, 0x15, 0x03, 0x15, 0xf7, 0xe5, 0xde, 0x00, 0x24, 0x20, + 0xf7, 0xc9, 0xdb, 0x0a, 0x15, 0x15, 0x15, 0x07, 0xed, 0xdb, 0xf7, 0xff, + 0x07, 0x32, 0x19, 0xf0, 0xe9, 0xe9, 0xe5, 0x19, 0x12, 0xd0, 0x03, 0x32, + 0x0a, 0xde, 0xe2, 0x0e, 0xff, 0x0a, 0x24, 0xd7, 0xd0, 0x07, 0x27, 0xf4, + 0xf7, 0x07, 0xe2, 0x19, 0x36, 0xf7, 0xdb, 0xde, 0xf4, 0x00, 0x12, 0x12, + 0x0e, 0x03, 0xd0, 0xd7, 0x0a, 0x19, 0xfb, 0x24, 0x0e, 0xcc, 0xdb, 0x12, + 0x24, 0xf4, 0x00, 0x00, 0xd7, 0x0e, 0x32, 0xfb, 0xc5, 0xe5, 0x15, 0x15, + 0x15, 0x19, 0xed, 0xd7, 0xe2, 0x07, 0x00, 0x24, 0x24, 0xe9, 0xf0, 0xff, + 0xf0, 0xfb, 0xff, 0x24, 0x0e, 0xfb, 0xf4, 0xdb, 0x1c, 0x00, 0xc9, 0x07, + 0x32, 0x00, 0xd3, 0xf7, 0x07, 0xe9, 0xf0, 0x07, 0x0e, 0x1c, 0xed, 0xde, + 0x0a, 0x27, 0xe2, 0xf0, 0x0a, 0xe2, 0xff, 0x24, 0x1c, 0xd7, 0xe2, 0x20, + 0x0e, 0xf4, 0x0e, 0x12, 0xf7, 0xcc, 0x00, 0x24, 0xd3, 0xe9, 0x2e, 0x15, + 0xdb, 0xcc, 0xff, 0x2b, 0x24, 0xff, 0xc9, 0xed, 0x20, 0xfb, 0xed, 0x32, + 0x07, 0xd3, 0xe5, 0x27, 0x15, 0xcc, 0x00, 0x32, 0xf0, 0xdb, 0x27, 0x15, + 0xd0, 0x03, 0x24, 0xd0, 0xd3, 0x0e, 0x24, 0xd7, 0xe2, 0x27, 0x03, 0xde, + 0x27, 0x20, 0xd7, 0xdb, 0x1c, 0x2e, 0xf0, 0xde, 0x00, 0x0a, 0x0e, 0xf4, + 0xe9, 0xed, 0x00, 0x2b, 0x27, 0xf0, 0xd3, 0xed, 0x15, 0xfb, 0x20, 0x0e, + 0xd7, 0xd3, 0x03, 0x20, 0xf4, 0x07, 0xff, 0xd3, 0x07, 0x15, 0xde, 0x07, + 0x24, 0xdb, 0xc9, 0x00, 0x1c, 0xf7, 0x12, 0x20, 0xcc, 0xd0, 0x00, 0x1c, + 0x15, 0x0e, 0x03, 0xf0, 0xf4, 0x36, 0xfb, 0xf0, 0x12, 0xfb, 0xf7, 0x00, + 0xff, 0x0a, 0x00, 0x03, 0xde, 0xf7, 0x0e, 0x07, 0x19, 0xde, 0xd3, 0x03, + 0x07, 0xe2, 0x19, 0x12, 0xd3, 0xe5, 0x2b, 0x15, 0xd3, 0xde, 0x27, 0x0a, + 0xd3, 0x12, 0x1c, 0xcc, 0xd3, 0x0a, 0x19, 0xff, 0x20, 0x15, 0xd7, 0xde, + 0x1c, 0x2b, 0xe2, 0x03, 0x32, 0xe5, 0xd0, 0xed, 0x27, 0x15, 0xdb, 0xfb, + 0x20, 0xe2, 0x00, 0x36, 0xf0, 0xdb, 0xe9, 0xf0, 0x0a, 0x19, 0x2b, 0xf0, + 0xd3, 0xde, 0x00, 0x12, 0x00, 0x19, 0x0e, 0xed, 0xd0, 0xf0, 0x24, 0x27, + 0x15, 0xed, 0xdb, 0xf0, 0x2b, 0x00, 0xc1, 0x00, 0x27, 0xf7, 0xf4, 0x3d, + 0x00, 0xd7, 0xf0, 0x1c, 0x12, 0xdb, 0xe9, 0x2b, 0x03, 0xd7, 0xde, 0x19, + 0xff, 0x03, 0x20, 0xf0, 0x00, 0xf4, 0x0e, 0x0a, 0xc9, 0xed, 0x27, 0x24, + 0xed, 0xde, 0x00, 0xe9, 0xe5, 0x24, 0x20, 0xe2, 0xdb, 0x2b, 0x20, 0xde, + 0xe5, 0x24, 0x0e, 0xf7, 0xf7, 0xf7, 0xff, 0x1c, 0xf4, 0xe9, 0xff, 0xed, + 0xf7, 0x24, 0x19, 0xde, 0xd0, 0x00, 0x2e, 0xff, 0xe2, 0xf7, 0x12, 0xf4, + 0xdb, 0x20, 0x03, 0xe5, 0xf4, 0x24, 0x12, 0xde, 0xe2, 0xfb, 0x20, 0x1c, + 0xf7, 0xed, 0x07, 0xf7, 0xed, 0x2e, 0x0e, 0xf7, 0x0e, 0x03, 0xde, 0xf0, + 0x2e, 0x1c, 0xde, 0xd3, 0xf4, 0x0a, 0xf0, 0x12, 0x15, 0xd7, 0xdb, 0x00, + 0x20, 0x19, 0xde, 0xcc, 0xf0, 0x12, 0xf7, 0x03, 0x32, 0x03, 0xf7, 0xf7, + 0xdb, 0xfb, 0x32, 0x20, 0xf0, 0xd3, 0xe2, 0x0a, 0x20, 0x07, 0x00, 0x19, + 0xed, 0xcc, 0xf4, 0x27, 0x1c, 0xe9, 0xe2, 0x19, 0x1c, 0xf4, 0xff, 0x07, + 0x00, 0xcc, 0xde, 0x15, 0x2b, 0x1c, 0xf0, 0xe9, 0xe2, 0xde, 0x12, 0x2e, + 0x0a, 0xd3, 0xe2, 0xf4, 0xed, 0x0a, 0x24, 0xff, 0xcc, 0x00, 0x36, 0xfb, + 0xc9, 0xed, 0x27, 0x0e, 0xe5, 0x0a, 0x15, 0x00, 0xc9, 0xf0, 0x24, 0xfb, + 0xe5, 0x24, 0x2e, 0xf7, 0xdb, 0xed, 0x0a, 0x00, 0x00, 0xfb, 0xfb, 0x07, + 0x19, 0x07, 0xe9, 0xcc, 0x00, 0x27, 0xf0, 0x03, 0x0e, 0xc1, 0xe2, 0x0e, + 0x24, 0x15, 0xf0, 0x00, 0xf0, 0x07, 0x00, 0xe2, 0xf0, 0x07, 0x27, 0xe5, + 0xe5, 0x27, 0x03, 0xd7, 0xde, 0x19, 0xff, 0xfb, 0x32, 0x0e, 0xde, 0xd0, + 0xed, 0x20, 0x24, 0x12, 0xf4, 0xdb, 0xf0, 0x19, 0x19, 0xff, 0xde, 0x0e, + 0x24, 0xdb, 0xde, 0x20, 0xf7, 0xc9, 0x20, 0x20, 0xd7, 0xd7, 0x24, 0x0e, + 0xc9, 0xf7, 0x32, 0xf7, 0xe5, 0x0e, 0x03, 0xf4, 0xf7, 0xf4, 0x00, 0x03, + 0xff, 0xf4, 0x12, 0x24, 0xff, 0xe5, 0xde, 0x03, 0x2e, 0x12, 0xe2, 0xcc, + 0xff, 0x24, 0xf4, 0x00, 0x19, 0xd7, 0xe9, 0x36, 0x27, 0xed, 0xe2, 0x03, + 0xed, 0xe2, 0x24, 0xfb, 0xde, 0x0e, 0x0e, 0xf0, 0xd7, 0x19, 0x32, 0x00, + 0xd0, 0xdb, 0x12, 0x32, 0x0a, 0xdb, 0xed, 0xf7, 0xfb, 0x32, 0x20, 0xed, + 0xd0, 0xde, 0x12, 0x27, 0x19, 0x03, 0xf4, 0xfb, 0xde, 0xe2, 0x00, 0x1c, + 0x24, 0xf4, 0xcc, 0xde, 0x0a, 0x12, 0xf7, 0x1c, 0x00, 0xc5, 0x00, 0x39, + 0x0a, 0xe9, 0xf4, 0xe2, 0xf0, 0x19, 0x20, 0xed, 0xf0, 0x03, 0xde, 0x00, + 0x2e, 0x27, 0x00, 0xf0, 0xe5, 0xe2, 0xff, 0x1c, 0x20, 0xe5, 0xd7, 0xf0, + 0x12, 0x2e, 0x0e, 0xf0, 0xe9, 0xdb, 0xfb, 0x2b, 0x15, 0xd3, 0xcc, 0x03, + 0x19, 0xdb, 0x07, 0x36, 0xfb, 0xcc, 0xf0, 0x2b, 0x07, 0xe5, 0xff, 0x19, + 0x00, 0xd3, 0x07, 0x2b, 0xf0, 0xc9, 0x00, 0x2e, 0x00, 0xde, 0x1c, 0x0a, + 0xc9, 0x03, 0x32, 0x00, 0xdb, 0x19, 0xff, 0xc9, 0x07, 0x2b, 0xe9, 0xd7, + 0x19, 0xff, 0xde, 0x19, 0x03, 0x00, 0x07, 0xf4, 0xd7, 0x12, 0x2b, 0xf4, + 0xe9, 0x20, 0xe9, 0xd7, 0x27, 0x19, 0xd3, 0xed, 0x27, 0x03, 0xf0, 0x15, + 0xe2, 0xe2, 0x03, 0x07, 0xff, 0x19, 0x00, 0xd0, 0x0a, 0x27, 0xe2, 0xed, + 0x2b, 0x0a, 0xd3, 0xed, 0x27, 0x00, 0xc9, 0xff, 0x2b, 0x03, 0xd7, 0x24, + 0x20, 0xd7, 0xd0, 0xf4, 0x20, 0x15, 0x03, 0x03, 0xe2, 0xde, 0x03, 0x32, + 0x12, 0xd7, 0xd7, 0x0a, 0x24, 0xf0, 0xe5, 0x12, 0x1c, 0xd0, 0xfb, 0x2e, + 0x27, 0xf4, 0xdb, 0xe2, 0xf0, 0xf4, 0x19, 0x2b, 0x12, 0xde, 0xdb, 0xf4, + 0x07, 0x15, 0x12, 0xf4, 0xde, 0xde, 0x15, 0x2b, 0x0e, 0xe5, 0xdb, 0xf0, + 0x0e, 0x32, 0x0e, 0xdb, 0xdb, 0x03, 0x0e, 0x0a, 0x2e, 0x00, 0xe9, 0xf4, + 0xdb, 0xf4, 0x15, 0x27, 0x00, 0xf0, 0x00, 0xf7, 0xdb, 0x03, 0x2b, 0xed, + 0xc9, 0x03, 0x2e, 0x19, 0xf0, 0xf0, 0xdb, 0xe2, 0x19, 0x27, 0x12, 0xd7, + 0xd3, 0xed, 0x12, 0x19, 0x0a, 0x19, 0x00, 0xd3, 0xed, 0x20, 0xfb, 0xed, + 0x1c, 0x0a, 0xde, 0xfb, 0x2e, 0x00, 0x0a, 0xf0, 0xcc, 0xff, 0x20, 0x24, + 0xf7, 0xfb, 0xe2, 0xd7, 0x19, 0x2e, 0x03, 0xd7, 0x00, 0xf4, 0xc9, 0x15, + 0x27, 0x03, 0xc9, 0xff, 0x2e, 0xfb, 0xde, 0xff, 0x00, 0xf4, 0x07, 0x00, + 0x03, 0x00, 0xf7, 0x0a, 0x24, 0xe5, 0xdb, 0x20, 0x2b, 0xf7, 0xf7, 0xf0, + 0xd3, 0x12, 0x32, 0x0e, 0xd3, 0xe9, 0x20, 0x0e, 0xe5, 0xed, 0xe9, 0xfb, + 0x19, 0x1c, 0xe9, 0xe9, 0x20, 0xed, 0xde, 0x0e, 0xed, 0xf7, 0x36, 0x19, + 0xde, 0xd7, 0x00, 0x03, 0xed, 0x27, 0x12, 0xd3, 0xe5, 0x15, 0xf0, 0xe5, + 0x12, 0x24, 0x0a, 0xf0, 0xfb, 0x07, 0xfb, 0xe2, 0xf7, 0x19, 0x15, 0x0a, + 0xf4, 0xff, 0x20, 0xf7, 0xe2, 0xe9, 0x07, 0x1c, 0x0e, 0x00, 0xe9, 0xd0, + 0xe5, 0x12, 0x27, 0x0a, 0xd0, 0xd3, 0x00, 0x0e, 0xff, 0x03, 0xe2, 0xff, + 0x27, 0x24, 0xf4, 0xd3, 0xff, 0x0a, 0xff, 0x19, 0xfb, 0xed, 0x15, 0x1c, + 0xf0, 0xde, 0xf7, 0x2b, 0x19, 0xd7, 0xd3, 0x03, 0x07, 0xe2, 0x24, 0x19, + 0xd7, 0xdb, 0x20, 0x2e, 0xf7, 0xd0, 0xf0, 0x20, 0x1c, 0xe2, 0xd7, 0x03, + 0xff, 0x12, 0x19, 0xd3, 0xd7, 0x12, 0x27, 0x03, 0xde, 0xfb, 0xf7, 0x07, + 0x24, 0x03, 0xde, 0xe2, 0x19, 0x19, 0x07, 0xe9, 0xe9, 0x19, 0x15, 0xff, + 0xd7, 0xdb, 0x15, 0x2e, 0x03, 0xdb, 0xdb, 0xfb, 0x0e, 0x00, 0x00, 0xff, + 0xe9, 0xf7, 0x15, 0x07, 0xed, 0xf7, 0x00, 0xff, 0x00, 0x0e, 0xf7, 0xe9, + 0x2b, 0x03, 0xd0, 0xf7, 0x0a, 0x19, 0x0a, 0x00, 0xf7, 0xdb, 0xf0, 0x32, + 0x12, 0xe2, 0x00, 0x0a, 0xd3, 0xed, 0x24, 0x15, 0xe2, 0xf4, 0x2e, 0x07, + 0xf0, 0xe5, 0xde, 0x07, 0x27, 0xf4, 0xe2, 0x1c, 0xfb, 0xc9, 0x00, 0x2e, + 0x00, 0xe9, 0x07, 0x0a, 0xe2, 0xd7, 0x03, 0x1c, 0x15, 0xf4, 0xe5, 0x0e, + 0x15, 0xfb, 0xed, 0xed, 0x12, 0xed, 0x1c, 0x32, 0xf7, 0xdb, 0xde, 0xf0, + 0x0a, 0x27, 0x12, 0x03, 0xfb, 0xd7, 0xe5, 0x07, 0x20, 0x1c, 0xf4, 0xf4, + 0xe5, 0xf0, 0x24, 0x00, 0xfb, 0xf7, 0xf7, 0xf0, 0x1c, 0x20, 0xd3, 0xd0, + 0x0a, 0x07, 0xe2, 0x2e, 0x24, 0xf7, 0xd7, 0xe9, 0xff, 0xf7, 0x12, 0x24, + 0x00, 0xcc, 0xe2, 0x20, 0x2b, 0x00, 0xd7, 0xf4, 0x0e, 0xed, 0x0e, 0x24, + 0xe9, 0xcc, 0xff, 0x2b, 0x15, 0x00, 0x00, 0x03, 0xd3, 0xdb, 0x03, 0x24, + 0x24, 0xff, 0xd7, 0x00, 0x00, 0xe5, 0x2e, 0x12, 0xd3, 0xde, 0x12, 0x1c, + 0xf7, 0x07, 0xf0, 0xd3, 0x00, 0x24, 0x15, 0xe2, 0xf7, 0x19, 0xe2, 0xd7, + 0x12, 0x27, 0x0e, 0xfb, 0xd7, 0xe5, 0x0e, 0x00, 0x0a, 0x19, 0xe9, 0xcc, + 0x00, 0x27, 0x0e, 0xe9, 0xe9, 0xed, 0x07, 0x27, 0x0e, 0xdb, 0xf4, 0x15, + 0xed, 0xf7, 0x19, 0xff, 0xff, 0x27, 0xf4, 0xdb, 0xff, 0x32, 0x20, 0xff, + 0xf4, 0xed, 0xde, 0xff, 0x2e, 0xff, 0xc5, 0xfb, 0x27, 0x00, 0xcc, 0x0e, + 0x1c, 0xd0, 0xe2, 0x1c, 0x07, 0xdb, 0x0a, 0x2b, 0x00, 0xf4, 0xed, 0xed, + 0x15, 0x0e, 0xf0, 0xf4, 0xed, 0xff, 0x15, 0x15, 0xff, 0x12, 0x00, 0xe9, + 0x00, 0x07, 0xf7, 0xe9, 0x1c, 0x24, 0xe5, 0xe9, 0x15, 0x07, 0xe5, 0x0e, + 0x07, 0xcc, 0x03, 0x39, 0x07, 0xd7, 0xe9, 0x0e, 0xf4, 0xfb, 0x2b, 0xed, + 0xc1, 0xe2, 0x07, 0x15, 0x19, 0x00, 0xff, 0xe5, 0xe5, 0x00, 0x00, 0x00, + 0xed, 0x03, 0x0a, 0xd3, 0x07, 0x2b, 0x00, 0xf4, 0xed, 0x00, 0x00, 0x03, + 0x27, 0x07, 0xde, 0xe2, 0x00, 0x27, 0x27, 0xf7, 0xd7, 0xd7, 0x0e, 0x2e, + 0x03, 0xf4, 0xf7, 0xe2, 0x0a, 0x20, 0xfb, 0xed, 0x19, 0xf7, 0xc1, 0xff, + 0x19, 0xfb, 0xff, 0x03, 0xd0, 0x03, 0x27, 0xe2, 0xf4, 0x20, 0xd3, 0xe2, + 0x24, 0x2b, 0xfb, 0xd3, 0x1c, 0x07, 0xc9, 0x19, 0x36, 0x07, 0xd7, 0x00, + 0x15, 0xe9, 0x27, 0x0a, 0xcc, 0xf0, 0x2b, 0x07, 0xe2, 0x19, 0x00, 0xf0, + 0xfb, 0xd0, 0x00, 0x2e, 0x19, 0xdb, 0xd3, 0xe9, 0xf4, 0x07, 0x20, 0x07, + 0xed, 0xf7, 0xe2, 0xf7, 0x27, 0x03, 0xdb, 0x03, 0x15, 0xf7, 0xf4, 0x0a, + 0x00, 0xe9, 0xff, 0xff, 0x0a, 0x07, 0x07, 0xe9, 0xed, 0x1c, 0x0a, 0xed, + 0x03, 0x1c, 0xe2, 0xdb, 0x20, 0x19, 0xd7, 0xf7, 0x36, 0x0a, 0xdb, 0xf0, + 0x12, 0xe9, 0xfb, 0x1c, 0x0e, 0xf7, 0xed, 0x00, 0xe9, 0xf4, 0x03, 0x00, + 0x20, 0xff, 0xcc, 0xe5, 0x12, 0x20, 0x03, 0xfb, 0xe2, 0xe9, 0x15, 0x12, + 0xfb, 0xd3, 0xf4, 0x24, 0x0e, 0x00, 0x07, 0xfb, 0xdb, 0xf0, 0x07, 0x19, + 0x27, 0xf4, 0xdb, 0x03, 0x0e, 0xe5, 0x0a, 0x20, 0xe2, 0xdb, 0x19, 0x1c, + 0xd7, 0xf4, 0x19, 0xe2, 0xe9, 0x12, 0x20, 0x00, 0xf0, 0xf7, 0xdb, 0xed, + 0x20, 0x27, 0x00, 0xcc, 0xdb, 0x0e, 0x24, 0x00, 0xe9, 0xf7, 0x0a, 0xff, + 0x0e, 0x27, 0xf4, 0xd3, 0xe9, 0x0a, 0x07, 0x12, 0x0a, 0x03, 0x00, 0xe9, + 0xd3, 0x00, 0x20, 0x1c, 0x00, 0xe5, 0xd7, 0xf0, 0x20, 0x2b, 0xff, 0xe2, + 0xed, 0xdb, 0x15, 0x2b, 0xf7, 0xcc, 0xff, 0x07, 0x07, 0x03, 0x0e, 0xf7, + 0xdb, 0x15, 0x00, 0xd0, 0x0a, 0x32, 0x03, 0xf4, 0xf4, 0xe9, 0x0e, 0x2b, + 0xf0, 0xc9, 0xe2, 0x15, 0x27, 0x15, 0xfb, 0xed, 0xe2, 0xe9, 0x12, 0x1c, + 0xe5, 0xed, 0x12, 0xfb, 0xe9, 0x07, 0x0e, 0x0e, 0xff, 0xf7, 0xff, 0xdb, + 0x0a, 0x15, 0xe2, 0xed, 0x07, 0x15, 0x19, 0x0a, 0xe2, 0xf0, 0xf0, 0xed, + 0x27, 0x24, 0xed, 0xe2, 0x12, 0xf7, 0xff, 0x1c, 0x00, 0xd0, 0xf0, 0x2b, + 0x03, 0xdb, 0x07, 0x2b, 0xf0, 0xd0, 0xfb, 0x0e, 0x03, 0x12, 0xfb, 0xe5, + 0xf7, 0xff, 0x2b, 0x2b, 0xf7, 0xe2, 0xe9, 0xf7, 0xed, 0xff, 0x0e, 0x24, + 0xf7, 0xd7, 0xf4, 0x0e, 0x15, 0x0e, 0xf4, 0xd3, 0xe2, 0x12, 0x19, 0x0e, + 0x12, 0xe5, 0xcc, 0xf7, 0x20, 0xff, 0x03, 0x1c, 0xdb, 0xe2, 0x27, 0x32, + 0x00, 0xe9, 0x15, 0xe9, 0xc9, 0x00, 0x27, 0x12, 0xf0, 0x00, 0xf7, 0xd7, + 0x15, 0x2b, 0x00, 0xd7, 0xe2, 0xf7, 0x15, 0x27, 0xf4, 0xe9, 0x0a, 0xe2, + 0xf4, 0x19, 0x12, 0xed, 0xd7, 0xff, 0x0a, 0xf4, 0x12, 0x2b, 0xfb, 0xe2, + 0xd0, 0xf4, 0x24, 0x0e, 0xf4, 0xf4, 0xe5, 0x0e, 0x2e, 0x00, 0xd0, 0xf4, + 0x2b, 0x00, 0xed, 0x19, 0x00, 0xd7, 0x19, 0x24, 0xe5, 0xf4, 0x19, 0x19, + 0xe9, 0xcc, 0xe5, 0x0a, 0x15, 0x20, 0x00, 0xdb, 0xe9, 0x0a, 0x20, 0x12, + 0xe5, 0xd0, 0xf0, 0x15, 0x2b, 0x12, 0xdb, 0xf0, 0x15, 0xe5, 0xe9, 0x15, + 0x12, 0xe2, 0xf0, 0x24, 0xf0, 0xd7, 0x07, 0x27, 0x0a, 0xcc, 0xe2, 0x24, + 0x1c, 0xe9, 0x07, 0x00, 0xd3, 0x24, 0x36, 0x00, 0xe2, 0xf7, 0x0e, 0xe9, + 0xe9, 0x07, 0x24, 0x12, 0xf7, 0xed, 0x00, 0xfb, 0x00, 0x2b, 0xed, 0xe2, + 0x20, 0x03, 0xd3, 0xf7, 0x00, 0xf7, 0x12, 0x0e, 0xe2, 0xde, 0x03, 0x2b, + 0x00, 0xde, 0xf0, 0x00, 0xf0, 0x12, 0xff, 0xde, 0x0a, 0x0e, 0xff, 0xe2, + 0xfb, 0x1c, 0x1c, 0xff, 0xed, 0xf0, 0x12, 0x19, 0x19, 0x00, 0xdb, 0xe9, + 0x27, 0x0a, 0xd0, 0x0a, 0x27, 0xe9, 0xe2, 0x2e, 0x19, 0xe2, 0xf4, 0x00, + 0xdb, 0x07, 0x15, 0xe2, 0xde, 0x00, 0x03, 0x07, 0x03, 0xf7, 0xe5, 0xf0, + 0x20, 0x03, 0xdb, 0x0e, 0x2e, 0xf7, 0xe5, 0xff, 0xe5, 0x00, 0x12, 0x07, + 0xf4, 0xf7, 0x2e, 0x19, 0xed, 0xf4, 0xfb, 0xf7, 0x03, 0x1c, 0x0e, 0xed, + 0xcc, 0xe9, 0x1c, 0x27, 0x15, 0xe2, 0xde, 0xfb, 0x15, 0x00, 0xe2, 0x00, + 0x03, 0x00, 0x0e, 0xfb, 0xd3, 0x07, 0x0e, 0xf4, 0xf4, 0xe2, 0x00, 0x2b, + 0x1c, 0xf7, 0xd3, 0xdb, 0x15, 0x32, 0x15, 0xde, 0xd0, 0xf7, 0x24, 0xf4, + 0xf4, 0x27, 0x12, 0xf4, 0x00, 0xff, 0xd0, 0x00, 0x2e, 0x1c, 0xe5, 0xd3, + 0xf7, 0x2e, 0x15, 0xe5, 0xde, 0xed, 0xf0, 0x15, 0x2b, 0x0a, 0xe2, 0xd7, + 0xff, 0x20, 0xf4, 0xde, 0x12, 0x07, 0xd0, 0xf0, 0x24, 0x07, 0xe2, 0x15, + 0x2b, 0xe5, 0xdb, 0x03, 0x0e, 0xff, 0xed, 0x0e, 0x03, 0xfb, 0x19, 0x0a, + 0xe2, 0xd3, 0x07, 0x12, 0xf7, 0x0a, 0x0a, 0x00, 0xfb, 0xfb, 0x00, 0x00, + 0xe2, 0xed, 0x0e, 0x1c, 0xde, 0xd7, 0x19, 0x0e, 0xf4, 0x0e, 0x0a, 0xf7, + 0xd0, 0xf0, 0x15, 0xf7, 0x00, 0x27, 0x12, 0xe2, 0xe2, 0x00, 0x0a, 0xf7, + 0x12, 0x20, 0xed, 0xd7, 0xf4, 0x15, 0x12, 0x00, 0xf4, 0x03, 0xe9, 0xe2, + 0x00, 0x1c, 0x15, 0xe9, 0xf0, 0x12, 0xf4, 0xfb, 0x27, 0x07, 0xd7, 0xe2, + 0xf7, 0xff, 0x27, 0x12, 0xff, 0xf4, 0xd3, 0xff, 0x07, 0x24, 0x12, 0xd7, + 0xe2, 0x07, 0xff, 0x07, 0x27, 0x00, 0xe9, 0xd0, 0xe9, 0x1c, 0x20, 0x12, + 0xf4, 0xd3, 0xe5, 0x1c, 0x2b, 0x07, 0xe5, 0xed, 0xf4, 0xf0, 0x15, 0x15, + 0xf0, 0x03, 0xfb, 0xfb, 0x00, 0x12, 0xed, 0x03, 0x24, 0xe2, 0xd0, 0x00, + 0x2e, 0x0e, 0xe2, 0xd7, 0xe5, 0x0a, 0x24, 0x0e, 0xe5, 0xd7, 0x03, 0x20, + 0xf0, 0x00, 0x19, 0xd0, 0x00, 0x36, 0x00, 0xd0, 0xe2, 0x07, 0x20, 0x12, + 0xe5, 0xff, 0xfb, 0x07, 0x19, 0xe9, 0xe2, 0x0a, 0x15, 0xed, 0xf4, 0xfb, + 0x00, 0xff, 0x19, 0x15, 0xdb, 0xd7, 0x15, 0x39, 0x12, 0xe9, 0xe9, 0xf7, + 0xed, 0x20, 0x27, 0xed, 0xd7, 0xf0, 0xfb, 0xf7, 0xff, 0x20, 0x07, 0xed, + 0xff, 0xe5, 0xff, 0x2b, 0x03, 0xd7, 0xf0, 0x00, 0xe9, 0x15, 0x2e, 0x07, + 0xde, 0xde, 0x03, 0x0a, 0x03, 0x24, 0x00, 0xd7, 0xed, 0x0a, 0x20, 0x19, + 0xdb, 0xde, 0x07, 0x00, 0xf4, 0x0e, 0xff, 0xf0, 0x15, 0x19, 0xe5, 0xe2, + 0x12, 0x19, 0xff, 0xfb, 0xde, 0xf0, 0x15, 0x1c, 0xe9, 0xe2, 0x24, 0x00, + 0xc9, 0x03, 0x20, 0xf7, 0xf0, 0x0a, 0xf0, 0xf0, 0x07, 0x07, 0xed, 0x00, + 0x19, 0xfb, 0xdb, 0x00, 0x0e, 0x00, 0x15, 0x0e, 0xdb, 0xe9, 0x0e, 0x12, + 0x0e, 0xf7, 0xd3, 0x0a, 0x36, 0x0e, 0xe5, 0xf7, 0x03, 0xde, 0x03, 0x32, + 0xf7, 0xd0, 0xed, 0x0e, 0xf7, 0xfb, 0x0a, 0xf4, 0x0a, 0x15, 0xed, 0xd3, + 0xed, 0x00, 0x0e, 0x27, 0x00, 0xcc, 0xf7, 0x32, 0x03, 0xd0, 0xf0, 0x20, + 0x1c, 0x07, 0x03, 0xde, 0xd3, 0x00, 0x24, 0x20, 0xf4, 0xd7, 0x07, 0x36, + 0x00, 0xd3, 0xfb, 0x15, 0x03, 0xff, 0x19, 0x00, 0xd7, 0xf4, 0x12, 0xed, + 0xe5, 0x24, 0x27, 0xf4, 0xed, 0xff, 0xd7, 0xed, 0x20, 0x24, 0xff, 0xdb, + 0xf0, 0xed, 0x03, 0x2b, 0x00, 0xde, 0xe5, 0x00, 0x24, 0x15, 0xff, 0xed, + 0xe5, 0x00, 0x0e, 0x15, 0xff, 0xe2, 0x07, 0x07, 0xe2, 0xf7, 0x27, 0x27, + 0x00, 0xf7, 0xde, 0xde, 0x15, 0x32, 0x00, 0xe5, 0x0e, 0xde, 0xde, 0x19, + 0x19, 0xe2, 0xc9, 0x07, 0x20, 0x03, 0xf7, 0x03, 0xe5, 0xd3, 0x0e, 0x20, + 0x0a, 0xe2, 0xed, 0x0e, 0x07, 0xf7, 0x03, 0x15, 0x0a, 0xff, 0xfb, 0xed, + 0xe2, 0x0a, 0x27, 0x12, 0xde, 0xf7, 0x20, 0xff, 0xdb, 0xe2, 0x19, 0x27, + 0x03, 0xe5, 0xf0, 0x00, 0x03, 0x03, 0xf7, 0xff, 0x07, 0xe5, 0xd3, 0x15, + 0x1c, 0xd7, 0xf0, 0x32, 0xff, 0xe2, 0x12, 0x07, 0xe2, 0x00, 0xff, 0xf4, + 0x2e, 0x1c, 0xe2, 0xd7, 0x0a, 0x19, 0xed, 0xf4, 0xff, 0xf4, 0x2b, 0x0e, + 0xd7, 0xed, 0x20, 0x00, 0xdb, 0x0e, 0x12, 0xe9, 0x00, 0x00, 0xf4, 0xff, + 0x15, 0xff, 0x0e, 0x0e, 0xe9, 0xe2, 0xe2, 0x00, 0x1c, 0x19, 0xf7, 0xe2, + 0x15, 0x19, 0xd7, 0xe9, 0x19, 0xf4, 0xde, 0x24, 0x20, 0xe9, 0xde, 0x07, + 0x0e, 0xfb, 0x03, 0xff, 0xe5, 0x12, 0xff, 0xd3, 0x0e, 0x36, 0x20, 0xfb, + 0xed, 0xf0, 0xe5, 0xf4, 0x24, 0x15, 0xde, 0xed, 0x07, 0xf4, 0x1c, 0x24, + 0xe9, 0xd0, 0xde, 0x0e, 0x24, 0x07, 0xe9, 0xf0, 0xf7, 0xf0, 0x15, 0x2b, + 0xff, 0xd7, 0xf4, 0x00, 0xde, 0x03, 0x2e, 0x20, 0xf4, 0xd3, 0xdb, 0x07, + 0x27, 0x24, 0xe9, 0xc9, 0xf4, 0x2b, 0x24, 0x00, 0xfb, 0xf4, 0xe5, 0xfb, + 0x12, 0x24, 0xe9, 0xe2, 0x0a, 0x00, 0xd7, 0x07, 0x2b, 0x03, 0xe5, 0xd0, + 0xf4, 0x0a, 0x1c, 0x00, 0xf0, 0x12, 0x00, 0xed, 0x0a, 0x12, 0xd0, 0xde, + 0x1c, 0x24, 0xff, 0xff, 0x2e, 0xf7, 0xd7, 0xf4, 0x0e, 0xf4, 0x00, 0x27, + 0xf7, 0xd3, 0x00, 0x12, 0x00, 0xff, 0xed, 0xe2, 0x1c, 0x1c, 0xfb, 0xfb, + 0xe2, 0xed, 0x20, 0x32, 0xff, 0xdb, 0xe9, 0xed, 0x00, 0x15, 0xfb, 0xfb, + 0x20, 0x03, 0xd0, 0xe5, 0x07, 0x07, 0x15, 0x12, 0xe9, 0xdb, 0x19, 0x24, + 0xfb, 0xf4, 0xfb, 0xed, 0xed, 0x0a, 0x1c, 0x00, 0xe5, 0xfb, 0x07, 0x0e, + 0x00, 0xfb, 0x03, 0xff, 0xdb, 0xe2, 0x00, 0x0a, 0x0a, 0x24, 0x0a, 0xde, + 0xde, 0x0a, 0x20, 0x03, 0x00, 0xed, 0xe5, 0x03, 0x24, 0x07, 0xdb, 0xf0, + 0xf7, 0x0a, 0x03, 0xfb, 0x00, 0x0a, 0x15, 0xe9, 0xd7, 0x03, 0x12, 0x00, + 0x0e, 0xf7, 0xcc, 0xff, 0x24, 0x00, 0xe9, 0x12, 0x0a, 0xed, 0xff, 0xed, + 0xff, 0x2b, 0x12, 0xd3, 0xe9, 0x0a, 0xf0, 0x03, 0x03, 0xfb, 0xf7, 0x0e, + 0x12, 0x07, 0x07, 0xed, 0xed, 0x03, 0x0a, 0xf4, 0x00, 0x12, 0xe2, 0xd0, + 0x0e, 0x12, 0xff, 0x0e, 0x0a, 0xf0, 0xf4, 0xfb, 0xfb, 0x00, 0xff, 0x15, + 0x03, 0xe2, 0xf0, 0x1c, 0x07, 0xe5, 0xe9, 0x1c, 0x20, 0xe5, 0xe5, 0x0a, + 0x00, 0x00, 0x24, 0xf4, 0xcc, 0xe2, 0x0a, 0x15, 0x15, 0x15, 0xe2, 0xde, + 0x15, 0x12, 0xf0, 0xfb, 0x1c, 0x00, 0xf7, 0xf0, 0xff, 0x07, 0x19, 0x00, + 0xcc, 0xf4, 0x20, 0x00, 0xf7, 0xfb, 0xfb, 0x0e, 0xf0, 0xf7, 0x20, 0x1c, + 0xde, 0xd0, 0xe5, 0x0e, 0x12, 0x0e, 0x12, 0xed, 0xde, 0x07, 0x1c, 0xed, + 0xe5, 0x0e, 0x20, 0xed, 0xdb, 0x0e, 0x00, 0xfb, 0x2e, 0x03, 0xd7, 0xf7, + 0x1c, 0x0a, 0xe2, 0xf4, 0x27, 0x03, 0xe9, 0x03, 0x0e, 0xff, 0xd7, 0xe2, + 0x07, 0xfb, 0x07, 0x20, 0xe9, 0xf7, 0x19, 0xf4, 0xed, 0x03, 0xff, 0x00, + 0xfb, 0xe9, 0x12, 0x12, 0xf0, 0xf7, 0x15, 0x00, 0xdb, 0x00, 0x0e, 0x00, + 0xf7, 0x15, 0x0a, 0xf7, 0xf7, 0xed, 0x00, 0x19, 0x00, 0xfb, 0xdb, 0xf7, + 0x20, 0x07, 0xfb, 0x19, 0xe5, 0xd3, 0x00, 0x12, 0x12, 0x0a, 0x03, 0xde, + 0xde, 0x00, 0x1c, 0x20, 0x00, 0xe9, 0xe2, 0x03, 0x0a, 0xf4, 0xff, 0xfb, + 0x12, 0x07, 0xe5, 0xe9, 0x07, 0x0a, 0x0a, 0x00, 0xd7, 0xfb, 0x20, 0x24, + 0xf0, 0xd3, 0xf7, 0x1c, 0x0e, 0x00, 0x00, 0xf7, 0xe2, 0x00, 0x1c, 0x00, + 0xe2, 0x0e, 0x0a, 0xff, 0x03, 0xd3, 0xfb, 0x2e, 0xff, 0xe2, 0x0a, 0x00, + 0xd0, 0x00, 0x20, 0x03, 0xff, 0x07, 0xf0, 0xcc, 0x0a, 0x32, 0x00, 0xd7, + 0xff, 0x03, 0xf0, 0xf0, 0x1c, 0x15, 0xe5, 0xed, 0xf4, 0xf7, 0x12, 0x03, + 0xf4, 0x07, 0xff, 0xf4, 0x0e, 0xf7, 0x00, 0x03, 0xe5, 0xed, 0x12, 0x27, + 0x12, 0xf0, 0xde, 0xf7, 0x15, 0x00, 0xf0, 0x0e, 0x15, 0xf4, 0xe9, 0x00, + 0xfb, 0xed, 0xf7, 0x1c, 0x24, 0xe9, 0xcc, 0xed, 0x27, 0x12, 0xdb, 0xfb, + 0x19, 0x12, 0x0e, 0xf0, 0xdb, 0xdb, 0x00, 0x27, 0x12, 0xde, 0xe2, 0x1c, + 0x27, 0xf4, 0xe5, 0xed, 0xff, 0x00, 0x20, 0x1c, 0xde, 0xd7, 0x15, 0x36, + 0x00, 0xd7, 0xfb, 0x20, 0x00, 0xed, 0xf7, 0xed, 0x03, 0x32, 0x0e, 0xf4, + 0xe2, 0xd0, 0x00, 0x24, 0x1c, 0xe9, 0xde, 0xf7, 0x00, 0x24, 0x00, 0xd3, + 0xed, 0x12, 0x0e, 0xde, 0xff, 0x0a, 0x03, 0xff, 0xe5, 0xf4, 0x03, 0x24, + 0x12, 0xe2, 0xd7, 0xe9, 0x0e, 0x24, 0x27, 0xfb, 0xe2, 0x0e, 0x00, 0xde, + 0x00, 0x1c, 0xff, 0xf7, 0x1c, 0xe5, 0xe5, 0x20, 0x20, 0xe9, 0xe5, 0xf7, + 0xe5, 0x00, 0x15, 0xff, 0xf0, 0x15, 0x15, 0xf0, 0xde, 0x00, 0x19, 0xf0, + 0xe5, 0x07, 0x03, 0xe2, 0x0a, 0x20, 0xf4, 0xdb, 0xf0, 0x0e, 0x0e, 0x00, + 0x0a, 0xf7, 0xd0, 0x03, 0x32, 0x07, 0xdb, 0xff, 0x19, 0x03, 0xdb, 0xed, + 0x1c, 0x24, 0x00, 0xfb, 0xf0, 0xd3, 0x03, 0x2b, 0x03, 0xe5, 0xe2, 0xed, + 0x0e, 0x24, 0x0e, 0xe9, 0xed, 0x07, 0x07, 0xff, 0xed, 0xe5, 0xf7, 0x19, + 0x19, 0xe5, 0xed, 0x1c, 0x00, 0xc5, 0xe2, 0x15, 0x12, 0x03, 0x03, 0xf0, + 0xf4, 0x1c, 0x19, 0xe2, 0xed, 0x12, 0x00, 0xfb, 0x03, 0x12, 0x12, 0xed, + 0xdb, 0x0e, 0x2e, 0xf4, 0xd7, 0xff, 0xfb, 0xdb, 0x0e, 0x2b, 0x12, 0xe5, + 0xe5, 0x03, 0xff, 0xdb, 0x19, 0x0e, 0xe9, 0xf7, 0x00, 0x03, 0x15, 0x00, + 0xd7, 0xe2, 0x0a, 0x03, 0x00, 0x12, 0xf7, 0xe2, 0x00, 0x15, 0xff, 0x0e, + 0x1c, 0xff, 0xd7, 0xe2, 0x0e, 0x24, 0x12, 0xf7, 0xf4, 0xfb, 0x00, 0x07, + 0x00, 0xe2, 0xed, 0x03, 0x07, 0x0a, 0x00, 0xff, 0xff, 0xe9, 0xe9, 0x03, + 0x07, 0xf7, 0x0e, 0x03, 0xd7, 0xf4, 0x24, 0x0a, 0xe5, 0x07, 0xfb, 0xed, + 0xed, 0x07, 0x1c, 0x00, 0xfb, 0xde, 0xfb, 0x20, 0x15, 0xfb, 0xde, 0xed, + 0x0e, 0x20, 0x0e, 0xf4, 0xd7, 0xe9, 0x12, 0x19, 0x0a, 0xff, 0xe5, 0xe9, + 0x1c, 0x19, 0xde, 0xe2, 0x12, 0x12, 0xe9, 0xed, 0xf7, 0x0e, 0x15, 0xf7, + 0xed, 0xed, 0xf0, 0x12, 0x27, 0x00, 0xd7, 0xe9, 0x07, 0x2b, 0x03, 0xe5, + 0xf4, 0x00, 0xf4, 0x19, 0x1c, 0xe9, 0xd7, 0x00, 0x32, 0x1c, 0xf0, 0xde, + 0xf0, 0x0a, 0x0e, 0xed, 0xde, 0x0a, 0x2b, 0x03, 0xde, 0xd3, 0x00, 0x2b, + 0x12, 0xf4, 0xe9, 0xf4, 0x07, 0x07, 0x07, 0x00, 0xd0, 0xf4, 0x1c, 0x0e, + 0xf0, 0xe9, 0xf4, 0xf4, 0x20, 0x20, 0xfb, 0xf0, 0xed, 0xff, 0x0a, 0x00, + 0xf4, 0x00, 0x00, 0xff, 0x0a, 0xf7, 0xe9, 0xff, 0x24, 0x1c, 0xde, 0xde, + 0x15, 0x1c, 0x00, 0xed, 0xf4, 0xff, 0x0a, 0x0e, 0xed, 0xfb, 0xff, 0xf0, + 0xf0, 0x15, 0x12, 0xe2, 0x00, 0x1c, 0xed, 0xde, 0x07, 0xf7, 0xe9, 0x00, + 0x12, 0x00, 0x0a, 0x0a, 0xf7, 0xe9, 0x0a, 0x24, 0xf4, 0xd7, 0x03, 0x20, + 0xf7, 0x00, 0x15, 0xd7, 0xf0, 0x27, 0xf4, 0xd7, 0x19, 0x12, 0xde, 0xf0, + 0x15, 0x24, 0x03, 0xf0, 0xe5, 0xf0, 0x00, 0x00, 0x20, 0x03, 0xd7, 0xf0, + 0x20, 0x1c, 0xff, 0xe9, 0xf4, 0x03, 0xff, 0xe2, 0xff, 0x24, 0x07, 0xe5, + 0xe5, 0x0e, 0x27, 0x00, 0xd7, 0xdb, 0x15, 0x12, 0x00, 0x03, 0xf0, 0xff, + 0xfb, 0x0a, 0x00, 0xff, 0xe2, 0xfb, 0x20, 0xf7, 0xed, 0x00, 0x0e, 0x19, + 0xf7, 0xe9, 0xfb, 0x00, 0x0e, 0x12, 0xe5, 0xd7, 0x19, 0x2b, 0x00, 0xf0, + 0xf0, 0xe5, 0xf7, 0x12, 0x2b, 0x07, 0xde, 0xd7, 0xfb, 0x2e, 0x15, 0xdb, + 0xcc, 0x00, 0x27, 0x03, 0xe2, 0xde, 0x00, 0x1c, 0x03, 0xe2, 0xf7, 0x0e, + 0x00, 0xff, 0xf4, 0xff, 0xf4, 0x20, 0x24, 0xfb, 0xdb, 0xe2, 0x0a, 0x27, + 0x20, 0xe9, 0xd3, 0xf7, 0x32, 0x12, 0xdb, 0xed, 0x07, 0xf7, 0x0a, 0x0e, + 0x03, 0xfb, 0xe2, 0x03, 0x03, 0x0a, 0x03, 0xf0, 0x03, 0x00, 0xe5, 0xe5, + 0x0a, 0x24, 0xff, 0xf4, 0xe2, 0xe9, 0x00, 0x20, 0x12, 0xde, 0xe9, 0x0a, + 0x03, 0x03, 0x1c, 0xf0, 0xcc, 0xf7, 0x27, 0x2b, 0x0e, 0xf0, 0xde, 0xf7, + 0x07, 0x0a, 0xff, 0x0a, 0x00, 0xe2, 0x00, 0x0e, 0x0a, 0x03, 0xf7, 0xd7, + 0xe9, 0x0e, 0x07, 0xfb, 0x12, 0xfb, 0xd3, 0x0a, 0x24, 0x00, 0x00, 0xfb, + 0xd0, 0xde, 0x15, 0x27, 0x12, 0xed, 0xe9, 0xdb, 0x0e, 0x32, 0x0a, 0xdb, + 0xe5, 0x00, 0x00, 0x0a, 0x20, 0x03, 0xde, 0xed, 0x07, 0xf4, 0x0a, 0x15, + 0xf7, 0xd7, 0xff, 0x19, 0x0e, 0x0e, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf7, + 0x0e, 0xfb, 0xd7, 0xfb, 0x19, 0x1c, 0x0a, 0xf4, 0xd7, 0xe2, 0xff, 0x20, + 0x27, 0x00, 0xd7, 0xde, 0x19, 0x27, 0xe2, 0xd7, 0x07, 0xff, 0xff, 0x1c, + 0x0e, 0xf7, 0xed, 0x00, 0x00, 0xf0, 0x00, 0x0a, 0x07, 0x00, 0xd3, 0xe9, + 0x27, 0x20, 0x0a, 0x00, 0xe9, 0xd3, 0xf0, 0x20, 0x24, 0xe9, 0xd3, 0x07, + 0x07, 0x00, 0x07, 0xf0, 0xdb, 0xf4, 0x19, 0xff, 0x00, 0xf4, 0xf7, 0x15, + 0x19, 0xf4, 0xd0, 0x0e, 0x2b, 0x07, 0xe5, 0xd3, 0x03, 0x2e, 0x19, 0xfb, + 0xfb, 0x00, 0xe5, 0xf0, 0x19, 0x12, 0xe5, 0xff, 0x15, 0xe2, 0xe5, 0x15, + 0x0a, 0x00, 0xed, 0xdb, 0x00, 0x15, 0x12, 0xed, 0xe9, 0x12, 0xff, 0xcc, + 0x00, 0x27, 0x0a, 0xe2, 0xe2, 0x0a, 0x15, 0x0e, 0x19, 0xf7, 0xdb, 0xed, + 0x1c, 0x07, 0xe9, 0x00, 0xf7, 0xf7, 0x20, 0x0e, 0xdb, 0xe2, 0x12, 0xfb, + 0xed, 0x27, 0x12, 0xe5, 0xe5, 0x00, 0x03, 0x0e, 0x00, 0x00, 0xff, 0xdb, + 0xf7, 0x1c, 0x20, 0xe2, 0xed, 0x2b, 0x00, 0xd0, 0x03, 0x20, 0xe9, 0xe9, + 0xf7, 0xf4, 0x07, 0x20, 0x0e, 0xe5, 0xd3, 0x00, 0x12, 0x0a, 0x0e, 0xe2, + 0xdb, 0x15, 0x24, 0xe9, 0xf7, 0x24, 0xf4, 0xcc, 0xf4, 0x0e, 0x24, 0x0e, + 0xf0, 0xf7, 0xfb, 0x00, 0xf7, 0x15, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xe9, + 0x0e, 0x20, 0xe9, 0xdb, 0xfb, 0x19, 0x1c, 0xf7, 0xd7, 0xe9, 0x07, 0x2b, + 0x19, 0xdb, 0xd3, 0x00, 0x19, 0x00, 0xf4, 0xf4, 0x0a, 0x0a, 0xf7, 0x07, + 0x12, 0xe9, 0xde, 0xf7, 0x07, 0x1c, 0x03, 0xed, 0xde, 0x07, 0x15, 0xf0, + 0xf0, 0x24, 0x1c, 0xdb, 0xde, 0x07, 0x15, 0x03, 0x0a, 0xf7, 0xc5, 0xfb, + 0x20, 0x20, 0x03, 0xd3, 0xd7, 0x00, 0x2b, 0x20, 0xf0, 0xd3, 0xf4, 0x03, + 0xf7, 0x15, 0x19, 0xf7, 0xed, 0xff, 0x0e, 0xf7, 0xe9, 0x12, 0x12, 0xf4, + 0xe9, 0xfb, 0x0e, 0x20, 0x0e, 0xe2, 0xd3, 0xfb, 0x20, 0x20, 0x00, 0xe9, + 0xdb, 0xf4, 0x20, 0x24, 0xff, 0xd7, 0xe9, 0x0e, 0x00, 0xff, 0x19, 0xff, + 0xde, 0xff, 0x1c, 0x00, 0xe5, 0x03, 0x03, 0xe9, 0x0e, 0xff, 0xe9, 0x19, + 0x20, 0xe5, 0xdb, 0x00, 0x15, 0x00, 0xde, 0x00, 0x00, 0xf7, 0x0e, 0x12, + 0xfb, 0x00, 0x00, 0xe9, 0x00, 0x0a, 0x12, 0xff, 0xe5, 0xe9, 0x00, 0x1c, + 0x15, 0xe5, 0xcc, 0x03, 0x2b, 0x03, 0xde, 0xed, 0x19, 0x1c, 0x00, 0xf7, + 0xed, 0xe9, 0x0e, 0x0e, 0xf7, 0xe5, 0xf4, 0x0e, 0x20, 0x07, 0xe9, 0xe5, + 0x00, 0x1c, 0x00, 0xd7, 0xe2, 0xfb, 0x03, 0x15, 0x27, 0xfb, 0xcc, 0xf4, + 0x1c, 0x0a, 0xdb, 0xf0, 0x12, 0x20, 0x0e, 0xe5, 0xe9, 0x03, 0x19, 0x00, + 0x00, 0xf4, 0xf0, 0xff, 0x15, 0x07, 0xf0, 0x03, 0x20, 0x07, 0xe2, 0xd7, + 0xed, 0x0e, 0x00, 0xed, 0x03, 0x0e, 0x07, 0xff, 0xf7, 0xe5, 0xde, 0x07, + 0x19, 0xed, 0x00, 0x24, 0xfb, 0xe5, 0x00, 0x0e, 0x00, 0xfb, 0x00, 0xf7, + 0xf0, 0xfb, 0x19, 0x19, 0xff, 0xf7, 0xf0, 0x00, 0x12, 0x00, 0xcc, 0xf7, + 0x2b, 0x0e, 0xf4, 0x0a, 0x12, 0xf4, 0xf4, 0x00, 0xf4, 0xe9, 0x03, 0x20, + 0xff, 0xd3, 0xe9, 0x0a, 0x12, 0x03, 0xf4, 0xde, 0xfb, 0x19, 0x0a, 0xde, + 0xf0, 0x19, 0x03, 0x03, 0x19, 0xf4, 0xd3, 0xed, 0x0e, 0x27, 0x00, 0xdb, + 0x03, 0x27, 0xff, 0xde, 0x00, 0x0e, 0xff, 0xfb, 0x00, 0x00, 0x03, 0x00, + 0xf4, 0xf7, 0xff, 0x07, 0x12, 0x0a, 0xd3, 0xd7, 0x19, 0x24, 0xe5, 0xde, + 0x1c, 0x0e, 0xf0, 0xe9, 0xf7, 0xf4, 0x0a, 0x15, 0x03, 0xf0, 0xe2, 0x03, + 0x15, 0x0a, 0xde, 0xf0, 0x1c, 0x15, 0xf4, 0xd7, 0x07, 0x12, 0x00, 0x00, + 0xf4, 0x1c, 0xff, 0xe2, 0x12, 0x12, 0xe2, 0xe2, 0x27, 0x1c, 0xe2, 0xde, + 0x0a, 0x20, 0x15, 0xf0, 0xdb, 0xdb, 0x0e, 0x19, 0xfb, 0x03, 0xf4, 0xe5, + 0x0a, 0x2b, 0x00, 0xd3, 0xe9, 0x19, 0x24, 0xf7, 0xf4, 0xf7, 0xde, 0x1c, + 0x19, 0xf7, 0xf4, 0x12, 0x00, 0xf4, 0xde, 0xe5, 0x0a, 0x24, 0x19, 0xf4, + 0xe9, 0xe9, 0xfb, 0x24, 0x12, 0xed, 0xe5, 0xfb, 0x0e, 0x15, 0x12, 0xfb, + 0xf4, 0xe5, 0xe5, 0x0a, 0x20, 0x0e, 0xe2, 0xd3, 0xfb, 0x12, 0x1c, 0x0e, + 0xde, 0xde, 0xfb, 0x07, 0x00, 0x00, 0x00, 0xff, 0xf4, 0x07, 0x20, 0x00, + 0xe9, 0x0e, 0xf7, 0xd3, 0x03, 0x2e, 0x0e, 0xde, 0xf4, 0x12, 0xfb, 0x00, + 0x0a, 0xed, 0xf4, 0x0e, 0xed, 0xf4, 0x0e, 0x12, 0x03, 0xe9, 0xf0, 0x00, + 0x00, 0x03, 0x00, 0xe5, 0xdb, 0x12, 0x2b, 0x00, 0xe2, 0x00, 0x0e, 0xd3, + 0xe5, 0x19, 0x20, 0xfb, 0xde, 0xf0, 0x15, 0x20, 0x0a, 0xf0, 0xd3, 0xf0, + 0x0a, 0x19, 0x12, 0xf7, 0xfb, 0x00, 0x00, 0xed, 0x03, 0x0e, 0x0e, 0xf7, + 0xde, 0xf7, 0x00, 0x12, 0x07, 0xff, 0xfb, 0xf4, 0x00, 0x03, 0xf7, 0xf0, + 0x00, 0x0a, 0x00, 0x00, 0xf7, 0x0e, 0x0e, 0xe9, 0xd0, 0xf4, 0x19, 0x19, + 0x0e, 0xfb, 0xe5, 0xe2, 0x0e, 0x24, 0xf7, 0xe9, 0x03, 0x03, 0xff, 0xf7, + 0xf0, 0x00, 0x15, 0x15, 0x00, 0xed, 0xe2, 0xfb, 0x00, 0x0a, 0x15, 0x0e, + 0xff, 0xe2, 0xf7, 0x1c, 0x07, 0xde, 0xe5, 0x00, 0x12, 0x19, 0xff, 0xed, + 0x03, 0x00, 0xe9, 0xed, 0xf7, 0x24, 0x12, 0xff, 0xe5, 0xde, 0xf4, 0x1c, + 0x20, 0xed, 0xd7, 0x0a, 0x20, 0xf0, 0xe5, 0x0a, 0x0a, 0xf0, 0x03, 0x00, + 0xff, 0xff, 0x00, 0xff, 0xe5, 0x03, 0x12, 0x12, 0x0e, 0xe5, 0xe2, 0xfb, + 0xff, 0xff, 0x0e, 0x19, 0xff, 0xff, 0xf7, 0xe5, 0x00, 0x07, 0x0e, 0x00, + 0xe9, 0x00, 0x15, 0xff, 0xf4, 0xe5, 0xf4, 0x24, 0x15, 0xed, 0xf7, 0xe5, + 0xed, 0x03, 0x15, 0x07, 0xfb, 0x07, 0xfb, 0xff, 0x00, 0xf0, 0xf4, 0x07, + 0x15, 0x00, 0x00, 0xf4, 0xf7, 0xff, 0xe9, 0x03, 0x0e, 0x03, 0x00, 0x0a, + 0x0a, 0x00, 0xed, 0xe2, 0xfb, 0x27, 0x1c, 0xe5, 0xd0, 0xff, 0x1c, 0x00, + 0x00, 0xfb, 0xed, 0xf4, 0x0a, 0x0e, 0xfb, 0xe5, 0xf7, 0x03, 0xff, 0xe5, + 0x12, 0x27, 0xf7, 0xc9, 0xf0, 0x24, 0x00, 0xf7, 0x15, 0x15, 0xf4, 0xe2, + 0x03, 0x00, 0x00, 0x15, 0x00, 0xe9, 0xed, 0x12, 0x19, 0x00, 0xde, 0xed, + 0x27, 0x19, 0xf4, 0xed, 0xe2, 0x0a, 0x0e, 0xed, 0xf4, 0x0a, 0x15, 0xf7, + 0xe5, 0xe9, 0xff, 0x0e, 0x03, 0x15, 0xf7, 0xd3, 0x00, 0x1c, 0xf7, 0xf0, + 0x12, 0xff, 0xde, 0x07, 0x27, 0x00, 0xe9, 0xf4, 0x27, 0x0e, 0xd3, 0xe2, + 0x0e, 0x1c, 0xed, 0xe5, 0x0e, 0x00, 0xfb, 0x15, 0x00, 0xf0, 0xf7, 0x07, + 0x12, 0xf7, 0xfb, 0xf4, 0x00, 0x0a, 0x12, 0x0a, 0xe5, 0xe5, 0xff, 0xff, + 0x03, 0x03, 0x0a, 0x00, 0xff, 0xf4, 0xff, 0x0a, 0xfb, 0xfb, 0xfb, 0xe9, + 0x00, 0x15, 0x07, 0x07, 0xe9, 0xed, 0x12, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x0a, 0xf4, 0xfb, 0x0a, 0xf7, 0xed, 0x12, 0x07, 0xe5, 0xf4, 0x1c, 0x15, + 0xe5, 0xf7, 0x20, 0x00, 0xed, 0xff, 0xe9, 0xf0, 0x0e, 0x07, 0xfb, 0xf4, + 0x15, 0x03, 0x00, 0xf4, 0xe2, 0x03, 0x0e, 0x00, 0x07, 0xf7, 0xf4, 0xf4, + 0x00, 0x19, 0x15, 0xe9, 0xdb, 0x07, 0x19, 0x07, 0xd7, 0xf0, 0x27, 0x19, + 0xe9, 0xe5, 0xf4, 0x07, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x07, 0xdb, + 0xe2, 0x00, 0x0e, 0x20, 0xfb, 0xdb, 0x00, 0x00, 0xfb, 0x00, 0x07, 0xff, + 0xe9, 0xfb, 0x12, 0xfb, 0x00, 0x00, 0xf0, 0xff, 0x0a, 0x24, 0xfb, 0xe2, + 0xe2, 0xfb, 0x12, 0xff, 0x07, 0x1c, 0xfb, 0xdb, 0xff, 0x1c, 0xf0, 0xf0, + 0x12, 0x03, 0xed, 0xf0, 0xfb, 0x20, 0x07, 0xe5, 0xed, 0x07, 0x1c, 0xf7, + 0xf7, 0x19, 0xff, 0xd3, 0x03, 0x24, 0xf0, 0xe5, 0x0a, 0x12, 0xde, 0xde, + 0x15, 0x0e, 0xe5, 0x00, 0x0e, 0xf7, 0xf4, 0x00, 0x03, 0x00, 0xed, 0x07, + 0x0a, 0xff, 0x00, 0x00, 0xe5, 0xed, 0x0a, 0x1c, 0x0e, 0xf0, 0xf0, 0x0e, + 0x00, 0xf0, 0x00, 0x00, 0x03, 0x07, 0xf4, 0xe2, 0x07, 0x20, 0xf4, 0xdb, + 0x19, 0x0a, 0xde, 0xf7, 0x07, 0xfb, 0x00, 0x07, 0xed, 0xe2, 0x07, 0x12, + 0xf7, 0xfb, 0x00, 0xf7, 0x07, 0x03, 0xfb, 0xf0, 0x00, 0x1c, 0x00, 0xf0, + 0xf4, 0xf7, 0xf7, 0x15, 0x19, 0xde, 0xf7, 0x15, 0x00, 0xff, 0xf7, 0x00, + 0x07, 0xed, 0x03, 0x24, 0xff, 0xde, 0xfb, 0x15, 0x0a, 0xe9, 0xf4, 0x07, + 0xed, 0x0e, 0x1c, 0xdb, 0xdb, 0x20, 0x19, 0xd7, 0xde, 0x07, 0x07, 0xfb, + 0xf7, 0xf7, 0xff, 0x12, 0x15, 0x00, 0x00, 0xf0, 0xde, 0x0a, 0x20, 0xde, + 0xdb, 0x27, 0x24, 0xed, 0xf0, 0x1c, 0xf4, 0xcc, 0x07, 0x2b, 0x0e, 0xe5, + 0xff, 0x12, 0xf0, 0xff, 0x12, 0x00, 0xff, 0xe9, 0xdb, 0x12, 0x19, 0xe9, + 0xed, 0x24, 0x03, 0xe9, 0xf4, 0x03, 0x00, 0xe5, 0xf4, 0x0a, 0xed, 0xf7, + 0x24, 0x15, 0xf0, 0xe5, 0xe5, 0x12, 0x15, 0xed, 0xfb, 0x12, 0x07, 0xf0, + 0x07, 0x0e, 0xed, 0xe9, 0x07, 0x0e, 0xed, 0x00, 0x03, 0xf0, 0x0e, 0x19, + 0xff, 0xe9, 0xe9, 0xfb, 0x12, 0x0e, 0xe2, 0xd3, 0x07, 0x27, 0x19, 0xf4, + 0xe5, 0xf7, 0x00, 0x00, 0xff, 0xf4, 0x00, 0x0e, 0x00, 0xfb, 0xfb, 0x07, + 0x00, 0xe2, 0xf4, 0x03, 0x00, 0x0e, 0x07, 0xed, 0xed, 0x15, 0x12, 0x00, + 0x07, 0xe2, 0xde, 0xfb, 0x12, 0x0e, 0x00, 0x0e, 0x03, 0xeb, 0xe7, 0x0e, + 0x1c, 0xf9, 0xee, 0xf2, 0xfd, 0x1c, 0x20, 0xf6, 0xd9, 0xe7, 0x15, 0x1c, + 0xf6, 0xee, 0x00, 0xfd, 0xe4, 0x03, 0x1c, 0x03, 0xfd, 0x00, 0xe7, 0xe7, + 0xfd, 0x0e, 0x20, 0x0a, 0xe4, 0xd9, 0x19, 0x24, 0xf2, 0x00, 0x12, 0xee, + 0xd9, 0x1c, 0x2e, 0x00, 0xe0, 0xfd, 0x19, 0xf2, 0xf9, 0x15, 0x03, 0xe0, + 0xf6, 0x12, 0x07, 0xf9, 0xf2, 0xf6, 0x19, 0x03, 0xca, 0xf2, 0x24, 0x20, + 0xeb, 0xd2, 0x00, 0x0e, 0x07, 0x00, 0xee, 0xf6, 0x07, 0x12, 0x03, 0xfd, + 0xe7, 0xfd, 0x15, 0x03, 0xf6, 0xf6, 0x00, 0x07, 0x0e, 0x00, 0x00, 0xf9, + 0xf6, 0x00, 0x00, 0x03, 0xfd, 0xf9, 0x00, 0x0a, 0x03, 0xeb, 0x00, 0x24, + 0xeb, 0xe0, 0xf2, 0x00, 0x00, 0x15, 0x24, 0xe7, 0xd2, 0xeb, 0x1c, 0x19, + 0x00, 0xf2, 0xe0, 0x00, 0x0e, 0x12, 0x07, 0xeb, 0x00, 0x00, 0xf6, 0x03, + 0x0a, 0xeb, 0xee, 0x12, 0x03, 0xfd, 0x0e, 0x15, 0x00, 0xe7, 0xe4, 0xf9, + 0x12, 0x29, 0x07, 0xf2, 0x00, 0x03, 0x00, 0xee, 0xf9, 0x03, 0x00, 0x07, + 0x03, 0x0a, 0xf9, 0xfd, 0xfd, 0xf9, 0xf6, 0x0e, 0x19, 0xe7, 0xdc, 0xee, + 0x03, 0x29, 0x12, 0xe4, 0xe7, 0x07, 0x0a, 0xf2, 0xf2, 0x03, 0x00, 0xe7, + 0x15, 0x22, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x0e, 0x2d, 0x0a, 0xdc, 0xf2, + 0x07, 0x00, 0x07, 0x0e, 0x00, 0xeb, 0xee, 0x00, 0x1b, 0x00, 0xf6, 0x03, + 0xf9, 0xfd, 0x1b, 0x12, 0xe0, 0xe0, 0xfd, 0x00, 0x00, 0x0a, 0x00, 0x07, + 0x0a, 0xee, 0xe0, 0xf6, 0xfd, 0x0e, 0x12, 0x00, 0x00, 0xf9, 0x00, 0x0a, + 0xdc, 0xee, 0x1b, 0x1b, 0xf6, 0xd7, 0x0a, 0x25, 0xeb, 0xee, 0x30, 0x00, + 0xdc, 0x00, 0x03, 0xf2, 0x0a, 0x17, 0xf6, 0xeb, 0x07, 0x13, 0x00, 0x00, + 0xf2, 0xdb, 0xf9, 0x17, 0x0e, 0x0a, 0x0a, 0xe0, 0xdb, 0xf6, 0x1e, 0x17, + 0xf6, 0x00, 0x00, 0xdc, 0xee, 0x17, 0x29, 0x00, 0xdb, 0xee, 0x07, 0xf9, + 0x0a, 0x25, 0x00, 0xd7, 0xe4, 0x1b, 0x22, 0xf9, 0x00, 0x03, 0xe4, 0xe7, + 0x03, 0x25, 0x22, 0xf9, 0xe0, 0xe4, 0x00, 0x1b, 0x0e, 0x03, 0xf2, 0xdb, + 0x00, 0x1e, 0x10, 0xe7, 0xee, 0x03, 0x07, 0xeb, 0x00, 0x1b, 0xf9, 0xd7, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xf6, 0x0a, 0x0e, 0x00, 0xf9, + 0x0a, 0xfd, 0x0c, 0x0c, 0xeb, 0xe2, 0x10, 0x0a, 0xeb, 0x0c, 0x0a, 0xeb, + 0xf9, 0x17, 0x13, 0xf9, 0xf6, 0x00, 0xf6, 0xf6, 0x07, 0x0a, 0x0a, 0x00, + 0xf9, 0xe2, 0xf6, 0x13, 0x0a, 0xe7, 0xf9, 0x0c, 0xeb, 0x00, 0x2b, 0xf9, + 0xd3, 0x00, 0x13, 0x00, 0xf6, 0x07, 0x00, 0x03, 0xfd, 0xfd, 0x07, 0x13, + 0x03, 0xee, 0xf6, 0x10, 0xf9, 0xee, 0x1b, 0x1e, 0xeb, 0xde, 0x0a, 0x17, + 0xeb, 0xe2, 0xfd, 0x1e, 0x10, 0x00, 0xf6, 0xf9, 0xfd, 0x00, 0x07, 0xfd, + 0xee, 0xf9, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x0c, 0x00, 0xe2, 0xf9, 0x13, + 0x00, 0xe9, 0xfd, 0xfd, 0x10, 0x17, 0xfd, 0x00, 0xeb, 0xe5, 0x07, 0x10, + 0x09, 0x07, 0x03, 0x07, 0xf6, 0xee, 0x0c, 0x07, 0xe5, 0x07, 0x1b, 0xe9, + 0xf2, 0x13, 0x0c, 0xed, 0xed, 0x07, 0x00, 0x09, 0x00, 0xf9, 0xfd, 0xf9, + 0xf9, 0xfd, 0x07, 0x13, 0xfd, 0xed, 0xf9, 0xf2, 0xfd, 0x09, 0x0c, 0x09, + 0x00, 0xfd, 0x00, 0xee, 0xe2, 0x10, 0x10, 0xed, 0xf9, 0x09, 0x0c, 0x0c, + 0x07, 0xe9, 0xf2, 0x00, 0x10, 0x1b, 0xf6, 0xf2, 0x00, 0x00, 0xf6, 0x00, + 0x1b, 0x07, 0xf9, 0xed, 0xed, 0xf9, 0x17, 0x13, 0xf2, 0xf9, 0x17, 0x00, + 0xdc, 0xe9, 0xee, 0x00, 0x10, 0x03, 0x00, 0x07, 0x00, 0xee, 0xfd, 0xed, + 0x00, 0x24, 0x13, 0xf6, 0xe9, 0xfd, 0x00, 0x07, 0x0c, 0x07, 0xee, 0x00, + 0x17, 0xed, 0xe9, 0x17, 0x20, 0xf0, 0xf9, 0x17, 0x00, 0xf2, 0xf2, 0xfd, + 0xf9, 0x00, 0x03, 0x20, 0x13, 0xf2, 0xdc, 0xe5, 0x0c, 0x13, 0x00, 0x00, + 0x00, 0xf0, 0xe2, 0x00, 0x24, 0x00, 0xd2, 0xfd, 0x0c, 0xed, 0x03, 0x09, + 0x00, 0x00, 0xfd, 0xf6, 0x0c, 0x1c, 0x00, 0xe5, 0xdc, 0xf6, 0x10, 0x15, + 0x1c, 0x03, 0xe5, 0xd5, 0x00, 0x25, 0x20, 0x07, 0xed, 0xf9, 0x03, 0xf9, + 0x0c, 0x10, 0xf9, 0xf2, 0xfd, 0xfd, 0x00, 0x15, 0x00, 0xd5, 0xe9, 0x10, + 0x15, 0xf6, 0x00, 0x09, 0xd9, 0xd5, 0x03, 0x19, 0x13, 0x03, 0x00, 0xf0, + 0xe5, 0x00, 0x1c, 0x1c, 0xf9, 0xed, 0xed, 0x05, 0x00, 0xf2, 0x00, 0x09, + 0x10, 0xfd, 0xf9, 0xf2, 0x03, 0x03, 0x00, 0x00, 0xf9, 0x05, 0x10, 0x05, + 0xe5, 0xf9, 0x0c, 0x00, 0xf9, 0x00, 0x13, 0xe4, 0xe5, 0x15, 0x09, 0xe0, + 0xf4, 0x19, 0x0c, 0xf4, 0xfd, 0x00, 0xed, 0xf6, 0x09, 0x15, 0x00, 0xf9, + 0x00, 0xf9, 0xf9, 0xfd, 0x0c, 0x15, 0x00, 0xe9, 0xf6, 0x09, 0xe9, 0x00, + 0x19, 0x10, 0xed, 0xe9, 0x0c, 0x15, 0x05, 0xe7, 0xe7, 0x05, 0x0c, 0x03, + 0x00, 0x09, 0xe4, 0xe0, 0x10, 0x09, 0xf0, 0x09, 0x15, 0xf0, 0xe4, 0x00, + 0x10, 0x00, 0x05, 0xfd, 0xed, 0x00, 0x15, 0x03, 0xe7, 0xf9, 0x00, 0xf9, + 0x15, 0x15, 0xf4, 0xf4, 0x0c, 0xf6, 0xe0, 0x09, 0x22, 0x0c, 0xf4, 0xfd, + 0x03, 0xf0, 0xfd, 0x09, 0xf6, 0xf9, 0x15, 0x0c, 0xf9, 0xf9, 0xf6, 0xf6, + 0x00, 0x19, 0x05, 0xed, 0xe7, 0xed, 0x00, 0x1c, 0x10, 0xf0, 0xf9, 0x05, + 0x00, 0xf4, 0xf4, 0xf9, 0x00, 0x0c, 0x00, 0xfd, 0x00, 0x09, 0x15, 0x00, + 0xdb, 0xed, 0x12, 0x10, 0x05, 0xf6, 0xf6, 0x10, 0x03, 0xe7, 0x00, 0x22, + 0xfd, 0xde, 0x00, 0x15, 0xf0, 0xeb, 0x19, 0x1e, 0xf9, 0xeb, 0xf6, 0x09, + 0x00, 0xeb, 0xfd, 0x05, 0x03, 0x09, 0x15, 0xf4, 0xde, 0xf9, 0x03, 0xf9, + 0x00, 0x12, 0x03, 0xfd, 0x00, 0xfd, 0xfd, 0xf9, 0x05, 0x00, 0xed, 0xfd, + 0x00, 0x00, 0x19, 0x09, 0xe4, 0x05, 0x19, 0x00, 0xeb, 0xed, 0x03, 0x15, + 0x00, 0xfd, 0x00, 0x05, 0x00, 0xf4, 0x00, 0x12, 0xf9, 0xed, 0x0e, 0x03, + 0xeb, 0xf4, 0x0c, 0x03, 0xf0, 0xfd, 0xfd, 0x03, 0x03, 0xf6, 0xf0, 0xed, + 0x00, 0x05, 0x15, 0x12, 0xe7, 0xe2, 0x0c, 0x0c, 0xf0, 0x05, 0x24, 0x00, + 0xed, 0xfd, 0xeb, 0xf4, 0x15, 0x20, 0x00, 0xeb, 0xf4, 0x00, 0x00, 0x09, + 0x0c, 0xed, 0xed, 0x09, 0x05, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xe4, 0xf4, 0x09, 0x00, 0x00, 0x1b, 0xf4, 0xd5, 0xf4, + 0x1b, 0x09, 0xf7, 0x00, 0x12, 0xf9, 0xf4, 0x0c, 0x09, 0xf7, 0xeb, 0x09, + 0x0e, 0xf4, 0x00, 0x00, 0xf9, 0xee, 0xfd, 0x0e, 0x09, 0x00, 0x09, 0xf0, + 0xdc, 0x00, 0x0e, 0x0c, 0x0e, 0x00, 0xeb, 0xf9, 0x00, 0xf0, 0x05, 0x1b, + 0x00, 0xe7, 0x00, 0x20, 0xf7, 0xe5, 0xee, 0x00, 0x03, 0x03, 0x0e, 0x03, + 0xee, 0xe7, 0x03, 0x09, 0x15, 0x00, 0xe2, 0xf4, 0x0c, 0xf4, 0xf0, 0x1c, + 0x17, 0xf4, 0xee, 0x09, 0x05, 0xf0, 0xfd, 0xf7, 0xf9, 0x0c, 0x13, 0x09, + 0x00, 0xeb, 0xf7, 0xfd, 0x00, 0x13, 0x0a, 0xfd, 0xe2, 0xee, 0x0a, 0x13, + 0x00, 0xee, 0xfd, 0x0a, 0x00, 0xf0, 0x00, 0x05, 0xf4, 0x00, 0x05, 0x05, + 0x0a, 0xfd, 0xf4, 0x00, 0x00, 0xf0, 0x00, 0x20, 0x12, 0xf0, 0xee, 0x09, + 0x00, 0xf4, 0x12, 0x00, 0xf4, 0x03, 0xf9, 0xf0, 0x13, 0x13, 0xe9, 0xeb, + 0x12, 0x0e, 0xf4, 0xf9, 0xf9, 0xf0, 0x09, 0x09, 0x00, 0x09, 0x00, 0xeb, + 0xeb, 0xf9, 0x03, 0x00, 0x12, 0x1b, 0xf9, 0xeb, 0xf7, 0x0a, 0x0e, 0xf9, + 0xf0, 0x00, 0x05, 0xfd, 0x05, 0x00, 0xf4, 0x00, 0x03, 0x09, 0x0e, 0xeb, + 0xe9, 0x00, 0x00, 0x00, 0x13, 0x05, 0xee, 0xf9, 0x0a, 0xf4, 0xee, 0x17, + 0x12, 0xe9, 0xf4, 0x05, 0x00, 0x00, 0x00, 0xee, 0xf7, 0x0e, 0x03, 0xfd, + 0x12, 0xf2, 0xe4, 0x00, 0x0e, 0x00, 0x0a, 0xfd, 0xee, 0x05, 0xf9, 0xfd, + 0x17, 0x12, 0xf7, 0xe9, 0x05, 0x00, 0xeb, 0x17, 0x13, 0xee, 0xeb, 0x05, + 0x01, 0x01, 0x01, 0xf2, 0xf2, 0x00, 0x01, 0x00, 0xf7, 0x05, 0x01, 0xeb, + 0x00, 0x00, 0x00, 0x0a, 0x13, 0xf2, 0xe0, 0x0a, 0x19, 0xf2, 0xf7, 0x05, + 0xf7, 0xf7, 0x17, 0x09, 0xf9, 0xf4, 0xfd, 0x01, 0x00, 0x01, 0xf9, 0xf7, + 0x05, 0x00, 0xf2, 0x00, 0x01, 0x05, 0x09, 0xfd, 0xf2, 0xfd, 0xf9, 0x00, + 0x0a, 0x10, 0xfd, 0xe9, 0xfd, 0x09, 0x00, 0xf9, 0x00, 0x01, 0x01, 0x00, + 0xee, 0xf9, 0x05, 0x05, 0x00, 0x01, 0x09, 0xed, 0xe4, 0x09, 0x0e, 0xf9, + 0x00, 0x09, 0xf7, 0xe5, 0x09, 0x19, 0xfd, 0xf9, 0x09, 0xe9, 0xee, 0x19, + 0x15, 0xfd, 0xf4, 0x00, 0xf7, 0xf7, 0x19, 0x10, 0xf4, 0xf9, 0x00, 0xee, + 0x05, 0x19, 0x01, 0xe7, 0xed, 0x0a, 0x00, 0xfd, 0x10, 0x01, 0xe7, 0xed, + 0x00, 0x09, 0x0a, 0xf7, 0x00, 0x00, 0xe4, 0xf4, 0x09, 0x1b, 0x10, 0xf2, + 0xde, 0xfd, 0x13, 0x00, 0xfb, 0x00, 0x0a, 0x00, 0xed, 0x0e, 0x1b, 0xf7, + 0xf2, 0x01, 0x00, 0xf2, 0x10, 0x13, 0xed, 0xf4, 0x0a, 0x00, 0x00, 0x0e, + 0x00, 0xee, 0xf7, 0x00, 0x00, 0x01, 0x09, 0x05, 0xf7, 0x00, 0xf7, 0xed, + 0x15, 0x0a, 0xe9, 0xf4, 0x05, 0x09, 0x00, 0xee, 0xf7, 0x00, 0x00, 0x00, + 0x05, 0x00, 0xf7, 0xf7, 0x00, 0x20, 0x13, 0xed, 0xe7, 0xf7, 0x00, 0x05, + 0x15, 0x0e, 0xf2, 0xe7, 0xfd, 0x00, 0x13, 0x15, 0xf6, 0xe2, 0xf7, 0x07, + 0x01, 0x00, 0x13, 0x01, 0xed, 0xe9, 0x07, 0x1b, 0x0a, 0xf7, 0xe9, 0xf7, + 0xfb, 0x13, 0x20, 0xee, 0xdc, 0xee, 0x05, 0x0a, 0x00, 0x00, 0x00, 0xf6, + 0xf7, 0x05, 0x00, 0x00, 0x15, 0xfd, 0xe9, 0xf7, 0x00, 0x07, 0x1b, 0xfd, + 0xe7, 0xf6, 0x0c, 0x17, 0x01, 0xf6, 0xfb, 0x01, 0xf6, 0xfd, 0x17, 0x0c, + 0xe5, 0xeb, 0x15, 0x12, 0xf0, 0xf2, 0xf7, 0x01, 0x10, 0x0a, 0x00, 0xf6, + 0xed, 0xed, 0x00, 0x01, 0x07, 0x05, 0x00, 0xf7, 0xed, 0xf2, 0x0c, 0x1c, + 0x05, 0xeb, 0xf0, 0xfd, 0x07, 0x1b, 0xf7, 0xdc, 0xfd, 0x12, 0x0c, 0x01, + 0xfd, 0xf6, 0x00, 0xfb, 0x00, 0x12, 0x12, 0x00, 0xed, 0xed, 0xfd, 0x01, + 0x0c, 0x12, 0x07, 0xfb, 0xe2, 0xed, 0x0c, 0x22, 0x01, 0xe2, 0xf6, 0x00, + 0xfb, 0x0a, 0x0c, 0xf6, 0xe7, 0xf0, 0xfd, 0x12, 0x0a, 0xf2, 0xf0, 0x00, + 0x0a, 0x00, 0xf7, 0x07, 0x12, 0xf0, 0xdc, 0x00, 0x15, 0x07, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0xed, 0xf7, 0x10, 0x07, 0xfd, 0x05, 0x00, + 0xf7, 0xfd, 0x01, 0xf6, 0xf6, 0x12, 0x10, 0xe7, 0xeb, 0x12, 0x01, 0xed, + 0xfd, 0x00, 0xf7, 0x05, 0x07, 0xeb, 0xf0, 0x0a, 0x15, 0x01, 0xf7, 0xfd, + 0x00, 0xf0, 0x00, 0x15, 0x00, 0xf6, 0xfd, 0x0a, 0x07, 0xfd, 0xf6, 0x0c, + 0x0a, 0xe4, 0x00, 0x17, 0x0c, 0xf6, 0xf0, 0x07, 0x05, 0xfd, 0x00, 0x00, + 0xfb, 0xfb, 0xfb, 0xfb, 0x0c, 0x01, 0xf2, 0x07, 0x05, 0xf2, 0x00, 0x00, + 0x00, 0xfd, 0xf2, 0x07, 0x01, 0xf7, 0x00, 0x00, 0x05, 0x01, 0xf6, 0xeb, + 0x01, 0x07, 0x00, 0x00, 0x05, 0xf2, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0xfb, 0xf6, 0x00, 0x10, 0x00, 0xf0, 0x07, 0x0c, 0x00, 0x01, 0xf6, 0xeb, + 0x01, 0x12, 0x00, 0xee, 0x00, 0x0c, 0x00, 0xfb, 0x00, 0xf6, 0x00, 0x19, + 0x01, 0xeb, 0xf0, 0xfd, 0x12, 0x0e, 0xeb, 0xee, 0x0c, 0x00, 0xf7, 0x00, + 0xf7, 0xfd, 0x0c, 0x13, 0xfb, 0xe4, 0xfd, 0x0c, 0x07, 0xfb, 0xfb, 0xfd, + 0x00, 0x07, 0xfb, 0xfd, 0x0a, 0x07, 0xfb, 0xfd, 0xfd, 0xf7, 0x00, 0x0a, + 0x05, 0x00, 0xfb, 0x00, 0x05, 0xf6, 0x05, 0x05, 0xe9, 0x00, 0x0e, 0xf4, + 0x00, 0x12, 0xee, 0xeb, 0x0c, 0x13, 0xf6, 0xee, 0x00, 0x00, 0xf7, 0x05, + 0x09, 0xfd, 0x05, 0x05, 0xf4, 0xf7, 0xf6, 0xfb, 0x12, 0x0e, 0xee, 0xeb, + 0x07, 0x0c, 0x00, 0x05, 0xf4, 0xf4, 0x05, 0x05, 0x00, 0x05, 0x0c, 0xf0, + 0xee, 0x00, 0x0c, 0x0c, 0xfd, 0xfb, 0xf0, 0x00, 0x09, 0x00, 0x00, 0x07, + 0x05, 0xfb, 0xf4, 0xf7, 0x05, 0x0c, 0xfd, 0xf0, 0x00, 0x07, 0x07, 0x05, + 0xf6, 0xe7, 0xf6, 0x12, 0x1b, 0x01, 0xee, 0xf4, 0x00, 0xf6, 0xfd, 0x00, + 0x0e, 0x0c, 0xfb, 0xed, 0xf4, 0x12, 0x01, 0xf4, 0x07, 0x09, 0x00, 0x00, + 0x00, 0xee, 0xf0, 0x00, 0x05, 0x15, 0x0c, 0xf0, 0xf9, 0x01, 0xfb, 0xf9, + 0x07, 0x13, 0x00, 0xf6, 0xf4, 0xf4, 0x05, 0x0e, 0x00, 0xe9, 0x09, 0x1b, + 0xfb, 0xed, 0x00, 0x09, 0xf0, 0x00, 0x19, 0x05, 0xe9, 0xfd, 0x15, 0xf9, + 0xe2, 0x05, 0x15, 0x01, 0x00, 0x01, 0xf4, 0xe9, 0xfb, 0x19, 0x0c, 0xf6, + 0xfb, 0xfd, 0xee, 0xfb, 0x15, 0x0c, 0xee, 0xf0, 0x0e, 0x10, 0xfd, 0xf0, + 0xf9, 0x00, 0x07, 0x0c, 0xfb, 0xfd, 0x09, 0x00, 0xf2, 0xed, 0x00, 0x0e, + 0x01, 0x05, 0x01, 0xee, 0xe7, 0x0e, 0x15, 0xe9, 0xee, 0x15, 0x09, 0xed, + 0x00, 0x05, 0xe2, 0xfb, 0x10, 0x09, 0xfd, 0x07, 0xf9, 0xe2, 0x05, 0x17, + 0xfd, 0xf2, 0x01, 0x09, 0x05, 0xfd, 0xed, 0xf9, 0x10, 0x0e, 0x00, 0xfd, + 0xf2, 0xf4, 0x05, 0x13, 0xf9, 0xee, 0x07, 0x0e, 0x00, 0xf4, 0xf2, 0xf6, + 0x09, 0x0e, 0x00, 0xfb, 0xfd, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x09, 0xfb, + 0xee, 0x01, 0x03, 0xf9, 0x00, 0x10, 0x01, 0xe7, 0xf6, 0x10, 0x07, 0xeb, + 0x00, 0x01, 0xf9, 0x00, 0x0e, 0x00, 0xf2, 0x00, 0xfb, 0x00, 0x0a, 0x07, + 0xf2, 0xf4, 0x03, 0x00, 0x03, 0x09, 0xf4, 0xfd, 0x01, 0x00, 0x01, 0x03, + 0x00, 0xfd, 0x09, 0x01, 0xee, 0xfb, 0x10, 0x01, 0xf2, 0x00, 0x00, 0x00, + 0x10, 0x01, 0xf2, 0xfd, 0x00, 0xf2, 0xfb, 0x0a, 0x01, 0xf4, 0xfb, 0x00, + 0xfb, 0x00, 0x00, 0xf4, 0x00, 0x12, 0x01, 0xeb, 0xf0, 0x01, 0x03, 0x01, + 0x09, 0x01, 0xf9, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0xf2, + 0xf4, 0x12, 0x01, 0xe9, 0xfd, 0x19, 0x00, 0xf9, 0x07, 0xf9, 0xed, 0xfd, + 0x03, 0x07, 0x0a, 0x01, 0xf2, 0xe5, 0xf6, 0x0a, 0x0a, 0x00, 0x01, 0xf9, + 0xeb, 0xf9, 0x07, 0x07, 0xf9, 0xed, 0x00, 0x17, 0x00, 0xf2, 0xf9, 0x00, + 0xfd, 0x00, 0x0e, 0x07, 0x00, 0x00, 0xf2, 0xf2, 0x00, 0x0a, 0x03, 0x0a, + 0x01, 0xf2, 0xf0, 0x01, 0x07, 0x00, 0x00, 0x00, 0xf7, 0x03, 0x17, 0xf7, + 0xe7, 0xfb, 0x03, 0x00, 0x00, 0x0a, 0x0c, 0xf2, 0xe7, 0x00, 0x0c, 0xfd, + 0xf7, 0x01, 0x10, 0x00, 0xe7, 0xf7, 0x07, 0x09, 0x03, 0xfd, 0xfd, 0x00, + 0xf7, 0x03, 0x07, 0xeb, 0xf7, 0x0a, 0x0a, 0x03, 0x01, 0xf7, 0xe4, 0xfb, + 0x15, 0x10, 0xf9, 0x00, 0x07, 0xf0, 0xf2, 0x10, 0x03, 0xfb, 0x03, 0xfb, + 0x00, 0x03, 0x00, 0xf0, 0x00, 0x10, 0xf9, 0xfd, 0x0a, 0x00, 0xfd, 0xfb, + 0xf4, 0xfb, 0x09, 0x0a, 0x00, 0xfd, 0x00, 0xee, 0xf4, 0x15, 0x03, 0xf2, + 0x09, 0x03, 0xf0, 0x03, 0x01, 0xeb, 0x01, 0x12, 0x00, 0xeb, 0xf4, 0x09, + 0x10, 0x01, 0x00, 0x00, 0xf2, 0x00, 0x10, 0xfd, 0xf7, 0x00, 0xf7, 0xfb, + 0x0a, 0x09, 0xf9, 0xfd, 0x0a, 0x00, 0xee, 0xfb, 0x09, 0x00, 0xf7, 0x00, + 0x07, 0xfb, 0xf4, 0x03, 0x0a, 0x00, 0xe7, 0x00, 0x12, 0xfb, 0x00, 0x12, + 0xf7, 0xed, 0x03, 0x0c, 0xfd, 0xf9, 0x00, 0x00, 0xfb, 0x00, 0x09, 0x07, + 0x00, 0x03, 0x00, 0xf7, 0xf9, 0x00, 0x09, 0x09, 0xfb, 0xf7, 0xfd, 0xf9, + 0x00, 0x13, 0x0a, 0xee, 0xe9, 0xfd, 0x05, 0x00, 0x00, 0x09, 0xf7, 0xed, + 0x00, 0x03, 0x00, 0x00, 0xfb, 0xfd, 0x09, 0x03, 0xfb, 0x01, 0x03, 0xf9, + 0xf7, 0x00, 0x0a, 0x00, 0x00, 0x01, 0xf2, 0xee, 0x0c, 0x17, 0x00, 0xf6, + 0x03, 0xfb, 0xed, 0x09, 0x0a, 0x01, 0xf7, 0xf9, 0x0a, 0x05, 0xed, 0xf7, + 0x0e, 0x00, 0xf2, 0x00, 0x05, 0xfd, 0xfd, 0x00, 0xf9, 0xf9, 0x0a, 0x09, + 0xf9, 0xfd, 0xfd, 0xf7, 0x00, 0x00, 0x01, 0x05, 0x00, 0xfd, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf9, 0x00, 0x00, 0x00, + 0x01, 0x10, 0x00, 0xed, 0xf6, 0x0a, 0x03, 0x00, 0xff, 0x00, 0x00, 0xf4, + 0xff, 0x09, 0xff, 0xf6, 0x01, 0x00, 0xfb, 0x00, 0x00, 0x01, 0xfb, 0xf6, + 0xfb, 0x00, 0x05, 0x09, 0xfb, 0x00, 0x00, 0xed, 0x01, 0x1c, 0x03, 0xee, + 0x00, 0x05, 0xf6, 0xf9, 0x10, 0x05, 0xf4, 0x01, 0x05, 0xf9, 0xf9, 0x00, + 0x03, 0xff, 0xfb, 0x07, 0x03, 0xf6, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x05, + 0xf2, 0xf2, 0x0e, 0x05, 0xf2, 0xfb, 0x03, 0x00, 0x01, 0x0e, 0x00, 0xee, + 0xf6, 0x03, 0x00, 0x00, 0x13, 0x00, 0xeb, 0xf6, 0x05, 0x03, 0x03, 0x05, + 0x00, 0xf6, 0xf6, 0x05, 0x0c, 0x00, 0xfb, 0x03, 0x00, 0xeb, 0xfb, 0x0e, + 0x0a, 0xf7, 0xf6, 0xfb, 0x07, 0x0c, 0xff, 0x00, 0xf9, 0xf7, 0x00, 0x07, + 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0x01, 0x03, 0x00, 0xf6, 0xfb, 0x05, + 0x00, 0x00, 0x0c, 0x00, 0xed, 0xfb, 0x0c, 0x05, 0x00, 0xff, 0xf9, 0x01, + 0x00, 0x00, 0x07, 0x01, 0xf7, 0xf4, 0x07, 0x00, 0xf6, 0x0c, 0xff, 0xeb, + 0x05, 0x12, 0x00, 0xf6, 0x00, 0x00, 0xff, 0x00, 0xff, 0xf9, 0x00, 0x00, + 0xf6, 0x00, 0x09, 0x00, 0x00, 0x00, 0xf0, 0xf4, 0x07, 0x17, 0x03, 0xe7, + 0xf9, 0x0e, 0x00, 0x00, 0x0c, 0xfb, 0xf2, 0x01, 0x03, 0xfb, 0x00, 0x05, + 0x00, 0xf7, 0xff, 0x05, 0x03, 0x00, 0xf9, 0xf7, 0x00, 0xf9, 0xff, 0x09, + 0x0c, 0x00, 0xf0, 0xfb, 0xff, 0x00, 0x12, 0x0e, 0xf2, 0xf7, 0x03, 0xf6, + 0xfb, 0x09, 0x00, 0xf4, 0x03, 0x01, 0xf6, 0x00, 0x09, 0xff, 0xf7, 0x00, + 0x00, 0x00, 0x09, 0x00, 0xf0, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0xff, + 0x05, 0xff, 0xeb, 0x00, 0x13, 0x01, 0xf4, 0xfd, 0x05, 0x05, 0x00, 0xf2, + 0xf4, 0x03, 0x0a, 0x00, 0xf9, 0xff, 0xfd, 0x03, 0x0c, 0x00, 0xeb, 0xff, + 0x15, 0x07, 0xf4, 0xf4, 0xf9, 0xf9, 0x01, 0x13, 0x01, 0xf4, 0x00, 0x03, + 0x00, 0xf4, 0xf9, 0x07, 0x12, 0xff, 0xf4, 0xf6, 0xfd, 0x01, 0x0c, 0x09, + 0xfd, 0xf4, 0x00, 0x00, 0x00, 0x03, 0x09, 0xff, 0xee, 0x00, 0x13, 0x00, + 0xf0, 0xfd, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0xfd, + 0x0a, 0x0c, 0x00, 0xf2, 0xed, 0xff, 0x09, 0x01, 0xf6, 0x00, 0x00, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0xfb, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x01, 0x00, 0x00, 0x03, 0xfb, 0xf4, 0xff, 0x07, 0x07, + 0xfb, 0xf7, 0xfb, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xfd, 0x00, 0x01, 0xfd, + 0xf7, 0x01, 0x07, 0xfb, 0xf2, 0xff, 0x09, 0x01, 0xff, 0x00, 0x00, 0x05, + 0x00, 0x00, 0xff, 0x03, 0x00, 0xff, 0x01, 0xfb, 0x00, 0x0c, 0x03, 0xfb, + 0xfd, 0xf6, 0xf9, 0x09, 0x0a, 0x00, 0xff, 0xfd, 0xf9, 0xf6, 0x01, 0x09, + 0x00, 0xfd, 0x00, 0xf6, 0xfd, 0x0e, 0x03, 0xf6, 0xff, 0x05, 0x03, 0xff, + 0xf7, 0x01, 0x01, 0xf7, 0xfd, 0x0a, 0x09, 0xfb, 0x00, 0xff, 0xff, 0xfd, + 0x05, 0x0a, 0xfb, 0xf7, 0x01, 0x0a, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x05, + 0xff, 0xf6, 0x00, 0x05, 0xfb, 0xff, 0x0c, 0x01, 0xf6, 0xf9, 0x00, 0x00, + 0x0c, 0x07, 0xf0, 0xf4, 0x03, 0x0a, 0x00, 0xff, 0x00, 0xff, 0xfd, 0xff, + 0x09, 0x0a, 0xfd, 0xf6, 0xfd, 0x00, 0xfd, 0x00, 0x12, 0x00, 0xed, 0xfb, + 0x05, 0x00, 0x00, 0x0a, 0x00, 0xf4, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfd, 0x00, 0x09, 0x07, 0xfb, 0xf6, 0x00, 0x01, 0xfd, 0x00, 0x0c, + 0xfb, 0xf2, 0xff, 0x03, 0xfd, 0x05, 0x0a, 0x00, 0xf0, 0xf0, 0x07, 0x10, + 0x00, 0xf4, 0x00, 0x00, 0xfb, 0x00, 0x09, 0x09, 0x03, 0xfb, 0xf4, 0xf7, + 0x03, 0x0e, 0x09, 0xfb, 0xee, 0xfb, 0x09, 0x05, 0x00, 0x01, 0xff, 0xf9, + 0xfb, 0x00, 0x07, 0xff, 0xfd, 0x0a, 0xff, 0xee, 0xfb, 0x0e, 0x05, 0xee, + 0xf7, 0x09, 0x09, 0xf9, 0xff, 0x09, 0xfb, 0xf2, 0x00, 0x0a, 0xfd, 0x00, + 0x0a, 0xff, 0xf0, 0xff, 0x0a, 0x03, 0x01, 0xff, 0xf2, 0x00, 0x0e, 0x00, + 0xee, 0x00, 0x0c, 0x00, 0xfd, 0x05, 0x01, 0xf2, 0xfd, 0x0c, 0x03, 0xfb, + 0xff, 0x07, 0x01, 0xf4, 0xf6, 0x00, 0x0a, 0x00, 0x00, 0xfd, 0xf7, 0x00, + 0x05, 0x09, 0x00, 0xf0, 0xf7, 0x05, 0x0e, 0x01, 0xfb, 0xf4, 0xff, 0x09, + 0x07, 0x00, 0x00, 0xf6, 0xf4, 0x05, 0x07, 0xf6, 0x00, 0x0e, 0x00, 0xf0, + 0xfb, 0x05, 0x07, 0x07, 0x00, 0xf2, 0xf4, 0x01, 0x0c, 0x05, 0x00, 0xf4, + 0xf2, 0x09, 0x0a, 0xfd, 0xf7, 0x03, 0x03, 0xf9, 0xee, 0x00, 0x10, 0x05, + 0xf9, 0xfb, 0xfd, 0x01, 0x07, 0x05, 0xff, 0xf9, 0x05, 0x00, 0xf7, 0x00, + 0x09, 0x05, 0xfd, 0xff, 0xfd, 0xfb, 0xff, 0x09, 0x07, 0xfd, 0xfb, 0xfd, + 0x00, 0xff, 0x00, 0x03, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xf7, 0x01, 0x0e, 0xff, 0xf4, 0xff, 0x03, 0x00, 0x00, 0x0e, 0x05, + 0xed, 0xf4, 0x03, 0x00, 0x01, 0x12, 0x05, 0xf7, 0xee, 0xf7, 0x05, 0x0a, + 0x03, 0xff, 0x00, 0xfd, 0xf4, 0xff, 0x0c, 0x03, 0xfb, 0xf6, 0xff, 0x09, + 0x07, 0xff, 0xf7, 0x00, 0xf7, 0xfd, 0x0a, 0x0e, 0xf7, 0xee, 0x00, 0x00, + 0xf9, 0x00, 0x12, 0x07, 0xf2, 0xee, 0x00, 0x0c, 0x00, 0xfd, 0x00, 0x00, + 0x00, 0xfb, 0xfd, 0x01, 0xf9, 0xff, 0x03, 0x00, 0x00, 0x0a, 0x05, 0xf7, + 0xee, 0xfd, 0x0a, 0x09, 0x00, 0xf9, 0xf9, 0x00, 0x03, 0x01, 0x01, 0x00, + 0x00, 0x07, 0xff, 0xf9, 0x00, 0x01, 0xfd, 0xfb, 0x01, 0x01, 0x01, 0x01, + 0xff, 0xf0, 0xf7, 0x03, 0x0a, 0x05, 0xfd, 0xfd, 0x00, 0xf4, 0xf2, 0x03, + 0x0c, 0xff, 0xf4, 0x00, 0x07, 0xfd, 0xfd, 0x03, 0x03, 0xff, 0xfb, 0x0a, + 0x07, 0xf9, 0xf7, 0x00, 0x00, 0x00, 0x05, 0x03, 0x00, 0xfd, 0xf9, 0xf7, + 0xff, 0x0c, 0x0c, 0x00, 0xf9, 0xfd, 0xfb, 0x00, 0x07, 0xff, 0xf6, 0x00, + 0x09, 0x00, 0xf6, 0xff, 0x0a, 0x03, 0xf4, 0xf6, 0x05, 0x03, 0xf9, 0xf9, + 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xfb, 0x00, + 0x0a, 0x00, 0xf6, 0x00, 0x0c, 0xff, 0xf0, 0x00, 0x01, 0x05, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x07, 0x00, 0xf7, 0x00, + 0x00, 0x00, 0xfb, 0x01, 0x09, 0x03, 0xf6, 0xf0, 0x03, 0x0c, 0xf7, 0xf7, + 0x0c, 0xff, 0xee, 0x00, 0x05, 0xf7, 0x00, 0x0e, 0x00, 0xf2, 0xf9, 0x0e, + 0x03, 0xf4, 0xf9, 0x00, 0x00, 0x05, 0x03, 0xf9, 0xf7, 0x00, 0x05, 0x09, + 0xff, 0xf9, 0x01, 0x03, 0x00, 0xf7, 0xf9, 0x01, 0x05, 0x03, 0xfb, 0xf7, + 0x00, 0x05, 0x01, 0x00, 0xf9, 0xff, 0x05, 0x07, 0xf9, 0xf6, 0x00, 0x01, + 0xf9, 0x00, 0x09, 0xfd, 0xfb, 0x05, 0xfb, 0xf4, 0x01, 0x0c, 0x00, 0xf2, + 0x01, 0x09, 0xfd, 0xf9, 0xff, 0xff, 0x00, 0x01, 0xfd, 0x00, 0x01, 0xf9, + 0xfb, 0x00, 0x05, 0x07, 0x01, 0xff, 0xf2, 0xf9, 0x07, 0x10, 0x01, 0xf4, + 0xf7, 0x01, 0x09, 0xfb, 0x00, 0x0c, 0xff, 0xf2, 0xfb, 0x0a, 0x07, 0xf9, + 0xfd, 0xff, 0xf4, 0xff, 0x0c, 0x0a, 0xf6, 0xee, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0xfd, 0xf7, 0xff, 0x09, 0x01, 0xfd, 0x03, 0x00, 0xf9, 0xfd, + 0x03, 0x01, 0x01, 0x01, 0xfd, 0xf9, 0xff, 0x01, 0x00, 0xfb, 0x00, 0x07, + 0x00, 0xf9, 0x00, 0x01, 0xff, 0xfb, 0x09, 0x09, 0xf7, 0xf7, 0x01, 0x00, + 0x00, 0xfd, 0x01, 0x01, 0x00, 0x01, 0xfb, 0xf6, 0xfb, 0x09, 0x0c, 0x00, + 0xfb, 0xfb, 0x00, 0x00, 0xfb, 0x00, 0x01, 0x09, 0x00, 0xfb, 0xfd, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x05, 0x00, 0xf7, 0x00, 0x09, 0x00, + 0xfb, 0xfd, 0x03, 0x01, 0xfd, 0xfb, 0x01, 0x05, 0x00, 0xfb, 0x00, 0x07, + 0xfb, 0xf4, 0xff, 0x01, 0x01, 0x07, 0x07, 0xf9, 0xf0, 0xfb, 0x07, 0x07, + 0x00, 0x00, 0x03, 0x00, 0xf0, 0xfd, 0x09, 0x01, 0xfb, 0xff, 0x00, 0xfb, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf7, 0xfb, 0xff, + 0x00, 0xff, 0x07, 0x07, 0xff, 0xf9, 0xf6, 0xfd, 0x03, 0x07, 0x07, 0xff, + 0xf4, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfb, 0xf9, 0x00, 0x07, 0x03, + 0xff, 0x00, 0x00, 0xfb, 0xfb, 0x03, 0x01, 0xf9, 0xfb, 0x03, 0x05, 0xff, + 0x00, 0x00, 0xf9, 0xfd, 0x00, 0x00, 0x00, 0x07, 0xfd, 0xf6, 0x00, 0x01, + 0x00, 0xfb, 0x00, 0x03, 0x00, 0xfb, 0xf6, 0x00, 0x0a, 0x00, 0xfb, 0x01, + 0x01, 0xf6, 0xfb, 0x07, 0xfd, 0x00, 0x05, 0x00, 0xfb, 0xfd, 0xfd, 0x05, + 0x05, 0x01, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x03, + 0x00, 0x00, 0x01, 0xff, 0xf6, 0xff, 0x0a, 0x0a, 0x00, 0xf7, 0xf7, 0xfb, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xf9, 0xfb, 0x00, 0x0a, 0x05, + 0xfd, 0xf6, 0xfd, 0x05, 0x00, 0xf7, 0xf9, 0x00, 0x05, 0x05, 0x00, 0xff, + 0x00, 0xf9, 0xfd, 0x05, 0x01, 0xfd, 0x01, 0x00, 0xf7, 0xf9, 0x00, 0x01, + 0x00, 0x00, 0x03, 0xfd, 0xf9, 0xfd, 0x00, 0x03, 0x05, 0x00, 0xf9, 0xf9, + 0x00, 0xfd, 0xff, 0x00, 0x05, 0x05, 0x00, 0xfd, 0xf7, 0x03, 0x07, 0xfd, + 0xf6, 0x00, 0x05, 0xff, 0x00, 0x00, 0xf9, 0xfd, 0x00, 0xff, 0x00, 0x03, + 0x00, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x05, 0x05, 0xfb, 0xf4, 0x00, 0x05, + 0xfd, 0xfd, 0x01, 0x03, 0xfd, 0xfd, 0x03, 0x05, 0x00, 0xfb, 0xfd, 0x00, + 0xfb, 0x03, 0x0e, 0x00, 0xf4, 0xf4, 0x00, 0x09, 0x01, 0x00, 0x00, 0xfd, + 0xfd, 0x00, 0x00, 0xfb, 0x00, 0x07, 0x00, 0xf6, 0xfb, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xfd, 0xfd, 0x05, 0xfd, 0xf9, 0x03, 0x00, 0xf6, 0xfd, + 0x07, 0x05, 0xf6, 0xf7, 0x05, 0x09, 0x00, 0xf9, 0xf7, 0x01, 0x09, 0x00, + 0xf9, 0xf9, 0x03, 0x09, 0x00, 0xfd, 0xff, 0xfd, 0x00, 0x03, 0xfd, 0xff, + 0x07, 0x00, 0xf7, 0xfb, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf9, 0xfd, 0x07, + 0x0c, 0x00, 0xf6, 0xfd, 0x00, 0xff, 0x00, 0x09, 0x00, 0xf4, 0xf6, 0x05, + 0x0c, 0x01, 0xf6, 0xf7, 0x01, 0x09, 0xfd, 0xf9, 0x03, 0x01, 0xfb, 0xfd, + 0xfd, 0x00, 0x03, 0x05, 0xfb, 0xf4, 0xf9, 0x07, 0x0a, 0x00, 0xfb, 0x00, + 0xf6, 0xfd, 0x0c, 0x09, 0xf6, 0xf4, 0x07, 0x05, 0xf7, 0x03, 0x07, 0xfd, + 0xfd, 0x00, 0x00, 0xfd, 0x01, 0x03, 0x00, 0xff, 0x00, 0xff, 0x00, 0x01, + 0x00, 0xff, 0x00, 0x00, 0xff, 0xfb, 0x00, 0x09, 0x00, 0xf9, 0x00, 0x00, + 0xfd, 0xfb, 0x00, 0x05, 0x00, 0x00, 0xff, 0xf6, 0xff, 0x07, 0x07, 0xff, + 0xfd, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, + 0x05, 0xff, 0xf6, 0xff, 0x07, 0x05, 0x03, 0xff, 0xf7, 0xff, 0x00, 0xff, + 0x00, 0x09, 0x05, 0xf6, 0xf7, 0x00, 0x03, 0x00, 0x00, 0xff, 0xf7, 0xff, + 0x03, 0x01, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x05, 0x03, 0xfd, 0xf7, + 0xff, 0x00, 0x05, 0x03, 0x00, 0xff, 0xf7, 0xff, 0x03, 0x03, 0x00, 0xff, + 0xfd, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0xff, 0xfd, 0xff, 0x01, 0x03, 0x00, 0xfd, 0xf9, 0x01, 0x03, 0xfb, 0xf9, + 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xfd, 0x03, 0x07, 0x00, 0xfb, + 0xfd, 0xf9, 0xfd, 0x07, 0x09, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xfd, 0x01, + 0x05, 0xff, 0xfb, 0xff, 0x00, 0x03, 0x05, 0x00, 0xf9, 0xf9, 0x01, 0x0a, + 0xff, 0xf2, 0xff, 0x0a, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xfd, + 0x05, 0x05, 0x00, 0xfb, 0xf9, 0xfd, 0x03, 0x05, 0x00, 0xfd, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x01, 0x01, 0xfd, 0xf6, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0x00, 0x00, 0xff, 0xfb, + 0x00, 0x01, 0x05, 0x05, 0xf7, 0xf6, 0x00, 0x01, 0xfd, 0x01, 0x07, 0x00, + 0xf6, 0xf9, 0x01, 0x05, 0x01, 0xff, 0xff, 0xfd, 0xfd, 0x00, 0x07, 0x01, + 0xf7, 0xf7, 0x00, 0x07, 0x01, 0xfd, 0x00, 0x01, 0xf9, 0xfb, 0x00, 0x09, + 0x09, 0xff, 0xf6, 0xf6, 0x01, 0x0a, 0x01, 0xff, 0xff, 0xfd, 0x00, 0x00, + 0xfd, 0x00, 0x07, 0x00, 0xfb, 0xfd, 0xff, 0x03, 0x07, 0x00, 0xfd, 0xfd, + 0x01, 0x07, 0x00, 0xfd, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf9, + 0xf9, 0xff, 0x01, 0x01, 0x01, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0xfb, 0x03, + 0x03, 0xff, 0xfb, 0x00, 0x07, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x03, + 0x00, 0xf7, 0xfb, 0x03, 0x03, 0xfb, 0xf9, 0x00, 0x0a, 0x00, 0xf6, 0xf6, + 0x01, 0x09, 0x00, 0xff, 0x00, 0xff, 0xf7, 0xfd, 0x03, 0x01, 0xff, 0x03, + 0x05, 0xfb, 0xf4, 0x00, 0x0a, 0x05, 0xfd, 0xf9, 0xff, 0x01, 0x00, 0x00, + 0xff, 0xfb, 0x00, 0x01, 0xff, 0x00, 0x03, 0x00, 0xfb, 0xf9, 0xfd, 0x07, + 0x09, 0xff, 0xf9, 0xff, 0xff, 0xfd, 0xff, 0x05, 0x05, 0xfd, 0xfb, 0x01, + 0x03, 0xfd, 0x00, 0x03, 0x01, 0xf9, 0xfd, 0x07, 0x00, 0xf7, 0x01, 0x09, + 0xff, 0xf7, 0xff, 0x05, 0x00, 0xfd, 0x00, 0xff, 0x00, 0x03, 0x01, 0xf7, + 0xfd, 0x03, 0xff, 0xfd, 0x00, 0x00, 0x03, 0x00, 0xfd, 0xfd, 0xff, 0x00, + 0x03, 0x01, 0xfd, 0xfd, 0x00, 0xff, 0xff, 0x00, 0x03, 0x03, 0x00, 0xfd, + 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0x00, 0x01, 0x00, 0x01, 0x05, 0xfd, 0xf7, 0xfd, 0x00, 0x05, 0x07, + 0xfd, 0xf7, 0xfd, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xfd, 0xf9, + 0x03, 0x09, 0x00, 0xf7, 0xfd, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, + 0x01, 0xff, 0xf9, 0xfd, 0x01, 0x01, 0xfd, 0xfd, 0x01, 0x03, 0x00, 0xf9, + 0xff, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0xf9, 0xfd, 0x03, 0x03, 0xff, + 0x00, 0x00, 0xff, 0xfd, 0x00, 0x01, 0x01, 0xff, 0x00, 0xff, 0xf9, 0x00, + 0x05, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0x01, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x01, 0xfb, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0x01, + 0x00, 0xff, 0xfd, 0xfb, 0x03, 0x07, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x01, + 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x01, 0x01, 0xfd, 0xfb, + 0x00, 0x01, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, + 0xfd, 0xfd, 0x01, 0x01, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x00, 0xfd, 0x00, + 0x01, 0xff, 0xfb, 0x01, 0x03, 0xff, 0x01, 0x01, 0xfb, 0xfd, 0x01, 0x01, + 0xff, 0x00, 0x01, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0x00, 0x01, 0xff, + 0xff, 0x03, 0x00, 0xfd, 0xff, 0x00, 0x01, 0xff, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xfd, 0xff, 0x03, 0x03, 0xfd, + 0xfb, 0x01, 0x05, 0xfb, 0xf9, 0x00, 0x05, 0x00, 0x00, 0x00, 0xf9, 0xff, + 0x03, 0x05, 0x00, 0xfb, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x00, 0xff, 0x01, 0x00, 0xff, 0xfd, 0xff, 0x01, 0x01, 0x00, 0xff, 0xfd, + 0xfb, 0x00, 0x05, 0x05, 0x00, 0xff, 0xfb, 0xf9, 0x00, 0x07, 0x01, 0xfb, + 0xfd, 0x05, 0x00, 0xfb, 0xfb, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xff, 0xfb, 0xff, 0x05, 0x03, 0xfd, 0xf9, 0xfd, 0x00, 0x00, 0x03, + 0x01, 0xfb, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0xff, 0xfd, 0x01, + 0x03, 0x00, 0xff, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x05, 0x00, 0xfb, 0xfd, + 0x01, 0x03, 0x00, 0xfd, 0xf9, 0x00, 0x03, 0x03, 0x00, 0xfb, 0xfd, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x01, 0xff, 0xfd, + 0xfd, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, + 0xfd, 0xff, 0x00, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0xfd, 0x00, 0x01, 0x03, 0x00, 0xfd, 0xfb, 0xff, 0x00, 0x01, 0x01, 0x00, + 0xff, 0xfd, 0xff, 0x00, 0x00, 0x01, 0x03, 0x00, 0xfd, 0xfb, 0xff, 0x01, + 0x03, 0x00, 0xfb, 0x00, 0x03, 0x01, 0x00, 0xff, 0xfb, 0xfd, 0x05, 0x05, + 0xff, 0xff, 0x00, 0xff, 0xfb, 0x00, 0x03, 0x01, 0x00, 0x00, 0xfb, 0xfd, + 0x01, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0x03, 0x00, 0xfd, 0x00, 0x00, 0xfd, 0x00, 0x05, 0x00, 0xfd, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x03, 0xff, 0xfb, 0x00, 0x05, 0x00, 0xfd, + 0x00, 0x00, 0xff, 0x01, 0x03, 0xff, 0xfd, 0x00, 0x01, 0xff, 0xff, 0x01, + 0x01, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, + 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfd, 0x01, + 0x01, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0x00, 0x03, 0x00, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x03, 0x00, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x00, + 0xff, 0x00, 0x00, 0xfd, 0xfd, 0x03, 0x01, 0x00, 0x00, 0x00, 0xfd, 0xfd, + 0x00, 0x03, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x03, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xff, + 0xff, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, + 0x01, 0xff, 0xfd, 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x01, 0x00, 0xfd, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x00, 0x01, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, + 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xff, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf8, + 0xf7, 0xf5, 0xf2, 0xf1, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe4, 0xe1, 0xe0, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, 0xe3, 0xe5, 0xe5, + 0xe3, 0xe2, 0xe3, 0xe8, 0xea, 0xec, 0xee, 0xec, 0xed, 0xf4, 0xf7, 0xf7, + 0xf7, 0xf8, 0xfa, 0xf8, 0xfa, 0xff, 0x02, 0x02, 0x05, 0x04, 0x02, 0x0c, + 0x0e, 0x02, 0xfb, 0x04, 0x10, 0x1f, 0x22, 0x20, 0x1e, 0x14, 0x14, 0x14, + 0x0e, 0x0e, 0x14, 0x0f, 0x0d, 0x12, 0x11, 0x11, 0x14, 0x12, 0x10, 0x0a, + 0x00, 0xfa, 0xf4, 0xee, 0xef, 0xed, 0xe2, 0xdb, 0xd7, 0xd5, 0xd7, 0xd4, + 0xcb, 0xbf, 0xb3, 0xa8, 0xa2, 0xa0, 0x9a, 0x99, 0x99, 0x9d, 0x9f, 0xa3, + 0xaa, 0xae, 0xb1, 0xb1, 0xb6, 0xb8, 0xb8, 0xbd, 0xbe, 0xb9, 0xbf, 0xc8, + 0xcc, 0xcf, 0xd3, 0xd7, 0xd4, 0xcf, 0xde, 0xed, 0xe3, 0xe9, 0xf8, 0xf3, + 0xeb, 0xf4, 0x04, 0x0d, 0x15, 0x16, 0x0c, 0x03, 0x0c, 0x24, 0x34, 0x44, + 0x4f, 0x45, 0x37, 0x37, 0x3c, 0x45, 0x54, 0x5c, 0x5b, 0x52, 0x4a, 0x4c, + 0x57, 0x5d, 0x5d, 0x5d, 0x61, 0x61, 0x5b, 0x5e, 0x6b, 0x74, 0x72, 0x70, + 0x6d, 0x67, 0x66, 0x6e, 0x78, 0x76, 0x70, 0x68, 0x5f, 0x5b, 0x55, 0x55, + 0x5f, 0x65, 0x61, 0x59, 0x56, 0x56, 0x51, 0x4a, 0x4c, 0x58, 0x5b, 0x55, + 0x4c, 0x3c, 0x40, 0x4e, 0x47, 0x3a, 0x3b, 0x3d, 0x36, 0x2f, 0x2e, 0x32, + 0x34, 0x31, 0x2d, 0x23, 0x1c, 0x29, 0x37, 0x2f, 0x21, 0x25, 0x2e, 0x2d, + 0x20, 0x16, 0x22, 0x37, 0x41, 0x37, 0x22, 0x1e, 0x2c, 0x38, 0x3a, 0x3a, + 0x3b, 0x38, 0x34, 0x30, 0x34, 0x3f, 0x40, 0x3b, 0x3a, 0x3b, 0x40, 0x4b, + 0x51, 0x4a, 0x44, 0x48, 0x4e, 0x4e, 0x4b, 0x4b, 0x51, 0x56, 0x56, 0x53, + 0x4c, 0x46, 0x46, 0x4c, 0x54, 0x54, 0x4b, 0x42, 0x44, 0x4a, 0x4c, 0x48, + 0x44, 0x46, 0x49, 0x4b, 0x4a, 0x4a, 0x4b, 0x45, 0x3c, 0x35, 0x38, 0x40, + 0x44, 0x3f, 0x36, 0x31, 0x2f, 0x2e, 0x2f, 0x31, 0x38, 0x3d, 0x37, 0x28, + 0x1a, 0x1d, 0x2a, 0x34, 0x33, 0x2c, 0x2a, 0x2a, 0x2a, 0x28, 0x26, 0x2c, + 0x38, 0x38, 0x2a, 0x24, 0x2b, 0x31, 0x32, 0x33, 0x31, 0x2a, 0x26, 0x2a, + 0x2d, 0x30, 0x3c, 0x44, 0x3b, 0x2a, 0x28, 0x30, 0x35, 0x3d, 0x43, 0x3b, + 0x32, 0x33, 0x33, 0x2f, 0x2b, 0x31, 0x38, 0x37, 0x30, 0x29, 0x24, 0x20, + 0x1f, 0x1c, 0x11, 0x06, 0x00, 0xfb, 0xfa, 0xfb, 0xfa, 0xf8, 0xee, 0xe3, + 0xdf, 0xde, 0xde, 0xdb, 0xd7, 0xd3, 0xc9, 0xc3, 0xc5, 0xc7, 0xc6, 0xcc, + 0xd4, 0xd3, 0xd0, 0xd2, 0xd9, 0xe4, 0xed, 0xef, 0xea, 0xe4, 0xe0, 0xe2, + 0xeb, 0xf4, 0xf1, 0xef, 0xf1, 0xeb, 0xe7, 0xea, 0xf1, 0xf9, 0xfa, 0xf5, + 0xef, 0xea, 0xee, 0xf7, 0xfb, 0xff, 0x0b, 0x0b, 0xfd, 0xf9, 0x02, 0x11, + 0x17, 0x0f, 0x09, 0x0c, 0x15, 0x1b, 0x18, 0x14, 0x1a, 0x24, 0x20, 0x0f, + 0x07, 0x13, 0x25, 0x25, 0x16, 0x13, 0x1e, 0x21, 0x1c, 0x19, 0x1d, 0x2a, + 0x33, 0x27, 0x15, 0x17, 0x25, 0x29, 0x1c, 0x0d, 0x0e, 0x19, 0x20, 0x1a, + 0x0e, 0x06, 0x08, 0x0d, 0x07, 0xff, 0x00, 0x05, 0x09, 0x05, 0xfd, 0xfa, + 0xfa, 0xf5, 0xf2, 0xf6, 0xf8, 0xf4, 0xec, 0xdf, 0xd7, 0xd8, 0xde, 0xe3, + 0xe2, 0xda, 0xd4, 0xd4, 0xd7, 0xdb, 0xdb, 0xd2, 0xcd, 0xd1, 0xd7, 0xd9, + 0xdb, 0xde, 0xe4, 0xe7, 0xdf, 0xda, 0xe3, 0xf1, 0xfc, 0xff, 0xfe, 0xfd, + 0xf9, 0xf6, 0xf7, 0xfc, 0x0b, 0x20, 0x1a, 0x08, 0x0e, 0x18, 0x1c, 0x1e, + 0x28, 0x32, 0x37, 0x37, 0x39, 0x3a, 0x3a, 0x48, 0x4d, 0x3a, 0x2d, 0x35, + 0x3e, 0x49, 0x50, 0x48, 0x39, 0x33, 0x33, 0x38, 0x3d, 0x45, 0x4b, 0x48, + 0x40, 0x3d, 0x41, 0x41, 0x46, 0x4e, 0x50, 0x4e, 0x42, 0x33, 0x2e, 0x31, + 0x31, 0x36, 0x3d, 0x37, 0x2b, 0x23, 0x26, 0x2e, 0x33, 0x2f, 0x23, 0x18, + 0x1a, 0x25, 0x29, 0x26, 0x28, 0x22, 0x1b, 0x1d, 0x1e, 0x20, 0x24, 0x2c, + 0x31, 0x27, 0x1d, 0x1e, 0x1c, 0x1a, 0x28, 0x32, 0x29, 0x1f, 0x22, 0x28, + 0x2c, 0x35, 0x3a, 0x33, 0x2b, 0x28, 0x2b, 0x38, 0x48, 0x45, 0x38, 0x30, + 0x2e, 0x32, 0x3d, 0x47, 0x49, 0x42, 0x38, 0x2f, 0x26, 0x24, 0x2b, 0x33, + 0x37, 0x30, 0x1e, 0x10, 0x0b, 0x0d, 0x11, 0x15, 0x14, 0x05, 0xf0, 0xe2, + 0xe4, 0xed, 0xf0, 0xea, 0xe0, 0xdc, 0xd6, 0xc9, 0xc4, 0xce, 0xd8, 0xd7, + 0xd3, 0xcc, 0xc4, 0xca, 0xd9, 0xe5, 0xe8, 0xea, 0xf0, 0xe8, 0xdd, 0xde, + 0xe7, 0xf2, 0xfb, 0xf6, 0xe6, 0xe3, 0xee, 0xf2, 0xed, 0xed, 0xef, 0xf4, + 0xf4, 0xf0, 0xee, 0xf2, 0xfb, 0x01, 0x01, 0xfc, 0xf8, 0xfb, 0x06, 0x0d, + 0x0b, 0x05, 0x06, 0x0e, 0x13, 0x14, 0x14, 0x12, 0x11, 0x0d, 0x0a, 0x0f, + 0x19, 0x1b, 0x16, 0x0e, 0x08, 0x0c, 0x19, 0x23, 0x22, 0x1b, 0x1a, 0x1f, + 0x21, 0x1a, 0x16, 0x1a, 0x25, 0x2c, 0x1f, 0x0e, 0x0d, 0x10, 0x0c, 0x0e, + 0x14, 0x10, 0x04, 0xfc, 0xfe, 0x07, 0x0d, 0x0b, 0x03, 0xfa, 0xfb, 0x02, + 0x03, 0xff, 0xfe, 0xfc, 0xf5, 0xeb, 0xe6, 0xe9, 0xef, 0xf2, 0xec, 0xe2, + 0xdd, 0xdc, 0xdb, 0xd8, 0xd8, 0xe0, 0xe9, 0xe5, 0xd5, 0xc9, 0xcd, 0xdc, + 0xe8, 0xe9, 0xe3, 0xda, 0xd8, 0xe1, 0xed, 0xf8, 0xfd, 0xf5, 0xec, 0xea, + 0xf0, 0xfa, 0x01, 0x06, 0x06, 0x02, 0xff, 0xff, 0x01, 0x0a, 0x1a, 0x23, + 0x26, 0x25, 0x1f, 0x16, 0x18, 0x28, 0x37, 0x40, 0x41, 0x35, 0x25, 0x21, + 0x2e, 0x3d, 0x41, 0x3a, 0x2f, 0x28, 0x29, 0x2d, 0x2f, 0x2f, 0x30, 0x35, + 0x38, 0x37, 0x33, 0x30, 0x32, 0x36, 0x37, 0x31, 0x28, 0x24, 0x20, 0x21, + 0x25, 0x26, 0x25, 0x21, 0x18, 0x0f, 0x11, 0x1a, 0x1a, 0x11, 0x0b, 0x0b, + 0x10, 0x16, 0x13, 0x08, 0x03, 0x06, 0x0b, 0x11, 0x18, 0x17, 0x10, 0x08, + 0x04, 0x06, 0x07, 0x0a, 0x10, 0x12, 0x13, 0x13, 0x09, 0xff, 0x02, 0x0d, + 0x1e, 0x27, 0x1c, 0x0d, 0x0b, 0x14, 0x1e, 0x20, 0x1e, 0x24, 0x2a, 0x26, + 0x20, 0x20, 0x2a, 0x37, 0x33, 0x21, 0x17, 0x1b, 0x25, 0x28, 0x20, 0x1a, + 0x23, 0x2c, 0x23, 0x12, 0x09, 0x12, 0x20, 0x1e, 0x07, 0xf3, 0xf4, 0xfd, + 0xfc, 0xee, 0xe5, 0xec, 0xf4, 0xec, 0xd8, 0xcb, 0xce, 0xda, 0xda, 0xcf, + 0xc8, 0xcf, 0xd6, 0xd5, 0xd2, 0xd5, 0xe0, 0xe6, 0xe8, 0xe6, 0xe4, 0xef, + 0xfa, 0xf6, 0xe6, 0xe0, 0xec, 0xfa, 0xfc, 0xf5, 0xed, 0xe8, 0xe9, 0xf0, + 0xf6, 0xf6, 0xf4, 0xf1, 0xf0, 0xf1, 0xf6, 0xfb, 0xf7, 0xf6, 0x03, 0x0b, + 0x05, 0xfd, 0xfc, 0x03, 0x0f, 0x17, 0x13, 0x0a, 0x03, 0x01, 0x07, 0x10, + 0x13, 0x13, 0x0e, 0x05, 0x00, 0x0b, 0x1d, 0x22, 0x19, 0x13, 0x18, 0x22, + 0x28, 0x2a, 0x27, 0x22, 0x23, 0x26, 0x22, 0x1b, 0x1b, 0x1e, 0x1a, 0x15, + 0x18, 0x14, 0x0a, 0x05, 0x08, 0x11, 0x17, 0x16, 0x0e, 0x07, 0x07, 0x11, + 0x18, 0x11, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf1, 0xe9, + 0xea, 0xef, 0xf1, 0xeb, 0xe4, 0xe2, 0xe3, 0xe5, 0xdf, 0xd5, 0xd4, 0xe0, + 0xeb, 0xed, 0xe7, 0xe2, 0xdc, 0xe2, 0xf1, 0xf9, 0xf5, 0xed, 0xed, 0xef, + 0xf0, 0xf5, 0xfa, 0xfb, 0xfb, 0xfe, 0x02, 0x06, 0x08, 0x0b, 0x0d, 0x0f, + 0x11, 0x18, 0x1e, 0x1b, 0x19, 0x1d, 0x26, 0x2e, 0x2d, 0x2a, 0x28, 0x26, + 0x2d, 0x34, 0x2a, 0x1d, 0x1a, 0x1f, 0x25, 0x28, 0x2d, 0x2d, 0x25, 0x21, + 0x2e, 0x39, 0x3a, 0x36, 0x29, 0x1e, 0x22, 0x2a, 0x28, 0x28, 0x2d, 0x30, + 0x2a, 0x1b, 0x12, 0x16, 0x1d, 0x21, 0x20, 0x19, 0x12, 0x0e, 0x08, 0x03, + 0x06, 0x14, 0x21, 0x1a, 0x03, 0xf6, 0x02, 0x13, 0x15, 0x0a, 0x03, 0x09, + 0x11, 0x0a, 0xff, 0xfe, 0x09, 0x16, 0x12, 0x04, 0xff, 0x08, 0x11, 0x11, + 0x0f, 0x0d, 0x11, 0x16, 0x14, 0x12, 0x16, 0x20, 0x2c, 0x2c, 0x22, 0x21, + 0x27, 0x2b, 0x2b, 0x28, 0x28, 0x2c, 0x29, 0x23, 0x21, 0x20, 0x22, 0x2a, + 0x2c, 0x2a, 0x28, 0x23, 0x21, 0x20, 0x1a, 0x11, 0x09, 0x08, 0x0e, 0x0d, + 0x01, 0xf5, 0xeb, 0xe3, 0xe6, 0xec, 0xea, 0xe0, 0xd6, 0xd3, 0xd2, 0xcc, + 0xca, 0xd0, 0xd3, 0xcf, 0xca, 0xc8, 0xcc, 0xd4, 0xd7, 0xd5, 0xda, 0xe4, + 0xea, 0xe6, 0xdf, 0xde, 0xe7, 0xf0, 0xf0, 0xe6, 0xdd, 0xdf, 0xe7, 0xef, + 0xf2, 0xef, 0xec, 0xea, 0xea, 0xec, 0xf6, 0x01, 0x02, 0xf9, 0xf4, 0xff, + 0x0f, 0x14, 0x0b, 0x06, 0x0d, 0x17, 0x17, 0x10, 0x0e, 0x12, 0x1b, 0x1d, + 0x11, 0x06, 0x0b, 0x15, 0x17, 0x17, 0x1d, 0x23, 0x20, 0x18, 0x15, 0x1b, + 0x28, 0x34, 0x2f, 0x1e, 0x14, 0x1a, 0x24, 0x20, 0x18, 0x15, 0x12, 0x0f, + 0x0d, 0x09, 0x04, 0x05, 0x08, 0x09, 0x07, 0x03, 0xfe, 0xf9, 0xfa, 0x00, + 0x01, 0xff, 0xfc, 0xf6, 0xf0, 0xee, 0xef, 0xf0, 0xef, 0xea, 0xe4, 0xe2, + 0xe3, 0xe5, 0xe3, 0xdb, 0xd4, 0xd3, 0xd8, 0xdb, 0xd7, 0xd0, 0xcd, 0xd2, + 0xd8, 0xd9, 0xd6, 0xd4, 0xd7, 0xdc, 0xde, 0xe0, 0xe1, 0xde, 0xdd, 0xe0, + 0xe4, 0xe6, 0xe4, 0xe3, 0xe7, 0xee, 0xf5, 0xf8, 0xf5, 0xf2, 0xf4, 0xf6, + 0xfa, 0x03, 0x0b, 0x0d, 0x0b, 0x09, 0x0a, 0x11, 0x17, 0x1a, 0x1b, 0x1a, + 0x1a, 0x18, 0x10, 0x08, 0x09, 0x14, 0x22, 0x27, 0x1f, 0x17, 0x15, 0x1a, + 0x21, 0x22, 0x23, 0x28, 0x26, 0x1e, 0x18, 0x18, 0x1f, 0x24, 0x1f, 0x18, + 0x15, 0x18, 0x1a, 0x14, 0x0e, 0x0f, 0x13, 0x12, 0x0c, 0x07, 0x06, 0x07, + 0x09, 0x05, 0xff, 0x00, 0x05, 0x04, 0xfd, 0xfc, 0x00, 0x04, 0x03, 0xfc, + 0xf7, 0xf9, 0xff, 0x02, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xfc, 0xfd, 0x00, + 0x00, 0xff, 0x04, 0x09, 0x09, 0x07, 0x05, 0x06, 0x0d, 0x16, 0x1c, 0x1c, + 0x16, 0x10, 0x0c, 0x0c, 0x10, 0x14, 0x16, 0x15, 0x14, 0x14, 0x15, 0x14, + 0x13, 0x13, 0x14, 0x18, 0x1a, 0x16, 0x11, 0x0f, 0x0c, 0x09, 0x04, 0xfb, + 0xf5, 0xef, 0xe9, 0xe8, 0xeb, 0xea, 0xe2, 0xd8, 0xd0, 0xd1, 0xd7, 0xdc, + 0xdc, 0xd4, 0xcb, 0xcb, 0xcd, 0xce, 0xcf, 0xd2, 0xd7, 0xd9, 0xd9, 0xdb, + 0xe2, 0xea, 0xec, 0xe9, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xee, 0xf4, 0xf8, + 0xf4, 0xed, 0xeb, 0xf2, 0xfc, 0x05, 0x09, 0x04, 0xff, 0xff, 0x02, 0x06, + 0x0b, 0x12, 0x14, 0x10, 0x0b, 0x09, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0b, + 0x06, 0x02, 0x00, 0x01, 0x05, 0x08, 0x06, 0x04, 0x05, 0x07, 0x0a, 0x0f, + 0x11, 0x0d, 0x09, 0x06, 0x04, 0x05, 0x07, 0x07, 0x03, 0xfe, 0xfd, 0xff, + 0xff, 0xfc, 0xfa, 0xfc, 0xff, 0xff, 0xfc, 0xf8, 0xf4, 0xf5, 0xf8, 0xf8, + 0xf8, 0xf7, 0xf6, 0xf6, 0xf4, 0xef, 0xed, 0xef, 0xee, 0xec, 0xeb, 0xec, + 0xed, 0xeb, 0xe7, 0xe3, 0xe4, 0xe8, 0xeb, 0xe6, 0xe0, 0xde, 0xde, 0xe0, + 0xe2, 0xe0, 0xdf, 0xe0, 0xe4, 0xe6, 0xe1, 0xde, 0xe2, 0xe6, 0xe6, 0xe4, + 0xe3, 0xe7, 0xea, 0xe8, 0xe3, 0xe4, 0xee, 0xf6, 0xf2, 0xea, 0xea, 0xf2, + 0xfa, 0xfd, 0xfb, 0xfc, 0x01, 0x06, 0x04, 0x00, 0x00, 0x04, 0x07, 0x02, + 0xfe, 0x00, 0x04, 0x03, 0xfe, 0xfd, 0x00, 0x07, 0x0d, 0x0b, 0x05, 0x04, + 0x0a, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x10, 0x11, 0x0d, 0x09, + 0x08, 0x09, 0x0a, 0x0c, 0x0c, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, + 0x06, 0x08, 0x0d, 0x0d, 0x05, 0xff, 0xff, 0x00, 0x01, 0x01, 0x00, 0xff, + 0xfe, 0xff, 0x01, 0xfd, 0xf9, 0xfb, 0xfd, 0xfb, 0xfb, 0xfc, 0xf9, 0xf5, + 0xf3, 0xf4, 0xf9, 0xfe, 0xff, 0xfe, 0xfe, 0x01, 0x05, 0x05, 0x02, 0x00, + 0x00, 0x03, 0x06, 0x05, 0x06, 0x08, 0x05, 0x02, 0x04, 0x07, 0x08, 0x0a, + 0x0d, 0x0b, 0x09, 0x0b, 0x10, 0x11, 0x0c, 0x09, 0x09, 0x08, 0x03, 0xfd, + 0xf6, 0xf2, 0xef, 0xe9, 0xe1, 0xda, 0xd6, 0xd8, 0xd9, 0xd9, 0xda, 0xdb, + 0xd6, 0xcf, 0xca, 0xca, 0xce, 0xd1, 0xd1, 0xce, 0xcc, 0xcf, 0xd5, 0xd7, + 0xd7, 0xdd, 0xe4, 0xe6, 0xe6, 0xe5, 0xe5, 0xe6, 0xe9, 0xec, 0xee, 0xf1, + 0xf2, 0xf2, 0xf1, 0xf3, 0xf9, 0xfe, 0x01, 0x00, 0xff, 0x03, 0x08, 0x0a, + 0x09, 0x09, 0x0c, 0x11, 0x14, 0x10, 0x0f, 0x11, 0x13, 0x11, 0x0f, 0x0d, + 0x0b, 0x08, 0x08, 0x08, 0x0c, 0x11, 0x12, 0x0f, 0x0b, 0x0c, 0x12, 0x18, + 0x1a, 0x15, 0x10, 0x0d, 0x0b, 0x09, 0x09, 0x0b, 0x0f, 0x11, 0x0d, 0x09, + 0x09, 0x09, 0x0b, 0x0b, 0x09, 0x0b, 0x0d, 0x0a, 0x07, 0x07, 0x0b, 0x0d, + 0x0b, 0x07, 0x04, 0x02, 0x04, 0x06, 0x04, 0x01, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0xff, 0xfb, 0xf8, 0xf9, 0xfc, 0xfe, 0xfd, 0xf9, 0xf6, 0xf6, + 0xf7, 0xf7, 0xf7, 0xfa, 0xfb, 0xf9, 0xf7, 0xf7, 0xf7, 0xf4, 0xf5, 0xf9, + 0xfd, 0xfd, 0xf9, 0xf6, 0xf6, 0xf7, 0xfb, 0xff, 0xfd, 0xfa, 0xf9, 0xfc, + 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0x07, 0x0c, 0x0e, 0x0d, 0x0a, 0x07, + 0x07, 0x0b, 0x0b, 0x09, 0x09, 0x0e, 0x12, 0x11, 0x0d, 0x09, 0x0b, 0x10, + 0x16, 0x19, 0x17, 0x11, 0x0c, 0x0e, 0x14, 0x17, 0x19, 0x16, 0x10, 0x0f, + 0x13, 0x17, 0x17, 0x12, 0x10, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x14, + 0x12, 0x10, 0x0e, 0x0f, 0x10, 0x0f, 0x0e, 0x0f, 0x0e, 0x09, 0x04, 0x05, + 0x0b, 0x10, 0x10, 0x0b, 0x08, 0x08, 0x0b, 0x0b, 0x09, 0x08, 0x06, 0x02, + 0x00, 0x00, 0x02, 0x05, 0x06, 0x05, 0x03, 0x02, 0x03, 0x05, 0x07, 0x09, + 0x09, 0x08, 0x08, 0x07, 0x06, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, + 0x07, 0x09, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07, 0x03, 0xfe, 0xfa, + 0xf5, 0xee, 0xe6, 0xe1, 0xe0, 0xdc, 0xd8, 0xd4, 0xd1, 0xcf, 0xcd, 0xcd, + 0xcd, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xcb, + 0xd0, 0xd3, 0xd7, 0xdc, 0xe2, 0xe8, 0xea, 0xea, 0xea, 0xed, 0xf1, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf5, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0x00, 0x02, 0x05, + 0x07, 0x08, 0x08, 0x07, 0x07, 0x0a, 0x0e, 0x0f, 0x0d, 0x0b, 0x09, 0x09, + 0x0a, 0x09, 0x07, 0x07, 0x0a, 0x0b, 0x08, 0x07, 0x05, 0x04, 0x06, 0x09, + 0x08, 0x05, 0x06, 0x08, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, 0x08, 0x08, + 0x08, 0x08, 0x07, 0x04, 0x02, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, 0x08, + 0x08, 0x06, 0x03, 0x03, 0x05, 0x06, 0x04, 0x00, 0xff, 0xff, 0xff, 0x01, + 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x06, 0x05, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x04, 0x07, 0x07, 0x05, 0x02, 0xff, 0x00, 0x02, + 0x04, 0x04, 0x03, 0x01, 0x01, 0x01, 0x02, 0x04, 0x06, 0x05, 0x04, 0x05, + 0x07, 0x08, 0x09, 0x08, 0x09, 0x0c, 0x0d, 0x0b, 0x09, 0x0c, 0x12, 0x15, + 0x15, 0x13, 0x12, 0x13, 0x17, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x19, 0x19, + 0x1a, 0x1b, 0x1b, 0x1a, 0x18, 0x16, 0x17, 0x17, 0x15, 0x15, 0x15, 0x16, + 0x14, 0x11, 0x0e, 0x0d, 0x0f, 0x10, 0x0f, 0x0c, 0x09, 0x08, 0x08, 0x09, + 0x08, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x02, 0x00, 0xff, 0xfe, + 0xfe, 0xff, 0xff, 0xfd, 0xfb, 0xfa, 0xfa, 0xfb, 0xfd, 0xfd, 0xfc, 0xfb, + 0xfa, 0xf9, 0xf7, 0xf7, 0xf9, 0xfc, 0xfe, 0xfc, 0xf8, 0xf7, 0xf7, 0xfa, + 0xfd, 0xfc, 0xf8, 0xf7, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, 0xf4, + 0xf0, 0xed, 0xec, 0xe8, 0xe2, 0xdb, 0xd7, 0xd6, 0xd3, 0xce, 0xcd, 0xd0, + 0xd3, 0xd2, 0xce, 0xca, 0xc8, 0xcb, 0xcb, 0xc6, 0xc2, 0xc3, 0xc9, 0xcc, + 0xcd, 0xcd, 0xce, 0xd2, 0xd8, 0xdd, 0xe0, 0xe3, 0xe6, 0xe8, 0xea, 0xec, + 0xf0, 0xf4, 0xf4, 0xf3, 0xf4, 0xf6, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0x01, + 0x03, 0x03, 0x03, 0x06, 0x09, 0x09, 0x08, 0x07, 0x06, 0x07, 0x09, 0x0a, + 0x0a, 0x09, 0x08, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, + 0x09, 0x07, 0x06, 0x07, 0x09, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x0a, + 0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0a, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, + 0x09, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x06, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, + 0x0f, 0x0f, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x15, + 0x13, 0x12, 0x14, 0x15, 0x16, 0x16, 0x17, 0x19, 0x1a, 0x19, 0x17, 0x18, + 0x1a, 0x1b, 0x1a, 0x17, 0x15, 0x18, 0x19, 0x16, 0x11, 0x11, 0x12, 0x13, + 0x12, 0x12, 0x12, 0x14, 0x15, 0x14, 0x11, 0x11, 0x13, 0x15, 0x14, 0x11, + 0x11, 0x13, 0x15, 0x14, 0x13, 0x13, 0x14, 0x14, 0x12, 0x11, 0x10, 0x11, + 0x14, 0x12, 0x0f, 0x0f, 0x11, 0x10, 0x0c, 0x0a, 0x0c, 0x10, 0x10, 0x0c, + 0x09, 0x08, 0x09, 0x0a, 0x09, 0x07, 0x07, 0x08, 0x08, 0x06, 0x04, 0x04, + 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x03, 0x05, 0x05, 0x04, 0x00, 0x00, 0x0f, 0x11, 0x11, 0x0f, + 0x0d, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, + 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x07, 0x08, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x05, 0x05, 0x07, 0x07, + 0x09, 0x09, 0x09, 0x08, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x07, 0x06, + 0x07, 0x07, 0x08, 0x08, 0x07, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, + 0x05, 0x03, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x02, 0x01, 0xf5, 0xe5, 0xdd, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, + 0xcb, 0xc9, 0xc9, 0xc9, 0xc6, 0xc3, 0xc1, 0xc0, 0xc0, 0xbd, 0xbb, 0xb9, + 0xb9, 0xb8, 0xb8, 0xc3, 0xd3, 0xd7, 0xd9, 0xdc, 0xde, 0xe1, 0xe1, 0xe2, + 0xe5, 0xe7, 0xe8, 0xeb, 0xed, 0xef, 0xef, 0xf2, 0xf5, 0xf7, 0xf8, 0xf9, + 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x01, 0x03, 0x03, 0x05, 0x07, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x05, 0x05, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, 0x05, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x0b, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x0d, + 0x0d, 0x0f, 0x0f, 0x11, 0x11, 0x12, 0x11, 0x12, 0x13, 0x11, 0x11, 0x11, + 0x11, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, + 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x09, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x04, + 0x03, 0x05, 0x05, 0x04, 0x03, 0x03, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, + 0x05, 0x05, 0x07, 0x08, 0x09, 0x07, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, + 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0xef, 0xe0, 0xdd, 0xd9, 0xd7, 0xd5, 0xd1, + 0xcf, 0xcf, 0xcd, 0xcb, 0xc7, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbc, + 0xbb, 0xb9, 0xb8, 0xb7, 0xb9, 0xcb, 0xd6, 0xd7, 0xd8, 0xdb, 0xde, 0xe1, + 0xe3, 0xe4, 0xe5, 0xe8, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf3, 0xf5, 0xf7, + 0xf9, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x02, 0x03, 0x05, 0x05, 0x05, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0a, 0x09, + 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x11, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0e, 0x0d, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x08, 0x09, 0x09, 0x09, 0x09, 0x08, + 0x08, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, + 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0xfc, 0xe9, 0xdf, 0xdb, 0xd8, 0xd5, 0xd3, + 0xd1, 0xcf, 0xcd, 0xc9, 0xc9, 0xc8, 0xc7, 0xc5, 0xc2, 0xbf, 0xbd, 0xbd, + 0xbc, 0xbb, 0xb9, 0xb7, 0xb7, 0xbb, 0xd1, 0xd5, 0xd9, 0xdb, 0xdb, 0xdf, + 0xe2, 0xe5, 0xe7, 0xe8, 0xe9, 0xeb, 0xef, 0xef, 0xf3, 0xf5, 0xf7, 0xf8, + 0xfa, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x05, 0x07, 0x08, + 0x09, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x11, 0x0f, 0x11, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0d, 0x0f, 0x0f, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x09, 0x09, 0x0b, 0x09, 0x09, + 0x09, 0x09, 0x0b, 0x09, 0x09, 0x08, 0x07, 0x08, 0x09, 0x09, 0x08, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, + 0x05, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0xe8, 0xdd, 0xdb, 0xd9, 0xd5, + 0xd3, 0xd1, 0xcf, 0xcb, 0xc9, 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbc, 0xbb, 0xb9, 0xbb, 0xd3, 0xd9, 0xda, 0xdd, 0xdf, + 0xe1, 0xe4, 0xe5, 0xe8, 0xeb, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, + 0xf9, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x05, 0x07, + 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, + 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x0d, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x06, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x03, 0x05, 0x04, 0x04, 0x03, 0x03, 0x03, 0x05, 0x05, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0xf7, 0xdf, 0xe1, 0xdd, + 0xd9, 0xd7, 0xd3, 0xd1, 0xcf, 0xcd, 0xcb, 0xc9, 0xc9, 0xc7, 0xc7, 0xc5, + 0xc3, 0xc1, 0xbd, 0xbf, 0xbd, 0xbd, 0xbb, 0xb9, 0xc3, 0xd9, 0xd9, 0xdb, + 0xdf, 0xdf, 0xe1, 0xe5, 0xe7, 0xe9, 0xe9, 0xed, 0xef, 0xf1, 0xf3, 0xf5, + 0xf5, 0xf8, 0xfb, 0xfb, 0xfd, 0xff, 0x01, 0x01, 0x03, 0x05, 0x05, 0x06, + 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, + 0x0d, 0x0b, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, + 0x0d, 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0d, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, + 0x0b, 0x0b, 0x0c, 0x0b, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0a, + 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x09, 0x08, 0x08, 0x07, 0x07, + 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x07, 0x05, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x07, 0x05, + 0x05, 0x05, 0x04, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, + 0x03, 0x03, 0x03, 0x02, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x01, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xf5, 0xde, + 0xe0, 0xdd, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, 0xcd, 0xcc, 0xca, 0xc9, + 0xc8, 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, 0xc0, 0xbd, 0xbd, 0xbb, 0xc5, 0xdb, + 0xda, 0xdd, 0xdf, 0xe1, 0xe3, 0xe6, 0xe8, 0xe9, 0xeb, 0xed, 0xef, 0xf2, + 0xf3, 0xf5, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, 0x00, 0x01, 0x03, 0x05, 0x05, + 0x07, 0x07, 0x09, 0x0a, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0c, + 0x0d, 0x0d, 0x0c, 0x0d, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x0d, 0x0c, 0x0d, + 0x0b, 0x0c, 0x0b, 0x0b, 0x0c, 0x0d, 0x0b, 0x0c, 0x0d, 0x0c, 0x0d, 0x0d, + 0x0c, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0f, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0f, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, + 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0b, 0x0c, + 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, 0x09, 0x09, + 0x07, 0x08, 0x09, 0x09, 0x08, 0x09, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, + 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, + 0x07, 0x05, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0xfe, 0xe0, 0xe3, 0xdf, 0xdb, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xd1, 0xcd, + 0xcb, 0xca, 0xca, 0xc7, 0xc6, 0xc4, 0xc3, 0xc1, 0xc1, 0xc0, 0xbe, 0xbd, + 0xc0, 0xdd, 0xdb, 0xdd, 0xe0, 0xe1, 0xe3, 0xe7, 0xe9, 0xea, 0xed, 0xef, + 0xf1, 0xf3, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xff, 0x00, 0x01, 0x03, + 0x05, 0x05, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0d, 0x0d, 0x0b, 0x0d, 0x0b, 0x0c, 0x0c, 0x0d, 0x0b, 0x0d, + 0x0d, 0x0d, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, + 0x0b, 0x0c, 0x0c, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, + 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, + 0x0d, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0xf2, 0xe9, 0xeb, 0xe1, 0xd7, + 0xd2, 0xc9, 0xba, 0xb3, 0xb4, 0xb4, 0xb7, 0xb7, 0xbe, 0xbb, 0xb9, 0xc8, + 0xd4, 0xcc, 0xec, 0xe0, 0xe6, 0xe5, 0xfe, 0x03, 0x03, 0x32, 0xe1, 0x14, + 0x55, 0x31, 0x1b, 0x32, 0x23, 0x20, 0x3a, 0x26, 0x27, 0x29, 0x33, 0x20, + 0x35, 0x18, 0x2e, 0x3b, 0x17, 0x07, 0x12, 0x0a, 0x15, 0x0e, 0x05, 0x06, + 0x13, 0x13, 0xd7, 0x1a, 0xfd, 0xfd, 0xd0, 0x21, 0xf5, 0xd1, 0xef, 0x07, + 0x0a, 0xc3, 0x0b, 0x28, 0xe3, 0xe8, 0x1b, 0x2f, 0xf1, 0x07, 0x1c, 0x17, + 0x12, 0x1a, 0x3e, 0x2d, 0x01, 0x25, 0x35, 0x20, 0x0d, 0x1e, 0x33, 0x0a, + 0x1d, 0x00, 0x46, 0x0f, 0xf6, 0x3b, 0xf5, 0x1c, 0x08, 0x06, 0x07, 0xf6, + 0x3a, 0xdf, 0x0f, 0x1a, 0xdb, 0x39, 0xfc, 0x0c, 0x21, 0x02, 0x13, 0x00, + 0x27, 0xfc, 0x12, 0x39, 0xe5, 0x1a, 0x22, 0x0b, 0x16, 0x10, 0x0a, 0x1b, + 0x01, 0xf6, 0x1f, 0x0d, 0xf4, 0x14, 0x1e, 0xe4, 0xf5, 0x1a, 0x02, 0xea, + 0xfb, 0x19, 0xfd, 0xdc, 0xf5, 0x1d, 0x01, 0xd8, 0xfc, 0x15, 0xf0, 0xf5, + 0x0e, 0x09, 0xd7, 0x09, 0x0b, 0x0e, 0xea, 0x05, 0x26, 0xf2, 0x05, 0xed, + 0x1b, 0xf2, 0xf7, 0xfc, 0xf6, 0xfd, 0x02, 0x00, 0xfd, 0xfc, 0xfd, 0xe7, + 0xe9, 0xf3, 0xef, 0xf7, 0xd7, 0xf7, 0x03, 0xd7, 0xd8, 0xf9, 0xec, 0xd9, + 0xd6, 0xde, 0xe9, 0xd2, 0xd7, 0xe8, 0xf9, 0xd0, 0xe4, 0x15, 0xbe, 0x0c, + 0x0d, 0x01, 0x08, 0xce, 0x42, 0xf1, 0x25, 0x10, 0x0b, 0x50, 0xec, 0x39, + 0x1d, 0xfc, 0x4b, 0xff, 0x0b, 0x1b, 0x0d, 0x24, 0xff, 0x2a, 0x09, 0x13, + 0x13, 0xe9, 0x16, 0x08, 0xed, 0x0d, 0x09, 0xe1, 0x05, 0x0d, 0xf7, 0x07, + 0x0c, 0x17, 0x15, 0xf7, 0x04, 0x27, 0x16, 0xfd, 0x19, 0x2e, 0xed, 0x17, + 0x26, 0x21, 0xfc, 0x1e, 0x28, 0x00, 0xfb, 0x0e, 0x26, 0x08, 0xf4, 0x17, + 0x26, 0xea, 0xf6, 0x0d, 0x13, 0xf6, 0xf8, 0x0d, 0xf0, 0xf0, 0x02, 0x07, + 0xf1, 0xe1, 0x00, 0x14, 0xe7, 0xf4, 0x03, 0xfd, 0xf3, 0xfc, 0xfe, 0x01, + 0x0d, 0x10, 0xf6, 0x05, 0x0e, 0x01, 0x02, 0xeb, 0x00, 0xff, 0xe5, 0xfa, + 0x10, 0x00, 0xf0, 0xfd, 0x02, 0xdd, 0xfb, 0xd1, 0x03, 0xf0, 0xd7, 0x00, + 0xd4, 0xff, 0xcf, 0xf2, 0xed, 0xb6, 0x02, 0xc3, 0xd9, 0xe1, 0xbf, 0x17, + 0xc6, 0xce, 0xf3, 0xdc, 0x02, 0xea, 0x08, 0xe3, 0xfd, 0x21, 0xdc, 0x06, + 0x1a, 0x12, 0x22, 0x0e, 0x0f, 0x3a, 0x0e, 0x15, 0x1a, 0x29, 0xf6, 0x24, + 0x11, 0x11, 0x18, 0x1c, 0x1b, 0x05, 0x09, 0xfe, 0x17, 0xf5, 0xec, 0x0f, + 0x09, 0xdf, 0xf1, 0x0a, 0x03, 0xe8, 0x1f, 0x05, 0xfb, 0x02, 0x00, 0x29, + 0xec, 0xfc, 0x24, 0x14, 0xf5, 0xfd, 0x2b, 0x25, 0xf7, 0x1a, 0x1a, 0x0f, + 0x0a, 0x12, 0x1e, 0x19, 0x0a, 0x19, 0x12, 0x07, 0x0b, 0x1a, 0x18, 0xf2, + 0x10, 0x06, 0x0d, 0x06, 0x00, 0xf7, 0xfb, 0x05, 0xf7, 0xf9, 0x00, 0x04, + 0x02, 0xe2, 0xf8, 0x1f, 0xe0, 0x0b, 0x05, 0x0c, 0xff, 0xf7, 0x1c, 0xf7, + 0x02, 0xf2, 0xeb, 0x0b, 0xe0, 0xfb, 0x0d, 0xeb, 0x0b, 0xec, 0xfd, 0xec, + 0xe0, 0xf9, 0xe6, 0xeb, 0xe1, 0xf7, 0xee, 0xe3, 0xe3, 0xfd, 0xe1, 0xf1, + 0xd9, 0xd1, 0xf1, 0xeb, 0xeb, 0xe6, 0xdd, 0xce, 0xf9, 0xd0, 0xd0, 0xef, + 0xee, 0xbe, 0xce, 0xdd, 0xc0, 0xd9, 0xe6, 0xd9, 0xe2, 0xd2, 0xf0, 0xec, + 0xe6, 0xe2, 0xf9, 0x06, 0xc0, 0xf7, 0x19, 0xee, 0x04, 0x26, 0x04, 0x10, + 0x2a, 0x3e, 0x00, 0x17, 0x1a, 0x17, 0x28, 0xfd, 0x0a, 0x3b, 0x45, 0x03, + 0x43, 0x2d, 0x34, 0x1c, 0x32, 0x34, 0x1d, 0x1a, 0x27, 0x36, 0x13, 0x19, + 0x4d, 0x2a, 0xf6, 0x2e, 0x16, 0x05, 0xe5, 0x32, 0x0a, 0x00, 0xf4, 0x08, + 0x1b, 0xe2, 0x10, 0x15, 0xee, 0x01, 0x13, 0x1f, 0xf1, 0x0a, 0x22, 0xdf, + 0x29, 0x09, 0x1c, 0x20, 0xfa, 0x3d, 0x07, 0x14, 0x11, 0x16, 0x2e, 0x01, + 0x2e, 0x11, 0x1c, 0x31, 0x17, 0x2f, 0xf8, 0x14, 0x19, 0xed, 0x05, 0xfa, + 0x2f, 0x02, 0xf0, 0x1a, 0xdf, 0x20, 0xf5, 0xe7, 0x18, 0xef, 0xff, 0xf3, + 0x05, 0xe8, 0x06, 0x24, 0xdc, 0xe3, 0x0a, 0x01, 0xe1, 0xf9, 0xf7, 0xeb, + 0x01, 0xcf, 0xfc, 0x0e, 0xd2, 0x1b, 0x03, 0xe6, 0xf9, 0x06, 0x1e, 0xd5, + 0x19, 0x1b, 0x00, 0x14, 0x00, 0x1f, 0x27, 0x05, 0x0d, 0x12, 0x07, 0x09, + 0x24, 0x09, 0xf9, 0x22, 0x1c, 0x02, 0xfb, 0x1b, 0x17, 0x10, 0xf3, 0x05, + 0xfc, 0xf8, 0xf4, 0x10, 0xfe, 0xe9, 0x22, 0x06, 0xf8, 0x0d, 0x09, 0x13, + 0xf3, 0xef, 0x19, 0xfb, 0x09, 0xf2, 0x1f, 0x1c, 0xdd, 0x08, 0xf7, 0xed, + 0x03, 0xe9, 0xfc, 0xe3, 0xf3, 0xf6, 0xe1, 0xfe, 0xdb, 0x04, 0xda, 0xe6, + 0x19, 0xe5, 0x06, 0xde, 0xfe, 0x05, 0xde, 0x1e, 0xe9, 0x23, 0x09, 0x01, + 0x26, 0xd2, 0x38, 0x0e, 0xfc, 0x12, 0x08, 0x31, 0xff, 0x23, 0x16, 0x17, + 0x19, 0xec, 0x04, 0x03, 0xf4, 0x03, 0x10, 0xed, 0xf1, 0x1e, 0xeb, 0xec, + 0x06, 0x01, 0x07, 0xe0, 0xec, 0x06, 0x03, 0xef, 0xf3, 0x16, 0xe7, 0xed, + 0x1b, 0xf3, 0xe0, 0x0d, 0x03, 0xe3, 0xdf, 0xfc, 0x01, 0xf9, 0xea, 0xff, + 0x13, 0xe5, 0xf7, 0x13, 0x03, 0xf9, 0x1a, 0x16, 0xf0, 0x0d, 0x2c, 0x18, + 0x00, 0x0f, 0x1c, 0x26, 0xf1, 0x07, 0x2f, 0xff, 0x0c, 0x17, 0x10, 0x02, + 0x03, 0x2b, 0x00, 0xfb, 0x13, 0x00, 0x05, 0xdd, 0x08, 0x12, 0xe5, 0x01, + 0x09, 0x05, 0xff, 0x00, 0x06, 0xf1, 0x05, 0xee, 0xf8, 0xff, 0xf2, 0x13, + 0xf8, 0xfb, 0xf4, 0xfb, 0x00, 0xd2, 0x09, 0xe4, 0xe8, 0xf5, 0xdd, 0x11, + 0xda, 0xe1, 0xfa, 0xdc, 0x01, 0xe7, 0xfc, 0xe4, 0xf8, 0x0e, 0xe1, 0xf5, + 0x04, 0x07, 0x08, 0x00, 0x08, 0x1b, 0xfe, 0x0e, 0x0c, 0x16, 0xf3, 0x29, + 0x10, 0x0e, 0x15, 0x21, 0x30, 0xf4, 0x10, 0x0f, 0x0f, 0xfe, 0xf2, 0x18, + 0x0f, 0xeb, 0x02, 0x0e, 0x04, 0xf1, 0x1a, 0x03, 0xe5, 0x00, 0x0b, 0x0d, + 0xe6, 0xfe, 0x14, 0x03, 0xec, 0xfb, 0x1e, 0xfe, 0xea, 0x0f, 0xfe, 0xe5, + 0x00, 0x04, 0xfc, 0xf6, 0xfe, 0x13, 0xf6, 0xea, 0x17, 0x14, 0x07, 0xf5, + 0x17, 0x18, 0x03, 0x1b, 0x03, 0x13, 0x18, 0x0c, 0x11, 0x0a, 0x09, 0x16, + 0x11, 0xfd, 0x15, 0x11, 0x00, 0x0a, 0x07, 0x0e, 0x01, 0x0b, 0x0a, 0xef, + 0xfc, 0xf6, 0x06, 0xf1, 0xf3, 0x0e, 0xfd, 0xf5, 0xfe, 0xf6, 0x06, 0xe8, + 0xef, 0xfe, 0xec, 0xf9, 0xf4, 0x09, 0xee, 0xf3, 0x03, 0xee, 0xf3, 0xee, + 0xe8, 0xf0, 0xf1, 0xf6, 0xeb, 0xef, 0xe7, 0xf4, 0xfa, 0xe2, 0x02, 0xfe, + 0xe8, 0x06, 0xf5, 0x0b, 0xee, 0xfe, 0x04, 0xfe, 0xf8, 0xfc, 0x11, 0xf7, + 0xea, 0xf9, 0x08, 0xe5, 0xf0, 0x05, 0x03, 0xf9, 0xfd, 0x0e, 0x0a, 0xee, + 0x11, 0x0b, 0xfc, 0xf3, 0x18, 0x09, 0xf8, 0x0a, 0x09, 0x24, 0x0b, 0x19, + 0x1f, 0x11, 0x0c, 0x12, 0x20, 0x1f, 0x05, 0x1a, 0x24, 0x11, 0x1a, 0x26, + 0x27, 0x20, 0x12, 0x1c, 0x10, 0x0d, 0x19, 0x12, 0x24, 0x06, 0x06, 0x1c, + 0xf9, 0x13, 0x00, 0xfe, 0xff, 0x01, 0xff, 0xee, 0x02, 0xf8, 0xf1, 0xf8, + 0xf1, 0x02, 0xf3, 0xe9, 0x04, 0xfd, 0xf3, 0xf5, 0x07, 0xfc, 0xfb, 0x07, + 0x11, 0x0f, 0x08, 0x09, 0x18, 0x09, 0xff, 0x06, 0x06, 0x0c, 0x10, 0x03, + 0x0f, 0x12, 0xff, 0x0a, 0xf8, 0xfd, 0xf8, 0xfe, 0x00, 0xe4, 0x02, 0xf1, + 0xe9, 0x0b, 0xd6, 0xf8, 0xf5, 0xdc, 0xfb, 0xe6, 0xfa, 0xeb, 0xed, 0xef, + 0xe3, 0x14, 0xe6, 0xf3, 0x16, 0xee, 0xff, 0x03, 0x05, 0xff, 0x05, 0x11, + 0xfd, 0x1a, 0x0b, 0x17, 0x22, 0x0e, 0x13, 0x15, 0x10, 0x07, 0x18, 0x21, + 0x10, 0x11, 0x16, 0x0e, 0x11, 0x0c, 0x07, 0x0e, 0x12, 0xf8, 0x0e, 0x06, + 0xff, 0x03, 0x06, 0x0e, 0x01, 0x0f, 0x01, 0x14, 0x13, 0x02, 0x11, 0x11, + 0x04, 0x05, 0x0a, 0x0f, 0x0b, 0x1c, 0x12, 0x1a, 0x08, 0x04, 0x23, 0x07, + 0x10, 0x0f, 0x19, 0x08, 0x06, 0x17, 0x04, 0x07, 0x00, 0x01, 0x08, 0xf6, + 0xfb, 0x05, 0xf2, 0xf0, 0xf8, 0xfc, 0xec, 0xf9, 0xf2, 0xf5, 0xf7, 0xf5, + 0x0c, 0xf3, 0xf0, 0x07, 0x01, 0xfc, 0xf6, 0x1a, 0x0c, 0xf9, 0x0a, 0xee, + 0x09, 0x00, 0xf5, 0x07, 0xfc, 0x02, 0x01, 0x03, 0xf4, 0xf0, 0x0b, 0xec, + 0xef, 0xef, 0xe7, 0xfd, 0xe8, 0xed, 0xef, 0xef, 0xea, 0xe3, 0xee, 0xeb, + 0xf5, 0xf8, 0xe1, 0xea, 0xfd, 0xed, 0xf1, 0xf8, 0x01, 0xf3, 0xfb, 0x02, + 0xfc, 0x00, 0x03, 0xfe, 0x09, 0x04, 0xfe, 0x18, 0x07, 0x0e, 0x14, 0x11, + 0x02, 0x0c, 0x0c, 0x0f, 0x11, 0x16, 0x17, 0x10, 0x11, 0x0a, 0x1a, 0x0d, + 0x08, 0x18, 0x13, 0xff, 0x0a, 0x0e, 0x0c, 0x0b, 0x08, 0x0d, 0x0d, 0x08, + 0x0b, 0x15, 0x09, 0x09, 0x15, 0x0c, 0xf4, 0x09, 0x07, 0x11, 0x0a, 0x0b, + 0x0e, 0x0d, 0x08, 0x06, 0x13, 0x04, 0x08, 0x0e, 0x0b, 0x0b, 0x06, 0x0e, + 0x05, 0xfb, 0x09, 0xf7, 0x0a, 0xf8, 0xfe, 0xff, 0xeb, 0x0a, 0xf6, 0xf9, + 0xf2, 0xf5, 0xfc, 0xf6, 0xf9, 0xf7, 0xfa, 0x07, 0xec, 0xfd, 0xfb, 0xfd, + 0x0e, 0xff, 0x00, 0xfd, 0x07, 0xf6, 0xfb, 0x05, 0xf6, 0x05, 0x04, 0xf7, + 0xfa, 0x00, 0x04, 0xfc, 0xf7, 0xf8, 0xf5, 0xfd, 0xea, 0xf4, 0xfd, 0xf1, + 0xe9, 0xf0, 0xf4, 0xe9, 0xf2, 0xf8, 0xf5, 0xf3, 0xeb, 0xf9, 0xfd, 0xec, + 0x01, 0xff, 0x01, 0xf7, 0x00, 0x10, 0xfc, 0x09, 0x09, 0x02, 0x08, 0x02, + 0x0f, 0x0f, 0x03, 0x16, 0x0d, 0x08, 0xfd, 0x10, 0x0e, 0x06, 0x13, 0x0f, + 0x0f, 0x0f, 0x05, 0x0e, 0x0f, 0x0a, 0x0d, 0x0d, 0x08, 0x01, 0x14, 0x07, + 0x04, 0x0d, 0x06, 0x09, 0x09, 0x07, 0x0c, 0x10, 0x11, 0x02, 0x05, 0x05, + 0xfe, 0x0b, 0xfd, 0x06, 0x07, 0x04, 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x01, 0x0b, 0x04, 0xfb, 0x00, 0x01, 0x02, 0x01, 0xfe, 0xfb, + 0xfb, 0x00, 0xff, 0xfd, 0xfb, 0xf6, 0x08, 0xf1, 0xf5, 0x09, 0x02, 0x00, + 0xfa, 0x08, 0x01, 0xfc, 0x0d, 0x0b, 0x09, 0x04, 0x07, 0x0f, 0xfe, 0xfc, + 0x09, 0x09, 0xfa, 0x02, 0x06, 0xff, 0xfa, 0xfb, 0x03, 0x00, 0xf0, 0xfd, + 0xfb, 0xf1, 0xf8, 0xf7, 0xfe, 0xec, 0xf1, 0xfb, 0xf2, 0xf5, 0xfa, 0xfe, + 0x00, 0xf5, 0x03, 0x06, 0x02, 0x03, 0x05, 0x11, 0xfe, 0x08, 0x13, 0x05, + 0x0e, 0x0f, 0x0a, 0x0b, 0x09, 0x0b, 0x0c, 0x12, 0x05, 0x06, 0x0e, 0x01, + 0x03, 0x09, 0x07, 0x0c, 0x06, 0x07, 0x07, 0x0d, 0x04, 0x00, 0x12, 0x04, + 0x03, 0x08, 0x09, 0x07, 0x04, 0x05, 0x0c, 0x0b, 0x04, 0x07, 0x09, 0x08, + 0x0e, 0x0f, 0x0c, 0x09, 0x09, 0x0c, 0x06, 0x02, 0x09, 0x07, 0x07, 0x00, + 0x02, 0x03, 0x00, 0x01, 0xf5, 0x01, 0xff, 0xfa, 0x01, 0xfa, 0xf5, 0xfe, + 0xfd, 0xf8, 0xf6, 0xf7, 0xfe, 0xf3, 0xf3, 0xf5, 0xfd, 0xf9, 0xf2, 0xfa, + 0xfe, 0xf1, 0xff, 0xff, 0xfc, 0xfb, 0xfd, 0x02, 0x01, 0x03, 0x01, 0x0b, + 0x03, 0x05, 0x05, 0x07, 0x05, 0x00, 0x08, 0x02, 0x05, 0x08, 0x00, 0x03, + 0x04, 0x03, 0x00, 0xfe, 0x04, 0xf9, 0x02, 0x00, 0xf8, 0x00, 0xfe, 0xf8, + 0xf7, 0xf9, 0xfe, 0xfb, 0x00, 0xf5, 0x03, 0x06, 0xf9, 0x0a, 0x05, 0x03, + 0x0a, 0x09, 0x0a, 0x05, 0x11, 0x0f, 0x0a, 0x0d, 0x08, 0x13, 0x0c, 0x08, + 0x0c, 0x12, 0x0a, 0x01, 0x0e, 0x06, 0x05, 0x05, 0x05, 0x0c, 0x03, 0x06, + 0x08, 0x05, 0x07, 0xff, 0x07, 0x04, 0x02, 0x05, 0x00, 0x03, 0x03, 0x08, + 0x07, 0x00, 0x08, 0x01, 0x05, 0x08, 0x05, 0x06, 0x07, 0x09, 0xff, 0x03, + 0x05, 0x03, 0x08, 0x00, 0xff, 0x09, 0xfd, 0xfd, 0xff, 0x01, 0xf7, 0x03, + 0x01, 0xf7, 0x01, 0xfe, 0x01, 0xfc, 0xfe, 0xf8, 0x00, 0xfa, 0xf4, 0xff, + 0xfd, 0xfa, 0xfb, 0xfb, 0xf9, 0xfa, 0x01, 0xfd, 0xfe, 0x00, 0xfe, 0x04, + 0x00, 0x00, 0x05, 0x0b, 0x05, 0x01, 0x0e, 0x07, 0x08, 0x08, 0x06, 0x08, + 0x08, 0x08, 0x02, 0x06, 0x09, 0x02, 0x06, 0xff, 0x00, 0x05, 0xff, 0xfb, + 0x01, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xfe, 0xfe, 0xfc, 0xfa, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x09, 0x07, 0xfd, 0x07, 0x06, 0x07, 0x06, 0x05, 0x0a, + 0x04, 0x05, 0x0a, 0x06, 0x09, 0x04, 0x06, 0x05, 0x04, 0x06, 0xff, 0x06, + 0xff, 0x05, 0x02, 0x02, 0x02, 0x05, 0xff, 0xff, 0x04, 0x02, 0xfd, 0x03, + 0x00, 0xfe, 0x00, 0xfe, 0x04, 0x00, 0xfe, 0x00, 0x03, 0xfc, 0xfe, 0x06, + 0xff, 0xfd, 0x02, 0x02, 0xfd, 0x03, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, + 0xfc, 0x00, 0x02, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0x03, 0x02, 0x01, + 0x00, 0x01, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xfb, 0xff, 0x04, 0xfb, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x04, + 0x04, 0xff, 0x02, 0x05, 0x02, 0x01, 0x03, 0x04, 0x04, 0x01, 0x07, 0x04, + 0x02, 0x02, 0x04, 0x04, 0xff, 0x02, 0x03, 0x00, 0xff, 0x02, 0x03, 0x00, + 0xfe, 0x04, 0x00, 0xff, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x02, 0x00, + 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x02, 0x05, 0x04, 0x02, 0x03, 0x04, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0x04, 0x02, 0x00, 0x03, 0x02, + 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xf9, 0xf3, 0xed, 0xe9, 0xe5, 0xe3, 0xe1, 0xdf, + 0xdd, 0xdb, 0xd9, 0xd7, 0xd5, 0xd3, 0xd1, 0xcf, 0xcd, 0xcb, 0xc9, 0xc8, + 0xc7, 0xc5, 0xc3, 0xc2, 0xc1, 0xbf, 0xbd, 0xbc, 0xbb, 0xb9, 0xb7, 0xb6, + 0xb5, 0xb3, 0xb2, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xb3, 0xb9, 0xc1, 0xc9, 0xd0, 0xd7, 0xdd, 0xe2, 0xe6, 0xe9, 0xec, + 0xef, 0xf2, 0xf5, 0xf7, 0xf9, 0xfc, 0xfd, 0xff, 0x01, 0x03, 0x05, 0x07, + 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x15, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x22, 0x23, 0x24, + 0x25, 0x27, 0x29, 0x2a, 0x2b, 0x2b, 0x2d, 0x2f, 0x31, 0x30, 0x2f, 0x30, + 0x33, 0x36, 0x37, 0x37, 0x36, 0x35, 0x33, 0x33, 0x33, 0x35, 0x38, 0x3b, + 0x3e, 0x41, 0x44, 0x44, 0x44, 0x46, 0x49, 0x49, 0x47, 0x46, 0x46, 0x47, + 0x48, 0x48, 0x47, 0x46, 0x46, 0x46, 0x48, 0x49, 0x48, 0x47, 0x46, 0x46, + 0x46, 0x47, 0x48, 0x47, 0x47, 0x47, 0x48, 0x49, 0x48, 0x47, 0x47, 0x47, + 0x48, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, + 0x48, 0x48, 0x47, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, + 0x47, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x40, 0x40, + 0x3f, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, + 0x3a, 0x3a, 0x3a, 0x39, 0x38, 0x38, 0x37, 0x36, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x34, 0x33, 0x31, 0x2f, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2f, 0x2f, 0x2e, 0x2d, 0x2d, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, + 0x27, 0x25, 0x26, 0x28, 0x2b, 0x2c, 0x2a, 0x27, 0x26, 0x26, 0x27, 0x28, + 0x27, 0x25, 0x22, 0x1f, 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x25, + 0x25, 0x26, 0x26, 0x25, 0x22, 0x20, 0x1e, 0x1e, 0x20, 0x21, 0x22, 0x22, + 0x23, 0x26, 0x29, 0x29, 0x28, 0x27, 0x25, 0x23, 0x21, 0x21, 0x21, 0x22, + 0x23, 0x25, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2b, 0x2a, 0x28, 0x26, + 0x25, 0x25, 0x26, 0x27, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, + 0x2a, 0x29, 0x28, 0x27, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x2f, + 0x2f, 0x2f, 0x30, 0x30, 0x2f, 0x2d, 0x2c, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x31, 0x31, 0x31, 0x30, 0x2f, 0x2d, 0x2d, 0x2c, 0x2b, 0x2a, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2e, 0x2d, 0x2c, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x26, 0x26, 0x28, 0x2a, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2a, 0x29, 0x27, 0x25, 0x25, 0x27, 0x28, 0x29, 0x29, 0x27, + 0x25, 0x23, 0x23, 0x24, 0x25, 0x24, 0x24, 0x24, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x20, 0x1f, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, + 0x1d, 0x1f, 0x21, 0x21, 0x20, 0x1d, 0x1a, 0x18, 0x18, 0x19, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1e, 0x1b, 0x19, 0x17, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x1f, + 0x1f, 0x1e, 0x1c, 0x1a, 0x19, 0x19, 0x1b, 0x1d, 0x1e, 0x1f, 0x1e, 0x1d, + 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1d, 0x1e, + 0x20, 0x21, 0x22, 0x22, 0x20, 0x1e, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1f, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1d, + 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1b, 0x1a, 0x19, + 0x18, 0x15, 0x12, 0x0e, 0x0a, 0x06, 0x02, 0xfe, 0xfb, 0xf8, 0xf4, 0xf1, + 0xee, 0xe9, 0xe4, 0xdf, 0xd9, 0xd5, 0xd1, 0xcd, 0xcb, 0xc9, 0xc8, 0xc7, + 0xc5, 0xc4, 0xc3, 0xc1, 0xbf, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb3, 0xb5, 0xb9, 0xbd, 0xc1, 0xc5, 0xc9, 0xce, 0xd1, 0xd4, 0xd7, + 0xd9, 0xdc, 0xdf, 0xe1, 0xe5, 0xe8, 0xeb, 0xef, 0xf3, 0xf7, 0xfb, 0xfe, + 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x07, 0x09, + 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x15, 0x14, 0x13, 0x11, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x15, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x19, 0x18, + 0x17, 0x16, 0x16, 0x16, 0x16, 0x17, 0x18, 0x18, 0x19, 0x1b, 0x1c, 0x1d, + 0x1d, 0x1c, 0x1b, 0x19, 0x19, 0x19, 0x1a, 0x19, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1b, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x18, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x18, 0x17, 0x16, 0x15, 0x15, 0x15, + 0x15, 0x14, 0x13, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x12, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x10, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x0e, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0d, 0x0e, 0x0f, 0x0f, 0x0d, 0x0b, 0x0b, 0x0a, 0x09, + 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x05, 0x05, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x05, + 0x05, 0x05, 0x06, 0x07, 0x08, 0x07, 0x06, 0x05, 0x03, 0x03, 0x05, 0x07, + 0x09, 0x0b, 0x0c, 0x0c, 0x0b, 0x09, 0x07, 0x07, 0x07, 0x07, 0x09, 0x0b, + 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x11, 0x13, 0x14, 0x13, 0x12, + 0x11, 0x0f, 0x0d, 0x0c, 0x0d, 0x11, 0x14, 0x17, 0x19, 0x19, 0x17, 0x15, + 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1b, + 0x1d, 0x1f, 0x21, 0x23, 0x24, 0x22, 0x20, 0x1e, 0x1d, 0x1e, 0x20, 0x22, + 0x25, 0x27, 0x26, 0x24, 0x22, 0x20, 0x1f, 0x1f, 0x21, 0x23, 0x25, 0x26, + 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x22, 0x23, 0x23, 0x22, 0x21, 0x20, 0x1f, + 0x1f, 0x20, 0x21, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1a, + 0x1b, 0x1c, 0x1b, 0x1a, 0x18, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, + 0x17, 0x17, 0x17, 0x16, 0x15, 0x13, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x07, + 0x10, 0x16, 0x18, 0x16, 0x0f, 0x04, 0xfd, 0xf9, 0xfa, 0xfe, 0x02, 0x07, + 0x0a, 0x0a, 0x08, 0x05, 0x03, 0x02, 0x01, 0x01, 0xfd, 0xfa, 0xf8, 0xf5, + 0xf3, 0xf1, 0xee, 0xed, 0xec, 0xef, 0xf5, 0x00, 0x0b, 0x18, 0x1f, 0x21, + 0x1e, 0x19, 0x15, 0x12, 0x12, 0x15, 0x15, 0x12, 0x0d, 0x05, 0xfd, 0xf5, + 0xf2, 0xf9, 0xec, 0xe0, 0xda, 0xdb, 0xdd, 0xe0, 0xeb, 0xfd, 0x0e, 0x11, + 0x07, 0x02, 0x0d, 0x22, 0x2d, 0x21, 0x0d, 0xff, 0x01, 0x0a, 0x07, 0xf9, + 0xf0, 0xf0, 0xf9, 0xff, 0x01, 0x04, 0x0d, 0x17, 0x19, 0x10, 0x07, 0x07, + 0x0c, 0x09, 0xf5, 0xdc, 0xdb, 0xd8, 0xe4, 0xf0, 0xec, 0xe6, 0xea, 0xfa, + 0x0f, 0x1e, 0x29, 0x31, 0x33, 0x2d, 0x26, 0x19, 0x19, 0x25, 0x28, 0x1b, + 0x00, 0xe6, 0xe0, 0xeb, 0xf3, 0xf0, 0xe5, 0xdd, 0xdc, 0xde, 0xdf, 0xe5, + 0xf3, 0x02, 0x0a, 0x07, 0x00, 0x03, 0x15, 0x26, 0x2a, 0x1c, 0x0b, 0x01, + 0x02, 0x06, 0x00, 0xf8, 0xf5, 0xfa, 0x00, 0x03, 0x04, 0x06, 0x0c, 0x14, + 0x11, 0x08, 0x04, 0x05, 0x06, 0xfe, 0xea, 0xdb, 0xd9, 0xdd, 0xea, 0xee, + 0xeb, 0xed, 0xf8, 0x0b, 0x1d, 0x27, 0x2c, 0x30, 0x2e, 0x27, 0x1b, 0x16, + 0x1b, 0x24, 0x23, 0x0d, 0xf4, 0xe4, 0xe3, 0xec, 0xef, 0xe9, 0xe2, 0xde, + 0xde, 0xe1, 0xe4, 0xeb, 0xf7, 0x03, 0x06, 0x01, 0xff, 0x0a, 0x1c, 0x2a, + 0x26, 0x17, 0x08, 0x03, 0x02, 0x00, 0xfc, 0xf9, 0xfb, 0x01, 0x07, 0x05, + 0x04, 0x07, 0x0d, 0x0f, 0x0a, 0x05, 0x02, 0x03, 0x01, 0xf6, 0xe4, 0xdb, + 0xd9, 0xe2, 0xeb, 0xed, 0xee, 0xf6, 0x07, 0x19, 0x26, 0x2b, 0x2d, 0x2c, + 0x26, 0x1d, 0x15, 0x16, 0x1f, 0x22, 0x18, 0x03, 0xed, 0xe3, 0xe6, 0xec, + 0xeb, 0xe5, 0xe0, 0xe0, 0xe1, 0xe4, 0xe8, 0xf0, 0xfa, 0x01, 0x00, 0x00, + 0x05, 0x11, 0x25, 0x2d, 0x24, 0x13, 0x07, 0x01, 0x00, 0xfe, 0xfc, 0xfc, + 0x02, 0x09, 0x0a, 0x07, 0x05, 0x07, 0x0a, 0x09, 0x05, 0x00, 0xff, 0xff, + 0xfc, 0xef, 0xe1, 0xdc, 0xe0, 0xea, 0xef, 0xf2, 0xf8, 0x06, 0x1a, 0x29, + 0x30, 0x30, 0x2c, 0x29, 0x24, 0x1c, 0x1a, 0x1e, 0x24, 0x22, 0x11, 0xfa, + 0xe9, 0xe3, 0xe5, 0xe7, 0xe3, 0xdd, 0xda, 0xdb, 0xde, 0xe1, 0xe6, 0xef, + 0xf7, 0xfb, 0xfc, 0xfc, 0x07, 0x17, 0x26, 0x26, 0x1a, 0x0c, 0x00, 0xfc, + 0xfc, 0xfd, 0xfe, 0x04, 0x0b, 0x0e, 0x0c, 0x08, 0x06, 0x07, 0x0a, 0x07, + 0x02, 0xfd, 0xfc, 0xfc, 0xf6, 0xea, 0xe1, 0xe0, 0xe5, 0xed, 0xf2, 0xf8, + 0x03, 0x16, 0x26, 0x30, 0x31, 0x2d, 0x27, 0x22, 0x1d, 0x1a, 0x1c, 0x20, + 0x21, 0x17, 0x04, 0xf0, 0xe5, 0xe3, 0xe5, 0xe2, 0xde, 0xdc, 0xdb, 0xde, + 0xe0, 0xe5, 0xea, 0xf2, 0xf7, 0xfa, 0xfb, 0x02, 0x12, 0x21, 0x27, 0x23, + 0x14, 0x06, 0xfe, 0xfb, 0xfc, 0xff, 0x04, 0x0a, 0x0e, 0x0d, 0x09, 0x05, + 0x05, 0x08, 0x07, 0x04, 0xfe, 0xfc, 0xfb, 0xf9, 0xf1, 0xe8, 0xe3, 0xe3, + 0xe9, 0xef, 0xf6, 0xff, 0x11, 0x21, 0x2e, 0x32, 0x2e, 0x28, 0x21, 0x1d, + 0x1a, 0x1a, 0x1d, 0x20, 0x1a, 0x0d, 0xf9, 0xe9, 0xe1, 0xe0, 0xe2, 0xdf, + 0xdd, 0xdb, 0xdc, 0xdf, 0xe3, 0xe8, 0xed, 0xf3, 0xf8, 0xfb, 0xfe, 0x0b, + 0x1a, 0x26, 0x28, 0x1d, 0x0c, 0x00, 0xfb, 0xfb, 0x00, 0x04, 0x0a, 0x0e, + 0x0e, 0x0b, 0x07, 0x04, 0x05, 0x07, 0x04, 0x00, 0xfb, 0xf9, 0xf8, 0xf5, + 0xed, 0xe7, 0xe4, 0xe6, 0xec, 0xf3, 0xfc, 0x0b, 0x1d, 0x2b, 0x32, 0x30, + 0x28, 0x22, 0x1d, 0x1a, 0x1a, 0x1b, 0x1d, 0x1a, 0x12, 0x02, 0xef, 0xe3, + 0xdf, 0xe0, 0xe0, 0xde, 0xdb, 0xdc, 0xde, 0xe2, 0xe6, 0xeb, 0xef, 0xf3, + 0xf7, 0xfc, 0x06, 0x14, 0x22, 0x29, 0x22, 0x14, 0x03, 0xfb, 0xf9, 0xfc, + 0x01, 0x07, 0x0c, 0x0e, 0x0b, 0x07, 0x01, 0x01, 0x02, 0x01, 0xff, 0xf9, + 0xf4, 0xf3, 0xf2, 0xee, 0xe8, 0xe5, 0xe5, 0xea, 0xf1, 0xfb, 0x08, 0x1a, + 0x29, 0x32, 0x33, 0x2b, 0x23, 0x1c, 0x18, 0x19, 0x1c, 0x1d, 0x1e, 0x16, + 0x0a, 0xfa, 0xed, 0xe5, 0xe2, 0xe2, 0xe1, 0xdf, 0xdd, 0xde, 0xe2, 0xe6, + 0xea, 0xef, 0xf3, 0xf7, 0xfc, 0x04, 0x10, 0x1e, 0x27, 0x27, 0x1b, 0x0b, + 0xfe, 0xf9, 0xfa, 0xff, 0x07, 0x0c, 0x0f, 0x0e, 0x09, 0x04, 0x01, 0x01, + 0x01, 0x00, 0xfb, 0xf7, 0xf4, 0xf3, 0xf1, 0xed, 0xe9, 0xe7, 0xe8, 0xee, + 0xf9, 0x04, 0x15, 0x25, 0x31, 0x34, 0x2e, 0x24, 0x1d, 0x18, 0x17, 0x1a, + 0x1c, 0x1c, 0x18, 0x0d, 0xfe, 0xf0, 0xe7, 0xe3, 0xe1, 0xe0, 0xdf, 0xde, + 0xdf, 0xe0, 0xe4, 0xe8, 0xec, 0xf0, 0xf3, 0xf9, 0xff, 0x0c, 0x19, 0x26, + 0x28, 0x20, 0x12, 0x04, 0xfd, 0xfc, 0xfe, 0x04, 0x0b, 0x0f, 0x0f, 0x0b, + 0x05, 0x01, 0x01, 0x01, 0x00, 0xff, 0xfa, 0xf6, 0xf4, 0xf3, 0xef, 0xeb, + 0xe8, 0xe8, 0xeb, 0xf3, 0xff, 0x0f, 0x21, 0x2f, 0x33, 0x30, 0x29, 0x1e, + 0x19, 0x17, 0x19, 0x1b, 0x1c, 0x18, 0x10, 0x03, 0xf5, 0xe9, 0xe3, 0xe1, + 0xe0, 0xde, 0xdd, 0xde, 0xe0, 0xe1, 0xe6, 0xea, 0xed, 0xf0, 0xf5, 0xfb, + 0x07, 0x15, 0x21, 0x28, 0x26, 0x19, 0x0a, 0xff, 0xfc, 0xfe, 0x04, 0x0b, + 0x0f, 0x10, 0x0d, 0x07, 0x03, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xf7, 0xf4, + 0xf2, 0xf1, 0xed, 0xeb, 0xe9, 0xea, 0xef, 0xfb, 0x09, 0x1a, 0x2b, 0x34, + 0x33, 0x2b, 0x21, 0x19, 0x16, 0x17, 0x1b, 0x1c, 0x1a, 0x11, 0x05, 0xf6, + 0xea, 0xe4, 0xe0, 0xdf, 0xde, 0xdd, 0xdd, 0xdf, 0xe2, 0xe5, 0xe8, 0xeb, + 0xed, 0xf1, 0xf8, 0x02, 0x10, 0x1d, 0x27, 0x28, 0x20, 0x11, 0x04, 0xfd, + 0xfd, 0x02, 0x0a, 0x0f, 0x11, 0x0e, 0x09, 0x04, 0xff, 0xfe, 0x00, 0x00, + 0xfd, 0xf9, 0xf5, 0xf4, 0xf3, 0xf0, 0xed, 0xea, 0xea, 0xee, 0xf7, 0x04, + 0x14, 0x26, 0x33, 0x35, 0x30, 0x25, 0x1a, 0x16, 0x16, 0x18, 0x1a, 0x19, + 0x12, 0x08, 0xfb, 0xee, 0xe5, 0xe0, 0xe0, 0xdf, 0xdd, 0xdd, 0xde, 0xe0, + 0xe3, 0xe7, 0xe9, 0xec, 0xee, 0xf4, 0xfd, 0x0b, 0x19, 0x26, 0x2b, 0x25, + 0x19, 0x09, 0x01, 0xfe, 0x02, 0x08, 0x0e, 0x11, 0x0f, 0x0b, 0x06, 0x00, + 0xff, 0xff, 0x00, 0xfe, 0xfc, 0xf8, 0xf5, 0xf3, 0xf2, 0xef, 0xec, 0xe9, + 0xec, 0xf3, 0xff, 0x0f, 0x21, 0x2e, 0x35, 0x32, 0x28, 0x1d, 0x17, 0x15, + 0x16, 0x19, 0x18, 0x15, 0x0c, 0xff, 0xf1, 0xe7, 0xe0, 0xdf, 0xdf, 0xdd, + 0xdd, 0xdd, 0xde, 0xe2, 0xe6, 0xe8, 0xe9, 0xec, 0xf1, 0xfa, 0x05, 0x15, + 0x21, 0x2a, 0x29, 0x20, 0x10, 0x05, 0x00, 0x02, 0x08, 0x0f, 0x11, 0x10, + 0x0c, 0x07, 0x01, 0xff, 0xfe, 0xff, 0xfe, 0xfc, 0xf9, 0xf5, 0xf5, 0xf3, + 0xf1, 0xed, 0xea, 0xea, 0xef, 0xfb, 0x09, 0x1b, 0x2b, 0x33, 0x33, 0x2c, + 0x21, 0x18, 0x15, 0x16, 0x18, 0x19, 0x14, 0x0d, 0x01, 0xf4, 0xe8, 0xe1, + 0xde, 0xdd, 0xde, 0xdd, 0xdd, 0xdf, 0xe2, 0xe4, 0xe7, 0xe9, 0xea, 0xee, + 0xf6, 0x01, 0x10, 0x1e, 0x28, 0x2a, 0x24, 0x16, 0x09, 0x02, 0x01, 0x05, + 0x0d, 0x11, 0x11, 0x0e, 0x08, 0x02, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfc, + 0xf8, 0xf5, 0xf5, 0xf3, 0xf0, 0xeb, 0xea, 0xed, 0xf7, 0x04, 0x16, 0x26, + 0x32, 0x35, 0x2f, 0x25, 0x1b, 0x15, 0x15, 0x17, 0x19, 0x16, 0x0e, 0x04, + 0xf7, 0xeb, 0xe2, 0xde, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xe4, 0xe6, + 0xe7, 0xe9, 0xeb, 0xf0, 0xfb, 0x0a, 0x18, 0x25, 0x2b, 0x27, 0x1c, 0x10, + 0x06, 0x02, 0x05, 0x0d, 0x12, 0x12, 0x0f, 0x09, 0x04, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xfa, 0xf5, 0xf5, 0xf4, 0xf2, 0xee, 0xec, 0xec, 0xf1, + 0x00, 0x10, 0x21, 0x2f, 0x35, 0x31, 0x28, 0x1e, 0x17, 0x13, 0x16, 0x18, + 0x17, 0x0f, 0x06, 0xfa, 0xee, 0xe4, 0xdf, 0xdd, 0xdd, 0xde, 0xdd, 0xdd, + 0xdf, 0xe1, 0xe4, 0xe7, 0xe7, 0xe9, 0xec, 0xf7, 0x04, 0x14, 0x22, 0x29, + 0x2b, 0x22, 0x16, 0x09, 0x05, 0x05, 0x0b, 0x11, 0x14, 0x11, 0x0c, 0x05, + 0x01, 0xfe, 0xfe, 0xfe, 0x00, 0xff, 0xfc, 0xf8, 0xf6, 0xf4, 0xf4, 0xf1, + 0xed, 0xec, 0xf1, 0xfd, 0x0a, 0x1c, 0x2c, 0x33, 0x34, 0x2b, 0x20, 0x17, + 0x14, 0x15, 0x17, 0x18, 0x12, 0x08, 0xfb, 0xef, 0xe6, 0xdf, 0xdd, 0xdd, + 0xdc, 0xdd, 0xdd, 0xde, 0xe1, 0xe2, 0xe5, 0xe5, 0xe6, 0xe8, 0xf1, 0xff, + 0x0d, 0x1d, 0x28, 0x2a, 0x25, 0x1b, 0x10, 0x09, 0x07, 0x0b, 0x11, 0x15, + 0x12, 0x0d, 0x07, 0x01, 0xfd, 0xfc, 0xfe, 0x00, 0x00, 0xfe, 0xfa, 0xf6, + 0xf6, 0xf4, 0xf3, 0xef, 0xec, 0xee, 0xf8, 0x07, 0x16, 0x27, 0x32, 0x34, + 0x2e, 0x25, 0x19, 0x14, 0x13, 0x15, 0x18, 0x13, 0x0a, 0xfe, 0xf2, 0xe8, + 0xe1, 0xdd, 0xdc, 0xdd, 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, 0xe3, 0xe5, 0xe4, + 0xe6, 0xec, 0xf9, 0x08, 0x17, 0x25, 0x2a, 0x28, 0x20, 0x15, 0x0c, 0x09, + 0x0b, 0x11, 0x16, 0x16, 0x10, 0x09, 0x02, 0xfe, 0xfc, 0xfd, 0xfe, 0xff, + 0xff, 0xfc, 0xf9, 0xf7, 0xf5, 0xf5, 0xf1, 0xee, 0xee, 0xf4, 0x00, 0x11, + 0x23, 0x30, 0x34, 0x30, 0x28, 0x1d, 0x14, 0x11, 0x14, 0x16, 0x16, 0x0d, + 0x02, 0xf5, 0xea, 0xe3, 0xdd, 0xdc, 0xdb, 0xdd, 0xdd, 0xdf, 0xdf, 0xe0, + 0xe1, 0xe4, 0xe3, 0xe3, 0xe8, 0xf3, 0x02, 0x13, 0x22, 0x2a, 0x2a, 0x25, + 0x1a, 0x0f, 0x0a, 0x0c, 0x10, 0x16, 0x17, 0x13, 0x0c, 0x05, 0xfe, 0xfd, + 0xfc, 0xfe, 0x00, 0x01, 0xfe, 0xfb, 0xf7, 0xf7, 0xf5, 0xf2, 0xef, 0xee, + 0xf2, 0xfd, 0x0c, 0x1e, 0x2d, 0x33, 0x32, 0x2a, 0x1f, 0x17, 0x12, 0x13, + 0x15, 0x15, 0x10, 0x05, 0xf8, 0xec, 0xe3, 0xdd, 0xdc, 0xdb, 0xda, 0xdd, + 0xdc, 0xde, 0xdf, 0xe1, 0xe1, 0xe2, 0xe3, 0xe6, 0xed, 0xfd, 0x0e, 0x1d, + 0x29, 0x2c, 0x27, 0x1d, 0x12, 0x0d, 0x0c, 0x10, 0x16, 0x18, 0x16, 0x0f, + 0x08, 0x01, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfa, 0xf8, 0xf6, + 0xf4, 0xf1, 0xee, 0xf0, 0xf9, 0x08, 0x18, 0x2a, 0x34, 0x34, 0x2c, 0x22, + 0x18, 0x14, 0x11, 0x14, 0x14, 0x11, 0x08, 0xfb, 0xef, 0xe5, 0xdf, 0xdc, + 0xda, 0xda, 0xdc, 0xdc, 0xde, 0xde, 0xe0, 0xdf, 0xe0, 0xe0, 0xe2, 0xe8, + 0xf4, 0x06, 0x17, 0x26, 0x2c, 0x2a, 0x23, 0x18, 0x11, 0x0d, 0x0f, 0x16, + 0x1a, 0x18, 0x12, 0x0a, 0x02, 0xfe, 0xfd, 0xfc, 0xfe, 0xff, 0xff, 0xfe, + 0xfb, 0xf8, 0xf9, 0xf6, 0xf2, 0xf2, 0xef, 0xf4, 0x01, 0x13, 0x25, 0x31, + 0x34, 0x2f, 0x25, 0x1b, 0x12, 0x0f, 0x11, 0x14, 0x13, 0x0b, 0xff, 0xf3, + 0xe7, 0xe0, 0xdd, 0xdc, 0xda, 0xdb, 0xdd, 0xdd, 0xde, 0xde, 0xdf, 0xde, + 0xdf, 0xe0, 0xe4, 0xee, 0xfe, 0x11, 0x22, 0x2b, 0x2c, 0x26, 0x1e, 0x14, + 0x11, 0x10, 0x15, 0x1b, 0x1c, 0x17, 0x0e, 0x05, 0xff, 0xfd, 0xfd, 0xfc, + 0xff, 0xff, 0xfe, 0xfc, 0xf9, 0xf9, 0xf7, 0xf6, 0xf2, 0xf0, 0xf3, 0xfd, + 0x0d, 0x1f, 0x2d, 0x35, 0x31, 0x28, 0x1e, 0x15, 0x0f, 0x10, 0x12, 0x12, + 0x0b, 0x03, 0xf6, 0xeb, 0xe3, 0xdd, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, + 0xdc, 0xdd, 0xdf, 0xdf, 0xde, 0xe0, 0xe8, 0xf9, 0x0a, 0x1d, 0x2a, 0x2e, + 0x2a, 0x21, 0x19, 0x12, 0x12, 0x15, 0x1a, 0x1d, 0x19, 0x11, 0x08, 0x01, + 0xfe, 0xfd, 0xfd, 0xff, 0x00, 0xff, 0xfd, 0xfb, 0xf9, 0xf9, 0xf6, 0xf3, + 0xf1, 0xf2, 0xfb, 0x0a, 0x19, 0x2a, 0x33, 0x33, 0x2b, 0x20, 0x16, 0x0f, + 0x0e, 0x10, 0x11, 0x0d, 0x07, 0xfb, 0xed, 0xe5, 0xdf, 0xdc, 0xdb, 0xdd, + 0xdd, 0xdc, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xe5, 0xf3, 0x03, + 0x15, 0x25, 0x2d, 0x2c, 0x25, 0x1c, 0x15, 0x12, 0x15, 0x19, 0x1c, 0x1c, + 0x15, 0x0c, 0x03, 0xff, 0xfe, 0xfd, 0x00, 0x01, 0x00, 0xff, 0xfc, 0xfa, + 0xfa, 0xf8, 0xf6, 0xf1, 0xf1, 0xf8, 0x04, 0x14, 0x26, 0x31, 0x35, 0x2e, + 0x23, 0x17, 0x0f, 0x0d, 0x10, 0x10, 0x0e, 0x08, 0xfe, 0xf2, 0xe8, 0xe1, + 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdc, 0xdd, 0xdc, 0xdc, 0xdb, 0xda, 0xdb, + 0xe1, 0xed, 0xff, 0x0f, 0x20, 0x2b, 0x2d, 0x28, 0x1f, 0x17, 0x13, 0x15, + 0x1a, 0x1d, 0x1e, 0x18, 0x10, 0x07, 0xff, 0xfe, 0xfe, 0x00, 0x01, 0x01, + 0xff, 0xfd, 0xfa, 0xfa, 0xf9, 0xf6, 0xf3, 0xf2, 0xf6, 0xfe, 0x0e, 0x20, + 0x2e, 0x33, 0x30, 0x27, 0x1a, 0x11, 0x0c, 0x0d, 0x0f, 0x0f, 0x0a, 0x01, + 0xf3, 0xe9, 0xe2, 0xdd, 0xdc, 0xdc, 0xdd, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, + 0xdb, 0xd9, 0xda, 0xdd, 0xe6, 0xf8, 0x09, 0x1c, 0x29, 0x2d, 0x2b, 0x22, + 0x19, 0x14, 0x15, 0x18, 0x1e, 0x20, 0x1b, 0x13, 0x0b, 0x03, 0xfe, 0xfe, + 0xfe, 0x01, 0x01, 0x01, 0xfe, 0xfb, 0xfb, 0xfb, 0xf7, 0xf4, 0xf2, 0xf4, + 0xfe, 0x0b, 0x1b, 0x2b, 0x34, 0x32, 0x2a, 0x1e, 0x12, 0x0c, 0x0b, 0x0c, + 0x0f, 0x0b, 0x05, 0xf7, 0xed, 0xe4, 0xdf, 0xdc, 0xde, 0xde, 0xdd, 0xdd, + 0xdc, 0xdb, 0xdb, 0xdb, 0xda, 0xd9, 0xda, 0xe2, 0xf0, 0x02, 0x15, 0x25, + 0x2d, 0x2c, 0x25, 0x1b, 0x15, 0x14, 0x17, 0x1c, 0x21, 0x1e, 0x17, 0x0f, + 0x06, 0x01, 0xfe, 0x00, 0x01, 0x02, 0x02, 0xff, 0xfc, 0xfb, 0xfa, 0xf8, + 0xf4, 0xf3, 0xf3, 0xfa, 0x05, 0x16, 0x28, 0x32, 0x33, 0x2e, 0x23, 0x16, + 0x0d, 0x0a, 0x0b, 0x0d, 0x0b, 0x04, 0xfc, 0xf1, 0xe6, 0xdf, 0xde, 0xde, + 0xdd, 0xdc, 0xdc, 0xdb, 0xda, 0xd9, 0xda, 0xd9, 0xd9, 0xd9, 0xde, 0xe9, + 0xfc, 0x0f, 0x1f, 0x2b, 0x2d, 0x28, 0x1f, 0x18, 0x14, 0x17, 0x1c, 0x21, + 0x20, 0x1b, 0x12, 0x0a, 0x03, 0x01, 0x00, 0x02, 0x02, 0x02, 0x01, 0xfc, + 0xfc, 0xfc, 0xf9, 0xf6, 0xf4, 0xf3, 0xf7, 0x02, 0x12, 0x22, 0x2f, 0x34, + 0x30, 0x25, 0x19, 0x10, 0x09, 0x09, 0x0b, 0x0b, 0x07, 0xff, 0xf3, 0xe9, + 0xe1, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdc, 0xda, 0xda, 0xda, 0xd9, 0xd9, + 0xd9, 0xdb, 0xe4, 0xf6, 0x08, 0x1a, 0x27, 0x2d, 0x29, 0x21, 0x19, 0x15, + 0x15, 0x19, 0x21, 0x23, 0x1d, 0x15, 0x0e, 0x07, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x01, 0xff, 0xfc, 0xfb, 0xf9, 0xf8, 0xf5, 0xf4, 0xf6, 0xff, 0x0d, + 0x1e, 0x2c, 0x34, 0x33, 0x2a, 0x1c, 0x11, 0x09, 0x06, 0x0a, 0x0b, 0x08, + 0x01, 0xf6, 0xea, 0xe3, 0xe0, 0xde, 0xdd, 0xdd, 0xdd, 0xdb, 0xda, 0xd9, + 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xe0, 0xf0, 0x01, 0x14, 0x23, 0x2b, 0x29, + 0x22, 0x1c, 0x15, 0x14, 0x18, 0x1e, 0x22, 0x20, 0x1b, 0x11, 0x0a, 0x05, + 0x04, 0x03, 0x03, 0x04, 0x03, 0xff, 0xfd, 0xfb, 0xfa, 0xf8, 0xf7, 0xf5, + 0xf5, 0xfd, 0x09, 0x18, 0x29, 0x34, 0x33, 0x2b, 0x20, 0x13, 0x0a, 0x06, + 0x06, 0x09, 0x07, 0x03, 0xf9, 0xee, 0xe5, 0xe3, 0xdf, 0xde, 0xdf, 0xdf, + 0xdc, 0xda, 0xd9, 0xd8, 0xd8, 0xd7, 0xd7, 0xd8, 0xde, 0xea, 0xfd, 0x0e, + 0x1f, 0x29, 0x2a, 0x25, 0x1d, 0x17, 0x14, 0x16, 0x1d, 0x21, 0x23, 0x1e, + 0x16, 0x0e, 0x08, 0x05, 0x05, 0x05, 0x04, 0x03, 0x01, 0xfd, 0xfc, 0xfa, + 0xf8, 0xf7, 0xf5, 0xf5, 0xfb, 0x04, 0x14, 0x24, 0x32, 0x35, 0x2f, 0x23, + 0x17, 0x0a, 0x05, 0x05, 0x08, 0x08, 0x04, 0xfd, 0xf2, 0xe8, 0xe2, 0xe0, + 0xe0, 0xdf, 0xdf, 0xdb, 0xda, 0xd9, 0xd8, 0xd7, 0xd8, 0xd8, 0xd8, 0xdb, + 0xe5, 0xf6, 0x08, 0x1b, 0x27, 0x2a, 0x27, 0x1f, 0x17, 0x14, 0x15, 0x1a, + 0x1f, 0x22, 0x20, 0x19, 0x11, 0x0c, 0x08, 0x07, 0x07, 0x07, 0x05, 0x02, + 0xfe, 0xfd, 0xf9, 0xf8, 0xf8, 0xf5, 0xf5, 0xfa, 0x01, 0x0f, 0x20, 0x2e, + 0x34, 0x30, 0x27, 0x19, 0x0d, 0x05, 0x03, 0x05, 0x07, 0x05, 0xff, 0xf3, + 0xe9, 0xe4, 0xe2, 0xe0, 0xe1, 0xe0, 0xdd, 0xdb, 0xd9, 0xd7, 0xd5, 0xd7, + 0xd7, 0xd7, 0xda, 0xe2, 0xf1, 0x02, 0x14, 0x23, 0x29, 0x26, 0x20, 0x18, + 0x13, 0x13, 0x18, 0x1d, 0x22, 0x22, 0x1d, 0x14, 0x0f, 0x0b, 0x08, 0x08, + 0x09, 0x07, 0x04, 0x00, 0xfe, 0xfa, 0xf8, 0xf6, 0xf5, 0xf6, 0xf9, 0xff, + 0x0c, 0x1b, 0x2b, 0x34, 0x34, 0x2a, 0x1d, 0x0f, 0x06, 0x02, 0x03, 0x06, + 0x05, 0x02, 0xf8, 0xee, 0xe6, 0xe1, 0xe0, 0xe1, 0xe0, 0xde, 0xdb, 0xda, + 0xd6, 0xd5, 0xd5, 0xd5, 0xd7, 0xd8, 0xde, 0xeb, 0xfe, 0x10, 0x20, 0x28, + 0x28, 0x21, 0x1a, 0x14, 0x12, 0x14, 0x1b, 0x21, 0x24, 0x20, 0x1a, 0x13, + 0x0e, 0x0b, 0x0a, 0x0a, 0x09, 0x06, 0x03, 0xff, 0xfa, 0xf8, 0xf7, 0xf6, + 0xf6, 0xf7, 0xfc, 0x06, 0x16, 0x27, 0x33, 0x34, 0x2d, 0x21, 0x12, 0x06, + 0x00, 0x00, 0x03, 0x06, 0x01, 0xfa, 0xf1, 0xe8, 0xe4, 0xe2, 0xe2, 0xe1, + 0xde, 0xdc, 0xd9, 0xd7, 0xd5, 0xd7, 0xd4, 0xd4, 0xd7, 0xdd, 0xe7, 0xf7, + 0x0a, 0x1a, 0x26, 0x27, 0x22, 0x1b, 0x14, 0x11, 0x12, 0x17, 0x1f, 0x23, + 0x22, 0x1d, 0x17, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x08, 0x03, 0xff, 0xfc, + 0xf9, 0xf6, 0xf5, 0xf5, 0xf6, 0xfa, 0x02, 0x12, 0x23, 0x31, 0x36, 0x32, + 0x24, 0x16, 0x08, 0x00, 0x00, 0x02, 0x04, 0x03, 0xfe, 0xf5, 0xeb, 0xe4, + 0xe3, 0xe3, 0xe2, 0xe0, 0xde, 0xda, 0xd8, 0xd7, 0xd5, 0xd5, 0xd5, 0xd7, + 0xda, 0xe2, 0xf1, 0x04, 0x16, 0x23, 0x29, 0x24, 0x1d, 0x14, 0x0f, 0x0f, + 0x14, 0x1b, 0x21, 0x22, 0x1f, 0x19, 0x13, 0x0f, 0x0f, 0x0e, 0x0c, 0x0a, + 0x06, 0x02, 0xfd, 0xfa, 0xf6, 0xf5, 0xf6, 0xf6, 0xfa, 0x00, 0x0c, 0x1f, + 0x2d, 0x36, 0x34, 0x29, 0x19, 0x0c, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, + 0xf8, 0xef, 0xe6, 0xe3, 0xe3, 0xe2, 0xe0, 0xdf, 0xdc, 0xd7, 0xd7, 0xd5, + 0xd4, 0xd4, 0xd7, 0xd8, 0xdf, 0xec, 0x00, 0x11, 0x21, 0x2a, 0x26, 0x1e, + 0x15, 0x0e, 0x0b, 0x0f, 0x18, 0x20, 0x23, 0x22, 0x1c, 0x16, 0x12, 0x10, + 0x10, 0x0f, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf8, 0xf6, 0xf5, 0xf6, 0xf7, + 0xfe, 0x08, 0x1a, 0x2a, 0x35, 0x36, 0x2d, 0x1e, 0x0f, 0x03, 0xff, 0x00, + 0x00, 0x02, 0x00, 0xfb, 0xf1, 0xe9, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdd, + 0xd9, 0xd7, 0xd5, 0xd4, 0xd4, 0xd6, 0xd7, 0xdc, 0xe8, 0xfa, 0x0b, 0x1c, + 0x27, 0x27, 0x20, 0x16, 0x0d, 0x09, 0x0b, 0x14, 0x1c, 0x21, 0x22, 0x1e, + 0x18, 0x15, 0x13, 0x12, 0x10, 0x0f, 0x0b, 0x05, 0x00, 0xfd, 0xfa, 0xf6, + 0xf5, 0xf5, 0xf6, 0xfb, 0x04, 0x14, 0x25, 0x33, 0x37, 0x30, 0x24, 0x15, + 0x06, 0xff, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf4, 0xeb, 0xe7, 0xe4, 0xe3, + 0xe3, 0xe2, 0xde, 0xda, 0xd6, 0xd5, 0xd3, 0xd3, 0xd3, 0xd6, 0xda, 0xe3, + 0xf3, 0x04, 0x17, 0x24, 0x28, 0x22, 0x1a, 0x10, 0x09, 0x0a, 0x10, 0x19, + 0x21, 0x23, 0x21, 0x1c, 0x17, 0x15, 0x15, 0x13, 0x12, 0x0f, 0x07, 0x01, + 0xfd, 0xfa, 0xf6, 0xf5, 0xf4, 0xf5, 0xf9, 0x01, 0x10, 0x22, 0x31, 0x37, + 0x34, 0x28, 0x18, 0x09, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xf7, 0xef, + 0xe9, 0xe7, 0xe5, 0xe4, 0xe4, 0xe1, 0xdc, 0xd8, 0xd5, 0xd2, 0xd2, 0xd3, + 0xd4, 0xd7, 0xdf, 0xed, 0x00, 0x12, 0x21, 0x28, 0x25, 0x1c, 0x10, 0x08, + 0x06, 0x0b, 0x14, 0x1c, 0x22, 0x21, 0x1d, 0x18, 0x15, 0x14, 0x15, 0x14, + 0x10, 0x0a, 0x03, 0x00, 0xfb, 0xf8, 0xf6, 0xf5, 0xf4, 0xf7, 0x00, 0x0b, + 0x1b, 0x2c, 0x36, 0x35, 0x2b, 0x1b, 0x0b, 0x00, 0xfc, 0xfd, 0x00, 0x00, + 0x00, 0xfb, 0xf4, 0xef, 0xea, 0xe8, 0xe7, 0xe6, 0xe3, 0xe0, 0xdc, 0xd7, + 0xd4, 0xd3, 0xd3, 0xd3, 0xd7, 0xde, 0xe9, 0xfa, 0x0b, 0x1c, 0x26, 0x26, + 0x1e, 0x12, 0x09, 0x04, 0x07, 0x0f, 0x18, 0x20, 0x21, 0x1e, 0x1b, 0x17, + 0x15, 0x15, 0x15, 0x12, 0x0d, 0x06, 0x00, 0xfd, 0xfa, 0xf7, 0xf5, 0xf4, + 0xf5, 0xfc, 0x05, 0x15, 0x27, 0x33, 0x36, 0x2f, 0x21, 0x0f, 0x00, 0xfc, + 0xfb, 0xfe, 0x00, 0x00, 0xfe, 0xf8, 0xf0, 0xeb, 0xe9, 0xe8, 0xe7, 0xe4, + 0xe2, 0xde, 0xd9, 0xd7, 0xd4, 0xd4, 0xd5, 0xd7, 0xdc, 0xe5, 0xf5, 0x05, + 0x17, 0x23, 0x27, 0x22, 0x15, 0x0a, 0x03, 0x04, 0x0b, 0x14, 0x1d, 0x21, + 0x20, 0x1c, 0x19, 0x17, 0x17, 0x16, 0x14, 0x0f, 0x0a, 0x02, 0xfd, 0xfa, + 0xf7, 0xf5, 0xf4, 0xf5, 0xfa, 0x01, 0x10, 0x21, 0x30, 0x35, 0x32, 0x24, + 0x15, 0x04, 0xfd, 0xfa, 0xfb, 0x00, 0x00, 0xff, 0xf9, 0xf3, 0xef, 0xeb, + 0xea, 0xe9, 0xe6, 0xe3, 0xe0, 0xda, 0xd8, 0xd5, 0xd5, 0xd4, 0xd7, 0xdb, + 0xe2, 0xef, 0x00, 0x12, 0x20, 0x26, 0x22, 0x19, 0x0c, 0x04, 0x02, 0x06, + 0x10, 0x19, 0x1f, 0x1f, 0x1d, 0x1a, 0x17, 0x17, 0x17, 0x15, 0x11, 0x0b, + 0x03, 0xff, 0xfa, 0xf7, 0xf5, 0xf5, 0xf5, 0xf9, 0x00, 0x0c, 0x1c, 0x2d, + 0x34, 0x34, 0x2a, 0x19, 0x09, 0xfe, 0xf8, 0xf9, 0xfd, 0x00, 0x01, 0xfb, + 0xf6, 0xf0, 0xed, 0xec, 0xea, 0xe8, 0xe5, 0xe1, 0xdd, 0xd9, 0xd8, 0xd6, + 0xd6, 0xd5, 0xd8, 0xde, 0xea, 0xfc, 0x0c, 0x1b, 0x24, 0x24, 0x1b, 0x10, + 0x05, 0x00, 0x03, 0x0b, 0x15, 0x1d, 0x20, 0x1e, 0x1b, 0x19, 0x17, 0x17, + 0x15, 0x14, 0x0e, 0x07, 0xff, 0xfb, 0xf9, 0xf6, 0xf5, 0xf5, 0xf6, 0xfc, + 0x07, 0x17, 0x27, 0x32, 0x35, 0x2d, 0x1e, 0x0d, 0x01, 0xf8, 0xf6, 0xfb, + 0x00, 0x01, 0xfe, 0xf8, 0xf2, 0xf0, 0xee, 0xed, 0xeb, 0xe9, 0xe4, 0xdf, + 0xdb, 0xd9, 0xd7, 0xd5, 0xd7, 0xd8, 0xdd, 0xe6, 0xf6, 0x06, 0x16, 0x23, + 0x25, 0x1e, 0x12, 0x06, 0x00, 0x00, 0x07, 0x11, 0x19, 0x1f, 0x1f, 0x1c, + 0x1a, 0x19, 0x17, 0x16, 0x14, 0x10, 0x09, 0x02, 0xff, 0xfa, 0xf5, 0xf5, + 0xf5, 0xf6, 0xfa, 0x01, 0x11, 0x20, 0x2e, 0x34, 0x30, 0x23, 0x13, 0x03, + 0xf9, 0xf6, 0xf8, 0xfd, 0x01, 0xff, 0xfc, 0xf4, 0xf1, 0xf0, 0xee, 0xed, + 0xea, 0xe6, 0xe2, 0xde, 0xda, 0xd8, 0xd7, 0xd8, 0xd9, 0xdd, 0xe3, 0xf0, + 0x00, 0x11, 0x1f, 0x24, 0x20, 0x14, 0x09, 0x00, 0x00, 0x02, 0x0c, 0x16, + 0x1b, 0x1e, 0x1c, 0x1a, 0x1a, 0x19, 0x17, 0x14, 0x10, 0x0b, 0x04, 0xfe, + 0xfb, 0xf8, 0xf4, 0xf5, 0xf5, 0xf9, 0xff, 0x0d, 0x1b, 0x2a, 0x34, 0x32, + 0x27, 0x17, 0x07, 0xfc, 0xf5, 0xf7, 0xfb, 0x00, 0x02, 0xfe, 0xf8, 0xf3, + 0xf1, 0xf0, 0xee, 0xec, 0xe9, 0xe4, 0xdf, 0xdb, 0xd8, 0xd8, 0xd9, 0xda, + 0xdc, 0xe1, 0xec, 0xfd, 0x0b, 0x1b, 0x23, 0x22, 0x18, 0x0c, 0x00, 0xfe, + 0xff, 0x08, 0x11, 0x1a, 0x1e, 0x1c, 0x1b, 0x19, 0x19, 0x18, 0x17, 0x13, + 0x0c, 0x05, 0xff, 0xfc, 0xf8, 0xf5, 0xf4, 0xf5, 0xf9, 0xff, 0x0a, 0x17, + 0x27, 0x31, 0x33, 0x2b, 0x1c, 0x0b, 0xfe, 0xf6, 0xf5, 0xf8, 0xfe, 0x01, + 0xff, 0xf9, 0xf5, 0xf1, 0xf1, 0xf0, 0xee, 0xeb, 0xe6, 0xe1, 0xdf, 0xdb, + 0xda, 0xda, 0xdb, 0xdc, 0xe0, 0xea, 0xf8, 0x08, 0x16, 0x21, 0x22, 0x18, + 0x0e, 0x02, 0xfe, 0xff, 0x04, 0x0c, 0x16, 0x1d, 0x1e, 0x1c, 0x1a, 0x18, + 0x18, 0x16, 0x14, 0x0f, 0x09, 0x01, 0xfc, 0xf9, 0xf6, 0xf5, 0xf5, 0xf8, + 0xfe, 0x05, 0x11, 0x21, 0x2e, 0x34, 0x2e, 0x21, 0x10, 0x02, 0xf7, 0xf5, + 0xf7, 0xfc, 0x00, 0xff, 0xfa, 0xf7, 0xf4, 0xf1, 0xf1, 0xf0, 0xee, 0xe8, + 0xe3, 0xe0, 0xdc, 0xdc, 0xdb, 0xdb, 0xde, 0xe1, 0xe9, 0xf5, 0x03, 0x13, + 0x1e, 0x21, 0x1c, 0x11, 0x04, 0xfe, 0xfc, 0xff, 0x08, 0x12, 0x1a, 0x1b, + 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x15, 0x10, 0x0a, 0x03, 0xfe, 0xf9, 0xf7, + 0xf6, 0xf6, 0xf6, 0xfc, 0x02, 0x0e, 0x1d, 0x2b, 0x31, 0x31, 0x27, 0x15, + 0x04, 0xf9, 0xf5, 0xf6, 0xfa, 0xfe, 0x00, 0xfe, 0xf9, 0xf4, 0xf1, 0xf1, + 0xf1, 0xef, 0xea, 0xe6, 0xe2, 0xde, 0xdc, 0xdd, 0xdd, 0xde, 0xe1, 0xe7, + 0xf1, 0x00, 0x0e, 0x1a, 0x21, 0x1d, 0x13, 0x05, 0xfd, 0xfa, 0xfc, 0x03, + 0x0f, 0x18, 0x1b, 0x1d, 0x1b, 0x19, 0x18, 0x18, 0x16, 0x12, 0x0d, 0x06, + 0xfe, 0xfa, 0xf8, 0xf6, 0xf6, 0xf6, 0xf9, 0xff, 0x09, 0x18, 0x26, 0x30, + 0x33, 0x2a, 0x1a, 0x08, 0xfc, 0xf3, 0xf3, 0xf8, 0xfe, 0x00, 0xff, 0xfb, + 0xf6, 0xf3, 0xf2, 0xf1, 0xef, 0xec, 0xe9, 0xe3, 0xe0, 0xdf, 0xde, 0xdf, + 0xe0, 0xe2, 0xe6, 0xee, 0xfc, 0x09, 0x17, 0x1e, 0x1f, 0x16, 0x09, 0x00, + 0xf9, 0xf9, 0xff, 0x0c, 0x15, 0x1a, 0x1d, 0x1d, 0x1a, 0x18, 0x18, 0x16, + 0x12, 0x0e, 0x07, 0x00, 0xfb, 0xf8, 0xf6, 0xf6, 0xf8, 0xf9, 0xfe, 0x06, + 0x15, 0x23, 0x2d, 0x32, 0x2d, 0x1f, 0x0d, 0xff, 0xf6, 0xf2, 0xf6, 0xfd, + 0x00, 0x00, 0xfd, 0xf9, 0xf4, 0xf3, 0xf2, 0xef, 0xec, 0xea, 0xe5, 0xe1, + 0xdf, 0xde, 0xdf, 0xe1, 0xe3, 0xe5, 0xec, 0xf8, 0x06, 0x13, 0x1d, 0x20, + 0x19, 0x0d, 0x01, 0xfa, 0xf7, 0xfd, 0x05, 0x11, 0x19, 0x1c, 0x1c, 0x1a, + 0x19, 0x19, 0x17, 0x13, 0x0f, 0x0a, 0x02, 0xfd, 0xf8, 0xf7, 0xf6, 0xf7, + 0xf9, 0xfc, 0x03, 0x10, 0x1d, 0x2a, 0x32, 0x2e, 0x23, 0x12, 0x03, 0xf7, + 0xf2, 0xf3, 0xfa, 0xff, 0x01, 0xfe, 0xfa, 0xf5, 0xf3, 0xf2, 0xf1, 0xed, + 0xec, 0xe8, 0xe4, 0xe1, 0xdf, 0xdf, 0xe1, 0xe5, 0xe6, 0xeb, 0xf4, 0x00, + 0x0e, 0x1b, 0x1f, 0x1c, 0x10, 0x02, 0xfa, 0xf6, 0xf8, 0x01, 0x0d, 0x17, + 0x1c, 0x1c, 0x1a, 0x19, 0x18, 0x18, 0x13, 0x11, 0x0b, 0x04, 0xfd, 0xfa, + 0xf7, 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x0b, 0x19, 0x26, 0x30, 0x31, 0x27, + 0x17, 0x08, 0xfb, 0xf3, 0xf4, 0xf8, 0xfe, 0x01, 0x00, 0xfb, 0xf8, 0xf4, + 0xf2, 0xf1, 0xef, 0xee, 0xea, 0xe7, 0xe3, 0xe2, 0xe1, 0xe2, 0xe4, 0xe6, + 0xea, 0xf2, 0xfe, 0x09, 0x16, 0x1e, 0x1c, 0x13, 0x06, 0xfb, 0xf5, 0xf5, + 0xfd, 0x08, 0x13, 0x1c, 0x1c, 0x1c, 0x1a, 0x19, 0x17, 0x15, 0x11, 0x0c, + 0x05, 0xfe, 0xfa, 0xf8, 0xf6, 0xf6, 0xf9, 0xf9, 0xfe, 0x07, 0x14, 0x22, + 0x2f, 0x32, 0x2b, 0x1e, 0x0d, 0xfe, 0xf5, 0xf2, 0xf6, 0xfc, 0x01, 0x02, + 0xff, 0xf9, 0xf5, 0xf2, 0xf1, 0xf0, 0xee, 0xeb, 0xe8, 0xe5, 0xe3, 0xe3, + 0xe4, 0xe5, 0xe8, 0xea, 0xf0, 0xfb, 0x05, 0x12, 0x1c, 0x1c, 0x15, 0x08, + 0xfd, 0xf6, 0xf4, 0xf9, 0x02, 0x10, 0x1a, 0x1d, 0x1d, 0x1b, 0x19, 0x18, + 0x16, 0x13, 0x0e, 0x06, 0x00, 0xfc, 0xf7, 0xf5, 0xf6, 0xf7, 0xf9, 0xfd, + 0x03, 0x0f, 0x1e, 0x2b, 0x31, 0x2e, 0x22, 0x13, 0x03, 0xf7, 0xf2, 0xf4, + 0xf9, 0xff, 0x01, 0xff, 0xfb, 0xf8, 0xf4, 0xf2, 0xf1, 0xef, 0xec, 0xe9, + 0xe6, 0xe5, 0xe3, 0xe5, 0xe6, 0xe7, 0xeb, 0xf0, 0xf7, 0x00, 0x0d, 0x18, + 0x1c, 0x18, 0x0e, 0x00, 0xf7, 0xf2, 0xf4, 0xfd, 0x0b, 0x18, 0x1c, 0x1d, + 0x1c, 0x1b, 0x18, 0x17, 0x13, 0x10, 0x09, 0x02, 0xfd, 0xf9, 0xf5, 0xf5, + 0xf7, 0xf9, 0xfb, 0x00, 0x09, 0x18, 0x28, 0x31, 0x32, 0x28, 0x18, 0x06, + 0xf9, 0xf2, 0xf3, 0xf7, 0xfe, 0x01, 0x00, 0xfd, 0xfa, 0xf5, 0xf3, 0xf1, + 0xef, 0xee, 0xeb, 0xe9, 0xe6, 0xe5, 0xe5, 0xe6, 0xe8, 0xe9, 0xed, 0xf5, + 0x00, 0x0a, 0x15, 0x1b, 0x19, 0x0f, 0x03, 0xf7, 0xf1, 0xf3, 0xfa, 0x06, + 0x12, 0x1b, 0x1e, 0x1d, 0x1b, 0x18, 0x16, 0x16, 0x11, 0x0a, 0x03, 0xfd, + 0xf9, 0xf5, 0xf5, 0xf6, 0xf8, 0xfa, 0xfe, 0x06, 0x13, 0x22, 0x2e, 0x32, + 0x2a, 0x1e, 0x0a, 0xfe, 0xf3, 0xf2, 0xf6, 0xfd, 0x01, 0x01, 0xff, 0xfc, + 0xf6, 0xf4, 0xf2, 0xef, 0xee, 0xec, 0xe9, 0xe7, 0xe6, 0xe6, 0xe7, 0xe9, + 0xea, 0xed, 0xf2, 0xfc, 0x05, 0x12, 0x1a, 0x1a, 0x13, 0x07, 0xfa, 0xf2, + 0xf0, 0xf7, 0x00, 0x0f, 0x19, 0x1d, 0x1e, 0x1c, 0x1a, 0x17, 0x14, 0x11, + 0x0b, 0x06, 0xff, 0xf9, 0xf6, 0xf5, 0xf6, 0xf6, 0xfa, 0xfd, 0x03, 0x0f, + 0x1d, 0x29, 0x30, 0x2e, 0x23, 0x12, 0x01, 0xf5, 0xf1, 0xf4, 0xfb, 0x01, + 0x02, 0x01, 0xfc, 0xf8, 0xf5, 0xf2, 0xf0, 0xef, 0xec, 0xea, 0xe7, 0xe6, + 0xe7, 0xe8, 0xe8, 0xea, 0xec, 0xf1, 0xf7, 0x03, 0x0e, 0x18, 0x1c, 0x16, + 0x0a, 0xfe, 0xf4, 0xf0, 0xf3, 0xfc, 0x09, 0x16, 0x1b, 0x20, 0x1c, 0x1b, + 0x17, 0x15, 0x12, 0x0e, 0x07, 0x01, 0xfb, 0xf7, 0xf5, 0xf6, 0xf6, 0xf9, + 0xfc, 0x01, 0x0a, 0x18, 0x25, 0x2f, 0x31, 0x28, 0x17, 0x06, 0xf9, 0xf2, + 0xf3, 0xf8, 0xff, 0x02, 0x02, 0xfe, 0xfa, 0xf5, 0xf3, 0xf1, 0xf0, 0xee, + 0xec, 0xe8, 0xe7, 0xe7, 0xe8, 0xea, 0xec, 0xec, 0xef, 0xf5, 0x00, 0x0a, + 0x15, 0x1b, 0x18, 0x0d, 0x01, 0xf6, 0xf0, 0xf1, 0xf9, 0x06, 0x12, 0x1b, + 0x1e, 0x1e, 0x1b, 0x1a, 0x16, 0x11, 0x0d, 0x09, 0x02, 0xfd, 0xf9, 0xf5, + 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x07, 0x13, 0x21, 0x2e, 0x31, 0x2b, 0x1e, + 0x0d, 0xfd, 0xf2, 0xf2, 0xf6, 0xfd, 0x02, 0x03, 0x00, 0xfb, 0xf6, 0xf3, + 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe7, 0xe8, 0xeb, 0xed, 0xed, 0xef, + 0xf4, 0xfd, 0x08, 0x12, 0x19, 0x1a, 0x11, 0x05, 0xfa, 0xf1, 0xef, 0xf6, + 0x00, 0x0e, 0x19, 0x1e, 0x1f, 0x1c, 0x1a, 0x17, 0x12, 0x0f, 0x09, 0x04, + 0xfd, 0xfa, 0xf6, 0xf5, 0xf6, 0xf9, 0xfb, 0xff, 0x04, 0x10, 0x1d, 0x29, + 0x30, 0x2e, 0x22, 0x12, 0x02, 0xf4, 0xf0, 0xf4, 0xfa, 0x00, 0x04, 0x02, + 0xfd, 0xf8, 0xf5, 0xf3, 0xf2, 0xf0, 0xed, 0xea, 0xe8, 0xe8, 0xe9, 0xea, + 0xec, 0xed, 0xee, 0xf2, 0xfb, 0x02, 0x0e, 0x18, 0x1b, 0x15, 0x0a, 0xfe, + 0xf3, 0xf0, 0xf3, 0xfb, 0x09, 0x15, 0x1c, 0x1e, 0x1c, 0x1a, 0x17, 0x14, + 0x0f, 0x0b, 0x05, 0xfe, 0xfa, 0xf6, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x02, + 0x0c, 0x17, 0x25, 0x2e, 0x2f, 0x26, 0x18, 0x05, 0xf9, 0xf2, 0xf3, 0xf7, + 0xff, 0x02, 0x03, 0xfe, 0xf9, 0xf5, 0xf3, 0xf2, 0xf2, 0xef, 0xeb, 0xea, + 0xe9, 0xe9, 0xeb, 0xed, 0xee, 0xf0, 0xf2, 0xf7, 0x00, 0x0b, 0x15, 0x1a, + 0x17, 0x0d, 0x01, 0xf4, 0xf0, 0xf1, 0xfb, 0x05, 0x13, 0x1a, 0x1d, 0x1d, + 0x1b, 0x19, 0x15, 0x11, 0x0c, 0x06, 0x00, 0xfd, 0xf7, 0xf4, 0xf4, 0xf6, + 0xf9, 0xfb, 0xff, 0x07, 0x12, 0x21, 0x2c, 0x30, 0x29, 0x1d, 0x0b, 0xfc, + 0xf3, 0xf2, 0xf5, 0xfc, 0x02, 0x03, 0x00, 0xfc, 0xf7, 0xf3, 0xf2, 0xf2, + 0xf0, 0xed, 0xea, 0xe9, 0xe9, 0xea, 0xee, 0xef, 0xf0, 0xf2, 0xf6, 0xfd, + 0x06, 0x12, 0x19, 0x1a, 0x12, 0x06, 0xf9, 0xf2, 0xf0, 0xf6, 0x00, 0x0d, + 0x18, 0x1d, 0x1d, 0x1c, 0x19, 0x15, 0x11, 0x0e, 0x08, 0x02, 0xfd, 0xf8, + 0xf5, 0xf4, 0xf5, 0xf7, 0xfa, 0xff, 0x04, 0x0e, 0x1b, 0x28, 0x2f, 0x2d, + 0x23, 0x10, 0x02, 0xf5, 0xf1, 0xf5, 0xf9, 0x01, 0x04, 0x01, 0xfd, 0xf7, + 0xf3, 0xf2, 0xf2, 0xf0, 0xed, 0xeb, 0xea, 0xe9, 0xeb, 0xed, 0xf0, 0xf1, + 0xf2, 0xf4, 0xfb, 0x03, 0x0f, 0x18, 0x19, 0x15, 0x09, 0xfc, 0xf3, 0xef, + 0xf2, 0xfc, 0x09, 0x15, 0x1c, 0x1d, 0x1c, 0x19, 0x16, 0x13, 0x0f, 0x0a, + 0x03, 0xfd, 0xf9, 0xf5, 0xf4, 0xf4, 0xf6, 0xf9, 0xfd, 0x01, 0x0a, 0x17, + 0x24, 0x2e, 0x2e, 0x26, 0x17, 0x05, 0xf9, 0xf3, 0xf2, 0xf8, 0xff, 0x03, + 0x02, 0xfe, 0xf9, 0xf5, 0xf3, 0xf3, 0xf2, 0xef, 0xed, 0xeb, 0xea, 0xea, + 0xed, 0xf0, 0xf1, 0xf2, 0xf4, 0xf9, 0x00, 0x0a, 0x14, 0x1a, 0x18, 0x0e, + 0x01, 0xf5, 0xf0, 0xf1, 0xf9, 0x05, 0x12, 0x1a, 0x1d, 0x1c, 0x1a, 0x17, + 0x14, 0x10, 0x0c, 0x05, 0xff, 0xfb, 0xf7, 0xf5, 0xf5, 0xf5, 0xf6, 0xfb, + 0xff, 0x06, 0x12, 0x20, 0x2a, 0x2f, 0x2a, 0x1c, 0x0c, 0xff, 0xf5, 0xf3, + 0xf6, 0xfc, 0x02, 0x03, 0x00, 0xfb, 0xf6, 0xf2, 0xf2, 0xf2, 0xf1, 0xee, + 0xec, 0xeb, 0xea, 0xee, 0xef, 0xf2, 0xf4, 0xf4, 0xf6, 0xfe, 0x06, 0x12, + 0x19, 0x1a, 0x11, 0x05, 0xf8, 0xf0, 0xef, 0xf5, 0x01, 0x0e, 0x17, 0x1d, + 0x1e, 0x1a, 0x17, 0x15, 0x11, 0x0e, 0x07, 0x01, 0xfc, 0xf8, 0xf4, 0xf4, + 0xf4, 0xf6, 0xf8, 0xfd, 0x02, 0x0d, 0x1b, 0x27, 0x2f, 0x2d, 0x22, 0x12, + 0x04, 0xf7, 0xf3, 0xf4, 0xf9, 0xff, 0x03, 0x02, 0xfd, 0xf6, 0xf3, 0xf2, + 0xf1, 0xf1, 0xf0, 0xee, 0xed, 0xec, 0xed, 0xef, 0xf1, 0xf4, 0xf4, 0xf6, + 0xfc, 0x02, 0x0d, 0x16, 0x1a, 0x14, 0x08, 0xfc, 0xf3, 0xf0, 0xf2, 0xfc, + 0x0a, 0x15, 0x1b, 0x1e, 0x1b, 0x18, 0x15, 0x12, 0x0e, 0x09, 0x03, 0xfc, + 0xf7, 0xf4, 0xf4, 0xf4, 0xf6, 0xf6, 0xfb, 0xff, 0x09, 0x16, 0x23, 0x2d, + 0x2f, 0x27, 0x17, 0x08, 0xfb, 0xf5, 0xf4, 0xf8, 0xfe, 0x01, 0x02, 0xfd, + 0xf8, 0xf4, 0xf2, 0xf1, 0xf1, 0xf1, 0xf0, 0xed, 0xee, 0xee, 0xef, 0xf1, + 0xf3, 0xf4, 0xf5, 0xfa, 0x01, 0x0a, 0x13, 0x1a, 0x17, 0x0d, 0x02, 0xf5, + 0xf0, 0xf1, 0xf9, 0x05, 0x12, 0x19, 0x1d, 0x1b, 0x19, 0x15, 0x13, 0x10, + 0x0b, 0x05, 0xff, 0xf9, 0xf7, 0xf4, 0xf3, 0xf4, 0xf6, 0xf8, 0xfd, 0x04, + 0x0f, 0x1e, 0x2a, 0x2f, 0x2a, 0x1d, 0x0c, 0xff, 0xf5, 0xf4, 0xf8, 0xfb, + 0x01, 0x02, 0xff, 0xfa, 0xf4, 0xf2, 0xf1, 0xf1, 0xf1, 0xef, 0xed, 0xed, + 0xed, 0xef, 0xf2, 0xf4, 0xf4, 0xf4, 0xf8, 0xfe, 0x06, 0x11, 0x19, 0x1a, + 0x12, 0x07, 0xfa, 0xf2, 0xf0, 0xf7, 0x00, 0x0d, 0x18, 0x1c, 0x1d, 0x1a, + 0x18, 0x13, 0x11, 0x0e, 0x07, 0x01, 0xfc, 0xf7, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf7, 0xfb, 0x00, 0x0b, 0x18, 0x26, 0x2e, 0x2c, 0x22, 0x12, 0x03, 0xf8, + 0xf5, 0xf6, 0xfa, 0x00, 0x01, 0x00, 0xfb, 0xf7, 0xf3, 0xf2, 0xf2, 0xf1, + 0xef, 0xee, 0xee, 0xed, 0xf0, 0xf1, 0xf3, 0xf5, 0xf5, 0xf7, 0xfa, 0x03, + 0x0d, 0x16, 0x1b, 0x15, 0x0c, 0xff, 0xf4, 0xf0, 0xf3, 0xfc, 0x09, 0x16, + 0x1c, 0x1d, 0x1b, 0x18, 0x15, 0x12, 0x0f, 0x09, 0x04, 0xfc, 0xf8, 0xf3, + 0xf3, 0xf2, 0xf3, 0xf5, 0xf7, 0xfd, 0x04, 0x12, 0x22, 0x2c, 0x2e, 0x28, + 0x1a, 0x09, 0xfd, 0xf6, 0xf5, 0xfa, 0xff, 0x02, 0x00, 0xfe, 0xf8, 0xf3, + 0xf2, 0xf0, 0xf1, 0xef, 0xee, 0xee, 0xed, 0xee, 0xf0, 0xf3, 0xf4, 0xf5, + 0xf6, 0xf9, 0x01, 0x09, 0x14, 0x19, 0x18, 0x0f, 0x04, 0xf8, 0xf1, 0xf2, + 0xf9, 0x04, 0x11, 0x19, 0x1c, 0x1b, 0x19, 0x15, 0x12, 0x0f, 0x0b, 0x05, + 0xfe, 0xfa, 0xf6, 0xf2, 0xf3, 0xf3, 0xf4, 0xf6, 0xfa, 0x00, 0x0d, 0x1b, + 0x28, 0x2f, 0x2b, 0x1e, 0x0f, 0x01, 0xf8, 0xf6, 0xf8, 0xfe, 0x02, 0x03, + 0xff, 0xfb, 0xf5, 0xf1, 0xf1, 0xf0, 0xf0, 0xee, 0xef, 0xee, 0xee, 0xf1, + 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xfe, 0x06, 0x11, 0x19, 0x1a, 0x13, 0x08, + 0xfb, 0xf2, 0xf0, 0xf7, 0x00, 0x0c, 0x17, 0x1b, 0x1d, 0x1a, 0x17, 0x14, + 0x11, 0x0d, 0x07, 0x01, 0xfc, 0xf7, 0xf3, 0xf3, 0xf2, 0xf2, 0xf4, 0xf7, + 0xfe, 0x07, 0x15, 0x24, 0x2d, 0x2d, 0x24, 0x14, 0x06, 0xfa, 0xf6, 0xf8, + 0xfd, 0x01, 0x02, 0x00, 0xfb, 0xf6, 0xf2, 0xf1, 0xf1, 0xf0, 0xef, 0xee, + 0xee, 0xef, 0xf1, 0xf2, 0xf4, 0xf5, 0xf5, 0xf7, 0xfb, 0x03, 0x0e, 0x17, + 0x1b, 0x16, 0x0c, 0xff, 0xf5, 0xf0, 0xf4, 0xfb, 0x09, 0x14, 0x19, 0x1c, + 0x1b, 0x18, 0x14, 0x12, 0x0e, 0x0a, 0x05, 0xfd, 0xf9, 0xf4, 0xf2, 0xf2, + 0xf1, 0xf2, 0xf5, 0xfa, 0x01, 0x0f, 0x1d, 0x29, 0x2e, 0x28, 0x1b, 0x0b, + 0xff, 0xf8, 0xf7, 0xfc, 0x00, 0x03, 0x02, 0xfd, 0xf7, 0xf3, 0xf2, 0xf0, + 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xf0, 0xf3, 0xf4, 0xf5, 0xf6, 0xf6, 0xfa, + 0x02, 0x0a, 0x15, 0x1b, 0x19, 0x10, 0x05, 0xf8, 0xf2, 0xf2, 0xf8, 0x03, + 0x0f, 0x17, 0x1c, 0x1c, 0x19, 0x15, 0x13, 0x0f, 0x0b, 0x06, 0x00, 0xfb, + 0xf6, 0xf3, 0xf1, 0xf0, 0xf1, 0xf2, 0xf6, 0xff, 0x09, 0x18, 0x26, 0x2d, + 0x2b, 0x20, 0x10, 0x04, 0xf9, 0xf7, 0xfb, 0xff, 0x03, 0x03, 0x00, 0xfa, + 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xef, 0xf0, 0xf3, 0xf4, + 0xf5, 0xf5, 0xf7, 0xfe, 0x06, 0x11, 0x19, 0x1b, 0x15, 0x09, 0xfc, 0xf3, + 0xf0, 0xf6, 0xff, 0x0b, 0x16, 0x1a, 0x1b, 0x19, 0x17, 0x14, 0x11, 0x0e, + 0x09, 0x02, 0xfc, 0xf7, 0xf4, 0xf1, 0xf0, 0xf0, 0xf1, 0xf3, 0xfb, 0x03, + 0x11, 0x20, 0x2a, 0x2c, 0x24, 0x17, 0x08, 0xfc, 0xf8, 0xfa, 0xff, 0x02, + 0x04, 0x02, 0xfc, 0xf7, 0xf4, 0xf1, 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xef, + 0xf0, 0xf1, 0xf3, 0xf5, 0xf5, 0xf7, 0xfb, 0x03, 0x0e, 0x18, 0x1c, 0x18, + 0x0c, 0x01, 0xf6, 0xf0, 0xf3, 0xfb, 0x07, 0x13, 0x19, 0x1c, 0x19, 0x18, + 0x15, 0x13, 0x0f, 0x0b, 0x06, 0xff, 0xfa, 0xf6, 0xf2, 0xf2, 0xf0, 0xf0, + 0xf1, 0xf5, 0xff, 0x0c, 0x1b, 0x28, 0x2c, 0x27, 0x1b, 0x0c, 0x00, 0xf9, + 0xf9, 0xfd, 0x01, 0x04, 0x03, 0xfe, 0xf9, 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, + 0xee, 0xee, 0xef, 0xef, 0xf3, 0xf4, 0xf5, 0xf5, 0xf6, 0xf9, 0x01, 0x0a, + 0x15, 0x1c, 0x1b, 0x13, 0x06, 0xf9, 0xf2, 0xf2, 0xf7, 0x02, 0x0e, 0x17, + 0x1c, 0x1a, 0x19, 0x16, 0x13, 0x10, 0x0d, 0x07, 0x02, 0xfc, 0xf7, 0xf3, + 0xf2, 0xf0, 0xf0, 0xf0, 0xf5, 0xfc, 0x05, 0x14, 0x23, 0x2a, 0x29, 0x20, + 0x11, 0x04, 0xfb, 0xfa, 0xfc, 0x01, 0x04, 0x05, 0x01, 0xfb, 0xf6, 0xf2, + 0xf0, 0xf2, 0xf0, 0xed, 0xed, 0xed, 0xef, 0xf0, 0xf3, 0xf4, 0xf5, 0xf5, + 0xf7, 0xfd, 0x06, 0x12, 0x1b, 0x1d, 0x16, 0x0b, 0xfd, 0xf5, 0xf1, 0xf6, + 0xfe, 0x0b, 0x14, 0x19, 0x1a, 0x18, 0x16, 0x14, 0x11, 0x0f, 0x0a, 0x04, + 0xfe, 0xfa, 0xf6, 0xf3, 0xf2, 0xf0, 0xef, 0xf2, 0xf8, 0x01, 0x0f, 0x1d, + 0x27, 0x29, 0x24, 0x17, 0x08, 0xfe, 0xf9, 0xfa, 0xff, 0x03, 0x05, 0x04, + 0xfd, 0xf7, 0xf3, 0xf1, 0xf0, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xee, 0xf1, + 0xf3, 0xf4, 0xf4, 0xf7, 0xfc, 0x03, 0x0f, 0x1a, 0x1d, 0x19, 0x0f, 0x03, + 0xf8, 0xf3, 0xf4, 0xfa, 0x07, 0x12, 0x17, 0x19, 0x19, 0x17, 0x14, 0x13, + 0x10, 0x0c, 0x06, 0x01, 0xfd, 0xf8, 0xf4, 0xf3, 0xf1, 0xf0, 0xf0, 0xf4, + 0xfd, 0x09, 0x18, 0x24, 0x29, 0x26, 0x1a, 0x0d, 0x01, 0xfa, 0xfa, 0xfe, + 0x03, 0x05, 0x06, 0x00, 0xfa, 0xf6, 0xf3, 0xf2, 0xf1, 0xef, 0xef, 0xec, + 0xec, 0xed, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf9, 0x01, 0x0c, 0x16, 0x1d, + 0x1d, 0x14, 0x09, 0xfb, 0xf4, 0xf4, 0xf7, 0x01, 0x0d, 0x15, 0x18, 0x18, + 0x16, 0x14, 0x13, 0x11, 0x0d, 0x08, 0x04, 0xff, 0xfa, 0xf7, 0xf4, 0xf2, + 0xef, 0xf0, 0xf1, 0xf8, 0x03, 0x11, 0x1f, 0x27, 0x26, 0x1d, 0x10, 0x04, + 0xfc, 0xfa, 0xfd, 0x02, 0x06, 0x06, 0x03, 0xfd, 0xf7, 0xf3, 0xf2, 0xf0, + 0xef, 0xee, 0xec, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf3, 0xf5, 0xf7, 0xfe, + 0x07, 0x14, 0x1c, 0x1f, 0x1a, 0x0e, 0x00, 0xf8, 0xf2, 0xf5, 0xff, 0x0a, + 0x13, 0x16, 0x18, 0x16, 0x14, 0x13, 0x12, 0x0f, 0x0c, 0x07, 0x00, 0xfd, + 0xf9, 0xf4, 0xf2, 0xf0, 0xee, 0xef, 0xf4, 0xfe, 0x0c, 0x1a, 0x25, 0x26, + 0x21, 0x14, 0x08, 0xfe, 0xf9, 0xfc, 0x01, 0x04, 0x06, 0x06, 0x01, 0xf9, + 0xf6, 0xf2, 0xf1, 0xf0, 0xef, 0xed, 0xeb, 0xec, 0xed, 0xee, 0xf0, 0xf2, + 0xf3, 0xf5, 0xfc, 0x03, 0x10, 0x1a, 0x20, 0x1d, 0x13, 0x06, 0xf9, 0xf5, + 0xf6, 0xfc, 0x07, 0x10, 0x16, 0x17, 0x16, 0x14, 0x12, 0x11, 0x10, 0x0e, + 0x09, 0x03, 0xff, 0xfa, 0xf8, 0xf4, 0xf2, 0xef, 0xee, 0xf2, 0xfb, 0x06, + 0x14, 0x20, 0x25, 0x21, 0x17, 0x0c, 0x00, 0xfb, 0xfa, 0x00, 0x04, 0x06, + 0x06, 0x03, 0xfc, 0xf8, 0xf3, 0xf2, 0xf0, 0xee, 0xed, 0xeb, 0xeb, 0xec, + 0xed, 0xef, 0xf0, 0xf1, 0xf3, 0xfa, 0x01, 0x0c, 0x17, 0x20, 0x20, 0x18, + 0x0c, 0xff, 0xf6, 0xf4, 0xf9, 0x03, 0x0c, 0x14, 0x16, 0x16, 0x14, 0x12, + 0x11, 0x10, 0x0e, 0x0b, 0x04, 0x00, 0xfd, 0xf9, 0xf6, 0xf4, 0xf0, 0xee, + 0xef, 0xf7, 0x01, 0x0f, 0x1c, 0x24, 0x23, 0x1a, 0x0f, 0x03, 0xfb, 0xf9, + 0xfe, 0x03, 0x08, 0x08, 0x06, 0x00, 0xfb, 0xf5, 0xf1, 0xf1, 0xf0, 0xee, + 0xec, 0xeb, 0xeb, 0xec, 0xee, 0xf0, 0xf0, 0xf2, 0xf6, 0xff, 0x08, 0x14, + 0x1f, 0x21, 0x1c, 0x11, 0x04, 0xf9, 0xf5, 0xf6, 0xfe, 0x09, 0x13, 0x16, + 0x16, 0x14, 0x12, 0x11, 0x10, 0x0f, 0x0c, 0x07, 0x01, 0xfe, 0xfa, 0xf7, + 0xf3, 0xf1, 0xef, 0xef, 0xf2, 0xfc, 0x08, 0x16, 0x21, 0x24, 0x1e, 0x13, + 0x07, 0xfd, 0xfa, 0xfd, 0x02, 0x07, 0x09, 0x06, 0x01, 0xfd, 0xf8, 0xf3, + 0xf1, 0xef, 0xee, 0xec, 0xea, 0xea, 0xea, 0xed, 0xef, 0xf0, 0xf1, 0xf5, + 0xfc, 0x04, 0x11, 0x1c, 0x21, 0x1f, 0x15, 0x09, 0xfc, 0xf5, 0xf6, 0xfb, + 0x07, 0x11, 0x15, 0x16, 0x15, 0x14, 0x11, 0x10, 0x0f, 0x0d, 0x09, 0x03, + 0x00, 0xfb, 0xf8, 0xf5, 0xf3, 0xf0, 0xee, 0xf1, 0xf9, 0x05, 0x11, 0x1c, + 0x22, 0x1f, 0x17, 0x0a, 0xff, 0xf9, 0xfb, 0x01, 0x06, 0x0a, 0x09, 0x04, + 0xff, 0xfc, 0xf6, 0xf2, 0xef, 0xed, 0xeb, 0xe9, 0xe8, 0xe8, 0xeb, 0xed, + 0xef, 0xf0, 0xf3, 0xf9, 0x00, 0x0d, 0x19, 0x20, 0x21, 0x1a, 0x0e, 0x01, + 0xf8, 0xf5, 0xf8, 0x02, 0x0e, 0x14, 0x17, 0x16, 0x15, 0x12, 0x10, 0x0f, + 0x0f, 0x0b, 0x06, 0x00, 0xfb, 0xf8, 0xf7, 0xf3, 0xf1, 0xef, 0xef, 0xf5, + 0xff, 0x0d, 0x1a, 0x21, 0x21, 0x19, 0x0d, 0x02, 0xfb, 0xfa, 0xfe, 0x06, + 0x0a, 0x0a, 0x06, 0x02, 0xfd, 0xf8, 0xf3, 0xf0, 0xed, 0xeb, 0xe9, 0xe7, + 0xe7, 0xe9, 0xeb, 0xed, 0xee, 0xf2, 0xf7, 0xff, 0x0a, 0x16, 0x1f, 0x23, + 0x1e, 0x13, 0x05, 0xfb, 0xf5, 0xf6, 0xff, 0x0b, 0x12, 0x16, 0x17, 0x15, + 0x13, 0x11, 0x10, 0x0f, 0x0c, 0x08, 0x03, 0xff, 0xfa, 0xf7, 0xf5, 0xf2, + 0xf1, 0xef, 0xf3, 0xfb, 0x07, 0x14, 0x1e, 0x21, 0x1b, 0x10, 0x05, 0xfd, + 0xf9, 0xfd, 0x05, 0x0a, 0x0b, 0x09, 0x03, 0xff, 0xfa, 0xf6, 0xf2, 0xef, + 0xec, 0xe9, 0xe7, 0xe6, 0xe7, 0xea, 0xec, 0xef, 0xf1, 0xf4, 0xfc, 0x04, + 0x12, 0x1d, 0x23, 0x20, 0x17, 0x0b, 0xfe, 0xf7, 0xf6, 0xfc, 0x07, 0x11, + 0x15, 0x17, 0x15, 0x13, 0x11, 0x10, 0x0e, 0x0c, 0x09, 0x04, 0x00, 0xfc, + 0xf9, 0xf6, 0xf4, 0xf3, 0xf0, 0xf1, 0xf7, 0x02, 0x0f, 0x1b, 0x22, 0x1e, + 0x16, 0x09, 0xff, 0xf9, 0xfa, 0x01, 0x08, 0x0b, 0x0b, 0x05, 0x00, 0xfa, + 0xf7, 0xf3, 0xee, 0xec, 0xea, 0xe7, 0xe6, 0xe7, 0xe9, 0xec, 0xef, 0xf1, + 0xf3, 0xf9, 0x00, 0x0e, 0x1b, 0x22, 0x23, 0x1b, 0x0e, 0x02, 0xfa, 0xf7, + 0xf9, 0x03, 0x0d, 0x14, 0x17, 0x16, 0x13, 0x11, 0x10, 0x0f, 0x0d, 0x0a, + 0x05, 0x01, 0xfd, 0xf9, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0xf5, 0xfe, 0x0b, + 0x17, 0x20, 0x1f, 0x19, 0x0d, 0x01, 0xfa, 0xf9, 0xff, 0x06, 0x0b, 0x0c, + 0x07, 0x00, 0xfb, 0xf7, 0xf3, 0xf0, 0xec, 0xe9, 0xe7, 0xe6, 0xe7, 0xe8, + 0xeb, 0xed, 0xf0, 0xf2, 0xf6, 0x00, 0x0a, 0x16, 0x21, 0x24, 0x1e, 0x11, + 0x07, 0xfd, 0xf7, 0xf7, 0x00, 0x0b, 0x13, 0x17, 0x17, 0x15, 0x12, 0x10, + 0x0f, 0x0e, 0x0b, 0x07, 0x02, 0x00, 0xfc, 0xf8, 0xf5, 0xf3, 0xf1, 0xf1, + 0xf4, 0xfa, 0x06, 0x13, 0x1f, 0x21, 0x1c, 0x11, 0x04, 0xfc, 0xfa, 0xfd, + 0x04, 0x09, 0x0c, 0x0a, 0x03, 0xfc, 0xf7, 0xf3, 0xf0, 0xee, 0xea, 0xe8, + 0xe6, 0xe6, 0xe8, 0xea, 0xed, 0xef, 0xf1, 0xf4, 0xfc, 0x05, 0x12, 0x1e, + 0x24, 0x21, 0x17, 0x0a, 0xfe, 0xf9, 0xf8, 0xfe, 0x08, 0x10, 0x17, 0x17, + 0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf9, 0xf6, + 0xf5, 0xf2, 0xf1, 0xf3, 0xf8, 0x02, 0x0e, 0x1b, 0x21, 0x1e, 0x15, 0x09, + 0xfe, 0xfa, 0xfa, 0x01, 0x08, 0x0c, 0x0c, 0x05, 0xfe, 0xf7, 0xf3, 0xf0, + 0xee, 0xeb, 0xe8, 0xe6, 0xe6, 0xe6, 0xe9, 0xeb, 0xee, 0xf1, 0xf3, 0xf9, + 0x00, 0x0d, 0x1b, 0x24, 0x23, 0x1b, 0x0e, 0x02, 0xfb, 0xf8, 0xfb, 0x04, + 0x0e, 0x15, 0x19, 0x16, 0x13, 0x11, 0x0f, 0x0d, 0x0c, 0x08, 0x04, 0x01, + 0xfe, 0xfa, 0xf7, 0xf5, 0xf3, 0xf1, 0xf2, 0xf6, 0xfe, 0x0a, 0x18, 0x20, + 0x1f, 0x18, 0x0e, 0x01, 0xfb, 0xfa, 0xff, 0x07, 0x0c, 0x0e, 0x08, 0x02, + 0xfa, 0xf3, 0xf0, 0xee, 0xea, 0xe8, 0xe6, 0xe5, 0xe5, 0xe8, 0xeb, 0xee, + 0xf0, 0xf3, 0xf8, 0xff, 0x09, 0x17, 0x21, 0x24, 0x1f, 0x13, 0x06, 0xfc, + 0xf9, 0xfa, 0x02, 0x0b, 0x12, 0x17, 0x17, 0x15, 0x12, 0x0f, 0x0d, 0x0c, + 0x0a, 0x06, 0x02, 0xff, 0xfc, 0xf9, 0xf6, 0xf4, 0xf2, 0xf2, 0xf4, 0xfb, + 0x06, 0x12, 0x1e, 0x21, 0x1e, 0x12, 0x06, 0xfd, 0xfa, 0xfd, 0x05, 0x0b, + 0x0d, 0x09, 0x03, 0xfc, 0xf5, 0xef, 0xec, 0xea, 0xe7, 0xe4, 0xe4, 0xe5, + 0xe5, 0xea, 0xed, 0xef, 0xf2, 0xf6, 0xfd, 0x04, 0x12, 0x1d, 0x23, 0x21, + 0x18, 0x0a, 0xff, 0xf9, 0xf9, 0xfe, 0x0a, 0x11, 0x16, 0x18, 0x16, 0x12, + 0x11, 0x0e, 0x0c, 0x0b, 0x07, 0x03, 0xff, 0xfc, 0xfa, 0xf8, 0xf5, 0xf2, + 0xf2, 0xf3, 0xf8, 0x03, 0x0f, 0x1a, 0x20, 0x20, 0x17, 0x0c, 0x01, 0xfb, + 0xfc, 0x02, 0x09, 0x0c, 0x0b, 0x05, 0xfe, 0xf6, 0xf0, 0xec, 0xea, 0xe7, + 0xe4, 0xe4, 0xe3, 0xe5, 0xe9, 0xec, 0xef, 0xf2, 0xf5, 0xfa, 0x01, 0x0d, + 0x1a, 0x21, 0x22, 0x1c, 0x10, 0x02, 0xfc, 0xf8, 0xfd, 0x06, 0x0f, 0x16, + 0x18, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x09, 0x08, 0x04, 0x00, 0xfd, 0xfb, + 0xf9, 0xf7, 0xf4, 0xf2, 0xf2, 0xf6, 0xff, 0x0b, 0x16, 0x1f, 0x20, 0x1a, + 0x0f, 0x03, 0xfe, 0xfc, 0x00, 0x09, 0x0d, 0x0d, 0x08, 0x00, 0xf8, 0xf0, + 0xeb, 0xe9, 0xe7, 0xe6, 0xe4, 0xe2, 0xe4, 0xe7, 0xeb, 0xed, 0xf1, 0xf4, + 0xf8, 0x00, 0x0a, 0x16, 0x21, 0x24, 0x20, 0x14, 0x07, 0xff, 0xf9, 0xfa, + 0x02, 0x0d, 0x15, 0x19, 0x18, 0x14, 0x11, 0x0d, 0x0b, 0x09, 0x09, 0x06, + 0x02, 0xff, 0xfc, 0xf9, 0xf8, 0xf5, 0xf4, 0xf3, 0xf4, 0xfb, 0x07, 0x12, + 0x1d, 0x20, 0x1d, 0x12, 0x06, 0xff, 0xfc, 0x00, 0x06, 0x0c, 0x0d, 0x0a, + 0x03, 0xf9, 0xf1, 0xec, 0xe8, 0xe6, 0xe5, 0xe2, 0xe1, 0xe2, 0xe4, 0xe9, + 0xee, 0xf1, 0xf2, 0xf6, 0xfd, 0x05, 0x13, 0x1d, 0x24, 0x22, 0x19, 0x0b, + 0x00, 0xfb, 0xfb, 0x01, 0x0c, 0x14, 0x18, 0x18, 0x15, 0x11, 0x0d, 0x0b, + 0x0a, 0x08, 0x06, 0x04, 0x00, 0xfe, 0xfc, 0xf9, 0xf7, 0xf6, 0xf3, 0xf4, + 0xf9, 0x03, 0x0f, 0x1a, 0x20, 0x1f, 0x17, 0x0a, 0x01, 0xfc, 0xff, 0x05, + 0x0b, 0x0e, 0x0d, 0x05, 0xfc, 0xf3, 0xeb, 0xe7, 0xe5, 0xe4, 0xe2, 0xe1, + 0xe1, 0xe3, 0xe7, 0xeb, 0xef, 0xf2, 0xf5, 0xfa, 0x01, 0x0f, 0x1a, 0x23, + 0x23, 0x1c, 0x10, 0x05, 0xfc, 0xf9, 0xff, 0x09, 0x12, 0x18, 0x1a, 0x15, + 0x12, 0x0e, 0x0b, 0x09, 0x08, 0x07, 0x05, 0x02, 0xff, 0xfd, 0xfa, 0xf8, + 0xf6, 0xf3, 0xf3, 0xf6, 0xff, 0x0a, 0x17, 0x1e, 0x21, 0x1b, 0x10, 0x04, + 0xfd, 0xfe, 0x04, 0x0a, 0x0f, 0x0e, 0x08, 0x00, 0xf6, 0xec, 0xe6, 0xe4, + 0xe2, 0xe2, 0xe0, 0xe0, 0xe2, 0xe5, 0xe9, 0xee, 0xf1, 0xf4, 0xf8, 0x00, + 0x0a, 0x17, 0x22, 0x26, 0x20, 0x15, 0x09, 0xff, 0xfa, 0xfe, 0x06, 0x0f, + 0x17, 0x1a, 0x18, 0x13, 0x0f, 0x0b, 0x09, 0x07, 0x06, 0x05, 0x02, 0xff, + 0xfe, 0xfc, 0xf9, 0xf7, 0xf4, 0xf3, 0xf4, 0xfb, 0x06, 0x13, 0x1f, 0x21, + 0x1e, 0x14, 0x07, 0xff, 0xff, 0x01, 0x09, 0x0e, 0x10, 0x0b, 0x03, 0xf9, + 0xef, 0xe7, 0xe3, 0xe1, 0xe0, 0xde, 0xdf, 0xe1, 0xe4, 0xe8, 0xec, 0xf0, + 0xf3, 0xf6, 0xfd, 0x05, 0x12, 0x1e, 0x25, 0x23, 0x1b, 0x0f, 0x03, 0xfc, + 0xfc, 0x04, 0x0c, 0x16, 0x1a, 0x1a, 0x15, 0x10, 0x0b, 0x08, 0x08, 0x07, + 0x06, 0x02, 0x00, 0xfe, 0xfd, 0xfa, 0xf8, 0xf6, 0xf3, 0xf4, 0xf9, 0x03, + 0x0e, 0x1c, 0x21, 0x21, 0x19, 0x0c, 0x02, 0xfe, 0x01, 0x07, 0x0e, 0x11, + 0x0e, 0x05, 0xfb, 0xf0, 0xe9, 0xe4, 0xe1, 0xde, 0xdc, 0xdd, 0xdf, 0xe2, + 0xe5, 0xeb, 0xee, 0xf3, 0xf5, 0xfb, 0x01, 0x0f, 0x1c, 0x24, 0x25, 0x1f, + 0x13, 0x07, 0xff, 0xfc, 0x00, 0x0a, 0x14, 0x1a, 0x1a, 0x17, 0x11, 0x0b, + 0x08, 0x08, 0x07, 0x07, 0x04, 0x02, 0xff, 0xfe, 0xfc, 0xf9, 0xf8, 0xf5, + 0xf4, 0xf6, 0xfe, 0x0a, 0x17, 0x1f, 0x21, 0x1b, 0x11, 0x07, 0x00, 0x00, + 0x05, 0x0d, 0x11, 0x10, 0x08, 0xff, 0xf3, 0xea, 0xe3, 0xde, 0xdd, 0xdb, + 0xdc, 0xdd, 0xe0, 0xe3, 0xe8, 0xed, 0xf1, 0xf5, 0xf9, 0x00, 0x0a, 0x18, + 0x22, 0x26, 0x23, 0x18, 0x0b, 0x01, 0xfd, 0xff, 0x08, 0x11, 0x18, 0x1a, + 0x18, 0x12, 0x0c, 0x09, 0x07, 0x07, 0x05, 0x04, 0x02, 0xff, 0xff, 0xfd, + 0xfb, 0xf9, 0xf6, 0xf4, 0xf5, 0xfc, 0x06, 0x13, 0x1e, 0x21, 0x1e, 0x14, + 0x0a, 0x03, 0x00, 0x04, 0x0b, 0x10, 0x11, 0x0b, 0x03, 0xf8, 0xec, 0xe3, + 0xde, 0xdc, 0xda, 0xda, 0xda, 0xdd, 0xe1, 0xe6, 0xeb, 0xf0, 0xf3, 0xf6, + 0xfd, 0x05, 0x13, 0x1f, 0x26, 0x26, 0x1c, 0x10, 0x04, 0xfe, 0xff, 0x05, + 0x0f, 0x17, 0x1a, 0x19, 0x13, 0x0f, 0x09, 0x07, 0x06, 0x05, 0x05, 0x03, + 0xff, 0xfe, 0xfd, 0xfc, 0xf9, 0xf8, 0xf5, 0xf6, 0xf9, 0x03, 0x0e, 0x1b, + 0x21, 0x21, 0x1a, 0x0f, 0x06, 0x01, 0x03, 0x0b, 0x10, 0x11, 0x0e, 0x04, + 0xf9, 0xee, 0xe5, 0xdf, 0xdb, 0xda, 0xd9, 0xda, 0xdb, 0xdf, 0xe4, 0xea, + 0xee, 0xf3, 0xf6, 0xfb, 0x02, 0x0f, 0x1a, 0x25, 0x26, 0x20, 0x15, 0x09, + 0x00, 0xfe, 0x03, 0x0b, 0x16, 0x1a, 0x1b, 0x16, 0x0f, 0x0a, 0x07, 0x06, + 0x05, 0x05, 0x03, 0x01, 0x00, 0xfe, 0xfc, 0xfb, 0xfa, 0xf6, 0xf5, 0xf8, + 0x00, 0x0a, 0x18, 0x20, 0x23, 0x1d, 0x12, 0x08, 0x03, 0x03, 0x08, 0x0f, + 0x12, 0x11, 0x09, 0xfc, 0xef, 0xe6, 0xe0, 0xdd, 0xda, 0xd7, 0xd8, 0xd9, + 0xdd, 0xe1, 0xe7, 0xeb, 0xf0, 0xf4, 0xf9, 0xff, 0x09, 0x17, 0x22, 0x29, + 0x23, 0x19, 0x0d, 0x04, 0x01, 0x04, 0x0a, 0x12, 0x19, 0x1a, 0x17, 0x10, + 0x0b, 0x07, 0x06, 0x06, 0x05, 0x04, 0x02, 0x02, 0x00, 0xfe, 0xfc, 0xfa, + 0xf8, 0xf6, 0xf7, 0xfc, 0x05, 0x12, 0x1e, 0x23, 0x1e, 0x15, 0x0d, 0x04, + 0x04, 0x07, 0x0e, 0x12, 0x12, 0x0c, 0x01, 0xf4, 0xe8, 0xe0, 0xdc, 0xda, + 0xd8, 0xd6, 0xd7, 0xdb, 0xdf, 0xe3, 0xea, 0xee, 0xf2, 0xf6, 0xfc, 0x03, + 0x12, 0x1f, 0x27, 0x27, 0x1f, 0x12, 0x08, 0x00, 0x03, 0x09, 0x11, 0x18, + 0x1b, 0x19, 0x13, 0x0b, 0x07, 0x05, 0x06, 0x06, 0x04, 0x02, 0x01, 0x00, + 0xff, 0xfe, 0xfc, 0xf9, 0xf7, 0xf7, 0xf9, 0x03, 0x0e, 0x19, 0x21, 0x22, + 0x1b, 0x10, 0x08, 0x04, 0x06, 0x0c, 0x11, 0x14, 0x10, 0x04, 0xf7, 0xea, + 0xe1, 0xdc, 0xd9, 0xd7, 0xd5, 0xd6, 0xd8, 0xdd, 0xe2, 0xe8, 0xec, 0xf0, + 0xf3, 0xf9, 0x00, 0x0c, 0x1b, 0x25, 0x28, 0x23, 0x19, 0x0c, 0x04, 0x02, + 0x07, 0x0e, 0x17, 0x1b, 0x1a, 0x15, 0x0e, 0x08, 0x04, 0x04, 0x05, 0x04, + 0x03, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xfb, 0xf8, 0xf7, 0xf9, 0xff, 0x09, + 0x15, 0x1f, 0x24, 0x1e, 0x15, 0x0b, 0x04, 0x06, 0x0b, 0x10, 0x13, 0x10, + 0x08, 0xfc, 0xee, 0xe3, 0xdc, 0xd9, 0xd7, 0xd6, 0xd4, 0xd7, 0xda, 0xdf, + 0xe4, 0xea, 0xed, 0xf1, 0xf5, 0xfd, 0x08, 0x15, 0x23, 0x2a, 0x28, 0x1f, + 0x12, 0x08, 0x03, 0x06, 0x0d, 0x15, 0x19, 0x1a, 0x16, 0x0f, 0x08, 0x04, + 0x03, 0x04, 0x04, 0x02, 0x03, 0x01, 0x00, 0xff, 0x00, 0xfc, 0xf9, 0xf6, + 0xf7, 0xfd, 0x05, 0x12, 0x1c, 0x22, 0x21, 0x18, 0x0e, 0x07, 0x06, 0x09, + 0x0e, 0x12, 0x11, 0x0c, 0x01, 0xf4, 0xe6, 0xdd, 0xd8, 0xd7, 0xd6, 0xd5, + 0xd6, 0xd8, 0xdc, 0xe3, 0xe8, 0xec, 0xee, 0xf3, 0xf9, 0x04, 0x10, 0x1e, + 0x27, 0x2a, 0x24, 0x19, 0x0c, 0x05, 0x06, 0x0c, 0x14, 0x1a, 0x1a, 0x17, + 0x11, 0x0a, 0x04, 0x02, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, + 0xfe, 0xfa, 0xf7, 0xf6, 0xf9, 0x03, 0x0e, 0x19, 0x21, 0x22, 0x1c, 0x13, + 0x0a, 0x06, 0x08, 0x0e, 0x12, 0x12, 0x0d, 0x04, 0xf7, 0xea, 0xdf, 0xd9, + 0xd6, 0xd4, 0xd5, 0xd5, 0xd7, 0xdb, 0xe1, 0xe5, 0xea, 0xed, 0xf1, 0xf5, + 0xff, 0x0c, 0x1a, 0x25, 0x2a, 0x27, 0x1e, 0x11, 0x08, 0x06, 0x0a, 0x10, + 0x18, 0x1a, 0x19, 0x13, 0x0b, 0x05, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, + 0x01, 0x00, 0x02, 0x00, 0xfc, 0xf7, 0xf5, 0xf7, 0xff, 0x09, 0x15, 0x1f, + 0x24, 0x21, 0x17, 0x0e, 0x09, 0x08, 0x0d, 0x11, 0x13, 0x0f, 0x06, 0xfb, + 0xed, 0xe1, 0xda, 0xd6, 0xd4, 0xd4, 0xd4, 0xd5, 0xd8, 0xde, 0xe4, 0xe8, + 0xeb, 0xee, 0xf2, 0xf9, 0x06, 0x15, 0x22, 0x2a, 0x2a, 0x22, 0x17, 0x0e, + 0x08, 0x09, 0x10, 0x17, 0x1b, 0x1a, 0x15, 0x0c, 0x06, 0x03, 0x02, 0x02, + 0x02, 0x03, 0x03, 0x02, 0x00, 0x01, 0x01, 0xff, 0xfb, 0xf7, 0xf6, 0xfb, + 0x06, 0x12, 0x1d, 0x24, 0x22, 0x1a, 0x11, 0x0a, 0x08, 0x0a, 0x11, 0x13, + 0x11, 0x09, 0xfe, 0xf1, 0xe4, 0xdb, 0xd7, 0xd4, 0xd4, 0xd4, 0xd5, 0xd7, + 0xdb, 0xe0, 0xe5, 0xea, 0xec, 0xf0, 0xf4, 0x02, 0x0e, 0x1d, 0x28, 0x2a, + 0x27, 0x1c, 0x12, 0x09, 0x0a, 0x0e, 0x15, 0x1a, 0x1c, 0x17, 0x0f, 0x07, + 0x03, 0x01, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xfc, + 0xf8, 0xf6, 0xfb, 0x04, 0x0e, 0x1a, 0x23, 0x24, 0x1f, 0x15, 0x0c, 0x08, + 0x0b, 0x10, 0x12, 0x14, 0x0c, 0x01, 0xf3, 0xe7, 0xdd, 0xd8, 0xd5, 0xd5, + 0xd4, 0xd5, 0xd7, 0xd9, 0xdf, 0xe3, 0xe7, 0xe9, 0xeb, 0xef, 0xfa, 0x09, + 0x17, 0x24, 0x2a, 0x28, 0x20, 0x16, 0x0e, 0x0c, 0x0e, 0x15, 0x1b, 0x1d, + 0x18, 0x11, 0x08, 0x03, 0xff, 0xfe, 0x01, 0x03, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x00, 0xfe, 0xf9, 0xf6, 0xf7, 0x00, 0x0b, 0x17, 0x21, 0x26, 0x22, + 0x1a, 0x11, 0x0a, 0x0a, 0x0e, 0x11, 0x14, 0x0e, 0x04, 0xf7, 0xea, 0xdf, + 0xd9, 0xd5, 0xd4, 0xd4, 0xd4, 0xd7, 0xd9, 0xdc, 0xe1, 0xe4, 0xe8, 0xe9, + 0xec, 0xf4, 0x03, 0x12, 0x20, 0x29, 0x2a, 0x24, 0x1b, 0x12, 0x0d, 0x0e, + 0x13, 0x1a, 0x1d, 0x1c, 0x14, 0x0b, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x03, + 0x04, 0x03, 0x02, 0x01, 0x01, 0x00, 0xfb, 0xf8, 0xf7, 0xfc, 0x06, 0x14, + 0x20, 0x26, 0x24, 0x1d, 0x14, 0x0c, 0x09, 0x0b, 0x10, 0x13, 0x12, 0x08, + 0xfb, 0xed, 0xe2, 0xdb, 0xd6, 0xd4, 0xd3, 0xd4, 0xd6, 0xd9, 0xdb, 0xde, + 0xe1, 0xe5, 0xe6, 0xe9, 0xef, 0xfc, 0x0b, 0x1c, 0x27, 0x2b, 0x28, 0x21, + 0x16, 0x10, 0x0e, 0x14, 0x19, 0x1e, 0x1d, 0x17, 0x0e, 0x05, 0xff, 0xfe, + 0xfe, 0x00, 0x02, 0x05, 0x04, 0x03, 0x01, 0x02, 0x00, 0xfc, 0xf8, 0xf7, + 0xfa, 0x04, 0x10, 0x1c, 0x25, 0x26, 0x20, 0x17, 0x0e, 0x0a, 0x0b, 0x0f, + 0x13, 0x12, 0x0c, 0xff, 0xf1, 0xe5, 0xdb, 0xd6, 0xd5, 0xd3, 0xd2, 0xd5, + 0xd6, 0xda, 0xdc, 0xe0, 0xe2, 0xe4, 0xe7, 0xec, 0xf5, 0x06, 0x16, 0x23, + 0x2b, 0x2b, 0x24, 0x1a, 0x12, 0x10, 0x12, 0x18, 0x1e, 0x1e, 0x1a, 0x12, + 0x08, 0x02, 0xff, 0xfe, 0x00, 0x01, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, + 0xfe, 0xfa, 0xf6, 0xf8, 0xff, 0x0b, 0x19, 0x25, 0x2a, 0x25, 0x1a, 0x12, + 0x0b, 0x0c, 0x0e, 0x12, 0x12, 0x0e, 0x03, 0xf6, 0xe8, 0xde, 0xd9, 0xd5, + 0xd3, 0xd2, 0xd5, 0xd6, 0xd9, 0xdb, 0xdf, 0xe0, 0xe2, 0xe4, 0xe7, 0xef, + 0xfd, 0x0e, 0x1e, 0x2a, 0x2c, 0x27, 0x1f, 0x17, 0x12, 0x12, 0x17, 0x1e, + 0x21, 0x1d, 0x15, 0x0b, 0x03, 0xff, 0xfe, 0xfe, 0x00, 0x02, 0x03, 0x04, + 0x02, 0x01, 0x02, 0xff, 0xfb, 0xf9, 0xf6, 0xfb, 0x06, 0x15, 0x21, 0x29, + 0x28, 0x20, 0x15, 0x0e, 0x09, 0x0a, 0x0f, 0x12, 0x10, 0x06, 0xfa, 0xec, + 0xe0, 0xda, 0xd6, 0xd4, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdd, 0xdf, 0xe0, + 0xe2, 0xe4, 0xe9, 0xf6, 0x06, 0x18, 0x27, 0x2c, 0x2a, 0x23, 0x1c, 0x15, + 0x14, 0x17, 0x1d, 0x21, 0x21, 0x1a, 0x0f, 0x05, 0xff, 0xfe, 0xfe, 0xfe, + 0x02, 0x02, 0x03, 0x03, 0x01, 0x02, 0x00, 0xfe, 0xf9, 0xf7, 0xfa, 0x03, + 0x10, 0x1e, 0x27, 0x2a, 0x23, 0x19, 0x11, 0x0b, 0x0a, 0x0e, 0x10, 0x10, + 0x08, 0xfe, 0xf0, 0xe4, 0xdd, 0xd7, 0xd4, 0xd5, 0xd5, 0xd5, 0xd6, 0xd9, + 0xda, 0xdd, 0xe0, 0xe0, 0xe1, 0xe4, 0xef, 0x00, 0x11, 0x22, 0x2c, 0x2c, + 0x28, 0x1f, 0x19, 0x15, 0x17, 0x1d, 0x21, 0x21, 0x1c, 0x12, 0x08, 0x01, + 0xfe, 0xfe, 0xfe, 0x01, 0x03, 0x03, 0x03, 0x02, 0x01, 0x02, 0xfe, 0xfa, + 0xf8, 0xf8, 0x01, 0x0d, 0x1a, 0x26, 0x2b, 0x28, 0x1d, 0x14, 0x0c, 0x09, + 0x0c, 0x0f, 0x0f, 0x0b, 0x02, 0xf5, 0xe7, 0xdf, 0xda, 0xd6, 0xd5, 0xd6, + 0xd6, 0xd7, 0xd8, 0xda, 0xdb, 0xdc, 0xdd, 0xdf, 0xe1, 0xea, 0xfa, 0x0a, + 0x1b, 0x29, 0x2d, 0x2a, 0x23, 0x1b, 0x16, 0x17, 0x1b, 0x20, 0x21, 0x1f, + 0x16, 0x0c, 0x03, 0xff, 0xfe, 0xfe, 0x01, 0x03, 0x04, 0x04, 0x02, 0x01, + 0x02, 0x00, 0xfd, 0xf8, 0xf7, 0xfd, 0x07, 0x16, 0x24, 0x2b, 0x2b, 0x21, + 0x16, 0x0e, 0x09, 0x0b, 0x0e, 0x0f, 0x0d, 0x04, 0xf9, 0xed, 0xe2, 0xdc, + 0xd7, 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xda, 0xdb, 0xdb, 0xdc, 0xdc, 0xde, + 0xe5, 0xf3, 0x05, 0x15, 0x24, 0x2c, 0x2c, 0x26, 0x1e, 0x18, 0x16, 0x1a, + 0x20, 0x22, 0x21, 0x1a, 0x10, 0x07, 0xff, 0xfe, 0xfe, 0x01, 0x03, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x00, 0xfd, 0xf8, 0xf7, 0xfb, 0x02, 0x11, 0x20, + 0x29, 0x2b, 0x25, 0x1c, 0x10, 0x0a, 0x09, 0x0c, 0x0e, 0x0d, 0x07, 0xfd, + 0xef, 0xe4, 0xdd, 0xd8, 0xd7, 0xd6, 0xd8, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, + 0xdb, 0xda, 0xdd, 0xe0, 0xeb, 0xfd, 0x0f, 0x20, 0x2b, 0x2c, 0x2a, 0x20, + 0x19, 0x16, 0x1a, 0x1e, 0x23, 0x23, 0x1d, 0x13, 0x0b, 0x03, 0xfe, 0xfe, + 0xff, 0x02, 0x04, 0x05, 0x03, 0x00, 0x01, 0x02, 0xfe, 0xf9, 0xf6, 0xf8, + 0x02, 0x0d, 0x1c, 0x28, 0x2e, 0x2a, 0x20, 0x15, 0x0b, 0x08, 0x0a, 0x0c, + 0x0e, 0x09, 0x01, 0xf3, 0xe8, 0xe0, 0xda, 0xd8, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd9, 0xd9, 0xda, 0xdb, 0xda, 0xdb, 0xdd, 0xe6, 0xf5, 0x07, 0x1a, 0x28, + 0x2e, 0x2b, 0x24, 0x1b, 0x16, 0x17, 0x1c, 0x22, 0x25, 0x20, 0x18, 0x0f, + 0x06, 0x00, 0xfe, 0x00, 0x01, 0x04, 0x04, 0x03, 0x00, 0x01, 0x00, 0xfd, + 0xf9, 0xf7, 0xf7, 0xfe, 0x08, 0x18, 0x26, 0x2d, 0x2c, 0x25, 0x1a, 0x0f, + 0x08, 0x08, 0x0a, 0x0c, 0x0a, 0x01, 0xf8, 0xec, 0xe2, 0xdb, 0xda, 0xd9, + 0xd8, 0xd8, 0xd9, 0xd8, 0xd8, 0xd8, 0xda, 0xd9, 0xda, 0xdc, 0xe0, 0xed, + 0x01, 0x14, 0x22, 0x2c, 0x2c, 0x27, 0x1e, 0x19, 0x17, 0x1b, 0x21, 0x25, + 0x22, 0x1c, 0x12, 0x09, 0x03, 0x00, 0x00, 0x02, 0x03, 0x04, 0x04, 0x00, + 0x00, 0x01, 0xfe, 0xfb, 0xf8, 0xf7, 0xfa, 0x05, 0x14, 0x22, 0x2c, 0x2f, + 0x28, 0x1d, 0x13, 0x0b, 0x07, 0x08, 0x0b, 0x0a, 0x04, 0xfc, 0xef, 0xe5, + 0xde, 0xda, 0xda, 0xd9, 0xda, 0xda, 0xd9, 0xd7, 0xd9, 0xd9, 0xd9, 0xda, + 0xda, 0xdd, 0xe7, 0xfa, 0x0c, 0x1e, 0x28, 0x2c, 0x28, 0x20, 0x1a, 0x17, + 0x18, 0x1e, 0x25, 0x25, 0x1e, 0x15, 0x0e, 0x07, 0x03, 0x01, 0x02, 0x03, + 0x04, 0x04, 0x02, 0x00, 0x00, 0xfe, 0xfc, 0xf9, 0xf8, 0xf9, 0x01, 0x0f, + 0x1e, 0x2a, 0x30, 0x2d, 0x23, 0x16, 0x0d, 0x07, 0x06, 0x09, 0x0a, 0x06, + 0xff, 0xf2, 0xe7, 0xe0, 0xdd, 0xdb, 0xd9, 0xda, 0xd9, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd9, 0xd9, 0xda, 0xe3, 0xf3, 0x05, 0x17, 0x25, 0x2b, 0x28, + 0x22, 0x1c, 0x16, 0x17, 0x1c, 0x22, 0x25, 0x21, 0x1b, 0x11, 0x09, 0x05, + 0x04, 0x03, 0x04, 0x05, 0x05, 0x02, 0x00, 0xfe, 0xfe, 0xfc, 0xfb, 0xf7, + 0xf8, 0xff, 0x0a, 0x19, 0x28, 0x30, 0x2f, 0x26, 0x1a, 0x0f, 0x08, 0x05, + 0x06, 0x09, 0x06, 0x01, 0xf6, 0xeb, 0xe2, 0xe0, 0xdc, 0xdb, 0xdc, 0xdc, + 0xda, 0xd8, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xda, 0xe0, 0xec, 0x00, 0x11, + 0x22, 0x29, 0x29, 0x25, 0x1d, 0x18, 0x15, 0x19, 0x20, 0x24, 0x24, 0x1e, + 0x16, 0x0e, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x00, 0xff, 0xfd, + 0xfc, 0xfa, 0xf7, 0xf7, 0xfd, 0x06, 0x15, 0x24, 0x2f, 0x31, 0x2a, 0x1e, + 0x12, 0x08, 0x04, 0x05, 0x07, 0x07, 0x03, 0xfa, 0xef, 0xe5, 0xe0, 0xde, + 0xdd, 0xdd, 0xdd, 0xd9, 0xd8, 0xd7, 0xd8, 0xd7, 0xd8, 0xd8, 0xd8, 0xdc, + 0xe7, 0xf8, 0x0b, 0x1d, 0x28, 0x29, 0x27, 0x1f, 0x18, 0x15, 0x18, 0x1d, + 0x22, 0x23, 0x20, 0x19, 0x11, 0x0b, 0x08, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x00, 0xff, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0xfb, 0x03, 0x10, 0x20, 0x2d, + 0x31, 0x2d, 0x23, 0x16, 0x0b, 0x04, 0x03, 0x05, 0x07, 0x03, 0xfd, 0xf1, + 0xe7, 0xe2, 0xe0, 0xde, 0xdf, 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd5, 0xd7, + 0xd7, 0xd7, 0xdb, 0xe3, 0xf2, 0x04, 0x17, 0x25, 0x29, 0x26, 0x1f, 0x18, + 0x14, 0x14, 0x1b, 0x20, 0x23, 0x23, 0x1d, 0x14, 0x0e, 0x0a, 0x08, 0x08, + 0x09, 0x08, 0x05, 0x02, 0x00, 0xfc, 0xfa, 0xf8, 0xf7, 0xf7, 0xfa, 0x00, + 0x0d, 0x1c, 0x2b, 0x32, 0x31, 0x27, 0x1a, 0x0d, 0x05, 0x02, 0x03, 0x05, + 0x04, 0x00, 0xf6, 0xec, 0xe4, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xda, 0xd9, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd7, 0xd9, 0xdf, 0xed, 0x00, 0x12, 0x21, 0x29, + 0x27, 0x21, 0x1a, 0x15, 0x13, 0x15, 0x1c, 0x22, 0x24, 0x20, 0x1a, 0x13, + 0x0e, 0x0a, 0x0a, 0x0b, 0x0a, 0x07, 0x04, 0x00, 0xfc, 0xfa, 0xf8, 0xf7, + 0xf7, 0xf8, 0xfd, 0x06, 0x17, 0x27, 0x31, 0x32, 0x2b, 0x1f, 0x10, 0x06, + 0x00, 0x00, 0x03, 0x05, 0x00, 0xf8, 0xef, 0xe7, 0xe3, 0xe1, 0xe1, 0xe0, + 0xdd, 0xdb, 0xd8, 0xd6, 0xd4, 0xd6, 0xd5, 0xd5, 0xd8, 0xde, 0xe7, 0xf8, + 0x0b, 0x1c, 0x27, 0x27, 0x22, 0x1b, 0x14, 0x12, 0x13, 0x18, 0x20, 0x23, + 0x22, 0x1d, 0x17, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x09, 0x04, 0x00, 0xfd, + 0xfa, 0xf7, 0xf6, 0xf6, 0xf7, 0xfb, 0x02, 0x13, 0x24, 0x30, 0x35, 0x30, + 0x23, 0x15, 0x08, 0x00, 0x00, 0x02, 0x04, 0x02, 0xfd, 0xf4, 0xea, 0xe3, + 0xe2, 0xe3, 0xe2, 0xe0, 0xde, 0xda, 0xd8, 0xd7, 0xd5, 0xd5, 0xd5, 0xd7, + 0xda, 0xe2, 0xf1, 0x05, 0x17, 0x23, 0x29, 0x24, 0x1c, 0x14, 0x0f, 0x0f, + 0x15, 0x1c, 0x21, 0x22, 0x1f, 0x19, 0x13, 0x0f, 0x0f, 0x0e, 0x0c, 0x0a, + 0x06, 0x02, 0xfe, 0xfb, 0xf7, 0xf6, 0xf6, 0xf6, 0xfa, 0x00, 0x0c, 0x1f, + 0x2d, 0x35, 0x33, 0x28, 0x18, 0x0c, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, + 0xf7, 0xee, 0xe6, 0xe3, 0xe3, 0xe2, 0xe0, 0xdf, 0xdc, 0xd7, 0xd7, 0xd5, + 0xd4, 0xd4, 0xd7, 0xd8, 0xdf, 0xec, 0x00, 0x12, 0x22, 0x2a, 0x26, 0x1e, + 0x15, 0x0e, 0x0b, 0x0f, 0x18, 0x20, 0x23, 0x22, 0x1c, 0x16, 0x12, 0x10, + 0x10, 0x0f, 0x0c, 0x08, 0x03, 0x00, 0xfd, 0xf8, 0xf6, 0xf5, 0xf6, 0xf7, + 0xfe, 0x08, 0x1a, 0x2a, 0x35, 0x35, 0x2c, 0x1d, 0x0f, 0x03, 0xff, 0x00, + 0x00, 0x02, 0x00, 0xfb, 0xf1, 0xe9, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdd, + 0xd9, 0xd7, 0xd5, 0xd4, 0xd4, 0xd6, 0xd7, 0xdc, 0xe8, 0xfa, 0x0b, 0x1c, + 0x27, 0x27, 0x20, 0x16, 0x0d, 0x09, 0x0b, 0x14, 0x1c, 0x21, 0x22, 0x1e, + 0x18, 0x15, 0x13, 0x12, 0x10, 0x0f, 0x0b, 0x05, 0x00, 0xfd, 0xfa, 0xf6, + 0xf5, 0xf5, 0xf6, 0xfb, 0x04, 0x14, 0x25, 0x33, 0x37, 0x30, 0x24, 0x15, + 0x06, 0xff, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf4, 0xeb, 0xe7, 0xe4, 0xe3, + 0xe3, 0xe2, 0xde, 0xda, 0xd6, 0xd5, 0xd3, 0xd3, 0xd3, 0xd6, 0xda, 0xe3, + 0xf3, 0x04, 0x17, 0x24, 0x28, 0x22, 0x1a, 0x10, 0x09, 0x0a, 0x10, 0x19, + 0x21, 0x23, 0x21, 0x1c, 0x17, 0x15, 0x15, 0x13, 0x12, 0x0f, 0x00, 0x00, + 0x02, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xfd, 0xfe, 0x06, 0x0b, 0x07, 0x05, + 0x07, 0x06, 0xfd, 0xfe, 0x00, 0x03, 0x02, 0x01, 0x0b, 0x03, 0x01, 0xfe, + 0xff, 0x02, 0x07, 0x09, 0x07, 0x03, 0x03, 0x06, 0x0a, 0x05, 0x06, 0x07, + 0x07, 0x10, 0x0f, 0x07, 0x07, 0x06, 0x00, 0xff, 0x00, 0x09, 0x07, 0x06, + 0x06, 0x02, 0x00, 0xfa, 0xf9, 0xf9, 0xfe, 0xfa, 0xfd, 0xfe, 0x02, 0x03, + 0x0b, 0x06, 0x02, 0x01, 0x0a, 0x0e, 0x05, 0x02, 0x03, 0xff, 0xff, 0x00, + 0x00, 0x03, 0x07, 0x06, 0x05, 0x02, 0x00, 0x00, 0x03, 0x07, 0x07, 0x09, + 0x03, 0x00, 0xfb, 0xf7, 0xfa, 0xfb, 0xff, 0x02, 0x0a, 0x10, 0x07, 0x0d, + 0x0f, 0x0e, 0x03, 0x01, 0x00, 0xff, 0xfb, 0x01, 0xfe, 0x01, 0x02, 0x02, + 0x05, 0x07, 0x03, 0x06, 0x06, 0x06, 0x02, 0x01, 0x02, 0xff, 0x02, 0x05, + 0x0e, 0x12, 0x0d, 0x0a, 0x05, 0x03, 0x00, 0x01, 0x00, 0xff, 0xfb, 0xfb, + 0x02, 0x07, 0xf7, 0xfa, 0xfa, 0xf9, 0xfb, 0xfb, 0xff, 0xfb, 0x00, 0x00, + 0x05, 0x01, 0x01, 0x01, 0x06, 0x0b, 0x07, 0x05, 0x07, 0x0f, 0x10, 0x10, + 0x0a, 0x09, 0x07, 0x03, 0x06, 0x07, 0x00, 0xff, 0xfb, 0xf9, 0xf7, 0x00, + 0x03, 0xff, 0x07, 0x0a, 0x07, 0x02, 0x05, 0x05, 0x0a, 0x10, 0x0a, 0x0b, + 0x0b, 0x06, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x09, 0x03, 0xff, 0xff, + 0xfd, 0xfa, 0xff, 0x01, 0x01, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0x00, + 0x07, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x01, 0xfe, 0xfe, 0x03, 0x02, 0x05, + 0x0a, 0x0b, 0x09, 0x03, 0x09, 0x03, 0x00, 0x06, 0x03, 0x06, 0x07, 0x03, + 0xff, 0xfb, 0x02, 0x09, 0x0d, 0x0f, 0x0d, 0x07, 0x09, 0x0d, 0x07, 0x01, + 0xfe, 0xfa, 0xf7, 0xf6, 0xf7, 0x01, 0xfd, 0xfd, 0x00, 0x02, 0x05, 0x07, + 0x02, 0x05, 0x03, 0x02, 0x02, 0x02, 0x00, 0x02, 0x07, 0x0f, 0x0d, 0x09, + 0x0a, 0x05, 0x00, 0x05, 0x09, 0x0d, 0x05, 0xff, 0x00, 0x05, 0x00, 0xfe, + 0xf5, 0xf5, 0xf1, 0xf7, 0xfd, 0x01, 0x07, 0x07, 0x02, 0xfe, 0x0a, 0x0b, + 0x06, 0x0b, 0x0e, 0x0d, 0x09, 0x0e, 0x0e, 0x05, 0x03, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x05, 0x01, 0xfd, 0xff, 0xff, 0x00, 0x01, 0x02, + 0x03, 0x01, 0xfe, 0x00, 0xfe, 0xfa, 0xff, 0x00, 0x02, 0x07, 0x07, 0x03, + 0x02, 0x00, 0xff, 0x03, 0x03, 0x02, 0x06, 0x03, 0x01, 0xfe, 0xfd, 0x01, + 0x06, 0xfe, 0x02, 0x05, 0x02, 0xfe, 0x02, 0x0d, 0x12, 0x14, 0x14, 0x0d, + 0x0b, 0x03, 0xfd, 0xfe, 0x00, 0xf7, 0xf5, 0xfa, 0xfb, 0x06, 0x0a, 0x07, + 0x09, 0x05, 0x06, 0x0a, 0x09, 0x0b, 0x05, 0x0a, 0x0d, 0x05, 0x00, 0xff, + 0x02, 0x03, 0x0a, 0x0b, 0x09, 0x03, 0xff, 0xff, 0x03, 0x05, 0xfe, 0xf5, + 0xf7, 0xf6, 0xf3, 0xfb, 0xf9, 0xf7, 0xf7, 0xf9, 0x05, 0x05, 0xff, 0x06, + 0x0d, 0x0a, 0x0e, 0x07, 0x07, 0x0d, 0x12, 0x0f, 0x0d, 0x09, 0x0b, 0x0a, + 0x0b, 0x0e, 0x06, 0x03, 0xfd, 0x01, 0x00, 0x01, 0x03, 0xff, 0xf9, 0xfd, + 0x00, 0xfb, 0xfd, 0xfe, 0xf9, 0xff, 0xff, 0xfd, 0x03, 0x06, 0x09, 0x07, + 0x03, 0x09, 0x0e, 0x0a, 0x0d, 0x07, 0x0b, 0x0b, 0x07, 0x02, 0x00, 0x02, + 0x03, 0x01, 0xff, 0xff, 0xfd, 0xfb, 0x05, 0x06, 0xff, 0x03, 0x01, 0x01, + 0x03, 0x07, 0x09, 0x03, 0x01, 0x00, 0xff, 0x01, 0x03, 0xfa, 0xfe, 0xfe, + 0xfa, 0xfe, 0x02, 0x0a, 0x0f, 0x0a, 0x05, 0x0d, 0x07, 0x06, 0x06, 0x09, + 0x02, 0x07, 0x01, 0x00, 0x00, 0x02, 0x10, 0x12, 0x0b, 0x05, 0x09, 0xfe, + 0xfe, 0x01, 0x05, 0xfb, 0xfe, 0x02, 0xff, 0x09, 0x06, 0xff, 0x01, 0xfe, + 0xfb, 0xff, 0xfe, 0xfd, 0xfe, 0x01, 0x07, 0x09, 0x09, 0x02, 0x06, 0x09, + 0x0e, 0x07, 0x02, 0x06, 0x01, 0x00, 0x09, 0x05, 0xfb, 0xf5, 0xf9, 0xfd, + 0xf7, 0xfb, 0xf7, 0x01, 0x07, 0x09, 0x09, 0x14, 0x0d, 0x0d, 0x06, 0x02, + 0x02, 0xff, 0x06, 0x07, 0x01, 0x02, 0x0a, 0x0a, 0x09, 0x0b, 0x0e, 0x0f, + 0x09, 0x06, 0x03, 0x02, 0x06, 0x09, 0x03, 0x02, 0xf9, 0xfe, 0xff, 0x02, + 0xff, 0xfe, 0x00, 0xf9, 0xfd, 0x05, 0x03, 0x03, 0x07, 0x05, 0x00, 0xfe, + 0xfd, 0xfd, 0x02, 0x01, 0xfd, 0xff, 0xfd, 0x05, 0x09, 0x0e, 0x0f, 0x07, + 0x06, 0x07, 0x09, 0x02, 0x06, 0x06, 0x0d, 0x01, 0x02, 0x02, 0x05, 0x00, + 0x12, 0x09, 0x00, 0xfb, 0x01, 0x02, 0x0e, 0x10, 0x02, 0xfd, 0xfd, 0xff, + 0x02, 0xff, 0xfe, 0xfb, 0x00, 0xfd, 0xf9, 0xff, 0x03, 0x01, 0x0d, 0x09, + 0x10, 0x0d, 0x07, 0x05, 0x0f, 0x14, 0x07, 0x00, 0x03, 0xff, 0xf9, 0xf3, + 0xf9, 0xfe, 0xfd, 0xfb, 0xfd, 0x07, 0x0b, 0xfd, 0x05, 0x05, 0x05, 0x10, + 0x0d, 0x03, 0xfb, 0xfe, 0x02, 0x03, 0x01, 0xfe, 0x03, 0x01, 0x07, 0x06, + 0x0e, 0x13, 0x0d, 0x0e, 0x0d, 0x01, 0x01, 0xff, 0x00, 0xff, 0xfd, 0xfe, + 0xf7, 0xfd, 0x01, 0x06, 0x05, 0x02, 0x06, 0x07, 0x03, 0x00, 0x02, 0x00, + 0x09, 0x0a, 0x00, 0x05, 0x02, 0xfe, 0xfe, 0x06, 0x01, 0x02, 0x00, 0x02, + 0x01, 0x09, 0x0e, 0x0d, 0x07, 0x05, 0xfd, 0x00, 0x06, 0xfe, 0xec, 0xfd, + 0xf9, 0xfe, 0xff, 0xff, 0x0d, 0x0d, 0xfe, 0x02, 0x06, 0x03, 0xfb, 0x0a, + 0x09, 0x00, 0x07, 0x09, 0x07, 0x0a, 0x0a, 0x0a, 0x01, 0x0a, 0x03, 0x06, + 0x06, 0x01, 0x03, 0x0e, 0x0b, 0x07, 0xff, 0x01, 0xfe, 0x03, 0x0a, 0x07, + 0xfb, 0xfa, 0x03, 0x09, 0x05, 0x00, 0x02, 0x00, 0xf7, 0xfe, 0xf9, 0xf7, + 0xf9, 0xfa, 0x07, 0x0a, 0x09, 0x03, 0x01, 0x0b, 0x05, 0x09, 0x0a, 0x01, + 0xfb, 0xfe, 0x02, 0x09, 0x14, 0x10, 0x10, 0x09, 0xfe, 0xf1, 0xf3, 0xf7, + 0xfd, 0xf6, 0x05, 0x09, 0xff, 0xfd, 0x09, 0x0e, 0x0a, 0x0d, 0x05, 0x06, + 0x02, 0xff, 0x0d, 0x0d, 0x0e, 0x0b, 0x17, 0x12, 0x0e, 0x06, 0x00, 0x02, + 0x00, 0xf7, 0xfe, 0x01, 0xfd, 0xff, 0xff, 0x03, 0x02, 0xfb, 0xfd, 0xf9, + 0x05, 0x0a, 0xff, 0xfd, 0x02, 0x00, 0xfa, 0xf6, 0x06, 0x02, 0x01, 0xfd, + 0xfd, 0x05, 0x0a, 0xfb, 0x01, 0x02, 0x10, 0x14, 0x12, 0x10, 0x12, 0x0d, + 0xff, 0xff, 0x01, 0x00, 0xfe, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x06, + 0x07, 0x09, 0x0a, 0x09, 0x0e, 0x12, 0x00, 0xfa, 0x06, 0x03, 0x00, 0x01, + 0xfb, 0xff, 0x0a, 0x09, 0x02, 0x0f, 0x20, 0x14, 0x13, 0x13, 0x05, 0xfe, + 0xfb, 0xf9, 0xf7, 0xf7, 0xf1, 0xf1, 0xf5, 0xf5, 0x00, 0xfd, 0xfb, 0x06, + 0x0b, 0x05, 0x01, 0x00, 0x00, 0x02, 0x00, 0xf7, 0xf6, 0xf2, 0xf9, 0x01, + 0x02, 0x0d, 0x07, 0xff, 0x03, 0x1a, 0x1a, 0x13, 0x14, 0x0e, 0x0e, 0x14, + 0x12, 0x12, 0x0d, 0x06, 0x07, 0x06, 0xf9, 0xf0, 0xf9, 0x00, 0x03, 0x05, + 0x0d, 0x0b, 0x09, 0x02, 0xfb, 0xfd, 0x00, 0xfe, 0xfd, 0xfb, 0xf9, 0xf9, + 0xff, 0x07, 0x07, 0x07, 0x0e, 0x1b, 0x0e, 0x03, 0x00, 0x0b, 0x01, 0xfa, + 0xfe, 0xf6, 0xfe, 0x01, 0xfb, 0xfa, 0xff, 0xfb, 0xfa, 0xfa, 0x03, 0x02, + 0xf7, 0xf5, 0x05, 0x0e, 0x05, 0xfa, 0xf7, 0x03, 0x0b, 0x09, 0xfa, 0xfa, + 0x01, 0x0d, 0x0e, 0x02, 0x1b, 0x21, 0x20, 0x21, 0x14, 0x10, 0x0d, 0x13, + 0x10, 0x06, 0x10, 0x0e, 0x01, 0xf3, 0xed, 0xf3, 0xea, 0xf2, 0xf3, 0xfd, + 0x0d, 0x05, 0x00, 0x07, 0x07, 0x02, 0xfd, 0xf7, 0xf6, 0xf3, 0x01, 0x00, + 0x05, 0x0a, 0xff, 0x05, 0x1b, 0x16, 0x13, 0x09, 0x02, 0x06, 0xff, 0xfe, + 0x00, 0xfb, 0xf2, 0xfb, 0x03, 0x01, 0x09, 0x01, 0xf9, 0x00, 0xff, 0xfe, + 0xfb, 0x00, 0x03, 0x0b, 0x01, 0x02, 0x0a, 0x06, 0x05, 0x02, 0x0a, 0x0e, + 0x17, 0x0d, 0x05, 0x17, 0x23, 0x18, 0x0f, 0x10, 0x10, 0x0f, 0x12, 0x03, + 0x00, 0x01, 0x03, 0xfa, 0xf5, 0xf6, 0xfe, 0x05, 0x02, 0x00, 0xf9, 0xfa, + 0xf9, 0xf0, 0xf3, 0xfb, 0xf9, 0xf6, 0xf3, 0xf2, 0xf7, 0xf1, 0xf1, 0x02, + 0x0e, 0x1b, 0x13, 0x1f, 0x07, 0x00, 0x01, 0xfd, 0xfd, 0x06, 0x12, 0x13, + 0x0b, 0x07, 0x06, 0x06, 0x06, 0x02, 0x00, 0x01, 0x06, 0x0b, 0x00, 0xf7, + 0xfa, 0xfe, 0xff, 0xfe, 0x01, 0x03, 0x02, 0x03, 0x05, 0x00, 0x05, 0x10, + 0x06, 0x03, 0x0f, 0x34, 0x30, 0x28, 0x1d, 0x13, 0x0e, 0x0a, 0x07, 0x07, + 0x00, 0xfd, 0xfb, 0xf7, 0xec, 0xee, 0xed, 0xf0, 0xee, 0xf9, 0xfd, 0xf1, + 0xe5, 0xe5, 0xee, 0xf1, 0xee, 0xee, 0xf3, 0xf9, 0xfb, 0xfe, 0x03, 0x09, + 0x12, 0x1b, 0x24, 0x21, 0x1a, 0x1a, 0x16, 0x0e, 0x02, 0xfd, 0x01, 0x09, + 0x0d, 0x07, 0x0a, 0x0d, 0x06, 0x05, 0x0b, 0x0a, 0x01, 0xff, 0x05, 0x07, + 0x0f, 0x06, 0x0a, 0xfe, 0xf7, 0xf6, 0xf7, 0x02, 0xfb, 0xfa, 0x06, 0x01, + 0xff, 0x10, 0x23, 0x13, 0x0d, 0x06, 0x13, 0x17, 0x0b, 0xfd, 0xf6, 0xf0, + 0xf5, 0xf6, 0xf2, 0xf2, 0x02, 0xff, 0x06, 0x01, 0x00, 0x00, 0xfa, 0xf1, + 0xec, 0xed, 0xf7, 0xf5, 0x01, 0x06, 0x03, 0x02, 0xfe, 0x07, 0x07, 0x09, + 0x05, 0x1a, 0x18, 0x16, 0x16, 0x0d, 0x0a, 0x0a, 0x32, 0x31, 0x1d, 0x0e, + 0x07, 0x06, 0x09, 0x03, 0xff, 0xfe, 0x03, 0x00, 0xf3, 0xf0, 0xf6, 0xf7, + 0xf1, 0xf3, 0xfb, 0xf7, 0xf3, 0xf5, 0xee, 0xee, 0x00, 0x02, 0xfd, 0xfe, + 0x1c, 0x2c, 0x21, 0x17, 0x13, 0x1b, 0x13, 0x02, 0x05, 0x0e, 0x12, 0x0d, + 0xfb, 0xf5, 0xed, 0xed, 0xe4, 0xe8, 0xec, 0xfd, 0x05, 0xf7, 0xf5, 0xf7, + 0xf9, 0xf3, 0xf2, 0xf1, 0x0d, 0x17, 0x18, 0x1b, 0x14, 0x0b, 0x06, 0x0a, + 0x21, 0x21, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x07, 0x06, 0x01, 0x03, 0x13, + 0x12, 0x0e, 0x02, 0x02, 0x09, 0x07, 0x03, 0x03, 0x0d, 0x17, 0x0f, 0x07, + 0xfe, 0xff, 0xfd, 0xf3, 0xf2, 0xf0, 0xec, 0x00, 0xfd, 0xf3, 0xf3, 0x03, + 0x07, 0x09, 0x00, 0xf3, 0xf5, 0xf9, 0xee, 0xee, 0xf7, 0xf1, 0xfe, 0x01, + 0x14, 0x3b, 0x28, 0x17, 0x12, 0x06, 0xf7, 0xfb, 0x06, 0x06, 0x02, 0xff, + 0xfb, 0x01, 0x06, 0x0b, 0x0d, 0x10, 0x0b, 0x0d, 0x03, 0x03, 0x0e, 0x1a, + 0x16, 0x0b, 0x03, 0xff, 0xfd, 0x13, 0x0a, 0x0b, 0x0b, 0x06, 0x07, 0xff, + 0xfe, 0xfb, 0x12, 0x17, 0x0e, 0xfe, 0xf6, 0xe9, 0xe5, 0xe9, 0xea, 0xe4, + 0xe3, 0xed, 0xee, 0xf1, 0x07, 0x05, 0x05, 0xfe, 0xfe, 0x13, 0x21, 0x25, + 0x21, 0x20, 0x24, 0x12, 0x0e, 0x10, 0x03, 0xfd, 0xf5, 0xf7, 0xfa, 0xf7, + 0xf3, 0xf5, 0xfa, 0xfe, 0x07, 0x00, 0x06, 0x06, 0x0a, 0x05, 0xfd, 0xfa, + 0xfa, 0x16, 0x16, 0x1a, 0x14, 0x14, 0x13, 0x01, 0xfb, 0x03, 0x10, 0x0f, + 0x0f, 0x06, 0x01, 0x00, 0xff, 0xfa, 0xfa, 0xf2, 0xec, 0xec, 0xe9, 0xf3, + 0x09, 0x0a, 0x03, 0x01, 0x09, 0x30, 0x30, 0x1b, 0x1a, 0x10, 0xea, 0xe3, + 0xe4, 0xf7, 0xf9, 0xee, 0xf6, 0x0b, 0x05, 0x02, 0x07, 0x10, 0x07, 0x05, + 0x02, 0xfe, 0x00, 0x09, 0x14, 0x0a, 0xf7, 0xee, 0xf5, 0x0b, 0x0b, 0xff, + 0x00, 0x06, 0x0b, 0x01, 0xf6, 0xfd, 0x0f, 0x1a, 0x0d, 0x0a, 0x06, 0x03, + 0xfd, 0x07, 0x13, 0x13, 0x10, 0x09, 0x05, 0x09, 0x2c, 0x1d, 0x07, 0x09, + 0x03, 0x12, 0x14, 0x09, 0xff, 0xff, 0xfb, 0xf3, 0xee, 0xf0, 0xec, 0xe5, + 0xe5, 0xe1, 0xec, 0xfa, 0xee, 0xdd, 0xd9, 0xe8, 0x12, 0x0a, 0xfe, 0xfe, + 0x10, 0x12, 0x05, 0x0d, 0x0a, 0x1b, 0x2c, 0x25, 0x2d, 0x28, 0x25, 0x24, + 0x1a, 0x17, 0x0b, 0x07, 0x07, 0x06, 0x02, 0x03, 0xfa, 0xe4, 0xe4, 0xe4, + 0xed, 0xea, 0xe5, 0xe9, 0x02, 0x03, 0xf6, 0xf1, 0xf2, 0x13, 0x34, 0x1d, + 0x1c, 0x23, 0x1d, 0x03, 0xfa, 0xfb, 0x01, 0x0b, 0x09, 0x06, 0x0d, 0x05, + 0x00, 0x00, 0xfb, 0xf9, 0xf2, 0xf2, 0xee, 0xf2, 0xfd, 0xfe, 0xfd, 0xff, + 0xfa, 0x09, 0x1c, 0x0b, 0x01, 0x09, 0x07, 0xf7, 0xe8, 0xf1, 0xf5, 0x0f, + 0x1d, 0x1d, 0x1d, 0x0a, 0x02, 0x00, 0x06, 0x12, 0x0e, 0x14, 0x0e, 0x0d, + 0x16, 0x14, 0x05, 0xfa, 0xf5, 0xfd, 0x13, 0x0e, 0x03, 0xfe, 0xfe, 0xf7, + 0xf6, 0xf3, 0xf6, 0xee, 0xea, 0xea, 0xee, 0xfb, 0xfa, 0xf6, 0xee, 0xf6, + 0x14, 0x25, 0x1a, 0x18, 0x1f, 0x1b, 0x23, 0x02, 0xff, 0x1a, 0x28, 0x17, + 0x0f, 0x12, 0x1a, 0x07, 0x02, 0xfe, 0xfd, 0xf2, 0xf0, 0xec, 0xec, 0xf1, + 0xfa, 0xec, 0xdf, 0xdf, 0xdc, 0xe3, 0xe5, 0xed, 0x05, 0xfa, 0xf3, 0xfd, + 0x06, 0x17, 0x3f, 0x2e, 0x2d, 0x3a, 0x32, 0x27, 0x25, 0x23, 0x21, 0x17, + 0x0f, 0x0f, 0x0e, 0x0e, 0x0b, 0x06, 0xf6, 0xe3, 0xe4, 0xe5, 0xe5, 0xee, + 0xf2, 0xf0, 0xec, 0xe8, 0xe3, 0xe5, 0xfe, 0xfa, 0xf9, 0x01, 0x07, 0x07, + 0xf9, 0xf1, 0xf1, 0x00, 0x1b, 0x31, 0x2a, 0x1d, 0x17, 0x17, 0x09, 0x02, + 0x01, 0x01, 0x03, 0x0f, 0x0f, 0x07, 0xfd, 0xfd, 0xff, 0x00, 0x0f, 0x0b, + 0x09, 0x0a, 0x00, 0xfd, 0xfe, 0xf3, 0xe5, 0xec, 0xed, 0xfb, 0x17, 0x0a, + 0x0d, 0x0a, 0xfe, 0xf9, 0x12, 0x21, 0x1c, 0x28, 0x2a, 0x1a, 0x06, 0xf2, + 0xf6, 0xf9, 0x0a, 0x0b, 0x09, 0x0b, 0x03, 0xf5, 0xf5, 0xf3, 0xed, 0xee, + 0xec, 0xee, 0xf0, 0xec, 0xe8, 0xee, 0xed, 0xf1, 0x02, 0x03, 0x05, 0x1c, + 0x1d, 0x0e, 0x06, 0x10, 0x09, 0x0a, 0x37, 0x37, 0x30, 0x2d, 0x29, 0x17, + 0x0e, 0x0a, 0xff, 0x00, 0xfd, 0xfa, 0xfa, 0xf3, 0xf5, 0xf0, 0xe6, 0xe5, + 0xe5, 0xe8, 0xf3, 0xf7, 0xf2, 0xed, 0xea, 0xf2, 0x00, 0x02, 0x0b, 0x0b, + 0x18, 0x20, 0x27, 0x1a, 0x0f, 0x14, 0x0f, 0x18, 0x20, 0x18, 0x1a, 0x14, + 0x0e, 0x0d, 0x09, 0xf1, 0xe4, 0xe9, 0xfd, 0xfe, 0xf9, 0xf3, 0xf2, 0xfa, + 0xf6, 0x01, 0x0a, 0xfb, 0xfd, 0x00, 0x05, 0x09, 0xee, 0xee, 0xf0, 0xf2, + 0xf5, 0x02, 0x17, 0x10, 0x13, 0x0f, 0x09, 0x02, 0x05, 0x17, 0x13, 0x12, + 0x16, 0x1d, 0x12, 0x00, 0xf7, 0x07, 0x18, 0x10, 0x13, 0x1c, 0x16, 0x0e, + 0x03, 0x01, 0xf6, 0xe4, 0xf1, 0xf9, 0x06, 0xfe, 0xf2, 0xf2, 0xf5, 0xf9, + 0xfa, 0x0a, 0x0e, 0x0a, 0x09, 0x03, 0xf5, 0xe4, 0xe1, 0xee, 0x12, 0x05, + 0x09, 0x20, 0x1b, 0x16, 0x0d, 0x00, 0xf7, 0xfa, 0xfa, 0x03, 0x05, 0x06, + 0x02, 0xff, 0xfe, 0xf9, 0xff, 0x14, 0x0d, 0x02, 0x00, 0xfd, 0xfa, 0x02, + 0x10, 0x0d, 0x0b, 0x21, 0x2d, 0x29, 0x18, 0x0a, 0x0d, 0x09, 0x03, 0x09, + 0x0f, 0x02, 0x05, 0x0a, 0xfe, 0xf3, 0xe5, 0xe1, 0xe3, 0xf1, 0xf1, 0xf2, + 0xf2, 0xf2, 0xf0, 0xf6, 0xfa, 0xff, 0x06, 0x01, 0x09, 0x07, 0x05, 0x12, + 0x0d, 0x0a, 0x09, 0x0a, 0x23, 0x21, 0x17, 0x18, 0x0f, 0x01, 0x05, 0x0a, + 0x07, 0x0b, 0x02, 0x03, 0xff, 0xfb, 0xf7, 0xf9, 0xf7, 0x00, 0x03, 0x06, + 0x10, 0x12, 0x0f, 0x0b, 0xf3, 0xee, 0xf0, 0xf0, 0xf3, 0xf3, 0x09, 0x10, + 0x07, 0x07, 0x05, 0x06, 0x12, 0x1b, 0x0e, 0x05, 0x00, 0xff, 0xf5, 0xf2, + 0xfb, 0x0a, 0x17, 0x0e, 0x17, 0x16, 0x06, 0x01, 0x00, 0x05, 0xff, 0xec, + 0xe1, 0x02, 0x12, 0x0a, 0xfb, 0xf6, 0xfa, 0x07, 0x12, 0x18, 0x1f, 0x16, + 0x0f, 0x06, 0xfa, 0xed, 0xf1, 0x00, 0x0a, 0x06, 0x0a, 0x03, 0xff, 0xf7, + 0xec, 0xed, 0xf6, 0x02, 0xff, 0x00, 0xff, 0xfa, 0x00, 0x03, 0x03, 0x0e, + 0x1f, 0x17, 0x17, 0x14, 0x0f, 0x06, 0x07, 0x06, 0x0a, 0x2c, 0x18, 0x0e, + 0x23, 0x1f, 0x10, 0x00, 0xff, 0xfd, 0xfb, 0x02, 0xfb, 0xf9, 0xfe, 0xfb, + 0xf1, 0xd3, 0xd2, 0xe1, 0xf3, 0xf1, 0xe8, 0xe9, 0xe4, 0xf1, 0xf9, 0xfb, + 0x0d, 0x1a, 0x0d, 0x0f, 0x21, 0x24, 0x17, 0x0e, 0x1b, 0x23, 0x18, 0x14, + 0x10, 0x10, 0x18, 0x0b, 0x0f, 0x09, 0x07, 0x0d, 0x16, 0x02, 0xf2, 0xfb, + 0xfb, 0xed, 0xe6, 0xe5, 0xec, 0x01, 0x0e, 0x06, 0x17, 0x1c, 0x1a, 0x02, + 0xf1, 0xf9, 0xfa, 0xf0, 0xe9, 0xec, 0xfe, 0x0b, 0x12, 0x14, 0x0a, 0x0e, + 0x05, 0x01, 0x03, 0x01, 0xff, 0xf9, 0xf5, 0xf3, 0xf5, 0x0e, 0x09, 0x09, + 0x14, 0x18, 0x0e, 0x02, 0xf7, 0xf7, 0xfd, 0x0a, 0x03, 0x07, 0x09, 0x0d, + 0x09, 0xff, 0x00, 0x0e, 0x0d, 0x02, 0x0d, 0x1b, 0x23, 0x1d, 0x07, 0xf6, + 0xf9, 0x0d, 0x03, 0x02, 0x00, 0x06, 0xff, 0xfb, 0xf6, 0xf7, 0xfa, 0xfa, + 0xf7, 0xf6, 0xf7, 0xf9, 0xf3, 0xed, 0xf2, 0xfe, 0x14, 0x17, 0x18, 0x16, + 0x07, 0x01, 0xfd, 0xf3, 0xfe, 0x1d, 0x24, 0x14, 0x12, 0x27, 0x1a, 0x09, + 0x01, 0x02, 0x01, 0x09, 0x01, 0xfe, 0xff, 0x01, 0x06, 0xf7, 0xfe, 0xfb, + 0xf5, 0xf0, 0xe4, 0xe8, 0xe4, 0xe0, 0xe3, 0xea, 0xf6, 0x0e, 0x1c, 0x1a, + 0x13, 0x16, 0x12, 0x09, 0x07, 0x0d, 0x10, 0x23, 0x21, 0x1d, 0x20, 0x18, + 0x24, 0x24, 0x20, 0x16, 0x0a, 0x05, 0xf9, 0xee, 0xf2, 0xea, 0xea, 0xec, + 0xf7, 0x05, 0x01, 0xfa, 0xf1, 0xfb, 0x03, 0xfd, 0xec, 0xe3, 0xe3, 0xf7, + 0xfb, 0xf0, 0xf2, 0xf1, 0xfe, 0x0b, 0x1d, 0x1b, 0x14, 0x14, 0x10, 0x1a, + 0x1a, 0x12, 0x0f, 0x03, 0x01, 0x14, 0x16, 0x0e, 0x05, 0x0a, 0x10, 0x05, + 0xfe, 0xfb, 0xf9, 0xf5, 0xff, 0xfd, 0xf7, 0xf3, 0xf0, 0xff, 0x02, 0xff, + 0x0b, 0x18, 0x0e, 0x1a, 0x18, 0x16, 0x0b, 0x00, 0x01, 0x12, 0x0a, 0x0b, + 0x03, 0x07, 0x10, 0x01, 0xfa, 0xf2, 0xf3, 0xf0, 0xf1, 0xf3, 0xf2, 0xf1, + 0xee, 0xfb, 0xfe, 0x00, 0x01, 0x01, 0x00, 0xff, 0xfd, 0x07, 0x05, 0xfd, + 0xff, 0x1d, 0x36, 0x34, 0x1d, 0x12, 0x14, 0x0f, 0x09, 0x01, 0x00, 0x01, + 0x0b, 0x10, 0x07, 0x06, 0xff, 0x09, 0x02, 0x02, 0xff, 0xf5, 0xec, 0xec, + 0xe5, 0xe1, 0xe0, 0xf2, 0x0e, 0x18, 0x0b, 0x06, 0xff, 0x05, 0x0e, 0x02, + 0xfb, 0xfd, 0x0a, 0x21, 0x21, 0x1d, 0x1b, 0x16, 0x0a, 0x17, 0x18, 0x10, + 0x03, 0xfe, 0x0b, 0x02, 0xf1, 0xe9, 0xe9, 0xed, 0xfd, 0x02, 0xfa, 0xfb, + 0x02, 0x00, 0x09, 0x09, 0xfe, 0xfb, 0xf9, 0xf9, 0xfa, 0xf2, 0xec, 0xec, + 0xf2, 0x05, 0x10, 0x10, 0x14, 0x1d, 0x1a, 0x10, 0x0b, 0x0a, 0x05, 0x07, + 0x14, 0x12, 0x09, 0x0b, 0x0e, 0x0d, 0x16, 0x12, 0x10, 0x0b, 0x07, 0x01, + 0xf7, 0xff, 0x03, 0xe6, 0xe4, 0xf5, 0x03, 0x02, 0xff, 0x05, 0x00, 0xfb, + 0x02, 0x06, 0xf9, 0xf5, 0x05, 0x1a, 0x1b, 0x0d, 0x01, 0xf5, 0xf9, 0xfa, + 0xf3, 0xf3, 0xf6, 0xf9, 0xfe, 0x03, 0x01, 0x06, 0x0a, 0x0d, 0x13, 0x07, + 0x06, 0x0a, 0x09, 0x07, 0xff, 0xfb, 0xfa, 0xfe, 0x0e, 0x1b, 0x0f, 0x10, + 0x18, 0x13, 0xf9, 0xfd, 0x03, 0x0a, 0x0a, 0x14, 0x0f, 0x07, 0x05, 0x09, + 0x14, 0x0f, 0x05, 0xfd, 0xf7, 0xfb, 0xfe, 0xff, 0xec, 0xea, 0xf1, 0xfb, + 0x02, 0x07, 0xff, 0xf6, 0xf3, 0xf9, 0xf7, 0xfb, 0x03, 0x0a, 0x0b, 0x0f, + 0x09, 0x03, 0x01, 0x02, 0x0a, 0x1c, 0x29, 0x1d, 0x1a, 0x1f, 0x1f, 0x13, + 0xfe, 0xe9, 0xed, 0xf1, 0xf7, 0x02, 0xfd, 0xf7, 0xfe, 0x06, 0x09, 0x0d, + 0x0d, 0x06, 0xfb, 0xf3, 0xf3, 0xf5, 0xf1, 0xec, 0xee, 0xfe, 0x0f, 0x18, + 0x0b, 0x07, 0x10, 0x1a, 0x12, 0x07, 0x0a, 0x09, 0x0a, 0x0f, 0x18, 0x14, + 0x07, 0x03, 0x02, 0x09, 0x0f, 0x03, 0xfe, 0xf9, 0xf3, 0x00, 0x00, 0xfd, + 0xf3, 0xf3, 0xfb, 0xfa, 0xf1, 0xf1, 0xf7, 0xfb, 0x02, 0x10, 0x10, 0x03, + 0x0d, 0x0f, 0x09, 0x12, 0x0d, 0x0b, 0x00, 0xf3, 0xff, 0xff, 0x00, 0x02, + 0x00, 0xfd, 0xff, 0x00, 0x01, 0x09, 0x07, 0x07, 0x07, 0x06, 0x0b, 0x0a, + 0x07, 0x09, 0x0a, 0x02, 0x03, 0x0f, 0x0d, 0x12, 0x18, 0x18, 0x06, 0xfa, + 0xfb, 0x06, 0x12, 0x06, 0x01, 0xfe, 0x01, 0x00, 0xff, 0x07, 0x06, 0x05, + 0xf7, 0xfe, 0x02, 0x00, 0xf7, 0xf1, 0xe4, 0xe0, 0xe1, 0xfa, 0xf9, 0xf2, + 0xfe, 0x07, 0x06, 0x01, 0x0d, 0x0f, 0x0f, 0x0d, 0x17, 0x1a, 0x12, 0x07, + 0x09, 0x12, 0x20, 0x25, 0x1b, 0x16, 0x14, 0x0b, 0x05, 0x02, 0xf9, 0xe1, + 0xe6, 0xf9, 0xfd, 0x00, 0xff, 0x02, 0xfb, 0xfd, 0x0f, 0x16, 0x0e, 0xff, + 0xed, 0xe9, 0xf0, 0x02, 0xfe, 0xf7, 0x03, 0x0b, 0x14, 0x18, 0x0d, 0x06, + 0x0b, 0x10, 0x06, 0x01, 0xfe, 0x10, 0x09, 0x03, 0x01, 0x06, 0xfe, 0xf7, + 0x03, 0x09, 0x02, 0x02, 0x0d, 0x05, 0xfb, 0xfb, 0x00, 0x03, 0xfe, 0xff, + 0x01, 0xfb, 0xf2, 0xf5, 0x0a, 0x0e, 0x09, 0x0a, 0x0f, 0x14, 0x13, 0x06, + 0x0a, 0x0b, 0x09, 0xfd, 0xfe, 0xfb, 0xfd, 0xff, 0xfe, 0xf9, 0xf5, 0xfe, + 0x0d, 0x09, 0x0e, 0x10, 0x0d, 0x09, 0x0b, 0x0d, 0x14, 0x0b, 0x01, 0xfa, + 0xf7, 0xfd, 0x00, 0xfe, 0xff, 0x01, 0x09, 0x09, 0x13, 0x0e, 0xfd, 0x03, + 0x09, 0xff, 0xfd, 0xfa, 0xfb, 0xfe, 0x09, 0x14, 0x14, 0x09, 0xff, 0xfa, + 0x05, 0x07, 0x00, 0xf1, 0xe0, 0xe5, 0xf1, 0x02, 0x06, 0x02, 0xfe, 0xfa, + 0x07, 0x0b, 0x07, 0x09, 0x03, 0xfb, 0x02, 0x10, 0x1a, 0x13, 0x16, 0x2a, + 0x2a, 0x21, 0x1d, 0x21, 0x10, 0x03, 0x01, 0xf9, 0xee, 0xea, 0xfd, 0xfb, + 0xfa, 0xfe, 0x02, 0xfd, 0xfd, 0x01, 0xff, 0x01, 0xff, 0xfd, 0xed, 0xec, + 0xed, 0xf5, 0xfd, 0x05, 0xfd, 0xfa, 0xfb, 0xff, 0x0a, 0x14, 0x14, 0x0e, + 0x09, 0x0d, 0x1b, 0x14, 0x10, 0x10, 0x0a, 0x07, 0x0b, 0x0d, 0x02, 0x06, + 0x0a, 0x03, 0xfb, 0xf6, 0xfd, 0xf9, 0x01, 0x13, 0xfd, 0xf1, 0xfa, 0x02, + 0xff, 0xfe, 0xfe, 0xff, 0xfa, 0x07, 0x18, 0x13, 0x07, 0x02, 0x12, 0x13, + 0x16, 0x17, 0x06, 0xff, 0xfe, 0xfa, 0xfa, 0xf7, 0xf6, 0xfa, 0x00, 0x14, + 0x0e, 0x0d, 0x05, 0x00, 0xff, 0x02, 0x03, 0xfe, 0xf5, 0xe9, 0xf1, 0xf9, + 0x0a, 0x0b, 0xfb, 0xfa, 0x0b, 0x18, 0x17, 0x0d, 0x00, 0x02, 0xfe, 0x05, + 0x0f, 0x0e, 0x0d, 0x17, 0x17, 0x17, 0x12, 0x0e, 0x06, 0xf2, 0xf6, 0xfd, + 0xf0, 0xe1, 0xe8, 0xf3, 0xf0, 0xf7, 0x01, 0x00, 0x0a, 0x13, 0x0b, 0x03, + 0x06, 0x05, 0x03, 0x00, 0x09, 0x12, 0x16, 0x1f, 0x25, 0x1d, 0x16, 0x13, + 0x07, 0x09, 0x06, 0x05, 0xf9, 0xf9, 0xfb, 0xf6, 0xf1, 0xf5, 0xff, 0xf6, + 0xfd, 0xff, 0xf5, 0xf7, 0x02, 0x03, 0xfa, 0xfb, 0xf5, 0xff, 0x05, 0x0b, + 0x05, 0xfa, 0xf7, 0x0a, 0x0e, 0x07, 0x06, 0x0a, 0x13, 0x0f, 0x0b, 0x13, + 0x09, 0x03, 0x0a, 0x0e, 0x17, 0x17, 0x0e, 0x07, 0x03, 0x06, 0x05, 0x01, + 0x00, 0x00, 0x01, 0xff, 0x0a, 0x07, 0xff, 0xfd, 0xfe, 0xff, 0xfe, 0xfa, + 0xf3, 0xf1, 0xf3, 0x06, 0x06, 0x0e, 0x0d, 0x10, 0x16, 0x17, 0x0e, 0xfd, + 0xf3, 0xf1, 0xec, 0xed, 0xfa, 0xfd, 0x03, 0x0b, 0x10, 0x12, 0x12, 0x0f, + 0x0a, 0x06, 0x01, 0x00, 0x01, 0xfd, 0xfb, 0x0a, 0x0a, 0x05, 0x09, 0x03, + 0x06, 0x06, 0x02, 0x0b, 0x03, 0x00, 0xfb, 0x02, 0x09, 0x09, 0x07, 0x0b, + 0x09, 0x09, 0x0f, 0x13, 0x09, 0x0d, 0x0b, 0x05, 0xff, 0xf6, 0xf2, 0xf5, + 0xf7, 0xf2, 0xf9, 0xfe, 0x02, 0x0a, 0x07, 0x05, 0x05, 0x05, 0x01, 0xfd, + 0xff, 0xff, 0x0a, 0x07, 0x0b, 0x13, 0x14, 0x13, 0x0f, 0x06, 0x05, 0x05, + 0xf7, 0xf6, 0xf7, 0xfb, 0x03, 0xf7, 0xfb, 0x06, 0x0b, 0x14, 0x09, 0x03, + 0xfb, 0x00, 0xff, 0xfb, 0x02, 0x07, 0x10, 0x07, 0xfd, 0xfa, 0xf5, 0xfd, + 0x00, 0xfe, 0x00, 0xff, 0x06, 0x0e, 0x13, 0x13, 0x1a, 0x0a, 0x0f, 0x0e, + 0x0f, 0x16, 0x0e, 0x0a, 0xff, 0xff, 0xff, 0xfe, 0x03, 0x01, 0x05, 0xfb, + 0xf9, 0xfd, 0x02, 0x0b, 0x07, 0xf5, 0xfb, 0xff, 0xf3, 0xea, 0xea, 0xee, + 0xfa, 0x02, 0x12, 0x0f, 0x1f, 0x29, 0x1c, 0x10, 0x03, 0xfa, 0xf6, 0xf9, + 0x00, 0x01, 0xff, 0xfb, 0x02, 0x02, 0x09, 0x0e, 0x0d, 0x0d, 0x05, 0x00, + 0xfb, 0xf7, 0xfa, 0x00, 0x0d, 0x0b, 0x05, 0x06, 0x12, 0x1d, 0x07, 0x02, + 0x06, 0x06, 0x06, 0x12, 0x0d, 0x06, 0x0d, 0x07, 0x01, 0xff, 0xfd, 0x05, + 0x03, 0x03, 0x02, 0x00, 0xfb, 0xfe, 0xfa, 0xed, 0xe3, 0xec, 0xf6, 0xfe, + 0xfe, 0x02, 0x06, 0x06, 0x0b, 0x0f, 0x0e, 0x07, 0x06, 0x0e, 0x06, 0x05, + 0x09, 0x0d, 0x17, 0x20, 0x17, 0x18, 0x12, 0x0b, 0xfd, 0xf2, 0xf1, 0xf7, + 0xf9, 0xfb, 0xfb, 0xff, 0xff, 0x07, 0x06, 0x00, 0xf9, 0xf6, 0xf9, 0x03, + 0x12, 0x10, 0x0e, 0x18, 0x14, 0x0f, 0x06, 0xfb, 0xfd, 0xfe, 0xfd, 0xff, + 0xfd, 0x03, 0x0b, 0x07, 0x03, 0x07, 0x0a, 0x0e, 0x18, 0x13, 0x0d, 0x02, + 0xfb, 0xfd, 0xf6, 0xf6, 0xff, 0x03, 0xfa, 0xee, 0xf7, 0xfa, 0xf9, 0xfd, + 0x02, 0x0f, 0x12, 0x0a, 0x00, 0x00, 0xfe, 0xfa, 0xfb, 0xfe, 0x00, 0x05, + 0x1d, 0x2e, 0x2c, 0x1c, 0x13, 0x0b, 0xfd, 0xf3, 0xfe, 0xff, 0xff, 0xf7, + 0xf6, 0xf7, 0x00, 0x07, 0x0d, 0x0b, 0x0a, 0x09, 0xfe, 0xf9, 0xf7, 0xf2, + 0xf7, 0xfe, 0x09, 0x13, 0x18, 0x0b, 0x03, 0x02, 0x01, 0x02, 0x03, 0x0a, + 0x1b, 0x1d, 0x1b, 0x07, 0x03, 0x01, 0xfd, 0xf7, 0xf5, 0xf9, 0x00, 0x00, + 0x03, 0xfe, 0xf9, 0xfa, 0xf5, 0xf3, 0xf6, 0xf2, 0x00, 0x07, 0x03, 0x05, + 0x06, 0x02, 0x00, 0x0d, 0x16, 0x0e, 0x0f, 0x09, 0x06, 0x02, 0x02, 0x12, + 0x1b, 0x10, 0x16, 0x16, 0x06, 0x06, 0x06, 0x00, 0xf9, 0xf5, 0xfa, 0x03, + 0x0b, 0x0d, 0x10, 0x02, 0xfa, 0xfa, 0xfd, 0x02, 0xf9, 0xf5, 0x00, 0x06, + 0x05, 0x03, 0xfd, 0xfa, 0xf5, 0x00, 0x05, 0xff, 0xf6, 0xf3, 0xfd, 0x07, + 0x07, 0x0a, 0x09, 0x13, 0x24, 0x29, 0x23, 0x12, 0x07, 0x02, 0xfd, 0x00, + 0x00, 0x06, 0x03, 0xf5, 0xf6, 0xf6, 0xf2, 0xf9, 0xfe, 0x00, 0x00, 0x02, + 0x02, 0xff, 0xf6, 0xed, 0xea, 0xea, 0xfa, 0x0f, 0x1d, 0x27, 0x34, 0x2d, + 0x23, 0x20, 0x1b, 0x12, 0x0e, 0x0a, 0x0b, 0xff, 0xfb, 0xfb, 0xf5, 0xf2, + 0xf5, 0xfa, 0xfe, 0x01, 0x01, 0xfb, 0xfa, 0xf3, 0xfa, 0xfe, 0xf9, 0xf7, + 0x06, 0xfe, 0xff, 0x02, 0xfb, 0xf9, 0xff, 0x07, 0x1a, 0x1f, 0x1c, 0x1b, + 0x17, 0x16, 0x0b, 0x06, 0x07, 0x02, 0xff, 0x05, 0x01, 0x00, 0xfb, 0xf7, + 0xfb, 0xf6, 0xea, 0xee, 0x06, 0x0d, 0x03, 0xf7, 0xfe, 0x03, 0x10, 0x0f, + 0x0a, 0x01, 0xfb, 0x00, 0x0b, 0x0b, 0x00, 0xfd, 0x07, 0x18, 0x18, 0x17, + 0x0d, 0x09, 0x07, 0x01, 0xfd, 0xfa, 0xfb, 0xfe, 0x13, 0x1a, 0x10, 0x0a, + 0x0a, 0x06, 0x00, 0xf5, 0xee, 0xf2, 0xfe, 0xff, 0xfb, 0xff, 0x01, 0x03, + 0xfe, 0xf1, 0xee, 0xf2, 0xf7, 0xfe, 0x00, 0xff, 0xfe, 0xfb, 0x0b, 0x16, + 0x24, 0x2c, 0x25, 0x1a, 0x14, 0x1a, 0x14, 0x05, 0xff, 0xff, 0xff, 0xfa, + 0xfe, 0x09, 0x05, 0xfa, 0xf2, 0xfb, 0xff, 0x01, 0x03, 0xfe, 0xfe, 0xfe, + 0xfb, 0xf2, 0xee, 0xf6, 0x02, 0x0b, 0x13, 0x16, 0x14, 0x16, 0x18, 0x13, + 0x16, 0x0f, 0x0a, 0x09, 0x0a, 0x05, 0xfe, 0xf5, 0xf3, 0xf5, 0xfa, 0x02, + 0x02, 0xfe, 0x00, 0xfe, 0x01, 0xfd, 0xf6, 0xf7, 0x03, 0x07, 0x07, 0xfa, + 0xfe, 0x06, 0x06, 0x02, 0x05, 0x07, 0x0d, 0x09, 0x06, 0x0e, 0x12, 0x0a, + 0x03, 0x05, 0x02, 0x05, 0x0d, 0x09, 0x03, 0x02, 0x02, 0x01, 0xfe, 0xfa, + 0x0b, 0x0f, 0x14, 0x0d, 0x0e, 0x0f, 0x06, 0xfb, 0xf6, 0xf9, 0xf6, 0xf5, + 0xfb, 0xff, 0x03, 0x05, 0x03, 0x0f, 0x0a, 0x02, 0xf7, 0xf9, 0xfb, 0x01, + 0xfe, 0xf6, 0xfa, 0x03, 0x0e, 0x12, 0x14, 0x12, 0x13, 0x14, 0x0b, 0x0f, + 0x0a, 0x02, 0x00, 0x02, 0x05, 0x03, 0xff, 0xff, 0xfe, 0xf3, 0xe6, 0xed, + 0xf2, 0xf2, 0xf9, 0x05, 0x0a, 0x02, 0xfb, 0x09, 0x1c, 0x21, 0x17, 0x14, + 0x14, 0x18, 0x14, 0x0d, 0x0d, 0x0a, 0x03, 0xfb, 0xfe, 0xfb, 0xff, 0x01, + 0xfd, 0xff, 0x05, 0x00, 0x01, 0x00, 0x00, 0xff, 0xfd, 0xf6, 0xf2, 0xf3, + 0x02, 0x03, 0x03, 0x14, 0x24, 0x1a, 0x0e, 0x0a, 0x0b, 0x09, 0x06, 0x05, + 0x02, 0x01, 0xf9, 0xfa, 0xfb, 0xfd, 0xfb, 0xfb, 0x00, 0xff, 0xfd, 0x01, + 0x07, 0x05, 0x01, 0x06, 0x17, 0x10, 0xff, 0xfb, 0x03, 0x07, 0x07, 0x01, + 0x00, 0x02, 0x0a, 0x12, 0x0f, 0x16, 0x13, 0x0b, 0x07, 0x07, 0x0b, 0x07, + 0x05, 0xfb, 0xf2, 0xee, 0xec, 0xf2, 0xfe, 0x07, 0x09, 0x06, 0x06, 0x09, + 0x1a, 0x14, 0x0a, 0x09, 0x0d, 0x0a, 0xfd, 0xf9, 0xfa, 0xf9, 0xfb, 0xfa, + 0xfb, 0xfd, 0x06, 0x0d, 0x05, 0xf9, 0xf9, 0xff, 0x00, 0x05, 0xff, 0x06, + 0x18, 0x0d, 0x03, 0xff, 0x07, 0x0a, 0xff, 0x03, 0x0d, 0x0d, 0x0a, 0x13, + 0x0e, 0x03, 0x02, 0x09, 0x0a, 0x07, 0x06, 0xf9, 0xf7, 0xf9, 0xf9, 0xfd, + 0xfe, 0x05, 0x0d, 0x0d, 0x16, 0x0b, 0x03, 0x06, 0x1b, 0x20, 0x14, 0x0e, + 0x05, 0x02, 0xff, 0xfe, 0xf1, 0xe8, 0xec, 0xee, 0xee, 0xf6, 0x06, 0x02, + 0x00, 0xfe, 0xff, 0xfb, 0xfd, 0x03, 0x05, 0x0a, 0x13, 0x0d, 0x0a, 0x0b, + 0x12, 0x1b, 0x13, 0x0e, 0x0e, 0x09, 0x05, 0xfb, 0x01, 0x03, 0x06, 0x06, + 0x01, 0xfd, 0xfd, 0x00, 0xff, 0xf6, 0xf9, 0xf6, 0xf7, 0xfb, 0xff, 0x14, + 0x1b, 0x12, 0x07, 0xfe, 0x00, 0x02, 0x07, 0x09, 0x03, 0x01, 0x05, 0x03, + 0x0a, 0x0e, 0x09, 0x07, 0x06, 0x01, 0x01, 0x02, 0x05, 0x06, 0x09, 0x09, + 0xff, 0xfa, 0xfd, 0x01, 0x0e, 0x07, 0xf9, 0xf9, 0x02, 0x01, 0x00, 0x00, + 0x02, 0x09, 0x09, 0x02, 0xf7, 0xf2, 0xf9, 0x03, 0x06, 0x0a, 0x02, 0x03, + 0x0a, 0x09, 0x02, 0xfa, 0xfd, 0xfe, 0x00, 0x07, 0x18, 0x18, 0x0e, 0x09, + 0x14, 0x13, 0x0a, 0x09, 0x06, 0x02, 0x03, 0x03, 0x05, 0x01, 0xfe, 0xfe, + 0xf6, 0xee, 0xf9, 0x00, 0x01, 0xf3, 0xf2, 0xf6, 0x00, 0x07, 0x0e, 0x16, + 0x23, 0x20, 0x14, 0x0e, 0x0e, 0x07, 0x01, 0x09, 0x0e, 0x07, 0xff, 0xfd, + 0xf7, 0xf3, 0xf6, 0xf6, 0xf0, 0xf6, 0xf7, 0xfb, 0x00, 0xfb, 0xff, 0xfb, + 0xfa, 0xf3, 0xee, 0xfa, 0x0e, 0x14, 0x13, 0x0e, 0x12, 0x10, 0x1c, 0x2e, + 0x29, 0x17, 0x12, 0x14, 0x06, 0xff, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, + 0xfe, 0xfa, 0xfb, 0xf7, 0xf9, 0xf9, 0xff, 0x09, 0x09, 0x09, 0x05, 0xff, + 0x00, 0xf3, 0xea, 0xee, 0xf7, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x0d, 0x0f, + 0x12, 0x0d, 0x0b, 0x0a, 0x06, 0x02, 0x05, 0x0a, 0x09, 0x07, 0x07, 0x07, + 0x09, 0x0f, 0x09, 0x01, 0xff, 0x07, 0x05, 0x05, 0x03, 0x0e, 0x07, 0x01, + 0xfe, 0xfb, 0xfe, 0xf9, 0xf2, 0xf6, 0xfe, 0x03, 0xfd, 0x03, 0x0d, 0x06, + 0xff, 0x05, 0x0f, 0x0b, 0x09, 0x13, 0x0e, 0x0d, 0x0f, 0x0d, 0x03, 0x02, + 0xff, 0x03, 0x01, 0xff, 0xf7, 0xfd, 0x0e, 0x0e, 0x05, 0x05, 0x05, 0x03, + 0xfe, 0xfa, 0xff, 0xf2, 0xf1, 0xf6, 0xf6, 0xf3, 0x00, 0x1b, 0x18, 0x16, + 0x12, 0x0f, 0x09, 0x0e, 0x0b, 0x0b, 0x0b, 0x09, 0x05, 0xff, 0xfb, 0xfa, + 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0x02, 0x03, 0x03, 0x07, 0x06, 0x06, 0x03, + 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x09, 0x05, 0xff, 0x02, 0x0b, 0x1a, 0x14, + 0x05, 0x06, 0x06, 0x00, 0x09, 0x03, 0x06, 0x05, 0x05, 0x06, 0x07, 0x06, + 0xfe, 0xf7, 0xfa, 0xfb, 0xfe, 0x09, 0x01, 0x01, 0xfb, 0x00, 0xfb, 0xf2, + 0xf6, 0xf7, 0xfd, 0x06, 0xff, 0xfa, 0xf7, 0xfa, 0x05, 0x02, 0x05, 0x05, + 0x07, 0x05, 0x07, 0x0d, 0x0b, 0x0e, 0x18, 0x18, 0x1c, 0x23, 0x24, 0x1c, + 0x0d, 0x07, 0xfe, 0xfb, 0x00, 0x02, 0x00, 0xff, 0xfe, 0xfe, 0x00, 0x01, + 0xfd, 0xfd, 0x02, 0xff, 0xf6, 0xf7, 0x00, 0xff, 0x00, 0xfe, 0xf5, 0xf5, + 0xf6, 0x09, 0x17, 0x0d, 0x05, 0x06, 0x12, 0x13, 0x0b, 0x06, 0x06, 0x05, + 0x00, 0xfe, 0xfb, 0xfe, 0x02, 0x02, 0x05, 0x02, 0xfd, 0xfe, 0x03, 0x02, + 0x02, 0x02, 0x02, 0x01, 0xff, 0x09, 0x14, 0x1b, 0x13, 0x0a, 0x0a, 0x0a, + 0x02, 0xfe, 0x01, 0x06, 0x05, 0x00, 0xff, 0x07, 0x0e, 0x06, 0xff, 0xfb, + 0xf6, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x00, 0x02, 0x02, 0x07, 0x00, + 0x03, 0x06, 0x09, 0x0d, 0x0b, 0x0b, 0x0f, 0x18, 0x1a, 0x16, 0x0e, 0x03, + 0xfe, 0xf3, 0xf5, 0xf2, 0xf6, 0x00, 0x05, 0x02, 0xff, 0x09, 0x0e, 0x09, + 0x01, 0xfb, 0x06, 0x0d, 0x0a, 0x03, 0xfe, 0xfb, 0xfb, 0xf5, 0xf3, 0xf5, + 0xfb, 0xff, 0x02, 0x03, 0x0b, 0x0f, 0x14, 0x0f, 0x0b, 0x0d, 0x0a, 0x06, + 0x03, 0x02, 0x05, 0x01, 0x00, 0x01, 0x18, 0x20, 0x1a, 0x14, 0x0f, 0x18, + 0x03, 0xf9, 0xfe, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0xfe, 0xfd, 0x01, + 0xf6, 0xf2, 0xf3, 0xf5, 0xf3, 0xfa, 0x0d, 0x0a, 0x00, 0xfa, 0x00, 0x0d, + 0x0a, 0x07, 0xff, 0xfb, 0xfb, 0xf7, 0xff, 0x02, 0x12, 0x0f, 0x05, 0x01, + 0x07, 0x10, 0x13, 0x0d, 0x05, 0x05, 0x14, 0x14, 0x0e, 0x07, 0x06, 0x02, + 0xfa, 0xf7, 0xfb, 0x06, 0x09, 0x13, 0x0d, 0x0d, 0x0f, 0x05, 0x06, 0x00, + 0x05, 0x09, 0x06, 0x01, 0xfa, 0xf3, 0xf6, 0xf3, 0xf3, 0xf2, 0x00, 0xfe, + 0xfe, 0x00, 0x09, 0x0b, 0x05, 0x01, 0x02, 0x0a, 0x09, 0x06, 0x02, 0xfe, + 0xff, 0xfd, 0xff, 0x01, 0x03, 0x0f, 0x13, 0x14, 0x13, 0x13, 0x1a, 0x03, + 0xfd, 0x00, 0x06, 0x09, 0x00, 0xfb, 0xfe, 0x00, 0xfb, 0xff, 0xff, 0x0d, + 0x13, 0x0b, 0x06, 0x00, 0x03, 0x03, 0x02, 0x00, 0xf7, 0xfa, 0x03, 0x05, + 0xff, 0xf7, 0xf7, 0x00, 0x07, 0x0b, 0x09, 0x01, 0xff, 0x01, 0x0a, 0x10, + 0x09, 0x02, 0x09, 0x1b, 0x1f, 0x1c, 0x13, 0x05, 0x05, 0x03, 0xf9, 0xe6, + 0xf0, 0x02, 0x09, 0x05, 0x02, 0x01, 0xff, 0xff, 0xfd, 0x00, 0xfe, 0xfb, + 0xfa, 0xf9, 0xfa, 0xfd, 0x06, 0x02, 0x01, 0x01, 0x03, 0x06, 0x0b, 0x02, + 0x01, 0x17, 0x12, 0x0b, 0x0d, 0x0d, 0x10, 0x14, 0x0a, 0x00, 0xfa, 0xf7, + 0xfa, 0x00, 0x06, 0x12, 0x0f, 0x0b, 0x0d, 0x14, 0x13, 0x0f, 0xfd, 0xf2, + 0x05, 0x07, 0x03, 0xfe, 0xff, 0x03, 0x01, 0x06, 0x06, 0x06, 0x01, 0x01, + 0x00, 0x00, 0xfb, 0xff, 0xfe, 0x00, 0x02, 0x00, 0xfa, 0xf5, 0xf2, 0xee, + 0xed, 0xf6, 0xf9, 0xfd, 0x0d, 0x17, 0x0d, 0x06, 0x02, 0x0f, 0x0b, 0x09, + 0x09, 0x0b, 0x12, 0x1f, 0x23, 0x17, 0x13, 0x1a, 0x16, 0x07, 0xf6, 0xfa, + 0x00, 0xfe, 0xfd, 0xfe, 0x00, 0x03, 0x01, 0x05, 0x0b, 0x0b, 0x00, 0xf9, + 0xf1, 0xf9, 0xf9, 0xf7, 0xfa, 0xf7, 0x02, 0x0a, 0x07, 0x00, 0x00, 0x06, + 0x05, 0x03, 0x00, 0x09, 0x07, 0x02, 0x01, 0xff, 0x03, 0x03, 0xff, 0xfe, + 0x02, 0x12, 0x0d, 0x09, 0x07, 0x06, 0x14, 0x1c, 0x17, 0x02, 0xfb, 0x00, + 0x05, 0x07, 0xfb, 0xf9, 0xfa, 0xf6, 0xf7, 0x00, 0x0f, 0x0e, 0x07, 0x05, + 0x07, 0xff, 0x01, 0x0a, 0x06, 0x0b, 0x0f, 0x09, 0xfb, 0xf5, 0xfe, 0x07, + 0x02, 0xff, 0x05, 0x0b, 0x09, 0x06, 0xff, 0x00, 0x06, 0x05, 0x00, 0x03, + 0x09, 0x10, 0x0d, 0x07, 0x03, 0xff, 0xfe, 0x03, 0x00, 0xfa, 0x0e, 0x0d, + 0x01, 0xf9, 0xfe, 0x0f, 0x0e, 0x09, 0x0a, 0x0b, 0x01, 0xff, 0xfa, 0x00, + 0x03, 0xf7, 0xf5, 0xfe, 0x01, 0x01, 0xff, 0xf6, 0xf1, 0xf5, 0xfb, 0x05, + 0x0f, 0x14, 0x1b, 0x0f, 0x00, 0xf9, 0xf7, 0x02, 0x09, 0x07, 0x0e, 0x13, + 0x1a, 0x16, 0x1f, 0x20, 0x1c, 0x1b, 0x17, 0x0f, 0x06, 0xf5, 0xf2, 0xf2, + 0xf0, 0xf5, 0xfb, 0xf9, 0xf7, 0xf9, 0x02, 0x01, 0xfa, 0xf1, 0xee, 0xf9, + 0x07, 0x16, 0x10, 0x0b, 0x01, 0x00, 0x01, 0xfa, 0xf2, 0xf9, 0xf7, 0xf7, + 0xfb, 0x03, 0x17, 0x0b, 0x07, 0x12, 0x0f, 0x10, 0x0a, 0x09, 0x0b, 0x0d, + 0x07, 0x05, 0x05, 0x0e, 0x1b, 0x1a, 0x14, 0x12, 0x00, 0xf3, 0xf7, 0xfb, + 0x00, 0x01, 0xff, 0x07, 0x03, 0x02, 0x02, 0xfa, 0xfb, 0xfa, 0xfb, 0xf5, + 0xee, 0xfb, 0x06, 0x16, 0x17, 0x0b, 0x01, 0x01, 0xff, 0x0b, 0x07, 0x09, + 0x06, 0x00, 0xff, 0x00, 0x02, 0x02, 0x00, 0xfb, 0x01, 0xfd, 0xfb, 0xfa, + 0x03, 0x0a, 0x0a, 0x06, 0x0a, 0x14, 0x16, 0x18, 0x09, 0xf9, 0xf1, 0xf1, + 0xfa, 0x07, 0x12, 0x0f, 0x0d, 0x13, 0x12, 0x0f, 0x10, 0x10, 0x0d, 0x02, + 0xff, 0xfa, 0xf7, 0xf2, 0xf7, 0xf7, 0x00, 0xfe, 0xf0, 0xf2, 0xf5, 0x00, + 0x09, 0x02, 0xfb, 0xf7, 0xfe, 0x0b, 0x16, 0x1f, 0x1a, 0x0f, 0x0d, 0x09, + 0x07, 0x13, 0x0e, 0x10, 0x13, 0x0b, 0x07, 0x0b, 0xfe, 0xf6, 0xfa, 0x00, + 0xff, 0xf9, 0xf6, 0xf5, 0xfd, 0xfa, 0xf1, 0xf3, 0xfd, 0xfe, 0xff, 0x06, + 0x03, 0x03, 0x00, 0x05, 0x05, 0x0a, 0x0b, 0x0d, 0x01, 0x02, 0x06, 0x0a, + 0x07, 0x10, 0x09, 0x07, 0x02, 0x00, 0x00, 0x01, 0x0a, 0x1b, 0x14, 0x0b, + 0x0f, 0x14, 0x17, 0x1b, 0x13, 0x09, 0x00, 0xfd, 0xed, 0xf2, 0xf9, 0xf9, + 0xf7, 0xfa, 0xf7, 0xf9, 0xfb, 0xfa, 0xf7, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x05, 0x17, 0x07, 0x03, 0x01, 0xfe, 0x00, 0x03, 0x02, 0x00, 0xfd, 0x0a, + 0x0b, 0x06, 0x07, 0x0d, 0x0a, 0x05, 0x01, 0x01, 0x00, 0x00, 0x02, 0x03, + 0x0b, 0x09, 0x0b, 0x0e, 0x0e, 0x16, 0x0e, 0xff, 0xf2, 0xfe, 0x03, 0x06, + 0x12, 0x20, 0x1a, 0x10, 0x0a, 0x02, 0x01, 0x00, 0xfd, 0xf7, 0xf9, 0xf5, + 0xf2, 0xfd, 0xff, 0xfd, 0x00, 0x06, 0x03, 0xf3, 0xe4, 0xea, 0xfa, 0x00, + 0x05, 0x09, 0x05, 0x07, 0x0f, 0x17, 0x0f, 0x0e, 0x0d, 0x0b, 0x0e, 0x10, + 0x18, 0x16, 0x12, 0x10, 0x0e, 0x0a, 0x07, 0xfa, 0xe9, 0xf5, 0xf3, 0xf6, + 0xf3, 0xf3, 0xfe, 0x0b, 0x07, 0x03, 0x07, 0x12, 0x0b, 0x0b, 0x05, 0x00, + 0x00, 0x00, 0x03, 0x05, 0x03, 0x09, 0x09, 0x00, 0xf6, 0xfb, 0xfe, 0x00, + 0x09, 0x0e, 0x07, 0x00, 0x00, 0x07, 0x0b, 0x14, 0x0b, 0x07, 0x07, 0x07, + 0x01, 0x07, 0x0e, 0x10, 0x0e, 0x12, 0x0a, 0xf9, 0xf5, 0xfb, 0xf7, 0xf0, + 0xf6, 0xfb, 0xf9, 0xf7, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, + 0x0b, 0x0a, 0x0b, 0x10, 0x10, 0x0b, 0x16, 0x0a, 0x05, 0x02, 0x0b, 0x0d, + 0x03, 0xf9, 0xf7, 0xfb, 0xff, 0x00, 0x00, 0x0a, 0x06, 0x05, 0x0f, 0x10, + 0x0b, 0x01, 0xfe, 0x02, 0x0b, 0x07, 0x06, 0xfd, 0xfe, 0x01, 0x01, 0x07, + 0x0f, 0x0d, 0x09, 0x09, 0x06, 0x00, 0xfe, 0x00, 0x02, 0x0a, 0x05, 0xfd, + 0xf6, 0xf2, 0xf6, 0xf9, 0xf1, 0xf1, 0xf0, 0xe8, 0xf6, 0x07, 0x07, 0x0e, + 0x14, 0x0f, 0x0a, 0x13, 0x12, 0x13, 0x0f, 0x10, 0x13, 0x0e, 0x0f, 0x0d, + 0x13, 0x0f, 0x12, 0x13, 0x09, 0x03, 0x00, 0xf7, 0xf3, 0xf3, 0xf7, 0x00, + 0x05, 0x0f, 0x0a, 0x03, 0xfe, 0xf9, 0xf5, 0x02, 0x02, 0x00, 0xfd, 0x0a, + 0x03, 0x03, 0x02, 0x00, 0x00, 0x06, 0xff, 0xf5, 0xf6, 0xfa, 0xff, 0x09, + 0x13, 0x05, 0x00, 0x02, 0x07, 0x18, 0x14, 0x0d, 0x0d, 0x0f, 0x0d, 0x10, + 0x12, 0x18, 0x0b, 0x07, 0x05, 0xfe, 0xf6, 0xe3, 0xdf, 0xf0, 0xf7, 0xff, + 0x00, 0x05, 0x05, 0x01, 0x00, 0x03, 0x09, 0x09, 0x01, 0x03, 0x0b, 0x0e, + 0x0e, 0x13, 0x12, 0x0f, 0x1a, 0x13, 0x06, 0xfe, 0x03, 0x05, 0xfd, 0xf7, + 0xf6, 0xfd, 0x00, 0x05, 0x02, 0x02, 0xfa, 0xf6, 0xf3, 0xfb, 0xfd, 0xff, + 0xff, 0xff, 0x0e, 0x1c, 0x18, 0x1b, 0x10, 0x00, 0x01, 0x03, 0x00, 0x05, + 0x0d, 0x0a, 0x07, 0x03, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02, 0xfa, 0xf5, + 0xec, 0xf2, 0xfa, 0xfb, 0x02, 0x00, 0x00, 0x09, 0x00, 0x02, 0x0e, 0x0d, + 0x0a, 0x0e, 0x10, 0x0a, 0x09, 0x1a, 0x1b, 0x10, 0x07, 0x07, 0x0a, 0x0e, + 0x0b, 0x03, 0x01, 0x03, 0x00, 0xff, 0xfd, 0xf2, 0xf2, 0xf9, 0x00, 0x07, + 0x02, 0x00, 0x05, 0x00, 0x00, 0x06, 0x10, 0x0e, 0x03, 0x02, 0x02, 0xf9, + 0xf2, 0xf5, 0xf9, 0xfe, 0x00, 0xfb, 0xf7, 0x00, 0x01, 0xfa, 0xf9, 0x0a, + 0x13, 0x0a, 0x05, 0x13, 0x20, 0x18, 0x17, 0x16, 0x14, 0x1a, 0x14, 0x0f, + 0x05, 0x00, 0x06, 0x06, 0xfd, 0xfb, 0xfb, 0xee, 0xfa, 0x05, 0x06, 0x01, + 0xff, 0xf5, 0xf2, 0xf6, 0xf9, 0xfd, 0xfe, 0xfe, 0x0d, 0x0d, 0x0a, 0x13, + 0x10, 0x0f, 0x13, 0x0e, 0x07, 0x00, 0xff, 0xfe, 0xfe, 0x03, 0x00, 0xfe, + 0x01, 0x01, 0x00, 0xfe, 0xfd, 0xfd, 0xf5, 0xf7, 0x02, 0x10, 0x13, 0x0b, + 0x13, 0x1a, 0x0f, 0x06, 0x05, 0x10, 0x0a, 0xfb, 0xfe, 0xfd, 0xfb, 0x0d, + 0x0a, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x05, 0x05, 0x01, 0xf9, 0xf5, 0xf9, + 0xfb, 0xff, 0x00, 0xff, 0xf7, 0x05, 0x01, 0xfe, 0x06, 0x13, 0x13, 0x16, + 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0xff, 0xfe, 0xfe, 0x01, 0xff, 0x06, + 0x00, 0x0b, 0x0f, 0x09, 0x0a, 0x0a, 0x02, 0xf7, 0xfd, 0x06, 0x0d, 0x02, + 0x09, 0x10, 0x0d, 0x07, 0x03, 0x01, 0xf9, 0xf9, 0x00, 0xfb, 0xfb, 0xfe, + 0x00, 0x09, 0x00, 0xf7, 0xf6, 0x00, 0xfd, 0xf5, 0xf3, 0xfd, 0x09, 0x16, + 0x0d, 0x0e, 0x1a, 0x1c, 0x27, 0x29, 0x20, 0x13, 0x12, 0x0a, 0xfe, 0xfa, + 0xfd, 0xfb, 0xfb, 0xfe, 0x00, 0x00, 0xf7, 0xf3, 0xf9, 0xf9, 0xf5, 0xf9, + 0xfa, 0xfd, 0x03, 0x05, 0x0b, 0x0e, 0x14, 0x0e, 0x07, 0x07, 0x0d, 0x0f, + 0x07, 0x07, 0x01, 0xf6, 0xf7, 0x03, 0x02, 0x00, 0xfb, 0xfe, 0xff, 0xfb, + 0xfa, 0xf9, 0xff, 0x01, 0x00, 0x00, 0x07, 0x0d, 0x0d, 0x07, 0x0d, 0x16, + 0x0e, 0x16, 0x1b, 0x16, 0x1d, 0x1c, 0x0b, 0xfa, 0xf7, 0xfb, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xfe, 0xf3, 0xf1, 0x00, 0xfd, 0xf6, 0xf9, 0xfb, + 0xf3, 0xf6, 0xf5, 0x09, 0x0b, 0x09, 0x17, 0x18, 0x17, 0x10, 0x09, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x07, 0x0f, 0x12, 0x0a, 0x03, 0xff, 0x05, 0x09, + 0x03, 0x00, 0x00, 0x07, 0x0a, 0x07, 0xf9, 0xf9, 0x03, 0x0f, 0x16, 0x06, + 0x01, 0x01, 0x01, 0xfe, 0xf9, 0x00, 0x09, 0x05, 0x00, 0x00, 0xfe, 0xfb, + 0xf6, 0xf3, 0xf3, 0xfe, 0x01, 0xfd, 0x00, 0x07, 0x02, 0x05, 0x0f, 0x10, + 0x1c, 0x23, 0x21, 0x1a, 0x12, 0x09, 0x02, 0xfe, 0xf9, 0xf6, 0xfe, 0x07, + 0x05, 0x00, 0x00, 0x02, 0x07, 0x05, 0xf6, 0xfe, 0xfe, 0xfb, 0xfe, 0x00, + 0xfd, 0xfe, 0x00, 0x02, 0x0f, 0x17, 0x12, 0x0a, 0x0d, 0x0d, 0x14, 0x06, + 0x00, 0xfb, 0x00, 0x01, 0x00, 0xf6, 0xf3, 0xf6, 0xf7, 0xfd, 0xfe, 0xfd, + 0xfd, 0x07, 0x06, 0x02, 0x0a, 0x07, 0x06, 0x0a, 0x0d, 0x20, 0x1c, 0x0a, + 0x0a, 0x0d, 0x0e, 0x12, 0x0e, 0x00, 0xf1, 0xf1, 0xf6, 0x06, 0x09, 0x07, + 0x09, 0x0b, 0x09, 0x07, 0x03, 0xfd, 0xf9, 0xf3, 0xf3, 0xf1, 0xf0, 0xed, + 0xf3, 0x0d, 0x16, 0x1a, 0x10, 0x06, 0x03, 0x06, 0x00, 0xfd, 0xff, 0xfe, + 0x02, 0x05, 0x07, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x0f, 0x0f, + 0x12, 0x1a, 0x1f, 0x1a, 0x0f, 0x0d, 0x10, 0x06, 0xfe, 0xfe, 0xf9, 0xf7, + 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0x03, 0x00, 0xf7, 0xf6, 0xf9, 0xf2, 0xec, + 0xf3, 0x00, 0x05, 0x00, 0x01, 0x02, 0x00, 0x01, 0x07, 0x1c, 0x32, 0x25, + 0x21, 0x20, 0x1f, 0x14, 0x0a, 0x02, 0x00, 0x00, 0xfb, 0xf9, 0xf6, 0xf9, + 0xf6, 0x00, 0x0a, 0x07, 0x02, 0xf5, 0xf3, 0xfe, 0xf3, 0xf6, 0xfe, 0x00, + 0x00, 0x05, 0x21, 0x1c, 0x0f, 0x09, 0x07, 0x05, 0x03, 0x02, 0xf9, 0xfb, + 0x00, 0x0d, 0x0b, 0x02, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, + 0xfe, 0x05, 0x00, 0x00, 0x01, 0x07, 0x1a, 0x1f, 0x12, 0x0f, 0x07, 0x0d, + 0x12, 0x14, 0x0d, 0x05, 0x00, 0xf6, 0xf9, 0xf9, 0x00, 0x05, 0x02, 0x05, + 0x02, 0x00, 0x05, 0x07, 0xff, 0x01, 0x00, 0xfb, 0xf6, 0xf1, 0x00, 0x0d, + 0x0d, 0x07, 0x02, 0x00, 0xfe, 0xfe, 0xfb, 0xf9, 0xfb, 0x00, 0x05, 0x07, + 0x02, 0x0d, 0x07, 0x05, 0x00, 0x00, 0x00, 0x05, 0x14, 0x0d, 0x05, 0x0b, + 0x16, 0x1c, 0x1c, 0x24, 0x1b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xf3, 0xe6, 0xec, 0xf0, 0xf1, + 0x07, 0x05, 0x00, 0x00, 0xfe, 0x05, 0x06, 0x17, 0x27, 0x1a, 0x0d, 0x0e, + 0x0d, 0x07, 0x05, 0x05, 0x05, 0x0d, 0x03, 0x00, 0x02, 0x02, 0x07, 0x0d, + 0x14, 0x0f, 0x0a, 0x05, 0xf7, 0xf6, 0xf3, 0xf1, 0xf9, 0x02, 0x02, 0x01, + 0x0d, 0x07, 0x07, 0x00, 0x05, 0x05, 0xfe, 0xf6, 0xf9, 0xf9, 0xfb, 0x02, + 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0d, 0x0f, 0x0a, + 0x07, 0x10, 0x0f, 0x0d, 0x1a, 0x12, 0x06, 0x02, 0x02, 0x00, 0x02, 0x05, + 0x02, 0xfe, 0xfd, 0xfb, 0xf7, 0xff, 0x02, 0x0a, 0x03, 0x00, 0xfe, 0xfb, + 0xfe, 0x05, 0x00, 0xff, 0x07, 0x0d, 0xfb, 0xfb, 0x0d, 0x13, 0x0d, 0x07, + 0x03, 0x02, 0x02, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x05, 0x00, + 0xfe, 0xfb, 0xfd, 0x00, 0x00, 0x0d, 0x17, 0x1a, 0x14, 0x1a, 0x14, 0x12, + 0x1a, 0x21, 0x1a, 0x00, 0xf6, 0xf7, 0xfa, 0xfe, 0x0a, 0x0d, 0x00, 0xfb, + 0xfe, 0x05, 0x07, 0x00, 0xf6, 0xee, 0xee, 0xf1, 0xf0, 0xfb, 0xfb, 0xfb, + 0x00, 0x01, 0xfe, 0xf9, 0xfb, 0x07, 0x0f, 0x1f, 0x1a, 0x12, 0x0f, 0x0a, + 0x05, 0x02, 0x03, 0x01, 0x01, 0x01, 0x09, 0x0e, 0x0b, 0x10, 0x13, 0x0e, + 0x0b, 0x13, 0x06, 0xf5, 0x03, 0x09, 0x06, 0x03, 0x03, 0x0b, 0x06, 0x06, + 0xfd, 0xf7, 0xfb, 0xf6, 0xf0, 0xf0, 0xfa, 0xf2, 0xf2, 0x0a, 0x13, 0x0e, + 0x03, 0x00, 0xfd, 0xfd, 0xf7, 0xfd, 0x03, 0x03, 0x0d, 0x0b, 0x0d, 0x13, + 0x0b, 0x17, 0x1c, 0x1b, 0x10, 0x06, 0x06, 0x09, 0x09, 0x03, 0x06, 0x0d, + 0x09, 0x06, 0xfa, 0xf2, 0xf5, 0xfb, 0xfd, 0xf7, 0xf1, 0xf2, 0x01, 0x18, + 0x1d, 0x0b, 0xf2, 0xf2, 0xf2, 0x03, 0x09, 0x09, 0x03, 0xff, 0x01, 0x09, + 0x13, 0x0d, 0x06, 0x03, 0x02, 0x06, 0x0b, 0x0d, 0x07, 0x01, 0xfe, 0xfe, + 0xff, 0x03, 0x03, 0x09, 0x10, 0x16, 0x0e, 0x06, 0x01, 0x03, 0x13, 0x10, + 0x20, 0x13, 0xf6, 0xf7, 0x02, 0x01, 0xff, 0xfb, 0xf2, 0xf2, 0xff, 0x02, + 0xf7, 0xfd, 0x02, 0x00, 0x02, 0x03, 0xfd, 0x01, 0x03, 0x00, 0x00, 0xfd, + 0xfd, 0xfd, 0x0b, 0x09, 0x0e, 0x09, 0x01, 0x01, 0x03, 0x09, 0x0b, 0x03, + 0x00, 0x09, 0x25, 0x23, 0x13, 0x09, 0x06, 0x03, 0x09, 0x0b, 0x06, 0x10, + 0x13, 0x05, 0x03, 0x07, 0x06, 0x01, 0x05, 0x05, 0x01, 0x00, 0xfb, 0xf1, + 0xf6, 0xee, 0xec, 0xf6, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xf6, + 0xf6, 0xf7, 0xfe, 0x0f, 0x1a, 0x14, 0x0f, 0x07, 0x05, 0x02, 0x0d, 0x0e, + 0x09, 0x0f, 0x0a, 0x12, 0x17, 0x14, 0x0f, 0x09, 0x07, 0x07, 0x07, 0x0a, + 0x07, 0xf9, 0xf9, 0xfb, 0x05, 0x00, 0x00, 0x02, 0x03, 0x02, 0xfe, 0xf9, + 0xf2, 0xf3, 0xf7, 0x00, 0x00, 0x0a, 0x07, 0xfe, 0xfe, 0x02, 0x02, 0x00, + 0x00, 0xfe, 0x00, 0x03, 0x0f, 0x0a, 0x00, 0xff, 0x02, 0x06, 0x0d, 0x0f, + 0x0d, 0x0b, 0x07, 0x0d, 0x07, 0x02, 0x01, 0x12, 0x14, 0x1c, 0x12, 0x0d, + 0x00, 0xf5, 0xf6, 0xf6, 0xf1, 0xf1, 0xfb, 0x09, 0x02, 0x00, 0xfb, 0xf6, + 0xf6, 0xff, 0x0f, 0x07, 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, + 0x05, 0x05, 0x07, 0x0d, 0x09, 0x05, 0x00, 0x02, 0x09, 0x0a, 0x10, 0x14, + 0x0f, 0x0a, 0x02, 0xff, 0x00, 0xfe, 0x0a, 0x09, 0x0f, 0x18, 0x0d, 0x01, + 0xfb, 0xfb, 0xfd, 0x02, 0xfe, 0xf6, 0xfe, 0xfb, 0xfd, 0xf6, 0xf1, 0xf5, + 0xfe, 0x02, 0x0d, 0x05, 0x01, 0xfe, 0xf9, 0xfb, 0x02, 0x0a, 0x17, 0x0f, + 0x07, 0x05, 0x05, 0x00, 0xfe, 0xf9, 0xf6, 0x07, 0x0f, 0x0d, 0x1c, 0x1a, + 0x14, 0x17, 0x0e, 0x07, 0x05, 0x05, 0x07, 0x0f, 0x0f, 0x0a, 0x02, 0xf6, + 0xfe, 0x0a, 0x0f, 0x06, 0x00, 0xf7, 0xf9, 0xfd, 0xfe, 0xf9, 0xf6, 0xfb, + 0x00, 0xfb, 0x00, 0xfe, 0xf3, 0xf3, 0xf3, 0xf3, 0xfb, 0xff, 0xfe, 0x02, + 0x10, 0x07, 0x00, 0x07, 0x0a, 0x0f, 0x0d, 0x0b, 0x0f, 0x0e, 0x0b, 0x09, + 0x0a, 0x14, 0x12, 0x12, 0x1c, 0x0f, 0x14, 0x1c, 0x18, 0x0f, 0xfb, 0xf3, + 0xfb, 0x01, 0xfe, 0xf5, 0xec, 0xf1, 0xf3, 0xf9, 0xf3, 0xfe, 0x00, 0x00, + 0x00, 0x07, 0x07, 0xfe, 0xfa, 0xfb, 0xfb, 0xfb, 0x02, 0x02, 0x09, 0x0b, + 0x0a, 0x10, 0x07, 0x02, 0x06, 0x0d, 0x12, 0x17, 0x12, 0x0d, 0x06, 0x07, + 0x06, 0x0a, 0x05, 0x02, 0x05, 0x07, 0x0a, 0x0f, 0x07, 0xf9, 0xf1, 0xf9, + 0x00, 0xf9, 0xf3, 0xfa, 0xf9, 0xfe, 0xfe, 0xf6, 0xf3, 0xfe, 0x02, 0x07, + 0x0f, 0x07, 0x02, 0x05, 0x0d, 0x17, 0x1a, 0x14, 0x0d, 0x07, 0x03, 0x00, + 0xfe, 0xfa, 0xf6, 0xfe, 0x07, 0x03, 0x09, 0x10, 0x0f, 0x07, 0x07, 0x07, + 0x06, 0x00, 0x00, 0x02, 0x0b, 0x0b, 0x0a, 0x0a, 0x05, 0xf9, 0xf9, 0x07, + 0x0d, 0x01, 0xf6, 0xf9, 0xfb, 0xfe, 0x00, 0x00, 0x05, 0x02, 0x03, 0x00, + 0x00, 0xfb, 0xf6, 0xf1, 0xf5, 0xfb, 0x00, 0x07, 0x0a, 0x05, 0x07, 0x07, + 0x12, 0x0a, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0f, 0x07, 0x05, 0x0d, 0x0f, + 0x17, 0x1f, 0x1a, 0x17, 0x20, 0x17, 0x14, 0x12, 0x00, 0xfb, 0xfd, 0xfe, + 0xee, 0xe9, 0xf3, 0xf3, 0xf6, 0xf6, 0xfb, 0x00, 0x00, 0x00, 0xfb, 0xf6, + 0xf1, 0xf0, 0xf0, 0xea, 0xf9, 0xfb, 0xfa, 0x02, 0x07, 0x00, 0x06, 0x0b, + 0x0d, 0x0f, 0x1a, 0x23, 0x1d, 0x1a, 0x18, 0x17, 0x1a, 0x14, 0x16, 0x12, + 0x12, 0x07, 0x0a, 0x07, 0x0a, 0x06, 0x03, 0xf2, 0xf9, 0x00, 0x00, 0xf1, + 0xf3, 0xf0, 0xea, 0xf1, 0xee, 0xee, 0xec, 0xf1, 0xf9, 0x0f, 0x0e, 0x09, + 0x0e, 0x06, 0x09, 0x17, 0x1d, 0x18, 0x10, 0x0b, 0x06, 0x00, 0x02, 0x02, + 0x0d, 0x0a, 0x00, 0xfb, 0x07, 0x0a, 0x05, 0x01, 0x02, 0x00, 0x00, 0x05, + 0x07, 0x05, 0x00, 0x05, 0x17, 0x07, 0xf9, 0xf1, 0xf3, 0xfe, 0xfb, 0xf9, + 0xf9, 0xfb, 0x00, 0x00, 0x14, 0x23, 0x14, 0x03, 0x0a, 0x07, 0xfe, 0x02, + 0x02, 0xfb, 0xfd, 0x02, 0x0d, 0x0d, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, + 0x06, 0x07, 0x01, 0xfd, 0x01, 0x01, 0xff, 0xfa, 0x10, 0x16, 0x0d, 0x0d, + 0x20, 0x20, 0x16, 0x16, 0x14, 0x07, 0x00, 0x00, 0x02, 0xf6, 0xf1, 0xf1, + 0xf9, 0xfe, 0x00, 0x00, 0x00, 0xfb, 0xf3, 0xfb, 0xfb, 0xf9, 0xf1, 0xec, + 0xf6, 0xfe, 0xfb, 0xfd, 0x00, 0x05, 0x00, 0x0a, 0x12, 0x06, 0x02, 0x0b, + 0x18, 0x1d, 0x1b, 0x1d, 0x1b, 0x14, 0x14, 0x20, 0x23, 0x18, 0x0b, 0x06, + 0x06, 0x0e, 0x0a, 0x05, 0x0b, 0x00, 0xf9, 0xf3, 0xea, 0xe3, 0xe8, 0xf1, + 0xee, 0xed, 0xee, 0xf9, 0xfd, 0xf9, 0xfb, 0x0a, 0x03, 0xff, 0xff, 0x00, + 0xfd, 0xfe, 0x0e, 0x12, 0x09, 0x02, 0xff, 0xff, 0x0e, 0x1c, 0x1b, 0x13, + 0x0f, 0x0d, 0x0f, 0x0e, 0x0d, 0x07, 0x07, 0x0f, 0x0f, 0x06, 0x07, 0x10, + 0x0f, 0x07, 0x05, 0x02, 0xf3, 0xf1, 0xfb, 0xf9, 0xea, 0xea, 0xf6, 0xf2, + 0xfe, 0x03, 0x01, 0x01, 0x0d, 0x02, 0x01, 0x02, 0x01, 0x01, 0x0a, 0x0d, + 0x09, 0x0b, 0x07, 0x0e, 0x0f, 0x0d, 0x10, 0x0b, 0x06, 0x02, 0x00, 0xfd, + 0xf7, 0xf7, 0xf6, 0xf6, 0x00, 0x0f, 0x12, 0x10, 0x0b, 0x0d, 0x0f, 0x0d, + 0x0d, 0x0f, 0x0a, 0xff, 0xf6, 0x00, 0xfb, 0xed, 0xf3, 0xf9, 0x03, 0x0f, + 0x0d, 0x0b, 0x06, 0x00, 0xfe, 0x00, 0xfe, 0xff, 0x05, 0x05, 0xfd, 0xfe, + 0xfd, 0xfb, 0xfe, 0xfe, 0x01, 0x07, 0x07, 0x06, 0x0a, 0x10, 0x0b, 0x12, + 0x16, 0x12, 0x0f, 0x0b, 0x0a, 0x07, 0x0d, 0x16, 0x0f, 0x0a, 0x06, 0x06, + 0x10, 0x1b, 0x01, 0x00, 0xf9, 0xed, 0xe6, 0xe8, 0xf1, 0xf6, 0xf9, 0xf5, + 0xf1, 0xf1, 0xf0, 0xf6, 0x0d, 0x02, 0x00, 0x00, 0x02, 0xfe, 0x01, 0x02, + 0x06, 0x09, 0x05, 0x00, 0x0d, 0x0f, 0x0a, 0x13, 0x1d, 0x14, 0x10, 0x0d, + 0x0b, 0x0e, 0x18, 0x18, 0x13, 0x0f, 0x0e, 0x0d, 0x0d, 0x0a, 0x0e, 0x0e, + 0x06, 0xf5, 0xf1, 0xf5, 0xf1, 0xe5, 0xe4, 0xea, 0xfb, 0x02, 0x05, 0x07, + 0x0b, 0x02, 0xfe, 0xfe, 0xfd, 0xfb, 0xfb, 0xfb, 0xf6, 0xfe, 0x02, 0xfd, + 0x05, 0x03, 0x03, 0x09, 0x16, 0x14, 0x12, 0x0e, 0x06, 0x00, 0x00, 0x01, + 0x0e, 0x10, 0x16, 0x1a, 0x10, 0x0e, 0x07, 0x0e, 0x10, 0x17, 0x17, 0x12, + 0x01, 0xfe, 0xf9, 0xf2, 0xf6, 0xf0, 0xf3, 0xf2, 0xf5, 0xf5, 0xf9, 0x00, + 0xf9, 0xf3, 0xf6, 0xf9, 0x03, 0x10, 0x10, 0x07, 0x01, 0x05, 0x01, 0x02, + 0x07, 0x17, 0x20, 0x13, 0x09, 0x02, 0x05, 0x01, 0x05, 0x0a, 0x0f, 0x0b, + 0x0d, 0x0e, 0x0a, 0x03, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x0e, 0x0a, 0xf7, + 0xfd, 0xfb, 0xf6, 0xf3, 0xf2, 0xf5, 0xfb, 0x02, 0xff, 0xfa, 0x00, 0x00, + 0x05, 0x13, 0x0d, 0x0d, 0x0d, 0x0a, 0x07, 0xfb, 0xfa, 0xfe, 0x00, 0x02, + 0x10, 0x10, 0x10, 0x13, 0x0e, 0x0a, 0x05, 0x01, 0x06, 0x06, 0x02, 0x01, + 0xfe, 0x09, 0x16, 0x0b, 0x0a, 0x10, 0x0b, 0x0a, 0x0b, 0x0f, 0x00, 0xf7, + 0x00, 0xfd, 0xf1, 0xe9, 0xfd, 0x01, 0x00, 0xfb, 0xfd, 0x00, 0xfe, 0xfd, + 0x07, 0x05, 0x03, 0x03, 0x01, 0xfb, 0xf7, 0xf3, 0xf6, 0x01, 0xff, 0xfb, + 0x00, 0x05, 0x0f, 0x17, 0x0b, 0x06, 0x01, 0x03, 0x17, 0x1b, 0x1a, 0x21, + 0x24, 0x1d, 0x16, 0x0a, 0x0b, 0x14, 0x17, 0x0e, 0x0b, 0xf7, 0xf3, 0xee, + 0xf0, 0xfe, 0x00, 0xf2, 0xf3, 0x00, 0xfe, 0xf7, 0xf3, 0xed, 0xe9, 0xed, + 0x00, 0xff, 0xfb, 0xfe, 0x0a, 0x00, 0xfd, 0xfb, 0x00, 0x01, 0x10, 0x12, + 0x14, 0x0b, 0x0e, 0x14, 0x0d, 0x13, 0x12, 0x13, 0x14, 0x16, 0x0e, 0x07, + 0x07, 0x07, 0x00, 0xff, 0x13, 0x1c, 0x18, 0x0a, 0xfd, 0xf2, 0xf2, 0xf6, + 0xfb, 0xf6, 0xea, 0xe6, 0xe9, 0xf5, 0xf6, 0xf3, 0xf1, 0xff, 0x0f, 0x0b, + 0x02, 0x07, 0x0e, 0x0a, 0x0b, 0x05, 0x02, 0x09, 0x20, 0x21, 0x17, 0x12, + 0x16, 0x0e, 0x07, 0x01, 0x03, 0x03, 0x05, 0x05, 0x00, 0xfd, 0xf9, 0xfb, + 0xf6, 0xf7, 0x05, 0xff, 0xf9, 0x02, 0x0d, 0x00, 0xfb, 0x00, 0xfb, 0xfe, + 0x0e, 0x0a, 0xfb, 0x00, 0x0d, 0x07, 0x05, 0x06, 0x07, 0x0a, 0x0f, 0x0e, + 0x06, 0x00, 0xfd, 0xf7, 0xf6, 0xf6, 0x02, 0x00, 0x00, 0x07, 0x05, 0x01, + 0xff, 0x01, 0xfd, 0xfe, 0x0e, 0x0a, 0x05, 0x0b, 0x25, 0x20, 0x16, 0x12, + 0x0f, 0x0f, 0x0f, 0x10, 0x0e, 0x0a, 0x00, 0xf6, 0xf7, 0xfe, 0x05, 0x07, + 0x00, 0xf6, 0xed, 0xf0, 0xed, 0xe9, 0xe6, 0xf2, 0x06, 0x09, 0x0a, 0x05, + 0x01, 0xff, 0xf9, 0xf9, 0xf7, 0xfb, 0xfe, 0x02, 0x03, 0x0d, 0x0b, 0x0b, + 0x0b, 0x0a, 0x0b, 0x1f, 0x1c, 0x1c, 0x16, 0x16, 0x1a, 0x17, 0x12, 0x16, + 0x1f, 0x17, 0x0f, 0x0a, 0x05, 0xf5, 0xed, 0xf1, 0xf9, 0xf3, 0xf7, 0xfe, + 0xfb, 0xed, 0xe6, 0xea, 0xea, 0xe6, 0xf2, 0x02, 0xfe, 0xfd, 0x02, 0x09, + 0x03, 0xfd, 0xfe, 0x09, 0x1b, 0x13, 0x0e, 0x0e, 0x10, 0x16, 0x17, 0x1f, + 0x17, 0x10, 0x13, 0x13, 0x07, 0x00, 0xfb, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, + 0x09, 0x07, 0x03, 0x02, 0xfa, 0xf6, 0xfb, 0x02, 0x0d, 0x02, 0xfe, 0x02, + 0x09, 0xfb, 0xfe, 0x07, 0xff, 0xfd, 0x00, 0x07, 0x03, 0xff, 0xfe, 0x07, + 0x00, 0xfe, 0x01, 0x0a, 0x10, 0x09, 0x05, 0x03, 0x00, 0xfe, 0x01, 0x06, + 0x10, 0x0a, 0x0e, 0x0b, 0x0b, 0x12, 0x0e, 0x07, 0x02, 0x03, 0xff, 0xff, + 0xfb, 0x02, 0x0d, 0x00, 0xfa, 0xfa, 0xfd, 0x02, 0x0d, 0x0a, 0x07, 0x00, + 0xf7, 0xf9, 0xfb, 0x00, 0x0b, 0x09, 0x00, 0x00, 0x03, 0x01, 0xfe, 0xfe, + 0xfb, 0xfe, 0x00, 0x07, 0x0e, 0x05, 0x01, 0xfe, 0xfe, 0x00, 0xfe, 0xfe, + 0x02, 0x0a, 0x1b, 0x1b, 0x0f, 0x13, 0x18, 0x1b, 0x24, 0x20, 0x14, 0x0e, + 0x09, 0x06, 0x00, 0x00, 0xf9, 0xfd, 0xff, 0xfd, 0xf9, 0xf2, 0xee, 0xe9, + 0xdf, 0xe1, 0xe6, 0xf0, 0xfd, 0x0e, 0x07, 0x03, 0x01, 0x00, 0x00, 0xff, + 0x05, 0x09, 0x0d, 0x09, 0x12, 0x13, 0x14, 0x16, 0x17, 0x0f, 0x0f, 0x0f, + 0x12, 0x0d, 0x03, 0x00, 0x05, 0x0b, 0x09, 0x09, 0x07, 0x06, 0x06, 0x03, + 0x00, 0xf5, 0xf6, 0xff, 0x0a, 0x09, 0x09, 0x03, 0x03, 0x03, 0x03, 0xfe, + 0xf7, 0xf0, 0xf3, 0xfa, 0xfb, 0x01, 0xfe, 0xfd, 0x00, 0x00, 0xfa, 0xfb, + 0x00, 0x01, 0x0a, 0x05, 0xfe, 0x01, 0x03, 0x10, 0x24, 0x1f, 0x17, 0x13, + 0x0f, 0x0d, 0x13, 0x0e, 0x0d, 0x07, 0x05, 0x02, 0x02, 0x00, 0xfe, 0x00, + 0xf3, 0xea, 0xf1, 0xf1, 0xfb, 0x01, 0x09, 0x17, 0x0b, 0x0d, 0x09, 0x07, + 0x05, 0x00, 0x02, 0x01, 0xfd, 0xf5, 0xf7, 0xfb, 0x03, 0x05, 0x03, 0x05, + 0x02, 0x0b, 0x0a, 0x01, 0xfe, 0xfd, 0xfa, 0x00, 0x05, 0x03, 0x0a, 0x10, + 0x0b, 0x0b, 0x10, 0x10, 0x18, 0x0e, 0x09, 0x06, 0x0d, 0x09, 0x0d, 0x0e, + 0x03, 0x02, 0x00, 0x00, 0xfe, 0xf9, 0xf3, 0xf1, 0xed, 0xf1, 0xf7, 0xff, + 0xfa, 0x02, 0x02, 0x05, 0xff, 0xfa, 0xfb, 0x03, 0x10, 0x0a, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0f, 0x10, 0x12, 0x0a, 0x06, 0x05, 0x03, 0x09, 0x0e, 0x0b, + 0x05, 0x05, 0x05, 0x07, 0x05, 0x03, 0xff, 0x00, 0x06, 0x05, 0xff, 0xfb, + 0x1b, 0x18, 0x0f, 0x06, 0x00, 0xff, 0xfa, 0xfd, 0xfe, 0xfb, 0xf7, 0xee, + 0xea, 0xfa, 0x02, 0x00, 0xfd, 0xfd, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0x0a, + 0x12, 0x0f, 0x0d, 0x0f, 0x1a, 0x16, 0x12, 0x0a, 0x05, 0x05, 0x05, 0x0e, + 0x1c, 0x1d, 0x1d, 0x17, 0x0b, 0x02, 0xff, 0x00, 0xfa, 0xf2, 0xe8, 0xea, + 0xea, 0xf5, 0x09, 0x0a, 0x06, 0x0a, 0x07, 0x0d, 0x0f, 0x05, 0x02, 0xfd, + 0xff, 0x02, 0x01, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0xfe, 0xf9, 0xf9, 0x02, + 0x00, 0xfb, 0xfe, 0x00, 0x06, 0x13, 0x0f, 0x10, 0x0f, 0x10, 0x0f, 0x10, + 0x16, 0x14, 0x17, 0x14, 0x12, 0x0b, 0x09, 0x07, 0x02, 0xfe, 0xfa, 0xf9, + 0xee, 0xf1, 0xfd, 0xfb, 0xfb, 0xfd, 0xff, 0xfe, 0xfa, 0xfe, 0x03, 0x00, + 0xf9, 0xfb, 0x00, 0x00, 0x09, 0x09, 0x0f, 0x13, 0x06, 0x02, 0x03, 0x03, + 0xff, 0x0f, 0x17, 0x12, 0x0b, 0x0b, 0x0e, 0x09, 0x03, 0x03, 0x05, 0x00, + 0xfd, 0xfa, 0xf5, 0xfd, 0x01, 0x01, 0x06, 0x0b, 0x14, 0x12, 0x16, 0x0f, + 0x05, 0x01, 0xff, 0xfb, 0xfa, 0x03, 0x09, 0x03, 0x00, 0x03, 0xfa, 0xf3, + 0xe9, 0xf5, 0xfa, 0xf6, 0xf7, 0xfa, 0xfd, 0x05, 0x12, 0x0f, 0x0d, 0x12, + 0x16, 0x12, 0x06, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x0b, 0x1a, 0x1d, 0x14, + 0x0d, 0x06, 0x01, 0xfb, 0xfb, 0xfd, 0x00, 0xfe, 0xf2, 0xf5, 0xfa, 0xfb, + 0xff, 0x09, 0x07, 0x09, 0x12, 0x10, 0x03, 0xff, 0x03, 0x07, 0x02, 0x01, + 0xf9, 0xf5, 0xfa, 0xf7, 0xf7, 0xf5, 0xfd, 0x00, 0x05, 0x06, 0x02, 0x05, + 0x07, 0x06, 0x02, 0x02, 0x06, 0x07, 0x09, 0x0d, 0x1f, 0x1f, 0x0f, 0x0a, + 0x1d, 0x29, 0x16, 0x07, 0x06, 0x03, 0x06, 0xfd, 0xff, 0xfe, 0xf7, 0xf9, + 0xf5, 0xf3, 0xf0, 0xea, 0xed, 0xf1, 0xf0, 0xf9, 0x0d, 0x0b, 0x09, 0x05, + 0x06, 0x0f, 0x0a, 0x02, 0x03, 0x06, 0x00, 0xfd, 0xfe, 0xff, 0x00, 0x0a, + 0x0d, 0x13, 0x17, 0x17, 0x0e, 0x09, 0x09, 0x09, 0x05, 0x05, 0x01, 0x00, + 0x00, 0x06, 0x02, 0x01, 0x05, 0x0f, 0xff, 0xfe, 0x02, 0x07, 0x05, 0xfe, + 0xff, 0x01, 0x01, 0x0a, 0x0a, 0x05, 0x00, 0xfd, 0xf5, 0xf2, 0xf6, 0xf9, + 0xf9, 0x01, 0xfd, 0xfb, 0x05, 0x0d, 0x06, 0x02, 0x06, 0x1a, 0x13, 0x09, + 0x09, 0x09, 0x07, 0x09, 0x05, 0x02, 0x02, 0x0f, 0x0d, 0x06, 0xfe, 0x05, + 0x05, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xfe, 0xfe, 0xfd, 0x00, 0xfd, 0x02, + 0x0b, 0x24, 0x1d, 0x10, 0x0d, 0x0b, 0x0a, 0x07, 0xfb, 0xfa, 0xf6, 0xf1, + 0xf5, 0xf1, 0xf1, 0xf5, 0xf9, 0xfa, 0x02, 0x06, 0x05, 0xfe, 0xfe, 0xfd, + 0x05, 0x16, 0x14, 0x0e, 0x0d, 0x1d, 0x20, 0x14, 0x12, 0x10, 0x05, 0x07, + 0x0b, 0x12, 0x13, 0x0f, 0x13, 0x06, 0xff, 0xfb, 0xfe, 0xf7, 0xf0, 0xf1, + 0xf0, 0xf0, 0xf2, 0xf0, 0xee, 0xf6, 0x06, 0x06, 0x03, 0x0d, 0x14, 0x06, + 0x05, 0x00, 0x00, 0x09, 0x03, 0x01, 0x06, 0x0a, 0x07, 0x0b, 0x06, 0x07, + 0x0e, 0x0e, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x05, 0x00, 0x01, 0x09, 0x09, + 0x05, 0x0d, 0x18, 0x0d, 0x06, 0x05, 0x02, 0x00, 0x02, 0xff, 0xf9, 0xfb, + 0xfe, 0xfe, 0xf6, 0xf1, 0xfb, 0x01, 0xfe, 0xfb, 0xfe, 0xfd, 0xfa, 0xfa, + 0x02, 0x03, 0x06, 0x09, 0x0a, 0x0d, 0x1a, 0x14, 0x0f, 0x05, 0xfa, 0x00, + 0x10, 0x0d, 0x06, 0x01, 0x05, 0x10, 0x0d, 0x09, 0x02, 0x05, 0x06, 0x07, + 0x03, 0x01, 0xf7, 0xf2, 0xed, 0xf6, 0x03, 0x05, 0x02, 0x00, 0x0a, 0x1f, + 0x24, 0x17, 0x07, 0x0a, 0x0b, 0x0b, 0x03, 0x00, 0xfa, 0xfd, 0xf9, 0xed, + 0xea, 0xf2, 0xf6, 0xf6, 0xff, 0xff, 0xfb, 0xfd, 0xfa, 0x01, 0x09, 0x0d, + 0x10, 0x0d, 0x0a, 0x16, 0x16, 0x0d, 0x05, 0x0a, 0x12, 0x0e, 0x05, 0x0e, + 0x12, 0x12, 0x12, 0x0f, 0x05, 0x00, 0x00, 0x00, 0xfb, 0xf9, 0xf5, 0xf5, + 0xf7, 0xf7, 0xf6, 0xfd, 0x07, 0x05, 0x03, 0x0a, 0x0e, 0x0a, 0xfe, 0xf7, + 0xfd, 0x00, 0x00, 0xff, 0xfe, 0xfb, 0xff, 0x07, 0x01, 0x07, 0x13, 0x17, + 0x0f, 0x0d, 0x10, 0x0f, 0x09, 0x05, 0x01, 0x01, 0x07, 0x09, 0x06, 0x10, + 0x14, 0x0f, 0x05, 0xfb, 0xff, 0x05, 0x03, 0xfe, 0xfb, 0xfd, 0xfb, 0xfe, + 0xfb, 0xf2, 0xf5, 0xf2, 0xf6, 0xf6, 0xf7, 0xfe, 0xfe, 0xfa, 0xff, 0x13, + 0x18, 0x14, 0x10, 0x1c, 0x23, 0x18, 0x0b, 0x02, 0x02, 0x07, 0x06, 0x01, + 0xfd, 0xfe, 0x01, 0x09, 0x07, 0xff, 0xff, 0x0a, 0x06, 0x03, 0x07, 0x0a, + 0x03, 0x02, 0xfd, 0xf3, 0xf7, 0xfd, 0x01, 0x0b, 0x12, 0x06, 0x0a, 0x07, + 0x0b, 0x16, 0x0d, 0xff, 0xfa, 0xfb, 0xff, 0x01, 0xfd, 0xf0, 0xf0, 0xfb, + 0xfd, 0xf6, 0xfe, 0x03, 0xff, 0xfb, 0xfb, 0xfe, 0x03, 0x0f, 0x13, 0x14, + 0x20, 0x1d, 0x0f, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x10, + 0x0f, 0x09, 0xff, 0x00, 0xfe, 0xfa, 0xfe, 0x00, 0xff, 0xfa, 0xf6, 0xf9, + 0xfe, 0x05, 0x0d, 0x0f, 0x16, 0x13, 0x0b, 0x02, 0xf6, 0xf5, 0x00, 0x00, + 0xfd, 0xf9, 0xf7, 0xfa, 0xfa, 0xfb, 0xfd, 0xff, 0xff, 0x05, 0x0a, 0x10, + 0x0d, 0x07, 0x02, 0x00, 0x0d, 0x12, 0x0f, 0x0a, 0x16, 0x1a, 0x17, 0x10, + 0x09, 0x05, 0x06, 0x0a, 0x09, 0x05, 0xff, 0x01, 0xfe, 0xfa, 0xf5, 0xf7, + 0xff, 0xfa, 0xf5, 0xf6, 0xf5, 0xf7, 0xf9, 0xf3, 0xf3, 0x03, 0x0f, 0x0e, + 0x14, 0x1c, 0x0e, 0x07, 0x06, 0x0b, 0x12, 0x0d, 0x0b, 0x02, 0x00, 0x00, + 0xff, 0x05, 0x0a, 0x09, 0x09, 0x06, 0x06, 0x05, 0x02, 0x01, 0xfe, 0xf9, + 0xfa, 0xf7, 0xfe, 0x03, 0x07, 0x16, 0x0e, 0x0d, 0x0b, 0x05, 0x03, 0x06, + 0x02, 0xfb, 0xf6, 0xf3, 0xf6, 0x00, 0xfe, 0xfb, 0x02, 0xff, 0x00, 0xfe, + 0xff, 0x07, 0x06, 0x06, 0x09, 0x0d, 0x0b, 0x0b, 0x07, 0x17, 0x10, 0x07, + 0x06, 0x00, 0x00, 0x07, 0x0a, 0x07, 0x07, 0x0d, 0x10, 0x10, 0x16, 0x10, + 0x09, 0xf7, 0xf6, 0xf9, 0xf7, 0xf9, 0xfd, 0xf9, 0xf2, 0xff, 0x02, 0xfd, + 0x00, 0x16, 0x0d, 0x0e, 0x0f, 0x09, 0xff, 0xfd, 0x00, 0xff, 0xfd, 0xfd, + 0xf3, 0xf0, 0xf5, 0xf9, 0x01, 0x03, 0x06, 0x07, 0x07, 0x10, 0x0f, 0x0d, + 0x07, 0x06, 0x0b, 0x0a, 0x0b, 0x1a, 0x1d, 0x17, 0x16, 0x0b, 0x01, 0x06, + 0x05, 0xff, 0xff, 0x00, 0xfe, 0x03, 0x01, 0x01, 0xff, 0xfa, 0xf9, 0xfd, + 0xfd, 0xfa, 0xf7, 0xf6, 0xf6, 0xf9, 0x02, 0x02, 0x09, 0x1a, 0x1c, 0x14, + 0x0a, 0x05, 0x01, 0x00, 0xfe, 0xf9, 0xf7, 0xf9, 0xfd, 0xfe, 0xff, 0x01, + 0x07, 0x14, 0x10, 0x0d, 0x0b, 0x05, 0x09, 0x09, 0x05, 0x06, 0x09, 0x05, + 0xff, 0x0a, 0x10, 0x14, 0x0d, 0x09, 0x05, 0x07, 0x0a, 0x03, 0xff, 0xfe, + 0xfb, 0xf7, 0xf7, 0xfb, 0xf3, 0xf5, 0xf3, 0xf5, 0xfa, 0xf9, 0xf9, 0xfb, + 0x01, 0x03, 0x0a, 0x18, 0x14, 0x17, 0x12, 0x16, 0x13, 0x0f, 0x07, 0x07, + 0x06, 0x03, 0x01, 0x07, 0x0a, 0x0b, 0x03, 0x03, 0x07, 0x0d, 0x09, 0x01, + 0xfb, 0xfe, 0xfb, 0xf9, 0xfd, 0xfe, 0xfb, 0xfa, 0xf9, 0xfe, 0xff, 0x0a, + 0x16, 0x0f, 0x05, 0xfb, 0xfb, 0x03, 0xff, 0x00, 0x00, 0xff, 0x05, 0x06, + 0x06, 0x05, 0x03, 0x05, 0x07, 0x05, 0x00, 0xff, 0xff, 0x02, 0x07, 0x0d, + 0x0f, 0x13, 0x0e, 0x1a, 0x1d, 0x1a, 0x13, 0x0b, 0x07, 0x02, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xf9, 0xf9, 0xfe, 0xfa, 0xf6, 0xf2, 0xf2, + 0xf3, 0xfd, 0x01, 0x00, 0x03, 0x0b, 0x0d, 0x13, 0x13, 0x0d, 0x05, 0x06, + 0x03, 0x01, 0x00, 0xfd, 0xfe, 0xfd, 0xfa, 0xfe, 0x07, 0x05, 0x06, 0x0a, + 0x10, 0x10, 0x0d, 0x0b, 0x06, 0x05, 0x02, 0x00, 0x07, 0x18, 0x0b, 0x02, + 0x07, 0x0e, 0x13, 0x0e, 0x07, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfd, + 0x03, 0xfe, 0xf9, 0xf7, 0xf7, 0xf9, 0xfa, 0xf9, 0xf7, 0xfd, 0xfe, 0x03, + 0x09, 0x0d, 0x09, 0x03, 0x07, 0x0a, 0x0a, 0x05, 0x03, 0x00, 0x00, 0x05, + 0x05, 0x0d, 0x0e, 0x12, 0x1b, 0x1c, 0x13, 0x06, 0x06, 0x07, 0x01, 0xfa, + 0xf9, 0xff, 0x02, 0x02, 0x02, 0x03, 0x07, 0xff, 0xff, 0x09, 0x03, 0x0e, + 0x03, 0xfb, 0xf5, 0xf0, 0xf2, 0xfa, 0xfd, 0x01, 0xfe, 0xfd, 0xfe, 0xfe, + 0x05, 0x0d, 0x07, 0x06, 0x03, 0x0b, 0x0f, 0x0a, 0x0e, 0x12, 0x12, 0x10, + 0x0e, 0x16, 0x10, 0x13, 0x0a, 0x05, 0x00, 0xfd, 0xff, 0xff, 0x03, 0x06, + 0x06, 0x05, 0xfb, 0xf9, 0xf3, 0xf6, 0xfb, 0xf5, 0xf3, 0xf6, 0xf2, 0xf5, + 0xfa, 0xf9, 0xff, 0x0e, 0x0f, 0x16, 0x1c, 0x1c, 0x17, 0x0b, 0x02, 0x00, + 0xfd, 0xfd, 0xfd, 0x00, 0x05, 0x05, 0x00, 0x00, 0x02, 0x02, 0x06, 0x0f, + 0x0f, 0x0f, 0x0b, 0x0b, 0x0f, 0x0f, 0x0e, 0x0f, 0x0b, 0x06, 0x12, 0x07, + 0x00, 0xfe, 0xf9, 0xf0, 0xf9, 0x00, 0xf9, 0xfd, 0x06, 0x02, 0xfa, 0xf6, + 0xfa, 0xfb, 0xf7, 0xf6, 0xf9, 0xff, 0xfd, 0x00, 0x02, 0x00, 0x0b, 0x14, + 0x0e, 0x06, 0x09, 0x10, 0x07, 0x03, 0xfe, 0xff, 0x03, 0x0d, 0x13, 0x0e, + 0x14, 0x12, 0x0b, 0x09, 0x06, 0x03, 0x03, 0x09, 0x07, 0x0a, 0x06, 0xfe, + 0x07, 0x00, 0xf9, 0x00, 0x01, 0xff, 0x01, 0x0e, 0x07, 0xfd, 0xff, 0x00, + 0xfa, 0xf9, 0xfa, 0xfd, 0x05, 0x05, 0x01, 0xfb, 0xff, 0x03, 0xfe, 0xfa, + 0xfd, 0xfb, 0x01, 0x03, 0x05, 0x03, 0x01, 0x06, 0x0e, 0x13, 0x10, 0x1d, + 0x21, 0x1b, 0x0d, 0x05, 0x05, 0x03, 0xff, 0x01, 0x0d, 0x0d, 0x09, 0x06, + 0x07, 0xff, 0xfa, 0xf9, 0xfb, 0xf7, 0xf3, 0xfb, 0xfe, 0xfb, 0xf9, 0xfe, + 0x03, 0x03, 0x00, 0x03, 0x0a, 0x06, 0x03, 0xfb, 0xf6, 0xf5, 0xfe, 0x0a, + 0x10, 0x14, 0x0f, 0x0b, 0x05, 0x02, 0x00, 0x00, 0x05, 0x0b, 0x10, 0x14, + 0x0f, 0x0d, 0x06, 0x07, 0x0d, 0x0b, 0x06, 0x09, 0x16, 0x14, 0x07, 0xfa, + 0xf5, 0xfa, 0xfa, 0xfe, 0x03, 0x00, 0xfd, 0xf0, 0xf0, 0xf0, 0xf1, 0xec, + 0xf5, 0xfd, 0x00, 0x0b, 0x0d, 0x0b, 0x05, 0x02, 0x01, 0x09, 0x14, 0x0a, + 0x0a, 0x16, 0x0f, 0x03, 0x00, 0x01, 0x05, 0x07, 0x14, 0x17, 0x10, 0x0d, + 0x10, 0x0d, 0x0f, 0x0e, 0x0a, 0x09, 0x05, 0x05, 0x01, 0x01, 0xfd, 0xed, + 0xe8, 0xee, 0xfb, 0x05, 0xff, 0x00, 0x00, 0xfb, 0xfa, 0xfb, 0x01, 0x05, + 0x07, 0x07, 0x03, 0x00, 0x03, 0x06, 0x03, 0x02, 0xfe, 0xfd, 0x00, 0x07, + 0x05, 0x06, 0x05, 0x05, 0x05, 0x09, 0x0b, 0x0e, 0x12, 0x10, 0x16, 0x09, + 0x01, 0xfd, 0xfa, 0xfd, 0x0a, 0x17, 0x12, 0x0b, 0x0f, 0x0d, 0x06, 0xfd, + 0x00, 0xfe, 0xfd, 0xfd, 0xfe, 0xfe, 0x00, 0x00, 0xfb, 0xfe, 0x02, 0x03, + 0xff, 0x01, 0x0a, 0x07, 0x01, 0x01, 0xfd, 0xfe, 0x02, 0x05, 0x01, 0xff, + 0xff, 0xfa, 0xf5, 0xf7, 0xf5, 0xfb, 0x06, 0x16, 0x12, 0x10, 0x1a, 0x14, + 0x10, 0x13, 0x16, 0x17, 0x0d, 0x09, 0x0d, 0x14, 0x0d, 0x05, 0xf9, 0xfb, + 0x05, 0x07, 0x03, 0xfa, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfd, 0xf6, + 0xf9, 0xf9, 0xf5, 0xea, 0xed, 0xf1, 0xf6, 0xfe, 0x05, 0x0f, 0x16, 0x18, + 0x1a, 0x13, 0x17, 0x10, 0x0e, 0x14, 0x12, 0x0f, 0x10, 0x10, 0x0a, 0x06, + 0x07, 0x0e, 0x0d, 0x05, 0x02, 0x03, 0x05, 0x06, 0x00, 0xfe, 0xfb, 0xf9, + 0xf7, 0xf0, 0xea, 0xea, 0xf9, 0xf1, 0xed, 0xee, 0xf1, 0x00, 0x0d, 0x0e, + 0x0b, 0x0b, 0x0a, 0x0e, 0x13, 0x12, 0x06, 0x03, 0x06, 0x09, 0x07, 0x05, + 0x03, 0x05, 0x0a, 0x0d, 0x07, 0x06, 0x07, 0x07, 0x0f, 0x0f, 0x09, 0x0e, + 0x0a, 0x0a, 0x09, 0x02, 0xff, 0x00, 0xfd, 0xf3, 0xf2, 0xff, 0xfa, 0xf6, + 0xf5, 0x01, 0xff, 0x07, 0x0f, 0x07, 0x01, 0x02, 0x02, 0x05, 0x03, 0x05, + 0x0a, 0x0b, 0x00, 0x00, 0x03, 0x05, 0x03, 0x06, 0x05, 0x05, 0x02, 0xff, + 0x02, 0x07, 0x02, 0xfe, 0xfe, 0x00, 0xff, 0x00, 0x01, 0x06, 0x0d, 0x0e, + 0x0d, 0x0e, 0x09, 0x14, 0x17, 0x27, 0x20, 0x13, 0x0d, 0x0b, 0xfb, 0xfa, + 0xfd, 0xfd, 0xfd, 0xfe, 0x01, 0xfd, 0xf9, 0xf6, 0xf6, 0xfb, 0xfd, 0xfb, + 0xf2, 0xf1, 0xf6, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0x00, 0x0a, 0x0d, 0x05, + 0x07, 0x0d, 0x13, 0x0f, 0x0d, 0x1d, 0x21, 0x1d, 0x1c, 0x18, 0x12, 0x0d, + 0x09, 0x06, 0x03, 0x06, 0x02, 0xfe, 0x00, 0x00, 0xff, 0xf6, 0xe8, 0xf6, + 0xfd, 0xf9, 0xfe, 0xfe, 0xfe, 0x00, 0xfe, 0x00, 0x02, 0x06, 0x00, 0xf6, + 0xfb, 0xf9, 0xfa, 0xfb, 0x01, 0x00, 0x05, 0x1c, 0x17, 0x12, 0x0d, 0x0a, + 0x0d, 0x0d, 0x0b, 0x0a, 0x07, 0x05, 0x0b, 0x10, 0x0d, 0x0f, 0x09, 0x07, + 0x07, 0x01, 0x00, 0x05, 0x03, 0x01, 0x01, 0x00, 0xfd, 0xf9, 0xf1, 0xf3, + 0xf5, 0xf3, 0xf3, 0xf6, 0xf7, 0xfb, 0xf7, 0xff, 0x0b, 0x18, 0x12, 0x0f, + 0x0a, 0x0a, 0x0a, 0x07, 0x0b, 0x0b, 0x07, 0x06, 0x0a, 0x02, 0x02, 0x00, + 0xfe, 0x00, 0x03, 0x03, 0x01, 0x01, 0x02, 0x0a, 0x0a, 0x14, 0x0e, 0x07, + 0x06, 0x05, 0x02, 0x05, 0x09, 0x05, 0x06, 0x00, 0xfd, 0xfd, 0xfb, 0x14, + 0x14, 0x09, 0x01, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf7, 0xf6, + 0xf3, 0xf3, 0xf9, 0xff, 0x05, 0x0f, 0x0b, 0x06, 0x13, 0x16, 0x13, 0x16, + 0x14, 0x0e, 0x09, 0x09, 0x03, 0x00, 0x03, 0x06, 0x0a, 0x02, 0x05, 0x09, + 0x0e, 0x12, 0x0a, 0x09, 0x03, 0x00, 0xfa, 0xf9, 0xfd, 0xf9, 0xf2, 0xf6, + 0xfe, 0x02, 0x00, 0xff, 0x01, 0x01, 0x01, 0x07, 0x0a, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0x03, 0x09, + 0x13, 0x17, 0x16, 0x16, 0x14, 0x1a, 0x16, 0x12, 0x0f, 0x0a, 0x01, 0xff, + 0x01, 0x00, 0x00, 0xff, 0xfe, 0xf9, 0xf9, 0xfb, 0xff, 0xfb, 0x01, 0x07, + 0x05, 0xff, 0xfb, 0xff, 0x01, 0x02, 0xfe, 0xf6, 0xf6, 0x00, 0x07, 0x03, + 0xfe, 0x01, 0x03, 0x0f, 0x14, 0x12, 0x0b, 0x05, 0x00, 0xfe, 0x03, 0x03, + 0x00, 0x01, 0x00, 0x06, 0x0b, 0x07, 0x07, 0x0f, 0x18, 0x17, 0x13, 0x10, + 0x0f, 0x17, 0x14, 0x0a, 0x01, 0x01, 0x00, 0x02, 0xfa, 0xf0, 0xf5, 0xf5, + 0xf6, 0xf0, 0xf6, 0xf9, 0xf7, 0xf7, 0xfe, 0x05, 0xff, 0xf9, 0xf7, 0xfd, + 0xff, 0x00, 0x09, 0x0d, 0x0b, 0x13, 0x23, 0x1d, 0x1b, 0x16, 0x13, 0x18, + 0x1a, 0x12, 0x0b, 0x07, 0x00, 0xfd, 0xfe, 0x00, 0xf9, 0xf6, 0xf6, 0xf7, + 0xf9, 0xfa, 0xf5, 0xf7, 0xff, 0xff, 0x00, 0x02, 0x02, 0x07, 0x0e, 0x0e, + 0x05, 0x02, 0x09, 0x0a, 0x02, 0x01, 0x02, 0x12, 0x09, 0x00, 0xfe, 0xff, + 0x01, 0x06, 0x0a, 0x06, 0x03, 0x01, 0x00, 0x01, 0x02, 0x01, 0x01, 0x05, + 0x02, 0x06, 0x0d, 0x0a, 0x07, 0x06, 0x0d, 0x0a, 0x06, 0x09, 0x0f, 0x0a, + 0x01, 0xfb, 0xf3, 0xf9, 0xfd, 0xff, 0x09, 0x12, 0x05, 0x02, 0x03, 0x00, + 0xff, 0x02, 0x03, 0x01, 0x00, 0x05, 0x07, 0x06, 0x01, 0x00, 0xff, 0x02, + 0xfe, 0x00, 0xff, 0xfe, 0xff, 0xfd, 0x00, 0x01, 0xfe, 0x01, 0x03, 0x09, + 0x12, 0x09, 0x06, 0x09, 0x0e, 0x0d, 0x09, 0x0f, 0x17, 0x1d, 0x17, 0x1b, + 0x0a, 0x00, 0x05, 0x0b, 0x07, 0x06, 0x05, 0xfb, 0xf1, 0xf0, 0xf2, 0xf6, + 0xf6, 0xf6, 0xf2, 0xed, 0xea, 0xf3, 0xf5, 0xf3, 0xfb, 0xf9, 0xfa, 0x01, + 0x01, 0x0b, 0x10, 0x1b, 0x23, 0x20, 0x23, 0x1d, 0x14, 0x18, 0x21, 0x1a, + 0x10, 0x05, 0x00, 0xfd, 0xfd, 0xfe, 0x00, 0x0a, 0x0b, 0x06, 0x00, 0xf9, + 0xf2, 0xf1, 0xf2, 0xf3, 0xfa, 0xfa, 0xff, 0xfd, 0x00, 0x03, 0x06, 0x03, + 0xff, 0x00, 0xff, 0x07, 0x0a, 0x07, 0x06, 0x06, 0x01, 0x01, 0x05, 0x0b, + 0x0d, 0x12, 0x12, 0x0b, 0x05, 0x03, 0x03, 0x03, 0x0a, 0x0a, 0x0a, 0x09, + 0x0b, 0x05, 0x02, 0xfe, 0xf2, 0xf3, 0xf9, 0x00, 0x00, 0xf7, 0xf7, 0xf2, + 0xf3, 0xfb, 0x00, 0x06, 0x0a, 0x1c, 0x17, 0x05, 0x05, 0x07, 0x07, 0x0b, + 0x17, 0x14, 0x0d, 0x07, 0x09, 0x03, 0x05, 0x06, 0x00, 0x01, 0x02, 0x03, + 0xff, 0xf6, 0xf2, 0xf1, 0xf2, 0xfa, 0xf9, 0xfb, 0x00, 0x09, 0x05, 0x03, + 0x05, 0xff, 0xfd, 0x01, 0x0b, 0x1b, 0x1d, 0x25, 0x1f, 0x1d, 0x16, 0x0f, + 0x0b, 0x0d, 0x0b, 0x09, 0x06, 0xfe, 0xee, 0xe8, 0xf1, 0xf6, 0xf7, 0xfb, + 0xfe, 0xfd, 0xf7, 0xf5, 0xf0, 0xf0, 0xf0, 0xf1, 0xfd, 0xff, 0xff, 0x03, + 0x0d, 0x1f, 0x25, 0x21, 0x18, 0x1c, 0x17, 0x10, 0x12, 0x16, 0x0d, 0x07, + 0x02, 0x02, 0x02, 0x03, 0x06, 0x09, 0x05, 0xff, 0xfe, 0xfa, 0xf7, 0xf9, + 0x00, 0x02, 0xfe, 0xfe, 0x00, 0x02, 0xf9, 0xfb, 0xfd, 0xfe, 0xfe, 0x01, + 0x00, 0xff, 0x01, 0xff, 0x00, 0x00, 0xfd, 0x01, 0x09, 0x06, 0x0d, 0x0f, + 0x0a, 0x06, 0x0a, 0x0d, 0x0f, 0x10, 0x0d, 0x0d, 0x0b, 0x16, 0x0e, 0x09, + 0x05, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xfa, 0xf6, 0xf2, 0xf2, 0xf6, + 0xff, 0x05, 0x06, 0x0b, 0x17, 0x0a, 0xfe, 0xff, 0x01, 0x05, 0x06, 0x06, + 0x0d, 0x14, 0x16, 0x0b, 0x09, 0x02, 0x05, 0x05, 0x03, 0xfb, 0xf7, 0xf9, + 0x01, 0x05, 0x02, 0x02, 0x02, 0x01, 0x01, 0xff, 0xfd, 0xf5, 0xf1, 0xf9, + 0x00, 0xff, 0x03, 0x0b, 0x13, 0x17, 0x20, 0x1a, 0x10, 0x0a, 0x0b, 0x03, + 0x00, 0x05, 0x09, 0x01, 0xfe, 0xfa, 0xff, 0x06, 0x07, 0x03, 0x02, 0x00, + 0xfe, 0xfd, 0xfa, 0xf7, 0xf9, 0xfa, 0x00, 0x02, 0x00, 0x02, 0x0b, 0x0b, + 0x0b, 0x07, 0x07, 0x10, 0x14, 0x10, 0x0a, 0x09, 0x06, 0x02, 0xff, 0xfe, + 0xfe, 0xfb, 0xff, 0x0b, 0x10, 0x0a, 0x07, 0x09, 0x06, 0x07, 0x05, 0xff, + 0xfd, 0xfd, 0x06, 0x09, 0x06, 0xfe, 0xfd, 0xf9, 0xfb, 0xfb, 0xff, 0xff, + 0xfa, 0xfb, 0xfe, 0x03, 0x02, 0x05, 0x07, 0x07, 0x0a, 0x0d, 0x0e, 0x09, + 0x0d, 0x0d, 0x06, 0x03, 0x0a, 0x12, 0x14, 0x0e, 0x0e, 0x0d, 0x06, 0x06, + 0x05, 0xfe, 0xf7, 0xf9, 0xfa, 0xff, 0x02, 0xfe, 0xfd, 0x00, 0x01, 0xfe, + 0xfe, 0x02, 0x05, 0x05, 0xff, 0xfd, 0x05, 0x12, 0x0a, 0x05, 0x0d, 0x16, + 0x12, 0x06, 0xfa, 0xf3, 0xf5, 0xf9, 0x00, 0x07, 0x02, 0x00, 0x01, 0x07, + 0x09, 0x07, 0x02, 0x02, 0x05, 0x06, 0x00, 0xff, 0x06, 0x0a, 0x00, 0x00, + 0x01, 0x07, 0x13, 0x1a, 0x16, 0x14, 0x0b, 0x03, 0x09, 0x06, 0x01, 0xfe, + 0xfe, 0x02, 0x01, 0xfd, 0xf3, 0xf2, 0xf3, 0xfa, 0x02, 0x06, 0x05, 0x02, + 0x07, 0x07, 0xfd, 0xfb, 0xfd, 0xfa, 0x01, 0x0a, 0x0f, 0x17, 0x13, 0x0b, + 0x0d, 0x14, 0x13, 0x0b, 0x03, 0xfb, 0xfa, 0xf9, 0xfa, 0xff, 0x03, 0xff, + 0xfa, 0xfb, 0x03, 0x09, 0x06, 0x07, 0xfe, 0xf9, 0xff, 0xff, 0x07, 0x12, + 0x10, 0x0d, 0x05, 0xff, 0x06, 0x07, 0x01, 0x00, 0x03, 0x05, 0x0a, 0x0b, + 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x01, 0x03, 0x00, 0x01, 0x05, 0x02, 0x03, + 0x05, 0x02, 0x02, 0x06, 0x07, 0x07, 0x01, 0xfa, 0xf5, 0xfa, 0xfb, 0x01, + 0xff, 0x09, 0x0f, 0x0a, 0x0b, 0x0d, 0x05, 0x03, 0xfe, 0xfd, 0x01, 0x07, + 0x16, 0x14, 0x06, 0xfe, 0x01, 0x00, 0xfd, 0x05, 0x0a, 0x09, 0x06, 0x03, + 0x06, 0x02, 0xff, 0xfd, 0xf9, 0xfb, 0x07, 0x0b, 0x01, 0xfb, 0xfd, 0x01, + 0x03, 0x0a, 0x03, 0x02, 0x05, 0x0b, 0x0b, 0x06, 0x01, 0xff, 0x01, 0x0d, + 0x1c, 0x1c, 0x1b, 0x16, 0x10, 0x07, 0x00, 0xfd, 0xf9, 0xf6, 0xfa, 0xf9, + 0xf7, 0xf6, 0xf5, 0xf7, 0x00, 0x01, 0xff, 0x00, 0x09, 0x0a, 0xff, 0xf5, + 0xf2, 0xf0, 0xfa, 0x06, 0x13, 0x0f, 0x10, 0x10, 0x0d, 0x0f, 0x0f, 0x16, + 0x16, 0x10, 0x14, 0x0e, 0x06, 0x01, 0xfe, 0xfb, 0xfb, 0xf7, 0xfb, 0xfe, + 0x05, 0x0b, 0x02, 0x05, 0x06, 0x00, 0xfa, 0xfb, 0x03, 0x00, 0x05, 0x03, + 0xfb, 0xf1, 0xf3, 0xff, 0x0a, 0x0b, 0x0a, 0x0a, 0x07, 0x06, 0x10, 0x12, + 0x07, 0x01, 0x03, 0x03, 0x0d, 0x10, 0x0a, 0x06, 0x05, 0x03, 0x00, 0x01, + 0x05, 0xfd, 0xf9, 0xf9, 0xff, 0xff, 0xf7, 0xfb, 0xf9, 0xf6, 0xfd, 0x00, + 0x02, 0xfd, 0xfe, 0x06, 0x09, 0x07, 0x0a, 0x0a, 0x0e, 0x18, 0x18, 0x0d, + 0x05, 0x0d, 0x0b, 0x0f, 0x1a, 0x0f, 0x0d, 0x0a, 0x0e, 0x07, 0x03, 0xff, + 0xf7, 0xf2, 0xf5, 0xfd, 0xfd, 0xf9, 0x00, 0xfe, 0xfb, 0xfb, 0xfa, 0xfa, + 0xf9, 0xfa, 0xfd, 0x01, 0x00, 0xf7, 0xf9, 0x05, 0x12, 0x18, 0x1b, 0x1c, + 0x20, 0x1c, 0x17, 0x12, 0x0b, 0x02, 0x03, 0x06, 0x02, 0x01, 0xfe, 0xf6, + 0xf5, 0xf5, 0xf5, 0xf9, 0x00, 0x05, 0x01, 0xfe, 0x00, 0x00, 0xff, 0xf7, + 0xfe, 0xfb, 0xff, 0x06, 0x0f, 0x0d, 0x09, 0x07, 0x16, 0x1c, 0x1a, 0x18, + 0x0e, 0x0a, 0x0b, 0x07, 0xff, 0xfe, 0xfe, 0x03, 0x09, 0x0e, 0x0b, 0x03, + 0xff, 0xfe, 0xfb, 0xfb, 0xfa, 0xf5, 0xf6, 0xf6, 0xf5, 0xfd, 0xf7, 0xf1, + 0xf5, 0xf9, 0x03, 0x0b, 0x03, 0x06, 0x0b, 0x09, 0x0b, 0x0b, 0x0f, 0x0e, + 0x0e, 0x12, 0x0d, 0x09, 0x0a, 0x05, 0x03, 0x09, 0x18, 0x13, 0x09, 0x02, + 0x00, 0xff, 0x01, 0xf9, 0xf3, 0xf3, 0xf1, 0xfa, 0xfb, 0xfd, 0x00, 0x00, + 0xff, 0x00, 0x07, 0x0b, 0x05, 0x05, 0x07, 0x0b, 0x0f, 0x0b, 0x01, 0x05, + 0x12, 0x14, 0x10, 0x0e, 0x09, 0x03, 0x07, 0x09, 0x06, 0x03, 0xfe, 0x00, + 0xfe, 0xfa, 0xfb, 0xfd, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0xfd, 0xf6, 0xf2, + 0xf9, 0xfe, 0x02, 0xff, 0x03, 0x03, 0x09, 0x12, 0x0f, 0x0d, 0x12, 0x17, + 0x14, 0x1a, 0x16, 0x14, 0x0d, 0x05, 0x06, 0x07, 0x03, 0xfe, 0xff, 0x02, + 0x05, 0x0d, 0x0e, 0x05, 0x01, 0x00, 0xfd, 0xf9, 0xff, 0xf7, 0xf5, 0xfb, + 0xf5, 0xf9, 0x02, 0x06, 0x07, 0x09, 0x0f, 0x0f, 0x0a, 0x06, 0xff, 0x00, + 0x03, 0x03, 0x07, 0x00, 0x00, 0x01, 0x0a, 0x0b, 0x0d, 0x09, 0x03, 0x00, + 0x0b, 0x10, 0x0d, 0x06, 0xfe, 0xf6, 0xf3, 0xf9, 0xf5, 0xee, 0xf1, 0xf3, + 0x00, 0x03, 0x03, 0x06, 0x0d, 0x14, 0x17, 0x0a, 0x05, 0x07, 0x10, 0x09, + 0x03, 0x06, 0x09, 0x09, 0x12, 0x17, 0x0f, 0x0d, 0x07, 0x01, 0xfd, 0x00, + 0x03, 0x03, 0xfd, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0xfd, 0xff, 0xfd, 0xf7, + 0xfb, 0xff, 0x07, 0x05, 0x05, 0x0b, 0x0b, 0x02, 0x06, 0x06, 0x09, 0x0f, + 0x09, 0x02, 0xff, 0xfe, 0x03, 0x14, 0x0f, 0x05, 0x01, 0x02, 0x00, 0x00, + 0xff, 0x02, 0xff, 0xfe, 0x00, 0x01, 0x06, 0x06, 0x01, 0xf9, 0xf7, 0xfb, + 0x03, 0xff, 0x02, 0x0b, 0x0f, 0x0d, 0x07, 0x0d, 0x0f, 0x10, 0x12, 0x10, + 0x0f, 0x0b, 0x09, 0x03, 0x00, 0x01, 0x03, 0x01, 0xfd, 0xff, 0x03, 0x07, + 0x02, 0x03, 0x00, 0xfd, 0x00, 0x01, 0xff, 0xfd, 0xfb, 0xf9, 0xf9, 0xfb, + 0xfb, 0xff, 0x0d, 0x0a, 0x07, 0x0b, 0x09, 0x01, 0x05, 0x0e, 0x0a, 0x06, + 0x03, 0xfe, 0x00, 0x05, 0x05, 0x02, 0x00, 0x03, 0x13, 0x14, 0x0f, 0x0f, + 0x06, 0x00, 0x00, 0xfe, 0xf9, 0xfa, 0xfd, 0x00, 0xfe, 0x06, 0x06, 0x07, + 0x0d, 0x0e, 0x12, 0x0d, 0x07, 0x05, 0x01, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x0a, 0x09, 0x05, 0x07, 0x03, 0xfa, 0xf9, 0xf7, 0xf3, 0xff, 0xff, 0x01, + 0xf7, 0xf6, 0xfa, 0xfb, 0x01, 0x05, 0x01, 0xff, 0xfd, 0x00, 0x02, 0x0e, + 0x17, 0x18, 0x18, 0x0f, 0x0e, 0x05, 0x05, 0x03, 0x01, 0x01, 0x00, 0x03, + 0x07, 0x0a, 0x0b, 0x09, 0x00, 0xfb, 0xfe, 0xfd, 0xff, 0xfe, 0xff, 0x00, + 0xfe, 0xfd, 0xfe, 0x01, 0x06, 0x06, 0x03, 0xff, 0x05, 0x07, 0x0e, 0x12, + 0x0b, 0x0f, 0x0a, 0x0b, 0x0f, 0x0b, 0x06, 0x02, 0x05, 0x02, 0x03, 0x05, + 0x05, 0x06, 0x09, 0x00, 0xf7, 0xf7, 0xf7, 0xfb, 0x03, 0xfe, 0xf6, 0xf9, + 0x09, 0x03, 0xfe, 0xfe, 0x00, 0xff, 0xfb, 0xf9, 0xfb, 0x02, 0x0d, 0x06, + 0x09, 0x0a, 0x12, 0x1f, 0x1b, 0x12, 0x0d, 0x03, 0x02, 0xff, 0xfd, 0xfa, + 0x00, 0x02, 0x05, 0x09, 0x18, 0x13, 0x0b, 0x09, 0x02, 0xfe, 0xfb, 0xf9, + 0xfa, 0x00, 0x00, 0xf2, 0xf6, 0xfa, 0xfd, 0x06, 0x06, 0x09, 0x0d, 0x0d, + 0x0d, 0x09, 0x06, 0x07, 0x0e, 0x0a, 0x06, 0x07, 0x0e, 0x0b, 0x06, 0x00, + 0xf7, 0xfb, 0xf9, 0xf9, 0xfa, 0x01, 0x03, 0xfe, 0xfe, 0xfe, 0xf7, 0xf9, + 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xff, 0x06, 0x16, 0x1b, 0x1b, 0x18, + 0x1b, 0x1b, 0x17, 0x13, 0x0b, 0x09, 0x09, 0x0b, 0x09, 0x07, 0x07, 0x02, + 0xfe, 0xf9, 0xfe, 0x00, 0xfe, 0xfe, 0x00, 0x05, 0xfb, 0xf1, 0xf2, 0xf2, + 0xf2, 0xf7, 0xf7, 0xfa, 0x07, 0x07, 0x05, 0x03, 0x06, 0x0d, 0x0d, 0x02, + 0x0a, 0x12, 0x10, 0x0e, 0x0b, 0x07, 0x0d, 0x0b, 0x0e, 0x10, 0x0e, 0x0a, + 0x02, 0xfe, 0xfe, 0xf5, 0xf6, 0xfd, 0xfb, 0xfe, 0x0a, 0x0b, 0x0a, 0x03, + 0xfd, 0xf6, 0xf1, 0xec, 0xf2, 0xfd, 0x03, 0x00, 0x00, 0x0a, 0x17, 0x14, + 0x1a, 0x1b, 0x13, 0x10, 0x0f, 0x0b, 0x0a, 0x06, 0x07, 0x0a, 0x03, 0x09, + 0x13, 0x0b, 0x06, 0x02, 0xfe, 0xf6, 0xf5, 0xf3, 0xf5, 0xfb, 0xfd, 0xfa, + 0xf5, 0xf6, 0xf9, 0xf3, 0xfb, 0x03, 0x06, 0x09, 0x0e, 0x05, 0x01, 0x01, + 0x0b, 0x0d, 0x0f, 0x10, 0x1b, 0x1b, 0x13, 0x09, 0x07, 0x02, 0xff, 0x01, + 0xff, 0x02, 0x03, 0x01, 0x01, 0xfd, 0xfa, 0xf7, 0xf5, 0xf7, 0xfb, 0xfd, + 0xfd, 0xfd, 0xfd, 0x00, 0x06, 0x02, 0x06, 0x14, 0x2d, 0x29, 0x17, 0x0d, + 0x10, 0x10, 0x09, 0x03, 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x00, 0xfe, 0xf9, 0xf5, 0xf2, 0xf3, 0xee, 0xec, 0xf3, 0xfb, + 0x05, 0x01, 0x02, 0x0a, 0x0a, 0x01, 0xff, 0x0a, 0x0f, 0x0b, 0x0b, 0x0b, + 0x07, 0x09, 0x0d, 0x10, 0x0e, 0x0d, 0x10, 0x12, 0x0f, 0x06, 0x01, 0x03, + 0x03, 0x01, 0xfe, 0x05, 0x0f, 0x0f, 0x0d, 0x03, 0xfb, 0xf5, 0xec, 0xe9, + 0xed, 0xf7, 0xf9, 0xfe, 0x02, 0x05, 0x07, 0x0a, 0x09, 0x06, 0x0e, 0x14, + 0x0d, 0x06, 0x03, 0x05, 0x05, 0x03, 0x01, 0x0d, 0x17, 0x14, 0x0e, 0x09, + 0x09, 0x06, 0x00, 0xfa, 0xf9, 0xf7, 0xfa, 0xfd, 0xf9, 0xf7, 0xfa, 0xfd, + 0xfa, 0xf3, 0xf9, 0x03, 0x03, 0x05, 0x0b, 0x0b, 0x02, 0x01, 0x03, 0x16, + 0x28, 0x1c, 0x0f, 0x09, 0x05, 0x05, 0x02, 0xfe, 0x00, 0x03, 0x0b, 0x09, + 0x03, 0x06, 0x09, 0x06, 0x06, 0xff, 0xff, 0x00, 0xfb, 0xf1, 0xf3, 0xf3, + 0xf0, 0xf1, 0xf7, 0x06, 0x20, 0x18, 0x13, 0x10, 0x0f, 0x0e, 0x0a, 0x07, + 0x06, 0x05, 0x09, 0x09, 0x05, 0x05, 0xfe, 0xfb, 0x05, 0x00, 0xfd, 0xfe, + 0x03, 0x03, 0x00, 0xfa, 0xf7, 0xf9, 0xf9, 0xff, 0x0b, 0x06, 0x01, 0xfd, + 0x00, 0x06, 0x03, 0x02, 0x02, 0x05, 0x0e, 0x0e, 0x05, 0x09, 0x12, 0x0e, + 0x0b, 0x0b, 0x12, 0x14, 0x12, 0x09, 0x02, 0xfd, 0x00, 0x01, 0x02, 0x09, + 0x0f, 0x0e, 0x09, 0x01, 0xfe, 0x00, 0xfd, 0xf6, 0xed, 0xea, 0xf1, 0xf5, + 0xf7, 0xfb, 0xfb, 0x05, 0x03, 0x00, 0x06, 0x0d, 0x0b, 0x0d, 0x07, 0x02, + 0x06, 0x09, 0x02, 0x0f, 0x24, 0x25, 0x1a, 0x10, 0x02, 0xfe, 0xfd, 0xfd, + 0xfb, 0xf7, 0xf7, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x01, 0xfd, 0xfb, + 0xfd, 0x00, 0x05, 0xff, 0xff, 0x01, 0x06, 0x0e, 0x1b, 0x1d, 0x13, 0x0d, + 0x0a, 0x02, 0x01, 0x03, 0xff, 0x02, 0x02, 0x03, 0x03, 0x05, 0x01, 0xff, + 0x01, 0xff, 0xfd, 0xfe, 0xfe, 0xff, 0x02, 0xff, 0xf6, 0xf5, 0xf9, 0x05, + 0x0d, 0x14, 0x18, 0x0e, 0x05, 0x00, 0x07, 0x0f, 0x10, 0x0e, 0x09, 0x02, + 0x01, 0x01, 0x01, 0x03, 0x06, 0x01, 0x00, 0x02, 0x01, 0x02, 0x03, 0xff, + 0xf3, 0xed, 0xf5, 0x02, 0x09, 0x06, 0x0a, 0x06, 0x03, 0x03, 0x0a, 0x07, + 0x0b, 0x0b, 0x06, 0x06, 0x03, 0x09, 0x13, 0x12, 0x06, 0x07, 0x06, 0x06, + 0x03, 0x01, 0x03, 0x00, 0xf5, 0xfb, 0x05, 0x09, 0x14, 0x12, 0x0e, 0x0b, + 0x03, 0xfa, 0xf5, 0xf5, 0xf7, 0xf5, 0xf0, 0xf0, 0xf1, 0xfa, 0x03, 0x09, + 0x0d, 0x09, 0x06, 0x01, 0x03, 0x07, 0x0e, 0x0d, 0x06, 0x05, 0x06, 0x10, + 0x18, 0x18, 0x17, 0x12, 0x0a, 0x06, 0x02, 0x01, 0xfe, 0x00, 0xff, 0xfd, + 0x01, 0x03, 0x06, 0xfd, 0xfa, 0x00, 0xff, 0xfd, 0xfb, 0xfb, 0x00, 0x06, + 0x02, 0x02, 0x03, 0x09, 0x0d, 0x0f, 0x13, 0x0b, 0x0b, 0x07, 0xfd, 0xfd, + 0x02, 0x01, 0x00, 0xff, 0x00, 0xff, 0x00, 0xfd, 0xfb, 0x03, 0x06, 0x05, + 0x00, 0x02, 0x0a, 0x05, 0xff, 0xfe, 0xfe, 0x02, 0x01, 0x07, 0x0a, 0x0d, + 0x16, 0x10, 0x05, 0x07, 0x0d, 0x12, 0x0e, 0x07, 0x03, 0x02, 0x07, 0x05, + 0xfe, 0xff, 0x01, 0x01, 0x00, 0x00, 0xfb, 0xfa, 0xf3, 0xf3, 0xf5, 0xfe, + 0x0b, 0x0a, 0x05, 0x02, 0x07, 0x05, 0xfd, 0xf6, 0x00, 0x00, 0x03, 0x03, + 0x06, 0x06, 0x09, 0x0d, 0x13, 0x1f, 0x18, 0x0e, 0x02, 0x00, 0x01, 0x06, + 0x02, 0xfe, 0xfd, 0x06, 0x10, 0x14, 0x0b, 0xff, 0xff, 0x02, 0xf7, 0xf1, + 0xf2, 0xf6, 0xfe, 0xfa, 0xfb, 0xf7, 0xfa, 0xff, 0x01, 0x09, 0x02, 0xff, + 0x03, 0x03, 0x05, 0x07, 0x09, 0x0e, 0x16, 0x17, 0x18, 0x1c, 0x17, 0x0d, + 0x0b, 0x0e, 0x0b, 0x09, 0x06, 0x00, 0xfe, 0xfe, 0xfa, 0xf7, 0xf3, 0xfa, + 0xfb, 0xf7, 0xf7, 0xfd, 0x00, 0x00, 0xfe, 0x00, 0x06, 0x02, 0x03, 0x0e, + 0x0d, 0x09, 0x09, 0x09, 0x07, 0x0d, 0x0b, 0x06, 0x0d, 0x06, 0xff, 0xff, + 0xfe, 0xfe, 0x00, 0x03, 0x05, 0x01, 0xff, 0xff, 0x00, 0x07, 0x03, 0xff, + 0xfa, 0xfa, 0xfb, 0x00, 0x07, 0x0f, 0x12, 0x0d, 0x09, 0x09, 0x0e, 0x10, + 0x09, 0x07, 0x05, 0x05, 0x07, 0x07, 0x05, 0x0a, 0x0f, 0x07, 0x05, 0x01, + 0xfb, 0xfe, 0xfd, 0xfe, 0xfb, 0xf6, 0xf6, 0xfb, 0x03, 0x03, 0x03, 0x01, + 0xfe, 0xfa, 0xf7, 0xfe, 0xf9, 0xf5, 0xfb, 0x09, 0x0f, 0x0b, 0x0a, 0x0b, + 0x16, 0x17, 0x12, 0x0b, 0x09, 0x16, 0x0f, 0x06, 0x02, 0x05, 0x06, 0x0a, + 0x12, 0x17, 0x0d, 0x07, 0xff, 0xfd, 0xfe, 0x03, 0xfe, 0xf6, 0xf3, 0xec, + 0xf2, 0xf3, 0xf2, 0xf2, 0xf6, 0xf6, 0xfd, 0x01, 0x00, 0x09, 0x10, 0x0d, + 0x0a, 0x07, 0x0e, 0x12, 0x16, 0x1a, 0x16, 0x12, 0x0d, 0x06, 0x03, 0x09, + 0x0f, 0x0b, 0x0a, 0x03, 0xff, 0xfe, 0xff, 0xfe, 0x00, 0xfe, 0xfb, 0xf3, + 0xf7, 0xfb, 0xfe, 0xf7, 0xf3, 0xf6, 0x01, 0x05, 0x09, 0x0f, 0x0b, 0x0d, + 0x13, 0x0a, 0x06, 0x0a, 0x10, 0x10, 0x05, 0x00, 0xfd, 0xfe, 0x02, 0x05, + 0x05, 0x05, 0x03, 0x03, 0x01, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x06, 0x0b, 0x05, 0x02, 0x07, 0x05, 0x09, 0x03, 0x01, 0x03, 0x00, 0x02, + 0x00, 0x02, 0x09, 0x0d, 0x10, 0x1a, 0x0f, 0x03, 0x00, 0xff, 0x00, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x05, 0x0a, 0x06, 0x03, 0xfe, 0xfd, 0xf9, 0xfa, + 0xfa, 0xfb, 0xfb, 0xf5, 0xf2, 0x00, 0x0b, 0x0d, 0x09, 0x0a, 0x06, 0x02, + 0x07, 0x13, 0x10, 0x10, 0x18, 0x1b, 0x1b, 0x0e, 0x0b, 0x0e, 0x0a, 0x09, + 0x06, 0x05, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf0, 0xec, 0xf2, 0xfd, + 0xf9, 0xf7, 0xf5, 0xf2, 0xf9, 0x00, 0x02, 0x05, 0x07, 0x05, 0x02, 0x05, + 0x07, 0x0e, 0x14, 0x13, 0x13, 0x13, 0x13, 0x14, 0x10, 0x09, 0x06, 0x02, + 0x02, 0x03, 0x03, 0x09, 0x0a, 0x06, 0x03, 0xfd, 0xfe, 0xfb, 0xfd, 0xf9, + 0xfb, 0xfb, 0xf6, 0xfa, 0x05, 0x12, 0x0f, 0x07, 0x03, 0x02, 0x01, 0xff, + 0x00, 0xfd, 0xfa, 0xfd, 0x02, 0x07, 0x09, 0x0a, 0x0f, 0x0d, 0x0b, 0x09, + 0x03, 0x03, 0x03, 0x01, 0x03, 0x02, 0xff, 0xff, 0x02, 0x07, 0x0d, 0x07, + 0x05, 0x03, 0x00, 0x02, 0x07, 0x0b, 0x07, 0x05, 0xfe, 0xf5, 0xfa, 0x01, + 0x03, 0xff, 0xfe, 0x02, 0x0a, 0x07, 0x03, 0x00, 0x07, 0x0e, 0x10, 0x06, + 0x03, 0x0a, 0x0d, 0x07, 0x03, 0x00, 0xfd, 0xfe, 0xff, 0xfd, 0xf7, 0xf9, + 0xf9, 0xf5, 0xfa, 0x02, 0x0b, 0x0d, 0x06, 0x02, 0x05, 0x0a, 0x09, 0x07, + 0x09, 0x0b, 0x0e, 0x0a, 0x13, 0x16, 0x12, 0x0d, 0x06, 0x05, 0x07, 0x05, + 0x0b, 0x07, 0x01, 0xfa, 0xfb, 0xf3, 0xf6, 0xf9, 0xfb, 0xfa, 0xf7, 0xf7, + 0xf7, 0xf9, 0xf9, 0x00, 0x0a, 0x0d, 0x09, 0x05, 0x02, 0x07, 0x12, 0x12, + 0x09, 0x03, 0x02, 0x09, 0x12, 0x0a, 0x02, 0xfd, 0xfe, 0x0b, 0x0b, 0x0f, + 0x0e, 0x0d, 0x13, 0x0b, 0x06, 0x05, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0xf6, + 0xfb, 0x05, 0x0d, 0x12, 0x0b, 0x09, 0x03, 0x00, 0x01, 0x01, 0xfd, 0xf5, + 0xf7, 0x00, 0xfd, 0xfa, 0x01, 0x0a, 0x0d, 0x02, 0x00, 0x05, 0x02, 0x06, + 0x0d, 0x10, 0x0b, 0x05, 0x03, 0x05, 0x09, 0x06, 0x02, 0x02, 0x03, 0x07, + 0x05, 0x06, 0x0e, 0x0d, 0x0a, 0x0f, 0x02, 0xfb, 0xff, 0x02, 0x00, 0xfe, + 0xfa, 0xff, 0x01, 0x02, 0x02, 0x00, 0xff, 0x01, 0x07, 0x07, 0x03, 0x05, + 0x09, 0x0e, 0x01, 0xff, 0x02, 0x0d, 0x06, 0xfa, 0xf6, 0xfd, 0xff, 0xfd, + 0xff, 0x07, 0x09, 0x05, 0x02, 0x01, 0x00, 0x05, 0x12, 0x16, 0x10, 0x09, + 0x06, 0x07, 0x0e, 0x1f, 0x17, 0x0a, 0xfb, 0xf9, 0xff, 0xfe, 0xfa, 0xf9, + 0xfa, 0xf9, 0x02, 0xfd, 0xfa, 0xfb, 0xfa, 0x00, 0x05, 0xfe, 0xf9, 0x00, + 0x07, 0x0d, 0x0d, 0x07, 0x07, 0x0a, 0x0a, 0x0b, 0x0b, 0x09, 0x06, 0x02, + 0x01, 0x00, 0x00, 0x03, 0x03, 0x01, 0x06, 0x07, 0x06, 0x05, 0x03, 0x05, + 0x0d, 0x05, 0x02, 0x06, 0x0d, 0x01, 0xf3, 0xfd, 0xfb, 0x02, 0x00, 0x0a, + 0x12, 0x12, 0x0b, 0x03, 0x00, 0x00, 0x02, 0x03, 0x01, 0xf6, 0xfb, 0x00, + 0xff, 0xfd, 0x01, 0x06, 0x05, 0x03, 0x03, 0x05, 0x05, 0x03, 0x05, 0x07, + 0x05, 0xfd, 0xfe, 0x06, 0x0b, 0x0b, 0x0b, 0x03, 0xff, 0x03, 0x09, 0x10, + 0x10, 0x0a, 0x06, 0x0b, 0x09, 0xfe, 0xfd, 0x03, 0xff, 0xfb, 0xf9, 0xfa, + 0x06, 0x06, 0x0e, 0x07, 0x02, 0x02, 0x03, 0x06, 0x09, 0x03, 0xff, 0xfd, + 0xf9, 0xf7, 0xfb, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x05, 0x06, 0x01, 0x00, + 0x05, 0x0b, 0x07, 0x02, 0x06, 0x13, 0x13, 0x0b, 0x09, 0x0a, 0x0b, 0x0b, + 0x12, 0x14, 0x1b, 0x16, 0x0a, 0xfa, 0x00, 0x00, 0xfa, 0xf9, 0xf6, 0xfb, + 0xf9, 0xf3, 0xf5, 0xf1, 0xf2, 0xf2, 0xfa, 0xff, 0x03, 0x09, 0x01, 0x00, + 0x07, 0x09, 0x0a, 0x13, 0x1b, 0x1b, 0x17, 0x0b, 0x02, 0x01, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x07, 0x12, 0x0d, 0x07, 0x05, 0x07, 0x09, 0x02, 0x00, + 0xff, 0x02, 0x05, 0x02, 0xf9, 0xf1, 0xf6, 0xfe, 0x06, 0x05, 0x02, 0x05, + 0x00, 0xff, 0x00, 0x02, 0x10, 0x0b, 0x05, 0x05, 0x0d, 0x05, 0x01, 0xff, + 0x06, 0x10, 0x07, 0x02, 0x05, 0x07, 0x0b, 0x03, 0x05, 0x00, 0xfd, 0xfa, + 0xfb, 0x03, 0x01, 0x00, 0xff, 0xff, 0x03, 0x0b, 0x09, 0x05, 0x01, 0x03, + 0x0e, 0x0f, 0x0a, 0x05, 0xff, 0x03, 0x06, 0x01, 0xff, 0x01, 0x09, 0x0b, + 0x0b, 0x0f, 0x07, 0x03, 0x02, 0x00, 0x05, 0x02, 0x00, 0xfb, 0xff, 0xff, + 0xfd, 0xfa, 0xfa, 0xfa, 0xfe, 0x02, 0x05, 0x01, 0xff, 0xfd, 0xfb, 0xff, + 0x07, 0x07, 0x0a, 0x12, 0x12, 0x0b, 0x0b, 0x13, 0x16, 0x0e, 0x16, 0x14, + 0x14, 0x13, 0x12, 0x06, 0xfe, 0xf9, 0xf2, 0xf1, 0xf3, 0xff, 0xff, 0xfd, + 0xfe, 0xfd, 0xf5, 0xf7, 0xf7, 0xfa, 0x00, 0x06, 0x01, 0xfa, 0xfd, 0x02, + 0x0a, 0x0b, 0x10, 0x13, 0x12, 0x10, 0x07, 0xff, 0x02, 0x06, 0x03, 0x01, + 0x0b, 0x14, 0x0e, 0x0b, 0x09, 0x07, 0x03, 0x02, 0xfb, 0xfd, 0x03, 0x0a, + 0x0e, 0x0b, 0x0d, 0xff, 0xf7, 0xfa, 0xf9, 0xff, 0xfd, 0xfb, 0xfe, 0xfa, + 0xfd, 0x01, 0xff, 0xfa, 0x00, 0x06, 0x0a, 0x06, 0x01, 0x01, 0x01, 0x10, + 0x14, 0x12, 0x12, 0x0d, 0x10, 0x0d, 0x02, 0xfe, 0xf9, 0xfa, 0xfb, 0x01, + 0x05, 0x06, 0x09, 0x07, 0x05, 0x03, 0x03, 0x00, 0xfd, 0x01, 0x0a, 0x0b, + 0x09, 0x06, 0x01, 0xfa, 0xf9, 0xf6, 0xff, 0xff, 0x05, 0x07, 0x03, 0x0a, + 0x0b, 0x10, 0x0d, 0x0e, 0x0d, 0x0a, 0x07, 0x02, 0xfd, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0x0a, 0x05, 0x00, 0xfb, 0xf6, 0xf2, 0xf7, 0xf9, 0x00, 0x01, + 0x05, 0x0d, 0x0a, 0x0e, 0x0d, 0x0e, 0x0b, 0x0b, 0x0d, 0x0d, 0x14, 0x18, + 0x0e, 0x09, 0x01, 0xff, 0xff, 0x00, 0x07, 0x02, 0xff, 0xfe, 0x02, 0xff, + 0xfe, 0xfd, 0xfd, 0xfd, 0x00, 0x02, 0x00, 0xfe, 0xfb, 0xfd, 0x05, 0x05, + 0x06, 0x0a, 0x0b, 0x09, 0x01, 0xff, 0xfe, 0x00, 0xfd, 0x00, 0x10, 0x13, + 0x13, 0x0a, 0x05, 0x03, 0x0a, 0x0b, 0x0d, 0x06, 0x01, 0x0d, 0x13, 0x10, + 0x0a, 0x01, 0xf7, 0xf6, 0xf9, 0xfe, 0xfd, 0xfd, 0xfa, 0x02, 0x01, 0xfe, + 0xfb, 0x01, 0x0d, 0x09, 0x03, 0x02, 0x02, 0x02, 0xff, 0x01, 0x0b, 0x0b, + 0x05, 0x0d, 0x16, 0x0e, 0x01, 0xf9, 0x02, 0x03, 0x07, 0x0a, 0x05, 0x05, + 0x06, 0x05, 0x03, 0x02, 0x00, 0x01, 0x05, 0x07, 0x02, 0x07, 0x07, 0x06, + 0x02, 0xff, 0x00, 0xfe, 0x00, 0x01, 0x05, 0x03, 0x00, 0x05, 0x09, 0x03, + 0x00, 0x05, 0x02, 0x05, 0x07, 0x00, 0xfa, 0xfd, 0x05, 0x07, 0x0a, 0x0b, + 0x0a, 0x0a, 0x09, 0x01, 0xf5, 0xf2, 0xfb, 0xfd, 0xff, 0x07, 0x0d, 0x06, + 0x03, 0x12, 0x10, 0x0a, 0x07, 0x0a, 0x0e, 0x07, 0x09, 0x13, 0x0e, 0x03, + 0xfb, 0xf3, 0xfb, 0x01, 0xfd, 0xff, 0x01, 0xf9, 0xfb, 0x05, 0x07, 0x03, + 0x03, 0x09, 0x12, 0x0a, 0x03, 0x02, 0x01, 0x01, 0xff, 0x03, 0x03, 0xff, + 0x00, 0x0a, 0x02, 0xfd, 0xf6, 0xfa, 0xfb, 0x07, 0x0b, 0x09, 0x09, 0x06, + 0x02, 0x02, 0x00, 0x06, 0x13, 0x0f, 0x0b, 0x0b, 0x0b, 0x07, 0x0a, 0x0e, + 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff, 0x00, 0xfa, 0xfa, 0x03, 0x05, 0x06, + 0x0b, 0x0d, 0x06, 0x01, 0xfe, 0xff, 0xff, 0x00, 0x06, 0x0d, 0x0e, 0x07, + 0x05, 0x05, 0x02, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0x02, 0x03, 0x05, 0x02, + 0x07, 0x0a, 0x05, 0x0b, 0x0f, 0x0d, 0x06, 0x01, 0x02, 0x05, 0x01, 0xfd, + 0x02, 0x06, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x12, 0x0f, 0x05, 0x01, 0x00, + 0x02, 0x02, 0x07, 0x07, 0xfd, 0xf7, 0xfa, 0x02, 0x0a, 0x05, 0xff, 0xfb, + 0xfa, 0x02, 0x03, 0xff, 0x00, 0x05, 0x09, 0x09, 0x05, 0x07, 0x07, 0x0b, + 0x0f, 0x0b, 0x09, 0x02, 0x05, 0x01, 0x03, 0x14, 0x0f, 0x07, 0x01, 0xfd, + 0x05, 0x03, 0x02, 0x00, 0xf9, 0xf7, 0xfa, 0xff, 0x00, 0x05, 0x03, 0x03, + 0xff, 0x00, 0x02, 0x05, 0x06, 0x00, 0xff, 0xff, 0x05, 0x0b, 0x09, 0x0b, + 0x0f, 0x06, 0xfb, 0xfb, 0x03, 0x06, 0x0b, 0x07, 0x03, 0x03, 0x07, 0x06, + 0x07, 0x0e, 0x10, 0x10, 0x07, 0x07, 0x07, 0x09, 0x05, 0xfd, 0xf2, 0xf1, + 0xf3, 0xfe, 0xf9, 0xf1, 0xff, 0x06, 0x03, 0x02, 0x0b, 0x0f, 0x0f, 0x0e, + 0x0e, 0x0a, 0x09, 0x02, 0xff, 0x05, 0x0f, 0x0f, 0x05, 0x02, 0x02, 0x05, + 0x05, 0xfd, 0xf6, 0xf2, 0xf3, 0xf9, 0x02, 0xff, 0x01, 0x00, 0xfa, 0xff, + 0x10, 0x13, 0x0d, 0x06, 0x01, 0xfb, 0x03, 0x0f, 0x0f, 0x06, 0x0a, 0x12, + 0x0f, 0x0e, 0x02, 0x03, 0x0a, 0x0e, 0x03, 0x01, 0xff, 0x02, 0x09, 0x0a, + 0x03, 0x05, 0xff, 0xf6, 0xff, 0x05, 0x01, 0x01, 0xff, 0xf9, 0xf7, 0xfa, + 0xf9, 0xfe, 0x02, 0x07, 0x06, 0x03, 0xfd, 0xff, 0x14, 0x13, 0x0e, 0x0d, + 0x0d, 0x07, 0x09, 0x0a, 0x0d, 0x0d, 0x0a, 0x02, 0x01, 0x00, 0x01, 0x01, + 0x02, 0xfd, 0xf5, 0xfb, 0x03, 0x03, 0x09, 0x0e, 0x09, 0x05, 0x00, 0x05, + 0x05, 0x02, 0xfd, 0xfb, 0xf9, 0xf5, 0xf9, 0xff, 0x01, 0x03, 0x0e, 0x05, + 0x0b, 0x10, 0x0a, 0x0b, 0x0f, 0x07, 0x05, 0x05, 0x0a, 0x0a, 0x0e, 0x13, + 0x0f, 0x07, 0x03, 0x01, 0x05, 0x07, 0x02, 0xfd, 0xf1, 0xf1, 0xf6, 0xff, + 0x02, 0x00, 0xfb, 0xf9, 0x00, 0x03, 0x02, 0x02, 0x03, 0xfd, 0xfb, 0x03, + 0x0e, 0x0a, 0x0a, 0x1a, 0x14, 0x0d, 0x0e, 0x12, 0x0f, 0x0b, 0x01, 0xfb, + 0xfa, 0xf6, 0xf7, 0xfb, 0x00, 0x01, 0x02, 0x01, 0x02, 0x0d, 0x0a, 0x09, + 0x0a, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x05, 0x06, 0x07, 0x03, 0xfd, 0xff, + 0x05, 0x09, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x06, 0x0e, 0x0f, 0x09, 0x09, + 0x09, 0x0a, 0x00, 0xff, 0xff, 0xfe, 0xf7, 0xf3, 0xf9, 0xfa, 0xfb, 0x06, + 0x03, 0x00, 0xfd, 0xff, 0x00, 0xfe, 0xfe, 0x01, 0x03, 0x06, 0x06, 0x06, + 0x05, 0x0a, 0x16, 0x12, 0x18, 0x1b, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x01, + 0x01, 0x02, 0x02, 0x0d, 0x0a, 0x07, 0x01, 0xfd, 0xfb, 0xff, 0x00, 0xfe, + 0xfd, 0xf6, 0xf1, 0xf3, 0xfa, 0x00, 0xfe, 0xfd, 0x07, 0x05, 0x03, 0x07, + 0x07, 0x0a, 0x02, 0x07, 0x10, 0x0f, 0x10, 0x1a, 0x18, 0x13, 0x0e, 0x0a, + 0x09, 0x00, 0x00, 0x00, 0xfb, 0xf3, 0xec, 0xf0, 0xf5, 0xf6, 0xfb, 0x01, + 0x0b, 0x13, 0x0b, 0x05, 0x06, 0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0e, + 0x14, 0x10, 0x06, 0x01, 0x01, 0x0d, 0x0b, 0x02, 0xfb, 0xfe, 0x00, 0xfd, + 0xfb, 0xff, 0x06, 0x06, 0x0d, 0x0d, 0x07, 0x07, 0x05, 0x01, 0xfe, 0xfd, + 0xfe, 0x05, 0x0a, 0x10, 0x07, 0x00, 0xff, 0x03, 0x03, 0x00, 0x01, 0x07, + 0x0b, 0x05, 0xff, 0xfd, 0xfd, 0xfe, 0x05, 0x09, 0x0b, 0x0a, 0x0b, 0x06, + 0x01, 0xfe, 0xfe, 0x03, 0x09, 0x03, 0x03, 0x02, 0x06, 0x05, 0x02, 0x00, + 0xfb, 0xfb, 0x00, 0x00, 0xfb, 0xfd, 0x00, 0x03, 0x03, 0x05, 0x09, 0x16, + 0x1d, 0x1c, 0x12, 0x05, 0xff, 0x03, 0xff, 0xfd, 0x02, 0x00, 0x06, 0x0b, + 0x0a, 0x07, 0x05, 0x07, 0x07, 0x06, 0x01, 0x00, 0x00, 0xfd, 0xfe, 0xff, + 0xfa, 0xfa, 0xfa, 0xfe, 0x03, 0x02, 0xfe, 0x02, 0x01, 0x01, 0x03, 0x01, + 0x02, 0x06, 0x09, 0x0b, 0x0a, 0x09, 0x0d, 0x0f, 0x06, 0x0a, 0x0a, 0x05, + 0x00, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0x01, 0x03, 0x0d, 0x13, 0x0f, 0x0d, + 0x0d, 0x09, 0x01, 0xfa, 0xf7, 0xfa, 0x01, 0x05, 0x0a, 0x0f, 0x10, 0x0d, + 0x05, 0xfd, 0x00, 0x01, 0xf5, 0xf1, 0xf7, 0xf9, 0xfb, 0xf7, 0xff, 0x02, + 0x0a, 0x13, 0x09, 0x0b, 0x0d, 0x0b, 0x07, 0x06, 0x02, 0x07, 0x12, 0x0f, + 0x0d, 0x03, 0xf9, 0xfa, 0xf9, 0xf5, 0xf6, 0xfa, 0x05, 0x0e, 0x12, 0x0f, + 0x0d, 0x02, 0xff, 0x01, 0x0e, 0x16, 0x0a, 0x03, 0xfd, 0xfd, 0xfb, 0xfa, + 0xfd, 0xfb, 0x03, 0xfd, 0xfd, 0x02, 0x01, 0x05, 0x05, 0x01, 0x07, 0x0d, + 0x03, 0xfd, 0xfd, 0xfd, 0x00, 0xff, 0xff, 0x03, 0x1a, 0x25, 0x1c, 0x16, + 0x0d, 0x03, 0x01, 0xff, 0xff, 0x01, 0x02, 0x00, 0x05, 0x02, 0xfe, 0xff, + 0x00, 0x03, 0xfe, 0xfa, 0xf9, 0xf6, 0xf7, 0xfd, 0x00, 0x06, 0x02, 0x03, + 0x13, 0x20, 0x09, 0x01, 0x03, 0x02, 0x03, 0x09, 0x07, 0x07, 0x0b, 0x0a, + 0x09, 0x06, 0x05, 0x05, 0x07, 0x03, 0x00, 0x00, 0xfe, 0xfe, 0xfb, 0xf5, + 0xea, 0xf3, 0xff, 0x05, 0x05, 0x0b, 0x0f, 0x0d, 0x10, 0x13, 0x13, 0x0a, + 0x06, 0x0f, 0x09, 0x07, 0x05, 0x07, 0x13, 0x12, 0x0d, 0x07, 0x00, 0xff, + 0xf6, 0xf0, 0xf1, 0xf6, 0xf6, 0xf2, 0xf7, 0xf7, 0xfd, 0x09, 0x0b, 0x06, + 0xfe, 0xfd, 0xfe, 0x0a, 0x14, 0x0f, 0x0b, 0x14, 0x14, 0x13, 0x09, 0x00, + 0xff, 0x01, 0x02, 0x06, 0xfe, 0x07, 0x12, 0x0b, 0x07, 0x02, 0x03, 0x01, + 0x09, 0x0d, 0x0b, 0x06, 0xff, 0xff, 0xfa, 0xff, 0x03, 0xff, 0xf9, 0xf5, + 0xfb, 0xfa, 0xf7, 0xfa, 0xf9, 0x07, 0x0e, 0x06, 0x01, 0x00, 0x01, 0xff, + 0xfe, 0x00, 0x00, 0x06, 0x1a, 0x30, 0x30, 0x21, 0x10, 0x09, 0x00, 0xfe, + 0x03, 0x00, 0x00, 0xfd, 0xfa, 0xfe, 0x06, 0x07, 0x07, 0x07, 0x06, 0xfd, + 0xf7, 0xf5, 0xf6, 0xf2, 0xf6, 0xfa, 0x00, 0x0a, 0x0f, 0x03, 0x00, 0x02, + 0x02, 0x00, 0x02, 0x06, 0x16, 0x1d, 0x1d, 0x13, 0x10, 0x0d, 0x09, 0x05, + 0x00, 0xff, 0x02, 0x00, 0xfe, 0xfa, 0xfa, 0xfb, 0xf6, 0xf7, 0xfa, 0xfa, + 0x03, 0x05, 0x06, 0x09, 0x0b, 0x09, 0x03, 0x09, 0x13, 0x0b, 0x05, 0xfe, + 0xff, 0xff, 0x01, 0x0b, 0x10, 0x0e, 0x10, 0x0f, 0x00, 0x06, 0x06, 0x00, + 0xfb, 0xf7, 0xf6, 0xf6, 0x01, 0x06, 0x07, 0x05, 0x03, 0x01, 0x05, 0x09, + 0x02, 0xff, 0x01, 0x06, 0x07, 0x07, 0x01, 0xfe, 0xf1, 0x00, 0x05, 0x00, + 0xfa, 0xfa, 0x02, 0x0d, 0x0f, 0x12, 0x0e, 0x0a, 0x1b, 0x25, 0x21, 0x13, + 0x0b, 0x03, 0x00, 0x01, 0xff, 0xff, 0xfd, 0xf2, 0xf3, 0xf6, 0xf3, 0xfa, + 0xfa, 0xfd, 0xff, 0xfd, 0xf9, 0xf6, 0xf7, 0xf2, 0xf0, 0xf2, 0xfa, 0x06, + 0x16, 0x1f, 0x2a, 0x24, 0x23, 0x1d, 0x14, 0x0a, 0x0b, 0x0e, 0x13, 0x0d, + 0x09, 0x06, 0x00, 0xfd, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfa, 0xf3, 0xee, + 0xf9, 0x00, 0xfe, 0xfb, 0x06, 0x00, 0x00, 0x00, 0xfe, 0xfb, 0xfd, 0x02, + 0x0f, 0x18, 0x12, 0x0e, 0x10, 0x12, 0x0b, 0x0b, 0x0a, 0x03, 0x09, 0x0b, + 0x02, 0x02, 0xff, 0xfa, 0xfe, 0xf9, 0xed, 0xed, 0xfb, 0x06, 0x05, 0xff, + 0x02, 0x0b, 0x18, 0x14, 0x0d, 0x06, 0x02, 0x02, 0x02, 0x01, 0xfa, 0xfb, + 0x07, 0x12, 0x0f, 0x0e, 0x00, 0xf7, 0xfb, 0xfa, 0xf7, 0xf9, 0xfd, 0x00, + 0x0e, 0x12, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x03, 0xfb, 0xfd, 0x03, 0x03, + 0x06, 0x07, 0x09, 0x0a, 0x02, 0xf3, 0xf3, 0xf5, 0xfa, 0xfd, 0xfa, 0x00, + 0x00, 0xfb, 0x07, 0x12, 0x18, 0x17, 0x16, 0x0f, 0x0f, 0x10, 0x0d, 0x00, + 0xfd, 0x01, 0x01, 0xfd, 0x00, 0x0a, 0x0a, 0xff, 0xfb, 0xfe, 0xfb, 0x00, + 0xfe, 0xf9, 0xfa, 0xfe, 0xfb, 0xf9, 0xfa, 0xfd, 0x05, 0x07, 0x0f, 0x14, + 0x10, 0x13, 0x13, 0x0e, 0x0b, 0x05, 0x03, 0x07, 0x0a, 0x07, 0x03, 0x01, + 0x00, 0x00, 0x05, 0x0f, 0x0d, 0x06, 0x01, 0xfe, 0xff, 0xf9, 0xf9, 0xfd, + 0x06, 0x02, 0xff, 0xf7, 0x00, 0x09, 0x02, 0xfe, 0x00, 0x01, 0x09, 0x07, + 0x06, 0x05, 0x05, 0x01, 0xfb, 0x03, 0x05, 0x06, 0x0f, 0x0b, 0x01, 0xff, + 0xff, 0xff, 0xfe, 0xfd, 0x0f, 0x13, 0x0f, 0x0b, 0x0f, 0x13, 0x0f, 0x06, + 0xff, 0xfe, 0xfb, 0xfa, 0x00, 0x03, 0x09, 0x06, 0x01, 0x0b, 0x07, 0x01, + 0xfa, 0xf9, 0xfa, 0xf7, 0xf2, 0xf0, 0xf6, 0x01, 0x10, 0x12, 0x0a, 0x02, + 0x06, 0x0f, 0x0a, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0a, 0x07, 0x05, 0x06, + 0x03, 0xfd, 0xee, 0xf1, 0xf6, 0xf7, 0xf9, 0x01, 0x0a, 0x06, 0x00, 0x0b, + 0x21, 0x20, 0x10, 0x09, 0x0e, 0x13, 0x0b, 0x03, 0x06, 0x05, 0xfe, 0xf7, + 0xfb, 0xfb, 0xfb, 0xfd, 0xf7, 0xfb, 0x02, 0x01, 0x03, 0x02, 0x00, 0xfd, + 0xfb, 0xfa, 0xf7, 0xf9, 0x0b, 0x13, 0x0d, 0x13, 0x25, 0x1d, 0x14, 0x13, + 0x10, 0x05, 0x00, 0xfd, 0x00, 0x02, 0xfe, 0xfd, 0xfd, 0x00, 0x01, 0x01, + 0x01, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xfa, 0xff, 0x13, 0x13, 0x01, 0xf9, + 0x01, 0x07, 0x0a, 0x05, 0x02, 0x03, 0x06, 0x10, 0x0e, 0x13, 0x12, 0x0d, + 0x09, 0x03, 0x02, 0x01, 0x02, 0x00, 0xf9, 0xf2, 0xee, 0xee, 0xf9, 0x06, + 0x09, 0x09, 0x05, 0x03, 0x10, 0x0b, 0x06, 0x0d, 0x0f, 0x0d, 0x07, 0x0a, + 0x0a, 0x03, 0x06, 0x06, 0x09, 0x06, 0x09, 0x0a, 0x01, 0xf7, 0xfb, 0x00, + 0xfb, 0xfb, 0xf7, 0xfe, 0x0a, 0x05, 0x02, 0xff, 0x00, 0x00, 0xfd, 0x00, + 0x06, 0x05, 0x01, 0x0b, 0x0b, 0x0a, 0x07, 0x09, 0x0a, 0x0a, 0x0a, 0xff, + 0x00, 0xff, 0xfe, 0x02, 0x01, 0x02, 0x0d, 0x0d, 0x16, 0x10, 0x0d, 0x0e, + 0x17, 0x12, 0x0d, 0x0e, 0x06, 0x00, 0xf7, 0xfa, 0xf3, 0xec, 0xf0, 0xf5, + 0xf6, 0xf6, 0x05, 0x00, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfd, 0xfe, 0x06, + 0x0f, 0x0d, 0x0f, 0x13, 0x1a, 0x1d, 0x13, 0x10, 0x0f, 0x0b, 0x07, 0xfe, + 0x01, 0x03, 0x06, 0x06, 0x02, 0xfe, 0xfe, 0x01, 0x05, 0x00, 0xfe, 0xfd, + 0xfb, 0xfb, 0xfe, 0x0e, 0x12, 0x03, 0x02, 0xfd, 0xff, 0xfe, 0xfe, 0x05, + 0x02, 0xff, 0x02, 0x03, 0x0b, 0x0e, 0x09, 0x07, 0x05, 0x03, 0x06, 0x03, + 0x03, 0x06, 0x09, 0x09, 0x02, 0x00, 0xff, 0x05, 0x0f, 0x07, 0xfa, 0xff, + 0x07, 0x03, 0xfa, 0xfe, 0x02, 0x06, 0x03, 0x02, 0xfe, 0xfb, 0xff, 0x03, + 0x03, 0x0a, 0x06, 0x06, 0x07, 0x09, 0x00, 0xf7, 0xfd, 0xfe, 0xfe, 0x03, + 0x12, 0x10, 0x09, 0x07, 0x13, 0x12, 0x06, 0x05, 0x05, 0x03, 0x00, 0x01, + 0x02, 0x00, 0xfd, 0xfd, 0xf6, 0xf6, 0x01, 0x00, 0xff, 0xf3, 0xf3, 0xf7, + 0x00, 0x06, 0x0a, 0x10, 0x1b, 0x1f, 0x16, 0x13, 0x1b, 0x17, 0x0a, 0x0d, + 0x10, 0x0a, 0x02, 0xfe, 0xf9, 0xf7, 0xf6, 0xf7, 0xf6, 0xf9, 0xfa, 0xfd, + 0xfe, 0xf7, 0xf9, 0xf5, 0xf2, 0xf0, 0xea, 0xf7, 0x0b, 0x0d, 0x0a, 0x0a, + 0x10, 0x10, 0x17, 0x24, 0x23, 0x18, 0x13, 0x14, 0x0b, 0x03, 0x07, 0x05, + 0x03, 0x02, 0x03, 0x01, 0x00, 0xfe, 0x00, 0x03, 0x02, 0xff, 0xff, 0x05, + 0x07, 0x07, 0xff, 0xf9, 0xfd, 0xf3, 0xec, 0xf2, 0xfa, 0x03, 0x05, 0x01, + 0xfe, 0xff, 0x0b, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x07, 0x05, 0x09, 0x0a, + 0x05, 0x01, 0x01, 0x01, 0x07, 0x10, 0x0a, 0x02, 0x00, 0x0b, 0x07, 0x09, + 0x09, 0x0a, 0x03, 0xfd, 0xfb, 0xfd, 0x01, 0x02, 0xfd, 0xfb, 0x01, 0x0b, + 0x03, 0x05, 0x05, 0x01, 0xfb, 0xfd, 0x06, 0x03, 0x03, 0x0d, 0x0a, 0x0a, + 0x09, 0x09, 0x02, 0x00, 0xfe, 0x02, 0x02, 0x01, 0xfa, 0xff, 0x0f, 0x12, + 0x09, 0x06, 0x06, 0x05, 0x02, 0xff, 0x01, 0xf7, 0xf6, 0xfa, 0xf7, 0xf3, + 0x01, 0x1b, 0x14, 0x0e, 0x0e, 0x12, 0x12, 0x16, 0x10, 0x0b, 0x06, 0x03, + 0x01, 0xfe, 0xfa, 0xf7, 0xf2, 0xf3, 0xf7, 0xf9, 0xfb, 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x01, 0xfe, 0x01, 0x0e, 0x07, 0x05, 0x06, 0x0a, 0x07, 0x00, + 0x02, 0x07, 0x13, 0x10, 0x07, 0x0a, 0x05, 0xfb, 0x05, 0x02, 0x05, 0x02, + 0x01, 0x05, 0x09, 0x0a, 0x05, 0x02, 0x03, 0xfe, 0x01, 0x0b, 0x06, 0x06, + 0xff, 0x03, 0xff, 0xf6, 0xfe, 0xfd, 0xfb, 0x00, 0xfb, 0xf7, 0xf5, 0xf9, + 0x00, 0xfd, 0xff, 0x00, 0x0a, 0x0a, 0x0b, 0x0a, 0x07, 0x0a, 0x10, 0x0a, + 0x0f, 0x18, 0x1b, 0x17, 0x10, 0x0e, 0x03, 0xfe, 0x06, 0x07, 0x03, 0x00, + 0xff, 0xfe, 0x00, 0x02, 0x00, 0x03, 0x09, 0x02, 0xfa, 0xfa, 0xff, 0xfd, + 0xfb, 0xfa, 0xf1, 0xed, 0xf3, 0x09, 0x1a, 0x10, 0x07, 0x06, 0x0d, 0x0e, + 0x0b, 0x03, 0x03, 0x01, 0xff, 0x00, 0xfd, 0xff, 0x05, 0x05, 0x05, 0x02, + 0xfd, 0x00, 0x06, 0x03, 0x06, 0x06, 0x02, 0xff, 0xfe, 0x06, 0x0f, 0x10, + 0x0b, 0x06, 0x0a, 0x0f, 0x10, 0x07, 0x09, 0x0d, 0x07, 0x05, 0x02, 0x00, + 0x03, 0xfe, 0xf9, 0xf9, 0xf5, 0xfa, 0xff, 0x00, 0xff, 0xfe, 0xfe, 0xfa, + 0xfb, 0xfe, 0x03, 0x00, 0x05, 0x06, 0x0b, 0x10, 0x12, 0x13, 0x12, 0x18, + 0x13, 0x0d, 0x0b, 0x06, 0x03, 0xf6, 0xf5, 0xf3, 0xf9, 0x07, 0x0b, 0x06, + 0x00, 0x06, 0x09, 0x02, 0xfe, 0xfb, 0x05, 0x0b, 0x0d, 0x05, 0xfe, 0xfd, + 0x01, 0xf9, 0xf7, 0xf6, 0xfa, 0xfe, 0x02, 0x05, 0x0b, 0x0e, 0x12, 0x0f, + 0x0b, 0x0b, 0x09, 0x06, 0x03, 0x00, 0x01, 0xfd, 0xfa, 0xfd, 0x13, 0x1c, + 0x16, 0x12, 0x0e, 0x14, 0x03, 0xf7, 0xfe, 0x02, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03, 0x06, 0xff, 0xfd, 0xff, 0x00, 0xfb, 0xfd, 0x0e, 0x09, + 0x00, 0xfa, 0x00, 0x0b, 0x07, 0x02, 0xfa, 0xfb, 0xfe, 0xf9, 0xfb, 0x00, + 0x0f, 0x0d, 0x02, 0x00, 0x05, 0x09, 0x0a, 0x09, 0x05, 0x05, 0x13, 0x14, + 0x0e, 0x07, 0x05, 0x02, 0xfa, 0xf7, 0xfb, 0x06, 0x09, 0x13, 0x0e, 0x0f, + 0x18, 0x10, 0x0e, 0x0a, 0x07, 0x05, 0x00, 0xfe, 0xf7, 0xf1, 0xf1, 0xf0, + 0xf1, 0xf3, 0x02, 0xff, 0xfe, 0x01, 0x0b, 0x05, 0xfe, 0xfd, 0x00, 0x09, + 0x09, 0x07, 0x03, 0x01, 0x06, 0x02, 0x03, 0x06, 0x07, 0x12, 0x0f, 0x10, + 0x10, 0x12, 0x18, 0x05, 0xfe, 0x01, 0x02, 0x05, 0xff, 0xfa, 0xfb, 0xfa, + 0xfa, 0xfe, 0xfe, 0x0d, 0x16, 0x0f, 0x0b, 0x05, 0x07, 0x02, 0x02, 0x02, + 0xfa, 0xfa, 0x00, 0x00, 0xfd, 0xf7, 0xf7, 0xfe, 0x06, 0x0b, 0x09, 0x02, + 0x00, 0x03, 0x0a, 0x0d, 0x05, 0x01, 0x07, 0x16, 0x1a, 0x16, 0x0d, 0x03, + 0x06, 0x03, 0xfa, 0xed, 0xf9, 0x0a, 0x0b, 0x05, 0x02, 0x03, 0x02, 0x01, + 0xfe, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xfa, 0xfa, 0x02, 0x01, 0x02, 0x00, + 0x02, 0x06, 0x0b, 0x03, 0x03, 0x18, 0x14, 0x0f, 0x0d, 0x07, 0x06, 0x09, + 0x03, 0xfd, 0xf9, 0xf5, 0xf9, 0x00, 0x06, 0x10, 0x0e, 0x0b, 0x0b, 0x0f, + 0x0b, 0x06, 0xf9, 0xf1, 0x02, 0x05, 0x05, 0x02, 0x06, 0x0d, 0x0d, 0x12, + 0x10, 0x0f, 0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0xff, 0x00, 0x00, 0xfd, + 0xf5, 0xf2, 0xee, 0xec, 0xe9, 0xf0, 0xf6, 0xfa, 0x0b, 0x16, 0x0d, 0x09, + 0x09, 0x10, 0x09, 0x05, 0x05, 0x0b, 0x12, 0x1d, 0x20, 0x17, 0x12, 0x17, + 0x14, 0x07, 0xfa, 0xfe, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x03, 0x00, 0x00, + 0x06, 0x09, 0x00, 0xfa, 0xf2, 0xfb, 0xfb, 0xfd, 0xfd, 0xfb, 0x05, 0x0a, + 0x03, 0xff, 0x00, 0x06, 0x02, 0x02, 0x01, 0x0b, 0x0a, 0x03, 0x01, 0x01, + 0x05, 0x03, 0xff, 0xfe, 0x02, 0x13, 0x0f, 0x0d, 0x07, 0x03, 0x12, 0x18, + 0x13, 0x00, 0xfb, 0x00, 0x01, 0x02, 0xf9, 0xf9, 0xfd, 0xf9, 0xf9, 0x02, + 0x12, 0x0e, 0x05, 0x03, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x0d, 0x0f, 0x0a, + 0xfe, 0xf6, 0xfe, 0x09, 0x05, 0x01, 0x06, 0x0a, 0x03, 0x01, 0xfd, 0x00, + 0x05, 0x01, 0xfd, 0x00, 0x07, 0x0d, 0x09, 0x05, 0x00, 0xfe, 0xfd, 0x00, + 0xfe, 0xfa, 0x0f, 0x12, 0x09, 0x02, 0x0b, 0x1a, 0x14, 0x0e, 0x0e, 0x0e, + 0x02, 0xfd, 0xf9, 0x00, 0x05, 0xf9, 0xf6, 0xfe, 0x00, 0xfe, 0xfd, 0xf3, + 0xee, 0xf1, 0xf6, 0x01, 0x0b, 0x12, 0x18, 0x0d, 0x01, 0xf9, 0xf7, 0x05, + 0x09, 0x07, 0x0e, 0x14, 0x1b, 0x16, 0x1f, 0x1f, 0x1b, 0x18, 0x12, 0x0b, + 0x05, 0xf5, 0xf2, 0xf2, 0xf1, 0xf9, 0xfd, 0xf9, 0xfa, 0xfb, 0x05, 0x07, + 0x00, 0xf5, 0xf1, 0xfa, 0x0a, 0x16, 0x10, 0x0e, 0x02, 0xfe, 0xff, 0xf7, + 0xee, 0xf7, 0xf7, 0xf7, 0xf9, 0x02, 0x17, 0x0b, 0x07, 0x12, 0x0f, 0x0b, + 0x06, 0x06, 0x0a, 0x0f, 0x0a, 0x07, 0x05, 0x0e, 0x1a, 0x17, 0x13, 0x12, + 0x02, 0xf5, 0xf9, 0xfb, 0x00, 0x02, 0xff, 0x06, 0x01, 0xff, 0x00, 0xf7, + 0xf9, 0xf9, 0xfb, 0xf7, 0xf1, 0xfb, 0x09, 0x1b, 0x1a, 0x0e, 0x05, 0x05, + 0x02, 0x0b, 0x09, 0x0a, 0x07, 0x00, 0xfe, 0xff, 0x01, 0x02, 0x00, 0xfb, + 0x00, 0xfb, 0xf9, 0xf9, 0x00, 0x05, 0x05, 0x00, 0x00, 0x0b, 0x0f, 0x17, + 0x0d, 0xfd, 0xf6, 0xf7, 0x00, 0x0d, 0x13, 0x12, 0x10, 0x17, 0x12, 0x0f, + 0x10, 0x12, 0x0e, 0x02, 0xfe, 0xf9, 0xf7, 0xf2, 0xf6, 0xf7, 0x00, 0xfe, + 0xf0, 0xf1, 0xf5, 0x01, 0x0a, 0x02, 0xfb, 0xf7, 0xfe, 0x09, 0x13, 0x1c, + 0x18, 0x0f, 0x0f, 0x0b, 0x07, 0x13, 0x0f, 0x0e, 0x10, 0x0a, 0x07, 0x0e, + 0x02, 0xfb, 0x00, 0x06, 0x00, 0xf7, 0xf6, 0xfa, 0x01, 0xfe, 0xf2, 0xf5, + 0xfd, 0xff, 0x00, 0x09, 0x05, 0x03, 0xfe, 0xff, 0xff, 0x03, 0x06, 0x06, + 0xfd, 0x00, 0x05, 0x0a, 0x07, 0x10, 0x09, 0x09, 0x02, 0x00, 0x00, 0x03, + 0x0e, 0x1d, 0x17, 0x0e, 0x10, 0x13, 0x12, 0x17, 0x10, 0x09, 0x00, 0xfd, + 0xed, 0xf2, 0xf9, 0xf9, 0xf9, 0xfa, 0xf7, 0xf9, 0xf7, 0xf7, 0xf9, 0x01, + 0x03, 0x03, 0x01, 0x06, 0x0b, 0x1c, 0x0a, 0x05, 0x02, 0x00, 0x01, 0x05, + 0x03, 0x00, 0xfd, 0x09, 0x0a, 0x03, 0x05, 0x0a, 0x05, 0x00, 0xfd, 0xfd, + 0xfb, 0xfd, 0x00, 0x01, 0x07, 0x07, 0x0a, 0x0e, 0x0d, 0x14, 0x10, 0x03, + 0xf9, 0x01, 0x05, 0x07, 0x14, 0x23, 0x1c, 0x10, 0x09, 0x01, 0x00, 0xff, + 0xfb, 0xf7, 0xf9, 0xf3, 0xf1, 0xfd, 0x00, 0xff, 0x01, 0x03, 0x01, 0xf6, + 0xe6, 0xed, 0xfb, 0x00, 0x05, 0x0a, 0x07, 0x0a, 0x10, 0x16, 0x0e, 0x0d, + 0x0b, 0x07, 0x07, 0x0b, 0x13, 0x10, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0xfb, + 0xea, 0xf5, 0xf5, 0xf9, 0xf6, 0xf7, 0x00, 0x0e, 0x0a, 0x05, 0x07, 0x10, + 0x0b, 0x0b, 0x05, 0xff, 0xff, 0xfe, 0x01, 0x03, 0x02, 0x07, 0x07, 0xfe, + 0xf6, 0xfd, 0xff, 0xff, 0x07, 0x0b, 0x06, 0x02, 0x02, 0x09, 0x0d, 0x16, + 0x0d, 0x07, 0x07, 0x07, 0x01, 0x07, 0x0e, 0x10, 0x0e, 0x13, 0x0b, 0xf9, + 0xf2, 0xf9, 0xf6, 0xf0, 0xf7, 0xfd, 0xfa, 0xf9, 0xfd, 0x01, 0x03, 0x03, + 0x02, 0x02, 0xfe, 0x07, 0x0b, 0x09, 0x0a, 0x0f, 0x0f, 0x0a, 0x16, 0x0b, + 0x03, 0x01, 0x09, 0x0a, 0x02, 0xf7, 0xf5, 0xfa, 0xfe, 0x00, 0x00, 0x0a, + 0x05, 0x02, 0x0b, 0x0f, 0x0d, 0x02, 0xff, 0x03, 0x0f, 0x0d, 0x0b, 0x00, + 0x00, 0x03, 0x02, 0x09, 0x0e, 0x0a, 0x07, 0x07, 0x05, 0x00, 0xfe, 0x00, + 0x02, 0x0b, 0x06, 0xfe, 0xf6, 0xf2, 0xf6, 0xfa, 0xf2, 0xf2, 0xf2, 0xe9, + 0xf5, 0x07, 0x07, 0x0d, 0x13, 0x0e, 0x09, 0x10, 0x0e, 0x0f, 0x0d, 0x0e, + 0x10, 0x0b, 0x0a, 0x0a, 0x10, 0x0f, 0x10, 0x13, 0x0b, 0x05, 0x00, 0xfa, + 0xf7, 0xf6, 0xfa, 0x02, 0x05, 0x10, 0x0b, 0x05, 0xfe, 0xf7, 0xf3, 0x01, + 0x00, 0xfe, 0xfa, 0x0a, 0x02, 0x00, 0x00, 0xff, 0x02, 0x09, 0x02, 0xf7, + 0xf7, 0xfd, 0x01, 0x0b, 0x14, 0x06, 0x00, 0x03, 0x07, 0x18, 0x13, 0x0b, + 0x0d, 0x0e, 0x0b, 0x0e, 0x0e, 0x14, 0x0a, 0x07, 0x05, 0xfd, 0xf5, 0xe1, + 0xdf, 0xf0, 0xf9, 0x00, 0x00, 0x06, 0x05, 0x02, 0x02, 0x06, 0x0b, 0x0b, + 0x02, 0x05, 0x0d, 0x0f, 0x0e, 0x12, 0x12, 0x0f, 0x17, 0x0f, 0x03, 0xfb, + 0xff, 0x00, 0xf9, 0xf5, 0xf3, 0xfd, 0x02, 0x06, 0x01, 0x01, 0xf9, 0xf6, + 0xf5, 0xfb, 0xff, 0x01, 0x02, 0x02, 0x14, 0x21, 0x1a, 0x1c, 0x10, 0x00, + 0x01, 0x02, 0x00, 0x05, 0x0d, 0x0a, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0xf9, 0xf2, 0xec, 0xf2, 0xfa, 0xfb, 0x02, 0xff, 0xff, 0x07, + 0xff, 0x01, 0x0d, 0x0b, 0x09, 0x0d, 0x10, 0x09, 0x07, 0x18, 0x17, 0x0e, + 0x06, 0x09, 0x0b, 0x0f, 0x0e, 0x07, 0x03, 0x06, 0x02, 0x01, 0xff, 0xf3, + 0xf3, 0xf9, 0x00, 0x07, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x0f, 0x0d, + 0x02, 0x01, 0x02, 0xf9, 0xf2, 0xf6, 0xfd, 0x00, 0x00, 0xfd, 0xf7, 0x00, + 0x02, 0xfb, 0xfa, 0x0b, 0x14, 0x0a, 0x05, 0x13, 0x1f, 0x14, 0x13, 0x13, + 0x10, 0x16, 0x10, 0x0d, 0x03, 0x00, 0x05, 0x05, 0xfe, 0xfd, 0xfd, 0xf1, + 0xfd, 0x05, 0x07, 0x02, 0x00, 0xf7, 0xf3, 0xf9, 0xfb, 0xfd, 0x00, 0x00, + 0x0e, 0x0d, 0x0a, 0x13, 0x10, 0x0f, 0x13, 0x0e, 0x07, 0x00, 0xfe, 0xfb, + 0xfb, 0x03, 0x01, 0xff, 0x01, 0xff, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf9, + 0x02, 0x10, 0x13, 0x0d, 0x16, 0x1b, 0x0f, 0x07, 0x05, 0x0f, 0x0a, 0xfb, + 0xfe, 0xfd, 0xfb, 0x0d, 0x0a, 0x0a, 0x07, 0x05, 0x05, 0x02, 0x05, 0x05, + 0x00, 0xf9, 0xf5, 0xf9, 0xfb, 0xff, 0x00, 0xff, 0xf7, 0x05, 0x01, 0xfe, + 0x05, 0x10, 0x12, 0x16, 0x0f, 0x0a, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x09, 0x02, 0x0e, 0x10, 0x0a, 0x0a, 0x0b, 0x03, 0xf7, + 0xfb, 0x05, 0x0b, 0x00, 0x05, 0x0d, 0x0a, 0x03, 0x00, 0xff, 0xf9, 0xf9, + 0x00, 0xfb, 0xfb, 0xfe, 0x00, 0x09, 0x00, 0xf9, 0xf6, 0x00, 0xfe, 0xf6, + 0xf5, 0xfe, 0x0a, 0x16, 0x0d, 0x0d, 0x18, 0x1b, 0x23, 0x25, 0x1d, 0x12, + 0x10, 0x09, 0xfe, 0xf9, 0xfb, 0xfb, 0xfb, 0xff, 0x01, 0x01, 0xf7, 0xf3, + 0xf9, 0xfa, 0xf7, 0xfa, 0xfd, 0xfe, 0x05, 0x06, 0x0d, 0x10, 0x16, 0x0f, + 0x07, 0x07, 0x0d, 0x0e, 0x06, 0x07, 0x00, 0xf3, 0xf6, 0x03, 0x03, 0x01, + 0xfd, 0xff, 0xfe, 0xf9, 0xf7, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x07, 0x0d, + 0x0d, 0x07, 0x0d, 0x16, 0x0e, 0x14, 0x1b, 0x16, 0x1d, 0x1c, 0x0d, 0xfb, + 0xf9, 0xfb, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf5, 0xf2, 0x01, + 0xfe, 0xf6, 0xf9, 0xfb, 0xf3, 0xf6, 0xf3, 0x07, 0x0a, 0x07, 0x16, 0x17, + 0x16, 0x0f, 0x07, 0x00, 0x00, 0xff, 0x01, 0x03, 0x09, 0x0f, 0x12, 0x0a, + 0x05, 0x01, 0x06, 0x0a, 0x05, 0x00, 0x00, 0x07, 0x0a, 0x09, 0xf7, 0xf9, + 0x02, 0x0d, 0x14, 0x05, 0x00, 0xff, 0xff, 0xfe, 0xf9, 0x00, 0x09, 0x05, + 0x00, 0x00, 0xfe, 0xfb, 0xf6, 0xf5, 0xf5, 0xff, 0x02, 0xfe, 0x00, 0x07, + 0x02, 0x05, 0x0f, 0x10, 0x1b, 0x20, 0x20, 0x1a, 0x12, 0x09, 0x02, 0xff, + 0xf9, 0xf7, 0xff, 0x09, 0x06, 0x01, 0x00, 0x02, 0x07, 0x05, 0xf6, 0xfe, + 0xfe, 0xfb, 0xfe, 0x00, 0xfd, 0xfe, 0x00, 0x02, 0x0f, 0x17, 0x12, 0x0a, + 0x0d, 0x0d, 0x14, 0x06, 0x00, 0xfb, 0x00, 0x01, 0x00, 0xf6, 0xf3, 0xf6, + 0xf6, 0xfb, 0xfe, 0xfd, 0xfd, 0x07, 0x06, 0x02, 0x0a, 0x07, 0x06, 0x0a, + 0x0d, 0x1f, 0x1c, 0x0a, 0x0a, 0x0d, 0x0e, 0x12, 0x0f, 0x00, 0xf1, 0xf1, + 0xf6, 0x06, 0x0a, 0x07, 0x09, 0x0d, 0x0a, 0x09, 0x05, 0xfe, 0xf9, 0xf3, + 0xf3, 0xf1, 0xee, 0xec, 0xf2, 0x0a, 0x14, 0x1a, 0x0f, 0x05, 0x02, 0x05, + 0x00, 0xfb, 0xfe, 0xfe, 0x02, 0x05, 0x07, 0x0a, 0x05, 0x00, 0x01, 0x01, + 0x01, 0x0f, 0x0f, 0x0f, 0x12, 0x1a, 0x1f, 0x1a, 0x0f, 0x0d, 0x10, 0x06, + 0xfe, 0xfe, 0xf9, 0xf7, 0xfb, 0xf7, 0xf9, 0xfb, 0xfb, 0x03, 0x00, 0xf7, + 0xf6, 0xf9, 0xf2, 0xec, 0xf3, 0x00, 0x05, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x07, 0x1b, 0x30, 0x24, 0x21, 0x1f, 0x1f, 0x14, 0x0a, 0x02, 0x00, 0x00, + 0xfb, 0xf9, 0xf6, 0xf9, 0xf6, 0x00, 0x0a, 0x09, 0x02, 0xf5, 0xf3, 0xfe, + 0xf3, 0xf6, 0xfe, 0x00, 0x00, 0x05, 0x21, 0x1c, 0x0f, 0x09, 0x07, 0x05, + 0x03, 0x02, 0xf9, 0xfb, 0x00, 0x0d, 0x0b, 0x02, 0xfe, 0x00, 0x00, 0xfe, + 0xfe, 0xfe, 0xfe, 0xfb, 0xfe, 0x05, 0x00, 0x00, 0x01, 0x07, 0x1a, 0x1f, + 0x12, 0x0f, 0x07, 0x0d, 0x12, 0x14, 0x0d, 0x05, 0x00, 0xf6, 0xf9, 0xf9, + 0x00, 0x05, 0x02, 0x05, 0x02, 0x00, 0x05, 0x07, 0xff, 0x01, 0x00, 0xfb, + 0xf6, 0xf1, 0x00, 0x0d, 0x0d, 0x07, 0x02, 0x00, 0xfe, 0xfe, 0xfb, 0xf9, + 0xfb, 0x00, 0x05, 0x07, 0x02, 0x0d, 0x07, 0x05, 0x00, 0x00, 0x00, 0x05, + 0x14, 0x0d, 0x05, 0x0b, 0x16, 0x1d, 0x1c, 0x24, 0x1b, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0xfa, 0xf3, + 0xe6, 0xec, 0xf0, 0xf1, 0x07, 0x05, 0x00, 0x00, 0xfe, 0x05, 0x05, 0x16, + 0x25, 0x1a, 0x0d, 0x0e, 0x0d, 0x07, 0x05, 0x05, 0x05, 0x0d, 0x03, 0x00, + 0x02, 0x02, 0x07, 0x0d, 0x14, 0x0f, 0x0a, 0x05, 0xf7, 0xf6, 0xf3, 0xf1, + 0xf9, 0x02, 0x02, 0x01, 0x0d, 0x07, 0x07, 0x00, 0x05, 0x05, 0xfe, 0xf6, + 0xf9, 0xf9, 0xfb, 0x02, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x02, 0x03, + 0x00, 0x0d, 0x0f, 0x0a, 0x07, 0x10, 0x0f, 0x0d, 0x1a, 0x12, 0x06, 0x02, + 0x02, 0x00, 0x02, 0x05, 0x02, 0xfe, 0xfd, 0xfb, 0xf7, 0xff, 0x02, 0x0a, + 0x03, 0x00, 0xfe, 0xfb, 0xfe, 0x05, 0x00, 0xff, 0x07, 0x0d, 0xfb, 0xfb, + 0x0d, 0x13, 0x0d, 0x07, 0x03, 0x02, 0x02, 0x00, 0x00, 0xfe, 0xfe, 0xfe, + 0xff, 0x00, 0x05, 0x00, 0xfe, 0xfb, 0xfd, 0x00, 0x00, 0x0d, 0x17, 0x1a, + 0x14, 0x1a, 0x14, 0x12, 0x1a, 0x21, 0x1a, 0x00, 0xf6, 0xf7, 0xfa, 0xfe, + 0x0a, 0x0d, 0x00, 0xfb, 0xfe, 0x05, 0x07, 0x00, 0xf6, 0xee, 0xee, 0xf1, + 0xf0, 0xfb, 0xfb, 0xfb, 0x00, 0x01, 0xfe, 0xf9, 0xfb, 0x07, 0x0f, 0x1f, + 0x1a, 0x12, 0x0f, 0x0a, 0x05, 0x02, 0x03, 0x01, 0x01, 0x01, 0x09, 0x0e, + 0x0b, 0x10, 0x13, 0x0e, 0x0b, 0x13, 0x06, 0xf5, 0x03, 0x09, 0x06, 0x03, + 0x03, 0x0b, 0x06, 0x06, 0xfd, 0xf7, 0xfb, 0xf6, 0xf0, 0xf0, 0xfa, 0xf2, + 0xf2, 0x0a, 0x13, 0x0e, 0x03, 0x00, 0xfd, 0xfd, 0xf7, 0xfd, 0x03, 0x03, + 0x0d, 0x0b, 0x0d, 0x13, 0x0b, 0x17, 0x1c, 0x1b, 0x10, 0x06, 0x06, 0x09, + 0x09, 0x03, 0x06, 0x0d, 0x09, 0x06, 0xfa, 0xf2, 0xf5, 0xfb, 0xfd, 0xf7, + 0xf1, 0xf2, 0x01, 0x18, 0x1d, 0x0b, 0xf2, 0xf2, 0xf2, 0x03, 0x09, 0x09, + 0x03, 0x00 +}; diff --git a/examples/PlayMODFromPROGMEMToPWM/PlayMODFromPROGMEMToPWM.ino b/examples/PlayMODFromPROGMEMToPWM/PlayMODFromPROGMEMToPWM.ino new file mode 100644 index 00000000..577da0e2 --- /dev/null +++ b/examples/PlayMODFromPROGMEMToPWM/PlayMODFromPROGMEMToPWM.ino @@ -0,0 +1,47 @@ +#include +#include "AudioFileSourcePROGMEM.h" +#include "AudioGeneratorMOD.h" +#include "AudioOutputPWM.h" + +#if !defined(ARDUINO_ARCH_RP2040) +void setup() { + Serial.begin(115200); + Serial.printf("Only for the RP2040/Raspberry Pi Pico\n"); +} + +void loop() { +} +#else + +// 5_steps.mod sample from the mod archive: https://modarchive.org/ +#include "5steps.h" + +AudioGeneratorMOD *mod; +AudioFileSourcePROGMEM *file; +AudioOutputPWM *out; + +void setup() { + Serial.begin(115200); + delay(1000); + + audioLogger = &Serial; + file = new AudioFileSourcePROGMEM(steps_mod, sizeof(steps_mod)); + out = new AudioOutputPWM(); + mod = new AudioGeneratorMOD(); + mod->SetBufferSize(3 * 1024); + mod->SetSampleRate(44100); + mod->SetStereoSeparation(32); + mod->begin(file, out); +} + +void loop() { + if (mod->isRunning()) { + if (!mod->loop()) { + mod->stop(); + } + } else { + Serial.printf("MOD done\n"); + delay(1000); + } +} +#endif diff --git a/examples/PlayMP3FromSPIFFS/PlayMP3FromSPIFFS.ino b/examples/PlayMP3FromSPIFFS/PlayMP3FromSPIFFS.ino index 364a7a89..eec99937 100644 --- a/examples/PlayMP3FromSPIFFS/PlayMP3FromSPIFFS.ino +++ b/examples/PlayMP3FromSPIFFS/PlayMP3FromSPIFFS.ino @@ -1,9 +1,14 @@ #include +#if defined(ARDUINO_ARCH_RP2040) +void setup() {} +void loop() {} +#else + #ifdef ESP32 - #include - #include "SPIFFS.h" +#include +#include "SPIFFS.h" #else - #include +#include #endif #include "AudioFileSourceSPIFFS.h" #include "AudioFileSourceID3.h" @@ -12,7 +17,7 @@ // To run, set your ESP8266 build to 160MHz, and include a SPIFFS of 512KB or greater. // Use the "Tools->ESP8266/ESP32 Sketch Data Upload" menu to write the MP3 to SPIFFS -// Then upload the sketch normally. +// Then upload the sketch normally. // pno_cs from https://ccrma.stanford.edu/~jos/pasp/Sound_Examples.html @@ -23,15 +28,14 @@ AudioFileSourceID3 *id3; // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. -void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) -{ +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { (void)cbData; Serial.printf("ID3 callback for: %s = '", type); if (isUnicode) { string += 2; } - + while (*string) { char a = *(string++); if (isUnicode) { @@ -44,9 +48,8 @@ void MDCallback(void *cbData, const char *type, bool isUnicode, const char *stri } -void setup() -{ - WiFi.mode(WIFI_OFF); +void setup() { + WiFi.mode(WIFI_OFF); Serial.begin(115200); delay(1000); SPIFFS.begin(); @@ -61,12 +64,14 @@ void setup() mp3->begin(id3, out); } -void loop() -{ +void loop() { if (mp3->isRunning()) { - if (!mp3->loop()) mp3->stop(); + if (!mp3->loop()) { + mp3->stop(); + } } else { Serial.printf("MP3 done\n"); delay(1000); } } +#endif diff --git a/examples/PlayMP3ToSPDIF/PlayMP3ToSPDIF.ino b/examples/PlayMP3ToSPDIF/PlayMP3ToSPDIF.ino index 02dfb98f..9725e08a 100644 --- a/examples/PlayMP3ToSPDIF/PlayMP3ToSPDIF.ino +++ b/examples/PlayMP3ToSPDIF/PlayMP3ToSPDIF.ino @@ -1,17 +1,21 @@ #include +#ifdef ARDUINO_ARCH_RP2040 +void setup() {} +void loop() {} +#else #ifdef ESP32 - #include "SPIFFS.h" +#include "SPIFFS.h" #endif #include "AudioFileSourceSPIFFS.h" #include "AudioFileSourceID3.h" #include "AudioOutputSPDIF.h" #include "AudioGeneratorMP3.h" -// To run, set your ESP8266 build to 160MHz, and include a SPIFFS partition +// To run, set your ESP8266 build to 160MHz, and include a SPIFFS partition // big enough to hold your MP3 file. Find suitable MP3 file from i.e. // https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html -// and download it into 'data' directory. Use the "Tools->ESP8266/ESP32 Sketch Data Upload" -// menu to write the MP3 to SPIFFS. Then upload the sketch normally. +// and download it into 'data' directory. Use the "Tools->ESP8266/ESP32 Sketch Data Upload" +// menu to write the MP3 to SPIFFS. Then upload the sketch normally. AudioFileSourceSPIFFS *file; AudioFileSourceID3 *id3; @@ -19,15 +23,14 @@ AudioOutputSPDIF *out; AudioGeneratorMP3 *mp3; // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. -void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) -{ +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { (void)cbData; Serial.printf("ID3 callback for: %s = '", type); if (isUnicode) { string += 2; } - + while (*string) { char a = *(string++); if (isUnicode) { @@ -40,15 +43,14 @@ void MDCallback(void *cbData, const char *type, bool isUnicode, const char *stri } -void setup() -{ +void setup() { Serial.begin(115200); delay(1000); Serial.println(); audioLogger = &Serial; SPIFFS.begin(); - file = new AudioFileSourceSPIFFS(); - id3 = NULL; + file = new AudioFileSourceSPIFFS(); + id3 = NULL; out = new AudioOutputSPDIF(); mp3 = new AudioGeneratorMP3(); String fileName = ""; @@ -56,7 +58,7 @@ void setup() // Find first MP3 file in SPIFF and play it #ifdef ESP32 - File dir, root = SPIFFS.open("/"); + File dir, root = SPIFFS.open("/"); while ((dir = root.openNextFile())) { if (String(dir.name()).endsWith(".mp3")) { if (file->open(dir.name())) { @@ -88,12 +90,14 @@ void setup() } } -void loop() -{ +void loop() { if (mp3->isRunning()) { - if (!mp3->loop()) mp3->stop(); + if (!mp3->loop()) { + mp3->stop(); + } } else { Serial.println("MP3 done"); delay(1000); } } +#endif diff --git a/examples/PlayOpusFromLittleFS/PlayOpusFromLittleFS.ino b/examples/PlayOpusFromLittleFS/PlayOpusFromLittleFS.ino new file mode 100644 index 00000000..6ac4199f --- /dev/null +++ b/examples/PlayOpusFromLittleFS/PlayOpusFromLittleFS.ino @@ -0,0 +1,62 @@ +#include + +#ifdef ESP8266 + +void setup() { + Serial.begin(115200); +} + +void loop() { + Serial.println("OPUS not supported on the ESP8266, sorry!"); + delay(1000); +} + +#else + +#include +#include + +#include "AudioFileSourceLittleFS.h" +#include "AudioGeneratorOpus.h" +#include "AudioOutputI2S.h" + +// The includes OPUS file is from Kevin MacLeod (incompetech.com), Licensed under Creative Commons: By Attribution 3.0, http://creativecommons.org/licenses/by/3.0/ + +AudioGeneratorOpus *opus; +AudioFileSourceLittleFS *file; +AudioOutputI2S *out; + +#ifdef ESP32 +// We need more than the 8K default with other things running, so just double to avoid issues. +// Opus codes uses *lots* of stack variables in the internal decoder instead of a global working chunk +SET_LOOP_TASK_STACK_SIZE(16 * 1024); // 16KB +// On the Pico this is already taken care of using the built-in NONTHREADSAFE_PSEUDOSTACK in the config file. +#endif + +void setup() { + WiFi.mode(WIFI_OFF); + Serial.begin(115200); + delay(1000); + LittleFS.begin(); + Serial.printf("Sample Opus playback begins...\n"); + + audioLogger = &Serial; + file = new AudioFileSourceLittleFS("/gs-16b-2c-44100hz.opus"); + out = new AudioOutputI2S(); + // out->SetPinout(0, 1, 2); // Set the pinout if needed + opus = new AudioGeneratorOpus(); + opus->begin(file, out); +} + +void loop() { + if (opus->isRunning()) { + if (!opus->loop()) { + opus->stop(); + } + } else { + Serial.printf("Opus done\n"); + delay(1000); + } +} + +#endif diff --git a/examples/PlayOpusFromLittleFS/data/gs-16b-2c-44100hz.opus b/examples/PlayOpusFromLittleFS/data/gs-16b-2c-44100hz.opus new file mode 100644 index 00000000..a66ff2e6 Binary files /dev/null and b/examples/PlayOpusFromLittleFS/data/gs-16b-2c-44100hz.opus differ diff --git a/examples/PlayRTTTLToI2SDAC/PlayRTTTLToI2SDAC.ino b/examples/PlayRTTTLToI2SDAC/PlayRTTTLToI2SDAC.ino index fa12eaad..a128471b 100644 --- a/examples/PlayRTTTLToI2SDAC/PlayRTTTLToI2SDAC.ino +++ b/examples/PlayRTTTLToI2SDAC/PlayRTTTLToI2SDAC.ino @@ -2,32 +2,32 @@ #include "AudioGeneratorRTTTL.h" #include "AudioOutputI2S.h" -const char rudolph[] PROGMEM = -"Rudolph the Red Nosed Raindeer:d=8,o=5,b=250:g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4a,2e.,4p,g,4a,a,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4d6,2c.6,4p,4a,4a,4c6,4a,4g,4e,2g,4d,4e,4g,4a,4b,4b,2b,4c6,4c6,4b,4a,4g,4f,2d,g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,4g,4a,4g,4a,2g,2d6,1c.6."; +const char rudolph[] PROGMEM = + "Rudolph the Red Nosed Raindeer:d=8,o=5,b=250:g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4a,2e.,4p,g,4a,a,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4d6,2c.6,4p,4a,4a,4c6,4a,4g,4e,2g,4d,4e,4g,4a,4b,4b,2b,4c6,4c6,4b,4a,4g,4f,2d,g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,4g,4a,4g,4a,2g,2d6,1c.6."; // Plenty more at: http://mines.lumpylumpy.com/Electronics/Computers/Software/Cpp/MFC/RingTones.RTTTL AudioGeneratorRTTTL *rtttl; AudioFileSourcePROGMEM *file; AudioOutputI2S *out; -void setup() -{ +void setup() { Serial.begin(115200); delay(1000); Serial.printf("RTTTL start\n"); audioLogger = &Serial; - file = new AudioFileSourcePROGMEM( rudolph, strlen_P(rudolph) ); + file = new AudioFileSourcePROGMEM(rudolph, strlen_P(rudolph)); out = new AudioOutputI2S(); rtttl = new AudioGeneratorRTTTL(); rtttl->begin(file, out); } -void loop() -{ +void loop() { if (rtttl->isRunning()) { - if (!rtttl->loop()) rtttl->stop(); + if (!rtttl->loop()) { + rtttl->stop(); + } } else { Serial.printf("RTTTL done\n"); delay(1000); diff --git a/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino b/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino new file mode 100644 index 00000000..eba92a14 --- /dev/null +++ b/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino @@ -0,0 +1,80 @@ +#include +#include "AudioFileSourceFunction.h" +#include "AudioGeneratorWAV.h" +#include "AudioOutputI2SNoDAC.h" + +float hz = 440.f; + +// pre-defined function can also be used to generate the wave +float sine_wave(const float time) { + float v = sin(TWO_PI * hz * time); // C + v *= fmod(time, 1.f); // change linear + v *= 0.5; // scale + return v; +}; + +AudioGeneratorWAV* wav; +AudioFileSourceFunction* file; +AudioOutputI2SNoDAC* out; + +void setup() { + Serial.begin(115200); + delay(1000); + + // ===== create instance with length of song in [sec] ===== + file = new AudioFileSourceFunction(8.); + // + // you can set (sec, channels, hz, bit/sample) but you should care about + // the trade-off between performance and the audio quality + // + // file = new AudioFileSourceFunction(sec, channels, hz, bit/sample); + // channels : default = 1 + // hz : default = 8000 (8000, 11025, 22050, 44100, 48000, etc.) + // bit/sample : default = 16 (8, 16, 32) + + // ===== set your sound function ===== + file->addAudioGenerators([&](const float time) { + float v = sin(TWO_PI * hz * time); // generate sine wave + v *= fmod(time, 1.f); // change linear + v *= 0.5; // scale + return v; + }); + // + // sound function should have one argument(float) and one return(float) + // param : float (current time [sec] of the song) + // return : float (the amplitude of sound which varies from -1.f to +1.f) + // + // sound function can be registered only one or the same number with channels + // if the channels > 1 && the number of function == 1, + // same function are used to generate the sound in every channel + // + // file = new AudioFileSourceFunction(8., 2); + // file->addAudioGenerators( + // // L (channel 0) + // [](const float time) { + // return 0.25 * sin(TWO_PI * 440.f * time) * fmod(time, 1.f); // C + // }, + // // R (channel 1) + // [](const float time) { + // return 0.25 * sin(TWO_PI * 550.f * time) * fmod(time, 1.f); // E + // } + // ); + // + // you can also use the pre-defined function + // file->addAudioGenerators(sine_wave); + + out = new AudioOutputI2SNoDAC(); + wav = new AudioGeneratorWAV(); + wav->begin(file, out); +} + +void loop() { + if (wav->isRunning()) { + if (!wav->loop()) { + wav->stop(); + } + } else { + Serial.println("function done!"); + delay(1000); + } +} diff --git a/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino b/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino index 5221c913..1cf89c6a 100644 --- a/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino +++ b/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino @@ -1,9 +1,4 @@ #include -#ifdef ESP32 - #include -#else - #include -#endif #include "AudioFileSourcePROGMEM.h" #include "AudioGeneratorWAV.h" @@ -16,24 +11,23 @@ AudioGeneratorWAV *wav; AudioFileSourcePROGMEM *file; AudioOutputI2SNoDAC *out; -void setup() -{ - WiFi.mode(WIFI_OFF); +void setup() { Serial.begin(115200); delay(1000); Serial.printf("WAV start\n"); audioLogger = &Serial; - file = new AudioFileSourcePROGMEM( viola, sizeof(viola) ); + file = new AudioFileSourcePROGMEM(viola, sizeof(viola)); out = new AudioOutputI2SNoDAC(); wav = new AudioGeneratorWAV(); wav->begin(file, out); } -void loop() -{ +void loop() { if (wav->isRunning()) { - if (!wav->loop()) wav->stop(); + if (!wav->loop()) { + wav->stop(); + } } else { Serial.printf("WAV done\n"); delay(1000); diff --git a/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino b/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino index 8ea45157..1a5aafb0 100644 --- a/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino +++ b/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino @@ -1,9 +1,14 @@ #include -#ifdef ESP32 - #include +#if defined(ARDUINO_ARCH_RP2040) +void setup() {} +void loop() {} + +#else +#if defined(ESP32) +#include #else - #include +#include #endif #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" @@ -22,7 +27,7 @@ const char* ssid = STASSID; const char* password = STAPSK; // Randomly picked URL -const char *URL="http://streaming.shoutcast.com/80sPlanet?lang=en-US"; +const char *URL = "http://kvbstreams.dyndns.org:8000/wkvi-am"; AudioGeneratorMP3 *mp3; AudioFileSourceICYStream *file; @@ -30,35 +35,32 @@ AudioFileSourceBuffer *buff; AudioOutputI2SNoDAC *out; // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. -void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) -{ +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { const char *ptr = reinterpret_cast(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); - s1[sizeof(s1)-1]=0; + s1[sizeof(s1) - 1] = 0; strncpy_P(s2, string, sizeof(s2)); - s2[sizeof(s2)-1]=0; + s2[sizeof(s2) - 1] = 0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); } // Called when there's a warning or error (like a buffer underflow or decode hiccup) -void StatusCallback(void *cbData, int code, const char *string) -{ +void StatusCallback(void *cbData, int code, const char *string) { const char *ptr = reinterpret_cast(cbData); // Note that the string may be in PROGMEM, so copy it to RAM for printf char s1[64]; strncpy_P(s1, string, sizeof(s1)); - s1[sizeof(s1)-1]=0; + s1[sizeof(s1) - 1] = 0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); } -void setup() -{ +void setup() { Serial.begin(115200); delay(1000); Serial.println("Connecting to WiFi"); @@ -66,7 +68,7 @@ void setup() WiFi.disconnect(); WiFi.softAPdisconnect(true); WiFi.mode(WIFI_STA); - + WiFi.begin(ssid, password); // Try forever @@ -88,20 +90,21 @@ void setup() } -void loop() -{ +void loop() { static int lastms = 0; if (mp3->isRunning()) { - if (millis()-lastms > 1000) { + if (millis() - lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); - } - if (!mp3->loop()) mp3->stop(); + } + if (!mp3->loop()) { + mp3->stop(); + } } else { Serial.printf("MP3 done\n"); delay(1000); } } - +#endif diff --git a/examples/StreamMP3FromHTTPToSPDIF/StreamMP3FromHTTPToSPDIF.ino b/examples/StreamMP3FromHTTPToSPDIF/StreamMP3FromHTTPToSPDIF.ino new file mode 100644 index 00000000..200a3e93 --- /dev/null +++ b/examples/StreamMP3FromHTTPToSPDIF/StreamMP3FromHTTPToSPDIF.ino @@ -0,0 +1,144 @@ +#include +#ifdef ARDUINO_ARCH_RP2040 +void setup() {} +void loop() {} +#else + +#if defined(ESP32) +#include +#else +#include +#endif +#include "AudioFileSourceICYStream.h" +#include "AudioFileSourceBuffer.h" +#include "AudioGeneratorMP3.h" +//#include "AudioOutputI2SNoDAC.h" +#include "AudioOutputSPDIF.h" + +// +// Stream MP3 from HTTP to SPDIF +// + +// To run, set your ESP8266 build to 160MHz, update the SSID info, and upload. + +// Note: +// If using ESP8266 NodeMCU connect LED to RX pin and GND pin + +// Enter your WiFi setup here: +#ifndef STASSID +#define STASSID "your-ssid" +#define STAPSK "your-password" +#endif + +const char* ssid = STASSID; +const char* password = STAPSK; + +// Examples URLs +//const char *URL="http://kvbstreams.dyndns.org:8000/wkvi-am"; + +// Italian Rock Radio +const char *URL = "http://streamingv2.shoutcast.com/radiofreccia"; + +// Stream URL of Logitech Media Server, aka LMS, Version: 8.2.0 (August 2021) +// const char *URL="http://192.168.1.121:9000/stream.mp3"; + +AudioGeneratorMP3 *mp3; +AudioFileSourceICYStream *file; +AudioFileSourceBuffer *buff; + +// Output device is SPDIF +AudioOutputSPDIF *out; + + +// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { + const char *ptr = reinterpret_cast(cbData); + (void) isUnicode; // Punt this ball for now + // Note that the type and string may be in PROGMEM, so copy them to RAM for printf + char s1[32], s2[64]; + strncpy_P(s1, type, sizeof(s1)); + s1[sizeof(s1) - 1] = 0; + strncpy_P(s2, string, sizeof(s2)); + s2[sizeof(s2) - 1] = 0; + Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); + Serial.flush(); +} + +// Called when there's a warning or error (like a buffer underflow or decode hiccup) +void StatusCallback(void *cbData, int code, const char *string) { + const char *ptr = reinterpret_cast(cbData); + // Note that the string may be in PROGMEM, so copy it to RAM for printf + char s1[64]; + strncpy_P(s1, string, sizeof(s1)); + s1[sizeof(s1) - 1] = 0; + Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); + Serial.flush(); +} + + +void setup() { + Serial.begin(115200); + delay(1000); + Serial.println("Connecting to WiFi"); + + WiFi.disconnect(); + WiFi.softAPdisconnect(true); + WiFi.mode(WIFI_STA); + + WiFi.begin(ssid, password); + + // Try forever + while (WiFi.status() != WL_CONNECTED) { + Serial.println("...Connecting to WiFi"); + delay(1000); + } + Serial.println("Connected"); + + audioLogger = &Serial; + file = new AudioFileSourceICYStream(URL); + + // Commented out for performance issues with high rate MP3 stream + //file->RegisterMetadataCB(MDCallback, (void*)"ICY"); + + buff = new AudioFileSourceBuffer(file, 4096); // Doubled form default 2048 + + // Commented out for performance issues with high rate MP3 stream + //buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); + + // Set SPDIF output + out = new AudioOutputSPDIF(); + mp3 = new AudioGeneratorMP3(); + + // Commented out for performance issues with high rate MP3 stream + //mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); + + mp3->begin(buff, out); +} + + +void loop() { + // Commented out + //static int lastms = 0; + + if (mp3->isRunning()) { + /* Commented out + if (millis()-lastms > 1000) { + lastms = millis(); + Serial.printf("Running for %d ms...\n", lastms); + Serial.flush(); + } + */ + if (!mp3->loop()) { + mp3->stop(); + } + } else { + Serial.printf("MP3 done\n"); + + // Restart ESP when streaming is done or errored + delay(10000); + + ESP.restart(); + } +} + +#endif diff --git a/examples/StreamMP3FromHTTP_SPIRAM/StreamMP3FromHTTP_SPIRAM.ino b/examples/StreamMP3FromHTTP_SPIRAM/StreamMP3FromHTTP_SPIRAM.ino index 0b9ab092..8f6d5a71 100644 --- a/examples/StreamMP3FromHTTP_SPIRAM/StreamMP3FromHTTP_SPIRAM.ino +++ b/examples/StreamMP3FromHTTP_SPIRAM/StreamMP3FromHTTP_SPIRAM.ino @@ -1,8 +1,12 @@ #include -#ifdef ESP32 - #include +#if defined(ARDUINO_ARCH_RP2040) +void setup() {} +void loop() {} #else - #include +#if defined(ESP32) +#include +#else +#include #endif #include "AudioFileSourceICYStream.h" #include "AudioFileSourceSPIRAMBuffer.h" @@ -21,7 +25,7 @@ const char* ssid = STASSID; const char* password = STAPSK; // Randomly picked URL -const char *URL="http://kvbstreams.dyndns.org:8000/wkvi-am"; +const char *URL = "http://kvbstreams.dyndns.org:8000/wkvi-am"; AudioGeneratorMP3 *mp3; AudioFileSourceICYStream *file; @@ -29,8 +33,7 @@ AudioFileSourceSPIRAMBuffer *buff; AudioOutputI2SNoDAC *out; // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. -void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) -{ +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { const char *ptr = reinterpret_cast(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf @@ -40,8 +43,7 @@ void MDCallback(void *cbData, const char *type, bool isUnicode, const char *stri // Called when there's a warning or error (like a buffer underflow or decode hiccup) -void StatusCallback(void *cbData, int code, const char *string) -{ +void StatusCallback(void *cbData, int code, const char *string) { const char *ptr = reinterpret_cast(cbData); static uint32_t lastTime = 0; static int lastCode = -99999; @@ -54,8 +56,7 @@ void StatusCallback(void *cbData, int code, const char *string) } } -void setup() -{ +void setup() { Serial.begin(115200); delay(1000); Serial.println("Connecting to WiFi"); @@ -63,7 +64,7 @@ void setup() WiFi.disconnect(); WiFi.softAPdisconnect(true); WiFi.mode(WIFI_STA); - + WiFi.begin(ssid, password); // Try forever @@ -77,7 +78,7 @@ void setup() file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); // Initialize 23LC1024 SPI RAM buffer with chip select ion GPIO4 and ram size of 128KByte - buff = new AudioFileSourceSPIRAMBuffer(file, 4, 128*1024); + buff = new AudioFileSourceSPIRAMBuffer(file, 4, 128 * 1024); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); @@ -85,20 +86,21 @@ void setup() mp3->begin(buff, out); } -void loop() -{ +void loop() { static int lastms = 0; if (mp3->isRunning()) { - if (millis()-lastms > 1000) { + if (millis() - lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); - } - if (!mp3->loop()) mp3->stop(); + } + if (!mp3->loop()) { + mp3->stop(); + } } else { Serial.printf("MP3 done\n"); delay(1000); } } - +#endif diff --git a/examples/StreamOnHost/AudioOutputLinuxDSP.h b/examples/StreamOnHost/AudioOutputLinuxDSP.h new file mode 100644 index 00000000..743410e8 --- /dev/null +++ b/examples/StreamOnHost/AudioOutputLinuxDSP.h @@ -0,0 +1,118 @@ +/* + AudioOutput + Base class of an audio output player + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOOUTPUTNULLSLOW_H +#define _AUDIOOUTPUTNULLSLOW_H + +#include +#include +#include +#include +#include +#include +#include + +#include "AudioOutput.h" + +class AudioOutputNullSlow : public AudioOutput +{ + public: + AudioOutputNullSlow() { }; + ~AudioOutputNullSlow() {}; + virtual bool begin() { samples = 0; startms = millis(); return true; } + + virtual bool ConsumeSample(int16_t sample[2]) { + + if (fd < 0) { + fd = open("/dev/dsp", O_RDWR); + if (fd < 0) { + perror("open of /dev/dsp failed (Try with 'padsp this-exec')"); + exit(1); + } + } + + if (channels && lastchannels != channels) { + Serial.printf("CHANNELS=%d\n", channels); + int arg = channels; /* mono or stereo */ + int status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_CHANNELS ioctl failed"); + exit(1); + } else if (arg != channels) { + perror("unable to set number of channels"); + exit(1); + } + lastchannels = channels; + } + + if (lastchannels > 0 && hertz && lasthertz != hertz) { + Serial.printf("FREQ=%d\n", hertz); + int arg = hertz*4/lastchannels; /* sampling rate */ + int status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_RATE ioctl failed"); + exit(1); + } + lasthertz = hertz; + } + + if (bps && lastbps != bps) { + Serial.printf("BPS=%d\n", bps); + int arg = bps; /* sample size */ + int status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_BITS ioctl failed"); + exit(1); + } else if (arg != bps) { + perror("unable to set sample size"); + exit(1); + } + lastbps = bps; + } + + if ((++samples & ((1<<9)-1)) == 0) { + // let the main loop a chance to run + return false; + } + + if (write(fd, sample, sizeof(sample)) != sizeof(sample)) { + perror("doing sound"); + exit(1); + } + + return true; + } + + virtual bool stop() { endms = millis(); return true; }; + unsigned long GetMilliseconds() { return endms - startms; } + int GetSamples() { return samples; } + int GetFrequency() { return hertz; } + + protected: + unsigned long startms; + unsigned long endms; + int samples; + int lastchannels = -1; + int lasthertz = -1; + int lastbps = -1; + int fd = -1; +}; + +#endif diff --git a/examples/StreamOnHost/AudioOutputNullSlow.h b/examples/StreamOnHost/AudioOutputNullSlow.h new file mode 100644 index 00000000..3010862e --- /dev/null +++ b/examples/StreamOnHost/AudioOutputNullSlow.h @@ -0,0 +1,58 @@ +/* + AudioOutput + Base class of an audio output player + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOOUTPUTNULLSLOW_H +#define _AUDIOOUTPUTNULLSLOW_H + +#include "AudioOutput.h" + +class AudioOutputNullSlow : public AudioOutput +{ + public: + AudioOutputNullSlow() { }; + ~AudioOutputNullSlow() {}; + virtual bool begin() { samples = 0; startms = millis(); return true; } + virtual bool ConsumeSample(int16_t sample[2]) { + (void) sample; + // return false (= output buffer full) + // sometimes to let the main loop running + constexpr int everylog2 = 10; + if ((++samples & ((1< 0) { + // simulate real time + delay(1000/(hertz >> everylog2)); + } + return false; + } + return true; + } + virtual bool stop() { endms = millis(); return true; }; + unsigned long GetMilliseconds() { return endms - startms; } + int GetSamples() { return samples; } + int GetFrequency() { return hertz; } + + protected: + unsigned long startms; + unsigned long endms; + int samples; +}; + +#endif + diff --git a/examples/StreamOnHost/StreamOnHost.ino b/examples/StreamOnHost/StreamOnHost.ino new file mode 100644 index 00000000..5494bdd9 --- /dev/null +++ b/examples/StreamOnHost/StreamOnHost.ino @@ -0,0 +1,120 @@ +#include + +#if defined(ARDUINO_ARCH_RP2040) +void setup() {} +void loop() {} +#else +#if defined(ESP32) +#include +#else +#include +#endif +#include "AudioFileSourceICYStream.h" +#include "AudioFileSourceBuffer.h" +#include "AudioGeneratorMP3.h" +#if AUDIO +// #pragma message("Outputting audio") +#include "AudioOutputLinuxDSP.h" +#else +// #pragma message("No audio") +#include "AudioOutputNullSlow.h" +#endif + +// To run, set your ESP8266 build to 160MHz, update the SSID info, and upload. + +// Enter your WiFi setup here: +#ifndef STASSID +#define STASSID "your-ssid" +#define STAPSK "your-password" +#endif + +const char* ssid = STASSID; +const char* password = STAPSK; + +// Randomly picked URL +//const char *URL="http://kvbstreams.dyndns.org:8000/wkvi-am"; +//const char *URL="http://stream2.pvpjamz.com:8706/stream"; +// that one is not well decoded: +const char *URL = "http://icecast.radiofrance.fr/franceinter-lofi.mp3"; + +AudioGeneratorMP3 *mp3; +AudioFileSourceICYStream *file; +AudioFileSourceBuffer *buff; +AudioOutputNullSlow *out; + +// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) { + const char *ptr = reinterpret_cast(cbData); + (void) isUnicode; // Punt this ball for now + // Note that the type and string may be in PROGMEM, so copy them to RAM for printf + char s1[32], s2[64]; + strncpy_P(s1, type, sizeof(s1)); + s1[sizeof(s1) - 1] = 0; + strncpy_P(s2, string, sizeof(s2)); + s2[sizeof(s2) - 1] = 0; + Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); + Serial.flush(); +} + +// Called when there's a warning or error (like a buffer underflow or decode hiccup) +void StatusCallback(void *cbData, int code, const char *string) { + const char *ptr = reinterpret_cast(cbData); + // Note that the string may be in PROGMEM, so copy it to RAM for printf + char s1[64]; + strncpy_P(s1, string, sizeof(s1)); + s1[sizeof(s1) - 1] = 0; + Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); + Serial.flush(); +} + + +void setup() { + Serial.begin(115200); + delay(1000); + Serial.println("Connecting to WiFi"); + + WiFi.disconnect(); + WiFi.softAPdisconnect(true); + WiFi.mode(WIFI_STA); + + WiFi.begin(ssid, password); + + // Try forever + while (WiFi.status() != WL_CONNECTED) { + Serial.println("...Connecting to WiFi"); + delay(1000); + } + Serial.println("Connected"); + + audioLogger = &Serial; + file = new AudioFileSourceICYStream(); + file->RegisterMetadataCB(MDCallback, (void*)"ICY"); + file->useHTTP10(); + file->open(URL); + buff = new AudioFileSourceBuffer(file, 2048); + buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); + out = new AudioOutputNullSlow(); + mp3 = new AudioGeneratorMP3(); + mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); + mp3->begin(buff, out); +} + + +void loop() { + static int lastms = 0; + + if (mp3->isRunning()) { + if (millis() - lastms > 1000) { + lastms = millis(); + Serial.printf("Running for %d ms...\n", lastms); + Serial.flush(); + } + if (!mp3->loop()) { + mp3->stop(); + } + } else { + Serial.printf("MP3 done\n"); + delay(1000); + } +} +#endif diff --git a/examples/StreamOnHost/onHost b/examples/StreamOnHost/onHost new file mode 100755 index 00000000..01484569 --- /dev/null +++ b/examples/StreamOnHost/onHost @@ -0,0 +1,66 @@ +#!/bin/bash + +ino=${PWD##*/} + +if [ ! -d "${ESP8266ARDUINO}/tests/host" ]; then + echo "\${ESP8266ARDUINO} should point to ESP8266 Arduino core directory" + exit 1 +fi + +THISLIB=$(pwd)/../.. +MAD=$(ls ${THISLIB}/src/libmad/*.c) +PAGER=${PAGER:-less} + +cd ${ESP8266ARDUINO}/tests/host + +if [ "$1" = "clean" ]; then + make clean + cd ${THISLIB} + rm -f src/*.o src/libmad/*.o + exit 0 +elif [ "$1" = diff ]; then + cd ${THISLIB}/examples + diff -u StreamMP3FromHTTP/StreamMP3FromHTTP.ino ${ino}/${ino}.ino | ${PAGER} + exit 0 +else + echo "" + echo "usage:" + echo " $0" + echo " $0 clean" + echo " $0 diff" + echo " AUDIO=a VALGRIND=v FORCE32=f $0" + echo " a=1 play sound (use padsp, open /dev/dsp)" + echo " v=1 run in native mode (FORCE32=0) with valgrind" + echo " f=1 run in 32 bits mode (if gcc-multilib is installed)" + echo "variable ESP8266ARDUINO must point to esp8266 Arduino core directory" + echo "" + [ "$1" = "-h" ] && exit 0 + sleep 1 +fi + +run="" + +[ -z "${FORCE32}" ] && FORCE32=0 +[ -z "${AUDIO}" ] && AUDIO=1 + +if [ "${AUDIO}" = 1 ]; then + run="${run} padsp" +fi + +if [ "${VALGRIND}" = 1 ]; then + FORCE32=0 + run="$run valgrind" +fi + +touch ${THISLIB}/examples/${ino}/${ino}.ino # rebuild + +eval make FORCE32=${FORCE32} -j \ + USERCSOURCES=\"${MAD}\" \ + USERCXXSOURCES=\"${THISLIB}/src/AudioFileSourceBuffer.cpp ${THISLIB}/src/AudioLogger.cpp ${THISLIB}/src/AudioGeneratorMP3.cpp ${THISLIB}/src/AudioFileSourceICYStream.cpp ${THISLIB}/src/AudioFileSourceHTTPStream.cpp\" \ + USERCFLAGS=\"-I${THISLIB}/src/ -DAUDIO=${AUDIO}\" \ + ${THISLIB}/examples/${ino}/${ino} + +set -x + +$run ./bin/${ino}/${ino} "$@" +stty sane diff --git a/examples/TalkingClockI2S/TalkingClockI2S.ino b/examples/TalkingClockI2S/TalkingClockI2S.ino index 1cec38b8..ea5e082f 100644 --- a/examples/TalkingClockI2S/TalkingClockI2S.ino +++ b/examples/TalkingClockI2S/TalkingClockI2S.ino @@ -2,7 +2,14 @@ // https://github.com/going-digital/Talkie/blob/master/Talkie/examples/Vocab_US_Clock/Vocab_US_Clock.ino // Released under GPL v2 +#include + +#ifdef ESP8266 #include +#else +#include +#endif + #include #include "AudioFileSourcePROGMEM.h" #include "AudioGeneratorTalkie.h" @@ -19,67 +26,73 @@ const char *pass = STAPSK; long timezone = 2; byte daysavetime = 1; -uint8_t spTHE[] PROGMEM = {0x08,0xE8,0x3E,0x55,0x01,0xC3,0x86,0x27,0xAF,0x72,0x0D,0x4D,0x97,0xD5,0xBC,0x64,0x3C,0xF2,0x5C,0x51,0xF1,0x93,0x36,0x8F,0x4F,0x59,0x2A,0x42,0x7A,0x32,0xC3,0x64,0xFF,0x3F}; -uint8_t spTIME[] PROGMEM = {0x0E,0x28,0xAC,0x2D,0x01,0x5D,0xB6,0x0D,0x33,0xF3,0x54,0xB3,0x60,0xBA,0x8C,0x54,0x5C,0xCD,0x2D,0xD4,0x32,0x73,0x0F,0x8E,0x34,0x33,0xCB,0x4A,0x25,0xD4,0x25,0x83,0x2C,0x2B,0xD5,0x50,0x97,0x08,0x32,0xEC,0xD4,0xDC,0x4C,0x33,0xC8,0x70,0x73,0x0F,0x33,0xCD,0x20,0xC3,0xCB,0x43,0xDD,0x3C,0xCD,0x8C,0x20,0x77,0x89,0xF4,0x94,0xB2,0xE2,0xE2,0x35,0x22,0x5D,0xD6,0x4A,0x8A,0x96,0xCC,0x36,0x25,0x2D,0xC9,0x9A,0x7B,0xC2,0x18,0x87,0x24,0x4B,0x1C,0xC9,0x50,0x19,0x92,0x2C,0x71,0x34,0x4B,0x45,0x8A,0x8B,0xC4,0x96,0xB6,0x5A,0x29,0x2A,0x92,0x5A,0xCA,0x53,0x96,0x20,0x05,0x09,0xF5,0x92,0x5D,0xBC,0xE8,0x58,0x4A,0xDD,0xAE,0x73,0xBD,0x65,0x4B,0x8D,0x78,0xCA,0x2B,0x4E,0xD8,0xD9,0xED,0x22,0x20,0x06,0x75,0x00,0x00,0x80,0xFF,0x07}; -uint8_t spIS[] PROGMEM = {0x21,0x18,0x96,0x38,0xB7,0x14,0x8D,0x60,0x3A,0xA6,0xE8,0x51,0xB4,0xDC,0x2E,0x48,0x7B,0x5A,0xF1,0x70,0x1B,0xA3,0xEC,0x09,0xC6,0xCB,0xEB,0x92,0x3D,0xA7,0x69,0x1F,0xAF,0x71,0x89,0x9C,0xA2,0xB3,0xFC,0xCA,0x35,0x72,0x9A,0xD1,0xF0,0xAB,0x12,0xB3,0x2B,0xC6,0xCD,0x4F,0xCC,0x32,0x26,0x19,0x07,0xDF,0x0B,0x8F,0xB8,0xA4,0xED,0x7C,0xCF,0x23,0x62,0x8B,0x8E,0xF1,0x23,0x0A,0x8B,0x6E,0xCB,0xCE,0xEF,0x54,0x44,0x3C,0xDC,0x08,0x60,0x0B,0x37,0x01,0x1C,0x53,0x26,0x80,0x15,0x4E,0x14,0xB0,0x54,0x2B,0x02,0xA4,0x69,0xFF,0x7F}; -uint8_t spA_M_[] PROGMEM = {0xCD,0xEF,0x86,0xAB,0x57,0x6D,0x0F,0xAF,0x71,0xAD,0x49,0x55,0x3C,0xFC,0x2E,0xC5,0xB7,0x5C,0xF1,0xF2,0x87,0x66,0xDD,0x4E,0xC5,0xC3,0xEF,0x92,0xE2,0x3A,0x65,0xB7,0xA0,0x09,0xAA,0x1B,0x97,0x54,0x82,0x2E,0x28,0x77,0x5C,0x52,0x09,0x1A,0xA3,0xB8,0x76,0x49,0x25,0x68,0x8C,0x73,0xDB,0x24,0x95,0xA0,0x32,0xA9,0x6B,0xA7,0xD9,0x82,0x26,0xA9,0x76,0x42,0xD6,0x08,0xBA,0xE1,0xE8,0x0E,0x5A,0x2B,0xEA,0x9E,0x3D,0x27,0x18,0xAD,0xA8,0x07,0xF1,0x98,0x90,0x35,0xA2,0x96,0x44,0xA3,0x5D,0x66,0x8B,0x6B,0x12,0xCD,0x32,0x85,0x25,0xC9,0x81,0x2D,0xC3,0x64,0x85,0x34,0x58,0x89,0x94,0x52,0x1C,0x52,0x2F,0x35,0xDA,0xC7,0x51,0x48,0x23,0x97,0xCC,0x2C,0x97,0x2E,0xF3,0x5C,0xF3,0xA2,0x14,0xBA,0x2C,0x48,0xCE,0xCA,0x76,0xE8,0x32,0x2F,0x34,0xB2,0xDB,0x85,0xC9,0x83,0x90,0xA8,0x2C,0x57,0x26,0x8F,0x9C,0xBD,0xA2,0x53,0xD9,0xC2,0x54,0x59,0x28,0x99,0x4B,0x2C,0x5D,0xFF,0x3F}; -uint8_t spP_M_[] PROGMEM = {0x0E,0x98,0x41,0x54,0x00,0x43,0xA0,0x05,0xAB,0x42,0x8E,0x1D,0xA3,0x15,0xEC,0x4E,0x58,0xF7,0x92,0x66,0x70,0x1B,0x66,0xDB,0x73,0x99,0xC1,0xEB,0x98,0xED,0xD6,0x25,0x25,0x6F,0x70,0x92,0xDD,0x64,0xD8,0xFC,0x61,0xD0,0x66,0x83,0xD6,0x0A,0x86,0x23,0xAB,0x69,0xDA,0x2B,0x18,0x9E,0x3D,0x37,0x69,0x9D,0xA8,0x07,0x71,0x9F,0xA0,0xBD,0xA2,0x16,0xD5,0x7C,0x54,0xF6,0x88,0x6B,0x54,0x8B,0x34,0x49,0x2D,0x29,0x49,0x3C,0x34,0x64,0xA5,0x24,0x1B,0x36,0xD7,0x72,0x13,0x92,0xA4,0xC4,0x2D,0xC3,0xB3,0x4B,0xA3,0x62,0x0F,0x2B,0x37,0x6E,0x8B,0x5A,0xD4,0x3D,0xDD,0x9A,0x2D,0x50,0x93,0xF6,0x4C,0xAA,0xB6,0xC4,0x85,0x3B,0xB2,0xB1,0xD8,0x93,0x20,0x4D,0x8F,0x24,0xFF,0x0F}; -uint8_t spOH[] PROGMEM = {0xC6,0xC9,0x71,0x5A,0xA2,0x92,0x14,0x2F,0x6E,0x97,0x9C,0x46,0x9D,0xDC,0xB0,0x4D,0x62,0x1B,0x55,0x70,0xDD,0x55,0xBE,0x0E,0x36,0xC1,0x33,0x37,0xA9,0xA7,0x51,0x1B,0xCF,0x3C,0xA5,0x9E,0x44,0xAC,0x3C,0x7D,0x98,0x7B,0x52,0x96,0x72,0x65,0x4B,0xF6,0x1A,0xD9,0xCA,0xF5,0x91,0x2D,0xA2,0x2A,0x4B,0xF7,0xFF,0x01}; -uint8_t spOCLOCK[] PROGMEM = {0x21,0x4E,0x3D,0xB8,0x2B,0x19,0xBB,0x24,0x0E,0xE5,0xEC,0x60,0xE4,0xF2,0x90,0x13,0xD4,0x2A,0x11,0x80,0x00,0x42,0x69,0x26,0x40,0xD0,0x2B,0x04,0x68,0xE0,0x4D,0x00,0x3A,0x35,0x35,0x33,0xB6,0x51,0xD9,0x64,0x34,0x82,0xB4,0x9A,0x63,0x92,0x55,0x89,0x52,0x5B,0xCA,0x2E,0x34,0x25,0x4E,0x63,0x28,0x3A,0x50,0x95,0x26,0x8D,0xE6,0xAA,0x64,0x58,0xEA,0x92,0xCE,0xC2,0x46,0x15,0x9B,0x86,0xCD,0x2A,0x2E,0x37,0x00,0x00,0x00,0x0C,0xC8,0xDD,0x05,0x01,0xB9,0x33,0x21,0xA0,0x74,0xD7,0xFF,0x07}; -uint8_t spONE[] PROGMEM = {0xCC,0x67,0x75,0x42,0x59,0x5D,0x3A,0x4F,0x9D,0x36,0x63,0xB7,0x59,0xDC,0x30,0x5B,0x5C,0x23,0x61,0xF3,0xE2,0x1C,0xF1,0xF0,0x98,0xC3,0x4B,0x7D,0x39,0xCA,0x1D,0x2C,0x2F,0xB7,0x15,0xEF,0x70,0x79,0xBC,0xD2,0x46,0x7C,0x52,0xE5,0xF1,0x4A,0x6A,0xB3,0x71,0x47,0xC3,0x2D,0x39,0x34,0x4B,0x23,0x35,0xB7,0x7A,0x55,0x33,0x8F,0x59,0xDC,0xA2,0x44,0xB5,0xBC,0x66,0x72,0x8B,0x64,0xF5,0xF6,0x98,0xC1,0x4D,0x42,0xD4,0x27,0x62,0x38,0x2F,0x4A,0xB6,0x9C,0x88,0x68,0xBC,0xA6,0x95,0xF8,0x5C,0xA1,0x09,0x86,0x77,0x91,0x11,0x5B,0xFF,0x0F}; -uint8_t spTWO[] PROGMEM = {0x0E,0x38,0x6E,0x25,0x00,0xA3,0x0D,0x3A,0xA0,0x37,0xC5,0xA0,0x05,0x9E,0x56,0x35,0x86,0xAA,0x5E,0x8C,0xA4,0x82,0xB2,0xD7,0x74,0x31,0x22,0x69,0xAD,0x1C,0xD3,0xC1,0xD0,0xFA,0x28,0x2B,0x2D,0x47,0xC3,0x1B,0xC2,0xC4,0xAE,0xC6,0xCD,0x9C,0x48,0x53,0x9A,0xFF,0x0F}; -uint8_t spTHREE[] PROGMEM = {0x02,0xD8,0x2E,0x9C,0x01,0xDB,0xA6,0x33,0x60,0xFB,0x30,0x01,0xEC,0x20,0x12,0x8C,0xE4,0xD8,0xCA,0x32,0x96,0x73,0x63,0x41,0x39,0x89,0x98,0xC1,0x4D,0x0D,0xED,0xB0,0x2A,0x05,0x37,0x0F,0xB4,0xA5,0xAE,0x5C,0xDC,0x36,0xD0,0x83,0x2F,0x4A,0x71,0x7B,0x03,0xF7,0x38,0x59,0xCD,0xED,0x1E,0xB4,0x6B,0x14,0x35,0xB7,0x6B,0x94,0x99,0x91,0xD5,0xDC,0x26,0x48,0x77,0x4B,0x66,0x71,0x1B,0x21,0xDB,0x2D,0x8A,0xC9,0x6D,0x88,0xFC,0x26,0x28,0x3A,0xB7,0x21,0xF4,0x1F,0xA3,0x65,0xBC,0x02,0x38,0xBB,0x3D,0x8E,0xF0,0x2B,0xE2,0x08,0xB7,0x34,0xFF,0x0F}; -uint8_t spFOUR[] PROGMEM = {0x0C,0x18,0xB6,0x9A,0x01,0xC3,0x75,0x09,0x60,0xD8,0x0E,0x09,0x30,0xA0,0x9B,0xB6,0xA0,0xBB,0xB0,0xAA,0x16,0x4E,0x82,0xEB,0xEA,0xA9,0xFA,0x59,0x49,0x9E,0x59,0x23,0x9A,0x27,0x3B,0x78,0x66,0xAE,0x4A,0x9C,0x9C,0xE0,0x99,0xD3,0x2A,0xBD,0x72,0x92,0xEF,0xE6,0x88,0xE4,0x45,0x4D,0x7E,0x98,0x2D,0x62,0x67,0x37,0xF9,0xA1,0x37,0xA7,0x6C,0x94,0xE4,0xC7,0x1E,0xDC,0x3C,0xA5,0x83,0x1F,0x8B,0xEB,0x52,0x0E,0x0E,0x7E,0x2E,0x4E,0xC7,0x31,0xD2,0x79,0xA5,0x3A,0x0D,0xD9,0xC4,0xFF,0x07}; -uint8_t spFIVE[] PROGMEM = {0x02,0xE8,0x3E,0x8C,0x01,0xDD,0x65,0x08,0x60,0x98,0x4C,0x06,0x34,0x93,0xCE,0x80,0xE6,0xDA,0x9A,0x14,0x6B,0xAA,0x47,0xD1,0x5E,0x56,0xAA,0x6D,0x56,0xCD,0x78,0xD9,0xA9,0x1C,0x67,0x05,0x83,0xE1,0xA4,0xBA,0x38,0xEE,0x16,0x86,0x9B,0xFA,0x60,0x87,0x5B,0x18,0x6E,0xEE,0x8B,0x1D,0x6E,0x61,0xB9,0x69,0x36,0x65,0xBA,0x8D,0xE5,0xE5,0x3E,0x1C,0xE9,0x0E,0x96,0x9B,0x5B,0xAB,0x95,0x2B,0x58,0x6E,0xCE,0xE5,0x3A,0x6A,0xF3,0xB8,0x35,0x84,0x7B,0x05,0xA3,0xE3,0x36,0xEF,0x92,0x19,0xB4,0x86,0xDB,0xB4,0x69,0xB4,0xD1,0x2A,0x4E,0x65,0x9A,0x99,0xCE,0x28,0xD9,0x85,0x71,0x4C,0x18,0x6D,0x67,0x47,0xC6,0x5E,0x53,0x4A,0x9C,0xB5,0xE2,0x85,0x45,0x26,0xFE,0x7F}; -uint8_t spSIX[] PROGMEM = {0x0E,0xD8,0xAE,0xDD,0x03,0x0E,0x38,0xA6,0xD2,0x01,0xD3,0xB4,0x2C,0xAD,0x6A,0x35,0x9D,0xB1,0x7D,0xDC,0xEE,0xC4,0x65,0xD7,0xF1,0x72,0x47,0x24,0xB3,0x19,0xD9,0xD9,0x05,0x70,0x40,0x49,0xEA,0x02,0x98,0xBE,0x42,0x01,0xDF,0xA4,0x69,0x40,0x00,0xDF,0x95,0xFC,0x3F}; -uint8_t spSEVEN[] PROGMEM = {0x02,0xB8,0x3A,0x8C,0x01,0xDF,0xA4,0x73,0x40,0x01,0x47,0xB9,0x2F,0x33,0x3B,0x73,0x5F,0x53,0x7C,0xEC,0x9A,0xC5,0x63,0xD5,0xD1,0x75,0xAE,0x5B,0xFC,0x64,0x5C,0x35,0x87,0x91,0xF1,0x83,0x36,0xB5,0x68,0x55,0xC5,0x6F,0xDA,0x45,0x2D,0x1C,0x2D,0xB7,0x38,0x37,0x9F,0x60,0x3C,0xBC,0x9A,0x85,0xA3,0x25,0x66,0xF7,0x8A,0x57,0x1C,0xA9,0x67,0x56,0xCA,0x5E,0xF0,0xB2,0x16,0xB2,0xF1,0x89,0xCE,0x8B,0x92,0x25,0xC7,0x2B,0x33,0xCF,0x48,0xB1,0x99,0xB4,0xF3,0xFF}; -uint8_t spEIGHT[] PROGMEM = {0xC3,0x6C,0x86,0xB3,0x27,0x6D,0x0F,0xA7,0x48,0x99,0x4E,0x55,0x3C,0xBC,0x22,0x65,0x36,0x4D,0xD1,0xF0,0x32,0xD3,0xBE,0x34,0xDA,0xC3,0xEB,0x82,0xE2,0xDA,0x65,0x35,0xAF,0x31,0xF2,0x6B,0x97,0x95,0xBC,0x86,0xD8,0x6F,0x82,0xA6,0x73,0x0B,0xC6,0x9E,0x72,0x99,0xCC,0xCB,0x02,0xAD,0x3C,0x9A,0x10,0x60,0xAB,0x62,0x05,0x2C,0x37,0x84,0x00,0xA9,0x73,0x00,0x00,0xFE,0x1F}; -uint8_t spNINE[] PROGMEM = {0xCC,0xA1,0x26,0xBB,0x83,0x93,0x18,0xCF,0x4A,0xAD,0x2E,0x31,0xED,0x3C,0xA7,0x24,0x26,0xC3,0x54,0xF1,0x92,0x64,0x8B,0x8A,0x98,0xCB,0x2B,0x2E,0x34,0x53,0x2D,0x0E,0x2F,0x57,0xB3,0x0C,0x0D,0x3C,0xBC,0x3C,0x4C,0x4B,0xCA,0xF4,0xF0,0x72,0x0F,0x6E,0x49,0x53,0xCD,0xCB,0x53,0x2D,0x35,0x4D,0x0F,0x2F,0x0F,0xD7,0x0C,0x0D,0x3D,0xBC,0xDC,0x4D,0xD3,0xDD,0xC2,0xF0,0x72,0x52,0x4F,0x57,0x9B,0xC3,0xAB,0x89,0xBD,0x42,0x2D,0x0F,0xAF,0x5A,0xD1,0x71,0x91,0x55,0xBC,0x2C,0xC5,0x3B,0xD8,0x65,0xF2,0x82,0x94,0x18,0x4E,0x3B,0xC1,0x73,0x42,0x32,0x33,0x15,0x45,0x4F,0x79,0x52,0x6A,0x55,0xA6,0xA3,0xFF,0x07}; -uint8_t spTEN[] PROGMEM = {0x0E,0xD8,0xB1,0xDD,0x01,0x3D,0xA8,0x24,0x7B,0x04,0x27,0x76,0x77,0xDC,0xEC,0xC2,0xC5,0x23,0x84,0xCD,0x72,0x9A,0x51,0xF7,0x62,0x45,0xC7,0xEB,0x4E,0x35,0x4A,0x14,0x2D,0xBF,0x45,0xB6,0x0A,0x75,0xB8,0xFC,0x16,0xD9,0x2A,0xD9,0xD6,0x0A,0x5A,0x10,0xCD,0xA2,0x48,0x23,0xA8,0x81,0x35,0x4B,0x2C,0xA7,0x20,0x69,0x0A,0xAF,0xB6,0x15,0x82,0xA4,0x29,0x3C,0xC7,0x52,0x08,0xA2,0x22,0xCF,0x68,0x4B,0x2E,0xF0,0x8A,0xBD,0xA3,0x2C,0xAB,0x40,0x1B,0xCE,0xAA,0xB2,0x6C,0x82,0x40,0x4D,0x7D,0xC2,0x89,0x88,0x8A,0x61,0xCC,0x74,0xD5,0xFF,0x0F}; -uint8_t spELEVEN[] PROGMEM = {0xC3,0xCD,0x76,0x5C,0xAE,0x14,0x0F,0x37,0x9B,0x71,0xDE,0x92,0x55,0xBC,0x2C,0x27,0x70,0xD3,0x76,0xF0,0x83,0x5E,0xA3,0x5E,0x5A,0xC1,0xF7,0x61,0x58,0xA7,0x19,0x35,0x3F,0x99,0x31,0xDE,0x52,0x74,0xFC,0xA2,0x26,0x64,0x4B,0xD1,0xF1,0xAB,0xAE,0xD0,0x2D,0xC5,0xC7,0x2F,0x36,0xDD,0x27,0x15,0x0F,0x3F,0xD9,0x08,0x9F,0x62,0xE4,0xC2,0x2C,0xD4,0xD8,0xD3,0x89,0x0B,0x1B,0x57,0x11,0x0B,0x3B,0xC5,0xCF,0xD6,0xCC,0xC6,0x64,0x35,0xAF,0x18,0x73,0x1F,0xA1,0x5D,0xBC,0x62,0x45,0xB3,0x45,0x51,0xF0,0xA2,0x62,0xAB,0x4A,0x5B,0xC9,0x4B,0x8A,0x2D,0xB3,0x6C,0x06,0x2F,0x29,0xB2,0xAC,0x8A,0x18,0xBC,0x28,0xD9,0xAA,0xD2,0x92,0xF1,0xBC,0xE0,0x98,0x8C,0x48,0xCC,0x17,0x52,0xA3,0x27,0x6D,0x93,0xD0,0x4B,0x8E,0x0E,0x77,0x02,0x00,0xFF,0x0F}; -uint8_t spTWELVE[] PROGMEM = {0x06,0x28,0x46,0xD3,0x01,0x25,0x06,0x13,0x20,0xBA,0x70,0x70,0xB6,0x79,0xCA,0x36,0xAE,0x28,0x38,0xE1,0x29,0xC5,0x35,0xA3,0xE6,0xC4,0x16,0x6A,0x53,0x8C,0x97,0x9B,0x72,0x86,0x4F,0x28,0x1A,0x6E,0x0A,0x59,0x36,0xAE,0x68,0xF8,0x29,0x67,0xFA,0x06,0xA3,0x16,0xC4,0x96,0xE6,0x53,0xAC,0x5A,0x9C,0x56,0x72,0x77,0x31,0x4E,0x49,0x5C,0x8D,0x5B,0x29,0x3B,0x24,0x61,0x1E,0x6C,0x9B,0x6C,0x97,0xF8,0xA7,0x34,0x19,0x92,0x4C,0x62,0x9E,0x72,0x65,0x58,0x12,0xB1,0x7E,0x09,0xD5,0x2E,0x53,0xC5,0xBA,0x36,0x6B,0xB9,0x2D,0x17,0x05,0xEE,0x9A,0x6E,0x8E,0x05,0x50,0x6C,0x19,0x07,0x18,0x50,0xBD,0x3B,0x01,0x92,0x08,0x41,0x40,0x10,0xA6,0xFF,0x0F}; -uint8_t spTHIRTEEN[] PROGMEM = {0x08,0xE8,0x2C,0x15,0x01,0x43,0x07,0x13,0xE0,0x98,0xB4,0xA6,0x35,0xA9,0x1E,0xDE,0x56,0x8E,0x53,0x9C,0x7A,0xE7,0xCA,0x5E,0x76,0x8D,0x94,0xE5,0x2B,0xAB,0xD9,0xB5,0x62,0xA4,0x9C,0xE4,0xE6,0xB4,0x41,0x1E,0x7C,0xB6,0x93,0xD7,0x16,0x99,0x5A,0xCD,0x61,0x76,0x55,0xC2,0x91,0x61,0x1B,0xC0,0x01,0x5D,0x85,0x05,0xE0,0x68,0x51,0x07,0x1C,0xA9,0x64,0x80,0x1D,0x4C,0x9C,0x95,0x88,0xD4,0x04,0x3B,0x4D,0x4E,0x21,0x5C,0x93,0xA8,0x26,0xB9,0x05,0x4B,0x6E,0xA0,0xE2,0xE4,0x57,0xC2,0xB9,0xC1,0xB2,0x93,0x5F,0x09,0xD7,0x24,0xCB,0x4E,0x41,0x25,0x54,0x1D,0x62,0x3B,0x05,0x8D,0x52,0x57,0xAA,0xAD,0x10,0x24,0x26,0xE3,0xE1,0x36,0x5D,0x10,0x85,0xB4,0x97,0x85,0x72,0x41,0x14,0x52,0x5E,0x1A,0xCA,0xF9,0x91,0x6B,0x7A,0x5B,0xC4,0xE0,0x17,0x2D,0x54,0x1D,0x92,0x8C,0x1F,0x25,0x4B,0x8F,0xB2,0x16,0x41,0xA1,0x4A,0x3E,0xE6,0xFA,0xFF,0x01}; -uint8_t spFOURTEEN[] PROGMEM = {0x0C,0x58,0xAE,0x5C,0x01,0xD9,0x87,0x07,0x51,0xB7,0x25,0xB3,0x8A,0x15,0x2C,0xF7,0x1C,0x35,0x87,0x4D,0xB2,0xDD,0x53,0xCE,0x28,0x2B,0xC9,0x0E,0x97,0x2D,0xBD,0x2A,0x17,0x27,0x76,0x8E,0xD2,0x9A,0x6C,0x80,0x94,0x71,0x00,0x00,0x02,0xB0,0x58,0x58,0x00,0x9E,0x0B,0x0A,0xC0,0xB2,0xCE,0xC1,0xC8,0x98,0x7A,0x52,0x95,0x24,0x2B,0x11,0xED,0x36,0xD4,0x92,0xDC,0x4C,0xB5,0xC7,0xC8,0x53,0xF1,0x2A,0xE5,0x1A,0x17,0x55,0xC5,0xAF,0x94,0xBB,0xCD,0x1C,0x26,0xBF,0x52,0x9A,0x72,0x53,0x98,0xFC,0xC2,0x68,0xD2,0x4D,0x61,0xF0,0xA3,0x90,0xB6,0xD6,0x50,0xC1,0x8F,0x42,0xDA,0x4A,0x43,0x39,0x3F,0x48,0x2D,0x6B,0x33,0xF9,0xFF}; -uint8_t spFIFTEEN[] PROGMEM = {0x08,0xE8,0x2A,0x0D,0x01,0xDD,0xBA,0x31,0x60,0x6A,0xF7,0xA0,0xAE,0x54,0xAA,0x5A,0x76,0x97,0xD9,0x34,0x69,0xEF,0x32,0x1E,0x66,0xE1,0xE2,0xB3,0x43,0xA9,0x18,0x55,0x92,0x4E,0x37,0x2D,0x67,0x6F,0xDF,0xA2,0x5A,0xB6,0x04,0x30,0x55,0xA8,0x00,0x86,0x09,0xE7,0x00,0x01,0x16,0x17,0x05,0x70,0x40,0x57,0xE5,0x01,0xF8,0x21,0x34,0x00,0xD3,0x19,0x33,0x80,0x89,0x9A,0x62,0x34,0x4C,0xD5,0x49,0xAE,0x8B,0x53,0x09,0xF7,0x26,0xD9,0x6A,0x7E,0x23,0x5C,0x13,0x12,0xB3,0x04,0x9D,0x50,0x4F,0xB1,0xAD,0x14,0x15,0xC2,0xD3,0xA1,0xB6,0x42,0x94,0xA8,0x8C,0x87,0xDB,0x74,0xB1,0x70,0x59,0xE1,0x2E,0xC9,0xC5,0x81,0x5B,0x55,0xA4,0x4C,0x17,0x47,0xC1,0x6D,0xE3,0x81,0x53,0x9C,0x84,0x6A,0x46,0xD9,0x4C,0x51,0x31,0x42,0xD9,0x66,0xC9,0x44,0x85,0x29,0x6A,0x9B,0xAD,0xFF,0x07}; -uint8_t spSIXTEEN[] PROGMEM = {0x0A,0x58,0x5A,0x5D,0x00,0x93,0x97,0x0B,0x60,0xA9,0x48,0x05,0x0C,0x15,0xAE,0x80,0xAD,0x3D,0x14,0x30,0x7D,0xD9,0x50,0x92,0x92,0xAC,0x0D,0xC5,0xCD,0x2A,0x82,0xAA,0x3B,0x98,0x04,0xB3,0x4A,0xC8,0x9A,0x90,0x05,0x09,0x68,0x51,0xD4,0x01,0x23,0x9F,0x1A,0x60,0xA9,0x12,0x03,0xDC,0x50,0x81,0x80,0x22,0xDC,0x20,0x00,0xCB,0x06,0x3A,0x60,0x16,0xE3,0x64,0x64,0x42,0xDD,0xCD,0x6A,0x8A,0x5D,0x28,0x75,0x07,0xA9,0x2A,0x5E,0x65,0x34,0xED,0x64,0xBB,0xF8,0x85,0xF2,0x94,0x8B,0xAD,0xE4,0x37,0x4A,0x5B,0x21,0xB6,0x52,0x50,0x19,0xAD,0xA7,0xD8,0x4A,0x41,0x14,0xDA,0x5E,0x12,0x3A,0x04,0x91,0x4B,0x7B,0x69,0xA8,0x10,0x24,0x2E,0xE5,0xA3,0x81,0x52,0x90,0x94,0x5A,0x55,0x98,0x32,0x41,0x50,0xCC,0x93,0x2E,0x47,0x85,0x89,0x1B,0x5B,0x5A,0x62,0x04,0x44,0xE3,0x02,0x80,0x80,0x64,0xDD,0xFF,0x1F}; -uint8_t spSEVENTEEN[] PROGMEM = {0x02,0x98,0x3A,0x42,0x00,0x5B,0xA6,0x09,0x60,0xDB,0x52,0x06,0x1C,0x93,0x29,0x80,0xA9,0x52,0x87,0x9A,0xB5,0x99,0x4F,0xC8,0x3E,0x46,0xD6,0x5E,0x7E,0x66,0xFB,0x98,0xC5,0x5A,0xC6,0x9A,0x9C,0x63,0x15,0x6B,0x11,0x13,0x8A,0x9C,0x97,0xB9,0x9A,0x5A,0x39,0x71,0xEE,0xD2,0x29,0xC2,0xA6,0xB8,0x58,0x59,0x99,0x56,0x14,0xA3,0xE1,0x26,0x19,0x19,0xE3,0x8C,0x93,0x17,0xB4,0x46,0xB5,0x88,0x71,0x9E,0x97,0x9E,0xB1,0x2C,0xC5,0xF8,0x56,0xC4,0x58,0xA3,0x1C,0xE1,0x33,0x9D,0x13,0x41,0x8A,0x43,0x58,0xAD,0x95,0xA9,0xDB,0x36,0xC0,0xD1,0xC9,0x0E,0x58,0x4E,0x45,0x01,0x23,0xA9,0x04,0x37,0x13,0xAE,0x4D,0x65,0x52,0x82,0xCA,0xA9,0x37,0x99,0x4D,0x89,0xBA,0xC0,0xBC,0x14,0x36,0x25,0xEA,0x1C,0x73,0x52,0x1D,0x97,0xB8,0x33,0xAC,0x0E,0x75,0x9C,0xE2,0xCE,0xB0,0xDA,0xC3,0x51,0x4A,0x1A,0xA5,0xCA,0x70,0x5B,0x21,0xCE,0x4C,0x26,0xD2,0x6C,0xBA,0x38,0x71,0x2E,0x1F,0x2D,0xED,0xE2,0x24,0xB8,0xBC,0x3D,0x52,0x88,0xAB,0x50,0x8E,0xA8,0x48,0x22,0x4E,0x42,0xA0,0x26,0x55,0xFD,0x3F}; -uint8_t spEIGHTEEN[] PROGMEM = {0x2E,0x9C,0xD1,0x4D,0x54,0xEC,0x2C,0xBF,0x1B,0x8A,0x99,0x70,0x7C,0xFC,0x2E,0x29,0x6F,0x52,0xF6,0xF1,0xBA,0x20,0xBF,0x36,0xD9,0xCD,0xED,0x0C,0xF3,0x27,0x64,0x17,0x73,0x2B,0xA2,0x99,0x90,0x65,0xEC,0xED,0x40,0x73,0x32,0x12,0xB1,0xAF,0x30,0x35,0x0B,0xC7,0x00,0xE0,0x80,0xAE,0xDD,0x1C,0x70,0x43,0xAA,0x03,0x86,0x51,0x36,0xC0,0x30,0x64,0xCE,0x4C,0x98,0xFB,0x5C,0x65,0x07,0xAF,0x10,0xEA,0x0B,0x66,0x1B,0xFC,0x46,0xA8,0x3E,0x09,0x4D,0x08,0x2A,0xA6,0x3E,0x67,0x36,0x21,0x2A,0x98,0x67,0x9D,0x15,0xA7,0xA8,0x60,0xEE,0xB6,0x94,0x99,0xA2,0x4A,0x78,0x22,0xC2,0xA6,0x8B,0x8C,0x8E,0xCC,0x4C,0x8A,0x2E,0x8A,0x4C,0xD3,0x57,0x03,0x87,0x28,0x71,0x09,0x1F,0x2B,0xE4,0xA2,0xC4,0xC5,0x6D,0xAD,0x54,0x88,0xB2,0x63,0xC9,0xF2,0x50,0x2E,0x8A,0x4A,0x38,0x4A,0xEC,0x88,0x28,0x08,0xE3,0x28,0x49,0xF3,0xFF}; -uint8_t spNINETEEN[] PROGMEM = {0xC2,0xEA,0x8A,0x95,0x2B,0x6A,0x05,0x3F,0x71,0x71,0x5F,0x0D,0x12,0xFC,0x28,0x25,0x62,0x35,0xF0,0xF0,0xB3,0x48,0x1E,0x0F,0xC9,0xCB,0x2F,0x45,0x7C,0x2C,0x25,0x1F,0xBF,0x14,0xB3,0x2C,0xB5,0x75,0xFC,0x5A,0x5C,0xA3,0x5D,0xE1,0xF1,0x7A,0x76,0xB3,0x4E,0x45,0xC7,0xED,0x96,0x23,0x3B,0x18,0x37,0x7B,0x18,0xCC,0x09,0x51,0x13,0x4C,0xAB,0x6C,0x4C,0x4B,0x96,0xD2,0x49,0xAA,0x36,0x0B,0xC5,0xC2,0x20,0x26,0x27,0x35,0x63,0x09,0x3D,0x30,0x8B,0xF0,0x48,0x5C,0xCA,0x61,0xDD,0xCB,0xCD,0x91,0x03,0x8E,0x4B,0x76,0xC0,0xCC,0x4D,0x06,0x98,0x31,0x31,0x98,0x99,0x70,0x6D,0x2A,0xA3,0xE4,0x16,0xCA,0xBD,0xCE,0x5C,0x92,0x57,0x28,0xCF,0x09,0x69,0x2E,0x7E,0xA5,0x3C,0x63,0xA2,0x30,0x05,0x95,0xD2,0x74,0x98,0xCD,0x14,0x54,0xCA,0x53,0xA9,0x96,0x52,0x50,0x28,0x6F,0xBA,0xCB,0x0C,0x41,0x50,0xDE,0x65,0x2E,0xD3,0x05,0x89,0x4B,0x7B,0x6B,0x20,0x17,0x44,0xAE,0xED,0x23,0x81,0x52,0x90,0x85,0x73,0x57,0xD0,0x72,0x41,0xB1,0x02,0xDE,0x2E,0xDB,0x04,0x89,0x05,0x79,0xBB,0x62,0xE5,0x76,0x11,0xCA,0x61,0x0E,0xFF,0x1F}; -uint8_t spTWENTY[] PROGMEM = {0x01,0x98,0xD1,0xC2,0x00,0xCD,0xA4,0x32,0x20,0x79,0x13,0x04,0x28,0xE7,0x92,0xDC,0x70,0xCC,0x5D,0xDB,0x76,0xF3,0xD2,0x32,0x0B,0x0B,0x5B,0xC3,0x2B,0xCD,0xD4,0xDD,0x23,0x35,0xAF,0x44,0xE1,0xF0,0xB0,0x6D,0x3C,0xA9,0xAD,0x3D,0x35,0x0E,0xF1,0x0C,0x8B,0x28,0xF7,0x34,0x01,0x68,0x22,0xCD,0x00,0xC7,0xA4,0x04,0xBB,0x32,0xD6,0xAC,0x56,0x9C,0xDC,0xCA,0x28,0x66,0x53,0x51,0x70,0x2B,0xA5,0xBC,0x0D,0x9A,0xC1,0xEB,0x14,0x73,0x37,0x29,0x19,0xAF,0x33,0x8C,0x3B,0xA7,0x24,0xBC,0x42,0xB0,0xB7,0x59,0x09,0x09,0x3C,0x96,0xE9,0xF4,0x58,0xFF,0x0F}; -uint8_t spTHIRTY[] PROGMEM = {0x08,0x98,0xD6,0x15,0x01,0x43,0xBB,0x0A,0x20,0x1B,0x8B,0xE5,0x16,0xA3,0x1E,0xB6,0xB6,0x96,0x97,0x3C,0x57,0xD4,0x2A,0x5E,0x7E,0x4E,0xD8,0xE1,0x6B,0x7B,0xF8,0x39,0x63,0x0D,0x9F,0x95,0xE1,0xE7,0x4C,0x76,0xBC,0x91,0x5B,0x90,0x13,0xC6,0x68,0x57,0x4E,0x41,0x8B,0x10,0x5E,0x1D,0xA9,0x44,0xD3,0xBA,0x47,0xB8,0xDD,0xE4,0x35,0x86,0x11,0x93,0x94,0x92,0x5F,0x29,0xC7,0x4C,0x30,0x0C,0x41,0xC5,0x1C,0x3B,0x2E,0xD3,0x05,0x15,0x53,0x6C,0x07,0x4D,0x15,0x14,0x8C,0xB5,0xC9,0x6A,0x44,0x90,0x10,0x4E,0x9A,0xB6,0x21,0x81,0x23,0x3A,0x91,0x91,0xE8,0xFF,0x01}; -uint8_t spFOURTY[] PROGMEM = {0x04,0x18,0xB6,0x4C,0x00,0xC3,0x56,0x30,0xA0,0xE8,0xF4,0xA0,0x98,0x99,0x62,0x91,0xAE,0x83,0x6B,0x77,0x89,0x78,0x3B,0x09,0xAE,0xBD,0xA6,0x1E,0x63,0x3B,0x79,0x7E,0x71,0x5A,0x8F,0x95,0xE6,0xA5,0x4A,0x69,0xB9,0x4E,0x8A,0x5F,0x12,0x56,0xE4,0x58,0x69,0xE1,0x36,0xA1,0x69,0x2E,0x2B,0xF9,0x95,0x93,0x55,0x17,0xED,0xE4,0x37,0xC6,0xBA,0x93,0xB2,0x92,0xDF,0x19,0xD9,0x6E,0xC8,0x0A,0xFE,0x60,0xE8,0x37,0x21,0xC9,0xF9,0x8D,0x61,0x5F,0x32,0x13,0xE7,0x17,0x4C,0xD3,0xC6,0xB1,0x94,0x97,0x10,0x8F,0x8B,0xAD,0x11,0x7E,0xA1,0x9A,0x26,0x92,0xF6,0xFF,0x01}; -uint8_t spFIFTY[] PROGMEM = {0x08,0xE8,0x2E,0x84,0x00,0x23,0x84,0x13,0x60,0x38,0x95,0xA5,0x0F,0xCF,0xE2,0x79,0x8A,0x8F,0x37,0x02,0xB3,0xD5,0x2A,0x6E,0x5E,0x93,0x94,0x79,0x45,0xD9,0x05,0x5D,0x0A,0xB9,0x97,0x63,0x02,0x74,0xA7,0x82,0x80,0xEE,0xC3,0x10,0xD0,0x7D,0x28,0x03,0x6E,0x14,0x06,0x70,0xE6,0x0A,0xC9,0x9A,0x4E,0x37,0xD9,0x95,0x51,0xCE,0xBA,0xA2,0x14,0x0C,0x81,0x36,0x1B,0xB2,0x5C,0x30,0x38,0xFA,0x9C,0xC9,0x32,0x41,0xA7,0x18,0x3B,0xA2,0x48,0x04,0x05,0x51,0x4F,0x91,0x6D,0x12,0x04,0x20,0x9B,0x61,0x89,0xFF,0x1F}; -uint8_t spGOOD[] PROGMEM = {0x0A,0x28,0xCD,0x34,0x20,0xD9,0x1A,0x45,0x74,0xE4,0x66,0x24,0xAD,0xBA,0xB1,0x8C,0x9B,0x91,0xA5,0x64,0xE6,0x98,0x21,0x16,0x0B,0x96,0x9B,0x4C,0xE5,0xFF,0x01}; -uint8_t spMORNING[] PROGMEM = {0xCE,0x08,0x52,0x2A,0x35,0x5D,0x39,0x53,0x29,0x5B,0xB7,0x0A,0x15,0x0C,0xEE,0x2A,0x42,0x56,0x66,0xD2,0x55,0x2E,0x37,0x2F,0xD9,0x45,0xB3,0xD3,0xC5,0xCA,0x6D,0x27,0xD5,0xEE,0x50,0xF5,0x50,0x94,0x14,0x77,0x2D,0xD8,0x5D,0x49,0x92,0xFD,0xB1,0x64,0x2F,0xA9,0x49,0x0C,0x93,0x4B,0xAD,0x19,0x17,0x3E,0x66,0x1E,0xF1,0xA2,0x5B,0x84,0xE2,0x29,0x8F,0x8B,0x72,0x10,0xB5,0xB1,0x2E,0x4B,0xD4,0x45,0x89,0x4A,0xEC,0x5C,0x95,0x14,0x2B,0x8A,0x9C,0x34,0x52,0x5D,0xBC,0xCC,0xB5,0x3B,0x49,0x69,0x89,0x87,0xC1,0x98,0x56,0x3A,0x21,0x2B,0x82,0x67,0xCC,0x5C,0x85,0xB5,0x4A,0x8A,0xF6,0x64,0xA9,0x96,0xC4,0x69,0x3C,0x52,0x81,0x58,0x1C,0x97,0xF6,0x0E,0x1B,0xCC,0x0D,0x42,0x32,0xAA,0x65,0x12,0x67,0xD4,0x6A,0x61,0x52,0xFC,0xFF}; -uint8_t spAFTERNOON[] PROGMEM = {0xC7,0xCE,0xCE,0x3A,0xCB,0x58,0x1F,0x3B,0x07,0x9D,0x28,0x71,0xB4,0xAC,0x9C,0x74,0x5A,0x42,0x55,0x33,0xB2,0x93,0x0A,0x09,0xD4,0xC5,0x9A,0xD6,0x44,0x45,0xE3,0x38,0x60,0x9A,0x32,0x05,0xF4,0x18,0x01,0x09,0xD8,0xA9,0xC2,0x00,0x5E,0xCA,0x24,0xD5,0x5B,0x9D,0x4A,0x95,0xEA,0x34,0xEE,0x63,0x92,0x5C,0x4D,0xD0,0xA4,0xEE,0x58,0x0C,0xB9,0x4D,0xCD,0x42,0xA2,0x3A,0x24,0x37,0x25,0x8A,0xA8,0x8E,0xA0,0x53,0xE4,0x28,0x23,0x26,0x13,0x72,0x91,0xA2,0x76,0xBB,0x72,0x38,0x45,0x0A,0x46,0x63,0xCA,0x69,0x27,0x39,0x58,0xB1,0x8D,0x60,0x1C,0x34,0x1B,0x34,0xC3,0x55,0x8E,0x73,0x45,0x2D,0x4F,0x4A,0x3A,0x26,0x10,0xA1,0xCA,0x2D,0xE9,0x98,0x24,0x0A,0x1E,0x6D,0x97,0x29,0xD2,0xCC,0x71,0xA2,0xDC,0x86,0xC8,0x12,0xA7,0x8E,0x08,0x85,0x22,0x8D,0x9C,0x43,0xA7,0x12,0xB2,0x2E,0x50,0x09,0xEF,0x51,0xC5,0xBA,0x28,0x58,0xAD,0xDB,0xE1,0xFF,0x03}; -uint8_t spEVENING[] PROGMEM = {0xCD,0x6D,0x98,0x73,0x47,0x65,0x0D,0x6D,0x10,0xB2,0x5D,0x93,0x35,0x94,0xC1,0xD0,0x76,0x4D,0x66,0x93,0xA7,0x04,0xBD,0x71,0xD9,0x45,0xAE,0x92,0xD5,0xAC,0x53,0x07,0x6D,0xA5,0x76,0x63,0x51,0x92,0xD4,0xA1,0x83,0xD4,0xCB,0xB2,0x51,0x88,0xCD,0xF5,0x50,0x45,0xCE,0xA2,0x2E,0x27,0x28,0x54,0x15,0x37,0x0A,0xCF,0x75,0x61,0x5D,0xA2,0xC4,0xB5,0xC7,0x44,0x55,0x8A,0x0B,0xA3,0x6E,0x17,0x95,0x21,0xA9,0x0C,0x37,0xCD,0x15,0xBA,0xD4,0x2B,0x6F,0xB3,0x54,0xE4,0xD2,0xC8,0x64,0xBC,0x4C,0x91,0x49,0x12,0xE7,0xB2,0xB1,0xD0,0x22,0x0D,0x9C,0xDD,0xAB,0x62,0xA9,0x38,0x53,0x11,0xA9,0x74,0x2C,0xD2,0xCA,0x59,0x34,0xA3,0xE5,0xFF,0x03}; -uint8_t spPAUSE1[] PROGMEM = {0x00,0x00,0x00,0x00,0xFF,0x0F}; - -void sayTime(int hour, int minutes, AudioGeneratorTalkie *talkie) -{ +uint8_t spTHE[] PROGMEM = {0x08, 0xE8, 0x3E, 0x55, 0x01, 0xC3, 0x86, 0x27, 0xAF, 0x72, 0x0D, 0x4D, 0x97, 0xD5, 0xBC, 0x64, 0x3C, 0xF2, 0x5C, 0x51, 0xF1, 0x93, 0x36, 0x8F, 0x4F, 0x59, 0x2A, 0x42, 0x7A, 0x32, 0xC3, 0x64, 0xFF, 0x3F}; +uint8_t spTIME[] PROGMEM = {0x0E, 0x28, 0xAC, 0x2D, 0x01, 0x5D, 0xB6, 0x0D, 0x33, 0xF3, 0x54, 0xB3, 0x60, 0xBA, 0x8C, 0x54, 0x5C, 0xCD, 0x2D, 0xD4, 0x32, 0x73, 0x0F, 0x8E, 0x34, 0x33, 0xCB, 0x4A, 0x25, 0xD4, 0x25, 0x83, 0x2C, 0x2B, 0xD5, 0x50, 0x97, 0x08, 0x32, 0xEC, 0xD4, 0xDC, 0x4C, 0x33, 0xC8, 0x70, 0x73, 0x0F, 0x33, 0xCD, 0x20, 0xC3, 0xCB, 0x43, 0xDD, 0x3C, 0xCD, 0x8C, 0x20, 0x77, 0x89, 0xF4, 0x94, 0xB2, 0xE2, 0xE2, 0x35, 0x22, 0x5D, 0xD6, 0x4A, 0x8A, 0x96, 0xCC, 0x36, 0x25, 0x2D, 0xC9, 0x9A, 0x7B, 0xC2, 0x18, 0x87, 0x24, 0x4B, 0x1C, 0xC9, 0x50, 0x19, 0x92, 0x2C, 0x71, 0x34, 0x4B, 0x45, 0x8A, 0x8B, 0xC4, 0x96, 0xB6, 0x5A, 0x29, 0x2A, 0x92, 0x5A, 0xCA, 0x53, 0x96, 0x20, 0x05, 0x09, 0xF5, 0x92, 0x5D, 0xBC, 0xE8, 0x58, 0x4A, 0xDD, 0xAE, 0x73, 0xBD, 0x65, 0x4B, 0x8D, 0x78, 0xCA, 0x2B, 0x4E, 0xD8, 0xD9, 0xED, 0x22, 0x20, 0x06, 0x75, 0x00, 0x00, 0x80, 0xFF, 0x07}; +uint8_t spIS[] PROGMEM = {0x21, 0x18, 0x96, 0x38, 0xB7, 0x14, 0x8D, 0x60, 0x3A, 0xA6, 0xE8, 0x51, 0xB4, 0xDC, 0x2E, 0x48, 0x7B, 0x5A, 0xF1, 0x70, 0x1B, 0xA3, 0xEC, 0x09, 0xC6, 0xCB, 0xEB, 0x92, 0x3D, 0xA7, 0x69, 0x1F, 0xAF, 0x71, 0x89, 0x9C, 0xA2, 0xB3, 0xFC, 0xCA, 0x35, 0x72, 0x9A, 0xD1, 0xF0, 0xAB, 0x12, 0xB3, 0x2B, 0xC6, 0xCD, 0x4F, 0xCC, 0x32, 0x26, 0x19, 0x07, 0xDF, 0x0B, 0x8F, 0xB8, 0xA4, 0xED, 0x7C, 0xCF, 0x23, 0x62, 0x8B, 0x8E, 0xF1, 0x23, 0x0A, 0x8B, 0x6E, 0xCB, 0xCE, 0xEF, 0x54, 0x44, 0x3C, 0xDC, 0x08, 0x60, 0x0B, 0x37, 0x01, 0x1C, 0x53, 0x26, 0x80, 0x15, 0x4E, 0x14, 0xB0, 0x54, 0x2B, 0x02, 0xA4, 0x69, 0xFF, 0x7F}; +uint8_t spA_M_[] PROGMEM = {0xCD, 0xEF, 0x86, 0xAB, 0x57, 0x6D, 0x0F, 0xAF, 0x71, 0xAD, 0x49, 0x55, 0x3C, 0xFC, 0x2E, 0xC5, 0xB7, 0x5C, 0xF1, 0xF2, 0x87, 0x66, 0xDD, 0x4E, 0xC5, 0xC3, 0xEF, 0x92, 0xE2, 0x3A, 0x65, 0xB7, 0xA0, 0x09, 0xAA, 0x1B, 0x97, 0x54, 0x82, 0x2E, 0x28, 0x77, 0x5C, 0x52, 0x09, 0x1A, 0xA3, 0xB8, 0x76, 0x49, 0x25, 0x68, 0x8C, 0x73, 0xDB, 0x24, 0x95, 0xA0, 0x32, 0xA9, 0x6B, 0xA7, 0xD9, 0x82, 0x26, 0xA9, 0x76, 0x42, 0xD6, 0x08, 0xBA, 0xE1, 0xE8, 0x0E, 0x5A, 0x2B, 0xEA, 0x9E, 0x3D, 0x27, 0x18, 0xAD, 0xA8, 0x07, 0xF1, 0x98, 0x90, 0x35, 0xA2, 0x96, 0x44, 0xA3, 0x5D, 0x66, 0x8B, 0x6B, 0x12, 0xCD, 0x32, 0x85, 0x25, 0xC9, 0x81, 0x2D, 0xC3, 0x64, 0x85, 0x34, 0x58, 0x89, 0x94, 0x52, 0x1C, 0x52, 0x2F, 0x35, 0xDA, 0xC7, 0x51, 0x48, 0x23, 0x97, 0xCC, 0x2C, 0x97, 0x2E, 0xF3, 0x5C, 0xF3, 0xA2, 0x14, 0xBA, 0x2C, 0x48, 0xCE, 0xCA, 0x76, 0xE8, 0x32, 0x2F, 0x34, 0xB2, 0xDB, 0x85, 0xC9, 0x83, 0x90, 0xA8, 0x2C, 0x57, 0x26, 0x8F, 0x9C, 0xBD, 0xA2, 0x53, 0xD9, 0xC2, 0x54, 0x59, 0x28, 0x99, 0x4B, 0x2C, 0x5D, 0xFF, 0x3F}; +uint8_t spP_M_[] PROGMEM = {0x0E, 0x98, 0x41, 0x54, 0x00, 0x43, 0xA0, 0x05, 0xAB, 0x42, 0x8E, 0x1D, 0xA3, 0x15, 0xEC, 0x4E, 0x58, 0xF7, 0x92, 0x66, 0x70, 0x1B, 0x66, 0xDB, 0x73, 0x99, 0xC1, 0xEB, 0x98, 0xED, 0xD6, 0x25, 0x25, 0x6F, 0x70, 0x92, 0xDD, 0x64, 0xD8, 0xFC, 0x61, 0xD0, 0x66, 0x83, 0xD6, 0x0A, 0x86, 0x23, 0xAB, 0x69, 0xDA, 0x2B, 0x18, 0x9E, 0x3D, 0x37, 0x69, 0x9D, 0xA8, 0x07, 0x71, 0x9F, 0xA0, 0xBD, 0xA2, 0x16, 0xD5, 0x7C, 0x54, 0xF6, 0x88, 0x6B, 0x54, 0x8B, 0x34, 0x49, 0x2D, 0x29, 0x49, 0x3C, 0x34, 0x64, 0xA5, 0x24, 0x1B, 0x36, 0xD7, 0x72, 0x13, 0x92, 0xA4, 0xC4, 0x2D, 0xC3, 0xB3, 0x4B, 0xA3, 0x62, 0x0F, 0x2B, 0x37, 0x6E, 0x8B, 0x5A, 0xD4, 0x3D, 0xDD, 0x9A, 0x2D, 0x50, 0x93, 0xF6, 0x4C, 0xAA, 0xB6, 0xC4, 0x85, 0x3B, 0xB2, 0xB1, 0xD8, 0x93, 0x20, 0x4D, 0x8F, 0x24, 0xFF, 0x0F}; +uint8_t spOH[] PROGMEM = {0xC6, 0xC9, 0x71, 0x5A, 0xA2, 0x92, 0x14, 0x2F, 0x6E, 0x97, 0x9C, 0x46, 0x9D, 0xDC, 0xB0, 0x4D, 0x62, 0x1B, 0x55, 0x70, 0xDD, 0x55, 0xBE, 0x0E, 0x36, 0xC1, 0x33, 0x37, 0xA9, 0xA7, 0x51, 0x1B, 0xCF, 0x3C, 0xA5, 0x9E, 0x44, 0xAC, 0x3C, 0x7D, 0x98, 0x7B, 0x52, 0x96, 0x72, 0x65, 0x4B, 0xF6, 0x1A, 0xD9, 0xCA, 0xF5, 0x91, 0x2D, 0xA2, 0x2A, 0x4B, 0xF7, 0xFF, 0x01}; +uint8_t spOCLOCK[] PROGMEM = {0x21, 0x4E, 0x3D, 0xB8, 0x2B, 0x19, 0xBB, 0x24, 0x0E, 0xE5, 0xEC, 0x60, 0xE4, 0xF2, 0x90, 0x13, 0xD4, 0x2A, 0x11, 0x80, 0x00, 0x42, 0x69, 0x26, 0x40, 0xD0, 0x2B, 0x04, 0x68, 0xE0, 0x4D, 0x00, 0x3A, 0x35, 0x35, 0x33, 0xB6, 0x51, 0xD9, 0x64, 0x34, 0x82, 0xB4, 0x9A, 0x63, 0x92, 0x55, 0x89, 0x52, 0x5B, 0xCA, 0x2E, 0x34, 0x25, 0x4E, 0x63, 0x28, 0x3A, 0x50, 0x95, 0x26, 0x8D, 0xE6, 0xAA, 0x64, 0x58, 0xEA, 0x92, 0xCE, 0xC2, 0x46, 0x15, 0x9B, 0x86, 0xCD, 0x2A, 0x2E, 0x37, 0x00, 0x00, 0x00, 0x0C, 0xC8, 0xDD, 0x05, 0x01, 0xB9, 0x33, 0x21, 0xA0, 0x74, 0xD7, 0xFF, 0x07}; +uint8_t spONE[] PROGMEM = {0xCC, 0x67, 0x75, 0x42, 0x59, 0x5D, 0x3A, 0x4F, 0x9D, 0x36, 0x63, 0xB7, 0x59, 0xDC, 0x30, 0x5B, 0x5C, 0x23, 0x61, 0xF3, 0xE2, 0x1C, 0xF1, 0xF0, 0x98, 0xC3, 0x4B, 0x7D, 0x39, 0xCA, 0x1D, 0x2C, 0x2F, 0xB7, 0x15, 0xEF, 0x70, 0x79, 0xBC, 0xD2, 0x46, 0x7C, 0x52, 0xE5, 0xF1, 0x4A, 0x6A, 0xB3, 0x71, 0x47, 0xC3, 0x2D, 0x39, 0x34, 0x4B, 0x23, 0x35, 0xB7, 0x7A, 0x55, 0x33, 0x8F, 0x59, 0xDC, 0xA2, 0x44, 0xB5, 0xBC, 0x66, 0x72, 0x8B, 0x64, 0xF5, 0xF6, 0x98, 0xC1, 0x4D, 0x42, 0xD4, 0x27, 0x62, 0x38, 0x2F, 0x4A, 0xB6, 0x9C, 0x88, 0x68, 0xBC, 0xA6, 0x95, 0xF8, 0x5C, 0xA1, 0x09, 0x86, 0x77, 0x91, 0x11, 0x5B, 0xFF, 0x0F}; +uint8_t spTWO[] PROGMEM = {0x0E, 0x38, 0x6E, 0x25, 0x00, 0xA3, 0x0D, 0x3A, 0xA0, 0x37, 0xC5, 0xA0, 0x05, 0x9E, 0x56, 0x35, 0x86, 0xAA, 0x5E, 0x8C, 0xA4, 0x82, 0xB2, 0xD7, 0x74, 0x31, 0x22, 0x69, 0xAD, 0x1C, 0xD3, 0xC1, 0xD0, 0xFA, 0x28, 0x2B, 0x2D, 0x47, 0xC3, 0x1B, 0xC2, 0xC4, 0xAE, 0xC6, 0xCD, 0x9C, 0x48, 0x53, 0x9A, 0xFF, 0x0F}; +uint8_t spTHREE[] PROGMEM = {0x02, 0xD8, 0x2E, 0x9C, 0x01, 0xDB, 0xA6, 0x33, 0x60, 0xFB, 0x30, 0x01, 0xEC, 0x20, 0x12, 0x8C, 0xE4, 0xD8, 0xCA, 0x32, 0x96, 0x73, 0x63, 0x41, 0x39, 0x89, 0x98, 0xC1, 0x4D, 0x0D, 0xED, 0xB0, 0x2A, 0x05, 0x37, 0x0F, 0xB4, 0xA5, 0xAE, 0x5C, 0xDC, 0x36, 0xD0, 0x83, 0x2F, 0x4A, 0x71, 0x7B, 0x03, 0xF7, 0x38, 0x59, 0xCD, 0xED, 0x1E, 0xB4, 0x6B, 0x14, 0x35, 0xB7, 0x6B, 0x94, 0x99, 0x91, 0xD5, 0xDC, 0x26, 0x48, 0x77, 0x4B, 0x66, 0x71, 0x1B, 0x21, 0xDB, 0x2D, 0x8A, 0xC9, 0x6D, 0x88, 0xFC, 0x26, 0x28, 0x3A, 0xB7, 0x21, 0xF4, 0x1F, 0xA3, 0x65, 0xBC, 0x02, 0x38, 0xBB, 0x3D, 0x8E, 0xF0, 0x2B, 0xE2, 0x08, 0xB7, 0x34, 0xFF, 0x0F}; +uint8_t spFOUR[] PROGMEM = {0x0C, 0x18, 0xB6, 0x9A, 0x01, 0xC3, 0x75, 0x09, 0x60, 0xD8, 0x0E, 0x09, 0x30, 0xA0, 0x9B, 0xB6, 0xA0, 0xBB, 0xB0, 0xAA, 0x16, 0x4E, 0x82, 0xEB, 0xEA, 0xA9, 0xFA, 0x59, 0x49, 0x9E, 0x59, 0x23, 0x9A, 0x27, 0x3B, 0x78, 0x66, 0xAE, 0x4A, 0x9C, 0x9C, 0xE0, 0x99, 0xD3, 0x2A, 0xBD, 0x72, 0x92, 0xEF, 0xE6, 0x88, 0xE4, 0x45, 0x4D, 0x7E, 0x98, 0x2D, 0x62, 0x67, 0x37, 0xF9, 0xA1, 0x37, 0xA7, 0x6C, 0x94, 0xE4, 0xC7, 0x1E, 0xDC, 0x3C, 0xA5, 0x83, 0x1F, 0x8B, 0xEB, 0x52, 0x0E, 0x0E, 0x7E, 0x2E, 0x4E, 0xC7, 0x31, 0xD2, 0x79, 0xA5, 0x3A, 0x0D, 0xD9, 0xC4, 0xFF, 0x07}; +uint8_t spFIVE[] PROGMEM = {0x02, 0xE8, 0x3E, 0x8C, 0x01, 0xDD, 0x65, 0x08, 0x60, 0x98, 0x4C, 0x06, 0x34, 0x93, 0xCE, 0x80, 0xE6, 0xDA, 0x9A, 0x14, 0x6B, 0xAA, 0x47, 0xD1, 0x5E, 0x56, 0xAA, 0x6D, 0x56, 0xCD, 0x78, 0xD9, 0xA9, 0x1C, 0x67, 0x05, 0x83, 0xE1, 0xA4, 0xBA, 0x38, 0xEE, 0x16, 0x86, 0x9B, 0xFA, 0x60, 0x87, 0x5B, 0x18, 0x6E, 0xEE, 0x8B, 0x1D, 0x6E, 0x61, 0xB9, 0x69, 0x36, 0x65, 0xBA, 0x8D, 0xE5, 0xE5, 0x3E, 0x1C, 0xE9, 0x0E, 0x96, 0x9B, 0x5B, 0xAB, 0x95, 0x2B, 0x58, 0x6E, 0xCE, 0xE5, 0x3A, 0x6A, 0xF3, 0xB8, 0x35, 0x84, 0x7B, 0x05, 0xA3, 0xE3, 0x36, 0xEF, 0x92, 0x19, 0xB4, 0x86, 0xDB, 0xB4, 0x69, 0xB4, 0xD1, 0x2A, 0x4E, 0x65, 0x9A, 0x99, 0xCE, 0x28, 0xD9, 0x85, 0x71, 0x4C, 0x18, 0x6D, 0x67, 0x47, 0xC6, 0x5E, 0x53, 0x4A, 0x9C, 0xB5, 0xE2, 0x85, 0x45, 0x26, 0xFE, 0x7F}; +uint8_t spSIX[] PROGMEM = {0x0E, 0xD8, 0xAE, 0xDD, 0x03, 0x0E, 0x38, 0xA6, 0xD2, 0x01, 0xD3, 0xB4, 0x2C, 0xAD, 0x6A, 0x35, 0x9D, 0xB1, 0x7D, 0xDC, 0xEE, 0xC4, 0x65, 0xD7, 0xF1, 0x72, 0x47, 0x24, 0xB3, 0x19, 0xD9, 0xD9, 0x05, 0x70, 0x40, 0x49, 0xEA, 0x02, 0x98, 0xBE, 0x42, 0x01, 0xDF, 0xA4, 0x69, 0x40, 0x00, 0xDF, 0x95, 0xFC, 0x3F}; +uint8_t spSEVEN[] PROGMEM = {0x02, 0xB8, 0x3A, 0x8C, 0x01, 0xDF, 0xA4, 0x73, 0x40, 0x01, 0x47, 0xB9, 0x2F, 0x33, 0x3B, 0x73, 0x5F, 0x53, 0x7C, 0xEC, 0x9A, 0xC5, 0x63, 0xD5, 0xD1, 0x75, 0xAE, 0x5B, 0xFC, 0x64, 0x5C, 0x35, 0x87, 0x91, 0xF1, 0x83, 0x36, 0xB5, 0x68, 0x55, 0xC5, 0x6F, 0xDA, 0x45, 0x2D, 0x1C, 0x2D, 0xB7, 0x38, 0x37, 0x9F, 0x60, 0x3C, 0xBC, 0x9A, 0x85, 0xA3, 0x25, 0x66, 0xF7, 0x8A, 0x57, 0x1C, 0xA9, 0x67, 0x56, 0xCA, 0x5E, 0xF0, 0xB2, 0x16, 0xB2, 0xF1, 0x89, 0xCE, 0x8B, 0x92, 0x25, 0xC7, 0x2B, 0x33, 0xCF, 0x48, 0xB1, 0x99, 0xB4, 0xF3, 0xFF}; +uint8_t spEIGHT[] PROGMEM = {0xC3, 0x6C, 0x86, 0xB3, 0x27, 0x6D, 0x0F, 0xA7, 0x48, 0x99, 0x4E, 0x55, 0x3C, 0xBC, 0x22, 0x65, 0x36, 0x4D, 0xD1, 0xF0, 0x32, 0xD3, 0xBE, 0x34, 0xDA, 0xC3, 0xEB, 0x82, 0xE2, 0xDA, 0x65, 0x35, 0xAF, 0x31, 0xF2, 0x6B, 0x97, 0x95, 0xBC, 0x86, 0xD8, 0x6F, 0x82, 0xA6, 0x73, 0x0B, 0xC6, 0x9E, 0x72, 0x99, 0xCC, 0xCB, 0x02, 0xAD, 0x3C, 0x9A, 0x10, 0x60, 0xAB, 0x62, 0x05, 0x2C, 0x37, 0x84, 0x00, 0xA9, 0x73, 0x00, 0x00, 0xFE, 0x1F}; +uint8_t spNINE[] PROGMEM = {0xCC, 0xA1, 0x26, 0xBB, 0x83, 0x93, 0x18, 0xCF, 0x4A, 0xAD, 0x2E, 0x31, 0xED, 0x3C, 0xA7, 0x24, 0x26, 0xC3, 0x54, 0xF1, 0x92, 0x64, 0x8B, 0x8A, 0x98, 0xCB, 0x2B, 0x2E, 0x34, 0x53, 0x2D, 0x0E, 0x2F, 0x57, 0xB3, 0x0C, 0x0D, 0x3C, 0xBC, 0x3C, 0x4C, 0x4B, 0xCA, 0xF4, 0xF0, 0x72, 0x0F, 0x6E, 0x49, 0x53, 0xCD, 0xCB, 0x53, 0x2D, 0x35, 0x4D, 0x0F, 0x2F, 0x0F, 0xD7, 0x0C, 0x0D, 0x3D, 0xBC, 0xDC, 0x4D, 0xD3, 0xDD, 0xC2, 0xF0, 0x72, 0x52, 0x4F, 0x57, 0x9B, 0xC3, 0xAB, 0x89, 0xBD, 0x42, 0x2D, 0x0F, 0xAF, 0x5A, 0xD1, 0x71, 0x91, 0x55, 0xBC, 0x2C, 0xC5, 0x3B, 0xD8, 0x65, 0xF2, 0x82, 0x94, 0x18, 0x4E, 0x3B, 0xC1, 0x73, 0x42, 0x32, 0x33, 0x15, 0x45, 0x4F, 0x79, 0x52, 0x6A, 0x55, 0xA6, 0xA3, 0xFF, 0x07}; +uint8_t spTEN[] PROGMEM = {0x0E, 0xD8, 0xB1, 0xDD, 0x01, 0x3D, 0xA8, 0x24, 0x7B, 0x04, 0x27, 0x76, 0x77, 0xDC, 0xEC, 0xC2, 0xC5, 0x23, 0x84, 0xCD, 0x72, 0x9A, 0x51, 0xF7, 0x62, 0x45, 0xC7, 0xEB, 0x4E, 0x35, 0x4A, 0x14, 0x2D, 0xBF, 0x45, 0xB6, 0x0A, 0x75, 0xB8, 0xFC, 0x16, 0xD9, 0x2A, 0xD9, 0xD6, 0x0A, 0x5A, 0x10, 0xCD, 0xA2, 0x48, 0x23, 0xA8, 0x81, 0x35, 0x4B, 0x2C, 0xA7, 0x20, 0x69, 0x0A, 0xAF, 0xB6, 0x15, 0x82, 0xA4, 0x29, 0x3C, 0xC7, 0x52, 0x08, 0xA2, 0x22, 0xCF, 0x68, 0x4B, 0x2E, 0xF0, 0x8A, 0xBD, 0xA3, 0x2C, 0xAB, 0x40, 0x1B, 0xCE, 0xAA, 0xB2, 0x6C, 0x82, 0x40, 0x4D, 0x7D, 0xC2, 0x89, 0x88, 0x8A, 0x61, 0xCC, 0x74, 0xD5, 0xFF, 0x0F}; +uint8_t spELEVEN[] PROGMEM = {0xC3, 0xCD, 0x76, 0x5C, 0xAE, 0x14, 0x0F, 0x37, 0x9B, 0x71, 0xDE, 0x92, 0x55, 0xBC, 0x2C, 0x27, 0x70, 0xD3, 0x76, 0xF0, 0x83, 0x5E, 0xA3, 0x5E, 0x5A, 0xC1, 0xF7, 0x61, 0x58, 0xA7, 0x19, 0x35, 0x3F, 0x99, 0x31, 0xDE, 0x52, 0x74, 0xFC, 0xA2, 0x26, 0x64, 0x4B, 0xD1, 0xF1, 0xAB, 0xAE, 0xD0, 0x2D, 0xC5, 0xC7, 0x2F, 0x36, 0xDD, 0x27, 0x15, 0x0F, 0x3F, 0xD9, 0x08, 0x9F, 0x62, 0xE4, 0xC2, 0x2C, 0xD4, 0xD8, 0xD3, 0x89, 0x0B, 0x1B, 0x57, 0x11, 0x0B, 0x3B, 0xC5, 0xCF, 0xD6, 0xCC, 0xC6, 0x64, 0x35, 0xAF, 0x18, 0x73, 0x1F, 0xA1, 0x5D, 0xBC, 0x62, 0x45, 0xB3, 0x45, 0x51, 0xF0, 0xA2, 0x62, 0xAB, 0x4A, 0x5B, 0xC9, 0x4B, 0x8A, 0x2D, 0xB3, 0x6C, 0x06, 0x2F, 0x29, 0xB2, 0xAC, 0x8A, 0x18, 0xBC, 0x28, 0xD9, 0xAA, 0xD2, 0x92, 0xF1, 0xBC, 0xE0, 0x98, 0x8C, 0x48, 0xCC, 0x17, 0x52, 0xA3, 0x27, 0x6D, 0x93, 0xD0, 0x4B, 0x8E, 0x0E, 0x77, 0x02, 0x00, 0xFF, 0x0F}; +uint8_t spTWELVE[] PROGMEM = {0x06, 0x28, 0x46, 0xD3, 0x01, 0x25, 0x06, 0x13, 0x20, 0xBA, 0x70, 0x70, 0xB6, 0x79, 0xCA, 0x36, 0xAE, 0x28, 0x38, 0xE1, 0x29, 0xC5, 0x35, 0xA3, 0xE6, 0xC4, 0x16, 0x6A, 0x53, 0x8C, 0x97, 0x9B, 0x72, 0x86, 0x4F, 0x28, 0x1A, 0x6E, 0x0A, 0x59, 0x36, 0xAE, 0x68, 0xF8, 0x29, 0x67, 0xFA, 0x06, 0xA3, 0x16, 0xC4, 0x96, 0xE6, 0x53, 0xAC, 0x5A, 0x9C, 0x56, 0x72, 0x77, 0x31, 0x4E, 0x49, 0x5C, 0x8D, 0x5B, 0x29, 0x3B, 0x24, 0x61, 0x1E, 0x6C, 0x9B, 0x6C, 0x97, 0xF8, 0xA7, 0x34, 0x19, 0x92, 0x4C, 0x62, 0x9E, 0x72, 0x65, 0x58, 0x12, 0xB1, 0x7E, 0x09, 0xD5, 0x2E, 0x53, 0xC5, 0xBA, 0x36, 0x6B, 0xB9, 0x2D, 0x17, 0x05, 0xEE, 0x9A, 0x6E, 0x8E, 0x05, 0x50, 0x6C, 0x19, 0x07, 0x18, 0x50, 0xBD, 0x3B, 0x01, 0x92, 0x08, 0x41, 0x40, 0x10, 0xA6, 0xFF, 0x0F}; +uint8_t spTHIRTEEN[] PROGMEM = {0x08, 0xE8, 0x2C, 0x15, 0x01, 0x43, 0x07, 0x13, 0xE0, 0x98, 0xB4, 0xA6, 0x35, 0xA9, 0x1E, 0xDE, 0x56, 0x8E, 0x53, 0x9C, 0x7A, 0xE7, 0xCA, 0x5E, 0x76, 0x8D, 0x94, 0xE5, 0x2B, 0xAB, 0xD9, 0xB5, 0x62, 0xA4, 0x9C, 0xE4, 0xE6, 0xB4, 0x41, 0x1E, 0x7C, 0xB6, 0x93, 0xD7, 0x16, 0x99, 0x5A, 0xCD, 0x61, 0x76, 0x55, 0xC2, 0x91, 0x61, 0x1B, 0xC0, 0x01, 0x5D, 0x85, 0x05, 0xE0, 0x68, 0x51, 0x07, 0x1C, 0xA9, 0x64, 0x80, 0x1D, 0x4C, 0x9C, 0x95, 0x88, 0xD4, 0x04, 0x3B, 0x4D, 0x4E, 0x21, 0x5C, 0x93, 0xA8, 0x26, 0xB9, 0x05, 0x4B, 0x6E, 0xA0, 0xE2, 0xE4, 0x57, 0xC2, 0xB9, 0xC1, 0xB2, 0x93, 0x5F, 0x09, 0xD7, 0x24, 0xCB, 0x4E, 0x41, 0x25, 0x54, 0x1D, 0x62, 0x3B, 0x05, 0x8D, 0x52, 0x57, 0xAA, 0xAD, 0x10, 0x24, 0x26, 0xE3, 0xE1, 0x36, 0x5D, 0x10, 0x85, 0xB4, 0x97, 0x85, 0x72, 0x41, 0x14, 0x52, 0x5E, 0x1A, 0xCA, 0xF9, 0x91, 0x6B, 0x7A, 0x5B, 0xC4, 0xE0, 0x17, 0x2D, 0x54, 0x1D, 0x92, 0x8C, 0x1F, 0x25, 0x4B, 0x8F, 0xB2, 0x16, 0x41, 0xA1, 0x4A, 0x3E, 0xE6, 0xFA, 0xFF, 0x01}; +uint8_t spFOURTEEN[] PROGMEM = {0x0C, 0x58, 0xAE, 0x5C, 0x01, 0xD9, 0x87, 0x07, 0x51, 0xB7, 0x25, 0xB3, 0x8A, 0x15, 0x2C, 0xF7, 0x1C, 0x35, 0x87, 0x4D, 0xB2, 0xDD, 0x53, 0xCE, 0x28, 0x2B, 0xC9, 0x0E, 0x97, 0x2D, 0xBD, 0x2A, 0x17, 0x27, 0x76, 0x8E, 0xD2, 0x9A, 0x6C, 0x80, 0x94, 0x71, 0x00, 0x00, 0x02, 0xB0, 0x58, 0x58, 0x00, 0x9E, 0x0B, 0x0A, 0xC0, 0xB2, 0xCE, 0xC1, 0xC8, 0x98, 0x7A, 0x52, 0x95, 0x24, 0x2B, 0x11, 0xED, 0x36, 0xD4, 0x92, 0xDC, 0x4C, 0xB5, 0xC7, 0xC8, 0x53, 0xF1, 0x2A, 0xE5, 0x1A, 0x17, 0x55, 0xC5, 0xAF, 0x94, 0xBB, 0xCD, 0x1C, 0x26, 0xBF, 0x52, 0x9A, 0x72, 0x53, 0x98, 0xFC, 0xC2, 0x68, 0xD2, 0x4D, 0x61, 0xF0, 0xA3, 0x90, 0xB6, 0xD6, 0x50, 0xC1, 0x8F, 0x42, 0xDA, 0x4A, 0x43, 0x39, 0x3F, 0x48, 0x2D, 0x6B, 0x33, 0xF9, 0xFF}; +uint8_t spFIFTEEN[] PROGMEM = {0x08, 0xE8, 0x2A, 0x0D, 0x01, 0xDD, 0xBA, 0x31, 0x60, 0x6A, 0xF7, 0xA0, 0xAE, 0x54, 0xAA, 0x5A, 0x76, 0x97, 0xD9, 0x34, 0x69, 0xEF, 0x32, 0x1E, 0x66, 0xE1, 0xE2, 0xB3, 0x43, 0xA9, 0x18, 0x55, 0x92, 0x4E, 0x37, 0x2D, 0x67, 0x6F, 0xDF, 0xA2, 0x5A, 0xB6, 0x04, 0x30, 0x55, 0xA8, 0x00, 0x86, 0x09, 0xE7, 0x00, 0x01, 0x16, 0x17, 0x05, 0x70, 0x40, 0x57, 0xE5, 0x01, 0xF8, 0x21, 0x34, 0x00, 0xD3, 0x19, 0x33, 0x80, 0x89, 0x9A, 0x62, 0x34, 0x4C, 0xD5, 0x49, 0xAE, 0x8B, 0x53, 0x09, 0xF7, 0x26, 0xD9, 0x6A, 0x7E, 0x23, 0x5C, 0x13, 0x12, 0xB3, 0x04, 0x9D, 0x50, 0x4F, 0xB1, 0xAD, 0x14, 0x15, 0xC2, 0xD3, 0xA1, 0xB6, 0x42, 0x94, 0xA8, 0x8C, 0x87, 0xDB, 0x74, 0xB1, 0x70, 0x59, 0xE1, 0x2E, 0xC9, 0xC5, 0x81, 0x5B, 0x55, 0xA4, 0x4C, 0x17, 0x47, 0xC1, 0x6D, 0xE3, 0x81, 0x53, 0x9C, 0x84, 0x6A, 0x46, 0xD9, 0x4C, 0x51, 0x31, 0x42, 0xD9, 0x66, 0xC9, 0x44, 0x85, 0x29, 0x6A, 0x9B, 0xAD, 0xFF, 0x07}; +uint8_t spSIXTEEN[] PROGMEM = {0x0A, 0x58, 0x5A, 0x5D, 0x00, 0x93, 0x97, 0x0B, 0x60, 0xA9, 0x48, 0x05, 0x0C, 0x15, 0xAE, 0x80, 0xAD, 0x3D, 0x14, 0x30, 0x7D, 0xD9, 0x50, 0x92, 0x92, 0xAC, 0x0D, 0xC5, 0xCD, 0x2A, 0x82, 0xAA, 0x3B, 0x98, 0x04, 0xB3, 0x4A, 0xC8, 0x9A, 0x90, 0x05, 0x09, 0x68, 0x51, 0xD4, 0x01, 0x23, 0x9F, 0x1A, 0x60, 0xA9, 0x12, 0x03, 0xDC, 0x50, 0x81, 0x80, 0x22, 0xDC, 0x20, 0x00, 0xCB, 0x06, 0x3A, 0x60, 0x16, 0xE3, 0x64, 0x64, 0x42, 0xDD, 0xCD, 0x6A, 0x8A, 0x5D, 0x28, 0x75, 0x07, 0xA9, 0x2A, 0x5E, 0x65, 0x34, 0xED, 0x64, 0xBB, 0xF8, 0x85, 0xF2, 0x94, 0x8B, 0xAD, 0xE4, 0x37, 0x4A, 0x5B, 0x21, 0xB6, 0x52, 0x50, 0x19, 0xAD, 0xA7, 0xD8, 0x4A, 0x41, 0x14, 0xDA, 0x5E, 0x12, 0x3A, 0x04, 0x91, 0x4B, 0x7B, 0x69, 0xA8, 0x10, 0x24, 0x2E, 0xE5, 0xA3, 0x81, 0x52, 0x90, 0x94, 0x5A, 0x55, 0x98, 0x32, 0x41, 0x50, 0xCC, 0x93, 0x2E, 0x47, 0x85, 0x89, 0x1B, 0x5B, 0x5A, 0x62, 0x04, 0x44, 0xE3, 0x02, 0x80, 0x80, 0x64, 0xDD, 0xFF, 0x1F}; +uint8_t spSEVENTEEN[] PROGMEM = {0x02, 0x98, 0x3A, 0x42, 0x00, 0x5B, 0xA6, 0x09, 0x60, 0xDB, 0x52, 0x06, 0x1C, 0x93, 0x29, 0x80, 0xA9, 0x52, 0x87, 0x9A, 0xB5, 0x99, 0x4F, 0xC8, 0x3E, 0x46, 0xD6, 0x5E, 0x7E, 0x66, 0xFB, 0x98, 0xC5, 0x5A, 0xC6, 0x9A, 0x9C, 0x63, 0x15, 0x6B, 0x11, 0x13, 0x8A, 0x9C, 0x97, 0xB9, 0x9A, 0x5A, 0x39, 0x71, 0xEE, 0xD2, 0x29, 0xC2, 0xA6, 0xB8, 0x58, 0x59, 0x99, 0x56, 0x14, 0xA3, 0xE1, 0x26, 0x19, 0x19, 0xE3, 0x8C, 0x93, 0x17, 0xB4, 0x46, 0xB5, 0x88, 0x71, 0x9E, 0x97, 0x9E, 0xB1, 0x2C, 0xC5, 0xF8, 0x56, 0xC4, 0x58, 0xA3, 0x1C, 0xE1, 0x33, 0x9D, 0x13, 0x41, 0x8A, 0x43, 0x58, 0xAD, 0x95, 0xA9, 0xDB, 0x36, 0xC0, 0xD1, 0xC9, 0x0E, 0x58, 0x4E, 0x45, 0x01, 0x23, 0xA9, 0x04, 0x37, 0x13, 0xAE, 0x4D, 0x65, 0x52, 0x82, 0xCA, 0xA9, 0x37, 0x99, 0x4D, 0x89, 0xBA, 0xC0, 0xBC, 0x14, 0x36, 0x25, 0xEA, 0x1C, 0x73, 0x52, 0x1D, 0x97, 0xB8, 0x33, 0xAC, 0x0E, 0x75, 0x9C, 0xE2, 0xCE, 0xB0, 0xDA, 0xC3, 0x51, 0x4A, 0x1A, 0xA5, 0xCA, 0x70, 0x5B, 0x21, 0xCE, 0x4C, 0x26, 0xD2, 0x6C, 0xBA, 0x38, 0x71, 0x2E, 0x1F, 0x2D, 0xED, 0xE2, 0x24, 0xB8, 0xBC, 0x3D, 0x52, 0x88, 0xAB, 0x50, 0x8E, 0xA8, 0x48, 0x22, 0x4E, 0x42, 0xA0, 0x26, 0x55, 0xFD, 0x3F}; +uint8_t spEIGHTEEN[] PROGMEM = {0x2E, 0x9C, 0xD1, 0x4D, 0x54, 0xEC, 0x2C, 0xBF, 0x1B, 0x8A, 0x99, 0x70, 0x7C, 0xFC, 0x2E, 0x29, 0x6F, 0x52, 0xF6, 0xF1, 0xBA, 0x20, 0xBF, 0x36, 0xD9, 0xCD, 0xED, 0x0C, 0xF3, 0x27, 0x64, 0x17, 0x73, 0x2B, 0xA2, 0x99, 0x90, 0x65, 0xEC, 0xED, 0x40, 0x73, 0x32, 0x12, 0xB1, 0xAF, 0x30, 0x35, 0x0B, 0xC7, 0x00, 0xE0, 0x80, 0xAE, 0xDD, 0x1C, 0x70, 0x43, 0xAA, 0x03, 0x86, 0x51, 0x36, 0xC0, 0x30, 0x64, 0xCE, 0x4C, 0x98, 0xFB, 0x5C, 0x65, 0x07, 0xAF, 0x10, 0xEA, 0x0B, 0x66, 0x1B, 0xFC, 0x46, 0xA8, 0x3E, 0x09, 0x4D, 0x08, 0x2A, 0xA6, 0x3E, 0x67, 0x36, 0x21, 0x2A, 0x98, 0x67, 0x9D, 0x15, 0xA7, 0xA8, 0x60, 0xEE, 0xB6, 0x94, 0x99, 0xA2, 0x4A, 0x78, 0x22, 0xC2, 0xA6, 0x8B, 0x8C, 0x8E, 0xCC, 0x4C, 0x8A, 0x2E, 0x8A, 0x4C, 0xD3, 0x57, 0x03, 0x87, 0x28, 0x71, 0x09, 0x1F, 0x2B, 0xE4, 0xA2, 0xC4, 0xC5, 0x6D, 0xAD, 0x54, 0x88, 0xB2, 0x63, 0xC9, 0xF2, 0x50, 0x2E, 0x8A, 0x4A, 0x38, 0x4A, 0xEC, 0x88, 0x28, 0x08, 0xE3, 0x28, 0x49, 0xF3, 0xFF}; +uint8_t spNINETEEN[] PROGMEM = {0xC2, 0xEA, 0x8A, 0x95, 0x2B, 0x6A, 0x05, 0x3F, 0x71, 0x71, 0x5F, 0x0D, 0x12, 0xFC, 0x28, 0x25, 0x62, 0x35, 0xF0, 0xF0, 0xB3, 0x48, 0x1E, 0x0F, 0xC9, 0xCB, 0x2F, 0x45, 0x7C, 0x2C, 0x25, 0x1F, 0xBF, 0x14, 0xB3, 0x2C, 0xB5, 0x75, 0xFC, 0x5A, 0x5C, 0xA3, 0x5D, 0xE1, 0xF1, 0x7A, 0x76, 0xB3, 0x4E, 0x45, 0xC7, 0xED, 0x96, 0x23, 0x3B, 0x18, 0x37, 0x7B, 0x18, 0xCC, 0x09, 0x51, 0x13, 0x4C, 0xAB, 0x6C, 0x4C, 0x4B, 0x96, 0xD2, 0x49, 0xAA, 0x36, 0x0B, 0xC5, 0xC2, 0x20, 0x26, 0x27, 0x35, 0x63, 0x09, 0x3D, 0x30, 0x8B, 0xF0, 0x48, 0x5C, 0xCA, 0x61, 0xDD, 0xCB, 0xCD, 0x91, 0x03, 0x8E, 0x4B, 0x76, 0xC0, 0xCC, 0x4D, 0x06, 0x98, 0x31, 0x31, 0x98, 0x99, 0x70, 0x6D, 0x2A, 0xA3, 0xE4, 0x16, 0xCA, 0xBD, 0xCE, 0x5C, 0x92, 0x57, 0x28, 0xCF, 0x09, 0x69, 0x2E, 0x7E, 0xA5, 0x3C, 0x63, 0xA2, 0x30, 0x05, 0x95, 0xD2, 0x74, 0x98, 0xCD, 0x14, 0x54, 0xCA, 0x53, 0xA9, 0x96, 0x52, 0x50, 0x28, 0x6F, 0xBA, 0xCB, 0x0C, 0x41, 0x50, 0xDE, 0x65, 0x2E, 0xD3, 0x05, 0x89, 0x4B, 0x7B, 0x6B, 0x20, 0x17, 0x44, 0xAE, 0xED, 0x23, 0x81, 0x52, 0x90, 0x85, 0x73, 0x57, 0xD0, 0x72, 0x41, 0xB1, 0x02, 0xDE, 0x2E, 0xDB, 0x04, 0x89, 0x05, 0x79, 0xBB, 0x62, 0xE5, 0x76, 0x11, 0xCA, 0x61, 0x0E, 0xFF, 0x1F}; +uint8_t spTWENTY[] PROGMEM = {0x01, 0x98, 0xD1, 0xC2, 0x00, 0xCD, 0xA4, 0x32, 0x20, 0x79, 0x13, 0x04, 0x28, 0xE7, 0x92, 0xDC, 0x70, 0xCC, 0x5D, 0xDB, 0x76, 0xF3, 0xD2, 0x32, 0x0B, 0x0B, 0x5B, 0xC3, 0x2B, 0xCD, 0xD4, 0xDD, 0x23, 0x35, 0xAF, 0x44, 0xE1, 0xF0, 0xB0, 0x6D, 0x3C, 0xA9, 0xAD, 0x3D, 0x35, 0x0E, 0xF1, 0x0C, 0x8B, 0x28, 0xF7, 0x34, 0x01, 0x68, 0x22, 0xCD, 0x00, 0xC7, 0xA4, 0x04, 0xBB, 0x32, 0xD6, 0xAC, 0x56, 0x9C, 0xDC, 0xCA, 0x28, 0x66, 0x53, 0x51, 0x70, 0x2B, 0xA5, 0xBC, 0x0D, 0x9A, 0xC1, 0xEB, 0x14, 0x73, 0x37, 0x29, 0x19, 0xAF, 0x33, 0x8C, 0x3B, 0xA7, 0x24, 0xBC, 0x42, 0xB0, 0xB7, 0x59, 0x09, 0x09, 0x3C, 0x96, 0xE9, 0xF4, 0x58, 0xFF, 0x0F}; +uint8_t spTHIRTY[] PROGMEM = {0x08, 0x98, 0xD6, 0x15, 0x01, 0x43, 0xBB, 0x0A, 0x20, 0x1B, 0x8B, 0xE5, 0x16, 0xA3, 0x1E, 0xB6, 0xB6, 0x96, 0x97, 0x3C, 0x57, 0xD4, 0x2A, 0x5E, 0x7E, 0x4E, 0xD8, 0xE1, 0x6B, 0x7B, 0xF8, 0x39, 0x63, 0x0D, 0x9F, 0x95, 0xE1, 0xE7, 0x4C, 0x76, 0xBC, 0x91, 0x5B, 0x90, 0x13, 0xC6, 0x68, 0x57, 0x4E, 0x41, 0x8B, 0x10, 0x5E, 0x1D, 0xA9, 0x44, 0xD3, 0xBA, 0x47, 0xB8, 0xDD, 0xE4, 0x35, 0x86, 0x11, 0x93, 0x94, 0x92, 0x5F, 0x29, 0xC7, 0x4C, 0x30, 0x0C, 0x41, 0xC5, 0x1C, 0x3B, 0x2E, 0xD3, 0x05, 0x15, 0x53, 0x6C, 0x07, 0x4D, 0x15, 0x14, 0x8C, 0xB5, 0xC9, 0x6A, 0x44, 0x90, 0x10, 0x4E, 0x9A, 0xB6, 0x21, 0x81, 0x23, 0x3A, 0x91, 0x91, 0xE8, 0xFF, 0x01}; +uint8_t spFOURTY[] PROGMEM = {0x04, 0x18, 0xB6, 0x4C, 0x00, 0xC3, 0x56, 0x30, 0xA0, 0xE8, 0xF4, 0xA0, 0x98, 0x99, 0x62, 0x91, 0xAE, 0x83, 0x6B, 0x77, 0x89, 0x78, 0x3B, 0x09, 0xAE, 0xBD, 0xA6, 0x1E, 0x63, 0x3B, 0x79, 0x7E, 0x71, 0x5A, 0x8F, 0x95, 0xE6, 0xA5, 0x4A, 0x69, 0xB9, 0x4E, 0x8A, 0x5F, 0x12, 0x56, 0xE4, 0x58, 0x69, 0xE1, 0x36, 0xA1, 0x69, 0x2E, 0x2B, 0xF9, 0x95, 0x93, 0x55, 0x17, 0xED, 0xE4, 0x37, 0xC6, 0xBA, 0x93, 0xB2, 0x92, 0xDF, 0x19, 0xD9, 0x6E, 0xC8, 0x0A, 0xFE, 0x60, 0xE8, 0x37, 0x21, 0xC9, 0xF9, 0x8D, 0x61, 0x5F, 0x32, 0x13, 0xE7, 0x17, 0x4C, 0xD3, 0xC6, 0xB1, 0x94, 0x97, 0x10, 0x8F, 0x8B, 0xAD, 0x11, 0x7E, 0xA1, 0x9A, 0x26, 0x92, 0xF6, 0xFF, 0x01}; +uint8_t spFIFTY[] PROGMEM = {0x08, 0xE8, 0x2E, 0x84, 0x00, 0x23, 0x84, 0x13, 0x60, 0x38, 0x95, 0xA5, 0x0F, 0xCF, 0xE2, 0x79, 0x8A, 0x8F, 0x37, 0x02, 0xB3, 0xD5, 0x2A, 0x6E, 0x5E, 0x93, 0x94, 0x79, 0x45, 0xD9, 0x05, 0x5D, 0x0A, 0xB9, 0x97, 0x63, 0x02, 0x74, 0xA7, 0x82, 0x80, 0xEE, 0xC3, 0x10, 0xD0, 0x7D, 0x28, 0x03, 0x6E, 0x14, 0x06, 0x70, 0xE6, 0x0A, 0xC9, 0x9A, 0x4E, 0x37, 0xD9, 0x95, 0x51, 0xCE, 0xBA, 0xA2, 0x14, 0x0C, 0x81, 0x36, 0x1B, 0xB2, 0x5C, 0x30, 0x38, 0xFA, 0x9C, 0xC9, 0x32, 0x41, 0xA7, 0x18, 0x3B, 0xA2, 0x48, 0x04, 0x05, 0x51, 0x4F, 0x91, 0x6D, 0x12, 0x04, 0x20, 0x9B, 0x61, 0x89, 0xFF, 0x1F}; +uint8_t spGOOD[] PROGMEM = {0x0A, 0x28, 0xCD, 0x34, 0x20, 0xD9, 0x1A, 0x45, 0x74, 0xE4, 0x66, 0x24, 0xAD, 0xBA, 0xB1, 0x8C, 0x9B, 0x91, 0xA5, 0x64, 0xE6, 0x98, 0x21, 0x16, 0x0B, 0x96, 0x9B, 0x4C, 0xE5, 0xFF, 0x01}; +uint8_t spMORNING[] PROGMEM = {0xCE, 0x08, 0x52, 0x2A, 0x35, 0x5D, 0x39, 0x53, 0x29, 0x5B, 0xB7, 0x0A, 0x15, 0x0C, 0xEE, 0x2A, 0x42, 0x56, 0x66, 0xD2, 0x55, 0x2E, 0x37, 0x2F, 0xD9, 0x45, 0xB3, 0xD3, 0xC5, 0xCA, 0x6D, 0x27, 0xD5, 0xEE, 0x50, 0xF5, 0x50, 0x94, 0x14, 0x77, 0x2D, 0xD8, 0x5D, 0x49, 0x92, 0xFD, 0xB1, 0x64, 0x2F, 0xA9, 0x49, 0x0C, 0x93, 0x4B, 0xAD, 0x19, 0x17, 0x3E, 0x66, 0x1E, 0xF1, 0xA2, 0x5B, 0x84, 0xE2, 0x29, 0x8F, 0x8B, 0x72, 0x10, 0xB5, 0xB1, 0x2E, 0x4B, 0xD4, 0x45, 0x89, 0x4A, 0xEC, 0x5C, 0x95, 0x14, 0x2B, 0x8A, 0x9C, 0x34, 0x52, 0x5D, 0xBC, 0xCC, 0xB5, 0x3B, 0x49, 0x69, 0x89, 0x87, 0xC1, 0x98, 0x56, 0x3A, 0x21, 0x2B, 0x82, 0x67, 0xCC, 0x5C, 0x85, 0xB5, 0x4A, 0x8A, 0xF6, 0x64, 0xA9, 0x96, 0xC4, 0x69, 0x3C, 0x52, 0x81, 0x58, 0x1C, 0x97, 0xF6, 0x0E, 0x1B, 0xCC, 0x0D, 0x42, 0x32, 0xAA, 0x65, 0x12, 0x67, 0xD4, 0x6A, 0x61, 0x52, 0xFC, 0xFF}; +uint8_t spAFTERNOON[] PROGMEM = {0xC7, 0xCE, 0xCE, 0x3A, 0xCB, 0x58, 0x1F, 0x3B, 0x07, 0x9D, 0x28, 0x71, 0xB4, 0xAC, 0x9C, 0x74, 0x5A, 0x42, 0x55, 0x33, 0xB2, 0x93, 0x0A, 0x09, 0xD4, 0xC5, 0x9A, 0xD6, 0x44, 0x45, 0xE3, 0x38, 0x60, 0x9A, 0x32, 0x05, 0xF4, 0x18, 0x01, 0x09, 0xD8, 0xA9, 0xC2, 0x00, 0x5E, 0xCA, 0x24, 0xD5, 0x5B, 0x9D, 0x4A, 0x95, 0xEA, 0x34, 0xEE, 0x63, 0x92, 0x5C, 0x4D, 0xD0, 0xA4, 0xEE, 0x58, 0x0C, 0xB9, 0x4D, 0xCD, 0x42, 0xA2, 0x3A, 0x24, 0x37, 0x25, 0x8A, 0xA8, 0x8E, 0xA0, 0x53, 0xE4, 0x28, 0x23, 0x26, 0x13, 0x72, 0x91, 0xA2, 0x76, 0xBB, 0x72, 0x38, 0x45, 0x0A, 0x46, 0x63, 0xCA, 0x69, 0x27, 0x39, 0x58, 0xB1, 0x8D, 0x60, 0x1C, 0x34, 0x1B, 0x34, 0xC3, 0x55, 0x8E, 0x73, 0x45, 0x2D, 0x4F, 0x4A, 0x3A, 0x26, 0x10, 0xA1, 0xCA, 0x2D, 0xE9, 0x98, 0x24, 0x0A, 0x1E, 0x6D, 0x97, 0x29, 0xD2, 0xCC, 0x71, 0xA2, 0xDC, 0x86, 0xC8, 0x12, 0xA7, 0x8E, 0x08, 0x85, 0x22, 0x8D, 0x9C, 0x43, 0xA7, 0x12, 0xB2, 0x2E, 0x50, 0x09, 0xEF, 0x51, 0xC5, 0xBA, 0x28, 0x58, 0xAD, 0xDB, 0xE1, 0xFF, 0x03}; +uint8_t spEVENING[] PROGMEM = {0xCD, 0x6D, 0x98, 0x73, 0x47, 0x65, 0x0D, 0x6D, 0x10, 0xB2, 0x5D, 0x93, 0x35, 0x94, 0xC1, 0xD0, 0x76, 0x4D, 0x66, 0x93, 0xA7, 0x04, 0xBD, 0x71, 0xD9, 0x45, 0xAE, 0x92, 0xD5, 0xAC, 0x53, 0x07, 0x6D, 0xA5, 0x76, 0x63, 0x51, 0x92, 0xD4, 0xA1, 0x83, 0xD4, 0xCB, 0xB2, 0x51, 0x88, 0xCD, 0xF5, 0x50, 0x45, 0xCE, 0xA2, 0x2E, 0x27, 0x28, 0x54, 0x15, 0x37, 0x0A, 0xCF, 0x75, 0x61, 0x5D, 0xA2, 0xC4, 0xB5, 0xC7, 0x44, 0x55, 0x8A, 0x0B, 0xA3, 0x6E, 0x17, 0x95, 0x21, 0xA9, 0x0C, 0x37, 0xCD, 0x15, 0xBA, 0xD4, 0x2B, 0x6F, 0xB3, 0x54, 0xE4, 0xD2, 0xC8, 0x64, 0xBC, 0x4C, 0x91, 0x49, 0x12, 0xE7, 0xB2, 0xB1, 0xD0, 0x22, 0x0D, 0x9C, 0xDD, 0xAB, 0x62, 0xA9, 0x38, 0x53, 0x11, 0xA9, 0x74, 0x2C, 0xD2, 0xCA, 0x59, 0x34, 0xA3, 0xE5, 0xFF, 0x03}; +uint8_t spPAUSE1[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F}; + +void sayTime(int hour, int minutes, AudioGeneratorTalkie *talkie) { bool pm = (hour >= 12); uint8_t *spHour[] = { spTWELVE, spONE, spTWO, spTHREE, spFOUR, spFIVE, spSIX, - spSEVEN, spEIGHT, spNINE, spTEN, spELEVEN }; + spSEVEN, spEIGHT, spNINE, spTEN, spELEVEN + }; size_t spHourLen[] = { sizeof(spTWELVE), sizeof(spONE), sizeof(spTWO), sizeof(spTHREE), sizeof(spFOUR), sizeof(spFIVE), sizeof(spSIX), sizeof(spSEVEN), sizeof(spEIGHT), - sizeof(spNINE), sizeof(spTEN), sizeof(spELEVEN) }; + sizeof(spNINE), sizeof(spTEN), sizeof(spELEVEN) + }; uint8_t *spMinDec[] = { spOH, spTEN, spTWENTY, spTHIRTY, spFOURTY, spFIFTY }; size_t spMinDecLen[] = { sizeof(spOH), sizeof(spTEN), sizeof(spTWENTY), - sizeof(spTHIRTY), sizeof(spFOURTY), sizeof(spFIFTY) }; + sizeof(spTHIRTY), sizeof(spFOURTY), sizeof(spFIFTY) + }; uint8_t *spMinSpecial[] = { spELEVEN, spTWELVE, spTHIRTEEN, spFOURTEEN, spFIFTEEN, spSIXTEEN, spSEVENTEEN, spEIGHTEEN, - spNINETEEN }; + spNINETEEN + }; size_t spMinSpecialLen[] = { sizeof(spELEVEN), sizeof(spTWELVE), sizeof(spTHIRTEEN), sizeof(spFOURTEEN), sizeof(spFIFTEEN), sizeof(spSIXTEEN), sizeof(spSEVENTEEN), sizeof(spEIGHTEEN), - sizeof(spNINETEEN) }; + sizeof(spNINETEEN) + }; uint8_t *spMinLow[] = { spONE, spTWO, spTHREE, spFOUR, spFIVE, spSIX, - spSEVEN, spEIGHT, spNINE }; + spSEVEN, spEIGHT, spNINE + }; size_t spMinLowLen[] = { sizeof(spONE), sizeof(spTWO), sizeof(spTHREE), sizeof(spFOUR), sizeof(spFIVE), sizeof(spSIX), - sizeof(spSEVEN), sizeof(spEIGHT), sizeof(spNINE) }; + sizeof(spSEVEN), sizeof(spEIGHT), sizeof(spNINE) + }; talkie->say(spTHE, sizeof(spTHE)); talkie->say(spTIME, sizeof(spTIME)); @@ -87,10 +100,10 @@ void sayTime(int hour, int minutes, AudioGeneratorTalkie *talkie) hour = hour % 12; talkie->say(spHour[hour], spHourLen[hour]); - if (minutes==0) { + if (minutes == 0) { talkie->say(spOCLOCK, sizeof(spOCLOCK)); - } else if (minutes<=10 || minutes >=20) { - talkie->say(spMinDec[minutes / 10], spMinDecLen[minutes /10]); + } else if (minutes <= 10 || minutes >= 20) { + talkie->say(spMinDec[minutes / 10], spMinDecLen[minutes / 10]); if (minutes % 10) { talkie->say(spMinLow[(minutes % 10) - 1], spMinLowLen[(minutes % 10) - 1]); } @@ -109,7 +122,7 @@ AudioGeneratorTalkie *talkie; AudioOutputI2S *out; -bool getLocalTime(struct tm * info, uint32_t ms) { +bool GetLocalTime(struct tm * info, uint32_t ms) { uint32_t count = ms / 10; time_t now; @@ -131,8 +144,7 @@ bool getLocalTime(struct tm * info, uint32_t ms) { return false; } -void setup() -{ +void setup() { Serial.begin(115200); delay(1000); // We start by connecting to a WiFi network @@ -151,26 +163,34 @@ void setup() Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println("Contacting Time Server"); +#if defined(ARDUINO_ARCH_RP2040) + NTP.begin("pool.ntp.org", "time.nist.gov"); + Serial.print("Waiting for NTP time sync: "); + NTP.waitSet([]() { + Serial.print("."); + }); + Serial.println(""); +#else configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); +#endif struct tm tmstruct ; do { tmstruct.tm_year = 0; Serial.printf("."); - getLocalTime(&tmstruct, 5000); + GetLocalTime(&tmstruct, 5000); delay(100); } while (tmstruct.tm_year < 100); - + audioLogger = &Serial; out = new AudioOutputI2S(); talkie = new AudioGeneratorTalkie(); talkie->begin(nullptr, out); } -void loop() -{ +void loop() { struct tm tmstruct ; tmstruct.tm_year = 0; - getLocalTime(&tmstruct, 5000); + GetLocalTime(&tmstruct, 5000); Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n", tmstruct.tm_year + 1900, tmstruct.tm_mon + 1, tmstruct.tm_mday, tmstruct.tm_hour, diff --git a/examples/WebRadio/WebRadio.ino b/examples/WebRadio/WebRadio.ino index e8a03261..538f1efe 100644 --- a/examples/WebRadio/WebRadio.ino +++ b/examples/WebRadio/WebRadio.ino @@ -1,7 +1,7 @@ /* WebRadio Example Very simple HTML app to control web streaming - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -19,16 +19,29 @@ */ #include -#ifdef ESP32 - #include + +// ESP8266 server.available() is now server.accept() +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + +#ifdef ESP8266 +#include #else - #include +#include #endif + #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioGeneratorAAC.h" +#if defined(ARDUINO_ARCH_RP2040) +#include "AudioOutputPWM.h" +#define MOBO rp2040 +AudioOutputPWM *out = NULL; +#else #include "AudioOutputI2S.h" +AudioOutputI2S *out = NULL; +#define MOBO ESP +#endif #include // Custom web server that doesn't need much RAM @@ -50,7 +63,6 @@ WiFiServer server(80); AudioGenerator *decoder = NULL; AudioFileSourceICYStream *file = NULL; AudioFileSourceBuffer *buff = NULL; -AudioOutputI2S *out = NULL; int volume = 100; char title[64]; @@ -113,48 +125,44 @@ Change URL:
)KEWL"; -void HandleIndex(WiFiClient *client) -{ - char buff[sizeof(BODY) + sizeof(title) + sizeof(status) + sizeof(url) + 3*2]; - - Serial.printf_P(PSTR("Sending INDEX...Free mem=%d\n"), ESP.getFreeHeap()); +void HandleIndex(WiFiClient *client) { + char buff[std::max(sizeof(BODY) + sizeof(title) + sizeof(status) + sizeof(url) + 3 * 2, sizeof(HEAD))]; + + Serial.printf_P(PSTR("Sending INDEX...Free mem=%d\n"), MOBO.getFreeHeap()); WebHeaders(client, NULL); WebPrintf(client, DOCTYPE); - client->write_P( PSTR(""), 6 ); - client->write_P( HEAD, strlen_P(HEAD) ); + client->write("", 6); + strcpy_P(buff, HEAD); + client->write(buff, strlen(buff)); sprintf_P(buff, BODY, title, volume, volume, status, url); - client->write(buff, strlen(buff) ); - client->write_P( PSTR(""), 7 ); - Serial.printf_P(PSTR("Sent INDEX...Free mem=%d\n"), ESP.getFreeHeap()); + client->write(buff, strlen(buff)); + client->write("", 7); + Serial.printf_P(PSTR("Sent INDEX...Free mem=%d\n"), MOBO.getFreeHeap()); } -void HandleStatus(WiFiClient *client) -{ +void HandleStatus(WiFiClient *client) { WebHeaders(client, NULL); client->write(status, strlen(status)); } -void HandleTitle(WiFiClient *client) -{ +void HandleTitle(WiFiClient *client) { WebHeaders(client, NULL); client->write(title, strlen(title)); } -void HandleVolume(WiFiClient *client, char *params) -{ +void HandleVolume(WiFiClient *client, char *params) { char *namePtr; char *valPtr; - + while (ParseParam(¶ms, &namePtr, &valPtr)) { ParamInt("vol", volume); } Serial.printf_P(PSTR("Set volume: %d\n"), volume); - out->SetGain(((float)volume)/100.0); + out->SetGain(((float)volume) / 100.0); RedirectToIndex(client); } -void HandleChangeURL(WiFiClient *client, char *params) -{ +void HandleChangeURL(WiFiClient *client, char *params) { char *namePtr; char *valPtr; char newURL[sizeof(url)]; @@ -168,8 +176,8 @@ void HandleChangeURL(WiFiClient *client, char *params) } if (newURL[0] && newType[0]) { newUrl = true; - strncpy(url, newURL, sizeof(url)-1); - url[sizeof(url)-1] = 0; + strncpy(url, newURL, sizeof(url) - 1); + url[sizeof(url) - 1] = 0; if (!strcmp_P(newType, PSTR("aac"))) { isAAC = true; } else { @@ -183,13 +191,11 @@ void HandleChangeURL(WiFiClient *client, char *params) } } -void RedirectToIndex(WiFiClient *client) -{ +void RedirectToIndex(WiFiClient *client) { WebError(client, 301, PSTR("Location: /\r\n"), true); } -void StopPlaying() -{ +void StopPlaying() { if (decoder) { decoder->stop(); delete decoder; @@ -209,64 +215,65 @@ void StopPlaying() strcpy_P(title, PSTR("Stopped")); } -void HandleStop(WiFiClient *client) -{ +void HandleStop(WiFiClient *client) { Serial.printf_P(PSTR("HandleStop()\n")); StopPlaying(); RedirectToIndex(client); } -void MDCallback(void *cbData, const char *type, bool isUnicode, const char *str) -{ +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *str) { const char *ptr = reinterpret_cast(cbData); (void) isUnicode; // Punt this ball for now (void) ptr; - if (strstr_P(type, PSTR("Title"))) { + if (strstr_P(type, PSTR("Title"))) { strncpy(title, str, sizeof(title)); - title[sizeof(title)-1] = 0; + title[sizeof(title) - 1] = 0; } else { // Who knows what to do? Not me! } } -void StatusCallback(void *cbData, int code, const char *string) -{ +void StatusCallback(void *cbData, int code, const char *string) { const char *ptr = reinterpret_cast(cbData); (void) code; (void) ptr; - strncpy_P(status, string, sizeof(status)-1); - status[sizeof(status)-1] = 0; + strncpy_P(status, string, sizeof(status) - 1); + status[sizeof(status) - 1] = 0; } #ifdef ESP8266 -const int preallocateBufferSize = 5*1024; +const int preallocateBufferSize = 5 * 1024; const int preallocateCodecSize = 29192; // MP3 codec max mem needed #else -const int preallocateBufferSize = 16*1024; +const int preallocateBufferSize = 16 * 1024; const int preallocateCodecSize = 85332; // AAC+SBR codec max mem needed #endif void *preallocateBuffer = NULL; void *preallocateCodec = NULL; -void setup() -{ +void setup() { // First, preallocate all the memory needed for the buffering and codecs, never to be freed preallocateBuffer = malloc(preallocateBufferSize); preallocateCodec = malloc(preallocateCodecSize); if (!preallocateBuffer || !preallocateCodec) { Serial.begin(115200); - Serial.printf_P(PSTR("FATAL ERROR: Unable to preallocate %d bytes for app\n"), preallocateBufferSize+preallocateCodecSize); - while (1) delay(1000); // Infinite halt + Serial.printf_P(PSTR("FATAL ERROR: Unable to preallocate %d bytes for app\n"), preallocateBufferSize + preallocateCodecSize); + while (1) { + delay(1000); // Infinite halt + } } Serial.begin(115200); - delay(1000); + delay(3000); +#ifndef ESP8266 + Serial.printf_P(PSTR("Consider using BackgroundAudio instead, it is much faster and stable.\nhttps://github.com/earlephilhower/BackgroundAudio\n")); +#endif Serial.printf_P(PSTR("Connecting to WiFi\n")); WiFi.disconnect(); WiFi.softAPdisconnect(true); WiFi.mode(WIFI_STA); - + WiFi.begin(ssid, password); // Try forever @@ -275,13 +282,13 @@ void setup() delay(1000); } Serial.printf_P(PSTR("Connected\n")); - + Serial.printf_P(PSTR("Go to http://")); Serial.print(WiFi.localIP()); Serial.printf_P(PSTR("/ to control the web radio.\n")); server.begin(); - + strcpy_P(url, PSTR("none")); strcpy_P(status, PSTR("OK")); strcpy_P(title, PSTR("Idle")); @@ -289,24 +296,27 @@ void setup() audioLogger = &Serial; file = NULL; buff = NULL; +#if defined(ARDUINO_ARCH_RP2040) + out = new AudioOutputPWM(44100, 0); +#else out = new AudioOutputI2S(); +#endif decoder = NULL; LoadSettings(); } -void StartNewURL() -{ +void StartNewURL() { Serial.printf_P(PSTR("Changing URL to: %s, vol=%d\n"), url, volume); newUrl = false; // Stop and free existing ones - Serial.printf_P(PSTR("Before stop...Free mem=%d\n"), ESP.getFreeHeap()); + Serial.printf_P(PSTR("Before stop...Free mem=%d\n"), MOBO.getFreeHeap()); StopPlaying(); - Serial.printf_P(PSTR("After stop...Free mem=%d\n"), ESP.getFreeHeap()); + Serial.printf_P(PSTR("After stop...Free mem=%d\n"), MOBO.getFreeHeap()); SaveSettings(); Serial.printf_P(PSTR("Saved settings\n")); - + file = new AudioFileSourceICYStream(url); Serial.printf_P(PSTR("created icystream\n")); file->RegisterMetadataCB(MDCallback, NULL); @@ -318,7 +328,7 @@ void StartNewURL() decoder->RegisterStatusCB(StatusCallback, NULL); Serial.printf_P("Decoder start...\n"); decoder->begin(buff, out); - out->SetGain(((float)volume)/100.0); + out->SetGain(((float)volume) / 100.0); if (!decoder->isRunning()) { Serial.printf_P(PSTR("Can't connect to URL")); StopPlaying(); @@ -328,31 +338,31 @@ void StartNewURL() Serial.printf_P("Done start new URL\n"); } -void LoadSettings() -{ +void LoadSettings() { // Restore from EEPROM, check the checksum matches Settings s; uint8_t *ptr = reinterpret_cast(&s); EEPROM.begin(sizeof(s)); - for (size_t i=0; i(&s); EEPROM.begin(sizeof(s)); - for (size_t i=0; iisRunning()) { strcpy_P(status, PSTR("Playing")); // By default we're OK unless the decoder says otherwise if (!decoder->loop()) { @@ -381,29 +392,28 @@ void PumpDecoder() StopPlaying(); retryms = millis() + 2000; } -} + } } -void loop() -{ +void loop() { static int lastms = 0; - if (millis()-lastms > 1000) { + if (millis() - lastms > 1000) { lastms = millis(); - Serial.printf_P(PSTR("Running for %d seconds%c...Free mem=%d\n"), lastms/1000, !decoder?' ':(decoder->isRunning()?'*':' '), ESP.getFreeHeap()); + Serial.printf_P(PSTR("Running for %d seconds%c...Free mem=%d\n"), lastms / 1000, !decoder ? ' ' : (decoder->isRunning() ? '*' : ' '), MOBO.getFreeHeap()); } - if (retryms && millis()-retryms>0) { + if (retryms && millis() - retryms > 0) { retryms = 0; newUrl = true; } - + if (newUrl) { StartNewURL(); } PumpDecoder(); - + char *reqUrl; char *params; WiFiClient client = server.available(); @@ -438,4 +448,3 @@ void loop() client.stop(); } } - diff --git a/examples/WebRadio/web.cpp b/examples/WebRadio/web.cpp index 75e68739..509ffda6 100644 --- a/examples/WebRadio/web.cpp +++ b/examples/WebRadio/web.cpp @@ -19,10 +19,10 @@ */ #include -#ifdef ESP32 - #include +#ifdef ESP8266 +#include #else - #include +#include #endif #include "web.h" @@ -308,7 +308,3 @@ void Read4Int(char *str, byte *p) str += ParseInt(str, &i); p[2] = i; if (*str) str++; str += ParseInt(str, &i); p[3] = i; } - - - - diff --git a/images/PWM.audio.amplifier.with.only.1.transistor.power.0.when.RX.signal.is.idle.high.pdf b/images/PWM.audio.amplifier.with.only.1.transistor.power.0.when.RX.signal.is.idle.high.pdf new file mode 100644 index 00000000..7923d4cb Binary files /dev/null and b/images/PWM.audio.amplifier.with.only.1.transistor.power.0.when.RX.signal.is.idle.high.pdf differ diff --git a/images/lpf.png b/images/lpf.png new file mode 100644 index 00000000..30023feb Binary files /dev/null and b/images/lpf.png differ diff --git a/keywords.txt b/keywords.txt index 4cbfb9d8..a718a06d 100644 --- a/keywords.txt +++ b/keywords.txt @@ -15,12 +15,15 @@ AudioGeneratorFLAC KEYWORD1 AudioGeneratorMOD KEYWORD1 AudioGeneratorMIDI KEYWORD1 AudioGeneratorMP3 KEYWORD1 +AudioGeneratorOpus KEYWORD1 AudioGeneratorRTTTL KEYWORD1 AudioGeneratorTalkie KEYWORD1 AudioGeneratorWAV KEYWORD1 AudioOutput KEYWORD1 AudioOutputI2S KEYWORD1 AudioOutputI2SNoDAC KEYWORD1 +AudioOutputI2SClass KEYWORD1 +AudioOutputPWM KEYWORD1 AudioOutputNull KEYWORD1 AudioOutputBuffer KEYWORD1 AudioOutputSerialWAV KEYWORD1 diff --git a/lib/TinySoundFont b/lib/TinySoundFont new file mode 160000 index 00000000..ae904319 --- /dev/null +++ b/lib/TinySoundFont @@ -0,0 +1 @@ +Subproject commit ae904319bc61213cad5bcc331a3abe93d59136f5 diff --git a/lib/install-opus.sh b/lib/install-opus.sh new file mode 100755 index 00000000..23ea8313 --- /dev/null +++ b/lib/install-opus.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +rm -rf libopus +mkdir libopus libopus/include libopus/src libopus/celt libopus/silk libopus/silk/fixed +cp opus/include/*.h libopus/include/. +cp opus.config.h libopus/include/config.h + +celt="arch.h bands.c bands.h celt.c celt_decoder.c celt.h celt_lpc.c celt_lpc.h cpu_support.h cwrs.c cwrs.h ecintrin.h entcode.c entcode.h entdec.c entdec.h entenc.c entenc.h fixed_debug.h fixed_generic.h float_cast.h kiss_fft.c _kiss_fft_guts.h kiss_fft.h laplace.c laplace.h mathops.c mathops.h mdct.c mdct.h mfrngcod.h modes.c modes.h os_support.h pitch.c pitch.h quant_bands.c quant_bands.h rate.c rate.h stack_alloc.h static_modes_fixed.h static_modes_float.h vq.c vq.h" +cd opus/celt +for i in $celt; do + cp -i $i ../../libopus/celt/. +done +incs="config.h opus_custom.h opus_defines.h opus.h opus_multistream.h opus_projection.h opus_types.h" +for i in $incs; do + echo '#include "../include/'$i'"' > ../../libopus/celt/$i +done +sed -i s/HAVE_CONFIG_H/__STDC__/g ../../libopus/celt/*.[ch] + +cd ../silk +silk="A2NLSF.c ana_filt_bank_1.c API.h biquad_alt.c bwexpander_32.c bwexpander.c check_control_input.c CNG.c code_signs.c control_audio_bandwidth.c control_codec.c control.h control_SNR.c debug.c debug.h dec_API.c decode_core.c decode_frame.c decode_indices.c decode_parameters.c decode_pitch.c decode_pulses.c decoder_set_fs.c define.h encode_indices.c encode_pulses.c errors.h gain_quant.c HP_variable_cutoff.c init_decoder.c Inlines.h inner_prod_aligned.c interpolate.c lin2log.c log2lin.c LPC_analysis_filter.c LPC_fit.c LPC_inv_pred_gain.c LP_variable_cutoff.c MacroCount.h MacroDebug.h macros.h main.h NLSF2A.c NLSF_decode.c NLSF_del_dec_quant.c NLSF_encode.c NLSF_stabilize.c NLSF_unpack.c NLSF_VQ.c NLSF_VQ_weights_laroia.c NSQ.h pitch_est_defines.h pitch_est_tables.c PLC.c PLC.h process_NLSFs.c quant_LTP_gains.c resampler.c resampler_down2_3.c resampler_down2.c resampler_private_AR2.c resampler_private_down_FIR.c resampler_private.h resampler_private_IIR_FIR.c resampler_private_up2_HQ.c resampler_rom.c resampler_rom.h resampler_structs.h shell_coder.c sigm_Q15.c SigProc_FIX.h sort.c stereo_decode_pred.c stereo_encode_pred.c stereo_find_predictor.c stereo_LR_to_MS.c stereo_MS_to_LR.c stereo_quant_pred.c structs.h sum_sqr_shift.c table_LSF_cos.c tables_gain.c tables.h tables_LTP.c tables_NLSF_CB_NB_MB.c tables_NLSF_CB_WB.c tables_other.c tables_pitch_lag.c tables_pulses_per_block.c tuning_parameters.h typedef.h VQ_WMat_EC.c" +for i in $silk; do + cp -i $i ../../libopus/silk/. +done +for i in $incs; do + echo '#include "../include/'$i'"' > ../../libopus/silk/$i +done +silkcelt="arch.h celt_lpc.h cpu_support.h ecintrin.h entdec.h entenc.h os_support.h stack_alloc.h" +for i in $silkcelt; do + echo '#include "../celt/'$i'"' > ../../libopus/silk/$i +done +silkfix="main_FIX.h structs_FIX.h" +for i in $silkfix; do + echo '#include "fixed/'$i'"' > ../../libopus/silk/$i +done +sed -i s/HAVE_CONFIG_H/__STDC__/g ../../libopus/silk/*.[ch] + +cd fixed +fixed="apply_sine_window_FIX.c autocorr_FIX.c burg_modified_FIX.c corrMatrix_FIX.c find_LPC_FIX.c find_LTP_FIX.c find_pred_coefs_FIX.c k2a_FIX.c k2a_Q16_FIX.c LTP_analysis_filter_FIX.c LTP_scale_ctrl_FIX.c main_FIX.h process_gains_FIX.c regularize_correlations_FIX.c residual_energy16_FIX.c residual_energy_FIX.c schur64_FIX.c schur_FIX.c structs_FIX.h vector_ops_FIX.c warped_autocorrelation_FIX.c" +for i in $fixed; do + cp -i $i ../../../libopus/silk/fixed/$i +done +incs="config.h" +for i in $incs; do + echo '#include "../../include/'$i'"' > ../../../libopus/silk/fixed/$i +done +fixedcelt="celt_lpc.h entdec.h entenc.h pitch.h stack_alloc.h" +for i in $fixedcelt; do + echo '#include "../../celt/'$i'"' > ../../../libopus/silk/fixed/$i +done +fixedsilk="control.h debug.h define.h main.h pitch_est_defines.h PLC.h SigProc_FIX.h structs.h tuning_parameters.h typedef.h" +for i in $fixedsilk; do + echo '#include "../'$i'"' > ../../../libopus/silk/fixed/$i +done +sed -i s/HAVE_CONFIG_H/__STDC__/g ../../../libopus/silk/fixed/*.[ch] + +cd ../../src +src="opus.c opus_decoder.c opus_private.h" +for i in $src; do + cp -i $i ../../libopus/src/$i +done +incs="config.h opus_custom.h opus_defines.h opus.h opus_multistream.h opus_projection.h opus_types.h" +for i in $incs; do + echo '#include "../include/'$i'"' > ../../libopus/src/$i +done +srccelt="arch.h celt.h cpu_support.h entdec.h float_cast.h mathops.h modes.h os_support.h stack_alloc.h" +for i in $srccelt; do + echo '#include "../celt/'$i'"' > ../../libopus/src/$i +done +srcsilk="API.h define.h structs.h" +for i in $srcsilk; do + echo '#include "../silk/'$i'"' > ../../libopus/src/$i +done +sed -i s/HAVE_CONFIG_H/__STDC__/g ../../libopus/src/*.[ch] + +cd ../ +root="AUTHORS COPYING LICENSE_PLEASE_READ.txt README" +for i in $root; do + cp -i $i ../libopus/. +done + +cd .. +rm -r ../src/libopus +mv libopus ../src/libopus diff --git a/lib/install-tsf.sh b/lib/install-tsf.sh new file mode 100755 index 00000000..3c68d9b7 --- /dev/null +++ b/lib/install-tsf.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +rm -rf libtinysoundfont +mkdir libtinysoundfont +cp TinySoundFont/tsf.h TinySoundFont/README* TinySoundFont/LICENSE TinySoundFont/fast*.h TinySoundFont/cast.h libtinysoundfont/. +cd TinySoundFont/examples +bash build-linux-gcc.sh +cd ../.. +./TinySoundFont/examples/dump-linux-x86_64 midi-sources/1mgm.sf2 libtinysoundfont/1mgm.h +./TinySoundFont/examples/dump-linux-x86_64 midi-sources/Scratch2010.sf2 libtinysoundfont/scratch2010.h +for i in venture furelise jm_mozdi; do + xxd -i midi-sources/$i.mid | sed '$ d' | sed 's/unsigned.*/const unsigned char _mid[] PROGMEM = {/' > ../examples/PlayMIDIFromROM/"$i"_mid.h +done +rm -r ../src/libtinysoundfont +mv libtinysoundfont ../src/. diff --git a/examples/PlayMIDIFromLittleFS/data/1mgm.sf2 b/lib/midi-sources/1mgm.sf2 similarity index 100% rename from examples/PlayMIDIFromLittleFS/data/1mgm.sf2 rename to lib/midi-sources/1mgm.sf2 diff --git a/lib/midi-sources/Scratch2010.sf2 b/lib/midi-sources/Scratch2010.sf2 new file mode 100644 index 00000000..c6602632 Binary files /dev/null and b/lib/midi-sources/Scratch2010.sf2 differ diff --git a/examples/PlayMIDIFromLittleFS/data/furelise.mid b/lib/midi-sources/furelise.mid similarity index 100% rename from examples/PlayMIDIFromLittleFS/data/furelise.mid rename to lib/midi-sources/furelise.mid diff --git a/lib/midi-sources/jm_mozdi.mid b/lib/midi-sources/jm_mozdi.mid new file mode 100644 index 00000000..ff9aa5d9 Binary files /dev/null and b/lib/midi-sources/jm_mozdi.mid differ diff --git a/lib/midi-sources/venture.mid b/lib/midi-sources/venture.mid new file mode 100644 index 00000000..e63e2853 Binary files /dev/null and b/lib/midi-sources/venture.mid differ diff --git a/lib/opus b/lib/opus new file mode 160000 index 00000000..ab4e8359 --- /dev/null +++ b/lib/opus @@ -0,0 +1 @@ +Subproject commit ab4e83598e7fc8b2ce82dc633a0fc0c452b629aa diff --git a/lib/opus.config.h b/lib/opus.config.h new file mode 100644 index 00000000..636dca03 --- /dev/null +++ b/lib/opus.config.h @@ -0,0 +1,247 @@ + +// CFLAGS="-m32 -g -O2 -fstack-usage -Wstack-usage=512" CPPFLAGS="-m32 -g -O2 -fstack-usage -Wstack-usage=512" ./configure --prefix=/tmp/opus --disable-float-api --enable-fixed-point --disable-hardening --disable-asm --disable-intrinsics + +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Get CPU Info by asm method */ +/* #undef CPU_INFO_BY_ASM */ + +/* Get CPU Info by c method */ +/* #undef CPU_INFO_BY_C */ + +/* Custom modes */ +/* #undef CUSTOM_MODES */ + +/* Disable DNN debug float */ +#define DISABLE_DEBUG_FLOAT 1 + +/* Disable dot product instructions */ +/* #undef DISABLE_DOT_PROD */ + +/* Do not build the float API */ +#define DISABLE_FLOAT_API 1 + +/* Disable bitstream fixes from RFC 8251 */ +/* #undef DISABLE_UPDATE_DRAFT */ + +/* Assertions */ +/* #undef ENABLE_ASSERTIONS */ + +/* Deep PLC */ +/* #undef ENABLE_DEEP_PLC */ + +/* DRED */ +/* #undef ENABLE_DRED */ + +/* Hardening */ +/* #undef ENABLE_HARDENING */ + +/* LOSSGEN */ +/* #undef ENABLE_LOSSGEN */ + +/* Enable Opus Speech Coding Enhancement */ +/* #undef ENABLE_OSCE */ + +/* Enable dumping of OSCE training data */ +/* #undef ENABLE_OSCE_TRAINING_DATA */ + +/* Debug fixed-point implementation */ +/* #undef FIXED_DEBUG */ + +/* Compile as fixed-point (for machines without a fast enough FPU) */ +#define FIXED_POINT 1 + +/* Float approximations */ +#define FLOAT_APPROX 1 + +/* Fuzzing */ +/* #undef FUZZING */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ALLOCA_H */ + + +/* NE10 library is installed on host. Make sure it is on target! */ +/* #undef HAVE_ARM_NE10 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `lrint' function. */ +#define HAVE_LRINT 1 + +/* Define to 1 if you have the `lrintf' function. */ +#define HAVE_LRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `__malloc_hook' function. */ +/* #undef HAVE___MALLOC_HOOK */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Make use of ARM asm optimization */ +/* #undef OPUS_ARM_ASM */ + +/* Use generic ARMv4 inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_ASM */ + +/* Use ARMv5E inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_EDSP */ + +/* Use ARMv6 inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_MEDIA */ + +/* Use ARM NEON inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_NEON */ + +/* Compiler supports Aarch64 DOTPROD Intrinsics */ +/* #undef OPUS_ARM_MAY_HAVE_DOTPROD */ + +/* Define if assembler supports EDSP instructions */ +/* #undef OPUS_ARM_MAY_HAVE_EDSP */ + +/* Define if assembler supports ARMv6 media instructions */ +/* #undef OPUS_ARM_MAY_HAVE_MEDIA */ + +/* Define if compiler supports NEON instructions */ +/* #undef OPUS_ARM_MAY_HAVE_NEON */ + +/* Compiler supports ARMv7/Aarch64 Neon Intrinsics */ +/* #undef OPUS_ARM_MAY_HAVE_NEON_INTR */ + +/* Define if binary requires Aarch64 Neon Intrinsics */ +/* #undef OPUS_ARM_PRESUME_AARCH64_NEON_INTR */ + +/* Define if binary requires Aarch64 dotprod Intrinsics */ +/* #undef OPUS_ARM_PRESUME_DOTPROD */ + +/* Define if binary requires EDSP instruction support */ +/* #undef OPUS_ARM_PRESUME_EDSP */ + +/* Define if binary requires ARMv6 media instruction support */ +/* #undef OPUS_ARM_PRESUME_MEDIA */ + +/* Define if binary requires NEON instruction support */ +/* #undef OPUS_ARM_PRESUME_NEON */ + +/* Define if binary requires NEON intrinsics support */ +/* #undef OPUS_ARM_PRESUME_NEON_INTR */ + +/* This is a build of OPUS */ +#define OPUS_BUILD /**/ + +/* Run bit-exactness checks between optimized and c implementations */ +/* #undef OPUS_CHECK_ASM */ + +/* Use run-time CPU capabilities detection */ +/* #undef OPUS_HAVE_RTCD */ + +/* Compiler supports X86 AVX2 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_AVX2 */ + +/* Compiler supports X86 SSE Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE */ + +/* Compiler supports X86 SSE2 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE2 */ + +/* Compiler supports X86 SSE4.1 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE4_1 */ + +/* Define if binary requires AVX2 intrinsics support */ +/* #undef OPUS_X86_PRESUME_AVX2 */ + +/* Define if binary requires SSE intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE */ + +/* Define if binary requires SSE2 intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE2 */ + +/* Define if binary requires SSE4.1 intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE4_1 */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "opus@xiph.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "opus" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "opus 1.5.2" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "opus" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.5.2" + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#define STDC_HEADERS 1 + +/* Make use of alloca */ +#undef USE_ALLOCA + +/* Use C99 variable-size arrays */ +#define VAR_ARRAYS 1 + +// Enable heap-based stack on Pico. ESP32 should use larger task stack in the sketch +#ifdef ARDUINO_ARCH_RP2040 +#undef VAR_ARRAYS +#define NONTHREADSAFE_PSEUDOSTACK 1 +#endif + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#define restrict __restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif diff --git a/library.json b/library.json index 91948fb8..b722cdf4 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "ESP8266Audio", - "description": "Audio file format and I2S DAC library", + "description": "Audio file format and I2S DAC library for ESP8266, ESP32, and Raspberry Pi Pico RP2040", "keywords": "ESP8266, ESP32, MP3, AAC, WAV, MOD, FLAC, RTTTL, MIDI, I2S, DAC, Delta-Sigma, TTS", "authors": [ { @@ -12,15 +12,15 @@ ], "repository": { "type": "git", - "url": "https://github.com/earlephilhower/ESP8266Audio" + "url": "https://github.com/earlephilhower/ESP8266Audio" }, - "version": "1.4", + "version": "2.4.1", "homepage": "https://github.com/earlephilhower/ESP8266Audio", - "dependencies": { - "SPI": "1.0" - }, "frameworks": "Arduino", "examples": [ "examples/*/*.ino" - ] -} + ], + "build": { + "libLDFMode": "deep" + } +} \ No newline at end of file diff --git a/library.properties b/library.properties index 05109ff6..b0466ee6 100644 --- a/library.properties +++ b/library.properties @@ -1,10 +1,9 @@ name=ESP8266Audio -version=1.4 +version=2.4.1 author=Earle F. Philhower, III maintainer=Earle F. Philhower, III -sentence=Audio file and I2S sound playing routines. -paragraph=Decode compressed MP3, AAC, FLAC, Screamtracker MOD, MIDI, RTTL, and WAV and play on an I2S DAC or a software-driven delta-sigma DAC and 1-transistor amplifier. +sentence=Audio file and I2S sound playing routines for ESP8266, ESP32, and Raspberry Pi Pico RP2040 +paragraph=Decode compressed MP3, AAC, FLAC, Screamtracker MOD, MIDI, RTTL, TI Talkie, and WAV and play on an I2S DAC or a software-driven delta-sigma DAC and 1-transistor amplifier. category=Signal Input/Output url=https://github.com/earlephilhower/ESP8266Audio -architectures=esp8266,esp32 - +architectures=esp8266,esp32,rp2040 diff --git a/src/AudioFileSource.h b/src/AudioFileSource.h index ea746ef2..f67b2738 100644 --- a/src/AudioFileSource.h +++ b/src/AudioFileSource.h @@ -1,21 +1,21 @@ /* - AudioFileSource - Base class of an input "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSource + Base class of an input "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCE_H @@ -24,28 +24,53 @@ #include #include "AudioStatus.h" -class AudioFileSource -{ - public: +class AudioFileSource { +public: AudioFileSource() {}; virtual ~AudioFileSource() {}; - virtual bool open(const char *filename) { (void)filename; return false; }; - virtual uint32_t read(void *data, uint32_t len) { (void)data; (void)len; return 0; }; - virtual uint32_t readNonBlock(void *data, uint32_t len) { return read(data, len); }; - virtual bool seek(int32_t pos, int dir) { (void)pos; (void)dir; return false; }; - virtual bool close() { return false; }; - virtual bool isOpen() { return false; }; - virtual uint32_t getSize() { return 0; }; - virtual uint32_t getPos() { return 0; }; - virtual bool loop() { return true; }; - - public: - virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { return cb.RegisterMetadataCB(fn, data); } - virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { return cb.RegisterStatusCB(fn, data); } - - protected: + virtual bool open(const char *filename) { + (void)filename; + return false; + }; + virtual uint32_t read(void *data, uint32_t len) { + (void)data; + (void)len; + return 0; + }; + virtual uint32_t readNonBlock(void *data, uint32_t len) { + return read(data, len); + }; + virtual bool seek(int32_t pos, int dir) { + (void)pos; + (void)dir; + return false; + }; + virtual bool close() { + return false; + }; + virtual bool isOpen() { + return false; + }; + virtual uint32_t getSize() { + return 0; + }; + virtual uint32_t getPos() { + return 0; + }; + virtual bool loop() { + return true; + }; + +public: + virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { + return cb.RegisterMetadataCB(fn, data); + } + virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { + return cb.RegisterStatusCB(fn, data); + } + +protected: AudioStatus cb; }; #endif - diff --git a/src/AudioFileSourceBuffer.cpp b/src/AudioFileSourceBuffer.cpp index 475f4f9f..5eb6790c 100644 --- a/src/AudioFileSourceBuffer.cpp +++ b/src/AudioFileSourceBuffer.cpp @@ -1,21 +1,21 @@ /* - AudioFileSourceBuffer - Double-buffered file source using system RAM - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceBuffer + Double-buffered file source using system RAM + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include @@ -23,168 +23,172 @@ #pragma GCC optimize ("O3") -AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, uint32_t buffSizeBytes) -{ - buffSize = buffSizeBytes; - buffer = (uint8_t*)malloc(sizeof(uint8_t) * buffSize); - if (!buffer) audioLogger->printf_P(PSTR("Unable to allocate AudioFileSourceBuffer::buffer[]\n")); - deallocateBuffer = true; - writePtr = 0; - readPtr = 0; - src = source; - length = 0; - filled = false; +AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, uint32_t buffSizeBytes) { + buffSize = buffSizeBytes; + buffer = (uint8_t*)malloc(sizeof(uint8_t) * buffSize); + if (!buffer) { + audioLogger->printf_P(PSTR("Unable to allocate AudioFileSourceBuffer::buffer[]\n")); + } + deallocateBuffer = true; + writePtr = 0; + readPtr = 0; + src = source; + length = 0; + filled = false; } -AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, void *inBuff, uint32_t buffSizeBytes) -{ - buffSize = buffSizeBytes; - buffer = (uint8_t*)inBuff; - deallocateBuffer = false; - writePtr = 0; - readPtr = 0; - src = source; - length = 0; - filled = false; +AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, void *inBuff, uint32_t buffSizeBytes) { + buffSize = buffSizeBytes; + buffer = (uint8_t*)inBuff; + deallocateBuffer = false; + writePtr = 0; + readPtr = 0; + src = source; + length = 0; + filled = false; } -AudioFileSourceBuffer::~AudioFileSourceBuffer() -{ - if (deallocateBuffer) free(buffer); - buffer = NULL; +AudioFileSourceBuffer::~AudioFileSourceBuffer() { + if (deallocateBuffer) { + free(buffer); + } + buffer = NULL; } -bool AudioFileSourceBuffer::seek(int32_t pos, int dir) -{ - if(dir == SEEK_CUR && (readPtr+pos) < length) { - readPtr += pos; - return true; - } else { - // Invalidate - readPtr = 0; - writePtr = 0; - length = 0; - return src->seek(pos, dir); - } +bool AudioFileSourceBuffer::seek(int32_t pos, int dir) { + if (dir == SEEK_CUR && (readPtr + pos) < length) { + readPtr += pos; + return true; + } else { + // Invalidate + readPtr = 0; + writePtr = 0; + length = 0; + return src->seek(pos, dir); + } } -bool AudioFileSourceBuffer::close() -{ - if (deallocateBuffer) free(buffer); - buffer = NULL; - return src->close(); +bool AudioFileSourceBuffer::close() { + if (deallocateBuffer) { + free(buffer); + } + buffer = NULL; + return src->close(); } -bool AudioFileSourceBuffer::isOpen() -{ - return src->isOpen(); +bool AudioFileSourceBuffer::isOpen() { + return src->isOpen(); } -uint32_t AudioFileSourceBuffer::getSize() -{ - return src->getSize(); +uint32_t AudioFileSourceBuffer::getSize() { + return src->getSize(); } -uint32_t AudioFileSourceBuffer::getPos() -{ - return src->getPos(); +uint32_t AudioFileSourceBuffer::getPos() { + return src->getPos(); } -uint32_t AudioFileSourceBuffer::getFillLevel() -{ - return length; +uint32_t AudioFileSourceBuffer::getFillLevel() { + return length; } -uint32_t AudioFileSourceBuffer::read(void *data, uint32_t len) -{ - if (!buffer) return src->read(data, len); - - uint32_t bytes = 0; - if (!filled) { - // Fill up completely before returning any data at all - cb.st(STATUS_FILLING, PSTR("Refilling buffer")); - length = src->read(buffer, buffSize); - writePtr = length % buffSize; - filled = true; - } - - // Pull from buffer until we've got none left or we've satisfied the request - uint8_t *ptr = reinterpret_cast(data); - uint32_t toReadFromBuffer = (len < length) ? len : length; - if ( (toReadFromBuffer > 0) && (readPtr >= writePtr) ) { - uint32_t toReadToEnd = (toReadFromBuffer < (uint32_t)(buffSize - readPtr)) ? toReadFromBuffer : (buffSize - readPtr); - memcpy(ptr, &buffer[readPtr], toReadToEnd); - readPtr = (readPtr + toReadToEnd) % buffSize; - len -= toReadToEnd; - length -= toReadToEnd; - ptr += toReadToEnd; - bytes += toReadToEnd; - toReadFromBuffer -= toReadToEnd; - } - if (toReadFromBuffer > 0) { // We know RP < WP at this point - memcpy(ptr, &buffer[readPtr], toReadFromBuffer); - readPtr = (readPtr + toReadFromBuffer) % buffSize; - len -= toReadFromBuffer; - length -= toReadFromBuffer; - ptr += toReadFromBuffer; - bytes += toReadFromBuffer; - toReadFromBuffer -= toReadFromBuffer; - } - - if (len) { - // Still need more, try direct read from src - bytes += src->read(ptr, len); - // We're out of buffered data, need to force a complete refill. Thanks, @armSeb - readPtr = 0; - writePtr = 0; - length = 0; - filled = false; - cb.st(STATUS_UNDERFLOW, PSTR("Buffer underflow")); - } +uint32_t AudioFileSourceBuffer::read(void *data, uint32_t len) { + if (!buffer) { + return src->read(data, len); + } - fill(); + uint32_t bytes = 0; + if (!filled) { + // Fill up completely before returning any data at all + cb.st(STATUS_FILLING, PSTR("Refilling buffer")); + length = src->read(buffer, buffSize); + writePtr = length % buffSize; + filled = true; + } - return bytes; -} + // Pull from buffer until we've got none left or we've satisfied the request + uint8_t *ptr = reinterpret_cast(data); + uint32_t toReadFromBuffer = (len < length) ? len : length; + if ((toReadFromBuffer > 0) && (readPtr >= writePtr)) { + uint32_t toReadToEnd = (toReadFromBuffer < (uint32_t)(buffSize - readPtr)) ? toReadFromBuffer : (buffSize - readPtr); + memcpy(ptr, &buffer[readPtr], toReadToEnd); + readPtr = (readPtr + toReadToEnd) % buffSize; + len -= toReadToEnd; + length -= toReadToEnd; + ptr += toReadToEnd; + bytes += toReadToEnd; + toReadFromBuffer -= toReadToEnd; + } + if (toReadFromBuffer > 0) { // We know RP < WP at this point + memcpy(ptr, &buffer[readPtr], toReadFromBuffer); + readPtr = (readPtr + toReadFromBuffer) % buffSize; + len -= toReadFromBuffer; + length -= toReadFromBuffer; + ptr += toReadFromBuffer; + bytes += toReadFromBuffer; + toReadFromBuffer -= toReadFromBuffer; + } -void AudioFileSourceBuffer::fill() -{ - if (!buffer) return; - - if (length < buffSize) { - // Now try and opportunistically fill the buffer - if (readPtr > writePtr) { - if (readPtr == writePtr+1) return; - uint32_t bytesAvailMid = readPtr - writePtr - 1; - int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailMid); - length += cnt; - writePtr = (writePtr + cnt) % buffSize; - return; + if (len) { + // Still need more, try direct read from src + bytes += src->read(ptr, len); + // We're out of buffered data, need to force a complete refill. Thanks, @armSeb + readPtr = 0; + writePtr = 0; + length = 0; + filled = false; + cb.st(STATUS_UNDERFLOW, PSTR("Buffer underflow")); } - if (buffSize > writePtr) { - uint32_t bytesAvailEnd = buffSize - writePtr; - int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailEnd); - length += cnt; - writePtr = (writePtr + cnt) % buffSize; - if (cnt != (int)bytesAvailEnd) return; + fill(); + + return bytes; +} + +void AudioFileSourceBuffer::fill() { + if (!buffer) { + return; } - if (readPtr > 1) { - uint32_t bytesAvailStart = readPtr - 1; - int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailStart); - length += cnt; - writePtr = (writePtr + cnt) % buffSize; + if (length < buffSize) { + // Now try and opportunistically fill the buffer + if (readPtr > writePtr) { + if (readPtr == writePtr + 1) { + return; + } + uint32_t bytesAvailMid = readPtr - writePtr - 1; + int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailMid); + length += cnt; + writePtr = (writePtr + cnt) % buffSize; + return; + } + + if (buffSize > writePtr) { + uint32_t bytesAvailEnd = buffSize - writePtr; + int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailEnd); + length += cnt; + writePtr = (writePtr + cnt) % buffSize; + if (cnt != (int)bytesAvailEnd) { + return; + } + } + + if (readPtr > 1) { + uint32_t bytesAvailStart = readPtr - 1; + int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailStart); + length += cnt; + writePtr = (writePtr + cnt) % buffSize; + } } - } } -bool AudioFileSourceBuffer::loop() -{ - if (!src->loop()) return false; - fill(); - return true; -} +bool AudioFileSourceBuffer::loop() { + if (!src->loop()) { + return false; + } + fill(); + return true; +} diff --git a/src/AudioFileSourceBuffer.h b/src/AudioFileSourceBuffer.h index 6c8dc6c2..43b61011 100644 --- a/src/AudioFileSourceBuffer.h +++ b/src/AudioFileSourceBuffer.h @@ -1,21 +1,21 @@ /* - AudioFileSourceBuffer - Double-buffered input file using system RAM - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceBuffer + Double-buffered input file using system RAM + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCEBUFFER_H @@ -24,13 +24,12 @@ #include "AudioFileSource.h" -class AudioFileSourceBuffer : public AudioFileSource -{ - public: +class AudioFileSourceBuffer : public AudioFileSource { +public: AudioFileSourceBuffer(AudioFileSource *in, uint32_t bufferBytes); AudioFileSourceBuffer(AudioFileSource *in, void *buffer, uint32_t bufferBytes); // Pre-allocated buffer by app virtual ~AudioFileSourceBuffer() override; - + virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; virtual bool close() override; @@ -41,12 +40,12 @@ class AudioFileSourceBuffer : public AudioFileSource virtual uint32_t getFillLevel(); - enum { STATUS_FILLING=2, STATUS_UNDERFLOW }; + enum { STATUS_FILLING = 2, STATUS_UNDERFLOW }; - private: +private: virtual void fill(); - private: +private: AudioFileSource *src; uint32_t buffSize; uint8_t *buffer; diff --git a/src/AudioFileSourceFATFS.h b/src/AudioFileSourceFATFS.h new file mode 100644 index 00000000..46b24aad --- /dev/null +++ b/src/AudioFileSourceFATFS.h @@ -0,0 +1,63 @@ +/* + AudioFileSourceFS + Input Arduion "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOFILESOURCEFATFS_H +#define _AUDIOFILESOURCEFATFS_H + +#ifdef ESP32 + +#include +#include +#include + +#include "AudioFileSource.h" +#include "AudioFileSourceFS.h" + +/* + AudioFileSource for FAT filesystem. +*/ +class AudioFileSourceFATFS : public AudioFileSourceFS { +public: + AudioFileSourceFATFS() : AudioFileSourceFS(FFat) {}; + AudioFileSourceFATFS(const char *filename) : AudioFileSourceFS(FFat) { + // We call open() ourselves because calling AudioFileSourceFS(FFat, filename) + // would call the parent open() and we do not want that + open(filename); + }; + + virtual bool open(const char *filename) override { + // make sure that the FATFS filesystem has been mounted + if (!FFat.begin()) { + audioLogger->printf_P(PSTR("Unable to initialize FATFS filesystem\n")); + return false; + } else { + // now that the fielsystem has been mounted, we can call the regular parent open() function + return AudioFileSourceFS::open(filename); + } + }; + + // Others are inherited from base +}; + +#endif + + +#endif + diff --git a/src/AudioFileSourceFS.cpp b/src/AudioFileSourceFS.cpp index 05348f59..1ff86be0 100644 --- a/src/AudioFileSourceFS.cpp +++ b/src/AudioFileSourceFS.cpp @@ -1,21 +1,21 @@ /* - AudioFileSourceFS - Input "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III + AudioFileSourceFS + Input "file" to be used by AudioGenerator - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioFileSourceFS.h" @@ -23,51 +23,47 @@ #include "SPIFFS.h" #endif -AudioFileSourceFS::AudioFileSourceFS(FS &fs, const char *filename) -{ - filesystem = &fs; - open(filename); +AudioFileSourceFS::AudioFileSourceFS(FS &fs, const char *filename) { + filesystem = &fs; + open(filename); } -bool AudioFileSourceFS::open(const char *filename) -{ +bool AudioFileSourceFS::open(const char *filename) { #ifndef ESP32 - filesystem->begin(); + filesystem->begin(); #endif - f = filesystem->open(filename, "r"); - return f; + f = filesystem->open(filename, "r"); + return f; } -AudioFileSourceFS::~AudioFileSourceFS() -{ - if (f) f.close(); +AudioFileSourceFS::~AudioFileSourceFS() { + if (f) { + f.close(); + } } -uint32_t AudioFileSourceFS::read(void *data, uint32_t len) -{ - return f.read(reinterpret_cast(data), len); +uint32_t AudioFileSourceFS::read(void *data, uint32_t len) { + return f.read(reinterpret_cast(data), len); } -bool AudioFileSourceFS::seek(int32_t pos, int dir) -{ - return f.seek(pos, (dir==SEEK_SET)?SeekSet:(dir==SEEK_CUR)?SeekCur:SeekEnd); +bool AudioFileSourceFS::seek(int32_t pos, int dir) { + return f.seek(pos, (dir == SEEK_SET) ? SeekSet : (dir == SEEK_CUR) ? SeekCur : SeekEnd); } -bool AudioFileSourceFS::close() -{ - f.close(); - return true; +bool AudioFileSourceFS::close() { + f.close(); + return true; } -bool AudioFileSourceFS::isOpen() -{ - return f?true:false; +bool AudioFileSourceFS::isOpen() { + return f ? true : false; } -uint32_t AudioFileSourceFS::getSize() -{ - if (!f) return 0; - return f.size(); +uint32_t AudioFileSourceFS::getSize() { + if (!f) { + return 0; + } + return f.size(); } diff --git a/src/AudioFileSourceFS.h b/src/AudioFileSourceFS.h index fea34c29..3c54873a 100644 --- a/src/AudioFileSourceFS.h +++ b/src/AudioFileSourceFS.h @@ -1,21 +1,21 @@ /* - AudioFileSourceFS - Input Arduion "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceFS + Input Arduion "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCEFS_H @@ -26,24 +26,31 @@ #include "AudioFileSource.h" -class AudioFileSourceFS : public AudioFileSource -{ - public: - AudioFileSourceFS(FS &fs) { filesystem = &fs; } - AudioFileSourceFS(FS &fs, const char *filename); +class AudioFileSourceFS : public AudioFileSource { +public: + AudioFileSourceFS(fs::FS &fs) { + filesystem = &fs; + } + AudioFileSourceFS(fs::FS &fs, const char *filename); virtual ~AudioFileSourceFS() override; - + virtual bool open(const char *filename) override; virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; virtual bool close() override; virtual bool isOpen() override; virtual uint32_t getSize() override; - virtual uint32_t getPos() override { if (!f) return 0; else return f.position(); }; - - private: - FS *filesystem; - File f; + virtual uint32_t getPos() override { + if (!f) { + return 0; + } else { + return f.position(); + } + }; + +private: + fs::FS *filesystem; + fs::File f; }; diff --git a/src/AudioFileSourceFunction.cpp b/src/AudioFileSourceFunction.cpp new file mode 100644 index 00000000..62db87a8 --- /dev/null +++ b/src/AudioFileSourceFunction.cpp @@ -0,0 +1,153 @@ +/* + AudioFileSourceFunction + Audio output generator which can generate WAV file data from function + + Copyright (C) 2021 Hideaki Tai + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "AudioFileSourceFunction.h" + +AudioFileSourceFunction::AudioFileSourceFunction(float sec, uint16_t channels, uint32_t sample_per_sec, uint16_t bits_per_sample) { + uint32_t bytes_per_sec = sample_per_sec * channels * bits_per_sample / 8; + uint32_t len = uint32_t(sec * (float)bytes_per_sec); + + // RIFF chunk + memcpy(wav_header.riff.chunk_id, "RIFF", 4); + wav_header.riff.chunk_size = 4 // size of riff chunk w/o chunk_id and chunk_size + + 8 + 16 // size of format chunk + + 8 + len; // size of data chunk + memcpy(wav_header.riff.format, "WAVE", 4); + + // format chunk + memcpy(wav_header.format.chunk_id, "fmt ", 4); + wav_header.format.chunk_size = 16; + wav_header.format.format_tag = 0x0001; // PCM + wav_header.format.channels = channels; + wav_header.format.sample_per_sec = sample_per_sec; + wav_header.format.avg_bytes_per_sec = bytes_per_sec; + wav_header.format.block_align = channels * bits_per_sample / 8; + wav_header.format.bits_per_sample = bits_per_sample; + + // data chunk + memcpy(wav_header.data.chunk_id, "data", 4); + wav_header.data.chunk_size = len; + + funcs.reserve(channels); + pos = 0; + size = sizeof(WavHeader) + len; + is_ready = false; + is_unique = false; +} + +AudioFileSourceFunction::~AudioFileSourceFunction() { + close(); +} + +uint32_t AudioFileSourceFunction::read(void* data, uint32_t len) { + // callback size must be 1 or equal to channels + if (!is_ready) { + return 0; + } + + uint8_t* d = reinterpret_cast(data); + uint32_t i = 0; + while (i < len) { + uint32_t p = pos + i; + if (p < sizeof(WavHeader)) { + // header bytes + d[i] = wav_header.bytes[p]; + i += 1; + } else { + // data bytes + float time = (float)(p - sizeof(WavHeader)) / (float)wav_header.format.avg_bytes_per_sec; + float v = funcs[0](time); + for (size_t ch = 0; ch < wav_header.format.channels; ++ch) { + if (!is_unique && ch > 0) { + v = funcs[ch](time); + } + + switch (wav_header.format.bits_per_sample) { + case 8: { + Uint8AndInt8 vs {int8_t(v * (float)0x7F)}; + d[i] = vs.u; + break; + } + case 32: { + Uint8AndInt32 vs {int32_t(v * (float)0x7FFFFFFF)}; + d[i + 0] = vs.u[0]; + d[i + 1] = vs.u[1]; + d[i + 2] = vs.u[2]; + d[i + 3] = vs.u[3]; + break; + } + case 16: + default: { + Uint8AndInt16 vs {int16_t(v * (float)0x7FFF)}; + d[i + 0] = vs.u[0]; + d[i + 1] = vs.u[1]; + break; + } + } + } + i += wav_header.format.block_align; + } + } + pos += i; + return (pos >= size) ? 0 : i; +} + +bool AudioFileSourceFunction::seek(int32_t pos, int dir) { + if (dir == SEEK_SET) { + if (pos < 0 || (uint32_t)pos >= size) { + return false; + } + this->pos = pos; + } else if (dir == SEEK_CUR) { + int32_t p = (int32_t)this->pos + pos; + if (p < 0 || (uint32_t)p >= size) { + return false; + } + this->pos = p; + } else { + int32_t p = (int32_t)this->size + pos; + if (p < 0 || (uint32_t)p >= size) { + return false; + } + this->pos = p; + } + return true; +} + +bool AudioFileSourceFunction::close() { + funcs.clear(); + pos = 0; + size = 0; + is_ready = false; + is_unique = false; + return true; +} + +bool AudioFileSourceFunction::isOpen() { + return is_ready; +} + +uint32_t AudioFileSourceFunction::getSize() { + return size; +} + +uint32_t AudioFileSourceFunction::getPos() { + return pos; +} diff --git a/src/AudioFileSourceFunction.h b/src/AudioFileSourceFunction.h new file mode 100644 index 00000000..a422ccf2 --- /dev/null +++ b/src/AudioFileSourceFunction.h @@ -0,0 +1,119 @@ +/* + AudioFileSourceFunction + Audio output generator which can generate WAV file data from function + + Copyright (C) 2021 Hideaki Tai + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOFILESOURCEFUNCTION_H +#define _AUDIOFILESOURCEFUNCTION_H + +#include +#include +#include + +#include "AudioFileSource.h" + +class AudioFileSourceFunction : public AudioFileSource { + union WavHeader { + struct { + // RIFF chunk + struct { + char chunk_id[4]; // "RIFF" + uint32_t chunk_size; // 4 + (8 + sizeof(format_chunk)(16)) + (8 + sizeof(data_chunk)) + char format[4]; // "WAVE" + } riff; + // format chunk + struct { + char chunk_id[4]; // "fmt " + uint32_t chunk_size; // 16 + uint16_t format_tag; // 1: PCM + uint16_t channels; // 1: MONO, 2: STEREO + uint32_t sample_per_sec; // 8000, 11025, 22050, 44100, 48000 + uint32_t avg_bytes_per_sec; // sample_per_sec * channels * bits_per_sample / 8 + uint16_t block_align; // channels * bits_per_sample / 8 + uint16_t bits_per_sample; // 8, 16, 32 + } format; + // data chunk + struct { + char chunk_id[4]; // "data" + uint32_t chunk_size; // num_samples * channels * bytes_per_sample + // audio data follows here... + } data; + }; + uint8_t bytes[44]; + } wav_header; + + union Uint8AndInt8 { + int8_t i; + uint8_t u; + }; + + union Uint8AndInt16 { + int16_t i; + uint8_t u[2]; + }; + + union Uint8AndInt32 { + int32_t i; + uint8_t u[4]; + }; + + using callback_t = std::function; + std::vector funcs; + uint32_t pos; + uint32_t size; + bool is_ready; + bool is_unique; + +public: + AudioFileSourceFunction(float sec, uint16_t channels = 1, uint32_t sample_per_sec = 8000, uint16_t bits_per_sample = 16); + virtual ~AudioFileSourceFunction() override; + + template + bool addAudioGenerators(const F& f, Fs&&... fs) { + funcs.emplace_back(f); + return addAudioGenerators(std::forward(fs)...); + } + bool addAudioGenerators() { + funcs.shrink_to_fit(); + if (funcs.size() == 1) { + is_ready = true; + is_unique = true; + return true; + } else if (funcs.size() == wav_header.format.channels) { + is_ready = true; + is_unique = false; + return true; + } else { + is_ready = false; + is_unique = false; + funcs.clear(); + return false; + } + } + + virtual uint32_t read(void* data, uint32_t len) override; + virtual bool seek(int32_t pos, int dir) override; + + virtual bool close() override; + virtual bool isOpen() override; + + virtual uint32_t getSize() override; + virtual uint32_t getPos() override; +}; + +#endif // _AUDIOFILESOURCEFUNCTION_H diff --git a/src/AudioFileSourceHTTPStream.cpp b/src/AudioFileSourceHTTPStream.cpp index 4060ff25..9fdc7958 100644 --- a/src/AudioFileSourceHTTPStream.cpp +++ b/src/AudioFileSourceHTTPStream.cpp @@ -1,151 +1,156 @@ /* - AudioFileSourceHTTPStream - Streaming HTTP source - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceHTTPStream + Streaming HTTP source + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioFileSourceHTTPStream.h" -AudioFileSourceHTTPStream::AudioFileSourceHTTPStream() -{ - pos = 0; - reconnectTries = 0; - saveURL[0] = 0; +AudioFileSourceHTTPStream::AudioFileSourceHTTPStream() { + pos = 0; + reconnectTries = 0; + saveURL[0] = 0; } -AudioFileSourceHTTPStream::AudioFileSourceHTTPStream(const char *url) -{ - saveURL[0] = 0; - reconnectTries = 0; - open(url); +AudioFileSourceHTTPStream::AudioFileSourceHTTPStream(const char *url) { + saveURL[0] = 0; + reconnectTries = 0; + open(url); } -bool AudioFileSourceHTTPStream::open(const char *url) -{ - pos = 0; - http.begin(client, url); - http.setReuse(true); - int code = http.GET(); - if (code != HTTP_CODE_OK) { - http.end(); - cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request")); - return false; - } - size = http.getSize(); - strncpy(saveURL, url, sizeof(saveURL)); - saveURL[sizeof(saveURL)-1] = 0; - return true; +bool AudioFileSourceHTTPStream::open(const char *url) { + pos = 0; + http.begin(client, url); + http.setReuse(true); +#ifndef ESP32 + http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); +#endif + int code = http.GET(); + if (code != HTTP_CODE_OK) { + http.end(); + cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request")); + return false; + } + size = http.getSize(); + strncpy(saveURL, url, sizeof(saveURL)); + saveURL[sizeof(saveURL) - 1] = 0; + return true; } -AudioFileSourceHTTPStream::~AudioFileSourceHTTPStream() -{ - http.end(); +AudioFileSourceHTTPStream::~AudioFileSourceHTTPStream() { + http.end(); } -uint32_t AudioFileSourceHTTPStream::read(void *data, uint32_t len) -{ - if (data==NULL) { - audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::read passed NULL data\n")); - return 0; - } - return readInternal(data, len, false); +uint32_t AudioFileSourceHTTPStream::read(void *data, uint32_t len) { + if (data == NULL) { + audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::read passed NULL data\n")); + return 0; + } + return readInternal(data, len, false); } -uint32_t AudioFileSourceHTTPStream::readNonBlock(void *data, uint32_t len) -{ - if (data==NULL) { - audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::readNonBlock passed NULL data\n")); - return 0; - } - return readInternal(data, len, true); +uint32_t AudioFileSourceHTTPStream::readNonBlock(void *data, uint32_t len) { + if (data == NULL) { + audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::readNonBlock passed NULL data\n")); + return 0; + } + return readInternal(data, len, true); } -uint32_t AudioFileSourceHTTPStream::readInternal(void *data, uint32_t len, bool nonBlock) -{ +uint32_t AudioFileSourceHTTPStream::readInternal(void *data, uint32_t len, bool nonBlock) { retry: - if (!http.connected()) { - cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); - http.end(); - for (int i = 0; i < reconnectTries; i++) { - char buff[32]; - sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); - cb.st(STATUS_RECONNECTING, buff); - delay(reconnectDelayMs); - if (open(saveURL)) { - cb.st(STATUS_RECONNECTED, PSTR("Stream reconnected")); - break; - } - } if (!http.connected()) { - cb.st(STATUS_DISCONNECTED, PSTR("Unable to reconnect")); - return 0; + cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); + http.end(); + for (int i = 0; i < reconnectTries; i++) { + char buff[64]; + sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); + cb.st(STATUS_RECONNECTING, buff); + delay(reconnectDelayMs); + if (open(saveURL)) { + cb.st(STATUS_RECONNECTED, PSTR("Stream reconnected")); + break; + } + } + if (!http.connected()) { + cb.st(STATUS_DISCONNECTED, PSTR("Unable to reconnect")); + return 0; + } + } + if ((size > 0) && (pos >= size)) { + return 0; } - } - if ((size > 0) && (pos >= size)) return 0; - WiFiClient *stream = http.getStreamPtr(); +#if defined(ESP_ARDUINO_VERSION_MAJOR) && ESP_ARDUINO_VERSION_MAJOR >= 3 + NetworkClient *stream = http.getStreamPtr(); +#else + WiFiClient *stream = http.getStreamPtr(); +#endif - // Can't read past EOF... - if ( (size > 0) && (len > (uint32_t)(pos - size)) ) len = pos - size; + // Can't read past EOF... + if ((size > 0) && (len > (uint32_t)(pos - size))) { + len = pos - size; + } - if (!nonBlock) { - int start = millis(); - while ((stream->available() < (int)len) && (millis() - start < 500)) yield(); - } + if (!nonBlock) { + int start = millis(); + while ((stream->available() < (int)len) && (millis() - start < 500)) { + yield(); + } + } - size_t avail = stream->available(); - if (!nonBlock && !avail) { - cb.st(STATUS_NODATA, PSTR("No stream data available")); - http.end(); - goto retry; - } - if (avail == 0) return 0; - if (avail < len) len = avail; - - int read = stream->read(reinterpret_cast(data), len); - pos += read; - return read; + size_t avail = stream->available(); + if (!nonBlock && !avail) { + cb.st(STATUS_NODATA, PSTR("No stream data available")); + http.end(); + goto retry; + } + if (avail == 0) { + return 0; + } + if (avail < len) { + len = avail; + } + + int read = stream->read(reinterpret_cast(data), len); + pos += read; + return read; } -bool AudioFileSourceHTTPStream::seek(int32_t pos, int dir) -{ - audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::seek not implemented!")); - (void) pos; - (void) dir; - return false; +bool AudioFileSourceHTTPStream::seek(int32_t pos, int dir) { + audioLogger->printf_P(PSTR("ERROR! AudioFileSourceHTTPStream::seek not implemented!")); + (void) pos; + (void) dir; + return false; } -bool AudioFileSourceHTTPStream::close() -{ - http.end(); - return true; +bool AudioFileSourceHTTPStream::close() { + http.end(); + return true; } -bool AudioFileSourceHTTPStream::isOpen() -{ - return http.connected(); +bool AudioFileSourceHTTPStream::isOpen() { + return http.connected(); } -uint32_t AudioFileSourceHTTPStream::getSize() -{ - return size; +uint32_t AudioFileSourceHTTPStream::getSize() { + return size; } -uint32_t AudioFileSourceHTTPStream::getPos() -{ - return pos; +uint32_t AudioFileSourceHTTPStream::getPos() { + return pos; } diff --git a/src/AudioFileSourceHTTPStream.h b/src/AudioFileSourceHTTPStream.h index e7ef88d1..459827c7 100644 --- a/src/AudioFileSourceHTTPStream.h +++ b/src/AudioFileSourceHTTPStream.h @@ -1,43 +1,41 @@ /* - AudioFileSourceHTTPStream - Connect to a HTTP based streaming service - - Copyright (C) 2017 Earle F. Philhower, III + AudioFileSourceHTTPStream + Connect to a HTTP based streaming service - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCEHTTPSTREAM_H -#define _AUDIOFILESOURCEHTTPSTREAM_H +#pragma once #include -#ifdef ESP32 - #include +#ifdef ESP8266 +#include #else - #include +#include #endif #include "AudioFileSource.h" -class AudioFileSourceHTTPStream : public AudioFileSource -{ - friend class AudioFileSourceICYStream; +class AudioFileSourceHTTPStream : public AudioFileSource { + friend class AudioFileSourceICYStream; - public: +public: AudioFileSourceHTTPStream(); AudioFileSourceHTTPStream(const char *url); virtual ~AudioFileSourceHTTPStream() override; - + virtual bool open(const char *url) override; virtual uint32_t read(void *data, uint32_t len) override; virtual uint32_t readNonBlock(void *data, uint32_t len) override; @@ -46,13 +44,24 @@ class AudioFileSourceHTTPStream : public AudioFileSource virtual bool isOpen() override; virtual uint32_t getSize() override; virtual uint32_t getPos() override; - bool SetReconnect(int tries, int delayms) { reconnectTries = tries; reconnectDelayMs = delayms; return true; } + bool SetReconnect(int tries, int delayms) { + reconnectTries = tries; + reconnectDelayMs = delayms; + return true; + } + void useHTTP10() { + http.useHTTP10(true); + } - enum { STATUS_HTTPFAIL=2, STATUS_DISCONNECTED, STATUS_RECONNECTING, STATUS_RECONNECTED, STATUS_NODATA }; + enum { STATUS_HTTPFAIL = 2, STATUS_DISCONNECTED, STATUS_RECONNECTING, STATUS_RECONNECTED, STATUS_NODATA }; - private: +private: virtual uint32_t readInternal(void *data, uint32_t len, bool nonBlock); +#if defined(ESP_ARDUINO_VERSION_MAJOR) && ESP_ARDUINO_VERSION_MAJOR >= 3 + NetworkClient client; +#else WiFiClient client; +#endif HTTPClient http; int pos; int size; @@ -60,7 +69,3 @@ class AudioFileSourceHTTPStream : public AudioFileSource int reconnectDelayMs; char saveURL[128]; }; - - -#endif - diff --git a/src/AudioFileSourceICYStream.cpp b/src/AudioFileSourceICYStream.cpp index cc7cc5e2..2ca9ad67 100644 --- a/src/AudioFileSourceICYStream.cpp +++ b/src/AudioFileSourceICYStream.cpp @@ -1,213 +1,260 @@ /* - AudioFileSourceICYStream - Streaming Shoutcast ICY source - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceICYStream + Streaming Shoutcast ICY source + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef _GNU_SOURCE +#undef _GNU_SOURCE +#endif #define _GNU_SOURCE #include "AudioFileSourceICYStream.h" #include -AudioFileSourceICYStream::AudioFileSourceICYStream() -{ - pos = 0; - reconnectTries = 0; - saveURL[0] = 0; +AudioFileSourceICYStream::AudioFileSourceICYStream() { + pos = 0; + reconnectTries = 0; + saveURL[0] = 0; } -AudioFileSourceICYStream::AudioFileSourceICYStream(const char *url) -{ - saveURL[0] = 0; - reconnectTries = 0; - open(url); +AudioFileSourceICYStream::AudioFileSourceICYStream(const char *url) { + saveURL[0] = 0; + reconnectTries = 0; + open(url); } -bool AudioFileSourceICYStream::open(const char *url) -{ - static const char *hdr[] = { "icy-metaint", "icy-name", "icy-genre", "icy-br" }; - pos = 0; - http.begin(client, url); - http.addHeader("Icy-MetaData", "1"); - http.collectHeaders( hdr, 4 ); - http.setReuse(true); - int code = http.GET(); - if (code != HTTP_CODE_OK) { - http.end(); - cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request")); - return false; - } - if (http.hasHeader(hdr[0])) { - String ret = http.header(hdr[0]); - icyMetaInt = ret.toInt(); - } else { - icyMetaInt = 0; - } - if (http.hasHeader(hdr[1])) { - String ret = http.header(hdr[1]); -// cb.md("SiteName", false, ret.c_str()); - } - if (http.hasHeader(hdr[2])) { - String ret = http.header(hdr[2]); -// cb.md("Genre", false, ret.c_str()); - } - if (http.hasHeader(hdr[3])) { - String ret = http.header(hdr[3]); -// cb.md("Bitrate", false, ret.c_str()); - } - - icyByteCount = 0; - size = http.getSize(); - strncpy(saveURL, url, sizeof(saveURL)); - saveURL[sizeof(saveURL)-1] = 0; - return true; -} +bool AudioFileSourceICYStream::open(const char *url) { + static const char *hdr[] = { "icy-metaint", "icy-name", "icy-genre", "icy-br" }; + pos = 0; + http.begin(client, url); + http.addHeader("Icy-MetaData", "1"); + http.collectHeaders(hdr, 4); + http.setReuse(true); + http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); + int code = http.GET(); + if (code != HTTP_CODE_OK) { + http.end(); + cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request")); + return false; + } + if (http.hasHeader(hdr[0])) { + String ret = http.header(hdr[0]); + icyMetaInt = ret.toInt(); + } else { + icyMetaInt = 0; + } + if (http.hasHeader(hdr[1])) { + String ret = http.header(hdr[1]); + // cb.md("SiteName", false, ret.c_str()); + } + if (http.hasHeader(hdr[2])) { + String ret = http.header(hdr[2]); + // cb.md("Genre", false, ret.c_str()); + } + if (http.hasHeader(hdr[3])) { + String ret = http.header(hdr[3]); + // cb.md("Bitrate", false, ret.c_str()); + } -AudioFileSourceICYStream::~AudioFileSourceICYStream() -{ - http.end(); + icyByteCount = 0; + size = http.getSize(); + strncpy(saveURL, url, sizeof(saveURL)); + saveURL[sizeof(saveURL) - 1] = 0; + return true; } -uint32_t AudioFileSourceICYStream::readInternal(void *data, uint32_t len, bool nonBlock) -{ -retry: - if (!http.connected()) { - cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); +AudioFileSourceICYStream::~AudioFileSourceICYStream() { http.end(); - for (int i = 0; i < reconnectTries; i++) { - char buff[32]; - sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); - cb.st(STATUS_RECONNECTING, buff); - delay(reconnectDelayMs); - if (open(saveURL)) { - cb.st(STATUS_RECONNECTED, PSTR("Stream reconnected")); - break; - } +} + +uint32_t AudioFileSourceICYStream::readInternal(void *data, uint32_t len, bool nonBlock) { + // Ensure we can't possibly read 2 ICY headers in a single go #355 + if (icyMetaInt > 1) { + len = std::min((int)(icyMetaInt >> 1), (int)len); } +retry: if (!http.connected()) { - cb.st(STATUS_DISCONNECTED, PSTR("Unable to reconnect")); - return 0; + cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); + http.end(); + for (int i = 0; i < reconnectTries; i++) { + char buff[64]; + sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); + cb.st(STATUS_RECONNECTING, buff); + delay(reconnectDelayMs); + if (open(saveURL)) { + cb.st(STATUS_RECONNECTED, PSTR("Stream reconnected")); + break; + } + } + if (!http.connected()) { + cb.st(STATUS_DISCONNECTED, PSTR("Unable to reconnect")); + return 0; + } + } + if ((size > 0) && (pos >= size)) { + return 0; } - } - if ((size > 0) && (pos >= size)) return 0; - WiFiClient *stream = http.getStreamPtr(); +#if defined(ESP_ARDUINO_VERSION_MAJOR) && ESP_ARDUINO_VERSION_MAJOR >= 3 + NetworkClient *stream = http.getStreamPtr(); +#else + WiFiClient *stream = http.getStreamPtr(); +#endif - // Can't read past EOF... - if ( (size > 0) && (len > (uint32_t)(pos - size)) ) len = pos - size; + // Can't read past EOF... + if ((size > 0) && (len > (uint32_t)(pos - size))) { + len = pos - size; + } - if (!nonBlock) { - int start = millis(); - while ((stream->available() < (int)len) && (millis() - start < 500)) yield(); - } + if (!nonBlock) { + int start = millis(); + while ((stream->available() < (int)len) && (millis() - start < 500)) { + yield(); + } + } - size_t avail = stream->available(); - if (!nonBlock && !avail) { - cb.st(STATUS_NODATA, PSTR("No stream data available")); - http.end(); - goto retry; - } - if (avail == 0) return 0; - if (avail < len) len = avail; - - int read = 0; - int ret = 0; - // If the read would hit an ICY block, split it up... - if (((int)(icyByteCount + len) > (int)icyMetaInt) && (icyMetaInt > 0)) { - int beforeIcy = icyMetaInt - icyByteCount; - if (beforeIcy > 0) { - ret = stream->read(reinterpret_cast(data), beforeIcy); - if (ret < 0) ret = 0; - read += ret; - pos += ret; - len -= ret; - data = (void *)(reinterpret_cast(data) + ret); - icyByteCount += ret; - if (ret != beforeIcy) return read; // Partial read + size_t avail = stream->available(); + if (!nonBlock && !avail) { + cb.st(STATUS_NODATA, PSTR("No stream data available")); + http.end(); + goto retry; + } + if (avail == 0) { + return 0; + } + if (avail < len) { + len = avail; } - // ICY MD handling - int mdSize; - uint8_t c; - int mdret = stream->read(&c, 1); - if (mdret==0) return read; - mdSize = c * 16; - if ((mdret == 1) && (mdSize > 0)) { - // This is going to get ugly fast. - char icyBuff[256 + 16 + 1]; - char *readInto = icyBuff + 16; - memset(icyBuff, 0, 16); // Ensure no residual matches occur - while (mdSize) { - int toRead = mdSize > 256 ? 256 : mdSize; - int ret = stream->read((uint8_t*)readInto, toRead); - if (ret < 0) return read; - if (ret == 0) { delay(1); continue; } - mdSize -= ret; - // At this point we have 0...15 = last 15 chars read from prior read plus new data - int end = 16 + ret; // The last byte of valid data - char *header = (char *)memmem((void*)icyBuff, end, (void*)"StreamTitle=", 12); - if (!header) { - // No match, so move the last 16 bytes back to the start and continue - memmove(icyBuff, icyBuff+end-16, 16); - delay(1); - continue; + int read = 0; + int ret = 0; + // If the read would hit an ICY block, split it up... + if (((int)(icyByteCount + len) > (int)icyMetaInt) && (icyMetaInt > 0)) { + int beforeIcy = icyMetaInt - icyByteCount; + if (beforeIcy > 0) { + ret = stream->read(reinterpret_cast(data), beforeIcy); + if (ret < 0) { + ret = 0; + } + read += ret; + pos += ret; + len -= ret; + data = (void *)(reinterpret_cast(data) + ret); + icyByteCount += ret; + if (ret != beforeIcy) { + return read; // Partial read + } } - // Found header, now move it to the front - int lastValidByte = end - (header -icyBuff) + 1; - memmove(icyBuff, header, lastValidByte); - // Now fill the buffer to the end with read data - while (mdSize && lastValidByte < 255) { - int toRead = mdSize > (256 - lastValidByte) ? (256 - lastValidByte) : mdSize; - ret = stream->read((uint8_t*)icyBuff + lastValidByte, toRead); - if (ret==-1) return read; // error - if (ret == 0) { delay(1); continue; } - mdSize -= ret; - lastValidByte += ret; - } - // Buffer now contains StreamTitle=....., parse it - char *p = icyBuff+12; - if (*p=='\'' || *p== '"' ) { - char closing[] = { *p, ';', '\0' }; - char *psz = strstr( p+1, closing ); - if( !psz ) psz = strchr( &icyBuff[13], ';' ); - if( psz ) *psz = '\0'; - p++; - } else { - char *psz = strchr( p, ';' ); - if( psz ) *psz = '\0'; + + // ICY MD handling + int mdSize; + uint8_t c; + int mdret = stream->read(&c, 1); + if (mdret == 0) { + return read; } - cb.md("StreamTitle", false, p); - - // Now skip rest of MD block - while (mdSize) { - int toRead = mdSize > 256 ? 256 : mdSize; - ret = stream->read((uint8_t*)icyBuff, toRead); - if (ret < 0) return read; - if (ret == 0) { delay(1); continue; } - mdSize -= ret; + mdSize = c * 16; + if ((mdret == 1) && (mdSize > 0)) { + // This is going to get ugly fast. + char icyBuff[256 + 16 + 1]; + char *readInto = icyBuff + 16; + memset(icyBuff, 0, 16); // Ensure no residual matches occur + while (mdSize) { + int toRead = mdSize > 256 ? 256 : mdSize; + int ret = stream->read((uint8_t*)readInto, toRead); + if (ret < 0) { + return read; + } + if (ret == 0) { + delay(1); + continue; + } + mdSize -= ret; + // At this point we have 0...15 = last 15 chars read from prior read plus new data + int end = 16 + ret; // The last byte of valid data + char *header = (char *)memmem((void*)icyBuff, end, (void*)"StreamTitle=", 12); + if (!header) { + // No match, so move the last 16 bytes back to the start and continue + memmove(icyBuff, icyBuff + end - 16, 16); + delay(1); + continue; + } + // Found header, now move it to the front + int lastValidByte = end - (header - icyBuff) + 1; + memmove(icyBuff, header, lastValidByte); + // Now fill the buffer to the end with read data + while (mdSize && lastValidByte < 255) { + int toRead = mdSize > (256 - lastValidByte) ? (256 - lastValidByte) : mdSize; + ret = stream->read((uint8_t*)icyBuff + lastValidByte, toRead); + if (ret == -1) { + return read; // error + } + if (ret == 0) { + delay(1); + continue; + } + mdSize -= ret; + lastValidByte += ret; + } + // Buffer now contains StreamTitle=....., parse it + char *p = icyBuff + 12; + if (*p == '\'' || *p == '"') { + char closing[] = { *p, ';', '\0' }; + char *psz = strstr(p + 1, closing); + if (!psz) { + psz = strchr(&icyBuff[13], ';'); + } + if (psz) { + *psz = '\0'; + } + p++; + } else { + char *psz = strchr(p, ';'); + if (psz) { + *psz = '\0'; + } + } + cb.md("StreamTitle", false, p); + + // Now skip rest of MD block + while (mdSize) { + int toRead = mdSize > 256 ? 256 : mdSize; + ret = stream->read((uint8_t*)icyBuff, toRead); + if (ret < 0) { + return read; + } + if (ret == 0) { + delay(1); + continue; + } + mdSize -= ret; + } + } } - } + icyByteCount = 0; } - icyByteCount = 0; - } - - ret = stream->read(reinterpret_cast(data), len); - if (ret < 0) ret = 0; - read += ret; - pos += ret; - icyByteCount += ret; - return read; + + ret = stream->read(reinterpret_cast(data), len); + if (ret < 0) { + ret = 0; + } + read += ret; + pos += ret; + icyByteCount += ret; + return read; } diff --git a/src/AudioFileSourceICYStream.h b/src/AudioFileSourceICYStream.h index 479c16b4..2b210233 100644 --- a/src/AudioFileSourceICYStream.h +++ b/src/AudioFileSourceICYStream.h @@ -1,50 +1,44 @@ /* - AudioFileSourceHTTPStream - Connect to a HTTP based streaming service - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceHTTPStream + Connect to a HTTP based streaming service + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCEICYSTREAM_H -#define _AUDIOFILESOURCEICYSTREAM_H +#pragma once #include -#ifdef ESP32 - #include +#ifdef ESP8266 +#include #else - #include +#include #endif #include "AudioFileSourceHTTPStream.h" -class AudioFileSourceICYStream : public AudioFileSourceHTTPStream -{ - public: +class AudioFileSourceICYStream : public AudioFileSourceHTTPStream { +public: AudioFileSourceICYStream(); AudioFileSourceICYStream(const char *url); virtual ~AudioFileSourceICYStream() override; - + virtual bool open(const char *url) override; - private: +private: virtual uint32_t readInternal(void *data, uint32_t len, bool nonBlock) override; int icyMetaInt; int icyByteCount; }; - - -#endif - diff --git a/src/AudioFileSourceID3.cpp b/src/AudioFileSourceID3.cpp index 1723b8d4..b4b89eeb 100644 --- a/src/AudioFileSourceID3.cpp +++ b/src/AudioFileSourceID3.cpp @@ -1,29 +1,28 @@ /* - AudioFileSourceID3 - ID3 filter that extracts any ID3 fields and sends to CB function - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceID3 + ID3 filter that extracts any ID3 fields and sends to CB function + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioFileSourceID3.h" // Handle unsync operation in ID3 with custom class -class AudioFileSourceUnsync : public AudioFileSource -{ - public: +class AudioFileSourceUnsync : public AudioFileSource { +public: AudioFileSourceUnsync(AudioFileSource *src, int len, bool unsync); virtual ~AudioFileSourceUnsync() override; virtual uint32_t read(void *data, uint32_t len) override; @@ -31,235 +30,264 @@ class AudioFileSourceUnsync : public AudioFileSource int getByte(); bool eof(); - private: +private: AudioFileSource *src; int remaining; bool unsync; int savedByte; }; -AudioFileSourceUnsync::AudioFileSourceUnsync(AudioFileSource *src, int len, bool unsync) -{ - this->src = src; - this->remaining = len; - this->unsync = unsync; - this->savedByte = -1; +AudioFileSourceUnsync::AudioFileSourceUnsync(AudioFileSource *src, int len, bool unsync) { + this->src = src; + this->remaining = len; + this->unsync = unsync; + this->savedByte = -1; } -AudioFileSourceUnsync::~AudioFileSourceUnsync() -{ +AudioFileSourceUnsync::~AudioFileSourceUnsync() { } -uint32_t AudioFileSourceUnsync::read(void *data, uint32_t len) -{ - uint32_t bytes = 0; - uint8_t *ptr = reinterpret_cast(data); - - // This is only used during ID3 parsing, so no need to optimize here... - while (len--) { - int b = getByte(); - if (b >= 0) { - *(ptr++) = (uint8_t)b; - bytes++; +uint32_t AudioFileSourceUnsync::read(void *data, uint32_t len) { + uint32_t bytes = 0; + uint8_t *ptr = reinterpret_cast(data); + + // This is only used during ID3 parsing, so no need to optimize here... + while (len--) { + int b = getByte(); + if (b >= 0) { + *(ptr++) = (uint8_t)b; + bytes++; + } } - } - return bytes; + return bytes; } -int AudioFileSourceUnsync::getByte() -{ - // If we're not unsync, just read. - if (!unsync) { - uint8_t c; - if (!remaining) return -1; - remaining--; - if (1 != src->read(&c, 1)) return -1; - return c; - } - - // If we've saved a pre-read character, return it immediately - if (savedByte >= 0) { - int s = savedByte; - savedByte = -1; - return s; - } - - if (remaining <= 0) { - return -1; - } else if (remaining == 1) { - remaining--; - uint8_t c; - if (1 != src->read(&c, 1)) return -1; - else return c; - } else { - uint8_t c; - remaining--; - if (1 != src->read(&c, 1)) return -1; - if (c != 0xff) { - return c; +int AudioFileSourceUnsync::getByte() { + // If we're not unsync, just read. + if (!unsync) { + uint8_t c; + if (!remaining) { + return -1; + } + remaining--; + if (1 != src->read(&c, 1)) { + return -1; + } + return c; } - // Saw 0xff, check next byte. If 0 then eat it, OTW return the 0xff - uint8_t d; - remaining--; - if (1 != src->read(&d, 1)) return c; - if (d != 0x00) { - savedByte = d; + + // If we've saved a pre-read character, return it immediately + if (savedByte >= 0) { + int s = savedByte; + savedByte = -1; + return s; + } + + if (remaining <= 0) { + return -1; + } else if (remaining == 1) { + remaining--; + uint8_t c; + if (1 != src->read(&c, 1)) { + return -1; + } else { + return c; + } + } else { + uint8_t c; + remaining--; + if (1 != src->read(&c, 1)) { + return -1; + } + if (c != 0xff) { + return c; + } + // Saw 0xff, check next byte. If 0 then eat it, OTW return the 0xff + uint8_t d; + remaining--; + if (1 != src->read(&d, 1)) { + return c; + } + if (d != 0x00) { + savedByte = d; + } + return c; } - return c; - } } -bool AudioFileSourceUnsync::eof() -{ - if (remaining<=0) return true; - else return false; +bool AudioFileSourceUnsync::eof() { + if (remaining <= 0) { + return true; + } else { + return false; + } } -AudioFileSourceID3::AudioFileSourceID3(AudioFileSource *src) -{ - this->src = src; - this->checked = false; +AudioFileSourceID3::AudioFileSourceID3(AudioFileSource *src) { + this->src = src; + this->checked = false; } -AudioFileSourceID3::~AudioFileSourceID3() -{ +AudioFileSourceID3::~AudioFileSourceID3() { } -uint32_t AudioFileSourceID3::read(void *data, uint32_t len) -{ - int rev = 0; +uint32_t AudioFileSourceID3::read(void *data, uint32_t len) { + int rev = 0; - if (checked) { - return src->read(data, len); - } - checked = true; - // <10 bytes initial read, not enough space to check header - if (len<10) return src->read(data, len); + if (checked) { + return src->read(data, len); + } + checked = true; + // <10 bytes initial read, not enough space to check header + if (len < 10) { + return src->read(data, len); + } - uint8_t *buff = reinterpret_cast(data); - int ret = src->read(data, 10); - if (ret<10) return ret; + uint8_t *buff = reinterpret_cast(data); + int ret = src->read(data, 10); + if (ret < 10) { + return ret; + } - if ((buff[0]!='I') || (buff[1]!='D') || (buff[2]!='3') || (buff[3]>0x04) || (buff[3]<0x02) || (buff[4]!=0)) { - return 10 + src->read(buff+10, len-10); - } + if ((buff[0] != 'I') || (buff[1] != 'D') || (buff[2] != '3') || (buff[3] > 0x04) || (buff[3] < 0x02) || (buff[4] != 0)) { + cb.md("eof", false, "id3"); + return 10 + src->read(buff + 10, len - 10); + } - rev = buff[3]; - bool unsync = false; - bool exthdr = false; + rev = buff[3]; + bool unsync = false; + bool exthdr = false; - switch(rev) { + switch (rev) { case 2: - unsync = (buff[5] & 0x80); - exthdr = false; - break; + unsync = (buff[5] & 0x80); + exthdr = false; + break; case 3: case 4: - unsync = (buff[5] & 0x80); - exthdr = (buff[5] & 0x40); - break; - }; - - int id3Size = buff[6]; - id3Size = id3Size << 7; - id3Size |= buff[7]; - id3Size = id3Size << 7; - id3Size |= buff[8]; - id3Size = id3Size << 7; - id3Size |= buff[9]; - // Every read from now may be unsync'd - AudioFileSourceUnsync id3(src, id3Size, unsync); - - if (exthdr) { - int ehsz = (id3.getByte()<<24) | (id3.getByte()<<16) | (id3.getByte()<<8) | (id3.getByte()); - for (int j=0; jread(data, len); + do { + unsigned char frameid[4]; + int framesize; + bool compressed; + + frameid[0] = id3.getByte(); + frameid[1] = id3.getByte(); + frameid[2] = id3.getByte(); + if (rev == 2) { + frameid[3] = 0; + } else { + frameid[3] = id3.getByte(); + } + + if (frameid[0] == 0 && frameid[1] == 0 && frameid[2] == 0 && frameid[3] == 0) { + // We're in padding + while (!id3.eof()) { + id3.getByte(); + } + } else { + if (rev == 2) { + framesize = (id3.getByte() << 16) | (id3.getByte() << 8) | (id3.getByte()); + compressed = false; + } else { + framesize = (id3.getByte() << 24) | (id3.getByte() << 16) | (id3.getByte() << 8) | (id3.getByte()); + id3.getByte(); // skip 1st flag + compressed = id3.getByte() & 0x80; + } + if (compressed) { + int decompsize = (id3.getByte() << 24) | (id3.getByte() << 16) | (id3.getByte() << 8) | (id3.getByte()); + // TODO - add libz decompression, for now ignore this one... + (void)decompsize; + for (int j = 0; j < framesize; j++) { + id3.getByte(); + } + } + + // Read the value and send to callback + char value[64]; + uint32_t i; + bool isUnicode = (id3.getByte() == 1) ? true : false; + for (i = 0; i < (uint32_t)framesize - 1; i++) { + if (i < sizeof(value) - 1) { + value[i] = id3.getByte(); + } else { + (void)id3.getByte(); + } + } + value[i < sizeof(value) - 1 ? i : sizeof(value) - 1] = 0; // Terminate the string... + if ((frameid[0] == 'T' && frameid[1] == 'A' && frameid[2] == 'L' && frameid[3] == 'B') || + (frameid[0] == 'T' && frameid[1] == 'A' && frameid[2] == 'L' && rev == 2)) { + cb.md("Album", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'I' && frameid[2] == 'T' && frameid[3] == '2') || + (frameid[0] == 'T' && frameid[1] == 'T' && frameid[2] == '2' && rev == 2)) { + cb.md("Title", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'P' && frameid[2] == 'E' && frameid[3] == '1') || + (frameid[0] == 'T' && frameid[1] == 'P' && frameid[2] == '1' && rev == 2)) { + cb.md("Performer", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'Y' && frameid[2] == 'E' && frameid[3] == 'R') || + (frameid[0] == 'T' && frameid[1] == 'Y' && frameid[2] == 'E' && rev == 2)) { + cb.md("Year", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'R' && frameid[2] == 'C' && frameid[3] == 'K') || + (frameid[0] == 'T' && frameid[1] == 'R' && frameid[2] == 'K' && rev == 2)) { + cb.md("track", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'P' && frameid[2] == 'O' && frameid[3] == 'S') || + (frameid[0] == 'T' && frameid[1] == 'P' && frameid[2] == 'A' && rev == 2)) { + cb.md("Set", isUnicode, value); + } else if ((frameid[0] == 'P' && frameid[1] == 'O' && frameid[2] == 'P' && frameid[3] == 'M') || + (frameid[0] == 'P' && frameid[1] == 'O' && frameid[2] == 'P' && rev == 2)) { + cb.md("Popularimeter", isUnicode, value); + } else if ((frameid[0] == 'T' && frameid[1] == 'C' && frameid[2] == 'M' && frameid[3] == 'P')) { + cb.md("Compilation", isUnicode, value); + } + } + } while (!id3.eof()); + + // use callback function to signal end of tags and beginning of content. + cb.md("eof", false, "id3"); + + // All ID3 processing done, return to main caller + return src->read(data, len); } -bool AudioFileSourceID3::seek(int32_t pos, int dir) -{ - return src->seek(pos, dir); +bool AudioFileSourceID3::seek(int32_t pos, int dir) { + return src->seek(pos, dir); } -bool AudioFileSourceID3::close() -{ - return src->close(); +bool AudioFileSourceID3::close() { + return src->close(); } -bool AudioFileSourceID3::isOpen() -{ - return src->isOpen(); +bool AudioFileSourceID3::isOpen() { + return src->isOpen(); } -uint32_t AudioFileSourceID3::getSize() -{ - return src->getSize(); +uint32_t AudioFileSourceID3::getSize() { + return src->getSize(); } -uint32_t AudioFileSourceID3::getPos() -{ - return src->getPos(); +uint32_t AudioFileSourceID3::getPos() { + return src->getPos(); } diff --git a/src/AudioFileSourceID3.h b/src/AudioFileSourceID3.h index 9d12f296..23f3c301 100644 --- a/src/AudioFileSourceID3.h +++ b/src/AudioFileSourceID3.h @@ -1,21 +1,21 @@ /* - AudioFileSourceID3 - ID3 filter that extracts any ID3 fields and sends to CB function - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceID3 + ID3 filter that extracts any ID3 fields and sends to CB function + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCEID3_H @@ -25,12 +25,11 @@ #include "AudioFileSource.h" -class AudioFileSourceID3 : public AudioFileSource -{ - public: +class AudioFileSourceID3 : public AudioFileSource { +public: AudioFileSourceID3(AudioFileSource *src); virtual ~AudioFileSourceID3() override; - + virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; virtual bool close() override; @@ -38,7 +37,7 @@ class AudioFileSourceID3 : public AudioFileSource virtual uint32_t getSize() override; virtual uint32_t getPos() override; - private: +private: AudioFileSource *src; bool checked; }; diff --git a/src/AudioFileSourceLittleFS.h b/src/AudioFileSourceLittleFS.h index 27d94bb8..b0bb4ceb 100644 --- a/src/AudioFileSourceLittleFS.h +++ b/src/AudioFileSourceLittleFS.h @@ -1,27 +1,25 @@ /* - AudioFileSourceFS - Input Arduion "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ + AudioFileSourceFS + Input Arduion "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III -#ifndef _AUDIOFILESOURCESPIFFS_H -#define _AUDIOFILESOURCESPIFFS_H + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -#ifndef ESP32 // No LittleFS there, yet + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOFILESOURCELITTLEFS_H +#define _AUDIOFILESOURCELITTLEFS_H #include #include @@ -29,9 +27,8 @@ #include "AudioFileSource.h" #include "AudioFileSourceFS.h" -class AudioFileSourceLittleFS : public AudioFileSourceFS -{ - public: +class AudioFileSourceLittleFS : public AudioFileSourceFS { +public: AudioFileSourceLittleFS() : AudioFileSourceFS(LittleFS) { }; AudioFileSourceLittleFS(const char *filename) : AudioFileSourceFS(LittleFS, filename) {}; // Others are inherited from base @@ -39,5 +36,3 @@ class AudioFileSourceLittleFS : public AudioFileSourceFS #endif -#endif - diff --git a/src/AudioFileSourcePROGMEM.cpp b/src/AudioFileSourcePROGMEM.cpp index 46427e4b..629fc3db 100644 --- a/src/AudioFileSourcePROGMEM.cpp +++ b/src/AudioFileSourcePROGMEM.cpp @@ -1,99 +1,104 @@ /* - AudioFileSourcePROGMEM - Store a "file" as a PROGMEM array and use it as audio source data - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourcePROGMEM + Store a "file" as a PROGMEM array and use it as audio source data + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioFileSourcePROGMEM.h" -AudioFileSourcePROGMEM::AudioFileSourcePROGMEM() -{ - opened = false; - progmemData = NULL; - progmemLen = 0; - filePointer = 0; +AudioFileSourcePROGMEM::AudioFileSourcePROGMEM() { + opened = false; + progmemData = NULL; + progmemLen = 0; + filePointer = 0; } -AudioFileSourcePROGMEM::AudioFileSourcePROGMEM(const void *data, uint32_t len) -{ - open(data, len); +AudioFileSourcePROGMEM::AudioFileSourcePROGMEM(const void *data, uint32_t len) { + open(data, len); } -AudioFileSourcePROGMEM::~AudioFileSourcePROGMEM() -{ +AudioFileSourcePROGMEM::~AudioFileSourcePROGMEM() { } -bool AudioFileSourcePROGMEM::open(const void *data, uint32_t len) -{ - if (!data || !len) return false; +bool AudioFileSourcePROGMEM::open(const void *data, uint32_t len) { + if (!data || !len) { + return false; + } - opened = true; - progmemData = data; - progmemLen = len; - filePointer = 0; - return true; + opened = true; + progmemData = data; + progmemLen = len; + filePointer = 0; + return true; } -uint32_t AudioFileSourcePROGMEM::getSize() -{ - if (!opened) return 0; - return progmemLen; +uint32_t AudioFileSourcePROGMEM::getSize() { + if (!opened) { + return 0; + } + return progmemLen; } -bool AudioFileSourcePROGMEM::isOpen() -{ - return opened; +bool AudioFileSourcePROGMEM::isOpen() { + return opened; } -bool AudioFileSourcePROGMEM::close() -{ - opened = false; - progmemData = NULL; - progmemLen = 0; - filePointer = 0; - return true; -} - -bool AudioFileSourcePROGMEM::seek(int32_t pos, int dir) -{ - if (!opened) return false; - uint32_t newPtr; - switch (dir) { +bool AudioFileSourcePROGMEM::close() { + opened = false; + progmemData = NULL; + progmemLen = 0; + filePointer = 0; + return true; +} + +bool AudioFileSourcePROGMEM::seek(int32_t pos, int dir) { + if (!opened) { + return false; + } + uint32_t newPtr; + switch (dir) { case SEEK_SET: newPtr = pos; break; case SEEK_CUR: newPtr = filePointer + pos; break; case SEEK_END: newPtr = progmemLen - pos; break; default: return false; - } - if (newPtr > progmemLen) return false; - filePointer = newPtr; - return true; + } + if (newPtr > progmemLen) { + return false; + } + filePointer = newPtr; + return true; } -uint32_t AudioFileSourcePROGMEM::read(void *data, uint32_t len) -{ - if (!opened) return 0; - if (filePointer >= progmemLen) return 0; - - uint32_t toRead = progmemLen - filePointer; - if (toRead > len) toRead = len; - - memcpy_P(data, reinterpret_cast(progmemData)+filePointer, toRead); - filePointer += toRead; - return toRead; +uint32_t AudioFileSourcePROGMEM::read(void *data, uint32_t len) { + if (!opened) { + return 0; + } + if (filePointer >= progmemLen) { + return 0; + } + + uint32_t toRead = progmemLen - filePointer; + if (toRead > len) { + toRead = len; + } + + memcpy_P(data, reinterpret_cast(progmemData) + filePointer, toRead); + filePointer += toRead; + return toRead; } diff --git a/src/AudioFileSourcePROGMEM.h b/src/AudioFileSourcePROGMEM.h index cca3cf73..f1f5b90f 100644 --- a/src/AudioFileSourcePROGMEM.h +++ b/src/AudioFileSourcePROGMEM.h @@ -1,21 +1,21 @@ /* - AudioFileSourcePROGMEM - Store a "file" as a PROGMEM array and use it as audio source data - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourcePROGMEM + Store a "file" as a PROGMEM array and use it as audio source data + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCEPROGMEM_H @@ -23,9 +23,8 @@ #include "AudioFileSource.h" -class AudioFileSourcePROGMEM : public AudioFileSource -{ - public: +class AudioFileSourcePROGMEM : public AudioFileSource { +public: AudioFileSourcePROGMEM(); AudioFileSourcePROGMEM(const void *data, uint32_t len); virtual ~AudioFileSourcePROGMEM() override; @@ -34,11 +33,17 @@ class AudioFileSourcePROGMEM : public AudioFileSource virtual bool close() override; virtual bool isOpen() override; virtual uint32_t getSize() override; - virtual uint32_t getPos() override { if (!opened) return 0; else return filePointer; }; + virtual uint32_t getPos() override { + if (!opened) { + return 0; + } else { + return filePointer; + } + }; bool open(const void *data, uint32_t len); - private: +private: bool opened; const void *progmemData; uint32_t progmemLen; diff --git a/src/AudioFileSourceSD.cpp b/src/AudioFileSourceSD.cpp index 8e1fcfb7..e9caeaac 100644 --- a/src/AudioFileSourceSD.cpp +++ b/src/AudioFileSourceSD.cpp @@ -1,78 +1,80 @@ /* - AudioFileSourceSPIFFS - Input SD card "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III + AudioFileSourceSPIFFS + Input SD card "file" to be used by AudioGenerator - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioFileSourceSD.h" -AudioFileSourceSD::AudioFileSourceSD() -{ +AudioFileSourceSD::AudioFileSourceSD() { } -AudioFileSourceSD::AudioFileSourceSD(const char *filename) -{ - open(filename); +AudioFileSourceSD::AudioFileSourceSD(const char *filename) { + open(filename); } -bool AudioFileSourceSD::open(const char *filename) -{ - f = SD.open(filename, FILE_READ); - return f; +bool AudioFileSourceSD::open(const char *filename) { + f = SD.open(filename, FILE_READ); + return f; } -AudioFileSourceSD::~AudioFileSourceSD() -{ - if (f) f.close(); +AudioFileSourceSD::~AudioFileSourceSD() { + if (f) { + f.close(); + } } -uint32_t AudioFileSourceSD::read(void *data, uint32_t len) -{ - return f.read(reinterpret_cast(data), len); +uint32_t AudioFileSourceSD::read(void *data, uint32_t len) { + return f.read(reinterpret_cast(data), len); } -bool AudioFileSourceSD::seek(int32_t pos, int dir) -{ - if (!f) return false; - if (dir==SEEK_SET) return f.seek(pos); - else if (dir==SEEK_CUR) return f.seek(f.position() + pos); - else if (dir==SEEK_END) return f.seek(f.size() + pos); - return false; +bool AudioFileSourceSD::seek(int32_t pos, int dir) { + if (!f) { + return false; + } + if (dir == SEEK_SET) { + return f.seek(pos); + } else if (dir == SEEK_CUR) { + return f.seek(f.position() + pos); + } else if (dir == SEEK_END) { + return f.seek(f.size() + pos); + } + return false; } -bool AudioFileSourceSD::close() -{ - f.close(); - return true; +bool AudioFileSourceSD::close() { + f.close(); + return true; } -bool AudioFileSourceSD::isOpen() -{ - return f?true:false; +bool AudioFileSourceSD::isOpen() { + return f ? true : false; } -uint32_t AudioFileSourceSD::getSize() -{ - if (!f) return 0; - return f.size(); +uint32_t AudioFileSourceSD::getSize() { + if (!f) { + return 0; + } + return f.size(); } -uint32_t AudioFileSourceSD::getPos() -{ - if (!f) return 0; - return f.position(); +uint32_t AudioFileSourceSD::getPos() { + if (!f) { + return 0; + } + return f.position(); } diff --git a/src/AudioFileSourceSD.h b/src/AudioFileSourceSD.h index eacd9918..0a6cdb60 100644 --- a/src/AudioFileSourceSD.h +++ b/src/AudioFileSourceSD.h @@ -1,21 +1,21 @@ /* - AudioFileSourceSPIFFS - Input SD card "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceSPIFFS + Input SD card "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCESD_H @@ -25,13 +25,12 @@ #include -class AudioFileSourceSD : public AudioFileSource -{ - public: +class AudioFileSourceSD : public AudioFileSource { +public: AudioFileSourceSD(); AudioFileSourceSD(const char *filename); virtual ~AudioFileSourceSD() override; - + virtual bool open(const char *filename) override; virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; @@ -40,7 +39,7 @@ class AudioFileSourceSD : public AudioFileSource virtual uint32_t getSize() override; virtual uint32_t getPos() override; - private: +private: File f; }; diff --git a/src/AudioFileSourceSPIFFS.h b/src/AudioFileSourceSPIFFS.h index 74efefa4..23c3952d 100644 --- a/src/AudioFileSourceSPIFFS.h +++ b/src/AudioFileSourceSPIFFS.h @@ -1,40 +1,49 @@ /* - AudioFileSourceFS - Input Arduion "file" to be used by AudioGenerator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceFS + Input Arduion "file" to be used by AudioGenerator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCESPIFFS_H #define _AUDIOFILESOURCESPIFFS_H +#ifndef ARDUINO_ARCH_RP2040 + #include #include +#ifdef ESP32 +#include +#endif + #include "AudioFileSource.h" #include "AudioFileSourceFS.h" -class AudioFileSourceSPIFFS : public AudioFileSourceFS -{ - public: +// Yes, I know SPIFFS is deprecated +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + +class AudioFileSourceSPIFFS : public AudioFileSourceFS { +public: AudioFileSourceSPIFFS() : AudioFileSourceFS(SPIFFS) { }; AudioFileSourceSPIFFS(const char *filename) : AudioFileSourceFS(SPIFFS, filename) {}; // Others are inherited from base }; +#endif #endif diff --git a/src/AudioFileSourceSPIRAMBuffer.cpp b/src/AudioFileSourceSPIRAMBuffer.cpp index fafadcea..ef9456a5 100644 --- a/src/AudioFileSourceSPIRAMBuffer.cpp +++ b/src/AudioFileSourceSPIRAMBuffer.cpp @@ -1,34 +1,35 @@ /* - AudioFileSourceSPIRAMBuffer - Buffered file source in external SPI RAM + AudioFileSourceSPIRAMBuffer + Buffered file source in external SPI RAM - Copyright (C) 2017 Sebastien Decourriere - Based on AudioFileSourceBuffer class from Earle F. Philhower, III + Copyright (C) 2017 Sebastien Decourriere + Based on AudioFileSourceBuffer class from Earle F. Philhower, III - Copyright (C) 2020 Earle F. Philhower, III - Rewritten for speed and functionality + Copyright (C) 2020 Earle F. Philhower, III + Rewritten for speed and functionality - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +#if defined(ESP32) || defined(ESP8266) + #include #include "AudioFileSourceSPIRAMBuffer.h" #pragma GCC optimize ("O3") -AudioFileSourceSPIRAMBuffer::AudioFileSourceSPIRAMBuffer(AudioFileSource *source, uint8_t csPin, uint32_t buffSizeBytes) -{ +AudioFileSourceSPIRAMBuffer::AudioFileSourceSPIRAMBuffer(AudioFileSource *source, uint8_t csPin, uint32_t buffSizeBytes) { ram.begin(40, csPin); ramSize = buffSizeBytes; writePtr = 0; @@ -38,13 +39,11 @@ AudioFileSourceSPIRAMBuffer::AudioFileSourceSPIRAMBuffer(AudioFileSource *source audioLogger->printf_P(PSTR("SPI RAM buffer size: %u Bytes\n"), ramSize); } -AudioFileSourceSPIRAMBuffer::~AudioFileSourceSPIRAMBuffer() -{ +AudioFileSourceSPIRAMBuffer::~AudioFileSourceSPIRAMBuffer() { ram.end(); } -bool AudioFileSourceSPIRAMBuffer::seek(int32_t pos, int dir) -{ +bool AudioFileSourceSPIRAMBuffer::seek(int32_t pos, int dir) { // Invalidate readPtr = 0; writePtr = 0; @@ -52,28 +51,23 @@ bool AudioFileSourceSPIRAMBuffer::seek(int32_t pos, int dir) return src->seek(pos, dir); } -bool AudioFileSourceSPIRAMBuffer::close() -{ +bool AudioFileSourceSPIRAMBuffer::close() { return src->close(); } -bool AudioFileSourceSPIRAMBuffer::isOpen() -{ +bool AudioFileSourceSPIRAMBuffer::isOpen() { return src->isOpen(); } -uint32_t AudioFileSourceSPIRAMBuffer::getSize() -{ +uint32_t AudioFileSourceSPIRAMBuffer::getSize() { return src->getSize(); } -uint32_t AudioFileSourceSPIRAMBuffer::getPos() -{ +uint32_t AudioFileSourceSPIRAMBuffer::getPos() { return src->getPos() - (writePtr - readPtr); } -uint32_t AudioFileSourceSPIRAMBuffer::read(void *data, uint32_t len) -{ +uint32_t AudioFileSourceSPIRAMBuffer::read(void *data, uint32_t len) { uint32_t bytes = 0; // Check if the buffer isn't empty, otherwise we try to fill completely @@ -88,7 +82,9 @@ uint32_t AudioFileSourceSPIRAMBuffer::read(void *data, uint32_t len) int length = src->read(buffer, toRead); if (length > 0) { #ifdef FAKERAM - for (size_t i=0; i(data); if (toReadFromBuffer > 0) { #ifdef FAKERAM - for (size_t i=0; ireadNonBlock(buffer, sizeof(buffer)); if (cnt) { #ifdef FAKERAM - for (size_t i=0; iloop()) return false; + if (!src->loop()) { + return false; + } fill(); if ((ESP.getCycleCount() - last) > microsecondsToClockCycles(1000000)) { last = ESP.getCycleCount(); - char str[65]; - memset(str, '#', 64); - str[64] = 0; - str[((writePtr - readPtr) * 64)/ramSize] = 0; - cb.st(((writePtr - readPtr) * 100)/ramSize, str); + char str[65]; + memset(str, '#', 64); + str[64] = 0; + str[((writePtr - readPtr) * 64) / ramSize] = 0; + cb.st(((writePtr - readPtr) * 100) / ramSize, str); } return true; } + +#endif diff --git a/src/AudioFileSourceSPIRAMBuffer.h b/src/AudioFileSourceSPIRAMBuffer.h index 19d915f1..1f2053a0 100644 --- a/src/AudioFileSourceSPIRAMBuffer.h +++ b/src/AudioFileSourceSPIRAMBuffer.h @@ -1,26 +1,26 @@ /* - AudioFileSourceSPIRAMBuffer - Buffered file source in external SPI RAM + AudioFileSourceSPIRAMBuffer + Buffered file source in external SPI RAM - Copyright (C) 2017 Sebastien Decourriere - Based on AudioFileSourceBuffer class from Earle F. Philhower, III + Copyright (C) 2017 Sebastien Decourriere + Based on AudioFileSourceBuffer class from Earle F. Philhower, III - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCESPIRAMBUFFER_H -#define _AUDIOFILESOURCESPIRAMBUFFER_H +#if defined(ESP32) || defined(ESP8266) +#pragma once #include "AudioFileSource.h" #include @@ -28,13 +28,12 @@ //#define FAKERAM // #define SPIBUF_DEBUG -class AudioFileSourceSPIRAMBuffer : public AudioFileSource -{ - public: +class AudioFileSourceSPIRAMBuffer : public AudioFileSource { +public: #ifdef FAKERAM AudioFileSourceSPIRAMBuffer(AudioFileSource *in, uint8_t csPin = 15, uint32_t bufferBytes = 2048); #else - AudioFileSourceSPIRAMBuffer(AudioFileSource *in, uint8_t csPin = 15, uint32_t bufferBytes = 128*1024); + AudioFileSourceSPIRAMBuffer(AudioFileSource *in, uint8_t csPin = 15, uint32_t bufferBytes = 128 * 1024); #endif virtual ~AudioFileSourceSPIRAMBuffer() override; @@ -46,10 +45,10 @@ class AudioFileSourceSPIRAMBuffer : public AudioFileSource virtual uint32_t getPos() override; virtual bool loop() override; - private: +private: virtual void fill(); - private: +private: AudioFileSource *src; ESP8266SPIRAM ram; size_t ramSize; diff --git a/src/AudioFileSourceSTDIO.cpp b/src/AudioFileSourceSTDIO.cpp index 75d0cd12..8c8499a6 100644 --- a/src/AudioFileSourceSTDIO.cpp +++ b/src/AudioFileSourceSTDIO.cpp @@ -1,22 +1,22 @@ /* - AudioFileSourceSTDIO - Input STDIO "file" to be used by AudioGenerator - Only for hot-based testing - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceSTDIO + Input STDIO "file" to be used by AudioGenerator + Only for hot-based testing + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include @@ -25,73 +25,68 @@ #include "AudioFileSourceSTDIO.h" -AudioFileSourceSTDIO::AudioFileSourceSTDIO() -{ - f = NULL; - srand(time(NULL)); +AudioFileSourceSTDIO::AudioFileSourceSTDIO() { + f = NULL; + srand(time(NULL)); } -AudioFileSourceSTDIO::AudioFileSourceSTDIO(const char *filename) -{ - open(filename); +AudioFileSourceSTDIO::AudioFileSourceSTDIO(const char *filename) { + open(filename); } -bool AudioFileSourceSTDIO::open(const char *filename) -{ - f = fopen(filename, "rb"); - return f; +bool AudioFileSourceSTDIO::open(const char *filename) { + f = fopen(filename, "rb"); + return f; } -AudioFileSourceSTDIO::~AudioFileSourceSTDIO() -{ - if (f) fclose(f); - f = NULL; +AudioFileSourceSTDIO::~AudioFileSourceSTDIO() { + if (f) { + fclose(f); + } + f = NULL; } -uint32_t AudioFileSourceSTDIO::read(void *data, uint32_t len) -{ -// if (rand() % 100 == 69) { // Give 0 data 1% -// printf("0 read\n"); -// len = 0; -// } else if (rand() % 100 == 1) { // Give short reads 1% -// printf("0 read\n"); -// len = 0; -// } - int ret = fread(reinterpret_cast(data), 1, len, f); -// if (ret && rand() % 100 < 5 ) { -// // We're really mean...throw bad data in the mix -// printf("bad data\n"); -// for (int i=0; i<100; i++) -// *(reinterpret_cast(data) + (rand() % ret)) = rand(); -// } - return ret; +uint32_t AudioFileSourceSTDIO::read(void *data, uint32_t len) { + // if (rand() % 100 == 69) { // Give 0 data 1% + // printf("0 read\n"); + // len = 0; + // } else if (rand() % 100 == 1) { // Give short reads 1% + // printf("0 read\n"); + // len = 0; + // } + int ret = fread(reinterpret_cast(data), 1, len, f); + // if (ret && rand() % 100 < 5 ) { + // // We're really mean...throw bad data in the mix + // printf("bad data\n"); + // for (int i=0; i<100; i++) + // *(reinterpret_cast(data) + (rand() % ret)) = rand(); + // } + return ret; } -bool AudioFileSourceSTDIO::seek(int32_t pos, int dir) -{ - return fseek(f, pos, dir); +bool AudioFileSourceSTDIO::seek(int32_t pos, int dir) { + return fseek(f, pos, dir) == 0; } -bool AudioFileSourceSTDIO::close() -{ - fclose(f); - f = NULL; - return true; +bool AudioFileSourceSTDIO::close() { + fclose(f); + f = NULL; + return true; } -bool AudioFileSourceSTDIO::isOpen() -{ - return f?true:false; +bool AudioFileSourceSTDIO::isOpen() { + return f ? true : false; } -uint32_t AudioFileSourceSTDIO::getSize() -{ - if (!f) return 0; - uint32_t p = ftell(f); - fseek(f, 0, SEEK_END); - uint32_t len = ftell(f); - fseek(f, p, SEEK_SET); - return len; +uint32_t AudioFileSourceSTDIO::getSize() { + if (!f) { + return 0; + } + uint32_t p = ftell(f); + fseek(f, 0, SEEK_END); + uint32_t len = ftell(f); + fseek(f, p, SEEK_SET); + return len; } diff --git a/src/AudioFileSourceSTDIO.h b/src/AudioFileSourceSTDIO.h index 46a46813..eaa6001d 100644 --- a/src/AudioFileSourceSTDIO.h +++ b/src/AudioFileSourceSTDIO.h @@ -1,22 +1,22 @@ /* - AudioFileSourceSTDIO - Input SPIFFS "file" to be used by AudioGenerator - Only for host-based testing, not Arduino - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileSourceSTDIO + Input SPIFFS "file" to be used by AudioGenerator + Only for host-based testing, not Arduino + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOFILESOURCESTDIO_H @@ -28,22 +28,27 @@ #include "AudioFileSource.h" -class AudioFileSourceSTDIO : public AudioFileSource -{ - public: +class AudioFileSourceSTDIO : public AudioFileSource { +public: AudioFileSourceSTDIO(); AudioFileSourceSTDIO(const char *filename); virtual ~AudioFileSourceSTDIO() override; - + virtual bool open(const char *filename) override; virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; virtual bool close() override; virtual bool isOpen() override; virtual uint32_t getSize() override; - virtual uint32_t getPos() override { if (!f) return 0; else return (uint32_t)ftell(f); }; - - private: + virtual uint32_t getPos() override { + if (!f) { + return 0; + } else { + return (uint32_t)ftell(f); + } + }; + +private: FILE *f; }; diff --git a/src/AudioFileStream.cpp b/src/AudioFileStream.cpp index 82c5d503..64051416 100644 --- a/src/AudioFileStream.cpp +++ b/src/AudioFileStream.cpp @@ -2,60 +2,71 @@ #include "AudioFileStream.h" -AudioFileStream::AudioFileStream(AudioFileSource *source, int definedLen) -{ - src = source; - len = definedLen; - ptr = 0; - saved = -1; +AudioFileStream::AudioFileStream(AudioFileSource *source, int definedLen) { + src = source; + len = definedLen; + ptr = 0; + saved = -1; } -AudioFileStream::~AudioFileStream() -{ - // If there's a defined len, read until we're empty - if (len) { - while (ptr++ < len) (void)read(); - } +AudioFileStream::~AudioFileStream() { + // If there's a defined len, read until we're empty + if (len) { + while (ptr++ < len) { + (void)read(); + } + } } -int AudioFileStream::available() -{ - if (saved >= 0) return 1; - else if (len) return ptr - len; - else if (src->getSize()) return (src->getPos() - src->getSize()); - else return 1; +int AudioFileStream::available() { + if (saved >= 0) { + return 1; + } else if (len) { + return ptr - len; + } else if (src->getSize()) { + return (src->getPos() - src->getSize()); + } else { + return 1; + } } -int AudioFileStream::read() -{ - uint8_t c; - int r; - if (ptr >= len) return -1; - ptr++; - if (saved >= 0) { - c = (uint8_t)saved; - saved = -1; - r = 1; - } else { - r = src->read(&c, 1); - } - if (r != 1) return -1; - return (int)c; +int AudioFileStream::read() { + uint8_t c; + int r; + if (ptr >= len) { + return -1; + } + ptr++; + if (saved >= 0) { + c = (uint8_t)saved; + saved = -1; + r = 1; + } else { + r = src->read(&c, 1); + } + if (r != 1) { + return -1; + } + return (int)c; } -int AudioFileStream::peek() -{ - uint8_t c; - if ((ptr+1) >= len) return -1; - if (saved >= 0) return saved; - int r = src->read(&c, 1); - if (r<1) return -1; - saved = c; - return saved; +int AudioFileStream::peek() { + uint8_t c; + if ((ptr + 1) >= len) { + return -1; + } + if (saved >= 0) { + return saved; + } + int r = src->read(&c, 1); + if (r < 1) { + return -1; + } + saved = c; + return saved; } -void AudioFileStream::flush() -{ - /* noop? */ +void AudioFileStream::flush() { + /* noop? */ } diff --git a/src/AudioFileStream.h b/src/AudioFileStream.h index e165751c..f2b5ee79 100644 --- a/src/AudioFileStream.h +++ b/src/AudioFileStream.h @@ -1,21 +1,21 @@ /* - AudioFileStream - Convert an AudioFileSource* to a Stream* - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioFileStream + Convert an AudioFileSource* to a Stream* + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef AUDIOFILESTREAM_H @@ -24,25 +24,27 @@ #include #include "AudioFileSource.h" -class AudioFileStream : public Stream -{ +class AudioFileStream : public Stream { public: - AudioFileStream(AudioFileSource *source, int definedLen); - virtual ~AudioFileStream(); + AudioFileStream(AudioFileSource *source, int definedLen); + virtual ~AudioFileStream(); public: - // Stream interface - see the Arduino library documentation. - virtual int available() override; - virtual int read() override; - virtual int peek() override; - virtual void flush() override; - virtual size_t write(uint8_t x) override { (void)x; return 0; }; + // Stream interface - see the Arduino library documentation. + virtual int available() override; + virtual int read() override; + virtual int peek() override; + virtual void flush() override; + virtual size_t write(uint8_t x) override { + (void)x; + return 0; + }; private: - AudioFileSource *src; - int saved; - int len; - int ptr; + AudioFileSource *src; + int saved; + int len; + int ptr; }; #endif diff --git a/src/AudioGenerator.h b/src/AudioGenerator.h index 889b2285..cda6ba84 100644 --- a/src/AudioGenerator.h +++ b/src/AudioGenerator.h @@ -1,21 +1,21 @@ /* - AudioGenerator - Base class of an audio output generator - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGenerator + Base class of an audio output generator + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATOR_H @@ -26,27 +26,44 @@ #include "AudioFileSource.h" #include "AudioOutput.h" -class AudioGenerator -{ - public: - AudioGenerator() { lastSample[0] = 0; lastSample[1] = 0; }; +class AudioGenerator { +public: + AudioGenerator() { + lastSample[0] = 0; + lastSample[1] = 0; + }; virtual ~AudioGenerator() {}; - virtual bool begin(AudioFileSource *source, AudioOutput *output) { (void)source; (void)output; return false; }; - virtual bool loop() { return false; }; - virtual bool stop() { return false; }; - virtual bool isRunning() { return false;}; + virtual bool begin(AudioFileSource *source, AudioOutput *output) { + (void)source; + (void)output; + return false; + }; + virtual bool loop() { + return false; + }; + virtual bool stop() { + return false; + }; + virtual bool isRunning() { + return false; + }; + virtual void desync() { }; - public: - virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { return cb.RegisterMetadataCB(fn, data); } - virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { return cb.RegisterStatusCB(fn, data); } +public: + virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { + return cb.RegisterMetadataCB(fn, data); + } + virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { + return cb.RegisterStatusCB(fn, data); + } - protected: +protected: bool running; AudioFileSource *file; AudioOutput *output; int16_t lastSample[2]; - protected: +protected: AudioStatus cb; }; diff --git a/src/AudioGeneratorAAC.cpp b/src/AudioGeneratorAAC.cpp index 98f72078..b8848b7d 100644 --- a/src/AudioGeneratorAAC.cpp +++ b/src/AudioGeneratorAAC.cpp @@ -1,214 +1,223 @@ /* - AudioGeneratorAAC - Audio output generator using the Helix AAC decoder - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorAAC + Audio output generator using the Helix AAC decoder + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #pragma GCC optimize ("O3") #include "AudioGeneratorAAC.h" -AudioGeneratorAAC::AudioGeneratorAAC() -{ - preallocateSpace = NULL; - preallocateSize = 0; - - running = false; - file = NULL; - output = NULL; - - buff = (uint8_t*)malloc(buffLen); - outSample = (int16_t*)malloc(1024 * 2 * sizeof(uint16_t)); - if (!buff || !outSample) { - audioLogger->printf_P(PSTR("ERROR: Out of memory in AAC\n")); - Serial.flush(); - } - - hAACDecoder = AACInitDecoder(); - if (!hAACDecoder) { - audioLogger->printf_P(PSTR("Out of memory error! hAACDecoder==NULL\n")); - Serial.flush(); - } - - buffValid = 0; - lastFrameEnd = 0; - validSamples = 0; - curSample = 0; - lastRate = 0; - lastChannels = 0; -} +AudioGeneratorAAC::AudioGeneratorAAC() { + preallocateSpace = NULL; + preallocateSize = 0; -AudioGeneratorAAC::AudioGeneratorAAC(void *preallocateData, int preallocateSz) -{ - preallocateSpace = preallocateData; - preallocateSize = preallocateSz; - - running = false; - file = NULL; - output = NULL; - - uint8_t *p = (uint8_t*)preallocateSpace; - buff = (uint8_t*) p; - p += (buffLen + 7) & ~7; - outSample = (int16_t*) p; - p += (1024 * 2 * sizeof(int16_t) + 7) & ~7; - int used = p - (uint8_t*)preallocateSpace; - int availSpace = preallocateSize - used; - if (availSpace < 0 ) { - audioLogger->printf_P(PSTR("ERROR: Out of memory in AAC\n")); - } - - hAACDecoder = AACInitDecoderPre(p, availSpace); - if (!hAACDecoder) { - audioLogger->printf_P(PSTR("Out of memory error! hAACDecoder==NULL\n")); - Serial.flush(); - } - buffValid = 0; - lastFrameEnd = 0; - validSamples = 0; - curSample = 0; - lastRate = 0; - lastChannels = 0; -} + running = false; + file = NULL; + output = NULL; + buff = (uint8_t*)malloc(buffLen); + outSample = (int16_t*)malloc(1024 * 2 * sizeof(uint16_t)); + if (!buff || !outSample) { + audioLogger->printf_P(PSTR("ERROR: Out of memory in AAC\n")); + Serial.flush(); + } + hAACDecoder = AACInitDecoder(); + if (!hAACDecoder) { + audioLogger->printf_P(PSTR("Out of memory error! hAACDecoder==NULL\n")); + Serial.flush(); + } -AudioGeneratorAAC::~AudioGeneratorAAC() -{ - if (!preallocateSpace) { - AACFreeDecoder(hAACDecoder); - free(buff); - free(outSample); - } + buffValid = 0; + lastFrameEnd = 0; + validSamples = 0; + curSample = 0; + lastRate = 0; + lastChannels = 0; } -bool AudioGeneratorAAC::stop() -{ - running = false; - output->stop(); - return file->close(); -} +AudioGeneratorAAC::AudioGeneratorAAC(void *preallocateData, int preallocateSz) { + preallocateSpace = preallocateData; + preallocateSize = preallocateSz; + + running = false; + file = NULL; + output = NULL; + + uint8_t *p = (uint8_t*)preallocateSpace; + buff = (uint8_t*) p; + p += (buffLen + 7) & ~7; + outSample = (int16_t*) p; + p += (1024 * 2 * sizeof(int16_t) + 7) & ~7; + int used = p - (uint8_t*)preallocateSpace; + int availSpace = preallocateSize - used; + if (availSpace < 0) { + audioLogger->printf_P(PSTR("ERROR: Out of memory in AAC\n")); + } -bool AudioGeneratorAAC::isRunning() -{ - return running; + hAACDecoder = AACInitDecoderPre(p, availSpace); + if (!hAACDecoder) { + audioLogger->printf_P(PSTR("Out of memory error! hAACDecoder==NULL\n")); + Serial.flush(); + } + buffValid = 0; + lastFrameEnd = 0; + validSamples = 0; + curSample = 0; + lastRate = 0; + lastChannels = 0; } -bool AudioGeneratorAAC::FillBufferWithValidFrame() -{ - buff[0] = 0; // Destroy any existing sync word @ 0 - int nextSync; - do { - nextSync = AACFindSyncWord(buff + lastFrameEnd, buffValid - lastFrameEnd); - if (nextSync >= 0) nextSync += lastFrameEnd; - lastFrameEnd = 0; - if (nextSync == -1) { - if (buffValid && buff[buffValid-1]==0xff) { // Could be 1st half of syncword, preserve it... - buff[0] = 0xff; - buffValid = file->read(buff+1, buffLen-1); - if (buffValid==0) return false; // No data available, EOF - } else { // Try a whole new buffer - buffValid = file->read(buff, buffLen-1); - if (buffValid==0) return false; // No data available, EOF - } + + +AudioGeneratorAAC::~AudioGeneratorAAC() { + if (!preallocateSpace) { + AACFreeDecoder(hAACDecoder); + free(buff); + free(outSample); } - } while (nextSync == -1); +} - // Move the frame to start at offset 0 in the buffer - buffValid -= nextSync; // Throw out prior to nextSync - memmove(buff, buff+nextSync, buffValid); +bool AudioGeneratorAAC::stop() { + running = false; + output->stop(); + return file->close(); +} - // We have a sync word at 0 now, try and fill remainder of buffer - buffValid += file->read(buff + buffValid, buffLen - buffValid); +bool AudioGeneratorAAC::isRunning() { + return running; +} - return true; +bool AudioGeneratorAAC::FillBufferWithValidFrame() { + buff[0] = 0; // Destroy any existing sync word @ 0 + int nextSync; + do { + nextSync = AACFindSyncWord(buff + lastFrameEnd, buffValid - lastFrameEnd); + if (nextSync >= 0) { + nextSync += lastFrameEnd; + } + lastFrameEnd = 0; + if (nextSync == -1) { + if (buffValid && buff[buffValid - 1] == 0xff) { // Could be 1st half of syncword, preserve it... + buff[0] = 0xff; + buffValid = file->read(buff + 1, buffLen - 1); + if (buffValid == 0) { + return false; // No data available, EOF + } + } else { // Try a whole new buffer + buffValid = file->read(buff, buffLen - 1); + if (buffValid == 0) { + return false; // No data available, EOF + } + } + } + } while (nextSync == -1); + + // Move the frame to start at offset 0 in the buffer + buffValid -= nextSync; // Throw out prior to nextSync + memmove(buff, buff + nextSync, buffValid); + + // We have a sync word at 0 now, try and fill remainder of buffer + buffValid += file->read(buff + buffValid, buffLen - buffValid); + + return true; } -bool AudioGeneratorAAC::loop() -{ - if (!running) goto done; // Nothing to do here! - - // If we've got data, try and pump it out... - while (validSamples) { - lastSample[0] = outSample[curSample*2]; - lastSample[1] = outSample[curSample*2 + 1]; - if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected - validSamples--; - curSample++; - } - - // No samples available, need to decode a new frame - if (FillBufferWithValidFrame()) { - // buff[0] start of frame, decode it... - unsigned char *inBuff = reinterpret_cast(buff); - int bytesLeft = buffValid; - int ret = AACDecode(hAACDecoder, &inBuff, &bytesLeft, outSample); - if (ret) { - // Error, skip the frame... - char buff[48]; - sprintf_P(buff, PSTR("AAC decode error %d"), ret); - cb.st(ret, buff); +bool AudioGeneratorAAC::loop() { + if (!running) { + goto done; // Nothing to do here! + } + + // If we've got data, try and pump it out... + while (validSamples) { + if (lastChannels == 1) { + lastSample[0] = outSample[curSample]; + lastSample[1] = outSample[curSample]; + } else { + lastSample[0] = outSample[curSample * 2]; + lastSample[1] = outSample[curSample * 2 + 1]; + } + if (!output->ConsumeSample(lastSample)) { + goto done; // Can't send, but no error detected + } + validSamples--; + curSample++; + } + + // No samples available, need to decode a new frame + if (FillBufferWithValidFrame()) { + // buff[0] start of frame, decode it... + unsigned char *inBuff = reinterpret_cast(buff); + int bytesLeft = buffValid; + int ret = AACDecode(hAACDecoder, &inBuff, &bytesLeft, outSample); + if (ret) { + // Error, skip the frame... + char buff[48]; + sprintf_P(buff, PSTR("AAC decode error %d"), ret); + cb.st(ret, buff); + } else { + lastFrameEnd = buffValid - bytesLeft; + AACFrameInfo fi; + AACGetLastFrameInfo(hAACDecoder, &fi); + if ((int)fi.sampRateOut != (int)lastRate) { + output->SetRate(fi.sampRateOut); + lastRate = fi.sampRateOut; + } + if (fi.nChans != lastChannels) { + output->SetChannels(fi.nChans); + lastChannels = fi.nChans; + } + curSample = 0; + validSamples = fi.outputSamps / lastChannels; + } } else { - lastFrameEnd = buffValid - bytesLeft; - AACFrameInfo fi; - AACGetLastFrameInfo(hAACDecoder, &fi); - if ((int)fi.sampRateOut != (int)lastRate) { - output->SetRate(fi.sampRateOut); - lastRate = fi.sampRateOut; - } - if (fi.nChans != lastChannels) { - output->SetChannels(fi.nChans); - lastChannels = fi.nChans; - } - curSample = 0; - validSamples = fi.outputSamps / lastChannels; + running = false; // No more data, we're done here... } - } else { - running = false; // No more data, we're done here... - } done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorAAC::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) return false; - file = source; - if (!output) return false; - this->output = output; - if (!file->isOpen()) return false; // Error - - output->begin(); - - // AAC always comes out at 16 bits - output->SetBitsPerSample(16); - - - memset(buff, 0, buffLen); - memset(outSample, 0, 1024*2*sizeof(int16_t)); - - - running = true; - - return true; +bool AudioGeneratorAAC::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + return false; + } + file = source; + if (!output) { + return false; + } + this->output = output; + if (!file->isOpen()) { + return false; // Error + } + + output->begin(); + + memset(buff, 0, buffLen); + memset(outSample, 0, 1024 * 2 * sizeof(int16_t)); + + + running = true; + + return true; } diff --git a/src/AudioGeneratorAAC.h b/src/AudioGeneratorAAC.h index 2184e7e0..b8ad0b5b 100644 --- a/src/AudioGeneratorAAC.h +++ b/src/AudioGeneratorAAC.h @@ -1,21 +1,21 @@ /* - AudioGeneratorAAC - Audio output generator using the Helix AAC decoder - - Copyright (C) 2017 Earle F. Philhower, III + AudioGeneratorAAC + Audio output generator using the Helix AAC decoder - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORAAC_H @@ -24,9 +24,8 @@ #include "AudioGenerator.h" #include "libhelix-aac/aacdec.h" -class AudioGeneratorAAC : public AudioGenerator -{ - public: +class AudioGeneratorAAC : public AudioGenerator { +public: AudioGeneratorAAC(); AudioGeneratorAAC(void *preallocateData, int preallocateSize); virtual ~AudioGeneratorAAC() override; @@ -35,7 +34,7 @@ class AudioGeneratorAAC : public AudioGenerator virtual bool stop() override; virtual bool isRunning() override; - protected: +protected: void *preallocateSpace; int preallocateSize; diff --git a/src/AudioGeneratorFLAC.cpp b/src/AudioGeneratorFLAC.cpp index 4878a6e9..813e93f3 100644 --- a/src/AudioGeneratorFLAC.cpp +++ b/src/AudioGeneratorFLAC.cpp @@ -1,199 +1,238 @@ /* - AudioGeneratorFLAC - Audio output generator that plays FLAC audio files - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorFLAC + Audio output generator that plays FLAC audio files + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include -AudioGeneratorFLAC::AudioGeneratorFLAC() -{ - flac = NULL; - channels = 0; - sampleRate = 0; - bitsPerSample = 0; - buff[0] = NULL; - buff[1] = NULL; - buffPtr = 0; - buffLen = 0; - running = false; +AudioGeneratorFLAC::AudioGeneratorFLAC() { + flac = NULL; + channels = 0; + sampleRate = 0; + bitsPerSample = 0; + buff[0] = NULL; + buff[1] = NULL; + buffPtr = 0; + buffLen = 0; + running = false; } -AudioGeneratorFLAC::~AudioGeneratorFLAC() -{ - if (flac) - FLAC__stream_decoder_delete(flac); - flac = NULL; +AudioGeneratorFLAC::~AudioGeneratorFLAC() { + if (flac) { + FLAC__stream_decoder_delete(flac); + } + flac = NULL; } -bool AudioGeneratorFLAC::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) return false; - file = source; - if (!output) return false; - this->output = output; - if (!file->isOpen()) return false; // Error - - flac = FLAC__stream_decoder_new(); - if (!flac) return false; - - (void)FLAC__stream_decoder_set_md5_checking(flac, false); - - FLAC__StreamDecoderInitStatus ret = FLAC__stream_decoder_init_stream(flac, _read_cb, _seek_cb, _tell_cb, _length_cb, _eof_cb, _write_cb, _metadata_cb, _error_cb, reinterpret_cast(this) ); - if (ret != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - FLAC__stream_decoder_delete(flac); - flac = NULL; - return false; - } +bool AudioGeneratorFLAC::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + return false; + } + file = source; + if (!output) { + return false; + } + this->output = output; + if (!file->isOpen()) { + return false; // Error + } - output->begin(); - running = true; - return true; -} + flac = FLAC__stream_decoder_new(); + if (!flac) { + return false; + } + + (void)FLAC__stream_decoder_set_md5_checking(flac, false); -bool AudioGeneratorFLAC::loop() -{ - FLAC__bool ret; + FLAC__StreamDecoderInitStatus ret = FLAC__stream_decoder_init_stream(flac, _read_cb, _seek_cb, _tell_cb, _length_cb, _eof_cb, _write_cb, _metadata_cb, _error_cb, reinterpret_cast(this)); + if (ret != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + FLAC__stream_decoder_delete(flac); + flac = NULL; + return false; + } - if (!running) goto done; + output->begin(); + running = true; + lastSample[0] = 0; + lastSample[1] = 0; + channels = 0; + return true; +} - if (!output->ConsumeSample(lastSample)) goto done; // Try and send last buffered sample +bool AudioGeneratorFLAC::loop() { + FLAC__bool ret; - do { - if (buffPtr == buffLen) { - ret = FLAC__stream_decoder_process_single(flac); - if (!ret) { - running = false; + if (!running) { goto done; - } else { - // We might be done... - if (FLAC__stream_decoder_get_state(flac)==FLAC__STREAM_DECODER_END_OF_STREAM) { - running = false; - goto done; - } - unsigned newsr = FLAC__stream_decoder_get_sample_rate(flac); - unsigned newch = FLAC__stream_decoder_get_channels(flac); - unsigned newbps = FLAC__stream_decoder_get_bits_per_sample(flac); - if (newsr != sampleRate) output->SetRate(sampleRate = newsr); - if (newch != channels) output->SetChannels(channels = newch); - if (newbps != bitsPerSample) output->SetBitsPerSample( bitsPerSample = newbps); - } } - // Check for some weird case where above didn't give any data - if (buffPtr == buffLen) { - goto done; // At some point the flac better error and we'll retudn - } - if (bitsPerSample <= 16) { - lastSample[AudioOutput::LEFTCHANNEL] = buff[0][buffPtr] & 0xffff; - if (channels==2) lastSample[AudioOutput::RIGHTCHANNEL] = buff[1][buffPtr] & 0xffff; - else lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; - } else if (bitsPerSample <= 24) { - lastSample[AudioOutput::LEFTCHANNEL] = (buff[0][buffPtr]>>8) & 0xffff; - if (channels==2) lastSample[AudioOutput::RIGHTCHANNEL] = (buff[1][buffPtr]>>8) & 0xffff; - else lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; - } else { - lastSample[AudioOutput::LEFTCHANNEL] = (buff[0][buffPtr]>>16) & 0xffff; - if (channels==2) lastSample[AudioOutput::RIGHTCHANNEL] = (buff[1][buffPtr]>>16) & 0xffff; - else lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; + if (channels && !output->ConsumeSample(lastSample)) { + goto done; // Try and send last buffered sample } - buffPtr++; - } while (running && output->ConsumeSample(lastSample)); + + do { + if (buffPtr == buffLen) { + ret = FLAC__stream_decoder_process_single(flac); + if (!ret) { + running = false; + goto done; + } else { + // We might be done... + if (FLAC__stream_decoder_get_state(flac) == FLAC__STREAM_DECODER_END_OF_STREAM) { + running = false; + goto done; + } + unsigned newsr = FLAC__stream_decoder_get_sample_rate(flac); + unsigned newch = FLAC__stream_decoder_get_channels(flac); + unsigned newbps = FLAC__stream_decoder_get_bits_per_sample(flac); + if (newsr != sampleRate) { + output->SetRate(sampleRate = newsr); + } + if (newch != channels) { + output->SetChannels(channels = newch); + } + if (newbps != bitsPerSample) { + bitsPerSample = newbps; + } + } + } + + // Check for some weird case where above didn't give any data + if (buffPtr == buffLen) { + goto done; // At some point the flac better error and we'll return + } + if (bitsPerSample <= 8) { + lastSample[AudioOutput::LEFTCHANNEL] = buff[0][buffPtr] & 0xffff; + if (channels == 2) { + lastSample[AudioOutput::RIGHTCHANNEL] = buff[1][buffPtr] & 0xffff; + } else { + lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; + } + // Upsample from unsigned 8 bits to signed 16 bits + lastSample[AudioOutput::LEFTCHANNEL] = (((int16_t)(lastSample[AudioOutput::LEFTCHANNEL] & 0xff)) - 128) << 8; + lastSample[AudioOutput::RIGHTCHANNEL] = (((int16_t)(lastSample[AudioOutput::RIGHTCHANNEL] & 0xff)) - 128) << 8; + } else if (bitsPerSample <= 16) { + lastSample[AudioOutput::LEFTCHANNEL] = buff[0][buffPtr] & 0xffff; + if (channels == 2) { + lastSample[AudioOutput::RIGHTCHANNEL] = buff[1][buffPtr] & 0xffff; + } else { + lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; + } + } else if (bitsPerSample <= 24) { + lastSample[AudioOutput::LEFTCHANNEL] = (buff[0][buffPtr] >> 8) & 0xffff; + if (channels == 2) { + lastSample[AudioOutput::RIGHTCHANNEL] = (buff[1][buffPtr] >> 8) & 0xffff; + } else { + lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; + } + } else { + lastSample[AudioOutput::LEFTCHANNEL] = (buff[0][buffPtr] >> 16) & 0xffff; + if (channels == 2) { + lastSample[AudioOutput::RIGHTCHANNEL] = (buff[1][buffPtr] >> 16) & 0xffff; + } else { + lastSample[AudioOutput::RIGHTCHANNEL] = lastSample[AudioOutput::LEFTCHANNEL]; + } + } + buffPtr++; + } while (running && output->ConsumeSample(lastSample)); done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorFLAC::stop() -{ - if (flac) - FLAC__stream_decoder_delete(flac); - flac = NULL; - running = false; - output->stop(); - return true; +bool AudioGeneratorFLAC::stop() { + if (flac) { + FLAC__stream_decoder_delete(flac); + } + flac = NULL; + running = false; + output->stop(); + return true; } -bool AudioGeneratorFLAC::isRunning() -{ - return running; +bool AudioGeneratorFLAC::isRunning() { + return running; } -FLAC__StreamDecoderReadStatus AudioGeneratorFLAC::read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) -{ - (void) decoder; - if (*bytes==0) return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - *bytes = file->read(buffer, sizeof(FLAC__byte) * (*bytes)); - if (*bytes==0) return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +FLAC__StreamDecoderReadStatus AudioGeneratorFLAC::read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) { + (void) decoder; + if (*bytes == 0) { + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + *bytes = file->read(buffer, sizeof(FLAC__byte) * (*bytes)); + if (*bytes == 0) { + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } -FLAC__StreamDecoderSeekStatus AudioGeneratorFLAC::seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset) -{ - (void) decoder; - if (!file->seek((int32_t)absolute_byte_offset, 0)) return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +FLAC__StreamDecoderSeekStatus AudioGeneratorFLAC::seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset) { + (void) decoder; + if (!file->seek((int32_t)absolute_byte_offset, 0)) { + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + } + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } -FLAC__StreamDecoderTellStatus AudioGeneratorFLAC::tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset) -{ - (void) decoder; - *absolute_byte_offset = file->getPos(); - return FLAC__STREAM_DECODER_TELL_STATUS_OK; +FLAC__StreamDecoderTellStatus AudioGeneratorFLAC::tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset) { + (void) decoder; + *absolute_byte_offset = file->getPos(); + return FLAC__STREAM_DECODER_TELL_STATUS_OK; } -FLAC__StreamDecoderLengthStatus AudioGeneratorFLAC::length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length) -{ - (void) decoder; - *stream_length = file->getSize(); - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +FLAC__StreamDecoderLengthStatus AudioGeneratorFLAC::length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length) { + (void) decoder; + *stream_length = file->getSize(); + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } -FLAC__bool AudioGeneratorFLAC::eof_cb(const FLAC__StreamDecoder *decoder) -{ - (void) decoder; - if (file->getPos() >= file->getSize()) return true; - return false; +FLAC__bool AudioGeneratorFLAC::eof_cb(const FLAC__StreamDecoder *decoder) { + (void) decoder; + if (file->getPos() >= file->getSize()) { + return true; + } + return false; } -FLAC__StreamDecoderWriteStatus AudioGeneratorFLAC::write_cb(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[]) -{ - (void) decoder; - // Hackish warning here. FLAC sends the buffer but doesn't free it until the next call to decode_frame, so we stash - // the pointers here and use it in our loop() instead of memcpy()'ing into yet another buffer. - buffLen = frame->header.blocksize; - buff[0] = buffer[0]; - if (frame->header.channels>1) buff[1] = buffer[1]; - else buff[1] = buffer[0]; - buffPtr = 0; - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +FLAC__StreamDecoderWriteStatus AudioGeneratorFLAC::write_cb(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[]) { + (void) decoder; + // Hackish warning here. FLAC sends the buffer but doesn't free it until the next call to decode_frame, so we stash + // the pointers here and use it in our loop() instead of memcpy()'ing into yet another buffer. + buffLen = frame->header.blocksize; + buff[0] = (const int *)buffer[0]; + if (frame->header.channels > 1) { + buff[1] = (const int *)buffer[1]; + } else { + buff[1] = (const int *)buffer[0]; + } + buffPtr = 0; + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } -void AudioGeneratorFLAC::metadata_cb(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata) -{ - (void) decoder; - (void) metadata; - audioLogger->printf_P(PSTR("Metadata\n")); +void AudioGeneratorFLAC::metadata_cb(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata) { + (void) decoder; + (void) metadata; + audioLogger->printf_P(PSTR("Metadata\n")); } char AudioGeneratorFLAC::error_cb_str[64]; -void AudioGeneratorFLAC::error_cb(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) -{ - (void) decoder; - strncpy_P(error_cb_str, FLAC__StreamDecoderErrorStatusString[status], 64); - cb.st((int)status, error_cb_str); +void AudioGeneratorFLAC::error_cb(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) { + (void) decoder; + strncpy_P(error_cb_str, FLAC__StreamDecoderErrorStatusString[status], sizeof(AudioGeneratorFLAC::error_cb_str) - 1); + cb.st((int)status, error_cb_str); } diff --git a/src/AudioGeneratorFLAC.h b/src/AudioGeneratorFLAC.h index 716cd0c1..7ba505b7 100644 --- a/src/AudioGeneratorFLAC.h +++ b/src/AudioGeneratorFLAC.h @@ -1,21 +1,21 @@ /* - AudioGeneratorFLAC - Audio output generator that plays FLAC audio files - - Copyright (C) 2017 Earle F. Philhower, III + AudioGeneratorFLAC + Audio output generator that plays FLAC audio files - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORFLAC_H @@ -23,12 +23,11 @@ #include extern "C" { - #include "libflac/FLAC/stream_decoder.h" +#include "libflac/FLAC/stream_decoder.h" }; -class AudioGeneratorFLAC : public AudioGenerator -{ - public: +class AudioGeneratorFLAC : public AudioGenerator { +public: AudioGeneratorFLAC(); virtual ~AudioGeneratorFLAC() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; @@ -36,7 +35,7 @@ class AudioGeneratorFLAC : public AudioGenerator virtual bool stop() override; virtual bool isRunning() override; - protected: +protected: // FLAC info uint16_t channels; uint32_t sampleRate; @@ -50,28 +49,28 @@ class AudioGeneratorFLAC : public AudioGenerator // FLAC callbacks, need static functions to bounce into c++ from c static FLAC__StreamDecoderReadStatus _read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { - return static_cast(client_data)->read_cb(decoder, buffer, bytes); + return static_cast(client_data)->read_cb(decoder, buffer, bytes); }; static FLAC__StreamDecoderSeekStatus _seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { - return static_cast(client_data)->seek_cb(decoder, absolute_byte_offset); + return static_cast(client_data)->seek_cb(decoder, absolute_byte_offset); }; static FLAC__StreamDecoderTellStatus _tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { - return static_cast(client_data)->tell_cb(decoder, absolute_byte_offset); + return static_cast(client_data)->tell_cb(decoder, absolute_byte_offset); }; static FLAC__StreamDecoderLengthStatus _length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) { - return static_cast(client_data)->length_cb(decoder, stream_length); + return static_cast(client_data)->length_cb(decoder, stream_length); }; static FLAC__bool _eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) { - return static_cast(client_data)->eof_cb(decoder); + return static_cast(client_data)->eof_cb(decoder); }; static FLAC__StreamDecoderWriteStatus _write_cb(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[], void *client_data) { - return static_cast(client_data)->write_cb(decoder, frame, buffer); + return static_cast(client_data)->write_cb(decoder, frame, buffer); }; static void _metadata_cb(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) { - static_cast(client_data)->metadata_cb(decoder, metadata); + static_cast(client_data)->metadata_cb(decoder, metadata); }; static void _error_cb(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) { - static_cast(client_data)->error_cb(decoder, status); + static_cast(client_data)->error_cb(decoder, status); }; // Actual FLAC callbacks FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); diff --git a/src/AudioGeneratorMIDI.cpp b/src/AudioGeneratorMIDI.cpp index ba6d0325..07dfa021 100644 --- a/src/AudioGeneratorMIDI.cpp +++ b/src/AudioGeneratorMIDI.cpp @@ -1,639 +1,594 @@ /* - AudioGeneratorMIDI - Audio output generator that plays MIDI files using a SF2 SoundFont - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMIDI + Audio output generator that plays MIDI files using an SF2 SoundFont + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ /* - The MIDI processing engine is a heavily modified version of MIDITONES, - by Len Shustek, https://github.com/LenShustek/miditones . - Whereas MIDITONES original simply parsed a file beforehand to a byte - stream to be played by another program, this does the parsing and - playback in real-time. - - Here's his original header/readme w/MIT license, which is subsumed by the - GPL license of the ESP8266Audio project. + The MIDI processing engine is a heavily modified version of MIDITONES, + by Len Shustek, https://github.com/LenShustek/miditones . + Whereas MIDITONES original simply parsed a file beforehand to a byte + stream to be played by another program, this does the parsing and + playback in real-time. + + Here's his original header/readme w/MIT license, which is subsumed by the + GPL license of the ESP8266Audio project. */ /*************************************************************************** - MIDITONES: Convert a MIDI file into a simple bytestream of notes + MIDITONES: Convert a MIDI file into a simple bytestream of notes - ------------------------------------------------------------------------- - The MIT License (MIT) - Copyright (c) 2011,2013,2015,2016, Len Shustek + ------------------------------------------------------------------------- + The MIT License (MIT) + Copyright (c) 2011,2013,2015,2016, Len Shustek - 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: + 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 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. + 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 "AudioGeneratorMIDI.h" -#pragma GCC optimize ("O3") - #define TSF_NO_STDIO +#define TSF_CONST_FILE +#define TSF_SAMPLES_SHORT #define TSF_IMPLEMENTATION #include "libtinysoundfont/tsf.h" + /**************** utility routines **********************/ /* announce a fatal MIDI file format error */ -void AudioGeneratorMIDI::midi_error(const char *msg, int curpos) -{ - cb.st(curpos, msg); -#if 0 - int ptr; - audioLogger->printf("---> MIDI file error at position %04X (%d): %s\n", (uint16_t) curpos, (uint16_t) curpos, msg); - /* print some bytes surrounding the error */ - ptr = curpos - 16; - if (ptr < 0) ptr = 0; - buffer.seek( buffer.data, ptr ); - for (int i = 0; i < 32; i++) { - char c; - buffer.read (buffer.data, &c, 1); - audioLogger->printf((ptr + i) == curpos ? " [%02X] " : "%02X ", (int) c & 0xff); - } - audioLogger->printf("\n"); -#endif - running = false; +void AudioGeneratorMIDI::midi_error(const char *msg, int curpos) { + cb.st(curpos, msg); + running = false; } /* check that we have a specified number of bytes left in the buffer */ -void AudioGeneratorMIDI::chk_bufdata (int ptr, unsigned long int len) { - if ((unsigned) (ptr + len) > buflen) - midi_error ("data missing", ptr); +void AudioGeneratorMIDI::chk_bufdata(int ptr, unsigned long int len) { + if ((unsigned)(ptr + len) > buflen) { + midi_error("data missing", ptr); + } } /* fetch big-endian numbers */ -uint16_t AudioGeneratorMIDI::rev_short (uint16_t val) { - return ((val & 0xff) << 8) | ((val >> 8) & 0xff); +uint16_t AudioGeneratorMIDI::rev_short(uint16_t val) { + return ((val & 0xff) << 8) | ((val >> 8) & 0xff); } -uint32_t AudioGeneratorMIDI::rev_long (uint32_t val) { - return (((rev_short ((uint16_t) val) & 0xffff) << 16) | - (rev_short ((uint16_t) (val >> 16)) & 0xffff)); +uint32_t AudioGeneratorMIDI::rev_long(uint32_t val) { + return (((rev_short((uint16_t) val) & 0xffff) << 16) | + (rev_short((uint16_t)(val >> 16)) & 0xffff)); } /************** process the MIDI file header *****************/ -void AudioGeneratorMIDI::process_header (void) { - struct midi_header hdr; - unsigned int time_division; - - chk_bufdata (hdrptr, sizeof (struct midi_header)); - buffer.seek (buffer.data, hdrptr); - buffer.read (buffer.data, &hdr, sizeof (hdr)); - if (!charcmp ((char *) hdr.MThd, "MThd")) - midi_error ("Missing 'MThd'", hdrptr); - num_tracks = rev_short (hdr.number_of_tracks); - time_division = rev_short (hdr.time_division); - if (time_division < 0x8000) - ticks_per_beat = time_division; - else - ticks_per_beat = ((time_division >> 8) & 0x7f) /* SMTE frames/sec */ *(time_division & 0xff); /* ticks/SMTE frame */ - hdrptr += rev_long (hdr.header_size) + 8; /* point past header to track header, presumably. */ - return; +void AudioGeneratorMIDI::process_header(void) { + struct midi_header hdr; + unsigned int time_division; + + chk_bufdata(hdrptr, sizeof(struct midi_header)); + file->seek(hdrptr, SEEK_SET); + file->read(&hdr, sizeof(hdr)); + if (!charcmp((char *) hdr.MThd, "MThd")) { + midi_error("Missing 'MThd'", hdrptr); + } + num_tracks = rev_short(hdr.number_of_tracks); + time_division = rev_short(hdr.time_division); + if (time_division < 0x8000) { + ticks_per_beat = time_division; + } else { + ticks_per_beat = ((time_division >> 8) & 0x7f) /* SMTE frames/sec */ *(time_division & 0xff); /* ticks/SMTE frame */ + } + hdrptr += rev_long(hdr.header_size) + 8; /* point past header to track header, presumably. */ + return; } /**************** Process a MIDI track header *******************/ -void AudioGeneratorMIDI::start_track (int tracknum) { - struct track_header hdr; - unsigned long tracklen; - - chk_bufdata (hdrptr, sizeof (struct track_header)); - buffer.seek (buffer.data, hdrptr); - buffer.read (buffer.data, &hdr, sizeof (hdr)); - if (!charcmp ((char *) (hdr.MTrk), "MTrk")) - midi_error ("Missing 'MTrk'", hdrptr); - tracklen = rev_long (hdr.track_size); - hdrptr += sizeof (struct track_header); /* point past header */ - chk_bufdata (hdrptr, tracklen); - track[tracknum].trkptr = hdrptr; - hdrptr += tracklen; /* point to the start of the next track */ - track[tracknum].trkend = hdrptr; /* the point past the end of the track */ +void AudioGeneratorMIDI::start_track(int tracknum) { + struct track_header hdr; + unsigned long tracklen; + + chk_bufdata(hdrptr, sizeof(struct track_header)); + file->seek(hdrptr, SEEK_SET); + //buffer.seek(buffer.data, hdrptr); + file->read(&hdr, sizeof(hdr)); + //buffer.read(buffer.data, &hdr, sizeof(hdr)); + if (!charcmp((char *)(hdr.MTrk), "MTrk")) { + midi_error("Missing 'MTrk'", hdrptr); + } + tracklen = rev_long(hdr.track_size); + hdrptr += sizeof(struct track_header); /* point past header */ + chk_bufdata(hdrptr, tracklen); + track[tracknum].trkptr = hdrptr; + hdrptr += tracklen; /* point to the start of the next track */ + track[tracknum].trkend = hdrptr; /* the point past the end of the track */ } -unsigned char AudioGeneratorMIDI::buffer_byte (int offset) { - unsigned char c; - buffer.seek (buffer.data, offset); - buffer.read (buffer.data, &c, 1); - return c; +unsigned char AudioGeneratorMIDI::buffer_byte(int offset) { + unsigned char c; + file->seek(offset, SEEK_SET); + //buffer.seek(buffer.data, offset); + file->read(&c, 1); + //buffer.read(buffer.data, &c, 1); + return c; } -unsigned short AudioGeneratorMIDI::buffer_short (int offset) { - unsigned short s; - buffer.seek (buffer.data, offset); - buffer.read (buffer.data, &s, sizeof (short)); - return s; +unsigned short AudioGeneratorMIDI::buffer_short(int offset) { + unsigned short s; + file->seek(offset, SEEK_SET); + //buffer.seek(buffer.data, offset); + file->read(&s, sizeof(short)); + // buffer.read(buffer.data, &s, sizeof(short)); + return s; } -unsigned int AudioGeneratorMIDI::buffer_int32 (int offset) { - uint32_t i; - buffer.seek (buffer.data, offset); - buffer.read (buffer.data, &i, sizeof (i)); - return i; +unsigned int AudioGeneratorMIDI::buffer_int32(int offset) { + uint32_t i; + file->seek(offset, SEEK_SET); + //buffer.seek(buffer.data, offset); + file->read(&i, sizeof(i)); + //buffer.read(buffer.data, &i, sizeof(i)); + return i; } /* Get a MIDI-style variable-length integer */ -unsigned long AudioGeneratorMIDI::get_varlen (int *ptr) { - /* Get a 1-4 byte variable-length value and adjust the pointer past it. - These are a succession of 7-bit values with a MSB bit of zero marking the end */ - - unsigned long val; - int i, byte; - - val = 0; - for (i = 0; i < 4; ++i) { - byte = buffer_byte ((*ptr)++); - val = (val << 7) | (byte & 0x7f); - if (!(byte & 0x80)) - return val; - } - return val; +unsigned long AudioGeneratorMIDI::get_varlen(int *ptr) { + /* Get a 1-4 byte variable-length value and adjust the pointer past it. + These are a succession of 7-bit values with an MSB bit of zero marking the end */ + + unsigned long val; + int i, byte; + + val = 0; + for (i = 0; i < 4; ++i) { + byte = buffer_byte((*ptr)++); + val = (val << 7) | (byte & 0x7f); + if (!(byte & 0x80)) { + return val; + } + } + return val; } /*************** Process the MIDI track data ***************************/ -/* Skip in the track for the next "note on", "note off" or "set tempo" command, - then record that information in the track status block and return. */ - -void AudioGeneratorMIDI::find_note (int tracknum) { - unsigned long int delta_time; - int event, chan; - int note, velocity, controller, pressure, pitchbend, instrument; - int meta_cmd, meta_length; - unsigned long int sysex_length; - struct track_status *t; - const char *tag; - - /* process events */ - - t = &track[tracknum]; /* our track status structure */ - while (t->trkptr < t->trkend) { - - delta_time = get_varlen (&t->trkptr); - t->time += delta_time; - if (buffer_byte (t->trkptr) < 0x80) - event = t->last_event; /* using "running status": same event as before */ - else { /* otherwise get new "status" (event type) */ - event = buffer_byte (t->trkptr++); - } - if (event == 0xff) { /* meta-event */ - meta_cmd = buffer_byte (t->trkptr++); - meta_length = get_varlen(&t->trkptr); - switch (meta_cmd) { - case 0x00: - break; - case 0x01: - tag = "description"; - goto show_text; - case 0x02: - tag = "copyright"; - goto show_text; - case 0x03: - tag = "track name"; - goto show_text; - case 0x04: - tag = "instrument name"; - goto show_text; - case 0x05: - tag = "lyric"; - goto show_text; - case 0x06: - tag = "marked point"; - goto show_text; - case 0x07: - tag = "cue point"; +/* Skip in the track for the next "note on", "note off" or "set tempo" command, + then record that information in the track status block and return. */ + +void AudioGeneratorMIDI::find_note(int tracknum) { + unsigned long int delta_time; + int event, chan; + int note, velocity, controller, pressure, pitchbend, instrument; + int meta_cmd, meta_length; + unsigned long int sysex_length; + struct track_status *t; + const char *tag; + + /* process events */ + + t = &track[tracknum]; /* our track status structure */ + while (t->trkptr < t->trkend) { + + delta_time = get_varlen(&t->trkptr); + t->time += delta_time; + if (buffer_byte(t->trkptr) < 0x80) { + event = t->last_event; /* using "running status": same event as before */ + } else { /* otherwise get new "status" (event type) */ + event = buffer_byte(t->trkptr++); + } + if (event == 0xff) { /* meta-event */ + meta_cmd = buffer_byte(t->trkptr++); + meta_length = get_varlen(&t->trkptr); + switch (meta_cmd) { + case 0x00: + break; + case 0x01: + tag = "description"; + goto show_text; + case 0x02: + tag = "copyright"; + goto show_text; + case 0x03: + tag = "track name"; + goto show_text; + case 0x04: + tag = "instrument name"; + goto show_text; + case 0x05: + tag = "lyric"; + goto show_text; + case 0x06: + tag = "marked point"; + goto show_text; + case 0x07: + tag = "cue point"; show_text: - break; - case 0x20: - break; - case 0x2f: - break; - case 0x51: /* tempo: 3 byte big-endian integer! */ - t->cmd = CMD_TEMPO; - t->tempo = rev_long (buffer_int32 (t->trkptr - 1)) & 0xffffffL; - t->trkptr += meta_length; - return; - case 0x54: - break; - case 0x58: - break; - case 0x59: - break; - case 0x7f: - tag = "sequencer data"; - goto show_hex; - default: /* unknown meta command */ - tag = "???"; + break; + case 0x20: + break; + case 0x2f: + break; + case 0x51: /* tempo: 3 byte big-endian integer! */ + t->cmd = CMD_TEMPO; + t->tempo = rev_long(buffer_int32(t->trkptr - 1)) & 0xffffffL; + t->trkptr += meta_length; + return; + case 0x54: + break; + case 0x58: + break; + case 0x59: + break; + case 0x7f: + tag = "sequencer data"; + goto show_hex; + default: /* unknown meta command */ + tag = "???"; show_hex: - break; - } - t->trkptr += meta_length; - } + break; + } + t->trkptr += meta_length; + } + + else if (event < 0x80) { + midi_error("Unknown MIDI event type", t->trkptr); + } - else if (event < 0x80) - midi_error ("Unknown MIDI event type", t->trkptr); - - else { - if (event < 0xf0) - t->last_event = event; // remember "running status" if not meta or sysex event - chan = event & 0xf; - t->chan = chan; - switch (event >> 4) { - case 0x8: - t->note = buffer_byte (t->trkptr++); - velocity = buffer_byte (t->trkptr++); + else { + if (event < 0xf0) { + t->last_event = event; // remember "running status" if not meta or sysex event + } + chan = event & 0xf; + t->chan = chan; + switch (event >> 4) { + case 0x8: + t->note = buffer_byte(t->trkptr++); + velocity = buffer_byte(t->trkptr++); note_off: - t->cmd = CMD_STOPNOTE; - return; /* stop processing and return */ - case 0x9: - t->note = buffer_byte (t->trkptr++); - velocity = buffer_byte (t->trkptr++); - if (velocity == 0) /* some scores use note-on with zero velocity for off! */ - goto note_off; - t->velocity = velocity; - t->cmd = CMD_PLAYNOTE; - return; /* stop processing and return */ - case 0xa: - note = buffer_byte (t->trkptr++); - velocity = buffer_byte (t->trkptr++); - break; - case 0xb: - controller = buffer_byte (t->trkptr++); - velocity = buffer_byte (t->trkptr++); - break; - case 0xc: - instrument = buffer_byte (t->trkptr++); - midi_chan_instrument[chan] = instrument; // record new instrument for this channel - break; - case 0xd: - pressure = buffer_byte (t->trkptr++); - break; - case 0xe: - pitchbend = buffer_byte (t->trkptr) | (buffer_byte (t->trkptr + 1) << 7); - t->trkptr += 2; - break; - case 0xf: - sysex_length = get_varlen (&t->trkptr); - t->trkptr += sysex_length; - break; - default: - midi_error ("Unknown MIDI command", t->trkptr); - } + t->cmd = CMD_STOPNOTE; + return; /* stop processing and return */ + case 0x9: + t->note = buffer_byte(t->trkptr++); + velocity = buffer_byte(t->trkptr++); + if (velocity == 0) { /* some scores use note-on with zero velocity for off! */ + goto note_off; + } + t->velocity = velocity; + t->cmd = CMD_PLAYNOTE; + return; /* stop processing and return */ + case 0xa: + note = buffer_byte(t->trkptr++); + velocity = buffer_byte(t->trkptr++); + break; + case 0xb: + controller = buffer_byte(t->trkptr++); + velocity = buffer_byte(t->trkptr++); + break; + case 0xc: + instrument = buffer_byte(t->trkptr++); + midi_chan_instrument[chan] = instrument; // record new instrument for this channel + break; + case 0xd: + pressure = buffer_byte(t->trkptr++); + break; + case 0xe: + pitchbend = buffer_byte(t->trkptr) | (buffer_byte(t->trkptr + 1) << 7); + t->trkptr += 2; + break; + case 0xf: + sysex_length = get_varlen(&t->trkptr); + t->trkptr += sysex_length; + break; + default: + midi_error("Unknown MIDI command", t->trkptr); + } + } } - } - t->cmd = CMD_TRACKDONE; /* no more notes to process */ - ++tracks_done; - - // Remove unused warnings..maybe some day we'll look at these - (void)note; - (void)controller; - (void)pressure; - (void)pitchbend; - (void)tag; + t->cmd = CMD_TRACKDONE; /* no more notes to process */ + ++tracks_done; + + // Remove unused warnings..maybe some day we'll look at these + (void)note; + (void)controller; + (void)pressure; + (void)pitchbend; + (void)tag; } -// Open file, parse headers, get ready tio process MIDI -void AudioGeneratorMIDI::PrepareMIDI(AudioFileSource *src) -{ - MakeStreamFromAFS(src, &afsMIDI); - tsf_stream_wrap_cached(&afsMIDI, 32, 64, &buffer); - buflen = buffer.size (buffer.data); +// Open file, parse headers, get ready to process MIDI +void AudioGeneratorMIDI::PrepareMIDI() { //AudioFileSource *src) { + buflen = file->getSize(); //buffer.size(buffer.data); - /* process the MIDI file header */ + /* process the MIDI file header */ - hdrptr = buffer.tell (buffer.data); /* pointer to file and track headers */ - process_header (); - printf (" Processing %d tracks.\n", num_tracks); - if (num_tracks > MAX_TRACKS) - midi_error ("Too many tracks", buffer.tell (buffer.data)); + hdrptr = file->getPos(); // buffer.tell(buffer.data); /* pointer to file and track headers */ + process_header(); + if (num_tracks > MAX_TRACKS) { + midi_error("Too many tracks", file->getPos()); //buffer.tell(buffer.data)); + } - /* initialize processing of all the tracks */ + /* initialize processing of all the tracks */ - for (tracknum = 0; tracknum < num_tracks; ++tracknum) { - start_track (tracknum); /* process the track header */ - find_note (tracknum); /* position to the first note on/off */ - } + for (tracknum = 0; tracknum < num_tracks; ++tracknum) { + start_track(tracknum); /* process the track header */ + find_note(tracknum); /* position to the first note on/off */ + } - notes_skipped = 0; - tracknum = 0; - earliest_tracknum = 0; - earliest_time = 0; + notes_skipped = 0; + tracknum = 0; + earliest_tracknum = 0; + earliest_time = 0; } -// Parses the note on/offs ujntil we are ready to render some more samples. Then return the +// Parses the note on/offs until we are ready to render some more samples. Then return the // total number of samples to render before we need to be called again -int AudioGeneratorMIDI::PlayMIDI() -{ - /* Continue processing all tracks, in an order based on the simulated time. - This is not unlike multiway merging used for tape sorting algoritms in the 50's! */ - - do { /* while there are still track notes to process */ - static struct track_status *trk; - static struct tonegen_status *tg; - static int tgnum; - static int count_tracks; - static unsigned long delta_time, delta_msec; - - /* Find the track with the earliest event time, - and output a delay command if time has advanced. - - A potential improvement: If there are multiple tracks with the same time, - first do the ones with STOPNOTE as the next command, if any. That would - help avoid running out of tone generators. In practice, though, most MIDI - files do all the STOPNOTEs first anyway, so it won't have much effect. - */ - - earliest_time = 0x7fffffff; - - /* Usually we start with the track after the one we did last time (tracknum), - so that if we run out of tone generators, we have been fair to all the tracks. - The alternate "strategy1" says we always start with track 0, which means - that we favor early tracks over later ones when there aren't enough tone generators. - */ - - count_tracks = num_tracks; - do { - if (++tracknum >= num_tracks) - tracknum = 0; - trk = &track[tracknum]; - if (trk->cmd != CMD_TRACKDONE && trk->time < earliest_time) { - earliest_time = trk->time; - earliest_tracknum = tracknum; - } - } while (--count_tracks); - - tracknum = earliest_tracknum; /* the track we picked */ - trk = &track[tracknum]; - if (earliest_time < timenow) - midi_error ("INTERNAL: time went backwards", trk->trkptr); - - /* If time has advanced, output a "delay" command */ - - delta_time = earliest_time - timenow; - if (delta_time) { - /* Convert ticks to milliseconds based on the current tempo */ - unsigned long long temp; - temp = ((unsigned long long) delta_time * tempo) / ticks_per_beat; - delta_msec = temp / 1000; // get around LCC compiler bug - if (delta_msec > 0x7fff) - midi_error ("INTERNAL: time delta too big", trk->trkptr); - int samples = (((int) delta_msec) * freq) / 1000; - timenow = earliest_time; - return samples; - } - timenow = earliest_time; +int AudioGeneratorMIDI::PlayMIDI() { + /* Continue processing all tracks, in an order based on the simulated time. + This is not unlike multiway merging used for tape sorting algorithms in the 50's! */ + + do { /* while there are still track notes to process */ + static struct track_status *trk; + static struct tonegen_status *tg; + static int tgnum; + static int count_tracks; + static unsigned long delta_time, delta_msec; + + /* Find the track with the earliest event time, + and output a delay command if time has advanced. + + A potential improvement: If there are multiple tracks with the same time, + first do the ones with STOPNOTE as the next command, if any. That would + help avoid running out of tone generators. In practice, though, most MIDI + files do all the STOPNOTEs first anyway, so it won't have much effect. + */ + + earliest_time = 0x7fffffff; + + /* Usually we start with the track after the one we did last time (tracknum), + so that if we run out of tone generators, we have been fair to all the tracks. + The alternate "strategy1" says we always start with track 0, which means + that we favor early tracks over later ones when there aren't enough tone generators. + */ + + count_tracks = num_tracks; + do { + if (++tracknum >= num_tracks) { + tracknum = 0; + } + trk = &track[tracknum]; + if (trk->cmd != CMD_TRACKDONE && trk->time < earliest_time) { + earliest_time = trk->time; + earliest_tracknum = tracknum; + } + } while (--count_tracks); + + tracknum = earliest_tracknum; /* the track we picked */ + trk = &track[tracknum]; + if (earliest_time < timenow) { + midi_error("INTERNAL: time went backwards", trk->trkptr); + } - /* If this track event is "set tempo", just change the global tempo. - That affects how we generate "delay" commands. */ + /* If time has advanced, output a "delay" command */ + + delta_time = earliest_time - timenow; + if (delta_time) { + /* Convert ticks to milliseconds based on the current tempo */ + unsigned long long temp; + temp = ((unsigned long long) delta_time * tempo) / ticks_per_beat; + delta_msec = temp / 1000; // get around LCC compiler bug + if (delta_msec > 0x7fff) { + midi_error("INTERNAL: time delta too big", trk->trkptr); + } + int samples = (((int) delta_msec) * freq) / 1000; + timenow = earliest_time; + return samples; + } + timenow = earliest_time; - if (trk->cmd == CMD_TEMPO) { - tempo = trk->tempo; - find_note (tracknum); - } + /* If this track event is "set tempo", just change the global tempo. + That affects how we generate "delay" commands. */ - /* If this track event is "stop note", process it and all subsequent "stop notes" for this track - that are happening at the same time. Doing so frees up as many tone generators as possible. */ - - else if (trk->cmd == CMD_STOPNOTE) - do { - // stop a note - for (tgnum = 0; tgnum < num_tonegens; ++tgnum) { /* find which generator is playing it */ - tg = &tonegen[tgnum]; - if (tg->playing && tg->track == tracknum && tg->note == trk->note) { - tsf_note_off (g_tsf, tg->instrument, tg->note); - tg->playing = false; - trk->tonegens[tgnum] = false; - } - } - find_note (tracknum); // use up the note - } while (trk->cmd == CMD_STOPNOTE && trk->time == timenow); - - /* If this track event is "start note", process only it. - Don't do more than one, so we allow other tracks their chance at grabbing tone generators. */ - - else if (trk->cmd == CMD_PLAYNOTE) { - bool foundgen = false; - /* if not, then try for any free tone generator */ - if (!foundgen) - for (tgnum = 0; tgnum < num_tonegens; ++tgnum) { - tg = &tonegen[tgnum]; - if (!tg->playing) { - foundgen = true; - break; - } + if (trk->cmd == CMD_TEMPO) { + tempo = trk->tempo; + find_note(tracknum); } - if (foundgen) { - if (tgnum + 1 > num_tonegens_used) - num_tonegens_used = tgnum + 1; - tg->playing = true; - tg->track = tracknum; - tg->note = trk->note; - trk->tonegens[tgnum] = true; - trk->preferred_tonegen = tgnum; - if (tg->instrument != midi_chan_instrument[trk->chan]) { /* new instrument for this generator */ - tg->instrument = midi_chan_instrument[trk->chan]; + + /* If this track event is "stop note", process it and all subsequent "stop notes" for this track + that are happening at the same time. Doing so frees up as many tone generators as possible. */ + + else if (trk->cmd == CMD_STOPNOTE) + do { + // stop a note + for (tgnum = 0; tgnum < num_tonegens; ++tgnum) { /* find which generator is playing it */ + tg = &tonegen[tgnum]; + if (tg->playing && tg->track == tracknum && tg->note == trk->note) { + tsf_note_off/*_fast*/(g_tsf, tg->instrument, tg->note);//, tg->playIndex); + tg->playing = false; + tg->playIndex = -1; + trk->tonegens[tgnum] = false; + } + } + find_note(tracknum); // use up the note + } while (trk->cmd == CMD_STOPNOTE && trk->time == timenow); + + /* If this track event is "start note", process only it. + Don't do more than one, so we allow other tracks their chance at grabbing tone generators. */ + + else if (trk->cmd == CMD_PLAYNOTE) { + bool foundgen = false; + /* if not, then try for any free tone generator */ + if (!foundgen) + for (tgnum = 0; tgnum < num_tonegens; ++tgnum) { + tg = &tonegen[tgnum]; + if (!tg->playing) { + foundgen = true; + break; + } + } + if (foundgen) { + if (tgnum + 1 > num_tonegens_used) { + num_tonegens_used = tgnum + 1; + } + tg->playing = true; + tg->track = tracknum; + tg->note = trk->note; + trk->tonegens[tgnum] = true; + trk->preferred_tonegen = tgnum; + if (tg->instrument != midi_chan_instrument[trk->chan]) { /* new instrument for this generator */ + tg->instrument = midi_chan_instrument[trk->chan]; + } + tg->playIndex = tsf_note_on/*_fast*/(g_tsf, tg->instrument, tg->note, trk->velocity / 127.0f); // velocity = 0...127 + } else { + ++notes_skipped; + } + find_note(tracknum); // use up the note } - tsf_note_on (g_tsf, tg->instrument, tg->note, trk->velocity / 256.0); - } else { - ++notes_skipped; - } - find_note (tracknum); // use up the note - } - } - while (tracks_done < num_tracks); - return -1; // EOF + } while (tracks_done < num_tracks); + return -1; // EOF } -void AudioGeneratorMIDI::StopMIDI() -{ +void AudioGeneratorMIDI::StopMIDI() { - buffer.close(buffer.data); - tsf_close(g_tsf); - printf (" %s %d tone generators were used.\n", - num_tonegens_used < num_tonegens ? "Only" : "All", num_tonegens_used); - if (notes_skipped) - printf - (" %d notes were skipped because there weren't enough tone generators.\n", notes_skipped); - - printf (" Done.\n"); + file->close(); + tsf_close(g_tsf); } -bool AudioGeneratorMIDI::begin(AudioFileSource *src, AudioOutput *out) -{ - // Clear out status variables - for (int i=0; iSetRate( freq )) return false; - if (!out->SetBitsPerSample( 16 )) return false; - if (!out->SetChannels( 1 )) return false; - if (!out->begin()) return false; - - output = out; - file = src; - - running = true; +bool AudioGeneratorMIDI::begin(AudioFileSource *src, AudioOutput *out) { + // Clear out status variables + for (int i = 0; i < MAX_TONEGENS; i++) { + memset(&tonegen[i], 0, sizeof(struct tonegen_status)); + } + for (int i = 0; i < MAX_TRACKS; i++) { + memset(&track[i], 0, sizeof(struct track_status)); + } + memset(midi_chan_instrument, 0, sizeof(midi_chan_instrument)); - PrepareMIDI(src); + g_tsf = _tsf; + tsf_set_output(g_tsf, TSF_STEREO_INTERLEAVED, freq, -10 /* dB gain -10 */); - samplesToPlay = 0; - numSamplesRendered = 0; - sentSamplesRendered = 0; - - sawEOF = false; - return running; -} + if (!out->SetRate(freq)) { + return false; + } + if (!out->SetChannels(2)) { + return false; + } -bool AudioGeneratorMIDI::loop() -{ - static int c = 0; + if (!out->begin()) { + return false; + } - if (!running) goto done; // Nothing to do here! + output = out; + file = src; - // First, try and push in the stored sample. If we can't, then punt and try later - if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected + running = true; - // Try and stuff the buffer one sample at a time - do { - c++; - if (c%44100 == 0) yield(); + PrepareMIDI();//src); -play: + samplesToPlay = 0; + numSamplesRendered = 0; + sentSamplesRendered = 0; - if (sentSamplesRendered < numSamplesRendered) { - lastSample[AudioOutput::LEFTCHANNEL] = samplesRendered[sentSamplesRendered]; - lastSample[AudioOutput::RIGHTCHANNEL] = samplesRendered[sentSamplesRendered]; - sentSamplesRendered++; - } else if (samplesToPlay) { - numSamplesRendered = sizeof(samplesRendered)/sizeof(samplesRendered[0]); - if ((int)samplesToPlay < (int)(sizeof(samplesRendered)/sizeof(samplesRendered[0]))) numSamplesRendered = samplesToPlay; - tsf_render_short_fast(g_tsf, samplesRendered, numSamplesRendered, 0); - lastSample[AudioOutput::LEFTCHANNEL] = samplesRendered[0]; - lastSample[AudioOutput::RIGHTCHANNEL] = samplesRendered[0]; - sentSamplesRendered = 1; - samplesToPlay -= numSamplesRendered; - } else { - numSamplesRendered = 0; - sentSamplesRendered = 0; - if (sawEOF) { - running = false; - } else { - samplesToPlay = PlayMIDI(); - if (samplesToPlay == -1) { - sawEOF = true; - samplesToPlay = freq / 2; - } - goto play; - } - } - } while (running && output->ConsumeSample(lastSample)); - -done: - file->loop(); - output->loop(); - - return running; + sawEOF = false; + return running; } - -bool AudioGeneratorMIDI::stop() -{ - StopMIDI(); - output->stop(); - return true; -} - -int AudioGeneratorMIDI::afs_read(void *data, void *ptr, unsigned int size) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->read(ptr, size); -} -int AudioGeneratorMIDI::afs_tell(void *data) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->getPos(); -} +bool AudioGeneratorMIDI::loop() { + if (!running) { + file->loop(); + output->loop(); + return running; + } -int AudioGeneratorMIDI::afs_skip(void *data, unsigned int count) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->seek(count, SEEK_CUR); -} + do { +#ifdef ESP8266 + static int c = 0; + c++; + if (c == 44100) { + c = 0; + yield(); + } +#endif -int AudioGeneratorMIDI::afs_seek(void *data, unsigned int pos) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->seek(pos, SEEK_SET); -} + if (sentSamplesRendered < numSamplesRendered) { + auto toSend = numSamplesRendered - sentSamplesRendered; + auto ret = output->ConsumeSamples(samplesRendered + sentSamplesRendered * 2, toSend); + sentSamplesRendered += ret; + if (toSend != ret) { + break; + } + } else if (samplesToPlay) { + numSamplesRendered = (sizeof(samplesRendered) / sizeof(samplesRendered[0])) / 4; + if ((int)samplesToPlay < (int)(sizeof(samplesRendered) / sizeof(samplesRendered[0])) / 4) { + numSamplesRendered = samplesToPlay; + } + tsf_render_short_2x(g_tsf, samplesRendered, numSamplesRendered, 0); + samplesToPlay -= numSamplesRendered; + sentSamplesRendered = 0; + } else { + numSamplesRendered = 0; + sentSamplesRendered = 0; + if (sawEOF) { + running = false; + } else { + samplesToPlay = PlayMIDI(); + if (samplesToPlay == -1) { + sawEOF = true; + samplesToPlay = freq / 2; + } + } + } + } while (running); -int AudioGeneratorMIDI::afs_close(void *data) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->close(); -} + file->loop(); + output->loop(); -int AudioGeneratorMIDI::afs_size(void *data) -{ - AudioFileSource *s = reinterpret_cast(data); - return s->getSize(); + return running; } -void AudioGeneratorMIDI::MakeStreamFromAFS(AudioFileSource *src, tsf_stream *afs) -{ - afs->data = reinterpret_cast(src); - afs->read = &afs_read; - afs->tell = &afs_tell; - afs->skip = &afs_skip; - afs->seek = &afs_seek; - afs->close = &afs_close; - afs->size = &afs_size; +bool AudioGeneratorMIDI::stop() { + StopMIDI(); + output->stop(); + return true; } - diff --git a/src/AudioGeneratorMIDI.h b/src/AudioGeneratorMIDI.h index 0642c7c9..d86e2619 100644 --- a/src/AudioGeneratorMIDI.h +++ b/src/AudioGeneratorMIDI.h @@ -1,73 +1,92 @@ /* - AudioGeneratorMIDI - Audio output generator that plays MIDI files using a SF2 SoundFont - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMIDI + Audio output generator that plays MIDI files using a SF2 SoundFont + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORMIDI_H #define _AUDIOGENERATORMIDI_H +#if defined(xxxESP32) && (__GNUC__ >= 8) && (__XTENSA__) +// Do not build, Espressif's GCC8+ has a compiler bug +#else // __GNUC__ == 8 + #include "AudioGenerator.h" #define TSF_NO_STDIO +#define TSF_CONST_FILE +#define TSF_SAMPLES_SHORT #include "libtinysoundfont/tsf.h" -class AudioGeneratorMIDI : public AudioGenerator -{ - public: - AudioGeneratorMIDI() { freq=44100; }; +class AudioGeneratorMIDI : public AudioGenerator { +public: + AudioGeneratorMIDI() { + freq = 22050; + running = false; + }; virtual ~AudioGeneratorMIDI() override {}; +#if 0 bool SetSoundfont(AudioFileSource *newsf2) { - if (isRunning()) return false; - sf2 = newsf2; - MakeStreamFromAFS(sf2, &afsSF2); - return true; + if (isRunning()) { + return false; + } + sf2 = newsf2; + MakeStreamFromAFS(sf2, &afsSF2); + return true; + } +#endif + bool SetSoundFont(tsf *t) { + if (isRunning()) { + return false; + } + _tsf = t; + return true; } bool SetSampleRate(int newfreq) { - if (isRunning()) return false; - freq = newfreq; - return true; + if (isRunning()) { + return false; + } + freq = newfreq; + return true; } virtual bool begin(AudioFileSource *mid, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; - virtual bool isRunning() override { return running; }; + virtual bool isRunning() override { + return running; + }; - private: +private: int freq; tsf *g_tsf; - struct tsf_stream buffer; - struct tsf_stream afsMIDI; - struct tsf_stream afsSF2; - AudioFileSource *sf2; AudioFileSource *midi; - protected: +protected: struct midi_header { - int8_t MThd[4]; - uint32_t header_size; - uint16_t format_type; - uint16_t number_of_tracks; - uint16_t time_division; + int8_t MThd[4]; + uint32_t header_size; + uint16_t format_type; + uint16_t number_of_tracks; + uint16_t time_division; }; struct track_header { - int8_t MTrk[4]; - uint32_t track_size; + int8_t MTrk[4]; + uint32_t track_size; }; enum { MAX_TONEGENS = 32, /* max tone generators: tones we can play simultaneously */ @@ -90,24 +109,27 @@ class AudioGeneratorMIDI : public AudioGenerator unsigned long earliest_time = 0; struct tonegen_status { /* current status of a tone generator */ - bool playing; /* is it playing? */ - char track; /* if so, which track is the note from? */ - char note; /* what note is playing? */ - char instrument; /* what instrument? */ + bool playing; /* is it playing? */ + char track; /* if so, which track is the note from? */ + char note; /* what note is playing? */ + char instrument; /* what instrument? */ + int playIndex; /* is index provided? + Unique identifier generated when note starts playing. + This help us to turn the note off faster */ } tonegen[MAX_TONEGENS]; struct track_status { /* current processing point of a MIDI track */ - int trkptr; /* ptr to the next note change */ - int trkend; /* ptr past the end of the track */ - unsigned long time; /* what time we're at in the score */ - unsigned long tempo; /* the tempo last set, in usec per qnote */ - unsigned int preferred_tonegen; /* for strategy2, try to use this generator */ - unsigned char cmd; /* CMD_xxxx next to do */ - unsigned char note; /* for which note */ - unsigned char chan; /* from which channel it was */ - unsigned char velocity; /* the current volume */ - unsigned char last_event; /* the last event, for MIDI's "running status" */ - bool tonegens[MAX_TONEGENS]; /* which tone generators our notes are playing on */ + int trkptr; /* ptr to the next note change */ + int trkend; /* ptr past the end of the track */ + unsigned long time; /* what time we're at in the score */ + unsigned long tempo; /* the tempo last set, in usec per qnote */ + unsigned int preferred_tonegen; /* for strategy2, try to use this generator */ + unsigned char cmd; /* CMD_xxxx next to do */ + unsigned char note; /* for which note */ + unsigned char chan; /* from which channel it was */ + unsigned char velocity; /* the current volume */ + unsigned char last_event; /* the last event, for MIDI's "running status" */ + bool tonegens[MAX_TONEGENS]; /* which tone generators our notes are playing on */ } track[MAX_TRACKS]; int midi_chan_instrument[16]; /* which instrument is currently being played on each channel */ @@ -123,59 +145,53 @@ class AudioGeneratorMIDI : public AudioGenerator }; /* no more data left in this track */ - /* portable string length */ - int strlength (const char *str) { - int i; - for (i = 0; str[i] != '\0'; ++i); - return i; + int strlength(const char *str) { + int i; + for (i = 0; str[i] != '\0'; ++i); + return i; } /* match a constant character sequence */ - int charcmp (const char *buf, const char *match) { - int len, i; - len = strlength (match); - for (i = 0; i < len; ++i) - if (buf[i] != match[i]) - return 0; - return 1; + int charcmp(const char *buf, const char *match) { + int len, i; + len = strlength(match); + for (i = 0; i < len; ++i) + if (buf[i] != match[i]) { + return 0; + } + return 1; } - unsigned char buffer_byte (int offset); - unsigned short buffer_short (int offset); - unsigned int buffer_int32 (int offset); + unsigned char buffer_byte(int offset); + unsigned short buffer_short(int offset); + unsigned int buffer_int32(int offset); - void midi_error (const char *msg, int curpos); - void chk_bufdata (int ptr, unsigned long int len); - uint16_t rev_short (uint16_t val); - uint32_t rev_long (uint32_t val); - void process_header (void); - void start_track (int tracknum); + void midi_error(const char *msg, int curpos); + void chk_bufdata(int ptr, unsigned long int len); + uint16_t rev_short(uint16_t val); + uint32_t rev_long(uint32_t val); + void process_header(void); + void start_track(int tracknum); - unsigned long get_varlen (int *ptr); - void find_note (int tracknum); - void PrepareMIDI(AudioFileSource *src); + unsigned long get_varlen(int *ptr); + void find_note(int tracknum); + void PrepareMIDI();//AudioFileSource *src); int PlayMIDI(); void StopMIDI(); - // tsf_stream <-> AudioFileSource - static int afs_read(void *data, void *ptr, unsigned int size); - static int afs_tell(void *data); - static int afs_skip(void *data, unsigned int count); - static int afs_seek(void *data, unsigned int pos); - static int afs_close(void *data); - static int afs_size(void *data); - void MakeStreamFromAFS(AudioFileSource *src, tsf_stream *afs); - int samplesToPlay; bool sawEOF; int numSamplesRendered; int sentSamplesRendered ; - short samplesRendered[256]; + short samplesRendered[256 * 2 * 2]; + + tsf *_tsf = nullptr; }; +#endif //__GNUC__ == 8 #endif diff --git a/src/AudioGeneratorMOD.cpp b/src/AudioGeneratorMOD.cpp index f42154f8..18ba3958 100644 --- a/src/AudioGeneratorMOD.cpp +++ b/src/AudioGeneratorMOD.cpp @@ -1,36 +1,36 @@ /* - AudioGeneratorMOD - Audio output generator that plays Amiga MOD tracker files - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMOD + Audio output generator that plays Amiga MOD tracker files + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #define PGM_READ_UNALIGNED 0 #include "AudioGeneratorMOD.h" -/* - Ported/hacked out from STELLARPLAYER by Ronen K. - http://mobile4dev.blogspot.com/2012/11/stellaris-launchpad-mod-player.html - A version exists in GitHub at https://github.com/steveway/stellarplayer - and also at https://github.com/MikesModz/StellarPlayer - Both which were themselves a port of the PIC32 MOD player - https://www.youtube.com/watch?v=i3Yl0TISQBE (seems to no longer be available.) - - Most changes involved reducing memory usage by changing data structures, - moving constants to PROGMEM and minor tweaks to allow non pow2 buffer sizes. +/* + Ported/hacked out from STELLARPLAYER by Ronen K. + http://mobile4dev.blogspot.com/2012/11/stellaris-launchpad-mod-player.html + A version exists in GitHub at https://github.com/steveway/stellarplayer + and also at https://github.com/MikesModz/StellarPlayer + Both which were themselves a port of the PIC32 MOD player + https://www.youtube.com/watch?v=i3Yl0TISQBE (seems to no longer be available.) + + Most changes involved reducing memory usage by changing data structures, + moving constants to PROGMEM and minor tweaks to allow non pow2 buffer sizes. */ #pragma GCC optimize ("O3") @@ -41,836 +41,1009 @@ #define min(X,Y) ((X) < (Y) ? (X) : (Y)) #endif -AudioGeneratorMOD::AudioGeneratorMOD() -{ - sampleRate = 44100; - fatBufferSize = 6 * 1024; - stereoSeparation = 32; - mixerTick = 0; - usePAL = false; - UpdateAmiga(); - running = false; - file = NULL; - output = NULL; +AudioGeneratorMOD::AudioGeneratorMOD() { + sampleRate = 44100; + fatBufferSize = 6 * 1024; + stereoSeparation = 32; + mixerTick = 0; + usePAL = false; + UpdateAmiga(); + running = false; + file = NULL; + output = NULL; } -AudioGeneratorMOD::~AudioGeneratorMOD() -{ - // Free any remaining buffers - for (int i = 0; i < CHANNELS; i++) { - FatBuffer.channels[i] = NULL; - } +AudioGeneratorMOD::~AudioGeneratorMOD() { + // Free any remaining buffers + for (int i = 0; i < CHANNELS; i++) { + FatBuffer.channels[i] = NULL; + } } -bool AudioGeneratorMOD::stop() -{ - // We may be stopping because of allocation failures, so always deallocate - for (int i = 0; i < CHANNELS; i++) { - free(FatBuffer.channels[i]); - FatBuffer.channels[i] = NULL; - } - if (file) file->close(); - running = false; - output->stop(); - return true; -} +bool AudioGeneratorMOD::stop() { + // We may be stopping because of allocation failures, so always deallocate + for (int i = 0; i < CHANNELS; i++) { + free(FatBuffer.channels[i]); + FatBuffer.channels[i] = NULL; + } + + if (running || ((file != NULL) && (file->isOpen() == true))) { + output->flush(); //flush I2S output buffer, if the player was actually running before. + } -bool AudioGeneratorMOD::loop() -{ - if (!running) goto done; // Easy-peasy + if (file) { + file->close(); + } + running = false; + output->stop(); + return true; +} - // First, try and push in the stored sample. If we can't, then punt and try later - if (!output->ConsumeSample(lastSample)) goto done; // FIFO full, wait... +bool AudioGeneratorMOD::loop() { + if (!running) { + goto done; // Easy-peasy + } - // Now advance enough times to fill the i2s buffer - do { - if (mixerTick == 0) { - running = RunPlayer(); - if (!running) { - stop(); - goto done; - } - mixerTick = Player.samplesPerTick; + // First, try and push in the stored sample. If we can't, then punt and try later + if (!output->ConsumeSample(lastSample)) { + goto done; // FIFO full, wait... } - GetSample( lastSample ); - mixerTick--; - } while (output->ConsumeSample(lastSample)); + + // Now advance enough times to fill the i2s buffer + do { + if (mixerTick == 0) { + running = RunPlayer(); + if (!running) { + stop(); + goto done; + } + mixerTick = Player.samplesPerTick; + } + GetSample(lastSample); + mixerTick--; + } while (output->ConsumeSample(lastSample)); done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - // We'll be left with one sample still in our buffer because it couldn't fit in the FIFO - return running; + // We'll be left with one sample still in our buffer because it couldn't fit in the FIFO + return running; } -bool AudioGeneratorMOD::begin(AudioFileSource *source, AudioOutput *out) -{ - if (running) stop(); - - if (!source) return false; - file = source; - if (!out) return false; - output = out; - - if (!file->isOpen()) return false; // Can't read the file! - - // Set the output values properly - if (!output->SetRate(sampleRate)) return false; - if (!output->SetBitsPerSample(16)) return false; - if (!output->SetChannels(2)) return false; - if (!output->begin()) return false; - - UpdateAmiga(); - - for (int i = 0; i < CHANNELS; i++) { - FatBuffer.channels[i] = reinterpret_cast(malloc(fatBufferSize)); - if (!FatBuffer.channels[i]) { - stop(); - return false; - } - } - if (!LoadMOD()) { - stop(); - return false; - } - running = true; - return true; +bool AudioGeneratorMOD::begin(AudioFileSource *source, AudioOutput *out) { + if (running) { + stop(); + } + + if (!source) { + return false; + } + file = source; + if (!out) { + return false; + } + output = out; + + if (!file->isOpen()) { + return false; // Can't read the file! + } + + // Set the output values properly + if (!output->SetRate(sampleRate)) { + return false; + } + if (!output->SetChannels(2)) { + return false; + } + if (!output->begin()) { + return false; + } + + UpdateAmiga(); + + for (int i = 0; i < CHANNELS; i++) { + FatBuffer.channels[i] = reinterpret_cast(calloc(fatBufferSize, 1)); + if (!FatBuffer.channels[i]) { + stop(); + return false; + } + } + if (!LoadMOD()) { + stop(); + return false; + } + running = true; + return true; } // Sorted Amiga periods static const uint16_t amigaPeriods[296] PROGMEM = { - 907, 900, 894, 887, 881, 875, 868, 862, // -8 to -1 - 856, 850, 844, 838, 832, 826, 820, 814, // C-1 to +7 - 808, 802, 796, 791, 785, 779, 774, 768, // C#1 to +7 - 762, 757, 752, 746, 741, 736, 730, 725, // D-1 to +7 - 720, 715, 709, 704, 699, 694, 689, 684, // D#1 to +7 - 678, 675, 670, 665, 660, 655, 651, 646, // E-1 to +7 - 640, 636, 632, 628, 623, 619, 614, 610, // F-1 to +7 - 604, 601, 597, 592, 588, 584, 580, 575, // F#1 to +7 - 570, 567, 563, 559, 555, 551, 547, 543, // G-1 to +7 - 538, 535, 532, 528, 524, 520, 516, 513, // G#1 to +7 - 508, 505, 502, 498, 494, 491, 487, 484, // A-1 to +7 - 480, 477, 474, 470, 467, 463, 460, 457, // A#1 to +7 - 453, 450, 447, 444, 441, 437, 434, 431, // B-1 to +7 - 428, 425, 422, 419, 416, 413, 410, 407, // C-2 to +7 - 404, 401, 398, 395, 392, 390, 387, 384, // C#2 to +7 - 381, 379, 376, 373, 370, 368, 365, 363, // D-2 to +7 - 360, 357, 355, 352, 350, 347, 345, 342, // D#2 to +7 - 339, 337, 335, 332, 330, 328, 325, 323, // E-2 to +7 - 320, 318, 316, 314, 312, 309, 307, 305, // F-2 to +7 - 302, 300, 298, 296, 294, 292, 290, 288, // F#2 to +7 - 285, 284, 282, 280, 278, 276, 274, 272, // G-2 to +7 - 269, 268, 266, 264, 262, 260, 258, 256, // G#2 to +7 - 254, 253, 251, 249, 247, 245, 244, 242, // A-2 to +7 - 240, 238, 237, 235, 233, 232, 230, 228, // A#2 to +7 - 226, 225, 223, 222, 220, 219, 217, 216, // B-2 to +7 - 214, 212, 211, 209, 208, 206, 205, 203, // C-3 to +7 - 202, 200, 199, 198, 196, 195, 193, 192, // C#3 to +7 - 190, 189, 188, 187, 185, 184, 183, 181, // D-3 to +7 - 180, 179, 177, 176, 175, 174, 172, 171, // D#3 to +7 - 170, 169, 167, 166, 165, 164, 163, 161, // E-3 to +7 - 160, 159, 158, 157, 156, 155, 154, 152, // F-3 to +7 - 151, 150, 149, 148, 147, 146, 145, 144, // F#3 to +7 - 143, 142, 141, 140, 139, 138, 137, 136, // G-3 to +7 - 135, 134, 133, 132, 131, 130, 129, 128, // G#3 to +7 - 127, 126, 125, 125, 123, 123, 122, 121, // A-3 to +7 - 120, 119, 118, 118, 117, 116, 115, 114, // A#3 to +7 - 113, 113, 112, 111, 110, 109, 109, 108 // B-3 to +7 + 907, 900, 894, 887, 881, 875, 868, 862, // -8 to -1 + 856, 850, 844, 838, 832, 826, 820, 814, // C-1 to +7 + 808, 802, 796, 791, 785, 779, 774, 768, // C#1 to +7 + 762, 757, 752, 746, 741, 736, 730, 725, // D-1 to +7 + 720, 715, 709, 704, 699, 694, 689, 684, // D#1 to +7 + 678, 675, 670, 665, 660, 655, 651, 646, // E-1 to +7 + 640, 636, 632, 628, 623, 619, 614, 610, // F-1 to +7 + 604, 601, 597, 592, 588, 584, 580, 575, // F#1 to +7 + 570, 567, 563, 559, 555, 551, 547, 543, // G-1 to +7 + 538, 535, 532, 528, 524, 520, 516, 513, // G#1 to +7 + 508, 505, 502, 498, 494, 491, 487, 484, // A-1 to +7 + 480, 477, 474, 470, 467, 463, 460, 457, // A#1 to +7 + 453, 450, 447, 444, 441, 437, 434, 431, // B-1 to +7 + 428, 425, 422, 419, 416, 413, 410, 407, // C-2 to +7 + 404, 401, 398, 395, 392, 390, 387, 384, // C#2 to +7 + 381, 379, 376, 373, 370, 368, 365, 363, // D-2 to +7 + 360, 357, 355, 352, 350, 347, 345, 342, // D#2 to +7 + 339, 337, 335, 332, 330, 328, 325, 323, // E-2 to +7 + 320, 318, 316, 314, 312, 309, 307, 305, // F-2 to +7 + 302, 300, 298, 296, 294, 292, 290, 288, // F#2 to +7 + 285, 284, 282, 280, 278, 276, 274, 272, // G-2 to +7 + 269, 268, 266, 264, 262, 260, 258, 256, // G#2 to +7 + 254, 253, 251, 249, 247, 245, 244, 242, // A-2 to +7 + 240, 238, 237, 235, 233, 232, 230, 228, // A#2 to +7 + 226, 225, 223, 222, 220, 219, 217, 216, // B-2 to +7 + 214, 212, 211, 209, 208, 206, 205, 203, // C-3 to +7 + 202, 200, 199, 198, 196, 195, 193, 192, // C#3 to +7 + 190, 189, 188, 187, 185, 184, 183, 181, // D-3 to +7 + 180, 179, 177, 176, 175, 174, 172, 171, // D#3 to +7 + 170, 169, 167, 166, 165, 164, 163, 161, // E-3 to +7 + 160, 159, 158, 157, 156, 155, 154, 152, // F-3 to +7 + 151, 150, 149, 148, 147, 146, 145, 144, // F#3 to +7 + 143, 142, 141, 140, 139, 138, 137, 136, // G-3 to +7 + 135, 134, 133, 132, 131, 130, 129, 128, // G#3 to +7 + 127, 126, 125, 125, 123, 123, 122, 121, // A-3 to +7 + 120, 119, 118, 118, 117, 116, 115, 114, // A#3 to +7 + 113, 113, 112, 111, 110, 109, 109, 108 // B-3 to +7 }; #define ReadAmigaPeriods(a) (uint16_t)pgm_read_word(amigaPeriods + (a)) static const uint8_t sine[64] PROGMEM = { - 0, 24, 49, 74, 97, 120, 141, 161, - 180, 197, 212, 224, 235, 244, 250, 253, - 255, 253, 250, 244, 235, 224, 212, 197, - 180, 161, 141, 120, 97, 74, 49, 24 + 0, 24, 49, 74, 97, 120, 141, 161, + 180, 197, 212, 224, 235, 244, 250, 253, + 255, 253, 250, 244, 235, 224, 212, 197, + 180, 161, 141, 120, 97, 74, 49, 24 }; #define ReadSine(a) pgm_read_byte(sine + (a)) -static inline uint16_t MakeWord(uint8_t h, uint8_t l) { return h << 8 | l; } - -bool AudioGeneratorMOD::LoadHeader() -{ - uint8_t i; - uint8_t temp[4]; - uint8_t junk[22]; - - if (20 != file->read(/*Mod.name*/junk, 20)) return false; // Skip MOD name - for (i = 0; i < SAMPLES; i++) { - if (22 != file->read(junk /*Mod.samples[i].name*/, 22)) return false; // Skip sample name - if (2 != file->read(temp, 2)) return false; - Mod.samples[i].length = MakeWord(temp[0], temp[1]) * 2; - if (1 != file->read(reinterpret_cast(&Mod.samples[i].fineTune), 1)) return false; - if (Mod.samples[i].fineTune > 7) Mod.samples[i].fineTune -= 16; - if (1 != file->read(&Mod.samples[i].volume, 1)) return false; - if (2 != file->read(temp, 2)) return false; - Mod.samples[i].loopBegin = MakeWord(temp[0], temp[1]) * 2; - if (2 != file->read(temp, 2)) return false; - Mod.samples[i].loopLength = MakeWord(temp[0], temp[1]) * 2; - if (Mod.samples[i].loopBegin + Mod.samples[i].loopLength > Mod.samples[i].length) - Mod.samples[i].loopLength = Mod.samples[i].length - Mod.samples[i].loopBegin; - } - - if (1 != file->read(&Mod.songLength, 1)) return false; - if (1 != file->read(temp, 1)) return false; // Discard this byte - - Mod.numberOfPatterns = 0; - for (i = 0; i < 128; i++) { - if (1 != file->read(&Mod.order[i], 1)) return false; - if (Mod.order[i] > Mod.numberOfPatterns) - Mod.numberOfPatterns = Mod.order[i]; - } - Mod.numberOfPatterns++; - - // Offset 1080 - if (4 != file->read(temp, 4)) return false;; - if (!strncmp(reinterpret_cast(temp + 1), "CHN", 3)) - Mod.numberOfChannels = temp[0] - '0'; - else if (!strncmp(reinterpret_cast(temp + 2), "CH", 2)) - Mod.numberOfChannels = (temp[0] - '0') * 10 + temp[1] - '0'; - else - Mod.numberOfChannels = 4; - - return true; +static inline uint16_t MakeWord(uint8_t h, uint8_t l) { + return h << 8 | l; } -void AudioGeneratorMOD::LoadSamples() -{ - uint8_t i; - uint32_t fileOffset = 1084 + Mod.numberOfPatterns * ROWS * Mod.numberOfChannels * 4 - 1; +bool AudioGeneratorMOD::LoadHeader() { + uint8_t i; + uint8_t temp[4]; + uint8_t junk[22]; - for (i = 0; i < SAMPLES; i++) { + if (20 != file->read(/*Mod.name*/junk, 20)) { + return false; // Skip MOD name + } + for (i = 0; i < SAMPLES; i++) { + if (22 != file->read(junk /*Mod.samples[i].name*/, 22)) { + return false; // Skip sample name + } + if (2 != file->read(temp, 2)) { + return false; + } + Mod.samples[i].length = MakeWord(temp[0], temp[1]) * 2; + if (1 != file->read(reinterpret_cast(&Mod.samples[i].fineTune), 1)) { + return false; + } + if (Mod.samples[i].fineTune > 7) { + Mod.samples[i].fineTune -= 16; + } + if (1 != file->read(&Mod.samples[i].volume, 1)) { + return false; + } + if (2 != file->read(temp, 2)) { + return false; + } + Mod.samples[i].loopBegin = MakeWord(temp[0], temp[1]) * 2; + if (2 != file->read(temp, 2)) { + return false; + } + Mod.samples[i].loopLength = MakeWord(temp[0], temp[1]) * 2; + if (Mod.samples[i].loopBegin + Mod.samples[i].loopLength > Mod.samples[i].length) { + Mod.samples[i].loopLength = Mod.samples[i].length - Mod.samples[i].loopBegin; + } + } - if (Mod.samples[i].length) { - Mixer.sampleBegin[i] = fileOffset; - Mixer.sampleEnd[i] = fileOffset + Mod.samples[i].length; - if (Mod.samples[i].loopLength > 2) { - Mixer.sampleloopBegin[i] = fileOffset + Mod.samples[i].loopBegin; - Mixer.sampleLoopLength[i] = Mod.samples[i].loopLength; - Mixer.sampleLoopEnd[i] = Mixer.sampleloopBegin[i] + Mixer.sampleLoopLength[i]; - } else { - Mixer.sampleloopBegin[i] = 0; - Mixer.sampleLoopLength[i] = 0; - Mixer.sampleLoopEnd[i] = 0; - } - fileOffset += Mod.samples[i].length; + if (1 != file->read(&Mod.songLength, 1)) { + return false; + } + if (1 != file->read(temp, 1)) { + return false; // Discard this byte } - } + Mod.numberOfPatterns = 0; + for (i = 0; i < 128; i++) { + if (1 != file->read(&Mod.order[i], 1)) { + return false; + } + if (Mod.order[i] > Mod.numberOfPatterns) { + Mod.numberOfPatterns = Mod.order[i]; + } + } + Mod.numberOfPatterns++; + + // Offset 1080 + if (4 != file->read(temp, 4)) { + return false; + }; + if (!strncmp(reinterpret_cast(temp + 1), "CHN", 3)) { + Mod.numberOfChannels = temp[0] - '0'; + } else if (!strncmp(reinterpret_cast(temp + 2), "CH", 2)) { + Mod.numberOfChannels = (temp[0] - '0') * 10 + temp[1] - '0'; + } else { + Mod.numberOfChannels = 4; + } + + if (Mod.numberOfChannels > CHANNELS) { + audioLogger->printf("\nAudioGeneratorMOD::LoadHeader abort - too many channels (configured: %d, needed: %d)\n", CHANNELS, Mod.numberOfChannels); + return (false); + } + return true; } -bool AudioGeneratorMOD::LoadPattern(uint8_t pattern) -{ - uint8_t row; - uint8_t channel; - uint8_t i; - uint8_t temp[4]; - uint16_t amigaPeriod; +void AudioGeneratorMOD::LoadSamples() { + uint8_t i; + uint32_t fileOffset = 1084 + Mod.numberOfPatterns * ROWS * Mod.numberOfChannels * 4 - 1; + + for (i = 0; i < SAMPLES; i++) { + + if (Mod.samples[i].length) { + Mixer.sampleBegin[i] = fileOffset; + Mixer.sampleEnd[i] = fileOffset + Mod.samples[i].length; + if (Mod.samples[i].loopLength > 2) { + Mixer.sampleloopBegin[i] = fileOffset + Mod.samples[i].loopBegin; + Mixer.sampleLoopLength[i] = Mod.samples[i].loopLength; + Mixer.sampleLoopEnd[i] = Mixer.sampleloopBegin[i] + Mixer.sampleLoopLength[i]; + } else { + Mixer.sampleloopBegin[i] = 0; + Mixer.sampleLoopLength[i] = 0; + Mixer.sampleLoopEnd[i] = 0; + } + fileOffset += Mod.samples[i].length; + } - if (!file->seek(1084 + pattern * ROWS * Mod.numberOfChannels * 4, SEEK_SET)) return false; + } - for (row = 0; row < ROWS; row++) { - for (channel = 0; channel < Mod.numberOfChannels; channel++) { +} + +bool AudioGeneratorMOD::LoadPattern(uint8_t pattern) { + uint8_t row; + uint8_t channel; + uint8_t i; + uint8_t temp[4]; + uint16_t amigaPeriod; + + if (!file->seek(1084 + pattern * ROWS * Mod.numberOfChannels * 4, SEEK_SET)) { + return false; + } + + for (row = 0; row < ROWS; row++) { + for (channel = 0; channel < Mod.numberOfChannels; channel++) { - if (4 != file->read(temp, 4)) return false; + if (4 != file->read(temp, 4)) { + return false; + } - Player.currentPattern.sampleNumber[row][channel] = (temp[0] & 0xF0) + (temp[2] >> 4); + Player.currentPattern.sampleNumber[row][channel] = (temp[0] & 0xF0) + (temp[2] >> 4); - amigaPeriod = ((temp[0] & 0xF) << 8) + temp[1]; - // Player.currentPattern.note[row][channel] = NONOTE; - Player.currentPattern.note8[row][channel] = NONOTE8; - for (i = 1; i < 37; i++) - if (amigaPeriod > ReadAmigaPeriods(i * 8) - 3 && - amigaPeriod < ReadAmigaPeriods(i * 8) + 3) - Player.currentPattern.note8[row][channel] = i; + amigaPeriod = ((temp[0] & 0xF) << 8) + temp[1]; + // Player.currentPattern.note[row][channel] = NONOTE; + Player.currentPattern.note8[row][channel] = NONOTE8; + for (i = 1; i < 37; i++) + if (amigaPeriod > ReadAmigaPeriods(i * 8) - 3 && + amigaPeriod < ReadAmigaPeriods(i * 8) + 3) { + Player.currentPattern.note8[row][channel] = i; + } - Player.currentPattern.effectNumber[row][channel] = temp[2] & 0xF; - Player.currentPattern.effectParameter[row][channel] = temp[3]; + Player.currentPattern.effectNumber[row][channel] = temp[2] & 0xF; + Player.currentPattern.effectParameter[row][channel] = temp[3]; + } } - } - return true; + return true; } -void AudioGeneratorMOD::Portamento(uint8_t channel) -{ - if (Player.lastAmigaPeriod[channel] < Player.portamentoNote[channel]) { - Player.lastAmigaPeriod[channel] += Player.portamentoSpeed[channel]; - if (Player.lastAmigaPeriod[channel] > Player.portamentoNote[channel]) - Player.lastAmigaPeriod[channel] = Player.portamentoNote[channel]; - } - if (Player.lastAmigaPeriod[channel] > Player.portamentoNote[channel]) { - Player.lastAmigaPeriod[channel] -= Player.portamentoSpeed[channel]; - if (Player.lastAmigaPeriod[channel] < Player.portamentoNote[channel]) - Player.lastAmigaPeriod[channel] = Player.portamentoNote[channel]; - } - Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; +void AudioGeneratorMOD::Portamento(uint8_t channel) { + if (Player.lastAmigaPeriod[channel] < Player.portamentoNote[channel]) { + Player.lastAmigaPeriod[channel] += Player.portamentoSpeed[channel]; + if (Player.lastAmigaPeriod[channel] > Player.portamentoNote[channel]) { + Player.lastAmigaPeriod[channel] = Player.portamentoNote[channel]; + } + } + if (Player.lastAmigaPeriod[channel] > Player.portamentoNote[channel]) { + Player.lastAmigaPeriod[channel] -= Player.portamentoSpeed[channel]; + if (Player.lastAmigaPeriod[channel] < Player.portamentoNote[channel]) { + Player.lastAmigaPeriod[channel] = Player.portamentoNote[channel]; + } + } + Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; } -void AudioGeneratorMOD::Vibrato(uint8_t channel) -{ - uint16_t delta; - uint16_t temp; +void AudioGeneratorMOD::Vibrato(uint8_t channel) { + uint16_t delta; + uint16_t temp; - temp = Player.vibratoPos[channel] & 31; + temp = Player.vibratoPos[channel] & 31; - switch (Player.waveControl[channel] & 3) { + switch (Player.waveControl[channel] & 3) { case 0: - delta = ReadSine(temp); - break; + delta = ReadSine(temp); + break; case 1: - temp <<= 3; - if (Player.vibratoPos[channel] < 0) - temp = 255 - temp; - delta = temp; - break; + temp <<= 3; + if (Player.vibratoPos[channel] < 0) { + temp = 255 - temp; + } + delta = temp; + break; case 2: - delta = 255; - break; + delta = 255; + break; case 3: - delta = rand() & 255; - break; - } + delta = rand() & 255; + break; + } - delta *= Player.vibratoDepth[channel]; - delta >>= 7; + delta *= Player.vibratoDepth[channel]; + delta >>= 7; - if (Player.vibratoPos[channel] >= 0) - Mixer.channelFrequency[channel] = Player.amiga / (Player.lastAmigaPeriod[channel] + delta); - else - Mixer.channelFrequency[channel] = Player.amiga / (Player.lastAmigaPeriod[channel] - delta); + if (Player.vibratoPos[channel] >= 0) { + Mixer.channelFrequency[channel] = Player.amiga / (Player.lastAmigaPeriod[channel] + delta); + } else { + Mixer.channelFrequency[channel] = Player.amiga / (Player.lastAmigaPeriod[channel] - delta); + } - Player.vibratoPos[channel] += Player.vibratoSpeed[channel]; - if (Player.vibratoPos[channel] > 31) Player.vibratoPos[channel] -= 64; + Player.vibratoPos[channel] += Player.vibratoSpeed[channel]; + if (Player.vibratoPos[channel] > 31) { + Player.vibratoPos[channel] -= 64; + } } -void AudioGeneratorMOD::Tremolo(uint8_t channel) -{ - uint16_t delta; - uint16_t temp; +void AudioGeneratorMOD::Tremolo(uint8_t channel) { + uint16_t delta; + uint16_t temp; - temp = Player.tremoloPos[channel] & 31; + temp = Player.tremoloPos[channel] & 31; - switch (Player.waveControl[channel] & 3) { + switch (Player.waveControl[channel] & 3) { case 0: - delta = ReadSine(temp); - break; + delta = ReadSine(temp); + break; case 1: - temp <<= 3; - if (Player.tremoloPos[channel] < 0) - temp = 255 - temp; - delta = temp; - break; + temp <<= 3; + if (Player.tremoloPos[channel] < 0) { + temp = 255 - temp; + } + delta = temp; + break; case 2: - delta = 255; - break; + delta = 255; + break; case 3: - delta = rand() & 255; - break; - } - - delta *= Player.tremoloDepth[channel]; - delta >>= 6; - - if (Player.tremoloPos[channel] >= 0) { - if (Player.volume[channel] + delta > 64) delta = 64 - Player.volume[channel]; - Mixer.channelVolume[channel] = Player.volume[channel] + delta; - } else { - if (Player.volume[channel] - delta < 0) delta = Player.volume[channel]; - Mixer.channelVolume[channel] = Player.volume[channel] - delta; - } - - Player.tremoloPos[channel] += Player.tremoloSpeed[channel]; - if (Player.tremoloPos[channel] > 31) Player.tremoloPos[channel] -= 64; -} - -bool AudioGeneratorMOD::ProcessRow() -{ - bool jumpFlag; - bool breakFlag; - uint8_t channel; - uint8_t sampleNumber; - uint16_t note; - uint8_t effectNumber; - uint8_t effectParameter; - uint8_t effectParameterX; - uint8_t effectParameterY; - uint16_t sampleOffset; - - if (!running) return false; - - Player.lastRow = Player.row++; - jumpFlag = false; - breakFlag = false; - for (channel = 0; channel < Mod.numberOfChannels; channel++) { - - sampleNumber = Player.currentPattern.sampleNumber[Player.lastRow][channel]; - note = NOTE(Player.lastRow, channel); - effectNumber = Player.currentPattern.effectNumber[Player.lastRow][channel]; - effectParameter = Player.currentPattern.effectParameter[Player.lastRow][channel]; - effectParameterX = effectParameter >> 4; - effectParameterY = effectParameter & 0xF; - sampleOffset = 0; - - if (sampleNumber) { - Player.lastSampleNumber[channel] = sampleNumber - 1; - if (!(effectParameter == 0xE && effectParameterX == NOTEDELAY)) - Player.volume[channel] = Mod.samples[Player.lastSampleNumber[channel]].volume; - } - - if (note != NONOTE) { - Player.lastNote[channel] = note; - Player.amigaPeriod[channel] = ReadAmigaPeriods(note + Mod.samples[Player.lastSampleNumber[channel]].fineTune); - - if (effectNumber != TONEPORTAMENTO && effectNumber != PORTAMENTOVOLUMESLIDE) - Player.lastAmigaPeriod[channel] = Player.amigaPeriod[channel]; - - if (!(Player.waveControl[channel] & 0x80)) Player.vibratoPos[channel] = 0; - if (!(Player.waveControl[channel] & 0x08)) Player.tremoloPos[channel] = 0; - } - - switch (effectNumber) { - case TONEPORTAMENTO: - if (effectParameter) Player.portamentoSpeed[channel] = effectParameter; - Player.portamentoNote[channel] = Player.amigaPeriod[channel]; - note = NONOTE; + delta = rand() & 255; break; + } - case VIBRATO: - if (effectParameterX) Player.vibratoSpeed[channel] = effectParameterX; - if (effectParameterY) Player.vibratoDepth[channel] = effectParameterY; - break; + delta *= Player.tremoloDepth[channel]; + delta >>= 6; - case PORTAMENTOVOLUMESLIDE: - Player.portamentoNote[channel] = Player.amigaPeriod[channel]; - note = NONOTE; - break; + if (Player.tremoloPos[channel] >= 0) { + if (Player.volume[channel] + delta > 64) { + delta = 64 - Player.volume[channel]; + } + Mixer.channelVolume[channel] = Player.volume[channel] + delta; + } else { + if (Player.volume[channel] - delta < 0) { + delta = Player.volume[channel]; + } + Mixer.channelVolume[channel] = Player.volume[channel] - delta; + } - case TREMOLO: - if (effectParameterX) Player.tremoloSpeed[channel] = effectParameterX; - if (effectParameterY) Player.tremoloDepth[channel] = effectParameterY; - break; + Player.tremoloPos[channel] += Player.tremoloSpeed[channel]; + if (Player.tremoloPos[channel] > 31) { + Player.tremoloPos[channel] -= 64; + } +} - case SETCHANNELPANNING: - Mixer.channelPanning[channel] = effectParameter >> 1; - break; +bool AudioGeneratorMOD::ProcessRow() { + bool jumpFlag; + bool breakFlag; + uint8_t channel; + uint8_t sampleNumber; + uint16_t note; + uint8_t effectNumber; + uint8_t effectParameter; + uint8_t effectParameterX; + uint8_t effectParameterY; + uint16_t sampleOffset; + + if (!running) { + return false; + } - case SETSAMPLEOFFSET: - sampleOffset = effectParameter << 8; - if (sampleOffset > Mod.samples[Player.lastSampleNumber[channel]].length) - sampleOffset = Mod.samples[Player.lastSampleNumber[channel]].length; - break; + Player.lastRow = Player.row++; + jumpFlag = false; + breakFlag = false; + for (channel = 0; channel < Mod.numberOfChannels; channel++) { - case JUMPTOORDER: - Player.orderIndex = effectParameter; - if (Player.orderIndex >= Mod.songLength) - Player.orderIndex = 0; - Player.row = 0; - jumpFlag = true; - break; + sampleNumber = Player.currentPattern.sampleNumber[Player.lastRow][channel]; + note = NOTE(Player.lastRow, channel); + effectNumber = Player.currentPattern.effectNumber[Player.lastRow][channel]; + effectParameter = Player.currentPattern.effectParameter[Player.lastRow][channel]; + effectParameterX = effectParameter >> 4; + effectParameterY = effectParameter & 0xF; + sampleOffset = 0; + + if (sampleNumber) { + Player.lastSampleNumber[channel] = sampleNumber - 1; + if (!(effectNumber == 0xE && effectParameterX == NOTEDELAY)) { + Player.volume[channel] = Mod.samples[Player.lastSampleNumber[channel]].volume; + } + } - case SETVOLUME: - if (effectParameter > 64) Player.volume[channel] = 64; - else Player.volume[channel] = effectParameter; - break; + if (note != NONOTE) { + Player.lastNote[channel] = note; + Player.amigaPeriod[channel] = ReadAmigaPeriods(note + Mod.samples[Player.lastSampleNumber[channel]].fineTune); - case BREAKPATTERNTOROW: - Player.row = effectParameterX * 10 + effectParameterY; - if (Player.row >= ROWS) - Player.row = 0; - if (!jumpFlag && !breakFlag) { - Player.orderIndex++; - if (Player.orderIndex >= Mod.songLength) - Player.orderIndex = 0; - } - breakFlag = true; - break; + if (effectNumber != TONEPORTAMENTO && effectNumber != PORTAMENTOVOLUMESLIDE) { + Player.lastAmigaPeriod[channel] = Player.amigaPeriod[channel]; + } - case 0xE: - switch (effectParameterX) { - case FINEPORTAMENTOUP: - Player.lastAmigaPeriod[channel] -= effectParameterY; - break; + if (!(Player.waveControl[channel] & 0x80)) { + Player.vibratoPos[channel] = 0; + } + if (!(Player.waveControl[channel] & 0x08)) { + Player.tremoloPos[channel] = 0; + } + } - case FINEPORTAMENTODOWN: - Player.lastAmigaPeriod[channel] += effectParameterY; + switch (effectNumber) { + case TONEPORTAMENTO: + if (effectParameter) { + Player.portamentoSpeed[channel] = effectParameter; + } + Player.portamentoNote[channel] = Player.amigaPeriod[channel]; + note = NONOTE; break; - case SETVIBRATOWAVEFORM: - Player.waveControl[channel] &= 0xF0; - Player.waveControl[channel] |= effectParameterY; + case VIBRATO: + if (effectParameterX) { + Player.vibratoSpeed[channel] = effectParameterX; + } + if (effectParameterY) { + Player.vibratoDepth[channel] = effectParameterY; + } break; - case SETFINETUNE: - Mod.samples[Player.lastSampleNumber[channel]].fineTune = effectParameterY; - if (Mod.samples[Player.lastSampleNumber[channel]].fineTune > 7) - Mod.samples[Player.lastSampleNumber[channel]].fineTune -= 16; + case PORTAMENTOVOLUMESLIDE: + Player.portamentoNote[channel] = Player.amigaPeriod[channel]; + note = NONOTE; break; - case PATTERNLOOP: + case TREMOLO: + if (effectParameterX) { + Player.tremoloSpeed[channel] = effectParameterX; + } if (effectParameterY) { - if (Player.patternLoopCount[channel]) - Player.patternLoopCount[channel]--; - else - Player.patternLoopCount[channel] = effectParameterY; - if (Player.patternLoopCount[channel]) - Player.row = Player.patternLoopRow[channel] - 1; - } else - Player.patternLoopRow[channel] = Player.row; + Player.tremoloDepth[channel] = effectParameterY; + } break; - case SETTREMOLOWAVEFORM: - Player.waveControl[channel] &= 0xF; - Player.waveControl[channel] |= effectParameterY << 4; + case SETCHANNELPANNING: + Mixer.channelPanning[channel] = effectParameter >> 1; break; - case FINEVOLUMESLIDEUP: - Player.volume[channel] += effectParameterY; - if (Player.volume[channel] > 64) Player.volume[channel] = 64; + case SETSAMPLEOFFSET: + sampleOffset = effectParameter << 8; + if (sampleOffset > Mod.samples[Player.lastSampleNumber[channel]].length) { + sampleOffset = Mod.samples[Player.lastSampleNumber[channel]].length; + } break; - case FINEVOLUMESLIDEDOWN: - Player.volume[channel] -= effectParameterY; - if (Player.volume[channel] < 0) Player.volume[channel] = 0; + case JUMPTOORDER: + Player.orderIndex = effectParameter; + if (Player.orderIndex >= Mod.songLength) { + Player.orderIndex = 0; + } + Player.row = 0; + jumpFlag = true; break; - case NOTECUT: - note = NONOTE; + case SETVOLUME: + if (effectParameter > 64) { + Player.volume[channel] = 64; + } else { + Player.volume[channel] = effectParameter; + } break; - case PATTERNDELAY: - Player.patternDelay = effectParameterY; + case BREAKPATTERNTOROW: + Player.row = effectParameterX * 10 + effectParameterY; + if (Player.row >= ROWS) { + Player.row = 0; + } + if (!jumpFlag && !breakFlag) { + Player.orderIndex++; + if (Player.orderIndex >= Mod.songLength) { + Player.orderIndex = 0; + } + } + breakFlag = true; break; - case INVERTLOOP: + case 0xE: + switch (effectParameterX) { + case FINEPORTAMENTOUP: + Player.lastAmigaPeriod[channel] -= effectParameterY; + break; - break; - } - break; + case FINEPORTAMENTODOWN: + Player.lastAmigaPeriod[channel] += effectParameterY; + break; - case SETSPEED: - if (effectParameter < 0x20) - Player.speed = effectParameter; - else - Player.samplesPerTick = sampleRate / (2 * effectParameter / 5); - break; - } + case SETVIBRATOWAVEFORM: + Player.waveControl[channel] &= 0xF0; + Player.waveControl[channel] |= effectParameterY; + break; - if (note != NONOTE || (Player.lastAmigaPeriod[channel] && - effectNumber != VIBRATO && effectNumber != VIBRATOVOLUMESLIDE && - !(effectNumber == 0xE && effectParameterX == NOTEDELAY))) - Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + case SETFINETUNE: + Mod.samples[Player.lastSampleNumber[channel]].fineTune = effectParameterY; + if (Mod.samples[Player.lastSampleNumber[channel]].fineTune > 7) { + Mod.samples[Player.lastSampleNumber[channel]].fineTune -= 16; + } + break; - if (note != NONOTE) - Mixer.channelSampleOffset[channel] = sampleOffset << DIVIDER; + case PATTERNLOOP: + if (effectParameterY) { + if (Player.patternLoopCount[channel]) { + Player.patternLoopCount[channel]--; + } else { + Player.patternLoopCount[channel] = effectParameterY; + } + if (Player.patternLoopCount[channel]) { + Player.row = Player.patternLoopRow[channel] - 1; + } + } else { + Player.patternLoopRow[channel] = Player.row; + } + break; - if (sampleNumber) - Mixer.channelSampleNumber[channel] = Player.lastSampleNumber[channel]; + case SETTREMOLOWAVEFORM: + Player.waveControl[channel] &= 0xF; + Player.waveControl[channel] |= effectParameterY << 4; + break; - if (effectNumber != TREMOLO) - Mixer.channelVolume[channel] = Player.volume[channel]; + case FINEVOLUMESLIDEUP: + Player.volume[channel] += effectParameterY; + if (Player.volume[channel] > 64) { + Player.volume[channel] = 64; + } + break; - } - return true; -} + case FINEVOLUMESLIDEDOWN: + Player.volume[channel] -= effectParameterY; + if (Player.volume[channel] < 0) { + Player.volume[channel] = 0; + } + break; -bool AudioGeneratorMOD::ProcessTick() -{ - uint8_t channel; - uint8_t sampleNumber; - uint16_t note; - uint8_t effectNumber; - uint8_t effectParameter; - uint8_t effectParameterX; - uint8_t effectParameterY; - uint16_t tempNote; - - if (!running) return false; - - for (channel = 0; channel < Mod.numberOfChannels; channel++) { - - if (Player.lastAmigaPeriod[channel]) { - - sampleNumber = Player.currentPattern.sampleNumber[Player.lastRow][channel]; - // note = Player.currentPattern.note[Player.lastRow][channel]; - note = NOTE(Player.lastRow, channel); - effectNumber = Player.currentPattern.effectNumber[Player.lastRow][channel]; - effectParameter = Player.currentPattern.effectParameter[Player.lastRow][channel]; - effectParameterX = effectParameter >> 4; - effectParameterY = effectParameter & 0xF; - - switch (effectNumber) { - case ARPEGGIO: - if (effectParameter) - switch (Player.tick % 3) { - case 0: - Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + case NOTECUT: + note = NONOTE; break; - case 1: - tempNote = Player.lastNote[channel] + effectParameterX * 8 + Mod.samples[Player.lastSampleNumber[channel]].fineTune; - if (tempNote < 296) Mixer.channelFrequency[channel] = Player.amiga / ReadAmigaPeriods(tempNote); + + case PATTERNDELAY: + Player.patternDelay = effectParameterY; break; - case 2: - tempNote = Player.lastNote[channel] + effectParameterY * 8 + Mod.samples[Player.lastSampleNumber[channel]].fineTune; - if (tempNote < 296) Mixer.channelFrequency[channel] = Player.amiga / ReadAmigaPeriods(tempNote); + + case INVERTLOOP: + break; } - break; + break; - case PORTAMENTOUP: - Player.lastAmigaPeriod[channel] -= effectParameter; - if (Player.lastAmigaPeriod[channel] < 113) Player.lastAmigaPeriod[channel] = 113; - Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; - break; + case SETSPEED: + if (effectParameter < 0x20) { + Player.speed = effectParameter; + } else { + Player.samplesPerTick = sampleRate / (2 * effectParameter / 5); + } + break; + } - case PORTAMENTODOWN: - Player.lastAmigaPeriod[channel] += effectParameter; - if (Player.lastAmigaPeriod[channel] > 856) Player.lastAmigaPeriod[channel] = 856; - Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; - break; + if (note != NONOTE || (Player.lastAmigaPeriod[channel] && + effectNumber != VIBRATO && effectNumber != VIBRATOVOLUMESLIDE && + !(effectNumber == 0xE && effectParameterX == NOTEDELAY))) { + Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + } - case TONEPORTAMENTO: - Portamento(channel); - break; + if (note != NONOTE) { + Mixer.channelSampleOffset[channel] = sampleOffset << FIXED_DIVIDER; + } - case VIBRATO: - Vibrato(channel); - break; + if (sampleNumber) { + Mixer.channelSampleNumber[channel] = Player.lastSampleNumber[channel]; + } - case PORTAMENTOVOLUMESLIDE: - Portamento(channel); - Player.volume[channel] += effectParameterX - effectParameterY; - if (Player.volume[channel] < 0) Player.volume[channel] = 0; - else if (Player.volume[channel] > 64) Player.volume[channel] = 64; - Mixer.channelVolume[channel] = Player.volume[channel]; - break; - - case VIBRATOVOLUMESLIDE: - Vibrato(channel); - Player.volume[channel] += effectParameterX - effectParameterY; - if (Player.volume[channel] < 0) Player.volume[channel] = 0; - else if (Player.volume[channel] > 64) Player.volume[channel] = 64; - Mixer.channelVolume[channel] = Player.volume[channel]; - break; + if (effectNumber != TREMOLO) { + Mixer.channelVolume[channel] = Player.volume[channel]; + } - case TREMOLO: - Tremolo(channel); - break; + } + return true; +} - case VOLUMESLIDE: - Player.volume[channel] += effectParameterX - effectParameterY; - if (Player.volume[channel] < 0) Player.volume[channel] = 0; - else if (Player.volume[channel] > 64) Player.volume[channel] = 64; - Mixer.channelVolume[channel] = Player.volume[channel]; - break; +bool AudioGeneratorMOD::ProcessTick() { + uint8_t channel; + uint8_t sampleNumber; + uint16_t note; + uint8_t effectNumber; + uint8_t effectParameter; + uint8_t effectParameterX; + uint8_t effectParameterY; + uint16_t tempNote; + + if (!running) { + return false; + } - case 0xE: - switch (effectParameterX) { - case RETRIGGERNOTE: - if (!effectParameterY) break; - if (!(Player.tick % effectParameterY)) { - Mixer.channelSampleOffset[channel] = 0; - } - break; + for (channel = 0; channel < Mod.numberOfChannels; channel++) { - case NOTECUT: - if (Player.tick == effectParameterY) - Mixer.channelVolume[channel] = Player.volume[channel] = 0; - break; - - case NOTEDELAY: - if (Player.tick == effectParameterY) { - if (sampleNumber) Player.volume[channel] = Mod.samples[Player.lastSampleNumber[channel]].volume; - if (note != NONOTE) Mixer.channelSampleOffset[channel] = 0; + if (Player.lastAmigaPeriod[channel]) { + + sampleNumber = Player.currentPattern.sampleNumber[Player.lastRow][channel]; + // note = Player.currentPattern.note[Player.lastRow][channel]; + note = NOTE(Player.lastRow, channel); + effectNumber = Player.currentPattern.effectNumber[Player.lastRow][channel]; + effectParameter = Player.currentPattern.effectParameter[Player.lastRow][channel]; + effectParameterX = effectParameter >> 4; + effectParameterY = effectParameter & 0xF; + + switch (effectNumber) { + case ARPEGGIO: + if (effectParameter) + switch (Player.tick % 3) { + case 0: + Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + break; + case 1: + tempNote = Player.lastNote[channel] + effectParameterX * 8 + Mod.samples[Player.lastSampleNumber[channel]].fineTune; + if (tempNote < 296) { + Mixer.channelFrequency[channel] = Player.amiga / ReadAmigaPeriods(tempNote); + } + break; + case 2: + tempNote = Player.lastNote[channel] + effectParameterY * 8 + Mod.samples[Player.lastSampleNumber[channel]].fineTune; + if (tempNote < 296) { + Mixer.channelFrequency[channel] = Player.amiga / ReadAmigaPeriods(tempNote); + } + break; + } + break; + + case PORTAMENTOUP: + Player.lastAmigaPeriod[channel] -= effectParameter; + if (Player.lastAmigaPeriod[channel] < 113) { + Player.lastAmigaPeriod[channel] = 113; + } + Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + break; + + case PORTAMENTODOWN: + Player.lastAmigaPeriod[channel] += effectParameter; + if (Player.lastAmigaPeriod[channel] > 856) { + Player.lastAmigaPeriod[channel] = 856; + } Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + break; + + case TONEPORTAMENTO: + Portamento(channel); + break; + + case VIBRATO: + Vibrato(channel); + break; + + case PORTAMENTOVOLUMESLIDE: + Portamento(channel); + Player.volume[channel] += effectParameterX - effectParameterY; + if (Player.volume[channel] < 0) { + Player.volume[channel] = 0; + } else if (Player.volume[channel] > 64) { + Player.volume[channel] = 64; + } Mixer.channelVolume[channel] = Player.volume[channel]; - } - break; - } - break; - } + break; - } + case VIBRATOVOLUMESLIDE: + Vibrato(channel); + Player.volume[channel] += effectParameterX - effectParameterY; + if (Player.volume[channel] < 0) { + Player.volume[channel] = 0; + } else if (Player.volume[channel] > 64) { + Player.volume[channel] = 64; + } + Mixer.channelVolume[channel] = Player.volume[channel]; + break; - } - return true; -} + case TREMOLO: + Tremolo(channel); + break; + + case VOLUMESLIDE: + Player.volume[channel] += effectParameterX - effectParameterY; + if (Player.volume[channel] < 0) { + Player.volume[channel] = 0; + } else if (Player.volume[channel] > 64) { + Player.volume[channel] = 64; + } + Mixer.channelVolume[channel] = Player.volume[channel]; + break; -bool AudioGeneratorMOD::RunPlayer() -{ - if (!running) return false; + case 0xE: + switch (effectParameterX) { + case RETRIGGERNOTE: + if (!effectParameterY) { + break; + } + if (!(Player.tick % effectParameterY)) { + Mixer.channelSampleOffset[channel] = 0; + } + break; + + case NOTECUT: + if (Player.tick == effectParameterY) { + Mixer.channelVolume[channel] = Player.volume[channel] = 0; + } + break; + + case NOTEDELAY: + if (Player.tick == effectParameterY) { + if (sampleNumber) { + Player.volume[channel] = Mod.samples[Player.lastSampleNumber[channel]].volume; + } + if (note != NONOTE) { + Mixer.channelSampleOffset[channel] = 0; + } + Mixer.channelFrequency[channel] = Player.amiga / Player.lastAmigaPeriod[channel]; + Mixer.channelVolume[channel] = Player.volume[channel]; + } + break; + } + break; + } - if (Player.tick == Player.speed) { - Player.tick = 0; + } - if (Player.row == ROWS) { - Player.orderIndex++; - if (Player.orderIndex == Mod.songLength) - { - //Player.orderIndex = 0; - // No loop, just say we're done! + } + return true; +} + +bool AudioGeneratorMOD::RunPlayer() { + if (!running) { return false; - } - Player.row = 0; } - if (Player.patternDelay) { - Player.patternDelay--; + if (Player.tick == Player.speed) { + Player.tick = 0; + + if (Player.row == ROWS) { + Player.orderIndex++; + if (Player.orderIndex == Mod.songLength) { + //Player.orderIndex = 0; + // No loop, just say we're done! + return false; + } + Player.row = 0; + } + + if (Player.patternDelay) { + Player.patternDelay--; + } else { + if (Player.orderIndex != Player.oldOrderIndex) + if (!LoadPattern(Mod.order[Player.orderIndex])) { + return false; + } + Player.oldOrderIndex = Player.orderIndex; + if (!ProcessRow()) { + return false; + } + } + } else { - if (Player.orderIndex != Player.oldOrderIndex) - if (!LoadPattern(Mod.order[Player.orderIndex])) return false; - Player.oldOrderIndex = Player.orderIndex; - if (!ProcessRow()) return false; + if (!ProcessTick()) { + return false; + } } - - } else { - if (!ProcessTick()) return false; - } - Player.tick++; - return true; + Player.tick++; + return true; } -void AudioGeneratorMOD::GetSample(int16_t sample[2]) -{ - int16_t sumL; - int16_t sumR; - uint8_t channel; - uint32_t samplePointer; - int8_t current; - int8_t next; - int16_t out; +void AudioGeneratorMOD::GetSample(int16_t sample[2]) { + int32_t sumL; + int32_t sumR; + uint8_t channel; + uint32_t samplePointer; + int8_t current; + int8_t next; + int16_t out; + int32_t out32; + + if (!running) { + return; + } - if (!running) return; + sumL = 0; + sumR = 0; + for (channel = 0; channel < Mod.numberOfChannels; channel++) { - sumL = 0; - sumR = 0; - for (channel = 0; channel < Mod.numberOfChannels; channel++) { + if (!Mixer.channelFrequency[channel] || + !Mod.samples[Mixer.channelSampleNumber[channel]].length) { + continue; + } - if (!Mixer.channelFrequency[channel] || - !Mod.samples[Mixer.channelSampleNumber[channel]].length) continue; + Mixer.channelSampleOffset[channel] += Mixer.channelFrequency[channel]; - Mixer.channelSampleOffset[channel] += Mixer.channelFrequency[channel]; + if (!Mixer.channelVolume[channel]) { + continue; + } - if (!Mixer.channelVolume[channel]) continue; + samplePointer = Mixer.sampleBegin[Mixer.channelSampleNumber[channel]] + + (Mixer.channelSampleOffset[channel] >> FIXED_DIVIDER); - samplePointer = Mixer.sampleBegin[Mixer.channelSampleNumber[channel]] + - (Mixer.channelSampleOffset[channel] >> DIVIDER); + if (Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]]) { - if (Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]]) { + if (samplePointer >= Mixer.sampleLoopEnd[Mixer.channelSampleNumber[channel]]) { + Mixer.channelSampleOffset[channel] -= Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]] << FIXED_DIVIDER; + samplePointer -= Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]]; + } - if (samplePointer >= Mixer.sampleLoopEnd[Mixer.channelSampleNumber[channel]]) { - Mixer.channelSampleOffset[channel] -= Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]] << DIVIDER; - samplePointer -= Mixer.sampleLoopLength[Mixer.channelSampleNumber[channel]]; - } + } else { - } else { + if (samplePointer >= Mixer.sampleEnd[Mixer.channelSampleNumber[channel]]) { + Mixer.channelFrequency[channel] = 0; + samplePointer = Mixer.sampleEnd[Mixer.channelSampleNumber[channel]]; + } - if (samplePointer >= Mixer.sampleEnd[Mixer.channelSampleNumber[channel]]) { - Mixer.channelFrequency[channel] = 0; - samplePointer = Mixer.sampleEnd[Mixer.channelSampleNumber[channel]]; - } + } - } + if (samplePointer < FatBuffer.samplePointer[channel] || + samplePointer >= FatBuffer.samplePointer[channel] + fatBufferSize - 1 || + Mixer.channelSampleNumber[channel] != FatBuffer.channelSampleNumber[channel]) { - if (samplePointer < FatBuffer.samplePointer[channel] || - samplePointer >= FatBuffer.samplePointer[channel] + fatBufferSize - 1 || - Mixer.channelSampleNumber[channel] != FatBuffer.channelSampleNumber[channel]) { + uint32_t toRead = Mixer.sampleEnd[Mixer.channelSampleNumber[channel]] - samplePointer + 1; + if (toRead > (uint32_t)fatBufferSize) { + toRead = fatBufferSize; + } - uint16_t toRead = Mixer.sampleEnd[Mixer.channelSampleNumber[channel]] - samplePointer + 1; - if (toRead > fatBufferSize) toRead = fatBufferSize; + if (!file->seek(samplePointer, SEEK_SET)) { + stop(); + return; + } + if (toRead != file->read(FatBuffer.channels[channel], toRead)) { + stop(); + return; + } - if (!file->seek(samplePointer, SEEK_SET)) { - stop(); - return; - } - if (toRead != file->read(FatBuffer.channels[channel], toRead)) { - stop(); - return; - } + FatBuffer.samplePointer[channel] = samplePointer; + FatBuffer.channelSampleNumber[channel] = Mixer.channelSampleNumber[channel]; + } - FatBuffer.samplePointer[channel] = samplePointer; - FatBuffer.channelSampleNumber[channel] = Mixer.channelSampleNumber[channel]; - } + current = FatBuffer.channels[channel][(samplePointer - FatBuffer.samplePointer[channel]) /*& (FATBUFFERSIZE - 1)*/]; + next = FatBuffer.channels[channel][(samplePointer + 1 - FatBuffer.samplePointer[channel]) /*& (FATBUFFERSIZE - 1)*/]; + + // preserve a few more bits from sample interpolation, by upscaling input values. + // This does (slightly) reduce quantization noise in higher frequencies, typically above 8kHz. + // Actually we could could even gain more bits, I was just not sure if more bits would cause overflows in other conputations. + int16_t current16 = (int16_t) current << 2; + int16_t next16 = (int16_t) next << 2; - current = FatBuffer.channels[channel][(samplePointer - FatBuffer.samplePointer[channel]) /*& (FATBUFFERSIZE - 1)*/]; - next = FatBuffer.channels[channel][(samplePointer + 1 - FatBuffer.samplePointer[channel]) /*& (FATBUFFERSIZE - 1)*/]; + out = current16; - out = current; + // Integer linear interpolation - only works correctly in 16bit + out += (next16 - current16) * (Mixer.channelSampleOffset[channel] & ((1 << FIXED_DIVIDER) - 1)) >> FIXED_DIVIDER; - // Integer linear interpolation - out += (next - current) * (Mixer.channelSampleOffset[channel] & ((1 << DIVIDER) - 1)) >> DIVIDER; + // Upscale to BITDEPTH, considering the we already gained two bits in the previous step + out32 = (int32_t)out << (BITDEPTH - 10); - // Upscale to BITDEPTH - out <<= BITDEPTH - 8; + // Channel volume + out32 = out32 * Mixer.channelVolume[channel] >> 6; - // Channel volume - out = out * Mixer.channelVolume[channel] >> 6; + // Channel panning + sumL += out32 * min(128 - Mixer.channelPanning[channel], 64) >> 6; + sumR += out32 * min(Mixer.channelPanning[channel], 64) >> 6; + } - // Channel panning - sumL += out * min(128 - Mixer.channelPanning[channel], 64) >> 6; - sumR += out * min(Mixer.channelPanning[channel], 64) >> 6; - } + // Downscale to BITDEPTH - a bit faster because the compiler can replaced division by constants with proper "right shift" + correct handling of sign bit + if (Mod.numberOfChannels <= 4) { + // up to 4 channels + sumL /= 4; + sumR /= 4; + } else { + if (Mod.numberOfChannels <= 6) { + // 5 or 6 channels - pre-multiply be 1.5, then divide by 8 -> same as division by 6 + sumL = (sumL + (sumL / 2)) / 8; + sumR = (sumR + (sumR / 2)) / 8; + } else { + // 7,8, or more channels + sumL /= 8; + sumR /= 8; + } + } - // Downscale to BITDEPTH - sumL /= Mod.numberOfChannels; - sumR /= Mod.numberOfChannels; + // clip samples to 16bit (with saturation in case of overflow) + if (sumL <= INT16_MIN) { + sumL = INT16_MIN; + } else if (sumL >= INT16_MAX) { + sumL = INT16_MAX; + } + if (sumR <= INT16_MIN) { + sumR = INT16_MIN; + } else if (sumR >= INT16_MAX) { + sumR = INT16_MAX; + } - // Fill the sound buffer with unsigned values - sample[AudioOutput::LEFTCHANNEL] = sumL + (1 << (BITDEPTH - 1)); - sample[AudioOutput::RIGHTCHANNEL] = sumR + (1 << (BITDEPTH - 1)); + // Fill the sound buffer with signed values + sample[AudioOutput::LEFTCHANNEL] = sumL; + sample[AudioOutput::RIGHTCHANNEL] = sumR; } -bool AudioGeneratorMOD::LoadMOD() -{ - uint8_t channel; +bool AudioGeneratorMOD::LoadMOD() { + uint8_t channel; - if (!LoadHeader()) return false; - LoadSamples(); + if (!LoadHeader()) { + return false; + } + LoadSamples(); - Player.amiga = AMIGA; - Player.samplesPerTick = sampleRate / (2 * 125 / 5); // Hz = 2 * BPM / 5 - Player.speed = 6; - Player.tick = Player.speed; - Player.row = 0; + Player.amiga = AMIGA; + Player.samplesPerTick = sampleRate / (2 * 125 / 5); // Hz = 2 * BPM / 5 + Player.speed = 6; + Player.tick = Player.speed; + Player.row = 0; - Player.orderIndex = 0; - Player.oldOrderIndex = 0xFF; - Player.patternDelay = 0; + Player.orderIndex = 0; + Player.oldOrderIndex = 0xFF; + Player.patternDelay = 0; - for (channel = 0; channel < Mod.numberOfChannels; channel++) { - Player.patternLoopCount[channel] = 0; - Player.patternLoopRow[channel] = 0; + for (channel = 0; channel < Mod.numberOfChannels; channel++) { + Player.patternLoopCount[channel] = 0; + Player.patternLoopRow[channel] = 0; - Player.lastAmigaPeriod[channel] = 0; + Player.lastAmigaPeriod[channel] = 0; - Player.waveControl[channel] = 0; + Player.waveControl[channel] = 0; - Player.vibratoSpeed[channel] = 0; - Player.vibratoDepth[channel] = 0; - Player.vibratoPos[channel] = 0; + Player.vibratoSpeed[channel] = 0; + Player.vibratoDepth[channel] = 0; + Player.vibratoPos[channel] = 0; - Player.tremoloSpeed[channel] = 0; - Player.tremoloDepth[channel] = 0; - Player.tremoloPos[channel] = 0; + Player.tremoloSpeed[channel] = 0; + Player.tremoloDepth[channel] = 0; + Player.tremoloPos[channel] = 0; - FatBuffer.samplePointer[channel] = 0; - FatBuffer.channelSampleNumber[channel] = 0xFF; + FatBuffer.samplePointer[channel] = 0; + FatBuffer.channelSampleNumber[channel] = 0xFF; - Mixer.channelSampleOffset[channel] = 0; - Mixer.channelFrequency[channel] = 0; - Mixer.channelVolume[channel] = 0; - switch (channel % 4) { - case 0: - case 3: - Mixer.channelPanning[channel] = stereoSeparation; - break; - default: - Mixer.channelPanning[channel] = 128 - stereoSeparation; + Mixer.channelSampleOffset[channel] = 0; + Mixer.channelFrequency[channel] = 0; + Mixer.channelVolume[channel] = 0; + switch (channel % 4) { + case 0: + case 3: + Mixer.channelPanning[channel] = stereoSeparation; + break; + default: + Mixer.channelPanning[channel] = 128 - stereoSeparation; + } } - } - return true; + return true; } diff --git a/src/AudioGeneratorMOD.h b/src/AudioGeneratorMOD.h index 87fac18e..09e1ea19 100644 --- a/src/AudioGeneratorMOD.h +++ b/src/AudioGeneratorMOD.h @@ -1,21 +1,21 @@ /* - AudioGeneratorMOD - Audio output generator that plays Amiga MOD tracker files - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMOD + Audio output generator that plays Amiga MOD tracker files + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORMOD_H @@ -23,21 +23,42 @@ #include "AudioGenerator.h" -class AudioGeneratorMOD : public AudioGenerator -{ - public: +class AudioGeneratorMOD : public AudioGenerator { +public: AudioGeneratorMOD(); virtual ~AudioGeneratorMOD() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; - virtual bool isRunning() override { return running; } - bool SetSampleRate(int hz) { if (running || (hz < 1) || (hz > 96000) ) return false; sampleRate = hz; return true; } - bool SetBufferSize(int sz) { if (running || (sz < 1) ) return false; fatBufferSize = sz; return true; } - bool SetStereoSeparation(int sep) { if (running || (sep<0) || (sep>64)) return false; stereoSeparation = sep; return true; } - bool SetPAL(bool use) { if (running) return false; usePAL = use; return true; } + virtual bool isRunning() override { + return running; + } + bool SetSampleRate(int hz) { + if (running || (hz < 1) || (hz > 96000)) { + return false; + } sampleRate = hz; + return true; + } + bool SetBufferSize(int sz) { + if (running || (sz < 1)) { + return false; + } fatBufferSize = sz; + return true; + } + bool SetStereoSeparation(int sep) { + if (running || (sep < 0) || (sep > 64)) { + return false; + } stereoSeparation = sep; + return true; + } + bool SetPAL(bool use) { + if (running) { + return false; + } usePAL = use; + return true; + } - protected: +protected: bool LoadMOD(); bool LoadHeader(); void GetSample(int16_t sample[2]); @@ -51,112 +72,122 @@ class AudioGeneratorMOD : public AudioGenerator void Vibrato(uint8_t channel); - protected: +protected: int mixerTick; - enum {BITDEPTH = 15}; - int sampleRate; + enum {BITDEPTH = 16}; + int sampleRate; int fatBufferSize; //(6*1024) // File system buffers per-CHANNEL (i.e. total mem required is 4 * FATBUFFERSIZE) - enum {DIVIDER = 10}; // Fixed-point mantissa used for integer arithmetic + enum {FIXED_DIVIDER = 10}; // Fixed-point mantissa used for integer arithmetic int stereoSeparation; //STEREOSEPARATION = 32; // 0 (max) to 64 (mono) bool usePAL; - + // Hz = 7093789 / (amigaPeriod * 2) for PAL // Hz = 7159091 / (amigaPeriod * 2) for NTSC int AMIGA; - void UpdateAmiga() { AMIGA = ((usePAL?7159091:7093789) / 2 / sampleRate << DIVIDER); } - + void UpdateAmiga() { + AMIGA = ((usePAL ? 7159091 : 7093789) / 2 / sampleRate << FIXED_DIVIDER); + } + +#ifdef ESP8266 // Not sure if C3/C2 have RAM constraints, maybe add them here? + // support max 4 channels enum {ROWS = 64, SAMPLES = 31, CHANNELS = 4, NONOTE = 0xFFFF, NONOTE8 = 0xff }; +#else + // support max 8 channels + enum {ROWS = 64, SAMPLES = 31, CHANNELS = 8, NONOTE = 0xFFFF, NONOTE8 = 0xff }; +#endif typedef struct Sample { - uint16_t length; - int8_t fineTune; - uint8_t volume; - uint16_t loopBegin; - uint16_t loopLength; + uint16_t length; + int8_t fineTune; + uint8_t volume; + uint16_t loopBegin; + uint16_t loopLength; } Sample; - + typedef struct mod { - Sample samples[SAMPLES]; - uint8_t songLength; - uint8_t numberOfPatterns; - uint8_t order[128]; - uint8_t numberOfChannels; + Sample samples[SAMPLES]; + uint8_t songLength; + uint8_t numberOfPatterns; + uint8_t order[128]; + uint8_t numberOfChannels; } mod; - + // Save 256 bytes by storing raw note values, unpack with macro NOTE typedef struct Pattern { - uint8_t sampleNumber[ROWS][CHANNELS]; - uint8_t note8[ROWS][CHANNELS]; - uint8_t effectNumber[ROWS][CHANNELS]; - uint8_t effectParameter[ROWS][CHANNELS]; + uint8_t sampleNumber[ROWS][CHANNELS]; + uint8_t note8[ROWS][CHANNELS]; + uint8_t effectNumber[ROWS][CHANNELS]; + uint8_t effectParameter[ROWS][CHANNELS]; } Pattern; - + typedef struct player { - Pattern currentPattern; - - uint32_t amiga; - uint16_t samplesPerTick; - uint8_t speed; - uint8_t tick; - uint8_t row; - uint8_t lastRow; - - uint8_t orderIndex; - uint8_t oldOrderIndex; - uint8_t patternDelay; - uint8_t patternLoopCount[CHANNELS]; - uint8_t patternLoopRow[CHANNELS]; - - uint8_t lastSampleNumber[CHANNELS]; - int8_t volume[CHANNELS]; - uint16_t lastNote[CHANNELS]; - uint16_t amigaPeriod[CHANNELS]; - int16_t lastAmigaPeriod[CHANNELS]; - - uint16_t portamentoNote[CHANNELS]; - uint8_t portamentoSpeed[CHANNELS]; - - uint8_t waveControl[CHANNELS]; - - uint8_t vibratoSpeed[CHANNELS]; - uint8_t vibratoDepth[CHANNELS]; - int8_t vibratoPos[CHANNELS]; - - uint8_t tremoloSpeed[CHANNELS]; - uint8_t tremoloDepth[CHANNELS]; - int8_t tremoloPos[CHANNELS]; + Pattern currentPattern; + + uint32_t amiga; + uint16_t samplesPerTick; + uint8_t speed; + uint8_t tick; + uint8_t row; + uint8_t lastRow; + + uint8_t orderIndex; + uint8_t oldOrderIndex; + uint8_t patternDelay; + uint8_t patternLoopCount[CHANNELS]; + uint8_t patternLoopRow[CHANNELS]; + + uint8_t lastSampleNumber[CHANNELS]; + int8_t volume[CHANNELS]; + uint16_t lastNote[CHANNELS]; + uint16_t amigaPeriod[CHANNELS]; + int16_t lastAmigaPeriod[CHANNELS]; + + uint16_t portamentoNote[CHANNELS]; + uint8_t portamentoSpeed[CHANNELS]; + + uint8_t waveControl[CHANNELS]; + + uint8_t vibratoSpeed[CHANNELS]; + uint8_t vibratoDepth[CHANNELS]; + int8_t vibratoPos[CHANNELS]; + + uint8_t tremoloSpeed[CHANNELS]; + uint8_t tremoloDepth[CHANNELS]; + int8_t tremoloPos[CHANNELS]; } player; - + typedef struct mixer { - uint32_t sampleBegin[SAMPLES]; - uint32_t sampleEnd[SAMPLES]; - uint32_t sampleloopBegin[SAMPLES]; - uint16_t sampleLoopLength[SAMPLES]; - uint32_t sampleLoopEnd[SAMPLES]; - - uint8_t channelSampleNumber[CHANNELS]; - uint32_t channelSampleOffset[CHANNELS]; - uint16_t channelFrequency[CHANNELS]; - uint8_t channelVolume[CHANNELS]; - uint8_t channelPanning[CHANNELS]; + uint32_t sampleBegin[SAMPLES]; + uint32_t sampleEnd[SAMPLES]; + uint32_t sampleloopBegin[SAMPLES]; + uint16_t sampleLoopLength[SAMPLES]; + uint32_t sampleLoopEnd[SAMPLES]; + + uint8_t channelSampleNumber[CHANNELS]; + uint32_t channelSampleOffset[CHANNELS]; + uint16_t channelFrequency[CHANNELS]; + uint8_t channelVolume[CHANNELS]; + uint8_t channelPanning[CHANNELS]; } mixer; - + typedef struct fatBuffer { - uint8_t *channels[CHANNELS]; // Make dynamically allocated [FATBUFFERSIZE]; - uint32_t samplePointer[CHANNELS]; - uint8_t channelSampleNumber[CHANNELS]; + uint8_t *channels[CHANNELS]; // Make dynamically allocated [FATBUFFERSIZE]; + uint32_t samplePointer[CHANNELS]; + uint8_t channelSampleNumber[CHANNELS]; } fatBuffer; // Effects typedef enum { ARPEGGIO = 0, PORTAMENTOUP, PORTAMENTODOWN, TONEPORTAMENTO, VIBRATO, PORTAMENTOVOLUMESLIDE, VIBRATOVOLUMESLIDE, TREMOLO, SETCHANNELPANNING, SETSAMPLEOFFSET, VOLUMESLIDE, JUMPTOORDER, - SETVOLUME, BREAKPATTERNTOROW, ESUBSET, SETSPEED } EffectsValues; - + SETVOLUME, BREAKPATTERNTOROW, ESUBSET, SETSPEED + } EffectsValues; + // 0xE subset typedef enum { SETFILTER = 0, FINEPORTAMENTOUP, FINEPORTAMENTODOWN, GLISSANDOCONTROL, SETVIBRATOWAVEFORM, SETFINETUNE, PATTERNLOOP, SETTREMOLOWAVEFORM, SUBEFFECT8, RETRIGGERNOTE, FINEVOLUMESLIDEUP, - FINEVOLUMESLIDEDOWN, NOTECUT, NOTEDELAY, PATTERNDELAY, INVERTLOOP } Effect08Subvalues; - + FINEVOLUMESLIDEDOWN, NOTECUT, NOTEDELAY, PATTERNDELAY, INVERTLOOP + } Effect08Subvalues; + // Our state lives here... player Player; mod Mod; diff --git a/src/AudioGeneratorMP3.cpp b/src/AudioGeneratorMP3.cpp index 7c09289c..ddfd9712 100644 --- a/src/AudioGeneratorMP3.cpp +++ b/src/AudioGeneratorMP3.cpp @@ -1,352 +1,447 @@ /* - AudioGeneratorMP3 - Wrap libmad MP3 library to play audio - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMP3 + Wrap libmad MP3 library to play audio + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioGeneratorMP3.h" -AudioGeneratorMP3::AudioGeneratorMP3() -{ - running = false; - file = NULL; - output = NULL; - buff = NULL; - nsCountMax = 1152/32; - madInitted = false; - preallocateSpace = NULL; - preallocateSize = 0; +AudioGeneratorMP3::AudioGeneratorMP3() { + running = false; + file = NULL; + output = NULL; + buff = NULL; + synth = NULL; + frame = NULL; + stream = NULL; + nsCountMax = 1152 / 32; + madInitted = false; +} + +AudioGeneratorMP3::AudioGeneratorMP3(void *space, int size): preallocateSpace(space), preallocateSize(size) { + running = false; + file = NULL; + output = NULL; + buff = NULL; + synth = NULL; + frame = NULL; + stream = NULL; + nsCountMax = 1152 / 32; + madInitted = false; } -AudioGeneratorMP3::AudioGeneratorMP3(void *space, int size) -{ - running = false; - file = NULL; - output = NULL; - buff = NULL; - nsCountMax = 1152/32; - madInitted = false; - preallocateSpace = space; - preallocateSize = size; +AudioGeneratorMP3::AudioGeneratorMP3(void *buff, int buffSize, void *stream, int streamSize, void *frame, int frameSize, void *synth, int synthSize): + preallocateSpace(buff), preallocateSize(buffSize), + preallocateStreamSpace(stream), preallocateStreamSize(streamSize), + preallocateFrameSpace(frame), preallocateFrameSize(frameSize), + preallocateSynthSpace(synth), preallocateSynthSize(synthSize) { + running = false; + file = NULL; + output = NULL; + buff = NULL; + synth = NULL; + frame = NULL; + stream = NULL; + nsCountMax = 1152 / 32; + madInitted = false; } -AudioGeneratorMP3::~AudioGeneratorMP3() -{ - if (!preallocateSpace) { - free(buff); - free(synth); - free(frame); - free(stream); - } +AudioGeneratorMP3::~AudioGeneratorMP3() { + if (!preallocateSpace) { + free(buff); + free(synth); + free(frame); + free(stream); + } } -bool AudioGeneratorMP3::stop() -{ - if (madInitted) { - mad_synth_finish(synth); - mad_frame_finish(frame); - mad_stream_finish(stream); - madInitted = false; - } - - if (!preallocateSpace) { - free(buff); - free(synth); - free(frame); - free(stream); - } - - buff = NULL; - synth = NULL; - frame = NULL; - stream = NULL; - - running = false; - output->stop(); - return file->close(); +bool AudioGeneratorMP3::stop() { + if (madInitted) { + mad_synth_finish(synth); + mad_frame_finish(frame); + mad_stream_finish(stream); + madInitted = false; + } + + if (!preallocateSpace) { + free(buff); + free(synth); + free(frame); + free(stream); + } + + buff = NULL; + synth = NULL; + frame = NULL; + stream = NULL; + + running = false; + output->stop(); + return file->close(); } -bool AudioGeneratorMP3::isRunning() -{ - return running; +bool AudioGeneratorMP3::isRunning() { + return running; } -enum mad_flow AudioGeneratorMP3::ErrorToFlow() -{ - char err[64]; - char errLine[128]; +enum mad_flow AudioGeneratorMP3::ErrorToFlow() { + char err[64]; + char errLine[128]; - // Special case - eat "lost sync @ byte 0" as it always occurs and is not really correct....it never had sync! - if ((lastReadPos==0) && (stream->error==MAD_ERROR_LOSTSYNC)) return MAD_FLOW_CONTINUE; + // Special case - eat "lost sync @ byte 0" as it always occurs and is not really correct....it never had sync! + if ((lastReadPos == 0) && (stream->error == MAD_ERROR_LOSTSYNC)) { + return MAD_FLOW_CONTINUE; + } - strcpy_P(err, mad_stream_errorstr(stream)); - snprintf_P(errLine, sizeof(errLine), PSTR("Decoding error '%s' at byte offset %d"), - err, (stream->this_frame - buff) + lastReadPos); - yield(); // Something bad happened anyway, ensure WiFi gets some time, too - cb.st(stream->error, errLine); - return MAD_FLOW_CONTINUE; + strcpy_P(err, mad_stream_errorstr(stream)); + snprintf_P(errLine, sizeof(errLine), PSTR("Decoding error '%s' at byte offset %d"), + err, (stream->this_frame - buff) + lastReadPos); + yield(); // Something bad happened anyway, ensure WiFi gets some time, too + cb.st(stream->error, errLine); + return MAD_FLOW_CONTINUE; } -enum mad_flow AudioGeneratorMP3::Input() -{ - int unused = 0; - - if (stream->next_frame) { - unused = lastBuffLen - (stream->next_frame - buff); - memmove(buff, stream->next_frame, unused); - stream->next_frame = NULL; - } - - if (unused == lastBuffLen) { - // Something wicked this way came, throw it all out and try again - unused = 0; - } - - lastReadPos = file->getPos() - unused; - int len = buffLen - unused; - len = file->read(buff + unused, len); - if ((len == 0) && (unused == 0)) { - // Can't read any from the file, and we don't have anything left. It's done.... - return MAD_FLOW_STOP; - } - - lastBuffLen = len + unused; - mad_stream_buffer(stream, buff, lastBuffLen); - - return MAD_FLOW_CONTINUE; +enum mad_flow AudioGeneratorMP3::Input() { + int unused = 0; + + if (stream->next_frame) { + unused = lastBuffLen - (stream->next_frame - buff); + if (unused < 0) { + desync(); + unused = 0; + } else { + memmove(buff, stream->next_frame, unused); + } + stream->next_frame = NULL; + } + + if (unused == lastBuffLen) { + // Something wicked this way came, throw it all out and try again + unused = 0; + } + + bool foundHeader = false; + do { + lastReadPos = file->getPos() - unused; + int len = buffLen - unused; + len = file->read(buff + unused, len); + if ((len == 0) && (unused == 0)) { + // Can't read any from the file, and we don't have anything left. It's done.... + return MAD_FLOW_STOP; + } + if (len < 0) { + desync(); + unused = 0; + } + + lastBuffLen = len + unused; + for (int i = 0; i < lastBuffLen; i++) { + if ((buff[i] == 0xff) && ((buff[i + 1] & 0xe0) == 0xe0)) { + // We have a header! + if (i) { + memmove(buff, buff + i, lastBuffLen - i); + lastBuffLen -= i; + } + foundHeader = true; + break; + } + } + if (!foundHeader) { + unused = 0; + } else { + // Try and fill rest of buffer in case there was some shiftage + len = file->read(buff + lastBuffLen, buffLen - lastBuffLen); + if (len < 0) { + desync(); + unused = 0; + } + lastBuffLen += len; + if (lastBuffLen < 8) { + return MAD_FLOW_STOP; + } + } + } while (!foundHeader); + + mad_stream_buffer(stream, buff, lastBuffLen); + + return MAD_FLOW_CONTINUE; } +void AudioGeneratorMP3::desync() { + audioLogger->printf_P(PSTR("MP3:desync\n")); + if (stream) { + stream->next_frame = nullptr; + stream->this_frame = nullptr; + stream->sync = 0; + } + lastBuffLen = 0; +} -bool AudioGeneratorMP3::DecodeNextFrame() -{ - if (mad_frame_decode(frame, stream) == -1) { - ErrorToFlow(); // Always returns CONTINUE - return false; - } - nsCountMax = MAD_NSBSAMPLES(&frame->header); - return true; +bool AudioGeneratorMP3::DecodeNextFrame() { + if (mad_frame_decode(frame, stream) == -1) { + ErrorToFlow(); // Always returns CONTINUE + return false; + } + nsCountMax = MAD_NSBSAMPLES(&frame->header); + return true; } -bool AudioGeneratorMP3::GetOneSample(int16_t sample[2]) -{ - if (synth->pcm.samplerate != lastRate) { - output->SetRate(synth->pcm.samplerate); - lastRate = synth->pcm.samplerate; - } - if (synth->pcm.channels != lastChannels) { - output->SetChannels(synth->pcm.channels); - lastChannels = synth->pcm.channels; - } - - // If we're here, we have one decoded frame and sent 0 or more samples out - if (samplePtr < synth->pcm.length) { - sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr]; - sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr]; - samplePtr++; - } else { - samplePtr = 0; - - switch ( mad_synth_frame_onens(synth, frame, nsCount++) ) { +bool AudioGeneratorMP3::GetOneSample(int16_t sample[2]) { + if (synth->pcm.samplerate != lastRate) { + output->SetRate(synth->pcm.samplerate); + lastRate = synth->pcm.samplerate; + } + if (synth->pcm.channels != lastChannels) { + output->SetChannels(synth->pcm.channels); + lastChannels = synth->pcm.channels; + } + + // If we're here, we have one decoded frame and sent 0 or more samples out + if (samplePtr < synth->pcm.length) { + sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr]; + sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr]; + samplePtr++; + } else { + samplePtr = 0; + + switch (mad_synth_frame_onens(synth, frame, nsCount++)) { case MAD_FLOW_STOP: case MAD_FLOW_BREAK: audioLogger->printf_P(PSTR("msf1ns failed\n")); - return false; // Either way we're done + return false; // Either way we're done default: - break; // Do nothing + break; // Do nothing + } + // for IGNORE and CONTINUE, just play what we have now + sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr]; + sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr]; + samplePtr++; } - // for IGNORE and CONTINUE, just play what we have now - sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr]; - sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr]; - samplePtr++; - } - return true; + return true; } -bool AudioGeneratorMP3::loop() -{ - if (!running) goto done; // Nothing to do here! - - // First, try and push in the stored sample. If we can't, then punt and try later - if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected - - // Try and stuff the buffer one sample at a time - do - { - // Decode next frame if we're beyond the existing generated data - if ( (samplePtr >= synth->pcm.length) && (nsCount >= nsCountMax) ) { -retry: - if (Input() == MAD_FLOW_STOP) { - return false; - } - - if (!DecodeNextFrame()) { - goto retry; - } - samplePtr = 9999; - nsCount = 0; +bool AudioGeneratorMP3::loop() { + if (!running) { + goto done; // Nothing to do here! } - if (!GetOneSample(lastSample)) { - audioLogger->printf_P(PSTR("G1S failed\n")); - running = false; - goto done; + // First, try and push in the stored sample. If we can't, then punt and try later + if (!output->ConsumeSample(lastSample)) { + goto done; // Can't send, but no error detected } - } while (running && output->ConsumeSample(lastSample)); + + // Try and stuff the buffer one sample at a time + do { + // Decode next frame if we're beyond the existing generated data + if ((samplePtr >= synth->pcm.length) && (nsCount >= nsCountMax)) { +retry: + if (Input() == MAD_FLOW_STOP) { + return false; + } + + if (!DecodeNextFrame()) { + if (stream->error == MAD_ERROR_BUFLEN) { + // randomly seeking can lead to endless + // and unrecoverable "MAD_ERROR_BUFLEN" loop + audioLogger->printf_P(PSTR("MP3:ERROR_BUFLEN %d\n"), unrecoverable); + if (++unrecoverable >= 3) { + unrecoverable = 0; + stop(); + return running; + } + } else { + unrecoverable = 0; + } + goto retry; + } + samplePtr = 9999; + nsCount = 0; + } + + if (!GetOneSample(lastSample)) { + audioLogger->printf_P(PSTR("G1S failed\n")); + running = false; + goto done; + } + if (lastChannels == 1) { + lastSample[1] = lastSample[0]; + } + } while (running && output->ConsumeSample(lastSample)); done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorMP3::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) return false; - file = source; - if (!output) return false; - this->output = output; - if (!file->isOpen()) { - audioLogger->printf_P(PSTR("MP3 source file not open\n")); - return false; // Error - } - - output->SetBitsPerSample(16); // Constant for MP3 decoder - output->SetChannels(2); - - if (!output->begin()) return false; - - // Where we are in generating one frame's data, set to invalid so we will run loop on first getsample() - samplePtr = 9999; - nsCount = 9999; - lastRate = 0; - lastChannels = 0; - lastReadPos = 0; - lastBuffLen = 0; - - // Allocate all large memory chunks - if (preallocateSpace) { - uint8_t *p = reinterpret_cast(preallocateSpace); - buff = reinterpret_cast(p); - p += (buffLen+7) & ~7; - stream = reinterpret_cast(p); - p += (sizeof(struct mad_stream)+7) & ~7; - frame = reinterpret_cast(p); - p += (sizeof(struct mad_frame)+7) & ~7; - synth = reinterpret_cast(p); - p += (sizeof(struct mad_synth)+7) & ~7; - int neededBytes = p - reinterpret_cast(preallocateSpace); - if (neededBytes > preallocateSize) { - audioLogger->printf_P("OOM error in MP3: Want %d bytes, have %d bytes preallocated.\n", neededBytes, preallocateSize); - return false; +bool AudioGeneratorMP3::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + return false; + } + file = source; + if (!output) { + return false; } - } else { - buff = reinterpret_cast(malloc(buffLen)); - stream = reinterpret_cast(malloc(sizeof(struct mad_stream))); - frame = reinterpret_cast(malloc(sizeof(struct mad_frame))); - synth = reinterpret_cast(malloc(sizeof(struct mad_synth))); - if (!buff || !stream || !frame || !synth) { - free(buff); - free(stream); - free(frame); - free(synth); - buff = NULL; - stream = NULL; - frame = NULL; - synth = NULL; - return false; + this->output = output; + if (!file->isOpen()) { + audioLogger->printf_P(PSTR("MP3 source file not open\n")); + return false; // Error } - } - - mad_stream_init(stream); - mad_frame_init(frame); - mad_synth_init(synth); - synth->pcm.length = 0; - mad_stream_options(stream, 0); // TODO - add options support - madInitted = true; - - running = true; - return true; + + // Reset error count from previous file + unrecoverable = 0; + + output->SetChannels(2); + + if (!output->begin()) { + return false; + } + + // Where we are in generating one frame's data, set to invalid so we will run loop on first getsample() + samplePtr = 9999; + nsCount = 9999; + lastRate = 0; + lastChannels = 0; + lastReadPos = 0; + lastBuffLen = 0; + + // Allocate all large memory chunks + if (preallocateStreamSize + preallocateFrameSize + preallocateSynthSize) { + if (preallocateSize >= preAllocBuffSize() && + preallocateStreamSize >= preAllocStreamSize() && + preallocateFrameSize >= preAllocFrameSize() && + preallocateSynthSize >= preAllocSynthSize()) { + buff = reinterpret_cast(preallocateSpace); + stream = reinterpret_cast(preallocateStreamSpace); + frame = reinterpret_cast(preallocateFrameSpace); + synth = reinterpret_cast(preallocateSynthSpace); + } else { + output->stop(); + audioLogger->printf_P("OOM error in MP3: Want %d/%d/%d/%d bytes, have %d/%d/%d/%d bytes preallocated.\n", + preAllocBuffSize(), preAllocStreamSize(), preAllocFrameSize(), preAllocSynthSize(), + preallocateSize, preallocateStreamSize, preallocateFrameSize, preallocateSynthSize); + return false; + } + } else if (preallocateSpace) { + uint8_t *p = reinterpret_cast(preallocateSpace); + buff = reinterpret_cast(p); + p += preAllocBuffSize(); + stream = reinterpret_cast(p); + p += preAllocStreamSize(); + frame = reinterpret_cast(p); + p += preAllocFrameSize(); + synth = reinterpret_cast(p); + p += preAllocSynthSize(); + int neededBytes = p - reinterpret_cast(preallocateSpace); + if (neededBytes > preallocateSize) { + output->stop(); + audioLogger->printf_P("OOM error in MP3: Want %d bytes, have %d bytes preallocated.\n", neededBytes, preallocateSize); + return false; + } + } else { + buff = reinterpret_cast(malloc(buffLen)); + stream = reinterpret_cast(malloc(sizeof(struct mad_stream))); + frame = reinterpret_cast(malloc(sizeof(struct mad_frame))); + synth = reinterpret_cast(malloc(sizeof(struct mad_synth))); + if (!buff || !stream || !frame || !synth) { + free(buff); + free(stream); + free(frame); + free(synth); + buff = NULL; + stream = NULL; + frame = NULL; + synth = NULL; + + output->stop(); + audioLogger->printf_P("OOM error in MP3\n"); + return false; + } + } + + mad_stream_init(stream); + mad_frame_init(frame); + mad_synth_init(synth); + synth->pcm.length = 0; + mad_stream_options(stream, 0); // TODO - add options support + madInitted = true; + + running = true; + return true; } // The following are helper routines for use in libmad to check stack/heap free // and to determine if there's enough stack space to allocate some blocks there // instead of precious heap. -#undef stack +#undef stackenter extern "C" { #ifdef ESP32 - //TODO - add ESP32 checks - void stack(const char *s, const char *t, int i) - { - } - int stackfree() - { - return 8192; - } -#elif defined(ESP8266) - #include - extern cont_t g_cont; - - void stack(const char *s, const char *t, int i) - { - (void) t; - (void) i; - register uint32_t *sp asm("a1"); - int freestack = 4 * (sp - g_cont.stack); - int freeheap = ESP.getFreeHeap(); - if ((freestack < 512) || (freeheap < 5120)) { - static int laststack, lastheap; - if (laststack!=freestack|| lastheap !=freeheap) { - audioLogger->printf_P(PSTR("%s: FREESTACK=%d, FREEHEAP=%d\n"), s, /*t, i,*/ freestack, /*cont_get_free_stack(&g_cont),*/ freeheap); - } - if (freestack < 256) { - audioLogger->printf_P(PSTR("out of stack!\n")); - } - if (freeheap < 1024) { - audioLogger->printf_P(PSTR("out of heap!\n")); - } - Serial.flush(); - laststack = freestack; - lastheap = freeheap; + //TODO - add ESP32 checks + void stackenter(const char *s, const char *t, int i) { + } + int stackfree() { + return 8192; + } +#elif defined(ESP8266) && !defined(CORE_MOCK) +#include + extern cont_t g_cont; + + void stackenter(const char *s, const char *t, int i) { + (void) t; + (void) i; + register uint32_t *sp asm("a1"); + int freestack = 4 * (sp - g_cont.stack); + int freeheap = ESP.getFreeHeap(); + if ((freestack < 512) || (freeheap < 5120)) { + static int laststack, lastheap; + if (laststack != freestack || lastheap != freeheap) { + audioLogger->printf_P(PSTR("%s: FREESTACK=%d, FREEHEAP=%d\n"), s, /*t, i,*/ freestack, /*cont_get_free_stack(&g_cont),*/ freeheap); + } + if (freestack < 256) { + audioLogger->printf_P(PSTR("out of stack!\n")); + } + if (freeheap < 1024) { + audioLogger->printf_P(PSTR("out of heap!\n")); + } + Serial.flush(); + laststack = freestack; + lastheap = freeheap; + } + } + + int stackfree() { + register uint32_t *sp asm("a1"); + int freestack = 4 * (sp - g_cont.stack); + return freestack; } - } - - int stackfree() - { - register uint32_t *sp asm("a1"); - int freestack = 4 * (sp - g_cont.stack); - return freestack; - } #else - void stack(const char *s, const char *t, int i) - { - (void) s; - (void) t; - (void) i; - } - int stackfree() - { - return 8192; - } + void stackenter(const char *s, const char *t, int i) { + (void) s; + (void) t; + (void) i; + } + int stackfree() { + return 8192; + } #endif } - diff --git a/src/AudioGeneratorMP3.h b/src/AudioGeneratorMP3.h index 750cecac..eeffac83 100644 --- a/src/AudioGeneratorMP3.h +++ b/src/AudioGeneratorMP3.h @@ -1,21 +1,21 @@ /* - AudioGeneratorMP3 - Wrap libmad MP3 library to play audio - - Copyright (C) 2017 Earle F. Philhower, III + AudioGeneratorMP3 + Wrap libmad MP3 library to play audio - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORMP3_H @@ -25,28 +25,51 @@ #include "libmad/config.h" #include "libmad/mad.h" -class AudioGeneratorMP3 : public AudioGenerator -{ - public: +class AudioGeneratorMP3 : public AudioGenerator { +public: AudioGeneratorMP3(); AudioGeneratorMP3(void *preallocateSpace, int preallocateSize); + AudioGeneratorMP3(void *buff, int buffSize, void *stream, int streamSize, void *frame, int frameSize, void *synth, int synthSize); virtual ~AudioGeneratorMP3() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; virtual bool isRunning() override; - - protected: - void *preallocateSpace; - int preallocateSize; + virtual void desync() override; + + static constexpr int preAllocSize() { + return preAllocBuffSize() + preAllocStreamSize() + preAllocFrameSize() + preAllocSynthSize(); + } + static constexpr int preAllocBuffSize() { + return ((buffLen + 7) & ~7); + } + static constexpr int preAllocStreamSize() { + return ((sizeof(struct mad_stream) + 7) & ~7); + } + static constexpr int preAllocFrameSize() { + return (sizeof(struct mad_frame) + 7) & ~7; + } + static constexpr int preAllocSynthSize() { + return (sizeof(struct mad_synth) + 7) & ~7; + } - const int buffLen = 0x600; // Slightly larger than largest MP3 frame +protected: + void *preallocateSpace = nullptr; + int preallocateSize = 0; + void *preallocateStreamSpace = nullptr; + int preallocateStreamSize = 0; + void *preallocateFrameSpace = nullptr; + int preallocateFrameSize = 0; + void *preallocateSynthSpace = nullptr; + int preallocateSynthSize = 0; + + static constexpr int buffLen = 0x600; // Slightly larger than largest MP3 frame unsigned char *buff; int lastReadPos; int lastBuffLen; unsigned int lastRate; int lastChannels; - + // Decoding bits bool madInitted; struct mad_stream *stream; @@ -62,6 +85,8 @@ class AudioGeneratorMP3 : public AudioGenerator bool DecodeNextFrame(); bool GetOneSample(int16_t sample[2]); +private: + int unrecoverable = 0; }; #endif diff --git a/src/AudioGeneratorMP3a.cpp b/src/AudioGeneratorMP3a.cpp index f75846a9..c2ae350a 100644 --- a/src/AudioGeneratorMP3a.cpp +++ b/src/AudioGeneratorMP3a.cpp @@ -1,21 +1,21 @@ /* - AudioGeneratorMP3 - Audio output generator using the Helix MP3 decoder - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMP3 + Audio output generator using the Helix MP3 decoder + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #pragma GCC optimize ("O3") @@ -23,140 +23,148 @@ #include "AudioGeneratorMP3a.h" -AudioGeneratorMP3a::AudioGeneratorMP3a() -{ - running = false; - file = NULL; - output = NULL; - hMP3Decoder = MP3InitDecoder(); - if (!hMP3Decoder) { - audioLogger->printf_P(PSTR("Out of memory error! hMP3Decoder==NULL\n")); - Serial.flush(); - } - // For sanity's sake... - memset(buff, 0, sizeof(buff)); - memset(outSample, 0, sizeof(outSample)); - buffValid = 0; - lastFrameEnd = 0; - validSamples = 0; - curSample = 0; - lastRate = 0; - lastChannels = 0; +AudioGeneratorMP3a::AudioGeneratorMP3a() { + running = false; + file = NULL; + output = NULL; + hMP3Decoder = MP3InitDecoder(); + if (!hMP3Decoder) { + audioLogger->printf_P(PSTR("Out of memory error! hMP3Decoder==NULL\n")); + Serial.flush(); + } + // For sanity's sake... + memset(buff, 0, sizeof(buff)); + memset(outSample, 0, sizeof(outSample)); + buffValid = 0; + lastFrameEnd = 0; + validSamples = 0; + curSample = 0; + lastRate = 0; + lastChannels = 0; } -AudioGeneratorMP3a::~AudioGeneratorMP3a() -{ - MP3FreeDecoder(hMP3Decoder); +AudioGeneratorMP3a::~AudioGeneratorMP3a() { + MP3FreeDecoder(hMP3Decoder); } -bool AudioGeneratorMP3a::stop() -{ - if (!running) return true; - running = false; - output->stop(); - return file->close(); +bool AudioGeneratorMP3a::stop() { + if (!running) { + return true; + } + running = false; + output->stop(); + return file->close(); } -bool AudioGeneratorMP3a::isRunning() -{ - return running; +bool AudioGeneratorMP3a::isRunning() { + return running; } -bool AudioGeneratorMP3a::FillBufferWithValidFrame() -{ - buff[0] = 0; // Destroy any existing sync word @ 0 - int nextSync; - do { - nextSync = MP3FindSyncWord(buff + lastFrameEnd, buffValid - lastFrameEnd); - if (nextSync >= 0) nextSync += lastFrameEnd; - lastFrameEnd = 0; - if (nextSync == -1) { - if (buff[buffValid-1]==0xff) { // Could be 1st half of syncword, preserve it... - buff[0] = 0xff; - buffValid = file->read(buff+1, sizeof(buff)-1); - if (buffValid==0) return false; // No data available, EOF - } else { // Try a whole new buffer - buffValid = file->read(buff, sizeof(buff)); - if (buffValid==0) return false; // No data available, EOF - } - } - } while (nextSync == -1); - - // Move the frame to start at offset 0 in the buffer - buffValid -= nextSync; // Throw out prior to nextSync - memmove(buff, buff+nextSync, buffValid); +bool AudioGeneratorMP3a::FillBufferWithValidFrame() { + buff[0] = 0; // Destroy any existing sync word @ 0 + int nextSync; + do { + nextSync = MP3FindSyncWord(buff + lastFrameEnd, buffValid - lastFrameEnd); + if (nextSync >= 0) { + nextSync += lastFrameEnd; + } + lastFrameEnd = 0; + if (nextSync == -1) { + if (buff[buffValid - 1] == 0xff) { // Could be 1st half of syncword, preserve it... + buff[0] = 0xff; + buffValid = file->read(buff + 1, sizeof(buff) - 1); + if (buffValid == 0) { + return false; // No data available, EOF + } + } else { // Try a whole new buffer + buffValid = file->read(buff, sizeof(buff)); + if (buffValid == 0) { + return false; // No data available, EOF + } + } + } + } while (nextSync == -1); + + // Move the frame to start at offset 0 in the buffer + buffValid -= nextSync; // Throw out prior to nextSync + memmove(buff, buff + nextSync, buffValid); + + // We have a sync word at 0 now, try and fill remainder of buffer + buffValid += file->read(buff + buffValid, sizeof(buff) - buffValid); + + return true; +} - // We have a sync word at 0 now, try and fill remainder of buffer - buffValid += file->read(buff + buffValid, sizeof(buff) - buffValid); +bool AudioGeneratorMP3a::loop() { + if (!running) { + goto done; // Nothing to do here! + } - return true; -} + // If we've got data, try and pump it out... + while (validSamples) { + lastSample[0] = outSample[curSample * 2]; + lastSample[1] = outSample[curSample * 2 + 1]; + if (!output->ConsumeSample(lastSample)) { + goto done; // Can't send, but no error detected + } + validSamples--; + curSample++; + } -bool AudioGeneratorMP3a::loop() -{ - if (!running) goto done; // Nothing to do here! - - // If we've got data, try and pump it out... - while (validSamples) { - lastSample[0] = outSample[curSample*2]; - lastSample[1] = outSample[curSample*2 + 1]; - if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected - validSamples--; - curSample++; - } - - // No samples available, need to decode a new frame - if (FillBufferWithValidFrame()) { - // buff[0] start of frame, decode it... - unsigned char *inBuff = reinterpret_cast(buff); - int bytesLeft = buffValid; - int ret = MP3Decode(hMP3Decoder, &inBuff, &bytesLeft, outSample, 0); - if (ret) { - // Error, skip the frame... - char buff[48]; - sprintf(buff, "MP3 decode error %d", ret); - cb.st(ret, buff); + // No samples available, need to decode a new frame + if (FillBufferWithValidFrame()) { + // buff[0] start of frame, decode it... + unsigned char *inBuff = reinterpret_cast(buff); + int bytesLeft = buffValid; + int ret = MP3Decode(hMP3Decoder, &inBuff, &bytesLeft, outSample, 0); + if (ret) { + // Error, skip the frame... + char buff[48]; + sprintf(buff, "MP3 decode error %d", ret); + cb.st(ret, buff); + } else { + lastFrameEnd = buffValid - bytesLeft; + MP3FrameInfo fi; + MP3GetLastFrameInfo(hMP3Decoder, &fi); + if ((int)fi.samprate != (int)lastRate) { + output->SetRate(fi.samprate); + lastRate = fi.samprate; + } + if (fi.nChans != lastChannels) { + output->SetChannels(fi.nChans); + lastChannels = fi.nChans; + } + curSample = 0; + validSamples = fi.outputSamps / lastChannels; + } } else { - lastFrameEnd = buffValid - bytesLeft; - MP3FrameInfo fi; - MP3GetLastFrameInfo(hMP3Decoder, &fi); - if ((int)fi.samprate!= (int)lastRate) { - output->SetRate(fi.samprate); - lastRate = fi.samprate; - } - if (fi.nChans != lastChannels) { - output->SetChannels(fi.nChans); - lastChannels = fi.nChans; - } - curSample = 0; - validSamples = fi.outputSamps / lastChannels; + running = false; // No more data, we're done here... } - } else { - running = false; // No more data, we're done here... - } done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorMP3a::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) return false; - file = source; - if (!output) return false; - this->output = output; - if (!file->isOpen()) return false; // Error - - output->begin(); - - // AAC always comes out at 16 bits - output->SetBitsPerSample(16); - - running = true; - - return true; +bool AudioGeneratorMP3a::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + return false; + } + file = source; + if (!output) { + return false; + } + this->output = output; + if (!file->isOpen()) { + return false; // Error + } + + output->begin(); + + running = true; + + return true; } diff --git a/src/AudioGeneratorMP3a.h b/src/AudioGeneratorMP3a.h index 4cf879d7..f6805351 100644 --- a/src/AudioGeneratorMP3a.h +++ b/src/AudioGeneratorMP3a.h @@ -1,21 +1,21 @@ /* - AudioGeneratorMP3 - Audio output generator using the Helix MP3 decoder - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorMP3 + Audio output generator using the Helix MP3 decoder + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORMP3A_H @@ -24,9 +24,8 @@ #include "AudioGenerator.h" #include "libhelix-mp3/mp3dec.h" -class AudioGeneratorMP3a : public AudioGenerator -{ - public: +class AudioGeneratorMP3a : public AudioGenerator { +public: AudioGeneratorMP3a(); virtual ~AudioGeneratorMP3a() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; @@ -34,7 +33,7 @@ class AudioGeneratorMP3a : public AudioGenerator virtual bool stop() override; virtual bool isRunning() override; - protected: +protected: // Helix MP3 decoder HMP3Decoder hMP3Decoder; diff --git a/src/AudioGeneratorOpus.cpp b/src/AudioGeneratorOpus.cpp new file mode 100644 index 00000000..aed7c58c --- /dev/null +++ b/src/AudioGeneratorOpus.cpp @@ -0,0 +1,278 @@ +/* + AudioGeneratorOpus + Audio output generator that plays Opus audio files + + Copyright (C) 2025 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +AudioGeneratorOpus::AudioGeneratorOpus() { + od = nullptr; + buff = nullptr; + buffPtr = 0; + packet = nullptr; + buffLen = 0; + running = false; +} + +AudioGeneratorOpus::~AudioGeneratorOpus() { + if (od) { + free(od); + } + od = nullptr; + free(buff); + buff = nullptr; + free(packet); + packet = nullptr; +} + +bool AudioGeneratorOpus::begin(AudioFileSource *source, AudioOutput *output) { + buff = (opus_int16*)malloc(4096 * sizeof(opus_int16)); + if (!buff) { + return false; + } + + packet = (uint8_t *)malloc(1024); + if (!packet) { + free(buff); + buff = nullptr; + return false; + } + packetOff = 0; + + od = (OpusDecoder *) malloc(opus_decoder_get_size(2)); + if (!od) { + free(buff); + buff = nullptr; + free(packet); + packet = nullptr; + return false; + } + opus_decoder_init(od, 48000, 2); + + if (!source) { + return false; + } + file = source; + + if (!output) { + return false; + } + this->output = output; + + if (!file->isOpen()) { + return false; // Error + } + + lastSample[0] = 0; + lastSample[1] = 0; + + buffPtr = 0; + buffLen = 0; + + bzero(hdr, sizeof(hdr)); + packetOff = 0; + state = WaitHeader; + preskip = 0; + + output->begin(); + + // These are fixed by Opus + output->SetRate(48000); + output->SetChannels(2); + + running = true; + return true; +} + +bool AudioGeneratorOpus::demux() { + int r; + uint8_t b; + //static int pktno = 0; + + while (true) { + switch (state) { + case WaitHeader: + //audioLogger->printf("STATE: WaitHeader\n"); + if (!file->read(&b, 1)) { + return false; // No data + } + memmove(hdr, hdr + 1, 26); + hdr[26] = b; + if ((hdr[0] == 'O') && (hdr[1] == 'g') && (hdr[2] == 'g') && (hdr[3] == 'S') && (hdr[4] == 0)) { + // We have a header! + type = hdr[5]; + agp = hdr[13]; + for (int i = 1; i < 7; i++) { + agp <<= 8; + agp |= hdr[13 - i]; + } + ssn = hdr[14] | (hdr[15] << 8) | (hdr[16] << 16) | (hdr[17] << 24); + psn = hdr[18] | (hdr[19] << 8) | (hdr[20] << 16) | (hdr[21] << 24); + pcs = hdr[22] | (hdr[23] << 8) | (hdr[24] << 16) | (hdr[25] << 24); + ps = hdr[26]; + readPS = 0; + //audioLogger->printf("HEADER: typ: %d, agp: %llu, ssn: %08x, psn: %08x, pcs: %08x, ps: %d\n", type, agp, ssn, psn, pcs, ps); + state = WaitSegment; + } + break; + case WaitSegment: + //audioLogger->printf("STATE: WaitSegment\n"); + r = file->read(seg + readPS, ps - readPS); + readPS += r; // Keep track of what we read + if (readPS < ps) { + // Not enough data avail to finish, loop + return false; + } + //audioLogger->printf("SEGMENTS (%d): ", ps); + for (int i = 0; i < ps; i++) { + //audioLogger->printf(" %02x", seg[i]); + } + //audioLogger->printf("\n"); + curSeg = 0; + lacingBytesToRead = seg[0]; + state = ReadPacket; + break; + case ReadPacket: + //audioLogger->printf("STATE: ReadPacket\n"); + //audioLogger->printf("readpacket seg %d len %d\n", curSeg, seg[curSeg]); + r = file->read(packet + packetOff, lacingBytesToRead); + packetOff += r; + lacingBytesToRead -= r; + if (lacingBytesToRead) { + //audioLogger->printf("short read\n"); + return false; // Not enough avail + } + // Read lacing bit, see if there's more + if (seg[curSeg] != 0xff) { + //audioLogger->printf("PACKET %d (%d): ", pktno++, packetOff); + for (uint32_t i = 0; i < packetOff; i++) { + //audioLogger->printf(" %02X", packet[i]); + } + //audioLogger->printf("\n"); + // We have a full packet in the buffer, decode it + // First, is it a header? + if ((packetOff >= 17) && !memcmp(packet, "OpusHead", 8) && (packet[8] == 1)) { + channels = packet[9]; + preskip = packet[10] | (packet[11] << 8); + samplerate = packet[12] | (packet[13] << 8) | (packet[14] << 16) | (packet[15] << 24); + gain = packet[16] | (packet[17]++); + //audioLogger->printf("HEADER: chan: %d, sr: %d, skip %d\n", channels, samplerate, preskip); + packetOff = 0; // For better or worse, we've processed this pkt + } else if ((packetOff >= 9) && !memcmp(packet, "OpusTags", 8)) { + // This is an unparsed TAG. TODO find metadata format + packetOff = 0; // For better or worse, we've processed this pkt + } else { + // This should be a regular packet + int ret = opus_decode(od, packet, packetOff, buff, 2048, 0); + packetOff = 0; // For better or worse, we've processed this pkt + if (ret > 0) { + buffLen = ret * 2; + if (preskip) { + if (buffLen >= preskip) { + buffPtr = preskip; + preskip = 0; + //audioLogger->printf("donepreskip\n"); + } else { + buffPtr = buffLen; + preskip -= buffLen; + } + } else { + buffPtr = 0; + } + curSeg++; + if (curSeg >= ps) { + state = WaitHeader; + lacingBytesToRead = 0; + } else { + lacingBytesToRead = seg[curSeg]; + } + return true; // We have filled a buffer + } else { + //audioLogger->printf("nodecode\n"); + // Could be header pkt, we ignore them here + // That means we ignore the preskip value, for now + } + packetOff = 0; // For better or worse, we've processed this pkt + } + } + // Only have partial pkt, need next segment + curSeg++; + if (curSeg >= ps) { + state = WaitHeader; + lacingBytesToRead = 0; + } else { + lacingBytesToRead = seg[curSeg]; + } + break; + default: + state = WaitHeader; + break; + } + } +} + + +bool AudioGeneratorOpus::loop() { + if (!running) { + goto done; + } + + if (!output->ConsumeSample(lastSample)) { + goto done; // Try and send last buffered sample + } + + do { + if (buffPtr == buffLen) { + // Will run until we either run out of data, would block, or decode something + if (!demux()) { + running = false; + goto done; + } + } + if (buffPtr == buffLen) { + // Still nothing + goto done; + } + + lastSample[AudioOutput::LEFTCHANNEL] = buff[buffPtr] & 0xffff; + lastSample[AudioOutput::RIGHTCHANNEL] = buff[buffPtr + 1] & 0xffff; + buffPtr += 2; + } while (running && output->ConsumeSample(lastSample)); + +done: + file->loop(); + output->loop(); + + return running; +} + +bool AudioGeneratorOpus::stop() { + if (od) { + free(od); + } + od = nullptr; + free(buff); + buff = nullptr; + running = false; + output->stop(); + return true; +} + +bool AudioGeneratorOpus::isRunning() { + return running; +} diff --git a/src/AudioGeneratorOpus.h b/src/AudioGeneratorOpus.h new file mode 100644 index 00000000..624de81d --- /dev/null +++ b/src/AudioGeneratorOpus.h @@ -0,0 +1,67 @@ +/* + AudioGeneratorOpus + Audio output generator that plays Opus audio files + + Copyright (C) 2025 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOGENERATOROPUS_H +#define _AUDIOGENERATOROPUS_H + +#include +#include "libopus/include/opus.h" + +class AudioGeneratorOpus : public AudioGenerator { +public: + AudioGeneratorOpus(); + virtual ~AudioGeneratorOpus() override; + virtual bool begin(AudioFileSource *source, AudioOutput *output) override; + virtual bool loop() override; + virtual bool stop() override; + virtual bool isRunning() override; + +private: + OpusDecoder *od = nullptr; + + uint8_t *packet; // Raw compressed, demuxed packet + uint32_t packetOff; + opus_int16 *buff; // Decoded PCM + uint32_t buffPtr; + uint32_t buffLen; + + bool demux(); + uint8_t hdr[27]; // Page header + enum {WaitHeader, WaitSegment, ReadPacket} state; + uint8_t type; + uint64_t agp; + uint32_t ssn; + uint32_t psn; + uint32_t pcs; + uint16_t ps; // packet lacing segments + uint16_t readPS; + uint8_t seg[256]; // Packet lacing in the current page + uint16_t curSeg; + uint32_t lacingBytesToRead; + void processPacket(); + // From the OpusHead + uint16_t preskip; + uint8_t channels; + uint32_t samplerate; + uint16_t gain; +}; + +#endif + diff --git a/src/AudioGeneratorRTTTL.cpp b/src/AudioGeneratorRTTTL.cpp index 87825bd9..235f8427 100644 --- a/src/AudioGeneratorRTTTL.cpp +++ b/src/AudioGeneratorRTTTL.cpp @@ -1,155 +1,209 @@ /* - AudioGeneratorRTTTL - Audio output generator that plays RTTTL (Nokia ringtone) - - Based on the Rtttl Arduino library by James BM, https://github.com/spicajames/Rtttl - Based on the gist from Daniel Hall https://gist.github.com/smarthall/1618800 - - Copyright (C) 2018 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorRTTTL + Audio output generator that plays RTTTL (Nokia ringtone) + + Based on the Rtttl Arduino library by James BM, https://github.com/spicajames/Rtttl + Based on the gist from Daniel Hall https://gist.github.com/smarthall/1618800 + + Copyright (C) 2018 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioGeneratorRTTTL.h" -AudioGeneratorRTTTL::AudioGeneratorRTTTL() -{ - running = false; - file = NULL; - output = NULL; - rate = 22050; - buff = nullptr; - ptr = 0; +AudioGeneratorRTTTL::AudioGeneratorRTTTL() { + running = false; + file = NULL; + output = NULL; + rate = 22050; + buff = nullptr; + ptr = 0; } -AudioGeneratorRTTTL::~AudioGeneratorRTTTL() -{ - free(buff); +AudioGeneratorRTTTL::~AudioGeneratorRTTTL() { + free(buff); } -bool AudioGeneratorRTTTL::stop() -{ - if (!running) return true; - running = false; - output->stop(); - return file->close(); +bool AudioGeneratorRTTTL::stop() { + if (!file || !output) { + return false; + } + running = false; + output->stop(); + return file->close(); } -bool AudioGeneratorRTTTL::isRunning() -{ - return running; +bool AudioGeneratorRTTTL::isRunning() { + return running; } -bool AudioGeneratorRTTTL::loop() -{ - if (!running) goto done; // Nothing to do here! +bool AudioGeneratorRTTTL::loop() { + if (!running) { + goto done; // Nothing to do here! + } - // Load the next note, if we've hit the end of the last one - if (samplesSent == ttlSamples) { - if (!GetNextNote()) { - running = false; - goto done; + // Load the next note, if we've hit the end of the last one + if (samplesSent == ttlSamples) { + if (!GetNextNote()) { + running = false; + goto done; + } + samplesSent = 0; + } + + // Try and send out the remainder of the existing note, one per loop() + if (ttlSamplesPerWaveFP10 == 0) { // Mute + int16_t mute[2] = {0, 0}; + while ((samplesSent < ttlSamples) && output->ConsumeSample(mute)) { + samplesSent++; + } + } else { + while (samplesSent < ttlSamples) { + int samplesSentFP10 = samplesSent << 10; + int rem = samplesSentFP10 % ttlSamplesPerWaveFP10; + int16_t val = (rem > ttlSamplesPerWaveFP10 / 2) ? 8192 : -8192; + int16_t s[2] = { val, val }; + if (!output->ConsumeSample(s)) { + goto done; + } + samplesSent++; + } } - samplesSent = 0; - } - - // Try and send out the remainder of the existing note, one per loop() - if (ttlSamplesPerWaveFP10 == 0) { // Mute - int16_t mute[2] = {0, 0}; - while ((samplesSent < ttlSamples) && output->ConsumeSample(mute)) { - samplesSent++; - } - } else { - while (samplesSent < ttlSamples) { - int samplesSentFP10 = samplesSent << 10; - int rem = samplesSentFP10 % ttlSamplesPerWaveFP10; - int16_t val = (rem > ttlSamplesPerWaveFP10/2) ? 8192:-8192; - int16_t s[2] = { val, val }; - if (!output->ConsumeSample(s)) goto done; - samplesSent++; - } - } done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorRTTTL::SkipWhitespace() -{ - while ((ptr < len) && (buff[ptr] == ' ')) ptr++; - return ptr < len; +bool AudioGeneratorRTTTL::SkipWhitespace() { + while ((ptr < len) && (buff[ptr] == ' ')) { + ptr++; + } + return ptr < len; } -bool AudioGeneratorRTTTL::ReadInt(int *dest) -{ - if (ptr >= len) return false; +bool AudioGeneratorRTTTL::ReadInt(int *dest) { + if (ptr >= len) { + return false; + } - SkipWhitespace(); - if (ptr >= len) return false; - if ((buff[ptr] <'0') || (buff[ptr] > '9')) return false; + SkipWhitespace(); + if (ptr >= len) { + return false; + } + if ((buff[ptr] < '0') || (buff[ptr] > '9')) { + return false; + } - int t = 0; - while ((buff[ptr] >= '0') && (buff[ptr] <='9')) { - t = (t * 10) + (buff[ptr] - '0'); - ptr++; - } - *dest = t; - return true; + int t = 0; + while ((buff[ptr] >= '0') && (buff[ptr] <= '9')) { + t = (t * 10) + (buff[ptr] - '0'); + ptr++; + } + *dest = t; + return true; } - - -bool AudioGeneratorRTTTL::ParseHeader() -{ - // Skip the title - while ((ptr < len) && (buff[ptr] != ':')) ptr++; - if (ptr >= len) return false; - if (buff[ptr++] != ':') return false; - if (!SkipWhitespace()) return false; - if ((buff[ptr] != 'd') && (buff[ptr] != 'D')) return false; - ptr++; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != '=') return false; - if (!ReadInt(&defaultDuration)) return false; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != ',') return false; - - if (!SkipWhitespace()) return false; - if ((buff[ptr] != 'o') && (buff[ptr] != 'O')) return false; - ptr++; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != '=') return false; - if (!ReadInt(&defaultOctave)) return false; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != ',') return false; - - int bpm; - if (!SkipWhitespace()) return false; - if ((buff[ptr] != 'b') && (buff[ptr] != 'B')) return false; - ptr++; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != '=') return false; - if (!ReadInt(&bpm)) return false; - if (!SkipWhitespace()) return false; - if (buff[ptr++] != ':') return false; - - wholeNoteMS = (60 * 1000 * 4) / bpm; - - return true; + + +bool AudioGeneratorRTTTL::ParseHeader() { + // Skip the title + while ((ptr < len) && (buff[ptr] != ':')) { + ptr++; + } + if (ptr >= len) { + return false; + } + if (buff[ptr++] != ':') { + return false; + } + if (!SkipWhitespace()) { + return false; + } + if ((buff[ptr] != 'd') && (buff[ptr] != 'D')) { + return false; + } + ptr++; + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != '=') { + return false; + } + if (!ReadInt(&defaultDuration)) { + return false; + } + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != ',') { + return false; + } + + if (!SkipWhitespace()) { + return false; + } + if ((buff[ptr] != 'o') && (buff[ptr] != 'O')) { + return false; + } + ptr++; + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != '=') { + return false; + } + if (!ReadInt(&defaultOctave)) { + return false; + } + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != ',') { + return false; + } + + int bpm; + if (!SkipWhitespace()) { + return false; + } + if ((buff[ptr] != 'b') && (buff[ptr] != 'B')) { + return false; + } + ptr++; + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != '=') { + return false; + } + if (!ReadInt(&bpm)) { + return false; + } + if (!SkipWhitespace()) { + return false; + } + if (buff[ptr++] != ':') { + return false; + } + + wholeNoteMS = (60 * 1000 * 4) / bpm; + + return true; } #define NOTE_C4 262 @@ -201,24 +255,28 @@ bool AudioGeneratorRTTTL::ParseHeader() #define NOTE_AS7 3729 #define NOTE_B7 3951 static int notes[49] = { 0, - NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, - NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, - NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, - NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 }; - -bool AudioGeneratorRTTTL::GetNextNote() -{ - int dur, note, scale; - if (ptr >= len) return false; - - if (!ReadInt(&dur)) { - dur = defaultDuration; - } - dur = wholeNoteMS / dur; - - if (ptr >= len) return false; - note = 0; - switch (buff[ptr++]) { + NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, + NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, + NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, + NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 + }; + +bool AudioGeneratorRTTTL::GetNextNote() { + int dur, note, scale; + if (ptr >= len) { + return false; + } + + if (!ReadInt(&dur)) { + dur = defaultDuration; + } + dur = wholeNoteMS / dur; + + if (ptr >= len) { + return false; + } + note = 0; + switch (buff[ptr++]) { case 'c': case 'C': note = 1; break; case 'd': case 'D': note = 3; break; case 'e': case 'E': note = 5; break; @@ -228,65 +286,85 @@ bool AudioGeneratorRTTTL::GetNextNote() case 'b': case 'B': note = 12; break; case 'p': case 'P': note = 0; break; default: return false; - } - if ((ptr < len) && (buff[ptr] == '#')) { - ptr++; - note++; - } - if ((ptr < len) && (buff[ptr] == '.')) { - ptr++; - dur += dur / 2; - } - if (!ReadInt(&scale)) { - scale = defaultOctave; - } - // Eat any trailing whitespace and comma - SkipWhitespace(); - if ((ptr < len) && (buff[ptr]==',')) { - ptr++; - } - - if (scale < 4) scale = 4; - if (scale > 7) scale = 7; - if (note) { - int freq = notes[(scale - 4) * 12 + note]; - // Convert from frequency in Hz to high and low samples in fixed point - ttlSamplesPerWaveFP10 = (rate << 10) / freq; - } else { - ttlSamplesPerWaveFP10 = 0; - } - ttlSamples = (rate * dur ) / 1000; - - //audioLogger->printf("%d %d %d %d %d\n", dur, note, scale, ttlSamplesPerWaveFP10, ttlSamples ); - - return true; + } + if ((ptr < len) && (buff[ptr] == '#')) { + ptr++; + note++; + } + if (!ReadInt(&scale)) { + scale = defaultOctave; + } + if ((ptr < len) && (buff[ptr] == '.')) { + ptr++; + dur += dur / 2; + } + // Eat any trailing whitespace and comma + SkipWhitespace(); + if ((ptr < len) && (buff[ptr] == ',')) { + ptr++; + } + + if (scale < 4) { + scale = 4; + } + if (scale > 7) { + scale = 7; + } + if (note) { + int freq = notes[(scale - 4) * 12 + note]; + // Convert from frequency in Hz to high and low samples in fixed point + ttlSamplesPerWaveFP10 = (rate << 10) / freq; + } else { + ttlSamplesPerWaveFP10 = 0; + } + ttlSamples = (rate * dur) / 1000; + + //audioLogger->printf("%d %d %d %d %d\n", dur, note, scale, ttlSamplesPerWaveFP10, ttlSamples ); + + return true; } -bool AudioGeneratorRTTTL::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) return false; - file = source; - if (!output) return false; - this->output = output; - if (!file->isOpen()) return false; // Error - - len = file->getSize(); - buff = (char *)malloc(len); - if (!buff) return false; - if (file->read(buff, len) != (uint32_t)len) return false; - - ptr = 0; - samplesSent = 0; - ttlSamples = 0; - - if (!ParseHeader()) return false; - - if (!output->SetRate( rate )) return false; - if (!output->SetBitsPerSample( 16 )) return false; - if (!output->SetChannels( 2 )) return false; - if (!output->begin()) return false; - - running = true; - - return true; +bool AudioGeneratorRTTTL::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + return false; + } + file = source; + if (!output) { + return false; + } + this->output = output; + if (!file->isOpen()) { + return false; // Error + } + + len = file->getSize(); + buff = (char *)malloc(len); + if (!buff) { + return false; + } + if (file->read(buff, len) != (uint32_t)len) { + return false; + } + + ptr = 0; + samplesSent = 0; + ttlSamples = 0; + + if (!ParseHeader()) { + return false; + } + + if (!output->SetRate(rate)) { + return false; + } + if (!output->SetChannels(2)) { + return false; + } + if (!output->begin()) { + return false; + } + + running = true; + + return true; } diff --git a/src/AudioGeneratorRTTTL.h b/src/AudioGeneratorRTTTL.h index d9f1d779..dc377a7c 100644 --- a/src/AudioGeneratorRTTTL.h +++ b/src/AudioGeneratorRTTTL.h @@ -1,24 +1,24 @@ /* - AudioGeneratorRTTTL - Audio output generator that plays RTTTL (Nokia ringtones) + AudioGeneratorRTTTL + Audio output generator that plays RTTTL (Nokia ringtones) - Based on the Rtttl Arduino library by James BM, https://github.com/spicajames/Rtttl - Based on the gist from Daniel Hall https://gist.github.com/smarthall/1618800 - - Copyright (C) 2018 Earle F. Philhower, III + Based on the Rtttl Arduino library by James BM, https://github.com/spicajames/Rtttl + Based on the gist from Daniel Hall https://gist.github.com/smarthall/1618800 - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2018 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORRTTTL_H @@ -26,24 +26,25 @@ #include "AudioGenerator.h" -class AudioGeneratorRTTTL : public AudioGenerator -{ - public: +class AudioGeneratorRTTTL : public AudioGenerator { +public: AudioGeneratorRTTTL(); virtual ~AudioGeneratorRTTTL() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; virtual bool isRunning() override; - void SetRate(uint16_t hz) { rate = hz; } + void SetRate(uint16_t hz) { + rate = hz; + } - private: +private: bool SkipWhitespace(); bool ReadInt(int *dest); bool ParseHeader(); bool GetNextNote(); - - protected: + +protected: uint16_t rate; // We copy the entire tiny song to a buffer for easier access diff --git a/src/AudioGeneratorTalkie.cpp b/src/AudioGeneratorTalkie.cpp index 48ea14ae..631ecc93 100644 --- a/src/AudioGeneratorTalkie.cpp +++ b/src/AudioGeneratorTalkie.cpp @@ -1,302 +1,322 @@ /* - AudioGeneratorTalkie - Audio output generator that speaks using the LPC code in old TI speech chips - Output is locked at 8khz as that's that the hardcoded LPC coefficients are built around - - Based on the Talkie Arduino library by Peter Knight, https://github.com/going-digital/Talkie - - Copyright (C) 2020 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorTalkie + Audio output generator that speaks using the LPC code in old TI speech chips + Output is locked at 8khz as that's that the hardcoded LPC coefficients are built around + + Based on the Talkie Arduino library by Peter Knight, https://github.com/going-digital/Talkie + + Copyright (C) 2020 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioGeneratorTalkie.h" -AudioGeneratorTalkie::AudioGeneratorTalkie() -{ - running = false; - lastFrame = false; - file = nullptr; - output = nullptr; - buff = nullptr; +AudioGeneratorTalkie::AudioGeneratorTalkie() { + running = false; + lastFrame = false; + file = nullptr; + output = nullptr; + buff = nullptr; } -AudioGeneratorTalkie::~AudioGeneratorTalkie() -{ - free(buff); +AudioGeneratorTalkie::~AudioGeneratorTalkie() { + free(buff); } bool AudioGeneratorTalkie::say(const uint8_t *data, size_t len, bool async) { - // Finish saying anything in the pipe - while (running) { - loop(); - delay(0); - } - buff = (uint8_t*)realloc(buff, len); - if (!buff) return false; - memcpy_P(buff, data, len); - - // Reset the interpreter to the start of the stream - ptrAddr = buff; - ptrBit = 0; - frameLeft = 0; - lastFrame = false; - - running = true; - - if (!async) { // Finish saying anything in the pipe while (running) { - loop(); - delay(0); + loop(); + delay(0); } - } - - return true; -} + buff = (uint8_t*)realloc(buff, len); + if (!buff) { + return false; + } + memcpy_P(buff, data, len); -bool AudioGeneratorTalkie::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!output) return false; - this->output = output; - if (source) { - file = source; - if (!file->isOpen()) return false; // Error - auto len = file->getSize(); - uint8_t *temp = (uint8_t *)malloc(len); - if (!temp) return false; - if (file->read(temp, len) != (uint32_t)len) return false; - say(temp, len); - free(temp); - } else { // Reset the interpreter to the start of the stream ptrAddr = buff; ptrBit = 0; frameLeft = 0; - running = false; - } - - if (!output->SetRate( 8000 )) return false; - if (!output->SetBitsPerSample( 16 )) return false; - if (!output->SetChannels( 2 )) return false; - if (!output->begin()) return false; + lastFrame = false; + + running = true; + + if (!async) { + // Finish saying anything in the pipe + while (running) { + loop(); + delay(0); + } + } + + return true; +} + +bool AudioGeneratorTalkie::begin(AudioFileSource *source, AudioOutput *output) { + if (!output) { + return false; + } + this->output = output; + + if (!output->SetChannels(2)) { + return false; + } + if (!output->begin()) { + return false; + } + if (!output->SetRate(8000)) { + return false; + } + + if (source) { + file = source; + if (!file->isOpen()) { + return false; // Error + } + auto len = file->getSize(); + uint8_t *temp = (uint8_t *)malloc(len); + if (!temp) { + return false; + } + if (file->read(temp, len) != (uint32_t)len) { + return false; + } + say(temp, len); + free(temp); + } else { + // Reset the interpreter to the start of the stream + ptrAddr = buff; + ptrBit = 0; + frameLeft = 0; + running = false; + } - return true; + return true; } -bool AudioGeneratorTalkie::stop() -{ - if (!running) return true; - running = false; - output->stop(); - return file ? file->close() : true; +bool AudioGeneratorTalkie::stop() { + if (!running) { + return true; + } + running = false; + output->stop(); + return file ? file->close() : true; } -bool AudioGeneratorTalkie::isRunning() -{ - return running; +bool AudioGeneratorTalkie::isRunning() { + return running; } -bool AudioGeneratorTalkie::loop() -{ - if (!running) goto done; // Nothing to do here! +bool AudioGeneratorTalkie::loop() { + if (!running) { + goto done; // Nothing to do here! + } - if (!frameLeft) { - if (lastFrame) { - running = false; - goto done; + if (!frameLeft) { + if (lastFrame) { + running = false; + goto done; + } + lastFrame = genOneFrame(); } - lastFrame = genOneFrame(); - } - - if (frameLeft) { - for ( ; frameLeft; frameLeft--) { - auto res = genOneSample(); - int16_t r[2] = {res, res}; - if (!output->ConsumeSample(r)) break; + + if (frameLeft) { + for (; frameLeft; frameLeft--) { + auto res = genOneSample(); + int16_t r[2] = {res, res}; + if (!output->ConsumeSample(r)) { + break; + } + } } - } - + done: - if (file) file->loop(); - output->loop(); + if (file) { + file->loop(); + } + output->loop(); - return running; + return running; } // The ROMs used with the TI speech were serial, not byte wide. // Here's a handy routine to flip ROM data which is usually reversed. -uint8_t AudioGeneratorTalkie::rev(uint8_t a) -{ - // 76543210 - a = (a>>4) | (a<<4); // Swap in groups of 4 - // 32107654 - a = ((a & 0xcc)>>2) | ((a & 0x33)<<2); // Swap in groups of 2 - // 10325476 - a = ((a & 0xaa)>>1) | ((a & 0x55)<<1); // Swap bit pairs - // 01234567 - return a; +uint8_t AudioGeneratorTalkie::rev(uint8_t a) { + // 76543210 + a = (a >> 4) | (a << 4); // Swap in groups of 4 + // 32107654 + a = ((a & 0xcc) >> 2) | ((a & 0x33) << 2); // Swap in groups of 2 + // 10325476 + a = ((a & 0xaa) >> 1) | ((a & 0x55) << 1); // Swap bit pairs + // 01234567 + return a; } uint8_t AudioGeneratorTalkie::getBits(uint8_t bits) { - uint8_t value; - uint16_t data; - data = rev(ptrAddr[0])<<8; - if (ptrBit+bits > 8) { - data |= rev(ptrAddr[1]); - } - data <<= ptrBit; - value = data >> (16-bits); - ptrBit += bits; - if (ptrBit >= 8) { - ptrBit -= 8; - ptrAddr++; - } - return value; + uint8_t value; + uint16_t data; + data = rev(ptrAddr[0]) << 8; + if (ptrBit + bits > 8) { + data |= rev(ptrAddr[1]); + } + data <<= ptrBit; + value = data >> (16 - bits); + ptrBit += bits; + if (ptrBit >= 8) { + ptrBit -= 8; + ptrAddr++; + } + return value; } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" // Constant LPC coefficient tables -static const uint8_t tmsEnergy[0x10] = {0x00,0x02,0x03,0x04,0x05,0x07,0x0a,0x0f,0x14,0x20,0x29,0x39,0x51,0x72,0xa1,0xff}; -static const uint8_t tmsPeriod[0x40] = {0x00,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2D,0x2F,0x31,0x33,0x35,0x36,0x39,0x3B,0x3D,0x3F,0x42,0x45,0x47,0x49,0x4D,0x4F,0x51,0x55,0x57,0x5C,0x5F,0x63,0x66,0x6A,0x6E,0x73,0x77,0x7B,0x80,0x85,0x8A,0x8F,0x95,0x9A,0xA0}; -static const int16_t tmsK1[0x20] = {0x82C0,0x8380,0x83C0,0x8440,0x84C0,0x8540,0x8600,0x8780,0x8880,0x8980,0x8AC0,0x8C00,0x8D40,0x8F00,0x90C0,0x92C0,0x9900,0xA140,0xAB80,0xB840,0xC740,0xD8C0,0xEBC0,0x0000,0x1440,0x2740,0x38C0,0x47C0,0x5480,0x5EC0,0x6700,0x6D40}; -static const int16_t tmsK2[0x20] = {0xAE00,0xB480,0xBB80,0xC340,0xCB80,0xD440,0xDDC0,0xE780,0xF180,0xFBC0,0x0600,0x1040,0x1A40,0x2400,0x2D40,0x3600,0x3E40,0x45C0,0x4CC0,0x5300,0x5880,0x5DC0,0x6240,0x6640,0x69C0,0x6CC0,0x6F80,0x71C0,0x73C0,0x7580,0x7700,0x7E80}; -static const int8_t tmsK3[0x10] = {0x92,0x9F,0xAD,0xBA,0xC8,0xD5,0xE3,0xF0,0xFE,0x0B,0x19,0x26,0x34,0x41,0x4F,0x5C}; -static const int8_t tmsK4[0x10] = {0xAE,0xBC,0xCA,0xD8,0xE6,0xF4,0x01,0x0F,0x1D,0x2B,0x39,0x47,0x55,0x63,0x71,0x7E}; -static const int8_t tmsK5[0x10] = {0xAE,0xBA,0xC5,0xD1,0xDD,0xE8,0xF4,0xFF,0x0B,0x17,0x22,0x2E,0x39,0x45,0x51,0x5C}; -static const int8_t tmsK6[0x10] = {0xC0,0xCB,0xD6,0xE1,0xEC,0xF7,0x03,0x0E,0x19,0x24,0x2F,0x3A,0x45,0x50,0x5B,0x66}; -static const int8_t tmsK7[0x10] = {0xB3,0xBF,0xCB,0xD7,0xE3,0xEF,0xFB,0x07,0x13,0x1F,0x2B,0x37,0x43,0x4F,0x5A,0x66}; -static const int8_t tmsK8[0x08] = {0xC0,0xD8,0xF0,0x07,0x1F,0x37,0x4F,0x66}; -static const int8_t tmsK9[0x08] = {0xC0,0xD4,0xE8,0xFC,0x10,0x25,0x39,0x4D}; -static const int8_t tmsK10[0x08] = {0xCD,0xDF,0xF1,0x04,0x16,0x20,0x3B,0x4D}; +static const uint8_t tmsEnergy[0x10] = {0x00, 0x02, 0x03, 0x04, 0x05, 0x07, 0x0a, 0x0f, 0x14, 0x20, 0x29, 0x39, 0x51, 0x72, 0xa1, 0xff}; +static const uint8_t tmsPeriod[0x40] = {0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35, 0x36, 0x39, 0x3B, 0x3D, 0x3F, 0x42, 0x45, 0x47, 0x49, 0x4D, 0x4F, 0x51, 0x55, 0x57, 0x5C, 0x5F, 0x63, 0x66, 0x6A, 0x6E, 0x73, 0x77, 0x7B, 0x80, 0x85, 0x8A, 0x8F, 0x95, 0x9A, 0xA0}; +static const int16_t tmsK1[0x20] = {0x82C0, 0x8380, 0x83C0, 0x8440, 0x84C0, 0x8540, 0x8600, 0x8780, 0x8880, 0x8980, 0x8AC0, 0x8C00, 0x8D40, 0x8F00, 0x90C0, 0x92C0, 0x9900, 0xA140, 0xAB80, 0xB840, 0xC740, 0xD8C0, 0xEBC0, 0x0000, 0x1440, 0x2740, 0x38C0, 0x47C0, 0x5480, 0x5EC0, 0x6700, 0x6D40}; +static const int16_t tmsK2[0x20] = {0xAE00, 0xB480, 0xBB80, 0xC340, 0xCB80, 0xD440, 0xDDC0, 0xE780, 0xF180, 0xFBC0, 0x0600, 0x1040, 0x1A40, 0x2400, 0x2D40, 0x3600, 0x3E40, 0x45C0, 0x4CC0, 0x5300, 0x5880, 0x5DC0, 0x6240, 0x6640, 0x69C0, 0x6CC0, 0x6F80, 0x71C0, 0x73C0, 0x7580, 0x7700, 0x7E80}; +static const int8_t tmsK3[0x10] = {0x92, 0x9F, 0xAD, 0xBA, 0xC8, 0xD5, 0xE3, 0xF0, 0xFE, 0x0B, 0x19, 0x26, 0x34, 0x41, 0x4F, 0x5C}; +static const int8_t tmsK4[0x10] = {0xAE, 0xBC, 0xCA, 0xD8, 0xE6, 0xF4, 0x01, 0x0F, 0x1D, 0x2B, 0x39, 0x47, 0x55, 0x63, 0x71, 0x7E}; +static const int8_t tmsK5[0x10] = {0xAE, 0xBA, 0xC5, 0xD1, 0xDD, 0xE8, 0xF4, 0xFF, 0x0B, 0x17, 0x22, 0x2E, 0x39, 0x45, 0x51, 0x5C}; +static const int8_t tmsK6[0x10] = {0xC0, 0xCB, 0xD6, 0xE1, 0xEC, 0xF7, 0x03, 0x0E, 0x19, 0x24, 0x2F, 0x3A, 0x45, 0x50, 0x5B, 0x66}; +static const int8_t tmsK7[0x10] = {0xB3, 0xBF, 0xCB, 0xD7, 0xE3, 0xEF, 0xFB, 0x07, 0x13, 0x1F, 0x2B, 0x37, 0x43, 0x4F, 0x5A, 0x66}; +static const int8_t tmsK8[0x08] = {0xC0, 0xD8, 0xF0, 0x07, 0x1F, 0x37, 0x4F, 0x66}; +static const int8_t tmsK9[0x08] = {0xC0, 0xD4, 0xE8, 0xFC, 0x10, 0x25, 0x39, 0x4D}; +static const int8_t tmsK10[0x08] = {0xCD, 0xDF, 0xF1, 0x04, 0x16, 0x20, 0x3B, 0x4D}; // The chirp we active the filter using -static const int8_t chirp[] = {0x00,0x2a,0xd4,0x32,0xb2,0x12,0x25,0x14,0x02,0xe1,0xc5,0x02,0x5f,0x5a,0x05,0x0f,0x26,0xfc,0xa5,0xa5,0xd6,0xdd,0xdc,0xfc,0x25,0x2b,0x22,0x21,0x0f,0xff,0xf8,0xee,0xed,0xef,0xf7,0xf6,0xfa,0x00,0x03,0x02,0x01}; +static const int8_t chirp[] = {0x00, 0x2a, 0xd4, 0x32, 0xb2, 0x12, 0x25, 0x14, 0x02, 0xe1, 0xc5, 0x02, 0x5f, 0x5a, 0x05, 0x0f, 0x26, 0xfc, 0xa5, 0xa5, 0xd6, 0xdd, 0xdc, 0xfc, 0x25, 0x2b, 0x22, 0x21, 0x0f, 0xff, 0xf8, 0xee, 0xed, 0xef, 0xf7, 0xf6, 0xfa, 0x00, 0x03, 0x02, 0x01}; #pragma GCC diagnostic pop bool AudioGeneratorTalkie::genOneFrame() { - uint8_t energy; - uint8_t repeat; - - // Read speech data, processing the variable size frames. - - energy = getBits(4); - if (energy == 0) { - // Energy = 0: rest frame - synthEnergy = 0; - } else if (energy == 0xf) { - // Energy = 15: stop frame. Silence the synthesiser. - synthEnergy = 0; - synthK1 = 0; - synthK2 = 0; - synthK3 = 0; - synthK4 = 0; - synthK5 = 0; - synthK6 = 0; - synthK7 = 0; - synthK8 = 0; - synthK9 = 0; - synthK10 = 0; - } else { - synthEnergy = tmsEnergy[energy]; - repeat = getBits(1); - synthPeriod = tmsPeriod[getBits(6)]; - // A repeat frame uses the last coefficients - if (!repeat) { - // All frames use the first 4 coefficients - synthK1 = tmsK1[getBits(5)]; - synthK2 = tmsK2[getBits(5)]; - synthK3 = tmsK3[getBits(4)]; - synthK4 = tmsK4[getBits(4)]; - if (synthPeriod) { - // Voiced frames use 6 extra coefficients. - synthK5 = tmsK5[getBits(4)]; - synthK6 = tmsK6[getBits(4)]; - synthK7 = tmsK7[getBits(4)]; - synthK8 = tmsK8[getBits(3)]; - synthK9 = tmsK9[getBits(3)]; - synthK10 = tmsK10[getBits(3)]; - } + uint8_t energy; + uint8_t repeat; + + // Read speech data, processing the variable size frames. + + energy = getBits(4); + if (energy == 0) { + // Energy = 0: rest frame + synthEnergy = 0; + } else if (energy == 0xf) { + // Energy = 15: stop frame. Silence the synthesiser. + synthEnergy = 0; + synthK1 = 0; + synthK2 = 0; + synthK3 = 0; + synthK4 = 0; + synthK5 = 0; + synthK6 = 0; + synthK7 = 0; + synthK8 = 0; + synthK9 = 0; + synthK10 = 0; + } else { + synthEnergy = tmsEnergy[energy]; + repeat = getBits(1); + synthPeriod = tmsPeriod[getBits(6)]; + // A repeat frame uses the last coefficients + if (!repeat) { + // All frames use the first 4 coefficients + synthK1 = tmsK1[getBits(5)]; + synthK2 = tmsK2[getBits(5)]; + synthK3 = tmsK3[getBits(4)]; + synthK4 = tmsK4[getBits(4)]; + if (synthPeriod) { + // Voiced frames use 6 extra coefficients. + synthK5 = tmsK5[getBits(4)]; + synthK6 = tmsK6[getBits(4)]; + synthK7 = tmsK7[getBits(4)]; + synthK8 = tmsK8[getBits(3)]; + synthK9 = tmsK9[getBits(3)]; + synthK10 = tmsK10[getBits(3)]; + } + } } - } - frameLeft = 8000 / 40; - - return (energy == 0xf); // Last frame will return true -} + frameLeft = 8000 / 40; -int16_t AudioGeneratorTalkie::genOneSample() -{ - static uint8_t periodCounter; - static int16_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9; - int16_t u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10; + return (energy == 0xf); // Last frame will return true +} - if (synthPeriod) { - // Voiced source - if (periodCounter < synthPeriod) { - periodCounter++; +int16_t AudioGeneratorTalkie::genOneSample() { + static uint8_t periodCounter; + static int16_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + int16_t u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10; + + if (synthPeriod) { + // Voiced source + if (periodCounter < synthPeriod) { + periodCounter++; + } else { + periodCounter = 0; + } + if (periodCounter < sizeof(chirp)) { + u10 = ((chirp[periodCounter]) * (uint32_t) synthEnergy) >> 8; + } else { + u10 = 0; + } } else { - periodCounter = 0; + // Unvoiced source + static uint16_t synthRand = 1; + synthRand = (synthRand >> 1) ^ ((synthRand & 1) ? 0xB800 : 0); + u10 = (synthRand & 1) ? synthEnergy : -synthEnergy; } - if (periodCounter < sizeof(chirp)) { - u10 = ((chirp[periodCounter]) * (uint32_t) synthEnergy) >> 8; - } else { - u10 = 0; + // Lattice filter forward path + u9 = u10 - (((int16_t)synthK10 * x9) >> 7); + u8 = u9 - (((int16_t)synthK9 * x8) >> 7); + u7 = u8 - (((int16_t)synthK8 * x7) >> 7); + u6 = u7 - (((int16_t)synthK7 * x6) >> 7); + u5 = u6 - (((int16_t)synthK6 * x5) >> 7); + u4 = u5 - (((int16_t)synthK5 * x4) >> 7); + u3 = u4 - (((int16_t)synthK4 * x3) >> 7); + u2 = u3 - (((int16_t)synthK3 * x2) >> 7); + u1 = u2 - (((int32_t)synthK2 * x1) >> 15); + u0 = u1 - (((int32_t)synthK1 * x0) >> 15); + + // Output clamp + if (u0 > 511) { + u0 = 511; } - } else { - // Unvoiced source - static uint16_t synthRand = 1; - synthRand = (synthRand >> 1) ^ ((synthRand & 1) ? 0xB800 : 0); - u10 = (synthRand & 1) ? synthEnergy : -synthEnergy; - } - // Lattice filter forward path - u9 = u10 - (((int16_t)synthK10*x9) >> 7); - u8 = u9 - (((int16_t)synthK9*x8) >> 7); - u7 = u8 - (((int16_t)synthK8*x7) >> 7); - u6 = u7 - (((int16_t)synthK7*x6) >> 7); - u5 = u6 - (((int16_t)synthK6*x5) >> 7); - u4 = u5 - (((int16_t)synthK5*x4) >> 7); - u3 = u4 - (((int16_t)synthK4*x3) >> 7); - u2 = u3 - (((int16_t)synthK3*x2) >> 7); - u1 = u2 - (((int32_t)synthK2*x1) >> 15); - u0 = u1 - (((int32_t)synthK1*x0) >> 15); - - // Output clamp - if (u0 > 511) u0 = 511; - if (u0 < -512) u0 = -512; - - // Lattice filter reverse path - x9 = x8 + (((int16_t)synthK9*u8) >> 7); - x8 = x7 + (((int16_t)synthK8*u7) >> 7); - x7 = x6 + (((int16_t)synthK7*u6) >> 7); - x6 = x5 + (((int16_t)synthK6*u5) >> 7); - x5 = x4 + (((int16_t)synthK5*u4) >> 7); - x4 = x3 + (((int16_t)synthK4*u3) >> 7); - x3 = x2 + (((int16_t)synthK3*u2) >> 7); - x2 = x1 + (((int32_t)synthK2*u1) >> 15); - x1 = x0 + (((int32_t)synthK1*u0) >> 15); - x0 = u0; - - uint16_t v = u0; // 10 bits - v <<= 6; // Now full 16 - return v; + if (u0 < -512) { + u0 = -512; + } + + // Lattice filter reverse path + x9 = x8 + (((int16_t)synthK9 * u8) >> 7); + x8 = x7 + (((int16_t)synthK8 * u7) >> 7); + x7 = x6 + (((int16_t)synthK7 * u6) >> 7); + x6 = x5 + (((int16_t)synthK6 * u5) >> 7); + x5 = x4 + (((int16_t)synthK5 * u4) >> 7); + x4 = x3 + (((int16_t)synthK4 * u3) >> 7); + x3 = x2 + (((int16_t)synthK3 * u2) >> 7); + x2 = x1 + (((int32_t)synthK2 * u1) >> 15); + x1 = x0 + (((int32_t)synthK1 * u0) >> 15); + x0 = u0; + + uint16_t v = u0; // 10 bits + v <<= 6; // Now full 16 + return v; } diff --git a/src/AudioGeneratorTalkie.h b/src/AudioGeneratorTalkie.h index dbf06abb..b8fd6d45 100644 --- a/src/AudioGeneratorTalkie.h +++ b/src/AudioGeneratorTalkie.h @@ -1,24 +1,24 @@ /* - AudioGeneratorTalkie - Audio output generator that speaks using the LPC code in old TI speech chips - Output is locked at 8khz as that's that the hardcoded LPC coefficients are built around - - Based on the Talkie Arduino library by Peter Knight, https://github.com/going-digital/Talkie - - Copyright (C) 2020 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorTalkie + Audio output generator that speaks using the LPC code in old TI speech chips + Output is locked at 8khz as that's that the hardcoded LPC coefficients are built around + + Based on the Talkie Arduino library by Peter Knight, https://github.com/going-digital/Talkie + + Copyright (C) 2020 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORTALKIE_H @@ -26,9 +26,8 @@ #include "AudioGenerator.h" -class AudioGeneratorTalkie : public AudioGenerator -{ - public: +class AudioGeneratorTalkie : public AudioGenerator { +public: AudioGeneratorTalkie(); virtual ~AudioGeneratorTalkie() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; @@ -36,11 +35,11 @@ class AudioGeneratorTalkie : public AudioGenerator virtual bool stop() override; virtual bool isRunning() override; bool say(const uint8_t *data, size_t len, bool async = false); - - protected: + +protected: // The data stream we're playing uint8_t *buff; - + // Codeword stream handlers uint8_t *ptrAddr; uint8_t ptrBit; @@ -48,7 +47,7 @@ class AudioGeneratorTalkie : public AudioGenerator bool lastFrame; bool genOneFrame(); // Fill up one frame's worth of data, returns if this is the last frame int16_t genOneSample(); // Generate one sample of a frame - + // Utilities uint8_t rev(uint8_t a); uint8_t getBits(uint8_t bits); @@ -58,7 +57,7 @@ class AudioGeneratorTalkie : public AudioGenerator uint16_t synthEnergy; int16_t synthK1, synthK2; int8_t synthK3, synthK4, synthK5, synthK6, synthK7, synthK8, synthK9, synthK10; - + int frameLeft; }; diff --git a/src/AudioGeneratorWAV.cpp b/src/AudioGeneratorWAV.cpp index 6c8f7a24..b85bb9c0 100644 --- a/src/AudioGeneratorWAV.cpp +++ b/src/AudioGeneratorWAV.cpp @@ -1,316 +1,330 @@ /* - AudioGeneratorWAV - Audio output generator that reads 8 and 16-bit WAV files - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorWAV + Audio output generator that reads 8 and 16-bit WAV files + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioGeneratorWAV.h" -AudioGeneratorWAV::AudioGeneratorWAV() -{ - running = false; - file = NULL; - output = NULL; - buffSize = 128; - buff = NULL; - buffPtr = 0; - buffLen = 0; +AudioGeneratorWAV::AudioGeneratorWAV() { + running = false; + file = NULL; + output = NULL; + buffSize = 128; + buff = NULL; + buffPtr = 0; + buffLen = 0; } -AudioGeneratorWAV::~AudioGeneratorWAV() -{ - free(buff); - buff = NULL; +AudioGeneratorWAV::~AudioGeneratorWAV() { + free(buff); + buff = NULL; } -bool AudioGeneratorWAV::stop() -{ - if (!running) return true; - running = false; - free(buff); - buff = NULL; - output->stop(); - return file->close(); +bool AudioGeneratorWAV::stop() { + if (!running) { + return true; + } + running = false; + free(buff); + buff = NULL; + output->stop(); + return file->close(); } -bool AudioGeneratorWAV::isRunning() -{ - return running; +bool AudioGeneratorWAV::isRunning() { + return running; } // Handle buffered reading, reload each time we run out of data -bool AudioGeneratorWAV::GetBufferedData(int bytes, void *dest) -{ - if (!running) return false; // Nothing to do here! - uint8_t *p = reinterpret_cast(dest); - while (bytes--) { - // Potentially load next batch of data... - if (buffPtr >= buffLen) { - buffPtr = 0; - uint32_t toRead = availBytes > buffSize ? buffSize : availBytes; - buffLen = file->read( buff, toRead ); - availBytes -= buffLen; +bool AudioGeneratorWAV::GetBufferedData(int bytes, void *dest) { + if (!running) { + return false; // Nothing to do here! + } + uint8_t *p = reinterpret_cast(dest); + while (bytes--) { + // Potentially load next batch of data... + if (buffPtr >= buffLen) { + buffPtr = 0; + uint32_t toRead = availBytes > buffSize ? buffSize : availBytes; + buffLen = file->read(buff, toRead); + availBytes -= buffLen; + } + if (buffPtr >= buffLen) { + return false; // No data left! + } + *(p++) = buff[buffPtr++]; } - if (buffPtr >= buffLen) - return false; // No data left! - *(p++) = buff[buffPtr++]; - } - return true; + return true; } -bool AudioGeneratorWAV::loop() -{ - if (!running) goto done; // Nothing to do here! - - // First, try and push in the stored sample. If we can't, then punt and try later - if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected - - // Try and stuff the buffer one sample at a time - do - { - if (bitsPerSample == 8) { - uint8_t l, r; - if (!GetBufferedData(1, &l)) stop(); - if (channels == 2) { - if (!GetBufferedData(1, &r)) stop(); - } else { - r = 0; - } - lastSample[AudioOutput::LEFTCHANNEL] = l; - lastSample[AudioOutput::RIGHTCHANNEL] = r; - } else if (bitsPerSample == 16) { - if (!GetBufferedData(2, &lastSample[AudioOutput::LEFTCHANNEL])) stop(); - if (channels == 2) { - if (!GetBufferedData(2, &lastSample[AudioOutput::RIGHTCHANNEL])) stop(); - } else { - lastSample[AudioOutput::RIGHTCHANNEL] = 0; - } +bool AudioGeneratorWAV::loop() { + if (!running) { + goto done; // Nothing to do here! } - } while (running && output->ConsumeSample(lastSample)); + + // First, try and push in the stored sample. If we can't, then punt and try later + if (!output->ConsumeSample(lastSample)) { + goto done; // Can't send, but no error detected + } + + // Try and stuff the buffer one sample at a time + do { + if (bitsPerSample == 8) { + uint8_t l, r; + if (!GetBufferedData(1, &l)) { + stop(); + } + if (channels == 2) { + if (!GetBufferedData(1, &r)) { + stop(); + } + } else { + r = 0; + } + + // Upsample from unsigned 8 bits to signed 16 bits + lastSample[AudioOutput::LEFTCHANNEL] = (((int16_t)(lastSample[AudioOutput::LEFTCHANNEL] & 0xff)) - 128) << 8; + lastSample[AudioOutput::RIGHTCHANNEL] = (((int16_t)(lastSample[AudioOutput::RIGHTCHANNEL] & 0xff)) - 128) << 8; + + } else if (bitsPerSample == 16) { + if (!GetBufferedData(2, &lastSample[AudioOutput::LEFTCHANNEL])) { + stop(); + } + if (channels == 2) { + if (!GetBufferedData(2, &lastSample[AudioOutput::RIGHTCHANNEL])) { + stop(); + } + } else { + lastSample[AudioOutput::RIGHTCHANNEL] = 0; + } + } + } while (running && output->ConsumeSample(lastSample)); done: - file->loop(); - output->loop(); + file->loop(); + output->loop(); - return running; + return running; } -bool AudioGeneratorWAV::ReadWAVInfo() -{ - uint32_t u32; - uint16_t u16; - int toSkip; - - // WAV specification document: - // https://www.aelius.com/njh/wavemetatools/doc/riffmci.pdf - - // Header == "RIFF" - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (u32 != 0x46464952) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, invalid RIFF header, got: %08X \n"), (uint32_t) u32); - return false; - } - - // Skip ChunkSize - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - - // Format == "WAVE" - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (u32 != 0x45564157) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, invalid WAVE header, got: %08X \n"), (uint32_t) u32); - return false; - } - - // there might be JUNK or PAD - ignore it by continuing reading until we get to "fmt " - while (1) { +bool AudioGeneratorWAV::ReadWAVInfo() { + uint32_t u32; + uint16_t u16; + int toSkip; + + // WAV specification document: + // https://www.aelius.com/njh/wavemetatools/doc/riffmci.pdf + + // Header == "RIFF" if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; }; - if (u32 == 0x20746d66) break; // 'fmt ' - }; - - // subchunk size - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (u32 == 16) { toSkip = 0; } - else if (u32 == 18) { toSkip = 18 - 16; } - else if (u32 == 40) { toSkip = 40 - 16; } - else { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, appears not to be standard PCM \n")); - return false; - } // we only do standard PCM - - // AudioFormat - if (!ReadU16(&u16)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (u16 != 1) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, AudioFormat appears not to be standard PCM \n")); - return false; - } // we only do standard PCM - - // NumChannels - if (!ReadU16(&channels)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if ((channels<1) || (channels>2)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, only mono and stereo are supported \n")); - return false; - } // Mono or stereo support only - - // SampleRate - if (!ReadU32(&sampleRate)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (sampleRate < 1) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, unknown sample rate \n")); - return false; - } // Weird rate, punt. Will need to check w/DAC to see if supported - - // Ignore byterate and blockalign - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if (!ReadU16(&u16)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - - // Bits per sample - if (!ReadU16(&bitsPerSample)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - if ((bitsPerSample!=8) && (bitsPerSample != 16)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, only 8 or 16 bits is supported \n")); - return false; - } // Only 8 or 16 bits - - // Skip any extra header - while (toSkip) { - uint8_t ign; - if (!ReadU8(&ign)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; + if (u32 != 0x46464952) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, invalid RIFF header\n")); + return false; + } + + // Skip ChunkSize + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; }; - toSkip--; - } - // look for data subchunk - do { - // id == "data" + // Format == "WAVE" if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (u32 != 0x45564157) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, invalid WAVE header\n")); + return false; + } + + // there might be JUNK or PAD - ignore it by continuing reading until we get to "fmt " + while (1) { + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (u32 == 0x20746d66) { + break; // 'fmt ' + } + }; + + // subchunk size + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (u32 == 16) { + toSkip = 0; + } else if (u32 == 18) { + toSkip = 18 - 16; + } else if (u32 == 40) { + toSkip = 40 - 16; + } else { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, appears not to be standard PCM \n")); + return false; + } // we only do standard PCM + + // AudioFormat + if (!ReadU16(&u16)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (u16 != 1) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, AudioFormat appears not to be standard PCM \n")); + return false; + } // we only do standard PCM + + // NumChannels + if (!ReadU16(&channels)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; }; - if (u32 == 0x61746164) break; // "data" - // Skip size, read until end of chunk + if ((channels < 1) || (channels > 2)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, only mono and stereo are supported \n")); + return false; + } // Mono or stereo support only + + // SampleRate + if (!ReadU32(&sampleRate)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (sampleRate < 1) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, unknown sample rate \n")); + return false; + } // Weird rate, punt. Will need to check w/DAC to see if supported + + // Ignore byterate and blockalign if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (!ReadU16(&u16)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; }; - if(!file->seek(u32, SEEK_CUR)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data, seek failed\n")); - return false; + + // Bits per sample + if (!ReadU16(&bitsPerSample)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if ((bitsPerSample != 8) && (bitsPerSample != 16)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, only 8 or 16 bits is supported \n")); + return false; + } // Only 8 or 16 bits + + // Skip any extra header + while (toSkip) { + uint8_t ign; + if (!ReadU8(&ign)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + toSkip--; } - } while (1); - if (!file->isOpen()) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, file is not open\n")); - return false; - }; - - // Skip size, read until end of file... - if (!ReadU32(&u32)) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); - return false; - }; - availBytes = u32; - - // Now set up the buffer or fail - buff = reinterpret_cast(malloc(buffSize)); - if (!buff) { - Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, failed to set up buffer \n")); - return false; - }; - buffPtr = 0; - buffLen = 0; - - return true; + + // look for data subchunk + do { + // id == "data" + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (u32 == 0x61746164) { + break; // "data" + } + // Skip size, read until end of chunk + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + if (!file->seek(u32, SEEK_CUR)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data, seek failed\n")); + return false; + } + } while (1); + if (!file->isOpen()) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, file is not open\n")); + return false; + }; + + // Skip size, read until end of file... + if (!ReadU32(&u32)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: failed to read WAV data\n")); + return false; + }; + availBytes = u32; + + // Now set up the buffer or fail + buff = reinterpret_cast(malloc(buffSize)); + if (!buff) { + Serial.printf_P(PSTR("AudioGeneratorWAV::ReadWAVInfo: cannot read WAV, failed to set up buffer \n")); + return false; + }; + buffPtr = 0; + buffLen = 0; + + return true; } -bool AudioGeneratorWAV::begin(AudioFileSource *source, AudioOutput *output) -{ - if (!source) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed: invalid source\n")); - return false; - } - file = source; - if (!output) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: invalid output\n")); - return false; - } - this->output = output; - if (!file->isOpen()) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: file not open\n")); - return false; - } // Error - - if (!ReadWAVInfo()) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed during ReadWAVInfo\n")); - return false; - } - - if (!output->SetRate( sampleRate )) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed to SetRate in output\n")); - return false; - } - if (!output->SetBitsPerSample( bitsPerSample )) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed to SetBitsPerSample in output\n")); - return false; - } - if (!output->SetChannels( channels )) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed to SetChannels in output\n")); - return false; - } - if (!output->begin()) { - Serial.printf_P(PSTR("AudioGeneratorWAV::begin: output's begin did not return true\n")); - return false; - } - - running = true; - - return true; +bool AudioGeneratorWAV::begin(AudioFileSource *source, AudioOutput *output) { + if (!source) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed: invalid source\n")); + return false; + } + file = source; + if (!output) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: invalid output\n")); + return false; + } + this->output = output; + if (!file->isOpen()) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: file not open\n")); + return false; + } // Error + + if (!ReadWAVInfo()) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed during ReadWAVInfo\n")); + return false; + } + + if (!output->SetRate(sampleRate)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed to SetRate in output\n")); + return false; + } + if (!output->SetChannels(channels)) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: failed to SetChannels in output\n")); + return false; + } + if (!output->begin()) { + Serial.printf_P(PSTR("AudioGeneratorWAV::begin: output's begin did not return true\n")); + return false; + } + + running = true; + + return true; } diff --git a/src/AudioGeneratorWAV.h b/src/AudioGeneratorWAV.h index 185454f1..8d7853fa 100644 --- a/src/AudioGeneratorWAV.h +++ b/src/AudioGeneratorWAV.h @@ -1,21 +1,21 @@ /* - AudioGeneratorWAV - Audio output generator that reads 8 and 16-bit WAV files - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioGeneratorWAV + Audio output generator that reads 8 and 16-bit WAV files + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOGENERATORWAV_H @@ -23,31 +23,38 @@ #include "AudioGenerator.h" -class AudioGeneratorWAV : public AudioGenerator -{ - public: +class AudioGeneratorWAV : public AudioGenerator { +public: AudioGeneratorWAV(); virtual ~AudioGeneratorWAV() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; virtual bool isRunning() override; - void SetBufferSize(int sz) { buffSize = sz; } + void SetBufferSize(int sz) { + buffSize = sz; + } - private: - bool ReadU32(uint32_t *dest) { return file->read(reinterpret_cast(dest), 4); } - bool ReadU16(uint16_t *dest) { return file->read(reinterpret_cast(dest), 2); } - bool ReadU8(uint8_t *dest) { return file->read(reinterpret_cast(dest), 1); } +private: + bool ReadU32(uint32_t *dest) { + return file->read(reinterpret_cast(dest), 4); + } + bool ReadU16(uint16_t *dest) { + return file->read(reinterpret_cast(dest), 2); + } + bool ReadU8(uint8_t *dest) { + return file->read(reinterpret_cast(dest), 1); + } bool GetBufferedData(int bytes, void *dest); bool ReadWAVInfo(); - - protected: + +protected: // WAV info uint16_t channels; uint32_t sampleRate; uint16_t bitsPerSample; - + uint32_t availBytes; // We need to buffer some data in-RAM to avoid doing 1000s of small reads diff --git a/src/AudioLogger.h b/src/AudioLogger.h index 3ea08989..dfc091c6 100644 --- a/src/AudioLogger.h +++ b/src/AudioLogger.h @@ -4,10 +4,11 @@ #ifndef _AUDIOLOGGER_H #define _AUDIOLOGGER_H -class DevNullOut: public Print -{ +class DevNullOut: public Print { public: - virtual size_t write(uint8_t) { return 1; } + virtual size_t write(uint8_t) { + return 1; + } }; extern DevNullOut silencedLogger; diff --git a/src/AudioOutput.h b/src/AudioOutput.h index dc157428..86e33adb 100644 --- a/src/AudioOutput.h +++ b/src/AudioOutput.h @@ -1,21 +1,21 @@ /* - AudioOutput - Base class of an audio output player - - Copyright (C) 2017 Earle F. Philhower, III + AudioOutput + Base class of an audio output player - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUT_H @@ -24,60 +24,87 @@ #include #include "AudioStatus.h" -class AudioOutput -{ - public: +class AudioOutput { +public: AudioOutput() { }; virtual ~AudioOutput() {}; - virtual bool SetRate(int hz) { hertz = hz; return true; } - virtual bool SetBitsPerSample(int bits) { bps = bits; return true; } - virtual bool SetChannels(int chan) { channels = chan; return true; } - virtual bool SetGain(float f) { if (f>4.0) f = 4.0; if (f<0.0) f=0.0; gainF2P6 = (uint8_t)(f*(1<<6)); return true; } - virtual bool begin() { return false; }; - typedef enum { LEFTCHANNEL=0, RIGHTCHANNEL=1 } SampleIndex; - virtual bool ConsumeSample(int16_t sample[2]) { (void)sample; return false; } - virtual uint16_t ConsumeSamples(int16_t *samples, uint16_t count) - { - for (uint16_t i=0; i 4.0f) { + f = 4.0f; + } else if (f < 0.0f) { + f = 0.0f; + } + gainF2P6 = (uint8_t)(f * (1 << 6)); + return true; + } + virtual bool begin() { + return false; + }; + typedef enum { LEFTCHANNEL = 0, RIGHTCHANNEL = 1 } SampleIndex; + virtual bool ConsumeSample(int16_t sample[2]) { + (void)sample; + return false; + } + virtual uint16_t ConsumeSamples(int16_t *samples, uint16_t count) { + for (uint16_t i = 0; i < count; i++) { + if (!ConsumeSample(samples)) { + return i; + } + samples += 2; + } + return count; + } + virtual bool stop() { + return false; + } + virtual void flush() { + return; + } + virtual bool loop() { + return true; } - virtual bool stop() { return false; } - virtual void flush() { return; } - virtual bool loop() { return true; } - public: - virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { return cb.RegisterMetadataCB(fn, data); } - virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { return cb.RegisterStatusCB(fn, data); } +public: + virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { + return cb.RegisterMetadataCB(fn, data); + } + virtual bool RegisterStatusCB(AudioStatus::statusCBFn fn, void *data) { + return cb.RegisterStatusCB(fn, data); + } - protected: +protected: void MakeSampleStereo16(int16_t sample[2]) { - // Mono to "stereo" conversion - if (channels == 1) - sample[RIGHTCHANNEL] = sample[LEFTCHANNEL]; - if (bps == 8) { - // Upsample from unsigned 8 bits to signed 16 bits - sample[LEFTCHANNEL] = (((int16_t)(sample[LEFTCHANNEL]&0xff)) - 128) << 8; - sample[RIGHTCHANNEL] = (((int16_t)(sample[RIGHTCHANNEL]&0xff)) - 128) << 8; - } + // Mono to "stereo" conversion + if (channels == 1) { + sample[RIGHTCHANNEL] = sample[LEFTCHANNEL]; + } }; inline int16_t Amplify(int16_t s) { - int32_t v = (s * gainF2P6)>>6; - if (v < -32767) return -32767; - else if (v > 32767) return 32767; - else return (int16_t)(v&0xffff); + int32_t v = (s * gainF2P6) >> 6; + if (v < -32767) { + return -32767; + } else if (v > 32767) { + return 32767; + } else { + return (int16_t)(v & 0xffff); + } } - protected: +protected: uint16_t hertz; - uint8_t bps; uint8_t channels; uint8_t gainF2P6; // Fixed point 2.6 - protected: +protected: AudioStatus cb; }; diff --git a/src/AudioOutputBuffer.cpp b/src/AudioOutputBuffer.cpp index a22f72e5..5e153ce9 100644 --- a/src/AudioOutputBuffer.cpp +++ b/src/AudioOutputBuffer.cpp @@ -1,89 +1,79 @@ /* - AudioOutputBuffer - Adds additional bufferspace to the output chain - - Copyright (C) 2017 Earle F. Philhower, III + AudioOutputBuffer + Adds additional bufferspace to the output chain - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #include "AudioOutputBuffer.h" -AudioOutputBuffer::AudioOutputBuffer(int buffSizeSamples, AudioOutput *dest) -{ - buffSize = buffSizeSamples; - leftSample = (int16_t*)malloc(sizeof(int16_t) * buffSize); - rightSample = (int16_t*)malloc(sizeof(int16_t) * buffSize); - writePtr = 0; - readPtr = 0; - sink = dest; -} - -AudioOutputBuffer::~AudioOutputBuffer() -{ - free(leftSample); - free(rightSample); +AudioOutputBuffer::AudioOutputBuffer(int buffSizeSamples, AudioOutput *dest) { + buffSize = buffSizeSamples; + leftSample = (int16_t*)malloc(sizeof(int16_t) * buffSize); + rightSample = (int16_t*)malloc(sizeof(int16_t) * buffSize); + writePtr = 0; + readPtr = 0; + sink = dest; } -bool AudioOutputBuffer::SetRate(int hz) -{ - return sink->SetRate(hz); +AudioOutputBuffer::~AudioOutputBuffer() { + free(leftSample); + free(rightSample); } -bool AudioOutputBuffer::SetBitsPerSample(int bits) -{ - return sink->SetBitsPerSample(bits); +bool AudioOutputBuffer::SetRate(int hz) { + return sink->SetRate(hz); } -bool AudioOutputBuffer::SetChannels(int channels) -{ - return sink->SetChannels(channels); +bool AudioOutputBuffer::SetChannels(int channels) { + return sink->SetChannels(channels); } -bool AudioOutputBuffer::begin() -{ - filled = false; - return sink->begin(); +bool AudioOutputBuffer::begin() { + filled = false; + return sink->begin(); } -bool AudioOutputBuffer::ConsumeSample(int16_t sample[2]) -{ - // First, try and fill I2S... - if (filled) { - while (readPtr != writePtr) { - int16_t s[2] = {leftSample[readPtr], rightSample[readPtr]}; - if (!sink->ConsumeSample(s)) break; // Can't stuff any more in I2S... - readPtr = (readPtr + 1) % buffSize; +bool AudioOutputBuffer::ConsumeSample(int16_t sample[2]) { + // First, try and fill I2S... + if (filled) { + while (readPtr != writePtr) { + int16_t s[2] = {leftSample[readPtr], rightSample[readPtr]}; + if (!sink->ConsumeSample(s)) { + break; // Can't stuff any more in I2S... + } + readPtr = (readPtr + 1) % buffSize; + } } - } - // Now, do we have space for a new sample? - int nextWritePtr = (writePtr + 1) % buffSize; - if (nextWritePtr == readPtr) { - filled = true; - return false; - } - leftSample[writePtr] = sample[LEFTCHANNEL]; - rightSample[writePtr] = sample[RIGHTCHANNEL]; - writePtr = nextWritePtr; - return true; + // Now, do we have space for a new sample? + int nextWritePtr = (writePtr + 1) % buffSize; + if (nextWritePtr == readPtr) { + filled = true; + return false; + } + leftSample[writePtr] = sample[LEFTCHANNEL]; + rightSample[writePtr] = sample[RIGHTCHANNEL]; + writePtr = nextWritePtr; + return true; } -bool AudioOutputBuffer::stop() -{ - return sink->stop(); +bool AudioOutputBuffer::stop() { + return sink->stop(); } diff --git a/src/AudioOutputBuffer.h b/src/AudioOutputBuffer.h index 56c10a7c..ac4d4c55 100644 --- a/src/AudioOutputBuffer.h +++ b/src/AudioOutputBuffer.h @@ -1,21 +1,21 @@ /* - AudioOutputBuffer - Adds additional bufferspace to the output chain - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputBuffer + Adds additional bufferspace to the output chain + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTBUFFER_H @@ -23,19 +23,17 @@ #include "AudioOutput.h" -class AudioOutputBuffer : public AudioOutput -{ - public: +class AudioOutputBuffer : public AudioOutput { +public: AudioOutputBuffer(int bufferSizeSamples, AudioOutput *dest); virtual ~AudioOutputBuffer() override; virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; - - protected: + +protected: AudioOutput *sink; int buffSize; int16_t *leftSample; diff --git a/src/AudioOutputFilterBiquad.cpp b/src/AudioOutputFilterBiquad.cpp new file mode 100644 index 00000000..75396c07 --- /dev/null +++ b/src/AudioOutputFilterBiquad.cpp @@ -0,0 +1,224 @@ +/* + AudioOutputFilterBiquad + Implements a Biquad filter + + Copyright (C) 2012 Nigel Redmon + Copyright (C) 2021 William Bérubé + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include "AudioOutputFilterBiquad.h" + +AudioOutputFilterBiquad::AudioOutputFilterBiquad(AudioOutput *sink) { + this->sink = sink; + + type = bq_type_lowpass; + a0 = 1.0; + a1 = a2 = b1 = b2 = 0.0; + Fc = 0.50; + Q = 0.707; + peakGain = 0.0; + z1 = z2 = 0.0; +} + +AudioOutputFilterBiquad::AudioOutputFilterBiquad(int type, float Fc, float Q, float peakGain, AudioOutput *sink) { + this->sink = sink; + + SetBiquad(type, Fc, Q, peakGain); + z1 = z2 = 0.0; +} + +AudioOutputFilterBiquad::~AudioOutputFilterBiquad() {} + +bool AudioOutputFilterBiquad::SetRate(int hz) { + return sink->SetRate(hz); +} + +bool AudioOutputFilterBiquad::SetChannels(int channels) { + return sink->SetChannels(channels); +} + +bool AudioOutputFilterBiquad::SetGain(float gain) { + return sink->SetGain(gain); +} + +void AudioOutputFilterBiquad::SetType(int type) { + this->type = type; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetFc(float Fc) { + this->Fc = Fc; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetQ(float Q) { + this->Q = Q; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetPeakGain(float peakGain) { + this->peakGain = peakGain; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetBiquad(int type, float Fc, float Q, float peakGain) { + this->type = type; + this->Fc = Fc; + this->Q = Q; + this->peakGain = peakGain; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::CalcBiquad() { + float norm; + float V = pow(10, fabs(peakGain) / 20.0); + float K = tan(M_PI * Fc); + + switch (this->type) { + case bq_type_lowpass: + norm = 1 / (1 + K / Q + K * K); + a0 = K * K * norm; + a1 = 2 * a0; + a2 = a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_highpass: + norm = 1 / (1 + K / Q + K * K); + a0 = 1 * norm; + a1 = -2 * a0; + a2 = a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_bandpass: + norm = 1 / (1 + K / Q + K * K); + a0 = K / Q * norm; + a1 = 0; + a2 = -a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_notch: + norm = 1 / (1 + K / Q + K * K); + a0 = (1 + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = a0; + b1 = a1; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_peak: + if (peakGain >= 0) { // boost + norm = 1 / (1 + 1 / Q * K + K * K); + a0 = (1 + V / Q * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - V / Q * K + K * K) * norm; + b1 = a1; + b2 = (1 - 1 / Q * K + K * K) * norm; + } else { // cut + norm = 1 / (1 + V / Q * K + K * K); + a0 = (1 + 1 / Q * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - 1 / Q * K + K * K) * norm; + b1 = a1; + b2 = (1 - V / Q * K + K * K) * norm; + } + break; + + case bq_type_lowshelf: + if (peakGain >= 0) { // boost + norm = 1 / (1 + sqrt(2) * K + K * K); + a0 = (1 + sqrt(2 * V) * K + V * K * K) * norm; + a1 = 2 * (V * K * K - 1) * norm; + a2 = (1 - sqrt(2 * V) * K + V * K * K) * norm; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - sqrt(2) * K + K * K) * norm; + } else { // cut + norm = 1 / (1 + sqrt(2 * V) * K + V * K * K); + a0 = (1 + sqrt(2) * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - sqrt(2) * K + K * K) * norm; + b1 = 2 * (V * K * K - 1) * norm; + b2 = (1 - sqrt(2 * V) * K + V * K * K) * norm; + } + break; + + case bq_type_highshelf: + if (peakGain >= 0) { // boost + norm = 1 / (1 + sqrt(2) * K + K * K); + a0 = (V + sqrt(2 * V) * K + K * K) * norm; + a1 = 2 * (K * K - V) * norm; + a2 = (V - sqrt(2 * V) * K + K * K) * norm; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - sqrt(2) * K + K * K) * norm; + } else { // cut + norm = 1 / (V + sqrt(2 * V) * K + K * K); + a0 = (1 + sqrt(2) * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - sqrt(2) * K + K * K) * norm; + b1 = 2 * (K * K - V) * norm; + b2 = (V - sqrt(2 * V) * K + K * K) * norm; + } + break; + } + + i_a0 = a0 * BQ_DECAL; + i_a1 = a1 * BQ_DECAL; + i_a2 = a2 * BQ_DECAL; + + i_b1 = b1 * BQ_DECAL; + i_b2 = b2 * BQ_DECAL; + + i_lz1 = i_rz1 = z1 * BQ_DECAL; + i_lz2 = i_rz2 = z2 * BQ_DECAL; + + i_Fc = Fc * BQ_DECAL; + i_Q = Q * BQ_DECAL; + i_peakGain = peakGain * BQ_DECAL; +} + +bool AudioOutputFilterBiquad::begin() { + return sink->begin(); +} + +bool AudioOutputFilterBiquad::ConsumeSample(int16_t sample[2]) { + + int32_t leftSample = (sample[LEFTCHANNEL] << BQ_SHIFT) / 2; + int32_t rightSample = (sample[RIGHTCHANNEL] << BQ_SHIFT) / 2; + + int64_t leftOutput = ((leftSample * i_a0) >> BQ_SHIFT) + i_lz1; + i_lz1 = ((leftSample * i_a1) >> BQ_SHIFT) + i_lz2 - ((i_b1 * leftOutput) >> BQ_SHIFT); + i_lz2 = ((leftSample * i_a2) >> BQ_SHIFT) - ((i_b2 * leftOutput) >> BQ_SHIFT); + + int64_t rightOutput = ((rightSample * i_a0) >> BQ_SHIFT) + i_rz1; + i_rz1 = ((rightSample * i_a1) >> BQ_SHIFT) + i_rz2 - ((i_b1 * rightOutput) >> BQ_SHIFT); + i_rz2 = ((rightSample * i_a2) >> BQ_SHIFT) - ((i_b2 * rightOutput) >> BQ_SHIFT); + + int16_t out[2]; + out[LEFTCHANNEL] = (int16_t)(leftOutput >> BQ_SHIFT); + out[RIGHTCHANNEL] = (int16_t)(rightOutput >> BQ_SHIFT); + + return sink->ConsumeSample(out); +} + +bool AudioOutputFilterBiquad::stop() { + return sink->stop(); +} diff --git a/src/AudioOutputFilterBiquad.h b/src/AudioOutputFilterBiquad.h new file mode 100644 index 00000000..71880605 --- /dev/null +++ b/src/AudioOutputFilterBiquad.h @@ -0,0 +1,78 @@ +/* + AudioOutputFilterBiquad + Implements a Biquad filter + + Copyright (C) 2012 Nigel Redmon + Copyright (C) 2021 William Bérubé + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AudioOutputFilterBiquad_H +#define _AudioOutputFilterBiquad_H + +#include "AudioOutput.h" + +#define BQ_SHIFT 16 +#define BQ_DECAL 65536 + +enum { + bq_type_lowpass = 0, + bq_type_highpass, + bq_type_bandpass, + bq_type_notch, + bq_type_peak, + bq_type_lowshelf, + bq_type_highshelf +}; + +class AudioOutputFilterBiquad : public AudioOutput { +public: + AudioOutputFilterBiquad(AudioOutput *sink); + AudioOutputFilterBiquad(int type, float Fc, float Q, float peakGain, AudioOutput *sink); + virtual ~AudioOutputFilterBiquad() override; + virtual bool SetRate(int hz) override; + virtual bool SetChannels(int chan) override; + virtual bool SetGain(float f) override; + virtual bool begin() override; + virtual bool ConsumeSample(int16_t sample[2]) override; + virtual bool stop() override; + +private: + void SetType(int type); + void SetFc(float Fc); + void SetQ(float Q); + void SetPeakGain(float peakGain); + void SetBiquad(int type, float Fc, float Q, float peakGain); + +protected: + AudioOutput *sink; + int buffSize; + int16_t *leftSample; + int16_t *rightSample; + int writePtr; + int readPtr; + bool filled; + int type; + void CalcBiquad(); + int64_t i_a0, i_a1, i_a2, i_b1, i_b2; + int64_t i_Fc, i_Q, i_peakGain; + int64_t i_lz1, i_lz2, i_rz1, i_rz2; + float a0, a1, a2, b1, b2; + float Fc, Q, peakGain; + float z1, z2; +}; + +#endif + diff --git a/src/AudioOutputFilterDecimate.cpp b/src/AudioOutputFilterDecimate.cpp index 7453e844..ee5831c6 100644 --- a/src/AudioOutputFilterDecimate.cpp +++ b/src/AudioOutputFilterDecimate.cpp @@ -1,112 +1,101 @@ /* - AudioOutputFilter - Implements a user-defined FIR on a passthrough + AudioOutputFilter + Implements a user-defined FIR on a passthrough - Copyright (C) 2017 Earle F. Philhower, III + Copyright (C) 2017 Earle F. Philhower, III - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #include "AudioOutputFilterDecimate.h" -AudioOutputFilterDecimate::AudioOutputFilterDecimate(uint8_t taps, const int16_t *tap, int num, int den, AudioOutput *sink) -{ - this->sink = sink; - - // The filter state. Passed in TAPS must be available throughout object lifetime - this->taps = taps; - this->tap = (int16_t*)malloc(sizeof(int16_t) * taps); - memcpy_P(this->tap, tap, sizeof(int16_t) * taps); - this->hist[0] = (int16_t*)malloc(sizeof(int16_t) * taps); - memset(this->hist[0], 0, sizeof(int16_t) * taps); - this->hist[1] = (int16_t*)malloc(sizeof(int16_t) * taps); - memset(this->hist[1], 0, sizeof(int16_t) * taps); - this->idx = 0; - - // Decimator numerator and denominator with an error signal. Not great, but fast and simple - this->num = num; - this->den = den; - this->err = 0; +AudioOutputFilterDecimate::AudioOutputFilterDecimate(uint8_t taps, const int16_t *tap, int num, int den, AudioOutput *sink) { + this->sink = sink; + + // The filter state. Passed in TAPS must be available throughout object lifetime + this->taps = taps; + this->tap = (int16_t*)malloc(sizeof(int16_t) * taps); + memcpy_P(this->tap, tap, sizeof(int16_t) * taps); + this->hist[0] = (int16_t*)malloc(sizeof(int16_t) * taps); + memset(this->hist[0], 0, sizeof(int16_t) * taps); + this->hist[1] = (int16_t*)malloc(sizeof(int16_t) * taps); + memset(this->hist[1], 0, sizeof(int16_t) * taps); + this->idx = 0; + + // Decimator numerator and denominator with an error signal. Not great, but fast and simple + this->num = num; + this->den = den; + this->err = 0; } -AudioOutputFilterDecimate::~AudioOutputFilterDecimate() -{ - free(hist[1]); - free(hist[0]); - free(tap); +AudioOutputFilterDecimate::~AudioOutputFilterDecimate() { + free(hist[1]); + free(hist[0]); + free(tap); } -bool AudioOutputFilterDecimate::SetRate(int hz) -{ - // Modify input frequency to account for decimation - hz *= den; - hz /= num; - return sink->SetRate(hz); +bool AudioOutputFilterDecimate::SetRate(int hz) { + // Modify input frequency to account for decimation + hz *= den; + hz /= num; + return sink->SetRate(hz); } -bool AudioOutputFilterDecimate::SetBitsPerSample(int bits) -{ - return sink->SetBitsPerSample(bits); +bool AudioOutputFilterDecimate::SetChannels(int channels) { + return sink->SetChannels(channels); } -bool AudioOutputFilterDecimate::SetChannels(int channels) -{ - return sink->SetChannels(channels); +bool AudioOutputFilterDecimate::SetGain(float gain) { + return sink->SetGain(gain); } -bool AudioOutputFilterDecimate::SetGain(float gain) -{ - return sink->SetGain(gain); +bool AudioOutputFilterDecimate::begin() { + return sink->begin(); } -bool AudioOutputFilterDecimate::begin() -{ - return sink->begin(); +bool AudioOutputFilterDecimate::ConsumeSample(int16_t sample[2]) { + // Store the data samples in history always + hist[LEFTCHANNEL][idx] = sample[LEFTCHANNEL]; + hist[RIGHTCHANNEL][idx] = sample[RIGHTCHANNEL]; + idx++; + if (idx == taps) { + idx = 0; + } + + // Only output if the error signal says we're ready to decimate. This simplistic way might give some aliasing noise + err += num; + if (err >= den) { + err -= den; + // Need to output a sample, so actually calculate the filter at this point in time + // Smarter might actually shift the history by the fractional remainder or take two filters and interpolate + int32_t accL = 0; + int32_t accR = 0; + int index = idx; + for (size_t i = 0; i < taps; i++) { + index = index != 0 ? index - 1 : taps - 1; + accL += (int32_t)hist[LEFTCHANNEL][index] * tap[i]; + accR += (int32_t)hist[RIGHTCHANNEL][index] * tap[i]; + }; + int16_t out[2]; + out[LEFTCHANNEL] = accL >> 16; + out[RIGHTCHANNEL] = accR >> 16; + return sink->ConsumeSample(out); + } + return true; // Nothing to do here... } -bool AudioOutputFilterDecimate::ConsumeSample(int16_t sample[2]) -{ - // Store the data samples in history always - hist[LEFTCHANNEL][idx] = sample[LEFTCHANNEL]; - hist[RIGHTCHANNEL][idx] = sample[RIGHTCHANNEL]; - idx++; - if (idx == taps) idx = 0; - - // Only output if the error signal says we're ready to decimate. This simplistic way might give some aliasing noise - err += num; - if (err >= den) { - err -= den; - // Need to output a sample, so actually calculate the filter at this point in time - // Smarter might actually shift the history by the fractional remainder or take two filters and interpolate - int32_t accL = 0; - int32_t accR = 0; - int index = idx; - for (size_t i=0; i < taps; i++) { - index = index != 0 ? index-1 : taps-1; - accL += (int32_t)hist[LEFTCHANNEL][index] * tap[i]; - accR += (int32_t)hist[RIGHTCHANNEL][index] * tap[i]; - }; - int16_t out[2]; - out[LEFTCHANNEL] = accL >> 16; - out[RIGHTCHANNEL] = accR >> 16; - return sink->ConsumeSample(out); - } - return true; // Nothing to do here... -} - -bool AudioOutputFilterDecimate::stop() -{ - return sink->stop(); +bool AudioOutputFilterDecimate::stop() { + return sink->stop(); } diff --git a/src/AudioOutputFilterDecimate.h b/src/AudioOutputFilterDecimate.h index eee59908..fff1d482 100644 --- a/src/AudioOutputFilterDecimate.h +++ b/src/AudioOutputFilterDecimate.h @@ -1,21 +1,21 @@ /* - AudioOutputFilterDecimate - Implements a user-defined FIR on a passthrough w/rational decimation - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputFilterDecimate + Implements a user-defined FIR on a passthrough w/rational decimation + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTFILTERDECIMATE_H @@ -23,20 +23,18 @@ #include "AudioOutput.h" -class AudioOutputFilterDecimate : public AudioOutput -{ - public: +class AudioOutputFilterDecimate : public AudioOutput { +public: AudioOutputFilterDecimate(uint8_t taps, const int16_t *tap, int num, int den, AudioOutput *sink); virtual ~AudioOutputFilterDecimate() override; virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int chan) override; virtual bool SetGain(float f) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; - protected: +protected: AudioOutput *sink; uint8_t taps; int16_t *tap; diff --git a/src/AudioOutputI2S.cpp b/src/AudioOutputI2S.cpp index f7e194ea..bad04a94 100644 --- a/src/AudioOutputI2S.cpp +++ b/src/AudioOutputI2S.cpp @@ -1,223 +1,316 @@ /* - AudioOutputI2S - Base class for I2S interface port - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputI2S + Base class for I2S interface port + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #ifdef ESP32 - #include "driver/i2s.h" -#else - #include +#include +#elif defined(ARDUINO_ARCH_RP2040) || ARDUINO_ESP8266_MAJOR >= 3 +#include +#elif ARDUINO_ESP8266_MAJOR < 3 +#include #endif #include "AudioOutputI2S.h" -AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int use_apll) -{ - this->portNo = port; - this->i2sOn = false; - this->dma_buf_count = dma_buf_count; - if (output_mode != EXTERNAL_I2S && output_mode != INTERNAL_DAC && output_mode != INTERNAL_PDM) { - output_mode = EXTERNAL_I2S; - } - this->output_mode = output_mode; +AudioOutputI2S::AudioOutputI2S() { + i2sOn = false; + mono = false; + lsb_justified = false; + channels = 2; + hertz = 44100; // Needs to be application-set #ifdef ESP32 - if (!i2sOn) { - if (use_apll == APLL_AUTO) { - // don't use audio pll on buggy rev0 chips - use_apll = APLL_DISABLE; - esp_chip_info_t out_info; - esp_chip_info(&out_info); - if(out_info.revision > 0) { - use_apll = APLL_ENABLE; - } - } - - i2s_mode_t mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); - if (output_mode == INTERNAL_DAC) { - mode = (i2s_mode_t)(mode | I2S_MODE_DAC_BUILT_IN); - } else if (output_mode == INTERNAL_PDM) { - mode = (i2s_mode_t)(mode | I2S_MODE_PDM); - } - - i2s_comm_format_t comm_fmt = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB); - if (output_mode == INTERNAL_DAC) { - comm_fmt = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB; - } - - i2s_config_t i2s_config_dac = { - .mode = mode, - .sample_rate = 44100, - .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = comm_fmt, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // lowest interrupt priority - .dma_buf_count = dma_buf_count, - .dma_buf_len = 64, - .use_apll = use_apll // Use audio PLL - }; - audioLogger->printf("+%d %p\n", portNo, &i2s_config_dac); - if (i2s_driver_install((i2s_port_t)portNo, &i2s_config_dac, 0, NULL) != ESP_OK) { - audioLogger->println("ERROR: Unable to install I2S drives\n"); - } - if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) { - i2s_set_pin((i2s_port_t)portNo, NULL); - i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); - } else { - SetPinout(26, 25, 22); - } - i2s_zero_dma_buffer((i2s_port_t)portNo); - } + bclkPin = 26; + wclkPin = 25; + doutPin = 22; #else - (void) dma_buf_count; - (void) use_apll; - if (!i2sOn) { - orig_bck = READ_PERI_REG(PERIPHS_IO_MUX_MTDO_U); - orig_ws = READ_PERI_REG(PERIPHS_IO_MUX_GPIO2_U); - i2s_begin(); - } + bclkPin = 26; + wclkPin = 27; + doutPin = 28; #endif - i2sOn = true; - mono = false; - bps = 16; - channels = 2; - SetGain(1.0); - SetRate(44100); // Default + mclkPin = -1; + SetGain(1.0); + SetBuffers(); // Default DMA sizes } -AudioOutputI2S::~AudioOutputI2S() -{ -#ifdef ESP32 - if (i2sOn) { - audioLogger->printf("UNINSTALL I2S\n"); - i2s_driver_uninstall((i2s_port_t)portNo); //stop & destroy i2s driver - } -#else - if (i2sOn) i2s_end(); -#endif - i2sOn = false; +bool AudioOutputI2S::SetBuffers(int dmaBufferCount, int dmaBufferBytes) { + if (i2sOn || (dmaBufferCount < 3) || (dmaBufferBytes & 3)) { + return false; + } + _buffers = dmaBufferCount; + _bufferWords = dmaBufferBytes / 4; + return true; } -bool AudioOutputI2S::SetPinout(int bclk, int wclk, int dout) -{ +#if defined(ESP32) || defined(ESP8266) +AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int use_apll) : AudioOutputI2S() { + (void) port; + (void) output_mode; + (void) use_apll; + SetBuffers(dma_buf_count, 128 * 4); #ifdef ESP32 - if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) return false; // Not allowed - - i2s_pin_config_t pins = { - .bck_io_num = bclk, - .ws_io_num = wclk, - .data_out_num = dout, - .data_in_num = I2S_PIN_NO_CHANGE - }; - i2s_set_pin((i2s_port_t)portNo, &pins); - return true; -#else - (void) bclk; - (void) wclk; - (void) dout; - return false; + _useAPLL = use_apll; #endif } -bool AudioOutputI2S::SetRate(int hz) -{ - // TODO - have a list of allowable rates from constructor, check them - this->hertz = hz; -#ifdef ESP32 - i2s_set_sample_rates((i2s_port_t)portNo, AdjustI2SRate(hz)); -#else - i2s_set_rate(AdjustI2SRate(hz)); +#if SOC_CLK_APLL_SUPPORTED +bool AudioOutputI2S::SetUseAPLL() { + if (i2sOn) { + return false; + } + _useAPLL = true; + return true; +} #endif - return true; + +#elif defined(ARDUINO_ARCH_RP2040) +AudioOutputI2S::AudioOutputI2S(long sampleRate, pin_size_t sck, pin_size_t data) : AudioOutputI2S() { + (void) sampleRate; + bclkPin = sck; + wclkPin = sck + 1; + doutPin = data; } +#endif -bool AudioOutputI2S::SetBitsPerSample(int bits) -{ - if ( (bits != 16) && (bits != 8) ) return false; - this->bps = bits; - return true; +AudioOutputI2S::~AudioOutputI2S() { + stop(); } -bool AudioOutputI2S::SetChannels(int channels) -{ - if ( (channels < 1) || (channels > 2) ) return false; - this->channels = channels; - return true; +bool AudioOutputI2S::SwapClocks(bool swap) { + if (i2sOn) { + return false; + } + if (swap) { + auto t = bclkPin; + bclkPin = wclkPin; + wclkPin = t; + } + return true; } -bool AudioOutputI2S::SetOutputModeMono(bool mono) -{ - this->mono = mono; - return true; +bool AudioOutputI2S::SetPinout(int bclk, int wclk, int dout, int mclk) { + if (i2sOn) { + return false; + } + bclkPin = bclk; + wclkPin = wclk; + doutPin = dout; + mclkPin = mclk; + return true; } -bool AudioOutputI2S::begin() -{ - return true; +bool AudioOutputI2S::SetRate(int hz) { + if (hertz == hz) { + return true; + } + hertz = hz; + if (i2sOn) { + auto adj = AdjustI2SRate(hz); // Possibly scale for NoDAC +#ifdef ESP32 + i2s_std_clk_config_t clk_cfg; + clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG((uint32_t)adj); +#if SOC_CLK_APLL_SUPPORTED + clk_cfg.clk_src = _useAPLL ? i2s_clock_src_t::I2S_CLK_SRC_APLL : i2s_clock_src_t::I2S_CLK_SRC_DEFAULT; +#endif + i2s_channel_disable(_tx_handle); + i2s_channel_reconfig_std_clock(_tx_handle, &clk_cfg); + i2s_channel_enable(_tx_handle); +#elif defined(ESP8266) + i2s_set_rate(adj); +#elif defined(ARDUINO_ARCH_RP2040) + i2s.setFrequency(adj); +#endif + } + return true; } -bool AudioOutputI2S::ConsumeSample(int16_t sample[2]) -{ - int16_t ms[2]; +bool AudioOutputI2S::SetChannels(int channels) { + if ((channels < 1) || (channels > 2)) { + return false; + } + this->channels = channels; + return true; +} - ms[0] = sample[0]; - ms[1] = sample[1]; - MakeSampleStereo16( ms ); +bool AudioOutputI2S::SetOutputModeMono(bool mono) { + this->mono = mono; + return true; +} - if (this->mono) { - // Average the two samples and overwrite - int32_t ttl = ms[LEFTCHANNEL] + ms[RIGHTCHANNEL]; - ms[LEFTCHANNEL] = ms[RIGHTCHANNEL] = (ttl>>1) & 0xffff; - } +bool AudioOutputI2S::SetLsbJustified(bool lsbJustified) { + if (i2sOn) { + return false; + } + this->lsb_justified = lsbJustified; + return true; +} + +bool AudioOutputI2S::begin() { #ifdef ESP32 - uint32_t s32; - if (output_mode == INTERNAL_DAC) { - int16_t l = Amplify(ms[LEFTCHANNEL]) + 0x8000; - int16_t r = Amplify(ms[RIGHTCHANNEL]) + 0x8000; - s32 = (r<<16) | (l&0xffff); - } else { - s32 = ((Amplify(ms[RIGHTCHANNEL]))<<16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); - } - return i2s_write_bytes((i2s_port_t)portNo, (const char*)&s32, sizeof(uint32_t), 0); + i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER); + chan_cfg.dma_desc_num = _buffers; + chan_cfg.dma_frame_num = _bufferWords; + assert(ESP_OK == i2s_new_channel(&chan_cfg, &_tx_handle, nullptr)); + + i2s_std_config_t std_cfg = { + .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(hertz), + .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO), + .gpio_cfg = { + .mclk = mclkPin < 0 ? I2S_GPIO_UNUSED : (gpio_num_t)mclkPin, + .bclk = bclkPin < 0 ? I2S_GPIO_UNUSED : (gpio_num_t)bclkPin, + .ws = wclkPin < 0 ? I2S_GPIO_UNUSED : (gpio_num_t)wclkPin, + .dout = (gpio_num_t)doutPin, + .din = I2S_GPIO_UNUSED, + .invert_flags = { + .mclk_inv = false, + .bclk_inv = false, + .ws_inv = false, + }, + }, + }; +#if SOC_CLK_APLL_SUPPORTED + std_cfg.clk_cfg.clk_src = _useAPLL ? i2s_clock_src_t::I2S_CLK_SRC_APLL : i2s_clock_src_t::I2S_CLK_SRC_DEFAULT; +#endif + std_cfg.slot_cfg.bit_shift = !lsb_justified; // I2S = shift, LSBJ = no shift + assert(ESP_OK == i2s_channel_init_std_mode(_tx_handle, &std_cfg)); + + // Fill w/0s to start off + int16_t a[2] = {0, 0}; + size_t written = 0; + do { + i2s_channel_preload_data(_tx_handle, (void*)a, sizeof(a), &written); + } while (written); + + i2sOn = (ESP_OK == i2s_channel_enable(_tx_handle)); +#elif defined(ESP8266) + if (!i2sOn) { + orig_bck = READ_PERI_REG(PERIPHS_IO_MUX_MTDO_U); + orig_ws = READ_PERI_REG(PERIPHS_IO_MUX_GPIO2_U); +#ifdef I2S_HAS_BEGIN_RXTX_DRIVE_CLOCKS + if (!i2s_rxtxdrive_begin(false, true, false, true)) { + return false; + } #else - uint32_t s32 = ((Amplify(ms[RIGHTCHANNEL]))<<16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); - return i2s_write_sample_nb(s32); // If we can't store it, return false. OTW true + if (!i2s_rxtx_begin(false, true)) { + return false; + } #endif + i2sOn = true; + } +#elif defined(ARDUINO_ARCH_RP2040) + if (!i2sOn) { + i2s.setSysClk(hertz); + if (wclkPin == bclkPin + 1) { + i2s.setBCLK(bclkPin); + } else if (wclkPin == bclkPin - 1) { + // Swapped! + i2s.setBCLK(bclkPin - 1); + i2s.swapClocks(); + } else { + audioLogger->printf_P(PSTR("I2S: BCLK and WCLK must be adjacent\n")); + return false; + } + i2s.setDATA(doutPin); + if (mclkPin >= 0) { + i2s.setMCLK(mclkPin); + i2s.setMCLKmult(256); + } + i2s.setBitsPerSample(16); + i2sOn = i2s.begin(hertz); + } +#endif + SetRate(hertz ? hertz : 44100); // Default + return true; } -void AudioOutputI2S::flush() { +bool AudioOutputI2S::ConsumeSample(int16_t sample[2]) { + if (!i2sOn) { + return false; + } + + int16_t ms[2]; + + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); + + if (this->mono) { + // Average the two samples and overwrite + int32_t ttl = ms[LEFTCHANNEL] + ms[RIGHTCHANNEL]; + ms[LEFTCHANNEL] = ms[RIGHTCHANNEL] = (ttl >> 1) & 0xffff; + } #ifdef ESP32 - // makes sure that all stored DMA samples are consumed / played - int buffersize = 64 * this->dma_buf_count; - int16_t samples[2] = {0x0,0x0}; - for (int i=0;imono || (gainF2P6 != 1 << 6)) { + return AudioOutput::ConsumeSamples(samples, count); + } + auto ret = i2s.write((const uint8_t *)samples, count * 4); + ret /= 4; + return ret; +} +#endif + + +void AudioOutputI2S::flush() { #ifdef ESP32 - i2s_zero_dma_buffer((i2s_port_t)portNo); + // makes sure that all stored DMA samples are consumed / played + int buffersize = _buffers * _bufferWords; + int16_t samples[2] = {0x0, 0x0}; + for (int i = 0; i < buffersize; i++) { + while (!ConsumeSample(samples)) { + delay(10); + } + } +#elif defined(ARDUINO_ARCH_RP2040) + i2s.flush(); #endif - return true; } +bool AudioOutputI2S::stop() { + if (!i2sOn) { + return false; + } +#ifdef ESP32 + i2s_channel_disable(_tx_handle); + i2s_del_channel(_tx_handle); +#elif defined(ESP8266) + i2s_end(); +#elif defined(ARDUINO_ARCH_RP2040) + i2s.end(); +#endif + i2sOn = false; + return true; +} diff --git a/src/AudioOutputI2S.h b/src/AudioOutputI2S.h index 6070ca4e..ccdc6de9 100644 --- a/src/AudioOutputI2S.h +++ b/src/AudioOutputI2S.h @@ -1,58 +1,108 @@ /* - AudioOutputI2S - Base class for an I2S output port - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputI2S + Base class for an I2S output port + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTI2S_H -#define _AUDIOOUTPUTI2S_H +#pragma once #include "AudioOutput.h" -class AudioOutputI2S : public AudioOutput -{ - public: - AudioOutputI2S(int port=0, int output_mode=EXTERNAL_I2S, int dma_buf_count = 8, int use_apll=APLL_DISABLE); +#if defined(ARDUINO_ARCH_RP2040) +#include +#include +#elif defined(ESP32) +#include +#endif + +class AudioOutputI2S : public AudioOutput { +public: +#if defined(ESP32) || defined(ESP8266) +#ifndef ESP8266 + [[deprecated("Use AudioOutputI2S(dmaBuffers, dmaBufferBytes) for normal I2S, AudioOutputPDM() for PDM mode, or AudioOutputInternalDAC() for DAC mode")]] +#endif + AudioOutputI2S(int port, int output_mode = EXTERNAL_I2S, int dma_buf_count = 8, int use_apll = APLL_DISABLE); + enum : int { APLL_AUTO = -1, APLL_ENABLE = 1, APLL_DISABLE = 0 }; + enum : int { EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2 }; + AudioOutputI2S(); +#elif defined(ARDUINO_ARCH_RP2040) + [[deprecated]] AudioOutputI2S(long sampleRate, pin_size_t sck = 26, pin_size_t data = 28); + AudioOutputI2S(); +#endif +#if defined(ESP32) || defined(ESP8266) +#define __DMA_BUFF_BYTES (4608 / 2) +#else +#define __DMA_BUFF_BYTES 4608 +#endif + bool SetBuffers(int dmaBufferCount = 5, int dmaBufferBytes = __DMA_BUFF_BYTES); +#undef __DMA_BUFF_BYTES + bool SetPinout(int bclkPin, int wclkPin, int doutPin, int mclkPin = -1); + +#if defined(ESP32) && SOC_CLK_APLL_SUPPORTED + bool SetUseAPLL(); +#endif + virtual ~AudioOutputI2S() override; - bool SetPinout(int bclkPin, int wclkPin, int doutPin); virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; +#ifdef ARDUINO_ARCH_RP2040 + // Have an optimized block pass-through for the Pico + virtual uint16_t ConsumeSamples(int16_t *samples, uint16_t count) override; +#endif virtual void flush() override; virtual bool stop() override; - - bool SetOutputModeMono(bool mono); // Force mono output no matter the input - enum : int { APLL_AUTO = -1, APLL_ENABLE = 1, APLL_DISABLE = 0 }; - enum : int { EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2 }; + [[deprecated("Use AudioOutputInternalDAC() for DAC output, begin(void) for normal I2S")]] bool begin(bool txDAC); + bool SetOutputModeMono(bool mono); // Force mono output no matter the input + bool SetLsbJustified(bool lsbJustified); // Allow supporting non-I2S chips, e.g. PT8211 + [[deprecated("Use SetPinout() with an MCLK pin to enable")]] bool SetMclk(bool enabled) { + (void) enabled; + return true; + } + [[deprecated("Use SetPinout() and specify the bclk/wclk to automatically set the clock swapping")]] bool SwapClocks(bool swap_clocks); // Swap BCLK and WCLK - protected: - virtual int AdjustI2SRate(int hz) { return hz; } - uint8_t portNo; - int output_mode; +protected: + virtual int AdjustI2SRate(int hz) { + return hz; + } bool mono; + bool lsb_justified; bool i2sOn; - int dma_buf_count; + + int8_t bclkPin; + int8_t wclkPin; + int8_t doutPin; + int8_t mclkPin; + + size_t _buffers; + size_t _bufferWords; + +#ifdef ESP32 + bool _useAPLL; + // I2S IDF object and info + i2s_chan_handle_t _tx_handle; +#elif defined(ARDUINO_ARCH_RP2040) + // Normal software-defined I2S + I2S i2s; +#elif defined(ESP8266) // We can restore the old values and free up these pins when in NoDAC mode uint32_t orig_bck; uint32_t orig_ws; -}; - #endif - +}; diff --git a/src/AudioOutputI2SNoDAC.cpp b/src/AudioOutputI2SNoDAC.cpp index cb36e13e..5b5677ba 100644 --- a/src/AudioOutputI2SNoDAC.cpp +++ b/src/AudioOutputI2SNoDAC.cpp @@ -1,108 +1,143 @@ /* - AudioOutputI2SNoDAC - Audio player using SW delta-sigma to generate "analog" on I2S data - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputI2SNoDAC + Audio player using SW delta-sigma to generate "analog" on I2S data + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #ifdef ESP32 - #include "driver/i2s.h" -#else - #include +#include +#elif defined(ARDUINO_ARCH_RP2040) || ARDUINO_ESP8266_MAJOR >= 3 +#include +#elif ARDUINO_ESP8266_MAJOR < 3 +#include #endif #include "AudioOutputI2SNoDAC.h" -AudioOutputI2SNoDAC::AudioOutputI2SNoDAC(int port) : AudioOutputI2S(port, false) -{ - SetOversampling(32); - lastSamp = 0; - cumErr = 0; -#ifndef ESP32 - WRITE_PERI_REG(PERIPHS_IO_MUX_MTDO_U, orig_bck); - WRITE_PERI_REG(PERIPHS_IO_MUX_GPIO2_U, orig_ws); +#if defined(ARDUINO_ARCH_RP2040) +// +// Create an alternate constructor for the RP2040. The AudioOutputI2S has an alternate +// constructor for the RP2040, so the code was passing port to the sampleRate and false to sck. +// +// AudioOutputI2S(long sampleRate = 44100, pin_size_t sck = 26, pin_size_t data = 28); +// +// So this new constructor adds the ability to pass both port and sck to the underlying class, but +// uses the same defaults in the AudioOutputI2S constructor. +// +AudioOutputI2SNoDAC::AudioOutputI2SNoDAC(int port, int sck) : AudioOutputI2S() { + SetPinout(sck, sck + 1, port); // TODO - allow RP2040 to disable unused pins like ESP + SetOversampling(32); + lastSamp = 0; + cumErr = 0; +} + +#else + +AudioOutputI2SNoDAC::AudioOutputI2SNoDAC(int port) : AudioOutputI2S() { + SetPinout(-1, -1, port); + SetOversampling(32); + lastSamp = 0; + cumErr = 0; +#ifdef ESP8266 + WRITE_PERI_REG(PERIPHS_IO_MUX_MTDO_U, orig_bck); + WRITE_PERI_REG(PERIPHS_IO_MUX_GPIO2_U, orig_ws); #endif + } +#endif -AudioOutputI2SNoDAC::~AudioOutputI2SNoDAC() -{ +AudioOutputI2SNoDAC::~AudioOutputI2SNoDAC() { + stop(); } bool AudioOutputI2SNoDAC::SetOversampling(int os) { - if (os % 32) return false; // Only Nx32 oversampling supported - if (os > 256) return false; // Don't be silly now! - if (os < 32) return false; // Nothing under 32 allowed + if (os % 32) { + return false; // Only Nx32 oversampling supported + } + if (os > 256) { + return false; // Don't be silly now! + } + if (os < 32) { + return false; // Nothing under 32 allowed + } - oversample = os; - return SetRate(hertz); + oversample = os; + return SetRate(hertz); } -void AudioOutputI2SNoDAC::DeltaSigma(int16_t sample[2], uint32_t dsBuff[8]) -{ - // Not shift 8 because addition takes care of one mult x 2 - int32_t sum = (((int32_t)sample[0]) + ((int32_t)sample[1])) >> 1; - fixed24p8_t newSamp = ( (int32_t)Amplify(sum) ) << 8; - - int oversample32 = oversample / 32; - // How much the comparison signal changes each oversample step - fixed24p8_t diffPerStep = (newSamp - lastSamp) >> (4 + oversample32); - - // Don't need lastSamp anymore, store this one for next round - lastSamp = newSamp; - - for (int j = 0; j < oversample32; j++) { - uint32_t bits = 0; // The bits we convert the sample into, MSB to go on the wire first - - for (int i = 32; i > 0; i--) { - bits = bits << 1; - if (cumErr < 0) { - bits |= 1; - cumErr += fixedPosValue - newSamp; - } else { - // Bits[0] = 0 handled already by left shift - cumErr -= fixedPosValue + newSamp; - } - newSamp += diffPerStep; // Move the reference signal towards destination +void AudioOutputI2SNoDAC::DeltaSigma(int16_t sample[2], uint32_t dsBuff[8]) { + // Not shift 8 because addition takes care of one mult x 2 + int32_t sum = (((int32_t)sample[0]) + ((int32_t)sample[1])) >> 1; + fixed24p8_t newSamp = ((int32_t)Amplify(sum)) << 8; + + int oversample32 = oversample / 32; + // How much the comparison signal changes each oversample step + fixed24p8_t diffPerStep = (newSamp - lastSamp) >> (4 + oversample32); + + // Don't need lastSamp anymore, store this one for next round + lastSamp = newSamp; + + for (int j = 0; j < oversample32; j++) { + uint32_t bits = 0; // The bits we convert the sample into, MSB to go on the wire first + + for (int i = 32; i > 0; i--) { + bits = bits << 1; + if (cumErr < 0) { + bits |= 1; + cumErr += fixedPosValue - newSamp; + } else { + // Bits[0] = 0 handled already by left shift + cumErr -= fixedPosValue + newSamp; + } + newSamp += diffPerStep; // Move the reference signal towards destination + } + dsBuff[j] = bits; } - dsBuff[j] = bits; - } } -bool AudioOutputI2SNoDAC::ConsumeSample(int16_t sample[2]) -{ - int16_t ms[2]; - ms[0] = sample[0]; - ms[1] = sample[1]; - MakeSampleStereo16( ms ); +bool AudioOutputI2SNoDAC::ConsumeSample(int16_t sample[2]) { + int16_t ms[2]; + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); - // Make delta-sigma filled buffer - uint32_t dsBuff[8]; - DeltaSigma(ms, dsBuff); + // Make delta-sigma filled buffer + uint32_t dsBuff[8]; + DeltaSigma(ms, dsBuff); - // Either send complete pulse stream or nothing + // Either send complete pulse stream or nothing #ifdef ESP32 - if (!i2s_write_bytes((i2s_port_t)portNo, (const char *)dsBuff, sizeof(uint32_t) * (oversample/32), 0)) - return false; -#else - if (!i2s_write_sample_nb(dsBuff[0])) return false; // No room at the inn - // At this point we've sent in first of possibly 8 32-bits, need to send - // remaining ones even if they block. - for (int i = 32; i < oversample; i+=32) - i2s_write_sample( dsBuff[i / 32]); + size_t i2s_bytes_written = sizeof(uint32_t); + i2s_channel_write(_tx_handle, (const char *)dsBuff, sizeof(uint32_t) * (oversample / 32), &i2s_bytes_written, 10); + return i2s_bytes_written ? true : false; +#elif defined(ESP8266) + if (!i2s_write_sample_nb(dsBuff[0])) { + return false; // No room at the inn + } + // At this point we've sent in first of possibly 8 32-bits, need to send + // remaining ones even if they block. + for (int i = 32; i < oversample; i += 32) { + i2s_write_sample(dsBuff[i / 32]); + } +#elif defined(ARDUINO_ARCH_RP2040) + for (int i = 0; i < oversample / 32; i++) { + i2s.write((int32_t)dsBuff[i], true); + } #endif - return true; + return true; } diff --git a/src/AudioOutputI2SNoDAC.h b/src/AudioOutputI2SNoDAC.h index b5f32145..a5aeeb43 100644 --- a/src/AudioOutputI2SNoDAC.h +++ b/src/AudioOutputI2SNoDAC.h @@ -1,46 +1,52 @@ /* - AudioOutputI2SNoDAC - Audio player using SW delta-sigma to generate "analog" on I2S data - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputI2SNoDAC + Audio player using SW delta-sigma to generate "analog" on I2S data + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTI2SNODAC_H -#define _AUDIOOUTPUTI2SNODAC_H +#pragma once #include "AudioOutputI2S.h" -class AudioOutputI2SNoDAC : public AudioOutputI2S -{ - public: +class AudioOutputI2SNoDAC : public AudioOutputI2S { +public: + // + // Define a different constructor for the RP2040, as this class calls the constructor + // of the AudioOutputI2S which has an alternate constructor for the RP2040 + // +#if defined(ARDUINO_ARCH_RP2040) + AudioOutputI2SNoDAC(int port = 28, int sck = 26); +#else AudioOutputI2SNoDAC(int port = 0); +#endif + virtual ~AudioOutputI2SNoDAC() override; virtual bool ConsumeSample(int16_t sample[2]) override; - + bool SetOversampling(int os); - - protected: - virtual int AdjustI2SRate(int hz) override { return hz * oversample/32; } - uint8_t oversample; + +protected: + virtual int AdjustI2SRate(int hz) override { + return hz * oversample / 32; + } + int oversample; void DeltaSigma(int16_t sample[2], uint32_t dsBuff[4]); typedef int32_t fixed24p8_t; - enum {fixedPosValue=0x007fff00}; /* 24.8 of max-signed-int */ + enum {fixedPosValue = 0x007fff00}; /* 24.8 of max-signed-int */ fixed24p8_t lastSamp; // Last sample value fixed24p8_t cumErr; // Running cumulative error since time began }; - -#endif - diff --git a/src/AudioOutputInternalDAC.h b/src/AudioOutputInternalDAC.h new file mode 100644 index 00000000..e5aa0679 --- /dev/null +++ b/src/AudioOutputInternalDAC.h @@ -0,0 +1,155 @@ + +#pragma once +#if defined(ESP32) && SOC_DAC_SUPPORTED +#include "AudioOutput.h" +#include + +class AudioOutputInternalDAC : public AudioOutput { + const int buffer_sz; + std::vector buffer; + dac_continuous_handle_t dac_handle = nullptr; + + void dac_init() { + ESP_LOGI("dac_init", "bps=%d, ch=%d, freq=%d", 16, channels, hertz); + + if (dac_handle) { + dac_continuous_disable(dac_handle); + dac_continuous_del_channels(dac_handle); + } + + dac_continuous_config_t dac_config = { + .chan_mask = channels == 2 ? DAC_CHANNEL_MASK_ALL : DAC_CHANNEL_MASK_CH0, + .desc_num = 2, // we dont need more + .buf_size = (size_t)buffer_sz, + .freq_hz = hertz, + .offset = 0, + .clk_src = DAC_DIGI_CLK_SRC_APLL, + .chan_mode = channels == 2 ? DAC_CHANNEL_MODE_ALTER : DAC_CHANNEL_MODE_SIMUL, + }; + + dac_continuous_new_channels(&dac_config, &dac_handle); + dac_continuous_enable(dac_handle); + } + + void dac_deinit() { + if (dac_handle) { + dac_continuous_disable(dac_handle); + dac_continuous_del_channels(dac_handle); + dac_handle = nullptr; + } + + // prevent frying of your audio amplifier + // dac pins like to go high after deinit + +#if defined(CONFIG_IDF_TARGET_ESP32) + int dac_1_gpio = 25, dac_2_gpio = 26; +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + int dac_1_gpio = 17, dac_2_gpio = 18; +#else + static_assert(0, "AudioOutputInternalDAC: Unsupported Target " CONFIG_IDF_TARGET); +#endif + + pinMode(dac_1_gpio, OUTPUT); + digitalWrite(dac_1_gpio, LOW); + + if (channels == 2) { + pinMode(dac_2_gpio, OUTPUT); + digitalWrite(dac_2_gpio, LOW); + } + } + + void dac_write(uint8_t* samples, uint16_t count) { + if (buffer.size() + count >= buffer_sz) { + size_t needed = buffer_sz - buffer.size(); + buffer.insert(buffer.end(), samples, samples + needed); + samples += needed; count -= needed; + + dac_continuous_write(dac_handle, buffer.data(), buffer_sz, NULL, -1); + buffer.clear(); + + while (count >= buffer_sz) { + dac_continuous_write(dac_handle, samples, buffer_sz, NULL, -1); + samples += buffer_sz; count -= buffer_sz; + } + } + + if (count) { + buffer.insert(buffer.end(), samples, samples + count); + } + } + +public: + // buffer_size should be in rannge [32, 4092]. large values can cause out + // of memory situation which can have side effects like wifi not working + AudioOutputInternalDAC(uint16_t buffer_size = 256): buffer_sz{buffer_size} { + dac_deinit(); //sets the pins low until dac_init + } + + ~AudioOutputInternalDAC() { + dac_deinit(); + } + + uint16_t ConsumeSamples(int16_t* samples, uint16_t count) override { + if (!dac_handle) { + dac_init(); + } + auto u8_samples = (uint8_t*)samples; + + for (int i = 0 ; i < count ; ++i) { + u8_samples[i] = (samples[i] + 32768) / 257; + } + + dac_write(u8_samples, count); + return count; + } + + bool ConsumeSample(int16_t samples[2]) { + if (!dac_handle) { + dac_init(); + } + uint8_t u8_samples[2]; + + u8_samples[0] = (samples[0] + 32768) / 257; + u8_samples[1] = (samples[1] + 32768) / 257; + + dac_write(u8_samples, channels); + return true; + } + + bool begin() override { + hertz = 44100; + return true; + } + + void flush() override { + if (dac_handle) { + buffer.resize(buffer_sz); buffer.back() = 0; //ensure last sample is 0 + dac_continuous_write(dac_handle, buffer.data(), buffer_sz, NULL, -1); + } + buffer.clear(); + } + + bool stop() override { + flush(); + return true; + } + + bool SetRate(int hz) override { + if (hertz != hz) { + hertz = hz; + flush(); + dac_deinit(); + } + return true; + } + + bool SetChannels(int ch) override { + if (channels != ch) { + channels = ch; + flush(); + dac_deinit(); + } + return true; + } +}; +#endif diff --git a/src/AudioOutputMixer.cpp b/src/AudioOutputMixer.cpp index 57a1c06a..1b0982ff 100644 --- a/src/AudioOutputMixer.cpp +++ b/src/AudioOutputMixer.cpp @@ -1,244 +1,217 @@ /* - AudioOutputMixer - Simple mixer which can combine multiple inputs to a single output stream - - Copyright (C) 2018 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputMixer + Simple mixer which can combine multiple inputs to a single output stream + + Copyright (C) 2018 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #include "AudioOutputMixer.h" -AudioOutputMixerStub::AudioOutputMixerStub(AudioOutputMixer *sink, int id) : AudioOutput() -{ - this->id = id; - this->parent = sink; - SetGain(1.0); +AudioOutputMixerStub::AudioOutputMixerStub(AudioOutputMixer *sink, int id) : AudioOutput() { + this->id = id; + this->parent = sink; + SetGain(1.0); + this->newHz = 44100; + this->lastHz = -1; } -AudioOutputMixerStub::~AudioOutputMixerStub() -{ - parent->RemoveInput(id); +AudioOutputMixerStub::~AudioOutputMixerStub() { + parent->RemoveInput(id); } -bool AudioOutputMixerStub::SetRate(int hz) -{ - return parent->SetRate(hz, id); +bool AudioOutputMixerStub::SetRate(int hz) { + newHz = hz; + return true; } -bool AudioOutputMixerStub::SetBitsPerSample(int bits) -{ - return parent->SetBitsPerSample(bits, id); +bool AudioOutputMixerStub::SetChannels(int channels) { + this->channels = channels; + return parent->SetChannels(channels, id); } -bool AudioOutputMixerStub::SetChannels(int channels) -{ - return parent->SetChannels(channels, id); +bool AudioOutputMixerStub::begin() { + return parent->begin(id); } -bool AudioOutputMixerStub::begin() -{ - return parent->begin(id); -} +bool AudioOutputMixerStub::ConsumeSample(int16_t sample[2]) { + int16_t ms[2]; -bool AudioOutputMixerStub::ConsumeSample(int16_t sample[2]) -{ - int16_t amp[2]; - amp[LEFTCHANNEL] = Amplify(sample[LEFTCHANNEL]); - amp[RIGHTCHANNEL] = Amplify(sample[RIGHTCHANNEL]); - return parent->ConsumeSample(amp, id); + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); + ms[LEFTCHANNEL] = Amplify(ms[LEFTCHANNEL]); + ms[RIGHTCHANNEL] = Amplify(ms[RIGHTCHANNEL]); + if (newHz != lastHz) { // Avoid setting on each sample unless things change + parent->SetRate(newHz, id); + lastHz = newHz; + } + return parent->ConsumeSample(ms, id); } -bool AudioOutputMixerStub::stop() -{ - return parent->stop(id); +bool AudioOutputMixerStub::stop() { + return parent->stop(id); } -AudioOutputMixer::AudioOutputMixer(int buffSizeSamples, AudioOutput *dest) : AudioOutput() -{ - buffSize = buffSizeSamples; - leftAccum = (int32_t*)calloc(sizeof(int32_t), buffSize); - rightAccum = (int32_t*)calloc(sizeof(int32_t), buffSize); - for (int i=0; iSetRate(hz); -} - -bool AudioOutputMixer::SetBitsPerSample(int bits, int id) -{ - (void) id; - return sink->SetBitsPerSample(bits); +bool AudioOutputMixer::SetRate(int hz, int id) { + (void) id; + return sink->SetRate(hz); } -bool AudioOutputMixer::SetChannels(int channels, int id) -{ - (void) id; - return sink->SetChannels(channels); +bool AudioOutputMixer::SetChannels(int channels, int id) { + (void) id; + return sink->SetChannels(channels); } -bool AudioOutputMixer::begin(int id) -{ - stubRunning[id] = true; +bool AudioOutputMixer::begin(int id) { + stubRunning[id] = true; - if (!sinkStarted) { - sinkStarted = true; - return sink->begin(); - } else { - return true; - } -} - -AudioOutputMixerStub *AudioOutputMixer::NewInput() -{ - for (int i=0; ibegin(); + } else { + return true; } - if (avail) { - int16_t s[2]; - if (leftAccum[readPtr] > 32767) { - s[LEFTCHANNEL] = 32767; - } else if (leftAccum[readPtr] < -32767) { - s[LEFTCHANNEL] = -32767; - } else { - s[LEFTCHANNEL] = leftAccum[readPtr]; - } - if (rightAccum[readPtr] > 32767) { - s[RIGHTCHANNEL] = 32767; - } else if (rightAccum[readPtr] < -32767) { - s[RIGHTCHANNEL] = -32767; - } else { - s[RIGHTCHANNEL] = rightAccum[readPtr]; - } -// s[LEFTCHANNEL] = Amplify(s[LEFTCHANNEL]); -// s[RIGHTCHANNEL] = Amplify(s[RIGHTCHANNEL]); - if (!sink->ConsumeSample(s)) { - break; // Can't stuff any more in I2S... - } - // Clear the accums and advance the pointer to next potential sample - leftAccum[readPtr] = 0; - rightAccum[readPtr] = 0; - readPtr = (readPtr + 1) % buffSize; +} + +AudioOutputMixerStub *AudioOutputMixer::NewInput() { + for (int i = 0; i < maxStubs; i++) { + if (!stubAllocated[i]) { + stubAllocated[i] = true; + stubRunning[i] = false; + writePtr[i] = readPtr; // TODO - should it be 1 before readPtr? + AudioOutputMixerStub *stub = new AudioOutputMixerStub(this, i); + return stub; + } } - } while (avail); - return true; + return nullptr; +} + +void AudioOutputMixer::RemoveInput(int id) { + stubAllocated[id] = false; + stubRunning[id] = false; +} + +bool AudioOutputMixer::loop() { + // First, try and fill I2S... + // This is not optimal, but algorithmically should work fine + bool avail; + do { + avail = true; + for (int i = 0; i < maxStubs && avail; i++) { + if (stubRunning[i] && writePtr[i] == readPtr) { + avail = false; // The read pointer is touching an active writer, can't advance + } + } + if (avail) { + int16_t s[2]; + if (leftAccum[readPtr] > 32767) { + s[LEFTCHANNEL] = 32767; + } else if (leftAccum[readPtr] < -32767) { + s[LEFTCHANNEL] = -32767; + } else { + s[LEFTCHANNEL] = leftAccum[readPtr]; + } + if (rightAccum[readPtr] > 32767) { + s[RIGHTCHANNEL] = 32767; + } else if (rightAccum[readPtr] < -32767) { + s[RIGHTCHANNEL] = -32767; + } else { + s[RIGHTCHANNEL] = rightAccum[readPtr]; + } + // s[LEFTCHANNEL] = Amplify(s[LEFTCHANNEL]); + // s[RIGHTCHANNEL] = Amplify(s[RIGHTCHANNEL]); + if (!sink->ConsumeSample(s)) { + break; // Can't stuff any more in I2S... + } + // Clear the accums and advance the pointer to next potential sample + leftAccum[readPtr] = 0; + rightAccum[readPtr] = 0; + readPtr = (readPtr + 1) % buffSize; + } + } while (avail); + return true; } -bool AudioOutputMixer::ConsumeSample(int16_t sample[2], int id) -{ - loop(); // Send any pre-existing, completed I2S data we can fit +bool AudioOutputMixer::ConsumeSample(int16_t sample[2], int id) { + loop(); // Send any pre-existing, completed I2S data we can fit - // Now, do we have space for a new sample? - int nextWritePtr = (writePtr[id] + 1) % buffSize; - if (nextWritePtr == readPtr) { - return false; - } + // Now, do we have space for a new sample? + int nextWritePtr = (writePtr[id] + 1) % buffSize; + if (nextWritePtr == readPtr) { + return false; + } - leftAccum[writePtr[id]] += sample[LEFTCHANNEL]; - rightAccum[writePtr[id]] += sample[RIGHTCHANNEL]; - writePtr[id] = nextWritePtr; - return true; + leftAccum[writePtr[id]] += sample[LEFTCHANNEL]; + rightAccum[writePtr[id]] += sample[RIGHTCHANNEL]; + writePtr[id] = nextWritePtr; + return true; } -bool AudioOutputMixer::stop(int id) -{ - stubRunning[id] = false; - return true; +bool AudioOutputMixer::stop(int id) { + stubRunning[id] = false; + return true; } diff --git a/src/AudioOutputMixer.h b/src/AudioOutputMixer.h index 2d2d1ec7..c17f2eff 100644 --- a/src/AudioOutputMixer.h +++ b/src/AudioOutputMixer.h @@ -1,21 +1,21 @@ /* - AudioOutputMixer - Simple mixer which can combine multiple inputs to a single output stream - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputMixer + Simple mixer which can combine multiple inputs to a single output stream + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTMIXER_H @@ -27,31 +27,29 @@ class AudioOutputMixer; // The output stub exported by the mixer for use by the generator -class AudioOutputMixerStub : public AudioOutput -{ - public: +class AudioOutputMixerStub : public AudioOutput { +public: AudioOutputMixerStub(AudioOutputMixer *sink, int id); virtual ~AudioOutputMixerStub() override; virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; - protected: +protected: AudioOutputMixer *parent; int id; + int newHz; + int lastHz; }; // Single mixer object per output -class AudioOutputMixer : public AudioOutput -{ - public: +class AudioOutputMixer : public AudioOutput { +public: AudioOutputMixer(int samples, AudioOutput *sink); virtual ~AudioOutputMixer() override; virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; @@ -60,18 +58,17 @@ class AudioOutputMixer : public AudioOutput AudioOutputMixerStub *NewInput(); // Get a new stub to pass to a generator - // Stub called functions - friend class AudioOutputMixerStub; - private: + // Stub called functions + friend class AudioOutputMixerStub; +private: void RemoveInput(int id); bool SetRate(int hz, int id); - bool SetBitsPerSample(int bits, int id); bool SetChannels(int channels, int id); bool begin(int id); bool ConsumeSample(int16_t sample[2], int id); bool stop(int id); - protected: +protected: enum { maxStubs = 8 }; AudioOutput *sink; bool sinkStarted; diff --git a/src/AudioOutputNull.h b/src/AudioOutputNull.h index 4e66c899..7b7be6d0 100644 --- a/src/AudioOutputNull.h +++ b/src/AudioOutputNull.h @@ -1,21 +1,21 @@ /* - AudioOutput - Base class of an audio output player - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutput + Base class of an audio output player + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTNULL_H @@ -23,23 +23,44 @@ #include "AudioOutput.h" -class AudioOutputNull : public AudioOutput -{ - public: +class AudioOutputNull : public AudioOutput { +public: AudioOutputNull() {}; ~AudioOutputNull() {}; - virtual bool begin() { samples = 0; startms = millis(); return true; } - virtual bool ConsumeSample(int16_t sample[2]) { (void)sample; samples++; return true; } - virtual bool stop() { endms = millis(); return true; }; - unsigned long GetMilliseconds() { return endms - startms; } - int GetSamples() { return samples; } - int GetFrequency() { return hertz; } - - protected: + virtual bool begin() { + samples = 0; + startms = millis(); + return true; + } + virtual bool ConsumeSample(int16_t sample[2]) { + (void)sample; + samples++; + return true; + } + virtual uint16_t ConsumeSamples(int16_t *sample, uint16_t count) { + (void) sample; + uint16_t c = std::min((uint16_t)256, count); + samples += c; + return c; + } + virtual bool stop() { + endms = millis(); + return true; + }; + unsigned long GetMilliseconds() { + return endms - startms; + } + int GetSamples() { + return samples; + } + int GetFrequency() { + return hertz; + } + +protected: unsigned long startms; unsigned long endms; int samples; }; #endif - diff --git a/src/AudioOutputPDM.cpp b/src/AudioOutputPDM.cpp new file mode 100644 index 00000000..4dd8b332 --- /dev/null +++ b/src/AudioOutputPDM.cpp @@ -0,0 +1,95 @@ +/* + AudioOutputPDM + + Copyright (C) 2025 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#if defined(ESP32) + +#include "AudioOutputPDM.h" + +#if SOC_I2S_SUPPORTS_PDM_TX + +AudioOutputPDM::AudioOutputPDM(int pin) : AudioOutputI2S() { + i2sOn = false; + pdmPin = pin; + channels = 2; + hertz = 44100; // Needs to be application-set + SetGain(1.0); + SetBuffers(); // Default DMA sizes +} + +AudioOutputPDM::~AudioOutputPDM() { + stop(); +} + +bool AudioOutputPDM::SetRate(int hz) { + if (hertz == hz) { + return true; + } + hertz = hz; + if (i2sOn) { + auto adj = AdjustI2SRate(hz); // Possibly scale for NoDAC + i2s_pdm_tx_clk_config_t clk_cfg; + clk_cfg = I2S_PDM_TX_CLK_DEFAULT_CONFIG((uint32_t)adj); + clk_cfg.up_sample_fp = 960; + clk_cfg.up_sample_fs = 480; + i2s_channel_disable(_tx_handle); + i2s_channel_reconfig_pdm_tx_clock(_tx_handle, &clk_cfg); + i2s_channel_enable(_tx_handle); + } + return true; +} + +bool AudioOutputPDM::begin() { + i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER); + chan_cfg.dma_desc_num = _buffers; + chan_cfg.dma_frame_num = _bufferWords; + assert(ESP_OK == i2s_new_channel(&chan_cfg, &_tx_handle, nullptr)); + + i2s_pdm_tx_config_t pdm_cfg = { + .clk_cfg = I2S_PDM_TX_CLK_DEFAULT_CONFIG(AdjustI2SRate(hertz)), + .slot_cfg = I2S_PDM_TX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO), + .gpio_cfg = { + .clk = I2S_GPIO_UNUSED, + .dout = (gpio_num_t)pdmPin, +#if SOC_I2S_PDM_MAX_TX_LINES > 1 + .dout2 = I2S_GPIO_UNUSED, +#endif + .invert_flags = { + .clk_inv = false, + }, + }, + }; + pdm_cfg.slot_cfg.data_fmt = I2S_PDM_DATA_FMT_PCM; + pdm_cfg.clk_cfg.up_sample_fp = 960; + pdm_cfg.clk_cfg.up_sample_fs = 480; + assert(ESP_OK == i2s_channel_init_pdm_tx_mode(_tx_handle, &pdm_cfg)); + + // Fill w/0s to start off + int16_t a[2] = {0, 0}; + size_t written = 0; + do { + i2s_channel_preload_data(_tx_handle, (void*)a, sizeof(a), &written); + } while (written); + + i2sOn = (ESP_OK == i2s_channel_enable(_tx_handle)); + return true; +} + +#endif + +#endif diff --git a/src/AudioOutputPDM.h b/src/AudioOutputPDM.h new file mode 100644 index 00000000..30b52167 --- /dev/null +++ b/src/AudioOutputPDM.h @@ -0,0 +1,55 @@ +/* + AudioOutputPDM + Base class for a ESP32 PDM output port + + Copyright (C) 20125 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#if defined(ESP32) + +#include + +#if SOC_I2S_SUPPORTS_PDM_TX + +#include "AudioOutput.h" +#include "AudioOutputI2S.h" + +class AudioOutputPDM : public AudioOutputI2S { +public: + AudioOutputPDM(int pin = 0); + + bool SetPinout(int pdmPin); + + virtual ~AudioOutputPDM() override; + virtual bool SetRate(int hz) override; + virtual bool begin() override; + +protected: + virtual int AdjustI2SRate(int hz) { + // TODO - There is some fixed off-by-ratio 1/1.25 in the PDM output clock vs. the PCM input data at IDF 5.5 + hz *= 8; + hz /= 10; + return hz; + } + + int8_t pdmPin; +}; + +#endif + +#endif diff --git a/src/AudioOutputPWM.cpp b/src/AudioOutputPWM.cpp new file mode 100644 index 00000000..03610873 --- /dev/null +++ b/src/AudioOutputPWM.cpp @@ -0,0 +1,115 @@ +/* + AudioOutputPWM + Base class for the RP2040 PWM audio + + Copyright (C) 2023 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#if defined(ARDUINO_ARCH_RP2040) +#include +#include "AudioOutputPWM.h" + +AudioOutputPWM::AudioOutputPWM(long sampleRate, pin_size_t data) { + pwmOn = false; + mono = false; + channels = 2; + hertz = sampleRate; + doutPin = data; + SetGain(1.0); + pwm.setStereo(true); +} + +AudioOutputPWM::~AudioOutputPWM() { + stop(); +} + +bool AudioOutputPWM::SetRate(int hz) { + this->hertz = hz; + if (pwmOn) { + pwm.setFrequency(hz); + } + return true; +} + +bool AudioOutputPWM::SetChannels(int channels) { + if ((channels < 1) || (channels > 2)) { + return false; + } + this->channels = channels; + return true; +} + +bool AudioOutputPWM::SetOutputModeMono(bool mono) { + this->mono = mono; + return true; +} + +bool AudioOutputPWM::begin() { + if (!pwmOn) { + pwm.setPin(doutPin); + pwm.setBuffers(8, 128); + pwm.begin(hertz); + } + pwmOn = true; + SetRate(hertz); // Default + return true; +} + +bool AudioOutputPWM::ConsumeSample(int16_t sample[2]) { + //Serial.printf("%d\n", sample[0]); + if (!pwmOn) { + return false; + } + + int16_t ms[2]; + + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); + + if (this->mono) { + // Average the two samples and overwrite + int32_t ttl = ms[LEFTCHANNEL] + ms[RIGHTCHANNEL]; + ms[LEFTCHANNEL] = ms[RIGHTCHANNEL] = (ttl >> 1) & 0xffff; + } + + ms[LEFTCHANNEL] = Amplify(ms[LEFTCHANNEL]); + ms[RIGHTCHANNEL] = Amplify(ms[RIGHTCHANNEL]); + + if (pwm.available()) { + pwm.write((int16_t) ms[0]); + pwm.write((int16_t) ms[1]); + return true; + } else { + return false; + } +} + +void AudioOutputPWM::flush() { + pwm.flush(); +} + +bool AudioOutputPWM::stop() { + if (!pwmOn) { + return false; + } + + pwm.end(); + pwmOn = false; + return true; +} + +#endif diff --git a/src/AudioOutputPWM.h b/src/AudioOutputPWM.h new file mode 100644 index 00000000..4aeb5dea --- /dev/null +++ b/src/AudioOutputPWM.h @@ -0,0 +1,57 @@ +/* + AudioOutputPWM + Base class for the RP2040 PWM audio output + + Copyright (C) 2023 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include "AudioOutput.h" + +#if defined(ARDUINO_ARCH_RP2040) +#include +#include + +class AudioOutputPWM : public AudioOutput { +public: + AudioOutputPWM(long sampleRate = 44100, pin_size_t data = 0); + virtual ~AudioOutputPWM() override; + virtual bool SetRate(int hz) override; + virtual bool SetChannels(int channels) override; + virtual bool begin() override; + virtual bool ConsumeSample(int16_t sample[2]) override; + virtual void flush() override; + virtual bool stop() override; + + bool SetOutputModeMono(bool mono); // Force mono output no matter the input + +protected: + bool SetPinout(); + virtual int AdjustI2SRate(int hz) { + return hz; + } + uint8_t portNo; + int output_mode; + bool mono; + bool pwmOn; + + uint8_t doutPin; + + PWMAudio pwm; +}; + +#endif diff --git a/src/AudioOutputSPDIF.cpp b/src/AudioOutputSPDIF.cpp index 8c993c5f..4cd2b58e 100644 --- a/src/AudioOutputSPDIF.cpp +++ b/src/AudioOutputSPDIF.cpp @@ -1,288 +1,301 @@ /* - AudioOutputSPDIF - - S/PDIF output via I2S - - Needs transciever from CMOS level to either optical or coaxial interface - See: https://www.epanorama.net/documents/audio/spdif.html + AudioOutputSPDIF - Original idea and sources: - Forum thread dicussing implementation + S/PDIF output via I2S + + Needs transceiver from CMOS level to either optical or coaxial interface + See: https://www.epanorama.net/documents/audio/spdif.html + + Original idea and sources: + Forum thread discussing implementation https://forum.pjrc.com/threads/28639-S-pdif - Teensy Audio Library + Teensy Audio Library https://github.com/PaulStoffregen/Audio/blob/master/output_spdif2.cpp - - Adapted for ESP8266Audio - NOTE: This module operates I2S at 4x sampling rate, as it needs to - send out each bit as two output symbols, packed into + Adapted for ESP8266Audio + + NOTE: This module operates I2S at 4x sampling rate, as it needs to + send out each bit as two output symbols, packed into 32-bit words. Even for mono sound, S/PDIF is specified minimum - for 2 channels, each as 32-bits sub-frame. This drains I2S - buffers 4x more quickly so you may need 4x bigger output - buffers than usual, configurable with 'dma_buf_count' + for 2 channels, each as 32-bits sub-frame. This drains I2S + buffers 4x more quickly so you may need 4x bigger output + buffers than usual, configurable with 'dma_buf_count' constructor parameter. - Copyright (C) 2020 Ivan Kostoski + Copyright (C) 2020 Ivan Kostoski - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +#if defined(ESP32) || defined(ESP8266) #include #if defined(ESP32) - #include "driver/i2s.h" - #include "soc/rtc.h" +#include +#include #elif defined(ESP8266) - #include "driver/SinglePinI2SDriver.h" +#include "driver/SinglePinI2SDriver.h" #endif #include "AudioOutputSPDIF.h" // BMC (Biphase Mark Coded) values (bit order reversed, i.e. LSB first) -static const uint16_t spdif_bmclookup[256] PROGMEM = { - 0xcccc, 0x4ccc, 0x2ccc, 0xaccc, 0x34cc, 0xb4cc, 0xd4cc, 0x54cc, - 0x32cc, 0xb2cc, 0xd2cc, 0x52cc, 0xcacc, 0x4acc, 0x2acc, 0xaacc, - 0x334c, 0xb34c, 0xd34c, 0x534c, 0xcb4c, 0x4b4c, 0x2b4c, 0xab4c, - 0xcd4c, 0x4d4c, 0x2d4c, 0xad4c, 0x354c, 0xb54c, 0xd54c, 0x554c, - 0x332c, 0xb32c, 0xd32c, 0x532c, 0xcb2c, 0x4b2c, 0x2b2c, 0xab2c, - 0xcd2c, 0x4d2c, 0x2d2c, 0xad2c, 0x352c, 0xb52c, 0xd52c, 0x552c, - 0xccac, 0x4cac, 0x2cac, 0xacac, 0x34ac, 0xb4ac, 0xd4ac, 0x54ac, - 0x32ac, 0xb2ac, 0xd2ac, 0x52ac, 0xcaac, 0x4aac, 0x2aac, 0xaaac, - 0x3334, 0xb334, 0xd334, 0x5334, 0xcb34, 0x4b34, 0x2b34, 0xab34, - 0xcd34, 0x4d34, 0x2d34, 0xad34, 0x3534, 0xb534, 0xd534, 0x5534, - 0xccb4, 0x4cb4, 0x2cb4, 0xacb4, 0x34b4, 0xb4b4, 0xd4b4, 0x54b4, - 0x32b4, 0xb2b4, 0xd2b4, 0x52b4, 0xcab4, 0x4ab4, 0x2ab4, 0xaab4, - 0xccd4, 0x4cd4, 0x2cd4, 0xacd4, 0x34d4, 0xb4d4, 0xd4d4, 0x54d4, - 0x32d4, 0xb2d4, 0xd2d4, 0x52d4, 0xcad4, 0x4ad4, 0x2ad4, 0xaad4, - 0x3354, 0xb354, 0xd354, 0x5354, 0xcb54, 0x4b54, 0x2b54, 0xab54, - 0xcd54, 0x4d54, 0x2d54, 0xad54, 0x3554, 0xb554, 0xd554, 0x5554, - 0x3332, 0xb332, 0xd332, 0x5332, 0xcb32, 0x4b32, 0x2b32, 0xab32, - 0xcd32, 0x4d32, 0x2d32, 0xad32, 0x3532, 0xb532, 0xd532, 0x5532, - 0xccb2, 0x4cb2, 0x2cb2, 0xacb2, 0x34b2, 0xb4b2, 0xd4b2, 0x54b2, - 0x32b2, 0xb2b2, 0xd2b2, 0x52b2, 0xcab2, 0x4ab2, 0x2ab2, 0xaab2, - 0xccd2, 0x4cd2, 0x2cd2, 0xacd2, 0x34d2, 0xb4d2, 0xd4d2, 0x54d2, - 0x32d2, 0xb2d2, 0xd2d2, 0x52d2, 0xcad2, 0x4ad2, 0x2ad2, 0xaad2, - 0x3352, 0xb352, 0xd352, 0x5352, 0xcb52, 0x4b52, 0x2b52, 0xab52, - 0xcd52, 0x4d52, 0x2d52, 0xad52, 0x3552, 0xb552, 0xd552, 0x5552, - 0xccca, 0x4cca, 0x2cca, 0xacca, 0x34ca, 0xb4ca, 0xd4ca, 0x54ca, - 0x32ca, 0xb2ca, 0xd2ca, 0x52ca, 0xcaca, 0x4aca, 0x2aca, 0xaaca, - 0x334a, 0xb34a, 0xd34a, 0x534a, 0xcb4a, 0x4b4a, 0x2b4a, 0xab4a, - 0xcd4a, 0x4d4a, 0x2d4a, 0xad4a, 0x354a, 0xb54a, 0xd54a, 0x554a, - 0x332a, 0xb32a, 0xd32a, 0x532a, 0xcb2a, 0x4b2a, 0x2b2a, 0xab2a, - 0xcd2a, 0x4d2a, 0x2d2a, 0xad2a, 0x352a, 0xb52a, 0xd52a, 0x552a, - 0xccaa, 0x4caa, 0x2caa, 0xacaa, 0x34aa, 0xb4aa, 0xd4aa, 0x54aa, - 0x32aa, 0xb2aa, 0xd2aa, 0x52aa, 0xcaaa, 0x4aaa, 0x2aaa, 0xaaaa +static const uint16_t spdif_bmclookup[256] PROGMEM = { + 0xcccc, 0x4ccc, 0x2ccc, 0xaccc, 0x34cc, 0xb4cc, 0xd4cc, 0x54cc, + 0x32cc, 0xb2cc, 0xd2cc, 0x52cc, 0xcacc, 0x4acc, 0x2acc, 0xaacc, + 0x334c, 0xb34c, 0xd34c, 0x534c, 0xcb4c, 0x4b4c, 0x2b4c, 0xab4c, + 0xcd4c, 0x4d4c, 0x2d4c, 0xad4c, 0x354c, 0xb54c, 0xd54c, 0x554c, + 0x332c, 0xb32c, 0xd32c, 0x532c, 0xcb2c, 0x4b2c, 0x2b2c, 0xab2c, + 0xcd2c, 0x4d2c, 0x2d2c, 0xad2c, 0x352c, 0xb52c, 0xd52c, 0x552c, + 0xccac, 0x4cac, 0x2cac, 0xacac, 0x34ac, 0xb4ac, 0xd4ac, 0x54ac, + 0x32ac, 0xb2ac, 0xd2ac, 0x52ac, 0xcaac, 0x4aac, 0x2aac, 0xaaac, + 0x3334, 0xb334, 0xd334, 0x5334, 0xcb34, 0x4b34, 0x2b34, 0xab34, + 0xcd34, 0x4d34, 0x2d34, 0xad34, 0x3534, 0xb534, 0xd534, 0x5534, + 0xccb4, 0x4cb4, 0x2cb4, 0xacb4, 0x34b4, 0xb4b4, 0xd4b4, 0x54b4, + 0x32b4, 0xb2b4, 0xd2b4, 0x52b4, 0xcab4, 0x4ab4, 0x2ab4, 0xaab4, + 0xccd4, 0x4cd4, 0x2cd4, 0xacd4, 0x34d4, 0xb4d4, 0xd4d4, 0x54d4, + 0x32d4, 0xb2d4, 0xd2d4, 0x52d4, 0xcad4, 0x4ad4, 0x2ad4, 0xaad4, + 0x3354, 0xb354, 0xd354, 0x5354, 0xcb54, 0x4b54, 0x2b54, 0xab54, + 0xcd54, 0x4d54, 0x2d54, 0xad54, 0x3554, 0xb554, 0xd554, 0x5554, + 0x3332, 0xb332, 0xd332, 0x5332, 0xcb32, 0x4b32, 0x2b32, 0xab32, + 0xcd32, 0x4d32, 0x2d32, 0xad32, 0x3532, 0xb532, 0xd532, 0x5532, + 0xccb2, 0x4cb2, 0x2cb2, 0xacb2, 0x34b2, 0xb4b2, 0xd4b2, 0x54b2, + 0x32b2, 0xb2b2, 0xd2b2, 0x52b2, 0xcab2, 0x4ab2, 0x2ab2, 0xaab2, + 0xccd2, 0x4cd2, 0x2cd2, 0xacd2, 0x34d2, 0xb4d2, 0xd4d2, 0x54d2, + 0x32d2, 0xb2d2, 0xd2d2, 0x52d2, 0xcad2, 0x4ad2, 0x2ad2, 0xaad2, + 0x3352, 0xb352, 0xd352, 0x5352, 0xcb52, 0x4b52, 0x2b52, 0xab52, + 0xcd52, 0x4d52, 0x2d52, 0xad52, 0x3552, 0xb552, 0xd552, 0x5552, + 0xccca, 0x4cca, 0x2cca, 0xacca, 0x34ca, 0xb4ca, 0xd4ca, 0x54ca, + 0x32ca, 0xb2ca, 0xd2ca, 0x52ca, 0xcaca, 0x4aca, 0x2aca, 0xaaca, + 0x334a, 0xb34a, 0xd34a, 0x534a, 0xcb4a, 0x4b4a, 0x2b4a, 0xab4a, + 0xcd4a, 0x4d4a, 0x2d4a, 0xad4a, 0x354a, 0xb54a, 0xd54a, 0x554a, + 0x332a, 0xb32a, 0xd32a, 0x532a, 0xcb2a, 0x4b2a, 0x2b2a, 0xab2a, + 0xcd2a, 0x4d2a, 0x2d2a, 0xad2a, 0x352a, 0xb52a, 0xd52a, 0x552a, + 0xccaa, 0x4caa, 0x2caa, 0xacaa, 0x34aa, 0xb4aa, 0xd4aa, 0x54aa, + 0x32aa, 0xb2aa, 0xd2aa, 0x52aa, 0xcaaa, 0x4aaa, 0x2aaa, 0xaaaa }; -AudioOutputSPDIF::AudioOutputSPDIF(int dout_pin, int port, int dma_buf_count) -{ - this->portNo = port; -#if defined(ESP32) - // Configure ESP32 I2S to roughly compatible to ESP8266 peripheral - i2s_config_t i2s_config_spdif = { - .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), - .sample_rate = 88200, // 2 x sampling_rate - .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, // 32bit words - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // Right than left - .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // lowest interrupt priority - .dma_buf_count = dma_buf_count, - .dma_buf_len = DMA_BUF_SIZE_DEFAULT, // bigger buffers, reduces interrupts - .use_apll = true // Audio PLL is needed for low clock jitter - }; - if (i2s_driver_install((i2s_port_t)portNo, &i2s_config_spdif, 0, NULL) != ESP_OK) { - audioLogger->println(F("ERROR: Unable to install I2S drivers")); - return; - } - i2s_zero_dma_buffer((i2s_port_t)portNo); - SetPinout(I2S_PIN_NO_CHANGE, I2S_PIN_NO_CHANGE, dout_pin); - rate_multiplier = 2; // 2x32bit words -#elif defined(ESP8266) - (void) dout_pin; - if (!I2SDriver.begin(dma_buf_count, DMA_BUF_SIZE_DEFAULT)) { - audioLogger->println(F("ERROR: Unable to start I2S driver")); - return; - } - rate_multiplier = 4; // 4x16 bit words + +AudioOutputSPDIF::AudioOutputSPDIF(int dout_pin) { + doutPin = dout_pin; +#ifdef ESP32 + rate_multiplier = 2; // 2x32bit words +#else + rate_multiplier = 4; // 4x16 bit words #endif - i2sOn = true; - mono = false; - bps = 16; - channels = 2; - frame_num = 0; - SetGain(1.0); - hertz = 0; - SetRate(44100); + mono = false; + channels = 2; + frame_num = 0; + SetGain(1.0); + frame_num = 0; + hertz = 44100; + i2sOn = false; + SetBuffers(DMA_BUF_COUNT_DEFAULT, DMA_BUF_SIZE_DEFAULT * 4); } -AudioOutputSPDIF::~AudioOutputSPDIF() -{ -#if defined(ESP32) - if (i2sOn) { - i2s_stop((i2s_port_t)this->portNo); - audioLogger->printf("UNINSTALL I2S\n"); - i2s_driver_uninstall((i2s_port_t)this->portNo); //stop & destroy i2s driver - } -#elif defined(ESP8266) - if (i2sOn) I2SDriver.stop(); -#endif - i2sOn = false; +bool AudioOutputSPDIF::SetBuffers(int dmaBufferCount, int dmaBufferBytes) { + if (i2sOn || (dmaBufferCount < 3) || (dmaBufferBytes & 3)) { + return false; + } + _buffers = dmaBufferCount; + _bufferWords = dmaBufferBytes / 4; + return true; } -bool AudioOutputSPDIF::SetPinout(int bclk, int wclk, int dout) -{ -#if defined(ESP32) - i2s_pin_config_t pins = { - .bck_io_num = bclk, - .ws_io_num = wclk, - .data_out_num = dout, - .data_in_num = I2S_PIN_NO_CHANGE - }; - if (i2s_set_pin((i2s_port_t)portNo, &pins) != ESP_OK) { - audioLogger->println("ERROR setting up S/PDIF I2S pins\n"); - return false; - } - return true; -#else - (void) bclk; - (void) wclk; - (void) dout; - return false; -#endif + +AudioOutputSPDIF::AudioOutputSPDIF(int dout_pin, int port, int dma_buf_count) : AudioOutputSPDIF(dout_pin) { + (void) port; + (void) dma_buf_count; + SetBuffers(dma_buf_count, DMA_BUF_SIZE_DEFAULT * 4); } -bool AudioOutputSPDIF::SetRate(int hz) -{ - if (!i2sOn) return false; - if (hz < 32000) return false; - if (hz == this->hertz) return true; - this->hertz = hz; - int adjustedHz = AdjustI2SRate(hz); -#if defined(ESP32) - if (i2s_set_sample_rates((i2s_port_t)portNo, adjustedHz) == ESP_OK) { - if (adjustedHz == 88200) { - // Manually fix the APLL rate for 44100. - // See: https://github.com/espressif/esp-idf/issues/2634 - // sdm0 = 28, sdm1 = 8, sdm2 = 5, odir = 0 -> 88199.977 - rtc_clk_apll_enable(1, 28, 8, 5, 0); +bool AudioOutputSPDIF::begin() { + if (i2sOn) { + return false; } - } else { - audioLogger->println("ERROR changing S/PDIF sample rate"); - } -#elif defined(ESP8266) - I2SDriver.setRate(adjustedHz); - audioLogger->printf_P(PSTR("S/PDIF rate set: %.3f\n"), I2SDriver.getActualRate()/4); +#ifdef ESP32 + i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER); + chan_cfg.dma_desc_num = _buffers; + chan_cfg.dma_frame_num = _bufferWords; + assert(ESP_OK == i2s_new_channel(&chan_cfg, &_tx_handle, nullptr)); + + i2s_std_config_t std_cfg = { + .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(((uint32_t)hertz) * 2), + .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO), + .gpio_cfg = { + .mclk = I2S_GPIO_UNUSED, + .bclk = I2S_GPIO_UNUSED, + .ws = I2S_GPIO_UNUSED, + .dout = (gpio_num_t)doutPin, + .din = I2S_GPIO_UNUSED, + .invert_flags = { + .mclk_inv = false, + .bclk_inv = false, + .ws_inv = false, + }, + }, + }; +#if SOC_CLK_APLL_SUPPORTED + std_cfg.clk_cfg.clk_src = i2s_clock_src_t::I2S_CLK_SRC_APLL; #endif - return true; + assert(ESP_OK == i2s_channel_init_std_mode(_tx_handle, &std_cfg)); +#else + if (!I2SDriver.begin(_buffers, _bufferWords)) { + audioLogger->println(F("ERROR: Unable to start I2S driver")); + return false; + } +#endif + i2sOn = true; + mono = false; + channels = 2; + frame_num = 0; + SetGain(1.0); + return true; } -bool AudioOutputSPDIF::SetBitsPerSample(int bits) -{ - if ( (bits != 16) && (bits != 8) ) return false; - this->bps = bits; - return true; +AudioOutputSPDIF::~AudioOutputSPDIF() { + stop(); } -bool AudioOutputSPDIF::SetChannels(int channels) -{ - if ( (channels < 1) || (channels > 2) ) return false; - this->channels = channels; - return true; +bool AudioOutputSPDIF::SetPinout(int dout) { + if (i2sOn) { + return false; + } + doutPin = dout; + return true; } -bool AudioOutputSPDIF::SetOutputModeMono(bool mono) -{ - this->mono = mono; - // Just use the left channel for mono - if (mono) SetChannels(1); - return true; +bool AudioOutputSPDIF::SetRate(int hz) { + if (hz < 32000) { + return false; + } + if (hz == hertz) { + return true; + } + hertz = hz; + int adjustedHz = AdjustI2SRate(hz); +#if defined(ESP32) + i2s_std_clk_config_t clk_cfg; + clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG((uint32_t)adjustedHz); + i2s_channel_disable(_tx_handle); + i2s_channel_reconfig_std_clock(_tx_handle, &clk_cfg); + i2s_channel_enable(_tx_handle); +#elif defined(ESP8266) + I2SDriver.setRate(adjustedHz); + audioLogger->printf_P(PSTR("S/PDIF rate set: %.3f\n"), I2SDriver.getActualRate() / 4); +#endif + return true; } -bool AudioOutputSPDIF::begin() -{ - return true; +bool AudioOutputSPDIF::SetChannels(int channels) { + if ((channels < 1) || (channels > 2)) { + return false; + } + this->channels = channels; + return true; } -bool AudioOutputSPDIF::ConsumeSample(int16_t sample[2]) -{ - if (!i2sOn) return true; // Sink the data - int16_t ms[2]; - uint16_t hi, lo, aux; - uint32_t buf[4]; +bool AudioOutputSPDIF::SetOutputModeMono(bool mono) { + this->mono = mono; + // Just use the left channel for mono + if (mono) { + SetChannels(1); + } + return true; +} - ms[0] = sample[0]; - ms[1] = sample[1]; - MakeSampleStereo16(ms); +bool AudioOutputSPDIF::ConsumeSample(int16_t sample[2]) { + if (!i2sOn) { + return true; // Sink the data + } + int16_t ms[2]; + uint16_t hi, lo, aux; + uint32_t buf[4]; + + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); - // S/PDIF encoding: - // http://www.hardwarebook.info/S/PDIF - // Original sources: Teensy Audio Library - // https://github.com/PaulStoffregen/Audio/blob/master/output_spdif2.cpp - // - // Order of bits, before BMC encoding, from the definition of SPDIF format - // PPPP AAAA SSSS SSSS SSSS SSSS SSSS VUCP - // are sent rearanged as - // VUCP PPPP AAAA 0000 SSSS SSSS SSSS SSSS - // This requires a bit less shifting as 16 sample bits align and can be - // BMC encoded with two table lookups (and at the same time flipped to LSB first). - // There is no separate word-clock, so hopefully the receiver won't notice. + // S/PDIF encoding: + // http://www.hardwarebook.info/S/PDIF + // Original sources: Teensy Audio Library + // https://github.com/PaulStoffregen/Audio/blob/master/output_spdif2.cpp + // + // Order of bits, before BMC encoding, from the definition of SPDIF format + // PPPP AAAA SSSS SSSS SSSS SSSS SSSS VUCP + // are sent rearanged as + // VUCP PPPP AAAA 0000 SSSS SSSS SSSS SSSS + // This requires a bit less shifting as 16 sample bits align and can be + // BMC encoded with two table lookups (and at the same time flipped to LSB first). + // There is no separate word-clock, so hopefully the receiver won't notice. - uint16_t sample_left = Amplify(ms[LEFTCHANNEL]); - // BMC encode and flip left channel bits - hi = pgm_read_word(&spdif_bmclookup[(uint8_t)(sample_left >> 8)]); - lo = pgm_read_word(&spdif_bmclookup[(uint8_t)sample_left]); - // Low word is inverted depending on first bit of high word - lo ^= (~((int16_t)hi) >> 16); - buf[0] = ((uint32_t)lo << 16) | hi; - // Fixed 4 bits auxillary-audio-databits, the first used as parity - // Depending on first bit of low word, invert the bits - aux = 0xb333 ^ (((uint32_t)((int16_t)lo)) >> 17); - // Send 'B' preamble only for the first frame of data-block - if (frame_num == 0) { - buf[1] = VUCP_PREAMBLE_B | aux; - } else { - buf[1] = VUCP_PREAMBLE_M | aux; - } + uint16_t sample_left = Amplify(ms[LEFTCHANNEL]); + // BMC encode and flip left channel bits + hi = pgm_read_word(&spdif_bmclookup[(uint8_t)(sample_left >> 8)]); + lo = pgm_read_word(&spdif_bmclookup[(uint8_t)sample_left]); + // Low word is inverted depending on first bit of high word + lo ^= (~((int16_t)hi) >> 16); + buf[0] = ((uint32_t)lo << 16) | hi; + // Fixed 4 bits auxillary-audio-databits, the first used as parity + // Depending on first bit of low word, invert the bits + aux = 0xb333 ^ (((uint32_t)((int16_t)lo)) >> 17); + // Send 'B' preamble only for the first frame of data-block + if (frame_num == 0) { + buf[1] = VUCP_PREAMBLE_B | aux; + } else { + buf[1] = VUCP_PREAMBLE_M | aux; + } - uint16_t sample_right = Amplify(ms[RIGHTCHANNEL]); - // BMC encode right channel, similar as above - hi = pgm_read_word(&spdif_bmclookup[(uint8_t)(sample_right >> 8)]); - lo = pgm_read_word(&spdif_bmclookup[(uint8_t)sample_right]); - lo ^= (~((int16_t)hi) >> 16); - buf[2] = ((uint32_t)lo << 16) | hi; - aux = 0xb333 ^ (((uint32_t)((int16_t)lo)) >> 17); - buf[3] = VUCP_PREAMBLE_W | aux; + uint16_t sample_right = Amplify(ms[RIGHTCHANNEL]); + // BMC encode right channel, similar as above + hi = pgm_read_word(&spdif_bmclookup[(uint8_t)(sample_right >> 8)]); + lo = pgm_read_word(&spdif_bmclookup[(uint8_t)sample_right]); + lo ^= (~((int16_t)hi) >> 16); + buf[2] = ((uint32_t)lo << 16) | hi; + aux = 0xb333 ^ (((uint32_t)((int16_t)lo)) >> 17); + buf[3] = VUCP_PREAMBLE_W | aux; #if defined(ESP32) - // Assume DMA buffers are multiples of 16 bytes. Either we write all bytes or none. - uint32_t bytes_written; - esp_err_t ret = i2s_write((i2s_port_t)portNo, (const char*)&buf, 8 * channels, &bytes_written, 0); - // If we didn't write all bytes, return false early and do not increment frame_num - if ((ret != ESP_OK) || (bytes_written != (8 * channels))) return false; + // Assume DMA buffers are multiples of 16 bytes. Either we write all bytes or none. + size_t bytes_written; + esp_err_t ret = i2s_channel_write(_tx_handle, (const char*)&buf, 8 * channels, &bytes_written, 10); + // If we didn't write all bytes, return false early and do not increment frame_num + if ((ret != ESP_OK) || (bytes_written != (8 * channels))) { + return false; + } #elif defined(ESP8266) - if (!I2SDriver.writeInterleaved(buf)) return false; + if (!I2SDriver.writeInterleaved(buf)) { + return false; + } #endif - // Increment and rotate frame number - if (++frame_num > 191) frame_num = 0; - return true; + // Increment and rotate frame number + if (++frame_num > 191) { + frame_num = 0; + } + return true; } -bool AudioOutputSPDIF::stop() -{ +bool AudioOutputSPDIF::stop() { + if (i2sOn) { + i2sOn = false; #if defined(ESP32) - i2s_zero_dma_buffer((i2s_port_t)portNo); + i2s_channel_disable(_tx_handle); + i2s_del_channel(_tx_handle); #elif defined(ESP8266) - I2SDriver.stop(); + I2SDriver.stop(); #endif - frame_num = 0; - return true; + frame_num = 0; + } + return true; } + +#endif diff --git a/src/AudioOutputSPDIF.h b/src/AudioOutputSPDIF.h index 92a4e46e..dbfed5f1 100644 --- a/src/AudioOutputSPDIF.h +++ b/src/AudioOutputSPDIF.h @@ -1,37 +1,42 @@ /* - AudioOutputSPDIF - - S/PDIF output via I2S - - Needs transciever from CMOS level to either optical or coaxial interface - See: https://www.epanorama.net/documents/audio/spdif.html - - Original idea and sources: - Forum thread dicussing implementation + AudioOutputSPDIF + + S/PDIF output via I2S + + Needs transceiver from CMOS level to either optical or coaxial interface + See: https://www.epanorama.net/documents/audio/spdif.html + + Original idea and sources: + Forum thread discussing implementation https://forum.pjrc.com/threads/28639-S-pdif - Teensy Audio Library + Teensy Audio Library https://github.com/PaulStoffregen/Audio/blob/master/output_spdif2.cpp - - Adapted for ESP8266Audio - Copyright (C) 2020 Ivan Kostoski + Adapted for ESP8266Audio - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2020 Ivan Kostoski - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTSPDIF_H -#define _AUDIOOUTPUTSPDIF_H +#pragma once + +#if defined(ESP32) || defined(ESP8266) + +#if defined(ESP32) +#include +#endif #include "AudioOutput.h" @@ -45,14 +50,19 @@ #define DMA_BUF_SIZE_DEFAULT 64 #endif -class AudioOutputSPDIF : public AudioOutput -{ - public: - AudioOutputSPDIF(int dout_pin=SPDIF_OUT_PIN_DEFAULT, int port=0, int dma_buf_count = DMA_BUF_COUNT_DEFAULT); +class AudioOutputSPDIF : public AudioOutput { +public: + AudioOutputSPDIF(int dout_pin = SPDIF_OUT_PIN_DEFAULT); + [[deprecated("Use AudioOutputSPDIF() and SetBuffers/SetPinout to configure")]] AudioOutputSPDIF(int dout_pin, int port0, int dma_buf_count = DMA_BUF_COUNT_DEFAULT); virtual ~AudioOutputSPDIF() override; - bool SetPinout(int bclkPin, int wclkPin, int doutPin); + [[deprecated("Use SetPinout(spdifPin) instead")]] bool SetPinout(int bclkPin, int wclkPin, int doutPin) { + (void) bclkPin; + (void) wclkPin; + return SetPinout(doutPin); + } + bool SetPinout(int doutPin); + bool SetBuffers(int dmaBuffers = DMA_BUF_COUNT_DEFAULT, int dmaBufferBytes = DMA_BUF_SIZE_DEFAULT * 4); virtual bool SetRate(int hz) override; - virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; @@ -64,13 +74,21 @@ class AudioOutputSPDIF : public AudioOutput const uint32_t VUCP_PREAMBLE_M = 0xCCE20000; // 11001100 11100010 const uint32_t VUCP_PREAMBLE_W = 0xCCE40000; // 11001100 11100100 - protected: - virtual inline int AdjustI2SRate(int hz) { return rate_multiplier * hz; } - uint8_t portNo; +protected: + virtual inline int AdjustI2SRate(int hz) { + return rate_multiplier * hz; + } bool mono; bool i2sOn; + int8_t doutPin; uint8_t frame_num; uint8_t rate_multiplier; + size_t _buffers; + size_t _bufferWords; +#ifdef ESP32 + i2s_chan_handle_t _tx_handle; +#endif + }; #endif // _AUDIOOUTPUTSPDIF_H diff --git a/src/AudioOutputSPIFFSWAV.cpp b/src/AudioOutputSPIFFSWAV.cpp index 44a5022c..c9c1169d 100644 --- a/src/AudioOutputSPIFFSWAV.cpp +++ b/src/AudioOutputSPIFFSWAV.cpp @@ -1,113 +1,119 @@ /* - AudioOutputSPIFFSWAV - Writes a WAV file to the SPIFFS filesystem - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputSPIFFSWAV + Writes a WAV file to the SPIFFS filesystem + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +#if !defined(ARDUINO_ARCH_RP2040) + #include #include #ifdef ESP32 #include "SPIFFS.h" #endif +// Yes, I know SPIFFS is deprecated +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + + #include "AudioOutputSPIFFSWAV.h" static const uint8_t wavHeaderTemplate[] PROGMEM = { // Hardcoded simple WAV header with 0xffffffff lengths all around 0x52, 0x49, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x22, 0x56, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, - 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff }; + 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff +}; -void AudioOutputSPIFFSWAV::SetFilename(const char *name) -{ - if (filename) free(filename); - filename = strdup(name); +void AudioOutputSPIFFSWAV::SetFilename(const char *name) { + if (filename) { + free(filename); + } + filename = strdup(name); } -bool AudioOutputSPIFFSWAV::begin() -{ - uint8_t wavHeader[sizeof(wavHeaderTemplate)]; - memset(wavHeader, 0, sizeof(wavHeader)); - - if (f) return false; // Already open! - SPIFFS.remove(filename); - f = SPIFFS.open(filename, "w+"); - if (!f) return false; - - // We'll fix the header up when we close the file - f.write(wavHeader, sizeof(wavHeader)); - return true; +bool AudioOutputSPIFFSWAV::begin() { + uint8_t wavHeader[sizeof(wavHeaderTemplate)]; + memset(wavHeader, 0, sizeof(wavHeader)); + + if (f) { + return false; // Already open! + } + SPIFFS.remove(filename); + f = SPIFFS.open(filename, "w+"); + if (!f) { + return false; + } + + // We'll fix the header up when we close the file + f.write(wavHeader, sizeof(wavHeader)); + return true; } -bool AudioOutputSPIFFSWAV::ConsumeSample(int16_t sample[2]) -{ - for (int i=0; i> 8) & 0xff; - f.write(&l, sizeof(l)); - f.write(&h, sizeof(h)); +bool AudioOutputSPIFFSWAV::ConsumeSample(int16_t sample[2]) { + for (int i = 0; i < channels; i++) { + uint8_t l = sample[i] & 0xff; + uint8_t h = (sample[i] >> 8) & 0xff; + f.write(&l, sizeof(l)); + f.write(&h, sizeof(h)); } - } - return true; + return true; } -bool AudioOutputSPIFFSWAV::stop() -{ - uint8_t wavHeader[sizeof(wavHeaderTemplate)]; - - memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); - - int chunksize = f.size() - 8; - wavHeader[4] = chunksize & 0xff; - wavHeader[5] = (chunksize>>8)&0xff; - wavHeader[6] = (chunksize>>16)&0xff; - wavHeader[7] = (chunksize>>24)&0xff; - - wavHeader[22] = channels & 0xff; - wavHeader[23] = 0; - - wavHeader[24] = hertz & 0xff; - wavHeader[25] = (hertz >> 8) & 0xff; - wavHeader[26] = (hertz >> 16) & 0xff; - wavHeader[27] = (hertz >> 24) & 0xff; - int byteRate = hertz * bps * channels / 8; - wavHeader[28] = byteRate & 0xff; - wavHeader[29] = (byteRate >> 8) & 0xff; - wavHeader[30] = (byteRate >> 16) & 0xff; - wavHeader[31] = (byteRate >> 24) & 0xff; - wavHeader[32] = channels * bps / 8; - wavHeader[33] = 0; - wavHeader[34] = bps; - wavHeader[35] = 0; - - int datasize = f.size() - sizeof(wavHeader); - wavHeader[40] = datasize & 0xff; - wavHeader[41] = (datasize>>8)&0xff; - wavHeader[42] = (datasize>>16)&0xff; - wavHeader[43] = (datasize>>24)&0xff; - - // Write real header out - f.seek(0, SeekSet); - f.write(wavHeader, sizeof(wavHeader)); - f.close(); - return true; +bool AudioOutputSPIFFSWAV::stop() { + uint8_t wavHeader[sizeof(wavHeaderTemplate)]; + + memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); + + int chunksize = f.size() - 8; + wavHeader[4] = chunksize & 0xff; + wavHeader[5] = (chunksize >> 8) & 0xff; + wavHeader[6] = (chunksize >> 16) & 0xff; + wavHeader[7] = (chunksize >> 24) & 0xff; + + wavHeader[22] = channels & 0xff; + wavHeader[23] = 0; + + wavHeader[24] = hertz & 0xff; + wavHeader[25] = (hertz >> 8) & 0xff; + wavHeader[26] = (hertz >> 16) & 0xff; + wavHeader[27] = (hertz >> 24) & 0xff; + int byteRate = hertz * 16 * channels / 8; + wavHeader[28] = byteRate & 0xff; + wavHeader[29] = (byteRate >> 8) & 0xff; + wavHeader[30] = (byteRate >> 16) & 0xff; + wavHeader[31] = (byteRate >> 24) & 0xff; + wavHeader[32] = channels * 16 / 8; + wavHeader[33] = 0; + wavHeader[34] = 16; + wavHeader[35] = 0; + + int datasize = f.size() - sizeof(wavHeader); + wavHeader[40] = datasize & 0xff; + wavHeader[41] = (datasize >> 8) & 0xff; + wavHeader[42] = (datasize >> 16) & 0xff; + wavHeader[43] = (datasize >> 24) & 0xff; + + // Write real header out + f.seek(0, SeekSet); + f.write(wavHeader, sizeof(wavHeader)); + f.close(); + return true; } - + + +#endif diff --git a/src/AudioOutputSPIFFSWAV.h b/src/AudioOutputSPIFFSWAV.h index 4a2afaf4..93fc90a6 100644 --- a/src/AudioOutputSPIFFSWAV.h +++ b/src/AudioOutputSPIFFSWAV.h @@ -1,45 +1,51 @@ /* - AudioOutputSPIFFSWAV - Writes a WAV file to the SPIFFS filesystem - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputSPIFFSWAV + Writes a WAV file to the SPIFFS filesystem + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTSPIFFSWAV_H #define _AUDIOOUTPUTSPIFFSWAV_H +#if !defined(ARDUINO_ARCH_RP2040) + #include #include #include "AudioOutput.h" -class AudioOutputSPIFFSWAV : public AudioOutput -{ - public: - AudioOutputSPIFFSWAV() { filename = NULL; }; - ~AudioOutputSPIFFSWAV() { free(filename); }; +class AudioOutputSPIFFSWAV : public AudioOutput { +public: + AudioOutputSPIFFSWAV() { + filename = NULL; + }; + ~AudioOutputSPIFFSWAV() { + free(filename); + }; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; void SetFilename(const char *name); - private: +private: File f; char *filename; }; #endif +#endif diff --git a/src/AudioOutputSTDIO.cpp b/src/AudioOutputSTDIO.cpp index 33bbd34f..9503e2ea 100644 --- a/src/AudioOutputSTDIO.cpp +++ b/src/AudioOutputSTDIO.cpp @@ -1,22 +1,22 @@ /* - AudioOutputSTDIO - Writes a WAV file to the STDIO filesystem - Only for host-based testing + AudioOutputSTDIO + Writes a WAV file to the STDIO filesystem + Only for host-based testing - Copyright (C) 2017 Earle F. Philhower, III + Copyright (C) 2017 Earle F. Philhower, III - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include @@ -29,87 +29,88 @@ static const uint8_t wavHeaderTemplate[] PROGMEM = { // Hardcoded simple WAV header with 0xffffffff lengths all around 0x52, 0x49, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x22, 0x56, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, - 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff }; + 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff +}; -void AudioOutputSTDIO::SetFilename(const char *name) -{ - free(filename); - filename = strdup(name); +void AudioOutputSTDIO::SetFilename(const char *name) { + free(filename); + filename = strdup(name); } -bool AudioOutputSTDIO::begin() -{ - uint8_t wavHeader[sizeof(wavHeaderTemplate)]; - memset(wavHeader, 0, sizeof(wavHeader)); - - if (f) return false; // Already open! - unlink(filename); - f = fopen(filename, "wb+"); - if (!f) return false; - - // We'll fix the header up when we close the file - fwrite(wavHeader, sizeof(wavHeader), 1, f); - return true; +bool AudioOutputSTDIO::begin() { + uint8_t wavHeader[sizeof(wavHeaderTemplate)]; + memset(wavHeader, 0, sizeof(wavHeader)); + + if (f) { + return false; // Already open! + } + unlink(filename); + f = fopen(filename, "wb+"); + if (!f) { + return false; + } + + // We'll fix the header up when we close the file + fwrite(wavHeader, sizeof(wavHeader), 1, f); + return true; } -bool AudioOutputSTDIO::ConsumeSample(int16_t sample[2]) -{ - for (int i=0; i> 8) & 0xff; - fwrite(&l, sizeof(l), 1, f); - fwrite(&h, sizeof(h), 1, f); +bool AudioOutputSTDIO::ConsumeSample(int16_t sample[2]) { + static int avail = 100; + if (!(--avail)) { + avail = 100; + return false; + } + for (int i = 0; i < channels; i++) { + uint8_t l = sample[i] & 0xff; + uint8_t h = (sample[i] >> 8) & 0xff; + fwrite(&l, sizeof(l), 1, f); + fwrite(&h, sizeof(h), 1, f); } - } - return true; + return true; } -bool AudioOutputSTDIO::stop() -{ - uint8_t wavHeader[sizeof(wavHeaderTemplate)]; - - memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); - - int chunksize = ftell(f) - 8; - wavHeader[4] = chunksize & 0xff; - wavHeader[5] = (chunksize>>8)&0xff; - wavHeader[6] = (chunksize>>16)&0xff; - wavHeader[7] = (chunksize>>24)&0xff; - - wavHeader[22] = channels & 0xff; - wavHeader[23] = 0; - - wavHeader[24] = hertz & 0xff; - wavHeader[25] = (hertz >> 8) & 0xff; - wavHeader[26] = (hertz >> 16) & 0xff; - wavHeader[27] = (hertz >> 24) & 0xff; - int byteRate = hertz * bps * channels / 8; - wavHeader[28] = byteRate & 0xff; - wavHeader[29] = (byteRate >> 8) & 0xff; - wavHeader[30] = (byteRate >> 16) & 0xff; - wavHeader[31] = (byteRate >> 24) & 0xff; - wavHeader[32] = channels * bps / 8; - wavHeader[33] = 0; - wavHeader[34] = bps; - wavHeader[35] = 0; - - int datasize = ftell(f) - sizeof(wavHeader); - wavHeader[40] = datasize & 0xff; - wavHeader[41] = (datasize>>8)&0xff; - wavHeader[42] = (datasize>>16)&0xff; - wavHeader[43] = (datasize>>24)&0xff; - - // Write real header out - fseek(f, 0, SEEK_SET); - fwrite(wavHeader, sizeof(wavHeader), 1, f); - fclose(f); - return true; +bool AudioOutputSTDIO::stop() { + uint8_t wavHeader[sizeof(wavHeaderTemplate)]; + + memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); + + int chunksize = ftell(f) - 8; + wavHeader[4] = chunksize & 0xff; + wavHeader[5] = (chunksize >> 8) & 0xff; + wavHeader[6] = (chunksize >> 16) & 0xff; + wavHeader[7] = (chunksize >> 24) & 0xff; + + wavHeader[22] = channels & 0xff; + wavHeader[23] = 0; + + wavHeader[24] = hertz & 0xff; + wavHeader[25] = (hertz >> 8) & 0xff; + wavHeader[26] = (hertz >> 16) & 0xff; + wavHeader[27] = (hertz >> 24) & 0xff; + int byteRate = hertz * 16 * channels / 8; + wavHeader[28] = byteRate & 0xff; + wavHeader[29] = (byteRate >> 8) & 0xff; + wavHeader[30] = (byteRate >> 16) & 0xff; + wavHeader[31] = (byteRate >> 24) & 0xff; + wavHeader[32] = channels * 16 / 8; + wavHeader[33] = 0; + wavHeader[34] = 16; + wavHeader[35] = 0; + + int datasize = ftell(f) - sizeof(wavHeader); + wavHeader[40] = datasize & 0xff; + wavHeader[41] = (datasize >> 8) & 0xff; + wavHeader[42] = (datasize >> 16) & 0xff; + wavHeader[43] = (datasize >> 24) & 0xff; + + // Write real header out + fseek(f, 0, SEEK_SET); + fwrite(wavHeader, sizeof(wavHeader), 1, f); + fclose(f); + return true; } #endif - + diff --git a/src/AudioOutputSTDIO.h b/src/AudioOutputSTDIO.h index f5a10288..86149eec 100644 --- a/src/AudioOutputSTDIO.h +++ b/src/AudioOutputSTDIO.h @@ -1,22 +1,22 @@ /* - AudioOutputSTDIO - Writes a WAV file to the STDIO filesystem - Only for host-based testing + AudioOutputSTDIO + Writes a WAV file to the STDIO filesystem + Only for host-based testing - Copyright (C) 2017 Earle F. Philhower, III + Copyright (C) 2017 Earle F. Philhower, III - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTSTDIO_H @@ -27,17 +27,21 @@ #include "AudioOutput.h" -class AudioOutputSTDIO : public AudioOutput -{ - public: - AudioOutputSTDIO() { filename = NULL; f = NULL; }; - ~AudioOutputSTDIO() { free(filename); }; +class AudioOutputSTDIO : public AudioOutput { +public: + AudioOutputSTDIO() { + filename = NULL; + f = NULL; + }; + ~AudioOutputSTDIO() { + free(filename); + }; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; void SetFilename(const char *name); - private: +private: FILE *f; char *filename; }; diff --git a/src/AudioOutputSerialWAV.cpp b/src/AudioOutputSerialWAV.cpp index 458860fb..a70f1b7c 100644 --- a/src/AudioOutputSerialWAV.cpp +++ b/src/AudioOutputSerialWAV.cpp @@ -1,21 +1,21 @@ /* - AudioOutputSerialWAV - Writes a mostly correct WAV file to the serial port - - Copyright (C) 2017 Earle F. Philhower, III + AudioOutputSerialWAV + Writes a mostly correct WAV file to the serial port - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Copyright (C) 2017 Earle F. Philhower, III - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "AudioOutputSerialWAV.h" @@ -23,56 +23,48 @@ static const uint8_t wavHeaderTemplate[] PROGMEM = { // Hardcoded simple WAV header with 0xffffffff lengths all around 0x52, 0x49, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x22, 0x56, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, - 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff }; + 0x64, 0x61, 0x74, 0x61, 0xff, 0xff, 0xff, 0xff +}; -bool AudioOutputSerialWAV::begin() -{ - uint8_t wavHeader[sizeof(wavHeaderTemplate)]; - memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); - wavHeader[22] = channels & 0xff; - wavHeader[23] = 0; - wavHeader[24] = hertz & 0xff; - wavHeader[25] = (hertz >> 8) & 0xff; - wavHeader[26] = (hertz >> 16) & 0xff; - wavHeader[27] = (hertz >> 24) & 0xff; - int byteRate = hertz * bps * channels / 8; - wavHeader[28] = byteRate & 0xff; - wavHeader[29] = (byteRate >> 8) & 0xff; - wavHeader[30] = (byteRate >> 16) & 0xff; - wavHeader[31] = (byteRate >> 24) & 0xff; - wavHeader[32] = channels * bps / 8; - wavHeader[33] = 0; - wavHeader[34] = bps; - wavHeader[35] = 0; - Serial.write(wavHeader, sizeof(wavHeader)); - count = 0; - return true; +bool AudioOutputSerialWAV::begin() { + uint8_t wavHeader[sizeof(wavHeaderTemplate)]; + memcpy_P(wavHeader, wavHeaderTemplate, sizeof(wavHeaderTemplate)); + wavHeader[22] = channels & 0xff; + wavHeader[23] = 0; + wavHeader[24] = hertz & 0xff; + wavHeader[25] = (hertz >> 8) & 0xff; + wavHeader[26] = (hertz >> 16) & 0xff; + wavHeader[27] = (hertz >> 24) & 0xff; + int byteRate = hertz * 16 * channels / 8; + wavHeader[28] = byteRate & 0xff; + wavHeader[29] = (byteRate >> 8) & 0xff; + wavHeader[30] = (byteRate >> 16) & 0xff; + wavHeader[31] = (byteRate >> 24) & 0xff; + wavHeader[32] = channels * 16 / 8; + wavHeader[33] = 0; + wavHeader[34] = 16; + wavHeader[35] = 0; + Serial.write(wavHeader, sizeof(wavHeader)); + count = 0; + return true; } -bool AudioOutputSerialWAV::ConsumeSample(int16_t sample[2]) -{ - if (++count == 200) { - count = 0; - return false; - } - for (int i=0; i> 8) & 0xff; - Serial.write(l); - Serial.write(h); +bool AudioOutputSerialWAV::ConsumeSample(int16_t sample[2]) { + if (++count == 200) { + count = 0; + return false; + } + for (int i = 0; i < channels; i++) { + uint8_t l = sample[i] & 0xff; + uint8_t h = (sample[i] >> 8) & 0xff; + Serial.write(l); + Serial.write(h); } - } - return true; + return true; } -bool AudioOutputSerialWAV::stop() -{ - audioLogger->printf_P(PSTR("\n\n\nEOF\n\n\n")); - return true; +bool AudioOutputSerialWAV::stop() { + audioLogger->printf_P(PSTR("\n\n\nEOF\n\n\n")); + return true; } - diff --git a/src/AudioOutputSerialWAV.h b/src/AudioOutputSerialWAV.h index 5e26bbba..1aa027d6 100644 --- a/src/AudioOutputSerialWAV.h +++ b/src/AudioOutputSerialWAV.h @@ -1,21 +1,21 @@ /* - AudioOutputSerialWAV - Writes a mostly correct WAV file to the serial port - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioOutputSerialWAV + Writes a mostly correct WAV file to the serial port + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOOUTPUTSERIALWAV_H @@ -23,15 +23,14 @@ #include "AudioOutput.h" -class AudioOutputSerialWAV : public AudioOutput -{ - public: +class AudioOutputSerialWAV : public AudioOutput { +public: AudioOutputSerialWAV() {}; ~AudioOutputSerialWAV() {}; virtual bool begin() override; virtual bool ConsumeSample(int16_t sample[2]) override; virtual bool stop() override; - private: +private: int count; }; diff --git a/src/AudioOutputULP.cpp b/src/AudioOutputULP.cpp new file mode 100644 index 00000000..b4cef8ff --- /dev/null +++ b/src/AudioOutputULP.cpp @@ -0,0 +1,280 @@ +/* + AudioOutputULP + Outputs to ESP32 DAC through the ULP, freeing I2S for other uses + + Copyright (C) 2020 Martin Laclaustra, based on bitluni's code + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#if defined(ESP32) && SOC_DAC_SUPPORTED + +#include "AudioOutputULP.h" + +#include +#include +#include +#include +#include +#include + +uint32_t create_I_WR_REG(uint32_t reg, uint32_t low_bit, uint32_t high_bit, uint32_t val) { + typedef union { + ulp_insn_t ulp_ins; + uint32_t ulp_bin; + } ulp_union; + const ulp_insn_t singleinstruction[] = {I_WR_REG(reg, low_bit, high_bit, val)}; + ulp_union recover_ins; + recover_ins.ulp_ins = singleinstruction[0]; + return (uint32_t)(recover_ins.ulp_bin); +} + +uint32_t create_I_BXI(uint32_t imm_pc) { + typedef union { + ulp_insn_t ulp_ins; + uint32_t ulp_bin; + } ulp_union; + const ulp_insn_t singleinstruction[] = {I_BXI(imm_pc)}; + ulp_union recover_ins; + recover_ins.ulp_ins = singleinstruction[0]; + return (uint32_t)(recover_ins.ulp_bin); +} + +bool AudioOutputULP::begin() { + if (!stereoOutput) { + waitingOddSample = false; + //totalSampleWords += 512; + //dacTableStart2 = dacTableStart1; + } + + //calculate the actual ULP clock + unsigned long rtc_8md256_period = rtc_clk_cal(RTC_CAL_8MD256, 1000); + // If that failed, (return 0) then we need to wait for calibration to happen... + while (!rtc_8md256_period) { + delay(20); // Don't hog the CPU + rtc_8md256_period = rtc_clk_cal(RTC_CAL_8MD256, 1000); + } + unsigned long rtc_fast_freq_hz = 1000000ULL * (1 << RTC_CLK_CAL_FRACT) * 256 / rtc_8md256_period; + + //initialize DACs + dac_oneshot_handle_t d0; + dac_oneshot_handle_t d1; + + if (activeDACs & 1) { + dac_oneshot_config_t a = { DAC_CHAN_0 }; + assert(ESP_OK == dac_oneshot_new_channel(&a, &d0)); + dac_oneshot_output_voltage(d0, 128); + } + if (activeDACs & 2) { + dac_oneshot_config_t b = { DAC_CHAN_1 }; + assert(ESP_OK == dac_oneshot_new_channel(&b, &d1)); + dac_oneshot_output_voltage(d1, 128); + } + + int retAddress1 = 9; + int retAddress2 = 14; + + int loopCycles = 134; + int loopHalfCycles1 = 90; + int loopHalfCycles2 = 44; + + Serial.print("Real RTC clock: "); + Serial.println(rtc_fast_freq_hz); + + uint32_t dt = (rtc_fast_freq_hz / hertz) - loopCycles; + uint32_t dt2 = 0; + if (!stereoOutput) { + dt = (rtc_fast_freq_hz / hertz) - loopHalfCycles1; + dt2 = (rtc_fast_freq_hz / hertz) - loopHalfCycles2; + } + + Serial.print("dt: "); + Serial.println(dt); + + Serial.print("dt2: "); + Serial.println(dt2); + + const ulp_insn_t stereo[] = { + //reset offset register + I_MOVI(R3, 0), + //delay to get the right sampling rate + I_DELAY(dt), // 6 + dt + //reset sample index + I_MOVI(R0, 0), // 6 + //write the index back to memory for the main cpu + I_ST(R0, R3, indexAddress), // 8 + //load the samples + I_LD(R1, R0, bufferStart), // 8 + //mask the lower 8 bits + I_ANDI(R2, R1, 0x00ff), // 6 + //multiply by 2 + I_LSHI(R2, R2, 1), // 6 + //add start position + I_ADDI(R2, R2, dacTableStart1),// 6 + //jump to the dac opcode + I_BXR(R2), // 4 + //back from first dac + //delay between the two samples in mono rendering + I_DELAY(dt2), // 6 + dt2 + //mask the upper 8 bits + I_ANDI(R2, R1, 0xff00), // 6 + //shift the upper bits to right and multiply by 2 + I_RSHI(R2, R2, 8 - 1), // 6 + //add start position of second dac table + I_ADDI(R2, R2, dacTableStart2),// 6 + //jump to the dac opcode + I_BXR(R2), // 4 + //here we get back from writing the second sample + //load 0x8080 as sample + I_MOVI(R1, 0x8080), // 6 + //write 0x8080 in the sample buffer + I_ST(R1, R0, indexAddress), // 8 + //increment the sample index + I_ADDI(R0, R0, 1), // 6 + //if reached end of the buffer, jump relative to index reset + I_BGE(-16, totalSampleWords), // 4 + //wait to get the right sample rate (2 cycles more to compensate the index reset) + I_DELAY((unsigned int)dt + 2), // 8 + dt + //if not, jump absolute to where index is written to memory + I_BXI(3) // 4 + }; + // write io and jump back another 12 + 4 + 12 + 4 + + size_t load_addr = 0; + size_t size = sizeof(stereo) / sizeof(ulp_insn_t); + ulp_process_macros_and_load(load_addr, stereo, &size); + // this is how to get the opcodes + // for(int i = 0; i < size; i++) + // Serial.println(RTC_SLOW_MEM[i], HEX); + + //create DAC opcode tables + switch (activeDACs) { + case 1: + for (int i = 0; i < 256; i++) { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG, 19, 26, i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG, 19, 26, i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + case 2: + for (int i = 0; i < 256; i++) { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC2_REG, 19, 26, i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC2_REG, 19, 26, i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + case 3: + for (int i = 0; i < 256; i++) { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG, 19, 26, i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC2_REG, 19, 26, i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + } + + //set all samples to 128 (silence) + for (int i = 0; i < totalSampleWords; i++) { + RTC_SLOW_MEM[bufferStart + i] = 0x8080; + } + + //start + RTC_SLOW_MEM[indexAddress] = 0; + ulp_run(0); + + //wait until ULP starts using samples and the index of output sample advances + while (RTC_SLOW_MEM[indexAddress] == 0) { + delay(1); + } + + return true; +} + +bool AudioOutputULP::ConsumeSample(int16_t sample[2]) { + int16_t ms[2]; + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16(ms); + + // TODO: needs improvement (counting is different here with respect to ULP code) + int currentSample = RTC_SLOW_MEM[indexAddress] & 0xffff; + int currentWord = currentSample >> 1; + + for (int i = 0; i < 2; i++) { + ms[i] = ((ms[i] >> 8) + 128) & 0xff; + } + if (!stereoOutput) { // mix both channels + ms[0] = (uint16_t)(((uint32_t)((int32_t)(ms[0]) + (int32_t)(ms[1])) >> 1) & 0xff); + } + + if (waitingOddSample) { // always true for stereo because samples are consumed in pairs + if (lastFilledWord != currentWord) { // accept sample if writing index lastFilledWord has not reached index of output sample + unsigned int w; + if (stereoOutput) { + w = ms[0]; + w |= ms[1] << 8; + } else { + w = bufferedOddSample; + w |= ms[0] << 8; + bufferedOddSample = 128; + waitingOddSample = false; + } + RTC_SLOW_MEM[bufferStart + lastFilledWord] = w; + lastFilledWord++; + if (lastFilledWord == totalSampleWords) { + lastFilledWord = 0; + } + return true; + } else { + return false; + } + } else { + bufferedOddSample = ms[0]; + waitingOddSample = true; + return true; + } +} + + +bool AudioOutputULP::stop() { + audioLogger->printf_P(PSTR("\n\n\nstop\n\n\n")); + const ulp_insn_t stopulp[] = { + //stop the timer + I_END(), + //end the program + I_HALT() + }; + + size_t load_addr = 0; + size_t size = sizeof(stopulp) / sizeof(ulp_insn_t); + ulp_process_macros_and_load(load_addr, stopulp, &size); + + //start + ulp_run(0); + + if (activeDACs & 1) { + dac_oneshot_output_voltage(d0, 128); + dac_oneshot_del_channel(d0); + } + if (activeDACs & 2) { + dac_oneshot_output_voltage(d1, 128); + dac_oneshot_del_channel(d1); + } + + return true; +} + +#endif diff --git a/src/AudioOutputULP.h b/src/AudioOutputULP.h new file mode 100644 index 00000000..ac330bc7 --- /dev/null +++ b/src/AudioOutputULP.h @@ -0,0 +1,73 @@ +/* + AudioOutputULP + Outputs to ESP32 DAC through the ULP, freeing I2S for other uses + + Copyright (C) 2020 Martin Laclaustra, based on bitluni's code + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Instructions: +// AudioOutputULP out = new AudioOutputULP(); // stereo +// Connect left channel on pin 25 +// Connect right channel on pin 26 +// OR +// Connect mono channel on either of them (stereo samples are downmixed) +// AudioOutputULP out = new AudioOutputULP(1); // mono, only DAC 1 +// OR +// AudioOutputULP out = new AudioOutputULP(2); // mono, only DAC 2 + + +#ifndef _AUDIOOUTPUTULP_H +#define _AUDIOOUTPUTULP_H + +#include "AudioOutput.h" + +#if defined(ESP32) && SOC_DAC_SUPPORTED + +#include + +class AudioOutputULP : public AudioOutput { +public: + AudioOutputULP(int argActiveDACs = 3) { + if (argActiveDACs < 1 || argActiveDACs > 2) { + argActiveDACs = 3; + } activeDACs = argActiveDACs; + stereoOutput = activeDACs == 3; + }; + ~AudioOutputULP() {}; + virtual bool begin() override; + virtual bool ConsumeSample(int16_t sample[2]) override; + virtual bool stop() override; + enum : int { DAC1 = 1, DAC2 = 2 }; +private: + int lastFilledWord = 0; + uint8_t bufferedOddSample = 128; + bool waitingOddSample = true; // must be set to false for mono output + int activeDACs = 3; // 1:DAC1; 2:DAC2; 3:both; + dac_oneshot_handle_t d0; + dac_oneshot_handle_t d1; + bool stereoOutput = true; + const int opcodeCount = 20; + const uint32_t dacTableStart1 = 2048 - 512; + const uint32_t dacTableStart2 = dacTableStart1 - 512; + uint32_t totalSampleWords = 2048 - 512 - 512 - (opcodeCount + 1); // add 512 for mono + const int totalSamples = totalSampleWords * 2; + const uint32_t indexAddress = opcodeCount; + const uint32_t bufferStart = indexAddress + 1; +}; + +#endif + +#endif diff --git a/src/AudioStatus.h b/src/AudioStatus.h index 62e663f2..ac9723f0 100644 --- a/src/AudioStatus.h +++ b/src/AudioStatus.h @@ -1,21 +1,21 @@ /* - AudioStatus - Base class for Audio* status/metadata reporting - - Copyright (C) 2017 Earle F. Philhower, III - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + AudioStatus + Base class for Audio* status/metadata reporting + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef _AUDIOSTATUS_H @@ -25,28 +25,48 @@ #include "AudioLogger.h" -class AudioStatus -{ - public: - AudioStatus() { ClearCBs(); }; +class AudioStatus { +public: + AudioStatus() { + ClearCBs(); + }; virtual ~AudioStatus() {}; - void ClearCBs() { mdFn = NULL; stFn = NULL; }; + void ClearCBs() { + mdFn = NULL; + stFn = NULL; + }; typedef void (*metadataCBFn)(void *cbData, const char *type, bool isUnicode, const char *str); - bool RegisterMetadataCB(metadataCBFn f, void *cbData) { mdFn = f; mdData = cbData; return true; } + bool RegisterMetadataCB(metadataCBFn f, void *cbData) { + mdFn = f; + mdData = cbData; + return true; + } // Returns a unique warning/error code, varying by the object. The string may be a PSTR, use _P functions! typedef void (*statusCBFn)(void *cbData, int code, const char *string); - bool RegisterStatusCB(statusCBFn f, void *cbData) { stFn = f; stData = cbData; return true; } + bool RegisterStatusCB(statusCBFn f, void *cbData) { + stFn = f; + stData = cbData; + return true; + } // Safely call the md function, if defined - inline void md(const char *type, bool isUnicode, const char *string) { if (mdFn) mdFn(mdData, type, isUnicode, string); } + inline void md(const char *type, bool isUnicode, const char *string) { + if (mdFn) { + mdFn(mdData, type, isUnicode, string); + } + } // Safely call the st function, if defined - inline void st(int code, const char *string) { if (stFn) stFn(stData, code, string); } + inline void st(int code, const char *string) { + if (stFn) { + stFn(stData, code, string); + } + } - private: +private: metadataCBFn mdFn; void *mdData; statusCBFn stFn; diff --git a/src/ESP8266Audio.h b/src/ESP8266Audio.h new file mode 100644 index 00000000..c9657556 --- /dev/null +++ b/src/ESP8266Audio.h @@ -0,0 +1,53 @@ +// Lazy "include all the things" header for simplicity. +// In general a user should only include the specific headers they need +// to miniimize build times. + +#include "ESP8266AudioVer.h" + +// Input stage +#include "AudioFileSourceBuffer.h" +#include "AudioFileSourceFATFS.h" +#include "AudioFileSourceFS.h" +#include "AudioFileSource.h" +#include "AudioFileSourceHTTPStream.h" +#include "AudioFileSourceICYStream.h" +#include "AudioFileSourceID3.h" +#include "AudioFileSourceLittleFS.h" +#include "AudioFileSourcePROGMEM.h" +#include "AudioFileSourceSD.h" +#include "AudioFileSourceSPIFFS.h" +#include "AudioFileSourceSPIRAMBuffer.h" +#include "AudioFileSourceSTDIO.h" + +// Misc. plumbing +#include "AudioFileStream.h" +#include "AudioLogger.h" +#include "AudioStatus.h" + +// Actual decode/audio generation logic +#include "AudioGeneratorAAC.h" +#include "AudioGeneratorFLAC.h" +#include "AudioGenerator.h" +#include "AudioGeneratorMIDI.h" +#include "AudioGeneratorMOD.h" +#include "AudioGeneratorMP3a.h" +#include "AudioGeneratorMP3.h" +#include "AudioGeneratorOpus.h" +#include "AudioGeneratorRTTTL.h" +#include "AudioGeneratorTalkie.h" +#include "AudioGeneratorWAV.h" + +// Render(output) sounds +#include "AudioOutputBuffer.h" +#include "AudioOutputFilterDecimate.h" +#include "AudioOutput.h" +#include "AudioOutputI2S.h" +#include "AudioOutputI2SNoDAC.h" +#include "AudioOutputPWM.h" +#include "AudioOutputMixer.h" +#include "AudioOutputNull.h" +#include "AudioOutputSerialWAV.h" +#include "AudioOutputSPDIF.h" +#include "AudioOutputSPIFFSWAV.h" +#include "AudioOutputSTDIO.h" +#include "AudioOutputULP.h" diff --git a/src/ESP8266AudioVer.h b/src/ESP8266AudioVer.h new file mode 100644 index 00000000..08aef2fe --- /dev/null +++ b/src/ESP8266AudioVer.h @@ -0,0 +1,5 @@ +#pragma once +#define ESP8266AUDIO_MAJOR 2 +#define ESP8266AUDIO_MINOR 4 +#define ESP8266AUDIO_REVISION 1 +#define ESP8266AUDIO_VERSION_STR "2.4.1" diff --git a/src/driver/SinglePinI2SDriver.cpp b/src/driver/SinglePinI2SDriver.cpp index 3d08efaf..243fc59f 100644 --- a/src/driver/SinglePinI2SDriver.cpp +++ b/src/driver/SinglePinI2SDriver.cpp @@ -1,283 +1,290 @@ /* - SinglePinI2SDriver - ESP8266Audio I2S Minimal driver - - Most of this code is taken and reworked from ESP8266 Arduino core, - which itsef is reworked from Espessif's I2S examples. - Original code is licensed under LGPL 2.1 or above - - Reasons for rewrite: - - Non-configurable size of DMA buffers - - We only need GPIO3 connected to I2SO_DATA - - No API to queue data from ISR. Callbacks are unusable - as i2s_write_* functions are not in IRAM and may re-enable + SinglePinI2SDriver + ESP8266Audio I2S Minimal driver + + Most of this code is taken and reworked from ESP8266 Arduino core, + which itself is reworked from Espessif's I2S examples. + Original code is licensed under LGPL 2.1 or above + + Reasons for rewrite: + - Non-configurable size of DMA buffers + - We only need GPIO3 connected to I2SO_DATA + - No API to queue data from ISR. Callbacks are unusable + as i2s_write_* functions are not in IRAM and may re-enable SLC interrupt before returning - - ISR overhead is not needed + - ISR overhead is not needed - Copyright (C) 2020 Ivan Kostoski + Copyright (C) 2020 Ivan Kostoski - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if defined(ESP8266) #include "SinglePinI2SDriver.h" -SinglePinI2SDriver::~SinglePinI2SDriver() -{ - stopI2S(); - freeBuffers(bufCount); +SinglePinI2SDriver::~SinglePinI2SDriver() { + stopI2S(); + freeBuffers(bufCount); } -bool SinglePinI2SDriver::begin(uint8_t bufCount, uint16_t bufSize) -{ - if (bufCount < 4) return false; - if ((bufSize < 32) || (bufSize > 1020) || ((bufSize % 4) != 0)) return false; - - stopSLC(); - - if ((bufCount != this->bufCount) || (bufSize != this->bufSize)) freeBuffers(this->bufCount); - this->bufCount = bufCount; - this->bufSize = bufSize; - if (!allocateBuffers()) return false; - - zeroBuffers(); - configureSLC(); - startI2S(); - - // Send out at least one buffer, so we have valid address of - // finished descriptor in SLCRXEDA - head = &descriptors[0]; - head->owner = 1; - startSLC(); - while (!lastSentDescriptor()) delayMicroseconds(1); - // By here, SLC should be stalled (next descriptor owner is 0) - head->owner = 0; - head = head->next_link_ptr; - headPos = 0; - underflowCount = -1; - return true; +bool SinglePinI2SDriver::begin(uint8_t bufCount, uint16_t bufSize) { + if (bufCount < 4) { + return false; + } + if ((bufSize < 32) || (bufSize > 1020) || ((bufSize % 4) != 0)) { + return false; + } + + stopSLC(); + + if ((bufCount != this->bufCount) || (bufSize != this->bufSize)) { + freeBuffers(this->bufCount); + } + this->bufCount = bufCount; + this->bufSize = bufSize; + if (!allocateBuffers()) { + return false; + } + + zeroBuffers(); + configureSLC(); + startI2S(); + + // Send out at least one buffer, so we have valid address of + // finished descriptor in SLCRXEDA + head = &descriptors[0]; + head->owner = 1; + startSLC(); + while (!lastSentDescriptor()) { + delayMicroseconds(1); + } + // By here, SLC should be stalled (next descriptor owner is 0) + head->owner = 0; + head = head->next_link_ptr; + headPos = 0; + underflowCount = -1; + return true; }; -void SinglePinI2SDriver::stop() -{ - stopI2S(); +void SinglePinI2SDriver::stop() { + stopI2S(); } -bool SinglePinI2SDriver::allocateBuffers() -{ - // Allocate output (RXLINK) descriptors and bufferss - if (descriptors) return true; - descriptors = (SLCDecriptor*) calloc(bufCount, sizeof(SLCDecriptor)); - if (!descriptors) return false; - int allocated; - for (allocated = 0; allocated < bufCount; allocated++) { - uint32_t* buffer = (uint32_t*)malloc(bufSize * sizeof(uint32_t)); - if (!buffer) break; - auto descriptor = &descriptors[allocated]; - descriptor->eof = 1; // Needed for SLC to update SLCRXEDA - descriptor->datalen = bufSize * sizeof(uint32_t); - descriptor->blocksize = bufSize * sizeof(uint32_t); - descriptor->buf_ptr = buffer; - descriptor->next_link_ptr = &descriptors[(allocated+1) % bufCount]; - } - // Release memory if not all buffers were allocated - if (allocated < bufCount) { - freeBuffers(allocated); - return false; - } - zeroBuffers(); - return true; +bool SinglePinI2SDriver::allocateBuffers() { + // Allocate output (RXLINK) descriptors and bufferss + if (descriptors) { + return true; + } + descriptors = (SLCDecriptor*) calloc(bufCount, sizeof(SLCDecriptor)); + if (!descriptors) { + return false; + } + int allocated; + for (allocated = 0; allocated < bufCount; allocated++) { + uint32_t* buffer = (uint32_t*)malloc(bufSize * sizeof(uint32_t)); + if (!buffer) { + break; + } + auto descriptor = &descriptors[allocated]; + descriptor->eof = 1; // Needed for SLC to update SLCRXEDA + descriptor->datalen = bufSize * sizeof(uint32_t); + descriptor->blocksize = bufSize * sizeof(uint32_t); + descriptor->buf_ptr = buffer; + descriptor->next_link_ptr = &descriptors[(allocated + 1) % bufCount]; + } + // Release memory if not all buffers were allocated + if (allocated < bufCount) { + freeBuffers(allocated); + return false; + } + zeroBuffers(); + return true; } -void SinglePinI2SDriver::freeBuffers(int allocated) -{ - if (!descriptors) return; - while (--allocated >= 0) { - if (descriptors[allocated].buf_ptr) { - free(descriptors[allocated].buf_ptr); - descriptors[allocated].buf_ptr = NULL; +void SinglePinI2SDriver::freeBuffers(int allocated) { + if (!descriptors) { + return; } - } - free(descriptors); - descriptors = NULL; + while (--allocated >= 0) { + if (descriptors[allocated].buf_ptr) { + free(descriptors[allocated].buf_ptr); + descriptors[allocated].buf_ptr = NULL; + } + } + free(descriptors); + descriptors = NULL; } -void SinglePinI2SDriver::zeroBuffers() -{ - for(int i = 0; i < bufCount; i++) { - auto descriptor = &descriptors[i]; - ets_memset((void *)descriptor->buf_ptr, 0, bufSize * sizeof(uint32_t)); - } +void SinglePinI2SDriver::zeroBuffers() { + for (int i = 0; i < bufCount; i++) { + auto descriptor = &descriptors[i]; + ets_memset((void *)descriptor->buf_ptr, 0, bufSize * sizeof(uint32_t)); + } } -inline void SinglePinI2SDriver::advanceHead(const SLCDecriptor *lastSent) -{ - if (headPos >= bufSize) { - head->owner = 1; // Owned by SLC - head = head->next_link_ptr; - head->owner = 0; // Owned by CPU - headPos = 0; - // If SLC stopped, fill-up the buffers before (re)starting - if (isSLCStopped() && (head->next_link_ptr == lastSent)) { - underflowCount++; - startSLC(); +inline void SinglePinI2SDriver::advanceHead(const SLCDecriptor *lastSent) { + if (headPos >= bufSize) { + head->owner = 1; // Owned by SLC + head = head->next_link_ptr; + head->owner = 0; // Owned by CPU + headPos = 0; + // If SLC stopped, fill-up the buffers before (re)starting + if (isSLCStopped() && (head->next_link_ptr == lastSent)) { + underflowCount++; + startSLC(); + } } - } } -bool SinglePinI2SDriver::write(uint32_t sample) -{ - auto lastSent = lastSentDescriptor(); - if (isSLCRunning() && (lastSent->next_link_ptr == head)) return false; - head->buf_ptr[headPos++] = sample; - advanceHead(lastSent); - return true; +bool SinglePinI2SDriver::write(uint32_t sample) { + auto lastSent = lastSentDescriptor(); + if (isSLCRunning() && (lastSent->next_link_ptr == head)) { + return false; + } + head->buf_ptr[headPos++] = sample; + advanceHead(lastSent); + return true; }; -bool SinglePinI2SDriver::writeInterleaved(uint32_t samples[4]) -{ - auto lastSent = lastSentDescriptor(); - if (isSLCRunning() && (lastSent->next_link_ptr == head)) return false; - uint32_t* buf = head->buf_ptr; - buf[headPos++] = samples[1]; - buf[headPos++] = samples[0]; - buf[headPos++] = samples[3]; - buf[headPos++] = samples[2]; - advanceHead(lastSent); - return true; +bool SinglePinI2SDriver::writeInterleaved(uint32_t samples[4]) { + auto lastSent = lastSentDescriptor(); + if (isSLCRunning() && (lastSent->next_link_ptr == head)) { + return false; + } + uint32_t* buf = head->buf_ptr; + buf[headPos++] = samples[1]; + buf[headPos++] = samples[0]; + buf[headPos++] = samples[3]; + buf[headPos++] = samples[2]; + advanceHead(lastSent); + return true; }; -void SinglePinI2SDriver::configureSLC() -{ - ETS_SLC_INTR_DISABLE(); - // Reset SLC, clear interrupts - SLCC0 |= SLCRXLR | SLCTXLR; - SLCC0 &= ~(SLCRXLR | SLCTXLR); - SLCIC = 0xFFFFFFFF; - // Configure SLC DMA in mode 1 - SLCC0 &= ~(SLCMM << SLCM); - SLCC0 |= (1 << SLCM); - SLCRXDC |= SLCBINR | SLCBTNR; - SLCRXDC &= ~(SLCBRXFE | SLCBRXEM | SLCBRXFM); - // RXLINK is output DMA, but TXLINK must be configured with valid descriptr - SLCTXL &= ~(SLCTXLAM << SLCTXLA); - SLCRXL &= ~(SLCRXLAM << SLCRXLA); - SLCTXL |= (uint32)&descriptors[0] << SLCTXLA; - SLCRXL |= (uint32)&descriptors[0] << SLCRXLA; - // Not setting up interrupts. Not starting DMA here +void SinglePinI2SDriver::configureSLC() { + ETS_SLC_INTR_DISABLE(); + // Reset SLC, clear interrupts + SLCC0 |= SLCRXLR | SLCTXLR; + SLCC0 &= ~(SLCRXLR | SLCTXLR); + SLCIC = 0xFFFFFFFF; + // Configure SLC DMA in mode 1 + SLCC0 &= ~(SLCMM << SLCM); + SLCC0 |= (1 << SLCM); + SLCRXDC |= SLCBINR | SLCBTNR; + SLCRXDC &= ~(SLCBRXFE | SLCBRXEM | SLCBRXFM); + // RXLINK is output DMA, but TXLINK must be configured with valid descriptr + SLCTXL &= ~(SLCTXLAM << SLCTXLA); + SLCRXL &= ~(SLCRXLAM << SLCRXLA); + SLCTXL |= (uint32)&descriptors[0] << SLCTXLA; + SLCRXL |= (uint32)&descriptors[0] << SLCRXLA; + // Not setting up interrupts. Not starting DMA here } -void SinglePinI2SDriver::stopSLC() -{ - // Stop SLC, reset descriptors and clear interrupts - ETS_SLC_INTR_DISABLE(); - SLCTXL |= SLCTXLE; - SLCRXL |= SLCRXLE; - SLCTXL &= ~(SLCTXLAM << SLCTXLA); - SLCRXL &= ~(SLCRXLAM << SLCRXLA); - SLCIC = 0xFFFFFFFF; +void SinglePinI2SDriver::stopSLC() { + // Stop SLC, reset descriptors and clear interrupts + ETS_SLC_INTR_DISABLE(); + SLCTXL |= SLCTXLE; + SLCRXL |= SLCRXLE; + SLCTXL &= ~(SLCTXLAM << SLCTXLA); + SLCRXL &= ~(SLCRXLAM << SLCRXLA); + SLCIC = 0xFFFFFFFF; } -void SinglePinI2SDriver::setDividers(uint8_t div1, uint8_t div2) -{ - // Ensure dividers fit in bit fields - div1 &= I2SBDM; - div2 &= I2SCDM; - // trans master(active low), recv master(active_low), !bits mod(==16 bits/chanel), clear clock dividers - I2SC &= ~(I2STSM | I2SRSM | (I2SBMM << I2SBM) | (I2SBDM << I2SBD) | (I2SCDM << I2SCD)); - // I2SRF = Send/recv right channel first - // I2SMR = MSB recv/xmit first - // I2SRMS, I2STMS = We don't really care about WS delay here - // div1, div2 = Set I2S WS clock frequency. BCLK seems to be generated from 32x this - I2SC |= I2SRF | I2SMR | I2SRMS | I2STMS | (div1 << I2SBD) | (div2 << I2SCD); +void SinglePinI2SDriver::setDividers(uint8_t div1, uint8_t div2) { + // Ensure dividers fit in bit fields + div1 &= I2SBDM; + div2 &= I2SCDM; + // trans master(active low), recv master(active_low), !bits mod(==16 bits/channel), clear clock dividers + I2SC &= ~(I2STSM | I2SRSM | (I2SBMM << I2SBM) | (I2SBDM << I2SBD) | (I2SCDM << I2SCD)); + // I2SRF = Send/recv right channel first + // I2SMR = MSB recv/xmit first + // I2SRMS, I2STMS = We don't really care about WS delay here + // div1, div2 = Set I2S WS clock frequency. BCLK seems to be generated from 32x this + I2SC |= I2SRF | I2SMR | I2SRMS | I2STMS | (div1 << I2SBD) | (div2 << I2SCD); } -void SinglePinI2SDriver::setRate(const uint32_t rateHz) -{ - if (rateHz == currentRate) return; - currentRate = rateHz; - - uint32_t scaledBaseFreq = I2SBASEFREQ / 32; - float bestDelta = scaledBaseFreq; - uint8_t sbdDivBest=1; - uint8_t scdDivBest=1; - for (uint8_t i = 1; i < 64; i++) { - for (uint8_t j = i; j < 64; j++) { - float delta = fabs(((float)scaledBaseFreq/i/j) - rateHz); - if (delta < bestDelta){ - bestDelta = delta; - sbdDivBest = i; - scdDivBest = j; - } +void SinglePinI2SDriver::setRate(const uint32_t rateHz) { + if (rateHz == currentRate) { + return; + } + currentRate = rateHz; + + uint32_t scaledBaseFreq = I2SBASEFREQ / 32; + float bestDelta = scaledBaseFreq; + uint8_t sbdDivBest = 1; + uint8_t scdDivBest = 1; + for (uint8_t i = 1; i < 64; i++) { + for (uint8_t j = i; j < 64; j++) { + float delta = fabs(((float)scaledBaseFreq / i / j) - rateHz); + if (delta < bestDelta) { + bestDelta = delta; + sbdDivBest = i; + scdDivBest = j; + } + } } - } - setDividers(sbdDivBest, scdDivBest); + setDividers(sbdDivBest, scdDivBest); } -float SinglePinI2SDriver::getActualRate() -{ - return (float)I2SBASEFREQ/32/((I2SC>>I2SBD) & I2SBDM)/((I2SC >> I2SCD) & I2SCDM); +float SinglePinI2SDriver::getActualRate() { + return (float)I2SBASEFREQ / 32 / ((I2SC >> I2SBD) & I2SBDM) / ((I2SC >> I2SCD) & I2SCDM); } -void SinglePinI2SDriver::startI2S() -{ - // Setup only I2S SD pin for output - pinMode(I2SO_DATA, FUNCTION_1); - I2S_CLK_ENABLE(); - // Reset I2S - I2SIC = 0x3F; - I2SIE = 0; - I2SC &= ~(I2SRST); - I2SC |= I2SRST; - I2SC &= ~(I2SRST); - // I2STXFMM, I2SRXFMM=0 => 16-bit, dual channel data - I2SFC &= ~(I2SDE | (I2STXFMM << I2STXFM) | (I2SRXFMM << I2SRXFM)); - I2SFC |= I2SDE; // Enable DMA - // I2STXCMM, I2SRXCMM=0 => Dual channel mode, RX/TX CHAN_MOD=0 - I2SCC &= ~((I2STXCMM << I2STXCM) | (I2SRXCMM << I2SRXCM)); - // Set dividers to something resonable - currentRate = 0; - setRate(44100); - // Start I2S peripheral - I2SC |= I2STXS; +void SinglePinI2SDriver::startI2S() { + // Setup only I2S SD pin for output + pinMode(I2SO_DATA, FUNCTION_1); + I2S_CLK_ENABLE(); + // Reset I2S + I2SIC = 0x3F; + I2SIE = 0; + I2SC &= ~(I2SRST); + I2SC |= I2SRST; + I2SC &= ~(I2SRST); + // I2STXFMM, I2SRXFMM=0 => 16-bit, dual channel data + I2SFC &= ~(I2SDE | (I2STXFMM << I2STXFM) | (I2SRXFMM << I2SRXFM)); + I2SFC |= I2SDE; // Enable DMA + // I2STXCMM, I2SRXCMM=0 => Dual channel mode, RX/TX CHAN_MOD=0 + I2SCC &= ~((I2STXCMM << I2STXCM) | (I2SRXCMM << I2SRXCM)); + // Set dividers to something reasonable + currentRate = 0; + setRate(44100); + // Start I2S peripheral + I2SC |= I2STXS; } -void SinglePinI2SDriver::stopI2S() -{ - // Disable any I2S send or receive - I2SC &= ~(I2STXS | I2SRXS); - // Reset I2S - I2SC &= ~(I2SRST); - I2SC |= I2SRST; - I2SC &= ~(I2SRST); - - stopSLC(); - // Reconnect RX0 ? - //pinMode(I2SO_DATA, SPECIAL); +void SinglePinI2SDriver::stopI2S() { + // Disable any I2S send or receive + I2SC &= ~(I2STXS | I2SRXS); + // Reset I2S + I2SC &= ~(I2SRST); + I2SC |= I2SRST; + I2SC &= ~(I2SRST); + + stopSLC(); + // Reconnect RX0 ? + //pinMode(I2SO_DATA, SPECIAL); } -int SinglePinI2SDriver::getUnderflowCount() -{ - int count = underflowCount; - underflowCount = 0; - return count; +int SinglePinI2SDriver::getUnderflowCount() { + int count = underflowCount; + underflowCount = 0; + return count; } // Global instance SinglePinI2SDriver I2SDriver; -#endif // defined(ESP8266) \ No newline at end of file +#endif // defined(ESP8266) diff --git a/src/driver/SinglePinI2SDriver.h b/src/driver/SinglePinI2SDriver.h index e5ad8c85..ad280bb0 100644 --- a/src/driver/SinglePinI2SDriver.h +++ b/src/driver/SinglePinI2SDriver.h @@ -1,22 +1,22 @@ /* - SinglePinI2SDriver - ESP8266Audio I2S Minimal driver + SinglePinI2SDriver + ESP8266Audio I2S Minimal driver - Copyright (C) 2020 Ivan Kostoski + Copyright (C) 2020 Ivan Kostoski - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once @@ -28,19 +28,18 @@ #include "i2s_reg.h" struct SLCDecriptor { - uint32_t blocksize : 12; - uint32_t datalen : 12; - uint32_t unused : 5; - uint32_t sub_sof : 1; - uint32_t eof : 1; - volatile uint32_t owner : 1; - uint32_t* buf_ptr; - SLCDecriptor* next_link_ptr; + uint32_t blocksize : 12; + uint32_t datalen : 12; + uint32_t unused : 5; + uint32_t sub_sof : 1; + uint32_t eof : 1; + volatile uint32_t owner : 1; + uint32_t* buf_ptr; + SLCDecriptor* next_link_ptr; }; -class SinglePinI2SDriver -{ - public: +class SinglePinI2SDriver { +public: enum : uint8_t { I2SO_DATA = 3 }; // GPIO3/RX0 SinglePinI2SDriver(): descriptors(NULL), bufCount(0), bufSize(0) {}; @@ -54,7 +53,7 @@ class SinglePinI2SDriver bool writeInterleaved(uint32_t samples[4]); int getUnderflowCount(); - protected: +protected: bool allocateBuffers(); void freeBuffers(int allocated); void zeroBuffers(); @@ -73,10 +72,19 @@ class SinglePinI2SDriver int underflowCount; // (Re)Start transmission ("TX" DMA always needed to be enabled) - static inline void startSLC() { SLCTXL |= SLCTXLS; SLCRXL |= SLCRXLS; } - static inline uint32_t isSLCRunning() { return (SLCRXS & SLCRXF); }; - static inline uint32_t isSLCStopped() { return (SLCRXS & SLCRXE); }; - static inline SLCDecriptor *lastSentDescriptor() { return (SLCDecriptor*)SLCRXEDA; } + static inline void startSLC() { + SLCTXL |= SLCTXLS; + SLCRXL |= SLCRXLS; + } + static inline uint32_t isSLCRunning() { + return (SLCRXS & SLCRXF); + }; + static inline uint32_t isSLCStopped() { + return (SLCRXS & SLCRXE); + }; + static inline SLCDecriptor *lastSentDescriptor() { + return (SLCDecriptor*)SLCRXEDA; + } }; // Global instance diff --git a/src/libflac/FLAC/assert.h b/src/libflac/FLAC/assert.h index 55b34777..3a695c5a 100644 --- a/src/libflac/FLAC/assert.h +++ b/src/libflac/FLAC/assert.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__ASSERT_H #define FLAC__ASSERT_H diff --git a/src/libflac/FLAC/callback.h b/src/libflac/FLAC/callback.h index 38e23002..a30c8058 100644 --- a/src/libflac/FLAC/callback.h +++ b/src/libflac/FLAC/callback.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2004-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__CALLBACK_H #define FLAC__CALLBACK_H @@ -37,143 +37,143 @@ #include /* for size_t */ /** \file include/FLAC/callback.h - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * See the detailed documentation for callbacks in the - * \link flac_callbacks callbacks \endlink module. - */ + + \brief + This module defines the structures for describing I/O callbacks + to the other FLAC interfaces. + + See the detailed documentation for callbacks in the + \link flac_callbacks callbacks \endlink module. +*/ /** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures - * \ingroup flac - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * The purpose of the I/O callback functions is to create a common way - * for the metadata interfaces to handle I/O. - * - * Originally the metadata interfaces required filenames as the way of - * specifying FLAC files to operate on. This is problematic in some - * environments so there is an additional option to specify a set of - * callbacks for doing I/O on the FLAC file, instead of the filename. - * - * In addition to the callbacks, a FLAC__IOHandle type is defined as an - * opaque structure for a data source. - * - * The callback function prototypes are similar (but not identical) to the - * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use - * stdio streams to implement the callbacks, you can pass fread, fwrite, and - * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or - * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle - * is required. \warning You generally CANNOT directly use fseek or ftell - * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems - * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with - * large files. You will have to find an equivalent function (e.g. ftello), - * or write a wrapper. The same is true for feof() since this is usually - * implemented as a macro, not as a function whose address can be taken. - * - * \{ - */ + \ingroup flac + + \brief + This module defines the structures for describing I/O callbacks + to the other FLAC interfaces. + + The purpose of the I/O callback functions is to create a common way + for the metadata interfaces to handle I/O. + + Originally the metadata interfaces required filenames as the way of + specifying FLAC files to operate on. This is problematic in some + environments so there is an additional option to specify a set of + callbacks for doing I/O on the FLAC file, instead of the filename. + + In addition to the callbacks, a FLAC__IOHandle type is defined as an + opaque structure for a data source. + + The callback function prototypes are similar (but not identical) to the + stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use + stdio streams to implement the callbacks, you can pass fread, fwrite, and + fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or + FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle + is required. \warning You generally CANNOT directly use fseek or ftell + for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems + these use 32-bit offsets and FLAC requires 64-bit offsets to deal with + large files. You will have to find an equivalent function (e.g. ftello), + or write a wrapper. The same is true for feof() since this is usually + implemented as a macro, not as a function whose address can be taken. + + \{ +*/ #ifdef __cplusplus extern "C" { #endif /** This is the opaque handle type used by the callbacks. Typically - * this is a \c FILE* or address of a file descriptor. - */ + this is a \c FILE* or address of a file descriptor. +*/ typedef void* FLAC__IOHandle; /** Signature for the read callback. - * The signature and semantics match POSIX fread() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the read buffer. - * \param size The size of the records to be read. - * \param nmemb The number of records to be read. - * \param handle The handle to the data source. - * \retval size_t - * The number of records read. - */ -typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + The signature and semantics match POSIX fread() implementations + and can generally be used interchangeably. + + \param ptr The address of the read buffer. + \param size The size of the records to be read. + \param nmemb The number of records to be read. + \param handle The handle to the data source. + \retval size_t + The number of records read. +*/ +typedef size_t (*FLAC__IOCallback_Read)(void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); /** Signature for the write callback. - * The signature and semantics match POSIX fwrite() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the write buffer. - * \param size The size of the records to be written. - * \param nmemb The number of records to be written. - * \param handle The handle to the data source. - * \retval size_t - * The number of records written. - */ -typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + The signature and semantics match POSIX fwrite() implementations + and can generally be used interchangeably. + + \param ptr The address of the write buffer. + \param size The size of the records to be written. + \param nmemb The number of records to be written. + \param handle The handle to the data source. + \retval size_t + The number of records written. +*/ +typedef size_t (*FLAC__IOCallback_Write)(const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); /** Signature for the seek callback. - * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \param offset The new position, relative to \a whence - * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END - * \retval int - * \c 0 on success, \c -1 on error. - */ -typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); + The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT + EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' + and 32-bits wide. + + \param handle The handle to the data source. + \param offset The new position, relative to \a whence + \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END + \retval int + \c 0 on success, \c -1 on error. +*/ +typedef int (*FLAC__IOCallback_Seek)(FLAC__IOHandle handle, FLAC__int64 offset, int whence); /** Signature for the tell callback. - * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \retval FLAC__int64 - * The current position on success, \c -1 on error. - */ -typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); + The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT + EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' + and 32-bits wide. + + \param handle The handle to the data source. + \retval FLAC__int64 + The current position on success, \c -1 on error. +*/ +typedef FLAC__int64(*FLAC__IOCallback_Tell)(FLAC__IOHandle handle); /** Signature for the EOF callback. - * The signature and semantics mostly match POSIX feof() but WATCHOUT: - * on many systems, feof() is a macro, so in this case a wrapper function - * must be provided instead. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 if not at end of file, nonzero if at end of file. - */ -typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); + The signature and semantics mostly match POSIX feof() but WATCHOUT: + on many systems, feof() is a macro, so in this case a wrapper function + must be provided instead. + + \param handle The handle to the data source. + \retval int + \c 0 if not at end of file, nonzero if at end of file. +*/ +typedef int (*FLAC__IOCallback_Eof)(FLAC__IOHandle handle); /** Signature for the close callback. - * The signature and semantics match POSIX fclose() implementations - * and can generally be used interchangeably. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 on success, \c EOF on error. - */ -typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); + The signature and semantics match POSIX fclose() implementations + and can generally be used interchangeably. + + \param handle The handle to the data source. + \retval int + \c 0 on success, \c EOF on error. +*/ +typedef int (*FLAC__IOCallback_Close)(FLAC__IOHandle handle); /** A structure for holding a set of callbacks. - * Each FLAC interface that requires a FLAC__IOCallbacks structure will - * describe which of the callbacks are required. The ones that are not - * required may be set to NULL. - * - * If the seek requirement for an interface is optional, you can signify that - * a data source is not seekable by setting the \a seek field to \c NULL. - */ + Each FLAC interface that requires a FLAC__IOCallbacks structure will + describe which of the callbacks are required. The ones that are not + required may be set to NULL. + + If the seek requirement for an interface is optional, you can signify that + a data source is not seekable by setting the \a seek field to \c NULL. +*/ typedef struct { - FLAC__IOCallback_Read read; - FLAC__IOCallback_Write write; - FLAC__IOCallback_Seek seek; - FLAC__IOCallback_Tell tell; - FLAC__IOCallback_Eof eof; - FLAC__IOCallback_Close close; + FLAC__IOCallback_Read read; + FLAC__IOCallback_Write write; + FLAC__IOCallback_Seek seek; + FLAC__IOCallback_Tell tell; + FLAC__IOCallback_Eof eof; + FLAC__IOCallback_Close close; } FLAC__IOCallbacks; /* \} */ diff --git a/src/libflac/FLAC/export.h b/src/libflac/FLAC/export.h index 3e3e7648..01c6747c 100644 --- a/src/libflac/FLAC/export.h +++ b/src/libflac/FLAC/export.h @@ -1,60 +1,60 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__EXPORT_H #define FLAC__EXPORT_H /** \file include/FLAC/export.h - * - * \brief - * This module contains \#defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * See the \link flac_export export \endlink module. - */ + + \brief + This module contains \#defines and symbols for exporting function + calls, and providing version information and compiled-in features. + + See the \link flac_export export \endlink module. +*/ /** \defgroup flac_export FLAC/export.h: export symbols - * \ingroup flac - * - * \brief - * This module contains \#defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * If you are compiling with MSVC and will link to the static library - * (libFLAC.lib) you should define FLAC__NO_DLL in your project to - * make sure the symbols are exported properly. - * - * \{ - */ + \ingroup flac + + \brief + This module contains \#defines and symbols for exporting function + calls, and providing version information and compiled-in features. + + If you are compiling with MSVC and will link to the static library + (libFLAC.lib) you should define FLAC__NO_DLL in your project to + make sure the symbols are exported properly. + + \{ +*/ #if defined(FLAC__NO_DLL) #define FLAC_API @@ -75,8 +75,8 @@ #endif /** These \#defines will mirror the libtool-based library version number, see - * http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning - */ + http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning +*/ #define FLAC_API_VERSION_CURRENT 11 #define FLAC_API_VERSION_REVISION 0 /**< see above */ #define FLAC_API_VERSION_AGE 3 /**< see above */ diff --git a/src/libflac/FLAC/format.h b/src/libflac/FLAC/format.h index 769ab8af..3e2dc06c 100644 --- a/src/libflac/FLAC/format.h +++ b/src/libflac/FLAC/format.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__FORMAT_H #define FLAC__FORMAT_H @@ -41,47 +41,47 @@ extern "C" { #endif /** \file include/FLAC/format.h - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * See the detailed documentation in the - * \link flac_format format \endlink module. - */ + + \brief + This module contains structure definitions for the representation + of FLAC format components in memory. These are the basic + structures used by the rest of the interfaces. + + See the detailed documentation in the + \link flac_format format \endlink module. +*/ /** \defgroup flac_format FLAC/format.h: format components - * \ingroup flac - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * First, you should be familiar with the - * FLAC format. Many of the values here - * follow directly from the specification. As a user of libFLAC, the - * interesting parts really are the structures that describe the frame - * header and metadata blocks. - * - * The format structures here are very primitive, designed to store - * information in an efficient way. Reading information from the - * structures is easy but creating or modifying them directly is - * more complex. For the most part, as a user of a library, editing - * is not necessary; however, for metadata blocks it is, so there are - * convenience functions provided in the \link flac_metadata metadata - * module \endlink to simplify the manipulation of metadata blocks. - * - * \note - * It's not the best convention, but symbols ending in _LEN are in bits - * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of - * global variables because they are usually used when declaring byte - * arrays and some compilers require compile-time knowledge of array - * sizes when declared on the stack. - * - * \{ - */ + \ingroup flac + + \brief + This module contains structure definitions for the representation + of FLAC format components in memory. These are the basic + structures used by the rest of the interfaces. + + First, you should be familiar with the + FLAC format. Many of the values here + follow directly from the specification. As a user of libFLAC, the + interesting parts really are the structures that describe the frame + header and metadata blocks. + + The format structures here are very primitive, designed to store + information in an efficient way. Reading information from the + structures is easy but creating or modifying them directly is + more complex. For the most part, as a user of a library, editing + is not necessary; however, for metadata blocks it is, so there are + convenience functions provided in the \link flac_metadata metadata + module \endlink to simplify the manipulation of metadata blocks. + + \note + It's not the best convention, but symbols ending in _LEN are in bits + and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of + global variables because they are usually used when declaring byte + arrays and some compilers require compile-time knowledge of array + sizes when declared on the stack. + + \{ +*/ /* @@ -99,7 +99,7 @@ extern "C" { #define FLAC__MAX_BLOCK_SIZE (65535u) /** The maximum block size, in samples, permitted by the FLAC subset for - * sample rates up to 48kHz. */ + sample rates up to 48kHz. */ #define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) /** The maximum number of channels permitted by the format. */ @@ -112,36 +112,36 @@ extern "C" { #define FLAC__MAX_BITS_PER_SAMPLE (32u) /** The maximum sample resolution permitted by libFLAC. - * - * \warning - * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, - * the reference encoder/decoder is currently limited to 24 bits because - * of prevalent 32-bit math, so make sure and use this value when - * appropriate. - */ + + \warning + FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, + the reference encoder/decoder is currently limited to 24 bits because + of prevalent 32-bit math, so make sure and use this value when + appropriate. +*/ #define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) /** The maximum sample rate permitted by the format. The value is - * ((2 ^ 16) - 1) * 10; see FLAC format - * as to why. - */ + ((2 ^ 16) - 1) * 10; see FLAC format + as to why. +*/ #define FLAC__MAX_SAMPLE_RATE (655350u) /** The maximum LPC order permitted by the format. */ #define FLAC__MAX_LPC_ORDER (32u) /** The maximum LPC order permitted by the FLAC subset for sample rates - * up to 48kHz. */ + up to 48kHz. */ #define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) /** The minimum quantized linear predictor coefficient precision - * permitted by the format. - */ + permitted by the format. +*/ #define FLAC__MIN_QLP_COEFF_PRECISION (5u) /** The maximum quantized linear predictor coefficient precision - * permitted by the format. - */ + permitted by the format. +*/ #define FLAC__MAX_QLP_COEFF_PRECISION (15u) /** The maximum order of the fixed predictors permitted by the format. */ @@ -154,25 +154,25 @@ extern "C" { #define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) /** The version string of the release, stamped onto the libraries and binaries. - * - * \note - * This does not correspond to the shared library version number, which - * is used to determine binary compatibility. - */ + + \note + This does not correspond to the shared library version number, which + is used to determine binary compatibility. +*/ extern FLAC_API const char *FLAC__VERSION_STRING; /** The vendor string inserted by the encoder into the VORBIS_COMMENT block. - * This is a NUL-terminated ASCII string; when inserted into the - * VORBIS_COMMENT the trailing null is stripped. - */ + This is a NUL-terminated ASCII string; when inserted into the + VORBIS_COMMENT the trailing null is stripped. +*/ extern FLAC_API const char *FLAC__VENDOR_STRING; /** The byte string representation of the beginning of a FLAC stream. */ extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ /** The 32-bit integer big-endian representation of the beginning of - * a FLAC stream. - */ + a FLAC stream. +*/ extern FLAC_API const uint32_t FLAC__STREAM_SYNC; /* = 0x664C6143 */ /** The length of the FLAC signature in bits. */ @@ -183,60 +183,60 @@ extern FLAC_API const uint32_t FLAC__STREAM_SYNC_LEN; /* = 32 bits */ /***************************************************************************** - * - * Subframe structures - * + + Subframe structures + *****************************************************************************/ /*****************************************************************************/ /** An enumeration of the available entropy coding methods. */ typedef enum { - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, - /**< Residual is coded by partitioning into contexts, each with it's own - * 4-bit Rice parameter. */ + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, + /** < Residual is coded by partitioning into contexts, each with it's own + 4-bit Rice parameter. */ - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 - /**< Residual is coded by partitioning into contexts, each with it's own - * 5-bit Rice parameter. */ + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 + /** < Residual is coded by partitioning into contexts, each with it's own + 5-bit Rice parameter. */ } FLAC__EntropyCodingMethodType; /** Maps a FLAC__EntropyCodingMethodType to a C string. - * - * Using a FLAC__EntropyCodingMethodType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__EntropyCodingMethodType as the index to this array will + give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; /** Contents of a Rice partitioned residual - */ +*/ typedef struct { - uint32_t *parameters; - /**< The Rice parameters for each context. */ + uint32_t *parameters; + /**< The Rice parameters for each context. */ - uint32_t *raw_bits; - /**< Widths for escape-coded partitions. Will be non-zero for escaped - * partitions and zero for unescaped partitions. - */ + uint32_t *raw_bits; + /** < Widths for escape-coded partitions. Will be non-zero for escaped + partitions and zero for unescaped partitions. + */ - uint32_t capacity_by_order; - /**< The capacity of the \a parameters and \a raw_bits arrays - * specified as an order, i.e. the number of array elements - * allocated is 2 ^ \a capacity_by_order. - */ + uint32_t capacity_by_order; + /** < The capacity of the \a parameters and \a raw_bits arrays + specified as an order, i.e. the number of array elements + allocated is 2 ^ \a capacity_by_order. + */ } FLAC__EntropyCodingMethod_PartitionedRiceContents; /** Header for a Rice partitioned residual. (c.f. format specification) - */ +*/ typedef struct { - uint32_t order; - /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ + uint32_t order; + /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ - const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; - /**< The context's Rice parameters and/or raw bits. */ + const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; + /**< The context's Rice parameters and/or raw bits. */ } FLAC__EntropyCodingMethod_PartitionedRice; @@ -251,12 +251,12 @@ extern FLAC_API const uint32_t FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESC /**< == (1<format specification) - */ +*/ typedef struct { - FLAC__EntropyCodingMethodType type; - union { - FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; - } data; + FLAC__EntropyCodingMethodType type; + union { + FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; + } data; } FLAC__EntropyCodingMethod; extern FLAC_API const uint32_t FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ @@ -265,74 +265,74 @@ extern FLAC_API const uint32_t FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 ( /** An enumeration of the available subframe types. */ typedef enum { - FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ - FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ - FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ - FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ + FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ + FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ + FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ + FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ } FLAC__SubframeType; /** Maps a FLAC__SubframeType to a C string. - * - * Using a FLAC__SubframeType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__SubframeType as the index to this array will + give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__SubframeTypeString[]; /** CONSTANT subframe. (c.f. format specification) - */ +*/ typedef struct { - FLAC__int32 value; /**< The constant signal value. */ + FLAC__int32 value; /**< The constant signal value. */ } FLAC__Subframe_Constant; /** VERBATIM subframe. (c.f. format specification) - */ +*/ typedef struct { - const FLAC__int32 *data; /**< A pointer to verbatim signal. */ + const FLAC__int32 *data; /**< A pointer to verbatim signal. */ } FLAC__Subframe_Verbatim; /** FIXED subframe. (c.f. format specification) - */ +*/ typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ - uint32_t order; - /**< The polynomial order. */ + uint32_t order; + /**< The polynomial order. */ - FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ + FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ } FLAC__Subframe_Fixed; /** LPC subframe. (c.f. format specification) - */ +*/ typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ - uint32_t order; - /**< The FIR order. */ + uint32_t order; + /**< The FIR order. */ - uint32_t qlp_coeff_precision; - /**< Quantized FIR filter coefficient precision in bits. */ + uint32_t qlp_coeff_precision; + /**< Quantized FIR filter coefficient precision in bits. */ - int quantization_level; - /**< The qlp coeff shift needed. */ + int quantization_level; + /**< The qlp coeff shift needed. */ - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; - /**< FIR filter coefficients. */ + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + /**< FIR filter coefficients. */ - FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ + FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ } FLAC__Subframe_LPC; extern FLAC_API const uint32_t FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ @@ -340,25 +340,25 @@ extern FLAC_API const uint32_t FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits /** FLAC subframe structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__SubframeType type; - union { - FLAC__Subframe_Constant constant; - FLAC__Subframe_Fixed fixed; - FLAC__Subframe_LPC lpc; - FLAC__Subframe_Verbatim verbatim; - } data; - uint32_t wasted_bits; + FLAC__SubframeType type; + union { + FLAC__Subframe_Constant constant; + FLAC__Subframe_Fixed fixed; + FLAC__Subframe_LPC lpc; + FLAC__Subframe_Verbatim verbatim; + } data; + uint32_t wasted_bits; } FLAC__Subframe; /** == 1 (bit) - * - * This used to be a zero-padding bit (hence the name - * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a - * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 - * to mean something else. - */ + + This used to be a zero-padding bit (hence the name + FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a + mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 + to mean something else. +*/ extern FLAC_API const uint32_t FLAC__SUBFRAME_ZERO_PAD_LEN; extern FLAC_API const uint32_t FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ extern FLAC_API const uint32_t FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ @@ -372,75 +372,75 @@ extern FLAC_API const uint32_t FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = /***************************************************************************** - * - * Frame structures - * + + Frame structures + *****************************************************************************/ /** An enumeration of the available channel assignments. */ typedef enum { - FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ - FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ + FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ } FLAC__ChannelAssignment; /** Maps a FLAC__ChannelAssignment to a C string. - * - * Using a FLAC__ChannelAssignment as the index to this array will - * give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__ChannelAssignment as the index to this array will + give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; /** An enumeration of the possible frame numbering methods. */ typedef enum { - FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ - FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ + FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ + FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ } FLAC__FrameNumberType; /** Maps a FLAC__FrameNumberType to a C string. - * - * Using a FLAC__FrameNumberType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__FrameNumberType as the index to this array will + give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; /** FLAC frame header structure. (c.f. format specification) - */ +*/ typedef struct { - uint32_t blocksize; - /**< The number of samples per subframe. */ - - uint32_t sample_rate; - /**< The sample rate in Hz. */ - - uint32_t channels; - /**< The number of channels (== number of subframes). */ - - FLAC__ChannelAssignment channel_assignment; - /**< The channel assignment for the frame. */ - - uint32_t bits_per_sample; - /**< The sample resolution. */ - - FLAC__FrameNumberType number_type; - /**< The numbering scheme used for the frame. As a convenience, the - * decoder will always convert a frame number to a sample number because - * the rules are complex. */ - - union { - FLAC__uint32 frame_number; - FLAC__uint64 sample_number; - } number; - /**< The frame number or sample number of first sample in frame; - * use the \a number_type value to determine which to use. */ - - FLAC__uint8 crc; - /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) - * of the raw frame header bytes, meaning everything before the CRC byte - * including the sync code. - */ + uint32_t blocksize; + /**< The number of samples per subframe. */ + + uint32_t sample_rate; + /**< The sample rate in Hz. */ + + uint32_t channels; + /**< The number of channels (== number of subframes). */ + + FLAC__ChannelAssignment channel_assignment; + /**< The channel assignment for the frame. */ + + uint32_t bits_per_sample; + /**< The sample resolution. */ + + FLAC__FrameNumberType number_type; + /** < The numbering scheme used for the frame. As a convenience, the + decoder will always convert a frame number to a sample number because + the rules are complex. */ + + union { + FLAC__uint32 frame_number; + FLAC__uint64 sample_number; + } number; + /** < The frame number or sample number of first sample in frame; + use the \a number_type value to determine which to use. */ + + FLAC__uint8 crc; + /** < CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) + of the raw frame header bytes, meaning everything before the CRC byte + including the sync code. + */ } FLAC__FrameHeader; extern FLAC_API const uint32_t FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ @@ -456,84 +456,84 @@ extern FLAC_API const uint32_t FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ /** FLAC frame footer structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__uint16 crc; - /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with - * 0) of the bytes before the crc, back to and including the frame header - * sync code. - */ + FLAC__uint16 crc; + /** < CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with + 0) of the bytes before the crc, back to and including the frame header + sync code. + */ } FLAC__FrameFooter; extern FLAC_API const uint32_t FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ /** FLAC frame structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__FrameHeader header; - FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; - FLAC__FrameFooter footer; + FLAC__FrameHeader header; + FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; + FLAC__FrameFooter footer; } FLAC__Frame; /*****************************************************************************/ /***************************************************************************** - * - * Meta-data structures - * + + Meta-data structures + *****************************************************************************/ /** An enumeration of the available metadata block types. */ typedef enum { - FLAC__METADATA_TYPE_STREAMINFO = 0, - /**< STREAMINFO block */ + FLAC__METADATA_TYPE_STREAMINFO = 0, + /**< STREAMINFO block */ - FLAC__METADATA_TYPE_PADDING = 1, - /**< PADDING block */ + FLAC__METADATA_TYPE_PADDING = 1, + /**< PADDING block */ - FLAC__METADATA_TYPE_APPLICATION = 2, - /**< APPLICATION block */ + FLAC__METADATA_TYPE_APPLICATION = 2, + /**< APPLICATION block */ - FLAC__METADATA_TYPE_SEEKTABLE = 3, - /**< SEEKTABLE block */ + FLAC__METADATA_TYPE_SEEKTABLE = 3, + /**< SEEKTABLE block */ - FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, - /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ + FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, + /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ - FLAC__METADATA_TYPE_CUESHEET = 5, - /**< CUESHEET block */ + FLAC__METADATA_TYPE_CUESHEET = 5, + /**< CUESHEET block */ - FLAC__METADATA_TYPE_PICTURE = 6, - /**< PICTURE block */ + FLAC__METADATA_TYPE_PICTURE = 6, + /**< PICTURE block */ - FLAC__METADATA_TYPE_UNDEFINED = 7, - /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ + FLAC__METADATA_TYPE_UNDEFINED = 7, + /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ - FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, - /**< No type will ever be greater than this. There is not enough room in the protocol block. */ + FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, + /**< No type will ever be greater than this. There is not enough room in the protocol block. */ } FLAC__MetadataType; /** Maps a FLAC__MetadataType to a C string. - * - * Using a FLAC__MetadataType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__MetadataType as the index to this array will + give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__MetadataTypeString[]; /** FLAC STREAMINFO structure. (c.f. format specification) - */ +*/ typedef struct { - uint32_t min_blocksize, max_blocksize; - uint32_t min_framesize, max_framesize; - uint32_t sample_rate; - uint32_t channels; - uint32_t bits_per_sample; - FLAC__uint64 total_samples; - FLAC__byte md5sum[16]; + uint32_t min_blocksize, max_blocksize; + uint32_t min_framesize, max_framesize; + uint32_t sample_rate; + uint32_t channels; + uint32_t bits_per_sample; + FLAC__uint64 total_samples; + FLAC__byte md5sum[16]; } FLAC__StreamMetadata_StreamInfo; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ @@ -550,37 +550,37 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< #define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) /** FLAC PADDING structure. (c.f. format specification) - */ +*/ typedef struct { - int dummy; - /**< Conceptually this is an empty struct since we don't store the - * padding bytes. Empty structs are not allowed by some C compilers, - * hence the dummy. - */ + int dummy; + /** < Conceptually this is an empty struct since we don't store the + padding bytes. Empty structs are not allowed by some C compilers, + hence the dummy. + */ } FLAC__StreamMetadata_Padding; /** FLAC APPLICATION structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__byte id[4]; - FLAC__byte *data; + FLAC__byte id[4]; + FLAC__byte *data; } FLAC__StreamMetadata_Application; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ /** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) - */ +*/ typedef struct { - FLAC__uint64 sample_number; - /**< The sample number of the target frame. */ + FLAC__uint64 sample_number; + /**< The sample number of the target frame. */ - FLAC__uint64 stream_offset; - /**< The offset, in bytes, of the target frame with respect to - * beginning of the first frame. */ + FLAC__uint64 stream_offset; + /** < The offset, in bytes, of the target frame with respect to + beginning of the first frame. */ - uint32_t frame_samples; - /**< The number of samples in the target frame. */ + uint32_t frame_samples; + /**< The number of samples in the target frame. */ } FLAC__StreamMetadata_SeekPoint; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ @@ -591,67 +591,67 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN #define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) /** The value used in the \a sample_number field of - * FLAC__StreamMetadataSeekPoint used to indicate a placeholder - * point (== 0xffffffffffffffff). - */ + FLAC__StreamMetadataSeekPoint used to indicate a placeholder + point (== 0xffffffffffffffff). +*/ extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; /** FLAC SEEKTABLE structure. (c.f. format specification) - * - * \note From the format specification: - * - The seek points must be sorted by ascending sample number. - * - Each seek point's sample number must be the first sample of the - * target frame. - * - Each seek point's sample number must be unique within the table. - * - Existence of a SEEKTABLE block implies a correct setting of - * total_samples in the stream_info block. - * - Behavior is undefined when more than one SEEKTABLE block is - * present in a stream. - */ + + \note From the format specification: + - The seek points must be sorted by ascending sample number. + - Each seek point's sample number must be the first sample of the + target frame. + - Each seek point's sample number must be unique within the table. + - Existence of a SEEKTABLE block implies a correct setting of + total_samples in the stream_info block. + - Behavior is undefined when more than one SEEKTABLE block is + present in a stream. +*/ typedef struct { - uint32_t num_points; - FLAC__StreamMetadata_SeekPoint *points; + uint32_t num_points; + FLAC__StreamMetadata_SeekPoint *points; } FLAC__StreamMetadata_SeekTable; /** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) - * - * For convenience, the APIs maintain a trailing NUL character at the end of - * \a entry which is not counted toward \a length, i.e. - * \code strlen(entry) == length \endcode - */ + + For convenience, the APIs maintain a trailing NUL character at the end of + \a entry which is not counted toward \a length, i.e. + \code strlen(entry) == length \endcode +*/ typedef struct { - FLAC__uint32 length; - FLAC__byte *entry; + FLAC__uint32 length; + FLAC__byte *entry; } FLAC__StreamMetadata_VorbisComment_Entry; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ /** FLAC VORBIS_COMMENT structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__StreamMetadata_VorbisComment_Entry vendor_string; - FLAC__uint32 num_comments; - FLAC__StreamMetadata_VorbisComment_Entry *comments; + FLAC__StreamMetadata_VorbisComment_Entry vendor_string; + FLAC__uint32 num_comments; + FLAC__StreamMetadata_VorbisComment_Entry *comments; } FLAC__StreamMetadata_VorbisComment; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ /** FLAC CUESHEET track index structure. (See the - * format specification for - * the full description of each field.) - */ + format specification for + the full description of each field.) +*/ typedef struct { - FLAC__uint64 offset; - /**< Offset in samples, relative to the track offset, of the index - * point. - */ + FLAC__uint64 offset; + /** < Offset in samples, relative to the track offset, of the index + point. + */ - FLAC__byte number; - /**< The index point number. */ + FLAC__byte number; + /**< The index point number. */ } FLAC__StreamMetadata_CueSheet_Index; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ @@ -660,30 +660,30 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN /** FLAC CUESHEET track structure. (See the - * format specification for - * the full description of each field.) - */ + format specification for + the full description of each field.) +*/ typedef struct { - FLAC__uint64 offset; - /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ + FLAC__uint64 offset; + /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ - FLAC__byte number; - /**< The track number. */ + FLAC__byte number; + /**< The track number. */ - char isrc[13]; - /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ + char isrc[13]; + /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ - uint32_t type:1; - /**< The track type: 0 for audio, 1 for non-audio. */ + uint32_t type: 1; + /**< The track type: 0 for audio, 1 for non-audio. */ - uint32_t pre_emphasis:1; - /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ + uint32_t pre_emphasis: 1; + /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ - FLAC__byte num_indices; - /**< The number of track index points. */ + FLAC__byte num_indices; + /**< The number of track index points. */ - FLAC__StreamMetadata_CueSheet_Index *indices; - /**< NULL if num_indices == 0, else pointer to array of index points. */ + FLAC__StreamMetadata_CueSheet_Index *indices; + /**< NULL if num_indices == 0, else pointer to array of index points. */ } FLAC__StreamMetadata_CueSheet_Track; @@ -697,27 +697,27 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_ /** FLAC CUESHEET structure. (See the - * format specification - * for the full description of each field.) - */ + format specification + for the full description of each field.) +*/ typedef struct { - char media_catalog_number[129]; - /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In - * general, the media catalog number may be 0 to 128 bytes long; any - * unused characters should be right-padded with NUL characters. - */ + char media_catalog_number[129]; + /** < Media catalog number, in ASCII printable characters 0x20-0x7e. In + general, the media catalog number may be 0 to 128 bytes long; any + unused characters should be right-padded with NUL characters. + */ - FLAC__uint64 lead_in; - /**< The number of lead-in samples. */ + FLAC__uint64 lead_in; + /**< The number of lead-in samples. */ - FLAC__bool is_cd; - /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ + FLAC__bool is_cd; + /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ - uint32_t num_tracks; - /**< The number of tracks. */ + uint32_t num_tracks; + /**< The number of tracks. */ - FLAC__StreamMetadata_CueSheet_Track *tracks; - /**< NULL if num_tracks == 0, else pointer to array of tracks. */ + FLAC__StreamMetadata_CueSheet_Track *tracks; + /**< NULL if num_tracks == 0, else pointer to array of tracks. */ } FLAC__StreamMetadata_CueSheet; @@ -730,83 +730,83 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /* /** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ typedef enum { - FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ - FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ - FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ - FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED + FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ + FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ + FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ + FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED } FLAC__StreamMetadata_Picture_Type; /** Maps a FLAC__StreamMetadata_Picture_Type to a C string. - * - * Using a FLAC__StreamMetadata_Picture_Type as the index to this array - * will give the string equivalent. The contents should not be - * modified. - */ + + Using a FLAC__StreamMetadata_Picture_Type as the index to this array + will give the string equivalent. The contents should not be + modified. +*/ extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; /** FLAC PICTURE structure. (See the - * format specification - * for the full description of each field.) - */ + format specification + for the full description of each field.) +*/ typedef struct { - FLAC__StreamMetadata_Picture_Type type; - /**< The kind of picture stored. */ - - char *mime_type; - /**< Picture data's MIME type, in ASCII printable characters - * 0x20-0x7e, NUL terminated. For best compatibility with players, - * use picture data of MIME type \c image/jpeg or \c image/png. A - * MIME type of '-->' is also allowed, in which case the picture - * data should be a complete URL. In file storage, the MIME type is - * stored as a 32-bit length followed by the ASCII string with no NUL - * terminator, but is converted to a plain C string in this structure - * for convenience. - */ - - FLAC__byte *description; - /**< Picture's description in UTF-8, NUL terminated. In file storage, - * the description is stored as a 32-bit length followed by the UTF-8 - * string with no NUL terminator, but is converted to a plain C string - * in this structure for convenience. - */ - - FLAC__uint32 width; - /**< Picture's width in pixels. */ - - FLAC__uint32 height; - /**< Picture's height in pixels. */ - - FLAC__uint32 depth; - /**< Picture's color depth in bits-per-pixel. */ - - FLAC__uint32 colors; - /**< For indexed palettes (like GIF), picture's number of colors (the - * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). - */ - - FLAC__uint32 data_length; - /**< Length of binary picture data in bytes. */ - - FLAC__byte *data; - /**< Binary picture data. */ + FLAC__StreamMetadata_Picture_Type type; + /**< The kind of picture stored. */ + + char *mime_type; + /** < Picture data's MIME type, in ASCII printable characters + 0x20-0x7e, NUL terminated. For best compatibility with players, + use picture data of MIME type \c image/jpeg or \c image/png. A + MIME type of '-->' is also allowed, in which case the picture + data should be a complete URL. In file storage, the MIME type is + stored as a 32-bit length followed by the ASCII string with no NUL + terminator, but is converted to a plain C string in this structure + for convenience. + */ + + FLAC__byte *description; + /** < Picture's description in UTF-8, NUL terminated. In file storage, + the description is stored as a 32-bit length followed by the UTF-8 + string with no NUL terminator, but is converted to a plain C string + in this structure for convenience. + */ + + FLAC__uint32 width; + /**< Picture's width in pixels. */ + + FLAC__uint32 height; + /**< Picture's height in pixels. */ + + FLAC__uint32 depth; + /**< Picture's color depth in bits-per-pixel. */ + + FLAC__uint32 colors; + /** < For indexed palettes (like GIF), picture's number of colors (the + number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). + */ + + FLAC__uint32 data_length; + /**< Length of binary picture data in bytes. */ + + FLAC__byte *data; + /**< Binary picture data. */ } FLAC__StreamMetadata_Picture; @@ -821,40 +821,40 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /* /** Structure that is used when a metadata block of unknown type is loaded. - * The contents are opaque. The structure is used only internally to - * correctly handle unknown metadata. - */ + The contents are opaque. The structure is used only internally to + correctly handle unknown metadata. +*/ typedef struct { - FLAC__byte *data; + FLAC__byte *data; } FLAC__StreamMetadata_Unknown; /** FLAC metadata block structure. (c.f. format specification) - */ +*/ typedef struct { - FLAC__MetadataType type; - /**< The type of the metadata block; used determine which member of the - * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED - * then \a data.unknown must be used. */ - - FLAC__bool is_last; - /**< \c true if this metadata block is the last, else \a false */ - - uint32_t length; - /**< Length, in bytes, of the block data as it appears in the stream. */ - - union { - FLAC__StreamMetadata_StreamInfo stream_info; - FLAC__StreamMetadata_Padding padding; - FLAC__StreamMetadata_Application application; - FLAC__StreamMetadata_SeekTable seek_table; - FLAC__StreamMetadata_VorbisComment vorbis_comment; - FLAC__StreamMetadata_CueSheet cue_sheet; - FLAC__StreamMetadata_Picture picture; - FLAC__StreamMetadata_Unknown unknown; - } data; - /**< Polymorphic block data; use the \a type value to determine which - * to use. */ + FLAC__MetadataType type; + /** < The type of the metadata block; used determine which member of the + \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED + then \a data.unknown must be used. */ + + FLAC__bool is_last; + /**< \c true if this metadata block is the last, else \a false */ + + uint32_t length; + /**< Length, in bytes, of the block data as it appears in the stream. */ + + union { + FLAC__StreamMetadata_StreamInfo stream_info; + FLAC__StreamMetadata_Padding padding; + FLAC__StreamMetadata_Application application; + FLAC__StreamMetadata_SeekTable seek_table; + FLAC__StreamMetadata_VorbisComment vorbis_comment; + FLAC__StreamMetadata_CueSheet cue_sheet; + FLAC__StreamMetadata_Picture picture; + FLAC__StreamMetadata_Unknown unknown; + } data; + /** < Polymorphic block data; use the \a type value to determine which + to use. */ } FLAC__StreamMetadata; extern FLAC_API const uint32_t FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ @@ -868,152 +868,152 @@ extern FLAC_API const uint32_t FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bit /***************************************************************************** - * - * Utility functions - * + + Utility functions + *****************************************************************************/ /** Tests that a sample rate is valid for FLAC. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification, else - * \c false. - */ + + \param sample_rate The sample rate to test for compliance. + \retval FLAC__bool + \c true if the given sample rate conforms to the specification, else + \c false. +*/ FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(uint32_t sample_rate); /** Tests that a blocksize at the given sample rate is valid for the FLAC - * subset. - * - * \param blocksize The blocksize to test for compliance. - * \param sample_rate The sample rate is needed, since the valid subset - * blocksize depends on the sample rate. - * \retval FLAC__bool - * \c true if the given blocksize conforms to the specification for the - * subset at the given sample rate, else \c false. - */ + subset. + + \param blocksize The blocksize to test for compliance. + \param sample_rate The sample rate is needed, since the valid subset + blocksize depends on the sample rate. + \retval FLAC__bool + \c true if the given blocksize conforms to the specification for the + subset at the given sample rate, else \c false. +*/ FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(uint32_t blocksize, uint32_t sample_rate); /** Tests that a sample rate is valid for the FLAC subset. The subset rules - * for valid sample rates are slightly more complex since the rate has to - * be expressible completely in the frame header. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification for the - * subset, else \c false. - */ + for valid sample rates are slightly more complex since the rate has to + be expressible completely in the frame header. + + \param sample_rate The sample rate to test for compliance. + \retval FLAC__bool + \c true if the given sample rate conforms to the specification for the + subset, else \c false. +*/ FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(uint32_t sample_rate); /** Check a Vorbis comment entry name to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment names must be composed only of characters from - * [0x20-0x3C,0x3E-0x7D]. - * - * \param name A NUL-terminated string to be checked. - * \assert - * \code name != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ + comment specification. + + Vorbis comment names must be composed only of characters from + [0x20-0x3C,0x3E-0x7D]. + + \param name A NUL-terminated string to be checked. + \assert + \code name != NULL \endcode + \retval FLAC__bool + \c false if entry name is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); /** Check a Vorbis comment entry value to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment values must be valid UTF-8 sequences. - * - * \param value A string to be checked. - * \param length A the length of \a value in bytes. May be - * \c (uint32_t)(-1) to indicate that \a value is a plain - * UTF-8 NUL-terminated string. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ + comment specification. + + Vorbis comment values must be valid UTF-8 sequences. + + \param value A string to be checked. + \param length A the length of \a value in bytes. May be + \c (uint32_t)(-1) to indicate that \a value is a plain + UTF-8 NUL-terminated string. + \assert + \code value != NULL \endcode + \retval FLAC__bool + \c false if entry name is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, uint32_t length); /** Check a Vorbis comment entry to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment entries must be of the form 'name=value', and 'name' and - * 'value' must be legal according to - * FLAC__format_vorbiscomment_entry_name_is_legal() and - * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. - * - * \param entry An entry to be checked. - * \param length The length of \a entry in bytes. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ + comment specification. + + Vorbis comment entries must be of the form 'name=value', and 'name' and + 'value' must be legal according to + FLAC__format_vorbiscomment_entry_name_is_legal() and + FLAC__format_vorbiscomment_entry_value_is_legal() respectively. + + \param entry An entry to be checked. + \param length The length of \a entry in bytes. + \assert + \code value != NULL \endcode + \retval FLAC__bool + \c false if entry name is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, uint32_t length); /** Check a seek table to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seek table. - * - * \param seek_table A pointer to a seek table to be checked. - * \assert - * \code seek_table != NULL \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ + See the format specification for limits on the contents of the + seek table. + + \param seek_table A pointer to a seek table to be checked. + \assert + \code seek_table != NULL \endcode + \retval FLAC__bool + \c false if seek table is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); /** Sort a seek table's seek points according to the format specification. - * This includes a "unique-ification" step to remove duplicates, i.e. - * seek points with identical \a sample_number values. Duplicate seek - * points are converted into placeholder points and sorted to the end of - * the table. - * - * \param seek_table A pointer to a seek table to be sorted. - * \assert - * \code seek_table != NULL \endcode - * \retval uint32_t - * The number of duplicate seek points converted into placeholders. - */ + This includes a "unique-ification" step to remove duplicates, i.e. + seek points with identical \a sample_number values. Duplicate seek + points are converted into placeholder points and sorted to the end of + the table. + + \param seek_table A pointer to a seek table to be sorted. + \assert + \code seek_table != NULL \endcode + \retval uint32_t + The number of duplicate seek points converted into placeholders. +*/ FLAC_API uint32_t FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); /** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param cue_sheet A pointer to an existing cue sheet to be checked. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code cue_sheet != NULL \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ + See the format specification for limits on the contents of the + cue sheet. + + \param cue_sheet A pointer to an existing cue sheet to be checked. + \param check_cd_da_subset If \c true, check CUESHEET against more + stringent requirements for a CD-DA (audio) disc. + \param violation Address of a pointer to a string. If there is a + violation, a pointer to a string explanation of the + violation will be returned here. \a violation may be + \c NULL if you don't need the returned string. Do not + free the returned string; it will always point to static + data. + \assert + \code cue_sheet != NULL \endcode + \retval FLAC__bool + \c false if cue sheet is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); /** Check picture data to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param picture A pointer to existing picture data to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c false if picture data is illegal, else \c true. - */ + See the format specification for limits on the contents of the + PICTURE block. + + \param picture A pointer to existing picture data to be checked. + \param violation Address of a pointer to a string. If there is a + violation, a pointer to a string explanation of the + violation will be returned here. \a violation may be + \c NULL if you don't need the returned string. Do not + free the returned string; it will always point to static + data. + \assert + \code picture != NULL \endcode + \retval FLAC__bool + \c false if picture data is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); /* \} */ diff --git a/src/libflac/FLAC/metadata.h b/src/libflac/FLAC/metadata.h index 4c67b87f..14fb6ab7 100644 --- a/src/libflac/FLAC/metadata.h +++ b/src/libflac/FLAC/metadata.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__METADATA_H #define FLAC__METADATA_H @@ -38,88 +38,88 @@ #include "callback.h" #include "format.h" -/* -------------------------------------------------------------------- - (For an example of how all these routines are used, see the source - code for the unit tests in src/test_libFLAC/metadata_*.c, or - metaflac in src/metaflac/) - ------------------------------------------------------------------*/ +/* -------------------------------------------------------------------- + (For an example of how all these routines are used, see the source + code for the unit tests in src/test_libFLAC/metadata_*.c, or + metaflac in src/metaflac/) + ------------------------------------------------------------------*/ /** \file include/FLAC/metadata.h - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in FLAC files. - * - * See the detailed documentation for each interface in the - * \link flac_metadata metadata \endlink module. - */ + + \brief + This module provides functions for creating and manipulating FLAC + metadata blocks in memory, and three progressively more powerful + interfaces for traversing and editing metadata in FLAC files. + + See the detailed documentation for each interface in the + \link flac_metadata metadata \endlink module. +*/ /** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces - * \ingroup flac - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in native FLAC files. - * Note that currently only the Chain interface (level 2) supports Ogg - * FLAC files, and it is read-only i.e. no writing back changed - * metadata to file. - * - * There are three metadata interfaces of increasing complexity: - * - * Level 0: - * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and - * PICTURE blocks. - * - * Level 1: - * Read-write access to all metadata blocks. This level is write- - * efficient in most cases (more on this below), and uses less memory - * than level 2. - * - * Level 2: - * Read-write access to all metadata blocks. This level is write- - * efficient in all cases, but uses more memory since all metadata for - * the whole file is read into memory and manipulated before writing - * out again. - * - * What do we mean by efficient? Since FLAC metadata appears at the - * beginning of the file, when writing metadata back to a FLAC file - * it is possible to grow or shrink the metadata such that the entire - * file must be rewritten. However, if the size remains the same during - * changes or PADDING blocks are utilized, only the metadata needs to be - * overwritten, which is much faster. - * - * Efficient means the whole file is rewritten at most one time, and only - * when necessary. Level 1 is not efficient only in the case that you - * cause more than one metadata block to grow or shrink beyond what can - * be accommodated by padding. In this case you should probably use level - * 2, which allows you to edit all the metadata for a file in memory and - * write it out all at once. - * - * All levels know how to skip over and not disturb an ID3v2 tag at the - * front of the file. - * - * All levels access files via their filenames. In addition, level 2 - * has additional alternative read and write functions that take an I/O - * handle and callbacks, for situations where access by filename is not - * possible. - * - * In addition to the three interfaces, this module defines functions for - * creating and manipulating various metadata objects in memory. As we see - * from the Format module, FLAC metadata blocks in memory are very primitive - * structures for storing information in an efficient way. Reading - * information from the structures is easy but creating or modifying them - * directly is more complex. The metadata object routines here facilitate - * this by taking care of the consistency and memory management drudgery. - * - * Unless you will be using the level 1 or 2 interfaces to modify existing - * metadata however, you will not probably not need these. - * - * From a dependency standpoint, none of the encoders or decoders require - * the metadata module. This is so that embedded users can strip out the - * metadata module from libFLAC to reduce the size and complexity. - */ + \ingroup flac + + \brief + This module provides functions for creating and manipulating FLAC + metadata blocks in memory, and three progressively more powerful + interfaces for traversing and editing metadata in native FLAC files. + Note that currently only the Chain interface (level 2) supports Ogg + FLAC files, and it is read-only i.e. no writing back changed + metadata to file. + + There are three metadata interfaces of increasing complexity: + + Level 0: + Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and + PICTURE blocks. + + Level 1: + Read-write access to all metadata blocks. This level is write- + efficient in most cases (more on this below), and uses less memory + than level 2. + + Level 2: + Read-write access to all metadata blocks. This level is write- + efficient in all cases, but uses more memory since all metadata for + the whole file is read into memory and manipulated before writing + out again. + + What do we mean by efficient? Since FLAC metadata appears at the + beginning of the file, when writing metadata back to a FLAC file + it is possible to grow or shrink the metadata such that the entire + file must be rewritten. However, if the size remains the same during + changes or PADDING blocks are utilized, only the metadata needs to be + overwritten, which is much faster. + + Efficient means the whole file is rewritten at most one time, and only + when necessary. Level 1 is not efficient only in the case that you + cause more than one metadata block to grow or shrink beyond what can + be accommodated by padding. In this case you should probably use level + 2, which allows you to edit all the metadata for a file in memory and + write it out all at once. + + All levels know how to skip over and not disturb an ID3v2 tag at the + front of the file. + + All levels access files via their filenames. In addition, level 2 + has additional alternative read and write functions that take an I/O + handle and callbacks, for situations where access by filename is not + possible. + + In addition to the three interfaces, this module defines functions for + creating and manipulating various metadata objects in memory. As we see + from the Format module, FLAC metadata blocks in memory are very primitive + structures for storing information in an efficient way. Reading + information from the structures is easy but creating or modifying them + directly is more complex. The metadata object routines here facilitate + this by taking care of the consistency and memory management drudgery. + + Unless you will be using the level 1 or 2 interfaces to modify existing + metadata however, you will not probably not need these. + + From a dependency standpoint, none of the encoders or decoders require + the metadata module. This is so that embedded users can strip out the + metadata module from libFLAC to reduce the size and complexity. +*/ #ifdef __cplusplus extern "C" { @@ -127,2050 +127,2050 @@ extern "C" { /** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface - * \ingroup flac_metadata - * - * \brief - * The level 0 interface consists of individual routines to read the - * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring - * only a filename. - * - * They try to skip any ID3v2 tag at the head of the file. - * - * \{ - */ + \ingroup flac_metadata + + \brief + The level 0 interface consists of individual routines to read the + STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring + only a filename. + + They try to skip any ID3v2 tag at the head of the file. + + \{ +*/ /** Read the STREAMINFO metadata block of the given FLAC file. This function - * will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param streaminfo A pointer to space for the STREAMINFO block. Since - * FLAC__StreamMetadata is a simple structure with no - * memory allocation involved, you pass the address of - * an existing structure. It need not be initialized. - * \assert - * \code filename != NULL \endcode - * \code streaminfo != NULL \endcode - * \retval FLAC__bool - * \c true if a valid STREAMINFO block was read from \a filename. Returns - * \c false if there was a memory allocation error, a file decoder error, - * or the file contained no STREAMINFO block. (A memory allocation error - * is possible because this function must set up a file decoder.) - */ + will try to skip any ID3v2 tag at the head of the file. + + \param filename The path to the FLAC file to read. + \param streaminfo A pointer to space for the STREAMINFO block. Since + FLAC__StreamMetadata is a simple structure with no + memory allocation involved, you pass the address of + an existing structure. It need not be initialized. + \assert + \code filename != NULL \endcode + \code streaminfo != NULL \endcode + \retval FLAC__bool + \c true if a valid STREAMINFO block was read from \a filename. Returns + \c false if there was a memory allocation error, a file decoder error, + or the file contained no STREAMINFO block. (A memory allocation error + is possible because this function must set up a file decoder.) +*/ FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); /** Read the VORBIS_COMMENT metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param tags The address where the returned pointer will be - * stored. The \a tags object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code tags != NULL \endcode - * \retval FLAC__bool - * \c true if a valid VORBIS_COMMENT block was read from \a filename, - * and \a *tags will be set to the address of the metadata structure. - * Returns \c false if there was a memory allocation error, a file - * decoder error, or the file contained no VORBIS_COMMENT block, and - * \a *tags will be set to \c NULL. - */ + function will try to skip any ID3v2 tag at the head of the file. + + \param filename The path to the FLAC file to read. + \param tags The address where the returned pointer will be + stored. The \a tags object must be deleted by + the caller using FLAC__metadata_object_delete(). + \assert + \code filename != NULL \endcode + \code tags != NULL \endcode + \retval FLAC__bool + \c true if a valid VORBIS_COMMENT block was read from \a filename, + and \a *tags will be set to the address of the metadata structure. + Returns \c false if there was a memory allocation error, a file + decoder error, or the file contained no VORBIS_COMMENT block, and + \a *tags will be set to \c NULL. +*/ FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); /** Read the CUESHEET metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param cuesheet The address where the returned pointer will be - * stored. The \a cuesheet object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code cuesheet != NULL \endcode - * \retval FLAC__bool - * \c true if a valid CUESHEET block was read from \a filename, - * and \a *cuesheet will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no CUESHEET - * block, and \a *cuesheet will be set to \c NULL. - */ + function will try to skip any ID3v2 tag at the head of the file. + + \param filename The path to the FLAC file to read. + \param cuesheet The address where the returned pointer will be + stored. The \a cuesheet object must be deleted by + the caller using FLAC__metadata_object_delete(). + \assert + \code filename != NULL \endcode + \code cuesheet != NULL \endcode + \retval FLAC__bool + \c true if a valid CUESHEET block was read from \a filename, + and \a *cuesheet will be set to the address of the metadata + structure. Returns \c false if there was a memory allocation + error, a file decoder error, or the file contained no CUESHEET + block, and \a *cuesheet will be set to \c NULL. +*/ FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); /** Read a PICTURE metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * Since there can be more than one PICTURE block in a file, this - * function takes a number of parameters that act as constraints to - * the search. The PICTURE block with the largest area matching all - * the constraints will be returned, or \a *picture will be set to - * \c NULL if there was no such block. - * - * \param filename The path to the FLAC file to read. - * \param picture The address where the returned pointer will be - * stored. The \a picture object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \param type The desired picture type. Use \c -1 to mean - * "any type". - * \param mime_type The desired MIME type, e.g. "image/jpeg". The - * string will be matched exactly. Use \c NULL to - * mean "any MIME type". - * \param description The desired description. The string will be - * matched exactly. Use \c NULL to mean "any - * description". - * \param max_width The maximum width in pixels desired. Use - * \c (uint32_t)(-1) to mean "any width". - * \param max_height The maximum height in pixels desired. Use - * \c (uint32_t)(-1) to mean "any height". - * \param max_depth The maximum color depth in bits-per-pixel desired. - * Use \c (uint32_t)(-1) to mean "any depth". - * \param max_colors The maximum number of colors desired. Use - * \c (uint32_t)(-1) to mean "any number of colors". - * \assert - * \code filename != NULL \endcode - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c true if a valid PICTURE block was read from \a filename, - * and \a *picture will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no PICTURE - * block, and \a *picture will be set to \c NULL. - */ + function will try to skip any ID3v2 tag at the head of the file. + Since there can be more than one PICTURE block in a file, this + function takes a number of parameters that act as constraints to + the search. The PICTURE block with the largest area matching all + the constraints will be returned, or \a *picture will be set to + \c NULL if there was no such block. + + \param filename The path to the FLAC file to read. + \param picture The address where the returned pointer will be + stored. The \a picture object must be deleted by + the caller using FLAC__metadata_object_delete(). + \param type The desired picture type. Use \c -1 to mean + "any type". + \param mime_type The desired MIME type, e.g. "image/jpeg". The + string will be matched exactly. Use \c NULL to + mean "any MIME type". + \param description The desired description. The string will be + matched exactly. Use \c NULL to mean "any + description". + \param max_width The maximum width in pixels desired. Use + \c (uint32_t)(-1) to mean "any width". + \param max_height The maximum height in pixels desired. Use + \c (uint32_t)(-1) to mean "any height". + \param max_depth The maximum color depth in bits-per-pixel desired. + Use \c (uint32_t)(-1) to mean "any depth". + \param max_colors The maximum number of colors desired. Use + \c (uint32_t)(-1) to mean "any number of colors". + \assert + \code filename != NULL \endcode + \code picture != NULL \endcode + \retval FLAC__bool + \c true if a valid PICTURE block was read from \a filename, + and \a *picture will be set to the address of the metadata + structure. Returns \c false if there was a memory allocation + error, a file decoder error, or the file contained no PICTURE + block, and \a *picture will be set to \c NULL. +*/ FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, uint32_t max_width, uint32_t max_height, uint32_t max_depth, uint32_t max_colors); /* \} */ /** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface - * \ingroup flac_metadata - * - * \brief - * The level 1 interface provides read-write access to FLAC file metadata and - * operates directly on the FLAC file. - * - * The general usage of this interface is: - * - * - Create an iterator using FLAC__metadata_simple_iterator_new() - * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check - * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to - * see if the file is writable, or only read access is allowed. - * - Use FLAC__metadata_simple_iterator_next() and - * FLAC__metadata_simple_iterator_prev() to traverse the blocks. - * This is does not read the actual blocks themselves. - * FLAC__metadata_simple_iterator_next() is relatively fast. - * FLAC__metadata_simple_iterator_prev() is slower since it needs to search - * forward from the front of the file. - * - Use FLAC__metadata_simple_iterator_get_block_type() or - * FLAC__metadata_simple_iterator_get_block() to access the actual data at - * the current iterator position. The returned object is yours to modify - * and free. - * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block - * back. You must have write permission to the original file. Make sure to - * read the whole comment to FLAC__metadata_simple_iterator_set_block() - * below. - * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. - * Use the object creation functions from - * \link flac_metadata_object here \endlink to generate new objects. - * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block - * currently referred to by the iterator, or replace it with padding. - * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when - * finished. - * - * \note - * The FLAC file remains open the whole time between - * FLAC__metadata_simple_iterator_init() and - * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering - * the file during this time. - * - * \note - * Do not modify the \a is_last, \a length, or \a type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * If any of the modification functions - * (FLAC__metadata_simple_iterator_set_block(), - * FLAC__metadata_simple_iterator_delete_block(), - * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, - * you should delete the iterator as it may no longer be valid. - * - * \{ - */ + \ingroup flac_metadata + + \brief + The level 1 interface provides read-write access to FLAC file metadata and + operates directly on the FLAC file. + + The general usage of this interface is: + + - Create an iterator using FLAC__metadata_simple_iterator_new() + - Attach it to a file using FLAC__metadata_simple_iterator_init() and check + the exit code. Call FLAC__metadata_simple_iterator_is_writable() to + see if the file is writable, or only read access is allowed. + - Use FLAC__metadata_simple_iterator_next() and + FLAC__metadata_simple_iterator_prev() to traverse the blocks. + This is does not read the actual blocks themselves. + FLAC__metadata_simple_iterator_next() is relatively fast. + FLAC__metadata_simple_iterator_prev() is slower since it needs to search + forward from the front of the file. + - Use FLAC__metadata_simple_iterator_get_block_type() or + FLAC__metadata_simple_iterator_get_block() to access the actual data at + the current iterator position. The returned object is yours to modify + and free. + - Use FLAC__metadata_simple_iterator_set_block() to write a modified block + back. You must have write permission to the original file. Make sure to + read the whole comment to FLAC__metadata_simple_iterator_set_block() + below. + - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. + Use the object creation functions from + \link flac_metadata_object here \endlink to generate new objects. + - Use FLAC__metadata_simple_iterator_delete_block() to remove the block + currently referred to by the iterator, or replace it with padding. + - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when + finished. + + \note + The FLAC file remains open the whole time between + FLAC__metadata_simple_iterator_init() and + FLAC__metadata_simple_iterator_delete(), so make sure you are not altering + the file during this time. + + \note + Do not modify the \a is_last, \a length, or \a type fields of returned + FLAC__StreamMetadata objects. These are managed automatically. + + \note + If any of the modification functions + (FLAC__metadata_simple_iterator_set_block(), + FLAC__metadata_simple_iterator_delete_block(), + FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, + you should delete the iterator as it may no longer be valid. + + \{ +*/ struct FLAC__Metadata_SimpleIterator; /** The opaque structure definition for the level 1 iterator type. - * See the - * \link flac_metadata_level1 metadata level 1 module \endlink - * for a detailed description. - */ + See the + \link flac_metadata_level1 metadata level 1 module \endlink + for a detailed description. +*/ typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; /** Status type for FLAC__Metadata_SimpleIterator. - * - * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). - */ + + The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). +*/ typedef enum { - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, - /**< The iterator is in the normal OK state */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, + /**< The iterator is in the normal OK state */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, - /**< The iterator could not open the target file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, + /**< The iterator could not open the target file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, - /**< The iterator could not find the FLAC signature at the start of the file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, + /**< The iterator could not find the FLAC signature at the start of the file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, - /**< The iterator tried to write to a file that was not writable */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, + /**< The iterator tried to write to a file that was not writable */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, - /**< The iterator encountered input that does not conform to the FLAC metadata specification */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, + /**< The iterator encountered input that does not conform to the FLAC metadata specification */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, - /**< The iterator encountered an error while reading the FLAC file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, + /**< The iterator encountered an error while reading the FLAC file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, - /**< The iterator encountered an error while seeking in the FLAC file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, + /**< The iterator encountered an error while seeking in the FLAC file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, - /**< The iterator encountered an error while writing the FLAC file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, + /**< The iterator encountered an error while writing the FLAC file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, - /**< The iterator encountered an error renaming the FLAC file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, + /**< The iterator encountered an error renaming the FLAC file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, - /**< The iterator encountered an error removing the temporary file */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, + /**< The iterator encountered an error removing the temporary file */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR - /**< The caller violated an assertion or an unexpected error occurred */ + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR + /**< The caller violated an assertion or an unexpected error occurred */ } FLAC__Metadata_SimpleIteratorStatus; /** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. - * - * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; /** Create a new iterator instance. - * - * \retval FLAC__Metadata_SimpleIterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + \retval FLAC__Metadata_SimpleIterator + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); /** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ + + \param iterator A pointer to an existing iterator. + \assert + \code iterator != NULL \endcode +*/ FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); /** Get the current status of the iterator. Call this after a function - * returns \c false to get the reason for the error. Also resets the status - * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__Metadata_SimpleIteratorStatus - * The current status of the iterator. - */ + returns \c false to get the reason for the error. Also resets the status + to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. + + \param iterator A pointer to an existing iterator. + \assert + \code iterator != NULL \endcode + \retval FLAC__Metadata_SimpleIteratorStatus + The current status of the iterator. +*/ FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); /** Initialize the iterator to point to the first metadata block in the - * given FLAC file. - * - * \param iterator A pointer to an existing iterator. - * \param filename The path to the FLAC file. - * \param read_only If \c true, the FLAC file will be opened - * in read-only mode; if \c false, the FLAC - * file will be opened for edit even if no - * edits are performed. - * \param preserve_file_stats If \c true, the owner and modification - * time will be preserved even if the FLAC - * file is written to. - * \assert - * \code iterator != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c false if a memory allocation error occurs, the file can't be - * opened, or another error occurs, else \c true. - */ + given FLAC file. + + \param iterator A pointer to an existing iterator. + \param filename The path to the FLAC file. + \param read_only If \c true, the FLAC file will be opened + in read-only mode; if \c false, the FLAC + file will be opened for edit even if no + edits are performed. + \param preserve_file_stats If \c true, the owner and modification + time will be preserved even if the FLAC + file is written to. + \assert + \code iterator != NULL \endcode + \code filename != NULL \endcode + \retval FLAC__bool + \c false if a memory allocation error occurs, the file can't be + opened, or another error occurs, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); /** Returns \c true if the FLAC file is writable. If \c false, calls to - * FLAC__metadata_simple_iterator_set_block() and - * FLAC__metadata_simple_iterator_insert_block_after() will fail. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__bool - * See above. - */ + FLAC__metadata_simple_iterator_set_block() and + FLAC__metadata_simple_iterator_insert_block_after() will fail. + + \param iterator A pointer to an existing iterator. + \assert + \code iterator != NULL \endcode + \retval FLAC__bool + See above. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); /** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ + already at the end. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__bool + \c false if already at the last metadata block of the chain, else + \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); /** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ + already at the beginning. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__bool + \c false if already at the first metadata block of the chain, else + \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); /** Returns a flag telling if the current metadata block is the last. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the current metadata block is the last in the file, - * else \c false. - */ + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__bool + \c true if the current metadata block is the last in the file, + else \c false. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); /** Get the offset of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval off_t - * The offset of the metadata block at the current iterator position. - * This is the byte offset relative to the beginning of the file of - * the current metadata block's header. - */ + avoids reading the actual block data which can save time for large + blocks. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval off_t + The offset of the metadata block at the current iterator position. + This is the byte offset relative to the beginning of the file of + the current metadata block's header. +*/ FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); /** Get the type of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ + avoids reading the actual block data which can save time for large + blocks. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__MetadataType + The type of the metadata block at the current iterator position. +*/ FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); /** Get the length of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval uint32_t - * The length of the metadata block at the current iterator position. - * The is same length as that in the - * metadata block header, - * i.e. the length of the metadata body that follows the header. - */ + avoids reading the actual block data which can save time for large + blocks. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval uint32_t + The length of the metadata block at the current iterator position. + The is same length as that in the + metadata block header, + i.e. the length of the metadata body that follows the header. +*/ FLAC_API uint32_t FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); /** Get the application ID of the \c APPLICATION block at the current - * position. This avoids reading the actual block data which can save - * time for large blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \param id A pointer to a buffer of at least \c 4 bytes where - * the ID will be stored. - * \assert - * \code iterator != NULL \endcode - * \code id != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the ID was successfully read, else \c false, in which - * case you should check FLAC__metadata_simple_iterator_status() to - * find out why. If the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the - * current metadata block is not an \c APPLICATION block. Otherwise - * if the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error - * occurred and the iterator can no longer be used. - */ + position. This avoids reading the actual block data which can save + time for large blocks. + + \param iterator A pointer to an existing initialized iterator. + \param id A pointer to a buffer of at least \c 4 bytes where + the ID will be stored. + \assert + \code iterator != NULL \endcode + \code id != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__bool + \c true if the ID was successfully read, else \c false, in which + case you should check FLAC__metadata_simple_iterator_status() to + find out why. If the status is + \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the + current metadata block is not an \c APPLICATION block. Otherwise + if the status is + \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or + \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error + occurred and the iterator can no longer be used. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); /** Get the metadata block at the current position. You can modify the - * block but must use FLAC__metadata_simple_iterator_set_block() to - * write it back to the FLAC file. - * - * You must call FLAC__metadata_object_delete() on the returned object - * when you are finished with it. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block, or \c NULL if there was a memory - * allocation error. - */ + block but must use FLAC__metadata_simple_iterator_set_block() to + write it back to the FLAC file. + + You must call FLAC__metadata_object_delete() on the returned object + when you are finished with it. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__StreamMetadata + The current metadata block, or \c NULL if there was a memory + allocation error. +*/ FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); /** Write a block back to the FLAC file. This function tries to be - * as efficient as possible; how the block is actually written is - * shown by the following: - * - * Existing block is a STREAMINFO block and the new block is a - * STREAMINFO block: the new block is written in place. Make sure - * you know what you're doing when changing the values of a - * STREAMINFO block. - * - * Existing block is a STREAMINFO block and the new block is a - * not a STREAMINFO block: this is an error since the first block - * must be a STREAMINFO block. Returns \c false without altering the - * file. - * - * Existing block is not a STREAMINFO block and the new block is a - * STREAMINFO block: this is an error since there may be only one - * STREAMINFO block. Returns \c false without altering the file. - * - * Existing block and new block are the same length: the existing - * block will be replaced by the new block, written in place. - * - * Existing block is longer than new block: if use_padding is \c true, - * the existing block will be overwritten in place with the new - * block followed by a PADDING block, if possible, to make the total - * size the same as the existing block. Remember that a padding - * block requires at least four bytes so if the difference in size - * between the new block and existing block is less than that, the - * entire file will have to be rewritten, using the new block's - * exact size. If use_padding is \c false, the entire file will be - * rewritten, replacing the existing block by the new block. - * - * Existing block is shorter than new block: if use_padding is \c true, - * the function will try and expand the new block into the following - * PADDING block, if it exists and doing so won't shrink the PADDING - * block to less than 4 bytes. If there is no following PADDING - * block, or it will shrink to less than 4 bytes, or use_padding is - * \c false, the entire file is rewritten, replacing the existing block - * with the new block. Note that in this case any following PADDING - * block is preserved as is. - * - * After writing the block, the iterator will remain in the same - * place, i.e. pointing to the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ + as efficient as possible; how the block is actually written is + shown by the following: + + Existing block is a STREAMINFO block and the new block is a + STREAMINFO block: the new block is written in place. Make sure + you know what you're doing when changing the values of a + STREAMINFO block. + + Existing block is a STREAMINFO block and the new block is a + not a STREAMINFO block: this is an error since the first block + must be a STREAMINFO block. Returns \c false without altering the + file. + + Existing block is not a STREAMINFO block and the new block is a + STREAMINFO block: this is an error since there may be only one + STREAMINFO block. Returns \c false without altering the file. + + Existing block and new block are the same length: the existing + block will be replaced by the new block, written in place. + + Existing block is longer than new block: if use_padding is \c true, + the existing block will be overwritten in place with the new + block followed by a PADDING block, if possible, to make the total + size the same as the existing block. Remember that a padding + block requires at least four bytes so if the difference in size + between the new block and existing block is less than that, the + entire file will have to be rewritten, using the new block's + exact size. If use_padding is \c false, the entire file will be + rewritten, replacing the existing block by the new block. + + Existing block is shorter than new block: if use_padding is \c true, + the function will try and expand the new block into the following + PADDING block, if it exists and doing so won't shrink the PADDING + block to less than 4 bytes. If there is no following PADDING + block, or it will shrink to less than 4 bytes, or use_padding is + \c false, the entire file is rewritten, replacing the existing block + with the new block. Note that in this case any following PADDING + block is preserved as is. + + After writing the block, the iterator will remain in the same + place, i.e. pointing to the new block. + + \param iterator A pointer to an existing initialized iterator. + \param block The block to set. + \param use_padding See above. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \code block != NULL \endcode + \retval FLAC__bool + \c true if successful, else \c false. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); /** This is similar to FLAC__metadata_simple_iterator_set_block() - * except that instead of writing over an existing block, it appends - * a block after the existing block. \a use_padding is again used to - * tell the function to try an expand into following padding in an - * attempt to avoid rewriting the entire file. - * - * This function will fail and return \c false if given a STREAMINFO - * block. - * - * After writing the block, the iterator will be pointing to the - * new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ + except that instead of writing over an existing block, it appends + a block after the existing block. \a use_padding is again used to + tell the function to try an expand into following padding in an + attempt to avoid rewriting the entire file. + + This function will fail and return \c false if given a STREAMINFO + block. + + After writing the block, the iterator will be pointing to the + new block. + + \param iterator A pointer to an existing initialized iterator. + \param block The block to set. + \param use_padding See above. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \code block != NULL \endcode + \retval FLAC__bool + \c true if successful, else \c false. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); /** Deletes the block at the current position. This will cause the - * entire FLAC file to be rewritten, unless \a use_padding is \c true, - * in which case the block will be replaced by an equal-sized PADDING - * block. The iterator will be left pointing to the block before the - * one just deleted. - * - * You may not delete the STREAMINFO block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if successful, else \c false. - */ + entire FLAC file to be rewritten, unless \a use_padding is \c true, + in which case the block will be replaced by an equal-sized PADDING + block. The iterator will be left pointing to the block before the + one just deleted. + + You may not delete the STREAMINFO block. + + \param iterator A pointer to an existing initialized iterator. + \param use_padding See above. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_simple_iterator_init() + \retval FLAC__bool + \c true if successful, else \c false. +*/ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); /* \} */ /** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface - * \ingroup flac_metadata - * - * \brief - * The level 2 interface provides read-write access to FLAC file metadata; - * all metadata is read into memory, operated on in memory, and then written - * to file, which is more efficient than level 1 when editing multiple blocks. - * - * Currently Ogg FLAC is supported for read only, via - * FLAC__metadata_chain_read_ogg() but a subsequent - * FLAC__metadata_chain_write() will fail. - * - * The general usage of this interface is: - * - * - Create a new chain using FLAC__metadata_chain_new(). A chain is a - * linked list of FLAC metadata blocks. - * - Read all metadata into the chain from a FLAC file using - * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and - * check the status. - * - Optionally, consolidate the padding using - * FLAC__metadata_chain_merge_padding() or - * FLAC__metadata_chain_sort_padding(). - * - Create a new iterator using FLAC__metadata_iterator_new() - * - Initialize the iterator to point to the first element in the chain - * using FLAC__metadata_iterator_init() - * - Traverse the chain using FLAC__metadata_iterator_next and - * FLAC__metadata_iterator_prev(). - * - Get a block for reading or modification using - * FLAC__metadata_iterator_get_block(). The pointer to the object - * inside the chain is returned, so the block is yours to modify. - * Changes will be reflected in the FLAC file when you write the - * chain. You can also add and delete blocks (see functions below). - * - When done, write out the chain using FLAC__metadata_chain_write(). - * Make sure to read the whole comment to the function below. - * - Delete the chain using FLAC__metadata_chain_delete(). - * - * \note - * Even though the FLAC file is not open while the chain is being - * manipulated, you must not alter the file externally during - * this time. The chain assumes the FLAC file will not change - * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() - * and FLAC__metadata_chain_write(). - * - * \note - * Do not modify the is_last, length, or type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * The metadata objects returned by FLAC__metadata_iterator_get_block() - * are owned by the chain; do not FLAC__metadata_object_delete() them. - * In the same way, blocks passed to FLAC__metadata_iterator_set_block() - * become owned by the chain and they will be deleted when the chain is - * deleted. - * - * \{ - */ + \ingroup flac_metadata + + \brief + The level 2 interface provides read-write access to FLAC file metadata; + all metadata is read into memory, operated on in memory, and then written + to file, which is more efficient than level 1 when editing multiple blocks. + + Currently Ogg FLAC is supported for read only, via + FLAC__metadata_chain_read_ogg() but a subsequent + FLAC__metadata_chain_write() will fail. + + The general usage of this interface is: + + - Create a new chain using FLAC__metadata_chain_new(). A chain is a + linked list of FLAC metadata blocks. + - Read all metadata into the chain from a FLAC file using + FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and + check the status. + - Optionally, consolidate the padding using + FLAC__metadata_chain_merge_padding() or + FLAC__metadata_chain_sort_padding(). + - Create a new iterator using FLAC__metadata_iterator_new() + - Initialize the iterator to point to the first element in the chain + using FLAC__metadata_iterator_init() + - Traverse the chain using FLAC__metadata_iterator_next and + FLAC__metadata_iterator_prev(). + - Get a block for reading or modification using + FLAC__metadata_iterator_get_block(). The pointer to the object + inside the chain is returned, so the block is yours to modify. + Changes will be reflected in the FLAC file when you write the + chain. You can also add and delete blocks (see functions below). + - When done, write out the chain using FLAC__metadata_chain_write(). + Make sure to read the whole comment to the function below. + - Delete the chain using FLAC__metadata_chain_delete(). + + \note + Even though the FLAC file is not open while the chain is being + manipulated, you must not alter the file externally during + this time. The chain assumes the FLAC file will not change + between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() + and FLAC__metadata_chain_write(). + + \note + Do not modify the is_last, length, or type fields of returned + FLAC__StreamMetadata objects. These are managed automatically. + + \note + The metadata objects returned by FLAC__metadata_iterator_get_block() + are owned by the chain; do not FLAC__metadata_object_delete() them. + In the same way, blocks passed to FLAC__metadata_iterator_set_block() + become owned by the chain and they will be deleted when the chain is + deleted. + + \{ +*/ struct FLAC__Metadata_Chain; /** The opaque structure definition for the level 2 chain type. - */ +*/ typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; struct FLAC__Metadata_Iterator; /** The opaque structure definition for the level 2 iterator type. - */ +*/ typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; typedef enum { - FLAC__METADATA_CHAIN_STATUS_OK = 0, - /**< The chain is in the normal OK state */ + FLAC__METADATA_CHAIN_STATUS_OK = 0, + /**< The chain is in the normal OK state */ - FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ + FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ - FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, - /**< The chain could not open the target file */ + FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, + /**< The chain could not open the target file */ - FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, - /**< The chain could not find the FLAC signature at the start of the file */ + FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, + /**< The chain could not find the FLAC signature at the start of the file */ - FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, - /**< The chain tried to write to a file that was not writable */ + FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, + /**< The chain tried to write to a file that was not writable */ - FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, - /**< The chain encountered input that does not conform to the FLAC metadata specification */ + FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, + /**< The chain encountered input that does not conform to the FLAC metadata specification */ - FLAC__METADATA_CHAIN_STATUS_READ_ERROR, - /**< The chain encountered an error while reading the FLAC file */ + FLAC__METADATA_CHAIN_STATUS_READ_ERROR, + /**< The chain encountered an error while reading the FLAC file */ - FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, - /**< The chain encountered an error while seeking in the FLAC file */ + FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, + /**< The chain encountered an error while seeking in the FLAC file */ - FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, - /**< The chain encountered an error while writing the FLAC file */ + FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, + /**< The chain encountered an error while writing the FLAC file */ - FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, - /**< The chain encountered an error renaming the FLAC file */ + FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, + /**< The chain encountered an error renaming the FLAC file */ - FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, - /**< The chain encountered an error removing the temporary file */ + FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, + /**< The chain encountered an error removing the temporary file */ - FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ + FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ - FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, - /**< The caller violated an assertion or an unexpected error occurred */ + FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, + /**< The caller violated an assertion or an unexpected error occurred */ - FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, - /**< One or more of the required callbacks was NULL */ + FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, + /**< One or more of the required callbacks was NULL */ - FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, - /**< FLAC__metadata_chain_write() was called on a chain read by - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * or - * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() - * was called on a chain read by - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Matching read/write methods must always be used. */ + FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, + /** < FLAC__metadata_chain_write() was called on a chain read by + FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + or + FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() + was called on a chain read by + FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + Matching read/write methods must always be used. */ - FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL - /**< FLAC__metadata_chain_write_with_callbacks() was called when the - * chain write requires a tempfile; use - * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. - * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was - * called when the chain write does not require a tempfile; use - * FLAC__metadata_chain_write_with_callbacks() instead. - * Always check FLAC__metadata_chain_check_if_tempfile_needed() - * before writing via callbacks. */ + FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL + /** < FLAC__metadata_chain_write_with_callbacks() was called when the + chain write requires a tempfile; use + FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. + Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was + called when the chain write does not require a tempfile; use + FLAC__metadata_chain_write_with_callbacks() instead. + Always check FLAC__metadata_chain_check_if_tempfile_needed() + before writing via callbacks. */ } FLAC__Metadata_ChainStatus; /** Maps a FLAC__Metadata_ChainStatus to a C string. - * - * Using a FLAC__Metadata_ChainStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__Metadata_ChainStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; /*********** FLAC__Metadata_Chain ***********/ /** Create a new chain instance. - * - * \retval FLAC__Metadata_Chain* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + \retval FLAC__Metadata_Chain + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); /** Free a chain instance. Deletes the object pointed to by \a chain. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ + + \param chain A pointer to an existing chain. + \assert + \code chain != NULL \endcode +*/ FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); /** Get the current status of the chain. Call this after a function - * returns \c false to get the reason for the error. Also resets the - * status to FLAC__METADATA_CHAIN_STATUS_OK. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__Metadata_ChainStatus - * The current status of the chain. - */ + returns \c false to get the reason for the error. Also resets the + status to FLAC__METADATA_CHAIN_STATUS_OK. + + \param chain A pointer to an existing chain. + \assert + \code chain != NULL \endcode + \retval FLAC__Metadata_ChainStatus + The current status of the chain. +*/ FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); /** Read all metadata from a FLAC file into the chain. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ + + \param chain A pointer to an existing chain. + \param filename The path to the FLAC file to read. + \assert + \code chain != NULL \endcode + \code filename != NULL \endcode + \retval FLAC__bool + \c true if a valid list of metadata blocks was read from + \a filename, else \c false. On failure, check the status with + FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); /** Read all metadata from an Ogg FLAC file into the chain. - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the Ogg FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ + + \note Ogg FLAC metadata data writing is not supported yet and + FLAC__metadata_chain_write() will fail. + + \param chain A pointer to an existing chain. + \param filename The path to the Ogg FLAC file to read. + \assert + \code chain != NULL \endcode + \code filename != NULL \endcode + \retval FLAC__bool + \c true if a valid list of metadata blocks was read from + \a filename, else \c false. On failure, check the status with + FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); /** Read all metadata from a FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ + + The \a handle need only be open for reading, but must be seekable. + The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + for Windows). + + \param chain A pointer to an existing chain. + \param handle The I/O handle of the FLAC stream to read. The + handle will NOT be closed after the metadata is read; + that is the duty of the caller. + \param callbacks + A set of callbacks to use for I/O. The mandatory + callbacks are \a read, \a seek, and \a tell. + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if a valid list of metadata blocks was read from + \a handle, else \c false. On failure, check the status with + FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); /** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the Ogg FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ + + The \a handle need only be open for reading, but must be seekable. + The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + for Windows). + + \note Ogg FLAC metadata data writing is not supported yet and + FLAC__metadata_chain_write() will fail. + + \param chain A pointer to an existing chain. + \param handle The I/O handle of the Ogg FLAC stream to read. The + handle will NOT be closed after the metadata is read; + that is the duty of the caller. + \param callbacks + A set of callbacks to use for I/O. The mandatory + callbacks are \a read, \a seek, and \a tell. + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if a valid list of metadata blocks was read from + \a handle, else \c false. On failure, check the status with + FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); /** Checks if writing the given chain would require the use of a - * temporary file, or if it could be written in place. - * - * Under certain conditions, padding can be utilized so that writing - * edited metadata back to the FLAC file does not require rewriting the - * entire file. If rewriting is required, then a temporary workfile is - * required. When writing metadata using callbacks, you must check - * this function to know whether to call - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When - * writing with FLAC__metadata_chain_write(), the temporary file is - * handled internally. - * - * \param chain A pointer to an existing chain. - * \param use_padding - * Whether or not padding will be allowed to be used - * during the write. The value of \a use_padding given - * here must match the value later passed to - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if writing the current chain would require a tempfile, or - * \c false if metadata can be written in place. - */ + temporary file, or if it could be written in place. + + Under certain conditions, padding can be utilized so that writing + edited metadata back to the FLAC file does not require rewriting the + entire file. If rewriting is required, then a temporary workfile is + required. When writing metadata using callbacks, you must check + this function to know whether to call + FLAC__metadata_chain_write_with_callbacks() or + FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When + writing with FLAC__metadata_chain_write(), the temporary file is + handled internally. + + \param chain A pointer to an existing chain. + \param use_padding + Whether or not padding will be allowed to be used + during the write. The value of \a use_padding given + here must match the value later passed to + FLAC__metadata_chain_write_with_callbacks() or + FLAC__metadata_chain_write_with_callbacks_with_tempfile(). + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if writing the current chain would require a tempfile, or + \c false if metadata can be written in place. +*/ FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); /** Write all metadata out to the FLAC file. This function tries to be as - * efficient as possible; how the metadata is actually written is shown by - * the following: - * - * If the current chain is the same size as the existing metadata, the new - * data is written in place. - * - * If the current chain is longer than the existing metadata, and - * \a use_padding is \c true, and the last block is a PADDING block of - * sufficient length, the function will truncate the final padding block - * so that the overall size of the metadata is the same as the existing - * metadata, and then just rewrite the metadata. Otherwise, if not all of - * the above conditions are met, the entire FLAC file must be rewritten. - * If you want to use padding this way it is a good idea to call - * FLAC__metadata_chain_sort_padding() first so that you have the maximum - * amount of padding to work with, unless you need to preserve ordering - * of the PADDING blocks for some reason. - * - * If the current chain is shorter than the existing metadata, and - * \a use_padding is \c true, and the final block is a PADDING block, the padding - * is extended to make the overall size the same as the existing data. If - * \a use_padding is \c true and the last block is not a PADDING block, a new - * PADDING block is added to the end of the new data to make it the same - * size as the existing data (if possible, see the note to - * FLAC__metadata_simple_iterator_set_block() about the four byte limit) - * and the new data is written in place. If none of the above apply or - * \a use_padding is \c false, the entire FLAC file is rewritten. - * - * If \a preserve_file_stats is \c true, the owner and modification time will - * be preserved even if the FLAC file is written. - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). - * - * \param chain A pointer to an existing chain. - * \param use_padding See above. - * \param preserve_file_stats See above. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ + efficient as possible; how the metadata is actually written is shown by + the following: + + If the current chain is the same size as the existing metadata, the new + data is written in place. + + If the current chain is longer than the existing metadata, and + \a use_padding is \c true, and the last block is a PADDING block of + sufficient length, the function will truncate the final padding block + so that the overall size of the metadata is the same as the existing + metadata, and then just rewrite the metadata. Otherwise, if not all of + the above conditions are met, the entire FLAC file must be rewritten. + If you want to use padding this way it is a good idea to call + FLAC__metadata_chain_sort_padding() first so that you have the maximum + amount of padding to work with, unless you need to preserve ordering + of the PADDING blocks for some reason. + + If the current chain is shorter than the existing metadata, and + \a use_padding is \c true, and the final block is a PADDING block, the padding + is extended to make the overall size the same as the existing data. If + \a use_padding is \c true and the last block is not a PADDING block, a new + PADDING block is added to the end of the new data to make it the same + size as the existing data (if possible, see the note to + FLAC__metadata_simple_iterator_set_block() about the four byte limit) + and the new data is written in place. If none of the above apply or + \a use_padding is \c false, the entire FLAC file is rewritten. + + If \a preserve_file_stats is \c true, the owner and modification time will + be preserved even if the FLAC file is written. + + For this write function to be used, the chain must have been read with + FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not + FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). + + \param chain A pointer to an existing chain. + \param use_padding See above. + \param preserve_file_stats See above. + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if the write succeeded, else \c false. On failure, + check the status with FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); /** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * The \a handle must be open for updating and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" - * for Windows). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c false. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O. The mandatory - * callbacks are \a write and \a seek. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ + + (See FLAC__metadata_chain_write() for the details on how padding is + used to write metadata in place if possible.) + + The \a handle must be open for updating and be seekable. The + equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" + for Windows). + + For this write function to be used, the chain must have been read with + FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + \c false. + + \param chain A pointer to an existing chain. + \param use_padding See FLAC__metadata_chain_write() + \param handle The I/O handle of the FLAC stream to write. The + handle will NOT be closed after the metadata is + written; that is the duty of the caller. + \param callbacks A set of callbacks to use for I/O. The mandatory + callbacks are \a write and \a seek. + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if the write succeeded, else \c false. On failure, + check the status with FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); /** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * This version of the write-with-callbacks function must be used when - * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In - * this function, you must supply an I/O handle corresponding to the - * FLAC file to edit, and a temporary handle to which the new FLAC - * file will be written. It is the caller's job to move this temporary - * FLAC file on top of the original FLAC file to complete the metadata - * edit. - * - * The \a handle must be open for reading and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * The \a temp_handle must be open for writing. The - * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" - * for Windows). It should be an empty stream, or at least positioned - * at the start-of-file (in which case it is the caller's duty to - * truncate it on return). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c true. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the original FLAC stream to read. - * The handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O on \a handle. - * The mandatory callbacks are \a read, \a seek, and - * \a eof. - * \param temp_handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param temp_callbacks - * A set of callbacks to use for I/O on temp_handle. - * The only mandatory callback is \a write. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ + + (See FLAC__metadata_chain_write() for the details on how padding is + used to write metadata in place if possible.) + + This version of the write-with-callbacks function must be used when + FLAC__metadata_chain_check_if_tempfile_needed() returns true. In + this function, you must supply an I/O handle corresponding to the + FLAC file to edit, and a temporary handle to which the new FLAC + file will be written. It is the caller's job to move this temporary + FLAC file on top of the original FLAC file to complete the metadata + edit. + + The \a handle must be open for reading and be seekable. The + equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + for Windows). + + The \a temp_handle must be open for writing. The + equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" + for Windows). It should be an empty stream, or at least positioned + at the start-of-file (in which case it is the caller's duty to + truncate it on return). + + For this write function to be used, the chain must have been read with + FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + \c true. + + \param chain A pointer to an existing chain. + \param use_padding See FLAC__metadata_chain_write() + \param handle The I/O handle of the original FLAC stream to read. + The handle will NOT be closed after the metadata is + written; that is the duty of the caller. + \param callbacks A set of callbacks to use for I/O on \a handle. + The mandatory callbacks are \a read, \a seek, and + \a eof. + \param temp_handle The I/O handle of the FLAC stream to write. The + handle will NOT be closed after the metadata is + written; that is the duty of the caller. + \param temp_callbacks + A set of callbacks to use for I/O on temp_handle. + The only mandatory callback is \a write. + \assert + \code chain != NULL \endcode + \retval FLAC__bool + \c true if the write succeeded, else \c false. On failure, + check the status with FLAC__metadata_chain_status(). +*/ FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); /** Merge adjacent PADDING blocks into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ + + \note This function does not write to the FLAC file, it only + modifies the chain. + + \warning Any iterator on the current chain will become invalid after this + call. You should delete the iterator and get a new one. + + \param chain A pointer to an existing chain. + \assert + \code chain != NULL \endcode +*/ FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); /** This function will move all PADDING blocks to the end on the metadata, - * then merge them into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ + then merge them into a single block. + + \note This function does not write to the FLAC file, it only + modifies the chain. + + \warning Any iterator on the current chain will become invalid after this + call. You should delete the iterator and get a new one. + + \param chain A pointer to an existing chain. + \assert + \code chain != NULL \endcode +*/ FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); /*********** FLAC__Metadata_Iterator ***********/ /** Create a new iterator instance. - * - * \retval FLAC__Metadata_Iterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + \retval FLAC__Metadata_Iterator + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); /** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ + + \param iterator A pointer to an existing iterator. + \assert + \code iterator != NULL \endcode +*/ FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); /** Initialize the iterator to point to the first metadata block in the - * given chain. - * - * \param iterator A pointer to an existing iterator. - * \param chain A pointer to an existing and initialized (read) chain. - * \assert - * \code iterator != NULL \endcode - * \code chain != NULL \endcode - */ + given chain. + + \param iterator A pointer to an existing iterator. + \param chain A pointer to an existing and initialized (read) chain. + \assert + \code iterator != NULL \endcode + \code chain != NULL \endcode +*/ FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); /** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ + already at the end. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__bool + \c false if already at the last metadata block of the chain, else + \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); /** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ + already at the beginning. + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__bool + \c false if already at the first metadata block of the chain, else + \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); /** Get the type of the metadata block at the current position. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__MetadataType + The type of the metadata block at the current iterator position. +*/ FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); /** Get the metadata block at the current position. You can modify - * the block in place but must write the chain before the changes - * are reflected to the FLAC file. You do not need to call - * FLAC__metadata_iterator_set_block() to reflect the changes; - * the pointer returned by FLAC__metadata_iterator_get_block() - * points directly into the chain. - * - * \warning - * Do not call FLAC__metadata_object_delete() on the returned object; - * to delete a block use FLAC__metadata_iterator_delete_block(). - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block. - */ + the block in place but must write the chain before the changes + are reflected to the FLAC file. You do not need to call + FLAC__metadata_iterator_set_block() to reflect the changes; + the pointer returned by FLAC__metadata_iterator_get_block() + points directly into the chain. + + \warning + Do not call FLAC__metadata_object_delete() on the returned object; + to delete a block use FLAC__metadata_iterator_delete_block(). + + \param iterator A pointer to an existing initialized iterator. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__StreamMetadata + The current metadata block. +*/ FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); /** Set the metadata block at the current position, replacing the existing - * block. The new block passed in becomes owned by the chain and it will be - * deleted when the chain is deleted. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ + block. The new block passed in becomes owned by the chain and it will be + deleted when the chain is deleted. + + \param iterator A pointer to an existing initialized iterator. + \param block A pointer to a metadata block. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \code block != NULL \endcode + \retval FLAC__bool + \c false if the conditions in the above description are not met, or + a memory allocation error occurs, otherwise \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); /** Removes the current block from the chain. If \a replace_with_padding is - * \c true, the block will instead be replaced with a padding block of equal - * size. You can not delete the STREAMINFO block. The iterator will be - * left pointing to the block before the one just "deleted", even if - * \a replace_with_padding is \c true. - * - * \param iterator A pointer to an existing initialized iterator. - * \param replace_with_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, - * otherwise \c true. - */ + \c true, the block will instead be replaced with a padding block of equal + size. You can not delete the STREAMINFO block. The iterator will be + left pointing to the block before the one just "deleted", even if + \a replace_with_padding is \c true. + + \param iterator A pointer to an existing initialized iterator. + \param replace_with_padding See above. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__bool + \c false if the conditions in the above description are not met, + otherwise \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); /** Insert a new block before the current block. You cannot insert a block - * before the first STREAMINFO block. You cannot insert a STREAMINFO block - * as there can be only one, the one that already exists at the head when you - * read in a chain. The chain takes ownership of the new block and it will be - * deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ + before the first STREAMINFO block. You cannot insert a STREAMINFO block + as there can be only one, the one that already exists at the head when you + read in a chain. The chain takes ownership of the new block and it will be + deleted when the chain is deleted. The iterator will be left pointing to + the new block. + + \param iterator A pointer to an existing initialized iterator. + \param block A pointer to a metadata block to insert. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__bool + \c false if the conditions in the above description are not met, or + a memory allocation error occurs, otherwise \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); /** Insert a new block after the current block. You cannot insert a STREAMINFO - * block as there can be only one, the one that already exists at the head when - * you read in a chain. The chain takes ownership of the new block and it will - * be deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ + block as there can be only one, the one that already exists at the head when + you read in a chain. The chain takes ownership of the new block and it will + be deleted when the chain is deleted. The iterator will be left pointing to + the new block. + + \param iterator A pointer to an existing initialized iterator. + \param block A pointer to a metadata block to insert. + \assert + \code iterator != NULL \endcode + \a iterator has been successfully initialized with + FLAC__metadata_iterator_init() + \retval FLAC__bool + \c false if the conditions in the above description are not met, or + a memory allocation error occurs, otherwise \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); /* \} */ /** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods - * \ingroup flac_metadata - * - * \brief - * This module contains methods for manipulating FLAC metadata objects. - * - * Since many are variable length we have to be careful about the memory - * management. We decree that all pointers to data in the object are - * owned by the object and memory-managed by the object. - * - * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() - * functions to create all instances. When using the - * FLAC__metadata_object_set_*() functions to set pointers to data, set - * \a copy to \c true to have the function make it's own copy of the data, or - * to \c false to give the object ownership of your data. In the latter case - * your pointer must be freeable by free() and will be free()d when the object - * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as - * the data pointer to a FLAC__metadata_object_set_*() function as long as - * the length argument is 0 and the \a copy argument is \c false. - * - * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function - * will return \c NULL in the case of a memory allocation error, otherwise a new - * object. The FLAC__metadata_object_set_*() functions return \c false in the - * case of a memory allocation error. - * - * We don't have the convenience of C++ here, so note that the library relies - * on you to keep the types straight. In other words, if you pass, for - * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to - * FLAC__metadata_object_application_set_data(), you will get an assertion - * failure. - * - * For convenience the FLAC__metadata_object_vorbiscomment_*() functions - * maintain a trailing NUL on each Vorbis comment entry. This is not counted - * toward the length or stored in the stream, but it can make working with plain - * comments (those that don't contain embedded-NULs in the value) easier. - * Entries passed into these functions have trailing NULs added if missing, and - * returned entries are guaranteed to have a trailing NUL. - * - * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis - * comment entry/name/value will first validate that it complies with the Vorbis - * comment specification and return false if it does not. - * - * There is no need to recalculate the length field on metadata blocks you - * have modified. They will be calculated automatically before they are - * written back to a file. - * - * \{ - */ + \ingroup flac_metadata + + \brief + This module contains methods for manipulating FLAC metadata objects. + + Since many are variable length we have to be careful about the memory + management. We decree that all pointers to data in the object are + owned by the object and memory-managed by the object. + + Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() + functions to create all instances. When using the + FLAC__metadata_object_set_*() functions to set pointers to data, set + \a copy to \c true to have the function make it's own copy of the data, or + to \c false to give the object ownership of your data. In the latter case + your pointer must be freeable by free() and will be free()d when the object + is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as + the data pointer to a FLAC__metadata_object_set_*() function as long as + the length argument is 0 and the \a copy argument is \c false. + + The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function + will return \c NULL in the case of a memory allocation error, otherwise a new + object. The FLAC__metadata_object_set_*() functions return \c false in the + case of a memory allocation error. + + We don't have the convenience of C++ here, so note that the library relies + on you to keep the types straight. In other words, if you pass, for + example, a FLAC__StreamMetadata* that represents a STREAMINFO block to + FLAC__metadata_object_application_set_data(), you will get an assertion + failure. + + For convenience the FLAC__metadata_object_vorbiscomment_*() functions + maintain a trailing NUL on each Vorbis comment entry. This is not counted + toward the length or stored in the stream, but it can make working with plain + comments (those that don't contain embedded-NULs in the value) easier. + Entries passed into these functions have trailing NULs added if missing, and + returned entries are guaranteed to have a trailing NUL. + + The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis + comment entry/name/value will first validate that it complies with the Vorbis + comment specification and return false if it does not. + + There is no need to recalculate the length field on metadata blocks you + have modified. They will be calculated automatically before they are + written back to a file. + + \{ +*/ /** Create a new metadata object instance of the given type. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0, - * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have - * the vendor string set (but zero comments). - * - * Do not pass in a value greater than or equal to - * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're - * doing. - * - * \param type Type of object to create - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory or the type code is - * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. - */ + + The object will be "empty"; i.e. values and data pointers will be \c 0, + with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have + the vendor string set (but zero comments). + + Do not pass in a value greater than or equal to + \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're + doing. + + \param type Type of object to create + \retval FLAC__StreamMetadata + \c NULL if there was an error allocating memory or the type code is + greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. +*/ FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); /** Create a copy of an existing metadata object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new block and - * is responsible for freeing it with FLAC__metadata_object_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + The copy is a "deep" copy, i.e. dynamically allocated data within the + object is also copied. The caller takes ownership of the new block and + is responsible for freeing it with FLAC__metadata_object_delete(). + + \param object Pointer to object to copy. + \assert + \code object != NULL \endcode + \retval FLAC__StreamMetadata + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); /** Free a metadata object. Deletes the object pointed to by \a object. - * - * The delete is a "deep" delete, i.e. dynamically allocated data within the - * object is also deleted. - * - * \param object A pointer to an existing object. - * \assert - * \code object != NULL \endcode - */ + + The delete is a "deep" delete, i.e. dynamically allocated data within the + object is also deleted. + + \param object A pointer to an existing object. + \assert + \code object != NULL \endcode +*/ FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); /** Compares two metadata objects. - * - * The compare is "deep", i.e. dynamically allocated data within the - * object is also compared. - * - * \param block1 A pointer to an existing object. - * \param block2 A pointer to an existing object. - * \assert - * \code block1 != NULL \endcode - * \code block2 != NULL \endcode - * \retval FLAC__bool - * \c true if objects are identical, else \c false. - */ + + The compare is "deep", i.e. dynamically allocated data within the + object is also compared. + + \param block1 A pointer to an existing object. + \param block2 A pointer to an existing object. + \assert + \code block1 != NULL \endcode + \code block2 != NULL \endcode + \retval FLAC__bool + \c true if objects are identical, else \c false. +*/ FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); /** Sets the application data of an APPLICATION block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. The existing data will be freed if this - * function is successful, otherwise the original data will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing APPLICATION object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the data is stored; otherwise, the object + takes ownership of the pointer. The existing data will be freed if this + function is successful, otherwise the original data will remain if \a copy + is \c true and malloc() fails. + + \note It is safe to pass a const pointer to \a data if \a copy is \c true. + + \param object A pointer to an existing APPLICATION object. + \param data A pointer to the data to set. + \param length The length of \a data in bytes. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode + \code (data != NULL && length > 0) || + (data == NULL && length == 0 && copy == false) \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, uint32_t length, FLAC__bool copy); /** Resize the seekpoint array. - * - * If the size shrinks, elements will truncated; if it grows, new placeholder - * points will be added to the end. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param new_num_points The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || - * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ + + If the size shrinks, elements will truncated; if it grows, new placeholder + points will be added to the end. + + \param object A pointer to an existing SEEKTABLE object. + \param new_num_points The desired length of the array; may be \c 0. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || + (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode + \retval FLAC__bool + \c false if memory allocation error, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, uint32_t new_num_points); /** Set a seekpoint in a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - */ + + \param object A pointer to an existing SEEKTABLE object. + \param point_num Index into seekpoint array to set. + \param point The point to set. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code object->data.seek_table.num_points > point_num \endcode +*/ FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, uint32_t point_num, FLAC__StreamMetadata_SeekPoint point); /** Insert a seekpoint into a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points >= point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ + + \param object A pointer to an existing SEEKTABLE object. + \param point_num Index into seekpoint array to set. + \param point The point to set. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code object->data.seek_table.num_points >= point_num \endcode + \retval FLAC__bool + \c false if memory allocation error, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, uint32_t point_num, FLAC__StreamMetadata_SeekPoint point); /** Delete a seekpoint from a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ + + \param object A pointer to an existing SEEKTABLE object. + \param point_num Index into seekpoint array to set. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code object->data.seek_table.num_points > point_num \endcode + \retval FLAC__bool + \c false if memory allocation error, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, uint32_t point_num); /** Check a seektable to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ + See the format specification for limits on the contents of the + seektable. + + \param object A pointer to an existing SEEKTABLE object. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \retval FLAC__bool + \c false if seek table is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); /** Append a number of placeholder points to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + + \note + As with the other ..._seektable_template_... functions, you should + call FLAC__metadata_object_seektable_template_sort() when finished + to make the seek table legal. + + \param object A pointer to an existing SEEKTABLE object. + \param num The number of placeholder points to append. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, uint32_t num); /** Append a specific seek point template to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_number The sample number of the seek point template. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + + \note + As with the other ..._seektable_template_... functions, you should + call FLAC__metadata_object_seektable_template_sort() when finished + to make the seek table legal. + + \param object A pointer to an existing SEEKTABLE object. + \param sample_number The sample number of the seek point template. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); /** Append specific seek point templates to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_numbers An array of sample numbers for the seek points. - * \param num The number of seek point templates to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + + \note + As with the other ..._seektable_template_... functions, you should + call FLAC__metadata_object_seektable_template_sort() when finished + to make the seek table legal. + + \param object A pointer to an existing SEEKTABLE object. + \param sample_numbers An array of sample numbers for the seek points. + \param num The number of seek point templates to append. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], uint32_t num); /** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced approximately - * \a total_samples / \a num samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + seek table. + + \note + As with the other ..._seektable_template_... functions, you should + call FLAC__metadata_object_seektable_template_sort() when finished + to make the seek table legal. + + \param object A pointer to an existing SEEKTABLE object. + \param num The number of placeholder points to append. + \param total_samples The total number of samples to be encoded; + the seekpoints will be spaced approximately + \a total_samples / \a num samples apart. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code total_samples > 0 \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, uint32_t num, FLAC__uint64 total_samples); /** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param samples The number of samples apart to space the placeholder - * points. The first point will be at sample \c 0, the - * second at sample \a samples, then 2*\a samples, and - * so on. As long as \a samples and \a total_samples - * are greater than \c 0, there will always be at least - * one seekpoint at sample \c 0. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced - * \a samples samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code samples > 0 \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + seek table. + + \note + As with the other ..._seektable_template_... functions, you should + call FLAC__metadata_object_seektable_template_sort() when finished + to make the seek table legal. + + \param object A pointer to an existing SEEKTABLE object. + \param samples The number of samples apart to space the placeholder + points. The first point will be at sample \c 0, the + second at sample \a samples, then 2*\a samples, and + so on. As long as \a samples and \a total_samples + are greater than \c 0, there will always be at least + one seekpoint at sample \c 0. + \param total_samples The total number of samples to be encoded; + the seekpoints will be spaced + \a samples samples apart. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \code samples > 0 \endcode + \code total_samples > 0 \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, uint32_t samples, FLAC__uint64 total_samples); /** Sort a seek table's seek points according to the format specification, - * removing duplicates. - * - * \param object A pointer to a seek table to be sorted. - * \param compact If \c false, behaves like FLAC__format_seektable_sort(). - * If \c true, duplicates are deleted and the seek table is - * shrunk appropriately; the number of placeholder points - * present in the seek table will be the same after the call - * as before. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + removing duplicates. + + \param object A pointer to a seek table to be sorted. + \param compact If \c false, behaves like FLAC__format_seektable_sort(). + If \c true, duplicates are deleted and the seek table is + shrunk appropriately; the number of placeholder points + present in the seek table will be the same after the call + as before. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); /** Sets the vendor string in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The entry to set the vendor string to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + For convenience, a trailing NUL is added to the entry if it doesn't have + one already. + + If \a copy is \c true, a copy of the entry is stored; otherwise, the object + takes ownership of the \c entry.entry pointer. + + \note If this function returns \c false, the caller still owns the + pointer. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param entry The entry to set the vendor string to. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code (entry.entry != NULL && entry.length > 0) || + (entry.entry == NULL && entry.length == 0) \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); /** Resize the comment array. - * - * If the size shrinks, elements will truncated; if it grows, new empty - * fields will be added to the end. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param new_num_comments The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || - * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ + + If the size shrinks, elements will truncated; if it grows, new empty + fields will be added to the end. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param new_num_comments The desired length of the array; may be \c 0. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || + (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode + \retval FLAC__bool + \c false if memory allocation fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, uint32_t new_num_comments); /** Sets a comment in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num Index into comment array to set. - * \param entry The entry to set the comment to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code comment_num < object->data.vorbis_comment.num_comments \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + For convenience, a trailing NUL is added to the entry if it doesn't have + one already. + + If \a copy is \c true, a copy of the entry is stored; otherwise, the object + takes ownership of the \c entry.entry pointer. + + \note If this function returns \c false, the caller still owns the + pointer. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param comment_num Index into comment array to set. + \param entry The entry to set the comment to. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code comment_num < object->data.vorbis_comment.num_comments \endcode + \code (entry.entry != NULL && entry.length > 0) || + (entry.entry == NULL && entry.length == 0) \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, uint32_t comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); /** Insert a comment in a VORBIS_COMMENT block at the given index. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index at which to insert the comment. The comments - * at and after \a comment_num move right one position. - * To append a comment to the end, set \a comment_num to - * \c object->data.vorbis_comment.num_comments . - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments >= comment_num \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + For convenience, a trailing NUL is added to the entry if it doesn't have + one already. + + If \a copy is \c true, a copy of the entry is stored; otherwise, the object + takes ownership of the \c entry.entry pointer. + + \note If this function returns \c false, the caller still owns the + pointer. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param comment_num The index at which to insert the comment. The comments + at and after \a comment_num move right one position. + To append a comment to the end, set \a comment_num to + \c object->data.vorbis_comment.num_comments . + \param entry The comment to insert. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code object->data.vorbis_comment.num_comments >= comment_num \endcode + \code (entry.entry != NULL && entry.length > 0) || + (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, uint32_t comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); /** Appends a comment to a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + For convenience, a trailing NUL is added to the entry if it doesn't have + one already. + + If \a copy is \c true, a copy of the entry is stored; otherwise, the object + takes ownership of the \c entry.entry pointer. + + \note If this function returns \c false, the caller still owns the + pointer. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param entry The comment to insert. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code (entry.entry != NULL && entry.length > 0) || + (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); /** Replaces comments in a VORBIS_COMMENT block with a new one. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * Depending on the value of \a all, either all or just the first comment - * whose field name(s) match the given entry's name will be replaced by the - * given entry. If no comments match, \a entry will simply be appended. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param all If \c true, all comments whose field name matches - * \a entry's field name will be removed, and \a entry will - * be inserted at the position of the first matching - * comment. If \c false, only the first comment whose - * field name matches \a entry's field name will be - * replaced with \a entry. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + For convenience, a trailing NUL is added to the entry if it doesn't have + one already. + + Depending on the value of \a all, either all or just the first comment + whose field name(s) match the given entry's name will be replaced by the + given entry. If no comments match, \a entry will simply be appended. + + If \a copy is \c true, a copy of the entry is stored; otherwise, the object + takes ownership of the \c entry.entry pointer. + + \note If this function returns \c false, the caller still owns the + pointer. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param entry The comment to insert. + \param all If \c true, all comments whose field name matches + \a entry's field name will be removed, and \a entry will + be inserted at the position of the first matching + comment. If \c false, only the first comment whose + field name matches \a entry's field name will be + replaced with \a entry. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code (entry.entry != NULL && entry.length > 0) || + (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); /** Delete a comment in a VORBIS_COMMENT block at the given index. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index of the comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments > comment_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + + \param object A pointer to an existing VORBIS_COMMENT object. + \param comment_num The index of the comment to delete. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code object->data.vorbis_comment.num_comments > comment_num \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, uint32_t comment_num); /** Creates a Vorbis comment entry from NUL-terminated name and value strings. - * - * On return, the filled-in \a entry->entry pointer will point to malloc()ed - * memory and shall be owned by the caller. For convenience the entry will - * have a terminating NUL. - * - * \param entry A pointer to a Vorbis comment entry. The entry's - * \c entry pointer should not point to allocated - * memory as it will be overwritten. - * \param field_name The field name in ASCII, \c NUL terminated. - * \param field_value The field value in UTF-8, \c NUL terminated. - * \assert - * \code entry != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if malloc() fails, or if \a field_name or \a field_value does - * not comply with the Vorbis comment specification, else \c true. - */ + + On return, the filled-in \a entry->entry pointer will point to malloc()ed + memory and shall be owned by the caller. For convenience the entry will + have a terminating NUL. + + \param entry A pointer to a Vorbis comment entry. The entry's + \c entry pointer should not point to allocated + memory as it will be overwritten. + \param field_name The field name in ASCII, \c NUL terminated. + \param field_value The field value in UTF-8, \c NUL terminated. + \assert + \code entry != NULL \endcode + \code field_name != NULL \endcode + \code field_value != NULL \endcode + \retval FLAC__bool + \c false if malloc() fails, or if \a field_name or \a field_value does + not comply with the Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); /** Splits a Vorbis comment entry into NUL-terminated name and value strings. - * - * The returned pointers to name and value will be allocated by malloc() - * and shall be owned by the caller. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The address of where the returned pointer to the - * field name will be stored. - * \param field_value The address of where the returned pointer to the - * field value will be stored. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \code memchr(entry.entry, '=', entry.length) != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ + + The returned pointers to name and value will be allocated by malloc() + and shall be owned by the caller. + + \param entry An existing Vorbis comment entry. + \param field_name The address of where the returned pointer to the + field name will be stored. + \param field_value The address of where the returned pointer to the + field value will be stored. + \assert + \code (entry.entry != NULL && entry.length > 0) \endcode + \code memchr(entry.entry, '=', entry.length) != NULL \endcode + \code field_name != NULL \endcode + \code field_value != NULL \endcode + \retval FLAC__bool + \c false if memory allocation fails or \a entry does not comply with the + Vorbis comment specification, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); /** Check if the given Vorbis comment entry's field name matches the given - * field name. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The field name to check. - * \param field_name_length The length of \a field_name, not including the - * terminating \c NUL. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \retval FLAC__bool - * \c true if the field names match, else \c false - */ + field name. + + \param entry An existing Vorbis comment entry. + \param field_name The field name to check. + \param field_name_length The length of \a field_name, not including the + terminating \c NUL. + \assert + \code (entry.entry != NULL && entry.length > 0) \endcode + \retval FLAC__bool + \c true if the field names match, else \c false +*/ FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, uint32_t field_name_length); /** Find a Vorbis comment with the given field name. - * - * The search begins at entry number \a offset; use an offset of 0 to - * search from the beginning of the comment array. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param offset The offset into the comment array from where to start - * the search. - * \param field_name The field name of the comment to find. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code field_name != NULL \endcode - * \retval int - * The offset in the comment array of the first comment whose field - * name matches \a field_name, or \c -1 if no match was found. - */ + + The search begins at entry number \a offset; use an offset of 0 to + search from the beginning of the comment array. + + \param object A pointer to an existing VORBIS_COMMENT object. + \param offset The offset into the comment array from where to start + the search. + \param field_name The field name of the comment to find. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \code field_name != NULL \endcode + \retval int + The offset in the comment array of the first comment whose field + name matches \a field_name, or \c -1 if no match was found. +*/ FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, uint32_t offset, const char *field_name); /** Remove first Vorbis comment matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * \c 1 for one matching entry deleted. - */ + + \param object A pointer to an existing VORBIS_COMMENT object. + \param field_name The field name of comment to delete. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \retval int + \c -1 for memory allocation error, \c 0 for no matching entries, + \c 1 for one matching entry deleted. +*/ FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); /** Remove all Vorbis comments matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comments to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * else the number of matching entries deleted. - */ + + \param object A pointer to an existing VORBIS_COMMENT object. + \param field_name The field name of comments to delete. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + \retval int + \c -1 for memory allocation error, \c 0 for no matching entries, + else the number of matching entries deleted. +*/ FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); /** Create a new CUESHEET track instance. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0. - * - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + The object will be "empty"; i.e. values and data pointers will be \c 0. + + \retval FLAC__StreamMetadata_CueSheet_Track + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); /** Create a copy of an existing CUESHEET track object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new object and - * is responsible for freeing it with - * FLAC__metadata_object_cuesheet_track_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ + + The copy is a "deep" copy, i.e. dynamically allocated data within the + object is also copied. The caller takes ownership of the new object and + is responsible for freeing it with + FLAC__metadata_object_cuesheet_track_delete(). + + \param object Pointer to object to copy. + \assert + \code object != NULL \endcode + \retval FLAC__StreamMetadata_CueSheet_Track + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); /** Delete a CUESHEET track object - * - * \param object A pointer to an existing CUESHEET track object. - * \assert - * \code object != NULL \endcode - */ + + \param object A pointer to an existing CUESHEET track object. + \assert + \code object != NULL \endcode +*/ FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); /** Resize a track's index point array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * indices will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param new_num_indices The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || - * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ + + If the size shrinks, elements will truncated; if it grows, new blank + indices will be added to the end. + + \param object A pointer to an existing CUESHEET object. + \param track_num The index of the track to modify. NOTE: this is not + necessarily the same as the track's \a number field. + \param new_num_indices The desired length of the array; may be \c 0. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks > track_num \endcode + \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || + (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode + \retval FLAC__bool + \c false if memory allocation error, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, uint32_t track_num, uint32_t new_num_indices); /** Insert an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \param index The index point to insert. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + + \param object A pointer to an existing CUESHEET object. + \param track_num The index of the track to modify. NOTE: this is not + necessarily the same as the track's \a number field. + \param index_num The index into the track's index array at which to + insert the index point. NOTE: this is not necessarily + the same as the index point's \a number field. The + indices at and after \a index_num move right one + position. To append an index point to the end, set + \a index_num to + \c object->data.cue_sheet.tracks[track_num].num_indices . + \param index The index point to insert. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks > track_num \endcode + \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, uint32_t track_num, uint32_t index_num, FLAC__StreamMetadata_CueSheet_Index index); /** Insert a blank index point in a CUESHEET track at the given index. - * - * A blank index point is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + + A blank index point is one in which all field values are zero. + + \param object A pointer to an existing CUESHEET object. + \param track_num The index of the track to modify. NOTE: this is not + necessarily the same as the track's \a number field. + \param index_num The index into the track's index array at which to + insert the index point. NOTE: this is not necessarily + the same as the index point's \a number field. The + indices at and after \a index_num move right one + position. To append an index point to the end, set + \a index_num to + \c object->data.cue_sheet.tracks[track_num].num_indices . + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks > track_num \endcode + \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, uint32_t track_num, uint32_t index_num); /** Delete an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * modify. NOTE: this is not necessarily the same - * as the track's \a number field. - * \param index_num The index into the track's index array of the index - * to delete. NOTE: this is not necessarily the same - * as the index's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + + \param object A pointer to an existing CUESHEET object. + \param track_num The index into the track array of the track to + modify. NOTE: this is not necessarily the same + as the track's \a number field. + \param index_num The index into the track's index array of the index + to delete. NOTE: this is not necessarily the same + as the index's \a number field. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks > track_num \endcode + \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, uint32_t track_num, uint32_t index_num); /** Resize the track array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * tracks will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param new_num_tracks The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || - * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ + + If the size shrinks, elements will truncated; if it grows, new blank + tracks will be added to the end. + + \param object A pointer to an existing CUESHEET object. + \param new_num_tracks The desired length of the array; may be \c 0. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || + (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode + \retval FLAC__bool + \c false if memory allocation error, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, uint32_t new_num_tracks); /** Sets a track in a CUESHEET block. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num Index into track array to set. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param track The track to set the track to. You may safely pass in - * a const pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code track_num < object->data.cue_sheet.num_tracks \endcode - * \code (track->indices != NULL && track->num_indices > 0) || - * (track->indices == NULL && track->num_indices == 0) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the track is stored; otherwise, the object + takes ownership of the \a track pointer. + + \param object A pointer to an existing CUESHEET object. + \param track_num Index into track array to set. NOTE: this is not + necessarily the same as the track's \a number field. + \param track The track to set the track to. You may safely pass in + a const pointer if \a copy is \c true. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code track_num < object->data.cue_sheet.num_tracks \endcode + \code (track->indices != NULL && track->num_indices > 0) || + (track->indices == NULL && track->num_indices == 0) \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, uint32_t track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); /** Insert a track in a CUESHEET block at the given index. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \param track The track to insert. You may safely pass in a const - * pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the track is stored; otherwise, the object + takes ownership of the \a track pointer. + + \param object A pointer to an existing CUESHEET object. + \param track_num The index at which to insert the track. NOTE: this + is not necessarily the same as the track's \a number + field. The tracks at and after \a track_num move right + one position. To append a track to the end, set + \a track_num to \c object->data.cue_sheet.num_tracks . + \param track The track to insert. You may safely pass in a const + pointer if \a copy is \c true. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks >= track_num \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, uint32_t track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); /** Insert a blank track in a CUESHEET block at the given index. - * - * A blank track is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + A blank track is one in which all field values are zero. + + \param object A pointer to an existing CUESHEET object. + \param track_num The index at which to insert the track. NOTE: this + is not necessarily the same as the track's \a number + field. The tracks at and after \a track_num move right + one position. To append a track to the end, set + \a track_num to \c object->data.cue_sheet.num_tracks . + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks >= track_num \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, uint32_t track_num); /** Delete a track in a CUESHEET block at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * delete. NOTE: this is not necessarily the same - * as the track's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ + + \param object A pointer to an existing CUESHEET object. + \param track_num The index into the track array of the track to + delete. NOTE: this is not necessarily the same + as the track's \a number field. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \code object->data.cue_sheet.num_tracks > track_num \endcode + \retval FLAC__bool + \c false if realloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, uint32_t track_num); /** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param object A pointer to an existing CUESHEET object. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ + See the format specification for limits on the contents of the + cue sheet. + + \param object A pointer to an existing CUESHEET object. + \param check_cd_da_subset If \c true, check CUESHEET against more + stringent requirements for a CD-DA (audio) disc. + \param violation Address of a pointer to a string. If there is a + violation, a pointer to a string explanation of the + violation will be returned here. \a violation may be + \c NULL if you don't need the returned string. Do not + free the returned string; it will always point to static + data. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \retval FLAC__bool + \c false if cue sheet is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); /** Calculate and return the CDDB/freedb ID for a cue sheet. The function - * assumes the cue sheet corresponds to a CD; the result is undefined - * if the cuesheet's is_cd bit is not set. - * - * \param object A pointer to an existing CUESHEET object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__uint32 - * The unsigned integer representation of the CDDB/freedb ID - */ + assumes the cue sheet corresponds to a CD; the result is undefined + if the cuesheet's is_cd bit is not set. + + \param object A pointer to an existing CUESHEET object. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + \retval FLAC__uint32 + The unsigned integer representation of the CDDB/freedb ID +*/ FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); /** Sets the MIME type of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param mime_type A pointer to the MIME type string. The string must be - * ASCII characters 0x20-0x7e, NUL-terminated. No validation - * is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (mime_type != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the string is stored; otherwise, the object + takes ownership of the pointer. The existing string will be freed if this + function is successful, otherwise the original string will remain if \a copy + is \c true and malloc() fails. + + \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. + + \param object A pointer to an existing PICTURE object. + \param mime_type A pointer to the MIME type string. The string must be + ASCII characters 0x20-0x7e, NUL-terminated. No validation + is done. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + \code (mime_type != NULL) \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); /** Sets the description of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a description if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param description A pointer to the description string. The string must be - * valid UTF-8, NUL-terminated. No validation is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (description != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the string is stored; otherwise, the object + takes ownership of the pointer. The existing string will be freed if this + function is successful, otherwise the original string will remain if \a copy + is \c true and malloc() fails. + + \note It is safe to pass a const pointer to \a description if \a copy is \c true. + + \param object A pointer to an existing PICTURE object. + \param description A pointer to the description string. The string must be + valid UTF-8, NUL-terminated. No validation is done. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + \code (description != NULL) \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); /** Sets the picture data of a PICTURE block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. Also sets the \a data_length field of the - * metadata object to what is passed in as the \a length parameter. The - * existing data will be freed if this function is successful, otherwise the - * original data and data_length will remain if \a copy is \c true and - * malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ + + If \a copy is \c true, a copy of the data is stored; otherwise, the object + takes ownership of the pointer. Also sets the \a data_length field of the + metadata object to what is passed in as the \a length parameter. The + existing data will be freed if this function is successful, otherwise the + original data and data_length will remain if \a copy is \c true and + malloc() fails. + + \note It is safe to pass a const pointer to \a data if \a copy is \c true. + + \param object A pointer to an existing PICTURE object. + \param data A pointer to the data to set. + \param length The length of \a data in bytes. + \param copy See above. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + \code (data != NULL && length > 0) || + (data == NULL && length == 0 && copy == false) \endcode + \retval FLAC__bool + \c false if \a copy is \c true and malloc() fails, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); /** Check a PICTURE block to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param object A pointer to existing PICTURE block to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \retval FLAC__bool - * \c false if PICTURE block is illegal, else \c true. - */ + See the format specification for limits on the contents of the + PICTURE block. + + \param object A pointer to existing PICTURE block to be checked. + \param violation Address of a pointer to a string. If there is a + violation, a pointer to a string explanation of the + violation will be returned here. \a violation may be + \c NULL if you don't need the returned string. Do not + free the returned string; it will always point to static + data. + \assert + \code object != NULL \endcode + \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + \retval FLAC__bool + \c false if PICTURE block is illegal, else \c true. +*/ FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); /* \} */ diff --git a/src/libflac/FLAC/ordinals.h b/src/libflac/FLAC/ordinals.h index 75b830d6..efc1dac0 100644 --- a/src/libflac/FLAC/ordinals.h +++ b/src/libflac/FLAC/ordinals.h @@ -1,43 +1,43 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__ORDINALS_H #define FLAC__ORDINALS_H #if defined(_MSC_VER) && _MSC_VER < 1600 -/* Microsoft Visual Studio earlier than the 2010 version did not provide - * the 1999 ISO C Standard header file . - */ +/* Microsoft Visual Studio earlier than the 2010 version did not provide + the 1999 ISO C Standard header file . +*/ typedef signed __int8 FLAC__int8; typedef signed __int16 FLAC__int16; diff --git a/src/libflac/FLAC/stream_decoder.h b/src/libflac/FLAC/stream_decoder.h index 978c42d4..e05c3049 100644 --- a/src/libflac/FLAC/stream_decoder.h +++ b/src/libflac/FLAC/stream_decoder.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__STREAM_DECODER_H #define FLAC__STREAM_DECODER_H @@ -43,1525 +43,1525 @@ extern "C" { /** \file include/FLAC/stream_decoder.h - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * See the detailed documentation in the - * \link flac_stream_decoder stream decoder \endlink module. - */ + + \brief + This module contains the functions which implement the stream + decoder. + + See the detailed documentation in the + \link flac_stream_decoder stream decoder \endlink module. +*/ /** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces - * \ingroup flac - * - * \brief - * This module describes the decoder layers provided by libFLAC. - * - * The stream decoder can be used to decode complete streams either from - * the client via callbacks, or directly from a file, depending on how - * it is initialized. When decoding via callbacks, the client provides - * callbacks for reading FLAC data and writing decoded samples, and - * handling metadata and errors. If the client also supplies seek-related - * callback, the decoder function for sample-accurate seeking within the - * FLAC input is also available. When decoding from a file, the client - * needs only supply a filename or open \c FILE* and write/metadata/error - * callbacks; the rest of the callbacks are supplied internally. For more - * info see the \link flac_stream_decoder stream decoder \endlink module. - */ + \ingroup flac + + \brief + This module describes the decoder layers provided by libFLAC. + + The stream decoder can be used to decode complete streams either from + the client via callbacks, or directly from a file, depending on how + it is initialized. When decoding via callbacks, the client provides + callbacks for reading FLAC data and writing decoded samples, and + handling metadata and errors. If the client also supplies seek-related + callback, the decoder function for sample-accurate seeking within the + FLAC input is also available. When decoding from a file, the client + needs only supply a filename or open \c FILE* and write/metadata/error + callbacks; the rest of the callbacks are supplied internally. For more + info see the \link flac_stream_decoder stream decoder \endlink module. +*/ /** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface - * \ingroup flac_decoder - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * The stream decoder can decode native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this decoder is as follows: - * - The program creates an instance of a decoder using - * FLAC__stream_decoder_new(). - * - The program overrides the default settings using - * FLAC__stream_decoder_set_*() functions. - * - The program initializes the instance to validate the settings and - * prepare for decoding using - * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file() for native FLAC, - * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() - * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC - * - The program calls the FLAC__stream_decoder_process_*() functions - * to decode data, which subsequently calls the callbacks. - * - The program finishes the decoding with FLAC__stream_decoder_finish(), - * which flushes the input and output and resets the decoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_decoder_delete(). - * - * In more detail, the program will create a new instance by calling - * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() - * functions to override the default decoder options, and call - * one of the FLAC__stream_decoder_init_*() functions. - * - * There are three initialization functions for native FLAC, one for - * setting up the decoder to decode FLAC data from the client via - * callbacks, and two for decoding directly from a FLAC file. - * - * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). - * You must also supply several callbacks for handling I/O. Some (like - * seeking) are optional, depending on the capabilities of the input. - * - * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file(). Then you must only supply an open - * \c FILE* or filename and fewer callbacks; the decoder will handle - * the other callbacks internally. - * - * There are three similarly-named init functions for decoding from Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * Once the decoder is initialized, your program will call one of several - * functions to start the decoding process: - * - * - FLAC__stream_decoder_process_single() - Tells the decoder to process at - * most one metadata block or audio frame and return, calling either the - * metadata callback or write callback, respectively, once. If the decoder - * loses sync it will return with only the error callback being called. - * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder - * to process the stream from the current location and stop upon reaching - * the first audio frame. The client will get one metadata, write, or error - * callback per metadata block, audio frame, or sync error, respectively. - * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder - * to process the stream from the current location until the read callback - * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or - * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, - * write, or error callback per metadata block, audio frame, or sync error, - * respectively. - * - * When the decoder has finished decoding (normally or through an abort), - * the instance is finished by calling FLAC__stream_decoder_finish(), which - * ensures the decoder is in the correct state and frees memory. Then the - * instance may be deleted with FLAC__stream_decoder_delete() or initialized - * again to decode another stream. - * - * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. - * At any point after the stream decoder has been initialized, the client can - * call this function to seek to an exact sample within the stream. - * Subsequently, the first time the write callback is called it will be - * passed a (possibly partial) block starting at that sample. - * - * If the client cannot seek via the callback interface provided, but still - * has another way of seeking, it can flush the decoder using - * FLAC__stream_decoder_flush() and start feeding data from the new position - * through the read callback. - * - * The stream decoder also provides MD5 signature checking. If this is - * turned on before initialization, FLAC__stream_decoder_finish() will - * report when the decoded MD5 signature does not match the one stored - * in the STREAMINFO block. MD5 checking is automatically turned off - * (until the next FLAC__stream_decoder_reset()) if there is no signature - * in the STREAMINFO block or when a seek is attempted. - * - * The FLAC__stream_decoder_set_metadata_*() functions deserve special - * attention. By default, the decoder only calls the metadata_callback for - * the STREAMINFO block. These functions allow you to tell the decoder - * explicitly which blocks to parse and return via the metadata_callback - * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), - * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), - * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify - * which blocks to return. Remember that metadata blocks can potentially - * be big (for example, cover art) so filtering out the ones you don't - * use can reduce the memory requirements of the decoder. Also note the - * special forms FLAC__stream_decoder_set_metadata_respond_application(id) - * and FLAC__stream_decoder_set_metadata_ignore_application(id) for - * filtering APPLICATION blocks based on the application ID. - * - * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but - * they still can legally be filtered from the metadata_callback. - * - * \note - * The "set" functions may only be called when the decoder is in the - * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after - * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but - * before FLAC__stream_decoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_decoder_finish() resets all settings to the constructor - * defaults, including the callbacks. - * - * \{ - */ + \ingroup flac_decoder + + \brief + This module contains the functions which implement the stream + decoder. + + The stream decoder can decode native FLAC, and optionally Ogg FLAC + (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + + The basic usage of this decoder is as follows: + - The program creates an instance of a decoder using + FLAC__stream_decoder_new(). + - The program overrides the default settings using + FLAC__stream_decoder_set_*() functions. + - The program initializes the instance to validate the settings and + prepare for decoding using + - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() + or FLAC__stream_decoder_init_file() for native FLAC, + - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() + or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC + - The program calls the FLAC__stream_decoder_process_*() functions + to decode data, which subsequently calls the callbacks. + - The program finishes the decoding with FLAC__stream_decoder_finish(), + which flushes the input and output and resets the decoder to the + uninitialized state. + - The instance may be used again or deleted with + FLAC__stream_decoder_delete(). + + In more detail, the program will create a new instance by calling + FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() + functions to override the default decoder options, and call + one of the FLAC__stream_decoder_init_*() functions. + + There are three initialization functions for native FLAC, one for + setting up the decoder to decode FLAC data from the client via + callbacks, and two for decoding directly from a FLAC file. + + For decoding via callbacks, use FLAC__stream_decoder_init_stream(). + You must also supply several callbacks for handling I/O. Some (like + seeking) are optional, depending on the capabilities of the input. + + For decoding directly from a file, use FLAC__stream_decoder_init_FILE() + or FLAC__stream_decoder_init_file(). Then you must only supply an open + \c FILE* or filename and fewer callbacks; the decoder will handle + the other callbacks internally. + + There are three similarly-named init functions for decoding from Ogg + FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + library has been built with Ogg support. + + Once the decoder is initialized, your program will call one of several + functions to start the decoding process: + + - FLAC__stream_decoder_process_single() - Tells the decoder to process at + most one metadata block or audio frame and return, calling either the + metadata callback or write callback, respectively, once. If the decoder + loses sync it will return with only the error callback being called. + - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder + to process the stream from the current location and stop upon reaching + the first audio frame. The client will get one metadata, write, or error + callback per metadata block, audio frame, or sync error, respectively. + - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder + to process the stream from the current location until the read callback + returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or + FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, + write, or error callback per metadata block, audio frame, or sync error, + respectively. + + When the decoder has finished decoding (normally or through an abort), + the instance is finished by calling FLAC__stream_decoder_finish(), which + ensures the decoder is in the correct state and frees memory. Then the + instance may be deleted with FLAC__stream_decoder_delete() or initialized + again to decode another stream. + + Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. + At any point after the stream decoder has been initialized, the client can + call this function to seek to an exact sample within the stream. + Subsequently, the first time the write callback is called it will be + passed a (possibly partial) block starting at that sample. + + If the client cannot seek via the callback interface provided, but still + has another way of seeking, it can flush the decoder using + FLAC__stream_decoder_flush() and start feeding data from the new position + through the read callback. + + The stream decoder also provides MD5 signature checking. If this is + turned on before initialization, FLAC__stream_decoder_finish() will + report when the decoded MD5 signature does not match the one stored + in the STREAMINFO block. MD5 checking is automatically turned off + (until the next FLAC__stream_decoder_reset()) if there is no signature + in the STREAMINFO block or when a seek is attempted. + + The FLAC__stream_decoder_set_metadata_*() functions deserve special + attention. By default, the decoder only calls the metadata_callback for + the STREAMINFO block. These functions allow you to tell the decoder + explicitly which blocks to parse and return via the metadata_callback + and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), + FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), + FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify + which blocks to return. Remember that metadata blocks can potentially + be big (for example, cover art) so filtering out the ones you don't + use can reduce the memory requirements of the decoder. Also note the + special forms FLAC__stream_decoder_set_metadata_respond_application(id) + and FLAC__stream_decoder_set_metadata_ignore_application(id) for + filtering APPLICATION blocks based on the application ID. + + STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but + they still can legally be filtered from the metadata_callback. + + \note + The "set" functions may only be called when the decoder is in the + state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after + FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but + before FLAC__stream_decoder_init_*(). If this is the case they will + return \c true, otherwise \c false. + + \note + FLAC__stream_decoder_finish() resets all settings to the constructor + defaults, including the callbacks. + + \{ +*/ /** State values for a FLAC__StreamDecoder - * - * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). - */ + + The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). +*/ typedef enum { - FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, - /**< The decoder is ready to search for metadata. */ + FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, + /**< The decoder is ready to search for metadata. */ - FLAC__STREAM_DECODER_READ_METADATA, - /**< The decoder is ready to or is in the process of reading metadata. */ + FLAC__STREAM_DECODER_READ_METADATA, + /**< The decoder is ready to or is in the process of reading metadata. */ - FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, - /**< The decoder is ready to or is in the process of searching for the - * frame sync code. - */ + FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, + /** < The decoder is ready to or is in the process of searching for the + frame sync code. + */ - FLAC__STREAM_DECODER_READ_FRAME, - /**< The decoder is ready to or is in the process of reading a frame. */ + FLAC__STREAM_DECODER_READ_FRAME, + /**< The decoder is ready to or is in the process of reading a frame. */ - FLAC__STREAM_DECODER_END_OF_STREAM, - /**< The decoder has reached the end of the stream. */ + FLAC__STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ - FLAC__STREAM_DECODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ + FLAC__STREAM_DECODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ - FLAC__STREAM_DECODER_SEEK_ERROR, - /**< An error occurred while seeking. The decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - */ + FLAC__STREAM_DECODER_SEEK_ERROR, + /** < An error occurred while seeking. The decoder must be flushed + with FLAC__stream_decoder_flush() or reset with + FLAC__stream_decoder_reset() before decoding can continue. + */ - FLAC__STREAM_DECODER_ABORTED, - /**< The decoder was aborted by the read or write callback. */ + FLAC__STREAM_DECODER_ABORTED, + /**< The decoder was aborted by the read or write callback. */ - FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. The decoder is in an invalid - * state and can no longer be used. - */ + FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, + /** < An error occurred allocating memory. The decoder is in an invalid + state and can no longer be used. + */ - FLAC__STREAM_DECODER_UNINITIALIZED - /**< The decoder is in the uninitialized state; one of the - * FLAC__stream_decoder_init_*() functions must be called before samples - * can be processed. - */ + FLAC__STREAM_DECODER_UNINITIALIZED + /** < The decoder is in the uninitialized state; one of the + FLAC__stream_decoder_init_*() functions must be called before samples + can be processed. + */ } FLAC__StreamDecoderState; /** Maps a FLAC__StreamDecoderState to a C string. - * - * Using a FLAC__StreamDecoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderState as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; /** Possible return values for the FLAC__stream_decoder_init_*() functions. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ + FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ - FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ + FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /** < The library was not compiled with support for the given container + format. + */ - FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ + FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ - FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. */ + FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. */ - FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, - /**< fopen() failed in FLAC__stream_decoder_init_file() or - * FLAC__stream_decoder_init_ogg_file(). */ + FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, + /** < fopen() failed in FLAC__stream_decoder_init_file() or + FLAC__stream_decoder_init_ogg_file(). */ - FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_decoder_init_*() was called when the decoder was - * already initialized, usually because - * FLAC__stream_decoder_finish() was not called. - */ + FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED + /** < FLAC__stream_decoder_init_*() was called when the decoder was + already initialized, usually because + FLAC__stream_decoder_finish() was not called. + */ } FLAC__StreamDecoderInitStatus; /** Maps a FLAC__StreamDecoderInitStatus to a C string. - * - * Using a FLAC__StreamDecoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderInitStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; /** Return values for the FLAC__StreamDecoder read callback. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ + FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ - FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted while at the end of the stream. Note that - * the client must only return this value when the read callback was - * called when already at the end of the stream. Otherwise, if the read - * itself moves to the end of the stream, the client should still return - * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on - * the next read callback it should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count - * of \c 0. - */ + FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, + /** < The read was attempted while at the end of the stream. Note that + the client must only return this value when the read callback was + called when already at the end of the stream. Otherwise, if the read + itself moves to the end of the stream, the client should still return + the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on + the next read callback it should return + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count + of \c 0. + */ - FLAC__STREAM_DECODER_READ_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ + FLAC__STREAM_DECODER_READ_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ } FLAC__StreamDecoderReadStatus; /** Maps a FLAC__StreamDecoderReadStatus to a C string. - * - * Using a FLAC__StreamDecoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderReadStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; /** Return values for the FLAC__StreamDecoder seek callback. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_SEEK_STATUS_OK, - /**< The seek was OK and decoding can continue. */ + FLAC__STREAM_DECODER_SEEK_STATUS_OK, + /**< The seek was OK and decoding can continue. */ - FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ + FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ - FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ + FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ } FLAC__StreamDecoderSeekStatus; /** Maps a FLAC__StreamDecoderSeekStatus to a C string. - * - * Using a FLAC__StreamDecoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderSeekStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; /** Return values for the FLAC__StreamDecoder tell callback. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_TELL_STATUS_OK, - /**< The tell was OK and decoding can continue. */ + FLAC__STREAM_DECODER_TELL_STATUS_OK, + /**< The tell was OK and decoding can continue. */ - FLAC__STREAM_DECODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ + FLAC__STREAM_DECODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ - FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support telling the position. */ + FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support telling the position. */ } FLAC__StreamDecoderTellStatus; /** Maps a FLAC__StreamDecoderTellStatus to a C string. - * - * Using a FLAC__StreamDecoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderTellStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; /** Return values for the FLAC__StreamDecoder length callback. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_LENGTH_STATUS_OK, - /**< The length call was OK and decoding can continue. */ + FLAC__STREAM_DECODER_LENGTH_STATUS_OK, + /**< The length call was OK and decoding can continue. */ - FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ + FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ - FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - /**< Client does not support reporting the length. */ + FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + /**< Client does not support reporting the length. */ } FLAC__StreamDecoderLengthStatus; /** Maps a FLAC__StreamDecoderLengthStatus to a C string. - * - * Using a FLAC__StreamDecoderLengthStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderLengthStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; /** Return values for the FLAC__StreamDecoder write callback. - */ +*/ typedef enum { - FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, - /**< The write was OK and decoding can continue. */ + FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, + /**< The write was OK and decoding can continue. */ - FLAC__STREAM_DECODER_WRITE_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ + FLAC__STREAM_DECODER_WRITE_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ } FLAC__StreamDecoderWriteStatus; /** Maps a FLAC__StreamDecoderWriteStatus to a C string. - * - * Using a FLAC__StreamDecoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderWriteStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; /** Possible values passed back to the FLAC__StreamDecoder error callback. - * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- - * all. The rest could be caused by bad sync (false synchronization on - * data that is not the start of a frame) or corrupted data. The error - * itself is the decoder's best guess at what happened assuming a correct - * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER - * could be caused by a correct sync on the start of a frame, but some - * data in the frame header was corrupted. Or it could be the result of - * syncing on a point the stream that looked like the starting of a frame - * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - * could be because the decoder encountered a valid frame made by a future - * version of the encoder which it cannot parse, or because of a false - * sync making it appear as though an encountered frame was generated by - * a future encoder. - */ + \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- + all. The rest could be caused by bad sync (false synchronization on + data that is not the start of a frame) or corrupted data. The error + itself is the decoder's best guess at what happened assuming a correct + sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER + could be caused by a correct sync on the start of a frame, but some + data in the frame header was corrupted. Or it could be the result of + syncing on a point the stream that looked like the starting of a frame + but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + could be because the decoder encountered a valid frame made by a future + version of the encoder which it cannot parse, or because of a false + sync making it appear as though an encountered frame was generated by + a future encoder. +*/ typedef enum { - FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, - /**< An error in the stream caused the decoder to lose synchronization. */ + FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, + /**< An error in the stream caused the decoder to lose synchronization. */ - FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, - /**< The decoder encountered a corrupted frame header. */ + FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, + /**< The decoder encountered a corrupted frame header. */ - FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, - /**< The frame's data did not match the CRC in the footer. */ + FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, + /**< The frame's data did not match the CRC in the footer. */ - FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - /**< The decoder encountered reserved fields in use in the stream. */ + FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + /**< The decoder encountered reserved fields in use in the stream. */ } FLAC__StreamDecoderErrorStatus; /** Maps a FLAC__StreamDecoderErrorStatus to a C string. - * - * Using a FLAC__StreamDecoderErrorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ + + Using a FLAC__StreamDecoderErrorStatus as the index to this array + will give the string equivalent. The contents should not be modified. +*/ extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; /*********************************************************************** - * - * class FLAC__StreamDecoder - * + + class FLAC__StreamDecoder + ***********************************************************************/ struct FLAC__StreamDecoderProtected; struct FLAC__StreamDecoderPrivate; /** The opaque structure definition for the stream decoder type. - * See the \link flac_stream_decoder stream decoder module \endlink - * for a detailed description. - */ + See the \link flac_stream_decoder stream decoder module \endlink + for a detailed description. +*/ typedef struct { - struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ + struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ } FLAC__StreamDecoder; /** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs more input data. The address of the - * buffer to be filled is supplied, along with the number of bytes the - * buffer can hold. The callback may choose to supply less data and - * modify the byte count but must be careful not to overflow the buffer. - * The callback then returns a status code chosen from - * FLAC__StreamDecoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { + + A function pointer matching this signature must be passed to + FLAC__stream_decoder_init*_stream(). The supplied function will be + called when the decoder needs more input data. The address of the + buffer to be filled is supplied, along with the number of bytes the + buffer can hold. The callback may choose to supply less data and + modify the byte count but must be careful not to overflow the buffer. + The callback then returns a status code chosen from + FLAC__StreamDecoderReadStatus. + + Here is an example of a read callback for stdio streams: + \code + FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + { + FILE *file = ((MyClientData*)client_data)->file; + if(*bytes > 0) { * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be decoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderReadStatus - * The callee's return status. Note that the callback should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if - * zero bytes were read and there is no more data to be read. - */ -typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + if(ferror(file)) + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + else if(*bytes == 0) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + \endcode + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param buffer A pointer to a location for the callee to store + data to be decoded. + \param bytes A pointer to the size of the buffer. On entry + to the callback, it contains the maximum number + of bytes that may be stored in \a buffer. The + callee must set it to the actual number of bytes + stored (0 in case of error or end-of-stream) before + returning. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__StreamDecoderReadStatus + The callee's return status. Note that the callback should return + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if + zero bytes were read and there is no more data to be read. +*/ +typedef FLAC__StreamDecoderReadStatus(*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); /** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to seek the input stream. The decoder - * will pass the absolute byte offset to seek to, 0 meaning the - * beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); + + A function pointer matching this signature may be passed to + FLAC__stream_decoder_init*_stream(). The supplied function will be + called when the decoder needs to seek the input stream. The decoder + will pass the absolute byte offset to seek to, 0 meaning the + beginning of the stream. + + Here is an example of a seek callback for stdio streams: + \code + FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) + { + FILE *file = ((MyClientData*)client_data)->file; + if(file == stdin) + return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + } + \endcode + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param absolute_byte_offset The offset from the beginning of the stream + to seek to. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__StreamDecoderSeekStatus + The callee's return status. +*/ +typedef FLAC__StreamDecoderSeekStatus(*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); /** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the current position of the - * stream. The callback should return the byte offset from the - * beginning of the stream. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - * else { + + A function pointer matching this signature may be passed to + FLAC__stream_decoder_init*_stream(). The supplied function will be + called when the decoder wants to know the current position of the + stream. The callback should return the byte offset from the + beginning of the stream. + + Here is an example of a tell callback for stdio streams: + \code + FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + { + FILE *file = ((MyClientData*)client_data)->file; + off_t pos; + if(file == stdin) + return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + else if((pos = ftello(file)) < 0) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + else { * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_DECODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset A pointer to storage for the current offset - * from the beginning of the stream. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } + } + \endcode + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param absolute_byte_offset A pointer to storage for the current offset + from the beginning of the stream. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__StreamDecoderTellStatus + The callee's return status. +*/ +typedef FLAC__StreamDecoderTellStatus(*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); /** Signature for the length callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the total length of the stream - * in bytes. - * - * Here is an example of a length callback for stdio streams: - * \code - * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * struct stat filestats; - * - * if(file == stdin) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - * else if(fstat(fileno(file), &filestats) != 0) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - * else { + + A function pointer matching this signature may be passed to + FLAC__stream_decoder_init*_stream(). The supplied function will be + called when the decoder wants to know the total length of the stream + in bytes. + + Here is an example of a length callback for stdio streams: + \code + FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) + { + FILE *file = ((MyClientData*)client_data)->file; + struct stat filestats; + + if(file == stdin) + return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + else if(fstat(fileno(file), &filestats) != 0) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + else { * *stream_length = (FLAC__uint64)filestats.st_size; - * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param stream_length A pointer to storage for the length of the stream - * in bytes. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderLengthStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } + } + \endcode + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param stream_length A pointer to storage for the length of the stream + in bytes. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__StreamDecoderLengthStatus + The callee's return status. +*/ +typedef FLAC__StreamDecoderLengthStatus(*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); /** Signature for the EOF callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to know if the end of the stream has - * been reached. - * - * Here is an example of a EOF callback for stdio streams: - * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) - * \code - * { - * FILE *file = ((MyClientData*)client_data)->file; - * return feof(file)? true : false; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__bool - * \c true if the currently at the end of the stream, else \c false. - */ -typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); + + A function pointer matching this signature may be passed to + FLAC__stream_decoder_init*_stream(). The supplied function will be + called when the decoder needs to know if the end of the stream has + been reached. + + Here is an example of a EOF callback for stdio streams: + FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) + \code + { + FILE *file = ((MyClientData*)client_data)->file; + return feof(file)? true : false; + } + \endcode + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__bool + \c true if the currently at the end of the stream, else \c false. +*/ +typedef FLAC__bool(*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); /** Signature for the write callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * single audio frame. The decoder will pass the frame metadata as well - * as an array of pointers (one for each channel) pointing to the - * decoded audio. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param frame The description of the decoded frame. See - * FLAC__Frame. - * \param buffer An array of pointers to decoded channels of data. - * Each pointer will point to an array of signed - * samples of length \a frame->header.blocksize. - * Channels will be ordered according to the FLAC - * specification; see the documentation for the - * frame header. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); + + A function pointer matching this signature must be passed to one of + the FLAC__stream_decoder_init_*() functions. + The supplied function will be called when the decoder has decoded a + single audio frame. The decoder will pass the frame metadata as well + as an array of pointers (one for each channel) pointing to the + decoded audio. + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param frame The description of the decoded frame. See + FLAC__Frame. + \param buffer An array of pointers to decoded channels of data. + Each pointer will point to an array of signed + samples of length \a frame->header.blocksize. + Channels will be ordered according to the FLAC + specification; see the documentation for the + frame header. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). + \retval FLAC__StreamDecoderWriteStatus + The callee's return status. +*/ +typedef FLAC__StreamDecoderWriteStatus(*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); /** Signature for the metadata callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * metadata block. In a valid FLAC file there will always be one - * \c STREAMINFO block, followed by zero or more other metadata blocks. - * These will be supplied by the decoder in the same order as they - * appear in the stream and always before the first audio frame (i.e. - * write callback). The metadata block that is passed in must not be - * modified, and it doesn't live beyond the callback, so you should make - * a copy of it with FLAC__metadata_object_clone() if you will need it - * elsewhere. Since metadata blocks can potentially be large, by - * default the decoder only calls the metadata callback for the - * \c STREAMINFO block; you can instruct the decoder to pass or filter - * other blocks with FLAC__stream_decoder_set_metadata_*() calls. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param metadata The decoded metadata block. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ + + A function pointer matching this signature must be passed to one of + the FLAC__stream_decoder_init_*() functions. + The supplied function will be called when the decoder has decoded a + metadata block. In a valid FLAC file there will always be one + \c STREAMINFO block, followed by zero or more other metadata blocks. + These will be supplied by the decoder in the same order as they + appear in the stream and always before the first audio frame (i.e. + write callback). The metadata block that is passed in must not be + modified, and it doesn't live beyond the callback, so you should make + a copy of it with FLAC__metadata_object_clone() if you will need it + elsewhere. Since metadata blocks can potentially be large, by + default the decoder only calls the metadata callback for the + \c STREAMINFO block; you can instruct the decoder to pass or filter + other blocks with FLAC__stream_decoder_set_metadata_*() calls. + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param metadata The decoded metadata block. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). +*/ typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); /** Signature for the error callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called whenever an error occurs during - * decoding. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param status The error encountered by the decoder. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ + + A function pointer matching this signature must be passed to one of + the FLAC__stream_decoder_init_*() functions. + The supplied function will be called whenever an error occurs during + decoding. + + \note In general, FLAC__StreamDecoder functions which change the + state should not be called on the \a decoder while in the callback. + + \param decoder The decoder instance calling the callback. + \param status The error encountered by the decoder. + \param client_data The callee's client data set through + FLAC__stream_decoder_init_*(). +*/ typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); /*********************************************************************** - * - * Class constructor/destructor - * + + Class constructor/destructor + ***********************************************************************/ /** Create a new stream decoder instance. The instance is created with - * default settings; see the individual FLAC__stream_decoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamDecoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ + default settings; see the individual FLAC__stream_decoder_set_*() + functions for each setting's default. + + \retval FLAC__StreamDecoder + \c NULL if there was an error allocating memory, else the new instance. +*/ FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); /** Free a decoder instance. Deletes the object pointed to by \a decoder. - * - * \param decoder A pointer to an existing decoder. - * \assert - * \code decoder != NULL \endcode - */ + + \param decoder A pointer to an existing decoder. + \assert + \code decoder != NULL \endcode +*/ FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); /*********************************************************************** - * - * Public class method prototypes - * + + Public class method prototypes + ***********************************************************************/ /** Set the serial number for the FLAC stream within the Ogg container. - * The default behavior is to use the serial number of the first Ogg - * page. Setting a serial number here will explicitly specify which - * stream is to be decoded. - * - * \note - * This does not need to be set for native FLAC decoding. - * - * \default \c use serial number of first page - * \param decoder A decoder instance to set. - * \param serial_number See above. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + The default behavior is to use the serial number of the first Ogg + page. Setting a serial number here will explicitly specify which + stream is to be decoded. + + \note + This does not need to be set for native FLAC decoding. + + \default \c use serial number of first page + \param decoder A decoder instance to set. + \param serial_number See above. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); /** Set the "MD5 signature checking" flag. If \c true, the decoder will - * compute the MD5 signature of the unencoded audio data while decoding - * and compare it to the signature from the STREAMINFO block, if it - * exists, during FLAC__stream_decoder_finish(). - * - * MD5 signature checking will be turned off (until the next - * FLAC__stream_decoder_reset()) if there is no signature in the - * STREAMINFO block or when a seek is attempted. - * - * Clients that do not use the MD5 check should leave this off to speed - * up decoding. - * - * \default \c false - * \param decoder A decoder instance to set. - * \param value Flag value (see above). - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + compute the MD5 signature of the unencoded audio data while decoding + and compare it to the signature from the STREAMINFO block, if it + exists, during FLAC__stream_decoder_finish(). + + MD5 signature checking will be turned off (until the next + FLAC__stream_decoder_reset()) if there is no signature in the + STREAMINFO block or when a seek is attempted. + + Clients that do not use the MD5 check should leave this off to speed + up decoding. + + \default \c false + \param decoder A decoder instance to set. + \param value Flag value (see above). + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); /** Direct the decoder to pass on all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \param type See above. + \assert + \code decoder != NULL \endcode + \a type is valid + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); /** Direct the decoder to pass on all APPLICATION metadata blocks of the - * given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + given \a id. + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \param id See above. + \assert + \code decoder != NULL \endcode + \code id != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); /** Direct the decoder to pass on all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); /** Direct the decoder to filter out all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \param type See above. + \assert + \code decoder != NULL \endcode + \a type is valid + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); /** Direct the decoder to filter out all APPLICATION metadata blocks of - * the given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + the given \a id. + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \param id See above. + \assert + \code decoder != NULL \endcode + \code id != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); /** Direct the decoder to filter out all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ + + \default By default, only the \c STREAMINFO block is returned via the + metadata callback. + \param decoder A decoder instance to set. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if the decoder is already initialized, else \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); /** Get the current decoder state. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The current decoder state. - */ + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval FLAC__StreamDecoderState + The current decoder state. +*/ FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); /** Get the current decoder state as a C string. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval const char * - * The decoder state as a C string. Do not modify the contents. - */ + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval const char + The decoder state as a C string. Do not modify the contents. +*/ FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); /** Get the "MD5 signature checking" flag. - * This is the value of the setting, not whether or not the decoder is - * currently checking the MD5 (remember, it can be turned off automatically - * by a seek). When the decoder is reset the flag will be restored to the - * value returned by this function. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * See above. - */ + This is the value of the setting, not whether or not the decoder is + currently checking the MD5 (remember, it can be turned off automatically + by a seek). When the decoder is reset the flag will be restored to the + value returned by this function. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + See above. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); /** Get the total number of samples in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the \c STREAMINFO block. A value of \c 0 means "unknown". - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval uint32_t - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the \c STREAMINFO block. A value of \c 0 means "unknown". + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval uint32_t + See above. +*/ FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); /** Get the current number of channels in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval uint32_t - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the most recently decoded frame header. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval uint32_t + See above. +*/ FLAC_API uint32_t FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); /** Get the current channel assignment in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__ChannelAssignment - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the most recently decoded frame header. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval FLAC__ChannelAssignment + See above. +*/ FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); /** Get the current sample resolution in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval uint32_t - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the most recently decoded frame header. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval uint32_t + See above. +*/ FLAC_API uint32_t FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); /** Get the current sample rate in Hz of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval uint32_t - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the most recently decoded frame header. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval uint32_t + See above. +*/ FLAC_API uint32_t FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); /** Get the current blocksize of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval uint32_t - * See above. - */ + Will only be valid after decoding has started and will contain the + value from the most recently decoded frame header. + + \param decoder A decoder instance to query. + \assert + \code decoder != NULL \endcode + \retval uint32_t + See above. +*/ FLAC_API uint32_t FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); /** Returns the decoder's current read position within the stream. - * The position is the byte offset from the start of the stream. - * Bytes before this position have been fully decoded. Note that - * there may still be undecoded bytes in the decoder's read FIFO. - * The returned position is correct even after a seek. - * - * \warning This function currently only works for native FLAC, - * not Ogg FLAC streams. - * - * \param decoder A decoder instance to query. - * \param position Address at which to return the desired position. - * \assert - * \code decoder != NULL \endcode - * \code position != NULL \endcode - * \retval FLAC__bool - * \c true if successful, \c false if the stream is not native FLAC, - * or there was an error from the 'tell' callback or it returned - * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. - */ + The position is the byte offset from the start of the stream. + Bytes before this position have been fully decoded. Note that + there may still be undecoded bytes in the decoder's read FIFO. + The returned position is correct even after a seek. + + \warning This function currently only works for native FLAC, + not Ogg FLAC streams. + + \param decoder A decoder instance to query. + \param position Address at which to return the desired position. + \assert + \code decoder != NULL \endcode + \code position != NULL \endcode + \retval FLAC__bool + \c true if successful, \c false if the stream is not native FLAC, + or there was an error from the 'tell' callback or it returned + \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); /** Initialize the decoder instance to decode native FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * native FLAC stream. I/O is performed via callbacks to the client. - * For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a + native FLAC stream. I/O is performed via callbacks to the client. + For decoding from a plain file via filename or open FILE*, + FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() + provide a simpler interface. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \param decoder An uninitialized decoder instance. + \param read_callback See FLAC__StreamDecoderReadCallback. This + pointer must not be \c NULL. + \param seek_callback See FLAC__StreamDecoderSeekCallback. This + pointer may be \c NULL if seeking is not + supported. If \a seek_callback is not \c NULL then a + \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + Alternatively, a dummy seek callback that just + returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param tell_callback See FLAC__StreamDecoderTellCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a tell_callback must also be supplied. + Alternatively, a dummy tell callback that just + returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param length_callback See FLAC__StreamDecoderLengthCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a length_callback must also be supplied. + Alternatively, a dummy length callback that just + returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param eof_callback See FLAC__StreamDecoderEofCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a eof_callback must also be supplied. + Alternatively, a dummy length callback that just + returns \c false + may also be supplied, all though this is slightly + less efficient for the decoder. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); /** Initialize the decoder instance to decode Ogg FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * FLAC stream in an Ogg container. I/O is performed via callbacks to the - * client. For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a + FLAC stream in an Ogg container. I/O is performed via callbacks to the + client. For decoding from a plain file via filename or open FILE*, + FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() + provide a simpler interface. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \note Support for Ogg FLAC in the library is optional. If this + library has been built without support for Ogg FLAC, this function + will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + + \param decoder An uninitialized decoder instance. + \param read_callback See FLAC__StreamDecoderReadCallback. This + pointer must not be \c NULL. + \param seek_callback See FLAC__StreamDecoderSeekCallback. This + pointer may be \c NULL if seeking is not + supported. If \a seek_callback is not \c NULL then a + \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + Alternatively, a dummy seek callback that just + returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param tell_callback See FLAC__StreamDecoderTellCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a tell_callback must also be supplied. + Alternatively, a dummy tell callback that just + returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param length_callback See FLAC__StreamDecoderLengthCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a length_callback must also be supplied. + Alternatively, a dummy length callback that just + returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + may also be supplied, all though this is slightly + less efficient for the decoder. + \param eof_callback See FLAC__StreamDecoderEofCallback. This + pointer may be \c NULL if not supported by the client. If + \a seek_callback is not \c NULL then a + \a eof_callback must also be supplied. + Alternatively, a dummy length callback that just + returns \c false + may also be supplied, all though this is slightly + less efficient for the decoder. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); /** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain native FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdin since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a + plain native FLAC file. For non-stdio streams, you must use + FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \param decoder An uninitialized decoder instance. + \param file An open FLAC file. The file should have been + opened with mode \c "rb" and rewound. The file + becomes owned by the decoder and should not be + manipulated by the client while decoding. + Unless \a file is \c stdin, it will be closed + when FLAC__stream_decoder_finish() is called. + Note however that seeking will not work when + decoding from \c stdin since it is not seekable. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \code file != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ #if 0 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); #endif /** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain Ogg FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdin since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a + plain Ogg FLAC file. For non-stdio streams, you must use + FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \note Support for Ogg FLAC in the library is optional. If this + library has been built without support for Ogg FLAC, this function + will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + + \param decoder An uninitialized decoder instance. + \param file An open FLAC file. The file should have been + opened with mode \c "rb" and rewound. The file + becomes owned by the decoder and should not be + manipulated by the client while decoding. + Unless \a file is \c stdin, it will be closed + when FLAC__stream_decoder_finish() is called. + Note however that seeking will not work when + decoding from \c stdin since it is not seekable. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \code file != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ #if 0 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); #endif /** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * native FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a plain + native FLAC file. If POSIX fopen() semantics are not sufficient, (for + example, with Unicode filenames on Windows), you must use + FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() + and provide callbacks for the I/O. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \param decoder An uninitialized decoder instance. + \param filename The name of the file to decode from. The file will + be opened with fopen(). Use \c NULL to decode from + \c stdin. Note that \c stdin is not seekable. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ #if 0 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); #endif /** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ + + This flavor of initialization sets up the decoder to decode from a plain + Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for + example, with Unicode filenames on Windows), you must use + FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() + and provide callbacks for the I/O. + + This function should be called after FLAC__stream_decoder_new() and + FLAC__stream_decoder_set_*() but before any of the + FLAC__stream_decoder_process_*() functions. Will set and return the + decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + if initialization succeeded. + + \note Support for Ogg FLAC in the library is optional. If this + library has been built without support for Ogg FLAC, this function + will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + + \param decoder An uninitialized decoder instance. + \param filename The name of the file to decode from. The file will + be opened with fopen(). Use \c NULL to decode from + \c stdin. Note that \c stdin is not seekable. + \param write_callback See FLAC__StreamDecoderWriteCallback. This + pointer must not be \c NULL. + \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + pointer may be \c NULL if the callback is not + desired. + \param error_callback See FLAC__StreamDecoderErrorCallback. This + pointer must not be \c NULL. + \param client_data This value will be supplied to callbacks in their + \a client_data argument. + \assert + \code decoder != NULL \endcode + \retval FLAC__StreamDecoderInitStatus + \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + see FLAC__StreamDecoderInitStatus for the meanings of other return values. +*/ #if 0 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data ); #endif /** Finish the decoding process. - * Flushes the decoding buffer, releases resources, resets the decoder - * settings to their defaults, and returns the decoder state to - * FLAC__STREAM_DECODER_UNINITIALIZED. - * - * In the event of a prematurely-terminated decode, it is not strictly - * necessary to call this immediately before FLAC__stream_decoder_delete() - * but it is good practice to match every FLAC__stream_decoder_init_*() - * with a FLAC__stream_decoder_finish(). - * - * \param decoder An uninitialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if MD5 checking is on AND a STREAMINFO block was available - * AND the MD5 signature in the STREAMINFO block was non-zero AND the - * signature does not match the one computed by the decoder; else - * \c true. - */ + Flushes the decoding buffer, releases resources, resets the decoder + settings to their defaults, and returns the decoder state to + FLAC__STREAM_DECODER_UNINITIALIZED. + + In the event of a prematurely-terminated decode, it is not strictly + necessary to call this immediately before FLAC__stream_decoder_delete() + but it is good practice to match every FLAC__stream_decoder_init_*() + with a FLAC__stream_decoder_finish(). + + \param decoder An uninitialized decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if MD5 checking is on AND a STREAMINFO block was available + AND the MD5 signature in the STREAMINFO block was non-zero AND the + signature does not match the one computed by the decoder; else + \c true. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); /** Flush the stream input. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn - * off MD5 checking. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation - * error occurs (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). - */ + The decoder's input buffer will be cleared and the state set to + \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn + off MD5 checking. + + \param decoder A decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c true if successful, else \c false if a memory allocation + error occurs (in which case the state will be set to + \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); /** Reset the decoding process. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to - * FLAC__stream_decoder_finish() except that the settings are - * preserved; there is no need to call FLAC__stream_decoder_init_*() - * before decoding again. MD5 checking will be restored to its original - * setting. - * - * If the decoder is seekable, or was initialized with - * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), - * the decoder will also attempt to seek to the beginning of the file. - * If this rewind fails, this function will return \c false. It follows - * that FLAC__stream_decoder_reset() cannot be used when decoding from - * \c stdin. - * - * If the decoder was initialized with FLAC__stream_encoder_init*_stream() - * and is not seekable (i.e. no seek callback was provided or the seek - * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it - * is the duty of the client to start feeding data from the beginning of - * the stream on the next FLAC__stream_decoder_process_*() call. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation occurs - * (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error - * occurs (the state will be unchanged). - */ + The decoder's input buffer will be cleared and the state set to + \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to + FLAC__stream_decoder_finish() except that the settings are + preserved; there is no need to call FLAC__stream_decoder_init_*() + before decoding again. MD5 checking will be restored to its original + setting. + + If the decoder is seekable, or was initialized with + FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), + the decoder will also attempt to seek to the beginning of the file. + If this rewind fails, this function will return \c false. It follows + that FLAC__stream_decoder_reset() cannot be used when decoding from + \c stdin. + + If the decoder was initialized with FLAC__stream_encoder_init*_stream() + and is not seekable (i.e. no seek callback was provided or the seek + callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it + is the duty of the client to start feeding data from the beginning of + the stream on the next FLAC__stream_decoder_process_*() call. + + \param decoder A decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c true if successful, else \c false if a memory allocation occurs + (in which case the state will be set to + \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error + occurs (the state will be unchanged). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); /** Decode one metadata block or audio frame. - * This version instructs the decoder to decode a either a single metadata - * block or a single frame and stop, unless the callbacks return a fatal - * error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * Depending on what was decoded, the metadata or write callback will be - * called with the decoded metadata block or audio frame. - * - * Unless there is a fatal read error or end of stream, this function - * will return once one whole frame is decoded. In other words, if the - * stream is not synchronized or points to a corrupt frame header, the - * decoder will continue to try and resync until it gets to a valid - * frame, then decode one frame, then return. If the decoder points to - * a frame whose frame CRC in the frame footer does not match the - * computed frame CRC, this function will issue a - * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the - * error callback, and return, having decoded one complete, although - * corrupt, frame. (Such corrupted frames are sent as silence of the - * correct length to the write callback.) - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ + This version instructs the decoder to decode a either a single metadata + block or a single frame and stop, unless the callbacks return a fatal + error or the read callback returns + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + + As the decoder needs more input it will call the read callback. + Depending on what was decoded, the metadata or write callback will be + called with the decoded metadata block or audio frame. + + Unless there is a fatal read error or end of stream, this function + will return once one whole frame is decoded. In other words, if the + stream is not synchronized or points to a corrupt frame header, the + decoder will continue to try and resync until it gets to a valid + frame, then decode one frame, then return. If the decoder points to + a frame whose frame CRC in the frame footer does not match the + computed frame CRC, this function will issue a + FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the + error callback, and return, having decoded one complete, although + corrupt, frame. (Such corrupted frames are sent as silence of the + correct length to the write callback.) + + \param decoder An initialized decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if any fatal read, write, or memory allocation error + occurred (meaning decoding must stop), else \c true; for more + information about the decoder, check the decoder state with + FLAC__stream_decoder_get_state(). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); /** Decode until the end of the metadata. - * This version instructs the decoder to decode from the current position - * and continue until all the metadata has been read, or until the - * callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block is decoded, the metadata callback will be called - * with the decoded metadata. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ + This version instructs the decoder to decode from the current position + and continue until all the metadata has been read, or until the + callbacks return a fatal error or the read callback returns + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + + As the decoder needs more input it will call the read callback. + As each metadata block is decoded, the metadata callback will be called + with the decoded metadata. + + \param decoder An initialized decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if any fatal read, write, or memory allocation error + occurred (meaning decoding must stop), else \c true; for more + information about the decoder, check the decoder state with + FLAC__stream_decoder_get_state(). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); /** Decode until the end of the stream. - * This version instructs the decoder to decode from the current position - * and continue until the end of stream (the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the - * callbacks return a fatal error. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block and frame is decoded, the metadata or write - * callback will be called with the decoded metadata or frame. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ + This version instructs the decoder to decode from the current position + and continue until the end of stream (the read callback returns + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the + callbacks return a fatal error. + + As the decoder needs more input it will call the read callback. + As each metadata block and frame is decoded, the metadata or write + callback will be called with the decoded metadata or frame. + + \param decoder An initialized decoder instance. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if any fatal read, write, or memory allocation error + occurred (meaning decoding must stop), else \c true; for more + information about the decoder, check the decoder state with + FLAC__stream_decoder_get_state(). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); /** Skip one audio frame. - * This version instructs the decoder to 'skip' a single frame and stop, - * unless the callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * The decoding flow is the same as what occurs when - * FLAC__stream_decoder_process_single() is called to process an audio - * frame, except that this function does not decode the parsed data into - * PCM or call the write callback. The integrity of the frame is still - * checked the same way as in the other process functions. - * - * This function will return once one whole frame is skipped, in the - * same way that FLAC__stream_decoder_process_single() will return once - * one whole frame is decoded. - * - * This function can be used in more quickly determining FLAC frame - * boundaries when decoding of the actual data is not needed, for - * example when an application is separating a FLAC stream into frames - * for editing or storing in a container. To do this, the application - * can use FLAC__stream_decoder_skip_single_frame() to quickly advance - * to the next frame, then use - * FLAC__stream_decoder_get_decode_position() to find the new frame - * boundary. - * - * This function should only be called when the stream has advanced - * past all the metadata, otherwise it will return \c false. - * - * \param decoder An initialized decoder instance not in a metadata - * state. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), or if the decoder - * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or - * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ + This version instructs the decoder to 'skip' a single frame and stop, + unless the callbacks return a fatal error or the read callback returns + \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + + The decoding flow is the same as what occurs when + FLAC__stream_decoder_process_single() is called to process an audio + frame, except that this function does not decode the parsed data into + PCM or call the write callback. The integrity of the frame is still + checked the same way as in the other process functions. + + This function will return once one whole frame is skipped, in the + same way that FLAC__stream_decoder_process_single() will return once + one whole frame is decoded. + + This function can be used in more quickly determining FLAC frame + boundaries when decoding of the actual data is not needed, for + example when an application is separating a FLAC stream into frames + for editing or storing in a container. To do this, the application + can use FLAC__stream_decoder_skip_single_frame() to quickly advance + to the next frame, then use + FLAC__stream_decoder_get_decode_position() to find the new frame + boundary. + + This function should only be called when the stream has advanced + past all the metadata, otherwise it will return \c false. + + \param decoder An initialized decoder instance not in a metadata + state. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c false if any fatal read, write, or memory allocation error + occurred (meaning decoding must stop), or if the decoder + is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or + FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more + information about the decoder, check the decoder state with + FLAC__stream_decoder_get_state(). +*/ FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); /** Flush the input and seek to an absolute sample. - * Decoding will resume at the given sample. Note that because of - * this, the next write callback may contain a partial block. The - * client must support seeking the input or this function will fail - * and return \c false. Furthermore, if the decoder state is - * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - * - * \param decoder A decoder instance. - * \param sample The target sample number to seek to. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ + Decoding will resume at the given sample. Note that because of + this, the next write callback may contain a partial block. The + client must support seeking the input or this function will fail + and return \c false. Furthermore, if the decoder state is + \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed + with FLAC__stream_decoder_flush() or reset with + FLAC__stream_decoder_reset() before decoding can continue. + + \param decoder A decoder instance. + \param sample The target sample number to seek to. + \assert + \code decoder != NULL \endcode + \retval FLAC__bool + \c true if successful, else \c false. +*/ FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); /** Return client_data from decoder. - * The data pointed to by the pointer should not be modified. - * - * \param decoder A decoder instance. - * \retval const void * - * The callee's client data set through FLAC__stream_decoder_init_*(). - * Do not modify the contents. - */ + The data pointed to by the pointer should not be modified. + + \param decoder A decoder instance. + \retval const void + The callee's client data set through FLAC__stream_decoder_init_*(). + Do not modify the contents. +*/ FLAC_API const void *FLAC__get_decoder_client_data(FLAC__StreamDecoder *decoder); /* \} */ diff --git a/src/libflac/bitmath.c b/src/libflac/bitmath.c index c8853055..0a1c8efa 100644 --- a/src/libflac/bitmath.c +++ b/src/libflac/bitmath.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -38,38 +38,39 @@ #include "private/bitmath.h" -/* An example of what FLAC__bitmath_silog2() computes: - * - * silog2(-10) = 5 - * silog2(- 9) = 5 - * silog2(- 8) = 4 - * silog2(- 7) = 4 - * silog2(- 6) = 4 - * silog2(- 5) = 4 - * silog2(- 4) = 3 - * silog2(- 3) = 3 - * silog2(- 2) = 2 - * silog2(- 1) = 2 - * silog2( 0) = 0 - * silog2( 1) = 2 - * silog2( 2) = 3 - * silog2( 3) = 3 - * silog2( 4) = 4 - * silog2( 5) = 4 - * silog2( 6) = 4 - * silog2( 7) = 4 - * silog2( 8) = 5 - * silog2( 9) = 5 - * silog2( 10) = 5 - */ -uint32_t FLAC__bitmath_silog2(FLAC__int64 v) -{ - if(v == 0) - return 0; +/* An example of what FLAC__bitmath_silog2() computes: + + silog2(-10) = 5 + silog2(- 9) = 5 + silog2(- 8) = 4 + silog2(- 7) = 4 + silog2(- 6) = 4 + silog2(- 5) = 4 + silog2(- 4) = 3 + silog2(- 3) = 3 + silog2(- 2) = 2 + silog2(- 1) = 2 + silog2( 0) = 0 + silog2( 1) = 2 + silog2( 2) = 3 + silog2( 3) = 3 + silog2( 4) = 4 + silog2( 5) = 4 + silog2( 6) = 4 + silog2( 7) = 4 + silog2( 8) = 5 + silog2( 9) = 5 + silog2( 10) = 5 +*/ +uint32_t FLAC__bitmath_silog2(FLAC__int64 v) { + if (v == 0) { + return 0; + } - if(v == -1) - return 2; + if (v == -1) { + return 2; + } - v = (v < 0) ? (-(v+1)) : v; - return FLAC__bitmath_ilog2_wide(v)+2; + v = (v < 0) ? (-(v + 1)) : v; + return FLAC__bitmath_ilog2_wide(v) + 2; } diff --git a/src/libflac/bitreader.c b/src/libflac/bitreader.c index a64c1ce5..c3756b1e 100644 --- a/src/libflac/bitreader.c +++ b/src/libflac/bitreader.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -86,19 +86,19 @@ typedef FLAC__uint64 brword; #endif /* - * This should be at least twice as large as the largest number of words - * required to represent any 'number' (in any encoding) you are going to - * read. With FLAC this is on the order of maybe a few hundred bits. - * If the buffer is smaller than that, the decoder won't be able to read - * in a whole number that is in a variable length encoding (e.g. Rice). - * But to be practical it should be at least 1K bytes. - * - * Increase this number to decrease the number of read callbacks, at the - * expense of using more memory. Or decrease for the reverse effect, - * keeping in mind the limit from the first paragraph. The optimal size - * also depends on the CPU cache size and other factors; some twiddling - * may be necessary to squeeze out the best performance. - */ + This should be at least twice as large as the largest number of words + required to represent any 'number' (in any encoding) you are going to + read. With FLAC this is on the order of maybe a few hundred bits. + If the buffer is smaller than that, the decoder won't be able to read + in a whole number that is in a variable length encoding (e.g. Rice). + But to be practical it should be at least 1K bytes. + + Increase this number to decrease the number of read callbacks, at the + expense of using more memory. Or decrease for the reverse effect, + keeping in mind the limit from the first paragraph. The optimal size + also depends on the CPU cache size and other factors; some twiddling + may be necessary to squeeze out the best performance. +*/ #if defined(ESP8266) /* Reduced bitreader buffer, saves some RAM */ static const uint32_t FLAC__BITREADER_DEFAULT_CAPACITY = 8192u / FLAC__BITS_PER_WORD; /* in words */ @@ -107,987 +107,1000 @@ static const uint32_t FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER #endif struct FLAC__BitReader { - /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ - /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ - brword *buffer; - uint32_t capacity; /* in words */ - uint32_t words; /* # of completed words in buffer */ - uint32_t bytes; /* # of bytes in incomplete word at buffer[words] */ - uint32_t consumed_words; /* #words ... */ - uint32_t consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ - uint32_t read_crc16; /* the running frame CRC */ - uint32_t crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ - FLAC__BitReaderReadCallback read_callback; - void *client_data; + /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ + /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ + brword *buffer; + uint32_t capacity; /* in words */ + uint32_t words; /* # of completed words in buffer */ + uint32_t bytes; /* # of bytes in incomplete word at buffer[words] */ + uint32_t consumed_words; /* #words ... */ + uint32_t consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ + uint32_t read_crc16; /* the running frame CRC */ + uint32_t crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ + FLAC__BitReaderReadCallback read_callback; + void *client_data; }; -static inline void crc16_update_word_(FLAC__BitReader *br, brword word) -{ - unsigned crc = br->read_crc16; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +static inline void crc16_update_word_(FLAC__BitReader *br, brword word) { + unsigned crc = br->read_crc16; #if FLAC__BYTES_PER_WORD == 4 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((uint32_t)(word >> 24), crc); /* Falls Through. */ - case 8: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 16) & 0xff), crc); /* Falls Through. */ - case 16: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 8) & 0xff), crc); /* Falls Through. */ - case 24: br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)(word & 0xff), crc); - } + switch (br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((uint32_t)(word >> 24), crc); /* Falls Through. */ + case 8: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 16) & 0xff), crc); /* Falls Through. */ + case 16: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 8) & 0xff), crc); /* Falls Through. */ + case 24: br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)(word & 0xff), crc); + } #elif FLAC__BYTES_PER_WORD == 8 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((uint32_t)(word >> 56), crc); /* Falls Through. */ - case 8: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 48) & 0xff), crc); /* Falls Through. */ - case 16: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 40) & 0xff), crc); /* Falls Through. */ - case 24: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 32) & 0xff), crc); /* Falls Through. */ - case 32: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 24) & 0xff), crc); /* Falls Through. */ - case 40: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 16) & 0xff), crc); /* Falls Through. */ - case 48: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 8) & 0xff), crc); /* Falls Through. */ - case 56: br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)(word & 0xff), crc); - } + switch (br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((uint32_t)(word >> 56), crc); /* Falls Through. */ + case 8: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 48) & 0xff), crc); /* Falls Through. */ + case 16: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 40) & 0xff), crc); /* Falls Through. */ + case 24: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 32) & 0xff), crc); /* Falls Through. */ + case 32: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 24) & 0xff), crc); /* Falls Through. */ + case 40: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 16) & 0xff), crc); /* Falls Through. */ + case 48: crc = FLAC__CRC16_UPDATE((uint32_t)((word >> 8) & 0xff), crc); /* Falls Through. */ + case 56: br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)(word & 0xff), crc); + } #else - for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) - crc = FLAC__CRC16_UPDATE((uint32_t)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); - br->read_crc16 = crc; + for (; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) { + crc = FLAC__CRC16_UPDATE((uint32_t)((word >> (FLAC__BITS_PER_WORD - 8 - br->crc16_align)) & 0xff), crc); + } + br->read_crc16 = crc; #endif - br->crc16_align = 0; + br->crc16_align = 0; } - -static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) -{ - uint32_t start, end; - size_t bytes; - FLAC__byte *target; - - /* first shift the unconsumed buffer data toward the front as much as possible */ - if(br->consumed_words > 0) { - start = br->consumed_words; - end = br->words + (br->bytes? 1:0); - memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); - - br->words -= start; - br->consumed_words = 0; - } - - /* - * set the target for reading, taking into account word alignment and endianness - */ - bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; - if(bytes == 0) - return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ - target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; - - /* before reading, if the existing reader looks like this (say brword is 32 bits wide) - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown laid out as bytes sequentially in memory) - * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) - * ^^-------target, bytes=3 - * on LE machines, have to byteswap the odd tail word so nothing is - * overwritten: - */ +#pragma GCC diagnostic pop + +static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) { + uint32_t start, end; + size_t bytes; + FLAC__byte *target; + + /* first shift the unconsumed buffer data toward the front as much as possible */ + if (br->consumed_words > 0) { + start = br->consumed_words; + end = br->words + (br->bytes ? 1 : 0); + memmove(br->buffer, br->buffer + start, FLAC__BYTES_PER_WORD * (end - start)); + + br->words -= start; + br->consumed_words = 0; + } + + /* + set the target for reading, taking into account word alignment and endianness + */ + bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; + if (bytes == 0) { + return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ + } + target = ((FLAC__byte*)(br->buffer + br->words)) + br->bytes; + + /* before reading, if the existing reader looks like this (say brword is 32 bits wide) + bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) + buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown laid out as bytes sequentially in memory) + buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) + ^^-------target, bytes=3 + on LE machines, have to byteswap the odd tail word so nothing is + overwritten: + */ #if WORDS_BIGENDIAN #else - if(br->bytes) - br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); + if (br->bytes) { + br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); + } #endif - /* now it looks like: - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? - * buffer[LE]: 44 33 22 11 55 ?? ?? ?? - * ^^-------target, bytes=3 - */ - - /* read in the data; note that the callback may return a smaller number of bytes */ - if(!br->read_callback(target, &bytes, br->client_data)) - return false; - - /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? - * now have to byteswap on LE machines: - */ + /* now it looks like: + bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 + buffer[BE]: 11 22 33 44 55 ?? ?? ?? + buffer[LE]: 44 33 22 11 55 ?? ?? ?? + ^^-------target, bytes=3 + */ + + /* read in the data; note that the callback may return a smaller number of bytes */ + if (!br->read_callback(target, &bytes, br->client_data)) { + return false; + } + + /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: + bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? + now have to byteswap on LE machines: + */ #if WORDS_BIGENDIAN #else - end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + (uint32_t)bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; - for(start = br->words; start < end; start++) - br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); + end = (br->words * FLAC__BYTES_PER_WORD + br->bytes + (uint32_t)bytes + (FLAC__BYTES_PER_WORD - 1)) / FLAC__BYTES_PER_WORD; + for (start = br->words; start < end; start++) { + br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); + } #endif - /* now it looks like: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD - * finally we'll update the reader values: - */ - end = br->words*FLAC__BYTES_PER_WORD + br->bytes + (uint32_t)bytes; - br->words = end / FLAC__BYTES_PER_WORD; - br->bytes = end % FLAC__BYTES_PER_WORD; - - return true; + /* now it looks like: + bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD + finally we'll update the reader values: + */ + end = br->words * FLAC__BYTES_PER_WORD + br->bytes + (uint32_t)bytes; + br->words = end / FLAC__BYTES_PER_WORD; + br->bytes = end % FLAC__BYTES_PER_WORD; + + return true; } /*********************************************************************** - * - * Class constructor/destructor - * + + Class constructor/destructor + ***********************************************************************/ -FLAC__BitReader *FLAC__bitreader_new(void) -{ - FLAC__BitReader *br = (FLAC__BitReader*)calloc(1, sizeof(FLAC__BitReader)); - - /* calloc() implies: - memset(br, 0, sizeof(FLAC__BitReader)); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; - */ - return br; +FLAC__BitReader *FLAC__bitreader_new(void) { + FLAC__BitReader *br = (FLAC__BitReader*)calloc(1, sizeof(FLAC__BitReader)); + + /* calloc() implies: + memset(br, 0, sizeof(FLAC__BitReader)); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; + */ + return br; } -void FLAC__bitreader_delete(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); +void FLAC__bitreader_delete(FLAC__BitReader *br) { + FLAC__ASSERT(0 != br); - FLAC__bitreader_free(br); - free(br); + FLAC__bitreader_free(br); + free(br); } /*********************************************************************** - * - * Public class methods - * + + Public class methods + ***********************************************************************/ -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) -{ - FLAC__ASSERT(0 != br); - - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; - br->buffer = (brword*)malloc(sizeof(brword) * br->capacity); - if(br->buffer == 0) - return false; - br->read_callback = rcb; - br->client_data = cd; - - return true; +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) { + FLAC__ASSERT(0 != br); + + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; + br->buffer = (brword*)malloc(sizeof(brword) * br->capacity); + if (br->buffer == 0) { + return false; + } + br->read_callback = rcb; + br->client_data = cd; + + return true; } -void FLAC__bitreader_free(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - - if(0 != br->buffer) - free(br->buffer); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; +void FLAC__bitreader_free(FLAC__BitReader *br) { + FLAC__ASSERT(0 != br); + + if (0 != br->buffer) { + free(br->buffer); + } + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; } -FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) -{ - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - return true; +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) { + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + return true; } #if 0 -void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) -{ - uint32_t i, j; - if(br == 0) { - fprintf(out, "bitreader is NULL\n"); - } - else { - fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); - - for(i = 0; i < br->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01d", br->buffer[i] & ((brword)1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(br->bytes > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < br->bytes*8; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01d", br->buffer[i] & ((brword)1 << (br->bytes*8-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) { + uint32_t i, j; + if (br == 0) { + fprintf(out, "bitreader is NULL\n"); + } else { + fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); + + for (i = 0; i < br->words; i++) { + fprintf(out, "%08X: ", i); + for (j = 0; j < FLAC__BITS_PER_WORD; j++) + if (i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) { + fprintf(out, "."); + } else { + fprintf(out, "%01d", br->buffer[i] & ((brword)1 << (FLAC__BITS_PER_WORD - j - 1)) ? 1 : 0); + } + fprintf(out, "\n"); + } + if (br->bytes > 0) { + fprintf(out, "%08X: ", i); + for (j = 0; j < br->bytes * 8; j++) + if (i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) { + fprintf(out, "."); + } else { + fprintf(out, "%01d", br->buffer[i] & ((brword)1 << (br->bytes * 8 - j - 1)) ? 1 : 0); + } + fprintf(out, "\n"); + } + } } #endif -void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) -{ +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) { FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); - br->read_crc16 = (uint32_t)seed; - br->crc16_align = br->consumed_bits; + br->read_crc16 = (uint32_t)seed; + br->crc16_align = br->consumed_bits; } -FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); - FLAC__ASSERT(br->crc16_align <= br->consumed_bits); - - /* CRC any tail bytes in a partially-consumed word */ - if(br->consumed_bits) { - const brword tail = br->buffer[br->consumed_words]; - for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) - br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); - } - return br->read_crc16; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) { + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + FLAC__ASSERT(br->crc16_align <= br->consumed_bits); + + /* CRC any tail bytes in a partially-consumed word */ + if (br->consumed_bits) { + const brword tail = br->buffer[br->consumed_words]; + for (; br->crc16_align < br->consumed_bits; br->crc16_align += 8) { + br->read_crc16 = FLAC__CRC16_UPDATE((uint32_t)((tail >> (FLAC__BITS_PER_WORD - 8 - br->crc16_align)) & 0xff), br->read_crc16); + } + } + return br->read_crc16; } +#pragma GCC diagnostic pop -inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) -{ - return ((br->consumed_bits & 7) == 0); +inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) { + return ((br->consumed_bits & 7) == 0); } -inline uint32_t FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) -{ - return 8 - (br->consumed_bits & 7); +inline uint32_t FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) { + return 8 - (br->consumed_bits & 7); } -inline uint32_t FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) -{ - return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; +inline uint32_t FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) { + return (br->words - br->consumed_words) * FLAC__BITS_PER_WORD + br->bytes * 8 - br->consumed_bits; } -FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, uint32_t bits) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - FLAC__ASSERT(bits <= 32); - FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); - FLAC__ASSERT(br->consumed_words <= br->words); - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ - *val = 0; - return true; - } - - while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { - if(!bitreader_read_from_client_(br)) - return false; - } - if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - const uint32_t n = FLAC__BITS_PER_WORD - br->consumed_bits; - const brword word = br->buffer[br->consumed_words]; - if(bits < n) { - *val = (FLAC__uint32)((word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits)); /* The result has <= 32 non-zero bits */ - br->consumed_bits += bits; - return true; - } - /* (FLAC__BITS_PER_WORD - br->consumed_bits <= bits) ==> (FLAC__WORD_ALL_ONES >> br->consumed_bits) has no more than 'bits' non-zero bits */ - *val = (FLAC__uint32)(word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)); - bits -= n; - crc16_update_word_(br, word); - br->consumed_words++; - br->consumed_bits = 0; - if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ - *val <<= bits; - *val |= (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); - br->consumed_bits = bits; - } - return true; - } - else { /* br->consumed_bits == 0 */ - const brword word = br->buffer[br->consumed_words]; - if(bits < FLAC__BITS_PER_WORD) { - *val = (FLAC__uint32)(word >> (FLAC__BITS_PER_WORD-bits)); - br->consumed_bits = bits; - return true; - } - /* at this point bits == FLAC__BITS_PER_WORD == 32; because of previous assertions, it can't be larger */ - *val = (FLAC__uint32)word; - crc16_update_word_(br, word); - br->consumed_words++; - return true; - } - } - else { - /* in this case we're starting our read at a partial tail word; - * the reader has guaranteed that we have at least 'bits' bits - * available to read, which makes this case simpler. - */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); - *val = (FLAC__uint32)((br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits)); - br->consumed_bits += bits; - return true; - } - else { - *val = (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); - br->consumed_bits += bits; - return true; - } - } +FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, uint32_t bits) { + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + FLAC__ASSERT(bits <= 32); + FLAC__ASSERT((br->capacity * FLAC__BITS_PER_WORD) * 2 >= bits); + FLAC__ASSERT(br->consumed_words <= br->words); + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + if (bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ + *val = 0; + return true; + } + + while ((br->words - br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes * 8 - br->consumed_bits < bits) { + if (!bitreader_read_from_client_(br)) { + return false; + } + } + if (br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if (br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + const uint32_t n = FLAC__BITS_PER_WORD - br->consumed_bits; + const brword word = br->buffer[br->consumed_words]; + if (bits < n) { + *val = (FLAC__uint32)((word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n - bits)); /* The result has <= 32 non-zero bits */ + br->consumed_bits += bits; + return true; + } + /* (FLAC__BITS_PER_WORD - br->consumed_bits <= bits) ==> (FLAC__WORD_ALL_ONES >> br->consumed_bits) has no more than 'bits' non-zero bits */ + *val = (FLAC__uint32)(word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)); + bits -= n; + crc16_update_word_(br, word); + br->consumed_words++; + br->consumed_bits = 0; + if (bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + *val <<= bits; + *val |= (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD - bits)); + br->consumed_bits = bits; + } + return true; + } else { /* br->consumed_bits == 0 */ + const brword word = br->buffer[br->consumed_words]; + if (bits < FLAC__BITS_PER_WORD) { + *val = (FLAC__uint32)(word >> (FLAC__BITS_PER_WORD - bits)); + br->consumed_bits = bits; + return true; + } + /* at this point bits == FLAC__BITS_PER_WORD == 32; because of previous assertions, it can't be larger */ + *val = (FLAC__uint32)word; + crc16_update_word_(br, word); + br->consumed_words++; + return true; + } + } else { + /* in this case we're starting our read at a partial tail word; + the reader has guaranteed that we have at least 'bits' bits + available to read, which makes this case simpler. + */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if (br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(br->consumed_bits + bits <= br->bytes * 8); + *val = (FLAC__uint32)((br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD - br->consumed_bits - bits)); + br->consumed_bits += bits; + return true; + } else { + *val = (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD - bits)); + br->consumed_bits += bits; + return true; + } + } } -FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, uint32_t bits) -{ - FLAC__uint32 uval, mask; - /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ - if(!FLAC__bitreader_read_raw_uint32(br, &uval, bits)) - return false; - /* sign-extend *val assuming it is currently bits wide. */ - /* From: https://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend */ - mask = 1u << (bits - 1); - *val = (uval ^ mask) - mask; - return true; +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, uint32_t bits) { + FLAC__uint32 uval, mask; + /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ + if (!FLAC__bitreader_read_raw_uint32(br, &uval, bits)) { + return false; + } + /* sign-extend *val assuming it is currently bits wide. */ + /* From: https://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend */ + mask = 1u << (bits - 1); + *val = (uval ^ mask) - mask; + return true; } -FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, uint32_t bits) -{ - FLAC__uint32 hi, lo; - - if(bits > 32) { - if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) - return false; - if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) - return false; - *val = hi; - *val <<= 32; - *val |= lo; - } - else { - if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) - return false; - *val = lo; - } - return true; +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, uint32_t bits) { + FLAC__uint32 hi, lo; + + if (bits > 32) { + if (!FLAC__bitreader_read_raw_uint32(br, &hi, bits - 32)) { + return false; + } + if (!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) { + return false; + } + *val = hi; + *val <<= 32; + *val |= lo; + } else { + if (!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) { + return false; + } + *val = lo; + } + return true; } -inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) -{ - FLAC__uint32 x8, x32 = 0; +inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) { + FLAC__uint32 x8, x32 = 0; - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) - return false; + if (!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) { + return false; + } - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 8); + if (!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) { + return false; + } + x32 |= (x8 << 8); - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 16); + if (!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) { + return false; + } + x32 |= (x8 << 16); - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 24); + if (!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) { + return false; + } + x32 |= (x8 << 24); - *val = x32; - return true; + *val = x32; + return true; } -FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, uint32_t bits) -{ - /* - * OPT: a faster implementation is possible but probably not that useful - * since this is only called a couple of times in the metadata readers. - */ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - if(bits > 0) { - const uint32_t n = br->consumed_bits & 7; - uint32_t m; - FLAC__uint32 x; - - if(n != 0) { - m = flac_min(8-n, bits); - if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) - return false; - bits -= m; - } - m = bits / 8; - if(m > 0) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) - return false; - bits %= 8; - } - if(bits > 0) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) - return false; - } - } - - return true; +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, uint32_t bits) { + /* + OPT: a faster implementation is possible but probably not that useful + since this is only called a couple of times in the metadata readers. + */ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + if (bits > 0) { + const uint32_t n = br->consumed_bits & 7; + uint32_t m; + FLAC__uint32 x; + + if (n != 0) { + m = flac_min(8 - n, bits); + if (!FLAC__bitreader_read_raw_uint32(br, &x, m)) { + return false; + } + bits -= m; + } + m = bits / 8; + if (m > 0) { + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) { + return false; + } + bits %= 8; + } + if (bits > 0) { + if (!FLAC__bitreader_read_raw_uint32(br, &x, bits)) { + return false; + } + } + } + + return true; } -FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, uint32_t nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: skip over partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: skip whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - br->consumed_words++; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: skip any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - - return true; +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, uint32_t nvals) { + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: skip over partial head word to get word aligned */ + while (nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + nvals--; + } + if (0 == nvals) { + return true; + } + /* step 2: skip whole words in chunks */ + while (nvals >= FLAC__BYTES_PER_WORD) { + if (br->consumed_words < br->words) { + br->consumed_words++; + nvals -= FLAC__BYTES_PER_WORD; + } else if (!bitreader_read_from_client_(br)) { + return false; + } + } + /* step 3: skip any remainder from partial tail bytes */ + while (nvals) { + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + nvals--; + } + + return true; } -FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, uint32_t nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: read from partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: read whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - const brword word = br->buffer[br->consumed_words++]; +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, uint32_t nvals) { + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: read from partial head word to get word aligned */ + while (nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + *val++ = (FLAC__byte)x; + nvals--; + } + if (0 == nvals) { + return true; + } + /* step 2: read whole words in chunks */ + while (nvals >= FLAC__BYTES_PER_WORD) { + if (br->consumed_words < br->words) { + const brword word = br->buffer[br->consumed_words++]; #if FLAC__BYTES_PER_WORD == 4 - val[0] = (FLAC__byte)(word >> 24); - val[1] = (FLAC__byte)(word >> 16); - val[2] = (FLAC__byte)(word >> 8); - val[3] = (FLAC__byte)word; + val[0] = (FLAC__byte)(word >> 24); + val[1] = (FLAC__byte)(word >> 16); + val[2] = (FLAC__byte)(word >> 8); + val[3] = (FLAC__byte)word; #elif FLAC__BYTES_PER_WORD == 8 - val[0] = (FLAC__byte)(word >> 56); - val[1] = (FLAC__byte)(word >> 48); - val[2] = (FLAC__byte)(word >> 40); - val[3] = (FLAC__byte)(word >> 32); - val[4] = (FLAC__byte)(word >> 24); - val[5] = (FLAC__byte)(word >> 16); - val[6] = (FLAC__byte)(word >> 8); - val[7] = (FLAC__byte)word; + val[0] = (FLAC__byte)(word >> 56); + val[1] = (FLAC__byte)(word >> 48); + val[2] = (FLAC__byte)(word >> 40); + val[3] = (FLAC__byte)(word >> 32); + val[4] = (FLAC__byte)(word >> 24); + val[5] = (FLAC__byte)(word >> 16); + val[6] = (FLAC__byte)(word >> 8); + val[7] = (FLAC__byte)word; #else - for(x = 0; x < FLAC__BYTES_PER_WORD; x++) - val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); + for (x = 0; x < FLAC__BYTES_PER_WORD; x++) { + val[x] = (FLAC__byte)(word >> (8 * (FLAC__BYTES_PER_WORD - x - 1))); + } #endif - val += FLAC__BYTES_PER_WORD; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: read any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - - return true; + val += FLAC__BYTES_PER_WORD; + nvals -= FLAC__BYTES_PER_WORD; + } else if (!bitreader_read_from_client_(br)) { + return false; + } + } + /* step 3: read any remainder from partial tail bytes */ + while (nvals) { + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + *val++ = (FLAC__byte)x; + nvals--; + } + + return true; } FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, uint32_t *val) #if 0 /* slow but readable version */ { - uint32_t bit; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - if(bit) - break; - else - *val++; - } - return true; + uint32_t bit; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while (1) { + if (!FLAC__bitreader_read_bit(br, &bit)) { + return false; + } + if (bit) { + break; + } else { + *val++; + } + } + return true; } #else { - uint32_t i; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - brword b = br->buffer[br->consumed_words] << br->consumed_bits; - if(b) { - i = COUNT_ZERO_MSBS(b); - *val += i; - i++; - br->consumed_bits += i; - if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - } - return true; - } - else { - *val += FLAC__BITS_PER_WORD - br->consumed_bits; - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - /* didn't find stop bit yet, have to keep going... */ - } - } - /* at this point we've eaten up all the whole words; have to try - * reading through any tail bytes before calling the read callback. - * this is a repeat of the above logic adjusted for the fact we - * don't have a whole word. note though if the client is feeding - * us data a byte at a time (unlikely), br->consumed_bits may not - * be zero. - */ - if(br->bytes*8 > br->consumed_bits) { - const uint32_t end = br->bytes * 8; - brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; - if(b) { - i = COUNT_ZERO_MSBS(b); - *val += i; - i++; - br->consumed_bits += i; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - return true; - } - else { - *val += end - br->consumed_bits; - br->consumed_bits = end; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - /* didn't find stop bit yet, have to keep going... */ - } - } - if(!bitreader_read_from_client_(br)) - return false; - } + uint32_t i; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while (1) { + while (br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + brword b = br->buffer[br->consumed_words] << br->consumed_bits; + if (b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + if (br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + } + return true; + } else { + *val += FLAC__BITS_PER_WORD - br->consumed_bits; + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + reading through any tail bytes before calling the read callback. + this is a repeat of the above logic adjusted for the fact we + don't have a whole word. note though if the client is feeding + us data a byte at a time (unlikely), br->consumed_bits may not + be zero. + */ + if (br->bytes * 8 > br->consumed_bits) { + const uint32_t end = br->bytes * 8; + brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD - end))) << br->consumed_bits; + if (b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + return true; + } else { + *val += end - br->consumed_bits; + br->consumed_bits = end; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + if (!bitreader_read_from_client_(br)) { + return false; + } + } } #endif -FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, uint32_t parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - uint32_t uval; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(parameter <= 31); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) - return false; +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, uint32_t parameter) { + FLAC__uint32 lsbs = 0, msbs = 0; + uint32_t uval; - /* compose the value */ - uval = (msbs << parameter) | lsbs; - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(parameter <= 31); + + /* read the unary MSBs and end bit */ + if (!FLAC__bitreader_read_unary_unsigned(br, &msbs)) { + return false; + } + + /* read the binary LSBs */ + if (!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) { + return false; + } + + /* compose the value */ + uval = (msbs << parameter) | lsbs; + if (uval & 1) { + *val = -((int)(uval >> 1)) - 1; + } else { + *val = (int)(uval >> 1); + } + + return true; } /* this is by far the most heavily used reader call. it ain't pretty but it's fast */ -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], uint32_t nvals, uint32_t parameter) -{ - /* try and get br->consumed_words and br->consumed_bits into register; - * must remember to flush them back to *br before calling other - * bitreader functions that use them, and before returning */ - uint32_t cwords, words, lsbs, msbs, x, y; - uint32_t ucbits; /* keep track of the number of unconsumed bits in word */ - brword b; - int *val, *end; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - FLAC__ASSERT(parameter < 32); - /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ - - val = vals; - end = vals + nvals; - - if(parameter == 0) { - while(val < end) { - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); - } - - return true; - } - - FLAC__ASSERT(parameter > 0); - - cwords = br->consumed_words; - words = br->words; - - /* if we've not consumed up to a partial tail word... */ - if(cwords >= words) { - x = 0; - goto process_tail; - } - - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ - - while(val < end) { - /* read the unary MSBs and end bit */ - x = y = COUNT_ZERO_MSBS2(b); - if(x == FLAC__BITS_PER_WORD) { - x = ucbits; - do { - /* didn't find stop bit yet, have to keep going... */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_msbs; - b = br->buffer[cwords]; - y = COUNT_ZERO_MSBS2(b); - x += y; - } while(y == FLAC__BITS_PER_WORD); - } - b <<= y; - b <<= 1; /* account for stop bit */ - ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; - msbs = x; - - /* read the binary LSBs */ - x = (FLAC__uint32)(b >> (FLAC__BITS_PER_WORD - parameter)); /* parameter < 32, so we can cast to 32-bit uint32_t */ - if(parameter <= ucbits) { - ucbits -= parameter; - b <<= parameter; - } else { - /* there are still bits left to read, they will all be in the next word */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_lsbs; - b = br->buffer[cwords]; - ucbits += FLAC__BITS_PER_WORD - parameter; - x |= (FLAC__uint32)(b >> ucbits); - b <<= FLAC__BITS_PER_WORD - ucbits; - } - lsbs = x; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - - continue; - - /* at this point we've eaten up all the whole words */ +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], uint32_t nvals, uint32_t parameter) { + /* try and get br->consumed_words and br->consumed_bits into register; + must remember to flush them back to *br before calling other + bitreader functions that use them, and before returning */ + uint32_t cwords, words, lsbs, msbs, x, y; + uint32_t ucbits; /* keep track of the number of unconsumed bits in word */ + brword b; + int *val, *end; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + FLAC__ASSERT(parameter < 32); + /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ + + val = vals; + end = vals + nvals; + + if (parameter == 0) { + while (val < end) { + /* read the unary MSBs and end bit */ + if (!FLAC__bitreader_read_unary_unsigned(br, &msbs)) { + return false; + } + + *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); + } + + return true; + } + + FLAC__ASSERT(parameter > 0); + + cwords = br->consumed_words; + words = br->words; + + /* if we've not consumed up to a partial tail word... */ + if (cwords >= words) { + x = 0; + goto process_tail; + } + + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ + + while (val < end) { + /* read the unary MSBs and end bit */ + x = y = COUNT_ZERO_MSBS2(b); + if (x == FLAC__BITS_PER_WORD) { + x = ucbits; + do { + /* didn't find stop bit yet, have to keep going... */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) { + goto incomplete_msbs; + } + b = br->buffer[cwords]; + y = COUNT_ZERO_MSBS2(b); + x += y; + } while (y == FLAC__BITS_PER_WORD); + } + b <<= y; + b <<= 1; /* account for stop bit */ + ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; + msbs = x; + + /* read the binary LSBs */ + x = (FLAC__uint32)(b >> (FLAC__BITS_PER_WORD - parameter)); /* parameter < 32, so we can cast to 32-bit uint32_t */ + if (parameter <= ucbits) { + ucbits -= parameter; + b <<= parameter; + } else { + /* there are still bits left to read, they will all be in the next word */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) { + goto incomplete_lsbs; + } + b = br->buffer[cwords]; + ucbits += FLAC__BITS_PER_WORD - parameter; + x |= (FLAC__uint32)(b >> ucbits); + b <<= FLAC__BITS_PER_WORD - ucbits; + } + lsbs = x; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + + continue; + + /* at this point we've eaten up all the whole words */ process_tail: - do { - if(0) { + do { + if (0) { incomplete_msbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - msbs += x; - x = ucbits = 0; - - if(0) { + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the unary MSBs and end bit */ + if (!FLAC__bitreader_read_unary_unsigned(br, &msbs)) { + return false; + } + msbs += x; + x = ucbits = 0; + + if (0) { incomplete_lsbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) - return false; - lsbs = x | lsbs; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - x = 0; - - cwords = br->consumed_words; - words = br->words; - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; - } while(cwords >= words && val < end); - } - - if(ucbits == 0 && cwords < words) { - /* don't leave the head word with no unconsumed bits */ - crc16_update_word_(br, br->buffer[cwords++]); - ucbits = FLAC__BITS_PER_WORD; - } - - br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; - br->consumed_words = cwords; - - return true; + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the binary LSBs */ + if (!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) { + return false; + } + lsbs = x | lsbs; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + x = 0; + + cwords = br->consumed_words; + words = br->words; + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; + } while (cwords >= words && val < end); + } + + if (ucbits == 0 && cwords < words) { + /* don't leave the head word with no unconsumed bits */ + crc16_update_word_(br, br->buffer[cwords++]); + ucbits = FLAC__BITS_PER_WORD; + } + + br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; + br->consumed_words = cwords; + + return true; } #if 0 /* UNUSED */ -FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, uint32_t parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - uint32_t bit, uval, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - uval = msbs * parameter + lsbs; - } - - /* unfold uint32_t to signed */ - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, uint32_t parameter) { + FLAC__uint32 lsbs = 0, msbs = 0; + uint32_t bit, uval, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if (!FLAC__bitreader_read_unary_unsigned(br, &msbs)) { + return false; + } + + /* read the binary LSBs */ + if (!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) { + return false; + } + + if (parameter == 1u << k) { + /* compose the value */ + uval = (msbs << k) | lsbs; + } else { + uint32_t d = (1 << (k + 1)) - parameter; + if (lsbs >= d) { + if (!FLAC__bitreader_read_bit(br, &bit)) { + return false; + } + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + uval = msbs * parameter + lsbs; + } + + /* unfold uint32_t to signed */ + if (uval & 1) { + *val = -((int)(uval >> 1)) - 1; + } else { + *val = (int)(uval >> 1); + } + + return true; } -FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, uint32_t *val, uint32_t parameter) -{ - FLAC__uint32 lsbs, msbs = 0; - uint32_t bit, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - *val = msbs * parameter + lsbs; - } - - return true; +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, uint32_t *val, uint32_t parameter) { + FLAC__uint32 lsbs, msbs = 0; + uint32_t bit, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if (!FLAC__bitreader_read_unary_unsigned(br, &msbs)) { + return false; + } + + /* read the binary LSBs */ + if (!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) { + return false; + } + + if (parameter == 1u << k) { + /* compose the value */ + *val = (msbs << k) | lsbs; + } else { + uint32_t d = (1 << (k + 1)) - parameter; + if (lsbs >= d) { + if (!FLAC__bitreader_read_bit(br, &bit)) { + return false; + } + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + *val = msbs * parameter + lsbs; + } + + return true; } #endif /* UNUSED */ /* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, uint32_t *rawlen) -{ - FLAC__uint32 v = 0; - FLAC__uint32 x; - uint32_t i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else { - *val = 0xffffffff; - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = 0xffffffff; - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, uint32_t *rawlen) { + FLAC__uint32 v = 0; + FLAC__uint32 x; + uint32_t i; + + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + if (raw) { + raw[(*rawlen)++] = (FLAC__byte)x; + } + if (!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } else if (x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } else if (x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } else if (x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } else if (x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } else if (x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } else { + *val = 0xffffffff; + return true; + } + for (; i; i--) { + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + if (raw) { + raw[(*rawlen)++] = (FLAC__byte)x; + } + if (!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = 0xffffffff; + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; } /* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, uint32_t *rawlen) -{ - FLAC__uint64 v = 0; - FLAC__uint32 x; - uint32_t i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ - v = 0; - i = 6; - } - else { - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, uint32_t *rawlen) { + FLAC__uint64 v = 0; + FLAC__uint32 x; + uint32_t i; + + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + if (raw) { + raw[(*rawlen)++] = (FLAC__byte)x; + } + if (!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } else if (x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } else if (x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } else if (x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } else if (x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } else if (x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } else if (x & 0xFE && !(x & 0x01)) { /* 11111110 */ + v = 0; + i = 6; + } else { + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + for (; i; i--) { + if (!FLAC__bitreader_read_raw_uint32(br, &x, 8)) { + return false; + } + if (raw) { + raw[(*rawlen)++] = (FLAC__byte)x; + } + if (!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; } -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ +/* These functions are declared inline in this file but are also callable as + externs from elsewhere. + According to the C99 spec, section 6.7.4, simply providing a function + prototype in a header file without 'inline' and making the function inline + in this file should be sufficient. + Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To + fix that we add extern declarations here. +*/ extern FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); extern uint32_t FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); extern uint32_t FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); diff --git a/src/libflac/config.h b/src/libflac/config.h index cf6c07df..edcb23e3 100644 --- a/src/libflac/config.h +++ b/src/libflac/config.h @@ -1,9 +1,11 @@ #define PGM_READ_UNALIGNED 0 #ifdef DEBUG - #undef NDEBUG +#undef NDEBUG #else - #define NDEBUG +#ifndef NDEBUG +#define NDEBUG +#endif #endif /* config.h. Generated from config.h.in by configure. */ @@ -151,7 +153,7 @@ #undef HAVE_X86INTRIN_H /* Define as const if the declaration of iconv() needs const. */ -#define ICONV_CONST +#define ICONV_CONST /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" @@ -231,15 +233,15 @@ /* Define to 1 if on MINIX. */ /* #undef _MINIX */ -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ /* #undef _POSIX_1_SOURCE */ /* Define to 1 if you need to in order for `stat' and other things to work. */ /* #undef _POSIX_SOURCE */ -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif diff --git a/src/libflac/cpu.c b/src/libflac/cpu.c index efed11b7..37e76aa3 100644 --- a/src/libflac/cpu.c +++ b/src/libflac/cpu.c @@ -1,37 +1,37 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H -# include +# include "config.h" //#endif #include "private/cpu.h" @@ -79,164 +79,162 @@ static const uint32_t FLAC__CPUINFO_X86_CPUID_FMA = 0x00001000; static const uint32_t FLAC__CPUINFO_X86_CPUID_AVX2 = 0x00000020; static uint32_t -cpu_xgetbv_x86(void) -{ +cpu_xgetbv_x86(void) { #if (defined _MSC_VER || defined __INTEL_COMPILER) && FLAC__AVX_SUPPORTED - return (uint32_t)_xgetbv(0); + return (uint32_t)_xgetbv(0); #elif defined __GNUC__ - uint32_t lo, hi; - __asm__ volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0)); - return lo; + uint32_t lo, hi; + __asm__ volatile(".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c"(0)); + return lo; #else - return 0; + return 0; #endif } static uint32_t -cpu_have_cpuid(void) -{ +cpu_have_cpuid(void) { #if defined FLAC__CPU_X86_64 || defined __i686__ || defined __SSE__ || (defined _M_IX86_FP && _M_IX86_FP > 0) - /* target CPU does have CPUID instruction */ - return 1; + /* target CPU does have CPUID instruction */ + return 1; #elif defined FLAC__HAS_NASM - return FLAC__cpu_have_cpuid_asm_ia32(); + return FLAC__cpu_have_cpuid_asm_ia32(); #elif defined __GNUC__ && defined HAVE_CPUID_H - if (__get_cpuid_max(0, 0) != 0) - return 1; - else - return 0; + if (__get_cpuid_max(0, 0) != 0) { + return 1; + } else { + return 0; + } #elif defined _MSC_VER - FLAC__uint32 flags1, flags2; - __asm { - pushfd - pushfd - pop eax - mov flags1, eax - xor eax, 0x200000 - push eax - popfd - pushfd - pop eax - mov flags2, eax - popfd - } - if (((flags1^flags2) & 0x200000) != 0) - return 1; - else - return 0; + FLAC__uint32 flags1, flags2; + __asm { + pushfd + pushfd + pop eax + mov flags1, eax + xor eax, 0x200000 + push eax + popfd + pushfd + pop eax + mov flags2, eax + popfd + } + if (((flags1^flags2) & 0x200000) != 0) { + return 1; + } else { + return 0; + } #else - return 0; + return 0; #endif } static void -cpuinfo_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) -{ +cpuinfo_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) { #if defined _MSC_VER - int cpuinfo[4]; - int ext = level & 0x80000000; - __cpuid(cpuinfo, ext); - if ((uint32_t)cpuinfo[0] >= level) { + int cpuinfo[4]; + int ext = level & 0x80000000; + __cpuid(cpuinfo, ext); + if ((uint32_t)cpuinfo[0] >= level) { #if FLAC__AVX_SUPPORTED - __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ + __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ #else - __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ + __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ #endif - *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; - return; - } + *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; + return; + } #elif defined __GNUC__ && defined HAVE_CPUID_H - FLAC__uint32 ext = level & 0x80000000; - __cpuid(ext, *eax, *ebx, *ecx, *edx); - if (*eax >= level) { - __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); - return; - } + FLAC__uint32 ext = level & 0x80000000; + __cpuid(ext, *eax, *ebx, *ecx, *edx); + if (*eax >= level) { + __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); + return; + } #elif defined FLAC__HAS_NASM && defined FLAC__CPU_IA32 - FLAC__cpu_info_asm_ia32(level, eax, ebx, ecx, edx); - return; + FLAC__cpu_info_asm_ia32(level, eax, ebx, ecx, edx); + return; #endif - *eax = *ebx = *ecx = *edx = 0; + *eax = *ebx = *ecx = *edx = 0; } #endif static void -x86_cpu_info (FLAC__CPUInfo *info) -{ +x86_cpu_info(FLAC__CPUInfo *info) { #if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && (defined FLAC__HAS_NASM || FLAC__HAS_X86INTRIN) && !defined FLAC__NO_ASM - FLAC__bool x86_osxsave = false; - FLAC__bool os_avx = false; - FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; - - info->use_asm = true; /* we assume a minimum of 80386 */ - if (!cpu_have_cpuid()) - return; - - cpuinfo_x86(0, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.intel = (flags_ebx == 0x756E6547 && flags_edx == 0x49656E69 && flags_ecx == 0x6C65746E) ? true : false; /* GenuineIntel */ - cpuinfo_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - - info->x86.cmov = (flags_edx & FLAC__CPUINFO_X86_CPUID_CMOV ) ? true : false; - info->x86.mmx = (flags_edx & FLAC__CPUINFO_X86_CPUID_MMX ) ? true : false; - info->x86.sse = (flags_edx & FLAC__CPUINFO_X86_CPUID_SSE ) ? true : false; - info->x86.sse2 = (flags_edx & FLAC__CPUINFO_X86_CPUID_SSE2 ) ? true : false; - info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE3 ) ? true : false; - info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSSE3) ? true : false; - info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE41) ? true : false; - info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE42) ? true : false; - - if (FLAC__AVX_SUPPORTED) { - x86_osxsave = (flags_ecx & FLAC__CPUINFO_X86_CPUID_OSXSAVE) ? true : false; - info->x86.avx = (flags_ecx & FLAC__CPUINFO_X86_CPUID_AVX ) ? true : false; - info->x86.fma = (flags_ecx & FLAC__CPUINFO_X86_CPUID_FMA ) ? true : false; - cpuinfo_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_X86_CPUID_AVX2 ) ? true : false; - } + FLAC__bool x86_osxsave = false; + FLAC__bool os_avx = false; + FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; + + info->use_asm = true; /* we assume a minimum of 80386 */ + if (!cpu_have_cpuid()) { + return; + } + + cpuinfo_x86(0, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + info->x86.intel = (flags_ebx == 0x756E6547 && flags_edx == 0x49656E69 && flags_ecx == 0x6C65746E) ? true : false; /* GenuineIntel */ + cpuinfo_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + + info->x86.cmov = (flags_edx & FLAC__CPUINFO_X86_CPUID_CMOV) ? true : false; + info->x86.mmx = (flags_edx & FLAC__CPUINFO_X86_CPUID_MMX) ? true : false; + info->x86.sse = (flags_edx & FLAC__CPUINFO_X86_CPUID_SSE) ? true : false; + info->x86.sse2 = (flags_edx & FLAC__CPUINFO_X86_CPUID_SSE2) ? true : false; + info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE3) ? true : false; + info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSSE3) ? true : false; + info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE41) ? true : false; + info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_X86_CPUID_SSE42) ? true : false; + + if (FLAC__AVX_SUPPORTED) { + x86_osxsave = (flags_ecx & FLAC__CPUINFO_X86_CPUID_OSXSAVE) ? true : false; + info->x86.avx = (flags_ecx & FLAC__CPUINFO_X86_CPUID_AVX) ? true : false; + info->x86.fma = (flags_ecx & FLAC__CPUINFO_X86_CPUID_FMA) ? true : false; + cpuinfo_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_X86_CPUID_AVX2) ? true : false; + } #if defined FLAC__CPU_IA32 - dfprintf(stderr, "CPU info (IA-32):\n"); + dfprintf(stderr, "CPU info (IA-32):\n"); #else - dfprintf(stderr, "CPU info (x86-64):\n"); + dfprintf(stderr, "CPU info (x86-64):\n"); #endif - dfprintf(stderr, " CMOV ....... %c\n", info->x86.cmov ? 'Y' : 'n'); - dfprintf(stderr, " MMX ........ %c\n", info->x86.mmx ? 'Y' : 'n'); - dfprintf(stderr, " SSE ........ %c\n", info->x86.sse ? 'Y' : 'n'); - dfprintf(stderr, " SSE2 ....... %c\n", info->x86.sse2 ? 'Y' : 'n'); - dfprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); - dfprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); - dfprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); - dfprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); - - if (FLAC__AVX_SUPPORTED) { - dfprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); - dfprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); - dfprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); - } - - /* - * now have to check for OS support of AVX instructions - */ - if (FLAC__AVX_SUPPORTED && info->x86.avx && x86_osxsave && (cpu_xgetbv_x86() & 0x6) == 0x6) { - os_avx = true; - } - if (os_avx) { - dfprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); - } - if (!os_avx) { - /* no OS AVX support */ - info->x86.avx = false; - info->x86.avx2 = false; - info->x86.fma = false; - } + dfprintf(stderr, " CMOV ....... %c\n", info->x86.cmov ? 'Y' : 'n'); + dfprintf(stderr, " MMX ........ %c\n", info->x86.mmx ? 'Y' : 'n'); + dfprintf(stderr, " SSE ........ %c\n", info->x86.sse ? 'Y' : 'n'); + dfprintf(stderr, " SSE2 ....... %c\n", info->x86.sse2 ? 'Y' : 'n'); + dfprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); + dfprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); + dfprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); + dfprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); + + if (FLAC__AVX_SUPPORTED) { + dfprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); + dfprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); + dfprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); + } + + /* + now have to check for OS support of AVX instructions + */ + if (FLAC__AVX_SUPPORTED && info->x86.avx && x86_osxsave && (cpu_xgetbv_x86() & 0x6) == 0x6) { + os_avx = true; + } + if (os_avx) { + dfprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); + } + if (!os_avx) { + /* no OS AVX support */ + info->x86.avx = false; + info->x86.avx2 = false; + info->x86.fma = false; + } #else - info->use_asm = false; + info->use_asm = false; #endif } static void -ppc_cpu_info (FLAC__CPUInfo *info) -{ +ppc_cpu_info(FLAC__CPUInfo *info) { #if defined FLAC__CPU_PPC #ifndef PPC_FEATURE2_ARCH_3_00 #define PPC_FEATURE2_ARCH_3_00 0x00800000 @@ -247,53 +245,52 @@ ppc_cpu_info (FLAC__CPUInfo *info) #endif #ifdef __linux__ - if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) { - info->ppc.arch_3_00 = true; - } else if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) { - info->ppc.arch_2_07 = true; - } + if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) { + info->ppc.arch_3_00 = true; + } else if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) { + info->ppc.arch_2_07 = true; + } #elif defined(__FreeBSD__) - long hwcaps; - elf_aux_info(AT_HWCAP2, &hwcaps, sizeof(hwcaps)); + long hwcaps; + elf_aux_info(AT_HWCAP2, &hwcaps, sizeof(hwcaps)); #else #error Unsupported platform! Please add support for reading ppc hwcaps. #endif - if (hwcaps & PPC_FEATURE2_ARCH_3_00) { - info->ppc.arch_3_00 = true; - } else if (hwcaps & PPC_FEATURE2_ARCH_2_07) { - info->ppc.arch_2_07 = true; - } + if (hwcaps & PPC_FEATURE2_ARCH_3_00) { + info->ppc.arch_3_00 = true; + } else if (hwcaps & PPC_FEATURE2_ARCH_2_07) { + info->ppc.arch_2_07 = true; + } #else - info->ppc.arch_2_07 = false; - info->ppc.arch_3_00 = false; + info->ppc.arch_2_07 = false; + info->ppc.arch_3_00 = false; #endif } -void FLAC__cpu_info (FLAC__CPUInfo *info) -{ - memset(info, 0, sizeof(*info)); +void FLAC__cpu_info(FLAC__CPUInfo *info) { + memset(info, 0, sizeof(*info)); #ifdef FLAC__CPU_IA32 - info->type = FLAC__CPUINFO_TYPE_IA32; + info->type = FLAC__CPUINFO_TYPE_IA32; #elif defined FLAC__CPU_X86_64 - info->type = FLAC__CPUINFO_TYPE_X86_64; + info->type = FLAC__CPUINFO_TYPE_X86_64; #elif defined FLAC__CPU_PPC - info->type = FLAC__CPUINFO_TYPE_PPC; + info->type = FLAC__CPUINFO_TYPE_PPC; #else - info->type = FLAC__CPUINFO_TYPE_UNKNOWN; + info->type = FLAC__CPUINFO_TYPE_UNKNOWN; #endif - switch (info->type) { - case FLAC__CPUINFO_TYPE_IA32: /* fallthrough */ - case FLAC__CPUINFO_TYPE_X86_64: - x86_cpu_info (info); - break; - case FLAC__CPUINFO_TYPE_PPC: - ppc_cpu_info (info); - break; - default: - info->use_asm = false; - break; - } + switch (info->type) { + case FLAC__CPUINFO_TYPE_IA32: /* fallthrough */ + case FLAC__CPUINFO_TYPE_X86_64: + x86_cpu_info(info); + break; + case FLAC__CPUINFO_TYPE_PPC: + ppc_cpu_info(info); + break; + default: + info->use_asm = false; + break; + } } diff --git a/src/libflac/crc.c b/src/libflac/crc.c index 1b531e3d..2ba9b56e 100644 --- a/src/libflac/crc.c +++ b/src/libflac/crc.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -44,105 +44,106 @@ /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ FLAC__byte const FLAC__crc8_table[256] PROGMEM = { - 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, - 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, - 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, - 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, - 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, - 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, - 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, - 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, - 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, - 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, - 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, - 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, - 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, - 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, - 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, - 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, - 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, - 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, - 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, - 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, - 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, - 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, - 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, - 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, - 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, - 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, - 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, - 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, - 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, - 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, - 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, - 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, + 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, + 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, + 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, + 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, + 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, + 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, + 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, + 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, + 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, + 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, + 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 }; /* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ unsigned const FLAC__crc16_table[256] PROGMEM = { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, - 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, - 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, - 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, - 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, - 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, - 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, - 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, - 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 + 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, + 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, + 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, + 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, + 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, + 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, + 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, + 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, + 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, + 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, + 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, + 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, + 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, + 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, + 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, + 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, + 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, + 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, + 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 }; -void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) -{ - *crc = pgm_read_byte(&FLAC__crc8_table[*crc ^ data]); +void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) { + *crc = pgm_read_byte(&FLAC__crc8_table[*crc ^ data]); } -void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) -{ - while(len--) - *crc = pgm_read_byte(&FLAC__crc8_table[*crc ^ *data++]); +void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) { + while (len--) { + *crc = pgm_read_byte(&FLAC__crc8_table[*crc ^ *data++]); + } } -FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) -{ - FLAC__uint8 crc = 0; +FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) { + FLAC__uint8 crc = 0; - while(len--) - crc = pgm_read_byte(&FLAC__crc8_table[crc ^ *data++]); + while (len--) { + crc = pgm_read_byte(&FLAC__crc8_table[crc ^ *data++]); + } - return crc; + return crc; } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) { + unsigned crc = 0; -unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) -{ - unsigned crc = 0; + while (len--) { + crc = ((crc << 8) ^ pgm_read_word(&FLAC__crc16_table[(crc >> 8) ^ *data++])) & 0xffff; + } - while(len--) - crc = ((crc<<8) ^ pgm_read_word(&FLAC__crc16_table[(crc>>8) ^ *data++])) & 0xffff; - - return crc; + return crc; } +#pragma GCC diagnostic pop diff --git a/src/libflac/fixed.c b/src/libflac/fixed.c index 567ae1ae..21cf2c75 100644 --- a/src/libflac/fixed.c +++ b/src/libflac/fixed.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -50,348 +50,360 @@ #pragma GCC optimize ("O3") #ifdef FLAC__INTEGER_ONLY_LIBRARY -/* rbps stands for residual bits per sample - * - * (ln(2) * err) - * rbps = log (-----------) - * 2 ( n ) - */ -static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - uint32_t bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (uint32_t)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; +/* rbps stands for residual bits per sample + + (ln(2) * err) + rbps = log (-----------) + 2 ( n ) +*/ +static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) { + FLAC__uint32 rbps; + uint32_t bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if (err <= n) { + return 0; + } + /* + The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + These allow us later to know we won't lose too much precision in the + fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2(err) + 1; + if (bits > 16) { + err >>= (bits - 16); + fracbits -= (bits - 16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if (f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (uint32_t)(-1)); + + if (rbps == 0) { + return 0; + } + + /* + The return value must have 16 fractional bits. Since the whole part + of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + must be >= -3, these assertion allows us to be able to shift rbps + left if necessary to get 16 fracbits without losing any bits of the + whole part of rbps. + + There is a slight chance due to accumulated error that the whole part + will require 6 bits, so we use 6 in the assertion. Really though as + long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps) + 1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if (fracbits < 16) { + return rbps << (16 - fracbits); + } else if (fracbits > 16) { + return rbps >> (fracbits - 16); + } else { + return rbps; + } } -static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - uint32_t bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2_wide(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (uint32_t)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; +static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) { + FLAC__uint32 rbps; + uint32_t bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if (err <= n) { + return 0; + } + /* + The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + These allow us later to know we won't lose too much precision in the + fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2_wide(err) + 1; + if (bits > 16) { + err >>= (bits - 16); + fracbits -= (bits - 16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if (f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (uint32_t)(-1)); + + if (rbps == 0) { + return 0; + } + + /* + The return value must have 16 fractional bits. Since the whole part + of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + must be >= -3, these assertion allows us to be able to shift rbps + left if necessary to get 16 fracbits without losing any bits of the + whole part of rbps. + + There is a slight chance due to accumulated error that the whole part + will require 6 bits, so we use 6 in the assertion. Really though as + long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps) + 1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if (fracbits < 16) { + return rbps << (16 - fracbits); + } else if (fracbits > 16) { + return rbps >> (fracbits - 16); + } else { + return rbps; + } } #endif #ifndef FLAC__INTEGER_ONLY_LIBRARY -uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) #else -uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) #endif { - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - uint32_t i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2 * data[-3] + data[-4]); + FLAC__int32 error, save; + FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + uint32_t i, order; + + for (i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if (total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) { + order = 0; + } else if (total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) { + order = 1; + } else if (total_error_2 < flac_min(total_error_3, total_error_4)) { + order = 2; + } else if (total_error_3 < total_error_4) { + order = 3; + } else { + order = 4; + } + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); #ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0); #else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; #endif - return order; + return order; } #ifndef FLAC__INTEGER_ONLY_LIBRARY -uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) #else -uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) #endif { - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - /* total_error_* are 64-bits to avoid overflow when encoding - * erratic signals when the bits-per-sample and blocksize are - * large. - */ - FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - uint32_t i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2 * data[-3] + data[-4]); + FLAC__int32 error, save; + /* total_error_* are 64-bits to avoid overflow when encoding + erratic signals when the bits-per-sample and blocksize are + large. + */ + FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + uint32_t i, order; + + for (i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if (total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) { + order = 0; + } else if (total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) { + order = 1; + } else if (total_error_2 < flac_min(total_error_3, total_error_4)) { + order = 2; + } else if (total_error_3 < total_error_4) { + order = 3; + } else { + order = 4; + } + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); #ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0); #else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; #endif - return order; + return order; } -void FLAC__fixed_compute_residual(const FLAC__int32 data[], uint32_t data_len, uint32_t order, FLAC__int32 residual[]) -{ - const int idata_len = (int)data_len; - int i; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(residual, data, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - 2*data[i-1] + data[i-2]; - break; - case 3: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; - break; - case 4: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; - break; - default: - FLAC__ASSERT(0); - } +void FLAC__fixed_compute_residual(const FLAC__int32 data[], uint32_t data_len, uint32_t order, FLAC__int32 residual[]) { + const int idata_len = (int)data_len; + int i; + + switch (order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(residual, data, sizeof(residual[0])*data_len); + break; + case 1: + for (i = 0; i < idata_len; i++) { + residual[i] = data[i] - data[i - 1]; + } + break; + case 2: + for (i = 0; i < idata_len; i++) { + residual[i] = data[i] - 2 * data[i - 1] + data[i - 2]; + } + break; + case 3: + for (i = 0; i < idata_len; i++) { + residual[i] = data[i] - 3 * data[i - 1] + 3 * data[i - 2] - data[i - 3]; + } + break; + case 4: + for (i = 0; i < idata_len; i++) { + residual[i] = data[i] - 4 * data[i - 1] + 6 * data[i - 2] - 4 * data[i - 3] + data[i - 4]; + } + break; + default: + FLAC__ASSERT(0); + } } -void FLAC__fixed_restore_signal(const FLAC__int32 residual[], uint32_t data_len, uint32_t order, FLAC__int32 data[]) -{ - int i, idata_len = (int)data_len; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(data, residual, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + 2*data[i-1] - data[i-2]; - break; - case 3: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; - break; - case 4: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; - break; - default: - FLAC__ASSERT(0); - } +void FLAC__fixed_restore_signal(const FLAC__int32 residual[], uint32_t data_len, uint32_t order, FLAC__int32 data[]) { + int i, idata_len = (int)data_len; + + switch (order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(data, residual, sizeof(residual[0])*data_len); + break; + case 1: + for (i = 0; i < idata_len; i++) { + data[i] = residual[i] + data[i - 1]; + } + break; + case 2: + for (i = 0; i < idata_len; i++) { + data[i] = residual[i] + 2 * data[i - 1] - data[i - 2]; + } + break; + case 3: + for (i = 0; i < idata_len; i++) { + data[i] = residual[i] + 3 * data[i - 1] - 3 * data[i - 2] + data[i - 3]; + } + break; + case 4: + for (i = 0; i < idata_len; i++) { + data[i] = residual[i] + 4 * data[i - 1] - 6 * data[i - 2] + 4 * data[i - 3] - data[i - 4]; + } + break; + default: + FLAC__ASSERT(0); + } } diff --git a/src/libflac/float.c b/src/libflac/float.c index 48b79133..bbba59e5 100644 --- a/src/libflac/float.c +++ b/src/libflac/float.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2004-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -51,254 +51,254 @@ const FLAC__fixedpoint FLAC__FP_E = 178145; /* Lookup tables for Knuth's logarithm algorithm */ #define LOG2_LOOKUP_PRECISION 16 static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] PROGMEM = { - { - /* - * 0 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000001, - /* lg(4/3) = */ 0x00000000, - /* lg(8/7) = */ 0x00000000, - /* lg(16/15) = */ 0x00000000, - /* lg(32/31) = */ 0x00000000, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 4 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000010, - /* lg(4/3) = */ 0x00000007, - /* lg(8/7) = */ 0x00000003, - /* lg(16/15) = */ 0x00000001, - /* lg(32/31) = */ 0x00000001, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 8 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000100, - /* lg(4/3) = */ 0x0000006a, - /* lg(8/7) = */ 0x00000031, - /* lg(16/15) = */ 0x00000018, - /* lg(32/31) = */ 0x0000000c, - /* lg(64/63) = */ 0x00000006, - /* lg(128/127) = */ 0x00000003, - /* lg(256/255) = */ 0x00000001, - /* lg(512/511) = */ 0x00000001, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 12 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00001000, - /* lg(4/3) = */ 0x000006a4, - /* lg(8/7) = */ 0x00000315, - /* lg(16/15) = */ 0x0000017d, - /* lg(32/31) = */ 0x000000bc, - /* lg(64/63) = */ 0x0000005d, - /* lg(128/127) = */ 0x0000002e, - /* lg(256/255) = */ 0x00000017, - /* lg(512/511) = */ 0x0000000c, - /* lg(1024/1023) = */ 0x00000006, - /* lg(2048/2047) = */ 0x00000003, - /* lg(4096/4095) = */ 0x00000001, - /* lg(8192/8191) = */ 0x00000001, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 16 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00010000, - /* lg(4/3) = */ 0x00006a40, - /* lg(8/7) = */ 0x00003151, - /* lg(16/15) = */ 0x000017d6, - /* lg(32/31) = */ 0x00000bba, - /* lg(64/63) = */ 0x000005d1, - /* lg(128/127) = */ 0x000002e6, - /* lg(256/255) = */ 0x00000172, - /* lg(512/511) = */ 0x000000b9, - /* lg(1024/1023) = */ 0x0000005c, - /* lg(2048/2047) = */ 0x0000002e, - /* lg(4096/4095) = */ 0x00000017, - /* lg(8192/8191) = */ 0x0000000c, - /* lg(16384/16383) = */ 0x00000006, - /* lg(32768/32767) = */ 0x00000003 - }, - { - /* - * 20 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00100000, - /* lg(4/3) = */ 0x0006a3fe, - /* lg(8/7) = */ 0x00031513, - /* lg(16/15) = */ 0x00017d60, - /* lg(32/31) = */ 0x0000bb9d, - /* lg(64/63) = */ 0x00005d10, - /* lg(128/127) = */ 0x00002e59, - /* lg(256/255) = */ 0x00001721, - /* lg(512/511) = */ 0x00000b8e, - /* lg(1024/1023) = */ 0x000005c6, - /* lg(2048/2047) = */ 0x000002e3, - /* lg(4096/4095) = */ 0x00000171, - /* lg(8192/8191) = */ 0x000000b9, - /* lg(16384/16383) = */ 0x0000005c, - /* lg(32768/32767) = */ 0x0000002e - }, - { - /* - * 24 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x01000000, - /* lg(4/3) = */ 0x006a3fe6, - /* lg(8/7) = */ 0x00315130, - /* lg(16/15) = */ 0x0017d605, - /* lg(32/31) = */ 0x000bb9ca, - /* lg(64/63) = */ 0x0005d0fc, - /* lg(128/127) = */ 0x0002e58f, - /* lg(256/255) = */ 0x0001720e, - /* lg(512/511) = */ 0x0000b8d8, - /* lg(1024/1023) = */ 0x00005c61, - /* lg(2048/2047) = */ 0x00002e2d, - /* lg(4096/4095) = */ 0x00001716, - /* lg(8192/8191) = */ 0x00000b8b, - /* lg(16384/16383) = */ 0x000005c5, - /* lg(32768/32767) = */ 0x000002e3 - }, - { - /* - * 28 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x10000000, - /* lg(4/3) = */ 0x06a3fe5c, - /* lg(8/7) = */ 0x03151301, - /* lg(16/15) = */ 0x017d6049, - /* lg(32/31) = */ 0x00bb9ca6, - /* lg(64/63) = */ 0x005d0fba, - /* lg(128/127) = */ 0x002e58f7, - /* lg(256/255) = */ 0x001720da, - /* lg(512/511) = */ 0x000b8d87, - /* lg(1024/1023) = */ 0x0005c60b, - /* lg(2048/2047) = */ 0x0002e2d7, - /* lg(4096/4095) = */ 0x00017160, - /* lg(8192/8191) = */ 0x0000b8ad, - /* lg(16384/16383) = */ 0x00005c56, - /* lg(32768/32767) = */ 0x00002e2b - } + { + /* + 0 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000001, + /* lg(4/3) = */ 0x00000000, + /* lg(8/7) = */ 0x00000000, + /* lg(16/15) = */ 0x00000000, + /* lg(32/31) = */ 0x00000000, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + 4 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000010, + /* lg(4/3) = */ 0x00000007, + /* lg(8/7) = */ 0x00000003, + /* lg(16/15) = */ 0x00000001, + /* lg(32/31) = */ 0x00000001, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + 8 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000100, + /* lg(4/3) = */ 0x0000006a, + /* lg(8/7) = */ 0x00000031, + /* lg(16/15) = */ 0x00000018, + /* lg(32/31) = */ 0x0000000c, + /* lg(64/63) = */ 0x00000006, + /* lg(128/127) = */ 0x00000003, + /* lg(256/255) = */ 0x00000001, + /* lg(512/511) = */ 0x00000001, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + 12 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00001000, + /* lg(4/3) = */ 0x000006a4, + /* lg(8/7) = */ 0x00000315, + /* lg(16/15) = */ 0x0000017d, + /* lg(32/31) = */ 0x000000bc, + /* lg(64/63) = */ 0x0000005d, + /* lg(128/127) = */ 0x0000002e, + /* lg(256/255) = */ 0x00000017, + /* lg(512/511) = */ 0x0000000c, + /* lg(1024/1023) = */ 0x00000006, + /* lg(2048/2047) = */ 0x00000003, + /* lg(4096/4095) = */ 0x00000001, + /* lg(8192/8191) = */ 0x00000001, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + 16 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00010000, + /* lg(4/3) = */ 0x00006a40, + /* lg(8/7) = */ 0x00003151, + /* lg(16/15) = */ 0x000017d6, + /* lg(32/31) = */ 0x00000bba, + /* lg(64/63) = */ 0x000005d1, + /* lg(128/127) = */ 0x000002e6, + /* lg(256/255) = */ 0x00000172, + /* lg(512/511) = */ 0x000000b9, + /* lg(1024/1023) = */ 0x0000005c, + /* lg(2048/2047) = */ 0x0000002e, + /* lg(4096/4095) = */ 0x00000017, + /* lg(8192/8191) = */ 0x0000000c, + /* lg(16384/16383) = */ 0x00000006, + /* lg(32768/32767) = */ 0x00000003 + }, + { + /* + 20 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00100000, + /* lg(4/3) = */ 0x0006a3fe, + /* lg(8/7) = */ 0x00031513, + /* lg(16/15) = */ 0x00017d60, + /* lg(32/31) = */ 0x0000bb9d, + /* lg(64/63) = */ 0x00005d10, + /* lg(128/127) = */ 0x00002e59, + /* lg(256/255) = */ 0x00001721, + /* lg(512/511) = */ 0x00000b8e, + /* lg(1024/1023) = */ 0x000005c6, + /* lg(2048/2047) = */ 0x000002e3, + /* lg(4096/4095) = */ 0x00000171, + /* lg(8192/8191) = */ 0x000000b9, + /* lg(16384/16383) = */ 0x0000005c, + /* lg(32768/32767) = */ 0x0000002e + }, + { + /* + 24 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x01000000, + /* lg(4/3) = */ 0x006a3fe6, + /* lg(8/7) = */ 0x00315130, + /* lg(16/15) = */ 0x0017d605, + /* lg(32/31) = */ 0x000bb9ca, + /* lg(64/63) = */ 0x0005d0fc, + /* lg(128/127) = */ 0x0002e58f, + /* lg(256/255) = */ 0x0001720e, + /* lg(512/511) = */ 0x0000b8d8, + /* lg(1024/1023) = */ 0x00005c61, + /* lg(2048/2047) = */ 0x00002e2d, + /* lg(4096/4095) = */ 0x00001716, + /* lg(8192/8191) = */ 0x00000b8b, + /* lg(16384/16383) = */ 0x000005c5, + /* lg(32768/32767) = */ 0x000002e3 + }, + { + /* + 28 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x10000000, + /* lg(4/3) = */ 0x06a3fe5c, + /* lg(8/7) = */ 0x03151301, + /* lg(16/15) = */ 0x017d6049, + /* lg(32/31) = */ 0x00bb9ca6, + /* lg(64/63) = */ 0x005d0fba, + /* lg(128/127) = */ 0x002e58f7, + /* lg(256/255) = */ 0x001720da, + /* lg(512/511) = */ 0x000b8d87, + /* lg(1024/1023) = */ 0x0005c60b, + /* lg(2048/2047) = */ 0x0002e2d7, + /* lg(4096/4095) = */ 0x00017160, + /* lg(8192/8191) = */ 0x0000b8ad, + /* lg(16384/16383) = */ 0x00005c56, + /* lg(32768/32767) = */ 0x00002e2b + } }; #if 0 static const FLAC__uint64 log2_lookup_wide[] = { - { - /* - * 32 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x100000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), - /* lg(8/7) = */ FLAC__U64L(0x31513015), - /* lg(16/15) = */ FLAC__U64L(0x17d60497), - /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), - /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), - /* lg(128/127) = */ FLAC__U64L(0x02e58f74), - /* lg(256/255) = */ FLAC__U64L(0x01720d9c), - /* lg(512/511) = */ FLAC__U64L(0x00b8d875), - /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), - /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), - /* lg(4096/4095) = */ FLAC__U64L(0x00171600), - /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), - /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), - /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) - }, - { - /* - * 48 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x1000000000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), - /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), - /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), - /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), - /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), - /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), - /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), - /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), - /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), - /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), - /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), - /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), - /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), - /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) - } + { + /* + 32 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x100000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), + /* lg(8/7) = */ FLAC__U64L(0x31513015), + /* lg(16/15) = */ FLAC__U64L(0x17d60497), + /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), + /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), + /* lg(128/127) = */ FLAC__U64L(0x02e58f74), + /* lg(256/255) = */ FLAC__U64L(0x01720d9c), + /* lg(512/511) = */ FLAC__U64L(0x00b8d875), + /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), + /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), + /* lg(4096/4095) = */ FLAC__U64L(0x00171600), + /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), + /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), + /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) + }, + { + /* + 48 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x1000000000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), + /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), + /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), + /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), + /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), + /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), + /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), + /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), + /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), + /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), + /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), + /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), + /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), + /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) + } }; #endif -FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, uint32_t fracbits, uint32_t precision) -{ - const FLAC__uint32 ONE = (1u << fracbits); - const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; +FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, uint32_t fracbits, uint32_t precision) { + const FLAC__uint32 ONE = (1u << fracbits); + const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; - FLAC__ASSERT(fracbits < 32); - FLAC__ASSERT((fracbits & 0x3) == 0); + FLAC__ASSERT(fracbits < 32); + FLAC__ASSERT((fracbits & 0x3) == 0); - if(x < ONE) - return 0; + if (x < ONE) { + return 0; + } - if(precision > LOG2_LOOKUP_PRECISION) - precision = LOG2_LOOKUP_PRECISION; + if (precision > LOG2_LOOKUP_PRECISION) { + precision = LOG2_LOOKUP_PRECISION; + } - /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ - { - FLAC__uint32 y = 0; - FLAC__uint32 z = x >> 1, k = 1; - while (x > ONE && k < precision) { - if (x - z >= ONE) { - x -= z; - z = x >> k; - y += table[k]; - } - else { - z >>= 1; - k++; - } - } - return y; - } + /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ + { + FLAC__uint32 y = 0; + FLAC__uint32 z = x >> 1, k = 1; + while (x > ONE && k < precision) { + if (x - z >= ONE) { + x -= z; + z = x >> k; + y += table[k]; + } else { + z >>= 1; + k++; + } + } + return y; + } } #endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/src/libflac/format.c b/src/libflac/format.c index 5578bbec..e5d40ab1 100644 --- a/src/libflac/format.c +++ b/src/libflac/format.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -51,7 +51,7 @@ FLAC_API const char *FLAC__VERSION_STRING = PACKAGE_VERSION; FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " PACKAGE_VERSION " 20190804"; -FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; +FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f', 'L', 'a', 'C' }; FLAC_API const uint32_t FLAC__STREAM_SYNC = 0x664C6143; FLAC_API const uint32_t FLAC__STREAM_SYNC_LEN = 32; /* bits */ @@ -78,20 +78,20 @@ FLAC_API const uint32_t FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */ -FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */ +FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3 * 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */ -FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */ +FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12 * 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */ -FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */ +FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6 + 13 * 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */ -FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */ +FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128 * 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */ -FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */ +FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7 + 258 * 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */ FLAC_API const uint32_t FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */ @@ -130,8 +130,8 @@ FLAC_API const uint32_t FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARA FLAC_API const uint32_t FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER = 31; /* == (1< FLAC__MAX_SAMPLE_RATE) { - return false; - } - else - return true; +FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(uint32_t sample_rate) { + if (sample_rate == 0 || sample_rate > FLAC__MAX_SAMPLE_RATE) { + return false; + } else { + return true; + } } -FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(uint32_t blocksize, uint32_t sample_rate) -{ - if(blocksize > 16384) - return false; - else if(sample_rate <= 48000 && blocksize > 4608) - return false; - else - return true; +FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(uint32_t blocksize, uint32_t sample_rate) { + if (blocksize > 16384) { + return false; + } else if (sample_rate <= 48000 && blocksize > 4608) { + return false; + } else { + return true; + } } -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(uint32_t sample_rate) -{ - if( - !FLAC__format_sample_rate_is_valid(sample_rate) || - ( - sample_rate >= (1u << 16) && - !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) - ) - ) { - return false; - } - else - return true; +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(uint32_t sample_rate) { + if ( + !FLAC__format_sample_rate_is_valid(sample_rate) || + ( + sample_rate >= (1u << 16) && + !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) + ) + ) { + return false; + } else { + return true; + } } /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) -{ - uint32_t i; - FLAC__uint64 prev_sample_number = 0; - FLAC__bool got_prev = false; - - FLAC__ASSERT(0 != seek_table); - - for(i = 0; i < seek_table->num_points; i++) { - if(got_prev) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].sample_number <= prev_sample_number - ) - return false; - } - prev_sample_number = seek_table->points[i].sample_number; - got_prev = true; - } - - return true; +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) { + uint32_t i; + FLAC__uint64 prev_sample_number = 0; + FLAC__bool got_prev = false; + + FLAC__ASSERT(0 != seek_table); + + for (i = 0; i < seek_table->num_points; i++) { + if (got_prev) { + if ( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].sample_number <= prev_sample_number + ) { + return false; + } + } + prev_sample_number = seek_table->points[i].sample_number; + got_prev = true; + } + + return true; } /* used as the sort predicate for qsort() */ -static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) -{ - /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ - if(l->sample_number == r->sample_number) - return 0; - else if(l->sample_number < r->sample_number) - return -1; - else - return 1; +static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) { + /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ + if (l->sample_number == r->sample_number) { + return 0; + } else if (l->sample_number < r->sample_number) { + return -1; + } else { + return 1; + } } /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API uint32_t FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) -{ - uint32_t i, j; - FLAC__bool first; - - FLAC__ASSERT(0 != seek_table); - - if (seek_table->num_points == 0) - return 0; - - /* sort the seekpoints */ - qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); - - /* uniquify the seekpoints */ - first = true; - for(i = j = 0; i < seek_table->num_points; i++) { - if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { - if(!first) { - if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) - continue; - } - } - first = false; - seek_table->points[j++] = seek_table->points[i]; - } - - for(i = j; i < seek_table->num_points; i++) { - seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - - return j; +FLAC_API uint32_t FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) { + uint32_t i, j; + FLAC__bool first; + + FLAC__ASSERT(0 != seek_table); + + if (seek_table->num_points == 0) { + return 0; + } + + /* sort the seekpoints */ + qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); + + /* uniquify the seekpoints */ + first = true; + for (i = j = 0; i < seek_table->num_points; i++) { + if (seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { + if (!first) { + if (seek_table->points[i].sample_number == seek_table->points[j - 1].sample_number) { + continue; + } + } + } + first = false; + seek_table->points[j++] = seek_table->points[i]; + } + + for (i = j; i < seek_table->num_points; i++) { + seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + + return j; } /* - * also disallows non-shortest-form encodings, c.f. - * http://www.unicode.org/versions/corrigendum1.html - * and a more clear explanation at the end of this section: - * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - */ -static uint32_t utf8len_(const FLAC__byte *utf8) -{ - FLAC__ASSERT(0 != utf8); - if ((utf8[0] & 0x80) == 0) { - return 1; - } - else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { - if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ - return 0; - return 2; - } - else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { - if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */ - return 0; - /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ - if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */ - return 0; - if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */ - return 0; - return 3; - } - else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { - if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */ - return 0; - return 4; - } - else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { - if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */ - return 0; - return 5; - } - else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { - if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */ - return 0; - return 6; - } - else { - return 0; - } + also disallows non-shortest-form encodings, c.f. + http://www.unicode.org/versions/corrigendum1.html + and a more clear explanation at the end of this section: + http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +*/ +static uint32_t utf8len_(const FLAC__byte *utf8) { + FLAC__ASSERT(0 != utf8); + if ((utf8[0] & 0x80) == 0) { + return 1; + } else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { + if ((utf8[0] & 0xFE) == 0xC0) { /* overlong sequence check */ + return 0; + } + return 2; + } else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { + if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) { /* overlong sequence check */ + return 0; + } + /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ + if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) { /* D800-DFFF */ + return 0; + } + if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) { /* FFFE-FFFF */ + return 0; + } + return 3; + } else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { + if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) { /* overlong sequence check */ + return 0; + } + return 4; + } else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { + if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) { /* overlong sequence check */ + return 0; + } + return 5; + } else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { + if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) { /* overlong sequence check */ + return 0; + } + return 6; + } else { + return 0; + } } -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) -{ - char c; - for(c = *name; c; c = *(++name)) - if(c < 0x20 || c == 0x3d || c > 0x7d) - return false; - return true; +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) { + char c; + for (c = *name; c; c = *(++name)) + if (c < 0x20 || c == 0x3d || c > 0x7d) { + return false; + } + return true; } -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, uint32_t length) -{ - if(length == (uint32_t)(-1)) { - while(*value) { - uint32_t n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - } - else { - const FLAC__byte *end = value + length; - while(value < end) { - uint32_t n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - if(value != end) - return false; - } - return true; +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, uint32_t length) { + if (length == (uint32_t)(-1)) { + while (*value) { + uint32_t n = utf8len_(value); + if (n == 0) { + return false; + } + value += n; + } + } else { + const FLAC__byte *end = value + length; + while (value < end) { + uint32_t n = utf8len_(value); + if (n == 0) { + return false; + } + value += n; + } + if (value != end) { + return false; + } + } + return true; } -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, uint32_t length) -{ - const FLAC__byte *s, *end; - - for(s = entry, end = s + length; s < end && *s != '='; s++) { - if(*s < 0x20 || *s > 0x7D) - return false; - } - if(s == end) - return false; - - s++; /* skip '=' */ - - while(s < end) { - uint32_t n = utf8len_(s); - if(n == 0) - return false; - s += n; - } - if(s != end) - return false; - - return true; +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, uint32_t length) { + const FLAC__byte *s, *end; + + for (s = entry, end = s + length; s < end && *s != '='; s++) { + if (*s < 0x20 || *s > 0x7D) { + return false; + } + } + if (s == end) { + return false; + } + + s++; /* skip '=' */ + + while (s < end) { + uint32_t n = utf8len_(s); + if (n == 0) { + return false; + } + s += n; + } + if (s != end) { + return false; + } + + return true; } /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) -{ - uint32_t i, j; - - if(check_cd_da_subset) { - if(cue_sheet->lead_in < 2 * 44100) { - if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; - return false; - } - if(cue_sheet->lead_in % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; - return false; - } - } - - if(cue_sheet->num_tracks == 0) { - if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; - return false; - } - - if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { - if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; - return false; - } - - for(i = 0; i < cue_sheet->num_tracks; i++) { - if(cue_sheet->tracks[i].number == 0) { - if(violation) *violation = "cue sheet may not have a track number 0"; - return false; - } - - if(check_cd_da_subset) { - if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { - if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; - return false; - } - } - - if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { - if(violation) { - if(i == cue_sheet->num_tracks-1) /* the lead-out track... */ - *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; - else - *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; - } - return false; - } - - if(i < cue_sheet->num_tracks - 1) { - if(cue_sheet->tracks[i].num_indices == 0) { - if(violation) *violation = "cue sheet track must have at least one index point"; - return false; - } - - if(cue_sheet->tracks[i].indices[0].number > 1) { - if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; - return false; - } - } - - for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { - if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; - return false; - } - - if(j > 0) { - if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { - if(violation) *violation = "cue sheet track index numbers must increase by 1"; - return false; - } - } - } - } - - return true; +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) { + uint32_t i, j; + + if (check_cd_da_subset) { + if (cue_sheet->lead_in < 2 * 44100) { + if (violation) { + *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; + } + return false; + } + if (cue_sheet->lead_in % 588 != 0) { + if (violation) { + *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; + } + return false; + } + } + + if (cue_sheet->num_tracks == 0) { + if (violation) { + *violation = "cue sheet must have at least one track (the lead-out)"; + } + return false; + } + + if (check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks - 1].number != 170) { + if (violation) { + *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; + } + return false; + } + + for (i = 0; i < cue_sheet->num_tracks; i++) { + if (cue_sheet->tracks[i].number == 0) { + if (violation) { + *violation = "cue sheet may not have a track number 0"; + } + return false; + } + + if (check_cd_da_subset) { + if (!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { + if (violation) { + *violation = "CD-DA cue sheet track number must be 1-99 or 170"; + } + return false; + } + } + + if (check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { + if (violation) { + if (i == cue_sheet->num_tracks - 1) { /* the lead-out track... */ + *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; + } else { + *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; + } + } + return false; + } + + if (i < cue_sheet->num_tracks - 1) { + if (cue_sheet->tracks[i].num_indices == 0) { + if (violation) { + *violation = "cue sheet track must have at least one index point"; + } + return false; + } + + if (cue_sheet->tracks[i].indices[0].number > 1) { + if (violation) { + *violation = "cue sheet track's first index number must be 0 or 1"; + } + return false; + } + } + + for (j = 0; j < cue_sheet->tracks[i].num_indices; j++) { + if (check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { + if (violation) { + *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; + } + return false; + } + + if (j > 0) { + if (cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j - 1].number + 1) { + if (violation) { + *violation = "cue sheet track index numbers must increase by 1"; + } + return false; + } + } + } + } + + return true; } /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) -{ - char *p; - FLAC__byte *b; - - for(p = picture->mime_type; *p; p++) { - if(*p < 0x20 || *p > 0x7e) { - if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; - return false; - } - } - - for(b = picture->description; *b; ) { - uint32_t n = utf8len_(b); - if(n == 0) { - if(violation) *violation = "description string must be valid UTF-8"; - return false; - } - b += n; - } - - return true; +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) { + char *p; + FLAC__byte *b; + + for (p = picture->mime_type; *p; p++) { + if (*p < 0x20 || *p > 0x7e) { + if (violation) { + *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; + } + return false; + } + } + + for (b = picture->description; *b;) { + uint32_t n = utf8len_(b); + if (n == 0) { + if (violation) { + *violation = "description string must be valid UTF-8"; + } + return false; + } + b += n; + } + + return true; } /* - * These routines are private to libFLAC - */ -uint32_t FLAC__format_get_max_rice_partition_order(uint32_t blocksize, uint32_t predictor_order) -{ - return - FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( - FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), - blocksize, - predictor_order - ); + These routines are private to libFLAC +*/ +uint32_t FLAC__format_get_max_rice_partition_order(uint32_t blocksize, uint32_t predictor_order) { + return + FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( + FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), + blocksize, + predictor_order + ); } -uint32_t FLAC__format_get_max_rice_partition_order_from_blocksize(uint32_t blocksize) -{ - uint32_t max_rice_partition_order = 0; - while(!(blocksize & 1)) { - max_rice_partition_order++; - blocksize >>= 1; - } - return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); +uint32_t FLAC__format_get_max_rice_partition_order_from_blocksize(uint32_t blocksize) { + uint32_t max_rice_partition_order = 0; + while (!(blocksize & 1)) { + max_rice_partition_order++; + blocksize >>= 1; + } + return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); } -uint32_t FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(uint32_t limit, uint32_t blocksize, uint32_t predictor_order) -{ - uint32_t max_rice_partition_order = limit; +uint32_t FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(uint32_t limit, uint32_t blocksize, uint32_t predictor_order) { + uint32_t max_rice_partition_order = limit; - while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) - max_rice_partition_order--; + while (max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) { + max_rice_partition_order--; + } - FLAC__ASSERT( - (max_rice_partition_order == 0 && blocksize >= predictor_order) || - (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) - ); + FLAC__ASSERT( + (max_rice_partition_order == 0 && blocksize >= predictor_order) || + (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) + ); - return max_rice_partition_order; + return max_rice_partition_order; } -void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); +void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) { + FLAC__ASSERT(0 != object); - object->parameters = 0; - object->raw_bits = 0; - object->capacity_by_order = 0; + object->parameters = 0; + object->raw_bits = 0; + object->capacity_by_order = 0; } -void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); +void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) { + FLAC__ASSERT(0 != object); - if(0 != object->parameters) - free(object->parameters); - if(0 != object->raw_bits) - free(object->raw_bits); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); + if (0 != object->parameters) { + free(object->parameters); + } + if (0 != object->raw_bits) { + free(object->raw_bits); + } + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); } -FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, uint32_t max_partition_order) -{ - FLAC__ASSERT(0 != object); +FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, uint32_t max_partition_order) { + FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); + FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); - if(object->capacity_by_order < max_partition_order) { - if(0 == (object->parameters = safe_realloc_(object->parameters, sizeof(uint32_t)*(1 << max_partition_order)))) - return false; - if(0 == (object->raw_bits = safe_realloc_(object->raw_bits, sizeof(uint32_t)*(1 << max_partition_order)))) - return false; - memset(object->raw_bits, 0, sizeof(uint32_t)*(1 << max_partition_order)); - object->capacity_by_order = max_partition_order; - } + if (object->capacity_by_order < max_partition_order) { + if (0 == (object->parameters = safe_realloc_(object->parameters, sizeof(uint32_t) * (1 << max_partition_order)))) { + return false; + } + if (0 == (object->raw_bits = safe_realloc_(object->raw_bits, sizeof(uint32_t) * (1 << max_partition_order)))) { + return false; + } + memset(object->raw_bits, 0, sizeof(uint32_t) * (1 << max_partition_order)); + object->capacity_by_order = max_partition_order; + } - return true; + return true; } diff --git a/src/libflac/lpc.c b/src/libflac/lpc.c index c2a489f4..407bd704 100644 --- a/src/libflac/lpc.c +++ b/src/libflac/lpc.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -56,209 +56,218 @@ #if defined(_MSC_VER) && (_MSC_VER < 1800) #include static inline long int lround(double x) { - return (long)(x + _copysign(0.5, x)); + return (long)(x + _copysign(0.5, x)); } #elif !defined(HAVE_LROUND) && defined(__GNUC__) static inline long int lround(double x) { - return (long)(x + __builtin_copysign(0.5, x)); + return (long)(x + __builtin_copysign(0.5, x)); } /* If this fails, we are in the presence of a mid 90's compiler, move along... */ #endif -void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len) -{ - uint32_t i; - for(i = 0; i < data_len; i++) - out[i] = in[i] * window[i]; +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len) { + uint32_t i; + for (i = 0; i < data_len; i++) { + out[i] = in[i] * window[i]; + } } -void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], uint32_t data_len, uint32_t lag, FLAC__real autoc[]) -{ - /* a readable, but slower, version */ +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], uint32_t data_len, uint32_t lag, FLAC__real autoc[]) { + /* a readable, but slower, version */ #if 0 - FLAC__real d; - uint32_t i; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - /* - * Technically we should subtract the mean first like so: - * for(i = 0; i < data_len; i++) - * data[i] -= mean; - * but it appears not to make enough of a difference to matter, and - * most signals are already closely centered around zero - */ - while(lag--) { - for(i = lag, d = 0.0; i < data_len; i++) - d += data[i] * data[i - lag]; - autoc[lag] = d; - } + FLAC__real d; + uint32_t i; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + /* + Technically we should subtract the mean first like so: + for(i = 0; i < data_len; i++) + data[i] -= mean; + but it appears not to make enough of a difference to matter, and + most signals are already closely centered around zero + */ + while (lag--) { + for (i = lag, d = 0.0; i < data_len; i++) { + d += data[i] * data[i - lag]; + } + autoc[lag] = d; + } #endif - /* - * this version tends to run faster because of better data locality - * ('data_len' is usually much larger than 'lag') - */ - FLAC__real d; - uint32_t sample, coeff; - const uint32_t limit = data_len - lag; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] = 0.0; - for(sample = 0; sample <= limit; sample++) { - d = data[sample]; - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } - for(; sample < data_len; sample++) { - d = data[sample]; - for(coeff = 0; coeff < data_len - sample; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } + /* + this version tends to run faster because of better data locality + ('data_len' is usually much larger than 'lag') + */ + FLAC__real d; + uint32_t sample, coeff; + const uint32_t limit = data_len - lag; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + for (coeff = 0; coeff < lag; coeff++) { + autoc[coeff] = 0.0; + } + for (sample = 0; sample <= limit; sample++) { + d = data[sample]; + for (coeff = 0; coeff < lag; coeff++) { + autoc[coeff] += d * data[sample + coeff]; + } + } + for (; sample < data_len; sample++) { + d = data[sample]; + for (coeff = 0; coeff < data_len - sample; coeff++) { + autoc[coeff] += d * data[sample + coeff]; + } + } } -void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], uint32_t *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[]) -{ - uint32_t i, j; - double r, err, lpc[FLAC__MAX_LPC_ORDER]; - - FLAC__ASSERT(0 != max_order); - FLAC__ASSERT(0 < *max_order); - FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); - FLAC__ASSERT(autoc[0] != 0.0); - - err = autoc[0]; - - for(i = 0; i < *max_order; i++) { - /* Sum up this iteration's reflection coefficient. */ - r = -autoc[i+1]; - for(j = 0; j < i; j++) - r -= lpc[j] * autoc[i-j]; - r /= err; - - /* Update LPC coefficients and total error. */ - lpc[i]=r; - for(j = 0; j < (i>>1); j++) { - double tmp = lpc[j]; - lpc[j] += r * lpc[i-1-j]; - lpc[i-1-j] += r * tmp; - } - if(i & 1) - lpc[j] += lpc[j] * r; - - err *= (1.0 - r * r); - - /* save this order */ - for(j = 0; j <= i; j++) - lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ - error[i] = err; - - /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ - if(err == 0.0) { - *max_order = i+1; - return; - } - } +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], uint32_t *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[]) { + uint32_t i, j; + double r, err, lpc[FLAC__MAX_LPC_ORDER]; + + FLAC__ASSERT(0 != max_order); + FLAC__ASSERT(0 < *max_order); + FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); + FLAC__ASSERT(autoc[0] != 0.0); + + err = autoc[0]; + + for (i = 0; i < *max_order; i++) { + /* Sum up this iteration's reflection coefficient. */ + r = -autoc[i + 1]; + for (j = 0; j < i; j++) { + r -= lpc[j] * autoc[i - j]; + } + r /= err; + + /* Update LPC coefficients and total error. */ + lpc[i] = r; + for (j = 0; j < (i >> 1); j++) { + double tmp = lpc[j]; + lpc[j] += r * lpc[i - 1 - j]; + lpc[i - 1 - j] += r * tmp; + } + if (i & 1) { + lpc[j] += lpc[j] * r; + } + + err *= (1.0 - r * r); + + /* save this order */ + for (j = 0; j <= i; j++) { + lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ + } + error[i] = err; + + /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ + if (err == 0.0) { + *max_order = i + 1; + return; + } + } } -int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order, uint32_t precision, FLAC__int32 qlp_coeff[], int *shift) -{ - uint32_t i; - double cmax; - FLAC__int32 qmax, qmin; - - FLAC__ASSERT(precision > 0); - FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); - - /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ - precision--; - qmax = 1 << precision; - qmin = -qmax; - qmax--; - - /* calc cmax = max( |lp_coeff[i]| ) */ - cmax = 0.0; - for(i = 0; i < order; i++) { - const double d = fabs(lp_coeff[i]); - if(d > cmax) - cmax = d; - } - - if(cmax <= 0.0) { - /* => coefficients are all 0, which means our constant-detect didn't work */ - return 2; - } - else { - const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; - const int min_shiftlimit = -max_shiftlimit - 1; - int log2cmax; - - (void)frexp(cmax, &log2cmax); - log2cmax--; - *shift = (int)precision - log2cmax - 1; - - if(*shift > max_shiftlimit) - *shift = max_shiftlimit; - else if(*shift < min_shiftlimit) - return 1; - } - - if(*shift >= 0) { - double error = 0.0; - FLAC__int32 q; - for(i = 0; i < order; i++) { - error += lp_coeff[i] * (1 << *shift); - q = lround(error); +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order, uint32_t precision, FLAC__int32 qlp_coeff[], int *shift) { + uint32_t i; + double cmax; + FLAC__int32 qmax, qmin; + + FLAC__ASSERT(precision > 0); + FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); + + /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ + precision--; + qmax = 1 << precision; + qmin = -qmax; + qmax--; + + /* calc cmax = max( |lp_coeff[i]| ) */ + cmax = 0.0; + for (i = 0; i < order; i++) { + const double d = fabs(lp_coeff[i]); + if (d > cmax) { + cmax = d; + } + } + + if (cmax <= 0.0) { + /* => coefficients are all 0, which means our constant-detect didn't work */ + return 2; + } else { + const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN - 1)) - 1; + const int min_shiftlimit = -max_shiftlimit - 1; + int log2cmax; + + (void)frexp(cmax, &log2cmax); + log2cmax--; + *shift = (int)precision - log2cmax - 1; + + if (*shift > max_shiftlimit) { + *shift = max_shiftlimit; + } else if (*shift < min_shiftlimit) { + return 1; + } + } + + if (*shift >= 0) { + double error = 0.0; + FLAC__int32 q; + for (i = 0; i < order; i++) { + error += lp_coeff[i] * (1 << *shift); + q = lround(error); #ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax + 1) { /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr, "FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n", q, qmax, *shift, cmax, precision + 1, i, lp_coeff[i]); + } else if (q < qmin) { + fprintf(stderr, "FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - } - /* negative shift is very rare but due to design flaw, negative shift is - * not allowed in the decoder, so it must be handled specially by scaling - * down coeffs - */ - else { - const int nshift = -(*shift); - double error = 0.0; - FLAC__int32 q; + if (q > qmax) { + q = qmax; + } else if (q < qmin) { + q = qmin; + } + error -= q; + qlp_coeff[i] = q; + } + } + /* negative shift is very rare but due to design flaw, negative shift is + not allowed in the decoder, so it must be handled specially by scaling + down coeffs + */ + else { + const int nshift = -(*shift); + double error = 0.0; + FLAC__int32 q; #ifndef NDEBUG - fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); + fprintf(stderr, "FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); #endif - for(i = 0; i < order; i++) { - error += lp_coeff[i] / (1 << nshift); - q = lround(error); + for (i = 0; i < order; i++) { + error += lp_coeff[i] / (1 << nshift); + q = lround(error); #ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax + 1) { /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr, "FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n", q, qmax, *shift, cmax, precision + 1, i, lp_coeff[i]); + } else if (q < qmin) { + fprintf(stderr, "FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - *shift = 0; - } - - return 0; + if (q > qmax) { + q = qmax; + } else if (q < qmin) { + q = qmin; + } + error -= q; + qlp_coeff[i] = q; + } + *shift = 0; + } + + return 0; } #if defined(_MSC_VER) @@ -269,515 +278,497 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order, void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { - FLAC__int64 sumo; - uint32_t i, j; - FLAC__int32 sum; - const FLAC__int32 *history; + FLAC__int64 sumo; + uint32_t i, j; + FLAC__int32 sum; + const FLAC__int32 *history; #ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(residual++) = *(data++) - (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - */ + FLAC__ASSERT(order > 0); + + for (i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for (j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + if (sumo > 2147483647ll || sumo < -2147483648ll) { + fprintf(stderr, "FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n", i, j, qlp_coeff[j], *history, sumo); + } + } + *(residual++) = *(data++) - (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + */ } #else /* fully unrolled version for normal use */ { - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */ - case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */ - case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */ - case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */ - case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */ - case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */ - case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */ - case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */ - case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */ - case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */ - case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */ - case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */ - case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */ - case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */ - case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */ - case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */ - case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */ - case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */ - case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */ - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + We do unique versions up to 12th order since that's the subset limit. + Also they are roughly ordered to match frequency of occurrence to + minimize branching. + */ + if (order <= 12) { + if (order > 8) { + if (order > 10) { + if (order == 12) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i - 12]; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 11 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } else { + if (order == 10) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 9 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } else if (order > 4) { + if (order > 6) { + if (order == 8) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 7 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } else { + if (order == 6) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 5 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } else { + if (order > 2) { + if (order == 4) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 3 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } else { + if (order == 2) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } else { /* order == 1 */ + for (i = 0; i < (int)data_len; i++) { + residual[i] = data[i] - ((qlp_coeff[0] * data[i - 1]) >> lp_quantization); + } + } + } + } + } else { /* order > 12 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + switch (order) { + case 32: sum += qlp_coeff[31] * data[i - 32]; /* Falls through. */ + case 31: sum += qlp_coeff[30] * data[i - 31]; /* Falls through. */ + case 30: sum += qlp_coeff[29] * data[i - 30]; /* Falls through. */ + case 29: sum += qlp_coeff[28] * data[i - 29]; /* Falls through. */ + case 28: sum += qlp_coeff[27] * data[i - 28]; /* Falls through. */ + case 27: sum += qlp_coeff[26] * data[i - 27]; /* Falls through. */ + case 26: sum += qlp_coeff[25] * data[i - 26]; /* Falls through. */ + case 25: sum += qlp_coeff[24] * data[i - 25]; /* Falls through. */ + case 24: sum += qlp_coeff[23] * data[i - 24]; /* Falls through. */ + case 23: sum += qlp_coeff[22] * data[i - 23]; /* Falls through. */ + case 22: sum += qlp_coeff[21] * data[i - 22]; /* Falls through. */ + case 21: sum += qlp_coeff[20] * data[i - 21]; /* Falls through. */ + case 20: sum += qlp_coeff[19] * data[i - 20]; /* Falls through. */ + case 19: sum += qlp_coeff[18] * data[i - 19]; /* Falls through. */ + case 18: sum += qlp_coeff[17] * data[i - 18]; /* Falls through. */ + case 17: sum += qlp_coeff[16] * data[i - 17]; /* Falls through. */ + case 16: sum += qlp_coeff[15] * data[i - 16]; /* Falls through. */ + case 15: sum += qlp_coeff[14] * data[i - 15]; /* Falls through. */ + case 14: sum += qlp_coeff[13] * data[i - 14]; /* Falls through. */ + case 13: sum += qlp_coeff[12] * data[i - 13]; + sum += qlp_coeff[11] * data[i - 12]; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[ 9] * data[i - 10]; + sum += qlp_coeff[ 8] * data[i - 9]; + sum += qlp_coeff[ 7] * data[i - 8]; + sum += qlp_coeff[ 6] * data[i - 7]; + sum += qlp_coeff[ 5] * data[i - 6]; + sum += qlp_coeff[ 4] * data[i - 5]; + sum += qlp_coeff[ 3] * data[i - 4]; + sum += qlp_coeff[ 2] * data[i - 3]; + sum += qlp_coeff[ 1] * data[i - 2]; + sum += qlp_coeff[ 0] * data[i - 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } } #endif void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { - uint32_t i, j; - FLAC__int64 sum; - const FLAC__int32 *history; + uint32_t i, j; + FLAC__int64 sum; + const FLAC__int32 *history; #ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); - break; - } - *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); - } + FLAC__ASSERT(order > 0); + + for (i = 0; i < data_len; i++) { + sum = 0; + history = data; + for (j = 0; j < order; j++) { + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + } + if (FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { + fprintf(stderr, "FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if (FLAC__bitmath_silog2((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { + fprintf(stderr, "FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); + break; + } + *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); + } } #else /* fully unrolled version for normal use */ { - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */ - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */ - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */ - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */ - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */ - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */ - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */ - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */ - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */ - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */ - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */ - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */ - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */ - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */ - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */ - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */ - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */ - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */ - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */ - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + We do unique versions up to 12th order since that's the subset limit. + Also they are roughly ordered to match frequency of occurrence to + minimize branching. + */ + if (order <= 12) { + if (order > 8) { + if (order > 10) { + if (order == 12) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i - 12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 11 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } else { + if (order == 10) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 9 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } else if (order > 4) { + if (order > 6) { + if (order == 8) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 7 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } else { + if (order == 6) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 5 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } else { + if (order > 2) { + if (order == 4) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 3 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } else { + if (order == 2) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } else { /* order == 1 */ + for (i = 0; i < (int)data_len; i++) { + residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i - 1]) >> lp_quantization); + } + } + } + } + } else { /* order > 12 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + switch (order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i - 32]; /* Falls through. */ + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i - 31]; /* Falls through. */ + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i - 30]; /* Falls through. */ + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i - 29]; /* Falls through. */ + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i - 28]; /* Falls through. */ + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i - 27]; /* Falls through. */ + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i - 26]; /* Falls through. */ + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i - 25]; /* Falls through. */ + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i - 24]; /* Falls through. */ + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i - 23]; /* Falls through. */ + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i - 22]; /* Falls through. */ + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i - 21]; /* Falls through. */ + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i - 20]; /* Falls through. */ + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i - 19]; /* Falls through. */ + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i - 18]; /* Falls through. */ + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i - 17]; /* Falls through. */ + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i - 16]; /* Falls through. */ + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i - 15]; /* Falls through. */ + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i - 14]; /* Falls through. */ + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i - 13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i - 12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i - 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } } #endif @@ -786,515 +777,497 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * f void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict data) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { - FLAC__int64 sumo; - uint32_t i, j; - FLAC__int32 sum; - const FLAC__int32 *r = residual, *history; + FLAC__int64 sumo; + uint32_t i, j; + FLAC__int32 sum; + const FLAC__int32 *r = residual, *history; #ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(data++) = *(r++) + (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - */ + FLAC__ASSERT(order > 0); + + for (i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for (j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + if (sumo > 2147483647ll || sumo < -2147483648ll) { + fprintf(stderr, "FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n", i, j, qlp_coeff[j], *history, sumo); + } + } + *(data++) = *(r++) + (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + */ } #else /* fully unrolled version for normal use */ { - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */ - case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */ - case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */ - case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */ - case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */ - case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */ - case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */ - case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */ - case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */ - case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */ - case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */ - case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */ - case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */ - case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */ - case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */ - case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */ - case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */ - case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */ - case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */ - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - data[i] = residual[i] + (sum >> lp_quantization); - } - } + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + We do unique versions up to 12th order since that's the subset limit. + Also they are roughly ordered to match frequency of occurrence to + minimize branching. + */ + if (order <= 12) { + if (order > 8) { + if (order > 10) { + if (order == 12) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i - 12]; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 11 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } else { + if (order == 10) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i - 10]; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 9 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i - 9]; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } else if (order > 4) { + if (order > 6) { + if (order == 8) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i - 8]; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 7 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i - 7]; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } else { + if (order == 6) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i - 6]; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 5 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i - 5]; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } else { + if (order > 2) { + if (order == 4) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i - 4]; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 3 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i - 3]; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } else { + if (order == 2) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i - 2]; + sum += qlp_coeff[0] * data[i - 1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } else { /* order == 1 */ + for (i = 0; i < (int)data_len; i++) { + data[i] = residual[i] + ((qlp_coeff[0] * data[i - 1]) >> lp_quantization); + } + } + } + } + } else { /* order > 12 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + switch (order) { + case 32: sum += qlp_coeff[31] * data[i - 32]; /* Falls through. */ + case 31: sum += qlp_coeff[30] * data[i - 31]; /* Falls through. */ + case 30: sum += qlp_coeff[29] * data[i - 30]; /* Falls through. */ + case 29: sum += qlp_coeff[28] * data[i - 29]; /* Falls through. */ + case 28: sum += qlp_coeff[27] * data[i - 28]; /* Falls through. */ + case 27: sum += qlp_coeff[26] * data[i - 27]; /* Falls through. */ + case 26: sum += qlp_coeff[25] * data[i - 26]; /* Falls through. */ + case 25: sum += qlp_coeff[24] * data[i - 25]; /* Falls through. */ + case 24: sum += qlp_coeff[23] * data[i - 24]; /* Falls through. */ + case 23: sum += qlp_coeff[22] * data[i - 23]; /* Falls through. */ + case 22: sum += qlp_coeff[21] * data[i - 22]; /* Falls through. */ + case 21: sum += qlp_coeff[20] * data[i - 21]; /* Falls through. */ + case 20: sum += qlp_coeff[19] * data[i - 20]; /* Falls through. */ + case 19: sum += qlp_coeff[18] * data[i - 19]; /* Falls through. */ + case 18: sum += qlp_coeff[17] * data[i - 18]; /* Falls through. */ + case 17: sum += qlp_coeff[16] * data[i - 17]; /* Falls through. */ + case 16: sum += qlp_coeff[15] * data[i - 16]; /* Falls through. */ + case 15: sum += qlp_coeff[14] * data[i - 15]; /* Falls through. */ + case 14: sum += qlp_coeff[13] * data[i - 14]; /* Falls through. */ + case 13: sum += qlp_coeff[12] * data[i - 13]; + sum += qlp_coeff[11] * data[i - 12]; + sum += qlp_coeff[10] * data[i - 11]; + sum += qlp_coeff[ 9] * data[i - 10]; + sum += qlp_coeff[ 8] * data[i - 9]; + sum += qlp_coeff[ 7] * data[i - 8]; + sum += qlp_coeff[ 6] * data[i - 7]; + sum += qlp_coeff[ 5] * data[i - 6]; + sum += qlp_coeff[ 4] * data[i - 5]; + sum += qlp_coeff[ 3] * data[i - 4]; + sum += qlp_coeff[ 2] * data[i - 3]; + sum += qlp_coeff[ 1] * data[i - 2]; + sum += qlp_coeff[ 0] * data[i - 1]; + } + data[i] = residual[i] + (sum >> lp_quantization); + } + } } #endif void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict data) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { - uint32_t i, j; - FLAC__int64 sum; - const FLAC__int32 *r = residual, *history; + uint32_t i, j; + FLAC__int64 sum; + const FLAC__int32 *r = residual, *history; #ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); - break; - } - *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); - } + FLAC__ASSERT(order > 0); + + for (i = 0; i < data_len; i++) { + sum = 0; + history = data; + for (j = 0; j < order; j++) { + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + } + if (FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { + fprintf(stderr, "FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if (FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { + fprintf(stderr, "FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); + break; + } + *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); + } } #else /* fully unrolled version for normal use */ { - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */ - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */ - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */ - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */ - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */ - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */ - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */ - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */ - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */ - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */ - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */ - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */ - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */ - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */ - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */ - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */ - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */ - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */ - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */ - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization)); - } - } + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + We do unique versions up to 12th order since that's the subset limit. + Also they are roughly ordered to match frequency of occurrence to + minimize branching. + */ + if (order <= 12) { + if (order > 8) { + if (order > 10) { + if (order == 12) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i - 12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 11 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } + } else { + if (order == 10) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 9 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } + } + } else if (order > 4) { + if (order > 6) { + if (order == 8) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 7 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } + } else { + if (order == 6) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 5 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } + } + } else { + if (order > 2) { + if (order == 4) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 3 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } + } else { + if (order == 2) { + for (i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i - 1]; + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } else { /* order == 1 */ + for (i = 0; i < (int)data_len; i++) { + data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i - 1]) >> lp_quantization); + } + } + } + } + } else { /* order > 12 */ + for (i = 0; i < (int)data_len; i++) { + sum = 0; + switch (order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i - 32]; /* Falls through. */ + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i - 31]; /* Falls through. */ + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i - 30]; /* Falls through. */ + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i - 29]; /* Falls through. */ + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i - 28]; /* Falls through. */ + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i - 27]; /* Falls through. */ + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i - 26]; /* Falls through. */ + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i - 25]; /* Falls through. */ + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i - 24]; /* Falls through. */ + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i - 23]; /* Falls through. */ + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i - 22]; /* Falls through. */ + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i - 21]; /* Falls through. */ + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i - 20]; /* Falls through. */ + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i - 19]; /* Falls through. */ + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i - 18]; /* Falls through. */ + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i - 17]; /* Falls through. */ + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i - 16]; /* Falls through. */ + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i - 15]; /* Falls through. */ + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i - 14]; /* Falls through. */ + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i - 13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i - 12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i - 11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i - 10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i - 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i - 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i - 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i - 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i - 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i - 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i - 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i - 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i - 1]; + } + data[i] = (FLAC__int32)(residual[i] + (sum >> lp_quantization)); + } + } } #endif @@ -1304,56 +1277,52 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, u #ifndef FLAC__INTEGER_ONLY_LIBRARY -double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, uint32_t total_samples) -{ - double error_scale; +double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, uint32_t total_samples) { + double error_scale; - FLAC__ASSERT(total_samples > 0); + FLAC__ASSERT(total_samples > 0); - error_scale = 0.5 / (double)total_samples; + error_scale = 0.5 / (double)total_samples; - return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); + return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); } -double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale) -{ - if(lpc_error > 0.0) { - double bps = (double)0.5 * log(error_scale * lpc_error) / M_LN2; - if(bps >= 0.0) - return bps; - else - return 0.0; - } - else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ - return 1e32; - } - else { - return 0.0; - } +double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale) { + if (lpc_error > 0.0) { + double bps = (double)0.5 * log(error_scale * lpc_error) / M_LN2; + if (bps >= 0.0) { + return bps; + } else { + return 0.0; + } + } else if (lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ + return 1e32; + } else { + return 0.0; + } } -uint32_t FLAC__lpc_compute_best_order(const double lpc_error[], uint32_t max_order, uint32_t total_samples, uint32_t overhead_bits_per_order) -{ - uint32_t order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ - double bits, best_bits, error_scale; +uint32_t FLAC__lpc_compute_best_order(const double lpc_error[], uint32_t max_order, uint32_t total_samples, uint32_t overhead_bits_per_order) { + uint32_t order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ + double bits, best_bits, error_scale; - FLAC__ASSERT(max_order > 0); - FLAC__ASSERT(total_samples > 0); + FLAC__ASSERT(max_order > 0); + FLAC__ASSERT(total_samples > 0); - error_scale = 0.5 / (double)total_samples; + error_scale = 0.5 / (double)total_samples; - best_index = 0; - best_bits = (uint32_t)(-1); + best_index = 0; + best_bits = (uint32_t)(-1); - for(indx = 0, order = 1; indx < max_order; indx++, order++) { - bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (double)(total_samples - order) + (double)(order * overhead_bits_per_order); - if(bits < best_bits) { - best_index = indx; - best_bits = bits; - } - } + for (indx = 0, order = 1; indx < max_order; indx++, order++) { + bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (double)(total_samples - order) + (double)(order * overhead_bits_per_order); + if (bits < best_bits) { + best_index = indx; + best_bits = bits; + } + } - return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ + return best_index + 1; /* +1 since indx of lpc_error[] is order-1 */ } #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/src/libflac/md5.c b/src/libflac/md5.c index 19c68a6c..90880316 100644 --- a/src/libflac/md5.c +++ b/src/libflac/md5.c @@ -12,29 +12,29 @@ #pragma GCC optimize ("O3") /* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' header - * definitions; now uses stuff from dpkg's config.h. - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain. - */ + This code implements the MD5 message-digest algorithm. + The algorithm is due to Ron Rivest. This code was + written by Colin Plumb in 1993, no copyright is claimed. + This code is in the public domain; do with it what you wish. + + Equivalent code is available from RSA Data Security, Inc. + This code has been tested against that, and is equivalent, + except that you don't need to include two pages of legalese + with every copy. + + To compute the message digest of a chunk of bytes, declare an + MD5Context structure, pass it to MD5Init, call MD5Update as + needed on buffers full of bytes, and then call MD5Final, which + will fill a supplied 16-byte array with the digest. + + Changed so as no longer to depend on Colin Plumb's `usual.h' header + definitions; now uses stuff from dpkg's config.h. + - Ian Jackson . + Still in the public domain. + + Josh Coalson: made some changes to integrate with libFLAC. + Still in the public domain. +*/ /* The four core functions - F1 is optimized somewhat */ @@ -49,124 +49,121 @@ (w += f(x,y,z) + in, w = (w<>(32-s)) + x) /* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) -{ - register FLAC__uint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; + The core of the MD5 algorithm, this alters an existing MD5 hash to + reflect the addition of 16 longwords of new data. MD5Update blocks + the data and converts bytes into longwords for this routine. +*/ +static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) { + register FLAC__uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; } #if WORDS_BIGENDIAN //@@@@@@ OPT: use bswap/intrinsics -static void byteSwap(FLAC__uint32 *buf, uint32_t words) -{ - register FLAC__uint32 x; - do { - x = *buf; - x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); - *buf++ = (x >> 16) | (x << 16); - } while (--words); +static void byteSwap(FLAC__uint32 *buf, uint32_t words) { + register FLAC__uint32 x; + do { + x = *buf; + x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); + *buf++ = (x >> 16) | (x << 16); + } while (--words); } -static void byteSwapX16(FLAC__uint32 *buf) -{ - register FLAC__uint32 x; - - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); +static void byteSwapX16(FLAC__uint32 *buf) { + register FLAC__uint32 x; + + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); } #else #define byteSwap(buf, words) @@ -174,345 +171,349 @@ static void byteSwapX16(FLAC__uint32 *buf) #endif /* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, uint32_t len) -{ - FLAC__uint32 t; - - /* Update byte count */ - - t = ctx->bytes[0]; - if ((ctx->bytes[0] = t + len) < t) - ctx->bytes[1]++; /* Carry from low to high */ - - t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ - if (t > len) { - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); - return; - } - /* First chunk is an odd size */ - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - - /* Process data in 64-byte chunks */ - while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - memcpy(ctx->in, buf, len); + Update context to reflect the concatenation of another buffer full + of bytes. +*/ +static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, uint32_t len) { + FLAC__uint32 t; + + /* Update byte count */ + + t = ctx->bytes[0]; + if ((ctx->bytes[0] = t + len) < t) { + ctx->bytes[1]++; /* Carry from low to high */ + } + + t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ + if (t > len) { + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); + return; + } + /* First chunk is an odd size */ + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += t; + len -= t; + + /* Process data in 64-byte chunks */ + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + memcpy(ctx->in, buf, len); } /* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void FLAC__MD5Init(FLAC__MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bytes[0] = 0; - ctx->bytes[1] = 0; - - ctx->internal_buf.p8 = 0; - ctx->capacity = 0; + Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + initialization constants. +*/ +void FLAC__MD5Init(FLAC__MD5Context *ctx) { + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bytes[0] = 0; + ctx->bytes[1] = 0; + + ctx->internal_buf.p8 = 0; + ctx->capacity = 0; } /* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) -{ - int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ - FLAC__byte *p = (FLAC__byte *)ctx->in + count; - - /* Set the first char of padding to 0x80. There is always room. */ - *p++ = 0x80; - - /* Bytes of padding needed to make 56 bytes (-8..55) */ - count = 56 - 1 - count; - - if (count < 0) { /* Padding forces an extra block */ - memset(p, 0, count + 8); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - p = (FLAC__byte *)ctx->in; - count = 56; - } - memset(p, 0, count); - byteSwap(ctx->in, 14); - - /* Append length in bits and transform */ - ctx->in[14] = ctx->bytes[0] << 3; - ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; - FLAC__MD5Transform(ctx->buf, ctx->in); - - byteSwap(ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - if (0 != ctx->internal_buf.p8) { - free(ctx->internal_buf.p8); - ctx->internal_buf.p8 = 0; - ctx->capacity = 0; - } - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ + Final wrapup - pad to 64-byte boundary with the bit pattern + 1 0* (64-bit count of bits processed, MSB-first) +*/ +void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) { + int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ + FLAC__byte *p = (FLAC__byte *)ctx->in + count; + + /* Set the first char of padding to 0x80. There is always room. */ + *p++ = 0x80; + + /* Bytes of padding needed to make 56 bytes (-8..55) */ + count = 56 - 1 - count; + + if (count < 0) { /* Padding forces an extra block */ + memset(p, 0, count + 8); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + p = (FLAC__byte *)ctx->in; + count = 56; + } + memset(p, 0, count); + byteSwap(ctx->in, 14); + + /* Append length in bits and transform */ + ctx->in[14] = ctx->bytes[0] << 3; + ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; + FLAC__MD5Transform(ctx->buf, ctx->in); + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + if (0 != ctx->internal_buf.p8) { + free(ctx->internal_buf.p8); + ctx->internal_buf.p8 = 0; + ctx->capacity = 0; + } + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ } /* - * Convert the incoming audio signal to a byte stream - */ -static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample) -{ - FLAC__byte *buf_ = mbuf->p8; - FLAC__int16 *buf16 = mbuf->p16; - FLAC__int32 *buf32 = mbuf->p32; - FLAC__int32 a_word; - uint32_t channel, sample; - - /* Storage in the output buffer, buf, is little endian. */ + Convert the incoming audio signal to a byte stream +*/ +static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample) { + FLAC__byte *buf_ = mbuf->p8; + FLAC__int16 *buf16 = mbuf->p16; + FLAC__int32 *buf32 = mbuf->p32; + FLAC__int32 a_word; + uint32_t channel, sample; + + /* Storage in the output buffer, buf, is little endian. */ #define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels) - /* First do the most commonly used combinations. */ - switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) { - /* One byte per sample. */ - case (BYTES_CHANNEL_SELECTOR (1, 1)): - for (sample = 0; sample < samples; sample++) - *buf_++ = signal[0][sample]; - return; - - case (BYTES_CHANNEL_SELECTOR (1, 2)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 4)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 6)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 8)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - *buf_++ = signal[6][sample]; - *buf_++ = signal[7][sample]; - } - return; - - /* Two bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (2, 1)): - for (sample = 0; sample < samples; sample++) - *buf16++ = H2LE_16(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (2, 2)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 4)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 6)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 8)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - *buf16++ = H2LE_16(signal[6][sample]); - *buf16++ = H2LE_16(signal[7][sample]); - } - return; - - /* Three bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (3, 1)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case (BYTES_CHANNEL_SELECTOR (3, 2)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - a_word = signal[1][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - /* Four bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (4, 1)): - for (sample = 0; sample < samples; sample++) - *buf32++ = H2LE_32(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (4, 2)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 4)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 6)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 8)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - *buf32++ = H2LE_32(signal[6][sample]); - *buf32++ = H2LE_32(signal[7][sample]); - } - return; - - default: - break; - } - - /* General version. */ - switch (bytes_per_sample) { - case 1: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf_++ = signal[channel][sample]; - return; - - case 2: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf16++ = H2LE_16(signal[channel][sample]); - return; - - case 3: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) { - a_word = signal[channel][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case 4: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf32++ = H2LE_32(signal[channel][sample]); - return; - - default: - break; - } + /* First do the most commonly used combinations. */ + switch (BYTES_CHANNEL_SELECTOR(bytes_per_sample, channels)) { + /* One byte per sample. */ + case (BYTES_CHANNEL_SELECTOR(1, 1)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR(1, 2)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR(1, 4)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR(1, 6)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + *buf_++ = signal[4][sample]; + *buf_++ = signal[5][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR(1, 8)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + *buf_++ = signal[4][sample]; + *buf_++ = signal[5][sample]; + *buf_++ = signal[6][sample]; + *buf_++ = signal[7][sample]; + } + return; + + /* Two bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR(2, 1)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(2, 2)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(2, 4)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(2, 6)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + *buf16++ = H2LE_16(signal[4][sample]); + *buf16++ = H2LE_16(signal[5][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(2, 8)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + *buf16++ = H2LE_16(signal[4][sample]); + *buf16++ = H2LE_16(signal[5][sample]); + *buf16++ = H2LE_16(signal[6][sample]); + *buf16++ = H2LE_16(signal[7][sample]); + } + return; + + /* Three bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR(3, 1)): + for (sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + return; + + case (BYTES_CHANNEL_SELECTOR(3, 2)): + for (sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + return; + + /* Four bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR(4, 1)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(4, 2)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(4, 4)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(4, 6)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); + *buf32++ = H2LE_32(signal[4][sample]); + *buf32++ = H2LE_32(signal[5][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR(4, 8)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); + *buf32++ = H2LE_32(signal[4][sample]); + *buf32++ = H2LE_32(signal[5][sample]); + *buf32++ = H2LE_32(signal[6][sample]); + *buf32++ = H2LE_32(signal[7][sample]); + } + return; + + default: + break; + } + + /* General version. */ + switch (bytes_per_sample) { + case 1: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) { + *buf_++ = signal[channel][sample]; + } + return; + + case 2: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) { + *buf16++ = H2LE_16(signal[channel][sample]); + } + return; + + case 3: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + return; + + case 4: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) { + *buf32++ = H2LE_32(signal[channel][sample]); + } + return; + + default: + break; + } } /* - * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. - */ -FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample) -{ - const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; - - /* overflow check */ - if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) - return false; - if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) - return false; - - if (ctx->capacity < bytes_needed) { - if (0 == (ctx->internal_buf.p8 = safe_realloc_(ctx->internal_buf.p8, bytes_needed))) { - if (0 == (ctx->internal_buf.p8 = safe_malloc_(bytes_needed))) { - ctx->capacity = 0; - return false; - } - } - ctx->capacity = bytes_needed; - } - - format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); - - FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); - - return true; + Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. +*/ +FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample) { + const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; + + /* overflow check */ + if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) { + return false; + } + if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) { + return false; + } + + if (ctx->capacity < bytes_needed) { + if (0 == (ctx->internal_buf.p8 = safe_realloc_(ctx->internal_buf.p8, bytes_needed))) { + if (0 == (ctx->internal_buf.p8 = safe_malloc_(bytes_needed))) { + ctx->capacity = 0; + return false; + } + } + ctx->capacity = bytes_needed; + } + + format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); + + FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); + + return true; } diff --git a/src/libflac/memory.c b/src/libflac/memory.c index c2ac3605..9a8426f6 100644 --- a/src/libflac/memory.c +++ b/src/libflac/memory.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -44,177 +44,177 @@ #pragma GCC optimize ("O3") -void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) -{ - void *x; +void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) { + void *x; - FLAC__ASSERT(0 != aligned_address); + FLAC__ASSERT(0 != aligned_address); #ifdef FLAC__ALIGN_MALLOC_DATA - /* align on 32-byte (256-bit) boundary */ - x = safe_malloc_add_2op_(bytes, /*+*/31L); - *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); + /* align on 32-byte (256-bit) boundary */ + x = safe_malloc_add_2op_(bytes, /*+*/31L); + *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); #else - x = safe_malloc_(bytes); - *aligned_address = x; + x = safe_malloc_(bytes); + *aligned_address = x; #endif - return x; + return x; } -FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) -{ - FLAC__int32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__int32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } +FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) { + FLAC__int32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__int32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if (elements > SIZE_MAX / sizeof(*pu)) { /* overflow check */ + return false; + } + + pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if (0 == pu) { + return false; + } else { + if (*unaligned_pointer != 0) { + free(*unaligned_pointer); + } + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } } -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) -{ - FLAC__uint32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } +FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) { + FLAC__uint32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if (elements > SIZE_MAX / sizeof(*pu)) { /* overflow check */ + return false; + } + + pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if (0 == pu) { + return false; + } else { + if (*unaligned_pointer != 0) { + free(*unaligned_pointer); + } + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } } -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) -{ - FLAC__uint64 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint64 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } +FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) { + FLAC__uint64 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint64 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if (elements > SIZE_MAX / sizeof(*pu)) { /* overflow check */ + return false; + } + + pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if (0 == pu) { + return false; + } else { + if (*unaligned_pointer != 0) { + free(*unaligned_pointer); + } + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } } -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, uint32_t **unaligned_pointer, uint32_t **aligned_pointer) -{ - uint32_t *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - uint32_t *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } +FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, uint32_t **unaligned_pointer, uint32_t **aligned_pointer) { + uint32_t *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + uint32_t *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if (elements > SIZE_MAX / sizeof(*pu)) { /* overflow check */ + return false; + } + + pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if (0 == pu) { + return false; + } else { + if (*unaligned_pointer != 0) { + free(*unaligned_pointer); + } + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } } #ifndef FLAC__INTEGER_ONLY_LIBRARY -FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) -{ - FLAC__real *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__real *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } +FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) { + FLAC__real *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__real *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if (elements > SIZE_MAX / sizeof(*pu)) { /* overflow check */ + return false; + } + + pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if (0 == pu) { + return false; + } else { + if (*unaligned_pointer != 0) { + free(*unaligned_pointer); + } + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } } #endif -void *safe_malloc_mul_2op_p(size_t size1, size_t size2) -{ - if(!size1 || !size2) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); +void *safe_malloc_mul_2op_p(size_t size1, size_t size2) { + if (!size1 || !size2) { + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + } + if (size1 > SIZE_MAX / size2) { + return 0; + } + return malloc(size1 * size2); } diff --git a/src/libflac/private/bitmath.h b/src/libflac/private/bitmath.h index 473227d8..d0a24c1b 100644 --- a/src/libflac/private/bitmath.h +++ b/src/libflac/private/bitmath.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__BITMATH_H #define FLAC__PRIVATE__BITMATH_H @@ -45,165 +45,159 @@ #endif /* Will never be emitted for MSVC, GCC, Intel compilers */ -static inline uint32_t FLAC__clz_soft_uint32(FLAC__uint32 word) -{ - static const uint8_t byte_to_unary_table[] PROGMEM = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - - return word > 0xffffff ? pgm_read_byte(&byte_to_unary_table[word >> 24]) : - word > 0xffff ? pgm_read_byte(&byte_to_unary_table[word >> 16]) + 8 : - word > 0xff ? pgm_read_byte(&byte_to_unary_table[word >> 8]) + 16 : - pgm_read_byte(&byte_to_unary_table[word]) + 24; +static inline uint32_t FLAC__clz_soft_uint32(FLAC__uint32 word) { + static const uint8_t byte_to_unary_table[] PROGMEM = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + return word > 0xffffff ? pgm_read_byte(&byte_to_unary_table[word >> 24]) : + word > 0xffff ? pgm_read_byte(&byte_to_unary_table[word >> 16]) + 8 : + word > 0xff ? pgm_read_byte(&byte_to_unary_table[word >> 8]) + 16 : + pgm_read_byte(&byte_to_unary_table[word]) + 24; } -static inline uint32_t FLAC__clz_uint32(FLAC__uint32 v) -{ -/* Never used with input 0 */ - FLAC__ASSERT(v > 0); +static inline uint32_t FLAC__clz_uint32(FLAC__uint32 v) { + /* Never used with input 0 */ + FLAC__ASSERT(v > 0); #if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v) ^ 31U; + return _bit_scan_reverse(v) ^ 31U; #elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -/* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on - * -march= setting or to a software routine in exotic machines. */ - return __builtin_clz(v); + /* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on + -march= setting or to a software routine in exotic machines. */ + return __builtin_clz(v); #elif defined(_MSC_VER) - { - uint32_t idx; - _BitScanReverse(&idx, v); - return idx ^ 31U; - } + { + uint32_t idx; + _BitScanReverse(&idx, v); + return idx ^ 31U; + } #else - return FLAC__clz_soft_uint32(v); + return FLAC__clz_soft_uint32(v); #endif } /* Used when 64-bit bsr/clz is unavailable; can use 32-bit bsr/clz when possible */ -static inline uint32_t FLAC__clz_soft_uint64(FLAC__uint64 word) -{ - return (FLAC__uint32)(word>>32) ? FLAC__clz_uint32((FLAC__uint32)(word>>32)) : - FLAC__clz_uint32((FLAC__uint32)word) + 32; +static inline uint32_t FLAC__clz_soft_uint64(FLAC__uint64 word) { + return (FLAC__uint32)(word >> 32) ? FLAC__clz_uint32((FLAC__uint32)(word >> 32)) : + FLAC__clz_uint32((FLAC__uint32)word) + 32; } -static inline uint32_t FLAC__clz_uint64(FLAC__uint64 v) -{ - /* Never used with input 0 */ - FLAC__ASSERT(v > 0); +static inline uint32_t FLAC__clz_uint64(FLAC__uint64 v) { + /* Never used with input 0 */ + FLAC__ASSERT(v > 0); #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - return __builtin_clzll(v); + return __builtin_clzll(v); #elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64)) - { - uint32_t idx; - _BitScanReverse64(&idx, v); - return idx ^ 63U; - } + { + uint32_t idx; + _BitScanReverse64(&idx, v); + return idx ^ 63U; + } #else - return FLAC__clz_soft_uint64(v); + return FLAC__clz_soft_uint64(v); #endif } /* These two functions work with input 0 */ -static inline uint32_t FLAC__clz2_uint32(FLAC__uint32 v) -{ - if (!v) - return 32; - return FLAC__clz_uint32(v); +static inline uint32_t FLAC__clz2_uint32(FLAC__uint32 v) { + if (!v) { + return 32; + } + return FLAC__clz_uint32(v); } -static inline uint32_t FLAC__clz2_uint64(FLAC__uint64 v) -{ - if (!v) - return 64; - return FLAC__clz_uint64(v); +static inline uint32_t FLAC__clz2_uint64(FLAC__uint64 v) { + if (!v) { + return 64; + } + return FLAC__clz_uint64(v); } -/* An example of what FLAC__bitmath_ilog2() computes: - * - * ilog2( 0) = assertion failure - * ilog2( 1) = 0 - * ilog2( 2) = 1 - * ilog2( 3) = 1 - * ilog2( 4) = 2 - * ilog2( 5) = 2 - * ilog2( 6) = 2 - * ilog2( 7) = 2 - * ilog2( 8) = 3 - * ilog2( 9) = 3 - * ilog2(10) = 3 - * ilog2(11) = 3 - * ilog2(12) = 3 - * ilog2(13) = 3 - * ilog2(14) = 3 - * ilog2(15) = 3 - * ilog2(16) = 4 - * ilog2(17) = 4 - * ilog2(18) = 4 - */ - -static inline uint32_t FLAC__bitmath_ilog2(FLAC__uint32 v) -{ - FLAC__ASSERT(v > 0); +/* An example of what FLAC__bitmath_ilog2() computes: + + ilog2( 0) = assertion failure + ilog2( 1) = 0 + ilog2( 2) = 1 + ilog2( 3) = 1 + ilog2( 4) = 2 + ilog2( 5) = 2 + ilog2( 6) = 2 + ilog2( 7) = 2 + ilog2( 8) = 3 + ilog2( 9) = 3 + ilog2(10) = 3 + ilog2(11) = 3 + ilog2(12) = 3 + ilog2(13) = 3 + ilog2(14) = 3 + ilog2(15) = 3 + ilog2(16) = 4 + ilog2(17) = 4 + ilog2(18) = 4 +*/ + +static inline uint32_t FLAC__bitmath_ilog2(FLAC__uint32 v) { + FLAC__ASSERT(v > 0); #if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v); + return _bit_scan_reverse(v); #elif defined(_MSC_VER) - { - uint32_t idx; - _BitScanReverse(&idx, v); - return idx; - } + { + uint32_t idx; + _BitScanReverse(&idx, v); + return idx; + } #else - return FLAC__clz_uint32(v) ^ 31U; + return FLAC__clz_uint32(v) ^ 31U; #endif } -static inline uint32_t FLAC__bitmath_ilog2_wide(FLAC__uint64 v) -{ - FLAC__ASSERT(v > 0); +static inline uint32_t FLAC__bitmath_ilog2_wide(FLAC__uint64 v) { + FLAC__ASSERT(v > 0); #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - return __builtin_clzll(v) ^ 63U; -/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ + return __builtin_clzll(v) ^ 63U; + /* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ #elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64)) - { - uint32_t idx; - _BitScanReverse64(&idx, v); - return idx; - } + { + uint32_t idx; + _BitScanReverse64(&idx, v); + return idx; + } #else -/* Brain-damaged compilers will use the fastest possible way that is, - de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) - (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). -*/ - { - static const uint8_t DEBRUIJN_IDX64[64]={ - 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, - 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, - 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, - 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 - }; - v|= v>>1; - v|= v>>2; - v|= v>>4; - v|= v>>8; - v|= v>>16; - v|= v>>32; - v= (v>>1)+1; - return DEBRUIJN_IDX64[v*FLAC__U64L(0x218A392CD3D5DBF)>>58&0x3F]; - } + /* Brain-damaged compilers will use the fastest possible way that is, + de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) + (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). + */ + { + static const uint8_t DEBRUIJN_IDX64[64] = { + 0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 40, + 5, 17, 26, 38, 15, 46, 29, 48, 10, 31, 35, 54, 21, 50, 41, 57, + 63, 6, 12, 18, 24, 27, 33, 39, 16, 37, 45, 47, 30, 53, 49, 56, + 62, 11, 23, 32, 36, 44, 52, 55, 61, 22, 43, 51, 60, 42, 59, 58 + }; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v |= v >> 32; + v = (v >> 1) + 1; + return DEBRUIJN_IDX64[v * FLAC__U64L(0x218A392CD3D5DBF) >> 58 & 0x3F]; + } #endif } diff --git a/src/libflac/private/bitreader.h b/src/libflac/private/bitreader.h index a1abdad0..073f4fdd 100644 --- a/src/libflac/private/bitreader.h +++ b/src/libflac/private/bitreader.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__BITREADER_H #define FLAC__PRIVATE__BITREADER_H @@ -38,16 +38,16 @@ #include "cpu.h" /* - * opaque structure definition - */ + opaque structure definition +*/ struct FLAC__BitReader; typedef struct FLAC__BitReader FLAC__BitReader; -typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); +typedef FLAC__bool(*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); /* - * construction, deletion, initialization, etc functions - */ + construction, deletion, initialization, etc functions +*/ FLAC__BitReader *FLAC__bitreader_new(void); void FLAC__bitreader_delete(FLAC__BitReader *br); FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd); @@ -56,21 +56,21 @@ FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); //void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); /* - * CRC functions - */ + CRC functions +*/ void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); /* - * info functions - */ + info functions +*/ FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); uint32_t FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); uint32_t FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); /* - * read functions - */ + read functions +*/ FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, uint32_t bits); FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, uint32_t bits); diff --git a/src/libflac/private/cpu.h b/src/libflac/private/cpu.h index fee2a656..09b1c015 100644 --- a/src/libflac/private/cpu.h +++ b/src/libflac/private/cpu.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__CPU_H #define FLAC__PRIVATE__CPU_H @@ -62,86 +62,86 @@ #if FLAC__HAS_X86INTRIN /* SSE intrinsics support by ICC/MSVC/GCC */ #if defined __INTEL_COMPILER - #define FLAC__SSE_TARGET(x) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */ - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #if (__INTEL_COMPILER >= 1110) /* Intel C++ Compiler 11.1 */ - #define FLAC__AVX_SUPPORTED 1 - #endif - #if (__INTEL_COMPILER >= 1300) /* Intel C++ Compiler 13.0 */ - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #endif +#define FLAC__SSE_TARGET(x) +#define FLAC__SSE_SUPPORTED 1 +#define FLAC__SSE2_SUPPORTED 1 +#if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */ +#define FLAC__SSSE3_SUPPORTED 1 +#define FLAC__SSE4_1_SUPPORTED 1 +#endif +#if (__INTEL_COMPILER >= 1110) /* Intel C++ Compiler 11.1 */ +#define FLAC__AVX_SUPPORTED 1 +#endif +#if (__INTEL_COMPILER >= 1300) /* Intel C++ Compiler 13.0 */ +#define FLAC__AVX2_SUPPORTED 1 +#define FLAC__FMA_SUPPORTED 1 +#endif #elif defined __clang__ && __has_attribute(__target__) /* clang */ - #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) - #if __has_builtin(__builtin_ia32_maxps) - #define FLAC__SSE_SUPPORTED 1 - #endif - #if __has_builtin(__builtin_ia32_pmuludq128) - #define FLAC__SSE2_SUPPORTED 1 - #endif - #if __has_builtin(__builtin_ia32_pabsd128) - #define FLAC__SSSE3_SUPPORTED 1 - #endif - #if __has_builtin(__builtin_ia32_pmuldq128) - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #if __has_builtin(__builtin_ia32_pabsd256) - #define FLAC__AVX2_SUPPORTED 1 - #endif +#define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) +#if __has_builtin(__builtin_ia32_maxps) +#define FLAC__SSE_SUPPORTED 1 +#endif +#if __has_builtin(__builtin_ia32_pmuludq128) +#define FLAC__SSE2_SUPPORTED 1 +#endif +#if __has_builtin(__builtin_ia32_pabsd128) +#define FLAC__SSSE3_SUPPORTED 1 +#endif +#if __has_builtin(__builtin_ia32_pmuldq128) +#define FLAC__SSE4_1_SUPPORTED 1 +#endif +#if __has_builtin(__builtin_ia32_pabsd256) +#define FLAC__AVX2_SUPPORTED 1 +#endif #elif defined __GNUC__ && !defined __clang__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) /* GCC 4.9+ */ - #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #ifdef FLAC__USE_AVX - #define FLAC__AVX_SUPPORTED 1 - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #endif +#define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) +#define FLAC__SSE_SUPPORTED 1 +#define FLAC__SSE2_SUPPORTED 1 +#define FLAC__SSSE3_SUPPORTED 1 +#define FLAC__SSE4_1_SUPPORTED 1 +#ifdef FLAC__USE_AVX +#define FLAC__AVX_SUPPORTED 1 +#define FLAC__AVX2_SUPPORTED 1 +#define FLAC__FMA_SUPPORTED 1 +#endif #elif defined _MSC_VER - #define FLAC__SSE_TARGET(x) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */ - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #if (_MSC_FULL_VER >= 160040219) /* MS Visual Studio 2010 SP1 */ - #define FLAC__AVX_SUPPORTED 1 - #endif - #if (_MSC_VER >= 1700) /* MS Visual Studio 2012 */ - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #endif +#define FLAC__SSE_TARGET(x) +#define FLAC__SSE_SUPPORTED 1 +#define FLAC__SSE2_SUPPORTED 1 +#if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */ +#define FLAC__SSSE3_SUPPORTED 1 +#define FLAC__SSE4_1_SUPPORTED 1 +#endif +#if (_MSC_FULL_VER >= 160040219) /* MS Visual Studio 2010 SP1 */ +#define FLAC__AVX_SUPPORTED 1 +#endif +#if (_MSC_VER >= 1700) /* MS Visual Studio 2012 */ +#define FLAC__AVX2_SUPPORTED 1 +#define FLAC__FMA_SUPPORTED 1 +#endif #else - #define FLAC__SSE_TARGET(x) - #ifdef __SSE__ - #define FLAC__SSE_SUPPORTED 1 - #endif - #ifdef __SSE2__ - #define FLAC__SSE2_SUPPORTED 1 - #endif - #ifdef __SSSE3__ - #define FLAC__SSSE3_SUPPORTED 1 - #endif - #ifdef __SSE4_1__ - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #ifdef __AVX__ - #define FLAC__AVX_SUPPORTED 1 - #endif - #ifdef __AVX2__ - #define FLAC__AVX2_SUPPORTED 1 - #endif - #ifdef __FMA__ - #define FLAC__FMA_SUPPORTED 1 - #endif +#define FLAC__SSE_TARGET(x) +#ifdef __SSE__ +#define FLAC__SSE_SUPPORTED 1 +#endif +#ifdef __SSE2__ +#define FLAC__SSE2_SUPPORTED 1 +#endif +#ifdef __SSSE3__ +#define FLAC__SSSE3_SUPPORTED 1 +#endif +#ifdef __SSE4_1__ +#define FLAC__SSE4_1_SUPPORTED 1 +#endif +#ifdef __AVX__ +#define FLAC__AVX_SUPPORTED 1 +#endif +#ifdef __AVX2__ +#define FLAC__AVX2_SUPPORTED 1 +#endif +#ifdef __FMA__ +#define FLAC__FMA_SUPPORTED 1 +#endif #endif /* compiler version */ #endif /* intrinsics support */ @@ -151,39 +151,39 @@ #endif typedef enum { - FLAC__CPUINFO_TYPE_IA32, - FLAC__CPUINFO_TYPE_X86_64, - FLAC__CPUINFO_TYPE_PPC, - FLAC__CPUINFO_TYPE_UNKNOWN + FLAC__CPUINFO_TYPE_IA32, + FLAC__CPUINFO_TYPE_X86_64, + FLAC__CPUINFO_TYPE_PPC, + FLAC__CPUINFO_TYPE_UNKNOWN } FLAC__CPUInfo_Type; typedef struct { - FLAC__bool intel; - - FLAC__bool cmov; - FLAC__bool mmx; - FLAC__bool sse; - FLAC__bool sse2; - - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool sse41; - FLAC__bool sse42; - FLAC__bool avx; - FLAC__bool avx2; - FLAC__bool fma; + FLAC__bool intel; + + FLAC__bool cmov; + FLAC__bool mmx; + FLAC__bool sse; + FLAC__bool sse2; + + FLAC__bool sse3; + FLAC__bool ssse3; + FLAC__bool sse41; + FLAC__bool sse42; + FLAC__bool avx; + FLAC__bool avx2; + FLAC__bool fma; } FLAC__CPUInfo_x86; typedef struct { - FLAC__bool arch_3_00; - FLAC__bool arch_2_07; + FLAC__bool arch_3_00; + FLAC__bool arch_2_07; } FLAC__CPUInfo_ppc; typedef struct { - FLAC__bool use_asm; - FLAC__CPUInfo_Type type; - FLAC__CPUInfo_x86 x86; - FLAC__CPUInfo_ppc ppc; + FLAC__bool use_asm; + FLAC__CPUInfo_Type type; + FLAC__CPUInfo_x86 x86; + FLAC__CPUInfo_ppc ppc; } FLAC__CPUInfo; void FLAC__cpu_info(FLAC__CPUInfo *info); diff --git a/src/libflac/private/crc.h b/src/libflac/private/crc.h index 0491b9e3..bd274ef7 100644 --- a/src/libflac/private/crc.h +++ b/src/libflac/private/crc.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__CRC_H #define FLAC__PRIVATE__CRC_H @@ -39,7 +39,7 @@ #include "../FLAC/ordinals.h" -/* 8 bit CRC generator, MSB shifted first +/* 8 bit CRC generator, MSB shifted first ** polynomial = x^8 + x^2 + x^1 + x^0 ** init = 0 */ @@ -49,7 +49,7 @@ void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); -/* 16 bit CRC generator, MSB shifted first +/* 16 bit CRC generator, MSB shifted first ** polynomial = x^16 + x^15 + x^2 + x^0 ** init = 0 */ diff --git a/src/libflac/private/fixed.h b/src/libflac/private/fixed.h index 21e5f052..a4ab37a0 100644 --- a/src/libflac/private/fixed.h +++ b/src/libflac/private/fixed.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__FIXED_H #define FLAC__PRIVATE__FIXED_H @@ -42,20 +42,20 @@ #include "../FLAC/format.h" /* - * FLAC__fixed_compute_best_predictor() - * -------------------------------------------------------------------- - * Compute the best fixed predictor and the expected bits-per-sample - * of the residual signal for each order. The _wide() version uses - * 64-bit integers which is statistically necessary when bits-per- - * sample + log2(blocksize) > 30 - * - * IN data[0,data_len-1] - * IN data_len - * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] - */ + FLAC__fixed_compute_best_predictor() + -------------------------------------------------------------------- + Compute the best fixed predictor and the expected bits-per-sample + of the residual signal for each order. The _wide() version uses + 64-bit integers which is statistically necessary when bits-per- + sample + log2(blocksize) > 30 + + IN data[0,data_len-1] + IN data_len + OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] +*/ #ifndef FLAC__INTEGER_ONLY_LIBRARY -uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); +uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); # ifndef FLAC__NO_ASM # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN # ifdef FLAC__SSE2_SUPPORTED @@ -63,45 +63,45 @@ uint32_t FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[] uint32_t FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); # endif # ifdef FLAC__SSSE3_SUPPORTED -uint32_t FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +uint32_t FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); uint32_t FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); # endif # endif # if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM -uint32_t FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +uint32_t FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], uint32_t data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); # endif # endif #else -uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +uint32_t FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); +uint32_t FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], uint32_t data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); #endif /* - * FLAC__fixed_compute_residual() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order - * OUT residual[0,data_len-1] residual signal - */ + FLAC__fixed_compute_residual() + -------------------------------------------------------------------- + Compute the residual signal obtained from sutracting the predicted + signal from the original. + + IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + IN data_len length of original signal + IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + OUT residual[0,data_len-1] residual signal +*/ void FLAC__fixed_compute_residual(const FLAC__int32 data[], uint32_t data_len, uint32_t order, FLAC__int32 residual[]); /* - * FLAC__fixed_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + FLAC__fixed_restore_signal() + -------------------------------------------------------------------- + Restore the original signal by summing the residual and the + predictor. + + IN residual[0,data_len-1] residual signal + IN data_len length of original signal + IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ + IN data[-order,-1] previously-reconstructed historical samples + OUT data[0,data_len-1] original signal +*/ void FLAC__fixed_restore_signal(const FLAC__int32 residual[], uint32_t data_len, uint32_t order, FLAC__int32 data[]); #endif diff --git a/src/libflac/private/float.h b/src/libflac/private/float.h index 8d2d2f74..e4c2a400 100644 --- a/src/libflac/private/float.h +++ b/src/libflac/private/float.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2004-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__FLOAT_H #define FLAC__PRIVATE__FLOAT_H @@ -40,24 +40,24 @@ #include "../FLAC/ordinals.h" /* - * All the code in libFLAC that uses float and double - * should be protected by checks of the macro - * FLAC__INTEGER_ONLY_LIBRARY. - * - */ + All the code in libFLAC that uses float and double + should be protected by checks of the macro + FLAC__INTEGER_ONLY_LIBRARY. + +*/ #ifndef FLAC__INTEGER_ONLY_LIBRARY /* - * FLAC__real is the basic floating point type used in LPC analysis. - * - * WATCHOUT: changing FLAC__real will change the signatures of many - * functions that have assembly language equivalents and break them. - */ + FLAC__real is the basic floating point type used in LPC analysis. + + WATCHOUT: changing FLAC__real will change the signatures of many + functions that have assembly language equivalents and break them. +*/ typedef float FLAC__real; #else /* - * The convention for FLAC__fixedpoint is to use the upper 16 bits - * for the integer part and lower 16 bits for the fractional part. - */ + The convention for FLAC__fixedpoint is to use the upper 16 bits + for the integer part and lower 16 bits for the fractional part. +*/ typedef FLAC__int32 FLAC__fixedpoint; extern const FLAC__fixedpoint FLAC__FP_ZERO; extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; @@ -72,22 +72,22 @@ extern const FLAC__fixedpoint FLAC__FP_E; #define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) /* - * FLAC__fixedpoint_log2() - * -------------------------------------------------------------------- - * Returns the base-2 logarithm of the fixed-point number 'x' using an - * algorithm by Knuth for x >= 1.0 - * - * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must - * be < 32 and evenly divisible by 4 (0 is OK but not very precise). - * - * 'precision' roughly limits the number of iterations that are done; - * use (uint32_t)(-1) for maximum precision. - * - * If 'x' is less than one -- that is, x < (1<= 1.0 + + 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must + be < 32 and evenly divisible by 4 (0 is OK but not very precise). + + 'precision' roughly limits the number of iterations that are done; + use (uint32_t)(-1) for maximum precision. + + If 'x' is less than one -- that is, x < (1< 0. - * - * IN data[0,data_len-1] - * IN data_len - * IN 0 < lag <= data_len - * OUT autoc[0,lag-1] - */ + FLAC__lpc_compute_autocorrelation() + -------------------------------------------------------------------- + Compute the autocorrelation for lags between 0 and lag-1. + Assumes data[] outside of [0,data_len-1] == 0. + Asserts that lag > 0. + + IN data[0,data_len-1] + IN data_len + IN 0 < lag <= data_len + OUT autoc[0,lag-1] +*/ void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], uint32_t data_len, uint32_t lag, FLAC__real autoc[]); #ifndef FLAC__NO_ASM # ifdef FLAC__CPU_IA32 @@ -108,63 +108,63 @@ void FLAC__lpc_compute_autocorrelation_intrin_power8_vsx_lag_16(const FLAC__real #endif /* - * FLAC__lpc_compute_lp_coefficients() - * -------------------------------------------------------------------- - * Computes LP coefficients for orders 1..max_order. - * Do not call if autoc[0] == 0.0. This means the signal is zero - * and there is no point in calculating a predictor. - * - * IN autoc[0,max_order] autocorrelation values - * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute - * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order + FLAC__lpc_compute_lp_coefficients() + -------------------------------------------------------------------- + Computes LP coefficients for orders 1..max_order. + Do not call if autoc[0] == 0.0. This means the signal is zero + and there is no point in calculating a predictor. + + IN autoc[0,max_order] autocorrelation values + IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute + OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order * *** IMPORTANT: * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched - * OUT error[0,max_order-1] error for each order (more - * specifically, the variance of - * the error signal times # of - * samples in the signal) - * - * Example: if max_order is 9, the LP coefficients for order 9 will be - * in lp_coeff[8][0,8], the LP coefficients for order 8 will be - * in lp_coeff[7][0,7], etc. - */ + OUT error[0,max_order-1] error for each order (more + specifically, the variance of + the error signal times # of + samples in the signal) + + Example: if max_order is 9, the LP coefficients for order 9 will be + in lp_coeff[8][0,8], the LP coefficients for order 8 will be + in lp_coeff[7][0,7], etc. +*/ void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], uint32_t *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[]); /* - * FLAC__lpc_quantize_coefficients() - * -------------------------------------------------------------------- - * Quantizes the LP coefficients. NOTE: precision + bits_per_sample - * must be less than 32 (sizeof(FLAC__int32)*8). - * - * IN lp_coeff[0,order-1] LP coefficients - * IN order LP order - * IN FLAC__MIN_QLP_COEFF_PRECISION < precision - * desired precision (in bits, including sign - * bit) of largest coefficient - * OUT qlp_coeff[0,order-1] quantized coefficients - * OUT shift # of bits to shift right to get approximated - * LP coefficients. NOTE: could be negative. - * RETURN 0 => quantization OK - * 1 => coefficients require too much shifting for *shift to - * fit in the LPC subframe header. 'shift' is unset. - * 2 => coefficients are all zero, which is bad. 'shift' is - * unset. - */ + FLAC__lpc_quantize_coefficients() + -------------------------------------------------------------------- + Quantizes the LP coefficients. NOTE: precision + bits_per_sample + must be less than 32 (sizeof(FLAC__int32)*8). + + IN lp_coeff[0,order-1] LP coefficients + IN order LP order + IN FLAC__MIN_QLP_COEFF_PRECISION < precision + desired precision (in bits, including sign + bit) of largest coefficient + OUT qlp_coeff[0,order-1] quantized coefficients + OUT shift # of bits to shift right to get approximated + LP coefficients. NOTE: could be negative. + RETURN 0 => quantization OK + 1 => coefficients require too much shifting for *shift to + fit in the LPC subframe header. 'shift' is unset. + 2 => coefficients are all zero, which is bad. 'shift' is + unset. +*/ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order, uint32_t precision, FLAC__int32 qlp_coeff[], int *shift); /* - * FLAC__lpc_compute_residual_from_qlp_coefficients() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits - * OUT residual[0,data_len-1] residual signal - */ + FLAC__lpc_compute_residual_from_qlp_coefficients() + -------------------------------------------------------------------- + Compute the residual signal obtained from sutracting the predicted + signal from the original. + + IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + IN data_len length of original signal + IN qlp_coeff[0,order-1] quantized LP coefficients + IN order > 0 LP order + IN lp_quantization quantization of LP coefficients in bits + OUT residual[0,data_len-1] residual signal +*/ void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 residual[]); void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 residual[]); #ifndef FLAC__NO_ASM @@ -195,20 +195,20 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLA #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ /* - * FLAC__lpc_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits + FLAC__lpc_restore_signal() + -------------------------------------------------------------------- + Restore the original signal by summing the residual and the + predictor. + + IN residual[0,data_len-1] residual signal + IN data_len length of original signal + IN qlp_coeff[0,order-1] quantized LP coefficients + IN order > 0 LP order + IN lp_quantization quantization of LP coefficients in bits * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ + IN data[-order,-1] previously-reconstructed historical samples + OUT data[0,data_len-1] original signal +*/ void FLAC__lpc_restore_signal(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); #ifndef FLAC__NO_ASM @@ -231,31 +231,31 @@ void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], ui #ifndef FLAC__INTEGER_ONLY_LIBRARY /* - * FLAC__lpc_compute_expected_bits_per_residual_sample() - * -------------------------------------------------------------------- - * Compute the expected number of bits per residual signal sample - * based on the LP error (which is related to the residual variance). - * - * IN lpc_error >= 0.0 error returned from calculating LP coefficients - * IN total_samples > 0 # of samples in residual signal - * RETURN expected bits per sample - */ + FLAC__lpc_compute_expected_bits_per_residual_sample() + -------------------------------------------------------------------- + Compute the expected number of bits per residual signal sample + based on the LP error (which is related to the residual variance). + + IN lpc_error >= 0.0 error returned from calculating LP coefficients + IN total_samples > 0 # of samples in residual signal + RETURN expected bits per sample +*/ double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, uint32_t total_samples); double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale); /* - * FLAC__lpc_compute_best_order() - * -------------------------------------------------------------------- - * Compute the best order from the array of signal errors returned - * during coefficient computation. - * - * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients - * IN max_order > 0 max LP order - * IN total_samples > 0 # of samples in residual signal - * IN overhead_bits_per_order # of bits overhead for each increased LP order - * (includes warmup sample size and quantized LP coefficient) - * RETURN [1,max_order] best order - */ + FLAC__lpc_compute_best_order() + -------------------------------------------------------------------- + Compute the best order from the array of signal errors returned + during coefficient computation. + + IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients + IN max_order > 0 max LP order + IN total_samples > 0 # of samples in residual signal + IN overhead_bits_per_order # of bits overhead for each increased LP order + (includes warmup sample size and quantized LP coefficient) + RETURN [1,max_order] best order +*/ uint32_t FLAC__lpc_compute_best_order(const double lpc_error[], uint32_t max_order, uint32_t total_samples, uint32_t overhead_bits_per_order); #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/src/libflac/private/macros.h b/src/libflac/private/macros.h index 3a8072ec..260859cf 100644 --- a/src/libflac/private/macros.h +++ b/src/libflac/private/macros.h @@ -1,33 +1,33 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2012-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__MACROS_H #define FLAC__PRIVATE__MACROS_H diff --git a/src/libflac/private/md5.h b/src/libflac/private/md5.h index 9817415b..393836c1 100644 --- a/src/libflac/private/md5.h +++ b/src/libflac/private/md5.h @@ -2,44 +2,44 @@ #define FLAC__PRIVATE__MD5_H /* - * This is the header file for the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' - * header definitions; now uses stuff from dpkg's config.h - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain, with no warranty. - */ + This is the header file for the MD5 message-digest algorithm. + The algorithm is due to Ron Rivest. This code was + written by Colin Plumb in 1993, no copyright is claimed. + This code is in the public domain; do with it what you wish. + + Equivalent code is available from RSA Data Security, Inc. + This code has been tested against that, and is equivalent, + except that you don't need to include two pages of legalese + with every copy. + + To compute the message digest of a chunk of bytes, declare an + MD5Context structure, pass it to MD5Init, call MD5Update as + needed on buffers full of bytes, and then call MD5Final, which + will fill a supplied 16-byte array with the digest. + + Changed so as no longer to depend on Colin Plumb's `usual.h' + header definitions; now uses stuff from dpkg's config.h + - Ian Jackson . + Still in the public domain. + + Josh Coalson: made some changes to integrate with libFLAC. + Still in the public domain, with no warranty. +*/ #include "../FLAC/ordinals.h" typedef union { - FLAC__byte *p8; - FLAC__int16 *p16; - FLAC__int32 *p32; + FLAC__byte *p8; + FLAC__int16 *p16; + FLAC__int32 *p32; } FLAC__multibyte; typedef struct { - FLAC__uint32 in[16]; - FLAC__uint32 buf[4]; - FLAC__uint32 bytes[2]; - FLAC__multibyte internal_buf; - size_t capacity; + FLAC__uint32 in[16]; + FLAC__uint32 buf[4]; + FLAC__uint32 bytes[2]; + FLAC__multibyte internal_buf; + size_t capacity; } FLAC__MD5Context; void FLAC__MD5Init(FLAC__MD5Context *context); diff --git a/src/libflac/private/memory.h b/src/libflac/private/memory.h index d8c0ed38..9ed2a088 100644 --- a/src/libflac/private/memory.h +++ b/src/libflac/private/memory.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__MEMORY_H #define FLAC__PRIVATE__MEMORY_H @@ -42,9 +42,9 @@ #include "float.h" #include "../FLAC/ordinals.h" /* for FLAC__bool */ -/* Returns the unaligned address returned by malloc. - * Use free() on this address to deallocate. - */ +/* Returns the unaligned address returned by malloc. + Use free() on this address to deallocate. +*/ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); diff --git a/src/libflac/private/metadata.h b/src/libflac/private/metadata.h index 7cb5e62e..78e74e66 100644 --- a/src/libflac/private/metadata.h +++ b/src/libflac/private/metadata.h @@ -1,44 +1,44 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2002-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__METADATA_H #define FLAC__PRIVATE__METADATA_H #include "../FLAC/metadata.h" -/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not - * be a consistent state (e.g. PICTURE) or equivalent to the initial - * state after FLAC__metadata_object_new() - */ +/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not + be a consistent state (e.g. PICTURE) or equivalent to the initial + state after FLAC__metadata_object_new() +*/ void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); diff --git a/src/libflac/private/window.h b/src/libflac/private/window.h index a3ab2f93..1ff1af66 100644 --- a/src/libflac/private/window.h +++ b/src/libflac/private/window.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2006-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PRIVATE__WINDOW_H #define FLAC__PRIVATE__WINDOW_H @@ -43,14 +43,14 @@ #ifndef FLAC__INTEGER_ONLY_LIBRARY /* - * FLAC__window_*() - * -------------------------------------------------------------------- - * Calculates window coefficients according to different apodization - * functions. - * - * OUT window[0,L-1] - * IN L (number of points in window) - */ + FLAC__window_*() + -------------------------------------------------------------------- + Calculates window coefficients according to different apodization + functions. + + OUT window[0,L-1] + IN L (number of points in window) +*/ void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); diff --git a/src/libflac/protected/all.h b/src/libflac/protected/all.h index 9468bd3b..1c505db3 100644 --- a/src/libflac/protected/all.h +++ b/src/libflac/protected/all.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PROTECTED__ALL_H #define FLAC__PROTECTED__ALL_H diff --git a/src/libflac/protected/stream_decoder.h b/src/libflac/protected/stream_decoder.h index 9bab8806..321dfda3 100644 --- a/src/libflac/protected/stream_decoder.h +++ b/src/libflac/protected/stream_decoder.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PROTECTED__STREAM_DECODER_H #define FLAC__PROTECTED__STREAM_DECODER_H @@ -39,22 +39,22 @@ #endif typedef struct FLAC__StreamDecoderProtected { - FLAC__StreamDecoderState state; - FLAC__StreamDecoderInitStatus initstate; - uint32_t channels; - FLAC__ChannelAssignment channel_assignment; - uint32_t bits_per_sample; - uint32_t sample_rate; /* in Hz */ - uint32_t blocksize; /* in samples (per channel) */ - FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ + FLAC__StreamDecoderState state; + FLAC__StreamDecoderInitStatus initstate; + uint32_t channels; + FLAC__ChannelAssignment channel_assignment; + uint32_t bits_per_sample; + uint32_t sample_rate; /* in Hz */ + uint32_t blocksize; /* in samples (per channel) */ + FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ #if FLAC__HAS_OGG - FLAC__OggDecoderAspect ogg_decoder_aspect; + FLAC__OggDecoderAspect ogg_decoder_aspect; #endif } FLAC__StreamDecoderProtected; /* - * Return the number of input bytes consumed - */ + Return the number of input bytes consumed +*/ uint32_t FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); #endif diff --git a/src/libflac/protected/stream_encoder.h b/src/libflac/protected/stream_encoder.h index f4b52287..bb568394 100644 --- a/src/libflac/protected/stream_encoder.h +++ b/src/libflac/protected/stream_encoder.h @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2001-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__PROTECTED__STREAM_ENCODER_H #define FLAC__PROTECTED__STREAM_ENCODER_H @@ -45,73 +45,73 @@ #define FLAC__MAX_APODIZATION_FUNCTIONS 32 typedef enum { - FLAC__APODIZATION_BARTLETT, - FLAC__APODIZATION_BARTLETT_HANN, - FLAC__APODIZATION_BLACKMAN, - FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, - FLAC__APODIZATION_CONNES, - FLAC__APODIZATION_FLATTOP, - FLAC__APODIZATION_GAUSS, - FLAC__APODIZATION_HAMMING, - FLAC__APODIZATION_HANN, - FLAC__APODIZATION_KAISER_BESSEL, - FLAC__APODIZATION_NUTTALL, - FLAC__APODIZATION_RECTANGLE, - FLAC__APODIZATION_TRIANGLE, - FLAC__APODIZATION_TUKEY, - FLAC__APODIZATION_PARTIAL_TUKEY, - FLAC__APODIZATION_PUNCHOUT_TUKEY, - FLAC__APODIZATION_WELCH + FLAC__APODIZATION_BARTLETT, + FLAC__APODIZATION_BARTLETT_HANN, + FLAC__APODIZATION_BLACKMAN, + FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, + FLAC__APODIZATION_CONNES, + FLAC__APODIZATION_FLATTOP, + FLAC__APODIZATION_GAUSS, + FLAC__APODIZATION_HAMMING, + FLAC__APODIZATION_HANN, + FLAC__APODIZATION_KAISER_BESSEL, + FLAC__APODIZATION_NUTTALL, + FLAC__APODIZATION_RECTANGLE, + FLAC__APODIZATION_TRIANGLE, + FLAC__APODIZATION_TUKEY, + FLAC__APODIZATION_PARTIAL_TUKEY, + FLAC__APODIZATION_PUNCHOUT_TUKEY, + FLAC__APODIZATION_WELCH } FLAC__ApodizationFunction; typedef struct { - FLAC__ApodizationFunction type; - union { - struct { - FLAC__real stddev; - } gauss; - struct { - FLAC__real p; - } tukey; - struct { - FLAC__real p; - FLAC__real start; - FLAC__real end; - } multiple_tukey; - } parameters; + FLAC__ApodizationFunction type; + union { + struct { + FLAC__real stddev; + } gauss; + struct { + FLAC__real p; + } tukey; + struct { + FLAC__real p; + FLAC__real start; + FLAC__real end; + } multiple_tukey; + } parameters; } FLAC__ApodizationSpecification; #endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY typedef struct FLAC__StreamEncoderProtected { - FLAC__StreamEncoderState state; - FLAC__bool verify; - FLAC__bool streamable_subset; - FLAC__bool do_md5; - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - uint32_t channels; - uint32_t bits_per_sample; - uint32_t sample_rate; - uint32_t blocksize; + FLAC__StreamEncoderState state; + FLAC__bool verify; + FLAC__bool streamable_subset; + FLAC__bool do_md5; + FLAC__bool do_mid_side_stereo; + FLAC__bool loose_mid_side_stereo; + uint32_t channels; + uint32_t bits_per_sample; + uint32_t sample_rate; + uint32_t blocksize; #ifndef FLAC__INTEGER_ONLY_LIBRARY - uint32_t num_apodizations; - FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; + uint32_t num_apodizations; + FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; #endif - uint32_t max_lpc_order; - uint32_t qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_exhaustive_model_search; - FLAC__bool do_escape_coding; - uint32_t min_residual_partition_order; - uint32_t max_residual_partition_order; - uint32_t rice_parameter_search_dist; - FLAC__uint64 total_samples_estimate; - FLAC__StreamMetadata **metadata; - uint32_t num_metadata_blocks; - FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; + uint32_t max_lpc_order; + uint32_t qlp_coeff_precision; + FLAC__bool do_qlp_coeff_prec_search; + FLAC__bool do_exhaustive_model_search; + FLAC__bool do_escape_coding; + uint32_t min_residual_partition_order; + uint32_t max_residual_partition_order; + uint32_t rice_parameter_search_dist; + FLAC__uint64 total_samples_estimate; + FLAC__StreamMetadata **metadata; + uint32_t num_metadata_blocks; + FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; #if FLAC__HAS_OGG - FLAC__OggEncoderAspect ogg_encoder_aspect; + FLAC__OggEncoderAspect ogg_encoder_aspect; #endif } FLAC__StreamEncoderProtected; diff --git a/src/libflac/share/alloc.h b/src/libflac/share/alloc.h index c3791d67..f1aa6c73 100644 --- a/src/libflac/share/alloc.h +++ b/src/libflac/share/alloc.h @@ -1,34 +1,34 @@ -/* alloc - Convenience routines for safely allocating memory - * Copyright (C) 2007-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* alloc - Convenience routines for safely allocating memory + Copyright (C) 2007-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__SHARE__ALLOC_H #define FLAC__SHARE__ALLOC_H @@ -37,9 +37,9 @@ # include "../config.h" //#endif -/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early - * before #including this file, otherwise SIZE_MAX might not be defined - */ +/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early + before #including this file, otherwise SIZE_MAX might not be defined +*/ #include /* for SIZE_MAX */ //#if HAVE_STDINT_H @@ -63,157 +63,169 @@ # define SIZE_MAX SIZE_T_MAX #endif -/* avoid malloc()ing 0 bytes, see: - * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 +/* avoid malloc()ing 0 bytes, see: + https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 */ -static inline void *safe_malloc_(size_t size) -{ - /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(!size) - size++; - return malloc(size); +static inline void *safe_malloc_(size_t size) { + /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if (!size) { + size++; + } + return malloc(size); } -static inline void *safe_calloc_(size_t nmemb, size_t size) -{ - if(!nmemb || !size) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - return calloc(nmemb, size); +static inline void *safe_calloc_(size_t nmemb, size_t size) { + if (!nmemb || !size) { + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + } + return calloc(nmemb, size); } /*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ -static inline void *safe_malloc_add_2op_(size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return safe_malloc_(size2); +static inline void *safe_malloc_add_2op_(size_t size1, size_t size2) { + size2 += size1; + if (size2 < size1) { + return 0; + } + return safe_malloc_(size2); } -static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return safe_malloc_(size3); +static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) { + size2 += size1; + if (size2 < size1) { + return 0; + } + size3 += size2; + if (size3 < size2) { + return 0; + } + return safe_malloc_(size3); } -static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return safe_malloc_(size4); +static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) { + size2 += size1; + if (size2 < size1) { + return 0; + } + size3 += size2; + if (size3 < size2) { + return 0; + } + size4 += size3; + if (size4 < size3) { + return 0; + } + return safe_malloc_(size4); } void *safe_malloc_mul_2op_(size_t size1, size_t size2) ; -static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2 || !size3) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - size1 *= size2; - if(size1 > SIZE_MAX / size3) - return 0; - return malloc(size1*size3); +static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) { + if (!size1 || !size2 || !size3) { + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + } + if (size1 > SIZE_MAX / size2) { + return 0; + } + size1 *= size2; + if (size1 > SIZE_MAX / size3) { + return 0; + } + return malloc(size1 * size3); } /* size1*size2 + size3 */ -static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2) - return safe_malloc_(size3); - if(size1 > SIZE_MAX / size2) - return 0; - return safe_malloc_add_2op_(size1*size2, size3); +static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) { + if (!size1 || !size2) { + return safe_malloc_(size3); + } + if (size1 > SIZE_MAX / size2) { + return 0; + } + return safe_malloc_add_2op_(size1 * size2, size3); } /* size1 * (size2 + size3) */ -static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - size2 += size3; - if(size2 < size3) - return 0; - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); +static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) { + if (!size1 || (!size2 && !size3)) { + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + } + size2 += size3; + if (size2 < size3) { + return 0; + } + if (size1 > SIZE_MAX / size2) { + return 0; + } + return malloc(size1 * size2); } -static inline void *safe_realloc_(void *ptr, size_t size) -{ - void *oldptr = ptr; - void *newptr = realloc(ptr, size); - if(size > 0 && newptr == 0) - free(oldptr); - return newptr; +static inline void *safe_realloc_(void *ptr, size_t size) { + void *oldptr = ptr; + void *newptr = realloc(ptr, size); + if (size > 0 && newptr == 0) { + free(oldptr); + } + return newptr; } -static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) { - free(ptr); - return 0; - } - return realloc(ptr, size2); +static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) { + size2 += size1; + if (size2 < size1) { + free(ptr); + return 0; + } + return realloc(ptr, size2); } -static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return realloc(ptr, size3); +static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) { + size2 += size1; + if (size2 < size1) { + return 0; + } + size3 += size2; + if (size3 < size2) { + return 0; + } + return realloc(ptr, size3); } -static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return realloc(ptr, size4); +static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) { + size2 += size1; + if (size2 < size1) { + return 0; + } + size3 += size2; + if (size3 < size2) { + return 0; + } + size4 += size3; + if (size4 < size3) { + return 0; + } + return realloc(ptr, size4); } -static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) -{ - if(!size1 || !size2) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - if(size1 > SIZE_MAX / size2) - return 0; - return safe_realloc_(ptr, size1*size2); +static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) { + if (!size1 || !size2) { + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + } + if (size1 > SIZE_MAX / size2) { + return 0; + } + return safe_realloc_(ptr, size1 * size2); } /* size1 * (size2 + size3) */ -static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - size2 += size3; - if(size2 < size3) - return 0; - return safe_realloc_mul_2op_(ptr, size1, size2); +static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) { + if (!size1 || (!size2 && !size3)) { + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + } + size2 += size3; + if (size2 < size3) { + return 0; + } + return safe_realloc_mul_2op_(ptr, size1, size2); } #endif diff --git a/src/libflac/share/compat.h b/src/libflac/share/compat.h index c28054be..2352a241 100644 --- a/src/libflac/share/compat.h +++ b/src/libflac/share/compat.h @@ -1,40 +1,40 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ - -/* This is the preferred location of all CPP hackery to make $random_compiler - * work like something approaching a C99 (or maybe more accurately GNU99) - * compiler. - * - * It is assumed that this header will be included after "config.h". - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2012-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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. +*/ + +/* This is the preferred location of all CPP hackery to make $random_compiler + work like something approaching a C99 (or maybe more accurately GNU99) + compiler. + + It is assumed that this header will be included after "config.h". +*/ #ifndef FLAC__SHARE__COMPAT_H #define FLAC__SHARE__COMPAT_H @@ -194,12 +194,12 @@ #define M_PI 3.14159265358979323846 #endif -/* FLAC needs to compile and work correctly on systems with a normal ISO C99 - * snprintf as well as Microsoft Visual Studio which has an non-standards - * conformant snprint_s function. - * - * This function wraps the MS version to behave more like the ISO version. - */ +/* FLAC needs to compile and work correctly on systems with a normal ISO C99 + snprintf as well as Microsoft Visual Studio which has an non-standards + conformant snprint_s function. + + This function wraps the MS version to behave more like the ISO version. +*/ #include #ifdef __cplusplus extern "C" { diff --git a/src/libflac/share/endswap.h b/src/libflac/share/endswap.h index 9088a747..71fc097d 100644 --- a/src/libflac/share/endswap.h +++ b/src/libflac/share/endswap.h @@ -1,33 +1,33 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2012-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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. +*/ /* It is assumed that this header will be included after "config.h". */ @@ -35,9 +35,8 @@ /* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ #if ! HAVE_BSWAP16 -static inline unsigned short __builtin_bswap16(unsigned short a) -{ - return (a<<8)|(a>>8); +static inline unsigned short __builtin_bswap16(unsigned short a) { + return (a << 8) | (a >> 8); } #endif diff --git a/src/libflac/share/getopt.h b/src/libflac/share/getopt.h index 66aced0f..82c8df1f 100644 --- a/src/libflac/share/getopt.h +++ b/src/libflac/share/getopt.h @@ -12,24 +12,24 @@ around code, while at the same time trying to touch the original as little as possible. */ -/* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. - This file is part of the GNU C Library. +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. + This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef SHARE__GETOPT_H #define SHARE__GETOPT_H @@ -42,30 +42,30 @@ extern "C" { #endif -/* For communication from `share__getopt' to the caller. - When `share__getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ +/* For communication from `share__getopt' to the caller. + When `share__getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ extern char *share__optarg; -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `share__getopt'. +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `share__getopt'. - On entry to `share__getopt', zero means this is the first call; initialize. + On entry to `share__getopt', zero means this is the first call; initialize. - When `share__getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. + When `share__getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. - Otherwise, `share__optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ + Otherwise, `share__optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ extern int share__optind; -/* Callers store zero here to inhibit the error message `share__getopt' prints - for unrecognized options. */ +/* Callers store zero here to inhibit the error message `share__getopt' prints + for unrecognized options. */ extern int share__opterr; @@ -74,39 +74,38 @@ extern int share__opterr; extern int share__optopt; /*[JEC] was:#ifndef __need_getopt */ -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to share__getopt_long or share__getopt_long_only is a vector - of `struct share__option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - share__no_argument (or 0) if the option does not take an argument, - share__required_argument (or 1) if the option requires an argument, - share__optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `share__optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `share__getopt' - returns the contents of the `val' field. */ - -struct share__option -{ +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to share__getopt_long or share__getopt_long_only is a vector + of `struct share__option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + share__no_argument (or 0) if the option does not take an argument, + share__required_argument (or 1) if the option requires an argument, + share__optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `share__optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `share__getopt' + returns the contents of the `val' field. */ + +struct share__option { # if defined __STDC__ && __STDC__ - const char *name; + const char *name; # else - char *name; + char *name; # endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; }; /* Names for the values of the `has_arg' field of `struct share__option'. */ @@ -117,52 +116,52 @@ struct share__option /*[JEC] was:#endif*/ /* need getopt */ -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, `share__optopt' is set to the option letter, and '?' is - returned. + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `share__optopt' is set to the option letter, and '?' is + returned. - The OPTS string is a list of characters which are recognized option - letters, optionally followed by colons, specifying that that letter - takes an argument, to be placed in `share__optarg'. + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `share__optarg'. - If a letter in OPTS is followed by two colons, its argument is - optional. This behavior is specific to the GNU `share__getopt'. + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `share__getopt'. - The argument `--' causes premature termination of argument - scanning, explicitly telling `share__getopt' that there are no more - options. + The argument `--' causes premature termination of argument + scanning, explicitly telling `share__getopt' that there are no more + options. - If OPTS begins with `--', then non-option arguments are treated as - arguments to the option '\0'. This behavior is specific to the GNU - `share__getopt'. */ + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `share__getopt'. */ /*[JEC] was:#if defined __STDC__ && __STDC__*/ /*[JEC] was:# ifdef __GNU_LIBRARY__*/ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int share__getopt (int argc, char *const *argv, const char *shortopts); +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int share__getopt(int argc, char *const *argv, const char *shortopts); /*[JEC] was:# else*/ /* not __GNU_LIBRARY__ */ /*[JEC] was:extern int getopt ();*/ /*[JEC] was:# endif*/ /* __GNU_LIBRARY__ */ /*[JEC] was:# ifndef __need_getopt*/ -extern int share__getopt_long (int argc, char *const *argv, const char *shortopts, - const struct share__option *longopts, int *longind); -extern int share__getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind); +extern int share__getopt_long(int argc, char *const *argv, const char *shortopts, + const struct share__option *longopts, int *longind); +extern int share__getopt_long_only(int argc, char *const *argv, + const char *shortopts, + const struct share__option *longopts, int *longind); /* Internal only. Users should not call this directly. */ -extern int share___getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind, - int long_only); +extern int share___getopt_internal(int argc, char *const *argv, + const char *shortopts, + const struct share__option *longopts, int *longind, + int long_only); /*[JEC] was:# endif*/ /*[JEC] was:#else*/ /* not __STDC__ */ /*[JEC] was:extern int getopt ();*/ diff --git a/src/libflac/share/macros.h b/src/libflac/share/macros.h index 20b3ea56..ddc6c51d 100644 --- a/src/libflac/share/macros.h +++ b/src/libflac/share/macros.h @@ -1,43 +1,43 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2013-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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. +*/ #include -/* FLAC_CHECK_RETURN : Check the return value of the provided function and - * print an error message if it fails (ie returns a value < 0). - * - * Ideally, a library should not print anything, but this macro is only used - * for things that extremely unlikely to fail, like `chown` to a previoulsy - * saved `uid`. - */ +/* FLAC_CHECK_RETURN : Check the return value of the provided function and + print an error message if it fails (ie returns a value < 0). + + Ideally, a library should not print anything, but this macro is only used + for things that extremely unlikely to fail, like `chown` to a previously + saved `uid`. +*/ #define FLAC_CHECK_RETURN(x) \ { if ((x) < 0) \ diff --git a/src/libflac/share/private.h b/src/libflac/share/private.h index 03083d3f..6db077c3 100644 --- a/src/libflac/share/private.h +++ b/src/libflac/share/private.h @@ -1,41 +1,41 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2013-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 FLAC__SHARE__PRIVATE_H #define FLAC__SHARE__PRIVATE_H /* - * Unpublished debug routines from libFLAC. This should not be used from any - * client code other than code shipped with the FLAC sources. - */ + Unpublished debug routines from libFLAC. This should not be used from any + client code other than code shipped with the FLAC sources. +*/ FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); diff --git a/src/libflac/share/safe_str.h b/src/libflac/share/safe_str.h index 6709334e..848597c1 100644 --- a/src/libflac/share/safe_str.h +++ b/src/libflac/share/safe_str.h @@ -1,71 +1,71 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2016 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ - -/* Safe string handling functions to replace things like strcpy, strncpy, - * strcat, strncat etc. - * All of these functions guarantee a correctly NUL terminated string but - * the string may be truncated if the destination buffer was too short. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2013-2016 Xiph.org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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. +*/ + +/* Safe string handling functions to replace things like strcpy, strncpy, + strcat, strncat etc. + All of these functions guarantee a correctly NUL terminated string but + the string may be truncated if the destination buffer was too short. +*/ #ifndef FLAC__SHARE_SAFE_STR_H #define FLAC__SHARE_SAFE_STR_H static inline char * -safe_strncat(char *dest, const char *src, size_t dest_size) -{ - char * ret; +safe_strncat(char *dest, const char *src, size_t dest_size) { + char * ret; - if (dest_size < 1) - return dest; + if (dest_size < 1) { + return dest; + } - /* Assume dist has space for a term character .. */ - ret = strncat(dest, src, dest_size - strlen (dest)); - /* .. but set it explicitly. */ - dest [dest_size - 1] = 0; + /* Assume dist has space for a term character .. */ + ret = strncat(dest, src, dest_size - strlen(dest)); + /* .. but set it explicitly. */ + dest [dest_size - 1] = 0; - return ret; + return ret; } static inline char * -safe_strncpy(char *dest, const char *src, size_t dest_size) -{ - char * ret; +safe_strncpy(char *dest, const char *src, size_t dest_size) { + char * ret; - if (dest_size < 1) - return dest; + if (dest_size < 1) { + return dest; + } - ret = strncpy(dest, src, dest_size - 1); - dest [dest_size - 1] = 0; + ret = strncpy(dest, src, dest_size - 1); + dest [dest_size - 1] = 0; - return ret; + return ret; } #endif /* FLAC__SHARE_SAFE_STR_H */ diff --git a/src/libflac/share/utf8.h b/src/libflac/share/utf8.h index 7d6650d6..443d630e 100644 --- a/src/libflac/share/utf8.h +++ b/src/libflac/share/utf8.h @@ -2,22 +2,22 @@ #define SHARE__UTF8_H /* - * Convert a string between UTF-8 and the locale's charset. - * Invalid bytes are replaced by '#', and characters that are - * not available in the target encoding are replaced by '?'. - * - * If the locale's charset is not set explicitly then it is - * obtained using nl_langinfo(CODESET), where available, the - * environment variable CHARSET, or assumed to be US-ASCII. - * - * Return value of conversion functions: - * - * -1 : memory allocation failed - * 0 : data was converted exactly - * 1 : valid data was converted approximately (using '?') - * 2 : input was invalid (but still converted, using '#') - * 3 : unknown encoding (but still converted, using '?') - */ + Convert a string between UTF-8 and the locale's charset. + Invalid bytes are replaced by '#', and characters that are + not available in the target encoding are replaced by '?'. + + If the locale's charset is not set explicitly then it is + obtained using nl_langinfo(CODESET), where available, the + environment variable CHARSET, or assumed to be US-ASCII. + + Return value of conversion functions: + + -1 : memory allocation failed + 0 : data was converted exactly + 1 : valid data was converted approximately (using '?') + 2 : input was invalid (but still converted, using '#') + 3 : unknown encoding (but still converted, using '?') +*/ int utf8_encode(const char *from, char **to); int utf8_decode(const char *from, char **to); diff --git a/src/libflac/stream_decoder.c b/src/libflac/stream_decoder.c index eabcf092..9562e29a 100644 --- a/src/libflac/stream_decoder.c +++ b/src/libflac/stream_decoder.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2000-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -63,17 +63,17 @@ FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = FLAC__HAS_OGG; /*********************************************************************** - * - * Private static data - * + + Private static data + ***********************************************************************/ static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; /*********************************************************************** - * - * Private class method prototypes - * + + Private class method prototypes + ***********************************************************************/ static void set_defaults_(FLAC__StreamDecoder *decoder); @@ -116,70 +116,70 @@ static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLA //static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); /*********************************************************************** - * - * Private class data - * + + Private class data + ***********************************************************************/ typedef struct FLAC__StreamDecoderPrivate { - FLAC__bool is_ogg; - FLAC__StreamDecoderReadCallback read_callback; - FLAC__StreamDecoderSeekCallback seek_callback; - FLAC__StreamDecoderTellCallback tell_callback; - FLAC__StreamDecoderLengthCallback length_callback; - FLAC__StreamDecoderEofCallback eof_callback; - FLAC__StreamDecoderWriteCallback write_callback; - FLAC__StreamDecoderMetadataCallback metadata_callback; - FLAC__StreamDecoderErrorCallback error_callback; - /* generic 32-bit datapath: */ - void (*local_lpc_restore_signal)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); - /* generic 64-bit datapath: */ - void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); - /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ - void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); - void *client_data; -// FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ - FLAC__BitReader *input; - FLAC__int32 *output[FLAC__MAX_CHANNELS]; - FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; - uint32_t output_capacity, output_channels; - FLAC__uint32 fixed_block_size, next_fixed_block_size; - FLAC__uint64 samples_decoded; - FLAC__bool has_stream_info, has_seek_table; - FLAC__StreamMetadata stream_info; - FLAC__StreamMetadata seek_table; - FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ - FLAC__byte *metadata_filter_ids; - size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ - FLAC__Frame frame; - FLAC__bool cached; /* true if there is a byte in lookahead */ - FLAC__CPUInfo cpuinfo; - FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ - FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; - FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ - FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ - FLAC__bool is_seeking; - FLAC__MD5Context md5context; - FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ - /* (the rest of these are only used for seeking) */ - FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ - FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ - FLAC__uint64 target_sample; - uint32_t unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ - FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ + FLAC__bool is_ogg; + FLAC__StreamDecoderReadCallback read_callback; + FLAC__StreamDecoderSeekCallback seek_callback; + FLAC__StreamDecoderTellCallback tell_callback; + FLAC__StreamDecoderLengthCallback length_callback; + FLAC__StreamDecoderEofCallback eof_callback; + FLAC__StreamDecoderWriteCallback write_callback; + FLAC__StreamDecoderMetadataCallback metadata_callback; + FLAC__StreamDecoderErrorCallback error_callback; + /* generic 32-bit datapath: */ + void (*local_lpc_restore_signal)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); + /* generic 64-bit datapath: */ + void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ + void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 data[]); + void *client_data; + // FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ + FLAC__BitReader *input; + FLAC__int32 *output[FLAC__MAX_CHANNELS]; + FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; + uint32_t output_capacity, output_channels; + FLAC__uint32 fixed_block_size, next_fixed_block_size; + FLAC__uint64 samples_decoded; + FLAC__bool has_stream_info, has_seek_table; + FLAC__StreamMetadata stream_info; + FLAC__StreamMetadata seek_table; + FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ + FLAC__byte *metadata_filter_ids; + size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ + FLAC__Frame frame; + FLAC__bool cached; /* true if there is a byte in lookahead */ + FLAC__CPUInfo cpuinfo; + FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ + FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; + FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ + FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ + FLAC__bool is_seeking; + FLAC__MD5Context md5context; + FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ + /* (the rest of these are only used for seeking) */ + FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ + FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ + FLAC__uint64 target_sample; + uint32_t unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ + FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ } FLAC__StreamDecoderPrivate; /*********************************************************************** - * - * Public static class data - * + + Public static class data + ***********************************************************************/ // Not used in AudioGeneratorFLAC, save some RAM /* -FLAC_API const char * const FLAC__StreamDecoderStateString[] = { + FLAC_API const char * const FLAC__StreamDecoderStateString[] = { "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", "FLAC__STREAM_DECODER_READ_METADATA", "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", @@ -190,3226 +190,3343 @@ FLAC_API const char * const FLAC__StreamDecoderStateString[] = { "FLAC__STREAM_DECODER_ABORTED", "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", "FLAC__STREAM_DECODER_UNINITIALIZED" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { "FLAC__STREAM_DECODER_INIT_STATUS_OK", "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", "FLAC__STREAM_DECODER_READ_STATUS_ABORT" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { "FLAC__STREAM_DECODER_SEEK_STATUS_OK", "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { "FLAC__STREAM_DECODER_TELL_STATUS_OK", "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" -}; + }; -FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { + FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" -}; + }; */ FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { - "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", - "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", - "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", - "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" + "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", + "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", + "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", + "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" }; /*********************************************************************** - * - * Class constructor/destructor - * + + Class constructor/destructor + ***********************************************************************/ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) -{ - FLAC__StreamDecoder *decoder; - uint32_t i; +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) { + FLAC__StreamDecoder *decoder; + uint32_t i; - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - decoder = calloc(1, sizeof(FLAC__StreamDecoder)); - if(decoder == 0) { - return 0; - } + decoder = calloc(1, sizeof(FLAC__StreamDecoder)); + if (decoder == 0) { + return 0; + } - decoder->protected_ = calloc(1, sizeof(FLAC__StreamDecoderProtected)); - if(decoder->protected_ == 0) { - free(decoder); - return 0; - } + decoder->protected_ = calloc(1, sizeof(FLAC__StreamDecoderProtected)); + if (decoder->protected_ == 0) { + free(decoder); + return 0; + } - decoder->private_ = calloc(1, sizeof(FLAC__StreamDecoderPrivate)); - if(decoder->private_ == 0) { - free(decoder->protected_); - free(decoder); - return 0; - } + decoder->private_ = calloc(1, sizeof(FLAC__StreamDecoderPrivate)); + if (decoder->private_ == 0) { + free(decoder->protected_); + free(decoder); + return 0; + } - decoder->private_->input = FLAC__bitreader_new(); - if(decoder->private_->input == 0) { - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } + decoder->private_->input = FLAC__bitreader_new(); + if (decoder->private_->input == 0) { + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } - decoder->private_->metadata_filter_ids_capacity = 16; - if(0 == (decoder->private_->metadata_filter_ids = malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { - FLAC__bitreader_delete(decoder->private_->input); - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } + decoder->private_->metadata_filter_ids_capacity = 16; + if (0 == (decoder->private_->metadata_filter_ids = malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) * decoder->private_->metadata_filter_ids_capacity))) { + FLAC__bitreader_delete(decoder->private_->input); + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - decoder->private_->output[i] = 0; - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } + for (i = 0; i < FLAC__MAX_CHANNELS; i++) { + decoder->private_->output[i] = 0; + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; - decoder->private_->has_seek_table = false; + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + decoder->private_->has_seek_table = false; - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); + for (i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); + } -// decoder->private_->file = 0; + // decoder->private_->file = 0; - set_defaults_(decoder); + set_defaults_(decoder); - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - return decoder; + return decoder; } -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) -{ - uint32_t i; +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) { + uint32_t i; - if (decoder == NULL) - return ; + if (decoder == NULL) { + return ; + } - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->private_->input); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->private_->input); - (void)FLAC__stream_decoder_finish(decoder); + (void)FLAC__stream_decoder_finish(decoder); - if(0 != decoder->private_->metadata_filter_ids) - free(decoder->private_->metadata_filter_ids); + if (0 != decoder->private_->metadata_filter_ids) { + free(decoder->private_->metadata_filter_ids); + } - FLAC__bitreader_delete(decoder->private_->input); + FLAC__bitreader_delete(decoder->private_->input); - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); + for (i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); + } - free(decoder->private_); - free(decoder->protected_); - free(decoder); + free(decoder->private_); + free(decoder->protected_); + free(decoder); } /*********************************************************************** - * - * Public class methods - * + + Public class methods + ***********************************************************************/ static FLAC__StreamDecoderInitStatus init_stream_internal_( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(FLAC__HAS_OGG == 0 && is_ogg) - return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; - - if( - 0 == read_callback || - 0 == write_callback || - 0 == error_callback || - (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) - ) - return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) { + FLAC__ASSERT(0 != decoder); + + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + } + + if (FLAC__HAS_OGG == 0 && is_ogg) { + return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; + } + + if ( + 0 == read_callback || + 0 == write_callback || + 0 == error_callback || + (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) + ) { + return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + } #if FLAC__HAS_OGG - decoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + decoder->private_->is_ogg = is_ogg; + if (is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) { + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + } #endif - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&decoder->private_->cpuinfo); - /* first default to the non-asm routines */ - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; - /* now override with asm where appropriate */ + /* + get the CPU info and set the function pointers + */ + FLAC__cpu_info(&decoder->private_->cpuinfo); + /* first default to the non-asm routines */ + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; + /* now override with asm where appropriate */ #ifndef FLAC__NO_ASM - if(decoder->private_->cpuinfo.use_asm) { + if (decoder->private_->cpuinfo.use_asm) { #ifdef FLAC__CPU_IA32 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); #ifdef FLAC__HAS_NASM - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ - if (decoder->private_->cpuinfo.x86.mmx) { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; - } - else { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; - } + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ + if (decoder->private_->cpuinfo.x86.mmx) { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; + } else { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; + } #endif #if FLAC__HAS_X86INTRIN && ! defined FLAC__INTEGER_ONLY_LIBRARY # if defined FLAC__SSE4_1_SUPPORTED - if (decoder->private_->cpuinfo.x86.sse41) { + if (decoder->private_->cpuinfo.x86.sse41) { # if !defined FLAC__HAS_NASM /* these are not undoubtedly faster than their MMX ASM counterparts */ - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_intrin_sse41; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse41; + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_intrin_sse41; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse41; # endif - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; - } + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; + } # endif #endif #elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); - /* No useful SSE optimizations yet */ + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); + /* No useful SSE optimizations yet */ #endif - } + } #endif - /* from here on, errors are fatal */ - - if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } - - decoder->private_->read_callback = read_callback; - decoder->private_->seek_callback = seek_callback; - decoder->private_->tell_callback = tell_callback; - decoder->private_->length_callback = length_callback; - decoder->private_->eof_callback = eof_callback; - decoder->private_->write_callback = write_callback; - decoder->private_->metadata_callback = metadata_callback; - decoder->private_->error_callback = error_callback; - decoder->private_->client_data = client_data; - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - decoder->private_->samples_decoded = 0; - decoder->private_->has_stream_info = false; - decoder->private_->cached = false; + /* from here on, errors are fatal */ - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - decoder->private_->is_seeking = false; + if (!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } - decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ - if(!FLAC__stream_decoder_reset(decoder)) { - /* above call sets the state for us */ - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } + decoder->private_->read_callback = read_callback; + decoder->private_->seek_callback = seek_callback; + decoder->private_->tell_callback = tell_callback; + decoder->private_->length_callback = length_callback; + decoder->private_->eof_callback = eof_callback; + decoder->private_->write_callback = write_callback; + decoder->private_->metadata_callback = metadata_callback; + decoder->private_->error_callback = error_callback; + decoder->private_->client_data = client_data; + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + decoder->private_->samples_decoded = 0; + decoder->private_->has_stream_info = false; + decoder->private_->cached = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + decoder->private_->is_seeking = false; + + decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ + if (!FLAC__stream_decoder_reset(decoder)) { + /* above call sets the state for us */ + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } - return FLAC__STREAM_DECODER_INIT_STATUS_OK; + return FLAC__STREAM_DECODER_INIT_STATUS_OK; } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/false - ); + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/false + ); } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/true - ); + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/true + ); } #if 0 static FLAC__StreamDecoderInitStatus init_FILE_internal_( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != file); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdin) - file = get_binary_stdin_(); /* just to be safe */ - - decoder->private_->file = file; - - return init_stream_internal_( - decoder, - file_read_callback_, - decoder->private_->file == stdin? 0: file_seek_callback_, - decoder->private_->file == stdin? 0: file_tell_callback_, - decoder->private_->file == stdin? 0: file_length_callback_, - file_eof_callback_, - write_callback, - metadata_callback, - error_callback, - client_data, - is_ogg - ); + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != file); + + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + } + + if (0 == write_callback || 0 == error_callback) { + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + } + + /* + To make sure that our file does not go unclosed after an error, we + must assign the FILE pointer before any further error can occur in + this routine. + */ + if (file == stdin) { + file = get_binary_stdin_(); /* just to be safe */ + } + + decoder->private_->file = file; + + return init_stream_internal_( + decoder, + file_read_callback_, + decoder->private_->file == stdin ? 0 : file_seek_callback_, + decoder->private_->file == stdin ? 0 : file_tell_callback_, + decoder->private_->file == stdin ? 0 : file_length_callback_, + file_eof_callback_, + write_callback, + metadata_callback, + error_callback, + client_data, + is_ogg + ); } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); } static FLAC__StreamDecoderInitStatus init_file_internal_( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != decoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. - */ - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) { + FILE *file; + + FLAC__ASSERT(0 != decoder); + + /* + To make sure that our file does not go unclosed after an error, we + have to do the same entrance checks here that are later performed + in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. + */ + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + } - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + if (0 == write_callback || 0 == error_callback) { + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + } - file = filename? flac_fopen(filename, "rb") : stdin; + file = filename ? flac_fopen(filename, "rb") : stdin; - if(0 == file) - return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + if (0 == file) { + return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + } - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); } FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) { + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); } #endif -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) -{ - FLAC__bool md5_failed = false; - uint32_t i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) - return true; - - /* see the comment in FLAC__stream_decoder_reset() as to why we - * always call FLAC__MD5Final() - */ - FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); - - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - - FLAC__bitreader_free(decoder->private_->input); - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN() - * require that the output arrays have a buffer of up to 3 zeroes - * in front (at negative indices) for alignment purposes; - * we use 4 to keep the data well-aligned. - */ - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) { + FLAC__bool md5_failed = false; + uint32_t i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if (decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) { + return true; + } + + /* see the comment in FLAC__stream_decoder_reset() as to why we + always call FLAC__MD5Final() + */ + FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); + + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + + FLAC__bitreader_free(decoder->private_->input); + for (i = 0; i < FLAC__MAX_CHANNELS; i++) { + /* WATCHOUT: + FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN() + require that the output arrays have a buffer of up to 3 zeroes + in front (at negative indices) for alignment purposes; + we use 4 to keep the data well-aligned. + */ + if (0 != decoder->private_->output[i]) { + free(decoder->private_->output[i] - 4); + decoder->private_->output[i] = 0; + } + if (0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; #if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); + if (decoder->private_->is_ogg) { + FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); + } #endif #if 0 - if(0 != decoder->private_->file) { - if(decoder->private_->file != stdin) - fclose(decoder->private_->file); - decoder->private_->file = 0; - } + if (0 != decoder->private_->file) { + if (decoder->private_->file != stdin) { + fclose(decoder->private_->file); + } + decoder->private_->file = 0; + } #endif - if(decoder->private_->do_md5_checking) { - if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) - md5_failed = true; - } - decoder->private_->is_seeking = false; + if (decoder->private_->do_md5_checking) { + if (memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) { + md5_failed = true; + } + } + decoder->private_->is_seeking = false; - set_defaults_(decoder); + set_defaults_(decoder); - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - return !md5_failed; + return !md5_failed; } -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } #if FLAC__HAS_OGG - /* can't check decoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); - return true; + /* can't check decoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); + return true; #else - (void)value; - return false; + (void)value; + return false; #endif } -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->protected_->md5_checking = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = true; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) -{ - uint32_t i; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) - decoder->private_->metadata_filter[i] = true; - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = false; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->state; +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + decoder->protected_->md5_checking = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if ((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE) { + return false; + } + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + decoder->private_->metadata_filter[type] = true; + if (type == FLAC__METADATA_TYPE_APPLICATION) { + decoder->private_->metadata_filter_ids_count = 0; + } + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + + if (decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) { + return true; + } + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if (decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if (0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) { + uint32_t i; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + for (i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) { + decoder->private_->metadata_filter[i] = true; + } + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if ((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE) { + return false; + } + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + decoder->private_->metadata_filter[type] = false; + if (type == FLAC__METADATA_TYPE_APPLICATION) { + decoder->private_->metadata_filter_ids_count = 0; + } + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + + if (!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) { + return true; + } + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if (decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if (0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if (decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->state; } #if 0 -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) -{ - return FLAC__StreamDecoderStateString[decoder->protected_->state]; +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) { + return FLAC__StreamDecoderStateString[decoder->protected_->state]; } #endif -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->md5_checking; +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->md5_checking; } -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->private_->has_stream_info ? decoder->private_->stream_info.data.stream_info.total_samples : 0; } -FLAC_API uint32_t FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channels; +FLAC_API uint32_t FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channels; } -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channel_assignment; +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channel_assignment; } -FLAC_API uint32_t FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->bits_per_sample; +FLAC_API uint32_t FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->bits_per_sample; } -FLAC_API uint32_t FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->sample_rate; +FLAC_API uint32_t FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->sample_rate; } -FLAC_API uint32_t FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->blocksize; +FLAC_API uint32_t FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->blocksize; } -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != position); +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != position); - if(FLAC__HAS_OGG && decoder->private_->is_ogg) - return false; + if (FLAC__HAS_OGG && decoder->private_->is_ogg) { + return false; + } - if(0 == decoder->private_->tell_callback) - return false; - if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) - return false; - /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) - return false; - FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); - *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); - return true; + if (0 == decoder->private_->tell_callback) { + return false; + } + if (decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) { + return false; + } + /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ + if (!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + return false; + } + FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); + *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); + return true; } -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); - if(!decoder->private_->internal_reset_hack && decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) - return false; + if (!decoder->private_->internal_reset_hack && decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) { + return false; + } - decoder->private_->samples_decoded = 0; - decoder->private_->do_md5_checking = false; + decoder->private_->samples_decoded = 0; + decoder->private_->do_md5_checking = false; #if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); + if (decoder->private_->is_ogg) { + FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); + } #endif - if(!FLAC__bitreader_clear(decoder->private_->input)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + if (!FLAC__bitreader_clear(decoder->private_->input)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; + return true; } -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } + if (!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } #if FLAC__HAS_OGG - /*@@@ could go in !internal_reset_hack block below */ - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); + /*@@@ could go in !internal_reset_hack block below */ + if (decoder->private_->is_ogg) { + FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); + } #endif - /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, - * (internal_reset_hack) don't try to rewind since we are already at - * the beginning of the stream and don't want to fail if the input is - * not seekable. - */ - if(!decoder->private_->internal_reset_hack) { + /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, + (internal_reset_hack) don't try to rewind since we are already at + the beginning of the stream and don't want to fail if the input is + not seekable. + */ + if (!decoder->private_->internal_reset_hack) { #if 0 - if(decoder->private_->file == stdin) - return false; /* can't rewind stdin, reset fails */ + if (decoder->private_->file == stdin) { + return false; /* can't rewind stdin, reset fails */ + } #endif - if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) - return false; /* seekable and seek fails, reset fails */ - } - else - decoder->private_->internal_reset_hack = false; - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; - - decoder->private_->has_stream_info = false; - - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - /* - * This goes in reset() and not flush() because according to the spec, a - * fixed-blocksize stream must stay that way through the whole stream. - */ - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - - /* We initialize the FLAC__MD5Context even though we may never use it. This - * is because md5 checking may be turned on to start and then turned off if - * a seek occurs. So we init the context here and finalize it in - * FLAC__stream_decoder_finish() to make sure things are always cleaned up - * properly. - */ - FLAC__MD5Init(&decoder->private_->md5context); - - decoder->private_->first_frame_offset = 0; - decoder->private_->unparseable_frame_count = 0; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - else - return true; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - case FLAC__STREAM_DECODER_READ_FRAME: - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) -{ - FLAC__bool dummy; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - case FLAC__STREAM_DECODER_READ_METADATA: - return false; /* above function sets the status for us */ - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) -{ - FLAC__uint64 length; - - FLAC__ASSERT(0 != decoder); - - if( - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && - decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM - ) - return false; - - if(0 == decoder->private_->seek_callback) - return false; - - FLAC__ASSERT(decoder->private_->seek_callback); - FLAC__ASSERT(decoder->private_->tell_callback); - FLAC__ASSERT(decoder->private_->length_callback); - FLAC__ASSERT(decoder->private_->eof_callback); - - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) - return false; - - decoder->private_->is_seeking = true; - - /* turn off md5 checking if a seek is attempted */ - decoder->private_->do_md5_checking = false; - - /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ - if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { - decoder->private_->is_seeking = false; - return false; - } - - /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ - if( - decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || - decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA - ) { - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { - /* above call sets the state for us */ - decoder->private_->is_seeking = false; - return false; - } - /* check this again in case we didn't know total_samples the first time */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->private_->is_seeking = false; - return false; - } - } - - { - const FLAC__bool ok = + if (decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) { + return false; /* seekable and seek fails, reset fails */ + } + } else { + decoder->private_->internal_reset_hack = false; + } + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; + + decoder->private_->has_stream_info = false; + + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + /* + This goes in reset() and not flush() because according to the spec, a + fixed-blocksize stream must stay that way through the whole stream. + */ + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + + /* We initialize the FLAC__MD5Context even though we may never use it. This + is because md5 checking may be turned on to start and then turned off if + a seek occurs. So we init the context here and finalize it in + FLAC__stream_decoder_finish() to make sure things are always cleaned up + properly. + */ + FLAC__MD5Init(&decoder->private_->md5context); + + decoder->private_->first_frame_offset = 0; + decoder->private_->unparseable_frame_count = 0; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) { + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while (1) { + switch (decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if (!find_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if (!read_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } else { + return true; + } + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if (!frame_sync_(decoder)) { + return true; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if (!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) { + return false; /* above function sets the status for us */ + } + if (got_a_frame) { + return true; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while (1) { + switch (decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if (!find_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if (!read_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) { + FLAC__bool dummy; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while (1) { + switch (decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if (!find_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if (!read_metadata_(decoder)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if (!frame_sync_(decoder)) { + return true; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if (!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) { + return false; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) { + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while (1) { + switch (decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + return false; /* above function sets the status for us */ + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if (!frame_sync_(decoder)) { + return true; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if (!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) { + return false; /* above function sets the status for us */ + } + if (got_a_frame) { + return true; /* above function sets the status for us */ + } + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) { + FLAC__uint64 length; + + FLAC__ASSERT(0 != decoder); + + if ( + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && + decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM + ) { + return false; + } + + if (0 == decoder->private_->seek_callback) { + return false; + } + + FLAC__ASSERT(decoder->private_->seek_callback); + FLAC__ASSERT(decoder->private_->tell_callback); + FLAC__ASSERT(decoder->private_->length_callback); + FLAC__ASSERT(decoder->private_->eof_callback); + + if (FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { + return false; + } + + decoder->private_->is_seeking = true; + + /* turn off md5 checking if a seek is attempted */ + decoder->private_->do_md5_checking = false; + + /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ + if (decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { + decoder->private_->is_seeking = false; + return false; + } + + /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ + if ( + decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || + decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA + ) { + if (!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { + /* above call sets the state for us */ + decoder->private_->is_seeking = false; + return false; + } + /* check this again in case we didn't know total_samples the first time */ + if (FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->private_->is_seeking = false; + return false; + } + } + + { + const FLAC__bool ok = #if FLAC__HAS_OGG - decoder->private_->is_ogg? - seek_to_absolute_sample_ogg_(decoder, length, sample) : + decoder->private_->is_ogg ? + seek_to_absolute_sample_ogg_(decoder, length, sample) : #endif - seek_to_absolute_sample_(decoder, length, sample) - ; - decoder->private_->is_seeking = false; - return ok; - } + seek_to_absolute_sample_(decoder, length, sample) + ; + decoder->private_->is_seeking = false; + return ok; + } } /*********************************************************************** - * - * Protected class methods - * + + Protected class methods + ***********************************************************************/ -uint32_t FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); - return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; +uint32_t FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) { + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); + return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; } /*********************************************************************** - * - * Private class methods - * + + Private class methods + ***********************************************************************/ -void set_defaults_(FLAC__StreamDecoder *decoder) -{ - decoder->private_->is_ogg = false; - decoder->private_->read_callback = 0; - decoder->private_->seek_callback = 0; - decoder->private_->tell_callback = 0; - decoder->private_->length_callback = 0; - decoder->private_->eof_callback = 0; - decoder->private_->write_callback = 0; - decoder->private_->metadata_callback = 0; - decoder->private_->error_callback = 0; - decoder->private_->client_data = 0; - - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; - decoder->private_->metadata_filter_ids_count = 0; - - decoder->protected_->md5_checking = false; +void set_defaults_(FLAC__StreamDecoder *decoder) { + decoder->private_->is_ogg = false; + decoder->private_->read_callback = 0; + decoder->private_->seek_callback = 0; + decoder->private_->tell_callback = 0; + decoder->private_->length_callback = 0; + decoder->private_->eof_callback = 0; + decoder->private_->write_callback = 0; + decoder->private_->metadata_callback = 0; + decoder->private_->error_callback = 0; + decoder->private_->client_data = 0; + + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; + decoder->private_->metadata_filter_ids_count = 0; + + decoder->protected_->md5_checking = false; #if FLAC__HAS_OGG - FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); + FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); #endif } #if 0 /* - * This will forcibly set stdin to binary mode (for OSes that require it) - */ -FILE *get_binary_stdin_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ + This will forcibly set stdin to binary mode (for OSes that require it) +*/ +FILE *get_binary_stdin_(void) { + /* if something breaks here it is probably due to the presence or + absence of an underscore before the identifiers 'setmode', + 'fileno', and/or 'O_BINARY'; check your system header files. + */ #if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdin), _O_BINARY); #elif defined __EMX__ - setmode(fileno(stdin), O_BINARY); + setmode(fileno(stdin), O_BINARY); #endif - return stdin; + return stdin; } #endif -FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, uint32_t size, uint32_t channels) -{ - uint32_t i; - FLAC__int32 *tmp; - - if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) - return true; - - /* simply using realloc() is not practical because the number of channels may change mid-stream */ - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - - for(i = 0; i < channels; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN() - * require that the output arrays have a buffer of up to 3 zeroes - * in front (at negative indices) for alignment purposes; - * we use 4 to keep the data well-aligned. - */ - tmp = safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); - if(tmp == 0) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - memset(tmp, 0, sizeof(FLAC__int32)*4); - decoder->private_->output[i] = tmp + 4; - - if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - } - - decoder->private_->output_capacity = size; - decoder->private_->output_channels = channels; - - return true; -} - -FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) -{ - size_t i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - - for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) - if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) - return true; - - return false; -} - -FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - uint32_t i, id; - FLAC__bool first = true; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - for(i = id = 0; i < 4; ) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == FLAC__STREAM_SYNC_STRING[i]) { - first = true; - i++; - id = 0; - continue; - } - - if(id >= 3) - return false; - - if(x == ID3V2_TAG_[id]) { - id++; - i = 0; - if(id == 3) { - if(!skip_id3v2_tag_(decoder)) - return false; /* skip_id3v2_tag_ sets the state for us */ - } - continue; - } - id = 0; - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - i = 0; - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; - return true; -} - -FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__bool is_last; - FLAC__uint32 i, x, type, length; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; /* read_callback_ sets the state for us */ - is_last = x? true : false; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(type == FLAC__METADATA_TYPE_STREAMINFO) { - if(!read_metadata_streaminfo_(decoder, is_last, length)) - return false; - - decoder->private_->has_stream_info = true; - if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) - decoder->private_->do_md5_checking = false; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); - } - else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { - /* just in case we already have a seek table, and reading the next one fails: */ - decoder->private_->has_seek_table = false; - - if(!read_metadata_seektable_(decoder, is_last, length)) - return false; - - decoder->private_->has_seek_table = true; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); - } - else { - FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; - uint32_t real_length = length; - FLAC__StreamMetadata block; - - memset(&block, 0, sizeof(block)); - block.is_last = is_last; - block.type = (FLAC__MetadataType)type; - block.length = length; - - if(type == FLAC__METADATA_TYPE_APPLICATION) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ - return false; - } - - real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; - - if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) - skip_it = !skip_it; - } - - if(skip_it) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - return false; /* read_callback_ sets the state for us */ - } - else { - FLAC__bool ok = true; - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - /* skip the padding bytes */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - ok = false; /* read_callback_ sets the state for us */ - break; - case FLAC__METADATA_TYPE_APPLICATION: - /* remember, we read the ID already */ - if(real_length > 0) { - if(0 == (block.data.application.data = malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.application.data = 0; - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) - ok = false; - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) - ok = false; - break; - case FLAC__METADATA_TYPE_PICTURE: - if(!read_metadata_picture_(decoder, &block.data.picture)) - ok = false; - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - break; - default: - if(real_length > 0) { - if(0 == (block.data.unknown.data = malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.unknown.data = 0; - break; - } - if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); - - /* now we have to free any malloc()ed data in the block */ - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(0 != block.data.application.data) - free(block.data.application.data); - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != block.data.vorbis_comment.vendor_string.entry) - free(block.data.vorbis_comment.vendor_string.entry); - if(block.data.vorbis_comment.num_comments > 0) - for(i = 0; i < block.data.vorbis_comment.num_comments; i++) - if(0 != block.data.vorbis_comment.comments[i].entry) - free(block.data.vorbis_comment.comments[i].entry); - if(0 != block.data.vorbis_comment.comments) - free(block.data.vorbis_comment.comments); - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(block.data.cue_sheet.num_tracks > 0) - for(i = 0; i < block.data.cue_sheet.num_tracks; i++) - if(0 != block.data.cue_sheet.tracks[i].indices) - free(block.data.cue_sheet.tracks[i].indices); - if(0 != block.data.cue_sheet.tracks) - free(block.data.cue_sheet.tracks); - break; - case FLAC__METADATA_TYPE_PICTURE: - if(0 != block.data.picture.mime_type) - free(block.data.picture.mime_type); - if(0 != block.data.picture.description) - free(block.data.picture.description); - if(0 != block.data.picture.data) - free(block.data.picture.data); - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - default: - if(0 != block.data.unknown.data) - free(block.data.unknown.data); - break; - } - - if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ - return false; - } - } - - if(is_last) { - /* if this fails, it's OK, it's just a hint for the seek routine */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) - decoder->private_->first_frame_offset = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - - return true; -} - -FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length) -{ - FLAC__uint32 x; - uint32_t bits, used_bits = 0; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; - decoder->private_->stream_info.is_last = is_last; - decoder->private_->stream_info.length = length; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.sample_rate = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.channels = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - used_bits += bits; - - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) - return false; /* read_callback_ sets the state for us */ - used_bits += 16*8; - - /* skip the rest of the block */ - FLAC__ASSERT(used_bits % 8 == 0); - if (length < (used_bits / 8)) - return false; /* read_callback_ sets the state for us */ - length -= (used_bits / 8); - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - - return true; -} - -FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length) -{ - FLAC__uint32 i, x; - FLAC__uint64 xx; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; - decoder->private_->seek_table.is_last = is_last; - decoder->private_->seek_table.length = length; - - decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; - - /* use realloc since we may pass through here several times (e.g. after seeking) */ - if(0 == (decoder->private_->seek_table.data.seek_table.points = safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; - } - length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); - /* if there is a partial point left, skip over it */ - if(length > 0) { - /*@@@ do a send_error_to_client_() here? there's an argument for either way */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, uint32_t length) -{ - FLAC__uint32 i; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read vendor string */ - if (length >= 8) { - length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - if (obj->vendor_string.length > 0) { - if (length < obj->vendor_string.length) { - obj->vendor_string.length = 0; - obj->vendor_string.entry = 0; - goto skip; - } - else - length -= obj->vendor_string.length; - if (0 == (obj->vendor_string.entry = safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - obj->vendor_string.entry[obj->vendor_string.length] = '\0'; - } - else - obj->vendor_string.entry = 0; - - /* read num comments */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) - return false; /* read_callback_ sets the state for us */ - - /* read comments */ - if (obj->num_comments > 100000) { - /* Possibly malicious file. */ - obj->num_comments = 0; - return false; - } - if (obj->num_comments > 0) { - if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { - obj->num_comments = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for (i = 0; i < obj->num_comments; i++) { - /* Initialize here just to make sure. */ - obj->comments[i].length = 0; - obj->comments[i].entry = 0; - - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (length < 4) { - obj->num_comments = i; - goto skip; - } - else - length -= 4; - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) { - obj->num_comments = i; - return false; /* read_callback_ sets the state for us */ - } - if (obj->comments[i].length > 0) { - if (length < obj->comments[i].length) { - obj->num_comments = i; - goto skip; - } - else - length -= obj->comments[i].length; - if (0 == (obj->comments[i].entry = safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - obj->num_comments = i; - return false; - } - memset (obj->comments[i].entry, 0, obj->comments[i].length) ; - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) { - /* Current i-th entry is bad, so we delete it. */ - free (obj->comments[i].entry) ; - obj->comments[i].entry = NULL ; - obj->num_comments = i; - goto skip; - } - obj->comments[i].entry[obj->comments[i].length] = '\0'; - } - else - obj->comments[i].entry = 0; - } - } - } - - skip: - if (length > 0) { - /* length > 0 can only happen on files with invalid data in comments */ - if(obj->num_comments < 1) { - free(obj->comments); - obj->comments = NULL; - } - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) -{ - FLAC__uint32 i, j, x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->is_cd = x? true : false; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->num_tracks = x; - - if(obj->num_tracks > 0) { - if(0 == (obj->tracks = safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < obj->num_tracks; i++) { - FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - track->number = (FLAC__byte)x; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - track->type = x; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; /* read_callback_ sets the state for us */ - track->pre_emphasis = x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; /* read_callback_ sets the state for us */ - track->num_indices = (FLAC__byte)x; - - if(track->num_indices > 0) { - if(0 == (track->indices = safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(j = 0; j < track->num_indices; j++) { - FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - indx->number = (FLAC__byte)x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - } - } - } - } - - return true; -} - -FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) -{ - FLAC__uint32 x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->type = x; - - /* read MIME type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->mime_type = safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->mime_type[x] = '\0'; - - /* read description */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->description = safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->description[x] = '\0'; - - /* read width */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read height */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read depth */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read colors */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read data */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->data = safe_malloc_(obj->data_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(obj->data_length > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - uint32_t i, skip; - - /* skip the version and flags bytes */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) - return false; /* read_callback_ sets the state for us */ - /* get the size (in bytes) to skip */ - skip = 0; - for(i = 0; i < 4; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - skip <<= 7; - skip |= (x & 0x7f); - } - /* skip the rest of the tag */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) - return false; /* read_callback_ sets the state for us */ - return true; -} - -FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__bool first = true; - - /* If we know the total number of samples in the stream, stop if we've read that many. */ - /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { - if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return true; - } - } - - /* make sure we're byte aligned */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - } - - while(1) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - return true; -} - -FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) -{ - uint32_t channel; - uint32_t i; - FLAC__int32 mid, side; - uint32_t frame_crc; /* the one we calculate from the input stream */ - FLAC__uint32 x; - - *got_a_frame = false; - - /* init the CRC */ - frame_crc = 0; - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); - FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); - - if(!read_frame_header_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ - return true; - if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) - return false; - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - /* - * first figure the correct bits-per-sample of the subframe - */ - uint32_t bps = decoder->private_->frame.header.bits_per_sample; - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* no adjustment needed */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 0) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - default: - FLAC__ASSERT(0); - } - /* - * now read it - */ - if(!read_subframe_(decoder, channel, bps, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - if(!read_zero_padding_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ - return true; - - /* - * Read the frame CRC-16 from the footer and check - */ - frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) - return false; /* read_callback_ sets the state for us */ - if(frame_crc == x) { - if(do_full_decode) { - /* Undo any special channel coding */ - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* do nothing */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[0][i] += decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { +FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, uint32_t size, uint32_t channels) { + uint32_t i; + FLAC__int32 *tmp; + + if (size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) { + return true; + } + + /* simply using realloc() is not practical because the number of channels may change mid-stream */ + + for (i = 0; i < FLAC__MAX_CHANNELS; i++) { + if (0 != decoder->private_->output[i]) { + free(decoder->private_->output[i] - 4); + decoder->private_->output[i] = 0; + } + if (0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + + for (i = 0; i < channels; i++) { + /* WATCHOUT: + FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN() + require that the output arrays have a buffer of up to 3 zeroes + in front (at negative indices) for alignment purposes; + we use 4 to keep the data well-aligned. + */ + tmp = safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); + if (tmp == 0) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + memset(tmp, 0, sizeof(FLAC__int32) * 4); + decoder->private_->output[i] = tmp + 4; + + if (!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + } + + decoder->private_->output_capacity = size; + decoder->private_->output_channels = channels; + + return true; +} + +FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) { + size_t i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + + for (i = 0; i < decoder->private_->metadata_filter_ids_count; i++) + if (0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) { + return true; + } + + return false; +} + +FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) { + FLAC__uint32 x; + uint32_t i, id; + FLAC__bool first = true; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + for (i = id = 0; i < 4;) { + if (decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } else { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + } + if (x == FLAC__STREAM_SYNC_STRING[i]) { + first = true; + i++; + id = 0; + continue; + } + + if (id >= 3) { + return false; + } + + if (x == ID3V2_TAG_[id]) { + id++; + i = 0; + if (id == 3) { + if (!skip_id3v2_tag_(decoder)) { + return false; /* skip_id3v2_tag_ sets the state for us */ + } + } + continue; + } + id = 0; + if (x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if (x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } else if (x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + i = 0; + if (first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; + return true; +} + +FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) { + FLAC__bool is_last; + FLAC__uint32 i, x, type, length; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + is_last = x ? true : false; + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (type == FLAC__METADATA_TYPE_STREAMINFO) { + if (!read_metadata_streaminfo_(decoder, is_last, length)) { + return false; + } + + decoder->private_->has_stream_info = true; + if (0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) { + decoder->private_->do_md5_checking = false; + } + if (!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) { + decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); + } + } else if (type == FLAC__METADATA_TYPE_SEEKTABLE) { + /* just in case we already have a seek table, and reading the next one fails: */ + decoder->private_->has_seek_table = false; + + if (!read_metadata_seektable_(decoder, is_last, length)) { + return false; + } + + decoder->private_->has_seek_table = true; + if (!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) { + decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); + } + } else { + FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; + uint32_t real_length = length; + FLAC__StreamMetadata block; + + memset(&block, 0, sizeof(block)); + block.is_last = is_last; + block.type = (FLAC__MetadataType)type; + block.length = length; + + if (type == FLAC__METADATA_TYPE_APPLICATION) { + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) { + return false; /* read_callback_ sets the state for us */ + } + + if (real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) { /* underflow check */ + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ + return false; + } + + real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + + if (decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) { + skip_it = !skip_it; + } + } + + if (skip_it) { + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) { + return false; /* read_callback_ sets the state for us */ + } + } else { + FLAC__bool ok = true; + switch (type) { + case FLAC__METADATA_TYPE_PADDING: + /* skip the padding bytes */ + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) { + ok = false; /* read_callback_ sets the state for us */ + } + break; + case FLAC__METADATA_TYPE_APPLICATION: + /* remember, we read the ID already */ + if (real_length > 0) { + if (0 == (block.data.application.data = malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + ok = false; + } else if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) { + ok = false; /* read_callback_ sets the state for us */ + } + } else { + block.data.application.data = 0; + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if (!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) { + ok = false; + } + break; + case FLAC__METADATA_TYPE_CUESHEET: + if (!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) { + ok = false; + } + break; + case FLAC__METADATA_TYPE_PICTURE: + if (!read_metadata_picture_(decoder, &block.data.picture)) { + ok = false; + } + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + break; + default: + if (real_length > 0) { + if (0 == (block.data.unknown.data = malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + ok = false; + } else if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) { + ok = false; /* read_callback_ sets the state for us */ + } + } else { + block.data.unknown.data = 0; + } + break; + } + if (ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) { + decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); + } + + /* now we have to free any malloc()ed data in the block */ + switch (type) { + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if (0 != block.data.application.data) { + free(block.data.application.data); + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if (0 != block.data.vorbis_comment.vendor_string.entry) { + free(block.data.vorbis_comment.vendor_string.entry); + } + if (block.data.vorbis_comment.num_comments > 0) + for (i = 0; i < block.data.vorbis_comment.num_comments; i++) + if (0 != block.data.vorbis_comment.comments[i].entry) { + free(block.data.vorbis_comment.comments[i].entry); + } + if (0 != block.data.vorbis_comment.comments) { + free(block.data.vorbis_comment.comments); + } + break; + case FLAC__METADATA_TYPE_CUESHEET: + if (block.data.cue_sheet.num_tracks > 0) + for (i = 0; i < block.data.cue_sheet.num_tracks; i++) + if (0 != block.data.cue_sheet.tracks[i].indices) { + free(block.data.cue_sheet.tracks[i].indices); + } + if (0 != block.data.cue_sheet.tracks) { + free(block.data.cue_sheet.tracks); + } + break; + case FLAC__METADATA_TYPE_PICTURE: + if (0 != block.data.picture.mime_type) { + free(block.data.picture.mime_type); + } + if (0 != block.data.picture.description) { + free(block.data.picture.description); + } + if (0 != block.data.picture.data) { + free(block.data.picture.data); + } + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + default: + if (0 != block.data.unknown.data) { + free(block.data.unknown.data); + } + break; + } + + if (!ok) { /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ + return false; + } + } + } + + if (is_last) { + /* if this fails, it's OK, it's just a hint for the seek routine */ + if (!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) { + decoder->private_->first_frame_offset = 0; + } + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + + return true; +} + +FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length) { + FLAC__uint32 x; + uint32_t bits, used_bits = 0; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; + decoder->private_->stream_info.is_last = is_last; + decoder->private_->stream_info.length = length; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.min_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.max_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.min_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.max_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.sample_rate = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.channels = x + 1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->stream_info.data.stream_info.bits_per_sample = x + 1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + used_bits += bits; + + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) { + return false; /* read_callback_ sets the state for us */ + } + used_bits += 16 * 8; + + /* skip the rest of the block */ + FLAC__ASSERT(used_bits % 8 == 0); + if (length < (used_bits / 8)) { + return false; /* read_callback_ sets the state for us */ + } + length -= (used_bits / 8); + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) { + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length) { + FLAC__uint32 i, x; + FLAC__uint64 xx; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; + decoder->private_->seek_table.is_last = is_last; + decoder->private_->seek_table.length = length; + + decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; + + /* use realloc since we may pass through here several times (e.g. after seeking) */ + if (0 == (decoder->private_->seek_table.data.seek_table.points = safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for (i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; + + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; + } + length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); + /* if there is a partial point left, skip over it */ + if (length > 0) { + /*@@@ do a send_error_to_client_() here? there's an argument for either way */ + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) { + return false; /* read_callback_ sets the state for us */ + } + } + + return true; +} + +FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, uint32_t length) { + FLAC__uint32 i; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read vendor string */ + if (length >= 8) { + length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) { + return false; /* read_callback_ sets the state for us */ + } + if (obj->vendor_string.length > 0) { + if (length < obj->vendor_string.length) { + obj->vendor_string.length = 0; + obj->vendor_string.entry = 0; + goto skip; + } else { + length -= obj->vendor_string.length; + } + if (0 == (obj->vendor_string.entry = safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) { + return false; /* read_callback_ sets the state for us */ + } + obj->vendor_string.entry[obj->vendor_string.length] = '\0'; + } else { + obj->vendor_string.entry = 0; + } + + /* read num comments */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) { + return false; /* read_callback_ sets the state for us */ + } + + /* read comments */ + if (obj->num_comments > 100000) { + /* Possibly malicious file. */ + obj->num_comments = 0; + return false; + } + if (obj->num_comments > 0) { + if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { + obj->num_comments = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for (i = 0; i < obj->num_comments; i++) { + /* Initialize here just to make sure. */ + obj->comments[i].length = 0; + obj->comments[i].entry = 0; + + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if (length < 4) { + obj->num_comments = i; + goto skip; + } else { + length -= 4; + } + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) { + obj->num_comments = i; + return false; /* read_callback_ sets the state for us */ + } + if (obj->comments[i].length > 0) { + if (length < obj->comments[i].length) { + obj->num_comments = i; + goto skip; + } else { + length -= obj->comments[i].length; + } + if (0 == (obj->comments[i].entry = safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + obj->num_comments = i; + return false; + } + memset(obj->comments[i].entry, 0, obj->comments[i].length) ; + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) { + /* Current i-th entry is bad, so we delete it. */ + free(obj->comments[i].entry) ; + obj->comments[i].entry = NULL ; + obj->num_comments = i; + goto skip; + } + obj->comments[i].entry[obj->comments[i].length] = '\0'; + } else { + obj->comments[i].entry = 0; + } + } + } + } + +skip: + if (length > 0) { + /* length > 0 can only happen on files with invalid data in comments */ + if (obj->num_comments < 1) { + free(obj->comments); + obj->comments = NULL; + } + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) { + return false; /* read_callback_ sets the state for us */ + } + } + + return true; +} + +FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) { + FLAC__uint32 i, j, x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + obj->is_cd = x ? true : false; + + if (!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + obj->num_tracks = x; + + if (obj->num_tracks > 0) { + if (0 == (obj->tracks = safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for (i = 0; i < obj->num_tracks; i++) { + FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + track->number = (FLAC__byte)x; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + track->type = x; + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + track->pre_emphasis = x; + + if (!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + track->num_indices = (FLAC__byte)x; + + if (track->num_indices > 0) { + if (0 == (track->indices = safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for (j = 0; j < track->num_indices; j++) { + FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; + if (!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + indx->number = (FLAC__byte)x; + + if (!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + } + } + } + } + + return true; +} + +FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) { + FLAC__uint32 x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read type */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + obj->type = x; + + /* read MIME type */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (0 == (obj->mime_type = safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if (x > 0) { + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) { + return false; /* read_callback_ sets the state for us */ + } + } + obj->mime_type[x] = '\0'; + + /* read description */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (0 == (obj->description = safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if (x > 0) { + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) { + return false; /* read_callback_ sets the state for us */ + } + } + obj->description[x] = '\0'; + + /* read width */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + /* read height */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + /* read depth */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + /* read colors */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + + /* read data */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (0 == (obj->data = safe_malloc_(obj->data_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if (obj->data_length > 0) { + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) { + return false; /* read_callback_ sets the state for us */ + } + } + + return true; +} + +FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) { + FLAC__uint32 x; + uint32_t i, skip; + + /* skip the version and flags bytes */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) { + return false; /* read_callback_ sets the state for us */ + } + /* get the size (in bytes) to skip */ + skip = 0; + for (i = 0; i < 4; i++) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + skip <<= 7; + skip |= (x & 0x7f); + } + /* skip the rest of the tag */ + if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) { + return false; /* read_callback_ sets the state for us */ + } + return true; +} + +FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) { + FLAC__uint32 x; + FLAC__bool first = true; + + /* If we know the total number of samples in the stream, stop if we've read that many. */ + /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ + if (FLAC__stream_decoder_get_total_samples(decoder) > 0) { + if (decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return true; + } + } + + /* make sure we're byte aligned */ + if (!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) { + return false; /* read_callback_ sets the state for us */ + } + } + + while (1) { + if (decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } else { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + } + if (x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if (x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } else if (x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + if (first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + return true; +} + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) { + uint32_t channel; + uint32_t i; + FLAC__int32 mid, side; + uint32_t frame_crc; /* the one we calculate from the input stream */ + FLAC__uint32 x; + + *got_a_frame = false; + + /* init the CRC */ + frame_crc = 0; + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); + FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); + + if (!read_frame_header_(decoder)) { + return false; + } + if (decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) { /* means we didn't sync on a valid header */ + return true; + } + if (!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) { + return false; + } + for (channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + /* + first figure the correct bits-per-sample of the subframe + */ + uint32_t bps = decoder->private_->frame.header.bits_per_sample; + switch (decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* no adjustment needed */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if (channel == 1) { + bps++; + } + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if (channel == 0) { + bps++; + } + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if (channel == 1) { + bps++; + } + break; + default: + FLAC__ASSERT(0); + } + /* + now read it + */ + if (!read_subframe_(decoder, channel, bps, do_full_decode)) { + return false; + } + if (decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) { /* means bad sync or got corruption */ + return true; + } + } + if (!read_zero_padding_(decoder)) { + return false; + } + if (decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) { /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ + return true; + } + + /* + Read the frame CRC-16 from the footer and check + */ + frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (frame_crc == x) { + if (do_full_decode) { + /* Undo any special channel coding */ + switch (decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* do nothing */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { + decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; + } + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { + decoder->private_->output[0][i] += decoder->private_->output[1][i]; + } + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { #if 1 - mid = decoder->private_->output[0][i]; - side = decoder->private_->output[1][i]; - mid = ((uint32_t) mid) << 1; - mid |= (side & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + side) >> 1; - decoder->private_->output[1][i] = (mid - side) >> 1; + mid = decoder->private_->output[0][i]; + side = decoder->private_->output[1][i]; + mid = ((uint32_t) mid) << 1; + mid |= (side & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + side) >> 1; + decoder->private_->output[1][i] = (mid - side) >> 1; #else - /* OPT: without 'side' temp variable */ - mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; - decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; + /* OPT: without 'side' temp variable */ + mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; + decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; #endif - } - break; - default: - FLAC__ASSERT(0); - break; - } - } - } - else { - /* Bad frame, emit error and zero the output signal */ - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); - if(do_full_decode) { - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - } - } - } - - *got_a_frame = true; - - /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ - if(decoder->private_->next_fixed_block_size) - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; - - /* put the latest values into the public section of the decoder instance */ - decoder->protected_->channels = decoder->private_->frame.header.channels; - decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; - decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; - decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; - decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; - - FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; - - /* write it */ - if(do_full_decode) { - if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - } - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; -} - -FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__uint64 xx; - uint32_t i, blocksize_hint = 0, sample_rate_hint = 0; - FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ - uint32_t raw_header_len; - FLAC__bool is_unparseable = false; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* init the raw header with the saved bits from synchronization */ - raw_header[0] = decoder->private_->header_warmup[0]; - raw_header[1] = decoder->private_->header_warmup[1]; - raw_header_len = 2; - - /* check to make sure that reserved bit is 0 */ - if(raw_header[1] & 0x02) /* MAGIC NUMBER */ - is_unparseable = true; - - /* - * Note that along the way as we read the header, we look for a sync - * code inside. If we find one it would indicate that our original - * sync was bad since there cannot be a sync code in a valid header. - * - * Three kinds of things can go wrong when reading the frame header: - * 1) We may have sync'ed incorrectly and not landed on a frame header. - * If we don't find a sync code, it can end up looking like we read - * a valid but unparseable header, until getting to the frame header - * CRC. Even then we could get a false positive on the CRC. - * 2) We may have sync'ed correctly but on an unparseable frame (from a - * future encoder). - * 3) We may be on a damaged frame which appears valid but unparseable. - * - * For all these reasons, we try and read a complete frame header as - * long as it seems valid, even if unparseable, up until the frame - * header CRC. - */ - - /* - * read in the raw header as bytes so we can CRC it, and parse it on the way - */ - for(i = 0; i < 2; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - raw_header[raw_header_len++] = (FLAC__byte)x; - } - - switch(x = raw_header[2] >> 4) { - case 0: - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.blocksize = 192; - break; - case 2: - case 3: - case 4: - case 5: - decoder->private_->frame.header.blocksize = 576 << (x-2); - break; - case 6: - case 7: - blocksize_hint = x; - break; - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - decoder->private_->frame.header.blocksize = 256 << (x-8); - break; - default: - FLAC__ASSERT(0); - break; - } - - switch(x = raw_header[2] & 0x0f) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.sample_rate = 88200; - break; - case 2: - decoder->private_->frame.header.sample_rate = 176400; - break; - case 3: - decoder->private_->frame.header.sample_rate = 192000; - break; - case 4: - decoder->private_->frame.header.sample_rate = 8000; - break; - case 5: - decoder->private_->frame.header.sample_rate = 16000; - break; - case 6: - decoder->private_->frame.header.sample_rate = 22050; - break; - case 7: - decoder->private_->frame.header.sample_rate = 24000; - break; - case 8: - decoder->private_->frame.header.sample_rate = 32000; - break; - case 9: - decoder->private_->frame.header.sample_rate = 44100; - break; - case 10: - decoder->private_->frame.header.sample_rate = 48000; - break; - case 11: - decoder->private_->frame.header.sample_rate = 96000; - break; - case 12: - case 13: - case 14: - sample_rate_hint = x; - break; - case 15: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - default: - FLAC__ASSERT(0); - } - - x = (uint32_t)(raw_header[3] >> 4); - if(x & 8) { - decoder->private_->frame.header.channels = 2; - switch(x & 7) { - case 0: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; - break; - case 1: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; - break; - case 2: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; - break; - default: - is_unparseable = true; - break; - } - } - else { - decoder->private_->frame.header.channels = (uint32_t)x + 1; - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - } - - switch(x = (uint32_t)(raw_header[3] & 0x0e) >> 1) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.bits_per_sample = 8; - break; - case 2: - decoder->private_->frame.header.bits_per_sample = 12; - break; - case 4: - decoder->private_->frame.header.bits_per_sample = 16; - break; - case 5: - decoder->private_->frame.header.bits_per_sample = 20; - break; - case 6: - decoder->private_->frame.header.bits_per_sample = 24; - break; - case 3: - case 7: - is_unparseable = true; - break; - default: - FLAC__ASSERT(0); - break; - } - - /* check to make sure that reserved bit is 0 */ - if(raw_header[3] & 0x01) /* MAGIC NUMBER */ - is_unparseable = true; - - /* read the frame's starting sample number (or frame number as the case may be) */ - if( - raw_header[1] & 0x01 || - /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ - (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) - ) { /* variable blocksize */ - if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - decoder->private_->frame.header.number.sample_number = xx; - } - else { /* fixed blocksize */ - if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - decoder->private_->frame.header.number.frame_number = x; - } - - if(blocksize_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(blocksize_hint == 7) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - decoder->private_->frame.header.blocksize = x+1; - } - - if(sample_rate_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(sample_rate_hint != 12) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - if(sample_rate_hint == 12) - decoder->private_->frame.header.sample_rate = x*1000; - else if(sample_rate_hint == 13) - decoder->private_->frame.header.sample_rate = x; - else - decoder->private_->frame.header.sample_rate = x*10; - } - - /* read the CRC-8 byte */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - crc8 = (FLAC__byte)x; - - if(FLAC__crc8(raw_header, raw_header_len) != crc8) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* calculate the sample number from the frame number if needed */ - decoder->private_->next_fixed_block_size = 0; - if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - x = decoder->private_->frame.header.number.frame_number; - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - if(decoder->private_->fixed_block_size) - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; - else if(decoder->private_->has_stream_info) { - if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; - decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; - } - else - is_unparseable = true; - } - else if(x == 0) { - decoder->private_->frame.header.number.sample_number = 0; - decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; - } - else { - /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; - } - } - - if(is_unparseable) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - return true; -} - -FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) -{ - FLAC__uint32 x; - FLAC__bool wasted_bits; - uint32_t i; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ - return false; /* read_callback_ sets the state for us */ - - wasted_bits = (x & 1); - x &= 0xfe; - - if(wasted_bits) { - uint32_t u; - if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->frame.subframes[channel].wasted_bits = u+1; - if (decoder->private_->frame.subframes[channel].wasted_bits >= bps) - return false; - bps -= decoder->private_->frame.subframes[channel].wasted_bits; - } - else - decoder->private_->frame.subframes[channel].wasted_bits = 0; - - /* - * Lots of magic numbers here - */ - if(x & 0x80) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x == 0) { - if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x == 2) { - if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x < 16) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x <= 24) { - if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - else if(x < 64) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else { - if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - - if(wasted_bits && do_full_decode) { - x = decoder->private_->frame.subframes[channel].wasted_bits; - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { - uint32_t val = decoder->private_->output[channel][i]; - decoder->private_->output[channel][i] = (val << x); - } - } - - return true; -} - -FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; - FLAC__int32 x; - uint32_t i; - FLAC__int32 *output = decoder->private_->output[channel]; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; - - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - - subframe->value = x; - - /* decode the subframe */ - if(do_full_decode) { - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - output[i] = x; - } - - return true; -} - -FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; - FLAC__int32 i32; - FLAC__uint32 u32; - uint32_t u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - if(decoder->private_->frame.header.blocksize >> u32 < order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; - FLAC__int32 i32; - FLAC__uint32 u32; - uint32_t u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read qlp coeff precision */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; /* read_callback_ sets the state for us */ - if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->qlp_coeff_precision = u32+1; - - /* read qlp shift */ - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; /* read_callback_ sets the state for us */ - if(i32 < 0) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->quantization_level = i32; - - /* read quantized lp coefficiencts */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) - return false; /* read_callback_ sets the state for us */ - subframe->qlp_coeff[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - if(decoder->private_->frame.header.blocksize >> u32 < order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(bps <= 16 && subframe->qlp_coeff_precision <= 16) - decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; - FLAC__int32 x, *residual = decoder->private_->residual[channel]; - uint32_t i; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data = residual; - - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - residual[i] = x; - } - - /* decode the subframe */ - if(do_full_decode) - memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - - return true; -} - -FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_t predictor_order, uint32_t partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) -{ - FLAC__uint32 rice_parameter; - int i; - uint32_t partition, sample, u; - const uint32_t partitions = 1u << partition_order; - const uint32_t partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; - const uint32_t plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const uint32_t pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - /* invalid predictor and partition orders mush be handled in the callers */ - FLAC__ASSERT(partition_order > 0? partition_samples >= predictor_order : decoder->private_->frame.header.blocksize >= predictor_order); - - if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - sample = 0; - for(partition = 0; partition < partitions; partition++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->parameters[partition] = rice_parameter; - if(rice_parameter < pesc) { - partitioned_rice_contents->raw_bits[partition] = 0; - u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; - if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - sample += u; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->raw_bits[partition] = rice_parameter; - for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - residual[sample] = i; - } - } - } - - return true; -} - -FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) -{ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - FLAC__uint32 zero = 0; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - if(zero != 0) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - } - return true; -} - -FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; - - if( + } + break; + default: + FLAC__ASSERT(0); + break; + } + } + } else { + /* Bad frame, emit error and zero the output signal */ + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); + if (do_full_decode) { + for (channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + } + } + } + + *got_a_frame = true; + + /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ + if (decoder->private_->next_fixed_block_size) { + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; + } + + /* put the latest values into the public section of the decoder instance */ + decoder->protected_->channels = decoder->private_->frame.header.channels; + decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; + decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; + decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; + decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; + + FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; + + /* write it */ + if (do_full_decode) { + if (write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; +} +#pragma GCC diagnostic pop + +FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) { + FLAC__uint32 x; + FLAC__uint64 xx; + uint32_t i, blocksize_hint = 0, sample_rate_hint = 0; + FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ + uint32_t raw_header_len; + FLAC__bool is_unparseable = false; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* init the raw header with the saved bits from synchronization */ + raw_header[0] = decoder->private_->header_warmup[0]; + raw_header[1] = decoder->private_->header_warmup[1]; + raw_header_len = 2; + + /* check to make sure that reserved bit is 0 */ + if (raw_header[1] & 0x02) { /* MAGIC NUMBER */ + is_unparseable = true; + } + + /* + Note that along the way as we read the header, we look for a sync + code inside. If we find one it would indicate that our original + sync was bad since there cannot be a sync code in a valid header. + + Three kinds of things can go wrong when reading the frame header: + 1) We may have sync'ed incorrectly and not landed on a frame header. + If we don't find a sync code, it can end up looking like we read + a valid but unparsable header, until getting to the frame header + CRC. Even then we could get a false positive on the CRC. + 2) We may have sync'ed correctly but on an unparsable frame (from a + future encoder). + 3) We may be on a damaged frame which appears valid but unparsable. + + For all these reasons, we try and read a complete frame header as + long as it seems valid, even if unparsable, up until the frame + header CRC. + */ + + /* + read in the raw header as bytes so we can CRC it, and parse it on the way + */ + for (i = 0; i < 2; i++) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + if (x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + raw_header[raw_header_len++] = (FLAC__byte)x; + } + + switch (x = raw_header[2] >> 4) { + case 0: + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.blocksize = 192; + break; + case 2: + case 3: + case 4: + case 5: + decoder->private_->frame.header.blocksize = 576 << (x - 2); + break; + case 6: + case 7: + blocksize_hint = x; + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + decoder->private_->frame.header.blocksize = 256 << (x - 8); + break; + default: + FLAC__ASSERT(0); + break; + } + + switch (x = raw_header[2] & 0x0f) { + case 0: + if (decoder->private_->has_stream_info) { + decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; + } else { + is_unparseable = true; + } + break; + case 1: + decoder->private_->frame.header.sample_rate = 88200; + break; + case 2: + decoder->private_->frame.header.sample_rate = 176400; + break; + case 3: + decoder->private_->frame.header.sample_rate = 192000; + break; + case 4: + decoder->private_->frame.header.sample_rate = 8000; + break; + case 5: + decoder->private_->frame.header.sample_rate = 16000; + break; + case 6: + decoder->private_->frame.header.sample_rate = 22050; + break; + case 7: + decoder->private_->frame.header.sample_rate = 24000; + break; + case 8: + decoder->private_->frame.header.sample_rate = 32000; + break; + case 9: + decoder->private_->frame.header.sample_rate = 44100; + break; + case 10: + decoder->private_->frame.header.sample_rate = 48000; + break; + case 11: + decoder->private_->frame.header.sample_rate = 96000; + break; + case 12: + case 13: + case 14: + sample_rate_hint = x; + break; + case 15: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + default: + FLAC__ASSERT(0); + } + + x = (uint32_t)(raw_header[3] >> 4); + if (x & 8) { + decoder->private_->frame.header.channels = 2; + switch (x & 7) { + case 0: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; + break; + case 1: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; + break; + case 2: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; + break; + default: + is_unparseable = true; + break; + } + } else { + decoder->private_->frame.header.channels = (uint32_t)x + 1; + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + } + + switch (x = (uint32_t)(raw_header[3] & 0x0e) >> 1) { + case 0: + if (decoder->private_->has_stream_info) { + decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; + } else { + is_unparseable = true; + } + break; + case 1: + decoder->private_->frame.header.bits_per_sample = 8; + break; + case 2: + decoder->private_->frame.header.bits_per_sample = 12; + break; + case 4: + decoder->private_->frame.header.bits_per_sample = 16; + break; + case 5: + decoder->private_->frame.header.bits_per_sample = 20; + break; + case 6: + decoder->private_->frame.header.bits_per_sample = 24; + break; + case 3: + case 7: + is_unparseable = true; + break; + default: + FLAC__ASSERT(0); + break; + } + + /* check to make sure that reserved bit is 0 */ + if (raw_header[3] & 0x01) { /* MAGIC NUMBER */ + is_unparseable = true; + } + + /* read the frame's starting sample number (or frame number as the case may be) */ + if ( + raw_header[1] & 0x01 || + /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ + (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) + ) { /* variable blocksize */ + if (!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) { + return false; /* read_callback_ sets the state for us */ + } + if (xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len - 1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + decoder->private_->frame.header.number.sample_number = xx; + } else { /* fixed blocksize */ + if (!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) { + return false; /* read_callback_ sets the state for us */ + } + if (x == 0xffffffff) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len - 1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + decoder->private_->frame.header.number.frame_number = x; + } + + if (blocksize_hint) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + raw_header[raw_header_len++] = (FLAC__byte)x; + if (blocksize_hint == 7) { + FLAC__uint32 _x; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + decoder->private_->frame.header.blocksize = x + 1; + } + + if (sample_rate_hint) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + raw_header[raw_header_len++] = (FLAC__byte)x; + if (sample_rate_hint != 12) { + FLAC__uint32 _x; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + if (sample_rate_hint == 12) { + decoder->private_->frame.header.sample_rate = x * 1000; + } else if (sample_rate_hint == 13) { + decoder->private_->frame.header.sample_rate = x; + } else { + decoder->private_->frame.header.sample_rate = x * 10; + } + } + + /* read the CRC-8 byte */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { + return false; /* read_callback_ sets the state for us */ + } + crc8 = (FLAC__byte)x; + + if (FLAC__crc8(raw_header, raw_header_len) != crc8) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* calculate the sample number from the frame number if needed */ + decoder->private_->next_fixed_block_size = 0; + if (decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + x = decoder->private_->frame.header.number.frame_number; + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + if (decoder->private_->fixed_block_size) { + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; + } else if (decoder->private_->has_stream_info) { + if (decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; + decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; + } else { + is_unparseable = true; + } + } else if (x == 0) { + decoder->private_->frame.header.number.sample_number = 0; + decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; + } else { + /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; + } + } + + if (is_unparseable) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + return true; +} + +FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) { + FLAC__uint32 x; + FLAC__bool wasted_bits; + uint32_t i; + + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) { /* MAGIC NUMBER */ + return false; /* read_callback_ sets the state for us */ + } + + wasted_bits = (x & 1); + x &= 0xfe; + + if (wasted_bits) { + uint32_t u; + if (!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) { + return false; /* read_callback_ sets the state for us */ + } + decoder->private_->frame.subframes[channel].wasted_bits = u + 1; + if (decoder->private_->frame.subframes[channel].wasted_bits >= bps) { + return false; + } + bps -= decoder->private_->frame.subframes[channel].wasted_bits; + } else { + decoder->private_->frame.subframes[channel].wasted_bits = 0; + } + + /* + Lots of magic numbers here + */ + if (x & 0x80) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } else if (x == 0) { + if (!read_subframe_constant_(decoder, channel, bps, do_full_decode)) { + return false; + } + } else if (x == 2) { + if (!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) { + return false; + } + } else if (x < 16) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } else if (x <= 24) { + if (!read_subframe_fixed_(decoder, channel, bps, (x >> 1) & 7, do_full_decode)) { + return false; + } + if (decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) { /* means bad sync or got corruption */ + return true; + } + } else if (x < 64) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } else { + if (!read_subframe_lpc_(decoder, channel, bps, ((x >> 1) & 31) + 1, do_full_decode)) { + return false; + } + if (decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) { /* means bad sync or got corruption */ + return true; + } + } + + if (wasted_bits && do_full_decode) { + x = decoder->private_->frame.subframes[channel].wasted_bits; + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { + uint32_t val = decoder->private_->output[channel][i]; + decoder->private_->output[channel][i] = (val << x); + } + } + + return true; +} + +FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) { + FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; + FLAC__int32 x; + uint32_t i; + FLAC__int32 *output = decoder->private_->output[channel]; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; + + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) { + return false; /* read_callback_ sets the state for us */ + } + + subframe->value = x; + + /* decode the subframe */ + if (do_full_decode) { + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { + output[i] = x; + } + } + + return true; +} + +FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode) { + FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; + FLAC__int32 i32; + FLAC__uint32 u32; + uint32_t u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for (u = 0; u < order; u++) { + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) { + return false; /* read_callback_ sets the state for us */ + } + subframe->warmup[u] = i32; + } + + /* read entropy coding method info */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch (subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (decoder->private_->frame.header.blocksize >> u32 < order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch (subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if (!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) { + return false; + } + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if (do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize - order, order, decoder->private_->output[channel] + order); + } + + return true; +} + +FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode) { + FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; + FLAC__int32 i32; + FLAC__uint32 u32; + uint32_t u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for (u = 0; u < order; u++) { + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) { + return false; /* read_callback_ sets the state for us */ + } + subframe->warmup[u] = i32; + } + + /* read qlp coeff precision */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->qlp_coeff_precision = u32 + 1; + + /* read qlp shift */ + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (i32 < 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->quantization_level = i32; + + /* read quantized lp coefficiencts */ + for (u = 0; u < order; u++) { + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) { + return false; /* read_callback_ sets the state for us */ + } + subframe->qlp_coeff[u] = i32; + } + + /* read entropy coding method info */ + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch (subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + if (decoder->private_->frame.header.blocksize >> u32 < order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch (subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if (!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) { + return false; + } + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if (do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + if (bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if (bps <= 16 && subframe->qlp_coeff_precision <= 16) { + decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize - order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel] + order); + } else { + decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize - order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel] + order); + } else { + decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize - order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel] + order); + } + } + + return true; +} + +FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode) { + FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; + FLAC__int32 x, *residual = decoder->private_->residual[channel]; + uint32_t i; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data = residual; + + for (i = 0; i < decoder->private_->frame.header.blocksize; i++) { + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) { + return false; /* read_callback_ sets the state for us */ + } + residual[i] = x; + } + + /* decode the subframe */ + if (do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + } + + return true; +} + +FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_t predictor_order, uint32_t partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) { + FLAC__uint32 rice_parameter; + int i; + uint32_t partition, sample, u; + const uint32_t partitions = 1u << partition_order; + const uint32_t partition_samples = partition_order > 0 ? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; + const uint32_t plen = is_extended ? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const uint32_t pesc = is_extended ? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + /* invalid predictor and partition orders mush be handled in the callers */ + FLAC__ASSERT(partition_order > 0 ? partition_samples >= predictor_order : decoder->private_->frame.header.blocksize >= predictor_order); + + if (!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + sample = 0; + for (partition = 0; partition < partitions; partition++) { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) { + return false; /* read_callback_ sets the state for us */ + } + partitioned_rice_contents->parameters[partition] = rice_parameter; + if (rice_parameter < pesc) { + partitioned_rice_contents->raw_bits[partition] = 0; + u = (partition_order == 0 || partition > 0) ? partition_samples : partition_samples - predictor_order; + if (!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, (int *)(residual + sample), u, rice_parameter)) { + return false; /* read_callback_ sets the state for us */ + } + sample += u; + } else { + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) { + return false; /* read_callback_ sets the state for us */ + } + partitioned_rice_contents->raw_bits[partition] = rice_parameter; + for (u = (partition_order == 0 || partition > 0) ? 0 : predictor_order; u < partition_samples; u++, sample++) { + if (!FLAC__bitreader_read_raw_int32(decoder->private_->input, (FLAC__int32 *)&i, rice_parameter)) { + return false; /* read_callback_ sets the state for us */ + } + residual[sample] = i; + } + } + } + + return true; +} + +FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) { + if (!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + FLAC__uint32 zero = 0; + if (!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) { + return false; /* read_callback_ sets the state for us */ + } + if (zero != 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + } + return true; +} + +FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) { + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; + + if ( #if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && #endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) { - *bytes = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else if(*bytes > 0) { - /* While seeking, it is possible for our seek to land in the - * middle of audio data that looks exactly like a frame header - * from a future version of an encoder. When that happens, our - * error callback will get an - * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its - * unparseable_frame_count. But there is a remote possibility - * that it is properly synced at such a "future-codec frame", - * so to make sure, we wait to see many "unparseable" errors in - * a row before bailing out. - */ - if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else { - const FLAC__StreamDecoderReadStatus status = + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) { + *bytes = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } else if (*bytes > 0) { + /* While seeking, it is possible for our seek to land in the + middle of audio data that looks exactly like a frame header + from a future version of an encoder. When that happens, our + error callback will get an + FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its + unparseable_frame_count. But there is a remote possibility + that it is properly synced at such a "future-codec frame", + so to make sure, we wait to see many "unparsable" errors in + a row before bailing out. + */ + if (decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } else { + const FLAC__StreamDecoderReadStatus status = #if FLAC__HAS_OGG - decoder->private_->is_ogg? - read_callback_ogg_aspect_(decoder, buffer, bytes) : + decoder->private_->is_ogg ? + read_callback_ogg_aspect_(decoder, buffer, bytes) : #endif - decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) - ; - if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else if(*bytes == 0) { - if( - status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || - ( + decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) + ; + if (status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } else if (*bytes == 0) { + if ( + status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || + ( #if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && #endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) - ) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else - return true; - } - else - return true; - } - } - else { - /* abort to avoid a deadlock */ - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around - * for Ogg FLAC. This is because the ogg decoder aspect can lose sync - * and at the same time hit the end of the stream (for example, seeking - * to a point that is after the beginning of the last Ogg page). There - * is no way to report an Ogg sync loss through the callbacks (see note - * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. - * So to keep the decoder from stopping at this point we gate the call - * to the eof_callback and let the Ogg decoder aspect set the - * end-of-stream state when it is needed. - */ + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) + ) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } else { + return true; + } + } else { + return true; + } + } + } else { + /* abort to avoid a deadlock */ + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around + for Ogg FLAC. This is because the ogg decoder aspect can lose sync + and at the same time hit the end of the stream (for example, seeking + to a point that is after the beginning of the last Ogg page). There + is no way to report an Ogg sync loss through the callbacks (see note + in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. + So to keep the decoder from stopping at this point we gate the call + to the eof_callback and let the Ogg decoder aspect set the + end-of-stream state when it is needed. + */ } #if FLAC__HAS_OGG -FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) -{ - switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - /* we don't really have a way to handle lost sync via read - * callback so we'll let it pass and let the underlying - * FLAC decoder catch the error - */ - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - default: - FLAC__ASSERT(0); - /* double protection */ - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } -} - -FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; - - switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { - case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; - case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; - case FLAC__STREAM_DECODER_READ_STATUS_ABORT: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - default: - /* double protection: */ - FLAC__ASSERT(0); - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - } +FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) { + switch (FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /* we don't really have a way to handle lost sync via read + callback so we'll let it pass and let the underlying + FLAC decoder catch the error + */ + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + default: + FLAC__ASSERT(0); + /* double protection */ + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } +} + +FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; + + switch (decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { + case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; + case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; + case FLAC__STREAM_DECODER_READ_STATUS_ABORT: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + default: + /* double protection: */ + FLAC__ASSERT(0); + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + } } #endif -FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) -{ - if(decoder->private_->is_seeking) { - FLAC__uint64 this_frame_sample = frame->header.number.sample_number; - FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; - FLAC__uint64 target_sample = decoder->private_->target_sample; +FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) { + if (decoder->private_->is_seeking) { + FLAC__uint64 this_frame_sample = frame->header.number.sample_number; + FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; + FLAC__uint64 target_sample = decoder->private_->target_sample; - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); #if FLAC__HAS_OGG - decoder->private_->got_a_frame = true; + decoder->private_->got_a_frame = true; #endif - decoder->private_->last_frame = *frame; /* save the frame */ - if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ - uint32_t delta = (uint32_t)(target_sample - this_frame_sample); - /* kick out of seek mode */ - decoder->private_->is_seeking = false; - /* shift out the samples before target_sample */ - if(delta > 0) { - uint32_t channel; - const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; - for(channel = 0; channel < frame->header.channels; channel++) - newbuffer[channel] = buffer[channel] + delta; - decoder->private_->last_frame.header.blocksize -= delta; - decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); - } - else { - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } - } - else { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - } - else { - /* - * If we never got STREAMINFO, turn off MD5 checking to save - * cycles since we don't have a sum to compare to anyway - */ - if(!decoder->private_->has_stream_info) - decoder->private_->do_md5_checking = false; - if(decoder->private_->do_md5_checking) { - if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } -} - -void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) -{ - if(!decoder->private_->is_seeking) - decoder->private_->error_callback(decoder, status, decoder->private_->client_data); - else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) - decoder->private_->unparseable_frame_count++; -} - -FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; - FLAC__int64 pos = -1; - int i; - uint32_t approx_bytes_per_frame; - FLAC__bool first_seek = true; - const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); - const uint32_t min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; - const uint32_t max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; - const uint32_t max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; - const uint32_t min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; - /* take these from the current frame in case they've changed mid-stream */ - uint32_t channels = FLAC__stream_decoder_get_channels(decoder); - uint32_t bps = FLAC__stream_decoder_get_bits_per_sample(decoder); - const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; - - /* use values from stream info if we didn't decode a frame */ - if(channels == 0) - channels = decoder->private_->stream_info.data.stream_info.channels; - if(bps == 0) - bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; - - /* we are just guessing here */ - if(max_framesize > 0) - approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; - /* - * Check if it's a known fixed-blocksize stream. Note that though - * the spec doesn't allow zeroes in the STREAMINFO block, we may - * never get a STREAMINFO block when decoding so the value of - * min_blocksize might be zero. - */ - else if(min_blocksize == max_blocksize && min_blocksize > 0) { - /* note there are no () around 'bps/8' to keep precision up since it's an integer calculation */ - approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; - } - else - approx_bytes_per_frame = 4096 * channels * bps/8 + 64; - - /* - * First, we set an upper and lower bound on where in the - * stream we will search. For now we assume the worst case - * scenario, which is our best guess at the beginning of - * the first frame and end of the stream. - */ - lower_bound = first_frame_offset; - lower_bound_sample = 0; - upper_bound = stream_length; - upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; - - /* - * Now we refine the bounds if we have a seektable with - * suitable points. Note that according to the spec they - * must be ordered by ascending sample number. - * - * Note: to protect against invalid seek tables we will ignore points - * that have frame_samples==0 or sample_number>=total_samples - */ - if(seek_table) { - FLAC__uint64 new_lower_bound = lower_bound; - FLAC__uint64 new_upper_bound = upper_bound; - FLAC__uint64 new_lower_bound_sample = lower_bound_sample; - FLAC__uint64 new_upper_bound_sample = upper_bound_sample; - - /* find the closest seek point <= target_sample, if it exists */ - for(i = (int)seek_table->num_points - 1; i >= 0; i--) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number <= target_sample - ) - break; - } - if(i >= 0) { /* i.e. we found a suitable seek point... */ - new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_lower_bound_sample = seek_table->points[i].sample_number; - } - - /* find the closest seek point > target_sample, if it exists */ - for(i = 0; i < (int)seek_table->num_points; i++) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number > target_sample - ) - break; - } - if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ - new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_upper_bound_sample = seek_table->points[i].sample_number; - } - /* final protection against unsorted seek tables; keep original values if bogus */ - if(new_upper_bound >= new_lower_bound) { - lower_bound = new_lower_bound; - upper_bound = new_upper_bound; - lower_bound_sample = new_lower_bound_sample; - upper_bound_sample = new_upper_bound_sample; - } - } - - FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); - /* there are 2 insidious ways that the following equality occurs, which - * we need to fix: - * 1) total_samples is 0 (unknown) and target_sample is 0 - * 2) total_samples is 0 (unknown) and target_sample happens to be - * exactly equal to the last seek point in the seek table; this - * means there is no seek point above it, and upper_bound_samples - * remains equal to the estimate (of target_samples) we made above - * in either case it does not hurt to move upper_bound_sample up by 1 - */ - if(upper_bound_sample == lower_bound_sample) - upper_bound_sample++; - - decoder->private_->target_sample = target_sample; - while(1) { - /* check if the bounds are still ok */ - if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } + decoder->private_->last_frame = *frame; /* save the frame */ + if (this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ + uint32_t delta = (uint32_t)(target_sample - this_frame_sample); + /* kick out of seek mode */ + decoder->private_->is_seeking = false; + /* shift out the samples before target_sample */ + if (delta > 0) { + uint32_t channel; + const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; + for (channel = 0; channel < frame->header.channels; channel++) { + newbuffer[channel] = buffer[channel] + delta; + } + decoder->private_->last_frame.header.blocksize -= delta; + decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); + } else { + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } + } else { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } + } else { + /* + If we never got STREAMINFO, turn off MD5 checking to save + cycles since we don't have a sum to compare to anyway + */ + if (!decoder->private_->has_stream_info) { + decoder->private_->do_md5_checking = false; + } + if (decoder->private_->do_md5_checking) { + if (!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample + 7) / 8)) { + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + } + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } +} + +void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) { + if (!decoder->private_->is_seeking) { + decoder->private_->error_callback(decoder, status, decoder->private_->client_data); + } else if (status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) { + decoder->private_->unparseable_frame_count++; + } +} + +FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) { + FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; + FLAC__int64 pos = -1; + int i; + uint32_t approx_bytes_per_frame; + FLAC__bool first_seek = true; + const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); + const uint32_t min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; + const uint32_t max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; + const uint32_t max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; + const uint32_t min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; + /* take these from the current frame in case they've changed mid-stream */ + uint32_t channels = FLAC__stream_decoder_get_channels(decoder); + uint32_t bps = FLAC__stream_decoder_get_bits_per_sample(decoder); + const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table ? &decoder->private_->seek_table.data.seek_table : 0; + + /* use values from stream info if we didn't decode a frame */ + if (channels == 0) { + channels = decoder->private_->stream_info.data.stream_info.channels; + } + if (bps == 0) { + bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; + } + + /* we are just guessing here */ + if (max_framesize > 0) { + approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; + } + /* + Check if it's a known fixed-blocksize stream. Note that though + the spec doesn't allow zeroes in the STREAMINFO block, we may + never get a STREAMINFO block when decoding so the value of + min_blocksize might be zero. + */ + else if (min_blocksize == max_blocksize && min_blocksize > 0) { + /* note there are no () around 'bps/8' to keep precision up since it's an integer calculation */ + approx_bytes_per_frame = min_blocksize * channels * bps / 8 + 64; + } else { + approx_bytes_per_frame = 4096 * channels * bps / 8 + 64; + } + + /* + First, we set an upper and lower bound on where in the + stream we will search. For now we assume the worst case + scenario, which is our best guess at the beginning of + the first frame and end of the stream. + */ + lower_bound = first_frame_offset; + lower_bound_sample = 0; + upper_bound = stream_length; + upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; + + /* + Now we refine the bounds if we have a seektable with + suitable points. Note that according to the spec they + must be ordered by ascending sample number. + + Note: to protect against invalid seek tables we will ignore points + that have frame_samples==0 or sample_number>=total_samples + */ + if (seek_table) { + FLAC__uint64 new_lower_bound = lower_bound; + FLAC__uint64 new_upper_bound = upper_bound; + FLAC__uint64 new_lower_bound_sample = lower_bound_sample; + FLAC__uint64 new_upper_bound_sample = upper_bound_sample; + + /* find the closest seek point <= target_sample, if it exists */ + for (i = (int)seek_table->num_points - 1; i >= 0; i--) { + if ( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number <= target_sample + ) { + break; + } + } + if (i >= 0) { /* i.e. we found a suitable seek point... */ + new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_lower_bound_sample = seek_table->points[i].sample_number; + } + + /* find the closest seek point > target_sample, if it exists */ + for (i = 0; i < (int)seek_table->num_points; i++) { + if ( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number > target_sample + ) { + break; + } + } + if (i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ + new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_upper_bound_sample = seek_table->points[i].sample_number; + } + /* final protection against unsorted seek tables; keep original values if bogus */ + if (new_upper_bound >= new_lower_bound) { + lower_bound = new_lower_bound; + upper_bound = new_upper_bound; + lower_bound_sample = new_lower_bound_sample; + upper_bound_sample = new_upper_bound_sample; + } + } + + FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); + /* there are 2 insidious ways that the following equality occurs, which + we need to fix: + 1) total_samples is 0 (unknown) and target_sample is 0 + 2) total_samples is 0 (unknown) and target_sample happens to be + exactly equal to the last seek point in the seek table; this + means there is no seek point above it, and upper_bound_samples + remains equal to the estimate (of target_samples) we made above + in either case it does not hurt to move upper_bound_sample up by 1 + */ + if (upper_bound_sample == lower_bound_sample) { + upper_bound_sample++; + } + + decoder->private_->target_sample = target_sample; + while (1) { + /* check if the bounds are still ok */ + if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } #ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__int64)lower_bound + (FLAC__int64)((double)(target_sample - lower_bound_sample) / (double)(upper_bound_sample - lower_bound_sample) * (double)(upper_bound - lower_bound)) - approx_bytes_per_frame; + pos = (FLAC__int64)lower_bound + (FLAC__int64)((double)(target_sample - lower_bound_sample) / (double)(upper_bound_sample - lower_bound_sample) * (double)(upper_bound - lower_bound)) - approx_bytes_per_frame; #else - /* a little less accurate: */ - if(upper_bound - lower_bound < 0xffffffff) - pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; + /* a little less accurate: */ + if (upper_bound - lower_bound < 0xffffffff) { + pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; + } else { /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample) >> 8) * ((upper_bound - lower_bound) >> 8)) / ((upper_bound_sample - lower_bound_sample) >> 16)) - approx_bytes_per_frame; + } #endif - if(pos >= (FLAC__int64)upper_bound) - pos = (FLAC__int64)upper_bound - 1; - if(pos < (FLAC__int64)lower_bound) - pos = (FLAC__int64)lower_bound; - if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - /* Now we need to get a frame. First we need to reset our - * unparseable_frame_count; if we get too many unparseable - * frames in a row, the read callback will return - * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing - * FLAC__stream_decoder_process_single() to return false. - */ - decoder->private_->unparseable_frame_count = 0; - if(!FLAC__stream_decoder_process_single(decoder) || - decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our write callback will change the state when it gets to the target frame */ - /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ + if (pos >= (FLAC__int64)upper_bound) { + pos = (FLAC__int64)upper_bound - 1; + } + if (pos < (FLAC__int64)lower_bound) { + pos = (FLAC__int64)lower_bound; + } + if (decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if (!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + /* Now we need to get a frame. First we need to reset our + unparseable_frame_count; if we get too many unparsable + frames in a row, the read callback will return + FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing + FLAC__stream_decoder_process_single() to return false. + */ + decoder->private_->unparseable_frame_count = 0; + if (!FLAC__stream_decoder_process_single(decoder) || + decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our write callback will change the state when it gets to the target frame */ + /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ #if 0 - /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ - if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) - break; + /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ + if (decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) { + break; + } #endif - if(!decoder->private_->is_seeking) - break; - - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - - if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { - if (pos == (FLAC__int64)lower_bound) { - /* can't move back any more than the first frame, something is fatally wrong */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our last move backwards wasn't big enough, try again */ - approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; - continue; - } - /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ - first_seek = false; - - /* make sure we are not seeking in corrupted stream */ - if (this_frame_sample < lower_bound_sample) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - - /* we need to narrow the search */ - if(target_sample < this_frame_sample) { - upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; -/*@@@@@@ what will decode position be if at end of stream? */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (uint32_t)(2 * (upper_bound - pos) / 3 + 16); - } - else { /* target_sample >= this_frame_sample + this frame's blocksize */ - lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; - if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (uint32_t)(2 * (lower_bound - pos) / 3 + 16); - } - } - - return true; + if (!decoder->private_->is_seeking) { + break; + } + + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + + if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { + if (pos == (FLAC__int64)lower_bound) { + /* can't move back any more than the first frame, something is fatally wrong */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our last move backwards wasn't big enough, try again */ + approx_bytes_per_frame = approx_bytes_per_frame ? approx_bytes_per_frame * 2 : 16; + continue; + } + /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ + first_seek = false; + + /* make sure we are not seeking in corrupted stream */ + if (this_frame_sample < lower_bound_sample) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + + /* we need to narrow the search */ + if (target_sample < this_frame_sample) { + upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; + /*@@@@@@ what will decode position be if at end of stream? */ + if (!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (uint32_t)(2 * (upper_bound - pos) / 3 + 16); + } else { /* target_sample >= this_frame_sample + this frame's blocksize */ + lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; + if (!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (uint32_t)(2 * (lower_bound - pos) / 3 + 16); + } + } + + return true; } #if FLAC__HAS_OGG -FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 left_pos = 0, right_pos = stream_length; - FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); - FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; - FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ - FLAC__bool did_a_seek; - uint32_t iteration = 0; - - /* In the first iterations, we will calculate the target byte position - * by the distance from the target sample to left_sample and - * right_sample (let's call it "proportional search"). After that, we - * will switch to binary search. - */ - uint32_t BINARY_SEARCH_AFTER_ITERATION = 2; - - /* We will switch to a linear search once our current sample is less - * than this number of samples ahead of the target sample - */ - static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; - - /* If the total number of samples is unknown, use a large value, and - * force binary search immediately. - */ - if(right_sample == 0) { - right_sample = (FLAC__uint64)(-1); - BINARY_SEARCH_AFTER_ITERATION = 0; - } - - decoder->private_->target_sample = target_sample; - for( ; ; iteration++) { - if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { - if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { - pos = (right_pos + left_pos) / 2; - } - else { +FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) { + FLAC__uint64 left_pos = 0, right_pos = stream_length; + FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); + FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; + FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ + FLAC__bool did_a_seek; + uint32_t iteration = 0; + + /* In the first iterations, we will calculate the target byte position + by the distance from the target sample to left_sample and + right_sample (let's call it "proportional search"). After that, we + will switch to binary search. + */ + uint32_t BINARY_SEARCH_AFTER_ITERATION = 2; + + /* We will switch to a linear search once our current sample is less + than this number of samples ahead of the target sample + */ + static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; + + /* If the total number of samples is unknown, use a large value, and + force binary search immediately. + */ + if (right_sample == 0) { + right_sample = (FLAC__uint64)(-1); + BINARY_SEARCH_AFTER_ITERATION = 0; + } + + decoder->private_->target_sample = target_sample; + for (; ; iteration++) { + if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { + if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { + pos = (right_pos + left_pos) / 2; + } else { #ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__uint64)((double)(target_sample - left_sample) / (double)(right_sample - left_sample) * (double)(right_pos - left_pos)); + pos = (FLAC__uint64)((double)(target_sample - left_sample) / (double)(right_sample - left_sample) * (double)(right_pos - left_pos)); #else - /* a little less accurate: */ - if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) - pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); + /* a little less accurate: */ + if ((target_sample - left_sample <= 0xffffffff) && (right_pos - left_pos <= 0xffffffff)) { + pos = (FLAC__int64)(((target_sample - left_sample) * (right_pos - left_pos)) / (right_sample - left_sample)); + } else { /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)((((target_sample - left_sample) >> 8) * ((right_pos - left_pos) >> 8)) / ((right_sample - left_sample) >> 16)); + } #endif - /* @@@ TODO: might want to limit pos to some distance - * before EOF, to make sure we land before the last frame, - * thereby getting a this_frame_sample and so having a better - * estimate. - */ - } - - /* physical seek */ - if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - did_a_seek = true; - } - else - did_a_seek = false; - - decoder->private_->got_a_frame = false; - if(!FLAC__stream_decoder_process_single(decoder) || - decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!decoder->private_->got_a_frame) { - if(did_a_seek) { - /* this can happen if we seek to a point after the last frame; we drop - * to binary search right away in this case to avoid any wasted - * iterations of proportional search. - */ - right_pos = pos; - BINARY_SEARCH_AFTER_ITERATION = 0; - } - else { - /* this can probably only happen if total_samples is unknown and the - * target_sample is past the end of the stream - */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - } - /* our write callback will change the state when it gets to the target frame */ - else if(!decoder->private_->is_seeking) { - break; - } - else { - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - - if (did_a_seek) { - if (this_frame_sample <= target_sample) { - /* The 'equal' case should not happen, since - * FLAC__stream_decoder_process_single() - * should recognize that it has hit the - * target sample and we would exit through - * the 'break' above. - */ - FLAC__ASSERT(this_frame_sample != target_sample); - - left_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (left_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - left_pos = pos; - } - else { - right_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (right_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - right_pos = pos; - } - } - } - } - - return true; + /* @@@ TODO: might want to limit pos to some distance + before EOF, to make sure we land before the last frame, + thereby getting a this_frame_sample and so having a better + estimate. + */ + } + + /* physical seek */ + if (decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if (!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + did_a_seek = true; + } else { + did_a_seek = false; + } + + decoder->private_->got_a_frame = false; + if (!FLAC__stream_decoder_process_single(decoder) || + decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if (!decoder->private_->got_a_frame) { + if (did_a_seek) { + /* this can happen if we seek to a point after the last frame; we drop + to binary search right away in this case to avoid any wasted + iterations of proportional search. + */ + right_pos = pos; + BINARY_SEARCH_AFTER_ITERATION = 0; + } else { + /* this can probably only happen if total_samples is unknown and the + target_sample is past the end of the stream + */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + } + /* our write callback will change the state when it gets to the target frame */ + else if (!decoder->private_->is_seeking) { + break; + } else { + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + + if (did_a_seek) { + if (this_frame_sample <= target_sample) { + /* The 'equal' case should not happen, since + FLAC__stream_decoder_process_single() + should recognize that it has hit the + target sample and we would exit through + the 'break' above. + */ + FLAC__ASSERT(this_frame_sample != target_sample); + + left_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (left_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + left_pos = pos; + } else { + right_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (right_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + right_pos = pos; + } + } + } + } + + return true; } #endif #if 0 -FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - if(*bytes > 0) { - *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); - if(ferror(decoder->private_->file)) - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - else if(*bytes == 0) - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - else - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - else - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ -} - -FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) - return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; -} - -FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t pos; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - else if((pos = ftello(decoder->private_->file)) < 0) - return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - else { - *absolute_byte_offset = (FLAC__uint64)pos; - return FLAC__STREAM_DECODER_TELL_STATUS_OK; - } -} - -FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) -{ - struct flac_stat_s filestats; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - else if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0) - return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - else { - *stream_length = (FLAC__uint64)filestats.st_size; - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - } -} - -FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) -{ - (void)client_data; - - return feof(decoder->private_->file)? true : false; +FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { + (void)client_data; + + if (*bytes > 0) { + *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); + if (ferror(decoder->private_->file)) { + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } else if (*bytes == 0) { + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } else { + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + } else { + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ + } +} + +FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { + (void)client_data; + + if (decoder->private_->file == stdin) { + return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + } else if (fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) { + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + } else { + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + } +} + +FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { + FLAC__off_t pos; + (void)client_data; + + if (decoder->private_->file == stdin) { + return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + } else if ((pos = ftello(decoder->private_->file)) < 0) { + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + } else { + *absolute_byte_offset = (FLAC__uint64)pos; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } +} + +FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) { + struct flac_stat_s filestats; + (void)client_data; + + if (decoder->private_->file == stdin) { + return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + } else if (flac_fstat(fileno(decoder->private_->file), &filestats) != 0) { + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + } else { + *stream_length = (FLAC__uint64)filestats.st_size; + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } +} + +FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) { + (void)client_data; + + return feof(decoder->private_->file) ? true : false; } #endif -FLAC_API const void *FLAC__get_decoder_client_data(FLAC__StreamDecoder *decoder) -{ - return decoder->private_->client_data; +FLAC_API const void *FLAC__get_decoder_client_data(FLAC__StreamDecoder *decoder) { + return decoder->private_->client_data; } diff --git a/src/libflac/window.c b/src/libflac/window.c index 397f7b16..96c7549a 100644 --- a/src/libflac/window.c +++ b/src/libflac/window.c @@ -1,34 +1,34 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2016 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``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 FOUNDATION OR - * CONTRIBUTORS 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. - */ +/* libFLAC - Free Lossless Audio Codec library + Copyright (C) 2006-2009 Josh Coalson + Copyright (C) 2011-2016 Xiph.Org Foundation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 FOUNDATION OR + CONTRIBUTORS 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 HAVE_CONFIG_H # include "config.h" @@ -45,240 +45,250 @@ #ifndef FLAC__INTEGER_ONLY_LIBRARY -void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - if (L & 1) { - for (n = 0; n <= N/2; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } - else { - for (n = 0; n <= L/2-1; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } +void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + if (L & 1) { + for (n = 0; n <= N / 2; n++) { + window[n] = 2.0f * n / (float)N; + } + for (; n <= N; n++) { + window[n] = 2.0f - 2.0f * n / (float)N; + } + } else { + for (n = 0; n <= L / 2 - 1; n++) { + window[n] = 2.0f * n / (float)N; + } + for (; n <= N; n++) { + window[n] = 2.0f - 2.0f * n / (float)N; + } + } } -void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.62f - 0.48f * fabsf((float)n/(float)N-0.5f) - 0.38f * cosf(2.0f * M_PI * ((float)n/(float)N))); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.62f - 0.48f * fabsf((float)n / (float)N - 0.5f) - 0.38f * cosf(2.0f * M_PI * ((float)n / (float)N))); + } } -void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.42f - 0.5f * cosf(2.0f * M_PI * n / N) + 0.08f * cosf(4.0f * M_PI * n / N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.42f - 0.5f * cosf(2.0f * M_PI * n / N) + 0.08f * cosf(4.0f * M_PI * n / N)); + } } /* 4-term -92dB side-lobe */ -void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n <= N; n++) - window[n] = (FLAC__real)(0.35875f - 0.48829f * cosf(2.0f * M_PI * n / N) + 0.14128f * cosf(4.0f * M_PI * n / N) - 0.01168f * cosf(6.0f * M_PI * n / N)); + for (n = 0; n <= N; n++) { + window[n] = (FLAC__real)(0.35875f - 0.48829f * cosf(2.0f * M_PI * n / N) + 0.14128f * cosf(4.0f * M_PI * n / N) - 0.01168f * cosf(6.0f * M_PI * n / N)); + } } -void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - double k = ((double)n - N2) / N2; - k = 1.0f - k * k; - window[n] = (FLAC__real)(k * k); - } +void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + double k = ((double)n - N2) / N2; + k = 1.0f - k * k; + window[n] = (FLAC__real)(k * k); + } } -void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.21557895f - 0.41663158f * cosf(2.0f * M_PI * n / N) + 0.277263158f * cosf(4.0f * M_PI * n / N) - 0.083578947f * cosf(6.0f * M_PI * n / N) + 0.006947368f * cosf(8.0f * M_PI * n / N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.21557895f - 0.41663158f * cosf(2.0f * M_PI * n / N) + 0.277263158f * cosf(4.0f * M_PI * n / N) - 0.083578947f * cosf(6.0f * M_PI * n / N) + 0.006947368f * cosf(8.0f * M_PI * n / N)); + } } -void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; +void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) { + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / (stddev * N2); - window[n] = (FLAC__real)exp(-0.5f * k * k); - } + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / (stddev * N2); + window[n] = (FLAC__real)exp(-0.5f * k * k); + } } -void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.54f - 0.46f * cosf(2.0f * M_PI * n / N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.54f - 0.46f * cosf(2.0f * M_PI * n / N)); + } } -void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(2.0f * M_PI * n / N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(2.0f * M_PI * n / N)); + } } -void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.402f - 0.498f * cosf(2.0f * M_PI * n / N) + 0.098f * cosf(4.0f * M_PI * n / N) - 0.001f * cosf(6.0f * M_PI * n / N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.402f - 0.498f * cosf(2.0f * M_PI * n / N) + 0.098f * cosf(4.0f * M_PI * n / N) - 0.001f * cosf(6.0f * M_PI * n / N)); + } } -void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; +void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.3635819f - 0.4891775f*cosf(2.0f*M_PI*n/N) + 0.1365995f*cosf(4.0f*M_PI*n/N) - 0.0106411f*cosf(6.0f*M_PI*n/N)); + for (n = 0; n < L; n++) { + window[n] = (FLAC__real)(0.3635819f - 0.4891775f * cosf(2.0f * M_PI * n / N) + 0.1365995f * cosf(4.0f * M_PI * n / N) - 0.0106411f * cosf(6.0f * M_PI * n / N)); + } } -void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; +void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) { + FLAC__int32 n; - for (n = 0; n < L; n++) - window[n] = 1.0f; + for (n = 0; n < L; n++) { + window[n] = 1.0f; + } } -void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; - - if (L & 1) { - for (n = 1; n <= (L+1)/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } - else { - for (n = 1; n <= L/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } +void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) { + FLAC__int32 n; + + if (L & 1) { + for (n = 1; n <= (L + 1) / 2; n++) { + window[n - 1] = 2.0f * n / ((float)L + 1.0f); + } + for (; n <= L; n++) { + window[n - 1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); + } + } else { + for (n = 1; n <= L / 2; n++) { + window[n - 1] = 2.0f * n / ((float)L + 1.0f); + } + for (; n <= L; n++) { + window[n - 1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); + } + } } -void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) -{ - if (p <= 0.0) - FLAC__window_rectangle(window, L); - else if (p >= 1.0) - FLAC__window_hann(window, L); - else { - const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; - FLAC__int32 n; - /* start with rectangle... */ - FLAC__window_rectangle(window, L); - /* ...replace ends with hann */ - if (Np > 0) { - for (n = 0; n <= Np; n++) { - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * n / Np)); - window[L-Np-1+n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * (n+Np) / Np)); - } - } - } +void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) { + if (p <= 0.0) { + FLAC__window_rectangle(window, L); + } else if (p >= 1.0) { + FLAC__window_hann(window, L); + } else { + const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; + FLAC__int32 n; + /* start with rectangle... */ + FLAC__window_rectangle(window, L); + /* ...replace ends with hann */ + if (Np > 0) { + for (n = 0; n <= Np; n++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * n / Np)); + window[L - Np - 1 + n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * (n + Np) / Np)); + } + } + } } -void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - const FLAC__int32 N = end_n - start_n; - FLAC__int32 Np, n, i; - - if (p <= 0.0f) - FLAC__window_partial_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_partial_tukey(window, L, 0.95f, start, end); - else { - - Np = (FLAC__int32)(p / 2.0f * N); - - for (n = 0; n < start_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < (start_n+Np) && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Np)); - for (; n < (end_n-Np) && n < L; n++) - window[n] = 1.0f; - for (i = Np; n < end_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Np)); - for (; n < L; n++) - window[n] = 0.0f; - } +void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) { + const FLAC__int32 start_n = (FLAC__int32)(start * L); + const FLAC__int32 end_n = (FLAC__int32)(end * L); + const FLAC__int32 N = end_n - start_n; + FLAC__int32 Np, n, i; + + if (p <= 0.0f) { + FLAC__window_partial_tukey(window, L, 0.05f, start, end); + } else if (p >= 1.0f) { + FLAC__window_partial_tukey(window, L, 0.95f, start, end); + } else { + + Np = (FLAC__int32)(p / 2.0f * N); + + for (n = 0; n < start_n && n < L; n++) { + window[n] = 0.0f; + } + for (i = 1; n < (start_n + Np) && n < L; n++, i++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Np)); + } + for (; n < (end_n - Np) && n < L; n++) { + window[n] = 1.0f; + } + for (i = Np; n < end_n && n < L; n++, i--) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Np)); + } + for (; n < L; n++) { + window[n] = 0.0f; + } + } } -void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - FLAC__int32 Ns, Ne, n, i; - - if (p <= 0.0f) - FLAC__window_punchout_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_punchout_tukey(window, L, 0.95f, start, end); - else { - - Ns = (FLAC__int32)(p / 2.0f * start_n); - Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); - - for (n = 0, i = 1; n < Ns && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ns)); - for (; n < start_n-Ns && n < L; n++) - window[n] = 1.0f; - for (i = Ns; n < start_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ns)); - for (; n < end_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < end_n+Ne && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ne)); - for (; n < L - (Ne) && n < L; n++) - window[n] = 1.0f; - for (i = Ne; n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ne)); - } +void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) { + const FLAC__int32 start_n = (FLAC__int32)(start * L); + const FLAC__int32 end_n = (FLAC__int32)(end * L); + FLAC__int32 Ns, Ne, n, i; + + if (p <= 0.0f) { + FLAC__window_punchout_tukey(window, L, 0.05f, start, end); + } else if (p >= 1.0f) { + FLAC__window_punchout_tukey(window, L, 0.95f, start, end); + } else { + + Ns = (FLAC__int32)(p / 2.0f * start_n); + Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); + + for (n = 0, i = 1; n < Ns && n < L; n++, i++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ns)); + } + for (; n < start_n - Ns && n < L; n++) { + window[n] = 1.0f; + } + for (i = Ns; n < start_n && n < L; n++, i--) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ns)); + } + for (; n < end_n && n < L; n++) { + window[n] = 0.0f; + } + for (i = 1; n < end_n + Ne && n < L; n++, i++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ne)); + } + for (; n < L - (Ne) && n < L; n++) { + window[n] = 1.0f; + } + for (i = Ne; n < L; n++, i--) { + window[n] = (FLAC__real)(0.5f - 0.5f * cosf(M_PI * i / Ne)); + } + } } -void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; +void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) { + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / N2; - window[n] = (FLAC__real)(1.0f - k * k); - } + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / N2; + window[n] = (FLAC__real)(1.0f - k * k); + } } #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/src/libhelix-aac/aaccommon.h b/src/libhelix-aac/aaccommon.h index 804337cd..462f1046 100644 --- a/src/libhelix-aac/aaccommon.h +++ b/src/libhelix-aac/aaccommon.h @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: aaccommon.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: aaccommon.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * aaccommon.h - implementation-independent API's, datatypes, and definitions + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + aaccommon.h - implementation-independent API's, datatypes, and definitions **************************************************************************************/ #ifndef _AACCOMMON_H @@ -51,7 +51,7 @@ // Can't fit in ESP8266 RAM #ifndef ESP8266 - #define AAC_ENABLE_SBR 1 +#define AAC_ENABLE_SBR 1 #endif #pragma GCC optimize ("O3") @@ -98,60 +98,60 @@ /* AAC file format */ enum { - AAC_FF_Unknown = 0, /* should be 0 on init */ + AAC_FF_Unknown = 0, /* should be 0 on init */ - AAC_FF_ADTS = 1, - AAC_FF_ADIF = 2, - AAC_FF_RAW = 3 + AAC_FF_ADTS = 1, + AAC_FF_ADIF = 2, + AAC_FF_RAW = 3 }; /* syntactic element type */ enum { - AAC_ID_INVALID = -1, - - AAC_ID_SCE = 0, - AAC_ID_CPE = 1, - AAC_ID_CCE = 2, - AAC_ID_LFE = 3, - AAC_ID_DSE = 4, - AAC_ID_PCE = 5, - AAC_ID_FIL = 6, - AAC_ID_END = 7 + AAC_ID_INVALID = -1, + + AAC_ID_SCE = 0, + AAC_ID_CPE = 1, + AAC_ID_CCE = 2, + AAC_ID_LFE = 3, + AAC_ID_DSE = 4, + AAC_ID_PCE = 5, + AAC_ID_FIL = 6, + AAC_ID_END = 7 }; typedef struct _AACDecInfo { - /* pointers to platform-specific state information */ - void *psInfoBase; /* baseline MPEG-4 LC decoding */ - void *psInfoSBR; /* MPEG-4 SBR decoding */ - - /* raw decoded data, before rounding to 16-bit PCM (for postprocessing such as SBR) */ - void *rawSampleBuf[AAC_MAX_NCHANS]; - int rawSampleBytes; - int rawSampleFBits; - - /* fill data (can be used for processing SBR or other extensions) */ - unsigned char *fillBuf; - int fillCount; - int fillExtType; - - /* block information */ - int prevBlockID; - int currBlockID; - int currInstTag; - int sbDeinterleaveReqd[MAX_NCHANS_ELEM]; - int adtsBlocksLeft; - - /* user-accessible info */ - int bitRate; - int nChans; - int sampRate; - int profile; - int format; - int sbrEnabled; - int tnsUsed; - int pnsUsed; - int frameCount; + /* pointers to platform-specific state information */ + void *psInfoBase; /* baseline MPEG-4 LC decoding */ + void *psInfoSBR; /* MPEG-4 SBR decoding */ + + /* raw decoded data, before rounding to 16-bit PCM (for postprocessing such as SBR) */ + void *rawSampleBuf[AAC_MAX_NCHANS]; + int rawSampleBytes; + int rawSampleFBits; + + /* fill data (can be used for processing SBR or other extensions) */ + unsigned char *fillBuf; + int fillCount; + int fillExtType; + + /* block information */ + int prevBlockID; + int currBlockID; + int currInstTag; + int sbDeinterleaveReqd[MAX_NCHANS_ELEM]; + int adtsBlocksLeft; + + /* user-accessible info */ + int bitRate; + int nChans; + int sampRate; + int profile; + int format; + int sbrEnabled; + int tnsUsed; + int pnsUsed; + int frameCount; } AACDecInfo; @@ -198,10 +198,10 @@ extern const /*short*/ int sfBandTabShort[76]; extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES]; extern const /*short*/ int sfBandTabLong[325]; extern const int tnsMaxBandsShortOffset[AAC_NUM_PROFILES]; -extern const unsigned /*char*/ int tnsMaxBandsShort[2*NUM_SAMPLE_RATES]; +extern const unsigned /*char*/ int tnsMaxBandsShort[2 * NUM_SAMPLE_RATES]; extern const unsigned /*char*/ int tnsMaxOrderShort[AAC_NUM_PROFILES]; extern const int tnsMaxBandsLongOffset[AAC_NUM_PROFILES]; -extern const unsigned /*char*/ int tnsMaxBandsLong[2*NUM_SAMPLE_RATES]; +extern const unsigned /*char*/ int tnsMaxBandsLong[2 * NUM_SAMPLE_RATES]; extern const unsigned /*char*/ int tnsMaxOrderLong[AAC_NUM_PROFILES]; #endif /* _AACCOMMON_H */ diff --git a/src/libhelix-aac/aacdec.c b/src/libhelix-aac/aacdec.c index cb0e5041..56ebed05 100644 --- a/src/libhelix-aac/aacdec.c +++ b/src/libhelix-aac/aacdec.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: aacdec.c,v 1.1 2005/02/26 01:47:31 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: aacdec.c,v 1.1 2005/02/26 01:47:31 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * aacdec.c - platform-independent top level decoder API + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + aacdec.c - platform-independent top level decoder API **************************************************************************************/ #include "aaccommon.h" @@ -51,426 +51,448 @@ #define PROFILE_END() /************************************************************************************** - * Function: AACInitDecoder - * - * Description: allocate memory for platform-specific data - * clear all the user-accessible fields - * initialize SBR decoder if enabled - * - * Inputs: none - * - * Outputs: none - * - * Return: handle to AAC decoder instance, 0 if malloc fails + Function: AACInitDecoder + + Description: allocate memory for platform-specific data + clear all the user-accessible fields + initialize SBR decoder if enabled + + Inputs: none + + Outputs: none + + Return: handle to AAC decoder instance, 0 if malloc fails **************************************************************************************/ -HAACDecoder AACInitDecoder(void) -{ - AACDecInfo *aacDecInfo; +HAACDecoder AACInitDecoder(void) { + AACDecInfo *aacDecInfo; - aacDecInfo = AllocateBuffers(); - if (!aacDecInfo) - return 0; + aacDecInfo = AllocateBuffers(); + if (!aacDecInfo) { + return 0; + } #ifdef AAC_ENABLE_SBR - if (InitSBR(aacDecInfo)) { - AACFreeDecoder(aacDecInfo); - return 0; - } + if (InitSBR(aacDecInfo)) { + AACFreeDecoder(aacDecInfo); + return 0; + } #endif - return (HAACDecoder)aacDecInfo; + return (HAACDecoder)aacDecInfo; } -HAACDecoder AACInitDecoderPre(void *ptr, int sz) -{ - AACDecInfo *aacDecInfo; +HAACDecoder AACInitDecoderPre(void *ptr, int sz) { + AACDecInfo *aacDecInfo; - aacDecInfo = AllocateBuffersPre(&ptr, &sz); - if (!aacDecInfo) - return 0; + aacDecInfo = AllocateBuffersPre(&ptr, &sz); + if (!aacDecInfo) { + return 0; + } #ifdef AAC_ENABLE_SBR - if (InitSBRPre(aacDecInfo, &ptr, &sz)) { - return 0; - } + if (InitSBRPre(aacDecInfo, &ptr, &sz)) { + return 0; + } #endif - return (HAACDecoder)aacDecInfo; + return (HAACDecoder)aacDecInfo; } /************************************************************************************** - * Function: AACFreeDecoder - * - * Description: free platform-specific data allocated by AACInitDecoder - * free SBR decoder if enabled - * - * Inputs: valid AAC decoder instance pointer (HAACDecoder) - * - * Outputs: none - * - * Return: none + Function: AACFreeDecoder + + Description: free platform-specific data allocated by AACInitDecoder + free SBR decoder if enabled + + Inputs: valid AAC decoder instance pointer (HAACDecoder) + + Outputs: none + + Return: none **************************************************************************************/ -void AACFreeDecoder(HAACDecoder hAACDecoder) -{ - AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; +void AACFreeDecoder(HAACDecoder hAACDecoder) { + AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; - if (!aacDecInfo) - return; + if (!aacDecInfo) { + return; + } #ifdef AAC_ENABLE_SBR - FreeSBR(aacDecInfo); + FreeSBR(aacDecInfo); #endif - FreeBuffers(aacDecInfo); + FreeBuffers(aacDecInfo); } /************************************************************************************** - * Function: AACFindSyncWord - * - * Description: locate the next byte-alinged sync word in the raw AAC stream - * - * Inputs: buffer to search for sync word - * max number of bytes to search in buffer - * - * Outputs: none - * - * Return: offset to first sync word (bytes from start of buf) - * -1 if sync not found after searching nBytes + Function: AACFindSyncWord + + Description: locate the next byte-alinged sync word in the raw AAC stream + + Inputs: buffer to search for sync word + max number of bytes to search in buffer + + Outputs: none + + Return: offset to first sync word (bytes from start of buf) + -1 if sync not found after searching nBytes **************************************************************************************/ -int AACFindSyncWord(unsigned char *buf, int nBytes) -{ - int i; - - /* find byte-aligned syncword (12 bits = 0xFFF) */ - for (i = 0; i < nBytes - 1; i++) { - if ( (buf[i+0] & SYNCWORDH) == SYNCWORDH && (buf[i+1] & SYNCWORDL) == SYNCWORDL ) - return i; - } - - return -1; +int AACFindSyncWord(unsigned char *buf, int nBytes) { + int i; + + /* find byte-aligned syncword (12 bits = 0xFFF) */ + for (i = 0; i < nBytes - 1; i++) { + if ((buf[i + 0] & SYNCWORDH) == SYNCWORDH && (buf[i + 1] & SYNCWORDL) == SYNCWORDL) { + return i; + } + } + + return -1; } /************************************************************************************** - * Function: AACGetLastFrameInfo - * - * Description: get info about last AAC frame decoded (number of samples decoded, - * sample rate, bit rate, etc.) - * - * Inputs: valid AAC decoder instance pointer (HAACDecoder) - * pointer to AACFrameInfo struct - * - * Outputs: filled-in AACFrameInfo struct - * - * Return: none - * - * Notes: call this right after calling AACDecode() + Function: AACGetLastFrameInfo + + Description: get info about last AAC frame decoded (number of samples decoded, + sample rate, bit rate, etc.) + + Inputs: valid AAC decoder instance pointer (HAACDecoder) + pointer to AACFrameInfo struct + + Outputs: filled-in AACFrameInfo struct + + Return: none + + Notes: call this right after calling AACDecode() **************************************************************************************/ -void AACGetLastFrameInfo(HAACDecoder hAACDecoder, AACFrameInfo *aacFrameInfo) -{ - AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; - - if (!aacDecInfo) { - aacFrameInfo->bitRate = 0; - aacFrameInfo->nChans = 0; - aacFrameInfo->sampRateCore = 0; - aacFrameInfo->sampRateOut = 0; - aacFrameInfo->bitsPerSample = 0; - aacFrameInfo->outputSamps = 0; - aacFrameInfo->profile = 0; - aacFrameInfo->tnsUsed = 0; - aacFrameInfo->pnsUsed = 0; - } else { - aacFrameInfo->bitRate = aacDecInfo->bitRate; - aacFrameInfo->nChans = aacDecInfo->nChans; - aacFrameInfo->sampRateCore = aacDecInfo->sampRate; - aacFrameInfo->sampRateOut = aacDecInfo->sampRate * (aacDecInfo->sbrEnabled ? 2 : 1); - aacFrameInfo->bitsPerSample = 16; - aacFrameInfo->outputSamps = aacDecInfo->nChans * AAC_MAX_NSAMPS * (aacDecInfo->sbrEnabled ? 2 : 1); - aacFrameInfo->profile = aacDecInfo->profile; - aacFrameInfo->tnsUsed = aacDecInfo->tnsUsed; - aacFrameInfo->pnsUsed = aacDecInfo->pnsUsed; - } +void AACGetLastFrameInfo(HAACDecoder hAACDecoder, AACFrameInfo *aacFrameInfo) { + AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; + + if (!aacDecInfo) { + aacFrameInfo->bitRate = 0; + aacFrameInfo->nChans = 0; + aacFrameInfo->sampRateCore = 0; + aacFrameInfo->sampRateOut = 0; + aacFrameInfo->bitsPerSample = 0; + aacFrameInfo->outputSamps = 0; + aacFrameInfo->profile = 0; + aacFrameInfo->tnsUsed = 0; + aacFrameInfo->pnsUsed = 0; + } else { + aacFrameInfo->bitRate = aacDecInfo->bitRate; + aacFrameInfo->nChans = aacDecInfo->nChans; + aacFrameInfo->sampRateCore = aacDecInfo->sampRate; + aacFrameInfo->sampRateOut = aacDecInfo->sampRate * (aacDecInfo->sbrEnabled ? 2 : 1); + aacFrameInfo->bitsPerSample = 16; + aacFrameInfo->outputSamps = aacDecInfo->nChans * AAC_MAX_NSAMPS * (aacDecInfo->sbrEnabled ? 2 : 1); + aacFrameInfo->profile = aacDecInfo->profile; + aacFrameInfo->tnsUsed = aacDecInfo->tnsUsed; + aacFrameInfo->pnsUsed = aacDecInfo->pnsUsed; + } } /************************************************************************************** - * Function: AACSetRawBlockParams - * - * Description: set internal state variables for decoding a stream of raw data blocks - * - * Inputs: valid AAC decoder instance pointer (HAACDecoder) - * flag indicating source of parameters - * AACFrameInfo struct, with the members nChans, sampRate, and profile - * optionally filled-in - * - * Outputs: updated codec state - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: if copyLast == 1, then the codec sets up its internal state (for - * decoding raw blocks) based on previously-decoded ADTS header info - * if copyLast == 0, then the codec uses the values passed in - * aacFrameInfo to configure its internal state (useful when the - * source is MP4 format, for example) + Function: AACSetRawBlockParams + + Description: set internal state variables for decoding a stream of raw data blocks + + Inputs: valid AAC decoder instance pointer (HAACDecoder) + flag indicating source of parameters + AACFrameInfo struct, with the members nChans, sampRate, and profile + optionally filled-in + + Outputs: updated codec state + + Return: 0 if successful, error code (< 0) if error + + Notes: if copyLast == 1, then the codec sets up its internal state (for + decoding raw blocks) based on previously-decoded ADTS header info + if copyLast == 0, then the codec uses the values passed in + aacFrameInfo to configure its internal state (useful when the + source is MP4 format, for example) **************************************************************************************/ -int AACSetRawBlockParams(HAACDecoder hAACDecoder, int copyLast, AACFrameInfo *aacFrameInfo) -{ - AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; - - if (!aacDecInfo) - return ERR_AAC_NULL_POINTER; - - aacDecInfo->format = AAC_FF_RAW; - if (copyLast) - return SetRawBlockParams(aacDecInfo, 1, 0, 0, 0); - else - return SetRawBlockParams(aacDecInfo, 0, aacFrameInfo->nChans, aacFrameInfo->sampRateCore, aacFrameInfo->profile); +int AACSetRawBlockParams(HAACDecoder hAACDecoder, int copyLast, AACFrameInfo *aacFrameInfo) { + AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; + + if (!aacDecInfo) { + return ERR_AAC_NULL_POINTER; + } + + aacDecInfo->format = AAC_FF_RAW; + if (copyLast) { + return SetRawBlockParams(aacDecInfo, 1, 0, 0, 0); + } else { + return SetRawBlockParams(aacDecInfo, 0, aacFrameInfo->nChans, aacFrameInfo->sampRateCore, aacFrameInfo->profile); + } } /************************************************************************************** - * Function: AACFlushCodec - * - * Description: flush internal codec state (after seeking, for example) - * - * Inputs: valid AAC decoder instance pointer (HAACDecoder) - * - * Outputs: updated state variables in aacDecInfo - * - * Return: 0 if successful, error code (< 0) if error + Function: AACFlushCodec + + Description: flush internal codec state (after seeking, for example) + + Inputs: valid AAC decoder instance pointer (HAACDecoder) + + Outputs: updated state variables in aacDecInfo + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int AACFlushCodec(HAACDecoder hAACDecoder) -{ - int ch; - AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; - - if (!aacDecInfo) - return ERR_AAC_NULL_POINTER; - - /* reset common state variables which change per-frame - * don't touch state variables which are (usually) constant for entire clip - * (nChans, sampRate, profile, format, sbrEnabled) - */ - aacDecInfo->prevBlockID = AAC_ID_INVALID; - aacDecInfo->currBlockID = AAC_ID_INVALID; - aacDecInfo->currInstTag = -1; - for (ch = 0; ch < MAX_NCHANS_ELEM; ch++) - aacDecInfo->sbDeinterleaveReqd[ch] = 0; - aacDecInfo->adtsBlocksLeft = 0; - aacDecInfo->tnsUsed = 0; - aacDecInfo->pnsUsed = 0; - - /* reset internal codec state (flush overlap buffers, etc.) */ - FlushCodec(aacDecInfo); +int AACFlushCodec(HAACDecoder hAACDecoder) { + int ch; + AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; + + if (!aacDecInfo) { + return ERR_AAC_NULL_POINTER; + } + + /* reset common state variables which change per-frame + don't touch state variables which are (usually) constant for entire clip + (nChans, sampRate, profile, format, sbrEnabled) + */ + aacDecInfo->prevBlockID = AAC_ID_INVALID; + aacDecInfo->currBlockID = AAC_ID_INVALID; + aacDecInfo->currInstTag = -1; + for (ch = 0; ch < MAX_NCHANS_ELEM; ch++) { + aacDecInfo->sbDeinterleaveReqd[ch] = 0; + } + aacDecInfo->adtsBlocksLeft = 0; + aacDecInfo->tnsUsed = 0; + aacDecInfo->pnsUsed = 0; + + /* reset internal codec state (flush overlap buffers, etc.) */ + FlushCodec(aacDecInfo); #ifdef AAC_ENABLE_SBR - FlushCodecSBR(aacDecInfo); + FlushCodecSBR(aacDecInfo); #endif - return ERR_AAC_NONE; + return ERR_AAC_NONE; } /************************************************************************************** - * Function: AACDecode - * - * Description: decode AAC frame - * - * Inputs: valid AAC decoder instance pointer (HAACDecoder) - * double pointer to buffer of AAC data - * pointer to number of valid bytes remaining in inbuf - * pointer to outbuf, big enough to hold one frame of decoded PCM samples - * (outbuf must be double-sized if SBR enabled) - * - * Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo - * number of output samples = 1024 per channel (2048 if SBR enabled) - * updated inbuf pointer - * updated bytesLeft - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: inbuf pointer and bytesLeft are not updated until whole frame is - * successfully decoded, so if ERR_AAC_INDATA_UNDERFLOW is returned - * just call AACDecode again with more data in inbuf + Function: AACDecode + + Description: decode AAC frame + + Inputs: valid AAC decoder instance pointer (HAACDecoder) + double pointer to buffer of AAC data + pointer to number of valid bytes remaining in inbuf + pointer to outbuf, big enough to hold one frame of decoded PCM samples + (outbuf must be double-sized if SBR enabled) + + Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo + number of output samples = 1024 per channel (2048 if SBR enabled) + updated inbuf pointer + updated bytesLeft + + Return: 0 if successful, error code (< 0) if error + + Notes: inbuf pointer and bytesLeft are not updated until whole frame is + successfully decoded, so if ERR_AAC_INDATA_UNDERFLOW is returned + just call AACDecode again with more data in inbuf **************************************************************************************/ -int AACDecode(HAACDecoder hAACDecoder, unsigned char **inbuf, int *bytesLeft, short *outbuf) -{ - int err, offset, bitOffset, bitsAvail; - int ch, baseChan, elementChans; - unsigned char *inptr; - AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; +int AACDecode(HAACDecoder hAACDecoder, unsigned char **inbuf, int *bytesLeft, short *outbuf) { + int err, offset, bitOffset, bitsAvail; + int ch, baseChan, elementChans; + unsigned char *inptr; + AACDecInfo *aacDecInfo = (AACDecInfo *)hAACDecoder; #ifdef AAC_ENABLE_SBR - int baseChanSBR, elementChansSBR; + int baseChanSBR, elementChansSBR; #endif - if (!aacDecInfo) - return ERR_AAC_NULL_POINTER; - - /* make local copies (see "Notes" above) */ - inptr = *inbuf; - bitOffset = 0; - bitsAvail = (*bytesLeft) << 3; - - /* first time through figure out what the file format is */ - if (aacDecInfo->format == AAC_FF_Unknown) { - if (bitsAvail < 32) - return ERR_AAC_INDATA_UNDERFLOW; - - if (IS_ADIF(inptr)) { - /* unpack ADIF header */ - aacDecInfo->format = AAC_FF_ADIF; - err = UnpackADIFHeader(aacDecInfo, &inptr, &bitOffset, &bitsAvail); - if (err) - return err; - } else { - /* assume ADTS by default */ - aacDecInfo->format = AAC_FF_ADTS; - } - } - - - - /* if ADTS, search for start of next frame */ - if (aacDecInfo->format == AAC_FF_ADTS) { - /* can have 1-4 raw data blocks per ADTS frame (header only present for first one) */ - if (aacDecInfo->adtsBlocksLeft == 0) { - offset = AACFindSyncWord(inptr, bitsAvail >> 3); - if (offset < 0) - return ERR_AAC_INDATA_UNDERFLOW; - inptr += offset; - bitsAvail -= (offset << 3); - - err = UnpackADTSHeader(aacDecInfo, &inptr, &bitOffset, &bitsAvail); - if (err) - return err; - - if (aacDecInfo->nChans == -1) { - /* figure out implicit channel mapping if necessary */ - err = GetADTSChannelMapping(aacDecInfo, inptr, bitOffset, bitsAvail); - if (err) - return err; - } - } - aacDecInfo->adtsBlocksLeft--; - } else if (aacDecInfo->format == AAC_FF_RAW) { - err = PrepareRawBlock(aacDecInfo); - if (err) - return err; - } - - - - /* check for valid number of channels */ - if (aacDecInfo->nChans > AAC_MAX_NCHANS || aacDecInfo->nChans <= 0) - return ERR_AAC_NCHANS_TOO_HIGH; - - /* will be set later if active in this frame */ - aacDecInfo->tnsUsed = 0; - aacDecInfo->pnsUsed = 0; - - bitOffset = 0; - baseChan = 0; -#ifdef AAC_ENABLE_SBR - baseChanSBR = 0; -#endif - do { - - - - /* parse next syntactic element */ - err = DecodeNextElement(aacDecInfo, &inptr, &bitOffset, &bitsAvail); - if (err) - return err; - - elementChans = elementNumChans[aacDecInfo->currBlockID]; - if (baseChan + elementChans > AAC_MAX_NCHANS) - return ERR_AAC_NCHANS_TOO_HIGH; - - /* noiseless decoder and dequantizer */ - for (ch = 0; ch < elementChans; ch++) { - PROFILE_START("noiseless decoder"); - err = DecodeNoiselessData(aacDecInfo, &inptr, &bitOffset, &bitsAvail, ch); - PROFILE_END(); - - if (err) - return err; - - PROFILE_START("dequant"); - if (Dequantize(aacDecInfo, ch)) - return ERR_AAC_DEQUANT; - PROFILE_END(); - } - - PROFILE_START("mid-side and intensity stereo"); - /* mid-side and intensity stereo */ - if (aacDecInfo->currBlockID == AAC_ID_CPE) { - if (StereoProcess(aacDecInfo)) - return ERR_AAC_STEREO_PROCESS; - } - PROFILE_END(); - - - /* PNS, TNS, inverse transform */ - for (ch = 0; ch < elementChans; ch++) { - PROFILE_START("PNS"); - if (PNS(aacDecInfo, ch)) - return ERR_AAC_PNS; - PROFILE_END(); - - if (aacDecInfo->sbDeinterleaveReqd[ch]) { - /* deinterleave short blocks, if required */ - if (DeinterleaveShortBlocks(aacDecInfo, ch)) - return ERR_AAC_SHORT_BLOCK_DEINT; - aacDecInfo->sbDeinterleaveReqd[ch] = 0; - } - - PROFILE_START("TNS"); - if (TNSFilter(aacDecInfo, ch)) - return ERR_AAC_TNS; - PROFILE_END(); - - PROFILE_START("IMDCT"); - if (IMDCT(aacDecInfo, ch, baseChan + ch, outbuf)) - return ERR_AAC_IMDCT; - PROFILE_END(); - } + if (!aacDecInfo) { + return ERR_AAC_NULL_POINTER; + } + + /* make local copies (see "Notes" above) */ + inptr = *inbuf; + bitOffset = 0; + bitsAvail = (*bytesLeft) << 3; + + /* first time through figure out what the file format is */ + if (aacDecInfo->format == AAC_FF_Unknown) { + if (bitsAvail < 32) { + return ERR_AAC_INDATA_UNDERFLOW; + } + + if (IS_ADIF(inptr)) { + /* unpack ADIF header */ + aacDecInfo->format = AAC_FF_ADIF; + err = UnpackADIFHeader(aacDecInfo, &inptr, &bitOffset, &bitsAvail); + if (err) { + return err; + } + } else { + /* assume ADTS by default */ + aacDecInfo->format = AAC_FF_ADTS; + } + } + + + + /* if ADTS, search for start of next frame */ + if (aacDecInfo->format == AAC_FF_ADTS) { + /* can have 1-4 raw data blocks per ADTS frame (header only present for first one) */ + if (aacDecInfo->adtsBlocksLeft == 0) { + offset = AACFindSyncWord(inptr, bitsAvail >> 3); + if (offset < 0) { + return ERR_AAC_INDATA_UNDERFLOW; + } + inptr += offset; + bitsAvail -= (offset << 3); + + err = UnpackADTSHeader(aacDecInfo, &inptr, &bitOffset, &bitsAvail); + if (err) { + return err; + } + + if (aacDecInfo->nChans == -1) { + /* figure out implicit channel mapping if necessary */ + err = GetADTSChannelMapping(aacDecInfo, inptr, bitOffset, bitsAvail); + if (err) { + return err; + } + } + } + aacDecInfo->adtsBlocksLeft--; + } else if (aacDecInfo->format == AAC_FF_RAW) { + err = PrepareRawBlock(aacDecInfo); + if (err) { + return err; + } + } + + + /* check for valid number of channels */ + if (aacDecInfo->nChans > AAC_MAX_NCHANS || aacDecInfo->nChans <= 0) { + return ERR_AAC_NCHANS_TOO_HIGH; + } + + /* will be set later if active in this frame */ + aacDecInfo->tnsUsed = 0; + aacDecInfo->pnsUsed = 0; + + bitOffset = 0; + baseChan = 0; #ifdef AAC_ENABLE_SBR - if (aacDecInfo->sbrEnabled && (aacDecInfo->currBlockID == AAC_ID_FIL || aacDecInfo->currBlockID == AAC_ID_LFE)) { - if (aacDecInfo->currBlockID == AAC_ID_LFE) - elementChansSBR = elementNumChans[AAC_ID_LFE]; - else if (aacDecInfo->currBlockID == AAC_ID_FIL && (aacDecInfo->prevBlockID == AAC_ID_SCE || aacDecInfo->prevBlockID == AAC_ID_CPE)) - elementChansSBR = elementNumChans[aacDecInfo->prevBlockID]; - else - elementChansSBR = 0; - - if (baseChanSBR + elementChansSBR > AAC_MAX_NCHANS) - return ERR_AAC_SBR_NCHANS_TOO_HIGH; - - /* parse SBR extension data if present (contained in a fill element) */ - if (DecodeSBRBitstream(aacDecInfo, baseChanSBR)) - return ERR_AAC_SBR_BITSTREAM; - - /* apply SBR */ - if (DecodeSBRData(aacDecInfo, baseChanSBR, outbuf)) - return ERR_AAC_SBR_DATA; - - baseChanSBR += elementChansSBR; - } + baseChanSBR = 0; #endif - - baseChan += elementChans; - } while (aacDecInfo->currBlockID != AAC_ID_END); - - /* byte align after each raw_data_block */ - if (bitOffset) { - inptr++; - bitsAvail -= (8-bitOffset); - bitOffset = 0; - if (bitsAvail < 0) - return ERR_AAC_INDATA_UNDERFLOW; - } - - /* update pointers */ - aacDecInfo->frameCount++; - *bytesLeft -= (inptr - *inbuf); - *inbuf = inptr; - - return ERR_AAC_NONE; + do { + + + + /* parse next syntactic element */ + err = DecodeNextElement(aacDecInfo, &inptr, &bitOffset, &bitsAvail); + if (err) { + return err; + } + + elementChans = elementNumChans[aacDecInfo->currBlockID]; + if (baseChan + elementChans > AAC_MAX_NCHANS) { + return ERR_AAC_NCHANS_TOO_HIGH; + } + + /* noiseless decoder and dequantizer */ + for (ch = 0; ch < elementChans; ch++) { + PROFILE_START("noiseless decoder"); + err = DecodeNoiselessData(aacDecInfo, &inptr, &bitOffset, &bitsAvail, ch); + PROFILE_END(); + + if (err) { + return err; + } + + PROFILE_START("dequant"); + if (Dequantize(aacDecInfo, ch)) { + return ERR_AAC_DEQUANT; + } + PROFILE_END(); + } + + PROFILE_START("mid-side and intensity stereo"); + /* mid-side and intensity stereo */ + if (aacDecInfo->currBlockID == AAC_ID_CPE) { + if (StereoProcess(aacDecInfo)) { + return ERR_AAC_STEREO_PROCESS; + } + } + PROFILE_END(); + + + /* PNS, TNS, inverse transform */ + for (ch = 0; ch < elementChans; ch++) { + PROFILE_START("PNS"); + if (PNS(aacDecInfo, ch)) { + return ERR_AAC_PNS; + } + PROFILE_END(); + + if (aacDecInfo->sbDeinterleaveReqd[ch]) { + /* deinterleave short blocks, if required */ + if (DeinterleaveShortBlocks(aacDecInfo, ch)) { + return ERR_AAC_SHORT_BLOCK_DEINT; + } + aacDecInfo->sbDeinterleaveReqd[ch] = 0; + } + + PROFILE_START("TNS"); + if (TNSFilter(aacDecInfo, ch)) { + return ERR_AAC_TNS; + } + PROFILE_END(); + + PROFILE_START("IMDCT"); + if (IMDCT(aacDecInfo, ch, baseChan + ch, outbuf)) { + return ERR_AAC_IMDCT; + } + PROFILE_END(); + } + +#ifdef AAC_ENABLE_SBR + if (aacDecInfo->sbrEnabled && (aacDecInfo->currBlockID == AAC_ID_FIL || aacDecInfo->currBlockID == AAC_ID_LFE)) { + if (aacDecInfo->currBlockID == AAC_ID_LFE) { + elementChansSBR = elementNumChans[AAC_ID_LFE]; + } else if (aacDecInfo->currBlockID == AAC_ID_FIL && (aacDecInfo->prevBlockID == AAC_ID_SCE || aacDecInfo->prevBlockID == AAC_ID_CPE)) { + elementChansSBR = elementNumChans[aacDecInfo->prevBlockID]; + } else { + elementChansSBR = 0; + } + + if (baseChanSBR + elementChansSBR > AAC_MAX_NCHANS) { + return ERR_AAC_SBR_NCHANS_TOO_HIGH; + } + + /* parse SBR extension data if present (contained in a fill element) */ + if (DecodeSBRBitstream(aacDecInfo, baseChanSBR)) { + return ERR_AAC_SBR_BITSTREAM; + } + + /* apply SBR */ + if (DecodeSBRData(aacDecInfo, baseChanSBR, outbuf)) { + return ERR_AAC_SBR_DATA; + } + + baseChanSBR += elementChansSBR; + } +#endif + + baseChan += elementChans; + } while (aacDecInfo->currBlockID != AAC_ID_END); + + /* byte align after each raw_data_block */ + if (bitOffset) { + inptr++; + bitsAvail -= (8 - bitOffset); + bitOffset = 0; + if (bitsAvail < 0) { + return ERR_AAC_INDATA_UNDERFLOW; + } + } + + /* update pointers */ + aacDecInfo->frameCount++; + *bytesLeft -= (inptr - *inbuf); + *inbuf = inptr; + + return ERR_AAC_NONE; } diff --git a/src/libhelix-aac/aacdec.h b/src/libhelix-aac/aacdec.h index 0f7d91f4..6e4dfcd8 100644 --- a/src/libhelix-aac/aacdec.h +++ b/src/libhelix-aac/aacdec.h @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: aacdec.h,v 1.8 2005/11/10 00:15:08 margotm Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: aacdec.h,v 1.8 2005/11/10 00:15:08 margotm Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * aacdec.h - public C API for AAC decoder + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + aacdec.h - public C API for AAC decoder **************************************************************************************/ #ifndef _AACDEC_H @@ -64,6 +64,8 @@ # #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__POWERPC__)) # +#elif defined(__GNUC__) && (defined(__mips__) || defined(__MIPS__)) +# #elif defined(_OPENWAVE_SIMULATOR) || defined(_OPENWAVE_ARMULATOR) # #elif defined(_SOLARIS) && !defined(__GNUC__) @@ -82,12 +84,12 @@ extern "C" { #endif -/* according to spec (13818-7 section 8.2.2, 14496-3 section 4.5.3) - * max size of input buffer = - * 6144 bits = 768 bytes per SCE or CCE-I - * 12288 bits = 1536 bytes per CPE - * 0 bits = 0 bytes per CCE-D (uses bits from the SCE/CPE/CCE-I it is coupled to) - */ +/* according to spec (13818-7 section 8.2.2, 14496-3 section 4.5.3) + max size of input buffer = + 6144 bits = 768 bytes per SCE or CCE-I + 12288 bits = 1536 bytes per CPE + 0 bits = 0 bytes per CCE-D (uses bits from the SCE/CPE/CCE-I it is coupled to) +*/ #ifndef AAC_MAX_NCHANS /* if max channels isn't set in makefile, */ #define AAC_MAX_NCHANS 2 /* set to default max number of channels */ #endif @@ -106,46 +108,46 @@ extern "C" { #define AAC_ENABLE_MPEG4 enum { - ERR_AAC_NONE = 0, - ERR_AAC_INDATA_UNDERFLOW = -1, - ERR_AAC_NULL_POINTER = -2, - ERR_AAC_INVALID_ADTS_HEADER = -3, - ERR_AAC_INVALID_ADIF_HEADER = -4, - ERR_AAC_INVALID_FRAME = -5, - ERR_AAC_MPEG4_UNSUPPORTED = -6, - ERR_AAC_CHANNEL_MAP = -7, - ERR_AAC_SYNTAX_ELEMENT = -8, - - ERR_AAC_DEQUANT = -9, - ERR_AAC_STEREO_PROCESS = -10, - ERR_AAC_PNS = -11, - ERR_AAC_SHORT_BLOCK_DEINT = -12, - ERR_AAC_TNS = -13, - ERR_AAC_IMDCT = -14, - ERR_AAC_NCHANS_TOO_HIGH = -15, - - ERR_AAC_SBR_INIT = -16, - ERR_AAC_SBR_BITSTREAM = -17, - ERR_AAC_SBR_DATA = -18, - ERR_AAC_SBR_PCM_FORMAT = -19, - ERR_AAC_SBR_NCHANS_TOO_HIGH = -20, - ERR_AAC_SBR_SINGLERATE_UNSUPPORTED = -21, - - ERR_AAC_RAWBLOCK_PARAMS = -22, - - ERR_AAC_UNKNOWN = -9999 + ERR_AAC_NONE = 0, + ERR_AAC_INDATA_UNDERFLOW = -1, + ERR_AAC_NULL_POINTER = -2, + ERR_AAC_INVALID_ADTS_HEADER = -3, + ERR_AAC_INVALID_ADIF_HEADER = -4, + ERR_AAC_INVALID_FRAME = -5, + ERR_AAC_MPEG4_UNSUPPORTED = -6, + ERR_AAC_CHANNEL_MAP = -7, + ERR_AAC_SYNTAX_ELEMENT = -8, + + ERR_AAC_DEQUANT = -9, + ERR_AAC_STEREO_PROCESS = -10, + ERR_AAC_PNS = -11, + ERR_AAC_SHORT_BLOCK_DEINT = -12, + ERR_AAC_TNS = -13, + ERR_AAC_IMDCT = -14, + ERR_AAC_NCHANS_TOO_HIGH = -15, + + ERR_AAC_SBR_INIT = -16, + ERR_AAC_SBR_BITSTREAM = -17, + ERR_AAC_SBR_DATA = -18, + ERR_AAC_SBR_PCM_FORMAT = -19, + ERR_AAC_SBR_NCHANS_TOO_HIGH = -20, + ERR_AAC_SBR_SINGLERATE_UNSUPPORTED = -21, + + ERR_AAC_RAWBLOCK_PARAMS = -22, + + ERR_AAC_UNKNOWN = -9999 }; typedef struct _AACFrameInfo { - int bitRate; - int nChans; - int sampRateCore; - int sampRateOut; - int bitsPerSample; - int outputSamps; - int profile; - int tnsUsed; - int pnsUsed; + int bitRate; + int nChans; + int sampRateCore; + int sampRateOut; + int bitsPerSample; + int outputSamps; + int profile; + int tnsUsed; + int pnsUsed; } AACFrameInfo; typedef void *HAACDecoder; diff --git a/src/libhelix-aac/aactabs.c b/src/libhelix-aac/aactabs.c index 1efa20ca..6cc70154 100644 --- a/src/libhelix-aac/aactabs.c +++ b/src/libhelix-aac/aactabs.c @@ -1,71 +1,71 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: aactabs.c,v 1.1 2005/02/26 01:47:31 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: aactabs.c,v 1.1 2005/02/26 01:47:31 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * aactabs.c - platform-independent tables for AAC decoder (global, read-only) + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + aactabs.c - platform-independent tables for AAC decoder (global, read-only) **************************************************************************************/ #include "aaccommon.h" /* sample rates (table 4.5.1) */ const int sampRateTab[NUM_SAMPLE_RATES] PROGMEM = { - 96000, 88200, 64000, 48000, 44100, 32000, - 24000, 22050, 16000, 12000, 11025, 8000 + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000 }; /* max scalefactor band for prediction (main profile only) */ const int predSFBMax[NUM_SAMPLE_RATES] PROGMEM = { - 33, 33, 38, 40, 40, 40, 41, 41, 37, 37, 37, 34 + 33, 33, 38, 40, 40, 40, 41, 41, 37, 37, 37, 34 }; /* channel mapping (table 1.6.3.4) (-1 = unknown, so need to determine mapping based on rules in 8.5.1) */ const int channelMapTab[NUM_DEF_CHAN_MAPS] PROGMEM = { - -1, 1, 2, 3, 4, 5, 6, 8 -}; + -1, 1, 2, 3, 4, 5, 6, 8 + }; -/* number of channels in each element (SCE, CPE, etc.) - * see AACElementID in aaccommon.h - */ +/* number of channels in each element (SCE, CPE, etc.) + see AACElementID in aaccommon.h +*/ const int elementNumChans[NUM_ELEMENTS] PROGMEM = { - 1, 2, 0, 1, 0, 0, 0, 0 + 1, 2, 0, 1, 0, 0, 0, 0 }; /* total number of scale factor bands in one window */ @@ -81,77 +81,77 @@ const unsigned int /*char*/ sfBandTotalLong[NUM_SAMPLE_RATES] PROGMEM = { const int sfBandTabShortOffset[NUM_SAMPLE_RATES] PROGMEM = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60}; const /*short*/ int sfBandTabShort[76] PROGMEM = { - /* short block 64, 88, 96 kHz [13] (tables 4.5.24, 4.5.26) */ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128, + /* short block 64, 88, 96 kHz [13] (tables 4.5.24, 4.5.26) */ + 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128, - /* short block 32, 44, 48 kHz [15] (table 4.5.15) */ - 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128, + /* short block 32, 44, 48 kHz [15] (table 4.5.15) */ + 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128, - /* short block 22, 24 kHz [16] (table 4.5.22) */ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, + /* short block 22, 24 kHz [16] (table 4.5.22) */ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, - /* short block 11, 12, 16 kHz [16] (table 4.5.20) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128, + /* short block 11, 12, 16 kHz [16] (table 4.5.20) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128, - /* short block 8 kHz [16] (table 4.5.18) */ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 + /* short block 8 kHz [16] (table 4.5.18) */ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 }; const int sfBandTabLongOffset[NUM_SAMPLE_RATES] PROGMEM = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284}; const /*short*/ int sfBandTabLong[325] PROGMEM = { - /* long block 88, 96 kHz [42] (table 4.5.25) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, - 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, - 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024, - - /* long block 64 kHz [48] (table 4.5.13) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, - 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, - 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024, - - /* long block 44, 48 kHz [50] (table 4.5.14) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, - 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, - 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024, - - /* long block 32 kHz [52] (table 4.5.16) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, - 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, - 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024, - - /* long block 22, 24 kHz [48] (table 4.5.21) */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, - 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, - 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024, - - /* long block 11, 12, 16 kHz [44] (table 4.5.19) */ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, - 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, - 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024, - - /* long block 8 kHz [41] (table 4.5.17) */ - 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, - 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, - 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 + /* long block 88, 96 kHz [42] (table 4.5.25) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, + 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, + 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024, + + /* long block 64 kHz [48] (table 4.5.13) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, + 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, + 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024, + + /* long block 44, 48 kHz [50] (table 4.5.14) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, + 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, + 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024, + + /* long block 32 kHz [52] (table 4.5.16) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, + 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, + 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024, + + /* long block 22, 24 kHz [48] (table 4.5.21) */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, + 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, + 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024, + + /* long block 11, 12, 16 kHz [44] (table 4.5.19) */ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, + 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, + 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024, + + /* long block 8 kHz [41] (table 4.5.17) */ + 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, + 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, + 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 }; /* TNS max bands (table 4.139) and max order (table 4.138) */ const int tnsMaxBandsShortOffset[AAC_NUM_PROFILES] PROGMEM = {0, 0, 12}; -const unsigned /*char*/ int tnsMaxBandsShort[2*NUM_SAMPLE_RATES] PROGMEM = { - 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, /* short block, Main/LC */ - 7, 7, 7, 6, 6, 6, 7, 7, 8, 8, 8, 7 /* short block, SSR */ +const unsigned /*char*/ int tnsMaxBandsShort[2 * NUM_SAMPLE_RATES] PROGMEM = { + 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, /* short block, Main/LC */ + 7, 7, 7, 6, 6, 6, 7, 7, 8, 8, 8, 7 /* short block, SSR */ }; const unsigned /*char*/ int tnsMaxOrderShort[AAC_NUM_PROFILES] PROGMEM = {7, 7, 7}; const int tnsMaxBandsLongOffset[AAC_NUM_PROFILES] PROGMEM = {0, 0, 12}; -const unsigned int /*char*/ tnsMaxBandsLong[2*NUM_SAMPLE_RATES] PROGMEM = { - 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39, /* long block, Main/LC */ - 28, 28, 27, 26, 26, 26, 29, 29, 23, 23, 23, 19, /* long block, SSR */ +const unsigned int /*char*/ tnsMaxBandsLong[2 * NUM_SAMPLE_RATES] PROGMEM = { + 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39, /* long block, Main/LC */ + 28, 28, 27, 26, 26, 26, 29, 29, 23, 23, 23, 19, /* long block, SSR */ }; const unsigned /*char*/ int tnsMaxOrderLong[AAC_NUM_PROFILES] PROGMEM = {20, 12, 12}; diff --git a/src/libhelix-aac/assembly.h b/src/libhelix-aac/assembly.h index fc4d7673..3328f84a 100644 --- a/src/libhelix-aac/assembly.h +++ b/src/libhelix-aac/assembly.h @@ -1,115 +1,125 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: assembly.h,v 1.7 2005/11/10 00:04:40 margotm Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: assembly.h,v 1.7 2005/11/10 00:04:40 margotm Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * assembly.h - inline assembly language functions and prototypes - * - * MULSHIFT32(x, y) signed multiply of two 32-bit integers (x and y), - * returns top 32-bits of 64-bit result - * CLIPTOSHORT(x) convert 32-bit integer to 16-bit short, - * clipping to [-32768, 32767] - * FASTABS(x) branchless absolute value of signed integer x - * CLZ(x) count leading zeros on signed integer x - * MADD64(sum64, x, y) 64-bit multiply accumulate: sum64 += (x*y) + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + assembly.h - inline assembly language functions and prototypes + + MULSHIFT32(x, y) signed multiply of two 32-bit integers (x and y), + returns top 32-bits of 64-bit result + CLIPTOSHORT(x) convert 32-bit integer to 16-bit short, + clipping to [-32768, 32767] + FASTABS(x) branchless absolute value of signed integer x + CLZ(x) count leading zeros on signed integer x + MADD64(sum64, x, y) 64-bit multiply accumulate: sum64 += (x*y) **************************************************************************************/ #ifndef _ASSEMBLY_H #define _ASSEMBLY_H -/* toolchain: MSFT Visual C++ - * target architecture: x86 - */ +/* toolchain: MSFT Visual C++ + target architecture: x86 +*/ #if (defined (_WIN32) && !defined (_WIN32_WCE)) || (defined (__WINS__) && defined (_SYMBIAN)) || (defined (WINCE_EMULATOR)) || (defined (_OPENWAVE_SIMULATOR)) #pragma warning( disable : 4035 ) /* complains about inline asm not returning a value */ -static __inline int MULSHIFT32(int x, int y) -{ +static __inline int MULSHIFT32(int x, int y) { __asm { - mov eax, x - imul y - mov eax, edx - } + mov eax, x + imul y + mov eax, edx + } } -static __inline short CLIPTOSHORT(int x) -{ - int sign; +static __inline short CLIPTOSHORT(int x) { + int sign; - /* clip to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); + /* clip to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } - return (short)x; + return (short)x; } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return 32; + if (!x) { + return 32; + } - /* count leading zeros with binary search */ - numZeros = 1; - if (!((unsigned int)x >> 16)) { numZeros += 16; x <<= 16; } - if (!((unsigned int)x >> 24)) { numZeros += 8; x <<= 8; } - if (!((unsigned int)x >> 28)) { numZeros += 4; x <<= 4; } - if (!((unsigned int)x >> 30)) { numZeros += 2; x <<= 2; } + /* count leading zeros with binary search */ + numZeros = 1; + if (!((unsigned int)x >> 16)) { + numZeros += 16; + x <<= 16; + } + if (!((unsigned int)x >> 24)) { + numZeros += 8; + x <<= 8; + } + if (!((unsigned int)x >> 28)) { + numZeros += 4; + x <<= 4; + } + if (!((unsigned int)x >> 30)) { + numZeros += 2; + x <<= 2; + } - numZeros -= ((unsigned int)x >> 31); + numZeros -= ((unsigned int)x >> 31); - return numZeros; + return numZeros; } #ifdef __CW32__ @@ -119,20 +129,19 @@ typedef __int64 Word64; #endif typedef union _U64 { - Word64 w64; - struct { - /* x86 = little endian */ - unsigned int lo32; - signed int hi32; - } r; + Word64 w64; + struct { + /* x86 = little endian */ + unsigned int lo32; + signed int hi32; + } r; } U64; /* returns 64-bit value in [edx:eax] */ -static __inline Word64 MADD64(Word64 sum64, int x, int y) -{ +static __inline Word64 MADD64(Word64 sum64, int x, int y) { #if (defined (_SYMBIAN_61_) || defined (_SYMBIAN_70_)) && defined (__WINS__) && !defined (__CW32__) -/* Workaround for the Symbian emulator because of non existing longlong.lib and - * hence __allmul not defined. */ + /* Workaround for the Symbian emulator because of non existing longlong.lib and + hence __allmul not defined. */ __asm { mov eax, x imul y @@ -146,51 +155,62 @@ static __inline Word64 MADD64(Word64 sum64, int x, int y) return sum64; } -/* toolchain: MSFT Embedded Visual C++ - * target architecture: ARM v.4 and above (require 'M' type processor for 32x32->64 multiplier) - */ +/* toolchain: MSFT Embedded Visual C++ + target architecture: ARM v.4 and above (require 'M' type processor for 32x32->64 multiplier) +*/ #elif defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM) -static __inline short CLIPTOSHORT(int x) -{ - int sign; +static __inline short CLIPTOSHORT(int x) { + int sign; - /* clip to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); + /* clip to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } - return (short)x; + return (short)x; } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return 32; + if (!x) { + return 32; + } - /* count leading zeros with binary search (function should be 17 ARM instructions total) */ - numZeros = 1; - if (!((unsigned int)x >> 16)) { numZeros += 16; x <<= 16; } - if (!((unsigned int)x >> 24)) { numZeros += 8; x <<= 8; } - if (!((unsigned int)x >> 28)) { numZeros += 4; x <<= 4; } - if (!((unsigned int)x >> 30)) { numZeros += 2; x <<= 2; } + /* count leading zeros with binary search (function should be 17 ARM instructions total) */ + numZeros = 1; + if (!((unsigned int)x >> 16)) { + numZeros += 16; + x <<= 16; + } + if (!((unsigned int)x >> 24)) { + numZeros += 8; + x <<= 8; + } + if (!((unsigned int)x >> 28)) { + numZeros += 4; + x <<= 4; + } + if (!((unsigned int)x >> 30)) { + numZeros += 2; + x <<= 2; + } - numZeros -= ((unsigned int)x >> 31); + numZeros -= ((unsigned int)x >> 31); - return numZeros; + return numZeros; } /* implemented in asmfunc.s */ @@ -201,12 +221,12 @@ extern "C" { typedef __int64 Word64; typedef union _U64 { - Word64 w64; - struct { - /* ARM WinCE = little endian */ - unsigned int lo32; - signed int hi32; - } r; + Word64 w64; + struct { + /* ARM WinCE = little endian */ + unsigned int lo32; + signed int hi32; + } r; } U64; /* manual name mangling for just this platform (must match labels in .s file) */ @@ -220,133 +240,141 @@ Word64 MADD64(Word64 sum64, int x, int y); } #endif -/* toolchain: ARM ADS or RealView - * target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) - */ -#elif defined (__arm) && defined (__ARMCC_VERSION) - -static __inline int MULSHIFT32(int x, int y) -{ - /* rules for smull RdLo, RdHi, Rm, Rs: - * RdHi != Rm - * RdLo != Rm - * RdHi != RdLo - */ +/* toolchain: ARM ADS or RealView + target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) +*/ +#elif defined (XXX__arm) && defined (__ARMCC_VERSION) + +static __inline int MULSHIFT32(int x, int y) { + /* rules for smull RdLo, RdHi, Rm, Rs: + RdHi != Rm + RdLo != Rm + RdHi != RdLo + */ int zlow; __asm { - smull zlow,y,x,y - } + smull zlow, y, x, y + } return y; } -static __inline short CLIPTOSHORT(int x) -{ - int sign; +static __inline short CLIPTOSHORT(int x) { + int sign; - /* clip to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); + /* clip to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } - return (short)x; + return (short)x; } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; - - return x; -} - -static __inline int CLZ(int x) -{ - int numZeros; - - if (!x) - return 32; - - /* count leading zeros with binary search (function should be 17 ARM instructions total) */ - numZeros = 1; - if (!((unsigned int)x >> 16)) { numZeros += 16; x <<= 16; } - if (!((unsigned int)x >> 24)) { numZeros += 8; x <<= 8; } - if (!((unsigned int)x >> 28)) { numZeros += 4; x <<= 4; } - if (!((unsigned int)x >> 30)) { numZeros += 2; x <<= 2; } - - numZeros -= ((unsigned int)x >> 31); - - return numZeros; - -/* ARM code would look like this, but do NOT use inline asm in ADS for this, - because you can't safely use the status register flags intermixed with C code - - __asm { - mov numZeros, #1 - tst x, 0xffff0000 - addeq numZeros, numZeros, #16 - moveq x, x, lsl #16 - tst x, 0xff000000 - addeq numZeros, numZeros, #8 - moveq x, x, lsl #8 - tst x, 0xf0000000 - addeq numZeros, numZeros, #4 - moveq x, x, lsl #4 - tst x, 0xc0000000 - addeq numZeros, numZeros, #2 - moveq x, x, lsl #2 - sub numZeros, numZeros, x, lsr #31 - } -*/ -/* reference: - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } -*/ + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; + + return x; +} + +static __inline int CLZ(int x) { + int numZeros; + + if (!x) { + return 32; + } + + /* count leading zeros with binary search (function should be 17 ARM instructions total) */ + numZeros = 1; + if (!((unsigned int)x >> 16)) { + numZeros += 16; + x <<= 16; + } + if (!((unsigned int)x >> 24)) { + numZeros += 8; + x <<= 8; + } + if (!((unsigned int)x >> 28)) { + numZeros += 4; + x <<= 4; + } + if (!((unsigned int)x >> 30)) { + numZeros += 2; + x <<= 2; + } + + numZeros -= ((unsigned int)x >> 31); + + return numZeros; + + /* ARM code would look like this, but do NOT use inline asm in ADS for this, + because you can't safely use the status register flags intermixed with C code + + __asm { + mov numZeros, #1 + tst x, 0xffff0000 + addeq numZeros, numZeros, #16 + moveq x, x, lsl #16 + tst x, 0xff000000 + addeq numZeros, numZeros, #8 + moveq x, x, lsl #8 + tst x, 0xf0000000 + addeq numZeros, numZeros, #4 + moveq x, x, lsl #4 + tst x, 0xc0000000 + addeq numZeros, numZeros, #2 + moveq x, x, lsl #2 + sub numZeros, numZeros, x, lsr #31 + } + */ + /* reference: + numZeros = 0; + while (!(x & 0x80000000)) { + numZeros++; + x <<= 1; + } + */ } typedef __int64 Word64; typedef union _U64 { - Word64 w64; - struct { - /* ARM ADS = little endian */ - unsigned int lo32; - signed int hi32; - } r; + Word64 w64; + struct { + /* ARM ADS = little endian */ + unsigned int lo32; + signed int hi32; + } r; } U64; -static __inline Word64 MADD64(Word64 sum64, int x, int y) -{ - U64 u; - u.w64 = sum64; - - __asm { - smlal u.r.lo32, u.r.hi32, x, y - } +static __inline Word64 MADD64(Word64 sum64, int x, int y) { + U64 u; + u.w64 = sum64; + + __asm { + smlal u.r.lo32, u.r.hi32, x, y + } - return u.w64; + return u.w64; } -/* toolchain: ARM gcc - * target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) - */ -#elif defined(__GNUC__) && defined(__arm__) +/* toolchain: ARM gcc + target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) +*/ +#elif defined(__GNUC__) && defined(XXXX__arm__) -static inline int MULSHIFT32(int x, int y) -{ +static inline int MULSHIFT32(int x, int y) { int zlow; - asm ("smull %0,%1,%2,%3" : "=&r" (zlow), "=r" (y) : "r" (x), "1" (y) : "cc"); + asm("smull %0,%1,%2,%3" : "=&r"(zlow), "=r"(y) : "r"(x), "1"(y) : "cc"); return y; } /* -static inline short CLIPTOSHORT(int x) -{ + static inline short CLIPTOSHORT(int x) + { int sign; // clip to [-32768, 32767] // @@ -355,17 +383,16 @@ static inline short CLIPTOSHORT(int x) x = sign ^ ((1 << 15) - 1); return (short)x; -} -*/ -static inline short CLIPTOSHORT(int x) -{ - asm ("ssat %0, #16, %1" : "=r" (x) : "r" (x)); - return x; + } +*/ +static inline short CLIPTOSHORT(int x) { + asm("ssat %0, #16, %1" : "=r"(x) : "r"(x)); + return x; } -/* From coder.h, ORIGINAL: -clip to [-2^n, 2^n-1], valid range of n = [1, 30] -//TODO (FB) Is there a better way ? +/* From coder.h, ORIGINAL: + clip to [-2^n, 2^n-1], valid range of n = [1, 30] + //TODO (FB) Is there a better way ? */ #define CLIP_2N(y, n) { \ int sign = (y) >> 31; \ @@ -374,8 +401,8 @@ clip to [-2^n, 2^n-1], valid range of n = [1, 30] } \ } -/* From coder.h, ORIGINAL: - do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) +/* From coder.h, ORIGINAL: + do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) */ //TODO (FB) Is there a better way ? #define CLIP_2N_SHIFT(y, n) { \ @@ -393,192 +420,201 @@ clip to [-2^n, 2^n-1], valid range of n = [1, 30] #define CLZ(x) __builtin_clz(x) //FB //Reverse byte order (16 bit) //FB -static inline unsigned int REV16( unsigned int value) -{ - asm ("rev16 %0, %1" : "=r" (value) : "r" (value) ); - return(value); +static inline unsigned int REV16(unsigned int value) { + asm("rev16 %0, %1" : "=r"(value) : "r"(value)); + return (value); } //Reverse byte order (32 bit) //FB -static inline unsigned int REV32( unsigned int value) -{ - asm ("rev %0, %1" : "=r" (value) : "r" (value) ); - return(value); +static inline unsigned int REV32(unsigned int value) { + asm("rev %0, %1" : "=r"(value) : "r"(value)); + return (value); } typedef long long Word64; typedef union _U64 { - Word64 w64; - struct { - /* little endian */ - unsigned int lo32; - signed int hi32; - } r; + Word64 w64; + struct { + /* little endian */ + unsigned int lo32; + signed int hi32; + } r; } U64; -static inline Word64 MADD64(Word64 sum64, int x, int y) -{ - U64 u; - u.w64 = sum64; - asm ("smlal %0,%1,%2,%3" : "+&r" (u.r.lo32), "+&r" (u.r.hi32) : "r" (x), "r" (y) : "cc"); - return u.w64; +static inline Word64 MADD64(Word64 sum64, int x, int y) { + U64 u; + u.w64 = sum64; + asm("smlal %0,%1,%2,%3" : "+&r"(u.r.lo32), "+&r"(u.r.hi32) : "r"(x), "r"(y) : "cc"); + return u.w64; } -/* toolchain: x86 gcc - * target architecture: x86 - */ +/* toolchain: x86 gcc + target architecture: x86 +*/ #elif defined(__GNUC__) && (defined(__i386__) || defined(__amd64__)) || (defined (_SOLARIS) && !defined (__GNUC__) && defined(_SOLARISX86)) typedef long long Word64; -static __inline__ int MULSHIFT32(int x, int y) -{ +static __inline__ int MULSHIFT32(int x, int y) { int z; z = (Word64)x * (Word64)y >> 32; - - return z; + + return z; } -static __inline short CLIPTOSHORT(int x) -{ - int sign; +static __inline short CLIPTOSHORT(int x) { + int sign; - /* clip to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); + /* clip to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } - return (short)x; + return (short)x; } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return 32; + if (!x) { + return 32; + } - /* count leading zeros with binary search (function should be 17 ARM instructions total) */ - numZeros = 1; - if (!((unsigned int)x >> 16)) { numZeros += 16; x <<= 16; } - if (!((unsigned int)x >> 24)) { numZeros += 8; x <<= 8; } - if (!((unsigned int)x >> 28)) { numZeros += 4; x <<= 4; } - if (!((unsigned int)x >> 30)) { numZeros += 2; x <<= 2; } + /* count leading zeros with binary search (function should be 17 ARM instructions total) */ + numZeros = 1; + if (!((unsigned int)x >> 16)) { + numZeros += 16; + x <<= 16; + } + if (!((unsigned int)x >> 24)) { + numZeros += 8; + x <<= 8; + } + if (!((unsigned int)x >> 28)) { + numZeros += 4; + x <<= 4; + } + if (!((unsigned int)x >> 30)) { + numZeros += 2; + x <<= 2; + } - numZeros -= ((unsigned int)x >> 31); + numZeros -= ((unsigned int)x >> 31); - return numZeros; + return numZeros; } typedef union _U64 { - Word64 w64; - struct { - /* x86 = little endian */ - unsigned int lo32; - signed int hi32; - } r; + Word64 w64; + struct { + /* x86 = little endian */ + unsigned int lo32; + signed int hi32; + } r; } U64; -static __inline Word64 MADD64(Word64 sum64, int x, int y) -{ - sum64 += (Word64)x * (Word64)y; +static __inline Word64 MADD64(Word64 sum64, int x, int y) { + sum64 += (Word64)x * (Word64)y; - return sum64; + return sum64; } -#elif defined(ARDUINO) || defined(__GNUC__) && (defined(__powerpc__) || defined(__POWERPC__)) || (defined (_SOLARIS) && !defined (__GNUC__) && !defined (_SOLARISX86)) +#elif defined(ARDUINO) || defined(__GNUC__) && (defined(__mips__) || defined(__MIPS__)) || defined(__GNUC__) && (defined(__powerpc__) || defined(__POWERPC__)) || (defined (_SOLARIS) && !defined (__GNUC__) && !defined (_SOLARISX86)) typedef long long Word64; -static __inline__ int MULSHIFT32(int x, int y) -{ +static __inline__ int MULSHIFT32(int x, int y) { int z; z = (Word64)x * (Word64)y >> 32; - - return z; + + return z; } -static __inline short CLIPTOSHORT(int x) -{ - int sign; +static __inline short CLIPTOSHORT(int x) { + int sign; - /* clip to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); + /* clip to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } - return (short)x; + return (short)x; } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return 32; + if (!x) { + return 32; + } - /* count leading zeros with binary search (function should be 17 ARM instructions total) */ - numZeros = 1; - if (!((unsigned int)x >> 16)) { numZeros += 16; x <<= 16; } - if (!((unsigned int)x >> 24)) { numZeros += 8; x <<= 8; } - if (!((unsigned int)x >> 28)) { numZeros += 4; x <<= 4; } - if (!((unsigned int)x >> 30)) { numZeros += 2; x <<= 2; } + /* count leading zeros with binary search (function should be 17 ARM instructions total) */ + numZeros = 1; + if (!((unsigned int)x >> 16)) { + numZeros += 16; + x <<= 16; + } + if (!((unsigned int)x >> 24)) { + numZeros += 8; + x <<= 8; + } + if (!((unsigned int)x >> 28)) { + numZeros += 4; + x <<= 4; + } + if (!((unsigned int)x >> 30)) { + numZeros += 2; + x <<= 2; + } - numZeros -= ((unsigned int)x >> 31); + numZeros -= ((unsigned int)x >> 31); - return numZeros; + return numZeros; } typedef union _U64 { - Word64 w64; - struct { -#ifdef __XTENSA__ - unsigned int lo32; - signed int hi32; -#else - /* PowerPC = big endian */ - signed int hi32; - unsigned int lo32; -#endif - } r; + Word64 w64; + struct { + unsigned int lo32; + signed int hi32; + } r; } U64; -static __inline Word64 MADD64(Word64 sum64, int x, int y) -{ - sum64 += (Word64)x * (Word64)y; +static __inline Word64 MADD64(Word64 sum64, int x, int y) { + sum64 += (Word64)x * (Word64)y; - return sum64; + return sum64; } -/* From coder.h, ORIGINAL: -clip to [-2^n, 2^n-1], valid range of n = [1, 30] -//TODO (FB) Is there a better way ? +/* From coder.h, ORIGINAL: + clip to [-2^n, 2^n-1], valid range of n = [1, 30] + //TODO (FB) Is there a better way ? */ #define CLIP_2N(y, n) { \ int sign = (y) >> 31; \ @@ -587,8 +623,8 @@ clip to [-2^n, 2^n-1], valid range of n = [1, 30] } \ } -/* From coder.h, ORIGINAL: - do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) +/* From coder.h, ORIGINAL: + do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) */ //TODO (FB) Is there a better way ? #define CLIP_2N_SHIFT(y, n) { \ @@ -621,8 +657,8 @@ clip to [-2^n, 2^n-1], valid range of n = [1, 30] #endif #ifndef CLIP_2N_SHIFT -/* From coder.h, ORIGINAL: - do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) +/* From coder.h, ORIGINAL: + do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) */ //TODO (FB) Is there a better way ? #define CLIP_2N_SHIFT(y, n) { \ diff --git a/src/libhelix-aac/bitstream.c b/src/libhelix-aac/bitstream.c index 09cb3f65..08f6bc15 100644 --- a/src/libhelix-aac/bitstream.c +++ b/src/libhelix-aac/bitstream.c @@ -1,261 +1,255 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: bitstream.c,v 1.2 2005/09/27 20:31:11 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: bitstream.c,v 1.2 2005/09/27 20:31:11 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * bitstream.c - bitstream parsing functions + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + bitstream.c - bitstream parsing functions **************************************************************************************/ #include "bitstream.h" /************************************************************************************** - * Function: SetBitstreamPointer - * - * Description: initialize bitstream reader - * - * Inputs: pointer to BitStreamInfo struct - * number of bytes in bitstream - * pointer to byte-aligned buffer of data to read from - * - * Outputs: initialized bitstream info struct - * - * Return: none + Function: SetBitstreamPointer + + Description: initialize bitstream reader + + Inputs: pointer to BitStreamInfo struct + number of bytes in bitstream + pointer to byte-aligned buffer of data to read from + + Outputs: initialized bitstream info struct + + Return: none **************************************************************************************/ -void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf) -{ - /* init bitstream */ - bsi->bytePtr = buf; - bsi->iCache = 0; /* 4-byte unsigned int */ - bsi->cachedBits = 0; /* i.e. zero bits in cache */ - bsi->nBytes = nBytes; +void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf) { + /* init bitstream */ + bsi->bytePtr = buf; + bsi->iCache = 0; /* 4-byte unsigned int */ + bsi->cachedBits = 0; /* i.e. zero bits in cache */ + bsi->nBytes = nBytes; } /************************************************************************************** - * Function: RefillBitstreamCache - * - * Description: read new data from bitstream buffer into 32-bit cache - * - * Inputs: pointer to initialized BitStreamInfo struct - * - * Outputs: updated bitstream info struct - * - * Return: none - * - * Notes: only call when iCache is completely drained (resets bitOffset to 0) - * always loads 4 new bytes except when bsi->nBytes < 4 (end of buffer) - * stores data as big-endian in cache, regardless of machine endian-ness + Function: RefillBitstreamCache + + Description: read new data from bitstream buffer into 32-bit cache + + Inputs: pointer to initialized BitStreamInfo struct + + Outputs: updated bitstream info struct + + Return: none + + Notes: only call when iCache is completely drained (resets bitOffset to 0) + always loads 4 new bytes except when bsi->nBytes < 4 (end of buffer) + stores data as big-endian in cache, regardless of machine endian-ness **************************************************************************************/ //Optimized for REV16, REV32 (FB) -static __inline void RefillBitstreamCache(BitStreamInfo *bsi) -{ - int nBytes = bsi->nBytes; - if (nBytes >= 4) { - /* optimize for common case, independent of machine endian-ness */ - bsi->iCache = (*bsi->bytePtr++) << 24; - bsi->iCache |= (*bsi->bytePtr++) << 16; - bsi->iCache |= (*bsi->bytePtr++) << 8; - bsi->iCache |= (*bsi->bytePtr++); - - bsi->cachedBits = 32; - bsi->nBytes -= 4; - } else { - bsi->iCache = 0; - while (nBytes--) { - bsi->iCache |= (*bsi->bytePtr++); - bsi->iCache <<= 8; - } - bsi->iCache <<= ((3 - bsi->nBytes)*8); - bsi->cachedBits = 8*bsi->nBytes; - bsi->nBytes = 0; - } +static __inline void RefillBitstreamCache(BitStreamInfo *bsi) { + int nBytes = bsi->nBytes; + if (nBytes >= 4) { + /* optimize for common case, independent of machine endian-ness */ + bsi->iCache = (*bsi->bytePtr++) << 24; + bsi->iCache |= (*bsi->bytePtr++) << 16; + bsi->iCache |= (*bsi->bytePtr++) << 8; + bsi->iCache |= (*bsi->bytePtr++); + + bsi->cachedBits = 32; + bsi->nBytes -= 4; + } else { + bsi->iCache = 0; + while (nBytes--) { + bsi->iCache |= (*bsi->bytePtr++); + bsi->iCache <<= 8; + } + bsi->iCache <<= ((3 - bsi->nBytes) * 8); + bsi->cachedBits = 8 * bsi->nBytes; + bsi->nBytes = 0; + } } /************************************************************************************** - * Function: GetBits - * - * Description: get bits from bitstream, advance bitstream pointer - * - * Inputs: pointer to initialized BitStreamInfo struct - * number of bits to get from bitstream - * - * Outputs: updated bitstream info struct - * - * Return: the next nBits bits of data from bitstream buffer - * - * Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f - * for speed, does not indicate error if you overrun bit buffer - * if nBits == 0, returns 0 + Function: GetBits + + Description: get bits from bitstream, advance bitstream pointer + + Inputs: pointer to initialized BitStreamInfo struct + number of bits to get from bitstream + + Outputs: updated bitstream info struct + + Return: the next nBits bits of data from bitstream buffer + + Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f + for speed, does not indicate error if you overrun bit buffer + if nBits == 0, returns 0 **************************************************************************************/ -unsigned int GetBits(BitStreamInfo *bsi, int nBits) -{ - unsigned int data, lowBits; - - nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ - data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ - data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ - bsi->iCache <<= nBits; /* left-justify cache */ - bsi->cachedBits -= nBits; /* how many bits have we drawn from the cache so far */ - - /* if we cross an int boundary, refill the cache */ - if (bsi->cachedBits < 0) { - lowBits = -bsi->cachedBits; - RefillBitstreamCache(bsi); - data |= bsi->iCache >> (32 - lowBits); /* get the low-order bits */ - - bsi->cachedBits -= lowBits; /* how many bits have we drawn from the cache so far */ - bsi->iCache <<= lowBits; /* left-justify cache */ - } - - return data; +unsigned int GetBits(BitStreamInfo *bsi, int nBits) { + unsigned int data, lowBits; + + nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ + data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ + data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ + bsi->iCache <<= nBits; /* left-justify cache */ + bsi->cachedBits -= nBits; /* how many bits have we drawn from the cache so far */ + + /* if we cross an int boundary, refill the cache */ + if (bsi->cachedBits < 0) { + lowBits = -bsi->cachedBits; + RefillBitstreamCache(bsi); + data |= bsi->iCache >> (32 - lowBits); /* get the low-order bits */ + + bsi->cachedBits -= lowBits; /* how many bits have we drawn from the cache so far */ + bsi->iCache <<= lowBits; /* left-justify cache */ + } + + return data; } /************************************************************************************** - * Function: GetBitsNoAdvance - * - * Description: get bits from bitstream, do not advance bitstream pointer - * - * Inputs: pointer to initialized BitStreamInfo struct - * number of bits to get from bitstream - * - * Outputs: none (state of BitStreamInfo struct left unchanged) - * - * Return: the next nBits bits of data from bitstream buffer - * - * Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f - * for speed, does not indicate error if you overrun bit buffer - * if nBits == 0, returns 0 + Function: GetBitsNoAdvance + + Description: get bits from bitstream, do not advance bitstream pointer + + Inputs: pointer to initialized BitStreamInfo struct + number of bits to get from bitstream + + Outputs: none (state of BitStreamInfo struct left unchanged) + + Return: the next nBits bits of data from bitstream buffer + + Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f + for speed, does not indicate error if you overrun bit buffer + if nBits == 0, returns 0 **************************************************************************************/ -unsigned int GetBitsNoAdvance(BitStreamInfo *bsi, int nBits) -{ - unsigned char *buf; - unsigned int data, iCache; - signed int lowBits; - - nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ - data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ - data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ - lowBits = nBits - bsi->cachedBits; /* how many bits do we have left to read */ - - /* if we cross an int boundary, read next bytes in buffer */ - if (lowBits > 0) { - iCache = 0; - buf = bsi->bytePtr; - while (lowBits > 0) { - iCache <<= 8; - if (buf < bsi->bytePtr + bsi->nBytes) - iCache |= (unsigned int)*buf++; - lowBits -= 8; - } - lowBits = -lowBits; - data |= iCache >> lowBits; - } - - return data; +unsigned int GetBitsNoAdvance(BitStreamInfo *bsi, int nBits) { + unsigned char *buf; + unsigned int data, iCache; + signed int lowBits; + + nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ + data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ + data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ + lowBits = nBits - bsi->cachedBits; /* how many bits do we have left to read */ + + /* if we cross an int boundary, read next bytes in buffer */ + if (lowBits > 0) { + iCache = 0; + buf = bsi->bytePtr; + while (lowBits > 0) { + iCache <<= 8; + if (buf < bsi->bytePtr + bsi->nBytes) { + iCache |= (unsigned int) * buf++; + } + lowBits -= 8; + } + lowBits = -lowBits; + data |= iCache >> lowBits; + } + + return data; } /************************************************************************************** - * Function: AdvanceBitstream - * - * Description: move bitstream pointer ahead - * - * Inputs: pointer to initialized BitStreamInfo struct - * number of bits to advance bitstream - * - * Outputs: updated bitstream info struct - * - * Return: none - * - * Notes: generally used following GetBitsNoAdvance(bsi, maxBits) + Function: AdvanceBitstream + + Description: move bitstream pointer ahead + + Inputs: pointer to initialized BitStreamInfo struct + number of bits to advance bitstream + + Outputs: updated bitstream info struct + + Return: none + + Notes: generally used following GetBitsNoAdvance(bsi, maxBits) **************************************************************************************/ -void AdvanceBitstream(BitStreamInfo *bsi, int nBits) -{ - nBits &= 0x1f; - if (nBits > bsi->cachedBits) { - nBits -= bsi->cachedBits; - RefillBitstreamCache(bsi); - } - bsi->iCache <<= nBits; - bsi->cachedBits -= nBits; +void AdvanceBitstream(BitStreamInfo *bsi, int nBits) { + nBits &= 0x1f; + if (nBits > bsi->cachedBits) { + nBits -= bsi->cachedBits; + RefillBitstreamCache(bsi); + } + bsi->iCache <<= nBits; + bsi->cachedBits -= nBits; } /************************************************************************************** - * Function: CalcBitsUsed - * - * Description: calculate how many bits have been read from bitstream - * - * Inputs: pointer to initialized BitStreamInfo struct - * pointer to start of bitstream buffer - * bit offset into first byte of startBuf (0-7) - * - * Outputs: none - * - * Return: number of bits read from bitstream, as offset from startBuf:startOffset + Function: CalcBitsUsed + + Description: calculate how many bits have been read from bitstream + + Inputs: pointer to initialized BitStreamInfo struct + pointer to start of bitstream buffer + bit offset into first byte of startBuf (0-7) + + Outputs: none + + Return: number of bits read from bitstream, as offset from startBuf:startOffset **************************************************************************************/ -int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset) -{ - int bitsUsed; +int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset) { + int bitsUsed; - bitsUsed = (bsi->bytePtr - startBuf) * 8; - bitsUsed -= bsi->cachedBits; - bitsUsed -= startOffset; + bitsUsed = (bsi->bytePtr - startBuf) * 8; + bitsUsed -= bsi->cachedBits; + bitsUsed -= startOffset; - return bitsUsed; + return bitsUsed; } /************************************************************************************** - * Function: ByteAlignBitstream - * - * Description: bump bitstream pointer to start of next byte - * - * Inputs: pointer to initialized BitStreamInfo struct - * - * Outputs: byte-aligned bitstream BitStreamInfo struct - * - * Return: none - * - * Notes: if bitstream is already byte-aligned, do nothing + Function: ByteAlignBitstream + + Description: bump bitstream pointer to start of next byte + + Inputs: pointer to initialized BitStreamInfo struct + + Outputs: byte-aligned bitstream BitStreamInfo struct + + Return: none + + Notes: if bitstream is already byte-aligned, do nothing **************************************************************************************/ -void ByteAlignBitstream(BitStreamInfo *bsi) -{ - int offset; +void ByteAlignBitstream(BitStreamInfo *bsi) { + int offset; - offset = bsi->cachedBits & 0x07; - AdvanceBitstream(bsi, offset); + offset = bsi->cachedBits & 0x07; + AdvanceBitstream(bsi, offset); } diff --git a/src/libhelix-aac/bitstream.h b/src/libhelix-aac/bitstream.h index de68a989..d42343dc 100644 --- a/src/libhelix-aac/bitstream.h +++ b/src/libhelix-aac/bitstream.h @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: bitstream.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: bitstream.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * bitstream.h - definitions of bitstream handling functions + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + bitstream.h - definitions of bitstream handling functions **************************************************************************************/ #ifndef _BITSTREAM_H @@ -57,10 +57,10 @@ #define ByteAlignBitstream STATNAME(ByteAlignBitstream) typedef struct _BitStreamInfo { - unsigned char *bytePtr; - unsigned int iCache; - int cachedBits; - int nBytes; + unsigned char *bytePtr; + unsigned int iCache; + int cachedBits; + int nBytes; } BitStreamInfo; /* bitstream.c */ diff --git a/src/libhelix-aac/buffers.c b/src/libhelix-aac/buffers.c index 5acc61b4..a9ddf8be 100644 --- a/src/libhelix-aac/buffers.c +++ b/src/libhelix-aac/buffers.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: buffers.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: buffers.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * buffers.c - allocation and deallocation of internal AAC decoder buffers + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + buffers.c - allocation and deallocation of internal AAC decoder buffers **************************************************************************************/ #if defined(USE_DEFAULT_STDLIB) || defined(ARDUINO) @@ -52,90 +52,89 @@ #include "coder.h" /************************************************************************************** - * Function: ClearBuffer - * - * Description: fill buffer with 0's - * - * Inputs: pointer to buffer - * number of bytes to fill with 0 - * - * Outputs: cleared buffer - * - * Return: none - * - * Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) + Function: ClearBuffer + + Description: fill buffer with 0's + + Inputs: pointer to buffer + number of bytes to fill with 0 + + Outputs: cleared buffer + + Return: none + + Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) **************************************************************************************/ #include - void ClearBuffer(void *buf, int nBytes) -{ -/* int i; - unsigned char *cbuf = (unsigned char *)buf; +void ClearBuffer(void *buf, int nBytes) { + /* int i; + unsigned char *cbuf = (unsigned char *)buf; - for (i = 0; i < nBytes; i++) - cbuf[i] = 0; + for (i = 0; i < nBytes; i++) + cbuf[i] = 0; - return; - */ - memset(buf, 0, nBytes); + return; + */ + memset(buf, 0, nBytes); } /************************************************************************************** - * Function: AllocateBuffers - * - * Description: allocate all the memory needed for the AAC decoder - * - * Inputs: none - * - * Outputs: none - * - * Return: pointer to AACDecInfo structure, cleared to all 0's (except for - * pointer to platform-specific data structure) - * - * Notes: if one or more mallocs fail, function frees any buffers already - * allocated before returning + Function: AllocateBuffers + + Description: allocate all the memory needed for the AAC decoder + + Inputs: none + + Outputs: none + + Return: pointer to AACDecInfo structure, cleared to all 0's (except for + pointer to platform-specific data structure) + + Notes: if one or more mallocs fail, function frees any buffers already + allocated before returning **************************************************************************************/ -AACDecInfo *AllocateBuffers(void) -{ - AACDecInfo *aacDecInfo; - - aacDecInfo = (AACDecInfo *)malloc(sizeof(AACDecInfo)); - if (!aacDecInfo) - return 0; - ClearBuffer(aacDecInfo, sizeof(AACDecInfo)); - - aacDecInfo->psInfoBase = malloc(sizeof(PSInfoBase)); - if (!aacDecInfo->psInfoBase) { - FreeBuffers(aacDecInfo); - return 0; - } - ClearBuffer(aacDecInfo->psInfoBase, sizeof(PSInfoBase)); - - return aacDecInfo; +AACDecInfo *AllocateBuffers(void) { + AACDecInfo *aacDecInfo; + + aacDecInfo = (AACDecInfo *)malloc(sizeof(AACDecInfo)); + if (!aacDecInfo) { + return 0; + } + ClearBuffer(aacDecInfo, sizeof(AACDecInfo)); + + aacDecInfo->psInfoBase = malloc(sizeof(PSInfoBase)); + if (!aacDecInfo->psInfoBase) { + FreeBuffers(aacDecInfo); + return 0; + } + ClearBuffer(aacDecInfo->psInfoBase, sizeof(PSInfoBase)); + + return aacDecInfo; } -AACDecInfo *AllocateBuffersPre(void **ptr, int *sz) -{ - AACDecInfo *aacDecInfo; - - char *p = (char*)*ptr; - aacDecInfo = (AACDecInfo *)p; - p += (sizeof(AACDecInfo) +7 ) & ~7; - *sz -= (sizeof(AACDecInfo) +7 ) & ~7; - if (*sz < 0) - return 0; - ClearBuffer(aacDecInfo, sizeof(AACDecInfo)); - - aacDecInfo->psInfoBase = (PSInfoBase*)p; - p += (sizeof(PSInfoBase) + 7) & ~7; - *sz -= (sizeof(PSInfoBase) + 7) & ~7; - if (*sz <0) { - return 0; - } - ClearBuffer(aacDecInfo->psInfoBase, sizeof(PSInfoBase)); - - *ptr = p; - - return aacDecInfo; +AACDecInfo *AllocateBuffersPre(void **ptr, int *sz) { + AACDecInfo *aacDecInfo; + + char *p = (char*)*ptr; + aacDecInfo = (AACDecInfo *)p; + p += (sizeof(AACDecInfo) + 7) & ~7; + *sz -= (sizeof(AACDecInfo) + 7) & ~7; + if (*sz < 0) { + return 0; + } + ClearBuffer(aacDecInfo, sizeof(AACDecInfo)); + + aacDecInfo->psInfoBase = (PSInfoBase*)p; + p += (sizeof(PSInfoBase) + 7) & ~7; + *sz -= (sizeof(PSInfoBase) + 7) & ~7; + if (*sz < 0) { + return 0; + } + ClearBuffer(aacDecInfo->psInfoBase, sizeof(PSInfoBase)); + + *ptr = p; + + return aacDecInfo; } #ifndef SAFE_FREE @@ -143,23 +142,23 @@ AACDecInfo *AllocateBuffersPre(void **ptr, int *sz) #endif /************************************************************************************** - * Function: FreeBuffers - * - * Description: frees all the memory used by the AAC decoder - * - * Inputs: pointer to initialized AACDecInfo structure - * - * Outputs: none - * - * Return: none - * - * Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) + Function: FreeBuffers + + Description: frees all the memory used by the AAC decoder + + Inputs: pointer to initialized AACDecInfo structure + + Outputs: none + + Return: none + + Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) **************************************************************************************/ -void FreeBuffers(AACDecInfo *aacDecInfo) -{ - if (!aacDecInfo) - return; +void FreeBuffers(AACDecInfo *aacDecInfo) { + if (!aacDecInfo) { + return; + } - SAFE_FREE(aacDecInfo->psInfoBase); - SAFE_FREE(aacDecInfo); + SAFE_FREE(aacDecInfo->psInfoBase); + SAFE_FREE(aacDecInfo); } diff --git a/src/libhelix-aac/coder.h b/src/libhelix-aac/coder.h index 9609e393..05628374 100644 --- a/src/libhelix-aac/coder.h +++ b/src/libhelix-aac/coder.h @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: coder.h,v 1.2 2005/06/27 21:06:00 gwright Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: coder.h,v 1.2 2005/06/27 21:06:00 gwright Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * coder.h - definitions of platform-specific data structures, functions, and tables + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + coder.h - definitions of platform-specific data structures, functions, and tables **************************************************************************************/ #ifndef _CODER_H @@ -91,7 +91,7 @@ /* do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) */ /* -#define CLIP_2N_SHIFT(y, n) { \ + #define CLIP_2N_SHIFT(y, n) { \ int sign = (y) >> 31; \ if (sign != (y) >> (30 - (n))) { \ (y) = sign ^ (0x3fffffff); \ @@ -102,12 +102,12 @@ */ /* clip to [-2^n, 2^n-1], valid range of n = [1, 30] */ /* -#define CLIP_2N(val, n) { \ + #define CLIP_2N(val, n) { \ if ((val) >> 31 != (val) >> (n)) \ (val) = ((val) >> 31) ^ ((1 << (n)) - 1); \ } */ - + #define SF_DQ_OFFSET 15 #define FBITS_OUT_DQ 20 @@ -247,7 +247,7 @@ typedef struct _ProgConfigElement { unsigned char numCCE; /* number of valid channel coupling elements (max = 15) */ unsigned char monoMixdown; /* mono mixdown: bit 4 = present flag, bits 3-0 = element number */ unsigned char stereoMixdown; /* stereo mixdown: bit 4 = present flag, bits 3-0 = element number */ - unsigned char matrixMixdown; /* matrix mixdown: bit 4 = present flag, bit 3 = unused, + unsigned char matrixMixdown; /* matrix mixdown: bit 4 = present flag, bit 3 = unused, bits 2-1 = index, bit 0 = pseudo-surround enable */ unsigned char fce[MAX_NUM_FCE]; /* front element channel pair: bit 4 = SCE/CPE flag, bits 3-0 = inst tag */ unsigned char sce[MAX_NUM_SCE]; /* side element channel pair: bit 4 = SCE/CPE flag, bits 3-0 = inst tag */ @@ -341,7 +341,7 @@ void DecWindowOverlapShortNoClip(int *buf0, int *over0, int *out0, int winTypeCu /* hufftabs.c */ extern const HuffInfo huffTabSpecInfo[11]; extern const signed short huffTabSpec[1241]; -extern const HuffInfo huffTabScaleFactInfo; +extern const HuffInfo huffTabScaleFactInfo; extern const signed short huffTabScaleFact[121]; /* trigtabs.c */ @@ -357,16 +357,16 @@ extern int cos4sin4tab[128 + 1024]; extern int cos1sin1tab[514]; extern int sinWindow[128 + 1024]; extern int kbdWindow[128 + 1024]; -extern int twidTabEven[4*6 + 16*6 + 64*6]; -extern int twidTabOdd[8*6 + 32*6 + 128*6]; +extern int twidTabEven[4 * 6 + 16 * 6 + 64 * 6]; +extern int twidTabOdd[8 * 6 + 32 * 6 + 128 * 6]; #else /* trigtabs.c */ extern const int cos4sin4tab[128 + 1024]; extern const int cos1sin1tab[514]; extern const int sinWindow[128 + 1024]; extern const int kbdWindow[128 + 1024]; -extern const int twidTabEven[4*6 + 16*6 + 64*6]; -extern const int twidTabOdd[8*6 + 32*6 + 128*6]; +extern const int twidTabEven[4 * 6 + 16 * 6 + 64 * 6]; +extern const int twidTabOdd[8 * 6 + 32 * 6 + 128 * 6]; #endif #endif /* _CODER_H */ diff --git a/src/libhelix-aac/dct4.c b/src/libhelix-aac/dct4.c index 698f54b6..0b8d22eb 100644 --- a/src/libhelix-aac/dct4.c +++ b/src/libhelix-aac/dct4.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: dct4.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: dct4.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * dct4.c - optimized DCT-IV + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + dct4.c - optimized DCT-IV **************************************************************************************/ #include "coder.h" @@ -50,288 +50,283 @@ static const int nmdctTab[NUM_IMDCT_SIZES] PROGMEM = {128, 1024}; static const int postSkip[NUM_IMDCT_SIZES] PROGMEM = {15, 1}; /************************************************************************************** - * Function: PreMultiply - * - * Description: pre-twiddle stage of DCT4 - * - * Inputs: table index (for transform size) - * buffer of nmdct samples - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: minimum 1 GB in, 2 GB out, gains 5 (short) or 8 (long) frac bits - * i.e. gains 2-7= -5 int bits (short) or 2-10 = -8 int bits (long) - * normalization by -1/N is rolled into tables here (see trigtabs.c) - * uses 3-mul, 3-add butterflies instead of 4-mul, 2-add + Function: PreMultiply + + Description: pre-twiddle stage of DCT4 + + Inputs: table index (for transform size) + buffer of nmdct samples + + Outputs: processed samples in same buffer + + Return: none + + Notes: minimum 1 GB in, 2 GB out, gains 5 (short) or 8 (long) frac bits + i.e. gains 2-7= -5 int bits (short) or 2-10 = -8 int bits (long) + normalization by -1/N is rolled into tables here (see trigtabs.c) + uses 3-mul, 3-add butterflies instead of 4-mul, 2-add **************************************************************************************/ -static void PreMultiply(int tabidx, int *zbuf1) -{ - int i, nmdct, ar1, ai1, ar2, ai2, z1, z2; - int t, cms2, cps2a, sin2a, cps2b, sin2b; - int *zbuf2; - const int *csptr; - - nmdct = nmdctTab[tabidx]; - zbuf2 = zbuf1 + nmdct - 1; - csptr = cos4sin4tab + cos4sin4tabOffset[tabidx]; - - /* whole thing should fit in registers - verify that compiler does this */ - for (i = nmdct >> 2; i != 0; i--) { - /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ - cps2a = *csptr++; - sin2a = *csptr++; - cps2b = *csptr++; - sin2b = *csptr++; - - ar1 = *(zbuf1 + 0); - ai2 = *(zbuf1 + 1); - ai1 = *(zbuf2 + 0); - ar2 = *(zbuf2 - 1); - - /* gain 2 ints bit from MULSHIFT32 by Q30, but drop 7 or 10 int bits from table scaling of 1/M - * max per-sample gain (ignoring implicit scaling) = MAX(sin(angle)+cos(angle)) = 1.414 - * i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from - * extra sign bits, and eat one in adding - */ - t = MULSHIFT32(sin2a, ar1 + ai1); - z2 = MULSHIFT32(cps2a, ai1) - t; - cms2 = cps2a - 2*sin2a; - z1 = MULSHIFT32(cms2, ar1) + t; - *zbuf1++ = z1; /* cos*ar1 + sin*ai1 */ - *zbuf1++ = z2; /* cos*ai1 - sin*ar1 */ - - t = MULSHIFT32(sin2b, ar2 + ai2); - z2 = MULSHIFT32(cps2b, ai2) - t; - cms2 = cps2b - 2*sin2b; - z1 = MULSHIFT32(cms2, ar2) + t; - *zbuf2-- = z2; /* cos*ai2 - sin*ar2 */ - *zbuf2-- = z1; /* cos*ar2 + sin*ai2 */ - } +static void PreMultiply(int tabidx, int *zbuf1) { + int i, nmdct, ar1, ai1, ar2, ai2, z1, z2; + int t, cms2, cps2a, sin2a, cps2b, sin2b; + int *zbuf2; + const int *csptr; + + nmdct = nmdctTab[tabidx]; + zbuf2 = zbuf1 + nmdct - 1; + csptr = cos4sin4tab + cos4sin4tabOffset[tabidx]; + + /* whole thing should fit in registers - verify that compiler does this */ + for (i = nmdct >> 2; i != 0; i--) { + /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ + cps2a = *csptr++; + sin2a = *csptr++; + cps2b = *csptr++; + sin2b = *csptr++; + + ar1 = *(zbuf1 + 0); + ai2 = *(zbuf1 + 1); + ai1 = *(zbuf2 + 0); + ar2 = *(zbuf2 - 1); + + /* gain 2 ints bit from MULSHIFT32 by Q30, but drop 7 or 10 int bits from table scaling of 1/M + max per-sample gain (ignoring implicit scaling) = MAX(sin(angle)+cos(angle)) = 1.414 + i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from + extra sign bits, and eat one in adding + */ + t = MULSHIFT32(sin2a, ar1 + ai1); + z2 = MULSHIFT32(cps2a, ai1) - t; + cms2 = cps2a - 2 * sin2a; + z1 = MULSHIFT32(cms2, ar1) + t; + *zbuf1++ = z1; /* cos*ar1 + sin*ai1 */ + *zbuf1++ = z2; /* cos*ai1 - sin*ar1 */ + + t = MULSHIFT32(sin2b, ar2 + ai2); + z2 = MULSHIFT32(cps2b, ai2) - t; + cms2 = cps2b - 2 * sin2b; + z1 = MULSHIFT32(cms2, ar2) + t; + *zbuf2-- = z2; /* cos*ai2 - sin*ar2 */ + *zbuf2-- = z1; /* cos*ar2 + sin*ai2 */ + } } /************************************************************************************** - * Function: PostMultiply - * - * Description: post-twiddle stage of DCT4 - * - * Inputs: table index (for transform size) - * buffer of nmdct samples - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: minimum 1 GB in, 2 GB out - gains 2 int bits - * uses 3-mul, 3-add butterflies instead of 4-mul, 2-add + Function: PostMultiply + + Description: post-twiddle stage of DCT4 + + Inputs: table index (for transform size) + buffer of nmdct samples + + Outputs: processed samples in same buffer + + Return: none + + Notes: minimum 1 GB in, 2 GB out - gains 2 int bits + uses 3-mul, 3-add butterflies instead of 4-mul, 2-add **************************************************************************************/ -static void PostMultiply(int tabidx, int *fft1) -{ - int i, nmdct, ar1, ai1, ar2, ai2, skipFactor; - int t, cms2, cps2, sin2; - int *fft2; - const int *csptr; - - nmdct = nmdctTab[tabidx]; - csptr = cos1sin1tab; - skipFactor = postSkip[tabidx]; - fft2 = fft1 + nmdct - 1; - - /* load coeffs for first pass - * cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) - */ - cps2 = *csptr++; - sin2 = *csptr; - csptr += skipFactor; - cms2 = cps2 - 2*sin2; - - for (i = nmdct >> 2; i != 0; i--) { - ar1 = *(fft1 + 0); - ai1 = *(fft1 + 1); - ar2 = *(fft2 - 1); - ai2 = *(fft2 + 0); - - /* gain 2 ints bit from MULSHIFT32 by Q30 - * max per-sample gain = MAX(sin(angle)+cos(angle)) = 1.414 - * i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from - * extra sign bits, and eat one in adding - */ - t = MULSHIFT32(sin2, ar1 + ai1); - *fft2-- = t - MULSHIFT32(cps2, ai1); /* sin*ar1 - cos*ai1 */ - *fft1++ = t + MULSHIFT32(cms2, ar1); /* cos*ar1 + sin*ai1 */ - cps2 = *csptr++; - sin2 = *csptr; - csptr += skipFactor; - - ai2 = -ai2; - t = MULSHIFT32(sin2, ar2 + ai2); - *fft2-- = t - MULSHIFT32(cps2, ai2); /* sin*ar1 - cos*ai1 */ - cms2 = cps2 - 2*sin2; - *fft1++ = t + MULSHIFT32(cms2, ar2); /* cos*ar1 + sin*ai1 */ - } +static void PostMultiply(int tabidx, int *fft1) { + int i, nmdct, ar1, ai1, ar2, ai2, skipFactor; + int t, cms2, cps2, sin2; + int *fft2; + const int *csptr; + + nmdct = nmdctTab[tabidx]; + csptr = cos1sin1tab; + skipFactor = postSkip[tabidx]; + fft2 = fft1 + nmdct - 1; + + /* load coeffs for first pass + cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) + */ + cps2 = *csptr++; + sin2 = *csptr; + csptr += skipFactor; + cms2 = cps2 - 2 * sin2; + + for (i = nmdct >> 2; i != 0; i--) { + ar1 = *(fft1 + 0); + ai1 = *(fft1 + 1); + ar2 = *(fft2 - 1); + ai2 = *(fft2 + 0); + + /* gain 2 ints bit from MULSHIFT32 by Q30 + max per-sample gain = MAX(sin(angle)+cos(angle)) = 1.414 + i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from + extra sign bits, and eat one in adding + */ + t = MULSHIFT32(sin2, ar1 + ai1); + *fft2-- = t - MULSHIFT32(cps2, ai1); /* sin*ar1 - cos*ai1 */ + *fft1++ = t + MULSHIFT32(cms2, ar1); /* cos*ar1 + sin*ai1 */ + cps2 = *csptr++; + sin2 = *csptr; + csptr += skipFactor; + + ai2 = -ai2; + t = MULSHIFT32(sin2, ar2 + ai2); + *fft2-- = t - MULSHIFT32(cps2, ai2); /* sin*ar1 - cos*ai1 */ + cms2 = cps2 - 2 * sin2; + *fft1++ = t + MULSHIFT32(cms2, ar2); /* cos*ar1 + sin*ai1 */ + } } /************************************************************************************** - * Function: PreMultiplyRescale - * - * Description: pre-twiddle stage of DCT4, with rescaling for extra guard bits - * - * Inputs: table index (for transform size) - * buffer of nmdct samples - * number of guard bits to add to input before processing - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: see notes on PreMultiply(), above + Function: PreMultiplyRescale + + Description: pre-twiddle stage of DCT4, with rescaling for extra guard bits + + Inputs: table index (for transform size) + buffer of nmdct samples + number of guard bits to add to input before processing + + Outputs: processed samples in same buffer + + Return: none + + Notes: see notes on PreMultiply(), above **************************************************************************************/ - /* __attribute__ ((section (".data"))) */ static void PreMultiplyRescale(int tabidx, int *zbuf1, int es) -{ - int i, nmdct, ar1, ai1, ar2, ai2, z1, z2; - int t, cms2, cps2a, sin2a, cps2b, sin2b; - int *zbuf2; - const int *csptr; - - nmdct = nmdctTab[tabidx]; - zbuf2 = zbuf1 + nmdct - 1; - csptr = cos4sin4tab + cos4sin4tabOffset[tabidx]; - - /* whole thing should fit in registers - verify that compiler does this */ - for (i = nmdct >> 2; i != 0; i--) { - /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ - cps2a = *csptr++; - sin2a = *csptr++; - cps2b = *csptr++; - sin2b = *csptr++; - - ar1 = *(zbuf1 + 0) >> es; - ai1 = *(zbuf2 + 0) >> es; - ai2 = *(zbuf1 + 1) >> es; - - t = MULSHIFT32(sin2a, ar1 + ai1); - z2 = MULSHIFT32(cps2a, ai1) - t; - cms2 = cps2a - 2*sin2a; - z1 = MULSHIFT32(cms2, ar1) + t; - *zbuf1++ = z1; - *zbuf1++ = z2; - - ar2 = *(zbuf2 - 1) >> es; /* do here to free up register used for es */ - - t = MULSHIFT32(sin2b, ar2 + ai2); - z2 = MULSHIFT32(cps2b, ai2) - t; - cms2 = cps2b - 2*sin2b; - z1 = MULSHIFT32(cms2, ar2) + t; - *zbuf2-- = z2; - *zbuf2-- = z1; - - } +/* __attribute__ ((section (".data"))) */ static void PreMultiplyRescale(int tabidx, int *zbuf1, int es) { + int i, nmdct, ar1, ai1, ar2, ai2, z1, z2; + int t, cms2, cps2a, sin2a, cps2b, sin2b; + int *zbuf2; + const int *csptr; + + nmdct = nmdctTab[tabidx]; + zbuf2 = zbuf1 + nmdct - 1; + csptr = cos4sin4tab + cos4sin4tabOffset[tabidx]; + + /* whole thing should fit in registers - verify that compiler does this */ + for (i = nmdct >> 2; i != 0; i--) { + /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ + cps2a = *csptr++; + sin2a = *csptr++; + cps2b = *csptr++; + sin2b = *csptr++; + + ar1 = *(zbuf1 + 0) >> es; + ai1 = *(zbuf2 + 0) >> es; + ai2 = *(zbuf1 + 1) >> es; + + t = MULSHIFT32(sin2a, ar1 + ai1); + z2 = MULSHIFT32(cps2a, ai1) - t; + cms2 = cps2a - 2 * sin2a; + z1 = MULSHIFT32(cms2, ar1) + t; + *zbuf1++ = z1; + *zbuf1++ = z2; + + ar2 = *(zbuf2 - 1) >> es; /* do here to free up register used for es */ + + t = MULSHIFT32(sin2b, ar2 + ai2); + z2 = MULSHIFT32(cps2b, ai2) - t; + cms2 = cps2b - 2 * sin2b; + z1 = MULSHIFT32(cms2, ar2) + t; + *zbuf2-- = z2; + *zbuf2-- = z1; + + } } /************************************************************************************** - * Function: PostMultiplyRescale - * - * Description: post-twiddle stage of DCT4, with rescaling for extra guard bits - * - * Inputs: table index (for transform size) - * buffer of nmdct samples - * number of guard bits to remove from output - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: clips output to [-2^30, 2^30 - 1], guaranteeing at least 1 guard bit - * see notes on PostMultiply(), above + Function: PostMultiplyRescale + + Description: post-twiddle stage of DCT4, with rescaling for extra guard bits + + Inputs: table index (for transform size) + buffer of nmdct samples + number of guard bits to remove from output + + Outputs: processed samples in same buffer + + Return: none + + Notes: clips output to [-2^30, 2^30 - 1], guaranteeing at least 1 guard bit + see notes on PostMultiply(), above **************************************************************************************/ - /* __attribute__ ((section (".data"))) */ static void PostMultiplyRescale(int tabidx, int *fft1, int es) -{ - int i, nmdct, ar1, ai1, ar2, ai2, skipFactor, z; - int t, cs2, sin2; - int *fft2; - const int *csptr; - - nmdct = nmdctTab[tabidx]; - csptr = cos1sin1tab; - skipFactor = postSkip[tabidx]; - fft2 = fft1 + nmdct - 1; - - /* load coeffs for first pass - * cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) - */ - cs2 = *csptr++; - sin2 = *csptr; - csptr += skipFactor; - - for (i = nmdct >> 2; i != 0; i--) { - ar1 = *(fft1 + 0); - ai1 = *(fft1 + 1); - ai2 = *(fft2 + 0); - - t = MULSHIFT32(sin2, ar1 + ai1); - z = t - MULSHIFT32(cs2, ai1); - CLIP_2N_SHIFT(z, es); - *fft2-- = z; - cs2 -= 2*sin2; - z = t + MULSHIFT32(cs2, ar1); - CLIP_2N_SHIFT(z, es); - *fft1++ = z; - - cs2 = *csptr++; - sin2 = *csptr; - csptr += skipFactor; - - ar2 = *fft2; - ai2 = -ai2; - t = MULSHIFT32(sin2, ar2 + ai2); - z = t - MULSHIFT32(cs2, ai2); - CLIP_2N_SHIFT(z, es); - *fft2-- = z; - cs2 -= 2*sin2; - z = t + MULSHIFT32(cs2, ar2); - CLIP_2N_SHIFT(z, es); - *fft1++ = z; - cs2 += 2*sin2; - } +/* __attribute__ ((section (".data"))) */ static void PostMultiplyRescale(int tabidx, int *fft1, int es) { + int i, nmdct, ar1, ai1, ar2, ai2, skipFactor, z; + int t, cs2, sin2; + int *fft2; + const int *csptr; + + nmdct = nmdctTab[tabidx]; + csptr = cos1sin1tab; + skipFactor = postSkip[tabidx]; + fft2 = fft1 + nmdct - 1; + + /* load coeffs for first pass + cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) + */ + cs2 = *csptr++; + sin2 = *csptr; + csptr += skipFactor; + + for (i = nmdct >> 2; i != 0; i--) { + ar1 = *(fft1 + 0); + ai1 = *(fft1 + 1); + ai2 = *(fft2 + 0); + + t = MULSHIFT32(sin2, ar1 + ai1); + z = t - MULSHIFT32(cs2, ai1); + CLIP_2N_SHIFT(z, es); + *fft2-- = z; + cs2 -= 2 * sin2; + z = t + MULSHIFT32(cs2, ar1); + CLIP_2N_SHIFT(z, es); + *fft1++ = z; + + cs2 = *csptr++; + sin2 = *csptr; + csptr += skipFactor; + + ar2 = *fft2; + ai2 = -ai2; + t = MULSHIFT32(sin2, ar2 + ai2); + z = t - MULSHIFT32(cs2, ai2); + CLIP_2N_SHIFT(z, es); + *fft2-- = z; + cs2 -= 2 * sin2; + z = t + MULSHIFT32(cs2, ar2); + CLIP_2N_SHIFT(z, es); + *fft1++ = z; + cs2 += 2 * sin2; + } } /************************************************************************************** - * Function: DCT4 - * - * Description: type-IV DCT - * - * Inputs: table index (for transform size) - * buffer of nmdct samples - * number of guard bits in the input buffer - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: operates in-place - * if number of guard bits in input is < GBITS_IN_DCT4, the input is - * scaled (>>) before the DCT4 and rescaled (<<, with clipping) after - * the DCT4 (rare) - * the output has FBITS_LOST_DCT4 fewer fraction bits than the input - * the output will always have at least 1 guard bit (GBITS_IN_DCT4 >= 4) - * int bits gained per stage (PreMul + FFT + PostMul) - * short blocks = (-5 + 4 + 2) = 1 total - * long blocks = (-8 + 7 + 2) = 1 total + Function: DCT4 + + Description: type-IV DCT + + Inputs: table index (for transform size) + buffer of nmdct samples + number of guard bits in the input buffer + + Outputs: processed samples in same buffer + + Return: none + + Notes: operates in-place + if number of guard bits in input is < GBITS_IN_DCT4, the input is + scaled (>>) before the DCT4 and rescaled (<<, with clipping) after + the DCT4 (rare) + the output has FBITS_LOST_DCT4 fewer fraction bits than the input + the output will always have at least 1 guard bit (GBITS_IN_DCT4 >= 4) + int bits gained per stage (PreMul + FFT + PostMul) + short blocks = (-5 + 4 + 2) = 1 total + long blocks = (-8 + 7 + 2) = 1 total **************************************************************************************/ -void DCT4(int tabidx, int *coef, int gb) -{ - int es; - - /* fast in-place DCT-IV - adds guard bits if necessary */ - if (gb < GBITS_IN_DCT4) { - es = GBITS_IN_DCT4 - gb; - PreMultiplyRescale(tabidx, coef, es); - R4FFT(tabidx, coef); - PostMultiplyRescale(tabidx, coef, es); - } else { - PreMultiply(tabidx, coef); - R4FFT(tabidx, coef); - PostMultiply(tabidx, coef); - } +void DCT4(int tabidx, int *coef, int gb) { + int es; + + /* fast in-place DCT-IV - adds guard bits if necessary */ + if (gb < GBITS_IN_DCT4) { + es = GBITS_IN_DCT4 - gb; + PreMultiplyRescale(tabidx, coef, es); + R4FFT(tabidx, coef); + PostMultiplyRescale(tabidx, coef, es); + } else { + PreMultiply(tabidx, coef); + R4FFT(tabidx, coef); + PostMultiply(tabidx, coef); + } } diff --git a/src/libhelix-aac/decelmnt.c b/src/libhelix-aac/decelmnt.c index 8c319121..7167cd44 100644 --- a/src/libhelix-aac/decelmnt.c +++ b/src/libhelix-aac/decelmnt.c @@ -1,425 +1,438 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: decelmnt.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: decelmnt.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * decelmnt.c - syntactic element decoding + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + decelmnt.c - syntactic element decoding **************************************************************************************/ #include "coder.h" /************************************************************************************** - * Function: DecodeSingleChannelElement - * - * Description: decode one SCE - * - * Inputs: BitStreamInfo struct pointing to start of SCE (14496-3, table 4.4.4) - * - * Outputs: updated element instance tag - * - * Return: 0 if successful, -1 if error - * - * Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) + Function: DecodeSingleChannelElement + + Description: decode one SCE + + Inputs: BitStreamInfo struct pointing to start of SCE (14496-3, table 4.4.4) + + Outputs: updated element instance tag + + Return: 0 if successful, -1 if error + + Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) **************************************************************************************/ -static int DecodeSingleChannelElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) -{ - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; +static int DecodeSingleChannelElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) { + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } - /* read instance tag */ - aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); + /* read instance tag */ + aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); - return 0; + return 0; } /************************************************************************************** - * Function: DecodeChannelPairElement - * - * Description: decode one CPE - * - * Inputs: BitStreamInfo struct pointing to start of CPE (14496-3, table 4.4.5) - * - * Outputs: updated element instance tag - * updated commonWin - * updated ICS info, if commonWin == 1 - * updated mid-side stereo info, if commonWin == 1 - * - * Return: 0 if successful, -1 if error - * - * Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) + Function: DecodeChannelPairElement + + Description: decode one CPE + + Inputs: BitStreamInfo struct pointing to start of CPE (14496-3, table 4.4.5) + + Outputs: updated element instance tag + updated commonWin + updated ICS info, if commonWin == 1 + updated mid-side stereo info, if commonWin == 1 + + Return: 0 if successful, -1 if error + + Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) **************************************************************************************/ -static int DecodeChannelPairElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) -{ - int sfb, gp, maskOffset; - unsigned char currBit, *maskPtr; - PSInfoBase *psi; - ICSInfo *icsInfo; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = psi->icsInfo; - - /* read instance tag */ - aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); - - /* read common window flag and mid-side info (if present) - * store msMask bits in psi->msMaskBits[] as follows: - * long blocks - pack bits for each SFB in range [0, maxSFB) starting with lsb of msMaskBits[0] - * short blocks - pack bits for each SFB in range [0, maxSFB), for each group [0, 7] - * msMaskPresent = 0 means no M/S coding - * = 1 means psi->msMaskBits contains 1 bit per SFB to toggle M/S coding - * = 2 means all SFB's are M/S coded (so psi->msMaskBits is not needed) - */ - psi->commonWin = GetBits(bsi, 1); - if (psi->commonWin) { - DecodeICSInfo(bsi, icsInfo, psi->sampRateIdx); - psi->msMaskPresent = GetBits(bsi, 2); - if (psi->msMaskPresent == 1) { - maskPtr = psi->msMaskBits; - *maskPtr = 0; - maskOffset = 0; - for (gp = 0; gp < icsInfo->numWinGroup; gp++) { - for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { - currBit = (unsigned char)GetBits(bsi, 1); - *maskPtr |= currBit << maskOffset; - if (++maskOffset == 8) { - maskPtr++; - *maskPtr = 0; - maskOffset = 0; - } - } - } - } - } - - return 0; +static int DecodeChannelPairElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) { + int sfb, gp, maskOffset; + unsigned char currBit, *maskPtr; + PSInfoBase *psi; + ICSInfo *icsInfo; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = psi->icsInfo; + + /* read instance tag */ + aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); + + /* read common window flag and mid-side info (if present) + store msMask bits in psi->msMaskBits[] as follows: + long blocks - pack bits for each SFB in range [0, maxSFB) starting with lsb of msMaskBits[0] + short blocks - pack bits for each SFB in range [0, maxSFB), for each group [0, 7] + msMaskPresent = 0 means no M/S coding + = 1 means psi->msMaskBits contains 1 bit per SFB to toggle M/S coding + = 2 means all SFB's are M/S coded (so psi->msMaskBits is not needed) + */ + psi->commonWin = GetBits(bsi, 1); + if (psi->commonWin) { + DecodeICSInfo(bsi, icsInfo, psi->sampRateIdx); + psi->msMaskPresent = GetBits(bsi, 2); + if (psi->msMaskPresent == 1) { + maskPtr = psi->msMaskBits; + *maskPtr = 0; + maskOffset = 0; + for (gp = 0; gp < icsInfo->numWinGroup; gp++) { + for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { + currBit = (unsigned char)GetBits(bsi, 1); + *maskPtr |= currBit << maskOffset; + if (++maskOffset == 8) { + maskPtr++; + *maskPtr = 0; + maskOffset = 0; + } + } + } + } + } + + return 0; } /************************************************************************************** - * Function: DecodeLFEChannelElement - * - * Description: decode one LFE - * - * Inputs: BitStreamInfo struct pointing to start of LFE (14496-3, table 4.4.9) - * - * Outputs: updated element instance tag - * - * Return: 0 if successful, -1 if error - * - * Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) + Function: DecodeLFEChannelElement + + Description: decode one LFE + + Inputs: BitStreamInfo struct pointing to start of LFE (14496-3, table 4.4.9) + + Outputs: updated element instance tag + + Return: 0 if successful, -1 if error + + Notes: doesn't decode individual channel stream (part of DecodeNoiselessData) **************************************************************************************/ -static int DecodeLFEChannelElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) -{ - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; +static int DecodeLFEChannelElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) { + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } - /* read instance tag */ - aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); + /* read instance tag */ + aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); - return 0; + return 0; } /************************************************************************************** - * Function: DecodeDataStreamElement - * - * Description: decode one DSE - * - * Inputs: BitStreamInfo struct pointing to start of DSE (14496-3, table 4.4.10) - * - * Outputs: updated element instance tag - * filled in data stream buffer - * - * Return: 0 if successful, -1 if error + Function: DecodeDataStreamElement + + Description: decode one DSE + + Inputs: BitStreamInfo struct pointing to start of DSE (14496-3, table 4.4.10) + + Outputs: updated element instance tag + filled in data stream buffer + + Return: 0 if successful, -1 if error **************************************************************************************/ -static int DecodeDataStreamElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) -{ - unsigned int byteAlign, dataCount; - unsigned char *dataBuf; - PSInfoBase *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); - byteAlign = GetBits(bsi, 1); - dataCount = GetBits(bsi, 8); - if (dataCount == 255) - dataCount += GetBits(bsi, 8); - - if (byteAlign) - ByteAlignBitstream(bsi); - - psi->dataCount = dataCount; - dataBuf = psi->dataBuf; - while (dataCount--) - *dataBuf++ = GetBits(bsi, 8); - - return 0; +static int DecodeDataStreamElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) { + unsigned int byteAlign, dataCount; + unsigned char *dataBuf; + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + aacDecInfo->currInstTag = GetBits(bsi, NUM_INST_TAG_BITS); + byteAlign = GetBits(bsi, 1); + dataCount = GetBits(bsi, 8); + if (dataCount == 255) { + dataCount += GetBits(bsi, 8); + } + + if (byteAlign) { + ByteAlignBitstream(bsi); + } + + psi->dataCount = dataCount; + dataBuf = psi->dataBuf; + while (dataCount--) { + *dataBuf++ = GetBits(bsi, 8); + } + + return 0; } /************************************************************************************** - * Function: DecodeProgramConfigElement - * - * Description: decode one PCE - * - * Inputs: BitStreamInfo struct pointing to start of PCE (14496-3, table 4.4.2) - * - * Outputs: filled-in ProgConfigElement struct - * updated BitStreamInfo struct - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: #define KEEP_PCE_COMMENTS to save the comment field of the PCE - * (otherwise we just skip it in the bitstream, to save memory) + Function: DecodeProgramConfigElement + + Description: decode one PCE + + Inputs: BitStreamInfo struct pointing to start of PCE (14496-3, table 4.4.2) + + Outputs: filled-in ProgConfigElement struct + updated BitStreamInfo struct + + Return: 0 if successful, error code (< 0) if error + + Notes: #define KEEP_PCE_COMMENTS to save the comment field of the PCE + (otherwise we just skip it in the bitstream, to save memory) **************************************************************************************/ -int DecodeProgramConfigElement(ProgConfigElement *pce, BitStreamInfo *bsi) -{ - int i; - - pce->elemInstTag = GetBits(bsi, 4); - pce->profile = GetBits(bsi, 2); - pce->sampRateIdx = GetBits(bsi, 4); - pce->numFCE = GetBits(bsi, 4); - pce->numSCE = GetBits(bsi, 4); - pce->numBCE = GetBits(bsi, 4); - pce->numLCE = GetBits(bsi, 2); - pce->numADE = GetBits(bsi, 3); - pce->numCCE = GetBits(bsi, 4); - - pce->monoMixdown = GetBits(bsi, 1) << 4; /* present flag */ - if (pce->monoMixdown) - pce->monoMixdown |= GetBits(bsi, 4); /* element number */ - - pce->stereoMixdown = GetBits(bsi, 1) << 4; /* present flag */ - if (pce->stereoMixdown) - pce->stereoMixdown |= GetBits(bsi, 4); /* element number */ - - pce->matrixMixdown = GetBits(bsi, 1) << 4; /* present flag */ - if (pce->matrixMixdown) { - pce->matrixMixdown |= GetBits(bsi, 2) << 1; /* index */ - pce->matrixMixdown |= GetBits(bsi, 1); /* pseudo-surround enable */ - } - - for (i = 0; i < pce->numFCE; i++) { - pce->fce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ - pce->fce[i] |= GetBits(bsi, 4); /* tag select */ - } - - for (i = 0; i < pce->numSCE; i++) { - pce->sce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ - pce->sce[i] |= GetBits(bsi, 4); /* tag select */ - } - - for (i = 0; i < pce->numBCE; i++) { - pce->bce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ - pce->bce[i] |= GetBits(bsi, 4); /* tag select */ - } - - for (i = 0; i < pce->numLCE; i++) - pce->lce[i] = GetBits(bsi, 4); /* tag select */ - - for (i = 0; i < pce->numADE; i++) - pce->ade[i] = GetBits(bsi, 4); /* tag select */ - - for (i = 0; i < pce->numCCE; i++) { - pce->cce[i] = GetBits(bsi, 1) << 4; /* independent/dependent flag */ - pce->cce[i] |= GetBits(bsi, 4); /* tag select */ - } - - - ByteAlignBitstream(bsi); +int DecodeProgramConfigElement(ProgConfigElement *pce, BitStreamInfo *bsi) { + int i; + + pce->elemInstTag = GetBits(bsi, 4); + pce->profile = GetBits(bsi, 2); + pce->sampRateIdx = GetBits(bsi, 4); + pce->numFCE = GetBits(bsi, 4); + pce->numSCE = GetBits(bsi, 4); + pce->numBCE = GetBits(bsi, 4); + pce->numLCE = GetBits(bsi, 2); + pce->numADE = GetBits(bsi, 3); + pce->numCCE = GetBits(bsi, 4); + + pce->monoMixdown = GetBits(bsi, 1) << 4; /* present flag */ + if (pce->monoMixdown) { + pce->monoMixdown |= GetBits(bsi, 4); /* element number */ + } + + pce->stereoMixdown = GetBits(bsi, 1) << 4; /* present flag */ + if (pce->stereoMixdown) { + pce->stereoMixdown |= GetBits(bsi, 4); /* element number */ + } + + pce->matrixMixdown = GetBits(bsi, 1) << 4; /* present flag */ + if (pce->matrixMixdown) { + pce->matrixMixdown |= GetBits(bsi, 2) << 1; /* index */ + pce->matrixMixdown |= GetBits(bsi, 1); /* pseudo-surround enable */ + } + + for (i = 0; i < pce->numFCE; i++) { + pce->fce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ + pce->fce[i] |= GetBits(bsi, 4); /* tag select */ + } + + for (i = 0; i < pce->numSCE; i++) { + pce->sce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ + pce->sce[i] |= GetBits(bsi, 4); /* tag select */ + } + + for (i = 0; i < pce->numBCE; i++) { + pce->bce[i] = GetBits(bsi, 1) << 4; /* is_cpe flag */ + pce->bce[i] |= GetBits(bsi, 4); /* tag select */ + } + + for (i = 0; i < pce->numLCE && i < MAX_NUM_LCE; i++) { + pce->lce[i] = GetBits(bsi, 4); /* tag select */ + } + + for (i = 0; i < pce->numADE && i < MAX_NUM_ADE; i++) { + pce->ade[i] = GetBits(bsi, 4); /* tag select */ + } + + for (i = 0; i < pce->numCCE; i++) { + pce->cce[i] = GetBits(bsi, 1) << 4; /* independent/dependent flag */ + pce->cce[i] |= GetBits(bsi, 4); /* tag select */ + } + + + ByteAlignBitstream(bsi); #ifdef KEEP_PCE_COMMENTS - pce->commentBytes = GetBits(bsi, 8); - for (i = 0; i < pce->commentBytes; i++) - pce->commentField[i] = GetBits(bsi, 8); + pce->commentBytes = GetBits(bsi, 8); + for (i = 0; i < pce->commentBytes; i++) { + pce->commentField[i] = GetBits(bsi, 8); + } #else - /* eat comment bytes and throw away */ - i = GetBits(bsi, 8); - while (i--) - GetBits(bsi, 8); + /* eat comment bytes and throw away */ + i = GetBits(bsi, 8); + while (i--) { + GetBits(bsi, 8); + } #endif - return 0; + return 0; } /************************************************************************************** - * Function: DecodeFillElement - * - * Description: decode one fill element - * - * Inputs: BitStreamInfo struct pointing to start of fill element - * (14496-3, table 4.4.11) - * - * Outputs: updated element instance tag - * unpacked extension payload - * - * Return: 0 if successful, -1 if error - **************************************************************************************/ -static int DecodeFillElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) -{ - unsigned int fillCount; - unsigned char *fillBuf; - PSInfoBase *psi; + Function: DecodeFillElement - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + Description: decode one fill element - fillCount = GetBits(bsi, 4); - if (fillCount == 15) - fillCount += (GetBits(bsi, 8) - 1); + Inputs: BitStreamInfo struct pointing to start of fill element + (14496-3, table 4.4.11) - psi->fillCount = fillCount; - fillBuf = psi->fillBuf; - while (fillCount--) - *fillBuf++ = GetBits(bsi, 8); + Outputs: updated element instance tag + unpacked extension payload - aacDecInfo->currInstTag = -1; /* fill elements don't have instance tag */ - aacDecInfo->fillExtType = 0; + Return: 0 if successful, -1 if error + **************************************************************************************/ +static int DecodeFillElement(AACDecInfo *aacDecInfo, BitStreamInfo *bsi) { + unsigned int fillCount; + unsigned char *fillBuf; + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + fillCount = GetBits(bsi, 4); + if (fillCount == 15) { + fillCount += (GetBits(bsi, 8) - 1); + } + + psi->fillCount = fillCount; + fillBuf = psi->fillBuf; + while (fillCount--) { + *fillBuf++ = GetBits(bsi, 8); + } + + aacDecInfo->currInstTag = -1; /* fill elements don't have instance tag */ + aacDecInfo->fillExtType = 0; #ifdef AAC_ENABLE_SBR - /* check for SBR - * aacDecInfo->sbrEnabled is sticky (reset each raw_data_block), so for multichannel - * need to verify that all SCE/CPE/ICCE have valid SBR fill element following, and - * must upsample by 2 for LFE - */ - if (psi->fillCount > 0) { - aacDecInfo->fillExtType = (int)((psi->fillBuf[0] >> 4) & 0x0f); - if (aacDecInfo->fillExtType == EXT_SBR_DATA || aacDecInfo->fillExtType == EXT_SBR_DATA_CRC) - aacDecInfo->sbrEnabled = 1; - } + /* check for SBR + aacDecInfo->sbrEnabled is sticky (reset each raw_data_block), so for multichannel + need to verify that all SCE/CPE/ICCE have valid SBR fill element following, and + must upsample by 2 for LFE + */ + if (psi->fillCount > 0) { + aacDecInfo->fillExtType = (int)((psi->fillBuf[0] >> 4) & 0x0f); + if (aacDecInfo->fillExtType == EXT_SBR_DATA || aacDecInfo->fillExtType == EXT_SBR_DATA_CRC) { + aacDecInfo->sbrEnabled = 1; + } + } #endif - aacDecInfo->fillBuf = psi->fillBuf; - aacDecInfo->fillCount = psi->fillCount; + aacDecInfo->fillBuf = psi->fillBuf; + aacDecInfo->fillCount = psi->fillCount; - return 0; + return 0; } /************************************************************************************** - * Function: DecodeNextElement - * - * Description: decode next syntactic element in AAC frame - * - * Inputs: valid AACDecInfo struct - * double pointer to buffer containing next element - * pointer to bit offset - * pointer to number of valid bits remaining in buf - * - * Outputs: type of element decoded (aacDecInfo->currBlockID) - * type of element decoded last time (aacDecInfo->prevBlockID) - * updated aacDecInfo state, depending on which element was decoded - * updated buffer pointer - * updated bit offset - * updated number of available bits - * - * Return: 0 if successful, error code (< 0) if error + Function: DecodeNextElement + + Description: decode next syntactic element in AAC frame + + Inputs: valid AACDecInfo struct + double pointer to buffer containing next element + pointer to bit offset + pointer to number of valid bits remaining in buf + + Outputs: type of element decoded (aacDecInfo->currBlockID) + type of element decoded last time (aacDecInfo->prevBlockID) + updated aacDecInfo state, depending on which element was decoded + updated buffer pointer + updated bit offset + updated number of available bits + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int DecodeNextElement(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) -{ - int err, bitsUsed; - PSInfoBase *psi; - BitStreamInfo bsi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - /* init bitstream reader */ - SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); - GetBits(&bsi, *bitOffset); - - /* read element ID (save last ID for SBR purposes) */ - aacDecInfo->prevBlockID = aacDecInfo->currBlockID; - aacDecInfo->currBlockID = GetBits(&bsi, NUM_SYN_ID_BITS); - - /* set defaults (could be overwritten by DecodeXXXElement(), depending on currBlockID) */ - psi->commonWin = 0; - - err = 0; - switch (aacDecInfo->currBlockID) { - case AAC_ID_SCE: - err = DecodeSingleChannelElement(aacDecInfo, &bsi); - break; - case AAC_ID_CPE: - err = DecodeChannelPairElement(aacDecInfo, &bsi); - break; - case AAC_ID_CCE: - /* TODO - implement CCE decoding */ - break; - case AAC_ID_LFE: - err = DecodeLFEChannelElement(aacDecInfo, &bsi); - break; - case AAC_ID_DSE: - err = DecodeDataStreamElement(aacDecInfo, &bsi); - break; - case AAC_ID_PCE: - err = DecodeProgramConfigElement(psi->pce + 0, &bsi); - break; - case AAC_ID_FIL: - err = DecodeFillElement(aacDecInfo, &bsi); - break; - case AAC_ID_END: - break; - } - if (err) - return ERR_AAC_SYNTAX_ELEMENT; - - /* update bitstream reader */ - bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); - *buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - *bitsAvail -= bitsUsed; - - if (*bitsAvail < 0) - return ERR_AAC_INDATA_UNDERFLOW; - - return ERR_AAC_NONE; +int DecodeNextElement(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) { + int err, bitsUsed; + PSInfoBase *psi; + BitStreamInfo bsi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + /* init bitstream reader */ + SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); + GetBits(&bsi, *bitOffset); + + /* read element ID (save last ID for SBR purposes) */ + aacDecInfo->prevBlockID = aacDecInfo->currBlockID; + aacDecInfo->currBlockID = GetBits(&bsi, NUM_SYN_ID_BITS); + + /* set defaults (could be overwritten by DecodeXXXElement(), depending on currBlockID) */ + psi->commonWin = 0; + + err = 0; + switch (aacDecInfo->currBlockID) { + case AAC_ID_SCE: + err = DecodeSingleChannelElement(aacDecInfo, &bsi); + break; + case AAC_ID_CPE: + err = DecodeChannelPairElement(aacDecInfo, &bsi); + break; + case AAC_ID_CCE: + /* TODO - implement CCE decoding */ + break; + case AAC_ID_LFE: + err = DecodeLFEChannelElement(aacDecInfo, &bsi); + break; + case AAC_ID_DSE: + err = DecodeDataStreamElement(aacDecInfo, &bsi); + break; + case AAC_ID_PCE: + err = DecodeProgramConfigElement(psi->pce + 0, &bsi); + break; + case AAC_ID_FIL: + err = DecodeFillElement(aacDecInfo, &bsi); + break; + case AAC_ID_END: + break; + } + if (err) { + return ERR_AAC_SYNTAX_ELEMENT; + } + + /* update bitstream reader */ + bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); + *buf += (bitsUsed + *bitOffset) >> 3; + *bitOffset = (bitsUsed + *bitOffset) & 0x07; + *bitsAvail -= bitsUsed; + + if (*bitsAvail < 0) { + return ERR_AAC_INDATA_UNDERFLOW; + } + + return ERR_AAC_NONE; } diff --git a/src/libhelix-aac/dequant.c b/src/libhelix-aac/dequant.c index 5f511664..c66c8a4f 100644 --- a/src/libhelix-aac/dequant.c +++ b/src/libhelix-aac/dequant.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: dequant.c,v 1.2 2005/05/20 18:05:41 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: dequant.c,v 1.2 2005/05/20 18:05:41 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * dequant.c - transform coefficient dequantization and short-block deinterleaving + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + dequant.c - transform coefficient dequantization and short-block deinterleaving **************************************************************************************/ #include "coder.h" @@ -49,67 +49,67 @@ #define SF_OFFSET 100 /* pow(2, i/4.0) for i = [0,1,2,3], format = Q30 */ -static const int pow14[4] PROGMEM = { - 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 +static const int pow14[4] PROGMEM = { + 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 }; -/* pow(2, i/4.0) * pow(j, 4.0/3.0) for i = [0,1,2,3], j = [0,1,2,...,15] - * format = Q28 for j = [0-3], Q25 for j = [4-15] - */ +/* pow(2, i/4.0) * pow(j, 4.0/3.0) for i = [0,1,2,3], j = [0,1,2,...,15] + format = Q28 for j = [0-3], Q25 for j = [4-15] +*/ static const int pow43_14[4][16] PROGMEM = { - { - 0x00000000, 0x10000000, 0x285145f3, 0x453a5cdb, /* Q28 */ - 0x0cb2ff53, 0x111989d6, 0x15ce31c8, 0x1ac7f203, /* Q25 */ - 0x20000000, 0x257106b9, 0x2b16b4a3, 0x30ed74b4, /* Q25 */ - 0x36f23fa5, 0x3d227bd3, 0x437be656, 0x49fc823c, /* Q25 */ - }, - { - 0x00000000, 0x1306fe0a, 0x2ff221af, 0x52538f52, - 0x0f1a1bf4, 0x1455ccc2, 0x19ee62a8, 0x1fd92396, - 0x260dfc14, 0x2c8694d8, 0x333dcb29, 0x3a2f5c7a, - 0x4157aed5, 0x48b3aaa3, 0x50409f76, 0x57fc3010, - }, - { - 0x00000000, 0x16a09e66, 0x39047c0f, 0x61e734aa, - 0x11f59ac4, 0x182ec633, 0x1ed66a45, 0x25dfc55a, - 0x2d413ccd, 0x34f3462d, 0x3cefc603, 0x4531ab69, - 0x4db4adf8, 0x56752054, 0x5f6fcfcd, 0x68a1eca1, - }, - { - 0x00000000, 0x1ae89f99, 0x43ce3e4b, 0x746d57b2, - 0x155b8109, 0x1cc21cdc, 0x24ac1839, 0x2d0a479e, - 0x35d13f33, 0x3ef80748, 0x48775c93, 0x524938cd, - 0x5c68841d, 0x66d0df0a, 0x717e7bfe, 0x7c6e0305, - }, + { + 0x00000000, 0x10000000, 0x285145f3, 0x453a5cdb, /* Q28 */ + 0x0cb2ff53, 0x111989d6, 0x15ce31c8, 0x1ac7f203, /* Q25 */ + 0x20000000, 0x257106b9, 0x2b16b4a3, 0x30ed74b4, /* Q25 */ + 0x36f23fa5, 0x3d227bd3, 0x437be656, 0x49fc823c, /* Q25 */ + }, + { + 0x00000000, 0x1306fe0a, 0x2ff221af, 0x52538f52, + 0x0f1a1bf4, 0x1455ccc2, 0x19ee62a8, 0x1fd92396, + 0x260dfc14, 0x2c8694d8, 0x333dcb29, 0x3a2f5c7a, + 0x4157aed5, 0x48b3aaa3, 0x50409f76, 0x57fc3010, + }, + { + 0x00000000, 0x16a09e66, 0x39047c0f, 0x61e734aa, + 0x11f59ac4, 0x182ec633, 0x1ed66a45, 0x25dfc55a, + 0x2d413ccd, 0x34f3462d, 0x3cefc603, 0x4531ab69, + 0x4db4adf8, 0x56752054, 0x5f6fcfcd, 0x68a1eca1, + }, + { + 0x00000000, 0x1ae89f99, 0x43ce3e4b, 0x746d57b2, + 0x155b8109, 0x1cc21cdc, 0x24ac1839, 0x2d0a479e, + 0x35d13f33, 0x3ef80748, 0x48775c93, 0x524938cd, + 0x5c68841d, 0x66d0df0a, 0x717e7bfe, 0x7c6e0305, + }, }; /* pow(j, 4.0 / 3.0) for j = [16,17,18,...,63], format = Q23 */ static const int pow43[48] PROGMEM = { - 0x1428a2fa, 0x15db1bd6, 0x1796302c, 0x19598d85, - 0x1b24e8bb, 0x1cf7fcfa, 0x1ed28af2, 0x20b4582a, - 0x229d2e6e, 0x248cdb55, 0x26832fda, 0x28800000, - 0x2a832287, 0x2c8c70a8, 0x2e9bc5d8, 0x30b0ff99, - 0x32cbfd4a, 0x34eca001, 0x3712ca62, 0x393e6088, - 0x3b6f47e0, 0x3da56717, 0x3fe0a5fc, 0x4220ed72, - 0x44662758, 0x46b03e7c, 0x48ff1e87, 0x4b52b3f3, - 0x4daaebfd, 0x5007b497, 0x5268fc62, 0x54ceb29c, - 0x5738c721, 0x59a72a59, 0x5c19cd35, 0x5e90a129, - 0x610b9821, 0x638aa47f, 0x660db90f, 0x6894c90b, - 0x6b1fc80c, 0x6daeaa0d, 0x70416360, 0x72d7e8b0, - 0x75722ef9, 0x78102b85, 0x7ab1d3ec, 0x7d571e09, + 0x1428a2fa, 0x15db1bd6, 0x1796302c, 0x19598d85, + 0x1b24e8bb, 0x1cf7fcfa, 0x1ed28af2, 0x20b4582a, + 0x229d2e6e, 0x248cdb55, 0x26832fda, 0x28800000, + 0x2a832287, 0x2c8c70a8, 0x2e9bc5d8, 0x30b0ff99, + 0x32cbfd4a, 0x34eca001, 0x3712ca62, 0x393e6088, + 0x3b6f47e0, 0x3da56717, 0x3fe0a5fc, 0x4220ed72, + 0x44662758, 0x46b03e7c, 0x48ff1e87, 0x4b52b3f3, + 0x4daaebfd, 0x5007b497, 0x5268fc62, 0x54ceb29c, + 0x5738c721, 0x59a72a59, 0x5c19cd35, 0x5e90a129, + 0x610b9821, 0x638aa47f, 0x660db90f, 0x6894c90b, + 0x6b1fc80c, 0x6daeaa0d, 0x70416360, 0x72d7e8b0, + 0x75722ef9, 0x78102b85, 0x7ab1d3ec, 0x7d571e09, }; /* sqrt(0.5), format = Q31 */ #define SQRTHALF 0x5a82799a -/* Minimax polynomial approximation to pow(x, 4/3), over the range - * poly43lo: x = [0.5, 0.7071] - * poly43hi: x = [0.7071, 1.0] - * - * Relative error < 1E-7 - * Coefs are scaled by 4, 2, 1, 0.5, 0.25 - */ - +/* Minimax polynomial approximation to pow(x, 4/3), over the range + poly43lo: x = [0.5, 0.7071] + poly43hi: x = [0.7071, 1.0] + + Relative error < 1E-7 + Coefs are scaled by 4, 2, 1, 0.5, 0.25 +*/ + //fb #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" @@ -122,252 +122,260 @@ static const int pow2exp[8] PROGMEM = { 14, 13, 11, 10, 9, 7, 6, 5 }; /* pow2exp[i] = pow(2, i*4/3) fraction */ static const int pow2frac[8] PROGMEM = { - 0x6597fa94, 0x50a28be6, 0x7fffffff, 0x6597fa94, - 0x50a28be6, 0x7fffffff, 0x6597fa94, 0x50a28be6 + 0x6597fa94, 0x50a28be6, 0x7fffffff, 0x6597fa94, + 0x50a28be6, 0x7fffffff, 0x6597fa94, 0x50a28be6 }; /************************************************************************************** - * Function: DequantBlock - * - * Description: dequantize one block of transform coefficients (in-place) - * - * Inputs: quantized transform coefficients, range = [0, 8191] - * number of samples to dequantize - * scalefactor for this block of data, range = [0, 256] - * - * Outputs: dequantized transform coefficients in Q(FBITS_OUT_DQ_OFF) - * - * Return: guard bit mask (OR of abs value of all dequantized coefs) - * - * Notes: applies dequant formula y = pow(x, 4.0/3.0) * pow(2, (scale - 100)/4.0) + Function: DequantBlock + + Description: dequantize one block of transform coefficients (in-place) + + Inputs: quantized transform coefficients, range = [0, 8191] + number of samples to dequantize + scalefactor for this block of data, range = [0, 256] + + Outputs: dequantized transform coefficients in Q(FBITS_OUT_DQ_OFF) + + Return: guard bit mask (OR of abs value of all dequantized coefs) + + Notes: applies dequant formula y = pow(x, 4.0/3.0) * pow(2, (scale - 100)/4.0) * * pow(2, FBITS_OUT_DQ_OFF) - * clips outputs to Q(FBITS_OUT_DQ_OFF) - * output has no minimum number of guard bits + clips outputs to Q(FBITS_OUT_DQ_OFF) + output has no minimum number of guard bits **************************************************************************************/ -static int DequantBlock(int *inbuf, int nSamps, int scale) -{ - int iSamp, scalef, scalei, x, y, gbMask, shift, tab4[4]; - const int *tab16, *coef; - - if (nSamps <= 0) - return 0; - - scale -= SF_OFFSET; /* new range = [-100, 156] */ - - /* with two's complement numbers, scalei/scalef factorization works for pos and neg values of scale: - * [+4...+7] >> 2 = +1, [ 0...+3] >> 2 = 0, [-4...-1] >> 2 = -1, [-8...-5] >> 2 = -2 ... - * (-1 & 0x3) = 3, (-2 & 0x3) = 2, (-3 & 0x3) = 1, (0 & 0x3) = 0 - * - * Example: 2^(-5/4) = 2^(-1) * 2^(-1/4) = 2^-2 * 2^(3/4) - */ - tab16 = pow43_14[scale & 0x3]; - scalef = pow14[scale & 0x3]; - scalei = (scale >> 2) + FBITS_OUT_DQ_OFF; - - /* cache first 4 values: - * tab16[j] = Q28 for j = [0,3] - * tab4[x] = x^(4.0/3.0) * 2^(0.25*scale), Q(FBITS_OUT_DQ_OFF) - */ - shift = 28 - scalei; - if (shift > 31) { - tab4[0] = tab4[1] = tab4[2] = tab4[3] = 0; - } else if (shift <= 0) { - shift = -shift; - if (shift > 31) - shift = 31; - for (x = 0; x < 4; x++) { - y = tab16[x]; - if (y > (0x7fffffff >> shift)) - y = 0x7fffffff; /* clip (rare) */ - else - y <<= shift; - tab4[x] = y; - } - } else { - tab4[0] = 0; - tab4[1] = tab16[1] >> shift; - tab4[2] = tab16[2] >> shift; - tab4[3] = tab16[3] >> shift; - } - - gbMask = 0; - do { - iSamp = *inbuf; - x = FASTABS(iSamp); - - if (x < 4) { - y = tab4[x]; - } else { - - if (x < 16) { - /* result: y = Q25 (tab16 = Q25) */ - y = tab16[x]; - shift = 25 - scalei; - } else if (x < 64) { - /* result: y = Q21 (pow43tab[j] = Q23, scalef = Q30) */ - y = pow43[x-16]; - shift = 21 - scalei; - y = MULSHIFT32(y, scalef); - } else { - /* normalize to [0x40000000, 0x7fffffff] - * input x = [64, 8191] = [64, 2^13-1] - * ranges: - * shift = 7: 64 - 127 - * shift = 6: 128 - 255 - * shift = 5: 256 - 511 - * shift = 4: 512 - 1023 - * shift = 3: 1024 - 2047 - * shift = 2: 2048 - 4095 - * shift = 1: 4096 - 8191 - */ - x <<= 17; - shift = 0; - if (x < 0x08000000) - x <<= 4, shift += 4; - if (x < 0x20000000) - x <<= 2, shift += 2; - if (x < 0x40000000) - x <<= 1, shift += 1; - - coef = (x < SQRTHALF) ? poly43lo : poly43hi; - - /* polynomial */ - y = coef[0]; - y = MULSHIFT32(y, x) + coef[1]; - y = MULSHIFT32(y, x) + coef[2]; - y = MULSHIFT32(y, x) + coef[3]; - y = MULSHIFT32(y, x) + coef[4]; - y = MULSHIFT32(y, pow2frac[shift]) << 3; - - /* fractional scale - * result: y = Q21 (pow43tab[j] = Q23, scalef = Q30) - */ - y = MULSHIFT32(y, scalef); /* now y is Q24 */ - shift = 24 - scalei - pow2exp[shift]; - } - - /* integer scale */ - if (shift <= 0) { - shift = -shift; - if (shift > 31) - shift = 31; - - if (y > (0x7fffffff >> shift)) - y = 0x7fffffff; /* clip (rare) */ - else - y <<= shift; - } else { - if (shift > 31) - shift = 31; - y >>= shift; - } - } - - /* sign and store (gbMask used to count GB's) */ - gbMask |= y; - - /* apply sign */ - iSamp >>= 31; - y ^= iSamp; - y -= iSamp; - - *inbuf++ = y; - } while (--nSamps); - - return gbMask; +static int DequantBlock(int *inbuf, int nSamps, int scale) { + int iSamp, scalef, scalei, x, y, gbMask, shift, tab4[4]; + const int *tab16, *coef; + + if (nSamps <= 0) { + return 0; + } + + scale -= SF_OFFSET; /* new range = [-100, 156] */ + + /* with two's complement numbers, scalei/scalef factorization works for pos and neg values of scale: + [+4...+7] >> 2 = +1, [ 0...+3] >> 2 = 0, [-4...-1] >> 2 = -1, [-8...-5] >> 2 = -2 ... + (-1 & 0x3) = 3, (-2 & 0x3) = 2, (-3 & 0x3) = 1, (0 & 0x3) = 0 + + Example: 2^(-5/4) = 2^(-1) * 2^(-1/4) = 2^-2 * 2^(3/4) + */ + tab16 = pow43_14[scale & 0x3]; + scalef = pow14[scale & 0x3]; + scalei = (scale >> 2) + FBITS_OUT_DQ_OFF; + + /* cache first 4 values: + tab16[j] = Q28 for j = [0,3] + tab4[x] = x^(4.0/3.0) * 2^(0.25*scale), Q(FBITS_OUT_DQ_OFF) + */ + shift = 28 - scalei; + if (shift > 31) { + tab4[0] = tab4[1] = tab4[2] = tab4[3] = 0; + } else if (shift <= 0) { + shift = -shift; + if (shift > 31) { + shift = 31; + } + for (x = 0; x < 4; x++) { + y = tab16[x]; + if (y > (0x7fffffff >> shift)) { + y = 0x7fffffff; /* clip (rare) */ + } else { + y <<= shift; + } + tab4[x] = y; + } + } else { + tab4[0] = 0; + tab4[1] = tab16[1] >> shift; + tab4[2] = tab16[2] >> shift; + tab4[3] = tab16[3] >> shift; + } + + gbMask = 0; + do { + iSamp = *inbuf; + x = FASTABS(iSamp); + + if (x < 4) { + y = tab4[x]; + } else { + + if (x < 16) { + /* result: y = Q25 (tab16 = Q25) */ + y = tab16[x]; + shift = 25 - scalei; + } else if (x < 64) { + /* result: y = Q21 (pow43tab[j] = Q23, scalef = Q30) */ + y = pow43[x - 16]; + shift = 21 - scalei; + y = MULSHIFT32(y, scalef); + } else { + /* normalize to [0x40000000, 0x7fffffff] + input x = [64, 8191] = [64, 2^13-1] + ranges: + shift = 7: 64 - 127 + shift = 6: 128 - 255 + shift = 5: 256 - 511 + shift = 4: 512 - 1023 + shift = 3: 1024 - 2047 + shift = 2: 2048 - 4095 + shift = 1: 4096 - 8191 + */ + x <<= 17; + shift = 0; + if (x < 0x08000000) { + x <<= 4, shift += 4; + } + if (x < 0x20000000) { + x <<= 2, shift += 2; + } + if (x < 0x40000000) { + x <<= 1, shift += 1; + } + + coef = (x < SQRTHALF) ? poly43lo : poly43hi; + + /* polynomial */ + y = coef[0]; + y = MULSHIFT32(y, x) + coef[1]; + y = MULSHIFT32(y, x) + coef[2]; + y = MULSHIFT32(y, x) + coef[3]; + y = MULSHIFT32(y, x) + coef[4]; + y = MULSHIFT32(y, pow2frac[shift]) << 3; + + /* fractional scale + result: y = Q21 (pow43tab[j] = Q23, scalef = Q30) + */ + y = MULSHIFT32(y, scalef); /* now y is Q24 */ + shift = 24 - scalei - pow2exp[shift]; + } + + /* integer scale */ + if (shift <= 0) { + shift = -shift; + if (shift > 31) { + shift = 31; + } + + if (y > (0x7fffffff >> shift)) { + y = 0x7fffffff; /* clip (rare) */ + } else { + y <<= shift; + } + } else { + if (shift > 31) { + shift = 31; + } + y >>= shift; + } + } + + /* sign and store (gbMask used to count GB's) */ + gbMask |= y; + + /* apply sign */ + iSamp >>= 31; + y ^= iSamp; + y -= iSamp; + + *inbuf++ = y; + } while (--nSamps); + + return gbMask; } /************************************************************************************** - * Function: Dequantize - * - * Description: dequantize all transform coefficients for one channel - * - * Inputs: valid AACDecInfo struct (including unpacked, quantized coefficients) - * index of current channel - * - * Outputs: dequantized coefficients, including short-block deinterleaving - * flags indicating if intensity and/or PNS is active - * minimum guard bit count for dequantized coefficients - * - * Return: 0 if successful, error code (< 0) if error + Function: Dequantize + + Description: dequantize all transform coefficients for one channel + + Inputs: valid AACDecInfo struct (including unpacked, quantized coefficients) + index of current channel + + Outputs: dequantized coefficients, including short-block deinterleaving + flags indicating if intensity and/or PNS is active + minimum guard bit count for dequantized coefficients + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int Dequantize(AACDecInfo *aacDecInfo, int ch) -{ - int gp, cb, sfb, win, width, nSamps, gbMask; - int *coef; - const int /*short*/ *sfbTab; - unsigned char *sfbCodeBook; - short *scaleFactors; - PSInfoBase *psi; - ICSInfo *icsInfo; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - if (icsInfo->winSequence == 2) { - sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; - nSamps = NSAMPS_SHORT; - } else { - sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; - nSamps = NSAMPS_LONG; - } - coef = psi->coef[ch]; - sfbCodeBook = psi->sfbCodeBook[ch]; - scaleFactors = psi->scaleFactors[ch]; - - psi->intensityUsed[ch] = 0; - psi->pnsUsed[ch] = 0; - gbMask = 0; - for (gp = 0; gp < icsInfo->numWinGroup; gp++) { - for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { - for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { - /* dequantize one scalefactor band (not necessary if codebook is intensity or PNS) - * for zero codebook, still run dequantizer in case non-zero pulse data was added - */ - cb = (int)(sfbCodeBook[sfb]); - width = sfbTab[sfb+1] - sfbTab[sfb]; - if (cb >= 0 && cb <= 11) - gbMask |= DequantBlock(coef, width, scaleFactors[sfb]); - else if (cb == 13) - psi->pnsUsed[ch] = 1; - else if (cb == 14 || cb == 15) - psi->intensityUsed[ch] = 1; /* should only happen if ch == 1 */ - coef += width; - } - coef += (nSamps - sfbTab[icsInfo->maxSFB]); - } - sfbCodeBook += icsInfo->maxSFB; - scaleFactors += icsInfo->maxSFB; - } - aacDecInfo->pnsUsed |= psi->pnsUsed[ch]; /* set flag if PNS used for any channel */ - - /* calculate number of guard bits in dequantized data */ - psi->gbCurrent[ch] = CLZ(gbMask) - 1; - - return ERR_AAC_NONE; +int Dequantize(AACDecInfo *aacDecInfo, int ch) { + int gp, cb, sfb, win, width, nSamps, gbMask; + int *coef; + const int /*short*/ *sfbTab; + unsigned char *sfbCodeBook; + short *scaleFactors; + PSInfoBase *psi; + ICSInfo *icsInfo; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + if (icsInfo->winSequence == 2) { + sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; + nSamps = NSAMPS_SHORT; + } else { + sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; + nSamps = NSAMPS_LONG; + } + coef = psi->coef[ch]; + sfbCodeBook = psi->sfbCodeBook[ch]; + scaleFactors = psi->scaleFactors[ch]; + + psi->intensityUsed[ch] = 0; + psi->pnsUsed[ch] = 0; + gbMask = 0; + for (gp = 0; gp < icsInfo->numWinGroup; gp++) { + for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { + for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { + /* dequantize one scalefactor band (not necessary if codebook is intensity or PNS) + for zero codebook, still run dequantizer in case non-zero pulse data was added + */ + cb = (int)(sfbCodeBook[sfb]); + width = sfbTab[sfb + 1] - sfbTab[sfb]; + if (cb >= 0 && cb <= 11) { + gbMask |= DequantBlock(coef, width, scaleFactors[sfb]); + } else if (cb == 13) { + psi->pnsUsed[ch] = 1; + } else if (cb == 14 || cb == 15) { + psi->intensityUsed[ch] = 1; /* should only happen if ch == 1 */ + } + coef += width; + } + coef += (nSamps - sfbTab[icsInfo->maxSFB]); + } + sfbCodeBook += icsInfo->maxSFB; + scaleFactors += icsInfo->maxSFB; + } + aacDecInfo->pnsUsed |= psi->pnsUsed[ch]; /* set flag if PNS used for any channel */ + + /* calculate number of guard bits in dequantized data */ + psi->gbCurrent[ch] = CLZ(gbMask) - 1; + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: DeinterleaveShortBlocks - * - * Description: deinterleave transform coefficients in short blocks for one channel - * - * Inputs: valid AACDecInfo struct (including unpacked, quantized coefficients) - * index of current channel - * - * Outputs: deinterleaved coefficients (window groups into 8 separate windows) - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: only necessary if deinterleaving not part of Huffman decoding + Function: DeinterleaveShortBlocks + + Description: deinterleave transform coefficients in short blocks for one channel + + Inputs: valid AACDecInfo struct (including unpacked, quantized coefficients) + index of current channel + + Outputs: deinterleaved coefficients (window groups into 8 separate windows) + + Return: 0 if successful, error code (< 0) if error + + Notes: only necessary if deinterleaving not part of Huffman decoding **************************************************************************************/ -int DeinterleaveShortBlocks(AACDecInfo *aacDecInfo, int ch) -{ - (void)aacDecInfo; - (void)ch; - /* not used for this implementation - short block deinterleaving performed during Huffman decoding */ - return ERR_AAC_NONE; +int DeinterleaveShortBlocks(AACDecInfo *aacDecInfo, int ch) { + (void)aacDecInfo; + (void)ch; + /* not used for this implementation - short block deinterleaving performed during Huffman decoding */ + return ERR_AAC_NONE; } diff --git a/src/libhelix-aac/fft.c b/src/libhelix-aac/fft.c index 0fc934ca..b60d6e4a 100644 --- a/src/libhelix-aac/fft.c +++ b/src/libhelix-aac/fft.c @@ -1,53 +1,54 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: fft.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +#pragma GCC optimize ("O3") +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: fft.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * fft.c - Ken's optimized radix-4 DIT FFT, optional radix-8 first pass for odd log2(N) + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + fft.c - Ken's optimized radix-4 DIT FFT, optional radix-8 first pass for odd log2(N) **************************************************************************************/ #include "coder.h" #include "assembly.h" #define NUM_FFT_SIZES 2 -static const int nfftTab[NUM_FFT_SIZES] PROGMEM ={64, 512}; +static const int nfftTab[NUM_FFT_SIZES] PROGMEM = {64, 512}; static const int nfftlog2Tab[NUM_FFT_SIZES] PROGMEM = {6, 9}; #define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */ @@ -56,338 +57,341 @@ static const int nfftlog2Tab[NUM_FFT_SIZES] PROGMEM = {6, 9}; t = p0; t1 = *(&(p0)+1); p0 = p1; *(&(p0)+1) = *(&(p1)+1); p1 = t; *(&(p1)+1) = t1 /************************************************************************************** - * Function: BitReverse - * - * Description: Ken's fast in-place bit reverse, using super-small table - * - * Inputs: buffer of samples - * table index (for transform size) - * - * Outputs: bit-reversed samples in same buffer - * - * Return: none + Function: BitReverse + + Description: Ken's fast in-place bit reverse, using super-small table + + Inputs: buffer of samples + table index (for transform size) + + Outputs: bit-reversed samples in same buffer + + Return: none **************************************************************************************/ - /*__attribute__ ((section (".data"))) */ static void BitReverse(int *inout, int tabidx) -{ +/*__attribute__ ((section (".data"))) */ static void BitReverse(int *inout, int tabidx) { int *part0, *part1; - int a,b, t,t1; - const unsigned char* tab = bitrevtab + bitrevtabOffset[tabidx]; - int nbits = nfftlog2Tab[tabidx]; + int a, b, t, t1; + const unsigned char* tab = bitrevtab + bitrevtabOffset[tabidx]; + int nbits = nfftlog2Tab[tabidx]; - part0 = inout; + part0 = inout; part1 = inout + (1 << nbits); - - while ((a = pgm_read_byte(tab++)) != 0) { - b = pgm_read_byte(tab++); - swapcplx(part0[4*a+0], part0[4*b+0]); /* 0xxx0 <-> 0yyy0 */ - swapcplx(part0[4*a+2], part1[4*b+0]); /* 0xxx1 <-> 1yyy0 */ - swapcplx(part1[4*a+0], part0[4*b+2]); /* 1xxx0 <-> 0yyy1 */ - swapcplx(part1[4*a+2], part1[4*b+2]); /* 1xxx1 <-> 1yyy1 */ +#ifdef ESP8266 + while ((a = pgm_read_byte(tab++)) != 0) { + b = pgm_read_byte(tab++); +#else + while ((a = *(tab++)) != 0) { + b = *(tab++); +#endif + + swapcplx(part0[4 * a + 0], part0[4 * b + 0]); /* 0xxx0 <-> 0yyy0 */ + swapcplx(part0[4 * a + 2], part1[4 * b + 0]); /* 0xxx1 <-> 1yyy0 */ + swapcplx(part1[4 * a + 0], part0[4 * b + 2]); /* 1xxx0 <-> 0yyy1 */ + swapcplx(part1[4 * a + 2], part1[4 * b + 2]); /* 1xxx1 <-> 1yyy1 */ } do { - swapcplx(part0[4*a+2], part1[4*a+0]); /* 0xxx1 <-> 1xxx0 */ + swapcplx(part0[4 * a + 2], part1[4 * a + 0]); /* 0xxx1 <-> 1xxx0 */ +#ifdef ESP8266 } while ((a = pgm_read_byte(tab++)) != 0); - - +#else + } while ((a = *(tab++)) != 0); +#endif + } /************************************************************************************** - * Function: R4FirstPass - * - * Description: radix-4 trivial pass for decimation-in-time FFT - * - * Inputs: buffer of (bit-reversed) samples - * number of R4 butterflies per group (i.e. nfft / 4) - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: assumes 2 guard bits, gains no integer bits, - * guard bits out = guard bits in - 2 + Function: R4FirstPass + + Description: radix-4 trivial pass for decimation-in-time FFT + + Inputs: buffer of (bit-reversed) samples + number of R4 butterflies per group (i.e. nfft / 4) + + Outputs: processed samples in same buffer + + Return: none + + Notes: assumes 2 guard bits, gains no integer bits, + guard bits out = guard bits in - 2 **************************************************************************************/ - /* __attribute__ ((section (".data"))) */ static void R4FirstPass(int *x, int bg) -{ +/* __attribute__ ((section (".data"))) */ static void R4FirstPass(int *x, int bg) { int ar, ai, br, bi, cr, ci, dr, di; - - for (; bg != 0; bg--) { - - ar = x[0] + x[2]; - br = x[0] - x[2]; - ai = x[1] + x[3]; - bi = x[1] - x[3]; - cr = x[4] + x[6]; - dr = x[4] - x[6]; - ci = x[5] + x[7]; - di = x[5] - x[7]; - - /* max per-sample gain = 4.0 (adding 4 inputs together) */ - x[0] = ar + cr; - x[4] = ar - cr; - x[1] = ai + ci; - x[5] = ai - ci; - x[2] = br + di; - x[6] = br - di; - x[3] = bi - dr; - x[7] = bi + dr; - - x += 8; - } + + for (; bg != 0; bg--) { + + ar = x[0] + x[2]; + br = x[0] - x[2]; + ai = x[1] + x[3]; + bi = x[1] - x[3]; + cr = x[4] + x[6]; + dr = x[4] - x[6]; + ci = x[5] + x[7]; + di = x[5] - x[7]; + + /* max per-sample gain = 4.0 (adding 4 inputs together) */ + x[0] = ar + cr; + x[4] = ar - cr; + x[1] = ai + ci; + x[5] = ai - ci; + x[2] = br + di; + x[6] = br - di; + x[3] = bi - dr; + x[7] = bi + dr; + + x += 8; + } } /************************************************************************************** - * Function: R8FirstPass - * - * Description: radix-8 trivial pass for decimation-in-time FFT - * - * Inputs: buffer of (bit-reversed) samples - * number of R8 butterflies per group (i.e. nfft / 8) - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: assumes 3 guard bits, gains 1 integer bit - * guard bits out = guard bits in - 3 (if inputs are full scale) - * or guard bits in - 2 (if inputs bounded to +/- sqrt(2)/2) - * see scaling comments in code + Function: R8FirstPass + + Description: radix-8 trivial pass for decimation-in-time FFT + + Inputs: buffer of (bit-reversed) samples + number of R8 butterflies per group (i.e. nfft / 8) + + Outputs: processed samples in same buffer + + Return: none + + Notes: assumes 3 guard bits, gains 1 integer bit + guard bits out = guard bits in - 3 (if inputs are full scale) + or guard bits in - 2 (if inputs bounded to +/- sqrt(2)/2) + see scaling comments in code **************************************************************************************/ - /* __attribute__ ((section (".data"))) */ static void R8FirstPass(int *x, int bg) -{ +/* __attribute__ ((section (".data"))) */ static void R8FirstPass(int *x, int bg) { int ar, ai, br, bi, cr, ci, dr, di; - int sr, si, tr, ti, ur, ui, vr, vi; - int wr, wi, xr, xi, yr, yi, zr, zi; - - for (; bg != 0; bg--) { - - ar = x[0] + x[2]; - br = x[0] - x[2]; - ai = x[1] + x[3]; - bi = x[1] - x[3]; - cr = x[4] + x[6]; - dr = x[4] - x[6]; - ci = x[5] + x[7]; - di = x[5] - x[7]; - - sr = ar + cr; - ur = ar - cr; - si = ai + ci; - ui = ai - ci; - tr = br - di; - vr = br + di; - ti = bi + dr; - vi = bi - dr; - - ar = x[ 8] + x[10]; - br = x[ 8] - x[10]; - ai = x[ 9] + x[11]; - bi = x[ 9] - x[11]; - cr = x[12] + x[14]; - dr = x[12] - x[14]; - ci = x[13] + x[15]; - di = x[13] - x[15]; - - /* max gain of wr/wi/yr/yi vs input = 2 - * (sum of 4 samples >> 1) - */ - wr = (ar + cr) >> 1; - yr = (ar - cr) >> 1; - wi = (ai + ci) >> 1; - yi = (ai - ci) >> 1; - - /* max gain of output vs input = 4 - * (sum of 4 samples >> 1 + sum of 4 samples >> 1) - */ - x[ 0] = (sr >> 1) + wr; - x[ 8] = (sr >> 1) - wr; - x[ 1] = (si >> 1) + wi; - x[ 9] = (si >> 1) - wi; - x[ 4] = (ur >> 1) + yi; - x[12] = (ur >> 1) - yi; - x[ 5] = (ui >> 1) - yr; - x[13] = (ui >> 1) + yr; - - ar = br - di; - cr = br + di; - ai = bi + dr; - ci = bi - dr; - - /* max gain of xr/xi/zr/zi vs input = 4*sqrt(2)/2 = 2*sqrt(2) - * (sum of 8 samples, multiply by sqrt(2)/2, implicit >> 1 from Q31) - */ - xr = MULSHIFT32(SQRT1_2, ar - ai); - xi = MULSHIFT32(SQRT1_2, ar + ai); - zr = MULSHIFT32(SQRT1_2, cr - ci); - zi = MULSHIFT32(SQRT1_2, cr + ci); - - /* max gain of output vs input = (2 + 2*sqrt(2) ~= 4.83) - * (sum of 4 samples >> 1, plus xr/xi/zr/zi with gain of 2*sqrt(2)) - * in absolute terms, we have max gain of appx 9.656 (4 + 0.707*8) - * but we also gain 1 int bit (from MULSHIFT32 or from explicit >> 1) - */ - x[ 6] = (tr >> 1) - xr; - x[14] = (tr >> 1) + xr; - x[ 7] = (ti >> 1) - xi; - x[15] = (ti >> 1) + xi; - x[ 2] = (vr >> 1) + zi; - x[10] = (vr >> 1) - zi; - x[ 3] = (vi >> 1) - zr; - x[11] = (vi >> 1) + zr; - - x += 16; - } + int sr, si, tr, ti, ur, ui, vr, vi; + int wr, wi, xr, xi, yr, yi, zr, zi; + + for (; bg != 0; bg--) { + + ar = x[0] + x[2]; + br = x[0] - x[2]; + ai = x[1] + x[3]; + bi = x[1] - x[3]; + cr = x[4] + x[6]; + dr = x[4] - x[6]; + ci = x[5] + x[7]; + di = x[5] - x[7]; + + sr = ar + cr; + ur = ar - cr; + si = ai + ci; + ui = ai - ci; + tr = br - di; + vr = br + di; + ti = bi + dr; + vi = bi - dr; + + ar = x[ 8] + x[10]; + br = x[ 8] - x[10]; + ai = x[ 9] + x[11]; + bi = x[ 9] - x[11]; + cr = x[12] + x[14]; + dr = x[12] - x[14]; + ci = x[13] + x[15]; + di = x[13] - x[15]; + + /* max gain of wr/wi/yr/yi vs input = 2 + (sum of 4 samples >> 1) + */ + wr = (ar + cr) >> 1; + yr = (ar - cr) >> 1; + wi = (ai + ci) >> 1; + yi = (ai - ci) >> 1; + + /* max gain of output vs input = 4 + (sum of 4 samples >> 1 + sum of 4 samples >> 1) + */ + x[ 0] = (sr >> 1) + wr; + x[ 8] = (sr >> 1) - wr; + x[ 1] = (si >> 1) + wi; + x[ 9] = (si >> 1) - wi; + x[ 4] = (ur >> 1) + yi; + x[12] = (ur >> 1) - yi; + x[ 5] = (ui >> 1) - yr; + x[13] = (ui >> 1) + yr; + + ar = br - di; + cr = br + di; + ai = bi + dr; + ci = bi - dr; + + /* max gain of xr/xi/zr/zi vs input = 4*sqrt(2)/2 = 2*sqrt(2) + (sum of 8 samples, multiply by sqrt(2)/2, implicit >> 1 from Q31) + */ + xr = MULSHIFT32(SQRT1_2, ar - ai); + xi = MULSHIFT32(SQRT1_2, ar + ai); + zr = MULSHIFT32(SQRT1_2, cr - ci); + zi = MULSHIFT32(SQRT1_2, cr + ci); + + /* max gain of output vs input = (2 + 2*sqrt(2) ~= 4.83) + (sum of 4 samples >> 1, plus xr/xi/zr/zi with gain of 2*sqrt(2)) + in absolute terms, we have max gain of appx 9.656 (4 + 0.707*8) + but we also gain 1 int bit (from MULSHIFT32 or from explicit >> 1) + */ + x[ 6] = (tr >> 1) - xr; + x[14] = (tr >> 1) + xr; + x[ 7] = (ti >> 1) - xi; + x[15] = (ti >> 1) + xi; + x[ 2] = (vr >> 1) + zi; + x[10] = (vr >> 1) - zi; + x[ 3] = (vi >> 1) - zr; + x[11] = (vi >> 1) + zr; + + x += 16; + } } /************************************************************************************** - * Function: R4Core - * - * Description: radix-4 pass for decimation-in-time FFT - * - * Inputs: buffer of samples - * number of R4 butterflies per group - * number of R4 groups per pass - * pointer to twiddle factors tables - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: gain 2 integer bits per pass (see scaling comments in code) - * min 1 GB in - * gbOut = gbIn - 1 (short block) or gbIn - 2 (long block) - * uses 3-mul, 3-add butterflies instead of 4-mul, 2-add + Function: R4Core + + Description: radix-4 pass for decimation-in-time FFT + + Inputs: buffer of samples + number of R4 butterflies per group + number of R4 groups per pass + pointer to twiddle factors tables + + Outputs: processed samples in same buffer + + Return: none + + Notes: gain 2 integer bits per pass (see scaling comments in code) + min 1 GB in + gbOut = gbIn - 1 (short block) or gbIn - 2 (long block) + uses 3-mul, 3-add butterflies instead of 4-mul, 2-add **************************************************************************************/ - /* __attribute__ ((section (".data"))) */ static void R4Core(int *x, int bg, int gp, int *wtab) -{ - int ar, ai, br, bi, cr, ci, dr, di, tr, ti; - int wd, ws, wi; - int i, j, step; - int *xptr, *wptr; - - for (; bg != 0; gp <<= 2, bg >>= 2) { - - step = 2*gp; - xptr = x; - - /* max per-sample gain, per group < 1 + 3*sqrt(2) ~= 5.25 if inputs x are full-scale - * do 3 groups for long block, 2 groups for short block (gain 2 int bits per group) - * - * very conservative scaling: - * group 1: max gain = 5.25, int bits gained = 2, gb used = 1 (2^3 = 8) - * group 2: max gain = 5.25^2 = 27.6, int bits gained = 4, gb used = 1 (2^5 = 32) - * group 3: max gain = 5.25^3 = 144.7, int bits gained = 6, gb used = 2 (2^8 = 256) - */ - for (i = bg; i != 0; i--) { - - wptr = wtab; - - for (j = gp; j != 0; j--) { - - ar = xptr[0]; - ai = xptr[1]; - xptr += step; - - /* gain 2 int bits for br/bi, cr/ci, dr/di (MULSHIFT32 by Q30) - * gain 1 net GB - */ - ws = wptr[0]; - wi = wptr[1]; - br = xptr[0]; - bi = xptr[1]; - wd = ws + 2*wi; - tr = MULSHIFT32(wi, br + bi); - br = MULSHIFT32(wd, br) - tr; /* cos*br + sin*bi */ - bi = MULSHIFT32(ws, bi) + tr; /* cos*bi - sin*br */ - xptr += step; - - ws = wptr[2]; - wi = wptr[3]; - cr = xptr[0]; - ci = xptr[1]; - wd = ws + 2*wi; - tr = MULSHIFT32(wi, cr + ci); - cr = MULSHIFT32(wd, cr) - tr; - ci = MULSHIFT32(ws, ci) + tr; - xptr += step; - - ws = wptr[4]; - wi = wptr[5]; - dr = xptr[0]; - di = xptr[1]; - wd = ws + 2*wi; - tr = MULSHIFT32(wi, dr + di); - dr = MULSHIFT32(wd, dr) - tr; - di = MULSHIFT32(ws, di) + tr; - wptr += 6; - - tr = ar; - ti = ai; - ar = (tr >> 2) - br; - ai = (ti >> 2) - bi; - br = (tr >> 2) + br; - bi = (ti >> 2) + bi; - - tr = cr; - ti = ci; - cr = tr + dr; - ci = di - ti; - dr = tr - dr; - di = di + ti; - - xptr[0] = ar + ci; - xptr[1] = ai + dr; - xptr -= step; - xptr[0] = br - cr; - xptr[1] = bi - di; - xptr -= step; - xptr[0] = ar - ci; - xptr[1] = ai - dr; - xptr -= step; - xptr[0] = br + cr; - xptr[1] = bi + di; - xptr += 2; - } - xptr += 3*step; - } - wtab += 3*step; - } +/* __attribute__ ((section (".data"))) */ static void R4Core(int *x, int bg, int gp, int *wtab) { + int ar, ai, br, bi, cr, ci, dr, di, tr, ti; + int wd, ws, wi; + int i, j, step; + int *xptr, *wptr; + + for (; bg != 0; gp <<= 2, bg >>= 2) { + + step = 2 * gp; + xptr = x; + + /* max per-sample gain, per group < 1 + 3*sqrt(2) ~= 5.25 if inputs x are full-scale + do 3 groups for long block, 2 groups for short block (gain 2 int bits per group) + + very conservative scaling: + group 1: max gain = 5.25, int bits gained = 2, gb used = 1 (2^3 = 8) + group 2: max gain = 5.25^2 = 27.6, int bits gained = 4, gb used = 1 (2^5 = 32) + group 3: max gain = 5.25^3 = 144.7, int bits gained = 6, gb used = 2 (2^8 = 256) + */ + for (i = bg; i != 0; i--) { + + wptr = wtab; + + for (j = gp; j != 0; j--) { + + ar = xptr[0]; + ai = xptr[1]; + xptr += step; + + /* gain 2 int bits for br/bi, cr/ci, dr/di (MULSHIFT32 by Q30) + gain 1 net GB + */ + ws = wptr[0]; + wi = wptr[1]; + br = xptr[0]; + bi = xptr[1]; + wd = ws + 2 * wi; + tr = MULSHIFT32(wi, br + bi); + br = MULSHIFT32(wd, br) - tr; /* cos*br + sin*bi */ + bi = MULSHIFT32(ws, bi) + tr; /* cos*bi - sin*br */ + xptr += step; + + ws = wptr[2]; + wi = wptr[3]; + cr = xptr[0]; + ci = xptr[1]; + wd = ws + 2 * wi; + tr = MULSHIFT32(wi, cr + ci); + cr = MULSHIFT32(wd, cr) - tr; + ci = MULSHIFT32(ws, ci) + tr; + xptr += step; + + ws = wptr[4]; + wi = wptr[5]; + dr = xptr[0]; + di = xptr[1]; + wd = ws + 2 * wi; + tr = MULSHIFT32(wi, dr + di); + dr = MULSHIFT32(wd, dr) - tr; + di = MULSHIFT32(ws, di) + tr; + wptr += 6; + + tr = ar; + ti = ai; + ar = (tr >> 2) - br; + ai = (ti >> 2) - bi; + br = (tr >> 2) + br; + bi = (ti >> 2) + bi; + + tr = cr; + ti = ci; + cr = tr + dr; + ci = di - ti; + dr = tr - dr; + di = di + ti; + + xptr[0] = ar + ci; + xptr[1] = ai + dr; + xptr -= step; + xptr[0] = br - cr; + xptr[1] = bi - di; + xptr -= step; + xptr[0] = ar - ci; + xptr[1] = ai - dr; + xptr -= step; + xptr[0] = br + cr; + xptr[1] = bi + di; + xptr += 2; + } + xptr += 3 * step; + } + wtab += 3 * step; + } } /************************************************************************************** - * Function: R4FFT - * - * Description: Ken's very fast in-place radix-4 decimation-in-time FFT - * - * Inputs: table index (for transform size) - * buffer of samples (non bit-reversed) - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: assumes 5 guard bits in for nfft <= 512 - * gbOut = gbIn - 4 (assuming input is from PreMultiply) - * gains log2(nfft) - 2 int bits total - * so gain 7 int bits (LONG), 4 int bits (SHORT) + Function: R4FFT + + Description: Ken's very fast in-place radix-4 decimation-in-time FFT + + Inputs: table index (for transform size) + buffer of samples (non bit-reversed) + + Outputs: processed samples in same buffer + + Return: none + + Notes: assumes 5 guard bits in for nfft <= 512 + gbOut = gbIn - 4 (assuming input is from PreMultiply) + gains log2(nfft) - 2 int bits total + so gain 7 int bits (LONG), 4 int bits (SHORT) **************************************************************************************/ -void R4FFT(int tabidx, int *x) -{ - int order = nfftlog2Tab[tabidx]; - int nfft = nfftTab[tabidx]; - - /* decimation in time */ - BitReverse(x, tabidx); - - if (order & 0x1) { - /* long block: order = 9, nfft = 512 */ - R8FirstPass(x, nfft >> 3); /* gain 1 int bit, lose 2 GB */ - R4Core(x, nfft >> 5, 8, (int *)twidTabOdd); /* gain 6 int bits, lose 2 GB */ - } else { - /* short block: order = 6, nfft = 64 */ - R4FirstPass(x, nfft >> 2); /* gain 0 int bits, lose 2 GB */ - R4Core(x, nfft >> 4, 4, (int *)twidTabEven); /* gain 4 int bits, lose 1 GB */ - } +void R4FFT(int tabidx, int *x) { + int order = nfftlog2Tab[tabidx]; + int nfft = nfftTab[tabidx]; + + /* decimation in time */ + BitReverse(x, tabidx); + + if (order & 0x1) { + /* long block: order = 9, nfft = 512 */ + R8FirstPass(x, nfft >> 3); /* gain 1 int bit, lose 2 GB */ + R4Core(x, nfft >> 5, 8, (int *)twidTabOdd); /* gain 6 int bits, lose 2 GB */ + } else { + /* short block: order = 6, nfft = 64 */ + R4FirstPass(x, nfft >> 2); /* gain 0 int bits, lose 2 GB */ + R4Core(x, nfft >> 4, 4, (int *)twidTabEven); /* gain 4 int bits, lose 1 GB */ + } } diff --git a/src/libhelix-aac/filefmt.c b/src/libhelix-aac/filefmt.c index ccfac596..7f6e8831 100644 --- a/src/libhelix-aac/filefmt.c +++ b/src/libhelix-aac/filefmt.c @@ -1,496 +1,517 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: filefmt.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: filefmt.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * filefmt.c - ADIF and ADTS header decoding, raw block handling + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + filefmt.c - ADIF and ADTS header decoding, raw block handling **************************************************************************************/ #include "coder.h" - /************************************************************************************** - * Function: UnpackADTSHeader - * - * Description: parse the ADTS frame header and initialize decoder state - * - * Inputs: valid AACDecInfo struct - * double pointer to buffer with complete ADTS frame header (byte aligned) - * header size = 7 bytes, plus 2 if CRC - * - * Outputs: filled in ADTS struct - * updated buffer pointer - * updated bit offset - * updated number of available bits - * - * Return: 0 if successful, error code (< 0) if error - * - * TODO: test CRC - * verify that fixed fields don't change between frames - **************************************************************************************/ -int UnpackADTSHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) -{ - int bitsUsed; - PSInfoBase *psi; - BitStreamInfo bsi; - ADTSHeader *fhADTS; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - fhADTS = &(psi->fhADTS); - - /* init bitstream reader */ - SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); - GetBits(&bsi, *bitOffset); - - /* verify that first 12 bits of header are syncword */ - if (GetBits(&bsi, 12) != 0x0fff) { - return ERR_AAC_INVALID_ADTS_HEADER; - } - - /* fixed fields - should not change from frame to frame */ - fhADTS->id = GetBits(&bsi, 1); - fhADTS->layer = GetBits(&bsi, 2); - fhADTS->protectBit = GetBits(&bsi, 1); - fhADTS->profile = GetBits(&bsi, 2); - fhADTS->sampRateIdx = GetBits(&bsi, 4); - fhADTS->privateBit = GetBits(&bsi, 1); - fhADTS->channelConfig = GetBits(&bsi, 3); - fhADTS->origCopy = GetBits(&bsi, 1); - fhADTS->home = GetBits(&bsi, 1); - - /* variable fields - can change from frame to frame */ - fhADTS->copyBit = GetBits(&bsi, 1); - fhADTS->copyStart = GetBits(&bsi, 1); - fhADTS->frameLength = GetBits(&bsi, 13); - fhADTS->bufferFull = GetBits(&bsi, 11); - fhADTS->numRawDataBlocks = GetBits(&bsi, 2) + 1; - - /* note - MPEG4 spec, correction 1 changes how CRC is handled when protectBit == 0 and numRawDataBlocks > 1 */ - if (fhADTS->protectBit == 0) - fhADTS->crcCheckWord = GetBits(&bsi, 16); - - /* byte align */ - ByteAlignBitstream(&bsi); /* should always be aligned anyway */ - - /* check validity of header */ - if (fhADTS->layer != 0 || fhADTS->profile != AAC_PROFILE_LC || - fhADTS->sampRateIdx >= NUM_SAMPLE_RATES || fhADTS->channelConfig >= NUM_DEF_CHAN_MAPS) - return ERR_AAC_INVALID_ADTS_HEADER; +/************************************************************************************** + Function: UnpackADTSHeader + + Description: parse the ADTS frame header and initialize decoder state + + Inputs: valid AACDecInfo struct + double pointer to buffer with complete ADTS frame header (byte aligned) + header size = 7 bytes, plus 2 if CRC + + Outputs: filled in ADTS struct + updated buffer pointer + updated bit offset + updated number of available bits + + Return: 0 if successful, error code (< 0) if error + + TODO: test CRC + verify that fixed fields don't change between frames +**************************************************************************************/ +int UnpackADTSHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) { + int bitsUsed; + PSInfoBase *psi; + BitStreamInfo bsi; + ADTSHeader *fhADTS; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + fhADTS = &(psi->fhADTS); + + /* init bitstream reader */ + SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); + GetBits(&bsi, *bitOffset); + + /* verify that first 12 bits of header are syncword */ + if (GetBits(&bsi, 12) != 0x0fff) { + return ERR_AAC_INVALID_ADTS_HEADER; + } + + /* fixed fields - should not change from frame to frame */ + fhADTS->id = GetBits(&bsi, 1); + fhADTS->layer = GetBits(&bsi, 2); + fhADTS->protectBit = GetBits(&bsi, 1); + fhADTS->profile = GetBits(&bsi, 2); + fhADTS->sampRateIdx = GetBits(&bsi, 4); + fhADTS->privateBit = GetBits(&bsi, 1); + fhADTS->channelConfig = GetBits(&bsi, 3); + fhADTS->origCopy = GetBits(&bsi, 1); + fhADTS->home = GetBits(&bsi, 1); + + /* variable fields - can change from frame to frame */ + fhADTS->copyBit = GetBits(&bsi, 1); + fhADTS->copyStart = GetBits(&bsi, 1); + fhADTS->frameLength = GetBits(&bsi, 13); + fhADTS->bufferFull = GetBits(&bsi, 11); + fhADTS->numRawDataBlocks = GetBits(&bsi, 2) + 1; + + /* note - MPEG4 spec, correction 1 changes how CRC is handled when protectBit == 0 and numRawDataBlocks > 1 */ + if (fhADTS->protectBit == 0) { + fhADTS->crcCheckWord = GetBits(&bsi, 16); + } + + /* byte align */ + ByteAlignBitstream(&bsi); /* should always be aligned anyway */ + + /* check validity of header */ + if (fhADTS->layer != 0 || fhADTS->profile != AAC_PROFILE_LC || + fhADTS->sampRateIdx >= NUM_SAMPLE_RATES || fhADTS->channelConfig >= NUM_DEF_CHAN_MAPS) { + return ERR_AAC_INVALID_ADTS_HEADER; + } #ifndef AAC_ENABLE_MPEG4 - if (fhADTS->id != 1) - return ERR_AAC_MPEG4_UNSUPPORTED; + if (fhADTS->id != 1) { + return ERR_AAC_MPEG4_UNSUPPORTED; + } #endif - /* update codec info */ - psi->sampRateIdx = fhADTS->sampRateIdx; - if (!psi->useImpChanMap) - psi->nChans = channelMapTab[fhADTS->channelConfig]; - - /* syntactic element fields will be read from bitstream for each element */ - aacDecInfo->prevBlockID = AAC_ID_INVALID; - aacDecInfo->currBlockID = AAC_ID_INVALID; - aacDecInfo->currInstTag = -1; - - /* fill in user-accessible data (TODO - calc bitrate, handle tricky channel config cases) */ - aacDecInfo->bitRate = 0; - aacDecInfo->nChans = psi->nChans; - aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; - aacDecInfo->profile = fhADTS->profile; - aacDecInfo->sbrEnabled = 0; - aacDecInfo->adtsBlocksLeft = fhADTS->numRawDataBlocks; - - /* update bitstream reader */ - bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); - *buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - *bitsAvail -= bitsUsed ; - if (*bitsAvail < 0) - return ERR_AAC_INDATA_UNDERFLOW; - - return ERR_AAC_NONE; + /* update codec info */ + psi->sampRateIdx = fhADTS->sampRateIdx; + if (!psi->useImpChanMap) { + psi->nChans = channelMapTab[fhADTS->channelConfig]; + } + + /* syntactic element fields will be read from bitstream for each element */ + aacDecInfo->prevBlockID = AAC_ID_INVALID; + aacDecInfo->currBlockID = AAC_ID_INVALID; + aacDecInfo->currInstTag = -1; + + /* fill in user-accessible data (TODO - calc bitrate, handle tricky channel config cases) */ + aacDecInfo->bitRate = 0; + aacDecInfo->nChans = psi->nChans; + aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; + aacDecInfo->profile = fhADTS->profile; + aacDecInfo->sbrEnabled = 0; + aacDecInfo->adtsBlocksLeft = fhADTS->numRawDataBlocks; + + /* update bitstream reader */ + bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); + *buf += (bitsUsed + *bitOffset) >> 3; + *bitOffset = (bitsUsed + *bitOffset) & 0x07; + *bitsAvail -= bitsUsed ; + if (*bitsAvail < 0) { + return ERR_AAC_INDATA_UNDERFLOW; + } + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: GetADTSChannelMapping - * - * Description: determine the number of channels from implicit mapping rules - * - * Inputs: valid AACDecInfo struct - * pointer to start of raw_data_block - * bit offset - * bits available - * - * Outputs: updated number of channels - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: calculates total number of channels using rules in 14496-3, 4.5.1.2.1 - * does not attempt to deduce speaker geometry + Function: GetADTSChannelMapping + + Description: determine the number of channels from implicit mapping rules + + Inputs: valid AACDecInfo struct + pointer to start of raw_data_block + bit offset + bits available + + Outputs: updated number of channels + + Return: 0 if successful, error code (< 0) if error + + Notes: calculates total number of channels using rules in 14496-3, 4.5.1.2.1 + does not attempt to deduce speaker geometry **************************************************************************************/ -int GetADTSChannelMapping(AACDecInfo *aacDecInfo, unsigned char *buf, int bitOffset, int bitsAvail) -{ - int ch, nChans, elementChans, err; - PSInfoBase *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - nChans = 0; - do { - /* parse next syntactic element */ - err = DecodeNextElement(aacDecInfo, &buf, &bitOffset, &bitsAvail); - if (err) - return err; - - elementChans = elementNumChans[aacDecInfo->currBlockID]; - nChans += elementChans; - - for (ch = 0; ch < elementChans; ch++) { - err = DecodeNoiselessData(aacDecInfo, &buf, &bitOffset, &bitsAvail, ch); - if (err) - return err; - } - } while (aacDecInfo->currBlockID != AAC_ID_END); - - if (nChans <= 0) - return ERR_AAC_CHANNEL_MAP; - - /* update number of channels in codec state and user-accessible info structs */ - psi->nChans = nChans; - aacDecInfo->nChans = psi->nChans; - psi->useImpChanMap = 1; - - return ERR_AAC_NONE; +int GetADTSChannelMapping(AACDecInfo *aacDecInfo, unsigned char *buf, int bitOffset, int bitsAvail) { + int ch, nChans, elementChans, err; + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + nChans = 0; + do { + /* parse next syntactic element */ + err = DecodeNextElement(aacDecInfo, &buf, &bitOffset, &bitsAvail); + if (err) { + return err; + } + + elementChans = elementNumChans[aacDecInfo->currBlockID]; + nChans += elementChans; + + for (ch = 0; ch < elementChans; ch++) { + err = DecodeNoiselessData(aacDecInfo, &buf, &bitOffset, &bitsAvail, ch); + if (err) { + return err; + } + } + } while (aacDecInfo->currBlockID != AAC_ID_END); + + if (nChans <= 0) { + return ERR_AAC_CHANNEL_MAP; + } + + /* update number of channels in codec state and user-accessible info structs */ + psi->nChans = nChans; + aacDecInfo->nChans = psi->nChans; + psi->useImpChanMap = 1; + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: GetNumChannelsADIF - * - * Description: get number of channels from program config elements in an ADIF file - * - * Inputs: array of filled-in program config element structures - * number of PCE's - * - * Outputs: none - * - * Return: total number of channels in file - * -1 if error (invalid number of PCE's or unsupported mode) - **************************************************************************************/ -static int GetNumChannelsADIF(ProgConfigElement *fhPCE, int nPCE) -{ - int i, j, nChans; + Function: GetNumChannelsADIF + + Description: get number of channels from program config elements in an ADIF file - if (nPCE < 1 || nPCE > MAX_NUM_PCE_ADIF) - return -1; + Inputs: array of filled-in program config element structures + number of PCE's - nChans = 0; - for (i = 0; i < nPCE; i++) { - /* for now: only support LC, no channel coupling */ - if (fhPCE[i].profile != AAC_PROFILE_LC || fhPCE[i].numCCE > 0) - return -1; + Outputs: none + + Return: total number of channels in file + -1 if error (invalid number of PCE's or unsupported mode) + **************************************************************************************/ +static int GetNumChannelsADIF(ProgConfigElement *fhPCE, int nPCE) { + int i, j, nChans; + + if (nPCE < 1 || nPCE > MAX_NUM_PCE_ADIF) { + return -1; + } + + nChans = 0; + for (i = 0; i < nPCE; i++) { + /* for now: only support LC, no channel coupling */ + if (fhPCE[i].profile != AAC_PROFILE_LC || fhPCE[i].numCCE > 0) { + return -1; + } - /* add up number of channels in all channel elements (assume all single-channel) */ + /* add up number of channels in all channel elements (assume all single-channel) */ nChans += fhPCE[i].numFCE; nChans += fhPCE[i].numSCE; nChans += fhPCE[i].numBCE; nChans += fhPCE[i].numLCE; - /* add one more for every element which is a channel pair */ + /* add one more for every element which is a channel pair */ for (j = 0; j < fhPCE[i].numFCE; j++) { - if (CHAN_ELEM_IS_CPE(fhPCE[i].fce[j])) + if (CHAN_ELEM_IS_CPE(fhPCE[i].fce[j])) { nChans++; + } } for (j = 0; j < fhPCE[i].numSCE; j++) { - if (CHAN_ELEM_IS_CPE(fhPCE[i].sce[j])) + if (CHAN_ELEM_IS_CPE(fhPCE[i].sce[j])) { nChans++; + } } for (j = 0; j < fhPCE[i].numBCE; j++) { - if (CHAN_ELEM_IS_CPE(fhPCE[i].bce[j])) + if (CHAN_ELEM_IS_CPE(fhPCE[i].bce[j])) { nChans++; + } } - } + } - return nChans; + return nChans; } /************************************************************************************** - * Function: GetSampleRateIdxADIF - * - * Description: get sampling rate index from program config elements in an ADIF file - * - * Inputs: array of filled-in program config element structures - * number of PCE's - * - * Outputs: none - * - * Return: sample rate of file - * -1 if error (invalid number of PCE's or sample rate mismatch) - **************************************************************************************/ -static int GetSampleRateIdxADIF(ProgConfigElement *fhPCE, int nPCE) -{ - int i, idx; + Function: GetSampleRateIdxADIF + + Description: get sampling rate index from program config elements in an ADIF file + + Inputs: array of filled-in program config element structures + number of PCE's - if (nPCE < 1 || nPCE > MAX_NUM_PCE_ADIF) - return -1; + Outputs: none - /* make sure all PCE's have the same sample rate */ - idx = fhPCE[0].sampRateIdx; - for (i = 1; i < nPCE; i++) { - if (fhPCE[i].sampRateIdx != idx) - return -1; - } + Return: sample rate of file + -1 if error (invalid number of PCE's or sample rate mismatch) + **************************************************************************************/ +static int GetSampleRateIdxADIF(ProgConfigElement *fhPCE, int nPCE) { + int i, idx; + + if (nPCE < 1 || nPCE > MAX_NUM_PCE_ADIF) { + return -1; + } + + /* make sure all PCE's have the same sample rate */ + idx = fhPCE[0].sampRateIdx; + for (i = 1; i < nPCE; i++) { + if (fhPCE[i].sampRateIdx != idx) { + return -1; + } + } - return idx; + return idx; } /************************************************************************************** - * Function: UnpackADIFHeader - * - * Description: parse the ADIF file header and initialize decoder state - * - * Inputs: valid AACDecInfo struct - * double pointer to buffer with complete ADIF header - * (starting at 'A' in 'ADIF' tag) - * pointer to bit offset - * pointer to number of valid bits remaining in inbuf - * - * Outputs: filled-in ADIF struct - * updated buffer pointer - * updated bit offset - * updated number of available bits - * - * Return: 0 if successful, error code (< 0) if error + Function: UnpackADIFHeader + + Description: parse the ADIF file header and initialize decoder state + + Inputs: valid AACDecInfo struct + double pointer to buffer with complete ADIF header + (starting at 'A' in 'ADIF' tag) + pointer to bit offset + pointer to number of valid bits remaining in inbuf + + Outputs: filled-in ADIF struct + updated buffer pointer + updated bit offset + updated number of available bits + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int UnpackADIFHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) -{ - int i, bitsUsed; - PSInfoBase *psi; - BitStreamInfo bsi; - ADIFHeader *fhADIF; - ProgConfigElement *pce; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - /* init bitstream reader */ - SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); - GetBits(&bsi, *bitOffset); - - /* unpack ADIF file header */ - fhADIF = &(psi->fhADIF); - pce = psi->pce; - - /* verify that first 32 bits of header are "ADIF" */ - if (GetBits(&bsi, 8) != 'A' || GetBits(&bsi, 8) != 'D' || GetBits(&bsi, 8) != 'I' || GetBits(&bsi, 8) != 'F') - return ERR_AAC_INVALID_ADIF_HEADER; - - /* read ADIF header fields */ - fhADIF->copyBit = GetBits(&bsi, 1); - if (fhADIF->copyBit) { - for (i = 0; i < ADIF_COPYID_SIZE; i++) - fhADIF->copyID[i] = GetBits(&bsi, 8); - } - fhADIF->origCopy = GetBits(&bsi, 1); - fhADIF->home = GetBits(&bsi, 1); - fhADIF->bsType = GetBits(&bsi, 1); - fhADIF->bitRate = GetBits(&bsi, 23); - fhADIF->numPCE = GetBits(&bsi, 4) + 1; /* add 1 (so range = [1, 16]) */ - if (fhADIF->bsType == 0) - fhADIF->bufferFull = GetBits(&bsi, 20); - - /* parse all program config elements */ - for (i = 0; i < fhADIF->numPCE; i++) - DecodeProgramConfigElement(pce + i, &bsi); - - /* byte align */ - ByteAlignBitstream(&bsi); - - /* update codec info */ - psi->nChans = GetNumChannelsADIF(pce, fhADIF->numPCE); - psi->sampRateIdx = GetSampleRateIdxADIF(pce, fhADIF->numPCE); - - /* check validity of header */ - if (psi->nChans < 0 || psi->sampRateIdx < 0 || psi->sampRateIdx >= NUM_SAMPLE_RATES) - return ERR_AAC_INVALID_ADIF_HEADER; - - /* syntactic element fields will be read from bitstream for each element */ - aacDecInfo->prevBlockID = AAC_ID_INVALID; - aacDecInfo->currBlockID = AAC_ID_INVALID; - aacDecInfo->currInstTag = -1; - - /* fill in user-accessible data */ - aacDecInfo->bitRate = 0; - aacDecInfo->nChans = psi->nChans; - aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; - aacDecInfo->profile = pce[0].profile; - aacDecInfo->sbrEnabled = 0; - - /* update bitstream reader */ - bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); - *buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - *bitsAvail -= bitsUsed ; - if (*bitsAvail < 0) - return ERR_AAC_INDATA_UNDERFLOW; - - return ERR_AAC_NONE; +int UnpackADIFHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail) { + int i, bitsUsed; + PSInfoBase *psi; + BitStreamInfo bsi; + ADIFHeader *fhADIF; + ProgConfigElement *pce; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + /* init bitstream reader */ + SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); + GetBits(&bsi, *bitOffset); + + /* unpack ADIF file header */ + fhADIF = &(psi->fhADIF); + pce = psi->pce; + + /* verify that first 32 bits of header are "ADIF" */ + if (GetBits(&bsi, 8) != 'A' || GetBits(&bsi, 8) != 'D' || GetBits(&bsi, 8) != 'I' || GetBits(&bsi, 8) != 'F') { + return ERR_AAC_INVALID_ADIF_HEADER; + } + + /* read ADIF header fields */ + fhADIF->copyBit = GetBits(&bsi, 1); + if (fhADIF->copyBit) { + for (i = 0; i < ADIF_COPYID_SIZE; i++) { + fhADIF->copyID[i] = GetBits(&bsi, 8); + } + } + fhADIF->origCopy = GetBits(&bsi, 1); + fhADIF->home = GetBits(&bsi, 1); + fhADIF->bsType = GetBits(&bsi, 1); + fhADIF->bitRate = GetBits(&bsi, 23); + fhADIF->numPCE = GetBits(&bsi, 4) + 1; /* add 1 (so range = [1, 16]) */ + if (fhADIF->bsType == 0) { + fhADIF->bufferFull = GetBits(&bsi, 20); + } + + /* parse all program config elements */ + for (i = 0; i < fhADIF->numPCE; i++) { + DecodeProgramConfigElement(pce + i, &bsi); + } + + /* byte align */ + ByteAlignBitstream(&bsi); + + /* update codec info */ + psi->nChans = GetNumChannelsADIF(pce, fhADIF->numPCE); + psi->sampRateIdx = GetSampleRateIdxADIF(pce, fhADIF->numPCE); + + /* check validity of header */ + if (psi->nChans < 0 || psi->sampRateIdx < 0 || psi->sampRateIdx >= NUM_SAMPLE_RATES) { + return ERR_AAC_INVALID_ADIF_HEADER; + } + + /* syntactic element fields will be read from bitstream for each element */ + aacDecInfo->prevBlockID = AAC_ID_INVALID; + aacDecInfo->currBlockID = AAC_ID_INVALID; + aacDecInfo->currInstTag = -1; + + /* fill in user-accessible data */ + aacDecInfo->bitRate = 0; + aacDecInfo->nChans = psi->nChans; + aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; + aacDecInfo->profile = pce[0].profile; + aacDecInfo->sbrEnabled = 0; + + /* update bitstream reader */ + bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); + *buf += (bitsUsed + *bitOffset) >> 3; + *bitOffset = (bitsUsed + *bitOffset) & 0x07; + *bitsAvail -= bitsUsed ; + if (*bitsAvail < 0) { + return ERR_AAC_INDATA_UNDERFLOW; + } + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: SetRawBlockParams - * - * Description: set internal state variables for decoding a stream of raw data blocks - * - * Inputs: valid AACDecInfo struct - * flag indicating source of parameters (from previous headers or passed - * explicitly by caller) - * number of channels - * sample rate - * profile ID - * - * Outputs: updated state variables in aacDecInfo - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: if copyLast == 1, then psi->nChans, psi->sampRateIdx, and - * aacDecInfo->profile are not changed (it's assumed that we already - * set them, such as by a previous call to UnpackADTSHeader()) - * if copyLast == 0, then the parameters we passed in are used instead + Function: SetRawBlockParams + + Description: set internal state variables for decoding a stream of raw data blocks + + Inputs: valid AACDecInfo struct + flag indicating source of parameters (from previous headers or passed + explicitly by caller) + number of channels + sample rate + profile ID + + Outputs: updated state variables in aacDecInfo + + Return: 0 if successful, error code (< 0) if error + + Notes: if copyLast == 1, then psi->nChans, psi->sampRateIdx, and + aacDecInfo->profile are not changed (it's assumed that we already + set them, such as by a previous call to UnpackADTSHeader()) + if copyLast == 0, then the parameters we passed in are used instead **************************************************************************************/ -int SetRawBlockParams(AACDecInfo *aacDecInfo, int copyLast, int nChans, int sampRate, int profile) -{ - int idx; - PSInfoBase *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - if (!copyLast) { - aacDecInfo->profile = profile; - psi->nChans = nChans; - for (idx = 0; idx < NUM_SAMPLE_RATES; idx++) { - if (sampRate == sampRateTab[idx]) { - psi->sampRateIdx = idx; - break; - } - } - if (idx == NUM_SAMPLE_RATES) - return ERR_AAC_INVALID_FRAME; - } - aacDecInfo->nChans = psi->nChans; - aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; - - /* check validity of header */ - if (psi->sampRateIdx >= NUM_SAMPLE_RATES || psi->sampRateIdx < 0 || aacDecInfo->profile != AAC_PROFILE_LC) - return ERR_AAC_RAWBLOCK_PARAMS; - - return ERR_AAC_NONE; +int SetRawBlockParams(AACDecInfo *aacDecInfo, int copyLast, int nChans, int sampRate, int profile) { + int idx; + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + if (!copyLast) { + aacDecInfo->profile = profile; + psi->nChans = nChans; + for (idx = 0; idx < NUM_SAMPLE_RATES; idx++) { + if (sampRate == sampRateTab[idx]) { + psi->sampRateIdx = idx; + break; + } + } + if (idx == NUM_SAMPLE_RATES) { + return ERR_AAC_INVALID_FRAME; + } + } + aacDecInfo->nChans = psi->nChans; + aacDecInfo->sampRate = sampRateTab[psi->sampRateIdx]; + + /* check validity of header */ + if (psi->sampRateIdx >= NUM_SAMPLE_RATES || psi->sampRateIdx < 0 || aacDecInfo->profile != AAC_PROFILE_LC) { + return ERR_AAC_RAWBLOCK_PARAMS; + } + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: PrepareRawBlock - * - * Description: reset per-block state variables for raw blocks (no ADTS/ADIF headers) - * - * Inputs: valid AACDecInfo struct - * - * Outputs: updated state variables in aacDecInfo - * - * Return: 0 if successful, error code (< 0) if error + Function: PrepareRawBlock + + Description: reset per-block state variables for raw blocks (no ADTS/ADIF headers) + + Inputs: valid AACDecInfo struct + + Outputs: updated state variables in aacDecInfo + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int PrepareRawBlock(AACDecInfo *aacDecInfo) -{ -// PSInfoBase *psi; +int PrepareRawBlock(AACDecInfo *aacDecInfo) { + // PSInfoBase *psi; - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; -// psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + // psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - /* syntactic element fields will be read from bitstream for each element */ - aacDecInfo->prevBlockID = AAC_ID_INVALID; - aacDecInfo->currBlockID = AAC_ID_INVALID; - aacDecInfo->currInstTag = -1; + /* syntactic element fields will be read from bitstream for each element */ + aacDecInfo->prevBlockID = AAC_ID_INVALID; + aacDecInfo->currBlockID = AAC_ID_INVALID; + aacDecInfo->currInstTag = -1; - /* fill in user-accessible data */ - aacDecInfo->bitRate = 0; - aacDecInfo->sbrEnabled = 0; + /* fill in user-accessible data */ + aacDecInfo->bitRate = 0; + aacDecInfo->sbrEnabled = 0; - return ERR_AAC_NONE; + return ERR_AAC_NONE; } /************************************************************************************** - * Function: FlushCodec - * - * Description: flush internal codec state (after seeking, for example) - * - * Inputs: valid AACDecInfo struct - * - * Outputs: updated state variables in aacDecInfo - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: only need to clear data which is persistent between frames - * (such as overlap buffer) + Function: FlushCodec + + Description: flush internal codec state (after seeking, for example) + + Inputs: valid AACDecInfo struct + + Outputs: updated state variables in aacDecInfo + + Return: 0 if successful, error code (< 0) if error + + Notes: only need to clear data which is persistent between frames + (such as overlap buffer) **************************************************************************************/ -int FlushCodec(AACDecInfo *aacDecInfo) -{ - PSInfoBase *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - ClearBuffer(psi->overlap, AAC_MAX_NCHANS * AAC_MAX_NSAMPS * sizeof(int)); - ClearBuffer(psi->prevWinShape, AAC_MAX_NCHANS * sizeof(int)); - - return ERR_AAC_NONE; +int FlushCodec(AACDecInfo *aacDecInfo) { + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + ClearBuffer(psi->overlap, AAC_MAX_NCHANS * AAC_MAX_NSAMPS * sizeof(int)); + ClearBuffer(psi->prevWinShape, AAC_MAX_NCHANS * sizeof(int)); + + return ERR_AAC_NONE; } diff --git a/src/libhelix-aac/huffman.c b/src/libhelix-aac/huffman.c deleted file mode 100644 index 57cc45c9..00000000 --- a/src/libhelix-aac/huffman.c +++ /dev/null @@ -1,415 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: huffman.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * huffman.c - Huffman decoding - **************************************************************************************/ - -#include "coder.h" - -/************************************************************************************** - * Function: DecodeHuffmanScalar - * - * Description: decode one Huffman symbol from bitstream - * - * Inputs: pointers to Huffman table and info struct - * left-aligned bit buffer with >= huffTabInfo->maxBits bits - * - * Outputs: decoded symbol in *val - * - * Return: number of bits in symbol - * - * Notes: assumes canonical Huffman codes: - * first CW always 0, we have "count" CW's of length "nBits" bits - * starting CW for codes of length nBits+1 = - * (startCW[nBits] + count[nBits]) << 1 - * if there are no codes at nBits, then we just keep << 1 each time - * (since count[nBits] = 0) - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ int DecodeHuffmanScalar(const signed short *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val) -{ - unsigned int count, start, shift, t; - const unsigned /*char*/ int *countPtr; - const signed short *map; - - map = huffTab + huffTabInfo->offset; - countPtr = huffTabInfo->count; - - start = 0; - count = 0; - shift = 32; - do { - start += count; - start <<= 1; - map += count; - count = *countPtr++; - shift--; - t = (bitBuf >> shift) - start; - } while (t >= count); - - *val = (signed int)pgm_read_word(&map[t]); - return (countPtr - huffTabInfo->count); -} - -#define APPLY_SIGN(v, s) {(v) ^= ((signed int)(s) >> 31); (v) -= ((signed int)(s) >> 31);} - -#define GET_QUAD_SIGNBITS(v) (((unsigned int)(v) << 17) >> 29) /* bits 14-12, unsigned */ -#define GET_QUAD_W(v) (((signed int)(v) << 20) >> 29) /* bits 11-9, sign-extend */ -#define GET_QUAD_X(v) (((signed int)(v) << 23) >> 29) /* bits 8-6, sign-extend */ -#define GET_QUAD_Y(v) (((signed int)(v) << 26) >> 29) /* bits 5-3, sign-extend */ -#define GET_QUAD_Z(v) (((signed int)(v) << 29) >> 29) /* bits 2-0, sign-extend */ - -#define GET_PAIR_SIGNBITS(v) (((unsigned int)(v) << 20) >> 30) /* bits 11-10, unsigned */ -#define GET_PAIR_Y(v) (((signed int)(v) << 22) >> 27) /* bits 9-5, sign-extend */ -#define GET_PAIR_Z(v) (((signed int)(v) << 27) >> 27) /* bits 4-0, sign-extend */ - -#define GET_ESC_SIGNBITS(v) (((unsigned int)(v) << 18) >> 30) /* bits 13-12, unsigned */ -#define GET_ESC_Y(v) (((signed int)(v) << 20) >> 26) /* bits 11-6, sign-extend */ -#define GET_ESC_Z(v) (((signed int)(v) << 26) >> 26) /* bits 5-0, sign-extend */ - -/************************************************************************************** - * Function: UnpackZeros - * - * Description: fill a section of coefficients with zeros - * - * Inputs: number of coefficients - * - * Outputs: nVals zeros, starting at coef - * - * Return: none - * - * Notes: assumes nVals is always a multiple of 4 because all scalefactor bands - * are a multiple of 4 coefficients long - **************************************************************************************/ -static void UnpackZeros(int nVals, int *coef) -{ - while (nVals > 0) { - *coef++ = 0; - *coef++ = 0; - *coef++ = 0; - *coef++ = 0; - nVals -= 4; - } -} - -/************************************************************************************** - * Function: UnpackQuads - * - * Description: decode a section of 4-way vector Huffman coded coefficients - * - * Inputs BitStreamInfo struct pointing to start of codewords for this section - * index of Huffman codebook - * number of coefficients - * - * Outputs: nVals coefficients, starting at coef - * - * Return: none - * - * Notes: assumes nVals is always a multiple of 4 because all scalefactor bands - * are a multiple of 4 coefficients long - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static void UnpackQuads(BitStreamInfo *bsi, int cb, int nVals, int *coef) -{ - int w, x, y, z, maxBits, nCodeBits, nSignBits, val; - unsigned int bitBuf; - - maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 4; - while (nVals > 0) { - /* decode quad */ - bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); - nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET], bitBuf, &val); - - w = GET_QUAD_W(val); - x = GET_QUAD_X(val); - y = GET_QUAD_Y(val); - z = GET_QUAD_Z(val); - - bitBuf <<= nCodeBits; - nSignBits = (int)GET_QUAD_SIGNBITS(val); - AdvanceBitstream(bsi, nCodeBits + nSignBits); - if (nSignBits) { - if (w) {APPLY_SIGN(w, bitBuf); bitBuf <<= 1;} - if (x) {APPLY_SIGN(x, bitBuf); bitBuf <<= 1;} - if (y) {APPLY_SIGN(y, bitBuf); bitBuf <<= 1;} - if (z) {APPLY_SIGN(z, bitBuf); bitBuf <<= 1;} - } - *coef++ = w; *coef++ = x; *coef++ = y; *coef++ = z; - nVals -= 4; - } -} - -/************************************************************************************** - * Function: UnpackPairsNoEsc - * - * Description: decode a section of 2-way vector Huffman coded coefficients, - * using non-esc tables (5 through 10) - * - * Inputs BitStreamInfo struct pointing to start of codewords for this section - * index of Huffman codebook (must not be the escape codebook) - * number of coefficients - * - * Outputs: nVals coefficients, starting at coef - * - * Return: none - * - * Notes: assumes nVals is always a multiple of 2 because all scalefactor bands - * are a multiple of 4 coefficients long - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static void UnpackPairsNoEsc(BitStreamInfo *bsi, int cb, int nVals, int *coef) -{ - int y, z, maxBits, nCodeBits, nSignBits, val; - unsigned int bitBuf; - - maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 2; - while (nVals > 0) { - /* decode pair */ - bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); - nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb-HUFFTAB_SPEC_OFFSET], bitBuf, &val); - - y = GET_PAIR_Y(val); - z = GET_PAIR_Z(val); - - bitBuf <<= nCodeBits; - nSignBits = GET_PAIR_SIGNBITS(val); - AdvanceBitstream(bsi, nCodeBits + nSignBits); - if (nSignBits) { - if (y) {APPLY_SIGN(y, bitBuf); bitBuf <<= 1;} - if (z) {APPLY_SIGN(z, bitBuf); bitBuf <<= 1;} - } - *coef++ = y; *coef++ = z; - nVals -= 2; - } -} - -/************************************************************************************** - * Function: UnpackPairsEsc - * - * Description: decode a section of 2-way vector Huffman coded coefficients, - * using esc table (11) - * - * Inputs BitStreamInfo struct pointing to start of codewords for this section - * index of Huffman codebook (must be the escape codebook) - * number of coefficients - * - * Outputs: nVals coefficients, starting at coef - * - * Return: none - * - * Notes: assumes nVals is always a multiple of 2 because all scalefactor bands - * are a multiple of 4 coefficients long - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static void UnpackPairsEsc(BitStreamInfo *bsi, int cb, int nVals, int *coef) -{ - int y, z, maxBits, nCodeBits, nSignBits, n, val; - unsigned int bitBuf; - - maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 2; - while (nVals > 0) { - /* decode pair with escape value */ - bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); - nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb-HUFFTAB_SPEC_OFFSET], bitBuf, &val); - - y = GET_ESC_Y(val); - z = GET_ESC_Z(val); - - bitBuf <<= nCodeBits; - nSignBits = GET_ESC_SIGNBITS(val); - AdvanceBitstream(bsi, nCodeBits + nSignBits); - - if (y == 16) { - n = 4; - while (GetBits(bsi, 1) == 1) - n++; - y = (1 << n) + GetBits(bsi, n); - } - if (z == 16) { - n = 4; - while (GetBits(bsi, 1) == 1) - n++; - z = (1 << n) + GetBits(bsi, n); - } - - if (nSignBits) { - if (y) {APPLY_SIGN(y, bitBuf); bitBuf <<= 1;} - if (z) {APPLY_SIGN(z, bitBuf); bitBuf <<= 1;} - } - - *coef++ = y; *coef++ = z; - nVals -= 2; - } -} - -/************************************************************************************** - * Function: DecodeSpectrumLong - * - * Description: decode transform coefficients for frame with one long block - * - * Inputs: platform specific info struct - * BitStreamInfo struct pointing to start of spectral data - * (14496-3, table 4.4.29) - * index of current channel - * - * Outputs: decoded, quantized coefficients for this channel - * - * Return: none - * - * Notes: adds in pulse data if present - * fills coefficient buffer with zeros in any region not coded with - * codebook in range [1, 11] (including sfb's above sfbMax) - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ void DecodeSpectrumLong(PSInfoBase *psi, BitStreamInfo *bsi, int ch) -{ - int i, sfb, cb, nVals, offset; - const /*short*/ int *sfbTab; - unsigned char *sfbCodeBook; - int *coef; - ICSInfo *icsInfo; - PulseInfo *pi; - - coef = psi->coef[ch]; - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - /* decode long block */ - sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; - sfbCodeBook = psi->sfbCodeBook[ch]; - for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { - cb = *sfbCodeBook++; - nVals = sfbTab[sfb+1] - sfbTab[sfb]; - - if (cb == 0) - UnpackZeros(nVals, coef); - else if (cb <= 4) - UnpackQuads(bsi, cb, nVals, coef); - else if (cb <= 10) - UnpackPairsNoEsc(bsi, cb, nVals, coef); - else if (cb == 11) - UnpackPairsEsc(bsi, cb, nVals, coef); - else - UnpackZeros(nVals, coef); - - coef += nVals; - } - - /* fill with zeros above maxSFB */ - nVals = NSAMPS_LONG - sfbTab[sfb]; - UnpackZeros(nVals, coef); - - /* add pulse data, if present */ - pi = &psi->pulseInfo[ch]; - if (pi->pulseDataPresent) { - coef = psi->coef[ch]; - offset = sfbTab[pi->startSFB]; - for (i = 0; i < pi->numPulse; i++) { - offset += pi->offset[i]; - if (coef[offset] > 0) - coef[offset] += pi->amp[i]; - else - coef[offset] -= pi->amp[i]; - } - ASSERT(offset < NSAMPS_LONG); - } -} - -/************************************************************************************** - * Function: DecodeSpectrumShort - * - * Description: decode transform coefficients for frame with eight short blocks - * - * Inputs: platform specific info struct - * BitStreamInfo struct pointing to start of spectral data - * (14496-3, table 4.4.29) - * index of current channel - * - * Outputs: decoded, quantized coefficients for this channel - * - * Return: none - * - * Notes: fills coefficient buffer with zeros in any region not coded with - * codebook in range [1, 11] (including sfb's above sfbMax) - * deinterleaves window groups into 8 windows - **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ void DecodeSpectrumShort(PSInfoBase *psi, BitStreamInfo *bsi, int ch) -{ - int gp, cb, nVals=0, win, offset, sfb; - const /*short*/ int *sfbTab; - unsigned char *sfbCodeBook; - int *coef; - ICSInfo *icsInfo; - - coef = psi->coef[ch]; - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - /* decode short blocks, deinterleaving in-place */ - sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; - sfbCodeBook = psi->sfbCodeBook[ch]; - for (gp = 0; gp < icsInfo->numWinGroup; gp++) { - for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { - nVals = sfbTab[sfb+1] - sfbTab[sfb]; - cb = *sfbCodeBook++; - - for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { - offset = win*NSAMPS_SHORT; - if (cb == 0) - UnpackZeros(nVals, coef + offset); - else if (cb <= 4) - UnpackQuads(bsi, cb, nVals, coef + offset); - else if (cb <= 10) - UnpackPairsNoEsc(bsi, cb, nVals, coef + offset); - else if (cb == 11) - UnpackPairsEsc(bsi, cb, nVals, coef + offset); - else - UnpackZeros(nVals, coef + offset); - } - coef += nVals; - } - - /* fill with zeros above maxSFB */ - for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { - offset = win*NSAMPS_SHORT; - nVals = NSAMPS_SHORT - sfbTab[sfb]; - UnpackZeros(nVals, coef + offset); - } - coef += nVals; - coef += (icsInfo->winGroupLen[gp] - 1)*NSAMPS_SHORT; - } - - ASSERT(coef == psi->coef[ch] + NSAMPS_LONG); -} diff --git a/src/libhelix-aac/huffmanaac.c b/src/libhelix-aac/huffmanaac.c new file mode 100644 index 00000000..ceb9712d --- /dev/null +++ b/src/libhelix-aac/huffmanaac.c @@ -0,0 +1,441 @@ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: huffman.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ + +/************************************************************************************** + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + huffman.c - Huffman decoding + **************************************************************************************/ + +#include "coder.h" + +/************************************************************************************** + Function: DecodeHuffmanScalar + + Description: decode one Huffman symbol from bitstream + + Inputs: pointers to Huffman table and info struct + left-aligned bit buffer with >= huffTabInfo->maxBits bits + + Outputs: decoded symbol in *val + + Return: number of bits in symbol + + Notes: assumes canonical Huffman codes: + first CW always 0, we have "count" CW's of length "nBits" bits + starting CW for codes of length nBits+1 = + (startCW[nBits] + count[nBits]) << 1 + if there are no codes at nBits, then we just keep << 1 each time + (since count[nBits] = 0) + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ int DecodeHuffmanScalar(const signed short *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val) { + unsigned int count, start, shift, t; + const unsigned /*char*/ int *countPtr; + const signed short *map; + + map = huffTab + huffTabInfo->offset; + countPtr = huffTabInfo->count; + + start = 0; + count = 0; + shift = 32; + do { + start += count; + start <<= 1; + map += count; + count = *countPtr++; + shift--; + t = (bitBuf >> shift) - start; + } while (t >= count); + +#ifdef ESP8266 + *val = (signed int)pgm_read_word(&map[t]); +#else + *val = map[t]; +#endif + return (countPtr - huffTabInfo->count); +} + +#define APPLY_SIGN(v, s) {(v) ^= ((signed int)(s) >> 31); (v) -= ((signed int)(s) >> 31);} + +#define GET_QUAD_SIGNBITS(v) (((unsigned int)(v) << 17) >> 29) /* bits 14-12, unsigned */ +#define GET_QUAD_W(v) (((signed int)(v) << 20) >> 29) /* bits 11-9, sign-extend */ +#define GET_QUAD_X(v) (((signed int)(v) << 23) >> 29) /* bits 8-6, sign-extend */ +#define GET_QUAD_Y(v) (((signed int)(v) << 26) >> 29) /* bits 5-3, sign-extend */ +#define GET_QUAD_Z(v) (((signed int)(v) << 29) >> 29) /* bits 2-0, sign-extend */ + +#define GET_PAIR_SIGNBITS(v) (((unsigned int)(v) << 20) >> 30) /* bits 11-10, unsigned */ +#define GET_PAIR_Y(v) (((signed int)(v) << 22) >> 27) /* bits 9-5, sign-extend */ +#define GET_PAIR_Z(v) (((signed int)(v) << 27) >> 27) /* bits 4-0, sign-extend */ + +#define GET_ESC_SIGNBITS(v) (((unsigned int)(v) << 18) >> 30) /* bits 13-12, unsigned */ +#define GET_ESC_Y(v) (((signed int)(v) << 20) >> 26) /* bits 11-6, sign-extend */ +#define GET_ESC_Z(v) (((signed int)(v) << 26) >> 26) /* bits 5-0, sign-extend */ + +/************************************************************************************** + Function: UnpackZeros + + Description: fill a section of coefficients with zeros + + Inputs: number of coefficients + + Outputs: nVals zeros, starting at coef + + Return: none + + Notes: assumes nVals is always a multiple of 4 because all scalefactor bands + are a multiple of 4 coefficients long + **************************************************************************************/ +static void UnpackZeros(int nVals, int *coef) { + while (nVals > 0) { + *coef++ = 0; + *coef++ = 0; + *coef++ = 0; + *coef++ = 0; + nVals -= 4; + } +} + +/************************************************************************************** + Function: UnpackQuads + + Description: decode a section of 4-way vector Huffman coded coefficients + + Inputs BitStreamInfo struct pointing to start of codewords for this section + index of Huffman codebook + number of coefficients + + Outputs: nVals coefficients, starting at coef + + Return: none + + Notes: assumes nVals is always a multiple of 4 because all scalefactor bands + are a multiple of 4 coefficients long + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ static void UnpackQuads(BitStreamInfo *bsi, int cb, int nVals, int *coef) { + int w, x, y, z, maxBits, nCodeBits, nSignBits, val; + unsigned int bitBuf; + + maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 4; + while (nVals > 0) { + /* decode quad */ + bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); + nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET], bitBuf, &val); + + w = GET_QUAD_W(val); + x = GET_QUAD_X(val); + y = GET_QUAD_Y(val); + z = GET_QUAD_Z(val); + + bitBuf <<= nCodeBits; + nSignBits = (int)GET_QUAD_SIGNBITS(val); + AdvanceBitstream(bsi, nCodeBits + nSignBits); + if (nSignBits) { + if (w) { + APPLY_SIGN(w, bitBuf); + bitBuf <<= 1; + } + if (x) { + APPLY_SIGN(x, bitBuf); + bitBuf <<= 1; + } + if (y) { + APPLY_SIGN(y, bitBuf); + bitBuf <<= 1; + } + if (z) { + APPLY_SIGN(z, bitBuf); + bitBuf <<= 1; + } + } + *coef++ = w; *coef++ = x; *coef++ = y; *coef++ = z; + nVals -= 4; + } +} + +/************************************************************************************** + Function: UnpackPairsNoEsc + + Description: decode a section of 2-way vector Huffman coded coefficients, + using non-esc tables (5 through 10) + + Inputs BitStreamInfo struct pointing to start of codewords for this section + index of Huffman codebook (must not be the escape codebook) + number of coefficients + + Outputs: nVals coefficients, starting at coef + + Return: none + + Notes: assumes nVals is always a multiple of 2 because all scalefactor bands + are a multiple of 4 coefficients long + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ static void UnpackPairsNoEsc(BitStreamInfo *bsi, int cb, int nVals, int *coef) { + int y, z, maxBits, nCodeBits, nSignBits, val; + unsigned int bitBuf; + + maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 2; + while (nVals > 0) { + /* decode pair */ + bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); + nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET], bitBuf, &val); + + y = GET_PAIR_Y(val); + z = GET_PAIR_Z(val); + + bitBuf <<= nCodeBits; + nSignBits = GET_PAIR_SIGNBITS(val); + AdvanceBitstream(bsi, nCodeBits + nSignBits); + if (nSignBits) { + if (y) { + APPLY_SIGN(y, bitBuf); + bitBuf <<= 1; + } + if (z) { + APPLY_SIGN(z, bitBuf); + bitBuf <<= 1; + } + } + *coef++ = y; *coef++ = z; + nVals -= 2; + } +} + +/************************************************************************************** + Function: UnpackPairsEsc + + Description: decode a section of 2-way vector Huffman coded coefficients, + using esc table (11) + + Inputs BitStreamInfo struct pointing to start of codewords for this section + index of Huffman codebook (must be the escape codebook) + number of coefficients + + Outputs: nVals coefficients, starting at coef + + Return: none + + Notes: assumes nVals is always a multiple of 2 because all scalefactor bands + are a multiple of 4 coefficients long + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ static void UnpackPairsEsc(BitStreamInfo *bsi, int cb, int nVals, int *coef) { + int y, z, maxBits, nCodeBits, nSignBits, n, val; + unsigned int bitBuf; + + maxBits = huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET].maxBits + 2; + while (nVals > 0) { + /* decode pair with escape value */ + bitBuf = GetBitsNoAdvance(bsi, maxBits) << (32 - maxBits); + nCodeBits = DecodeHuffmanScalar(huffTabSpec, &huffTabSpecInfo[cb - HUFFTAB_SPEC_OFFSET], bitBuf, &val); + + y = GET_ESC_Y(val); + z = GET_ESC_Z(val); + + bitBuf <<= nCodeBits; + nSignBits = GET_ESC_SIGNBITS(val); + AdvanceBitstream(bsi, nCodeBits + nSignBits); + + if (y == 16) { + n = 4; + while (GetBits(bsi, 1) == 1) { + n++; + } + y = (1 << n) + GetBits(bsi, n); + } + if (z == 16) { + n = 4; + while (GetBits(bsi, 1) == 1) { + n++; + } + z = (1 << n) + GetBits(bsi, n); + } + + if (nSignBits) { + if (y) { + APPLY_SIGN(y, bitBuf); + bitBuf <<= 1; + } + if (z) { + APPLY_SIGN(z, bitBuf); + bitBuf <<= 1; + } + } + + *coef++ = y; *coef++ = z; + nVals -= 2; + } +} + +/************************************************************************************** + Function: DecodeSpectrumLong + + Description: decode transform coefficients for frame with one long block + + Inputs: platform specific info struct + BitStreamInfo struct pointing to start of spectral data + (14496-3, table 4.4.29) + index of current channel + + Outputs: decoded, quantized coefficients for this channel + + Return: none + + Notes: adds in pulse data if present + fills coefficient buffer with zeros in any region not coded with + codebook in range [1, 11] (including sfb's above sfbMax) + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ void DecodeSpectrumLong(PSInfoBase *psi, BitStreamInfo *bsi, int ch) { + int i, sfb, cb, nVals, offset; + const /*short*/ int *sfbTab; + unsigned char *sfbCodeBook; + int *coef; + ICSInfo *icsInfo; + PulseInfo *pi; + + coef = psi->coef[ch]; + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + /* decode long block */ + sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; + sfbCodeBook = psi->sfbCodeBook[ch]; + for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { + cb = *sfbCodeBook++; + nVals = sfbTab[sfb + 1] - sfbTab[sfb]; + + if (cb == 0) { + UnpackZeros(nVals, coef); + } else if (cb <= 4) { + UnpackQuads(bsi, cb, nVals, coef); + } else if (cb <= 10) { + UnpackPairsNoEsc(bsi, cb, nVals, coef); + } else if (cb == 11) { + UnpackPairsEsc(bsi, cb, nVals, coef); + } else { + UnpackZeros(nVals, coef); + } + + coef += nVals; + } + + /* fill with zeros above maxSFB */ + nVals = NSAMPS_LONG - sfbTab[sfb]; + UnpackZeros(nVals, coef); + + /* add pulse data, if present */ + pi = &psi->pulseInfo[ch]; + if (pi->pulseDataPresent) { + coef = psi->coef[ch]; + offset = sfbTab[pi->startSFB]; + for (i = 0; i < pi->numPulse; i++) { + offset += pi->offset[i]; + if (coef[offset] > 0) { + coef[offset] += pi->amp[i]; + } else { + coef[offset] -= pi->amp[i]; + } + } + ASSERT(offset < NSAMPS_LONG); + } +} + +/************************************************************************************** + Function: DecodeSpectrumShort + + Description: decode transform coefficients for frame with eight short blocks + + Inputs: platform specific info struct + BitStreamInfo struct pointing to start of spectral data + (14496-3, table 4.4.29) + index of current channel + + Outputs: decoded, quantized coefficients for this channel + + Return: none + + Notes: fills coefficient buffer with zeros in any region not coded with + codebook in range [1, 11] (including sfb's above sfbMax) + deinterleaves window groups into 8 windows + **************************************************************************************/ +/* __attribute__ ((section (".data"))) */ void DecodeSpectrumShort(PSInfoBase *psi, BitStreamInfo *bsi, int ch) { + int gp, cb, nVals = 0, win, offset, sfb; + const /*short*/ int *sfbTab; + unsigned char *sfbCodeBook; + int *coef; + ICSInfo *icsInfo; + + coef = psi->coef[ch]; + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + /* decode short blocks, deinterleaving in-place */ + sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; + sfbCodeBook = psi->sfbCodeBook[ch]; + for (gp = 0; gp < icsInfo->numWinGroup; gp++) { + for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { + nVals = sfbTab[sfb + 1] - sfbTab[sfb]; + cb = *sfbCodeBook++; + + for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { + offset = win * NSAMPS_SHORT; + if (cb == 0) { + UnpackZeros(nVals, coef + offset); + } else if (cb <= 4) { + UnpackQuads(bsi, cb, nVals, coef + offset); + } else if (cb <= 10) { + UnpackPairsNoEsc(bsi, cb, nVals, coef + offset); + } else if (cb == 11) { + UnpackPairsEsc(bsi, cb, nVals, coef + offset); + } else { + UnpackZeros(nVals, coef + offset); + } + } + coef += nVals; + } + + /* fill with zeros above maxSFB */ + for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { + offset = win * NSAMPS_SHORT; + nVals = NSAMPS_SHORT - sfbTab[sfb]; + UnpackZeros(nVals, coef + offset); + } + coef += nVals; + coef += (icsInfo->winGroupLen[gp] - 1) * NSAMPS_SHORT; + } + + ASSERT(coef == psi->coef[ch] + NSAMPS_LONG); +} diff --git a/src/libhelix-aac/hufftabs.c b/src/libhelix-aac/hufftabs.c index 91cc50ce..b8a3a7a4 100644 --- a/src/libhelix-aac/hufftabs.c +++ b/src/libhelix-aac/hufftabs.c @@ -1,177 +1,177 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: hufftabs.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: hufftabs.c,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * hufftabs.c - Huffman symbol tables + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + hufftabs.c - Huffman symbol tables **************************************************************************************/ #include "coder.h" const HuffInfo huffTabSpecInfo[11] PROGMEM = { - /* table 0 not used */ - {11, { 1, 0, 0, 0, 8, 0, 24, 0, 24, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0}, - { 9, { 0, 0, 1, 1, 7, 24, 15, 19, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 81}, - {16, { 1, 0, 0, 4, 2, 6, 3, 5, 15, 15, 8, 9, 3, 3, 5, 2, 0, 0, 0, 0}, 162}, - {12, { 0, 0, 0, 10, 6, 0, 9, 21, 8, 14, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0}, 243}, - {13, { 1, 0, 0, 4, 4, 0, 4, 12, 12, 12, 18, 10, 4, 0, 0, 0, 0, 0, 0, 0}, 324}, - {11, { 0, 0, 0, 9, 0, 16, 13, 8, 23, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 405}, - {12, { 1, 0, 2, 1, 0, 4, 5, 10, 14, 15, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0}, 486}, - {10, { 0, 0, 1, 5, 7, 10, 14, 15, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 550}, - {15, { 1, 0, 2, 1, 0, 4, 3, 8, 11, 20, 31, 38, 32, 14, 4, 0, 0, 0, 0, 0}, 614}, - {12, { 0, 0, 0, 3, 8, 14, 17, 25, 31, 41, 22, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 783}, - {12, { 0, 0, 0, 2, 6, 7, 16, 59, 55, 95, 43, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 952}, + /* table 0 not used */ + {11, { 1, 0, 0, 0, 8, 0, 24, 0, 24, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0}, + { 9, { 0, 0, 1, 1, 7, 24, 15, 19, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 81}, + {16, { 1, 0, 0, 4, 2, 6, 3, 5, 15, 15, 8, 9, 3, 3, 5, 2, 0, 0, 0, 0}, 162}, + {12, { 0, 0, 0, 10, 6, 0, 9, 21, 8, 14, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0}, 243}, + {13, { 1, 0, 0, 4, 4, 0, 4, 12, 12, 12, 18, 10, 4, 0, 0, 0, 0, 0, 0, 0}, 324}, + {11, { 0, 0, 0, 9, 0, 16, 13, 8, 23, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 405}, + {12, { 1, 0, 2, 1, 0, 4, 5, 10, 14, 15, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0}, 486}, + {10, { 0, 0, 1, 5, 7, 10, 14, 15, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 550}, + {15, { 1, 0, 2, 1, 0, 4, 3, 8, 11, 20, 31, 38, 32, 14, 4, 0, 0, 0, 0, 0}, 614}, + {12, { 0, 0, 0, 3, 8, 14, 17, 25, 31, 41, 22, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 783}, + {12, { 0, 0, 0, 2, 6, 7, 16, 59, 55, 95, 43, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 952}, }; const signed short huffTabSpec[1241] PROGMEM = { - /* spectrum table 1 [81] (signed) */ - 0x0000, 0x0200, 0x0e00, 0x0007, 0x0040, 0x0001, 0x0038, 0x0008, 0x01c0, 0x03c0, 0x0e40, 0x0039, 0x0078, 0x01c8, 0x000f, 0x0240, - 0x003f, 0x0fc0, 0x01f8, 0x0238, 0x0047, 0x0e08, 0x0009, 0x0208, 0x01c1, 0x0048, 0x0041, 0x0e38, 0x0201, 0x0e07, 0x0207, 0x0e01, - 0x01c7, 0x0278, 0x0e78, 0x03c8, 0x004f, 0x0079, 0x01c9, 0x01cf, 0x03f8, 0x0239, 0x007f, 0x0e48, 0x0e0f, 0x0fc8, 0x01f9, 0x03c1, - 0x03c7, 0x0e47, 0x0ff8, 0x01ff, 0x0049, 0x020f, 0x0241, 0x0e41, 0x0248, 0x0fc1, 0x0e3f, 0x0247, 0x023f, 0x0e39, 0x0fc7, 0x0e09, - 0x0209, 0x03cf, 0x0e79, 0x0e4f, 0x03f9, 0x0249, 0x0fc9, 0x027f, 0x0fcf, 0x0fff, 0x0279, 0x03c9, 0x0e49, 0x0e7f, 0x0ff9, 0x03ff, - 0x024f, - /* spectrum table 2 [81] (signed) */ - 0x0000, 0x0200, 0x0e00, 0x0001, 0x0038, 0x0007, 0x01c0, 0x0008, 0x0040, 0x01c8, 0x0e40, 0x0078, 0x000f, 0x0047, 0x0039, 0x0e07, - 0x03c0, 0x0238, 0x0fc0, 0x003f, 0x0208, 0x0201, 0x01c1, 0x0e08, 0x0041, 0x01f8, 0x0e01, 0x01c7, 0x0e38, 0x0240, 0x0048, 0x0009, - 0x0207, 0x0079, 0x0239, 0x0e78, 0x01cf, 0x03c8, 0x0247, 0x0209, 0x0e48, 0x01f9, 0x0248, 0x0e0f, 0x0ff8, 0x0e39, 0x03f8, 0x0278, - 0x03c1, 0x0e47, 0x0fc8, 0x0e09, 0x0fc1, 0x0fc7, 0x01ff, 0x020f, 0x023f, 0x007f, 0x0049, 0x0e41, 0x0e3f, 0x004f, 0x03c7, 0x01c9, - 0x0241, 0x03cf, 0x0e79, 0x03f9, 0x0fff, 0x0e4f, 0x0e49, 0x0249, 0x0fcf, 0x03c9, 0x0e7f, 0x0fc9, 0x027f, 0x03ff, 0x0ff9, 0x0279, - 0x024f, - /* spectrum table 3 [81] (unsigned) */ - 0x0000, 0x1200, 0x1001, 0x1040, 0x1008, 0x2240, 0x2009, 0x2048, 0x2041, 0x2208, 0x3049, 0x2201, 0x3248, 0x4249, 0x3209, 0x3241, - 0x1400, 0x1002, 0x200a, 0x2440, 0x3288, 0x2011, 0x3051, 0x2280, 0x304a, 0x3448, 0x1010, 0x2088, 0x2050, 0x1080, 0x2042, 0x2408, - 0x4289, 0x3089, 0x3250, 0x4251, 0x3281, 0x2210, 0x3211, 0x2081, 0x4449, 0x424a, 0x3441, 0x320a, 0x2012, 0x3052, 0x3488, 0x3290, - 0x2202, 0x2401, 0x3091, 0x2480, 0x4291, 0x3242, 0x3409, 0x4252, 0x4489, 0x2090, 0x308a, 0x3212, 0x3481, 0x3450, 0x3490, 0x3092, - 0x4491, 0x4451, 0x428a, 0x4292, 0x2082, 0x2410, 0x3282, 0x3411, 0x444a, 0x3442, 0x4492, 0x448a, 0x4452, 0x340a, 0x2402, 0x3482, - 0x3412, - /* spectrum table 4 [81] (unsigned) */ - 0x4249, 0x3049, 0x3241, 0x3248, 0x3209, 0x1200, 0x2240, 0x0000, 0x2009, 0x2208, 0x2201, 0x2048, 0x1001, 0x2041, 0x1008, 0x1040, - 0x4449, 0x4251, 0x4289, 0x424a, 0x3448, 0x3441, 0x3288, 0x3409, 0x3051, 0x304a, 0x3250, 0x3089, 0x320a, 0x3281, 0x3242, 0x3211, - 0x2440, 0x2408, 0x2280, 0x2401, 0x2042, 0x2088, 0x200a, 0x2050, 0x2081, 0x2202, 0x2011, 0x2210, 0x1400, 0x1002, 0x1080, 0x1010, - 0x4291, 0x4489, 0x4451, 0x4252, 0x428a, 0x444a, 0x3290, 0x3488, 0x3450, 0x3091, 0x3052, 0x3481, 0x308a, 0x3411, 0x3212, 0x4491, - 0x3282, 0x340a, 0x3442, 0x4292, 0x4452, 0x448a, 0x2090, 0x2480, 0x2012, 0x2410, 0x2082, 0x2402, 0x4492, 0x3092, 0x3490, 0x3482, - 0x3412, - /* spectrum table 5 [81] (signed) */ - 0x0000, 0x03e0, 0x0020, 0x0001, 0x001f, 0x003f, 0x03e1, 0x03ff, 0x0021, 0x03c0, 0x0002, 0x0040, 0x001e, 0x03df, 0x0041, 0x03fe, - 0x0022, 0x03c1, 0x005f, 0x03e2, 0x003e, 0x03a0, 0x0060, 0x001d, 0x0003, 0x03bf, 0x0023, 0x0061, 0x03fd, 0x03a1, 0x007f, 0x003d, - 0x03e3, 0x03c2, 0x0042, 0x03de, 0x005e, 0x03be, 0x007e, 0x03c3, 0x005d, 0x0062, 0x0043, 0x03a2, 0x03dd, 0x001c, 0x0380, 0x0081, - 0x0080, 0x039f, 0x0004, 0x009f, 0x03fc, 0x0024, 0x03e4, 0x0381, 0x003c, 0x007d, 0x03bd, 0x03a3, 0x03c4, 0x039e, 0x0082, 0x005c, - 0x0044, 0x0063, 0x0382, 0x03dc, 0x009e, 0x007c, 0x039d, 0x0383, 0x0064, 0x03a4, 0x0083, 0x009d, 0x03bc, 0x009c, 0x0384, 0x0084, - 0x039c, - /* spectrum table 6 [81] (signed) */ - 0x0000, 0x0020, 0x001f, 0x0001, 0x03e0, 0x0021, 0x03e1, 0x003f, 0x03ff, 0x005f, 0x0041, 0x03c1, 0x03df, 0x03c0, 0x03e2, 0x0040, - 0x003e, 0x0022, 0x001e, 0x03fe, 0x0002, 0x005e, 0x03c2, 0x03de, 0x0042, 0x03a1, 0x0061, 0x007f, 0x03e3, 0x03bf, 0x0023, 0x003d, - 0x03fd, 0x0060, 0x03a0, 0x001d, 0x0003, 0x0062, 0x03be, 0x03c3, 0x0043, 0x007e, 0x005d, 0x03dd, 0x03a2, 0x0063, 0x007d, 0x03bd, - 0x03a3, 0x003c, 0x03fc, 0x0081, 0x0381, 0x039f, 0x0024, 0x009f, 0x03e4, 0x001c, 0x0382, 0x039e, 0x0044, 0x03dc, 0x0380, 0x0082, - 0x009e, 0x03c4, 0x0080, 0x005c, 0x0004, 0x03bc, 0x03a4, 0x007c, 0x009d, 0x0064, 0x0083, 0x0383, 0x039d, 0x0084, 0x0384, 0x039c, - 0x009c, - /* spectrum table 7 [64] (unsigned) */ - 0x0000, 0x0420, 0x0401, 0x0821, 0x0841, 0x0822, 0x0440, 0x0402, 0x0861, 0x0823, 0x0842, 0x0460, 0x0403, 0x0843, 0x0862, 0x0824, - 0x0881, 0x0825, 0x08a1, 0x0863, 0x0844, 0x0404, 0x0480, 0x0882, 0x0845, 0x08a2, 0x0405, 0x08c1, 0x04a0, 0x0826, 0x0883, 0x0865, - 0x0864, 0x08a3, 0x0846, 0x08c2, 0x0827, 0x0866, 0x0406, 0x04c0, 0x0884, 0x08e1, 0x0885, 0x08e2, 0x08a4, 0x08c3, 0x0847, 0x08e3, - 0x08c4, 0x08a5, 0x0886, 0x0867, 0x04e0, 0x0407, 0x08c5, 0x08a6, 0x08e4, 0x0887, 0x08a7, 0x08e5, 0x08e6, 0x08c6, 0x08c7, 0x08e7, - /* spectrum table 8 [64] (unsigned) */ - 0x0821, 0x0841, 0x0420, 0x0822, 0x0401, 0x0842, 0x0000, 0x0440, 0x0402, 0x0861, 0x0823, 0x0862, 0x0843, 0x0863, 0x0881, 0x0824, - 0x0882, 0x0844, 0x0460, 0x0403, 0x0883, 0x0864, 0x08a2, 0x08a1, 0x0845, 0x0825, 0x08a3, 0x0865, 0x0884, 0x08a4, 0x0404, 0x0885, - 0x0480, 0x0846, 0x08c2, 0x08c1, 0x0826, 0x0866, 0x08c3, 0x08a5, 0x04a0, 0x08c4, 0x0405, 0x0886, 0x08e1, 0x08e2, 0x0847, 0x08c5, - 0x08e3, 0x0827, 0x08a6, 0x0867, 0x08c6, 0x08e4, 0x04c0, 0x0887, 0x0406, 0x08e5, 0x08e6, 0x08c7, 0x08a7, 0x04e0, 0x0407, 0x08e7, - /* spectrum table 9 [169] (unsigned) */ - 0x0000, 0x0420, 0x0401, 0x0821, 0x0841, 0x0822, 0x0440, 0x0402, 0x0861, 0x0842, 0x0823, 0x0460, 0x0403, 0x0843, 0x0862, 0x0824, - 0x0881, 0x0844, 0x0825, 0x0882, 0x0863, 0x0404, 0x0480, 0x08a1, 0x0845, 0x0826, 0x0864, 0x08a2, 0x08c1, 0x0883, 0x0405, 0x0846, - 0x04a0, 0x0827, 0x0865, 0x0828, 0x0901, 0x0884, 0x08a3, 0x08c2, 0x08e1, 0x0406, 0x0902, 0x0848, 0x0866, 0x0847, 0x0885, 0x0921, - 0x0829, 0x08e2, 0x04c0, 0x08a4, 0x08c3, 0x0903, 0x0407, 0x0922, 0x0868, 0x0886, 0x0867, 0x0408, 0x0941, 0x08c4, 0x0849, 0x08a5, - 0x0500, 0x04e0, 0x08e3, 0x0942, 0x0923, 0x0904, 0x082a, 0x08e4, 0x08c5, 0x08a6, 0x0888, 0x0887, 0x0869, 0x0961, 0x08a8, 0x0520, - 0x0905, 0x0943, 0x084a, 0x0409, 0x0962, 0x0924, 0x08c6, 0x0981, 0x0889, 0x0906, 0x082b, 0x0925, 0x0944, 0x08a7, 0x08e5, 0x084b, - 0x082c, 0x0982, 0x0963, 0x086a, 0x08a9, 0x08c7, 0x0907, 0x0964, 0x040a, 0x08e6, 0x0983, 0x0540, 0x0945, 0x088a, 0x08c8, 0x084c, - 0x0926, 0x0927, 0x088b, 0x0560, 0x08c9, 0x086b, 0x08aa, 0x0908, 0x08e8, 0x0985, 0x086c, 0x0965, 0x08e7, 0x0984, 0x0966, 0x0946, - 0x088c, 0x08e9, 0x08ab, 0x040b, 0x0986, 0x08ca, 0x0580, 0x0947, 0x08ac, 0x08ea, 0x0928, 0x040c, 0x0967, 0x0909, 0x0929, 0x0948, - 0x08eb, 0x0987, 0x08cb, 0x090b, 0x0968, 0x08ec, 0x08cc, 0x090a, 0x0949, 0x090c, 0x092a, 0x092b, 0x092c, 0x094b, 0x0989, 0x094a, - 0x0969, 0x0988, 0x096a, 0x098a, 0x098b, 0x094c, 0x096b, 0x096c, 0x098c, - /* spectrum table 10 [169] (unsigned) */ - 0x0821, 0x0822, 0x0841, 0x0842, 0x0420, 0x0401, 0x0823, 0x0862, 0x0861, 0x0843, 0x0863, 0x0440, 0x0402, 0x0844, 0x0882, 0x0824, - 0x0881, 0x0000, 0x0883, 0x0864, 0x0460, 0x0403, 0x0884, 0x0845, 0x08a2, 0x0825, 0x08a1, 0x08a3, 0x0865, 0x08a4, 0x0885, 0x08c2, - 0x0846, 0x08c3, 0x0480, 0x08c1, 0x0404, 0x0826, 0x0866, 0x08a5, 0x08c4, 0x0886, 0x08c5, 0x08e2, 0x0867, 0x0847, 0x08a6, 0x0902, - 0x08e3, 0x04a0, 0x08e1, 0x0405, 0x0901, 0x0827, 0x0903, 0x08e4, 0x0887, 0x0848, 0x08c6, 0x08e5, 0x0828, 0x0868, 0x0904, 0x0888, - 0x08a7, 0x0905, 0x08a8, 0x08e6, 0x08c7, 0x0922, 0x04c0, 0x08c8, 0x0923, 0x0869, 0x0921, 0x0849, 0x0406, 0x0906, 0x0924, 0x0889, - 0x0942, 0x0829, 0x08e7, 0x0907, 0x0925, 0x08e8, 0x0943, 0x08a9, 0x0944, 0x084a, 0x0941, 0x086a, 0x0926, 0x08c9, 0x0500, 0x088a, - 0x04e0, 0x0962, 0x08e9, 0x0963, 0x0946, 0x082a, 0x0961, 0x0927, 0x0407, 0x0908, 0x0945, 0x086b, 0x08aa, 0x0909, 0x0965, 0x0408, - 0x0964, 0x084b, 0x08ea, 0x08ca, 0x0947, 0x088b, 0x082b, 0x0982, 0x0928, 0x0983, 0x0966, 0x08ab, 0x0984, 0x0967, 0x0985, 0x086c, - 0x08cb, 0x0520, 0x0948, 0x0540, 0x0981, 0x0409, 0x088c, 0x0929, 0x0986, 0x084c, 0x090a, 0x092a, 0x082c, 0x0968, 0x0987, 0x08eb, - 0x08ac, 0x08cc, 0x0949, 0x090b, 0x0988, 0x040a, 0x08ec, 0x0560, 0x094a, 0x0969, 0x096a, 0x040b, 0x096b, 0x092b, 0x094b, 0x0580, - 0x090c, 0x0989, 0x094c, 0x092c, 0x096c, 0x098b, 0x040c, 0x098a, 0x098c, - /* spectrum table 11 [289] (unsigned) */ - 0x0000, 0x2041, 0x2410, 0x1040, 0x1001, 0x2081, 0x2042, 0x2082, 0x2043, 0x20c1, 0x20c2, 0x1080, 0x2083, 0x1002, 0x20c3, 0x2101, - 0x2044, 0x2102, 0x2084, 0x2103, 0x20c4, 0x10c0, 0x1003, 0x2141, 0x2142, 0x2085, 0x2104, 0x2045, 0x2143, 0x20c5, 0x2144, 0x2105, - 0x2182, 0x2086, 0x2181, 0x2183, 0x20c6, 0x2046, 0x2110, 0x20d0, 0x2405, 0x2403, 0x2404, 0x2184, 0x2406, 0x1100, 0x2106, 0x1004, - 0x2090, 0x2145, 0x2150, 0x2407, 0x2402, 0x2408, 0x2087, 0x21c2, 0x20c7, 0x2185, 0x2146, 0x2190, 0x240a, 0x21c3, 0x21c1, 0x2409, - 0x21d0, 0x2050, 0x2047, 0x2107, 0x240b, 0x21c4, 0x240c, 0x2210, 0x2401, 0x2186, 0x2250, 0x2088, 0x2147, 0x2290, 0x240d, 0x2203, - 0x2202, 0x20c8, 0x1140, 0x240e, 0x22d0, 0x21c5, 0x2108, 0x2187, 0x21c6, 0x1005, 0x2204, 0x240f, 0x2310, 0x2048, 0x2201, 0x2390, - 0x2148, 0x2350, 0x20c9, 0x2205, 0x21c7, 0x2089, 0x2206, 0x2242, 0x2243, 0x23d0, 0x2109, 0x2188, 0x1180, 0x2244, 0x2149, 0x2207, - 0x21c8, 0x2049, 0x2283, 0x1006, 0x2282, 0x2241, 0x2245, 0x210a, 0x208a, 0x2246, 0x20ca, 0x2189, 0x2284, 0x2208, 0x2285, 0x2247, - 0x22c3, 0x204a, 0x11c0, 0x2286, 0x21c9, 0x20cb, 0x214a, 0x2281, 0x210b, 0x22c2, 0x2342, 0x218a, 0x2343, 0x208b, 0x1400, 0x214b, - 0x22c5, 0x22c4, 0x2248, 0x21ca, 0x2209, 0x1010, 0x210d, 0x1007, 0x20cd, 0x22c6, 0x2341, 0x2344, 0x2303, 0x208d, 0x2345, 0x220a, - 0x218b, 0x2288, 0x2287, 0x2382, 0x2304, 0x204b, 0x210c, 0x22c1, 0x20cc, 0x204d, 0x2302, 0x21cb, 0x20ce, 0x214c, 0x214d, 0x2384, - 0x210e, 0x22c7, 0x2383, 0x2305, 0x2346, 0x2306, 0x1200, 0x22c8, 0x208c, 0x2249, 0x2385, 0x218d, 0x228a, 0x23c2, 0x220b, 0x224a, - 0x2386, 0x2289, 0x214e, 0x22c9, 0x2381, 0x208e, 0x218c, 0x204c, 0x2348, 0x1008, 0x2347, 0x21cc, 0x2307, 0x21cd, 0x23c3, 0x2301, - 0x218e, 0x208f, 0x23c5, 0x23c4, 0x204e, 0x224b, 0x210f, 0x2387, 0x220d, 0x2349, 0x220c, 0x214f, 0x20cf, 0x228b, 0x22ca, 0x2308, - 0x23c6, 0x23c7, 0x220e, 0x23c1, 0x21ce, 0x1240, 0x1009, 0x224d, 0x224c, 0x2309, 0x2388, 0x228d, 0x2389, 0x230a, 0x218f, 0x21cf, - 0x224e, 0x23c8, 0x22cb, 0x22ce, 0x204f, 0x228c, 0x228e, 0x234b, 0x234a, 0x22cd, 0x22cc, 0x220f, 0x238b, 0x234c, 0x230d, 0x23c9, - 0x238a, 0x1280, 0x230b, 0x224f, 0x100a, 0x230c, 0x12c0, 0x230e, 0x228f, 0x234d, 0x100d, 0x238c, 0x23ca, 0x23cb, 0x22cf, 0x238d, - 0x1340, 0x100b, 0x234e, 0x23cc, 0x23cd, 0x230f, 0x1380, 0x238e, 0x234f, 0x1300, 0x238f, 0x100e, 0x100c, 0x23ce, 0x13c0, 0x100f, - 0x23cf, + /* spectrum table 1 [81] (signed) */ + 0x0000, 0x0200, 0x0e00, 0x0007, 0x0040, 0x0001, 0x0038, 0x0008, 0x01c0, 0x03c0, 0x0e40, 0x0039, 0x0078, 0x01c8, 0x000f, 0x0240, + 0x003f, 0x0fc0, 0x01f8, 0x0238, 0x0047, 0x0e08, 0x0009, 0x0208, 0x01c1, 0x0048, 0x0041, 0x0e38, 0x0201, 0x0e07, 0x0207, 0x0e01, + 0x01c7, 0x0278, 0x0e78, 0x03c8, 0x004f, 0x0079, 0x01c9, 0x01cf, 0x03f8, 0x0239, 0x007f, 0x0e48, 0x0e0f, 0x0fc8, 0x01f9, 0x03c1, + 0x03c7, 0x0e47, 0x0ff8, 0x01ff, 0x0049, 0x020f, 0x0241, 0x0e41, 0x0248, 0x0fc1, 0x0e3f, 0x0247, 0x023f, 0x0e39, 0x0fc7, 0x0e09, + 0x0209, 0x03cf, 0x0e79, 0x0e4f, 0x03f9, 0x0249, 0x0fc9, 0x027f, 0x0fcf, 0x0fff, 0x0279, 0x03c9, 0x0e49, 0x0e7f, 0x0ff9, 0x03ff, + 0x024f, + /* spectrum table 2 [81] (signed) */ + 0x0000, 0x0200, 0x0e00, 0x0001, 0x0038, 0x0007, 0x01c0, 0x0008, 0x0040, 0x01c8, 0x0e40, 0x0078, 0x000f, 0x0047, 0x0039, 0x0e07, + 0x03c0, 0x0238, 0x0fc0, 0x003f, 0x0208, 0x0201, 0x01c1, 0x0e08, 0x0041, 0x01f8, 0x0e01, 0x01c7, 0x0e38, 0x0240, 0x0048, 0x0009, + 0x0207, 0x0079, 0x0239, 0x0e78, 0x01cf, 0x03c8, 0x0247, 0x0209, 0x0e48, 0x01f9, 0x0248, 0x0e0f, 0x0ff8, 0x0e39, 0x03f8, 0x0278, + 0x03c1, 0x0e47, 0x0fc8, 0x0e09, 0x0fc1, 0x0fc7, 0x01ff, 0x020f, 0x023f, 0x007f, 0x0049, 0x0e41, 0x0e3f, 0x004f, 0x03c7, 0x01c9, + 0x0241, 0x03cf, 0x0e79, 0x03f9, 0x0fff, 0x0e4f, 0x0e49, 0x0249, 0x0fcf, 0x03c9, 0x0e7f, 0x0fc9, 0x027f, 0x03ff, 0x0ff9, 0x0279, + 0x024f, + /* spectrum table 3 [81] (unsigned) */ + 0x0000, 0x1200, 0x1001, 0x1040, 0x1008, 0x2240, 0x2009, 0x2048, 0x2041, 0x2208, 0x3049, 0x2201, 0x3248, 0x4249, 0x3209, 0x3241, + 0x1400, 0x1002, 0x200a, 0x2440, 0x3288, 0x2011, 0x3051, 0x2280, 0x304a, 0x3448, 0x1010, 0x2088, 0x2050, 0x1080, 0x2042, 0x2408, + 0x4289, 0x3089, 0x3250, 0x4251, 0x3281, 0x2210, 0x3211, 0x2081, 0x4449, 0x424a, 0x3441, 0x320a, 0x2012, 0x3052, 0x3488, 0x3290, + 0x2202, 0x2401, 0x3091, 0x2480, 0x4291, 0x3242, 0x3409, 0x4252, 0x4489, 0x2090, 0x308a, 0x3212, 0x3481, 0x3450, 0x3490, 0x3092, + 0x4491, 0x4451, 0x428a, 0x4292, 0x2082, 0x2410, 0x3282, 0x3411, 0x444a, 0x3442, 0x4492, 0x448a, 0x4452, 0x340a, 0x2402, 0x3482, + 0x3412, + /* spectrum table 4 [81] (unsigned) */ + 0x4249, 0x3049, 0x3241, 0x3248, 0x3209, 0x1200, 0x2240, 0x0000, 0x2009, 0x2208, 0x2201, 0x2048, 0x1001, 0x2041, 0x1008, 0x1040, + 0x4449, 0x4251, 0x4289, 0x424a, 0x3448, 0x3441, 0x3288, 0x3409, 0x3051, 0x304a, 0x3250, 0x3089, 0x320a, 0x3281, 0x3242, 0x3211, + 0x2440, 0x2408, 0x2280, 0x2401, 0x2042, 0x2088, 0x200a, 0x2050, 0x2081, 0x2202, 0x2011, 0x2210, 0x1400, 0x1002, 0x1080, 0x1010, + 0x4291, 0x4489, 0x4451, 0x4252, 0x428a, 0x444a, 0x3290, 0x3488, 0x3450, 0x3091, 0x3052, 0x3481, 0x308a, 0x3411, 0x3212, 0x4491, + 0x3282, 0x340a, 0x3442, 0x4292, 0x4452, 0x448a, 0x2090, 0x2480, 0x2012, 0x2410, 0x2082, 0x2402, 0x4492, 0x3092, 0x3490, 0x3482, + 0x3412, + /* spectrum table 5 [81] (signed) */ + 0x0000, 0x03e0, 0x0020, 0x0001, 0x001f, 0x003f, 0x03e1, 0x03ff, 0x0021, 0x03c0, 0x0002, 0x0040, 0x001e, 0x03df, 0x0041, 0x03fe, + 0x0022, 0x03c1, 0x005f, 0x03e2, 0x003e, 0x03a0, 0x0060, 0x001d, 0x0003, 0x03bf, 0x0023, 0x0061, 0x03fd, 0x03a1, 0x007f, 0x003d, + 0x03e3, 0x03c2, 0x0042, 0x03de, 0x005e, 0x03be, 0x007e, 0x03c3, 0x005d, 0x0062, 0x0043, 0x03a2, 0x03dd, 0x001c, 0x0380, 0x0081, + 0x0080, 0x039f, 0x0004, 0x009f, 0x03fc, 0x0024, 0x03e4, 0x0381, 0x003c, 0x007d, 0x03bd, 0x03a3, 0x03c4, 0x039e, 0x0082, 0x005c, + 0x0044, 0x0063, 0x0382, 0x03dc, 0x009e, 0x007c, 0x039d, 0x0383, 0x0064, 0x03a4, 0x0083, 0x009d, 0x03bc, 0x009c, 0x0384, 0x0084, + 0x039c, + /* spectrum table 6 [81] (signed) */ + 0x0000, 0x0020, 0x001f, 0x0001, 0x03e0, 0x0021, 0x03e1, 0x003f, 0x03ff, 0x005f, 0x0041, 0x03c1, 0x03df, 0x03c0, 0x03e2, 0x0040, + 0x003e, 0x0022, 0x001e, 0x03fe, 0x0002, 0x005e, 0x03c2, 0x03de, 0x0042, 0x03a1, 0x0061, 0x007f, 0x03e3, 0x03bf, 0x0023, 0x003d, + 0x03fd, 0x0060, 0x03a0, 0x001d, 0x0003, 0x0062, 0x03be, 0x03c3, 0x0043, 0x007e, 0x005d, 0x03dd, 0x03a2, 0x0063, 0x007d, 0x03bd, + 0x03a3, 0x003c, 0x03fc, 0x0081, 0x0381, 0x039f, 0x0024, 0x009f, 0x03e4, 0x001c, 0x0382, 0x039e, 0x0044, 0x03dc, 0x0380, 0x0082, + 0x009e, 0x03c4, 0x0080, 0x005c, 0x0004, 0x03bc, 0x03a4, 0x007c, 0x009d, 0x0064, 0x0083, 0x0383, 0x039d, 0x0084, 0x0384, 0x039c, + 0x009c, + /* spectrum table 7 [64] (unsigned) */ + 0x0000, 0x0420, 0x0401, 0x0821, 0x0841, 0x0822, 0x0440, 0x0402, 0x0861, 0x0823, 0x0842, 0x0460, 0x0403, 0x0843, 0x0862, 0x0824, + 0x0881, 0x0825, 0x08a1, 0x0863, 0x0844, 0x0404, 0x0480, 0x0882, 0x0845, 0x08a2, 0x0405, 0x08c1, 0x04a0, 0x0826, 0x0883, 0x0865, + 0x0864, 0x08a3, 0x0846, 0x08c2, 0x0827, 0x0866, 0x0406, 0x04c0, 0x0884, 0x08e1, 0x0885, 0x08e2, 0x08a4, 0x08c3, 0x0847, 0x08e3, + 0x08c4, 0x08a5, 0x0886, 0x0867, 0x04e0, 0x0407, 0x08c5, 0x08a6, 0x08e4, 0x0887, 0x08a7, 0x08e5, 0x08e6, 0x08c6, 0x08c7, 0x08e7, + /* spectrum table 8 [64] (unsigned) */ + 0x0821, 0x0841, 0x0420, 0x0822, 0x0401, 0x0842, 0x0000, 0x0440, 0x0402, 0x0861, 0x0823, 0x0862, 0x0843, 0x0863, 0x0881, 0x0824, + 0x0882, 0x0844, 0x0460, 0x0403, 0x0883, 0x0864, 0x08a2, 0x08a1, 0x0845, 0x0825, 0x08a3, 0x0865, 0x0884, 0x08a4, 0x0404, 0x0885, + 0x0480, 0x0846, 0x08c2, 0x08c1, 0x0826, 0x0866, 0x08c3, 0x08a5, 0x04a0, 0x08c4, 0x0405, 0x0886, 0x08e1, 0x08e2, 0x0847, 0x08c5, + 0x08e3, 0x0827, 0x08a6, 0x0867, 0x08c6, 0x08e4, 0x04c0, 0x0887, 0x0406, 0x08e5, 0x08e6, 0x08c7, 0x08a7, 0x04e0, 0x0407, 0x08e7, + /* spectrum table 9 [169] (unsigned) */ + 0x0000, 0x0420, 0x0401, 0x0821, 0x0841, 0x0822, 0x0440, 0x0402, 0x0861, 0x0842, 0x0823, 0x0460, 0x0403, 0x0843, 0x0862, 0x0824, + 0x0881, 0x0844, 0x0825, 0x0882, 0x0863, 0x0404, 0x0480, 0x08a1, 0x0845, 0x0826, 0x0864, 0x08a2, 0x08c1, 0x0883, 0x0405, 0x0846, + 0x04a0, 0x0827, 0x0865, 0x0828, 0x0901, 0x0884, 0x08a3, 0x08c2, 0x08e1, 0x0406, 0x0902, 0x0848, 0x0866, 0x0847, 0x0885, 0x0921, + 0x0829, 0x08e2, 0x04c0, 0x08a4, 0x08c3, 0x0903, 0x0407, 0x0922, 0x0868, 0x0886, 0x0867, 0x0408, 0x0941, 0x08c4, 0x0849, 0x08a5, + 0x0500, 0x04e0, 0x08e3, 0x0942, 0x0923, 0x0904, 0x082a, 0x08e4, 0x08c5, 0x08a6, 0x0888, 0x0887, 0x0869, 0x0961, 0x08a8, 0x0520, + 0x0905, 0x0943, 0x084a, 0x0409, 0x0962, 0x0924, 0x08c6, 0x0981, 0x0889, 0x0906, 0x082b, 0x0925, 0x0944, 0x08a7, 0x08e5, 0x084b, + 0x082c, 0x0982, 0x0963, 0x086a, 0x08a9, 0x08c7, 0x0907, 0x0964, 0x040a, 0x08e6, 0x0983, 0x0540, 0x0945, 0x088a, 0x08c8, 0x084c, + 0x0926, 0x0927, 0x088b, 0x0560, 0x08c9, 0x086b, 0x08aa, 0x0908, 0x08e8, 0x0985, 0x086c, 0x0965, 0x08e7, 0x0984, 0x0966, 0x0946, + 0x088c, 0x08e9, 0x08ab, 0x040b, 0x0986, 0x08ca, 0x0580, 0x0947, 0x08ac, 0x08ea, 0x0928, 0x040c, 0x0967, 0x0909, 0x0929, 0x0948, + 0x08eb, 0x0987, 0x08cb, 0x090b, 0x0968, 0x08ec, 0x08cc, 0x090a, 0x0949, 0x090c, 0x092a, 0x092b, 0x092c, 0x094b, 0x0989, 0x094a, + 0x0969, 0x0988, 0x096a, 0x098a, 0x098b, 0x094c, 0x096b, 0x096c, 0x098c, + /* spectrum table 10 [169] (unsigned) */ + 0x0821, 0x0822, 0x0841, 0x0842, 0x0420, 0x0401, 0x0823, 0x0862, 0x0861, 0x0843, 0x0863, 0x0440, 0x0402, 0x0844, 0x0882, 0x0824, + 0x0881, 0x0000, 0x0883, 0x0864, 0x0460, 0x0403, 0x0884, 0x0845, 0x08a2, 0x0825, 0x08a1, 0x08a3, 0x0865, 0x08a4, 0x0885, 0x08c2, + 0x0846, 0x08c3, 0x0480, 0x08c1, 0x0404, 0x0826, 0x0866, 0x08a5, 0x08c4, 0x0886, 0x08c5, 0x08e2, 0x0867, 0x0847, 0x08a6, 0x0902, + 0x08e3, 0x04a0, 0x08e1, 0x0405, 0x0901, 0x0827, 0x0903, 0x08e4, 0x0887, 0x0848, 0x08c6, 0x08e5, 0x0828, 0x0868, 0x0904, 0x0888, + 0x08a7, 0x0905, 0x08a8, 0x08e6, 0x08c7, 0x0922, 0x04c0, 0x08c8, 0x0923, 0x0869, 0x0921, 0x0849, 0x0406, 0x0906, 0x0924, 0x0889, + 0x0942, 0x0829, 0x08e7, 0x0907, 0x0925, 0x08e8, 0x0943, 0x08a9, 0x0944, 0x084a, 0x0941, 0x086a, 0x0926, 0x08c9, 0x0500, 0x088a, + 0x04e0, 0x0962, 0x08e9, 0x0963, 0x0946, 0x082a, 0x0961, 0x0927, 0x0407, 0x0908, 0x0945, 0x086b, 0x08aa, 0x0909, 0x0965, 0x0408, + 0x0964, 0x084b, 0x08ea, 0x08ca, 0x0947, 0x088b, 0x082b, 0x0982, 0x0928, 0x0983, 0x0966, 0x08ab, 0x0984, 0x0967, 0x0985, 0x086c, + 0x08cb, 0x0520, 0x0948, 0x0540, 0x0981, 0x0409, 0x088c, 0x0929, 0x0986, 0x084c, 0x090a, 0x092a, 0x082c, 0x0968, 0x0987, 0x08eb, + 0x08ac, 0x08cc, 0x0949, 0x090b, 0x0988, 0x040a, 0x08ec, 0x0560, 0x094a, 0x0969, 0x096a, 0x040b, 0x096b, 0x092b, 0x094b, 0x0580, + 0x090c, 0x0989, 0x094c, 0x092c, 0x096c, 0x098b, 0x040c, 0x098a, 0x098c, + /* spectrum table 11 [289] (unsigned) */ + 0x0000, 0x2041, 0x2410, 0x1040, 0x1001, 0x2081, 0x2042, 0x2082, 0x2043, 0x20c1, 0x20c2, 0x1080, 0x2083, 0x1002, 0x20c3, 0x2101, + 0x2044, 0x2102, 0x2084, 0x2103, 0x20c4, 0x10c0, 0x1003, 0x2141, 0x2142, 0x2085, 0x2104, 0x2045, 0x2143, 0x20c5, 0x2144, 0x2105, + 0x2182, 0x2086, 0x2181, 0x2183, 0x20c6, 0x2046, 0x2110, 0x20d0, 0x2405, 0x2403, 0x2404, 0x2184, 0x2406, 0x1100, 0x2106, 0x1004, + 0x2090, 0x2145, 0x2150, 0x2407, 0x2402, 0x2408, 0x2087, 0x21c2, 0x20c7, 0x2185, 0x2146, 0x2190, 0x240a, 0x21c3, 0x21c1, 0x2409, + 0x21d0, 0x2050, 0x2047, 0x2107, 0x240b, 0x21c4, 0x240c, 0x2210, 0x2401, 0x2186, 0x2250, 0x2088, 0x2147, 0x2290, 0x240d, 0x2203, + 0x2202, 0x20c8, 0x1140, 0x240e, 0x22d0, 0x21c5, 0x2108, 0x2187, 0x21c6, 0x1005, 0x2204, 0x240f, 0x2310, 0x2048, 0x2201, 0x2390, + 0x2148, 0x2350, 0x20c9, 0x2205, 0x21c7, 0x2089, 0x2206, 0x2242, 0x2243, 0x23d0, 0x2109, 0x2188, 0x1180, 0x2244, 0x2149, 0x2207, + 0x21c8, 0x2049, 0x2283, 0x1006, 0x2282, 0x2241, 0x2245, 0x210a, 0x208a, 0x2246, 0x20ca, 0x2189, 0x2284, 0x2208, 0x2285, 0x2247, + 0x22c3, 0x204a, 0x11c0, 0x2286, 0x21c9, 0x20cb, 0x214a, 0x2281, 0x210b, 0x22c2, 0x2342, 0x218a, 0x2343, 0x208b, 0x1400, 0x214b, + 0x22c5, 0x22c4, 0x2248, 0x21ca, 0x2209, 0x1010, 0x210d, 0x1007, 0x20cd, 0x22c6, 0x2341, 0x2344, 0x2303, 0x208d, 0x2345, 0x220a, + 0x218b, 0x2288, 0x2287, 0x2382, 0x2304, 0x204b, 0x210c, 0x22c1, 0x20cc, 0x204d, 0x2302, 0x21cb, 0x20ce, 0x214c, 0x214d, 0x2384, + 0x210e, 0x22c7, 0x2383, 0x2305, 0x2346, 0x2306, 0x1200, 0x22c8, 0x208c, 0x2249, 0x2385, 0x218d, 0x228a, 0x23c2, 0x220b, 0x224a, + 0x2386, 0x2289, 0x214e, 0x22c9, 0x2381, 0x208e, 0x218c, 0x204c, 0x2348, 0x1008, 0x2347, 0x21cc, 0x2307, 0x21cd, 0x23c3, 0x2301, + 0x218e, 0x208f, 0x23c5, 0x23c4, 0x204e, 0x224b, 0x210f, 0x2387, 0x220d, 0x2349, 0x220c, 0x214f, 0x20cf, 0x228b, 0x22ca, 0x2308, + 0x23c6, 0x23c7, 0x220e, 0x23c1, 0x21ce, 0x1240, 0x1009, 0x224d, 0x224c, 0x2309, 0x2388, 0x228d, 0x2389, 0x230a, 0x218f, 0x21cf, + 0x224e, 0x23c8, 0x22cb, 0x22ce, 0x204f, 0x228c, 0x228e, 0x234b, 0x234a, 0x22cd, 0x22cc, 0x220f, 0x238b, 0x234c, 0x230d, 0x23c9, + 0x238a, 0x1280, 0x230b, 0x224f, 0x100a, 0x230c, 0x12c0, 0x230e, 0x228f, 0x234d, 0x100d, 0x238c, 0x23ca, 0x23cb, 0x22cf, 0x238d, + 0x1340, 0x100b, 0x234e, 0x23cc, 0x23cd, 0x230f, 0x1380, 0x238e, 0x234f, 0x1300, 0x238f, 0x100e, 0x100c, 0x23ce, 0x13c0, 0x100f, + 0x23cf, }; const HuffInfo huffTabScaleFactInfo PROGMEM = - {19, { 1, 0, 1, 3, 2, 4, 3, 5, 4, 6, 6, 6, 5, 8, 4, 7, 3, 7, 46, 0}, 0}; +{19, { 1, 0, 1, 3, 2, 4, 3, 5, 4, 6, 6, 6, 5, 8, 4, 7, 3, 7, 46, 0}, 0}; /* note - includes offset of -60 (4.6.2.3 in spec) */ const signed short huffTabScaleFact[121] PROGMEM = { - /* scale factor table [121] */ - 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, 6, -6, 7, -7, 8, - -8, 9, -9, 10, -10, -11, 11, 12, -12, 13, -13, 14, -14, 16, 15, 17, - 18, -15, -17, -16, 19, -18, -19, 20, -20, 21, -21, 22, -22, 23, -23, -25, - 25, -27, -24, -26, 24, -28, 27, 29, -30, -29, 26, -31, -34, -33, -32, -36, - 28, -35, -38, -37, 30, -39, -41, -57, -59, -58, -60, 38, 39, 40, 41, 42, - 57, 37, 31, 32, 33, 34, 35, 36, 44, 51, 52, 53, 54, 55, 56, 50, - 45, 46, 47, 48, 49, 58, -54, -52, -51, -50, -55, 43, 60, 59, -56, -53, - -45, -44, -42, -40, -43, -49, -48, -46, -47, + /* scale factor table [121] */ + 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, 6, -6, 7, -7, 8, + -8, 9, -9, 10, -10, -11, 11, 12, -12, 13, -13, 14, -14, 16, 15, 17, + 18, -15, -17, -16, 19, -18, -19, 20, -20, 21, -21, 22, -22, 23, -23, -25, + 25, -27, -24, -26, 24, -28, 27, 29, -30, -29, 26, -31, -34, -33, -32, -36, + 28, -35, -38, -37, 30, -39, -41, -57, -59, -58, -60, 38, 39, 40, 41, 42, + 57, 37, 31, 32, 33, 34, 35, 36, 44, 51, 52, 53, 54, 55, 56, 50, + 45, 46, 47, 48, 49, 58, -54, -52, -51, -50, -55, 43, 60, 59, -56, -53, + -45, -44, -42, -40, -43, -49, -48, -46, -47, }; diff --git a/src/libhelix-aac/imdct.c b/src/libhelix-aac/imdct.c index 1ff9e4ab..bb45beb0 100644 --- a/src/libhelix-aac/imdct.c +++ b/src/libhelix-aac/imdct.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: imdct.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: imdct.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * imdct.c - inverse MDCT + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + imdct.c - inverse MDCT **************************************************************************************/ #include "coder.h" @@ -51,539 +51,538 @@ #ifndef AAC_ENABLE_SBR /************************************************************************************** - * Function: DecWindowOverlap - * - * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, - * for winSequence LONG-LONG - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * number of channels - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans - * - * Return: none - * - * Notes: this processes one channel at a time, but skips every other sample in - * the output buffer (pcm) for stereo interleaving - * this should fit in registers on ARM - * - * TODO: ARM5E version with saturating overlap/add (QADD) - * asm code with free pointer updates, better load scheduling + Function: DecWindowOverlap + + Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, + for winSequence LONG-LONG + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + number of channels + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans + + Return: none + + Notes: this processes one channel at a time, but skips every other sample in + the output buffer (pcm) for stereo interleaving + this should fit in registers on ARM + + TODO: ARM5E version with saturating overlap/add (QADD) + asm code with free pointer updates, better load scheduling **************************************************************************************/ -/*__attribute__ ((section (".data")))*/ static void DecWindowOverlap(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) -{ - int in, w0, w1, f0, f1; - int *buf1, *over1; - short *pcm1; - const int *wndPrev, *wndCurr; - - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - pcm1 = pcm0 + (1024 - 1) * nChans; - over1 = over0 + 1024 - 1; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - if (winTypeCurr == winTypePrev) { - /* cut window loads in half since current and overlap sections use same symmetric window */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } else { - /* different windows for current and overlap parts - should still fit in registers on ARM w/o stack spill */ - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } +/*__attribute__ ((section (".data")))*/ static void DecWindowOverlap(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) { + int in, w0, w1, f0, f1; + int *buf1, *over1; + short *pcm1; + const int *wndPrev, *wndCurr; + + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + pcm1 = pcm0 + (1024 - 1) * nChans; + over1 = over0 + 1024 - 1; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + if (winTypeCurr == winTypePrev) { + /* cut window loads in half since current and overlap sections use same symmetric window */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } else { + /* different windows for current and overlap parts - should still fit in registers on ARM w/o stack spill */ + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } } /************************************************************************************** - * Function: DecWindowOverlapLongStart - * - * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, - * for winSequence LONG-START - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * number of channels - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans - * - * Return: none - * - * Notes: this processes one channel at a time, but skips every other sample in - * the output buffer (pcm) for stereo interleaving - * this should fit in registers on ARM - * - * TODO: ARM5E version with saturating overlap/add (QADD) - * asm code with free pointer updates, better load scheduling + Function: DecWindowOverlapLongStart + + Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, + for winSequence LONG-START + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + number of channels + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans + + Return: none + + Notes: this processes one channel at a time, but skips every other sample in + the output buffer (pcm) for stereo interleaving + this should fit in registers on ARM + + TODO: ARM5E version with saturating overlap/add (QADD) + asm code with free pointer updates, better load scheduling **************************************************************************************/ - /*__attribute__ ((section (".data")))*/ static void DecWindowOverlapLongStart(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1; - short *pcm1; - const int *wndPrev, *wndCurr; - - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - pcm1 = pcm0 + (1024 - 1) * nChans; - over1 = over0 + 1024 - 1; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - i = 448; /* 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - in = *buf1--; - - *over1-- = 0; /* Wn = 0 for n = (2047, 2046, ... 1600) */ - *over0++ = in >> 1; /* Wn = 1 for n = (1024, 1025, ... 1471) */ - } while (--i); - - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - - /* do 64 more loops - 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - w0 = *wndCurr++; /* W[0], W[1], ... --> W[255], W[254], ... */ - w1 = *wndCurr++; /* W[127], W[126], ... --> W[128], W[129], ... */ - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); /* Wn = short window for n = (1599, 1598, ... , 1536) */ - *over0++ = MULSHIFT32(w1, in); /* Wn = short window for n = (1472, 1473, ... , 1535) */ - } while (over0 < over1); +/*__attribute__ ((section (".data")))*/ static void DecWindowOverlapLongStart(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1; + short *pcm1; + const int *wndPrev, *wndCurr; + + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + pcm1 = pcm0 + (1024 - 1) * nChans; + over1 = over0 + 1024 - 1; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + i = 448; /* 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + in = *buf1--; + + *over1-- = 0; /* Wn = 0 for n = (2047, 2046, ... 1600) */ + *over0++ = in >> 1; /* Wn = 1 for n = (1024, 1025, ... 1471) */ + } while (--i); + + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + + /* do 64 more loops - 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + w0 = *wndCurr++; /* W[0], W[1], ... --> W[255], W[254], ... */ + w1 = *wndCurr++; /* W[127], W[126], ... --> W[128], W[129], ... */ + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); /* Wn = short window for n = (1599, 1598, ... , 1536) */ + *over0++ = MULSHIFT32(w1, in); /* Wn = short window for n = (1472, 1473, ... , 1535) */ + } while (over0 < over1); } /************************************************************************************** - * Function: DecWindowOverlapLongStop - * - * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, - * for winSequence LONG-STOP - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * number of channels - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans - * - * Return: none - * - * Notes: this processes one channel at a time, but skips every other sample in - * the output buffer (pcm) for stereo interleaving - * this should fit in registers on ARM - * - * TODO: ARM5E version with saturating overlap/add (QADD) - * asm code with free pointer updates, better load scheduling + Function: DecWindowOverlapLongStop + + Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, + for winSequence LONG-STOP + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + number of channels + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans + + Return: none + + Notes: this processes one channel at a time, but skips every other sample in + the output buffer (pcm) for stereo interleaving + this should fit in registers on ARM + + TODO: ARM5E version with saturating overlap/add (QADD) + asm code with free pointer updates, better load scheduling **************************************************************************************/ - /*__attribute__ ((section (".data")))*/ static void DecWindowOverlapLongStop(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1; - short *pcm1; - const int *wndPrev, *wndCurr; - - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - pcm1 = pcm0 + (1024 - 1) * nChans; - over1 = over0 + 1024 - 1; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - - i = 448; /* 2 outputs, 2 overlaps per loop */ - do { - /* Wn = 0 for n = (0, 1, ... 447) */ - /* Wn = 1 for n = (576, 577, ... 1023) */ - in = *buf0++; - f1 = in >> 1; /* scale since skipping multiply by Q31 */ - - in = *over0; - *pcm0 = CLIPTOSHORT( (in + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (--i); - - /* do 64 more loops - 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ - w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); +/*__attribute__ ((section (".data")))*/ static void DecWindowOverlapLongStop(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1; + short *pcm1; + const int *wndPrev, *wndCurr; + + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + pcm1 = pcm0 + (1024 - 1) * nChans; + over1 = over0 + 1024 - 1; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + + i = 448; /* 2 outputs, 2 overlaps per loop */ + do { + /* Wn = 0 for n = (0, 1, ... 447) */ + /* Wn = 1 for n = (576, 577, ... 1023) */ + in = *buf0++; + f1 = in >> 1; /* scale since skipping multiply by Q31 */ + + in = *over0; + *pcm0 = CLIPTOSHORT((in + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (--i); + + /* do 64 more loops - 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ + w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); } /************************************************************************************** - * Function: DecWindowOverlapShort - * - * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, - * for winSequence EIGHT-SHORT (does all 8 short blocks) - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * number of channels - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans - * - * Return: none - * - * Notes: this processes one channel at a time, but skips every other sample in - * the output buffer (pcm) for stereo interleaving - * this should fit in registers on ARM - * - * TODO: ARM5E version with saturating overlap/add (QADD) - * asm code with free pointer updates, better load scheduling + Function: DecWindowOverlapShort + + Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, + for winSequence EIGHT-SHORT (does all 8 short blocks) + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + number of channels + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 16-bit PCM, interleaved by nChans + + Return: none + + Notes: this processes one channel at a time, but skips every other sample in + the output buffer (pcm) for stereo interleaving + this should fit in registers on ARM + + TODO: ARM5E version with saturating overlap/add (QADD) + asm code with free pointer updates, better load scheduling **************************************************************************************/ - /*__attribute__ ((section (".data"))) */ static void DecWindowOverlapShort(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1; - short *pcm1; - const int *wndPrev, *wndCurr; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - - /* pcm[0-447] = 0 + overlap[0-447] */ - i = 448; - do { - f0 = *over0++; - f1 = *over0++; - *pcm0 = CLIPTOSHORT( (f0 + RND_VAL) >> FBITS_OUT_IMDCT ); pcm0 += nChans; - *pcm0 = CLIPTOSHORT( (f1 + RND_VAL) >> FBITS_OUT_IMDCT ); pcm0 += nChans; - i -= 2; - } while (i); - - /* pcm[448-575] = Wp[0-127] * block0[0-127] + overlap[448-575] */ - pcm1 = pcm0 + (128 - 1) * nChans; - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - do { - w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ - w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *over1; - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - /* save over0/over1 for next short block, in the slots just vacated */ - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - - /* pcm[576-703] = Wc[128-255] * block0[128-255] + Wc[0-127] * block1[0-127] + overlap[576-703] - * pcm[704-831] = Wc[128-255] * block1[128-255] + Wc[0-127] * block2[0-127] + overlap[704-831] - * pcm[832-959] = Wc[128-255] * block2[128-255] + Wc[0-127] * block3[0-127] + overlap[832-959] - */ - for (i = 0; i < 3; i++) { - pcm0 += 64 * nChans; - pcm1 = pcm0 + (128 - 1) * nChans; - over0 += 64; - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *(over0 - 128); /* from last short block */ - in += *(over0 + 0); /* from last full frame */ - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *(over1 - 128); /* from last short block */ - in += *(over1 + 0); /* from last full frame */ - *pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm1 -= nChans; - - /* save over0/over1 for next short block, in the slots just vacated */ - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } - - /* pcm[960-1023] = Wc[128-191] * block3[128-191] + Wc[0-63] * block4[0-63] + overlap[960-1023] - * over[0-63] = Wc[192-255] * block3[192-255] + Wc[64-127] * block4[64-127] - */ - pcm0 += 64 * nChans; - over0 -= 832; /* points at overlap[64] */ - over1 = over0 + 128 - 1; /* points at overlap[191] */ - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *(over0 + 768); /* from last short block */ - in += *(over0 + 896); /* from last full frame */ - *pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT ); - pcm0 += nChans; - - in = *(over1 + 768); /* from last short block */ - *(over1 - 128) = in + f1; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); /* save in overlap[128-191] */ - *over0++ = MULSHIFT32(w1, in); /* save in overlap[64-127] */ - } while (over0 < over1); - - /* over0 now points at overlap[128] */ - - /* over[64-191] = Wc[128-255] * block4[128-255] + Wc[0-127] * block5[0-127] - * over[192-319] = Wc[128-255] * block5[128-255] + Wc[0-127] * block6[0-127] - * over[320-447] = Wc[128-255] * block6[128-255] + Wc[0-127] * block7[0-127] - * over[448-576] = Wc[128-255] * block7[128-255] - */ - for (i = 0; i < 3; i++) { - over0 += 64; - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - /* from last short block */ - *(over0 - 128) -= f0; - *(over1 - 128)+= f1; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } - - /* over[576-1024] = 0 */ - i = 448; - over0 += 64; - do { - *over0++ = 0; - *over0++ = 0; - *over0++ = 0; - *over0++ = 0; - i -= 4; - } while (i); +/*__attribute__ ((section (".data"))) */ static void DecWindowOverlapShort(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1; + short *pcm1; + const int *wndPrev, *wndCurr; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + + /* pcm[0-447] = 0 + overlap[0-447] */ + i = 448; + do { + f0 = *over0++; + f1 = *over0++; + *pcm0 = CLIPTOSHORT((f0 + RND_VAL) >> FBITS_OUT_IMDCT); pcm0 += nChans; + *pcm0 = CLIPTOSHORT((f1 + RND_VAL) >> FBITS_OUT_IMDCT); pcm0 += nChans; + i -= 2; + } while (i); + + /* pcm[448-575] = Wp[0-127] * block0[0-127] + overlap[448-575] */ + pcm1 = pcm0 + (128 - 1) * nChans; + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + do { + w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ + w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *over1; + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + /* save over0/over1 for next short block, in the slots just vacated */ + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + + /* pcm[576-703] = Wc[128-255] * block0[128-255] + Wc[0-127] * block1[0-127] + overlap[576-703] + pcm[704-831] = Wc[128-255] * block1[128-255] + Wc[0-127] * block2[0-127] + overlap[704-831] + pcm[832-959] = Wc[128-255] * block2[128-255] + Wc[0-127] * block3[0-127] + overlap[832-959] + */ + for (i = 0; i < 3; i++) { + pcm0 += 64 * nChans; + pcm1 = pcm0 + (128 - 1) * nChans; + over0 += 64; + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *(over0 - 128); /* from last short block */ + in += *(over0 + 0); /* from last full frame */ + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *(over1 - 128); /* from last short block */ + in += *(over1 + 0); /* from last full frame */ + *pcm1 = CLIPTOSHORT((in + f1 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm1 -= nChans; + + /* save over0/over1 for next short block, in the slots just vacated */ + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } + + /* pcm[960-1023] = Wc[128-191] * block3[128-191] + Wc[0-63] * block4[0-63] + overlap[960-1023] + over[0-63] = Wc[192-255] * block3[192-255] + Wc[64-127] * block4[64-127] + */ + pcm0 += 64 * nChans; + over0 -= 832; /* points at overlap[64] */ + over1 = over0 + 128 - 1; /* points at overlap[191] */ + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *(over0 + 768); /* from last short block */ + in += *(over0 + 896); /* from last full frame */ + *pcm0 = CLIPTOSHORT((in - f0 + RND_VAL) >> FBITS_OUT_IMDCT); + pcm0 += nChans; + + in = *(over1 + 768); /* from last short block */ + *(over1 - 128) = in + f1; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); /* save in overlap[128-191] */ + *over0++ = MULSHIFT32(w1, in); /* save in overlap[64-127] */ + } while (over0 < over1); + + /* over0 now points at overlap[128] */ + + /* over[64-191] = Wc[128-255] * block4[128-255] + Wc[0-127] * block5[0-127] + over[192-319] = Wc[128-255] * block5[128-255] + Wc[0-127] * block6[0-127] + over[320-447] = Wc[128-255] * block6[128-255] + Wc[0-127] * block7[0-127] + over[448-576] = Wc[128-255] * block7[128-255] + */ + for (i = 0; i < 3; i++) { + over0 += 64; + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + /* from last short block */ + *(over0 - 128) -= f0; + *(over1 - 128) += f1; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } + + /* over[576-1024] = 0 */ + i = 448; + over0 += 64; + do { + *over0++ = 0; + *over0++ = 0; + *over0++ = 0; + *over0++ = 0; + i -= 4; + } while (i); } #endif /* !AAC_ENABLE_SBR */ /************************************************************************************** - * Function: IMDCT - * - * Description: inverse transform and convert to 16-bit PCM - * - * Inputs: valid AACDecInfo struct - * index of current channel (0 for SCE/LFE, 0 or 1 for CPE) - * output channel (range = [0, nChans-1]) - * - * Outputs: complete frame of decoded PCM, after inverse transform - * - * Return: 0 if successful, -1 if error - * - * Notes: If AAC_ENABLE_SBR is defined at compile time then window + overlap - * does NOT clip to 16-bit PCM and does NOT interleave channels - * If AAC_ENABLE_SBR is NOT defined at compile time, then window + overlap - * does clip to 16-bit PCM and interleaves channels - * If SBR is enabled at compile time, but we don't know whether it is - * actually used for this frame (e.g. the first frame of a stream), - * we need to produce both clipped 16-bit PCM in outbuf AND - * unclipped 32-bit PCM in the SBR input buffer. In this case we make - * a separate pass over the 32-bit PCM to produce 16-bit PCM output. - * This inflicts a slight performance hit when decoding non-SBR files. + Function: IMDCT + + Description: inverse transform and convert to 16-bit PCM + + Inputs: valid AACDecInfo struct + index of current channel (0 for SCE/LFE, 0 or 1 for CPE) + output channel (range = [0, nChans-1]) + + Outputs: complete frame of decoded PCM, after inverse transform + + Return: 0 if successful, -1 if error + + Notes: If AAC_ENABLE_SBR is defined at compile time then window + overlap + does NOT clip to 16-bit PCM and does NOT interleave channels + If AAC_ENABLE_SBR is NOT defined at compile time, then window + overlap + does clip to 16-bit PCM and interleaves channels + If SBR is enabled at compile time, but we don't know whether it is + actually used for this frame (e.g. the first frame of a stream), + we need to produce both clipped 16-bit PCM in outbuf AND + unclipped 32-bit PCM in the SBR input buffer. In this case we make + a separate pass over the 32-bit PCM to produce 16-bit PCM output. + This inflicts a slight performance hit when decoding non-SBR files. **************************************************************************************/ -int IMDCT(AACDecInfo *aacDecInfo, int ch, int chOut, short *outbuf) -{ - int i; - PSInfoBase *psi; - ICSInfo *icsInfo; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - outbuf += chOut; - - /* optimized type-IV DCT (operates inplace) */ - if (icsInfo->winSequence == 2) { - /* 8 short blocks */ - for (i = 0; i < 8; i++) - DCT4(0, psi->coef[ch] + i*128, psi->gbCurrent[ch]); - } else { - /* 1 long block */ - DCT4(1, psi->coef[ch], psi->gbCurrent[ch]); - } +int IMDCT(AACDecInfo *aacDecInfo, int ch, int chOut, short *outbuf) { + int i; + PSInfoBase *psi; + ICSInfo *icsInfo; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + outbuf += chOut; + + /* optimized type-IV DCT (operates inplace) */ + if (icsInfo->winSequence == 2) { + /* 8 short blocks */ + for (i = 0; i < 8; i++) { + DCT4(0, psi->coef[ch] + i * 128, psi->gbCurrent[ch]); + } + } else { + /* 1 long block */ + DCT4(1, psi->coef[ch], psi->gbCurrent[ch]); + } #ifdef AAC_ENABLE_SBR - /* window, overlap-add, don't clip to short (send to SBR decoder) - * store the decoded 32-bit samples in top half (second AAC_MAX_NSAMPS samples) of coef buffer - */ - if (icsInfo->winSequence == 0) - DecWindowOverlapNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 1) - DecWindowOverlapLongStartNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 2) - DecWindowOverlapShortNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 3) - DecWindowOverlapLongStopNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); - - if (!aacDecInfo->sbrEnabled) { - for (i = 0; i < AAC_MAX_NSAMPS; i++) { - *outbuf = CLIPTOSHORT((psi->sbrWorkBuf[ch][i] + RND_VAL) >> FBITS_OUT_IMDCT); - outbuf += aacDecInfo->nChans; - } - } - - aacDecInfo->rawSampleBuf[ch] = psi->sbrWorkBuf[ch]; - aacDecInfo->rawSampleBytes = sizeof(int); - aacDecInfo->rawSampleFBits = FBITS_OUT_IMDCT; + /* window, overlap-add, don't clip to short (send to SBR decoder) + store the decoded 32-bit samples in top half (second AAC_MAX_NSAMPS samples) of coef buffer + */ + if (icsInfo->winSequence == 0) { + DecWindowOverlapNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 1) { + DecWindowOverlapLongStartNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 2) { + DecWindowOverlapShortNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 3) { + DecWindowOverlapLongStopNoClip(psi->coef[ch], psi->overlap[chOut], psi->sbrWorkBuf[ch], icsInfo->winShape, psi->prevWinShape[chOut]); + } + + if (!aacDecInfo->sbrEnabled) { + for (i = 0; i < AAC_MAX_NSAMPS; i++) { + *outbuf = CLIPTOSHORT((psi->sbrWorkBuf[ch][i] + RND_VAL) >> FBITS_OUT_IMDCT); + outbuf += aacDecInfo->nChans; + } + } + + aacDecInfo->rawSampleBuf[ch] = psi->sbrWorkBuf[ch]; + aacDecInfo->rawSampleBytes = sizeof(int); + aacDecInfo->rawSampleFBits = FBITS_OUT_IMDCT; #else - /* window, overlap-add, round to PCM - optimized for each window sequence */ - if (icsInfo->winSequence == 0) - DecWindowOverlap(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 1) - DecWindowOverlapLongStart(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 2) - DecWindowOverlapShort(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); - else if (icsInfo->winSequence == 3) - DecWindowOverlapLongStop(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); - - aacDecInfo->rawSampleBuf[ch] = 0; - aacDecInfo->rawSampleBytes = 0; - aacDecInfo->rawSampleFBits = 0; + /* window, overlap-add, round to PCM - optimized for each window sequence */ + if (icsInfo->winSequence == 0) { + DecWindowOverlap(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 1) { + DecWindowOverlapLongStart(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 2) { + DecWindowOverlapShort(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); + } else if (icsInfo->winSequence == 3) { + DecWindowOverlapLongStop(psi->coef[ch], psi->overlap[chOut], outbuf, aacDecInfo->nChans, icsInfo->winShape, psi->prevWinShape[chOut]); + } + + aacDecInfo->rawSampleBuf[ch] = 0; + aacDecInfo->rawSampleBytes = 0; + aacDecInfo->rawSampleFBits = 0; #endif - psi->prevWinShape[chOut] = icsInfo->winShape; + psi->prevWinShape[chOut] = icsInfo->winShape; - return 0; + return 0; } diff --git a/src/libhelix-aac/noiseless.c b/src/libhelix-aac/noiseless.c index 5d3a65df..525adf04 100644 --- a/src/libhelix-aac/noiseless.c +++ b/src/libhelix-aac/noiseless.c @@ -1,47 +1,47 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: noiseless.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: noiseless.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * noiseless.c - decode channel info, scalefactors, quantized coefficients, - * scalefactor band codebook, and TNS coefficients from bitstream + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + noiseless.c - decode channel info, scalefactors, quantized coefficients, + scalefactor band codebook, and TNS coefficients from bitstream **************************************************************************************/ #include "coder.h" @@ -52,433 +52,438 @@ //#define PROFILE_END() /************************************************************************************** - * Function: DecodeICSInfo - * - * Description: decode individual channel stream info - * - * Inputs: BitStreamInfo struct pointing to start of ICS info - * (14496-3, table 4.4.6) - * sample rate index - * - * Outputs: updated icsInfo struct - * - * Return: none + Function: DecodeICSInfo + + Description: decode individual channel stream info + + Inputs: BitStreamInfo struct pointing to start of ICS info + (14496-3, table 4.4.6) + sample rate index + + Outputs: updated icsInfo struct + + Return: none **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ void DecodeICSInfo(BitStreamInfo *bsi, ICSInfo *icsInfo, int sampRateIdx) -{ - int sfb, g, mask; - - icsInfo->icsResBit = GetBits(bsi, 1); - icsInfo->winSequence = GetBits(bsi, 2); - icsInfo->winShape = GetBits(bsi, 1); - if (icsInfo->winSequence == 2) { - /* short block */ - icsInfo->maxSFB = GetBits(bsi, 4); - icsInfo->sfGroup = GetBits(bsi, 7); - icsInfo->numWinGroup = 1; - icsInfo->winGroupLen[0] = 1; - mask = 0x40; /* start with bit 6 */ - for (g = 0; g < 7; g++) { - if (icsInfo->sfGroup & mask) { - icsInfo->winGroupLen[icsInfo->numWinGroup - 1]++; - } else { - icsInfo->numWinGroup++; - icsInfo->winGroupLen[icsInfo->numWinGroup - 1] = 1; - } - mask >>= 1; - } - } else { - /* long block */ - icsInfo->maxSFB = GetBits(bsi, 6); - icsInfo->predictorDataPresent = GetBits(bsi, 1); - if (icsInfo->predictorDataPresent) { - icsInfo->predictorReset = GetBits(bsi, 1); - if (icsInfo->predictorReset) - icsInfo->predictorResetGroupNum = GetBits(bsi, 5); - for (sfb = 0; sfb < MIN(icsInfo->maxSFB, predSFBMax[sampRateIdx]); sfb++) - icsInfo->predictionUsed[sfb] = GetBits(bsi, 1); - } - icsInfo->numWinGroup = 1; - icsInfo->winGroupLen[0] = 1; - } +/* __attribute__ ((section (".data"))) */ void DecodeICSInfo(BitStreamInfo *bsi, ICSInfo *icsInfo, int sampRateIdx) { + int sfb, g, mask; + + icsInfo->icsResBit = GetBits(bsi, 1); + icsInfo->winSequence = GetBits(bsi, 2); + icsInfo->winShape = GetBits(bsi, 1); + if (icsInfo->winSequence == 2) { + /* short block */ + icsInfo->maxSFB = GetBits(bsi, 4); + icsInfo->sfGroup = GetBits(bsi, 7); + icsInfo->numWinGroup = 1; + icsInfo->winGroupLen[0] = 1; + mask = 0x40; /* start with bit 6 */ + for (g = 0; g < 7; g++) { + if (icsInfo->sfGroup & mask) { + icsInfo->winGroupLen[icsInfo->numWinGroup - 1]++; + } else { + icsInfo->numWinGroup++; + icsInfo->winGroupLen[icsInfo->numWinGroup - 1] = 1; + } + mask >>= 1; + } + } else { + /* long block */ + icsInfo->maxSFB = GetBits(bsi, 6); + icsInfo->predictorDataPresent = GetBits(bsi, 1); + if (icsInfo->predictorDataPresent) { + icsInfo->predictorReset = GetBits(bsi, 1); + if (icsInfo->predictorReset) { + icsInfo->predictorResetGroupNum = GetBits(bsi, 5); + } + for (sfb = 0; sfb < MIN(icsInfo->maxSFB, predSFBMax[sampRateIdx]); sfb++) { + icsInfo->predictionUsed[sfb] = GetBits(bsi, 1); + } + } + icsInfo->numWinGroup = 1; + icsInfo->winGroupLen[0] = 1; + } } /************************************************************************************** - * Function: DecodeSectionData - * - * Description: decode section data (scale factor band groupings and - * associated Huffman codebooks) - * - * Inputs: BitStreamInfo struct pointing to start of ICS info - * (14496-3, table 4.4.25) - * window sequence (short or long blocks) - * number of window groups (1 for long blocks, 1-8 for short blocks) - * max coded scalefactor band - * - * Outputs: index of Huffman codebook for each scalefactor band in each section - * - * Return: none - * - * Notes: sectCB, sectEnd, sfbCodeBook, ordered by window groups for short blocks + Function: DecodeSectionData + + Description: decode section data (scale factor band groupings and + associated Huffman codebooks) + + Inputs: BitStreamInfo struct pointing to start of ICS info + (14496-3, table 4.4.25) + window sequence (short or long blocks) + number of window groups (1 for long blocks, 1-8 for short blocks) + max coded scalefactor band + + Outputs: index of Huffman codebook for each scalefactor band in each section + + Return: none + + Notes: sectCB, sectEnd, sfbCodeBook, ordered by window groups for short blocks **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static void DecodeSectionData(BitStreamInfo *bsi, int winSequence, int numWinGrp, int maxSFB, unsigned char *sfbCodeBook) -{ - int g, cb, sfb; - int sectLen, sectLenBits, sectLenIncr, sectEscapeVal; - - sectLenBits = (winSequence == 2 ? 3 : 5); - sectEscapeVal = (1 << sectLenBits) - 1; - - for (g = 0; g < numWinGrp; g++) { - sfb = 0; - while (sfb < maxSFB) { - cb = GetBits(bsi, 4); /* next section codebook */ - sectLen = 0; - do { - sectLenIncr = GetBits(bsi, sectLenBits); - sectLen += sectLenIncr; - } while (sectLenIncr == sectEscapeVal); - - sfb += sectLen; - while (sectLen--) - *sfbCodeBook++ = (unsigned char)cb; - } - ASSERT(sfb == maxSFB); - } +/* __attribute__ ((section (".data"))) */ static void DecodeSectionData(BitStreamInfo *bsi, int winSequence, int numWinGrp, int maxSFB, unsigned char *sfbCodeBook) { + int g, cb, sfb; + int sectLen, sectLenBits, sectLenIncr, sectEscapeVal; + + sectLenBits = (winSequence == 2 ? 3 : 5); + sectEscapeVal = (1 << sectLenBits) - 1; + + for (g = 0; g < numWinGrp; g++) { + sfb = 0; + while (sfb < maxSFB) { + cb = GetBits(bsi, 4); /* next section codebook */ + sectLen = 0; + do { + sectLenIncr = GetBits(bsi, sectLenBits); + sectLen += sectLenIncr; + } while (sectLenIncr == sectEscapeVal); + + sfb += sectLen; + while (sectLen--) { + *sfbCodeBook++ = (unsigned char)cb; + } + } + ASSERT(sfb == maxSFB); + } } /************************************************************************************** - * Function: DecodeOneScaleFactor - * - * Description: decode one scalefactor using scalefactor Huffman codebook - * - * Inputs: BitStreamInfo struct pointing to start of next coded scalefactor - * - * Outputs: updated BitstreamInfo struct - * - * Return: one decoded scalefactor, including index_offset of -60 + Function: DecodeOneScaleFactor + + Description: decode one scalefactor using scalefactor Huffman codebook + + Inputs: BitStreamInfo struct pointing to start of next coded scalefactor + + Outputs: updated BitstreamInfo struct + + Return: one decoded scalefactor, including index_offset of -60 **************************************************************************************/ -static int DecodeOneScaleFactor(BitStreamInfo *bsi) -{ - int nBits, val; - unsigned int bitBuf; - - /* decode next scalefactor from bitstream */ - bitBuf = GetBitsNoAdvance(bsi, huffTabScaleFactInfo.maxBits) << (32 - huffTabScaleFactInfo.maxBits); - //PROFILE_START("DecodeHuffmanScalar"); - nBits = DecodeHuffmanScalar(huffTabScaleFact, &huffTabScaleFactInfo, bitBuf, &val); - AdvanceBitstream(bsi, nBits); - //PROFILE_END(); - return val; +static int DecodeOneScaleFactor(BitStreamInfo *bsi) { + int nBits, val; + unsigned int bitBuf; + + /* decode next scalefactor from bitstream */ + bitBuf = GetBitsNoAdvance(bsi, huffTabScaleFactInfo.maxBits) << (32 - huffTabScaleFactInfo.maxBits); + //PROFILE_START("DecodeHuffmanScalar"); + nBits = DecodeHuffmanScalar(huffTabScaleFact, &huffTabScaleFactInfo, bitBuf, &val); + AdvanceBitstream(bsi, nBits); + //PROFILE_END(); + return val; } /************************************************************************************** - * Function: DecodeScaleFactors - * - * Description: decode scalefactors, PNS energy, and intensity stereo weights - * - * Inputs: BitStreamInfo struct pointing to start of ICS info - * (14496-3, table 4.4.26) - * number of window groups (1 for long blocks, 1-8 for short blocks) - * max coded scalefactor band - * global gain (starting value for differential scalefactor coding) - * index of Huffman codebook for each scalefactor band in each section - * - * Outputs: decoded scalefactor for each section - * - * Return: none - * - * Notes: sfbCodeBook, scaleFactors ordered by window groups for short blocks - * for section with codebook 13, scaleFactors buffer has decoded PNS - * energy instead of regular scalefactor - * for section with codebook 14 or 15, scaleFactors buffer has intensity - * stereo weight instead of regular scalefactor + Function: DecodeScaleFactors + + Description: decode scalefactors, PNS energy, and intensity stereo weights + + Inputs: BitStreamInfo struct pointing to start of ICS info + (14496-3, table 4.4.26) + number of window groups (1 for long blocks, 1-8 for short blocks) + max coded scalefactor band + global gain (starting value for differential scalefactor coding) + index of Huffman codebook for each scalefactor band in each section + + Outputs: decoded scalefactor for each section + + Return: none + + Notes: sfbCodeBook, scaleFactors ordered by window groups for short blocks + for section with codebook 13, scaleFactors buffer has decoded PNS + energy instead of regular scalefactor + for section with codebook 14 or 15, scaleFactors buffer has intensity + stereo weight instead of regular scalefactor **************************************************************************************/ /* __attribute__ ((section (".data"))) */ static void DecodeScaleFactors(BitStreamInfo *bsi, int numWinGrp, int maxSFB, int globalGain, - unsigned char *sfbCodeBook, short *scaleFactors) -{ - int g, sfbCB, nrg, npf, val, sf, is; - - /* starting values for differential coding */ - sf = globalGain; - is = 0; - nrg = globalGain - 90 - 256; - npf = 1; - - for (g = 0; g < numWinGrp * maxSFB; g++) { - sfbCB = *sfbCodeBook++; - - if (sfbCB == 14 || sfbCB == 15) { - /* intensity stereo - differential coding */ - val = DecodeOneScaleFactor(bsi); - is += val; - *scaleFactors++ = (short)is; - } else if (sfbCB == 13) { - /* PNS - first energy is directly coded, rest are Huffman coded (npf = noise_pcm_flag) */ - if (npf) { - val = GetBits(bsi, 9); - npf = 0; - } else { - val = DecodeOneScaleFactor(bsi); - } - nrg += val; - *scaleFactors++ = (short)nrg; - } else if (sfbCB >= 1 && sfbCB <= 11) { - /* regular (non-zero) region - differential coding */ - val = DecodeOneScaleFactor(bsi); - sf += val; - *scaleFactors++ = (short)sf; - } else { - /* inactive scalefactor band if codebook 0 */ - *scaleFactors++ = 0; - } - } + unsigned char *sfbCodeBook, short *scaleFactors) { + int g, sfbCB, nrg, npf, val, sf, is; + + /* starting values for differential coding */ + sf = globalGain; + is = 0; + nrg = globalGain - 90 - 256; + npf = 1; + + for (g = 0; g < numWinGrp * maxSFB; g++) { + sfbCB = *sfbCodeBook++; + + if (sfbCB == 14 || sfbCB == 15) { + /* intensity stereo - differential coding */ + val = DecodeOneScaleFactor(bsi); + is += val; + *scaleFactors++ = (short)is; + } else if (sfbCB == 13) { + /* PNS - first energy is directly coded, rest are Huffman coded (npf = noise_pcm_flag) */ + if (npf) { + val = GetBits(bsi, 9); + npf = 0; + } else { + val = DecodeOneScaleFactor(bsi); + } + nrg += val; + *scaleFactors++ = (short)nrg; + } else if (sfbCB >= 1 && sfbCB <= 11) { + /* regular (non-zero) region - differential coding */ + val = DecodeOneScaleFactor(bsi); + sf += val; + *scaleFactors++ = (short)sf; + } else { + /* inactive scalefactor band if codebook 0 */ + *scaleFactors++ = 0; + } + } } /************************************************************************************** - * Function: DecodePulseInfo - * - * Description: decode pulse information - * - * Inputs: BitStreamInfo struct pointing to start of pulse info - * (14496-3, table 4.4.7) - * - * Outputs: updated PulseInfo struct - * - * Return: none + Function: DecodePulseInfo + + Description: decode pulse information + + Inputs: BitStreamInfo struct pointing to start of pulse info + (14496-3, table 4.4.7) + + Outputs: updated PulseInfo struct + + Return: none **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static void DecodePulseInfo(BitStreamInfo *bsi, PulseInfo *pi) -{ - int i; - - pi->numPulse = GetBits(bsi, 2) + 1; /* add 1 here */ - pi->startSFB = GetBits(bsi, 6); - for (i = 0; i < pi->numPulse; i++) { - pi->offset[i] = GetBits(bsi, 5); - pi->amp[i] = GetBits(bsi, 4); - } +/* __attribute__ ((section (".data"))) */ static void DecodePulseInfo(BitStreamInfo *bsi, PulseInfo *pi) { + int i; + + pi->numPulse = GetBits(bsi, 2) + 1; /* add 1 here */ + pi->startSFB = GetBits(bsi, 6); + for (i = 0; i < pi->numPulse && i < MAX_PULSES; i++) { + pi->offset[i] = GetBits(bsi, 5); + pi->amp[i] = GetBits(bsi, 4); + } } /************************************************************************************** - * Function: DecodeTNSInfo - * - * Description: decode TNS filter information - * - * Inputs: BitStreamInfo struct pointing to start of TNS info - * (14496-3, table 4.4.27) - * window sequence (short or long blocks) - * - * Outputs: updated TNSInfo struct - * buffer of decoded (signed) TNS filter coefficients - * - * Return: none + Function: DecodeTNSInfo + + Description: decode TNS filter information + + Inputs: BitStreamInfo struct pointing to start of TNS info + (14496-3, table 4.4.27) + window sequence (short or long blocks) + + Outputs: updated TNSInfo struct + buffer of decoded (signed) TNS filter coefficients + + Return: none **************************************************************************************/ static const signed char sgnMask[3] = {0x02, 0x04, 0x08}; static const signed char negMask[3] = {~0x03, ~0x07, ~0x0f}; -static void DecodeTNSInfo(BitStreamInfo *bsi, int winSequence, TNSInfo *ti, signed char *tnsCoef) -{ - int i, w, f, coefBits, compress; - signed char c, s, n; - - unsigned char *filtLength, *filtOrder, *filtDir; - - filtLength = ti->length; - filtOrder = ti->order; - filtDir = ti->dir; - - if (winSequence == 2) { - /* short blocks */ - for (w = 0; w < NWINDOWS_SHORT; w++) { - ti->numFilt[w] = GetBits(bsi, 1); - if (ti->numFilt[w]) { - ti->coefRes[w] = GetBits(bsi, 1) + 3; - *filtLength = GetBits(bsi, 4); - *filtOrder = GetBits(bsi, 3); - if (*filtOrder) { - *filtDir++ = GetBits(bsi, 1); - compress = GetBits(bsi, 1); - coefBits = (int)ti->coefRes[w] - compress; /* 2, 3, or 4 */ - s = sgnMask[coefBits - 2]; - n = negMask[coefBits - 2]; - for (i = 0; i < *filtOrder; i++) { - c = GetBits(bsi, coefBits); - if (c & s) c |= n; - *tnsCoef++ = c; - } - } - filtLength++; - filtOrder++; - } - } - } else { - /* long blocks */ - ti->numFilt[0] = GetBits(bsi, 2); - if (ti->numFilt[0]) - ti->coefRes[0] = GetBits(bsi, 1) + 3; - for (f = 0; f < ti->numFilt[0]; f++) { - *filtLength = GetBits(bsi, 6); - *filtOrder = GetBits(bsi, 5); - if (*filtOrder) { - *filtDir++ = GetBits(bsi, 1); - compress = GetBits(bsi, 1); - coefBits = (int)ti->coefRes[0] - compress; /* 2, 3, or 4 */ - s = sgnMask[coefBits - 2]; - n = negMask[coefBits - 2]; - for (i = 0; i < *filtOrder; i++) { - c = GetBits(bsi, coefBits); - if (c & s) c |= n; - *tnsCoef++ = c; - } - } - filtLength++; - filtOrder++; - } - } +static void DecodeTNSInfo(BitStreamInfo *bsi, int winSequence, TNSInfo *ti, signed char *tnsCoef) { + int i, w, f, coefBits, compress; + signed char c, s, n; + + unsigned char *filtLength, *filtOrder, *filtDir; + + filtLength = ti->length; + filtOrder = ti->order; + filtDir = ti->dir; + + if (winSequence == 2) { + /* short blocks */ + for (w = 0; w < NWINDOWS_SHORT; w++) { + ti->numFilt[w] = GetBits(bsi, 1); + if (ti->numFilt[w]) { + ti->coefRes[w] = GetBits(bsi, 1) + 3; + *filtLength = GetBits(bsi, 4); + *filtOrder = GetBits(bsi, 3); + if (*filtOrder) { + *filtDir++ = GetBits(bsi, 1); + compress = GetBits(bsi, 1); + coefBits = (int)ti->coefRes[w] - compress; /* 2, 3, or 4 */ + s = sgnMask[coefBits - 2]; + n = negMask[coefBits - 2]; + for (i = 0; i < *filtOrder; i++) { + c = GetBits(bsi, coefBits); + if (c & s) { + c |= n; + } + *tnsCoef++ = c; + } + } + filtLength++; + filtOrder++; + } + } + } else { + /* long blocks */ + ti->numFilt[0] = GetBits(bsi, 2); + if (ti->numFilt[0]) { + ti->coefRes[0] = GetBits(bsi, 1) + 3; + } + for (f = 0; f < ti->numFilt[0]; f++) { + *filtLength = GetBits(bsi, 6); + *filtOrder = GetBits(bsi, 5); + if (*filtOrder) { + *filtDir++ = GetBits(bsi, 1); + compress = GetBits(bsi, 1); + coefBits = (int)ti->coefRes[0] - compress; /* 2, 3, or 4 */ + s = sgnMask[coefBits - 2]; + n = negMask[coefBits - 2]; + for (i = 0; i < *filtOrder; i++) { + c = GetBits(bsi, coefBits); + if (c & s) { + c |= n; + } + *tnsCoef++ = c; + } + } + filtLength++; + filtOrder++; + } + } } -/* bitstream field lengths for gain control data: - * gainBits[winSequence][0] = maxWindow (how many gain windows there are) - * gainBits[winSequence][1] = locBitsZero (bits for alocCode if window == 0) - * gainBits[winSequence][2] = locBits (bits for alocCode if window != 0) - */ +/* bitstream field lengths for gain control data: + gainBits[winSequence][0] = maxWindow (how many gain windows there are) + gainBits[winSequence][1] = locBitsZero (bits for alocCode if window == 0) + gainBits[winSequence][2] = locBits (bits for alocCode if window != 0) +*/ static const unsigned char gainBits[4][3] = { - {1, 5, 5}, /* long */ - {2, 4, 2}, /* start */ - {8, 2, 2}, /* short */ - {2, 4, 5}, /* stop */ + {1, 5, 5}, /* long */ + {2, 4, 2}, /* start */ + {8, 2, 2}, /* short */ + {2, 4, 5}, /* stop */ }; /************************************************************************************** - * Function: DecodeGainControlInfo - * - * Description: decode gain control information (SSR profile only) - * - * Inputs: BitStreamInfo struct pointing to start of gain control info - * (14496-3, table 4.4.12) - * window sequence (short or long blocks) - * - * Outputs: updated GainControlInfo struct - * - * Return: none + Function: DecodeGainControlInfo + + Description: decode gain control information (SSR profile only) + + Inputs: BitStreamInfo struct pointing to start of gain control info + (14496-3, table 4.4.12) + window sequence (short or long blocks) + + Outputs: updated GainControlInfo struct + + Return: none **************************************************************************************/ -static void DecodeGainControlInfo(BitStreamInfo *bsi, int winSequence, GainControlInfo *gi) -{ - int bd, wd, ad; - int locBits, locBitsZero, maxWin; - - gi->maxBand = GetBits(bsi, 2); - maxWin = (int)gainBits[winSequence][0]; - locBitsZero = (int)gainBits[winSequence][1]; - locBits = (int)gainBits[winSequence][2]; - - for (bd = 1; bd <= gi->maxBand; bd++) { - for (wd = 0; wd < maxWin; wd++) { - gi->adjNum[bd][wd] = GetBits(bsi, 3); - for (ad = 0; ad < gi->adjNum[bd][wd]; ad++) { - gi->alevCode[bd][wd][ad] = GetBits(bsi, 4); - gi->alocCode[bd][wd][ad] = GetBits(bsi, (wd == 0 ? locBitsZero : locBits)); - } - } - } +static void DecodeGainControlInfo(BitStreamInfo *bsi, int winSequence, GainControlInfo *gi) { + int bd, wd, ad; + int locBits, locBitsZero, maxWin; + + gi->maxBand = GetBits(bsi, 2); + maxWin = (int)gainBits[winSequence][0]; + locBitsZero = (int)gainBits[winSequence][1]; + locBits = (int)gainBits[winSequence][2]; + + for (bd = 1; bd <= gi->maxBand; bd++) { + for (wd = 0; wd < maxWin; wd++) { + gi->adjNum[bd][wd] = GetBits(bsi, 3); + for (ad = 0; ad < gi->adjNum[bd][wd]; ad++) { + gi->alevCode[bd][wd][ad] = GetBits(bsi, 4); + gi->alocCode[bd][wd][ad] = GetBits(bsi, (wd == 0 ? locBitsZero : locBits)); + } + } + } } /************************************************************************************** - * Function: DecodeICS - * - * Description: decode individual channel stream - * - * Inputs: platform specific info struct - * BitStreamInfo struct pointing to start of individual channel stream - * (14496-3, table 4.4.24) - * index of current channel - * - * Outputs: updated section data, scale factor data, pulse data, TNS data, - * and gain control data - * - * Return: none + Function: DecodeICS + + Description: decode individual channel stream + + Inputs: platform specific info struct + BitStreamInfo struct pointing to start of individual channel stream + (14496-3, table 4.4.24) + index of current channel + + Outputs: updated section data, scale factor data, pulse data, TNS data, + and gain control data + + Return: none **************************************************************************************/ -static void DecodeICS(PSInfoBase *psi, BitStreamInfo *bsi, int ch) -{ - int globalGain; - ICSInfo *icsInfo; - PulseInfo *pi; - TNSInfo *ti; - GainControlInfo *gi; - - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - globalGain = GetBits(bsi, 8); - if (!psi->commonWin) - DecodeICSInfo(bsi, icsInfo, psi->sampRateIdx); - - DecodeSectionData(bsi, icsInfo->winSequence, icsInfo->numWinGroup, icsInfo->maxSFB, psi->sfbCodeBook[ch]); - - DecodeScaleFactors(bsi, icsInfo->numWinGroup, icsInfo->maxSFB, globalGain, psi->sfbCodeBook[ch], psi->scaleFactors[ch]); - - pi = &psi->pulseInfo[ch]; - pi->pulseDataPresent = GetBits(bsi, 1); - if (pi->pulseDataPresent) - DecodePulseInfo(bsi, pi); - - ti = &psi->tnsInfo[ch]; - ti->tnsDataPresent = GetBits(bsi, 1); - if (ti->tnsDataPresent) - DecodeTNSInfo(bsi, icsInfo->winSequence, ti, ti->coef); - - gi = &psi->gainControlInfo[ch]; - gi->gainControlDataPresent = GetBits(bsi, 1); - if (gi->gainControlDataPresent) - DecodeGainControlInfo(bsi, icsInfo->winSequence, gi); +static void DecodeICS(PSInfoBase *psi, BitStreamInfo *bsi, int ch) { + int globalGain; + ICSInfo *icsInfo; + PulseInfo *pi; + TNSInfo *ti; + GainControlInfo *gi; + + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + globalGain = GetBits(bsi, 8); + if (!psi->commonWin) { + DecodeICSInfo(bsi, icsInfo, psi->sampRateIdx); + } + + DecodeSectionData(bsi, icsInfo->winSequence, icsInfo->numWinGroup, icsInfo->maxSFB, psi->sfbCodeBook[ch]); + + DecodeScaleFactors(bsi, icsInfo->numWinGroup, icsInfo->maxSFB, globalGain, psi->sfbCodeBook[ch], psi->scaleFactors[ch]); + + pi = &psi->pulseInfo[ch]; + pi->pulseDataPresent = GetBits(bsi, 1); + if (pi->pulseDataPresent) { + DecodePulseInfo(bsi, pi); + } + + ti = &psi->tnsInfo[ch]; + ti->tnsDataPresent = GetBits(bsi, 1); + if (ti->tnsDataPresent) { + DecodeTNSInfo(bsi, icsInfo->winSequence, ti, ti->coef); + } + + gi = &psi->gainControlInfo[ch]; + gi->gainControlDataPresent = GetBits(bsi, 1); + if (gi->gainControlDataPresent) { + DecodeGainControlInfo(bsi, icsInfo->winSequence, gi); + } } /************************************************************************************** - * Function: DecodeNoiselessData - * - * Description: decode noiseless data (side info and transform coefficients) - * - * Inputs: valid AACDecInfo struct - * double pointer to buffer pointing to start of individual channel stream - * (14496-3, table 4.4.24) - * pointer to bit offset - * pointer to number of valid bits remaining in buf - * index of current channel - * - * Outputs: updated global gain, section data, scale factor data, pulse data, - * TNS data, gain control data, and spectral data - * - * Return: 0 if successful, error code (< 0) if error + Function: DecodeNoiselessData + + Description: decode noiseless data (side info and transform coefficients) + + Inputs: valid AACDecInfo struct + double pointer to buffer pointing to start of individual channel stream + (14496-3, table 4.4.24) + pointer to bit offset + pointer to number of valid bits remaining in buf + index of current channel + + Outputs: updated global gain, section data, scale factor data, pulse data, + TNS data, gain control data, and spectral data + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int DecodeNoiselessData(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail, int ch) -{ - int bitsUsed; - BitStreamInfo bsi; - PSInfoBase *psi; - ICSInfo *icsInfo; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - SetBitstreamPointer(&bsi, (*bitsAvail+7) >> 3, *buf); - GetBits(&bsi, *bitOffset); - - DecodeICS(psi, &bsi, ch); - - if (icsInfo->winSequence == 2) - DecodeSpectrumShort(psi, &bsi, ch); - else - DecodeSpectrumLong(psi, &bsi, ch); - - bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); - *buf += ((bitsUsed + *bitOffset) >> 3); - *bitOffset = ((bitsUsed + *bitOffset) & 0x07); - *bitsAvail -= bitsUsed; - - aacDecInfo->sbDeinterleaveReqd[ch] = 0; - aacDecInfo->tnsUsed |= psi->tnsInfo[ch].tnsDataPresent; /* set flag if TNS used for any channel */ - - return ERR_AAC_NONE; +int DecodeNoiselessData(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail, int ch) { + int bitsUsed; + BitStreamInfo bsi; + PSInfoBase *psi; + ICSInfo *icsInfo; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + SetBitstreamPointer(&bsi, (*bitsAvail + 7) >> 3, *buf); + GetBits(&bsi, *bitOffset); + + DecodeICS(psi, &bsi, ch); + + if (icsInfo->winSequence == 2) { + DecodeSpectrumShort(psi, &bsi, ch); + } else { + DecodeSpectrumLong(psi, &bsi, ch); + } + + bitsUsed = CalcBitsUsed(&bsi, *buf, *bitOffset); + *buf += ((bitsUsed + *bitOffset) >> 3); + *bitOffset = ((bitsUsed + *bitOffset) & 0x07); + *bitsAvail -= bitsUsed; + + aacDecInfo->sbDeinterleaveReqd[ch] = 0; + aacDecInfo->tnsUsed |= psi->tnsInfo[ch].tnsDataPresent; /* set flag if TNS used for any channel */ + + return ERR_AAC_NONE; } diff --git a/src/libhelix-aac/pns.c b/src/libhelix-aac/pns.c index 3594c76d..8b887a9c 100644 --- a/src/libhelix-aac/pns.c +++ b/src/libhelix-aac/pns.c @@ -1,75 +1,74 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: pns.c,v 1.2 2005/03/10 17:01:56 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: pns.c,v 1.2 2005/03/10 17:01:56 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * pns.c - perceptual noise substitution + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + pns.c - perceptual noise substitution **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: Get32BitVal - * - * Description: generate 32-bit unsigned random number - * - * Inputs: last number calculated (seed, first time through) - * - * Outputs: new number, saved in *last - * - * Return: 32-bit number, uniformly distributed between [0, 2^32) - * - * Notes: uses simple linear congruential generator + Function: Get32BitVal + + Description: generate 32-bit unsigned random number + + Inputs: last number calculated (seed, first time through) + + Outputs: new number, saved in *last + + Return: 32-bit number, uniformly distributed between [0, 2^32) + + Notes: uses simple linear congruential generator **************************************************************************************/ -static unsigned int Get32BitVal(unsigned int *last) -{ - unsigned int r = *last; +static unsigned int Get32BitVal(unsigned int *last) { + unsigned int r = *last; - /* use same coefs as MPEG reference code (classic LCG) - * use unsigned multiply to force reliable wraparound behavior in C (mod 2^32) - */ - r = (1664525U * r) + 1013904223U; - *last = r; + /* use same coefs as MPEG reference code (classic LCG) + use unsigned multiply to force reliable wraparound behavior in C (mod 2^32) + */ + r = (1664525U * r) + 1013904223U; + *last = r; - return r; + return r; } @@ -80,278 +79,285 @@ static unsigned int Get32BitVal(unsigned int *last) #define Q26_3 0x0c000000 /* Q26: 3.0 */ /************************************************************************************** - * Function: InvRootR - * - * Description: use Newton's method to solve for x = 1/sqrt(r) - * - * Inputs: r in Q30 format, range = [0.25, 1] (normalize inputs to this range) - * - * Outputs: none - * - * Return: x = Q29, range = (1, 2) - * - * Notes: guaranteed to converge and not overflow for any r in this range - * - * xn+1 = xn - f(xn)/f'(xn) - * f(x) = 1/sqrt(r) - x = 0 (find root) - * = 1/x^2 - r - * f'(x) = -2/x^3 - * - * so xn+1 = xn/2 * (3 - r*xn^2) - * - * NUM_ITER_INVSQRT = 3, maxDiff = 1.3747e-02 - * NUM_ITER_INVSQRT = 4, maxDiff = 3.9832e-04 + Function: InvRootR + + Description: use Newton's method to solve for x = 1/sqrt(r) + + Inputs: r in Q30 format, range = [0.25, 1] (normalize inputs to this range) + + Outputs: none + + Return: x = Q29, range = (1, 2) + + Notes: guaranteed to converge and not overflow for any r in this range + + xn+1 = xn - f(xn)/f'(xn) + f(x) = 1/sqrt(r) - x = 0 (find root) + = 1/x^2 - r + f'(x) = -2/x^3 + + so xn+1 = xn/2 * (3 - r*xn^2) + + NUM_ITER_INVSQRT = 3, maxDiff = 1.3747e-02 + NUM_ITER_INVSQRT = 4, maxDiff = 3.9832e-04 **************************************************************************************/ -static int InvRootR(int r) -{ - int i, xn, t; - - /* use linear equation for initial guess - * x0 = -2*r + 3 (so x0 always >= correct answer in range [0.25, 1)) - * xn = Q29 (at every step) - */ - xn = (MULSHIFT32(r, X0_COEF_2) << 2) + X0_OFF_2; - - for (i = 0; i < NUM_ITER_INVSQRT; i++) { - t = MULSHIFT32(xn, xn); /* Q26 = Q29*Q29 */ - t = Q26_3 - (MULSHIFT32(r, t) << 2); /* Q26 = Q26 - (Q31*Q26 << 1) */ - xn = MULSHIFT32(xn, t) << (6 - 1); /* Q29 = (Q29*Q26 << 6), and -1 for division by 2 */ - } - - /* clip to range (1.0, 2.0) - * (because of rounding, this can converge to xn slightly > 2.0 when r is near 0.25) - */ - if (xn >> 30) - xn = (1 << 30) - 1; - - return xn; +static int InvRootR(int r) { + int i, xn, t; + + /* use linear equation for initial guess + x0 = -2*r + 3 (so x0 always >= correct answer in range [0.25, 1)) + xn = Q29 (at every step) + */ + xn = (MULSHIFT32(r, X0_COEF_2) << 2) + X0_OFF_2; + + for (i = 0; i < NUM_ITER_INVSQRT; i++) { + t = MULSHIFT32(xn, xn); /* Q26 = Q29*Q29 */ + t = Q26_3 - (MULSHIFT32(r, t) << 2); /* Q26 = Q26 - (Q31*Q26 << 1) */ + xn = MULSHIFT32(xn, t) << (6 - 1); /* Q29 = (Q29*Q26 << 6), and -1 for division by 2 */ + } + + /* clip to range (1.0, 2.0) + (because of rounding, this can converge to xn slightly > 2.0 when r is near 0.25) + */ + if (xn >> 30) { + xn = (1 << 30) - 1; + } + + return xn; } /************************************************************************************** - * Function: ScaleNoiseVector - * - * Description: apply scaling to vector of noise coefficients for one scalefactor band - * - * Inputs: unscaled coefficients - * number of coefficients in vector (one scalefactor band of coefs) - * scalefactor for this band (i.e. noise energy) - * - * Outputs: nVals coefficients in Q(FBITS_OUT_DQ_OFF) - * - * Return: guard bit mask (OR of abs value of all noise coefs) + Function: ScaleNoiseVector + + Description: apply scaling to vector of noise coefficients for one scalefactor band + + Inputs: unscaled coefficients + number of coefficients in vector (one scalefactor band of coefs) + scalefactor for this band (i.e. noise energy) + + Outputs: nVals coefficients in Q(FBITS_OUT_DQ_OFF) + + Return: guard bit mask (OR of abs value of all noise coefs) **************************************************************************************/ -static int ScaleNoiseVector(int *coef, int nVals, int sf) -{ - -/* pow(2, i/4.0) for i = [0,1,2,3], format = Q30 */ -static const int pow14[4] PROGMEM = { - 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 -}; - - int i, c, spec, energy, sq, scalef, scalei, invSqrtEnergy, z, gbMask; - - energy = 0; - for (i = 0; i < nVals; i++) { - spec = coef[i]; - - /* max nVals = max SFB width = 96, so energy can gain < 2^7 bits in accumulation */ - sq = (spec * spec) >> 8; /* spec*spec range = (-2^30, 2^30) */ - energy += sq; - } - - /* unless nVals == 1 (or the number generator is broken...), this should not happen */ - if (energy == 0) - return 0; /* coef[i] must = 0 for i = [0, nVals-1], so gbMask = 0 */ - - /* pow(2, sf/4) * pow(2, FBITS_OUT_DQ_OFF) */ - scalef = pow14[sf & 0x3]; - scalei = (sf >> 2) + FBITS_OUT_DQ_OFF; - - /* energy has implied factor of 2^-8 since we shifted the accumulator - * normalize energy to range [0.25, 1.0), calculate 1/sqrt(1), and denormalize - * i.e. divide input by 2^(30-z) and convert to Q30 - * output of 1/sqrt(i) now has extra factor of 2^((30-z)/2) - * for energy > 0, z is an even number between 0 and 28 - * final scaling of invSqrtEnergy: - * 2^(15 - z/2) to compensate for implicit 2^(30-z) factor in input - * +4 to compensate for implicit 2^-8 factor in input - */ - z = CLZ(energy) - 2; /* energy has at least 2 leading zeros (see acc loop) */ - z &= 0xfffffffe; /* force even */ - invSqrtEnergy = InvRootR(energy << z); /* energy << z must be in range [0x10000000, 0x40000000] */ - scalei -= (15 - z/2 + 4); /* nInt = 1/sqrt(energy) in Q29 */ - - /* normalize for final scaling */ - z = CLZ(invSqrtEnergy) - 1; - invSqrtEnergy <<= z; - scalei -= (z - 3 - 2); /* -2 for scalef, z-3 for invSqrtEnergy */ - scalef = MULSHIFT32(scalef, invSqrtEnergy); /* scalef (input) = Q30, invSqrtEnergy = Q29 * 2^z */ - gbMask = 0; - - if (scalei < 0) { - scalei = -scalei; - if (scalei > 31) - scalei = 31; - for (i = 0; i < nVals; i++) { - c = MULSHIFT32(coef[i], scalef) >> scalei; - gbMask |= FASTABS(c); - coef[i] = c; - } - } else { - /* for scalei <= 16, no clipping possible (coef[i] is < 2^15 before scaling) - * for scalei > 16, just saturate exponent (rare) - * scalef is close to full-scale (since we normalized invSqrtEnergy) - * remember, we are just producing noise here - */ - if (scalei > 16) - scalei = 16; - for (i = 0; i < nVals; i++) { - c = MULSHIFT32(coef[i] << scalei, scalef); - coef[i] = c; - gbMask |= FASTABS(c); - } - } - - return gbMask; +static int ScaleNoiseVector(int *coef, int nVals, int sf) { + + /* pow(2, i/4.0) for i = [0,1,2,3], format = Q30 */ + static const int pow14[4] PROGMEM = { + 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 + }; + + int i, c, spec, energy, sq, scalef, scalei, invSqrtEnergy, z, gbMask; + + energy = 0; + for (i = 0; i < nVals; i++) { + spec = coef[i]; + + /* max nVals = max SFB width = 96, so energy can gain < 2^7 bits in accumulation */ + sq = (spec * spec) >> 8; /* spec*spec range = (-2^30, 2^30) */ + energy += sq; + } + + /* unless nVals == 1 (or the number generator is broken...), this should not happen */ + if (energy == 0) { + return 0; /* coef[i] must = 0 for i = [0, nVals-1], so gbMask = 0 */ + } + + /* pow(2, sf/4) * pow(2, FBITS_OUT_DQ_OFF) */ + scalef = pow14[sf & 0x3]; + scalei = (sf >> 2) + FBITS_OUT_DQ_OFF; + + /* energy has implied factor of 2^-8 since we shifted the accumulator + normalize energy to range [0.25, 1.0), calculate 1/sqrt(1), and denormalize + i.e. divide input by 2^(30-z) and convert to Q30 + output of 1/sqrt(i) now has extra factor of 2^((30-z)/2) + for energy > 0, z is an even number between 0 and 28 + final scaling of invSqrtEnergy: + 2^(15 - z/2) to compensate for implicit 2^(30-z) factor in input + +4 to compensate for implicit 2^-8 factor in input + */ + z = CLZ(energy) - 2; /* energy has at least 2 leading zeros (see acc loop) */ + z &= 0xfffffffe; /* force even */ + invSqrtEnergy = InvRootR(energy << z); /* energy << z must be in range [0x10000000, 0x40000000] */ + scalei -= (15 - z / 2 + 4); /* nInt = 1/sqrt(energy) in Q29 */ + + /* normalize for final scaling */ + z = CLZ(invSqrtEnergy) - 1; + invSqrtEnergy <<= z; + scalei -= (z - 3 - 2); /* -2 for scalef, z-3 for invSqrtEnergy */ + scalef = MULSHIFT32(scalef, invSqrtEnergy); /* scalef (input) = Q30, invSqrtEnergy = Q29 * 2^z */ + gbMask = 0; + + if (scalei < 0) { + scalei = -scalei; + if (scalei > 31) { + scalei = 31; + } + for (i = 0; i < nVals; i++) { + c = MULSHIFT32(coef[i], scalef) >> scalei; + gbMask |= FASTABS(c); + coef[i] = c; + } + } else { + /* for scalei <= 16, no clipping possible (coef[i] is < 2^15 before scaling) + for scalei > 16, just saturate exponent (rare) + scalef is close to full-scale (since we normalized invSqrtEnergy) + remember, we are just producing noise here + */ + if (scalei > 16) { + scalei = 16; + } + for (i = 0; i < nVals; i++) { + c = MULSHIFT32(coef[i] << scalei, scalef); + coef[i] = c; + gbMask |= FASTABS(c); + } + } + + return gbMask; } /************************************************************************************** - * Function: GenerateNoiseVector - * - * Description: create vector of noise coefficients for one scalefactor band - * - * Inputs: seed for number generator - * number of coefficients to generate - * - * Outputs: buffer of nVals coefficients, range = [-2^15, 2^15) - * updated seed for number generator - * - * Return: none + Function: GenerateNoiseVector + + Description: create vector of noise coefficients for one scalefactor band + + Inputs: seed for number generator + number of coefficients to generate + + Outputs: buffer of nVals coefficients, range = [-2^15, 2^15) + updated seed for number generator + + Return: none **************************************************************************************/ -static void GenerateNoiseVector(int *coef, int *last, int nVals) -{ - int i; - - for (i = 0; i < nVals; i++) - coef[i] = ((signed int)Get32BitVal((unsigned int *)last)) >> 16; +static void GenerateNoiseVector(int *coef, int *last, int nVals) { + int i; + + for (i = 0; i < nVals; i++) { + coef[i] = ((signed int)Get32BitVal((unsigned int *)last)) >> 16; + } } /************************************************************************************** - * Function: CopyNoiseVector - * - * Description: copy vector of noise coefficients for one scalefactor band from L to R - * - * Inputs: buffer of left coefficients - * number of coefficients to copy - * - * Outputs: buffer of right coefficients - * - * Return: none + Function: CopyNoiseVector + + Description: copy vector of noise coefficients for one scalefactor band from L to R + + Inputs: buffer of left coefficients + number of coefficients to copy + + Outputs: buffer of right coefficients + + Return: none **************************************************************************************/ -static void CopyNoiseVector(int *coefL, int *coefR, int nVals) -{ - int i; +static void CopyNoiseVector(int *coefL, int *coefR, int nVals) { + int i; - for (i = 0; i < nVals; i++) - coefR[i] = coefL[i]; + for (i = 0; i < nVals; i++) { + coefR[i] = coefL[i]; + } } /************************************************************************************** - * Function: PNS - * - * Description: apply perceptual noise substitution, if enabled (MPEG-4 only) - * - * Inputs: valid AACDecInfo struct - * index of current channel - * - * Outputs: shaped noise in scalefactor bands where PNS is active - * updated minimum guard bit count for this channel - * - * Return: 0 if successful, -1 if error + Function: PNS + + Description: apply perceptual noise substitution, if enabled (MPEG-4 only) + + Inputs: valid AACDecInfo struct + index of current channel + + Outputs: shaped noise in scalefactor bands where PNS is active + updated minimum guard bit count for this channel + + Return: 0 if successful, -1 if error **************************************************************************************/ -int PNS(AACDecInfo *aacDecInfo, int ch) -{ - int gp, sfb, win, width, nSamps, gb, gbMask; - int *coef; - const /*short*/ int *sfbTab; - unsigned char *sfbCodeBook; - short *scaleFactors; - int msMaskOffset, checkCorr, genNew; - unsigned char msMask; - unsigned char *msMaskPtr; - PSInfoBase *psi; - ICSInfo *icsInfo; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - - if (!psi->pnsUsed[ch]) - return 0; - - if (icsInfo->winSequence == 2) { - sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; - nSamps = NSAMPS_SHORT; - } else { - sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; - nSamps = NSAMPS_LONG; - } - coef = psi->coef[ch]; - sfbCodeBook = psi->sfbCodeBook[ch]; - scaleFactors = psi->scaleFactors[ch]; - checkCorr = (aacDecInfo->currBlockID == AAC_ID_CPE && psi->commonWin == 1 ? 1 : 0); - - gbMask = 0; - for (gp = 0; gp < icsInfo->numWinGroup; gp++) { - for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { - msMaskPtr = psi->msMaskBits + ((gp*icsInfo->maxSFB) >> 3); - msMaskOffset = ((gp*icsInfo->maxSFB) & 0x07); - msMask = (*msMaskPtr++) >> msMaskOffset; - - for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { - width = sfbTab[sfb+1] - sfbTab[sfb]; - if (sfbCodeBook[sfb] == 13) { - if (ch == 0) { - /* generate new vector, copy into ch 1 if it's possible that the channels will be correlated - * if ch 1 has PNS enabled for this SFB but it's uncorrelated (i.e. ms_used == 0), - * the copied values will be overwritten when we process ch 1 - */ - GenerateNoiseVector(coef, &psi->pnsLastVal, width); - if (checkCorr && psi->sfbCodeBook[1][gp*icsInfo->maxSFB + sfb] == 13) - CopyNoiseVector(coef, psi->coef[1] + (coef - psi->coef[0]), width); - } else { - /* generate new vector if no correlation between channels */ - genNew = 1; - if (checkCorr && psi->sfbCodeBook[0][gp*icsInfo->maxSFB + sfb] == 13) { - if ( (psi->msMaskPresent == 1 && (msMask & 0x01)) || psi->msMaskPresent == 2 ) - genNew = 0; - } - if (genNew) - GenerateNoiseVector(coef, &psi->pnsLastVal, width); - } - gbMask |= ScaleNoiseVector(coef, width, psi->scaleFactors[ch][gp*icsInfo->maxSFB + sfb]); - } - coef += width; - - /* get next mask bit (should be branchless on ARM) */ - msMask >>= 1; - if (++msMaskOffset == 8) { - msMask = *msMaskPtr++; - msMaskOffset = 0; - } - } - coef += (nSamps - sfbTab[icsInfo->maxSFB]); - } - sfbCodeBook += icsInfo->maxSFB; - scaleFactors += icsInfo->maxSFB; - } - - /* update guard bit count if necessary */ - gb = CLZ(gbMask) - 1; - if (psi->gbCurrent[ch] > gb) - psi->gbCurrent[ch] = gb; - - return 0; +int PNS(AACDecInfo *aacDecInfo, int ch) { + int gp, sfb, win, width, nSamps, gb, gbMask; + int *coef; + const /*short*/ int *sfbTab; + unsigned char *sfbCodeBook; + short *scaleFactors; + int msMaskOffset, checkCorr, genNew; + unsigned char msMask; + unsigned char *msMaskPtr; + PSInfoBase *psi; + ICSInfo *icsInfo; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + + if (!psi->pnsUsed[ch]) { + return 0; + } + + if (icsInfo->winSequence == 2) { + sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; + nSamps = NSAMPS_SHORT; + } else { + sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; + nSamps = NSAMPS_LONG; + } + coef = psi->coef[ch]; + sfbCodeBook = psi->sfbCodeBook[ch]; + scaleFactors = psi->scaleFactors[ch]; + checkCorr = (aacDecInfo->currBlockID == AAC_ID_CPE && psi->commonWin == 1 ? 1 : 0); + + gbMask = 0; + for (gp = 0; gp < icsInfo->numWinGroup; gp++) { + for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { + msMaskPtr = psi->msMaskBits + ((gp * icsInfo->maxSFB) >> 3); + msMaskOffset = ((gp * icsInfo->maxSFB) & 0x07); + msMask = (*msMaskPtr++) >> msMaskOffset; + + for (sfb = 0; sfb < icsInfo->maxSFB; sfb++) { + width = sfbTab[sfb + 1] - sfbTab[sfb]; + if (sfbCodeBook[sfb] == 13) { + if (ch == 0) { + /* generate new vector, copy into ch 1 if it's possible that the channels will be correlated + if ch 1 has PNS enabled for this SFB but it's uncorrelated (i.e. ms_used == 0), + the copied values will be overwritten when we process ch 1 + */ + GenerateNoiseVector(coef, &psi->pnsLastVal, width); + if (checkCorr && psi->sfbCodeBook[1][gp * icsInfo->maxSFB + sfb] == 13) { + CopyNoiseVector(coef, psi->coef[1] + (coef - psi->coef[0]), width); + } + } else { + /* generate new vector if no correlation between channels */ + genNew = 1; + if (checkCorr && psi->sfbCodeBook[0][gp * icsInfo->maxSFB + sfb] == 13) { + if ((psi->msMaskPresent == 1 && (msMask & 0x01)) || psi->msMaskPresent == 2) { + genNew = 0; + } + } + if (genNew) { + GenerateNoiseVector(coef, &psi->pnsLastVal, width); + } + } + gbMask |= ScaleNoiseVector(coef, width, psi->scaleFactors[ch][gp * icsInfo->maxSFB + sfb]); + } + coef += width; + + /* get next mask bit (should be branchless on ARM) */ + msMask >>= 1; + if (++msMaskOffset == 8) { + msMask = *msMaskPtr++; + msMaskOffset = 0; + } + } + coef += (nSamps - sfbTab[icsInfo->maxSFB]); + } + sfbCodeBook += icsInfo->maxSFB; + scaleFactors += icsInfo->maxSFB; + } + + /* update guard bit count if necessary */ + gb = CLZ(gbMask) - 1; + if (psi->gbCurrent[ch] > gb) { + psi->gbCurrent[ch] = gb; + } + + return 0; } diff --git a/src/libhelix-aac/sbr.c b/src/libhelix-aac/sbr.c index ec046720..ccaf6114 100644 --- a/src/libhelix-aac/sbr.c +++ b/src/libhelix-aac/sbr.c @@ -1,49 +1,50 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbr.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbr.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbr.c - top level functions for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbr.c - top level functions for SBR **************************************************************************************/ #if defined(USE_DEFAULT_STDLIB) || defined(ARDUINO) +#include #include #else #include "hlxclib/stdlib.h" @@ -52,379 +53,393 @@ #include "sbr.h" /************************************************************************************** - * Function: InitSBRState - * - * Description: initialize PSInfoSBR struct at start of stream or after flush - * - * Inputs: valid AACDecInfo struct - * - * Outputs: PSInfoSBR struct with proper initial state - * - * Return: none + Function: InitSBRState + + Description: initialize PSInfoSBR struct at start of stream or after flush + + Inputs: valid AACDecInfo struct + + Outputs: PSInfoSBR struct with proper initial state + + Return: none **************************************************************************************/ -static void InitSBRState(PSInfoSBR *psi) -{ - int i, ch; - unsigned char *c; - - if (!psi) - return; - - /* clear SBR state structure */ - c = (unsigned char *)psi; - for (i = 0; i < (int)sizeof(PSInfoSBR); i++) - *c++ = 0; - - /* initialize non-zero state variables */ - for (ch = 0; ch < AAC_MAX_NCHANS; ch++) { - psi->sbrChan[ch].reset = 1; - psi->sbrChan[ch].laPrev = -1; - } +static void InitSBRState(PSInfoSBR *psi) { + int i, ch; + unsigned char *c; + + if (!psi) { + return; + } + + /* clear SBR state structure */ + c = (unsigned char *)psi; + for (i = 0; i < (int)sizeof(PSInfoSBR); i++) { + *c++ = 0; + } + + /* initialize non-zero state variables */ + for (ch = 0; ch < AAC_MAX_NCHANS; ch++) { + psi->sbrChan[ch].reset = 1; + psi->sbrChan[ch].laPrev = -1; + } } - + /************************************************************************************** - * Function: InitSBR - * - * Description: initialize SBR decoder - * - * Inputs: valid AACDecInfo struct - * - * Outputs: PSInfoSBR struct to hold SBR state information - * - * Return: 0 if successful, error code (< 0) if error - * - * Note: memory allocation for SBR is only done here - **************************************************************************************/ -int InitSBR(AACDecInfo *aacDecInfo) -{ - PSInfoSBR *psi; - - if (!aacDecInfo) - return ERR_AAC_NULL_POINTER; - - /* allocate SBR state structure */ - psi = (PSInfoSBR *)malloc(sizeof(PSInfoSBR)); - if (!psi) { - printf("OOM in SBR, can't allocate %d bytes\n", sizeof(PSInfoSBR)); - return ERR_AAC_SBR_INIT; - } - InitSBRState(psi); - - aacDecInfo->psInfoSBR = psi; - return ERR_AAC_NONE; -} + Function: InitSBR -int InitSBRPre(AACDecInfo *aacDecInfo, void **ptr, int *sz) -{ - PSInfoSBR *psi; + Description: initialize SBR decoder - if (!aacDecInfo) - return ERR_AAC_NULL_POINTER; + Inputs: valid AACDecInfo struct - /* allocate SBR state structure */ - psi = (PSInfoSBR *)*ptr; - *sz -= sizeof(PSInfoSBR); - if (*sz < 0) { - printf("OOM in SBR, can't allocate %d bytes\n", sizeof(PSInfoSBR)); - return ERR_AAC_SBR_INIT; - } - InitSBRState(psi); + Outputs: PSInfoSBR struct to hold SBR state information - *ptr = (void*)((char*)(*ptr) + sizeof(PSInfoSBR)); - aacDecInfo->psInfoSBR = psi; - return ERR_AAC_NONE; + Return: 0 if successful, error code (< 0) if error + + Note: memory allocation for SBR is only done here + **************************************************************************************/ +int InitSBR(AACDecInfo *aacDecInfo) { + PSInfoSBR *psi; + + if (!aacDecInfo) { + return ERR_AAC_NULL_POINTER; + } + + /* allocate SBR state structure */ + psi = (PSInfoSBR *)malloc(sizeof(PSInfoSBR)); + if (!psi) { + printf("OOM in SBR, can't allocate %d bytes\n", sizeof(PSInfoSBR)); + return ERR_AAC_SBR_INIT; + } + InitSBRState(psi); + + aacDecInfo->psInfoSBR = psi; + return ERR_AAC_NONE; +} + +int InitSBRPre(AACDecInfo *aacDecInfo, void **ptr, int *sz) { + PSInfoSBR *psi; + + if (!aacDecInfo) { + return ERR_AAC_NULL_POINTER; + } + + /* allocate SBR state structure */ + psi = (PSInfoSBR *)*ptr; + *sz -= sizeof(PSInfoSBR); + if (*sz < 0) { + printf("OOM in SBR, can't allocate %d bytes\n", sizeof(PSInfoSBR)); + return ERR_AAC_SBR_INIT; + } + InitSBRState(psi); + + *ptr = (void*)((char*)(*ptr) + sizeof(PSInfoSBR)); + aacDecInfo->psInfoSBR = psi; + return ERR_AAC_NONE; } /************************************************************************************** - * Function: FreeSBR - * - * Description: free SBR decoder - * - * Inputs: valid AACDecInfo struct - * - * Outputs: none - * - * Return: none - * - * Note: memory deallocation for SBR is only done here + Function: FreeSBR + + Description: free SBR decoder + + Inputs: valid AACDecInfo struct + + Outputs: none + + Return: none + + Note: memory deallocation for SBR is only done here **************************************************************************************/ -void FreeSBR(AACDecInfo *aacDecInfo) -{ - if (aacDecInfo && aacDecInfo->psInfoSBR) - free(aacDecInfo->psInfoSBR); +void FreeSBR(AACDecInfo *aacDecInfo) { + if (aacDecInfo && aacDecInfo->psInfoSBR) { + free(aacDecInfo->psInfoSBR); + } - return; + return; } /************************************************************************************** - * Function: DecodeSBRBitstream - * - * Description: decode sideband information for SBR - * - * Inputs: valid AACDecInfo struct - * fill buffer with SBR extension block - * number of bytes in fill buffer - * base output channel (range = [0, nChans-1]) - * - * Outputs: initialized state structs (SBRHdr, SBRGrid, SBRFreq, SBRChan) - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: SBR payload should be in aacDecInfo->fillBuf - * returns with no error if fill buffer is not an SBR extension block, - * or if current block is not a fill block (e.g. for LFE upsampling) + Function: DecodeSBRBitstream + + Description: decode sideband information for SBR + + Inputs: valid AACDecInfo struct + fill buffer with SBR extension block + number of bytes in fill buffer + base output channel (range = [0, nChans-1]) + + Outputs: initialized state structs (SBRHdr, SBRGrid, SBRFreq, SBRChan) + + Return: 0 if successful, error code (< 0) if error + + Notes: SBR payload should be in aacDecInfo->fillBuf + returns with no error if fill buffer is not an SBR extension block, + or if current block is not a fill block (e.g. for LFE upsampling) **************************************************************************************/ -int DecodeSBRBitstream(AACDecInfo *aacDecInfo, int chBase) -{ - int headerFlag; - BitStreamInfo bsi; - PSInfoSBR *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoSBR) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); - - if (aacDecInfo->currBlockID != AAC_ID_FIL || (aacDecInfo->fillExtType != EXT_SBR_DATA && aacDecInfo->fillExtType != EXT_SBR_DATA_CRC)) - return ERR_AAC_NONE; - - SetBitstreamPointer(&bsi, aacDecInfo->fillCount, aacDecInfo->fillBuf); - if (GetBits(&bsi, 4) != (unsigned int)aacDecInfo->fillExtType) - return ERR_AAC_SBR_BITSTREAM; - - if (aacDecInfo->fillExtType == EXT_SBR_DATA_CRC) - psi->crcCheckWord = GetBits(&bsi, 10); - - headerFlag = GetBits(&bsi, 1); - if (headerFlag) { - /* get sample rate index for output sample rate (2x base rate) */ - psi->sampRateIdx = GetSampRateIdx(2 * aacDecInfo->sampRate); - if (psi->sampRateIdx < 0 || psi->sampRateIdx >= NUM_SAMPLE_RATES) - return ERR_AAC_SBR_BITSTREAM; - else if (psi->sampRateIdx >= NUM_SAMPLE_RATES_SBR) - return ERR_AAC_SBR_SINGLERATE_UNSUPPORTED; - - /* reset flag = 1 if header values changed */ - if (UnpackSBRHeader(&bsi, &(psi->sbrHdr[chBase]))) - psi->sbrChan[chBase].reset = 1; - - /* first valid SBR header should always trigger CalcFreqTables(), since psi->reset was set in InitSBR() */ - if (psi->sbrChan[chBase].reset) - CalcFreqTables(&(psi->sbrHdr[chBase+0]), &(psi->sbrFreq[chBase]), psi->sampRateIdx); - - /* copy and reset state to right channel for CPE */ - if (aacDecInfo->prevBlockID == AAC_ID_CPE) - psi->sbrChan[chBase+1].reset = psi->sbrChan[chBase+0].reset; - } - - - /* if no header has been received, upsample only */ - if (psi->sbrHdr[chBase].count == 0) - return ERR_AAC_NONE; - - if (aacDecInfo->prevBlockID == AAC_ID_SCE) { - UnpackSBRSingleChannel(&bsi, psi, chBase); - } else if (aacDecInfo->prevBlockID == AAC_ID_CPE) { - UnpackSBRChannelPair(&bsi, psi, chBase); - } else { - return ERR_AAC_SBR_BITSTREAM; - } - - ByteAlignBitstream(&bsi); - - return ERR_AAC_NONE; +int DecodeSBRBitstream(AACDecInfo *aacDecInfo, int chBase) { + int headerFlag; + BitStreamInfo bsi; + PSInfoSBR *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoSBR) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); + + if (aacDecInfo->currBlockID != AAC_ID_FIL || (aacDecInfo->fillExtType != EXT_SBR_DATA && aacDecInfo->fillExtType != EXT_SBR_DATA_CRC)) { + return ERR_AAC_NONE; + } + + SetBitstreamPointer(&bsi, aacDecInfo->fillCount, aacDecInfo->fillBuf); + if (GetBits(&bsi, 4) != (unsigned int)aacDecInfo->fillExtType) { + return ERR_AAC_SBR_BITSTREAM; + } + + if (aacDecInfo->fillExtType == EXT_SBR_DATA_CRC) { + psi->crcCheckWord = GetBits(&bsi, 10); + } + + headerFlag = GetBits(&bsi, 1); + if (headerFlag) { + /* get sample rate index for output sample rate (2x base rate) */ + psi->sampRateIdx = GetSampRateIdx(2 * aacDecInfo->sampRate); + if (psi->sampRateIdx < 0 || psi->sampRateIdx >= NUM_SAMPLE_RATES) { + return ERR_AAC_SBR_BITSTREAM; + } else if (psi->sampRateIdx >= NUM_SAMPLE_RATES_SBR) { + return ERR_AAC_SBR_SINGLERATE_UNSUPPORTED; + } + + /* reset flag = 1 if header values changed */ + if (UnpackSBRHeader(&bsi, &(psi->sbrHdr[chBase]))) { + psi->sbrChan[chBase].reset = 1; + } + + /* first valid SBR header should always trigger CalcFreqTables(), since psi->reset was set in InitSBR() */ + if (psi->sbrChan[chBase].reset) { + CalcFreqTables(&(psi->sbrHdr[chBase + 0]), &(psi->sbrFreq[chBase]), psi->sampRateIdx); + } + + /* copy and reset state to right channel for CPE */ + if (aacDecInfo->prevBlockID == AAC_ID_CPE) { + psi->sbrChan[chBase + 1].reset = psi->sbrChan[chBase + 0].reset; + } + } + + + /* if no header has been received, upsample only */ + if (psi->sbrHdr[chBase].count == 0) { + return ERR_AAC_NONE; + } + + if (aacDecInfo->prevBlockID == AAC_ID_SCE) { + UnpackSBRSingleChannel(&bsi, psi, chBase); + } else if (aacDecInfo->prevBlockID == AAC_ID_CPE) { + UnpackSBRChannelPair(&bsi, psi, chBase); + } else { + return ERR_AAC_SBR_BITSTREAM; + } + + ByteAlignBitstream(&bsi); + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: DecodeSBRData - * - * Description: apply SBR to one frame of PCM data - * - * Inputs: 1024 samples of decoded 32-bit PCM, before SBR - * size of input PCM samples (must be 4 bytes) - * number of fraction bits in input PCM samples - * base output channel (range = [0, nChans-1]) - * initialized state structs (SBRHdr, SBRGrid, SBRFreq, SBRChan) - * - * Outputs: 2048 samples of decoded 16-bit PCM, after SBR - * - * Return: 0 if successful, error code (< 0) if error + Function: DecodeSBRData + + Description: apply SBR to one frame of PCM data + + Inputs: 1024 samples of decoded 32-bit PCM, before SBR + size of input PCM samples (must be 4 bytes) + number of fraction bits in input PCM samples + base output channel (range = [0, nChans-1]) + initialized state structs (SBRHdr, SBRGrid, SBRFreq, SBRChan) + + Outputs: 2048 samples of decoded 16-bit PCM, after SBR + + Return: 0 if successful, error code (< 0) if error **************************************************************************************/ -int DecodeSBRData(AACDecInfo *aacDecInfo, int chBase, short *outbuf) -{ - int k, l, ch, chBlock, qmfaBands, qmfsBands; - int upsampleOnly, gbIdx, gbMask; - int *inbuf; - short *outptr; - PSInfoSBR *psi; - SBRHeader *sbrHdr; - SBRGrid *sbrGrid; - SBRFreq *sbrFreq; - SBRChan *sbrChan; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoSBR) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); - - /* same header and freq tables for both channels in CPE */ - sbrHdr = &(psi->sbrHdr[chBase]); - sbrFreq = &(psi->sbrFreq[chBase]); - - /* upsample only if we haven't received an SBR header yet or if we have an LFE block */ - if (aacDecInfo->currBlockID == AAC_ID_LFE) { - chBlock = 1; - upsampleOnly = 1; - } else if (aacDecInfo->currBlockID == AAC_ID_FIL) { - if (aacDecInfo->prevBlockID == AAC_ID_SCE) - chBlock = 1; - else if (aacDecInfo->prevBlockID == AAC_ID_CPE) - chBlock = 2; - else - return ERR_AAC_NONE; - - upsampleOnly = (sbrHdr->count == 0 ? 1 : 0); - if (aacDecInfo->fillExtType != EXT_SBR_DATA && aacDecInfo->fillExtType != EXT_SBR_DATA_CRC) - return ERR_AAC_NONE; - } else { - /* ignore non-SBR blocks */ - return ERR_AAC_NONE; - } - - if (upsampleOnly) { - sbrFreq->kStart = 32; - sbrFreq->numQMFBands = 0; - } - - for (ch = 0; ch < chBlock; ch++) { - sbrGrid = &(psi->sbrGrid[chBase + ch]); - sbrChan = &(psi->sbrChan[chBase + ch]); - - if (aacDecInfo->rawSampleBuf[ch] == 0 || aacDecInfo->rawSampleBytes != 4) - return ERR_AAC_SBR_PCM_FORMAT; - inbuf = (int *)aacDecInfo->rawSampleBuf[ch]; - outptr = outbuf + chBase + ch; - - /* restore delay buffers (could use ring buffer or keep in temp buffer for nChans == 1) */ - for (l = 0; l < HF_GEN; l++) { - for (k = 0; k < 64; k++) { - psi->XBuf[l][k][0] = psi->XBufDelay[chBase + ch][l][k][0]; - psi->XBuf[l][k][1] = psi->XBufDelay[chBase + ch][l][k][1]; - } - } - - /* step 1 - analysis QMF */ - qmfaBands = sbrFreq->kStart; - for (l = 0; l < 32; l++) { - gbMask = QMFAnalysis(inbuf + l*32, psi->delayQMFA[chBase + ch], psi->XBuf[l + HF_GEN][0], - aacDecInfo->rawSampleFBits, &(psi->delayIdxQMFA[chBase + ch]), qmfaBands); - - gbIdx = ((l + HF_GEN) >> 5) & 0x01; - sbrChan->gbMask[gbIdx] |= gbMask; /* gbIdx = (0 if i < 32), (1 if i >= 32) */ - } - - if (upsampleOnly) { - /* no SBR - just run synthesis QMF to upsample by 2x */ - qmfsBands = 32; - for (l = 0; l < 32; l++) { - /* step 4 - synthesis QMF */ - QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); - outptr += 64*aacDecInfo->nChans; - } - } else { - /* if previous frame had lower SBR starting freq than current, zero out the synthesized QMF - * bands so they aren't used as sources for patching - * after patch generation, restore from delay buffer - * can only happen after header reset - */ - for (k = sbrFreq->kStartPrev; k < sbrFreq->kStart; k++) { - for (l = 0; l < sbrGrid->envTimeBorder[0] + HF_ADJ; l++) { - psi->XBuf[l][k][0] = 0; - psi->XBuf[l][k][1] = 0; - } - } - - /* step 2 - HF generation */ - GenerateHighFreq(psi, sbrGrid, sbrFreq, sbrChan, ch); - - /* restore SBR bands that were cleared before patch generation (time slots 0, 1 no longer needed) */ - for (k = sbrFreq->kStartPrev; k < sbrFreq->kStart; k++) { - for (l = HF_ADJ; l < sbrGrid->envTimeBorder[0] + HF_ADJ; l++) { - psi->XBuf[l][k][0] = psi->XBufDelay[chBase + ch][l][k][0]; - psi->XBuf[l][k][1] = psi->XBufDelay[chBase + ch][l][k][1]; - } - } - - /* step 3 - HF adjustment */ - AdjustHighFreq(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, ch); - - /* step 4 - synthesis QMF */ - qmfsBands = sbrFreq->kStartPrev + sbrFreq->numQMFBandsPrev; - for (l = 0; l < sbrGrid->envTimeBorder[0]; l++) { - /* if new envelope starts mid-frame, use old settings until start of first envelope in this frame */ - QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); - outptr += 64*aacDecInfo->nChans; - } - - qmfsBands = sbrFreq->kStart + sbrFreq->numQMFBands; - for ( ; l < 32; l++) { - /* use new settings for rest of frame (usually the entire frame, unless the first envelope starts mid-frame) */ - QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); - outptr += 64*aacDecInfo->nChans; - } - } - - /* save delay */ - for (l = 0; l < HF_GEN; l++) { - for (k = 0; k < 64; k++) { - psi->XBufDelay[chBase + ch][l][k][0] = psi->XBuf[l+32][k][0]; - psi->XBufDelay[chBase + ch][l][k][1] = psi->XBuf[l+32][k][1]; - } - } - sbrChan->gbMask[0] = sbrChan->gbMask[1]; - sbrChan->gbMask[1] = 0; - - if (sbrHdr->count > 0) - sbrChan->reset = 0; - } - sbrFreq->kStartPrev = sbrFreq->kStart; - sbrFreq->numQMFBandsPrev = sbrFreq->numQMFBands; - - if (aacDecInfo->nChans > 0 && (chBase + ch) == aacDecInfo->nChans) - psi->frameCount++; - - return ERR_AAC_NONE; +int DecodeSBRData(AACDecInfo *aacDecInfo, int chBase, short *outbuf) { + int k, l, ch, chBlock, qmfaBands, qmfsBands; + int upsampleOnly, gbIdx, gbMask; + int *inbuf; + short *outptr; + PSInfoSBR *psi; + SBRHeader *sbrHdr; + SBRGrid *sbrGrid; + SBRFreq *sbrFreq; + SBRChan *sbrChan; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoSBR) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); + + /* same header and freq tables for both channels in CPE */ + sbrHdr = &(psi->sbrHdr[chBase]); + sbrFreq = &(psi->sbrFreq[chBase]); + + /* upsample only if we haven't received an SBR header yet or if we have an LFE block */ + if (aacDecInfo->currBlockID == AAC_ID_LFE) { + chBlock = 1; + upsampleOnly = 1; + } else if (aacDecInfo->currBlockID == AAC_ID_FIL) { + if (aacDecInfo->prevBlockID == AAC_ID_SCE) { + chBlock = 1; + } else if (aacDecInfo->prevBlockID == AAC_ID_CPE) { + chBlock = 2; + } else { + return ERR_AAC_NONE; + } + + upsampleOnly = (sbrHdr->count == 0 ? 1 : 0); + if (aacDecInfo->fillExtType != EXT_SBR_DATA && aacDecInfo->fillExtType != EXT_SBR_DATA_CRC) { + return ERR_AAC_NONE; + } + } else { + /* ignore non-SBR blocks */ + return ERR_AAC_NONE; + } + + if (upsampleOnly) { + sbrFreq->kStart = 32; + sbrFreq->numQMFBands = 0; + } + + for (ch = 0; ch < chBlock; ch++) { + sbrGrid = &(psi->sbrGrid[chBase + ch]); + sbrChan = &(psi->sbrChan[chBase + ch]); + + if (aacDecInfo->rawSampleBuf[ch] == 0 || aacDecInfo->rawSampleBytes != 4) { + return ERR_AAC_SBR_PCM_FORMAT; + } + inbuf = (int *)aacDecInfo->rawSampleBuf[ch]; + outptr = outbuf + chBase + ch; + + /* restore delay buffers (could use ring buffer or keep in temp buffer for nChans == 1) */ + for (l = 0; l < HF_GEN; l++) { + for (k = 0; k < 64; k++) { + psi->XBuf[l][k][0] = psi->XBufDelay[chBase + ch][l][k][0]; + psi->XBuf[l][k][1] = psi->XBufDelay[chBase + ch][l][k][1]; + } + } + + /* step 1 - analysis QMF */ + qmfaBands = sbrFreq->kStart; + for (l = 0; l < 32; l++) { + gbMask = QMFAnalysis(inbuf + l * 32, psi->delayQMFA[chBase + ch], psi->XBuf[l + HF_GEN][0], + aacDecInfo->rawSampleFBits, &(psi->delayIdxQMFA[chBase + ch]), qmfaBands); + + gbIdx = ((l + HF_GEN) >> 5) & 0x01; + sbrChan->gbMask[gbIdx] |= gbMask; /* gbIdx = (0 if i < 32), (1 if i >= 32) */ + } + + if (upsampleOnly) { + /* no SBR - just run synthesis QMF to upsample by 2x */ + qmfsBands = 32; + for (l = 0; l < 32; l++) { + /* step 4 - synthesis QMF */ + QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); + outptr += 64 * aacDecInfo->nChans; + } + } else { + /* if previous frame had lower SBR starting freq than current, zero out the synthesized QMF + bands so they aren't used as sources for patching + after patch generation, restore from delay buffer + can only happen after header reset + */ + for (k = sbrFreq->kStartPrev; k < sbrFreq->kStart; k++) { + for (l = 0; l < sbrGrid->envTimeBorder[0] + HF_ADJ; l++) { + psi->XBuf[l][k][0] = 0; + psi->XBuf[l][k][1] = 0; + } + } + + /* step 2 - HF generation */ + GenerateHighFreq(psi, sbrGrid, sbrFreq, sbrChan, ch); + + /* restore SBR bands that were cleared before patch generation (time slots 0, 1 no longer needed) */ + for (k = sbrFreq->kStartPrev; k < sbrFreq->kStart; k++) { + for (l = HF_ADJ; l < sbrGrid->envTimeBorder[0] + HF_ADJ; l++) { + psi->XBuf[l][k][0] = psi->XBufDelay[chBase + ch][l][k][0]; + psi->XBuf[l][k][1] = psi->XBufDelay[chBase + ch][l][k][1]; + } + } + + /* step 3 - HF adjustment */ + AdjustHighFreq(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, ch); + + /* step 4 - synthesis QMF */ + qmfsBands = sbrFreq->kStartPrev + sbrFreq->numQMFBandsPrev; + for (l = 0; l < sbrGrid->envTimeBorder[0]; l++) { + /* if new envelope starts mid-frame, use old settings until start of first envelope in this frame */ + QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); + outptr += 64 * aacDecInfo->nChans; + } + + qmfsBands = sbrFreq->kStart + sbrFreq->numQMFBands; + for (; l < 32; l++) { + /* use new settings for rest of frame (usually the entire frame, unless the first envelope starts mid-frame) */ + QMFSynthesis(psi->XBuf[l + HF_ADJ][0], psi->delayQMFS[chBase + ch], &(psi->delayIdxQMFS[chBase + ch]), qmfsBands, outptr, aacDecInfo->nChans); + outptr += 64 * aacDecInfo->nChans; + } + } + + /* save delay */ + for (l = 0; l < HF_GEN; l++) { + for (k = 0; k < 64; k++) { + psi->XBufDelay[chBase + ch][l][k][0] = psi->XBuf[l + 32][k][0]; + psi->XBufDelay[chBase + ch][l][k][1] = psi->XBuf[l + 32][k][1]; + } + } + sbrChan->gbMask[0] = sbrChan->gbMask[1]; + sbrChan->gbMask[1] = 0; + + if (sbrHdr->count > 0) { + sbrChan->reset = 0; + } + } + sbrFreq->kStartPrev = sbrFreq->kStart; + sbrFreq->numQMFBandsPrev = sbrFreq->numQMFBands; + + if (aacDecInfo->nChans > 0 && (chBase + ch) == aacDecInfo->nChans) { + psi->frameCount++; + } + + return ERR_AAC_NONE; } /************************************************************************************** - * Function: FlushCodecSBR - * - * Description: flush internal SBR codec state (after seeking, for example) - * - * Inputs: valid AACDecInfo struct - * - * Outputs: updated state variables for SBR - * - * Return: 0 if successful, error code (< 0) if error - * - * Notes: SBR is heavily dependent on state from previous frames - * (e.g. delta coded scalefactors, previous envelope boundaries, etc.) - * On flush, we reset everything as if SBR had just been initialized - * for the first time. This triggers "upsample-only" mode until - * the first valid SBR header is received. Then SBR starts as usual. + Function: FlushCodecSBR + + Description: flush internal SBR codec state (after seeking, for example) + + Inputs: valid AACDecInfo struct + + Outputs: updated state variables for SBR + + Return: 0 if successful, error code (< 0) if error + + Notes: SBR is heavily dependent on state from previous frames + (e.g. delta coded scalefactors, previous envelope boundaries, etc.) + On flush, we reset everything as if SBR had just been initialized + for the first time. This triggers "upsample-only" mode until + the first valid SBR header is received. Then SBR starts as usual. **************************************************************************************/ -int FlushCodecSBR(AACDecInfo *aacDecInfo) -{ - PSInfoSBR *psi; +int FlushCodecSBR(AACDecInfo *aacDecInfo) { + PSInfoSBR *psi; - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoSBR) - return ERR_AAC_NULL_POINTER; - psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoSBR) { + return ERR_AAC_NULL_POINTER; + } + psi = (PSInfoSBR *)(aacDecInfo->psInfoSBR); - InitSBRState(psi); + InitSBRState(psi); - return 0; + return 0; } diff --git a/src/libhelix-aac/sbr.h b/src/libhelix-aac/sbr.h index 6c898a13..4c70606b 100644 --- a/src/libhelix-aac/sbr.h +++ b/src/libhelix-aac/sbr.h @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbr.h,v 1.2 2005/05/20 18:05:41 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbr.h,v 1.2 2005/05/20 18:05:41 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbr.h - definitions of platform-specific SBR data structures, functions, and tables + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbr.h - definitions of platform-specific SBR data structures, functions, and tables **************************************************************************************/ #ifndef _SBR_H @@ -147,192 +147,196 @@ } /* -#define CLIP_2N(y, n) { \ + #define CLIP_2N(y, n) { \ int sign = (y) >> 31; \ if (sign != ((y) >> (n))) { \ (y) = sign ^ ((1 << (n)) - 1); \ } \ -} + } */ enum { - SBR_GRID_FIXFIX = 0, - SBR_GRID_FIXVAR = 1, - SBR_GRID_VARFIX = 2, - SBR_GRID_VARVAR = 3 + SBR_GRID_FIXFIX = 0, + SBR_GRID_FIXVAR = 1, + SBR_GRID_VARFIX = 2, + SBR_GRID_VARVAR = 3 }; enum { - HuffTabSBR_tEnv15 = 0, - HuffTabSBR_fEnv15 = 1, - HuffTabSBR_tEnv15b = 2, - HuffTabSBR_fEnv15b = 3, - HuffTabSBR_tEnv30 = 4, - HuffTabSBR_fEnv30 = 5, - HuffTabSBR_tEnv30b = 6, - HuffTabSBR_fEnv30b = 7, - HuffTabSBR_tNoise30 = 8, - HuffTabSBR_fNoise30 = 5, - HuffTabSBR_tNoise30b = 9, - HuffTabSBR_fNoise30b = 7 + HuffTabSBR_tEnv15 = 0, + HuffTabSBR_fEnv15 = 1, + HuffTabSBR_tEnv15b = 2, + HuffTabSBR_fEnv15b = 3, + HuffTabSBR_tEnv30 = 4, + HuffTabSBR_fEnv30 = 5, + HuffTabSBR_tEnv30b = 6, + HuffTabSBR_fEnv30b = 7, + HuffTabSBR_tNoise30 = 8, + HuffTabSBR_fNoise30 = 5, + HuffTabSBR_tNoise30b = 9, + HuffTabSBR_fNoise30b = 7 }; typedef struct _HuffInfo { - int maxBits; /* number of bits in longest codeword */ + int maxBits; /* number of bits in longest codeword */ +#ifdef ESP8266 unsigned /*char*/ int count[MAX_HUFF_BITS]; /* count[i] = number of codes with length i+1 bits */ - int offset; /* offset into symbol table */ +#else + unsigned char count[MAX_HUFF_BITS]; /* count[i] = number of codes with length i+1 bits */ +#endif + int offset; /* offset into symbol table */ } HuffInfo; /* need one SBRHeader per element (SCE/CPE), updated only on new header */ typedef struct _SBRHeader { - int count; - - unsigned char ampRes; - unsigned char startFreq; - unsigned char stopFreq; - unsigned char crossOverBand; - unsigned char resBitsHdr; - unsigned char hdrExtra1; - unsigned char hdrExtra2; - - unsigned char freqScale; - unsigned char alterScale; - unsigned char noiseBands; - - unsigned char limiterBands; - unsigned char limiterGains; - unsigned char interpFreq; - unsigned char smoothMode; + int count; + + unsigned char ampRes; + unsigned char startFreq; + unsigned char stopFreq; + unsigned char crossOverBand; + unsigned char resBitsHdr; + unsigned char hdrExtra1; + unsigned char hdrExtra2; + + unsigned char freqScale; + unsigned char alterScale; + unsigned char noiseBands; + + unsigned char limiterBands; + unsigned char limiterGains; + unsigned char interpFreq; + unsigned char smoothMode; } SBRHeader; /* need one SBRGrid per channel, updated every frame */ typedef struct _SBRGrid { - unsigned char frameClass; - unsigned char ampResFrame; - unsigned char pointer; + unsigned char frameClass; + unsigned char ampResFrame; + unsigned char pointer; - unsigned char numEnv; /* L_E */ - unsigned char envTimeBorder[MAX_NUM_ENV+1]; /* t_E */ - unsigned char freqRes[MAX_NUM_ENV]; /* r */ + unsigned char numEnv; /* L_E */ + unsigned char envTimeBorder[MAX_NUM_ENV + 1]; /* t_E */ + unsigned char freqRes[MAX_NUM_ENV]; /* r */ - unsigned char numNoiseFloors; /* L_Q */ - unsigned char noiseTimeBorder[MAX_NUM_NOISE_FLOORS+1]; /* t_Q */ + unsigned char numNoiseFloors; /* L_Q */ + unsigned char noiseTimeBorder[MAX_NUM_NOISE_FLOORS + 1]; /* t_Q */ - unsigned char numEnvPrev; - unsigned char numNoiseFloorsPrev; - unsigned char freqResPrev; + unsigned char numEnvPrev; + unsigned char numNoiseFloorsPrev; + unsigned char freqResPrev; } SBRGrid; /* need one SBRFreq per element (SCE/CPE/LFE), updated only on header reset */ typedef struct _SBRFreq { - int kStart; /* k_x */ - int nMaster; - int nHigh; - int nLow; - int nLimiter; /* N_l */ - int numQMFBands; /* M */ - int numNoiseFloorBands; /* Nq */ - - int kStartPrev; - int numQMFBandsPrev; - - unsigned char freqMaster[MAX_QMF_BANDS + 1]; /* not necessary to save this after derived tables are generated */ - unsigned char freqHigh[MAX_QMF_BANDS + 1]; - unsigned char freqLow[MAX_QMF_BANDS / 2 + 1]; /* nLow = nHigh - (nHigh >> 1) */ - unsigned char freqNoise[MAX_NUM_NOISE_FLOOR_BANDS+1]; - unsigned char freqLimiter[MAX_QMF_BANDS / 2 + MAX_NUM_PATCHES]; /* max (intermediate) size = nLow + numPatches - 1 */ - - unsigned char numPatches; - unsigned char patchNumSubbands[MAX_NUM_PATCHES + 1]; - unsigned char patchStartSubband[MAX_NUM_PATCHES + 1]; + int kStart; /* k_x */ + int nMaster; + int nHigh; + int nLow; + int nLimiter; /* N_l */ + int numQMFBands; /* M */ + int numNoiseFloorBands; /* Nq */ + + int kStartPrev; + int numQMFBandsPrev; + + unsigned char freqMaster[MAX_QMF_BANDS + 1]; /* not necessary to save this after derived tables are generated */ + unsigned char freqHigh[MAX_QMF_BANDS + 1]; + unsigned char freqLow[MAX_QMF_BANDS / 2 + 1]; /* nLow = nHigh - (nHigh >> 1) */ + unsigned char freqNoise[MAX_NUM_NOISE_FLOOR_BANDS + 1]; + unsigned char freqLimiter[MAX_QMF_BANDS / 2 + MAX_NUM_PATCHES]; /* max (intermediate) size = nLow + numPatches - 1 */ + + unsigned char numPatches; + unsigned char patchNumSubbands[MAX_NUM_PATCHES + 1]; + unsigned char patchStartSubband[MAX_NUM_PATCHES + 1]; } SBRFreq; typedef struct _SBRChan { - int reset; - unsigned char deltaFlagEnv[MAX_NUM_ENV]; - unsigned char deltaFlagNoise[MAX_NUM_NOISE_FLOORS]; - - signed char envDataQuant[MAX_NUM_ENV][MAX_QMF_BANDS]; /* range = [0, 127] */ - signed char noiseDataQuant[MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS]; - - unsigned char invfMode[2][MAX_NUM_NOISE_FLOOR_BANDS]; /* invfMode[0/1][band] = prev/curr */ - int chirpFact[MAX_NUM_NOISE_FLOOR_BANDS]; /* bwArray */ - unsigned char addHarmonicFlag[2]; /* addHarmonicFlag[0/1] = prev/curr */ - unsigned char addHarmonic[2][64]; /* addHarmonic[0/1][band] = prev/curr */ - - int gbMask[2]; /* gbMask[0/1] = XBuf[0-31]/XBuf[32-39] */ - signed char laPrev; - - int noiseTabIndex; - int sinIndex; - int gainNoiseIndex; - int gTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS]; - int qTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS]; + int reset; + unsigned char deltaFlagEnv[MAX_NUM_ENV]; + unsigned char deltaFlagNoise[MAX_NUM_NOISE_FLOORS]; + + signed char envDataQuant[MAX_NUM_ENV][MAX_QMF_BANDS]; /* range = [0, 127] */ + signed char noiseDataQuant[MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS]; + + unsigned char invfMode[2][MAX_NUM_NOISE_FLOOR_BANDS]; /* invfMode[0/1][band] = prev/curr */ + int chirpFact[MAX_NUM_NOISE_FLOOR_BANDS]; /* bwArray */ + unsigned char addHarmonicFlag[2]; /* addHarmonicFlag[0/1] = prev/curr */ + unsigned char addHarmonic[2][64]; /* addHarmonic[0/1][band] = prev/curr */ + + int gbMask[2]; /* gbMask[0/1] = XBuf[0-31]/XBuf[32-39] */ + signed char laPrev; + + int noiseTabIndex; + int sinIndex; + int gainNoiseIndex; + int gTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS]; + int qTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS]; } SBRChan; typedef struct _PSInfoSBR { - /* save for entire file */ - int frameCount; - int sampRateIdx; - - /* state info that must be saved for each channel */ - SBRHeader sbrHdr[AAC_MAX_NCHANS]; - SBRGrid sbrGrid[AAC_MAX_NCHANS]; - SBRFreq sbrFreq[AAC_MAX_NCHANS]; - SBRChan sbrChan[AAC_MAX_NCHANS]; - - /* temp variables, no need to save between blocks */ - unsigned char dataExtra; - unsigned char resBitsData; - unsigned char extendedDataPresent; - int extendedDataSize; - - signed char envDataDequantScale[MAX_NCHANS_ELEM][MAX_NUM_ENV]; - int envDataDequant[MAX_NCHANS_ELEM][MAX_NUM_ENV][MAX_QMF_BANDS]; - int noiseDataDequant[MAX_NCHANS_ELEM][MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS]; - - int eCurr[MAX_QMF_BANDS]; - unsigned char eCurrExp[MAX_QMF_BANDS]; - unsigned char eCurrExpMax; - signed char la; - - int crcCheckWord; - int couplingFlag; - int envBand; - int eOMGainMax; - int gainMax; - int gainMaxFBits; - int noiseFloorBand; - int qp1Inv; - int qqp1Inv; - int sMapped; - int sBand; - int highBand; - - int sumEOrigMapped; - int sumECurrGLim; - int sumSM; - int sumQM; - int gLimBoost[MAX_QMF_BANDS]; - int qmLimBoost[MAX_QMF_BANDS]; - int smBoost[MAX_QMF_BANDS]; - - int smBuf[MAX_QMF_BANDS]; - int qmLimBuf[MAX_QMF_BANDS]; - int gLimBuf[MAX_QMF_BANDS]; - int gLimFbits[MAX_QMF_BANDS]; - - int gFiltLast[MAX_QMF_BANDS]; - int qFiltLast[MAX_QMF_BANDS]; - - /* large buffers */ - int delayIdxQMFA[AAC_MAX_NCHANS]; - int delayQMFA[AAC_MAX_NCHANS][DELAY_SAMPS_QMFA]; - int delayIdxQMFS[AAC_MAX_NCHANS]; - int delayQMFS[AAC_MAX_NCHANS][DELAY_SAMPS_QMFS]; - int XBufDelay[AAC_MAX_NCHANS][HF_GEN][64][2]; - int XBuf[32+8][64][2]; + /* save for entire file */ + int frameCount; + int sampRateIdx; + + /* state info that must be saved for each channel */ + SBRHeader sbrHdr[AAC_MAX_NCHANS]; + SBRGrid sbrGrid[AAC_MAX_NCHANS]; + SBRFreq sbrFreq[AAC_MAX_NCHANS]; + SBRChan sbrChan[AAC_MAX_NCHANS]; + + /* temp variables, no need to save between blocks */ + unsigned char dataExtra; + unsigned char resBitsData; + unsigned char extendedDataPresent; + int extendedDataSize; + + signed char envDataDequantScale[MAX_NCHANS_ELEM][MAX_NUM_ENV]; + int envDataDequant[MAX_NCHANS_ELEM][MAX_NUM_ENV][MAX_QMF_BANDS]; + int noiseDataDequant[MAX_NCHANS_ELEM][MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS]; + + int eCurr[MAX_QMF_BANDS]; + unsigned char eCurrExp[MAX_QMF_BANDS]; + unsigned char eCurrExpMax; + signed char la; + + int crcCheckWord; + int couplingFlag; + int envBand; + int eOMGainMax; + int gainMax; + int gainMaxFBits; + int noiseFloorBand; + int qp1Inv; + int qqp1Inv; + int sMapped; + int sBand; + int highBand; + + int sumEOrigMapped; + int sumECurrGLim; + int sumSM; + int sumQM; + int gLimBoost[MAX_QMF_BANDS]; + int qmLimBoost[MAX_QMF_BANDS]; + int smBoost[MAX_QMF_BANDS]; + + int smBuf[MAX_QMF_BANDS]; + int qmLimBuf[MAX_QMF_BANDS]; + int gLimBuf[MAX_QMF_BANDS]; + int gLimFbits[MAX_QMF_BANDS]; + + int gFiltLast[MAX_QMF_BANDS]; + int qFiltLast[MAX_QMF_BANDS]; + + /* large buffers */ + int delayIdxQMFA[AAC_MAX_NCHANS]; + int delayQMFA[AAC_MAX_NCHANS][DELAY_SAMPS_QMFA]; + int delayIdxQMFS[AAC_MAX_NCHANS]; + int delayQMFS[AAC_MAX_NCHANS][DELAY_SAMPS_QMFS]; + int XBufDelay[AAC_MAX_NCHANS][HF_GEN][64][2]; + int XBuf[32 + 8][64][2]; } PSInfoSBR; @@ -374,9 +378,13 @@ extern const unsigned char k0Tab[NUM_SAMPLE_RATES_SBR][16]; extern const unsigned char k2Tab[NUM_SAMPLE_RATES_SBR][14]; extern const unsigned char goalSBTab[NUM_SAMPLE_RATES_SBR]; extern const HuffInfo huffTabSBRInfo[10]; +#ifdef ESP8266 extern const signed int /*short*/ huffTabSBR[604]; +#else +extern const signed short huffTabSBR[604]; +#endif extern const int log2Tab[65]; -extern const int noiseTab[512*2]; +extern const int noiseTab[512 * 2]; extern const int cTabA[165]; extern const int cTabS[640]; diff --git a/src/libhelix-aac/sbrfft.c b/src/libhelix-aac/sbrfft.c index 23b36ac3..fdd895e9 100644 --- a/src/libhelix-aac/sbrfft.c +++ b/src/libhelix-aac/sbrfft.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrfft.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrfft.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * sbrfft.c - optimized FFT for SBR QMF filters + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + sbrfft.c - optimized FFT for SBR QMF filters **************************************************************************************/ #include "sbr.h" @@ -52,317 +52,313 @@ #define swapcplx(p0,p1) \ t = p0; t1 = *(&(p0)+1); p0 = p1; *(&(p0)+1) = *(&(p1)+1); p1 = t; *(&(p1)+1) = t1 -/* nfft = 32, hard coded since small, fixed size FFT -static const unsigned char bitrevtab32[9] = { +/* nfft = 32, hard coded since small, fixed size FFT + static const unsigned char bitrevtab32[9] = { 0x01, 0x04, 0x03, 0x06, 0x00, 0x02, 0x05, 0x07, 0x00, -}; + }; */ /* twiddle table for radix 4 pass, format = Q31 */ -static const int twidTabOdd32[8*6] = { - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x539eba45, 0xe7821d59, - 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, - 0x539eba45, 0xc4df2862, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x22a2f4f8, 0xc4df2862, - 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, - 0xac6145bb, 0x187de2a7, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, +static const int twidTabOdd32[8 * 6] = { + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x539eba45, 0xe7821d59, + 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, + 0x539eba45, 0xc4df2862, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x22a2f4f8, 0xc4df2862, + 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, + 0xac6145bb, 0x187de2a7, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, }; /************************************************************************************** - * Function: BitReverse32 - * - * Description: Ken's fast in-place bit reverse - * - * Inputs: buffer of 32 complex samples - * - * Outputs: bit-reversed samples in same buffer - * - * Return: none + Function: BitReverse32 + + Description: Ken's fast in-place bit reverse + + Inputs: buffer of 32 complex samples + + Outputs: bit-reversed samples in same buffer + + Return: none **************************************************************************************/ -static void BitReverse32(int *inout) -{ - int t, t1; - - swapcplx(inout[2], inout[32]); - swapcplx(inout[4], inout[16]); - swapcplx(inout[6], inout[48]); - swapcplx(inout[10], inout[40]); - swapcplx(inout[12], inout[24]); - swapcplx(inout[14], inout[56]); - swapcplx(inout[18], inout[36]); - swapcplx(inout[22], inout[52]); - swapcplx(inout[26], inout[44]); - swapcplx(inout[30], inout[60]); - swapcplx(inout[38], inout[50]); - swapcplx(inout[46], inout[58]); +static void BitReverse32(int *inout) { + int t, t1; + + swapcplx(inout[2], inout[32]); + swapcplx(inout[4], inout[16]); + swapcplx(inout[6], inout[48]); + swapcplx(inout[10], inout[40]); + swapcplx(inout[12], inout[24]); + swapcplx(inout[14], inout[56]); + swapcplx(inout[18], inout[36]); + swapcplx(inout[22], inout[52]); + swapcplx(inout[26], inout[44]); + swapcplx(inout[30], inout[60]); + swapcplx(inout[38], inout[50]); + swapcplx(inout[46], inout[58]); } /************************************************************************************** - * Function: R8FirstPass32 - * - * Description: radix-8 trivial pass for decimation-in-time FFT (log2(N) = 5) - * - * Inputs: buffer of (bit-reversed) samples - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: assumes 3 guard bits, gains 1 integer bit - * guard bits out = guard bits in - 3 (if inputs are full scale) - * or guard bits in - 2 (if inputs bounded to +/- sqrt(2)/2) - * see scaling comments in fft.c for base AAC - * should compile with no stack spills on ARM (verify compiled output) - * current instruction count (per pass): 16 LDR, 16 STR, 4 SMULL, 61 ALU + Function: R8FirstPass32 + + Description: radix-8 trivial pass for decimation-in-time FFT (log2(N) = 5) + + Inputs: buffer of (bit-reversed) samples + + Outputs: processed samples in same buffer + + Return: none + + Notes: assumes 3 guard bits, gains 1 integer bit + guard bits out = guard bits in - 3 (if inputs are full scale) + or guard bits in - 2 (if inputs bounded to +/- sqrt(2)/2) + see scaling comments in fft.c for base AAC + should compile with no stack spills on ARM (verify compiled output) + current instruction count (per pass): 16 LDR, 16 STR, 4 SMULL, 61 ALU **************************************************************************************/ -static void R8FirstPass32(int *r0) -{ - int r1, r2, r3, r4, r5, r6, r7; - int r8, r9, r10, r11, r12, r14; - - /* number of passes = fft size / 8 = 32 / 8 = 4 */ - r1 = (32 >> 3); - do { - - r2 = r0[8]; - r3 = r0[9]; - r4 = r0[10]; - r5 = r0[11]; - r6 = r0[12]; - r7 = r0[13]; - r8 = r0[14]; - r9 = r0[15]; - - r10 = r2 + r4; - r11 = r3 + r5; - r12 = r6 + r8; - r14 = r7 + r9; - - r2 -= r4; - r3 -= r5; - r6 -= r8; - r7 -= r9; - - r4 = r2 - r7; - r5 = r2 + r7; - r8 = r3 - r6; - r9 = r3 + r6; - - r2 = r4 - r9; - r3 = r4 + r9; - r6 = r5 - r8; - r7 = r5 + r8; - - r2 = MULSHIFT32(SQRT1_2, r2); /* can use r4, r5, r8, or r9 for constant and lo32 scratch reg */ - r3 = MULSHIFT32(SQRT1_2, r3); - r6 = MULSHIFT32(SQRT1_2, r6); - r7 = MULSHIFT32(SQRT1_2, r7); - - r4 = r10 + r12; - r5 = r10 - r12; - r8 = r11 + r14; - r9 = r11 - r14; - - r10 = r0[0]; - r11 = r0[2]; - r12 = r0[4]; - r14 = r0[6]; - - r10 += r11; - r12 += r14; - - r4 >>= 1; - r10 += r12; - r4 += (r10 >> 1); - r0[ 0] = r4; - r4 -= (r10 >> 1); - r4 = (r10 >> 1) - r4; - r0[ 8] = r4; - - r9 >>= 1; - r10 -= 2*r12; - r4 = (r10 >> 1) + r9; - r0[ 4] = r4; - r4 = (r10 >> 1) - r9; - r0[12] = r4; - r10 += r12; - - r10 -= 2*r11; - r12 -= 2*r14; - - r4 = r0[1]; - r9 = r0[3]; - r11 = r0[5]; - r14 = r0[7]; - - r4 += r9; - r11 += r14; - - r8 >>= 1; - r4 += r11; - r8 += (r4 >> 1); - r0[ 1] = r8; - r8 -= (r4 >> 1); - r8 = (r4 >> 1) - r8; - r0[ 9] = r8; - - r5 >>= 1; - r4 -= 2*r11; - r8 = (r4 >> 1) - r5; - r0[ 5] = r8; - r8 = (r4 >> 1) + r5; - r0[13] = r8; - r4 += r11; - - r4 -= 2*r9; - r11 -= 2*r14; - - r9 = r10 - r11; - r10 += r11; - r14 = r4 + r12; - r4 -= r12; - - r5 = (r10 >> 1) + r7; - r8 = (r4 >> 1) - r6; - r0[ 2] = r5; - r0[ 3] = r8; - - r5 = (r9 >> 1) - r2; - r8 = (r14 >> 1) - r3; - r0[ 6] = r5; - r0[ 7] = r8; - - r5 = (r10 >> 1) - r7; - r8 = (r4 >> 1) + r6; - r0[10] = r5; - r0[11] = r8; - - r5 = (r9 >> 1) + r2; - r8 = (r14 >> 1) + r3; - r0[14] = r5; - r0[15] = r8; - - r0 += 16; - r1--; - } while (r1 != 0); +static void R8FirstPass32(int *r0) { + int r1, r2, r3, r4, r5, r6, r7; + int r8, r9, r10, r11, r12, r14; + + /* number of passes = fft size / 8 = 32 / 8 = 4 */ + r1 = (32 >> 3); + do { + + r2 = r0[8]; + r3 = r0[9]; + r4 = r0[10]; + r5 = r0[11]; + r6 = r0[12]; + r7 = r0[13]; + r8 = r0[14]; + r9 = r0[15]; + + r10 = r2 + r4; + r11 = r3 + r5; + r12 = r6 + r8; + r14 = r7 + r9; + + r2 -= r4; + r3 -= r5; + r6 -= r8; + r7 -= r9; + + r4 = r2 - r7; + r5 = r2 + r7; + r8 = r3 - r6; + r9 = r3 + r6; + + r2 = r4 - r9; + r3 = r4 + r9; + r6 = r5 - r8; + r7 = r5 + r8; + + r2 = MULSHIFT32(SQRT1_2, r2); /* can use r4, r5, r8, or r9 for constant and lo32 scratch reg */ + r3 = MULSHIFT32(SQRT1_2, r3); + r6 = MULSHIFT32(SQRT1_2, r6); + r7 = MULSHIFT32(SQRT1_2, r7); + + r4 = r10 + r12; + r5 = r10 - r12; + r8 = r11 + r14; + r9 = r11 - r14; + + r10 = r0[0]; + r11 = r0[2]; + r12 = r0[4]; + r14 = r0[6]; + + r10 += r11; + r12 += r14; + + r4 >>= 1; + r10 += r12; + r4 += (r10 >> 1); + r0[ 0] = r4; + r4 -= (r10 >> 1); + r4 = (r10 >> 1) - r4; + r0[ 8] = r4; + + r9 >>= 1; + r10 -= 2 * r12; + r4 = (r10 >> 1) + r9; + r0[ 4] = r4; + r4 = (r10 >> 1) - r9; + r0[12] = r4; + r10 += r12; + + r10 -= 2 * r11; + r12 -= 2 * r14; + + r4 = r0[1]; + r9 = r0[3]; + r11 = r0[5]; + r14 = r0[7]; + + r4 += r9; + r11 += r14; + + r8 >>= 1; + r4 += r11; + r8 += (r4 >> 1); + r0[ 1] = r8; + r8 -= (r4 >> 1); + r8 = (r4 >> 1) - r8; + r0[ 9] = r8; + + r5 >>= 1; + r4 -= 2 * r11; + r8 = (r4 >> 1) - r5; + r0[ 5] = r8; + r8 = (r4 >> 1) + r5; + r0[13] = r8; + r4 += r11; + + r4 -= 2 * r9; + r11 -= 2 * r14; + + r9 = r10 - r11; + r10 += r11; + r14 = r4 + r12; + r4 -= r12; + + r5 = (r10 >> 1) + r7; + r8 = (r4 >> 1) - r6; + r0[ 2] = r5; + r0[ 3] = r8; + + r5 = (r9 >> 1) - r2; + r8 = (r14 >> 1) - r3; + r0[ 6] = r5; + r0[ 7] = r8; + + r5 = (r10 >> 1) - r7; + r8 = (r4 >> 1) + r6; + r0[10] = r5; + r0[11] = r8; + + r5 = (r9 >> 1) + r2; + r8 = (r14 >> 1) + r3; + r0[14] = r5; + r0[15] = r8; + + r0 += 16; + r1--; + } while (r1 != 0); } /************************************************************************************** - * Function: R4Core32 - * - * Description: radix-4 pass for 32-point decimation-in-time FFT - * - * Inputs: buffer of samples - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: gain 2 integer bits - * guard bits out = guard bits in - 1 (if inputs are full scale) - * see scaling comments in fft.c for base AAC - * uses 3-mul, 3-add butterflies instead of 4-mul, 2-add - * should compile with no stack spills on ARM (verify compiled output) - * current instruction count (per pass): 16 LDR, 16 STR, 4 SMULL, 61 ALU + Function: R4Core32 + + Description: radix-4 pass for 32-point decimation-in-time FFT + + Inputs: buffer of samples + + Outputs: processed samples in same buffer + + Return: none + + Notes: gain 2 integer bits + guard bits out = guard bits in - 1 (if inputs are full scale) + see scaling comments in fft.c for base AAC + uses 3-mul, 3-add butterflies instead of 4-mul, 2-add + should compile with no stack spills on ARM (verify compiled output) + current instruction count (per pass): 16 LDR, 16 STR, 4 SMULL, 61 ALU **************************************************************************************/ -static void R4Core32(int *r0) -{ - int r2, r3, r4, r5, r6, r7; - int r8, r9, r10, r12, r14; - int *r1; - - r1 = (int *)twidTabOdd32; - r10 = 8; - do { - /* can use r14 for lo32 scratch register in all MULSHIFT32 */ - r2 = r1[0]; - r3 = r1[1]; - r4 = r0[16]; - r5 = r0[17]; - r12 = r4 + r5; - r12 = MULSHIFT32(r3, r12); - r5 = MULSHIFT32(r2, r5) + r12; - r2 += 2*r3; - r4 = MULSHIFT32(r2, r4) - r12; - - r2 = r1[2]; - r3 = r1[3]; - r6 = r0[32]; - r7 = r0[33]; - r12 = r6 + r7; - r12 = MULSHIFT32(r3, r12); - r7 = MULSHIFT32(r2, r7) + r12; - r2 += 2*r3; - r6 = MULSHIFT32(r2, r6) - r12; - - r2 = r1[4]; - r3 = r1[5]; - r8 = r0[48]; - r9 = r0[49]; - r12 = r8 + r9; - r12 = MULSHIFT32(r3, r12); - r9 = MULSHIFT32(r2, r9) + r12; - r2 += 2*r3; - r8 = MULSHIFT32(r2, r8) - r12; - - r2 = r0[0]; - r3 = r0[1]; - - r12 = r6 + r8; - r8 = r6 - r8; - r14 = r9 - r7; - r9 = r9 + r7; - - r6 = (r2 >> 2) - r4; - r7 = (r3 >> 2) - r5; - r4 += (r2 >> 2); - r5 += (r3 >> 2); - - r2 = r4 + r12; - r3 = r5 + r9; - r0[0] = r2; - r0[1] = r3; - r2 = r6 - r14; - r3 = r7 - r8; - r0[16] = r2; - r0[17] = r3; - r2 = r4 - r12; - r3 = r5 - r9; - r0[32] = r2; - r0[33] = r3; - r2 = r6 + r14; - r3 = r7 + r8; - r0[48] = r2; - r0[49] = r3; - - r0 += 2; - r1 += 6; - r10--; - } while (r10 != 0); +static void R4Core32(int *r0) { + int r2, r3, r4, r5, r6, r7; + int r8, r9, r10, r12, r14; + int *r1; + + r1 = (int *)twidTabOdd32; + r10 = 8; + do { + /* can use r14 for lo32 scratch register in all MULSHIFT32 */ + r2 = r1[0]; + r3 = r1[1]; + r4 = r0[16]; + r5 = r0[17]; + r12 = r4 + r5; + r12 = MULSHIFT32(r3, r12); + r5 = MULSHIFT32(r2, r5) + r12; + r2 += 2 * r3; + r4 = MULSHIFT32(r2, r4) - r12; + + r2 = r1[2]; + r3 = r1[3]; + r6 = r0[32]; + r7 = r0[33]; + r12 = r6 + r7; + r12 = MULSHIFT32(r3, r12); + r7 = MULSHIFT32(r2, r7) + r12; + r2 += 2 * r3; + r6 = MULSHIFT32(r2, r6) - r12; + + r2 = r1[4]; + r3 = r1[5]; + r8 = r0[48]; + r9 = r0[49]; + r12 = r8 + r9; + r12 = MULSHIFT32(r3, r12); + r9 = MULSHIFT32(r2, r9) + r12; + r2 += 2 * r3; + r8 = MULSHIFT32(r2, r8) - r12; + + r2 = r0[0]; + r3 = r0[1]; + + r12 = r6 + r8; + r8 = r6 - r8; + r14 = r9 - r7; + r9 = r9 + r7; + + r6 = (r2 >> 2) - r4; + r7 = (r3 >> 2) - r5; + r4 += (r2 >> 2); + r5 += (r3 >> 2); + + r2 = r4 + r12; + r3 = r5 + r9; + r0[0] = r2; + r0[1] = r3; + r2 = r6 - r14; + r3 = r7 - r8; + r0[16] = r2; + r0[17] = r3; + r2 = r4 - r12; + r3 = r5 - r9; + r0[32] = r2; + r0[33] = r3; + r2 = r6 + r14; + r3 = r7 + r8; + r0[48] = r2; + r0[49] = r3; + + r0 += 2; + r1 += 6; + r10--; + } while (r10 != 0); } /************************************************************************************** - * Function: FFT32C - * - * Description: Ken's very fast in-place radix-4 decimation-in-time FFT - * - * Inputs: buffer of 32 complex samples (before bit-reversal) - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: assumes 3 guard bits in, gains 3 integer bits - * guard bits out = guard bits in - 2 - * (guard bit analysis includes assumptions about steps immediately - * before and after, i.e. PreMul and PostMul for DCT) + Function: FFT32C + + Description: Ken's very fast in-place radix-4 decimation-in-time FFT + + Inputs: buffer of 32 complex samples (before bit-reversal) + + Outputs: processed samples in same buffer + + Return: none + + Notes: assumes 3 guard bits in, gains 3 integer bits + guard bits out = guard bits in - 2 + (guard bit analysis includes assumptions about steps immediately + before and after, i.e. PreMul and PostMul for DCT) **************************************************************************************/ -void FFT32C(int *x) -{ - /* decimation in time */ - BitReverse32(x); - - /* 32-point complex FFT */ - R8FirstPass32(x); /* gain 1 int bit, lose 2 GB (making assumptions about input) */ - R4Core32(x); /* gain 2 int bits, lose 0 GB (making assumptions about input) */ +void FFT32C(int *x) { + /* decimation in time */ + BitReverse32(x); + + /* 32-point complex FFT */ + R8FirstPass32(x); /* gain 1 int bit, lose 2 GB (making assumptions about input) */ + R4Core32(x); /* gain 2 int bits, lose 0 GB (making assumptions about input) */ } diff --git a/src/libhelix-aac/sbrfreq.c b/src/libhelix-aac/sbrfreq.c index 26a76063..7aa187ce 100644 --- a/src/libhelix-aac/sbrfreq.c +++ b/src/libhelix-aac/sbrfreq.c @@ -1,188 +1,189 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrfreq.c,v 1.2 2005/05/20 18:05:41 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrfreq.c,v 1.2 2005/05/20 18:05:41 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrfreq.c - frequency band table calculation for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrfreq.c - frequency band table calculation for SBR **************************************************************************************/ #include "sbr.h" #include "assembly.h" /************************************************************************************** - * Function: BubbleSort - * - * Description: in-place sort of unsigned chars - * - * Inputs: buffer of elements to sort - * number of elements to sort - * - * Outputs: sorted buffer - * - * Return: none + Function: BubbleSort + + Description: in-place sort of unsigned chars + + Inputs: buffer of elements to sort + number of elements to sort + + Outputs: sorted buffer + + Return: none **************************************************************************************/ -static void BubbleSort(unsigned char *v, int nItems) -{ - int i; - unsigned char t; - - while (nItems >= 2) { - for (i = 0; i < nItems-1; i++) { - if (v[i+1] < v[i]) { - t = v[i+1]; - v[i+1] = v[i]; - v[i] = t; - } - } - nItems--; - } +static void BubbleSort(unsigned char *v, int nItems) { + int i; + unsigned char t; + + while (nItems >= 2) { + for (i = 0; i < nItems - 1; i++) { + if (v[i + 1] < v[i]) { + t = v[i + 1]; + v[i + 1] = v[i]; + v[i] = t; + } + } + nItems--; + } } /************************************************************************************** - * Function: VMin - * - * Description: find smallest element in a buffer of unsigned chars - * - * Inputs: buffer of elements to search - * number of elements to search - * - * Outputs: none - * - * Return: smallest element in buffer + Function: VMin + + Description: find smallest element in a buffer of unsigned chars + + Inputs: buffer of elements to search + number of elements to search + + Outputs: none + + Return: smallest element in buffer **************************************************************************************/ -static unsigned char VMin(unsigned char *v, int nItems) -{ - int i; - unsigned char vMin; - - vMin = v[0]; - for (i = 1; i < nItems; i++) { - if (v[i] < vMin) - vMin = v[i]; - } - return vMin; +static unsigned char VMin(unsigned char *v, int nItems) { + int i; + unsigned char vMin; + + vMin = v[0]; + for (i = 1; i < nItems; i++) { + if (v[i] < vMin) { + vMin = v[i]; + } + } + return vMin; } /************************************************************************************** - * Function: VMax - * - * Description: find largest element in a buffer of unsigned chars - * - * Inputs: buffer of elements to search - * number of elements to search - * - * Outputs: none - * - * Return: largest element in buffer + Function: VMax + + Description: find largest element in a buffer of unsigned chars + + Inputs: buffer of elements to search + number of elements to search + + Outputs: none + + Return: largest element in buffer **************************************************************************************/ -static unsigned char VMax(unsigned char *v, int nItems) -{ - int i; - unsigned char vMax; - - vMax = v[0]; - for (i = 1; i < nItems; i++) { - if (v[i] > vMax) - vMax = v[i]; - } - return vMax; +static unsigned char VMax(unsigned char *v, int nItems) { + int i; + unsigned char vMax; + + vMax = v[0]; + for (i = 1; i < nItems; i++) { + if (v[i] > vMax) { + vMax = v[i]; + } + } + return vMax; } /************************************************************************************** - * Function: CalcFreqMasterScaleZero - * - * Description: calculate master frequency table when freqScale == 0 - * (4.6.18.3.2.1, figure 4.39) - * - * Inputs: alterScale flag - * index of first QMF subband in master freq table (k0) - * index of last QMF subband (k2) - * - * Outputs: master frequency table - * - * Return: number of bands in master frequency table - * - * Notes: assumes k2 - k0 <= 48 and k2 >= k0 (4.6.18.3.6) + Function: CalcFreqMasterScaleZero + + Description: calculate master frequency table when freqScale == 0 + (4.6.18.3.2.1, figure 4.39) + + Inputs: alterScale flag + index of first QMF subband in master freq table (k0) + index of last QMF subband (k2) + + Outputs: master frequency table + + Return: number of bands in master frequency table + + Notes: assumes k2 - k0 <= 48 and k2 >= k0 (4.6.18.3.6) **************************************************************************************/ -static int CalcFreqMasterScaleZero(unsigned char *freqMaster, int alterScale, int k0, int k2) -{ - int nMaster, k, nBands, k2Achieved, dk, vDk[64], k2Diff; - - if (alterScale) { - dk = 2; - nBands = 2 * ((k2 - k0 + 2) >> 2); - } else { - dk = 1; - nBands = 2 * ((k2 - k0) >> 1); - } - - if (nBands <= 0) - return 0; - - k2Achieved = k0 + nBands * dk; - k2Diff = k2 - k2Achieved; - for (k = 0; k < nBands; k++) - vDk[k] = dk; - - if (k2Diff > 0) { - k = nBands - 1; - while (k2Diff) { - vDk[k]++; - k--; - k2Diff--; - } - } else if (k2Diff < 0) { - k = 0; - while (k2Diff) { - vDk[k]--; - k++; - k2Diff++; - } - } - - nMaster = nBands; - freqMaster[0] = k0; - for (k = 1; k <= nBands; k++) - freqMaster[k] = freqMaster[k-1] + vDk[k-1]; - - return nMaster; +static int CalcFreqMasterScaleZero(unsigned char *freqMaster, int alterScale, int k0, int k2) { + int nMaster, k, nBands, k2Achieved, dk, vDk[64], k2Diff; + + if (alterScale) { + dk = 2; + nBands = 2 * ((k2 - k0 + 2) >> 2); + } else { + dk = 1; + nBands = 2 * ((k2 - k0) >> 1); + } + + if (nBands <= 0) { + return 0; + } + + k2Achieved = k0 + nBands * dk; + k2Diff = k2 - k2Achieved; + for (k = 0; k < nBands; k++) { + vDk[k] = dk; + } + + if (k2Diff > 0) { + k = nBands - 1; + while (k2Diff) { + vDk[k]++; + k--; + k2Diff--; + } + } else if (k2Diff < 0) { + k = 0; + while (k2Diff) { + vDk[k]--; + k++; + k2Diff++; + } + } + + nMaster = nBands; + freqMaster[0] = k0; + for (k = 1; k <= nBands; k++) { + freqMaster[k] = freqMaster[k - 1] + vDk[k - 1]; + } + + return nMaster; } /* mBandTab[i] = temp1[i] / 2 */ @@ -192,450 +193,462 @@ static const int mBandTab[3] PROGMEM = {6, 5, 4}; static const int invWarpTab[2] PROGMEM = {0x40000000, 0x313b13b1}; /************************************************************************************** - * Function: CalcFreqMasterScale - * - * Description: calculate master frequency table when freqScale > 0 - * (4.6.18.3.2.1, figure 4.39) - * - * Inputs: alterScale flag - * freqScale flag - * index of first QMF subband in master freq table (k0) - * index of last QMF subband (k2) - * - * Outputs: master frequency table - * - * Return: number of bands in master frequency table - * - * Notes: assumes k2 - k0 <= 48 and k2 >= k0 (4.6.18.3.6) + Function: CalcFreqMasterScale + + Description: calculate master frequency table when freqScale > 0 + (4.6.18.3.2.1, figure 4.39) + + Inputs: alterScale flag + freqScale flag + index of first QMF subband in master freq table (k0) + index of last QMF subband (k2) + + Outputs: master frequency table + + Return: number of bands in master frequency table + + Notes: assumes k2 - k0 <= 48 and k2 >= k0 (4.6.18.3.6) **************************************************************************************/ -static int CalcFreqMaster(unsigned char *freqMaster, int freqScale, int alterScale, int k0, int k2) -{ - int bands, twoRegions, k, k1, t, vLast, vCurr, pCurr; - int invWarp, nBands0, nBands1, change; - unsigned char vDk1Min, vDk0Max; - unsigned char *vDelta; - - if (freqScale < 1 || freqScale > 3) - return -1; - - bands = mBandTab[freqScale - 1]; - invWarp = invWarpTab[alterScale]; - - /* tested for all k0 = [5, 64], k2 = [k0, 64] */ - if (k2*10000 > 22449*k0) { - twoRegions = 1; - k1 = 2*k0; - } else { - twoRegions = 0; - k1 = k2; - } - - /* tested for all k0 = [5, 64], k1 = [k0, 64], freqScale = [1,3] */ - t = (log2Tab[k1] - log2Tab[k0]) >> 3; /* log2(k1/k0), Q28 to Q25 */ - nBands0 = 2 * (((bands * t) + (1 << 24)) >> 25); /* multiply by bands/2, round to nearest int (mBandTab has factor of 1/2 rolled in) */ - - /* tested for all valid combinations of k0, k1, nBands (from sampRate, freqScale, alterScale) - * roundoff error can be a problem with fixpt (e.g. pCurr = 12.499999 instead of 12.50003) - * because successive multiplication always undershoots a little bit, but this - * doesn't occur in any of the ratios we encounter from the valid k0/k1 bands in the spec - */ - t = RatioPowInv(k1, k0, nBands0); - pCurr = k0 << 24; - vLast = k0; - vDelta = freqMaster + 1; /* operate in-place */ - for (k = 0; k < nBands0; k++) { - pCurr = MULSHIFT32(pCurr, t) << 8; /* keep in Q24 */ - vCurr = (pCurr + (1 << 23)) >> 24; - vDelta[k] = (vCurr - vLast); - vLast = vCurr; - } - - /* sort the deltas and find max delta for first region */ - BubbleSort(vDelta, nBands0); - vDk0Max = VMax(vDelta, nBands0); - - /* fill master frequency table with bands from first region */ - freqMaster[0] = k0; - for (k = 1; k <= nBands0; k++) - freqMaster[k] += freqMaster[k-1]; - - /* if only one region, then the table is complete */ - if (!twoRegions) - return nBands0; - - /* tested for all k1 = [10, 64], k2 = [k0, 64], freqScale = [1,3] */ - t = (log2Tab[k2] - log2Tab[k1]) >> 3; /* log2(k1/k0), Q28 to Q25 */ - t = MULSHIFT32(bands * t, invWarp) << 2; /* multiply by bands/2, divide by warp factor, keep Q25 */ - nBands1 = 2 * ((t + (1 << 24)) >> 25); /* round to nearest int */ - - /* see comments above for calculations in first region */ - t = RatioPowInv(k2, k1, nBands1); - pCurr = k1 << 24; - vLast = k1; - vDelta = freqMaster + nBands0 + 1; /* operate in-place */ - for (k = 0; k < nBands1; k++) { - pCurr = MULSHIFT32(pCurr, t) << 8; /* keep in Q24 */ - vCurr = (pCurr + (1 << 23)) >> 24; - vDelta[k] = (vCurr - vLast); - vLast = vCurr; - } - - /* sort the deltas, adjusting first and last if the second region has smaller deltas than the first */ - vDk1Min = VMin(vDelta, nBands1); - if (vDk1Min < vDk0Max) { - BubbleSort(vDelta, nBands1); - change = vDk0Max - vDelta[0]; - if (change > ((vDelta[nBands1 - 1] - vDelta[0]) >> 1)) - change = ((vDelta[nBands1 - 1] - vDelta[0]) >> 1); - vDelta[0] += change; - vDelta[nBands1-1] -= change; - } - BubbleSort(vDelta, nBands1); - - /* fill master frequency table with bands from second region - * Note: freqMaster[nBands0] = k1 - */ - for (k = 1; k <= nBands1; k++) - freqMaster[k + nBands0] += freqMaster[k + nBands0 - 1]; - - return (nBands0 + nBands1); +static int CalcFreqMaster(unsigned char *freqMaster, int freqScale, int alterScale, int k0, int k2) { + int bands, twoRegions, k, k1, t, vLast, vCurr, pCurr; + int invWarp, nBands0, nBands1, change; + unsigned char vDk1Min, vDk0Max; + unsigned char *vDelta; + + if (freqScale < 1 || freqScale > 3) { + return -1; + } + + bands = mBandTab[freqScale - 1]; + invWarp = invWarpTab[alterScale]; + + /* tested for all k0 = [5, 64], k2 = [k0, 64] */ + if (k2 * 10000 > 22449 * k0) { + twoRegions = 1; + k1 = 2 * k0; + } else { + twoRegions = 0; + k1 = k2; + } + + /* tested for all k0 = [5, 64], k1 = [k0, 64], freqScale = [1,3] */ + t = (log2Tab[k1] - log2Tab[k0]) >> 3; /* log2(k1/k0), Q28 to Q25 */ + nBands0 = 2 * (((bands * t) + (1 << 24)) >> 25); /* multiply by bands/2, round to nearest int (mBandTab has factor of 1/2 rolled in) */ + + /* tested for all valid combinations of k0, k1, nBands (from sampRate, freqScale, alterScale) + roundoff error can be a problem with fixpt (e.g. pCurr = 12.499999 instead of 12.50003) + because successive multiplication always undershoots a little bit, but this + doesn't occur in any of the ratios we encounter from the valid k0/k1 bands in the spec + */ + t = RatioPowInv(k1, k0, nBands0); + pCurr = k0 << 24; + vLast = k0; + vDelta = freqMaster + 1; /* operate in-place */ + for (k = 0; k < nBands0; k++) { + pCurr = MULSHIFT32(pCurr, t) << 8; /* keep in Q24 */ + vCurr = (pCurr + (1 << 23)) >> 24; + vDelta[k] = (vCurr - vLast); + vLast = vCurr; + } + + /* sort the deltas and find max delta for first region */ + BubbleSort(vDelta, nBands0); + vDk0Max = VMax(vDelta, nBands0); + + /* fill master frequency table with bands from first region */ + freqMaster[0] = k0; + for (k = 1; k <= nBands0; k++) { + freqMaster[k] += freqMaster[k - 1]; + } + + /* if only one region, then the table is complete */ + if (!twoRegions) { + return nBands0; + } + + /* tested for all k1 = [10, 64], k2 = [k0, 64], freqScale = [1,3] */ + t = (log2Tab[k2] - log2Tab[k1]) >> 3; /* log2(k1/k0), Q28 to Q25 */ + t = MULSHIFT32(bands * t, invWarp) << 2; /* multiply by bands/2, divide by warp factor, keep Q25 */ + nBands1 = 2 * ((t + (1 << 24)) >> 25); /* round to nearest int */ + + /* see comments above for calculations in first region */ + t = RatioPowInv(k2, k1, nBands1); + pCurr = k1 << 24; + vLast = k1; + vDelta = freqMaster + nBands0 + 1; /* operate in-place */ + for (k = 0; k < nBands1; k++) { + pCurr = MULSHIFT32(pCurr, t) << 8; /* keep in Q24 */ + vCurr = (pCurr + (1 << 23)) >> 24; + vDelta[k] = (vCurr - vLast); + vLast = vCurr; + } + + /* sort the deltas, adjusting first and last if the second region has smaller deltas than the first */ + vDk1Min = VMin(vDelta, nBands1); + if (vDk1Min < vDk0Max) { + BubbleSort(vDelta, nBands1); + change = vDk0Max - vDelta[0]; + if (change > ((vDelta[nBands1 - 1] - vDelta[0]) >> 1)) { + change = ((vDelta[nBands1 - 1] - vDelta[0]) >> 1); + } + vDelta[0] += change; + vDelta[nBands1 - 1] -= change; + } + BubbleSort(vDelta, nBands1); + + /* fill master frequency table with bands from second region + Note: freqMaster[nBands0] = k1 + */ + for (k = 1; k <= nBands1; k++) { + freqMaster[k + nBands0] += freqMaster[k + nBands0 - 1]; + } + + return (nBands0 + nBands1); } /************************************************************************************** - * Function: CalcFreqHigh - * - * Description: calculate high resolution frequency table (4.6.18.3.2.2) - * - * Inputs: master frequency table - * number of bands in master frequency table - * crossover band from header - * - * Outputs: high resolution frequency table - * - * Return: number of bands in high resolution frequency table + Function: CalcFreqHigh + + Description: calculate high resolution frequency table (4.6.18.3.2.2) + + Inputs: master frequency table + number of bands in master frequency table + crossover band from header + + Outputs: high resolution frequency table + + Return: number of bands in high resolution frequency table **************************************************************************************/ -static int CalcFreqHigh(unsigned char *freqHigh, unsigned char *freqMaster, int nMaster, int crossOverBand) -{ - int k, nHigh; +static int CalcFreqHigh(unsigned char *freqHigh, unsigned char *freqMaster, int nMaster, int crossOverBand) { + int k, nHigh; + + nHigh = nMaster - crossOverBand; - nHigh = nMaster - crossOverBand; + for (k = 0; k <= nHigh; k++) { + freqHigh[k] = freqMaster[k + crossOverBand]; + } - for (k = 0; k <= nHigh; k++) - freqHigh[k] = freqMaster[k + crossOverBand]; - - return nHigh; + return nHigh; } /************************************************************************************** - * Function: CalcFreqLow - * - * Description: calculate low resolution frequency table (4.6.18.3.2.2) - * - * Inputs: high resolution frequency table - * number of bands in high resolution frequency table - * - * Outputs: low resolution frequency table - * - * Return: number of bands in low resolution frequency table + Function: CalcFreqLow + + Description: calculate low resolution frequency table (4.6.18.3.2.2) + + Inputs: high resolution frequency table + number of bands in high resolution frequency table + + Outputs: low resolution frequency table + + Return: number of bands in low resolution frequency table **************************************************************************************/ -static int CalcFreqLow(unsigned char *freqLow, unsigned char *freqHigh, int nHigh) -{ - int k, nLow, oddFlag; +static int CalcFreqLow(unsigned char *freqLow, unsigned char *freqHigh, int nHigh) { + int k, nLow, oddFlag; - nLow = nHigh - (nHigh >> 1); - freqLow[0] = freqHigh[0]; - oddFlag = nHigh & 0x01; + nLow = nHigh - (nHigh >> 1); + freqLow[0] = freqHigh[0]; + oddFlag = nHigh & 0x01; - for (k = 1; k <= nLow; k++) - freqLow[k] = freqHigh[2*k - oddFlag]; + for (k = 1; k <= nLow; k++) { + freqLow[k] = freqHigh[2 * k - oddFlag]; + } - return nLow; + return nLow; } /************************************************************************************** - * Function: CalcFreqNoise - * - * Description: calculate noise floor frequency table (4.6.18.3.2.2) - * - * Inputs: low resolution frequency table - * number of bands in low resolution frequency table - * index of starting QMF subband for SBR (kStart) - * index of last QMF subband (k2) - * number of noise bands - * - * Outputs: noise floor frequency table - * - * Return: number of bands in noise floor frequency table + Function: CalcFreqNoise + + Description: calculate noise floor frequency table (4.6.18.3.2.2) + + Inputs: low resolution frequency table + number of bands in low resolution frequency table + index of starting QMF subband for SBR (kStart) + index of last QMF subband (k2) + number of noise bands + + Outputs: noise floor frequency table + + Return: number of bands in noise floor frequency table **************************************************************************************/ -static int CalcFreqNoise(unsigned char *freqNoise, unsigned char *freqLow, int nLow, int kStart, int k2, int noiseBands) -{ - int i, iLast, k, nQ, lTop, lBottom; - - lTop = log2Tab[k2]; - lBottom = log2Tab[kStart]; - nQ = noiseBands*((lTop - lBottom) >> 2); /* Q28 to Q26, noiseBands = [0,3] */ - nQ = (nQ + (1 << 25)) >> 26; - if (nQ < 1) - nQ = 1; - - ASSERT(nQ <= MAX_NUM_NOISE_FLOOR_BANDS); /* required from 4.6.18.3.6 */ - - iLast = 0; - freqNoise[0] = freqLow[0]; - for (k = 1; k <= nQ; k++) { - i = iLast + (nLow - iLast) / (nQ + 1 - k); /* truncating division */ - freqNoise[k] = freqLow[i]; - iLast = i; - } - - return nQ; +static int CalcFreqNoise(unsigned char *freqNoise, unsigned char *freqLow, int nLow, int kStart, int k2, int noiseBands) { + int i, iLast, k, nQ, lTop, lBottom; + + lTop = log2Tab[k2]; + lBottom = log2Tab[kStart]; + nQ = noiseBands * ((lTop - lBottom) >> 2); /* Q28 to Q26, noiseBands = [0,3] */ + nQ = (nQ + (1 << 25)) >> 26; + if (nQ < 1) { + nQ = 1; + } + + ASSERT(nQ <= MAX_NUM_NOISE_FLOOR_BANDS); /* required from 4.6.18.3.6 */ + + iLast = 0; + freqNoise[0] = freqLow[0]; + for (k = 1; k <= nQ; k++) { + i = iLast + (nLow - iLast) / (nQ + 1 - k); /* truncating division */ + freqNoise[k] = freqLow[i]; + iLast = i; + } + + return nQ; } /************************************************************************************** - * Function: BuildPatches - * - * Description: build high frequency patches (4.6.18.6.3) - * - * Inputs: master frequency table - * number of bands in low resolution frequency table - * index of first QMF subband in master freq table (k0) - * index of starting QMF subband for SBR (kStart) - * number of QMF bands in high resolution frequency table - * sample rate index - * - * Outputs: starting subband for each patch - * number of subbands in each patch - * - * Return: number of patches + Function: BuildPatches + + Description: build high frequency patches (4.6.18.6.3) + + Inputs: master frequency table + number of bands in low resolution frequency table + index of first QMF subband in master freq table (k0) + index of starting QMF subband for SBR (kStart) + number of QMF bands in high resolution frequency table + sample rate index + + Outputs: starting subband for each patch + number of subbands in each patch + + Return: number of patches **************************************************************************************/ -static int BuildPatches(unsigned char *patchNumSubbands, unsigned char *patchStartSubband, unsigned char *freqMaster, - int nMaster, int k0, int kStart, int numQMFBands, int sampRateIdx) -{ - int i, j, k; - int msb, sb, usb, numPatches, goalSB, oddFlag; - - msb = k0; - usb = kStart; - numPatches = 0; - goalSB = goalSBTab[sampRateIdx]; - - if (nMaster == 0) { - patchNumSubbands[0] = 0; - patchStartSubband[0] = 0; - return 0; - } - - if (goalSB < kStart + numQMFBands) { - k = 0; - for (i = 0; freqMaster[i] < goalSB; i++) - k = i+1; - } else { - k = nMaster; - } - - do { - j = k+1; - do { - j--; - sb = freqMaster[j]; - oddFlag = (sb - 2 + k0) & 0x01; - } while (sb > k0 - 1 + msb - oddFlag); - - patchNumSubbands[numPatches] = MAX(sb - usb, 0); - patchStartSubband[numPatches] = k0 - oddFlag - patchNumSubbands[numPatches]; - - /* from MPEG reference code - slightly different from spec */ - if ((patchNumSubbands[numPatches] < 3) && (numPatches > 0)) - break; - - if (patchNumSubbands[numPatches] > 0) { - usb = sb; - msb = sb; - numPatches++; - } else { - msb = kStart; - } - - if (freqMaster[k] - sb < 3) - k = nMaster; - - } while (sb != (kStart + numQMFBands) && numPatches <= MAX_NUM_PATCHES); - - return numPatches; +static int BuildPatches(unsigned char *patchNumSubbands, unsigned char *patchStartSubband, unsigned char *freqMaster, + int nMaster, int k0, int kStart, int numQMFBands, int sampRateIdx) { + int i, j, k; + int msb, sb, usb, numPatches, goalSB, oddFlag; + + msb = k0; + usb = kStart; + numPatches = 0; + goalSB = goalSBTab[sampRateIdx]; + + if (nMaster == 0) { + patchNumSubbands[0] = 0; + patchStartSubband[0] = 0; + return 0; + } + + if (goalSB < kStart + numQMFBands) { + k = 0; + for (i = 0; freqMaster[i] < goalSB; i++) { + k = i + 1; + } + } else { + k = nMaster; + } + + do { + j = k + 1; + do { + j--; + sb = freqMaster[j]; + oddFlag = (sb - 2 + k0) & 0x01; + } while (sb > k0 - 1 + msb - oddFlag); + + patchNumSubbands[numPatches] = MAX(sb - usb, 0); + patchStartSubband[numPatches] = k0 - oddFlag - patchNumSubbands[numPatches]; + + /* from MPEG reference code - slightly different from spec */ + if ((patchNumSubbands[numPatches] < 3) && (numPatches > 0)) { + break; + } + + if (patchNumSubbands[numPatches] > 0) { + usb = sb; + msb = sb; + numPatches++; + } else { + msb = kStart; + } + + if (freqMaster[k] - sb < 3) { + k = nMaster; + } + + } while (sb != (kStart + numQMFBands) && numPatches <= MAX_NUM_PATCHES); + + return numPatches; } /************************************************************************************** - * Function: FindFreq - * - * Description: search buffer of unsigned chars for a specific value - * - * Inputs: buffer of elements to search - * number of elements to search - * value to search for - * - * Outputs: none - * - * Return: non-zero if the value is found anywhere in the buffer, zero otherwise + Function: FindFreq + + Description: search buffer of unsigned chars for a specific value + + Inputs: buffer of elements to search + number of elements to search + value to search for + + Outputs: none + + Return: non-zero if the value is found anywhere in the buffer, zero otherwise **************************************************************************************/ -static int FindFreq(unsigned char *freq, int nFreq, unsigned char val) -{ - int k; +static int FindFreq(unsigned char *freq, int nFreq, unsigned char val) { + int k; - for (k = 0; k < nFreq; k++) { - if (freq[k] == val) - return 1; - } + for (k = 0; k < nFreq; k++) { + if (freq[k] == val) { + return 1; + } + } - return 0; + return 0; } /************************************************************************************** - * Function: RemoveFreq - * - * Description: remove one element from a buffer of unsigned chars - * - * Inputs: buffer of elements - * number of elements - * index of element to remove - * - * Outputs: new buffer of length nFreq-1 - * - * Return: none + Function: RemoveFreq + + Description: remove one element from a buffer of unsigned chars + + Inputs: buffer of elements + number of elements + index of element to remove + + Outputs: new buffer of length nFreq-1 + + Return: none **************************************************************************************/ -static void RemoveFreq(unsigned char *freq, int nFreq, int removeIdx) -{ - int k; +static void RemoveFreq(unsigned char *freq, int nFreq, int removeIdx) { + int k; - if (removeIdx >= nFreq) - return; + if (removeIdx >= nFreq) { + return; + } - for (k = removeIdx; k < nFreq - 1; k++) - freq[k] = freq[k+1]; + for (k = removeIdx; k < nFreq - 1; k++) { + freq[k] = freq[k + 1]; + } } /************************************************************************************** - * Function: CalcFreqLimiter - * - * Description: calculate limiter frequency table (4.6.18.3.2.3) - * - * Inputs: number of subbands in each patch - * low resolution frequency table - * number of bands in low resolution frequency table - * index of starting QMF subband for SBR (kStart) - * number of limiter bands - * number of patches - * - * Outputs: limiter frequency table - * - * Return: number of bands in limiter frequency table + Function: CalcFreqLimiter + + Description: calculate limiter frequency table (4.6.18.3.2.3) + + Inputs: number of subbands in each patch + low resolution frequency table + number of bands in low resolution frequency table + index of starting QMF subband for SBR (kStart) + number of limiter bands + number of patches + + Outputs: limiter frequency table + + Return: number of bands in limiter frequency table **************************************************************************************/ -static int CalcFreqLimiter(unsigned char *freqLimiter, unsigned char *patchNumSubbands, unsigned char *freqLow, - int nLow, int kStart, int limiterBands, int numPatches) -{ - int k, bands, nLimiter, nOctaves; - int limBandsPerOctave[3] = {120, 200, 300}; /* [1.2, 2.0, 3.0] * 100 */ - unsigned char patchBorders[MAX_NUM_PATCHES + 1]; - - /* simple case */ - if (limiterBands == 0) { - freqLimiter[0] = freqLow[0] - kStart; - freqLimiter[1] = freqLow[nLow] - kStart; - return 1; - } - - bands = limBandsPerOctave[limiterBands - 1]; - patchBorders[0] = kStart; - - /* from MPEG reference code - slightly different from spec (top border) */ - for (k = 1; k < numPatches; k++) - patchBorders[k] = patchBorders[k-1] + patchNumSubbands[k-1]; - patchBorders[k] = freqLow[nLow]; - - for (k = 0; k <= nLow; k++) - freqLimiter[k] = freqLow[k]; - - for (k = 1; k < numPatches; k++) - freqLimiter[k+nLow] = patchBorders[k]; - - k = 1; - nLimiter = nLow + numPatches - 1; - BubbleSort(freqLimiter, nLimiter + 1); - - while (k <= nLimiter) { - nOctaves = log2Tab[freqLimiter[k]] - log2Tab[freqLimiter[k-1]]; /* Q28 */ - nOctaves = (nOctaves >> 9) * bands; /* Q19, max bands = 300 < 2^9 */ - if (nOctaves < (49 << 19)) { /* compare with 0.49*100, in Q19 */ - if (freqLimiter[k] == freqLimiter[k-1] || FindFreq(patchBorders, numPatches + 1, freqLimiter[k]) == 0) { - RemoveFreq(freqLimiter, nLimiter + 1, k); - nLimiter--; - } else if (FindFreq(patchBorders, numPatches + 1, freqLimiter[k-1]) == 0) { - RemoveFreq(freqLimiter, nLimiter + 1, k-1); - nLimiter--; - } else { - k++; - } - } else { - k++; - } - } - - /* store limiter boundaries as offsets from kStart */ - for (k = 0; k <= nLimiter; k++) - freqLimiter[k] -= kStart; - - return nLimiter; +static int CalcFreqLimiter(unsigned char *freqLimiter, unsigned char *patchNumSubbands, unsigned char *freqLow, + int nLow, int kStart, int limiterBands, int numPatches) { + int k, bands, nLimiter, nOctaves; + int limBandsPerOctave[3] = {120, 200, 300}; /* [1.2, 2.0, 3.0] * 100 */ + unsigned char patchBorders[MAX_NUM_PATCHES + 1]; + + /* simple case */ + if (limiterBands == 0) { + freqLimiter[0] = freqLow[0] - kStart; + freqLimiter[1] = freqLow[nLow] - kStart; + return 1; + } + + bands = limBandsPerOctave[limiterBands - 1]; + patchBorders[0] = kStart; + + /* from MPEG reference code - slightly different from spec (top border) */ + for (k = 1; k < numPatches; k++) { + patchBorders[k] = patchBorders[k - 1] + patchNumSubbands[k - 1]; + } + patchBorders[k] = freqLow[nLow]; + + for (k = 0; k <= nLow; k++) { + freqLimiter[k] = freqLow[k]; + } + + for (k = 1; k < numPatches; k++) { + freqLimiter[k + nLow] = patchBorders[k]; + } + + k = 1; + nLimiter = nLow + numPatches - 1; + BubbleSort(freqLimiter, nLimiter + 1); + + while (k <= nLimiter) { + nOctaves = log2Tab[freqLimiter[k]] - log2Tab[freqLimiter[k - 1]]; /* Q28 */ + nOctaves = (nOctaves >> 9) * bands; /* Q19, max bands = 300 < 2^9 */ + if (nOctaves < (49 << 19)) { /* compare with 0.49*100, in Q19 */ + if (freqLimiter[k] == freqLimiter[k - 1] || FindFreq(patchBorders, numPatches + 1, freqLimiter[k]) == 0) { + RemoveFreq(freqLimiter, nLimiter + 1, k); + nLimiter--; + } else if (FindFreq(patchBorders, numPatches + 1, freqLimiter[k - 1]) == 0) { + RemoveFreq(freqLimiter, nLimiter + 1, k - 1); + nLimiter--; + } else { + k++; + } + } else { + k++; + } + } + + /* store limiter boundaries as offsets from kStart */ + for (k = 0; k <= nLimiter; k++) { + freqLimiter[k] -= kStart; + } + + return nLimiter; } /************************************************************************************** - * Function: CalcFreqTables - * - * Description: calulate master and derived frequency tables, and patches - * - * Inputs: initialized SBRHeader struct for this SCE/CPE block - * initialized SBRFreq struct for this SCE/CPE block - * sample rate index of output sample rate (after SBR) - * - * Outputs: master and derived frequency tables, and patches - * - * Return: non-zero if error, zero otherwise + Function: CalcFreqTables + + Description: calulate master and derived frequency tables, and patches + + Inputs: initialized SBRHeader struct for this SCE/CPE block + initialized SBRFreq struct for this SCE/CPE block + sample rate index of output sample rate (after SBR) + + Outputs: master and derived frequency tables, and patches + + Return: non-zero if error, zero otherwise **************************************************************************************/ -int CalcFreqTables(SBRHeader *sbrHdr, SBRFreq *sbrFreq, int sampRateIdx) -{ - int k0, k2; - - k0 = k0Tab[sampRateIdx][sbrHdr->startFreq]; - - if (sbrHdr->stopFreq == 14) - k2 = 2*k0; - else if (sbrHdr->stopFreq == 15) - k2 = 3*k0; - else - k2 = k2Tab[sampRateIdx][sbrHdr->stopFreq]; - if (k2 > 64) - k2 = 64; - - /* calculate master frequency table */ - if (sbrHdr->freqScale == 0) - sbrFreq->nMaster = CalcFreqMasterScaleZero(sbrFreq->freqMaster, sbrHdr->alterScale, k0, k2); - else - sbrFreq->nMaster = CalcFreqMaster(sbrFreq->freqMaster, sbrHdr->freqScale, sbrHdr->alterScale, k0, k2); - - /* calculate high frequency table and related parameters */ - sbrFreq->nHigh = CalcFreqHigh(sbrFreq->freqHigh, sbrFreq->freqMaster, sbrFreq->nMaster, sbrHdr->crossOverBand); - sbrFreq->numQMFBands = sbrFreq->freqHigh[sbrFreq->nHigh] - sbrFreq->freqHigh[0]; - sbrFreq->kStart = sbrFreq->freqHigh[0]; - - /* calculate low frequency table */ - sbrFreq->nLow = CalcFreqLow(sbrFreq->freqLow, sbrFreq->freqHigh, sbrFreq->nHigh); - - /* calculate noise floor frequency table */ - sbrFreq->numNoiseFloorBands = CalcFreqNoise(sbrFreq->freqNoise, sbrFreq->freqLow, sbrFreq->nLow, sbrFreq->kStart, k2, sbrHdr->noiseBands); - - /* calculate limiter table */ - sbrFreq->numPatches = BuildPatches(sbrFreq->patchNumSubbands, sbrFreq->patchStartSubband, sbrFreq->freqMaster, - sbrFreq->nMaster, k0, sbrFreq->kStart, sbrFreq->numQMFBands, sampRateIdx); - sbrFreq->nLimiter = CalcFreqLimiter(sbrFreq->freqLimiter, sbrFreq->patchNumSubbands, sbrFreq->freqLow, sbrFreq->nLow, sbrFreq->kStart, - sbrHdr->limiterBands, sbrFreq->numPatches); - - return 0; +int CalcFreqTables(SBRHeader *sbrHdr, SBRFreq *sbrFreq, int sampRateIdx) { + int k0, k2; + + k0 = k0Tab[sampRateIdx][sbrHdr->startFreq]; + + if (sbrHdr->stopFreq == 14) { + k2 = 2 * k0; + } else if (sbrHdr->stopFreq == 15) { + k2 = 3 * k0; + } else { + k2 = k2Tab[sampRateIdx][sbrHdr->stopFreq]; + } + if (k2 > 64) { + k2 = 64; + } + + /* calculate master frequency table */ + if (sbrHdr->freqScale == 0) { + sbrFreq->nMaster = CalcFreqMasterScaleZero(sbrFreq->freqMaster, sbrHdr->alterScale, k0, k2); + } else { + sbrFreq->nMaster = CalcFreqMaster(sbrFreq->freqMaster, sbrHdr->freqScale, sbrHdr->alterScale, k0, k2); + } + + /* calculate high frequency table and related parameters */ + sbrFreq->nHigh = CalcFreqHigh(sbrFreq->freqHigh, sbrFreq->freqMaster, sbrFreq->nMaster, sbrHdr->crossOverBand); + sbrFreq->numQMFBands = sbrFreq->freqHigh[sbrFreq->nHigh] - sbrFreq->freqHigh[0]; + sbrFreq->kStart = sbrFreq->freqHigh[0]; + + /* calculate low frequency table */ + sbrFreq->nLow = CalcFreqLow(sbrFreq->freqLow, sbrFreq->freqHigh, sbrFreq->nHigh); + + /* calculate noise floor frequency table */ + sbrFreq->numNoiseFloorBands = CalcFreqNoise(sbrFreq->freqNoise, sbrFreq->freqLow, sbrFreq->nLow, sbrFreq->kStart, k2, sbrHdr->noiseBands); + + /* calculate limiter table */ + sbrFreq->numPatches = BuildPatches(sbrFreq->patchNumSubbands, sbrFreq->patchStartSubband, sbrFreq->freqMaster, + sbrFreq->nMaster, k0, sbrFreq->kStart, sbrFreq->numQMFBands, sampRateIdx); + sbrFreq->nLimiter = CalcFreqLimiter(sbrFreq->freqLimiter, sbrFreq->patchNumSubbands, sbrFreq->freqLow, sbrFreq->nLow, sbrFreq->kStart, + sbrHdr->limiterBands, sbrFreq->numPatches); + + return 0; } diff --git a/src/libhelix-aac/sbrhfadj.c b/src/libhelix-aac/sbrhfadj.c index f16cb07b..25dc0482 100644 --- a/src/libhelix-aac/sbrhfadj.c +++ b/src/libhelix-aac/sbrhfadj.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrhfadj.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrhfadj.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrhfadj.c - high frequency adjustment for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrhfadj.c - high frequency adjustment for SBR **************************************************************************************/ #include "sbr.h" @@ -48,169 +48,170 @@ /* invBandTab[i] = 1.0 / (i + 1), Q31 */ static const int invBandTab[64] PROGMEM = { - 0x7fffffff, 0x40000000, 0x2aaaaaab, 0x20000000, 0x1999999a, 0x15555555, 0x12492492, 0x10000000, - 0x0e38e38e, 0x0ccccccd, 0x0ba2e8ba, 0x0aaaaaab, 0x09d89d8a, 0x09249249, 0x08888889, 0x08000000, - 0x07878788, 0x071c71c7, 0x06bca1af, 0x06666666, 0x06186186, 0x05d1745d, 0x0590b216, 0x05555555, - 0x051eb852, 0x04ec4ec5, 0x04bda12f, 0x04924925, 0x0469ee58, 0x04444444, 0x04210842, 0x04000000, - 0x03e0f83e, 0x03c3c3c4, 0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483483, 0x03333333, - 0x031f3832, 0x030c30c3, 0x02fa0be8, 0x02e8ba2f, 0x02d82d83, 0x02c8590b, 0x02b93105, 0x02aaaaab, - 0x029cbc15, 0x028f5c29, 0x02828283, 0x02762762, 0x026a439f, 0x025ed098, 0x0253c825, 0x02492492, - 0x023ee090, 0x0234f72c, 0x022b63cc, 0x02222222, 0x02192e2a, 0x02108421, 0x02082082, 0x02000000, + 0x7fffffff, 0x40000000, 0x2aaaaaab, 0x20000000, 0x1999999a, 0x15555555, 0x12492492, 0x10000000, + 0x0e38e38e, 0x0ccccccd, 0x0ba2e8ba, 0x0aaaaaab, 0x09d89d8a, 0x09249249, 0x08888889, 0x08000000, + 0x07878788, 0x071c71c7, 0x06bca1af, 0x06666666, 0x06186186, 0x05d1745d, 0x0590b216, 0x05555555, + 0x051eb852, 0x04ec4ec5, 0x04bda12f, 0x04924925, 0x0469ee58, 0x04444444, 0x04210842, 0x04000000, + 0x03e0f83e, 0x03c3c3c4, 0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483483, 0x03333333, + 0x031f3832, 0x030c30c3, 0x02fa0be8, 0x02e8ba2f, 0x02d82d83, 0x02c8590b, 0x02b93105, 0x02aaaaab, + 0x029cbc15, 0x028f5c29, 0x02828283, 0x02762762, 0x026a439f, 0x025ed098, 0x0253c825, 0x02492492, + 0x023ee090, 0x0234f72c, 0x022b63cc, 0x02222222, 0x02192e2a, 0x02108421, 0x02082082, 0x02000000, }; /************************************************************************************** - * Function: EstimateEnvelope - * - * Description: estimate power of generated HF QMF bands in one time-domain envelope - * (4.6.18.7.3) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * index of current envelope - * - * Outputs: power of each QMF subband, stored as integer (Q0) * 2^N, N >= 0 - * - * Return: none + Function: EstimateEnvelope + + Description: estimate power of generated HF QMF bands in one time-domain envelope + (4.6.18.7.3) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + index of current envelope + + Outputs: power of each QMF subband, stored as integer (Q0) * 2^N, N >= 0 + + Return: none **************************************************************************************/ -static void EstimateEnvelope(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, int env) -{ - int i, m, iStart, iEnd, xre, xim, nScale, expMax; - int p, n, mStart, mEnd, invFact, t; - int *XBuf; - U64 eCurr; - unsigned char *freqBandTab; - - /* estimate current envelope */ - iStart = sbrGrid->envTimeBorder[env] + HF_ADJ; - iEnd = sbrGrid->envTimeBorder[env+1] + HF_ADJ; - if (sbrGrid->freqRes[env]) { - n = sbrFreq->nHigh; - freqBandTab = sbrFreq->freqHigh; - } else { - n = sbrFreq->nLow; - freqBandTab = sbrFreq->freqLow; - } - - /* ADS should inline MADD64 (smlal) properly, but check to make sure */ - expMax = 0; - if (sbrHdr->interpFreq) { - for (m = 0; m < sbrFreq->numQMFBands; m++) { - eCurr.w64 = 0; - XBuf = psi->XBuf[iStart][sbrFreq->kStart + m]; - for (i = iStart; i < iEnd; i++) { - /* scale to int before calculating power (precision not critical, and avoids overflow) */ - xre = (*XBuf) >> FBITS_OUT_QMFA; XBuf += 1; - xim = (*XBuf) >> FBITS_OUT_QMFA; XBuf += (2*64 - 1); - eCurr.w64 = MADD64(eCurr.w64, xre, xre); - eCurr.w64 = MADD64(eCurr.w64, xim, xim); - } - - /* eCurr.w64 is now Q(64 - 2*FBITS_OUT_QMFA) (64-bit word) - * if energy is too big to fit in 32-bit word (> 2^31) scale down by power of 2 - */ - nScale = 0; - if (eCurr.r.hi32) { - nScale = (32 - CLZ(eCurr.r.hi32)) + 1; - t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ - t |= eCurr.r.hi32 << (32 - nScale); - } else if (eCurr.r.lo32 >> 31) { - nScale = 1; - t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ - } else { - t = (int)eCurr.r.lo32; - } - - invFact = invBandTab[(iEnd - iStart)-1]; - psi->eCurr[m] = MULSHIFT32(t, invFact); - psi->eCurrExp[m] = nScale + 1; /* +1 for invFact = Q31 */ - if (psi->eCurrExp[m] > expMax) - expMax = psi->eCurrExp[m]; - } - } else { - for (p = 0; p < n; p++) { - mStart = freqBandTab[p]; - mEnd = freqBandTab[p+1]; - eCurr.w64 = 0; - for (i = iStart; i < iEnd; i++) { - XBuf = psi->XBuf[i][mStart]; - for (m = mStart; m < mEnd; m++) { - xre = (*XBuf++) >> FBITS_OUT_QMFA; - xim = (*XBuf++) >> FBITS_OUT_QMFA; - eCurr.w64 = MADD64(eCurr.w64, xre, xre); - eCurr.w64 = MADD64(eCurr.w64, xim, xim); - } - } - - nScale = 0; - if (eCurr.r.hi32) { - nScale = (32 - CLZ(eCurr.r.hi32)) + 1; - t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ - t |= eCurr.r.hi32 << (32 - nScale); - } else if (eCurr.r.lo32 >> 31) { - nScale = 1; - t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ - } else { - t = (int)eCurr.r.lo32; - } - - invFact = invBandTab[(iEnd - iStart)-1]; - invFact = MULSHIFT32(invBandTab[(mEnd - mStart)-1], invFact) << 1; - t = MULSHIFT32(t, invFact); - - for (m = mStart; m < mEnd; m++) { - psi->eCurr[m - sbrFreq->kStart] = t; - psi->eCurrExp[m - sbrFreq->kStart] = nScale + 1; /* +1 for invFact = Q31 */ - } - if (psi->eCurrExp[mStart - sbrFreq->kStart] > expMax) - expMax = psi->eCurrExp[mStart - sbrFreq->kStart]; - } - } - psi->eCurrExpMax = expMax; +static void EstimateEnvelope(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, int env) { + int i, m, iStart, iEnd, xre, xim, nScale, expMax; + int p, n, mStart, mEnd, invFact, t; + int *XBuf; + U64 eCurr; + unsigned char *freqBandTab; + + /* estimate current envelope */ + iStart = sbrGrid->envTimeBorder[env] + HF_ADJ; + iEnd = sbrGrid->envTimeBorder[env + 1] + HF_ADJ; + if (sbrGrid->freqRes[env]) { + n = sbrFreq->nHigh; + freqBandTab = sbrFreq->freqHigh; + } else { + n = sbrFreq->nLow; + freqBandTab = sbrFreq->freqLow; + } + + /* ADS should inline MADD64 (smlal) properly, but check to make sure */ + expMax = 0; + if (sbrHdr->interpFreq) { + for (m = 0; m < sbrFreq->numQMFBands; m++) { + eCurr.w64 = 0; + XBuf = psi->XBuf[iStart][sbrFreq->kStart + m]; + for (i = iStart; i < iEnd; i++) { + /* scale to int before calculating power (precision not critical, and avoids overflow) */ + xre = (*XBuf) >> FBITS_OUT_QMFA; XBuf += 1; + xim = (*XBuf) >> FBITS_OUT_QMFA; XBuf += (2 * 64 - 1); + eCurr.w64 = MADD64(eCurr.w64, xre, xre); + eCurr.w64 = MADD64(eCurr.w64, xim, xim); + } + + /* eCurr.w64 is now Q(64 - 2*FBITS_OUT_QMFA) (64-bit word) + if energy is too big to fit in 32-bit word (> 2^31) scale down by power of 2 + */ + nScale = 0; + if (eCurr.r.hi32) { + nScale = (32 - CLZ(eCurr.r.hi32)) + 1; + t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ + t |= eCurr.r.hi32 << (32 - nScale); + } else if (eCurr.r.lo32 >> 31) { + nScale = 1; + t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ + } else { + t = (int)eCurr.r.lo32; + } + + invFact = invBandTab[(iEnd - iStart) - 1]; + psi->eCurr[m] = MULSHIFT32(t, invFact); + psi->eCurrExp[m] = nScale + 1; /* +1 for invFact = Q31 */ + if (psi->eCurrExp[m] > expMax) { + expMax = psi->eCurrExp[m]; + } + } + } else { + for (p = 0; p < n; p++) { + mStart = freqBandTab[p]; + mEnd = freqBandTab[p + 1]; + eCurr.w64 = 0; + for (i = iStart; i < iEnd; i++) { + XBuf = psi->XBuf[i][mStart]; + for (m = mStart; m < mEnd; m++) { + xre = (*XBuf++) >> FBITS_OUT_QMFA; + xim = (*XBuf++) >> FBITS_OUT_QMFA; + eCurr.w64 = MADD64(eCurr.w64, xre, xre); + eCurr.w64 = MADD64(eCurr.w64, xim, xim); + } + } + + nScale = 0; + if (eCurr.r.hi32) { + nScale = (32 - CLZ(eCurr.r.hi32)) + 1; + t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ + t |= eCurr.r.hi32 << (32 - nScale); + } else if (eCurr.r.lo32 >> 31) { + nScale = 1; + t = (int)(eCurr.r.lo32 >> nScale); /* logical (unsigned) >> */ + } else { + t = (int)eCurr.r.lo32; + } + + invFact = invBandTab[(iEnd - iStart) - 1]; + invFact = MULSHIFT32(invBandTab[(mEnd - mStart) - 1], invFact) << 1; + t = MULSHIFT32(t, invFact); + + for (m = mStart; m < mEnd; m++) { + psi->eCurr[m - sbrFreq->kStart] = t; + psi->eCurrExp[m - sbrFreq->kStart] = nScale + 1; /* +1 for invFact = Q31 */ + } + if (psi->eCurrExp[mStart - sbrFreq->kStart] > expMax) { + expMax = psi->eCurrExp[mStart - sbrFreq->kStart]; + } + } + } + psi->eCurrExpMax = expMax; } /************************************************************************************** - * Function: GetSMapped - * - * Description: calculate SMapped (4.6.18.7.2) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current envelope - * index of current QMF band - * la flag for this envelope - * - * Outputs: none - * - * Return: 1 if a sinusoid is present in this band, 0 if not + Function: GetSMapped + + Description: calculate SMapped (4.6.18.7.2) + + Inputs: initialized PSInfoSBR struct + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current envelope + index of current QMF band + la flag for this envelope + + Outputs: none + + Return: 1 if a sinusoid is present in this band, 0 if not **************************************************************************************/ -static int GetSMapped(SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int env, int band, int la) -{ - int bandStart, bandEnd, oddFlag, r; - - if (sbrGrid->freqRes[env]) { - /* high resolution */ - bandStart = band; - bandEnd = band+1; - } else { - /* low resolution (see CalcFreqLow() for mapping) */ - oddFlag = sbrFreq->nHigh & 0x01; - bandStart = (band > 0 ? 2*band - oddFlag : 0); /* starting index for freqLow[band] */ - bandEnd = 2*(band+1) - oddFlag; /* ending index for freqLow[band+1] */ - } - - /* sMapped = 1 if sIndexMapped == 1 for any frequency in this band */ - for (band = bandStart; band < bandEnd; band++) { - if (sbrChan->addHarmonic[1][band]) { - r = ((sbrFreq->freqHigh[band+1] + sbrFreq->freqHigh[band]) >> 1); - if (env >= la || sbrChan->addHarmonic[0][r] == 1) - return 1; - } - } - return 0; +static int GetSMapped(SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int env, int band, int la) { + int bandStart, bandEnd, oddFlag, r; + + if (sbrGrid->freqRes[env]) { + /* high resolution */ + bandStart = band; + bandEnd = band + 1; + } else { + /* low resolution (see CalcFreqLow() for mapping) */ + oddFlag = sbrFreq->nHigh & 0x01; + bandStart = (band > 0 ? 2 * band - oddFlag : 0); /* starting index for freqLow[band] */ + bandEnd = 2 * (band + 1) - oddFlag; /* ending index for freqLow[band+1] */ + } + + /* sMapped = 1 if sIndexMapped == 1 for any frequency in this band */ + for (band = bandStart; band < bandEnd; band++) { + if (sbrChan->addHarmonic[1][band]) { + r = ((sbrFreq->freqHigh[band + 1] + sbrFreq->freqHigh[band]) >> 1); + if (env >= la || sbrChan->addHarmonic[0][r] == 1) { + return 1; + } + } + } + return 0; } #define GBOOST_MAX 0x2830afd3 /* Q28, 1.584893192 squared */ @@ -220,634 +221,642 @@ static int GetSMapped(SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int static const int limGainTab[4] PROGMEM = {0x20138ca7, 0x40000000, 0x7fb27dce, 0x80000000}; /* Q30 (0x80000000 = sentinel for GMAX) */ /************************************************************************************** - * Function: CalcMaxGain - * - * Description: calculate max gain in one limiter band (4.6.18.7.5) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * index of current channel (0 for SCE, 0 or 1 for CPE) - * index of current envelope - * index of current limiter band - * number of fraction bits in dequantized envelope - * (max = Q(FBITS_OUT_DQ_ENV - 6) = Q23, can go negative) - * - * Outputs: updated gainMax, gainMaxFBits, and sumEOrigMapped in PSInfoSBR struct - * - * Return: none + Function: CalcMaxGain + + Description: calculate max gain in one limiter band (4.6.18.7.5) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + index of current channel (0 for SCE, 0 or 1 for CPE) + index of current envelope + index of current limiter band + number of fraction bits in dequantized envelope + (max = Q(FBITS_OUT_DQ_ENV - 6) = Q23, can go negative) + + Outputs: updated gainMax, gainMaxFBits, and sumEOrigMapped in PSInfoSBR struct + + Return: none **************************************************************************************/ -static void CalcMaxGain(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, int ch, int env, int lim, int fbitsDQ) -{ - int m, mStart, mEnd, q, z, r; - int sumEOrigMapped, sumECurr, gainMax, eOMGainMax, envBand; - unsigned char eCurrExpMax; - unsigned char *freqBandTab; - - mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ - mEnd = sbrFreq->freqLimiter[lim + 1]; - freqBandTab = (sbrGrid->freqRes[env] ? sbrFreq->freqHigh : sbrFreq->freqLow); - - /* calculate max gain to apply to signal in this limiter band */ - sumECurr = 0; - sumEOrigMapped = 0; - eCurrExpMax = psi->eCurrExpMax; - eOMGainMax = psi->eOMGainMax; - envBand = psi->envBand; - for (m = mStart; m < mEnd; m++) { - /* map current QMF band to appropriate envelope band */ - if (m == freqBandTab[envBand + 1] - sbrFreq->kStart) { - envBand++; - eOMGainMax = psi->envDataDequant[ch][env][envBand] >> ACC_SCALE; /* summing max 48 bands */ - } - sumEOrigMapped += eOMGainMax; - - /* easy test for overflow on ARM */ - sumECurr += (psi->eCurr[m] >> (eCurrExpMax - psi->eCurrExp[m])); - if (sumECurr >> 30) { - sumECurr >>= 1; - eCurrExpMax++; - } - } - psi->eOMGainMax = eOMGainMax; - psi->envBand = envBand; - - psi->gainMaxFBits = 30; /* Q30 tables */ - if (sumECurr == 0) { - /* any non-zero numerator * 1/EPS_0 is > G_MAX */ - gainMax = (sumEOrigMapped == 0 ? (int)limGainTab[sbrHdr->limiterGains] : (int)0x80000000); - } else if (sumEOrigMapped == 0) { - /* 1/(any non-zero denominator) * EPS_0 * limGainTab[x] is appx. 0 */ - gainMax = 0; - } else { - /* sumEOrigMapped = Q(fbitsDQ - ACC_SCALE), sumECurr = Q(-eCurrExpMax) */ - gainMax = limGainTab[sbrHdr->limiterGains]; - if (sbrHdr->limiterGains != 3) { - q = MULSHIFT32(sumEOrigMapped, gainMax); /* Q(fbitsDQ - ACC_SCALE - 2), gainMax = Q30 */ - z = CLZ(sumECurr) - 1; - r = InvRNormalized(sumECurr << z); /* in = Q(z - eCurrExpMax), out = Q(29 + 31 - z + eCurrExpMax) */ - gainMax = MULSHIFT32(q, r); /* Q(29 + 31 - z + eCurrExpMax + fbitsDQ - ACC_SCALE - 2 - 32) */ - psi->gainMaxFBits = 26 - z + eCurrExpMax + fbitsDQ - ACC_SCALE; - } - } - psi->sumEOrigMapped = sumEOrigMapped; - psi->gainMax = gainMax; +static void CalcMaxGain(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, int ch, int env, int lim, int fbitsDQ) { + int m, mStart, mEnd, q, z, r; + int sumEOrigMapped, sumECurr, gainMax, eOMGainMax, envBand; + unsigned char eCurrExpMax; + unsigned char *freqBandTab; + + mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ + mEnd = sbrFreq->freqLimiter[lim + 1]; + freqBandTab = (sbrGrid->freqRes[env] ? sbrFreq->freqHigh : sbrFreq->freqLow); + + /* calculate max gain to apply to signal in this limiter band */ + sumECurr = 0; + sumEOrigMapped = 0; + eCurrExpMax = psi->eCurrExpMax; + eOMGainMax = psi->eOMGainMax; + envBand = psi->envBand; + for (m = mStart; m < mEnd; m++) { + /* map current QMF band to appropriate envelope band */ + if (m == freqBandTab[envBand + 1] - sbrFreq->kStart) { + envBand++; + eOMGainMax = psi->envDataDequant[ch][env][envBand] >> ACC_SCALE; /* summing max 48 bands */ + } + sumEOrigMapped += eOMGainMax; + + /* easy test for overflow on ARM */ + sumECurr += (psi->eCurr[m] >> (eCurrExpMax - psi->eCurrExp[m])); + if (sumECurr >> 30) { + sumECurr >>= 1; + eCurrExpMax++; + } + } + psi->eOMGainMax = eOMGainMax; + psi->envBand = envBand; + + psi->gainMaxFBits = 30; /* Q30 tables */ + if (sumECurr == 0) { + /* any non-zero numerator * 1/EPS_0 is > G_MAX */ + gainMax = (sumEOrigMapped == 0 ? (int)limGainTab[sbrHdr->limiterGains] : (int)0x80000000); + } else if (sumEOrigMapped == 0) { + /* 1/(any non-zero denominator) * EPS_0 * limGainTab[x] is appx. 0 */ + gainMax = 0; + } else { + /* sumEOrigMapped = Q(fbitsDQ - ACC_SCALE), sumECurr = Q(-eCurrExpMax) */ + gainMax = limGainTab[sbrHdr->limiterGains]; + if (sbrHdr->limiterGains != 3) { + q = MULSHIFT32(sumEOrigMapped, gainMax); /* Q(fbitsDQ - ACC_SCALE - 2), gainMax = Q30 */ + z = CLZ(sumECurr) - 1; + r = InvRNormalized(sumECurr << z); /* in = Q(z - eCurrExpMax), out = Q(29 + 31 - z + eCurrExpMax) */ + gainMax = MULSHIFT32(q, r); /* Q(29 + 31 - z + eCurrExpMax + fbitsDQ - ACC_SCALE - 2 - 32) */ + psi->gainMaxFBits = 26 - z + eCurrExpMax + fbitsDQ - ACC_SCALE; + } + } + psi->sumEOrigMapped = sumEOrigMapped; + psi->gainMax = gainMax; } /************************************************************************************** - * Function: CalcNoiseDivFactors - * - * Description: calculate 1/(1+Q) and Q/(1+Q) (4.6.18.7.4; 4.6.18.7.5) - * - * Inputs: dequantized noise floor scalefactor - * - * Outputs: 1/(1+Q) and Q/(1+Q), format = Q31 - * - * Return: none + Function: CalcNoiseDivFactors + + Description: calculate 1/(1+Q) and Q/(1+Q) (4.6.18.7.4; 4.6.18.7.5) + + Inputs: dequantized noise floor scalefactor + + Outputs: 1/(1+Q) and Q/(1+Q), format = Q31 + + Return: none **************************************************************************************/ -static void CalcNoiseDivFactors(int q, int *qp1Inv, int *qqp1Inv) -{ - int z, qp1, t, s; - - /* 1 + Q_orig */ - qp1 = (q >> 1); - qp1 += (1 << (FBITS_OUT_DQ_NOISE - 1)); /* >> 1 to avoid overflow when adding 1.0 */ - z = CLZ(qp1) - 1; /* z <= 31 - FBITS_OUT_DQ_NOISE */ - qp1 <<= z; /* Q(FBITS_OUT_DQ_NOISE + z) = Q31 * 2^-(31 - (FBITS_OUT_DQ_NOISE + z)) */ - t = InvRNormalized(qp1) << 1; /* Q30 * 2^(31 - (FBITS_OUT_DQ_NOISE + z)), guaranteed not to overflow */ - - /* normalize to Q31 */ - s = (31 - (FBITS_OUT_DQ_NOISE - 1) - z - 1); /* clearly z >= 0, z <= (30 - (FBITS_OUT_DQ_NOISE - 1)) */ - *qp1Inv = (t >> s); /* s = [0, 31 - FBITS_OUT_DQ_NOISE] */ - *qqp1Inv = MULSHIFT32(t, q) << (32 - FBITS_OUT_DQ_NOISE - s); +static void CalcNoiseDivFactors(int q, int *qp1Inv, int *qqp1Inv) { + int z, qp1, t, s; + + /* 1 + Q_orig */ + qp1 = (q >> 1); + qp1 += (1 << (FBITS_OUT_DQ_NOISE - 1)); /* >> 1 to avoid overflow when adding 1.0 */ + z = CLZ(qp1) - 1; /* z <= 31 - FBITS_OUT_DQ_NOISE */ + qp1 <<= z; /* Q(FBITS_OUT_DQ_NOISE + z) = Q31 * 2^-(31 - (FBITS_OUT_DQ_NOISE + z)) */ + t = InvRNormalized(qp1) << 1; /* Q30 * 2^(31 - (FBITS_OUT_DQ_NOISE + z)), guaranteed not to overflow */ + + /* normalize to Q31 */ + s = (31 - (FBITS_OUT_DQ_NOISE - 1) - z - 1); /* clearly z >= 0, z <= (30 - (FBITS_OUT_DQ_NOISE - 1)) */ + *qp1Inv = (t >> s); /* s = [0, 31 - FBITS_OUT_DQ_NOISE] */ + *qqp1Inv = MULSHIFT32(t, q) << (32 - FBITS_OUT_DQ_NOISE - s); } /************************************************************************************** - * Function: CalcComponentGains - * - * Description: calculate gain of envelope, sinusoids, and noise in one limiter band - * (4.6.18.7.5) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * index of current envelope - * index of current limiter band - * number of fraction bits in dequantized envelope - * - * Outputs: gains for envelope, sinusoids and noise - * number of fraction bits for envelope gain - * sum of the total gain for each component in this band - * other updated state variables - * - * Return: none + Function: CalcComponentGains + + Description: calculate gain of envelope, sinusoids, and noise in one limiter band + (4.6.18.7.5) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + index of current envelope + index of current limiter band + number of fraction bits in dequantized envelope + + Outputs: gains for envelope, sinusoids and noise + number of fraction bits for envelope gain + sum of the total gain for each component in this band + other updated state variables + + Return: none **************************************************************************************/ -static void CalcComponentGains(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch, int env, int lim, int fbitsDQ) -{ - int d, m, mStart, mEnd, q, qm, noiseFloor, sIndexMapped; - int shift, eCurr, maxFlag, gainMax, gainMaxFBits; - int gain, sm, z, r, fbitsGain, gainScale; - unsigned char *freqBandTab; - - mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ - mEnd = sbrFreq->freqLimiter[lim + 1]; - - gainMax = psi->gainMax; - gainMaxFBits = psi->gainMaxFBits; - - d = (env == psi->la || env == sbrChan->laPrev ? 0 : 1); - freqBandTab = (sbrGrid->freqRes[env] ? sbrFreq->freqHigh : sbrFreq->freqLow); - - /* figure out which noise floor this envelope is in (only 1 or 2 noise floors allowed) */ - noiseFloor = 0; - if (sbrGrid->numNoiseFloors == 2 && sbrGrid->noiseTimeBorder[1] <= sbrGrid->envTimeBorder[env]) - noiseFloor++; - - psi->sumECurrGLim = 0; - psi->sumSM = 0; - psi->sumQM = 0; - /* calculate energy of noise to add in this limiter band */ - for (m = mStart; m < mEnd; m++) { - if (m == sbrFreq->freqNoise[psi->noiseFloorBand + 1] - sbrFreq->kStart) { - /* map current QMF band to appropriate noise floor band (NOTE: freqLimiter[0] == freqLow[0] = freqHigh[0]) */ - psi->noiseFloorBand++; - CalcNoiseDivFactors(psi->noiseDataDequant[ch][noiseFloor][psi->noiseFloorBand], &(psi->qp1Inv), &(psi->qqp1Inv)); - } - if (m == sbrFreq->freqHigh[psi->highBand + 1] - sbrFreq->kStart) - psi->highBand++; - if (m == freqBandTab[psi->sBand + 1] - sbrFreq->kStart) { - psi->sBand++; - psi->sMapped = GetSMapped(sbrGrid, sbrFreq, sbrChan, env, psi->sBand, psi->la); - } - - /* get sIndexMapped for this QMF subband */ - sIndexMapped = 0; - r = ((sbrFreq->freqHigh[psi->highBand+1] + sbrFreq->freqHigh[psi->highBand]) >> 1); - if (m + sbrFreq->kStart == r) { - /* r = center frequency, deltaStep = (env >= la || sIndexMapped'(r, numEnv'-1) == 1) */ - if (env >= psi->la || sbrChan->addHarmonic[0][r] == 1) - sIndexMapped = sbrChan->addHarmonic[1][psi->highBand]; - } - - /* save sine flags from last envelope in this frame: - * addHarmonic[0][0...63] = saved sine present flag from previous frame, for each QMF subband - * addHarmonic[1][0...nHigh-1] = addHarmonic bit from current frame, for each high-res frequency band - * from MPEG reference code - slightly different from spec - * (sIndexMapped'(m,LE'-1) can still be 0 when numEnv == psi->la) - */ - if (env == sbrGrid->numEnv - 1) { - if (m + sbrFreq->kStart == r) - sbrChan->addHarmonic[0][m + sbrFreq->kStart] = sbrChan->addHarmonic[1][psi->highBand]; - else - sbrChan->addHarmonic[0][m + sbrFreq->kStart] = 0; - } - - gain = psi->envDataDequant[ch][env][psi->sBand]; - qm = MULSHIFT32(gain, psi->qqp1Inv) << 1; - sm = (sIndexMapped ? MULSHIFT32(gain, psi->qp1Inv) << 1 : 0); - - /* three cases: (sMapped == 0 && delta == 1), (sMapped == 0 && delta == 0), (sMapped == 1) */ - if (d == 1 && psi->sMapped == 0) - gain = MULSHIFT32(psi->qp1Inv, gain) << 1; - else if (psi->sMapped != 0) - gain = MULSHIFT32(psi->qqp1Inv, gain) << 1; - - /* gain, qm, sm = Q(fbitsDQ), gainMax = Q(fbitsGainMax) */ - eCurr = psi->eCurr[m]; - if (eCurr) { - z = CLZ(eCurr) - 1; - r = InvRNormalized(eCurr << z); /* in = Q(z - eCurrExp), out = Q(29 + 31 - z + eCurrExp) */ - gainScale = MULSHIFT32(gain, r); /* out = Q(29 + 31 - z + eCurrExp + fbitsDQ - 32) */ - fbitsGain = 29 + 31 - z + psi->eCurrExp[m] + fbitsDQ - 32; - } else { - /* if eCurr == 0, then gain is unchanged (divide by EPS = 1) */ - gainScale = gain; - fbitsGain = fbitsDQ; - } - - /* see if gain for this band exceeds max gain */ - maxFlag = 0; - if (gainMax != (int)0x80000000) { - if (fbitsGain >= gainMaxFBits) { - shift = MIN(fbitsGain - gainMaxFBits, 31); - maxFlag = ((gainScale >> shift) > gainMax ? 1 : 0); - } else { - shift = MIN(gainMaxFBits - fbitsGain, 31); - maxFlag = (gainScale > (gainMax >> shift) ? 1 : 0); - } - } - - if (maxFlag) { - /* gainScale > gainMax, calculate ratio with 32/16 division */ - q = 0; - r = gainScale; /* guaranteed > 0, else maxFlag could not have been set */ - z = CLZ(r); - if (z < 16) { - q = 16 - z; - r >>= q; /* out = Q(fbitsGain - q) */ - } - - z = CLZ(gainMax) - 1; - r = (gainMax << z) / r; /* out = Q((fbitsGainMax + z) - (fbitsGain - q)) */ - q = (gainMaxFBits + z) - (fbitsGain - q); /* r = Q(q) */ - if (q > 30) { - r >>= MIN(q - 30, 31); - } else { - z = MIN(30 - q, 30); - CLIP_2N_SHIFT30(r, z); /* let r = Q30 since range = [0.0, 1.0) (clip to 0x3fffffff = 0.99999) */ - } - - qm = MULSHIFT32(qm, r) << 2; - gain = MULSHIFT32(gain, r) << 2; - psi->gLimBuf[m] = gainMax; - psi->gLimFbits[m] = gainMaxFBits; - } else { - psi->gLimBuf[m] = gainScale; - psi->gLimFbits[m] = fbitsGain; - } - - /* sumSM, sumQM, sumECurrGLim = Q(fbitsDQ - ACC_SCALE) */ - psi->smBuf[m] = sm; - psi->sumSM += (sm >> ACC_SCALE); - - psi->qmLimBuf[m] = qm; - if (env != psi->la && env != sbrChan->laPrev && sm == 0) - psi->sumQM += (qm >> ACC_SCALE); - - /* eCurr * gain^2 same as gain^2, before division by eCurr - * (but note that gain != 0 even if eCurr == 0, since it's divided by eps) - */ - if (eCurr) - psi->sumECurrGLim += (gain >> ACC_SCALE); - } +static void CalcComponentGains(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch, int env, int lim, int fbitsDQ) { + int d, m, mStart, mEnd, q, qm, noiseFloor, sIndexMapped; + int shift, eCurr, maxFlag, gainMax, gainMaxFBits; + int gain, sm, z, r, fbitsGain, gainScale; + unsigned char *freqBandTab; + + mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ + mEnd = sbrFreq->freqLimiter[lim + 1]; + + gainMax = psi->gainMax; + gainMaxFBits = psi->gainMaxFBits; + + d = (env == psi->la || env == sbrChan->laPrev ? 0 : 1); + freqBandTab = (sbrGrid->freqRes[env] ? sbrFreq->freqHigh : sbrFreq->freqLow); + + /* figure out which noise floor this envelope is in (only 1 or 2 noise floors allowed) */ + noiseFloor = 0; + if (sbrGrid->numNoiseFloors == 2 && sbrGrid->noiseTimeBorder[1] <= sbrGrid->envTimeBorder[env]) { + noiseFloor++; + } + + psi->sumECurrGLim = 0; + psi->sumSM = 0; + psi->sumQM = 0; + /* calculate energy of noise to add in this limiter band */ + for (m = mStart; m < mEnd; m++) { + if (m == sbrFreq->freqNoise[psi->noiseFloorBand + 1] - sbrFreq->kStart) { + /* map current QMF band to appropriate noise floor band (NOTE: freqLimiter[0] == freqLow[0] = freqHigh[0]) */ + psi->noiseFloorBand++; + CalcNoiseDivFactors(psi->noiseDataDequant[ch][noiseFloor][psi->noiseFloorBand], &(psi->qp1Inv), &(psi->qqp1Inv)); + } + if (m == sbrFreq->freqHigh[psi->highBand + 1] - sbrFreq->kStart) { + psi->highBand++; + } + if (m == freqBandTab[psi->sBand + 1] - sbrFreq->kStart) { + psi->sBand++; + psi->sMapped = GetSMapped(sbrGrid, sbrFreq, sbrChan, env, psi->sBand, psi->la); + } + + /* get sIndexMapped for this QMF subband */ + sIndexMapped = 0; + r = ((sbrFreq->freqHigh[psi->highBand + 1] + sbrFreq->freqHigh[psi->highBand]) >> 1); + if (m + sbrFreq->kStart == r) { + /* r = center frequency, deltaStep = (env >= la || sIndexMapped'(r, numEnv'-1) == 1) */ + if (env >= psi->la || sbrChan->addHarmonic[0][r] == 1) { + sIndexMapped = sbrChan->addHarmonic[1][psi->highBand]; + } + } + + /* save sine flags from last envelope in this frame: + addHarmonic[0][0...63] = saved sine present flag from previous frame, for each QMF subband + addHarmonic[1][0...nHigh-1] = addHarmonic bit from current frame, for each high-res frequency band + from MPEG reference code - slightly different from spec + (sIndexMapped'(m,LE'-1) can still be 0 when numEnv == psi->la) + */ + if (env == sbrGrid->numEnv - 1) { + if (m + sbrFreq->kStart == r) { + sbrChan->addHarmonic[0][m + sbrFreq->kStart] = sbrChan->addHarmonic[1][psi->highBand]; + } else { + sbrChan->addHarmonic[0][m + sbrFreq->kStart] = 0; + } + } + + gain = psi->envDataDequant[ch][env][psi->sBand]; + qm = MULSHIFT32(gain, psi->qqp1Inv) << 1; + sm = (sIndexMapped ? MULSHIFT32(gain, psi->qp1Inv) << 1 : 0); + + /* three cases: (sMapped == 0 && delta == 1), (sMapped == 0 && delta == 0), (sMapped == 1) */ + if (d == 1 && psi->sMapped == 0) { + gain = MULSHIFT32(psi->qp1Inv, gain) << 1; + } else if (psi->sMapped != 0) { + gain = MULSHIFT32(psi->qqp1Inv, gain) << 1; + } + + /* gain, qm, sm = Q(fbitsDQ), gainMax = Q(fbitsGainMax) */ + eCurr = psi->eCurr[m]; + if (eCurr) { + z = CLZ(eCurr) - 1; + r = InvRNormalized(eCurr << z); /* in = Q(z - eCurrExp), out = Q(29 + 31 - z + eCurrExp) */ + gainScale = MULSHIFT32(gain, r); /* out = Q(29 + 31 - z + eCurrExp + fbitsDQ - 32) */ + fbitsGain = 29 + 31 - z + psi->eCurrExp[m] + fbitsDQ - 32; + } else { + /* if eCurr == 0, then gain is unchanged (divide by EPS = 1) */ + gainScale = gain; + fbitsGain = fbitsDQ; + } + + /* see if gain for this band exceeds max gain */ + maxFlag = 0; + if (gainMax != (int)0x80000000) { + if (fbitsGain >= gainMaxFBits) { + shift = MIN(fbitsGain - gainMaxFBits, 31); + maxFlag = ((gainScale >> shift) > gainMax ? 1 : 0); + } else { + shift = MIN(gainMaxFBits - fbitsGain, 31); + maxFlag = (gainScale > (gainMax >> shift) ? 1 : 0); + } + } + + if (maxFlag) { + /* gainScale > gainMax, calculate ratio with 32/16 division */ + q = 0; + r = gainScale; /* guaranteed > 0, else maxFlag could not have been set */ + z = CLZ(r); + if (z < 16) { + q = 16 - z; + r >>= q; /* out = Q(fbitsGain - q) */ + } + + z = CLZ(gainMax) - 1; + r = (gainMax << z) / r; /* out = Q((fbitsGainMax + z) - (fbitsGain - q)) */ + q = (gainMaxFBits + z) - (fbitsGain - q); /* r = Q(q) */ + if (q > 30) { + r >>= MIN(q - 30, 31); + } else { + z = MIN(30 - q, 30); + CLIP_2N_SHIFT30(r, z); /* let r = Q30 since range = [0.0, 1.0) (clip to 0x3fffffff = 0.99999) */ + } + + qm = MULSHIFT32(qm, r) << 2; + gain = MULSHIFT32(gain, r) << 2; + psi->gLimBuf[m] = gainMax; + psi->gLimFbits[m] = gainMaxFBits; + } else { + psi->gLimBuf[m] = gainScale; + psi->gLimFbits[m] = fbitsGain; + } + + /* sumSM, sumQM, sumECurrGLim = Q(fbitsDQ - ACC_SCALE) */ + psi->smBuf[m] = sm; + psi->sumSM += (sm >> ACC_SCALE); + + psi->qmLimBuf[m] = qm; + if (env != psi->la && env != sbrChan->laPrev && sm == 0) { + psi->sumQM += (qm >> ACC_SCALE); + } + + /* eCurr * gain^2 same as gain^2, before division by eCurr + (but note that gain != 0 even if eCurr == 0, since it's divided by eps) + */ + if (eCurr) { + psi->sumECurrGLim += (gain >> ACC_SCALE); + } + } } /************************************************************************************** - * Function: ApplyBoost - * - * Description: calculate and apply boost factor for envelope, sinusoids, and noise - * in this limiter band (4.6.18.7.5) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRFreq struct for this SCE/CPE block - * index of current limiter band - * number of fraction bits in dequantized envelope - * - * Outputs: envelope gain, sinusoids and noise after scaling by gBoost - * format = Q(FBITS_GLIM_BOOST) for envelope gain, - * = Q(FBITS_QLIM_BOOST) for noise - * = Q(FBITS_OUT_QMFA) for sinusoids - * - * Return: none - * - * Notes: after scaling, each component has at least 1 GB + Function: ApplyBoost + + Description: calculate and apply boost factor for envelope, sinusoids, and noise + in this limiter band (4.6.18.7.5) + + Inputs: initialized PSInfoSBR struct + initialized SBRFreq struct for this SCE/CPE block + index of current limiter band + number of fraction bits in dequantized envelope + + Outputs: envelope gain, sinusoids and noise after scaling by gBoost + format = Q(FBITS_GLIM_BOOST) for envelope gain, + = Q(FBITS_QLIM_BOOST) for noise + = Q(FBITS_OUT_QMFA) for sinusoids + + Return: none + + Notes: after scaling, each component has at least 1 GB **************************************************************************************/ -static void ApplyBoost(PSInfoSBR *psi, SBRFreq *sbrFreq, int lim, int fbitsDQ) -{ - int m, mStart, mEnd, q, z, r; - int sumEOrigMapped, gBoost; - - mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ - mEnd = sbrFreq->freqLimiter[lim + 1]; - - sumEOrigMapped = psi->sumEOrigMapped >> 1; - r = (psi->sumECurrGLim >> 1) + (psi->sumSM >> 1) + (psi->sumQM >> 1); /* 1 GB fine (sm and qm are mutually exclusive in acc) */ - if (r < (1 << (31-28))) { - /* any non-zero numerator * 1/EPS_0 is > GBOOST_MAX - * round very small r to zero to avoid scaling problems - */ - gBoost = (sumEOrigMapped == 0 ? (1 << 28) : GBOOST_MAX); - z = 0; - } else if (sumEOrigMapped == 0) { - /* 1/(any non-zero denominator) * EPS_0 is appx. 0 */ - gBoost = 0; - z = 0; - } else { - /* numerator (sumEOrigMapped) and denominator (r) have same Q format (before << z) */ - z = CLZ(r) - 1; /* z = [0, 27] */ - r = InvRNormalized(r << z); - gBoost = MULSHIFT32(sumEOrigMapped, r); - } - - /* gBoost = Q(28 - z) */ - if (gBoost > (GBOOST_MAX >> z)) { - gBoost = GBOOST_MAX; - z = 0; - } - gBoost <<= z; /* gBoost = Q28, minimum 1 GB */ - - /* convert gain, noise, sinusoids to fixed Q format, clipping if necessary - * (rare, usually only happens at very low bitrates, introduces slight - * distortion into final HF mapping, but should be inaudible) - */ - for (m = mStart; m < mEnd; m++) { - /* let gLimBoost = Q24, since in practice the max values are usually 16 to 20 - * unless limiterGains == 3 (limiter off) and eCurr ~= 0 (i.e. huge gain, but only - * because the envelope has 0 power anyway) - */ - q = MULSHIFT32(psi->gLimBuf[m], gBoost) << 2; /* Q(gLimFbits) * Q(28) --> Q(gLimFbits[m]-2) */ - r = SqrtFix(q, psi->gLimFbits[m] - 2, &z); - z -= FBITS_GLIM_BOOST; - if (z >= 0) { - psi->gLimBoost[m] = r >> MIN(z, 31); - } else { - z = MIN(30, -z); - CLIP_2N_SHIFT30(r, z); - psi->gLimBoost[m] = r; - } - - q = MULSHIFT32(psi->qmLimBuf[m], gBoost) << 2; /* Q(fbitsDQ) * Q(28) --> Q(fbitsDQ-2) */ - r = SqrtFix(q, fbitsDQ - 2, &z); - z -= FBITS_QLIM_BOOST; /* << by 14, since integer sqrt of x < 2^16, and we want to leave 1 GB */ - if (z >= 0) { - psi->qmLimBoost[m] = r >> MIN(31, z); - } else { - z = MIN(30, -z); - CLIP_2N_SHIFT30(r, z); - psi->qmLimBoost[m] = r; - } - - q = MULSHIFT32(psi->smBuf[m], gBoost) << 2; /* Q(fbitsDQ) * Q(28) --> Q(fbitsDQ-2) */ - r = SqrtFix(q, fbitsDQ - 2, &z); - z -= FBITS_OUT_QMFA; /* justify for adding to signal (xBuf) later */ - if (z >= 0) { - psi->smBoost[m] = r >> MIN(31, z); - } else { - z = MIN(30, -z); - CLIP_2N_SHIFT30(r, z); - psi->smBoost[m] = r; - } - } +static void ApplyBoost(PSInfoSBR *psi, SBRFreq *sbrFreq, int lim, int fbitsDQ) { + int m, mStart, mEnd, q, z, r; + int sumEOrigMapped, gBoost; + + mStart = sbrFreq->freqLimiter[lim]; /* these are offsets from kStart */ + mEnd = sbrFreq->freqLimiter[lim + 1]; + + sumEOrigMapped = psi->sumEOrigMapped >> 1; + r = (psi->sumECurrGLim >> 1) + (psi->sumSM >> 1) + (psi->sumQM >> 1); /* 1 GB fine (sm and qm are mutually exclusive in acc) */ + if (r < (1 << (31 - 28))) { + /* any non-zero numerator * 1/EPS_0 is > GBOOST_MAX + round very small r to zero to avoid scaling problems + */ + gBoost = (sumEOrigMapped == 0 ? (1 << 28) : GBOOST_MAX); + z = 0; + } else if (sumEOrigMapped == 0) { + /* 1/(any non-zero denominator) * EPS_0 is appx. 0 */ + gBoost = 0; + z = 0; + } else { + /* numerator (sumEOrigMapped) and denominator (r) have same Q format (before << z) */ + z = CLZ(r) - 1; /* z = [0, 27] */ + r = InvRNormalized(r << z); + gBoost = MULSHIFT32(sumEOrigMapped, r); + } + + /* gBoost = Q(28 - z) */ + if (gBoost > (GBOOST_MAX >> z)) { + gBoost = GBOOST_MAX; + z = 0; + } + gBoost <<= z; /* gBoost = Q28, minimum 1 GB */ + + /* convert gain, noise, sinusoids to fixed Q format, clipping if necessary + (rare, usually only happens at very low bitrates, introduces slight + distortion into final HF mapping, but should be inaudible) + */ + for (m = mStart; m < mEnd; m++) { + /* let gLimBoost = Q24, since in practice the max values are usually 16 to 20 + unless limiterGains == 3 (limiter off) and eCurr ~= 0 (i.e. huge gain, but only + because the envelope has 0 power anyway) + */ + q = MULSHIFT32(psi->gLimBuf[m], gBoost) << 2; /* Q(gLimFbits) * Q(28) --> Q(gLimFbits[m]-2) */ + r = SqrtFix(q, psi->gLimFbits[m] - 2, &z); + z -= FBITS_GLIM_BOOST; + if (z >= 0) { + psi->gLimBoost[m] = r >> MIN(z, 31); + } else { + z = MIN(30, -z); + CLIP_2N_SHIFT30(r, z); + psi->gLimBoost[m] = r; + } + + q = MULSHIFT32(psi->qmLimBuf[m], gBoost) << 2; /* Q(fbitsDQ) * Q(28) --> Q(fbitsDQ-2) */ + r = SqrtFix(q, fbitsDQ - 2, &z); + z -= FBITS_QLIM_BOOST; /* << by 14, since integer sqrt of x < 2^16, and we want to leave 1 GB */ + if (z >= 0) { + psi->qmLimBoost[m] = r >> MIN(31, z); + } else { + z = MIN(30, -z); + CLIP_2N_SHIFT30(r, z); + psi->qmLimBoost[m] = r; + } + + q = MULSHIFT32(psi->smBuf[m], gBoost) << 2; /* Q(fbitsDQ) * Q(28) --> Q(fbitsDQ-2) */ + r = SqrtFix(q, fbitsDQ - 2, &z); + z -= FBITS_OUT_QMFA; /* justify for adding to signal (xBuf) later */ + if (z >= 0) { + psi->smBoost[m] = r >> MIN(31, z); + } else { + z = MIN(30, -z); + CLIP_2N_SHIFT30(r, z); + psi->smBoost[m] = r; + } + } } /************************************************************************************** - * Function: CalcGain - * - * Description: calculate and apply proper gain to HF components in one envelope - * (4.6.18.7.5) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * index of current envelope - * - * Outputs: envelope gain, sinusoids and noise after scaling - * - * Return: none + Function: CalcGain + + Description: calculate and apply proper gain to HF components in one envelope + (4.6.18.7.5) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + index of current envelope + + Outputs: envelope gain, sinusoids and noise after scaling + + Return: none **************************************************************************************/ -static void CalcGain(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch, int env) -{ - int lim, fbitsDQ; - - /* initialize to -1 so that mapping limiter bands to env/noise bands works right on first pass */ - psi->envBand = -1; - psi->noiseFloorBand = -1; - psi->sBand = -1; - psi->highBand = -1; - - fbitsDQ = (FBITS_OUT_DQ_ENV - psi->envDataDequantScale[ch][env]); /* Q(29 - optional scalefactor) */ - for (lim = 0; lim < sbrFreq->nLimiter; lim++) { - /* the QMF bands are divided into lim regions (consecutive, non-overlapping) */ - CalcMaxGain(psi, sbrHdr, sbrGrid, sbrFreq, ch, env, lim, fbitsDQ); - CalcComponentGains(psi, sbrGrid, sbrFreq, sbrChan, ch, env, lim, fbitsDQ); - ApplyBoost(psi, sbrFreq, lim, fbitsDQ); - } +static void CalcGain(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch, int env) { + int lim, fbitsDQ; + + /* initialize to -1 so that mapping limiter bands to env/noise bands works right on first pass */ + psi->envBand = -1; + psi->noiseFloorBand = -1; + psi->sBand = -1; + psi->highBand = -1; + + fbitsDQ = (FBITS_OUT_DQ_ENV - psi->envDataDequantScale[ch][env]); /* Q(29 - optional scalefactor) */ + for (lim = 0; lim < sbrFreq->nLimiter; lim++) { + /* the QMF bands are divided into lim regions (consecutive, non-overlapping) */ + CalcMaxGain(psi, sbrHdr, sbrGrid, sbrFreq, ch, env, lim, fbitsDQ); + CalcComponentGains(psi, sbrGrid, sbrFreq, sbrChan, ch, env, lim, fbitsDQ); + ApplyBoost(psi, sbrFreq, lim, fbitsDQ); + } } /* hSmooth table from 4.7.18.7.6, format = Q31 */ static const int hSmoothCoef[MAX_NUM_SMOOTH_COEFS] PROGMEM = { - 0x2aaaaaab, 0x2697a512, 0x1becfa68, 0x0ebdb043, 0x04130598, + 0x2aaaaaab, 0x2697a512, 0x1becfa68, 0x0ebdb043, 0x04130598, }; /************************************************************************************** - * Function: MapHF - * - * Description: map HF components to proper QMF bands, with optional gain smoothing - * filter (4.6.18.7.6) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current envelope - * reset flag (can be non-zero for first envelope only) - * - * Outputs: complete reconstructed subband QMF samples for this envelope - * - * Return: none - * - * Notes: ensures that output has >= MIN_GBITS_IN_QMFS guard bits, - * so it's not necessary to check anything in the synth QMF + Function: MapHF + + Description: map HF components to proper QMF bands, with optional gain smoothing + filter (4.6.18.7.6) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current envelope + reset flag (can be non-zero for first envelope only) + + Outputs: complete reconstructed subband QMF samples for this envelope + + Return: none + + Notes: ensures that output has >= MIN_GBITS_IN_QMFS guard bits, + so it's not necessary to check anything in the synth QMF **************************************************************************************/ -static void MapHF(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int env, int hfReset) -{ - int noiseTabIndex, sinIndex, gainNoiseIndex, hSL; - int i, iStart, iEnd, m, idx, j, s, n, smre, smim; - int gFilt, qFilt, xre, xim, gbMask, gbIdx; - int *XBuf; - - noiseTabIndex = sbrChan->noiseTabIndex; - sinIndex = sbrChan->sinIndex; - gainNoiseIndex = sbrChan->gainNoiseIndex; /* oldest entries in filter delay buffer */ - - if (hfReset) - noiseTabIndex = 2; /* starts at 1, double since complex */ - hSL = (sbrHdr->smoothMode ? 0 : 4); - - if (hfReset) { - for (i = 0; i < hSL; i++) { - for (m = 0; m < sbrFreq->numQMFBands; m++) { - sbrChan->gTemp[gainNoiseIndex][m] = psi->gLimBoost[m]; - sbrChan->qTemp[gainNoiseIndex][m] = psi->qmLimBoost[m]; - } - gainNoiseIndex++; - if (gainNoiseIndex == MAX_NUM_SMOOTH_COEFS) - gainNoiseIndex = 0; - } - ASSERT(env == 0); /* should only be reset when env == 0 */ - } - - iStart = sbrGrid->envTimeBorder[env]; - iEnd = sbrGrid->envTimeBorder[env+1]; - for (i = iStart; i < iEnd; i++) { - /* save new values in temp buffers (delay) - * we only store MAX_NUM_SMOOTH_COEFS most recent values, - * so don't keep storing the same value over and over - */ - if (i - iStart < MAX_NUM_SMOOTH_COEFS) { - for (m = 0; m < sbrFreq->numQMFBands; m++) { - sbrChan->gTemp[gainNoiseIndex][m] = psi->gLimBoost[m]; - sbrChan->qTemp[gainNoiseIndex][m] = psi->qmLimBoost[m]; - } - } - - /* see 4.6.18.7.6 */ - XBuf = psi->XBuf[i + HF_ADJ][sbrFreq->kStart]; - gbMask = 0; - for (m = 0; m < sbrFreq->numQMFBands; m++) { - if (env == psi->la || env == sbrChan->laPrev) { - /* no smoothing filter for gain, and qFilt = 0 (only need to do once) */ - if (i == iStart) { - psi->gFiltLast[m] = sbrChan->gTemp[gainNoiseIndex][m]; - psi->qFiltLast[m] = 0; - } - } else if (hSL == 0) { - /* no smoothing filter for gain, (only need to do once) */ - if (i == iStart) { - psi->gFiltLast[m] = sbrChan->gTemp[gainNoiseIndex][m]; - psi->qFiltLast[m] = sbrChan->qTemp[gainNoiseIndex][m]; - } - } else { - /* apply smoothing filter to gain and noise (after MAX_NUM_SMOOTH_COEFS, it's always the same) */ - if (i - iStart < MAX_NUM_SMOOTH_COEFS) { - gFilt = 0; - qFilt = 0; - idx = gainNoiseIndex; - for (j = 0; j < MAX_NUM_SMOOTH_COEFS; j++) { - /* sum(abs(hSmoothCoef[j])) for all j < 1.0 */ - gFilt += MULSHIFT32(sbrChan->gTemp[idx][m], hSmoothCoef[j]); - qFilt += MULSHIFT32(sbrChan->qTemp[idx][m], hSmoothCoef[j]); - idx--; - if (idx < 0) - idx += MAX_NUM_SMOOTH_COEFS; - } - psi->gFiltLast[m] = gFilt << 1; /* restore to Q(FBITS_GLIM_BOOST) (gain of filter < 1.0, so no overflow) */ - psi->qFiltLast[m] = qFilt << 1; /* restore to Q(FBITS_QLIM_BOOST) */ - } - } - - if (psi->smBoost[m] != 0) { - /* add scaled signal and sinusoid, don't add noise (qFilt = 0) */ - smre = psi->smBoost[m]; - smim = smre; - - /* sinIndex: [0] xre += sm [1] xim += sm*s [2] xre -= sm [3] xim -= sm*s */ - s = (sinIndex >> 1); /* if 2 or 3, flip sign to subtract sm */ - s <<= 31; - smre ^= (s >> 31); - smre -= (s >> 31); - s ^= ((m + sbrFreq->kStart) << 31); - smim ^= (s >> 31); - smim -= (s >> 31); - - /* if sinIndex == 0 or 2, smim = 0; if sinIndex == 1 or 3, smre = 0 */ - s = sinIndex << 31; - smim &= (s >> 31); - s ^= 0x80000000; - smre &= (s >> 31); - - noiseTabIndex += 2; /* noise filtered by 0, but still need to bump index */ - } else { - /* add scaled signal and scaled noise */ - qFilt = psi->qFiltLast[m]; - n = noiseTab[noiseTabIndex++]; - smre = MULSHIFT32(n, qFilt) >> (FBITS_QLIM_BOOST - 1 - FBITS_OUT_QMFA); - - n = noiseTab[noiseTabIndex++]; - smim = MULSHIFT32(n, qFilt) >> (FBITS_QLIM_BOOST - 1 - FBITS_OUT_QMFA); - } - noiseTabIndex &= 1023; /* 512 complex numbers */ - - gFilt = psi->gFiltLast[m]; - xre = MULSHIFT32(gFilt, XBuf[0]); - xim = MULSHIFT32(gFilt, XBuf[1]); - CLIP_2N_SHIFT30(xre, 32 - FBITS_GLIM_BOOST); - CLIP_2N_SHIFT30(xim, 32 - FBITS_GLIM_BOOST); - - xre += smre; *XBuf++ = xre; - xim += smim; *XBuf++ = xim; - - gbMask |= FASTABS(xre); - gbMask |= FASTABS(xim); - } - /* update circular buffer index */ - gainNoiseIndex++; - if (gainNoiseIndex == MAX_NUM_SMOOTH_COEFS) - gainNoiseIndex = 0; - - sinIndex++; - sinIndex &= 3; - - /* ensure MIN_GBITS_IN_QMFS guard bits in output - * almost never occurs in practice, but checking here makes synth QMF logic very simple - */ - if (gbMask >> (31 - MIN_GBITS_IN_QMFS)) { - XBuf = psi->XBuf[i + HF_ADJ][sbrFreq->kStart]; - for (m = 0; m < sbrFreq->numQMFBands; m++) { - xre = XBuf[0]; xim = XBuf[1]; - CLIP_2N(xre, (31 - MIN_GBITS_IN_QMFS)); - CLIP_2N(xim, (31 - MIN_GBITS_IN_QMFS)); - *XBuf++ = xre; *XBuf++ = xim; - } - CLIP_2N(gbMask, (31 - MIN_GBITS_IN_QMFS)); - } - gbIdx = ((i + HF_ADJ) >> 5) & 0x01; - sbrChan->gbMask[gbIdx] |= gbMask; - } - sbrChan->noiseTabIndex = noiseTabIndex; - sbrChan->sinIndex = sinIndex; - sbrChan->gainNoiseIndex = gainNoiseIndex; +static void MapHF(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int env, int hfReset) { + int noiseTabIndex, sinIndex, gainNoiseIndex, hSL; + int i, iStart, iEnd, m, idx, j, s, n, smre, smim; + int gFilt, qFilt, xre, xim, gbMask, gbIdx; + int *XBuf; + + noiseTabIndex = sbrChan->noiseTabIndex; + sinIndex = sbrChan->sinIndex; + gainNoiseIndex = sbrChan->gainNoiseIndex; /* oldest entries in filter delay buffer */ + + if (hfReset) { + noiseTabIndex = 2; /* starts at 1, double since complex */ + } + hSL = (sbrHdr->smoothMode ? 0 : 4); + + if (hfReset) { + for (i = 0; i < hSL; i++) { + for (m = 0; m < sbrFreq->numQMFBands; m++) { + sbrChan->gTemp[gainNoiseIndex][m] = psi->gLimBoost[m]; + sbrChan->qTemp[gainNoiseIndex][m] = psi->qmLimBoost[m]; + } + gainNoiseIndex++; + if (gainNoiseIndex == MAX_NUM_SMOOTH_COEFS) { + gainNoiseIndex = 0; + } + } + ASSERT(env == 0); /* should only be reset when env == 0 */ + } + + iStart = sbrGrid->envTimeBorder[env]; + iEnd = sbrGrid->envTimeBorder[env + 1]; + for (i = iStart; i < iEnd; i++) { + /* save new values in temp buffers (delay) + we only store MAX_NUM_SMOOTH_COEFS most recent values, + so don't keep storing the same value over and over + */ + if (i - iStart < MAX_NUM_SMOOTH_COEFS) { + for (m = 0; m < sbrFreq->numQMFBands; m++) { + sbrChan->gTemp[gainNoiseIndex][m] = psi->gLimBoost[m]; + sbrChan->qTemp[gainNoiseIndex][m] = psi->qmLimBoost[m]; + } + } + + /* see 4.6.18.7.6 */ + XBuf = psi->XBuf[i + HF_ADJ][sbrFreq->kStart]; + gbMask = 0; + for (m = 0; m < sbrFreq->numQMFBands; m++) { + if (env == psi->la || env == sbrChan->laPrev) { + /* no smoothing filter for gain, and qFilt = 0 (only need to do once) */ + if (i == iStart) { + psi->gFiltLast[m] = sbrChan->gTemp[gainNoiseIndex][m]; + psi->qFiltLast[m] = 0; + } + } else if (hSL == 0) { + /* no smoothing filter for gain, (only need to do once) */ + if (i == iStart) { + psi->gFiltLast[m] = sbrChan->gTemp[gainNoiseIndex][m]; + psi->qFiltLast[m] = sbrChan->qTemp[gainNoiseIndex][m]; + } + } else { + /* apply smoothing filter to gain and noise (after MAX_NUM_SMOOTH_COEFS, it's always the same) */ + if (i - iStart < MAX_NUM_SMOOTH_COEFS) { + gFilt = 0; + qFilt = 0; + idx = gainNoiseIndex; + for (j = 0; j < MAX_NUM_SMOOTH_COEFS; j++) { + /* sum(abs(hSmoothCoef[j])) for all j < 1.0 */ + gFilt += MULSHIFT32(sbrChan->gTemp[idx][m], hSmoothCoef[j]); + qFilt += MULSHIFT32(sbrChan->qTemp[idx][m], hSmoothCoef[j]); + idx--; + if (idx < 0) { + idx += MAX_NUM_SMOOTH_COEFS; + } + } + psi->gFiltLast[m] = gFilt << 1; /* restore to Q(FBITS_GLIM_BOOST) (gain of filter < 1.0, so no overflow) */ + psi->qFiltLast[m] = qFilt << 1; /* restore to Q(FBITS_QLIM_BOOST) */ + } + } + + if (psi->smBoost[m] != 0) { + /* add scaled signal and sinusoid, don't add noise (qFilt = 0) */ + smre = psi->smBoost[m]; + smim = smre; + + /* sinIndex: [0] xre += sm [1] xim += sm*s [2] xre -= sm [3] xim -= sm*s */ + s = (sinIndex >> 1); /* if 2 or 3, flip sign to subtract sm */ + s <<= 31; + smre ^= (s >> 31); + smre -= (s >> 31); + s ^= ((m + sbrFreq->kStart) << 31); + smim ^= (s >> 31); + smim -= (s >> 31); + + /* if sinIndex == 0 or 2, smim = 0; if sinIndex == 1 or 3, smre = 0 */ + s = sinIndex << 31; + smim &= (s >> 31); + s ^= 0x80000000; + smre &= (s >> 31); + + noiseTabIndex += 2; /* noise filtered by 0, but still need to bump index */ + } else { + /* add scaled signal and scaled noise */ + qFilt = psi->qFiltLast[m]; + n = noiseTab[noiseTabIndex++]; + smre = MULSHIFT32(n, qFilt) >> (FBITS_QLIM_BOOST - 1 - FBITS_OUT_QMFA); + + n = noiseTab[noiseTabIndex++]; + smim = MULSHIFT32(n, qFilt) >> (FBITS_QLIM_BOOST - 1 - FBITS_OUT_QMFA); + } + noiseTabIndex &= 1023; /* 512 complex numbers */ + + gFilt = psi->gFiltLast[m]; + xre = MULSHIFT32(gFilt, XBuf[0]); + xim = MULSHIFT32(gFilt, XBuf[1]); + CLIP_2N_SHIFT30(xre, 32 - FBITS_GLIM_BOOST); + CLIP_2N_SHIFT30(xim, 32 - FBITS_GLIM_BOOST); + + xre += smre; *XBuf++ = xre; + xim += smim; *XBuf++ = xim; + + gbMask |= FASTABS(xre); + gbMask |= FASTABS(xim); + } + /* update circular buffer index */ + gainNoiseIndex++; + if (gainNoiseIndex == MAX_NUM_SMOOTH_COEFS) { + gainNoiseIndex = 0; + } + + sinIndex++; + sinIndex &= 3; + + /* ensure MIN_GBITS_IN_QMFS guard bits in output + almost never occurs in practice, but checking here makes synth QMF logic very simple + */ + if (gbMask >> (31 - MIN_GBITS_IN_QMFS)) { + XBuf = psi->XBuf[i + HF_ADJ][sbrFreq->kStart]; + for (m = 0; m < sbrFreq->numQMFBands; m++) { + xre = XBuf[0]; xim = XBuf[1]; + CLIP_2N(xre, (31 - MIN_GBITS_IN_QMFS)); + CLIP_2N(xim, (31 - MIN_GBITS_IN_QMFS)); + *XBuf++ = xre; *XBuf++ = xim; + } + CLIP_2N(gbMask, (31 - MIN_GBITS_IN_QMFS)); + } + gbIdx = ((i + HF_ADJ) >> 5) & 0x01; + sbrChan->gbMask[gbIdx] |= gbMask; + } + sbrChan->noiseTabIndex = noiseTabIndex; + sbrChan->sinIndex = sinIndex; + sbrChan->gainNoiseIndex = gainNoiseIndex; } /************************************************************************************** - * Function: AdjustHighFreq - * - * Description: adjust high frequencies and add noise and sinusoids (4.6.18.7) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRHeader struct for this SCE/CPE block - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * - * Outputs: complete reconstructed subband QMF samples for this channel - * - * Return: none + Function: AdjustHighFreq + + Description: adjust high frequencies and add noise and sinusoids (4.6.18.7) + + Inputs: initialized PSInfoSBR struct + initialized SBRHeader struct for this SCE/CPE block + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + + Outputs: complete reconstructed subband QMF samples for this channel + + Return: none **************************************************************************************/ -void AdjustHighFreq(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) -{ - int i, env, hfReset; - unsigned char frameClass, pointer; - - frameClass = sbrGrid->frameClass; - pointer = sbrGrid->pointer; - - /* derive la from table 4.159 */ - if ((frameClass == SBR_GRID_FIXVAR || frameClass == SBR_GRID_VARVAR) && pointer > 0) - psi->la = sbrGrid->numEnv + 1 - pointer; - else if (frameClass == SBR_GRID_VARFIX && pointer > 1) - psi->la = pointer - 1; - else - psi->la = -1; - - /* for each envelope, estimate gain and adjust SBR QMF bands */ - hfReset = sbrChan->reset; - for (env = 0; env < sbrGrid->numEnv; env++) { - EstimateEnvelope(psi, sbrHdr, sbrGrid, sbrFreq, env); - CalcGain(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, ch, env); - MapHF(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, env, hfReset); - hfReset = 0; /* only set for first envelope after header reset */ - } - - /* set saved sine flags to 0 for QMF bands outside of current frequency range */ - for (i = 0; i < sbrFreq->freqLimiter[0] + sbrFreq->kStart; i++) - sbrChan->addHarmonic[0][i] = 0; - for (i = sbrFreq->freqLimiter[sbrFreq->nLimiter] + sbrFreq->kStart; i < 64; i++) - sbrChan->addHarmonic[0][i] = 0; - sbrChan->addHarmonicFlag[0] = sbrChan->addHarmonicFlag[1]; - - /* save la for next frame */ - if (psi->la == sbrGrid->numEnv) - sbrChan->laPrev = 0; - else - sbrChan->laPrev = -1; +void AdjustHighFreq(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) { + int i, env, hfReset; + unsigned char frameClass, pointer; + + frameClass = sbrGrid->frameClass; + pointer = sbrGrid->pointer; + + /* derive la from table 4.159 */ + if ((frameClass == SBR_GRID_FIXVAR || frameClass == SBR_GRID_VARVAR) && pointer > 0) { + psi->la = sbrGrid->numEnv + 1 - pointer; + } else if (frameClass == SBR_GRID_VARFIX && pointer > 1) { + psi->la = pointer - 1; + } else { + psi->la = -1; + } + + /* for each envelope, estimate gain and adjust SBR QMF bands */ + hfReset = sbrChan->reset; + for (env = 0; env < sbrGrid->numEnv; env++) { + EstimateEnvelope(psi, sbrHdr, sbrGrid, sbrFreq, env); + CalcGain(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, ch, env); + MapHF(psi, sbrHdr, sbrGrid, sbrFreq, sbrChan, env, hfReset); + hfReset = 0; /* only set for first envelope after header reset */ + } + + /* set saved sine flags to 0 for QMF bands outside of current frequency range */ + for (i = 0; i < sbrFreq->freqLimiter[0] + sbrFreq->kStart; i++) { + sbrChan->addHarmonic[0][i] = 0; + } + for (i = sbrFreq->freqLimiter[sbrFreq->nLimiter] + sbrFreq->kStart; i < 64; i++) { + sbrChan->addHarmonic[0][i] = 0; + } + sbrChan->addHarmonicFlag[0] = sbrChan->addHarmonicFlag[1]; + + /* save la for next frame */ + if (psi->la == sbrGrid->numEnv) { + sbrChan->laPrev = 0; + } else { + sbrChan->laPrev = -1; + } } diff --git a/src/libhelix-aac/sbrhfgen.c b/src/libhelix-aac/sbrhfgen.c index 7ebc047a..360ac317 100644 --- a/src/libhelix-aac/sbrhfgen.c +++ b/src/libhelix-aac/sbrhfgen.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrhfgen.c,v 1.2 2005/05/19 20:45:20 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrhfgen.c,v 1.2 2005/05/19 20:45:20 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrhfgen.c - high frequency generation for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrhfgen.c - high frequency generation for SBR **************************************************************************************/ #include "sbr.h" @@ -50,567 +50,564 @@ #define MAG_16 (16 * (1 << (32 - (2*(32-FBITS_LPCOEFS))))) /* i.e. 16 in Q26 format */ #define RELAX_COEF 0x7ffff79c /* 1.0 / (1.0 + 1e-6), Q31 */ -/* newBWTab[prev invfMode][curr invfMode], format = Q31 (table 4.158) - * sample file which uses all of these: al_sbr_sr_64_2_fsaac32.aac - */ +/* newBWTab[prev invfMode][curr invfMode], format = Q31 (table 4.158) + sample file which uses all of these: al_sbr_sr_64_2_fsaac32.aac +*/ static const int newBWTab[4][4] PROGMEM = { - {0x00000000, 0x4ccccccd, 0x73333333, 0x7d70a3d7}, - {0x4ccccccd, 0x60000000, 0x73333333, 0x7d70a3d7}, - {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}, - {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}, + {0x00000000, 0x4ccccccd, 0x73333333, 0x7d70a3d7}, + {0x4ccccccd, 0x60000000, 0x73333333, 0x7d70a3d7}, + {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}, + {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}, }; /************************************************************************************** - * Function: CVKernel1 - * - * Description: kernel of covariance matrix calculation for p01, p11, p12, p22 - * - * Inputs: buffer of low-freq samples, starting at time index = 0, - * freq index = patch subband - * - * Outputs: 64-bit accumulators for p01re, p01im, p12re, p12im, p11re, p22re - * stored in accBuf - * - * Return: none - * - * Notes: this is carefully written to be efficient on ARM - * use the assembly code version in sbrcov.s when building for ARM! + Function: CVKernel1 + + Description: kernel of covariance matrix calculation for p01, p11, p12, p22 + + Inputs: buffer of low-freq samples, starting at time index = 0, + freq index = patch subband + + Outputs: 64-bit accumulators for p01re, p01im, p12re, p12im, p11re, p22re + stored in accBuf + + Return: none + + Notes: this is carefully written to be efficient on ARM + use the assembly code version in sbrcov.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +#if (defined (XXXX__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(XXXX__arm__)) #ifdef __cplusplus extern "C" #endif void CVKernel1(int *XBuf, int *accBuf); #else -void CVKernel1(int *XBuf, int *accBuf) -{ - U64 p01re, p01im, p12re, p12im, p11re, p22re; - int n, x0re, x0im, x1re, x1im; - - x0re = XBuf[0]; - x0im = XBuf[1]; - XBuf += (2*64); - x1re = XBuf[0]; - x1im = XBuf[1]; - XBuf += (2*64); - - p01re.w64 = p01im.w64 = 0; - p12re.w64 = p12im.w64 = 0; - p11re.w64 = 0; - p22re.w64 = 0; - - p12re.w64 = MADD64(p12re.w64, x1re, x0re); - p12re.w64 = MADD64(p12re.w64, x1im, x0im); - p12im.w64 = MADD64(p12im.w64, x0re, x1im); - p12im.w64 = MADD64(p12im.w64, -x0im, x1re); - p22re.w64 = MADD64(p22re.w64, x0re, x0re); - p22re.w64 = MADD64(p22re.w64, x0im, x0im); - for (n = (NUM_TIME_SLOTS*SAMPLES_PER_SLOT + 6); n != 0; n--) { - /* 4 input, 3*2 acc, 1 ptr, 1 loop counter = 12 registers (use same for x0im, -x0im) */ - x0re = x1re; - x0im = x1im; - x1re = XBuf[0]; - x1im = XBuf[1]; - - p01re.w64 = MADD64(p01re.w64, x1re, x0re); - p01re.w64 = MADD64(p01re.w64, x1im, x0im); - p01im.w64 = MADD64(p01im.w64, x0re, x1im); - p01im.w64 = MADD64(p01im.w64, -x0im, x1re); - p11re.w64 = MADD64(p11re.w64, x0re, x0re); - p11re.w64 = MADD64(p11re.w64, x0im, x0im); - - XBuf += (2*64); - } - /* these can be derived by slight changes to account for boundary conditions */ - p12re.w64 += p01re.w64; - p12re.w64 = MADD64(p12re.w64, x1re, -x0re); - p12re.w64 = MADD64(p12re.w64, x1im, -x0im); - p12im.w64 += p01im.w64; - p12im.w64 = MADD64(p12im.w64, x0re, -x1im); - p12im.w64 = MADD64(p12im.w64, x0im, x1re); - p22re.w64 += p11re.w64; - p22re.w64 = MADD64(p22re.w64, x0re, -x0re); - p22re.w64 = MADD64(p22re.w64, x0im, -x0im); - - accBuf[0] = p01re.r.lo32; accBuf[1] = p01re.r.hi32; - accBuf[2] = p01im.r.lo32; accBuf[3] = p01im.r.hi32; - accBuf[4] = p11re.r.lo32; accBuf[5] = p11re.r.hi32; - accBuf[6] = p12re.r.lo32; accBuf[7] = p12re.r.hi32; - accBuf[8] = p12im.r.lo32; accBuf[9] = p12im.r.hi32; - accBuf[10] = p22re.r.lo32; accBuf[11] = p22re.r.hi32; +void CVKernel1(int *XBuf, int *accBuf) { + U64 p01re, p01im, p12re, p12im, p11re, p22re; + int n, x0re, x0im, x1re, x1im; + + x0re = XBuf[0]; + x0im = XBuf[1]; + XBuf += (2 * 64); + x1re = XBuf[0]; + x1im = XBuf[1]; + XBuf += (2 * 64); + + p01re.w64 = p01im.w64 = 0; + p12re.w64 = p12im.w64 = 0; + p11re.w64 = 0; + p22re.w64 = 0; + + p12re.w64 = MADD64(p12re.w64, x1re, x0re); + p12re.w64 = MADD64(p12re.w64, x1im, x0im); + p12im.w64 = MADD64(p12im.w64, x0re, x1im); + p12im.w64 = MADD64(p12im.w64, -x0im, x1re); + p22re.w64 = MADD64(p22re.w64, x0re, x0re); + p22re.w64 = MADD64(p22re.w64, x0im, x0im); + for (n = (NUM_TIME_SLOTS * SAMPLES_PER_SLOT + 6); n != 0; n--) { + /* 4 input, 3*2 acc, 1 ptr, 1 loop counter = 12 registers (use same for x0im, -x0im) */ + x0re = x1re; + x0im = x1im; + x1re = XBuf[0]; + x1im = XBuf[1]; + + p01re.w64 = MADD64(p01re.w64, x1re, x0re); + p01re.w64 = MADD64(p01re.w64, x1im, x0im); + p01im.w64 = MADD64(p01im.w64, x0re, x1im); + p01im.w64 = MADD64(p01im.w64, -x0im, x1re); + p11re.w64 = MADD64(p11re.w64, x0re, x0re); + p11re.w64 = MADD64(p11re.w64, x0im, x0im); + + XBuf += (2 * 64); + } + /* these can be derived by slight changes to account for boundary conditions */ + p12re.w64 += p01re.w64; + p12re.w64 = MADD64(p12re.w64, x1re, -x0re); + p12re.w64 = MADD64(p12re.w64, x1im, -x0im); + p12im.w64 += p01im.w64; + p12im.w64 = MADD64(p12im.w64, x0re, -x1im); + p12im.w64 = MADD64(p12im.w64, x0im, x1re); + p22re.w64 += p11re.w64; + p22re.w64 = MADD64(p22re.w64, x0re, -x0re); + p22re.w64 = MADD64(p22re.w64, x0im, -x0im); + + accBuf[0] = p01re.r.lo32; accBuf[1] = p01re.r.hi32; + accBuf[2] = p01im.r.lo32; accBuf[3] = p01im.r.hi32; + accBuf[4] = p11re.r.lo32; accBuf[5] = p11re.r.hi32; + accBuf[6] = p12re.r.lo32; accBuf[7] = p12re.r.hi32; + accBuf[8] = p12im.r.lo32; accBuf[9] = p12im.r.hi32; + accBuf[10] = p22re.r.lo32; accBuf[11] = p22re.r.hi32; } #endif /************************************************************************************** - * Function: CalcCovariance1 - * - * Description: calculate covariance matrix for p01, p12, p11, p22 (4.6.18.6.2) - * - * Inputs: buffer of low-freq samples, starting at time index 0, - * freq index = patch subband - * - * Outputs: complex covariance elements p01re, p01im, p12re, p12im, p11re, p22re - * (p11im = p22im = 0) - * format = integer (Q0) * 2^N, with scalefactor N >= 0 - * - * Return: scalefactor N - * - * Notes: outputs are normalized to have 1 GB (sign in at least top 2 bits) + Function: CalcCovariance1 + + Description: calculate covariance matrix for p01, p12, p11, p22 (4.6.18.6.2) + + Inputs: buffer of low-freq samples, starting at time index 0, + freq index = patch subband + + Outputs: complex covariance elements p01re, p01im, p12re, p12im, p11re, p22re + (p11im = p22im = 0) + format = integer (Q0) * 2^N, with scalefactor N >= 0 + + Return: scalefactor N + + Notes: outputs are normalized to have 1 GB (sign in at least top 2 bits) **************************************************************************************/ -static int CalcCovariance1(int *XBuf, int *p01reN, int *p01imN, int *p12reN, int *p12imN, int *p11reN, int *p22reN) -{ - int accBuf[2*6]; - int n, z, s, loShift, hiShift, gbMask; - U64 p01re, p01im, p12re, p12im, p11re, p22re; - - CVKernel1(XBuf, accBuf); - p01re.r.lo32 = accBuf[0]; p01re.r.hi32 = accBuf[1]; - p01im.r.lo32 = accBuf[2]; p01im.r.hi32 = accBuf[3]; - p11re.r.lo32 = accBuf[4]; p11re.r.hi32 = accBuf[5]; - p12re.r.lo32 = accBuf[6]; p12re.r.hi32 = accBuf[7]; - p12im.r.lo32 = accBuf[8]; p12im.r.hi32 = accBuf[9]; - p22re.r.lo32 = accBuf[10]; p22re.r.hi32 = accBuf[11]; - - /* 64-bit accumulators now have 2*FBITS_OUT_QMFA fraction bits - * want to scale them down to integers (32-bit signed, Q0) - * with scale factor of 2^n, n >= 0 - * leave 2 GB's for calculating determinant, so take top 30 non-zero bits - */ - gbMask = ((p01re.r.hi32) ^ (p01re.r.hi32 >> 31)) | ((p01im.r.hi32) ^ (p01im.r.hi32 >> 31)); - gbMask |= ((p12re.r.hi32) ^ (p12re.r.hi32 >> 31)) | ((p12im.r.hi32) ^ (p12im.r.hi32 >> 31)); - gbMask |= ((p11re.r.hi32) ^ (p11re.r.hi32 >> 31)) | ((p22re.r.hi32) ^ (p22re.r.hi32 >> 31)); - if (gbMask == 0) { - s = p01re.r.hi32 >> 31; gbMask = (p01re.r.lo32 ^ s) - s; - s = p01im.r.hi32 >> 31; gbMask |= (p01im.r.lo32 ^ s) - s; - s = p12re.r.hi32 >> 31; gbMask |= (p12re.r.lo32 ^ s) - s; - s = p12im.r.hi32 >> 31; gbMask |= (p12im.r.lo32 ^ s) - s; - s = p11re.r.hi32 >> 31; gbMask |= (p11re.r.lo32 ^ s) - s; - s = p22re.r.hi32 >> 31; gbMask |= (p22re.r.lo32 ^ s) - s; - z = 32 + CLZ(gbMask); - } else { - gbMask = FASTABS(p01re.r.hi32) | FASTABS(p01im.r.hi32); - gbMask |= FASTABS(p12re.r.hi32) | FASTABS(p12im.r.hi32); - gbMask |= FASTABS(p11re.r.hi32) | FASTABS(p22re.r.hi32); - z = CLZ(gbMask); - } - - n = 64 - z; /* number of non-zero bits in bottom of 64-bit word */ - if (n <= 30) { - loShift = (30 - n); - *p01reN = p01re.r.lo32 << loShift; *p01imN = p01im.r.lo32 << loShift; - *p12reN = p12re.r.lo32 << loShift; *p12imN = p12im.r.lo32 << loShift; - *p11reN = p11re.r.lo32 << loShift; *p22reN = p22re.r.lo32 << loShift; - return -(loShift + 2*FBITS_OUT_QMFA); - } else if (n < 32 + 30) { - loShift = (n - 30); - hiShift = 32 - loShift; - *p01reN = (p01re.r.hi32 << hiShift) | (p01re.r.lo32 >> loShift); - *p01imN = (p01im.r.hi32 << hiShift) | (p01im.r.lo32 >> loShift); - *p12reN = (p12re.r.hi32 << hiShift) | (p12re.r.lo32 >> loShift); - *p12imN = (p12im.r.hi32 << hiShift) | (p12im.r.lo32 >> loShift); - *p11reN = (p11re.r.hi32 << hiShift) | (p11re.r.lo32 >> loShift); - *p22reN = (p22re.r.hi32 << hiShift) | (p22re.r.lo32 >> loShift); - return (loShift - 2*FBITS_OUT_QMFA); - } else { - hiShift = n - (32 + 30); - *p01reN = p01re.r.hi32 >> hiShift; *p01imN = p01im.r.hi32 >> hiShift; - *p12reN = p12re.r.hi32 >> hiShift; *p12imN = p12im.r.hi32 >> hiShift; - *p11reN = p11re.r.hi32 >> hiShift; *p22reN = p22re.r.hi32 >> hiShift; - return (32 - 2*FBITS_OUT_QMFA - hiShift); - } - - return 0; +static int CalcCovariance1(int *XBuf, int *p01reN, int *p01imN, int *p12reN, int *p12imN, int *p11reN, int *p22reN) { + int accBuf[2 * 6]; + int n, z, s, loShift, hiShift, gbMask; + U64 p01re, p01im, p12re, p12im, p11re, p22re; + + CVKernel1(XBuf, accBuf); + p01re.r.lo32 = accBuf[0]; p01re.r.hi32 = accBuf[1]; + p01im.r.lo32 = accBuf[2]; p01im.r.hi32 = accBuf[3]; + p11re.r.lo32 = accBuf[4]; p11re.r.hi32 = accBuf[5]; + p12re.r.lo32 = accBuf[6]; p12re.r.hi32 = accBuf[7]; + p12im.r.lo32 = accBuf[8]; p12im.r.hi32 = accBuf[9]; + p22re.r.lo32 = accBuf[10]; p22re.r.hi32 = accBuf[11]; + + /* 64-bit accumulators now have 2*FBITS_OUT_QMFA fraction bits + want to scale them down to integers (32-bit signed, Q0) + with scale factor of 2^n, n >= 0 + leave 2 GB's for calculating determinant, so take top 30 non-zero bits + */ + gbMask = ((p01re.r.hi32) ^ (p01re.r.hi32 >> 31)) | ((p01im.r.hi32) ^ (p01im.r.hi32 >> 31)); + gbMask |= ((p12re.r.hi32) ^ (p12re.r.hi32 >> 31)) | ((p12im.r.hi32) ^ (p12im.r.hi32 >> 31)); + gbMask |= ((p11re.r.hi32) ^ (p11re.r.hi32 >> 31)) | ((p22re.r.hi32) ^ (p22re.r.hi32 >> 31)); + if (gbMask == 0) { + s = p01re.r.hi32 >> 31; gbMask = (p01re.r.lo32 ^ s) - s; + s = p01im.r.hi32 >> 31; gbMask |= (p01im.r.lo32 ^ s) - s; + s = p12re.r.hi32 >> 31; gbMask |= (p12re.r.lo32 ^ s) - s; + s = p12im.r.hi32 >> 31; gbMask |= (p12im.r.lo32 ^ s) - s; + s = p11re.r.hi32 >> 31; gbMask |= (p11re.r.lo32 ^ s) - s; + s = p22re.r.hi32 >> 31; gbMask |= (p22re.r.lo32 ^ s) - s; + z = 32 + CLZ(gbMask); + } else { + gbMask = FASTABS(p01re.r.hi32) | FASTABS(p01im.r.hi32); + gbMask |= FASTABS(p12re.r.hi32) | FASTABS(p12im.r.hi32); + gbMask |= FASTABS(p11re.r.hi32) | FASTABS(p22re.r.hi32); + z = CLZ(gbMask); + } + + n = 64 - z; /* number of non-zero bits in bottom of 64-bit word */ + if (n <= 30) { + loShift = (30 - n); + *p01reN = p01re.r.lo32 << loShift; *p01imN = p01im.r.lo32 << loShift; + *p12reN = p12re.r.lo32 << loShift; *p12imN = p12im.r.lo32 << loShift; + *p11reN = p11re.r.lo32 << loShift; *p22reN = p22re.r.lo32 << loShift; + return -(loShift + 2 * FBITS_OUT_QMFA); + } else if (n < 32 + 30) { + loShift = (n - 30); + hiShift = 32 - loShift; + *p01reN = (p01re.r.hi32 << hiShift) | (p01re.r.lo32 >> loShift); + *p01imN = (p01im.r.hi32 << hiShift) | (p01im.r.lo32 >> loShift); + *p12reN = (p12re.r.hi32 << hiShift) | (p12re.r.lo32 >> loShift); + *p12imN = (p12im.r.hi32 << hiShift) | (p12im.r.lo32 >> loShift); + *p11reN = (p11re.r.hi32 << hiShift) | (p11re.r.lo32 >> loShift); + *p22reN = (p22re.r.hi32 << hiShift) | (p22re.r.lo32 >> loShift); + return (loShift - 2 * FBITS_OUT_QMFA); + } else { + hiShift = n - (32 + 30); + *p01reN = p01re.r.hi32 >> hiShift; *p01imN = p01im.r.hi32 >> hiShift; + *p12reN = p12re.r.hi32 >> hiShift; *p12imN = p12im.r.hi32 >> hiShift; + *p11reN = p11re.r.hi32 >> hiShift; *p22reN = p22re.r.hi32 >> hiShift; + return (32 - 2 * FBITS_OUT_QMFA - hiShift); + } + + return 0; } /************************************************************************************** - * Function: CVKernel2 - * - * Description: kernel of covariance matrix calculation for p02 - * - * Inputs: buffer of low-freq samples, starting at time index = 0, - * freq index = patch subband - * - * Outputs: 64-bit accumulators for p02re, p02im stored in accBuf - * - * Return: none - * - * Notes: this is carefully written to be efficient on ARM - * use the assembly code version in sbrcov.s when building for ARM! + Function: CVKernel2 + + Description: kernel of covariance matrix calculation for p02 + + Inputs: buffer of low-freq samples, starting at time index = 0, + freq index = patch subband + + Outputs: 64-bit accumulators for p02re, p02im stored in accBuf + + Return: none + + Notes: this is carefully written to be efficient on ARM + use the assembly code version in sbrcov.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +#if (defined (XXXX__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(XXXX__arm__)) #ifdef __cplusplus extern "C" #endif void CVKernel2(int *XBuf, int *accBuf); #else -void CVKernel2(int *XBuf, int *accBuf) -{ - U64 p02re, p02im; - int n, x0re, x0im, x1re, x1im, x2re, x2im; - - p02re.w64 = p02im.w64 = 0; - - x0re = XBuf[0]; - x0im = XBuf[1]; - XBuf += (2*64); - x1re = XBuf[0]; - x1im = XBuf[1]; - XBuf += (2*64); - - for (n = (NUM_TIME_SLOTS*SAMPLES_PER_SLOT + 6); n != 0; n--) { - /* 6 input, 2*2 acc, 1 ptr, 1 loop counter = 12 registers (use same for x0im, -x0im) */ - x2re = XBuf[0]; - x2im = XBuf[1]; - - p02re.w64 = MADD64(p02re.w64, x2re, x0re); - p02re.w64 = MADD64(p02re.w64, x2im, x0im); - p02im.w64 = MADD64(p02im.w64, x0re, x2im); - p02im.w64 = MADD64(p02im.w64, -x0im, x2re); - - x0re = x1re; - x0im = x1im; - x1re = x2re; - x1im = x2im; - XBuf += (2*64); - } - - accBuf[0] = p02re.r.lo32; - accBuf[1] = p02re.r.hi32; - accBuf[2] = p02im.r.lo32; - accBuf[3] = p02im.r.hi32; +void CVKernel2(int *XBuf, int *accBuf) { + U64 p02re, p02im; + int n, x0re, x0im, x1re, x1im, x2re, x2im; + + p02re.w64 = p02im.w64 = 0; + + x0re = XBuf[0]; + x0im = XBuf[1]; + XBuf += (2 * 64); + x1re = XBuf[0]; + x1im = XBuf[1]; + XBuf += (2 * 64); + + for (n = (NUM_TIME_SLOTS * SAMPLES_PER_SLOT + 6); n != 0; n--) { + /* 6 input, 2*2 acc, 1 ptr, 1 loop counter = 12 registers (use same for x0im, -x0im) */ + x2re = XBuf[0]; + x2im = XBuf[1]; + + p02re.w64 = MADD64(p02re.w64, x2re, x0re); + p02re.w64 = MADD64(p02re.w64, x2im, x0im); + p02im.w64 = MADD64(p02im.w64, x0re, x2im); + p02im.w64 = MADD64(p02im.w64, -x0im, x2re); + + x0re = x1re; + x0im = x1im; + x1re = x2re; + x1im = x2im; + XBuf += (2 * 64); + } + + accBuf[0] = p02re.r.lo32; + accBuf[1] = p02re.r.hi32; + accBuf[2] = p02im.r.lo32; + accBuf[3] = p02im.r.hi32; } #endif /************************************************************************************** - * Function: CalcCovariance2 - * - * Description: calculate covariance matrix for p02 (4.6.18.6.2) - * - * Inputs: buffer of low-freq samples, starting at time index = 0, - * freq index = patch subband - * - * Outputs: complex covariance element p02re, p02im - * format = integer (Q0) * 2^N, with scalefactor N >= 0 - * - * Return: scalefactor N - * - * Notes: outputs are normalized to have 1 GB (sign in at least top 2 bits) + Function: CalcCovariance2 + + Description: calculate covariance matrix for p02 (4.6.18.6.2) + + Inputs: buffer of low-freq samples, starting at time index = 0, + freq index = patch subband + + Outputs: complex covariance element p02re, p02im + format = integer (Q0) * 2^N, with scalefactor N >= 0 + + Return: scalefactor N + + Notes: outputs are normalized to have 1 GB (sign in at least top 2 bits) **************************************************************************************/ -static int CalcCovariance2(int *XBuf, int *p02reN, int *p02imN) -{ - U64 p02re, p02im; - int n, z, s, loShift, hiShift, gbMask; - int accBuf[2*2]; - - CVKernel2(XBuf, accBuf); - p02re.r.lo32 = accBuf[0]; - p02re.r.hi32 = accBuf[1]; - p02im.r.lo32 = accBuf[2]; - p02im.r.hi32 = accBuf[3]; - - /* 64-bit accumulators now have 2*FBITS_OUT_QMFA fraction bits - * want to scale them down to integers (32-bit signed, Q0) - * with scale factor of 2^n, n >= 0 - * leave 1 GB for calculating determinant, so take top 30 non-zero bits - */ - gbMask = ((p02re.r.hi32) ^ (p02re.r.hi32 >> 31)) | ((p02im.r.hi32) ^ (p02im.r.hi32 >> 31)); - if (gbMask == 0) { - s = p02re.r.hi32 >> 31; gbMask = (p02re.r.lo32 ^ s) - s; - s = p02im.r.hi32 >> 31; gbMask |= (p02im.r.lo32 ^ s) - s; - z = 32 + CLZ(gbMask); - } else { - gbMask = FASTABS(p02re.r.hi32) | FASTABS(p02im.r.hi32); - z = CLZ(gbMask); - } - n = 64 - z; /* number of non-zero bits in bottom of 64-bit word */ - - if (n <= 30) { - loShift = (30 - n); - *p02reN = p02re.r.lo32 << loShift; - *p02imN = p02im.r.lo32 << loShift; - return -(loShift + 2*FBITS_OUT_QMFA); - } else if (n < 32 + 30) { - loShift = (n - 30); - hiShift = 32 - loShift; - *p02reN = (p02re.r.hi32 << hiShift) | (p02re.r.lo32 >> loShift); - *p02imN = (p02im.r.hi32 << hiShift) | (p02im.r.lo32 >> loShift); - return (loShift - 2*FBITS_OUT_QMFA); - } else { - hiShift = n - (32 + 30); - *p02reN = p02re.r.hi32 >> hiShift; - *p02imN = p02im.r.hi32 >> hiShift; - return (32 - 2*FBITS_OUT_QMFA - hiShift); - } - - return 0; +static int CalcCovariance2(int *XBuf, int *p02reN, int *p02imN) { + U64 p02re, p02im; + int n, z, s, loShift, hiShift, gbMask; + int accBuf[2 * 2]; + + CVKernel2(XBuf, accBuf); + p02re.r.lo32 = accBuf[0]; + p02re.r.hi32 = accBuf[1]; + p02im.r.lo32 = accBuf[2]; + p02im.r.hi32 = accBuf[3]; + + /* 64-bit accumulators now have 2*FBITS_OUT_QMFA fraction bits + want to scale them down to integers (32-bit signed, Q0) + with scale factor of 2^n, n >= 0 + leave 1 GB for calculating determinant, so take top 30 non-zero bits + */ + gbMask = ((p02re.r.hi32) ^ (p02re.r.hi32 >> 31)) | ((p02im.r.hi32) ^ (p02im.r.hi32 >> 31)); + if (gbMask == 0) { + s = p02re.r.hi32 >> 31; gbMask = (p02re.r.lo32 ^ s) - s; + s = p02im.r.hi32 >> 31; gbMask |= (p02im.r.lo32 ^ s) - s; + z = 32 + CLZ(gbMask); + } else { + gbMask = FASTABS(p02re.r.hi32) | FASTABS(p02im.r.hi32); + z = CLZ(gbMask); + } + n = 64 - z; /* number of non-zero bits in bottom of 64-bit word */ + + if (n <= 30) { + loShift = (30 - n); + *p02reN = p02re.r.lo32 << loShift; + *p02imN = p02im.r.lo32 << loShift; + return -(loShift + 2 * FBITS_OUT_QMFA); + } else if (n < 32 + 30) { + loShift = (n - 30); + hiShift = 32 - loShift; + *p02reN = (p02re.r.hi32 << hiShift) | (p02re.r.lo32 >> loShift); + *p02imN = (p02im.r.hi32 << hiShift) | (p02im.r.lo32 >> loShift); + return (loShift - 2 * FBITS_OUT_QMFA); + } else { + hiShift = n - (32 + 30); + *p02reN = p02re.r.hi32 >> hiShift; + *p02imN = p02im.r.hi32 >> hiShift; + return (32 - 2 * FBITS_OUT_QMFA - hiShift); + } + + return 0; } /************************************************************************************** - * Function: CalcLPCoefs - * - * Description: calculate linear prediction coefficients for one subband (4.6.18.6.2) - * - * Inputs: buffer of low-freq samples, starting at time index = 0, - * freq index = patch subband - * number of guard bits in input sample buffer - * - * Outputs: complex LP coefficients a0re, a0im, a1re, a1im, format = Q29 - * - * Return: none - * - * Notes: output coefficients (a0re, a0im, a1re, a1im) clipped to range (-4, 4) - * if the comples coefficients have magnitude >= 4.0, they are all - * set to 0 (see spec) + Function: CalcLPCoefs + + Description: calculate linear prediction coefficients for one subband (4.6.18.6.2) + + Inputs: buffer of low-freq samples, starting at time index = 0, + freq index = patch subband + number of guard bits in input sample buffer + + Outputs: complex LP coefficients a0re, a0im, a1re, a1im, format = Q29 + + Return: none + + Notes: output coefficients (a0re, a0im, a1re, a1im) clipped to range (-4, 4) + if the comples coefficients have magnitude >= 4.0, they are all + set to 0 (see spec) **************************************************************************************/ -static void CalcLPCoefs(int *XBuf, int *a0re, int *a0im, int *a1re, int *a1im, int gb) -{ - int zFlag, n1, n2, nd, d, dInv, tre, tim; - int p01re, p01im, p02re, p02im, p12re, p12im, p11re, p22re; - - /* pre-scale to avoid overflow - probably never happens in practice (see QMFA) - * max bit growth per accumulator = 38*2 = 76 mul-adds (X * X) - * using 64-bit MADD, so if X has n guard bits, X*X has 2n+1 guard bits - * gain 1 extra sign bit per multiply, so ensure ceil(log2(76/2) / 2) = 3 guard bits on inputs - */ - if (gb < 3) { - nd = 3 - gb; - for (n1 = (NUM_TIME_SLOTS*SAMPLES_PER_SLOT + 6 + 2); n1 != 0; n1--) { - XBuf[0] >>= nd; XBuf[1] >>= nd; - XBuf += (2*64); - } - XBuf -= (2*64*(NUM_TIME_SLOTS*SAMPLES_PER_SLOT + 6 + 2)); - } - - /* calculate covariance elements */ - n1 = CalcCovariance1(XBuf, &p01re, &p01im, &p12re, &p12im, &p11re, &p22re); - n2 = CalcCovariance2(XBuf, &p02re, &p02im); - - /* normalize everything to larger power of 2 scalefactor, call it n1 */ - if (n1 < n2) { - nd = MIN(n2 - n1, 31); - p01re >>= nd; p01im >>= nd; - p12re >>= nd; p12im >>= nd; - p11re >>= nd; p22re >>= nd; - n1 = n2; - } else if (n1 > n2) { - nd = MIN(n1 - n2, 31); - p02re >>= nd; p02im >>= nd; - } - - /* calculate determinant of covariance matrix (at least 1 GB in pXX) */ - d = MULSHIFT32(p12re, p12re) + MULSHIFT32(p12im, p12im); - d = MULSHIFT32(d, RELAX_COEF) << 1; - d = MULSHIFT32(p11re, p22re) - d; - ASSERT(d >= 0); /* should never be < 0 */ - - zFlag = 0; - *a0re = *a0im = 0; - *a1re = *a1im = 0; - if (d > 0) { - /* input = Q31 d = Q(-2*n1 - 32 + nd) = Q31 * 2^(31 + 2*n1 + 32 - nd) - * inverse = Q29 dInv = Q29 * 2^(-31 - 2*n1 - 32 + nd) = Q(29 + 31 + 2*n1 + 32 - nd) - * - * numerator has same Q format as d, since it's sum of normalized squares - * so num * inverse = Q(-2*n1 - 32) * Q(29 + 31 + 2*n1 + 32 - nd) - * = Q(29 + 31 - nd), drop low 32 in MULSHIFT32 - * = Q(29 + 31 - 32 - nd) = Q(28 - nd) - */ - nd = CLZ(d) - 1; - d <<= nd; - dInv = InvRNormalized(d); - - /* 1 GB in pXX */ - tre = MULSHIFT32(p01re, p12re) - MULSHIFT32(p01im, p12im) - MULSHIFT32(p02re, p11re); - tre = MULSHIFT32(tre, dInv); - tim = MULSHIFT32(p01re, p12im) + MULSHIFT32(p01im, p12re) - MULSHIFT32(p02im, p11re); - tim = MULSHIFT32(tim, dInv); - - /* if d is extremely small, just set coefs to 0 (would have poor precision anyway) */ - if (nd > 28 || (FASTABS(tre) >> (28 - nd)) >= 4 || (FASTABS(tim) >> (28 - nd)) >= 4) { - zFlag = 1; - } else { - *a1re = tre << (FBITS_LPCOEFS - 28 + nd); /* i.e. convert Q(28 - nd) to Q(29) */ - *a1im = tim << (FBITS_LPCOEFS - 28 + nd); - } - } - - if (p11re) { - /* input = Q31 p11re = Q(-n1 + nd) = Q31 * 2^(31 + n1 - nd) - * inverse = Q29 dInv = Q29 * 2^(-31 - n1 + nd) = Q(29 + 31 + n1 - nd) - * - * numerator is Q(-n1 - 3) - * so num * inverse = Q(-n1 - 3) * Q(29 + 31 + n1 - nd) - * = Q(29 + 31 - 3 - nd), drop low 32 in MULSHIFT32 - * = Q(29 + 31 - 3 - 32 - nd) = Q(25 - nd) - */ - nd = CLZ(p11re) - 1; /* assume positive */ - p11re <<= nd; - dInv = InvRNormalized(p11re); - - /* a1re, a1im = Q29, so scaled by (n1 + 3) */ - tre = (p01re >> 3) + MULSHIFT32(p12re, *a1re) + MULSHIFT32(p12im, *a1im); - tre = -MULSHIFT32(tre, dInv); - tim = (p01im >> 3) - MULSHIFT32(p12im, *a1re) + MULSHIFT32(p12re, *a1im); - tim = -MULSHIFT32(tim, dInv); - - if (nd > 25 || (FASTABS(tre) >> (25 - nd)) >= 4 || (FASTABS(tim) >> (25 - nd)) >= 4) { - zFlag = 1; - } else { - *a0re = tre << (FBITS_LPCOEFS - 25 + nd); /* i.e. convert Q(25 - nd) to Q(29) */ - *a0im = tim << (FBITS_LPCOEFS - 25 + nd); - } - } - - /* see 4.6.18.6.2 - if magnitude of a0 or a1 >= 4 then a0 = a1 = 0 - * i.e. a0re < 4, a0im < 4, a1re < 4, a1im < 4 - * Q29*Q29 = Q26 - */ - if (zFlag || MULSHIFT32(*a0re, *a0re) + MULSHIFT32(*a0im, *a0im) >= MAG_16 || MULSHIFT32(*a1re, *a1re) + MULSHIFT32(*a1im, *a1im) >= MAG_16) { - *a0re = *a0im = 0; - *a1re = *a1im = 0; - } - - /* no need to clip - we never changed the XBuf data, just used it to calculate a0 and a1 */ - if (gb < 3) { - nd = 3 - gb; - for (n1 = (NUM_TIME_SLOTS*SAMPLES_PER_SLOT + 6 + 2); n1 != 0; n1--) { - XBuf[0] <<= nd; XBuf[1] <<= nd; - XBuf += (2*64); - } - } +static void CalcLPCoefs(int *XBuf, int *a0re, int *a0im, int *a1re, int *a1im, int gb) { + int zFlag, n1, n2, nd, d, dInv, tre, tim; + int p01re, p01im, p02re, p02im, p12re, p12im, p11re, p22re; + + /* pre-scale to avoid overflow - probably never happens in practice (see QMFA) + max bit growth per accumulator = 38*2 = 76 mul-adds (X * X) + using 64-bit MADD, so if X has n guard bits, X*X has 2n+1 guard bits + gain 1 extra sign bit per multiply, so ensure ceil(log2(76/2) / 2) = 3 guard bits on inputs + */ + if (gb < 3) { + nd = 3 - gb; + for (n1 = (NUM_TIME_SLOTS * SAMPLES_PER_SLOT + 6 + 2); n1 != 0; n1--) { + XBuf[0] >>= nd; XBuf[1] >>= nd; + XBuf += (2 * 64); + } + XBuf -= (2 * 64 * (NUM_TIME_SLOTS * SAMPLES_PER_SLOT + 6 + 2)); + } + + /* calculate covariance elements */ + n1 = CalcCovariance1(XBuf, &p01re, &p01im, &p12re, &p12im, &p11re, &p22re); + n2 = CalcCovariance2(XBuf, &p02re, &p02im); + + /* normalize everything to larger power of 2 scalefactor, call it n1 */ + if (n1 < n2) { + nd = MIN(n2 - n1, 31); + p01re >>= nd; p01im >>= nd; + p12re >>= nd; p12im >>= nd; + p11re >>= nd; p22re >>= nd; + n1 = n2; + } else if (n1 > n2) { + nd = MIN(n1 - n2, 31); + p02re >>= nd; p02im >>= nd; + } + + /* calculate determinant of covariance matrix (at least 1 GB in pXX) */ + d = MULSHIFT32(p12re, p12re) + MULSHIFT32(p12im, p12im); + d = MULSHIFT32(d, RELAX_COEF) << 1; + d = MULSHIFT32(p11re, p22re) - d; + ASSERT(d >= 0); /* should never be < 0 */ + + zFlag = 0; + *a0re = *a0im = 0; + *a1re = *a1im = 0; + if (d > 0) { + /* input = Q31 d = Q(-2*n1 - 32 + nd) = Q31 * 2^(31 + 2*n1 + 32 - nd) + inverse = Q29 dInv = Q29 * 2^(-31 - 2*n1 - 32 + nd) = Q(29 + 31 + 2*n1 + 32 - nd) + + numerator has same Q format as d, since it's sum of normalized squares + so num * inverse = Q(-2*n1 - 32) * Q(29 + 31 + 2*n1 + 32 - nd) + = Q(29 + 31 - nd), drop low 32 in MULSHIFT32 + = Q(29 + 31 - 32 - nd) = Q(28 - nd) + */ + nd = CLZ(d) - 1; + d <<= nd; + dInv = InvRNormalized(d); + + /* 1 GB in pXX */ + tre = MULSHIFT32(p01re, p12re) - MULSHIFT32(p01im, p12im) - MULSHIFT32(p02re, p11re); + tre = MULSHIFT32(tre, dInv); + tim = MULSHIFT32(p01re, p12im) + MULSHIFT32(p01im, p12re) - MULSHIFT32(p02im, p11re); + tim = MULSHIFT32(tim, dInv); + + /* if d is extremely small, just set coefs to 0 (would have poor precision anyway) */ + if (nd > 28 || (FASTABS(tre) >> (28 - nd)) >= 4 || (FASTABS(tim) >> (28 - nd)) >= 4) { + zFlag = 1; + } else { + *a1re = tre << (FBITS_LPCOEFS - 28 + nd); /* i.e. convert Q(28 - nd) to Q(29) */ + *a1im = tim << (FBITS_LPCOEFS - 28 + nd); + } + } + + if (p11re) { + /* input = Q31 p11re = Q(-n1 + nd) = Q31 * 2^(31 + n1 - nd) + inverse = Q29 dInv = Q29 * 2^(-31 - n1 + nd) = Q(29 + 31 + n1 - nd) + + numerator is Q(-n1 - 3) + so num * inverse = Q(-n1 - 3) * Q(29 + 31 + n1 - nd) + = Q(29 + 31 - 3 - nd), drop low 32 in MULSHIFT32 + = Q(29 + 31 - 3 - 32 - nd) = Q(25 - nd) + */ + nd = CLZ(p11re) - 1; /* assume positive */ + p11re <<= nd; + dInv = InvRNormalized(p11re); + + /* a1re, a1im = Q29, so scaled by (n1 + 3) */ + tre = (p01re >> 3) + MULSHIFT32(p12re, *a1re) + MULSHIFT32(p12im, *a1im); + tre = -MULSHIFT32(tre, dInv); + tim = (p01im >> 3) - MULSHIFT32(p12im, *a1re) + MULSHIFT32(p12re, *a1im); + tim = -MULSHIFT32(tim, dInv); + + if (nd > 25 || (FASTABS(tre) >> (25 - nd)) >= 4 || (FASTABS(tim) >> (25 - nd)) >= 4) { + zFlag = 1; + } else { + *a0re = tre << (FBITS_LPCOEFS - 25 + nd); /* i.e. convert Q(25 - nd) to Q(29) */ + *a0im = tim << (FBITS_LPCOEFS - 25 + nd); + } + } + + /* see 4.6.18.6.2 - if magnitude of a0 or a1 >= 4 then a0 = a1 = 0 + i.e. a0re < 4, a0im < 4, a1re < 4, a1im < 4 + Q29*Q29 = Q26 + */ + if (zFlag || MULSHIFT32(*a0re, *a0re) + MULSHIFT32(*a0im, *a0im) >= MAG_16 || MULSHIFT32(*a1re, *a1re) + MULSHIFT32(*a1im, *a1im) >= MAG_16) { + *a0re = *a0im = 0; + *a1re = *a1im = 0; + } + + /* no need to clip - we never changed the XBuf data, just used it to calculate a0 and a1 */ + if (gb < 3) { + nd = 3 - gb; + for (n1 = (NUM_TIME_SLOTS * SAMPLES_PER_SLOT + 6 + 2); n1 != 0; n1--) { + XBuf[0] <<= nd; XBuf[1] <<= nd; + XBuf += (2 * 64); + } + } } /************************************************************************************** - * Function: GenerateHighFreq - * - * Description: generate high frequencies with SBR (4.6.18.6) - * - * Inputs: initialized PSInfoSBR struct - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * - * Outputs: new high frequency samples starting at frequency kStart - * - * Return: none + Function: GenerateHighFreq + + Description: generate high frequencies with SBR (4.6.18.6) + + Inputs: initialized PSInfoSBR struct + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + + Outputs: new high frequency samples starting at frequency kStart + + Return: none **************************************************************************************/ -void GenerateHighFreq(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) -{ - int band, newBW, c, t, gb, gbMask, gbIdx; - int currPatch, p, x, k, g, i, iStart, iEnd, bw, bwsq; - int a0re, a0im, a1re, a1im; - int x1re, x1im, x2re, x2im; - int ACCre, ACCim; - int *XBufLo, *XBufHi; - (void) ch; - - /* calculate array of chirp factors */ - for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { - c = sbrChan->chirpFact[band]; /* previous (bwArray') */ - newBW = newBWTab[sbrChan->invfMode[0][band]][sbrChan->invfMode[1][band]]; - - /* weighted average of new and old (can't overflow - total gain = 1.0) */ - if (newBW < c) - t = MULSHIFT32(newBW, 0x60000000) + MULSHIFT32(0x20000000, c); /* new is smaller: 0.75*new + 0.25*old */ - else - t = MULSHIFT32(newBW, 0x74000000) + MULSHIFT32(0x0c000000, c); /* new is larger: 0.90625*new + 0.09375*old */ - t <<= 1; - - if (t < 0x02000000) /* below 0.015625, clip to 0 */ - t = 0; - if (t > 0x7f800000) /* clip to 0.99609375 */ - t = 0x7f800000; - - /* save curr as prev for next time */ - sbrChan->chirpFact[band] = t; - sbrChan->invfMode[0][band] = sbrChan->invfMode[1][band]; - } - - iStart = sbrGrid->envTimeBorder[0] + HF_ADJ; - iEnd = sbrGrid->envTimeBorder[sbrGrid->numEnv] + HF_ADJ; - - /* generate new high freqs from low freqs, patches, and chirp factors */ - k = sbrFreq->kStart; - g = 0; - bw = sbrChan->chirpFact[g]; - bwsq = MULSHIFT32(bw, bw) << 1; - - gbMask = (sbrChan->gbMask[0] | sbrChan->gbMask[1]); /* older 32 | newer 8 */ - gb = CLZ(gbMask) - 1; - - for (currPatch = 0; currPatch < sbrFreq->numPatches; currPatch++) { - for (x = 0; x < sbrFreq->patchNumSubbands[currPatch]; x++) { - /* map k to corresponding noise floor band */ - if (k >= sbrFreq->freqNoise[g+1]) { - g++; - bw = sbrChan->chirpFact[g]; /* Q31 */ - bwsq = MULSHIFT32(bw, bw) << 1; /* Q31 */ - } - - p = sbrFreq->patchStartSubband[currPatch] + x; /* low QMF band */ - XBufHi = psi->XBuf[iStart][k]; - if (bw) { - CalcLPCoefs(psi->XBuf[0][p], &a0re, &a0im, &a1re, &a1im, gb); - - a0re = MULSHIFT32(bw, a0re); /* Q31 * Q29 = Q28 */ - a0im = MULSHIFT32(bw, a0im); - a1re = MULSHIFT32(bwsq, a1re); - a1im = MULSHIFT32(bwsq, a1im); - - XBufLo = psi->XBuf[iStart-2][p]; - - x2re = XBufLo[0]; /* RE{XBuf[n-2]} */ - x2im = XBufLo[1]; /* IM{XBuf[n-2]} */ - XBufLo += (64*2); - - x1re = XBufLo[0]; /* RE{XBuf[n-1]} */ - x1im = XBufLo[1]; /* IM{XBuf[n-1]} */ - XBufLo += (64*2); - - for (i = iStart; i < iEnd; i++) { - /* a0re/im, a1re/im are Q28 with at least 1 GB, - * so the summing for AACre/im is fine (1 GB in, plus 1 from MULSHIFT32) - */ - ACCre = MULSHIFT32(x2re, a1re) - MULSHIFT32(x2im, a1im); - ACCim = MULSHIFT32(x2re, a1im) + MULSHIFT32(x2im, a1re); - x2re = x1re; - x2im = x1im; - - ACCre += MULSHIFT32(x1re, a0re) - MULSHIFT32(x1im, a0im); - ACCim += MULSHIFT32(x1re, a0im) + MULSHIFT32(x1im, a0re); - x1re = XBufLo[0]; /* RE{XBuf[n]} */ - x1im = XBufLo[1]; /* IM{XBuf[n]} */ - XBufLo += (64*2); - - /* lost 4 fbits when scaling by a0re/im, a1re/im (Q28) */ - CLIP_2N_SHIFT30(ACCre, 4); - ACCre += x1re; - CLIP_2N_SHIFT30(ACCim, 4); - ACCim += x1im; - - XBufHi[0] = ACCre; - XBufHi[1] = ACCim; - XBufHi += (64*2); - - /* update guard bit masks */ - gbMask = FASTABS(ACCre); - gbMask |= FASTABS(ACCim); - gbIdx = (i >> 5) & 0x01; /* 0 if i < 32, 1 if i >= 32 */ - sbrChan->gbMask[gbIdx] |= gbMask; - } - } else { - XBufLo = (int *)psi->XBuf[iStart][p]; - for (i = iStart; i < iEnd; i++) { - XBufHi[0] = XBufLo[0]; - XBufHi[1] = XBufLo[1]; - XBufLo += (64*2); - XBufHi += (64*2); - } - } - k++; /* high QMF band */ - } - } +void GenerateHighFreq(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) { + int band, newBW, c, t, gb, gbMask, gbIdx; + int currPatch, p, x, k, g, i, iStart, iEnd, bw, bwsq; + int a0re, a0im, a1re, a1im; + int x1re, x1im, x2re, x2im; + int ACCre, ACCim; + int *XBufLo, *XBufHi; + (void) ch; + + /* calculate array of chirp factors */ + for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { + c = sbrChan->chirpFact[band]; /* previous (bwArray') */ + newBW = newBWTab[sbrChan->invfMode[0][band]][sbrChan->invfMode[1][band]]; + + /* weighted average of new and old (can't overflow - total gain = 1.0) */ + if (newBW < c) { + t = MULSHIFT32(newBW, 0x60000000) + MULSHIFT32(0x20000000, c); /* new is smaller: 0.75*new + 0.25*old */ + } else { + t = MULSHIFT32(newBW, 0x74000000) + MULSHIFT32(0x0c000000, c); /* new is larger: 0.90625*new + 0.09375*old */ + } + t <<= 1; + + if (t < 0x02000000) { /* below 0.015625, clip to 0 */ + t = 0; + } + if (t > 0x7f800000) { /* clip to 0.99609375 */ + t = 0x7f800000; + } + + /* save curr as prev for next time */ + sbrChan->chirpFact[band] = t; + sbrChan->invfMode[0][band] = sbrChan->invfMode[1][band]; + } + + iStart = sbrGrid->envTimeBorder[0] + HF_ADJ; + iEnd = sbrGrid->envTimeBorder[sbrGrid->numEnv] + HF_ADJ; + + /* generate new high freqs from low freqs, patches, and chirp factors */ + k = sbrFreq->kStart; + g = 0; + bw = sbrChan->chirpFact[g]; + bwsq = MULSHIFT32(bw, bw) << 1; + + gbMask = (sbrChan->gbMask[0] | sbrChan->gbMask[1]); /* older 32 | newer 8 */ + gb = CLZ(gbMask) - 1; + + for (currPatch = 0; currPatch < sbrFreq->numPatches; currPatch++) { + for (x = 0; x < sbrFreq->patchNumSubbands[currPatch]; x++) { + /* map k to corresponding noise floor band */ + if (k >= sbrFreq->freqNoise[g + 1]) { + g++; + bw = sbrChan->chirpFact[g]; /* Q31 */ + bwsq = MULSHIFT32(bw, bw) << 1; /* Q31 */ + } + + p = sbrFreq->patchStartSubband[currPatch] + x; /* low QMF band */ + XBufHi = psi->XBuf[iStart][k]; + if (bw) { + CalcLPCoefs(psi->XBuf[0][p], &a0re, &a0im, &a1re, &a1im, gb); + + a0re = MULSHIFT32(bw, a0re); /* Q31 * Q29 = Q28 */ + a0im = MULSHIFT32(bw, a0im); + a1re = MULSHIFT32(bwsq, a1re); + a1im = MULSHIFT32(bwsq, a1im); + + XBufLo = psi->XBuf[iStart - 2][p]; + + x2re = XBufLo[0]; /* RE{XBuf[n-2]} */ + x2im = XBufLo[1]; /* IM{XBuf[n-2]} */ + XBufLo += (64 * 2); + + x1re = XBufLo[0]; /* RE{XBuf[n-1]} */ + x1im = XBufLo[1]; /* IM{XBuf[n-1]} */ + XBufLo += (64 * 2); + + for (i = iStart; i < iEnd; i++) { + /* a0re/im, a1re/im are Q28 with at least 1 GB, + so the summing for AACre/im is fine (1 GB in, plus 1 from MULSHIFT32) + */ + ACCre = MULSHIFT32(x2re, a1re) - MULSHIFT32(x2im, a1im); + ACCim = MULSHIFT32(x2re, a1im) + MULSHIFT32(x2im, a1re); + x2re = x1re; + x2im = x1im; + + ACCre += MULSHIFT32(x1re, a0re) - MULSHIFT32(x1im, a0im); + ACCim += MULSHIFT32(x1re, a0im) + MULSHIFT32(x1im, a0re); + x1re = XBufLo[0]; /* RE{XBuf[n]} */ + x1im = XBufLo[1]; /* IM{XBuf[n]} */ + XBufLo += (64 * 2); + + /* lost 4 fbits when scaling by a0re/im, a1re/im (Q28) */ + CLIP_2N_SHIFT30(ACCre, 4); + ACCre += x1re; + CLIP_2N_SHIFT30(ACCim, 4); + ACCim += x1im; + + XBufHi[0] = ACCre; + XBufHi[1] = ACCim; + XBufHi += (64 * 2); + + /* update guard bit masks */ + gbMask = FASTABS(ACCre); + gbMask |= FASTABS(ACCim); + gbIdx = (i >> 5) & 0x01; /* 0 if i < 32, 1 if i >= 32 */ + sbrChan->gbMask[gbIdx] |= gbMask; + } + } else { + XBufLo = (int *)psi->XBuf[iStart][p]; + for (i = iStart; i < iEnd; i++) { + XBufHi[0] = XBufLo[0]; + XBufHi[1] = XBufLo[1]; + XBufLo += (64 * 2); + XBufHi += (64 * 2); + } + } + k++; /* high QMF band */ + } + } } diff --git a/src/libhelix-aac/sbrhuff.c b/src/libhelix-aac/sbrhuff.c index a174e1e8..8e4a5eb4 100644 --- a/src/libhelix-aac/sbrhuff.c +++ b/src/libhelix-aac/sbrhuff.c @@ -1,476 +1,494 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrhuff.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +#pragma GCC optimize ("O3") +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrhuff.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrhuff.c - functions for unpacking Huffman-coded envelope and noise data + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrhuff.c - functions for unpacking Huffman-coded envelope and noise data **************************************************************************************/ #include "sbr.h" #include "assembly.h" /************************************************************************************** - * Function: DecodeHuffmanScalar - * - * Description: decode one Huffman symbol from bitstream - * - * Inputs: pointers to Huffman table and info struct - * left-aligned bit buffer with >= huffTabInfo->maxBits bits - * - * Outputs: decoded symbol in *val - * - * Return: number of bits in symbol - * - * Notes: assumes canonical Huffman codes: - * first CW always 0, we have "count" CW's of length "nBits" bits - * starting CW for codes of length nBits+1 = - * (startCW[nBits] + count[nBits]) << 1 - * if there are no codes at nBits, then we just keep << 1 each time - * (since count[nBits] = 0) + Function: DecodeHuffmanScalar + + Description: decode one Huffman symbol from bitstream + + Inputs: pointers to Huffman table and info struct + left-aligned bit buffer with >= huffTabInfo->maxBits bits + + Outputs: decoded symbol in *val + + Return: number of bits in symbol + + Notes: assumes canonical Huffman codes: + first CW always 0, we have "count" CW's of length "nBits" bits + starting CW for codes of length nBits+1 = + (startCW[nBits] + count[nBits]) << 1 + if there are no codes at nBits, then we just keep << 1 each time + (since count[nBits] = 0) **************************************************************************************/ -static int DecodeHuffmanScalar(const signed /*short*/ int *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val) -{ +#ifdef ESP8266 +static int DecodeHuffmanScalar(const signed /*short*/ int *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val) { +#else +static int DecodeHuffmanScalar(const signed short int *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val) { +#endif unsigned int count, start, shift, t; - const unsigned int /*char*/ *countPtr; - const signed int /*short*/ *map; - - map = huffTab + huffTabInfo->offset; - countPtr = huffTabInfo->count; - - start = 0; - count = 0; - shift = 32; - do { - start += count; - start <<= 1; - map += count; - count = *countPtr++; - shift--; - t = (bitBuf >> shift) - start; - } while (t >= count); - - *val = (signed int)map[t]; - return (countPtr - huffTabInfo->count); +#ifdef ESP8266 + const unsigned int /*char*/ *countPtr; + const signed int /*short*/ *map; +#else + const unsigned char *countPtr; + const signed short *map; +#endif + + map = huffTab + huffTabInfo->offset; + countPtr = huffTabInfo->count; + + start = 0; + count = 0; + shift = 32; + do { + start += count; + start <<= 1; + map += count; + count = *countPtr++; + shift--; + t = (bitBuf >> shift) - start; + } while (t >= count); + + *val = (signed int)map[t]; + return (countPtr - huffTabInfo->count); } /************************************************************************************** - * Function: DecodeOneSymbol - * - * Description: dequantize one Huffman symbol from bitstream, - * using table huffTabSBR[huffTabIndex] - * - * Inputs: BitStreamInfo struct pointing to start of next Huffman codeword - * index of Huffman table - * - * Outputs: bitstream advanced by number of bits in codeword - * - * Return: one decoded symbol + Function: DecodeOneSymbol + + Description: dequantize one Huffman symbol from bitstream, + using table huffTabSBR[huffTabIndex] + + Inputs: BitStreamInfo struct pointing to start of next Huffman codeword + index of Huffman table + + Outputs: bitstream advanced by number of bits in codeword + + Return: one decoded symbol **************************************************************************************/ -static int DecodeOneSymbol(BitStreamInfo *bsi, int huffTabIndex) -{ - int nBits, val; - unsigned int bitBuf; - const HuffInfo *hi; - - hi = &(huffTabSBRInfo[huffTabIndex]); - - bitBuf = GetBitsNoAdvance(bsi, hi->maxBits) << (32 - hi->maxBits); - nBits = DecodeHuffmanScalar(huffTabSBR, hi, bitBuf, &val); - AdvanceBitstream(bsi, nBits); - - return val; +static int DecodeOneSymbol(BitStreamInfo *bsi, int huffTabIndex) { + int nBits, val; + unsigned int bitBuf; + const HuffInfo *hi; + + hi = &(huffTabSBRInfo[huffTabIndex]); + + bitBuf = GetBitsNoAdvance(bsi, hi->maxBits) << (32 - hi->maxBits); + nBits = DecodeHuffmanScalar(huffTabSBR, hi, bitBuf, &val); + AdvanceBitstream(bsi, nBits); + + return val; } /* [1.0, sqrt(2)], format = Q29 (one guard bit for decoupling) */ static const int envDQTab[2] PROGMEM = {0x20000000, 0x2d413ccc}; /************************************************************************************** - * Function: DequantizeEnvelope - * - * Description: dequantize envelope scalefactors - * - * Inputs: number of scalefactors to process - * amplitude resolution flag for this frame (0 or 1) - * quantized envelope scalefactors - * - * Outputs: dequantized envelope scalefactors - * - * Return: extra int bits in output (6 + expMax) - * in other words, output format = Q(FBITS_OUT_DQ_ENV - (6 + expMax)) - * - * Notes: dequantized scalefactors have at least 2 GB + Function: DequantizeEnvelope + + Description: dequantize envelope scalefactors + + Inputs: number of scalefactors to process + amplitude resolution flag for this frame (0 or 1) + quantized envelope scalefactors + + Outputs: dequantized envelope scalefactors + + Return: extra int bits in output (6 + expMax) + in other words, output format = Q(FBITS_OUT_DQ_ENV - (6 + expMax)) + + Notes: dequantized scalefactors have at least 2 GB **************************************************************************************/ -static int DequantizeEnvelope(int nBands, int ampRes, signed char *envQuant, int *envDequant) -{ - int exp, expMax, i, scalei; - - if (nBands <= 0) - return 0; - - /* scan for largest dequant value (do separately from envelope decoding to keep code cleaner) */ - expMax = 0; - for (i = 0; i < nBands; i++) { - if (envQuant[i] > expMax) - expMax = envQuant[i]; - } - - /* dequantized envelope gains - * envDequant = 64*2^(envQuant / alpha) = 2^(6 + envQuant / alpha) - * if ampRes == 0, alpha = 2 and range of envQuant = [0, 127] - * if ampRes == 1, alpha = 1 and range of envQuant = [0, 63] - * also if coupling is on, envDequant is scaled by something in range [0, 2] - * so range of envDequant = [2^6, 2^69] (no coupling), [2^6, 2^70] (with coupling) - * - * typical range (from observation) of envQuant/alpha = [0, 27] --> largest envQuant ~= 2^33 - * output: Q(29 - (6 + expMax)) - * - * reference: 14496-3:2001(E)/4.6.18.3.5 and 14496-4:200X/FPDAM8/5.6.5.1.2.1.5 - */ - if (ampRes) { - do { - exp = *envQuant++; - scalei = MIN(expMax - exp, 31); - *envDequant++ = envDQTab[0] >> scalei; - } while (--nBands); - - return (6 + expMax); - } else { - expMax >>= 1; - do { - exp = *envQuant++; - scalei = MIN(expMax - (exp >> 1), 31); - *envDequant++ = envDQTab[exp & 0x01] >> scalei; - } while (--nBands); - - return (6 + expMax); - } +static int DequantizeEnvelope(int nBands, int ampRes, signed char *envQuant, int *envDequant) { + int exp, expMax, i, scalei; + + if (nBands <= 0) { + return 0; + } + + /* scan for largest dequant value (do separately from envelope decoding to keep code cleaner) */ + expMax = 0; + for (i = 0; i < nBands; i++) { + if (envQuant[i] > expMax) { + expMax = envQuant[i]; + } + } + + /* dequantized envelope gains + envDequant = 64*2^(envQuant / alpha) = 2^(6 + envQuant / alpha) + if ampRes == 0, alpha = 2 and range of envQuant = [0, 127] + if ampRes == 1, alpha = 1 and range of envQuant = [0, 63] + also if coupling is on, envDequant is scaled by something in range [0, 2] + so range of envDequant = [2^6, 2^69] (no coupling), [2^6, 2^70] (with coupling) + + typical range (from observation) of envQuant/alpha = [0, 27] --> largest envQuant ~= 2^33 + output: Q(29 - (6 + expMax)) + + reference: 14496-3:2001(E)/4.6.18.3.5 and 14496-4:200X/FPDAM8/5.6.5.1.2.1.5 + */ + if (ampRes) { + do { + exp = *envQuant++; + scalei = MIN(expMax - exp, 31); + *envDequant++ = envDQTab[0] >> scalei; + } while (--nBands); + + return (6 + expMax); + } else { + expMax >>= 1; + do { + exp = *envQuant++; + scalei = MIN(expMax - (exp >> 1), 31); + *envDequant++ = envDQTab[exp & 0x01] >> scalei; + } while (--nBands); + + return (6 + expMax); + } } /************************************************************************************** - * Function: DequantizeNoise - * - * Description: dequantize noise scalefactors - * - * Inputs: number of scalefactors to process - * quantized noise scalefactors - * - * Outputs: dequantized noise scalefactors, format = Q(FBITS_OUT_DQ_NOISE) - * - * Return: none - * - * Notes: dequantized scalefactors have at least 2 GB + Function: DequantizeNoise + + Description: dequantize noise scalefactors + + Inputs: number of scalefactors to process + quantized noise scalefactors + + Outputs: dequantized noise scalefactors, format = Q(FBITS_OUT_DQ_NOISE) + + Return: none + + Notes: dequantized scalefactors have at least 2 GB **************************************************************************************/ -static void DequantizeNoise(int nBands, signed char *noiseQuant, int *noiseDequant) -{ - int exp, scalei; - - if (nBands <= 0) - return; - - /* dequantize noise floor gains (4.6.18.3.5): - * noiseDequant = 2^(NOISE_FLOOR_OFFSET - noiseQuant) - * - * range of noiseQuant = [0, 30] (see 4.6.18.3.6), NOISE_FLOOR_OFFSET = 6 - * so range of noiseDequant = [2^-24, 2^6] - */ - do { - exp = *noiseQuant++; - scalei = NOISE_FLOOR_OFFSET - exp + FBITS_OUT_DQ_NOISE; /* 6 + 24 - exp, exp = [0,30] */ - - if (scalei < 0) - *noiseDequant++ = 0; - else if (scalei < 30) - *noiseDequant++ = 1 << scalei; - else - *noiseDequant++ = 0x3fffffff; /* leave 2 GB */ - - } while (--nBands); +static void DequantizeNoise(int nBands, signed char *noiseQuant, int *noiseDequant) { + int exp, scalei; + + if (nBands <= 0) { + return; + } + + /* dequantize noise floor gains (4.6.18.3.5): + noiseDequant = 2^(NOISE_FLOOR_OFFSET - noiseQuant) + + range of noiseQuant = [0, 30] (see 4.6.18.3.6), NOISE_FLOOR_OFFSET = 6 + so range of noiseDequant = [2^-24, 2^6] + */ + do { + exp = *noiseQuant++; + scalei = NOISE_FLOOR_OFFSET - exp + FBITS_OUT_DQ_NOISE; /* 6 + 24 - exp, exp = [0,30] */ + + if (scalei < 0) { + *noiseDequant++ = 0; + } else if (scalei < 30) { + *noiseDequant++ = 1 << scalei; + } else { + *noiseDequant++ = 0x3fffffff; /* leave 2 GB */ + } + + } while (--nBands); } /************************************************************************************** - * Function: DecodeSBREnvelope - * - * Description: decode delta Huffman coded envelope scalefactors from bitstream - * - * Inputs: BitStreamInfo struct pointing to start of env data - * initialized PSInfoSBR struct - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * - * Outputs: dequantized env scalefactors for left channel (before decoupling) - * dequantized env scalefactors for right channel (if coupling off) - * or raw decoded env scalefactors for right channel (if coupling on) - * - * Return: none + Function: DecodeSBREnvelope + + Description: decode delta Huffman coded envelope scalefactors from bitstream + + Inputs: BitStreamInfo struct pointing to start of env data + initialized PSInfoSBR struct + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + + Outputs: dequantized env scalefactors for left channel (before decoupling) + dequantized env scalefactors for right channel (if coupling off) + or raw decoded env scalefactors for right channel (if coupling on) + + Return: none **************************************************************************************/ -void DecodeSBREnvelope(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) -{ - int huffIndexTime, huffIndexFreq, env, envStartBits, band, nBands, sf, lastEnv; - int freqRes, freqResPrev, dShift, i; - - if (psi->couplingFlag && ch) { - dShift = 1; - if (sbrGrid->ampResFrame) { - huffIndexTime = HuffTabSBR_tEnv30b; - huffIndexFreq = HuffTabSBR_fEnv30b; - envStartBits = 5; - } else { - huffIndexTime = HuffTabSBR_tEnv15b; - huffIndexFreq = HuffTabSBR_fEnv15b; - envStartBits = 6; - } - } else { - dShift = 0; - if (sbrGrid->ampResFrame) { - huffIndexTime = HuffTabSBR_tEnv30; - huffIndexFreq = HuffTabSBR_fEnv30; - envStartBits = 6; - } else { - huffIndexTime = HuffTabSBR_tEnv15; - huffIndexFreq = HuffTabSBR_fEnv15; - envStartBits = 7; - } - } - - /* range of envDataQuant[] = [0, 127] (see comments in DequantizeEnvelope() for reference) */ - for (env = 0; env < sbrGrid->numEnv; env++) { - nBands = (sbrGrid->freqRes[env] ? sbrFreq->nHigh : sbrFreq->nLow); - freqRes = (sbrGrid->freqRes[env]); - freqResPrev = (env == 0 ? sbrGrid->freqResPrev : sbrGrid->freqRes[env-1]); - lastEnv = (env == 0 ? sbrGrid->numEnvPrev-1 : env-1); - if (lastEnv < 0) - lastEnv = 0; /* first frame */ - - ASSERT(nBands <= MAX_QMF_BANDS); - - if (sbrChan->deltaFlagEnv[env] == 0) { - /* delta coding in freq */ - sf = GetBits(bsi, envStartBits) << dShift; - sbrChan->envDataQuant[env][0] = sf; - for (band = 1; band < nBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexFreq) << dShift; - sbrChan->envDataQuant[env][band] = sf + sbrChan->envDataQuant[env][band-1]; - } - } else if (freqRes == freqResPrev) { - /* delta coding in time - same freq resolution for both frames */ - for (band = 0; band < nBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; - sbrChan->envDataQuant[env][band] = sf + sbrChan->envDataQuant[lastEnv][band]; - } - } else if (freqRes == 0 && freqResPrev == 1) { - /* delta coding in time - low freq resolution for new frame, high freq resolution for old frame */ - for (band = 0; band < nBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; - sbrChan->envDataQuant[env][band] = sf; - for (i = 0; i < sbrFreq->nHigh; i++) { - if (sbrFreq->freqHigh[i] == sbrFreq->freqLow[band]) { - sbrChan->envDataQuant[env][band] += sbrChan->envDataQuant[lastEnv][i]; - break; - } - } - } - } else if (freqRes == 1 && freqResPrev == 0) { - /* delta coding in time - high freq resolution for new frame, low freq resolution for old frame */ - for (band = 0; band < nBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; - sbrChan->envDataQuant[env][band] = sf; - for (i = 0; i < sbrFreq->nLow; i++) { - if (sbrFreq->freqLow[i] <= sbrFreq->freqHigh[band] && sbrFreq->freqHigh[band] < sbrFreq->freqLow[i+1] ) { - sbrChan->envDataQuant[env][band] += sbrChan->envDataQuant[lastEnv][i]; - break; - } - } - } - } - - /* skip coupling channel */ - if (ch != 1 || psi->couplingFlag != 1) - psi->envDataDequantScale[ch][env] = DequantizeEnvelope(nBands, sbrGrid->ampResFrame, sbrChan->envDataQuant[env], psi->envDataDequant[ch][env]); - } - sbrGrid->numEnvPrev = sbrGrid->numEnv; - sbrGrid->freqResPrev = sbrGrid->freqRes[sbrGrid->numEnv-1]; +void DecodeSBREnvelope(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) { + int huffIndexTime, huffIndexFreq, env, envStartBits, band, nBands, sf, lastEnv; + int freqRes, freqResPrev, dShift, i; + + if (psi->couplingFlag && ch) { + dShift = 1; + if (sbrGrid->ampResFrame) { + huffIndexTime = HuffTabSBR_tEnv30b; + huffIndexFreq = HuffTabSBR_fEnv30b; + envStartBits = 5; + } else { + huffIndexTime = HuffTabSBR_tEnv15b; + huffIndexFreq = HuffTabSBR_fEnv15b; + envStartBits = 6; + } + } else { + dShift = 0; + if (sbrGrid->ampResFrame) { + huffIndexTime = HuffTabSBR_tEnv30; + huffIndexFreq = HuffTabSBR_fEnv30; + envStartBits = 6; + } else { + huffIndexTime = HuffTabSBR_tEnv15; + huffIndexFreq = HuffTabSBR_fEnv15; + envStartBits = 7; + } + } + + /* range of envDataQuant[] = [0, 127] (see comments in DequantizeEnvelope() for reference) */ + for (env = 0; env < sbrGrid->numEnv; env++) { + nBands = (sbrGrid->freqRes[env] ? sbrFreq->nHigh : sbrFreq->nLow); + freqRes = (sbrGrid->freqRes[env]); + freqResPrev = (env == 0 ? sbrGrid->freqResPrev : sbrGrid->freqRes[env - 1]); + lastEnv = (env == 0 ? sbrGrid->numEnvPrev - 1 : env - 1); + if (lastEnv < 0) { + lastEnv = 0; /* first frame */ + } + + ASSERT(nBands <= MAX_QMF_BANDS); + + if (sbrChan->deltaFlagEnv[env] == 0) { + /* delta coding in freq */ + sf = GetBits(bsi, envStartBits) << dShift; + sbrChan->envDataQuant[env][0] = sf; + for (band = 1; band < nBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexFreq) << dShift; + sbrChan->envDataQuant[env][band] = sf + sbrChan->envDataQuant[env][band - 1]; + } + } else if (freqRes == freqResPrev) { + /* delta coding in time - same freq resolution for both frames */ + for (band = 0; band < nBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; + sbrChan->envDataQuant[env][band] = sf + sbrChan->envDataQuant[lastEnv][band]; + } + } else if (freqRes == 0 && freqResPrev == 1) { + /* delta coding in time - low freq resolution for new frame, high freq resolution for old frame */ + for (band = 0; band < nBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; + sbrChan->envDataQuant[env][band] = sf; + for (i = 0; i < sbrFreq->nHigh; i++) { + if (sbrFreq->freqHigh[i] == sbrFreq->freqLow[band]) { + sbrChan->envDataQuant[env][band] += sbrChan->envDataQuant[lastEnv][i]; + break; + } + } + } + } else if (freqRes == 1 && freqResPrev == 0) { + /* delta coding in time - high freq resolution for new frame, low freq resolution for old frame */ + for (band = 0; band < nBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; + sbrChan->envDataQuant[env][band] = sf; + for (i = 0; i < sbrFreq->nLow; i++) { + if (sbrFreq->freqLow[i] <= sbrFreq->freqHigh[band] && sbrFreq->freqHigh[band] < sbrFreq->freqLow[i + 1]) { + sbrChan->envDataQuant[env][band] += sbrChan->envDataQuant[lastEnv][i]; + break; + } + } + } + } + + /* skip coupling channel */ + if (ch != 1 || psi->couplingFlag != 1) { + psi->envDataDequantScale[ch][env] = DequantizeEnvelope(nBands, sbrGrid->ampResFrame, sbrChan->envDataQuant[env], psi->envDataDequant[ch][env]); + } + } + sbrGrid->numEnvPrev = sbrGrid->numEnv; + sbrGrid->freqResPrev = sbrGrid->freqRes[sbrGrid->numEnv - 1]; } /************************************************************************************** - * Function: DecodeSBRNoise - * - * Description: decode delta Huffman coded noise scalefactors from bitstream - * - * Inputs: BitStreamInfo struct pointing to start of noise data - * initialized PSInfoSBR struct - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel - * index of current channel (0 for SCE, 0 or 1 for CPE) - * - * Outputs: dequantized noise scalefactors for left channel (before decoupling) - * dequantized noise scalefactors for right channel (if coupling off) - * or raw decoded noise scalefactors for right channel (if coupling on) - * - * Return: none + Function: DecodeSBRNoise + + Description: decode delta Huffman coded noise scalefactors from bitstream + + Inputs: BitStreamInfo struct pointing to start of noise data + initialized PSInfoSBR struct + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel + index of current channel (0 for SCE, 0 or 1 for CPE) + + Outputs: dequantized noise scalefactors for left channel (before decoupling) + dequantized noise scalefactors for right channel (if coupling off) + or raw decoded noise scalefactors for right channel (if coupling on) + + Return: none **************************************************************************************/ -void DecodeSBRNoise(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) -{ - int huffIndexTime, huffIndexFreq, noiseFloor, band, dShift, sf, lastNoiseFloor; - - if (psi->couplingFlag && ch) { - dShift = 1; - huffIndexTime = HuffTabSBR_tNoise30b; - huffIndexFreq = HuffTabSBR_fNoise30b; - } else { - dShift = 0; - huffIndexTime = HuffTabSBR_tNoise30; - huffIndexFreq = HuffTabSBR_fNoise30; - } - - for (noiseFloor = 0; noiseFloor < sbrGrid->numNoiseFloors; noiseFloor++) { - lastNoiseFloor = (noiseFloor == 0 ? sbrGrid->numNoiseFloorsPrev-1 : noiseFloor-1); - if (lastNoiseFloor < 0) - lastNoiseFloor = 0; /* first frame */ - - ASSERT(sbrFreq->numNoiseFloorBands <= MAX_QMF_BANDS); - - if (sbrChan->deltaFlagNoise[noiseFloor] == 0) { - /* delta coding in freq */ - sbrChan->noiseDataQuant[noiseFloor][0] = GetBits(bsi, 5) << dShift; - for (band = 1; band < sbrFreq->numNoiseFloorBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexFreq) << dShift; - sbrChan->noiseDataQuant[noiseFloor][band] = sf + sbrChan->noiseDataQuant[noiseFloor][band-1]; - } - } else { - /* delta coding in time */ - for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { - sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; - sbrChan->noiseDataQuant[noiseFloor][band] = sf + sbrChan->noiseDataQuant[lastNoiseFloor][band]; - } - } - - /* skip coupling channel */ - if (ch != 1 || psi->couplingFlag != 1) - DequantizeNoise(sbrFreq->numNoiseFloorBands, sbrChan->noiseDataQuant[noiseFloor], psi->noiseDataDequant[ch][noiseFloor]); - } - sbrGrid->numNoiseFloorsPrev = sbrGrid->numNoiseFloors; +void DecodeSBRNoise(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch) { + int huffIndexTime, huffIndexFreq, noiseFloor, band, dShift, sf, lastNoiseFloor; + + if (psi->couplingFlag && ch) { + dShift = 1; + huffIndexTime = HuffTabSBR_tNoise30b; + huffIndexFreq = HuffTabSBR_fNoise30b; + } else { + dShift = 0; + huffIndexTime = HuffTabSBR_tNoise30; + huffIndexFreq = HuffTabSBR_fNoise30; + } + + for (noiseFloor = 0; noiseFloor < sbrGrid->numNoiseFloors; noiseFloor++) { + lastNoiseFloor = (noiseFloor == 0 ? sbrGrid->numNoiseFloorsPrev - 1 : noiseFloor - 1); + if (lastNoiseFloor < 0) { + lastNoiseFloor = 0; /* first frame */ + } + + ASSERT(sbrFreq->numNoiseFloorBands <= MAX_QMF_BANDS); + + if (sbrChan->deltaFlagNoise[noiseFloor] == 0) { + /* delta coding in freq */ + sbrChan->noiseDataQuant[noiseFloor][0] = GetBits(bsi, 5) << dShift; + for (band = 1; band < sbrFreq->numNoiseFloorBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexFreq) << dShift; + sbrChan->noiseDataQuant[noiseFloor][band] = sf + sbrChan->noiseDataQuant[noiseFloor][band - 1]; + } + } else { + /* delta coding in time */ + for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { + sf = DecodeOneSymbol(bsi, huffIndexTime) << dShift; + sbrChan->noiseDataQuant[noiseFloor][band] = sf + sbrChan->noiseDataQuant[lastNoiseFloor][band]; + } + } + + /* skip coupling channel */ + if (ch != 1 || psi->couplingFlag != 1) { + DequantizeNoise(sbrFreq->numNoiseFloorBands, sbrChan->noiseDataQuant[noiseFloor], psi->noiseDataDequant[ch][noiseFloor]); + } + } + sbrGrid->numNoiseFloorsPrev = sbrGrid->numNoiseFloors; } /* dqTabCouple[i] = 2 / (1 + 2^(12 - i)), format = Q30 */ static const int dqTabCouple[25] PROGMEM = { - 0x0007ff80, 0x000ffe00, 0x001ff802, 0x003fe010, 0x007f8080, 0x00fe03f8, 0x01f81f82, 0x03e0f83e, - 0x07878788, 0x0e38e38e, 0x1999999a, 0x2aaaaaab, 0x40000000, 0x55555555, 0x66666666, 0x71c71c72, - 0x78787878, 0x7c1f07c2, 0x7e07e07e, 0x7f01fc08, 0x7f807f80, 0x7fc01ff0, 0x7fe007fe, 0x7ff00200, - 0x7ff80080, + 0x0007ff80, 0x000ffe00, 0x001ff802, 0x003fe010, 0x007f8080, 0x00fe03f8, 0x01f81f82, 0x03e0f83e, + 0x07878788, 0x0e38e38e, 0x1999999a, 0x2aaaaaab, 0x40000000, 0x55555555, 0x66666666, 0x71c71c72, + 0x78787878, 0x7c1f07c2, 0x7e07e07e, 0x7f01fc08, 0x7f807f80, 0x7fc01ff0, 0x7fe007fe, 0x7ff00200, + 0x7ff80080, }; /************************************************************************************** - * Function: UncoupleSBREnvelope - * - * Description: scale dequantized envelope scalefactors according to channel - * coupling rules - * - * Inputs: initialized PSInfoSBR struct including - * dequantized envelope data for left channel - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for right channel including - * quantized envelope scalefactors - * - * Outputs: dequantized envelope data for left channel (after decoupling) - * dequantized envelope data for right channel (after decoupling) - * - * Return: none + Function: UncoupleSBREnvelope + + Description: scale dequantized envelope scalefactors according to channel + coupling rules + + Inputs: initialized PSInfoSBR struct including + dequantized envelope data for left channel + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for right channel including + quantized envelope scalefactors + + Outputs: dequantized envelope data for left channel (after decoupling) + dequantized envelope data for right channel (after decoupling) + + Return: none **************************************************************************************/ -void UncoupleSBREnvelope(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR) -{ - int env, band, nBands, scalei, E_1; - - scalei = (sbrGrid->ampResFrame ? 0 : 1); - for (env = 0; env < sbrGrid->numEnv; env++) { - nBands = (sbrGrid->freqRes[env] ? sbrFreq->nHigh : sbrFreq->nLow); - psi->envDataDequantScale[1][env] = psi->envDataDequantScale[0][env]; /* same scalefactor for L and R */ - for (band = 0; band < nBands; band++) { - /* clip E_1 to [0, 24] (scalefactors approach 0 or 2) */ - E_1 = sbrChanR->envDataQuant[env][band] >> scalei; - if (E_1 < 0) E_1 = 0; - if (E_1 > 24) E_1 = 24; - - /* envDataDequant[0] has 1 GB, so << by 2 is okay */ - psi->envDataDequant[1][env][band] = MULSHIFT32(psi->envDataDequant[0][env][band], dqTabCouple[24 - E_1]) << 2; - psi->envDataDequant[0][env][band] = MULSHIFT32(psi->envDataDequant[0][env][band], dqTabCouple[E_1]) << 2; - } - } +void UncoupleSBREnvelope(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR) { + int env, band, nBands, scalei, E_1; + + scalei = (sbrGrid->ampResFrame ? 0 : 1); + for (env = 0; env < sbrGrid->numEnv; env++) { + nBands = (sbrGrid->freqRes[env] ? sbrFreq->nHigh : sbrFreq->nLow); + psi->envDataDequantScale[1][env] = psi->envDataDequantScale[0][env]; /* same scalefactor for L and R */ + for (band = 0; band < nBands; band++) { + /* clip E_1 to [0, 24] (scalefactors approach 0 or 2) */ + E_1 = sbrChanR->envDataQuant[env][band] >> scalei; + if (E_1 < 0) { + E_1 = 0; + } + if (E_1 > 24) { + E_1 = 24; + } + + /* envDataDequant[0] has 1 GB, so << by 2 is okay */ + psi->envDataDequant[1][env][band] = MULSHIFT32(psi->envDataDequant[0][env][band], dqTabCouple[24 - E_1]) << 2; + psi->envDataDequant[0][env][band] = MULSHIFT32(psi->envDataDequant[0][env][band], dqTabCouple[E_1]) << 2; + } + } } /************************************************************************************** - * Function: UncoupleSBRNoise - * - * Description: scale dequantized noise floor scalefactors according to channel - * coupling rules - * - * Inputs: initialized PSInfoSBR struct including - * dequantized noise data for left channel - * initialized SBRGrid struct for this channel - * initialized SBRFreq struct for this SCE/CPE block - * initialized SBRChan struct for this channel including - * quantized noise scalefactors - * - * Outputs: dequantized noise data for left channel (after decoupling) - * dequantized noise data for right channel (after decoupling) - * - * Return: none + Function: UncoupleSBRNoise + + Description: scale dequantized noise floor scalefactors according to channel + coupling rules + + Inputs: initialized PSInfoSBR struct including + dequantized noise data for left channel + initialized SBRGrid struct for this channel + initialized SBRFreq struct for this SCE/CPE block + initialized SBRChan struct for this channel including + quantized noise scalefactors + + Outputs: dequantized noise data for left channel (after decoupling) + dequantized noise data for right channel (after decoupling) + + Return: none **************************************************************************************/ -void UncoupleSBRNoise(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR) -{ - int noiseFloor, band, Q_1; - - for (noiseFloor = 0; noiseFloor < sbrGrid->numNoiseFloors; noiseFloor++) { - for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { - /* Q_1 should be in range [0, 24] according to 4.6.18.3.6, but check to make sure */ - Q_1 = sbrChanR->noiseDataQuant[noiseFloor][band]; - if (Q_1 < 0) Q_1 = 0; - if (Q_1 > 24) Q_1 = 24; - - /* noiseDataDequant[0] has 1 GB, so << by 2 is okay */ - psi->noiseDataDequant[1][noiseFloor][band] = MULSHIFT32(psi->noiseDataDequant[0][noiseFloor][band], dqTabCouple[24 - Q_1]) << 2; - psi->noiseDataDequant[0][noiseFloor][band] = MULSHIFT32(psi->noiseDataDequant[0][noiseFloor][band], dqTabCouple[Q_1]) << 2; - } - } +void UncoupleSBRNoise(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR) { + int noiseFloor, band, Q_1; + + for (noiseFloor = 0; noiseFloor < sbrGrid->numNoiseFloors; noiseFloor++) { + for (band = 0; band < sbrFreq->numNoiseFloorBands; band++) { + /* Q_1 should be in range [0, 24] according to 4.6.18.3.6, but check to make sure */ + Q_1 = sbrChanR->noiseDataQuant[noiseFloor][band]; + if (Q_1 < 0) { + Q_1 = 0; + } + if (Q_1 > 24) { + Q_1 = 24; + } + + /* noiseDataDequant[0] has 1 GB, so << by 2 is okay */ + psi->noiseDataDequant[1][noiseFloor][band] = MULSHIFT32(psi->noiseDataDequant[0][noiseFloor][band], dqTabCouple[24 - Q_1]) << 2; + psi->noiseDataDequant[0][noiseFloor][band] = MULSHIFT32(psi->noiseDataDequant[0][noiseFloor][band], dqTabCouple[Q_1]) << 2; + } + } } diff --git a/src/libhelix-aac/sbrimdct.c b/src/libhelix-aac/sbrimdct.c index 365ff02a..fa225185 100644 --- a/src/libhelix-aac/sbrimdct.c +++ b/src/libhelix-aac/sbrimdct.c @@ -1,447 +1,443 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrimdct.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrimdct.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrimdct.c - inverse MDCT without clipping or interleaving, for input to SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrimdct.c - inverse MDCT without clipping or interleaving, for input to SBR **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: DecWindowOverlapNoClip - * - * Description: apply synthesis window, do overlap-add without clipping, - * for winSequence LONG-LONG - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 32-bit PCM, non-interleaved - * - * Return: none - * - * Notes: use this function when the decoded PCM is going to the SBR decoder + Function: DecWindowOverlapNoClip + + Description: apply synthesis window, do overlap-add without clipping, + for winSequence LONG-LONG + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 32-bit PCM, non-interleaved + + Return: none + + Notes: use this function when the decoded PCM is going to the SBR decoder **************************************************************************************/ -void DecWindowOverlapNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) -{ - int in, w0, w1, f0, f1; - int *buf1, *over1, *out1; - const int *wndPrev, *wndCurr; - - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - out1 = out0 + 1024 - 1; - over1 = over0 + 1024 - 1; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - if (winTypeCurr == winTypePrev) { - /* cut window loads in half since current and overlap sections use same symmetric window */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *out0++ = in - f0; - - in = *over1; - *out1-- = in + f1; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } else { - /* different windows for current and overlap parts - should still fit in registers on ARM w/o stack spill */ - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *out0++ = in - f0; - - in = *over1; - *out1-- = in + f1; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } +void DecWindowOverlapNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) { + int in, w0, w1, f0, f1; + int *buf1, *over1, *out1; + const int *wndPrev, *wndCurr; + + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + out1 = out0 + 1024 - 1; + over1 = over0 + 1024 - 1; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + if (winTypeCurr == winTypePrev) { + /* cut window loads in half since current and overlap sections use same symmetric window */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *out0++ = in - f0; + + in = *over1; + *out1-- = in + f1; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } else { + /* different windows for current and overlap parts - should still fit in registers on ARM w/o stack spill */ + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *out0++ = in - f0; + + in = *over1; + *out1-- = in + f1; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } } /************************************************************************************** - * Function: DecWindowOverlapLongStart - * - * Description: apply synthesis window, do overlap-add, without clipping - * for winSequence LONG-START - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 32-bit PCM, non-interleaved - * - * Return: none - * - * Notes: use this function when the decoded PCM is going to the SBR decoder + Function: DecWindowOverlapLongStart + + Description: apply synthesis window, do overlap-add, without clipping + for winSequence LONG-START + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 32-bit PCM, non-interleaved + + Return: none + + Notes: use this function when the decoded PCM is going to the SBR decoder **************************************************************************************/ -void DecWindowOverlapLongStartNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1, *out1; - const int *wndPrev, *wndCurr; +void DecWindowOverlapLongStartNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1, *out1; + const int *wndPrev, *wndCurr; - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - out1 = out0 + 1024 - 1; - over1 = over0 + 1024 - 1; + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + out1 = out0 + 1024 - 1; + over1 = over0 + 1024 - 1; - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - i = 448; /* 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + i = 448; /* 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); - in = *over0; - *out0++ = in - f0; + in = *over0; + *out0++ = in - f0; - in = *over1; - *out1-- = in + f1; + in = *over1; + *out1-- = in + f1; - in = *buf1--; + in = *buf1--; - *over1-- = 0; /* Wn = 0 for n = (2047, 2046, ... 1600) */ - *over0++ = in >> 1; /* Wn = 1 for n = (1024, 1025, ... 1471) */ - } while (--i); + *over1-- = 0; /* Wn = 0 for n = (2047, 2046, ... 1600) */ + *over0++ = in >> 1; /* Wn = 1 for n = (1024, 1025, ... 1471) */ + } while (--i); - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - /* do 64 more loops - 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; - w1 = *wndPrev++; - in = *buf0++; + /* do 64 more loops - 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; + w1 = *wndPrev++; + in = *buf0++; - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); - in = *over0; - *out0++ = in - f0; + in = *over0; + *out0++ = in - f0; - in = *over1; - *out1-- = in + f1; + in = *over1; + *out1-- = in + f1; - w0 = *wndCurr++; /* W[0], W[1], ... --> W[255], W[254], ... */ - w1 = *wndCurr++; /* W[127], W[126], ... --> W[128], W[129], ... */ - in = *buf1--; + w0 = *wndCurr++; /* W[0], W[1], ... --> W[255], W[254], ... */ + w1 = *wndCurr++; /* W[127], W[126], ... --> W[128], W[129], ... */ + in = *buf1--; - *over1-- = MULSHIFT32(w0, in); /* Wn = short window for n = (1599, 1598, ... , 1536) */ - *over0++ = MULSHIFT32(w1, in); /* Wn = short window for n = (1472, 1473, ... , 1535) */ - } while (over0 < over1); + *over1-- = MULSHIFT32(w0, in); /* Wn = short window for n = (1599, 1598, ... , 1536) */ + *over0++ = MULSHIFT32(w1, in); /* Wn = short window for n = (1472, 1473, ... , 1535) */ + } while (over0 < over1); } /************************************************************************************** - * Function: DecWindowOverlapLongStop - * - * Description: apply synthesis window, do overlap-add, without clipping - * for winSequence LONG-STOP - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 32-bit PCM, non-interleaved - * - * Return: none - * - * Notes: use this function when the decoded PCM is going to the SBR decoder + Function: DecWindowOverlapLongStop + + Description: apply synthesis window, do overlap-add, without clipping + for winSequence LONG-STOP + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 32-bit PCM, non-interleaved + + Return: none + + Notes: use this function when the decoded PCM is going to the SBR decoder **************************************************************************************/ -void DecWindowOverlapLongStopNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1, *out1; - const int *wndPrev, *wndCurr; - - buf0 += (1024 >> 1); - buf1 = buf0 - 1; - out1 = out0 + 1024 - 1; - over1 = over0 + 1024 - 1; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); - - i = 448; /* 2 outputs, 2 overlaps per loop */ - do { - /* Wn = 0 for n = (0, 1, ... 447) */ - /* Wn = 1 for n = (576, 577, ... 1023) */ - in = *buf0++; - f1 = in >> 1; /* scale since skipping multiply by Q31 */ - - in = *over0; - *out0++ = in; - - in = *over1; - *out1-- = in + f1; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (--i); - - /* do 64 more loops - 2 outputs, 2 overlaps per loop */ - do { - w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ - w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *out0++ = in - f0; - - in = *over1; - *out1-- = in + f1; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); +void DecWindowOverlapLongStopNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1, *out1; + const int *wndPrev, *wndCurr; + + buf0 += (1024 >> 1); + buf1 = buf0 - 1; + out1 = out0 + 1024 - 1; + over1 = over0 + 1024 - 1; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]); + + i = 448; /* 2 outputs, 2 overlaps per loop */ + do { + /* Wn = 0 for n = (0, 1, ... 447) */ + /* Wn = 1 for n = (576, 577, ... 1023) */ + in = *buf0++; + f1 = in >> 1; /* scale since skipping multiply by Q31 */ + + in = *over0; + *out0++ = in; + + in = *over1; + *out1-- = in + f1; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (--i); + + /* do 64 more loops - 2 outputs, 2 overlaps per loop */ + do { + w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ + w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *out0++ = in - f0; + + in = *over1; + *out1-- = in + f1; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); } /************************************************************************************** - * Function: DecWindowOverlapShort - * - * Description: apply synthesis window, do overlap-add, without clipping - * for winSequence EIGHT-SHORT (does all 8 short blocks) - * - * Inputs: input buffer (output of type-IV DCT) - * overlap buffer (saved from last time) - * window type (sin or KBD) for input buffer - * window type (sin or KBD) for overlap buffer - * - * Outputs: one channel, one frame of 32-bit PCM, non-interleaved - * - * Return: none - * - * Notes: use this function when the decoded PCM is going to the SBR decoder + Function: DecWindowOverlapShort + + Description: apply synthesis window, do overlap-add, without clipping + for winSequence EIGHT-SHORT (does all 8 short blocks) + + Inputs: input buffer (output of type-IV DCT) + overlap buffer (saved from last time) + window type (sin or KBD) for input buffer + window type (sin or KBD) for overlap buffer + + Outputs: one channel, one frame of 32-bit PCM, non-interleaved + + Return: none + + Notes: use this function when the decoded PCM is going to the SBR decoder **************************************************************************************/ -void DecWindowOverlapShortNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) -{ - int i, in, w0, w1, f0, f1; - int *buf1, *over1, *out1; - const int *wndPrev, *wndCurr; - - wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); - - /* pcm[0-447] = 0 + overlap[0-447] */ - i = 448; - do { - f0 = *over0++; - f1 = *over0++; - *out0++ = f0; - *out0++ = f1; - i -= 2; - } while (i); - - /* pcm[448-575] = Wp[0-127] * block0[0-127] + overlap[448-575] */ - out1 = out0 + (128 - 1); - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - do { - w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ - w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *over0; - *out0++ = in - f0; - - in = *over1; - *out1-- = in + f1; - - w0 = *wndCurr++; - w1 = *wndCurr++; - in = *buf1--; - - /* save over0/over1 for next short block, in the slots just vacated */ - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - - /* pcm[576-703] = Wc[128-255] * block0[128-255] + Wc[0-127] * block1[0-127] + overlap[576-703] - * pcm[704-831] = Wc[128-255] * block1[128-255] + Wc[0-127] * block2[0-127] + overlap[704-831] - * pcm[832-959] = Wc[128-255] * block2[128-255] + Wc[0-127] * block3[0-127] + overlap[832-959] - */ - for (i = 0; i < 3; i++) { - out0 += 64; - out1 = out0 + 128 - 1; - over0 += 64; - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *(over0 - 128); /* from last short block */ - in += *(over0 + 0); /* from last full frame */ - *out0++ = in - f0; - - in = *(over1 - 128); /* from last short block */ - in += *(over1 + 0); /* from last full frame */ - *out1-- = in + f1; - - /* save over0/over1 for next short block, in the slots just vacated */ - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } - - /* pcm[960-1023] = Wc[128-191] * block3[128-191] + Wc[0-63] * block4[0-63] + overlap[960-1023] - * over[0-63] = Wc[192-255] * block3[192-255] + Wc[64-127] * block4[64-127] - */ - out0 += 64; - over0 -= 832; /* points at overlap[64] */ - over1 = over0 + 128 - 1; /* points at overlap[191] */ - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - in = *(over0 + 768); /* from last short block */ - in += *(over0 + 896); /* from last full frame */ - *out0++ = in - f0; - - in = *(over1 + 768); /* from last short block */ - *(over1 - 128) = in + f1; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); /* save in overlap[128-191] */ - *over0++ = MULSHIFT32(w1, in); /* save in overlap[64-127] */ - } while (over0 < over1); - - /* over0 now points at overlap[128] */ - - /* over[64-191] = Wc[128-255] * block4[128-255] + Wc[0-127] * block5[0-127] - * over[192-319] = Wc[128-255] * block5[128-255] + Wc[0-127] * block6[0-127] - * over[320-447] = Wc[128-255] * block6[128-255] + Wc[0-127] * block7[0-127] - * over[448-576] = Wc[128-255] * block7[128-255] - */ - for (i = 0; i < 3; i++) { - over0 += 64; - over1 = over0 + 128 - 1; - buf0 += 64; - buf1 = buf0 - 1; - wndCurr -= 128; - do { - w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ - w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ - in = *buf0++; - - f0 = MULSHIFT32(w0, in); - f1 = MULSHIFT32(w1, in); - - /* from last short block */ - *(over0 - 128) -= f0; - *(over1 - 128)+= f1; - - in = *buf1--; - *over1-- = MULSHIFT32(w0, in); - *over0++ = MULSHIFT32(w1, in); - } while (over0 < over1); - } - - /* over[576-1024] = 0 */ - i = 448; - over0 += 64; - do { - *over0++ = 0; - *over0++ = 0; - *over0++ = 0; - *over0++ = 0; - i -= 4; - } while (i); +void DecWindowOverlapShortNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev) { + int i, in, w0, w1, f0, f1; + int *buf1, *over1, *out1; + const int *wndPrev, *wndCurr; + + wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]); + + /* pcm[0-447] = 0 + overlap[0-447] */ + i = 448; + do { + f0 = *over0++; + f1 = *over0++; + *out0++ = f0; + *out0++ = f1; + i -= 2; + } while (i); + + /* pcm[448-575] = Wp[0-127] * block0[0-127] + overlap[448-575] */ + out1 = out0 + (128 - 1); + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + do { + w0 = *wndPrev++; /* W[0], W[1], ...W[63] */ + w1 = *wndPrev++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *over0; + *out0++ = in - f0; + + in = *over1; + *out1-- = in + f1; + + w0 = *wndCurr++; + w1 = *wndCurr++; + in = *buf1--; + + /* save over0/over1 for next short block, in the slots just vacated */ + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + + /* pcm[576-703] = Wc[128-255] * block0[128-255] + Wc[0-127] * block1[0-127] + overlap[576-703] + pcm[704-831] = Wc[128-255] * block1[128-255] + Wc[0-127] * block2[0-127] + overlap[704-831] + pcm[832-959] = Wc[128-255] * block2[128-255] + Wc[0-127] * block3[0-127] + overlap[832-959] + */ + for (i = 0; i < 3; i++) { + out0 += 64; + out1 = out0 + 128 - 1; + over0 += 64; + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *(over0 - 128); /* from last short block */ + in += *(over0 + 0); /* from last full frame */ + *out0++ = in - f0; + + in = *(over1 - 128); /* from last short block */ + in += *(over1 + 0); /* from last full frame */ + *out1-- = in + f1; + + /* save over0/over1 for next short block, in the slots just vacated */ + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } + + /* pcm[960-1023] = Wc[128-191] * block3[128-191] + Wc[0-63] * block4[0-63] + overlap[960-1023] + over[0-63] = Wc[192-255] * block3[192-255] + Wc[64-127] * block4[64-127] + */ + out0 += 64; + over0 -= 832; /* points at overlap[64] */ + over1 = over0 + 128 - 1; /* points at overlap[191] */ + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + in = *(over0 + 768); /* from last short block */ + in += *(over0 + 896); /* from last full frame */ + *out0++ = in - f0; + + in = *(over1 + 768); /* from last short block */ + *(over1 - 128) = in + f1; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); /* save in overlap[128-191] */ + *over0++ = MULSHIFT32(w1, in); /* save in overlap[64-127] */ + } while (over0 < over1); + + /* over0 now points at overlap[128] */ + + /* over[64-191] = Wc[128-255] * block4[128-255] + Wc[0-127] * block5[0-127] + over[192-319] = Wc[128-255] * block5[128-255] + Wc[0-127] * block6[0-127] + over[320-447] = Wc[128-255] * block6[128-255] + Wc[0-127] * block7[0-127] + over[448-576] = Wc[128-255] * block7[128-255] + */ + for (i = 0; i < 3; i++) { + over0 += 64; + over1 = over0 + 128 - 1; + buf0 += 64; + buf1 = buf0 - 1; + wndCurr -= 128; + do { + w0 = *wndCurr++; /* W[0], W[1], ...W[63] */ + w1 = *wndCurr++; /* W[127], W[126], ... W[64] */ + in = *buf0++; + + f0 = MULSHIFT32(w0, in); + f1 = MULSHIFT32(w1, in); + + /* from last short block */ + *(over0 - 128) -= f0; + *(over1 - 128) += f1; + + in = *buf1--; + *over1-- = MULSHIFT32(w0, in); + *over0++ = MULSHIFT32(w1, in); + } while (over0 < over1); + } + + /* over[576-1024] = 0 */ + i = 448; + over0 += 64; + do { + *over0++ = 0; + *over0++ = 0; + *over0++ = 0; + *over0++ = 0; + i -= 4; + } while (i); } diff --git a/src/libhelix-aac/sbrmath.c b/src/libhelix-aac/sbrmath.c index 930889d8..e738d6f1 100644 --- a/src/libhelix-aac/sbrmath.c +++ b/src/libhelix-aac/sbrmath.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrmath.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrmath.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrmath.c - fixed-point math functions for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrmath.c - fixed-point math functions for SBR **************************************************************************************/ #include "sbr.h" @@ -52,49 +52,48 @@ #define NUM_ITER_IRN 5 /************************************************************************************** - * Function: InvRNormalized - * - * Description: use Newton's method to solve for x = 1/r - * - * Inputs: r = Q31, range = [0.5, 1) (normalize your inputs to this range) - * - * Outputs: none - * - * Return: x = Q29, range ~= [1.0, 2.0] - * - * Notes: guaranteed to converge and not overflow for any r in [0.5, 1) - * - * xn+1 = xn - f(xn)/f'(xn) - * f(x) = 1/r - x = 0 (find root) - * = 1/x - r - * f'(x) = -1/x^2 - * - * so xn+1 = xn - (1/xn - r) / (-1/xn^2) - * = xn * (2 - r*xn) - * - * NUM_ITER_IRN = 2, maxDiff = 6.2500e-02 (precision of about 4 bits) - * NUM_ITER_IRN = 3, maxDiff = 3.9063e-03 (precision of about 8 bits) - * NUM_ITER_IRN = 4, maxDiff = 1.5288e-05 (precision of about 16 bits) - * NUM_ITER_IRN = 5, maxDiff = 3.0034e-08 (precision of about 24 bits) + Function: InvRNormalized + + Description: use Newton's method to solve for x = 1/r + + Inputs: r = Q31, range = [0.5, 1) (normalize your inputs to this range) + + Outputs: none + + Return: x = Q29, range ~= [1.0, 2.0] + + Notes: guaranteed to converge and not overflow for any r in [0.5, 1) + + xn+1 = xn - f(xn)/f'(xn) + f(x) = 1/r - x = 0 (find root) + = 1/x - r + f'(x) = -1/x^2 + + so xn+1 = xn - (1/xn - r) / (-1/xn^2) + = xn * (2 - r*xn) + + NUM_ITER_IRN = 2, maxDiff = 6.2500e-02 (precision of about 4 bits) + NUM_ITER_IRN = 3, maxDiff = 3.9063e-03 (precision of about 8 bits) + NUM_ITER_IRN = 4, maxDiff = 1.5288e-05 (precision of about 16 bits) + NUM_ITER_IRN = 5, maxDiff = 3.0034e-08 (precision of about 24 bits) **************************************************************************************/ -int InvRNormalized(int r) -{ - int i, xn, t; - - /* r = [0.5, 1.0) - * 1/r = (1.0, 2.0] - * so use 1.5 as initial guess - */ - xn = Q28_15; - - /* xn = xn*(2.0 - r*xn) */ - for (i = NUM_ITER_IRN; i != 0; i--) { - t = MULSHIFT32(r, xn); /* Q31*Q29 = Q28 */ - t = Q28_2 - t; /* Q28 */ - xn = MULSHIFT32(xn, t) << 4; /* Q29*Q28 << 4 = Q29 */ - } - - return xn; +int InvRNormalized(int r) { + int i, xn, t; + + /* r = [0.5, 1.0) + 1/r = (1.0, 2.0] + so use 1.5 as initial guess + */ + xn = Q28_15; + + /* xn = xn*(2.0 - r*xn) */ + for (i = NUM_ITER_IRN; i != 0; i--) { + t = MULSHIFT32(r, xn); /* Q31*Q29 = Q28 */ + t = Q28_2 - t; /* Q28 */ + xn = MULSHIFT32(xn, t) << 4; /* Q29*Q28 << 4 = Q29 */ + } + + return xn; } #define NUM_TERMS_RPI 5 @@ -104,92 +103,93 @@ int InvRNormalized(int r) static const int invTab[NUM_TERMS_RPI] PROGMEM = {0x40000000, 0x20000000, 0x15555555, 0x10000000, 0x0ccccccd}; /************************************************************************************** - * Function: RatioPowInv - * - * Description: use Taylor (MacLaurin) series expansion to calculate (a/b) ^ (1/c) - * - * Inputs: a = [1, 64], b = [1, 64], c = [1, 64], a >= b - * - * Outputs: none - * - * Return: y = Q24, range ~= [0.015625, 64] + Function: RatioPowInv + + Description: use Taylor (MacLaurin) series expansion to calculate (a/b) ^ (1/c) + + Inputs: a = [1, 64], b = [1, 64], c = [1, 64], a >= b + + Outputs: none + + Return: y = Q24, range ~= [0.015625, 64] **************************************************************************************/ -int RatioPowInv(int a, int b, int c) -{ - int lna, lnb, i, p, t, y; +int RatioPowInv(int a, int b, int c) { + int lna, lnb, i, p, t, y; - if (a < 1 || b < 1 || c < 1 || a > 64 || b > 64 || c > 64 || a < b) - return 0; + if (a < 1 || b < 1 || c < 1 || a > 64 || b > 64 || c > 64 || a < b) { + return 0; + } - lna = MULSHIFT32(log2Tab[a], LOG2_EXP_INV) << 1; /* ln(a), Q28 */ - lnb = MULSHIFT32(log2Tab[b], LOG2_EXP_INV) << 1; /* ln(b), Q28 */ - p = (lna - lnb) / c; /* Q28 */ + lna = MULSHIFT32(log2Tab[a], LOG2_EXP_INV) << 1; /* ln(a), Q28 */ + lnb = MULSHIFT32(log2Tab[b], LOG2_EXP_INV) << 1; /* ln(b), Q28 */ + p = (lna - lnb) / c; /* Q28 */ - /* sum in Q24 */ - y = (1 << 24); - t = p >> 4; /* t = p^1 * 1/1! (Q24)*/ - y += t; + /* sum in Q24 */ + y = (1 << 24); + t = p >> 4; /* t = p^1 * 1/1! (Q24)*/ + y += t; - for (i = 2; i <= NUM_TERMS_RPI; i++) { - t = MULSHIFT32(invTab[i-1], t) << 2; - t = MULSHIFT32(p, t) << 4; /* t = p^i * 1/i! (Q24) */ - y += t; - } + for (i = 2; i <= NUM_TERMS_RPI; i++) { + t = MULSHIFT32(invTab[i - 1], t) << 2; + t = MULSHIFT32(p, t) << 4; /* t = p^i * 1/i! (Q24) */ + y += t; + } - return y; + return y; } /************************************************************************************** - * Function: SqrtFix - * - * Description: use binary search to calculate sqrt(q) - * - * Inputs: q = Q30 - * number of fraction bits in input - * - * Outputs: number of fraction bits in output - * - * Return: lo = Q(fBitsOut) - * - * Notes: absolute precision varies depending on fBitsIn - * normalizes input to range [0x200000000, 0x7fffffff] and takes - * floor(sqrt(input)), and sets fBitsOut appropriately + Function: SqrtFix + + Description: use binary search to calculate sqrt(q) + + Inputs: q = Q30 + number of fraction bits in input + + Outputs: number of fraction bits in output + + Return: lo = Q(fBitsOut) + + Notes: absolute precision varies depending on fBitsIn + normalizes input to range [0x200000000, 0x7fffffff] and takes + floor(sqrt(input)), and sets fBitsOut appropriately **************************************************************************************/ -int SqrtFix(int q, int fBitsIn, int *fBitsOut) -{ - int z, lo, hi, mid; - - if (q <= 0) { - *fBitsOut = fBitsIn; - return 0; - } - - /* force even fBitsIn */ - z = fBitsIn & 0x01; - q >>= z; - fBitsIn -= z; - - /* for max precision, normalize to [0x20000000, 0x7fffffff] */ - z = (CLZ(q) - 1); - z >>= 1; - q <<= (2*z); - - /* choose initial bounds */ - lo = 1; - if (q >= 0x10000000) - lo = 16384; /* (int)sqrt(0x10000000) */ - hi = 46340; /* (int)sqrt(0x7fffffff) */ - - /* do binary search with 32x32->32 multiply test */ - do { - mid = (lo + hi) >> 1; - if (mid*mid > q) - hi = mid - 1; - else - lo = mid + 1; - } while (hi >= lo); - lo--; - - *fBitsOut = ((fBitsIn + 2*z) >> 1); - return lo; +int SqrtFix(int q, int fBitsIn, int *fBitsOut) { + int z, lo, hi, mid; + + if (q <= 0) { + *fBitsOut = fBitsIn; + return 0; + } + + /* force even fBitsIn */ + z = fBitsIn & 0x01; + q >>= z; + fBitsIn -= z; + + /* for max precision, normalize to [0x20000000, 0x7fffffff] */ + z = (CLZ(q) - 1); + z >>= 1; + q <<= (2 * z); + + /* choose initial bounds */ + lo = 1; + if (q >= 0x10000000) { + lo = 16384; /* (int)sqrt(0x10000000) */ + } + hi = 46340; /* (int)sqrt(0x7fffffff) */ + + /* do binary search with 32x32->32 multiply test */ + do { + mid = (lo + hi) >> 1; + if (mid * mid > q) { + hi = mid - 1; + } else { + lo = mid + 1; + } + } while (hi >= lo); + lo--; + + *fBitsOut = ((fBitsIn + 2 * z) >> 1); + return lo; } diff --git a/src/libhelix-aac/sbrqmf.c b/src/libhelix-aac/sbrqmf.c index 83cf14a4..7ac1fb32 100644 --- a/src/libhelix-aac/sbrqmf.c +++ b/src/libhelix-aac/sbrqmf.c @@ -1,376 +1,413 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrqmf.c,v 1.2 2005/05/19 20:45:20 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrqmf.c,v 1.2 2005/05/19 20:45:20 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrqmf.c - analysis and synthesis QMF filters for SBR + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrqmf.c - analysis and synthesis QMF filters for SBR **************************************************************************************/ #include "sbr.h" #include "assembly.h" -/* PreMultiply64() table - * format = Q30 - * reordered for sequential access - * - * for (i = 0; i < 64/4; i++) { - * angle = (i + 0.25) * M_PI / nmdct; - * x = (cos(angle) + sin(angle)); - * x = sin(angle); - * - * angle = (nmdct/2 - 1 - i + 0.25) * M_PI / nmdct; - * x = (cos(angle) + sin(angle)); - * x = sin(angle); - * } - */ +/* PreMultiply64() table + format = Q30 + reordered for sequential access + + for (i = 0; i < 64/4; i++) { + angle = (i + 0.25) * M_PI / nmdct; + x = (cos(angle) + sin(angle)); + x = sin(angle); + + angle = (nmdct/2 - 1 - i + 0.25) * M_PI / nmdct; + x = (cos(angle) + sin(angle)); + x = sin(angle); + } +*/ static const int cos4sin4tab64[64] PROGMEM = { - 0x40c7d2bd, 0x00c90e90, 0x424ff28f, 0x3ff4e5e0, 0x43cdd89a, 0x03ecadcf, 0x454149fc, 0x3fc395f9, - 0x46aa0d6d, 0x070de172, 0x4807eb4b, 0x3f6af2e3, 0x495aada2, 0x0a2abb59, 0x4aa22036, 0x3eeb3347, - 0x4bde1089, 0x0d415013, 0x4d0e4de2, 0x3e44a5ef, 0x4e32a956, 0x104fb80e, 0x4f4af5d1, 0x3d77b192, - 0x50570819, 0x135410c3, 0x5156b6d9, 0x3c84d496, 0x5249daa2, 0x164c7ddd, 0x53304df6, 0x3b6ca4c4, - 0x5409ed4b, 0x19372a64, 0x54d69714, 0x3a2fcee8, 0x55962bc0, 0x1c1249d8, 0x56488dc5, 0x38cf1669, - 0x56eda1a0, 0x1edc1953, 0x57854ddd, 0x374b54ce, 0x580f7b19, 0x2192e09b, 0x588c1404, 0x35a5793c, - 0x58fb0568, 0x2434f332, 0x595c3e2a, 0x33de87de, 0x59afaf4c, 0x26c0b162, 0x59f54bee, 0x31f79948, - 0x5a2d0957, 0x29348937, 0x5a56deec, 0x2ff1d9c7, 0x5a72c63b, 0x2b8ef77d, 0x5a80baf6, 0x2dce88aa, + 0x40c7d2bd, 0x00c90e90, 0x424ff28f, 0x3ff4e5e0, 0x43cdd89a, 0x03ecadcf, 0x454149fc, 0x3fc395f9, + 0x46aa0d6d, 0x070de172, 0x4807eb4b, 0x3f6af2e3, 0x495aada2, 0x0a2abb59, 0x4aa22036, 0x3eeb3347, + 0x4bde1089, 0x0d415013, 0x4d0e4de2, 0x3e44a5ef, 0x4e32a956, 0x104fb80e, 0x4f4af5d1, 0x3d77b192, + 0x50570819, 0x135410c3, 0x5156b6d9, 0x3c84d496, 0x5249daa2, 0x164c7ddd, 0x53304df6, 0x3b6ca4c4, + 0x5409ed4b, 0x19372a64, 0x54d69714, 0x3a2fcee8, 0x55962bc0, 0x1c1249d8, 0x56488dc5, 0x38cf1669, + 0x56eda1a0, 0x1edc1953, 0x57854ddd, 0x374b54ce, 0x580f7b19, 0x2192e09b, 0x588c1404, 0x35a5793c, + 0x58fb0568, 0x2434f332, 0x595c3e2a, 0x33de87de, 0x59afaf4c, 0x26c0b162, 0x59f54bee, 0x31f79948, + 0x5a2d0957, 0x29348937, 0x5a56deec, 0x2ff1d9c7, 0x5a72c63b, 0x2b8ef77d, 0x5a80baf6, 0x2dce88aa, }; -/* PostMultiply64() table - * format = Q30 - * reordered for sequential access - * - * for (i = 0; i <= (32/2); i++) { - * angle = i * M_PI / 64; - * x = (cos(angle) + sin(angle)); - * x = sin(angle); - * } - */ +/* PostMultiply64() table + format = Q30 + reordered for sequential access + + for (i = 0; i <= (32/2); i++) { + angle = i * M_PI / 64; + x = (cos(angle) + sin(angle)); + x = sin(angle); + } +*/ static const int cos1sin1tab64[34] PROGMEM = { - 0x40000000, 0x00000000, 0x43103085, 0x0323ecbe, 0x45f704f7, 0x0645e9af, 0x48b2b335, 0x09640837, - 0x4b418bbe, 0x0c7c5c1e, 0x4da1fab5, 0x0f8cfcbe, 0x4fd288dc, 0x1294062f, 0x51d1dc80, 0x158f9a76, - 0x539eba45, 0x187de2a7, 0x553805f2, 0x1b5d100a, 0x569cc31b, 0x1e2b5d38, 0x57cc15bc, 0x20e70f32, - 0x58c542c5, 0x238e7673, 0x5987b08a, 0x261feffa, 0x5a12e720, 0x2899e64a, 0x5a6690ae, 0x2afad269, - 0x5a82799a, 0x2d413ccd, + 0x40000000, 0x00000000, 0x43103085, 0x0323ecbe, 0x45f704f7, 0x0645e9af, 0x48b2b335, 0x09640837, + 0x4b418bbe, 0x0c7c5c1e, 0x4da1fab5, 0x0f8cfcbe, 0x4fd288dc, 0x1294062f, 0x51d1dc80, 0x158f9a76, + 0x539eba45, 0x187de2a7, 0x553805f2, 0x1b5d100a, 0x569cc31b, 0x1e2b5d38, 0x57cc15bc, 0x20e70f32, + 0x58c542c5, 0x238e7673, 0x5987b08a, 0x261feffa, 0x5a12e720, 0x2899e64a, 0x5a6690ae, 0x2afad269, + 0x5a82799a, 0x2d413ccd, }; /************************************************************************************** - * Function: PreMultiply64 - * - * Description: pre-twiddle stage of 64-point DCT-IV - * - * Inputs: buffer of 64 samples - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: minimum 1 GB in, 2 GB out, gains 2 int bits - * gbOut = gbIn + 1 - * output is limited to sqrt(2)/2 plus GB in full GB - * uses 3-mul, 3-add butterflies instead of 4-mul, 2-add + Function: PreMultiply64 + + Description: pre-twiddle stage of 64-point DCT-IV + + Inputs: buffer of 64 samples + + Outputs: processed samples in same buffer + + Return: none + + Notes: minimum 1 GB in, 2 GB out, gains 2 int bits + gbOut = gbIn + 1 + output is limited to sqrt(2)/2 plus GB in full GB + uses 3-mul, 3-add butterflies instead of 4-mul, 2-add **************************************************************************************/ -static void PreMultiply64(int *zbuf1) -{ - int i, ar1, ai1, ar2, ai2, z1, z2; - int t, cms2, cps2a, sin2a, cps2b, sin2b; - int *zbuf2; - const int *csptr; - - zbuf2 = zbuf1 + 64 - 1; - csptr = cos4sin4tab64; - - /* whole thing should fit in registers - verify that compiler does this */ - for (i = 64 >> 2; i != 0; i--) { - /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ - cps2a = *csptr++; - sin2a = *csptr++; - cps2b = *csptr++; - sin2b = *csptr++; - - ar1 = *(zbuf1 + 0); - ai2 = *(zbuf1 + 1); - ai1 = *(zbuf2 + 0); - ar2 = *(zbuf2 - 1); - - /* gain 2 ints bit from MULSHIFT32 by Q30 - * max per-sample gain (ignoring implicit scaling) = MAX(sin(angle)+cos(angle)) = 1.414 - * i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from - * extra sign bits, and eat one in adding - */ - t = MULSHIFT32(sin2a, ar1 + ai1); - z2 = MULSHIFT32(cps2a, ai1) - t; - cms2 = cps2a - 2*sin2a; - z1 = MULSHIFT32(cms2, ar1) + t; - *zbuf1++ = z1; /* cos*ar1 + sin*ai1 */ - *zbuf1++ = z2; /* cos*ai1 - sin*ar1 */ - - t = MULSHIFT32(sin2b, ar2 + ai2); - z2 = MULSHIFT32(cps2b, ai2) - t; - cms2 = cps2b - 2*sin2b; - z1 = MULSHIFT32(cms2, ar2) + t; - *zbuf2-- = z2; /* cos*ai2 - sin*ar2 */ - *zbuf2-- = z1; /* cos*ar2 + sin*ai2 */ - } +static void PreMultiply64(int *zbuf1) { + int i, ar1, ai1, ar2, ai2, z1, z2; + int t, cms2, cps2a, sin2a, cps2b, sin2b; + int *zbuf2; + const int *csptr; + + zbuf2 = zbuf1 + 64 - 1; + csptr = cos4sin4tab64; + + /* whole thing should fit in registers - verify that compiler does this */ + for (i = 64 >> 2; i != 0; i--) { + /* cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ + cps2a = *csptr++; + sin2a = *csptr++; + cps2b = *csptr++; + sin2b = *csptr++; + + ar1 = *(zbuf1 + 0); + ai2 = *(zbuf1 + 1); + ai1 = *(zbuf2 + 0); + ar2 = *(zbuf2 - 1); + + /* gain 2 ints bit from MULSHIFT32 by Q30 + max per-sample gain (ignoring implicit scaling) = MAX(sin(angle)+cos(angle)) = 1.414 + i.e. gain 1 GB since worst case is sin(angle) = cos(angle) = 0.707 (Q30), gain 2 from + extra sign bits, and eat one in adding + */ + t = MULSHIFT32(sin2a, ar1 + ai1); + z2 = MULSHIFT32(cps2a, ai1) - t; + cms2 = cps2a - 2 * sin2a; + z1 = MULSHIFT32(cms2, ar1) + t; + *zbuf1++ = z1; /* cos*ar1 + sin*ai1 */ + *zbuf1++ = z2; /* cos*ai1 - sin*ar1 */ + + t = MULSHIFT32(sin2b, ar2 + ai2); + z2 = MULSHIFT32(cps2b, ai2) - t; + cms2 = cps2b - 2 * sin2b; + z1 = MULSHIFT32(cms2, ar2) + t; + *zbuf2-- = z2; /* cos*ai2 - sin*ar2 */ + *zbuf2-- = z1; /* cos*ar2 + sin*ai2 */ + } } /************************************************************************************** - * Function: PostMultiply64 - * - * Description: post-twiddle stage of 64-point type-IV DCT - * - * Inputs: buffer of 64 samples - * number of output samples to calculate - * - * Outputs: processed samples in same buffer - * - * Return: none - * - * Notes: minimum 1 GB in, 2 GB out, gains 2 int bits - * gbOut = gbIn + 1 - * output is limited to sqrt(2)/2 plus GB in full GB - * nSampsOut is rounded up to next multiple of 4, since we calculate - * 4 samples per loop + Function: PostMultiply64 + + Description: post-twiddle stage of 64-point type-IV DCT + + Inputs: buffer of 64 samples + number of output samples to calculate + + Outputs: processed samples in same buffer + + Return: none + + Notes: minimum 1 GB in, 2 GB out, gains 2 int bits + gbOut = gbIn + 1 + output is limited to sqrt(2)/2 plus GB in full GB + nSampsOut is rounded up to next multiple of 4, since we calculate + 4 samples per loop **************************************************************************************/ -static void PostMultiply64(int *fft1, int nSampsOut) -{ - int i, ar1, ai1, ar2, ai2; - int t, cms2, cps2, sin2; - int *fft2; - const int *csptr; - - csptr = cos1sin1tab64; - fft2 = fft1 + 64 - 1; - - /* load coeffs for first pass - * cps2 = (cos+sin)/2, sin2 = sin/2, cms2 = (cos-sin)/2 - */ - cps2 = *csptr++; - sin2 = *csptr++; - cms2 = cps2 - 2*sin2; - - for (i = (nSampsOut + 3) >> 2; i != 0; i--) { - ar1 = *(fft1 + 0); - ai1 = *(fft1 + 1); - ar2 = *(fft2 - 1); - ai2 = *(fft2 + 0); - - /* gain 2 int bits (multiplying by Q30), max gain = sqrt(2) */ - t = MULSHIFT32(sin2, ar1 + ai1); - *fft2-- = t - MULSHIFT32(cps2, ai1); - *fft1++ = t + MULSHIFT32(cms2, ar1); - - cps2 = *csptr++; - sin2 = *csptr++; - - ai2 = -ai2; - t = MULSHIFT32(sin2, ar2 + ai2); - *fft2-- = t - MULSHIFT32(cps2, ai2); - cms2 = cps2 - 2*sin2; - *fft1++ = t + MULSHIFT32(cms2, ar2); - } +static void PostMultiply64(int *fft1, int nSampsOut) { + int i, ar1, ai1, ar2, ai2; + int t, cms2, cps2, sin2; + int *fft2; + const int *csptr; + + csptr = cos1sin1tab64; + fft2 = fft1 + 64 - 1; + + /* load coeffs for first pass + cps2 = (cos+sin)/2, sin2 = sin/2, cms2 = (cos-sin)/2 + */ + cps2 = *csptr++; + sin2 = *csptr++; + cms2 = cps2 - 2 * sin2; + + for (i = (nSampsOut + 3) >> 2; i != 0; i--) { + ar1 = *(fft1 + 0); + ai1 = *(fft1 + 1); + ar2 = *(fft2 - 1); + ai2 = *(fft2 + 0); + + /* gain 2 int bits (multiplying by Q30), max gain = sqrt(2) */ + t = MULSHIFT32(sin2, ar1 + ai1); + *fft2-- = t - MULSHIFT32(cps2, ai1); + *fft1++ = t + MULSHIFT32(cms2, ar1); + + cps2 = *csptr++; + sin2 = *csptr++; + + ai2 = -ai2; + t = MULSHIFT32(sin2, ar2 + ai2); + *fft2-- = t - MULSHIFT32(cps2, ai2); + cms2 = cps2 - 2 * sin2; + *fft1++ = t + MULSHIFT32(cms2, ar2); + } } /************************************************************************************** - * Function: QMFAnalysisConv - * - * Description: convolution kernel for analysis QMF - * - * Inputs: pointer to coefficient table, reordered for sequential access - * delay buffer of size 32*10 = 320 real-valued PCM samples - * index for delay ring buffer (range = [0, 9]) - * - * Outputs: 64 consecutive 32-bit samples - * - * Return: none - * - * Notes: this is carefully written to be efficient on ARM - * use the assembly code version in sbrqmfak.s when building for ARM! + Function: QMFAnalysisConv + + Description: convolution kernel for analysis QMF + + Inputs: pointer to coefficient table, reordered for sequential access + delay buffer of size 32*10 = 320 real-valued PCM samples + index for delay ring buffer (range = [0, 9]) + + Outputs: 64 consecutive 32-bit samples + + Return: none + + Notes: this is carefully written to be efficient on ARM + use the assembly code version in sbrqmfak.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +//TODO - ADD IN .S SOURCES SOMEHOW +#if 0 //(defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) #ifdef __cplusplus extern "C" #endif void QMFAnalysisConv(int *cTab, int *delay, int dIdx, int *uBuf); #else -void QMFAnalysisConv(int *cTab, int *delay, int dIdx, int *uBuf) -{ - int k, dOff; - int *cPtr0, *cPtr1; - U64 u64lo, u64hi; - - dOff = dIdx*32 + 31; - cPtr0 = cTab; - cPtr1 = cTab + 33*5 - 1; - - /* special first pass since we need to flip sign to create cTab[384], cTab[512] */ - u64lo.w64 = 0; - u64hi.w64 = 0; - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, -(*cPtr1--), delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, -(*cPtr1--), delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - - uBuf[0] = u64lo.r.hi32; - uBuf[32] = u64hi.r.hi32; - uBuf++; - dOff--; - - /* max gain for any sample in uBuf, after scaling by cTab, ~= 0.99 - * so we can just sum the uBuf values with no overflow problems - */ - for (k = 1; k <= 31; k++) { - u64lo.w64 = 0; - u64hi.w64 = 0; - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64lo.w64 = MADD64(u64lo.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) {dOff += 320;} - - uBuf[0] = u64lo.r.hi32; - uBuf[32] = u64hi.r.hi32; - uBuf++; - dOff--; - } +void QMFAnalysisConv(int *cTab, int *delay, int dIdx, int *uBuf) { + int k, dOff; + int *cPtr0, *cPtr1; + U64 u64lo, u64hi; + + dOff = dIdx * 32 + 31; + cPtr0 = cTab; + cPtr1 = cTab + 33 * 5 - 1; + + /* special first pass since we need to flip sign to create cTab[384], cTab[512] */ + u64lo.w64 = 0; + u64hi.w64 = 0; + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, -(*cPtr1--), delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, -(*cPtr1--), delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + + uBuf[0] = u64lo.r.hi32; + uBuf[32] = u64hi.r.hi32; + uBuf++; + dOff--; + + /* max gain for any sample in uBuf, after scaling by cTab, ~= 0.99 + so we can just sum the uBuf values with no overflow problems + */ + for (k = 1; k <= 31; k++) { + u64lo.w64 = 0; + u64hi.w64 = 0; + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr0++, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64lo.w64 = MADD64(u64lo.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + u64hi.w64 = MADD64(u64hi.w64, *cPtr1--, delay[dOff]); dOff -= 32; if (dOff < 0) { + dOff += 320; + } + + uBuf[0] = u64lo.r.hi32; + uBuf[32] = u64hi.r.hi32; + uBuf++; + dOff--; + } } #endif /************************************************************************************** - * Function: QMFAnalysis - * - * Description: 32-subband analysis QMF (4.6.18.4.1) - * - * Inputs: 32 consecutive samples of decoded 32-bit PCM, format = Q(fBitsIn) - * delay buffer of size 32*10 = 320 PCM samples - * number of fraction bits in input PCM - * index for delay ring buffer (range = [0, 9]) - * number of subbands to calculate (range = [0, 32]) - * - * Outputs: qmfaBands complex subband samples, format = Q(FBITS_OUT_QMFA) - * updated delay buffer - * updated delay index - * - * Return: guard bit mask - * - * Notes: output stored as RE{X0}, IM{X0}, RE{X1}, IM{X1}, ... RE{X31}, IM{X31} - * output stored in int buffer of size 64*2 = 128 - * (zero-filled from XBuf[2*qmfaBands] to XBuf[127]) + Function: QMFAnalysis + + Description: 32-subband analysis QMF (4.6.18.4.1) + + Inputs: 32 consecutive samples of decoded 32-bit PCM, format = Q(fBitsIn) + delay buffer of size 32*10 = 320 PCM samples + number of fraction bits in input PCM + index for delay ring buffer (range = [0, 9]) + number of subbands to calculate (range = [0, 32]) + + Outputs: qmfaBands complex subband samples, format = Q(FBITS_OUT_QMFA) + updated delay buffer + updated delay index + + Return: guard bit mask + + Notes: output stored as RE{X0}, IM{X0}, RE{X1}, IM{X1}, ... RE{X31}, IM{X31} + output stored in int buffer of size 64*2 = 128 + (zero-filled from XBuf[2*qmfaBands] to XBuf[127]) **************************************************************************************/ -int QMFAnalysis(int *inbuf, int *delay, int *XBuf, int fBitsIn, int *delayIdx, int qmfaBands) -{ - int n, y, shift, gbMask; - int *delayPtr, *uBuf, *tBuf; - - /* use XBuf[128] as temp buffer for reordering */ - uBuf = XBuf; /* first 64 samples */ - tBuf = XBuf + 64; /* second 64 samples */ - - /* overwrite oldest PCM with new PCM - * delay[n] has 1 GB after shifting (either << or >>) - */ - delayPtr = delay + (*delayIdx * 32); - if (fBitsIn > FBITS_IN_QMFA) { - shift = MIN(fBitsIn - FBITS_IN_QMFA, 31); - for (n = 32; n != 0; n--) { - y = (*inbuf) >> shift; - inbuf++; - *delayPtr++ = y; - } - } else { - shift = MIN(FBITS_IN_QMFA - fBitsIn, 30); - for (n = 32; n != 0; n--) { - y = *inbuf++; - CLIP_2N_SHIFT30(y, shift); - *delayPtr++ = y; - } - } - - QMFAnalysisConv((int *)cTabA, delay, *delayIdx, uBuf); - - /* uBuf has at least 2 GB right now (1 from clipping to Q(FBITS_IN_QMFA), one from - * the scaling by cTab (MULSHIFT32(*delayPtr--, *cPtr++), with net gain of < 1.0) - * TODO - fuse with QMFAnalysisConv to avoid separate reordering - */ - tBuf[2*0 + 0] = uBuf[0]; - tBuf[2*0 + 1] = uBuf[1]; +int QMFAnalysis(int *inbuf, int *delay, int *XBuf, int fBitsIn, int *delayIdx, int qmfaBands) { + int n, y, shift, gbMask; + int *delayPtr, *uBuf, *tBuf; + + /* use XBuf[128] as temp buffer for reordering */ + uBuf = XBuf; /* first 64 samples */ + tBuf = XBuf + 64; /* second 64 samples */ + + /* overwrite oldest PCM with new PCM + delay[n] has 1 GB after shifting (either << or >>) + */ + delayPtr = delay + (*delayIdx * 32); + if (fBitsIn > FBITS_IN_QMFA) { + shift = MIN(fBitsIn - FBITS_IN_QMFA, 31); + for (n = 32; n != 0; n--) { + y = (*inbuf) >> shift; + inbuf++; + *delayPtr++ = y; + } + } else { + shift = MIN(FBITS_IN_QMFA - fBitsIn, 30); + for (n = 32; n != 0; n--) { + y = *inbuf++; + CLIP_2N_SHIFT30(y, shift); + *delayPtr++ = y; + } + } + + QMFAnalysisConv((int *)cTabA, delay, *delayIdx, uBuf); + + /* uBuf has at least 2 GB right now (1 from clipping to Q(FBITS_IN_QMFA), one from + the scaling by cTab (MULSHIFT32(*delayPtr--, *cPtr++), with net gain of < 1.0) + TODO - fuse with QMFAnalysisConv to avoid separate reordering + */ + tBuf[2 * 0 + 0] = uBuf[0]; + tBuf[2 * 0 + 1] = uBuf[1]; for (n = 1; n < 31; n++) { - tBuf[2*n + 0] = -uBuf[64-n]; - tBuf[2*n + 1] = uBuf[n+1]; + tBuf[2 * n + 0] = -uBuf[64 - n]; + tBuf[2 * n + 1] = uBuf[n + 1]; + } + tBuf[2 * 31 + 1] = uBuf[32]; + tBuf[2 * 31 + 0] = -uBuf[33]; + + /* fast in-place DCT-IV - only need 2*qmfaBands output samples */ + PreMultiply64(tBuf); /* 2 GB in, 3 GB out */ + FFT32C(tBuf); /* 3 GB in, 1 GB out */ + PostMultiply64(tBuf, qmfaBands * 2); /* 1 GB in, 2 GB out */ + + /* TODO - roll into PostMultiply (if enough registers) */ + gbMask = 0; + for (n = 0; n < qmfaBands; n++) { + XBuf[2 * n + 0] = tBuf[ n + 0]; /* implicit scaling of 2 in our output Q format */ + gbMask |= FASTABS(XBuf[2 * n + 0]); + XBuf[2 * n + 1] = -tBuf[63 - n]; + gbMask |= FASTABS(XBuf[2 * n + 1]); + } + + /* fill top section with zeros for HF generation */ + for (; n < 64; n++) { + XBuf[2 * n + 0] = 0; + XBuf[2 * n + 1] = 0; } - tBuf[2*31 + 1] = uBuf[32]; - tBuf[2*31 + 0] = -uBuf[33]; - - /* fast in-place DCT-IV - only need 2*qmfaBands output samples */ - PreMultiply64(tBuf); /* 2 GB in, 3 GB out */ - FFT32C(tBuf); /* 3 GB in, 1 GB out */ - PostMultiply64(tBuf, qmfaBands*2); /* 1 GB in, 2 GB out */ - - /* TODO - roll into PostMultiply (if enough registers) */ - gbMask = 0; - for (n = 0; n < qmfaBands; n++) { - XBuf[2*n+0] = tBuf[ n + 0]; /* implicit scaling of 2 in our output Q format */ - gbMask |= FASTABS(XBuf[2*n+0]); - XBuf[2*n+1] = -tBuf[63 - n]; - gbMask |= FASTABS(XBuf[2*n+1]); - } - - /* fill top section with zeros for HF generation */ - for ( ; n < 64; n++) { - XBuf[2*n+0] = 0; - XBuf[2*n+1] = 0; - } - - *delayIdx = (*delayIdx == NUM_QMF_DELAY_BUFS - 1 ? 0 : *delayIdx + 1); - - /* minimum of 2 GB in output */ - return gbMask; + + *delayIdx = (*delayIdx == NUM_QMF_DELAY_BUFS - 1 ? 0 : *delayIdx + 1); + + /* minimum of 2 GB in output */ + return gbMask; } /* lose FBITS_LOST_DCT4_64 in DCT4, gain 6 for implicit scaling by 1/64, lose 1 for cTab multiply (Q31) */ @@ -378,150 +415,169 @@ int QMFAnalysis(int *inbuf, int *delay, int *XBuf, int fBitsIn, int *delayIdx, i #define RND_VAL (1 << (FBITS_OUT_QMFS-1)) /************************************************************************************** - * Function: QMFSynthesisConv - * - * Description: final convolution kernel for synthesis QMF - * - * Inputs: pointer to coefficient table, reordered for sequential access - * delay buffer of size 64*10 = 640 complex samples (1280 ints) - * index for delay ring buffer (range = [0, 9]) - * number of QMF subbands to process (range = [0, 64]) - * number of channels - * - * Outputs: 64 consecutive 16-bit PCM samples, interleaved by factor of nChans - * - * Return: none - * - * Notes: this is carefully written to be efficient on ARM - * use the assembly code version in sbrqmfsk.s when building for ARM! + Function: QMFSynthesisConv + + Description: final convolution kernel for synthesis QMF + + Inputs: pointer to coefficient table, reordered for sequential access + delay buffer of size 64*10 = 640 complex samples (1280 ints) + index for delay ring buffer (range = [0, 9]) + number of QMF subbands to process (range = [0, 64]) + number of channels + + Outputs: 64 consecutive 16-bit PCM samples, interleaved by factor of nChans + + Return: none + + Notes: this is carefully written to be efficient on ARM + use the assembly code version in sbrqmfsk.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +#if 0 //(defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) #ifdef __cplusplus extern "C" #endif void QMFSynthesisConv(int *cPtr, int *delay, int dIdx, short *outbuf, int nChans); #else -void QMFSynthesisConv(int *cPtr, int *delay, int dIdx, short *outbuf, int nChans) -{ - int k, dOff0, dOff1; - U64 sum64; - - dOff0 = (dIdx)*128; - dOff1 = dOff0 - 1; - if (dOff1 < 0) - dOff1 += 1280; - - /* scaling note: total gain of coefs (cPtr[0]-cPtr[9] for any k) is < 2.0, so 1 GB in delay values is adequate */ - for (k = 0; k <= 63; k++) { - sum64.w64 = 0; - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) {dOff0 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) {dOff1 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) {dOff0 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) {dOff1 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) {dOff0 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) {dOff1 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) {dOff0 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) {dOff1 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) {dOff0 += 1280;} - sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) {dOff1 += 1280;} - - dOff0++; - dOff1--; - *outbuf = CLIPTOSHORT((sum64.r.hi32 + RND_VAL) >> FBITS_OUT_QMFS); - outbuf += nChans; - } +void QMFSynthesisConv(int *cPtr, int *delay, int dIdx, short *outbuf, int nChans) { + int k, dOff0, dOff1; + U64 sum64; + + dOff0 = (dIdx) * 128; + dOff1 = dOff0 - 1; + if (dOff1 < 0) { + dOff1 += 1280; + } + + /* scaling note: total gain of coefs (cPtr[0]-cPtr[9] for any k) is < 2.0, so 1 GB in delay values is adequate */ + for (k = 0; k <= 63; k++) { + sum64.w64 = 0; + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) { + dOff0 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) { + dOff1 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) { + dOff0 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) { + dOff1 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) { + dOff0 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) { + dOff1 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) { + dOff0 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) { + dOff1 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff0]); dOff0 -= 256; if (dOff0 < 0) { + dOff0 += 1280; + } + sum64.w64 = MADD64(sum64.w64, *cPtr++, delay[dOff1]); dOff1 -= 256; if (dOff1 < 0) { + dOff1 += 1280; + } + + dOff0++; + dOff1--; + *outbuf = CLIPTOSHORT((sum64.r.hi32 + RND_VAL) >> FBITS_OUT_QMFS); + outbuf += nChans; + } } #endif /************************************************************************************** - * Function: QMFSynthesis - * - * Description: 64-subband synthesis QMF (4.6.18.4.2) - * - * Inputs: 64 consecutive complex subband QMF samples, format = Q(FBITS_IN_QMFS) - * delay buffer of size 64*10 = 640 complex samples (1280 ints) - * index for delay ring buffer (range = [0, 9]) - * number of QMF subbands to process (range = [0, 64]) - * number of channels - * - * Outputs: 64 consecutive 16-bit PCM samples, interleaved by factor of nChans - * updated delay buffer - * updated delay index - * - * Return: none - * - * Notes: assumes MIN_GBITS_IN_QMFS guard bits in input, either from - * QMFAnalysis (if upsampling only) or from MapHF (if SBR on) + Function: QMFSynthesis + + Description: 64-subband synthesis QMF (4.6.18.4.2) + + Inputs: 64 consecutive complex subband QMF samples, format = Q(FBITS_IN_QMFS) + delay buffer of size 64*10 = 640 complex samples (1280 ints) + index for delay ring buffer (range = [0, 9]) + number of QMF subbands to process (range = [0, 64]) + number of channels + + Outputs: 64 consecutive 16-bit PCM samples, interleaved by factor of nChans + updated delay buffer + updated delay index + + Return: none + + Notes: assumes MIN_GBITS_IN_QMFS guard bits in input, either from + QMFAnalysis (if upsampling only) or from MapHF (if SBR on) **************************************************************************************/ -void QMFSynthesis(int *inbuf, int *delay, int *delayIdx, int qmfsBands, short *outbuf, int nChans) -{ - int n, a0, a1, b0, b1, dOff0, dOff1, dIdx; - int *tBufLo, *tBufHi; - - dIdx = *delayIdx; - tBufLo = delay + dIdx*128 + 0; - tBufHi = delay + dIdx*128 + 127; - - /* reorder inputs to DCT-IV, only use first qmfsBands (complex) samples - * TODO - fuse with PreMultiply64 to avoid separate reordering steps - */ +void QMFSynthesis(int *inbuf, int *delay, int *delayIdx, int qmfsBands, short *outbuf, int nChans) { + int n, a0, a1, b0, b1, dOff0, dOff1, dIdx; + int *tBufLo, *tBufHi; + + dIdx = *delayIdx; + tBufLo = delay + dIdx * 128 + 0; + tBufHi = delay + dIdx * 128 + 127; + + /* reorder inputs to DCT-IV, only use first qmfsBands (complex) samples + TODO - fuse with PreMultiply64 to avoid separate reordering steps + */ for (n = 0; n < qmfsBands >> 1; n++) { - a0 = *inbuf++; - b0 = *inbuf++; - a1 = *inbuf++; - b1 = *inbuf++; - *tBufLo++ = a0; + a0 = *inbuf++; + b0 = *inbuf++; + a1 = *inbuf++; + b1 = *inbuf++; + *tBufLo++ = a0; *tBufLo++ = a1; *tBufHi-- = b0; *tBufHi-- = b1; } - if (qmfsBands & 0x01) { - a0 = *inbuf++; - b0 = *inbuf++; - *tBufLo++ = a0; + if (qmfsBands & 0x01) { + a0 = *inbuf++; + b0 = *inbuf++; + *tBufLo++ = a0; *tBufHi-- = b0; *tBufLo++ = 0; - *tBufHi-- = 0; - n++; - } - for ( ; n < 32; n++) { - *tBufLo++ = 0; + *tBufHi-- = 0; + n++; + } + for (; n < 32; n++) { + *tBufLo++ = 0; *tBufHi-- = 0; *tBufLo++ = 0; *tBufHi-- = 0; - } - - tBufLo = delay + dIdx*128 + 0; - tBufHi = delay + dIdx*128 + 64; - - /* 2 GB in, 3 GB out */ - PreMultiply64(tBufLo); - PreMultiply64(tBufHi); - - /* 3 GB in, 1 GB out */ - FFT32C(tBufLo); - FFT32C(tBufHi); - - /* 1 GB in, 2 GB out */ - PostMultiply64(tBufLo, 64); - PostMultiply64(tBufHi, 64); - - /* could fuse with PostMultiply64 to avoid separate pass */ - dOff0 = dIdx*128; - dOff1 = dIdx*128 + 64; - for (n = 32; n != 0; n--) { - a0 = (*tBufLo++); - a1 = (*tBufLo++); - b0 = (*tBufHi++); - b1 = -(*tBufHi++); + } - delay[dOff0++] = (b0 - a0); - delay[dOff0++] = (b1 - a1); - delay[dOff1++] = (b0 + a0); - delay[dOff1++] = (b1 + a1); - } + tBufLo = delay + dIdx * 128 + 0; + tBufHi = delay + dIdx * 128 + 64; + + /* 2 GB in, 3 GB out */ + PreMultiply64(tBufLo); + PreMultiply64(tBufHi); + + /* 3 GB in, 1 GB out */ + FFT32C(tBufLo); + FFT32C(tBufHi); + + /* 1 GB in, 2 GB out */ + PostMultiply64(tBufLo, 64); + PostMultiply64(tBufHi, 64); + + /* could fuse with PostMultiply64 to avoid separate pass */ + dOff0 = dIdx * 128; + dOff1 = dIdx * 128 + 64; + for (n = 32; n != 0; n--) { + a0 = (*tBufLo++); + a1 = (*tBufLo++); + b0 = (*tBufHi++); + b1 = -(*tBufHi++); + + delay[dOff0++] = (b0 - a0); + delay[dOff0++] = (b1 - a1); + delay[dOff1++] = (b0 + a0); + delay[dOff1++] = (b1 + a1); + } - QMFSynthesisConv((int *)cTabS, delay, dIdx, outbuf, nChans); + QMFSynthesisConv((int *)cTabS, delay, dIdx, outbuf, nChans); - *delayIdx = (*delayIdx == NUM_QMF_DELAY_BUFS - 1 ? 0 : *delayIdx + 1); + *delayIdx = (*delayIdx == NUM_QMF_DELAY_BUFS - 1 ? 0 : *delayIdx + 1); } diff --git a/src/libhelix-aac/sbrside.c b/src/libhelix-aac/sbrside.c index 6bb49f31..5a5e00fe 100644 --- a/src/libhelix-aac/sbrside.c +++ b/src/libhelix-aac/sbrside.c @@ -1,575 +1,605 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrside.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrside.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrside.c - functions for unpacking side info from SBR bitstream + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrside.c - functions for unpacking side info from SBR bitstream **************************************************************************************/ #include "sbr.h" /************************************************************************************** - * Function: GetSampRateIdx - * - * Description: get index of given sample rate - * - * Inputs: sample rate (in Hz) - * - * Outputs: none - * - * Return: index of sample rate (table 1.15 in 14496-3:2001(E)) - * -1 if sample rate not found in table + Function: GetSampRateIdx + + Description: get index of given sample rate + + Inputs: sample rate (in Hz) + + Outputs: none + + Return: index of sample rate (table 1.15 in 14496-3:2001(E)) + -1 if sample rate not found in table **************************************************************************************/ -int GetSampRateIdx(int sampRate) -{ - int idx; +int GetSampRateIdx(int sampRate) { + int idx; - for (idx = 0; idx < NUM_SAMPLE_RATES; idx++) { - if (sampRate == sampRateTab[idx]) - return idx; - } + for (idx = 0; idx < NUM_SAMPLE_RATES; idx++) { + if (sampRate == sampRateTab[idx]) { + return idx; + } + } - return -1; + return -1; } /************************************************************************************** - * Function: UnpackSBRHeader - * - * Description: unpack SBR header (table 4.56) - * - * Inputs: BitStreamInfo struct pointing to start of SBR header - * - * Outputs: initialized SBRHeader struct for this SCE/CPE block - * - * Return: non-zero if frame reset is triggered, zero otherwise + Function: UnpackSBRHeader + + Description: unpack SBR header (table 4.56) + + Inputs: BitStreamInfo struct pointing to start of SBR header + + Outputs: initialized SBRHeader struct for this SCE/CPE block + + Return: non-zero if frame reset is triggered, zero otherwise **************************************************************************************/ -int UnpackSBRHeader(BitStreamInfo *bsi, SBRHeader *sbrHdr) -{ - SBRHeader sbrHdrPrev; - - /* save previous values so we know whether to reset decoder */ - sbrHdrPrev.startFreq = sbrHdr->startFreq; - sbrHdrPrev.stopFreq = sbrHdr->stopFreq; - sbrHdrPrev.freqScale = sbrHdr->freqScale; - sbrHdrPrev.alterScale = sbrHdr->alterScale; - sbrHdrPrev.crossOverBand = sbrHdr->crossOverBand; - sbrHdrPrev.noiseBands = sbrHdr->noiseBands; - - sbrHdr->ampRes = GetBits(bsi, 1); - sbrHdr->startFreq = GetBits(bsi, 4); - sbrHdr->stopFreq = GetBits(bsi, 4); - sbrHdr->crossOverBand = GetBits(bsi, 3); - sbrHdr->resBitsHdr = GetBits(bsi, 2); - sbrHdr->hdrExtra1 = GetBits(bsi, 1); - sbrHdr->hdrExtra2 = GetBits(bsi, 1); - - if (sbrHdr->hdrExtra1) { - sbrHdr->freqScale = GetBits(bsi, 2); - sbrHdr->alterScale = GetBits(bsi, 1); - sbrHdr->noiseBands = GetBits(bsi, 2); - } else { - /* defaults */ - sbrHdr->freqScale = 2; - sbrHdr->alterScale = 1; - sbrHdr->noiseBands = 2; - } - - if (sbrHdr->hdrExtra2) { - sbrHdr->limiterBands = GetBits(bsi, 2); - sbrHdr->limiterGains = GetBits(bsi, 2); - sbrHdr->interpFreq = GetBits(bsi, 1); - sbrHdr->smoothMode = GetBits(bsi, 1); - } else { - /* defaults */ - sbrHdr->limiterBands = 2; - sbrHdr->limiterGains = 2; - sbrHdr->interpFreq = 1; - sbrHdr->smoothMode = 1; - } - sbrHdr->count++; - - /* if any of these have changed from previous frame, reset the SBR module */ - if (sbrHdr->startFreq != sbrHdrPrev.startFreq || sbrHdr->stopFreq != sbrHdrPrev.stopFreq || - sbrHdr->freqScale != sbrHdrPrev.freqScale || sbrHdr->alterScale != sbrHdrPrev.alterScale || - sbrHdr->crossOverBand != sbrHdrPrev.crossOverBand || sbrHdr->noiseBands != sbrHdrPrev.noiseBands - ) - return -1; - else - return 0; +int UnpackSBRHeader(BitStreamInfo *bsi, SBRHeader *sbrHdr) { + SBRHeader sbrHdrPrev; + + /* save previous values so we know whether to reset decoder */ + sbrHdrPrev.startFreq = sbrHdr->startFreq; + sbrHdrPrev.stopFreq = sbrHdr->stopFreq; + sbrHdrPrev.freqScale = sbrHdr->freqScale; + sbrHdrPrev.alterScale = sbrHdr->alterScale; + sbrHdrPrev.crossOverBand = sbrHdr->crossOverBand; + sbrHdrPrev.noiseBands = sbrHdr->noiseBands; + + sbrHdr->ampRes = GetBits(bsi, 1); + sbrHdr->startFreq = GetBits(bsi, 4); + sbrHdr->stopFreq = GetBits(bsi, 4); + sbrHdr->crossOverBand = GetBits(bsi, 3); + sbrHdr->resBitsHdr = GetBits(bsi, 2); + sbrHdr->hdrExtra1 = GetBits(bsi, 1); + sbrHdr->hdrExtra2 = GetBits(bsi, 1); + + if (sbrHdr->hdrExtra1) { + sbrHdr->freqScale = GetBits(bsi, 2); + sbrHdr->alterScale = GetBits(bsi, 1); + sbrHdr->noiseBands = GetBits(bsi, 2); + } else { + /* defaults */ + sbrHdr->freqScale = 2; + sbrHdr->alterScale = 1; + sbrHdr->noiseBands = 2; + } + + if (sbrHdr->hdrExtra2) { + sbrHdr->limiterBands = GetBits(bsi, 2); + sbrHdr->limiterGains = GetBits(bsi, 2); + sbrHdr->interpFreq = GetBits(bsi, 1); + sbrHdr->smoothMode = GetBits(bsi, 1); + } else { + /* defaults */ + sbrHdr->limiterBands = 2; + sbrHdr->limiterGains = 2; + sbrHdr->interpFreq = 1; + sbrHdr->smoothMode = 1; + } + sbrHdr->count++; + + /* if any of these have changed from previous frame, reset the SBR module */ + if (sbrHdr->startFreq != sbrHdrPrev.startFreq || sbrHdr->stopFreq != sbrHdrPrev.stopFreq || + sbrHdr->freqScale != sbrHdrPrev.freqScale || sbrHdr->alterScale != sbrHdrPrev.alterScale || + sbrHdr->crossOverBand != sbrHdrPrev.crossOverBand || sbrHdr->noiseBands != sbrHdrPrev.noiseBands + ) { + return -1; + } else { + return 0; + } } /* cLog2[i] = ceil(log2(i)) (disregard i == 0) */ static const unsigned char cLog2[9] = {0, 0, 1, 2, 2, 3, 3, 3, 3}; /************************************************************************************** - * Function: UnpackSBRGrid - * - * Description: unpack SBR grid (table 4.62) - * - * Inputs: BitStreamInfo struct pointing to start of SBR grid - * initialized SBRHeader struct for this SCE/CPE block - * - * Outputs: initialized SBRGrid struct for this channel - * - * Return: none - **************************************************************************************/ -static void UnpackSBRGrid(BitStreamInfo *bsi, SBRHeader *sbrHdr, SBRGrid *sbrGrid) -{ - int numEnvRaw, env, rel, pBits, border, middleBorder=0; - unsigned char relBordLead[MAX_NUM_ENV], relBordTrail[MAX_NUM_ENV]; - unsigned char relBorder0[3], relBorder1[3], relBorder[3]; - unsigned char numRelBorder0, numRelBorder1, numRelBorder, numRelLead=0, numRelTrail; - unsigned char absBordLead=0, absBordTrail=0, absBorder; - - sbrGrid->ampResFrame = sbrHdr->ampRes; - sbrGrid->frameClass = GetBits(bsi, 2); - switch (sbrGrid->frameClass) { + Function: UnpackSBRGrid - case SBR_GRID_FIXFIX: - numEnvRaw = GetBits(bsi, 2); - sbrGrid->numEnv = (1 << numEnvRaw); - if (sbrGrid->numEnv == 1) - sbrGrid->ampResFrame = 0; + Description: unpack SBR grid (table 4.62) - ASSERT(sbrGrid->numEnv == 1 || sbrGrid->numEnv == 2 || sbrGrid->numEnv == 4); + Inputs: BitStreamInfo struct pointing to start of SBR grid + initialized SBRHeader struct for this SCE/CPE block - sbrGrid->freqRes[0] = GetBits(bsi, 1); - for (env = 1; env < sbrGrid->numEnv; env++) - sbrGrid->freqRes[env] = sbrGrid->freqRes[0]; + Outputs: initialized SBRGrid struct for this channel - absBordLead = 0; - absBordTrail = NUM_TIME_SLOTS; - numRelLead = sbrGrid->numEnv - 1; - numRelTrail = 0; + Return: none + **************************************************************************************/ +static void UnpackSBRGrid(BitStreamInfo *bsi, SBRHeader *sbrHdr, SBRGrid *sbrGrid) { + int numEnvRaw, env, rel, pBits, border, middleBorder = 0; + unsigned char relBordLead[MAX_NUM_ENV], relBordTrail[MAX_NUM_ENV]; + unsigned char relBorder0[3], relBorder1[3], relBorder[3]; + unsigned char numRelBorder0, numRelBorder1, numRelBorder, numRelLead = 0, numRelTrail; + unsigned char absBordLead = 0, absBordTrail = 0, absBorder; + + sbrGrid->ampResFrame = sbrHdr->ampRes; + sbrGrid->frameClass = GetBits(bsi, 2); + switch (sbrGrid->frameClass) { + + case SBR_GRID_FIXFIX: + numEnvRaw = GetBits(bsi, 2); + sbrGrid->numEnv = (1 << numEnvRaw); + if (sbrGrid->numEnv == 1) { + sbrGrid->ampResFrame = 0; + } + + ASSERT(sbrGrid->numEnv == 1 || sbrGrid->numEnv == 2 || sbrGrid->numEnv == 4); + + sbrGrid->freqRes[0] = GetBits(bsi, 1); + for (env = 1; env < sbrGrid->numEnv; env++) { + sbrGrid->freqRes[env] = sbrGrid->freqRes[0]; + } + + absBordLead = 0; + absBordTrail = NUM_TIME_SLOTS; + numRelLead = sbrGrid->numEnv - 1; + numRelTrail = 0; + + /* numEnv = 1, 2, or 4 */ + if (sbrGrid->numEnv == 1) { + border = NUM_TIME_SLOTS / 1; + } else if (sbrGrid->numEnv == 2) { + border = NUM_TIME_SLOTS / 2; + } else { + border = NUM_TIME_SLOTS / 4; + } + + for (rel = 0; rel < numRelLead; rel++) { + relBordLead[rel] = border; + } + + middleBorder = (sbrGrid->numEnv >> 1); + + break; + + case SBR_GRID_FIXVAR: + absBorder = GetBits(bsi, 2) + NUM_TIME_SLOTS; + numRelBorder = GetBits(bsi, 2); + sbrGrid->numEnv = numRelBorder + 1; + for (rel = 0; rel < numRelBorder && rel < 3; rel++) { + relBorder[rel] = 2 * GetBits(bsi, 2) + 2; + } + + pBits = cLog2[sbrGrid->numEnv + 1]; + sbrGrid->pointer = GetBits(bsi, pBits); + + for (env = sbrGrid->numEnv - 1; env >= 0; env--) { + sbrGrid->freqRes[env] = GetBits(bsi, 1); + } + + absBordLead = 0; + absBordTrail = absBorder; + numRelLead = 0; + numRelTrail = numRelBorder; + + for (rel = 0; rel < numRelTrail; rel++) { + relBordTrail[rel] = relBorder[rel]; + } + + if (sbrGrid->pointer > 1) { + middleBorder = sbrGrid->numEnv + 1 - sbrGrid->pointer; + } else { + middleBorder = sbrGrid->numEnv - 1; + } + + break; + + case SBR_GRID_VARFIX: + absBorder = GetBits(bsi, 2); + numRelBorder = GetBits(bsi, 2); + sbrGrid->numEnv = numRelBorder + 1; + for (rel = 0; rel < numRelBorder && rel < 3; rel++) { + relBorder[rel] = 2 * GetBits(bsi, 2) + 2; + } + + pBits = cLog2[sbrGrid->numEnv + 1]; + sbrGrid->pointer = GetBits(bsi, pBits); + + for (env = 0; env < sbrGrid->numEnv && env < MAX_NUM_ENV; env++) { + sbrGrid->freqRes[env] = GetBits(bsi, 1); + } + + absBordLead = absBorder; + absBordTrail = NUM_TIME_SLOTS; + numRelLead = numRelBorder; + numRelTrail = 0; + + for (rel = 0; rel < numRelLead; rel++) { + relBordLead[rel] = relBorder[rel]; + } + + if (sbrGrid->pointer == 0) { + middleBorder = 1; + } else if (sbrGrid->pointer == 1) { + middleBorder = sbrGrid->numEnv - 1; + } else { + middleBorder = sbrGrid->pointer - 1; + } + + break; + + case SBR_GRID_VARVAR: + absBordLead = GetBits(bsi, 2); /* absBorder0 */ + absBordTrail = GetBits(bsi, 2) + NUM_TIME_SLOTS; /* absBorder1 */ + numRelBorder0 = GetBits(bsi, 2); + numRelBorder1 = GetBits(bsi, 2); + + sbrGrid->numEnv = numRelBorder0 + numRelBorder1 + 1; + ASSERT(sbrGrid->numEnv <= 5); + + for (rel = 0; rel < numRelBorder0 && rel < 3; rel++) { + relBorder0[rel] = 2 * GetBits(bsi, 2) + 2; + } + + for (rel = 0; rel < numRelBorder1 && rel < 3; rel++) { + relBorder1[rel] = 2 * GetBits(bsi, 2) + 2; + } + + pBits = cLog2[numRelBorder0 + numRelBorder1 + 2]; + sbrGrid->pointer = GetBits(bsi, pBits); + + for (env = 0; env < sbrGrid->numEnv && env < MAX_NUM_ENV; env++) { + sbrGrid->freqRes[env] = GetBits(bsi, 1); + } + + numRelLead = numRelBorder0; + numRelTrail = numRelBorder1; + + for (rel = 0; rel < numRelLead; rel++) { + relBordLead[rel] = relBorder0[rel]; + } + + for (rel = 0; rel < numRelTrail; rel++) { + relBordTrail[rel] = relBorder1[rel]; + } + + if (sbrGrid->pointer > 1) { + middleBorder = sbrGrid->numEnv + 1 - sbrGrid->pointer; + } else { + middleBorder = sbrGrid->numEnv - 1; + } + + break; + } + + /* build time border vector */ + sbrGrid->envTimeBorder[0] = absBordLead * SAMPLES_PER_SLOT; + + rel = 0; + border = absBordLead; + for (env = 1; env <= numRelLead; env++) { + border += relBordLead[rel++]; + sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT; + } + + rel = 0; + border = absBordTrail; + for (env = sbrGrid->numEnv - 1; env > numRelLead; env--) { + border -= relBordTrail[rel++]; + sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT; + } + + sbrGrid->envTimeBorder[sbrGrid->numEnv] = absBordTrail * SAMPLES_PER_SLOT; + + if (sbrGrid->numEnv > 1) { + sbrGrid->numNoiseFloors = 2; + sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0]; + sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[middleBorder]; + sbrGrid->noiseTimeBorder[2] = sbrGrid->envTimeBorder[sbrGrid->numEnv]; + } else { + sbrGrid->numNoiseFloors = 1; + sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0]; + sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[1]; + } +} + +/************************************************************************************** + Function: UnpackDeltaTimeFreq - /* numEnv = 1, 2, or 4 */ - if (sbrGrid->numEnv == 1) border = NUM_TIME_SLOTS / 1; - else if (sbrGrid->numEnv == 2) border = NUM_TIME_SLOTS / 2; - else border = NUM_TIME_SLOTS / 4; + Description: unpack time/freq flags for delta coding of SBR envelopes (table 4.63) - for (rel = 0; rel < numRelLead; rel++) - relBordLead[rel] = border; + Inputs: BitStreamInfo struct pointing to start of dt/df flags + number of envelopes + number of noise floors - middleBorder = (sbrGrid->numEnv >> 1); + Outputs: delta flags for envelope and noise floors + + Return: none + **************************************************************************************/ +static void UnpackDeltaTimeFreq(BitStreamInfo *bsi, int numEnv, unsigned char *deltaFlagEnv, + int numNoiseFloors, unsigned char *deltaFlagNoise) { + int env, noiseFloor; - break; + for (env = 0; env < numEnv; env++) { + deltaFlagEnv[env] = GetBits(bsi, 1); + } - case SBR_GRID_FIXVAR: - absBorder = GetBits(bsi, 2) + NUM_TIME_SLOTS; - numRelBorder = GetBits(bsi, 2); - sbrGrid->numEnv = numRelBorder + 1; - for (rel = 0; rel < numRelBorder; rel++) - relBorder[rel] = 2*GetBits(bsi, 2) + 2; + for (noiseFloor = 0; noiseFloor < numNoiseFloors; noiseFloor++) { + deltaFlagNoise[noiseFloor] = GetBits(bsi, 1); + } +} - pBits = cLog2[sbrGrid->numEnv + 1]; - sbrGrid->pointer = GetBits(bsi, pBits); +/************************************************************************************** + Function: UnpackInverseFilterMode - for (env = sbrGrid->numEnv - 1; env >= 0; env--) - sbrGrid->freqRes[env] = GetBits(bsi, 1); + Description: unpack invf flags for chirp factor calculation (table 4.64) - absBordLead = 0; - absBordTrail = absBorder; - numRelLead = 0; - numRelTrail = numRelBorder; - - for (rel = 0; rel < numRelTrail; rel++) - relBordTrail[rel] = relBorder[rel]; - - if (sbrGrid->pointer > 1) middleBorder = sbrGrid->numEnv + 1 - sbrGrid->pointer; - else middleBorder = sbrGrid->numEnv - 1; - - break; - - case SBR_GRID_VARFIX: - absBorder = GetBits(bsi, 2); - numRelBorder = GetBits(bsi, 2); - sbrGrid->numEnv = numRelBorder + 1; - for (rel = 0; rel < numRelBorder; rel++) - relBorder[rel] = 2*GetBits(bsi, 2) + 2; - - pBits = cLog2[sbrGrid->numEnv + 1]; - sbrGrid->pointer = GetBits(bsi, pBits); - - for (env = 0; env < sbrGrid->numEnv; env++) - sbrGrid->freqRes[env] = GetBits(bsi, 1); - - absBordLead = absBorder; - absBordTrail = NUM_TIME_SLOTS; - numRelLead = numRelBorder; - numRelTrail = 0; - - for (rel = 0; rel < numRelLead; rel++) - relBordLead[rel] = relBorder[rel]; - - if (sbrGrid->pointer == 0) middleBorder = 1; - else if (sbrGrid->pointer == 1) middleBorder = sbrGrid->numEnv - 1; - else middleBorder = sbrGrid->pointer - 1; - - break; - - case SBR_GRID_VARVAR: - absBordLead = GetBits(bsi, 2); /* absBorder0 */ - absBordTrail = GetBits(bsi, 2) + NUM_TIME_SLOTS; /* absBorder1 */ - numRelBorder0 = GetBits(bsi, 2); - numRelBorder1 = GetBits(bsi, 2); - - sbrGrid->numEnv = numRelBorder0 + numRelBorder1 + 1; - ASSERT(sbrGrid->numEnv <= 5); - - for (rel = 0; rel < numRelBorder0; rel++) - relBorder0[rel] = 2*GetBits(bsi, 2) + 2; + Inputs: BitStreamInfo struct pointing to start of invf flags + number of noise floor bands - for (rel = 0; rel < numRelBorder1; rel++) - relBorder1[rel] = 2*GetBits(bsi, 2) + 2; + Outputs: invf flags for noise floor bands - pBits = cLog2[numRelBorder0 + numRelBorder1 + 2]; - sbrGrid->pointer = GetBits(bsi, pBits); + Return: none + **************************************************************************************/ +static void UnpackInverseFilterMode(BitStreamInfo *bsi, int numNoiseFloorBands, unsigned char *mode) { + int n; - for (env = 0; env < sbrGrid->numEnv; env++) - sbrGrid->freqRes[env] = GetBits(bsi, 1); + for (n = 0; n < numNoiseFloorBands; n++) { + mode[n] = GetBits(bsi, 2); + } +} - numRelLead = numRelBorder0; - numRelTrail = numRelBorder1; +/************************************************************************************** + Function: UnpackSinusoids - for (rel = 0; rel < numRelLead; rel++) - relBordLead[rel] = relBorder0[rel]; + Description: unpack sinusoid (harmonic) flags for each SBR subband (table 4.67) - for (rel = 0; rel < numRelTrail; rel++) - relBordTrail[rel] = relBorder1[rel]; + Inputs: BitStreamInfo struct pointing to start of sinusoid flags + number of high resolution SBR subbands (nHigh) - if (sbrGrid->pointer > 1) middleBorder = sbrGrid->numEnv + 1 - sbrGrid->pointer; - else middleBorder = sbrGrid->numEnv - 1; + Outputs: sinusoid flags for each SBR subband, zero-filled above nHigh - break; - } + Return: none + **************************************************************************************/ +static void UnpackSinusoids(BitStreamInfo *bsi, int nHigh, int addHarmonicFlag, unsigned char *addHarmonic) { + int n; + + n = 0; + if (addHarmonicFlag) { + for (; n < nHigh; n++) { + addHarmonic[n] = GetBits(bsi, 1); + } + } + + /* zero out unused bands */ + for (; n < MAX_QMF_BANDS; n++) { + addHarmonic[n] = 0; + } +} - /* build time border vector */ - sbrGrid->envTimeBorder[0] = absBordLead * SAMPLES_PER_SLOT; +/************************************************************************************** + Function: CopyCouplingGrid - rel = 0; - border = absBordLead; - for (env = 1; env <= numRelLead; env++) { - border += relBordLead[rel++]; - sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT; - } + Description: copy grid parameters from left to right for channel coupling - rel = 0; - border = absBordTrail; - for (env = sbrGrid->numEnv - 1; env > numRelLead; env--) { - border -= relBordTrail[rel++]; - sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT; - } + Inputs: initialized SBRGrid struct for left channel - sbrGrid->envTimeBorder[sbrGrid->numEnv] = absBordTrail * SAMPLES_PER_SLOT; + Outputs: initialized SBRGrid struct for right channel - if (sbrGrid->numEnv > 1) { - sbrGrid->numNoiseFloors = 2; - sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0]; - sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[middleBorder]; - sbrGrid->noiseTimeBorder[2] = sbrGrid->envTimeBorder[sbrGrid->numEnv]; - } else { - sbrGrid->numNoiseFloors = 1; - sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0]; - sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[1]; - } + Return: none + **************************************************************************************/ +static void CopyCouplingGrid(SBRGrid *sbrGridLeft, SBRGrid *sbrGridRight) { + int env, noiseFloor; + + sbrGridRight->frameClass = sbrGridLeft->frameClass; + sbrGridRight->ampResFrame = sbrGridLeft->ampResFrame; + sbrGridRight->pointer = sbrGridLeft->pointer; + + sbrGridRight->numEnv = sbrGridLeft->numEnv; + for (env = 0; env < sbrGridLeft->numEnv; env++) { + sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env]; + sbrGridRight->freqRes[env] = sbrGridLeft->freqRes[env]; + } + sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env]; /* borders are [0, numEnv] inclusive */ + + sbrGridRight->numNoiseFloors = sbrGridLeft->numNoiseFloors; + for (noiseFloor = 0; noiseFloor <= sbrGridLeft->numNoiseFloors; noiseFloor++) { + sbrGridRight->noiseTimeBorder[noiseFloor] = sbrGridLeft->noiseTimeBorder[noiseFloor]; + } + + /* numEnvPrev, numNoiseFloorsPrev, freqResPrev are updated in DecodeSBREnvelope() and DecodeSBRNoise() */ } /************************************************************************************** - * Function: UnpackDeltaTimeFreq - * - * Description: unpack time/freq flags for delta coding of SBR envelopes (table 4.63) - * - * Inputs: BitStreamInfo struct pointing to start of dt/df flags - * number of envelopes - * number of noise floors - * - * Outputs: delta flags for envelope and noise floors - * - * Return: none - **************************************************************************************/ -static void UnpackDeltaTimeFreq(BitStreamInfo *bsi, int numEnv, unsigned char *deltaFlagEnv, - int numNoiseFloors, unsigned char *deltaFlagNoise) -{ - int env, noiseFloor; + Function: CopyCouplingInverseFilterMode - for (env = 0; env < numEnv; env++) - deltaFlagEnv[env] = GetBits(bsi, 1); + Description: copy invf flags from left to right for channel coupling - for (noiseFloor = 0; noiseFloor < numNoiseFloors; noiseFloor++) - deltaFlagNoise[noiseFloor] = GetBits(bsi, 1); -} + Inputs: invf flags for left channel + number of noise floor bands -/************************************************************************************** - * Function: UnpackInverseFilterMode - * - * Description: unpack invf flags for chirp factor calculation (table 4.64) - * - * Inputs: BitStreamInfo struct pointing to start of invf flags - * number of noise floor bands - * - * Outputs: invf flags for noise floor bands - * - * Return: none + Outputs: invf flags for right channel + + Return: none **************************************************************************************/ -static void UnpackInverseFilterMode(BitStreamInfo *bsi, int numNoiseFloorBands, unsigned char *mode) -{ - int n; +static void CopyCouplingInverseFilterMode(int numNoiseFloorBands, unsigned char *modeLeft, unsigned char *modeRight) { + int band; - for (n = 0; n < numNoiseFloorBands; n++) - mode[n] = GetBits(bsi, 2); + for (band = 0; band < numNoiseFloorBands; band++) { + modeRight[band] = modeLeft[band]; + } } /************************************************************************************** - * Function: UnpackSinusoids - * - * Description: unpack sinusoid (harmonic) flags for each SBR subband (table 4.67) - * - * Inputs: BitStreamInfo struct pointing to start of sinusoid flags - * number of high resolution SBR subbands (nHigh) - * - * Outputs: sinusoid flags for each SBR subband, zero-filled above nHigh - * - * Return: none - **************************************************************************************/ -static void UnpackSinusoids(BitStreamInfo *bsi, int nHigh, int addHarmonicFlag, unsigned char *addHarmonic) -{ - int n; - - n = 0; - if (addHarmonicFlag) { - for ( ; n < nHigh; n++) - addHarmonic[n] = GetBits(bsi, 1); - } - - /* zero out unused bands */ - for ( ; n < MAX_QMF_BANDS; n++) - addHarmonic[n] = 0; -} + Function: UnpackSBRSingleChannel -/************************************************************************************** - * Function: CopyCouplingGrid - * - * Description: copy grid parameters from left to right for channel coupling - * - * Inputs: initialized SBRGrid struct for left channel - * - * Outputs: initialized SBRGrid struct for right channel - * - * Return: none - **************************************************************************************/ -static void CopyCouplingGrid(SBRGrid *sbrGridLeft, SBRGrid *sbrGridRight) -{ - int env, noiseFloor; - - sbrGridRight->frameClass = sbrGridLeft->frameClass; - sbrGridRight->ampResFrame = sbrGridLeft->ampResFrame; - sbrGridRight->pointer = sbrGridLeft->pointer; - - sbrGridRight->numEnv = sbrGridLeft->numEnv; - for (env = 0; env < sbrGridLeft->numEnv; env++) { - sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env]; - sbrGridRight->freqRes[env] = sbrGridLeft->freqRes[env]; - } - sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env]; /* borders are [0, numEnv] inclusive */ - - sbrGridRight->numNoiseFloors = sbrGridLeft->numNoiseFloors; - for (noiseFloor = 0; noiseFloor <= sbrGridLeft->numNoiseFloors; noiseFloor++) - sbrGridRight->noiseTimeBorder[noiseFloor] = sbrGridLeft->noiseTimeBorder[noiseFloor]; - - /* numEnvPrev, numNoiseFloorsPrev, freqResPrev are updated in DecodeSBREnvelope() and DecodeSBRNoise() */ -} + Description: unpack sideband info (grid, delta flags, invf flags, envelope and + noise floor configuration, sinusoids) for a single channel -/************************************************************************************** - * Function: CopyCouplingInverseFilterMode - * - * Description: copy invf flags from left to right for channel coupling - * - * Inputs: invf flags for left channel - * number of noise floor bands - * - * Outputs: invf flags for right channel - * - * Return: none - **************************************************************************************/ -static void CopyCouplingInverseFilterMode(int numNoiseFloorBands, unsigned char *modeLeft, unsigned char *modeRight) -{ - int band; + Inputs: BitStreamInfo struct pointing to start of sideband info + initialized PSInfoSBR struct (after parsing SBR header and building + frequency tables) + base output channel (range = [0, nChans-1]) - for (band = 0; band < numNoiseFloorBands; band++) - modeRight[band] = modeLeft[band]; -} + Outputs: updated PSInfoSBR struct (SBRGrid and SBRChan) -/************************************************************************************** - * Function: UnpackSBRSingleChannel - * - * Description: unpack sideband info (grid, delta flags, invf flags, envelope and - * noise floor configuration, sinusoids) for a single channel - * - * Inputs: BitStreamInfo struct pointing to start of sideband info - * initialized PSInfoSBR struct (after parsing SBR header and building - * frequency tables) - * base output channel (range = [0, nChans-1]) - * - * Outputs: updated PSInfoSBR struct (SBRGrid and SBRChan) - * - * Return: none + Return: none **************************************************************************************/ -void UnpackSBRSingleChannel(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase) -{ - int bitsLeft; - SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]); - SBRGrid *sbrGridL = &(psi->sbrGrid[chBase+0]); - SBRFreq *sbrFreq = &(psi->sbrFreq[chBase]); - SBRChan *sbrChanL = &(psi->sbrChan[chBase+0]); - - psi->dataExtra = GetBits(bsi, 1); - if (psi->dataExtra) - psi->resBitsData = GetBits(bsi, 4); - - UnpackSBRGrid(bsi, sbrHdr, sbrGridL); - UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); - UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); - - DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - - sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1); - UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]); - - psi->extendedDataPresent = GetBits(bsi, 1); - if (psi->extendedDataPresent) { - psi->extendedDataSize = GetBits(bsi, 4); - if (psi->extendedDataSize == 15) - psi->extendedDataSize += GetBits(bsi, 8); - - bitsLeft = 8 * psi->extendedDataSize; - - /* get ID, unpack extension info, do whatever is necessary with it... */ - while (bitsLeft > 0) { - GetBits(bsi, 8); - bitsLeft -= 8; - } - } +void UnpackSBRSingleChannel(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase) { + int bitsLeft; + SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]); + SBRGrid *sbrGridL = &(psi->sbrGrid[chBase + 0]); + SBRFreq *sbrFreq = &(psi->sbrFreq[chBase]); + SBRChan *sbrChanL = &(psi->sbrChan[chBase + 0]); + + psi->dataExtra = GetBits(bsi, 1); + if (psi->dataExtra) { + psi->resBitsData = GetBits(bsi, 4); + } + + UnpackSBRGrid(bsi, sbrHdr, sbrGridL); + UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); + UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); + + DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + + sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1); + UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]); + + psi->extendedDataPresent = GetBits(bsi, 1); + if (psi->extendedDataPresent) { + psi->extendedDataSize = GetBits(bsi, 4); + if (psi->extendedDataSize == 15) { + psi->extendedDataSize += GetBits(bsi, 8); + } + + bitsLeft = 8 * psi->extendedDataSize; + + /* get ID, unpack extension info, do whatever is necessary with it... */ + while (bitsLeft > 0) { + GetBits(bsi, 8); + bitsLeft -= 8; + } + } } /************************************************************************************** - * Function: UnpackSBRChannelPair - * - * Description: unpack sideband info (grid, delta flags, invf flags, envelope and - * noise floor configuration, sinusoids) for a channel pair - * - * Inputs: BitStreamInfo struct pointing to start of sideband info - * initialized PSInfoSBR struct (after parsing SBR header and building - * frequency tables) - * base output channel (range = [0, nChans-1]) - * - * Outputs: updated PSInfoSBR struct (SBRGrid and SBRChan for both channels) - * - * Return: none + Function: UnpackSBRChannelPair + + Description: unpack sideband info (grid, delta flags, invf flags, envelope and + noise floor configuration, sinusoids) for a channel pair + + Inputs: BitStreamInfo struct pointing to start of sideband info + initialized PSInfoSBR struct (after parsing SBR header and building + frequency tables) + base output channel (range = [0, nChans-1]) + + Outputs: updated PSInfoSBR struct (SBRGrid and SBRChan for both channels) + + Return: none **************************************************************************************/ -void UnpackSBRChannelPair(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase) -{ - int bitsLeft; - SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]); - SBRGrid *sbrGridL = &(psi->sbrGrid[chBase+0]), *sbrGridR = &(psi->sbrGrid[chBase+1]); - SBRFreq *sbrFreq = &(psi->sbrFreq[chBase]); - SBRChan *sbrChanL = &(psi->sbrChan[chBase+0]), *sbrChanR = &(psi->sbrChan[chBase+1]); - - psi->dataExtra = GetBits(bsi, 1); - if (psi->dataExtra) { - psi->resBitsData = GetBits(bsi, 4); - psi->resBitsData = GetBits(bsi, 4); - } - - psi->couplingFlag = GetBits(bsi, 1); - if (psi->couplingFlag) { - UnpackSBRGrid(bsi, sbrHdr, sbrGridL); - CopyCouplingGrid(sbrGridL, sbrGridR); - - UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); - UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise); - - UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); - CopyCouplingInverseFilterMode(sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1], sbrChanR->invfMode[1]); - - DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); - DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); - - /* pass RIGHT sbrChan struct */ - UncoupleSBREnvelope(psi, sbrGridL, sbrFreq, sbrChanR); - UncoupleSBRNoise(psi, sbrGridL, sbrFreq, sbrChanR); - - } else { - UnpackSBRGrid(bsi, sbrHdr, sbrGridL); - UnpackSBRGrid(bsi, sbrHdr, sbrGridR); - UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); - UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise); - UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); - UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanR->invfMode[1]); - - DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); - DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); - DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); - } - - sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1); - UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]); - - sbrChanR->addHarmonicFlag[1] = GetBits(bsi, 1); - UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanR->addHarmonicFlag[1], sbrChanR->addHarmonic[1]); - - psi->extendedDataPresent = GetBits(bsi, 1); - if (psi->extendedDataPresent) { - psi->extendedDataSize = GetBits(bsi, 4); - if (psi->extendedDataSize == 15) - psi->extendedDataSize += GetBits(bsi, 8); - - bitsLeft = 8 * psi->extendedDataSize; - - /* get ID, unpack extension info, do whatever is necessary with it... */ - while (bitsLeft > 0) { - GetBits(bsi, 8); - bitsLeft -= 8; - } - } +void UnpackSBRChannelPair(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase) { + int bitsLeft; + SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]); + SBRGrid *sbrGridL = &(psi->sbrGrid[chBase + 0]), *sbrGridR = &(psi->sbrGrid[chBase + 1]); + SBRFreq *sbrFreq = &(psi->sbrFreq[chBase]); + SBRChan *sbrChanL = &(psi->sbrChan[chBase + 0]), *sbrChanR = &(psi->sbrChan[chBase + 1]); + + psi->dataExtra = GetBits(bsi, 1); + if (psi->dataExtra) { + psi->resBitsData = GetBits(bsi, 4); + psi->resBitsData = GetBits(bsi, 4); + } + + psi->couplingFlag = GetBits(bsi, 1); + if (psi->couplingFlag) { + UnpackSBRGrid(bsi, sbrHdr, sbrGridL); + CopyCouplingGrid(sbrGridL, sbrGridR); + + UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); + UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise); + + UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); + CopyCouplingInverseFilterMode(sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1], sbrChanR->invfMode[1]); + + DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); + DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); + + /* pass RIGHT sbrChan struct */ + UncoupleSBREnvelope(psi, sbrGridL, sbrFreq, sbrChanR); + UncoupleSBRNoise(psi, sbrGridL, sbrFreq, sbrChanR); + + } else { + UnpackSBRGrid(bsi, sbrHdr, sbrGridL); + UnpackSBRGrid(bsi, sbrHdr, sbrGridR); + UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise); + UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise); + UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]); + UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanR->invfMode[1]); + + DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); + DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0); + DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1); + } + + sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1); + UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]); + + sbrChanR->addHarmonicFlag[1] = GetBits(bsi, 1); + UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanR->addHarmonicFlag[1], sbrChanR->addHarmonic[1]); + + psi->extendedDataPresent = GetBits(bsi, 1); + if (psi->extendedDataPresent) { + psi->extendedDataSize = GetBits(bsi, 4); + if (psi->extendedDataSize == 15) { + psi->extendedDataSize += GetBits(bsi, 8); + } + + bitsLeft = 8 * psi->extendedDataSize; + + /* get ID, unpack extension info, do whatever is necessary with it... */ + while (bitsLeft > 0) { + GetBits(bsi, 8); + bitsLeft -= 8; + } + } } diff --git a/src/libhelix-aac/sbrtabs.c b/src/libhelix-aac/sbrtabs.c index 01da8617..45763590 100644 --- a/src/libhelix-aac/sbrtabs.c +++ b/src/libhelix-aac/sbrtabs.c @@ -1,53 +1,60 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: sbrtabs.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +#pragma GCC optimize ("O3") +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: sbrtabs.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * sbrtabs.c - platform-independent tables for SBR (global, read-only) + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + sbrtabs.c - platform-independent tables for SBR (global, read-only) **************************************************************************************/ #include "sbr.h" -/* k0Tab[sampRateIdx][k] = k0 = startMin + offset(bs_start_freq) for given sample rate (4.6.18.3.2.1) - * downsampled (single-rate) SBR not currently supported - */ +#if defined(PICO_RP2040) || defined(PICO_RP2350) +#define DPROGMEM __attribute__(( section(".time_critical.data") )) +#else +#define DPROGMEM PROGMEM +#endif + +/* k0Tab[sampRateIdx][k] = k0 = startMin + offset(bs_start_freq) for given sample rate (4.6.18.3.2.1) + downsampled (single-rate) SBR not currently supported +*/ const unsigned char k0Tab[NUM_SAMPLE_RATES_SBR][16] = { { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 23, 27, 31 }, /* 96 kHz */ { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 23, 27, 31 }, /* 88 kHz */ @@ -60,341 +67,345 @@ const unsigned char k0Tab[NUM_SAMPLE_RATES_SBR][16] = { { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 }, /* 16 kHz */ }; -/* k2Tab[sampRateIdx][k] = stopVector(bs_stop_freq) for given sample rate, bs_stop_freq = [0, 13] (4.6.18.3.2.1) - * generated with Matlab script calc_stopvec.m - * downsampled (single-rate) SBR not currently supported - */ +/* k2Tab[sampRateIdx][k] = stopVector(bs_stop_freq) for given sample rate, bs_stop_freq = [0, 13] (4.6.18.3.2.1) + generated with Matlab script calc_stopvec.m + downsampled (single-rate) SBR not currently supported +*/ const unsigned char k2Tab[NUM_SAMPLE_RATES_SBR][14] = { - { 13, 15, 17, 19, 21, 24, 27, 31, 35, 39, 44, 50, 57, 64 }, /* 96 kHz */ - { 15, 17, 19, 21, 23, 26, 29, 33, 37, 41, 46, 51, 57, 64 }, /* 88 kHz */ - { 20, 22, 24, 26, 28, 31, 34, 37, 41, 45, 49, 54, 59, 64 }, /* 64 kHz */ - { 21, 23, 25, 27, 29, 32, 35, 38, 41, 45, 49, 54, 59, 64 }, /* 48 kHz */ - { 23, 25, 27, 29, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64 }, /* 44 kHz */ - { 32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64 }, /* 32 kHz */ - { 32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64 }, /* 24 kHz */ - { 35, 36, 38, 40, 42, 44, 46, 48, 50, 52, 55, 58, 61, 64 }, /* 22 kHz */ - { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64 }, /* 16 kHz */ + { 13, 15, 17, 19, 21, 24, 27, 31, 35, 39, 44, 50, 57, 64 }, /* 96 kHz */ + { 15, 17, 19, 21, 23, 26, 29, 33, 37, 41, 46, 51, 57, 64 }, /* 88 kHz */ + { 20, 22, 24, 26, 28, 31, 34, 37, 41, 45, 49, 54, 59, 64 }, /* 64 kHz */ + { 21, 23, 25, 27, 29, 32, 35, 38, 41, 45, 49, 54, 59, 64 }, /* 48 kHz */ + { 23, 25, 27, 29, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64 }, /* 44 kHz */ + { 32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64 }, /* 32 kHz */ + { 32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64 }, /* 24 kHz */ + { 35, 36, 38, 40, 42, 44, 46, 48, 50, 52, 55, 58, 61, 64 }, /* 22 kHz */ + { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64 }, /* 16 kHz */ }; -/* NINT(2.048E6 / Fs) (figure 4.47) - * downsampled (single-rate) SBR not currently supported - */ -const unsigned char goalSBTab[NUM_SAMPLE_RATES_SBR] = { - 21, 23, 32, 43, 46, 64, 85, 93, 128 +/* NINT(2.048E6 / Fs) (figure 4.47) + downsampled (single-rate) SBR not currently supported +*/ +const unsigned char goalSBTab[NUM_SAMPLE_RATES_SBR] = { + 21, 23, 32, 43, 46, 64, 85, 93, 128 }; const HuffInfo huffTabSBRInfo[10] PROGMEM = { - {19, { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 2, 7, 4, 8, 72, 0}, 0}, - {20, { 0, 2, 2, 2, 2, 2, 1, 3, 3, 2, 4, 4, 4, 3, 2, 5, 6, 13, 15, 46}, 121}, - {17, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 0, 0, 1, 25, 10, 0, 0, 0}, 242}, - {19, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 1, 0, 1, 1, 2, 1, 29, 2, 0}, 291}, - {19, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 2, 5, 1, 4, 2, 3, 34, 0}, 340}, - {20, { 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 1, 2, 3, 4, 4, 7, 10, 16}, 403}, - {14, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 13, 2, 0, 0, 0, 0, 0, 0}, 466}, - {14, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 6, 8, 0, 0, 0, 0, 0, 0}, 491}, - {14, { 1, 1, 1, 1, 1, 1, 0, 2, 0, 1, 1, 0, 51, 2, 0, 0, 0, 0, 0, 0}, 516}, - { 8, { 1, 1, 1, 0, 1, 1, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 579}, + {19, { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 2, 7, 4, 8, 72, 0}, 0}, + {20, { 0, 2, 2, 2, 2, 2, 1, 3, 3, 2, 4, 4, 4, 3, 2, 5, 6, 13, 15, 46}, 121}, + {17, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 0, 0, 1, 25, 10, 0, 0, 0}, 242}, + {19, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 1, 0, 1, 1, 2, 1, 29, 2, 0}, 291}, + {19, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 2, 5, 1, 4, 2, 3, 34, 0}, 340}, + {20, { 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 1, 2, 3, 4, 4, 7, 10, 16}, 403}, + {14, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 13, 2, 0, 0, 0, 0, 0, 0}, 466}, + {14, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 6, 8, 0, 0, 0, 0, 0, 0}, 491}, + {14, { 1, 1, 1, 1, 1, 1, 0, 2, 0, 1, 1, 0, 51, 2, 0, 0, 0, 0, 0, 0}, 516}, + { 8, { 1, 1, 1, 0, 1, 1, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 579}, }; /* Huffman tables from appendix 4.A.6.1, includes offset of -LAV[i] for table i */ +#ifdef ESP8266 const signed int /*short*/ huffTabSBR[604] PROGMEM = { - /* SBR table sbr_tenv15 [121] (signed) */ - 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, - -9, 8, -10, 9, -11, 10, -12, -13, 11, -14, 12, -15, -16, 13, -19, -18, - -17, 14, -24, -20, 16, -26, -21, 15, -23, -25, -22, -60, -59, -58, -57, -56, - -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, - -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, - /* SBR table sbr_fenv15 [121] (signed) */ - 0, -1, 1, -2, -3, 2, -4, 3, -5, 4, -6, 5, -7, 6, -8, 7, - -9, 8, -10, 9, -11, 10, 11, -12, 12, -13, 13, 14, -14, -15, 15, 16, - 17, -16, -17, -18, -19, 18, 19, -20, -21, 20, 21, -24, -23, -22, -26, -28, - 22, 23, 25, -41, -25, 26, 27, -30, -27, 24, 28, 44, -51, -46, -44, -43, - -37, -33, -31, -29, 30, 37, 42, 47, 48, -60, -59, -58, -57, -56, -55, -54, - -53, -52, -50, -49, -48, -47, -45, -42, -40, -39, -38, -36, -35, -34, -32, 29, - 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 43, 45, 46, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, - /* SBR table sbr_tenv15b [49] (signed) */ - 0, 1, -1, 2, -2, 3, -3, 4, -4, -5, 5, -6, 6, 7, -7, 8, - -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, - -8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, - /* SBR table sbr_fenv15b [49] (signed) */ - 0, -1, 1, -2, 2, 3, -3, -4, 4, -5, 5, -6, 6, -7, 7, 8, - -9, -8, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, - -10, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, - /* SBR table sbr_tenv30 [63] (signed) */ - 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, -7, 6, -8, 7, - -9, -10, 8, 9, 10, -13, -11, -12, -14, 11, 12, -31, -30, -29, -28, -27, - -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - /* SBR table sbr_fenv30 [63] (signed) */ - 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, - 8, 9, -9, -10, 10, 11, -11, -12, 12, 13, -13, -15, 14, 15, -14, 18, - -18, -24, -19, 16, 17, -22, -21, -16, 20, 21, 22, 25, -23, -20, 24, -31, - -30, -29, -28, -27, -26, -25, -17, 19, 23, 26, 27, 28, 29, 30, 31, - /* SBR table sbr_tenv30b [25] (signed) */ - 0, 1, -1, -2, 2, 3, -3, -4, 4, -5, -12, -11, -10, -9, -8, -7, - -6, 5, 6, 7, 8, 9, 10, 11, 12, - /* SBR table sbr_fenv30b [25] (signed) */ - 0, -1, 1, -2, 2, 3, -3, -4, 4, -5, 5, 6, -12, -11, -10, -9, - -8, -7, -6, 7, 8, 9, 10, 11, 12, - /* SBR table sbr_tnoise30 [63] (signed) */ - 0, 1, -1, -2, 2, -3, 3, -4, 4, -5, 5, 11, -31, -30, -29, -28, - -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, - -11, -10, -9, -8, -7, -6, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - /* SBR table sbr_tnoise30b [25] (signed) */ - 0, -1, 1, -2, 2, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, +#else +const signed short huffTabSBR[604] PROGMEM = { +#endif + /* SBR table sbr_tenv15 [121] (signed) */ + 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, + -9, 8, -10, 9, -11, 10, -12, -13, 11, -14, 12, -15, -16, 13, -19, -18, + -17, 14, -24, -20, 16, -26, -21, 15, -23, -25, -22, -60, -59, -58, -57, -56, + -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, + -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, + /* SBR table sbr_fenv15 [121] (signed) */ + 0, -1, 1, -2, -3, 2, -4, 3, -5, 4, -6, 5, -7, 6, -8, 7, + -9, 8, -10, 9, -11, 10, 11, -12, 12, -13, 13, 14, -14, -15, 15, 16, + 17, -16, -17, -18, -19, 18, 19, -20, -21, 20, 21, -24, -23, -22, -26, -28, + 22, 23, 25, -41, -25, 26, 27, -30, -27, 24, 28, 44, -51, -46, -44, -43, + -37, -33, -31, -29, 30, 37, 42, 47, 48, -60, -59, -58, -57, -56, -55, -54, + -53, -52, -50, -49, -48, -47, -45, -42, -40, -39, -38, -36, -35, -34, -32, 29, + 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 43, 45, 46, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, + /* SBR table sbr_tenv15b [49] (signed) */ + 0, 1, -1, 2, -2, 3, -3, 4, -4, -5, 5, -6, 6, 7, -7, 8, + -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, + -8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, + /* SBR table sbr_fenv15b [49] (signed) */ + 0, -1, 1, -2, 2, 3, -3, -4, 4, -5, 5, -6, 6, -7, 7, 8, + -9, -8, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, + -10, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, + /* SBR table sbr_tenv30 [63] (signed) */ + 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, -7, 6, -8, 7, + -9, -10, 8, 9, 10, -13, -11, -12, -14, 11, 12, -31, -30, -29, -28, -27, + -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + /* SBR table sbr_fenv30 [63] (signed) */ + 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, + 8, 9, -9, -10, 10, 11, -11, -12, 12, 13, -13, -15, 14, 15, -14, 18, + -18, -24, -19, 16, 17, -22, -21, -16, 20, 21, 22, 25, -23, -20, 24, -31, + -30, -29, -28, -27, -26, -25, -17, 19, 23, 26, 27, 28, 29, 30, 31, + /* SBR table sbr_tenv30b [25] (signed) */ + 0, 1, -1, -2, 2, 3, -3, -4, 4, -5, -12, -11, -10, -9, -8, -7, + -6, 5, 6, 7, 8, 9, 10, 11, 12, + /* SBR table sbr_fenv30b [25] (signed) */ + 0, -1, 1, -2, 2, 3, -3, -4, 4, -5, 5, 6, -12, -11, -10, -9, + -8, -7, -6, 7, 8, 9, 10, 11, 12, + /* SBR table sbr_tnoise30 [63] (signed) */ + 0, 1, -1, -2, 2, -3, 3, -4, 4, -5, 5, 11, -31, -30, -29, -28, + -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, + -11, -10, -9, -8, -7, -6, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + /* SBR table sbr_tnoise30b [25] (signed) */ + 0, -1, 1, -2, 2, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, }; /* log2Tab[x] = floor(log2(x)), format = Q28 */ const int log2Tab[65] PROGMEM = { - 0x00000000, 0x00000000, 0x10000000, 0x195c01a3, 0x20000000, 0x25269e12, 0x295c01a3, 0x2ceaecfe, - 0x30000000, 0x32b80347, 0x35269e12, 0x3759d4f8, 0x395c01a3, 0x3b350047, 0x3ceaecfe, 0x3e829fb6, - 0x40000000, 0x41663f6f, 0x42b80347, 0x43f782d7, 0x45269e12, 0x4646eea2, 0x4759d4f8, 0x48608280, - 0x495c01a3, 0x4a4d3c25, 0x4b350047, 0x4c1404ea, 0x4ceaecfe, 0x4dba4a47, 0x4e829fb6, 0x4f446359, - 0x50000000, 0x50b5d69b, 0x51663f6f, 0x52118b11, 0x52b80347, 0x5359ebc5, 0x53f782d7, 0x549101ea, - 0x55269e12, 0x55b88873, 0x5646eea2, 0x56d1fafd, 0x5759d4f8, 0x57dea15a, 0x58608280, 0x58df988f, - 0x595c01a3, 0x59d5d9fd, 0x5a4d3c25, 0x5ac24113, 0x5b350047, 0x5ba58feb, 0x5c1404ea, 0x5c80730b, - 0x5ceaecfe, 0x5d53847a, 0x5dba4a47, 0x5e1f4e51, 0x5e829fb6, 0x5ee44cd5, 0x5f446359, 0x5fa2f045, - 0x60000000 + 0x00000000, 0x00000000, 0x10000000, 0x195c01a3, 0x20000000, 0x25269e12, 0x295c01a3, 0x2ceaecfe, + 0x30000000, 0x32b80347, 0x35269e12, 0x3759d4f8, 0x395c01a3, 0x3b350047, 0x3ceaecfe, 0x3e829fb6, + 0x40000000, 0x41663f6f, 0x42b80347, 0x43f782d7, 0x45269e12, 0x4646eea2, 0x4759d4f8, 0x48608280, + 0x495c01a3, 0x4a4d3c25, 0x4b350047, 0x4c1404ea, 0x4ceaecfe, 0x4dba4a47, 0x4e829fb6, 0x4f446359, + 0x50000000, 0x50b5d69b, 0x51663f6f, 0x52118b11, 0x52b80347, 0x5359ebc5, 0x53f782d7, 0x549101ea, + 0x55269e12, 0x55b88873, 0x5646eea2, 0x56d1fafd, 0x5759d4f8, 0x57dea15a, 0x58608280, 0x58df988f, + 0x595c01a3, 0x59d5d9fd, 0x5a4d3c25, 0x5ac24113, 0x5b350047, 0x5ba58feb, 0x5c1404ea, 0x5c80730b, + 0x5ceaecfe, 0x5d53847a, 0x5dba4a47, 0x5e1f4e51, 0x5e829fb6, 0x5ee44cd5, 0x5f446359, 0x5fa2f045, + 0x60000000 }; -/* coefficient table 4.A.87, format = Q31 - * reordered as: - * cTab[0], cTab[64], cTab[128], cTab[192], cTab[256], - * cTab[2], cTab[66], cTab[130], cTab[194], cTab[258], - * ... - * cTab[64], cTab[128], cTab[192], cTab[256], cTab[320] - * - * NOTE: cTab[1, 2, ... , 318, 319] = cTab[639, 638, ... 322, 321] - * except cTab[384] = -cTab[256], cTab[512] = -cTab[128] - */ +/* coefficient table 4.A.87, format = Q31 + reordered as: + cTab[0], cTab[64], cTab[128], cTab[192], cTab[256], + cTab[2], cTab[66], cTab[130], cTab[194], cTab[258], + ... + cTab[64], cTab[128], cTab[192], cTab[256], cTab[320] + + NOTE: cTab[1, 2, ... , 318, 319] = cTab[639, 638, ... 322, 321] + except cTab[384] = -cTab[256], cTab[512] = -cTab[128] +*/ const int cTabA[165] PROGMEM = { - 0x00000000, 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0xffed978a, 0x006090c4, 0x01fd3ba0, 0x08a24899, 0x311af3a4, - 0xfff0065d, 0x006b47fa, 0x024bf7a1, 0x082f552e, 0x33ff670e, 0xffef7b8b, 0x0075fded, 0x029e35b4, 0x07a8127d, 0x36e69691, - 0xffee1650, 0x00807994, 0x02f3e48d, 0x070bbf58, 0x39ce0477, 0xffecc31b, 0x008a7dd7, 0x034d01f0, 0x06593912, 0x3cb41219, - 0xffeb50b2, 0x009424c6, 0x03a966bb, 0x0590a67d, 0x3f962fb8, 0xffe9ca76, 0x009d10bf, 0x04083fec, 0x04b0adcb, 0x4272a385, - 0xffe88ba8, 0x00a520bb, 0x04694101, 0x03b8f8dc, 0x4547daea, 0xffe79e16, 0x00abe79e, 0x04cc2fcf, 0x02a99097, 0x4812f848, - 0xffe6d466, 0x00b1978d, 0x05303f87, 0x01816e06, 0x4ad237a2, 0xffe65416, 0x00b5c867, 0x05950122, 0x0040c496, 0x4d83976c, - 0xffe66dd0, 0x00b8394b, 0x05f9c051, 0xfee723c6, 0x5024d70e, 0xffe69423, 0x00b8c6b0, 0x065dd56a, 0xfd7475d8, 0x52b449de, - 0xffe75361, 0x00b73ab0, 0x06c0f0c0, 0xfbe8f5bd, 0x552f8ff7, 0xffe85b4b, 0x00b36acd, 0x0721bf22, 0xfa44a069, 0x579505f5, - 0xffea353a, 0x00acbd2f, 0x077fedb3, 0xf887507c, 0x59e2f69e, 0xffec8409, 0x00a3508f, 0x07da2b7f, 0xf6b1f3c3, 0x5c16d0ae, - 0xffef2395, 0x0096dcc2, 0x08303897, 0xf4c473c6, 0x5e2f6367, 0xfff294c3, 0x00872c63, 0x0880ffdd, 0xf2bf6ea4, 0x602b0c7f, - 0xfff681d6, 0x007400b8, 0x08cb4e23, 0xf0a3959f, 0x6207f220, 0xfffb42b0, 0x005d36df, 0x090ec1fc, 0xee71b2fe, 0x63c45243, - 0x00007134, 0x00426f36, 0x0949eaac, 0xec2a3f5f, 0x655f63f2, 0x0006b1cf, 0x0023b989, 0x097c1ee8, 0xe9cea84a, 0x66d76725, - 0x000d31b5, 0x0000e790, 0x09a3e163, 0xe75f8bb8, 0x682b39a4, 0x001471f8, 0xffda17f2, 0x09c0e59f, 0xe4de0cb0, 0x6959709d, - 0x001c3549, 0xffaea5d6, 0x09d19ca9, 0xe24b8f66, 0x6a619c5e, 0x0024dd50, 0xff7ee3f1, 0x09d5560b, 0xdfa93ab5, 0x6b42a864, - 0x002d8e42, 0xff4aabc8, 0x09caeb0f, 0xdcf898fb, 0x6bfbdd98, 0x003745f9, 0xff120d70, 0x09b18a1d, 0xda3b176a, 0x6c8c4c7a, - 0x004103f4, 0xfed4bec3, 0x09881dc5, 0xd7722f04, 0x6cf4073e, 0x004b6c46, 0xfe933dc0, 0x094d7ec2, 0xd49fd55f, 0x6d32730f, - 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0x6d474e1d, + 0x00000000, 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0xffed978a, 0x006090c4, 0x01fd3ba0, 0x08a24899, 0x311af3a4, + 0xfff0065d, 0x006b47fa, 0x024bf7a1, 0x082f552e, 0x33ff670e, 0xffef7b8b, 0x0075fded, 0x029e35b4, 0x07a8127d, 0x36e69691, + 0xffee1650, 0x00807994, 0x02f3e48d, 0x070bbf58, 0x39ce0477, 0xffecc31b, 0x008a7dd7, 0x034d01f0, 0x06593912, 0x3cb41219, + 0xffeb50b2, 0x009424c6, 0x03a966bb, 0x0590a67d, 0x3f962fb8, 0xffe9ca76, 0x009d10bf, 0x04083fec, 0x04b0adcb, 0x4272a385, + 0xffe88ba8, 0x00a520bb, 0x04694101, 0x03b8f8dc, 0x4547daea, 0xffe79e16, 0x00abe79e, 0x04cc2fcf, 0x02a99097, 0x4812f848, + 0xffe6d466, 0x00b1978d, 0x05303f87, 0x01816e06, 0x4ad237a2, 0xffe65416, 0x00b5c867, 0x05950122, 0x0040c496, 0x4d83976c, + 0xffe66dd0, 0x00b8394b, 0x05f9c051, 0xfee723c6, 0x5024d70e, 0xffe69423, 0x00b8c6b0, 0x065dd56a, 0xfd7475d8, 0x52b449de, + 0xffe75361, 0x00b73ab0, 0x06c0f0c0, 0xfbe8f5bd, 0x552f8ff7, 0xffe85b4b, 0x00b36acd, 0x0721bf22, 0xfa44a069, 0x579505f5, + 0xffea353a, 0x00acbd2f, 0x077fedb3, 0xf887507c, 0x59e2f69e, 0xffec8409, 0x00a3508f, 0x07da2b7f, 0xf6b1f3c3, 0x5c16d0ae, + 0xffef2395, 0x0096dcc2, 0x08303897, 0xf4c473c6, 0x5e2f6367, 0xfff294c3, 0x00872c63, 0x0880ffdd, 0xf2bf6ea4, 0x602b0c7f, + 0xfff681d6, 0x007400b8, 0x08cb4e23, 0xf0a3959f, 0x6207f220, 0xfffb42b0, 0x005d36df, 0x090ec1fc, 0xee71b2fe, 0x63c45243, + 0x00007134, 0x00426f36, 0x0949eaac, 0xec2a3f5f, 0x655f63f2, 0x0006b1cf, 0x0023b989, 0x097c1ee8, 0xe9cea84a, 0x66d76725, + 0x000d31b5, 0x0000e790, 0x09a3e163, 0xe75f8bb8, 0x682b39a4, 0x001471f8, 0xffda17f2, 0x09c0e59f, 0xe4de0cb0, 0x6959709d, + 0x001c3549, 0xffaea5d6, 0x09d19ca9, 0xe24b8f66, 0x6a619c5e, 0x0024dd50, 0xff7ee3f1, 0x09d5560b, 0xdfa93ab5, 0x6b42a864, + 0x002d8e42, 0xff4aabc8, 0x09caeb0f, 0xdcf898fb, 0x6bfbdd98, 0x003745f9, 0xff120d70, 0x09b18a1d, 0xda3b176a, 0x6c8c4c7a, + 0x004103f4, 0xfed4bec3, 0x09881dc5, 0xd7722f04, 0x6cf4073e, 0x004b6c46, 0xfe933dc0, 0x094d7ec2, 0xd49fd55f, 0x6d32730f, + 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0x6d474e1d, }; -/* coefficient table 4.A.87, format = Q31 - * reordered as cTab[0], cTab[64], cTab[128], ... cTab[576], cTab[1], cTab[65], cTab[129], ... cTab[639] - * keeping full table (not using symmetry) to allow sequential access in synth filter inner loop - * format = Q31 - */ +/* coefficient table 4.A.87, format = Q31 + reordered as cTab[0], cTab[64], cTab[128], ... cTab[576], cTab[1], cTab[65], cTab[129], ... cTab[639] + keeping full table (not using symmetry) to allow sequential access in synth filter inner loop + format = Q31 +*/ const int cTabS[640] PROGMEM = { - 0x00000000, 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0x6d474e1d, 0xd1c58ace, 0x09015651, 0xfe4d1be3, 0x0055dba1, - 0xffede50e, 0x005b5371, 0x01d78bfc, 0x08d3e41b, 0x2faa221c, 0x6d41d963, 0xd3337b3d, 0x09299ead, 0xfe70b8d1, 0x0050b177, - 0xffed978a, 0x006090c4, 0x01fd3ba0, 0x08a24899, 0x311af3a4, 0x6d32730f, 0xd49fd55f, 0x094d7ec2, 0xfe933dc0, 0x004b6c46, - 0xffefc9b9, 0x0065fde5, 0x02244a24, 0x086b1eeb, 0x328cc6f0, 0x6d18520e, 0xd60a46e5, 0x096d0e21, 0xfeb48d0d, 0x00465348, - 0xfff0065d, 0x006b47fa, 0x024bf7a1, 0x082f552e, 0x33ff670e, 0x6cf4073e, 0xd7722f04, 0x09881dc5, 0xfed4bec3, 0x004103f4, - 0xffeff6ca, 0x0070c8a5, 0x0274ba43, 0x07ee507c, 0x3572ec70, 0x6cc59bab, 0xd8d7f21f, 0x099ec3dc, 0xfef3f6ab, 0x003c1fa4, - 0xffef7b8b, 0x0075fded, 0x029e35b4, 0x07a8127d, 0x36e69691, 0x6c8c4c7a, 0xda3b176a, 0x09b18a1d, 0xff120d70, 0x003745f9, - 0xffeedfa4, 0x007b3875, 0x02c89901, 0x075ca90c, 0x385a49c4, 0x6c492217, 0xdb9b5b12, 0x09c018ce, 0xff2ef725, 0x00329ab6, - 0xffee1650, 0x00807994, 0x02f3e48d, 0x070bbf58, 0x39ce0477, 0x6bfbdd98, 0xdcf898fb, 0x09caeb0f, 0xff4aabc8, 0x002d8e42, - 0xffed651d, 0x0085c217, 0x03201116, 0x06b559c3, 0x3b415115, 0x6ba4629f, 0xde529086, 0x09d1fa23, 0xff6542d1, 0x00293718, - 0xffecc31b, 0x008a7dd7, 0x034d01f0, 0x06593912, 0x3cb41219, 0x6b42a864, 0xdfa93ab5, 0x09d5560b, 0xff7ee3f1, 0x0024dd50, - 0xffebe77b, 0x008f4bfc, 0x037ad438, 0x05f7fb90, 0x3e25b17e, 0x6ad73e8d, 0xe0fc421e, 0x09d52709, 0xff975c01, 0x002064f8, - 0xffeb50b2, 0x009424c6, 0x03a966bb, 0x0590a67d, 0x3f962fb8, 0x6a619c5e, 0xe24b8f66, 0x09d19ca9, 0xffaea5d6, 0x001c3549, - 0xffea9192, 0x0098b855, 0x03d8afe6, 0x05237f9d, 0x41058bc6, 0x69e29784, 0xe396a45d, 0x09cab9f2, 0xffc4e365, 0x0018703f, - 0xffe9ca76, 0x009d10bf, 0x04083fec, 0x04b0adcb, 0x4272a385, 0x6959709d, 0xe4de0cb0, 0x09c0e59f, 0xffda17f2, 0x001471f8, - 0xffe940f4, 0x00a1039c, 0x043889c6, 0x0437fb0a, 0x43de620a, 0x68c7269b, 0xe620c476, 0x09b3d77f, 0xffee183b, 0x0010bc63, - 0xffe88ba8, 0x00a520bb, 0x04694101, 0x03b8f8dc, 0x4547daea, 0x682b39a4, 0xe75f8bb8, 0x09a3e163, 0x0000e790, 0x000d31b5, - 0xffe83a07, 0x00a8739d, 0x049aa82f, 0x03343533, 0x46aea856, 0x6785c24d, 0xe89971b7, 0x099140a7, 0x00131c75, 0x0009aa3f, - 0xffe79e16, 0x00abe79e, 0x04cc2fcf, 0x02a99097, 0x4812f848, 0x66d76725, 0xe9cea84a, 0x097c1ee8, 0x0023b989, 0x0006b1cf, - 0xffe7746e, 0x00af374c, 0x04fe20be, 0x02186a91, 0x4973fef1, 0x661fd6b8, 0xeafee7f1, 0x0963ed46, 0x0033b927, 0x00039609, - 0xffe6d466, 0x00b1978d, 0x05303f87, 0x01816e06, 0x4ad237a2, 0x655f63f2, 0xec2a3f5f, 0x0949eaac, 0x00426f36, 0x00007134, - 0xffe6afee, 0x00b3d15c, 0x05626209, 0x00e42fa2, 0x4c2ca3df, 0x64964063, 0xed50a31d, 0x092d7970, 0x00504f41, 0xfffdfa25, - 0xffe65416, 0x00b5c867, 0x05950122, 0x0040c496, 0x4d83976c, 0x63c45243, 0xee71b2fe, 0x090ec1fc, 0x005d36df, 0xfffb42b0, - 0xffe681c6, 0x00b74c37, 0x05c76fed, 0xff96db90, 0x4ed62be3, 0x62ea6474, 0xef8d4d7b, 0x08edfeaa, 0x006928a0, 0xfff91fca, - 0xffe66dd0, 0x00b8394b, 0x05f9c051, 0xfee723c6, 0x5024d70e, 0x6207f220, 0xf0a3959f, 0x08cb4e23, 0x007400b8, 0xfff681d6, - 0xffe66fac, 0x00b8fe0d, 0x062bf5ec, 0xfe310657, 0x516eefb9, 0x611d58a3, 0xf1b461ab, 0x08a75da4, 0x007e0393, 0xfff48700, - 0xffe69423, 0x00b8c6b0, 0x065dd56a, 0xfd7475d8, 0x52b449de, 0x602b0c7f, 0xf2bf6ea4, 0x0880ffdd, 0x00872c63, 0xfff294c3, - 0xffe6fed4, 0x00b85f70, 0x068f8b44, 0xfcb1d740, 0x53f495aa, 0x5f30ff5f, 0xf3c4e887, 0x08594887, 0x008f87aa, 0xfff0e7ef, - 0xffe75361, 0x00b73ab0, 0x06c0f0c0, 0xfbe8f5bd, 0x552f8ff7, 0x5e2f6367, 0xf4c473c6, 0x08303897, 0x0096dcc2, 0xffef2395, - 0xffe80414, 0x00b58c8c, 0x06f1825d, 0xfb19b7bd, 0x56654bdd, 0x5d26be9b, 0xf5be0fa9, 0x08061671, 0x009da526, 0xffedc418, - 0xffe85b4b, 0x00b36acd, 0x0721bf22, 0xfa44a069, 0x579505f5, 0x5c16d0ae, 0xf6b1f3c3, 0x07da2b7f, 0x00a3508f, 0xffec8409, - 0xffe954d0, 0x00b06b68, 0x075112a2, 0xf96916f5, 0x58befacd, 0x5b001db8, 0xf79fa13a, 0x07ad8c26, 0x00a85e94, 0xffeb3849, - 0xffea353a, 0x00acbd2f, 0x077fedb3, 0xf887507c, 0x59e2f69e, 0x59e2f69e, 0xf887507c, 0x077fedb3, 0x00acbd2f, 0xffea353a, - 0xffeb3849, 0x00a85e94, 0x07ad8c26, 0xf79fa13a, 0x5b001db8, 0x58befacd, 0xf96916f5, 0x075112a2, 0x00b06b68, 0xffe954d0, - 0xffec8409, 0x00a3508f, 0x07da2b7f, 0xf6b1f3c3, 0x5c16d0ae, 0x579505f5, 0xfa44a069, 0x0721bf22, 0x00b36acd, 0xffe85b4b, - 0xffedc418, 0x009da526, 0x08061671, 0xf5be0fa9, 0x5d26be9b, 0x56654bdd, 0xfb19b7bd, 0x06f1825d, 0x00b58c8c, 0xffe80414, - 0xffef2395, 0x0096dcc2, 0x08303897, 0xf4c473c6, 0x5e2f6367, 0x552f8ff7, 0xfbe8f5bd, 0x06c0f0c0, 0x00b73ab0, 0xffe75361, - 0xfff0e7ef, 0x008f87aa, 0x08594887, 0xf3c4e887, 0x5f30ff5f, 0x53f495aa, 0xfcb1d740, 0x068f8b44, 0x00b85f70, 0xffe6fed4, - 0xfff294c3, 0x00872c63, 0x0880ffdd, 0xf2bf6ea4, 0x602b0c7f, 0x52b449de, 0xfd7475d8, 0x065dd56a, 0x00b8c6b0, 0xffe69423, - 0xfff48700, 0x007e0393, 0x08a75da4, 0xf1b461ab, 0x611d58a3, 0x516eefb9, 0xfe310657, 0x062bf5ec, 0x00b8fe0d, 0xffe66fac, - 0xfff681d6, 0x007400b8, 0x08cb4e23, 0xf0a3959f, 0x6207f220, 0x5024d70e, 0xfee723c6, 0x05f9c051, 0x00b8394b, 0xffe66dd0, - 0xfff91fca, 0x006928a0, 0x08edfeaa, 0xef8d4d7b, 0x62ea6474, 0x4ed62be3, 0xff96db90, 0x05c76fed, 0x00b74c37, 0xffe681c6, - 0xfffb42b0, 0x005d36df, 0x090ec1fc, 0xee71b2fe, 0x63c45243, 0x4d83976c, 0x0040c496, 0x05950122, 0x00b5c867, 0xffe65416, - 0xfffdfa25, 0x00504f41, 0x092d7970, 0xed50a31d, 0x64964063, 0x4c2ca3df, 0x00e42fa2, 0x05626209, 0x00b3d15c, 0xffe6afee, - 0x00007134, 0x00426f36, 0x0949eaac, 0xec2a3f5f, 0x655f63f2, 0x4ad237a2, 0x01816e06, 0x05303f87, 0x00b1978d, 0xffe6d466, - 0x00039609, 0x0033b927, 0x0963ed46, 0xeafee7f1, 0x661fd6b8, 0x4973fef1, 0x02186a91, 0x04fe20be, 0x00af374c, 0xffe7746e, - 0x0006b1cf, 0x0023b989, 0x097c1ee8, 0xe9cea84a, 0x66d76725, 0x4812f848, 0x02a99097, 0x04cc2fcf, 0x00abe79e, 0xffe79e16, - 0x0009aa3f, 0x00131c75, 0x099140a7, 0xe89971b7, 0x6785c24d, 0x46aea856, 0x03343533, 0x049aa82f, 0x00a8739d, 0xffe83a07, - 0x000d31b5, 0x0000e790, 0x09a3e163, 0xe75f8bb8, 0x682b39a4, 0x4547daea, 0x03b8f8dc, 0x04694101, 0x00a520bb, 0xffe88ba8, - 0x0010bc63, 0xffee183b, 0x09b3d77f, 0xe620c476, 0x68c7269b, 0x43de620a, 0x0437fb0a, 0x043889c6, 0x00a1039c, 0xffe940f4, - 0x001471f8, 0xffda17f2, 0x09c0e59f, 0xe4de0cb0, 0x6959709d, 0x4272a385, 0x04b0adcb, 0x04083fec, 0x009d10bf, 0xffe9ca76, - 0x0018703f, 0xffc4e365, 0x09cab9f2, 0xe396a45d, 0x69e29784, 0x41058bc6, 0x05237f9d, 0x03d8afe6, 0x0098b855, 0xffea9192, - 0x001c3549, 0xffaea5d6, 0x09d19ca9, 0xe24b8f66, 0x6a619c5e, 0x3f962fb8, 0x0590a67d, 0x03a966bb, 0x009424c6, 0xffeb50b2, - 0x002064f8, 0xff975c01, 0x09d52709, 0xe0fc421e, 0x6ad73e8d, 0x3e25b17e, 0x05f7fb90, 0x037ad438, 0x008f4bfc, 0xffebe77b, - 0x0024dd50, 0xff7ee3f1, 0x09d5560b, 0xdfa93ab5, 0x6b42a864, 0x3cb41219, 0x06593912, 0x034d01f0, 0x008a7dd7, 0xffecc31b, - 0x00293718, 0xff6542d1, 0x09d1fa23, 0xde529086, 0x6ba4629f, 0x3b415115, 0x06b559c3, 0x03201116, 0x0085c217, 0xffed651d, - 0x002d8e42, 0xff4aabc8, 0x09caeb0f, 0xdcf898fb, 0x6bfbdd98, 0x39ce0477, 0x070bbf58, 0x02f3e48d, 0x00807994, 0xffee1650, - 0x00329ab6, 0xff2ef725, 0x09c018ce, 0xdb9b5b12, 0x6c492217, 0x385a49c4, 0x075ca90c, 0x02c89901, 0x007b3875, 0xffeedfa4, - 0x003745f9, 0xff120d70, 0x09b18a1d, 0xda3b176a, 0x6c8c4c7a, 0x36e69691, 0x07a8127d, 0x029e35b4, 0x0075fded, 0xffef7b8b, - 0x003c1fa4, 0xfef3f6ab, 0x099ec3dc, 0xd8d7f21f, 0x6cc59bab, 0x3572ec70, 0x07ee507c, 0x0274ba43, 0x0070c8a5, 0xffeff6ca, - 0x004103f4, 0xfed4bec3, 0x09881dc5, 0xd7722f04, 0x6cf4073e, 0x33ff670e, 0x082f552e, 0x024bf7a1, 0x006b47fa, 0xfff0065d, - 0x00465348, 0xfeb48d0d, 0x096d0e21, 0xd60a46e5, 0x6d18520e, 0x328cc6f0, 0x086b1eeb, 0x02244a24, 0x0065fde5, 0xffefc9b9, - 0x004b6c46, 0xfe933dc0, 0x094d7ec2, 0xd49fd55f, 0x6d32730f, 0x311af3a4, 0x08a24899, 0x01fd3ba0, 0x006090c4, 0xffed978a, - 0x0050b177, 0xfe70b8d1, 0x09299ead, 0xd3337b3d, 0x6d41d963, 0x2faa221c, 0x08d3e41b, 0x01d78bfc, 0x005b5371, 0xffede50f, + 0x00000000, 0x0055dba1, 0x01b2e41d, 0x09015651, 0x2e3a7532, 0x6d474e1d, 0xd1c58ace, 0x09015651, 0xfe4d1be3, 0x0055dba1, + 0xffede50e, 0x005b5371, 0x01d78bfc, 0x08d3e41b, 0x2faa221c, 0x6d41d963, 0xd3337b3d, 0x09299ead, 0xfe70b8d1, 0x0050b177, + 0xffed978a, 0x006090c4, 0x01fd3ba0, 0x08a24899, 0x311af3a4, 0x6d32730f, 0xd49fd55f, 0x094d7ec2, 0xfe933dc0, 0x004b6c46, + 0xffefc9b9, 0x0065fde5, 0x02244a24, 0x086b1eeb, 0x328cc6f0, 0x6d18520e, 0xd60a46e5, 0x096d0e21, 0xfeb48d0d, 0x00465348, + 0xfff0065d, 0x006b47fa, 0x024bf7a1, 0x082f552e, 0x33ff670e, 0x6cf4073e, 0xd7722f04, 0x09881dc5, 0xfed4bec3, 0x004103f4, + 0xffeff6ca, 0x0070c8a5, 0x0274ba43, 0x07ee507c, 0x3572ec70, 0x6cc59bab, 0xd8d7f21f, 0x099ec3dc, 0xfef3f6ab, 0x003c1fa4, + 0xffef7b8b, 0x0075fded, 0x029e35b4, 0x07a8127d, 0x36e69691, 0x6c8c4c7a, 0xda3b176a, 0x09b18a1d, 0xff120d70, 0x003745f9, + 0xffeedfa4, 0x007b3875, 0x02c89901, 0x075ca90c, 0x385a49c4, 0x6c492217, 0xdb9b5b12, 0x09c018ce, 0xff2ef725, 0x00329ab6, + 0xffee1650, 0x00807994, 0x02f3e48d, 0x070bbf58, 0x39ce0477, 0x6bfbdd98, 0xdcf898fb, 0x09caeb0f, 0xff4aabc8, 0x002d8e42, + 0xffed651d, 0x0085c217, 0x03201116, 0x06b559c3, 0x3b415115, 0x6ba4629f, 0xde529086, 0x09d1fa23, 0xff6542d1, 0x00293718, + 0xffecc31b, 0x008a7dd7, 0x034d01f0, 0x06593912, 0x3cb41219, 0x6b42a864, 0xdfa93ab5, 0x09d5560b, 0xff7ee3f1, 0x0024dd50, + 0xffebe77b, 0x008f4bfc, 0x037ad438, 0x05f7fb90, 0x3e25b17e, 0x6ad73e8d, 0xe0fc421e, 0x09d52709, 0xff975c01, 0x002064f8, + 0xffeb50b2, 0x009424c6, 0x03a966bb, 0x0590a67d, 0x3f962fb8, 0x6a619c5e, 0xe24b8f66, 0x09d19ca9, 0xffaea5d6, 0x001c3549, + 0xffea9192, 0x0098b855, 0x03d8afe6, 0x05237f9d, 0x41058bc6, 0x69e29784, 0xe396a45d, 0x09cab9f2, 0xffc4e365, 0x0018703f, + 0xffe9ca76, 0x009d10bf, 0x04083fec, 0x04b0adcb, 0x4272a385, 0x6959709d, 0xe4de0cb0, 0x09c0e59f, 0xffda17f2, 0x001471f8, + 0xffe940f4, 0x00a1039c, 0x043889c6, 0x0437fb0a, 0x43de620a, 0x68c7269b, 0xe620c476, 0x09b3d77f, 0xffee183b, 0x0010bc63, + 0xffe88ba8, 0x00a520bb, 0x04694101, 0x03b8f8dc, 0x4547daea, 0x682b39a4, 0xe75f8bb8, 0x09a3e163, 0x0000e790, 0x000d31b5, + 0xffe83a07, 0x00a8739d, 0x049aa82f, 0x03343533, 0x46aea856, 0x6785c24d, 0xe89971b7, 0x099140a7, 0x00131c75, 0x0009aa3f, + 0xffe79e16, 0x00abe79e, 0x04cc2fcf, 0x02a99097, 0x4812f848, 0x66d76725, 0xe9cea84a, 0x097c1ee8, 0x0023b989, 0x0006b1cf, + 0xffe7746e, 0x00af374c, 0x04fe20be, 0x02186a91, 0x4973fef1, 0x661fd6b8, 0xeafee7f1, 0x0963ed46, 0x0033b927, 0x00039609, + 0xffe6d466, 0x00b1978d, 0x05303f87, 0x01816e06, 0x4ad237a2, 0x655f63f2, 0xec2a3f5f, 0x0949eaac, 0x00426f36, 0x00007134, + 0xffe6afee, 0x00b3d15c, 0x05626209, 0x00e42fa2, 0x4c2ca3df, 0x64964063, 0xed50a31d, 0x092d7970, 0x00504f41, 0xfffdfa25, + 0xffe65416, 0x00b5c867, 0x05950122, 0x0040c496, 0x4d83976c, 0x63c45243, 0xee71b2fe, 0x090ec1fc, 0x005d36df, 0xfffb42b0, + 0xffe681c6, 0x00b74c37, 0x05c76fed, 0xff96db90, 0x4ed62be3, 0x62ea6474, 0xef8d4d7b, 0x08edfeaa, 0x006928a0, 0xfff91fca, + 0xffe66dd0, 0x00b8394b, 0x05f9c051, 0xfee723c6, 0x5024d70e, 0x6207f220, 0xf0a3959f, 0x08cb4e23, 0x007400b8, 0xfff681d6, + 0xffe66fac, 0x00b8fe0d, 0x062bf5ec, 0xfe310657, 0x516eefb9, 0x611d58a3, 0xf1b461ab, 0x08a75da4, 0x007e0393, 0xfff48700, + 0xffe69423, 0x00b8c6b0, 0x065dd56a, 0xfd7475d8, 0x52b449de, 0x602b0c7f, 0xf2bf6ea4, 0x0880ffdd, 0x00872c63, 0xfff294c3, + 0xffe6fed4, 0x00b85f70, 0x068f8b44, 0xfcb1d740, 0x53f495aa, 0x5f30ff5f, 0xf3c4e887, 0x08594887, 0x008f87aa, 0xfff0e7ef, + 0xffe75361, 0x00b73ab0, 0x06c0f0c0, 0xfbe8f5bd, 0x552f8ff7, 0x5e2f6367, 0xf4c473c6, 0x08303897, 0x0096dcc2, 0xffef2395, + 0xffe80414, 0x00b58c8c, 0x06f1825d, 0xfb19b7bd, 0x56654bdd, 0x5d26be9b, 0xf5be0fa9, 0x08061671, 0x009da526, 0xffedc418, + 0xffe85b4b, 0x00b36acd, 0x0721bf22, 0xfa44a069, 0x579505f5, 0x5c16d0ae, 0xf6b1f3c3, 0x07da2b7f, 0x00a3508f, 0xffec8409, + 0xffe954d0, 0x00b06b68, 0x075112a2, 0xf96916f5, 0x58befacd, 0x5b001db8, 0xf79fa13a, 0x07ad8c26, 0x00a85e94, 0xffeb3849, + 0xffea353a, 0x00acbd2f, 0x077fedb3, 0xf887507c, 0x59e2f69e, 0x59e2f69e, 0xf887507c, 0x077fedb3, 0x00acbd2f, 0xffea353a, + 0xffeb3849, 0x00a85e94, 0x07ad8c26, 0xf79fa13a, 0x5b001db8, 0x58befacd, 0xf96916f5, 0x075112a2, 0x00b06b68, 0xffe954d0, + 0xffec8409, 0x00a3508f, 0x07da2b7f, 0xf6b1f3c3, 0x5c16d0ae, 0x579505f5, 0xfa44a069, 0x0721bf22, 0x00b36acd, 0xffe85b4b, + 0xffedc418, 0x009da526, 0x08061671, 0xf5be0fa9, 0x5d26be9b, 0x56654bdd, 0xfb19b7bd, 0x06f1825d, 0x00b58c8c, 0xffe80414, + 0xffef2395, 0x0096dcc2, 0x08303897, 0xf4c473c6, 0x5e2f6367, 0x552f8ff7, 0xfbe8f5bd, 0x06c0f0c0, 0x00b73ab0, 0xffe75361, + 0xfff0e7ef, 0x008f87aa, 0x08594887, 0xf3c4e887, 0x5f30ff5f, 0x53f495aa, 0xfcb1d740, 0x068f8b44, 0x00b85f70, 0xffe6fed4, + 0xfff294c3, 0x00872c63, 0x0880ffdd, 0xf2bf6ea4, 0x602b0c7f, 0x52b449de, 0xfd7475d8, 0x065dd56a, 0x00b8c6b0, 0xffe69423, + 0xfff48700, 0x007e0393, 0x08a75da4, 0xf1b461ab, 0x611d58a3, 0x516eefb9, 0xfe310657, 0x062bf5ec, 0x00b8fe0d, 0xffe66fac, + 0xfff681d6, 0x007400b8, 0x08cb4e23, 0xf0a3959f, 0x6207f220, 0x5024d70e, 0xfee723c6, 0x05f9c051, 0x00b8394b, 0xffe66dd0, + 0xfff91fca, 0x006928a0, 0x08edfeaa, 0xef8d4d7b, 0x62ea6474, 0x4ed62be3, 0xff96db90, 0x05c76fed, 0x00b74c37, 0xffe681c6, + 0xfffb42b0, 0x005d36df, 0x090ec1fc, 0xee71b2fe, 0x63c45243, 0x4d83976c, 0x0040c496, 0x05950122, 0x00b5c867, 0xffe65416, + 0xfffdfa25, 0x00504f41, 0x092d7970, 0xed50a31d, 0x64964063, 0x4c2ca3df, 0x00e42fa2, 0x05626209, 0x00b3d15c, 0xffe6afee, + 0x00007134, 0x00426f36, 0x0949eaac, 0xec2a3f5f, 0x655f63f2, 0x4ad237a2, 0x01816e06, 0x05303f87, 0x00b1978d, 0xffe6d466, + 0x00039609, 0x0033b927, 0x0963ed46, 0xeafee7f1, 0x661fd6b8, 0x4973fef1, 0x02186a91, 0x04fe20be, 0x00af374c, 0xffe7746e, + 0x0006b1cf, 0x0023b989, 0x097c1ee8, 0xe9cea84a, 0x66d76725, 0x4812f848, 0x02a99097, 0x04cc2fcf, 0x00abe79e, 0xffe79e16, + 0x0009aa3f, 0x00131c75, 0x099140a7, 0xe89971b7, 0x6785c24d, 0x46aea856, 0x03343533, 0x049aa82f, 0x00a8739d, 0xffe83a07, + 0x000d31b5, 0x0000e790, 0x09a3e163, 0xe75f8bb8, 0x682b39a4, 0x4547daea, 0x03b8f8dc, 0x04694101, 0x00a520bb, 0xffe88ba8, + 0x0010bc63, 0xffee183b, 0x09b3d77f, 0xe620c476, 0x68c7269b, 0x43de620a, 0x0437fb0a, 0x043889c6, 0x00a1039c, 0xffe940f4, + 0x001471f8, 0xffda17f2, 0x09c0e59f, 0xe4de0cb0, 0x6959709d, 0x4272a385, 0x04b0adcb, 0x04083fec, 0x009d10bf, 0xffe9ca76, + 0x0018703f, 0xffc4e365, 0x09cab9f2, 0xe396a45d, 0x69e29784, 0x41058bc6, 0x05237f9d, 0x03d8afe6, 0x0098b855, 0xffea9192, + 0x001c3549, 0xffaea5d6, 0x09d19ca9, 0xe24b8f66, 0x6a619c5e, 0x3f962fb8, 0x0590a67d, 0x03a966bb, 0x009424c6, 0xffeb50b2, + 0x002064f8, 0xff975c01, 0x09d52709, 0xe0fc421e, 0x6ad73e8d, 0x3e25b17e, 0x05f7fb90, 0x037ad438, 0x008f4bfc, 0xffebe77b, + 0x0024dd50, 0xff7ee3f1, 0x09d5560b, 0xdfa93ab5, 0x6b42a864, 0x3cb41219, 0x06593912, 0x034d01f0, 0x008a7dd7, 0xffecc31b, + 0x00293718, 0xff6542d1, 0x09d1fa23, 0xde529086, 0x6ba4629f, 0x3b415115, 0x06b559c3, 0x03201116, 0x0085c217, 0xffed651d, + 0x002d8e42, 0xff4aabc8, 0x09caeb0f, 0xdcf898fb, 0x6bfbdd98, 0x39ce0477, 0x070bbf58, 0x02f3e48d, 0x00807994, 0xffee1650, + 0x00329ab6, 0xff2ef725, 0x09c018ce, 0xdb9b5b12, 0x6c492217, 0x385a49c4, 0x075ca90c, 0x02c89901, 0x007b3875, 0xffeedfa4, + 0x003745f9, 0xff120d70, 0x09b18a1d, 0xda3b176a, 0x6c8c4c7a, 0x36e69691, 0x07a8127d, 0x029e35b4, 0x0075fded, 0xffef7b8b, + 0x003c1fa4, 0xfef3f6ab, 0x099ec3dc, 0xd8d7f21f, 0x6cc59bab, 0x3572ec70, 0x07ee507c, 0x0274ba43, 0x0070c8a5, 0xffeff6ca, + 0x004103f4, 0xfed4bec3, 0x09881dc5, 0xd7722f04, 0x6cf4073e, 0x33ff670e, 0x082f552e, 0x024bf7a1, 0x006b47fa, 0xfff0065d, + 0x00465348, 0xfeb48d0d, 0x096d0e21, 0xd60a46e5, 0x6d18520e, 0x328cc6f0, 0x086b1eeb, 0x02244a24, 0x0065fde5, 0xffefc9b9, + 0x004b6c46, 0xfe933dc0, 0x094d7ec2, 0xd49fd55f, 0x6d32730f, 0x311af3a4, 0x08a24899, 0x01fd3ba0, 0x006090c4, 0xffed978a, + 0x0050b177, 0xfe70b8d1, 0x09299ead, 0xd3337b3d, 0x6d41d963, 0x2faa221c, 0x08d3e41b, 0x01d78bfc, 0x005b5371, 0xffede50f, }; /* noise table 4.A.88, format = Q31 */ -const int noiseTab[512*2] PROGMEM = { - 0x8010fd38, 0xb3dc7948, 0x7c4e2301, 0xa9904192, 0x121622a7, 0x86489625, 0xc3d53d25, 0xd0343fa9, - 0x674d6f70, 0x25f4e9fd, 0xce1a8c8b, 0x72a726c5, 0xfea6efc6, 0xaa4adb1a, 0x8b2dd628, 0xf14029e4, - 0x46321c1a, 0x604889a0, 0x33363b63, 0x815ed069, 0x802b4315, 0x8f2bf7f3, 0x85b86073, 0x745cfb46, - 0xc57886b3, 0xb76731f0, 0xa2a66772, 0x828ca631, 0x60cc145e, 0x1ad1010f, 0x090c83d4, 0x9bd7ba87, - 0x5f5aeea2, 0x8b4dbd99, 0x848e7b1e, 0x86bb9fa2, 0x26f18ae5, 0xc0b81194, 0x553407bf, 0x52c17953, - 0x755f468d, 0x166b04f8, 0xa5687981, 0x4343248b, 0xa6558d5e, 0xc5f6fab7, 0x80a4fb8c, 0x8cb53cb7, - 0x7da68a54, 0x9cd8df8a, 0xba05376c, 0xfcb58ee2, 0xfdd657a4, 0x005e35ca, 0x91c75c55, 0x367651e6, - 0x816abf85, 0x8f831c4f, 0x423f9c9c, 0x55aa919e, 0x80779834, 0xb59f4244, 0x800a095c, 0x7de9e0cc, - 0x46bda5cb, 0x4c184464, 0x2c438f71, 0x797216b5, 0x5035cee6, 0xa0c3a26e, 0x9d3f95fa, 0xd4a100c0, - 0x8ac30dac, 0x04b87397, 0x9e5ac516, 0x8b0b442e, 0x66210ad6, 0x88ba7598, 0x45b9bd33, 0xf0be5087, - 0x9261b85e, 0x364f6a31, 0x891c4b50, 0x23ad08ce, 0xf10366a6, 0x80414276, 0x1b562e06, 0x8be21591, - 0x9e798195, 0x7fb4045c, 0x7d9506cf, 0x854e691f, 0x9207f092, 0x7a94c9d5, 0x88911536, 0x3f45cc61, - 0x27059279, 0xa5b57109, 0x6d2bb67b, 0x3bdc5379, 0x74e662d8, 0x80348f8c, 0xf875e638, 0x5a8caea1, - 0x2459ae75, 0x2c54b939, 0x79ee3203, 0xb9bc8683, 0x9b6f630c, 0x9f45b351, 0x8563b2b9, 0xe5dbba41, - 0x697c7d0d, 0x7bb7c90e, 0xac900866, 0x8e6b5177, 0x8822dd37, 0x7fd5a91e, 0x7506da05, 0x82302aca, - 0xa5e4be04, 0x4b4288eb, 0x00b8bc9f, 0x4f1033e4, 0x7200d612, 0x43900c8c, 0xa815b900, 0x676ed1d4, - 0x5c5f23b2, 0xa758ee11, 0xaf73abfa, 0x11714ec0, 0x265239e0, 0xc50de679, 0x8a84e341, 0xa1438354, - 0x7f1a341f, 0x343ec96b, 0x696e71b0, 0xa13bde39, 0x81e75094, 0x80091111, 0x853a73bf, 0x80f9c1ee, - 0xe4980086, 0x886a8e28, 0xa7e89426, 0xdd93edd7, 0x7592100d, 0x0bfa8123, 0x850a26d4, 0x2e34f395, - 0x421b6c00, 0xa4a462e4, 0x4e3f5090, 0x3c189f4c, 0x3c971a56, 0xdd0376d2, 0x747a5367, 0x7bcbc9d7, - 0x3966be6a, 0x7efda616, 0x55445e15, 0x7ba2ab3f, 0x5fe684f2, 0x8cf42af9, 0x808c61c3, 0x4390c27b, - 0x7cac62ff, 0xea6cab22, 0x5d0902ad, 0xc27b7208, 0x7a27389d, 0x5820a357, 0xa29bbe59, 0x9df0f1fd, - 0x92bd67e5, 0x7195b587, 0x97cac65b, 0x8339807e, 0x8f72d832, 0x5fad8685, 0xa462d9d3, 0x81d46214, - 0x6ae93e1d, 0x6b23a5b9, 0xc2732874, 0x81795268, 0x7c568cb6, 0x668513ea, 0x428d024e, 0x66b78b3a, - 0xfee9ef03, 0x9ddcbb82, 0xa605f07e, 0x46dc55e0, 0x85415054, 0xc89ec271, 0x7c42edfb, 0x0befe59b, - 0x89b8f607, 0x6d732a1a, 0xa7081ebd, 0x7e403258, 0x21feeb7b, 0x5dd7a1e7, 0x23e3a31a, 0x129bc896, - 0xa11a6b54, 0x7f1e031c, 0xfdc1a4d1, 0x96402e53, 0xb9700f1a, 0x8168ecd6, 0x7d63d3cc, 0x87a70d65, - 0x81075a7a, 0x55c8caa7, 0xa95d00b5, 0x102b1652, 0x0bb30215, 0xe5b63237, 0xa446ca44, 0x82d4c333, - 0x67b2e094, 0x44c3d661, 0x33fd6036, 0xde1ea2a1, 0xa95e8e47, 0x78f66eb9, 0x6f2aef1e, 0xe8887247, - 0x80a3b70e, 0xfca0d9d3, 0x6bf0fd20, 0x0d5226de, 0xf4341c87, 0x5902df05, 0x7ff1a38d, 0xf02e5a5b, - 0x99f129af, 0x8ac63d01, 0x7b53f599, 0x7bb32532, 0x99ac59b0, 0x5255a80f, 0xf1320a41, 0x2497aa5c, - 0xcce60bd8, 0x787c634b, 0x7ed58c5b, 0x8a28eb3a, 0x24a5e647, 0x8b79a2c1, 0x955f5ce5, 0xa9d12bc4, - 0x7a1e20c6, 0x3eeda7ac, 0xf7be823a, 0x042924ce, 0x808b3f03, 0x364248da, 0xac2895e5, 0x69a8b5fa, - 0x97fe8b63, 0xbdeac9aa, 0x8073e0ad, 0x6c25dba7, 0x005e51d2, 0x52e74389, 0x59d3988c, 0xe5d1f39c, - 0x7b57dc91, 0x341adbe7, 0xa7d42b8d, 0x74e9f335, 0xd35bf7d8, 0x5b7c0a4b, 0x75bc0874, 0x552129bf, - 0x8144b70d, 0x6de93bbb, 0x5825f14b, 0x473ec5ca, 0x80a8f37c, 0xe6552d69, 0x7898360b, 0x806379b0, - 0xa9b59339, 0x3f6bf60c, 0xc367d731, 0x920ade99, 0x125592f7, 0x877e5ed1, 0xda895d95, 0x075f2ece, - 0x380e5f5e, 0x9b006b62, 0xd17a6dd2, 0x530a0e13, 0xf4cc9a14, 0x7d0a0ed4, 0x847c6e3f, 0xbaee4975, - 0x47131163, 0x64fb2cac, 0x5e2100a6, 0x7b756a42, 0xd87609f4, 0x98bfe48c, 0x0493745e, 0x836c5784, - 0x7e5ccb40, 0x3df6b476, 0x97700d28, 0x8bbd93fd, 0x56de9cdb, 0x680b4e65, 0xebc3d90e, 0x6d286793, - 0x6753712e, 0xe05c98a7, 0x3d2b6b85, 0xc4b18ddb, 0x7b59b869, 0x31435688, 0x811888e9, 0xe011ee7a, - 0x6a5844f9, 0x86ae35ea, 0xb4cbc10b, 0x01a6f5d6, 0x7a49ed64, 0x927caa49, 0x847ddaed, 0xae0d9bb6, - 0x836bdb04, 0x0fd810a6, 0x74fe126b, 0x4a346b5f, 0x80184d36, 0x5afd153c, 0x90cc8102, 0xe606d0e6, - 0xde69aa58, 0xa89f1222, 0xe06df715, 0x8fd16144, 0x0317c3e8, 0x22ce92fc, 0x690c3eca, 0x93166f02, - 0x71573414, 0x8d43cffb, 0xe8bd0bb6, 0xde86770f, 0x0bf99a41, 0x4633a661, 0xba064108, 0x7adafae3, - 0x2f6cde5d, 0xb350a52c, 0xa5ebfb0b, 0x74c57b46, 0xd3b603b5, 0x80b70892, 0xa7f7fa53, 0xd94b566c, - 0xdda3fd86, 0x6a635793, 0x3ed005ca, 0xc5f087d8, 0x31e3a746, 0x7a4278f9, 0x82def1f9, 0x06caa2b2, - 0xe9d2c349, 0x8940e7f7, 0x7feef8dd, 0x4a9b01f0, 0xacde69f8, 0x57ddc280, 0xf09e4ba4, 0xb6d9f729, - 0xb48c18f2, 0xd3654aa9, 0xca7a03c8, 0x14d57545, 0x7fda87a5, 0x0e411366, 0xb77d0df0, 0x8c2aa467, - 0x787f2590, 0x2d292db1, 0x9f12682c, 0x44ac364d, 0x1a4b31a6, 0x871f7ded, 0x7ff99167, 0x6630a1d5, - 0x25385eb9, 0x2d4dd549, 0xaf8a7004, 0x319ebe0f, 0x379ab730, 0x81dc56a4, 0x822d8523, 0x1ae8554c, - 0x18fa0786, 0x875f7de4, 0x85ca350f, 0x7de818dc, 0x7786a38f, 0xa5456355, 0x92e60f88, 0xf5526122, - 0x916039bc, 0xc561e2de, 0x31c42042, 0x7c82e290, 0x75d158b2, 0xb015bda1, 0x7220c750, 0x46565441, - 0xd0da1fdd, 0x7b777481, 0x782e73c6, 0x8cd72b7b, 0x7f1006aa, 0xfb30e51e, 0x87994818, 0x34e7c7db, - 0x7faae06b, 0xea74fbc0, 0xd20c7af4, 0xc44f396b, 0x06b4234e, 0xdf2e2a93, 0x2efb07c8, 0xce861911, - 0x7550ea05, 0xd8d90bbb, 0x58522eec, 0x746b3520, 0xce844ce9, 0x7f5cacc3, 0xda8f17e0, 0x2fedf9cb, - 0xb2f77ec4, 0x6f13f4c0, 0x834de085, 0x7b7ace4b, 0x713b16ac, 0x499c5ab0, 0x06a7961d, 0x1b39a48a, - 0xbb853e6e, 0x7c781cc1, 0xc0baebf5, 0x7dace394, 0x815ceebc, 0xcc7b27d4, 0x8274b181, 0xa2be40a2, - 0xdd01d5dc, 0x7fefeb14, 0x0813ec78, 0xba3077cc, 0xe5cf1e1c, 0xedcfacae, 0x54c43a9b, 0x5cd62a42, - 0x93806b55, 0x03095c5b, 0x8e076ae3, 0x71bfcd2a, 0x7ac1989b, 0x623bc71a, 0x5e15d4d2, 0xfb341dd1, - 0xd75dfbca, 0xd0da32be, 0xd4569063, 0x337869da, 0x3d30606a, 0xcd89cca2, 0x7dd2ae36, 0x028c03cd, - 0xd85e052c, 0xe8dc9ec5, 0x7ffd9241, 0xde5bf4c6, 0x88c4b235, 0x8228be2e, 0x7fe6ec64, 0x996abe6a, - 0xdeb0666d, 0x9eb86611, 0xd249b922, 0x18b3e26b, 0x80211168, 0x5f8bb99c, 0x6ecb0dd2, 0x4728ff8d, - 0x2ac325b8, 0x6e5169d2, 0x7ebbd68d, 0x05e41d17, 0xaaa19f28, 0x8ab238a6, 0x51f105be, 0x140809cc, - 0x7f7345d9, 0x3aae5a9d, 0xaecec6e4, 0x1afb3473, 0xf6229ed1, 0x8d55f467, 0x7e32003a, 0x70f30c14, - 0x6686f33f, 0xd0d45ed8, 0x644fab57, 0x3a3fbbd3, 0x0b255fc4, 0x679a1701, 0x90e17b6e, 0x325d537b, - 0xcd7b9b87, 0xaa7be2a2, 0x7d47c966, 0xa33dbce5, 0x8659c3bb, 0x72a41367, 0x15c446e0, 0x45fe8b0a, - 0x9d8ddf26, 0x84d47643, 0x7fabe0da, 0x36a70122, 0x7a28ebfe, 0x7c29b8b8, 0x7f760406, 0xbabe4672, - 0x23ea216e, 0x92bcc50a, 0x6d20dba2, 0xad5a7c7e, 0xbf3897f5, 0xabb793e1, 0x8391fc7e, 0xe270291c, - 0x7a248d58, 0x80f8fd15, 0x83ef19f3, 0x5e6ece7d, 0x278430c1, 0x35239f4d, 0xe09c073b, 0x50e78cb5, - 0xd4b811bd, 0xce834ee0, 0xf88aaa34, 0xf71da5a9, 0xe2b0a1d5, 0x7c3aef31, 0xe84eabca, 0x3ce25964, - 0xf29336d3, 0x8fa78b2c, 0xa3fc3415, 0x63e1313d, 0x7fbc74e0, 0x7340bc93, 0x49ae583b, 0x8b79de4b, - 0x25011ce9, 0x7b462279, 0x36007db0, 0x3da1599c, 0x77780772, 0xc845c9bb, 0x83ba68be, 0x6ee507d1, - 0x2f0159b8, 0x5392c4ed, 0x98336ff6, 0x0b3c7f11, 0xde697aac, 0x893fc8d0, 0x6b83f8f3, 0x47799a0d, - 0x801d9dfc, 0x8516a83e, 0x5f8d22ec, 0x0f8ba384, 0xa049dc4b, 0xdd920b05, 0x7a99bc9f, 0x9ad19344, - 0x7a345dba, 0xf501a13f, 0x3e58bf19, 0x7fffaf9a, 0x3b4e1511, 0x0e08b991, 0x9e157620, 0x7230a326, - 0x4977f9ff, 0x2d2bbae1, 0x607aa7fc, 0x7bc85d5f, 0xb441bbbe, 0x8d8fa5f2, 0x601cce26, 0xda1884f2, - 0x81c82d64, 0x200b709c, 0xcbd36abe, 0x8cbdddd3, 0x55ab61d3, 0x7e3ee993, 0x833f18aa, 0xffc1aaea, - 0x7362e16a, 0x7fb85db2, 0x904ee04c, 0x7f04dca6, 0x8ad7a046, 0xebe7d8f7, 0xfbc4c687, 0xd0609458, - 0x093ed977, 0x8e546085, 0x7f5b8236, 0x7c47e118, 0xa01f2641, 0x7ffb3e48, 0x05de7cda, 0x7fc281b9, - 0x8e0278fc, 0xd74e6d07, 0x94c24450, 0x7cf9e641, 0x2ad27871, 0x919fa815, 0x805fd205, 0x7758397f, - 0xe2c7e02c, 0x1828e194, 0x5613d6fe, 0xfb55359f, 0xf9699516, 0x8978ee26, 0x7feebad9, 0x77d71d82, - 0x55b28b60, 0x7e997600, 0x80821a6b, 0xc6d78af1, 0x691822ab, 0x7f6982a0, 0x7ef56f99, 0x5c307f40, - 0xac6f8b76, 0x42cc8ba4, 0x782c61d9, 0xa0224dd0, 0x7bd234d1, 0x74576e3b, 0xe38cfe9a, 0x491e66ef, - 0xc78291c5, 0x895bb87f, 0x924f7889, 0x71b89394, 0x757b779d, 0xc4a9c604, 0x5cdf7829, 0x8020e9df, - 0x805e8245, 0x4a82c398, 0x6360bd62, 0x78bb60fc, 0x09e0d014, 0x4b0ea180, 0xb841978b, 0x69a0e864, - 0x7df35977, 0x3284b0dd, 0x3cdc2efd, 0x57d31f5e, 0x541069cc, 0x1776e92e, 0x04309ea3, 0xa015eb2d, - 0xce7bfabc, 0x41b638f8, 0x8365932e, 0x846ab44c, 0xbbcc80cb, 0x8afa6cac, 0x7fc422ea, 0x4e403fc0, - 0xbfac9aee, 0x8e4c6709, 0x028e01fb, 0x6d160a9b, 0x7fe93004, 0x790f9cdc, 0x6a1f37a0, 0xf7e7ef30, - 0xb4ea0f04, 0x7bf4c8e6, 0xe981701f, 0xc258a9d3, 0x6acbbfba, 0xef5479c7, 0x079c8bd8, 0x1a410f56, - 0x6853b799, 0x86cd4f01, 0xc66e23b6, 0x34585565, 0x8d1fe00d, 0x7fcdba1a, 0x32c9717b, 0xa02f9f48, - 0xf64940db, 0x5ed7d8f1, 0x61b823b2, 0x356f8918, 0xa0a7151e, 0x793fc969, 0x530beaeb, 0x34e93270, - 0x4fc4ddb5, 0x88d58b6c, 0x36094774, 0xf620ac80, 0x03763a72, 0xf910c9a6, 0x6666fb2d, 0x752c8be8, - 0x9a6dfdd8, 0xd1a7117d, 0x51c1b1d4, 0x0a67773d, 0x43b32a79, 0x4cdcd085, 0x5f067d30, 0x05bfe92a, - 0x7ed7d203, 0xe71a3c85, 0x99127ce2, 0x8eb3cac4, 0xad4bbcea, 0x5c6a0fd0, 0x0eec04af, 0x94e95cd4, - 0x8654f921, 0x83eabb5d, 0xb058d7ca, 0x69f12d3c, 0x03d881b2, 0x80558ef7, 0x82938cb3, 0x2ec0e1d6, - 0x80044422, 0xd1e47051, 0x720fc6ff, 0x82b20316, 0x0d527b02, 0x63049a15, 0x7ad5b9ad, 0xd2a4641d, - 0x41144f86, 0x7b04917a, 0x15c4a2c0, 0x9da07916, 0x211df54a, 0x7fdd09af, 0xfe924f3f, 0x7e132cfe, - 0x9a1d18d6, 0x7c56508b, 0x80f0f0af, 0x8095ced6, 0x8037d0d7, 0x026719d1, 0xa55fec43, 0x2b1c7cb7, - 0xa5cd5ac1, 0x77639fad, 0x7fcd8b62, 0x81a18c27, 0xaee4912e, 0xeae9eebe, 0xeb3081de, 0x8532aada, - 0xc822362e, 0x86a649a9, 0x8031a71d, 0x7b319dc6, 0xea8022e6, 0x814bc5a9, 0x8f62f7a1, 0xa430ea17, - 0x388deafb, 0x883b5185, 0x776fe13c, 0x801c683f, 0x87c11b98, 0xb7cbc644, 0x8e9ad3e8, 0x3cf5a10c, - 0x7ff6a634, 0x949ef096, 0x9f84aa7c, 0x010af13f, 0x782d1de8, 0xf18e492a, 0x6cf63b01, 0x4301cd81, - 0x32d15c9e, 0x68ad8cef, 0xd09bd2d6, 0x908c5c15, 0xd1e36260, 0x2c5bfdd0, 0x88765a99, 0x93deba1e, - 0xac6ae342, 0xe865b84c, 0x0f4f2847, 0x7fdf0499, 0x78b1c9b3, 0x6a73261e, 0x601a96f6, 0xd2847933, - 0x489aa888, 0xe12e8093, 0x3bfa5a5f, 0xd96ba5f7, 0x7c8f4c8d, 0x80940c6f, 0xcef9dd1a, 0x7e1a055f, - 0x3483558b, 0x02b59cc4, 0x0c56333e, 0x05a5b813, 0x92d66287, 0x7516b679, 0x71bfe03f, 0x8056bf68, - 0xc24d0724, 0x8416bcf3, 0x234afbdb, 0x4b0d6f9c, 0xaba97333, 0x4b4f42b6, 0x7e8343ab, 0x7ffe2603, - 0xe590f73c, 0x45e10c76, 0xb07a6a78, 0xb35609d3, 0x1a027dfd, 0x90cb6e20, 0x82d3fe38, 0x7b409257, - 0x0e395afa, 0x1b802093, 0xcb0c6c59, 0x241e17e7, 0x1ee3ea0a, 0x41a82302, 0xab04350a, 0xf570beb7, - 0xbb444b9b, 0x83021459, 0x838d65dc, 0x1c439c84, 0x6fdcc454, 0xef9ef325, 0x18626c1c, 0x020d251f, - 0xc4aae786, 0x8614cb48, 0xf6f53ca6, 0x8710dbab, 0x89abec0d, 0xf29d41c1, 0x94b50336, 0xfdd49178, - 0x604658d1, 0x800e85be, 0xca1bb079, 0x7fa48eeb, 0xa3b7fafe, 0xd330436b, 0x64eb604c, 0x43a658ae, - 0x7caa1337, 0xddd445e6, 0x7efbf955, 0xb706ec71, 0x624a6b53, 0x9e0e231f, 0x97097248, 0xa1e1a17a, - 0x68dd2e44, 0x7f9d2e14, 0xddcc7074, 0x58324197, 0xc88fc426, 0x6d3640ae, 0x7ef83600, 0x759a0270, - 0x98b6d854, 0xd63c9b84, 0x372474a2, 0xe3f18cfd, 0x56ab0bdb, 0x85c9be7e, 0x47dfcfeb, 0xa5830d41, - 0x0ddd6283, 0xf4f480ad, 0x74c60e38, 0xab8943c3, 0xc1508fe7, 0x480cdc39, 0x8e097362, 0xa44793be, - 0x538b7e18, 0x545f5b41, 0x56529175, 0x9771a97e, 0xc2da7421, 0xea8265f2, 0x805d1163, 0x883c5d28, - 0x8ba94c48, 0x4f676e65, 0xf78735b3, 0xe1853671, 0x7f454f53, 0x18147f85, 0x7d09e15d, 0xdb4f3494, - 0x795c8973, 0x83310632, 0x85d8061c, 0x9a1a0ebf, 0xc125583c, 0x2a1b1a95, 0x7fd9103f, 0x71e98c72, - 0x40932ed7, 0x91ed227a, 0x3c5e560e, 0xe816dee9, 0xb0891b80, 0x600038ba, 0xc7d9a80d, 0x7fff5e09, - 0x7e3f4351, 0xbb6b4424, 0xb14448d4, 0x8d6bb7e1, 0xfb153626, 0xa68ad537, 0xd9782006, 0xf62f6991, - 0x359ba8c1, 0x02ccff0b, 0x91bf2256, 0x7ea71c4d, 0x560ce5df, 0xeeba289b, 0xa574c4e7, 0x9e04f6ee, - 0x7860a5ec, 0x0b8db4a2, 0x968ba3d7, 0x0b6c77df, 0xd6f3157d, 0x402eff1a, 0x49b820b3, 0x8152aebb, - 0xd180b0b6, 0x098604d4, 0x7ff92224, 0xede9c996, 0x89c58061, 0x829624c4, 0xc6e71ea7, 0xba94d915, - 0x389c3cf6, 0x5b4c5a06, 0x04b335e6, 0x516a8aab, 0x42c8d7d9, 0x92b12af6, 0x86c8549f, 0xfda98acf, - 0x819673b6, 0x69545dac, 0x6feaa230, 0x726e6d3f, 0x886ebdfe, 0x34f5730a, 0x7af63ba2, 0x77307bbf, - 0x7cd80630, 0x6e45efe0, 0x7f8ad7eb, 0x59d7df99, 0x86c70946, 0xda233629, 0x753f6cbf, 0x825eeb40, +const int noiseTab[512 * 2] PROGMEM = { + 0x8010fd38, 0xb3dc7948, 0x7c4e2301, 0xa9904192, 0x121622a7, 0x86489625, 0xc3d53d25, 0xd0343fa9, + 0x674d6f70, 0x25f4e9fd, 0xce1a8c8b, 0x72a726c5, 0xfea6efc6, 0xaa4adb1a, 0x8b2dd628, 0xf14029e4, + 0x46321c1a, 0x604889a0, 0x33363b63, 0x815ed069, 0x802b4315, 0x8f2bf7f3, 0x85b86073, 0x745cfb46, + 0xc57886b3, 0xb76731f0, 0xa2a66772, 0x828ca631, 0x60cc145e, 0x1ad1010f, 0x090c83d4, 0x9bd7ba87, + 0x5f5aeea2, 0x8b4dbd99, 0x848e7b1e, 0x86bb9fa2, 0x26f18ae5, 0xc0b81194, 0x553407bf, 0x52c17953, + 0x755f468d, 0x166b04f8, 0xa5687981, 0x4343248b, 0xa6558d5e, 0xc5f6fab7, 0x80a4fb8c, 0x8cb53cb7, + 0x7da68a54, 0x9cd8df8a, 0xba05376c, 0xfcb58ee2, 0xfdd657a4, 0x005e35ca, 0x91c75c55, 0x367651e6, + 0x816abf85, 0x8f831c4f, 0x423f9c9c, 0x55aa919e, 0x80779834, 0xb59f4244, 0x800a095c, 0x7de9e0cc, + 0x46bda5cb, 0x4c184464, 0x2c438f71, 0x797216b5, 0x5035cee6, 0xa0c3a26e, 0x9d3f95fa, 0xd4a100c0, + 0x8ac30dac, 0x04b87397, 0x9e5ac516, 0x8b0b442e, 0x66210ad6, 0x88ba7598, 0x45b9bd33, 0xf0be5087, + 0x9261b85e, 0x364f6a31, 0x891c4b50, 0x23ad08ce, 0xf10366a6, 0x80414276, 0x1b562e06, 0x8be21591, + 0x9e798195, 0x7fb4045c, 0x7d9506cf, 0x854e691f, 0x9207f092, 0x7a94c9d5, 0x88911536, 0x3f45cc61, + 0x27059279, 0xa5b57109, 0x6d2bb67b, 0x3bdc5379, 0x74e662d8, 0x80348f8c, 0xf875e638, 0x5a8caea1, + 0x2459ae75, 0x2c54b939, 0x79ee3203, 0xb9bc8683, 0x9b6f630c, 0x9f45b351, 0x8563b2b9, 0xe5dbba41, + 0x697c7d0d, 0x7bb7c90e, 0xac900866, 0x8e6b5177, 0x8822dd37, 0x7fd5a91e, 0x7506da05, 0x82302aca, + 0xa5e4be04, 0x4b4288eb, 0x00b8bc9f, 0x4f1033e4, 0x7200d612, 0x43900c8c, 0xa815b900, 0x676ed1d4, + 0x5c5f23b2, 0xa758ee11, 0xaf73abfa, 0x11714ec0, 0x265239e0, 0xc50de679, 0x8a84e341, 0xa1438354, + 0x7f1a341f, 0x343ec96b, 0x696e71b0, 0xa13bde39, 0x81e75094, 0x80091111, 0x853a73bf, 0x80f9c1ee, + 0xe4980086, 0x886a8e28, 0xa7e89426, 0xdd93edd7, 0x7592100d, 0x0bfa8123, 0x850a26d4, 0x2e34f395, + 0x421b6c00, 0xa4a462e4, 0x4e3f5090, 0x3c189f4c, 0x3c971a56, 0xdd0376d2, 0x747a5367, 0x7bcbc9d7, + 0x3966be6a, 0x7efda616, 0x55445e15, 0x7ba2ab3f, 0x5fe684f2, 0x8cf42af9, 0x808c61c3, 0x4390c27b, + 0x7cac62ff, 0xea6cab22, 0x5d0902ad, 0xc27b7208, 0x7a27389d, 0x5820a357, 0xa29bbe59, 0x9df0f1fd, + 0x92bd67e5, 0x7195b587, 0x97cac65b, 0x8339807e, 0x8f72d832, 0x5fad8685, 0xa462d9d3, 0x81d46214, + 0x6ae93e1d, 0x6b23a5b9, 0xc2732874, 0x81795268, 0x7c568cb6, 0x668513ea, 0x428d024e, 0x66b78b3a, + 0xfee9ef03, 0x9ddcbb82, 0xa605f07e, 0x46dc55e0, 0x85415054, 0xc89ec271, 0x7c42edfb, 0x0befe59b, + 0x89b8f607, 0x6d732a1a, 0xa7081ebd, 0x7e403258, 0x21feeb7b, 0x5dd7a1e7, 0x23e3a31a, 0x129bc896, + 0xa11a6b54, 0x7f1e031c, 0xfdc1a4d1, 0x96402e53, 0xb9700f1a, 0x8168ecd6, 0x7d63d3cc, 0x87a70d65, + 0x81075a7a, 0x55c8caa7, 0xa95d00b5, 0x102b1652, 0x0bb30215, 0xe5b63237, 0xa446ca44, 0x82d4c333, + 0x67b2e094, 0x44c3d661, 0x33fd6036, 0xde1ea2a1, 0xa95e8e47, 0x78f66eb9, 0x6f2aef1e, 0xe8887247, + 0x80a3b70e, 0xfca0d9d3, 0x6bf0fd20, 0x0d5226de, 0xf4341c87, 0x5902df05, 0x7ff1a38d, 0xf02e5a5b, + 0x99f129af, 0x8ac63d01, 0x7b53f599, 0x7bb32532, 0x99ac59b0, 0x5255a80f, 0xf1320a41, 0x2497aa5c, + 0xcce60bd8, 0x787c634b, 0x7ed58c5b, 0x8a28eb3a, 0x24a5e647, 0x8b79a2c1, 0x955f5ce5, 0xa9d12bc4, + 0x7a1e20c6, 0x3eeda7ac, 0xf7be823a, 0x042924ce, 0x808b3f03, 0x364248da, 0xac2895e5, 0x69a8b5fa, + 0x97fe8b63, 0xbdeac9aa, 0x8073e0ad, 0x6c25dba7, 0x005e51d2, 0x52e74389, 0x59d3988c, 0xe5d1f39c, + 0x7b57dc91, 0x341adbe7, 0xa7d42b8d, 0x74e9f335, 0xd35bf7d8, 0x5b7c0a4b, 0x75bc0874, 0x552129bf, + 0x8144b70d, 0x6de93bbb, 0x5825f14b, 0x473ec5ca, 0x80a8f37c, 0xe6552d69, 0x7898360b, 0x806379b0, + 0xa9b59339, 0x3f6bf60c, 0xc367d731, 0x920ade99, 0x125592f7, 0x877e5ed1, 0xda895d95, 0x075f2ece, + 0x380e5f5e, 0x9b006b62, 0xd17a6dd2, 0x530a0e13, 0xf4cc9a14, 0x7d0a0ed4, 0x847c6e3f, 0xbaee4975, + 0x47131163, 0x64fb2cac, 0x5e2100a6, 0x7b756a42, 0xd87609f4, 0x98bfe48c, 0x0493745e, 0x836c5784, + 0x7e5ccb40, 0x3df6b476, 0x97700d28, 0x8bbd93fd, 0x56de9cdb, 0x680b4e65, 0xebc3d90e, 0x6d286793, + 0x6753712e, 0xe05c98a7, 0x3d2b6b85, 0xc4b18ddb, 0x7b59b869, 0x31435688, 0x811888e9, 0xe011ee7a, + 0x6a5844f9, 0x86ae35ea, 0xb4cbc10b, 0x01a6f5d6, 0x7a49ed64, 0x927caa49, 0x847ddaed, 0xae0d9bb6, + 0x836bdb04, 0x0fd810a6, 0x74fe126b, 0x4a346b5f, 0x80184d36, 0x5afd153c, 0x90cc8102, 0xe606d0e6, + 0xde69aa58, 0xa89f1222, 0xe06df715, 0x8fd16144, 0x0317c3e8, 0x22ce92fc, 0x690c3eca, 0x93166f02, + 0x71573414, 0x8d43cffb, 0xe8bd0bb6, 0xde86770f, 0x0bf99a41, 0x4633a661, 0xba064108, 0x7adafae3, + 0x2f6cde5d, 0xb350a52c, 0xa5ebfb0b, 0x74c57b46, 0xd3b603b5, 0x80b70892, 0xa7f7fa53, 0xd94b566c, + 0xdda3fd86, 0x6a635793, 0x3ed005ca, 0xc5f087d8, 0x31e3a746, 0x7a4278f9, 0x82def1f9, 0x06caa2b2, + 0xe9d2c349, 0x8940e7f7, 0x7feef8dd, 0x4a9b01f0, 0xacde69f8, 0x57ddc280, 0xf09e4ba4, 0xb6d9f729, + 0xb48c18f2, 0xd3654aa9, 0xca7a03c8, 0x14d57545, 0x7fda87a5, 0x0e411366, 0xb77d0df0, 0x8c2aa467, + 0x787f2590, 0x2d292db1, 0x9f12682c, 0x44ac364d, 0x1a4b31a6, 0x871f7ded, 0x7ff99167, 0x6630a1d5, + 0x25385eb9, 0x2d4dd549, 0xaf8a7004, 0x319ebe0f, 0x379ab730, 0x81dc56a4, 0x822d8523, 0x1ae8554c, + 0x18fa0786, 0x875f7de4, 0x85ca350f, 0x7de818dc, 0x7786a38f, 0xa5456355, 0x92e60f88, 0xf5526122, + 0x916039bc, 0xc561e2de, 0x31c42042, 0x7c82e290, 0x75d158b2, 0xb015bda1, 0x7220c750, 0x46565441, + 0xd0da1fdd, 0x7b777481, 0x782e73c6, 0x8cd72b7b, 0x7f1006aa, 0xfb30e51e, 0x87994818, 0x34e7c7db, + 0x7faae06b, 0xea74fbc0, 0xd20c7af4, 0xc44f396b, 0x06b4234e, 0xdf2e2a93, 0x2efb07c8, 0xce861911, + 0x7550ea05, 0xd8d90bbb, 0x58522eec, 0x746b3520, 0xce844ce9, 0x7f5cacc3, 0xda8f17e0, 0x2fedf9cb, + 0xb2f77ec4, 0x6f13f4c0, 0x834de085, 0x7b7ace4b, 0x713b16ac, 0x499c5ab0, 0x06a7961d, 0x1b39a48a, + 0xbb853e6e, 0x7c781cc1, 0xc0baebf5, 0x7dace394, 0x815ceebc, 0xcc7b27d4, 0x8274b181, 0xa2be40a2, + 0xdd01d5dc, 0x7fefeb14, 0x0813ec78, 0xba3077cc, 0xe5cf1e1c, 0xedcfacae, 0x54c43a9b, 0x5cd62a42, + 0x93806b55, 0x03095c5b, 0x8e076ae3, 0x71bfcd2a, 0x7ac1989b, 0x623bc71a, 0x5e15d4d2, 0xfb341dd1, + 0xd75dfbca, 0xd0da32be, 0xd4569063, 0x337869da, 0x3d30606a, 0xcd89cca2, 0x7dd2ae36, 0x028c03cd, + 0xd85e052c, 0xe8dc9ec5, 0x7ffd9241, 0xde5bf4c6, 0x88c4b235, 0x8228be2e, 0x7fe6ec64, 0x996abe6a, + 0xdeb0666d, 0x9eb86611, 0xd249b922, 0x18b3e26b, 0x80211168, 0x5f8bb99c, 0x6ecb0dd2, 0x4728ff8d, + 0x2ac325b8, 0x6e5169d2, 0x7ebbd68d, 0x05e41d17, 0xaaa19f28, 0x8ab238a6, 0x51f105be, 0x140809cc, + 0x7f7345d9, 0x3aae5a9d, 0xaecec6e4, 0x1afb3473, 0xf6229ed1, 0x8d55f467, 0x7e32003a, 0x70f30c14, + 0x6686f33f, 0xd0d45ed8, 0x644fab57, 0x3a3fbbd3, 0x0b255fc4, 0x679a1701, 0x90e17b6e, 0x325d537b, + 0xcd7b9b87, 0xaa7be2a2, 0x7d47c966, 0xa33dbce5, 0x8659c3bb, 0x72a41367, 0x15c446e0, 0x45fe8b0a, + 0x9d8ddf26, 0x84d47643, 0x7fabe0da, 0x36a70122, 0x7a28ebfe, 0x7c29b8b8, 0x7f760406, 0xbabe4672, + 0x23ea216e, 0x92bcc50a, 0x6d20dba2, 0xad5a7c7e, 0xbf3897f5, 0xabb793e1, 0x8391fc7e, 0xe270291c, + 0x7a248d58, 0x80f8fd15, 0x83ef19f3, 0x5e6ece7d, 0x278430c1, 0x35239f4d, 0xe09c073b, 0x50e78cb5, + 0xd4b811bd, 0xce834ee0, 0xf88aaa34, 0xf71da5a9, 0xe2b0a1d5, 0x7c3aef31, 0xe84eabca, 0x3ce25964, + 0xf29336d3, 0x8fa78b2c, 0xa3fc3415, 0x63e1313d, 0x7fbc74e0, 0x7340bc93, 0x49ae583b, 0x8b79de4b, + 0x25011ce9, 0x7b462279, 0x36007db0, 0x3da1599c, 0x77780772, 0xc845c9bb, 0x83ba68be, 0x6ee507d1, + 0x2f0159b8, 0x5392c4ed, 0x98336ff6, 0x0b3c7f11, 0xde697aac, 0x893fc8d0, 0x6b83f8f3, 0x47799a0d, + 0x801d9dfc, 0x8516a83e, 0x5f8d22ec, 0x0f8ba384, 0xa049dc4b, 0xdd920b05, 0x7a99bc9f, 0x9ad19344, + 0x7a345dba, 0xf501a13f, 0x3e58bf19, 0x7fffaf9a, 0x3b4e1511, 0x0e08b991, 0x9e157620, 0x7230a326, + 0x4977f9ff, 0x2d2bbae1, 0x607aa7fc, 0x7bc85d5f, 0xb441bbbe, 0x8d8fa5f2, 0x601cce26, 0xda1884f2, + 0x81c82d64, 0x200b709c, 0xcbd36abe, 0x8cbdddd3, 0x55ab61d3, 0x7e3ee993, 0x833f18aa, 0xffc1aaea, + 0x7362e16a, 0x7fb85db2, 0x904ee04c, 0x7f04dca6, 0x8ad7a046, 0xebe7d8f7, 0xfbc4c687, 0xd0609458, + 0x093ed977, 0x8e546085, 0x7f5b8236, 0x7c47e118, 0xa01f2641, 0x7ffb3e48, 0x05de7cda, 0x7fc281b9, + 0x8e0278fc, 0xd74e6d07, 0x94c24450, 0x7cf9e641, 0x2ad27871, 0x919fa815, 0x805fd205, 0x7758397f, + 0xe2c7e02c, 0x1828e194, 0x5613d6fe, 0xfb55359f, 0xf9699516, 0x8978ee26, 0x7feebad9, 0x77d71d82, + 0x55b28b60, 0x7e997600, 0x80821a6b, 0xc6d78af1, 0x691822ab, 0x7f6982a0, 0x7ef56f99, 0x5c307f40, + 0xac6f8b76, 0x42cc8ba4, 0x782c61d9, 0xa0224dd0, 0x7bd234d1, 0x74576e3b, 0xe38cfe9a, 0x491e66ef, + 0xc78291c5, 0x895bb87f, 0x924f7889, 0x71b89394, 0x757b779d, 0xc4a9c604, 0x5cdf7829, 0x8020e9df, + 0x805e8245, 0x4a82c398, 0x6360bd62, 0x78bb60fc, 0x09e0d014, 0x4b0ea180, 0xb841978b, 0x69a0e864, + 0x7df35977, 0x3284b0dd, 0x3cdc2efd, 0x57d31f5e, 0x541069cc, 0x1776e92e, 0x04309ea3, 0xa015eb2d, + 0xce7bfabc, 0x41b638f8, 0x8365932e, 0x846ab44c, 0xbbcc80cb, 0x8afa6cac, 0x7fc422ea, 0x4e403fc0, + 0xbfac9aee, 0x8e4c6709, 0x028e01fb, 0x6d160a9b, 0x7fe93004, 0x790f9cdc, 0x6a1f37a0, 0xf7e7ef30, + 0xb4ea0f04, 0x7bf4c8e6, 0xe981701f, 0xc258a9d3, 0x6acbbfba, 0xef5479c7, 0x079c8bd8, 0x1a410f56, + 0x6853b799, 0x86cd4f01, 0xc66e23b6, 0x34585565, 0x8d1fe00d, 0x7fcdba1a, 0x32c9717b, 0xa02f9f48, + 0xf64940db, 0x5ed7d8f1, 0x61b823b2, 0x356f8918, 0xa0a7151e, 0x793fc969, 0x530beaeb, 0x34e93270, + 0x4fc4ddb5, 0x88d58b6c, 0x36094774, 0xf620ac80, 0x03763a72, 0xf910c9a6, 0x6666fb2d, 0x752c8be8, + 0x9a6dfdd8, 0xd1a7117d, 0x51c1b1d4, 0x0a67773d, 0x43b32a79, 0x4cdcd085, 0x5f067d30, 0x05bfe92a, + 0x7ed7d203, 0xe71a3c85, 0x99127ce2, 0x8eb3cac4, 0xad4bbcea, 0x5c6a0fd0, 0x0eec04af, 0x94e95cd4, + 0x8654f921, 0x83eabb5d, 0xb058d7ca, 0x69f12d3c, 0x03d881b2, 0x80558ef7, 0x82938cb3, 0x2ec0e1d6, + 0x80044422, 0xd1e47051, 0x720fc6ff, 0x82b20316, 0x0d527b02, 0x63049a15, 0x7ad5b9ad, 0xd2a4641d, + 0x41144f86, 0x7b04917a, 0x15c4a2c0, 0x9da07916, 0x211df54a, 0x7fdd09af, 0xfe924f3f, 0x7e132cfe, + 0x9a1d18d6, 0x7c56508b, 0x80f0f0af, 0x8095ced6, 0x8037d0d7, 0x026719d1, 0xa55fec43, 0x2b1c7cb7, + 0xa5cd5ac1, 0x77639fad, 0x7fcd8b62, 0x81a18c27, 0xaee4912e, 0xeae9eebe, 0xeb3081de, 0x8532aada, + 0xc822362e, 0x86a649a9, 0x8031a71d, 0x7b319dc6, 0xea8022e6, 0x814bc5a9, 0x8f62f7a1, 0xa430ea17, + 0x388deafb, 0x883b5185, 0x776fe13c, 0x801c683f, 0x87c11b98, 0xb7cbc644, 0x8e9ad3e8, 0x3cf5a10c, + 0x7ff6a634, 0x949ef096, 0x9f84aa7c, 0x010af13f, 0x782d1de8, 0xf18e492a, 0x6cf63b01, 0x4301cd81, + 0x32d15c9e, 0x68ad8cef, 0xd09bd2d6, 0x908c5c15, 0xd1e36260, 0x2c5bfdd0, 0x88765a99, 0x93deba1e, + 0xac6ae342, 0xe865b84c, 0x0f4f2847, 0x7fdf0499, 0x78b1c9b3, 0x6a73261e, 0x601a96f6, 0xd2847933, + 0x489aa888, 0xe12e8093, 0x3bfa5a5f, 0xd96ba5f7, 0x7c8f4c8d, 0x80940c6f, 0xcef9dd1a, 0x7e1a055f, + 0x3483558b, 0x02b59cc4, 0x0c56333e, 0x05a5b813, 0x92d66287, 0x7516b679, 0x71bfe03f, 0x8056bf68, + 0xc24d0724, 0x8416bcf3, 0x234afbdb, 0x4b0d6f9c, 0xaba97333, 0x4b4f42b6, 0x7e8343ab, 0x7ffe2603, + 0xe590f73c, 0x45e10c76, 0xb07a6a78, 0xb35609d3, 0x1a027dfd, 0x90cb6e20, 0x82d3fe38, 0x7b409257, + 0x0e395afa, 0x1b802093, 0xcb0c6c59, 0x241e17e7, 0x1ee3ea0a, 0x41a82302, 0xab04350a, 0xf570beb7, + 0xbb444b9b, 0x83021459, 0x838d65dc, 0x1c439c84, 0x6fdcc454, 0xef9ef325, 0x18626c1c, 0x020d251f, + 0xc4aae786, 0x8614cb48, 0xf6f53ca6, 0x8710dbab, 0x89abec0d, 0xf29d41c1, 0x94b50336, 0xfdd49178, + 0x604658d1, 0x800e85be, 0xca1bb079, 0x7fa48eeb, 0xa3b7fafe, 0xd330436b, 0x64eb604c, 0x43a658ae, + 0x7caa1337, 0xddd445e6, 0x7efbf955, 0xb706ec71, 0x624a6b53, 0x9e0e231f, 0x97097248, 0xa1e1a17a, + 0x68dd2e44, 0x7f9d2e14, 0xddcc7074, 0x58324197, 0xc88fc426, 0x6d3640ae, 0x7ef83600, 0x759a0270, + 0x98b6d854, 0xd63c9b84, 0x372474a2, 0xe3f18cfd, 0x56ab0bdb, 0x85c9be7e, 0x47dfcfeb, 0xa5830d41, + 0x0ddd6283, 0xf4f480ad, 0x74c60e38, 0xab8943c3, 0xc1508fe7, 0x480cdc39, 0x8e097362, 0xa44793be, + 0x538b7e18, 0x545f5b41, 0x56529175, 0x9771a97e, 0xc2da7421, 0xea8265f2, 0x805d1163, 0x883c5d28, + 0x8ba94c48, 0x4f676e65, 0xf78735b3, 0xe1853671, 0x7f454f53, 0x18147f85, 0x7d09e15d, 0xdb4f3494, + 0x795c8973, 0x83310632, 0x85d8061c, 0x9a1a0ebf, 0xc125583c, 0x2a1b1a95, 0x7fd9103f, 0x71e98c72, + 0x40932ed7, 0x91ed227a, 0x3c5e560e, 0xe816dee9, 0xb0891b80, 0x600038ba, 0xc7d9a80d, 0x7fff5e09, + 0x7e3f4351, 0xbb6b4424, 0xb14448d4, 0x8d6bb7e1, 0xfb153626, 0xa68ad537, 0xd9782006, 0xf62f6991, + 0x359ba8c1, 0x02ccff0b, 0x91bf2256, 0x7ea71c4d, 0x560ce5df, 0xeeba289b, 0xa574c4e7, 0x9e04f6ee, + 0x7860a5ec, 0x0b8db4a2, 0x968ba3d7, 0x0b6c77df, 0xd6f3157d, 0x402eff1a, 0x49b820b3, 0x8152aebb, + 0xd180b0b6, 0x098604d4, 0x7ff92224, 0xede9c996, 0x89c58061, 0x829624c4, 0xc6e71ea7, 0xba94d915, + 0x389c3cf6, 0x5b4c5a06, 0x04b335e6, 0x516a8aab, 0x42c8d7d9, 0x92b12af6, 0x86c8549f, 0xfda98acf, + 0x819673b6, 0x69545dac, 0x6feaa230, 0x726e6d3f, 0x886ebdfe, 0x34f5730a, 0x7af63ba2, 0x77307bbf, + 0x7cd80630, 0x6e45efe0, 0x7f8ad7eb, 0x59d7df99, 0x86c70946, 0xda233629, 0x753f6cbf, 0x825eeb40, }; diff --git a/src/libhelix-aac/statname.h b/src/libhelix-aac/statname.h index a27f04d5..2899ca93 100644 --- a/src/libhelix-aac/statname.h +++ b/src/libhelix-aac/statname.h @@ -1,59 +1,59 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: statname.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: statname.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * statname.h - name mangling macros for static linking + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + statname.h - name mangling macros for static linking **************************************************************************************/ #ifndef _STATNAME_H #define _STATNAME_H -/* define STAT_PREFIX to a unique name for static linking - * all the C functions and global variables will be mangled by the preprocessor - * e.g. void DCT4(...) becomes void raac_DCT4(...) - */ +/* define STAT_PREFIX to a unique name for static linking + all the C functions and global variables will be mangled by the preprocessor + e.g. void DCT4(...) becomes void raac_DCT4(...) +*/ #define STAT_PREFIX raac #define STATCC1(x,y,z) STATCC2(x,y,z) -#define STATCC2(x,y,z) x##y##z +#define STATCC2(x,y,z) x##y##z #ifdef STAT_PREFIX #define STATNAME(func) STATCC1(STAT_PREFIX, _, func) @@ -106,10 +106,10 @@ #define tnsMaxBandsLong STATNAME(tnsMaxBandsLong) #define tnsMaxOrderLong STATNAME(tnsMaxOrderLong) -/* in your implementation's top-level include file (e.g. real\coder.h) you should - * add new #define sym STATNAME(sym) lines for all the - * additional global functions or variables which your - * implementation uses - */ +/* in your implementation's top-level include file (e.g. real\coder.h) you should + add new #define sym STATNAME(sym) lines for all the + additional global functions or variables which your + implementation uses +*/ #endif /* _STATNAME_H */ diff --git a/src/libhelix-aac/stproc.c b/src/libhelix-aac/stproc.c index 93854e45..e329e137 100644 --- a/src/libhelix-aac/stproc.c +++ b/src/libhelix-aac/stproc.c @@ -1,246 +1,252 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: stproc.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: stproc.c,v 1.3 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * stproc.c - mid-side and intensity stereo processing + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + stproc.c - mid-side and intensity stereo processing **************************************************************************************/ #include "coder.h" #include "assembly.h" -/* pow14[0][i] = -pow(2, i/4.0) - * pow14[1][i] = +pow(2, i/4.0) - * - * i = [0,1,2,3] - * format = Q30 - */ +/* pow14[0][i] = -pow(2, i/4.0) + pow14[1][i] = +pow(2, i/4.0) + + i = [0,1,2,3] + format = Q30 +*/ /************************************************************************************** - * Function: StereoProcessGroup - * - * Description: apply mid-side and intensity stereo to group of transform coefficients - * - * Inputs: dequantized transform coefficients for both channels - * pointer to appropriate scalefactor band table - * mid-side mask enabled flag - * buffer with mid-side mask (one bit for each scalefactor band) - * bit offset into mid-side mask buffer - * max coded scalefactor band - * buffer of codebook indices for right channel - * buffer of scalefactors for right channel, range = [0, 256] - * - * Outputs: updated transform coefficients in Q(FBITS_OUT_DQ_OFF) - * updated minimum guard bit count for both channels - * - * Return: none - * - * Notes: assume no guard bits in input - * gains 0 int bits + Function: StereoProcessGroup + + Description: apply mid-side and intensity stereo to group of transform coefficients + + Inputs: dequantized transform coefficients for both channels + pointer to appropriate scalefactor band table + mid-side mask enabled flag + buffer with mid-side mask (one bit for each scalefactor band) + bit offset into mid-side mask buffer + max coded scalefactor band + buffer of codebook indices for right channel + buffer of scalefactors for right channel, range = [0, 256] + + Outputs: updated transform coefficients in Q(FBITS_OUT_DQ_OFF) + updated minimum guard bit count for both channels + + Return: none + + Notes: assume no guard bits in input + gains 0 int bits **************************************************************************************/ -static void StereoProcessGroup(int *coefL, int *coefR, const /*short*/ int *sfbTab, - int msMaskPres, unsigned char *msMaskPtr, int msMaskOffset, int maxSFB, - unsigned char *cbRight, short *sfRight, int *gbCurrent) -{ -//fb +static void StereoProcessGroup(int *coefL, int *coefR, const /*short*/ int *sfbTab, + int msMaskPres, unsigned char *msMaskPtr, int msMaskOffset, int maxSFB, + unsigned char *cbRight, short *sfRight, int *gbCurrent) { + //fb #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" -static const int pow14[2][4] PROGMEM = { - { 0xc0000000, 0xb3e407d7, 0xa57d8666, 0x945d819b }, - { 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 } -}; + static const int pow14[2][4] PROGMEM = { + { 0xc0000000, 0xb3e407d7, 0xa57d8666, 0x945d819b }, + { 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 } + }; #pragma GCC diagnostic pop - int sfb, width, cbIdx, sf, cl, cr, scalef, scalei; - int gbMaskL, gbMaskR; - unsigned char msMask; - - msMask = (*msMaskPtr++) >> msMaskOffset; - gbMaskL = 0; - gbMaskR = 0; - - for (sfb = 0; sfb < maxSFB; sfb++) { - width = sfbTab[sfb+1] - sfbTab[sfb]; /* assume >= 0 (see sfBandTabLong/sfBandTabShort) */ - cbIdx = cbRight[sfb]; - - if (cbIdx == 14 || cbIdx == 15) { - /* intensity stereo */ - if (msMaskPres == 1 && (msMask & 0x01)) - cbIdx ^= 0x01; /* invert_intensity(): 14 becomes 15, or 15 becomes 14 */ - sf = -sfRight[sfb]; /* negative since we use identity 0.5^(x) = 2^(-x) (see spec) */ - cbIdx &= 0x01; /* choose - or + scale factor */ - scalef = pow14[cbIdx][sf & 0x03]; - scalei = (sf >> 2) + 2; /* +2 to compensate for scalef = Q30 */ - - if (scalei > 0) { - if (scalei > 30) - scalei = 30; - do { - cr = MULSHIFT32(*coefL++, scalef); - CLIP_2N(cr, 31-scalei); - cr <<= scalei; - gbMaskR |= FASTABS(cr); - *coefR++ = cr; - } while (--width); - } else { - scalei = -scalei; - if (scalei > 31) - scalei = 31; - do { - cr = MULSHIFT32(*coefL++, scalef) >> scalei; - gbMaskR |= FASTABS(cr); - *coefR++ = cr; - } while (--width); - } - } else if ( cbIdx != 13 && ((msMaskPres == 1 && (msMask & 0x01)) || msMaskPres == 2) ) { - /* mid-side stereo (assumes no GB in inputs) */ - do { - cl = *coefL; - cr = *coefR; - - if ( (FASTABS(cl) | FASTABS(cr)) >> 30 ) { - /* avoid overflow (rare) */ - cl >>= 1; - sf = cl + (cr >> 1); CLIP_2N(sf, 30); sf <<= 1; - cl = cl - (cr >> 1); CLIP_2N(cl, 30); cl <<= 1; - } else { - /* usual case */ - sf = cl + cr; - cl -= cr; - } - - *coefL++ = sf; - gbMaskL |= FASTABS(sf); - *coefR++ = cl; - gbMaskR |= FASTABS(cl); - } while (--width); - - } else { - /* nothing to do */ - coefL += width; - coefR += width; - } - - /* get next mask bit (should be branchless on ARM) */ - msMask >>= 1; - if (++msMaskOffset == 8) { - msMask = *msMaskPtr++; - msMaskOffset = 0; - } - } - - cl = CLZ(gbMaskL) - 1; - if (gbCurrent[0] > cl) - gbCurrent[0] = cl; - - cr = CLZ(gbMaskR) - 1; - if (gbCurrent[1] > cr) - gbCurrent[1] = cr; - - return; + int sfb, width, cbIdx, sf, cl, cr, scalef, scalei; + int gbMaskL, gbMaskR; + unsigned char msMask; + + msMask = (*msMaskPtr++) >> msMaskOffset; + gbMaskL = 0; + gbMaskR = 0; + + for (sfb = 0; sfb < maxSFB; sfb++) { + width = sfbTab[sfb + 1] - sfbTab[sfb]; /* assume >= 0 (see sfBandTabLong/sfBandTabShort) */ + cbIdx = cbRight[sfb]; + + if (cbIdx == 14 || cbIdx == 15) { + /* intensity stereo */ + if (msMaskPres == 1 && (msMask & 0x01)) { + cbIdx ^= 0x01; /* invert_intensity(): 14 becomes 15, or 15 becomes 14 */ + } + sf = -sfRight[sfb]; /* negative since we use identity 0.5^(x) = 2^(-x) (see spec) */ + cbIdx &= 0x01; /* choose - or + scale factor */ + scalef = pow14[cbIdx][sf & 0x03]; + scalei = (sf >> 2) + 2; /* +2 to compensate for scalef = Q30 */ + + if (scalei > 0) { + if (scalei > 30) { + scalei = 30; + } + do { + cr = MULSHIFT32(*coefL++, scalef); + CLIP_2N(cr, 31 - scalei); + cr <<= scalei; + gbMaskR |= FASTABS(cr); + *coefR++ = cr; + } while (--width); + } else { + scalei = -scalei; + if (scalei > 31) { + scalei = 31; + } + do { + cr = MULSHIFT32(*coefL++, scalef) >> scalei; + gbMaskR |= FASTABS(cr); + *coefR++ = cr; + } while (--width); + } + } else if (cbIdx != 13 && ((msMaskPres == 1 && (msMask & 0x01)) || msMaskPres == 2)) { + /* mid-side stereo (assumes no GB in inputs) */ + do { + cl = *coefL; + cr = *coefR; + + if ((FASTABS(cl) | FASTABS(cr)) >> 30) { + /* avoid overflow (rare) */ + cl >>= 1; + sf = cl + (cr >> 1); CLIP_2N(sf, 30); sf <<= 1; + cl = cl - (cr >> 1); CLIP_2N(cl, 30); cl <<= 1; + } else { + /* usual case */ + sf = cl + cr; + cl -= cr; + } + + *coefL++ = sf; + gbMaskL |= FASTABS(sf); + *coefR++ = cl; + gbMaskR |= FASTABS(cl); + } while (--width); + + } else { + /* nothing to do */ + coefL += width; + coefR += width; + } + + /* get next mask bit (should be branchless on ARM) */ + msMask >>= 1; + if (++msMaskOffset == 8) { + msMask = *msMaskPtr++; + msMaskOffset = 0; + } + } + + cl = CLZ(gbMaskL) - 1; + if (gbCurrent[0] > cl) { + gbCurrent[0] = cl; + } + + cr = CLZ(gbMaskR) - 1; + if (gbCurrent[1] > cr) { + gbCurrent[1] = cr; + } + + return; } /************************************************************************************** - * Function: StereoProcess - * - * Description: apply mid-side and intensity stereo, if enabled - * - * Inputs: valid AACDecInfo struct (including dequantized transform coefficients) - * - * Outputs: updated transform coefficients in Q(FBITS_OUT_DQ_OFF) - * updated minimum guard bit count for both channels - * - * Return: 0 if successful, -1 if error + Function: StereoProcess + + Description: apply mid-side and intensity stereo, if enabled + + Inputs: valid AACDecInfo struct (including dequantized transform coefficients) + + Outputs: updated transform coefficients in Q(FBITS_OUT_DQ_OFF) + updated minimum guard bit count for both channels + + Return: 0 if successful, -1 if error **************************************************************************************/ -int StereoProcess(AACDecInfo *aacDecInfo) -{ - PSInfoBase *psi; - ICSInfo *icsInfo; - int gp, win, nSamps, msMaskOffset; - int *coefL, *coefR; - unsigned char *msMaskPtr; - const /*short*/ int *sfbTab; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - - /* mid-side and intensity stereo require common_window == 1 (see MPEG4 spec, Correction 2, 2004) */ - if (psi->commonWin != 1 || aacDecInfo->currBlockID != AAC_ID_CPE) - return 0; - - /* nothing to do */ - if (!psi->msMaskPresent && !psi->intensityUsed[1]) - return 0; - - icsInfo = &(psi->icsInfo[0]); - if (icsInfo->winSequence == 2) { - sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; - nSamps = NSAMPS_SHORT; - } else { - sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; - nSamps = NSAMPS_LONG; - } - coefL = psi->coef[0]; - coefR = psi->coef[1]; - - /* do fused mid-side/intensity processing for each block (one long or eight short) */ - msMaskOffset = 0; - msMaskPtr = psi->msMaskBits; - for (gp = 0; gp < icsInfo->numWinGroup; gp++) { - for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { - StereoProcessGroup(coefL, coefR, sfbTab, psi->msMaskPresent, - msMaskPtr, msMaskOffset, icsInfo->maxSFB, psi->sfbCodeBook[1] + gp*icsInfo->maxSFB, - psi->scaleFactors[1] + gp*icsInfo->maxSFB, psi->gbCurrent); - coefL += nSamps; - coefR += nSamps; - } - /* we use one bit per sfb, so there are maxSFB bits for each window group */ - msMaskPtr += (msMaskOffset + icsInfo->maxSFB) >> 3; - msMaskOffset = (msMaskOffset + icsInfo->maxSFB) & 0x07; - } - - ASSERT(coefL == psi->coef[0] + 1024); - ASSERT(coefR == psi->coef[1] + 1024); - - return 0; +int StereoProcess(AACDecInfo *aacDecInfo) { + PSInfoBase *psi; + ICSInfo *icsInfo; + int gp, win, nSamps, msMaskOffset; + int *coefL, *coefR; + unsigned char *msMaskPtr; + const /*short*/ int *sfbTab; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + + /* mid-side and intensity stereo require common_window == 1 (see MPEG4 spec, Correction 2, 2004) */ + if (psi->commonWin != 1 || aacDecInfo->currBlockID != AAC_ID_CPE) { + return 0; + } + + /* nothing to do */ + if (!psi->msMaskPresent && !psi->intensityUsed[1]) { + return 0; + } + + icsInfo = &(psi->icsInfo[0]); + if (icsInfo->winSequence == 2) { + sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; + nSamps = NSAMPS_SHORT; + } else { + sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; + nSamps = NSAMPS_LONG; + } + coefL = psi->coef[0]; + coefR = psi->coef[1]; + + /* do fused mid-side/intensity processing for each block (one long or eight short) */ + msMaskOffset = 0; + msMaskPtr = psi->msMaskBits; + for (gp = 0; gp < icsInfo->numWinGroup; gp++) { + for (win = 0; win < icsInfo->winGroupLen[gp]; win++) { + StereoProcessGroup(coefL, coefR, sfbTab, psi->msMaskPresent, + msMaskPtr, msMaskOffset, icsInfo->maxSFB, psi->sfbCodeBook[1] + gp * icsInfo->maxSFB, + psi->scaleFactors[1] + gp * icsInfo->maxSFB, psi->gbCurrent); + coefL += nSamps; + coefR += nSamps; + } + /* we use one bit per sfb, so there are maxSFB bits for each window group */ + msMaskPtr += (msMaskOffset + icsInfo->maxSFB) >> 3; + msMaskOffset = (msMaskOffset + icsInfo->maxSFB) & 0x07; + } + + ASSERT(coefL == psi->coef[0] + 1024); + ASSERT(coefR == psi->coef[1] + 1024); + + return 0; } diff --git a/src/libhelix-aac/tns.c b/src/libhelix-aac/tns.c index 87726067..e8f65669 100644 --- a/src/libhelix-aac/tns.c +++ b/src/libhelix-aac/tns.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: tns.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: tns.c,v 1.2 2005/05/24 16:01:55 albertofloyd Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com) - * February 2005 - * - * tns.c - apply TNS to spectrum + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com) + February 2005 + + tns.c - apply TNS to spectrum **************************************************************************************/ #include "coder.h" @@ -52,249 +52,259 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" -/* inverse quantization tables for TNS filter coefficients, format = Q31 - * see bottom of file for table generation - * negative (vs. spec) since we use MADD for filter kernel - */ +/* inverse quantization tables for TNS filter coefficients, format = Q31 + see bottom of file for table generation + negative (vs. spec) since we use MADD for filter kernel +*/ static const int invQuant3[16] PROGMEM = { - 0x00000000, 0xc8767f65, 0x9becf22c, 0x83358feb, 0x83358feb, 0x9becf22c, 0xc8767f65, 0x00000000, - 0x2bc750e9, 0x5246dd49, 0x6ed9eba1, 0x7e0e2e32, 0x7e0e2e32, 0x6ed9eba1, 0x5246dd49, 0x2bc750e9, + 0x00000000, 0xc8767f65, 0x9becf22c, 0x83358feb, 0x83358feb, 0x9becf22c, 0xc8767f65, 0x00000000, + 0x2bc750e9, 0x5246dd49, 0x6ed9eba1, 0x7e0e2e32, 0x7e0e2e32, 0x6ed9eba1, 0x5246dd49, 0x2bc750e9, }; static const int invQuant4[16] PROGMEM = { - 0x00000000, 0xe5632654, 0xcbf00dbe, 0xb4c373ee, 0xa0e0a15f, 0x9126145f, 0x8643c7b3, 0x80b381ac, - 0x7f7437ad, 0x7b1d1a49, 0x7294b5f2, 0x66256db2, 0x563ba8aa, 0x4362210e, 0x2e3d2abb, 0x17851aad, + 0x00000000, 0xe5632654, 0xcbf00dbe, 0xb4c373ee, 0xa0e0a15f, 0x9126145f, 0x8643c7b3, 0x80b381ac, + 0x7f7437ad, 0x7b1d1a49, 0x7294b5f2, 0x66256db2, 0x563ba8aa, 0x4362210e, 0x2e3d2abb, 0x17851aad, }; #pragma GCC diagnostic pop /************************************************************************************** - * Function: DecodeLPCCoefs - * - * Description: decode LPC coefficients for TNS - * - * Inputs: order of TNS filter - * resolution of coefficients (3 or 4 bits) - * coefficients unpacked from bitstream - * scratch buffer (b) of size >= order - * - * Outputs: LPC coefficients in Q(FBITS_LPC_COEFS), in 'a' - * - * Return: none - * - * Notes: assumes no guard bits in input transform coefficients - * a[i] = Q(FBITS_LPC_COEFS), don't store a0 = 1.0 - * (so a[0] = first delay tap, etc.) - * max abs(a[i]) < log2(order), so for max order = 20 a[i] < 4.4 - * (up to 3 bits of gain) so a[i] has at least 31 - FBITS_LPC_COEFS - 3 - * guard bits - * to ensure no intermediate overflow in all-pole filter, set - * FBITS_LPC_COEFS such that number of guard bits >= log2(max order) + Function: DecodeLPCCoefs + + Description: decode LPC coefficients for TNS + + Inputs: order of TNS filter + resolution of coefficients (3 or 4 bits) + coefficients unpacked from bitstream + scratch buffer (b) of size >= order + + Outputs: LPC coefficients in Q(FBITS_LPC_COEFS), in 'a' + + Return: none + + Notes: assumes no guard bits in input transform coefficients + a[i] = Q(FBITS_LPC_COEFS), don't store a0 = 1.0 + (so a[0] = first delay tap, etc.) + max abs(a[i]) < log2(order), so for max order = 20 a[i] < 4.4 + (up to 3 bits of gain) so a[i] has at least 31 - FBITS_LPC_COEFS - 3 + guard bits + to ensure no intermediate overflow in all-pole filter, set + FBITS_LPC_COEFS such that number of guard bits >= log2(max order) **************************************************************************************/ -static void DecodeLPCCoefs(int order, int res, signed char *filtCoef, int *a, int *b) -{ - int i, m, t; - const int *invQuantTab; - - if (res == 3) invQuantTab = invQuant3; - else if (res == 4) invQuantTab = invQuant4; - else return; - - for (m = 0; m < order; m++) { - t = invQuantTab[filtCoef[m] & 0x0f]; /* t = Q31 */ - for (i = 0; i < m; i++) - b[i] = a[i] - (MULSHIFT32(t, a[m-i-1]) << 1); - for (i = 0; i < m; i++) - a[i] = b[i]; - a[m] = t >> (31 - FBITS_LPC_COEFS); - } +static void DecodeLPCCoefs(int order, int res, signed char *filtCoef, int *a, int *b) { + int i, m, t; + const int *invQuantTab; + + if (res == 3) { + invQuantTab = invQuant3; + } else if (res == 4) { + invQuantTab = invQuant4; + } else { + return; + } + + for (m = 0; m < order; m++) { + t = invQuantTab[filtCoef[m] & 0x0f]; /* t = Q31 */ + for (i = 0; i < m; i++) { + b[i] = a[i] - (MULSHIFT32(t, a[m - i - 1]) << 1); + } + for (i = 0; i < m; i++) { + a[i] = b[i]; + } + a[m] = t >> (31 - FBITS_LPC_COEFS); + } } /************************************************************************************** - * Function: FilterRegion - * - * Description: apply LPC filter to one region of coefficients - * - * Inputs: number of transform coefficients in this region - * direction flag (forward = 1, backward = -1) - * order of filter - * 'size' transform coefficients - * 'order' LPC coefficients in Q(FBITS_LPC_COEFS) - * scratch buffer for history (must be >= order samples long) - * - * Outputs: filtered transform coefficients - * - * Return: guard bit mask (OR of abs value of all filtered transform coefs) - * - * Notes: assumes no guard bits in input transform coefficients - * gains 0 int bits - * history buffer does not need to be preserved between regions + Function: FilterRegion + + Description: apply LPC filter to one region of coefficients + + Inputs: number of transform coefficients in this region + direction flag (forward = 1, backward = -1) + order of filter + 'size' transform coefficients + 'order' LPC coefficients in Q(FBITS_LPC_COEFS) + scratch buffer for history (must be >= order samples long) + + Outputs: filtered transform coefficients + + Return: guard bit mask (OR of abs value of all filtered transform coefs) + + Notes: assumes no guard bits in input transform coefficients + gains 0 int bits + history buffer does not need to be preserved between regions **************************************************************************************/ -static int FilterRegion(int size, int dir, int order, int *audioCoef, int *a, int *hist) -{ - int i, j, y, hi32, inc, gbMask; - U64 sum64; - - /* init history to 0 every time */ - for (i = 0; i < order; i++) - hist[i] = 0; - - sum64.w64 = 0; /* avoid warning */ - gbMask = 0; - inc = (dir ? -1 : 1); - do { - /* sum64 = a0*y[n] = 1.0*y[n] */ - y = *audioCoef; - sum64.r.hi32 = y >> (32 - FBITS_LPC_COEFS); - sum64.r.lo32 = y << FBITS_LPC_COEFS; - - /* sum64 += (a1*y[n-1] + a2*y[n-2] + ... + a[order-1]*y[n-(order-1)]) */ +static int FilterRegion(int size, int dir, int order, int *audioCoef, int *a, int *hist) { + int i, j, y, hi32, inc, gbMask; + U64 sum64; + + /* init history to 0 every time */ + for (i = 0; i < order; i++) { + hist[i] = 0; + } + + sum64.w64 = 0; /* avoid warning */ + gbMask = 0; + inc = (dir ? -1 : 1); + do { + /* sum64 = a0*y[n] = 1.0*y[n] */ + y = *audioCoef; + sum64.r.hi32 = y >> (32 - FBITS_LPC_COEFS); + sum64.r.lo32 = y << FBITS_LPC_COEFS; + + /* sum64 += (a1*y[n-1] + a2*y[n-2] + ... + a[order-1]*y[n-(order-1)]) */ for (j = order - 1; j > 0; j--) { - sum64.w64 = MADD64(sum64.w64, hist[j], a[j]); - hist[j] = hist[j-1]; - } - sum64.w64 = MADD64(sum64.w64, hist[0], a[0]); - y = (sum64.r.hi32 << (32 - FBITS_LPC_COEFS)) | (sum64.r.lo32 >> FBITS_LPC_COEFS); - - /* clip output (rare) */ - hi32 = sum64.r.hi32; - if ((hi32 >> 31) != (hi32 >> (FBITS_LPC_COEFS-1))) - y = (hi32 >> 31) ^ 0x7fffffff; - - hist[0] = y; - *audioCoef = y; - audioCoef += inc; - gbMask |= FASTABS(y); - } while (--size); - - return gbMask; + sum64.w64 = MADD64(sum64.w64, hist[j], a[j]); + hist[j] = hist[j - 1]; + } + sum64.w64 = MADD64(sum64.w64, hist[0], a[0]); + y = (sum64.r.hi32 << (32 - FBITS_LPC_COEFS)) | (sum64.r.lo32 >> FBITS_LPC_COEFS); + + /* clip output (rare) */ + hi32 = sum64.r.hi32; + if ((hi32 >> 31) != (hi32 >> (FBITS_LPC_COEFS - 1))) { + y = (hi32 >> 31) ^ 0x7fffffff; + } + + hist[0] = y; + *audioCoef = y; + audioCoef += inc; + gbMask |= FASTABS(y); + } while (--size); + + return gbMask; } /************************************************************************************** - * Function: TNSFilter - * - * Description: apply temporal noise shaping, if enabled - * - * Inputs: valid AACDecInfo struct - * index of current channel - * - * Outputs: updated transform coefficients - * updated minimum guard bit count for this channel - * - * Return: 0 if successful, -1 if error + Function: TNSFilter + + Description: apply temporal noise shaping, if enabled + + Inputs: valid AACDecInfo struct + index of current channel + + Outputs: updated transform coefficients + updated minimum guard bit count for this channel + + Return: 0 if successful, -1 if error **************************************************************************************/ -int TNSFilter(AACDecInfo *aacDecInfo, int ch) -{ - int win, winLen, nWindows, nSFB, filt, bottom, top, order, maxOrder, dir; - int start, end, size, tnsMaxBand, numFilt, gbMask; - int *audioCoef; - unsigned char *filtLength, *filtOrder, *filtRes, *filtDir; - signed char *filtCoef; - const unsigned /*char*/ int *tnsMaxBandTab; - const /*short*/ int *sfbTab; - ICSInfo *icsInfo; - TNSInfo *ti; - PSInfoBase *psi; - - /* validate pointers */ - if (!aacDecInfo || !aacDecInfo->psInfoBase) - return -1; - psi = (PSInfoBase *)(aacDecInfo->psInfoBase); - icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); - ti = &psi->tnsInfo[ch]; - - if (!ti->tnsDataPresent) - return 0; - - if (icsInfo->winSequence == 2) { - nWindows = NWINDOWS_SHORT; - winLen = NSAMPS_SHORT; - nSFB = sfBandTotalShort[psi->sampRateIdx]; - maxOrder = tnsMaxOrderShort[aacDecInfo->profile]; - sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; - tnsMaxBandTab = tnsMaxBandsShort + tnsMaxBandsShortOffset[aacDecInfo->profile]; - tnsMaxBand = tnsMaxBandTab[psi->sampRateIdx]; - } else { - nWindows = NWINDOWS_LONG; - winLen = NSAMPS_LONG; - nSFB = sfBandTotalLong[psi->sampRateIdx]; - maxOrder = tnsMaxOrderLong[aacDecInfo->profile]; - sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; - tnsMaxBandTab = tnsMaxBandsLong + tnsMaxBandsLongOffset[aacDecInfo->profile]; - tnsMaxBand = tnsMaxBandTab[psi->sampRateIdx]; - } - - if (tnsMaxBand > icsInfo->maxSFB) - tnsMaxBand = icsInfo->maxSFB; - - filtRes = ti->coefRes; - filtLength = ti->length; - filtOrder = ti->order; - filtDir = ti->dir; - filtCoef = ti->coef; - - gbMask = 0; - audioCoef = psi->coef[ch]; - for (win = 0; win < nWindows; win++) { - bottom = nSFB; - numFilt = ti->numFilt[win]; - for (filt = 0; filt < numFilt; filt++) { - top = bottom; - bottom = top - *filtLength++; - bottom = MAX(bottom, 0); - order = *filtOrder++; - order = MIN(order, maxOrder); - - if (order) { - start = sfbTab[MIN(bottom, tnsMaxBand)]; - end = sfbTab[MIN(top, tnsMaxBand)]; - size = end - start; - if (size > 0) { - dir = *filtDir++; - if (dir) - start = end - 1; - - DecodeLPCCoefs(order, filtRes[win], filtCoef, psi->tnsLPCBuf, psi->tnsWorkBuf); - gbMask |= FilterRegion(size, dir, order, audioCoef + start, psi->tnsLPCBuf, psi->tnsWorkBuf); - } - filtCoef += order; - } - } - audioCoef += winLen; - } - - /* update guard bit count if necessary */ - size = CLZ(gbMask) - 1; - if (psi->gbCurrent[ch] > size) - psi->gbCurrent[ch] = size; - - return 0; +int TNSFilter(AACDecInfo *aacDecInfo, int ch) { + int win, winLen, nWindows, nSFB, filt, bottom, top, order, maxOrder, dir; + int start, end, size, tnsMaxBand, numFilt, gbMask; + int *audioCoef; + unsigned char *filtLength, *filtOrder, *filtRes, *filtDir; + signed char *filtCoef; + const unsigned /*char*/ int *tnsMaxBandTab; + const /*short*/ int *sfbTab; + ICSInfo *icsInfo; + TNSInfo *ti; + PSInfoBase *psi; + + /* validate pointers */ + if (!aacDecInfo || !aacDecInfo->psInfoBase) { + return -1; + } + psi = (PSInfoBase *)(aacDecInfo->psInfoBase); + icsInfo = (ch == 1 && psi->commonWin == 1) ? &(psi->icsInfo[0]) : &(psi->icsInfo[ch]); + ti = &psi->tnsInfo[ch]; + + if (!ti->tnsDataPresent) { + return 0; + } + + if (icsInfo->winSequence == 2) { + nWindows = NWINDOWS_SHORT; + winLen = NSAMPS_SHORT; + nSFB = sfBandTotalShort[psi->sampRateIdx]; + maxOrder = tnsMaxOrderShort[aacDecInfo->profile]; + sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx]; + tnsMaxBandTab = tnsMaxBandsShort + tnsMaxBandsShortOffset[aacDecInfo->profile]; + tnsMaxBand = tnsMaxBandTab[psi->sampRateIdx]; + } else { + nWindows = NWINDOWS_LONG; + winLen = NSAMPS_LONG; + nSFB = sfBandTotalLong[psi->sampRateIdx]; + maxOrder = tnsMaxOrderLong[aacDecInfo->profile]; + sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx]; + tnsMaxBandTab = tnsMaxBandsLong + tnsMaxBandsLongOffset[aacDecInfo->profile]; + tnsMaxBand = tnsMaxBandTab[psi->sampRateIdx]; + } + + if (tnsMaxBand > icsInfo->maxSFB) { + tnsMaxBand = icsInfo->maxSFB; + } + + filtRes = ti->coefRes; + filtLength = ti->length; + filtOrder = ti->order; + filtDir = ti->dir; + filtCoef = ti->coef; + + gbMask = 0; + audioCoef = psi->coef[ch]; + for (win = 0; win < nWindows; win++) { + bottom = nSFB; + numFilt = ti->numFilt[win]; + for (filt = 0; filt < numFilt; filt++) { + top = bottom; + bottom = top - *filtLength++; + bottom = MAX(bottom, 0); + order = *filtOrder++; + order = MIN(order, maxOrder); + + if (order) { + start = sfbTab[MIN(bottom, tnsMaxBand)]; + end = sfbTab[MIN(top, tnsMaxBand)]; + size = end - start; + if (size > 0) { + dir = *filtDir++; + if (dir) { + start = end - 1; + } + + DecodeLPCCoefs(order, filtRes[win], filtCoef, psi->tnsLPCBuf, psi->tnsWorkBuf); + gbMask |= FilterRegion(size, dir, order, audioCoef + start, psi->tnsLPCBuf, psi->tnsWorkBuf); + } + filtCoef += order; + } + } + audioCoef += winLen; + } + + /* update guard bit count if necessary */ + size = CLZ(gbMask) - 1; + if (psi->gbCurrent[ch] > size) { + psi->gbCurrent[ch] = size; + } + + return 0; } -/* Code to generate invQuantXXX[] tables - * { - * int res, i, t; - * double powScale, iqfac, iqfac_m, d; - * - * powScale = pow(2.0, 31) * -1.0; / ** make coefficients negative for using MADD in kernel ** / - * for (res = 3; res <= 4; res++) { - * iqfac = ( ((1 << (res-1)) - 0.5) * (2.0 / M_PI) ); - * iqfac_m = ( ((1 << (res-1)) + 0.5) * (2.0 / M_PI) ); - * printf("static const int invQuant%d[16] = {\n", res); - * for (i = 0; i < 16; i++) { - * / ** extend bottom 4 bits into signed, 2's complement number ** / - * t = (i << 28) >> 28; - * - * if (t >= 0) d = sin(t / iqfac); - * else d = sin(t / iqfac_m); - * - * d *= powScale; - * printf("0x%08x, ", (int)(d > 0 ? d + 0.5 : d - 0.5)); - * if ((i & 0x07) == 0x07) - * printf("\n"); - * } - * printf("};\n\n"); - * } - * } - */ +/* Code to generate invQuantXXX[] tables + { + int res, i, t; + double powScale, iqfac, iqfac_m, d; + + powScale = pow(2.0, 31) * -1.0; / ** make coefficients negative for using MADD in kernel ** / + for (res = 3; res <= 4; res++) { + iqfac = ( ((1 << (res-1)) - 0.5) * (2.0 / M_PI) ); + iqfac_m = ( ((1 << (res-1)) + 0.5) * (2.0 / M_PI) ); + printf("static const int invQuant%d[16] = {\n", res); + for (i = 0; i < 16; i++) { + / ** extend bottom 4 bits into signed, 2's complement number ** / + t = (i << 28) >> 28; + + if (t >= 0) d = sin(t / iqfac); + else d = sin(t / iqfac_m); + + d *= powScale; + printf("0x%08x, ", (int)(d > 0 ? d + 0.5 : d - 0.5)); + if ((i & 0x07) == 0x07) + printf("\n"); + } + printf("};\n\n"); + } + } +*/ diff --git a/src/libhelix-aac/trigtabs.c b/src/libhelix-aac/trigtabs.c index 43012904..c8e6209e 100644 --- a/src/libhelix-aac/trigtabs.c +++ b/src/libhelix-aac/trigtabs.c @@ -1,46 +1,46 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Source last modified: $Id: trigtabs.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ - * - * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, - * are subject to the current version of the RealNetworks Public - * Source License (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the current version of the RealNetworks Community - * Source License (the "RCSL") available at - * http://www.helixcommunity.org/content/rcsl, in which case the RCSL - * will apply. You may also obtain the license terms directly from - * RealNetworks. You may not use this file except in compliance with - * the RPSL or, if you have a valid RCSL with RealNetworks applicable - * to this file, the RCSL. Please see the applicable RPSL or RCSL for - * the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the - * portions it created. - * - * This file, and the files included with this file, is distributed - * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY - * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS - * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET - * ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Source last modified: $Id: trigtabs.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $ + + Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, + are subject to the current version of the RealNetworks Public + Source License (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the current version of the RealNetworks Community + Source License (the "RCSL") available at + http://www.helixcommunity.org/content/rcsl, in which case the RCSL + will apply. You may also obtain the license terms directly from + RealNetworks. You may not use this file except in compliance with + the RPSL or, if you have a valid RCSL with RealNetworks applicable + to this file, the RCSL. Please see the applicable RPSL or RCSL for + the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the + portions it created. + + This file, and the files included with this file, is distributed + and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS + ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET + ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point HE-AAC decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * February 2005 - * - * trigtabs.c - tables of sin, cos, etc. for IMDCT + Fixed-point HE-AAC decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + February 2005 + + trigtabs.c - tables of sin, cos, etc. for IMDCT **************************************************************************************/ #include "coder.h" @@ -48,848 +48,854 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" -const int cos4sin4tabOffset[NUM_IMDCT_SIZES] PROGMEM = {0, 128}; - -/* PreMultiply() tables - * format = Q30 * 2^[-7, -10] for nmdct = [128, 1024] - * reordered for sequential access - * - * invM = -1.0 / nmdct; - * for (i = 0; i < nmdct/4; i++) { - * angle = (i + 0.25) * M_PI / nmdct; - * x = invM * (cos(angle) + sin(angle)); - * x = invM * sin(angle); - * - * angle = (nmdct/2 - 1 - i + 0.25) * M_PI / nmdct; - * x = invM * (cos(angle) + sin(angle)); - * x = invM * sin(angle); - * } - */ -const int cos4sin4tab[128 + 1024] PROGMEM = { -/* 128 - format = Q30 * 2^-7 */ -0xbf9bc731, 0xff9b783c, 0xbed5332c, 0xc002c697, 0xbe112251, 0xfe096c8d, 0xbd4f9c30, 0xc00f1c4a, -0xbc90a83f, 0xfc77ae5e, 0xbbd44dd9, 0xc0254e27, 0xbb1a9443, 0xfae67ba2, 0xba6382a6, 0xc04558c0, -0xb9af200f, 0xf9561237, 0xb8fd7373, 0xc06f3726, 0xb84e83ac, 0xf7c6afdc, 0xb7a25779, 0xc0a2e2e3, -0xb6f8f57c, 0xf6389228, 0xb652643e, 0xc0e05401, 0xb5aeaa2a, 0xf4abf67e, 0xb50dcd90, 0xc1278104, -0xb46fd4a4, 0xf3211a07, 0xb3d4c57c, 0xc1785ef4, 0xb33ca614, 0xf19839a6, 0xb2a77c49, 0xc1d2e158, -0xb2154dda, 0xf01191f3, 0xb186206b, 0xc236fa3b, 0xb0f9f981, 0xee8d5f29, 0xb070de82, 0xc2a49a2e, -0xafead4b9, 0xed0bdd25, 0xaf67e14f, 0xc31bb049, 0xaee80952, 0xeb8d475b, 0xae6b51ae, 0xc39c2a2f, -0xadf1bf34, 0xea11d8c8, 0xad7b5692, 0xc425f410, 0xad081c5a, 0xe899cbf1, 0xac9814fd, 0xc4b8f8ad, -0xac2b44cc, 0xe7255ad1, 0xabc1aff9, 0xc555215a, 0xab5b5a96, 0xe5b4bed8, 0xaaf84896, 0xc5fa5603, -0xaa987dca, 0xe44830dd, 0xaa3bfde3, 0xc6a87d2d, 0xa9e2cc73, 0xe2dfe917, 0xa98cece9, 0xc75f7bfe, -0xa93a6296, 0xe17c1f15, 0xa8eb30a7, 0xc81f363d, 0xa89f5a2b, 0xe01d09b4, 0xa856e20e, 0xc8e78e5b, -0xa811cb1b, 0xdec2df18, 0xa7d017fc, 0xc9b86572, 0xa791cb39, 0xdd6dd4a2, 0xa756e73a, 0xca919b4e, -0xa71f6e43, 0xdc1e1ee9, 0xa6eb6279, 0xcb730e70, 0xa6bac5dc, 0xdad3f1b1, 0xa68d9a4c, 0xcc5c9c14, -0xa663e188, 0xd98f7fe6, 0xa63d9d2b, 0xcd4e2037, 0xa61aceaf, 0xd850fb8e, 0xa5fb776b, 0xce47759a, -0xa5df9894, 0xd71895c9, 0xa5c7333e, 0xcf4875ca, 0xa5b2485a, 0xd5e67ec1, 0xa5a0d8b5, 0xd050f926, -0xa592e4fd, 0xd4bae5ab, 0xa5886dba, 0xd160d6e5, 0xa5817354, 0xd395f8ba, 0xa57df60f, 0xd277e518, -/* 1024 - format = Q30 * 2^-10 */ -0xbff3703e, 0xfff36f02, 0xbfda5824, 0xc0000b1a, 0xbfc149ed, 0xffc12b16, 0xbfa845a0, 0xc0003c74, -0xbf8f4b3e, 0xff8ee750, 0xbf765acc, 0xc0009547, 0xbf5d744e, 0xff5ca3d0, 0xbf4497c8, 0xc0011594, -0xbf2bc53d, 0xff2a60b4, 0xbf12fcb2, 0xc001bd5c, 0xbefa3e2a, 0xfef81e1d, 0xbee189a8, 0xc0028c9c, -0xbec8df32, 0xfec5dc28, 0xbeb03eca, 0xc0038356, 0xbe97a875, 0xfe939af5, 0xbe7f1c36, 0xc004a188, -0xbe669a10, 0xfe615aa3, 0xbe4e2209, 0xc005e731, 0xbe35b423, 0xfe2f1b50, 0xbe1d5062, 0xc0075452, -0xbe04f6cb, 0xfdfcdd1d, 0xbdeca760, 0xc008e8e8, 0xbdd46225, 0xfdcaa027, 0xbdbc2720, 0xc00aa4f3, -0xbda3f652, 0xfd98648d, 0xbd8bcfbf, 0xc00c8872, 0xbd73b36d, 0xfd662a70, 0xbd5ba15d, 0xc00e9364, -0xbd439995, 0xfd33f1ed, 0xbd2b9c17, 0xc010c5c7, 0xbd13a8e7, 0xfd01bb24, 0xbcfbc00a, 0xc0131f9b, -0xbce3e182, 0xfccf8634, 0xbccc0d53, 0xc015a0dd, 0xbcb44382, 0xfc9d533b, 0xbc9c8411, 0xc018498c, -0xbc84cf05, 0xfc6b2259, 0xbc6d2461, 0xc01b19a7, 0xbc558428, 0xfc38f3ac, 0xbc3dee5f, 0xc01e112b, -0xbc266309, 0xfc06c754, 0xbc0ee22a, 0xc0213018, 0xbbf76bc4, 0xfbd49d70, 0xbbdfffdd, 0xc024766a, -0xbbc89e77, 0xfba2761e, 0xbbb14796, 0xc027e421, 0xbb99fb3e, 0xfb70517d, 0xbb82b972, 0xc02b7939, -0xbb6b8235, 0xfb3e2fac, 0xbb54558d, 0xc02f35b1, 0xbb3d337b, 0xfb0c10cb, 0xbb261c04, 0xc0331986, -0xbb0f0f2b, 0xfad9f4f8, 0xbaf80cf4, 0xc03724b6, 0xbae11561, 0xfaa7dc52, 0xbaca2878, 0xc03b573f, -0xbab3463b, 0xfa75c6f8, 0xba9c6eae, 0xc03fb11d, 0xba85a1d4, 0xfa43b508, 0xba6edfb1, 0xc044324f, -0xba582849, 0xfa11a6a3, 0xba417b9e, 0xc048dad1, 0xba2ad9b5, 0xf9df9be6, 0xba144291, 0xc04daaa1, -0xb9fdb635, 0xf9ad94f0, 0xb9e734a4, 0xc052a1bb, 0xb9d0bde4, 0xf97b91e1, 0xb9ba51f6, 0xc057c01d, -0xb9a3f0de, 0xf94992d7, 0xb98d9aa0, 0xc05d05c3, 0xb9774f3f, 0xf91797f0, 0xb9610ebe, 0xc06272aa, -0xb94ad922, 0xf8e5a14d, 0xb934ae6d, 0xc06806ce, 0xb91e8ea3, 0xf8b3af0c, 0xb90879c7, 0xc06dc22e, -0xb8f26fdc, 0xf881c14b, 0xb8dc70e7, 0xc073a4c3, 0xb8c67cea, 0xf84fd829, 0xb8b093ea, 0xc079ae8c, -0xb89ab5e8, 0xf81df3c5, 0xb884e2e9, 0xc07fdf85, 0xb86f1af0, 0xf7ec143e, 0xb8595e00, 0xc08637a9, -0xb843ac1d, 0xf7ba39b3, 0xb82e0549, 0xc08cb6f5, 0xb818698a, 0xf7886442, 0xb802d8e0, 0xc0935d64, -0xb7ed5351, 0xf756940a, 0xb7d7d8df, 0xc09a2af3, 0xb7c2698e, 0xf724c92a, 0xb7ad0561, 0xc0a11f9d, -0xb797ac5b, 0xf6f303c0, 0xb7825e80, 0xc0a83b5e, 0xb76d1bd2, 0xf6c143ec, 0xb757e455, 0xc0af7e33, -0xb742b80d, 0xf68f89cb, 0xb72d96fd, 0xc0b6e815, 0xb7188127, 0xf65dd57d, 0xb7037690, 0xc0be7901, -0xb6ee773a, 0xf62c2721, 0xb6d98328, 0xc0c630f2, 0xb6c49a5e, 0xf5fa7ed4, 0xb6afbce0, 0xc0ce0fe3, -0xb69aeab0, 0xf5c8dcb6, 0xb68623d1, 0xc0d615cf, 0xb6716847, 0xf59740e5, 0xb65cb815, 0xc0de42b2, -0xb648133e, 0xf565ab80, 0xb63379c5, 0xc0e69686, 0xb61eebae, 0xf5341ca5, 0xb60a68fb, 0xc0ef1147, -0xb5f5f1b1, 0xf5029473, 0xb5e185d1, 0xc0f7b2ee, 0xb5cd255f, 0xf4d11308, 0xb5b8d05f, 0xc1007b77, -0xb5a486d2, 0xf49f9884, 0xb59048be, 0xc1096add, 0xb57c1624, 0xf46e2504, 0xb567ef08, 0xc1128119, -0xb553d36c, 0xf43cb8a7, 0xb53fc355, 0xc11bbe26, 0xb52bbec4, 0xf40b538b, 0xb517c5be, 0xc12521ff, -0xb503d845, 0xf3d9f5cf, 0xb4eff65c, 0xc12eac9d, 0xb4dc2007, 0xf3a89f92, 0xb4c85548, 0xc1385dfb, -0xb4b49622, 0xf37750f2, 0xb4a0e299, 0xc1423613, 0xb48d3ab0, 0xf3460a0d, 0xb4799e69, 0xc14c34df, -0xb4660dc8, 0xf314cb02, 0xb45288cf, 0xc1565a58, 0xb43f0f82, 0xf2e393ef, 0xb42ba1e4, 0xc160a678, -0xb4183ff7, 0xf2b264f2, 0xb404e9bf, 0xc16b193a, 0xb3f19f3e, 0xf2813e2a, 0xb3de6078, 0xc175b296, -0xb3cb2d70, 0xf2501fb5, 0xb3b80628, 0xc1807285, 0xb3a4eaa4, 0xf21f09b1, 0xb391dae6, 0xc18b5903, -0xb37ed6f1, 0xf1edfc3d, 0xb36bdec9, 0xc1966606, 0xb358f26f, 0xf1bcf777, 0xb34611e8, 0xc1a1998a, -0xb3333d36, 0xf18bfb7d, 0xb320745c, 0xc1acf386, 0xb30db75d, 0xf15b086d, 0xb2fb063b, 0xc1b873f5, -0xb2e860fa, 0xf12a1e66, 0xb2d5c79d, 0xc1c41ace, 0xb2c33a26, 0xf0f93d86, 0xb2b0b898, 0xc1cfe80a, -0xb29e42f6, 0xf0c865ea, 0xb28bd943, 0xc1dbdba3, 0xb2797b82, 0xf09797b2, 0xb26729b5, 0xc1e7f591, -0xb254e3e0, 0xf066d2fa, 0xb242aa05, 0xc1f435cc, 0xb2307c27, 0xf03617e2, 0xb21e5a49, 0xc2009c4e, -0xb20c446d, 0xf0056687, 0xb1fa3a97, 0xc20d290d, 0xb1e83cc9, 0xefd4bf08, 0xb1d64b06, 0xc219dc03, -0xb1c46551, 0xefa42181, 0xb1b28bad, 0xc226b528, 0xb1a0be1b, 0xef738e12, 0xb18efca0, 0xc233b473, -0xb17d473d, 0xef4304d8, 0xb16b9df6, 0xc240d9de, 0xb15a00cd, 0xef1285f2, 0xb1486fc5, 0xc24e255e, -0xb136eae1, 0xeee2117c, 0xb1257223, 0xc25b96ee, 0xb114058e, 0xeeb1a796, 0xb102a524, 0xc2692e83, -0xb0f150e9, 0xee81485c, 0xb0e008e0, 0xc276ec16, 0xb0cecd09, 0xee50f3ed, 0xb0bd9d6a, 0xc284cf9f, -0xb0ac7a03, 0xee20aa67, 0xb09b62d8, 0xc292d914, 0xb08a57eb, 0xedf06be6, 0xb079593f, 0xc2a1086d, -0xb06866d7, 0xedc0388a, 0xb05780b5, 0xc2af5da2, 0xb046a6db, 0xed901070, 0xb035d94e, 0xc2bdd8a9, -0xb025180e, 0xed5ff3b5, 0xb014631e, 0xc2cc7979, 0xb003ba82, 0xed2fe277, 0xaff31e3b, 0xc2db400a, -0xafe28e4d, 0xecffdcd4, 0xafd20ab9, 0xc2ea2c53, 0xafc19383, 0xeccfe2ea, 0xafb128ad, 0xc2f93e4a, -0xafa0ca39, 0xec9ff4d6, 0xaf90782a, 0xc30875e5, 0xaf803283, 0xec7012b5, 0xaf6ff945, 0xc317d31c, -0xaf5fcc74, 0xec403ca5, 0xaf4fac12, 0xc32755e5, 0xaf3f9822, 0xec1072c4, 0xaf2f90a5, 0xc336fe37, -0xaf1f959f, 0xebe0b52f, 0xaf0fa712, 0xc346cc07, 0xaeffc500, 0xebb10404, 0xaeefef6c, 0xc356bf4d, -0xaee02658, 0xeb815f60, 0xaed069c7, 0xc366d7fd, 0xaec0b9bb, 0xeb51c760, 0xaeb11636, 0xc377160f, -0xaea17f3b, 0xeb223c22, 0xae91f4cd, 0xc3877978, 0xae8276ed, 0xeaf2bdc3, 0xae73059f, 0xc398022f, -0xae63a0e3, 0xeac34c60, 0xae5448be, 0xc3a8b028, 0xae44fd31, 0xea93e817, 0xae35be3f, 0xc3b9835a, -0xae268be9, 0xea649105, 0xae176633, 0xc3ca7bba, 0xae084d1f, 0xea354746, 0xadf940ae, 0xc3db993e, -0xadea40e4, 0xea060af9, 0xaddb4dc2, 0xc3ecdbdc, 0xadcc674b, 0xe9d6dc3b, 0xadbd8d82, 0xc3fe4388, -0xadaec067, 0xe9a7bb28, 0xad9fffff, 0xc40fd037, 0xad914c4b, 0xe978a7dd, 0xad82a54c, 0xc42181e0, -0xad740b07, 0xe949a278, 0xad657d7c, 0xc4335877, 0xad56fcaf, 0xe91aab16, 0xad4888a0, 0xc44553f2, -0xad3a2153, 0xe8ebc1d3, 0xad2bc6ca, 0xc4577444, 0xad1d7907, 0xe8bce6cd, 0xad0f380c, 0xc469b963, -0xad0103db, 0xe88e1a20, 0xacf2dc77, 0xc47c2344, 0xace4c1e2, 0xe85f5be9, 0xacd6b41e, 0xc48eb1db, -0xacc8b32c, 0xe830ac45, 0xacbabf10, 0xc4a1651c, 0xacacd7cb, 0xe8020b52, 0xac9efd60, 0xc4b43cfd, -0xac912fd1, 0xe7d3792b, 0xac836f1f, 0xc4c73972, 0xac75bb4d, 0xe7a4f5ed, 0xac68145d, 0xc4da5a6f, -0xac5a7a52, 0xe77681b6, 0xac4ced2c, 0xc4ed9fe7, 0xac3f6cef, 0xe7481ca1, 0xac31f99d, 0xc50109d0, -0xac249336, 0xe719c6cb, 0xac1739bf, 0xc514981d, 0xac09ed38, 0xe6eb8052, 0xabfcada3, 0xc5284ac3, -0xabef7b04, 0xe6bd4951, 0xabe2555b, 0xc53c21b4, 0xabd53caa, 0xe68f21e5, 0xabc830f5, 0xc5501ce5, -0xabbb323c, 0xe6610a2a, 0xabae4082, 0xc5643c4a, 0xaba15bc9, 0xe633023e, 0xab948413, 0xc5787fd6, -0xab87b962, 0xe6050a3b, 0xab7afbb7, 0xc58ce77c, 0xab6e4b15, 0xe5d72240, 0xab61a77d, 0xc5a17330, -0xab5510f3, 0xe5a94a67, 0xab488776, 0xc5b622e6, 0xab3c0b0b, 0xe57b82cd, 0xab2f9bb1, 0xc5caf690, -0xab23396c, 0xe54dcb8f, 0xab16e43d, 0xc5dfee22, 0xab0a9c27, 0xe52024c9, 0xaafe612a, 0xc5f5098f, -0xaaf23349, 0xe4f28e96, 0xaae61286, 0xc60a48c9, 0xaad9fee3, 0xe4c50914, 0xaacdf861, 0xc61fabc4, -0xaac1ff03, 0xe497945d, 0xaab612ca, 0xc6353273, 0xaaaa33b8, 0xe46a308f, 0xaa9e61cf, 0xc64adcc7, -0xaa929d10, 0xe43cddc4, 0xaa86e57e, 0xc660aab5, 0xaa7b3b1b, 0xe40f9c1a, 0xaa6f9de7, 0xc6769c2e, -0xaa640de6, 0xe3e26bac, 0xaa588b18, 0xc68cb124, 0xaa4d157f, 0xe3b54c95, 0xaa41ad1e, 0xc6a2e98b, -0xaa3651f6, 0xe3883ef2, 0xaa2b0409, 0xc6b94554, 0xaa1fc358, 0xe35b42df, 0xaa148fe6, 0xc6cfc472, -0xaa0969b3, 0xe32e5876, 0xa9fe50c2, 0xc6e666d7, 0xa9f34515, 0xe3017fd5, 0xa9e846ad, 0xc6fd2c75, -0xa9dd558b, 0xe2d4b916, 0xa9d271b2, 0xc714153e, 0xa9c79b23, 0xe2a80456, 0xa9bcd1e0, 0xc72b2123, -0xa9b215ea, 0xe27b61af, 0xa9a76744, 0xc7425016, 0xa99cc5ee, 0xe24ed13d, 0xa99231eb, 0xc759a20a, -0xa987ab3c, 0xe222531c, 0xa97d31e3, 0xc77116f0, 0xa972c5e1, 0xe1f5e768, 0xa9686738, 0xc788aeb9, -0xa95e15e9, 0xe1c98e3b, 0xa953d1f7, 0xc7a06957, 0xa9499b62, 0xe19d47b1, 0xa93f722c, 0xc7b846ba, -0xa9355658, 0xe17113e5, 0xa92b47e5, 0xc7d046d6, 0xa92146d7, 0xe144f2f3, 0xa917532e, 0xc7e8699a, -0xa90d6cec, 0xe118e4f6, 0xa9039413, 0xc800aef7, 0xa8f9c8a4, 0xe0ecea09, 0xa8f00aa0, 0xc81916df, -0xa8e65a0a, 0xe0c10247, 0xa8dcb6e2, 0xc831a143, 0xa8d3212a, 0xe0952dcb, 0xa8c998e3, 0xc84a4e14, -0xa8c01e10, 0xe0696cb0, 0xa8b6b0b1, 0xc8631d42, 0xa8ad50c8, 0xe03dbf11, 0xa8a3fe57, 0xc87c0ebd, -0xa89ab95e, 0xe012250a, 0xa89181df, 0xc8952278, 0xa88857dc, 0xdfe69eb4, 0xa87f3b57, 0xc8ae5862, -0xa8762c4f, 0xdfbb2c2c, 0xa86d2ac8, 0xc8c7b06b, 0xa86436c2, 0xdf8fcd8b, 0xa85b503e, 0xc8e12a84, -0xa852773f, 0xdf6482ed, 0xa849abc4, 0xc8fac69e, 0xa840edd1, 0xdf394c6b, 0xa8383d66, 0xc91484a8, -0xa82f9a84, 0xdf0e2a22, 0xa827052d, 0xc92e6492, 0xa81e7d62, 0xdee31c2b, 0xa8160324, 0xc948664d, -0xa80d9675, 0xdeb822a1, 0xa8053756, 0xc96289c9, 0xa7fce5c9, 0xde8d3d9e, 0xa7f4a1ce, 0xc97ccef5, -0xa7ec6b66, 0xde626d3e, 0xa7e44294, 0xc99735c2, 0xa7dc2759, 0xde37b199, 0xa7d419b4, 0xc9b1be1e, -0xa7cc19a9, 0xde0d0acc, 0xa7c42738, 0xc9cc67fa, 0xa7bc4262, 0xdde278ef, 0xa7b46b29, 0xc9e73346, -0xa7aca18e, 0xddb7fc1e, 0xa7a4e591, 0xca021fef, 0xa79d3735, 0xdd8d9472, 0xa795967a, 0xca1d2de7, -0xa78e0361, 0xdd634206, 0xa7867dec, 0xca385d1d, 0xa77f061c, 0xdd3904f4, 0xa7779bf2, 0xca53ad7e, -0xa7703f70, 0xdd0edd55, 0xa768f095, 0xca6f1efc, 0xa761af64, 0xdce4cb44, 0xa75a7bdd, 0xca8ab184, -0xa7535602, 0xdcbacedb, 0xa74c3dd4, 0xcaa66506, 0xa7453353, 0xdc90e834, 0xa73e3681, 0xcac23971, -0xa7374760, 0xdc671768, 0xa73065ef, 0xcade2eb3, 0xa7299231, 0xdc3d5c91, 0xa722cc25, 0xcafa44bc, -0xa71c13ce, 0xdc13b7c9, 0xa715692c, 0xcb167b79, 0xa70ecc41, 0xdbea292b, 0xa7083d0d, 0xcb32d2da, -0xa701bb91, 0xdbc0b0ce, 0xa6fb47ce, 0xcb4f4acd, 0xa6f4e1c6, 0xdb974ece, 0xa6ee8979, 0xcb6be341, -0xa6e83ee8, 0xdb6e0342, 0xa6e20214, 0xcb889c23, 0xa6dbd2ff, 0xdb44ce46, 0xa6d5b1a9, 0xcba57563, -0xa6cf9e13, 0xdb1baff2, 0xa6c9983e, 0xcbc26eee, 0xa6c3a02b, 0xdaf2a860, 0xa6bdb5da, 0xcbdf88b3, -0xa6b7d94e, 0xdac9b7a9, 0xa6b20a86, 0xcbfcc29f, 0xa6ac4984, 0xdaa0dde7, 0xa6a69649, 0xcc1a1ca0, -0xa6a0f0d5, 0xda781b31, 0xa69b5929, 0xcc3796a5, 0xa695cf46, 0xda4f6fa3, 0xa690532d, 0xcc55309b, -0xa68ae4df, 0xda26db54, 0xa685845c, 0xcc72ea70, 0xa68031a6, 0xd9fe5e5e, 0xa67aecbd, 0xcc90c412, -0xa675b5a3, 0xd9d5f8d9, 0xa6708c57, 0xccaebd6e, 0xa66b70db, 0xd9adaadf, 0xa6666330, 0xccccd671, -0xa6616355, 0xd9857489, 0xa65c714d, 0xcceb0f0a, 0xa6578d18, 0xd95d55ef, 0xa652b6b6, 0xcd096725, -0xa64dee28, 0xd9354f2a, 0xa6493370, 0xcd27deb0, 0xa644868d, 0xd90d6053, 0xa63fe781, 0xcd467599, -0xa63b564c, 0xd8e58982, 0xa636d2ee, 0xcd652bcb, 0xa6325d6a, 0xd8bdcad0, 0xa62df5bf, 0xcd840134, -0xa6299bed, 0xd8962456, 0xa6254ff7, 0xcda2f5c2, 0xa62111db, 0xd86e962b, 0xa61ce19c, 0xcdc20960, -0xa618bf39, 0xd8472069, 0xa614aab3, 0xcde13bfd, 0xa610a40c, 0xd81fc328, 0xa60cab43, 0xce008d84, -0xa608c058, 0xd7f87e7f, 0xa604e34e, 0xce1ffde2, 0xa6011424, 0xd7d15288, 0xa5fd52db, 0xce3f8d05, -0xa5f99f73, 0xd7aa3f5a, 0xa5f5f9ed, 0xce5f3ad8, 0xa5f2624a, 0xd783450d, 0xa5eed88a, 0xce7f0748, -0xa5eb5cae, 0xd75c63ba, 0xa5e7eeb6, 0xce9ef241, 0xa5e48ea3, 0xd7359b78, 0xa5e13c75, 0xcebefbb0, -0xa5ddf82d, 0xd70eec60, 0xa5dac1cb, 0xcedf2380, 0xa5d79950, 0xd6e85689, 0xa5d47ebc, 0xceff699f, -0xa5d17210, 0xd6c1da0b, 0xa5ce734d, 0xcf1fcdf8, 0xa5cb8272, 0xd69b76fe, 0xa5c89f80, 0xcf405077, -0xa5c5ca77, 0xd6752d79, 0xa5c30359, 0xcf60f108, 0xa5c04a25, 0xd64efd94, 0xa5bd9edc, 0xcf81af97, -0xa5bb017f, 0xd628e767, 0xa5b8720d, 0xcfa28c10, 0xa5b5f087, 0xd602eb0a, 0xa5b37cee, 0xcfc3865e, -0xa5b11741, 0xd5dd0892, 0xa5aebf82, 0xcfe49e6d, 0xa5ac75b0, 0xd5b74019, 0xa5aa39cd, 0xd005d42a, -0xa5a80bd7, 0xd59191b5, 0xa5a5ebd0, 0xd027277e, 0xa5a3d9b8, 0xd56bfd7d, 0xa5a1d590, 0xd0489856, -0xa59fdf57, 0xd5468389, 0xa59df70e, 0xd06a269d, 0xa59c1cb5, 0xd52123f0, 0xa59a504c, 0xd08bd23f, -0xa59891d4, 0xd4fbdec9, 0xa596e14e, 0xd0ad9b26, 0xa5953eb8, 0xd4d6b42b, 0xa593aa14, 0xd0cf813e, -0xa5922362, 0xd4b1a42c, 0xa590aaa2, 0xd0f18472, 0xa58f3fd4, 0xd48caee4, 0xa58de2f8, 0xd113a4ad, -0xa58c940f, 0xd467d469, 0xa58b5319, 0xd135e1d9, 0xa58a2016, 0xd44314d3, 0xa588fb06, 0xd1583be2, -0xa587e3ea, 0xd41e7037, 0xa586dac1, 0xd17ab2b3, 0xa585df8c, 0xd3f9e6ad, 0xa584f24b, 0xd19d4636, -0xa58412fe, 0xd3d5784a, 0xa58341a5, 0xd1bff656, 0xa5827e40, 0xd3b12526, 0xa581c8d0, 0xd1e2c2fd, -0xa5812154, 0xd38ced57, 0xa58087cd, 0xd205ac17, 0xa57ffc3b, 0xd368d0f3, 0xa57f7e9d, 0xd228b18d, -0xa57f0ef5, 0xd344d011, 0xa57ead41, 0xd24bd34a, 0xa57e5982, 0xd320eac6, 0xa57e13b8, 0xd26f1138, -0xa57ddbe4, 0xd2fd2129, 0xa57db204, 0xd2926b41, 0xa57d961a, 0xd2d97350, 0xa57d8825, 0xd2b5e151, +#if defined(PICO_RP2040) || defined(PICO_RP2350) +#define DPROGMEM __attribute__(( section(".time_critical.data") )) +#else +#define DPROGMEM PROGMEM +#endif + +const int cos4sin4tabOffset[NUM_IMDCT_SIZES] DPROGMEM = {0, 128}; + +/* PreMultiply() tables + format = Q30 * 2^[-7, -10] for nmdct = [128, 1024] + reordered for sequential access + + invM = -1.0 / nmdct; + for (i = 0; i < nmdct/4; i++) { + angle = (i + 0.25) * M_PI / nmdct; + x = invM * (cos(angle) + sin(angle)); + x = invM * sin(angle); + + angle = (nmdct/2 - 1 - i + 0.25) * M_PI / nmdct; + x = invM * (cos(angle) + sin(angle)); + x = invM * sin(angle); + } +*/ +const int cos4sin4tab[128 + 1024] DPROGMEM = { + /* 128 - format = Q30 * 2^-7 */ + 0xbf9bc731, 0xff9b783c, 0xbed5332c, 0xc002c697, 0xbe112251, 0xfe096c8d, 0xbd4f9c30, 0xc00f1c4a, + 0xbc90a83f, 0xfc77ae5e, 0xbbd44dd9, 0xc0254e27, 0xbb1a9443, 0xfae67ba2, 0xba6382a6, 0xc04558c0, + 0xb9af200f, 0xf9561237, 0xb8fd7373, 0xc06f3726, 0xb84e83ac, 0xf7c6afdc, 0xb7a25779, 0xc0a2e2e3, + 0xb6f8f57c, 0xf6389228, 0xb652643e, 0xc0e05401, 0xb5aeaa2a, 0xf4abf67e, 0xb50dcd90, 0xc1278104, + 0xb46fd4a4, 0xf3211a07, 0xb3d4c57c, 0xc1785ef4, 0xb33ca614, 0xf19839a6, 0xb2a77c49, 0xc1d2e158, + 0xb2154dda, 0xf01191f3, 0xb186206b, 0xc236fa3b, 0xb0f9f981, 0xee8d5f29, 0xb070de82, 0xc2a49a2e, + 0xafead4b9, 0xed0bdd25, 0xaf67e14f, 0xc31bb049, 0xaee80952, 0xeb8d475b, 0xae6b51ae, 0xc39c2a2f, + 0xadf1bf34, 0xea11d8c8, 0xad7b5692, 0xc425f410, 0xad081c5a, 0xe899cbf1, 0xac9814fd, 0xc4b8f8ad, + 0xac2b44cc, 0xe7255ad1, 0xabc1aff9, 0xc555215a, 0xab5b5a96, 0xe5b4bed8, 0xaaf84896, 0xc5fa5603, + 0xaa987dca, 0xe44830dd, 0xaa3bfde3, 0xc6a87d2d, 0xa9e2cc73, 0xe2dfe917, 0xa98cece9, 0xc75f7bfe, + 0xa93a6296, 0xe17c1f15, 0xa8eb30a7, 0xc81f363d, 0xa89f5a2b, 0xe01d09b4, 0xa856e20e, 0xc8e78e5b, + 0xa811cb1b, 0xdec2df18, 0xa7d017fc, 0xc9b86572, 0xa791cb39, 0xdd6dd4a2, 0xa756e73a, 0xca919b4e, + 0xa71f6e43, 0xdc1e1ee9, 0xa6eb6279, 0xcb730e70, 0xa6bac5dc, 0xdad3f1b1, 0xa68d9a4c, 0xcc5c9c14, + 0xa663e188, 0xd98f7fe6, 0xa63d9d2b, 0xcd4e2037, 0xa61aceaf, 0xd850fb8e, 0xa5fb776b, 0xce47759a, + 0xa5df9894, 0xd71895c9, 0xa5c7333e, 0xcf4875ca, 0xa5b2485a, 0xd5e67ec1, 0xa5a0d8b5, 0xd050f926, + 0xa592e4fd, 0xd4bae5ab, 0xa5886dba, 0xd160d6e5, 0xa5817354, 0xd395f8ba, 0xa57df60f, 0xd277e518, + /* 1024 - format = Q30 * 2^-10 */ + 0xbff3703e, 0xfff36f02, 0xbfda5824, 0xc0000b1a, 0xbfc149ed, 0xffc12b16, 0xbfa845a0, 0xc0003c74, + 0xbf8f4b3e, 0xff8ee750, 0xbf765acc, 0xc0009547, 0xbf5d744e, 0xff5ca3d0, 0xbf4497c8, 0xc0011594, + 0xbf2bc53d, 0xff2a60b4, 0xbf12fcb2, 0xc001bd5c, 0xbefa3e2a, 0xfef81e1d, 0xbee189a8, 0xc0028c9c, + 0xbec8df32, 0xfec5dc28, 0xbeb03eca, 0xc0038356, 0xbe97a875, 0xfe939af5, 0xbe7f1c36, 0xc004a188, + 0xbe669a10, 0xfe615aa3, 0xbe4e2209, 0xc005e731, 0xbe35b423, 0xfe2f1b50, 0xbe1d5062, 0xc0075452, + 0xbe04f6cb, 0xfdfcdd1d, 0xbdeca760, 0xc008e8e8, 0xbdd46225, 0xfdcaa027, 0xbdbc2720, 0xc00aa4f3, + 0xbda3f652, 0xfd98648d, 0xbd8bcfbf, 0xc00c8872, 0xbd73b36d, 0xfd662a70, 0xbd5ba15d, 0xc00e9364, + 0xbd439995, 0xfd33f1ed, 0xbd2b9c17, 0xc010c5c7, 0xbd13a8e7, 0xfd01bb24, 0xbcfbc00a, 0xc0131f9b, + 0xbce3e182, 0xfccf8634, 0xbccc0d53, 0xc015a0dd, 0xbcb44382, 0xfc9d533b, 0xbc9c8411, 0xc018498c, + 0xbc84cf05, 0xfc6b2259, 0xbc6d2461, 0xc01b19a7, 0xbc558428, 0xfc38f3ac, 0xbc3dee5f, 0xc01e112b, + 0xbc266309, 0xfc06c754, 0xbc0ee22a, 0xc0213018, 0xbbf76bc4, 0xfbd49d70, 0xbbdfffdd, 0xc024766a, + 0xbbc89e77, 0xfba2761e, 0xbbb14796, 0xc027e421, 0xbb99fb3e, 0xfb70517d, 0xbb82b972, 0xc02b7939, + 0xbb6b8235, 0xfb3e2fac, 0xbb54558d, 0xc02f35b1, 0xbb3d337b, 0xfb0c10cb, 0xbb261c04, 0xc0331986, + 0xbb0f0f2b, 0xfad9f4f8, 0xbaf80cf4, 0xc03724b6, 0xbae11561, 0xfaa7dc52, 0xbaca2878, 0xc03b573f, + 0xbab3463b, 0xfa75c6f8, 0xba9c6eae, 0xc03fb11d, 0xba85a1d4, 0xfa43b508, 0xba6edfb1, 0xc044324f, + 0xba582849, 0xfa11a6a3, 0xba417b9e, 0xc048dad1, 0xba2ad9b5, 0xf9df9be6, 0xba144291, 0xc04daaa1, + 0xb9fdb635, 0xf9ad94f0, 0xb9e734a4, 0xc052a1bb, 0xb9d0bde4, 0xf97b91e1, 0xb9ba51f6, 0xc057c01d, + 0xb9a3f0de, 0xf94992d7, 0xb98d9aa0, 0xc05d05c3, 0xb9774f3f, 0xf91797f0, 0xb9610ebe, 0xc06272aa, + 0xb94ad922, 0xf8e5a14d, 0xb934ae6d, 0xc06806ce, 0xb91e8ea3, 0xf8b3af0c, 0xb90879c7, 0xc06dc22e, + 0xb8f26fdc, 0xf881c14b, 0xb8dc70e7, 0xc073a4c3, 0xb8c67cea, 0xf84fd829, 0xb8b093ea, 0xc079ae8c, + 0xb89ab5e8, 0xf81df3c5, 0xb884e2e9, 0xc07fdf85, 0xb86f1af0, 0xf7ec143e, 0xb8595e00, 0xc08637a9, + 0xb843ac1d, 0xf7ba39b3, 0xb82e0549, 0xc08cb6f5, 0xb818698a, 0xf7886442, 0xb802d8e0, 0xc0935d64, + 0xb7ed5351, 0xf756940a, 0xb7d7d8df, 0xc09a2af3, 0xb7c2698e, 0xf724c92a, 0xb7ad0561, 0xc0a11f9d, + 0xb797ac5b, 0xf6f303c0, 0xb7825e80, 0xc0a83b5e, 0xb76d1bd2, 0xf6c143ec, 0xb757e455, 0xc0af7e33, + 0xb742b80d, 0xf68f89cb, 0xb72d96fd, 0xc0b6e815, 0xb7188127, 0xf65dd57d, 0xb7037690, 0xc0be7901, + 0xb6ee773a, 0xf62c2721, 0xb6d98328, 0xc0c630f2, 0xb6c49a5e, 0xf5fa7ed4, 0xb6afbce0, 0xc0ce0fe3, + 0xb69aeab0, 0xf5c8dcb6, 0xb68623d1, 0xc0d615cf, 0xb6716847, 0xf59740e5, 0xb65cb815, 0xc0de42b2, + 0xb648133e, 0xf565ab80, 0xb63379c5, 0xc0e69686, 0xb61eebae, 0xf5341ca5, 0xb60a68fb, 0xc0ef1147, + 0xb5f5f1b1, 0xf5029473, 0xb5e185d1, 0xc0f7b2ee, 0xb5cd255f, 0xf4d11308, 0xb5b8d05f, 0xc1007b77, + 0xb5a486d2, 0xf49f9884, 0xb59048be, 0xc1096add, 0xb57c1624, 0xf46e2504, 0xb567ef08, 0xc1128119, + 0xb553d36c, 0xf43cb8a7, 0xb53fc355, 0xc11bbe26, 0xb52bbec4, 0xf40b538b, 0xb517c5be, 0xc12521ff, + 0xb503d845, 0xf3d9f5cf, 0xb4eff65c, 0xc12eac9d, 0xb4dc2007, 0xf3a89f92, 0xb4c85548, 0xc1385dfb, + 0xb4b49622, 0xf37750f2, 0xb4a0e299, 0xc1423613, 0xb48d3ab0, 0xf3460a0d, 0xb4799e69, 0xc14c34df, + 0xb4660dc8, 0xf314cb02, 0xb45288cf, 0xc1565a58, 0xb43f0f82, 0xf2e393ef, 0xb42ba1e4, 0xc160a678, + 0xb4183ff7, 0xf2b264f2, 0xb404e9bf, 0xc16b193a, 0xb3f19f3e, 0xf2813e2a, 0xb3de6078, 0xc175b296, + 0xb3cb2d70, 0xf2501fb5, 0xb3b80628, 0xc1807285, 0xb3a4eaa4, 0xf21f09b1, 0xb391dae6, 0xc18b5903, + 0xb37ed6f1, 0xf1edfc3d, 0xb36bdec9, 0xc1966606, 0xb358f26f, 0xf1bcf777, 0xb34611e8, 0xc1a1998a, + 0xb3333d36, 0xf18bfb7d, 0xb320745c, 0xc1acf386, 0xb30db75d, 0xf15b086d, 0xb2fb063b, 0xc1b873f5, + 0xb2e860fa, 0xf12a1e66, 0xb2d5c79d, 0xc1c41ace, 0xb2c33a26, 0xf0f93d86, 0xb2b0b898, 0xc1cfe80a, + 0xb29e42f6, 0xf0c865ea, 0xb28bd943, 0xc1dbdba3, 0xb2797b82, 0xf09797b2, 0xb26729b5, 0xc1e7f591, + 0xb254e3e0, 0xf066d2fa, 0xb242aa05, 0xc1f435cc, 0xb2307c27, 0xf03617e2, 0xb21e5a49, 0xc2009c4e, + 0xb20c446d, 0xf0056687, 0xb1fa3a97, 0xc20d290d, 0xb1e83cc9, 0xefd4bf08, 0xb1d64b06, 0xc219dc03, + 0xb1c46551, 0xefa42181, 0xb1b28bad, 0xc226b528, 0xb1a0be1b, 0xef738e12, 0xb18efca0, 0xc233b473, + 0xb17d473d, 0xef4304d8, 0xb16b9df6, 0xc240d9de, 0xb15a00cd, 0xef1285f2, 0xb1486fc5, 0xc24e255e, + 0xb136eae1, 0xeee2117c, 0xb1257223, 0xc25b96ee, 0xb114058e, 0xeeb1a796, 0xb102a524, 0xc2692e83, + 0xb0f150e9, 0xee81485c, 0xb0e008e0, 0xc276ec16, 0xb0cecd09, 0xee50f3ed, 0xb0bd9d6a, 0xc284cf9f, + 0xb0ac7a03, 0xee20aa67, 0xb09b62d8, 0xc292d914, 0xb08a57eb, 0xedf06be6, 0xb079593f, 0xc2a1086d, + 0xb06866d7, 0xedc0388a, 0xb05780b5, 0xc2af5da2, 0xb046a6db, 0xed901070, 0xb035d94e, 0xc2bdd8a9, + 0xb025180e, 0xed5ff3b5, 0xb014631e, 0xc2cc7979, 0xb003ba82, 0xed2fe277, 0xaff31e3b, 0xc2db400a, + 0xafe28e4d, 0xecffdcd4, 0xafd20ab9, 0xc2ea2c53, 0xafc19383, 0xeccfe2ea, 0xafb128ad, 0xc2f93e4a, + 0xafa0ca39, 0xec9ff4d6, 0xaf90782a, 0xc30875e5, 0xaf803283, 0xec7012b5, 0xaf6ff945, 0xc317d31c, + 0xaf5fcc74, 0xec403ca5, 0xaf4fac12, 0xc32755e5, 0xaf3f9822, 0xec1072c4, 0xaf2f90a5, 0xc336fe37, + 0xaf1f959f, 0xebe0b52f, 0xaf0fa712, 0xc346cc07, 0xaeffc500, 0xebb10404, 0xaeefef6c, 0xc356bf4d, + 0xaee02658, 0xeb815f60, 0xaed069c7, 0xc366d7fd, 0xaec0b9bb, 0xeb51c760, 0xaeb11636, 0xc377160f, + 0xaea17f3b, 0xeb223c22, 0xae91f4cd, 0xc3877978, 0xae8276ed, 0xeaf2bdc3, 0xae73059f, 0xc398022f, + 0xae63a0e3, 0xeac34c60, 0xae5448be, 0xc3a8b028, 0xae44fd31, 0xea93e817, 0xae35be3f, 0xc3b9835a, + 0xae268be9, 0xea649105, 0xae176633, 0xc3ca7bba, 0xae084d1f, 0xea354746, 0xadf940ae, 0xc3db993e, + 0xadea40e4, 0xea060af9, 0xaddb4dc2, 0xc3ecdbdc, 0xadcc674b, 0xe9d6dc3b, 0xadbd8d82, 0xc3fe4388, + 0xadaec067, 0xe9a7bb28, 0xad9fffff, 0xc40fd037, 0xad914c4b, 0xe978a7dd, 0xad82a54c, 0xc42181e0, + 0xad740b07, 0xe949a278, 0xad657d7c, 0xc4335877, 0xad56fcaf, 0xe91aab16, 0xad4888a0, 0xc44553f2, + 0xad3a2153, 0xe8ebc1d3, 0xad2bc6ca, 0xc4577444, 0xad1d7907, 0xe8bce6cd, 0xad0f380c, 0xc469b963, + 0xad0103db, 0xe88e1a20, 0xacf2dc77, 0xc47c2344, 0xace4c1e2, 0xe85f5be9, 0xacd6b41e, 0xc48eb1db, + 0xacc8b32c, 0xe830ac45, 0xacbabf10, 0xc4a1651c, 0xacacd7cb, 0xe8020b52, 0xac9efd60, 0xc4b43cfd, + 0xac912fd1, 0xe7d3792b, 0xac836f1f, 0xc4c73972, 0xac75bb4d, 0xe7a4f5ed, 0xac68145d, 0xc4da5a6f, + 0xac5a7a52, 0xe77681b6, 0xac4ced2c, 0xc4ed9fe7, 0xac3f6cef, 0xe7481ca1, 0xac31f99d, 0xc50109d0, + 0xac249336, 0xe719c6cb, 0xac1739bf, 0xc514981d, 0xac09ed38, 0xe6eb8052, 0xabfcada3, 0xc5284ac3, + 0xabef7b04, 0xe6bd4951, 0xabe2555b, 0xc53c21b4, 0xabd53caa, 0xe68f21e5, 0xabc830f5, 0xc5501ce5, + 0xabbb323c, 0xe6610a2a, 0xabae4082, 0xc5643c4a, 0xaba15bc9, 0xe633023e, 0xab948413, 0xc5787fd6, + 0xab87b962, 0xe6050a3b, 0xab7afbb7, 0xc58ce77c, 0xab6e4b15, 0xe5d72240, 0xab61a77d, 0xc5a17330, + 0xab5510f3, 0xe5a94a67, 0xab488776, 0xc5b622e6, 0xab3c0b0b, 0xe57b82cd, 0xab2f9bb1, 0xc5caf690, + 0xab23396c, 0xe54dcb8f, 0xab16e43d, 0xc5dfee22, 0xab0a9c27, 0xe52024c9, 0xaafe612a, 0xc5f5098f, + 0xaaf23349, 0xe4f28e96, 0xaae61286, 0xc60a48c9, 0xaad9fee3, 0xe4c50914, 0xaacdf861, 0xc61fabc4, + 0xaac1ff03, 0xe497945d, 0xaab612ca, 0xc6353273, 0xaaaa33b8, 0xe46a308f, 0xaa9e61cf, 0xc64adcc7, + 0xaa929d10, 0xe43cddc4, 0xaa86e57e, 0xc660aab5, 0xaa7b3b1b, 0xe40f9c1a, 0xaa6f9de7, 0xc6769c2e, + 0xaa640de6, 0xe3e26bac, 0xaa588b18, 0xc68cb124, 0xaa4d157f, 0xe3b54c95, 0xaa41ad1e, 0xc6a2e98b, + 0xaa3651f6, 0xe3883ef2, 0xaa2b0409, 0xc6b94554, 0xaa1fc358, 0xe35b42df, 0xaa148fe6, 0xc6cfc472, + 0xaa0969b3, 0xe32e5876, 0xa9fe50c2, 0xc6e666d7, 0xa9f34515, 0xe3017fd5, 0xa9e846ad, 0xc6fd2c75, + 0xa9dd558b, 0xe2d4b916, 0xa9d271b2, 0xc714153e, 0xa9c79b23, 0xe2a80456, 0xa9bcd1e0, 0xc72b2123, + 0xa9b215ea, 0xe27b61af, 0xa9a76744, 0xc7425016, 0xa99cc5ee, 0xe24ed13d, 0xa99231eb, 0xc759a20a, + 0xa987ab3c, 0xe222531c, 0xa97d31e3, 0xc77116f0, 0xa972c5e1, 0xe1f5e768, 0xa9686738, 0xc788aeb9, + 0xa95e15e9, 0xe1c98e3b, 0xa953d1f7, 0xc7a06957, 0xa9499b62, 0xe19d47b1, 0xa93f722c, 0xc7b846ba, + 0xa9355658, 0xe17113e5, 0xa92b47e5, 0xc7d046d6, 0xa92146d7, 0xe144f2f3, 0xa917532e, 0xc7e8699a, + 0xa90d6cec, 0xe118e4f6, 0xa9039413, 0xc800aef7, 0xa8f9c8a4, 0xe0ecea09, 0xa8f00aa0, 0xc81916df, + 0xa8e65a0a, 0xe0c10247, 0xa8dcb6e2, 0xc831a143, 0xa8d3212a, 0xe0952dcb, 0xa8c998e3, 0xc84a4e14, + 0xa8c01e10, 0xe0696cb0, 0xa8b6b0b1, 0xc8631d42, 0xa8ad50c8, 0xe03dbf11, 0xa8a3fe57, 0xc87c0ebd, + 0xa89ab95e, 0xe012250a, 0xa89181df, 0xc8952278, 0xa88857dc, 0xdfe69eb4, 0xa87f3b57, 0xc8ae5862, + 0xa8762c4f, 0xdfbb2c2c, 0xa86d2ac8, 0xc8c7b06b, 0xa86436c2, 0xdf8fcd8b, 0xa85b503e, 0xc8e12a84, + 0xa852773f, 0xdf6482ed, 0xa849abc4, 0xc8fac69e, 0xa840edd1, 0xdf394c6b, 0xa8383d66, 0xc91484a8, + 0xa82f9a84, 0xdf0e2a22, 0xa827052d, 0xc92e6492, 0xa81e7d62, 0xdee31c2b, 0xa8160324, 0xc948664d, + 0xa80d9675, 0xdeb822a1, 0xa8053756, 0xc96289c9, 0xa7fce5c9, 0xde8d3d9e, 0xa7f4a1ce, 0xc97ccef5, + 0xa7ec6b66, 0xde626d3e, 0xa7e44294, 0xc99735c2, 0xa7dc2759, 0xde37b199, 0xa7d419b4, 0xc9b1be1e, + 0xa7cc19a9, 0xde0d0acc, 0xa7c42738, 0xc9cc67fa, 0xa7bc4262, 0xdde278ef, 0xa7b46b29, 0xc9e73346, + 0xa7aca18e, 0xddb7fc1e, 0xa7a4e591, 0xca021fef, 0xa79d3735, 0xdd8d9472, 0xa795967a, 0xca1d2de7, + 0xa78e0361, 0xdd634206, 0xa7867dec, 0xca385d1d, 0xa77f061c, 0xdd3904f4, 0xa7779bf2, 0xca53ad7e, + 0xa7703f70, 0xdd0edd55, 0xa768f095, 0xca6f1efc, 0xa761af64, 0xdce4cb44, 0xa75a7bdd, 0xca8ab184, + 0xa7535602, 0xdcbacedb, 0xa74c3dd4, 0xcaa66506, 0xa7453353, 0xdc90e834, 0xa73e3681, 0xcac23971, + 0xa7374760, 0xdc671768, 0xa73065ef, 0xcade2eb3, 0xa7299231, 0xdc3d5c91, 0xa722cc25, 0xcafa44bc, + 0xa71c13ce, 0xdc13b7c9, 0xa715692c, 0xcb167b79, 0xa70ecc41, 0xdbea292b, 0xa7083d0d, 0xcb32d2da, + 0xa701bb91, 0xdbc0b0ce, 0xa6fb47ce, 0xcb4f4acd, 0xa6f4e1c6, 0xdb974ece, 0xa6ee8979, 0xcb6be341, + 0xa6e83ee8, 0xdb6e0342, 0xa6e20214, 0xcb889c23, 0xa6dbd2ff, 0xdb44ce46, 0xa6d5b1a9, 0xcba57563, + 0xa6cf9e13, 0xdb1baff2, 0xa6c9983e, 0xcbc26eee, 0xa6c3a02b, 0xdaf2a860, 0xa6bdb5da, 0xcbdf88b3, + 0xa6b7d94e, 0xdac9b7a9, 0xa6b20a86, 0xcbfcc29f, 0xa6ac4984, 0xdaa0dde7, 0xa6a69649, 0xcc1a1ca0, + 0xa6a0f0d5, 0xda781b31, 0xa69b5929, 0xcc3796a5, 0xa695cf46, 0xda4f6fa3, 0xa690532d, 0xcc55309b, + 0xa68ae4df, 0xda26db54, 0xa685845c, 0xcc72ea70, 0xa68031a6, 0xd9fe5e5e, 0xa67aecbd, 0xcc90c412, + 0xa675b5a3, 0xd9d5f8d9, 0xa6708c57, 0xccaebd6e, 0xa66b70db, 0xd9adaadf, 0xa6666330, 0xccccd671, + 0xa6616355, 0xd9857489, 0xa65c714d, 0xcceb0f0a, 0xa6578d18, 0xd95d55ef, 0xa652b6b6, 0xcd096725, + 0xa64dee28, 0xd9354f2a, 0xa6493370, 0xcd27deb0, 0xa644868d, 0xd90d6053, 0xa63fe781, 0xcd467599, + 0xa63b564c, 0xd8e58982, 0xa636d2ee, 0xcd652bcb, 0xa6325d6a, 0xd8bdcad0, 0xa62df5bf, 0xcd840134, + 0xa6299bed, 0xd8962456, 0xa6254ff7, 0xcda2f5c2, 0xa62111db, 0xd86e962b, 0xa61ce19c, 0xcdc20960, + 0xa618bf39, 0xd8472069, 0xa614aab3, 0xcde13bfd, 0xa610a40c, 0xd81fc328, 0xa60cab43, 0xce008d84, + 0xa608c058, 0xd7f87e7f, 0xa604e34e, 0xce1ffde2, 0xa6011424, 0xd7d15288, 0xa5fd52db, 0xce3f8d05, + 0xa5f99f73, 0xd7aa3f5a, 0xa5f5f9ed, 0xce5f3ad8, 0xa5f2624a, 0xd783450d, 0xa5eed88a, 0xce7f0748, + 0xa5eb5cae, 0xd75c63ba, 0xa5e7eeb6, 0xce9ef241, 0xa5e48ea3, 0xd7359b78, 0xa5e13c75, 0xcebefbb0, + 0xa5ddf82d, 0xd70eec60, 0xa5dac1cb, 0xcedf2380, 0xa5d79950, 0xd6e85689, 0xa5d47ebc, 0xceff699f, + 0xa5d17210, 0xd6c1da0b, 0xa5ce734d, 0xcf1fcdf8, 0xa5cb8272, 0xd69b76fe, 0xa5c89f80, 0xcf405077, + 0xa5c5ca77, 0xd6752d79, 0xa5c30359, 0xcf60f108, 0xa5c04a25, 0xd64efd94, 0xa5bd9edc, 0xcf81af97, + 0xa5bb017f, 0xd628e767, 0xa5b8720d, 0xcfa28c10, 0xa5b5f087, 0xd602eb0a, 0xa5b37cee, 0xcfc3865e, + 0xa5b11741, 0xd5dd0892, 0xa5aebf82, 0xcfe49e6d, 0xa5ac75b0, 0xd5b74019, 0xa5aa39cd, 0xd005d42a, + 0xa5a80bd7, 0xd59191b5, 0xa5a5ebd0, 0xd027277e, 0xa5a3d9b8, 0xd56bfd7d, 0xa5a1d590, 0xd0489856, + 0xa59fdf57, 0xd5468389, 0xa59df70e, 0xd06a269d, 0xa59c1cb5, 0xd52123f0, 0xa59a504c, 0xd08bd23f, + 0xa59891d4, 0xd4fbdec9, 0xa596e14e, 0xd0ad9b26, 0xa5953eb8, 0xd4d6b42b, 0xa593aa14, 0xd0cf813e, + 0xa5922362, 0xd4b1a42c, 0xa590aaa2, 0xd0f18472, 0xa58f3fd4, 0xd48caee4, 0xa58de2f8, 0xd113a4ad, + 0xa58c940f, 0xd467d469, 0xa58b5319, 0xd135e1d9, 0xa58a2016, 0xd44314d3, 0xa588fb06, 0xd1583be2, + 0xa587e3ea, 0xd41e7037, 0xa586dac1, 0xd17ab2b3, 0xa585df8c, 0xd3f9e6ad, 0xa584f24b, 0xd19d4636, + 0xa58412fe, 0xd3d5784a, 0xa58341a5, 0xd1bff656, 0xa5827e40, 0xd3b12526, 0xa581c8d0, 0xd1e2c2fd, + 0xa5812154, 0xd38ced57, 0xa58087cd, 0xd205ac17, 0xa57ffc3b, 0xd368d0f3, 0xa57f7e9d, 0xd228b18d, + 0xa57f0ef5, 0xd344d011, 0xa57ead41, 0xd24bd34a, 0xa57e5982, 0xd320eac6, 0xa57e13b8, 0xd26f1138, + 0xa57ddbe4, 0xd2fd2129, 0xa57db204, 0xd2926b41, 0xa57d961a, 0xd2d97350, 0xa57d8825, 0xd2b5e151, }; -/* PostMultiply() tables - * format = Q30 - * reordered for sequential access - * decimate (skip by 16 instead of 2) for small transform (128) - * - * for (i = 0; i <= (512/2); i++) { - * angle = i * M_PI / 1024; - * x = (cos(angle) + sin(angle)); - * x = sin(angle); - * } - */ -const int cos1sin1tab[514] PROGMEM = { -/* format = Q30 */ -0x40000000, 0x00000000, 0x40323034, 0x003243f1, 0x406438cf, 0x006487c4, 0x409619b2, 0x0096cb58, -0x40c7d2bd, 0x00c90e90, 0x40f963d3, 0x00fb514b, 0x412accd4, 0x012d936c, 0x415c0da3, 0x015fd4d2, -0x418d2621, 0x0192155f, 0x41be162f, 0x01c454f5, 0x41eeddaf, 0x01f69373, 0x421f7c84, 0x0228d0bb, -0x424ff28f, 0x025b0caf, 0x42803fb2, 0x028d472e, 0x42b063d0, 0x02bf801a, 0x42e05ecb, 0x02f1b755, -0x43103085, 0x0323ecbe, 0x433fd8e1, 0x03562038, 0x436f57c1, 0x038851a2, 0x439ead09, 0x03ba80df, -0x43cdd89a, 0x03ecadcf, 0x43fcda59, 0x041ed854, 0x442bb227, 0x0451004d, 0x445a5fe8, 0x0483259d, -0x4488e37f, 0x04b54825, 0x44b73ccf, 0x04e767c5, 0x44e56bbd, 0x0519845e, 0x4513702a, 0x054b9dd3, -0x454149fc, 0x057db403, 0x456ef916, 0x05afc6d0, 0x459c7d5a, 0x05e1d61b, 0x45c9d6af, 0x0613e1c5, -0x45f704f7, 0x0645e9af, 0x46240816, 0x0677edbb, 0x4650dff1, 0x06a9edc9, 0x467d8c6d, 0x06dbe9bb, -0x46aa0d6d, 0x070de172, 0x46d662d6, 0x073fd4cf, 0x47028c8d, 0x0771c3b3, 0x472e8a76, 0x07a3adff, -0x475a5c77, 0x07d59396, 0x47860275, 0x08077457, 0x47b17c54, 0x08395024, 0x47dcc9f9, 0x086b26de, -0x4807eb4b, 0x089cf867, 0x4832e02d, 0x08cec4a0, 0x485da887, 0x09008b6a, 0x4888443d, 0x09324ca7, -0x48b2b335, 0x09640837, 0x48dcf556, 0x0995bdfd, 0x49070a84, 0x09c76dd8, 0x4930f2a6, 0x09f917ac, -0x495aada2, 0x0a2abb59, 0x49843b5f, 0x0a5c58c0, 0x49ad9bc2, 0x0a8defc3, 0x49d6ceb3, 0x0abf8043, -0x49ffd417, 0x0af10a22, 0x4a28abd6, 0x0b228d42, 0x4a5155d6, 0x0b540982, 0x4a79d1ff, 0x0b857ec7, -0x4aa22036, 0x0bb6ecef, 0x4aca4065, 0x0be853de, 0x4af23270, 0x0c19b374, 0x4b19f641, 0x0c4b0b94, -0x4b418bbe, 0x0c7c5c1e, 0x4b68f2cf, 0x0cada4f5, 0x4b902b5c, 0x0cdee5f9, 0x4bb7354d, 0x0d101f0e, -0x4bde1089, 0x0d415013, 0x4c04bcf8, 0x0d7278eb, 0x4c2b3a84, 0x0da39978, 0x4c518913, 0x0dd4b19a, -0x4c77a88e, 0x0e05c135, 0x4c9d98de, 0x0e36c82a, 0x4cc359ec, 0x0e67c65a, 0x4ce8eb9f, 0x0e98bba7, -0x4d0e4de2, 0x0ec9a7f3, 0x4d33809c, 0x0efa8b20, 0x4d5883b7, 0x0f2b650f, 0x4d7d571c, 0x0f5c35a3, -0x4da1fab5, 0x0f8cfcbe, 0x4dc66e6a, 0x0fbdba40, 0x4deab226, 0x0fee6e0d, 0x4e0ec5d1, 0x101f1807, -0x4e32a956, 0x104fb80e, 0x4e565c9f, 0x10804e06, 0x4e79df95, 0x10b0d9d0, 0x4e9d3222, 0x10e15b4e, -0x4ec05432, 0x1111d263, 0x4ee345ad, 0x11423ef0, 0x4f06067f, 0x1172a0d7, 0x4f289692, 0x11a2f7fc, -0x4f4af5d1, 0x11d3443f, 0x4f6d2427, 0x12038584, 0x4f8f217e, 0x1233bbac, 0x4fb0edc1, 0x1263e699, -0x4fd288dc, 0x1294062f, 0x4ff3f2bb, 0x12c41a4f, 0x50152b47, 0x12f422db, 0x5036326e, 0x13241fb6, -0x50570819, 0x135410c3, 0x5077ac37, 0x1383f5e3, 0x50981eb1, 0x13b3cefa, 0x50b85f74, 0x13e39be9, -0x50d86e6d, 0x14135c94, 0x50f84b87, 0x144310dd, 0x5117f6ae, 0x1472b8a5, 0x51376fd0, 0x14a253d1, -0x5156b6d9, 0x14d1e242, 0x5175cbb5, 0x150163dc, 0x5194ae52, 0x1530d881, 0x51b35e9b, 0x15604013, -0x51d1dc80, 0x158f9a76, 0x51f027eb, 0x15bee78c, 0x520e40cc, 0x15ee2738, 0x522c270f, 0x161d595d, -0x5249daa2, 0x164c7ddd, 0x52675b72, 0x167b949d, 0x5284a96e, 0x16aa9d7e, 0x52a1c482, 0x16d99864, -0x52beac9f, 0x17088531, 0x52db61b0, 0x173763c9, 0x52f7e3a6, 0x1766340f, 0x5314326d, 0x1794f5e6, -0x53304df6, 0x17c3a931, 0x534c362d, 0x17f24dd3, 0x5367eb03, 0x1820e3b0, 0x53836c66, 0x184f6aab, -0x539eba45, 0x187de2a7, 0x53b9d48f, 0x18ac4b87, 0x53d4bb34, 0x18daa52f, 0x53ef6e23, 0x1908ef82, -0x5409ed4b, 0x19372a64, 0x5424389d, 0x196555b8, 0x543e5007, 0x19937161, 0x5458337a, 0x19c17d44, -0x5471e2e6, 0x19ef7944, 0x548b5e3b, 0x1a1d6544, 0x54a4a56a, 0x1a4b4128, 0x54bdb862, 0x1a790cd4, -0x54d69714, 0x1aa6c82b, 0x54ef4171, 0x1ad47312, 0x5507b76a, 0x1b020d6c, 0x551ff8ef, 0x1b2f971e, -0x553805f2, 0x1b5d100a, 0x554fde64, 0x1b8a7815, 0x55678236, 0x1bb7cf23, 0x557ef15a, 0x1be51518, -0x55962bc0, 0x1c1249d8, 0x55ad315b, 0x1c3f6d47, 0x55c4021d, 0x1c6c7f4a, 0x55da9df7, 0x1c997fc4, -0x55f104dc, 0x1cc66e99, 0x560736bd, 0x1cf34baf, 0x561d338d, 0x1d2016e9, 0x5632fb3f, 0x1d4cd02c, -0x56488dc5, 0x1d79775c, 0x565deb11, 0x1da60c5d, 0x56731317, 0x1dd28f15, 0x568805c9, 0x1dfeff67, -0x569cc31b, 0x1e2b5d38, 0x56b14b00, 0x1e57a86d, 0x56c59d6a, 0x1e83e0eb, 0x56d9ba4e, 0x1eb00696, -0x56eda1a0, 0x1edc1953, 0x57015352, 0x1f081907, 0x5714cf59, 0x1f340596, 0x572815a8, 0x1f5fdee6, -0x573b2635, 0x1f8ba4dc, 0x574e00f2, 0x1fb7575c, 0x5760a5d5, 0x1fe2f64c, 0x577314d2, 0x200e8190, -0x57854ddd, 0x2039f90f, 0x579750ec, 0x20655cac, 0x57a91df2, 0x2090ac4d, 0x57bab4e6, 0x20bbe7d8, -0x57cc15bc, 0x20e70f32, 0x57dd406a, 0x21122240, 0x57ee34e5, 0x213d20e8, 0x57fef323, 0x21680b0f, -0x580f7b19, 0x2192e09b, 0x581fccbc, 0x21bda171, 0x582fe804, 0x21e84d76, 0x583fcce6, 0x2212e492, -0x584f7b58, 0x223d66a8, 0x585ef351, 0x2267d3a0, 0x586e34c7, 0x22922b5e, 0x587d3fb0, 0x22bc6dca, -0x588c1404, 0x22e69ac8, 0x589ab1b9, 0x2310b23e, 0x58a918c6, 0x233ab414, 0x58b74923, 0x2364a02e, -0x58c542c5, 0x238e7673, 0x58d305a6, 0x23b836ca, 0x58e091bd, 0x23e1e117, 0x58ede700, 0x240b7543, -0x58fb0568, 0x2434f332, 0x5907eced, 0x245e5acc, 0x59149d87, 0x2487abf7, 0x5921172e, 0x24b0e699, -0x592d59da, 0x24da0a9a, 0x59396584, 0x250317df, 0x59453a24, 0x252c0e4f, 0x5950d7b3, 0x2554edd1, -0x595c3e2a, 0x257db64c, 0x59676d82, 0x25a667a7, 0x597265b4, 0x25cf01c8, 0x597d26b8, 0x25f78497, -0x5987b08a, 0x261feffa, 0x59920321, 0x264843d9, 0x599c1e78, 0x2670801a, 0x59a60288, 0x2698a4a6, -0x59afaf4c, 0x26c0b162, 0x59b924bc, 0x26e8a637, 0x59c262d5, 0x2710830c, 0x59cb698f, 0x273847c8, -0x59d438e5, 0x275ff452, 0x59dcd0d3, 0x27878893, 0x59e53151, 0x27af0472, 0x59ed5a5c, 0x27d667d5, -0x59f54bee, 0x27fdb2a7, 0x59fd0603, 0x2824e4cc, 0x5a048895, 0x284bfe2f, 0x5a0bd3a1, 0x2872feb6, -0x5a12e720, 0x2899e64a, 0x5a19c310, 0x28c0b4d2, 0x5a20676c, 0x28e76a37, 0x5a26d42f, 0x290e0661, -0x5a2d0957, 0x29348937, 0x5a3306de, 0x295af2a3, 0x5a38ccc2, 0x2981428c, 0x5a3e5afe, 0x29a778db, -0x5a43b190, 0x29cd9578, 0x5a48d074, 0x29f3984c, 0x5a4db7a6, 0x2a19813f, 0x5a526725, 0x2a3f503a, -0x5a56deec, 0x2a650525, 0x5a5b1efa, 0x2a8a9fea, 0x5a5f274b, 0x2ab02071, 0x5a62f7dd, 0x2ad586a3, -0x5a6690ae, 0x2afad269, 0x5a69f1bb, 0x2b2003ac, 0x5a6d1b03, 0x2b451a55, 0x5a700c84, 0x2b6a164d, -0x5a72c63b, 0x2b8ef77d, 0x5a754827, 0x2bb3bdce, 0x5a779246, 0x2bd8692b, 0x5a79a498, 0x2bfcf97c, -0x5a7b7f1a, 0x2c216eaa, 0x5a7d21cc, 0x2c45c8a0, 0x5a7e8cac, 0x2c6a0746, 0x5a7fbfbb, 0x2c8e2a87, -0x5a80baf6, 0x2cb2324c, 0x5a817e5d, 0x2cd61e7f, 0x5a8209f1, 0x2cf9ef09, 0x5a825db0, 0x2d1da3d5, -0x5a82799a, 0x2d413ccd, +/* PostMultiply() tables + format = Q30 + reordered for sequential access + decimate (skip by 16 instead of 2) for small transform (128) + + for (i = 0; i <= (512/2); i++) { + angle = i * M_PI / 1024; + x = (cos(angle) + sin(angle)); + x = sin(angle); + } +*/ +const int cos1sin1tab[514] DPROGMEM = { + /* format = Q30 */ + 0x40000000, 0x00000000, 0x40323034, 0x003243f1, 0x406438cf, 0x006487c4, 0x409619b2, 0x0096cb58, + 0x40c7d2bd, 0x00c90e90, 0x40f963d3, 0x00fb514b, 0x412accd4, 0x012d936c, 0x415c0da3, 0x015fd4d2, + 0x418d2621, 0x0192155f, 0x41be162f, 0x01c454f5, 0x41eeddaf, 0x01f69373, 0x421f7c84, 0x0228d0bb, + 0x424ff28f, 0x025b0caf, 0x42803fb2, 0x028d472e, 0x42b063d0, 0x02bf801a, 0x42e05ecb, 0x02f1b755, + 0x43103085, 0x0323ecbe, 0x433fd8e1, 0x03562038, 0x436f57c1, 0x038851a2, 0x439ead09, 0x03ba80df, + 0x43cdd89a, 0x03ecadcf, 0x43fcda59, 0x041ed854, 0x442bb227, 0x0451004d, 0x445a5fe8, 0x0483259d, + 0x4488e37f, 0x04b54825, 0x44b73ccf, 0x04e767c5, 0x44e56bbd, 0x0519845e, 0x4513702a, 0x054b9dd3, + 0x454149fc, 0x057db403, 0x456ef916, 0x05afc6d0, 0x459c7d5a, 0x05e1d61b, 0x45c9d6af, 0x0613e1c5, + 0x45f704f7, 0x0645e9af, 0x46240816, 0x0677edbb, 0x4650dff1, 0x06a9edc9, 0x467d8c6d, 0x06dbe9bb, + 0x46aa0d6d, 0x070de172, 0x46d662d6, 0x073fd4cf, 0x47028c8d, 0x0771c3b3, 0x472e8a76, 0x07a3adff, + 0x475a5c77, 0x07d59396, 0x47860275, 0x08077457, 0x47b17c54, 0x08395024, 0x47dcc9f9, 0x086b26de, + 0x4807eb4b, 0x089cf867, 0x4832e02d, 0x08cec4a0, 0x485da887, 0x09008b6a, 0x4888443d, 0x09324ca7, + 0x48b2b335, 0x09640837, 0x48dcf556, 0x0995bdfd, 0x49070a84, 0x09c76dd8, 0x4930f2a6, 0x09f917ac, + 0x495aada2, 0x0a2abb59, 0x49843b5f, 0x0a5c58c0, 0x49ad9bc2, 0x0a8defc3, 0x49d6ceb3, 0x0abf8043, + 0x49ffd417, 0x0af10a22, 0x4a28abd6, 0x0b228d42, 0x4a5155d6, 0x0b540982, 0x4a79d1ff, 0x0b857ec7, + 0x4aa22036, 0x0bb6ecef, 0x4aca4065, 0x0be853de, 0x4af23270, 0x0c19b374, 0x4b19f641, 0x0c4b0b94, + 0x4b418bbe, 0x0c7c5c1e, 0x4b68f2cf, 0x0cada4f5, 0x4b902b5c, 0x0cdee5f9, 0x4bb7354d, 0x0d101f0e, + 0x4bde1089, 0x0d415013, 0x4c04bcf8, 0x0d7278eb, 0x4c2b3a84, 0x0da39978, 0x4c518913, 0x0dd4b19a, + 0x4c77a88e, 0x0e05c135, 0x4c9d98de, 0x0e36c82a, 0x4cc359ec, 0x0e67c65a, 0x4ce8eb9f, 0x0e98bba7, + 0x4d0e4de2, 0x0ec9a7f3, 0x4d33809c, 0x0efa8b20, 0x4d5883b7, 0x0f2b650f, 0x4d7d571c, 0x0f5c35a3, + 0x4da1fab5, 0x0f8cfcbe, 0x4dc66e6a, 0x0fbdba40, 0x4deab226, 0x0fee6e0d, 0x4e0ec5d1, 0x101f1807, + 0x4e32a956, 0x104fb80e, 0x4e565c9f, 0x10804e06, 0x4e79df95, 0x10b0d9d0, 0x4e9d3222, 0x10e15b4e, + 0x4ec05432, 0x1111d263, 0x4ee345ad, 0x11423ef0, 0x4f06067f, 0x1172a0d7, 0x4f289692, 0x11a2f7fc, + 0x4f4af5d1, 0x11d3443f, 0x4f6d2427, 0x12038584, 0x4f8f217e, 0x1233bbac, 0x4fb0edc1, 0x1263e699, + 0x4fd288dc, 0x1294062f, 0x4ff3f2bb, 0x12c41a4f, 0x50152b47, 0x12f422db, 0x5036326e, 0x13241fb6, + 0x50570819, 0x135410c3, 0x5077ac37, 0x1383f5e3, 0x50981eb1, 0x13b3cefa, 0x50b85f74, 0x13e39be9, + 0x50d86e6d, 0x14135c94, 0x50f84b87, 0x144310dd, 0x5117f6ae, 0x1472b8a5, 0x51376fd0, 0x14a253d1, + 0x5156b6d9, 0x14d1e242, 0x5175cbb5, 0x150163dc, 0x5194ae52, 0x1530d881, 0x51b35e9b, 0x15604013, + 0x51d1dc80, 0x158f9a76, 0x51f027eb, 0x15bee78c, 0x520e40cc, 0x15ee2738, 0x522c270f, 0x161d595d, + 0x5249daa2, 0x164c7ddd, 0x52675b72, 0x167b949d, 0x5284a96e, 0x16aa9d7e, 0x52a1c482, 0x16d99864, + 0x52beac9f, 0x17088531, 0x52db61b0, 0x173763c9, 0x52f7e3a6, 0x1766340f, 0x5314326d, 0x1794f5e6, + 0x53304df6, 0x17c3a931, 0x534c362d, 0x17f24dd3, 0x5367eb03, 0x1820e3b0, 0x53836c66, 0x184f6aab, + 0x539eba45, 0x187de2a7, 0x53b9d48f, 0x18ac4b87, 0x53d4bb34, 0x18daa52f, 0x53ef6e23, 0x1908ef82, + 0x5409ed4b, 0x19372a64, 0x5424389d, 0x196555b8, 0x543e5007, 0x19937161, 0x5458337a, 0x19c17d44, + 0x5471e2e6, 0x19ef7944, 0x548b5e3b, 0x1a1d6544, 0x54a4a56a, 0x1a4b4128, 0x54bdb862, 0x1a790cd4, + 0x54d69714, 0x1aa6c82b, 0x54ef4171, 0x1ad47312, 0x5507b76a, 0x1b020d6c, 0x551ff8ef, 0x1b2f971e, + 0x553805f2, 0x1b5d100a, 0x554fde64, 0x1b8a7815, 0x55678236, 0x1bb7cf23, 0x557ef15a, 0x1be51518, + 0x55962bc0, 0x1c1249d8, 0x55ad315b, 0x1c3f6d47, 0x55c4021d, 0x1c6c7f4a, 0x55da9df7, 0x1c997fc4, + 0x55f104dc, 0x1cc66e99, 0x560736bd, 0x1cf34baf, 0x561d338d, 0x1d2016e9, 0x5632fb3f, 0x1d4cd02c, + 0x56488dc5, 0x1d79775c, 0x565deb11, 0x1da60c5d, 0x56731317, 0x1dd28f15, 0x568805c9, 0x1dfeff67, + 0x569cc31b, 0x1e2b5d38, 0x56b14b00, 0x1e57a86d, 0x56c59d6a, 0x1e83e0eb, 0x56d9ba4e, 0x1eb00696, + 0x56eda1a0, 0x1edc1953, 0x57015352, 0x1f081907, 0x5714cf59, 0x1f340596, 0x572815a8, 0x1f5fdee6, + 0x573b2635, 0x1f8ba4dc, 0x574e00f2, 0x1fb7575c, 0x5760a5d5, 0x1fe2f64c, 0x577314d2, 0x200e8190, + 0x57854ddd, 0x2039f90f, 0x579750ec, 0x20655cac, 0x57a91df2, 0x2090ac4d, 0x57bab4e6, 0x20bbe7d8, + 0x57cc15bc, 0x20e70f32, 0x57dd406a, 0x21122240, 0x57ee34e5, 0x213d20e8, 0x57fef323, 0x21680b0f, + 0x580f7b19, 0x2192e09b, 0x581fccbc, 0x21bda171, 0x582fe804, 0x21e84d76, 0x583fcce6, 0x2212e492, + 0x584f7b58, 0x223d66a8, 0x585ef351, 0x2267d3a0, 0x586e34c7, 0x22922b5e, 0x587d3fb0, 0x22bc6dca, + 0x588c1404, 0x22e69ac8, 0x589ab1b9, 0x2310b23e, 0x58a918c6, 0x233ab414, 0x58b74923, 0x2364a02e, + 0x58c542c5, 0x238e7673, 0x58d305a6, 0x23b836ca, 0x58e091bd, 0x23e1e117, 0x58ede700, 0x240b7543, + 0x58fb0568, 0x2434f332, 0x5907eced, 0x245e5acc, 0x59149d87, 0x2487abf7, 0x5921172e, 0x24b0e699, + 0x592d59da, 0x24da0a9a, 0x59396584, 0x250317df, 0x59453a24, 0x252c0e4f, 0x5950d7b3, 0x2554edd1, + 0x595c3e2a, 0x257db64c, 0x59676d82, 0x25a667a7, 0x597265b4, 0x25cf01c8, 0x597d26b8, 0x25f78497, + 0x5987b08a, 0x261feffa, 0x59920321, 0x264843d9, 0x599c1e78, 0x2670801a, 0x59a60288, 0x2698a4a6, + 0x59afaf4c, 0x26c0b162, 0x59b924bc, 0x26e8a637, 0x59c262d5, 0x2710830c, 0x59cb698f, 0x273847c8, + 0x59d438e5, 0x275ff452, 0x59dcd0d3, 0x27878893, 0x59e53151, 0x27af0472, 0x59ed5a5c, 0x27d667d5, + 0x59f54bee, 0x27fdb2a7, 0x59fd0603, 0x2824e4cc, 0x5a048895, 0x284bfe2f, 0x5a0bd3a1, 0x2872feb6, + 0x5a12e720, 0x2899e64a, 0x5a19c310, 0x28c0b4d2, 0x5a20676c, 0x28e76a37, 0x5a26d42f, 0x290e0661, + 0x5a2d0957, 0x29348937, 0x5a3306de, 0x295af2a3, 0x5a38ccc2, 0x2981428c, 0x5a3e5afe, 0x29a778db, + 0x5a43b190, 0x29cd9578, 0x5a48d074, 0x29f3984c, 0x5a4db7a6, 0x2a19813f, 0x5a526725, 0x2a3f503a, + 0x5a56deec, 0x2a650525, 0x5a5b1efa, 0x2a8a9fea, 0x5a5f274b, 0x2ab02071, 0x5a62f7dd, 0x2ad586a3, + 0x5a6690ae, 0x2afad269, 0x5a69f1bb, 0x2b2003ac, 0x5a6d1b03, 0x2b451a55, 0x5a700c84, 0x2b6a164d, + 0x5a72c63b, 0x2b8ef77d, 0x5a754827, 0x2bb3bdce, 0x5a779246, 0x2bd8692b, 0x5a79a498, 0x2bfcf97c, + 0x5a7b7f1a, 0x2c216eaa, 0x5a7d21cc, 0x2c45c8a0, 0x5a7e8cac, 0x2c6a0746, 0x5a7fbfbb, 0x2c8e2a87, + 0x5a80baf6, 0x2cb2324c, 0x5a817e5d, 0x2cd61e7f, 0x5a8209f1, 0x2cf9ef09, 0x5a825db0, 0x2d1da3d5, + 0x5a82799a, 0x2d413ccd, }; -const int sinWindowOffset[NUM_IMDCT_SIZES] PROGMEM = {0, 128}; - -/* Synthesis window - SIN - * format = Q31 for nmdct = [128, 1024] - * reordered for sequential access - * - * for (i = 0; i < nmdct/2; i++) { - * angle = (i + 0.5) * M_PI / (2.0 * nmdct); - * x = sin(angle); - * - * angle = (nmdct - 1 - i + 0.5) * M_PI / (2.0 * nmdct); - * x = sin(angle); - * } - */ +const int sinWindowOffset[NUM_IMDCT_SIZES] DPROGMEM = {0, 128}; + +/* Synthesis window - SIN + format = Q31 for nmdct = [128, 1024] + reordered for sequential access + + for (i = 0; i < nmdct/2; i++) { + angle = (i + 0.5) * M_PI / (2.0 * nmdct); + x = sin(angle); + + angle = (nmdct - 1 - i + 0.5) * M_PI / (2.0 * nmdct); + x = sin(angle); + } +*/ const int sinWindow[128 + 1024] PROGMEM = { -/* 128 - format = Q31 * 2^0 */ -0x00c90f88, 0x7fff6216, 0x025b26d7, 0x7ffa72d1, 0x03ed26e6, 0x7ff09478, 0x057f0035, 0x7fe1c76b, -0x0710a345, 0x7fce0c3e, 0x08a2009a, 0x7fb563b3, 0x0a3308bd, 0x7f97cebd, 0x0bc3ac35, 0x7f754e80, -0x0d53db92, 0x7f4de451, 0x0ee38766, 0x7f2191b4, 0x1072a048, 0x7ef05860, 0x120116d5, 0x7eba3a39, -0x138edbb1, 0x7e7f3957, 0x151bdf86, 0x7e3f57ff, 0x16a81305, 0x7dfa98a8, 0x183366e9, 0x7db0fdf8, -0x19bdcbf3, 0x7d628ac6, 0x1b4732ef, 0x7d0f4218, 0x1ccf8cb3, 0x7cb72724, 0x1e56ca1e, 0x7c5a3d50, -0x1fdcdc1b, 0x7bf88830, 0x2161b3a0, 0x7b920b89, 0x22e541af, 0x7b26cb4f, 0x24677758, 0x7ab6cba4, -0x25e845b6, 0x7a4210d8, 0x27679df4, 0x79c89f6e, 0x28e5714b, 0x794a7c12, 0x2a61b101, 0x78c7aba2, -0x2bdc4e6f, 0x78403329, 0x2d553afc, 0x77b417df, 0x2ecc681e, 0x77235f2d, 0x3041c761, 0x768e0ea6, -0x31b54a5e, 0x75f42c0b, 0x3326e2c3, 0x7555bd4c, 0x34968250, 0x74b2c884, 0x36041ad9, 0x740b53fb, -0x376f9e46, 0x735f6626, 0x38d8fe93, 0x72af05a7, 0x3a402dd2, 0x71fa3949, 0x3ba51e29, 0x71410805, -0x3d07c1d6, 0x708378ff, 0x3e680b2c, 0x6fc19385, 0x3fc5ec98, 0x6efb5f12, 0x4121589b, 0x6e30e34a, -0x427a41d0, 0x6d6227fa, 0x43d09aed, 0x6c8f351c, 0x452456bd, 0x6bb812d1, 0x46756828, 0x6adcc964, -0x47c3c22f, 0x69fd614a, 0x490f57ee, 0x6919e320, 0x4a581c9e, 0x683257ab, 0x4b9e0390, 0x6746c7d8, -0x4ce10034, 0x66573cbb, 0x4e210617, 0x6563bf92, 0x4f5e08e3, 0x646c59bf, 0x5097fc5e, 0x637114cc, -0x51ced46e, 0x6271fa69, 0x53028518, 0x616f146c, 0x5433027d, 0x60686ccf, 0x556040e2, 0x5f5e0db3, -0x568a34a9, 0x5e50015d, 0x57b0d256, 0x5d3e5237, 0x58d40e8c, 0x5c290acc, 0x59f3de12, 0x5b1035cf, -/* 1024 - format = Q31 * 2^0 */ -0x001921fb, 0x7ffffd88, 0x004b65ee, 0x7fffe9cb, 0x007da9d4, 0x7fffc251, 0x00afeda8, 0x7fff8719, -0x00e23160, 0x7fff3824, 0x011474f6, 0x7ffed572, 0x0146b860, 0x7ffe5f03, 0x0178fb99, 0x7ffdd4d7, -0x01ab3e97, 0x7ffd36ee, 0x01dd8154, 0x7ffc8549, 0x020fc3c6, 0x7ffbbfe6, 0x024205e8, 0x7ffae6c7, -0x027447b0, 0x7ff9f9ec, 0x02a68917, 0x7ff8f954, 0x02d8ca16, 0x7ff7e500, 0x030b0aa4, 0x7ff6bcf0, -0x033d4abb, 0x7ff58125, 0x036f8a51, 0x7ff4319d, 0x03a1c960, 0x7ff2ce5b, 0x03d407df, 0x7ff1575d, -0x040645c7, 0x7fefcca4, 0x04388310, 0x7fee2e30, 0x046abfb3, 0x7fec7c02, 0x049cfba7, 0x7feab61a, -0x04cf36e5, 0x7fe8dc78, 0x05017165, 0x7fe6ef1c, 0x0533ab20, 0x7fe4ee06, 0x0565e40d, 0x7fe2d938, -0x05981c26, 0x7fe0b0b1, 0x05ca5361, 0x7fde7471, 0x05fc89b8, 0x7fdc247a, 0x062ebf22, 0x7fd9c0ca, -0x0660f398, 0x7fd74964, 0x06932713, 0x7fd4be46, 0x06c5598a, 0x7fd21f72, 0x06f78af6, 0x7fcf6ce8, -0x0729bb4e, 0x7fcca6a7, 0x075bea8c, 0x7fc9ccb2, 0x078e18a7, 0x7fc6df08, 0x07c04598, 0x7fc3dda9, -0x07f27157, 0x7fc0c896, 0x08249bdd, 0x7fbd9fd0, 0x0856c520, 0x7fba6357, 0x0888ed1b, 0x7fb7132b, -0x08bb13c5, 0x7fb3af4e, 0x08ed3916, 0x7fb037bf, 0x091f5d06, 0x7facac7f, 0x09517f8f, 0x7fa90d8e, -0x0983a0a7, 0x7fa55aee, 0x09b5c048, 0x7fa1949e, 0x09e7de6a, 0x7f9dbaa0, 0x0a19fb04, 0x7f99ccf4, -0x0a4c1610, 0x7f95cb9a, 0x0a7e2f85, 0x7f91b694, 0x0ab0475c, 0x7f8d8de1, 0x0ae25d8d, 0x7f895182, -0x0b147211, 0x7f850179, 0x0b4684df, 0x7f809dc5, 0x0b7895f0, 0x7f7c2668, 0x0baaa53b, 0x7f779b62, -0x0bdcb2bb, 0x7f72fcb4, 0x0c0ebe66, 0x7f6e4a5e, 0x0c40c835, 0x7f698461, 0x0c72d020, 0x7f64aabf, -0x0ca4d620, 0x7f5fbd77, 0x0cd6da2d, 0x7f5abc8a, 0x0d08dc3f, 0x7f55a7fa, 0x0d3adc4e, 0x7f507fc7, -0x0d6cda53, 0x7f4b43f2, 0x0d9ed646, 0x7f45f47b, 0x0dd0d01f, 0x7f409164, 0x0e02c7d7, 0x7f3b1aad, -0x0e34bd66, 0x7f359057, 0x0e66b0c3, 0x7f2ff263, 0x0e98a1e9, 0x7f2a40d2, 0x0eca90ce, 0x7f247ba5, -0x0efc7d6b, 0x7f1ea2dc, 0x0f2e67b8, 0x7f18b679, 0x0f604faf, 0x7f12b67c, 0x0f923546, 0x7f0ca2e7, -0x0fc41876, 0x7f067bba, 0x0ff5f938, 0x7f0040f6, 0x1027d784, 0x7ef9f29d, 0x1059b352, 0x7ef390ae, -0x108b8c9b, 0x7eed1b2c, 0x10bd6356, 0x7ee69217, 0x10ef377d, 0x7edff570, 0x11210907, 0x7ed94538, -0x1152d7ed, 0x7ed28171, 0x1184a427, 0x7ecbaa1a, 0x11b66dad, 0x7ec4bf36, 0x11e83478, 0x7ebdc0c6, -0x1219f880, 0x7eb6aeca, 0x124bb9be, 0x7eaf8943, 0x127d7829, 0x7ea85033, 0x12af33ba, 0x7ea1039b, -0x12e0ec6a, 0x7e99a37c, 0x1312a230, 0x7e922fd6, 0x13445505, 0x7e8aa8ac, 0x137604e2, 0x7e830dff, -0x13a7b1bf, 0x7e7b5fce, 0x13d95b93, 0x7e739e1d, 0x140b0258, 0x7e6bc8eb, 0x143ca605, 0x7e63e03b, -0x146e4694, 0x7e5be40c, 0x149fe3fc, 0x7e53d462, 0x14d17e36, 0x7e4bb13c, 0x1503153a, 0x7e437a9c, -0x1534a901, 0x7e3b3083, 0x15663982, 0x7e32d2f4, 0x1597c6b7, 0x7e2a61ed, 0x15c95097, 0x7e21dd73, -0x15fad71b, 0x7e194584, 0x162c5a3b, 0x7e109a24, 0x165dd9f0, 0x7e07db52, 0x168f5632, 0x7dff0911, -0x16c0cef9, 0x7df62362, 0x16f2443e, 0x7ded2a47, 0x1723b5f9, 0x7de41dc0, 0x17552422, 0x7ddafdce, -0x17868eb3, 0x7dd1ca75, 0x17b7f5a3, 0x7dc883b4, 0x17e958ea, 0x7dbf298d, 0x181ab881, 0x7db5bc02, -0x184c1461, 0x7dac3b15, 0x187d6c82, 0x7da2a6c6, 0x18aec0db, 0x7d98ff17, 0x18e01167, 0x7d8f4409, -0x19115e1c, 0x7d85759f, 0x1942a6f3, 0x7d7b93da, 0x1973ebe6, 0x7d719eba, 0x19a52ceb, 0x7d679642, -0x19d669fc, 0x7d5d7a74, 0x1a07a311, 0x7d534b50, 0x1a38d823, 0x7d4908d9, 0x1a6a0929, 0x7d3eb30f, -0x1a9b361d, 0x7d3449f5, 0x1acc5ef6, 0x7d29cd8c, 0x1afd83ad, 0x7d1f3dd6, 0x1b2ea43a, 0x7d149ad5, -0x1b5fc097, 0x7d09e489, 0x1b90d8bb, 0x7cff1af5, 0x1bc1ec9e, 0x7cf43e1a, 0x1bf2fc3a, 0x7ce94dfb, -0x1c240786, 0x7cde4a98, 0x1c550e7c, 0x7cd333f3, 0x1c861113, 0x7cc80a0f, 0x1cb70f43, 0x7cbcccec, -0x1ce80906, 0x7cb17c8d, 0x1d18fe54, 0x7ca618f3, 0x1d49ef26, 0x7c9aa221, 0x1d7adb73, 0x7c8f1817, -0x1dabc334, 0x7c837ad8, 0x1ddca662, 0x7c77ca65, 0x1e0d84f5, 0x7c6c06c0, 0x1e3e5ee5, 0x7c602fec, -0x1e6f342c, 0x7c5445e9, 0x1ea004c1, 0x7c4848ba, 0x1ed0d09d, 0x7c3c3860, 0x1f0197b8, 0x7c3014de, -0x1f325a0b, 0x7c23de35, 0x1f63178f, 0x7c179467, 0x1f93d03c, 0x7c0b3777, 0x1fc4840a, 0x7bfec765, -0x1ff532f2, 0x7bf24434, 0x2025dcec, 0x7be5ade6, 0x205681f1, 0x7bd9047c, 0x208721f9, 0x7bcc47fa, -0x20b7bcfe, 0x7bbf7860, 0x20e852f6, 0x7bb295b0, 0x2118e3dc, 0x7ba59fee, 0x21496fa7, 0x7b989719, -0x2179f64f, 0x7b8b7b36, 0x21aa77cf, 0x7b7e4c45, 0x21daf41d, 0x7b710a49, 0x220b6b32, 0x7b63b543, -0x223bdd08, 0x7b564d36, 0x226c4996, 0x7b48d225, 0x229cb0d5, 0x7b3b4410, 0x22cd12bd, 0x7b2da2fa, -0x22fd6f48, 0x7b1feee5, 0x232dc66d, 0x7b1227d3, 0x235e1826, 0x7b044dc7, 0x238e646a, 0x7af660c2, -0x23beab33, 0x7ae860c7, 0x23eeec78, 0x7ada4dd8, 0x241f2833, 0x7acc27f7, 0x244f5e5c, 0x7abdef25, -0x247f8eec, 0x7aafa367, 0x24afb9da, 0x7aa144bc, 0x24dfdf20, 0x7a92d329, 0x250ffeb7, 0x7a844eae, -0x25401896, 0x7a75b74f, 0x25702cb7, 0x7a670d0d, 0x25a03b11, 0x7a584feb, 0x25d0439f, 0x7a497feb, -0x26004657, 0x7a3a9d0f, 0x26304333, 0x7a2ba75a, 0x26603a2c, 0x7a1c9ece, 0x26902b39, 0x7a0d836d, -0x26c01655, 0x79fe5539, 0x26effb76, 0x79ef1436, 0x271fda96, 0x79dfc064, 0x274fb3ae, 0x79d059c8, -0x277f86b5, 0x79c0e062, 0x27af53a6, 0x79b15435, 0x27df1a77, 0x79a1b545, 0x280edb23, 0x79920392, -0x283e95a1, 0x79823f20, 0x286e49ea, 0x797267f2, 0x289df7f8, 0x79627e08, 0x28cd9fc1, 0x79528167, -0x28fd4140, 0x79427210, 0x292cdc6d, 0x79325006, 0x295c7140, 0x79221b4b, 0x298bffb2, 0x7911d3e2, -0x29bb87bc, 0x790179cd, 0x29eb0957, 0x78f10d0f, 0x2a1a847b, 0x78e08dab, 0x2a49f920, 0x78cffba3, -0x2a796740, 0x78bf56f9, 0x2aa8ced3, 0x78ae9fb0, 0x2ad82fd2, 0x789dd5cb, 0x2b078a36, 0x788cf94c, -0x2b36ddf7, 0x787c0a36, 0x2b662b0e, 0x786b088c, 0x2b957173, 0x7859f44f, 0x2bc4b120, 0x7848cd83, -0x2bf3ea0d, 0x7837942b, 0x2c231c33, 0x78264849, 0x2c52478a, 0x7814e9df, 0x2c816c0c, 0x780378f1, -0x2cb089b1, 0x77f1f581, 0x2cdfa071, 0x77e05f91, 0x2d0eb046, 0x77ceb725, 0x2d3db928, 0x77bcfc3f, -0x2d6cbb10, 0x77ab2ee2, 0x2d9bb5f6, 0x77994f11, 0x2dcaa9d5, 0x77875cce, 0x2df996a3, 0x7775581d, -0x2e287c5a, 0x776340ff, 0x2e575af3, 0x77511778, 0x2e863267, 0x773edb8b, 0x2eb502ae, 0x772c8d3a, -0x2ee3cbc1, 0x771a2c88, 0x2f128d99, 0x7707b979, 0x2f41482e, 0x76f5340e, 0x2f6ffb7a, 0x76e29c4b, -0x2f9ea775, 0x76cff232, 0x2fcd4c19, 0x76bd35c7, 0x2ffbe95d, 0x76aa670d, 0x302a7f3a, 0x76978605, -0x30590dab, 0x768492b4, 0x308794a6, 0x76718d1c, 0x30b61426, 0x765e7540, 0x30e48c22, 0x764b4b23, -0x3112fc95, 0x76380ec8, 0x31416576, 0x7624c031, 0x316fc6be, 0x76115f63, 0x319e2067, 0x75fdec60, -0x31cc7269, 0x75ea672a, 0x31fabcbd, 0x75d6cfc5, 0x3228ff5c, 0x75c32634, 0x32573a3f, 0x75af6a7b, -0x32856d5e, 0x759b9c9b, 0x32b398b3, 0x7587bc98, 0x32e1bc36, 0x7573ca75, 0x330fd7e1, 0x755fc635, -0x333debab, 0x754bafdc, 0x336bf78f, 0x7537876c, 0x3399fb85, 0x75234ce8, 0x33c7f785, 0x750f0054, -0x33f5eb89, 0x74faa1b3, 0x3423d78a, 0x74e63108, 0x3451bb81, 0x74d1ae55, 0x347f9766, 0x74bd199f, -0x34ad6b32, 0x74a872e8, 0x34db36df, 0x7493ba34, 0x3508fa66, 0x747eef85, 0x3536b5be, 0x746a12df, -0x356468e2, 0x74552446, 0x359213c9, 0x744023bc, 0x35bfb66e, 0x742b1144, 0x35ed50c9, 0x7415ece2, -0x361ae2d3, 0x7400b69a, 0x36486c86, 0x73eb6e6e, 0x3675edd9, 0x73d61461, 0x36a366c6, 0x73c0a878, -0x36d0d746, 0x73ab2ab4, 0x36fe3f52, 0x73959b1b, 0x372b9ee3, 0x737ff9ae, 0x3758f5f2, 0x736a4671, -0x37864477, 0x73548168, 0x37b38a6d, 0x733eaa96, 0x37e0c7cc, 0x7328c1ff, 0x380dfc8d, 0x7312c7a5, -0x383b28a9, 0x72fcbb8c, 0x38684c19, 0x72e69db7, 0x389566d6, 0x72d06e2b, 0x38c278d9, 0x72ba2cea, -0x38ef821c, 0x72a3d9f7, 0x391c8297, 0x728d7557, 0x39497a43, 0x7276ff0d, 0x39766919, 0x7260771b, -0x39a34f13, 0x7249dd86, 0x39d02c2a, 0x72333251, 0x39fd0056, 0x721c7580, 0x3a29cb91, 0x7205a716, -0x3a568dd4, 0x71eec716, 0x3a834717, 0x71d7d585, 0x3aaff755, 0x71c0d265, 0x3adc9e86, 0x71a9bdba, -0x3b093ca3, 0x71929789, 0x3b35d1a5, 0x717b5fd3, 0x3b625d86, 0x7164169d, 0x3b8ee03e, 0x714cbbeb, -0x3bbb59c7, 0x71354fc0, 0x3be7ca1a, 0x711dd220, 0x3c143130, 0x7106430e, 0x3c408f03, 0x70eea28e, -0x3c6ce38a, 0x70d6f0a4, 0x3c992ec0, 0x70bf2d53, 0x3cc5709e, 0x70a7589f, 0x3cf1a91c, 0x708f728b, -0x3d1dd835, 0x70777b1c, 0x3d49fde1, 0x705f7255, 0x3d761a19, 0x70475839, 0x3da22cd7, 0x702f2ccd, -0x3dce3614, 0x7016f014, 0x3dfa35c8, 0x6ffea212, 0x3e262bee, 0x6fe642ca, 0x3e52187f, 0x6fcdd241, -0x3e7dfb73, 0x6fb5507a, 0x3ea9d4c3, 0x6f9cbd79, 0x3ed5a46b, 0x6f841942, 0x3f016a61, 0x6f6b63d8, -0x3f2d26a0, 0x6f529d40, 0x3f58d921, 0x6f39c57d, 0x3f8481dd, 0x6f20dc92, 0x3fb020ce, 0x6f07e285, -0x3fdbb5ec, 0x6eeed758, 0x40074132, 0x6ed5bb10, 0x4032c297, 0x6ebc8db0, 0x405e3a16, 0x6ea34f3d, -0x4089a7a8, 0x6e89ffb9, 0x40b50b46, 0x6e709f2a, 0x40e064ea, 0x6e572d93, 0x410bb48c, 0x6e3daaf8, -0x4136fa27, 0x6e24175c, 0x416235b2, 0x6e0a72c5, 0x418d6729, 0x6df0bd35, 0x41b88e84, 0x6dd6f6b1, -0x41e3abbc, 0x6dbd1f3c, 0x420ebecb, 0x6da336dc, 0x4239c7aa, 0x6d893d93, 0x4264c653, 0x6d6f3365, -0x428fbabe, 0x6d551858, 0x42baa4e6, 0x6d3aec6e, 0x42e584c3, 0x6d20afac, 0x43105a50, 0x6d066215, -0x433b2585, 0x6cec03af, 0x4365e65b, 0x6cd1947c, 0x43909ccd, 0x6cb71482, 0x43bb48d4, 0x6c9c83c3, -0x43e5ea68, 0x6c81e245, 0x44108184, 0x6c67300b, 0x443b0e21, 0x6c4c6d1a, 0x44659039, 0x6c319975, -0x449007c4, 0x6c16b521, 0x44ba74bd, 0x6bfbc021, 0x44e4d71c, 0x6be0ba7b, 0x450f2edb, 0x6bc5a431, -0x45397bf4, 0x6baa7d49, 0x4563be60, 0x6b8f45c7, 0x458df619, 0x6b73fdae, 0x45b82318, 0x6b58a503, -0x45e24556, 0x6b3d3bcb, 0x460c5cce, 0x6b21c208, 0x46366978, 0x6b0637c1, 0x46606b4e, 0x6aea9cf8, -0x468a624a, 0x6acef1b2, 0x46b44e65, 0x6ab335f4, 0x46de2f99, 0x6a9769c1, 0x470805df, 0x6a7b8d1e, -0x4731d131, 0x6a5fa010, 0x475b9188, 0x6a43a29a, 0x478546de, 0x6a2794c1, 0x47aef12c, 0x6a0b7689, -0x47d8906d, 0x69ef47f6, 0x48022499, 0x69d3090e, 0x482badab, 0x69b6b9d3, 0x48552b9b, 0x699a5a4c, -0x487e9e64, 0x697dea7b, 0x48a805ff, 0x69616a65, 0x48d16265, 0x6944da10, 0x48fab391, 0x6928397e, -0x4923f97b, 0x690b88b5, 0x494d341e, 0x68eec7b9, 0x49766373, 0x68d1f68f, 0x499f8774, 0x68b5153a, -0x49c8a01b, 0x689823bf, 0x49f1ad61, 0x687b2224, 0x4a1aaf3f, 0x685e106c, 0x4a43a5b0, 0x6840ee9b, -0x4a6c90ad, 0x6823bcb7, 0x4a957030, 0x68067ac3, 0x4abe4433, 0x67e928c5, 0x4ae70caf, 0x67cbc6c0, -0x4b0fc99d, 0x67ae54ba, 0x4b387af9, 0x6790d2b6, 0x4b6120bb, 0x677340ba, 0x4b89badd, 0x67559eca, -0x4bb24958, 0x6737ecea, 0x4bdacc28, 0x671a2b20, 0x4c034345, 0x66fc596f, 0x4c2baea9, 0x66de77dc, -0x4c540e4e, 0x66c0866d, 0x4c7c622d, 0x66a28524, 0x4ca4aa41, 0x66847408, 0x4ccce684, 0x6666531d, -0x4cf516ee, 0x66482267, 0x4d1d3b7a, 0x6629e1ec, 0x4d455422, 0x660b91af, 0x4d6d60df, 0x65ed31b5, -0x4d9561ac, 0x65cec204, 0x4dbd5682, 0x65b0429f, 0x4de53f5a, 0x6591b38c, 0x4e0d1c30, 0x657314cf, -0x4e34ecfc, 0x6554666d, 0x4e5cb1b9, 0x6535a86b, 0x4e846a60, 0x6516dacd, 0x4eac16eb, 0x64f7fd98, -0x4ed3b755, 0x64d910d1, 0x4efb4b96, 0x64ba147d, 0x4f22d3aa, 0x649b08a0, 0x4f4a4f89, 0x647bed3f, -0x4f71bf2e, 0x645cc260, 0x4f992293, 0x643d8806, 0x4fc079b1, 0x641e3e38, 0x4fe7c483, 0x63fee4f8, -0x500f0302, 0x63df7c4d, 0x50363529, 0x63c0043b, 0x505d5af1, 0x63a07cc7, 0x50847454, 0x6380e5f6, -0x50ab814d, 0x63613fcd, 0x50d281d5, 0x63418a50, 0x50f975e6, 0x6321c585, 0x51205d7b, 0x6301f171, -0x5147388c, 0x62e20e17, 0x516e0715, 0x62c21b7e, 0x5194c910, 0x62a219aa, 0x51bb7e75, 0x628208a1, -0x51e22740, 0x6261e866, 0x5208c36a, 0x6241b8ff, 0x522f52ee, 0x62217a72, 0x5255d5c5, 0x62012cc2, -0x527c4bea, 0x61e0cff5, 0x52a2b556, 0x61c06410, 0x52c91204, 0x619fe918, 0x52ef61ee, 0x617f5f12, -0x5315a50e, 0x615ec603, 0x533bdb5d, 0x613e1df0, 0x536204d7, 0x611d66de, 0x53882175, 0x60fca0d2, -0x53ae3131, 0x60dbcbd1, 0x53d43406, 0x60bae7e1, 0x53fa29ed, 0x6099f505, 0x542012e1, 0x6078f344, -0x5445eedb, 0x6057e2a2, 0x546bbdd7, 0x6036c325, 0x54917fce, 0x601594d1, 0x54b734ba, 0x5ff457ad, -0x54dcdc96, 0x5fd30bbc, 0x5502775c, 0x5fb1b104, 0x55280505, 0x5f90478a, 0x554d858d, 0x5f6ecf53, -0x5572f8ed, 0x5f4d4865, 0x55985f20, 0x5f2bb2c5, 0x55bdb81f, 0x5f0a0e77, 0x55e303e6, 0x5ee85b82, -0x5608426e, 0x5ec699e9, 0x562d73b2, 0x5ea4c9b3, 0x565297ab, 0x5e82eae5, 0x5677ae54, 0x5e60fd84, -0x569cb7a8, 0x5e3f0194, 0x56c1b3a1, 0x5e1cf71c, 0x56e6a239, 0x5dfade20, 0x570b8369, 0x5dd8b6a7, -0x5730572e, 0x5db680b4, 0x57551d80, 0x5d943c4e, 0x5779d65b, 0x5d71e979, 0x579e81b8, 0x5d4f883b, -0x57c31f92, 0x5d2d189a, 0x57e7afe4, 0x5d0a9a9a, 0x580c32a7, 0x5ce80e41, 0x5830a7d6, 0x5cc57394, -0x58550f6c, 0x5ca2ca99, 0x58796962, 0x5c801354, 0x589db5b3, 0x5c5d4dcc, 0x58c1f45b, 0x5c3a7a05, -0x58e62552, 0x5c179806, 0x590a4893, 0x5bf4a7d2, 0x592e5e19, 0x5bd1a971, 0x595265df, 0x5bae9ce7, -0x59765fde, 0x5b8b8239, 0x599a4c12, 0x5b68596d, 0x59be2a74, 0x5b452288, 0x59e1faff, 0x5b21dd90, -0x5a05bdae, 0x5afe8a8b, 0x5a29727b, 0x5adb297d, 0x5a4d1960, 0x5ab7ba6c, 0x5a70b258, 0x5a943d5e, + /* 128 - format = Q31 * 2^0 */ + 0x00c90f88, 0x7fff6216, 0x025b26d7, 0x7ffa72d1, 0x03ed26e6, 0x7ff09478, 0x057f0035, 0x7fe1c76b, + 0x0710a345, 0x7fce0c3e, 0x08a2009a, 0x7fb563b3, 0x0a3308bd, 0x7f97cebd, 0x0bc3ac35, 0x7f754e80, + 0x0d53db92, 0x7f4de451, 0x0ee38766, 0x7f2191b4, 0x1072a048, 0x7ef05860, 0x120116d5, 0x7eba3a39, + 0x138edbb1, 0x7e7f3957, 0x151bdf86, 0x7e3f57ff, 0x16a81305, 0x7dfa98a8, 0x183366e9, 0x7db0fdf8, + 0x19bdcbf3, 0x7d628ac6, 0x1b4732ef, 0x7d0f4218, 0x1ccf8cb3, 0x7cb72724, 0x1e56ca1e, 0x7c5a3d50, + 0x1fdcdc1b, 0x7bf88830, 0x2161b3a0, 0x7b920b89, 0x22e541af, 0x7b26cb4f, 0x24677758, 0x7ab6cba4, + 0x25e845b6, 0x7a4210d8, 0x27679df4, 0x79c89f6e, 0x28e5714b, 0x794a7c12, 0x2a61b101, 0x78c7aba2, + 0x2bdc4e6f, 0x78403329, 0x2d553afc, 0x77b417df, 0x2ecc681e, 0x77235f2d, 0x3041c761, 0x768e0ea6, + 0x31b54a5e, 0x75f42c0b, 0x3326e2c3, 0x7555bd4c, 0x34968250, 0x74b2c884, 0x36041ad9, 0x740b53fb, + 0x376f9e46, 0x735f6626, 0x38d8fe93, 0x72af05a7, 0x3a402dd2, 0x71fa3949, 0x3ba51e29, 0x71410805, + 0x3d07c1d6, 0x708378ff, 0x3e680b2c, 0x6fc19385, 0x3fc5ec98, 0x6efb5f12, 0x4121589b, 0x6e30e34a, + 0x427a41d0, 0x6d6227fa, 0x43d09aed, 0x6c8f351c, 0x452456bd, 0x6bb812d1, 0x46756828, 0x6adcc964, + 0x47c3c22f, 0x69fd614a, 0x490f57ee, 0x6919e320, 0x4a581c9e, 0x683257ab, 0x4b9e0390, 0x6746c7d8, + 0x4ce10034, 0x66573cbb, 0x4e210617, 0x6563bf92, 0x4f5e08e3, 0x646c59bf, 0x5097fc5e, 0x637114cc, + 0x51ced46e, 0x6271fa69, 0x53028518, 0x616f146c, 0x5433027d, 0x60686ccf, 0x556040e2, 0x5f5e0db3, + 0x568a34a9, 0x5e50015d, 0x57b0d256, 0x5d3e5237, 0x58d40e8c, 0x5c290acc, 0x59f3de12, 0x5b1035cf, + /* 1024 - format = Q31 * 2^0 */ + 0x001921fb, 0x7ffffd88, 0x004b65ee, 0x7fffe9cb, 0x007da9d4, 0x7fffc251, 0x00afeda8, 0x7fff8719, + 0x00e23160, 0x7fff3824, 0x011474f6, 0x7ffed572, 0x0146b860, 0x7ffe5f03, 0x0178fb99, 0x7ffdd4d7, + 0x01ab3e97, 0x7ffd36ee, 0x01dd8154, 0x7ffc8549, 0x020fc3c6, 0x7ffbbfe6, 0x024205e8, 0x7ffae6c7, + 0x027447b0, 0x7ff9f9ec, 0x02a68917, 0x7ff8f954, 0x02d8ca16, 0x7ff7e500, 0x030b0aa4, 0x7ff6bcf0, + 0x033d4abb, 0x7ff58125, 0x036f8a51, 0x7ff4319d, 0x03a1c960, 0x7ff2ce5b, 0x03d407df, 0x7ff1575d, + 0x040645c7, 0x7fefcca4, 0x04388310, 0x7fee2e30, 0x046abfb3, 0x7fec7c02, 0x049cfba7, 0x7feab61a, + 0x04cf36e5, 0x7fe8dc78, 0x05017165, 0x7fe6ef1c, 0x0533ab20, 0x7fe4ee06, 0x0565e40d, 0x7fe2d938, + 0x05981c26, 0x7fe0b0b1, 0x05ca5361, 0x7fde7471, 0x05fc89b8, 0x7fdc247a, 0x062ebf22, 0x7fd9c0ca, + 0x0660f398, 0x7fd74964, 0x06932713, 0x7fd4be46, 0x06c5598a, 0x7fd21f72, 0x06f78af6, 0x7fcf6ce8, + 0x0729bb4e, 0x7fcca6a7, 0x075bea8c, 0x7fc9ccb2, 0x078e18a7, 0x7fc6df08, 0x07c04598, 0x7fc3dda9, + 0x07f27157, 0x7fc0c896, 0x08249bdd, 0x7fbd9fd0, 0x0856c520, 0x7fba6357, 0x0888ed1b, 0x7fb7132b, + 0x08bb13c5, 0x7fb3af4e, 0x08ed3916, 0x7fb037bf, 0x091f5d06, 0x7facac7f, 0x09517f8f, 0x7fa90d8e, + 0x0983a0a7, 0x7fa55aee, 0x09b5c048, 0x7fa1949e, 0x09e7de6a, 0x7f9dbaa0, 0x0a19fb04, 0x7f99ccf4, + 0x0a4c1610, 0x7f95cb9a, 0x0a7e2f85, 0x7f91b694, 0x0ab0475c, 0x7f8d8de1, 0x0ae25d8d, 0x7f895182, + 0x0b147211, 0x7f850179, 0x0b4684df, 0x7f809dc5, 0x0b7895f0, 0x7f7c2668, 0x0baaa53b, 0x7f779b62, + 0x0bdcb2bb, 0x7f72fcb4, 0x0c0ebe66, 0x7f6e4a5e, 0x0c40c835, 0x7f698461, 0x0c72d020, 0x7f64aabf, + 0x0ca4d620, 0x7f5fbd77, 0x0cd6da2d, 0x7f5abc8a, 0x0d08dc3f, 0x7f55a7fa, 0x0d3adc4e, 0x7f507fc7, + 0x0d6cda53, 0x7f4b43f2, 0x0d9ed646, 0x7f45f47b, 0x0dd0d01f, 0x7f409164, 0x0e02c7d7, 0x7f3b1aad, + 0x0e34bd66, 0x7f359057, 0x0e66b0c3, 0x7f2ff263, 0x0e98a1e9, 0x7f2a40d2, 0x0eca90ce, 0x7f247ba5, + 0x0efc7d6b, 0x7f1ea2dc, 0x0f2e67b8, 0x7f18b679, 0x0f604faf, 0x7f12b67c, 0x0f923546, 0x7f0ca2e7, + 0x0fc41876, 0x7f067bba, 0x0ff5f938, 0x7f0040f6, 0x1027d784, 0x7ef9f29d, 0x1059b352, 0x7ef390ae, + 0x108b8c9b, 0x7eed1b2c, 0x10bd6356, 0x7ee69217, 0x10ef377d, 0x7edff570, 0x11210907, 0x7ed94538, + 0x1152d7ed, 0x7ed28171, 0x1184a427, 0x7ecbaa1a, 0x11b66dad, 0x7ec4bf36, 0x11e83478, 0x7ebdc0c6, + 0x1219f880, 0x7eb6aeca, 0x124bb9be, 0x7eaf8943, 0x127d7829, 0x7ea85033, 0x12af33ba, 0x7ea1039b, + 0x12e0ec6a, 0x7e99a37c, 0x1312a230, 0x7e922fd6, 0x13445505, 0x7e8aa8ac, 0x137604e2, 0x7e830dff, + 0x13a7b1bf, 0x7e7b5fce, 0x13d95b93, 0x7e739e1d, 0x140b0258, 0x7e6bc8eb, 0x143ca605, 0x7e63e03b, + 0x146e4694, 0x7e5be40c, 0x149fe3fc, 0x7e53d462, 0x14d17e36, 0x7e4bb13c, 0x1503153a, 0x7e437a9c, + 0x1534a901, 0x7e3b3083, 0x15663982, 0x7e32d2f4, 0x1597c6b7, 0x7e2a61ed, 0x15c95097, 0x7e21dd73, + 0x15fad71b, 0x7e194584, 0x162c5a3b, 0x7e109a24, 0x165dd9f0, 0x7e07db52, 0x168f5632, 0x7dff0911, + 0x16c0cef9, 0x7df62362, 0x16f2443e, 0x7ded2a47, 0x1723b5f9, 0x7de41dc0, 0x17552422, 0x7ddafdce, + 0x17868eb3, 0x7dd1ca75, 0x17b7f5a3, 0x7dc883b4, 0x17e958ea, 0x7dbf298d, 0x181ab881, 0x7db5bc02, + 0x184c1461, 0x7dac3b15, 0x187d6c82, 0x7da2a6c6, 0x18aec0db, 0x7d98ff17, 0x18e01167, 0x7d8f4409, + 0x19115e1c, 0x7d85759f, 0x1942a6f3, 0x7d7b93da, 0x1973ebe6, 0x7d719eba, 0x19a52ceb, 0x7d679642, + 0x19d669fc, 0x7d5d7a74, 0x1a07a311, 0x7d534b50, 0x1a38d823, 0x7d4908d9, 0x1a6a0929, 0x7d3eb30f, + 0x1a9b361d, 0x7d3449f5, 0x1acc5ef6, 0x7d29cd8c, 0x1afd83ad, 0x7d1f3dd6, 0x1b2ea43a, 0x7d149ad5, + 0x1b5fc097, 0x7d09e489, 0x1b90d8bb, 0x7cff1af5, 0x1bc1ec9e, 0x7cf43e1a, 0x1bf2fc3a, 0x7ce94dfb, + 0x1c240786, 0x7cde4a98, 0x1c550e7c, 0x7cd333f3, 0x1c861113, 0x7cc80a0f, 0x1cb70f43, 0x7cbcccec, + 0x1ce80906, 0x7cb17c8d, 0x1d18fe54, 0x7ca618f3, 0x1d49ef26, 0x7c9aa221, 0x1d7adb73, 0x7c8f1817, + 0x1dabc334, 0x7c837ad8, 0x1ddca662, 0x7c77ca65, 0x1e0d84f5, 0x7c6c06c0, 0x1e3e5ee5, 0x7c602fec, + 0x1e6f342c, 0x7c5445e9, 0x1ea004c1, 0x7c4848ba, 0x1ed0d09d, 0x7c3c3860, 0x1f0197b8, 0x7c3014de, + 0x1f325a0b, 0x7c23de35, 0x1f63178f, 0x7c179467, 0x1f93d03c, 0x7c0b3777, 0x1fc4840a, 0x7bfec765, + 0x1ff532f2, 0x7bf24434, 0x2025dcec, 0x7be5ade6, 0x205681f1, 0x7bd9047c, 0x208721f9, 0x7bcc47fa, + 0x20b7bcfe, 0x7bbf7860, 0x20e852f6, 0x7bb295b0, 0x2118e3dc, 0x7ba59fee, 0x21496fa7, 0x7b989719, + 0x2179f64f, 0x7b8b7b36, 0x21aa77cf, 0x7b7e4c45, 0x21daf41d, 0x7b710a49, 0x220b6b32, 0x7b63b543, + 0x223bdd08, 0x7b564d36, 0x226c4996, 0x7b48d225, 0x229cb0d5, 0x7b3b4410, 0x22cd12bd, 0x7b2da2fa, + 0x22fd6f48, 0x7b1feee5, 0x232dc66d, 0x7b1227d3, 0x235e1826, 0x7b044dc7, 0x238e646a, 0x7af660c2, + 0x23beab33, 0x7ae860c7, 0x23eeec78, 0x7ada4dd8, 0x241f2833, 0x7acc27f7, 0x244f5e5c, 0x7abdef25, + 0x247f8eec, 0x7aafa367, 0x24afb9da, 0x7aa144bc, 0x24dfdf20, 0x7a92d329, 0x250ffeb7, 0x7a844eae, + 0x25401896, 0x7a75b74f, 0x25702cb7, 0x7a670d0d, 0x25a03b11, 0x7a584feb, 0x25d0439f, 0x7a497feb, + 0x26004657, 0x7a3a9d0f, 0x26304333, 0x7a2ba75a, 0x26603a2c, 0x7a1c9ece, 0x26902b39, 0x7a0d836d, + 0x26c01655, 0x79fe5539, 0x26effb76, 0x79ef1436, 0x271fda96, 0x79dfc064, 0x274fb3ae, 0x79d059c8, + 0x277f86b5, 0x79c0e062, 0x27af53a6, 0x79b15435, 0x27df1a77, 0x79a1b545, 0x280edb23, 0x79920392, + 0x283e95a1, 0x79823f20, 0x286e49ea, 0x797267f2, 0x289df7f8, 0x79627e08, 0x28cd9fc1, 0x79528167, + 0x28fd4140, 0x79427210, 0x292cdc6d, 0x79325006, 0x295c7140, 0x79221b4b, 0x298bffb2, 0x7911d3e2, + 0x29bb87bc, 0x790179cd, 0x29eb0957, 0x78f10d0f, 0x2a1a847b, 0x78e08dab, 0x2a49f920, 0x78cffba3, + 0x2a796740, 0x78bf56f9, 0x2aa8ced3, 0x78ae9fb0, 0x2ad82fd2, 0x789dd5cb, 0x2b078a36, 0x788cf94c, + 0x2b36ddf7, 0x787c0a36, 0x2b662b0e, 0x786b088c, 0x2b957173, 0x7859f44f, 0x2bc4b120, 0x7848cd83, + 0x2bf3ea0d, 0x7837942b, 0x2c231c33, 0x78264849, 0x2c52478a, 0x7814e9df, 0x2c816c0c, 0x780378f1, + 0x2cb089b1, 0x77f1f581, 0x2cdfa071, 0x77e05f91, 0x2d0eb046, 0x77ceb725, 0x2d3db928, 0x77bcfc3f, + 0x2d6cbb10, 0x77ab2ee2, 0x2d9bb5f6, 0x77994f11, 0x2dcaa9d5, 0x77875cce, 0x2df996a3, 0x7775581d, + 0x2e287c5a, 0x776340ff, 0x2e575af3, 0x77511778, 0x2e863267, 0x773edb8b, 0x2eb502ae, 0x772c8d3a, + 0x2ee3cbc1, 0x771a2c88, 0x2f128d99, 0x7707b979, 0x2f41482e, 0x76f5340e, 0x2f6ffb7a, 0x76e29c4b, + 0x2f9ea775, 0x76cff232, 0x2fcd4c19, 0x76bd35c7, 0x2ffbe95d, 0x76aa670d, 0x302a7f3a, 0x76978605, + 0x30590dab, 0x768492b4, 0x308794a6, 0x76718d1c, 0x30b61426, 0x765e7540, 0x30e48c22, 0x764b4b23, + 0x3112fc95, 0x76380ec8, 0x31416576, 0x7624c031, 0x316fc6be, 0x76115f63, 0x319e2067, 0x75fdec60, + 0x31cc7269, 0x75ea672a, 0x31fabcbd, 0x75d6cfc5, 0x3228ff5c, 0x75c32634, 0x32573a3f, 0x75af6a7b, + 0x32856d5e, 0x759b9c9b, 0x32b398b3, 0x7587bc98, 0x32e1bc36, 0x7573ca75, 0x330fd7e1, 0x755fc635, + 0x333debab, 0x754bafdc, 0x336bf78f, 0x7537876c, 0x3399fb85, 0x75234ce8, 0x33c7f785, 0x750f0054, + 0x33f5eb89, 0x74faa1b3, 0x3423d78a, 0x74e63108, 0x3451bb81, 0x74d1ae55, 0x347f9766, 0x74bd199f, + 0x34ad6b32, 0x74a872e8, 0x34db36df, 0x7493ba34, 0x3508fa66, 0x747eef85, 0x3536b5be, 0x746a12df, + 0x356468e2, 0x74552446, 0x359213c9, 0x744023bc, 0x35bfb66e, 0x742b1144, 0x35ed50c9, 0x7415ece2, + 0x361ae2d3, 0x7400b69a, 0x36486c86, 0x73eb6e6e, 0x3675edd9, 0x73d61461, 0x36a366c6, 0x73c0a878, + 0x36d0d746, 0x73ab2ab4, 0x36fe3f52, 0x73959b1b, 0x372b9ee3, 0x737ff9ae, 0x3758f5f2, 0x736a4671, + 0x37864477, 0x73548168, 0x37b38a6d, 0x733eaa96, 0x37e0c7cc, 0x7328c1ff, 0x380dfc8d, 0x7312c7a5, + 0x383b28a9, 0x72fcbb8c, 0x38684c19, 0x72e69db7, 0x389566d6, 0x72d06e2b, 0x38c278d9, 0x72ba2cea, + 0x38ef821c, 0x72a3d9f7, 0x391c8297, 0x728d7557, 0x39497a43, 0x7276ff0d, 0x39766919, 0x7260771b, + 0x39a34f13, 0x7249dd86, 0x39d02c2a, 0x72333251, 0x39fd0056, 0x721c7580, 0x3a29cb91, 0x7205a716, + 0x3a568dd4, 0x71eec716, 0x3a834717, 0x71d7d585, 0x3aaff755, 0x71c0d265, 0x3adc9e86, 0x71a9bdba, + 0x3b093ca3, 0x71929789, 0x3b35d1a5, 0x717b5fd3, 0x3b625d86, 0x7164169d, 0x3b8ee03e, 0x714cbbeb, + 0x3bbb59c7, 0x71354fc0, 0x3be7ca1a, 0x711dd220, 0x3c143130, 0x7106430e, 0x3c408f03, 0x70eea28e, + 0x3c6ce38a, 0x70d6f0a4, 0x3c992ec0, 0x70bf2d53, 0x3cc5709e, 0x70a7589f, 0x3cf1a91c, 0x708f728b, + 0x3d1dd835, 0x70777b1c, 0x3d49fde1, 0x705f7255, 0x3d761a19, 0x70475839, 0x3da22cd7, 0x702f2ccd, + 0x3dce3614, 0x7016f014, 0x3dfa35c8, 0x6ffea212, 0x3e262bee, 0x6fe642ca, 0x3e52187f, 0x6fcdd241, + 0x3e7dfb73, 0x6fb5507a, 0x3ea9d4c3, 0x6f9cbd79, 0x3ed5a46b, 0x6f841942, 0x3f016a61, 0x6f6b63d8, + 0x3f2d26a0, 0x6f529d40, 0x3f58d921, 0x6f39c57d, 0x3f8481dd, 0x6f20dc92, 0x3fb020ce, 0x6f07e285, + 0x3fdbb5ec, 0x6eeed758, 0x40074132, 0x6ed5bb10, 0x4032c297, 0x6ebc8db0, 0x405e3a16, 0x6ea34f3d, + 0x4089a7a8, 0x6e89ffb9, 0x40b50b46, 0x6e709f2a, 0x40e064ea, 0x6e572d93, 0x410bb48c, 0x6e3daaf8, + 0x4136fa27, 0x6e24175c, 0x416235b2, 0x6e0a72c5, 0x418d6729, 0x6df0bd35, 0x41b88e84, 0x6dd6f6b1, + 0x41e3abbc, 0x6dbd1f3c, 0x420ebecb, 0x6da336dc, 0x4239c7aa, 0x6d893d93, 0x4264c653, 0x6d6f3365, + 0x428fbabe, 0x6d551858, 0x42baa4e6, 0x6d3aec6e, 0x42e584c3, 0x6d20afac, 0x43105a50, 0x6d066215, + 0x433b2585, 0x6cec03af, 0x4365e65b, 0x6cd1947c, 0x43909ccd, 0x6cb71482, 0x43bb48d4, 0x6c9c83c3, + 0x43e5ea68, 0x6c81e245, 0x44108184, 0x6c67300b, 0x443b0e21, 0x6c4c6d1a, 0x44659039, 0x6c319975, + 0x449007c4, 0x6c16b521, 0x44ba74bd, 0x6bfbc021, 0x44e4d71c, 0x6be0ba7b, 0x450f2edb, 0x6bc5a431, + 0x45397bf4, 0x6baa7d49, 0x4563be60, 0x6b8f45c7, 0x458df619, 0x6b73fdae, 0x45b82318, 0x6b58a503, + 0x45e24556, 0x6b3d3bcb, 0x460c5cce, 0x6b21c208, 0x46366978, 0x6b0637c1, 0x46606b4e, 0x6aea9cf8, + 0x468a624a, 0x6acef1b2, 0x46b44e65, 0x6ab335f4, 0x46de2f99, 0x6a9769c1, 0x470805df, 0x6a7b8d1e, + 0x4731d131, 0x6a5fa010, 0x475b9188, 0x6a43a29a, 0x478546de, 0x6a2794c1, 0x47aef12c, 0x6a0b7689, + 0x47d8906d, 0x69ef47f6, 0x48022499, 0x69d3090e, 0x482badab, 0x69b6b9d3, 0x48552b9b, 0x699a5a4c, + 0x487e9e64, 0x697dea7b, 0x48a805ff, 0x69616a65, 0x48d16265, 0x6944da10, 0x48fab391, 0x6928397e, + 0x4923f97b, 0x690b88b5, 0x494d341e, 0x68eec7b9, 0x49766373, 0x68d1f68f, 0x499f8774, 0x68b5153a, + 0x49c8a01b, 0x689823bf, 0x49f1ad61, 0x687b2224, 0x4a1aaf3f, 0x685e106c, 0x4a43a5b0, 0x6840ee9b, + 0x4a6c90ad, 0x6823bcb7, 0x4a957030, 0x68067ac3, 0x4abe4433, 0x67e928c5, 0x4ae70caf, 0x67cbc6c0, + 0x4b0fc99d, 0x67ae54ba, 0x4b387af9, 0x6790d2b6, 0x4b6120bb, 0x677340ba, 0x4b89badd, 0x67559eca, + 0x4bb24958, 0x6737ecea, 0x4bdacc28, 0x671a2b20, 0x4c034345, 0x66fc596f, 0x4c2baea9, 0x66de77dc, + 0x4c540e4e, 0x66c0866d, 0x4c7c622d, 0x66a28524, 0x4ca4aa41, 0x66847408, 0x4ccce684, 0x6666531d, + 0x4cf516ee, 0x66482267, 0x4d1d3b7a, 0x6629e1ec, 0x4d455422, 0x660b91af, 0x4d6d60df, 0x65ed31b5, + 0x4d9561ac, 0x65cec204, 0x4dbd5682, 0x65b0429f, 0x4de53f5a, 0x6591b38c, 0x4e0d1c30, 0x657314cf, + 0x4e34ecfc, 0x6554666d, 0x4e5cb1b9, 0x6535a86b, 0x4e846a60, 0x6516dacd, 0x4eac16eb, 0x64f7fd98, + 0x4ed3b755, 0x64d910d1, 0x4efb4b96, 0x64ba147d, 0x4f22d3aa, 0x649b08a0, 0x4f4a4f89, 0x647bed3f, + 0x4f71bf2e, 0x645cc260, 0x4f992293, 0x643d8806, 0x4fc079b1, 0x641e3e38, 0x4fe7c483, 0x63fee4f8, + 0x500f0302, 0x63df7c4d, 0x50363529, 0x63c0043b, 0x505d5af1, 0x63a07cc7, 0x50847454, 0x6380e5f6, + 0x50ab814d, 0x63613fcd, 0x50d281d5, 0x63418a50, 0x50f975e6, 0x6321c585, 0x51205d7b, 0x6301f171, + 0x5147388c, 0x62e20e17, 0x516e0715, 0x62c21b7e, 0x5194c910, 0x62a219aa, 0x51bb7e75, 0x628208a1, + 0x51e22740, 0x6261e866, 0x5208c36a, 0x6241b8ff, 0x522f52ee, 0x62217a72, 0x5255d5c5, 0x62012cc2, + 0x527c4bea, 0x61e0cff5, 0x52a2b556, 0x61c06410, 0x52c91204, 0x619fe918, 0x52ef61ee, 0x617f5f12, + 0x5315a50e, 0x615ec603, 0x533bdb5d, 0x613e1df0, 0x536204d7, 0x611d66de, 0x53882175, 0x60fca0d2, + 0x53ae3131, 0x60dbcbd1, 0x53d43406, 0x60bae7e1, 0x53fa29ed, 0x6099f505, 0x542012e1, 0x6078f344, + 0x5445eedb, 0x6057e2a2, 0x546bbdd7, 0x6036c325, 0x54917fce, 0x601594d1, 0x54b734ba, 0x5ff457ad, + 0x54dcdc96, 0x5fd30bbc, 0x5502775c, 0x5fb1b104, 0x55280505, 0x5f90478a, 0x554d858d, 0x5f6ecf53, + 0x5572f8ed, 0x5f4d4865, 0x55985f20, 0x5f2bb2c5, 0x55bdb81f, 0x5f0a0e77, 0x55e303e6, 0x5ee85b82, + 0x5608426e, 0x5ec699e9, 0x562d73b2, 0x5ea4c9b3, 0x565297ab, 0x5e82eae5, 0x5677ae54, 0x5e60fd84, + 0x569cb7a8, 0x5e3f0194, 0x56c1b3a1, 0x5e1cf71c, 0x56e6a239, 0x5dfade20, 0x570b8369, 0x5dd8b6a7, + 0x5730572e, 0x5db680b4, 0x57551d80, 0x5d943c4e, 0x5779d65b, 0x5d71e979, 0x579e81b8, 0x5d4f883b, + 0x57c31f92, 0x5d2d189a, 0x57e7afe4, 0x5d0a9a9a, 0x580c32a7, 0x5ce80e41, 0x5830a7d6, 0x5cc57394, + 0x58550f6c, 0x5ca2ca99, 0x58796962, 0x5c801354, 0x589db5b3, 0x5c5d4dcc, 0x58c1f45b, 0x5c3a7a05, + 0x58e62552, 0x5c179806, 0x590a4893, 0x5bf4a7d2, 0x592e5e19, 0x5bd1a971, 0x595265df, 0x5bae9ce7, + 0x59765fde, 0x5b8b8239, 0x599a4c12, 0x5b68596d, 0x59be2a74, 0x5b452288, 0x59e1faff, 0x5b21dd90, + 0x5a05bdae, 0x5afe8a8b, 0x5a29727b, 0x5adb297d, 0x5a4d1960, 0x5ab7ba6c, 0x5a70b258, 0x5a943d5e, }; -const int kbdWindowOffset[NUM_IMDCT_SIZES] PROGMEM = {0, 128}; - -/* Synthesis window - KBD - * format = Q31 for nmdct = [128, 1024] - * reordered for sequential access - * - * aacScaleFact = -sqrt(1.0 / (2.0 * nmdct)); - * for (i = 0; i < nmdct/2; i++) { - * x = kbdWindowRef[i] * aacScaleFact; - * x = kbdWindowRef[nmdct - 1 - i] * aacScaleFact; - * } - * Note: see below for code to generate kbdWindowRef[] - */ +const int kbdWindowOffset[NUM_IMDCT_SIZES] DPROGMEM = {0, 128}; + +/* Synthesis window - KBD + format = Q31 for nmdct = [128, 1024] + reordered for sequential access + + aacScaleFact = -sqrt(1.0 / (2.0 * nmdct)); + for (i = 0; i < nmdct/2; i++) { + x = kbdWindowRef[i] * aacScaleFact; + x = kbdWindowRef[nmdct - 1 - i] * aacScaleFact; + } + Note: see below for code to generate kbdWindowRef[] +*/ const int kbdWindow[128 + 1024] PROGMEM = { -/* 128 - format = Q31 * 2^0 */ -0x00016f63, 0x7ffffffe, 0x0003e382, 0x7ffffff1, 0x00078f64, 0x7fffffc7, 0x000cc323, 0x7fffff5d, -0x0013d9ed, 0x7ffffe76, 0x001d3a9d, 0x7ffffcaa, 0x0029581f, 0x7ffff953, 0x0038b1bd, 0x7ffff372, -0x004bd34d, 0x7fffe98b, 0x00635538, 0x7fffd975, 0x007fdc64, 0x7fffc024, 0x00a219f1, 0x7fff995b, -0x00cacad0, 0x7fff5f5b, 0x00fab72d, 0x7fff0a75, 0x0132b1af, 0x7ffe9091, 0x01739689, 0x7ffde49e, -0x01be4a63, 0x7ffcf5ef, 0x0213b910, 0x7ffbaf84, 0x0274d41e, 0x7ff9f73a, 0x02e2913a, 0x7ff7acf1, -0x035de86c, 0x7ff4a99a, 0x03e7d233, 0x7ff0be3d, 0x0481457c, 0x7febb2f1, 0x052b357c, 0x7fe545d4, -0x05e68f77, 0x7fdd2a02, 0x06b4386f, 0x7fd30695, 0x07950acb, 0x7fc675b4, 0x0889d3ef, 0x7fb703be, -0x099351e0, 0x7fa42e89, 0x0ab230e0, 0x7f8d64d8, 0x0be70923, 0x7f7205f8, 0x0d325c93, 0x7f516195, -0x0e9494ae, 0x7f2ab7d0, 0x100e0085, 0x7efd3997, 0x119ed2ef, 0x7ec8094a, 0x134720d8, 0x7e8a3ba7, -0x1506dfdc, 0x7e42d906, 0x16dde50b, 0x7df0dee4, 0x18cbe3f7, 0x7d9341b4, 0x1ad06e07, 0x7d28ef02, -0x1ceaf215, 0x7cb0cfcc, 0x1f1abc4f, 0x7c29cb20, 0x215ef677, 0x7b92c8eb, 0x23b6a867, 0x7aeab4ec, -0x2620b8ec, 0x7a3081d0, 0x289beef5, 0x79632c5a, 0x2b26f30b, 0x7881be95, 0x2dc0511f, 0x778b5304, -0x30667aa2, 0x767f17c0, 0x3317c8dd, 0x755c5178, 0x35d27f98, 0x74225e50, 0x3894cff3, 0x72d0b887, -0x3b5cdb7b, 0x7166f8e7, 0x3e28b770, 0x6fe4d8e8, 0x40f6702a, 0x6e4a3491, 0x43c40caa, 0x6c970bfc, -0x468f9231, 0x6acb8483, 0x495707f5, 0x68e7e994, 0x4c187ac7, 0x66ecad1c, 0x4ed200c5, 0x64da6797, -0x5181bcea, 0x62b1d7b7, 0x5425e28e, 0x6073e1ae, 0x56bcb8c2, 0x5e218e16, 0x59449d76, 0x5bbc0875, -/* 1024 - format = Q31 * 2^0 */ -0x0009962f, 0x7fffffa4, 0x000e16fb, 0x7fffff39, 0x0011ea65, 0x7ffffebf, 0x0015750e, 0x7ffffe34, -0x0018dc74, 0x7ffffd96, 0x001c332e, 0x7ffffce5, 0x001f83f5, 0x7ffffc1f, 0x0022d59a, 0x7ffffb43, -0x00262cc2, 0x7ffffa4f, 0x00298cc4, 0x7ffff942, 0x002cf81f, 0x7ffff81a, 0x003070c4, 0x7ffff6d6, -0x0033f840, 0x7ffff573, 0x00378fd9, 0x7ffff3f1, 0x003b38a1, 0x7ffff24d, 0x003ef381, 0x7ffff085, -0x0042c147, 0x7fffee98, 0x0046a2a8, 0x7fffec83, 0x004a9847, 0x7fffea44, 0x004ea2b7, 0x7fffe7d8, -0x0052c283, 0x7fffe53f, 0x0056f829, 0x7fffe274, 0x005b4422, 0x7fffdf76, 0x005fa6dd, 0x7fffdc43, -0x006420c8, 0x7fffd8d6, 0x0068b249, 0x7fffd52f, 0x006d5bc4, 0x7fffd149, 0x00721d9a, 0x7fffcd22, -0x0076f828, 0x7fffc8b6, 0x007bebca, 0x7fffc404, 0x0080f8d9, 0x7fffbf06, 0x00861fae, 0x7fffb9bb, -0x008b609e, 0x7fffb41e, 0x0090bbff, 0x7fffae2c, 0x00963224, 0x7fffa7e1, 0x009bc362, 0x7fffa13a, -0x00a17009, 0x7fff9a32, 0x00a7386c, 0x7fff92c5, 0x00ad1cdc, 0x7fff8af0, 0x00b31da8, 0x7fff82ad, -0x00b93b21, 0x7fff79f9, 0x00bf7596, 0x7fff70cf, 0x00c5cd57, 0x7fff672a, 0x00cc42b1, 0x7fff5d05, -0x00d2d5f3, 0x7fff525c, 0x00d9876c, 0x7fff4729, 0x00e05769, 0x7fff3b66, 0x00e74638, 0x7fff2f10, -0x00ee5426, 0x7fff221f, 0x00f58182, 0x7fff148e, 0x00fcce97, 0x7fff0658, 0x01043bb3, 0x7ffef776, -0x010bc923, 0x7ffee7e2, 0x01137733, 0x7ffed795, 0x011b4631, 0x7ffec68a, 0x01233669, 0x7ffeb4ba, -0x012b4827, 0x7ffea21d, 0x01337bb8, 0x7ffe8eac, 0x013bd167, 0x7ffe7a61, 0x01444982, 0x7ffe6533, -0x014ce454, 0x7ffe4f1c, 0x0155a229, 0x7ffe3813, 0x015e834d, 0x7ffe2011, 0x0167880c, 0x7ffe070d, -0x0170b0b2, 0x7ffdecff, 0x0179fd8b, 0x7ffdd1df, 0x01836ee1, 0x7ffdb5a2, 0x018d0500, 0x7ffd9842, -0x0196c035, 0x7ffd79b3, 0x01a0a0ca, 0x7ffd59ee, 0x01aaa70a, 0x7ffd38e8, 0x01b4d341, 0x7ffd1697, -0x01bf25b9, 0x7ffcf2f2, 0x01c99ebd, 0x7ffccdee, 0x01d43e99, 0x7ffca780, 0x01df0597, 0x7ffc7f9e, -0x01e9f401, 0x7ffc563d, 0x01f50a22, 0x7ffc2b51, 0x02004844, 0x7ffbfecf, 0x020baeb1, 0x7ffbd0ab, -0x02173db4, 0x7ffba0da, 0x0222f596, 0x7ffb6f4f, 0x022ed6a1, 0x7ffb3bfd, 0x023ae11f, 0x7ffb06d8, -0x02471558, 0x7ffacfd3, 0x02537397, 0x7ffa96e0, 0x025ffc25, 0x7ffa5bf2, 0x026caf4a, 0x7ffa1efc, -0x02798d4f, 0x7ff9dfee, 0x0286967c, 0x7ff99ebb, 0x0293cb1b, 0x7ff95b55, 0x02a12b72, 0x7ff915ab, -0x02aeb7cb, 0x7ff8cdaf, 0x02bc706d, 0x7ff88351, 0x02ca559f, 0x7ff83682, 0x02d867a9, 0x7ff7e731, -0x02e6a6d2, 0x7ff7954e, 0x02f51361, 0x7ff740c8, 0x0303ad9c, 0x7ff6e98e, 0x031275ca, 0x7ff68f8f, -0x03216c30, 0x7ff632ba, 0x03309116, 0x7ff5d2fb, 0x033fe4bf, 0x7ff57042, 0x034f6773, 0x7ff50a7a, -0x035f1975, 0x7ff4a192, 0x036efb0a, 0x7ff43576, 0x037f0c78, 0x7ff3c612, 0x038f4e02, 0x7ff35353, -0x039fbfeb, 0x7ff2dd24, 0x03b06279, 0x7ff26370, 0x03c135ed, 0x7ff1e623, 0x03d23a8b, 0x7ff16527, -0x03e37095, 0x7ff0e067, 0x03f4d84e, 0x7ff057cc, 0x040671f7, 0x7fefcb40, 0x04183dd3, 0x7fef3aad, -0x042a3c22, 0x7feea5fa, 0x043c6d25, 0x7fee0d11, 0x044ed11d, 0x7fed6fda, 0x04616849, 0x7fecce3d, -0x047432eb, 0x7fec2821, 0x04873140, 0x7feb7d6c, 0x049a6388, 0x7feace07, 0x04adca01, 0x7fea19d6, -0x04c164ea, 0x7fe960c0, 0x04d53481, 0x7fe8a2aa, 0x04e93902, 0x7fe7df79, 0x04fd72aa, 0x7fe71712, -0x0511e1b6, 0x7fe6495a, 0x05268663, 0x7fe57634, 0x053b60eb, 0x7fe49d83, 0x05507189, 0x7fe3bf2b, -0x0565b879, 0x7fe2db0f, 0x057b35f4, 0x7fe1f110, 0x0590ea35, 0x7fe10111, 0x05a6d574, 0x7fe00af3, -0x05bcf7ea, 0x7fdf0e97, 0x05d351cf, 0x7fde0bdd, 0x05e9e35c, 0x7fdd02a6, 0x0600acc8, 0x7fdbf2d2, -0x0617ae48, 0x7fdadc40, 0x062ee814, 0x7fd9becf, 0x06465a62, 0x7fd89a5e, 0x065e0565, 0x7fd76eca, -0x0675e954, 0x7fd63bf1, 0x068e0662, 0x7fd501b0, 0x06a65cc3, 0x7fd3bfe4, 0x06beecaa, 0x7fd2766a, -0x06d7b648, 0x7fd1251e, 0x06f0b9d1, 0x7fcfcbda, 0x0709f775, 0x7fce6a7a, 0x07236f65, 0x7fcd00d8, -0x073d21d2, 0x7fcb8ecf, 0x07570eea, 0x7fca1439, 0x077136dd, 0x7fc890ed, 0x078b99da, 0x7fc704c7, -0x07a6380d, 0x7fc56f9d, 0x07c111a4, 0x7fc3d147, 0x07dc26cc, 0x7fc2299e, 0x07f777b1, 0x7fc07878, -0x0813047d, 0x7fbebdac, 0x082ecd5b, 0x7fbcf90f, 0x084ad276, 0x7fbb2a78, 0x086713f7, 0x7fb951bc, -0x08839206, 0x7fb76eaf, 0x08a04ccb, 0x7fb58126, 0x08bd446e, 0x7fb388f4, 0x08da7915, 0x7fb185ee, -0x08f7eae7, 0x7faf77e5, 0x09159a09, 0x7fad5ead, 0x0933869f, 0x7fab3a17, 0x0951b0cd, 0x7fa909f6, -0x097018b7, 0x7fa6ce1a, 0x098ebe7f, 0x7fa48653, 0x09ada248, 0x7fa23273, 0x09ccc431, 0x7f9fd249, -0x09ec245b, 0x7f9d65a4, 0x0a0bc2e7, 0x7f9aec53, 0x0a2b9ff3, 0x7f986625, 0x0a4bbb9e, 0x7f95d2e7, -0x0a6c1604, 0x7f933267, 0x0a8caf43, 0x7f908472, 0x0aad8776, 0x7f8dc8d5, 0x0ace9eb9, 0x7f8aff5c, -0x0aeff526, 0x7f8827d3, 0x0b118ad8, 0x7f854204, 0x0b335fe6, 0x7f824dbb, 0x0b557469, 0x7f7f4ac3, -0x0b77c879, 0x7f7c38e4, 0x0b9a5c2b, 0x7f7917e9, 0x0bbd2f97, 0x7f75e79b, 0x0be042d0, 0x7f72a7c3, -0x0c0395ec, 0x7f6f5828, 0x0c2728fd, 0x7f6bf892, 0x0c4afc16, 0x7f6888c9, 0x0c6f0f4a, 0x7f650894, -0x0c9362a8, 0x7f6177b9, 0x0cb7f642, 0x7f5dd5ff, 0x0cdcca26, 0x7f5a232a, 0x0d01de63, 0x7f565f00, -0x0d273307, 0x7f528947, 0x0d4cc81f, 0x7f4ea1c2, 0x0d729db7, 0x7f4aa835, 0x0d98b3da, 0x7f469c65, -0x0dbf0a92, 0x7f427e13, 0x0de5a1e9, 0x7f3e4d04, 0x0e0c79e7, 0x7f3a08f9, 0x0e339295, 0x7f35b1b4, -0x0e5aebfa, 0x7f3146f8, 0x0e82861a, 0x7f2cc884, 0x0eaa60fd, 0x7f28361b, 0x0ed27ca5, 0x7f238f7c, -0x0efad917, 0x7f1ed467, 0x0f237656, 0x7f1a049d, 0x0f4c5462, 0x7f151fdc, 0x0f75733d, 0x7f1025e3, -0x0f9ed2e6, 0x7f0b1672, 0x0fc8735e, 0x7f05f146, 0x0ff254a1, 0x7f00b61d, 0x101c76ae, 0x7efb64b4, -0x1046d981, 0x7ef5fcca, 0x10717d15, 0x7ef07e19, 0x109c6165, 0x7eeae860, 0x10c7866a, 0x7ee53b5b, -0x10f2ec1e, 0x7edf76c4, 0x111e9279, 0x7ed99a58, 0x114a7971, 0x7ed3a5d1, 0x1176a0fc, 0x7ecd98eb, -0x11a30910, 0x7ec77360, 0x11cfb1a1, 0x7ec134eb, 0x11fc9aa2, 0x7ebadd44, 0x1229c406, 0x7eb46c27, -0x12572dbf, 0x7eade14c, 0x1284d7bc, 0x7ea73c6c, 0x12b2c1ed, 0x7ea07d41, 0x12e0ec42, 0x7e99a382, -0x130f56a8, 0x7e92aee7, 0x133e010b, 0x7e8b9f2a, 0x136ceb59, 0x7e847402, 0x139c157b, 0x7e7d2d25, -0x13cb7f5d, 0x7e75ca4c, 0x13fb28e6, 0x7e6e4b2d, 0x142b1200, 0x7e66af7f, 0x145b3a92, 0x7e5ef6f8, -0x148ba281, 0x7e572150, 0x14bc49b4, 0x7e4f2e3b, 0x14ed300f, 0x7e471d70, 0x151e5575, 0x7e3eeea5, -0x154fb9c9, 0x7e36a18e, 0x15815ced, 0x7e2e35e2, 0x15b33ec1, 0x7e25ab56, 0x15e55f25, 0x7e1d019e, -0x1617bdf9, 0x7e14386e, 0x164a5b19, 0x7e0b4f7d, 0x167d3662, 0x7e02467e, 0x16b04fb2, 0x7df91d25, -0x16e3a6e2, 0x7defd327, 0x17173bce, 0x7de66837, 0x174b0e4d, 0x7ddcdc0a, 0x177f1e39, 0x7dd32e53, -0x17b36b69, 0x7dc95ec6, 0x17e7f5b3, 0x7dbf6d17, 0x181cbcec, 0x7db558f9, 0x1851c0e9, 0x7dab221f, -0x1887017d, 0x7da0c83c, 0x18bc7e7c, 0x7d964b05, 0x18f237b6, 0x7d8baa2b, 0x19282cfd, 0x7d80e563, -0x195e5e20, 0x7d75fc5e, 0x1994caee, 0x7d6aeed0, 0x19cb7335, 0x7d5fbc6d, 0x1a0256c2, 0x7d5464e6, -0x1a397561, 0x7d48e7ef, 0x1a70cede, 0x7d3d453b, 0x1aa86301, 0x7d317c7c, 0x1ae03195, 0x7d258d65, -0x1b183a63, 0x7d1977aa, 0x1b507d30, 0x7d0d3afc, 0x1b88f9c5, 0x7d00d710, 0x1bc1afe6, 0x7cf44b97, -0x1bfa9f58, 0x7ce79846, 0x1c33c7e0, 0x7cdabcce, 0x1c6d293f, 0x7ccdb8e4, 0x1ca6c337, 0x7cc08c39, -0x1ce0958a, 0x7cb33682, 0x1d1a9ff8, 0x7ca5b772, 0x1d54e240, 0x7c980ebd, 0x1d8f5c21, 0x7c8a3c14, -0x1dca0d56, 0x7c7c3f2e, 0x1e04f59f, 0x7c6e17bc, 0x1e4014b4, 0x7c5fc573, 0x1e7b6a53, 0x7c514807, -0x1eb6f633, 0x7c429f2c, 0x1ef2b80f, 0x7c33ca96, 0x1f2eaf9e, 0x7c24c9fa, 0x1f6adc98, 0x7c159d0d, -0x1fa73eb2, 0x7c064383, 0x1fe3d5a3, 0x7bf6bd11, 0x2020a11e, 0x7be7096c, 0x205da0d8, 0x7bd7284a, -0x209ad483, 0x7bc71960, 0x20d83bd1, 0x7bb6dc65, 0x2115d674, 0x7ba6710d, 0x2153a41b, 0x7b95d710, -0x2191a476, 0x7b850e24, 0x21cfd734, 0x7b7415ff, 0x220e3c02, 0x7b62ee59, 0x224cd28d, 0x7b5196e9, -0x228b9a82, 0x7b400f67, 0x22ca938a, 0x7b2e578a, 0x2309bd52, 0x7b1c6f0b, 0x23491783, 0x7b0a55a1, -0x2388a1c4, 0x7af80b07, 0x23c85bbf, 0x7ae58ef5, 0x2408451a, 0x7ad2e124, 0x24485d7c, 0x7ac0014e, -0x2488a48a, 0x7aacef2e, 0x24c919e9, 0x7a99aa7e, 0x2509bd3d, 0x7a8632f8, 0x254a8e29, 0x7a728858, -0x258b8c50, 0x7a5eaa5a, 0x25ccb753, 0x7a4a98b9, 0x260e0ed3, 0x7a365333, 0x264f9271, 0x7a21d983, -0x269141cb, 0x7a0d2b68, 0x26d31c80, 0x79f8489e, 0x2715222f, 0x79e330e4, 0x27575273, 0x79cde3f8, -0x2799acea, 0x79b8619a, 0x27dc3130, 0x79a2a989, 0x281ededf, 0x798cbb85, 0x2861b591, 0x7976974e, -0x28a4b4e0, 0x79603ca5, 0x28e7dc65, 0x7949ab4c, 0x292b2bb8, 0x7932e304, 0x296ea270, 0x791be390, -0x29b24024, 0x7904acb3, 0x29f6046b, 0x78ed3e30, 0x2a39eed8, 0x78d597cc, 0x2a7dff02, 0x78bdb94a, -0x2ac2347c, 0x78a5a270, 0x2b068eda, 0x788d5304, 0x2b4b0dae, 0x7874cacb, 0x2b8fb08a, 0x785c098d, -0x2bd47700, 0x78430f11, 0x2c1960a1, 0x7829db1f, 0x2c5e6cfd, 0x78106d7f, 0x2ca39ba3, 0x77f6c5fb, -0x2ce8ec23, 0x77dce45c, 0x2d2e5e0b, 0x77c2c86e, 0x2d73f0e8, 0x77a871fa, 0x2db9a449, 0x778de0cd, -0x2dff77b8, 0x777314b2, 0x2e456ac4, 0x77580d78, 0x2e8b7cf6, 0x773ccaeb, 0x2ed1addb, 0x77214cdb, -0x2f17fcfb, 0x77059315, 0x2f5e69e2, 0x76e99d69, 0x2fa4f419, 0x76cd6ba9, 0x2feb9b27, 0x76b0fda4, -0x30325e96, 0x7694532e, 0x30793dee, 0x76776c17, 0x30c038b5, 0x765a4834, 0x31074e72, 0x763ce759, -0x314e7eab, 0x761f4959, 0x3195c8e6, 0x76016e0b, 0x31dd2ca9, 0x75e35545, 0x3224a979, 0x75c4fedc, -0x326c3ed8, 0x75a66aab, 0x32b3ec4d, 0x75879887, 0x32fbb159, 0x7568884b, 0x33438d81, 0x754939d1, -0x338b8045, 0x7529acf4, 0x33d3892a, 0x7509e18e, 0x341ba7b1, 0x74e9d77d, 0x3463db5a, 0x74c98e9e, -0x34ac23a7, 0x74a906cd, 0x34f48019, 0x74883fec, 0x353cf02f, 0x746739d8, 0x3585736a, 0x7445f472, -0x35ce0949, 0x74246f9c, 0x3616b14c, 0x7402ab37, 0x365f6af0, 0x73e0a727, 0x36a835b5, 0x73be6350, -0x36f11118, 0x739bdf95, 0x3739fc98, 0x73791bdd, 0x3782f7b2, 0x7356180e, 0x37cc01e3, 0x7332d410, -0x38151aa8, 0x730f4fc9, 0x385e417e, 0x72eb8b24, 0x38a775e1, 0x72c7860a, 0x38f0b74d, 0x72a34066, -0x393a053e, 0x727eba24, 0x39835f30, 0x7259f331, 0x39ccc49e, 0x7234eb79, 0x3a163503, 0x720fa2eb, -0x3a5fafda, 0x71ea1977, 0x3aa9349e, 0x71c44f0c, 0x3af2c2ca, 0x719e439d, 0x3b3c59d7, 0x7177f71a, -0x3b85f940, 0x71516978, 0x3bcfa07e, 0x712a9aaa, 0x3c194f0d, 0x71038aa4, 0x3c630464, 0x70dc395e, -0x3cacbfff, 0x70b4a6cd, 0x3cf68155, 0x708cd2e9, 0x3d4047e1, 0x7064bdab, 0x3d8a131c, 0x703c670d, -0x3dd3e27e, 0x7013cf0a, 0x3e1db580, 0x6feaf59c, 0x3e678b9b, 0x6fc1dac1, 0x3eb16449, 0x6f987e76, -0x3efb3f01, 0x6f6ee0b9, 0x3f451b3d, 0x6f45018b, 0x3f8ef874, 0x6f1ae0eb, 0x3fd8d620, 0x6ef07edb, -0x4022b3b9, 0x6ec5db5d, 0x406c90b7, 0x6e9af675, 0x40b66c93, 0x6e6fd027, 0x410046c5, 0x6e446879, -0x414a1ec6, 0x6e18bf71, 0x4193f40d, 0x6decd517, 0x41ddc615, 0x6dc0a972, 0x42279455, 0x6d943c8d, -0x42715e45, 0x6d678e71, 0x42bb235f, 0x6d3a9f2a, 0x4304e31a, 0x6d0d6ec5, 0x434e9cf1, 0x6cdffd4f, -0x4398505b, 0x6cb24ad6, 0x43e1fcd1, 0x6c84576b, 0x442ba1cd, 0x6c56231c, 0x44753ec7, 0x6c27adfd, -0x44bed33a, 0x6bf8f81e, 0x45085e9d, 0x6bca0195, 0x4551e06b, 0x6b9aca75, 0x459b581e, 0x6b6b52d5, -0x45e4c52f, 0x6b3b9ac9, 0x462e2717, 0x6b0ba26b, 0x46777d52, 0x6adb69d3, 0x46c0c75a, 0x6aaaf11b, -0x470a04a9, 0x6a7a385c, 0x475334b9, 0x6a493fb3, 0x479c5707, 0x6a18073d, 0x47e56b0c, 0x69e68f17, -0x482e7045, 0x69b4d761, 0x4877662c, 0x6982e039, 0x48c04c3f, 0x6950a9c0, 0x490921f8, 0x691e341a, -0x4951e6d5, 0x68eb7f67, 0x499a9a51, 0x68b88bcd, 0x49e33beb, 0x68855970, 0x4a2bcb1f, 0x6851e875, -0x4a74476b, 0x681e3905, 0x4abcb04c, 0x67ea4b47, 0x4b050541, 0x67b61f63, 0x4b4d45c9, 0x6781b585, -0x4b957162, 0x674d0dd6, 0x4bdd878c, 0x67182883, 0x4c2587c6, 0x66e305b8, 0x4c6d7190, 0x66ada5a5, -0x4cb5446a, 0x66780878, 0x4cfcffd5, 0x66422e60, 0x4d44a353, 0x660c1790, 0x4d8c2e64, 0x65d5c439, -0x4dd3a08c, 0x659f348e, 0x4e1af94b, 0x656868c3, 0x4e623825, 0x6531610d, 0x4ea95c9d, 0x64fa1da3, -0x4ef06637, 0x64c29ebb, 0x4f375477, 0x648ae48d, 0x4f7e26e1, 0x6452ef53, 0x4fc4dcfb, 0x641abf46, -0x500b7649, 0x63e254a2, 0x5051f253, 0x63a9afa2, 0x5098509f, 0x6370d083, 0x50de90b3, 0x6337b784, -0x5124b218, 0x62fe64e3, 0x516ab455, 0x62c4d8e0, 0x51b096f3, 0x628b13bc, 0x51f6597b, 0x625115b8, -0x523bfb78, 0x6216df18, 0x52817c72, 0x61dc701f, 0x52c6dbf5, 0x61a1c912, 0x530c198d, 0x6166ea36, -0x535134c5, 0x612bd3d2, 0x53962d2a, 0x60f0862d, 0x53db024a, 0x60b50190, 0x541fb3b1, 0x60794644, -0x546440ef, 0x603d5494, 0x54a8a992, 0x60012cca, 0x54eced2b, 0x5fc4cf33, 0x55310b48, 0x5f883c1c, -0x5575037c, 0x5f4b73d2, 0x55b8d558, 0x5f0e76a5, 0x55fc806f, 0x5ed144e5, 0x56400452, 0x5e93dee1, -0x56836096, 0x5e5644ec, 0x56c694cf, 0x5e187757, 0x5709a092, 0x5dda7677, 0x574c8374, 0x5d9c429f, -0x578f3d0d, 0x5d5ddc24, 0x57d1ccf2, 0x5d1f435d, 0x581432bd, 0x5ce078a0, 0x58566e04, 0x5ca17c45, -0x58987e63, 0x5c624ea4, 0x58da6372, 0x5c22f016, 0x591c1ccc, 0x5be360f6, 0x595daa0d, 0x5ba3a19f, -0x599f0ad1, 0x5b63b26c, 0x59e03eb6, 0x5b2393ba, 0x5a214558, 0x5ae345e7, 0x5a621e56, 0x5aa2c951, + /* 128 - format = Q31 * 2^0 */ + 0x00016f63, 0x7ffffffe, 0x0003e382, 0x7ffffff1, 0x00078f64, 0x7fffffc7, 0x000cc323, 0x7fffff5d, + 0x0013d9ed, 0x7ffffe76, 0x001d3a9d, 0x7ffffcaa, 0x0029581f, 0x7ffff953, 0x0038b1bd, 0x7ffff372, + 0x004bd34d, 0x7fffe98b, 0x00635538, 0x7fffd975, 0x007fdc64, 0x7fffc024, 0x00a219f1, 0x7fff995b, + 0x00cacad0, 0x7fff5f5b, 0x00fab72d, 0x7fff0a75, 0x0132b1af, 0x7ffe9091, 0x01739689, 0x7ffde49e, + 0x01be4a63, 0x7ffcf5ef, 0x0213b910, 0x7ffbaf84, 0x0274d41e, 0x7ff9f73a, 0x02e2913a, 0x7ff7acf1, + 0x035de86c, 0x7ff4a99a, 0x03e7d233, 0x7ff0be3d, 0x0481457c, 0x7febb2f1, 0x052b357c, 0x7fe545d4, + 0x05e68f77, 0x7fdd2a02, 0x06b4386f, 0x7fd30695, 0x07950acb, 0x7fc675b4, 0x0889d3ef, 0x7fb703be, + 0x099351e0, 0x7fa42e89, 0x0ab230e0, 0x7f8d64d8, 0x0be70923, 0x7f7205f8, 0x0d325c93, 0x7f516195, + 0x0e9494ae, 0x7f2ab7d0, 0x100e0085, 0x7efd3997, 0x119ed2ef, 0x7ec8094a, 0x134720d8, 0x7e8a3ba7, + 0x1506dfdc, 0x7e42d906, 0x16dde50b, 0x7df0dee4, 0x18cbe3f7, 0x7d9341b4, 0x1ad06e07, 0x7d28ef02, + 0x1ceaf215, 0x7cb0cfcc, 0x1f1abc4f, 0x7c29cb20, 0x215ef677, 0x7b92c8eb, 0x23b6a867, 0x7aeab4ec, + 0x2620b8ec, 0x7a3081d0, 0x289beef5, 0x79632c5a, 0x2b26f30b, 0x7881be95, 0x2dc0511f, 0x778b5304, + 0x30667aa2, 0x767f17c0, 0x3317c8dd, 0x755c5178, 0x35d27f98, 0x74225e50, 0x3894cff3, 0x72d0b887, + 0x3b5cdb7b, 0x7166f8e7, 0x3e28b770, 0x6fe4d8e8, 0x40f6702a, 0x6e4a3491, 0x43c40caa, 0x6c970bfc, + 0x468f9231, 0x6acb8483, 0x495707f5, 0x68e7e994, 0x4c187ac7, 0x66ecad1c, 0x4ed200c5, 0x64da6797, + 0x5181bcea, 0x62b1d7b7, 0x5425e28e, 0x6073e1ae, 0x56bcb8c2, 0x5e218e16, 0x59449d76, 0x5bbc0875, + /* 1024 - format = Q31 * 2^0 */ + 0x0009962f, 0x7fffffa4, 0x000e16fb, 0x7fffff39, 0x0011ea65, 0x7ffffebf, 0x0015750e, 0x7ffffe34, + 0x0018dc74, 0x7ffffd96, 0x001c332e, 0x7ffffce5, 0x001f83f5, 0x7ffffc1f, 0x0022d59a, 0x7ffffb43, + 0x00262cc2, 0x7ffffa4f, 0x00298cc4, 0x7ffff942, 0x002cf81f, 0x7ffff81a, 0x003070c4, 0x7ffff6d6, + 0x0033f840, 0x7ffff573, 0x00378fd9, 0x7ffff3f1, 0x003b38a1, 0x7ffff24d, 0x003ef381, 0x7ffff085, + 0x0042c147, 0x7fffee98, 0x0046a2a8, 0x7fffec83, 0x004a9847, 0x7fffea44, 0x004ea2b7, 0x7fffe7d8, + 0x0052c283, 0x7fffe53f, 0x0056f829, 0x7fffe274, 0x005b4422, 0x7fffdf76, 0x005fa6dd, 0x7fffdc43, + 0x006420c8, 0x7fffd8d6, 0x0068b249, 0x7fffd52f, 0x006d5bc4, 0x7fffd149, 0x00721d9a, 0x7fffcd22, + 0x0076f828, 0x7fffc8b6, 0x007bebca, 0x7fffc404, 0x0080f8d9, 0x7fffbf06, 0x00861fae, 0x7fffb9bb, + 0x008b609e, 0x7fffb41e, 0x0090bbff, 0x7fffae2c, 0x00963224, 0x7fffa7e1, 0x009bc362, 0x7fffa13a, + 0x00a17009, 0x7fff9a32, 0x00a7386c, 0x7fff92c5, 0x00ad1cdc, 0x7fff8af0, 0x00b31da8, 0x7fff82ad, + 0x00b93b21, 0x7fff79f9, 0x00bf7596, 0x7fff70cf, 0x00c5cd57, 0x7fff672a, 0x00cc42b1, 0x7fff5d05, + 0x00d2d5f3, 0x7fff525c, 0x00d9876c, 0x7fff4729, 0x00e05769, 0x7fff3b66, 0x00e74638, 0x7fff2f10, + 0x00ee5426, 0x7fff221f, 0x00f58182, 0x7fff148e, 0x00fcce97, 0x7fff0658, 0x01043bb3, 0x7ffef776, + 0x010bc923, 0x7ffee7e2, 0x01137733, 0x7ffed795, 0x011b4631, 0x7ffec68a, 0x01233669, 0x7ffeb4ba, + 0x012b4827, 0x7ffea21d, 0x01337bb8, 0x7ffe8eac, 0x013bd167, 0x7ffe7a61, 0x01444982, 0x7ffe6533, + 0x014ce454, 0x7ffe4f1c, 0x0155a229, 0x7ffe3813, 0x015e834d, 0x7ffe2011, 0x0167880c, 0x7ffe070d, + 0x0170b0b2, 0x7ffdecff, 0x0179fd8b, 0x7ffdd1df, 0x01836ee1, 0x7ffdb5a2, 0x018d0500, 0x7ffd9842, + 0x0196c035, 0x7ffd79b3, 0x01a0a0ca, 0x7ffd59ee, 0x01aaa70a, 0x7ffd38e8, 0x01b4d341, 0x7ffd1697, + 0x01bf25b9, 0x7ffcf2f2, 0x01c99ebd, 0x7ffccdee, 0x01d43e99, 0x7ffca780, 0x01df0597, 0x7ffc7f9e, + 0x01e9f401, 0x7ffc563d, 0x01f50a22, 0x7ffc2b51, 0x02004844, 0x7ffbfecf, 0x020baeb1, 0x7ffbd0ab, + 0x02173db4, 0x7ffba0da, 0x0222f596, 0x7ffb6f4f, 0x022ed6a1, 0x7ffb3bfd, 0x023ae11f, 0x7ffb06d8, + 0x02471558, 0x7ffacfd3, 0x02537397, 0x7ffa96e0, 0x025ffc25, 0x7ffa5bf2, 0x026caf4a, 0x7ffa1efc, + 0x02798d4f, 0x7ff9dfee, 0x0286967c, 0x7ff99ebb, 0x0293cb1b, 0x7ff95b55, 0x02a12b72, 0x7ff915ab, + 0x02aeb7cb, 0x7ff8cdaf, 0x02bc706d, 0x7ff88351, 0x02ca559f, 0x7ff83682, 0x02d867a9, 0x7ff7e731, + 0x02e6a6d2, 0x7ff7954e, 0x02f51361, 0x7ff740c8, 0x0303ad9c, 0x7ff6e98e, 0x031275ca, 0x7ff68f8f, + 0x03216c30, 0x7ff632ba, 0x03309116, 0x7ff5d2fb, 0x033fe4bf, 0x7ff57042, 0x034f6773, 0x7ff50a7a, + 0x035f1975, 0x7ff4a192, 0x036efb0a, 0x7ff43576, 0x037f0c78, 0x7ff3c612, 0x038f4e02, 0x7ff35353, + 0x039fbfeb, 0x7ff2dd24, 0x03b06279, 0x7ff26370, 0x03c135ed, 0x7ff1e623, 0x03d23a8b, 0x7ff16527, + 0x03e37095, 0x7ff0e067, 0x03f4d84e, 0x7ff057cc, 0x040671f7, 0x7fefcb40, 0x04183dd3, 0x7fef3aad, + 0x042a3c22, 0x7feea5fa, 0x043c6d25, 0x7fee0d11, 0x044ed11d, 0x7fed6fda, 0x04616849, 0x7fecce3d, + 0x047432eb, 0x7fec2821, 0x04873140, 0x7feb7d6c, 0x049a6388, 0x7feace07, 0x04adca01, 0x7fea19d6, + 0x04c164ea, 0x7fe960c0, 0x04d53481, 0x7fe8a2aa, 0x04e93902, 0x7fe7df79, 0x04fd72aa, 0x7fe71712, + 0x0511e1b6, 0x7fe6495a, 0x05268663, 0x7fe57634, 0x053b60eb, 0x7fe49d83, 0x05507189, 0x7fe3bf2b, + 0x0565b879, 0x7fe2db0f, 0x057b35f4, 0x7fe1f110, 0x0590ea35, 0x7fe10111, 0x05a6d574, 0x7fe00af3, + 0x05bcf7ea, 0x7fdf0e97, 0x05d351cf, 0x7fde0bdd, 0x05e9e35c, 0x7fdd02a6, 0x0600acc8, 0x7fdbf2d2, + 0x0617ae48, 0x7fdadc40, 0x062ee814, 0x7fd9becf, 0x06465a62, 0x7fd89a5e, 0x065e0565, 0x7fd76eca, + 0x0675e954, 0x7fd63bf1, 0x068e0662, 0x7fd501b0, 0x06a65cc3, 0x7fd3bfe4, 0x06beecaa, 0x7fd2766a, + 0x06d7b648, 0x7fd1251e, 0x06f0b9d1, 0x7fcfcbda, 0x0709f775, 0x7fce6a7a, 0x07236f65, 0x7fcd00d8, + 0x073d21d2, 0x7fcb8ecf, 0x07570eea, 0x7fca1439, 0x077136dd, 0x7fc890ed, 0x078b99da, 0x7fc704c7, + 0x07a6380d, 0x7fc56f9d, 0x07c111a4, 0x7fc3d147, 0x07dc26cc, 0x7fc2299e, 0x07f777b1, 0x7fc07878, + 0x0813047d, 0x7fbebdac, 0x082ecd5b, 0x7fbcf90f, 0x084ad276, 0x7fbb2a78, 0x086713f7, 0x7fb951bc, + 0x08839206, 0x7fb76eaf, 0x08a04ccb, 0x7fb58126, 0x08bd446e, 0x7fb388f4, 0x08da7915, 0x7fb185ee, + 0x08f7eae7, 0x7faf77e5, 0x09159a09, 0x7fad5ead, 0x0933869f, 0x7fab3a17, 0x0951b0cd, 0x7fa909f6, + 0x097018b7, 0x7fa6ce1a, 0x098ebe7f, 0x7fa48653, 0x09ada248, 0x7fa23273, 0x09ccc431, 0x7f9fd249, + 0x09ec245b, 0x7f9d65a4, 0x0a0bc2e7, 0x7f9aec53, 0x0a2b9ff3, 0x7f986625, 0x0a4bbb9e, 0x7f95d2e7, + 0x0a6c1604, 0x7f933267, 0x0a8caf43, 0x7f908472, 0x0aad8776, 0x7f8dc8d5, 0x0ace9eb9, 0x7f8aff5c, + 0x0aeff526, 0x7f8827d3, 0x0b118ad8, 0x7f854204, 0x0b335fe6, 0x7f824dbb, 0x0b557469, 0x7f7f4ac3, + 0x0b77c879, 0x7f7c38e4, 0x0b9a5c2b, 0x7f7917e9, 0x0bbd2f97, 0x7f75e79b, 0x0be042d0, 0x7f72a7c3, + 0x0c0395ec, 0x7f6f5828, 0x0c2728fd, 0x7f6bf892, 0x0c4afc16, 0x7f6888c9, 0x0c6f0f4a, 0x7f650894, + 0x0c9362a8, 0x7f6177b9, 0x0cb7f642, 0x7f5dd5ff, 0x0cdcca26, 0x7f5a232a, 0x0d01de63, 0x7f565f00, + 0x0d273307, 0x7f528947, 0x0d4cc81f, 0x7f4ea1c2, 0x0d729db7, 0x7f4aa835, 0x0d98b3da, 0x7f469c65, + 0x0dbf0a92, 0x7f427e13, 0x0de5a1e9, 0x7f3e4d04, 0x0e0c79e7, 0x7f3a08f9, 0x0e339295, 0x7f35b1b4, + 0x0e5aebfa, 0x7f3146f8, 0x0e82861a, 0x7f2cc884, 0x0eaa60fd, 0x7f28361b, 0x0ed27ca5, 0x7f238f7c, + 0x0efad917, 0x7f1ed467, 0x0f237656, 0x7f1a049d, 0x0f4c5462, 0x7f151fdc, 0x0f75733d, 0x7f1025e3, + 0x0f9ed2e6, 0x7f0b1672, 0x0fc8735e, 0x7f05f146, 0x0ff254a1, 0x7f00b61d, 0x101c76ae, 0x7efb64b4, + 0x1046d981, 0x7ef5fcca, 0x10717d15, 0x7ef07e19, 0x109c6165, 0x7eeae860, 0x10c7866a, 0x7ee53b5b, + 0x10f2ec1e, 0x7edf76c4, 0x111e9279, 0x7ed99a58, 0x114a7971, 0x7ed3a5d1, 0x1176a0fc, 0x7ecd98eb, + 0x11a30910, 0x7ec77360, 0x11cfb1a1, 0x7ec134eb, 0x11fc9aa2, 0x7ebadd44, 0x1229c406, 0x7eb46c27, + 0x12572dbf, 0x7eade14c, 0x1284d7bc, 0x7ea73c6c, 0x12b2c1ed, 0x7ea07d41, 0x12e0ec42, 0x7e99a382, + 0x130f56a8, 0x7e92aee7, 0x133e010b, 0x7e8b9f2a, 0x136ceb59, 0x7e847402, 0x139c157b, 0x7e7d2d25, + 0x13cb7f5d, 0x7e75ca4c, 0x13fb28e6, 0x7e6e4b2d, 0x142b1200, 0x7e66af7f, 0x145b3a92, 0x7e5ef6f8, + 0x148ba281, 0x7e572150, 0x14bc49b4, 0x7e4f2e3b, 0x14ed300f, 0x7e471d70, 0x151e5575, 0x7e3eeea5, + 0x154fb9c9, 0x7e36a18e, 0x15815ced, 0x7e2e35e2, 0x15b33ec1, 0x7e25ab56, 0x15e55f25, 0x7e1d019e, + 0x1617bdf9, 0x7e14386e, 0x164a5b19, 0x7e0b4f7d, 0x167d3662, 0x7e02467e, 0x16b04fb2, 0x7df91d25, + 0x16e3a6e2, 0x7defd327, 0x17173bce, 0x7de66837, 0x174b0e4d, 0x7ddcdc0a, 0x177f1e39, 0x7dd32e53, + 0x17b36b69, 0x7dc95ec6, 0x17e7f5b3, 0x7dbf6d17, 0x181cbcec, 0x7db558f9, 0x1851c0e9, 0x7dab221f, + 0x1887017d, 0x7da0c83c, 0x18bc7e7c, 0x7d964b05, 0x18f237b6, 0x7d8baa2b, 0x19282cfd, 0x7d80e563, + 0x195e5e20, 0x7d75fc5e, 0x1994caee, 0x7d6aeed0, 0x19cb7335, 0x7d5fbc6d, 0x1a0256c2, 0x7d5464e6, + 0x1a397561, 0x7d48e7ef, 0x1a70cede, 0x7d3d453b, 0x1aa86301, 0x7d317c7c, 0x1ae03195, 0x7d258d65, + 0x1b183a63, 0x7d1977aa, 0x1b507d30, 0x7d0d3afc, 0x1b88f9c5, 0x7d00d710, 0x1bc1afe6, 0x7cf44b97, + 0x1bfa9f58, 0x7ce79846, 0x1c33c7e0, 0x7cdabcce, 0x1c6d293f, 0x7ccdb8e4, 0x1ca6c337, 0x7cc08c39, + 0x1ce0958a, 0x7cb33682, 0x1d1a9ff8, 0x7ca5b772, 0x1d54e240, 0x7c980ebd, 0x1d8f5c21, 0x7c8a3c14, + 0x1dca0d56, 0x7c7c3f2e, 0x1e04f59f, 0x7c6e17bc, 0x1e4014b4, 0x7c5fc573, 0x1e7b6a53, 0x7c514807, + 0x1eb6f633, 0x7c429f2c, 0x1ef2b80f, 0x7c33ca96, 0x1f2eaf9e, 0x7c24c9fa, 0x1f6adc98, 0x7c159d0d, + 0x1fa73eb2, 0x7c064383, 0x1fe3d5a3, 0x7bf6bd11, 0x2020a11e, 0x7be7096c, 0x205da0d8, 0x7bd7284a, + 0x209ad483, 0x7bc71960, 0x20d83bd1, 0x7bb6dc65, 0x2115d674, 0x7ba6710d, 0x2153a41b, 0x7b95d710, + 0x2191a476, 0x7b850e24, 0x21cfd734, 0x7b7415ff, 0x220e3c02, 0x7b62ee59, 0x224cd28d, 0x7b5196e9, + 0x228b9a82, 0x7b400f67, 0x22ca938a, 0x7b2e578a, 0x2309bd52, 0x7b1c6f0b, 0x23491783, 0x7b0a55a1, + 0x2388a1c4, 0x7af80b07, 0x23c85bbf, 0x7ae58ef5, 0x2408451a, 0x7ad2e124, 0x24485d7c, 0x7ac0014e, + 0x2488a48a, 0x7aacef2e, 0x24c919e9, 0x7a99aa7e, 0x2509bd3d, 0x7a8632f8, 0x254a8e29, 0x7a728858, + 0x258b8c50, 0x7a5eaa5a, 0x25ccb753, 0x7a4a98b9, 0x260e0ed3, 0x7a365333, 0x264f9271, 0x7a21d983, + 0x269141cb, 0x7a0d2b68, 0x26d31c80, 0x79f8489e, 0x2715222f, 0x79e330e4, 0x27575273, 0x79cde3f8, + 0x2799acea, 0x79b8619a, 0x27dc3130, 0x79a2a989, 0x281ededf, 0x798cbb85, 0x2861b591, 0x7976974e, + 0x28a4b4e0, 0x79603ca5, 0x28e7dc65, 0x7949ab4c, 0x292b2bb8, 0x7932e304, 0x296ea270, 0x791be390, + 0x29b24024, 0x7904acb3, 0x29f6046b, 0x78ed3e30, 0x2a39eed8, 0x78d597cc, 0x2a7dff02, 0x78bdb94a, + 0x2ac2347c, 0x78a5a270, 0x2b068eda, 0x788d5304, 0x2b4b0dae, 0x7874cacb, 0x2b8fb08a, 0x785c098d, + 0x2bd47700, 0x78430f11, 0x2c1960a1, 0x7829db1f, 0x2c5e6cfd, 0x78106d7f, 0x2ca39ba3, 0x77f6c5fb, + 0x2ce8ec23, 0x77dce45c, 0x2d2e5e0b, 0x77c2c86e, 0x2d73f0e8, 0x77a871fa, 0x2db9a449, 0x778de0cd, + 0x2dff77b8, 0x777314b2, 0x2e456ac4, 0x77580d78, 0x2e8b7cf6, 0x773ccaeb, 0x2ed1addb, 0x77214cdb, + 0x2f17fcfb, 0x77059315, 0x2f5e69e2, 0x76e99d69, 0x2fa4f419, 0x76cd6ba9, 0x2feb9b27, 0x76b0fda4, + 0x30325e96, 0x7694532e, 0x30793dee, 0x76776c17, 0x30c038b5, 0x765a4834, 0x31074e72, 0x763ce759, + 0x314e7eab, 0x761f4959, 0x3195c8e6, 0x76016e0b, 0x31dd2ca9, 0x75e35545, 0x3224a979, 0x75c4fedc, + 0x326c3ed8, 0x75a66aab, 0x32b3ec4d, 0x75879887, 0x32fbb159, 0x7568884b, 0x33438d81, 0x754939d1, + 0x338b8045, 0x7529acf4, 0x33d3892a, 0x7509e18e, 0x341ba7b1, 0x74e9d77d, 0x3463db5a, 0x74c98e9e, + 0x34ac23a7, 0x74a906cd, 0x34f48019, 0x74883fec, 0x353cf02f, 0x746739d8, 0x3585736a, 0x7445f472, + 0x35ce0949, 0x74246f9c, 0x3616b14c, 0x7402ab37, 0x365f6af0, 0x73e0a727, 0x36a835b5, 0x73be6350, + 0x36f11118, 0x739bdf95, 0x3739fc98, 0x73791bdd, 0x3782f7b2, 0x7356180e, 0x37cc01e3, 0x7332d410, + 0x38151aa8, 0x730f4fc9, 0x385e417e, 0x72eb8b24, 0x38a775e1, 0x72c7860a, 0x38f0b74d, 0x72a34066, + 0x393a053e, 0x727eba24, 0x39835f30, 0x7259f331, 0x39ccc49e, 0x7234eb79, 0x3a163503, 0x720fa2eb, + 0x3a5fafda, 0x71ea1977, 0x3aa9349e, 0x71c44f0c, 0x3af2c2ca, 0x719e439d, 0x3b3c59d7, 0x7177f71a, + 0x3b85f940, 0x71516978, 0x3bcfa07e, 0x712a9aaa, 0x3c194f0d, 0x71038aa4, 0x3c630464, 0x70dc395e, + 0x3cacbfff, 0x70b4a6cd, 0x3cf68155, 0x708cd2e9, 0x3d4047e1, 0x7064bdab, 0x3d8a131c, 0x703c670d, + 0x3dd3e27e, 0x7013cf0a, 0x3e1db580, 0x6feaf59c, 0x3e678b9b, 0x6fc1dac1, 0x3eb16449, 0x6f987e76, + 0x3efb3f01, 0x6f6ee0b9, 0x3f451b3d, 0x6f45018b, 0x3f8ef874, 0x6f1ae0eb, 0x3fd8d620, 0x6ef07edb, + 0x4022b3b9, 0x6ec5db5d, 0x406c90b7, 0x6e9af675, 0x40b66c93, 0x6e6fd027, 0x410046c5, 0x6e446879, + 0x414a1ec6, 0x6e18bf71, 0x4193f40d, 0x6decd517, 0x41ddc615, 0x6dc0a972, 0x42279455, 0x6d943c8d, + 0x42715e45, 0x6d678e71, 0x42bb235f, 0x6d3a9f2a, 0x4304e31a, 0x6d0d6ec5, 0x434e9cf1, 0x6cdffd4f, + 0x4398505b, 0x6cb24ad6, 0x43e1fcd1, 0x6c84576b, 0x442ba1cd, 0x6c56231c, 0x44753ec7, 0x6c27adfd, + 0x44bed33a, 0x6bf8f81e, 0x45085e9d, 0x6bca0195, 0x4551e06b, 0x6b9aca75, 0x459b581e, 0x6b6b52d5, + 0x45e4c52f, 0x6b3b9ac9, 0x462e2717, 0x6b0ba26b, 0x46777d52, 0x6adb69d3, 0x46c0c75a, 0x6aaaf11b, + 0x470a04a9, 0x6a7a385c, 0x475334b9, 0x6a493fb3, 0x479c5707, 0x6a18073d, 0x47e56b0c, 0x69e68f17, + 0x482e7045, 0x69b4d761, 0x4877662c, 0x6982e039, 0x48c04c3f, 0x6950a9c0, 0x490921f8, 0x691e341a, + 0x4951e6d5, 0x68eb7f67, 0x499a9a51, 0x68b88bcd, 0x49e33beb, 0x68855970, 0x4a2bcb1f, 0x6851e875, + 0x4a74476b, 0x681e3905, 0x4abcb04c, 0x67ea4b47, 0x4b050541, 0x67b61f63, 0x4b4d45c9, 0x6781b585, + 0x4b957162, 0x674d0dd6, 0x4bdd878c, 0x67182883, 0x4c2587c6, 0x66e305b8, 0x4c6d7190, 0x66ada5a5, + 0x4cb5446a, 0x66780878, 0x4cfcffd5, 0x66422e60, 0x4d44a353, 0x660c1790, 0x4d8c2e64, 0x65d5c439, + 0x4dd3a08c, 0x659f348e, 0x4e1af94b, 0x656868c3, 0x4e623825, 0x6531610d, 0x4ea95c9d, 0x64fa1da3, + 0x4ef06637, 0x64c29ebb, 0x4f375477, 0x648ae48d, 0x4f7e26e1, 0x6452ef53, 0x4fc4dcfb, 0x641abf46, + 0x500b7649, 0x63e254a2, 0x5051f253, 0x63a9afa2, 0x5098509f, 0x6370d083, 0x50de90b3, 0x6337b784, + 0x5124b218, 0x62fe64e3, 0x516ab455, 0x62c4d8e0, 0x51b096f3, 0x628b13bc, 0x51f6597b, 0x625115b8, + 0x523bfb78, 0x6216df18, 0x52817c72, 0x61dc701f, 0x52c6dbf5, 0x61a1c912, 0x530c198d, 0x6166ea36, + 0x535134c5, 0x612bd3d2, 0x53962d2a, 0x60f0862d, 0x53db024a, 0x60b50190, 0x541fb3b1, 0x60794644, + 0x546440ef, 0x603d5494, 0x54a8a992, 0x60012cca, 0x54eced2b, 0x5fc4cf33, 0x55310b48, 0x5f883c1c, + 0x5575037c, 0x5f4b73d2, 0x55b8d558, 0x5f0e76a5, 0x55fc806f, 0x5ed144e5, 0x56400452, 0x5e93dee1, + 0x56836096, 0x5e5644ec, 0x56c694cf, 0x5e187757, 0x5709a092, 0x5dda7677, 0x574c8374, 0x5d9c429f, + 0x578f3d0d, 0x5d5ddc24, 0x57d1ccf2, 0x5d1f435d, 0x581432bd, 0x5ce078a0, 0x58566e04, 0x5ca17c45, + 0x58987e63, 0x5c624ea4, 0x58da6372, 0x5c22f016, 0x591c1ccc, 0x5be360f6, 0x595daa0d, 0x5ba3a19f, + 0x599f0ad1, 0x5b63b26c, 0x59e03eb6, 0x5b2393ba, 0x5a214558, 0x5ae345e7, 0x5a621e56, 0x5aa2c951, }; /* bit reverse tables for FFT */ -const int bitrevtabOffset[NUM_IMDCT_SIZES] PROGMEM = {0, 17}; +const int bitrevtabOffset[NUM_IMDCT_SIZES] DPROGMEM = {0, 17}; -const unsigned char bitrevtab[17 + 129] PROGMEM = { -/* nfft = 64 */ -0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f, -0x00, +const unsigned char bitrevtab[17 + 129] DPROGMEM = { + /* nfft = 64 */ + 0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f, + 0x00, -/* nfft = 512 */ -0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48, -0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24, -0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c, -0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a, -0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76, -0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69, -0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b, -0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f, -0x00, + /* nfft = 512 */ + 0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48, + 0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24, + 0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c, + 0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a, + 0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76, + 0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69, + 0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b, + 0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f, + 0x00, }; -const unsigned char uniqueIDTab[8] = {0x5f, 0x4b, 0x43, 0x5f, 0x5f, 0x4a, 0x52, 0x5f}; - -/* Twiddle tables for FFT - * format = Q30 - * - * for (k = 4; k <= N/4; k <<= 1) { - * for (j = 0; j < k; j++) { - * double wr1, wi1, wr2, wi2, wr3, wi3; - * - * wr1 = cos(1.0 * M_PI * j / (2*k)); - * wi1 = sin(1.0 * M_PI * j / (2*k)); - * wr1 = (wr1 + wi1); - * wi1 = -wi1; - * - * wr2 = cos(2.0 * M_PI * j / (2*k)); - * wi2 = sin(2.0 * M_PI * j / (2*k)); - * wr2 = (wr2 + wi2); - * wi2 = -wi2; - * - * wr3 = cos(3.0 * M_PI * j / (2*k)); - * wi3 = sin(3.0 * M_PI * j / (2*k)); - * wr3 = (wr3 + wi3); - * wi3 = -wi3; - * - * if (k & 0xaaaaaaaa) { - * w_odd[iodd++] = (float)wr2; - * w_odd[iodd++] = (float)wi2; - * w_odd[iodd++] = (float)wr1; - * w_odd[iodd++] = (float)wi1; - * w_odd[iodd++] = (float)wr3; - * w_odd[iodd++] = (float)wi3; - * } else { - * w_even[ieven++] = (float)wr2; - * w_even[ieven++] = (float)wi2; - * w_even[ieven++] = (float)wr1; - * w_even[ieven++] = (float)wi1; - * w_even[ieven++] = (float)wr3; - * w_even[ieven++] = (float)wi3; - * } - * } - * } - */ -const int twidTabOdd[8*6 + 32*6 + 128*6] PROGMEM = { - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x539eba45, 0xe7821d59, - 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, - 0x539eba45, 0xc4df2862, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x22a2f4f8, 0xc4df2862, - 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, - 0xac6145bb, 0x187de2a7, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x45f704f7, 0xf9ba1651, - 0x43103085, 0xfcdc1342, 0x48b2b335, 0xf69bf7c9, 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, - 0x4fd288dc, 0xed6bf9d1, 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, 0x553805f2, 0xe4a2eff6, - 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x569cc31b, 0xe1d4a2c8, - 0x4da1fab5, 0xf0730342, 0x5a6690ae, 0xd5052d97, 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, - 0x5a12e720, 0xce86ff2a, 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, 0x57cc15bc, 0xc91af976, - 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a12e720, 0xce86ff2a, - 0x553805f2, 0xe4a2eff6, 0x4da1fab5, 0xc1eb0209, 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, - 0x45f704f7, 0xc04ee4b8, 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, 0x3cc85709, 0xc013bc39, - 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x4fd288dc, 0xc2c17d52, - 0x5987b08a, 0xd9e01006, 0x26b2a794, 0xc3bdbdf6, 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, - 0x1a4608ab, 0xc78e9a1d, 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, 0x0d47d096, 0xcc983f70, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x396b3199, 0xc04ee4b8, - 0x5a6690ae, 0xd09441bb, 0xf2b82f6a, 0xd9e01006, 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, - 0xe5b9f755, 0xe1d4a2c8, 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, 0xd94d586c, 0xea70658a, - 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x1a4608ab, 0xc78e9a1d, - 0x57cc15bc, 0xc91af976, 0xc337a8f7, 0xfcdc1342, 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, - 0xba08fb09, 0x0645e9af, 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, 0xb25e054b, 0x0f8cfcbe, - 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xf720e574, 0xd76619b6, - 0x51d1dc80, 0xc3bdbdf6, 0xa833ea44, 0x20e70f32, 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, - 0xa5ed18e0, 0x2899e64a, 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, 0xa5996f52, 0x2f6bbe45, - 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xd5558381, 0xed6bf9d1, - 0x48b2b335, 0xc0b15502, 0xaac7fa0e, 0x39daf5e8, 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, - 0xb02d7724, 0x3d3e82ae, 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, 0xb74d4ccb, 0x3f4eaafe, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x418d2621, 0xfe6deaa1, - 0x40c7d2bd, 0xff36f170, 0x424ff28f, 0xfda4f351, 0x43103085, 0xfcdc1342, 0x418d2621, 0xfe6deaa1, - 0x4488e37f, 0xfb4ab7db, 0x4488e37f, 0xfb4ab7db, 0x424ff28f, 0xfda4f351, 0x46aa0d6d, 0xf8f21e8e, - 0x45f704f7, 0xf9ba1651, 0x43103085, 0xfcdc1342, 0x48b2b335, 0xf69bf7c9, 0x475a5c77, 0xf82a6c6a, - 0x43cdd89a, 0xfc135231, 0x4aa22036, 0xf4491311, 0x48b2b335, 0xf69bf7c9, 0x4488e37f, 0xfb4ab7db, - 0x4c77a88e, 0xf1fa3ecb, 0x49ffd417, 0xf50ef5de, 0x454149fc, 0xfa824bfd, 0x4e32a956, 0xefb047f2, - 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x4c77a88e, 0xf1fa3ecb, - 0x46aa0d6d, 0xf8f21e8e, 0x5156b6d9, 0xeb2e1dbe, 0x4da1fab5, 0xf0730342, 0x475a5c77, 0xf82a6c6a, - 0x52beac9f, 0xe8f77acf, 0x4ec05432, 0xeeee2d9d, 0x4807eb4b, 0xf7630799, 0x5409ed4b, 0xe6c8d59c, - 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, 0x553805f2, 0xe4a2eff6, 0x50d86e6d, 0xebeca36c, - 0x495aada2, 0xf5d544a7, 0x56488dc5, 0xe28688a4, 0x51d1dc80, 0xea70658a, 0x49ffd417, 0xf50ef5de, - 0x573b2635, 0xe0745b24, 0x52beac9f, 0xe8f77acf, 0x4aa22036, 0xf4491311, 0x580f7b19, 0xde6d1f65, - 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5471e2e6, 0xe61086bc, - 0x4bde1089, 0xf2beafed, 0x595c3e2a, 0xda8249b4, 0x553805f2, 0xe4a2eff6, 0x4c77a88e, 0xf1fa3ecb, - 0x59d438e5, 0xd8a00bae, 0x55f104dc, 0xe3399167, 0x4d0e4de2, 0xf136580d, 0x5a2d0957, 0xd6cb76c9, - 0x569cc31b, 0xe1d4a2c8, 0x4da1fab5, 0xf0730342, 0x5a6690ae, 0xd5052d97, 0x573b2635, 0xe0745b24, - 0x4e32a956, 0xefb047f2, 0x5a80baf6, 0xd34dcdb4, 0x57cc15bc, 0xdf18f0ce, 0x4ec05432, 0xeeee2d9d, - 0x5a7b7f1a, 0xd1a5ef90, 0x584f7b58, 0xddc29958, 0x4f4af5d1, 0xee2cbbc1, 0x5a56deec, 0xd00e2639, - 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, 0x592d59da, 0xdb25f566, - 0x50570819, 0xecabef3d, 0x59afaf4c, 0xcd110216, 0x5987b08a, 0xd9e01006, 0x50d86e6d, 0xebeca36c, - 0x592d59da, 0xcbacb0bf, 0x59d438e5, 0xd8a00bae, 0x5156b6d9, 0xeb2e1dbe, 0x588c1404, 0xca5a86c4, - 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, 0x57cc15bc, 0xc91af976, 0x5a43b190, 0xd6326a88, - 0x5249daa2, 0xe9b38223, 0x56eda1a0, 0xc7ee77b3, 0x5a6690ae, 0xd5052d97, 0x52beac9f, 0xe8f77acf, - 0x55f104dc, 0xc6d569be, 0x5a7b7f1a, 0xd3de9156, 0x53304df6, 0xe83c56cf, 0x54d69714, 0xc5d03118, - 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a7b7f1a, 0xd1a5ef90, - 0x5409ed4b, 0xe6c8d59c, 0x5249daa2, 0xc402a33c, 0x5a6690ae, 0xd09441bb, 0x5471e2e6, 0xe61086bc, - 0x50d86e6d, 0xc33aee27, 0x5a43b190, 0xcf89e3e8, 0x54d69714, 0xe55937d5, 0x4f4af5d1, 0xc2884e6e, - 0x5a12e720, 0xce86ff2a, 0x553805f2, 0xe4a2eff6, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xcd8bbb6d, - 0x55962bc0, 0xe3edb628, 0x4bde1089, 0xc1633f8a, 0x5987b08a, 0xcc983f70, 0x55f104dc, 0xe3399167, - 0x49ffd417, 0xc0f1360b, 0x592d59da, 0xcbacb0bf, 0x56488dc5, 0xe28688a4, 0x4807eb4b, 0xc0950d1d, - 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x584f7b58, 0xc9edeb50, - 0x56eda1a0, 0xe123e6ad, 0x43cdd89a, 0xc01ed535, 0x57cc15bc, 0xc91af976, 0x573b2635, 0xe0745b24, - 0x418d2621, 0xc004ef3f, 0x573b2635, 0xc8507ea7, 0x57854ddd, 0xdfc606f1, 0x3f35b59d, 0xc0013bd3, - 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, 0x3cc85709, 0xc013bc39, 0x55f104dc, 0xc6d569be, - 0x580f7b19, 0xde6d1f65, 0x3a45e1f7, 0xc03c6a07, 0x553805f2, 0xc6250a18, 0x584f7b58, 0xddc29958, - 0x37af354c, 0xc07b371e, 0x5471e2e6, 0xc57d965d, 0x588c1404, 0xdd196538, 0x350536f1, 0xc0d00db6, - 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x52beac9f, 0xc449d892, - 0x58fb0568, 0xdbcb0cce, 0x2f7afdfc, 0xc1bb5a11, 0x51d1dc80, 0xc3bdbdf6, 0x592d59da, 0xdb25f566, - 0x2c9caf6c, 0xc2517e31, 0x50d86e6d, 0xc33aee27, 0x595c3e2a, 0xda8249b4, 0x29aee694, 0xc2fd08a9, - 0x4fd288dc, 0xc2c17d52, 0x5987b08a, 0xd9e01006, 0x26b2a794, 0xc3bdbdf6, 0x4ec05432, 0xc2517e31, - 0x59afaf4c, 0xd93f4e9e, 0x23a8fb93, 0xc4935b3c, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xd8a00bae, - 0x2092f05f, 0xc57d965d, 0x4c77a88e, 0xc18e18a7, 0x59f54bee, 0xd8024d59, 0x1d719810, 0xc67c1e18, - 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, 0x49ffd417, 0xc0f1360b, - 0x5a2d0957, 0xd6cb76c9, 0x17115bc0, 0xc8b4ab32, 0x48b2b335, 0xc0b15502, 0x5a43b190, 0xd6326a88, - 0x13d4ae08, 0xc9edeb50, 0x475a5c77, 0xc07b371e, 0x5a56deec, 0xd59afadb, 0x10911f04, 0xcb39edca, - 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, 0x0d47d096, 0xcc983f70, 0x4488e37f, 0xc02c64a6, - 0x5a72c63b, 0xd4710883, 0x09f9e6a1, 0xce0866b8, 0x43103085, 0xc013bc39, 0x5a7b7f1a, 0xd3de9156, - 0x06a886a0, 0xcf89e3e8, 0x418d2621, 0xc004ef3f, 0x5a80baf6, 0xd34dcdb4, 0x0354d741, 0xd11c3142, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3e68fb62, 0xc004ef3f, - 0x5a80baf6, 0xd2317756, 0xfcab28bf, 0xd4710883, 0x3cc85709, 0xc013bc39, 0x5a7b7f1a, 0xd1a5ef90, - 0xf9577960, 0xd6326a88, 0x3b1e5335, 0xc02c64a6, 0x5a72c63b, 0xd11c3142, 0xf606195f, 0xd8024d59, - 0x396b3199, 0xc04ee4b8, 0x5a6690ae, 0xd09441bb, 0xf2b82f6a, 0xd9e01006, 0x37af354c, 0xc07b371e, - 0x5a56deec, 0xd00e2639, 0xef6ee0fc, 0xdbcb0cce, 0x35eaa2c7, 0xc0b15502, 0x5a43b190, 0xcf89e3e8, - 0xec2b51f8, 0xddc29958, 0x341dbfd3, 0xc0f1360b, 0x5a2d0957, 0xcf077fe1, 0xe8eea440, 0xdfc606f1, - 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x306c2624, 0xc18e18a7, - 0x59f54bee, 0xce0866b8, 0xe28e67f0, 0xe3edb628, 0x2e88013a, 0xc1eb0209, 0x59d438e5, 0xcd8bbb6d, - 0xdf6d0fa1, 0xe61086bc, 0x2c9caf6c, 0xc2517e31, 0x59afaf4c, 0xcd110216, 0xdc57046d, 0xe83c56cf, - 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, 0xd94d586c, 0xea70658a, 0x28b1b544, 0xc33aee27, - 0x595c3e2a, 0xcc217822, 0xd651196c, 0xecabef3d, 0x26b2a794, 0xc3bdbdf6, 0x592d59da, 0xcbacb0bf, - 0xd3635094, 0xeeee2d9d, 0x24ada23d, 0xc449d892, 0x58fb0568, 0xcb39edca, 0xd0850204, 0xf136580d, - 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x2092f05f, 0xc57d965d, - 0x588c1404, 0xca5a86c4, 0xcafac90f, 0xf5d544a7, 0x1e7de5df, 0xc6250a18, 0x584f7b58, 0xc9edeb50, - 0xc850cab4, 0xf82a6c6a, 0x1c6427a9, 0xc6d569be, 0x580f7b19, 0xc9836582, 0xc5ba1e09, 0xfa824bfd, - 0x1a4608ab, 0xc78e9a1d, 0x57cc15bc, 0xc91af976, 0xc337a8f7, 0xfcdc1342, 0x1823dc7d, 0xc8507ea7, - 0x57854ddd, 0xc8b4ab32, 0xc0ca4a63, 0xff36f170, 0x15fdf758, 0xc91af976, 0x573b2635, 0xc8507ea7, - 0xbe72d9df, 0x0192155f, 0x13d4ae08, 0xc9edeb50, 0x56eda1a0, 0xc7ee77b3, 0xbc322766, 0x03ecadcf, - 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, 0x0f7944a7, 0xcbacb0bf, - 0x56488dc5, 0xc730e997, 0xb7f814b5, 0x089cf867, 0x0d47d096, 0xcc983f70, 0x55f104dc, 0xc6d569be, - 0xb6002be9, 0x0af10a22, 0x0b145041, 0xcd8bbb6d, 0x55962bc0, 0xc67c1e18, 0xb421ef77, 0x0d415013, - 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, 0xb25e054b, 0x0f8cfcbe, 0x06a886a0, 0xcf89e3e8, - 0x54d69714, 0xc5d03118, 0xb0b50a2f, 0x11d3443f, 0x0470ebdc, 0xd09441bb, 0x5471e2e6, 0xc57d965d, - 0xaf279193, 0x14135c94, 0x0238a1c6, 0xd1a5ef90, 0x5409ed4b, 0xc52d3d18, 0xadb6255e, 0x164c7ddd, - 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xfdc75e3a, 0xd3de9156, - 0x53304df6, 0xc4935b3c, 0xab2968ec, 0x1aa6c82b, 0xfb8f1424, 0xd5052d97, 0x52beac9f, 0xc449d892, - 0xaa0efb24, 0x1cc66e99, 0xf9577960, 0xd6326a88, 0x5249daa2, 0xc402a33c, 0xa9125e60, 0x1edc1953, - 0xf720e574, 0xd76619b6, 0x51d1dc80, 0xc3bdbdf6, 0xa833ea44, 0x20e70f32, 0xf4ebafbf, 0xd8a00bae, - 0x5156b6d9, 0xc37b2b6a, 0xa773ebfc, 0x22e69ac8, 0xf2b82f6a, 0xd9e01006, 0x50d86e6d, 0xc33aee27, - 0xa6d2a626, 0x24da0a9a, 0xf086bb59, 0xdb25f566, 0x50570819, 0xc2fd08a9, 0xa65050b4, 0x26c0b162, - 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xec2b51f8, 0xddc29958, - 0x4f4af5d1, 0xc2884e6e, 0xa5a92114, 0x2a650525, 0xea0208a8, 0xdf18f0ce, 0x4ec05432, 0xc2517e31, - 0xa58480e6, 0x2c216eaa, 0xe7dc2383, 0xe0745b24, 0x4e32a956, 0xc21d0eb8, 0xa57f450a, 0x2dce88aa, - 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, 0xa5996f52, 0x2f6bbe45, 0xe39bd857, 0xe3399167, - 0x4d0e4de2, 0xc1bb5a11, 0xa5d2f6a9, 0x30f8801f, 0xe1821a21, 0xe4a2eff6, 0x4c77a88e, 0xc18e18a7, - 0xa62bc71b, 0x32744493, 0xdf6d0fa1, 0xe61086bc, 0x4bde1089, 0xc1633f8a, 0xa6a3c1d6, 0x33de87de, - 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xdb525dc3, 0xe8f77acf, - 0x4aa22036, 0xc114ccb9, 0xa7f084e7, 0x367c9a7e, 0xd94d586c, 0xea70658a, 0x49ffd417, 0xc0f1360b, - 0xa8c4d9cb, 0x37af8159, 0xd74e4abc, 0xebeca36c, 0x495aada2, 0xc0d00db6, 0xa9b7723b, 0x38cf1669, - 0xd5558381, 0xed6bf9d1, 0x48b2b335, 0xc0b15502, 0xaac7fa0e, 0x39daf5e8, 0xd3635094, 0xeeee2d9d, - 0x4807eb4b, 0xc0950d1d, 0xabf612b5, 0x3ad2c2e8, 0xd177fec6, 0xf0730342, 0x475a5c77, 0xc07b371e, - 0xad415361, 0x3bb6276e, 0xcf93d9dc, 0xf1fa3ecb, 0x46aa0d6d, 0xc063d405, 0xaea94927, 0x3c84d496, - 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, 0xcbe2402d, 0xf50ef5de, - 0x454149fc, 0xc03c6a07, 0xb1cd56aa, 0x3de2f148, 0xca155d39, 0xf69bf7c9, 0x4488e37f, 0xc02c64a6, - 0xb3885772, 0x3e71e759, 0xc850cab4, 0xf82a6c6a, 0x43cdd89a, 0xc01ed535, 0xb55ddfca, 0x3eeb3347, - 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, 0xb74d4ccb, 0x3f4eaafe, 0xc4e1accb, 0xfb4ab7db, - 0x424ff28f, 0xc00b1a20, 0xb955f293, 0x3f9c2bfb, 0xc337a8f7, 0xfcdc1342, 0x418d2621, 0xc004ef3f, - 0xbb771c81, 0x3fd39b5a, 0xc197049e, 0xfe6deaa1, 0x40c7d2bd, 0xc0013bd3, 0xbdb00d71, 0x3ff4e5e0, +const unsigned char uniqueIDTab[8] DPROGMEM = {0x5f, 0x4b, 0x43, 0x5f, 0x5f, 0x4a, 0x52, 0x5f}; + +/* Twiddle tables for FFT + format = Q30 + + for (k = 4; k <= N/4; k <<= 1) { + for (j = 0; j < k; j++) { + double wr1, wi1, wr2, wi2, wr3, wi3; + + wr1 = cos(1.0 * M_PI * j / (2*k)); + wi1 = sin(1.0 * M_PI * j / (2*k)); + wr1 = (wr1 + wi1); + wi1 = -wi1; + + wr2 = cos(2.0 * M_PI * j / (2*k)); + wi2 = sin(2.0 * M_PI * j / (2*k)); + wr2 = (wr2 + wi2); + wi2 = -wi2; + + wr3 = cos(3.0 * M_PI * j / (2*k)); + wi3 = sin(3.0 * M_PI * j / (2*k)); + wr3 = (wr3 + wi3); + wi3 = -wi3; + + if (k & 0xaaaaaaaa) { + w_odd[iodd++] = (float)wr2; + w_odd[iodd++] = (float)wi2; + w_odd[iodd++] = (float)wr1; + w_odd[iodd++] = (float)wi1; + w_odd[iodd++] = (float)wr3; + w_odd[iodd++] = (float)wi3; + } else { + w_even[ieven++] = (float)wr2; + w_even[ieven++] = (float)wi2; + w_even[ieven++] = (float)wr1; + w_even[ieven++] = (float)wi1; + w_even[ieven++] = (float)wr3; + w_even[ieven++] = (float)wi3; + } + } + } +*/ +const int twidTabOdd[8 * 6 + 32 * 6 + 128 * 6] DPROGMEM = { + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x539eba45, 0xe7821d59, + 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, + 0x539eba45, 0xc4df2862, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x22a2f4f8, 0xc4df2862, + 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, + 0xac6145bb, 0x187de2a7, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x45f704f7, 0xf9ba1651, + 0x43103085, 0xfcdc1342, 0x48b2b335, 0xf69bf7c9, 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, + 0x4fd288dc, 0xed6bf9d1, 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, 0x553805f2, 0xe4a2eff6, + 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x569cc31b, 0xe1d4a2c8, + 0x4da1fab5, 0xf0730342, 0x5a6690ae, 0xd5052d97, 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, + 0x5a12e720, 0xce86ff2a, 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, 0x57cc15bc, 0xc91af976, + 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a12e720, 0xce86ff2a, + 0x553805f2, 0xe4a2eff6, 0x4da1fab5, 0xc1eb0209, 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, + 0x45f704f7, 0xc04ee4b8, 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, 0x3cc85709, 0xc013bc39, + 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x4fd288dc, 0xc2c17d52, + 0x5987b08a, 0xd9e01006, 0x26b2a794, 0xc3bdbdf6, 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, + 0x1a4608ab, 0xc78e9a1d, 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, 0x0d47d096, 0xcc983f70, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x396b3199, 0xc04ee4b8, + 0x5a6690ae, 0xd09441bb, 0xf2b82f6a, 0xd9e01006, 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, + 0xe5b9f755, 0xe1d4a2c8, 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, 0xd94d586c, 0xea70658a, + 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x1a4608ab, 0xc78e9a1d, + 0x57cc15bc, 0xc91af976, 0xc337a8f7, 0xfcdc1342, 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, + 0xba08fb09, 0x0645e9af, 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, 0xb25e054b, 0x0f8cfcbe, + 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xf720e574, 0xd76619b6, + 0x51d1dc80, 0xc3bdbdf6, 0xa833ea44, 0x20e70f32, 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, + 0xa5ed18e0, 0x2899e64a, 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, 0xa5996f52, 0x2f6bbe45, + 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xd5558381, 0xed6bf9d1, + 0x48b2b335, 0xc0b15502, 0xaac7fa0e, 0x39daf5e8, 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, + 0xb02d7724, 0x3d3e82ae, 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, 0xb74d4ccb, 0x3f4eaafe, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x418d2621, 0xfe6deaa1, + 0x40c7d2bd, 0xff36f170, 0x424ff28f, 0xfda4f351, 0x43103085, 0xfcdc1342, 0x418d2621, 0xfe6deaa1, + 0x4488e37f, 0xfb4ab7db, 0x4488e37f, 0xfb4ab7db, 0x424ff28f, 0xfda4f351, 0x46aa0d6d, 0xf8f21e8e, + 0x45f704f7, 0xf9ba1651, 0x43103085, 0xfcdc1342, 0x48b2b335, 0xf69bf7c9, 0x475a5c77, 0xf82a6c6a, + 0x43cdd89a, 0xfc135231, 0x4aa22036, 0xf4491311, 0x48b2b335, 0xf69bf7c9, 0x4488e37f, 0xfb4ab7db, + 0x4c77a88e, 0xf1fa3ecb, 0x49ffd417, 0xf50ef5de, 0x454149fc, 0xfa824bfd, 0x4e32a956, 0xefb047f2, + 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x4c77a88e, 0xf1fa3ecb, + 0x46aa0d6d, 0xf8f21e8e, 0x5156b6d9, 0xeb2e1dbe, 0x4da1fab5, 0xf0730342, 0x475a5c77, 0xf82a6c6a, + 0x52beac9f, 0xe8f77acf, 0x4ec05432, 0xeeee2d9d, 0x4807eb4b, 0xf7630799, 0x5409ed4b, 0xe6c8d59c, + 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, 0x553805f2, 0xe4a2eff6, 0x50d86e6d, 0xebeca36c, + 0x495aada2, 0xf5d544a7, 0x56488dc5, 0xe28688a4, 0x51d1dc80, 0xea70658a, 0x49ffd417, 0xf50ef5de, + 0x573b2635, 0xe0745b24, 0x52beac9f, 0xe8f77acf, 0x4aa22036, 0xf4491311, 0x580f7b19, 0xde6d1f65, + 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x5471e2e6, 0xe61086bc, + 0x4bde1089, 0xf2beafed, 0x595c3e2a, 0xda8249b4, 0x553805f2, 0xe4a2eff6, 0x4c77a88e, 0xf1fa3ecb, + 0x59d438e5, 0xd8a00bae, 0x55f104dc, 0xe3399167, 0x4d0e4de2, 0xf136580d, 0x5a2d0957, 0xd6cb76c9, + 0x569cc31b, 0xe1d4a2c8, 0x4da1fab5, 0xf0730342, 0x5a6690ae, 0xd5052d97, 0x573b2635, 0xe0745b24, + 0x4e32a956, 0xefb047f2, 0x5a80baf6, 0xd34dcdb4, 0x57cc15bc, 0xdf18f0ce, 0x4ec05432, 0xeeee2d9d, + 0x5a7b7f1a, 0xd1a5ef90, 0x584f7b58, 0xddc29958, 0x4f4af5d1, 0xee2cbbc1, 0x5a56deec, 0xd00e2639, + 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, 0x592d59da, 0xdb25f566, + 0x50570819, 0xecabef3d, 0x59afaf4c, 0xcd110216, 0x5987b08a, 0xd9e01006, 0x50d86e6d, 0xebeca36c, + 0x592d59da, 0xcbacb0bf, 0x59d438e5, 0xd8a00bae, 0x5156b6d9, 0xeb2e1dbe, 0x588c1404, 0xca5a86c4, + 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, 0x57cc15bc, 0xc91af976, 0x5a43b190, 0xd6326a88, + 0x5249daa2, 0xe9b38223, 0x56eda1a0, 0xc7ee77b3, 0x5a6690ae, 0xd5052d97, 0x52beac9f, 0xe8f77acf, + 0x55f104dc, 0xc6d569be, 0x5a7b7f1a, 0xd3de9156, 0x53304df6, 0xe83c56cf, 0x54d69714, 0xc5d03118, + 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a7b7f1a, 0xd1a5ef90, + 0x5409ed4b, 0xe6c8d59c, 0x5249daa2, 0xc402a33c, 0x5a6690ae, 0xd09441bb, 0x5471e2e6, 0xe61086bc, + 0x50d86e6d, 0xc33aee27, 0x5a43b190, 0xcf89e3e8, 0x54d69714, 0xe55937d5, 0x4f4af5d1, 0xc2884e6e, + 0x5a12e720, 0xce86ff2a, 0x553805f2, 0xe4a2eff6, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xcd8bbb6d, + 0x55962bc0, 0xe3edb628, 0x4bde1089, 0xc1633f8a, 0x5987b08a, 0xcc983f70, 0x55f104dc, 0xe3399167, + 0x49ffd417, 0xc0f1360b, 0x592d59da, 0xcbacb0bf, 0x56488dc5, 0xe28688a4, 0x4807eb4b, 0xc0950d1d, + 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x584f7b58, 0xc9edeb50, + 0x56eda1a0, 0xe123e6ad, 0x43cdd89a, 0xc01ed535, 0x57cc15bc, 0xc91af976, 0x573b2635, 0xe0745b24, + 0x418d2621, 0xc004ef3f, 0x573b2635, 0xc8507ea7, 0x57854ddd, 0xdfc606f1, 0x3f35b59d, 0xc0013bd3, + 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, 0x3cc85709, 0xc013bc39, 0x55f104dc, 0xc6d569be, + 0x580f7b19, 0xde6d1f65, 0x3a45e1f7, 0xc03c6a07, 0x553805f2, 0xc6250a18, 0x584f7b58, 0xddc29958, + 0x37af354c, 0xc07b371e, 0x5471e2e6, 0xc57d965d, 0x588c1404, 0xdd196538, 0x350536f1, 0xc0d00db6, + 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x52beac9f, 0xc449d892, + 0x58fb0568, 0xdbcb0cce, 0x2f7afdfc, 0xc1bb5a11, 0x51d1dc80, 0xc3bdbdf6, 0x592d59da, 0xdb25f566, + 0x2c9caf6c, 0xc2517e31, 0x50d86e6d, 0xc33aee27, 0x595c3e2a, 0xda8249b4, 0x29aee694, 0xc2fd08a9, + 0x4fd288dc, 0xc2c17d52, 0x5987b08a, 0xd9e01006, 0x26b2a794, 0xc3bdbdf6, 0x4ec05432, 0xc2517e31, + 0x59afaf4c, 0xd93f4e9e, 0x23a8fb93, 0xc4935b3c, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xd8a00bae, + 0x2092f05f, 0xc57d965d, 0x4c77a88e, 0xc18e18a7, 0x59f54bee, 0xd8024d59, 0x1d719810, 0xc67c1e18, + 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, 0x49ffd417, 0xc0f1360b, + 0x5a2d0957, 0xd6cb76c9, 0x17115bc0, 0xc8b4ab32, 0x48b2b335, 0xc0b15502, 0x5a43b190, 0xd6326a88, + 0x13d4ae08, 0xc9edeb50, 0x475a5c77, 0xc07b371e, 0x5a56deec, 0xd59afadb, 0x10911f04, 0xcb39edca, + 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, 0x0d47d096, 0xcc983f70, 0x4488e37f, 0xc02c64a6, + 0x5a72c63b, 0xd4710883, 0x09f9e6a1, 0xce0866b8, 0x43103085, 0xc013bc39, 0x5a7b7f1a, 0xd3de9156, + 0x06a886a0, 0xcf89e3e8, 0x418d2621, 0xc004ef3f, 0x5a80baf6, 0xd34dcdb4, 0x0354d741, 0xd11c3142, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3e68fb62, 0xc004ef3f, + 0x5a80baf6, 0xd2317756, 0xfcab28bf, 0xd4710883, 0x3cc85709, 0xc013bc39, 0x5a7b7f1a, 0xd1a5ef90, + 0xf9577960, 0xd6326a88, 0x3b1e5335, 0xc02c64a6, 0x5a72c63b, 0xd11c3142, 0xf606195f, 0xd8024d59, + 0x396b3199, 0xc04ee4b8, 0x5a6690ae, 0xd09441bb, 0xf2b82f6a, 0xd9e01006, 0x37af354c, 0xc07b371e, + 0x5a56deec, 0xd00e2639, 0xef6ee0fc, 0xdbcb0cce, 0x35eaa2c7, 0xc0b15502, 0x5a43b190, 0xcf89e3e8, + 0xec2b51f8, 0xddc29958, 0x341dbfd3, 0xc0f1360b, 0x5a2d0957, 0xcf077fe1, 0xe8eea440, 0xdfc606f1, + 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x306c2624, 0xc18e18a7, + 0x59f54bee, 0xce0866b8, 0xe28e67f0, 0xe3edb628, 0x2e88013a, 0xc1eb0209, 0x59d438e5, 0xcd8bbb6d, + 0xdf6d0fa1, 0xe61086bc, 0x2c9caf6c, 0xc2517e31, 0x59afaf4c, 0xcd110216, 0xdc57046d, 0xe83c56cf, + 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, 0xd94d586c, 0xea70658a, 0x28b1b544, 0xc33aee27, + 0x595c3e2a, 0xcc217822, 0xd651196c, 0xecabef3d, 0x26b2a794, 0xc3bdbdf6, 0x592d59da, 0xcbacb0bf, + 0xd3635094, 0xeeee2d9d, 0x24ada23d, 0xc449d892, 0x58fb0568, 0xcb39edca, 0xd0850204, 0xf136580d, + 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x2092f05f, 0xc57d965d, + 0x588c1404, 0xca5a86c4, 0xcafac90f, 0xf5d544a7, 0x1e7de5df, 0xc6250a18, 0x584f7b58, 0xc9edeb50, + 0xc850cab4, 0xf82a6c6a, 0x1c6427a9, 0xc6d569be, 0x580f7b19, 0xc9836582, 0xc5ba1e09, 0xfa824bfd, + 0x1a4608ab, 0xc78e9a1d, 0x57cc15bc, 0xc91af976, 0xc337a8f7, 0xfcdc1342, 0x1823dc7d, 0xc8507ea7, + 0x57854ddd, 0xc8b4ab32, 0xc0ca4a63, 0xff36f170, 0x15fdf758, 0xc91af976, 0x573b2635, 0xc8507ea7, + 0xbe72d9df, 0x0192155f, 0x13d4ae08, 0xc9edeb50, 0x56eda1a0, 0xc7ee77b3, 0xbc322766, 0x03ecadcf, + 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, 0x0f7944a7, 0xcbacb0bf, + 0x56488dc5, 0xc730e997, 0xb7f814b5, 0x089cf867, 0x0d47d096, 0xcc983f70, 0x55f104dc, 0xc6d569be, + 0xb6002be9, 0x0af10a22, 0x0b145041, 0xcd8bbb6d, 0x55962bc0, 0xc67c1e18, 0xb421ef77, 0x0d415013, + 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, 0xb25e054b, 0x0f8cfcbe, 0x06a886a0, 0xcf89e3e8, + 0x54d69714, 0xc5d03118, 0xb0b50a2f, 0x11d3443f, 0x0470ebdc, 0xd09441bb, 0x5471e2e6, 0xc57d965d, + 0xaf279193, 0x14135c94, 0x0238a1c6, 0xd1a5ef90, 0x5409ed4b, 0xc52d3d18, 0xadb6255e, 0x164c7ddd, + 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xfdc75e3a, 0xd3de9156, + 0x53304df6, 0xc4935b3c, 0xab2968ec, 0x1aa6c82b, 0xfb8f1424, 0xd5052d97, 0x52beac9f, 0xc449d892, + 0xaa0efb24, 0x1cc66e99, 0xf9577960, 0xd6326a88, 0x5249daa2, 0xc402a33c, 0xa9125e60, 0x1edc1953, + 0xf720e574, 0xd76619b6, 0x51d1dc80, 0xc3bdbdf6, 0xa833ea44, 0x20e70f32, 0xf4ebafbf, 0xd8a00bae, + 0x5156b6d9, 0xc37b2b6a, 0xa773ebfc, 0x22e69ac8, 0xf2b82f6a, 0xd9e01006, 0x50d86e6d, 0xc33aee27, + 0xa6d2a626, 0x24da0a9a, 0xf086bb59, 0xdb25f566, 0x50570819, 0xc2fd08a9, 0xa65050b4, 0x26c0b162, + 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xec2b51f8, 0xddc29958, + 0x4f4af5d1, 0xc2884e6e, 0xa5a92114, 0x2a650525, 0xea0208a8, 0xdf18f0ce, 0x4ec05432, 0xc2517e31, + 0xa58480e6, 0x2c216eaa, 0xe7dc2383, 0xe0745b24, 0x4e32a956, 0xc21d0eb8, 0xa57f450a, 0x2dce88aa, + 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, 0xa5996f52, 0x2f6bbe45, 0xe39bd857, 0xe3399167, + 0x4d0e4de2, 0xc1bb5a11, 0xa5d2f6a9, 0x30f8801f, 0xe1821a21, 0xe4a2eff6, 0x4c77a88e, 0xc18e18a7, + 0xa62bc71b, 0x32744493, 0xdf6d0fa1, 0xe61086bc, 0x4bde1089, 0xc1633f8a, 0xa6a3c1d6, 0x33de87de, + 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xdb525dc3, 0xe8f77acf, + 0x4aa22036, 0xc114ccb9, 0xa7f084e7, 0x367c9a7e, 0xd94d586c, 0xea70658a, 0x49ffd417, 0xc0f1360b, + 0xa8c4d9cb, 0x37af8159, 0xd74e4abc, 0xebeca36c, 0x495aada2, 0xc0d00db6, 0xa9b7723b, 0x38cf1669, + 0xd5558381, 0xed6bf9d1, 0x48b2b335, 0xc0b15502, 0xaac7fa0e, 0x39daf5e8, 0xd3635094, 0xeeee2d9d, + 0x4807eb4b, 0xc0950d1d, 0xabf612b5, 0x3ad2c2e8, 0xd177fec6, 0xf0730342, 0x475a5c77, 0xc07b371e, + 0xad415361, 0x3bb6276e, 0xcf93d9dc, 0xf1fa3ecb, 0x46aa0d6d, 0xc063d405, 0xaea94927, 0x3c84d496, + 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, 0xcbe2402d, 0xf50ef5de, + 0x454149fc, 0xc03c6a07, 0xb1cd56aa, 0x3de2f148, 0xca155d39, 0xf69bf7c9, 0x4488e37f, 0xc02c64a6, + 0xb3885772, 0x3e71e759, 0xc850cab4, 0xf82a6c6a, 0x43cdd89a, 0xc01ed535, 0xb55ddfca, 0x3eeb3347, + 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, 0xb74d4ccb, 0x3f4eaafe, 0xc4e1accb, 0xfb4ab7db, + 0x424ff28f, 0xc00b1a20, 0xb955f293, 0x3f9c2bfb, 0xc337a8f7, 0xfcdc1342, 0x418d2621, 0xc004ef3f, + 0xbb771c81, 0x3fd39b5a, 0xc197049e, 0xfe6deaa1, 0x40c7d2bd, 0xc0013bd3, 0xbdb00d71, 0x3ff4e5e0, }; -const int twidTabEven[4*6 + 16*6 + 64*6] PROGMEM = { - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x5a82799a, 0xd2bec333, - 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, - 0x00000000, 0xd2bec333, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x4b418bbe, 0xf383a3e2, - 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, - 0x58c542c5, 0xdc71898d, 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, - 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xcac933ae, - 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, - 0x3248d382, 0xc13ad060, 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3248d382, 0xc13ad060, - 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, - 0xcdb72c7e, 0xf383a3e2, 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, - 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xee57aa21, 0xdc71898d, - 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, - 0xa73abd3b, 0x3536cc52, 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x43103085, 0xfcdc1342, - 0x418d2621, 0xfe6deaa1, 0x4488e37f, 0xfb4ab7db, 0x45f704f7, 0xf9ba1651, 0x43103085, 0xfcdc1342, - 0x48b2b335, 0xf69bf7c9, 0x48b2b335, 0xf69bf7c9, 0x4488e37f, 0xfb4ab7db, 0x4c77a88e, 0xf1fa3ecb, - 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x4da1fab5, 0xf0730342, - 0x475a5c77, 0xf82a6c6a, 0x52beac9f, 0xe8f77acf, 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, - 0x553805f2, 0xe4a2eff6, 0x51d1dc80, 0xea70658a, 0x49ffd417, 0xf50ef5de, 0x573b2635, 0xe0745b24, - 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x553805f2, 0xe4a2eff6, - 0x4c77a88e, 0xf1fa3ecb, 0x59d438e5, 0xd8a00bae, 0x569cc31b, 0xe1d4a2c8, 0x4da1fab5, 0xf0730342, - 0x5a6690ae, 0xd5052d97, 0x57cc15bc, 0xdf18f0ce, 0x4ec05432, 0xeeee2d9d, 0x5a7b7f1a, 0xd1a5ef90, - 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, 0x5987b08a, 0xd9e01006, - 0x50d86e6d, 0xebeca36c, 0x592d59da, 0xcbacb0bf, 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, - 0x57cc15bc, 0xc91af976, 0x5a6690ae, 0xd5052d97, 0x52beac9f, 0xe8f77acf, 0x55f104dc, 0xc6d569be, - 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a6690ae, 0xd09441bb, - 0x5471e2e6, 0xe61086bc, 0x50d86e6d, 0xc33aee27, 0x5a12e720, 0xce86ff2a, 0x553805f2, 0xe4a2eff6, - 0x4da1fab5, 0xc1eb0209, 0x5987b08a, 0xcc983f70, 0x55f104dc, 0xe3399167, 0x49ffd417, 0xc0f1360b, - 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x57cc15bc, 0xc91af976, - 0x573b2635, 0xe0745b24, 0x418d2621, 0xc004ef3f, 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, - 0x3cc85709, 0xc013bc39, 0x553805f2, 0xc6250a18, 0x584f7b58, 0xddc29958, 0x37af354c, 0xc07b371e, - 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x51d1dc80, 0xc3bdbdf6, - 0x592d59da, 0xdb25f566, 0x2c9caf6c, 0xc2517e31, 0x4fd288dc, 0xc2c17d52, 0x5987b08a, 0xd9e01006, - 0x26b2a794, 0xc3bdbdf6, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xd8a00bae, 0x2092f05f, 0xc57d965d, - 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, 0x48b2b335, 0xc0b15502, - 0x5a43b190, 0xd6326a88, 0x13d4ae08, 0xc9edeb50, 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, - 0x0d47d096, 0xcc983f70, 0x43103085, 0xc013bc39, 0x5a7b7f1a, 0xd3de9156, 0x06a886a0, 0xcf89e3e8, - 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3cc85709, 0xc013bc39, - 0x5a7b7f1a, 0xd1a5ef90, 0xf9577960, 0xd6326a88, 0x396b3199, 0xc04ee4b8, 0x5a6690ae, 0xd09441bb, - 0xf2b82f6a, 0xd9e01006, 0x35eaa2c7, 0xc0b15502, 0x5a43b190, 0xcf89e3e8, 0xec2b51f8, 0xddc29958, - 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x2e88013a, 0xc1eb0209, - 0x59d438e5, 0xcd8bbb6d, 0xdf6d0fa1, 0xe61086bc, 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, - 0xd94d586c, 0xea70658a, 0x26b2a794, 0xc3bdbdf6, 0x592d59da, 0xcbacb0bf, 0xd3635094, 0xeeee2d9d, - 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x1e7de5df, 0xc6250a18, - 0x584f7b58, 0xc9edeb50, 0xc850cab4, 0xf82a6c6a, 0x1a4608ab, 0xc78e9a1d, 0x57cc15bc, 0xc91af976, - 0xc337a8f7, 0xfcdc1342, 0x15fdf758, 0xc91af976, 0x573b2635, 0xc8507ea7, 0xbe72d9df, 0x0192155f, - 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, 0x0d47d096, 0xcc983f70, - 0x55f104dc, 0xc6d569be, 0xb6002be9, 0x0af10a22, 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, - 0xb25e054b, 0x0f8cfcbe, 0x0470ebdc, 0xd09441bb, 0x5471e2e6, 0xc57d965d, 0xaf279193, 0x14135c94, - 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xfb8f1424, 0xd5052d97, - 0x52beac9f, 0xc449d892, 0xaa0efb24, 0x1cc66e99, 0xf720e574, 0xd76619b6, 0x51d1dc80, 0xc3bdbdf6, - 0xa833ea44, 0x20e70f32, 0xf2b82f6a, 0xd9e01006, 0x50d86e6d, 0xc33aee27, 0xa6d2a626, 0x24da0a9a, - 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xea0208a8, 0xdf18f0ce, - 0x4ec05432, 0xc2517e31, 0xa58480e6, 0x2c216eaa, 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, - 0xa5996f52, 0x2f6bbe45, 0xe1821a21, 0xe4a2eff6, 0x4c77a88e, 0xc18e18a7, 0xa62bc71b, 0x32744493, - 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xd94d586c, 0xea70658a, - 0x49ffd417, 0xc0f1360b, 0xa8c4d9cb, 0x37af8159, 0xd5558381, 0xed6bf9d1, 0x48b2b335, 0xc0b15502, - 0xaac7fa0e, 0x39daf5e8, 0xd177fec6, 0xf0730342, 0x475a5c77, 0xc07b371e, 0xad415361, 0x3bb6276e, - 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, 0xca155d39, 0xf69bf7c9, - 0x4488e37f, 0xc02c64a6, 0xb3885772, 0x3e71e759, 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, - 0xb74d4ccb, 0x3f4eaafe, 0xc337a8f7, 0xfcdc1342, 0x418d2621, 0xc004ef3f, 0xbb771c81, 0x3fd39b5a, +const int twidTabEven[4 * 6 + 16 * 6 + 64 * 6] DPROGMEM = { + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x5a82799a, 0xd2bec333, + 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, + 0x00000000, 0xd2bec333, 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x4b418bbe, 0xf383a3e2, + 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, + 0x58c542c5, 0xdc71898d, 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, + 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xcac933ae, + 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, + 0x3248d382, 0xc13ad060, 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3248d382, 0xc13ad060, + 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, + 0xcdb72c7e, 0xf383a3e2, 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, + 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xee57aa21, 0xdc71898d, + 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, + 0xa73abd3b, 0x3536cc52, 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x43103085, 0xfcdc1342, + 0x418d2621, 0xfe6deaa1, 0x4488e37f, 0xfb4ab7db, 0x45f704f7, 0xf9ba1651, 0x43103085, 0xfcdc1342, + 0x48b2b335, 0xf69bf7c9, 0x48b2b335, 0xf69bf7c9, 0x4488e37f, 0xfb4ab7db, 0x4c77a88e, 0xf1fa3ecb, + 0x4b418bbe, 0xf383a3e2, 0x45f704f7, 0xf9ba1651, 0x4fd288dc, 0xed6bf9d1, 0x4da1fab5, 0xf0730342, + 0x475a5c77, 0xf82a6c6a, 0x52beac9f, 0xe8f77acf, 0x4fd288dc, 0xed6bf9d1, 0x48b2b335, 0xf69bf7c9, + 0x553805f2, 0xe4a2eff6, 0x51d1dc80, 0xea70658a, 0x49ffd417, 0xf50ef5de, 0x573b2635, 0xe0745b24, + 0x539eba45, 0xe7821d59, 0x4b418bbe, 0xf383a3e2, 0x58c542c5, 0xdc71898d, 0x553805f2, 0xe4a2eff6, + 0x4c77a88e, 0xf1fa3ecb, 0x59d438e5, 0xd8a00bae, 0x569cc31b, 0xe1d4a2c8, 0x4da1fab5, 0xf0730342, + 0x5a6690ae, 0xd5052d97, 0x57cc15bc, 0xdf18f0ce, 0x4ec05432, 0xeeee2d9d, 0x5a7b7f1a, 0xd1a5ef90, + 0x58c542c5, 0xdc71898d, 0x4fd288dc, 0xed6bf9d1, 0x5a12e720, 0xce86ff2a, 0x5987b08a, 0xd9e01006, + 0x50d86e6d, 0xebeca36c, 0x592d59da, 0xcbacb0bf, 0x5a12e720, 0xd76619b6, 0x51d1dc80, 0xea70658a, + 0x57cc15bc, 0xc91af976, 0x5a6690ae, 0xd5052d97, 0x52beac9f, 0xe8f77acf, 0x55f104dc, 0xc6d569be, + 0x5a82799a, 0xd2bec333, 0x539eba45, 0xe7821d59, 0x539eba45, 0xc4df2862, 0x5a6690ae, 0xd09441bb, + 0x5471e2e6, 0xe61086bc, 0x50d86e6d, 0xc33aee27, 0x5a12e720, 0xce86ff2a, 0x553805f2, 0xe4a2eff6, + 0x4da1fab5, 0xc1eb0209, 0x5987b08a, 0xcc983f70, 0x55f104dc, 0xe3399167, 0x49ffd417, 0xc0f1360b, + 0x58c542c5, 0xcac933ae, 0x569cc31b, 0xe1d4a2c8, 0x45f704f7, 0xc04ee4b8, 0x57cc15bc, 0xc91af976, + 0x573b2635, 0xe0745b24, 0x418d2621, 0xc004ef3f, 0x569cc31b, 0xc78e9a1d, 0x57cc15bc, 0xdf18f0ce, + 0x3cc85709, 0xc013bc39, 0x553805f2, 0xc6250a18, 0x584f7b58, 0xddc29958, 0x37af354c, 0xc07b371e, + 0x539eba45, 0xc4df2862, 0x58c542c5, 0xdc71898d, 0x3248d382, 0xc13ad060, 0x51d1dc80, 0xc3bdbdf6, + 0x592d59da, 0xdb25f566, 0x2c9caf6c, 0xc2517e31, 0x4fd288dc, 0xc2c17d52, 0x5987b08a, 0xd9e01006, + 0x26b2a794, 0xc3bdbdf6, 0x4da1fab5, 0xc1eb0209, 0x59d438e5, 0xd8a00bae, 0x2092f05f, 0xc57d965d, + 0x4b418bbe, 0xc13ad060, 0x5a12e720, 0xd76619b6, 0x1a4608ab, 0xc78e9a1d, 0x48b2b335, 0xc0b15502, + 0x5a43b190, 0xd6326a88, 0x13d4ae08, 0xc9edeb50, 0x45f704f7, 0xc04ee4b8, 0x5a6690ae, 0xd5052d97, + 0x0d47d096, 0xcc983f70, 0x43103085, 0xc013bc39, 0x5a7b7f1a, 0xd3de9156, 0x06a886a0, 0xcf89e3e8, + 0x40000000, 0xc0000000, 0x5a82799a, 0xd2bec333, 0x00000000, 0xd2bec333, 0x3cc85709, 0xc013bc39, + 0x5a7b7f1a, 0xd1a5ef90, 0xf9577960, 0xd6326a88, 0x396b3199, 0xc04ee4b8, 0x5a6690ae, 0xd09441bb, + 0xf2b82f6a, 0xd9e01006, 0x35eaa2c7, 0xc0b15502, 0x5a43b190, 0xcf89e3e8, 0xec2b51f8, 0xddc29958, + 0x3248d382, 0xc13ad060, 0x5a12e720, 0xce86ff2a, 0xe5b9f755, 0xe1d4a2c8, 0x2e88013a, 0xc1eb0209, + 0x59d438e5, 0xcd8bbb6d, 0xdf6d0fa1, 0xe61086bc, 0x2aaa7c7f, 0xc2c17d52, 0x5987b08a, 0xcc983f70, + 0xd94d586c, 0xea70658a, 0x26b2a794, 0xc3bdbdf6, 0x592d59da, 0xcbacb0bf, 0xd3635094, 0xeeee2d9d, + 0x22a2f4f8, 0xc4df2862, 0x58c542c5, 0xcac933ae, 0xcdb72c7e, 0xf383a3e2, 0x1e7de5df, 0xc6250a18, + 0x584f7b58, 0xc9edeb50, 0xc850cab4, 0xf82a6c6a, 0x1a4608ab, 0xc78e9a1d, 0x57cc15bc, 0xc91af976, + 0xc337a8f7, 0xfcdc1342, 0x15fdf758, 0xc91af976, 0x573b2635, 0xc8507ea7, 0xbe72d9df, 0x0192155f, + 0x11a855df, 0xcac933ae, 0x569cc31b, 0xc78e9a1d, 0xba08fb09, 0x0645e9af, 0x0d47d096, 0xcc983f70, + 0x55f104dc, 0xc6d569be, 0xb6002be9, 0x0af10a22, 0x08df1a8c, 0xce86ff2a, 0x553805f2, 0xc6250a18, + 0xb25e054b, 0x0f8cfcbe, 0x0470ebdc, 0xd09441bb, 0x5471e2e6, 0xc57d965d, 0xaf279193, 0x14135c94, + 0x00000000, 0xd2bec333, 0x539eba45, 0xc4df2862, 0xac6145bb, 0x187de2a7, 0xfb8f1424, 0xd5052d97, + 0x52beac9f, 0xc449d892, 0xaa0efb24, 0x1cc66e99, 0xf720e574, 0xd76619b6, 0x51d1dc80, 0xc3bdbdf6, + 0xa833ea44, 0x20e70f32, 0xf2b82f6a, 0xd9e01006, 0x50d86e6d, 0xc33aee27, 0xa6d2a626, 0x24da0a9a, + 0xee57aa21, 0xdc71898d, 0x4fd288dc, 0xc2c17d52, 0xa5ed18e0, 0x2899e64a, 0xea0208a8, 0xdf18f0ce, + 0x4ec05432, 0xc2517e31, 0xa58480e6, 0x2c216eaa, 0xe5b9f755, 0xe1d4a2c8, 0x4da1fab5, 0xc1eb0209, + 0xa5996f52, 0x2f6bbe45, 0xe1821a21, 0xe4a2eff6, 0x4c77a88e, 0xc18e18a7, 0xa62bc71b, 0x32744493, + 0xdd5d0b08, 0xe7821d59, 0x4b418bbe, 0xc13ad060, 0xa73abd3b, 0x3536cc52, 0xd94d586c, 0xea70658a, + 0x49ffd417, 0xc0f1360b, 0xa8c4d9cb, 0x37af8159, 0xd5558381, 0xed6bf9d1, 0x48b2b335, 0xc0b15502, + 0xaac7fa0e, 0x39daf5e8, 0xd177fec6, 0xf0730342, 0x475a5c77, 0xc07b371e, 0xad415361, 0x3bb6276e, + 0xcdb72c7e, 0xf383a3e2, 0x45f704f7, 0xc04ee4b8, 0xb02d7724, 0x3d3e82ae, 0xca155d39, 0xf69bf7c9, + 0x4488e37f, 0xc02c64a6, 0xb3885772, 0x3e71e759, 0xc694ce67, 0xf9ba1651, 0x43103085, 0xc013bc39, + 0xb74d4ccb, 0x3f4eaafe, 0xc337a8f7, 0xfcdc1342, 0x418d2621, 0xc004ef3f, 0xbb771c81, 0x3fd39b5a, }; -/* for reference, here's the code to generate the bitreverse tables - short blocks: nbits = 4 (nfft = 64) - long blocks: nbits = 7 (nfft = 512) +/* for reference, here's the code to generate the bitreverse tables + short blocks: nbits = 4 (nfft = 64) + long blocks: nbits = 7 (nfft = 512) -static int bitrev(int n, int nbits) -{ + static int bitrev(int n, int nbits) + { int r, i; r = 0; @@ -900,37 +906,37 @@ static int bitrev(int n, int nbits) } return r; -} + } -static void InitBitrevTable(unsigned char *out, int nbits) -{ + static void InitBitrevTable(unsigned char *out, int nbits) + { int i, t; for (i = 0; i < (1< KBD_THRESH); return i0; -} + } -static double CalcW(double nRef, double n, double a) -{ + static double CalcW(double nRef, double n, double a) + { double i0Base, i0Curr, nTemp; i0Base = CalcI0(M_PI * a); @@ -961,10 +967,10 @@ static double CalcW(double nRef, double n, double a) i0Curr = CalcI0( M_PI * a * sqrt(1.0 - nTemp*nTemp) ); return i0Curr / i0Base; -} + } -void InitKBDWindow(int nmdct) -{ + void InitKBDWindow(int nmdct) + { int n, nRef; double a, wBase, wCurr; @@ -988,17 +994,17 @@ void InitKBDWindow(int nmdct) } / *** - * symmetry: - * kbd_right(n) = kbd_ldef(N_REF - 1 - n), n = [N_REF/2, N_REF - 1] - * - * wCurr = 0; - * for (n = N_REF-1; n >= N_REF/2; n--) { - * wCurr += CalcW(N_REF-n-1, a); - * kbdWindowRef[n] = sqrt(wCurr / wBase); - * } - * + symmetry: + kbd_right(n) = kbd_ldef(N_REF - 1 - n), n = [N_REF/2, N_REF - 1] + + wCurr = 0; + for (n = N_REF-1; n >= N_REF/2; n--) { + wCurr += CalcW(N_REF-n-1, a); + kbdWindowRef[n] = sqrt(wCurr / wBase); + } + *** / return; -} + } */ #pragma GCC diagnostic pop diff --git a/src/libhelix-mp3/RCSL.txt b/src/libhelix-mp3/RCSL.txt index a809759a..4947e535 100644 --- a/src/libhelix-mp3/RCSL.txt +++ b/src/libhelix-mp3/RCSL.txt @@ -801,7 +801,7 @@ REQUIRED IN ALL CASES Notice to be included in header file of all Error Corrections and Shared Modifications: -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. +Portions Copyright 1994-2003 (c) RealNetworks, Inc. All rights reserved. The contents of this file, and the files included with this file, are subject to the current version of RealNetworks Community Source License diff --git a/src/libhelix-mp3/RPSL.txt b/src/libhelix-mp3/RPSL.txt index d040a452..94b44586 100644 --- a/src/libhelix-mp3/RPSL.txt +++ b/src/libhelix-mp3/RPSL.txt @@ -201,7 +201,7 @@ and 3, above. 4.2 Compatible Source Licenses. Software modules that have been independently developed without any use of Covered Code and which contain no portion of the Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger +in any way with the Covered Code or any Derivative Work to form a larger Derivative Work, are exempt from the conditions described in Section 4.1 but only to the extent that: the software module, including any software that is linked to, integrated with, or part of the same applications as, the software diff --git a/src/libhelix-mp3/assembly.h b/src/libhelix-mp3/assembly.h index 9c10c4da..085adb1d 100644 --- a/src/libhelix-mp3/assembly.h +++ b/src/libhelix-mp3/assembly.h @@ -1,57 +1,57 @@ /* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * assembly.h - assembly language functions and prototypes for supported platforms - * - * - inline rountines with access to 64-bit multiply results - * - x86 (_WIN32) and ARM (ARM_ADS, _WIN32_WCE) versions included - * - some inline functions are mix of asm and C for speed - * - some functions are in native asm files, so only the prototype is given here - * - * MULSHIFT32(x, y) signed multiply of two 32-bit integers (x and y), returns top 32 bits of 64-bit result - * FASTABS(x) branchless absolute value of signed integer x - * CLZ(x) count leading zeros in x - * MADD64(sum, x, y) (Windows only) sum [64-bit] += x [32-bit] * y [32-bit] - * SHL64(sum, x, y) (Windows only) 64-bit left shift using __int64 - * SAR64(sum, x, y) (Windows only) 64-bit right shift using __int64 - */ + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + assembly.h - assembly language functions and prototypes for supported platforms + + - inline routines with access to 64-bit multiply results + - x86 (_WIN32) and ARM (ARM_ADS, _WIN32_WCE) versions included + - some inline functions are mix of asm and C for speed + - some functions are in native asm files, so only the prototype is given here + + MULSHIFT32(x, y) signed multiply of two 32-bit integers (x and y), returns top 32 bits of 64-bit result + FASTABS(x) branchless absolute value of signed integer x + CLZ(x) count leading zeros in x + MADD64(sum, x, y) (Windows only) sum [64-bit] += x [32-bit] * y [32-bit] + SHL64(sum, x, y) (Windows only) 64-bit left shift using __int64 + SAR64(sum, x, y) (Windows only) 64-bit right shift using __int64 +*/ #ifndef _ASSEMBLY_H #define _ASSEMBLY_H @@ -60,128 +60,123 @@ #pragma warning( disable : 4035 ) /* complains about inline asm not returning a value */ -static __inline int MULSHIFT32(int x, int y) -{ +static __inline int MULSHIFT32(int x, int y) { __asm { - mov eax, x - imul y - mov eax, edx - } + mov eax, x + imul y + mov eax, edx + } } -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return (sizeof(int) * 8); + if (!x) { + return (sizeof(int) * 8); + } - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } + numZeros = 0; + while (!(x & 0x80000000)) { + numZeros++; + x <<= 1; + } - return numZeros; + return numZeros; } -/* MADD64, SHL64, SAR64: - * write in assembly to avoid dependency on run-time lib for 64-bit shifts, muls - * (sometimes compiler thunks to function calls instead of code generating) - * required for Symbian emulator - */ +/* MADD64, SHL64, SAR64: + write in assembly to avoid dependency on run-time lib for 64-bit shifts, muls + (sometimes compiler thunks to function calls instead of code generating) + required for Symbian emulator +*/ #ifdef __CW32__ typedef long long Word64; #else typedef __int64 Word64; #endif -static __inline Word64 MADD64(Word64 sum, int x, int y) -{ - unsigned int sumLo = ((unsigned int *)&sum)[0]; - int sumHi = ((int *)&sum)[1]; +static __inline Word64 MADD64(Word64 sum, int x, int y) { + unsigned int sumLo = ((unsigned int *)&sum)[0]; + int sumHi = ((int *)&sum)[1]; - __asm { - mov eax, x - imul y - add eax, sumLo - adc edx, sumHi - } + __asm { + mov eax, x + imul y + add eax, sumLo + adc edx, sumHi + } - /* equivalent to return (sum + ((__int64)x * y)); */ + /* equivalent to return (sum + ((__int64)x * y)); */ } -static __inline Word64 SHL64(Word64 x, int n) -{ - unsigned int xLo = ((unsigned int *)&x)[0]; - int xHi = ((int *)&x)[1]; - unsigned char nb = (unsigned char)n; - - if (n < 32) { - __asm { - mov edx, xHi - mov eax, xLo - mov cl, nb - shld edx, eax, cl - shl eax, cl - } - } else if (n < 64) { - /* shl masks cl to 0x1f */ - __asm { - mov edx, xLo - mov cl, nb - xor eax, eax - shl edx, cl - } - } else { - __asm { - xor edx, edx - xor eax, eax - } - } +static __inline Word64 SHL64(Word64 x, int n) { + unsigned int xLo = ((unsigned int *)&x)[0]; + int xHi = ((int *)&x)[1]; + unsigned char nb = (unsigned char)n; + + if (n < 32) { + __asm { + mov edx, xHi + mov eax, xLo + mov cl, nb + shld edx, eax, cl + shl eax, cl + } + } else if (n < 64) { + /* shl masks cl to 0x1f */ + __asm { + mov edx, xLo + mov cl, nb + xor eax, eax + shl edx, cl + } + } else { + __asm { + xor edx, edx + xor eax, eax + } + } } -static __inline Word64 SAR64(Word64 x, int n) -{ - unsigned int xLo = ((unsigned int *)&x)[0]; - int xHi = ((int *)&x)[1]; - unsigned char nb = (unsigned char)n; - - if (n < 32) { - __asm { - mov edx, xHi - mov eax, xLo - mov cl, nb - shrd eax, edx, cl - sar edx, cl - } - } else if (n < 64) { - /* sar masks cl to 0x1f */ - __asm { - mov edx, xHi - mov eax, xHi - mov cl, nb - sar edx, 31 - sar eax, cl - } - } else { - __asm { - sar xHi, 31 - mov eax, xHi - mov edx, xHi - } - } +static __inline Word64 SAR64(Word64 x, int n) { + unsigned int xLo = ((unsigned int *)&x)[0]; + int xHi = ((int *)&x)[1]; + unsigned char nb = (unsigned char)n; + + if (n < 32) { + __asm { + mov edx, xHi + mov eax, xLo + mov cl, nb + shrd eax, edx, cl + sar edx, cl + } + } else if (n < 64) { + /* sar masks cl to 0x1f */ + __asm { + mov edx, xHi + mov eax, xHi + mov cl, nb + sar edx, 31 + sar eax, cl + } + } else { + __asm { + sar xHi, 31 + mov eax, xHi + mov edx, xHi + } + } } #elif (defined _WIN32) && (defined _WIN32_WCE) @@ -190,180 +185,167 @@ static __inline Word64 SAR64(Word64 x, int n) #define MULSHIFT32 xmp3_MULSHIFT32 int MULSHIFT32(int x, int y); -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return (sizeof(int) * 8); + if (!x) { + return (sizeof(int) * 8); + } - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } + numZeros = 0; + while (!(x & 0x80000000)) { + numZeros++; + x <<= 1; + } - return numZeros; + return numZeros; } -#elif defined ARM_ADS - -static __inline int MULSHIFT32(int x, int y) -{ - /* important rules for smull RdLo, RdHi, Rm, Rs: - * RdHi and Rm can't be the same register - * RdLo and Rm can't be the same register - * RdHi and RdLo can't be the same register - * Note: Rs determines early termination (leading sign bits) so if you want to specify - * which operand is Rs, put it in the SECOND argument (y) - * For inline assembly, x and y are not assumed to be R0, R1 so it shouldn't matter - * which one is returned. (If this were a function call, returning y (R1) would - * require an extra "mov r0, r1") - */ +#elif defined XXXARM_ADS + +static __inline int MULSHIFT32(int x, int y) { + /* important rules for smull RdLo, RdHi, Rm, Rs: + RdHi and Rm can't be the same register + RdLo and Rm can't be the same register + RdHi and RdLo can't be the same register + Note: Rs determines early termination (leading sign bits) so if you want to specify + which operand is Rs, put it in the SECOND argument (y) + For inline assembly, x and y are not assumed to be R0, R1 so it shouldn't matter + which one is returned. (If this were a function call, returning y (R1) would + require an extra "mov r0, r1") + */ int zlow; __asm { - smull zlow,y,x,y - } + smull zlow, y, x, y + } return y; } -static __inline int FASTABS(int x) -{ - int t=0; /*Really is not necessary to initialiaze only to avoid warning*/ +static __inline int FASTABS(int x) { + int t = 0; /*Really is not necessary to initialize only to avoid warning*/ - __asm { - eor t, x, x, asr #31 - sub t, t, x, asr #31 - } + __asm { + eor t, x, x, asr #31 + sub t, t, x, asr #31 + } - return t; + return t; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return (sizeof(int) * 8); + if (!x) { + return (sizeof(int) * 8); + } - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } + numZeros = 0; + while (!(x & 0x80000000)) { + numZeros++; + x <<= 1; + } - return numZeros; + return numZeros; } -#elif defined(__GNUC__) && defined(__thumb__) +#elif defined(__GNUC__) && defined(XXXX__thumb__) -static __inline int MULSHIFT32(int x, int y) -{ +static __inline int MULSHIFT32(int x, int y) { // important rules for smull RdLo, RdHi, Rm, Rs: // RdHi and Rm can't be the same register // RdLo and Rm can't be the same register // RdHi and RdLo can't be the same register // Note: Rs determines early termination (leading sign bits) so if you want to specify // which operand is Rs, put it in the SECOND argument (y) - // For inline assembly, x and y are not assumed to be R0, R1 so it shouldn't matter - // which one is returned. (If this were a function call, returning y (R1) would - // require an extra "mov r0, r1") + // For inline assembly, x and y are not assumed to be R0, R1 so it shouldn't matter + // which one is returned. (If this were a function call, returning y (R1) would + // require an extra "mov r0, r1") int zlow; - __asm__ volatile ("smull %0,%1,%2,%3" : "=&r" (zlow), "=r" (y) : "r" (x), "1" (y)) ; + __asm__ volatile("smull %0,%1,%2,%3" : "=&r"(zlow), "=r"(y) : "r"(x), "1"(y)) ; return y; } //fb #include -static __inline int FASTABS(int x) -{ - return abs(x); +static __inline int FASTABS(int x) { + return abs(x); } -static __inline int CLZ(int x) -{ - return __builtin_clz(x); +static __inline int CLZ(int x) { + return __builtin_clz(x); } //fb //mw //TODO: Check Compiler output on these.. (fb) -static __inline Word64 xMADD64(Word64 sum, int x, int y) -{ - return (sum + ((int64_t)x * y)); +static __inline Word64 xMADD64(Word64 sum, int x, int y) { + return (sum + ((int64_t)x * y)); } -static __inline Word64 xHL64(Word64 x, int n) -{ - return x << n; +static __inline Word64 xHL64(Word64 x, int n) { + return x << n; } -static __inline Word64 xSAR64(Word64 x, int n) -{ - return x >> n; +static __inline Word64 xSAR64(Word64 x, int n) { + return x >> n; } //mw #elif defined(ARDUINO) -static __inline int FASTABS(int x) -{ - int sign; +static __inline int FASTABS(int x) { + int sign; - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; + sign = x >> (sizeof(int) * 8 - 1); + x ^= sign; + x -= sign; - return x; + return x; } -static __inline int CLZ(int x) -{ - int numZeros; +static __inline int CLZ(int x) { + int numZeros; - if (!x) - return (sizeof(int) * 8); + if (!x) { + return (sizeof(int) * 8); + } - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } + numZeros = 0; + while (!(x & 0x80000000)) { + numZeros++; + x <<= 1; + } - return numZeros; + return numZeros; } /* returns 64-bit value in [edx:eax] */ -static __inline Word64 MADD64(Word64 sum64, int x, int y) -{ +static __inline Word64 MADD64(Word64 sum64, int x, int y) { sum64 += (Word64)x * (Word64)y; return sum64; } -static __inline__ int MULSHIFT32(int x, int y) -{ +static __inline__ int MULSHIFT32(int x, int y) { int z; z = (Word64)x * (Word64)y >> 32; - return z; + return z; } -static __inline Word64 SAR64(Word64 x, int n) -{ - return x >> n; +static __inline Word64 SAR64(Word64 x, int n) { + return x >> n; } #else diff --git a/src/libhelix-mp3/bitstream.c b/src/libhelix-mp3/bitstream.c index 608c39cc..130c6463 100644 --- a/src/libhelix-mp3/bitstream.c +++ b/src/libhelix-mp3/bitstream.c @@ -1,389 +1,388 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * bitstream.c - bitstream unpacking, frame header parsing, side info parsing + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + bitstream.c - bitstream unpacking, frame header parsing, side info parsing **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: SetBitstreamPointer - * - * Description: initialize bitstream reader - * - * Inputs: pointer to BitStreamInfo struct - * number of bytes in bitstream - * pointer to byte-aligned buffer of data to read from - * - * Outputs: filled bitstream info struct - * - * Return: none + Function: SetBitstreamPointer + + Description: initialize bitstream reader + + Inputs: pointer to BitStreamInfo struct + number of bytes in bitstream + pointer to byte-aligned buffer of data to read from + + Outputs: filled bitstream info struct + + Return: none **************************************************************************************/ -void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf) -{ - /* init bitstream */ - bsi->bytePtr = buf; - bsi->iCache = 0; /* 4-byte unsigned int */ - bsi->cachedBits = 0; /* i.e. zero bits in cache */ - bsi->nBytes = nBytes; +void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf) { + /* init bitstream */ + bsi->bytePtr = buf; + bsi->iCache = 0; /* 4-byte unsigned int */ + bsi->cachedBits = 0; /* i.e. zero bits in cache */ + bsi->nBytes = nBytes; } /************************************************************************************** - * Function: RefillBitstreamCache - * - * Description: read new data from bitstream buffer into bsi cache - * - * Inputs: pointer to initialized BitStreamInfo struct - * - * Outputs: updated bitstream info struct - * - * Return: none - * - * Notes: only call when iCache is completely drained (resets bitOffset to 0) - * always loads 4 new bytes except when bsi->nBytes < 4 (end of buffer) - * stores data as big-endian in cache, regardless of machine endian-ness - * - * TODO: optimize for ARM - * possibly add little/big-endian modes for doing 32-bit loads + Function: RefillBitstreamCache + + Description: read new data from bitstream buffer into bsi cache + + Inputs: pointer to initialized BitStreamInfo struct + + Outputs: updated bitstream info struct + + Return: none + + Notes: only call when iCache is completely drained (resets bitOffset to 0) + always loads 4 new bytes except when bsi->nBytes < 4 (end of buffer) + stores data as big-endian in cache, regardless of machine endian-ness + + TODO: optimize for ARM + possibly add little/big-endian modes for doing 32-bit loads **************************************************************************************/ -static __inline void RefillBitstreamCache(BitStreamInfo *bsi) -{ - int nBytes = bsi->nBytes; - - /* optimize for common case, independent of machine endian-ness */ - if (nBytes >= 4) { - bsi->iCache = (*bsi->bytePtr++) << 24; - bsi->iCache |= (*bsi->bytePtr++) << 16; - bsi->iCache |= (*bsi->bytePtr++) << 8; - bsi->iCache |= (*bsi->bytePtr++); - bsi->cachedBits = 32; - bsi->nBytes -= 4; - } else { - bsi->iCache = 0; - while (nBytes--) { - bsi->iCache |= (*bsi->bytePtr++); - bsi->iCache <<= 8; - } - bsi->iCache <<= ((3 - bsi->nBytes)*8); - bsi->cachedBits = 8*bsi->nBytes; - bsi->nBytes = 0; - } +static __inline void RefillBitstreamCache(BitStreamInfo *bsi) { + int nBytes = bsi->nBytes; + + /* optimize for common case, independent of machine endian-ness */ + if (nBytes >= 4) { + bsi->iCache = (*bsi->bytePtr++) << 24; + bsi->iCache |= (*bsi->bytePtr++) << 16; + bsi->iCache |= (*bsi->bytePtr++) << 8; + bsi->iCache |= (*bsi->bytePtr++); + bsi->cachedBits = 32; + bsi->nBytes -= 4; + } else { + bsi->iCache = 0; + while (nBytes--) { + bsi->iCache |= (*bsi->bytePtr++); + bsi->iCache <<= 8; + } + bsi->iCache <<= ((3 - bsi->nBytes) * 8); + bsi->cachedBits = 8 * bsi->nBytes; + bsi->nBytes = 0; + } } /************************************************************************************** - * Function: GetBits - * - * Description: get bits from bitstream, advance bitstream pointer - * - * Inputs: pointer to initialized BitStreamInfo struct - * number of bits to get from bitstream - * - * Outputs: updated bitstream info struct - * - * Return: the next nBits bits of data from bitstream buffer - * - * Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f - * for speed, does not indicate error if you overrun bit buffer - * if nBits = 0, returns 0 (useful for scalefactor unpacking) - * - * TODO: optimize for ARM + Function: GetBits + + Description: get bits from bitstream, advance bitstream pointer + + Inputs: pointer to initialized BitStreamInfo struct + number of bits to get from bitstream + + Outputs: updated bitstream info struct + + Return: the next nBits bits of data from bitstream buffer + + Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f + for speed, does not indicate error if you overrun bit buffer + if nBits = 0, returns 0 (useful for scalefactor unpacking) + + TODO: optimize for ARM **************************************************************************************/ -unsigned int GetBits(BitStreamInfo *bsi, int nBits) -{ - unsigned int data, lowBits; - - nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ - data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ - data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ - bsi->iCache <<= nBits; /* left-justify cache */ - bsi->cachedBits -= nBits; /* how many bits have we drawn from the cache so far */ - - /* if we cross an int boundary, refill the cache */ - if (bsi->cachedBits < 0) { - lowBits = -bsi->cachedBits; - RefillBitstreamCache(bsi); - data |= bsi->iCache >> (32 - lowBits); /* get the low-order bits */ - - bsi->cachedBits -= lowBits; /* how many bits have we drawn from the cache so far */ - bsi->iCache <<= lowBits; /* left-justify cache */ - } - - return data; +unsigned int GetBits(BitStreamInfo *bsi, int nBits) { + unsigned int data, lowBits; + + nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ + data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ + data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ + bsi->iCache <<= nBits; /* left-justify cache */ + bsi->cachedBits -= nBits; /* how many bits have we drawn from the cache so far */ + + /* if we cross an int boundary, refill the cache */ + if (bsi->cachedBits < 0) { + lowBits = -bsi->cachedBits; + RefillBitstreamCache(bsi); + data |= bsi->iCache >> (32 - lowBits); /* get the low-order bits */ + + bsi->cachedBits -= lowBits; /* how many bits have we drawn from the cache so far */ + bsi->iCache <<= lowBits; /* left-justify cache */ + } + + return data; } /************************************************************************************** - * Function: CalcBitsUsed - * - * Description: calculate how many bits have been read from bitstream - * - * Inputs: pointer to initialized BitStreamInfo struct - * pointer to start of bitstream buffer - * bit offset into first byte of startBuf (0-7) - * - * Outputs: none - * - * Return: number of bits read from bitstream, as offset from startBuf:startOffset + Function: CalcBitsUsed + + Description: calculate how many bits have been read from bitstream + + Inputs: pointer to initialized BitStreamInfo struct + pointer to start of bitstream buffer + bit offset into first byte of startBuf (0-7) + + Outputs: none + + Return: number of bits read from bitstream, as offset from startBuf:startOffset **************************************************************************************/ -int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset) -{ - int bitsUsed; +int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset) { + int bitsUsed; - bitsUsed = (bsi->bytePtr - startBuf) * 8; - bitsUsed -= bsi->cachedBits; - bitsUsed -= startOffset; + bitsUsed = (bsi->bytePtr - startBuf) * 8; + bitsUsed -= bsi->cachedBits; + bitsUsed -= startOffset; - return bitsUsed; + return bitsUsed; } /************************************************************************************** - * Function: CheckPadBit - * - * Description: check whether padding byte is present in an MP3 frame - * - * Inputs: MP3DecInfo struct with valid FrameHeader struct - * (filled by UnpackFrameHeader()) - * - * Outputs: none - * - * Return: 1 if pad bit is set, 0 if not, -1 if null input pointer + Function: CheckPadBit + + Description: check whether padding byte is present in an MP3 frame + + Inputs: MP3DecInfo struct with valid FrameHeader struct + (filled by UnpackFrameHeader()) + + Outputs: none + + Return: 1 if pad bit is set, 0 if not, -1 if null input pointer **************************************************************************************/ -int CheckPadBit(MP3DecInfo *mp3DecInfo) -{ - FrameHeader *fh; +int CheckPadBit(MP3DecInfo *mp3DecInfo) { + FrameHeader *fh; - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS) - return -1; + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS) { + return -1; + } - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); + fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - return (fh->paddingBit ? 1 : 0); + return (fh->paddingBit ? 1 : 0); } /************************************************************************************** - * Function: UnpackFrameHeader - * - * Description: parse the fields of the MP3 frame header - * - * Inputs: buffer pointing to a complete MP3 frame header (4 bytes, plus 2 if CRC) - * - * Outputs: filled frame header info in the MP3DecInfo structure - * updated platform-specific FrameHeader struct - * - * Return: length (in bytes) of frame header (for caller to calculate offset to - * first byte following frame header) - * -1 if null frameHeader or invalid header - * - * TODO: check for valid modes, depending on capabilities of decoder - * test CRC on actual stream (verify no endian problems) + Function: UnpackFrameHeader + + Description: parse the fields of the MP3 frame header + + Inputs: buffer pointing to a complete MP3 frame header (4 bytes, plus 2 if CRC) + + Outputs: filled frame header info in the MP3DecInfo structure + updated platform-specific FrameHeader struct + + Return: length (in bytes) of frame header (for caller to calculate offset to + first byte following frame header) + -1 if null frameHeader or invalid header + + TODO: check for valid modes, depending on capabilities of decoder + test CRC on actual stream (verify no endian problems) **************************************************************************************/ -int UnpackFrameHeader(MP3DecInfo *mp3DecInfo, unsigned char *buf) -{ - - int verIdx; - FrameHeader *fh; - - /* validate pointers and sync word */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || (buf[0] & SYNCWORDH) != SYNCWORDH || (buf[1] & SYNCWORDL) != SYNCWORDL) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - - /* read header fields - use bitmasks instead of GetBits() for speed, since format never varies */ - verIdx = (buf[1] >> 3) & 0x03; - fh->ver = (MPEGVersion)( verIdx == 0 ? MPEG25 : ((verIdx & 0x01) ? MPEG1 : MPEG2) ); - fh->layer = 4 - ((buf[1] >> 1) & 0x03); /* easy mapping of index to layer number, 4 = error */ - fh->crc = 1 - ((buf[1] >> 0) & 0x01); - fh->brIdx = (buf[2] >> 4) & 0x0f; - fh->srIdx = (buf[2] >> 2) & 0x03; - fh->paddingBit = (buf[2] >> 1) & 0x01; - fh->privateBit = (buf[2] >> 0) & 0x01; - fh->sMode = (StereoMode)((buf[3] >> 6) & 0x03); /* maps to correct enum (see definition) */ - fh->modeExt = (buf[3] >> 4) & 0x03; - fh->copyFlag = (buf[3] >> 3) & 0x01; - fh->origFlag = (buf[3] >> 2) & 0x01; - fh->emphasis = (buf[3] >> 0) & 0x03; - - /* check parameters to avoid indexing tables with bad values */ - if (fh->srIdx == 3 || fh->layer == 4 || fh->brIdx == 15) - return -1; - - fh->sfBand = &sfBandTable[fh->ver][fh->srIdx]; /* for readability (we reference sfBandTable many times in decoder) */ - if (fh->sMode != Joint) /* just to be safe (dequant, stproc check fh->modeExt) */ - fh->modeExt = 0; - - /* init user-accessible data */ - mp3DecInfo->nChans = (fh->sMode == Mono ? 1 : 2); - mp3DecInfo->samprate = samplerateTab[fh->ver][fh->srIdx]; - mp3DecInfo->nGrans = (fh->ver == MPEG1 ? NGRANS_MPEG1 : NGRANS_MPEG2); - mp3DecInfo->nGranSamps = ((int)samplesPerFrameTab[fh->ver][fh->layer - 1]) / mp3DecInfo->nGrans; - mp3DecInfo->layer = fh->layer; - mp3DecInfo->version = fh->ver; - - /* get bitrate and nSlots from table, unless brIdx == 0 (free mode) in which case caller must figure it out himself - * question - do we want to overwrite mp3DecInfo->bitrate with 0 each time if it's free mode, and - * copy the pre-calculated actual free bitrate into it in mp3dec.c (according to the spec, - * this shouldn't be necessary, since it should be either all frames free or none free) - */ - if (fh->brIdx) { - mp3DecInfo->bitrate = ((int)bitrateTab[fh->ver][fh->layer - 1][fh->brIdx]) * 1000; - - /* nSlots = total frame bytes (from table) - sideInfo bytes - header - CRC (if present) + pad (if present) */ - mp3DecInfo->nSlots = (int)slotTab[fh->ver][fh->srIdx][fh->brIdx] - - (int)sideBytesTab[fh->ver][(fh->sMode == Mono ? 0 : 1)] - - 4 - (fh->crc ? 2 : 0) + (fh->paddingBit ? 1 : 0); - } - - /* load crc word, if enabled, and return length of frame header (in bytes) */ - if (fh->crc) { - fh->CRCWord = ((int)buf[4] << 8 | (int)buf[5] << 0); - return 6; - } else { - fh->CRCWord = 0; - return 4; - } +int UnpackFrameHeader(MP3DecInfo *mp3DecInfo, unsigned char *buf) { + + int verIdx; + FrameHeader *fh; + + /* validate pointers and sync word */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || (buf[0] & SYNCWORDH) != SYNCWORDH || (buf[1] & SYNCWORDL) != SYNCWORDL) { + return -1; + } + + fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); + + /* read header fields - use bitmasks instead of GetBits() for speed, since format never varies */ + verIdx = (buf[1] >> 3) & 0x03; + fh->ver = (MPEGVersion)(verIdx == 0 ? MPEG25 : ((verIdx & 0x01) ? MPEG1 : MPEG2)); + fh->layer = 4 - ((buf[1] >> 1) & 0x03); /* easy mapping of index to layer number, 4 = error */ + fh->crc = 1 - ((buf[1] >> 0) & 0x01); + fh->brIdx = (buf[2] >> 4) & 0x0f; + fh->srIdx = (buf[2] >> 2) & 0x03; + fh->paddingBit = (buf[2] >> 1) & 0x01; + fh->privateBit = (buf[2] >> 0) & 0x01; + fh->sMode = (StereoMode)((buf[3] >> 6) & 0x03); /* maps to correct enum (see definition) */ + fh->modeExt = (buf[3] >> 4) & 0x03; + fh->copyFlag = (buf[3] >> 3) & 0x01; + fh->origFlag = (buf[3] >> 2) & 0x01; + fh->emphasis = (buf[3] >> 0) & 0x03; + + /* check parameters to avoid indexing tables with bad values */ + if (fh->srIdx == 3 || fh->layer == 4 || fh->brIdx == 15) { + return -1; + } + + fh->sfBand = &sfBandTable[fh->ver][fh->srIdx]; /* for readability (we reference sfBandTable many times in decoder) */ + if (fh->sMode != Joint) { /* just to be safe (dequant, stproc check fh->modeExt) */ + fh->modeExt = 0; + } + + /* init user-accessible data */ + mp3DecInfo->nChans = (fh->sMode == Mono ? 1 : 2); + mp3DecInfo->samprate = samplerateTab[fh->ver][fh->srIdx]; + mp3DecInfo->nGrans = (fh->ver == MPEG1 ? NGRANS_MPEG1 : NGRANS_MPEG2); + mp3DecInfo->nGranSamps = ((int)samplesPerFrameTab[fh->ver][fh->layer - 1]) / mp3DecInfo->nGrans; + mp3DecInfo->layer = fh->layer; + mp3DecInfo->version = fh->ver; + + /* get bitrate and nSlots from table, unless brIdx == 0 (free mode) in which case caller must figure it out himself + question - do we want to overwrite mp3DecInfo->bitrate with 0 each time if it's free mode, and + copy the pre-calculated actual free bitrate into it in mp3dec.c (according to the spec, + this shouldn't be necessary, since it should be either all frames free or none free) + */ + if (fh->brIdx) { + mp3DecInfo->bitrate = ((int)bitrateTab[fh->ver][fh->layer - 1][fh->brIdx]) * 1000; + + /* nSlots = total frame bytes (from table) - sideInfo bytes - header - CRC (if present) + pad (if present) */ + mp3DecInfo->nSlots = (int)slotTab[fh->ver][fh->srIdx][fh->brIdx] - + (int)sideBytesTab[fh->ver][(fh->sMode == Mono ? 0 : 1)] - + 4 - (fh->crc ? 2 : 0) + (fh->paddingBit ? 1 : 0); + } + + /* load crc word, if enabled, and return length of frame header (in bytes) */ + if (fh->crc) { + fh->CRCWord = ((int)buf[4] << 8 | (int)buf[5] << 0); + return 6; + } else { + fh->CRCWord = 0; + return 4; + } } /************************************************************************************** - * Function: UnpackSideInfo - * - * Description: parse the fields of the MP3 side info header - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader() - * buffer pointing to the MP3 side info data - * - * Outputs: updated mainDataBegin in MP3DecInfo struct - * updated private (platform-specific) SideInfo struct - * - * Return: length (in bytes) of side info data - * -1 if null input pointers + Function: UnpackSideInfo + + Description: parse the fields of the MP3 side info header + + Inputs: MP3DecInfo structure filled by UnpackFrameHeader() + buffer pointing to the MP3 side info data + + Outputs: updated mainDataBegin in MP3DecInfo struct + updated private (platform-specific) SideInfo struct + + Return: length (in bytes) of side info data + -1 if null input pointers **************************************************************************************/ -int UnpackSideInfo(MP3DecInfo *mp3DecInfo, unsigned char *buf) -{ - int gr, ch, bd, nBytes; - BitStreamInfo bitStreamInfo, *bsi; - FrameHeader *fh; - SideInfo *si; - SideInfoSub *sis; - - /* validate pointers and sync word */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - - bsi = &bitStreamInfo; - if (fh->ver == MPEG1) { - /* MPEG 1 */ - nBytes = (fh->sMode == Mono ? SIBYTES_MPEG1_MONO : SIBYTES_MPEG1_STEREO); - SetBitstreamPointer(bsi, nBytes, buf); - si->mainDataBegin = GetBits(bsi, 9); - si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 5 : 3)); - - for (ch = 0; ch < mp3DecInfo->nChans; ch++) - for (bd = 0; bd < MAX_SCFBD; bd++) - si->scfsi[ch][bd] = GetBits(bsi, 1); - } else { - /* MPEG 2, MPEG 2.5 */ - nBytes = (fh->sMode == Mono ? SIBYTES_MPEG2_MONO : SIBYTES_MPEG2_STEREO); - SetBitstreamPointer(bsi, nBytes, buf); - si->mainDataBegin = GetBits(bsi, 8); - si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 1 : 2)); - } - - for(gr =0; gr < mp3DecInfo->nGrans; gr++) { - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - sis = &si->sis[gr][ch]; /* side info subblock for this granule, channel */ - - sis->part23Length = GetBits(bsi, 12); - sis->nBigvals = GetBits(bsi, 9); - sis->globalGain = GetBits(bsi, 8); - sis->sfCompress = GetBits(bsi, (fh->ver == MPEG1 ? 4 : 9)); - sis->winSwitchFlag = GetBits(bsi, 1); - - if(sis->winSwitchFlag) { - /* this is a start, stop, short, or mixed block */ - sis->blockType = GetBits(bsi, 2); /* 0 = normal, 1 = start, 2 = short, 3 = stop */ - sis->mixedBlock = GetBits(bsi, 1); /* 0 = not mixed, 1 = mixed */ - sis->tableSelect[0] = GetBits(bsi, 5); - sis->tableSelect[1] = GetBits(bsi, 5); - sis->tableSelect[2] = 0; /* unused */ - sis->subBlockGain[0] = GetBits(bsi, 3); - sis->subBlockGain[1] = GetBits(bsi, 3); - sis->subBlockGain[2] = GetBits(bsi, 3); - - /* TODO - check logic */ - if (sis->blockType == 0) { - /* this should not be allowed, according to spec */ - sis->nBigvals = 0; - sis->part23Length = 0; - sis->sfCompress = 0; - } else if (sis->blockType == 2 && sis->mixedBlock == 0) { - /* short block, not mixed */ - sis->region0Count = 8; - } else { - /* start, stop, or short-mixed */ - sis->region0Count = 7; - } - sis->region1Count = 20 - sis->region0Count; - } else { - /* this is a normal block */ - sis->blockType = 0; - sis->mixedBlock = 0; - sis->tableSelect[0] = GetBits(bsi, 5); - sis->tableSelect[1] = GetBits(bsi, 5); - sis->tableSelect[2] = GetBits(bsi, 5); - sis->region0Count = GetBits(bsi, 4); - sis->region1Count = GetBits(bsi, 3); - } - sis->preFlag = (fh->ver == MPEG1 ? GetBits(bsi, 1) : 0); - sis->sfactScale = GetBits(bsi, 1); - sis->count1TableSelect = GetBits(bsi, 1); - } - } - mp3DecInfo->mainDataBegin = si->mainDataBegin; /* needed by main decode loop */ - - ASSERT(nBytes == CalcBitsUsed(bsi, buf, 0) >> 3); - - return nBytes; +int UnpackSideInfo(MP3DecInfo *mp3DecInfo, unsigned char *buf) { + int gr, ch, bd, nBytes; + BitStreamInfo bitStreamInfo, *bsi; + FrameHeader *fh; + SideInfo *si; + SideInfoSub *sis; + + /* validate pointers and sync word */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS) { + return -1; + } + + fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); + si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); + + bsi = &bitStreamInfo; + if (fh->ver == MPEG1) { + /* MPEG 1 */ + nBytes = (fh->sMode == Mono ? SIBYTES_MPEG1_MONO : SIBYTES_MPEG1_STEREO); + SetBitstreamPointer(bsi, nBytes, buf); + si->mainDataBegin = GetBits(bsi, 9); + si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 5 : 3)); + + for (ch = 0; ch < mp3DecInfo->nChans; ch++) + for (bd = 0; bd < MAX_SCFBD; bd++) { + si->scfsi[ch][bd] = GetBits(bsi, 1); + } + } else { + /* MPEG 2, MPEG 2.5 */ + nBytes = (fh->sMode == Mono ? SIBYTES_MPEG2_MONO : SIBYTES_MPEG2_STEREO); + SetBitstreamPointer(bsi, nBytes, buf); + si->mainDataBegin = GetBits(bsi, 8); + si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 1 : 2)); + } + + for (gr = 0; gr < mp3DecInfo->nGrans; gr++) { + for (ch = 0; ch < mp3DecInfo->nChans; ch++) { + sis = &si->sis[gr][ch]; /* side info subblock for this granule, channel */ + + sis->part23Length = GetBits(bsi, 12); + sis->nBigvals = GetBits(bsi, 9); + sis->globalGain = GetBits(bsi, 8); + sis->sfCompress = GetBits(bsi, (fh->ver == MPEG1 ? 4 : 9)); + sis->winSwitchFlag = GetBits(bsi, 1); + + if (sis->winSwitchFlag) { + /* this is a start, stop, short, or mixed block */ + sis->blockType = GetBits(bsi, 2); /* 0 = normal, 1 = start, 2 = short, 3 = stop */ + sis->mixedBlock = GetBits(bsi, 1); /* 0 = not mixed, 1 = mixed */ + sis->tableSelect[0] = GetBits(bsi, 5); + sis->tableSelect[1] = GetBits(bsi, 5); + sis->tableSelect[2] = 0; /* unused */ + sis->subBlockGain[0] = GetBits(bsi, 3); + sis->subBlockGain[1] = GetBits(bsi, 3); + sis->subBlockGain[2] = GetBits(bsi, 3); + + /* TODO - check logic */ + if (sis->blockType == 0) { + /* this should not be allowed, according to spec */ + sis->nBigvals = 0; + sis->part23Length = 0; + sis->sfCompress = 0; + } else if (sis->blockType == 2 && sis->mixedBlock == 0) { + /* short block, not mixed */ + sis->region0Count = 8; + } else { + /* start, stop, or short-mixed */ + sis->region0Count = 7; + } + sis->region1Count = 20 - sis->region0Count; + } else { + /* this is a normal block */ + sis->blockType = 0; + sis->mixedBlock = 0; + sis->tableSelect[0] = GetBits(bsi, 5); + sis->tableSelect[1] = GetBits(bsi, 5); + sis->tableSelect[2] = GetBits(bsi, 5); + sis->region0Count = GetBits(bsi, 4); + sis->region1Count = GetBits(bsi, 3); + } + sis->preFlag = (fh->ver == MPEG1 ? GetBits(bsi, 1) : 0); + sis->sfactScale = GetBits(bsi, 1); + sis->count1TableSelect = GetBits(bsi, 1); + } + } + mp3DecInfo->mainDataBegin = si->mainDataBegin; /* needed by main decode loop */ + + ASSERT(nBytes == CalcBitsUsed(bsi, buf, 0) >> 3); + + return nBytes; } diff --git a/src/libhelix-mp3/buffers.c b/src/libhelix-mp3/buffers.c index 52b9bcf7..184abbf1 100644 --- a/src/libhelix-mp3/buffers.c +++ b/src/libhelix-mp3/buffers.c @@ -1,73 +1,73 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * buffers.c - allocation and freeing of internal MP3 decoder buffers - * - * All memory allocation for the codec is done in this file, so if you don't want - * to use other the default system malloc() and free() for heap management this is - * the only file you'll need to change. + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + buffers.c - allocation and freeing of internal MP3 decoder buffers + + All memory allocation for the codec is done in this file, so if you don't want + to use other the default system malloc() and free() for heap management this is + the only file you'll need to change. **************************************************************************************/ -//#include "hlxclib/stdlib.h" /* for malloc, free */ +//#include "hlxclib/stdlib.h" /* for malloc, free */ #include #include #include "coder.h" /************************************************************************************** - * Function: ClearBuffer - * - * Description: fill buffer with 0's - * - * Inputs: pointer to buffer - * number of bytes to fill with 0 - * - * Outputs: cleared buffer - * - * Return: none - * - * Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) + Function: ClearBuffer + + Description: fill buffer with 0's + + Inputs: pointer to buffer + number of bytes to fill with 0 + + Outputs: cleared buffer + + Return: none + + Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) **************************************************************************************/ #define ClearBuffer(buf, nBytes) memset(buf, 0, nBytes) //fb /* -static void ClearBuffer(void *buf, int nBytes) -{ + static void ClearBuffer(void *buf, int nBytes) + { int i; unsigned char *cbuf = (unsigned char *)buf; @@ -76,102 +76,102 @@ static void ClearBuffer(void *buf, int nBytes) //fb memset(buf, 0, nBytes) - + return; -} + } */ /************************************************************************************** - * Function: AllocateBuffers - * - * Description: allocate all the memory needed for the MP3 decoder - * - * Inputs: none - * - * Outputs: none - * - * Return: pointer to MP3DecInfo structure (initialized with pointers to all - * the internal buffers needed for decoding, all other members of - * MP3DecInfo structure set to 0) - * - * Notes: if one or more mallocs fail, function frees any buffers already - * allocated before returning + Function: AllocateBuffers + + Description: allocate all the memory needed for the MP3 decoder + + Inputs: none + + Outputs: none + + Return: pointer to MP3DecInfo structure (initialized with pointers to all + the internal buffers needed for decoding, all other members of + MP3DecInfo structure set to 0) + + Notes: if one or more mallocs fail, function frees any buffers already + allocated before returning **************************************************************************************/ -MP3DecInfo *AllocateBuffers(void) -{ - MP3DecInfo *mp3DecInfo; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - DequantInfo *di; - IMDCTInfo *mi; - SubbandInfo *sbi; - - mp3DecInfo = (MP3DecInfo *)malloc(sizeof(MP3DecInfo)); - if (!mp3DecInfo) - return 0; - ClearBuffer(mp3DecInfo, sizeof(MP3DecInfo)); - - fh = (FrameHeader *) malloc(sizeof(FrameHeader)); - si = (SideInfo *) malloc(sizeof(SideInfo)); - sfi = (ScaleFactorInfo *) malloc(sizeof(ScaleFactorInfo)); - hi = (HuffmanInfo *) malloc(sizeof(HuffmanInfo)); - di = (DequantInfo *) malloc(sizeof(DequantInfo)); - mi = (IMDCTInfo *) malloc(sizeof(IMDCTInfo)); - sbi = (SubbandInfo *) malloc(sizeof(SubbandInfo)); - - mp3DecInfo->FrameHeaderPS = (void *)fh; - mp3DecInfo->SideInfoPS = (void *)si; - mp3DecInfo->ScaleFactorInfoPS = (void *)sfi; - mp3DecInfo->HuffmanInfoPS = (void *)hi; - mp3DecInfo->DequantInfoPS = (void *)di; - mp3DecInfo->IMDCTInfoPS = (void *)mi; - mp3DecInfo->SubbandInfoPS = (void *)sbi; - - if (!fh || !si || !sfi || !hi || !di || !mi || !sbi) { - FreeBuffers(mp3DecInfo); /* safe to call - only frees memory that was successfully allocated */ - return 0; - } - - /* important to do this - DSP primitives assume a bunch of state variables are 0 on first use */ - ClearBuffer(fh, sizeof(FrameHeader)); - ClearBuffer(si, sizeof(SideInfo)); - ClearBuffer(sfi, sizeof(ScaleFactorInfo)); - ClearBuffer(hi, sizeof(HuffmanInfo)); - ClearBuffer(di, sizeof(DequantInfo)); - ClearBuffer(mi, sizeof(IMDCTInfo)); - ClearBuffer(sbi, sizeof(SubbandInfo)); - - return mp3DecInfo; +MP3DecInfo *AllocateBuffers(void) { + MP3DecInfo *mp3DecInfo; + FrameHeader *fh; + SideInfo *si; + ScaleFactorInfo *sfi; + HuffmanInfo *hi; + DequantInfo *di; + IMDCTInfo *mi; + SubbandInfo *sbi; + + mp3DecInfo = (MP3DecInfo *)malloc(sizeof(MP3DecInfo)); + if (!mp3DecInfo) { + return 0; + } + ClearBuffer(mp3DecInfo, sizeof(MP3DecInfo)); + + fh = (FrameHeader *) malloc(sizeof(FrameHeader)); + si = (SideInfo *) malloc(sizeof(SideInfo)); + sfi = (ScaleFactorInfo *) malloc(sizeof(ScaleFactorInfo)); + hi = (HuffmanInfo *) malloc(sizeof(HuffmanInfo)); + di = (DequantInfo *) malloc(sizeof(DequantInfo)); + mi = (IMDCTInfo *) malloc(sizeof(IMDCTInfo)); + sbi = (SubbandInfo *) malloc(sizeof(SubbandInfo)); + + mp3DecInfo->FrameHeaderPS = (void *)fh; + mp3DecInfo->SideInfoPS = (void *)si; + mp3DecInfo->ScaleFactorInfoPS = (void *)sfi; + mp3DecInfo->HuffmanInfoPS = (void *)hi; + mp3DecInfo->DequantInfoPS = (void *)di; + mp3DecInfo->IMDCTInfoPS = (void *)mi; + mp3DecInfo->SubbandInfoPS = (void *)sbi; + + if (!fh || !si || !sfi || !hi || !di || !mi || !sbi) { + FreeBuffers(mp3DecInfo); /* safe to call - only frees memory that was successfully allocated */ + return 0; + } + + /* important to do this - DSP primitives assume a bunch of state variables are 0 on first use */ + ClearBuffer(fh, sizeof(FrameHeader)); + ClearBuffer(si, sizeof(SideInfo)); + ClearBuffer(sfi, sizeof(ScaleFactorInfo)); + ClearBuffer(hi, sizeof(HuffmanInfo)); + ClearBuffer(di, sizeof(DequantInfo)); + ClearBuffer(mi, sizeof(IMDCTInfo)); + ClearBuffer(sbi, sizeof(SubbandInfo)); + + return mp3DecInfo; } #define SAFE_FREE(x) {if (x) free(x); (x) = 0;} /* helper macro */ /************************************************************************************** - * Function: FreeBuffers - * - * Description: frees all the memory used by the MP3 decoder - * - * Inputs: pointer to initialized MP3DecInfo structure - * - * Outputs: none - * - * Return: none - * - * Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) + Function: FreeBuffers + + Description: frees all the memory used by the MP3 decoder + + Inputs: pointer to initialized MP3DecInfo structure + + Outputs: none + + Return: none + + Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) **************************************************************************************/ -void FreeBuffers(MP3DecInfo *mp3DecInfo) -{ - if (!mp3DecInfo) - return; - - SAFE_FREE(mp3DecInfo->FrameHeaderPS); - SAFE_FREE(mp3DecInfo->SideInfoPS); - SAFE_FREE(mp3DecInfo->ScaleFactorInfoPS); - SAFE_FREE(mp3DecInfo->HuffmanInfoPS); - SAFE_FREE(mp3DecInfo->DequantInfoPS); - SAFE_FREE(mp3DecInfo->IMDCTInfoPS); - SAFE_FREE(mp3DecInfo->SubbandInfoPS); - - SAFE_FREE(mp3DecInfo); +void FreeBuffers(MP3DecInfo *mp3DecInfo) { + if (!mp3DecInfo) { + return; + } + + SAFE_FREE(mp3DecInfo->FrameHeaderPS); + SAFE_FREE(mp3DecInfo->SideInfoPS); + SAFE_FREE(mp3DecInfo->ScaleFactorInfoPS); + SAFE_FREE(mp3DecInfo->HuffmanInfoPS); + SAFE_FREE(mp3DecInfo->DequantInfoPS); + SAFE_FREE(mp3DecInfo->IMDCTInfoPS); + SAFE_FREE(mp3DecInfo->SubbandInfoPS); + + SAFE_FREE(mp3DecInfo); } diff --git a/src/libhelix-mp3/coder.h b/src/libhelix-mp3/coder.h index 5cc3ae43..fb2f031c 100644 --- a/src/libhelix-mp3/coder.h +++ b/src/libhelix-mp3/coder.h @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * coder.h - private, implementation-specific header file + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + coder.h - private, implementation-specific header file **************************************************************************************/ #ifndef _CODER_H @@ -121,17 +121,17 @@ /* map these to the corresponding 2-bit values in the frame header */ typedef enum { - Stereo = 0x00, /* two independent channels, but L and R frames might have different # of bits */ - Joint = 0x01, /* coupled channels - layer III: mix of M-S and intensity, Layers I/II: intensity and direct coding only */ - Dual = 0x02, /* two independent channels, L and R always have exactly 1/2 the total bitrate */ - Mono = 0x03 /* one channel */ + Stereo = 0x00, /* two independent channels, but L and R frames might have different # of bits */ + Joint = 0x01, /* coupled channels - layer III: mix of M-S and intensity, Layers I/II: intensity and direct coding only */ + Dual = 0x02, /* two independent channels, L and R always have exactly 1/2 the total bitrate */ + Mono = 0x03 /* one channel */ } StereoMode; typedef struct _BitStreamInfo { - unsigned char *bytePtr; - unsigned int iCache; - int cachedBits; - int nBytes; + unsigned char *bytePtr; + unsigned int iCache; + int cachedBits; + int nBytes; } BitStreamInfo; typedef struct _FrameHeader { @@ -149,11 +149,11 @@ typedef struct _FrameHeader { int emphasis; /* deemphasis mode */ int CRCWord; /* CRC word (16 bits, 0 if crc not enabled) */ - const SFBandTable *sfBand; + const SFBandTable *sfBand; } FrameHeader; typedef struct _SideInfoSub { - int part23Length; /* number of bits in main data */ + int part23Length; /* number of bits in main data */ int nBigvals; /* 2x this = first set of Huffman cw's (maximum amplitude can be > 1) */ int globalGain; /* overall gain for dequantizer */ int sfCompress; /* unpacked to figure out number of bits in scale factors */ @@ -170,91 +170,91 @@ typedef struct _SideInfoSub { } SideInfoSub; typedef struct _SideInfo { - int mainDataBegin; - int privateBits; - int scfsi[MAX_NCHAN][MAX_SCFBD]; /* 4 scalefactor bands per channel */ - - SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]; + int mainDataBegin; + int privateBits; + int scfsi[MAX_NCHAN][MAX_SCFBD]; /* 4 scalefactor bands per channel */ + + SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]; } SideInfo; typedef struct { int cbType; /* pure long = 0, pure short = 1, mixed = 2 */ int cbEndS[3]; /* number nonzero short cb's, per subbblock */ - int cbEndSMax; /* max of cbEndS[] */ + int cbEndSMax; /* max of cbEndS[] */ int cbEndL; /* number nonzero long cb's */ } CriticalBandInfo; typedef struct _DequantInfo { - int workBuf[MAX_REORDER_SAMPS]; /* workbuf for reordering short blocks */ - CriticalBandInfo cbi[MAX_NCHAN]; /* filled in dequantizer, used in joint stereo reconstruction */ + int workBuf[MAX_REORDER_SAMPS]; /* workbuf for reordering short blocks */ + CriticalBandInfo cbi[MAX_NCHAN]; /* filled in dequantizer, used in joint stereo reconstruction */ } DequantInfo; typedef struct _HuffmanInfo { - int huffDecBuf[MAX_NCHAN][MAX_NSAMP]; /* used both for decoded Huffman values and dequantized coefficients */ - int nonZeroBound[MAX_NCHAN]; /* number of coeffs in huffDecBuf[ch] which can be > 0 */ - int gb[MAX_NCHAN]; /* minimum number of guard bits in huffDecBuf[ch] */ + int huffDecBuf[MAX_NCHAN][MAX_NSAMP]; /* used both for decoded Huffman values and dequantized coefficients */ + int nonZeroBound[MAX_NCHAN]; /* number of coeffs in huffDecBuf[ch] which can be > 0 */ + int gb[MAX_NCHAN]; /* minimum number of guard bits in huffDecBuf[ch] */ } HuffmanInfo; typedef enum _HuffTabType { - noBits, - oneShot, - loopNoLinbits, - loopLinbits, - quadA, - quadB, - invalidTab + noBits, + oneShot, + loopNoLinbits, + loopLinbits, + quadA, + quadB, + invalidTab } HuffTabType; typedef struct _HuffTabLookup { - int linBits; - int /*HuffTabType*/ tabType; + int linBits; + int /*HuffTabType*/ tabType; } HuffTabLookup; typedef struct _IMDCTInfo { - int outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS]; /* output of IMDCT */ - int overBuf[MAX_NCHAN][MAX_NSAMP / 2]; /* overlap-add buffer (by symmetry, only need 1/2 size) */ - int numPrevIMDCT[MAX_NCHAN]; /* how many IMDCT's calculated in this channel on prev. granule */ - int prevType[MAX_NCHAN]; - int prevWinSwitch[MAX_NCHAN]; - int gb[MAX_NCHAN]; + int outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS]; /* output of IMDCT */ + int overBuf[MAX_NCHAN][MAX_NSAMP / 2]; /* overlap-add buffer (by symmetry, only need 1/2 size) */ + int numPrevIMDCT[MAX_NCHAN]; /* how many IMDCT's calculated in this channel on prev. granule */ + int prevType[MAX_NCHAN]; + int prevWinSwitch[MAX_NCHAN]; + int gb[MAX_NCHAN]; } IMDCTInfo; typedef struct _BlockCount { - int nBlocksLong; - int nBlocksTotal; - int nBlocksPrev; - int prevType; - int prevWinSwitch; - int currWinSwitch; - int gbIn; - int gbOut; + int nBlocksLong; + int nBlocksTotal; + int nBlocksPrev; + int prevType; + int prevWinSwitch; + int currWinSwitch; + int gbIn; + int gbOut; } BlockCount; /* max bits in scalefactors = 5, so use char's to save space */ typedef struct _ScaleFactorInfoSub { - char l[23]; /* [band] */ - char s[13][3]; /* [band][window] */ -} ScaleFactorInfoSub; + char l[23]; /* [band] */ + char s[13][3]; /* [band][window] */ +} ScaleFactorInfoSub; /* used in MPEG 2, 2.5 intensity (joint) stereo only */ typedef struct _ScaleFactorJS { - int intensityScale; - int slen[4]; - int nr[4]; + int intensityScale; + int slen[4]; + int nr[4]; } ScaleFactorJS; typedef struct _ScaleFactorInfo { - ScaleFactorInfoSub sfis[MAX_NGRAN][MAX_NCHAN]; - ScaleFactorJS sfjs; + ScaleFactorInfoSub sfis[MAX_NGRAN][MAX_NCHAN]; + ScaleFactorJS sfjs; } ScaleFactorInfo; -/* NOTE - could get by with smaller vbuf if memory is more important than speed - * (in Subband, instead of replicating each block in FDCT32 you would do a memmove on the - * last 15 blocks to shift them down one, a hardware style FIFO) - */ +/* NOTE - could get by with smaller vbuf if memory is more important than speed + (in Subband, instead of replicating each block in FDCT32 you would do a memmove on the + last 15 blocks to shift them down one, a hardware style FIFO) +*/ typedef struct _SubbandInfo { - int vbuf[MAX_NCHAN * VBUF_LENGTH]; /* vbuf for fast DCT-based synthesis PQMF - double size for speed (no modulo indexing) */ - int vindex; /* internal index for tracking position in vbuf */ + int vbuf[MAX_NCHAN * VBUF_LENGTH]; /* vbuf for fast DCT-based synthesis PQMF - double size for speed (no modulo indexing) */ + int vindex; /* internal index for tracking position in vbuf */ } SubbandInfo; /* bitstream.c */ @@ -263,13 +263,13 @@ unsigned int GetBits(BitStreamInfo *bsi, int nBits); int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset); /* dequant.c, dqchan.c, stproc.c */ -int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, - ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi); +int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, + ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi); void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]); -void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]); -void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]); +void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, + CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]); +void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, + CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]); /* dct32.c */ // about 1 ms faster in RAM, but very large @@ -279,15 +279,15 @@ void FDCT32(int *x, int *d, int offset, int oddBlock, int gb);// __attribute__ ( extern const HuffTabLookup huffTabLookup[HUFF_PAIRTABS]; extern const int huffTabOffset[HUFF_PAIRTABS]; extern const unsigned short huffTable[]; -extern const unsigned char quadTable[64+16]; +extern const unsigned char quadTable[64 + 16]; extern const int quadTabOffset[2]; extern const int quadTabMaxBits[2]; -/* polyphase.c (or asmpoly.s) - * some platforms require a C++ compile of all source files, - * so if we're compiling C as C++ and using native assembly - * for these functions we need to prevent C++ name mangling. - */ +/* polyphase.c (or asmpoly.s) + some platforms require a C++ compile of all source files, + so if we're compiling C as C++ and using native assembly + for these functions we need to prevent C++ name mangling. +*/ #ifdef __cplusplus extern "C" { #endif diff --git a/src/libhelix-mp3/dct32.c b/src/libhelix-mp3/dct32.c index 978ffb43..d872dc34 100644 --- a/src/libhelix-mp3/dct32.c +++ b/src/libhelix-mp3/dct32.c @@ -1,45 +1,45 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * dct32.c - optimized implementations of 32-point DCT for matrixing stage of - * polyphase filter + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + dct32.c - optimized implementations of 32-point DCT for matrixing stage of + polyphase filter **************************************************************************************/ #include "coder.h" @@ -84,24 +84,24 @@ // faster in ROM static const int dcttab[48] PROGMEM = { - /* first pass */ - COS0_0, COS0_15, COS1_0, /* 31, 27, 31 */ - COS0_1, COS0_14, COS1_1, /* 31, 29, 31 */ - COS0_2, COS0_13, COS1_2, /* 31, 29, 31 */ - COS0_3, COS0_12, COS1_3, /* 31, 30, 31 */ - COS0_4, COS0_11, COS1_4, /* 31, 30, 31 */ - COS0_5, COS0_10, COS1_5, /* 31, 31, 30 */ - COS0_6, COS0_9, COS1_6, /* 31, 31, 30 */ - COS0_7, COS0_8, COS1_7, /* 31, 31, 28 */ - /* second pass */ - COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ - COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ - -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ - -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ - COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ - COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ - -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ - -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ + /* first pass */ + COS0_0, COS0_15, COS1_0, /* 31, 27, 31 */ + COS0_1, COS0_14, COS1_1, /* 31, 29, 31 */ + COS0_2, COS0_13, COS1_2, /* 31, 29, 31 */ + COS0_3, COS0_12, COS1_3, /* 31, 30, 31 */ + COS0_4, COS0_11, COS1_4, /* 31, 30, 31 */ + COS0_5, COS0_10, COS1_5, /* 31, 31, 30 */ + COS0_6, COS0_9, COS1_6, /* 31, 31, 30 */ + COS0_7, COS0_8, COS1_7, /* 31, 31, 28 */ + /* second pass */ + COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ + COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ + -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ + -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ + COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ + COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ + -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ + -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ }; #define D32FP(i, s0, s1, s2) { \ @@ -114,168 +114,168 @@ static const int dcttab[48] PROGMEM = { } /************************************************************************************** - * Function: FDCT32 - * - * Description: Ken's highly-optimized 32-point DCT (radix-4 + radix-8) - * - * Inputs: input buffer, length = 32 samples - * require at least 6 guard bits in input vector x to avoid possibility - * of overflow in internal calculations (see bbtest_imdct test app) - * buffer offset and oddblock flag for polyphase filter input buffer - * number of guard bits in input - * - * Outputs: output buffer, data copied and interleaved for polyphase filter - * no guarantees about number of guard bits in output - * - * Return: none - * - * Notes: number of muls = 4*8 + 12*4 = 80 - * final stage of DCT is hardcoded to shuffle data into the proper order - * for the polyphase filterbank - * fully unrolled stage 1, for max precision (scale the 1/cos() factors - * differently, depending on magnitude) - * guard bit analysis verified by exhaustive testing of all 2^32 - * combinations of max pos/max neg values in x[] - * - * TODO: code organization and optimization for ARM - * possibly interleave stereo (cut # of coef loads in half - may not have - * enough registers) + Function: FDCT32 + + Description: Ken's highly-optimized 32-point DCT (radix-4 + radix-8) + + Inputs: input buffer, length = 32 samples + require at least 6 guard bits in input vector x to avoid possibility + of overflow in internal calculations (see bbtest_imdct test app) + buffer offset and oddblock flag for polyphase filter input buffer + number of guard bits in input + + Outputs: output buffer, data copied and interleaved for polyphase filter + no guarantees about number of guard bits in output + + Return: none + + Notes: number of muls = 4*8 + 12*4 = 80 + final stage of DCT is hardcoded to shuffle data into the proper order + for the polyphase filterbank + fully unrolled stage 1, for max precision (scale the 1/cos() factors + differently, depending on magnitude) + guard bit analysis verified by exhaustive testing of all 2^32 + combinations of max pos/max neg values in x[] + + TODO: code organization and optimization for ARM + possibly interleave stereo (cut # of coef loads in half - may not have + enough registers) **************************************************************************************/ // about 1ms faster in RAM -/* attribute__ ((section (".data"))) */ void FDCT32(int *buf, int *dest, int offset, int oddBlock, int gb) -{ +/* attribute__ ((section (".data"))) */ void FDCT32(int *buf, int *dest, int offset, int oddBlock, int gb) { int i, s, tmp, es; const int *cptr = dcttab; int a0, a1, a2, a3, a4, a5, a6, a7; int b0, b1, b2, b3, b4, b5, b6, b7; - int *d; - - /* scaling - ensure at least 6 guard bits for DCT - * (in practice this is already true 99% of time, so this code is - * almost never triggered) - */ - es = 0; - if (gb < 6) { - es = 6 - gb; - for (i = 0; i < 32; i++) - buf[i] >>= es; - } - - /* first pass */ - D32FP(0, 1, 5, 1); - D32FP(1, 1, 3, 1); - D32FP(2, 1, 3, 1); - D32FP(3, 1, 2, 1); - D32FP(4, 1, 2, 1); - D32FP(5, 1, 1, 2); - D32FP(6, 1, 1, 2); - D32FP(7, 1, 1, 4); - - /* second pass */ - for (i = 4; i > 0; i--) { - a0 = buf[0]; a7 = buf[7]; a3 = buf[3]; a4 = buf[4]; - b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1; - b3 = a3 + a4; b4 = MULSHIFT32(*cptr++, a3 - a4) << 3; - a0 = b0 + b3; a3 = MULSHIFT32(*cptr, b0 - b3) << 1; - a4 = b4 + b7; a7 = MULSHIFT32(*cptr++, b7 - b4) << 1; - - a1 = buf[1]; a6 = buf[6]; a2 = buf[2]; a5 = buf[5]; - b1 = a1 + a6; b6 = MULSHIFT32(*cptr++, a1 - a6) << 1; - b2 = a2 + a5; b5 = MULSHIFT32(*cptr++, a2 - a5) << 1; - a1 = b1 + b2; a2 = MULSHIFT32(*cptr, b1 - b2) << 2; - a5 = b5 + b6; a6 = MULSHIFT32(*cptr++, b6 - b5) << 2; - - b0 = a0 + a1; b1 = MULSHIFT32(COS4_0, a0 - a1) << 1; - b2 = a2 + a3; b3 = MULSHIFT32(COS4_0, a3 - a2) << 1; - buf[0] = b0; buf[1] = b1; - buf[2] = b2 + b3; buf[3] = b3; - - b4 = a4 + a5; b5 = MULSHIFT32(COS4_0, a4 - a5) << 1; - b6 = a6 + a7; b7 = MULSHIFT32(COS4_0, a7 - a6) << 1; - b6 += b7; - buf[4] = b4 + b6; buf[5] = b5 + b7; - buf[6] = b5 + b6; buf[7] = b7; - - buf += 8; - } - buf -= 32; /* reset */ - - /* sample 0 - always delayed one block */ - d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - s = buf[ 0]; d[0] = d[8] = s; - - /* samples 16 to 31 */ - d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); - - s = buf[ 1]; d[0] = d[8] = s; d += 64; - - tmp = buf[25] + buf[29]; - s = buf[17] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 9] + buf[13]; d[0] = d[8] = s; d += 64; - s = buf[21] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[29] + buf[27]; - s = buf[ 5]; d[0] = d[8] = s; d += 64; - s = buf[21] + tmp; d[0] = d[8] = s; d += 64; - s = buf[13] + buf[11]; d[0] = d[8] = s; d += 64; - s = buf[19] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[27] + buf[31]; - s = buf[ 3]; d[0] = d[8] = s; d += 64; - s = buf[19] + tmp; d[0] = d[8] = s; d += 64; - s = buf[11] + buf[15]; d[0] = d[8] = s; d += 64; - s = buf[23] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[31]; - s = buf[ 7]; d[0] = d[8] = s; d += 64; - s = buf[23] + tmp; d[0] = d[8] = s; d += 64; - s = buf[15]; d[0] = d[8] = s; d += 64; - s = tmp; d[0] = d[8] = s; - - /* samples 16 to 1 (sample 16 used again) */ - d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - - s = buf[ 1]; d[0] = d[8] = s; d += 64; - - tmp = buf[30] + buf[25]; - s = buf[17] + tmp; d[0] = d[8] = s; d += 64; - s = buf[14] + buf[ 9]; d[0] = d[8] = s; d += 64; - s = buf[22] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 6]; d[0] = d[8] = s; d += 64; - - tmp = buf[26] + buf[30]; - s = buf[22] + tmp; d[0] = d[8] = s; d += 64; - s = buf[10] + buf[14]; d[0] = d[8] = s; d += 64; - s = buf[18] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 2]; d[0] = d[8] = s; d += 64; - - tmp = buf[28] + buf[26]; - s = buf[18] + tmp; d[0] = d[8] = s; d += 64; - s = buf[12] + buf[10]; d[0] = d[8] = s; d += 64; - s = buf[20] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 4]; d[0] = d[8] = s; d += 64; - - tmp = buf[24] + buf[28]; - s = buf[20] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 8] + buf[12]; d[0] = d[8] = s; d += 64; - s = buf[16] + tmp; d[0] = d[8] = s; - - /* this is so rarely invoked that it's not worth making two versions of the output - * shuffle code (one for no shift, one for clip + variable shift) like in IMDCT - * here we just load, clip, shift, and store on the rare instances that es != 0 - */ - if (es) { - d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); - - d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); - for (i = 16; i <= 31; i++) { - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; - } - - d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - for (i = 15; i >= 0; i--) { - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; - } - } + int *d; + + /* scaling - ensure at least 6 guard bits for DCT + (in practice this is already true 99% of time, so this code is + almost never triggered) + */ + es = 0; + if (gb < 6) { + es = 6 - gb; + for (i = 0; i < 32; i++) { + buf[i] >>= es; + } + } + + /* first pass */ + D32FP(0, 1, 5, 1); + D32FP(1, 1, 3, 1); + D32FP(2, 1, 3, 1); + D32FP(3, 1, 2, 1); + D32FP(4, 1, 2, 1); + D32FP(5, 1, 1, 2); + D32FP(6, 1, 1, 2); + D32FP(7, 1, 1, 4); + + /* second pass */ + for (i = 4; i > 0; i--) { + a0 = buf[0]; a7 = buf[7]; a3 = buf[3]; a4 = buf[4]; + b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1; + b3 = a3 + a4; b4 = MULSHIFT32(*cptr++, a3 - a4) << 3; + a0 = b0 + b3; a3 = MULSHIFT32(*cptr, b0 - b3) << 1; + a4 = b4 + b7; a7 = MULSHIFT32(*cptr++, b7 - b4) << 1; + + a1 = buf[1]; a6 = buf[6]; a2 = buf[2]; a5 = buf[5]; + b1 = a1 + a6; b6 = MULSHIFT32(*cptr++, a1 - a6) << 1; + b2 = a2 + a5; b5 = MULSHIFT32(*cptr++, a2 - a5) << 1; + a1 = b1 + b2; a2 = MULSHIFT32(*cptr, b1 - b2) << 2; + a5 = b5 + b6; a6 = MULSHIFT32(*cptr++, b6 - b5) << 2; + + b0 = a0 + a1; b1 = MULSHIFT32(COS4_0, a0 - a1) << 1; + b2 = a2 + a3; b3 = MULSHIFT32(COS4_0, a3 - a2) << 1; + buf[0] = b0; buf[1] = b1; + buf[2] = b2 + b3; buf[3] = b3; + + b4 = a4 + a5; b5 = MULSHIFT32(COS4_0, a4 - a5) << 1; + b6 = a6 + a7; b7 = MULSHIFT32(COS4_0, a7 - a6) << 1; + b6 += b7; + buf[4] = b4 + b6; buf[5] = b5 + b7; + buf[6] = b5 + b6; buf[7] = b7; + + buf += 8; + } + buf -= 32; /* reset */ + + /* sample 0 - always delayed one block */ + d = dest + 64 * 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); + s = buf[ 0]; d[0] = d[8] = s; + + /* samples 16 to 31 */ + d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); + + s = buf[ 1]; d[0] = d[8] = s; d += 64; + + tmp = buf[25] + buf[29]; + s = buf[17] + tmp; d[0] = d[8] = s; d += 64; + s = buf[ 9] + buf[13]; d[0] = d[8] = s; d += 64; + s = buf[21] + tmp; d[0] = d[8] = s; d += 64; + + tmp = buf[29] + buf[27]; + s = buf[ 5]; d[0] = d[8] = s; d += 64; + s = buf[21] + tmp; d[0] = d[8] = s; d += 64; + s = buf[13] + buf[11]; d[0] = d[8] = s; d += 64; + s = buf[19] + tmp; d[0] = d[8] = s; d += 64; + + tmp = buf[27] + buf[31]; + s = buf[ 3]; d[0] = d[8] = s; d += 64; + s = buf[19] + tmp; d[0] = d[8] = s; d += 64; + s = buf[11] + buf[15]; d[0] = d[8] = s; d += 64; + s = buf[23] + tmp; d[0] = d[8] = s; d += 64; + + tmp = buf[31]; + s = buf[ 7]; d[0] = d[8] = s; d += 64; + s = buf[23] + tmp; d[0] = d[8] = s; d += 64; + s = buf[15]; d[0] = d[8] = s; d += 64; + s = tmp; d[0] = d[8] = s; + + /* samples 16 to 1 (sample 16 used again) */ + d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); + + s = buf[ 1]; d[0] = d[8] = s; d += 64; + + tmp = buf[30] + buf[25]; + s = buf[17] + tmp; d[0] = d[8] = s; d += 64; + s = buf[14] + buf[ 9]; d[0] = d[8] = s; d += 64; + s = buf[22] + tmp; d[0] = d[8] = s; d += 64; + s = buf[ 6]; d[0] = d[8] = s; d += 64; + + tmp = buf[26] + buf[30]; + s = buf[22] + tmp; d[0] = d[8] = s; d += 64; + s = buf[10] + buf[14]; d[0] = d[8] = s; d += 64; + s = buf[18] + tmp; d[0] = d[8] = s; d += 64; + s = buf[ 2]; d[0] = d[8] = s; d += 64; + + tmp = buf[28] + buf[26]; + s = buf[18] + tmp; d[0] = d[8] = s; d += 64; + s = buf[12] + buf[10]; d[0] = d[8] = s; d += 64; + s = buf[20] + tmp; d[0] = d[8] = s; d += 64; + s = buf[ 4]; d[0] = d[8] = s; d += 64; + + tmp = buf[24] + buf[28]; + s = buf[20] + tmp; d[0] = d[8] = s; d += 64; + s = buf[ 8] + buf[12]; d[0] = d[8] = s; d += 64; + s = buf[16] + tmp; d[0] = d[8] = s; + + /* this is so rarely invoked that it's not worth making two versions of the output + shuffle code (one for no shift, one for clip + variable shift) like in IMDCT + here we just load, clip, shift, and store on the rare instances that es != 0 + */ + if (es) { + d = dest + 64 * 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); + s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); + + d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); + for (i = 16; i <= 31; i++) { + s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; + } + + d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); + for (i = 15; i >= 0; i--) { + s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; + } + } } diff --git a/src/libhelix-mp3/dequant.c b/src/libhelix-mp3/dequant.c index b989b7de..e10c5e14 100644 --- a/src/libhelix-mp3/dequant.c +++ b/src/libhelix-mp3/dequant.c @@ -1,158 +1,167 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * dequant.c - dequantization, stereo processing (intensity, mid-side), short-block - * coefficient reordering + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + dequant.c - dequantization, stereo processing (intensity, mid-side), short-block + coefficient reordering **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: Dequantize - * - * Description: dequantize coefficients, decode stereo, reorder short blocks - * (one granule-worth) - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * UnpackScaleFactors(), and DecodeHuffman() (for this granule) - * index of current granule - * - * Outputs: dequantized and reordered coefficients in hi->huffDecBuf - * (one granule-worth, all channels), format = Q26 - * operates in-place on huffDecBuf but also needs di->workBuf - * updated hi->nonZeroBound index for both channels - * - * Return: 0 on success, -1 if null input pointers - * - * Notes: In calling output Q(DQ_FRACBITS_OUT), we assume an implicit bias - * of 2^15. Some (floating-point) reference implementations factor this - * into the 2^(0.25 * gain) scaling explicitly. But to avoid precision - * loss, we don't do that. Instead take it into account in the final - * round to PCM (>> by 15 less than we otherwise would have). - * Equivalently, we can think of the dequantized coefficients as - * Q(DQ_FRACBITS_OUT - 15) with no implicit bias. + Function: Dequantize + + Description: dequantize coefficients, decode stereo, reorder short blocks + (one granule-worth) + + Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), + UnpackScaleFactors(), and DecodeHuffman() (for this granule) + index of current granule + + Outputs: dequantized and reordered coefficients in hi->huffDecBuf + (one granule-worth, all channels), format = Q26 + operates in-place on huffDecBuf but also needs di->workBuf + updated hi->nonZeroBound index for both channels + + Return: 0 on success, -1 if null input pointers + + Notes: In calling output Q(DQ_FRACBITS_OUT), we assume an implicit bias + of 2^15. Some (floating-point) reference implementations factor this + into the 2^(0.25 * gain) scaling explicitly. But to avoid precision + loss, we don't do that. Instead take it into account in the final + round to PCM (>> by 15 less than we otherwise would have). + Equivalently, we can think of the dequantized coefficients as + Q(DQ_FRACBITS_OUT - 15) with no implicit bias. **************************************************************************************/ -int Dequantize(MP3DecInfo *mp3DecInfo, int gr) -{ - int i, ch, nSamps, mOut[2]; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - DequantInfo *di; - CriticalBandInfo *cbi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || - !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->DequantInfoPS) - return -1; - - fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); - - /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ - si = (SideInfo *)(mp3DecInfo->SideInfoPS); - sfi = (ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS); - hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; - di = (DequantInfo *)mp3DecInfo->DequantInfoPS; - cbi = di->cbi; - mOut[0] = mOut[1] = 0; - - /* dequantize all the samples in each channel */ - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - hi->gb[ch] = DequantChannel(hi->huffDecBuf[ch], di->workBuf, &hi->nonZeroBound[ch], fh, - &si->sis[gr][ch], &sfi->sfis[gr][ch], &cbi[ch]); - } - - /* joint stereo processing assumes one guard bit in input samples - * it's extremely rare not to have at least one gb, so if this is the case - * just make a pass over the data and clip to [-2^30+1, 2^30-1] - * in practice this may never happen - */ - if (fh->modeExt && (hi->gb[0] < 1 || hi->gb[1] < 1)) { - for (i = 0; i < hi->nonZeroBound[0]; i++) { - if (hi->huffDecBuf[0][i] < -0x3fffffff) hi->huffDecBuf[0][i] = -0x3fffffff; - if (hi->huffDecBuf[0][i] > 0x3fffffff) hi->huffDecBuf[0][i] = 0x3fffffff; - } - for (i = 0; i < hi->nonZeroBound[1]; i++) { - if (hi->huffDecBuf[1][i] < -0x3fffffff) hi->huffDecBuf[1][i] = -0x3fffffff; - if (hi->huffDecBuf[1][i] > 0x3fffffff) hi->huffDecBuf[1][i] = 0x3fffffff; - } - } - - /* do mid-side stereo processing, if enabled */ - if (fh->modeExt >> 1) { - if (fh->modeExt & 0x01) { - /* intensity stereo enabled - run mid-side up to start of right zero region */ - if (cbi[1].cbType == 0) - nSamps = fh->sfBand->l[cbi[1].cbEndL + 1]; - else - nSamps = 3 * fh->sfBand->s[cbi[1].cbEndSMax + 1]; - } else { - /* intensity stereo disabled - run mid-side on whole spectrum */ - nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); - } - MidSideProc(hi->huffDecBuf, nSamps, mOut); - } - - /* do intensity stereo processing, if enabled */ - if (fh->modeExt & 0x01) { - nSamps = hi->nonZeroBound[0]; - if (fh->ver == MPEG1) { - IntensityProcMPEG1(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, - fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); - } else { - IntensityProcMPEG2(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, &sfi->sfjs, - fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); - } - } - - /* adjust guard bit count and nonZeroBound if we did any stereo processing */ - if (fh->modeExt) { - hi->gb[0] = CLZ(mOut[0]) - 1; - hi->gb[1] = CLZ(mOut[1]) - 1; - nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); - hi->nonZeroBound[0] = nSamps; - hi->nonZeroBound[1] = nSamps; - } - - /* output format Q(DQ_FRACBITS_OUT) */ - return 0; +int Dequantize(MP3DecInfo *mp3DecInfo, int gr) { + int i, ch, nSamps, mOut[2]; + FrameHeader *fh; + SideInfo *si; + ScaleFactorInfo *sfi; + HuffmanInfo *hi; + DequantInfo *di; + CriticalBandInfo *cbi; + + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || + !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->DequantInfoPS) { + return -1; + } + + fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); + + /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ + si = (SideInfo *)(mp3DecInfo->SideInfoPS); + sfi = (ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS); + hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; + di = (DequantInfo *)mp3DecInfo->DequantInfoPS; + cbi = di->cbi; + mOut[0] = mOut[1] = 0; + + /* dequantize all the samples in each channel */ + for (ch = 0; ch < mp3DecInfo->nChans; ch++) { + hi->gb[ch] = DequantChannel(hi->huffDecBuf[ch], di->workBuf, &hi->nonZeroBound[ch], fh, + &si->sis[gr][ch], &sfi->sfis[gr][ch], &cbi[ch]); + } + + /* joint stereo processing assumes one guard bit in input samples + it's extremely rare not to have at least one gb, so if this is the case + just make a pass over the data and clip to [-2^30+1, 2^30-1] + in practice this may never happen + */ + if (fh->modeExt && (hi->gb[0] < 1 || hi->gb[1] < 1)) { + for (i = 0; i < hi->nonZeroBound[0]; i++) { + if (hi->huffDecBuf[0][i] < -0x3fffffff) { + hi->huffDecBuf[0][i] = -0x3fffffff; + } + if (hi->huffDecBuf[0][i] > 0x3fffffff) { + hi->huffDecBuf[0][i] = 0x3fffffff; + } + } + for (i = 0; i < hi->nonZeroBound[1]; i++) { + if (hi->huffDecBuf[1][i] < -0x3fffffff) { + hi->huffDecBuf[1][i] = -0x3fffffff; + } + if (hi->huffDecBuf[1][i] > 0x3fffffff) { + hi->huffDecBuf[1][i] = 0x3fffffff; + } + } + } + + /* do mid-side stereo processing, if enabled */ + if (fh->modeExt >> 1) { + if (fh->modeExt & 0x01) { + /* intensity stereo enabled - run mid-side up to start of right zero region */ + if (cbi[1].cbType == 0) { + nSamps = fh->sfBand->l[cbi[1].cbEndL + 1]; + } else { + nSamps = 3 * fh->sfBand->s[cbi[1].cbEndSMax + 1]; + } + } else { + /* intensity stereo disabled - run mid-side on whole spectrum */ + nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); + } + MidSideProc(hi->huffDecBuf, nSamps, mOut); + } + + /* do intensity stereo processing, if enabled */ + if (fh->modeExt & 0x01) { + nSamps = hi->nonZeroBound[0]; + if (fh->ver == MPEG1) { + IntensityProcMPEG1(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, + fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); + } else { + IntensityProcMPEG2(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, &sfi->sfjs, + fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); + } + } + + /* adjust guard bit count and nonZeroBound if we did any stereo processing */ + if (fh->modeExt) { + hi->gb[0] = CLZ(mOut[0]) - 1; + hi->gb[1] = CLZ(mOut[1]) - 1; + nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); + hi->nonZeroBound[0] = nSamps; + hi->nonZeroBound[1] = nSamps; + } + + /* output format Q(DQ_FRACBITS_OUT) */ + return 0; } diff --git a/src/libhelix-mp3/dqchan.c b/src/libhelix-mp3/dqchan.c index 8e4cb76d..9335493f 100644 --- a/src/libhelix-mp3/dqchan.c +++ b/src/libhelix-mp3/dqchan.c @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * August 2003 - * - * dqchan.c - dequantization of transform coefficients + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + August 2003 + + dqchan.c - dequantization of transform coefficients **************************************************************************************/ #include "coder.h" @@ -48,63 +48,71 @@ typedef int ARRAY3[3]; /* for short-block reordering */ /* optional pre-emphasis for high-frequency scale factor bands */ -static const char preTab[22] = { 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0 }; +static const char preTab[22] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }; /* pow(2,-i/4) for i=0..3, Q31 format */ -const int pow14[4] PROGMEM = { - 0x7fffffff, 0x6ba27e65, 0x5a82799a, 0x4c1bf829 +const int pow14[4] PROGMEM = { + 0x7fffffff, 0x6ba27e65, 0x5a82799a, 0x4c1bf829 }; /* pow(2,-i/4) * pow(j,4/3) for i=0..3 j=0..15, Q25 format */ const int pow43_14[4][16] PROGMEM = { -{ 0x00000000, 0x10000000, 0x285145f3, 0x453a5cdb, /* Q28 */ - 0x0cb2ff53, 0x111989d6, 0x15ce31c8, 0x1ac7f203, - 0x20000000, 0x257106b9, 0x2b16b4a3, 0x30ed74b4, - 0x36f23fa5, 0x3d227bd3, 0x437be656, 0x49fc823c, }, - -{ 0x00000000, 0x0d744fcd, 0x21e71f26, 0x3a36abd9, - 0x0aadc084, 0x0e610e6e, 0x12560c1d, 0x168523cf, - 0x1ae89f99, 0x1f7c03a4, 0x243bae49, 0x29249c67, - 0x2e34420f, 0x33686f85, 0x38bf3dff, 0x3e370182, }, - -{ 0x00000000, 0x0b504f33, 0x1c823e07, 0x30f39a55, - 0x08facd62, 0x0c176319, 0x0f6b3522, 0x12efe2ad, - 0x16a09e66, 0x1a79a317, 0x1e77e301, 0x2298d5b4, - 0x26da56fc, 0x2b3a902a, 0x2fb7e7e7, 0x3450f650, }, - -{ 0x00000000, 0x09837f05, 0x17f910d7, 0x2929c7a9, - 0x078d0dfa, 0x0a2ae661, 0x0cf73154, 0x0fec91cb, - 0x1306fe0a, 0x16434a6c, 0x199ee595, 0x1d17ae3d, - 0x20abd76a, 0x2459d551, 0x28204fbb, 0x2bfe1808, }, + { + 0x00000000, 0x10000000, 0x285145f3, 0x453a5cdb, /* Q28 */ + 0x0cb2ff53, 0x111989d6, 0x15ce31c8, 0x1ac7f203, + 0x20000000, 0x257106b9, 0x2b16b4a3, 0x30ed74b4, + 0x36f23fa5, 0x3d227bd3, 0x437be656, 0x49fc823c, + }, + + { + 0x00000000, 0x0d744fcd, 0x21e71f26, 0x3a36abd9, + 0x0aadc084, 0x0e610e6e, 0x12560c1d, 0x168523cf, + 0x1ae89f99, 0x1f7c03a4, 0x243bae49, 0x29249c67, + 0x2e34420f, 0x33686f85, 0x38bf3dff, 0x3e370182, + }, + + { + 0x00000000, 0x0b504f33, 0x1c823e07, 0x30f39a55, + 0x08facd62, 0x0c176319, 0x0f6b3522, 0x12efe2ad, + 0x16a09e66, 0x1a79a317, 0x1e77e301, 0x2298d5b4, + 0x26da56fc, 0x2b3a902a, 0x2fb7e7e7, 0x3450f650, + }, + + { + 0x00000000, 0x09837f05, 0x17f910d7, 0x2929c7a9, + 0x078d0dfa, 0x0a2ae661, 0x0cf73154, 0x0fec91cb, + 0x1306fe0a, 0x16434a6c, 0x199ee595, 0x1d17ae3d, + 0x20abd76a, 0x2459d551, 0x28204fbb, 0x2bfe1808, + }, }; /* pow(j,4/3) for j=16..63, Q23 format */ const int pow43[] PROGMEM = { - 0x1428a2fa, 0x15db1bd6, 0x1796302c, 0x19598d85, - 0x1b24e8bb, 0x1cf7fcfa, 0x1ed28af2, 0x20b4582a, - 0x229d2e6e, 0x248cdb55, 0x26832fda, 0x28800000, - 0x2a832287, 0x2c8c70a8, 0x2e9bc5d8, 0x30b0ff99, - 0x32cbfd4a, 0x34eca001, 0x3712ca62, 0x393e6088, - 0x3b6f47e0, 0x3da56717, 0x3fe0a5fc, 0x4220ed72, - 0x44662758, 0x46b03e7c, 0x48ff1e87, 0x4b52b3f3, - 0x4daaebfd, 0x5007b497, 0x5268fc62, 0x54ceb29c, - 0x5738c721, 0x59a72a59, 0x5c19cd35, 0x5e90a129, - 0x610b9821, 0x638aa47f, 0x660db90f, 0x6894c90b, - 0x6b1fc80c, 0x6daeaa0d, 0x70416360, 0x72d7e8b0, - 0x75722ef9, 0x78102b85, 0x7ab1d3ec, 0x7d571e09, + 0x1428a2fa, 0x15db1bd6, 0x1796302c, 0x19598d85, + 0x1b24e8bb, 0x1cf7fcfa, 0x1ed28af2, 0x20b4582a, + 0x229d2e6e, 0x248cdb55, 0x26832fda, 0x28800000, + 0x2a832287, 0x2c8c70a8, 0x2e9bc5d8, 0x30b0ff99, + 0x32cbfd4a, 0x34eca001, 0x3712ca62, 0x393e6088, + 0x3b6f47e0, 0x3da56717, 0x3fe0a5fc, 0x4220ed72, + 0x44662758, 0x46b03e7c, 0x48ff1e87, 0x4b52b3f3, + 0x4daaebfd, 0x5007b497, 0x5268fc62, 0x54ceb29c, + 0x5738c721, 0x59a72a59, 0x5c19cd35, 0x5e90a129, + 0x610b9821, 0x638aa47f, 0x660db90f, 0x6894c90b, + 0x6b1fc80c, 0x6daeaa0d, 0x70416360, 0x72d7e8b0, + 0x75722ef9, 0x78102b85, 0x7ab1d3ec, 0x7d571e09, }; /* sqrt(0.5) in Q31 format */ #define SQRTHALF 0x5a82799a /* - * Minimax polynomial approximation to pow(x, 4/3), over the range - * poly43lo: x = [0.5, 0.7071] - * poly43hi: x = [0.7071, 1.0] - * - * Relative error < 1E-7 - * Coefs are scaled by 4, 2, 1, 0.5, 0.25 - */ + Minimax polynomial approximation to pow(x, 4/3), over the range + poly43lo: x = [0.5, 0.7071] + poly43hi: x = [0.7071, 1.0] + + Relative error < 1E-7 + Coefs are scaled by 4, 2, 1, 0.5, 0.25 +*/ static const unsigned int poly43lo[5] PROGMEM = { 0x29a0bda9, 0xb02e4828, 0x5957aa1b, 0x236c498d, 0xff581859 }; static const unsigned int poly43hi[5] PROGMEM = { 0x10852163, 0xd333f6a4, 0x46e9408b, 0x27c2cef0, 0xfef577b4 }; @@ -112,266 +120,274 @@ static const unsigned int poly43hi[5] PROGMEM = { 0x10852163, 0xd333f6a4, 0x46e9 const int pow2exp[8] PROGMEM = { 14, 13, 11, 10, 9, 7, 6, 5 }; const int pow2frac[8] PROGMEM = { - 0x6597fa94, 0x50a28be6, 0x7fffffff, 0x6597fa94, - 0x50a28be6, 0x7fffffff, 0x6597fa94, 0x50a28be6 + 0x6597fa94, 0x50a28be6, 0x7fffffff, 0x6597fa94, + 0x50a28be6, 0x7fffffff, 0x6597fa94, 0x50a28be6 }; /************************************************************************************** - * Function: DequantBlock - * - * Description: Ken's highly-optimized, low memory dequantizer performing the operation - * y = pow(x, 4.0/3.0) * pow(2, 25 - scale/4.0) - * - * Inputs: input buffer of decode Huffman codewords (signed-magnitude) - * output buffer of same length (in-place (outbuf = inbuf) is allowed) - * number of samples - * - * Outputs: dequantized samples in Q25 format - * - * Return: bitwise-OR of the unsigned outputs (for guard bit calculations) + Function: DequantBlock + + Description: Ken's highly-optimized, low memory dequantizer performing the operation + y = pow(x, 4.0/3.0) * pow(2, 25 - scale/4.0) + + Inputs: input buffer of decode Huffman codewords (signed-magnitude) + output buffer of same length (in-place (outbuf = inbuf) is allowed) + number of samples + + Outputs: dequantized samples in Q25 format + + Return: bitwise-OR of the unsigned outputs (for guard bit calculations) **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static int DequantBlock(int *inbuf, int *outbuf, int num, int scale) -{ - int tab4[4]; - int scalef, scalei, shift; - int sx, x, y; - int mask = 0; - const int *tab16; - const unsigned int *coef; - - tab16 = pow43_14[scale & 0x3]; - scalef = pow14[scale & 0x3]; - scalei = MIN(scale >> 2, 31); /* smallest input scale = -47, so smallest scalei = -12 */ - - /* cache first 4 values */ - shift = MIN(scalei + 3, 31); - shift = MAX(shift, 0); - tab4[0] = 0; - tab4[1] = tab16[1] >> shift; - tab4[2] = tab16[2] >> shift; - tab4[3] = tab16[3] >> shift; - - do { - - sx = *inbuf++; - x = sx & 0x7fffffff; /* sx = sign|mag */ - - if (x < 4) { - - y = tab4[x]; - - } else if (x < 16) { - - y = tab16[x]; - y = (scalei < 0) ? y << -scalei : y >> scalei; - - } else { - - if (x < 64) { - - y = pow43[x-16]; - - /* fractional scale */ - y = MULSHIFT32(y, scalef); - shift = scalei - 3; - - } else { - - /* normalize to [0x40000000, 0x7fffffff] */ - x <<= 17; - shift = 0; - if (x < 0x08000000) - x <<= 4, shift += 4; - if (x < 0x20000000) - x <<= 2, shift += 2; - if (x < 0x40000000) - x <<= 1, shift += 1; - - coef = (x < SQRTHALF) ? poly43lo : poly43hi; - - /* polynomial */ - y = coef[0]; - y = MULSHIFT32(y, x) + coef[1]; - y = MULSHIFT32(y, x) + coef[2]; - y = MULSHIFT32(y, x) + coef[3]; - y = MULSHIFT32(y, x) + coef[4]; - y = MULSHIFT32(y, pow2frac[shift]) << 3; - - /* fractional scale */ - y = MULSHIFT32(y, scalef); - shift = scalei - pow2exp[shift]; - } - - /* integer scale */ - if (shift < 0) { - shift = -shift; - if (y > (0x7fffffff >> shift)) - y = 0x7fffffff; /* clip */ - else - y <<= shift; - } else { - y >>= shift; - } - } - - /* sign and store */ - mask |= y; - *outbuf++ = (sx < 0) ? -y : y; - - } while (--num); - - return mask; +/* __attribute__ ((section (".data"))) */ static int DequantBlock(int *inbuf, int *outbuf, int num, int scale) { + int tab4[4]; + int scalef, scalei, shift; + int sx, x, y; + int mask = 0; + const int *tab16; + const unsigned int *coef; + + tab16 = pow43_14[scale & 0x3]; + scalef = pow14[scale & 0x3]; + scalei = MIN(scale >> 2, 31); /* smallest input scale = -47, so smallest scalei = -12 */ + + /* cache first 4 values */ + shift = MIN(scalei + 3, 31); + shift = MAX(shift, 0); + tab4[0] = 0; + tab4[1] = tab16[1] >> shift; + tab4[2] = tab16[2] >> shift; + tab4[3] = tab16[3] >> shift; + + do { + + sx = *inbuf++; + x = sx & 0x7fffffff; /* sx = sign|mag */ + + if (x < 4) { + + y = tab4[x]; + + } else if (x < 16) { + + y = tab16[x]; + y = (scalei < 0) ? y << -scalei : y >> scalei; + + } else { + + if (x < 64) { + + y = pow43[x - 16]; + + /* fractional scale */ + y = MULSHIFT32(y, scalef); + shift = scalei - 3; + + } else { + + /* normalize to [0x40000000, 0x7fffffff] */ + x <<= 17; + shift = 0; + if (x < 0x08000000) { + x <<= 4, shift += 4; + } + if (x < 0x20000000) { + x <<= 2, shift += 2; + } + if (x < 0x40000000) { + x <<= 1, shift += 1; + } + + coef = (x < SQRTHALF) ? poly43lo : poly43hi; + + /* polynomial */ + y = coef[0]; + y = MULSHIFT32(y, x) + coef[1]; + y = MULSHIFT32(y, x) + coef[2]; + y = MULSHIFT32(y, x) + coef[3]; + y = MULSHIFT32(y, x) + coef[4]; + y = MULSHIFT32(y, pow2frac[shift]) << 3; + + /* fractional scale */ + y = MULSHIFT32(y, scalef); + shift = scalei - pow2exp[shift]; + } + + /* integer scale */ + if (shift < 0) { + shift = -shift; + if (y > (0x7fffffff >> shift)) { + y = 0x7fffffff; /* clip */ + } else { + y <<= shift; + } + } else { + y >>= shift; + } + } + + /* sign and store */ + mask |= y; + *outbuf++ = (sx < 0) ? -y : y; + + } while (--num); + + return mask; } /************************************************************************************** - * Function: DequantChannel - * - * Description: dequantize one granule, one channel worth of decoded Huffman codewords - * - * Inputs: sample buffer (decoded Huffman codewords), length = MAX_NSAMP samples - * work buffer for reordering short-block, length = MAX_REORDER_SAMPS - * samples (3 * width of largest short-block critical band) - * non-zero bound for this channel/granule - * valid FrameHeader, SideInfoSub, ScaleFactorInfoSub, and CriticalBandInfo - * structures for this channel/granule - * - * Outputs: MAX_NSAMP dequantized samples in sampleBuf - * updated non-zero bound (indicating which samples are != 0 after DQ) - * filled-in cbi structure indicating start and end critical bands - * - * Return: minimum number of guard bits in dequantized sampleBuf - * - * Notes: dequantized samples in Q(DQ_FRACBITS_OUT) format + Function: DequantChannel + + Description: dequantize one granule, one channel worth of decoded Huffman codewords + + Inputs: sample buffer (decoded Huffman codewords), length = MAX_NSAMP samples + work buffer for reordering short-block, length = MAX_REORDER_SAMPS + samples (3 * width of largest short-block critical band) + non-zero bound for this channel/granule + valid FrameHeader, SideInfoSub, ScaleFactorInfoSub, and CriticalBandInfo + structures for this channel/granule + + Outputs: MAX_NSAMP dequantized samples in sampleBuf + updated non-zero bound (indicating which samples are != 0 after DQ) + filled-in cbi structure indicating start and end critical bands + + Return: minimum number of guard bits in dequantized sampleBuf + + Notes: dequantized samples in Q(DQ_FRACBITS_OUT) format **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, - ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi) -{ - int i, j, w, cb; - int /* cbStartL, */ cbEndL, cbStartS, cbEndS; - int nSamps, nonZero, sfactMultiplier, gbMask; - int globalGain, gainI; - int cbMax[3]; - ARRAY3 *buf; /* short block reorder */ - - /* set default start/end points for short/long blocks - will update with non-zero cb info */ - if (sis->blockType == 2) { - // cbStartL = 0; - if (sis->mixedBlock) { - cbEndL = (fh->ver == MPEG1 ? 8 : 6); - cbStartS = 3; - } else { - cbEndL = 0; - cbStartS = 0; - } - cbEndS = 13; - } else { - /* long block */ - //cbStartL = 0; - cbEndL = 22; - cbStartS = 13; - cbEndS = 13; - } - cbMax[2] = cbMax[1] = cbMax[0] = 0; - gbMask = 0; - i = 0; - - /* sfactScale = 0 --> quantizer step size = 2 - * sfactScale = 1 --> quantizer step size = sqrt(2) - * so sfactMultiplier = 2 or 4 (jump through globalGain by powers of 2 or sqrt(2)) - */ - sfactMultiplier = 2 * (sis->sfactScale + 1); - - /* offset globalGain by -2 if midSide enabled, for 1/sqrt(2) used in MidSideProc() - * (DequantBlock() does 0.25 * gainI so knocking it down by two is the same as - * dividing every sample by sqrt(2) = multiplying by 2^-.5) - */ - globalGain = sis->globalGain; - if (fh->modeExt >> 1) - globalGain -= 2; - globalGain += IMDCT_SCALE; /* scale everything by sqrt(2), for fast IMDCT36 */ - - /* long blocks */ - for (cb = 0; cb < cbEndL; cb++) { - - nonZero = 0; - nSamps = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; - gainI = 210 - globalGain + sfactMultiplier * (sfis->l[cb] + (sis->preFlag ? (int)preTab[cb] : 0)); - - nonZero |= DequantBlock(sampleBuf + i, sampleBuf + i, nSamps, gainI); - i += nSamps; - - /* update highest non-zero critical band */ - if (nonZero) - cbMax[0] = cb; - gbMask |= nonZero; - - if (i >= *nonZeroBound) - break; - } - - /* set cbi (Type, EndS[], EndSMax will be overwritten if we proceed to do short blocks) */ - cbi->cbType = 0; /* long only */ - cbi->cbEndL = cbMax[0]; - cbi->cbEndS[0] = cbi->cbEndS[1] = cbi->cbEndS[2] = 0; - cbi->cbEndSMax = 0; - - /* early exit if no short blocks */ - if (cbStartS >= 12) - return CLZ(gbMask) - 1; - - /* short blocks */ - cbMax[2] = cbMax[1] = cbMax[0] = cbStartS; - for (cb = cbStartS; cb < cbEndS; cb++) { - - nSamps = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - for (w = 0; w < 3; w++) { - nonZero = 0; - gainI = 210 - globalGain + 8*sis->subBlockGain[w] + sfactMultiplier*(sfis->s[cb][w]); - - nonZero |= DequantBlock(sampleBuf + i + nSamps*w, workBuf + nSamps*w, nSamps, gainI); - - /* update highest non-zero critical band */ - if (nonZero) - cbMax[w] = cb; - gbMask |= nonZero; - } - - /* reorder blocks */ - buf = (ARRAY3 *)(sampleBuf + i); - i += 3*nSamps; - for (j = 0; j < nSamps; j++) { - buf[j][0] = workBuf[0*nSamps + j]; - buf[j][1] = workBuf[1*nSamps + j]; - buf[j][2] = workBuf[2*nSamps + j]; - } - - ASSERT(3*nSamps <= MAX_REORDER_SAMPS); - - if (i >= *nonZeroBound) - break; - } - - /* i = last non-zero INPUT sample processed, which corresponds to highest possible non-zero - * OUTPUT sample (after reorder) - * however, the original nzb is no longer necessarily true - * for each cb, buf[][] is updated with 3*nSamps samples (i increases 3*nSamps each time) - * (buf[j + 1][0] = 3 (input) samples ahead of buf[j][0]) - * so update nonZeroBound to i - */ - *nonZeroBound = i; - - ASSERT(*nonZeroBound <= MAX_NSAMP); - - cbi->cbType = (sis->mixedBlock ? 2 : 1); /* 2 = mixed short/long, 1 = short only */ - - cbi->cbEndS[0] = cbMax[0]; - cbi->cbEndS[1] = cbMax[1]; - cbi->cbEndS[2] = cbMax[2]; - - cbi->cbEndSMax = cbMax[0]; - cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[1]); - cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[2]); - - return CLZ(gbMask) - 1; +/* __attribute__ ((section (".data"))) */ int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, + ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi) { + int i, j, w, cb; + int /* cbStartL, */ cbEndL, cbStartS, cbEndS; + int nSamps, nonZero, sfactMultiplier, gbMask; + int globalGain, gainI; + int cbMax[3]; + ARRAY3 *buf; /* short block reorder */ + + /* set default start/end points for short/long blocks - will update with non-zero cb info */ + if (sis->blockType == 2) { + // cbStartL = 0; + if (sis->mixedBlock) { + cbEndL = (fh->ver == MPEG1 ? 8 : 6); + cbStartS = 3; + } else { + cbEndL = 0; + cbStartS = 0; + } + cbEndS = 13; + } else { + /* long block */ + //cbStartL = 0; + cbEndL = 22; + cbStartS = 13; + cbEndS = 13; + } + cbMax[2] = cbMax[1] = cbMax[0] = 0; + gbMask = 0; + i = 0; + + /* sfactScale = 0 --> quantizer step size = 2 + sfactScale = 1 --> quantizer step size = sqrt(2) + so sfactMultiplier = 2 or 4 (jump through globalGain by powers of 2 or sqrt(2)) + */ + sfactMultiplier = 2 * (sis->sfactScale + 1); + + /* offset globalGain by -2 if midSide enabled, for 1/sqrt(2) used in MidSideProc() + (DequantBlock() does 0.25 * gainI so knocking it down by two is the same as + dividing every sample by sqrt(2) = multiplying by 2^-.5) + */ + globalGain = sis->globalGain; + if (fh->modeExt >> 1) { + globalGain -= 2; + } + globalGain += IMDCT_SCALE; /* scale everything by sqrt(2), for fast IMDCT36 */ + + /* long blocks */ + for (cb = 0; cb < cbEndL; cb++) { + + nonZero = 0; + nSamps = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; + gainI = 210 - globalGain + sfactMultiplier * (sfis->l[cb] + (sis->preFlag ? (int)preTab[cb] : 0)); + + nonZero |= DequantBlock(sampleBuf + i, sampleBuf + i, nSamps, gainI); + i += nSamps; + + /* update highest non-zero critical band */ + if (nonZero) { + cbMax[0] = cb; + } + gbMask |= nonZero; + + if (i >= *nonZeroBound) { + break; + } + } + + /* set cbi (Type, EndS[], EndSMax will be overwritten if we proceed to do short blocks) */ + cbi->cbType = 0; /* long only */ + cbi->cbEndL = cbMax[0]; + cbi->cbEndS[0] = cbi->cbEndS[1] = cbi->cbEndS[2] = 0; + cbi->cbEndSMax = 0; + + /* early exit if no short blocks */ + if (cbStartS >= 12) { + return CLZ(gbMask) - 1; + } + + /* short blocks */ + cbMax[2] = cbMax[1] = cbMax[0] = cbStartS; + for (cb = cbStartS; cb < cbEndS; cb++) { + + nSamps = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; + for (w = 0; w < 3; w++) { + nonZero = 0; + gainI = 210 - globalGain + 8 * sis->subBlockGain[w] + sfactMultiplier * (sfis->s[cb][w]); + + nonZero |= DequantBlock(sampleBuf + i + nSamps * w, workBuf + nSamps * w, nSamps, gainI); + + /* update highest non-zero critical band */ + if (nonZero) { + cbMax[w] = cb; + } + gbMask |= nonZero; + } + + /* reorder blocks */ + buf = (ARRAY3 *)(sampleBuf + i); + i += 3 * nSamps; + for (j = 0; j < nSamps; j++) { + buf[j][0] = workBuf[0 * nSamps + j]; + buf[j][1] = workBuf[1 * nSamps + j]; + buf[j][2] = workBuf[2 * nSamps + j]; + } + + ASSERT(3 * nSamps <= MAX_REORDER_SAMPS); + + if (i >= *nonZeroBound) { + break; + } + } + + /* i = last non-zero INPUT sample processed, which corresponds to highest possible non-zero + OUTPUT sample (after reorder) + however, the original nzb is no longer necessarily true + for each cb, buf[][] is updated with 3*nSamps samples (i increases 3*nSamps each time) + (buf[j + 1][0] = 3 (input) samples ahead of buf[j][0]) + so update nonZeroBound to i + */ + *nonZeroBound = i; + + ASSERT(*nonZeroBound <= MAX_NSAMP); + + cbi->cbType = (sis->mixedBlock ? 2 : 1); /* 2 = mixed short/long, 1 = short only */ + + cbi->cbEndS[0] = cbMax[0]; + cbi->cbEndS[1] = cbMax[1]; + cbi->cbEndS[2] = cbMax[2]; + + cbi->cbEndSMax = cbMax[0]; + cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[1]); + cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[2]); + + return CLZ(gbMask) - 1; } diff --git a/src/libhelix-mp3/huffman.c b/src/libhelix-mp3/huffman.c index 7d9d3f13..3ac84f5d 100644 --- a/src/libhelix-mp3/huffman.c +++ b/src/libhelix-mp3/huffman.c @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * July 2003 - * - * huffman.c - Huffman decoding of transform coefficients + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + July 2003 + + huffman.c - Huffman decoding of transform coefficients **************************************************************************************/ #include "coder.h" @@ -62,402 +62,463 @@ #define ApplySign(x, s) { (x) |= ((s) & 0x80000000); } /************************************************************************************** - * Function: DecodeHuffmanPairs - * - * Description: decode 2-way vector Huffman codes in the "bigValues" region of spectrum - * - * Inputs: valid BitStreamInfo struct, pointing to start of pair-wise codes - * pointer to xy buffer to received decoded values - * number of codewords to decode - * index of Huffman table to use - * number of bits remaining in bitstream - * - * Outputs: pairs of decoded coefficients in vwxy - * updated BitStreamInfo struct - * - * Return: number of bits used, or -1 if out of bits - * - * Notes: assumes that nVals is an even number - * si_huff.bit tests every Huffman codeword in every table (though not - * necessarily all linBits outputs for x,y > 15) + Function: DecodeHuffmanPairs + + Description: decode 2-way vector Huffman codes in the "bigValues" region of spectrum + + Inputs: valid BitStreamInfo struct, pointing to start of pair-wise codes + pointer to xy buffer to received decoded values + number of codewords to decode + index of Huffman table to use + number of bits remaining in bitstream + + Outputs: pairs of decoded coefficients in vwxy + updated BitStreamInfo struct + + Return: number of bits used, or -1 if out of bits + + Notes: assumes that nVals is an even number + si_huff.bit tests every Huffman codeword in every table (though not + necessarily all linBits outputs for x,y > 15) **************************************************************************************/ // no improvement with section=data -static int DecodeHuffmanPairs(int *xy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) -{ - int i, x, y; - int cachedBits, padBits, len, startBits, linBits, maxBits, minBits; - HuffTabType tabType; - unsigned short cw, *tBase, *tCurr; - unsigned int cache; - - if(nVals <= 0) - return 0; - - if (bitsLeft < 0) - return -1; - startBits = bitsLeft; - - tBase = (unsigned short *)(huffTable + huffTabOffset[tabIdx]); - linBits = huffTabLookup[tabIdx].linBits; - tabType = huffTabLookup[tabIdx].tabType; - - ASSERT(!(nVals & 0x01)); - ASSERT(tabIdx < HUFF_PAIRTABS); - ASSERT(tabIdx >= 0); - ASSERT(tabType != invalidTab); - - /* initially fill cache with any partial byte */ - cache = 0; - cachedBits = (8 - bitOffset) & 0x07; - if (cachedBits) - cache = (unsigned int)(*buf++) << (32 - cachedBits); - bitsLeft -= cachedBits; - - if (tabType == noBits) { - /* table 0, no data, x = y = 0 */ - for (i = 0; i < nVals; i+=2) { - xy[i+0] = 0; - xy[i+1] = 0; - } - return 0; - } else if (tabType == oneShot) { - /* single lookup, no escapes */ - maxBits = GetMaxbits(pgm_read_word(&tBase[0])); - tBase++; - padBits = 0; - while (nVals > 0) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return -1; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 11; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ - while (nVals > 0 && cachedBits >= 11 ) { - cw = pgm_read_word(&tBase[cache >> (32 - maxBits)]); - len = GetHLen(cw); - cachedBits -= len; - cache <<= len; - - x = GetCWX(cw); if (x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - y = GetCWY(cw); if (y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - should never have consumed padBits */ - if (cachedBits < padBits) - return -1; - - *xy++ = x; - *xy++ = y; - nVals -= 2; - } - } - bitsLeft += (cachedBits - padBits); - return (startBits - bitsLeft); - } else if (tabType == loopLinbits || tabType == loopNoLinbits) { - tCurr = tBase; - padBits = 0; - while (nVals > 0) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return -1; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 11; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ - while (nVals > 0 && cachedBits >= 11 ) { - maxBits = GetMaxbits(pgm_read_word(&tCurr[0])); - cw = pgm_read_word(&tCurr[(cache >> (32 - maxBits)) + 1]); - len = GetHLen(cw); - if (!len) { - cachedBits -= maxBits; - cache <<= maxBits; - tCurr += cw; - continue; - } - cachedBits -= len; - cache <<= len; - - x = GetCWX(cw); - y = GetCWY(cw); - - if (x == 15 && tabType == loopLinbits) { - minBits = linBits + 1 + (y ? 1 : 0); - if (cachedBits + bitsLeft < minBits) - return -1; - while (cachedBits < minBits) { - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cachedBits += 8; - bitsLeft -= 8; - } - if (bitsLeft < 0) { - cachedBits += bitsLeft; - bitsLeft = 0; - cache &= (signed int)0x80000000 >> (cachedBits - 1); - } - x += (int)(cache >> (32 - linBits)); - cachedBits -= linBits; - cache <<= linBits; - } - if (x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - - if (y == 15 && tabType == loopLinbits) { - minBits = linBits + 1; - if (cachedBits + bitsLeft < minBits) - return -1; - while (cachedBits < minBits) { - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cachedBits += 8; - bitsLeft -= 8; - } - if (bitsLeft < 0) { - cachedBits += bitsLeft; - bitsLeft = 0; - cache &= (signed int)0x80000000 >> (cachedBits - 1); - } - y += (int)(cache >> (32 - linBits)); - cachedBits -= linBits; - cache <<= linBits; - } - if (y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - should never have consumed padBits */ - if (cachedBits < padBits) - return -1; - - *xy++ = x; - *xy++ = y; - nVals -= 2; - tCurr = tBase; - } - } - bitsLeft += (cachedBits - padBits); - return (startBits - bitsLeft); - } - - /* error in bitstream - trying to access unused Huffman table */ - return -1; +static int DecodeHuffmanPairs(int *xy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) { + int i, x, y; + int cachedBits, padBits, len, startBits, linBits, maxBits, minBits; + HuffTabType tabType; + unsigned short cw, *tBase, *tCurr; + unsigned int cache; + + if (nVals <= 0) { + return 0; + } + + if (bitsLeft < 0) { + return -1; + } + startBits = bitsLeft; + + tBase = (unsigned short *)(huffTable + huffTabOffset[tabIdx]); + linBits = huffTabLookup[tabIdx].linBits; + tabType = huffTabLookup[tabIdx].tabType; + + ASSERT(!(nVals & 0x01)); + ASSERT(tabIdx < HUFF_PAIRTABS); + ASSERT(tabIdx >= 0); + ASSERT(tabType != invalidTab); + + /* initially fill cache with any partial byte */ + cache = 0; + cachedBits = (8 - bitOffset) & 0x07; + if (cachedBits) { + cache = (unsigned int)(*buf++) << (32 - cachedBits); + } + bitsLeft -= cachedBits; + + if (tabType == noBits) { + /* table 0, no data, x = y = 0 */ + for (i = 0; i < nVals; i += 2) { + xy[i + 0] = 0; + xy[i + 1] = 0; + } + return 0; + } else if (tabType == oneShot) { + /* single lookup, no escapes */ + maxBits = GetMaxbits(pgm_read_word(&tBase[0])); + tBase++; + padBits = 0; + while (nVals > 0) { + /* refill cache - assumes cachedBits <= 16 */ + if (bitsLeft >= 16) { + /* load 2 new bytes into left-justified cache */ + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + cachedBits += 16; + bitsLeft -= 16; + } else { + /* last time through, pad cache with zeros and drain cache */ + if (cachedBits + bitsLeft <= 0) { + return -1; + } + if (bitsLeft > 0) { + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + } + if (bitsLeft > 8) { + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + } + cachedBits += bitsLeft; + bitsLeft = 0; + + cache &= (signed int)0x80000000 >> (cachedBits - 1); + padBits = 11; + cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ + } + + /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ + while (nVals > 0 && cachedBits >= 11) { + cw = pgm_read_word(&tBase[cache >> (32 - maxBits)]); + len = GetHLen(cw); + cachedBits -= len; + cache <<= len; + + x = GetCWX(cw); if (x) { + ApplySign(x, cache); + cache <<= 1; + cachedBits--; + } + y = GetCWY(cw); if (y) { + ApplySign(y, cache); + cache <<= 1; + cachedBits--; + } + + /* ran out of bits - should never have consumed padBits */ + if (cachedBits < padBits) { + return -1; + } + + *xy++ = x; + *xy++ = y; + nVals -= 2; + } + } + bitsLeft += (cachedBits - padBits); + return (startBits - bitsLeft); + } else if (tabType == loopLinbits || tabType == loopNoLinbits) { + tCurr = tBase; + padBits = 0; + while (nVals > 0) { + /* refill cache - assumes cachedBits <= 16 */ + if (bitsLeft >= 16) { + /* load 2 new bytes into left-justified cache */ + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + cachedBits += 16; + bitsLeft -= 16; + } else { + /* last time through, pad cache with zeros and drain cache */ + if (cachedBits + bitsLeft <= 0) { + return -1; + } + if (bitsLeft > 0) { + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + } + if (bitsLeft > 8) { + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + } + cachedBits += bitsLeft; + bitsLeft = 0; + + cache &= (signed int)0x80000000 >> (cachedBits - 1); + padBits = 11; + cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ + } + + /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ + while (nVals > 0 && cachedBits >= 11) { + maxBits = GetMaxbits(pgm_read_word(&tCurr[0])); + cw = pgm_read_word(&tCurr[(cache >> (32 - maxBits)) + 1]); + len = GetHLen(cw); + if (!len) { + cachedBits -= maxBits; + cache <<= maxBits; + tCurr += cw; + continue; + } + cachedBits -= len; + cache <<= len; + + x = GetCWX(cw); + y = GetCWY(cw); + + if (x == 15 && tabType == loopLinbits) { + minBits = linBits + 1 + (y ? 1 : 0); + if (cachedBits + bitsLeft < minBits) { + return -1; + } + while (cachedBits < minBits) { + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + cachedBits += 8; + bitsLeft -= 8; + } + if (bitsLeft < 0) { + cachedBits += bitsLeft; + bitsLeft = 0; + cache &= (signed int)0x80000000 >> (cachedBits - 1); + } + x += (int)(cache >> (32 - linBits)); + cachedBits -= linBits; + cache <<= linBits; + } + if (x) { + ApplySign(x, cache); + cache <<= 1; + cachedBits--; + } + + if (y == 15 && tabType == loopLinbits) { + minBits = linBits + 1; + if (cachedBits + bitsLeft < minBits) { + return -1; + } + while (cachedBits < minBits) { + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + cachedBits += 8; + bitsLeft -= 8; + } + if (bitsLeft < 0) { + cachedBits += bitsLeft; + bitsLeft = 0; + cache &= (signed int)0x80000000 >> (cachedBits - 1); + } + y += (int)(cache >> (32 - linBits)); + cachedBits -= linBits; + cache <<= linBits; + } + if (y) { + ApplySign(y, cache); + cache <<= 1; + cachedBits--; + } + + /* ran out of bits - should never have consumed padBits */ + if (cachedBits < padBits) { + return -1; + } + + *xy++ = x; + *xy++ = y; + nVals -= 2; + tCurr = tBase; + } + } + bitsLeft += (cachedBits - padBits); + return (startBits - bitsLeft); + } + + /* error in bitstream - trying to access unused Huffman table */ + return -1; } /************************************************************************************** - * Function: DecodeHuffmanQuads - * - * Description: decode 4-way vector Huffman codes in the "count1" region of spectrum - * - * Inputs: valid BitStreamInfo struct, pointing to start of quadword codes - * pointer to vwxy buffer to received decoded values - * maximum number of codewords to decode - * index of quadword table (0 = table A, 1 = table B) - * number of bits remaining in bitstream - * - * Outputs: quadruples of decoded coefficients in vwxy - * updated BitStreamInfo struct - * - * Return: index of the first "zero_part" value (index of the first sample - * of the quad word after which all samples are 0) - * - * Notes: si_huff.bit tests every vwxy output in both quad tables + Function: DecodeHuffmanQuads + + Description: decode 4-way vector Huffman codes in the "count1" region of spectrum + + Inputs: valid BitStreamInfo struct, pointing to start of quadword codes + pointer to vwxy buffer to received decoded values + maximum number of codewords to decode + index of quadword table (0 = table A, 1 = table B) + number of bits remaining in bitstream + + Outputs: quadruples of decoded coefficients in vwxy + updated BitStreamInfo struct + + Return: index of the first "zero_part" value (index of the first sample + of the quad word after which all samples are 0) + + Notes: si_huff.bit tests every vwxy output in both quad tables **************************************************************************************/ // no improvement with section=data -static int DecodeHuffmanQuads(int *vwxy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) -{ - int i, v, w, x, y; - int len, maxBits, cachedBits, padBits; - unsigned int cache; - unsigned char cw, *tBase; - - if (bitsLeft <= 0) - return 0; - - tBase = (unsigned char *)quadTable + quadTabOffset[tabIdx]; - maxBits = quadTabMaxBits[tabIdx]; - - /* initially fill cache with any partial byte */ - cache = 0; - cachedBits = (8 - bitOffset) & 0x07; - if (cachedBits) - cache = (unsigned int)(*buf++) << (32 - cachedBits); - bitsLeft -= cachedBits; - - i = padBits = 0; - while (i < (nVals - 3)) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return i; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 10; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 6, plus 4 for sign bits, so make sure cache has at least 10 bits */ - while (i < (nVals - 3) && cachedBits >= 10 ) { - cw = pgm_read_byte(&tBase[cache >> (32 - maxBits)]); - len = GetHLenQ(cw); - cachedBits -= len; - cache <<= len; - - v = GetCWVQ(cw); if(v) {ApplySign(v, cache); cache <<= 1; cachedBits--;} - w = GetCWWQ(cw); if(w) {ApplySign(w, cache); cache <<= 1; cachedBits--;} - x = GetCWXQ(cw); if(x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - y = GetCWYQ(cw); if(y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - okay (means we're done) */ - if (cachedBits < padBits) - return i; - - *vwxy++ = v; - *vwxy++ = w; - *vwxy++ = x; - *vwxy++ = y; - i += 4; - } - } - - /* decoded max number of quad values */ - return i; +static int DecodeHuffmanQuads(int *vwxy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) { + int i, v, w, x, y; + int len, maxBits, cachedBits, padBits; + unsigned int cache; + unsigned char cw, *tBase; + + if (bitsLeft <= 0) { + return 0; + } + + tBase = (unsigned char *)quadTable + quadTabOffset[tabIdx]; + maxBits = quadTabMaxBits[tabIdx]; + + /* initially fill cache with any partial byte */ + cache = 0; + cachedBits = (8 - bitOffset) & 0x07; + if (cachedBits) { + cache = (unsigned int)(*buf++) << (32 - cachedBits); + } + bitsLeft -= cachedBits; + + i = padBits = 0; + while (i < (nVals - 3)) { + /* refill cache - assumes cachedBits <= 16 */ + if (bitsLeft >= 16) { + /* load 2 new bytes into left-justified cache */ + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + cachedBits += 16; + bitsLeft -= 16; + } else { + /* last time through, pad cache with zeros and drain cache */ + if (cachedBits + bitsLeft <= 0) { + return i; + } + if (bitsLeft > 0) { + cache |= (unsigned int)(*buf++) << (24 - cachedBits); + } + if (bitsLeft > 8) { + cache |= (unsigned int)(*buf++) << (16 - cachedBits); + } + cachedBits += bitsLeft; + bitsLeft = 0; + + cache &= (signed int)0x80000000 >> (cachedBits - 1); + padBits = 10; + cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ + } + + /* largest maxBits = 6, plus 4 for sign bits, so make sure cache has at least 10 bits */ + while (i < (nVals - 3) && cachedBits >= 10) { + cw = pgm_read_byte(&tBase[cache >> (32 - maxBits)]); + len = GetHLenQ(cw); + cachedBits -= len; + cache <<= len; + + v = GetCWVQ(cw); if (v) { + ApplySign(v, cache); + cache <<= 1; + cachedBits--; + } + w = GetCWWQ(cw); if (w) { + ApplySign(w, cache); + cache <<= 1; + cachedBits--; + } + x = GetCWXQ(cw); if (x) { + ApplySign(x, cache); + cache <<= 1; + cachedBits--; + } + y = GetCWYQ(cw); if (y) { + ApplySign(y, cache); + cache <<= 1; + cachedBits--; + } + + /* ran out of bits - okay (means we're done) */ + if (cachedBits < padBits) { + return i; + } + + *vwxy++ = v; + *vwxy++ = w; + *vwxy++ = x; + *vwxy++ = y; + i += 4; + } + } + + /* decoded max number of quad values */ + return i; } /************************************************************************************** - * Function: DecodeHuffman - * - * Description: decode one granule, one channel worth of Huffman codes - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * and UnpackScaleFactors() (for this granule) - * buffer pointing to start of Huffman data in MP3 frame - * pointer to bit offset (0-7) indicating starting bit in buf[0] - * number of bits in the Huffman data section of the frame - * (could include padding bits) - * index of current granule and channel - * - * Outputs: decoded coefficients in hi->huffDecBuf[ch] (hi pointer in mp3DecInfo) - * updated bitOffset - * - * Return: length (in bytes) of Huffman codes - * bitOffset also returned in parameter (0 = MSB, 7 = LSB of - * byte located at buf + offset) - * -1 if null input pointers, huffBlockBits < 0, or decoder runs - * out of bits prematurely (invalid bitstream) + Function: DecodeHuffman + + Description: decode one granule, one channel worth of Huffman codes + + Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), + and UnpackScaleFactors() (for this granule) + buffer pointing to start of Huffman data in MP3 frame + pointer to bit offset (0-7) indicating starting bit in buf[0] + number of bits in the Huffman data section of the frame + (could include padding bits) + index of current granule and channel + + Outputs: decoded coefficients in hi->huffDecBuf[ch] (hi pointer in mp3DecInfo) + updated bitOffset + + Return: length (in bytes) of Huffman codes + bitOffset also returned in parameter (0 = MSB, 7 = LSB of + byte located at buf + offset) + -1 if null input pointers, huffBlockBits < 0, or decoder runs + out of bits prematurely (invalid bitstream) **************************************************************************************/ // .data about 1ms faster per frame -/* __attribute__ ((section (".data"))) */ int DecodeHuffman(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int huffBlockBits, int gr, int ch) -{ - int r1Start, r2Start, rEnd[4]; /* region boundaries */ - int i, w, bitsUsed, bitsLeft; - unsigned char *startBuf = buf; - - FrameHeader *fh; - SideInfo *si; - SideInfoSub *sis; - //ScaleFactorInfo *sfi; - HuffmanInfo *hi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || !mp3DecInfo->HuffmanInfoPS) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - sis = &si->sis[gr][ch]; - //sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); - hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); - - if (huffBlockBits < 0) - return -1; - - /* figure out region boundaries (the first 2*bigVals coefficients divided into 3 regions) */ - if (sis->winSwitchFlag && sis->blockType == 2) { - if (sis->mixedBlock == 0) { - r1Start = fh->sfBand->s[(sis->region0Count + 1)/3] * 3; - } else { - if (fh->ver == MPEG1) { - r1Start = fh->sfBand->l[sis->region0Count + 1]; - } else { - /* see MPEG2 spec for explanation */ - w = fh->sfBand->s[4] - fh->sfBand->s[3]; - r1Start = fh->sfBand->l[6] + 2*w; - } - } - r2Start = MAX_NSAMP; /* short blocks don't have region 2 */ - } else { - r1Start = fh->sfBand->l[sis->region0Count + 1]; - r2Start = fh->sfBand->l[sis->region0Count + 1 + sis->region1Count + 1]; - } - - /* offset rEnd index by 1 so first region = rEnd[1] - rEnd[0], etc. */ - rEnd[3] = MIN(MAX_NSAMP, 2 * sis->nBigvals); - rEnd[2] = MIN(r2Start, rEnd[3]); - rEnd[1] = MIN(r1Start, rEnd[3]); - rEnd[0] = 0; - - /* rounds up to first all-zero pair (we don't check last pair for (x,y) == (non-zero, zero)) */ - hi->nonZeroBound[ch] = rEnd[3]; - - /* decode Huffman pairs (rEnd[i] are always even numbers) */ - bitsLeft = huffBlockBits; - for (i = 0; i < 3; i++) { - bitsUsed = DecodeHuffmanPairs(hi->huffDecBuf[ch] + rEnd[i], rEnd[i+1] - rEnd[i], sis->tableSelect[i], bitsLeft, buf, *bitOffset); - if (bitsUsed < 0 || bitsUsed > bitsLeft) /* error - overran end of bitstream */ - return -1; - - /* update bitstream position */ - buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - bitsLeft -= bitsUsed; - } - - /* decode Huffman quads (if any) */ - hi->nonZeroBound[ch] += DecodeHuffmanQuads(hi->huffDecBuf[ch] + rEnd[3], MAX_NSAMP - rEnd[3], sis->count1TableSelect, bitsLeft, buf, *bitOffset); - - ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); - for (i = hi->nonZeroBound[ch]; i < MAX_NSAMP; i++) - hi->huffDecBuf[ch][i] = 0; - - /* If bits used for 576 samples < huffBlockBits, then the extras are considered - * to be stuffing bits (throw away, but need to return correct bitstream position) - */ - buf += (bitsLeft + *bitOffset) >> 3; - *bitOffset = (bitsLeft + *bitOffset) & 0x07; - - return (buf - startBuf); +/* __attribute__ ((section (".data"))) */ int DecodeHuffman(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int huffBlockBits, int gr, int ch) { + int r1Start, r2Start, rEnd[4]; /* region boundaries */ + int i, w, bitsUsed, bitsLeft; + unsigned char *startBuf = buf; + + FrameHeader *fh; + SideInfo *si; + SideInfoSub *sis; + //ScaleFactorInfo *sfi; + HuffmanInfo *hi; + + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || !mp3DecInfo->HuffmanInfoPS) { + return -1; + } + + fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); + si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); + sis = &si->sis[gr][ch]; + //sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); + hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); + + if (huffBlockBits < 0) { + return -1; + } + + /* figure out region boundaries (the first 2*bigVals coefficients divided into 3 regions) */ + if (sis->winSwitchFlag && sis->blockType == 2) { + if (sis->mixedBlock == 0) { + r1Start = fh->sfBand->s[(sis->region0Count + 1) / 3] * 3; + } else { + if (fh->ver == MPEG1) { + r1Start = fh->sfBand->l[sis->region0Count + 1]; + } else { + /* see MPEG2 spec for explanation */ + w = fh->sfBand->s[4] - fh->sfBand->s[3]; + r1Start = fh->sfBand->l[6] + 2 * w; + } + } + r2Start = MAX_NSAMP; /* short blocks don't have region 2 */ + } else { + r1Start = fh->sfBand->l[sis->region0Count + 1]; + r2Start = fh->sfBand->l[sis->region0Count + 1 + sis->region1Count + 1]; + } + + /* offset rEnd index by 1 so first region = rEnd[1] - rEnd[0], etc. */ + rEnd[3] = MIN(MAX_NSAMP, 2 * sis->nBigvals); + rEnd[2] = MIN(r2Start, rEnd[3]); + rEnd[1] = MIN(r1Start, rEnd[3]); + rEnd[0] = 0; + + /* rounds up to first all-zero pair (we don't check last pair for (x,y) == (non-zero, zero)) */ + hi->nonZeroBound[ch] = rEnd[3]; + + /* decode Huffman pairs (rEnd[i] are always even numbers) */ + bitsLeft = huffBlockBits; + for (i = 0; i < 3; i++) { + bitsUsed = DecodeHuffmanPairs(hi->huffDecBuf[ch] + rEnd[i], rEnd[i + 1] - rEnd[i], sis->tableSelect[i], bitsLeft, buf, *bitOffset); + if (bitsUsed < 0 || bitsUsed > bitsLeft) { /* error - overran end of bitstream */ + return -1; + } + + /* update bitstream position */ + buf += (bitsUsed + *bitOffset) >> 3; + *bitOffset = (bitsUsed + *bitOffset) & 0x07; + bitsLeft -= bitsUsed; + } + + /* decode Huffman quads (if any) */ + hi->nonZeroBound[ch] += DecodeHuffmanQuads(hi->huffDecBuf[ch] + rEnd[3], MAX_NSAMP - rEnd[3], sis->count1TableSelect, bitsLeft, buf, *bitOffset); + + ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); + for (i = hi->nonZeroBound[ch]; i < MAX_NSAMP; i++) { + hi->huffDecBuf[ch][i] = 0; + } + + /* If bits used for 576 samples < huffBlockBits, then the extras are considered + to be stuffing bits (throw away, but need to return correct bitstream position) + */ + buf += (bitsLeft + *bitOffset) >> 3; + *bitOffset = (bitsLeft + *bitOffset) & 0x07; + + return (buf - startBuf); } diff --git a/src/libhelix-mp3/hufftabs.c b/src/libhelix-mp3/hufftabs.c index 7190159c..c1eecda4 100644 --- a/src/libhelix-mp3/hufftabs.c +++ b/src/libhelix-mp3/hufftabs.c @@ -1,649 +1,649 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * hufftabs.c - compressed Huffman code tables + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + hufftabs.c - compressed Huffman code tables **************************************************************************************/ #include #include "coder.h" -/* NOTE - regenerated tables to use shorts instead of ints - * (all needed data can fit in 16 bits - see below) - * - * format 0xABCD - * A = length of codeword - * B = y value - * C = x value - * D = number of sign bits (0, 1, or 2) - * - * to read a CW, the code reads maxbits from the stream (dep. on - * table index), but doesn't remove them from the bitstream reader - * then it gets the correct CW by direct lookup into the table - * of length (2^maxbits) (more complicated for non-oneShot...) - * for CW's with hlen < maxbits, there are multiple entries in the - * table (extra bits are don't cares) - * the bitstream reader then "purges" (or removes) only the correct - * number of bits for the chosen CW - * - * entries starting with F are special: D (signbits) is maxbits, - * so the decoder always checks huffTableXX[0] first, gets the - * signbits, and reads that many bits from the bitstream - * (sometimes it takes > 1 read to get the value, so maxbits is - * can get updated by jumping to another value starting with 0xF) - * entries starting with 0 are also special: A = hlen = 0, rest of - * value is an offset to jump higher in the table (for tables of - * type loopNoLinbits or loopLinbits) - */ - -/* store Huffman codes as one big table plus table of offsets, since some platforms - * don't properly support table-of-tables (table of pointers to other const tables) - */ +/* NOTE - regenerated tables to use shorts instead of ints + (all needed data can fit in 16 bits - see below) + + format 0xABCD + A = length of codeword + B = y value + C = x value + D = number of sign bits (0, 1, or 2) + + to read a CW, the code reads maxbits from the stream (dep. on + table index), but doesn't remove them from the bitstream reader + then it gets the correct CW by direct lookup into the table + of length (2^maxbits) (more complicated for non-oneShot...) + for CW's with hlen < maxbits, there are multiple entries in the + table (extra bits are don't cares) + the bitstream reader then "purges" (or removes) only the correct + number of bits for the chosen CW + + entries starting with F are special: D (signbits) is maxbits, + so the decoder always checks huffTableXX[0] first, gets the + signbits, and reads that many bits from the bitstream + (sometimes it takes > 1 read to get the value, so maxbits is + can get updated by jumping to another value starting with 0xF) + entries starting with 0 are also special: A = hlen = 0, rest of + value is an offset to jump higher in the table (for tables of + type loopNoLinbits or loopLinbits) +*/ + +/* store Huffman codes as one big table plus table of offsets, since some platforms + don't properly support table-of-tables (table of pointers to other const tables) +*/ const unsigned short huffTable[] PROGMEM = { - /* huffTable01[9] */ - 0xf003, 0x3112, 0x3101, 0x2011, 0x2011, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable02[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable03[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, - - /* huffTable05[257] */ - 0xf008, 0x8332, 0x8322, 0x7232, 0x7232, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7312, 0x7312, 0x7301, 0x7301, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable06[129] */ - 0xf007, 0x7332, 0x7301, 0x6322, 0x6322, 0x6232, 0x6232, 0x6031, - 0x6031, 0x5312, 0x5312, 0x5312, 0x5312, 0x5132, 0x5132, 0x5132, - 0x5132, 0x5222, 0x5222, 0x5222, 0x5222, 0x5201, 0x5201, 0x5201, - 0x5201, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, - - /* huffTable07[110] */ - 0xf006, 0x0041, 0x0052, 0x005b, 0x0060, 0x0063, 0x0068, 0x006b, - 0x6212, 0x5122, 0x5122, 0x6201, 0x6021, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf004, 0x4552, 0x4542, 0x4452, 0x4352, 0x3532, 0x3532, - 0x3442, 0x3442, 0x3522, 0x3522, 0x3252, 0x3252, 0x2512, 0x2512, - 0x2512, 0x2512, 0xf003, 0x2152, 0x2152, 0x3501, 0x3432, 0x2051, - 0x2051, 0x3342, 0x3332, 0xf002, 0x2422, 0x2242, 0x1412, 0x1412, - 0xf001, 0x1142, 0x1041, 0xf002, 0x2401, 0x2322, 0x2232, 0x2301, - 0xf001, 0x1312, 0x1132, 0xf001, 0x1031, 0x1222, - - /* huffTable08[280] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x8512, 0x8152, 0x0112, 0x0115, - 0x8422, 0x8242, 0x8412, 0x7142, 0x7142, 0x8401, 0x8041, 0x8322, - 0x8232, 0x8312, 0x8132, 0x8301, 0x8031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf003, 0x3552, 0x3452, 0x2542, 0x2542, 0x1352, 0x1352, - 0x1352, 0x1352, 0xf002, 0x2532, 0x2442, 0x1522, 0x1522, 0xf001, - 0x1252, 0x1501, 0xf001, 0x1432, 0x1342, 0xf001, 0x1051, 0x1332, - - /* huffTable09[93] */ - 0xf006, 0x0041, 0x004a, 0x004f, 0x0052, 0x0057, 0x005a, 0x6412, - 0x6142, 0x6322, 0x6232, 0x5312, 0x5312, 0x5132, 0x5132, 0x6301, - 0x6031, 0x5222, 0x5222, 0x5201, 0x5201, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf003, 0x3552, 0x3542, 0x2532, 0x2532, 0x2352, 0x2352, - 0x3452, 0x3501, 0xf002, 0x2442, 0x2522, 0x2252, 0x2512, 0xf001, - 0x1152, 0x1432, 0xf002, 0x1342, 0x1342, 0x2051, 0x2401, 0xf001, - 0x1422, 0x1242, 0xf001, 0x1332, 0x1041, - - /* huffTable10[320] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x0118, 0x011b, 0x0120, 0x0125, - 0x8712, 0x8172, 0x012a, 0x012d, 0x0132, 0x8612, 0x8162, 0x8061, - 0x0137, 0x013a, 0x013d, 0x8412, 0x8142, 0x8041, 0x8322, 0x8232, - 0x8301, 0x7312, 0x7312, 0x7132, 0x7132, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3772, 0x3762, 0x3672, 0x3752, 0x3572, 0x3662, - 0x2742, 0x2742, 0xf002, 0x2472, 0x2652, 0x2562, 0x2732, 0xf003, - 0x2372, 0x2372, 0x2642, 0x2642, 0x3552, 0x3452, 0x2362, 0x2362, - 0xf001, 0x1722, 0x1272, 0xf002, 0x2462, 0x2701, 0x1071, 0x1071, - 0xf002, 0x1262, 0x1262, 0x2542, 0x2532, 0xf002, 0x1601, 0x1601, - 0x2352, 0x2442, 0xf001, 0x1632, 0x1622, 0xf002, 0x2522, 0x2252, - 0x1512, 0x1512, 0xf002, 0x1152, 0x1152, 0x2432, 0x2342, 0xf001, - 0x1501, 0x1051, 0xf001, 0x1422, 0x1242, 0xf001, 0x1332, 0x1401, - - /* huffTable11[296] */ - 0xf008, 0x0101, 0x0106, 0x010f, 0x0114, 0x0117, 0x8722, 0x8272, - 0x011c, 0x7172, 0x7172, 0x8712, 0x8071, 0x8632, 0x8362, 0x8061, - 0x011f, 0x0122, 0x8512, 0x7262, 0x7262, 0x8622, 0x8601, 0x7612, - 0x7612, 0x7162, 0x7162, 0x8152, 0x8432, 0x8051, 0x0125, 0x8422, - 0x8242, 0x8412, 0x8142, 0x8401, 0x8041, 0x7322, 0x7322, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7031, 0x7031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf002, 0x2772, 0x2762, 0x2672, 0x2572, 0xf003, 0x2662, - 0x2662, 0x2742, 0x2742, 0x2472, 0x2472, 0x3752, 0x3552, 0xf002, - 0x2652, 0x2562, 0x1732, 0x1732, 0xf001, 0x1372, 0x1642, 0xf002, - 0x2542, 0x2452, 0x2532, 0x2352, 0xf001, 0x1462, 0x1701, 0xf001, - 0x1442, 0x1522, 0xf001, 0x1252, 0x1501, 0xf001, 0x1342, 0x1332, - - /* huffTable12[185] */ - 0xf007, 0x0081, 0x008a, 0x008f, 0x0092, 0x0097, 0x009a, 0x009d, - 0x00a2, 0x00a5, 0x00a8, 0x7622, 0x7262, 0x7162, 0x00ad, 0x00b0, - 0x00b3, 0x7512, 0x7152, 0x7432, 0x7342, 0x00b6, 0x7422, 0x7242, - 0x7412, 0x6332, 0x6332, 0x6142, 0x6142, 0x6322, 0x6322, 0x6232, - 0x6232, 0x7041, 0x7301, 0x6031, 0x6031, 0x5312, 0x5312, 0x5312, - 0x5312, 0x5132, 0x5132, 0x5132, 0x5132, 0x5222, 0x5222, 0x5222, - 0x5222, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5021, 0x5021, 0x5021, - 0x5021, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0xf003, 0x3772, 0x3762, 0x2672, 0x2672, 0x2752, 0x2752, - 0x2572, 0x2572, 0xf002, 0x2662, 0x2742, 0x2472, 0x2562, 0xf001, - 0x1652, 0x1732, 0xf002, 0x2372, 0x2552, 0x1722, 0x1722, 0xf001, - 0x1272, 0x1642, 0xf001, 0x1462, 0x1712, 0xf002, 0x1172, 0x1172, - 0x2701, 0x2071, 0xf001, 0x1632, 0x1362, 0xf001, 0x1542, 0x1452, - 0xf002, 0x1442, 0x1442, 0x2601, 0x2501, 0xf001, 0x1612, 0x1061, - 0xf001, 0x1532, 0x1352, 0xf001, 0x1522, 0x1252, 0xf001, 0x1051, - 0x1401, - - /* huffTable13[497] */ - 0xf006, 0x0041, 0x0082, 0x00c3, 0x00e4, 0x0105, 0x0116, 0x011f, - 0x0130, 0x0139, 0x013e, 0x0143, 0x0146, 0x6212, 0x6122, 0x6201, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf006, 0x0108, 0x0111, 0x011a, 0x0123, 0x012c, 0x0131, - 0x0136, 0x013f, 0x0144, 0x0147, 0x014c, 0x0151, 0x0156, 0x015b, - 0x6f12, 0x61f2, 0x60f1, 0x0160, 0x0163, 0x0166, 0x62e2, 0x0169, - 0x6e12, 0x61e2, 0x016c, 0x016f, 0x0172, 0x0175, 0x0178, 0x017b, - 0x66c2, 0x6d32, 0x017e, 0x6d22, 0x62d2, 0x6d12, 0x67b2, 0x0181, - 0x0184, 0x63c2, 0x0187, 0x6b42, 0x51d2, 0x51d2, 0x6d01, 0x60d1, - 0x6a82, 0x68a2, 0x6c42, 0x64c2, 0x6b62, 0x66b2, 0x5c32, 0x5c32, - 0x5c22, 0x5c22, 0x52c2, 0x52c2, 0x5b52, 0x5b52, 0x65b2, 0x6982, - 0x5c12, 0x5c12, 0xf006, 0x51c2, 0x51c2, 0x6892, 0x6c01, 0x50c1, - 0x50c1, 0x64b2, 0x6a62, 0x66a2, 0x6972, 0x5b32, 0x5b32, 0x53b2, - 0x53b2, 0x6882, 0x6a52, 0x5b22, 0x5b22, 0x65a2, 0x6962, 0x54a2, - 0x54a2, 0x6872, 0x6782, 0x5492, 0x5492, 0x6772, 0x6672, 0x42b2, - 0x42b2, 0x42b2, 0x42b2, 0x4b12, 0x4b12, 0x4b12, 0x4b12, 0x41b2, - 0x41b2, 0x41b2, 0x41b2, 0x5b01, 0x5b01, 0x50b1, 0x50b1, 0x5692, - 0x5692, 0x5a42, 0x5a42, 0x5a32, 0x5a32, 0x53a2, 0x53a2, 0x5952, - 0x5952, 0x5592, 0x5592, 0x4a22, 0x4a22, 0x4a22, 0x4a22, 0x42a2, - 0x42a2, 0x42a2, 0x42a2, 0xf005, 0x4a12, 0x4a12, 0x41a2, 0x41a2, - 0x5a01, 0x5862, 0x40a1, 0x40a1, 0x5682, 0x5942, 0x4392, 0x4392, - 0x5932, 0x5852, 0x5582, 0x5762, 0x4922, 0x4922, 0x4292, 0x4292, - 0x5752, 0x5572, 0x4832, 0x4832, 0x4382, 0x4382, 0x5662, 0x5742, - 0x5472, 0x5652, 0x5562, 0x5372, 0xf005, 0x3912, 0x3912, 0x3912, - 0x3912, 0x3192, 0x3192, 0x3192, 0x3192, 0x4901, 0x4901, 0x4091, - 0x4091, 0x4842, 0x4842, 0x4482, 0x4482, 0x4272, 0x4272, 0x5642, - 0x5462, 0x3822, 0x3822, 0x3822, 0x3822, 0x3282, 0x3282, 0x3282, - 0x3282, 0x3812, 0x3812, 0x3812, 0x3812, 0xf004, 0x4732, 0x4722, - 0x3712, 0x3712, 0x3172, 0x3172, 0x4552, 0x4701, 0x4071, 0x4632, - 0x4362, 0x4542, 0x4452, 0x4622, 0x4262, 0x4532, 0xf003, 0x2182, - 0x2182, 0x3801, 0x3081, 0x3612, 0x3162, 0x3601, 0x3061, 0xf004, - 0x4352, 0x4442, 0x3522, 0x3522, 0x3252, 0x3252, 0x3501, 0x3501, - 0x2512, 0x2512, 0x2512, 0x2512, 0x2152, 0x2152, 0x2152, 0x2152, - 0xf003, 0x3432, 0x3342, 0x3051, 0x3422, 0x3242, 0x3332, 0x2412, - 0x2412, 0xf002, 0x1142, 0x1142, 0x2401, 0x2041, 0xf002, 0x2322, - 0x2232, 0x1312, 0x1312, 0xf001, 0x1132, 0x1301, 0xf001, 0x1031, - 0x1222, 0xf003, 0x0082, 0x008b, 0x008e, 0x0091, 0x0094, 0x0097, - 0x3ce2, 0x3dd2, 0xf003, 0x0093, 0x3eb2, 0x3be2, 0x3f92, 0x39f2, - 0x3ae2, 0x3db2, 0x3bd2, 0xf003, 0x3f82, 0x38f2, 0x3cc2, 0x008d, - 0x3e82, 0x0090, 0x27f2, 0x27f2, 0xf003, 0x2ad2, 0x2ad2, 0x3da2, - 0x3cb2, 0x3bc2, 0x36f2, 0x2f62, 0x2f62, 0xf002, 0x28e2, 0x2f52, - 0x2d92, 0x29d2, 0xf002, 0x25f2, 0x27e2, 0x2ca2, 0x2bb2, 0xf003, - 0x2f42, 0x2f42, 0x24f2, 0x24f2, 0x3ac2, 0x36e2, 0x23f2, 0x23f2, - 0xf002, 0x1f32, 0x1f32, 0x2d82, 0x28d2, 0xf001, 0x1f22, 0x12f2, - 0xf002, 0x2e62, 0x2c92, 0x1f01, 0x1f01, 0xf002, 0x29c2, 0x2e52, - 0x1ba2, 0x1ba2, 0xf002, 0x2d72, 0x27d2, 0x1e42, 0x1e42, 0xf002, - 0x28c2, 0x26d2, 0x1e32, 0x1e32, 0xf002, 0x19b2, 0x19b2, 0x2b92, - 0x2aa2, 0xf001, 0x1ab2, 0x15e2, 0xf001, 0x14e2, 0x1c82, 0xf001, - 0x1d62, 0x13e2, 0xf001, 0x1e22, 0x1e01, 0xf001, 0x10e1, 0x1d52, - 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, 0x1b82, - 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, 0xf001, - 0x13d2, 0x1b72, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1992, 0x1a72, - 0xf001, 0x17a2, 0x1792, 0xf003, 0x0023, 0x3df2, 0x2de2, 0x2de2, - 0x1ff2, 0x1ff2, 0x1ff2, 0x1ff2, 0xf001, 0x1fe2, 0x1fd2, 0xf001, - 0x1ee2, 0x1fc2, 0xf001, 0x1ed2, 0x1fb2, 0xf001, 0x1bf2, 0x1ec2, - 0xf002, 0x1cd2, 0x1cd2, 0x2fa2, 0x29e2, 0xf001, 0x1af2, 0x1dc2, - 0xf001, 0x1ea2, 0x1e92, 0xf001, 0x1f72, 0x1e72, 0xf001, 0x1ef2, - 0x1cf2, - - /* huffTable15[580] */ - 0xf008, 0x0101, 0x0122, 0x0143, 0x0154, 0x0165, 0x0176, 0x017f, - 0x0188, 0x0199, 0x01a2, 0x01ab, 0x01b4, 0x01bd, 0x01c2, 0x01cb, - 0x01d4, 0x01d9, 0x01de, 0x01e3, 0x01e8, 0x01ed, 0x01f2, 0x01f7, - 0x01fc, 0x0201, 0x0204, 0x0207, 0x020a, 0x020f, 0x0212, 0x0215, - 0x021a, 0x021d, 0x0220, 0x8192, 0x0223, 0x0226, 0x0229, 0x022c, - 0x022f, 0x8822, 0x8282, 0x8812, 0x8182, 0x0232, 0x0235, 0x0238, - 0x023b, 0x8722, 0x8272, 0x8462, 0x8712, 0x8552, 0x8172, 0x023e, - 0x8632, 0x8362, 0x8542, 0x8452, 0x8622, 0x8262, 0x8612, 0x0241, - 0x8532, 0x7162, 0x7162, 0x8352, 0x8442, 0x7522, 0x7522, 0x7252, - 0x7252, 0x7512, 0x7512, 0x7152, 0x7152, 0x8501, 0x8051, 0x7432, - 0x7432, 0x7342, 0x7342, 0x7422, 0x7422, 0x7242, 0x7242, 0x7332, - 0x7332, 0x6142, 0x6142, 0x6142, 0x6142, 0x7412, 0x7412, 0x7401, - 0x7401, 0x6322, 0x6322, 0x6322, 0x6322, 0x6232, 0x6232, 0x6232, - 0x6232, 0x7041, 0x7041, 0x7301, 0x7301, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6031, 0x6031, 0x6031, - 0x6031, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, - 0x5222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf005, 0x5ff2, 0x5fe2, 0x5ef2, 0x5fd2, 0x4ee2, 0x4ee2, - 0x5df2, 0x5fc2, 0x5cf2, 0x5ed2, 0x5de2, 0x5fb2, 0x4bf2, 0x4bf2, - 0x5ec2, 0x5ce2, 0x4dd2, 0x4dd2, 0x4fa2, 0x4fa2, 0x4af2, 0x4af2, - 0x4eb2, 0x4eb2, 0x4be2, 0x4be2, 0x4dc2, 0x4dc2, 0x4cd2, 0x4cd2, - 0x4f92, 0x4f92, 0xf005, 0x49f2, 0x49f2, 0x4ae2, 0x4ae2, 0x4db2, - 0x4db2, 0x4bd2, 0x4bd2, 0x4f82, 0x4f82, 0x48f2, 0x48f2, 0x4cc2, - 0x4cc2, 0x4e92, 0x4e92, 0x49e2, 0x49e2, 0x4f72, 0x4f72, 0x47f2, - 0x47f2, 0x4da2, 0x4da2, 0x4ad2, 0x4ad2, 0x4cb2, 0x4cb2, 0x4f62, - 0x4f62, 0x5ea2, 0x5f01, 0xf004, 0x3bc2, 0x3bc2, 0x36f2, 0x36f2, - 0x4e82, 0x48e2, 0x4f52, 0x4d92, 0x35f2, 0x35f2, 0x3e72, 0x3e72, - 0x37e2, 0x37e2, 0x3ca2, 0x3ca2, 0xf004, 0x3ac2, 0x3ac2, 0x3bb2, - 0x3bb2, 0x49d2, 0x4d82, 0x3f42, 0x3f42, 0x34f2, 0x34f2, 0x3f32, - 0x3f32, 0x33f2, 0x33f2, 0x38d2, 0x38d2, 0xf004, 0x36e2, 0x36e2, - 0x3f22, 0x3f22, 0x32f2, 0x32f2, 0x4e62, 0x40f1, 0x3f12, 0x3f12, - 0x31f2, 0x31f2, 0x3c92, 0x3c92, 0x39c2, 0x39c2, 0xf003, 0x3e52, - 0x3ba2, 0x3ab2, 0x35e2, 0x3d72, 0x37d2, 0x3e42, 0x34e2, 0xf003, - 0x3c82, 0x38c2, 0x3e32, 0x3d62, 0x36d2, 0x33e2, 0x3b92, 0x39b2, - 0xf004, 0x3e22, 0x3e22, 0x3aa2, 0x3aa2, 0x32e2, 0x32e2, 0x3e12, - 0x3e12, 0x31e2, 0x31e2, 0x4e01, 0x40e1, 0x3d52, 0x3d52, 0x35d2, - 0x35d2, 0xf003, 0x3c72, 0x37c2, 0x3d42, 0x3b82, 0x24d2, 0x24d2, - 0x38b2, 0x3a92, 0xf003, 0x39a2, 0x3c62, 0x36c2, 0x3d32, 0x23d2, - 0x23d2, 0x22d2, 0x22d2, 0xf003, 0x3d22, 0x3d01, 0x2d12, 0x2d12, - 0x2b72, 0x2b72, 0x27b2, 0x27b2, 0xf003, 0x21d2, 0x21d2, 0x3c52, - 0x30d1, 0x25c2, 0x25c2, 0x2a82, 0x2a82, 0xf002, 0x28a2, 0x2c42, - 0x24c2, 0x2b62, 0xf003, 0x26b2, 0x26b2, 0x3992, 0x3c01, 0x2c32, - 0x2c32, 0x23c2, 0x23c2, 0xf003, 0x2a72, 0x2a72, 0x27a2, 0x27a2, - 0x26a2, 0x26a2, 0x30c1, 0x3b01, 0xf002, 0x12c2, 0x12c2, 0x2c22, - 0x2b52, 0xf002, 0x25b2, 0x2c12, 0x2982, 0x2892, 0xf002, 0x21c2, - 0x2b42, 0x24b2, 0x2a62, 0xf002, 0x2b32, 0x2972, 0x13b2, 0x13b2, - 0xf002, 0x2792, 0x2882, 0x2b22, 0x2a52, 0xf002, 0x12b2, 0x12b2, - 0x25a2, 0x2b12, 0xf002, 0x11b2, 0x11b2, 0x20b1, 0x2962, 0xf002, - 0x2692, 0x2a42, 0x24a2, 0x2872, 0xf002, 0x2782, 0x2a32, 0x13a2, - 0x13a2, 0xf001, 0x1952, 0x1592, 0xf001, 0x1a22, 0x12a2, 0xf001, - 0x1a12, 0x11a2, 0xf002, 0x2a01, 0x20a1, 0x1862, 0x1862, 0xf001, - 0x1682, 0x1942, 0xf001, 0x1492, 0x1932, 0xf002, 0x1392, 0x1392, - 0x2772, 0x2901, 0xf001, 0x1852, 0x1582, 0xf001, 0x1922, 0x1762, - 0xf001, 0x1672, 0x1292, 0xf001, 0x1912, 0x1091, 0xf001, 0x1842, - 0x1482, 0xf001, 0x1752, 0x1572, 0xf001, 0x1832, 0x1382, 0xf001, - 0x1662, 0x1742, 0xf001, 0x1472, 0x1801, 0xf001, 0x1081, 0x1652, - 0xf001, 0x1562, 0x1732, 0xf001, 0x1372, 0x1642, 0xf001, 0x1701, - 0x1071, 0xf001, 0x1601, 0x1061, - - /* huffTable16[651] */ - 0xf008, 0x0101, 0x010a, 0x0113, 0x8ff2, 0x0118, 0x011d, 0x0120, - 0x82f2, 0x0131, 0x8f12, 0x81f2, 0x0134, 0x0145, 0x0156, 0x0167, - 0x0178, 0x0189, 0x019a, 0x01a3, 0x01ac, 0x01b5, 0x01be, 0x01c7, - 0x01d0, 0x01d9, 0x01de, 0x01e3, 0x01e6, 0x01eb, 0x01f0, 0x8152, - 0x01f3, 0x01f6, 0x01f9, 0x01fc, 0x8412, 0x8142, 0x01ff, 0x8322, - 0x8232, 0x7312, 0x7312, 0x7132, 0x7132, 0x8301, 0x8031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3fe2, 0x3ef2, 0x3fd2, 0x3df2, 0x3fc2, 0x3cf2, - 0x3fb2, 0x3bf2, 0xf003, 0x2fa2, 0x2fa2, 0x3af2, 0x3f92, 0x39f2, - 0x38f2, 0x2f82, 0x2f82, 0xf002, 0x2f72, 0x27f2, 0x2f62, 0x26f2, - 0xf002, 0x2f52, 0x25f2, 0x1f42, 0x1f42, 0xf001, 0x14f2, 0x13f2, - 0xf004, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, - 0x10f1, 0x2f32, 0x2f32, 0x2f32, 0x2f32, 0x00e2, 0x00f3, 0x00fc, - 0x0105, 0xf001, 0x1f22, 0x1f01, 0xf004, 0x00fa, 0x00ff, 0x0104, - 0x0109, 0x010c, 0x0111, 0x0116, 0x0119, 0x011e, 0x0123, 0x0128, - 0x43e2, 0x012d, 0x0130, 0x0133, 0x0136, 0xf004, 0x0128, 0x012b, - 0x012e, 0x4d01, 0x0131, 0x0134, 0x0137, 0x4c32, 0x013a, 0x4c12, - 0x40c1, 0x013d, 0x32e2, 0x32e2, 0x4e22, 0x4e12, 0xf004, 0x43d2, - 0x4d22, 0x42d2, 0x41d2, 0x4b32, 0x012f, 0x3d12, 0x3d12, 0x44c2, - 0x4b62, 0x43c2, 0x47a2, 0x3c22, 0x3c22, 0x42c2, 0x45b2, 0xf004, - 0x41c2, 0x4c01, 0x4b42, 0x44b2, 0x4a62, 0x46a2, 0x33b2, 0x33b2, - 0x4a52, 0x45a2, 0x3b22, 0x3b22, 0x32b2, 0x32b2, 0x3b12, 0x3b12, - 0xf004, 0x31b2, 0x31b2, 0x4b01, 0x40b1, 0x4962, 0x4692, 0x4a42, - 0x44a2, 0x4872, 0x4782, 0x33a2, 0x33a2, 0x4a32, 0x4952, 0x3a22, - 0x3a22, 0xf004, 0x4592, 0x4862, 0x31a2, 0x31a2, 0x4682, 0x4772, - 0x3492, 0x3492, 0x4942, 0x4752, 0x3762, 0x3762, 0x22a2, 0x22a2, - 0x22a2, 0x22a2, 0xf003, 0x2a12, 0x2a12, 0x3a01, 0x30a1, 0x3932, - 0x3392, 0x3852, 0x3582, 0xf003, 0x2922, 0x2922, 0x2292, 0x2292, - 0x3672, 0x3901, 0x2912, 0x2912, 0xf003, 0x2192, 0x2192, 0x3091, - 0x3842, 0x3482, 0x3572, 0x3832, 0x3382, 0xf003, 0x3662, 0x3822, - 0x2282, 0x2282, 0x3742, 0x3472, 0x2812, 0x2812, 0xf003, 0x2182, - 0x2182, 0x2081, 0x2081, 0x3801, 0x3652, 0x2732, 0x2732, 0xf003, - 0x2372, 0x2372, 0x3562, 0x3642, 0x2722, 0x2722, 0x2272, 0x2272, - 0xf003, 0x3462, 0x3552, 0x2701, 0x2701, 0x1712, 0x1712, 0x1712, - 0x1712, 0xf002, 0x1172, 0x1172, 0x2071, 0x2632, 0xf002, 0x2362, - 0x2542, 0x2452, 0x2622, 0xf001, 0x1262, 0x1612, 0xf002, 0x1162, - 0x1162, 0x2601, 0x2061, 0xf002, 0x1352, 0x1352, 0x2532, 0x2442, - 0xf001, 0x1522, 0x1252, 0xf001, 0x1512, 0x1501, 0xf001, 0x1432, - 0x1342, 0xf001, 0x1051, 0x1422, 0xf001, 0x1242, 0x1332, 0xf001, - 0x1401, 0x1041, 0xf004, 0x4ec2, 0x0086, 0x3ed2, 0x3ed2, 0x39e2, - 0x39e2, 0x4ae2, 0x49d2, 0x2ee2, 0x2ee2, 0x2ee2, 0x2ee2, 0x3de2, - 0x3de2, 0x3be2, 0x3be2, 0xf003, 0x2eb2, 0x2eb2, 0x2dc2, 0x2dc2, - 0x3cd2, 0x3bd2, 0x2ea2, 0x2ea2, 0xf003, 0x2cc2, 0x2cc2, 0x3da2, - 0x3ad2, 0x3e72, 0x3ca2, 0x2ac2, 0x2ac2, 0xf003, 0x39c2, 0x3d72, - 0x2e52, 0x2e52, 0x1db2, 0x1db2, 0x1db2, 0x1db2, 0xf002, 0x1e92, - 0x1e92, 0x2cb2, 0x2bc2, 0xf002, 0x2e82, 0x28e2, 0x2d92, 0x27e2, - 0xf002, 0x2bb2, 0x2d82, 0x28d2, 0x2e62, 0xf001, 0x16e2, 0x1c92, - 0xf002, 0x2ba2, 0x2ab2, 0x25e2, 0x27d2, 0xf002, 0x1e42, 0x1e42, - 0x24e2, 0x2c82, 0xf001, 0x18c2, 0x1e32, 0xf002, 0x1d62, 0x1d62, - 0x26d2, 0x2b92, 0xf002, 0x29b2, 0x2aa2, 0x11e2, 0x11e2, 0xf002, - 0x14d2, 0x14d2, 0x28b2, 0x29a2, 0xf002, 0x1b72, 0x1b72, 0x27b2, - 0x20d1, 0xf001, 0x1e01, 0x10e1, 0xf001, 0x1d52, 0x15d2, 0xf001, - 0x1c72, 0x17c2, 0xf001, 0x1d42, 0x1b82, 0xf001, 0x1a92, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1a82, - 0x18a2, 0xf001, 0x1992, 0x1c42, 0xf001, 0x16b2, 0x1a72, 0xf001, - 0x1b52, 0x1982, 0xf001, 0x1892, 0x1972, 0xf001, 0x1792, 0x1882, - 0xf001, 0x1ce2, 0x1dd2, - - /* huffTable24[705] */ - 0xf009, 0x8fe2, 0x8fe2, 0x8ef2, 0x8ef2, 0x8fd2, 0x8fd2, 0x8df2, - 0x8df2, 0x8fc2, 0x8fc2, 0x8cf2, 0x8cf2, 0x8fb2, 0x8fb2, 0x8bf2, - 0x8bf2, 0x7af2, 0x7af2, 0x7af2, 0x7af2, 0x8fa2, 0x8fa2, 0x8f92, - 0x8f92, 0x79f2, 0x79f2, 0x79f2, 0x79f2, 0x78f2, 0x78f2, 0x78f2, - 0x78f2, 0x8f82, 0x8f82, 0x8f72, 0x8f72, 0x77f2, 0x77f2, 0x77f2, - 0x77f2, 0x7f62, 0x7f62, 0x7f62, 0x7f62, 0x76f2, 0x76f2, 0x76f2, - 0x76f2, 0x7f52, 0x7f52, 0x7f52, 0x7f52, 0x75f2, 0x75f2, 0x75f2, - 0x75f2, 0x7f42, 0x7f42, 0x7f42, 0x7f42, 0x74f2, 0x74f2, 0x74f2, - 0x74f2, 0x7f32, 0x7f32, 0x7f32, 0x7f32, 0x73f2, 0x73f2, 0x73f2, - 0x73f2, 0x7f22, 0x7f22, 0x7f22, 0x7f22, 0x72f2, 0x72f2, 0x72f2, - 0x72f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x8f12, 0x8f12, 0x80f1, - 0x80f1, 0x9f01, 0x0201, 0x0206, 0x020b, 0x0210, 0x0215, 0x021a, - 0x021f, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x0224, 0x0229, 0x0232, 0x0237, 0x023a, 0x023f, 0x0242, - 0x0245, 0x024a, 0x024d, 0x0250, 0x0253, 0x0256, 0x0259, 0x025c, - 0x025f, 0x0262, 0x0265, 0x0268, 0x026b, 0x026e, 0x0271, 0x0274, - 0x0277, 0x027a, 0x027d, 0x0280, 0x0283, 0x0288, 0x028b, 0x028e, - 0x0291, 0x0294, 0x0297, 0x029a, 0x029f, 0x94b2, 0x02a4, 0x02a7, - 0x02aa, 0x93b2, 0x9882, 0x02af, 0x92b2, 0x02b2, 0x02b5, 0x9692, - 0x94a2, 0x02b8, 0x9782, 0x9a32, 0x93a2, 0x9952, 0x9592, 0x9a22, - 0x92a2, 0x91a2, 0x9862, 0x9682, 0x9772, 0x9942, 0x9492, 0x9932, - 0x9392, 0x9852, 0x9582, 0x9922, 0x9762, 0x9672, 0x9292, 0x9912, - 0x9192, 0x9842, 0x9482, 0x9752, 0x9572, 0x9832, 0x9382, 0x9662, - 0x9822, 0x9282, 0x9812, 0x9742, 0x9472, 0x9182, 0x02bb, 0x9652, - 0x9562, 0x9712, 0x02be, 0x8372, 0x8372, 0x9732, 0x9722, 0x8272, - 0x8272, 0x8642, 0x8642, 0x8462, 0x8462, 0x8552, 0x8552, 0x8172, - 0x8172, 0x8632, 0x8632, 0x8362, 0x8362, 0x8542, 0x8542, 0x8452, - 0x8452, 0x8622, 0x8622, 0x8262, 0x8262, 0x8612, 0x8612, 0x8162, - 0x8162, 0x9601, 0x9061, 0x8532, 0x8532, 0x8352, 0x8352, 0x8442, - 0x8442, 0x8522, 0x8522, 0x8252, 0x8252, 0x8512, 0x8512, 0x9501, - 0x9051, 0x7152, 0x7152, 0x7152, 0x7152, 0x8432, 0x8432, 0x8342, - 0x8342, 0x7422, 0x7422, 0x7422, 0x7422, 0x7242, 0x7242, 0x7242, - 0x7242, 0x7332, 0x7332, 0x7332, 0x7332, 0x7412, 0x7412, 0x7412, - 0x7412, 0x7142, 0x7142, 0x7142, 0x7142, 0x8401, 0x8401, 0x8041, - 0x8041, 0x7322, 0x7322, 0x7322, 0x7322, 0x7232, 0x7232, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7301, 0x7301, 0x7031, 0x7031, 0x7031, - 0x7031, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, - 0x6201, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0xf002, 0x2ee2, 0x2ed2, 0x2de2, 0x2ec2, 0xf002, 0x2ce2, - 0x2dd2, 0x2eb2, 0x2be2, 0xf002, 0x2dc2, 0x2cd2, 0x2ea2, 0x2ae2, - 0xf002, 0x2db2, 0x2bd2, 0x2cc2, 0x2e92, 0xf002, 0x29e2, 0x2da2, - 0x2ad2, 0x2cb2, 0xf002, 0x2bc2, 0x2e82, 0x28e2, 0x2d92, 0xf002, - 0x29d2, 0x2e72, 0x27e2, 0x2ca2, 0xf002, 0x2ac2, 0x2bb2, 0x2d82, - 0x28d2, 0xf003, 0x3e01, 0x30e1, 0x2d01, 0x2d01, 0x16e2, 0x16e2, - 0x16e2, 0x16e2, 0xf002, 0x2e62, 0x2c92, 0x19c2, 0x19c2, 0xf001, - 0x1e52, 0x1ab2, 0xf002, 0x15e2, 0x15e2, 0x2ba2, 0x2d72, 0xf001, - 0x17d2, 0x14e2, 0xf001, 0x1c82, 0x18c2, 0xf002, 0x2e42, 0x2e22, - 0x1e32, 0x1e32, 0xf001, 0x1d62, 0x16d2, 0xf001, 0x13e2, 0x1b92, - 0xf001, 0x19b2, 0x1aa2, 0xf001, 0x12e2, 0x1e12, 0xf001, 0x11e2, - 0x1d52, 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, - 0x1b82, 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x13d2, 0x1d22, 0xf001, 0x12d2, - 0x1d12, 0xf001, 0x1b72, 0x17b2, 0xf001, 0x11d2, 0x1c52, 0xf001, - 0x15c2, 0x1a82, 0xf001, 0x18a2, 0x1992, 0xf001, 0x1c42, 0x14c2, - 0xf001, 0x1b62, 0x16b2, 0xf002, 0x20d1, 0x2c01, 0x1c32, 0x1c32, - 0xf001, 0x13c2, 0x1a72, 0xf001, 0x17a2, 0x1c22, 0xf001, 0x12c2, - 0x1b52, 0xf001, 0x15b2, 0x1c12, 0xf001, 0x1982, 0x1892, 0xf001, - 0x11c2, 0x1b42, 0xf002, 0x20c1, 0x2b01, 0x1b32, 0x1b32, 0xf002, - 0x20b1, 0x2a01, 0x1a12, 0x1a12, 0xf001, 0x1a62, 0x16a2, 0xf001, - 0x1972, 0x1792, 0xf002, 0x20a1, 0x2901, 0x1091, 0x1091, 0xf001, - 0x1b22, 0x1a52, 0xf001, 0x15a2, 0x1b12, 0xf001, 0x11b2, 0x1962, - 0xf001, 0x1a42, 0x1872, 0xf001, 0x1801, 0x1081, 0xf001, 0x1701, - 0x1071, + /* huffTable01[9] */ + 0xf003, 0x3112, 0x3101, 0x2011, 0x2011, 0x1000, 0x1000, 0x1000, + 0x1000, + + /* huffTable02[65] */ + 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, + 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, + + /* huffTable03[65] */ + 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, + 0x5021, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, + 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, + 0x2101, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, + + /* huffTable05[257] */ + 0xf008, 0x8332, 0x8322, 0x7232, 0x7232, 0x6132, 0x6132, 0x6132, + 0x6132, 0x7312, 0x7312, 0x7301, 0x7301, 0x7031, 0x7031, 0x7222, + 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, + 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, + 0x6021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, + + /* huffTable06[129] */ + 0xf007, 0x7332, 0x7301, 0x6322, 0x6322, 0x6232, 0x6232, 0x6031, + 0x6031, 0x5312, 0x5312, 0x5312, 0x5312, 0x5132, 0x5132, 0x5132, + 0x5132, 0x5222, 0x5222, 0x5222, 0x5222, 0x5201, 0x5201, 0x5201, + 0x5201, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, + 0x4122, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, + 0x4021, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, + + /* huffTable07[110] */ + 0xf006, 0x0041, 0x0052, 0x005b, 0x0060, 0x0063, 0x0068, 0x006b, + 0x6212, 0x5122, 0x5122, 0x6201, 0x6021, 0x4112, 0x4112, 0x4112, + 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0xf004, 0x4552, 0x4542, 0x4452, 0x4352, 0x3532, 0x3532, + 0x3442, 0x3442, 0x3522, 0x3522, 0x3252, 0x3252, 0x2512, 0x2512, + 0x2512, 0x2512, 0xf003, 0x2152, 0x2152, 0x3501, 0x3432, 0x2051, + 0x2051, 0x3342, 0x3332, 0xf002, 0x2422, 0x2242, 0x1412, 0x1412, + 0xf001, 0x1142, 0x1041, 0xf002, 0x2401, 0x2322, 0x2232, 0x2301, + 0xf001, 0x1312, 0x1132, 0xf001, 0x1031, 0x1222, + + /* huffTable08[280] */ + 0xf008, 0x0101, 0x010a, 0x010f, 0x8512, 0x8152, 0x0112, 0x0115, + 0x8422, 0x8242, 0x8412, 0x7142, 0x7142, 0x8401, 0x8041, 0x8322, + 0x8232, 0x8312, 0x8132, 0x8301, 0x8031, 0x6222, 0x6222, 0x6222, + 0x6222, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, + 0x6021, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, + 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, + 0x4122, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, + 0x2112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0xf003, 0x3552, 0x3452, 0x2542, 0x2542, 0x1352, 0x1352, + 0x1352, 0x1352, 0xf002, 0x2532, 0x2442, 0x1522, 0x1522, 0xf001, + 0x1252, 0x1501, 0xf001, 0x1432, 0x1342, 0xf001, 0x1051, 0x1332, + + /* huffTable09[93] */ + 0xf006, 0x0041, 0x004a, 0x004f, 0x0052, 0x0057, 0x005a, 0x6412, + 0x6142, 0x6322, 0x6232, 0x5312, 0x5312, 0x5132, 0x5132, 0x6301, + 0x6031, 0x5222, 0x5222, 0x5201, 0x5201, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4021, 0x4021, 0x4021, + 0x4021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0xf003, 0x3552, 0x3542, 0x2532, 0x2532, 0x2352, 0x2352, + 0x3452, 0x3501, 0xf002, 0x2442, 0x2522, 0x2252, 0x2512, 0xf001, + 0x1152, 0x1432, 0xf002, 0x1342, 0x1342, 0x2051, 0x2401, 0xf001, + 0x1422, 0x1242, 0xf001, 0x1332, 0x1041, + + /* huffTable10[320] */ + 0xf008, 0x0101, 0x010a, 0x010f, 0x0118, 0x011b, 0x0120, 0x0125, + 0x8712, 0x8172, 0x012a, 0x012d, 0x0132, 0x8612, 0x8162, 0x8061, + 0x0137, 0x013a, 0x013d, 0x8412, 0x8142, 0x8041, 0x8322, 0x8232, + 0x8301, 0x7312, 0x7312, 0x7132, 0x7132, 0x7031, 0x7031, 0x7222, + 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, + 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, + 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0xf003, 0x3772, 0x3762, 0x3672, 0x3752, 0x3572, 0x3662, + 0x2742, 0x2742, 0xf002, 0x2472, 0x2652, 0x2562, 0x2732, 0xf003, + 0x2372, 0x2372, 0x2642, 0x2642, 0x3552, 0x3452, 0x2362, 0x2362, + 0xf001, 0x1722, 0x1272, 0xf002, 0x2462, 0x2701, 0x1071, 0x1071, + 0xf002, 0x1262, 0x1262, 0x2542, 0x2532, 0xf002, 0x1601, 0x1601, + 0x2352, 0x2442, 0xf001, 0x1632, 0x1622, 0xf002, 0x2522, 0x2252, + 0x1512, 0x1512, 0xf002, 0x1152, 0x1152, 0x2432, 0x2342, 0xf001, + 0x1501, 0x1051, 0xf001, 0x1422, 0x1242, 0xf001, 0x1332, 0x1401, + + /* huffTable11[296] */ + 0xf008, 0x0101, 0x0106, 0x010f, 0x0114, 0x0117, 0x8722, 0x8272, + 0x011c, 0x7172, 0x7172, 0x8712, 0x8071, 0x8632, 0x8362, 0x8061, + 0x011f, 0x0122, 0x8512, 0x7262, 0x7262, 0x8622, 0x8601, 0x7612, + 0x7612, 0x7162, 0x7162, 0x8152, 0x8432, 0x8051, 0x0125, 0x8422, + 0x8242, 0x8412, 0x8142, 0x8401, 0x8041, 0x7322, 0x7322, 0x7232, + 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6132, 0x6132, 0x6132, + 0x6132, 0x7301, 0x7301, 0x7031, 0x7031, 0x6222, 0x6222, 0x6222, + 0x6222, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, + 0x5122, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, + 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, + 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0xf002, 0x2772, 0x2762, 0x2672, 0x2572, 0xf003, 0x2662, + 0x2662, 0x2742, 0x2742, 0x2472, 0x2472, 0x3752, 0x3552, 0xf002, + 0x2652, 0x2562, 0x1732, 0x1732, 0xf001, 0x1372, 0x1642, 0xf002, + 0x2542, 0x2452, 0x2532, 0x2352, 0xf001, 0x1462, 0x1701, 0xf001, + 0x1442, 0x1522, 0xf001, 0x1252, 0x1501, 0xf001, 0x1342, 0x1332, + + /* huffTable12[185] */ + 0xf007, 0x0081, 0x008a, 0x008f, 0x0092, 0x0097, 0x009a, 0x009d, + 0x00a2, 0x00a5, 0x00a8, 0x7622, 0x7262, 0x7162, 0x00ad, 0x00b0, + 0x00b3, 0x7512, 0x7152, 0x7432, 0x7342, 0x00b6, 0x7422, 0x7242, + 0x7412, 0x6332, 0x6332, 0x6142, 0x6142, 0x6322, 0x6322, 0x6232, + 0x6232, 0x7041, 0x7301, 0x6031, 0x6031, 0x5312, 0x5312, 0x5312, + 0x5312, 0x5132, 0x5132, 0x5132, 0x5132, 0x5222, 0x5222, 0x5222, + 0x5222, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, + 0x4122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5021, 0x5021, 0x5021, + 0x5021, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, + 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0xf003, 0x3772, 0x3762, 0x2672, 0x2672, 0x2752, 0x2752, + 0x2572, 0x2572, 0xf002, 0x2662, 0x2742, 0x2472, 0x2562, 0xf001, + 0x1652, 0x1732, 0xf002, 0x2372, 0x2552, 0x1722, 0x1722, 0xf001, + 0x1272, 0x1642, 0xf001, 0x1462, 0x1712, 0xf002, 0x1172, 0x1172, + 0x2701, 0x2071, 0xf001, 0x1632, 0x1362, 0xf001, 0x1542, 0x1452, + 0xf002, 0x1442, 0x1442, 0x2601, 0x2501, 0xf001, 0x1612, 0x1061, + 0xf001, 0x1532, 0x1352, 0xf001, 0x1522, 0x1252, 0xf001, 0x1051, + 0x1401, + + /* huffTable13[497] */ + 0xf006, 0x0041, 0x0082, 0x00c3, 0x00e4, 0x0105, 0x0116, 0x011f, + 0x0130, 0x0139, 0x013e, 0x0143, 0x0146, 0x6212, 0x6122, 0x6201, + 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4101, 0x4101, 0x4101, + 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0xf006, 0x0108, 0x0111, 0x011a, 0x0123, 0x012c, 0x0131, + 0x0136, 0x013f, 0x0144, 0x0147, 0x014c, 0x0151, 0x0156, 0x015b, + 0x6f12, 0x61f2, 0x60f1, 0x0160, 0x0163, 0x0166, 0x62e2, 0x0169, + 0x6e12, 0x61e2, 0x016c, 0x016f, 0x0172, 0x0175, 0x0178, 0x017b, + 0x66c2, 0x6d32, 0x017e, 0x6d22, 0x62d2, 0x6d12, 0x67b2, 0x0181, + 0x0184, 0x63c2, 0x0187, 0x6b42, 0x51d2, 0x51d2, 0x6d01, 0x60d1, + 0x6a82, 0x68a2, 0x6c42, 0x64c2, 0x6b62, 0x66b2, 0x5c32, 0x5c32, + 0x5c22, 0x5c22, 0x52c2, 0x52c2, 0x5b52, 0x5b52, 0x65b2, 0x6982, + 0x5c12, 0x5c12, 0xf006, 0x51c2, 0x51c2, 0x6892, 0x6c01, 0x50c1, + 0x50c1, 0x64b2, 0x6a62, 0x66a2, 0x6972, 0x5b32, 0x5b32, 0x53b2, + 0x53b2, 0x6882, 0x6a52, 0x5b22, 0x5b22, 0x65a2, 0x6962, 0x54a2, + 0x54a2, 0x6872, 0x6782, 0x5492, 0x5492, 0x6772, 0x6672, 0x42b2, + 0x42b2, 0x42b2, 0x42b2, 0x4b12, 0x4b12, 0x4b12, 0x4b12, 0x41b2, + 0x41b2, 0x41b2, 0x41b2, 0x5b01, 0x5b01, 0x50b1, 0x50b1, 0x5692, + 0x5692, 0x5a42, 0x5a42, 0x5a32, 0x5a32, 0x53a2, 0x53a2, 0x5952, + 0x5952, 0x5592, 0x5592, 0x4a22, 0x4a22, 0x4a22, 0x4a22, 0x42a2, + 0x42a2, 0x42a2, 0x42a2, 0xf005, 0x4a12, 0x4a12, 0x41a2, 0x41a2, + 0x5a01, 0x5862, 0x40a1, 0x40a1, 0x5682, 0x5942, 0x4392, 0x4392, + 0x5932, 0x5852, 0x5582, 0x5762, 0x4922, 0x4922, 0x4292, 0x4292, + 0x5752, 0x5572, 0x4832, 0x4832, 0x4382, 0x4382, 0x5662, 0x5742, + 0x5472, 0x5652, 0x5562, 0x5372, 0xf005, 0x3912, 0x3912, 0x3912, + 0x3912, 0x3192, 0x3192, 0x3192, 0x3192, 0x4901, 0x4901, 0x4091, + 0x4091, 0x4842, 0x4842, 0x4482, 0x4482, 0x4272, 0x4272, 0x5642, + 0x5462, 0x3822, 0x3822, 0x3822, 0x3822, 0x3282, 0x3282, 0x3282, + 0x3282, 0x3812, 0x3812, 0x3812, 0x3812, 0xf004, 0x4732, 0x4722, + 0x3712, 0x3712, 0x3172, 0x3172, 0x4552, 0x4701, 0x4071, 0x4632, + 0x4362, 0x4542, 0x4452, 0x4622, 0x4262, 0x4532, 0xf003, 0x2182, + 0x2182, 0x3801, 0x3081, 0x3612, 0x3162, 0x3601, 0x3061, 0xf004, + 0x4352, 0x4442, 0x3522, 0x3522, 0x3252, 0x3252, 0x3501, 0x3501, + 0x2512, 0x2512, 0x2512, 0x2512, 0x2152, 0x2152, 0x2152, 0x2152, + 0xf003, 0x3432, 0x3342, 0x3051, 0x3422, 0x3242, 0x3332, 0x2412, + 0x2412, 0xf002, 0x1142, 0x1142, 0x2401, 0x2041, 0xf002, 0x2322, + 0x2232, 0x1312, 0x1312, 0xf001, 0x1132, 0x1301, 0xf001, 0x1031, + 0x1222, 0xf003, 0x0082, 0x008b, 0x008e, 0x0091, 0x0094, 0x0097, + 0x3ce2, 0x3dd2, 0xf003, 0x0093, 0x3eb2, 0x3be2, 0x3f92, 0x39f2, + 0x3ae2, 0x3db2, 0x3bd2, 0xf003, 0x3f82, 0x38f2, 0x3cc2, 0x008d, + 0x3e82, 0x0090, 0x27f2, 0x27f2, 0xf003, 0x2ad2, 0x2ad2, 0x3da2, + 0x3cb2, 0x3bc2, 0x36f2, 0x2f62, 0x2f62, 0xf002, 0x28e2, 0x2f52, + 0x2d92, 0x29d2, 0xf002, 0x25f2, 0x27e2, 0x2ca2, 0x2bb2, 0xf003, + 0x2f42, 0x2f42, 0x24f2, 0x24f2, 0x3ac2, 0x36e2, 0x23f2, 0x23f2, + 0xf002, 0x1f32, 0x1f32, 0x2d82, 0x28d2, 0xf001, 0x1f22, 0x12f2, + 0xf002, 0x2e62, 0x2c92, 0x1f01, 0x1f01, 0xf002, 0x29c2, 0x2e52, + 0x1ba2, 0x1ba2, 0xf002, 0x2d72, 0x27d2, 0x1e42, 0x1e42, 0xf002, + 0x28c2, 0x26d2, 0x1e32, 0x1e32, 0xf002, 0x19b2, 0x19b2, 0x2b92, + 0x2aa2, 0xf001, 0x1ab2, 0x15e2, 0xf001, 0x14e2, 0x1c82, 0xf001, + 0x1d62, 0x13e2, 0xf001, 0x1e22, 0x1e01, 0xf001, 0x10e1, 0x1d52, + 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, 0x1b82, + 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, 0xf001, + 0x13d2, 0x1b72, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1992, 0x1a72, + 0xf001, 0x17a2, 0x1792, 0xf003, 0x0023, 0x3df2, 0x2de2, 0x2de2, + 0x1ff2, 0x1ff2, 0x1ff2, 0x1ff2, 0xf001, 0x1fe2, 0x1fd2, 0xf001, + 0x1ee2, 0x1fc2, 0xf001, 0x1ed2, 0x1fb2, 0xf001, 0x1bf2, 0x1ec2, + 0xf002, 0x1cd2, 0x1cd2, 0x2fa2, 0x29e2, 0xf001, 0x1af2, 0x1dc2, + 0xf001, 0x1ea2, 0x1e92, 0xf001, 0x1f72, 0x1e72, 0xf001, 0x1ef2, + 0x1cf2, + + /* huffTable15[580] */ + 0xf008, 0x0101, 0x0122, 0x0143, 0x0154, 0x0165, 0x0176, 0x017f, + 0x0188, 0x0199, 0x01a2, 0x01ab, 0x01b4, 0x01bd, 0x01c2, 0x01cb, + 0x01d4, 0x01d9, 0x01de, 0x01e3, 0x01e8, 0x01ed, 0x01f2, 0x01f7, + 0x01fc, 0x0201, 0x0204, 0x0207, 0x020a, 0x020f, 0x0212, 0x0215, + 0x021a, 0x021d, 0x0220, 0x8192, 0x0223, 0x0226, 0x0229, 0x022c, + 0x022f, 0x8822, 0x8282, 0x8812, 0x8182, 0x0232, 0x0235, 0x0238, + 0x023b, 0x8722, 0x8272, 0x8462, 0x8712, 0x8552, 0x8172, 0x023e, + 0x8632, 0x8362, 0x8542, 0x8452, 0x8622, 0x8262, 0x8612, 0x0241, + 0x8532, 0x7162, 0x7162, 0x8352, 0x8442, 0x7522, 0x7522, 0x7252, + 0x7252, 0x7512, 0x7512, 0x7152, 0x7152, 0x8501, 0x8051, 0x7432, + 0x7432, 0x7342, 0x7342, 0x7422, 0x7422, 0x7242, 0x7242, 0x7332, + 0x7332, 0x6142, 0x6142, 0x6142, 0x6142, 0x7412, 0x7412, 0x7401, + 0x7401, 0x6322, 0x6322, 0x6322, 0x6322, 0x6232, 0x6232, 0x6232, + 0x6232, 0x7041, 0x7041, 0x7301, 0x7301, 0x6312, 0x6312, 0x6312, + 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6031, 0x6031, 0x6031, + 0x6031, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, + 0x5222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, + 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, + 0x5122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, + 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, + 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, + 0x3112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0xf005, 0x5ff2, 0x5fe2, 0x5ef2, 0x5fd2, 0x4ee2, 0x4ee2, + 0x5df2, 0x5fc2, 0x5cf2, 0x5ed2, 0x5de2, 0x5fb2, 0x4bf2, 0x4bf2, + 0x5ec2, 0x5ce2, 0x4dd2, 0x4dd2, 0x4fa2, 0x4fa2, 0x4af2, 0x4af2, + 0x4eb2, 0x4eb2, 0x4be2, 0x4be2, 0x4dc2, 0x4dc2, 0x4cd2, 0x4cd2, + 0x4f92, 0x4f92, 0xf005, 0x49f2, 0x49f2, 0x4ae2, 0x4ae2, 0x4db2, + 0x4db2, 0x4bd2, 0x4bd2, 0x4f82, 0x4f82, 0x48f2, 0x48f2, 0x4cc2, + 0x4cc2, 0x4e92, 0x4e92, 0x49e2, 0x49e2, 0x4f72, 0x4f72, 0x47f2, + 0x47f2, 0x4da2, 0x4da2, 0x4ad2, 0x4ad2, 0x4cb2, 0x4cb2, 0x4f62, + 0x4f62, 0x5ea2, 0x5f01, 0xf004, 0x3bc2, 0x3bc2, 0x36f2, 0x36f2, + 0x4e82, 0x48e2, 0x4f52, 0x4d92, 0x35f2, 0x35f2, 0x3e72, 0x3e72, + 0x37e2, 0x37e2, 0x3ca2, 0x3ca2, 0xf004, 0x3ac2, 0x3ac2, 0x3bb2, + 0x3bb2, 0x49d2, 0x4d82, 0x3f42, 0x3f42, 0x34f2, 0x34f2, 0x3f32, + 0x3f32, 0x33f2, 0x33f2, 0x38d2, 0x38d2, 0xf004, 0x36e2, 0x36e2, + 0x3f22, 0x3f22, 0x32f2, 0x32f2, 0x4e62, 0x40f1, 0x3f12, 0x3f12, + 0x31f2, 0x31f2, 0x3c92, 0x3c92, 0x39c2, 0x39c2, 0xf003, 0x3e52, + 0x3ba2, 0x3ab2, 0x35e2, 0x3d72, 0x37d2, 0x3e42, 0x34e2, 0xf003, + 0x3c82, 0x38c2, 0x3e32, 0x3d62, 0x36d2, 0x33e2, 0x3b92, 0x39b2, + 0xf004, 0x3e22, 0x3e22, 0x3aa2, 0x3aa2, 0x32e2, 0x32e2, 0x3e12, + 0x3e12, 0x31e2, 0x31e2, 0x4e01, 0x40e1, 0x3d52, 0x3d52, 0x35d2, + 0x35d2, 0xf003, 0x3c72, 0x37c2, 0x3d42, 0x3b82, 0x24d2, 0x24d2, + 0x38b2, 0x3a92, 0xf003, 0x39a2, 0x3c62, 0x36c2, 0x3d32, 0x23d2, + 0x23d2, 0x22d2, 0x22d2, 0xf003, 0x3d22, 0x3d01, 0x2d12, 0x2d12, + 0x2b72, 0x2b72, 0x27b2, 0x27b2, 0xf003, 0x21d2, 0x21d2, 0x3c52, + 0x30d1, 0x25c2, 0x25c2, 0x2a82, 0x2a82, 0xf002, 0x28a2, 0x2c42, + 0x24c2, 0x2b62, 0xf003, 0x26b2, 0x26b2, 0x3992, 0x3c01, 0x2c32, + 0x2c32, 0x23c2, 0x23c2, 0xf003, 0x2a72, 0x2a72, 0x27a2, 0x27a2, + 0x26a2, 0x26a2, 0x30c1, 0x3b01, 0xf002, 0x12c2, 0x12c2, 0x2c22, + 0x2b52, 0xf002, 0x25b2, 0x2c12, 0x2982, 0x2892, 0xf002, 0x21c2, + 0x2b42, 0x24b2, 0x2a62, 0xf002, 0x2b32, 0x2972, 0x13b2, 0x13b2, + 0xf002, 0x2792, 0x2882, 0x2b22, 0x2a52, 0xf002, 0x12b2, 0x12b2, + 0x25a2, 0x2b12, 0xf002, 0x11b2, 0x11b2, 0x20b1, 0x2962, 0xf002, + 0x2692, 0x2a42, 0x24a2, 0x2872, 0xf002, 0x2782, 0x2a32, 0x13a2, + 0x13a2, 0xf001, 0x1952, 0x1592, 0xf001, 0x1a22, 0x12a2, 0xf001, + 0x1a12, 0x11a2, 0xf002, 0x2a01, 0x20a1, 0x1862, 0x1862, 0xf001, + 0x1682, 0x1942, 0xf001, 0x1492, 0x1932, 0xf002, 0x1392, 0x1392, + 0x2772, 0x2901, 0xf001, 0x1852, 0x1582, 0xf001, 0x1922, 0x1762, + 0xf001, 0x1672, 0x1292, 0xf001, 0x1912, 0x1091, 0xf001, 0x1842, + 0x1482, 0xf001, 0x1752, 0x1572, 0xf001, 0x1832, 0x1382, 0xf001, + 0x1662, 0x1742, 0xf001, 0x1472, 0x1801, 0xf001, 0x1081, 0x1652, + 0xf001, 0x1562, 0x1732, 0xf001, 0x1372, 0x1642, 0xf001, 0x1701, + 0x1071, 0xf001, 0x1601, 0x1061, + + /* huffTable16[651] */ + 0xf008, 0x0101, 0x010a, 0x0113, 0x8ff2, 0x0118, 0x011d, 0x0120, + 0x82f2, 0x0131, 0x8f12, 0x81f2, 0x0134, 0x0145, 0x0156, 0x0167, + 0x0178, 0x0189, 0x019a, 0x01a3, 0x01ac, 0x01b5, 0x01be, 0x01c7, + 0x01d0, 0x01d9, 0x01de, 0x01e3, 0x01e6, 0x01eb, 0x01f0, 0x8152, + 0x01f3, 0x01f6, 0x01f9, 0x01fc, 0x8412, 0x8142, 0x01ff, 0x8322, + 0x8232, 0x7312, 0x7312, 0x7132, 0x7132, 0x8301, 0x8031, 0x7222, + 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, + 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, + 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, + 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x1000, 0xf003, 0x3fe2, 0x3ef2, 0x3fd2, 0x3df2, 0x3fc2, 0x3cf2, + 0x3fb2, 0x3bf2, 0xf003, 0x2fa2, 0x2fa2, 0x3af2, 0x3f92, 0x39f2, + 0x38f2, 0x2f82, 0x2f82, 0xf002, 0x2f72, 0x27f2, 0x2f62, 0x26f2, + 0xf002, 0x2f52, 0x25f2, 0x1f42, 0x1f42, 0xf001, 0x14f2, 0x13f2, + 0xf004, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, + 0x10f1, 0x2f32, 0x2f32, 0x2f32, 0x2f32, 0x00e2, 0x00f3, 0x00fc, + 0x0105, 0xf001, 0x1f22, 0x1f01, 0xf004, 0x00fa, 0x00ff, 0x0104, + 0x0109, 0x010c, 0x0111, 0x0116, 0x0119, 0x011e, 0x0123, 0x0128, + 0x43e2, 0x012d, 0x0130, 0x0133, 0x0136, 0xf004, 0x0128, 0x012b, + 0x012e, 0x4d01, 0x0131, 0x0134, 0x0137, 0x4c32, 0x013a, 0x4c12, + 0x40c1, 0x013d, 0x32e2, 0x32e2, 0x4e22, 0x4e12, 0xf004, 0x43d2, + 0x4d22, 0x42d2, 0x41d2, 0x4b32, 0x012f, 0x3d12, 0x3d12, 0x44c2, + 0x4b62, 0x43c2, 0x47a2, 0x3c22, 0x3c22, 0x42c2, 0x45b2, 0xf004, + 0x41c2, 0x4c01, 0x4b42, 0x44b2, 0x4a62, 0x46a2, 0x33b2, 0x33b2, + 0x4a52, 0x45a2, 0x3b22, 0x3b22, 0x32b2, 0x32b2, 0x3b12, 0x3b12, + 0xf004, 0x31b2, 0x31b2, 0x4b01, 0x40b1, 0x4962, 0x4692, 0x4a42, + 0x44a2, 0x4872, 0x4782, 0x33a2, 0x33a2, 0x4a32, 0x4952, 0x3a22, + 0x3a22, 0xf004, 0x4592, 0x4862, 0x31a2, 0x31a2, 0x4682, 0x4772, + 0x3492, 0x3492, 0x4942, 0x4752, 0x3762, 0x3762, 0x22a2, 0x22a2, + 0x22a2, 0x22a2, 0xf003, 0x2a12, 0x2a12, 0x3a01, 0x30a1, 0x3932, + 0x3392, 0x3852, 0x3582, 0xf003, 0x2922, 0x2922, 0x2292, 0x2292, + 0x3672, 0x3901, 0x2912, 0x2912, 0xf003, 0x2192, 0x2192, 0x3091, + 0x3842, 0x3482, 0x3572, 0x3832, 0x3382, 0xf003, 0x3662, 0x3822, + 0x2282, 0x2282, 0x3742, 0x3472, 0x2812, 0x2812, 0xf003, 0x2182, + 0x2182, 0x2081, 0x2081, 0x3801, 0x3652, 0x2732, 0x2732, 0xf003, + 0x2372, 0x2372, 0x3562, 0x3642, 0x2722, 0x2722, 0x2272, 0x2272, + 0xf003, 0x3462, 0x3552, 0x2701, 0x2701, 0x1712, 0x1712, 0x1712, + 0x1712, 0xf002, 0x1172, 0x1172, 0x2071, 0x2632, 0xf002, 0x2362, + 0x2542, 0x2452, 0x2622, 0xf001, 0x1262, 0x1612, 0xf002, 0x1162, + 0x1162, 0x2601, 0x2061, 0xf002, 0x1352, 0x1352, 0x2532, 0x2442, + 0xf001, 0x1522, 0x1252, 0xf001, 0x1512, 0x1501, 0xf001, 0x1432, + 0x1342, 0xf001, 0x1051, 0x1422, 0xf001, 0x1242, 0x1332, 0xf001, + 0x1401, 0x1041, 0xf004, 0x4ec2, 0x0086, 0x3ed2, 0x3ed2, 0x39e2, + 0x39e2, 0x4ae2, 0x49d2, 0x2ee2, 0x2ee2, 0x2ee2, 0x2ee2, 0x3de2, + 0x3de2, 0x3be2, 0x3be2, 0xf003, 0x2eb2, 0x2eb2, 0x2dc2, 0x2dc2, + 0x3cd2, 0x3bd2, 0x2ea2, 0x2ea2, 0xf003, 0x2cc2, 0x2cc2, 0x3da2, + 0x3ad2, 0x3e72, 0x3ca2, 0x2ac2, 0x2ac2, 0xf003, 0x39c2, 0x3d72, + 0x2e52, 0x2e52, 0x1db2, 0x1db2, 0x1db2, 0x1db2, 0xf002, 0x1e92, + 0x1e92, 0x2cb2, 0x2bc2, 0xf002, 0x2e82, 0x28e2, 0x2d92, 0x27e2, + 0xf002, 0x2bb2, 0x2d82, 0x28d2, 0x2e62, 0xf001, 0x16e2, 0x1c92, + 0xf002, 0x2ba2, 0x2ab2, 0x25e2, 0x27d2, 0xf002, 0x1e42, 0x1e42, + 0x24e2, 0x2c82, 0xf001, 0x18c2, 0x1e32, 0xf002, 0x1d62, 0x1d62, + 0x26d2, 0x2b92, 0xf002, 0x29b2, 0x2aa2, 0x11e2, 0x11e2, 0xf002, + 0x14d2, 0x14d2, 0x28b2, 0x29a2, 0xf002, 0x1b72, 0x1b72, 0x27b2, + 0x20d1, 0xf001, 0x1e01, 0x10e1, 0xf001, 0x1d52, 0x15d2, 0xf001, + 0x1c72, 0x17c2, 0xf001, 0x1d42, 0x1b82, 0xf001, 0x1a92, 0x1c62, + 0xf001, 0x16c2, 0x1d32, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1a82, + 0x18a2, 0xf001, 0x1992, 0x1c42, 0xf001, 0x16b2, 0x1a72, 0xf001, + 0x1b52, 0x1982, 0xf001, 0x1892, 0x1972, 0xf001, 0x1792, 0x1882, + 0xf001, 0x1ce2, 0x1dd2, + + /* huffTable24[705] */ + 0xf009, 0x8fe2, 0x8fe2, 0x8ef2, 0x8ef2, 0x8fd2, 0x8fd2, 0x8df2, + 0x8df2, 0x8fc2, 0x8fc2, 0x8cf2, 0x8cf2, 0x8fb2, 0x8fb2, 0x8bf2, + 0x8bf2, 0x7af2, 0x7af2, 0x7af2, 0x7af2, 0x8fa2, 0x8fa2, 0x8f92, + 0x8f92, 0x79f2, 0x79f2, 0x79f2, 0x79f2, 0x78f2, 0x78f2, 0x78f2, + 0x78f2, 0x8f82, 0x8f82, 0x8f72, 0x8f72, 0x77f2, 0x77f2, 0x77f2, + 0x77f2, 0x7f62, 0x7f62, 0x7f62, 0x7f62, 0x76f2, 0x76f2, 0x76f2, + 0x76f2, 0x7f52, 0x7f52, 0x7f52, 0x7f52, 0x75f2, 0x75f2, 0x75f2, + 0x75f2, 0x7f42, 0x7f42, 0x7f42, 0x7f42, 0x74f2, 0x74f2, 0x74f2, + 0x74f2, 0x7f32, 0x7f32, 0x7f32, 0x7f32, 0x73f2, 0x73f2, 0x73f2, + 0x73f2, 0x7f22, 0x7f22, 0x7f22, 0x7f22, 0x72f2, 0x72f2, 0x72f2, + 0x72f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x8f12, 0x8f12, 0x80f1, + 0x80f1, 0x9f01, 0x0201, 0x0206, 0x020b, 0x0210, 0x0215, 0x021a, + 0x021f, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, + 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, + 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, + 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, + 0x4ff2, 0x0224, 0x0229, 0x0232, 0x0237, 0x023a, 0x023f, 0x0242, + 0x0245, 0x024a, 0x024d, 0x0250, 0x0253, 0x0256, 0x0259, 0x025c, + 0x025f, 0x0262, 0x0265, 0x0268, 0x026b, 0x026e, 0x0271, 0x0274, + 0x0277, 0x027a, 0x027d, 0x0280, 0x0283, 0x0288, 0x028b, 0x028e, + 0x0291, 0x0294, 0x0297, 0x029a, 0x029f, 0x94b2, 0x02a4, 0x02a7, + 0x02aa, 0x93b2, 0x9882, 0x02af, 0x92b2, 0x02b2, 0x02b5, 0x9692, + 0x94a2, 0x02b8, 0x9782, 0x9a32, 0x93a2, 0x9952, 0x9592, 0x9a22, + 0x92a2, 0x91a2, 0x9862, 0x9682, 0x9772, 0x9942, 0x9492, 0x9932, + 0x9392, 0x9852, 0x9582, 0x9922, 0x9762, 0x9672, 0x9292, 0x9912, + 0x9192, 0x9842, 0x9482, 0x9752, 0x9572, 0x9832, 0x9382, 0x9662, + 0x9822, 0x9282, 0x9812, 0x9742, 0x9472, 0x9182, 0x02bb, 0x9652, + 0x9562, 0x9712, 0x02be, 0x8372, 0x8372, 0x9732, 0x9722, 0x8272, + 0x8272, 0x8642, 0x8642, 0x8462, 0x8462, 0x8552, 0x8552, 0x8172, + 0x8172, 0x8632, 0x8632, 0x8362, 0x8362, 0x8542, 0x8542, 0x8452, + 0x8452, 0x8622, 0x8622, 0x8262, 0x8262, 0x8612, 0x8612, 0x8162, + 0x8162, 0x9601, 0x9061, 0x8532, 0x8532, 0x8352, 0x8352, 0x8442, + 0x8442, 0x8522, 0x8522, 0x8252, 0x8252, 0x8512, 0x8512, 0x9501, + 0x9051, 0x7152, 0x7152, 0x7152, 0x7152, 0x8432, 0x8432, 0x8342, + 0x8342, 0x7422, 0x7422, 0x7422, 0x7422, 0x7242, 0x7242, 0x7242, + 0x7242, 0x7332, 0x7332, 0x7332, 0x7332, 0x7412, 0x7412, 0x7412, + 0x7412, 0x7142, 0x7142, 0x7142, 0x7142, 0x8401, 0x8401, 0x8041, + 0x8041, 0x7322, 0x7322, 0x7322, 0x7322, 0x7232, 0x7232, 0x7232, + 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, + 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, + 0x6132, 0x7301, 0x7301, 0x7301, 0x7301, 0x7031, 0x7031, 0x7031, + 0x7031, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, + 0x6222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, + 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, + 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, + 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, + 0x5122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, + 0x6201, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, + 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, + 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, + 0x4011, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0xf002, 0x2ee2, 0x2ed2, 0x2de2, 0x2ec2, 0xf002, 0x2ce2, + 0x2dd2, 0x2eb2, 0x2be2, 0xf002, 0x2dc2, 0x2cd2, 0x2ea2, 0x2ae2, + 0xf002, 0x2db2, 0x2bd2, 0x2cc2, 0x2e92, 0xf002, 0x29e2, 0x2da2, + 0x2ad2, 0x2cb2, 0xf002, 0x2bc2, 0x2e82, 0x28e2, 0x2d92, 0xf002, + 0x29d2, 0x2e72, 0x27e2, 0x2ca2, 0xf002, 0x2ac2, 0x2bb2, 0x2d82, + 0x28d2, 0xf003, 0x3e01, 0x30e1, 0x2d01, 0x2d01, 0x16e2, 0x16e2, + 0x16e2, 0x16e2, 0xf002, 0x2e62, 0x2c92, 0x19c2, 0x19c2, 0xf001, + 0x1e52, 0x1ab2, 0xf002, 0x15e2, 0x15e2, 0x2ba2, 0x2d72, 0xf001, + 0x17d2, 0x14e2, 0xf001, 0x1c82, 0x18c2, 0xf002, 0x2e42, 0x2e22, + 0x1e32, 0x1e32, 0xf001, 0x1d62, 0x16d2, 0xf001, 0x13e2, 0x1b92, + 0xf001, 0x19b2, 0x1aa2, 0xf001, 0x12e2, 0x1e12, 0xf001, 0x11e2, + 0x1d52, 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, + 0x1b82, 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, + 0xf001, 0x16c2, 0x1d32, 0xf001, 0x13d2, 0x1d22, 0xf001, 0x12d2, + 0x1d12, 0xf001, 0x1b72, 0x17b2, 0xf001, 0x11d2, 0x1c52, 0xf001, + 0x15c2, 0x1a82, 0xf001, 0x18a2, 0x1992, 0xf001, 0x1c42, 0x14c2, + 0xf001, 0x1b62, 0x16b2, 0xf002, 0x20d1, 0x2c01, 0x1c32, 0x1c32, + 0xf001, 0x13c2, 0x1a72, 0xf001, 0x17a2, 0x1c22, 0xf001, 0x12c2, + 0x1b52, 0xf001, 0x15b2, 0x1c12, 0xf001, 0x1982, 0x1892, 0xf001, + 0x11c2, 0x1b42, 0xf002, 0x20c1, 0x2b01, 0x1b32, 0x1b32, 0xf002, + 0x20b1, 0x2a01, 0x1a12, 0x1a12, 0xf001, 0x1a62, 0x16a2, 0xf001, + 0x1972, 0x1792, 0xf002, 0x20a1, 0x2901, 0x1091, 0x1091, 0xf001, + 0x1b22, 0x1a52, 0xf001, 0x15a2, 0x1b12, 0xf001, 0x11b2, 0x1962, + 0xf001, 0x1a42, 0x1872, 0xf001, 0x1801, 0x1081, 0xf001, 0x1701, + 0x1071, }; #define HUFF_OFFSET_01 0 @@ -663,93 +663,93 @@ const unsigned short huffTable[] PROGMEM = { #define HUFF_OFFSET_24 (651 + HUFF_OFFSET_16) const int huffTabOffset[HUFF_PAIRTABS] PROGMEM = { - 0, - HUFF_OFFSET_01, - HUFF_OFFSET_02, - HUFF_OFFSET_03, - 0, - HUFF_OFFSET_05, - HUFF_OFFSET_06, - HUFF_OFFSET_07, - HUFF_OFFSET_08, - HUFF_OFFSET_09, - HUFF_OFFSET_10, - HUFF_OFFSET_11, - HUFF_OFFSET_12, - HUFF_OFFSET_13, - 0, - HUFF_OFFSET_15, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, + 0, + HUFF_OFFSET_01, + HUFF_OFFSET_02, + HUFF_OFFSET_03, + 0, + HUFF_OFFSET_05, + HUFF_OFFSET_06, + HUFF_OFFSET_07, + HUFF_OFFSET_08, + HUFF_OFFSET_09, + HUFF_OFFSET_10, + HUFF_OFFSET_11, + HUFF_OFFSET_12, + HUFF_OFFSET_13, + 0, + HUFF_OFFSET_15, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_16, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, + HUFF_OFFSET_24, }; const HuffTabLookup huffTabLookup[HUFF_PAIRTABS] PROGMEM = { - { 0, noBits }, - { 0, oneShot }, - { 0, oneShot }, - { 0, oneShot }, - { 0, invalidTab }, - { 0, oneShot }, - { 0, oneShot }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, invalidTab }, - { 0, loopNoLinbits }, - { 1, loopLinbits }, - { 2, loopLinbits }, - { 3, loopLinbits }, - { 4, loopLinbits }, - { 6, loopLinbits }, - { 8, loopLinbits }, - { 10, loopLinbits }, - { 13, loopLinbits }, - { 4, loopLinbits }, - { 5, loopLinbits }, - { 6, loopLinbits }, - { 7, loopLinbits }, - { 8, loopLinbits }, - { 9, loopLinbits }, - { 11, loopLinbits }, - { 13, loopLinbits }, + { 0, noBits }, + { 0, oneShot }, + { 0, oneShot }, + { 0, oneShot }, + { 0, invalidTab }, + { 0, oneShot }, + { 0, oneShot }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, loopNoLinbits }, + { 0, invalidTab }, + { 0, loopNoLinbits }, + { 1, loopLinbits }, + { 2, loopLinbits }, + { 3, loopLinbits }, + { 4, loopLinbits }, + { 6, loopLinbits }, + { 8, loopLinbits }, + { 10, loopLinbits }, + { 13, loopLinbits }, + { 4, loopLinbits }, + { 5, loopLinbits }, + { 6, loopLinbits }, + { 7, loopLinbits }, + { 8, loopLinbits }, + { 9, loopLinbits }, + { 11, loopLinbits }, + { 13, loopLinbits }, }; -/* tables for quadruples - * format 0xAB - * A = length of codeword - * B = codeword - */ -const unsigned char quadTable[64+16] PROGMEM = { - /* table A */ - 0x6b, 0x6f, 0x6d, 0x6e, 0x67, 0x65, 0x59, 0x59, - 0x56, 0x56, 0x53, 0x53, 0x5a, 0x5a, 0x5c, 0x5c, - 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x41, - 0x44, 0x44, 0x44, 0x44, 0x48, 0x48, 0x48, 0x48, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - /* table B */ - 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, - 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, +/* tables for quadruples + format 0xAB + A = length of codeword + B = codeword +*/ +const unsigned char quadTable[64 + 16] PROGMEM = { + /* table A */ + 0x6b, 0x6f, 0x6d, 0x6e, 0x67, 0x65, 0x59, 0x59, + 0x56, 0x56, 0x53, 0x53, 0x5a, 0x5a, 0x5c, 0x5c, + 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x41, + 0x44, 0x44, 0x44, 0x44, 0x48, 0x48, 0x48, 0x48, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + /* table B */ + 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, + 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, }; const int quadTabOffset[2] PROGMEM = {0, 64}; diff --git a/src/libhelix-mp3/imdct.c b/src/libhelix-mp3/imdct.c index e24c50ae..3761ab59 100644 --- a/src/libhelix-mp3/imdct.c +++ b/src/libhelix-mp3/imdct.c @@ -1,45 +1,45 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * imdct.c - antialias, inverse transform (short/long/mixed), windowing, - * overlap-add, frequency inversion + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + imdct.c - antialias, inverse transform (short/long/mixed), windowing, + overlap-add, frequency inversion **************************************************************************************/ #include "coder.h" @@ -47,204 +47,201 @@ #include /************************************************************************************** - * Function: AntiAlias - * - * Description: smooth transition across DCT block boundaries (every 18 coefficients) - * - * Inputs: vector of dequantized coefficients, length = (nBfly+1) * 18 - * number of "butterflies" to perform (one butterfly means one - * inter-block smoothing operation) - * - * Outputs: updated coefficient vector x - * - * Return: none - * - * Notes: weighted average of opposite bands (pairwise) from the 8 samples - * before and after each block boundary - * nBlocks = (nonZeroBound + 7) / 18, since nZB is the first ZERO sample - * above which all other samples are also zero - * max gain per sample = 1.372 - * MAX(i) (abs(csa[i][0]) + abs(csa[i][1])) - * bits gained = 0 - * assume at least 1 guard bit in x[] to avoid overflow - * (should be guaranteed from dequant, and max gain from stproc * max - * gain from AntiAlias < 2.0) + Function: AntiAlias + + Description: smooth transition across DCT block boundaries (every 18 coefficients) + + Inputs: vector of dequantized coefficients, length = (nBfly+1) * 18 + number of "butterflies" to perform (one butterfly means one + inter-block smoothing operation) + + Outputs: updated coefficient vector x + + Return: none + + Notes: weighted average of opposite bands (pairwise) from the 8 samples + before and after each block boundary + nBlocks = (nonZeroBound + 7) / 18, since nZB is the first ZERO sample + above which all other samples are also zero + max gain per sample = 1.372 + MAX(i) (abs(csa[i][0]) + abs(csa[i][1])) + bits gained = 0 + assume at least 1 guard bit in x[] to avoid overflow + (should be guaranteed from dequant, and max gain from stproc * max + gain from AntiAlias < 2.0) **************************************************************************************/ // a little bit faster in RAM (< 1 ms per block) -/* __attribute__ ((section (".data"))) */ static void AntiAlias(int *x, int nBfly) -{ - int k, a0, b0, c0, c1; - const int *c; - - /* csa = Q31 */ - for (k = nBfly; k > 0; k--) { - c = csa[0]; - x += 18; - - a0 = x[-1]; c0 = *c; c++; b0 = x[0]; c1 = *c; c++; - x[-1] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[0] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-2]; c0 = *c; c++; b0 = x[1]; c1 = *c; c++; - x[-2] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[1] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-3]; c0 = *c; c++; b0 = x[2]; c1 = *c; c++; - x[-3] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[2] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-4]; c0 = *c; c++; b0 = x[3]; c1 = *c; c++; - x[-4] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[3] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-5]; c0 = *c; c++; b0 = x[4]; c1 = *c; c++; - x[-5] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[4] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-6]; c0 = *c; c++; b0 = x[5]; c1 = *c; c++; - x[-6] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[5] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-7]; c0 = *c; c++; b0 = x[6]; c1 = *c; c++; - x[-7] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[6] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-8]; c0 = *c; c++; b0 = x[7]; c1 = *c; c++; - x[-8] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[7] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - } +/* __attribute__ ((section (".data"))) */ static void AntiAlias(int *x, int nBfly) { + int k, a0, b0, c0, c1; + const int *c; + + /* csa = Q31 */ + for (k = nBfly; k > 0; k--) { + c = csa[0]; + x += 18; + + a0 = x[-1]; c0 = *c; c++; b0 = x[0]; c1 = *c; c++; + x[-1] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[0] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-2]; c0 = *c; c++; b0 = x[1]; c1 = *c; c++; + x[-2] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[1] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-3]; c0 = *c; c++; b0 = x[2]; c1 = *c; c++; + x[-3] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[2] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-4]; c0 = *c; c++; b0 = x[3]; c1 = *c; c++; + x[-4] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[3] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-5]; c0 = *c; c++; b0 = x[4]; c1 = *c; c++; + x[-5] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[4] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-6]; c0 = *c; c++; b0 = x[5]; c1 = *c; c++; + x[-6] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[5] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-7]; c0 = *c; c++; b0 = x[6]; c1 = *c; c++; + x[-7] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[6] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + + a0 = x[-8]; c0 = *c; c++; b0 = x[7]; c1 = *c; c++; + x[-8] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; + x[7] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; + } } /************************************************************************************** - * Function: WinPrevious - * - * Description: apply specified window to second half of previous IMDCT (overlap part) - * - * Inputs: vector of 9 coefficients (xPrev) - * - * Outputs: 18 windowed output coefficients (gain 1 integer bit) - * window type (0, 1, 2, 3) - * - * Return: none - * - * Notes: produces 9 output samples from 18 input samples via symmetry - * all blocks gain at least 1 guard bit via window (long blocks get extra - * sign bit, short blocks can have one addition but max gain < 1.0) + Function: WinPrevious + + Description: apply specified window to second half of previous IMDCT (overlap part) + + Inputs: vector of 9 coefficients (xPrev) + + Outputs: 18 windowed output coefficients (gain 1 integer bit) + window type (0, 1, 2, 3) + + Return: none + + Notes: produces 9 output samples from 18 input samples via symmetry + all blocks gain at least 1 guard bit via window (long blocks get extra + sign bit, short blocks can have one addition but max gain < 1.0) **************************************************************************************/ -/*__attribute__ ((section (".data"))) */ static void WinPrevious(int *xPrev, int *xPrevWin, int btPrev) -{ - int i, x, *xp, *xpwLo, *xpwHi, wLo, wHi; - const int *wpLo, *wpHi; - - xp = xPrev; - /* mapping (see IMDCT12x3): xPrev[0-2] = sum[6-8], xPrev[3-8] = sum[12-17] */ - if (btPrev == 2) { - /* this could be reordered for minimum loads/stores */ - wpLo = imdctWin[btPrev]; - xPrevWin[ 0] = MULSHIFT32(wpLo[ 6], xPrev[2]) + MULSHIFT32(wpLo[0], xPrev[6]); - xPrevWin[ 1] = MULSHIFT32(wpLo[ 7], xPrev[1]) + MULSHIFT32(wpLo[1], xPrev[7]); - xPrevWin[ 2] = MULSHIFT32(wpLo[ 8], xPrev[0]) + MULSHIFT32(wpLo[2], xPrev[8]); - xPrevWin[ 3] = MULSHIFT32(wpLo[ 9], xPrev[0]) + MULSHIFT32(wpLo[3], xPrev[8]); - xPrevWin[ 4] = MULSHIFT32(wpLo[10], xPrev[1]) + MULSHIFT32(wpLo[4], xPrev[7]); - xPrevWin[ 5] = MULSHIFT32(wpLo[11], xPrev[2]) + MULSHIFT32(wpLo[5], xPrev[6]); - xPrevWin[ 6] = MULSHIFT32(wpLo[ 6], xPrev[5]); - xPrevWin[ 7] = MULSHIFT32(wpLo[ 7], xPrev[4]); - xPrevWin[ 8] = MULSHIFT32(wpLo[ 8], xPrev[3]); - xPrevWin[ 9] = MULSHIFT32(wpLo[ 9], xPrev[3]); - xPrevWin[10] = MULSHIFT32(wpLo[10], xPrev[4]); - xPrevWin[11] = MULSHIFT32(wpLo[11], xPrev[5]); - xPrevWin[12] = xPrevWin[13] = xPrevWin[14] = xPrevWin[15] = xPrevWin[16] = xPrevWin[17] = 0; - } else { - /* use ARM-style pointers (*ptr++) so that ADS compiles well */ - wpLo = imdctWin[btPrev] + 18; - wpHi = wpLo + 17; - xpwLo = xPrevWin; - xpwHi = xPrevWin + 17; - for (i = 9; i > 0; i--) { - x = *xp++; wLo = *wpLo++; wHi = *wpHi--; - *xpwLo++ = MULSHIFT32(wLo, x); - *xpwHi-- = MULSHIFT32(wHi, x); - } - } +/*__attribute__ ((section (".data"))) */ static void WinPrevious(int *xPrev, int *xPrevWin, int btPrev) { + int i, x, *xp, *xpwLo, *xpwHi, wLo, wHi; + const int *wpLo, *wpHi; + + xp = xPrev; + /* mapping (see IMDCT12x3): xPrev[0-2] = sum[6-8], xPrev[3-8] = sum[12-17] */ + if (btPrev == 2) { + /* this could be reordered for minimum loads/stores */ + wpLo = imdctWin[btPrev]; + xPrevWin[ 0] = MULSHIFT32(wpLo[ 6], xPrev[2]) + MULSHIFT32(wpLo[0], xPrev[6]); + xPrevWin[ 1] = MULSHIFT32(wpLo[ 7], xPrev[1]) + MULSHIFT32(wpLo[1], xPrev[7]); + xPrevWin[ 2] = MULSHIFT32(wpLo[ 8], xPrev[0]) + MULSHIFT32(wpLo[2], xPrev[8]); + xPrevWin[ 3] = MULSHIFT32(wpLo[ 9], xPrev[0]) + MULSHIFT32(wpLo[3], xPrev[8]); + xPrevWin[ 4] = MULSHIFT32(wpLo[10], xPrev[1]) + MULSHIFT32(wpLo[4], xPrev[7]); + xPrevWin[ 5] = MULSHIFT32(wpLo[11], xPrev[2]) + MULSHIFT32(wpLo[5], xPrev[6]); + xPrevWin[ 6] = MULSHIFT32(wpLo[ 6], xPrev[5]); + xPrevWin[ 7] = MULSHIFT32(wpLo[ 7], xPrev[4]); + xPrevWin[ 8] = MULSHIFT32(wpLo[ 8], xPrev[3]); + xPrevWin[ 9] = MULSHIFT32(wpLo[ 9], xPrev[3]); + xPrevWin[10] = MULSHIFT32(wpLo[10], xPrev[4]); + xPrevWin[11] = MULSHIFT32(wpLo[11], xPrev[5]); + xPrevWin[12] = xPrevWin[13] = xPrevWin[14] = xPrevWin[15] = xPrevWin[16] = xPrevWin[17] = 0; + } else { + /* use ARM-style pointers (*ptr++) so that ADS compiles well */ + wpLo = imdctWin[btPrev] + 18; + wpHi = wpLo + 17; + xpwLo = xPrevWin; + xpwHi = xPrevWin + 17; + for (i = 9; i > 0; i--) { + x = *xp++; wLo = *wpLo++; wHi = *wpHi--; + *xpwLo++ = MULSHIFT32(wLo, x); + *xpwHi-- = MULSHIFT32(wHi, x); + } + } } /************************************************************************************** - * Function: FreqInvertRescale - * - * Description: do frequency inversion (odd samples of odd blocks) and rescale - * if necessary (extra guard bits added before IMDCT) - * - * Inputs: output vector y (18 new samples, spaced NBANDS apart) - * previous sample vector xPrev (9 samples) - * index of current block - * number of extra shifts added before IMDCT (usually 0) - * - * Outputs: inverted and rescaled (as necessary) outputs - * rescaled (as necessary) previous samples - * - * Return: updated mOut (from new outputs y) + Function: FreqInvertRescale + + Description: do frequency inversion (odd samples of odd blocks) and rescale + if necessary (extra guard bits added before IMDCT) + + Inputs: output vector y (18 new samples, spaced NBANDS apart) + previous sample vector xPrev (9 samples) + index of current block + number of extra shifts added before IMDCT (usually 0) + + Outputs: inverted and rescaled (as necessary) outputs + rescaled (as necessary) previous samples + + Return: updated mOut (from new outputs y) **************************************************************************************/ -/*__attribute__ ((section (".data")))*/ static int FreqInvertRescale(int *y, int *xPrev, int blockIdx, int es) -{ - int i, d, mOut; - int y0, y1, y2, y3, y4, y5, y6, y7, y8; - - if (es == 0) { - /* fast case - frequency invert only (no rescaling) - can fuse into overlap-add for speed, if desired */ - if (blockIdx & 0x01) { - y += NBANDS; - y0 = *y; y += 2*NBANDS; - y1 = *y; y += 2*NBANDS; - y2 = *y; y += 2*NBANDS; - y3 = *y; y += 2*NBANDS; - y4 = *y; y += 2*NBANDS; - y5 = *y; y += 2*NBANDS; - y6 = *y; y += 2*NBANDS; - y7 = *y; y += 2*NBANDS; - y8 = *y; y += 2*NBANDS; - - y -= 18*NBANDS; - *y = -y0; y += 2*NBANDS; - *y = -y1; y += 2*NBANDS; - *y = -y2; y += 2*NBANDS; - *y = -y3; y += 2*NBANDS; - *y = -y4; y += 2*NBANDS; - *y = -y5; y += 2*NBANDS; - *y = -y6; y += 2*NBANDS; - *y = -y7; y += 2*NBANDS; - *y = -y8; y += 2*NBANDS; - } - return 0; - } else { - /* undo pre-IMDCT scaling, clipping if necessary */ - mOut = 0; - if (blockIdx & 0x01) { - /* frequency invert */ - for (i = 0; i < 18; i+=2) { - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = -*y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; - } - } else { - for (i = 0; i < 18; i+=2) { - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; - } - } - return mOut; - } +/*__attribute__ ((section (".data")))*/ static int FreqInvertRescale(int *y, int *xPrev, int blockIdx, int es) { + int i, d, mOut; + int y0, y1, y2, y3, y4, y5, y6, y7, y8; + + if (es == 0) { + /* fast case - frequency invert only (no rescaling) - can fuse into overlap-add for speed, if desired */ + if (blockIdx & 0x01) { + y += NBANDS; + y0 = *y; y += 2 * NBANDS; + y1 = *y; y += 2 * NBANDS; + y2 = *y; y += 2 * NBANDS; + y3 = *y; y += 2 * NBANDS; + y4 = *y; y += 2 * NBANDS; + y5 = *y; y += 2 * NBANDS; + y6 = *y; y += 2 * NBANDS; + y7 = *y; y += 2 * NBANDS; + y8 = *y; y += 2 * NBANDS; + + y -= 18 * NBANDS; + *y = -y0; y += 2 * NBANDS; + *y = -y1; y += 2 * NBANDS; + *y = -y2; y += 2 * NBANDS; + *y = -y3; y += 2 * NBANDS; + *y = -y4; y += 2 * NBANDS; + *y = -y5; y += 2 * NBANDS; + *y = -y6; y += 2 * NBANDS; + *y = -y7; y += 2 * NBANDS; + *y = -y8; y += 2 * NBANDS; + } + return 0; + } else { + /* undo pre-IMDCT scaling, clipping if necessary */ + mOut = 0; + if (blockIdx & 0x01) { + /* frequency invert */ + for (i = 0; i < 18; i += 2) { + d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; + d = -*y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; + d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; + } + } else { + for (i = 0; i < 18; i += 2) { + d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; + d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; + d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; + } + } + return mOut; + } } -/* format = Q31 - * #define M_PI 3.14159265358979323846 - * double u = 2.0 * M_PI / 9.0; - * float c0 = sqrt(3.0) / 2.0; - * float c1 = cos(u); - * float c2 = cos(2*u); - * float c3 = sin(u); - * float c4 = sin(2*u); - */ +/* format = Q31 + #define M_PI 3.14159265358979323846 + double u = 2.0 * M_PI / 9.0; + float c0 = sqrt(3.0) / 2.0; + float c1 = cos(u); + float c2 = cos(2*u); + float c3 = sin(u); + float c4 = sin(2*u); +*/ static const int c9_0 = 0x6ed9eba1; static const int c9_1 = 0x620dbe8b; @@ -252,536 +249,539 @@ static const int c9_2 = 0x163a1a7e; static const int c9_3 = 0x5246dd49; static const int c9_4 = 0x7e0e2e32; -/* format = Q31 - * cos(((0:8) + 0.5) * (pi/18)) - */ +/* format = Q31 + cos(((0:8) + 0.5) * (pi/18)) +*/ static const int c18[9] PROGMEM = { - 0x7f834ed0, 0x7ba3751d, 0x7401e4c1, 0x68d9f964, 0x5a82799a, 0x496af3e2, 0x36185aee, 0x2120fb83, 0x0b27eb5c, + 0x7f834ed0, 0x7ba3751d, 0x7401e4c1, 0x68d9f964, 0x5a82799a, 0x496af3e2, 0x36185aee, 0x2120fb83, 0x0b27eb5c, }; /* require at least 3 guard bits in x[] to ensure no overflow */ -static __inline void idct9(int *x) -{ - int a1, a2, a3, a4, a5, a6, a7, a8, a9; - int a10, a11, a12, a13, a14, a15, a16, a17, a18; - int a19, a20, a21, a22, a23, a24, a25, a26, a27; - int m1, m3, m5, m6, m7, m8, m9, m10, m11, m12; - int x0, x1, x2, x3, x4, x5, x6, x7, x8; - - x0 = x[0]; x1 = x[1]; x2 = x[2]; x3 = x[3]; x4 = x[4]; - x5 = x[5]; x6 = x[6]; x7 = x[7]; x8 = x[8]; - - a1 = x0 - x6; - a2 = x1 - x5; - a3 = x1 + x5; - a4 = x2 - x4; - a5 = x2 + x4; - a6 = x2 + x8; - a7 = x1 + x7; - - a8 = a6 - a5; /* ie x[8] - x[4] */ - a9 = a3 - a7; /* ie x[5] - x[7] */ - a10 = a2 - x7; /* ie x[1] - x[5] - x[7] */ - a11 = a4 - x8; /* ie x[2] - x[4] - x[8] */ - - /* do the << 1 as constant shifts where mX is actually used (free, no stall or extra inst.) */ - m1 = MULSHIFT32(c9_0, x3); - m3 = MULSHIFT32(c9_0, a10); - m5 = MULSHIFT32(c9_1, a5); - m6 = MULSHIFT32(c9_2, a6); - m7 = MULSHIFT32(c9_1, a8); - m8 = MULSHIFT32(c9_2, a5); - m9 = MULSHIFT32(c9_3, a9); - m10 = MULSHIFT32(c9_4, a7); - m11 = MULSHIFT32(c9_3, a3); - m12 = MULSHIFT32(c9_4, a9); - - a12 = x[0] + (x[6] >> 1); - a13 = a12 + ( m1 << 1); - a14 = a12 - ( m1 << 1); - a15 = a1 + ( a11 >> 1); - a16 = ( m5 << 1) + (m6 << 1); - a17 = ( m7 << 1) - (m8 << 1); - a18 = a16 + a17; - a19 = ( m9 << 1) + (m10 << 1); - a20 = (m11 << 1) - (m12 << 1); - - a21 = a20 - a19; - a22 = a13 + a16; - a23 = a14 + a16; - a24 = a14 + a17; - a25 = a13 + a17; - a26 = a14 - a18; - a27 = a13 - a18; - - x0 = a22 + a19; x[0] = x0; - x1 = a15 + (m3 << 1); x[1] = x1; - x2 = a24 + a20; x[2] = x2; - x3 = a26 - a21; x[3] = x3; - x4 = a1 - a11; x[4] = x4; - x5 = a27 + a21; x[5] = x5; - x6 = a25 - a20; x[6] = x6; - x7 = a15 - (m3 << 1); x[7] = x7; - x8 = a23 - a19; x[8] = x8; +static __inline void idct9(int *x) { + int a1, a2, a3, a4, a5, a6, a7, a8, a9; + int a10, a11, a12, a13, a14, a15, a16, a17, a18; + int a19, a20, a21, a22, a23, a24, a25, a26, a27; + int m1, m3, m5, m6, m7, m8, m9, m10, m11, m12; + int x0, x1, x2, x3, x4, x5, x6, x7, x8; + + x0 = x[0]; x1 = x[1]; x2 = x[2]; x3 = x[3]; x4 = x[4]; + x5 = x[5]; x6 = x[6]; x7 = x[7]; x8 = x[8]; + + a1 = x0 - x6; + a2 = x1 - x5; + a3 = x1 + x5; + a4 = x2 - x4; + a5 = x2 + x4; + a6 = x2 + x8; + a7 = x1 + x7; + + a8 = a6 - a5; /* ie x[8] - x[4] */ + a9 = a3 - a7; /* ie x[5] - x[7] */ + a10 = a2 - x7; /* ie x[1] - x[5] - x[7] */ + a11 = a4 - x8; /* ie x[2] - x[4] - x[8] */ + + /* do the << 1 as constant shifts where mX is actually used (free, no stall or extra inst.) */ + m1 = MULSHIFT32(c9_0, x3); + m3 = MULSHIFT32(c9_0, a10); + m5 = MULSHIFT32(c9_1, a5); + m6 = MULSHIFT32(c9_2, a6); + m7 = MULSHIFT32(c9_1, a8); + m8 = MULSHIFT32(c9_2, a5); + m9 = MULSHIFT32(c9_3, a9); + m10 = MULSHIFT32(c9_4, a7); + m11 = MULSHIFT32(c9_3, a3); + m12 = MULSHIFT32(c9_4, a9); + + a12 = x[0] + (x[6] >> 1); + a13 = a12 + (m1 << 1); + a14 = a12 - (m1 << 1); + a15 = a1 + (a11 >> 1); + a16 = (m5 << 1) + (m6 << 1); + a17 = (m7 << 1) - (m8 << 1); + a18 = a16 + a17; + a19 = (m9 << 1) + (m10 << 1); + a20 = (m11 << 1) - (m12 << 1); + + a21 = a20 - a19; + a22 = a13 + a16; + a23 = a14 + a16; + a24 = a14 + a17; + a25 = a13 + a17; + a26 = a14 - a18; + a27 = a13 - a18; + + x0 = a22 + a19; x[0] = x0; + x1 = a15 + (m3 << 1); x[1] = x1; + x2 = a24 + a20; x[2] = x2; + x3 = a26 - a21; x[3] = x3; + x4 = a1 - a11; x[4] = x4; + x5 = a27 + a21; x[5] = x5; + x6 = a25 - a20; x[6] = x6; + x7 = a15 - (m3 << 1); x[7] = x7; + x8 = a23 - a19; x[8] = x8; } -/* let c(j) = cos(M_PI/36 * ((j)+0.5)), s(j) = sin(M_PI/36 * ((j)+0.5)) - * then fastWin[2*j+0] = c(j)*(s(j) + c(j)), j = [0, 8] - * fastWin[2*j+1] = c(j)*(s(j) - c(j)) - * format = Q30 - */ +/* let c(j) = cos(M_PI/36 * ((j)+0.5)), s(j) = sin(M_PI/36 * ((j)+0.5)) + then fastWin[2*j+0] = c(j)*(s(j) + c(j)), j = [0, 8] + fastWin[2*j+1] = c(j)*(s(j) - c(j)) + format = Q30 +*/ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" const int fastWin36[18] PROGMEM = { - 0x42aace8b, 0xc2e92724, 0x47311c28, 0xc95f619a, 0x4a868feb, 0xd0859d8c, - 0x4c913b51, 0xd8243ea0, 0x4d413ccc, 0xe0000000, 0x4c913b51, 0xe7dbc161, - 0x4a868feb, 0xef7a6275, 0x47311c28, 0xf6a09e67, 0x42aace8b, 0xfd16d8dd, + 0x42aace8b, 0xc2e92724, 0x47311c28, 0xc95f619a, 0x4a868feb, 0xd0859d8c, + 0x4c913b51, 0xd8243ea0, 0x4d413ccc, 0xe0000000, 0x4c913b51, 0xe7dbc161, + 0x4a868feb, 0xef7a6275, 0x47311c28, 0xf6a09e67, 0x42aace8b, 0xfd16d8dd, }; #pragma GCC diagnostic pop /************************************************************************************** - * Function: IMDCT36 - * - * Description: 36-point modified DCT, with windowing and overlap-add (50% overlap) - * - * Inputs: vector of 18 coefficients (N/2 inputs produces N outputs, by symmetry) - * overlap part of last IMDCT (9 samples - see output comments) - * window type (0,1,2,3) of current and previous block - * current block index (for deciding whether to do frequency inversion) - * number of guard bits in input vector - * - * Outputs: 18 output samples, after windowing and overlap-add with last frame - * second half of (unwindowed) 36-point IMDCT - save for next time - * only save 9 xPrev samples, using symmetry (see WinPrevious()) - * - * Notes: this is Ken's hyper-fast algorithm, including symmetric sin window - * optimization, if applicable - * total number of multiplies, general case: - * 2*10 (idct9) + 9 (last stage imdct) + 36 (for windowing) = 65 - * total number of multiplies, btCurr == 0 && btPrev == 0: - * 2*10 (idct9) + 9 (last stage imdct) + 18 (for windowing) = 47 - * - * blockType == 0 is by far the most common case, so it should be - * possible to use the fast path most of the time - * this is the fastest known algorithm for performing - * long IMDCT + windowing + overlap-add in MP3 - * - * Return: mOut (OR of abs(y) for all y calculated here) - * - * TODO: optimize for ARM (reorder window coefs, ARM-style pointers in C, - * inline asm may or may not be helpful) + Function: IMDCT36 + + Description: 36-point modified DCT, with windowing and overlap-add (50% overlap) + + Inputs: vector of 18 coefficients (N/2 inputs produces N outputs, by symmetry) + overlap part of last IMDCT (9 samples - see output comments) + window type (0,1,2,3) of current and previous block + current block index (for deciding whether to do frequency inversion) + number of guard bits in input vector + + Outputs: 18 output samples, after windowing and overlap-add with last frame + second half of (unwindowed) 36-point IMDCT - save for next time + only save 9 xPrev samples, using symmetry (see WinPrevious()) + + Notes: this is Ken's hyper-fast algorithm, including symmetric sin window + optimization, if applicable + total number of multiplies, general case: + 2*10 (idct9) + 9 (last stage imdct) + 36 (for windowing) = 65 + total number of multiplies, btCurr == 0 && btPrev == 0: + 2*10 (idct9) + 9 (last stage imdct) + 18 (for windowing) = 47 + + blockType == 0 is by far the most common case, so it should be + possible to use the fast path most of the time + this is the fastest known algorithm for performing + long IMDCT + windowing + overlap-add in MP3 + + Return: mOut (OR of abs(y) for all y calculated here) + + TODO: optimize for ARM (reorder window coefs, ARM-style pointers in C, + inline asm may or may not be helpful) **************************************************************************************/ // barely faster in RAM -/*__attribute__ ((section (".data")))*/ static int IMDCT36(int *xCurr, int *xPrev, int *y, int btCurr, int btPrev, int blockIdx, int gb) -{ - int i, es, xBuf[18], xPrevWin[18]; - int acc1, acc2, s, d, t, mOut; - int xo, xe, c, *xp, yLo, yHi; - const int *cp, *wp; - - acc1 = acc2 = 0; - xCurr += 17; - - /* 7 gb is always adequate for antialias + accumulator loop + idct9 */ - if (gb < 7) { - /* rarely triggered - 5% to 10% of the time on normal clips (with Q25 input) */ - es = 7 - gb; - for (i = 8; i >= 0; i--) { - acc1 = ((*xCurr--) >> es) - acc1; - acc2 = acc1 - acc2; - acc1 = ((*xCurr--) >> es) - acc1; - xBuf[i+9] = acc2; /* odd */ - xBuf[i+0] = acc1; /* even */ - xPrev[i] >>= es; - } - } else { - es = 0; - /* max gain = 18, assume adequate guard bits */ - for (i = 8; i >= 0; i--) { - acc1 = (*xCurr--) - acc1; - acc2 = acc1 - acc2; - acc1 = (*xCurr--) - acc1; - xBuf[i+9] = acc2; /* odd */ - xBuf[i+0] = acc1; /* even */ - } - } - /* xEven[0] and xOdd[0] scaled by 0.5 */ - xBuf[9] >>= 1; - xBuf[0] >>= 1; - - /* do 9-point IDCT on even and odd */ - idct9(xBuf+0); /* even */ - idct9(xBuf+9); /* odd */ - - xp = xBuf + 8; - cp = c18 + 8; - mOut = 0; - if (btPrev == 0 && btCurr == 0) { - /* fast path - use symmetry of sin window to reduce windowing multiplies to 18 (N/2) */ - wp = fastWin36; - for (i = 0; i < 9; i++) { - /* do ARM-style pointer arithmetic (i still needed for y[] indexing - compiler spills if 2 y pointers) */ - c = *cp--; xo = *(xp + 9); xe = *xp--; - /* gain 2 int bits here */ - xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ - xe >>= 2; - - s = -(*xPrev); /* sum from last block (always at least 2 guard bits) */ - d = -(xe - xo); /* gain 2 int bits, don't shift xo (effective << 1 to eat sign bit, << 1 for mul by 2) */ - (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ - t = s - d; - - yLo = (d + (MULSHIFT32(t, *wp++) << 2)); - yHi = (s + (MULSHIFT32(t, *wp++) << 2)); - y[(i)*NBANDS] = yLo; - y[(17-i)*NBANDS] = yHi; - mOut |= FASTABS(yLo); - mOut |= FASTABS(yHi); - } - } else { - /* slower method - either prev or curr is using window type != 0 so do full 36-point window - * output xPrevWin has at least 3 guard bits (xPrev has 2, gain 1 in WinPrevious) - */ - WinPrevious(xPrev, xPrevWin, btPrev); - - wp = imdctWin[btCurr]; - for (i = 0; i < 9; i++) { - c = *cp--; xo = *(xp + 9); xe = *xp--; - /* gain 2 int bits here */ - xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ - xe >>= 2; - - d = xe - xo; - (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ - - yLo = (xPrevWin[i] + MULSHIFT32(d, wp[i])) << 2; - yHi = (xPrevWin[17-i] + MULSHIFT32(d, wp[17-i])) << 2; - y[(i)*NBANDS] = yLo; - y[(17-i)*NBANDS] = yHi; - mOut |= FASTABS(yLo); - mOut |= FASTABS(yHi); - } - } - - xPrev -= 9; - mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); - - return mOut; +/*__attribute__ ((section (".data")))*/ static int IMDCT36(int *xCurr, int *xPrev, int *y, int btCurr, int btPrev, int blockIdx, int gb) { + int i, es, xBuf[18], xPrevWin[18]; + int acc1, acc2, s, d, t, mOut; + int xo, xe, c, *xp, yLo, yHi; + const int *cp, *wp; + + acc1 = acc2 = 0; + xCurr += 17; + + /* 7 gb is always adequate for antialias + accumulator loop + idct9 */ + if (gb < 7) { + /* rarely triggered - 5% to 10% of the time on normal clips (with Q25 input) */ + es = 7 - gb; + for (i = 8; i >= 0; i--) { + acc1 = ((*xCurr--) >> es) - acc1; + acc2 = acc1 - acc2; + acc1 = ((*xCurr--) >> es) - acc1; + xBuf[i + 9] = acc2; /* odd */ + xBuf[i + 0] = acc1; /* even */ + xPrev[i] >>= es; + } + } else { + es = 0; + /* max gain = 18, assume adequate guard bits */ + for (i = 8; i >= 0; i--) { + acc1 = (*xCurr--) - acc1; + acc2 = acc1 - acc2; + acc1 = (*xCurr--) - acc1; + xBuf[i + 9] = acc2; /* odd */ + xBuf[i + 0] = acc1; /* even */ + } + } + /* xEven[0] and xOdd[0] scaled by 0.5 */ + xBuf[9] >>= 1; + xBuf[0] >>= 1; + + /* do 9-point IDCT on even and odd */ + idct9(xBuf + 0); /* even */ + idct9(xBuf + 9); /* odd */ + + xp = xBuf + 8; + cp = c18 + 8; + mOut = 0; + if (btPrev == 0 && btCurr == 0) { + /* fast path - use symmetry of sin window to reduce windowing multiplies to 18 (N/2) */ + wp = fastWin36; + for (i = 0; i < 9; i++) { + /* do ARM-style pointer arithmetic (i still needed for y[] indexing - compiler spills if 2 y pointers) */ + c = *cp--; xo = *(xp + 9); xe = *xp--; + /* gain 2 int bits here */ + xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ + xe >>= 2; + + s = -(*xPrev); /* sum from last block (always at least 2 guard bits) */ + d = -(xe - xo); /* gain 2 int bits, don't shift xo (effective << 1 to eat sign bit, << 1 for mul by 2) */ + (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ + t = s - d; + + yLo = (d + (MULSHIFT32(t, *wp++) << 2)); + yHi = (s + (MULSHIFT32(t, *wp++) << 2)); + y[(i)*NBANDS] = yLo; + y[(17 - i)*NBANDS] = yHi; + mOut |= FASTABS(yLo); + mOut |= FASTABS(yHi); + } + } else { + /* slower method - either prev or curr is using window type != 0 so do full 36-point window + output xPrevWin has at least 3 guard bits (xPrev has 2, gain 1 in WinPrevious) + */ + WinPrevious(xPrev, xPrevWin, btPrev); + + wp = imdctWin[btCurr]; + for (i = 0; i < 9; i++) { + c = *cp--; xo = *(xp + 9); xe = *xp--; + /* gain 2 int bits here */ + xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ + xe >>= 2; + + d = xe - xo; + (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ + + yLo = (xPrevWin[i] + MULSHIFT32(d, wp[i])) << 2; + yHi = (xPrevWin[17 - i] + MULSHIFT32(d, wp[17 - i])) << 2; + y[(i)*NBANDS] = yLo; + y[(17 - i)*NBANDS] = yHi; + mOut |= FASTABS(yLo); + mOut |= FASTABS(yHi); + } + } + + xPrev -= 9; + mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); + + return mOut; } static int c3_0 = 0x6ed9eba1; /* format = Q31, cos(pi/6) */ static int c6[3] = { 0x7ba3751d, 0x5a82799a, 0x2120fb83 }; /* format = Q31, cos(((0:2) + 0.5) * (pi/6)) */ -/* 12-point inverse DCT, used in IMDCT12x3() - * 4 input guard bits will ensure no overflow - */ -static __inline void imdct12 (int *x, int *out) -{ - int a0, a1, a2; - int x0, x1, x2, x3, x4, x5; - - x0 = *x; x+=3; x1 = *x; x+=3; - x2 = *x; x+=3; x3 = *x; x+=3; - x4 = *x; x+=3; x5 = *x; x+=3; - - x4 -= x5; - x3 -= x4; - x2 -= x3; - x3 -= x5; - x1 -= x2; - x0 -= x1; - x1 -= x3; - - x0 >>= 1; - x1 >>= 1; - - a0 = MULSHIFT32(c3_0, x2) << 1; - a1 = x0 + (x4 >> 1); - a2 = x0 - x4; - x0 = a1 + a0; - x2 = a2; - x4 = a1 - a0; - - a0 = MULSHIFT32(c3_0, x3) << 1; - a1 = x1 + (x5 >> 1); - a2 = x1 - x5; - - /* cos window odd samples, mul by 2, eat sign bit */ - x1 = MULSHIFT32(c6[0], a1 + a0) << 2; - x3 = MULSHIFT32(c6[1], a2) << 2; - x5 = MULSHIFT32(c6[2], a1 - a0) << 2; - - *out = x0 + x1; out++; - *out = x2 + x3; out++; - *out = x4 + x5; out++; - *out = x4 - x5; out++; - *out = x2 - x3; out++; - *out = x0 - x1; +/* 12-point inverse DCT, used in IMDCT12x3() + 4 input guard bits will ensure no overflow +*/ +static __inline void imdct12(int *x, int *out) { + int a0, a1, a2; + int x0, x1, x2, x3, x4, x5; + + x0 = *x; x += 3; x1 = *x; x += 3; + x2 = *x; x += 3; x3 = *x; x += 3; + x4 = *x; x += 3; x5 = *x; x += 3; + + x4 -= x5; + x3 -= x4; + x2 -= x3; + x3 -= x5; + x1 -= x2; + x0 -= x1; + x1 -= x3; + + x0 >>= 1; + x1 >>= 1; + + a0 = MULSHIFT32(c3_0, x2) << 1; + a1 = x0 + (x4 >> 1); + a2 = x0 - x4; + x0 = a1 + a0; + x2 = a2; + x4 = a1 - a0; + + a0 = MULSHIFT32(c3_0, x3) << 1; + a1 = x1 + (x5 >> 1); + a2 = x1 - x5; + + /* cos window odd samples, mul by 2, eat sign bit */ + x1 = MULSHIFT32(c6[0], a1 + a0) << 2; + x3 = MULSHIFT32(c6[1], a2) << 2; + x5 = MULSHIFT32(c6[2], a1 - a0) << 2; + + *out = x0 + x1; out++; + *out = x2 + x3; out++; + *out = x4 + x5; out++; + *out = x4 - x5; out++; + *out = x2 - x3; out++; + *out = x0 - x1; } /************************************************************************************** - * Function: IMDCT12x3 - * - * Description: three 12-point modified DCT's for short blocks, with windowing, - * short block concatenation, and overlap-add - * - * Inputs: 3 interleaved vectors of 6 samples each - * (block0[0], block1[0], block2[0], block0[1], block1[1]....) - * overlap part of last IMDCT (9 samples - see output comments) - * window type (0,1,2,3) of previous block - * current block index (for deciding whether to do frequency inversion) - * number of guard bits in input vector - * - * Outputs: updated sample vector x, net gain of 1 integer bit - * second half of (unwindowed) IMDCT's - save for next time - * only save 9 xPrev samples, using symmetry (see WinPrevious()) - * - * Return: mOut (OR of abs(y) for all y calculated here) - * - * TODO: optimize for ARM + Function: IMDCT12x3 + + Description: three 12-point modified DCT's for short blocks, with windowing, + short block concatenation, and overlap-add + + Inputs: 3 interleaved vectors of 6 samples each + (block0[0], block1[0], block2[0], block0[1], block1[1]....) + overlap part of last IMDCT (9 samples - see output comments) + window type (0,1,2,3) of previous block + current block index (for deciding whether to do frequency inversion) + number of guard bits in input vector + + Outputs: updated sample vector x, net gain of 1 integer bit + second half of (unwindowed) IMDCT's - save for next time + only save 9 xPrev samples, using symmetry (see WinPrevious()) + + Return: mOut (OR of abs(y) for all y calculated here) + + TODO: optimize for ARM **************************************************************************************/ - // barely faster in RAM -/*__attribute__ ((section (".data")))*/ static int IMDCT12x3(int *xCurr, int *xPrev, int *y, int btPrev, int blockIdx, int gb) -{ - int i, es, mOut, yLo, xBuf[18], xPrevWin[18]; /* need temp buffer for reordering short blocks */ - const int *wp; - - es = 0; - /* 7 gb is always adequate for accumulator loop + idct12 + window + overlap */ - if (gb < 7) { - es = 7 - gb; - for (i = 0; i < 18; i+=2) { - xCurr[i+0] >>= es; - xCurr[i+1] >>= es; - *xPrev++ >>= es; - } - xPrev -= 9; - } - - /* requires 4 input guard bits for each imdct12 */ - imdct12(xCurr + 0, xBuf + 0); - imdct12(xCurr + 1, xBuf + 6); - imdct12(xCurr + 2, xBuf + 12); - - /* window previous from last time */ - WinPrevious(xPrev, xPrevWin, btPrev); - - /* could unroll this for speed, minimum loads (short blocks usually rare, so doesn't make much overall difference) - * xPrevWin[i] << 2 still has 1 gb always, max gain of windowed xBuf stuff also < 1.0 and gain the sign bit - * so y calculations won't overflow - */ - wp = imdctWin[2]; - mOut = 0; - for (i = 0; i < 3; i++) { - yLo = (xPrevWin[ 0+i] << 2); - mOut |= FASTABS(yLo); y[( 0+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 3+i] << 2); - mOut |= FASTABS(yLo); y[( 3+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 6+i] << 2) + (MULSHIFT32(wp[0+i], xBuf[3+i])); - mOut |= FASTABS(yLo); y[( 6+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 9+i] << 2) + (MULSHIFT32(wp[3+i], xBuf[5-i])); - mOut |= FASTABS(yLo); y[( 9+i)*NBANDS] = yLo; - yLo = (xPrevWin[12+i] << 2) + (MULSHIFT32(wp[6+i], xBuf[2-i]) + MULSHIFT32(wp[0+i], xBuf[(6+3)+i])); - mOut |= FASTABS(yLo); y[(12+i)*NBANDS] = yLo; - yLo = (xPrevWin[15+i] << 2) + (MULSHIFT32(wp[9+i], xBuf[0+i]) + MULSHIFT32(wp[3+i], xBuf[(6+5)-i])); - mOut |= FASTABS(yLo); y[(15+i)*NBANDS] = yLo; - } - - /* save previous (unwindowed) for overlap - only need samples 6-8, 12-17 */ - for (i = 6; i < 9; i++) - *xPrev++ = xBuf[i] >> 2; - for (i = 12; i < 18; i++) - *xPrev++ = xBuf[i] >> 2; - - xPrev -= 9; - mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); - - return mOut; +// barely faster in RAM +/*__attribute__ ((section (".data")))*/ static int IMDCT12x3(int *xCurr, int *xPrev, int *y, int btPrev, int blockIdx, int gb) { + int i, es, mOut, yLo, xBuf[18], xPrevWin[18]; /* need temp buffer for reordering short blocks */ + const int *wp; + + es = 0; + /* 7 gb is always adequate for accumulator loop + idct12 + window + overlap */ + if (gb < 7) { + es = 7 - gb; + for (i = 0; i < 18; i += 2) { + xCurr[i + 0] >>= es; + xCurr[i + 1] >>= es; + *xPrev++ >>= es; + } + xPrev -= 9; + } + + /* requires 4 input guard bits for each imdct12 */ + imdct12(xCurr + 0, xBuf + 0); + imdct12(xCurr + 1, xBuf + 6); + imdct12(xCurr + 2, xBuf + 12); + + /* window previous from last time */ + WinPrevious(xPrev, xPrevWin, btPrev); + + /* could unroll this for speed, minimum loads (short blocks usually rare, so doesn't make much overall difference) + xPrevWin[i] << 2 still has 1 gb always, max gain of windowed xBuf stuff also < 1.0 and gain the sign bit + so y calculations won't overflow + */ + wp = imdctWin[2]; + mOut = 0; + for (i = 0; i < 3; i++) { + yLo = (xPrevWin[ 0 + i] << 2); + mOut |= FASTABS(yLo); y[(0 + i)*NBANDS] = yLo; + yLo = (xPrevWin[ 3 + i] << 2); + mOut |= FASTABS(yLo); y[(3 + i)*NBANDS] = yLo; + yLo = (xPrevWin[ 6 + i] << 2) + (MULSHIFT32(wp[0 + i], xBuf[3 + i])); + mOut |= FASTABS(yLo); y[(6 + i)*NBANDS] = yLo; + yLo = (xPrevWin[ 9 + i] << 2) + (MULSHIFT32(wp[3 + i], xBuf[5 - i])); + mOut |= FASTABS(yLo); y[(9 + i)*NBANDS] = yLo; + yLo = (xPrevWin[12 + i] << 2) + (MULSHIFT32(wp[6 + i], xBuf[2 - i]) + MULSHIFT32(wp[0 + i], xBuf[(6 + 3) + i])); + mOut |= FASTABS(yLo); y[(12 + i)*NBANDS] = yLo; + yLo = (xPrevWin[15 + i] << 2) + (MULSHIFT32(wp[9 + i], xBuf[0 + i]) + MULSHIFT32(wp[3 + i], xBuf[(6 + 5) - i])); + mOut |= FASTABS(yLo); y[(15 + i)*NBANDS] = yLo; + } + + /* save previous (unwindowed) for overlap - only need samples 6-8, 12-17 */ + for (i = 6; i < 9; i++) { + *xPrev++ = xBuf[i] >> 2; + } + for (i = 12; i < 18; i++) { + *xPrev++ = xBuf[i] >> 2; + } + + xPrev -= 9; + mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); + + return mOut; } /************************************************************************************** - * Function: HybridTransform - * - * Description: IMDCT's, windowing, and overlap-add on long/short/mixed blocks - * - * Inputs: vector of input coefficients, length = nBlocksTotal * 18) - * vector of overlap samples from last time, length = nBlocksPrev * 9) - * buffer for output samples, length = MAXNSAMP - * SideInfoSub struct for this granule/channel - * BlockCount struct with necessary info - * number of non-zero input and overlap blocks - * number of long blocks in input vector (rest assumed to be short blocks) - * number of blocks which use long window (type) 0 in case of mixed block - * (bc->currWinSwitch, 0 for non-mixed blocks) - * - * Outputs: transformed, windowed, and overlapped sample buffer - * does frequency inversion on odd blocks - * updated buffer of samples for overlap - * - * Return: number of non-zero IMDCT blocks calculated in this call - * (including overlap-add) - * - * TODO: examine mixedBlock/winSwitch logic carefully (test he_mode.bit) + Function: HybridTransform + + Description: IMDCT's, windowing, and overlap-add on long/short/mixed blocks + + Inputs: vector of input coefficients, length = nBlocksTotal * 18) + vector of overlap samples from last time, length = nBlocksPrev * 9) + buffer for output samples, length = MAXNSAMP + SideInfoSub struct for this granule/channel + BlockCount struct with necessary info + number of non-zero input and overlap blocks + number of long blocks in input vector (rest assumed to be short blocks) + number of blocks which use long window (type) 0 in case of mixed block + (bc->currWinSwitch, 0 for non-mixed blocks) + + Outputs: transformed, windowed, and overlapped sample buffer + does frequency inversion on odd blocks + updated buffer of samples for overlap + + Return: number of non-zero IMDCT blocks calculated in this call + (including overlap-add) + + TODO: examine mixedBlock/winSwitch logic carefully (test he_mode.bit) **************************************************************************************/ -/* __attribute__ ((section (".data"))) */ static int HybridTransform(int *xCurr, int *xPrev, int y[BLOCK_SIZE][NBANDS], SideInfoSub *sis, BlockCount *bc) -{ - int xPrevWin[18], currWinIdx, prevWinIdx; - int i, j, nBlocksOut, nonZero, mOut; - int fiBit, xp; - - ASSERT(bc->nBlocksLong <= NBANDS); - ASSERT(bc->nBlocksTotal <= NBANDS); - ASSERT(bc->nBlocksPrev <= NBANDS); - - mOut = 0; - - /* do long blocks, if any */ - for(i = 0; i < bc->nBlocksLong; i++) { - /* currWinIdx picks the right window for long blocks (if mixed, long blocks use window type 0) */ - currWinIdx = sis->blockType; - if (sis->mixedBlock && i < bc->currWinSwitch) - currWinIdx = 0; - - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - - /* do 36-point IMDCT, including windowing and overlap-add */ - mOut |= IMDCT36(xCurr, xPrev, &(y[0][i]), currWinIdx, prevWinIdx, i, bc->gbIn); - xCurr += 18; - xPrev += 9; - } - - /* do short blocks (if any) */ - for ( ; i < bc->nBlocksTotal; i++) { - ASSERT(sis->blockType == 2); - - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - - mOut |= IMDCT12x3(xCurr, xPrev, &(y[0][i]), prevWinIdx, i, bc->gbIn); - xCurr += 18; - xPrev += 9; - } - nBlocksOut = i; - - /* window and overlap prev if prev longer that current */ - for ( ; i < bc->nBlocksPrev; i++) { - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - WinPrevious(xPrev, xPrevWin, prevWinIdx); - - nonZero = 0; - fiBit = i << 31; - for (j = 0; j < 9; j++) { - xp = xPrevWin[2*j+0] << 2; /* << 2 temp for scaling */ - nonZero |= xp; - y[2*j+0][i] = xp; - mOut |= FASTABS(xp); - - /* frequency inversion on odd blocks/odd samples (flip sign if i odd, j odd) */ - xp = xPrevWin[2*j+1] << 2; - xp = (xp ^ (fiBit >> 31)) + (i & 0x01); - nonZero |= xp; - y[2*j+1][i] = xp; - mOut |= FASTABS(xp); - - xPrev[j] = 0; - } - xPrev += 9; - if (nonZero) - nBlocksOut = i; - } - - /* clear rest of blocks */ - for ( ; i < 32; i++) { - for (j = 0; j < 18; j++) - y[j][i] = 0; - } - - bc->gbOut = CLZ(mOut) - 1; - - return nBlocksOut; +/* __attribute__ ((section (".data"))) */ static int HybridTransform(int *xCurr, int *xPrev, int y[BLOCK_SIZE][NBANDS], SideInfoSub *sis, BlockCount *bc) { + int xPrevWin[18], currWinIdx, prevWinIdx; + int i, j, nBlocksOut, nonZero, mOut; + int fiBit, xp; + + ASSERT(bc->nBlocksLong <= NBANDS); + ASSERT(bc->nBlocksTotal <= NBANDS); + ASSERT(bc->nBlocksPrev <= NBANDS); + + mOut = 0; + + /* do long blocks, if any */ + for (i = 0; i < bc->nBlocksLong; i++) { + /* currWinIdx picks the right window for long blocks (if mixed, long blocks use window type 0) */ + currWinIdx = sis->blockType; + if (sis->mixedBlock && i < bc->currWinSwitch) { + currWinIdx = 0; + } + + prevWinIdx = bc->prevType; + if (i < bc->prevWinSwitch) { + prevWinIdx = 0; + } + + /* do 36-point IMDCT, including windowing and overlap-add */ + mOut |= IMDCT36(xCurr, xPrev, &(y[0][i]), currWinIdx, prevWinIdx, i, bc->gbIn); + xCurr += 18; + xPrev += 9; + } + + /* do short blocks (if any) */ + for (; i < bc->nBlocksTotal; i++) { + ASSERT(sis->blockType == 2); + + prevWinIdx = bc->prevType; + if (i < bc->prevWinSwitch) { + prevWinIdx = 0; + } + + mOut |= IMDCT12x3(xCurr, xPrev, &(y[0][i]), prevWinIdx, i, bc->gbIn); + xCurr += 18; + xPrev += 9; + } + nBlocksOut = i; + + /* window and overlap prev if prev longer that current */ + for (; i < bc->nBlocksPrev; i++) { + prevWinIdx = bc->prevType; + if (i < bc->prevWinSwitch) { + prevWinIdx = 0; + } + WinPrevious(xPrev, xPrevWin, prevWinIdx); + + nonZero = 0; + fiBit = i << 31; + for (j = 0; j < 9; j++) { + xp = xPrevWin[2 * j + 0] << 2; /* << 2 temp for scaling */ + nonZero |= xp; + y[2 * j + 0][i] = xp; + mOut |= FASTABS(xp); + + /* frequency inversion on odd blocks/odd samples (flip sign if i odd, j odd) */ + xp = xPrevWin[2 * j + 1] << 2; + xp = (xp ^ (fiBit >> 31)) + (i & 0x01); + nonZero |= xp; + y[2 * j + 1][i] = xp; + mOut |= FASTABS(xp); + + xPrev[j] = 0; + } + xPrev += 9; + if (nonZero) { + nBlocksOut = i; + } + } + + /* clear rest of blocks */ + for (; i < 32; i++) { + for (j = 0; j < 18; j++) { + y[j][i] = 0; + } + } + + bc->gbOut = CLZ(mOut) - 1; + + return nBlocksOut; } /************************************************************************************** - * Function: IMDCT - * - * Description: do alias reduction, inverse MDCT, overlap-add, and frequency inversion - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * UnpackScaleFactors(), and DecodeHuffman() (for this granule, channel) - * includes PCM samples in overBuf (from last call to IMDCT) for OLA - * index of current granule and channel - * - * Outputs: PCM samples in outBuf, for input to subband transform - * PCM samples in overBuf, for OLA next time - * updated hi->nonZeroBound index for this channel - * - * Return: 0 on success, -1 if null input pointers + Function: IMDCT + + Description: do alias reduction, inverse MDCT, overlap-add, and frequency inversion + + Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), + UnpackScaleFactors(), and DecodeHuffman() (for this granule, channel) + includes PCM samples in overBuf (from last call to IMDCT) for OLA + index of current granule and channel + + Outputs: PCM samples in outBuf, for input to subband transform + PCM samples in overBuf, for OLA next time + updated hi->nonZeroBound index for this channel + + Return: 0 on success, -1 if null input pointers **************************************************************************************/ - // a bit faster in RAM -/*__attribute__ ((section (".data")))*/ int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch) -{ - int nBfly, blockCutoff; - FrameHeader *fh; - SideInfo *si; - HuffmanInfo *hi; - IMDCTInfo *mi; - BlockCount bc; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || - !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS) - return -1; - - /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ - fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); - si = (SideInfo *)(mp3DecInfo->SideInfoPS); - hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); - mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); - - /* anti-aliasing done on whole long blocks only - * for mixed blocks, nBfly always 1, except 3 for 8 kHz MPEG 2.5 (see sfBandTab) - * nLongBlocks = number of blocks with (possibly) non-zero power - * nBfly = number of butterflies to do (nLongBlocks - 1, unless no long blocks) - */ - blockCutoff = fh->sfBand->l[(fh->ver == MPEG1 ? 8 : 6)] / 18; /* same as 3* num short sfb's in spec */ - if (si->sis[gr][ch].blockType != 2) { - /* all long transforms */ - bc.nBlocksLong = MIN((hi->nonZeroBound[ch] + 7) / 18 + 1, 32); - nBfly = bc.nBlocksLong - 1; - } else if (si->sis[gr][ch].blockType == 2 && si->sis[gr][ch].mixedBlock) { - /* mixed block - long transforms until cutoff, then short transforms */ - bc.nBlocksLong = blockCutoff; - nBfly = bc.nBlocksLong - 1; - } else { - /* all short transforms */ - bc.nBlocksLong = 0; - nBfly = 0; - } - - AntiAlias(hi->huffDecBuf[ch], nBfly); - hi->nonZeroBound[ch] = MAX(hi->nonZeroBound[ch], (nBfly * 18) + 8); - - ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); - - /* for readability, use a struct instead of passing a million parameters to HybridTransform() */ - bc.nBlocksTotal = (hi->nonZeroBound[ch] + 17) / 18; - bc.nBlocksPrev = mi->numPrevIMDCT[ch]; - bc.prevType = mi->prevType[ch]; - bc.prevWinSwitch = mi->prevWinSwitch[ch]; - bc.currWinSwitch = (si->sis[gr][ch].mixedBlock ? blockCutoff : 0); /* where WINDOW switches (not nec. transform) */ - bc.gbIn = hi->gb[ch]; - - mi->numPrevIMDCT[ch] = HybridTransform(hi->huffDecBuf[ch], mi->overBuf[ch], mi->outBuf[ch], &si->sis[gr][ch], &bc); - mi->prevType[ch] = si->sis[gr][ch].blockType; - mi->prevWinSwitch[ch] = bc.currWinSwitch; /* 0 means not a mixed block (either all short or all long) */ - mi->gb[ch] = bc.gbOut; - - ASSERT(mi->numPrevIMDCT[ch] <= NBANDS); - - /* output has gained 2 int bits */ - return 0; +// a bit faster in RAM +/*__attribute__ ((section (".data")))*/ int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch) { + int nBfly, blockCutoff; + FrameHeader *fh; + SideInfo *si; + HuffmanInfo *hi; + IMDCTInfo *mi; + BlockCount bc; + + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || + !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS) { + return -1; + } + + /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ + fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); + si = (SideInfo *)(mp3DecInfo->SideInfoPS); + hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); + mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); + + /* anti-aliasing done on whole long blocks only + for mixed blocks, nBfly always 1, except 3 for 8 kHz MPEG 2.5 (see sfBandTab) + nLongBlocks = number of blocks with (possibly) non-zero power + nBfly = number of butterflies to do (nLongBlocks - 1, unless no long blocks) + */ + blockCutoff = fh->sfBand->l[(fh->ver == MPEG1 ? 8 : 6)] / 18; /* same as 3* num short sfb's in spec */ + if (si->sis[gr][ch].blockType != 2) { + /* all long transforms */ + bc.nBlocksLong = MIN((hi->nonZeroBound[ch] + 7) / 18 + 1, 32); + nBfly = bc.nBlocksLong - 1; + } else if (si->sis[gr][ch].blockType == 2 && si->sis[gr][ch].mixedBlock) { + /* mixed block - long transforms until cutoff, then short transforms */ + bc.nBlocksLong = blockCutoff; + nBfly = bc.nBlocksLong - 1; + } else { + /* all short transforms */ + bc.nBlocksLong = 0; + nBfly = 0; + } + + AntiAlias(hi->huffDecBuf[ch], nBfly); + hi->nonZeroBound[ch] = MAX(hi->nonZeroBound[ch], (nBfly * 18) + 8); + + ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); + + /* for readability, use a struct instead of passing a million parameters to HybridTransform() */ + bc.nBlocksTotal = (hi->nonZeroBound[ch] + 17) / 18; + bc.nBlocksPrev = mi->numPrevIMDCT[ch]; + bc.prevType = mi->prevType[ch]; + bc.prevWinSwitch = mi->prevWinSwitch[ch]; + bc.currWinSwitch = (si->sis[gr][ch].mixedBlock ? blockCutoff : 0); /* where WINDOW switches (not nec. transform) */ + bc.gbIn = hi->gb[ch]; + + mi->numPrevIMDCT[ch] = HybridTransform(hi->huffDecBuf[ch], mi->overBuf[ch], mi->outBuf[ch], &si->sis[gr][ch], &bc); + mi->prevType[ch] = si->sis[gr][ch].blockType; + mi->prevWinSwitch[ch] = bc.currWinSwitch; /* 0 means not a mixed block (either all short or all long) */ + mi->gb[ch] = bc.gbOut; + + ASSERT(mi->numPrevIMDCT[ch] <= NBANDS); + + /* output has gained 2 int bits */ + return 0; } diff --git a/src/libhelix-mp3/mp3common.h b/src/libhelix-mp3/mp3common.h index 07548abf..695da056 100644 --- a/src/libhelix-mp3/mp3common.h +++ b/src/libhelix-mp3/mp3common.h @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3common.h - implementation-independent API's, datatypes, and definitions + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + mp3common.h - implementation-independent API's, datatypes, and definitions **************************************************************************************/ #ifndef _MP3COMMON_H @@ -53,8 +53,8 @@ /* 11-bit syncword if MPEG 2.5 extensions are enabled */ /* -#define SYNCWORDH 0xff -#define SYNCWORDL 0xe0 + #define SYNCWORDH 0xff + #define SYNCWORDL 0xe0 */ /* 12-bit syncword if MPEG 1,2 only are supported */ @@ -62,42 +62,42 @@ #define SYNCWORDL 0xf0 typedef struct _MP3DecInfo { - /* pointers to platform-specific data structures */ - void *FrameHeaderPS; - void *SideInfoPS; - void *ScaleFactorInfoPS; - void *HuffmanInfoPS; - void *DequantInfoPS; - void *IMDCTInfoPS; - void *SubbandInfoPS; - - /* buffer which must be large enough to hold largest possible main_data section */ - unsigned char mainBuf[MAINBUF_SIZE]; - - /* special info for "free" bitrate files */ - int freeBitrateFlag; - int freeBitrateSlots; - - /* user-accessible info */ - int bitrate; - int nChans; - int samprate; - int nGrans; /* granules per frame */ - int nGranSamps; /* samples per granule */ - int nSlots; - int layer; - MPEGVersion version; - - int mainDataBegin; - int mainDataBytes; - - int part23Length[MAX_NGRAN][MAX_NCHAN]; + /* pointers to platform-specific data structures */ + void *FrameHeaderPS; + void *SideInfoPS; + void *ScaleFactorInfoPS; + void *HuffmanInfoPS; + void *DequantInfoPS; + void *IMDCTInfoPS; + void *SubbandInfoPS; + + /* buffer which must be large enough to hold largest possible main_data section */ + unsigned char mainBuf[MAINBUF_SIZE]; + + /* special info for "free" bitrate files */ + int freeBitrateFlag; + int freeBitrateSlots; + + /* user-accessible info */ + int bitrate; + int nChans; + int samprate; + int nGrans; /* granules per frame */ + int nGranSamps; /* samples per granule */ + int nSlots; + int layer; + MPEGVersion version; + + int mainDataBegin; + int mainDataBytes; + + int part23Length[MAX_NGRAN][MAX_NCHAN]; } MP3DecInfo; typedef struct _SFBandTable { - int/*short*/ l[23]; - int/*short*/ s[14]; + int/*short*/ l[23]; + int/*short*/ s[14]; } SFBandTable; /* decoder functions which must be implemented for each platform */ diff --git a/src/libhelix-mp3/mp3dec.c b/src/libhelix-mp3/mp3dec.c index 5e68c7af..a6ebd330 100644 --- a/src/libhelix-mp3/mp3dec.c +++ b/src/libhelix-mp3/mp3dec.c @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3dec.c - platform-independent top level MP3 decoder API + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + mp3dec.c - platform-independent top level MP3 decoder API **************************************************************************************/ #include "string.h" @@ -52,433 +52,433 @@ #endif /************************************************************************************** - * Function: MP3InitDecoder - * - * Description: allocate memory for platform-specific data - * clear all the user-accessible fields - * - * Inputs: none - * - * Outputs: none - * - * Return: handle to mp3 decoder instance, 0 if malloc fails + Function: MP3InitDecoder + + Description: allocate memory for platform-specific data + clear all the user-accessible fields + + Inputs: none + + Outputs: none + + Return: handle to mp3 decoder instance, 0 if malloc fails **************************************************************************************/ -HMP3Decoder MP3InitDecoder(void) -{ - MP3DecInfo *mp3DecInfo; +HMP3Decoder MP3InitDecoder(void) { + MP3DecInfo *mp3DecInfo; - mp3DecInfo = AllocateBuffers(); + mp3DecInfo = AllocateBuffers(); - return (HMP3Decoder)mp3DecInfo; + return (HMP3Decoder)mp3DecInfo; } /************************************************************************************** - * Function: MP3FreeDecoder - * - * Description: free platform-specific data allocated by InitMP3Decoder - * zero out the contents of MP3DecInfo struct - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * - * Outputs: none - * - * Return: none + Function: MP3FreeDecoder + + Description: free platform-specific data allocated by InitMP3Decoder + zero out the contents of MP3DecInfo struct + + Inputs: valid MP3 decoder instance pointer (HMP3Decoder) + + Outputs: none + + Return: none **************************************************************************************/ -void MP3FreeDecoder(HMP3Decoder hMP3Decoder) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; +void MP3FreeDecoder(HMP3Decoder hMP3Decoder) { + MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - if (!mp3DecInfo) - return; + if (!mp3DecInfo) { + return; + } - FreeBuffers(mp3DecInfo); + FreeBuffers(mp3DecInfo); } /************************************************************************************** - * Function: MP3FindSyncWord - * - * Description: locate the next byte-alinged sync word in the raw mp3 stream - * - * Inputs: buffer to search for sync word - * max number of bytes to search in buffer - * - * Outputs: none - * - * Return: offset to first sync word (bytes from start of buf) - * -1 if sync not found after searching nBytes + Function: MP3FindSyncWord + + Description: locate the next byte-alinged sync word in the raw mp3 stream + + Inputs: buffer to search for sync word + max number of bytes to search in buffer + + Outputs: none + + Return: offset to first sync word (bytes from start of buf) + -1 if sync not found after searching nBytes **************************************************************************************/ -int MP3FindSyncWord(unsigned char *buf, int nBytes) -{ - int i; - - /* find byte-aligned syncword - need 12 (MPEG 1,2) or 11 (MPEG 2.5) matching bits */ - for (i = 0; i < nBytes - 1; i++) { - if ( (buf[i+0] & SYNCWORDH) == SYNCWORDH && (buf[i+1] & SYNCWORDL) == SYNCWORDL ) - return i; - } - - return -1; +int MP3FindSyncWord(unsigned char *buf, int nBytes) { + int i; + + /* find byte-aligned syncword - need 12 (MPEG 1,2) or 11 (MPEG 2.5) matching bits */ + for (i = 0; i < nBytes - 1; i++) { + if ((buf[i + 0] & SYNCWORDH) == SYNCWORDH && (buf[i + 1] & SYNCWORDL) == SYNCWORDL) { + return i; + } + } + + return -1; } /************************************************************************************** - * Function: MP3FindFreeSync - * - * Description: figure out number of bytes between adjacent sync words in "free" mode - * - * Inputs: buffer to search for next sync word - * the 4-byte frame header starting at the current sync word - * max number of bytes to search in buffer - * - * Outputs: none - * - * Return: offset to next sync word, minus any pad byte (i.e. nSlots) - * -1 if sync not found after searching nBytes - * - * Notes: this checks that the first 22 bits of the next frame header are the - * same as the current frame header, but it's still not foolproof - * (could accidentally find a sequence in the bitstream which - * appears to match but is not actually the next frame header) - * this could be made more error-resilient by checking several frames - * in a row and verifying that nSlots is the same in each case - * since free mode requires CBR (see spec) we generally only call - * this function once (first frame) then store the result (nSlots) - * and just use it from then on + Function: MP3FindFreeSync + + Description: figure out number of bytes between adjacent sync words in "free" mode + + Inputs: buffer to search for next sync word + the 4-byte frame header starting at the current sync word + max number of bytes to search in buffer + + Outputs: none + + Return: offset to next sync word, minus any pad byte (i.e. nSlots) + -1 if sync not found after searching nBytes + + Notes: this checks that the first 22 bits of the next frame header are the + same as the current frame header, but it's still not foolproof + (could accidentally find a sequence in the bitstream which + appears to match but is not actually the next frame header) + this could be made more error-resilient by checking several frames + in a row and verifying that nSlots is the same in each case + since free mode requires CBR (see spec) we generally only call + this function once (first frame) then store the result (nSlots) + and just use it from then on **************************************************************************************/ -static int MP3FindFreeSync(unsigned char *buf, unsigned char firstFH[4], int nBytes) -{ - int offset = 0; - unsigned char *bufPtr = buf; - - /* loop until we either: - * - run out of nBytes (FindMP3SyncWord() returns -1) - * - find the next valid frame header (sync word, version, layer, CRC flag, bitrate, and sample rate - * in next header must match current header) - */ - while (1) { - offset = MP3FindSyncWord(bufPtr, nBytes); - bufPtr += offset; - if (offset < 0) { - return -1; - } else if ( (bufPtr[0] == firstFH[0]) && (bufPtr[1] == firstFH[1]) && ((bufPtr[2] & 0xfc) == (firstFH[2] & 0xfc)) ) { - /* want to return number of bytes per frame, NOT counting the padding byte, so subtract one if padFlag == 1 */ - if ((firstFH[2] >> 1) & 0x01) - bufPtr--; - return bufPtr - buf; - } - bufPtr += 3; - nBytes -= (offset + 3); - }; - - return -1; +static int MP3FindFreeSync(unsigned char *buf, unsigned char firstFH[4], int nBytes) { + int offset = 0; + unsigned char *bufPtr = buf; + + /* loop until we either: + - run out of nBytes (FindMP3SyncWord() returns -1) + - find the next valid frame header (sync word, version, layer, CRC flag, bitrate, and sample rate + in next header must match current header) + */ + while (1) { + offset = MP3FindSyncWord(bufPtr, nBytes); + bufPtr += offset; + if (offset < 0) { + return -1; + } else if ((bufPtr[0] == firstFH[0]) && (bufPtr[1] == firstFH[1]) && ((bufPtr[2] & 0xfc) == (firstFH[2] & 0xfc))) { + /* want to return number of bytes per frame, NOT counting the padding byte, so subtract one if padFlag == 1 */ + if ((firstFH[2] >> 1) & 0x01) { + bufPtr--; + } + return bufPtr - buf; + } + bufPtr += 3; + nBytes -= (offset + 3); + }; + + return -1; } /************************************************************************************** - * Function: MP3GetLastFrameInfo - * - * Description: get info about last MP3 frame decoded (number of sampled decoded, - * sample rate, bitrate, etc.) - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * pointer to MP3FrameInfo struct - * - * Outputs: filled-in MP3FrameInfo struct - * - * Return: none - * - * Notes: call this right after calling MP3Decode + Function: MP3GetLastFrameInfo + + Description: get info about last MP3 frame decoded (number of sampled decoded, + sample rate, bitrate, etc.) + + Inputs: valid MP3 decoder instance pointer (HMP3Decoder) + pointer to MP3FrameInfo struct + + Outputs: filled-in MP3FrameInfo struct + + Return: none + + Notes: call this right after calling MP3Decode **************************************************************************************/ -void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - if (!mp3DecInfo || mp3DecInfo->layer != 3) { - mp3FrameInfo->bitrate = 0; - mp3FrameInfo->nChans = 0; - mp3FrameInfo->samprate = 0; - mp3FrameInfo->bitsPerSample = 0; - mp3FrameInfo->outputSamps = 0; - mp3FrameInfo->layer = 0; - mp3FrameInfo->version = 0; - } else { - mp3FrameInfo->bitrate = mp3DecInfo->bitrate; - mp3FrameInfo->nChans = mp3DecInfo->nChans; - mp3FrameInfo->samprate = mp3DecInfo->samprate; - mp3FrameInfo->bitsPerSample = 16; - mp3FrameInfo->outputSamps = mp3DecInfo->nChans * (int)samplesPerFrameTab[mp3DecInfo->version][mp3DecInfo->layer - 1]; - mp3FrameInfo->layer = mp3DecInfo->layer; - mp3FrameInfo->version = mp3DecInfo->version; - } +void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo) { + MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; + + if (!mp3DecInfo || mp3DecInfo->layer != 3) { + mp3FrameInfo->bitrate = 0; + mp3FrameInfo->nChans = 0; + mp3FrameInfo->samprate = 0; + mp3FrameInfo->bitsPerSample = 0; + mp3FrameInfo->outputSamps = 0; + mp3FrameInfo->layer = 0; + mp3FrameInfo->version = 0; + } else { + mp3FrameInfo->bitrate = mp3DecInfo->bitrate; + mp3FrameInfo->nChans = mp3DecInfo->nChans; + mp3FrameInfo->samprate = mp3DecInfo->samprate; + mp3FrameInfo->bitsPerSample = 16; + mp3FrameInfo->outputSamps = mp3DecInfo->nChans * (int)samplesPerFrameTab[mp3DecInfo->version][mp3DecInfo->layer - 1]; + mp3FrameInfo->layer = mp3DecInfo->layer; + mp3FrameInfo->version = mp3DecInfo->version; + } } /************************************************************************************** - * Function: MP3GetNextFrameInfo - * - * Description: parse MP3 frame header - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * pointer to MP3FrameInfo struct - * pointer to buffer containing valid MP3 frame header (located using - * MP3FindSyncWord(), above) - * - * Outputs: filled-in MP3FrameInfo struct - * - * Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) + Function: MP3GetNextFrameInfo + + Description: parse MP3 frame header + + Inputs: valid MP3 decoder instance pointer (HMP3Decoder) + pointer to MP3FrameInfo struct + pointer to buffer containing valid MP3 frame header (located using + MP3FindSyncWord(), above) + + Outputs: filled-in MP3FrameInfo struct + + Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) **************************************************************************************/ -int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; +int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf) { + MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - if (!mp3DecInfo) - return ERR_MP3_NULL_POINTER; + if (!mp3DecInfo) { + return ERR_MP3_NULL_POINTER; + } - if (UnpackFrameHeader(mp3DecInfo, buf) == -1 || mp3DecInfo->layer != 3) - return ERR_MP3_INVALID_FRAMEHEADER; + if (UnpackFrameHeader(mp3DecInfo, buf) == -1 || mp3DecInfo->layer != 3) { + return ERR_MP3_INVALID_FRAMEHEADER; + } - MP3GetLastFrameInfo(mp3DecInfo, mp3FrameInfo); + MP3GetLastFrameInfo(mp3DecInfo, mp3FrameInfo); - return ERR_MP3_NONE; + return ERR_MP3_NONE; } /************************************************************************************** - * Function: MP3ClearBadFrame - * - * Description: zero out pcm buffer if error decoding MP3 frame - * - * Inputs: mp3DecInfo struct with correct frame size parameters filled in - * pointer pcm output buffer - * - * Outputs: zeroed out pcm buffer - * - * Return: none + Function: MP3ClearBadFrame + + Description: zero out pcm buffer if error decoding MP3 frame + + Inputs: mp3DecInfo struct with correct frame size parameters filled in + pointer pcm output buffer + + Outputs: zeroed out pcm buffer + + Return: none **************************************************************************************/ -static void MP3ClearBadFrame(MP3DecInfo *mp3DecInfo, short *outbuf) -{ - int i; +static void MP3ClearBadFrame(MP3DecInfo *mp3DecInfo, short *outbuf) { + int i; - if (!mp3DecInfo) - return; + if (!mp3DecInfo) { + return; + } - for (i = 0; i < mp3DecInfo->nGrans * mp3DecInfo->nGranSamps * mp3DecInfo->nChans; i++) - outbuf[i] = 0; + for (i = 0; i < mp3DecInfo->nGrans * mp3DecInfo->nGranSamps * mp3DecInfo->nChans; i++) { + outbuf[i] = 0; + } } /************************************************************************************** - * Function: MP3Decode - * - * Description: decode one frame of MP3 data - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * double pointer to buffer of MP3 data (containing headers + mainData) - * number of valid bytes remaining in inbuf - * pointer to outbuf, big enough to hold one frame of decoded PCM samples - * flag indicating whether MP3 data is normal MPEG format (useSize = 0) - * or reformatted as "self-contained" frames (useSize = 1) - * - * Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo - * number of output samples = nGrans * nGranSamps * nChans - * updated inbuf pointer, updated bytesLeft - * - * Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) - * - * Notes: switching useSize on and off between frames in the same stream - * is not supported (bit reservoir is not maintained if useSize on) + Function: MP3Decode + + Description: decode one frame of MP3 data + + Inputs: valid MP3 decoder instance pointer (HMP3Decoder) + double pointer to buffer of MP3 data (containing headers + mainData) + number of valid bytes remaining in inbuf + pointer to outbuf, big enough to hold one frame of decoded PCM samples + flag indicating whether MP3 data is normal MPEG format (useSize = 0) + or reformatted as "self-contained" frames (useSize = 1) + + Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo + number of output samples = nGrans * nGranSamps * nChans + updated inbuf pointer, updated bytesLeft + + Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) + + Notes: switching useSize on and off between frames in the same stream + is not supported (bit reservoir is not maintained if useSize on) **************************************************************************************/ -int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize) -{ - int offset, bitOffset, mainBits, gr, ch, fhBytes, siBytes, freeFrameBytes; - int prevBitOffset, sfBlockBits, huffBlockBits; - unsigned char *mainPtr; - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - #ifdef PROFILE - long time; - #endif - - if (!mp3DecInfo) - return ERR_MP3_NULL_POINTER; - - /* unpack frame header */ - fhBytes = UnpackFrameHeader(mp3DecInfo, *inbuf); - if (fhBytes < 0) - return ERR_MP3_INVALID_FRAMEHEADER; /* don't clear outbuf since we don't know size (failed to parse header) */ - *inbuf += fhBytes; - +int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize) { + int offset, bitOffset, mainBits, gr, ch, fhBytes, siBytes, freeFrameBytes; + int prevBitOffset, sfBlockBits, huffBlockBits; + unsigned char *mainPtr; + MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; + +#ifdef PROFILE + long time; +#endif + + if (!mp3DecInfo) { + return ERR_MP3_NULL_POINTER; + } + + /* unpack frame header */ + fhBytes = UnpackFrameHeader(mp3DecInfo, *inbuf); + if (fhBytes < 0) { + return ERR_MP3_INVALID_FRAMEHEADER; /* don't clear outbuf since we don't know size (failed to parse header) */ + } + *inbuf += fhBytes; + +#ifdef PROFILE + time = systime_get(); +#endif + /* unpack side info */ + siBytes = UnpackSideInfo(mp3DecInfo, *inbuf); + if (siBytes < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_SIDEINFO; + } + *inbuf += siBytes; + *bytesLeft -= (fhBytes + siBytes); +#ifdef PROFILE + time = systime_get() - time; + printf("UnpackSideInfo: %i ms\n", time); +#endif + + + /* if free mode, need to calculate bitrate and nSlots manually, based on frame size */ + if (mp3DecInfo->bitrate == 0 || mp3DecInfo->freeBitrateFlag) { + if (!mp3DecInfo->freeBitrateFlag) { + /* first time through, need to scan for next sync word and figure out frame size */ + mp3DecInfo->freeBitrateFlag = 1; + mp3DecInfo->freeBitrateSlots = MP3FindFreeSync(*inbuf, *inbuf - fhBytes - siBytes, *bytesLeft); + if (mp3DecInfo->freeBitrateSlots < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_FREE_BITRATE_SYNC; + } + freeFrameBytes = mp3DecInfo->freeBitrateSlots + fhBytes + siBytes; + mp3DecInfo->bitrate = (freeFrameBytes * mp3DecInfo->samprate * 8) / (mp3DecInfo->nGrans * mp3DecInfo->nGranSamps); + } + mp3DecInfo->nSlots = mp3DecInfo->freeBitrateSlots + CheckPadBit(mp3DecInfo); /* add pad byte, if required */ + } + + /* useSize != 0 means we're getting reformatted (RTP) packets (see RFC 3119) + - calling function assembles "self-contained" MP3 frames by shifting any main_data + from the bit reservoir (in previous frames) to AFTER the sync word and side info + - calling function should set mainDataBegin to 0, and tell us exactly how large this + frame is (in bytesLeft) + */ + if (useSize) { + mp3DecInfo->nSlots = *bytesLeft; + if (mp3DecInfo->mainDataBegin != 0 || mp3DecInfo->nSlots <= 0) { + /* error - non self-contained frame, or missing frame (size <= 0), could do loss concealment here */ + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_FRAMEHEADER; + } + + /* can operate in-place on reformatted frames */ + mp3DecInfo->mainDataBytes = mp3DecInfo->nSlots; + mainPtr = *inbuf; + *inbuf += mp3DecInfo->nSlots; + *bytesLeft -= (mp3DecInfo->nSlots); + } else { + /* out of data - assume last or truncated frame */ + if (mp3DecInfo->nSlots > *bytesLeft) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INDATA_UNDERFLOW; + } + +#ifdef PROFILE + time = systime_get(); +#endif + /* fill main data buffer with enough new data for this frame */ + if (mp3DecInfo->mainDataBytes >= mp3DecInfo->mainDataBegin) { + /* adequate "old" main data available (i.e. bit reservoir) */ + memmove(mp3DecInfo->mainBuf, mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes - mp3DecInfo->mainDataBegin, mp3DecInfo->mainDataBegin); + memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBegin, *inbuf, mp3DecInfo->nSlots); + + mp3DecInfo->mainDataBytes = mp3DecInfo->mainDataBegin + mp3DecInfo->nSlots; + *inbuf += mp3DecInfo->nSlots; + *bytesLeft -= (mp3DecInfo->nSlots); + mainPtr = mp3DecInfo->mainBuf; + } else { + /* not enough data in bit reservoir from previous frames (perhaps starting in middle of file) */ + memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes, *inbuf, mp3DecInfo->nSlots); + mp3DecInfo->mainDataBytes += mp3DecInfo->nSlots; + *inbuf += mp3DecInfo->nSlots; + *bytesLeft -= (mp3DecInfo->nSlots); + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_MAINDATA_UNDERFLOW; + } +#ifdef PROFILE + time = systime_get() - time; + printf("data buffer filling: %i ms\n", time); +#endif + + } + bitOffset = 0; + mainBits = mp3DecInfo->mainDataBytes * 8; + + /* decode one complete frame */ + for (gr = 0; gr < mp3DecInfo->nGrans; gr++) { + for (ch = 0; ch < mp3DecInfo->nChans; ch++) { + +#ifdef PROFILE + time = systime_get(); +#endif + /* unpack scale factors and compute size of scale factor block */ + prevBitOffset = bitOffset; + offset = UnpackScaleFactors(mp3DecInfo, mainPtr, &bitOffset, mainBits, gr, ch); +#ifdef PROFILE + time = systime_get() - time; + printf("UnpackScaleFactors: %i ms\n", time); +#endif + + sfBlockBits = 8 * offset - prevBitOffset + bitOffset; + huffBlockBits = mp3DecInfo->part23Length[gr][ch] - sfBlockBits; + mainPtr += offset; + mainBits -= sfBlockBits; + + if (offset < 0 || mainBits < huffBlockBits) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_SCALEFACT; + } + +#ifdef PROFILE + time = systime_get(); +#endif + /* decode Huffman code words */ + prevBitOffset = bitOffset; + offset = DecodeHuffman(mp3DecInfo, mainPtr, &bitOffset, huffBlockBits, gr, ch); + if (offset < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_HUFFCODES; + } +#ifdef PROFILE + time = systime_get() - time; + printf("Huffman: %i ms\n", time); +#endif + + mainPtr += offset; + mainBits -= (8 * offset - prevBitOffset + bitOffset); + } + +#ifdef PROFILE + time = systime_get(); +#endif + /* dequantize coefficients, decode stereo, reorder short blocks */ + if (Dequantize(mp3DecInfo, gr) < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_DEQUANTIZE; + } +#ifdef PROFILE + time = systime_get() - time; + printf("Dequantize: %i ms\n", time); +#endif + + /* alias reduction, inverse MDCT, overlap-add, frequency inversion */ + for (ch = 0; ch < mp3DecInfo->nChans; ch++) { #ifdef PROFILE - time = systime_get(); + time = systime_get(); #endif - /* unpack side info */ - siBytes = UnpackSideInfo(mp3DecInfo, *inbuf); - if (siBytes < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SIDEINFO; - } - *inbuf += siBytes; - *bytesLeft -= (fhBytes + siBytes); + if (IMDCT(mp3DecInfo, gr, ch) < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_IMDCT; + } #ifdef PROFILE - time = systime_get() - time; - printf("UnpackSideInfo: %i ms\n", time); + time = systime_get() - time; + printf("IMDCT: %i ms\n", time); #endif - - - /* if free mode, need to calculate bitrate and nSlots manually, based on frame size */ - if (mp3DecInfo->bitrate == 0 || mp3DecInfo->freeBitrateFlag) { - if (!mp3DecInfo->freeBitrateFlag) { - /* first time through, need to scan for next sync word and figure out frame size */ - mp3DecInfo->freeBitrateFlag = 1; - mp3DecInfo->freeBitrateSlots = MP3FindFreeSync(*inbuf, *inbuf - fhBytes - siBytes, *bytesLeft); - if (mp3DecInfo->freeBitrateSlots < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_FREE_BITRATE_SYNC; - } - freeFrameBytes = mp3DecInfo->freeBitrateSlots + fhBytes + siBytes; - mp3DecInfo->bitrate = (freeFrameBytes * mp3DecInfo->samprate * 8) / (mp3DecInfo->nGrans * mp3DecInfo->nGranSamps); - } - mp3DecInfo->nSlots = mp3DecInfo->freeBitrateSlots + CheckPadBit(mp3DecInfo); /* add pad byte, if required */ - } - - /* useSize != 0 means we're getting reformatted (RTP) packets (see RFC 3119) - * - calling function assembles "self-contained" MP3 frames by shifting any main_data - * from the bit reservoir (in previous frames) to AFTER the sync word and side info - * - calling function should set mainDataBegin to 0, and tell us exactly how large this - * frame is (in bytesLeft) - */ - if (useSize) { - mp3DecInfo->nSlots = *bytesLeft; - if (mp3DecInfo->mainDataBegin != 0 || mp3DecInfo->nSlots <= 0) { - /* error - non self-contained frame, or missing frame (size <= 0), could do loss concealment here */ - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_FRAMEHEADER; - } - - /* can operate in-place on reformatted frames */ - mp3DecInfo->mainDataBytes = mp3DecInfo->nSlots; - mainPtr = *inbuf; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - } else { - /* out of data - assume last or truncated frame */ - if (mp3DecInfo->nSlots > *bytesLeft) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INDATA_UNDERFLOW; - } + } #ifdef PROFILE - time = systime_get(); + time = systime_get(); #endif - /* fill main data buffer with enough new data for this frame */ - if (mp3DecInfo->mainDataBytes >= mp3DecInfo->mainDataBegin) { - /* adequate "old" main data available (i.e. bit reservoir) */ - memmove(mp3DecInfo->mainBuf, mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes - mp3DecInfo->mainDataBegin, mp3DecInfo->mainDataBegin); - memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBegin, *inbuf, mp3DecInfo->nSlots); - - mp3DecInfo->mainDataBytes = mp3DecInfo->mainDataBegin + mp3DecInfo->nSlots; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - mainPtr = mp3DecInfo->mainBuf; - } else { - /* not enough data in bit reservoir from previous frames (perhaps starting in middle of file) */ - memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes, *inbuf, mp3DecInfo->nSlots); - mp3DecInfo->mainDataBytes += mp3DecInfo->nSlots; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_MAINDATA_UNDERFLOW; - } + /* subband transform - if stereo, interleaves pcm LRLRLR */ + if (Subband(mp3DecInfo, outbuf + gr * mp3DecInfo->nGranSamps * mp3DecInfo->nChans) < 0) { + MP3ClearBadFrame(mp3DecInfo, outbuf); + return ERR_MP3_INVALID_SUBBAND; + } #ifdef PROFILE - time = systime_get() - time; - printf("data buffer filling: %i ms\n", time); + time = systime_get() - time; + printf("Subband: %i ms\n", time); #endif - } - bitOffset = 0; - mainBits = mp3DecInfo->mainDataBytes * 8; - - /* decode one complete frame */ - for (gr = 0; gr < mp3DecInfo->nGrans; gr++) { - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - - #ifdef PROFILE - time = systime_get(); - #endif - /* unpack scale factors and compute size of scale factor block */ - prevBitOffset = bitOffset; - offset = UnpackScaleFactors(mp3DecInfo, mainPtr, &bitOffset, mainBits, gr, ch); - #ifdef PROFILE - time = systime_get() - time; - printf("UnpackScaleFactors: %i ms\n", time); - #endif - - sfBlockBits = 8*offset - prevBitOffset + bitOffset; - huffBlockBits = mp3DecInfo->part23Length[gr][ch] - sfBlockBits; - mainPtr += offset; - mainBits -= sfBlockBits; - - if (offset < 0 || mainBits < huffBlockBits) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SCALEFACT; - } - - #ifdef PROFILE - time = systime_get(); - #endif - /* decode Huffman code words */ - prevBitOffset = bitOffset; - offset = DecodeHuffman(mp3DecInfo, mainPtr, &bitOffset, huffBlockBits, gr, ch); - if (offset < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_HUFFCODES; - } - #ifdef PROFILE - time = systime_get() - time; - printf("Huffman: %i ms\n", time); - #endif - - mainPtr += offset; - mainBits -= (8*offset - prevBitOffset + bitOffset); - } - - #ifdef PROFILE - time = systime_get(); - #endif - /* dequantize coefficients, decode stereo, reorder short blocks */ - if (Dequantize(mp3DecInfo, gr) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_DEQUANTIZE; - } - #ifdef PROFILE - time = systime_get() - time; - printf("Dequantize: %i ms\n", time); - #endif - - /* alias reduction, inverse MDCT, overlap-add, frequency inversion */ - for (ch = 0; ch < mp3DecInfo->nChans; ch++) - { - #ifdef PROFILE - time = systime_get(); - #endif - if (IMDCT(mp3DecInfo, gr, ch) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_IMDCT; - } - #ifdef PROFILE - time = systime_get() - time; - printf("IMDCT: %i ms\n", time); - #endif - } - - #ifdef PROFILE - time = systime_get(); - #endif - /* subband transform - if stereo, interleaves pcm LRLRLR */ - if (Subband(mp3DecInfo, outbuf + gr*mp3DecInfo->nGranSamps*mp3DecInfo->nChans) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SUBBAND; - } - #ifdef PROFILE - time = systime_get() - time; - printf("Subband: %i ms\n", time); - #endif - - } - return ERR_MP3_NONE; + } + return ERR_MP3_NONE; } diff --git a/src/libhelix-mp3/mp3dec.h b/src/libhelix-mp3/mp3dec.h index 04c4b653..98b30423 100644 --- a/src/libhelix-mp3/mp3dec.h +++ b/src/libhelix-mp3/mp3dec.h @@ -1,49 +1,49 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3dec.h - public C API for MP3 decoder + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + mp3dec.h - public C API for MP3 decoder **************************************************************************************/ #include #define Word64 uint64_t - + #ifndef _MP3DEC_H #define _MP3DEC_H @@ -72,11 +72,11 @@ extern "C" { #endif -/* determining MAINBUF_SIZE: - * max mainDataBegin = (2^9 - 1) bytes (since 9-bit offset) = 511 - * max nSlots (concatenated with mainDataBegin bytes from before) = 1440 - 9 - 4 + 1 = 1428 - * 511 + 1428 = 1939, round up to 1940 (4-byte align) - */ +/* determining MAINBUF_SIZE: + max mainDataBegin = (2^9 - 1) bytes (since 9-bit offset) = 511 + max nSlots (concatenated with mainDataBegin bytes from before) = 1440 - 9 - 4 + 1 = 1428 + 511 + 1428 = 1939, round up to 1940 (4-byte align) +*/ #define MAINBUF_SIZE 1940 #define MAX_NGRAN 2 /* max granules */ @@ -85,39 +85,39 @@ extern "C" { /* map to 0,1,2 to make table indexing easier */ typedef enum { - MPEG1 = 0, - MPEG2 = 1, - MPEG25 = 2 + MPEG1 = 0, + MPEG2 = 1, + MPEG25 = 2 } MPEGVersion; typedef void *HMP3Decoder; enum { - ERR_MP3_NONE = 0, - ERR_MP3_INDATA_UNDERFLOW = -1, - ERR_MP3_MAINDATA_UNDERFLOW = -2, - ERR_MP3_FREE_BITRATE_SYNC = -3, - ERR_MP3_OUT_OF_MEMORY = -4, - ERR_MP3_NULL_POINTER = -5, - ERR_MP3_INVALID_FRAMEHEADER = -6, - ERR_MP3_INVALID_SIDEINFO = -7, - ERR_MP3_INVALID_SCALEFACT = -8, - ERR_MP3_INVALID_HUFFCODES = -9, - ERR_MP3_INVALID_DEQUANTIZE = -10, - ERR_MP3_INVALID_IMDCT = -11, - ERR_MP3_INVALID_SUBBAND = -12, - - ERR_UNKNOWN = -9999 + ERR_MP3_NONE = 0, + ERR_MP3_INDATA_UNDERFLOW = -1, + ERR_MP3_MAINDATA_UNDERFLOW = -2, + ERR_MP3_FREE_BITRATE_SYNC = -3, + ERR_MP3_OUT_OF_MEMORY = -4, + ERR_MP3_NULL_POINTER = -5, + ERR_MP3_INVALID_FRAMEHEADER = -6, + ERR_MP3_INVALID_SIDEINFO = -7, + ERR_MP3_INVALID_SCALEFACT = -8, + ERR_MP3_INVALID_HUFFCODES = -9, + ERR_MP3_INVALID_DEQUANTIZE = -10, + ERR_MP3_INVALID_IMDCT = -11, + ERR_MP3_INVALID_SUBBAND = -12, + + ERR_UNKNOWN = -9999 }; typedef struct _MP3FrameInfo { - int bitrate; - int nChans; - int samprate; - int bitsPerSample; - int outputSamps; - int layer; - int version; + int bitrate; + int nChans; + int samprate; + int bitsPerSample; + int outputSamps; + int layer; + int version; } MP3FrameInfo; /* public API */ diff --git a/src/libhelix-mp3/mp3tabs.c b/src/libhelix-mp3/mp3tabs.c index 7d5fec22..5da48baf 100644 --- a/src/libhelix-mp3/mp3tabs.c +++ b/src/libhelix-mp3/mp3tabs.c @@ -1,182 +1,182 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3tabs.c - platform-independent tables for MP3 decoder (global, read-only) + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + mp3tabs.c - platform-independent tables for MP3 decoder (global, read-only) **************************************************************************************/ #include "mp3common.h" #include -/* indexing = [version][samplerate index] - * sample rate of frame (Hz) - */ +/* indexing = [version][samplerate index] + sample rate of frame (Hz) +*/ const int samplerateTab[3][3] PROGMEM = { - {44100, 48000, 32000}, /* MPEG-1 */ - {22050, 24000, 16000}, /* MPEG-2 */ - {11025, 12000, 8000}, /* MPEG-2.5 */ + {44100, 48000, 32000}, /* MPEG-1 */ + {22050, 24000, 16000}, /* MPEG-2 */ + {11025, 12000, 8000}, /* MPEG-2.5 */ }; -/* indexing = [version][layer][bitrate index] - * bitrate (kbps) of frame - * - bitrate index == 0 is "free" mode (bitrate determined on the fly by - * counting bits between successive sync words) - */ +/* indexing = [version][layer][bitrate index] + bitrate (kbps) of frame + - bitrate index == 0 is "free" mode (bitrate determined on the fly by + counting bits between successive sync words) +*/ const int/*short*/ bitrateTab[3][3][15] PROGMEM = { - { - /* MPEG-1 */ - { 0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448}, /* Layer 1 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384}, /* Layer 2 */ - { 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}, /* Layer 3 */ - }, - { - /* MPEG-2 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */ - }, - { - /* MPEG-2.5 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */ - }, + { + /* MPEG-1 */ + { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448}, /* Layer 1 */ + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384}, /* Layer 2 */ + { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320}, /* Layer 3 */ + }, + { + /* MPEG-2 */ + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256}, /* Layer 1 */ + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}, /* Layer 2 */ + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}, /* Layer 3 */ + }, + { + /* MPEG-2.5 */ + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256}, /* Layer 1 */ + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}, /* Layer 2 */ + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}, /* Layer 3 */ + }, }; -/* indexing = [version][layer] - * number of samples in one frame (per channel) - */ +/* indexing = [version][layer] + number of samples in one frame (per channel) +*/ const int/*short*/ samplesPerFrameTab[3][3] PROGMEM = { - {384, 1152, 1152 }, /* MPEG1 */ - {384, 1152, 576 }, /* MPEG2 */ - {384, 1152, 576 }, /* MPEG2.5 */ + {384, 1152, 1152 }, /* MPEG1 */ + {384, 1152, 576 }, /* MPEG2 */ + {384, 1152, 576 }, /* MPEG2.5 */ }; /* layers 1, 2, 3 */ const short bitsPerSlotTab[3] = {32, 8, 8}; -/* indexing = [version][mono/stereo] - * number of bytes in side info section of bitstream - */ +/* indexing = [version][mono/stereo] + number of bytes in side info section of bitstream +*/ const int/*short*/ sideBytesTab[3][2] PROGMEM = { - {17, 32}, /* MPEG-1: mono, stereo */ - { 9, 17}, /* MPEG-2: mono, stereo */ - { 9, 17}, /* MPEG-2.5: mono, stereo */ + {17, 32}, /* MPEG-1: mono, stereo */ + { 9, 17}, /* MPEG-2: mono, stereo */ + { 9, 17}, /* MPEG-2.5: mono, stereo */ }; -/* indexing = [version][sampleRate][bitRate] - * for layer3, nSlots = floor(samps/frame * bitRate / sampleRate / 8) - * - add one pad slot if necessary - */ +/* indexing = [version][sampleRate][bitRate] + for layer3, nSlots = floor(samps/frame * bitRate / sampleRate / 8) + - add one pad slot if necessary +*/ const int/*short*/ slotTab[3][3][15] PROGMEM = { - { - /* MPEG-1 */ - { 0, 104, 130, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835,1044 }, /* 44 kHz */ - { 0, 96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960 }, /* 48 kHz */ - { 0, 144, 180, 216, 252, 288, 360, 432, 504, 576, 720, 864,1008,1152,1440 }, /* 32 kHz */ - }, - { - /* MPEG-2 */ - { 0, 26, 52, 78, 104, 130, 156, 182, 208, 261, 313, 365, 417, 470, 522 }, /* 22 kHz */ - { 0, 24, 48, 72, 96, 120, 144, 168, 192, 240, 288, 336, 384, 432, 480 }, /* 24 kHz */ - { 0, 36, 72, 108, 144, 180, 216, 252, 288, 360, 432, 504, 576, 648, 720 }, /* 16 kHz */ - }, - { - /* MPEG-2.5 */ - { 0, 52, 104, 156, 208, 261, 313, 365, 417, 522, 626, 731, 835, 940,1044 }, /* 11 kHz */ - { 0, 48, 96, 144, 192, 240, 288, 336, 384, 480, 576, 672, 768, 864, 960 }, /* 12 kHz */ - { 0, 72, 144, 216, 288, 360, 432, 504, 576, 720, 864,1008,1152,1296,1440 }, /* 8 kHz */ - }, + { + /* MPEG-1 */ + { 0, 104, 130, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835, 1044 }, /* 44 kHz */ + { 0, 96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960 }, /* 48 kHz */ + { 0, 144, 180, 216, 252, 288, 360, 432, 504, 576, 720, 864, 1008, 1152, 1440 }, /* 32 kHz */ + }, + { + /* MPEG-2 */ + { 0, 26, 52, 78, 104, 130, 156, 182, 208, 261, 313, 365, 417, 470, 522 }, /* 22 kHz */ + { 0, 24, 48, 72, 96, 120, 144, 168, 192, 240, 288, 336, 384, 432, 480 }, /* 24 kHz */ + { 0, 36, 72, 108, 144, 180, 216, 252, 288, 360, 432, 504, 576, 648, 720 }, /* 16 kHz */ + }, + { + /* MPEG-2.5 */ + { 0, 52, 104, 156, 208, 261, 313, 365, 417, 522, 626, 731, 835, 940, 1044 }, /* 11 kHz */ + { 0, 48, 96, 144, 192, 240, 288, 336, 384, 480, 576, 672, 768, 864, 960 }, /* 12 kHz */ + { 0, 72, 144, 216, 288, 360, 432, 504, 576, 720, 864, 1008, 1152, 1296, 1440 }, /* 8 kHz */ + }, }; -/* indexing = [version][sampleRate][long (.l) or short (.s) block] - * sfBandTable[v][s].l[cb] = index of first bin in critical band cb (long blocks) - * sfBandTable[v][s].s[cb] = index of first bin in critical band cb (short blocks) - */ +/* indexing = [version][sampleRate][long (.l) or short (.s) block] + sfBandTable[v][s].l[cb] = index of first bin in critical band cb (long blocks) + sfBandTable[v][s].s[cb] = index of first bin in critical band cb (short blocks) +*/ const SFBandTable sfBandTable[3][3] PROGMEM = { - { - /* MPEG-1 (44, 48, 32 kHz) */ - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90,110,134,162,196,238,288,342,418,576 }, - { 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84,106,136,192 } - }, - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88,106,128,156,190,230,276,330,384,576 }, - { 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80,100,126,192 } - }, - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82,102,126,156,194,240,296,364,448,550,576 }, - { 0, 4, 8, 12, 16, 22, 30, 42, 58, 78,104,138,180,192 } - } - }, - - { - /* MPEG-2 (22, 24, 16 kHz) */ - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 24, 32, 42, 56, 74,100,132,174,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,114,136,162,194,232,278,332,394,464,540,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,136,180,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - }, - - { - /* MPEG-2.5 (11, 12, 8 kHz) */ - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - { - { 0, 12, 24, 36, 48, 60, 72, 88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576 }, - { 0, 8, 16, 24, 36, 52, 72, 96,124,160,162,164,166,192 } - }, - }, + { + /* MPEG-1 (44, 48, 32 kHz) */ + { + { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576 }, + { 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192 } + }, + { + { 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576 }, + { 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192 } + }, + { + { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576 }, + { 0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192 } + } + }, + + { + /* MPEG-2 (22, 24, 16 kHz) */ + { + { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576 }, + { 0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192 } + }, + { + { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576 }, + { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192 } + }, + { + { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576 }, + { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 } + }, + }, + + { + /* MPEG-2.5 (11, 12, 8 kHz) */ + { + { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576 }, + { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 } + }, + { + { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576 }, + { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 } + }, + { + { 0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576 }, + { 0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192 } + }, + }, }; diff --git a/src/libhelix-mp3/mpadecobjfixpt.h b/src/libhelix-mp3/mpadecobjfixpt.h index a8a5c40f..904c983f 100644 --- a/src/libhelix-mp3/mpadecobjfixpt.h +++ b/src/libhelix-mp3/mpadecobjfixpt.h @@ -1,45 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ #ifndef _MPADECOBJFIXPT_H_ #define _MPADECOBJFIXPT_H_ #include "mp3dec.h" /* public C API for new MP3 decoder */ -class CMpaDecObj -{ +class CMpaDecObj { public: CMpaDecObj(); ~CMpaDecObj(); @@ -59,7 +58,7 @@ class CMpaDecObj /////////////////////////////////////////////////////////////////////////// int Init_n(unsigned char *pSync, unsigned long ulSize, - unsigned char bUseSize=0); + unsigned char bUseSize = 0); /////////////////////////////////////////////////////////////////////////// // Function: DecodeFrame_v @@ -70,39 +69,41 @@ class CMpaDecObj // return. // pPCM pointer to a buffer to decode into // pulPCMSize size of the PCM buffer. It will contain the - // number of PCM bytes prodced upon return. + // number of PCM bytes produced upon return. /////////////////////////////////////////////////////////////////////////// void DecodeFrame_v(unsigned char *pSource, - unsigned long *pulSize, - unsigned char *pPCM, - unsigned long *pulPCMSize); + unsigned long *pulSize, + unsigned char *pPCM, + unsigned long *pulPCMSize); - // overloaded new version that returns error code in errCode + // overloaded new version that returns error code in errCode void DecodeFrame_v(unsigned char *pSource, - unsigned long *pulSize, - unsigned char *pPCM, - unsigned long *pulPCMSize, - int *errCode); + unsigned long *pulSize, + unsigned char *pPCM, + unsigned long *pulPCMSize, + int *errCode); void GetPCMInfo_v(unsigned long &ulSampRate, int &nChannels, int &nBitsPerSample); - // return number of samples per frame, PER CHANNEL (renderer multiplies this result by nChannels) + // return number of samples per frame, PER CHANNEL (renderer multiplies this result by nChannels) int GetSamplesPerFrame_n(); - void SetTrustPackets(unsigned char bTrust) { m_bTrustPackets = bTrust; } + void SetTrustPackets(unsigned char bTrust) { + m_bTrustPackets = bTrust; + } private: - void * m_pDec; // generic void ptr + void * m_pDec; // generic void ptr - void * m_pDecL1; // not implemented (could use old Xing mpadecl1.cpp) - void * m_pDecL2; // not implemented (could use old Xing mpadecl2.cpp) - HMP3Decoder m_pDecL3; + void * m_pDecL1; // not implemented (could use old Xing mpadecl1.cpp) + void * m_pDecL2; // not implemented (could use old Xing mpadecl2.cpp) + HMP3Decoder m_pDecL3; - MP3FrameInfo m_lastMP3FrameInfo; - unsigned char m_bUseFrameSize; - unsigned char m_bTrustPackets; + MP3FrameInfo m_lastMP3FrameInfo; + unsigned char m_bUseFrameSize; + unsigned char m_bTrustPackets; }; #endif /* _MPADECOBJFIXPT_H_ */ diff --git a/src/libhelix-mp3/polyphase.c b/src/libhelix-mp3/polyphase.c index bd331dfe..df944ed2 100644 --- a/src/libhelix-mp3/polyphase.c +++ b/src/libhelix-mp3/polyphase.c @@ -1,74 +1,74 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * polyphase.c - final stage of subband transform (polyphase synthesis filter) - * - * This is the C reference version using __int64 - * Look in the appropriate subdirectories for optimized asm implementations - * (e.g. arm/asmpoly.s) + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + polyphase.c - final stage of subband transform (polyphase synthesis filter) + + This is the C reference version using __int64 + Look in the appropriate subdirectories for optimized asm implementations + (e.g. arm/asmpoly.s) **************************************************************************************/ #include "coder.h" #include "assembly.h" -/* input to Polyphase = Q(DQ_FRACBITS_OUT-2), gain 2 bits in convolution - * we also have the implicit bias of 2^15 to add back, so net fraction bits = - * DQ_FRACBITS_OUT - 2 - 2 - 15 - * (see comment on Dequantize() for more info) - */ -#define DEF_NFRACBITS (DQ_FRACBITS_OUT - 2 - 2 - 15) -#define CSHIFT 12 /* coefficients have 12 leading sign bits for early-terminating mulitplies */ - -static __inline short ClipToShort(int x, int fracBits) -{ - int sign; - - /* assumes you've already rounded (x += (1 << (fracBits-1))) */ - x >>= fracBits; - - /* Ken's trick: clips to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); - - return (short)x; +/* input to Polyphase = Q(DQ_FRACBITS_OUT-2), gain 2 bits in convolution + we also have the implicit bias of 2^15 to add back, so net fraction bits = + DQ_FRACBITS_OUT - 2 - 2 - 15 + (see comment on Dequantize() for more info) +*/ +#define DEF_NFRACBITS (DQ_FRACBITS_OUT - 2 - 2 - 15) +#define CSHIFT 12 /* coefficients have 12 leading sign bits for early-terminating multiplies */ + +static __inline short ClipToShort(int x, int fracBits) { + int sign; + + /* assumes you've already rounded (x += (1 << (fracBits-1))) */ + x >>= fracBits; + + /* Ken's trick: clips to [-32768, 32767] */ + sign = x >> 31; + if (sign != (x >> 15)) { + x = sign ^ ((1 << 15) - 1); + } + + return (short)x; } #define MC0M(x) { \ @@ -91,89 +91,88 @@ static __inline short ClipToShort(int x, int fracBits) } /************************************************************************************** - * Function: PolyphaseMono - * - * Description: filter one subband and produce 32 output PCM samples for one channel - * - * Inputs: pointer to PCM output buffer - * number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) - * pointer to start of vbuf (preserved from last call) - * start of filter coefficient table (in proper, shuffled order) - * no minimum number of guard bits is required for input vbuf - * (see additional scaling comments below) - * - * Outputs: 32 samples of one channel of decoded PCM data, (i.e. Q16.0) - * - * Return: none - * - * TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported - * (note max filter gain - see polyCoef[] comments) + Function: PolyphaseMono + + Description: filter one subband and produce 32 output PCM samples for one channel + + Inputs: pointer to PCM output buffer + number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) + pointer to start of vbuf (preserved from last call) + start of filter coefficient table (in proper, shuffled order) + no minimum number of guard bits is required for input vbuf + (see additional scaling comments below) + + Outputs: 32 samples of one channel of decoded PCM data, (i.e. Q16.0) + + Return: none + + TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported + (note max filter gain - see polyCoef[] comments) **************************************************************************************/ -void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) -{ - int i; - const int *coef; - int *vb1; - int vLo, vHi, c1, c2; - Word64 sum1L, sum2L, rndVal; - - rndVal = (Word64)( 1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT)) ); - - /* special case, output sample 0 */ - coef = coefBase; - vb1 = vbuf; - sum1L = rndVal; - - MC0M(0) - MC0M(1) - MC0M(2) - MC0M(3) - MC0M(4) - MC0M(5) - MC0M(6) - MC0M(7) - - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - - /* special case, output sample 16 */ - coef = coefBase + 256; - vb1 = vbuf + 64*16; - sum1L = rndVal; - - MC1M(0) - MC1M(1) - MC1M(2) - MC1M(3) - MC1M(4) - MC1M(5) - MC1M(6) - MC1M(7) - - *(pcm + 16) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - - /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ - coef = coefBase + 16; - vb1 = vbuf + 64; - pcm++; - - /* right now, the compiler creates bad asm from this... */ - for (i = 15; i > 0; i--) { - sum1L = sum2L = rndVal; - - MC2M(0) - MC2M(1) - MC2M(2) - MC2M(3) - MC2M(4) - MC2M(5) - MC2M(6) - MC2M(7) - - vb1 += 64; - *(pcm) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*i) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS); - pcm++; - } +void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) { + int i; + const int *coef; + int *vb1; + int vLo, vHi, c1, c2; + Word64 sum1L, sum2L, rndVal; + + rndVal = (Word64)(1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT))); + + /* special case, output sample 0 */ + coef = coefBase; + vb1 = vbuf; + sum1L = rndVal; + + MC0M(0) + MC0M(1) + MC0M(2) + MC0M(3) + MC0M(4) + MC0M(5) + MC0M(6) + MC0M(7) + + *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + + /* special case, output sample 16 */ + coef = coefBase + 256; + vb1 = vbuf + 64 * 16; + sum1L = rndVal; + + MC1M(0) + MC1M(1) + MC1M(2) + MC1M(3) + MC1M(4) + MC1M(5) + MC1M(6) + MC1M(7) + + *(pcm + 16) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + + /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ + coef = coefBase + 16; + vb1 = vbuf + 64; + pcm++; + + /* right now, the compiler creates bad asm from this... */ + for (i = 15; i > 0; i--) { + sum1L = sum2L = rndVal; + + MC2M(0) + MC2M(1) + MC2M(2) + MC2M(3) + MC2M(4) + MC2M(5) + MC2M(6) + MC2M(7) + + vb1 += 64; + *(pcm) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 2 * i) = ClipToShort((int)SAR64(sum2L, (32 - CSHIFT)), DEF_NFRACBITS); + pcm++; + } } #define MC0S(x) { \ @@ -203,93 +202,92 @@ void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) } /************************************************************************************** - * Function: PolyphaseStereo - * - * Description: filter one subband and produce 32 output PCM samples for each channel - * - * Inputs: pointer to PCM output buffer - * number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) - * pointer to start of vbuf (preserved from last call) - * start of filter coefficient table (in proper, shuffled order) - * no minimum number of guard bits is required for input vbuf - * (see additional scaling comments below) - * - * Outputs: 32 samples of two channels of decoded PCM data, (i.e. Q16.0) - * - * Return: none - * - * Notes: interleaves PCM samples LRLRLR... - * - * TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported + Function: PolyphaseStereo + + Description: filter one subband and produce 32 output PCM samples for each channel + + Inputs: pointer to PCM output buffer + number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) + pointer to start of vbuf (preserved from last call) + start of filter coefficient table (in proper, shuffled order) + no minimum number of guard bits is required for input vbuf + (see additional scaling comments below) + + Outputs: 32 samples of two channels of decoded PCM data, (i.e. Q16.0) + + Return: none + + Notes: interleaves PCM samples LRLRLR... + + TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported **************************************************************************************/ -void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) -{ - int i; - const int *coef; - int *vb1; - int vLo, vHi, c1, c2; - Word64 sum1L, sum2L, sum1R, sum2R, rndVal; - - rndVal = (Word64)( 1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT)) ); - - /* special case, output sample 0 */ - coef = coefBase; - vb1 = vbuf; - sum1L = sum1R = rndVal; - - MC0S(0) - MC0S(1) - MC0S(2) - MC0S(3) - MC0S(4) - MC0S(5) - MC0S(6) - MC0S(7) - - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - - /* special case, output sample 16 */ - coef = coefBase + 256; - vb1 = vbuf + 64*16; - sum1L = sum1R = rndVal; - - MC1S(0) - MC1S(1) - MC1S(2) - MC1S(3) - MC1S(4) - MC1S(5) - MC1S(6) - MC1S(7) - - *(pcm + 2*16 + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*16 + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - - /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ - coef = coefBase + 16; - vb1 = vbuf + 64; - pcm += 2; - - /* right now, the compiler creates bad asm from this... */ - for (i = 15; i > 0; i--) { - sum1L = sum2L = rndVal; - sum1R = sum2R = rndVal; - - MC2S(0) - MC2S(1) - MC2S(2) - MC2S(3) - MC2S(4) - MC2S(5) - MC2S(6) - MC2S(7) - - vb1 += 64; - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*2*i + 0) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*2*i + 1) = ClipToShort((int)SAR64(sum2R, (32-CSHIFT)), DEF_NFRACBITS); - pcm += 2; - } +void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) { + int i; + const int *coef; + int *vb1; + int vLo, vHi, c1, c2; + Word64 sum1L, sum2L, sum1R, sum2R, rndVal; + + rndVal = (Word64)(1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT))); + + /* special case, output sample 0 */ + coef = coefBase; + vb1 = vbuf; + sum1L = sum1R = rndVal; + + MC0S(0) + MC0S(1) + MC0S(2) + MC0S(3) + MC0S(4) + MC0S(5) + MC0S(6) + MC0S(7) + + *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32 - CSHIFT)), DEF_NFRACBITS); + + /* special case, output sample 16 */ + coef = coefBase + 256; + vb1 = vbuf + 64 * 16; + sum1L = sum1R = rndVal; + + MC1S(0) + MC1S(1) + MC1S(2) + MC1S(3) + MC1S(4) + MC1S(5) + MC1S(6) + MC1S(7) + + *(pcm + 2 * 16 + 0) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 2 * 16 + 1) = ClipToShort((int)SAR64(sum1R, (32 - CSHIFT)), DEF_NFRACBITS); + + /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ + coef = coefBase + 16; + vb1 = vbuf + 64; + pcm += 2; + + /* right now, the compiler creates bad asm from this... */ + for (i = 15; i > 0; i--) { + sum1L = sum2L = rndVal; + sum1R = sum2R = rndVal; + + MC2S(0) + MC2S(1) + MC2S(2) + MC2S(3) + MC2S(4) + MC2S(5) + MC2S(6) + MC2S(7) + + vb1 += 64; + *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 2 * 2 * i + 0) = ClipToShort((int)SAR64(sum2L, (32 - CSHIFT)), DEF_NFRACBITS); + *(pcm + 2 * 2 * i + 1) = ClipToShort((int)SAR64(sum2R, (32 - CSHIFT)), DEF_NFRACBITS); + pcm += 2; + } } diff --git a/src/libhelix-mp3/scalfact.c b/src/libhelix-mp3/scalfact.c index 4937e453..0d4e81b4 100644 --- a/src/libhelix-mp3/scalfact.c +++ b/src/libhelix-mp3/scalfact.c @@ -1,392 +1,409 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * scalfact.c - scalefactor unpacking functions + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + scalfact.c - scalefactor unpacking functions **************************************************************************************/ #include "coder.h" /* scale factor lengths (num bits) */ static const char SFLenTab[16][2] = { - {0, 0}, {0, 1}, - {0, 2}, {0, 3}, - {3, 0}, {1, 1}, - {1, 2}, {1, 3}, - {2, 1}, {2, 2}, - {2, 3}, {3, 1}, - {3, 2}, {3, 3}, - {4, 2}, {4, 3}, + {0, 0}, {0, 1}, + {0, 2}, {0, 3}, + {3, 0}, {1, 1}, + {1, 2}, {1, 3}, + {2, 1}, {2, 2}, + {2, 3}, {3, 1}, + {3, 2}, {3, 3}, + {4, 2}, {4, 3}, }; /************************************************************************************** - * Function: UnpackSFMPEG1 - * - * Description: unpack MPEG 1 scalefactors from bitstream - * - * Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this - * granule/channel - * vector of scfsi flags from side info, length = 4 (MAX_SCFBD) - * index of current granule - * ScaleFactorInfoSub from granule 0 (for granule 1, if scfsi[i] is set, - * then we just replicate the scale factors from granule 0 in the - * i'th set of scalefactor bands) - * - * Outputs: updated BitStreamInfo struct - * scalefactors in sfis (short and/or long arrays, as appropriate) - * - * Return: none - * - * Notes: set order of short blocks to s[band][window] instead of s[window][band] - * so that we index through consectutive memory locations when unpacking - * (make sure dequantizer follows same convention) - * Illegal Intensity Position = 7 (always) for MPEG1 scale factors + Function: UnpackSFMPEG1 + + Description: unpack MPEG 1 scalefactors from bitstream + + Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this + granule/channel + vector of scfsi flags from side info, length = 4 (MAX_SCFBD) + index of current granule + ScaleFactorInfoSub from granule 0 (for granule 1, if scfsi[i] is set, + then we just replicate the scale factors from granule 0 in the + i'th set of scalefactor bands) + + Outputs: updated BitStreamInfo struct + scalefactors in sfis (short and/or long arrays, as appropriate) + + Return: none + + Notes: set order of short blocks to s[band][window] instead of s[window][band] + so that we index through consecutive memory locations when unpacking + (make sure dequantizer follows same convention) + Illegal Intensity Position = 7 (always) for MPEG1 scale factors **************************************************************************************/ -static void UnpackSFMPEG1(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int *scfsi, int gr, ScaleFactorInfoSub *sfisGr0) -{ - int sfb; - int slen0, slen1; - - /* these can be 0, so make sure GetBits(bsi, 0) returns 0 (no >> 32 or anything) */ - slen0 = (int)SFLenTab[sis->sfCompress][0]; - slen1 = (int)SFLenTab[sis->sfCompress][1]; - - if (sis->blockType == 2) { - /* short block, type 2 (implies winSwitchFlag == 1) */ - if (sis->mixedBlock) { - /* do long block portion */ - for (sfb = 0; sfb < 8; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen0); - sfb = 3; - } else { - /* all short blocks */ - sfb = 0; - } - - for ( ; sfb < 6; sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen0); - sfis->s[sfb][1] = (char)GetBits(bsi, slen0); - sfis->s[sfb][2] = (char)GetBits(bsi, slen0); - } - - for ( ; sfb < 12; sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen1); - sfis->s[sfb][1] = (char)GetBits(bsi, slen1); - sfis->s[sfb][2] = (char)GetBits(bsi, slen1); - } - - /* last sf band not transmitted */ - sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; - } else { - /* long blocks, type 0, 1, or 3 */ - if(gr == 0) { - /* first granule */ - for (sfb = 0; sfb < 11; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen0); - for (sfb = 11; sfb < 21; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen1); - return; - } else { - /* second granule - * scfsi: 0 = different scalefactors for each granule, 1 = copy sf's from granule 0 into granule 1 - * for block type == 2, scfsi is always 0 - */ - sfb = 0; - if(scfsi[0]) for( ; sfb < 6 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb < 6 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen0); - if(scfsi[1]) for( ; sfb <11 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <11 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen0); - if(scfsi[2]) for( ; sfb <16 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <16 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen1); - if(scfsi[3]) for( ; sfb <21 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <21 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen1); - } - /* last sf band not transmitted */ - sfis->l[21] = 0; - sfis->l[22] = 0; - } +static void UnpackSFMPEG1(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int *scfsi, int gr, ScaleFactorInfoSub *sfisGr0) { + int sfb; + int slen0, slen1; + + /* these can be 0, so make sure GetBits(bsi, 0) returns 0 (no >> 32 or anything) */ + slen0 = (int)SFLenTab[sis->sfCompress][0]; + slen1 = (int)SFLenTab[sis->sfCompress][1]; + + if (sis->blockType == 2) { + /* short block, type 2 (implies winSwitchFlag == 1) */ + if (sis->mixedBlock) { + /* do long block portion */ + for (sfb = 0; sfb < 8; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen0); + } + sfb = 3; + } else { + /* all short blocks */ + sfb = 0; + } + + for (; sfb < 6; sfb++) { + sfis->s[sfb][0] = (char)GetBits(bsi, slen0); + sfis->s[sfb][1] = (char)GetBits(bsi, slen0); + sfis->s[sfb][2] = (char)GetBits(bsi, slen0); + } + + for (; sfb < 12; sfb++) { + sfis->s[sfb][0] = (char)GetBits(bsi, slen1); + sfis->s[sfb][1] = (char)GetBits(bsi, slen1); + sfis->s[sfb][2] = (char)GetBits(bsi, slen1); + } + + /* last sf band not transmitted */ + sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; + } else { + /* long blocks, type 0, 1, or 3 */ + if (gr == 0) { + /* first granule */ + for (sfb = 0; sfb < 11; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen0); + } + for (sfb = 11; sfb < 21; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen1); + } + return; + } else { + /* second granule + scfsi: 0 = different scalefactors for each granule, 1 = copy sf's from granule 0 into granule 1 + for block type == 2, scfsi is always 0 + */ + sfb = 0; + if (scfsi[0]) for (; sfb < 6 ; sfb++) { + sfis->l[sfb] = sfisGr0->l[sfb]; + } else for (; sfb < 6 ; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen0); + } + if (scfsi[1]) for (; sfb < 11 ; sfb++) { + sfis->l[sfb] = sfisGr0->l[sfb]; + } else for (; sfb < 11 ; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen0); + } + if (scfsi[2]) for (; sfb < 16 ; sfb++) { + sfis->l[sfb] = sfisGr0->l[sfb]; + } else for (; sfb < 16 ; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen1); + } + if (scfsi[3]) for (; sfb < 21 ; sfb++) { + sfis->l[sfb] = sfisGr0->l[sfb]; + } else for (; sfb < 21 ; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen1); + } + } + /* last sf band not transmitted */ + sfis->l[21] = 0; + sfis->l[22] = 0; + } } -/* NRTab[size + 3*is_right][block type][partition] - * block type index: 0 = (bt0,bt1,bt3), 1 = bt2 non-mixed, 2 = bt2 mixed - * partition: scale factor groups (sfb1 through sfb4) - * for block type = 2 (mixed or non-mixed) / by 3 is rolled into this table - * (for 3 short blocks per long block) - * see 2.4.3.2 in MPEG 2 (low sample rate) spec - * stuff rolled into this table: - * NRTab[x][1][y] --> (NRTab[x][1][y]) / 3 - * NRTab[x][2][>=1] --> (NRTab[x][2][>=1]) / 3 (first partition is long block) - */ +/* NRTab[size + 3*is_right][block type][partition] + block type index: 0 = (bt0,bt1,bt3), 1 = bt2 non-mixed, 2 = bt2 mixed + partition: scale factor groups (sfb1 through sfb4) + for block type = 2 (mixed or non-mixed) / by 3 is rolled into this table + (for 3 short blocks per long block) + see 2.4.3.2 in MPEG 2 (low sample rate) spec + stuff rolled into this table: + NRTab[x][1][y] --> (NRTab[x][1][y]) / 3 + NRTab[x][2][>=1] --> (NRTab[x][2][>=1]) / 3 (first partition is long block) +*/ static const char NRTab[6][3][4] = { - /* non-intensity stereo */ - { {6, 5, 5, 5}, - {3, 3, 3, 3}, /* includes / 3 */ - {6, 3, 3, 3}, /* includes / 3 except for first entry */ - }, - { {6, 5, 7, 3}, - {3, 3, 4, 2}, - {6, 3, 4, 2}, - }, - { {11, 10, 0, 0}, - {6, 6, 0, 0}, - {6, 3, 6, 0}, /* spec = [15,18,0,0], but 15 = 6L + 9S, so move 9/3=3 into col 1, 18/3=6 into col 2 and adj. slen[1,2] below */ - }, - /* intensity stereo, right chan */ - { {7, 7, 7, 0}, - {4, 4, 4, 0}, - {6, 5, 4, 0}, - }, - { {6, 6, 6, 3}, - {4, 3, 3, 2}, - {6, 4, 3, 2}, - }, - { {8, 8, 5, 0}, - {5, 4, 3, 0}, - {6, 6, 3, 0}, - } + /* non-intensity stereo */ + { {6, 5, 5, 5}, + {3, 3, 3, 3}, /* includes / 3 */ + {6, 3, 3, 3}, /* includes / 3 except for first entry */ + }, + { {6, 5, 7, 3}, + {3, 3, 4, 2}, + {6, 3, 4, 2}, + }, + { {11, 10, 0, 0}, + {6, 6, 0, 0}, + {6, 3, 6, 0}, /* spec = [15,18,0,0], but 15 = 6L + 9S, so move 9/3=3 into col 1, 18/3=6 into col 2 and adj. slen[1,2] below */ + }, + /* intensity stereo, right chan */ + { {7, 7, 7, 0}, + {4, 4, 4, 0}, + {6, 5, 4, 0}, + }, + { {6, 6, 6, 3}, + {4, 3, 3, 2}, + {6, 4, 3, 2}, + }, + { {8, 8, 5, 0}, + {5, 4, 3, 0}, + {6, 6, 3, 0}, + } }; /************************************************************************************** - * Function: UnpackSFMPEG2 - * - * Description: unpack MPEG 2 scalefactors from bitstream - * - * Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this - * granule/channel - * index of current granule and channel - * ScaleFactorInfoSub from this granule - * modeExt field from frame header, to tell whether intensity stereo is on - * ScaleFactorJS struct for storing IIP info used in Dequant() - * - * Outputs: updated BitStreamInfo struct - * scalefactors in sfis (short and/or long arrays, as appropriate) - * updated intensityScale and preFlag flags - * - * Return: none - * - * Notes: Illegal Intensity Position = (2^slen) - 1 for MPEG2 scale factors - * - * TODO: optimize the / and % stuff (only do one divide, get modulo x - * with (x / m) * m, etc.) + Function: UnpackSFMPEG2 + + Description: unpack MPEG 2 scalefactors from bitstream + + Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this + granule/channel + index of current granule and channel + ScaleFactorInfoSub from this granule + modeExt field from frame header, to tell whether intensity stereo is on + ScaleFactorJS struct for storing IIP info used in Dequant() + + Outputs: updated BitStreamInfo struct + scalefactors in sfis (short and/or long arrays, as appropriate) + updated intensityScale and preFlag flags + + Return: none + + Notes: Illegal Intensity Position = (2^slen) - 1 for MPEG2 scale factors + + TODO: optimize the / and % stuff (only do one divide, get modulo x + with (x / m) * m, etc.) **************************************************************************************/ -static void UnpackSFMPEG2(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int gr, int ch, int modeExt, ScaleFactorJS *sfjs) -{ - - int i, sfb, sfcIdx, btIdx, nrIdx;// iipTest; - int slen[4], nr[4]; - int sfCompress, preFlag, intensityScale; - (void)gr; - - sfCompress = sis->sfCompress; - preFlag = 0; - intensityScale = 0; - - /* stereo mode bits (1 = on): bit 1 = mid-side on/off, bit 0 = intensity on/off */ - if (! ((modeExt & 0x01) && (ch == 1)) ) { - /* in other words: if ((modeExt & 0x01) == 0 || ch == 0) */ - if (sfCompress < 400) { - /* max slen = floor[(399/16) / 5] = 4 */ - slen[0] = (sfCompress >> 4) / 5; - slen[1]= (sfCompress >> 4) % 5; - slen[2]= (sfCompress & 0x0f) >> 2; - slen[3]= (sfCompress & 0x03); - sfcIdx = 0; - } else if (sfCompress < 500) { - /* max slen = floor[(99/4) / 5] = 4 */ - sfCompress -= 400; - slen[0] = (sfCompress >> 2) / 5; - slen[1]= (sfCompress >> 2) % 5; - slen[2]= (sfCompress & 0x03); - slen[3]= 0; - sfcIdx = 1; - } else { - /* max slen = floor[11/3] = 3 (sfCompress = 9 bits in MPEG2) */ - sfCompress -= 500; - slen[0] = sfCompress / 3; - slen[1] = sfCompress % 3; - slen[2] = slen[3] = 0; - if (sis->mixedBlock) { - /* adjust for long/short mix logic (see comment above in NRTab[] definition) */ - slen[2] = slen[1]; - slen[1] = slen[0]; - } - preFlag = 1; - sfcIdx = 2; - } - } else { - /* intensity stereo ch = 1 (right) */ - intensityScale = sfCompress & 0x01; - sfCompress >>= 1; - if (sfCompress < 180) { - /* max slen = floor[35/6] = 5 (from mod 36) */ - slen[0] = (sfCompress / 36); - slen[1] = (sfCompress % 36) / 6; - slen[2] = (sfCompress % 36) % 6; - slen[3] = 0; - sfcIdx = 3; - } else if (sfCompress < 244) { - /* max slen = floor[63/16] = 3 */ - sfCompress -= 180; - slen[0] = (sfCompress & 0x3f) >> 4; - slen[1] = (sfCompress & 0x0f) >> 2; - slen[2] = (sfCompress & 0x03); - slen[3] = 0; - sfcIdx = 4; - } else { - /* max slen = floor[11/3] = 3 (max sfCompress >> 1 = 511/2 = 255) */ - sfCompress -= 244; - slen[0] = (sfCompress / 3); - slen[1] = (sfCompress % 3); - slen[2] = slen[3] = 0; - sfcIdx = 5; - } - } - - /* set index based on block type: (0,1,3) --> 0, (2 non-mixed) --> 1, (2 mixed) ---> 2 */ - btIdx = 0; - if (sis->blockType == 2) - btIdx = (sis->mixedBlock ? 2 : 1); - for (i = 0; i < 4; i++) - nr[i] = (int)NRTab[sfcIdx][btIdx][i]; - - /* save intensity stereo scale factor info */ - if( (modeExt & 0x01) && (ch == 1) ) { - for (i = 0; i < 4; i++) { - sfjs->slen[i] = slen[i]; - sfjs->nr[i] = nr[i]; - } - sfjs->intensityScale = intensityScale; - } - sis->preFlag = preFlag; - - /* short blocks */ - if(sis->blockType == 2) { - if(sis->mixedBlock) { - /* do long block portion */ - //iipTest = (1 << slen[0]) - 1; - for (sfb=0; sfb < 6; sfb++) { - sfis->l[sfb] = (char)GetBits(bsi, slen[0]); - } - sfb = 3; /* start sfb for short */ - nrIdx = 1; - } else { - /* all short blocks, so start nr, sfb at 0 */ - sfb = 0; - nrIdx = 0; - } - - /* remaining short blocks, sfb just keeps incrementing */ - for ( ; nrIdx <= 3; nrIdx++) { - //iipTest = (1 << slen[nrIdx]) - 1; - for (i=0; i < nr[nrIdx]; i++, sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen[nrIdx]); - sfis->s[sfb][1] = (char)GetBits(bsi, slen[nrIdx]); - sfis->s[sfb][2] = (char)GetBits(bsi, slen[nrIdx]); - } - } - /* last sf band not transmitted */ - sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; - } else { - /* long blocks */ - sfb = 0; - for (nrIdx = 0; nrIdx <= 3; nrIdx++) { - //iipTest = (1 << slen[nrIdx]) - 1; - for(i=0; i < nr[nrIdx]; i++, sfb++) { - sfis->l[sfb] = (char)GetBits(bsi, slen[nrIdx]); - } - } - /* last sf band not transmitted */ - sfis->l[21] = sfis->l[22] = 0; - - } +static void UnpackSFMPEG2(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int gr, int ch, int modeExt, ScaleFactorJS *sfjs) { + + int i, sfb, sfcIdx, btIdx, nrIdx;// iipTest; + int slen[4], nr[4]; + int sfCompress, preFlag, intensityScale; + (void)gr; + + sfCompress = sis->sfCompress; + preFlag = 0; + intensityScale = 0; + + /* stereo mode bits (1 = on): bit 1 = mid-side on/off, bit 0 = intensity on/off */ + if (!((modeExt & 0x01) && (ch == 1))) { + /* in other words: if ((modeExt & 0x01) == 0 || ch == 0) */ + if (sfCompress < 400) { + /* max slen = floor[(399/16) / 5] = 4 */ + slen[0] = (sfCompress >> 4) / 5; + slen[1] = (sfCompress >> 4) % 5; + slen[2] = (sfCompress & 0x0f) >> 2; + slen[3] = (sfCompress & 0x03); + sfcIdx = 0; + } else if (sfCompress < 500) { + /* max slen = floor[(99/4) / 5] = 4 */ + sfCompress -= 400; + slen[0] = (sfCompress >> 2) / 5; + slen[1] = (sfCompress >> 2) % 5; + slen[2] = (sfCompress & 0x03); + slen[3] = 0; + sfcIdx = 1; + } else { + /* max slen = floor[11/3] = 3 (sfCompress = 9 bits in MPEG2) */ + sfCompress -= 500; + slen[0] = sfCompress / 3; + slen[1] = sfCompress % 3; + slen[2] = slen[3] = 0; + if (sis->mixedBlock) { + /* adjust for long/short mix logic (see comment above in NRTab[] definition) */ + slen[2] = slen[1]; + slen[1] = slen[0]; + } + preFlag = 1; + sfcIdx = 2; + } + } else { + /* intensity stereo ch = 1 (right) */ + intensityScale = sfCompress & 0x01; + sfCompress >>= 1; + if (sfCompress < 180) { + /* max slen = floor[35/6] = 5 (from mod 36) */ + slen[0] = (sfCompress / 36); + slen[1] = (sfCompress % 36) / 6; + slen[2] = (sfCompress % 36) % 6; + slen[3] = 0; + sfcIdx = 3; + } else if (sfCompress < 244) { + /* max slen = floor[63/16] = 3 */ + sfCompress -= 180; + slen[0] = (sfCompress & 0x3f) >> 4; + slen[1] = (sfCompress & 0x0f) >> 2; + slen[2] = (sfCompress & 0x03); + slen[3] = 0; + sfcIdx = 4; + } else { + /* max slen = floor[11/3] = 3 (max sfCompress >> 1 = 511/2 = 255) */ + sfCompress -= 244; + slen[0] = (sfCompress / 3); + slen[1] = (sfCompress % 3); + slen[2] = slen[3] = 0; + sfcIdx = 5; + } + } + + /* set index based on block type: (0,1,3) --> 0, (2 non-mixed) --> 1, (2 mixed) ---> 2 */ + btIdx = 0; + if (sis->blockType == 2) { + btIdx = (sis->mixedBlock ? 2 : 1); + } + for (i = 0; i < 4; i++) { + nr[i] = (int)NRTab[sfcIdx][btIdx][i]; + } + + /* save intensity stereo scale factor info */ + if ((modeExt & 0x01) && (ch == 1)) { + for (i = 0; i < 4; i++) { + sfjs->slen[i] = slen[i]; + sfjs->nr[i] = nr[i]; + } + sfjs->intensityScale = intensityScale; + } + sis->preFlag = preFlag; + + /* short blocks */ + if (sis->blockType == 2) { + if (sis->mixedBlock) { + /* do long block portion */ + //iipTest = (1 << slen[0]) - 1; + for (sfb = 0; sfb < 6; sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen[0]); + } + sfb = 3; /* start sfb for short */ + nrIdx = 1; + } else { + /* all short blocks, so start nr, sfb at 0 */ + sfb = 0; + nrIdx = 0; + } + + /* remaining short blocks, sfb just keeps incrementing */ + for (; nrIdx <= 3; nrIdx++) { + //iipTest = (1 << slen[nrIdx]) - 1; + for (i = 0; i < nr[nrIdx]; i++, sfb++) { + sfis->s[sfb][0] = (char)GetBits(bsi, slen[nrIdx]); + sfis->s[sfb][1] = (char)GetBits(bsi, slen[nrIdx]); + sfis->s[sfb][2] = (char)GetBits(bsi, slen[nrIdx]); + } + } + /* last sf band not transmitted */ + sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; + } else { + /* long blocks */ + sfb = 0; + for (nrIdx = 0; nrIdx <= 3; nrIdx++) { + //iipTest = (1 << slen[nrIdx]) - 1; + for (i = 0; i < nr[nrIdx]; i++, sfb++) { + sfis->l[sfb] = (char)GetBits(bsi, slen[nrIdx]); + } + } + /* last sf band not transmitted */ + sfis->l[21] = sfis->l[22] = 0; + + } } /************************************************************************************** - * Function: UnpackScaleFactors - * - * Description: parse the fields of the MP3 scale factor data section - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader() and UnpackSideInfo() - * buffer pointing to the MP3 scale factor data - * pointer to bit offset (0-7) indicating starting bit in buf[0] - * number of bits available in data buffer - * index of current granule and channel - * - * Outputs: updated platform-specific ScaleFactorInfo struct - * updated bitOffset - * - * Return: length (in bytes) of scale factor data, -1 if null input pointers + Function: UnpackScaleFactors + + Description: parse the fields of the MP3 scale factor data section + + Inputs: MP3DecInfo structure filled by UnpackFrameHeader() and UnpackSideInfo() + buffer pointing to the MP3 scale factor data + pointer to bit offset (0-7) indicating starting bit in buf[0] + number of bits available in data buffer + index of current granule and channel + + Outputs: updated platform-specific ScaleFactorInfo struct + updated bitOffset + + Return: length (in bytes) of scale factor data, -1 if null input pointers **************************************************************************************/ -int UnpackScaleFactors(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int bitsAvail, int gr, int ch) -{ - int bitsUsed; - unsigned char *startBuf; - BitStreamInfo bitStreamInfo, *bsi; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS) - return -1; - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); - - /* init GetBits reader */ - startBuf = buf; - bsi = &bitStreamInfo; - SetBitstreamPointer(bsi, (bitsAvail + *bitOffset + 7) / 8, buf); - if (*bitOffset) - GetBits(bsi, *bitOffset); - - if (fh->ver == MPEG1) - UnpackSFMPEG1(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], si->scfsi[ch], gr, &sfi->sfis[0][ch]); - else - UnpackSFMPEG2(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], gr, ch, fh->modeExt, &sfi->sfjs); - - mp3DecInfo->part23Length[gr][ch] = si->sis[gr][ch].part23Length; - - bitsUsed = CalcBitsUsed(bsi, buf, *bitOffset); - buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - - return (buf - startBuf); +int UnpackScaleFactors(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int bitsAvail, int gr, int ch) { + int bitsUsed; + unsigned char *startBuf; + BitStreamInfo bitStreamInfo, *bsi; + FrameHeader *fh; + SideInfo *si; + ScaleFactorInfo *sfi; + + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS) { + return -1; + } + fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); + si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); + sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); + + /* init GetBits reader */ + startBuf = buf; + bsi = &bitStreamInfo; + SetBitstreamPointer(bsi, (bitsAvail + *bitOffset + 7) / 8, buf); + if (*bitOffset) { + GetBits(bsi, *bitOffset); + } + + if (fh->ver == MPEG1) { + UnpackSFMPEG1(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], si->scfsi[ch], gr, &sfi->sfis[0][ch]); + } else { + UnpackSFMPEG2(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], gr, ch, fh->modeExt, &sfi->sfjs); + } + + mp3DecInfo->part23Length[gr][ch] = si->sis[gr][ch].part23Length; + + bitsUsed = CalcBitsUsed(bsi, buf, *bitOffset); + buf += (bitsUsed + *bitOffset) >> 3; + *bitOffset = (bitsUsed + *bitOffset) & 0x07; + + return (buf - startBuf); } diff --git a/src/libhelix-mp3/statname.h b/src/libhelix-mp3/statname.h index c7f985ea..8f39a484 100644 --- a/src/libhelix-mp3/statname.h +++ b/src/libhelix-mp3/statname.h @@ -1,58 +1,58 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * statname.h - name mangling macros for static linking + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + statname.h - name mangling macros for static linking **************************************************************************************/ #ifndef _STATNAME_H #define _STATNAME_H -/* define STAT_PREFIX to a unique name for static linking - * all the C functions and global variables will be mangled by the preprocessor - * e.g. void FFT(int *fftbuf) becomes void cook_FFT(int *fftbuf) - */ +/* define STAT_PREFIX to a unique name for static linking + all the C functions and global variables will be mangled by the preprocessor + e.g. void FFT(int *fftbuf) becomes void cook_FFT(int *fftbuf) +*/ #define STAT_PREFIX xmp3 #define STATCC1(x,y,z) STATCC2(x,y,z) -#define STATCC2(x,y,z) x##y##z +#define STATCC2(x,y,z) x##y##z #ifdef STAT_PREFIX #define STATNAME(func) STATCC1(STAT_PREFIX, _, func) @@ -80,10 +80,10 @@ #define slotTab STATNAME(slotTab) #define sfBandTable STATNAME(sfBandTable) -/* in your implementation's top-level include file (e.g. real\coder.h) you should - * add new #define sym STATNAME(sym) lines for all the - * additional global functions or variables which your - * implementation uses - */ +/* in your implementation's top-level include file (e.g. real\coder.h) you should + add new #define sym STATNAME(sym) lines for all the + additional global functions or variables which your + implementation uses +*/ #endif /* _STATNAME_H */ diff --git a/src/libhelix-mp3/stproc.c b/src/libhelix-mp3/stproc.c index 7782a21b..6c84093d 100644 --- a/src/libhelix-mp3/stproc.c +++ b/src/libhelix-mp3/stproc.c @@ -1,299 +1,298 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * stproc.c - mid-side and intensity (MPEG1 and MPEG2) stereo processing + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + stproc.c - mid-side and intensity (MPEG1 and MPEG2) stereo processing **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: MidSideProc - * - * Description: sum-difference stereo reconstruction - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples (MAX of left and right) - * assume 1 guard bit in input - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input + Function: MidSideProc + + Description: sum-difference stereo reconstruction + + Inputs: vector x with dequantized samples from left and right channels + number of non-zero samples (MAX of left and right) + assume 1 guard bit in input + guard bit mask (left and right channels) + + Outputs: updated sample vector x + updated guard bit mask + + Return: none + + Notes: assume at least 1 GB in input **************************************************************************************/ -void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]) -{ - int i, xr, xl, mOutL, mOutR; - - /* L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) - * NOTE: 1/sqrt(2) done in DequantChannel() - see comments there - */ - mOutL = mOutR = 0; - for(i = 0; i < nSamps; i++) { - xl = x[0][i]; - xr = x[1][i]; - x[0][i] = xl + xr; - x[1][i] = xl - xr; - mOutL |= FASTABS(x[0][i]); - mOutR |= FASTABS(x[1][i]); - } - mOut[0] |= mOutL; - mOut[1] |= mOutR; +void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]) { + int i, xr, xl, mOutL, mOutR; + + /* L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) + NOTE: 1/sqrt(2) done in DequantChannel() - see comments there + */ + mOutL = mOutR = 0; + for (i = 0; i < nSamps; i++) { + xl = x[0][i]; + xr = x[1][i]; + x[0][i] = xl + xr; + x[1][i] = xl - xr; + mOutL |= FASTABS(x[0][i]); + mOutR |= FASTABS(x[1][i]); + } + mOut[0] |= mOutL; + mOut[1] |= mOutR; } /************************************************************************************** - * Function: IntensityProcMPEG1 - * - * Description: intensity stereo processing for MPEG1 - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples in left channel - * valid FrameHeader struct - * two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) - * flags indicating midSide on/off, mixedBlock on/off - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input - * - * TODO: combine MPEG1/2 into one function (maybe) - * make sure all the mixed-block and IIP logic is right + Function: IntensityProcMPEG1 + + Description: intensity stereo processing for MPEG1 + + Inputs: vector x with dequantized samples from left and right channels + number of non-zero samples in left channel + valid FrameHeader struct + two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) + flags indicating midSide on/off, mixedBlock on/off + guard bit mask (left and right channels) + + Outputs: updated sample vector x + updated guard bit mask + + Return: none + + Notes: assume at least 1 GB in input + + TODO: combine MPEG1/2 into one function (maybe) + make sure all the mixed-block and IIP logic is right **************************************************************************************/ -void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]) -{ - int i=0, j=0, n=0, cb=0, w=0; - int sampsLeft, isf, mOutL, mOutR, xl, xr; - int fl, fr, fls[3], frs[3]; - int cbStartL=0, cbStartS=0, cbEndL=0, cbEndS=0; - int *isfTab; - (void)mixFlag; - - /* NOTE - this works fine for mixed blocks, as long as the switch point starts in the - * short block section (i.e. on or after sample 36 = sfBand->l[8] = 3*sfBand->s[3] - * is this a safe assumption? - * TODO - intensity + mixed not quite right (diff = 11 on he_mode) - * figure out correct implementation (spec ambiguous about when to do short block reorder) - */ - if (cbi[1].cbType == 0) { - /* long block */ - cbStartL = cbi[1].cbEndL + 1; - cbEndL = cbi[0].cbEndL + 1; - cbStartS = cbEndS = 0; - i = fh->sfBand->l[cbStartL]; - } else if (cbi[1].cbType == 1 || cbi[1].cbType == 2) { - /* short or mixed block */ - cbStartS = cbi[1].cbEndSMax + 1; - cbEndS = cbi[0].cbEndSMax + 1; - cbStartL = cbEndL = 0; - i = 3 * fh->sfBand->s[cbStartS]; - } - - sampsLeft = nSamps - i; /* process to length of left */ - isfTab = (int *)ISFMpeg1[midSideFlag]; - mOutL = mOutR = 0; - - /* long blocks */ - for (cb = cbStartL; cb < cbEndL && sampsLeft > 0; cb++) { - isf = sfis->l[cb]; - if (isf == 7) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - fl = isfTab[isf]; - fr = isfTab[6] - isfTab[isf]; - } - - n = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; - for (j = 0; j < n && sampsLeft > 0; j++, i++) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - sampsLeft--; - } - } - - /* short blocks */ - for (cb = cbStartS; cb < cbEndS && sampsLeft >= 3; cb++) { - for (w = 0; w < 3; w++) { - isf = sfis->s[cb][w]; - if (isf == 7) { - fls[w] = ISFIIP[midSideFlag][0]; - frs[w] = ISFIIP[midSideFlag][1]; - } else { - fls[w] = isfTab[isf]; - frs[w] = isfTab[6] - isfTab[isf]; - } - } - - n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - for (j = 0; j < n && sampsLeft >= 3; j++, i+=3) { - xr = MULSHIFT32(frs[0], x[0][i+0]) << 2; x[1][i+0] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[0], x[0][i+0]) << 2; x[0][i+0] = xl; mOutL |= FASTABS(xl); - xr = MULSHIFT32(frs[1], x[0][i+1]) << 2; x[1][i+1] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[1], x[0][i+1]) << 2; x[0][i+1] = xl; mOutL |= FASTABS(xl); - xr = MULSHIFT32(frs[2], x[0][i+2]) << 2; x[1][i+2] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[2], x[0][i+2]) << 2; x[0][i+2] = xl; mOutL |= FASTABS(xl); - sampsLeft -= 3; - } - } - mOut[0] = mOutL; - mOut[1] = mOutR; - - return; +void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, + CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]) { + int i = 0, j = 0, n = 0, cb = 0, w = 0; + int sampsLeft, isf, mOutL, mOutR, xl, xr; + int fl, fr, fls[3], frs[3]; + int cbStartL = 0, cbStartS = 0, cbEndL = 0, cbEndS = 0; + int *isfTab; + (void)mixFlag; + + /* NOTE - this works fine for mixed blocks, as long as the switch point starts in the + short block section (i.e. on or after sample 36 = sfBand->l[8] = 3*sfBand->s[3] + is this a safe assumption? + TODO - intensity + mixed not quite right (diff = 11 on he_mode) + figure out correct implementation (spec ambiguous about when to do short block reorder) + */ + if (cbi[1].cbType == 0) { + /* long block */ + cbStartL = cbi[1].cbEndL + 1; + cbEndL = cbi[0].cbEndL + 1; + cbStartS = cbEndS = 0; + i = fh->sfBand->l[cbStartL]; + } else if (cbi[1].cbType == 1 || cbi[1].cbType == 2) { + /* short or mixed block */ + cbStartS = cbi[1].cbEndSMax + 1; + cbEndS = cbi[0].cbEndSMax + 1; + cbStartL = cbEndL = 0; + i = 3 * fh->sfBand->s[cbStartS]; + } + + sampsLeft = nSamps - i; /* process to length of left */ + isfTab = (int *)ISFMpeg1[midSideFlag]; + mOutL = mOutR = 0; + + /* long blocks */ + for (cb = cbStartL; cb < cbEndL && sampsLeft > 0; cb++) { + isf = sfis->l[cb]; + if (isf == 7) { + fl = ISFIIP[midSideFlag][0]; + fr = ISFIIP[midSideFlag][1]; + } else { + fl = isfTab[isf]; + fr = isfTab[6] - isfTab[isf]; + } + + n = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; + for (j = 0; j < n && sampsLeft > 0; j++, i++) { + xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); + sampsLeft--; + } + } + + /* short blocks */ + for (cb = cbStartS; cb < cbEndS && sampsLeft >= 3; cb++) { + for (w = 0; w < 3; w++) { + isf = sfis->s[cb][w]; + if (isf == 7) { + fls[w] = ISFIIP[midSideFlag][0]; + frs[w] = ISFIIP[midSideFlag][1]; + } else { + fls[w] = isfTab[isf]; + frs[w] = isfTab[6] - isfTab[isf]; + } + } + + n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; + for (j = 0; j < n && sampsLeft >= 3; j++, i += 3) { + xr = MULSHIFT32(frs[0], x[0][i + 0]) << 2; x[1][i + 0] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fls[0], x[0][i + 0]) << 2; x[0][i + 0] = xl; mOutL |= FASTABS(xl); + xr = MULSHIFT32(frs[1], x[0][i + 1]) << 2; x[1][i + 1] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fls[1], x[0][i + 1]) << 2; x[0][i + 1] = xl; mOutL |= FASTABS(xl); + xr = MULSHIFT32(frs[2], x[0][i + 2]) << 2; x[1][i + 2] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fls[2], x[0][i + 2]) << 2; x[0][i + 2] = xl; mOutL |= FASTABS(xl); + sampsLeft -= 3; + } + } + mOut[0] = mOutL; + mOut[1] = mOutR; + + return; } /************************************************************************************** - * Function: IntensityProcMPEG2 - * - * Description: intensity stereo processing for MPEG2 - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples in left channel - * valid FrameHeader struct - * two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) - * ScaleFactorJS struct with joint stereo info from UnpackSFMPEG2() - * flags indicating midSide on/off, mixedBlock on/off - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input - * - * TODO: combine MPEG1/2 into one function (maybe) - * make sure all the mixed-block and IIP logic is right - * probably redo IIP logic to be simpler + Function: IntensityProcMPEG2 + + Description: intensity stereo processing for MPEG2 + + Inputs: vector x with dequantized samples from left and right channels + number of non-zero samples in left channel + valid FrameHeader struct + two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) + ScaleFactorJS struct with joint stereo info from UnpackSFMPEG2() + flags indicating midSide on/off, mixedBlock on/off + guard bit mask (left and right channels) + + Outputs: updated sample vector x + updated guard bit mask + + Return: none + + Notes: assume at least 1 GB in input + + TODO: combine MPEG1/2 into one function (maybe) + make sure all the mixed-block and IIP logic is right + probably redo IIP logic to be simpler **************************************************************************************/ -void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]) -{ - int i, j, k, n, r, cb, w; - int fl, fr, mOutL, mOutR, xl, xr; - int sampsLeft; - int isf, sfIdx, tmp, il[23]; - int *isfTab; - int cbStartL, cbStartS, cbEndL, cbEndS; - - (void)mixFlag; - - isfTab = (int *)ISFMpeg2[sfjs->intensityScale][midSideFlag]; - mOutL = mOutR = 0; - - /* fill buffer with illegal intensity positions (depending on slen) */ - for (k = r = 0; r < 4; r++) { - tmp = (1 << sfjs->slen[r]) - 1; - for (j = 0; j < sfjs->nr[r]; j++, k++) - il[k] = tmp; - } - - if (cbi[1].cbType == 0) { - /* long blocks */ - il[21] = il[22] = 1; - cbStartL = cbi[1].cbEndL + 1; /* start at end of right */ - cbEndL = cbi[0].cbEndL + 1; /* process to end of left */ - i = fh->sfBand->l[cbStartL]; - sampsLeft = nSamps - i; - - for(cb = cbStartL; cb < cbEndL; cb++) { - sfIdx = sfis->l[cb]; - if (sfIdx == il[cb]) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - isf = (sfis->l[cb] + 1) >> 1; - fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; - fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; - } - n = MIN(fh->sfBand->l[cb + 1] - fh->sfBand->l[cb], sampsLeft); - - for(j = 0; j < n; j++, i++) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - } - - /* early exit once we've used all the non-zero samples */ - sampsLeft -= n; - if (sampsLeft == 0) - break; - } - } else { - /* short or mixed blocks */ - il[12] = 1; - - for(w = 0; w < 3; w++) { - cbStartS = cbi[1].cbEndS[w] + 1; /* start at end of right */ - cbEndS = cbi[0].cbEndS[w] + 1; /* process to end of left */ - i = 3 * fh->sfBand->s[cbStartS] + w; - - /* skip through sample array by 3, so early-exit logic would be more tricky */ - for(cb = cbStartS; cb < cbEndS; cb++) { - sfIdx = sfis->s[cb][w]; - if (sfIdx == il[cb]) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - isf = (sfis->s[cb][w] + 1) >> 1; - fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; - fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; - } - n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - - for(j = 0; j < n; j++, i+=3) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - } - } - } - } - mOut[0] = mOutL; - mOut[1] = mOutR; - - return; +void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, + CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]) { + int i, j, k, n, r, cb, w; + int fl, fr, mOutL, mOutR, xl, xr; + int sampsLeft; + int isf, sfIdx, tmp, il[23]; + int *isfTab; + int cbStartL, cbStartS, cbEndL, cbEndS; + + (void)mixFlag; + + isfTab = (int *)ISFMpeg2[sfjs->intensityScale][midSideFlag]; + mOutL = mOutR = 0; + + /* fill buffer with illegal intensity positions (depending on slen) */ + for (k = r = 0; r < 4; r++) { + tmp = (1 << sfjs->slen[r]) - 1; + for (j = 0; j < sfjs->nr[r]; j++, k++) { + il[k] = tmp; + } + } + + if (cbi[1].cbType == 0) { + /* long blocks */ + il[21] = il[22] = 1; + cbStartL = cbi[1].cbEndL + 1; /* start at end of right */ + cbEndL = cbi[0].cbEndL + 1; /* process to end of left */ + i = fh->sfBand->l[cbStartL]; + sampsLeft = nSamps - i; + + for (cb = cbStartL; cb < cbEndL; cb++) { + sfIdx = sfis->l[cb]; + if (sfIdx == il[cb]) { + fl = ISFIIP[midSideFlag][0]; + fr = ISFIIP[midSideFlag][1]; + } else { + isf = (sfis->l[cb] + 1) >> 1; + fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; + fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; + } + n = MIN(fh->sfBand->l[cb + 1] - fh->sfBand->l[cb], sampsLeft); + + for (j = 0; j < n; j++, i++) { + xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); + } + + /* early exit once we've used all the non-zero samples */ + sampsLeft -= n; + if (sampsLeft == 0) { + break; + } + } + } else { + /* short or mixed blocks */ + il[12] = 1; + + for (w = 0; w < 3; w++) { + cbStartS = cbi[1].cbEndS[w] + 1; /* start at end of right */ + cbEndS = cbi[0].cbEndS[w] + 1; /* process to end of left */ + i = 3 * fh->sfBand->s[cbStartS] + w; + + /* skip through sample array by 3, so early-exit logic would be more tricky */ + for (cb = cbStartS; cb < cbEndS; cb++) { + sfIdx = sfis->s[cb][w]; + if (sfIdx == il[cb]) { + fl = ISFIIP[midSideFlag][0]; + fr = ISFIIP[midSideFlag][1]; + } else { + isf = (sfis->s[cb][w] + 1) >> 1; + fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; + fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; + } + n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; + + for (j = 0; j < n; j++, i += 3) { + xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); + xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); + } + } + } + } + mOut[0] = mOutL; + mOut[1] = mOutR; + + return; } diff --git a/src/libhelix-mp3/subband.c b/src/libhelix-mp3/subband.c index e982a9fe..0bfd71cc 100644 --- a/src/libhelix-mp3/subband.c +++ b/src/libhelix-mp3/subband.c @@ -1,96 +1,96 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * subband.c - subband transform (synthesis filterbank implemented via 32-point DCT - * followed by polyphase filter) + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + subband.c - subband transform (synthesis filterbank implemented via 32-point DCT + followed by polyphase filter) **************************************************************************************/ #include "coder.h" #include "assembly.h" /************************************************************************************** - * Function: Subband - * - * Description: do subband transform on all the blocks in one granule, all channels - * - * Inputs: filled MP3DecInfo structure, after calling IMDCT for all channels - * vbuf[ch] and vindex[ch] must be preserved between calls - * - * Outputs: decoded PCM data, interleaved LRLRLR... if stereo - * - * Return: 0 on success, -1 if null input pointers + Function: Subband + + Description: do subband transform on all the blocks in one granule, all channels + + Inputs: filled MP3DecInfo structure, after calling IMDCT for all channels + vbuf[ch] and vindex[ch] must be preserved between calls + + Outputs: decoded PCM data, interleaved LRLRLR... if stereo + + Return: 0 on success, -1 if null input pointers **************************************************************************************/ -/*__attribute__ ((section (".data"))) */ int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf) -{ - int b; - //HuffmanInfo *hi; - IMDCTInfo *mi; - SubbandInfo *sbi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS || !mp3DecInfo->SubbandInfoPS) - return -1; - - //hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; - mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); - sbi = (SubbandInfo*)(mp3DecInfo->SubbandInfoPS); - - if (mp3DecInfo->nChans == 2) { - /* stereo */ - for (b = 0; b < BLOCK_SIZE; b++) { - FDCT32(mi->outBuf[0][b], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]); - FDCT32(mi->outBuf[1][b], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]); - PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); - sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; - pcmBuf += (2 * NBANDS); - } - } else { - /* mono */ - for (b = 0; b < BLOCK_SIZE; b++) { - FDCT32(mi->outBuf[0][b], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]); - PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); - sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; - pcmBuf += NBANDS; - } - } - - return 0; +/*__attribute__ ((section (".data"))) */ int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf) { + int b; + //HuffmanInfo *hi; + IMDCTInfo *mi; + SubbandInfo *sbi; + + /* validate pointers */ + if (!mp3DecInfo || !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS || !mp3DecInfo->SubbandInfoPS) { + return -1; + } + + //hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; + mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); + sbi = (SubbandInfo*)(mp3DecInfo->SubbandInfoPS); + + if (mp3DecInfo->nChans == 2) { + /* stereo */ + for (b = 0; b < BLOCK_SIZE; b++) { + FDCT32(mi->outBuf[0][b], sbi->vbuf + 0 * 32, sbi->vindex, (b & 0x01), mi->gb[0]); + FDCT32(mi->outBuf[1][b], sbi->vbuf + 1 * 32, sbi->vindex, (b & 0x01), mi->gb[1]); + PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); + sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; + pcmBuf += (2 * NBANDS); + } + } else { + /* mono */ + for (b = 0; b < BLOCK_SIZE; b++) { + FDCT32(mi->outBuf[0][b], sbi->vbuf + 0 * 32, sbi->vindex, (b & 0x01), mi->gb[0]); + PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); + sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; + pcmBuf += NBANDS; + } + } + + return 0; } diff --git a/src/libhelix-mp3/trigtabs.c b/src/libhelix-mp3/trigtabs.c index 8686e816..95e2529d 100644 --- a/src/libhelix-mp3/trigtabs.c +++ b/src/libhelix-mp3/trigtabs.c @@ -1,44 +1,44 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ +/* ***** BEGIN LICENSE BLOCK ***** + Version: RCSL 1.0/RPSL 1.0 + + Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. + + The contents of this file, and the files included with this file, are + subject to the current version of the RealNetworks Public Source License + Version 1.0 (the "RPSL") available at + http://www.helixcommunity.org/content/rpsl unless you have licensed + the file under the RealNetworks Community Source License Version 1.0 + (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, + in which case the RCSL will apply. You may also obtain the license terms + directly from RealNetworks. You may not use this file except in + compliance with the RPSL or, if you have a valid RCSL with RealNetworks + applicable to this file, the RCSL. Please see the applicable RPSL or + RCSL for the rights, obligations and limitations governing use of the + contents of the file. + + This file is part of the Helix DNA Technology. RealNetworks is the + developer of the Original Code and owns the copyrights in the portions + it created. + + This file, and the files included with this file, is distributed and made + available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + + Technology Compatibility Kit Test Suite(s) Location: + http://www.helixcommunity.org/content/tck + + Contributor(s): + + * ***** END LICENSE BLOCK ***** */ /************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * trigtabs.c - global ROM tables for pre-calculated trig coefficients + Fixed-point MP3 decoder + Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) + June 2003 + + trigtabs.c - global ROM tables for pre-calculated trig coefficients **************************************************************************************/ // constants in RAM are not significantly faster @@ -49,271 +49,271 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" -/* post-IMDCT window, win[blockType][i] - * format = Q31 - * Fused sin window with final stage of IMDCT - * includes 1/sqrt(2) scaling, since we scale by sqrt(2) in dequant in order - * for fast IMDCT36 to be usable - * - * for(i=0;i<9;i++) win[0][i] = sin(pi/36 *(i+0.5)); - * for(i=9;i<36;i++) win[0][i] = -sin(pi/36 *(i+0.5)); - * - * for(i=0;i<9;i++) win[1][i] = sin(pi/36 *(i+0.5)); - * for(i=9;i<18;i++) win[1][i] = -sin(pi/36 *(i+0.5)); - * for(i=18;i<24;i++) win[1][i] = -1; - * for(i=24;i<30;i++) win[1][i] = -sin(pi/12 *(i+0.5-18)); - * for(i=30;i<36;i++) win[1][i] = 0; - * - * for(i=0;i<6;i++) win[3][i] = 0; - * for(i=6;i<9;i++) win[3][i] = sin(pi/12 *(i+0.5-6)); - * for(i=9;i<12;i++) win[3][i] = -sin(pi/12 *(i+0.5-6)); - * for(i=12;i<18;i++) win[3][i] = -1; - * for(i=18;i<36;i++) win[3][i] = -sin(pi/36*(i+0.5)); - * - * for(i=0;i<3;i++) win[2][i] = sin(pi/12*(i+0.5)); - * for(i=3;i<12;i++) win[2][i] = -sin(pi/12*(i+0.5)); - * for(i=12;i<36;i++) win[2][i] = 0; - * - * for (i = 0; i < 4; i++) { - * if (i == 2) { - * win[i][8] *= cos(pi/12 * (0+0.5)); - * win[i][9] *= cos(pi/12 * (0+0.5)); - * win[i][7] *= cos(pi/12 * (1+0.5)); - * win[i][10] *= cos(pi/12 * (1+0.5)); - * win[i][6] *= cos(pi/12 * (2+0.5)); - * win[i][11] *= cos(pi/12 * (2+0.5)); - * win[i][0] *= cos(pi/12 * (3+0.5)); - * win[i][5] *= cos(pi/12 * (3+0.5)); - * win[i][1] *= cos(pi/12 * (4+0.5)); - * win[i][4] *= cos(pi/12 * (4+0.5)); - * win[i][2] *= cos(pi/12 * (5+0.5)); - * win[i][3] *= cos(pi/12 * (5+0.5)); - * } else { - * for (j = 0; j < 9; j++) { - * win[i][8-j] *= cos(pi/36 * (17-j+0.5)); - * win[i][9+j] *= cos(pi/36 * (17-j+0.5)); - * } - * for (j = 0; j < 9; j++) { - * win[i][18+8-j] *= cos(pi/36 * (j+0.5)); - * win[i][18+9+j] *= cos(pi/36 * (j+0.5)); - * } - * } - * } - * for (i = 0; i < 4; i++) - * for (j = 0; j < 36; j++) - * win[i][j] *= 1.0 / sqrt(2); - */ - +/* post-IMDCT window, win[blockType][i] + format = Q31 + Fused sin window with final stage of IMDCT + includes 1/sqrt(2) scaling, since we scale by sqrt(2) in dequant in order + for fast IMDCT36 to be usable + + for(i=0;i<9;i++) win[0][i] = sin(pi/36 *(i+0.5)); + for(i=9;i<36;i++) win[0][i] = -sin(pi/36 *(i+0.5)); + + for(i=0;i<9;i++) win[1][i] = sin(pi/36 *(i+0.5)); + for(i=9;i<18;i++) win[1][i] = -sin(pi/36 *(i+0.5)); + for(i=18;i<24;i++) win[1][i] = -1; + for(i=24;i<30;i++) win[1][i] = -sin(pi/12 *(i+0.5-18)); + for(i=30;i<36;i++) win[1][i] = 0; + + for(i=0;i<6;i++) win[3][i] = 0; + for(i=6;i<9;i++) win[3][i] = sin(pi/12 *(i+0.5-6)); + for(i=9;i<12;i++) win[3][i] = -sin(pi/12 *(i+0.5-6)); + for(i=12;i<18;i++) win[3][i] = -1; + for(i=18;i<36;i++) win[3][i] = -sin(pi/36*(i+0.5)); + + for(i=0;i<3;i++) win[2][i] = sin(pi/12*(i+0.5)); + for(i=3;i<12;i++) win[2][i] = -sin(pi/12*(i+0.5)); + for(i=12;i<36;i++) win[2][i] = 0; + + for (i = 0; i < 4; i++) { + if (i == 2) { + win[i][8] *= cos(pi/12 * (0+0.5)); + win[i][9] *= cos(pi/12 * (0+0.5)); + win[i][7] *= cos(pi/12 * (1+0.5)); + win[i][10] *= cos(pi/12 * (1+0.5)); + win[i][6] *= cos(pi/12 * (2+0.5)); + win[i][11] *= cos(pi/12 * (2+0.5)); + win[i][0] *= cos(pi/12 * (3+0.5)); + win[i][5] *= cos(pi/12 * (3+0.5)); + win[i][1] *= cos(pi/12 * (4+0.5)); + win[i][4] *= cos(pi/12 * (4+0.5)); + win[i][2] *= cos(pi/12 * (5+0.5)); + win[i][3] *= cos(pi/12 * (5+0.5)); + } else { + for (j = 0; j < 9; j++) { + win[i][8-j] *= cos(pi/36 * (17-j+0.5)); + win[i][9+j] *= cos(pi/36 * (17-j+0.5)); + } + for (j = 0; j < 9; j++) { + win[i][18+8-j] *= cos(pi/36 * (j+0.5)); + win[i][18+9+j] *= cos(pi/36 * (j+0.5)); + } + } + } + for (i = 0; i < 4; i++) + for (j = 0; j < 36; j++) + win[i][j] *= 1.0 / sqrt(2); +*/ + const int imdctWin[4][36] PROGMEM = { - { - 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, - 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, - 0xc95f619a, 0xc2e92723, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, - 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, - 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, - }, - { - 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, - 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, - 0xc95f619a, 0xc2e92723, 0xbd44ef14, 0xb831a052, 0xb3aa3837, 0xafb789a4, 0xac6145bb, 0xa9adecdc, - 0xa864491f, 0xad1868f0, 0xb8431f49, 0xc8f42236, 0xdda8e6b1, 0xf47755dc, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - }, - { - 0x07311c28, 0x0d413ccd, 0x07311c28, 0xf6a09e66, 0xe0000000, 0xc95f619a, 0xb8cee3d8, 0xb2bec333, - 0xb8cee3d8, 0xc95f619a, 0xe0000000, 0xf6a09e66, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - }, - { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x028e9709, 0x04855ec0, - 0x026743a1, 0xfcde2c10, 0xf515dc82, 0xec93e53b, 0xe4c880f8, 0xdd5d0b08, 0xd63510b7, 0xcf5e834a, - 0xc8e6b562, 0xc2da4105, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, - 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, - 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, - }, + { + 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, + 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, + 0xc95f619a, 0xc2e92723, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, + 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, + 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, + }, + { + 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, + 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, + 0xc95f619a, 0xc2e92723, 0xbd44ef14, 0xb831a052, 0xb3aa3837, 0xafb789a4, 0xac6145bb, 0xa9adecdc, + 0xa864491f, 0xad1868f0, 0xb8431f49, 0xc8f42236, 0xdda8e6b1, 0xf47755dc, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + }, + { + 0x07311c28, 0x0d413ccd, 0x07311c28, 0xf6a09e66, 0xe0000000, 0xc95f619a, 0xb8cee3d8, 0xb2bec333, + 0xb8cee3d8, 0xc95f619a, 0xe0000000, 0xf6a09e66, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + }, + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x028e9709, 0x04855ec0, + 0x026743a1, 0xfcde2c10, 0xf515dc82, 0xec93e53b, 0xe4c880f8, 0xdd5d0b08, 0xd63510b7, 0xcf5e834a, + 0xc8e6b562, 0xc2da4105, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, + 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, + 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, + }, }; -/* indexing = [mid-side off/on][intensity scale factor] - * format = Q30, range = [0.0, 1.414] - * - * mid-side off: - * ISFMpeg1[0][i] = tan(i*pi/12) / [1 + tan(i*pi/12)] (left scalefactor) - * = 1 / [1 + tan(i*pi/12)] (right scalefactor) - * - * mid-side on: - * ISFMpeg1[1][i] = sqrt(2) * ISFMpeg1[0][i] - * - * output L = ISFMpeg1[midSide][isf][0] * input L - * output R = ISFMpeg1[midSide][isf][1] * input L - * - * obviously left scalefactor + right scalefactor = 1 (m-s off) or sqrt(2) (m-s on) - * so just store left and calculate right as 1 - left - * (can derive as right = ISFMpeg1[x][6] - left) - * - * if mid-side enabled, multiply joint stereo scale factors by sqrt(2) - * - we scaled whole spectrum by 1/sqrt(2) in Dequant for the M+S/sqrt(2) in MidSideProc - * - but the joint stereo part of the spectrum doesn't need this, so we have to undo it - * - * if scale factor is and illegal intensity position, this becomes a passthrough - * - gain = [1, 0] if mid-side off, since L is coded directly and R = 0 in this region - * - gain = [1, 1] if mid-side on, since L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) - * - and since S = 0 in the joint stereo region (above NZB right) then L = R = M * 1.0 - */ +/* indexing = [mid-side off/on][intensity scale factor] + format = Q30, range = [0.0, 1.414] + + mid-side off: + ISFMpeg1[0][i] = tan(i*pi/12) / [1 + tan(i*pi/12)] (left scalefactor) + = 1 / [1 + tan(i*pi/12)] (right scalefactor) + + mid-side on: + ISFMpeg1[1][i] = sqrt(2) * ISFMpeg1[0][i] + + output L = ISFMpeg1[midSide][isf][0] * input L + output R = ISFMpeg1[midSide][isf][1] * input L + + obviously left scalefactor + right scalefactor = 1 (m-s off) or sqrt(2) (m-s on) + so just store left and calculate right as 1 - left + (can derive as right = ISFMpeg1[x][6] - left) + + if mid-side enabled, multiply joint stereo scale factors by sqrt(2) + - we scaled whole spectrum by 1/sqrt(2) in Dequant for the M+S/sqrt(2) in MidSideProc + - but the joint stereo part of the spectrum doesn't need this, so we have to undo it + + if scale factor is and illegal intensity position, this becomes a passthrough + - gain = [1, 0] if mid-side off, since L is coded directly and R = 0 in this region + - gain = [1, 1] if mid-side on, since L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) + - and since S = 0 in the joint stereo region (above NZB right) then L = R = M * 1.0 +*/ const int ISFMpeg1[2][7] PROGMEM = { - {0x00000000, 0x0d8658ba, 0x176cf5d0, 0x20000000, 0x28930a2f, 0x3279a745, 0x40000000}, - {0x00000000, 0x13207f5c, 0x2120fb83, 0x2d413ccc, 0x39617e16, 0x4761fa3d, 0x5a827999} + {0x00000000, 0x0d8658ba, 0x176cf5d0, 0x20000000, 0x28930a2f, 0x3279a745, 0x40000000}, + {0x00000000, 0x13207f5c, 0x2120fb83, 0x2d413ccc, 0x39617e16, 0x4761fa3d, 0x5a827999} }; -/* indexing = [intensity scale on/off][mid-side off/on][intensity scale factor] - * format = Q30, range = [0.0, 1.414] - * - * if (isf == 0) kl = 1.0 kr = 1.0 - * else if (isf & 0x01 == 0x01) kl = i0^((isf+1)/2), kr = 1.0 - * else if (isf & 0x01 == 0x00) kl = 1.0, kr = i0^(isf/2) - * - * if (intensityScale == 1) i0 = 1/sqrt(2) = 0x2d413ccc (Q30) - * else i0 = 1/sqrt(sqrt(2)) = 0x35d13f32 (Q30) - * - * see comments for ISFMpeg1 (just above) regarding scaling, sqrt(2), etc. - * - * compress the MPEG2 table using the obvious identities above... - * for isf = [0, 1, 2, ... 30], let sf = table[(isf+1) >> 1] - * - if isf odd, L = sf*L, R = tab[0]*R - * - if isf even, L = tab[0]*L, R = sf*R - */ +/* indexing = [intensity scale on/off][mid-side off/on][intensity scale factor] + format = Q30, range = [0.0, 1.414] + + if (isf == 0) kl = 1.0 kr = 1.0 + else if (isf & 0x01 == 0x01) kl = i0^((isf+1)/2), kr = 1.0 + else if (isf & 0x01 == 0x00) kl = 1.0, kr = i0^(isf/2) + + if (intensityScale == 1) i0 = 1/sqrt(2) = 0x2d413ccc (Q30) + else i0 = 1/sqrt(sqrt(2)) = 0x35d13f32 (Q30) + + see comments for ISFMpeg1 (just above) regarding scaling, sqrt(2), etc. + + compress the MPEG2 table using the obvious identities above... + for isf = [0, 1, 2, ... 30], let sf = table[(isf+1) >> 1] + - if isf odd, L = sf*L, R = tab[0]*R + - if isf even, L = tab[0]*L, R = sf*R +*/ const int ISFMpeg2[2][2][16] PROGMEM = { -{ - { - /* intensityScale off, mid-side off */ - 0x40000000, 0x35d13f32, 0x2d413ccc, 0x260dfc14, 0x1fffffff, 0x1ae89f99, 0x16a09e66, 0x1306fe0a, - 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f05, 0x07ffffff, 0x06ba27e6, 0x05a82799, 0x04c1bf82, - }, - { - /* intensityScale off, mid-side on */ - 0x5a827999, 0x4c1bf827, 0x3fffffff, 0x35d13f32, 0x2d413ccc, 0x260dfc13, 0x1fffffff, 0x1ae89f99, - 0x16a09e66, 0x1306fe09, 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f04, 0x07ffffff, 0x06ba27e6, - }, -}, -{ - { - /* intensityScale on, mid-side off */ - 0x40000000, 0x2d413ccc, 0x20000000, 0x16a09e66, 0x10000000, 0x0b504f33, 0x08000000, 0x05a82799, - 0x04000000, 0x02d413cc, 0x02000000, 0x016a09e6, 0x01000000, 0x00b504f3, 0x00800000, 0x005a8279, - }, - /* intensityScale on, mid-side on */ - { - 0x5a827999, 0x3fffffff, 0x2d413ccc, 0x1fffffff, 0x16a09e66, 0x0fffffff, 0x0b504f33, 0x07ffffff, - 0x05a82799, 0x03ffffff, 0x02d413cc, 0x01ffffff, 0x016a09e6, 0x00ffffff, 0x00b504f3, 0x007fffff, - } -} + { + { + /* intensityScale off, mid-side off */ + 0x40000000, 0x35d13f32, 0x2d413ccc, 0x260dfc14, 0x1fffffff, 0x1ae89f99, 0x16a09e66, 0x1306fe0a, + 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f05, 0x07ffffff, 0x06ba27e6, 0x05a82799, 0x04c1bf82, + }, + { + /* intensityScale off, mid-side on */ + 0x5a827999, 0x4c1bf827, 0x3fffffff, 0x35d13f32, 0x2d413ccc, 0x260dfc13, 0x1fffffff, 0x1ae89f99, + 0x16a09e66, 0x1306fe09, 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f04, 0x07ffffff, 0x06ba27e6, + }, + }, + { + { + /* intensityScale on, mid-side off */ + 0x40000000, 0x2d413ccc, 0x20000000, 0x16a09e66, 0x10000000, 0x0b504f33, 0x08000000, 0x05a82799, + 0x04000000, 0x02d413cc, 0x02000000, 0x016a09e6, 0x01000000, 0x00b504f3, 0x00800000, 0x005a8279, + }, + /* intensityScale on, mid-side on */ + { + 0x5a827999, 0x3fffffff, 0x2d413ccc, 0x1fffffff, 0x16a09e66, 0x0fffffff, 0x0b504f33, 0x07ffffff, + 0x05a82799, 0x03ffffff, 0x02d413cc, 0x01ffffff, 0x016a09e6, 0x00ffffff, 0x00b504f3, 0x007fffff, + } + } }; -/* indexing = [intensity scale on/off][left/right] - * format = Q30, range = [0.0, 1.414] - * - * illegal intensity position scalefactors (see comments on ISFMpeg1) - */ +/* indexing = [intensity scale on/off][left/right] + format = Q30, range = [0.0, 1.414] + + illegal intensity position scalefactors (see comments on ISFMpeg1) +*/ const int ISFIIP[2][2] PROGMEM = { - {0x40000000, 0x00000000}, /* mid-side off */ - {0x40000000, 0x40000000}, /* mid-side on */ + {0x40000000, 0x00000000}, /* mid-side off */ + {0x40000000, 0x40000000}, /* mid-side on */ }; const unsigned char uniqueIDTab[8] = {0x5f, 0x4b, 0x43, 0x5f, 0x5f, 0x4a, 0x52, 0x5f}; -/* anti-alias coefficients - see spec Annex B, table 3-B.9 - * csa[0][i] = CSi, csa[1][i] = CAi - * format = Q31 - */ +/* anti-alias coefficients - see spec Annex B, table 3-B.9 + csa[0][i] = CSi, csa[1][i] = CAi + format = Q31 +*/ const int csa[8][2] PROGMEM = { - {0x6dc253f0, 0xbe2500aa}, - {0x70dcebe4, 0xc39e4949}, - {0x798d6e73, 0xd7e33f4a}, - {0x7ddd40a7, 0xe8b71176}, - {0x7f6d20b7, 0xf3e4fe2f}, - {0x7fe47e40, 0xfac1a3c7}, - {0x7ffcb263, 0xfe2ebdc6}, - {0x7fffc694, 0xff86c25d}, + {0x6dc253f0, 0xbe2500aa}, + {0x70dcebe4, 0xc39e4949}, + {0x798d6e73, 0xd7e33f4a}, + {0x7ddd40a7, 0xe8b71176}, + {0x7f6d20b7, 0xf3e4fe2f}, + {0x7fe47e40, 0xfac1a3c7}, + {0x7ffcb263, 0xfe2ebdc6}, + {0x7fffc694, 0xff86c25d}, }; -/* format = Q30, range = [0.0981, 1.9976] - * - * n = 16; - * k = 0; - * for(i=0; i<5; i++, n=n/2) { - * for(p=0; pinit() - * DESCRIPTION: initialize bit pointer struct - */ -void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) -{ - stack(__FUNCTION__, __FILE__, __LINE__); - bitptr->byte = byte; - bitptr->cache = 0; - bitptr->left = CHAR_BIT; + NAME: bit->init() + DESCRIPTION: initialize bit pointer struct +*/ +void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + bitptr->byte = byte; + bitptr->cache = 0; + bitptr->left = CHAR_BIT; } /* - * NAME: bit->length() - * DESCRIPTION: return number of bits between start and end points - */ + NAME: bit->length() + DESCRIPTION: return number of bits between start and end points +*/ unsigned int mad_bit_length(struct mad_bitptr const *begin, - struct mad_bitptr const *end) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - return begin->left + - CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); + struct mad_bitptr const *end) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + return begin->left + + CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); } /* - * NAME: bit->nextbyte() - * DESCRIPTION: return pointer to next unprocessed byte - */ -unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; + NAME: bit->nextbyte() + DESCRIPTION: return pointer to next unprocessed byte +*/ +unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; } /* - * NAME: bit->skip() - * DESCRIPTION: advance bit pointer - */ -void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - bitptr->byte += len / CHAR_BIT; - bitptr->left -= len % CHAR_BIT; - - if (bitptr->left > CHAR_BIT) { - bitptr->byte++; - bitptr->left += CHAR_BIT; - } - - if (bitptr->left < CHAR_BIT) - bitptr->cache = *bitptr->byte; + NAME: bit->skip() + DESCRIPTION: advance bit pointer +*/ +void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + bitptr->byte += len / CHAR_BIT; + bitptr->left -= len % CHAR_BIT; + + if (bitptr->left > CHAR_BIT) { + bitptr->byte++; + bitptr->left += CHAR_BIT; + } + + if (bitptr->left < CHAR_BIT) { + bitptr->cache = *bitptr->byte; + } } /* - * NAME: bit->read() - * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value - */ -unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) -{ - unsigned long value; + NAME: bit->read() + DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value +*/ +unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) { + unsigned long value; - if (bitptr->left == CHAR_BIT) - bitptr->cache = *bitptr->byte; + if (bitptr->left == CHAR_BIT) { + bitptr->cache = *bitptr->byte; + } - if (len < bitptr->left) { - value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> - (bitptr->left - len); - bitptr->left -= len; + if (len < bitptr->left) { + value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> + (bitptr->left - len); + bitptr->left -= len; - return value; - } + return value; + } - /* remaining bits in current byte */ + /* remaining bits in current byte */ - value = bitptr->cache & ((1 << bitptr->left) - 1); - len -= bitptr->left; + value = bitptr->cache & ((1 << bitptr->left) - 1); + len -= bitptr->left; - bitptr->byte++; - bitptr->left = CHAR_BIT; + bitptr->byte++; + bitptr->left = CHAR_BIT; - /* more bytes */ + /* more bytes */ - while (len >= CHAR_BIT) { - value = (value << CHAR_BIT) | *bitptr->byte++; - len -= CHAR_BIT; - } + while (len >= CHAR_BIT) { + value = (value << CHAR_BIT) | *bitptr->byte++; + len -= CHAR_BIT; + } - if (len > 0) { - bitptr->cache = *bitptr->byte; + if (len > 0) { + bitptr->cache = *bitptr->byte; - value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); - bitptr->left -= len; - } + value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); + bitptr->left -= len; + } - return value; + return value; } # if 0 /* - * NAME: bit->write() - * DESCRIPTION: write an arbitrary number of bits - */ + NAME: bit->write() + DESCRIPTION: write an arbitrary number of bits +*/ void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len, - unsigned long value) -{ - unsigned char *ptr; -stack(__FUNCTION__, __FILE__, __LINE__); + unsigned long value) { + unsigned char *ptr; + stackenter(__FUNCTION__, __FILE__, __LINE__); - ptr = (unsigned char *) bitptr->byte; + ptr = (unsigned char *) bitptr->byte; - /* ... */ + /* ... */ } # endif /* - * NAME: bit->crc() - * DESCRIPTION: compute CRC-check word - */ + NAME: bit->crc() + DESCRIPTION: compute CRC-check word +*/ unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len, - unsigned short init) -{ - unsigned int crc; -stack(__FUNCTION__, __FILE__, __LINE__); + unsigned short init) { + unsigned int crc; + stackenter(__FUNCTION__, __FILE__, __LINE__); - for (crc = init; len >= 32; len -= 32) { - unsigned long data; + for (crc = init; len >= 32; len -= 32) { + unsigned long data; - data = mad_bit_read(&bitptr, 32); + data = mad_bit_read(&bitptr, 32); - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff]; - } + crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff]; + } - switch (len / 8) { - case 3: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - /* Falls Through. */ - case 2: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - /* Falls Through. */ - case 1: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; + switch (len / 8) { + case 3: crc = (crc << 8) ^ + crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; + /* Falls Through. */ + case 2: crc = (crc << 8) ^ + crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; + /* Falls Through. */ + case 1: crc = (crc << 8) ^ + crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - len %= 8; - /* Falls Through. */ + len %= 8; + /* Falls Through. */ - case 0: break; - } + case 0: break; + } - while (len--) { - unsigned int msb; + while (len--) { + unsigned int msb; - msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15); + msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15); - crc <<= 1; - if (msb & 1) - crc ^= CRC_POLY; - } + crc <<= 1; + if (msb & 1) { + crc ^= CRC_POLY; + } + } - return crc & 0xffff; + return crc & 0xffff; } diff --git a/src/libmad/bit.h b/src/libmad/bit.h index 5a51570b..17ec824e 100644 --- a/src/libmad/bit.h +++ b/src/libmad/bit.h @@ -1,31 +1,31 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_BIT_H # define LIBMAD_BIT_H struct mad_bitptr { - unsigned char const *byte; - unsigned short cache; - unsigned short left; + unsigned char const *byte; + unsigned short cache; + unsigned short left; }; void mad_bit_init(struct mad_bitptr *, unsigned char const *); @@ -33,7 +33,7 @@ void mad_bit_init(struct mad_bitptr *, unsigned char const *); # define mad_bit_finish(bitptr) /* nothing */ unsigned int mad_bit_length(struct mad_bitptr const *, - struct mad_bitptr const *); + struct mad_bitptr const *); # define mad_bit_bitsleft(bitptr) ((bitptr)->left) unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); diff --git a/src/libmad/config.h b/src/libmad/config.h index 0b50c3a9..219c12bd 100644 --- a/src/libmad/config.h +++ b/src/libmad/config.h @@ -5,7 +5,7 @@ /* #undef DEBUG */ // Uncomment to show heap and stack space on entry -#define stack(a,b,c) +#define stackenter(a,b,c) // Helper function to see if we can allocate one chunk on the stack # ifdef __cplusplus @@ -96,8 +96,8 @@ extern int stackfree(); /* Define to enable a fast subband synthesis approximation optimization. */ #define OPT_SSO 1 -/* Define to influence a strict interpretation of the ISO/IEC standards, even - if this is in opposition with best accepted practices. */ +/* Define to influence a strict interpretation of the ISO/IEC standards, even + if this is in opposition with best accepted practices. */ #undef OPT_STRICT /* Name of package */ @@ -133,15 +133,15 @@ extern int stackfree(); /* Version number of package */ #define VERSION "0.15.1b-esp8266" -/* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). */ +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif diff --git a/src/libmad/decoder.c b/src/libmad/decoder.c index 22c62b8f..0d8134c7 100644 --- a/src/libmad/decoder.c +++ b/src/libmad/decoder.c @@ -1,22 +1,22 @@ /* - libmad - MPEG audio decoder library - Copyright (C) 2000-2004 Underbit Technologies, Inc. + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: decoder.c,v 1.22 2004/01/23 09:41:32 rob Exp $ + $Id: decoder.c,v 1.22 2004/01/23 09:41:32 rob Exp $ */ #pragma GCC optimize ("O3") @@ -53,533 +53,538 @@ # include "decoder.h" /* - NAME: decoder->init() - DESCRIPTION: initialize a decoder object with callback routines + NAME: decoder->init() + DESCRIPTION: initialize a decoder object with callback routines */ void mad_decoder_init(struct mad_decoder *decoder, void *data, - enum mad_flow (*input_func)(void *, - struct mad_stream *), - enum mad_flow (*header_func)(void *, - struct mad_header const *), - enum mad_flow (*filter_func)(void *, - struct mad_stream const *, - struct mad_frame *), - enum mad_flow (*output_func)(void *, - struct mad_header const *, - struct mad_pcm *), - enum mad_flow (*error_func)(void *, - struct mad_stream *, - struct mad_frame *), - enum mad_flow (*message_func)(void *, - void *, unsigned int *)) -{ - decoder->mode = -1; - - decoder->options = 0; - - decoder->async.pid = 0; - decoder->async.in = -1; - decoder->async.out = -1; - - decoder->sync = 0; - - decoder->cb_data = data; - - decoder->input_func = input_func; - decoder->header_func = header_func; - decoder->filter_func = filter_func; - decoder->output_func = output_func; - decoder->error_func = error_func; - decoder->message_func = message_func; + enum mad_flow(*input_func)(void *, + struct mad_stream *), + enum mad_flow(*header_func)(void *, + struct mad_header const *), + enum mad_flow(*filter_func)(void *, + struct mad_stream const *, + struct mad_frame *), + enum mad_flow(*output_func)(void *, + struct mad_header const *, + struct mad_pcm *), + enum mad_flow(*error_func)(void *, + struct mad_stream *, + struct mad_frame *), + enum mad_flow(*message_func)(void *, + void *, unsigned int *)) { + decoder->mode = -1; + + decoder->options = 0; + + decoder->async.pid = 0; + decoder->async.in = -1; + decoder->async.out = -1; + + decoder->sync = 0; + + decoder->cb_data = data; + + decoder->input_func = input_func; + decoder->header_func = header_func; + decoder->filter_func = filter_func; + decoder->output_func = output_func; + decoder->error_func = error_func; + decoder->message_func = message_func; } -int mad_decoder_finish(struct mad_decoder *decoder) -{ +int mad_decoder_finish(struct mad_decoder *decoder) { (void)decoder; # if defined(USE_ASYNC) - if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) { - pid_t pid; - int status; + if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) { + pid_t pid; + int status; - close(decoder->async.in); + close(decoder->async.in); - do - pid = waitpid(decoder->async.pid, &status, 0); - while (pid == -1 && errno == EINTR); + do { + pid = waitpid(decoder->async.pid, &status, 0); + } while (pid == -1 && errno == EINTR); - decoder->mode = -1; + decoder->mode = -1; - close(decoder->async.out); + close(decoder->async.out); - decoder->async.pid = 0; - decoder->async.in = -1; - decoder->async.out = -1; + decoder->async.pid = 0; + decoder->async.in = -1; + decoder->async.out = -1; - if (pid == -1) - return -1; + if (pid == -1) { + return -1; + } - return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0; - } + return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0; + } # endif - return 0; + return 0; } # if defined(USE_ASYNC) static -enum mad_flow send_io(int fd, void const *data, size_t len) -{ - char const *ptr = data; - ssize_t count; +enum mad_flow send_io(int fd, void const *data, size_t len) { + char const *ptr = data; + ssize_t count; - while (len) { - do - count = write(fd, ptr, len); - while (count == -1 && errno == EINTR); + while (len) { + do { + count = write(fd, ptr, len); + } while (count == -1 && errno == EINTR); - if (count == -1) - return MAD_FLOW_BREAK; + if (count == -1) { + return MAD_FLOW_BREAK; + } - len -= count; - ptr += count; - } + len -= count; + ptr += count; + } - return MAD_FLOW_CONTINUE; + return MAD_FLOW_CONTINUE; } static -enum mad_flow receive_io(int fd, void *buffer, size_t len) -{ - char *ptr = buffer; - ssize_t count; - - while (len) { - do - count = read(fd, ptr, len); - while (count == -1 && errno == EINTR); - - if (count == -1) - return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK; - else if (count == 0) - return MAD_FLOW_STOP; - - len -= count; - ptr += count; - } - - return MAD_FLOW_CONTINUE; +enum mad_flow receive_io(int fd, void *buffer, size_t len) { + char *ptr = buffer; + ssize_t count; + + while (len) { + do { + count = read(fd, ptr, len); + } while (count == -1 && errno == EINTR); + + if (count == -1) { + return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK; + } else if (count == 0) { + return MAD_FLOW_STOP; + } + + len -= count; + ptr += count; + } + + return MAD_FLOW_CONTINUE; } static -enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len) -{ - int flags, blocking; - enum mad_flow result; +enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len) { + int flags, blocking; + enum mad_flow result; - flags = fcntl(fd, F_GETFL); - if (flags == -1) - return MAD_FLOW_BREAK; + flags = fcntl(fd, F_GETFL); + if (flags == -1) { + return MAD_FLOW_BREAK; + } - blocking = flags & ~O_NONBLOCK; + blocking = flags & ~O_NONBLOCK; - if (blocking != flags && - fcntl(fd, F_SETFL, blocking) == -1) - return MAD_FLOW_BREAK; + if (blocking != flags && + fcntl(fd, F_SETFL, blocking) == -1) { + return MAD_FLOW_BREAK; + } - result = receive_io(fd, buffer, len); + result = receive_io(fd, buffer, len); - if (flags != blocking && - fcntl(fd, F_SETFL, flags) == -1) - return MAD_FLOW_BREAK; + if (flags != blocking && + fcntl(fd, F_SETFL, flags) == -1) { + return MAD_FLOW_BREAK; + } - return result; + return result; } static -enum mad_flow send(int fd, void const *message, unsigned int size) -{ - enum mad_flow result; +enum mad_flow send(int fd, void const *message, unsigned int size) { + enum mad_flow result; - /* send size */ + /* send size */ - result = send_io(fd, &size, sizeof(size)); + result = send_io(fd, &size, sizeof(size)); - /* send message */ + /* send message */ - if (result == MAD_FLOW_CONTINUE) - result = send_io(fd, message, size); + if (result == MAD_FLOW_CONTINUE) { + result = send_io(fd, message, size); + } - return result; + return result; } static -enum mad_flow receive(int fd, void **message, unsigned int *size) -{ - enum mad_flow result; - unsigned int actual; +enum mad_flow receive(int fd, void **message, unsigned int *size) { + enum mad_flow result; + unsigned int actual; - if (*message == 0) - *size = 0; + if (*message == 0) { + *size = 0; + } - /* receive size */ + /* receive size */ - result = receive_io(fd, &actual, sizeof(actual)); + result = receive_io(fd, &actual, sizeof(actual)); - /* receive message */ + /* receive message */ - if (result == MAD_FLOW_CONTINUE) { - if (actual > *size) - actual -= *size; - else { - *size = actual; - actual = 0; - } + if (result == MAD_FLOW_CONTINUE) { + if (actual > *size) { + actual -= *size; + } else { + *size = actual; + actual = 0; + } - if (*size > 0) { - if (*message == 0) { - *message = malloc(*size); - if (*message == 0) - return MAD_FLOW_BREAK; - } + if (*size > 0) { + if (*message == 0) { + *message = malloc(*size); + if (*message == 0) { + return MAD_FLOW_BREAK; + } + } - result = receive_io_blocking(fd, *message, *size); - } + result = receive_io_blocking(fd, *message, *size); + } - /* throw away remainder of message */ + /* throw away remainder of message */ - while (actual && result == MAD_FLOW_CONTINUE) { - char sink[256]; - unsigned int len; + while (actual && result == MAD_FLOW_CONTINUE) { + char sink[256]; + unsigned int len; - len = actual > sizeof(sink) ? sizeof(sink) : actual; + len = actual > sizeof(sink) ? sizeof(sink) : actual; - result = receive_io_blocking(fd, sink, len); + result = receive_io_blocking(fd, sink, len); - actual -= len; + actual -= len; + } } - } - return result; + return result; } static -enum mad_flow check_message(struct mad_decoder *decoder) -{ - enum mad_flow result; - void *message = 0; - unsigned int size; - - result = receive(decoder->async.in, &message, &size); - - if (result == MAD_FLOW_CONTINUE) { - if (decoder->message_func == 0) - size = 0; - else { - result = decoder->message_func(decoder->cb_data, message, &size); - - if (result == MAD_FLOW_IGNORE || - result == MAD_FLOW_BREAK) - size = 0; - } +enum mad_flow check_message(struct mad_decoder *decoder) { + enum mad_flow result; + void *message = 0; + unsigned int size; + + result = receive(decoder->async.in, &message, &size); + + if (result == MAD_FLOW_CONTINUE) { + if (decoder->message_func == 0) { + size = 0; + } else { + result = decoder->message_func(decoder->cb_data, message, &size); + + if (result == MAD_FLOW_IGNORE || + result == MAD_FLOW_BREAK) { + size = 0; + } + } - if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE) - result = MAD_FLOW_BREAK; - } + if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE) { + result = MAD_FLOW_BREAK; + } + } - if (message) - free(message); + if (message) { + free(message); + } - return result; + return result; } # endif static enum mad_flow error_default(void *data, struct mad_stream *stream, - struct mad_frame *frame) -{ - int *bad_last_frame = data; + struct mad_frame *frame) { + int *bad_last_frame = data; - switch (stream->error) { + switch (stream->error) { case MAD_ERROR_BADCRC: - if (*bad_last_frame) - mad_frame_mute(frame); - else - *bad_last_frame = 1; + if (*bad_last_frame) { + mad_frame_mute(frame); + } else { + *bad_last_frame = 1; + } - return MAD_FLOW_IGNORE; + return MAD_FLOW_IGNORE; default: - return MAD_FLOW_CONTINUE; - } + return MAD_FLOW_CONTINUE; + } } static -int run_sync(struct mad_decoder *decoder) -{ - enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); - void *error_data; - int bad_last_frame = 0; - struct mad_stream *stream; - struct mad_frame *frame; - struct mad_synth *synth; - int result = 0; - stack(__FUNCTION__, __FILE__, __LINE__); - - if (decoder->input_func == 0) - return 0; +int run_sync(struct mad_decoder *decoder) { + enum mad_flow(*error_func)(void *, struct mad_stream *, struct mad_frame *); + void *error_data; + int bad_last_frame = 0; + struct mad_stream *stream; + struct mad_frame *frame; + struct mad_synth *synth; + int result = 0; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + if (decoder->input_func == 0) { + return 0; + } - if (decoder->error_func) { - error_func = decoder->error_func; - error_data = decoder->cb_data; - } - else { - error_func = error_default; - error_data = &bad_last_frame; - } - - stream = &decoder->sync->stream; - frame = &decoder->sync->frame; - synth = &decoder->sync->synth; - - mad_stream_init(stream); - mad_frame_init(frame); - mad_synth_init(synth); - - mad_stream_options(stream, decoder->options); - - do { - switch (decoder->input_func(decoder->cb_data, stream)) { - case MAD_FLOW_STOP: - goto done; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_IGNORE: - continue; - case MAD_FLOW_CONTINUE: - break; + if (decoder->error_func) { + error_func = decoder->error_func; + error_data = decoder->cb_data; + } else { + error_func = error_default; + error_data = &bad_last_frame; } - while (1) { -# if defined(USE_ASYNC) - if (decoder->mode == MAD_DECODER_MODE_ASYNC) { - switch (check_message(decoder)) { - case MAD_FLOW_IGNORE: - case MAD_FLOW_CONTINUE: - break; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_STOP: - goto done; - } - } -# endif + stream = &decoder->sync->stream; + frame = &decoder->sync->frame; + synth = &decoder->sync->synth; - if (decoder->header_func) { - if (mad_header_decode(&frame->header, stream) == -1) { - if (!MAD_RECOVERABLE(stream->error)) - break; + mad_stream_init(stream); + mad_frame_init(frame); + mad_synth_init(synth); - switch (error_func(error_data, stream, frame)) { - case MAD_FLOW_STOP: - goto done; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_IGNORE: - case MAD_FLOW_CONTINUE: - default: - continue; - } - } + mad_stream_options(stream, decoder->options); - switch (decoder->header_func(decoder->cb_data, &frame->header)) { - case MAD_FLOW_STOP: + do { + switch (decoder->input_func(decoder->cb_data, stream)) { + case MAD_FLOW_STOP: goto done; - case MAD_FLOW_BREAK: + case MAD_FLOW_BREAK: goto fail; - case MAD_FLOW_IGNORE: + case MAD_FLOW_IGNORE: continue; - case MAD_FLOW_CONTINUE: + case MAD_FLOW_CONTINUE: break; } - } - if (mad_frame_decode(frame, stream) == -1) { - if (!MAD_RECOVERABLE(stream->error)) - break; - switch (error_func(error_data, stream, frame)) { - case MAD_FLOW_STOP: - goto done; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_IGNORE: - break; - case MAD_FLOW_CONTINUE: - default: - continue; - } - } - else - bad_last_frame = 0; + while (1) { +# if defined(USE_ASYNC) + if (decoder->mode == MAD_DECODER_MODE_ASYNC) { + switch (check_message(decoder)) { + case MAD_FLOW_IGNORE: + case MAD_FLOW_CONTINUE: + break; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_STOP: + goto done; + } + } +# endif - if (decoder->filter_func) { - switch (decoder->filter_func(decoder->cb_data, stream, frame)) { - case MAD_FLOW_STOP: - goto done; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_IGNORE: - continue; - case MAD_FLOW_CONTINUE: - break; + if (decoder->header_func) { + if (mad_header_decode(&frame->header, stream) == -1) { + if (!MAD_RECOVERABLE(stream->error)) { + break; + } + + switch (error_func(error_data, stream, frame)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + case MAD_FLOW_CONTINUE: + default: + continue; + } + } + + switch (decoder->header_func(decoder->cb_data, &frame->header)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + continue; + case MAD_FLOW_CONTINUE: + break; + } + } + if (mad_frame_decode(frame, stream) == -1) { + if (!MAD_RECOVERABLE(stream->error)) { + break; + } + + switch (error_func(error_data, stream, frame)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + break; + case MAD_FLOW_CONTINUE: + default: + continue; + } + } else { + bad_last_frame = 0; + } + + if (decoder->filter_func) { + switch (decoder->filter_func(decoder->cb_data, stream, frame)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + continue; + case MAD_FLOW_CONTINUE: + break; + } + } + + // mad_synth_frame(synth, frame, decoder->output_func); + if (decoder->output_func) { + // switch (decoder->output_func(decoder->cb_data, &frame->header, &synth->pcm)) { + switch (mad_synth_frame(synth, frame, decoder->output_func, decoder->cb_data)) { //decoder->output_func(decoder->cb_data, &frame->header, &synth->pcm)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + case MAD_FLOW_CONTINUE: + break; + } + } } - } - - // mad_synth_frame(synth, frame, decoder->output_func); - if (decoder->output_func) { - // switch (decoder->output_func(decoder->cb_data, &frame->header, &synth->pcm)) { - switch (mad_synth_frame(synth, frame, decoder->output_func, decoder->cb_data)) { //decoder->output_func(decoder->cb_data, &frame->header, &synth->pcm)) { - case MAD_FLOW_STOP: - goto done; - case MAD_FLOW_BREAK: - goto fail; - case MAD_FLOW_IGNORE: - case MAD_FLOW_CONTINUE: - break; - } - } - } - } - while (stream->error == MAD_ERROR_BUFLEN); + } while (stream->error == MAD_ERROR_BUFLEN); fail: - result = -1; + result = -1; done: - mad_synth_finish(synth); - mad_frame_finish(frame); - mad_stream_finish(stream); + mad_synth_finish(synth); + mad_frame_finish(frame); + mad_stream_finish(stream); - return result; + return result; } # if defined(USE_ASYNC) static -int run_async(struct mad_decoder *decoder) -{ - pid_t pid; - int ptoc[2], ctop[2], flags; +int run_async(struct mad_decoder *decoder) { + pid_t pid; + int ptoc[2], ctop[2], flags; - if (pipe(ptoc) == -1) - return -1; + if (pipe(ptoc) == -1) { + return -1; + } - if (pipe(ctop) == -1) { - close(ptoc[0]); - close(ptoc[1]); - return -1; - } + if (pipe(ctop) == -1) { + close(ptoc[0]); + close(ptoc[1]); + return -1; + } - flags = fcntl(ptoc[0], F_GETFL); - if (flags == -1 || - fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) { - close(ctop[0]); - close(ctop[1]); - close(ptoc[0]); - close(ptoc[1]); - return -1; - } + flags = fcntl(ptoc[0], F_GETFL); + if (flags == -1 || + fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) { + close(ctop[0]); + close(ctop[1]); + close(ptoc[0]); + close(ptoc[1]); + return -1; + } - pid = fork(); - if (pid == -1) { - close(ctop[0]); - close(ctop[1]); - close(ptoc[0]); - close(ptoc[1]); - return -1; - } + pid = fork(); + if (pid == -1) { + close(ctop[0]); + close(ctop[1]); + close(ptoc[0]); + close(ptoc[1]); + return -1; + } - decoder->async.pid = pid; + decoder->async.pid = pid; - if (pid) { - /* parent */ + if (pid) { + /* parent */ - close(ptoc[0]); - close(ctop[1]); + close(ptoc[0]); + close(ctop[1]); - decoder->async.in = ctop[0]; - decoder->async.out = ptoc[1]; + decoder->async.in = ctop[0]; + decoder->async.out = ptoc[1]; - return 0; - } + return 0; + } - /* child */ + /* child */ - close(ptoc[1]); - close(ctop[0]); + close(ptoc[1]); + close(ctop[0]); - decoder->async.in = ptoc[0]; - decoder->async.out = ctop[1]; + decoder->async.in = ptoc[0]; + decoder->async.out = ctop[1]; - _exit(run_sync(decoder)); + _exit(run_sync(decoder)); - /* not reached */ - return -1; + /* not reached */ + return -1; } # endif /* - NAME: decoder->run() - DESCRIPTION: run the decoder thread either synchronously or asynchronously + NAME: decoder->run() + DESCRIPTION: run the decoder thread either synchronously or asynchronously */ -int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) -{ - int result; - int (*run)(struct mad_decoder *) = 0; +int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) { + int result; + int (*run)(struct mad_decoder *) = 0; - switch (decoder->mode = mode) { + switch (decoder->mode = mode) { case MAD_DECODER_MODE_SYNC: - run = run_sync; - break; + run = run_sync; + break; case MAD_DECODER_MODE_ASYNC: # if defined(USE_ASYNC) - run = run_async; + run = run_async; # endif - break; - } + break; + } - if (run == 0) - return -1; + if (run == 0) { + return -1; + } - decoder->sync = malloc(sizeof(*decoder->sync)); - if (decoder->sync == 0) - return -1; + decoder->sync = malloc(sizeof(*decoder->sync)); + if (decoder->sync == 0) { + return -1; + } - result = run(decoder); + result = run(decoder); - free(decoder->sync); - decoder->sync = 0; + free(decoder->sync); + decoder->sync = 0; - return result; + return result; } /* - NAME: decoder->message() - DESCRIPTION: send a message to and receive a reply from the decoder process + NAME: decoder->message() + DESCRIPTION: send a message to and receive a reply from the decoder process */ int mad_decoder_message(struct mad_decoder *decoder, - void *message, unsigned int *len) -{ + void *message, unsigned int *len) { # if defined(USE_ASYNC) - if (decoder->mode != MAD_DECODER_MODE_ASYNC || - send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE || - receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE) - return -1; + if (decoder->mode != MAD_DECODER_MODE_ASYNC || + send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE || + receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE) { + return -1; + } - return 0; + return 0; # else - (void) decoder; - (void) message; - (void) len; - return -1; + (void) decoder; + (void) message; + (void) len; + return -1; # endif } diff --git a/src/libmad/decoder.h b/src/libmad/decoder.h index f0ad758d..b5056db2 100644 --- a/src/libmad/decoder.h +++ b/src/libmad/decoder.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_DECODER_H # define LIBMAD_DECODER_H @@ -27,59 +27,59 @@ # include "synth.h" enum mad_decoder_mode { - MAD_DECODER_MODE_SYNC = 0, - MAD_DECODER_MODE_ASYNC + MAD_DECODER_MODE_SYNC = 0, + MAD_DECODER_MODE_ASYNC }; enum mad_flow { - MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ - MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ - MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ - MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ + MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ + MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ + MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ + MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ }; struct mad_decoder { - enum mad_decoder_mode mode; - - int options; - - struct { - long pid; - int in; - int out; - } async; - - struct { - struct mad_stream stream; - struct mad_frame frame; - struct mad_synth synth; - } *sync; - - void *cb_data; - - enum mad_flow (*input_func)(void *, struct mad_stream *); - enum mad_flow (*header_func)(void *, struct mad_header const *); - enum mad_flow (*filter_func)(void *, - struct mad_stream const *, struct mad_frame *); - enum mad_flow (*output_func)(void *, - struct mad_header const *, struct mad_pcm *); - enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); - enum mad_flow (*message_func)(void *, void *, unsigned int *); + enum mad_decoder_mode mode; + + int options; + + struct { + long pid; + int in; + int out; + } async; + + struct { + struct mad_stream stream; + struct mad_frame frame; + struct mad_synth synth; + } *sync; + + void *cb_data; + + enum mad_flow(*input_func)(void *, struct mad_stream *); + enum mad_flow(*header_func)(void *, struct mad_header const *); + enum mad_flow(*filter_func)(void *, + struct mad_stream const *, struct mad_frame *); + enum mad_flow(*output_func)(void *, + struct mad_header const *, struct mad_pcm *); + enum mad_flow(*error_func)(void *, struct mad_stream *, struct mad_frame *); + enum mad_flow(*message_func)(void *, void *, unsigned int *); }; void mad_decoder_init(struct mad_decoder *, void *, - enum mad_flow (*)(void *, struct mad_stream *), - enum mad_flow (*)(void *, struct mad_header const *), - enum mad_flow (*)(void *, - struct mad_stream const *, - struct mad_frame *), - enum mad_flow (*)(void *, - struct mad_header const *, - struct mad_pcm *), - enum mad_flow (*)(void *, - struct mad_stream *, - struct mad_frame *), - enum mad_flow (*)(void *, void *, unsigned int *)); + enum mad_flow(*)(void *, struct mad_stream *), + enum mad_flow(*)(void *, struct mad_header const *), + enum mad_flow(*)(void *, + struct mad_stream const *, + struct mad_frame *), + enum mad_flow(*)(void *, + struct mad_header const *, + struct mad_pcm *), + enum mad_flow(*)(void *, + struct mad_stream *, + struct mad_frame *), + enum mad_flow(*)(void *, void *, unsigned int *)); int mad_decoder_finish(struct mad_decoder *); # define mad_decoder_options(decoder, opts) \ diff --git a/src/libmad/fixed.c b/src/libmad/fixed.c index 928c011b..22cf782d 100644 --- a/src/libmad/fixed.c +++ b/src/libmad/fixed.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: fixed.c,v 1.13 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: fixed.c,v 1.13 2004/01/23 09:41:32 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -28,54 +28,56 @@ # include "fixed.h" /* - * NAME: fixed->abs() - * DESCRIPTION: return absolute value of a fixed-point number - */ -mad_fixed_t mad_f_abs(mad_fixed_t x) -{ - return x < 0 ? -x : x; + NAME: fixed->abs() + DESCRIPTION: return absolute value of a fixed-point number +*/ +mad_fixed_t mad_f_abs(mad_fixed_t x) { + return x < 0 ? -x : x; } /* - * NAME: fixed->div() - * DESCRIPTION: perform division using fixed-point math - */ -mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) -{ - mad_fixed_t q, r; - unsigned int bits; - - q = mad_f_abs(x / y); - - if (x < 0) { - x = -x; - y = -y; - } - - r = x % y; - - if (y < 0) { - x = -x; - y = -y; - } - - if (q > mad_f_intpart(MAD_F_MAX) && - !(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) - return 0; - - for (bits = MAD_F_FRACBITS; bits && r; --bits) { - q <<= 1, r <<= 1; - if (r >= y) - r -= y, ++q; - } - - /* round */ - if (2 * r >= y) - ++q; - - /* fix sign */ - if ((x < 0) != (y < 0)) - q = -q; - - return q << bits; + NAME: fixed->div() + DESCRIPTION: perform division using fixed-point math +*/ +mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) { + mad_fixed_t q, r; + unsigned int bits; + + q = mad_f_abs(x / y); + + if (x < 0) { + x = -x; + y = -y; + } + + r = x % y; + + if (y < 0) { + x = -x; + y = -y; + } + + if (q > mad_f_intpart(MAD_F_MAX) && + !(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) { + return 0; + } + + for (bits = MAD_F_FRACBITS; bits && r; --bits) { + q <<= 1, r <<= 1; + if (r >= y) { + r -= y, ++q; + } + } + + /* round */ + if (2 * r >= y) { + ++q; + } + + /* fix sign */ + if ((x < 0) != (y < 0)) { + q = -q; + } + + return q << bits; } diff --git a/src/libmad/fixed.h b/src/libmad/fixed.h index 4b58abf5..89364798 100644 --- a/src/libmad/fixed.h +++ b/src/libmad/fixed.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp $ +*/ # ifndef LIBMAD_FIXED_H # define LIBMAD_FIXED_H @@ -47,27 +47,27 @@ typedef mad_fixed_t mad_sample_t; # endif /* - * Fixed-point format: 0xABBBBBBB - * A == whole part (sign + 3 bits) - * B == fractional part (28 bits) - * - * Values are signed two's complement, so the effective range is: - * 0x80000000 to 0x7fffffff - * -8.0 to +7.9999999962747097015380859375 - * - * The smallest representable value is: - * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) - * - * 28 bits of fractional accuracy represent about - * 8.6 digits of decimal accuracy. - * - * Fixed-point numbers can be added or subtracted as normal - * integers, but multiplication requires shifting the 64-bit result - * from 56 fractional bits back to 28 (and rounding.) - * - * Changing the definition of MAD_F_FRACBITS is only partially - * supported, and must be done with care. - */ + Fixed-point format: 0xABBBBBBB + A == whole part (sign + 3 bits) + B == fractional part (28 bits) + + Values are signed two's complement, so the effective range is: + 0x80000000 to 0x7fffffff + -8.0 to +7.9999999962747097015380859375 + + The smallest representable value is: + 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) + + 28 bits of fractional accuracy represent about + 8.6 digits of decimal accuracy. + + Fixed-point numbers can be added or subtracted as normal + integers, but multiplication requires shifting the 64-bit result + from 56 fractional bits back to 28 (and rounding.) + + Changing the definition of MAD_F_FRACBITS is only partially + supported, and must be done with care. +*/ # define MAD_F_FRACBITS 28 @@ -99,7 +99,7 @@ typedef mad_fixed_t mad_sample_t; # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) - /* (x should be positive) */ +/* (x should be positive) */ # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) @@ -120,9 +120,9 @@ typedef mad_fixed_t mad_sample_t; # elif defined(FPM_64BIT) /* - * This version should be the most accurate if 64-bit types are supported by - * the compiler, although it may not be the most efficient. - */ + This version should be the most accurate if 64-bit types are supported by + the compiler, although it may not be the most efficient. +*/ # if defined(OPT_ACCURACY) # define mad_f_mul(x, y) \ ((mad_fixed_t) \ @@ -143,19 +143,18 @@ typedef mad_fixed_t mad_sample_t; # pragma warning(push) # pragma warning(disable: 4035) /* no return value */ static __forceinline -mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) -{ - enum { - fracbits = MAD_F_FRACBITS - }; - - __asm { - mov eax, x - imul y - shrd eax, edx, fracbits - } - - /* implicit return of eax */ +mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) { + enum { + fracbits = MAD_F_FRACBITS + }; + + __asm { + mov eax, x + imul y + shrd eax, edx, fracbits + } + + /* implicit return of eax */ } # pragma warning(pop) @@ -163,9 +162,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # define mad_f_scale64 # else /* - * This Intel version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This Intel version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("imull %3" \ : "=a" (lo), "=d" (hi) \ @@ -174,8 +173,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This gives best accuracy but is not very fast. - */ + This gives best accuracy but is not very fast. +*/ # define MAD_F_MLA(hi, lo, x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -190,8 +189,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * Surprisingly, this is faster than SHRD followed by ADC. - */ + Surprisingly, this is faster than SHRD followed by ADC. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed64hi_t __hi_; \ mad_fixed64lo_t __lo_; \ @@ -210,8 +209,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) }) # elif defined(OPT_INTEL) /* - * Alternate Intel scaling that may or may not perform better. - */ + Alternate Intel scaling that may or may not perform better. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed_t __result; \ asm ("shrl %3,%1\n\t" \ @@ -241,15 +240,15 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_ARM) -/* - * This ARM V4 version is as accurate as FPM_64BIT but much faster. The - * least significant bit is properly rounded at no CPU cycle cost! - */ +/* + This ARM V4 version is as accurate as FPM_64BIT but much faster. The + least significant bit is properly rounded at no CPU cycle cost! +*/ # if 1 /* - * This is faster than the default implementation via MAD_F_MLX() and - * mad_f_scale64(). - */ + This is faster than the default implementation via MAD_F_MLX() and + mad_f_scale64(). +*/ # define mad_f_mul(x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -300,9 +299,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_MIPS) /* - * This MIPS version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This MIPS version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("mult %2,%3" \ : "=l" (lo), "=h" (hi) \ @@ -315,9 +314,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) : "%r" (x), "r" (y)) # elif defined(HAVE_MADD16_ASM) /* - * This loses significant accuracy due to the 16-bit integer limit in the - * multiply/accumulate instruction. - */ + This loses significant accuracy due to the 16-bit integer limit in the + multiply/accumulate instruction. +*/ # define MAD_F_ML0(hi, lo, x, y) \ asm ("mult %2,%3" \ : "=l" (lo), "=h" (hi) \ @@ -340,9 +339,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_SPARC) /* - * This SPARC V8 version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This SPARC V8 version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("smul %2, %3, %0\n\t" \ "rd %%y, %1" \ @@ -354,9 +353,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_PPC) /* - * This PowerPC version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This PowerPC version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ do { \ asm ("mullw %0,%1,%2" \ @@ -370,8 +369,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This gives best accuracy but is not very fast. - */ + This gives best accuracy but is not very fast. +*/ # define MAD_F_MLA(hi, lo, x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -387,8 +386,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This is slower than the truncating version below it. - */ + This is slower than the truncating version below it. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed_t __result, __round; \ asm ("rotrwi %0,%1,%2" \ @@ -425,14 +424,14 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_DEFAULT) /* - * This version is the most portable but it loses significant accuracy. - * Furthermore, accuracy is biased against the second argument, so care - * should be taken when ordering operands. - * - * The scale factors are constant as this is not used with SSO. - * - * Pre-rounding is required to stay within the limits of compliance. - */ + This version is the most portable but it loses significant accuracy. + Furthermore, accuracy is biased against the second argument, so care + should be taken when ordering operands. + + The scale factors are constant as this is not used with SSO. + + Pre-rounding is required to stay within the limits of compliance. +*/ # if defined(OPT_SPEED) # define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) # else diff --git a/src/libmad/frame.c b/src/libmad/frame.c index 1facef81..a7bb316a 100644 --- a/src/libmad/frame.c +++ b/src/libmad/frame.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: frame.c,v 1.29 2004/02/04 22:59:19 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: frame.c,v 1.29 2004/02/04 22:59:19 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -36,19 +36,29 @@ static unsigned long const bitrate_table[5][15] PROGMEM = { - /* MPEG-1 */ - { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ - 256000, 288000, 320000, 352000, 384000, 416000, 448000 }, - { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ - 128000, 160000, 192000, 224000, 256000, 320000, 384000 }, - { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ - 112000, 128000, 160000, 192000, 224000, 256000, 320000 }, - - /* MPEG-2 LSF */ - { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ - 128000, 144000, 160000, 176000, 192000, 224000, 256000 }, - { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ - 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */ + /* MPEG-1 */ + { + 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ + 256000, 288000, 320000, 352000, 384000, 416000, 448000 + }, + { + 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ + 128000, 160000, 192000, 224000, 256000, 320000, 384000 + }, + { + 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ + 112000, 128000, 160000, 192000, 224000, 256000, 320000 + }, + + /* MPEG-2 LSF */ + { + 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ + 128000, 144000, 160000, 176000, 192000, 224000, 256000 + }, + { + 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ + 64000, 80000, 96000, 112000, 128000, 144000, 160000 + } /* II & III */ }; static @@ -56,447 +66,451 @@ unsigned int const samplerate_table[3] PROGMEM = { 44100, 48000, 32000 }; static int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = { - NULL, //mad_layer_I, - NULL, //mad_layer_II, - mad_layer_III + NULL, //mad_layer_I, + NULL, //mad_layer_II, + mad_layer_III }; /* - * NAME: header->init() - * DESCRIPTION: initialize header struct - */ -void mad_header_init(struct mad_header *header) -{ - header->layer = 0; - header->mode = 0; - header->mode_extension = 0; - header->emphasis = 0; - - header->bitrate = 0; - header->samplerate = 0; - - header->crc_check = 0; - header->crc_target = 0; - - header->flags = 0; - header->private_bits = 0; - - header->duration = mad_timer_zero; + NAME: header->init() + DESCRIPTION: initialize header struct +*/ +void mad_header_init(struct mad_header *header) { + header->layer = 0; + header->mode = 0; + header->mode_extension = 0; + header->emphasis = 0; + + header->bitrate = 0; + header->samplerate = 0; + + header->crc_check = 0; + header->crc_target = 0; + + header->flags = 0; + header->private_bits = 0; + + header->duration = mad_timer_zero; } /* - * NAME: frame->init() - * DESCRIPTION: initialize frame struct - */ -void mad_frame_init(struct mad_frame *frame) -{ - stack(__FUNCTION__,__FILE__,__LINE__); - mad_header_init(&frame->header); + NAME: frame->init() + DESCRIPTION: initialize frame struct +*/ +void mad_frame_init(struct mad_frame *frame) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + mad_header_init(&frame->header); - frame->options = 0; + frame->options = 0; - mad_frame_mute(frame); + mad_frame_mute(frame); } /* - * NAME: frame->finish() - * DESCRIPTION: deallocate any dynamic memory associated with frame - */ -void mad_frame_finish(struct mad_frame *frame) -{ - (void) frame; - mad_header_finish(&frame->header); + NAME: frame->finish() + DESCRIPTION: deallocate any dynamic memory associated with frame +*/ +void mad_frame_finish(struct mad_frame *frame) { + (void) frame; + mad_header_finish(&frame->header); } /* - * NAME: decode_header() - * DESCRIPTION: read header data and following CRC word - */ + NAME: decode_header() + DESCRIPTION: read header data and following CRC word +*/ static -int decode_header(struct mad_header *header, struct mad_stream *stream) -{ - unsigned int index; +int decode_header(struct mad_header *header, struct mad_stream *stream) { + unsigned int index; - header->flags = 0; - header->private_bits = 0; + header->flags = 0; + header->private_bits = 0; - /* header() */ + /* header() */ - /* syncword */ - mad_bit_skip(&stream->ptr, 11); + /* syncword */ + mad_bit_skip(&stream->ptr, 11); - /* MPEG 2.5 indicator (really part of syncword) */ - if (mad_bit_read(&stream->ptr, 1) == 0) - header->flags |= MAD_FLAG_MPEG_2_5_EXT; + /* MPEG 2.5 indicator (really part of syncword) */ + if (mad_bit_read(&stream->ptr, 1) == 0) { + header->flags |= MAD_FLAG_MPEG_2_5_EXT; + } - /* ID */ - if (mad_bit_read(&stream->ptr, 1) == 0) - header->flags |= MAD_FLAG_LSF_EXT; - else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { - stream->error = MAD_ERROR_LOSTSYNC; - return -1; - } + /* ID */ + if (mad_bit_read(&stream->ptr, 1) == 0) { + header->flags |= MAD_FLAG_LSF_EXT; + } else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { + stream->error = MAD_ERROR_LOSTSYNC; + return -1; + } - /* layer */ - header->layer = 4 - mad_bit_read(&stream->ptr, 2); + /* layer */ + header->layer = 4 - mad_bit_read(&stream->ptr, 2); - if (header->layer == 4) { - stream->error = MAD_ERROR_BADLAYER; - return -1; - } + if (header->layer == 4) { + stream->error = MAD_ERROR_BADLAYER; + return -1; + } - /* protection_bit */ - if (mad_bit_read(&stream->ptr, 1) == 0) { - header->flags |= MAD_FLAG_PROTECTION; - header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); - } + /* protection_bit */ + if (mad_bit_read(&stream->ptr, 1) == 0) { + header->flags |= MAD_FLAG_PROTECTION; + header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); + } - /* bitrate_index */ - index = mad_bit_read(&stream->ptr, 4); + /* bitrate_index */ + index = mad_bit_read(&stream->ptr, 4); - if (index == 15) { - stream->error = MAD_ERROR_BADBITRATE; - return -1; - } + if (index == 15) { + stream->error = MAD_ERROR_BADBITRATE; + return -1; + } - if (header->flags & MAD_FLAG_LSF_EXT) - header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; - else - header->bitrate = bitrate_table[header->layer - 1][index]; + if (header->flags & MAD_FLAG_LSF_EXT) { + header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; + } else { + header->bitrate = bitrate_table[header->layer - 1][index]; + } - /* sampling_frequency */ - index = mad_bit_read(&stream->ptr, 2); + /* sampling_frequency */ + index = mad_bit_read(&stream->ptr, 2); - if (index == 3) { - stream->error = MAD_ERROR_BADSAMPLERATE; - return -1; - } + if (index == 3) { + stream->error = MAD_ERROR_BADSAMPLERATE; + return -1; + } - header->samplerate = samplerate_table[index]; + header->samplerate = samplerate_table[index]; - if (header->flags & MAD_FLAG_LSF_EXT) { - header->samplerate /= 2; + if (header->flags & MAD_FLAG_LSF_EXT) { + header->samplerate /= 2; - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - header->samplerate /= 2; - } + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { + header->samplerate /= 2; + } + } - /* padding_bit */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_PADDING; + /* padding_bit */ + if (mad_bit_read(&stream->ptr, 1)) { + header->flags |= MAD_FLAG_PADDING; + } - /* private_bit */ - if (mad_bit_read(&stream->ptr, 1)) - header->private_bits |= MAD_PRIVATE_HEADER; + /* private_bit */ + if (mad_bit_read(&stream->ptr, 1)) { + header->private_bits |= MAD_PRIVATE_HEADER; + } - /* mode */ - header->mode = 3 - mad_bit_read(&stream->ptr, 2); + /* mode */ + header->mode = 3 - mad_bit_read(&stream->ptr, 2); - /* mode_extension */ - header->mode_extension = mad_bit_read(&stream->ptr, 2); + /* mode_extension */ + header->mode_extension = mad_bit_read(&stream->ptr, 2); - /* copyright */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_COPYRIGHT; + /* copyright */ + if (mad_bit_read(&stream->ptr, 1)) { + header->flags |= MAD_FLAG_COPYRIGHT; + } - /* original/copy */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_ORIGINAL; + /* original/copy */ + if (mad_bit_read(&stream->ptr, 1)) { + header->flags |= MAD_FLAG_ORIGINAL; + } - /* emphasis */ - header->emphasis = mad_bit_read(&stream->ptr, 2); + /* emphasis */ + header->emphasis = mad_bit_read(&stream->ptr, 2); # if defined(OPT_STRICT) - /* - * ISO/IEC 11172-3 says this is a reserved emphasis value, but - * streams exist which use it anyway. Since the value is not important - * to the decoder proper, we allow it unless OPT_STRICT is defined. - */ - if (header->emphasis == MAD_EMPHASIS_RESERVED) { - stream->error = MAD_ERROR_BADEMPHASIS; - return -1; - } + /* + ISO/IEC 11172-3 says this is a reserved emphasis value, but + streams exist which use it anyway. Since the value is not important + to the decoder proper, we allow it unless OPT_STRICT is defined. + */ + if (header->emphasis == MAD_EMPHASIS_RESERVED) { + stream->error = MAD_ERROR_BADEMPHASIS; + return -1; + } # endif - /* error_check() */ + /* error_check() */ - /* crc_check */ - if (header->flags & MAD_FLAG_PROTECTION) - header->crc_target = mad_bit_read(&stream->ptr, 16); + /* crc_check */ + if (header->flags & MAD_FLAG_PROTECTION) { + header->crc_target = mad_bit_read(&stream->ptr, 16); + } - return 0; + return 0; } /* - * NAME: free_bitrate() - * DESCRIPTION: attempt to discover the bitstream's free bitrate - */ + NAME: free_bitrate() + DESCRIPTION: attempt to discover the bitstream's free bitrate +*/ static -int free_bitrate(struct mad_stream *stream, struct mad_header const *header) -{ - struct mad_bitptr keep_ptr; - unsigned long rate = 0; - unsigned int pad_slot, slots_per_frame; - unsigned char const *ptr = 0; - - keep_ptr = stream->ptr; - - pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; - slots_per_frame = (header->layer == MAD_LAYER_III && - (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; - - while (mad_stream_sync(stream) == 0) { - struct mad_stream peek_stream; - struct mad_header peek_header; - - peek_stream = *stream; - peek_header = *header; - - if (decode_header(&peek_header, &peek_stream) == 0 && - peek_header.layer == header->layer && - peek_header.samplerate == header->samplerate) { - unsigned int N; - - ptr = mad_bit_nextbyte(&stream->ptr); - - N = ptr - stream->this_frame; - - if (header->layer == MAD_LAYER_I) { - rate = (unsigned long) header->samplerate * - (N - 4 * pad_slot + 4) / 48 / 1000; - } - else { - rate = (unsigned long) header->samplerate * - (N - pad_slot + 1) / slots_per_frame / 1000; - } - - if (rate >= 8) - break; - } +int free_bitrate(struct mad_stream *stream, struct mad_header const *header) { + struct mad_bitptr keep_ptr; + unsigned long rate = 0; + unsigned int pad_slot, slots_per_frame; + unsigned char const *ptr = 0; - mad_bit_skip(&stream->ptr, 8); - } + keep_ptr = stream->ptr; - stream->ptr = keep_ptr; + pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; + slots_per_frame = (header->layer == MAD_LAYER_III && + (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; - if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { - stream->error = MAD_ERROR_LOSTSYNC; - return -1; - } + while (mad_stream_sync(stream) == 0) { + struct mad_stream peek_stream; + struct mad_header peek_header; - stream->freerate = rate * 1000; + peek_stream = *stream; + peek_header = *header; - return 0; -} + if (decode_header(&peek_header, &peek_stream) == 0 && + peek_header.layer == header->layer && + peek_header.samplerate == header->samplerate) { + unsigned int N; -/* - * NAME: header->decode() - * DESCRIPTION: read the next frame header from the stream - */ -int mad_header_decode(struct mad_header *header, struct mad_stream *stream) -{ - register unsigned char const *ptr, *end; - unsigned int pad_slot, N; - - ptr = stream->next_frame; - end = stream->bufend; - - if (ptr == 0) { - stream->error = MAD_ERROR_BUFPTR; - goto fail; - } - - /* stream skip */ - if (stream->skiplen) { - if (!stream->sync) - ptr = stream->this_frame; - - if ((unsigned int)(end - ptr) < stream->skiplen) { - stream->skiplen -= end - ptr; - stream->next_frame = end; - - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } + ptr = mad_bit_nextbyte(&stream->ptr); - ptr += stream->skiplen; - stream->skiplen = 0; + N = ptr - stream->this_frame; - stream->sync = 1; - } + if (header->layer == MAD_LAYER_I) { + rate = (unsigned long) header->samplerate * + (N - 4 * pad_slot + 4) / 48 / 1000; + } else { + rate = (unsigned long) header->samplerate * + (N - pad_slot + 1) / slots_per_frame / 1000; + } - sync: - /* synchronize */ - if (stream->sync) { - if (end - ptr < MAD_BUFFER_GUARD) { - stream->next_frame = ptr; + if (rate >= 8) { + break; + } + } - stream->error = MAD_ERROR_BUFLEN; - goto fail; + mad_bit_skip(&stream->ptr, 8); } - else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { - /* mark point where frame sync word was expected */ - stream->this_frame = ptr; - stream->next_frame = ptr + 1; - stream->error = MAD_ERROR_LOSTSYNC; - goto fail; + stream->ptr = keep_ptr; + + if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { + stream->error = MAD_ERROR_LOSTSYNC; + return -1; } - } - else { - mad_bit_init(&stream->ptr, ptr); - if (mad_stream_sync(stream) == -1) { - if (end - stream->next_frame >= MAD_BUFFER_GUARD) - stream->next_frame = end - MAD_BUFFER_GUARD; + stream->freerate = rate * 1000; + + return 0; +} + +/* + NAME: header->decode() + DESCRIPTION: read the next frame header from the stream +*/ +int mad_header_decode(struct mad_header *header, struct mad_stream *stream) { + register unsigned char const *ptr, *end; + unsigned int pad_slot, N; - stream->error = MAD_ERROR_BUFLEN; - goto fail; + ptr = stream->next_frame; + end = stream->bufend; + + if (ptr == 0) { + stream->error = MAD_ERROR_BUFPTR; + goto fail; } - ptr = mad_bit_nextbyte(&stream->ptr); - } + /* stream skip */ + if (stream->skiplen) { + if (!stream->sync) { + ptr = stream->this_frame; + } - /* begin processing */ - stream->this_frame = ptr; - stream->next_frame = ptr + 1; /* possibly bogus sync word */ + if ((unsigned int)(end - ptr) < stream->skiplen) { + stream->skiplen -= end - ptr; + stream->next_frame = end; - mad_bit_init(&stream->ptr, stream->this_frame); + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } - if (decode_header(header, stream) == -1) - goto fail; + ptr += stream->skiplen; + stream->skiplen = 0; - /* calculate frame duration */ - mad_timer_set(&header->duration, 0, - 32 * MAD_NSBSAMPLES(header), header->samplerate); + stream->sync = 1; + } - /* calculate free bit rate */ - if (header->bitrate == 0) { - if ((stream->freerate == 0 || !stream->sync || - (header->layer == MAD_LAYER_III && stream->freerate > 640000)) && - free_bitrate(stream, header) == -1) - goto fail; +sync: + /* synchronize */ + if (stream->sync) { + if (end - ptr < MAD_BUFFER_GUARD) { + stream->next_frame = ptr; + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { + /* mark point where frame sync word was expected */ + stream->this_frame = ptr; + stream->next_frame = ptr + 1; + + stream->error = MAD_ERROR_LOSTSYNC; + goto fail; + } + } else { + mad_bit_init(&stream->ptr, ptr); + + if (mad_stream_sync(stream) == -1) { + if (end - stream->next_frame >= MAD_BUFFER_GUARD) { + stream->next_frame = end - MAD_BUFFER_GUARD; + } + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } + + ptr = mad_bit_nextbyte(&stream->ptr); + } - header->bitrate = stream->freerate; - header->flags |= MAD_FLAG_FREEFORMAT; - } + /* begin processing */ + stream->this_frame = ptr; + stream->next_frame = ptr + 1; /* possibly bogus sync word */ - /* calculate beginning of next frame */ - pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; + mad_bit_init(&stream->ptr, stream->this_frame); - if (header->layer == MAD_LAYER_I) - N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; - else { - unsigned int slots_per_frame; + if (decode_header(header, stream) == -1) { + goto fail; + } - slots_per_frame = (header->layer == MAD_LAYER_III && - (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; + /* calculate frame duration */ + mad_timer_set(&header->duration, 0, + 32 * MAD_NSBSAMPLES(header), header->samplerate); - N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; - } + /* calculate free bit rate */ + if (header->bitrate == 0) { + if ((stream->freerate == 0 || !stream->sync || + (header->layer == MAD_LAYER_III && stream->freerate > 640000)) && + free_bitrate(stream, header) == -1) { + goto fail; + } - /* verify there is enough data left in buffer to decode this frame */ - if (N + MAD_BUFFER_GUARD > (unsigned int)(end - stream->this_frame)) { - stream->next_frame = stream->this_frame; + header->bitrate = stream->freerate; + header->flags |= MAD_FLAG_FREEFORMAT; + } - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } + /* calculate beginning of next frame */ + pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; - stream->next_frame = stream->this_frame + N; + if (header->layer == MAD_LAYER_I) { + N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; + } else { + unsigned int slots_per_frame; - if (!stream->sync) { - /* check that a valid frame header follows this frame */ + slots_per_frame = (header->layer == MAD_LAYER_III && + (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; - ptr = stream->next_frame; - if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { - ptr = stream->next_frame = stream->this_frame + 1; - goto sync; + N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; } - stream->sync = 1; - } + /* verify there is enough data left in buffer to decode this frame */ + if (N + MAD_BUFFER_GUARD > (unsigned int)(end - stream->this_frame)) { + stream->next_frame = stream->this_frame; - header->flags |= MAD_FLAG_INCOMPLETE; + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } - return 0; + stream->next_frame = stream->this_frame + N; - fail: - stream->sync = 0; + if (!stream->sync) { + /* check that a valid frame header follows this frame */ - return -1; -} + ptr = stream->next_frame; + if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { + ptr = stream->next_frame = stream->this_frame + 1; + goto sync; + } -/* - * NAME: frame->decode() - * DESCRIPTION: decode a single frame from a bitstream - */ -int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) -{ - frame->options = stream->options; + stream->sync = 1; + } - /* header() */ - /* error_check() */ + header->flags |= MAD_FLAG_INCOMPLETE; - if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && - mad_header_decode(&frame->header, stream) == -1) - goto fail; + return 0; - /* audio_data() */ +fail: + stream->sync = 0; - frame->header.flags &= ~MAD_FLAG_INCOMPLETE; + return -1; +} - // EFP3 - On non-MP3 frames, abort instead of crash..we removed MP-II/MP-I decoders - if (!decoder_table[frame->header.layer - 1]) { - goto fail; - } +/* + NAME: frame->decode() + DESCRIPTION: decode a single frame from a bitstream +*/ +int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) { + frame->options = stream->options; + + /* header() */ + /* error_check() */ + + if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && + mad_header_decode(&frame->header, stream) == -1) { + goto fail; + } - if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { - if (!MAD_RECOVERABLE(stream->error)) - stream->next_frame = stream->this_frame; + /* audio_data() */ - goto fail; - } + frame->header.flags &= ~MAD_FLAG_INCOMPLETE; - /* ancillary_data() */ + // EFP3 - On non-MP3 frames, abort instead of crash..we removed MP-II/MP-I decoders + if (!decoder_table[frame->header.layer - 1]) { + goto fail; + } + + if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { + if (!MAD_RECOVERABLE(stream->error)) { + stream->next_frame = stream->this_frame; + } - if (frame->header.layer != MAD_LAYER_III) { - struct mad_bitptr next_frame; + goto fail; + } - mad_bit_init(&next_frame, stream->next_frame); + /* ancillary_data() */ - stream->anc_ptr = stream->ptr; - stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); + if (frame->header.layer != MAD_LAYER_III) { + struct mad_bitptr next_frame; - mad_bit_finish(&next_frame); - } + mad_bit_init(&next_frame, stream->next_frame); - return 0; + stream->anc_ptr = stream->ptr; + stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); - fail: - stream->anc_bitlen = 0; - return -1; + mad_bit_finish(&next_frame); + } + + return 0; + +fail: + stream->anc_bitlen = 0; + return -1; } /* - * NAME: frame->mute() - * DESCRIPTION: zero all subband values so the frame becomes silent - */ -void mad_frame_mute(struct mad_frame *frame) -{ - unsigned int s, sb; - - for (s = 0; s < 36; ++s) { - for (sb = 0; sb < 32; ++sb) { - frame->sbsample[0][s][sb] = - frame->sbsample[1][s][sb] = 0; + NAME: frame->mute() + DESCRIPTION: zero all subband values so the frame becomes silent +*/ +void mad_frame_mute(struct mad_frame *frame) { + unsigned int s, sb; + + for (s = 0; s < 36; ++s) { + for (sb = 0; sb < 32; ++sb) { + frame->sbsample[0][s][sb] = + frame->sbsample[1][s][sb] = 0; + } } - } - for (s = 0; s < 18; ++s) { - for (sb = 0; sb < 32; ++sb) { - frame->overlap[0][sb][s] = - frame->overlap[1][sb][s] = 0; + for (s = 0; s < 18; ++s) { + for (sb = 0; sb < 32; ++sb) { + frame->overlap[0][sb][s] = + frame->overlap[1][sb][s] = 0; + } } - } } diff --git a/src/libmad/frame.h b/src/libmad/frame.h index b3dece6c..134c1a93 100644 --- a/src/libmad/frame.h +++ b/src/libmad/frame.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_FRAME_H # define LIBMAD_FRAME_H @@ -27,53 +27,53 @@ # include "stream.h" enum mad_layer { - MAD_LAYER_I = 1, /* Layer I */ - MAD_LAYER_II = 2, /* Layer II */ - MAD_LAYER_III = 3 /* Layer III */ + MAD_LAYER_I = 1, /* Layer I */ + MAD_LAYER_II = 2, /* Layer II */ + MAD_LAYER_III = 3 /* Layer III */ }; enum mad_mode { - MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ - MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ - MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ - MAD_MODE_STEREO = 3 /* normal LR stereo */ + MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ + MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ + MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ + MAD_MODE_STEREO = 3 /* normal LR stereo */ }; enum mad_emphasis { - MAD_EMPHASIS_NONE = 0, /* no emphasis */ - MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ - MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ - MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ + MAD_EMPHASIS_NONE = 0, /* no emphasis */ + MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ + MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ + MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ }; struct mad_header { - enum mad_layer layer; /* audio layer (1, 2, or 3) */ - enum mad_mode mode; /* channel mode (see above) */ - int mode_extension; /* additional mode info */ - enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ + enum mad_layer layer; /* audio layer (1, 2, or 3) */ + enum mad_mode mode; /* channel mode (see above) */ + int mode_extension; /* additional mode info */ + enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ - unsigned long bitrate; /* stream bitrate (bps) */ - unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned long bitrate; /* stream bitrate (bps) */ + unsigned int samplerate; /* sampling frequency (Hz) */ - unsigned short crc_check; /* frame CRC accumulator */ - unsigned short crc_target; /* final target CRC checksum */ + unsigned short crc_check; /* frame CRC accumulator */ + unsigned short crc_target; /* final target CRC checksum */ - int flags; /* flags (see below) */ - int private_bits; /* private bits (see below) */ + int flags; /* flags (see below) */ + int private_bits; /* private bits (see below) */ - mad_timer_t duration; /* audio playing time of frame */ + mad_timer_t duration; /* audio playing time of frame */ }; struct mad_frame { - struct mad_header header; /* MPEG audio header */ + struct mad_header header; /* MPEG audio header */ - int options; /* decoding options (from stream) */ + int options; /* decoding options (from stream) */ - mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ - mad_fixed_t overlap[2][32][18]; /* Layer III block overlap data */ + mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ + mad_fixed_t overlap[2][32][18]; /* Layer III block overlap data */ - mad_fixed_t xr_raw[576*2]; - mad_fixed_t tmp[576]; + mad_fixed_t xr_raw[576 * 2]; + mad_fixed_t tmp[576]; }; # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) @@ -83,26 +83,26 @@ struct mad_frame { ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) enum { - MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ - MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ + MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ + MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ - MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ - MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ - MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ - MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ + MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ + MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ + MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ + MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ - MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ - MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ - MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ + MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ + MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ + MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ - MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ - MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ - MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ + MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ + MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ + MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ }; enum { - MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ - MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ + MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ + MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ }; void mad_header_init(struct mad_header *); diff --git a/src/libmad/global.h b/src/libmad/global.h index a6debfd8..e020ac89 100644 --- a/src/libmad/global.h +++ b/src/libmad/global.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: global.h,v 1.11 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: global.h,v 1.11 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_GLOBAL_H # define LIBMAD_GLOBAL_H @@ -48,6 +48,7 @@ # endif # if !defined(HAVE_ASSERT_H) +# undef assert # if defined(NDEBUG) # define assert(x) /* nothing */ # else diff --git a/src/libmad/huffman.c b/src/libmad/huffman.c index 33870851..d58f3e2c 100644 --- a/src/libmad/huffman.c +++ b/src/libmad/huffman.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: huffman.c,v 1.10 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: huffman.c,v 1.10 2004/01/23 09:41:32 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -29,11 +29,11 @@ # include "huffman.h" /* - * These are the Huffman code words for Layer III. - * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. - * - * These tables support decoding up to 4 Huffman code bits at a time. - */ + These are the Huffman code words for Layer III. + The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. + + These tables support decoding up to 4 Huffman code bits at a time. +*/ # if defined(__GNUC__) || \ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) @@ -52,62 +52,62 @@ static union huffquad const hufftabA[] PROGMEM = { - /* 0000 */ PTR(16, 2), - /* 0001 */ PTR(20, 2), - /* 0010 */ PTR(24, 1), - /* 0011 */ PTR(26, 1), - /* 0100 */ V(0, 0, 1, 0, 4), - /* 0101 */ V(0, 0, 0, 1, 4), - /* 0110 */ V(0, 1, 0, 0, 4), - /* 0111 */ V(1, 0, 0, 0, 4), - /* 1000 */ V(0, 0, 0, 0, 1), - /* 1001 */ V(0, 0, 0, 0, 1), - /* 1010 */ V(0, 0, 0, 0, 1), - /* 1011 */ V(0, 0, 0, 0, 1), - /* 1100 */ V(0, 0, 0, 0, 1), - /* 1101 */ V(0, 0, 0, 0, 1), - /* 1110 */ V(0, 0, 0, 0, 1), - /* 1111 */ V(0, 0, 0, 0, 1), - - /* 0000 ... */ - /* 00 */ V(1, 0, 1, 1, 2), /* 16 */ - /* 01 */ V(1, 1, 1, 1, 2), - /* 10 */ V(1, 1, 0, 1, 2), - /* 11 */ V(1, 1, 1, 0, 2), - - /* 0001 ... */ - /* 00 */ V(0, 1, 1, 1, 2), /* 20 */ - /* 01 */ V(0, 1, 0, 1, 2), - /* 10 */ V(1, 0, 0, 1, 1), - /* 11 */ V(1, 0, 0, 1, 1), - - /* 0010 ... */ - /* 0 */ V(0, 1, 1, 0, 1), /* 24 */ - /* 1 */ V(0, 0, 1, 1, 1), - - /* 0011 ... */ - /* 0 */ V(1, 0, 1, 0, 1), /* 26 */ - /* 1 */ V(1, 1, 0, 0, 1) + /* 0000 */ PTR(16, 2), + /* 0001 */ PTR(20, 2), + /* 0010 */ PTR(24, 1), + /* 0011 */ PTR(26, 1), + /* 0100 */ V(0, 0, 1, 0, 4), + /* 0101 */ V(0, 0, 0, 1, 4), + /* 0110 */ V(0, 1, 0, 0, 4), + /* 0111 */ V(1, 0, 0, 0, 4), + /* 1000 */ V(0, 0, 0, 0, 1), + /* 1001 */ V(0, 0, 0, 0, 1), + /* 1010 */ V(0, 0, 0, 0, 1), + /* 1011 */ V(0, 0, 0, 0, 1), + /* 1100 */ V(0, 0, 0, 0, 1), + /* 1101 */ V(0, 0, 0, 0, 1), + /* 1110 */ V(0, 0, 0, 0, 1), + /* 1111 */ V(0, 0, 0, 0, 1), + + /* 0000 ... */ + /* 00 */ V(1, 0, 1, 1, 2), /* 16 */ + /* 01 */ V(1, 1, 1, 1, 2), + /* 10 */ V(1, 1, 0, 1, 2), + /* 11 */ V(1, 1, 1, 0, 2), + + /* 0001 ... */ + /* 00 */ V(0, 1, 1, 1, 2), /* 20 */ + /* 01 */ V(0, 1, 0, 1, 2), + /* 10 */ V(1, 0, 0, 1, 1), + /* 11 */ V(1, 0, 0, 1, 1), + + /* 0010 ... */ + /* 0 */ V(0, 1, 1, 0, 1), /* 24 */ + /* 1 */ V(0, 0, 1, 1, 1), + + /* 0011 ... */ + /* 0 */ V(1, 0, 1, 0, 1), /* 26 */ + /* 1 */ V(1, 1, 0, 0, 1) }; static union huffquad const hufftabB[] PROGMEM = { - /* 0000 */ V(1, 1, 1, 1, 4), - /* 0001 */ V(1, 1, 1, 0, 4), - /* 0010 */ V(1, 1, 0, 1, 4), - /* 0011 */ V(1, 1, 0, 0, 4), - /* 0100 */ V(1, 0, 1, 1, 4), - /* 0101 */ V(1, 0, 1, 0, 4), - /* 0110 */ V(1, 0, 0, 1, 4), - /* 0111 */ V(1, 0, 0, 0, 4), - /* 1000 */ V(0, 1, 1, 1, 4), - /* 1001 */ V(0, 1, 1, 0, 4), - /* 1010 */ V(0, 1, 0, 1, 4), - /* 1011 */ V(0, 1, 0, 0, 4), - /* 1100 */ V(0, 0, 1, 1, 4), - /* 1101 */ V(0, 0, 1, 0, 4), - /* 1110 */ V(0, 0, 0, 1, 4), - /* 1111 */ V(0, 0, 0, 0, 4) + /* 0000 */ V(1, 1, 1, 1, 4), + /* 0001 */ V(1, 1, 1, 0, 4), + /* 0010 */ V(1, 1, 0, 1, 4), + /* 0011 */ V(1, 1, 0, 0, 4), + /* 0100 */ V(1, 0, 1, 1, 4), + /* 0101 */ V(1, 0, 1, 0, 4), + /* 0110 */ V(1, 0, 0, 1, 4), + /* 0111 */ V(1, 0, 0, 0, 4), + /* 1000 */ V(0, 1, 1, 1, 4), + /* 1001 */ V(0, 1, 1, 0, 4), + /* 1010 */ V(0, 1, 0, 1, 4), + /* 1011 */ V(0, 1, 0, 0, 4), + /* 1100 */ V(0, 0, 1, 1, 4), + /* 1101 */ V(0, 0, 1, 0, 4), + /* 1110 */ V(0, 0, 0, 1, 4), + /* 1111 */ V(0, 0, 0, 0, 4) }; # undef V @@ -128,2943 +128,2943 @@ union huffquad const hufftabB[] PROGMEM = { static union huffpair const hufftab0[] PROGMEM = { - /* */ V(0, 0, 0) + /* */ V(0, 0, 0) }; static union huffpair const hufftab1[] PROGMEM = { - /* 000 */ V(1, 1, 3), - /* 001 */ V(0, 1, 3), - /* 010 */ V(1, 0, 2), - /* 011 */ V(1, 0, 2), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1) + /* 000 */ V(1, 1, 3), + /* 001 */ V(0, 1, 3), + /* 010 */ V(1, 0, 2), + /* 011 */ V(1, 0, 2), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1) }; static union huffpair const hufftab2[] PROGMEM = { - /* 000 */ PTR(8, 3), - /* 001 */ V(1, 1, 3), - /* 010 */ V(0, 1, 3), - /* 011 */ V(1, 0, 3), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1), - - /* 000 ... */ - /* 000 */ V(2, 2, 3), /* 8 */ - /* 001 */ V(0, 2, 3), - /* 010 */ V(1, 2, 2), - /* 011 */ V(1, 2, 2), - /* 100 */ V(2, 1, 2), - /* 101 */ V(2, 1, 2), - /* 110 */ V(2, 0, 2), - /* 111 */ V(2, 0, 2) + /* 000 */ PTR(8, 3), + /* 001 */ V(1, 1, 3), + /* 010 */ V(0, 1, 3), + /* 011 */ V(1, 0, 3), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1), + + /* 000 ... */ + /* 000 */ V(2, 2, 3), /* 8 */ + /* 001 */ V(0, 2, 3), + /* 010 */ V(1, 2, 2), + /* 011 */ V(1, 2, 2), + /* 100 */ V(2, 1, 2), + /* 101 */ V(2, 1, 2), + /* 110 */ V(2, 0, 2), + /* 111 */ V(2, 0, 2) }; static union huffpair const hufftab3[] PROGMEM = { - /* 000 */ PTR(8, 3), - /* 001 */ V(1, 0, 3), - /* 010 */ V(1, 1, 2), - /* 011 */ V(1, 1, 2), - /* 100 */ V(0, 1, 2), - /* 101 */ V(0, 1, 2), - /* 110 */ V(0, 0, 2), - /* 111 */ V(0, 0, 2), - - /* 000 ... */ - /* 000 */ V(2, 2, 3), /* 8 */ - /* 001 */ V(0, 2, 3), - /* 010 */ V(1, 2, 2), - /* 011 */ V(1, 2, 2), - /* 100 */ V(2, 1, 2), - /* 101 */ V(2, 1, 2), - /* 110 */ V(2, 0, 2), - /* 111 */ V(2, 0, 2) + /* 000 */ PTR(8, 3), + /* 001 */ V(1, 0, 3), + /* 010 */ V(1, 1, 2), + /* 011 */ V(1, 1, 2), + /* 100 */ V(0, 1, 2), + /* 101 */ V(0, 1, 2), + /* 110 */ V(0, 0, 2), + /* 111 */ V(0, 0, 2), + + /* 000 ... */ + /* 000 */ V(2, 2, 3), /* 8 */ + /* 001 */ V(0, 2, 3), + /* 010 */ V(1, 2, 2), + /* 011 */ V(1, 2, 2), + /* 100 */ V(2, 1, 2), + /* 101 */ V(2, 1, 2), + /* 110 */ V(2, 0, 2), + /* 111 */ V(2, 0, 2) }; static union huffpair const hufftab5[] PROGMEM = { - /* 000 */ PTR(8, 4), - /* 001 */ V(1, 1, 3), - /* 010 */ V(0, 1, 3), - /* 011 */ V(1, 0, 3), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1), - - /* 000 ... */ - /* 0000 */ PTR(24, 1), /* 8 */ - /* 0001 */ V(3, 2, 4), - /* 0010 */ V(3, 1, 3), - /* 0011 */ V(3, 1, 3), - /* 0100 */ V(1, 3, 4), - /* 0101 */ V(0, 3, 4), - /* 0110 */ V(3, 0, 4), - /* 0111 */ V(2, 2, 4), - /* 1000 */ V(1, 2, 3), - /* 1001 */ V(1, 2, 3), - /* 1010 */ V(2, 1, 3), - /* 1011 */ V(2, 1, 3), - /* 1100 */ V(0, 2, 3), - /* 1101 */ V(0, 2, 3), - /* 1110 */ V(2, 0, 3), - /* 1111 */ V(2, 0, 3), - - /* 000 0000 ... */ - /* 0 */ V(3, 3, 1), /* 24 */ - /* 1 */ V(2, 3, 1) + /* 000 */ PTR(8, 4), + /* 001 */ V(1, 1, 3), + /* 010 */ V(0, 1, 3), + /* 011 */ V(1, 0, 3), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1), + + /* 000 ... */ + /* 0000 */ PTR(24, 1), /* 8 */ + /* 0001 */ V(3, 2, 4), + /* 0010 */ V(3, 1, 3), + /* 0011 */ V(3, 1, 3), + /* 0100 */ V(1, 3, 4), + /* 0101 */ V(0, 3, 4), + /* 0110 */ V(3, 0, 4), + /* 0111 */ V(2, 2, 4), + /* 1000 */ V(1, 2, 3), + /* 1001 */ V(1, 2, 3), + /* 1010 */ V(2, 1, 3), + /* 1011 */ V(2, 1, 3), + /* 1100 */ V(0, 2, 3), + /* 1101 */ V(0, 2, 3), + /* 1110 */ V(2, 0, 3), + /* 1111 */ V(2, 0, 3), + + /* 000 0000 ... */ + /* 0 */ V(3, 3, 1), /* 24 */ + /* 1 */ V(2, 3, 1) }; static union huffpair const hufftab6[] PROGMEM = { - /* 0000 */ PTR(16, 3), - /* 0001 */ PTR(24, 1), - /* 0010 */ PTR(26, 1), - /* 0011 */ V(1, 2, 4), - /* 0100 */ V(2, 1, 4), - /* 0101 */ V(2, 0, 4), - /* 0110 */ V(0, 1, 3), - /* 0111 */ V(0, 1, 3), - /* 1000 */ V(1, 1, 2), - /* 1001 */ V(1, 1, 2), - /* 1010 */ V(1, 1, 2), - /* 1011 */ V(1, 1, 2), - /* 1100 */ V(1, 0, 3), - /* 1101 */ V(1, 0, 3), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 000 */ V(3, 3, 3), /* 16 */ - /* 001 */ V(0, 3, 3), - /* 010 */ V(2, 3, 2), - /* 011 */ V(2, 3, 2), - /* 100 */ V(3, 2, 2), - /* 101 */ V(3, 2, 2), - /* 110 */ V(3, 0, 2), - /* 111 */ V(3, 0, 2), - - /* 0001 ... */ - /* 0 */ V(1, 3, 1), /* 24 */ - /* 1 */ V(3, 1, 1), - - /* 0010 ... */ - /* 0 */ V(2, 2, 1), /* 26 */ - /* 1 */ V(0, 2, 1) + /* 0000 */ PTR(16, 3), + /* 0001 */ PTR(24, 1), + /* 0010 */ PTR(26, 1), + /* 0011 */ V(1, 2, 4), + /* 0100 */ V(2, 1, 4), + /* 0101 */ V(2, 0, 4), + /* 0110 */ V(0, 1, 3), + /* 0111 */ V(0, 1, 3), + /* 1000 */ V(1, 1, 2), + /* 1001 */ V(1, 1, 2), + /* 1010 */ V(1, 1, 2), + /* 1011 */ V(1, 1, 2), + /* 1100 */ V(1, 0, 3), + /* 1101 */ V(1, 0, 3), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 000 */ V(3, 3, 3), /* 16 */ + /* 001 */ V(0, 3, 3), + /* 010 */ V(2, 3, 2), + /* 011 */ V(2, 3, 2), + /* 100 */ V(3, 2, 2), + /* 101 */ V(3, 2, 2), + /* 110 */ V(3, 0, 2), + /* 111 */ V(3, 0, 2), + + /* 0001 ... */ + /* 0 */ V(1, 3, 1), /* 24 */ + /* 1 */ V(3, 1, 1), + + /* 0010 ... */ + /* 0 */ V(2, 2, 1), /* 26 */ + /* 1 */ V(0, 2, 1) }; static union huffpair const hufftab7[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 2), - /* 0011 */ V(1, 1, 4), - /* 0100 */ V(0, 1, 3), - /* 0101 */ V(0, 1, 3), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(52, 2), /* 16 */ - /* 0001 */ PTR(56, 1), - /* 0010 */ PTR(58, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(60, 1), - /* 0110 */ V(5, 0, 4), - /* 0111 */ PTR(62, 1), - /* 1000 */ V(2, 4, 4), - /* 1001 */ V(4, 2, 4), - /* 1010 */ V(1, 4, 3), - /* 1011 */ V(1, 4, 3), - /* 1100 */ V(4, 1, 3), - /* 1101 */ V(4, 1, 3), - /* 1110 */ V(4, 0, 3), - /* 1111 */ V(4, 0, 3), - - /* 0001 ... */ - /* 0000 */ V(0, 4, 4), /* 32 */ - /* 0001 */ V(2, 3, 4), - /* 0010 */ V(3, 2, 4), - /* 0011 */ V(0, 3, 4), - /* 0100 */ V(1, 3, 3), - /* 0101 */ V(1, 3, 3), - /* 0110 */ V(3, 1, 3), - /* 0111 */ V(3, 1, 3), - /* 1000 */ V(3, 0, 3), - /* 1001 */ V(3, 0, 3), - /* 1010 */ V(2, 2, 3), - /* 1011 */ V(2, 2, 3), - /* 1100 */ V(1, 2, 2), - /* 1101 */ V(1, 2, 2), - /* 1110 */ V(1, 2, 2), - /* 1111 */ V(1, 2, 2), - - /* 0010 ... */ - /* 00 */ V(2, 1, 1), /* 48 */ - /* 01 */ V(2, 1, 1), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 00 */ V(5, 5, 2), /* 52 */ - /* 01 */ V(4, 5, 2), - /* 10 */ V(5, 4, 2), - /* 11 */ V(5, 3, 2), - - /* 0000 0001 ... */ - /* 0 */ V(3, 5, 1), /* 56 */ - /* 1 */ V(4, 4, 1), - - /* 0000 0010 ... */ - /* 0 */ V(2, 5, 1), /* 58 */ - /* 1 */ V(5, 2, 1), - - /* 0000 0101 ... */ - /* 0 */ V(0, 5, 1), /* 60 */ - /* 1 */ V(3, 4, 1), - - /* 0000 0111 ... */ - /* 0 */ V(4, 3, 1), /* 62 */ - /* 1 */ V(3, 3, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 2), + /* 0011 */ V(1, 1, 4), + /* 0100 */ V(0, 1, 3), + /* 0101 */ V(0, 1, 3), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(52, 2), /* 16 */ + /* 0001 */ PTR(56, 1), + /* 0010 */ PTR(58, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(60, 1), + /* 0110 */ V(5, 0, 4), + /* 0111 */ PTR(62, 1), + /* 1000 */ V(2, 4, 4), + /* 1001 */ V(4, 2, 4), + /* 1010 */ V(1, 4, 3), + /* 1011 */ V(1, 4, 3), + /* 1100 */ V(4, 1, 3), + /* 1101 */ V(4, 1, 3), + /* 1110 */ V(4, 0, 3), + /* 1111 */ V(4, 0, 3), + + /* 0001 ... */ + /* 0000 */ V(0, 4, 4), /* 32 */ + /* 0001 */ V(2, 3, 4), + /* 0010 */ V(3, 2, 4), + /* 0011 */ V(0, 3, 4), + /* 0100 */ V(1, 3, 3), + /* 0101 */ V(1, 3, 3), + /* 0110 */ V(3, 1, 3), + /* 0111 */ V(3, 1, 3), + /* 1000 */ V(3, 0, 3), + /* 1001 */ V(3, 0, 3), + /* 1010 */ V(2, 2, 3), + /* 1011 */ V(2, 2, 3), + /* 1100 */ V(1, 2, 2), + /* 1101 */ V(1, 2, 2), + /* 1110 */ V(1, 2, 2), + /* 1111 */ V(1, 2, 2), + + /* 0010 ... */ + /* 00 */ V(2, 1, 1), /* 48 */ + /* 01 */ V(2, 1, 1), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 00 */ V(5, 5, 2), /* 52 */ + /* 01 */ V(4, 5, 2), + /* 10 */ V(5, 4, 2), + /* 11 */ V(5, 3, 2), + + /* 0000 0001 ... */ + /* 0 */ V(3, 5, 1), /* 56 */ + /* 1 */ V(4, 4, 1), + + /* 0000 0010 ... */ + /* 0 */ V(2, 5, 1), /* 58 */ + /* 1 */ V(5, 2, 1), + + /* 0000 0101 ... */ + /* 0 */ V(0, 5, 1), /* 60 */ + /* 1 */ V(3, 4, 1), + + /* 0000 0111 ... */ + /* 0 */ V(4, 3, 1), /* 62 */ + /* 1 */ V(3, 3, 1) }; # if 0 -/* this version saves 8 entries (16 bytes) at the expense of - an extra lookup in 4 out of 36 cases */ +/* this version saves 8 entries (16 bytes) at the expense of + an extra lookup in 4 out of 36 cases */ static union huffpair const hufftab8[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 2), - /* 0010 */ V(1, 2, 4), - /* 0011 */ V(2, 1, 4), - /* 0100 */ V(1, 1, 2), - /* 0101 */ V(1, 1, 2), - /* 0110 */ V(1, 1, 2), - /* 0111 */ V(1, 1, 2), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(36, 3), /* 16 */ - /* 0001 */ PTR(44, 2), - /* 0010 */ PTR(48, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(50, 1), - /* 0110 */ PTR(52, 1), - /* 0111 */ V(2, 4, 4), - /* 1000 */ V(4, 2, 4), - /* 1001 */ V(1, 4, 4), - /* 1010 */ V(4, 1, 3), - /* 1011 */ V(4, 1, 3), - /* 1100 */ V(0, 4, 4), - /* 1101 */ V(4, 0, 4), - /* 1110 */ V(2, 3, 4), - /* 1111 */ V(3, 2, 4), - - /* 0001 ... */ - /* 00 */ PTR(54, 2), /* 32 */ - /* 01 */ V(2, 2, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(5, 5, 3), /* 36 */ - /* 001 */ V(5, 4, 3), - /* 010 */ V(4, 5, 2), - /* 011 */ V(4, 5, 2), - /* 100 */ V(5, 3, 1), - /* 101 */ V(5, 3, 1), - /* 110 */ V(5, 3, 1), - /* 111 */ V(5, 3, 1), - - /* 0000 0001 ... */ - /* 00 */ V(3, 5, 2), /* 44 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(5, 2, 1), /* 48 */ - /* 1 */ V(0, 5, 1), - - /* 0000 0101 ... */ - /* 0 */ V(3, 4, 1), /* 50 */ - /* 1 */ V(4, 3, 1), - - /* 0000 0110 ... */ - /* 0 */ V(5, 0, 1), /* 52 */ - /* 1 */ V(3, 3, 1), - - /* 0001 00 ... */ - /* 00 */ V(1, 3, 2), /* 54 */ - /* 01 */ V(3, 1, 2), - /* 10 */ V(0, 3, 2), - /* 11 */ V(3, 0, 2), + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 2), + /* 0010 */ V(1, 2, 4), + /* 0011 */ V(2, 1, 4), + /* 0100 */ V(1, 1, 2), + /* 0101 */ V(1, 1, 2), + /* 0110 */ V(1, 1, 2), + /* 0111 */ V(1, 1, 2), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(36, 3), /* 16 */ + /* 0001 */ PTR(44, 2), + /* 0010 */ PTR(48, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(50, 1), + /* 0110 */ PTR(52, 1), + /* 0111 */ V(2, 4, 4), + /* 1000 */ V(4, 2, 4), + /* 1001 */ V(1, 4, 4), + /* 1010 */ V(4, 1, 3), + /* 1011 */ V(4, 1, 3), + /* 1100 */ V(0, 4, 4), + /* 1101 */ V(4, 0, 4), + /* 1110 */ V(2, 3, 4), + /* 1111 */ V(3, 2, 4), + + /* 0001 ... */ + /* 00 */ PTR(54, 2), /* 32 */ + /* 01 */ V(2, 2, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(5, 5, 3), /* 36 */ + /* 001 */ V(5, 4, 3), + /* 010 */ V(4, 5, 2), + /* 011 */ V(4, 5, 2), + /* 100 */ V(5, 3, 1), + /* 101 */ V(5, 3, 1), + /* 110 */ V(5, 3, 1), + /* 111 */ V(5, 3, 1), + + /* 0000 0001 ... */ + /* 00 */ V(3, 5, 2), /* 44 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(5, 2, 1), /* 48 */ + /* 1 */ V(0, 5, 1), + + /* 0000 0101 ... */ + /* 0 */ V(3, 4, 1), /* 50 */ + /* 1 */ V(4, 3, 1), + + /* 0000 0110 ... */ + /* 0 */ V(5, 0, 1), /* 52 */ + /* 1 */ V(3, 3, 1), + + /* 0001 00 ... */ + /* 00 */ V(1, 3, 2), /* 54 */ + /* 01 */ V(3, 1, 2), + /* 10 */ V(0, 3, 2), + /* 11 */ V(3, 0, 2), }; # else static union huffpair const hufftab8[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ V(1, 2, 4), - /* 0011 */ V(2, 1, 4), - /* 0100 */ V(1, 1, 2), - /* 0101 */ V(1, 1, 2), - /* 0110 */ V(1, 1, 2), - /* 0111 */ V(1, 1, 2), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(48, 3), /* 16 */ - /* 0001 */ PTR(56, 2), - /* 0010 */ PTR(60, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(62, 1), - /* 0110 */ PTR(64, 1), - /* 0111 */ V(2, 4, 4), - /* 1000 */ V(4, 2, 4), - /* 1001 */ V(1, 4, 4), - /* 1010 */ V(4, 1, 3), - /* 1011 */ V(4, 1, 3), - /* 1100 */ V(0, 4, 4), - /* 1101 */ V(4, 0, 4), - /* 1110 */ V(2, 3, 4), - /* 1111 */ V(3, 2, 4), - - /* 0001 ... */ - /* 0000 */ V(1, 3, 4), /* 32 */ - /* 0001 */ V(3, 1, 4), - /* 0010 */ V(0, 3, 4), - /* 0011 */ V(3, 0, 4), - /* 0100 */ V(2, 2, 2), - /* 0101 */ V(2, 2, 2), - /* 0110 */ V(2, 2, 2), - /* 0111 */ V(2, 2, 2), - /* 1000 */ V(0, 2, 2), - /* 1001 */ V(0, 2, 2), - /* 1010 */ V(0, 2, 2), - /* 1011 */ V(0, 2, 2), - /* 1100 */ V(2, 0, 2), - /* 1101 */ V(2, 0, 2), - /* 1110 */ V(2, 0, 2), - /* 1111 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(5, 5, 3), /* 48 */ - /* 001 */ V(5, 4, 3), - /* 010 */ V(4, 5, 2), - /* 011 */ V(4, 5, 2), - /* 100 */ V(5, 3, 1), - /* 101 */ V(5, 3, 1), - /* 110 */ V(5, 3, 1), - /* 111 */ V(5, 3, 1), - - /* 0000 0001 ... */ - /* 00 */ V(3, 5, 2), /* 56 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(5, 2, 1), /* 60 */ - /* 1 */ V(0, 5, 1), - - /* 0000 0101 ... */ - /* 0 */ V(3, 4, 1), /* 62 */ - /* 1 */ V(4, 3, 1), - - /* 0000 0110 ... */ - /* 0 */ V(5, 0, 1), /* 64 */ - /* 1 */ V(3, 3, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ V(1, 2, 4), + /* 0011 */ V(2, 1, 4), + /* 0100 */ V(1, 1, 2), + /* 0101 */ V(1, 1, 2), + /* 0110 */ V(1, 1, 2), + /* 0111 */ V(1, 1, 2), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(48, 3), /* 16 */ + /* 0001 */ PTR(56, 2), + /* 0010 */ PTR(60, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(62, 1), + /* 0110 */ PTR(64, 1), + /* 0111 */ V(2, 4, 4), + /* 1000 */ V(4, 2, 4), + /* 1001 */ V(1, 4, 4), + /* 1010 */ V(4, 1, 3), + /* 1011 */ V(4, 1, 3), + /* 1100 */ V(0, 4, 4), + /* 1101 */ V(4, 0, 4), + /* 1110 */ V(2, 3, 4), + /* 1111 */ V(3, 2, 4), + + /* 0001 ... */ + /* 0000 */ V(1, 3, 4), /* 32 */ + /* 0001 */ V(3, 1, 4), + /* 0010 */ V(0, 3, 4), + /* 0011 */ V(3, 0, 4), + /* 0100 */ V(2, 2, 2), + /* 0101 */ V(2, 2, 2), + /* 0110 */ V(2, 2, 2), + /* 0111 */ V(2, 2, 2), + /* 1000 */ V(0, 2, 2), + /* 1001 */ V(0, 2, 2), + /* 1010 */ V(0, 2, 2), + /* 1011 */ V(0, 2, 2), + /* 1100 */ V(2, 0, 2), + /* 1101 */ V(2, 0, 2), + /* 1110 */ V(2, 0, 2), + /* 1111 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(5, 5, 3), /* 48 */ + /* 001 */ V(5, 4, 3), + /* 010 */ V(4, 5, 2), + /* 011 */ V(4, 5, 2), + /* 100 */ V(5, 3, 1), + /* 101 */ V(5, 3, 1), + /* 110 */ V(5, 3, 1), + /* 111 */ V(5, 3, 1), + + /* 0000 0001 ... */ + /* 00 */ V(3, 5, 2), /* 56 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(5, 2, 1), /* 60 */ + /* 1 */ V(0, 5, 1), + + /* 0000 0101 ... */ + /* 0 */ V(3, 4, 1), /* 62 */ + /* 1 */ V(4, 3, 1), + + /* 0000 0110 ... */ + /* 0 */ V(5, 0, 1), /* 64 */ + /* 1 */ V(3, 3, 1) }; # endif static union huffpair const hufftab9[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 3), - /* 0010 */ PTR(40, 2), - /* 0011 */ PTR(44, 2), - /* 0100 */ PTR(48, 1), - /* 0101 */ V(1, 2, 4), - /* 0110 */ V(2, 1, 4), - /* 0111 */ V(2, 0, 4), - /* 1000 */ V(1, 1, 3), - /* 1001 */ V(1, 1, 3), - /* 1010 */ V(0, 1, 3), - /* 1011 */ V(0, 1, 3), - /* 1100 */ V(1, 0, 3), - /* 1101 */ V(1, 0, 3), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(50, 1), /* 16 */ - /* 0001 */ V(3, 5, 4), - /* 0010 */ V(5, 3, 4), - /* 0011 */ PTR(52, 1), - /* 0100 */ V(4, 4, 4), - /* 0101 */ V(2, 5, 4), - /* 0110 */ V(5, 2, 4), - /* 0111 */ V(1, 5, 4), - /* 1000 */ V(5, 1, 3), - /* 1001 */ V(5, 1, 3), - /* 1010 */ V(3, 4, 3), - /* 1011 */ V(3, 4, 3), - /* 1100 */ V(4, 3, 3), - /* 1101 */ V(4, 3, 3), - /* 1110 */ V(5, 0, 4), - /* 1111 */ V(0, 4, 4), - - /* 0001 ... */ - /* 000 */ V(2, 4, 3), /* 32 */ - /* 001 */ V(4, 2, 3), - /* 010 */ V(3, 3, 3), - /* 011 */ V(4, 0, 3), - /* 100 */ V(1, 4, 2), - /* 101 */ V(1, 4, 2), - /* 110 */ V(4, 1, 2), - /* 111 */ V(4, 1, 2), - - /* 0010 ... */ - /* 00 */ V(2, 3, 2), /* 40 */ - /* 01 */ V(3, 2, 2), - /* 10 */ V(1, 3, 1), - /* 11 */ V(1, 3, 1), - - /* 0011 ... */ - /* 00 */ V(3, 1, 1), /* 44 */ - /* 01 */ V(3, 1, 1), - /* 10 */ V(0, 3, 2), - /* 11 */ V(3, 0, 2), - - /* 0100 ... */ - /* 0 */ V(2, 2, 1), /* 48 */ - /* 1 */ V(0, 2, 1), - - /* 0000 0000 ... */ - /* 0 */ V(5, 5, 1), /* 50 */ - /* 1 */ V(4, 5, 1), - - /* 0000 0011 ... */ - /* 0 */ V(5, 4, 1), /* 52 */ - /* 1 */ V(0, 5, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 3), + /* 0010 */ PTR(40, 2), + /* 0011 */ PTR(44, 2), + /* 0100 */ PTR(48, 1), + /* 0101 */ V(1, 2, 4), + /* 0110 */ V(2, 1, 4), + /* 0111 */ V(2, 0, 4), + /* 1000 */ V(1, 1, 3), + /* 1001 */ V(1, 1, 3), + /* 1010 */ V(0, 1, 3), + /* 1011 */ V(0, 1, 3), + /* 1100 */ V(1, 0, 3), + /* 1101 */ V(1, 0, 3), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(50, 1), /* 16 */ + /* 0001 */ V(3, 5, 4), + /* 0010 */ V(5, 3, 4), + /* 0011 */ PTR(52, 1), + /* 0100 */ V(4, 4, 4), + /* 0101 */ V(2, 5, 4), + /* 0110 */ V(5, 2, 4), + /* 0111 */ V(1, 5, 4), + /* 1000 */ V(5, 1, 3), + /* 1001 */ V(5, 1, 3), + /* 1010 */ V(3, 4, 3), + /* 1011 */ V(3, 4, 3), + /* 1100 */ V(4, 3, 3), + /* 1101 */ V(4, 3, 3), + /* 1110 */ V(5, 0, 4), + /* 1111 */ V(0, 4, 4), + + /* 0001 ... */ + /* 000 */ V(2, 4, 3), /* 32 */ + /* 001 */ V(4, 2, 3), + /* 010 */ V(3, 3, 3), + /* 011 */ V(4, 0, 3), + /* 100 */ V(1, 4, 2), + /* 101 */ V(1, 4, 2), + /* 110 */ V(4, 1, 2), + /* 111 */ V(4, 1, 2), + + /* 0010 ... */ + /* 00 */ V(2, 3, 2), /* 40 */ + /* 01 */ V(3, 2, 2), + /* 10 */ V(1, 3, 1), + /* 11 */ V(1, 3, 1), + + /* 0011 ... */ + /* 00 */ V(3, 1, 1), /* 44 */ + /* 01 */ V(3, 1, 1), + /* 10 */ V(0, 3, 2), + /* 11 */ V(3, 0, 2), + + /* 0100 ... */ + /* 0 */ V(2, 2, 1), /* 48 */ + /* 1 */ V(0, 2, 1), + + /* 0000 0000 ... */ + /* 0 */ V(5, 5, 1), /* 50 */ + /* 1 */ V(4, 5, 1), + + /* 0000 0011 ... */ + /* 0 */ V(5, 4, 1), /* 52 */ + /* 1 */ V(0, 5, 1) }; static union huffpair const hufftab10[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 2), - /* 0011 */ V(1, 1, 4), - /* 0100 */ V(0, 1, 3), - /* 0101 */ V(0, 1, 3), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(52, 3), /* 16 */ - /* 0001 */ PTR(60, 2), - /* 0010 */ PTR(64, 3), - /* 0011 */ PTR(72, 1), - /* 0100 */ PTR(74, 2), - /* 0101 */ PTR(78, 2), - /* 0110 */ PTR(82, 2), - /* 0111 */ V(1, 7, 4), - /* 1000 */ V(7, 1, 4), - /* 1001 */ PTR(86, 1), - /* 1010 */ PTR(88, 2), - /* 1011 */ PTR(92, 2), - /* 1100 */ V(1, 6, 4), - /* 1101 */ V(6, 1, 4), - /* 1110 */ V(6, 0, 4), - /* 1111 */ PTR(96, 1), - - /* 0001 ... */ - /* 0000 */ PTR(98, 1), /* 32 */ - /* 0001 */ PTR(100, 1), - /* 0010 */ V(1, 4, 4), - /* 0011 */ V(4, 1, 4), - /* 0100 */ V(4, 0, 4), - /* 0101 */ V(2, 3, 4), - /* 0110 */ V(3, 2, 4), - /* 0111 */ V(0, 3, 4), - /* 1000 */ V(1, 3, 3), - /* 1001 */ V(1, 3, 3), - /* 1010 */ V(3, 1, 3), - /* 1011 */ V(3, 1, 3), - /* 1100 */ V(3, 0, 3), - /* 1101 */ V(3, 0, 3), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0010 ... */ - /* 00 */ V(1, 2, 2), /* 48 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(7, 7, 3), /* 52 */ - /* 001 */ V(6, 7, 3), - /* 010 */ V(7, 6, 3), - /* 011 */ V(5, 7, 3), - /* 100 */ V(7, 5, 3), - /* 101 */ V(6, 6, 3), - /* 110 */ V(4, 7, 2), - /* 111 */ V(4, 7, 2), - - /* 0000 0001 ... */ - /* 00 */ V(7, 4, 2), /* 60 */ - /* 01 */ V(5, 6, 2), - /* 10 */ V(6, 5, 2), - /* 11 */ V(3, 7, 2), - - /* 0000 0010 ... */ - /* 000 */ V(7, 3, 2), /* 64 */ - /* 001 */ V(7, 3, 2), - /* 010 */ V(4, 6, 2), - /* 011 */ V(4, 6, 2), - /* 100 */ V(5, 5, 3), - /* 101 */ V(5, 4, 3), - /* 110 */ V(6, 3, 2), - /* 111 */ V(6, 3, 2), - - /* 0000 0011 ... */ - /* 0 */ V(2, 7, 1), /* 72 */ - /* 1 */ V(7, 2, 1), - - /* 0000 0100 ... */ - /* 00 */ V(6, 4, 2), /* 74 */ - /* 01 */ V(0, 7, 2), - /* 10 */ V(7, 0, 1), - /* 11 */ V(7, 0, 1), - - /* 0000 0101 ... */ - /* 00 */ V(6, 2, 1), /* 78 */ - /* 01 */ V(6, 2, 1), - /* 10 */ V(4, 5, 2), - /* 11 */ V(3, 5, 2), - - /* 0000 0110 ... */ - /* 00 */ V(0, 6, 1), /* 82 */ - /* 01 */ V(0, 6, 1), - /* 10 */ V(5, 3, 2), - /* 11 */ V(4, 4, 2), - - /* 0000 1001 ... */ - /* 0 */ V(3, 6, 1), /* 86 */ - /* 1 */ V(2, 6, 1), - - /* 0000 1010 ... */ - /* 00 */ V(2, 5, 2), /* 88 */ - /* 01 */ V(5, 2, 2), - /* 10 */ V(1, 5, 1), - /* 11 */ V(1, 5, 1), - - /* 0000 1011 ... */ - /* 00 */ V(5, 1, 1), /* 92 */ - /* 01 */ V(5, 1, 1), - /* 10 */ V(3, 4, 2), - /* 11 */ V(4, 3, 2), - - /* 0000 1111 ... */ - /* 0 */ V(0, 5, 1), /* 96 */ - /* 1 */ V(5, 0, 1), - - /* 0001 0000 ... */ - /* 0 */ V(2, 4, 1), /* 98 */ - /* 1 */ V(4, 2, 1), - - /* 0001 0001 ... */ - /* 0 */ V(3, 3, 1), /* 100 */ - /* 1 */ V(0, 4, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 2), + /* 0011 */ V(1, 1, 4), + /* 0100 */ V(0, 1, 3), + /* 0101 */ V(0, 1, 3), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(52, 3), /* 16 */ + /* 0001 */ PTR(60, 2), + /* 0010 */ PTR(64, 3), + /* 0011 */ PTR(72, 1), + /* 0100 */ PTR(74, 2), + /* 0101 */ PTR(78, 2), + /* 0110 */ PTR(82, 2), + /* 0111 */ V(1, 7, 4), + /* 1000 */ V(7, 1, 4), + /* 1001 */ PTR(86, 1), + /* 1010 */ PTR(88, 2), + /* 1011 */ PTR(92, 2), + /* 1100 */ V(1, 6, 4), + /* 1101 */ V(6, 1, 4), + /* 1110 */ V(6, 0, 4), + /* 1111 */ PTR(96, 1), + + /* 0001 ... */ + /* 0000 */ PTR(98, 1), /* 32 */ + /* 0001 */ PTR(100, 1), + /* 0010 */ V(1, 4, 4), + /* 0011 */ V(4, 1, 4), + /* 0100 */ V(4, 0, 4), + /* 0101 */ V(2, 3, 4), + /* 0110 */ V(3, 2, 4), + /* 0111 */ V(0, 3, 4), + /* 1000 */ V(1, 3, 3), + /* 1001 */ V(1, 3, 3), + /* 1010 */ V(3, 1, 3), + /* 1011 */ V(3, 1, 3), + /* 1100 */ V(3, 0, 3), + /* 1101 */ V(3, 0, 3), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0010 ... */ + /* 00 */ V(1, 2, 2), /* 48 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(7, 7, 3), /* 52 */ + /* 001 */ V(6, 7, 3), + /* 010 */ V(7, 6, 3), + /* 011 */ V(5, 7, 3), + /* 100 */ V(7, 5, 3), + /* 101 */ V(6, 6, 3), + /* 110 */ V(4, 7, 2), + /* 111 */ V(4, 7, 2), + + /* 0000 0001 ... */ + /* 00 */ V(7, 4, 2), /* 60 */ + /* 01 */ V(5, 6, 2), + /* 10 */ V(6, 5, 2), + /* 11 */ V(3, 7, 2), + + /* 0000 0010 ... */ + /* 000 */ V(7, 3, 2), /* 64 */ + /* 001 */ V(7, 3, 2), + /* 010 */ V(4, 6, 2), + /* 011 */ V(4, 6, 2), + /* 100 */ V(5, 5, 3), + /* 101 */ V(5, 4, 3), + /* 110 */ V(6, 3, 2), + /* 111 */ V(6, 3, 2), + + /* 0000 0011 ... */ + /* 0 */ V(2, 7, 1), /* 72 */ + /* 1 */ V(7, 2, 1), + + /* 0000 0100 ... */ + /* 00 */ V(6, 4, 2), /* 74 */ + /* 01 */ V(0, 7, 2), + /* 10 */ V(7, 0, 1), + /* 11 */ V(7, 0, 1), + + /* 0000 0101 ... */ + /* 00 */ V(6, 2, 1), /* 78 */ + /* 01 */ V(6, 2, 1), + /* 10 */ V(4, 5, 2), + /* 11 */ V(3, 5, 2), + + /* 0000 0110 ... */ + /* 00 */ V(0, 6, 1), /* 82 */ + /* 01 */ V(0, 6, 1), + /* 10 */ V(5, 3, 2), + /* 11 */ V(4, 4, 2), + + /* 0000 1001 ... */ + /* 0 */ V(3, 6, 1), /* 86 */ + /* 1 */ V(2, 6, 1), + + /* 0000 1010 ... */ + /* 00 */ V(2, 5, 2), /* 88 */ + /* 01 */ V(5, 2, 2), + /* 10 */ V(1, 5, 1), + /* 11 */ V(1, 5, 1), + + /* 0000 1011 ... */ + /* 00 */ V(5, 1, 1), /* 92 */ + /* 01 */ V(5, 1, 1), + /* 10 */ V(3, 4, 2), + /* 11 */ V(4, 3, 2), + + /* 0000 1111 ... */ + /* 0 */ V(0, 5, 1), /* 96 */ + /* 1 */ V(5, 0, 1), + + /* 0001 0000 ... */ + /* 0 */ V(2, 4, 1), /* 98 */ + /* 1 */ V(4, 2, 1), + + /* 0001 0001 ... */ + /* 0 */ V(3, 3, 1), /* 100 */ + /* 1 */ V(0, 4, 1) }; static union huffpair const hufftab11[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 3), - /* 0100 */ V(1, 2, 4), - /* 0101 */ PTR(72, 1), - /* 0110 */ V(1, 1, 3), - /* 0111 */ V(1, 1, 3), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(74, 2), /* 16 */ - /* 0001 */ PTR(78, 3), - /* 0010 */ PTR(86, 2), - /* 0011 */ PTR(90, 1), - /* 0100 */ PTR(92, 2), - /* 0101 */ V(2, 7, 4), - /* 0110 */ V(7, 2, 4), - /* 0111 */ PTR(96, 1), - /* 1000 */ V(7, 1, 3), - /* 1001 */ V(7, 1, 3), - /* 1010 */ V(1, 7, 4), - /* 1011 */ V(7, 0, 4), - /* 1100 */ V(3, 6, 4), - /* 1101 */ V(6, 3, 4), - /* 1110 */ V(6, 0, 4), - /* 1111 */ PTR(98, 1), - - /* 0001 ... */ - /* 0000 */ PTR(100, 1), /* 32 */ - /* 0001 */ V(1, 5, 4), - /* 0010 */ V(6, 2, 3), - /* 0011 */ V(6, 2, 3), - /* 0100 */ V(2, 6, 4), - /* 0101 */ V(0, 6, 4), - /* 0110 */ V(1, 6, 3), - /* 0111 */ V(1, 6, 3), - /* 1000 */ V(6, 1, 3), - /* 1001 */ V(6, 1, 3), - /* 1010 */ V(5, 1, 4), - /* 1011 */ V(3, 4, 4), - /* 1100 */ V(5, 0, 4), - /* 1101 */ PTR(102, 1), - /* 1110 */ V(2, 4, 4), - /* 1111 */ V(4, 2, 4), - - /* 0010 ... */ - /* 0000 */ V(1, 4, 4), /* 48 */ - /* 0001 */ V(4, 1, 4), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 3), - /* 0101 */ V(2, 3, 3), - /* 0110 */ V(3, 2, 3), - /* 0111 */ V(3, 2, 3), - /* 1000 */ V(1, 3, 2), - /* 1001 */ V(1, 3, 2), - /* 1010 */ V(1, 3, 2), - /* 1011 */ V(1, 3, 2), - /* 1100 */ V(3, 1, 2), - /* 1101 */ V(3, 1, 2), - /* 1110 */ V(3, 1, 2), - /* 1111 */ V(3, 1, 2), - - /* 0011 ... */ - /* 000 */ V(0, 3, 3), /* 64 */ - /* 001 */ V(3, 0, 3), - /* 010 */ V(2, 2, 2), - /* 011 */ V(2, 2, 2), - /* 100 */ V(2, 1, 1), - /* 101 */ V(2, 1, 1), - /* 110 */ V(2, 1, 1), - /* 111 */ V(2, 1, 1), - - /* 0101 ... */ - /* 0 */ V(0, 2, 1), /* 72 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 00 */ V(7, 7, 2), /* 74 */ - /* 01 */ V(6, 7, 2), - /* 10 */ V(7, 6, 2), - /* 11 */ V(7, 5, 2), - - /* 0000 0001 ... */ - /* 000 */ V(6, 6, 2), /* 78 */ - /* 001 */ V(6, 6, 2), - /* 010 */ V(4, 7, 2), - /* 011 */ V(4, 7, 2), - /* 100 */ V(7, 4, 2), - /* 101 */ V(7, 4, 2), - /* 110 */ V(5, 7, 3), - /* 111 */ V(5, 5, 3), - - /* 0000 0010 ... */ - /* 00 */ V(5, 6, 2), /* 86 */ - /* 01 */ V(6, 5, 2), - /* 10 */ V(3, 7, 1), - /* 11 */ V(3, 7, 1), - - /* 0000 0011 ... */ - /* 0 */ V(7, 3, 1), /* 90 */ - /* 1 */ V(4, 6, 1), - - /* 0000 0100 ... */ - /* 00 */ V(4, 5, 2), /* 92 */ - /* 01 */ V(5, 4, 2), - /* 10 */ V(3, 5, 2), - /* 11 */ V(5, 3, 2), - - /* 0000 0111 ... */ - /* 0 */ V(6, 4, 1), /* 96 */ - /* 1 */ V(0, 7, 1), - - /* 0000 1111 ... */ - /* 0 */ V(4, 4, 1), /* 98 */ - /* 1 */ V(2, 5, 1), - - /* 0001 0000 ... */ - /* 0 */ V(5, 2, 1), /* 100 */ - /* 1 */ V(0, 5, 1), - - /* 0001 1101 ... */ - /* 0 */ V(4, 3, 1), /* 102 */ - /* 1 */ V(3, 3, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 3), + /* 0100 */ V(1, 2, 4), + /* 0101 */ PTR(72, 1), + /* 0110 */ V(1, 1, 3), + /* 0111 */ V(1, 1, 3), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(74, 2), /* 16 */ + /* 0001 */ PTR(78, 3), + /* 0010 */ PTR(86, 2), + /* 0011 */ PTR(90, 1), + /* 0100 */ PTR(92, 2), + /* 0101 */ V(2, 7, 4), + /* 0110 */ V(7, 2, 4), + /* 0111 */ PTR(96, 1), + /* 1000 */ V(7, 1, 3), + /* 1001 */ V(7, 1, 3), + /* 1010 */ V(1, 7, 4), + /* 1011 */ V(7, 0, 4), + /* 1100 */ V(3, 6, 4), + /* 1101 */ V(6, 3, 4), + /* 1110 */ V(6, 0, 4), + /* 1111 */ PTR(98, 1), + + /* 0001 ... */ + /* 0000 */ PTR(100, 1), /* 32 */ + /* 0001 */ V(1, 5, 4), + /* 0010 */ V(6, 2, 3), + /* 0011 */ V(6, 2, 3), + /* 0100 */ V(2, 6, 4), + /* 0101 */ V(0, 6, 4), + /* 0110 */ V(1, 6, 3), + /* 0111 */ V(1, 6, 3), + /* 1000 */ V(6, 1, 3), + /* 1001 */ V(6, 1, 3), + /* 1010 */ V(5, 1, 4), + /* 1011 */ V(3, 4, 4), + /* 1100 */ V(5, 0, 4), + /* 1101 */ PTR(102, 1), + /* 1110 */ V(2, 4, 4), + /* 1111 */ V(4, 2, 4), + + /* 0010 ... */ + /* 0000 */ V(1, 4, 4), /* 48 */ + /* 0001 */ V(4, 1, 4), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 3), + /* 0101 */ V(2, 3, 3), + /* 0110 */ V(3, 2, 3), + /* 0111 */ V(3, 2, 3), + /* 1000 */ V(1, 3, 2), + /* 1001 */ V(1, 3, 2), + /* 1010 */ V(1, 3, 2), + /* 1011 */ V(1, 3, 2), + /* 1100 */ V(3, 1, 2), + /* 1101 */ V(3, 1, 2), + /* 1110 */ V(3, 1, 2), + /* 1111 */ V(3, 1, 2), + + /* 0011 ... */ + /* 000 */ V(0, 3, 3), /* 64 */ + /* 001 */ V(3, 0, 3), + /* 010 */ V(2, 2, 2), + /* 011 */ V(2, 2, 2), + /* 100 */ V(2, 1, 1), + /* 101 */ V(2, 1, 1), + /* 110 */ V(2, 1, 1), + /* 111 */ V(2, 1, 1), + + /* 0101 ... */ + /* 0 */ V(0, 2, 1), /* 72 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 00 */ V(7, 7, 2), /* 74 */ + /* 01 */ V(6, 7, 2), + /* 10 */ V(7, 6, 2), + /* 11 */ V(7, 5, 2), + + /* 0000 0001 ... */ + /* 000 */ V(6, 6, 2), /* 78 */ + /* 001 */ V(6, 6, 2), + /* 010 */ V(4, 7, 2), + /* 011 */ V(4, 7, 2), + /* 100 */ V(7, 4, 2), + /* 101 */ V(7, 4, 2), + /* 110 */ V(5, 7, 3), + /* 111 */ V(5, 5, 3), + + /* 0000 0010 ... */ + /* 00 */ V(5, 6, 2), /* 86 */ + /* 01 */ V(6, 5, 2), + /* 10 */ V(3, 7, 1), + /* 11 */ V(3, 7, 1), + + /* 0000 0011 ... */ + /* 0 */ V(7, 3, 1), /* 90 */ + /* 1 */ V(4, 6, 1), + + /* 0000 0100 ... */ + /* 00 */ V(4, 5, 2), /* 92 */ + /* 01 */ V(5, 4, 2), + /* 10 */ V(3, 5, 2), + /* 11 */ V(5, 3, 2), + + /* 0000 0111 ... */ + /* 0 */ V(6, 4, 1), /* 96 */ + /* 1 */ V(0, 7, 1), + + /* 0000 1111 ... */ + /* 0 */ V(4, 4, 1), /* 98 */ + /* 1 */ V(2, 5, 1), + + /* 0001 0000 ... */ + /* 0 */ V(5, 2, 1), /* 100 */ + /* 1 */ V(0, 5, 1), + + /* 0001 1101 ... */ + /* 0 */ V(4, 3, 1), /* 102 */ + /* 1 */ V(3, 3, 1) }; static union huffpair const hufftab12[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ PTR(68, 3), - /* 0101 */ PTR(76, 1), - /* 0110 */ V(1, 2, 4), - /* 0111 */ V(2, 1, 4), - /* 1000 */ PTR(78, 1), - /* 1001 */ V(0, 0, 4), - /* 1010 */ V(1, 1, 3), - /* 1011 */ V(1, 1, 3), - /* 1100 */ V(0, 1, 3), - /* 1101 */ V(0, 1, 3), - /* 1110 */ V(1, 0, 3), - /* 1111 */ V(1, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(80, 2), /* 16 */ - /* 0001 */ PTR(84, 1), - /* 0010 */ PTR(86, 1), - /* 0011 */ PTR(88, 1), - /* 0100 */ V(5, 6, 4), - /* 0101 */ V(3, 7, 4), - /* 0110 */ PTR(90, 1), - /* 0111 */ V(2, 7, 4), - /* 1000 */ V(7, 2, 4), - /* 1001 */ V(4, 6, 4), - /* 1010 */ V(6, 4, 4), - /* 1011 */ V(1, 7, 4), - /* 1100 */ V(7, 1, 4), - /* 1101 */ PTR(92, 1), - /* 1110 */ V(3, 6, 4), - /* 1111 */ V(6, 3, 4), - - /* 0001 ... */ - /* 0000 */ V(4, 5, 4), /* 32 */ - /* 0001 */ V(5, 4, 4), - /* 0010 */ V(4, 4, 4), - /* 0011 */ PTR(94, 1), - /* 0100 */ V(2, 6, 3), - /* 0101 */ V(2, 6, 3), - /* 0110 */ V(6, 2, 3), - /* 0111 */ V(6, 2, 3), - /* 1000 */ V(6, 1, 3), - /* 1001 */ V(6, 1, 3), - /* 1010 */ V(1, 6, 4), - /* 1011 */ V(6, 0, 4), - /* 1100 */ V(3, 5, 4), - /* 1101 */ V(5, 3, 4), - /* 1110 */ V(2, 5, 4), - /* 1111 */ V(5, 2, 4), - - /* 0010 ... */ - /* 0000 */ V(1, 5, 3), /* 48 */ - /* 0001 */ V(1, 5, 3), - /* 0010 */ V(5, 1, 3), - /* 0011 */ V(5, 1, 3), - /* 0100 */ V(3, 4, 3), - /* 0101 */ V(3, 4, 3), - /* 0110 */ V(4, 3, 3), - /* 0111 */ V(4, 3, 3), - /* 1000 */ V(5, 0, 4), - /* 1001 */ V(0, 4, 4), - /* 1010 */ V(2, 4, 3), - /* 1011 */ V(2, 4, 3), - /* 1100 */ V(4, 2, 3), - /* 1101 */ V(4, 2, 3), - /* 1110 */ V(1, 4, 3), - /* 1111 */ V(1, 4, 3), - - /* 0011 ... */ - /* 00 */ V(3, 3, 2), /* 64 */ - /* 01 */ V(4, 1, 2), - /* 10 */ V(2, 3, 2), - /* 11 */ V(3, 2, 2), - - /* 0100 ... */ - /* 000 */ V(4, 0, 3), /* 68 */ - /* 001 */ V(0, 3, 3), - /* 010 */ V(3, 0, 2), - /* 011 */ V(3, 0, 2), - /* 100 */ V(1, 3, 1), - /* 101 */ V(1, 3, 1), - /* 110 */ V(1, 3, 1), - /* 111 */ V(1, 3, 1), - - /* 0101 ... */ - /* 0 */ V(3, 1, 1), /* 76 */ - /* 1 */ V(2, 2, 1), - - /* 1000 ... */ - /* 0 */ V(0, 2, 1), /* 78 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 00 */ V(7, 7, 2), /* 80 */ - /* 01 */ V(6, 7, 2), - /* 10 */ V(7, 6, 1), - /* 11 */ V(7, 6, 1), - - /* 0000 0001 ... */ - /* 0 */ V(5, 7, 1), /* 84 */ - /* 1 */ V(7, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(6, 6, 1), /* 86 */ - /* 1 */ V(4, 7, 1), - - /* 0000 0011 ... */ - /* 0 */ V(7, 4, 1), /* 88 */ - /* 1 */ V(6, 5, 1), - - /* 0000 0110 ... */ - /* 0 */ V(7, 3, 1), /* 90 */ - /* 1 */ V(5, 5, 1), - - /* 0000 1101 ... */ - /* 0 */ V(0, 7, 1), /* 92 */ - /* 1 */ V(7, 0, 1), - - /* 0001 0011 ... */ - /* 0 */ V(0, 6, 1), /* 94 */ - /* 1 */ V(0, 5, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ PTR(68, 3), + /* 0101 */ PTR(76, 1), + /* 0110 */ V(1, 2, 4), + /* 0111 */ V(2, 1, 4), + /* 1000 */ PTR(78, 1), + /* 1001 */ V(0, 0, 4), + /* 1010 */ V(1, 1, 3), + /* 1011 */ V(1, 1, 3), + /* 1100 */ V(0, 1, 3), + /* 1101 */ V(0, 1, 3), + /* 1110 */ V(1, 0, 3), + /* 1111 */ V(1, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(80, 2), /* 16 */ + /* 0001 */ PTR(84, 1), + /* 0010 */ PTR(86, 1), + /* 0011 */ PTR(88, 1), + /* 0100 */ V(5, 6, 4), + /* 0101 */ V(3, 7, 4), + /* 0110 */ PTR(90, 1), + /* 0111 */ V(2, 7, 4), + /* 1000 */ V(7, 2, 4), + /* 1001 */ V(4, 6, 4), + /* 1010 */ V(6, 4, 4), + /* 1011 */ V(1, 7, 4), + /* 1100 */ V(7, 1, 4), + /* 1101 */ PTR(92, 1), + /* 1110 */ V(3, 6, 4), + /* 1111 */ V(6, 3, 4), + + /* 0001 ... */ + /* 0000 */ V(4, 5, 4), /* 32 */ + /* 0001 */ V(5, 4, 4), + /* 0010 */ V(4, 4, 4), + /* 0011 */ PTR(94, 1), + /* 0100 */ V(2, 6, 3), + /* 0101 */ V(2, 6, 3), + /* 0110 */ V(6, 2, 3), + /* 0111 */ V(6, 2, 3), + /* 1000 */ V(6, 1, 3), + /* 1001 */ V(6, 1, 3), + /* 1010 */ V(1, 6, 4), + /* 1011 */ V(6, 0, 4), + /* 1100 */ V(3, 5, 4), + /* 1101 */ V(5, 3, 4), + /* 1110 */ V(2, 5, 4), + /* 1111 */ V(5, 2, 4), + + /* 0010 ... */ + /* 0000 */ V(1, 5, 3), /* 48 */ + /* 0001 */ V(1, 5, 3), + /* 0010 */ V(5, 1, 3), + /* 0011 */ V(5, 1, 3), + /* 0100 */ V(3, 4, 3), + /* 0101 */ V(3, 4, 3), + /* 0110 */ V(4, 3, 3), + /* 0111 */ V(4, 3, 3), + /* 1000 */ V(5, 0, 4), + /* 1001 */ V(0, 4, 4), + /* 1010 */ V(2, 4, 3), + /* 1011 */ V(2, 4, 3), + /* 1100 */ V(4, 2, 3), + /* 1101 */ V(4, 2, 3), + /* 1110 */ V(1, 4, 3), + /* 1111 */ V(1, 4, 3), + + /* 0011 ... */ + /* 00 */ V(3, 3, 2), /* 64 */ + /* 01 */ V(4, 1, 2), + /* 10 */ V(2, 3, 2), + /* 11 */ V(3, 2, 2), + + /* 0100 ... */ + /* 000 */ V(4, 0, 3), /* 68 */ + /* 001 */ V(0, 3, 3), + /* 010 */ V(3, 0, 2), + /* 011 */ V(3, 0, 2), + /* 100 */ V(1, 3, 1), + /* 101 */ V(1, 3, 1), + /* 110 */ V(1, 3, 1), + /* 111 */ V(1, 3, 1), + + /* 0101 ... */ + /* 0 */ V(3, 1, 1), /* 76 */ + /* 1 */ V(2, 2, 1), + + /* 1000 ... */ + /* 0 */ V(0, 2, 1), /* 78 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 00 */ V(7, 7, 2), /* 80 */ + /* 01 */ V(6, 7, 2), + /* 10 */ V(7, 6, 1), + /* 11 */ V(7, 6, 1), + + /* 0000 0001 ... */ + /* 0 */ V(5, 7, 1), /* 84 */ + /* 1 */ V(7, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(6, 6, 1), /* 86 */ + /* 1 */ V(4, 7, 1), + + /* 0000 0011 ... */ + /* 0 */ V(7, 4, 1), /* 88 */ + /* 1 */ V(6, 5, 1), + + /* 0000 0110 ... */ + /* 0 */ V(7, 3, 1), /* 90 */ + /* 1 */ V(5, 5, 1), + + /* 0000 1101 ... */ + /* 0 */ V(0, 7, 1), /* 92 */ + /* 1 */ V(7, 0, 1), + + /* 0001 0011 ... */ + /* 0 */ V(0, 6, 1), /* 94 */ + /* 1 */ V(0, 5, 1) }; static union huffpair const hufftab13[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ V(1, 1, 4), - /* 0101 */ V(0, 1, 4), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(68, 4), /* 16 */ - /* 0001 */ PTR(84, 4), - /* 0010 */ PTR(100, 4), - /* 0011 */ PTR(116, 4), - /* 0100 */ PTR(132, 4), - /* 0101 */ PTR(148, 4), - /* 0110 */ PTR(164, 3), - /* 0111 */ PTR(172, 3), - /* 1000 */ PTR(180, 3), - /* 1001 */ PTR(188, 3), - /* 1010 */ PTR(196, 3), - /* 1011 */ PTR(204, 3), - /* 1100 */ PTR(212, 1), - /* 1101 */ PTR(214, 2), - /* 1110 */ PTR(218, 3), - /* 1111 */ PTR(226, 1), - - /* 0001 ... */ - /* 0000 */ PTR(228, 2), /* 32 */ - /* 0001 */ PTR(232, 2), - /* 0010 */ PTR(236, 2), - /* 0011 */ PTR(240, 2), - /* 0100 */ V(8, 1, 4), - /* 0101 */ PTR(244, 1), - /* 0110 */ PTR(246, 1), - /* 0111 */ PTR(248, 1), - /* 1000 */ PTR(250, 2), - /* 1001 */ PTR(254, 1), - /* 1010 */ V(1, 5, 4), - /* 1011 */ V(5, 1, 4), - /* 1100 */ PTR(256, 1), - /* 1101 */ PTR(258, 1), - /* 1110 */ PTR(260, 1), - /* 1111 */ V(1, 4, 4), - - /* 0010 ... */ - /* 0000 */ V(4, 1, 3), /* 48 */ - /* 0001 */ V(4, 1, 3), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 4), - /* 0101 */ V(3, 2, 4), - /* 0110 */ V(1, 3, 3), - /* 0111 */ V(1, 3, 3), - /* 1000 */ V(3, 1, 3), - /* 1001 */ V(3, 1, 3), - /* 1010 */ V(0, 3, 3), - /* 1011 */ V(0, 3, 3), - /* 1100 */ V(3, 0, 3), - /* 1101 */ V(3, 0, 3), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0011 ... */ - /* 00 */ V(1, 2, 2), /* 64 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 0000 */ PTR(262, 4), /* 68 */ - /* 0001 */ PTR(278, 4), - /* 0010 */ PTR(294, 4), - /* 0011 */ PTR(310, 3), - /* 0100 */ PTR(318, 2), - /* 0101 */ PTR(322, 2), - /* 0110 */ PTR(326, 3), - /* 0111 */ PTR(334, 2), - /* 1000 */ PTR(338, 1), - /* 1001 */ PTR(340, 2), - /* 1010 */ PTR(344, 2), - /* 1011 */ PTR(348, 2), - /* 1100 */ PTR(352, 2), - /* 1101 */ PTR(356, 2), - /* 1110 */ V(1, 15, 4), - /* 1111 */ V(15, 1, 4), - - /* 0000 0001 ... */ - /* 0000 */ V(15, 0, 4), /* 84 */ - /* 0001 */ PTR(360, 1), - /* 0010 */ PTR(362, 1), - /* 0011 */ PTR(364, 1), - /* 0100 */ V(14, 2, 4), - /* 0101 */ PTR(366, 1), - /* 0110 */ V(1, 14, 4), - /* 0111 */ V(14, 1, 4), - /* 1000 */ PTR(368, 1), - /* 1001 */ PTR(370, 1), - /* 1010 */ PTR(372, 1), - /* 1011 */ PTR(374, 1), - /* 1100 */ PTR(376, 1), - /* 1101 */ PTR(378, 1), - /* 1110 */ V(12, 6, 4), - /* 1111 */ V(3, 13, 4), - - /* 0000 0010 ... */ - /* 0000 */ PTR(380, 1), /* 100 */ - /* 0001 */ V(2, 13, 4), - /* 0010 */ V(13, 2, 4), - /* 0011 */ V(1, 13, 4), - /* 0100 */ V(11, 7, 4), - /* 0101 */ PTR(382, 1), - /* 0110 */ PTR(384, 1), - /* 0111 */ V(12, 3, 4), - /* 1000 */ PTR(386, 1), - /* 1001 */ V(4, 11, 4), - /* 1010 */ V(13, 1, 3), - /* 1011 */ V(13, 1, 3), - /* 1100 */ V(0, 13, 4), - /* 1101 */ V(13, 0, 4), - /* 1110 */ V(8, 10, 4), - /* 1111 */ V(10, 8, 4), - - /* 0000 0011 ... */ - /* 0000 */ V(4, 12, 4), /* 116 */ - /* 0001 */ V(12, 4, 4), - /* 0010 */ V(6, 11, 4), - /* 0011 */ V(11, 6, 4), - /* 0100 */ V(3, 12, 3), - /* 0101 */ V(3, 12, 3), - /* 0110 */ V(2, 12, 3), - /* 0111 */ V(2, 12, 3), - /* 1000 */ V(12, 2, 3), - /* 1001 */ V(12, 2, 3), - /* 1010 */ V(5, 11, 3), - /* 1011 */ V(5, 11, 3), - /* 1100 */ V(11, 5, 4), - /* 1101 */ V(8, 9, 4), - /* 1110 */ V(1, 12, 3), - /* 1111 */ V(1, 12, 3), - - /* 0000 0100 ... */ - /* 0000 */ V(12, 1, 3), /* 132 */ - /* 0001 */ V(12, 1, 3), - /* 0010 */ V(9, 8, 4), - /* 0011 */ V(0, 12, 4), - /* 0100 */ V(12, 0, 3), - /* 0101 */ V(12, 0, 3), - /* 0110 */ V(11, 4, 4), - /* 0111 */ V(6, 10, 4), - /* 1000 */ V(10, 6, 4), - /* 1001 */ V(7, 9, 4), - /* 1010 */ V(3, 11, 3), - /* 1011 */ V(3, 11, 3), - /* 1100 */ V(11, 3, 3), - /* 1101 */ V(11, 3, 3), - /* 1110 */ V(8, 8, 4), - /* 1111 */ V(5, 10, 4), - - /* 0000 0101 ... */ - /* 0000 */ V(2, 11, 3), /* 148 */ - /* 0001 */ V(2, 11, 3), - /* 0010 */ V(10, 5, 4), - /* 0011 */ V(6, 9, 4), - /* 0100 */ V(10, 4, 3), - /* 0101 */ V(10, 4, 3), - /* 0110 */ V(7, 8, 4), - /* 0111 */ V(8, 7, 4), - /* 1000 */ V(9, 4, 3), - /* 1001 */ V(9, 4, 3), - /* 1010 */ V(7, 7, 4), - /* 1011 */ V(7, 6, 4), - /* 1100 */ V(11, 2, 2), - /* 1101 */ V(11, 2, 2), - /* 1110 */ V(11, 2, 2), - /* 1111 */ V(11, 2, 2), - - /* 0000 0110 ... */ - /* 000 */ V(1, 11, 2), /* 164 */ - /* 001 */ V(1, 11, 2), - /* 010 */ V(11, 1, 2), - /* 011 */ V(11, 1, 2), - /* 100 */ V(0, 11, 3), - /* 101 */ V(11, 0, 3), - /* 110 */ V(9, 6, 3), - /* 111 */ V(4, 10, 3), - - /* 0000 0111 ... */ - /* 000 */ V(3, 10, 3), /* 172 */ - /* 001 */ V(10, 3, 3), - /* 010 */ V(5, 9, 3), - /* 011 */ V(9, 5, 3), - /* 100 */ V(2, 10, 2), - /* 101 */ V(2, 10, 2), - /* 110 */ V(10, 2, 2), - /* 111 */ V(10, 2, 2), - - /* 0000 1000 ... */ - /* 000 */ V(1, 10, 2), /* 180 */ - /* 001 */ V(1, 10, 2), - /* 010 */ V(10, 1, 2), - /* 011 */ V(10, 1, 2), - /* 100 */ V(0, 10, 3), - /* 101 */ V(6, 8, 3), - /* 110 */ V(10, 0, 2), - /* 111 */ V(10, 0, 2), - - /* 0000 1001 ... */ - /* 000 */ V(8, 6, 3), /* 188 */ - /* 001 */ V(4, 9, 3), - /* 010 */ V(9, 3, 2), - /* 011 */ V(9, 3, 2), - /* 100 */ V(3, 9, 3), - /* 101 */ V(5, 8, 3), - /* 110 */ V(8, 5, 3), - /* 111 */ V(6, 7, 3), - - /* 0000 1010 ... */ - /* 000 */ V(2, 9, 2), /* 196 */ - /* 001 */ V(2, 9, 2), - /* 010 */ V(9, 2, 2), - /* 011 */ V(9, 2, 2), - /* 100 */ V(5, 7, 3), - /* 101 */ V(7, 5, 3), - /* 110 */ V(3, 8, 2), - /* 111 */ V(3, 8, 2), - - /* 0000 1011 ... */ - /* 000 */ V(8, 3, 2), /* 204 */ - /* 001 */ V(8, 3, 2), - /* 010 */ V(6, 6, 3), - /* 011 */ V(4, 7, 3), - /* 100 */ V(7, 4, 3), - /* 101 */ V(5, 6, 3), - /* 110 */ V(6, 5, 3), - /* 111 */ V(7, 3, 3), - - /* 0000 1100 ... */ - /* 0 */ V(1, 9, 1), /* 212 */ - /* 1 */ V(9, 1, 1), - - /* 0000 1101 ... */ - /* 00 */ V(0, 9, 2), /* 214 */ - /* 01 */ V(9, 0, 2), - /* 10 */ V(4, 8, 2), - /* 11 */ V(8, 4, 2), - - /* 0000 1110 ... */ - /* 000 */ V(7, 2, 2), /* 218 */ - /* 001 */ V(7, 2, 2), - /* 010 */ V(4, 6, 3), - /* 011 */ V(6, 4, 3), - /* 100 */ V(2, 8, 1), - /* 101 */ V(2, 8, 1), - /* 110 */ V(2, 8, 1), - /* 111 */ V(2, 8, 1), - - /* 0000 1111 ... */ - /* 0 */ V(8, 2, 1), /* 226 */ - /* 1 */ V(1, 8, 1), - - /* 0001 0000 ... */ - /* 00 */ V(3, 7, 2), /* 228 */ - /* 01 */ V(2, 7, 2), - /* 10 */ V(1, 7, 1), - /* 11 */ V(1, 7, 1), - - /* 0001 0001 ... */ - /* 00 */ V(7, 1, 1), /* 232 */ - /* 01 */ V(7, 1, 1), - /* 10 */ V(5, 5, 2), - /* 11 */ V(0, 7, 2), - - /* 0001 0010 ... */ - /* 00 */ V(7, 0, 2), /* 236 */ - /* 01 */ V(3, 6, 2), - /* 10 */ V(6, 3, 2), - /* 11 */ V(4, 5, 2), - - /* 0001 0011 ... */ - /* 00 */ V(5, 4, 2), /* 240 */ - /* 01 */ V(2, 6, 2), - /* 10 */ V(6, 2, 2), - /* 11 */ V(3, 5, 2), - - /* 0001 0101 ... */ - /* 0 */ V(0, 8, 1), /* 244 */ - /* 1 */ V(8, 0, 1), - - /* 0001 0110 ... */ - /* 0 */ V(1, 6, 1), /* 246 */ - /* 1 */ V(6, 1, 1), - - /* 0001 0111 ... */ - /* 0 */ V(0, 6, 1), /* 248 */ - /* 1 */ V(6, 0, 1), - - /* 0001 1000 ... */ - /* 00 */ V(5, 3, 2), /* 250 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0001 1001 ... */ - /* 0 */ V(5, 2, 1), /* 254 */ - /* 1 */ V(0, 5, 1), - - /* 0001 1100 ... */ - /* 0 */ V(3, 4, 1), /* 256 */ - /* 1 */ V(4, 3, 1), - - /* 0001 1101 ... */ - /* 0 */ V(5, 0, 1), /* 258 */ - /* 1 */ V(2, 4, 1), - - /* 0001 1110 ... */ - /* 0 */ V(4, 2, 1), /* 260 */ - /* 1 */ V(3, 3, 1), - - /* 0000 0000 0000 ... */ - /* 0000 */ PTR(388, 3), /* 262 */ - /* 0001 */ V(15, 15, 4), - /* 0010 */ V(14, 15, 4), - /* 0011 */ V(13, 15, 4), - /* 0100 */ V(14, 14, 4), - /* 0101 */ V(12, 15, 4), - /* 0110 */ V(13, 14, 4), - /* 0111 */ V(11, 15, 4), - /* 1000 */ V(15, 11, 4), - /* 1001 */ V(12, 14, 4), - /* 1010 */ V(13, 12, 4), - /* 1011 */ PTR(396, 1), - /* 1100 */ V(14, 12, 3), - /* 1101 */ V(14, 12, 3), - /* 1110 */ V(13, 13, 3), - /* 1111 */ V(13, 13, 3), - - /* 0000 0000 0001 ... */ - /* 0000 */ V(15, 10, 4), /* 278 */ - /* 0001 */ V(12, 13, 4), - /* 0010 */ V(11, 14, 3), - /* 0011 */ V(11, 14, 3), - /* 0100 */ V(14, 11, 3), - /* 0101 */ V(14, 11, 3), - /* 0110 */ V(9, 15, 3), - /* 0111 */ V(9, 15, 3), - /* 1000 */ V(15, 9, 3), - /* 1001 */ V(15, 9, 3), - /* 1010 */ V(14, 10, 3), - /* 1011 */ V(14, 10, 3), - /* 1100 */ V(11, 13, 3), - /* 1101 */ V(11, 13, 3), - /* 1110 */ V(13, 11, 3), - /* 1111 */ V(13, 11, 3), - - /* 0000 0000 0010 ... */ - /* 0000 */ V(8, 15, 3), /* 294 */ - /* 0001 */ V(8, 15, 3), - /* 0010 */ V(15, 8, 3), - /* 0011 */ V(15, 8, 3), - /* 0100 */ V(12, 12, 3), - /* 0101 */ V(12, 12, 3), - /* 0110 */ V(10, 14, 4), - /* 0111 */ V(9, 14, 4), - /* 1000 */ V(8, 14, 3), - /* 1001 */ V(8, 14, 3), - /* 1010 */ V(7, 15, 4), - /* 1011 */ V(7, 14, 4), - /* 1100 */ V(15, 7, 2), - /* 1101 */ V(15, 7, 2), - /* 1110 */ V(15, 7, 2), - /* 1111 */ V(15, 7, 2), - - /* 0000 0000 0011 ... */ - /* 000 */ V(13, 10, 2), /* 310 */ - /* 001 */ V(13, 10, 2), - /* 010 */ V(10, 13, 3), - /* 011 */ V(11, 12, 3), - /* 100 */ V(12, 11, 3), - /* 101 */ V(15, 6, 3), - /* 110 */ V(6, 15, 2), - /* 111 */ V(6, 15, 2), - - /* 0000 0000 0100 ... */ - /* 00 */ V(14, 8, 2), /* 318 */ - /* 01 */ V(5, 15, 2), - /* 10 */ V(9, 13, 2), - /* 11 */ V(13, 9, 2), - - /* 0000 0000 0101 ... */ - /* 00 */ V(15, 5, 2), /* 322 */ - /* 01 */ V(14, 7, 2), - /* 10 */ V(10, 12, 2), - /* 11 */ V(11, 11, 2), - - /* 0000 0000 0110 ... */ - /* 000 */ V(4, 15, 2), /* 326 */ - /* 001 */ V(4, 15, 2), - /* 010 */ V(15, 4, 2), - /* 011 */ V(15, 4, 2), - /* 100 */ V(12, 10, 3), - /* 101 */ V(14, 6, 3), - /* 110 */ V(15, 3, 2), - /* 111 */ V(15, 3, 2), - - /* 0000 0000 0111 ... */ - /* 00 */ V(3, 15, 1), /* 334 */ - /* 01 */ V(3, 15, 1), - /* 10 */ V(8, 13, 2), - /* 11 */ V(13, 8, 2), - - /* 0000 0000 1000 ... */ - /* 0 */ V(2, 15, 1), /* 338 */ - /* 1 */ V(15, 2, 1), - - /* 0000 0000 1001 ... */ - /* 00 */ V(6, 14, 2), /* 340 */ - /* 01 */ V(9, 12, 2), - /* 10 */ V(0, 15, 1), - /* 11 */ V(0, 15, 1), - - /* 0000 0000 1010 ... */ - /* 00 */ V(12, 9, 2), /* 344 */ - /* 01 */ V(5, 14, 2), - /* 10 */ V(10, 11, 1), - /* 11 */ V(10, 11, 1), - - /* 0000 0000 1011 ... */ - /* 00 */ V(7, 13, 2), /* 348 */ - /* 01 */ V(13, 7, 2), - /* 10 */ V(4, 14, 1), - /* 11 */ V(4, 14, 1), - - /* 0000 0000 1100 ... */ - /* 00 */ V(12, 8, 2), /* 352 */ - /* 01 */ V(13, 6, 2), - /* 10 */ V(3, 14, 1), - /* 11 */ V(3, 14, 1), - - /* 0000 0000 1101 ... */ - /* 00 */ V(11, 9, 1), /* 356 */ - /* 01 */ V(11, 9, 1), - /* 10 */ V(9, 11, 2), - /* 11 */ V(10, 10, 2), - - /* 0000 0001 0001 ... */ - /* 0 */ V(11, 10, 1), /* 360 */ - /* 1 */ V(14, 5, 1), - - /* 0000 0001 0010 ... */ - /* 0 */ V(14, 4, 1), /* 362 */ - /* 1 */ V(8, 12, 1), - - /* 0000 0001 0011 ... */ - /* 0 */ V(6, 13, 1), /* 364 */ - /* 1 */ V(14, 3, 1), - - /* 0000 0001 0101 ... */ - /* 0 */ V(2, 14, 1), /* 366 */ - /* 1 */ V(0, 14, 1), - - /* 0000 0001 1000 ... */ - /* 0 */ V(14, 0, 1), /* 368 */ - /* 1 */ V(5, 13, 1), - - /* 0000 0001 1001 ... */ - /* 0 */ V(13, 5, 1), /* 370 */ - /* 1 */ V(7, 12, 1), - - /* 0000 0001 1010 ... */ - /* 0 */ V(12, 7, 1), /* 372 */ - /* 1 */ V(4, 13, 1), - - /* 0000 0001 1011 ... */ - /* 0 */ V(8, 11, 1), /* 374 */ - /* 1 */ V(11, 8, 1), - - /* 0000 0001 1100 ... */ - /* 0 */ V(13, 4, 1), /* 376 */ - /* 1 */ V(9, 10, 1), - - /* 0000 0001 1101 ... */ - /* 0 */ V(10, 9, 1), /* 378 */ - /* 1 */ V(6, 12, 1), - - /* 0000 0010 0000 ... */ - /* 0 */ V(13, 3, 1), /* 380 */ - /* 1 */ V(7, 11, 1), - - /* 0000 0010 0101 ... */ - /* 0 */ V(5, 12, 1), /* 382 */ - /* 1 */ V(12, 5, 1), - - /* 0000 0010 0110 ... */ - /* 0 */ V(9, 9, 1), /* 384 */ - /* 1 */ V(7, 10, 1), - - /* 0000 0010 1000 ... */ - /* 0 */ V(10, 7, 1), /* 386 */ - /* 1 */ V(9, 7, 1), - - /* 0000 0000 0000 0000 ... */ - /* 000 */ V(15, 14, 3), /* 388 */ - /* 001 */ V(15, 12, 3), - /* 010 */ V(15, 13, 2), - /* 011 */ V(15, 13, 2), - /* 100 */ V(14, 13, 1), - /* 101 */ V(14, 13, 1), - /* 110 */ V(14, 13, 1), - /* 111 */ V(14, 13, 1), - - /* 0000 0000 0000 1011 ... */ - /* 0 */ V(10, 15, 1), /* 396 */ - /* 1 */ V(14, 9, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ V(1, 1, 4), + /* 0101 */ V(0, 1, 4), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(68, 4), /* 16 */ + /* 0001 */ PTR(84, 4), + /* 0010 */ PTR(100, 4), + /* 0011 */ PTR(116, 4), + /* 0100 */ PTR(132, 4), + /* 0101 */ PTR(148, 4), + /* 0110 */ PTR(164, 3), + /* 0111 */ PTR(172, 3), + /* 1000 */ PTR(180, 3), + /* 1001 */ PTR(188, 3), + /* 1010 */ PTR(196, 3), + /* 1011 */ PTR(204, 3), + /* 1100 */ PTR(212, 1), + /* 1101 */ PTR(214, 2), + /* 1110 */ PTR(218, 3), + /* 1111 */ PTR(226, 1), + + /* 0001 ... */ + /* 0000 */ PTR(228, 2), /* 32 */ + /* 0001 */ PTR(232, 2), + /* 0010 */ PTR(236, 2), + /* 0011 */ PTR(240, 2), + /* 0100 */ V(8, 1, 4), + /* 0101 */ PTR(244, 1), + /* 0110 */ PTR(246, 1), + /* 0111 */ PTR(248, 1), + /* 1000 */ PTR(250, 2), + /* 1001 */ PTR(254, 1), + /* 1010 */ V(1, 5, 4), + /* 1011 */ V(5, 1, 4), + /* 1100 */ PTR(256, 1), + /* 1101 */ PTR(258, 1), + /* 1110 */ PTR(260, 1), + /* 1111 */ V(1, 4, 4), + + /* 0010 ... */ + /* 0000 */ V(4, 1, 3), /* 48 */ + /* 0001 */ V(4, 1, 3), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 4), + /* 0101 */ V(3, 2, 4), + /* 0110 */ V(1, 3, 3), + /* 0111 */ V(1, 3, 3), + /* 1000 */ V(3, 1, 3), + /* 1001 */ V(3, 1, 3), + /* 1010 */ V(0, 3, 3), + /* 1011 */ V(0, 3, 3), + /* 1100 */ V(3, 0, 3), + /* 1101 */ V(3, 0, 3), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0011 ... */ + /* 00 */ V(1, 2, 2), /* 64 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 0000 */ PTR(262, 4), /* 68 */ + /* 0001 */ PTR(278, 4), + /* 0010 */ PTR(294, 4), + /* 0011 */ PTR(310, 3), + /* 0100 */ PTR(318, 2), + /* 0101 */ PTR(322, 2), + /* 0110 */ PTR(326, 3), + /* 0111 */ PTR(334, 2), + /* 1000 */ PTR(338, 1), + /* 1001 */ PTR(340, 2), + /* 1010 */ PTR(344, 2), + /* 1011 */ PTR(348, 2), + /* 1100 */ PTR(352, 2), + /* 1101 */ PTR(356, 2), + /* 1110 */ V(1, 15, 4), + /* 1111 */ V(15, 1, 4), + + /* 0000 0001 ... */ + /* 0000 */ V(15, 0, 4), /* 84 */ + /* 0001 */ PTR(360, 1), + /* 0010 */ PTR(362, 1), + /* 0011 */ PTR(364, 1), + /* 0100 */ V(14, 2, 4), + /* 0101 */ PTR(366, 1), + /* 0110 */ V(1, 14, 4), + /* 0111 */ V(14, 1, 4), + /* 1000 */ PTR(368, 1), + /* 1001 */ PTR(370, 1), + /* 1010 */ PTR(372, 1), + /* 1011 */ PTR(374, 1), + /* 1100 */ PTR(376, 1), + /* 1101 */ PTR(378, 1), + /* 1110 */ V(12, 6, 4), + /* 1111 */ V(3, 13, 4), + + /* 0000 0010 ... */ + /* 0000 */ PTR(380, 1), /* 100 */ + /* 0001 */ V(2, 13, 4), + /* 0010 */ V(13, 2, 4), + /* 0011 */ V(1, 13, 4), + /* 0100 */ V(11, 7, 4), + /* 0101 */ PTR(382, 1), + /* 0110 */ PTR(384, 1), + /* 0111 */ V(12, 3, 4), + /* 1000 */ PTR(386, 1), + /* 1001 */ V(4, 11, 4), + /* 1010 */ V(13, 1, 3), + /* 1011 */ V(13, 1, 3), + /* 1100 */ V(0, 13, 4), + /* 1101 */ V(13, 0, 4), + /* 1110 */ V(8, 10, 4), + /* 1111 */ V(10, 8, 4), + + /* 0000 0011 ... */ + /* 0000 */ V(4, 12, 4), /* 116 */ + /* 0001 */ V(12, 4, 4), + /* 0010 */ V(6, 11, 4), + /* 0011 */ V(11, 6, 4), + /* 0100 */ V(3, 12, 3), + /* 0101 */ V(3, 12, 3), + /* 0110 */ V(2, 12, 3), + /* 0111 */ V(2, 12, 3), + /* 1000 */ V(12, 2, 3), + /* 1001 */ V(12, 2, 3), + /* 1010 */ V(5, 11, 3), + /* 1011 */ V(5, 11, 3), + /* 1100 */ V(11, 5, 4), + /* 1101 */ V(8, 9, 4), + /* 1110 */ V(1, 12, 3), + /* 1111 */ V(1, 12, 3), + + /* 0000 0100 ... */ + /* 0000 */ V(12, 1, 3), /* 132 */ + /* 0001 */ V(12, 1, 3), + /* 0010 */ V(9, 8, 4), + /* 0011 */ V(0, 12, 4), + /* 0100 */ V(12, 0, 3), + /* 0101 */ V(12, 0, 3), + /* 0110 */ V(11, 4, 4), + /* 0111 */ V(6, 10, 4), + /* 1000 */ V(10, 6, 4), + /* 1001 */ V(7, 9, 4), + /* 1010 */ V(3, 11, 3), + /* 1011 */ V(3, 11, 3), + /* 1100 */ V(11, 3, 3), + /* 1101 */ V(11, 3, 3), + /* 1110 */ V(8, 8, 4), + /* 1111 */ V(5, 10, 4), + + /* 0000 0101 ... */ + /* 0000 */ V(2, 11, 3), /* 148 */ + /* 0001 */ V(2, 11, 3), + /* 0010 */ V(10, 5, 4), + /* 0011 */ V(6, 9, 4), + /* 0100 */ V(10, 4, 3), + /* 0101 */ V(10, 4, 3), + /* 0110 */ V(7, 8, 4), + /* 0111 */ V(8, 7, 4), + /* 1000 */ V(9, 4, 3), + /* 1001 */ V(9, 4, 3), + /* 1010 */ V(7, 7, 4), + /* 1011 */ V(7, 6, 4), + /* 1100 */ V(11, 2, 2), + /* 1101 */ V(11, 2, 2), + /* 1110 */ V(11, 2, 2), + /* 1111 */ V(11, 2, 2), + + /* 0000 0110 ... */ + /* 000 */ V(1, 11, 2), /* 164 */ + /* 001 */ V(1, 11, 2), + /* 010 */ V(11, 1, 2), + /* 011 */ V(11, 1, 2), + /* 100 */ V(0, 11, 3), + /* 101 */ V(11, 0, 3), + /* 110 */ V(9, 6, 3), + /* 111 */ V(4, 10, 3), + + /* 0000 0111 ... */ + /* 000 */ V(3, 10, 3), /* 172 */ + /* 001 */ V(10, 3, 3), + /* 010 */ V(5, 9, 3), + /* 011 */ V(9, 5, 3), + /* 100 */ V(2, 10, 2), + /* 101 */ V(2, 10, 2), + /* 110 */ V(10, 2, 2), + /* 111 */ V(10, 2, 2), + + /* 0000 1000 ... */ + /* 000 */ V(1, 10, 2), /* 180 */ + /* 001 */ V(1, 10, 2), + /* 010 */ V(10, 1, 2), + /* 011 */ V(10, 1, 2), + /* 100 */ V(0, 10, 3), + /* 101 */ V(6, 8, 3), + /* 110 */ V(10, 0, 2), + /* 111 */ V(10, 0, 2), + + /* 0000 1001 ... */ + /* 000 */ V(8, 6, 3), /* 188 */ + /* 001 */ V(4, 9, 3), + /* 010 */ V(9, 3, 2), + /* 011 */ V(9, 3, 2), + /* 100 */ V(3, 9, 3), + /* 101 */ V(5, 8, 3), + /* 110 */ V(8, 5, 3), + /* 111 */ V(6, 7, 3), + + /* 0000 1010 ... */ + /* 000 */ V(2, 9, 2), /* 196 */ + /* 001 */ V(2, 9, 2), + /* 010 */ V(9, 2, 2), + /* 011 */ V(9, 2, 2), + /* 100 */ V(5, 7, 3), + /* 101 */ V(7, 5, 3), + /* 110 */ V(3, 8, 2), + /* 111 */ V(3, 8, 2), + + /* 0000 1011 ... */ + /* 000 */ V(8, 3, 2), /* 204 */ + /* 001 */ V(8, 3, 2), + /* 010 */ V(6, 6, 3), + /* 011 */ V(4, 7, 3), + /* 100 */ V(7, 4, 3), + /* 101 */ V(5, 6, 3), + /* 110 */ V(6, 5, 3), + /* 111 */ V(7, 3, 3), + + /* 0000 1100 ... */ + /* 0 */ V(1, 9, 1), /* 212 */ + /* 1 */ V(9, 1, 1), + + /* 0000 1101 ... */ + /* 00 */ V(0, 9, 2), /* 214 */ + /* 01 */ V(9, 0, 2), + /* 10 */ V(4, 8, 2), + /* 11 */ V(8, 4, 2), + + /* 0000 1110 ... */ + /* 000 */ V(7, 2, 2), /* 218 */ + /* 001 */ V(7, 2, 2), + /* 010 */ V(4, 6, 3), + /* 011 */ V(6, 4, 3), + /* 100 */ V(2, 8, 1), + /* 101 */ V(2, 8, 1), + /* 110 */ V(2, 8, 1), + /* 111 */ V(2, 8, 1), + + /* 0000 1111 ... */ + /* 0 */ V(8, 2, 1), /* 226 */ + /* 1 */ V(1, 8, 1), + + /* 0001 0000 ... */ + /* 00 */ V(3, 7, 2), /* 228 */ + /* 01 */ V(2, 7, 2), + /* 10 */ V(1, 7, 1), + /* 11 */ V(1, 7, 1), + + /* 0001 0001 ... */ + /* 00 */ V(7, 1, 1), /* 232 */ + /* 01 */ V(7, 1, 1), + /* 10 */ V(5, 5, 2), + /* 11 */ V(0, 7, 2), + + /* 0001 0010 ... */ + /* 00 */ V(7, 0, 2), /* 236 */ + /* 01 */ V(3, 6, 2), + /* 10 */ V(6, 3, 2), + /* 11 */ V(4, 5, 2), + + /* 0001 0011 ... */ + /* 00 */ V(5, 4, 2), /* 240 */ + /* 01 */ V(2, 6, 2), + /* 10 */ V(6, 2, 2), + /* 11 */ V(3, 5, 2), + + /* 0001 0101 ... */ + /* 0 */ V(0, 8, 1), /* 244 */ + /* 1 */ V(8, 0, 1), + + /* 0001 0110 ... */ + /* 0 */ V(1, 6, 1), /* 246 */ + /* 1 */ V(6, 1, 1), + + /* 0001 0111 ... */ + /* 0 */ V(0, 6, 1), /* 248 */ + /* 1 */ V(6, 0, 1), + + /* 0001 1000 ... */ + /* 00 */ V(5, 3, 2), /* 250 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0001 1001 ... */ + /* 0 */ V(5, 2, 1), /* 254 */ + /* 1 */ V(0, 5, 1), + + /* 0001 1100 ... */ + /* 0 */ V(3, 4, 1), /* 256 */ + /* 1 */ V(4, 3, 1), + + /* 0001 1101 ... */ + /* 0 */ V(5, 0, 1), /* 258 */ + /* 1 */ V(2, 4, 1), + + /* 0001 1110 ... */ + /* 0 */ V(4, 2, 1), /* 260 */ + /* 1 */ V(3, 3, 1), + + /* 0000 0000 0000 ... */ + /* 0000 */ PTR(388, 3), /* 262 */ + /* 0001 */ V(15, 15, 4), + /* 0010 */ V(14, 15, 4), + /* 0011 */ V(13, 15, 4), + /* 0100 */ V(14, 14, 4), + /* 0101 */ V(12, 15, 4), + /* 0110 */ V(13, 14, 4), + /* 0111 */ V(11, 15, 4), + /* 1000 */ V(15, 11, 4), + /* 1001 */ V(12, 14, 4), + /* 1010 */ V(13, 12, 4), + /* 1011 */ PTR(396, 1), + /* 1100 */ V(14, 12, 3), + /* 1101 */ V(14, 12, 3), + /* 1110 */ V(13, 13, 3), + /* 1111 */ V(13, 13, 3), + + /* 0000 0000 0001 ... */ + /* 0000 */ V(15, 10, 4), /* 278 */ + /* 0001 */ V(12, 13, 4), + /* 0010 */ V(11, 14, 3), + /* 0011 */ V(11, 14, 3), + /* 0100 */ V(14, 11, 3), + /* 0101 */ V(14, 11, 3), + /* 0110 */ V(9, 15, 3), + /* 0111 */ V(9, 15, 3), + /* 1000 */ V(15, 9, 3), + /* 1001 */ V(15, 9, 3), + /* 1010 */ V(14, 10, 3), + /* 1011 */ V(14, 10, 3), + /* 1100 */ V(11, 13, 3), + /* 1101 */ V(11, 13, 3), + /* 1110 */ V(13, 11, 3), + /* 1111 */ V(13, 11, 3), + + /* 0000 0000 0010 ... */ + /* 0000 */ V(8, 15, 3), /* 294 */ + /* 0001 */ V(8, 15, 3), + /* 0010 */ V(15, 8, 3), + /* 0011 */ V(15, 8, 3), + /* 0100 */ V(12, 12, 3), + /* 0101 */ V(12, 12, 3), + /* 0110 */ V(10, 14, 4), + /* 0111 */ V(9, 14, 4), + /* 1000 */ V(8, 14, 3), + /* 1001 */ V(8, 14, 3), + /* 1010 */ V(7, 15, 4), + /* 1011 */ V(7, 14, 4), + /* 1100 */ V(15, 7, 2), + /* 1101 */ V(15, 7, 2), + /* 1110 */ V(15, 7, 2), + /* 1111 */ V(15, 7, 2), + + /* 0000 0000 0011 ... */ + /* 000 */ V(13, 10, 2), /* 310 */ + /* 001 */ V(13, 10, 2), + /* 010 */ V(10, 13, 3), + /* 011 */ V(11, 12, 3), + /* 100 */ V(12, 11, 3), + /* 101 */ V(15, 6, 3), + /* 110 */ V(6, 15, 2), + /* 111 */ V(6, 15, 2), + + /* 0000 0000 0100 ... */ + /* 00 */ V(14, 8, 2), /* 318 */ + /* 01 */ V(5, 15, 2), + /* 10 */ V(9, 13, 2), + /* 11 */ V(13, 9, 2), + + /* 0000 0000 0101 ... */ + /* 00 */ V(15, 5, 2), /* 322 */ + /* 01 */ V(14, 7, 2), + /* 10 */ V(10, 12, 2), + /* 11 */ V(11, 11, 2), + + /* 0000 0000 0110 ... */ + /* 000 */ V(4, 15, 2), /* 326 */ + /* 001 */ V(4, 15, 2), + /* 010 */ V(15, 4, 2), + /* 011 */ V(15, 4, 2), + /* 100 */ V(12, 10, 3), + /* 101 */ V(14, 6, 3), + /* 110 */ V(15, 3, 2), + /* 111 */ V(15, 3, 2), + + /* 0000 0000 0111 ... */ + /* 00 */ V(3, 15, 1), /* 334 */ + /* 01 */ V(3, 15, 1), + /* 10 */ V(8, 13, 2), + /* 11 */ V(13, 8, 2), + + /* 0000 0000 1000 ... */ + /* 0 */ V(2, 15, 1), /* 338 */ + /* 1 */ V(15, 2, 1), + + /* 0000 0000 1001 ... */ + /* 00 */ V(6, 14, 2), /* 340 */ + /* 01 */ V(9, 12, 2), + /* 10 */ V(0, 15, 1), + /* 11 */ V(0, 15, 1), + + /* 0000 0000 1010 ... */ + /* 00 */ V(12, 9, 2), /* 344 */ + /* 01 */ V(5, 14, 2), + /* 10 */ V(10, 11, 1), + /* 11 */ V(10, 11, 1), + + /* 0000 0000 1011 ... */ + /* 00 */ V(7, 13, 2), /* 348 */ + /* 01 */ V(13, 7, 2), + /* 10 */ V(4, 14, 1), + /* 11 */ V(4, 14, 1), + + /* 0000 0000 1100 ... */ + /* 00 */ V(12, 8, 2), /* 352 */ + /* 01 */ V(13, 6, 2), + /* 10 */ V(3, 14, 1), + /* 11 */ V(3, 14, 1), + + /* 0000 0000 1101 ... */ + /* 00 */ V(11, 9, 1), /* 356 */ + /* 01 */ V(11, 9, 1), + /* 10 */ V(9, 11, 2), + /* 11 */ V(10, 10, 2), + + /* 0000 0001 0001 ... */ + /* 0 */ V(11, 10, 1), /* 360 */ + /* 1 */ V(14, 5, 1), + + /* 0000 0001 0010 ... */ + /* 0 */ V(14, 4, 1), /* 362 */ + /* 1 */ V(8, 12, 1), + + /* 0000 0001 0011 ... */ + /* 0 */ V(6, 13, 1), /* 364 */ + /* 1 */ V(14, 3, 1), + + /* 0000 0001 0101 ... */ + /* 0 */ V(2, 14, 1), /* 366 */ + /* 1 */ V(0, 14, 1), + + /* 0000 0001 1000 ... */ + /* 0 */ V(14, 0, 1), /* 368 */ + /* 1 */ V(5, 13, 1), + + /* 0000 0001 1001 ... */ + /* 0 */ V(13, 5, 1), /* 370 */ + /* 1 */ V(7, 12, 1), + + /* 0000 0001 1010 ... */ + /* 0 */ V(12, 7, 1), /* 372 */ + /* 1 */ V(4, 13, 1), + + /* 0000 0001 1011 ... */ + /* 0 */ V(8, 11, 1), /* 374 */ + /* 1 */ V(11, 8, 1), + + /* 0000 0001 1100 ... */ + /* 0 */ V(13, 4, 1), /* 376 */ + /* 1 */ V(9, 10, 1), + + /* 0000 0001 1101 ... */ + /* 0 */ V(10, 9, 1), /* 378 */ + /* 1 */ V(6, 12, 1), + + /* 0000 0010 0000 ... */ + /* 0 */ V(13, 3, 1), /* 380 */ + /* 1 */ V(7, 11, 1), + + /* 0000 0010 0101 ... */ + /* 0 */ V(5, 12, 1), /* 382 */ + /* 1 */ V(12, 5, 1), + + /* 0000 0010 0110 ... */ + /* 0 */ V(9, 9, 1), /* 384 */ + /* 1 */ V(7, 10, 1), + + /* 0000 0010 1000 ... */ + /* 0 */ V(10, 7, 1), /* 386 */ + /* 1 */ V(9, 7, 1), + + /* 0000 0000 0000 0000 ... */ + /* 000 */ V(15, 14, 3), /* 388 */ + /* 001 */ V(15, 12, 3), + /* 010 */ V(15, 13, 2), + /* 011 */ V(15, 13, 2), + /* 100 */ V(14, 13, 1), + /* 101 */ V(14, 13, 1), + /* 110 */ V(14, 13, 1), + /* 111 */ V(14, 13, 1), + + /* 0000 0000 0000 1011 ... */ + /* 0 */ V(10, 15, 1), /* 396 */ + /* 1 */ V(14, 9, 1) }; static union huffpair const hufftab15[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 4), - /* 0100 */ PTR(80, 4), - /* 0101 */ PTR(96, 3), - /* 0110 */ PTR(104, 3), - /* 0111 */ PTR(112, 2), - /* 1000 */ PTR(116, 1), - /* 1001 */ PTR(118, 1), - /* 1010 */ V(1, 1, 3), - /* 1011 */ V(1, 1, 3), - /* 1100 */ V(0, 1, 4), - /* 1101 */ V(1, 0, 4), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(120, 4), /* 16 */ - /* 0001 */ PTR(136, 4), - /* 0010 */ PTR(152, 4), - /* 0011 */ PTR(168, 4), - /* 0100 */ PTR(184, 4), - /* 0101 */ PTR(200, 3), - /* 0110 */ PTR(208, 3), - /* 0111 */ PTR(216, 4), - /* 1000 */ PTR(232, 3), - /* 1001 */ PTR(240, 3), - /* 1010 */ PTR(248, 3), - /* 1011 */ PTR(256, 3), - /* 1100 */ PTR(264, 2), - /* 1101 */ PTR(268, 3), - /* 1110 */ PTR(276, 3), - /* 1111 */ PTR(284, 2), - - /* 0001 ... */ - /* 0000 */ PTR(288, 2), /* 32 */ - /* 0001 */ PTR(292, 2), - /* 0010 */ PTR(296, 2), - /* 0011 */ PTR(300, 2), - /* 0100 */ PTR(304, 2), - /* 0101 */ PTR(308, 2), - /* 0110 */ PTR(312, 2), - /* 0111 */ PTR(316, 2), - /* 1000 */ PTR(320, 1), - /* 1001 */ PTR(322, 1), - /* 1010 */ PTR(324, 1), - /* 1011 */ PTR(326, 2), - /* 1100 */ PTR(330, 1), - /* 1101 */ PTR(332, 1), - /* 1110 */ PTR(334, 2), - /* 1111 */ PTR(338, 1), - - /* 0010 ... */ - /* 0000 */ PTR(340, 1), /* 48 */ - /* 0001 */ PTR(342, 1), - /* 0010 */ V(9, 1, 4), - /* 0011 */ PTR(344, 1), - /* 0100 */ PTR(346, 1), - /* 0101 */ PTR(348, 1), - /* 0110 */ PTR(350, 1), - /* 0111 */ PTR(352, 1), - /* 1000 */ V(2, 8, 4), - /* 1001 */ V(8, 2, 4), - /* 1010 */ V(1, 8, 4), - /* 1011 */ V(8, 1, 4), - /* 1100 */ PTR(354, 1), - /* 1101 */ PTR(356, 1), - /* 1110 */ PTR(358, 1), - /* 1111 */ PTR(360, 1), - - /* 0011 ... */ - /* 0000 */ V(2, 7, 4), /* 64 */ - /* 0001 */ V(7, 2, 4), - /* 0010 */ V(6, 4, 4), - /* 0011 */ V(1, 7, 4), - /* 0100 */ V(5, 5, 4), - /* 0101 */ V(7, 1, 4), - /* 0110 */ PTR(362, 1), - /* 0111 */ V(3, 6, 4), - /* 1000 */ V(6, 3, 4), - /* 1001 */ V(4, 5, 4), - /* 1010 */ V(5, 4, 4), - /* 1011 */ V(2, 6, 4), - /* 1100 */ V(6, 2, 4), - /* 1101 */ V(1, 6, 4), - /* 1110 */ PTR(364, 1), - /* 1111 */ V(3, 5, 4), - - /* 0100 ... */ - /* 0000 */ V(6, 1, 3), /* 80 */ - /* 0001 */ V(6, 1, 3), - /* 0010 */ V(5, 3, 4), - /* 0011 */ V(4, 4, 4), - /* 0100 */ V(2, 5, 3), - /* 0101 */ V(2, 5, 3), - /* 0110 */ V(5, 2, 3), - /* 0111 */ V(5, 2, 3), - /* 1000 */ V(1, 5, 3), - /* 1001 */ V(1, 5, 3), - /* 1010 */ V(5, 1, 3), - /* 1011 */ V(5, 1, 3), - /* 1100 */ V(0, 5, 4), - /* 1101 */ V(5, 0, 4), - /* 1110 */ V(3, 4, 3), - /* 1111 */ V(3, 4, 3), - - /* 0101 ... */ - /* 000 */ V(4, 3, 3), /* 96 */ - /* 001 */ V(2, 4, 3), - /* 010 */ V(4, 2, 3), - /* 011 */ V(3, 3, 3), - /* 100 */ V(4, 1, 2), - /* 101 */ V(4, 1, 2), - /* 110 */ V(1, 4, 3), - /* 111 */ V(0, 4, 3), - - /* 0110 ... */ - /* 000 */ V(2, 3, 2), /* 104 */ - /* 001 */ V(2, 3, 2), - /* 010 */ V(3, 2, 2), - /* 011 */ V(3, 2, 2), - /* 100 */ V(4, 0, 3), - /* 101 */ V(0, 3, 3), - /* 110 */ V(1, 3, 2), - /* 111 */ V(1, 3, 2), - - /* 0111 ... */ - /* 00 */ V(3, 1, 2), /* 112 */ - /* 01 */ V(3, 0, 2), - /* 10 */ V(2, 2, 1), - /* 11 */ V(2, 2, 1), - - /* 1000 ... */ - /* 0 */ V(1, 2, 1), /* 116 */ - /* 1 */ V(2, 1, 1), - - /* 1001 ... */ - /* 0 */ V(0, 2, 1), /* 118 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 0000 */ PTR(366, 1), /* 120 */ - /* 0001 */ PTR(368, 1), - /* 0010 */ V(14, 14, 4), - /* 0011 */ PTR(370, 1), - /* 0100 */ PTR(372, 1), - /* 0101 */ PTR(374, 1), - /* 0110 */ V(15, 11, 4), - /* 0111 */ PTR(376, 1), - /* 1000 */ V(13, 13, 4), - /* 1001 */ V(10, 15, 4), - /* 1010 */ V(15, 10, 4), - /* 1011 */ V(11, 14, 4), - /* 1100 */ V(14, 11, 4), - /* 1101 */ V(12, 13, 4), - /* 1110 */ V(13, 12, 4), - /* 1111 */ V(9, 15, 4), - - /* 0000 0001 ... */ - /* 0000 */ V(15, 9, 4), /* 136 */ - /* 0001 */ V(14, 10, 4), - /* 0010 */ V(11, 13, 4), - /* 0011 */ V(13, 11, 4), - /* 0100 */ V(8, 15, 4), - /* 0101 */ V(15, 8, 4), - /* 0110 */ V(12, 12, 4), - /* 0111 */ V(9, 14, 4), - /* 1000 */ V(14, 9, 4), - /* 1001 */ V(7, 15, 4), - /* 1010 */ V(15, 7, 4), - /* 1011 */ V(10, 13, 4), - /* 1100 */ V(13, 10, 4), - /* 1101 */ V(11, 12, 4), - /* 1110 */ V(6, 15, 4), - /* 1111 */ PTR(378, 1), - - /* 0000 0010 ... */ - /* 0000 */ V(12, 11, 3), /* 152 */ - /* 0001 */ V(12, 11, 3), - /* 0010 */ V(15, 6, 3), - /* 0011 */ V(15, 6, 3), - /* 0100 */ V(8, 14, 4), - /* 0101 */ V(14, 8, 4), - /* 0110 */ V(5, 15, 4), - /* 0111 */ V(9, 13, 4), - /* 1000 */ V(15, 5, 3), - /* 1001 */ V(15, 5, 3), - /* 1010 */ V(7, 14, 3), - /* 1011 */ V(7, 14, 3), - /* 1100 */ V(14, 7, 3), - /* 1101 */ V(14, 7, 3), - /* 1110 */ V(10, 12, 3), - /* 1111 */ V(10, 12, 3), - - /* 0000 0011 ... */ - /* 0000 */ V(12, 10, 3), /* 168 */ - /* 0001 */ V(12, 10, 3), - /* 0010 */ V(11, 11, 3), - /* 0011 */ V(11, 11, 3), - /* 0100 */ V(13, 9, 4), - /* 0101 */ V(8, 13, 4), - /* 0110 */ V(4, 15, 3), - /* 0111 */ V(4, 15, 3), - /* 1000 */ V(15, 4, 3), - /* 1001 */ V(15, 4, 3), - /* 1010 */ V(3, 15, 3), - /* 1011 */ V(3, 15, 3), - /* 1100 */ V(15, 3, 3), - /* 1101 */ V(15, 3, 3), - /* 1110 */ V(13, 8, 3), - /* 1111 */ V(13, 8, 3), - - /* 0000 0100 ... */ - /* 0000 */ V(14, 6, 3), /* 184 */ - /* 0001 */ V(14, 6, 3), - /* 0010 */ V(2, 15, 3), - /* 0011 */ V(2, 15, 3), - /* 0100 */ V(15, 2, 3), - /* 0101 */ V(15, 2, 3), - /* 0110 */ V(6, 14, 4), - /* 0111 */ V(15, 0, 4), - /* 1000 */ V(1, 15, 3), - /* 1001 */ V(1, 15, 3), - /* 1010 */ V(15, 1, 3), - /* 1011 */ V(15, 1, 3), - /* 1100 */ V(9, 12, 3), - /* 1101 */ V(9, 12, 3), - /* 1110 */ V(12, 9, 3), - /* 1111 */ V(12, 9, 3), - - /* 0000 0101 ... */ - /* 000 */ V(5, 14, 3), /* 200 */ - /* 001 */ V(10, 11, 3), - /* 010 */ V(11, 10, 3), - /* 011 */ V(14, 5, 3), - /* 100 */ V(7, 13, 3), - /* 101 */ V(13, 7, 3), - /* 110 */ V(4, 14, 3), - /* 111 */ V(14, 4, 3), - - /* 0000 0110 ... */ - /* 000 */ V(8, 12, 3), /* 208 */ - /* 001 */ V(12, 8, 3), - /* 010 */ V(3, 14, 3), - /* 011 */ V(6, 13, 3), - /* 100 */ V(13, 6, 3), - /* 101 */ V(14, 3, 3), - /* 110 */ V(9, 11, 3), - /* 111 */ V(11, 9, 3), - - /* 0000 0111 ... */ - /* 0000 */ V(2, 14, 3), /* 216 */ - /* 0001 */ V(2, 14, 3), - /* 0010 */ V(10, 10, 3), - /* 0011 */ V(10, 10, 3), - /* 0100 */ V(14, 2, 3), - /* 0101 */ V(14, 2, 3), - /* 0110 */ V(1, 14, 3), - /* 0111 */ V(1, 14, 3), - /* 1000 */ V(14, 1, 3), - /* 1001 */ V(14, 1, 3), - /* 1010 */ V(0, 14, 4), - /* 1011 */ V(14, 0, 4), - /* 1100 */ V(5, 13, 3), - /* 1101 */ V(5, 13, 3), - /* 1110 */ V(13, 5, 3), - /* 1111 */ V(13, 5, 3), - - /* 0000 1000 ... */ - /* 000 */ V(7, 12, 3), /* 232 */ - /* 001 */ V(12, 7, 3), - /* 010 */ V(4, 13, 3), - /* 011 */ V(8, 11, 3), - /* 100 */ V(13, 4, 2), - /* 101 */ V(13, 4, 2), - /* 110 */ V(11, 8, 3), - /* 111 */ V(9, 10, 3), - - /* 0000 1001 ... */ - /* 000 */ V(10, 9, 3), /* 240 */ - /* 001 */ V(6, 12, 3), - /* 010 */ V(12, 6, 3), - /* 011 */ V(3, 13, 3), - /* 100 */ V(13, 3, 2), - /* 101 */ V(13, 3, 2), - /* 110 */ V(13, 2, 2), - /* 111 */ V(13, 2, 2), - - /* 0000 1010 ... */ - /* 000 */ V(2, 13, 3), /* 248 */ - /* 001 */ V(0, 13, 3), - /* 010 */ V(1, 13, 2), - /* 011 */ V(1, 13, 2), - /* 100 */ V(7, 11, 2), - /* 101 */ V(7, 11, 2), - /* 110 */ V(11, 7, 2), - /* 111 */ V(11, 7, 2), - - /* 0000 1011 ... */ - /* 000 */ V(13, 1, 2), /* 256 */ - /* 001 */ V(13, 1, 2), - /* 010 */ V(5, 12, 3), - /* 011 */ V(13, 0, 3), - /* 100 */ V(12, 5, 2), - /* 101 */ V(12, 5, 2), - /* 110 */ V(8, 10, 2), - /* 111 */ V(8, 10, 2), - - /* 0000 1100 ... */ - /* 00 */ V(10, 8, 2), /* 264 */ - /* 01 */ V(4, 12, 2), - /* 10 */ V(12, 4, 2), - /* 11 */ V(6, 11, 2), - - /* 0000 1101 ... */ - /* 000 */ V(11, 6, 2), /* 268 */ - /* 001 */ V(11, 6, 2), - /* 010 */ V(9, 9, 3), - /* 011 */ V(0, 12, 3), - /* 100 */ V(3, 12, 2), - /* 101 */ V(3, 12, 2), - /* 110 */ V(12, 3, 2), - /* 111 */ V(12, 3, 2), - - /* 0000 1110 ... */ - /* 000 */ V(7, 10, 2), /* 276 */ - /* 001 */ V(7, 10, 2), - /* 010 */ V(10, 7, 2), - /* 011 */ V(10, 7, 2), - /* 100 */ V(10, 6, 2), - /* 101 */ V(10, 6, 2), - /* 110 */ V(12, 0, 3), - /* 111 */ V(0, 11, 3), - - /* 0000 1111 ... */ - /* 00 */ V(12, 2, 1), /* 284 */ - /* 01 */ V(12, 2, 1), - /* 10 */ V(2, 12, 2), - /* 11 */ V(5, 11, 2), - - /* 0001 0000 ... */ - /* 00 */ V(11, 5, 2), /* 288 */ - /* 01 */ V(1, 12, 2), - /* 10 */ V(8, 9, 2), - /* 11 */ V(9, 8, 2), - - /* 0001 0001 ... */ - /* 00 */ V(12, 1, 2), /* 292 */ - /* 01 */ V(4, 11, 2), - /* 10 */ V(11, 4, 2), - /* 11 */ V(6, 10, 2), - - /* 0001 0010 ... */ - /* 00 */ V(3, 11, 2), /* 296 */ - /* 01 */ V(7, 9, 2), - /* 10 */ V(11, 3, 1), - /* 11 */ V(11, 3, 1), - - /* 0001 0011 ... */ - /* 00 */ V(9, 7, 2), /* 300 */ - /* 01 */ V(8, 8, 2), - /* 10 */ V(2, 11, 2), - /* 11 */ V(5, 10, 2), - - /* 0001 0100 ... */ - /* 00 */ V(11, 2, 1), /* 304 */ - /* 01 */ V(11, 2, 1), - /* 10 */ V(10, 5, 2), - /* 11 */ V(1, 11, 2), - - /* 0001 0101 ... */ - /* 00 */ V(11, 1, 1), /* 308 */ - /* 01 */ V(11, 1, 1), - /* 10 */ V(11, 0, 2), - /* 11 */ V(6, 9, 2), - - /* 0001 0110 ... */ - /* 00 */ V(9, 6, 2), /* 312 */ - /* 01 */ V(4, 10, 2), - /* 10 */ V(10, 4, 2), - /* 11 */ V(7, 8, 2), - - /* 0001 0111 ... */ - /* 00 */ V(8, 7, 2), /* 316 */ - /* 01 */ V(3, 10, 2), - /* 10 */ V(10, 3, 1), - /* 11 */ V(10, 3, 1), - - /* 0001 1000 ... */ - /* 0 */ V(5, 9, 1), /* 320 */ - /* 1 */ V(9, 5, 1), - - /* 0001 1001 ... */ - /* 0 */ V(2, 10, 1), /* 322 */ - /* 1 */ V(10, 2, 1), - - /* 0001 1010 ... */ - /* 0 */ V(1, 10, 1), /* 324 */ - /* 1 */ V(10, 1, 1), - - /* 0001 1011 ... */ - /* 00 */ V(0, 10, 2), /* 326 */ - /* 01 */ V(10, 0, 2), - /* 10 */ V(6, 8, 1), - /* 11 */ V(6, 8, 1), - - /* 0001 1100 ... */ - /* 0 */ V(8, 6, 1), /* 330 */ - /* 1 */ V(4, 9, 1), - - /* 0001 1101 ... */ - /* 0 */ V(9, 4, 1), /* 332 */ - /* 1 */ V(3, 9, 1), - - /* 0001 1110 ... */ - /* 00 */ V(9, 3, 1), /* 334 */ - /* 01 */ V(9, 3, 1), - /* 10 */ V(7, 7, 2), - /* 11 */ V(0, 9, 2), - - /* 0001 1111 ... */ - /* 0 */ V(5, 8, 1), /* 338 */ - /* 1 */ V(8, 5, 1), - - /* 0010 0000 ... */ - /* 0 */ V(2, 9, 1), /* 340 */ - /* 1 */ V(6, 7, 1), - - /* 0010 0001 ... */ - /* 0 */ V(7, 6, 1), /* 342 */ - /* 1 */ V(9, 2, 1), - - /* 0010 0011 ... */ - /* 0 */ V(1, 9, 1), /* 344 */ - /* 1 */ V(9, 0, 1), - - /* 0010 0100 ... */ - /* 0 */ V(4, 8, 1), /* 346 */ - /* 1 */ V(8, 4, 1), - - /* 0010 0101 ... */ - /* 0 */ V(5, 7, 1), /* 348 */ - /* 1 */ V(7, 5, 1), - - /* 0010 0110 ... */ - /* 0 */ V(3, 8, 1), /* 350 */ - /* 1 */ V(8, 3, 1), - - /* 0010 0111 ... */ - /* 0 */ V(6, 6, 1), /* 352 */ - /* 1 */ V(4, 7, 1), - - /* 0010 1100 ... */ - /* 0 */ V(7, 4, 1), /* 354 */ - /* 1 */ V(0, 8, 1), - - /* 0010 1101 ... */ - /* 0 */ V(8, 0, 1), /* 356 */ - /* 1 */ V(5, 6, 1), - - /* 0010 1110 ... */ - /* 0 */ V(6, 5, 1), /* 358 */ - /* 1 */ V(3, 7, 1), - - /* 0010 1111 ... */ - /* 0 */ V(7, 3, 1), /* 360 */ - /* 1 */ V(4, 6, 1), - - /* 0011 0110 ... */ - /* 0 */ V(0, 7, 1), /* 362 */ - /* 1 */ V(7, 0, 1), - - /* 0011 1110 ... */ - /* 0 */ V(0, 6, 1), /* 364 */ - /* 1 */ V(6, 0, 1), - - /* 0000 0000 0000 ... */ - /* 0 */ V(15, 15, 1), /* 366 */ - /* 1 */ V(14, 15, 1), - - /* 0000 0000 0001 ... */ - /* 0 */ V(15, 14, 1), /* 368 */ - /* 1 */ V(13, 15, 1), - - /* 0000 0000 0011 ... */ - /* 0 */ V(15, 13, 1), /* 370 */ - /* 1 */ V(12, 15, 1), - - /* 0000 0000 0100 ... */ - /* 0 */ V(15, 12, 1), /* 372 */ - /* 1 */ V(13, 14, 1), - - /* 0000 0000 0101 ... */ - /* 0 */ V(14, 13, 1), /* 374 */ - /* 1 */ V(11, 15, 1), - - /* 0000 0000 0111 ... */ - /* 0 */ V(12, 14, 1), /* 376 */ - /* 1 */ V(14, 12, 1), - - /* 0000 0001 1111 ... */ - /* 0 */ V(10, 14, 1), /* 378 */ - /* 1 */ V(0, 15, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 4), + /* 0100 */ PTR(80, 4), + /* 0101 */ PTR(96, 3), + /* 0110 */ PTR(104, 3), + /* 0111 */ PTR(112, 2), + /* 1000 */ PTR(116, 1), + /* 1001 */ PTR(118, 1), + /* 1010 */ V(1, 1, 3), + /* 1011 */ V(1, 1, 3), + /* 1100 */ V(0, 1, 4), + /* 1101 */ V(1, 0, 4), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(120, 4), /* 16 */ + /* 0001 */ PTR(136, 4), + /* 0010 */ PTR(152, 4), + /* 0011 */ PTR(168, 4), + /* 0100 */ PTR(184, 4), + /* 0101 */ PTR(200, 3), + /* 0110 */ PTR(208, 3), + /* 0111 */ PTR(216, 4), + /* 1000 */ PTR(232, 3), + /* 1001 */ PTR(240, 3), + /* 1010 */ PTR(248, 3), + /* 1011 */ PTR(256, 3), + /* 1100 */ PTR(264, 2), + /* 1101 */ PTR(268, 3), + /* 1110 */ PTR(276, 3), + /* 1111 */ PTR(284, 2), + + /* 0001 ... */ + /* 0000 */ PTR(288, 2), /* 32 */ + /* 0001 */ PTR(292, 2), + /* 0010 */ PTR(296, 2), + /* 0011 */ PTR(300, 2), + /* 0100 */ PTR(304, 2), + /* 0101 */ PTR(308, 2), + /* 0110 */ PTR(312, 2), + /* 0111 */ PTR(316, 2), + /* 1000 */ PTR(320, 1), + /* 1001 */ PTR(322, 1), + /* 1010 */ PTR(324, 1), + /* 1011 */ PTR(326, 2), + /* 1100 */ PTR(330, 1), + /* 1101 */ PTR(332, 1), + /* 1110 */ PTR(334, 2), + /* 1111 */ PTR(338, 1), + + /* 0010 ... */ + /* 0000 */ PTR(340, 1), /* 48 */ + /* 0001 */ PTR(342, 1), + /* 0010 */ V(9, 1, 4), + /* 0011 */ PTR(344, 1), + /* 0100 */ PTR(346, 1), + /* 0101 */ PTR(348, 1), + /* 0110 */ PTR(350, 1), + /* 0111 */ PTR(352, 1), + /* 1000 */ V(2, 8, 4), + /* 1001 */ V(8, 2, 4), + /* 1010 */ V(1, 8, 4), + /* 1011 */ V(8, 1, 4), + /* 1100 */ PTR(354, 1), + /* 1101 */ PTR(356, 1), + /* 1110 */ PTR(358, 1), + /* 1111 */ PTR(360, 1), + + /* 0011 ... */ + /* 0000 */ V(2, 7, 4), /* 64 */ + /* 0001 */ V(7, 2, 4), + /* 0010 */ V(6, 4, 4), + /* 0011 */ V(1, 7, 4), + /* 0100 */ V(5, 5, 4), + /* 0101 */ V(7, 1, 4), + /* 0110 */ PTR(362, 1), + /* 0111 */ V(3, 6, 4), + /* 1000 */ V(6, 3, 4), + /* 1001 */ V(4, 5, 4), + /* 1010 */ V(5, 4, 4), + /* 1011 */ V(2, 6, 4), + /* 1100 */ V(6, 2, 4), + /* 1101 */ V(1, 6, 4), + /* 1110 */ PTR(364, 1), + /* 1111 */ V(3, 5, 4), + + /* 0100 ... */ + /* 0000 */ V(6, 1, 3), /* 80 */ + /* 0001 */ V(6, 1, 3), + /* 0010 */ V(5, 3, 4), + /* 0011 */ V(4, 4, 4), + /* 0100 */ V(2, 5, 3), + /* 0101 */ V(2, 5, 3), + /* 0110 */ V(5, 2, 3), + /* 0111 */ V(5, 2, 3), + /* 1000 */ V(1, 5, 3), + /* 1001 */ V(1, 5, 3), + /* 1010 */ V(5, 1, 3), + /* 1011 */ V(5, 1, 3), + /* 1100 */ V(0, 5, 4), + /* 1101 */ V(5, 0, 4), + /* 1110 */ V(3, 4, 3), + /* 1111 */ V(3, 4, 3), + + /* 0101 ... */ + /* 000 */ V(4, 3, 3), /* 96 */ + /* 001 */ V(2, 4, 3), + /* 010 */ V(4, 2, 3), + /* 011 */ V(3, 3, 3), + /* 100 */ V(4, 1, 2), + /* 101 */ V(4, 1, 2), + /* 110 */ V(1, 4, 3), + /* 111 */ V(0, 4, 3), + + /* 0110 ... */ + /* 000 */ V(2, 3, 2), /* 104 */ + /* 001 */ V(2, 3, 2), + /* 010 */ V(3, 2, 2), + /* 011 */ V(3, 2, 2), + /* 100 */ V(4, 0, 3), + /* 101 */ V(0, 3, 3), + /* 110 */ V(1, 3, 2), + /* 111 */ V(1, 3, 2), + + /* 0111 ... */ + /* 00 */ V(3, 1, 2), /* 112 */ + /* 01 */ V(3, 0, 2), + /* 10 */ V(2, 2, 1), + /* 11 */ V(2, 2, 1), + + /* 1000 ... */ + /* 0 */ V(1, 2, 1), /* 116 */ + /* 1 */ V(2, 1, 1), + + /* 1001 ... */ + /* 0 */ V(0, 2, 1), /* 118 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 0000 */ PTR(366, 1), /* 120 */ + /* 0001 */ PTR(368, 1), + /* 0010 */ V(14, 14, 4), + /* 0011 */ PTR(370, 1), + /* 0100 */ PTR(372, 1), + /* 0101 */ PTR(374, 1), + /* 0110 */ V(15, 11, 4), + /* 0111 */ PTR(376, 1), + /* 1000 */ V(13, 13, 4), + /* 1001 */ V(10, 15, 4), + /* 1010 */ V(15, 10, 4), + /* 1011 */ V(11, 14, 4), + /* 1100 */ V(14, 11, 4), + /* 1101 */ V(12, 13, 4), + /* 1110 */ V(13, 12, 4), + /* 1111 */ V(9, 15, 4), + + /* 0000 0001 ... */ + /* 0000 */ V(15, 9, 4), /* 136 */ + /* 0001 */ V(14, 10, 4), + /* 0010 */ V(11, 13, 4), + /* 0011 */ V(13, 11, 4), + /* 0100 */ V(8, 15, 4), + /* 0101 */ V(15, 8, 4), + /* 0110 */ V(12, 12, 4), + /* 0111 */ V(9, 14, 4), + /* 1000 */ V(14, 9, 4), + /* 1001 */ V(7, 15, 4), + /* 1010 */ V(15, 7, 4), + /* 1011 */ V(10, 13, 4), + /* 1100 */ V(13, 10, 4), + /* 1101 */ V(11, 12, 4), + /* 1110 */ V(6, 15, 4), + /* 1111 */ PTR(378, 1), + + /* 0000 0010 ... */ + /* 0000 */ V(12, 11, 3), /* 152 */ + /* 0001 */ V(12, 11, 3), + /* 0010 */ V(15, 6, 3), + /* 0011 */ V(15, 6, 3), + /* 0100 */ V(8, 14, 4), + /* 0101 */ V(14, 8, 4), + /* 0110 */ V(5, 15, 4), + /* 0111 */ V(9, 13, 4), + /* 1000 */ V(15, 5, 3), + /* 1001 */ V(15, 5, 3), + /* 1010 */ V(7, 14, 3), + /* 1011 */ V(7, 14, 3), + /* 1100 */ V(14, 7, 3), + /* 1101 */ V(14, 7, 3), + /* 1110 */ V(10, 12, 3), + /* 1111 */ V(10, 12, 3), + + /* 0000 0011 ... */ + /* 0000 */ V(12, 10, 3), /* 168 */ + /* 0001 */ V(12, 10, 3), + /* 0010 */ V(11, 11, 3), + /* 0011 */ V(11, 11, 3), + /* 0100 */ V(13, 9, 4), + /* 0101 */ V(8, 13, 4), + /* 0110 */ V(4, 15, 3), + /* 0111 */ V(4, 15, 3), + /* 1000 */ V(15, 4, 3), + /* 1001 */ V(15, 4, 3), + /* 1010 */ V(3, 15, 3), + /* 1011 */ V(3, 15, 3), + /* 1100 */ V(15, 3, 3), + /* 1101 */ V(15, 3, 3), + /* 1110 */ V(13, 8, 3), + /* 1111 */ V(13, 8, 3), + + /* 0000 0100 ... */ + /* 0000 */ V(14, 6, 3), /* 184 */ + /* 0001 */ V(14, 6, 3), + /* 0010 */ V(2, 15, 3), + /* 0011 */ V(2, 15, 3), + /* 0100 */ V(15, 2, 3), + /* 0101 */ V(15, 2, 3), + /* 0110 */ V(6, 14, 4), + /* 0111 */ V(15, 0, 4), + /* 1000 */ V(1, 15, 3), + /* 1001 */ V(1, 15, 3), + /* 1010 */ V(15, 1, 3), + /* 1011 */ V(15, 1, 3), + /* 1100 */ V(9, 12, 3), + /* 1101 */ V(9, 12, 3), + /* 1110 */ V(12, 9, 3), + /* 1111 */ V(12, 9, 3), + + /* 0000 0101 ... */ + /* 000 */ V(5, 14, 3), /* 200 */ + /* 001 */ V(10, 11, 3), + /* 010 */ V(11, 10, 3), + /* 011 */ V(14, 5, 3), + /* 100 */ V(7, 13, 3), + /* 101 */ V(13, 7, 3), + /* 110 */ V(4, 14, 3), + /* 111 */ V(14, 4, 3), + + /* 0000 0110 ... */ + /* 000 */ V(8, 12, 3), /* 208 */ + /* 001 */ V(12, 8, 3), + /* 010 */ V(3, 14, 3), + /* 011 */ V(6, 13, 3), + /* 100 */ V(13, 6, 3), + /* 101 */ V(14, 3, 3), + /* 110 */ V(9, 11, 3), + /* 111 */ V(11, 9, 3), + + /* 0000 0111 ... */ + /* 0000 */ V(2, 14, 3), /* 216 */ + /* 0001 */ V(2, 14, 3), + /* 0010 */ V(10, 10, 3), + /* 0011 */ V(10, 10, 3), + /* 0100 */ V(14, 2, 3), + /* 0101 */ V(14, 2, 3), + /* 0110 */ V(1, 14, 3), + /* 0111 */ V(1, 14, 3), + /* 1000 */ V(14, 1, 3), + /* 1001 */ V(14, 1, 3), + /* 1010 */ V(0, 14, 4), + /* 1011 */ V(14, 0, 4), + /* 1100 */ V(5, 13, 3), + /* 1101 */ V(5, 13, 3), + /* 1110 */ V(13, 5, 3), + /* 1111 */ V(13, 5, 3), + + /* 0000 1000 ... */ + /* 000 */ V(7, 12, 3), /* 232 */ + /* 001 */ V(12, 7, 3), + /* 010 */ V(4, 13, 3), + /* 011 */ V(8, 11, 3), + /* 100 */ V(13, 4, 2), + /* 101 */ V(13, 4, 2), + /* 110 */ V(11, 8, 3), + /* 111 */ V(9, 10, 3), + + /* 0000 1001 ... */ + /* 000 */ V(10, 9, 3), /* 240 */ + /* 001 */ V(6, 12, 3), + /* 010 */ V(12, 6, 3), + /* 011 */ V(3, 13, 3), + /* 100 */ V(13, 3, 2), + /* 101 */ V(13, 3, 2), + /* 110 */ V(13, 2, 2), + /* 111 */ V(13, 2, 2), + + /* 0000 1010 ... */ + /* 000 */ V(2, 13, 3), /* 248 */ + /* 001 */ V(0, 13, 3), + /* 010 */ V(1, 13, 2), + /* 011 */ V(1, 13, 2), + /* 100 */ V(7, 11, 2), + /* 101 */ V(7, 11, 2), + /* 110 */ V(11, 7, 2), + /* 111 */ V(11, 7, 2), + + /* 0000 1011 ... */ + /* 000 */ V(13, 1, 2), /* 256 */ + /* 001 */ V(13, 1, 2), + /* 010 */ V(5, 12, 3), + /* 011 */ V(13, 0, 3), + /* 100 */ V(12, 5, 2), + /* 101 */ V(12, 5, 2), + /* 110 */ V(8, 10, 2), + /* 111 */ V(8, 10, 2), + + /* 0000 1100 ... */ + /* 00 */ V(10, 8, 2), /* 264 */ + /* 01 */ V(4, 12, 2), + /* 10 */ V(12, 4, 2), + /* 11 */ V(6, 11, 2), + + /* 0000 1101 ... */ + /* 000 */ V(11, 6, 2), /* 268 */ + /* 001 */ V(11, 6, 2), + /* 010 */ V(9, 9, 3), + /* 011 */ V(0, 12, 3), + /* 100 */ V(3, 12, 2), + /* 101 */ V(3, 12, 2), + /* 110 */ V(12, 3, 2), + /* 111 */ V(12, 3, 2), + + /* 0000 1110 ... */ + /* 000 */ V(7, 10, 2), /* 276 */ + /* 001 */ V(7, 10, 2), + /* 010 */ V(10, 7, 2), + /* 011 */ V(10, 7, 2), + /* 100 */ V(10, 6, 2), + /* 101 */ V(10, 6, 2), + /* 110 */ V(12, 0, 3), + /* 111 */ V(0, 11, 3), + + /* 0000 1111 ... */ + /* 00 */ V(12, 2, 1), /* 284 */ + /* 01 */ V(12, 2, 1), + /* 10 */ V(2, 12, 2), + /* 11 */ V(5, 11, 2), + + /* 0001 0000 ... */ + /* 00 */ V(11, 5, 2), /* 288 */ + /* 01 */ V(1, 12, 2), + /* 10 */ V(8, 9, 2), + /* 11 */ V(9, 8, 2), + + /* 0001 0001 ... */ + /* 00 */ V(12, 1, 2), /* 292 */ + /* 01 */ V(4, 11, 2), + /* 10 */ V(11, 4, 2), + /* 11 */ V(6, 10, 2), + + /* 0001 0010 ... */ + /* 00 */ V(3, 11, 2), /* 296 */ + /* 01 */ V(7, 9, 2), + /* 10 */ V(11, 3, 1), + /* 11 */ V(11, 3, 1), + + /* 0001 0011 ... */ + /* 00 */ V(9, 7, 2), /* 300 */ + /* 01 */ V(8, 8, 2), + /* 10 */ V(2, 11, 2), + /* 11 */ V(5, 10, 2), + + /* 0001 0100 ... */ + /* 00 */ V(11, 2, 1), /* 304 */ + /* 01 */ V(11, 2, 1), + /* 10 */ V(10, 5, 2), + /* 11 */ V(1, 11, 2), + + /* 0001 0101 ... */ + /* 00 */ V(11, 1, 1), /* 308 */ + /* 01 */ V(11, 1, 1), + /* 10 */ V(11, 0, 2), + /* 11 */ V(6, 9, 2), + + /* 0001 0110 ... */ + /* 00 */ V(9, 6, 2), /* 312 */ + /* 01 */ V(4, 10, 2), + /* 10 */ V(10, 4, 2), + /* 11 */ V(7, 8, 2), + + /* 0001 0111 ... */ + /* 00 */ V(8, 7, 2), /* 316 */ + /* 01 */ V(3, 10, 2), + /* 10 */ V(10, 3, 1), + /* 11 */ V(10, 3, 1), + + /* 0001 1000 ... */ + /* 0 */ V(5, 9, 1), /* 320 */ + /* 1 */ V(9, 5, 1), + + /* 0001 1001 ... */ + /* 0 */ V(2, 10, 1), /* 322 */ + /* 1 */ V(10, 2, 1), + + /* 0001 1010 ... */ + /* 0 */ V(1, 10, 1), /* 324 */ + /* 1 */ V(10, 1, 1), + + /* 0001 1011 ... */ + /* 00 */ V(0, 10, 2), /* 326 */ + /* 01 */ V(10, 0, 2), + /* 10 */ V(6, 8, 1), + /* 11 */ V(6, 8, 1), + + /* 0001 1100 ... */ + /* 0 */ V(8, 6, 1), /* 330 */ + /* 1 */ V(4, 9, 1), + + /* 0001 1101 ... */ + /* 0 */ V(9, 4, 1), /* 332 */ + /* 1 */ V(3, 9, 1), + + /* 0001 1110 ... */ + /* 00 */ V(9, 3, 1), /* 334 */ + /* 01 */ V(9, 3, 1), + /* 10 */ V(7, 7, 2), + /* 11 */ V(0, 9, 2), + + /* 0001 1111 ... */ + /* 0 */ V(5, 8, 1), /* 338 */ + /* 1 */ V(8, 5, 1), + + /* 0010 0000 ... */ + /* 0 */ V(2, 9, 1), /* 340 */ + /* 1 */ V(6, 7, 1), + + /* 0010 0001 ... */ + /* 0 */ V(7, 6, 1), /* 342 */ + /* 1 */ V(9, 2, 1), + + /* 0010 0011 ... */ + /* 0 */ V(1, 9, 1), /* 344 */ + /* 1 */ V(9, 0, 1), + + /* 0010 0100 ... */ + /* 0 */ V(4, 8, 1), /* 346 */ + /* 1 */ V(8, 4, 1), + + /* 0010 0101 ... */ + /* 0 */ V(5, 7, 1), /* 348 */ + /* 1 */ V(7, 5, 1), + + /* 0010 0110 ... */ + /* 0 */ V(3, 8, 1), /* 350 */ + /* 1 */ V(8, 3, 1), + + /* 0010 0111 ... */ + /* 0 */ V(6, 6, 1), /* 352 */ + /* 1 */ V(4, 7, 1), + + /* 0010 1100 ... */ + /* 0 */ V(7, 4, 1), /* 354 */ + /* 1 */ V(0, 8, 1), + + /* 0010 1101 ... */ + /* 0 */ V(8, 0, 1), /* 356 */ + /* 1 */ V(5, 6, 1), + + /* 0010 1110 ... */ + /* 0 */ V(6, 5, 1), /* 358 */ + /* 1 */ V(3, 7, 1), + + /* 0010 1111 ... */ + /* 0 */ V(7, 3, 1), /* 360 */ + /* 1 */ V(4, 6, 1), + + /* 0011 0110 ... */ + /* 0 */ V(0, 7, 1), /* 362 */ + /* 1 */ V(7, 0, 1), + + /* 0011 1110 ... */ + /* 0 */ V(0, 6, 1), /* 364 */ + /* 1 */ V(6, 0, 1), + + /* 0000 0000 0000 ... */ + /* 0 */ V(15, 15, 1), /* 366 */ + /* 1 */ V(14, 15, 1), + + /* 0000 0000 0001 ... */ + /* 0 */ V(15, 14, 1), /* 368 */ + /* 1 */ V(13, 15, 1), + + /* 0000 0000 0011 ... */ + /* 0 */ V(15, 13, 1), /* 370 */ + /* 1 */ V(12, 15, 1), + + /* 0000 0000 0100 ... */ + /* 0 */ V(15, 12, 1), /* 372 */ + /* 1 */ V(13, 14, 1), + + /* 0000 0000 0101 ... */ + /* 0 */ V(14, 13, 1), /* 374 */ + /* 1 */ V(11, 15, 1), + + /* 0000 0000 0111 ... */ + /* 0 */ V(12, 14, 1), /* 376 */ + /* 1 */ V(14, 12, 1), + + /* 0000 0001 1111 ... */ + /* 0 */ V(10, 14, 1), /* 378 */ + /* 1 */ V(0, 15, 1) }; static union huffpair const hufftab16[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ V(1, 1, 4), - /* 0101 */ V(0, 1, 4), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(68, 3), /* 16 */ - /* 0001 */ PTR(76, 3), - /* 0010 */ PTR(84, 2), - /* 0011 */ V(15, 15, 4), - /* 0100 */ PTR(88, 2), - /* 0101 */ PTR(92, 1), - /* 0110 */ PTR(94, 4), - /* 0111 */ V(15, 2, 4), - /* 1000 */ PTR(110, 1), - /* 1001 */ V(1, 15, 4), - /* 1010 */ V(15, 1, 4), - /* 1011 */ PTR(112, 4), - /* 1100 */ PTR(128, 4), - /* 1101 */ PTR(144, 4), - /* 1110 */ PTR(160, 4), - /* 1111 */ PTR(176, 4), - - /* 0001 ... */ - /* 0000 */ PTR(192, 4), /* 32 */ - /* 0001 */ PTR(208, 3), - /* 0010 */ PTR(216, 3), - /* 0011 */ PTR(224, 3), - /* 0100 */ PTR(232, 3), - /* 0101 */ PTR(240, 3), - /* 0110 */ PTR(248, 3), - /* 0111 */ PTR(256, 3), - /* 1000 */ PTR(264, 2), - /* 1001 */ PTR(268, 2), - /* 1010 */ PTR(272, 1), - /* 1011 */ PTR(274, 2), - /* 1100 */ PTR(278, 2), - /* 1101 */ PTR(282, 1), - /* 1110 */ V(5, 1, 4), - /* 1111 */ PTR(284, 1), - - /* 0010 ... */ - /* 0000 */ PTR(286, 1), /* 48 */ - /* 0001 */ PTR(288, 1), - /* 0010 */ PTR(290, 1), - /* 0011 */ V(1, 4, 4), - /* 0100 */ V(4, 1, 4), - /* 0101 */ PTR(292, 1), - /* 0110 */ V(2, 3, 4), - /* 0111 */ V(3, 2, 4), - /* 1000 */ V(1, 3, 3), - /* 1001 */ V(1, 3, 3), - /* 1010 */ V(3, 1, 3), - /* 1011 */ V(3, 1, 3), - /* 1100 */ V(0, 3, 4), - /* 1101 */ V(3, 0, 4), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0011 ... */ - /* 00 */ V(1, 2, 2), /* 64 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(14, 15, 3), /* 68 */ - /* 001 */ V(15, 14, 3), - /* 010 */ V(13, 15, 3), - /* 011 */ V(15, 13, 3), - /* 100 */ V(12, 15, 3), - /* 101 */ V(15, 12, 3), - /* 110 */ V(11, 15, 3), - /* 111 */ V(15, 11, 3), - - /* 0000 0001 ... */ - /* 000 */ V(10, 15, 2), /* 76 */ - /* 001 */ V(10, 15, 2), - /* 010 */ V(15, 10, 3), - /* 011 */ V(9, 15, 3), - /* 100 */ V(15, 9, 3), - /* 101 */ V(15, 8, 3), - /* 110 */ V(8, 15, 2), - /* 111 */ V(8, 15, 2), - - /* 0000 0010 ... */ - /* 00 */ V(7, 15, 2), /* 84 */ - /* 01 */ V(15, 7, 2), - /* 10 */ V(6, 15, 2), - /* 11 */ V(15, 6, 2), - - /* 0000 0100 ... */ - /* 00 */ V(5, 15, 2), /* 88 */ - /* 01 */ V(15, 5, 2), - /* 10 */ V(4, 15, 1), - /* 11 */ V(4, 15, 1), - - /* 0000 0101 ... */ - /* 0 */ V(15, 4, 1), /* 92 */ - /* 1 */ V(15, 3, 1), - - /* 0000 0110 ... */ - /* 0000 */ V(15, 0, 1), /* 94 */ - /* 0001 */ V(15, 0, 1), - /* 0010 */ V(15, 0, 1), - /* 0011 */ V(15, 0, 1), - /* 0100 */ V(15, 0, 1), - /* 0101 */ V(15, 0, 1), - /* 0110 */ V(15, 0, 1), - /* 0111 */ V(15, 0, 1), - /* 1000 */ V(3, 15, 2), - /* 1001 */ V(3, 15, 2), - /* 1010 */ V(3, 15, 2), - /* 1011 */ V(3, 15, 2), - /* 1100 */ PTR(294, 4), - /* 1101 */ PTR(310, 3), - /* 1110 */ PTR(318, 3), - /* 1111 */ PTR(326, 3), - - /* 0000 1000 ... */ - /* 0 */ V(2, 15, 1), /* 110 */ - /* 1 */ V(0, 15, 1), - - /* 0000 1011 ... */ - /* 0000 */ PTR(334, 2), /* 112 */ - /* 0001 */ PTR(338, 2), - /* 0010 */ PTR(342, 2), - /* 0011 */ PTR(346, 1), - /* 0100 */ PTR(348, 2), - /* 0101 */ PTR(352, 2), - /* 0110 */ PTR(356, 1), - /* 0111 */ PTR(358, 2), - /* 1000 */ PTR(362, 2), - /* 1001 */ PTR(366, 2), - /* 1010 */ PTR(370, 2), - /* 1011 */ V(14, 3, 4), - /* 1100 */ PTR(374, 1), - /* 1101 */ PTR(376, 1), - /* 1110 */ PTR(378, 1), - /* 1111 */ PTR(380, 1), - - /* 0000 1100 ... */ - /* 0000 */ PTR(382, 1), /* 128 */ - /* 0001 */ PTR(384, 1), - /* 0010 */ PTR(386, 1), - /* 0011 */ V(0, 13, 4), - /* 0100 */ PTR(388, 1), - /* 0101 */ PTR(390, 1), - /* 0110 */ PTR(392, 1), - /* 0111 */ V(3, 12, 4), - /* 1000 */ PTR(394, 1), - /* 1001 */ V(1, 12, 4), - /* 1010 */ V(12, 0, 4), - /* 1011 */ PTR(396, 1), - /* 1100 */ V(14, 2, 3), - /* 1101 */ V(14, 2, 3), - /* 1110 */ V(2, 14, 4), - /* 1111 */ V(1, 14, 4), - - /* 0000 1101 ... */ - /* 0000 */ V(13, 3, 4), /* 144 */ - /* 0001 */ V(2, 13, 4), - /* 0010 */ V(13, 2, 4), - /* 0011 */ V(13, 1, 4), - /* 0100 */ V(3, 11, 4), - /* 0101 */ PTR(398, 1), - /* 0110 */ V(1, 13, 3), - /* 0111 */ V(1, 13, 3), - /* 1000 */ V(12, 4, 4), - /* 1001 */ V(6, 11, 4), - /* 1010 */ V(12, 3, 4), - /* 1011 */ V(10, 7, 4), - /* 1100 */ V(2, 12, 3), - /* 1101 */ V(2, 12, 3), - /* 1110 */ V(12, 2, 4), - /* 1111 */ V(11, 5, 4), - - /* 0000 1110 ... */ - /* 0000 */ V(12, 1, 4), /* 160 */ - /* 0001 */ V(0, 12, 4), - /* 0010 */ V(4, 11, 4), - /* 0011 */ V(11, 4, 4), - /* 0100 */ V(6, 10, 4), - /* 0101 */ V(10, 6, 4), - /* 0110 */ V(11, 3, 3), - /* 0111 */ V(11, 3, 3), - /* 1000 */ V(5, 10, 4), - /* 1001 */ V(10, 5, 4), - /* 1010 */ V(2, 11, 3), - /* 1011 */ V(2, 11, 3), - /* 1100 */ V(11, 2, 3), - /* 1101 */ V(11, 2, 3), - /* 1110 */ V(1, 11, 3), - /* 1111 */ V(1, 11, 3), - - /* 0000 1111 ... */ - /* 0000 */ V(11, 1, 3), /* 176 */ - /* 0001 */ V(11, 1, 3), - /* 0010 */ V(0, 11, 4), - /* 0011 */ V(11, 0, 4), - /* 0100 */ V(6, 9, 4), - /* 0101 */ V(9, 6, 4), - /* 0110 */ V(4, 10, 4), - /* 0111 */ V(10, 4, 4), - /* 1000 */ V(7, 8, 4), - /* 1001 */ V(8, 7, 4), - /* 1010 */ V(10, 3, 3), - /* 1011 */ V(10, 3, 3), - /* 1100 */ V(3, 10, 4), - /* 1101 */ V(5, 9, 4), - /* 1110 */ V(2, 10, 3), - /* 1111 */ V(2, 10, 3), - - /* 0001 0000 ... */ - /* 0000 */ V(9, 5, 4), /* 192 */ - /* 0001 */ V(6, 8, 4), - /* 0010 */ V(10, 1, 3), - /* 0011 */ V(10, 1, 3), - /* 0100 */ V(8, 6, 4), - /* 0101 */ V(7, 7, 4), - /* 0110 */ V(9, 4, 3), - /* 0111 */ V(9, 4, 3), - /* 1000 */ V(4, 9, 4), - /* 1001 */ V(5, 7, 4), - /* 1010 */ V(6, 7, 3), - /* 1011 */ V(6, 7, 3), - /* 1100 */ V(10, 2, 2), - /* 1101 */ V(10, 2, 2), - /* 1110 */ V(10, 2, 2), - /* 1111 */ V(10, 2, 2), - - /* 0001 0001 ... */ - /* 000 */ V(1, 10, 2), /* 208 */ - /* 001 */ V(1, 10, 2), - /* 010 */ V(0, 10, 3), - /* 011 */ V(10, 0, 3), - /* 100 */ V(3, 9, 3), - /* 101 */ V(9, 3, 3), - /* 110 */ V(5, 8, 3), - /* 111 */ V(8, 5, 3), - - /* 0001 0010 ... */ - /* 000 */ V(2, 9, 2), /* 216 */ - /* 001 */ V(2, 9, 2), - /* 010 */ V(9, 2, 2), - /* 011 */ V(9, 2, 2), - /* 100 */ V(7, 6, 3), - /* 101 */ V(0, 9, 3), - /* 110 */ V(1, 9, 2), - /* 111 */ V(1, 9, 2), - - /* 0001 0011 ... */ - /* 000 */ V(9, 1, 2), /* 224 */ - /* 001 */ V(9, 1, 2), - /* 010 */ V(9, 0, 3), - /* 011 */ V(4, 8, 3), - /* 100 */ V(8, 4, 3), - /* 101 */ V(7, 5, 3), - /* 110 */ V(3, 8, 3), - /* 111 */ V(8, 3, 3), - - /* 0001 0100 ... */ - /* 000 */ V(6, 6, 3), /* 232 */ - /* 001 */ V(2, 8, 3), - /* 010 */ V(8, 2, 2), - /* 011 */ V(8, 2, 2), - /* 100 */ V(4, 7, 3), - /* 101 */ V(7, 4, 3), - /* 110 */ V(1, 8, 2), - /* 111 */ V(1, 8, 2), - - /* 0001 0101 ... */ - /* 000 */ V(8, 1, 2), /* 240 */ - /* 001 */ V(8, 1, 2), - /* 010 */ V(8, 0, 2), - /* 011 */ V(8, 0, 2), - /* 100 */ V(0, 8, 3), - /* 101 */ V(5, 6, 3), - /* 110 */ V(3, 7, 2), - /* 111 */ V(3, 7, 2), - - /* 0001 0110 ... */ - /* 000 */ V(7, 3, 2), /* 248 */ - /* 001 */ V(7, 3, 2), - /* 010 */ V(6, 5, 3), - /* 011 */ V(4, 6, 3), - /* 100 */ V(2, 7, 2), - /* 101 */ V(2, 7, 2), - /* 110 */ V(7, 2, 2), - /* 111 */ V(7, 2, 2), - - /* 0001 0111 ... */ - /* 000 */ V(6, 4, 3), /* 256 */ - /* 001 */ V(5, 5, 3), - /* 010 */ V(0, 7, 2), - /* 011 */ V(0, 7, 2), - /* 100 */ V(1, 7, 1), - /* 101 */ V(1, 7, 1), - /* 110 */ V(1, 7, 1), - /* 111 */ V(1, 7, 1), - - /* 0001 1000 ... */ - /* 00 */ V(7, 1, 1), /* 264 */ - /* 01 */ V(7, 1, 1), - /* 10 */ V(7, 0, 2), - /* 11 */ V(3, 6, 2), - - /* 0001 1001 ... */ - /* 00 */ V(6, 3, 2), /* 268 */ - /* 01 */ V(4, 5, 2), - /* 10 */ V(5, 4, 2), - /* 11 */ V(2, 6, 2), - - /* 0001 1010 ... */ - /* 0 */ V(6, 2, 1), /* 272 */ - /* 1 */ V(1, 6, 1), - - /* 0001 1011 ... */ - /* 00 */ V(6, 1, 1), /* 274 */ - /* 01 */ V(6, 1, 1), - /* 10 */ V(0, 6, 2), - /* 11 */ V(6, 0, 2), - - /* 0001 1100 ... */ - /* 00 */ V(5, 3, 1), /* 278 */ - /* 01 */ V(5, 3, 1), - /* 10 */ V(3, 5, 2), - /* 11 */ V(4, 4, 2), - - /* 0001 1101 ... */ - /* 0 */ V(2, 5, 1), /* 282 */ - /* 1 */ V(5, 2, 1), - - /* 0001 1111 ... */ - /* 0 */ V(1, 5, 1), /* 284 */ - /* 1 */ V(0, 5, 1), - - /* 0010 0000 ... */ - /* 0 */ V(3, 4, 1), /* 286 */ - /* 1 */ V(4, 3, 1), - - /* 0010 0001 ... */ - /* 0 */ V(5, 0, 1), /* 288 */ - /* 1 */ V(2, 4, 1), - - /* 0010 0010 ... */ - /* 0 */ V(4, 2, 1), /* 290 */ - /* 1 */ V(3, 3, 1), - - /* 0010 0101 ... */ - /* 0 */ V(0, 4, 1), /* 292 */ - /* 1 */ V(4, 0, 1), - - /* 0000 0110 1100 ... */ - /* 0000 */ V(12, 14, 4), /* 294 */ - /* 0001 */ PTR(400, 1), - /* 0010 */ V(13, 14, 3), - /* 0011 */ V(13, 14, 3), - /* 0100 */ V(14, 9, 3), - /* 0101 */ V(14, 9, 3), - /* 0110 */ V(14, 10, 4), - /* 0111 */ V(13, 9, 4), - /* 1000 */ V(14, 14, 2), - /* 1001 */ V(14, 14, 2), - /* 1010 */ V(14, 14, 2), - /* 1011 */ V(14, 14, 2), - /* 1100 */ V(14, 13, 3), - /* 1101 */ V(14, 13, 3), - /* 1110 */ V(14, 11, 3), - /* 1111 */ V(14, 11, 3), - - /* 0000 0110 1101 ... */ - /* 000 */ V(11, 14, 2), /* 310 */ - /* 001 */ V(11, 14, 2), - /* 010 */ V(12, 13, 2), - /* 011 */ V(12, 13, 2), - /* 100 */ V(13, 12, 3), - /* 101 */ V(13, 11, 3), - /* 110 */ V(10, 14, 2), - /* 111 */ V(10, 14, 2), - - /* 0000 0110 1110 ... */ - /* 000 */ V(12, 12, 2), /* 318 */ - /* 001 */ V(12, 12, 2), - /* 010 */ V(10, 13, 3), - /* 011 */ V(13, 10, 3), - /* 100 */ V(7, 14, 3), - /* 101 */ V(10, 12, 3), - /* 110 */ V(12, 10, 2), - /* 111 */ V(12, 10, 2), - - /* 0000 0110 1111 ... */ - /* 000 */ V(12, 9, 3), /* 326 */ - /* 001 */ V(7, 13, 3), - /* 010 */ V(5, 14, 2), - /* 011 */ V(5, 14, 2), - /* 100 */ V(11, 13, 1), - /* 101 */ V(11, 13, 1), - /* 110 */ V(11, 13, 1), - /* 111 */ V(11, 13, 1), - - /* 0000 1011 0000 ... */ - /* 00 */ V(9, 14, 1), /* 334 */ - /* 01 */ V(9, 14, 1), - /* 10 */ V(11, 12, 2), - /* 11 */ V(12, 11, 2), - - /* 0000 1011 0001 ... */ - /* 00 */ V(8, 14, 2), /* 338 */ - /* 01 */ V(14, 8, 2), - /* 10 */ V(9, 13, 2), - /* 11 */ V(14, 7, 2), - - /* 0000 1011 0010 ... */ - /* 00 */ V(11, 11, 2), /* 342 */ - /* 01 */ V(8, 13, 2), - /* 10 */ V(13, 8, 2), - /* 11 */ V(6, 14, 2), - - /* 0000 1011 0011 ... */ - /* 0 */ V(14, 6, 1), /* 346 */ - /* 1 */ V(9, 12, 1), - - /* 0000 1011 0100 ... */ - /* 00 */ V(10, 11, 2), /* 348 */ - /* 01 */ V(11, 10, 2), - /* 10 */ V(14, 5, 2), - /* 11 */ V(13, 7, 2), - - /* 0000 1011 0101 ... */ - /* 00 */ V(4, 14, 1), /* 352 */ - /* 01 */ V(4, 14, 1), - /* 10 */ V(14, 4, 2), - /* 11 */ V(8, 12, 2), - - /* 0000 1011 0110 ... */ - /* 0 */ V(12, 8, 1), /* 356 */ - /* 1 */ V(3, 14, 1), - - /* 0000 1011 0111 ... */ - /* 00 */ V(6, 13, 1), /* 358 */ - /* 01 */ V(6, 13, 1), - /* 10 */ V(13, 6, 2), - /* 11 */ V(9, 11, 2), - - /* 0000 1011 1000 ... */ - /* 00 */ V(11, 9, 2), /* 362 */ - /* 01 */ V(10, 10, 2), - /* 10 */ V(14, 1, 1), - /* 11 */ V(14, 1, 1), - - /* 0000 1011 1001 ... */ - /* 00 */ V(13, 4, 1), /* 366 */ - /* 01 */ V(13, 4, 1), - /* 10 */ V(11, 8, 2), - /* 11 */ V(10, 9, 2), - - /* 0000 1011 1010 ... */ - /* 00 */ V(7, 11, 1), /* 370 */ - /* 01 */ V(7, 11, 1), - /* 10 */ V(11, 7, 2), - /* 11 */ V(13, 0, 2), - - /* 0000 1011 1100 ... */ - /* 0 */ V(0, 14, 1), /* 374 */ - /* 1 */ V(14, 0, 1), - - /* 0000 1011 1101 ... */ - /* 0 */ V(5, 13, 1), /* 376 */ - /* 1 */ V(13, 5, 1), - - /* 0000 1011 1110 ... */ - /* 0 */ V(7, 12, 1), /* 378 */ - /* 1 */ V(12, 7, 1), - - /* 0000 1011 1111 ... */ - /* 0 */ V(4, 13, 1), /* 380 */ - /* 1 */ V(8, 11, 1), - - /* 0000 1100 0000 ... */ - /* 0 */ V(9, 10, 1), /* 382 */ - /* 1 */ V(6, 12, 1), - - /* 0000 1100 0001 ... */ - /* 0 */ V(12, 6, 1), /* 384 */ - /* 1 */ V(3, 13, 1), - - /* 0000 1100 0010 ... */ - /* 0 */ V(5, 12, 1), /* 386 */ - /* 1 */ V(12, 5, 1), - - /* 0000 1100 0100 ... */ - /* 0 */ V(8, 10, 1), /* 388 */ - /* 1 */ V(10, 8, 1), - - /* 0000 1100 0101 ... */ - /* 0 */ V(9, 9, 1), /* 390 */ - /* 1 */ V(4, 12, 1), - - /* 0000 1100 0110 ... */ - /* 0 */ V(11, 6, 1), /* 392 */ - /* 1 */ V(7, 10, 1), - - /* 0000 1100 1000 ... */ - /* 0 */ V(5, 11, 1), /* 394 */ - /* 1 */ V(8, 9, 1), - - /* 0000 1100 1011 ... */ - /* 0 */ V(9, 8, 1), /* 396 */ - /* 1 */ V(7, 9, 1), - - /* 0000 1101 0101 ... */ - /* 0 */ V(9, 7, 1), /* 398 */ - /* 1 */ V(8, 8, 1), - - /* 0000 0110 1100 0001 ... */ - /* 0 */ V(14, 12, 1), /* 400 */ - /* 1 */ V(13, 13, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ V(1, 1, 4), + /* 0101 */ V(0, 1, 4), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(68, 3), /* 16 */ + /* 0001 */ PTR(76, 3), + /* 0010 */ PTR(84, 2), + /* 0011 */ V(15, 15, 4), + /* 0100 */ PTR(88, 2), + /* 0101 */ PTR(92, 1), + /* 0110 */ PTR(94, 4), + /* 0111 */ V(15, 2, 4), + /* 1000 */ PTR(110, 1), + /* 1001 */ V(1, 15, 4), + /* 1010 */ V(15, 1, 4), + /* 1011 */ PTR(112, 4), + /* 1100 */ PTR(128, 4), + /* 1101 */ PTR(144, 4), + /* 1110 */ PTR(160, 4), + /* 1111 */ PTR(176, 4), + + /* 0001 ... */ + /* 0000 */ PTR(192, 4), /* 32 */ + /* 0001 */ PTR(208, 3), + /* 0010 */ PTR(216, 3), + /* 0011 */ PTR(224, 3), + /* 0100 */ PTR(232, 3), + /* 0101 */ PTR(240, 3), + /* 0110 */ PTR(248, 3), + /* 0111 */ PTR(256, 3), + /* 1000 */ PTR(264, 2), + /* 1001 */ PTR(268, 2), + /* 1010 */ PTR(272, 1), + /* 1011 */ PTR(274, 2), + /* 1100 */ PTR(278, 2), + /* 1101 */ PTR(282, 1), + /* 1110 */ V(5, 1, 4), + /* 1111 */ PTR(284, 1), + + /* 0010 ... */ + /* 0000 */ PTR(286, 1), /* 48 */ + /* 0001 */ PTR(288, 1), + /* 0010 */ PTR(290, 1), + /* 0011 */ V(1, 4, 4), + /* 0100 */ V(4, 1, 4), + /* 0101 */ PTR(292, 1), + /* 0110 */ V(2, 3, 4), + /* 0111 */ V(3, 2, 4), + /* 1000 */ V(1, 3, 3), + /* 1001 */ V(1, 3, 3), + /* 1010 */ V(3, 1, 3), + /* 1011 */ V(3, 1, 3), + /* 1100 */ V(0, 3, 4), + /* 1101 */ V(3, 0, 4), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0011 ... */ + /* 00 */ V(1, 2, 2), /* 64 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(14, 15, 3), /* 68 */ + /* 001 */ V(15, 14, 3), + /* 010 */ V(13, 15, 3), + /* 011 */ V(15, 13, 3), + /* 100 */ V(12, 15, 3), + /* 101 */ V(15, 12, 3), + /* 110 */ V(11, 15, 3), + /* 111 */ V(15, 11, 3), + + /* 0000 0001 ... */ + /* 000 */ V(10, 15, 2), /* 76 */ + /* 001 */ V(10, 15, 2), + /* 010 */ V(15, 10, 3), + /* 011 */ V(9, 15, 3), + /* 100 */ V(15, 9, 3), + /* 101 */ V(15, 8, 3), + /* 110 */ V(8, 15, 2), + /* 111 */ V(8, 15, 2), + + /* 0000 0010 ... */ + /* 00 */ V(7, 15, 2), /* 84 */ + /* 01 */ V(15, 7, 2), + /* 10 */ V(6, 15, 2), + /* 11 */ V(15, 6, 2), + + /* 0000 0100 ... */ + /* 00 */ V(5, 15, 2), /* 88 */ + /* 01 */ V(15, 5, 2), + /* 10 */ V(4, 15, 1), + /* 11 */ V(4, 15, 1), + + /* 0000 0101 ... */ + /* 0 */ V(15, 4, 1), /* 92 */ + /* 1 */ V(15, 3, 1), + + /* 0000 0110 ... */ + /* 0000 */ V(15, 0, 1), /* 94 */ + /* 0001 */ V(15, 0, 1), + /* 0010 */ V(15, 0, 1), + /* 0011 */ V(15, 0, 1), + /* 0100 */ V(15, 0, 1), + /* 0101 */ V(15, 0, 1), + /* 0110 */ V(15, 0, 1), + /* 0111 */ V(15, 0, 1), + /* 1000 */ V(3, 15, 2), + /* 1001 */ V(3, 15, 2), + /* 1010 */ V(3, 15, 2), + /* 1011 */ V(3, 15, 2), + /* 1100 */ PTR(294, 4), + /* 1101 */ PTR(310, 3), + /* 1110 */ PTR(318, 3), + /* 1111 */ PTR(326, 3), + + /* 0000 1000 ... */ + /* 0 */ V(2, 15, 1), /* 110 */ + /* 1 */ V(0, 15, 1), + + /* 0000 1011 ... */ + /* 0000 */ PTR(334, 2), /* 112 */ + /* 0001 */ PTR(338, 2), + /* 0010 */ PTR(342, 2), + /* 0011 */ PTR(346, 1), + /* 0100 */ PTR(348, 2), + /* 0101 */ PTR(352, 2), + /* 0110 */ PTR(356, 1), + /* 0111 */ PTR(358, 2), + /* 1000 */ PTR(362, 2), + /* 1001 */ PTR(366, 2), + /* 1010 */ PTR(370, 2), + /* 1011 */ V(14, 3, 4), + /* 1100 */ PTR(374, 1), + /* 1101 */ PTR(376, 1), + /* 1110 */ PTR(378, 1), + /* 1111 */ PTR(380, 1), + + /* 0000 1100 ... */ + /* 0000 */ PTR(382, 1), /* 128 */ + /* 0001 */ PTR(384, 1), + /* 0010 */ PTR(386, 1), + /* 0011 */ V(0, 13, 4), + /* 0100 */ PTR(388, 1), + /* 0101 */ PTR(390, 1), + /* 0110 */ PTR(392, 1), + /* 0111 */ V(3, 12, 4), + /* 1000 */ PTR(394, 1), + /* 1001 */ V(1, 12, 4), + /* 1010 */ V(12, 0, 4), + /* 1011 */ PTR(396, 1), + /* 1100 */ V(14, 2, 3), + /* 1101 */ V(14, 2, 3), + /* 1110 */ V(2, 14, 4), + /* 1111 */ V(1, 14, 4), + + /* 0000 1101 ... */ + /* 0000 */ V(13, 3, 4), /* 144 */ + /* 0001 */ V(2, 13, 4), + /* 0010 */ V(13, 2, 4), + /* 0011 */ V(13, 1, 4), + /* 0100 */ V(3, 11, 4), + /* 0101 */ PTR(398, 1), + /* 0110 */ V(1, 13, 3), + /* 0111 */ V(1, 13, 3), + /* 1000 */ V(12, 4, 4), + /* 1001 */ V(6, 11, 4), + /* 1010 */ V(12, 3, 4), + /* 1011 */ V(10, 7, 4), + /* 1100 */ V(2, 12, 3), + /* 1101 */ V(2, 12, 3), + /* 1110 */ V(12, 2, 4), + /* 1111 */ V(11, 5, 4), + + /* 0000 1110 ... */ + /* 0000 */ V(12, 1, 4), /* 160 */ + /* 0001 */ V(0, 12, 4), + /* 0010 */ V(4, 11, 4), + /* 0011 */ V(11, 4, 4), + /* 0100 */ V(6, 10, 4), + /* 0101 */ V(10, 6, 4), + /* 0110 */ V(11, 3, 3), + /* 0111 */ V(11, 3, 3), + /* 1000 */ V(5, 10, 4), + /* 1001 */ V(10, 5, 4), + /* 1010 */ V(2, 11, 3), + /* 1011 */ V(2, 11, 3), + /* 1100 */ V(11, 2, 3), + /* 1101 */ V(11, 2, 3), + /* 1110 */ V(1, 11, 3), + /* 1111 */ V(1, 11, 3), + + /* 0000 1111 ... */ + /* 0000 */ V(11, 1, 3), /* 176 */ + /* 0001 */ V(11, 1, 3), + /* 0010 */ V(0, 11, 4), + /* 0011 */ V(11, 0, 4), + /* 0100 */ V(6, 9, 4), + /* 0101 */ V(9, 6, 4), + /* 0110 */ V(4, 10, 4), + /* 0111 */ V(10, 4, 4), + /* 1000 */ V(7, 8, 4), + /* 1001 */ V(8, 7, 4), + /* 1010 */ V(10, 3, 3), + /* 1011 */ V(10, 3, 3), + /* 1100 */ V(3, 10, 4), + /* 1101 */ V(5, 9, 4), + /* 1110 */ V(2, 10, 3), + /* 1111 */ V(2, 10, 3), + + /* 0001 0000 ... */ + /* 0000 */ V(9, 5, 4), /* 192 */ + /* 0001 */ V(6, 8, 4), + /* 0010 */ V(10, 1, 3), + /* 0011 */ V(10, 1, 3), + /* 0100 */ V(8, 6, 4), + /* 0101 */ V(7, 7, 4), + /* 0110 */ V(9, 4, 3), + /* 0111 */ V(9, 4, 3), + /* 1000 */ V(4, 9, 4), + /* 1001 */ V(5, 7, 4), + /* 1010 */ V(6, 7, 3), + /* 1011 */ V(6, 7, 3), + /* 1100 */ V(10, 2, 2), + /* 1101 */ V(10, 2, 2), + /* 1110 */ V(10, 2, 2), + /* 1111 */ V(10, 2, 2), + + /* 0001 0001 ... */ + /* 000 */ V(1, 10, 2), /* 208 */ + /* 001 */ V(1, 10, 2), + /* 010 */ V(0, 10, 3), + /* 011 */ V(10, 0, 3), + /* 100 */ V(3, 9, 3), + /* 101 */ V(9, 3, 3), + /* 110 */ V(5, 8, 3), + /* 111 */ V(8, 5, 3), + + /* 0001 0010 ... */ + /* 000 */ V(2, 9, 2), /* 216 */ + /* 001 */ V(2, 9, 2), + /* 010 */ V(9, 2, 2), + /* 011 */ V(9, 2, 2), + /* 100 */ V(7, 6, 3), + /* 101 */ V(0, 9, 3), + /* 110 */ V(1, 9, 2), + /* 111 */ V(1, 9, 2), + + /* 0001 0011 ... */ + /* 000 */ V(9, 1, 2), /* 224 */ + /* 001 */ V(9, 1, 2), + /* 010 */ V(9, 0, 3), + /* 011 */ V(4, 8, 3), + /* 100 */ V(8, 4, 3), + /* 101 */ V(7, 5, 3), + /* 110 */ V(3, 8, 3), + /* 111 */ V(8, 3, 3), + + /* 0001 0100 ... */ + /* 000 */ V(6, 6, 3), /* 232 */ + /* 001 */ V(2, 8, 3), + /* 010 */ V(8, 2, 2), + /* 011 */ V(8, 2, 2), + /* 100 */ V(4, 7, 3), + /* 101 */ V(7, 4, 3), + /* 110 */ V(1, 8, 2), + /* 111 */ V(1, 8, 2), + + /* 0001 0101 ... */ + /* 000 */ V(8, 1, 2), /* 240 */ + /* 001 */ V(8, 1, 2), + /* 010 */ V(8, 0, 2), + /* 011 */ V(8, 0, 2), + /* 100 */ V(0, 8, 3), + /* 101 */ V(5, 6, 3), + /* 110 */ V(3, 7, 2), + /* 111 */ V(3, 7, 2), + + /* 0001 0110 ... */ + /* 000 */ V(7, 3, 2), /* 248 */ + /* 001 */ V(7, 3, 2), + /* 010 */ V(6, 5, 3), + /* 011 */ V(4, 6, 3), + /* 100 */ V(2, 7, 2), + /* 101 */ V(2, 7, 2), + /* 110 */ V(7, 2, 2), + /* 111 */ V(7, 2, 2), + + /* 0001 0111 ... */ + /* 000 */ V(6, 4, 3), /* 256 */ + /* 001 */ V(5, 5, 3), + /* 010 */ V(0, 7, 2), + /* 011 */ V(0, 7, 2), + /* 100 */ V(1, 7, 1), + /* 101 */ V(1, 7, 1), + /* 110 */ V(1, 7, 1), + /* 111 */ V(1, 7, 1), + + /* 0001 1000 ... */ + /* 00 */ V(7, 1, 1), /* 264 */ + /* 01 */ V(7, 1, 1), + /* 10 */ V(7, 0, 2), + /* 11 */ V(3, 6, 2), + + /* 0001 1001 ... */ + /* 00 */ V(6, 3, 2), /* 268 */ + /* 01 */ V(4, 5, 2), + /* 10 */ V(5, 4, 2), + /* 11 */ V(2, 6, 2), + + /* 0001 1010 ... */ + /* 0 */ V(6, 2, 1), /* 272 */ + /* 1 */ V(1, 6, 1), + + /* 0001 1011 ... */ + /* 00 */ V(6, 1, 1), /* 274 */ + /* 01 */ V(6, 1, 1), + /* 10 */ V(0, 6, 2), + /* 11 */ V(6, 0, 2), + + /* 0001 1100 ... */ + /* 00 */ V(5, 3, 1), /* 278 */ + /* 01 */ V(5, 3, 1), + /* 10 */ V(3, 5, 2), + /* 11 */ V(4, 4, 2), + + /* 0001 1101 ... */ + /* 0 */ V(2, 5, 1), /* 282 */ + /* 1 */ V(5, 2, 1), + + /* 0001 1111 ... */ + /* 0 */ V(1, 5, 1), /* 284 */ + /* 1 */ V(0, 5, 1), + + /* 0010 0000 ... */ + /* 0 */ V(3, 4, 1), /* 286 */ + /* 1 */ V(4, 3, 1), + + /* 0010 0001 ... */ + /* 0 */ V(5, 0, 1), /* 288 */ + /* 1 */ V(2, 4, 1), + + /* 0010 0010 ... */ + /* 0 */ V(4, 2, 1), /* 290 */ + /* 1 */ V(3, 3, 1), + + /* 0010 0101 ... */ + /* 0 */ V(0, 4, 1), /* 292 */ + /* 1 */ V(4, 0, 1), + + /* 0000 0110 1100 ... */ + /* 0000 */ V(12, 14, 4), /* 294 */ + /* 0001 */ PTR(400, 1), + /* 0010 */ V(13, 14, 3), + /* 0011 */ V(13, 14, 3), + /* 0100 */ V(14, 9, 3), + /* 0101 */ V(14, 9, 3), + /* 0110 */ V(14, 10, 4), + /* 0111 */ V(13, 9, 4), + /* 1000 */ V(14, 14, 2), + /* 1001 */ V(14, 14, 2), + /* 1010 */ V(14, 14, 2), + /* 1011 */ V(14, 14, 2), + /* 1100 */ V(14, 13, 3), + /* 1101 */ V(14, 13, 3), + /* 1110 */ V(14, 11, 3), + /* 1111 */ V(14, 11, 3), + + /* 0000 0110 1101 ... */ + /* 000 */ V(11, 14, 2), /* 310 */ + /* 001 */ V(11, 14, 2), + /* 010 */ V(12, 13, 2), + /* 011 */ V(12, 13, 2), + /* 100 */ V(13, 12, 3), + /* 101 */ V(13, 11, 3), + /* 110 */ V(10, 14, 2), + /* 111 */ V(10, 14, 2), + + /* 0000 0110 1110 ... */ + /* 000 */ V(12, 12, 2), /* 318 */ + /* 001 */ V(12, 12, 2), + /* 010 */ V(10, 13, 3), + /* 011 */ V(13, 10, 3), + /* 100 */ V(7, 14, 3), + /* 101 */ V(10, 12, 3), + /* 110 */ V(12, 10, 2), + /* 111 */ V(12, 10, 2), + + /* 0000 0110 1111 ... */ + /* 000 */ V(12, 9, 3), /* 326 */ + /* 001 */ V(7, 13, 3), + /* 010 */ V(5, 14, 2), + /* 011 */ V(5, 14, 2), + /* 100 */ V(11, 13, 1), + /* 101 */ V(11, 13, 1), + /* 110 */ V(11, 13, 1), + /* 111 */ V(11, 13, 1), + + /* 0000 1011 0000 ... */ + /* 00 */ V(9, 14, 1), /* 334 */ + /* 01 */ V(9, 14, 1), + /* 10 */ V(11, 12, 2), + /* 11 */ V(12, 11, 2), + + /* 0000 1011 0001 ... */ + /* 00 */ V(8, 14, 2), /* 338 */ + /* 01 */ V(14, 8, 2), + /* 10 */ V(9, 13, 2), + /* 11 */ V(14, 7, 2), + + /* 0000 1011 0010 ... */ + /* 00 */ V(11, 11, 2), /* 342 */ + /* 01 */ V(8, 13, 2), + /* 10 */ V(13, 8, 2), + /* 11 */ V(6, 14, 2), + + /* 0000 1011 0011 ... */ + /* 0 */ V(14, 6, 1), /* 346 */ + /* 1 */ V(9, 12, 1), + + /* 0000 1011 0100 ... */ + /* 00 */ V(10, 11, 2), /* 348 */ + /* 01 */ V(11, 10, 2), + /* 10 */ V(14, 5, 2), + /* 11 */ V(13, 7, 2), + + /* 0000 1011 0101 ... */ + /* 00 */ V(4, 14, 1), /* 352 */ + /* 01 */ V(4, 14, 1), + /* 10 */ V(14, 4, 2), + /* 11 */ V(8, 12, 2), + + /* 0000 1011 0110 ... */ + /* 0 */ V(12, 8, 1), /* 356 */ + /* 1 */ V(3, 14, 1), + + /* 0000 1011 0111 ... */ + /* 00 */ V(6, 13, 1), /* 358 */ + /* 01 */ V(6, 13, 1), + /* 10 */ V(13, 6, 2), + /* 11 */ V(9, 11, 2), + + /* 0000 1011 1000 ... */ + /* 00 */ V(11, 9, 2), /* 362 */ + /* 01 */ V(10, 10, 2), + /* 10 */ V(14, 1, 1), + /* 11 */ V(14, 1, 1), + + /* 0000 1011 1001 ... */ + /* 00 */ V(13, 4, 1), /* 366 */ + /* 01 */ V(13, 4, 1), + /* 10 */ V(11, 8, 2), + /* 11 */ V(10, 9, 2), + + /* 0000 1011 1010 ... */ + /* 00 */ V(7, 11, 1), /* 370 */ + /* 01 */ V(7, 11, 1), + /* 10 */ V(11, 7, 2), + /* 11 */ V(13, 0, 2), + + /* 0000 1011 1100 ... */ + /* 0 */ V(0, 14, 1), /* 374 */ + /* 1 */ V(14, 0, 1), + + /* 0000 1011 1101 ... */ + /* 0 */ V(5, 13, 1), /* 376 */ + /* 1 */ V(13, 5, 1), + + /* 0000 1011 1110 ... */ + /* 0 */ V(7, 12, 1), /* 378 */ + /* 1 */ V(12, 7, 1), + + /* 0000 1011 1111 ... */ + /* 0 */ V(4, 13, 1), /* 380 */ + /* 1 */ V(8, 11, 1), + + /* 0000 1100 0000 ... */ + /* 0 */ V(9, 10, 1), /* 382 */ + /* 1 */ V(6, 12, 1), + + /* 0000 1100 0001 ... */ + /* 0 */ V(12, 6, 1), /* 384 */ + /* 1 */ V(3, 13, 1), + + /* 0000 1100 0010 ... */ + /* 0 */ V(5, 12, 1), /* 386 */ + /* 1 */ V(12, 5, 1), + + /* 0000 1100 0100 ... */ + /* 0 */ V(8, 10, 1), /* 388 */ + /* 1 */ V(10, 8, 1), + + /* 0000 1100 0101 ... */ + /* 0 */ V(9, 9, 1), /* 390 */ + /* 1 */ V(4, 12, 1), + + /* 0000 1100 0110 ... */ + /* 0 */ V(11, 6, 1), /* 392 */ + /* 1 */ V(7, 10, 1), + + /* 0000 1100 1000 ... */ + /* 0 */ V(5, 11, 1), /* 394 */ + /* 1 */ V(8, 9, 1), + + /* 0000 1100 1011 ... */ + /* 0 */ V(9, 8, 1), /* 396 */ + /* 1 */ V(7, 9, 1), + + /* 0000 1101 0101 ... */ + /* 0 */ V(9, 7, 1), /* 398 */ + /* 1 */ V(8, 8, 1), + + /* 0000 0110 1100 0001 ... */ + /* 0 */ V(14, 12, 1), /* 400 */ + /* 1 */ V(13, 13, 1) }; static union huffpair const hufftab24[] PROGMEM = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ V(15, 15, 4), - /* 0100 */ PTR(64, 4), - /* 0101 */ PTR(80, 4), - /* 0110 */ PTR(96, 4), - /* 0111 */ PTR(112, 4), - /* 1000 */ PTR(128, 4), - /* 1001 */ PTR(144, 4), - /* 1010 */ PTR(160, 3), - /* 1011 */ PTR(168, 2), - /* 1100 */ V(1, 1, 4), - /* 1101 */ V(0, 1, 4), - /* 1110 */ V(1, 0, 4), - /* 1111 */ V(0, 0, 4), - - /* 0000 ... */ - /* 0000 */ V(14, 15, 4), /* 16 */ - /* 0001 */ V(15, 14, 4), - /* 0010 */ V(13, 15, 4), - /* 0011 */ V(15, 13, 4), - /* 0100 */ V(12, 15, 4), - /* 0101 */ V(15, 12, 4), - /* 0110 */ V(11, 15, 4), - /* 0111 */ V(15, 11, 4), - /* 1000 */ V(15, 10, 3), - /* 1001 */ V(15, 10, 3), - /* 1010 */ V(10, 15, 4), - /* 1011 */ V(9, 15, 4), - /* 1100 */ V(15, 9, 3), - /* 1101 */ V(15, 9, 3), - /* 1110 */ V(15, 8, 3), - /* 1111 */ V(15, 8, 3), - - /* 0001 ... */ - /* 0000 */ V(8, 15, 4), /* 32 */ - /* 0001 */ V(7, 15, 4), - /* 0010 */ V(15, 7, 3), - /* 0011 */ V(15, 7, 3), - /* 0100 */ V(6, 15, 3), - /* 0101 */ V(6, 15, 3), - /* 0110 */ V(15, 6, 3), - /* 0111 */ V(15, 6, 3), - /* 1000 */ V(5, 15, 3), - /* 1001 */ V(5, 15, 3), - /* 1010 */ V(15, 5, 3), - /* 1011 */ V(15, 5, 3), - /* 1100 */ V(4, 15, 3), - /* 1101 */ V(4, 15, 3), - /* 1110 */ V(15, 4, 3), - /* 1111 */ V(15, 4, 3), - - /* 0010 ... */ - /* 0000 */ V(3, 15, 3), /* 48 */ - /* 0001 */ V(3, 15, 3), - /* 0010 */ V(15, 3, 3), - /* 0011 */ V(15, 3, 3), - /* 0100 */ V(2, 15, 3), - /* 0101 */ V(2, 15, 3), - /* 0110 */ V(15, 2, 3), - /* 0111 */ V(15, 2, 3), - /* 1000 */ V(15, 1, 3), - /* 1001 */ V(15, 1, 3), - /* 1010 */ V(1, 15, 4), - /* 1011 */ V(15, 0, 4), - /* 1100 */ PTR(172, 3), - /* 1101 */ PTR(180, 3), - /* 1110 */ PTR(188, 3), - /* 1111 */ PTR(196, 3), - - /* 0100 ... */ - /* 0000 */ PTR(204, 4), /* 64 */ - /* 0001 */ PTR(220, 3), - /* 0010 */ PTR(228, 3), - /* 0011 */ PTR(236, 3), - /* 0100 */ PTR(244, 2), - /* 0101 */ PTR(248, 2), - /* 0110 */ PTR(252, 2), - /* 0111 */ PTR(256, 2), - /* 1000 */ PTR(260, 2), - /* 1001 */ PTR(264, 2), - /* 1010 */ PTR(268, 2), - /* 1011 */ PTR(272, 2), - /* 1100 */ PTR(276, 2), - /* 1101 */ PTR(280, 3), - /* 1110 */ PTR(288, 2), - /* 1111 */ PTR(292, 2), - - /* 0101 ... */ - /* 0000 */ PTR(296, 2), /* 80 */ - /* 0001 */ PTR(300, 3), - /* 0010 */ PTR(308, 2), - /* 0011 */ PTR(312, 3), - /* 0100 */ PTR(320, 1), - /* 0101 */ PTR(322, 2), - /* 0110 */ PTR(326, 2), - /* 0111 */ PTR(330, 1), - /* 1000 */ PTR(332, 2), - /* 1001 */ PTR(336, 1), - /* 1010 */ PTR(338, 1), - /* 1011 */ PTR(340, 1), - /* 1100 */ PTR(342, 1), - /* 1101 */ PTR(344, 1), - /* 1110 */ PTR(346, 1), - /* 1111 */ PTR(348, 1), - - /* 0110 ... */ - /* 0000 */ PTR(350, 1), /* 96 */ - /* 0001 */ PTR(352, 1), - /* 0010 */ PTR(354, 1), - /* 0011 */ PTR(356, 1), - /* 0100 */ PTR(358, 1), - /* 0101 */ PTR(360, 1), - /* 0110 */ PTR(362, 1), - /* 0111 */ PTR(364, 1), - /* 1000 */ PTR(366, 1), - /* 1001 */ PTR(368, 1), - /* 1010 */ PTR(370, 2), - /* 1011 */ PTR(374, 1), - /* 1100 */ PTR(376, 2), - /* 1101 */ V(7, 3, 4), - /* 1110 */ PTR(380, 1), - /* 1111 */ V(7, 2, 4), - - /* 0111 ... */ - /* 0000 */ V(4, 6, 4), /* 112 */ - /* 0001 */ V(6, 4, 4), - /* 0010 */ V(5, 5, 4), - /* 0011 */ V(7, 1, 4), - /* 0100 */ V(3, 6, 4), - /* 0101 */ V(6, 3, 4), - /* 0110 */ V(4, 5, 4), - /* 0111 */ V(5, 4, 4), - /* 1000 */ V(2, 6, 4), - /* 1001 */ V(6, 2, 4), - /* 1010 */ V(1, 6, 4), - /* 1011 */ V(6, 1, 4), - /* 1100 */ PTR(382, 1), - /* 1101 */ V(3, 5, 4), - /* 1110 */ V(5, 3, 4), - /* 1111 */ V(4, 4, 4), - - /* 1000 ... */ - /* 0000 */ V(2, 5, 4), /* 128 */ - /* 0001 */ V(5, 2, 4), - /* 0010 */ V(1, 5, 4), - /* 0011 */ PTR(384, 1), - /* 0100 */ V(5, 1, 3), - /* 0101 */ V(5, 1, 3), - /* 0110 */ V(3, 4, 4), - /* 0111 */ V(4, 3, 4), - /* 1000 */ V(2, 4, 3), - /* 1001 */ V(2, 4, 3), - /* 1010 */ V(4, 2, 3), - /* 1011 */ V(4, 2, 3), - /* 1100 */ V(3, 3, 3), - /* 1101 */ V(3, 3, 3), - /* 1110 */ V(1, 4, 3), - /* 1111 */ V(1, 4, 3), - - /* 1001 ... */ - /* 0000 */ V(4, 1, 3), /* 144 */ - /* 0001 */ V(4, 1, 3), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 3), - /* 0101 */ V(2, 3, 3), - /* 0110 */ V(3, 2, 3), - /* 0111 */ V(3, 2, 3), - /* 1000 */ V(1, 3, 2), - /* 1001 */ V(1, 3, 2), - /* 1010 */ V(1, 3, 2), - /* 1011 */ V(1, 3, 2), - /* 1100 */ V(3, 1, 2), - /* 1101 */ V(3, 1, 2), - /* 1110 */ V(3, 1, 2), - /* 1111 */ V(3, 1, 2), - - /* 1010 ... */ - /* 000 */ V(0, 3, 3), /* 160 */ - /* 001 */ V(3, 0, 3), - /* 010 */ V(2, 2, 2), - /* 011 */ V(2, 2, 2), - /* 100 */ V(1, 2, 1), - /* 101 */ V(1, 2, 1), - /* 110 */ V(1, 2, 1), - /* 111 */ V(1, 2, 1), - - /* 1011 ... */ - /* 00 */ V(2, 1, 1), /* 168 */ - /* 01 */ V(2, 1, 1), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0010 1100 ... */ - /* 000 */ V(0, 15, 1), /* 172 */ - /* 001 */ V(0, 15, 1), - /* 010 */ V(0, 15, 1), - /* 011 */ V(0, 15, 1), - /* 100 */ V(14, 14, 3), - /* 101 */ V(13, 14, 3), - /* 110 */ V(14, 13, 3), - /* 111 */ V(12, 14, 3), - - /* 0010 1101 ... */ - /* 000 */ V(14, 12, 3), /* 180 */ - /* 001 */ V(13, 13, 3), - /* 010 */ V(11, 14, 3), - /* 011 */ V(14, 11, 3), - /* 100 */ V(12, 13, 3), - /* 101 */ V(13, 12, 3), - /* 110 */ V(10, 14, 3), - /* 111 */ V(14, 10, 3), - - /* 0010 1110 ... */ - /* 000 */ V(11, 13, 3), /* 188 */ - /* 001 */ V(13, 11, 3), - /* 010 */ V(12, 12, 3), - /* 011 */ V(9, 14, 3), - /* 100 */ V(14, 9, 3), - /* 101 */ V(10, 13, 3), - /* 110 */ V(13, 10, 3), - /* 111 */ V(11, 12, 3), - - /* 0010 1111 ... */ - /* 000 */ V(12, 11, 3), /* 196 */ - /* 001 */ V(8, 14, 3), - /* 010 */ V(14, 8, 3), - /* 011 */ V(9, 13, 3), - /* 100 */ V(13, 9, 3), - /* 101 */ V(7, 14, 3), - /* 110 */ V(14, 7, 3), - /* 111 */ V(10, 12, 3), - - /* 0100 0000 ... */ - /* 0000 */ V(12, 10, 3), /* 204 */ - /* 0001 */ V(12, 10, 3), - /* 0010 */ V(11, 11, 3), - /* 0011 */ V(11, 11, 3), - /* 0100 */ V(8, 13, 3), - /* 0101 */ V(8, 13, 3), - /* 0110 */ V(13, 8, 3), - /* 0111 */ V(13, 8, 3), - /* 1000 */ V(0, 14, 4), - /* 1001 */ V(14, 0, 4), - /* 1010 */ V(0, 13, 3), - /* 1011 */ V(0, 13, 3), - /* 1100 */ V(14, 6, 2), - /* 1101 */ V(14, 6, 2), - /* 1110 */ V(14, 6, 2), - /* 1111 */ V(14, 6, 2), - - /* 0100 0001 ... */ - /* 000 */ V(6, 14, 3), /* 220 */ - /* 001 */ V(9, 12, 3), - /* 010 */ V(12, 9, 2), - /* 011 */ V(12, 9, 2), - /* 100 */ V(5, 14, 2), - /* 101 */ V(5, 14, 2), - /* 110 */ V(11, 10, 2), - /* 111 */ V(11, 10, 2), - - /* 0100 0010 ... */ - /* 000 */ V(14, 5, 2), /* 228 */ - /* 001 */ V(14, 5, 2), - /* 010 */ V(10, 11, 3), - /* 011 */ V(7, 13, 3), - /* 100 */ V(13, 7, 2), - /* 101 */ V(13, 7, 2), - /* 110 */ V(14, 4, 2), - /* 111 */ V(14, 4, 2), - - /* 0100 0011 ... */ - /* 000 */ V(8, 12, 2), /* 236 */ - /* 001 */ V(8, 12, 2), - /* 010 */ V(12, 8, 2), - /* 011 */ V(12, 8, 2), - /* 100 */ V(4, 14, 3), - /* 101 */ V(2, 14, 3), - /* 110 */ V(3, 14, 2), - /* 111 */ V(3, 14, 2), - - /* 0100 0100 ... */ - /* 00 */ V(6, 13, 2), /* 244 */ - /* 01 */ V(13, 6, 2), - /* 10 */ V(14, 3, 2), - /* 11 */ V(9, 11, 2), - - /* 0100 0101 ... */ - /* 00 */ V(11, 9, 2), /* 248 */ - /* 01 */ V(10, 10, 2), - /* 10 */ V(14, 2, 2), - /* 11 */ V(1, 14, 2), - - /* 0100 0110 ... */ - /* 00 */ V(14, 1, 2), /* 252 */ - /* 01 */ V(5, 13, 2), - /* 10 */ V(13, 5, 2), - /* 11 */ V(7, 12, 2), - - /* 0100 0111 ... */ - /* 00 */ V(12, 7, 2), /* 256 */ - /* 01 */ V(4, 13, 2), - /* 10 */ V(8, 11, 2), - /* 11 */ V(11, 8, 2), - - /* 0100 1000 ... */ - /* 00 */ V(13, 4, 2), /* 260 */ - /* 01 */ V(9, 10, 2), - /* 10 */ V(10, 9, 2), - /* 11 */ V(6, 12, 2), - - /* 0100 1001 ... */ - /* 00 */ V(12, 6, 2), /* 264 */ - /* 01 */ V(3, 13, 2), - /* 10 */ V(13, 3, 2), - /* 11 */ V(2, 13, 2), - - /* 0100 1010 ... */ - /* 00 */ V(13, 2, 2), /* 268 */ - /* 01 */ V(1, 13, 2), - /* 10 */ V(7, 11, 2), - /* 11 */ V(11, 7, 2), - - /* 0100 1011 ... */ - /* 00 */ V(13, 1, 2), /* 272 */ - /* 01 */ V(5, 12, 2), - /* 10 */ V(12, 5, 2), - /* 11 */ V(8, 10, 2), - - /* 0100 1100 ... */ - /* 00 */ V(10, 8, 2), /* 276 */ - /* 01 */ V(9, 9, 2), - /* 10 */ V(4, 12, 2), - /* 11 */ V(12, 4, 2), - - /* 0100 1101 ... */ - /* 000 */ V(6, 11, 2), /* 280 */ - /* 001 */ V(6, 11, 2), - /* 010 */ V(11, 6, 2), - /* 011 */ V(11, 6, 2), - /* 100 */ V(13, 0, 3), - /* 101 */ V(0, 12, 3), - /* 110 */ V(3, 12, 2), - /* 111 */ V(3, 12, 2), - - /* 0100 1110 ... */ - /* 00 */ V(12, 3, 2), /* 288 */ - /* 01 */ V(7, 10, 2), - /* 10 */ V(10, 7, 2), - /* 11 */ V(2, 12, 2), - - /* 0100 1111 ... */ - /* 00 */ V(12, 2, 2), /* 292 */ - /* 01 */ V(5, 11, 2), - /* 10 */ V(11, 5, 2), - /* 11 */ V(1, 12, 2), - - /* 0101 0000 ... */ - /* 00 */ V(8, 9, 2), /* 296 */ - /* 01 */ V(9, 8, 2), - /* 10 */ V(12, 1, 2), - /* 11 */ V(4, 11, 2), - - /* 0101 0001 ... */ - /* 000 */ V(12, 0, 3), /* 300 */ - /* 001 */ V(0, 11, 3), - /* 010 */ V(3, 11, 2), - /* 011 */ V(3, 11, 2), - /* 100 */ V(11, 0, 3), - /* 101 */ V(0, 10, 3), - /* 110 */ V(1, 10, 2), - /* 111 */ V(1, 10, 2), - - /* 0101 0010 ... */ - /* 00 */ V(11, 4, 1), /* 308 */ - /* 01 */ V(11, 4, 1), - /* 10 */ V(6, 10, 2), - /* 11 */ V(10, 6, 2), - - /* 0101 0011 ... */ - /* 000 */ V(7, 9, 2), /* 312 */ - /* 001 */ V(7, 9, 2), - /* 010 */ V(9, 7, 2), - /* 011 */ V(9, 7, 2), - /* 100 */ V(10, 0, 3), - /* 101 */ V(0, 9, 3), - /* 110 */ V(9, 0, 2), - /* 111 */ V(9, 0, 2), - - /* 0101 0100 ... */ - /* 0 */ V(11, 3, 1), /* 320 */ - /* 1 */ V(8, 8, 1), - - /* 0101 0101 ... */ - /* 00 */ V(2, 11, 2), /* 322 */ - /* 01 */ V(5, 10, 2), - /* 10 */ V(11, 2, 1), - /* 11 */ V(11, 2, 1), - - /* 0101 0110 ... */ - /* 00 */ V(10, 5, 2), /* 326 */ - /* 01 */ V(1, 11, 2), - /* 10 */ V(11, 1, 2), - /* 11 */ V(6, 9, 2), - - /* 0101 0111 ... */ - /* 0 */ V(9, 6, 1), /* 330 */ - /* 1 */ V(10, 4, 1), - - /* 0101 1000 ... */ - /* 00 */ V(4, 10, 2), /* 332 */ - /* 01 */ V(7, 8, 2), - /* 10 */ V(8, 7, 1), - /* 11 */ V(8, 7, 1), - - /* 0101 1001 ... */ - /* 0 */ V(3, 10, 1), /* 336 */ - /* 1 */ V(10, 3, 1), - - /* 0101 1010 ... */ - /* 0 */ V(5, 9, 1), /* 338 */ - /* 1 */ V(9, 5, 1), - - /* 0101 1011 ... */ - /* 0 */ V(2, 10, 1), /* 340 */ - /* 1 */ V(10, 2, 1), - - /* 0101 1100 ... */ - /* 0 */ V(10, 1, 1), /* 342 */ - /* 1 */ V(6, 8, 1), - - /* 0101 1101 ... */ - /* 0 */ V(8, 6, 1), /* 344 */ - /* 1 */ V(7, 7, 1), - - /* 0101 1110 ... */ - /* 0 */ V(4, 9, 1), /* 346 */ - /* 1 */ V(9, 4, 1), - - /* 0101 1111 ... */ - /* 0 */ V(3, 9, 1), /* 348 */ - /* 1 */ V(9, 3, 1), - - /* 0110 0000 ... */ - /* 0 */ V(5, 8, 1), /* 350 */ - /* 1 */ V(8, 5, 1), - - /* 0110 0001 ... */ - /* 0 */ V(2, 9, 1), /* 352 */ - /* 1 */ V(6, 7, 1), - - /* 0110 0010 ... */ - /* 0 */ V(7, 6, 1), /* 354 */ - /* 1 */ V(9, 2, 1), - - /* 0110 0011 ... */ - /* 0 */ V(1, 9, 1), /* 356 */ - /* 1 */ V(9, 1, 1), - - /* 0110 0100 ... */ - /* 0 */ V(4, 8, 1), /* 358 */ - /* 1 */ V(8, 4, 1), - - /* 0110 0101 ... */ - /* 0 */ V(5, 7, 1), /* 360 */ - /* 1 */ V(7, 5, 1), - - /* 0110 0110 ... */ - /* 0 */ V(3, 8, 1), /* 362 */ - /* 1 */ V(8, 3, 1), - - /* 0110 0111 ... */ - /* 0 */ V(6, 6, 1), /* 364 */ - /* 1 */ V(2, 8, 1), - - /* 0110 1000 ... */ - /* 0 */ V(8, 2, 1), /* 366 */ - /* 1 */ V(1, 8, 1), - - /* 0110 1001 ... */ - /* 0 */ V(4, 7, 1), /* 368 */ - /* 1 */ V(7, 4, 1), - - /* 0110 1010 ... */ - /* 00 */ V(8, 1, 1), /* 370 */ - /* 01 */ V(8, 1, 1), - /* 10 */ V(0, 8, 2), - /* 11 */ V(8, 0, 2), - - /* 0110 1011 ... */ - /* 0 */ V(5, 6, 1), /* 374 */ - /* 1 */ V(6, 5, 1), - - /* 0110 1100 ... */ - /* 00 */ V(1, 7, 1), /* 376 */ - /* 01 */ V(1, 7, 1), - /* 10 */ V(0, 7, 2), - /* 11 */ V(7, 0, 2), - - /* 0110 1110 ... */ - /* 0 */ V(3, 7, 1), /* 380 */ - /* 1 */ V(2, 7, 1), - - /* 0111 1100 ... */ - /* 0 */ V(0, 6, 1), /* 382 */ - /* 1 */ V(6, 0, 1), - - /* 1000 0011 ... */ - /* 0 */ V(0, 5, 1), /* 384 */ - /* 1 */ V(5, 0, 1) + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ V(15, 15, 4), + /* 0100 */ PTR(64, 4), + /* 0101 */ PTR(80, 4), + /* 0110 */ PTR(96, 4), + /* 0111 */ PTR(112, 4), + /* 1000 */ PTR(128, 4), + /* 1001 */ PTR(144, 4), + /* 1010 */ PTR(160, 3), + /* 1011 */ PTR(168, 2), + /* 1100 */ V(1, 1, 4), + /* 1101 */ V(0, 1, 4), + /* 1110 */ V(1, 0, 4), + /* 1111 */ V(0, 0, 4), + + /* 0000 ... */ + /* 0000 */ V(14, 15, 4), /* 16 */ + /* 0001 */ V(15, 14, 4), + /* 0010 */ V(13, 15, 4), + /* 0011 */ V(15, 13, 4), + /* 0100 */ V(12, 15, 4), + /* 0101 */ V(15, 12, 4), + /* 0110 */ V(11, 15, 4), + /* 0111 */ V(15, 11, 4), + /* 1000 */ V(15, 10, 3), + /* 1001 */ V(15, 10, 3), + /* 1010 */ V(10, 15, 4), + /* 1011 */ V(9, 15, 4), + /* 1100 */ V(15, 9, 3), + /* 1101 */ V(15, 9, 3), + /* 1110 */ V(15, 8, 3), + /* 1111 */ V(15, 8, 3), + + /* 0001 ... */ + /* 0000 */ V(8, 15, 4), /* 32 */ + /* 0001 */ V(7, 15, 4), + /* 0010 */ V(15, 7, 3), + /* 0011 */ V(15, 7, 3), + /* 0100 */ V(6, 15, 3), + /* 0101 */ V(6, 15, 3), + /* 0110 */ V(15, 6, 3), + /* 0111 */ V(15, 6, 3), + /* 1000 */ V(5, 15, 3), + /* 1001 */ V(5, 15, 3), + /* 1010 */ V(15, 5, 3), + /* 1011 */ V(15, 5, 3), + /* 1100 */ V(4, 15, 3), + /* 1101 */ V(4, 15, 3), + /* 1110 */ V(15, 4, 3), + /* 1111 */ V(15, 4, 3), + + /* 0010 ... */ + /* 0000 */ V(3, 15, 3), /* 48 */ + /* 0001 */ V(3, 15, 3), + /* 0010 */ V(15, 3, 3), + /* 0011 */ V(15, 3, 3), + /* 0100 */ V(2, 15, 3), + /* 0101 */ V(2, 15, 3), + /* 0110 */ V(15, 2, 3), + /* 0111 */ V(15, 2, 3), + /* 1000 */ V(15, 1, 3), + /* 1001 */ V(15, 1, 3), + /* 1010 */ V(1, 15, 4), + /* 1011 */ V(15, 0, 4), + /* 1100 */ PTR(172, 3), + /* 1101 */ PTR(180, 3), + /* 1110 */ PTR(188, 3), + /* 1111 */ PTR(196, 3), + + /* 0100 ... */ + /* 0000 */ PTR(204, 4), /* 64 */ + /* 0001 */ PTR(220, 3), + /* 0010 */ PTR(228, 3), + /* 0011 */ PTR(236, 3), + /* 0100 */ PTR(244, 2), + /* 0101 */ PTR(248, 2), + /* 0110 */ PTR(252, 2), + /* 0111 */ PTR(256, 2), + /* 1000 */ PTR(260, 2), + /* 1001 */ PTR(264, 2), + /* 1010 */ PTR(268, 2), + /* 1011 */ PTR(272, 2), + /* 1100 */ PTR(276, 2), + /* 1101 */ PTR(280, 3), + /* 1110 */ PTR(288, 2), + /* 1111 */ PTR(292, 2), + + /* 0101 ... */ + /* 0000 */ PTR(296, 2), /* 80 */ + /* 0001 */ PTR(300, 3), + /* 0010 */ PTR(308, 2), + /* 0011 */ PTR(312, 3), + /* 0100 */ PTR(320, 1), + /* 0101 */ PTR(322, 2), + /* 0110 */ PTR(326, 2), + /* 0111 */ PTR(330, 1), + /* 1000 */ PTR(332, 2), + /* 1001 */ PTR(336, 1), + /* 1010 */ PTR(338, 1), + /* 1011 */ PTR(340, 1), + /* 1100 */ PTR(342, 1), + /* 1101 */ PTR(344, 1), + /* 1110 */ PTR(346, 1), + /* 1111 */ PTR(348, 1), + + /* 0110 ... */ + /* 0000 */ PTR(350, 1), /* 96 */ + /* 0001 */ PTR(352, 1), + /* 0010 */ PTR(354, 1), + /* 0011 */ PTR(356, 1), + /* 0100 */ PTR(358, 1), + /* 0101 */ PTR(360, 1), + /* 0110 */ PTR(362, 1), + /* 0111 */ PTR(364, 1), + /* 1000 */ PTR(366, 1), + /* 1001 */ PTR(368, 1), + /* 1010 */ PTR(370, 2), + /* 1011 */ PTR(374, 1), + /* 1100 */ PTR(376, 2), + /* 1101 */ V(7, 3, 4), + /* 1110 */ PTR(380, 1), + /* 1111 */ V(7, 2, 4), + + /* 0111 ... */ + /* 0000 */ V(4, 6, 4), /* 112 */ + /* 0001 */ V(6, 4, 4), + /* 0010 */ V(5, 5, 4), + /* 0011 */ V(7, 1, 4), + /* 0100 */ V(3, 6, 4), + /* 0101 */ V(6, 3, 4), + /* 0110 */ V(4, 5, 4), + /* 0111 */ V(5, 4, 4), + /* 1000 */ V(2, 6, 4), + /* 1001 */ V(6, 2, 4), + /* 1010 */ V(1, 6, 4), + /* 1011 */ V(6, 1, 4), + /* 1100 */ PTR(382, 1), + /* 1101 */ V(3, 5, 4), + /* 1110 */ V(5, 3, 4), + /* 1111 */ V(4, 4, 4), + + /* 1000 ... */ + /* 0000 */ V(2, 5, 4), /* 128 */ + /* 0001 */ V(5, 2, 4), + /* 0010 */ V(1, 5, 4), + /* 0011 */ PTR(384, 1), + /* 0100 */ V(5, 1, 3), + /* 0101 */ V(5, 1, 3), + /* 0110 */ V(3, 4, 4), + /* 0111 */ V(4, 3, 4), + /* 1000 */ V(2, 4, 3), + /* 1001 */ V(2, 4, 3), + /* 1010 */ V(4, 2, 3), + /* 1011 */ V(4, 2, 3), + /* 1100 */ V(3, 3, 3), + /* 1101 */ V(3, 3, 3), + /* 1110 */ V(1, 4, 3), + /* 1111 */ V(1, 4, 3), + + /* 1001 ... */ + /* 0000 */ V(4, 1, 3), /* 144 */ + /* 0001 */ V(4, 1, 3), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 3), + /* 0101 */ V(2, 3, 3), + /* 0110 */ V(3, 2, 3), + /* 0111 */ V(3, 2, 3), + /* 1000 */ V(1, 3, 2), + /* 1001 */ V(1, 3, 2), + /* 1010 */ V(1, 3, 2), + /* 1011 */ V(1, 3, 2), + /* 1100 */ V(3, 1, 2), + /* 1101 */ V(3, 1, 2), + /* 1110 */ V(3, 1, 2), + /* 1111 */ V(3, 1, 2), + + /* 1010 ... */ + /* 000 */ V(0, 3, 3), /* 160 */ + /* 001 */ V(3, 0, 3), + /* 010 */ V(2, 2, 2), + /* 011 */ V(2, 2, 2), + /* 100 */ V(1, 2, 1), + /* 101 */ V(1, 2, 1), + /* 110 */ V(1, 2, 1), + /* 111 */ V(1, 2, 1), + + /* 1011 ... */ + /* 00 */ V(2, 1, 1), /* 168 */ + /* 01 */ V(2, 1, 1), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0010 1100 ... */ + /* 000 */ V(0, 15, 1), /* 172 */ + /* 001 */ V(0, 15, 1), + /* 010 */ V(0, 15, 1), + /* 011 */ V(0, 15, 1), + /* 100 */ V(14, 14, 3), + /* 101 */ V(13, 14, 3), + /* 110 */ V(14, 13, 3), + /* 111 */ V(12, 14, 3), + + /* 0010 1101 ... */ + /* 000 */ V(14, 12, 3), /* 180 */ + /* 001 */ V(13, 13, 3), + /* 010 */ V(11, 14, 3), + /* 011 */ V(14, 11, 3), + /* 100 */ V(12, 13, 3), + /* 101 */ V(13, 12, 3), + /* 110 */ V(10, 14, 3), + /* 111 */ V(14, 10, 3), + + /* 0010 1110 ... */ + /* 000 */ V(11, 13, 3), /* 188 */ + /* 001 */ V(13, 11, 3), + /* 010 */ V(12, 12, 3), + /* 011 */ V(9, 14, 3), + /* 100 */ V(14, 9, 3), + /* 101 */ V(10, 13, 3), + /* 110 */ V(13, 10, 3), + /* 111 */ V(11, 12, 3), + + /* 0010 1111 ... */ + /* 000 */ V(12, 11, 3), /* 196 */ + /* 001 */ V(8, 14, 3), + /* 010 */ V(14, 8, 3), + /* 011 */ V(9, 13, 3), + /* 100 */ V(13, 9, 3), + /* 101 */ V(7, 14, 3), + /* 110 */ V(14, 7, 3), + /* 111 */ V(10, 12, 3), + + /* 0100 0000 ... */ + /* 0000 */ V(12, 10, 3), /* 204 */ + /* 0001 */ V(12, 10, 3), + /* 0010 */ V(11, 11, 3), + /* 0011 */ V(11, 11, 3), + /* 0100 */ V(8, 13, 3), + /* 0101 */ V(8, 13, 3), + /* 0110 */ V(13, 8, 3), + /* 0111 */ V(13, 8, 3), + /* 1000 */ V(0, 14, 4), + /* 1001 */ V(14, 0, 4), + /* 1010 */ V(0, 13, 3), + /* 1011 */ V(0, 13, 3), + /* 1100 */ V(14, 6, 2), + /* 1101 */ V(14, 6, 2), + /* 1110 */ V(14, 6, 2), + /* 1111 */ V(14, 6, 2), + + /* 0100 0001 ... */ + /* 000 */ V(6, 14, 3), /* 220 */ + /* 001 */ V(9, 12, 3), + /* 010 */ V(12, 9, 2), + /* 011 */ V(12, 9, 2), + /* 100 */ V(5, 14, 2), + /* 101 */ V(5, 14, 2), + /* 110 */ V(11, 10, 2), + /* 111 */ V(11, 10, 2), + + /* 0100 0010 ... */ + /* 000 */ V(14, 5, 2), /* 228 */ + /* 001 */ V(14, 5, 2), + /* 010 */ V(10, 11, 3), + /* 011 */ V(7, 13, 3), + /* 100 */ V(13, 7, 2), + /* 101 */ V(13, 7, 2), + /* 110 */ V(14, 4, 2), + /* 111 */ V(14, 4, 2), + + /* 0100 0011 ... */ + /* 000 */ V(8, 12, 2), /* 236 */ + /* 001 */ V(8, 12, 2), + /* 010 */ V(12, 8, 2), + /* 011 */ V(12, 8, 2), + /* 100 */ V(4, 14, 3), + /* 101 */ V(2, 14, 3), + /* 110 */ V(3, 14, 2), + /* 111 */ V(3, 14, 2), + + /* 0100 0100 ... */ + /* 00 */ V(6, 13, 2), /* 244 */ + /* 01 */ V(13, 6, 2), + /* 10 */ V(14, 3, 2), + /* 11 */ V(9, 11, 2), + + /* 0100 0101 ... */ + /* 00 */ V(11, 9, 2), /* 248 */ + /* 01 */ V(10, 10, 2), + /* 10 */ V(14, 2, 2), + /* 11 */ V(1, 14, 2), + + /* 0100 0110 ... */ + /* 00 */ V(14, 1, 2), /* 252 */ + /* 01 */ V(5, 13, 2), + /* 10 */ V(13, 5, 2), + /* 11 */ V(7, 12, 2), + + /* 0100 0111 ... */ + /* 00 */ V(12, 7, 2), /* 256 */ + /* 01 */ V(4, 13, 2), + /* 10 */ V(8, 11, 2), + /* 11 */ V(11, 8, 2), + + /* 0100 1000 ... */ + /* 00 */ V(13, 4, 2), /* 260 */ + /* 01 */ V(9, 10, 2), + /* 10 */ V(10, 9, 2), + /* 11 */ V(6, 12, 2), + + /* 0100 1001 ... */ + /* 00 */ V(12, 6, 2), /* 264 */ + /* 01 */ V(3, 13, 2), + /* 10 */ V(13, 3, 2), + /* 11 */ V(2, 13, 2), + + /* 0100 1010 ... */ + /* 00 */ V(13, 2, 2), /* 268 */ + /* 01 */ V(1, 13, 2), + /* 10 */ V(7, 11, 2), + /* 11 */ V(11, 7, 2), + + /* 0100 1011 ... */ + /* 00 */ V(13, 1, 2), /* 272 */ + /* 01 */ V(5, 12, 2), + /* 10 */ V(12, 5, 2), + /* 11 */ V(8, 10, 2), + + /* 0100 1100 ... */ + /* 00 */ V(10, 8, 2), /* 276 */ + /* 01 */ V(9, 9, 2), + /* 10 */ V(4, 12, 2), + /* 11 */ V(12, 4, 2), + + /* 0100 1101 ... */ + /* 000 */ V(6, 11, 2), /* 280 */ + /* 001 */ V(6, 11, 2), + /* 010 */ V(11, 6, 2), + /* 011 */ V(11, 6, 2), + /* 100 */ V(13, 0, 3), + /* 101 */ V(0, 12, 3), + /* 110 */ V(3, 12, 2), + /* 111 */ V(3, 12, 2), + + /* 0100 1110 ... */ + /* 00 */ V(12, 3, 2), /* 288 */ + /* 01 */ V(7, 10, 2), + /* 10 */ V(10, 7, 2), + /* 11 */ V(2, 12, 2), + + /* 0100 1111 ... */ + /* 00 */ V(12, 2, 2), /* 292 */ + /* 01 */ V(5, 11, 2), + /* 10 */ V(11, 5, 2), + /* 11 */ V(1, 12, 2), + + /* 0101 0000 ... */ + /* 00 */ V(8, 9, 2), /* 296 */ + /* 01 */ V(9, 8, 2), + /* 10 */ V(12, 1, 2), + /* 11 */ V(4, 11, 2), + + /* 0101 0001 ... */ + /* 000 */ V(12, 0, 3), /* 300 */ + /* 001 */ V(0, 11, 3), + /* 010 */ V(3, 11, 2), + /* 011 */ V(3, 11, 2), + /* 100 */ V(11, 0, 3), + /* 101 */ V(0, 10, 3), + /* 110 */ V(1, 10, 2), + /* 111 */ V(1, 10, 2), + + /* 0101 0010 ... */ + /* 00 */ V(11, 4, 1), /* 308 */ + /* 01 */ V(11, 4, 1), + /* 10 */ V(6, 10, 2), + /* 11 */ V(10, 6, 2), + + /* 0101 0011 ... */ + /* 000 */ V(7, 9, 2), /* 312 */ + /* 001 */ V(7, 9, 2), + /* 010 */ V(9, 7, 2), + /* 011 */ V(9, 7, 2), + /* 100 */ V(10, 0, 3), + /* 101 */ V(0, 9, 3), + /* 110 */ V(9, 0, 2), + /* 111 */ V(9, 0, 2), + + /* 0101 0100 ... */ + /* 0 */ V(11, 3, 1), /* 320 */ + /* 1 */ V(8, 8, 1), + + /* 0101 0101 ... */ + /* 00 */ V(2, 11, 2), /* 322 */ + /* 01 */ V(5, 10, 2), + /* 10 */ V(11, 2, 1), + /* 11 */ V(11, 2, 1), + + /* 0101 0110 ... */ + /* 00 */ V(10, 5, 2), /* 326 */ + /* 01 */ V(1, 11, 2), + /* 10 */ V(11, 1, 2), + /* 11 */ V(6, 9, 2), + + /* 0101 0111 ... */ + /* 0 */ V(9, 6, 1), /* 330 */ + /* 1 */ V(10, 4, 1), + + /* 0101 1000 ... */ + /* 00 */ V(4, 10, 2), /* 332 */ + /* 01 */ V(7, 8, 2), + /* 10 */ V(8, 7, 1), + /* 11 */ V(8, 7, 1), + + /* 0101 1001 ... */ + /* 0 */ V(3, 10, 1), /* 336 */ + /* 1 */ V(10, 3, 1), + + /* 0101 1010 ... */ + /* 0 */ V(5, 9, 1), /* 338 */ + /* 1 */ V(9, 5, 1), + + /* 0101 1011 ... */ + /* 0 */ V(2, 10, 1), /* 340 */ + /* 1 */ V(10, 2, 1), + + /* 0101 1100 ... */ + /* 0 */ V(10, 1, 1), /* 342 */ + /* 1 */ V(6, 8, 1), + + /* 0101 1101 ... */ + /* 0 */ V(8, 6, 1), /* 344 */ + /* 1 */ V(7, 7, 1), + + /* 0101 1110 ... */ + /* 0 */ V(4, 9, 1), /* 346 */ + /* 1 */ V(9, 4, 1), + + /* 0101 1111 ... */ + /* 0 */ V(3, 9, 1), /* 348 */ + /* 1 */ V(9, 3, 1), + + /* 0110 0000 ... */ + /* 0 */ V(5, 8, 1), /* 350 */ + /* 1 */ V(8, 5, 1), + + /* 0110 0001 ... */ + /* 0 */ V(2, 9, 1), /* 352 */ + /* 1 */ V(6, 7, 1), + + /* 0110 0010 ... */ + /* 0 */ V(7, 6, 1), /* 354 */ + /* 1 */ V(9, 2, 1), + + /* 0110 0011 ... */ + /* 0 */ V(1, 9, 1), /* 356 */ + /* 1 */ V(9, 1, 1), + + /* 0110 0100 ... */ + /* 0 */ V(4, 8, 1), /* 358 */ + /* 1 */ V(8, 4, 1), + + /* 0110 0101 ... */ + /* 0 */ V(5, 7, 1), /* 360 */ + /* 1 */ V(7, 5, 1), + + /* 0110 0110 ... */ + /* 0 */ V(3, 8, 1), /* 362 */ + /* 1 */ V(8, 3, 1), + + /* 0110 0111 ... */ + /* 0 */ V(6, 6, 1), /* 364 */ + /* 1 */ V(2, 8, 1), + + /* 0110 1000 ... */ + /* 0 */ V(8, 2, 1), /* 366 */ + /* 1 */ V(1, 8, 1), + + /* 0110 1001 ... */ + /* 0 */ V(4, 7, 1), /* 368 */ + /* 1 */ V(7, 4, 1), + + /* 0110 1010 ... */ + /* 00 */ V(8, 1, 1), /* 370 */ + /* 01 */ V(8, 1, 1), + /* 10 */ V(0, 8, 2), + /* 11 */ V(8, 0, 2), + + /* 0110 1011 ... */ + /* 0 */ V(5, 6, 1), /* 374 */ + /* 1 */ V(6, 5, 1), + + /* 0110 1100 ... */ + /* 00 */ V(1, 7, 1), /* 376 */ + /* 01 */ V(1, 7, 1), + /* 10 */ V(0, 7, 2), + /* 11 */ V(7, 0, 2), + + /* 0110 1110 ... */ + /* 0 */ V(3, 7, 1), /* 380 */ + /* 1 */ V(2, 7, 1), + + /* 0111 1100 ... */ + /* 0 */ V(0, 6, 1), /* 382 */ + /* 1 */ V(6, 0, 1), + + /* 1000 0011 ... */ + /* 0 */ V(0, 5, 1), /* 384 */ + /* 1 */ V(5, 0, 1) }; # undef V @@ -3075,36 +3075,36 @@ union huffpair const hufftab24[] PROGMEM = { union huffquad const *const mad_huff_quad_table[2] PROGMEM = { hufftabA, hufftabB }; struct hufftable const mad_huff_pair_table[32] PROGMEM = { - /* 0 */ { hufftab0, 0, 0 }, - /* 1 */ { hufftab1, 0, 3 }, - /* 2 */ { hufftab2, 0, 3 }, - /* 3 */ { hufftab3, 0, 3 }, - /* 4 */ { 0 /* not used */ }, - /* 5 */ { hufftab5, 0, 3 }, - /* 6 */ { hufftab6, 0, 4 }, - /* 7 */ { hufftab7, 0, 4 }, - /* 8 */ { hufftab8, 0, 4 }, - /* 9 */ { hufftab9, 0, 4 }, - /* 10 */ { hufftab10, 0, 4 }, - /* 11 */ { hufftab11, 0, 4 }, - /* 12 */ { hufftab12, 0, 4 }, - /* 13 */ { hufftab13, 0, 4 }, - /* 14 */ { 0 /* not used */ }, - /* 15 */ { hufftab15, 0, 4 }, - /* 16 */ { hufftab16, 1, 4 }, - /* 17 */ { hufftab16, 2, 4 }, - /* 18 */ { hufftab16, 3, 4 }, - /* 19 */ { hufftab16, 4, 4 }, - /* 20 */ { hufftab16, 6, 4 }, - /* 21 */ { hufftab16, 8, 4 }, - /* 22 */ { hufftab16, 10, 4 }, - /* 23 */ { hufftab16, 13, 4 }, - /* 24 */ { hufftab24, 4, 4 }, - /* 25 */ { hufftab24, 5, 4 }, - /* 26 */ { hufftab24, 6, 4 }, - /* 27 */ { hufftab24, 7, 4 }, - /* 28 */ { hufftab24, 8, 4 }, - /* 29 */ { hufftab24, 9, 4 }, - /* 30 */ { hufftab24, 11, 4 }, - /* 31 */ { hufftab24, 13, 4 } + /* 0 */ { hufftab0, 0, 0 }, + /* 1 */ { hufftab1, 0, 3 }, + /* 2 */ { hufftab2, 0, 3 }, + /* 3 */ { hufftab3, 0, 3 }, + /* 4 */ { 0 /* not used */ }, + /* 5 */ { hufftab5, 0, 3 }, + /* 6 */ { hufftab6, 0, 4 }, + /* 7 */ { hufftab7, 0, 4 }, + /* 8 */ { hufftab8, 0, 4 }, + /* 9 */ { hufftab9, 0, 4 }, + /* 10 */ { hufftab10, 0, 4 }, + /* 11 */ { hufftab11, 0, 4 }, + /* 12 */ { hufftab12, 0, 4 }, + /* 13 */ { hufftab13, 0, 4 }, + /* 14 */ { 0 /* not used */ }, + /* 15 */ { hufftab15, 0, 4 }, + /* 16 */ { hufftab16, 1, 4 }, + /* 17 */ { hufftab16, 2, 4 }, + /* 18 */ { hufftab16, 3, 4 }, + /* 19 */ { hufftab16, 4, 4 }, + /* 20 */ { hufftab16, 6, 4 }, + /* 21 */ { hufftab16, 8, 4 }, + /* 22 */ { hufftab16, 10, 4 }, + /* 23 */ { hufftab16, 13, 4 }, + /* 24 */ { hufftab24, 4, 4 }, + /* 25 */ { hufftab24, 5, 4 }, + /* 26 */ { hufftab24, 6, 4 }, + /* 27 */ { hufftab24, 7, 4 }, + /* 28 */ { hufftab24, 8, 4 }, + /* 29 */ { hufftab24, 9, 4 }, + /* 30 */ { hufftab24, 11, 4 }, + /* 31 */ { hufftab24, 13, 4 } }; diff --git a/src/libmad/huffman.h b/src/libmad/huffman.h index 5d3862e6..725ff91b 100644 --- a/src/libmad/huffman.h +++ b/src/libmad/huffman.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: huffman.h,v 1.11 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: huffman.h,v 1.11 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_HUFFMAN_H # define LIBMAD_HUFFMAN_H @@ -26,41 +26,41 @@ // for easy direct access w/o any helper functions when placed in PROGMEM union huffquad { - struct { - unsigned int final; - unsigned int bits; - unsigned int offset; - } ptr; - struct { - unsigned int final; - unsigned int hlen; - unsigned int v; - unsigned int w; - unsigned int x; - unsigned int y; - } value; - unsigned int final ; + struct { + unsigned int final; + unsigned int bits; + unsigned int offset; + } ptr; + struct { + unsigned int final; + unsigned int hlen; + unsigned int v; + unsigned int w; + unsigned int x; + unsigned int y; + } value; + unsigned int final ; }; union huffpair { - struct { - unsigned int final; - unsigned int bits; - unsigned int offset; - } ptr; - struct { + struct { + unsigned int final; + unsigned int bits; + unsigned int offset; + } ptr; + struct { + unsigned int final; + unsigned int hlen; + unsigned int x; + unsigned int y; + } value; unsigned int final; - unsigned int hlen; - unsigned int x; - unsigned int y; - } value; - unsigned int final; }; struct hufftable { - union huffpair const *table; - unsigned int linbits; - unsigned int startbits; + union huffpair const *table; + unsigned int linbits; + unsigned int startbits; }; extern union huffquad const *const mad_huff_quad_table[2]; diff --git a/src/libmad/imdct_s.dat.h b/src/libmad/imdct_s.dat.h index 476710ea..4e18ec7b 100644 --- a/src/libmad/imdct_s.dat.h +++ b/src/libmad/imdct_s.dat.h @@ -1,62 +1,68 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: imdct_s.dat,v 1.8 2004/01/23 09:41:32 rob Exp $ - */ - - /* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x0216a2a2) /* -0.130526192 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x0cb19346) /* -0.793353340 */ }, - - /* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, - MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, - MAD_F(0x0216a2a2) /* 0.130526192 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x09bd7ca0) /* -0.608761429 */ }, - - /* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x0ec835e8) /* 0.923879533 */ }, - - /* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x061f78aa) /* 0.382683432 */ }, - - /* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x09bd7ca0) /* 0.608761429 */, - -MAD_F(0x0cb19346) /* -0.793353340 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - -MAD_F(0x0fdcf549) /* -0.991444861 */ }, - - /* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x0cb19346) /* -0.793353340 */, - -MAD_F(0x09bd7ca0) /* -0.608761429 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x0216a2a2) /* -0.130526192 */ } + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: imdct_s.dat,v 1.8 2004/01/23 09:41:32 rob Exp $ +*/ + +/* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x0216a2a2) /* -0.130526192 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x0cb19346) /* -0.793353340 */ +}, + +/* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, + MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, + MAD_F(0x0216a2a2) /* 0.130526192 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x09bd7ca0) /* -0.608761429 */ + }, + +/* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x0ec835e8) /* 0.923879533 */ +}, + +/* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x061f78aa) /* 0.382683432 */ + }, + +/* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x09bd7ca0) /* 0.608761429 */, + -MAD_F(0x0cb19346) /* -0.793353340 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + -MAD_F(0x0fdcf549) /* -0.991444861 */ +}, + +/* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x0cb19346) /* -0.793353340 */, + -MAD_F(0x09bd7ca0) /* -0.608761429 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x0216a2a2) /* -0.130526192 */ + } diff --git a/src/libmad/layer3.c b/src/libmad/layer3.c index 66ed7c2e..8376e9f5 100644 --- a/src/libmad/layer3.c +++ b/src/libmad/layer3.c @@ -1,25 +1,26 @@ /* - libmad - MPEG audio decoder library - Copyright (C) 2000-2004 Underbit Technologies, Inc. + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $ + $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $ */ #pragma GCC optimize ("O3") +#pragma GCC diagnostic ignored "-Wstrict-aliasing" #include # include "config.h" @@ -50,237 +51,237 @@ /* --- Layer III ----------------------------------------------------------- */ enum { - count1table_select = 0x01, - scalefac_scale = 0x02, - preflag = 0x04, - mixed_block_flag = 0x08 + count1table_select = 0x01, + scalefac_scale = 0x02, + preflag = 0x04, + mixed_block_flag = 0x08 }; enum { - I_STEREO = 0x1, - MS_STEREO = 0x2 + I_STEREO = 0x1, + MS_STEREO = 0x2 }; struct sideinfo { - unsigned int main_data_begin; - unsigned int private_bits; - - unsigned char scfsi[2]; - - struct granule { - struct channel { - /* from side info */ - unsigned short part2_3_length; - unsigned short big_values; - unsigned short global_gain; - unsigned short scalefac_compress; - - unsigned char flags; - unsigned char block_type; - unsigned char table_select[3]; - unsigned char subblock_gain[3]; - unsigned char region0_count; - unsigned char region1_count; - - /* from main_data */ - unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */ - } ch[2]; - } gr[2]; + unsigned int main_data_begin; + unsigned int private_bits; + + unsigned char scfsi[2]; + + struct granule { + struct channel { + /* from side info */ + unsigned short part2_3_length; + unsigned short big_values; + unsigned short global_gain; + unsigned short scalefac_compress; + + unsigned char flags; + unsigned char block_type; + unsigned char table_select[3]; + unsigned char subblock_gain[3]; + unsigned char region0_count; + unsigned char region1_count; + + /* from main_data */ + unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */ + } ch[2]; + } gr[2]; }; /* - scalefactor bit lengths - derived from section 2.4.2.7 of ISO/IEC 11172-3 + scalefactor bit lengths + derived from section 2.4.2.7 of ISO/IEC 11172-3 */ static struct { - unsigned int slen1; - unsigned int slen2; + unsigned int slen1; + unsigned int slen2; } const sflen_table[16] PROGMEM = { - { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, - { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, - { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } + { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, + { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, + { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } }; /* - number of LSF scalefactor band values - derived from section 2.4.3.2 of ISO/IEC 13818-3 + number of LSF scalefactor band values + derived from section 2.4.3.2 of ISO/IEC 13818-3 */ static unsigned int const nsfb_table[6][3][4] PROGMEM = { - { { 6, 5, 5, 5 }, - { 9, 9, 9, 9 }, - { 6, 9, 9, 9 } - }, - - { { 6, 5, 7, 3 }, - { 9, 9, 12, 6 }, - { 6, 9, 12, 6 } - }, - - { { 11, 10, 0, 0 }, - { 18, 18, 0, 0 }, - { 15, 18, 0, 0 } - }, - - { { 7, 7, 7, 0 }, - { 12, 12, 12, 0 }, - { 6, 15, 12, 0 } - }, - - { { 6, 6, 6, 3 }, - { 12, 9, 9, 6 }, - { 6, 12, 9, 6 } - }, - - { { 8, 8, 5, 0 }, - { 15, 12, 9, 0 }, - { 6, 18, 9, 0 } - } + { { 6, 5, 5, 5 }, + { 9, 9, 9, 9 }, + { 6, 9, 9, 9 } + }, + + { { 6, 5, 7, 3 }, + { 9, 9, 12, 6 }, + { 6, 9, 12, 6 } + }, + + { { 11, 10, 0, 0 }, + { 18, 18, 0, 0 }, + { 15, 18, 0, 0 } + }, + + { { 7, 7, 7, 0 }, + { 12, 12, 12, 0 }, + { 6, 15, 12, 0 } + }, + + { { 6, 6, 6, 3 }, + { 12, 9, 9, 6 }, + { 6, 12, 9, 6 } + }, + + { { 8, 8, 5, 0 }, + { 15, 12, 9, 0 }, + { 6, 18, 9, 0 } + } }; /* - MPEG-1 scalefactor band widths - derived from Table B.8 of ISO/IEC 11172-3 + MPEG-1 scalefactor band widths + derived from Table B.8 of ISO/IEC 11172-3 */ static unsigned int const sfb_48000_long[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, - 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 + 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, + 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 }; static unsigned int const sfb_44100_long[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, - 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 + 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, + 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 }; static unsigned int const sfb_32000_long[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, - 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 + 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, + 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 }; static unsigned int const sfb_48000_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14, - 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14, + 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 }; static unsigned int const sfb_44100_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, - 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, + 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 }; static unsigned int const sfb_32000_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, - 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, + 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 }; static unsigned int const sfb_48000_mixed[] PROGMEM = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, - 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, - 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, + 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, + 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 }; static unsigned int const sfb_44100_mixed[] PROGMEM = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, - 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, + 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 }; static unsigned int const sfb_32000_mixed[] PROGMEM = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, - 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, - 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, + 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, + 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 }; /* - MPEG-2 scalefactor band widths - derived from Table B.2 of ISO/IEC 13818-3 + MPEG-2 scalefactor band widths + derived from Table B.2 of ISO/IEC 13818-3 */ static unsigned int const sfb_24000_long[] PROGMEM = { - 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, - 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 + 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, + 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 }; static unsigned int const sfb_22050_long[] PROGMEM = { - 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, - 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 + 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, + 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 }; # define sfb_16000_long sfb_22050_long static unsigned int const sfb_24000_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, - 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, + 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 }; static unsigned int const sfb_22050_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, - 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, - 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, + 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, + 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 }; static unsigned int const sfb_16000_short[] PROGMEM = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, - 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, + 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 }; static unsigned int const sfb_24000_mixed[] PROGMEM = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, - 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, - 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, + 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, + 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 }; static unsigned int const sfb_22050_mixed[] PROGMEM = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, - 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, - 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, + 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, + 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 }; static unsigned int const sfb_16000_mixed[] PROGMEM = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, - 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, - 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, + 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, + 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 }; /* - MPEG 2.5 scalefactor band widths - derived from public sources + MPEG 2.5 scalefactor band widths + derived from public sources */ # define sfb_12000_long sfb_16000_long # define sfb_11025_long sfb_12000_long static unsigned int const sfb_8000_long[] PROGMEM = { - 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, - 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 + 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, + 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 }; # define sfb_12000_short sfb_16000_short @@ -288,72 +289,70 @@ unsigned int const sfb_8000_long[] PROGMEM = { static unsigned int const sfb_8000_short[] PROGMEM = { - 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, - 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, - 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 + 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, + 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 }; # define sfb_12000_mixed sfb_16000_mixed # define sfb_11025_mixed sfb_12000_mixed -/* the 8000 Hz short block scalefactor bands do not break after - the first 36 frequency lines, so this is probably wrong */ +/* the 8000 Hz short block scalefactor bands do not break after + the first 36 frequency lines, so this is probably wrong */ static unsigned int const sfb_8000_mixed[] PROGMEM = { - /* long */ 12, 12, 12, - /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, - 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 + /* long */ 12, 12, 12, + /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, + 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 }; static struct { - unsigned int const *l; - unsigned int const *s; - unsigned int const *m; + unsigned int const *l; + unsigned int const *s; + unsigned int const *m; } const sfbwidth_table[9] PROGMEM = { - { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, - { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, - { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, - { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, - { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, - { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, - { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, - { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, - { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } + { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, + { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, + { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, + { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, + { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, + { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, + { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, + { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, + { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } }; /* - scalefactor band preemphasis (used only when preflag is set) - derived from Table B.6 of ISO/IEC 11172-3 + scalefactor band preemphasis (used only when preflag is set) + derived from Table B.6 of ISO/IEC 11172-3 */ static unsigned int const pretab[22] PROGMEM = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }; /* - table for requantization + table for requantization - rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) + rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) */ static struct fixedfloat { - unsigned long mantissa : 27; - unsigned short exponent : 5; + unsigned long mantissa : 27; + unsigned short exponent : 5; } const rq_table[8207] PROGMEM = { # include "rq_table.dat.h" }; /* - fractional powers of two - used for requantization and joint stereo decoding + fractional powers of two + used for requantization and joint stereo decoding - root_table[3 + x] = 2^(x/4) + root_table[3 + x] = 2^(x/4) */ -static inline mad_fixed_t root_table(int i) -{ - static mad_fixed_t const root_table_val[7] PROGMEM = { +static mad_fixed_t const root_table_val[7] PROGMEM = { MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, @@ -361,48 +360,47 @@ static inline mad_fixed_t root_table(int i) MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ - }; - volatile uint32_t a = *(uint32_t*)&root_table_val[i]; - return *(mad_fixed_t*)&a; +}; +static inline mad_fixed_t root_table(int i) { + volatile mad_fixed_t a = root_table_val[i]; + return a; } /* - coefficients for aliasing reduction - derived from Table B.9 of ISO/IEC 11172-3 + coefficients for aliasing reduction + derived from Table B.9 of ISO/IEC 11172-3 c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } - cs[i] = 1 / sqrt(1 + c[i]^2) - ca[i] = c[i] / sqrt(1 + c[i]^2) + cs[i] = 1 / sqrt(1 + c[i]^2) + ca[i] = c[i] / sqrt(1 + c[i]^2) */ -static inline mad_fixed_t cs(int i) -{ - static mad_fixed_t const cs_val[8] PROGMEM = { +static mad_fixed_t const cs_val[8] PROGMEM = { +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, - +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, - +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, - +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ - }; - volatile uint32_t a = *(uint32_t*)&cs_val[i]; - return *(mad_fixed_t*)&a; + +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, + +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, + +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ + }; +static inline mad_fixed_t cs(int i) { + volatile mad_fixed_t a = cs_val[i]; + return a; } -static inline mad_fixed_t ca(int i) -{ - static mad_fixed_t const ca_val[8] PROGMEM = { +static mad_fixed_t const ca_val[8] PROGMEM = { -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, - -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, - -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, - -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ - }; - volatile uint32_t a = *(uint32_t*)&ca_val[i]; - return *(mad_fixed_t*)&a; + -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, + -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, + -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ + }; +static inline mad_fixed_t ca(int i) { + volatile mad_fixed_t a = ca_val[i]; + return a; } /* - IMDCT coefficients for short blocks - derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 + IMDCT coefficients for short blocks + derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 - imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) - imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) + imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) + imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) */ static mad_fixed_t const imdct_s[6][6] PROGMEM = { @@ -411,14 +409,12 @@ mad_fixed_t const imdct_s[6][6] PROGMEM = { # if !defined(ASO_IMDCT) /* - windowing coefficients for long blocks - derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 + windowing coefficients for long blocks + derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 - window_l[i] = sin((PI / 36) * (i + 1/2)) + window_l[i] = sin((PI / 36) * (i + 1/2)) */ -static inline mad_fixed_t window_l(int i) -{ - static mad_fixed_t const window_l_val[36] PROGMEM = { +static mad_fixed_t const window_l_val[36] PROGMEM = { MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, @@ -439,42 +435,40 @@ static inline mad_fixed_t window_l(int i) MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, - }; - volatile uint32_t a = *(uint32_t*)&window_l_val[i]; - return *(mad_fixed_t*)&a; +}; +static inline mad_fixed_t window_l(int i) { + volatile mad_fixed_t a = window_l_val[i]; + return *(mad_fixed_t*)&a; } # endif /* ASO_IMDCT */ /* - windowing coefficients for short blocks - derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 + windowing coefficients for short blocks + derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 - window_s[i] = sin((PI / 12) * (i + 1/2)) + window_s[i] = sin((PI / 12) * (i + 1/2)) */ -static inline mad_fixed_t window_s(int i) -{ - static mad_fixed_t const window_s_val[12] PROGMEM = { +static mad_fixed_t const window_s_val[12] PROGMEM = { MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, - }; - volatile uint32_t a = *(uint32_t*)&window_s_val[i]; - return *(mad_fixed_t*)&a; +}; +static inline mad_fixed_t window_s(int i) { + volatile mad_fixed_t a = window_s_val[i]; + return a; } /* - coefficients for intensity stereo processing - derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 + coefficients for intensity stereo processing + derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 - is_ratio[i] = tan(i * (PI / 12)) - is_table[i] = is_ratio[i] / (1 + is_ratio[i]) + is_ratio[i] = tan(i * (PI / 12)) + is_table[i] = is_ratio[i] / (1 + is_ratio[i]) */ -static inline mad_fixed_t is_table(int i) -{ - static mad_fixed_t const is_table_val[7] PROGMEM = { +static mad_fixed_t const is_table_val[7] PROGMEM = { MAD_F(0x00000000) /* 0.000000000 */, MAD_F(0x0361962f) /* 0.211324865 */, MAD_F(0x05db3d74) /* 0.366025404 */, @@ -482,343 +476,351 @@ static inline mad_fixed_t is_table(int i) MAD_F(0x0a24c28c) /* 0.633974596 */, MAD_F(0x0c9e69d1) /* 0.788675135 */, MAD_F(0x10000000) /* 1.000000000 */ - }; - volatile uint32_t a = *(uint32_t*)&is_table_val[i]; - return *(mad_fixed_t*)&a; +}; +static inline mad_fixed_t is_table(int i) { + volatile mad_fixed_t a = is_table_val[i]; + return a; } /* - coefficients for LSF intensity stereo processing - derived from section 2.4.3.2 of ISO/IEC 13818-3 + coefficients for LSF intensity stereo processing + derived from section 2.4.3.2 of ISO/IEC 13818-3 - is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) - is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1) + is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) + is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1) */ static mad_fixed_t const is_lsf_table[2][15] PROGMEM = { - { - MAD_F(0x0d744fcd) /* 0.840896415 */, - MAD_F(0x0b504f33) /* 0.707106781 */, - MAD_F(0x09837f05) /* 0.594603558 */, - MAD_F(0x08000000) /* 0.500000000 */, - MAD_F(0x06ba27e6) /* 0.420448208 */, - MAD_F(0x05a8279a) /* 0.353553391 */, - MAD_F(0x04c1bf83) /* 0.297301779 */, - MAD_F(0x04000000) /* 0.250000000 */, - MAD_F(0x035d13f3) /* 0.210224104 */, - MAD_F(0x02d413cd) /* 0.176776695 */, - MAD_F(0x0260dfc1) /* 0.148650889 */, - MAD_F(0x02000000) /* 0.125000000 */, - MAD_F(0x01ae89fa) /* 0.105112052 */, - MAD_F(0x016a09e6) /* 0.088388348 */, - MAD_F(0x01306fe1) /* 0.074325445 */ - }, { - MAD_F(0x0b504f33) /* 0.707106781 */, - MAD_F(0x08000000) /* 0.500000000 */, - MAD_F(0x05a8279a) /* 0.353553391 */, - MAD_F(0x04000000) /* 0.250000000 */, - MAD_F(0x02d413cd) /* 0.176776695 */, - MAD_F(0x02000000) /* 0.125000000 */, - MAD_F(0x016a09e6) /* 0.088388348 */, - MAD_F(0x01000000) /* 0.062500000 */, - MAD_F(0x00b504f3) /* 0.044194174 */, - MAD_F(0x00800000) /* 0.031250000 */, - MAD_F(0x005a827a) /* 0.022097087 */, - MAD_F(0x00400000) /* 0.015625000 */, - MAD_F(0x002d413d) /* 0.011048543 */, - MAD_F(0x00200000) /* 0.007812500 */, - MAD_F(0x0016a09e) /* 0.005524272 */ - } + { + MAD_F(0x0d744fcd) /* 0.840896415 */, + MAD_F(0x0b504f33) /* 0.707106781 */, + MAD_F(0x09837f05) /* 0.594603558 */, + MAD_F(0x08000000) /* 0.500000000 */, + MAD_F(0x06ba27e6) /* 0.420448208 */, + MAD_F(0x05a8279a) /* 0.353553391 */, + MAD_F(0x04c1bf83) /* 0.297301779 */, + MAD_F(0x04000000) /* 0.250000000 */, + MAD_F(0x035d13f3) /* 0.210224104 */, + MAD_F(0x02d413cd) /* 0.176776695 */, + MAD_F(0x0260dfc1) /* 0.148650889 */, + MAD_F(0x02000000) /* 0.125000000 */, + MAD_F(0x01ae89fa) /* 0.105112052 */, + MAD_F(0x016a09e6) /* 0.088388348 */, + MAD_F(0x01306fe1) /* 0.074325445 */ + }, { + MAD_F(0x0b504f33) /* 0.707106781 */, + MAD_F(0x08000000) /* 0.500000000 */, + MAD_F(0x05a8279a) /* 0.353553391 */, + MAD_F(0x04000000) /* 0.250000000 */, + MAD_F(0x02d413cd) /* 0.176776695 */, + MAD_F(0x02000000) /* 0.125000000 */, + MAD_F(0x016a09e6) /* 0.088388348 */, + MAD_F(0x01000000) /* 0.062500000 */, + MAD_F(0x00b504f3) /* 0.044194174 */, + MAD_F(0x00800000) /* 0.031250000 */, + MAD_F(0x005a827a) /* 0.022097087 */, + MAD_F(0x00400000) /* 0.015625000 */, + MAD_F(0x002d413d) /* 0.011048543 */, + MAD_F(0x00200000) /* 0.007812500 */, + MAD_F(0x0016a09e) /* 0.005524272 */ + } }; /* - NAME: III_sideinfo() - DESCRIPTION: decode frame side information from a bitstream + NAME: III_sideinfo() + DESCRIPTION: decode frame side information from a bitstream */ static enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, int lsf, struct sideinfo *si, unsigned int *data_bitlen, - unsigned int *priv_bitlen) -{ - unsigned int ngr, gr, ch, i; - enum mad_error result = MAD_ERROR_NONE; - stack(__FUNCTION__, __FILE__, __LINE__); + unsigned int *priv_bitlen) { + unsigned int ngr, gr, ch, i; + enum mad_error result = MAD_ERROR_NONE; + stackenter(__FUNCTION__, __FILE__, __LINE__); - *data_bitlen = 0; - *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); + *data_bitlen = 0; + *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); - si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); - si->private_bits = mad_bit_read(ptr, *priv_bitlen); + si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); + si->private_bits = mad_bit_read(ptr, *priv_bitlen); - ngr = 1; - if (!lsf) { - ngr = 2; + ngr = 1; + if (!lsf) { + ngr = 2; - for (ch = 0; ch < nch; ++ch) - si->scfsi[ch] = mad_bit_read(ptr, 4); - } + for (ch = 0; ch < nch; ++ch) { + si->scfsi[ch] = mad_bit_read(ptr, 4); + } + } - for (gr = 0; gr < ngr; ++gr) { - struct granule *granule = &si->gr[gr]; + for (gr = 0; gr < ngr; ++gr) { + struct granule *granule = &si->gr[gr]; - for (ch = 0; ch < nch; ++ch) { - struct channel *channel = &granule->ch[ch]; + for (ch = 0; ch < nch; ++ch) { + struct channel *channel = &granule->ch[ch]; - channel->part2_3_length = mad_bit_read(ptr, 12); - channel->big_values = mad_bit_read(ptr, 9); - channel->global_gain = mad_bit_read(ptr, 8); - channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); + channel->part2_3_length = mad_bit_read(ptr, 12); + channel->big_values = mad_bit_read(ptr, 9); + channel->global_gain = mad_bit_read(ptr, 8); + channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); - *data_bitlen += channel->part2_3_length; + *data_bitlen += channel->part2_3_length; - if (channel->big_values > 288 && result == 0) - result = MAD_ERROR_BADBIGVALUES; + if (channel->big_values > 288 && result == 0) { + result = MAD_ERROR_BADBIGVALUES; + } - channel->flags = 0; + channel->flags = 0; - /* window_switching_flag */ - if (mad_bit_read(ptr, 1)) { - channel->block_type = mad_bit_read(ptr, 2); + /* window_switching_flag */ + if (mad_bit_read(ptr, 1)) { + channel->block_type = mad_bit_read(ptr, 2); - if (channel->block_type == 0 && result == 0) - result = MAD_ERROR_BADBLOCKTYPE; + if (channel->block_type == 0 && result == 0) { + result = MAD_ERROR_BADBLOCKTYPE; + } - if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) - result = MAD_ERROR_BADSCFSI; + if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) { + result = MAD_ERROR_BADSCFSI; + } - channel->region0_count = 7; - channel->region1_count = 36; + channel->region0_count = 7; + channel->region1_count = 36; - if (mad_bit_read(ptr, 1)) - channel->flags |= mixed_block_flag; - else if (channel->block_type == 2) - channel->region0_count = 8; + if (mad_bit_read(ptr, 1)) { + channel->flags |= mixed_block_flag; + } else if (channel->block_type == 2) { + channel->region0_count = 8; + } - for (i = 0; i < 2; ++i) - channel->table_select[i] = mad_bit_read(ptr, 5); + for (i = 0; i < 2; ++i) { + channel->table_select[i] = mad_bit_read(ptr, 5); + } # if defined(DEBUG) - channel->table_select[2] = 4; /* not used */ + channel->table_select[2] = 4; /* not used */ # endif - for (i = 0; i < 3; ++i) - channel->subblock_gain[i] = mad_bit_read(ptr, 3); - } - else { - channel->block_type = 0; + for (i = 0; i < 3; ++i) { + channel->subblock_gain[i] = mad_bit_read(ptr, 3); + } + } else { + channel->block_type = 0; - for (i = 0; i < 3; ++i) - channel->table_select[i] = mad_bit_read(ptr, 5); + for (i = 0; i < 3; ++i) { + channel->table_select[i] = mad_bit_read(ptr, 5); + } - channel->region0_count = mad_bit_read(ptr, 4); - channel->region1_count = mad_bit_read(ptr, 3); - } + channel->region0_count = mad_bit_read(ptr, 4); + channel->region1_count = mad_bit_read(ptr, 3); + } - /* [preflag,] scalefac_scale, count1table_select */ - channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); + /* [preflag,] scalefac_scale, count1table_select */ + channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); + } } - } - return result; + return result; } /* - NAME: III_scalefactors_lsf() - DESCRIPTION: decode channel scalefactors for LSF from a bitstream + NAME: III_scalefactors_lsf() + DESCRIPTION: decode channel scalefactors for LSF from a bitstream */ static unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr, struct channel *channel, - struct channel *gr1ch, int mode_extension) -{ - struct mad_bitptr start; - unsigned int scalefac_compress, index, slen[4], part, n, i; - unsigned int const *nsfb; - stack(__FUNCTION__, __FILE__, __LINE__); - - start = *ptr; - - scalefac_compress = channel->scalefac_compress; - index = (channel->block_type == 2) ? - ((channel->flags & mixed_block_flag) ? 2 : 1) : 0; - - if (!((mode_extension & I_STEREO) && gr1ch)) { - if (scalefac_compress < 400) { - slen[0] = (scalefac_compress >> 4) / 5; - slen[1] = (scalefac_compress >> 4) % 5; - slen[2] = (scalefac_compress % 16) >> 2; - slen[3] = scalefac_compress % 4; - - nsfb = nsfb_table[0][index]; - } - else if (scalefac_compress < 500) { - scalefac_compress -= 400; - - slen[0] = (scalefac_compress >> 2) / 5; - slen[1] = (scalefac_compress >> 2) % 5; - slen[2] = scalefac_compress % 4; - slen[3] = 0; - - nsfb = nsfb_table[1][index]; - } - else { - scalefac_compress -= 500; + struct channel *gr1ch, int mode_extension) { + struct mad_bitptr start; + unsigned int scalefac_compress, index, slen[4], part, n, i; + unsigned int const *nsfb; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + start = *ptr; + + scalefac_compress = channel->scalefac_compress; + index = (channel->block_type == 2) ? + ((channel->flags & mixed_block_flag) ? 2 : 1) : 0; + + if (!((mode_extension & I_STEREO) && gr1ch)) { + if (scalefac_compress < 400) { + slen[0] = (scalefac_compress >> 4) / 5; + slen[1] = (scalefac_compress >> 4) % 5; + slen[2] = (scalefac_compress % 16) >> 2; + slen[3] = scalefac_compress % 4; + + nsfb = nsfb_table[0][index]; + } else if (scalefac_compress < 500) { + scalefac_compress -= 400; + + slen[0] = (scalefac_compress >> 2) / 5; + slen[1] = (scalefac_compress >> 2) % 5; + slen[2] = scalefac_compress % 4; + slen[3] = 0; + + nsfb = nsfb_table[1][index]; + } else { + scalefac_compress -= 500; + + slen[0] = scalefac_compress / 3; + slen[1] = scalefac_compress % 3; + slen[2] = 0; + slen[3] = 0; + + channel->flags |= preflag; + + nsfb = nsfb_table[2][index]; + } - slen[0] = scalefac_compress / 3; - slen[1] = scalefac_compress % 3; - slen[2] = 0; - slen[3] = 0; + n = 0; + for (part = 0; part < 4; ++part) { + for (i = 0; i < nsfb[part]; ++i) { + channel->scalefac[n++] = mad_bit_read(ptr, slen[part]); + } + } - channel->flags |= preflag; + while (n < 39) { + channel->scalefac[n++] = 0; + } + } else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */ + scalefac_compress >>= 1; + + if (scalefac_compress < 180) { + slen[0] = scalefac_compress / 36; + slen[1] = (scalefac_compress % 36) / 6; + slen[2] = (scalefac_compress % 36) % 6; + slen[3] = 0; + + nsfb = nsfb_table[3][index]; + } else if (scalefac_compress < 244) { + scalefac_compress -= 180; + + slen[0] = (scalefac_compress % 64) >> 4; + slen[1] = (scalefac_compress % 16) >> 2; + slen[2] = scalefac_compress % 4; + slen[3] = 0; + + nsfb = nsfb_table[4][index]; + } else { + scalefac_compress -= 244; + + slen[0] = scalefac_compress / 3; + slen[1] = scalefac_compress % 3; + slen[2] = 0; + slen[3] = 0; + + nsfb = nsfb_table[5][index]; + } - nsfb = nsfb_table[2][index]; - } + n = 0; + for (part = 0; part < 4; ++part) { + unsigned int max, is_pos; - n = 0; - for (part = 0; part < 4; ++part) { - for (i = 0; i < nsfb[part]; ++i) - channel->scalefac[n++] = mad_bit_read(ptr, slen[part]); - } + max = (1 << slen[part]) - 1; - while (n < 39) - channel->scalefac[n++] = 0; - } - else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */ - scalefac_compress >>= 1; + for (i = 0; i < nsfb[part]; ++i) { + is_pos = mad_bit_read(ptr, slen[part]); - if (scalefac_compress < 180) { - slen[0] = scalefac_compress / 36; - slen[1] = (scalefac_compress % 36) / 6; - slen[2] = (scalefac_compress % 36) % 6; - slen[3] = 0; + channel->scalefac[n] = is_pos; + gr1ch->scalefac[n++] = (is_pos == max); + } + } - nsfb = nsfb_table[3][index]; + while (n < 39) { + channel->scalefac[n] = 0; + gr1ch->scalefac[n++] = 0; /* apparently not illegal */ + } } - else if (scalefac_compress < 244) { - scalefac_compress -= 180; - - slen[0] = (scalefac_compress % 64) >> 4; - slen[1] = (scalefac_compress % 16) >> 2; - slen[2] = scalefac_compress % 4; - slen[3] = 0; - nsfb = nsfb_table[4][index]; - } - else { - scalefac_compress -= 244; + return mad_bit_length(&start, ptr); +} - slen[0] = scalefac_compress / 3; - slen[1] = scalefac_compress % 3; - slen[2] = 0; - slen[3] = 0; +/* + NAME: III_scalefactors() + DESCRIPTION: decode channel scalefactors of one granule from a bitstream +*/ +static +unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, + struct channel const *gr0ch, unsigned int scfsi) { + struct mad_bitptr start; + unsigned int slen1, slen2, sfbi; + stackenter(__FUNCTION__, __FILE__, __LINE__); - nsfb = nsfb_table[5][index]; - } + start = *ptr; - n = 0; - for (part = 0; part < 4; ++part) { - unsigned int max, is_pos; + slen1 = sflen_table[channel->scalefac_compress].slen1; + slen2 = sflen_table[channel->scalefac_compress].slen2; - max = (1 << slen[part]) - 1; + if (channel->block_type == 2) { + unsigned int nsfb; - for (i = 0; i < nsfb[part]; ++i) { - is_pos = mad_bit_read(ptr, slen[part]); + sfbi = 0; - channel->scalefac[n] = is_pos; - gr1ch->scalefac[n++] = (is_pos == max); - } - } + nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3; + while (nsfb--) { + channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1); + } - while (n < 39) { - channel->scalefac[n] = 0; - gr1ch->scalefac[n++] = 0; /* apparently not illegal */ - } - } + nsfb = 6 * 3; + while (nsfb--) { + channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2); + } - return mad_bit_length(&start, ptr); -} + nsfb = 1 * 3; + while (nsfb--) { + channel->scalefac[sfbi++] = 0; + } + } else { /* channel->block_type != 2 */ + if (scfsi & 0x8) { + for (sfbi = 0; sfbi < 6; ++sfbi) { + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + } else { + for (sfbi = 0; sfbi < 6; ++sfbi) { + channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); + } + } -/* - NAME: III_scalefactors() - DESCRIPTION: decode channel scalefactors of one granule from a bitstream -*/ -static -unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, - struct channel const *gr0ch, unsigned int scfsi) -{ - struct mad_bitptr start; - unsigned int slen1, slen2, sfbi; - stack(__FUNCTION__, __FILE__, __LINE__); - - start = *ptr; - - slen1 = sflen_table[channel->scalefac_compress].slen1; - slen2 = sflen_table[channel->scalefac_compress].slen2; - - if (channel->block_type == 2) { - unsigned int nsfb; - - sfbi = 0; - - nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1); - - nsfb = 6 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2); - - nsfb = 1 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = 0; - } - else { /* channel->block_type != 2 */ - if (scfsi & 0x8) { - for (sfbi = 0; sfbi < 6; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 0; sfbi < 6; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); - } + if (scfsi & 0x4) { + for (sfbi = 6; sfbi < 11; ++sfbi) { + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + } else { + for (sfbi = 6; sfbi < 11; ++sfbi) { + channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); + } + } - if (scfsi & 0x4) { - for (sfbi = 6; sfbi < 11; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 6; sfbi < 11; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); - } + if (scfsi & 0x2) { + for (sfbi = 11; sfbi < 16; ++sfbi) { + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + } else { + for (sfbi = 11; sfbi < 16; ++sfbi) { + channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); + } + } - if (scfsi & 0x2) { - for (sfbi = 11; sfbi < 16; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 11; sfbi < 16; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); - } + if (scfsi & 0x1) { + for (sfbi = 16; sfbi < 21; ++sfbi) { + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + } else { + for (sfbi = 16; sfbi < 21; ++sfbi) { + channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); + } + } - if (scfsi & 0x1) { - for (sfbi = 16; sfbi < 21; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 16; sfbi < 21; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); + channel->scalefac[21] = 0; } - channel->scalefac[21] = 0; - } - - return mad_bit_length(&start, ptr); + return mad_bit_length(&start, ptr); } /* - The Layer III formula for requantization and scaling is defined by - section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows: + The Layer III formula for requantization and scaling is defined by + section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows: long blocks: xr[i] = sign(is[i]) * abs(is[i])^(4/3) @@ -834,130 +836,124 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, where: scalefac_multiplier = (scalefac_scale + 1) / 2 - The routines III_exponents() and III_requantize() facilitate this - calculation. + The routines III_exponents() and III_requantize() facilitate this + calculation. */ /* - NAME: III_exponents() - DESCRIPTION: calculate scalefactor exponents + NAME: III_exponents() + DESCRIPTION: calculate scalefactor exponents */ static void III_exponents(struct channel const *channel, - unsigned int const *sfbwidth, signed int exponents[39]) -{ - signed int gain; - unsigned int scalefac_multiplier, sfbi; - stack(__FUNCTION__, __FILE__, __LINE__); + unsigned int const *sfbwidth, signed int exponents[39]) { + signed int gain; + unsigned int scalefac_multiplier, sfbi; + stackenter(__FUNCTION__, __FILE__, __LINE__); - gain = (signed int) channel->global_gain - 210; - scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; + gain = (signed int) channel->global_gain - 210; + scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; - if (channel->block_type == 2) { - unsigned int l; - signed int gain0, gain1, gain2; + if (channel->block_type == 2) { + unsigned int l; + signed int gain0, gain1, gain2; - sfbi = l = 0; + sfbi = l = 0; - if (channel->flags & mixed_block_flag) { - unsigned int premask; + if (channel->flags & mixed_block_flag) { + unsigned int premask; - premask = (channel->flags & preflag) ? ~0 : 0; + premask = (channel->flags & preflag) ? ~0 : 0; - /* long block subbands 0-1 */ + /* long block subbands 0-1 */ - while (l < 36) { - exponents[sfbi] = gain - - (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << - scalefac_multiplier); + while (l < 36) { + exponents[sfbi] = gain - + (signed int)((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << + scalefac_multiplier); - l += sfbwidth[sfbi++]; - } - } + l += sfbwidth[sfbi++]; + } + } - /* this is probably wrong for 8000 Hz short/mixed blocks */ + /* this is probably wrong for 8000 Hz short/mixed blocks */ - gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; - gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; - gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; + gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; + gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; + gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; - while (l < 576) { - exponents[sfbi + 0] = gain0 - - (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier); - exponents[sfbi + 1] = gain1 - - (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier); - exponents[sfbi + 2] = gain2 - - (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier); + while (l < 576) { + exponents[sfbi + 0] = gain0 - + (signed int)(channel->scalefac[sfbi + 0] << scalefac_multiplier); + exponents[sfbi + 1] = gain1 - + (signed int)(channel->scalefac[sfbi + 1] << scalefac_multiplier); + exponents[sfbi + 2] = gain2 - + (signed int)(channel->scalefac[sfbi + 2] << scalefac_multiplier); - l += 3 * sfbwidth[sfbi]; - sfbi += 3; - } - } - else { /* channel->block_type != 2 */ - if (channel->flags & preflag) { - for (sfbi = 0; sfbi < 22; ++sfbi) { - exponents[sfbi] = gain - - (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) << - scalefac_multiplier); - } - } - else { - for (sfbi = 0; sfbi < 22; ++sfbi) { - exponents[sfbi] = gain - - (signed int) (channel->scalefac[sfbi] << scalefac_multiplier); - } + l += 3 * sfbwidth[sfbi]; + sfbi += 3; + } + } else { /* channel->block_type != 2 */ + if (channel->flags & preflag) { + for (sfbi = 0; sfbi < 22; ++sfbi) { + exponents[sfbi] = gain - + (signed int)((channel->scalefac[sfbi] + pretab[sfbi]) << + scalefac_multiplier); + } + } else { + for (sfbi = 0; sfbi < 22; ++sfbi) { + exponents[sfbi] = gain - + (signed int)(channel->scalefac[sfbi] << scalefac_multiplier); + } + } } - } } /* - NAME: III_requantize() - DESCRIPTION: requantize one (positive) value + NAME: III_requantize() + DESCRIPTION: requantize one (positive) value */ static -mad_fixed_t III_requantize(unsigned int value, signed int exp) -{ - mad_fixed_t requantized; - signed int frac; - struct fixedfloat power; +mad_fixed_t III_requantize(unsigned int value, signed int exp) { + mad_fixed_t requantized; + signed int frac; + struct fixedfloat power; - stack(__FUNCTION__, __FILE__, __LINE__); - frac = exp % 4; /* assumes sign(frac) == sign(exp) */ - exp /= 4; + stackenter(__FUNCTION__, __FILE__, __LINE__); + frac = exp % 4; /* assumes sign(frac) == sign(exp) */ + exp /= 4; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" - *(uint32_t*)&power = *(uint32_t*)&rq_table[value]; //memcpy_P(&power, &rq_table[value], sizeof(power)); // Avoid byte access to PROGMEM + *(uint32_t*)&power = *(uint32_t*)&rq_table[value]; //memcpy_P(&power, &rq_table[value], sizeof(power)); // Avoid byte access to PROGMEM #pragma GCC diagnostic pop #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" - requantized = power.mantissa; - exp += power.exponent; + requantized = power.mantissa; + exp += power.exponent; #pragma GCC diagnostic pop - if (exp < 0) { - if (-exp >= (int)(sizeof(mad_fixed_t) * CHAR_BIT)) { - /* underflow */ - requantized = 0; - } - else { - requantized += 1L << (-exp - 1); - requantized >>= -exp; - } - } - else { - if (exp >= 5) { - /* overflow */ + if (exp < 0) { + if (-exp >= (int)(sizeof(mad_fixed_t) * CHAR_BIT)) { + /* underflow */ + requantized = 0; + } else { + requantized += 1L << (-exp - 1); + requantized >>= -exp; + } + } else { + if (exp >= 5) { + /* overflow */ # if 0 && defined(DEBUG) - fprintf(stderr, "requantize overflow (%f * 2^%d)\n", - mad_f_todouble(requantized), exp); + fprintf(stderr, "requantize overflow (%f * 2^%d)\n", + mad_f_todouble(requantized), exp); # endif - requantized = MAD_F_MAX; + requantized = MAD_F_MAX; + } else { + requantized <<= exp; + } } - else - requantized <<= exp; - } - return frac ? mad_f_mul(requantized, root_table(3 + frac)) : requantized; + return frac ? mad_f_mul(requantized, root_table(3 + frac)) : requantized; } /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */ @@ -967,668 +963,677 @@ mad_fixed_t III_requantize(unsigned int value, signed int exp) ((cache) & (1 << ((sz) - 1))) /* - NAME: III_huffdecode() - DESCRIPTION: decode Huffman code words of one channel of one granule + NAME: III_huffdecode() + DESCRIPTION: decode Huffman code words of one channel of one granule */ static enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576], struct channel *channel, unsigned int const *sfbwidth, - unsigned int part2_length) -{ - signed int exponents[39], exp; - signed int const *expptr; - struct mad_bitptr peek; - signed int bits_left, cachesz; - register mad_fixed_t *xrptr; - mad_fixed_t const *sfbound; - register unsigned long bitcache; - - stack(__FUNCTION__, __FILE__, __LINE__); - bits_left = (signed) channel->part2_3_length - (signed) part2_length; - if (bits_left < 0) - return MAD_ERROR_BADPART3LEN; - - III_exponents(channel, sfbwidth, exponents); - - peek = *ptr; - mad_bit_skip(ptr, bits_left); - - /* align bit reads to byte boundaries */ - cachesz = mad_bit_bitsleft(&peek); - cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; - - bitcache = mad_bit_read(&peek, cachesz); - bits_left -= cachesz; - - xrptr = &xr[0]; - - /* big_values */ - { - unsigned int region, rcount; - struct hufftable const *entry; - union huffpair const *table; - unsigned int linbits, startbits, big_values, reqhits; - mad_fixed_t reqcache[16]; - - sfbound = xrptr + *sfbwidth++; - rcount = channel->region0_count + 1; - - entry = &mad_huff_pair_table[channel->table_select[region = 0]]; - table = entry->table; - linbits = entry->linbits; - startbits = entry->startbits; - - if (table == 0) - return MAD_ERROR_BADHUFFTABLE; - - expptr = &exponents[0]; - exp = *expptr++; - reqhits = 0; - - big_values = channel->big_values; - - while (big_values-- && cachesz + bits_left > 0) { - union huffpair const *pair; - unsigned int clumpsz, value; - register mad_fixed_t requantized; - - if (xrptr == sfbound) { - sfbound += *sfbwidth++; - - /* change table if region boundary */ - - if (--rcount == 0) { - if (region == 0) - rcount = channel->region1_count + 1; - else - rcount = 0; /* all remaining */ - - entry = &mad_huff_pair_table[channel->table_select[++region]]; - table = entry->table; - linbits = entry->linbits; - startbits = entry->startbits; - - if (table == 0) - return MAD_ERROR_BADHUFFTABLE; - } + unsigned int part2_length) { + signed int exponents[39], exp; + signed int const *expptr; + struct mad_bitptr peek; + signed int bits_left, cachesz; + register mad_fixed_t *xrptr; + mad_fixed_t const *sfbound; + register unsigned long bitcache; + + stackenter(__FUNCTION__, __FILE__, __LINE__); + bits_left = (signed) channel->part2_3_length - (signed) part2_length; + if (bits_left < 0) { + return MAD_ERROR_BADPART3LEN; + } + + III_exponents(channel, sfbwidth, exponents); + + peek = *ptr; + mad_bit_skip(ptr, bits_left); + + /* align bit reads to byte boundaries */ + cachesz = mad_bit_bitsleft(&peek); + cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; + + bitcache = mad_bit_read(&peek, cachesz); + bits_left -= cachesz; + + xrptr = &xr[0]; - if (exp != *expptr) { - exp = *expptr; - reqhits = 0; + /* big_values */ + { + unsigned int region, rcount; + struct hufftable const *entry; + union huffpair const *table; + unsigned int linbits, startbits, big_values, reqhits; + mad_fixed_t reqcache[16]; + + sfbound = xrptr + *sfbwidth++; + rcount = channel->region0_count + 1; + + entry = &mad_huff_pair_table[channel->table_select[region = 0]]; + table = entry->table; + linbits = entry->linbits; + startbits = entry->startbits; + + if (table == 0) { + return MAD_ERROR_BADHUFFTABLE; } - ++expptr; - } + expptr = &exponents[0]; + exp = *expptr++; + reqhits = 0; - if (cachesz < 21) { - unsigned int bits; + big_values = channel->big_values; - bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; - bitcache = (bitcache << bits) | mad_bit_read(&peek, bits); - cachesz += bits; - bits_left -= bits; - } + while (big_values-- && cachesz + bits_left > 0) { + union huffpair const *pair; + unsigned int clumpsz, value; + register mad_fixed_t requantized; - /* hcod (0..19) */ + if (xrptr == sfbound) { + sfbound += *sfbwidth++; - clumpsz = startbits; - pair = &table[MASK(bitcache, cachesz, clumpsz)]; + /* change table if region boundary */ - while (!pair->final) { - cachesz -= clumpsz; + if (--rcount == 0) { + if (region == 0) { + rcount = channel->region1_count + 1; + } else { + rcount = 0; /* all remaining */ + } - clumpsz = pair->ptr.bits; - pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)]; - } + entry = &mad_huff_pair_table[channel->table_select[++region]]; + table = entry->table; + linbits = entry->linbits; + startbits = entry->startbits; - cachesz -= pair->value.hlen; + if (table == 0) { + return MAD_ERROR_BADHUFFTABLE; + } + } - if (linbits) { - /* x (0..14) */ + if (exp != *expptr) { + exp = *expptr; + reqhits = 0; + } - value = pair->value.x; + ++expptr; + } - switch (value) { - case 0: - xrptr[0] = 0; - break; + if (cachesz < 21) { + unsigned int bits; - case 15: - if (cachesz < (int)(linbits + 2)) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; + bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; + bitcache = (bitcache << bits) | mad_bit_read(&peek, bits); + cachesz += bits; + bits_left -= bits; } - value += MASK(bitcache, cachesz, linbits); - cachesz -= linbits; + /* hcod (0..19) */ - requantized = III_requantize(value, exp); - goto x_final; + clumpsz = startbits; + pair = &table[MASK(bitcache, cachesz, clumpsz)]; - default: - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); + while (!pair->final) { + cachesz -= clumpsz; + + clumpsz = pair->ptr.bits; + pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)]; } -x_final: - xrptr[0] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } + cachesz -= pair->value.hlen; - /* y (0..14) */ + if (linbits) { + /* x (0..14) */ - value = pair->value.y; + value = pair->value.x; - switch (value) { - case 0: - xrptr[1] = 0; - break; + switch (value) { + case 0: + xrptr[0] = 0; + break; - case 15: - if (cachesz < (int)(linbits + 1)) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; - } + case 15: + if (cachesz < (int)(linbits + 2)) { + bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); + cachesz += 16; + bits_left -= 16; + } - value += MASK(bitcache, cachesz, linbits); - cachesz -= linbits; + value += MASK(bitcache, cachesz, linbits); + cachesz -= linbits; - requantized = III_requantize(value, exp); - goto y_final; + requantized = III_requantize(value, exp); + goto x_final; - default: - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } + default: + if (reqhits & (1 << value)) { + requantized = reqcache[value]; + } else { + reqhits |= (1 << value); + requantized = reqcache[value] = III_requantize(value, exp); + } -y_final: - xrptr[1] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - } - else { - /* x (0..1) */ - - value = pair->value.x; - - if (value == 0) - xrptr[0] = 0; - else { - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } - - xrptr[0] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } +x_final: + xrptr[0] = MASK1BIT(bitcache, cachesz--) ? + -requantized : requantized; + } - /* y (0..1) */ + /* y (0..14) */ - value = pair->value.y; + value = pair->value.y; - if (value == 0) - xrptr[1] = 0; - else { - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } + switch (value) { + case 0: + xrptr[1] = 0; + break; - xrptr[1] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - } + case 15: + if (cachesz < (int)(linbits + 1)) { + bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); + cachesz += 16; + bits_left -= 16; + } + + value += MASK(bitcache, cachesz, linbits); + cachesz -= linbits; + + requantized = III_requantize(value, exp); + goto y_final; + + default: + if (reqhits & (1 << value)) { + requantized = reqcache[value]; + } else { + reqhits |= (1 << value); + requantized = reqcache[value] = III_requantize(value, exp); + } - xrptr += 2; +y_final: + xrptr[1] = MASK1BIT(bitcache, cachesz--) ? + -requantized : requantized; + } + } else { + /* x (0..1) */ + + value = pair->value.x; + + if (value == 0) { + xrptr[0] = 0; + } else { + if (reqhits & (1 << value)) { + requantized = reqcache[value]; + } else { + reqhits |= (1 << value); + requantized = reqcache[value] = III_requantize(value, exp); + } + + xrptr[0] = MASK1BIT(bitcache, cachesz--) ? + -requantized : requantized; + } + + /* y (0..1) */ + + value = pair->value.y; + + if (value == 0) { + xrptr[1] = 0; + } else { + if (reqhits & (1 << value)) { + requantized = reqcache[value]; + } else { + reqhits |= (1 << value); + requantized = reqcache[value] = III_requantize(value, exp); + } + + xrptr[1] = MASK1BIT(bitcache, cachesz--) ? + -requantized : requantized; + } + } + + xrptr += 2; + } } - } - if (cachesz + bits_left < 0) - return MAD_ERROR_BADHUFFDATA; /* big_values overrun */ + if (cachesz + bits_left < 0) { + return MAD_ERROR_BADHUFFDATA; /* big_values overrun */ + } - /* count1 */ - { - union huffquad const *table; - register mad_fixed_t requantized; + /* count1 */ + { + union huffquad const *table; + register mad_fixed_t requantized; - table = mad_huff_quad_table[channel->flags & count1table_select]; + table = mad_huff_quad_table[channel->flags & count1table_select]; - requantized = III_requantize(1, exp); + requantized = III_requantize(1, exp); - while (cachesz + bits_left > 0 && xrptr <= &xr[572]) { - union huffquad const *quad; + while (cachesz + bits_left > 0 && xrptr <= &xr[572]) { + union huffquad const *quad; - /* hcod (1..6) */ + /* hcod (1..6) */ - if (cachesz < 10) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; - } + if (cachesz < 10) { + bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); + cachesz += 16; + bits_left -= 16; + } - quad = &table[MASK(bitcache, cachesz, 4)]; + quad = &table[MASK(bitcache, cachesz, 4)]; - /* quad tables guaranteed to have at most one extra lookup */ - if (!quad->final) { - cachesz -= 4; + /* quad tables guaranteed to have at most one extra lookup */ + if (!quad->final) { + cachesz -= 4; - quad = &table[quad->ptr.offset + - MASK(bitcache, cachesz, quad->ptr.bits)]; - } + quad = &table[quad->ptr.offset + + MASK(bitcache, cachesz, quad->ptr.bits)]; + } - cachesz -= quad->value.hlen; + cachesz -= quad->value.hlen; - if (xrptr == sfbound) { - sfbound += *sfbwidth++; + if (xrptr == sfbound) { + sfbound += *sfbwidth++; - if (exp != *expptr) { - exp = *expptr; - requantized = III_requantize(1, exp); - } + if (exp != *expptr) { + exp = *expptr; + requantized = III_requantize(1, exp); + } - ++expptr; - } + ++expptr; + } - /* v (0..1) */ + /* v (0..1) */ - xrptr[0] = quad->value.v ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; + xrptr[0] = quad->value.v ? + (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - /* w (0..1) */ + /* w (0..1) */ - xrptr[1] = quad->value.w ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; + xrptr[1] = quad->value.w ? + (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - xrptr += 2; + xrptr += 2; - if (xrptr == sfbound) { - sfbound += *sfbwidth++; + if (xrptr == sfbound) { + sfbound += *sfbwidth++; - if (exp != *expptr) { - exp = *expptr; - requantized = III_requantize(1, exp); - } + if (exp != *expptr) { + exp = *expptr; + requantized = III_requantize(1, exp); + } - ++expptr; - } + ++expptr; + } - /* x (0..1) */ + /* x (0..1) */ - xrptr[0] = quad->value.x ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; + xrptr[0] = quad->value.x ? + (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - /* y (0..1) */ + /* y (0..1) */ - xrptr[1] = quad->value.y ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; + xrptr[1] = quad->value.y ? + (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - xrptr += 2; - } + xrptr += 2; + } - if (cachesz + bits_left < 0) { + if (cachesz + bits_left < 0) { # if 0 && defined(DEBUG) - fprintf(stderr, "huffman count1 overrun (%d bits)\n", - -(cachesz + bits_left)); + fprintf(stderr, "huffman count1 overrun (%d bits)\n", + -(cachesz + bits_left)); # endif - /* technically the bitstream is misformatted, but apparently - some encoders are just a bit sloppy with stuffing bits */ + /* technically the bitstream is misformatted, but apparently + some encoders are just a bit sloppy with stuffing bits */ - xrptr -= 4; + xrptr -= 4; + } } - } - assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT); + assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT); # if 0 && defined(DEBUG) - if (bits_left < 0) - fprintf(stderr, "read %d bits too many\n", -bits_left); - else if (cachesz + bits_left > 0) - fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left); + if (bits_left < 0) { + fprintf(stderr, "read %d bits too many\n", -bits_left); + } else if (cachesz + bits_left > 0) { + fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left); + } # endif - /* rzero */ - while (xrptr < &xr[576]) { - xrptr[0] = 0; - xrptr[1] = 0; + /* rzero */ + while (xrptr < &xr[576]) { + xrptr[0] = 0; + xrptr[1] = 0; - xrptr += 2; - } + xrptr += 2; + } - return MAD_ERROR_NONE; + return MAD_ERROR_NONE; } # undef MASK # undef MASK1BIT /* - NAME: III_reorder() - DESCRIPTION: reorder frequency lines of a short block into subband order + NAME: III_reorder() + DESCRIPTION: reorder frequency lines of a short block into subband order */ static enum mad_error III_reorder(mad_fixed_t xr[576], struct channel const *channel, - unsigned int const sfbwidth[39], mad_fixed_t tmp[576]) -{ - unsigned int sb, l, f, w, sbw[3], sw[3]; -// mad_fixed_t *tmp; // [32][3][6] - // See if we can allocate this buffer on the stack and save heap -// char onstack = 0; -// if (stackfree() > (int)(100 + sizeof(mad_fixed_t)*32*3*6)) { -// onstack = 1; -// tmp = alloca(sizeof(mad_fixed_t)*32*3*6); -// } else { -// tmp = (mad_fixed_t*)malloc(sizeof(mad_fixed_t)*32*3*6); -// if (!tmp) return MAD_ERROR_NOMEM; -// } - - stack(__FUNCTION__, __FILE__, __LINE__); - - /* this is probably wrong for 8000 Hz mixed blocks */ - - sb = 0; - if (channel->flags & mixed_block_flag) { - sb = 2; - - l = 0; - while (l < 36) - l += *sfbwidth++; - } - - for (w = 0; w < 3; ++w) { - sbw[w] = sb; - sw[w] = 0; - } - - f = *sfbwidth++; - w = 0; - - for (l = 18 * sb; l < 576; ++l) { - if (f-- == 0) { - f = *sfbwidth++ - 1; - w = (w + 1) % 3; + unsigned int const sfbwidth[39], mad_fixed_t tmp[576]) { + unsigned int sb, l, f, w, sbw[3], sw[3]; + // mad_fixed_t *tmp; // [32][3][6] + // See if we can allocate this buffer on the stack and save heap + // char onstack = 0; + // if (stackfree() > (int)(100 + sizeof(mad_fixed_t)*32*3*6)) { + // onstack = 1; + // tmp = alloca(sizeof(mad_fixed_t)*32*3*6); + // } else { + // tmp = (mad_fixed_t*)malloc(sizeof(mad_fixed_t)*32*3*6); + // if (!tmp) return MAD_ERROR_NOMEM; + // } + + stackenter(__FUNCTION__, __FILE__, __LINE__); + + /* this is probably wrong for 8000 Hz mixed blocks */ + + sb = 0; + if (channel->flags & mixed_block_flag) { + sb = 2; + + l = 0; + while (l < 36) { + l += *sfbwidth++; + } } - tmp[ (sbw[w]*3*6) + (w*6) + (sw[w]++) ] = xr[l]; + for (w = 0; w < 3; ++w) { + sbw[w] = sb; + sw[w] = 0; + } + + f = *sfbwidth++; + w = 0; + + for (l = 18 * sb; l < 576; ++l) { + if (f-- == 0) { + f = *sfbwidth++ - 1; + w = (w + 1) % 3; + } + + tmp[(sbw[w] * 3 * 6) + (w * 6) + (sw[w]++) ] = xr[l]; - if (sw[w] == 6) { - sw[w] = 0; - ++sbw[w]; + if (sw[w] == 6) { + sw[w] = 0; + ++sbw[w]; + } } - } - memcpy(&xr[18 * sb], &tmp[sb * 3 * 6], (576 - 18 * sb) * sizeof(mad_fixed_t)); + memcpy(&xr[18 * sb], &tmp[sb * 3 * 6], (576 - 18 * sb) * sizeof(mad_fixed_t)); -// if (!onstack) free(tmp); -// // If it's on the stack, it'll go away on the return - return MAD_ERROR_NONE; + // if (!onstack) free(tmp); + // // If it's on the stack, it'll go away on the return + return MAD_ERROR_NONE; } /* - NAME: III_stereo() - DESCRIPTION: perform joint stereo processing on a granule + NAME: III_stereo() + DESCRIPTION: perform joint stereo processing on a granule */ static enum mad_error III_stereo(mad_fixed_t xr[2][576], struct granule const *granule, struct mad_header *header, - unsigned int const *sfbwidth) -{ - short modes[39]; - unsigned int sfbi, l, n, i; - stack(__FUNCTION__, __FILE__, __LINE__); + unsigned int const *sfbwidth) { + short modes[39]; + unsigned int sfbi, l, n, i; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + if (granule->ch[0].block_type != + granule->ch[1].block_type || + (granule->ch[0].flags & mixed_block_flag) != + (granule->ch[1].flags & mixed_block_flag)) { + return MAD_ERROR_BADSTEREO; + } - if (granule->ch[0].block_type != - granule->ch[1].block_type || - (granule->ch[0].flags & mixed_block_flag) != - (granule->ch[1].flags & mixed_block_flag)) - return MAD_ERROR_BADSTEREO; + for (i = 0; i < 39; ++i) { + modes[i] = header->mode_extension; + } - for (i = 0; i < 39; ++i) - modes[i] = header->mode_extension; + /* intensity stereo */ - /* intensity stereo */ + if (header->mode_extension & I_STEREO) { + struct channel const *right_ch = &granule->ch[1]; + mad_fixed_t const *right_xr = xr[1]; + unsigned int is_pos; - if (header->mode_extension & I_STEREO) { - struct channel const *right_ch = &granule->ch[1]; - mad_fixed_t const *right_xr = xr[1]; - unsigned int is_pos; + header->flags |= MAD_FLAG_I_STEREO; - header->flags |= MAD_FLAG_I_STEREO; + /* first determine which scalefactor bands are to be processed */ - /* first determine which scalefactor bands are to be processed */ + if (right_ch->block_type == 2) { + unsigned int lower, start, max, bound[3], w; - if (right_ch->block_type == 2) { - unsigned int lower, start, max, bound[3], w; + lower = start = max = bound[0] = bound[1] = bound[2] = 0; - lower = start = max = bound[0] = bound[1] = bound[2] = 0; + sfbi = l = 0; - sfbi = l = 0; + if (right_ch->flags & mixed_block_flag) { + while (l < 36) { + n = sfbwidth[sfbi++]; - if (right_ch->flags & mixed_block_flag) { - while (l < 36) { - n = sfbwidth[sfbi++]; + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + lower = sfbi; + break; + } + } - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - lower = sfbi; - break; + right_xr += n; + l += n; + } + + start = sfbi; } - } - right_xr += n; - l += n; - } + w = 0; + while (l < 576) { + n = sfbwidth[sfbi++]; - start = sfbi; - } + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + max = bound[w] = sfbi; + break; + } + } - w = 0; - while (l < 576) { - n = sfbwidth[sfbi++]; + right_xr += n; + l += n; + w = (w + 1) % 3; + } - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - max = bound[w] = sfbi; - break; - } - } + if (max) { + lower = start; + } - right_xr += n; - l += n; - w = (w + 1) % 3; - } + /* long blocks */ - if (max) - lower = start; + for (i = 0; i < lower; ++i) { + modes[i] = header->mode_extension & ~I_STEREO; + } - /* long blocks */ + /* short blocks */ - for (i = 0; i < lower; ++i) - modes[i] = header->mode_extension & ~I_STEREO; + w = 0; + for (i = start; i < max; ++i) { + if (i < bound[w]) { + modes[i] = header->mode_extension & ~I_STEREO; + } - /* short blocks */ + w = (w + 1) % 3; + } + } else { /* right_ch->block_type != 2 */ + unsigned int bound; - w = 0; - for (i = start; i < max; ++i) { - if (i < bound[w]) - modes[i] = header->mode_extension & ~I_STEREO; + bound = 0; + for (sfbi = l = 0; l < 576; l += n) { + n = sfbwidth[sfbi++]; - w = (w + 1) % 3; - } - } - else { /* right_ch->block_type != 2 */ - unsigned int bound; - - bound = 0; - for (sfbi = l = 0; l < 576; l += n) { - n = sfbwidth[sfbi++]; - - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - bound = sfbi; - break; - } - } + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + bound = sfbi; + break; + } + } - right_xr += n; - } + right_xr += n; + } - for (i = 0; i < bound; ++i) - modes[i] = header->mode_extension & ~I_STEREO; - } + for (i = 0; i < bound; ++i) { + modes[i] = header->mode_extension & ~I_STEREO; + } + } - /* now do the actual processing */ + /* now do the actual processing */ - if (header->flags & MAD_FLAG_LSF_EXT) { - unsigned char const *illegal_pos = granule[1].ch[1].scalefac; - mad_fixed_t const *lsf_scale; + if (header->flags & MAD_FLAG_LSF_EXT) { + unsigned char const *illegal_pos = granule[1].ch[1].scalefac; + mad_fixed_t const *lsf_scale; - /* intensity_scale */ - lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1]; + /* intensity_scale */ + lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1]; - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; - if (!(modes[sfbi] & I_STEREO)) - continue; + if (!(modes[sfbi] & I_STEREO)) { + continue; + } - if (illegal_pos[sfbi]) { - modes[sfbi] &= ~I_STEREO; - continue; - } + if (illegal_pos[sfbi]) { + modes[sfbi] &= ~I_STEREO; + continue; + } - is_pos = right_ch->scalefac[sfbi]; + is_pos = right_ch->scalefac[sfbi]; - for (i = 0; i < n; ++i) { - register mad_fixed_t left; + for (i = 0; i < n; ++i) { + register mad_fixed_t left; - left = xr[0][l + i]; + left = xr[0][l + i]; - if (is_pos == 0) - xr[1][l + i] = left; - else { - register mad_fixed_t opposite; + if (is_pos == 0) { + xr[1][l + i] = left; + } else { + register mad_fixed_t opposite; - opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); + opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); - if (is_pos & 1) { - xr[0][l + i] = opposite; - xr[1][l + i] = left; + if (is_pos & 1) { + xr[0][l + i] = opposite; + xr[1][l + i] = left; + } else { + xr[1][l + i] = opposite; + } + } + } } - else - xr[1][l + i] = opposite; - } - } - } - } - else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; + } else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; - if (!(modes[sfbi] & I_STEREO)) - continue; + if (!(modes[sfbi] & I_STEREO)) { + continue; + } - is_pos = right_ch->scalefac[sfbi]; + is_pos = right_ch->scalefac[sfbi]; - if (is_pos >= 7) { /* illegal intensity position */ - modes[sfbi] &= ~I_STEREO; - continue; - } + if (is_pos >= 7) { /* illegal intensity position */ + modes[sfbi] &= ~I_STEREO; + continue; + } - for (i = 0; i < n; ++i) { - register mad_fixed_t left; + for (i = 0; i < n; ++i) { + register mad_fixed_t left; - left = xr[0][l + i]; + left = xr[0][l + i]; - xr[0][l + i] = mad_f_mul(left, is_table( is_pos)); - xr[1][l + i] = mad_f_mul(left, is_table(6 - is_pos)); + xr[0][l + i] = mad_f_mul(left, is_table(is_pos)); + xr[1][l + i] = mad_f_mul(left, is_table(6 - is_pos)); + } + } } - } } - } - /* middle/side stereo */ + /* middle/side stereo */ - if (header->mode_extension & MS_STEREO) { - register mad_fixed_t invsqrt2; + if (header->mode_extension & MS_STEREO) { + register mad_fixed_t invsqrt2; - header->flags |= MAD_FLAG_MS_STEREO; + header->flags |= MAD_FLAG_MS_STEREO; - invsqrt2 = root_table(3 + -2); + invsqrt2 = root_table(3 + -2); - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; - if (modes[sfbi] != MS_STEREO) - continue; + if (modes[sfbi] != MS_STEREO) { + continue; + } - for (i = 0; i < n; ++i) { - register mad_fixed_t m, s; + for (i = 0; i < n; ++i) { + register mad_fixed_t m, s; - m = xr[0][l + i]; - s = xr[1][l + i]; + m = xr[0][l + i]; + s = xr[1][l + i]; - xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ - xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ - } + xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ + xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ + } + } } - } - return MAD_ERROR_NONE; + return MAD_ERROR_NONE; } /* - NAME: III_aliasreduce() - DESCRIPTION: perform frequency line alias reduction + NAME: III_aliasreduce() + DESCRIPTION: perform frequency line alias reduction */ static -void III_aliasreduce(mad_fixed_t xr[576], int lines) -{ - mad_fixed_t const *bound; - int i; - stack(__FUNCTION__, __FILE__, __LINE__); - - bound = &xr[lines]; - for (xr += 18; xr < bound; xr += 18) { - for (i = 0; i < 8; ++i) { - register mad_fixed_t a, b; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - - a = xr[-1 - i]; - b = xr[ i]; +void III_aliasreduce(mad_fixed_t xr[576], int lines) { + mad_fixed_t const *bound; + int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + bound = &xr[lines]; + for (xr += 18; xr < bound; xr += 18) { + for (i = 0; i < 8; ++i) { + register mad_fixed_t a, b; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + a = xr[-1 - i]; + b = xr[ i]; # if defined(ASO_ZEROCHECK) - if (a | b) { + if (a | b) { # endif - MAD_F_ML0(hi, lo, a, cs(i)); - MAD_F_MLA(hi, lo, -b, ca(i)); + MAD_F_ML0(hi, lo, a, cs(i)); + MAD_F_MLA(hi, lo, -b, ca(i)); - xr[-1 - i] = MAD_F_MLZ(hi, lo); + xr[-1 - i] = MAD_F_MLZ(hi, lo); - MAD_F_ML0(hi, lo, b, cs(i)); - MAD_F_MLA(hi, lo, a, ca(i)); + MAD_F_ML0(hi, lo, b, cs(i)); + MAD_F_MLA(hi, lo, a, ca(i)); - xr[ i] = MAD_F_MLZ(hi, lo); + xr[ i] = MAD_F_MLZ(hi, lo); # if defined(ASO_ZEROCHECK) - } + } # endif + } } - } } # if defined(ASO_IMDCT) @@ -1636,1134 +1641,1141 @@ void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); # else # if 1 static -void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18]) -{ - mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; - mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; - mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7; - - enum { - c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */ - c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */ - c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */ - c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */ - c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */ - c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */ - c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */ - }; - - a0 = x[3] + x[5]; - a1 = x[3] - x[5]; - a2 = x[6] + x[2]; - a3 = x[6] - x[2]; - a4 = x[1] + x[7]; - a5 = x[1] - x[7]; - a6 = x[8] + x[0]; - a7 = x[8] - x[0]; - - a8 = a0 + a2; - a9 = a0 - a2; - a10 = a0 - a6; - a11 = a2 - a6; - a12 = a8 + a6; - a13 = a1 - a3; - a14 = a13 + a7; - a15 = a3 + a7; - a16 = a1 - a7; - a17 = a1 + a3; - - m0 = mad_f_mul(a17, -c3); - m1 = mad_f_mul(a16, -c0); - m2 = mad_f_mul(a15, -c4); - m3 = mad_f_mul(a14, -c1); - m4 = mad_f_mul(a5, -c1); - m5 = mad_f_mul(a11, -c6); - m6 = mad_f_mul(a10, -c5); - m7 = mad_f_mul(a9, -c2); - - a18 = x[4] + a4; - a19 = 2 * x[4] - a4; - a20 = a19 + m5; - a21 = a19 - m5; - a22 = a19 + m6; - a23 = m4 + m2; - a24 = m4 - m2; - a25 = m4 + m1; - - /* output to every other slot for convenience */ - - y[ 0] = a18 + a12; - y[ 2] = m0 - a25; - y[ 4] = m7 - a20; - y[ 6] = m3; - y[ 8] = a21 - m6; - y[10] = a24 - m1; - y[12] = a12 - 2 * a18; - y[14] = a23 + m0; - y[16] = a22 + m7; +void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18]) { + mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; + mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; + mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7; + + enum { + c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */ + c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */ + c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */ + c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */ + c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */ + c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */ + c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */ + }; + + a0 = x[3] + x[5]; + a1 = x[3] - x[5]; + a2 = x[6] + x[2]; + a3 = x[6] - x[2]; + a4 = x[1] + x[7]; + a5 = x[1] - x[7]; + a6 = x[8] + x[0]; + a7 = x[8] - x[0]; + + a8 = a0 + a2; + a9 = a0 - a2; + a10 = a0 - a6; + a11 = a2 - a6; + a12 = a8 + a6; + a13 = a1 - a3; + a14 = a13 + a7; + a15 = a3 + a7; + a16 = a1 - a7; + a17 = a1 + a3; + + m0 = mad_f_mul(a17, -c3); + m1 = mad_f_mul(a16, -c0); + m2 = mad_f_mul(a15, -c4); + m3 = mad_f_mul(a14, -c1); + m4 = mad_f_mul(a5, -c1); + m5 = mad_f_mul(a11, -c6); + m6 = mad_f_mul(a10, -c5); + m7 = mad_f_mul(a9, -c2); + + a18 = x[4] + a4; + a19 = 2 * x[4] - a4; + a20 = a19 + m5; + a21 = a19 - m5; + a22 = a19 + m6; + a23 = m4 + m2; + a24 = m4 - m2; + a25 = m4 + m1; + + /* output to every other slot for convenience */ + + y[ 0] = a18 + a12; + y[ 2] = m0 - a25; + y[ 4] = m7 - a20; + y[ 6] = m3; + y[ 8] = a21 - m6; + y[10] = a24 - m1; + y[12] = a12 - 2 * a18; + y[14] = a23 + m0; + y[16] = a22 + m7; } static inline -void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18]) -{ - mad_fixed_t tmp[9]; - int i; - stack(__FUNCTION__, __FILE__, __LINE__); - - /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */ - static mad_fixed_t const scale[9] PROGMEM = { - MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930), - MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8), - MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7) - }; - - /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */ - - /* even input butterfly */ - - for (i = 0; i < 9; i += 3) { - tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1]; - tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1]; - tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1]; - } - - fastsdct(tmp, &X[0]); - - /* odd input butterfly and scaling */ - - for (i = 0; i < 9; i += 3) { - mad_fixed_t s; - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 0]; tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], s); //scale[i + 0]); - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 1]; tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], s); //scale[i + 1]); - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 2]; tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], s); //scale[i + 2]); - } - - fastsdct(tmp, &X[1]); - - /* output accumulation */ - - for (i = 3; i < 18; i += 8) { - X[i + 0] -= X[(i + 0) - 2]; - X[i + 2] -= X[(i + 2) - 2]; - X[i + 4] -= X[(i + 4) - 2]; - X[i + 6] -= X[(i + 6) - 2]; - } +void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18]) { + mad_fixed_t tmp[9]; + int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */ + static mad_fixed_t const scale[9] PROGMEM = { + MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930), + MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8), + MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7) + }; + + /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */ + + /* even input butterfly */ + + for (i = 0; i < 9; i += 3) { + tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1]; + tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1]; + tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1]; + } + + fastsdct(tmp, &X[0]); + + /* odd input butterfly and scaling */ + + for (i = 0; i < 9; i += 3) { + mad_fixed_t s; + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 0]; tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], s); //scale[i + 0]); + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 1]; tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], s); //scale[i + 1]); + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 2]; tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], s); //scale[i + 2]); + } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" + fastsdct(tmp, &X[1]); +#pragma GCC diagnostic pop + + /* output accumulation */ + + for (i = 3; i < 18; i += 8) { + X[i + 0] -= X[(i + 0) - 2]; + X[i + 2] -= X[(i + 2) - 2]; + X[i + 4] -= X[(i + 4) - 2]; + X[i + 6] -= X[(i + 6) - 2]; + } } static inline -void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18]) -{ - mad_fixed_t tmp[18]; - int i; - stack(__FUNCTION__, __FILE__, __LINE__); - - /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */ - static mad_fixed_t const scale[18] PROGMEM = { - MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120), - MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b), - MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4), - MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3), - MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5), - MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c) - }; - - /* scaling */ - - for (i = 0; i < 18; i += 3) { - mad_fixed_t s; - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 0]; tmp[i + 0] = mad_f_mul(y[i + 0], s); //scale[i + 0]); - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 1]; tmp[i + 1] = mad_f_mul(y[i + 1], s); //scale[i + 1]); - s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 2]; tmp[i + 2] = mad_f_mul(y[i + 2], s); //scale[i + 2]); - } - - /* SDCT-II */ - - sdctII(tmp, X); - - /* scale reduction and output accumulation */ - - X[0] /= 2; - for (i = 1; i < 17; i += 4) { - X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1]; - X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1]; - X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1]; - X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1]; - } - X[17] = X[17] / 2 - X[16]; +void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18]) { + mad_fixed_t tmp[18]; + int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */ + static mad_fixed_t const scale[18] PROGMEM = { + MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120), + MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b), + MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4), + MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3), + MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5), + MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c) + }; + + /* scaling */ + + for (i = 0; i < 18; i += 3) { + mad_fixed_t s; + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 0]; tmp[i + 0] = mad_f_mul(y[i + 0], s); //scale[i + 0]); + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 1]; tmp[i + 1] = mad_f_mul(y[i + 1], s); //scale[i + 1]); + s = *(volatile mad_fixed_t*)(volatile uint32_t*)&scale[i + 2]; tmp[i + 2] = mad_f_mul(y[i + 2], s); //scale[i + 2]); + } + + /* SDCT-II */ + + sdctII(tmp, X); + + /* scale reduction and output accumulation */ + + X[0] /= 2; + for (i = 1; i < 17; i += 4) { + X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1]; + X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1]; + X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1]; + X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1]; + } + X[17] = X[17] / 2 - X[16]; } /* - NAME: imdct36 - DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm + NAME: imdct36 + DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm */ static inline -void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36]) -{ - mad_fixed_t tmp[18]; - int i; - stack(__FUNCTION__, __FILE__, __LINE__); - - /* DCT-IV */ - - dctIV(x, tmp); - - /* convert 18-point DCT-IV to 36-point IMDCT */ - - for (i = 0; i < 9; i += 3) { - y[i + 0] = tmp[9 + (i + 0)]; - y[i + 1] = tmp[9 + (i + 1)]; - y[i + 2] = tmp[9 + (i + 2)]; - } - for (i = 9; i < 27; i += 3) { - y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1]; - y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1]; - y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1]; - } - for (i = 27; i < 36; i += 3) { - y[i + 0] = -tmp[(i + 0) - 27]; - y[i + 1] = -tmp[(i + 1) - 27]; - y[i + 2] = -tmp[(i + 2) - 27]; - } +void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36]) { + mad_fixed_t tmp[18]; + int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + /* DCT-IV */ + + dctIV(x, tmp); + + /* convert 18-point DCT-IV to 36-point IMDCT */ + + for (i = 0; i < 9; i += 3) { + y[i + 0] = tmp[9 + (i + 0)]; + y[i + 1] = tmp[9 + (i + 1)]; + y[i + 2] = tmp[9 + (i + 2)]; + } + for (i = 9; i < 27; i += 3) { + y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1]; + y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1]; + y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1]; + } + for (i = 27; i < 36; i += 3) { + y[i + 0] = -tmp[(i + 0) - 27]; + y[i + 1] = -tmp[(i + 1) - 27]; + y[i + 2] = -tmp[(i + 2) - 27]; + } } # else /* - NAME: imdct36 - DESCRIPTION: perform X[18]->x[36] IMDCT + NAME: imdct36 + DESCRIPTION: perform X[18]->x[36] IMDCT */ static inline -void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) -{ - mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; - mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - - MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); - - t6 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); - - t0 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); - - x[7] = MAD_F_MLZ(hi, lo); - x[10] = -x[7]; - - MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); - - x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; - - t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; - t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; - - MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); - - x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); - - t1 = MAD_F_MLZ(hi, lo) + t6; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); - - x[6] = MAD_F_MLZ(hi, lo) + t1; - x[11] = -x[6]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); - - x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); - - x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; - - MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); - - t7 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); - - t2 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); - - x[5] = MAD_F_MLZ(hi, lo); - x[12] = -x[5]; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352)); - - x[0] = MAD_F_MLZ(hi, lo) + t2; - x[17] = -x[0]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962)); - - x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549)); - - t3 = MAD_F_MLZ(hi, lo) + t7; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); - - x[8] = MAD_F_MLZ(hi, lo) + t3; - x[9] = -x[8]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); - - x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); - - x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; - - MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); - - t4 = MAD_F_MLZ(hi, lo) - t7; - - MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); - - x[4] = MAD_F_MLZ(hi, lo) + t4; - x[13] = -x[4]; - - MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); - - x[1] = MAD_F_MLZ(hi, lo) + t4; - x[16] = -x[1]; - - MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); - - x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); - - t5 = MAD_F_MLZ(hi, lo) - t6; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); - - x[2] = MAD_F_MLZ(hi, lo) + t5; - x[15] = -x[2]; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); - - x[3] = MAD_F_MLZ(hi, lo) + t5; - x[14] = -x[3]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); - - x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; +void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) { + mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; + mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); + + t6 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); + + t0 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); + + x[7] = MAD_F_MLZ(hi, lo); + x[10] = -x[7]; + + MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); + + x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; + + t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; + t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; + + MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); + + x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); + + t1 = MAD_F_MLZ(hi, lo) + t6; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); + + x[6] = MAD_F_MLZ(hi, lo) + t1; + x[11] = -x[6]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); + + x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); + + x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; + + MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); + + t7 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); + + t2 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); + + x[5] = MAD_F_MLZ(hi, lo); + x[12] = -x[5]; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352)); + + x[0] = MAD_F_MLZ(hi, lo) + t2; + x[17] = -x[0]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962)); + + x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549)); + + t3 = MAD_F_MLZ(hi, lo) + t7; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); + + x[8] = MAD_F_MLZ(hi, lo) + t3; + x[9] = -x[8]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); + + x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); + + x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; + + MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); + + t4 = MAD_F_MLZ(hi, lo) - t7; + + MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); + + x[4] = MAD_F_MLZ(hi, lo) + t4; + x[13] = -x[4]; + + MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); + + x[1] = MAD_F_MLZ(hi, lo) + t4; + x[16] = -x[1]; + + MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); + + x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); + + t5 = MAD_F_MLZ(hi, lo) - t6; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); + + x[2] = MAD_F_MLZ(hi, lo) + t5; + x[15] = -x[2]; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); + + x[3] = MAD_F_MLZ(hi, lo) + t5; + x[14] = -x[3]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); + + x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; } # endif /* - NAME: III_imdct_l() - DESCRIPTION: perform IMDCT and windowing for long blocks + NAME: III_imdct_l() + DESCRIPTION: perform IMDCT and windowing for long blocks */ static void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], - unsigned int block_type) -{ - unsigned int i; - stack(__FUNCTION__, __FILE__, __LINE__); + unsigned int block_type) { + unsigned int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); - /* IMDCT */ + /* IMDCT */ - imdct36(X, z); + imdct36(X, z); - /* windowing */ + /* windowing */ - switch (block_type) { + switch (block_type) { case 0: /* normal window */ # if defined(ASO_INTERLEAVE1) - { + { register mad_fixed_t tmp1, tmp2; tmp1 = window_l[0]; tmp2 = window_l[1]; for (i = 0; i < 34; i += 2) { - z[i + 0] = mad_f_mul(z[i + 0], tmp1); - tmp1 = window_l[i + 2]; - z[i + 1] = mad_f_mul(z[i + 1], tmp2); - tmp2 = window_l[i + 3]; + z[i + 0] = mad_f_mul(z[i + 0], tmp1); + tmp1 = window_l[i + 2]; + z[i + 1] = mad_f_mul(z[i + 1], tmp2); + tmp2 = window_l[i + 3]; } z[34] = mad_f_mul(z[34], tmp1); z[35] = mad_f_mul(z[35], tmp2); - } + } # elif defined(ASO_INTERLEAVE2) - { + { register mad_fixed_t tmp1, tmp2; tmp1 = z[0]; tmp2 = window_l[0]; for (i = 0; i < 35; ++i) { - z[i] = mad_f_mul(tmp1, tmp2); - tmp1 = z[i + 1]; - tmp2 = window_l[i + 1]; + z[i] = mad_f_mul(tmp1, tmp2); + tmp1 = z[i + 1]; + tmp2 = window_l[i + 1]; } z[35] = mad_f_mul(tmp1, tmp2); - } + } # elif 1 - for (i = 0; i < 36; i += 4) { + for (i = 0; i < 36; i += 4) { z[i + 0] = mad_f_mul(z[i + 0], window_l(i + 0)); z[i + 1] = mad_f_mul(z[i + 1], window_l(i + 1)); z[i + 2] = mad_f_mul(z[i + 2], window_l(i + 2)); z[i + 3] = mad_f_mul(z[i + 3], window_l(i + 3)); - } + } # else - for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); + for (i = 0; i < 36; ++i) { + z[i] = mad_f_mul(z[i], window_l[i]); + } # endif - break; + break; case 1: /* start block */ - for (i = 0; i < 18; i += 3) { - z[i + 0] = mad_f_mul(z[i + 0], window_l(i + 0)); - z[i + 1] = mad_f_mul(z[i + 1], window_l(i + 1)); - z[i + 2] = mad_f_mul(z[i + 2], window_l(i + 2)); - } - /* (i = 18; i < 24; ++i) z[i] unchanged */ - for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s(i - 18)); - for (i = 30; i < 36; ++i) z[i] = 0; - break; + for (i = 0; i < 18; i += 3) { + z[i + 0] = mad_f_mul(z[i + 0], window_l(i + 0)); + z[i + 1] = mad_f_mul(z[i + 1], window_l(i + 1)); + z[i + 2] = mad_f_mul(z[i + 2], window_l(i + 2)); + } + /* (i = 18; i < 24; ++i) z[i] unchanged */ + for (i = 24; i < 30; ++i) { + z[i] = mad_f_mul(z[i], window_s(i - 18)); + } + for (i = 30; i < 36; ++i) { + z[i] = 0; + } + break; case 3: /* stop block */ - for (i = 0; i < 6; ++i) z[i] = 0; - for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s(i - 6)); - /* (i = 12; i < 18; ++i) z[i] unchanged */ - for (i = 18; i < 36; i += 3) { - z[i + 0] = mad_f_mul(z[i + 0], window_l(i + 0)); - z[i + 1] = mad_f_mul(z[i + 1], window_l(i + 1)); - z[i + 2] = mad_f_mul(z[i + 2], window_l(i + 2)); - } - break; - } + for (i = 0; i < 6; ++i) { + z[i] = 0; + } + for (i = 6; i < 12; ++i) { + z[i] = mad_f_mul(z[i], window_s(i - 6)); + } + /* (i = 12; i < 18; ++i) z[i] unchanged */ + for (i = 18; i < 36; i += 3) { + z[i + 0] = mad_f_mul(z[i + 0], window_l(i + 0)); + z[i + 1] = mad_f_mul(z[i + 1], window_l(i + 1)); + z[i + 2] = mad_f_mul(z[i + 2], window_l(i + 2)); + } + break; + } } # endif /* ASO_IMDCT */ /* - NAME: III_imdct_s() - DESCRIPTION: perform IMDCT and windowing for short blocks + NAME: III_imdct_s() + DESCRIPTION: perform IMDCT and windowing for short blocks */ static -void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) -{ - mad_fixed_t y[36], *yptr; - int wptr; //mad_fixed_t const *wptr; - int w, i; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - // MAD_F_MLA may produce non-32b aligned reads, so copy from progmem to stack and work from there... - mad_fixed_t imdct_s_lcl[6][6]; - memcpy_P(imdct_s_lcl, imdct_s, sizeof(imdct_s)); - stack(__FUNCTION__, __FILE__, __LINE__); - - /* IMDCT */ - - yptr = &y[0]; - - for (w = 0; w < 3; ++w) { - register mad_fixed_t (*s)[6]; - - s = imdct_s_lcl; - - for (i = 0; i < 3; ++i) { - MAD_F_ML0(hi, lo, X[0], (*s)[0]); - MAD_F_MLA(hi, lo, X[1], (*s)[1]); - MAD_F_MLA(hi, lo, X[2], (*s)[2]); - MAD_F_MLA(hi, lo, X[3], (*s)[3]); - MAD_F_MLA(hi, lo, X[4], (*s)[4]); - MAD_F_MLA(hi, lo, X[5], (*s)[5]); - - yptr[i + 0] = MAD_F_MLZ(hi, lo); - yptr[5 - i] = -yptr[i + 0]; - - ++s; - - MAD_F_ML0(hi, lo, X[0], (*s)[0]); - MAD_F_MLA(hi, lo, X[1], (*s)[1]); - MAD_F_MLA(hi, lo, X[2], (*s)[2]); - MAD_F_MLA(hi, lo, X[3], (*s)[3]); - MAD_F_MLA(hi, lo, X[4], (*s)[4]); - MAD_F_MLA(hi, lo, X[5], (*s)[5]); - - yptr[ i + 6] = MAD_F_MLZ(hi, lo); - yptr[11 - i] = yptr[i + 6]; - - ++s; - } +void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) { + mad_fixed_t y[36], *yptr; + int wptr; //mad_fixed_t const *wptr; + int w, i; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + // MAD_F_MLA may produce non-32b aligned reads, so copy from progmem to stack and work from there... + mad_fixed_t imdct_s_lcl[6][6]; + memcpy_P(imdct_s_lcl, imdct_s, sizeof(imdct_s)); + stackenter(__FUNCTION__, __FILE__, __LINE__); + + /* IMDCT */ + + yptr = &y[0]; + + for (w = 0; w < 3; ++w) { + register mad_fixed_t (*s)[6]; + + s = imdct_s_lcl; + + for (i = 0; i < 3; ++i) { + MAD_F_ML0(hi, lo, X[0], (*s)[0]); + MAD_F_MLA(hi, lo, X[1], (*s)[1]); + MAD_F_MLA(hi, lo, X[2], (*s)[2]); + MAD_F_MLA(hi, lo, X[3], (*s)[3]); + MAD_F_MLA(hi, lo, X[4], (*s)[4]); + MAD_F_MLA(hi, lo, X[5], (*s)[5]); + + yptr[i + 0] = MAD_F_MLZ(hi, lo); + yptr[5 - i] = -yptr[i + 0]; + + ++s; + + MAD_F_ML0(hi, lo, X[0], (*s)[0]); + MAD_F_MLA(hi, lo, X[1], (*s)[1]); + MAD_F_MLA(hi, lo, X[2], (*s)[2]); + MAD_F_MLA(hi, lo, X[3], (*s)[3]); + MAD_F_MLA(hi, lo, X[4], (*s)[4]); + MAD_F_MLA(hi, lo, X[5], (*s)[5]); + + yptr[ i + 6] = MAD_F_MLZ(hi, lo); + yptr[11 - i] = yptr[i + 6]; + + ++s; + } - yptr += 12; - X += 6; - } + yptr += 12; + X += 6; + } - /* windowing, overlapping and concatenation */ + /* windowing, overlapping and concatenation */ - yptr = &y[0]; - wptr = 0; //wptr = &window_s[0]; + yptr = &y[0]; + wptr = 0; //wptr = &window_s[0]; - for (i = 0; i < 6; ++i) { - z[i + 0] = 0; - z[i + 6] = mad_f_mul(yptr[ 0 + 0], window_s(wptr + 0)); + for (i = 0; i < 6; ++i) { + z[i + 0] = 0; + z[i + 6] = mad_f_mul(yptr[ 0 + 0], window_s(wptr + 0)); - MAD_F_ML0(hi, lo, yptr[ 0 + 6], window_s(wptr + 6)); - MAD_F_MLA(hi, lo, yptr[12 + 0], window_s(wptr + 0)); + MAD_F_ML0(hi, lo, yptr[ 0 + 6], window_s(wptr + 6)); + MAD_F_MLA(hi, lo, yptr[12 + 0], window_s(wptr + 0)); - z[i + 12] = MAD_F_MLZ(hi, lo); + z[i + 12] = MAD_F_MLZ(hi, lo); - MAD_F_ML0(hi, lo, yptr[12 + 6], window_s(wptr + 6)); - MAD_F_MLA(hi, lo, yptr[24 + 0], window_s(wptr + 0)); + MAD_F_ML0(hi, lo, yptr[12 + 6], window_s(wptr + 6)); + MAD_F_MLA(hi, lo, yptr[24 + 0], window_s(wptr + 0)); - z[i + 18] = MAD_F_MLZ(hi, lo); + z[i + 18] = MAD_F_MLZ(hi, lo); - z[i + 24] = mad_f_mul(yptr[24 + 6], window_s(wptr + 6)); - z[i + 30] = 0; + z[i + 24] = mad_f_mul(yptr[24 + 6], window_s(wptr + 6)); + z[i + 30] = 0; - ++yptr; - ++wptr; - } + ++yptr; + ++wptr; + } } /* - NAME: III_overlap() - DESCRIPTION: perform overlap-add of windowed IMDCT outputs + NAME: III_overlap() + DESCRIPTION: perform overlap-add of windowed IMDCT outputs */ static void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], - mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; - stack(__FUNCTION__, __FILE__, __LINE__); + mad_fixed_t sample[18][32], unsigned int sb) { + unsigned int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); # if defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; + { + register mad_fixed_t tmp1, tmp2; - tmp1 = overlap[0]; - tmp2 = overlap[1]; + tmp1 = overlap[0]; + tmp2 = overlap[1]; - for (i = 0; i < 16; i += 2) { - sample[i + 0][sb] = output[i + 0 + 0] + tmp1; - overlap[i + 0] = output[i + 0 + 18]; - tmp1 = overlap[i + 2]; + for (i = 0; i < 16; i += 2) { + sample[i + 0][sb] = output[i + 0 + 0] + tmp1; + overlap[i + 0] = output[i + 0 + 18]; + tmp1 = overlap[i + 2]; - sample[i + 1][sb] = output[i + 1 + 0] + tmp2; - overlap[i + 1] = output[i + 1 + 18]; - tmp2 = overlap[i + 3]; - } + sample[i + 1][sb] = output[i + 1 + 0] + tmp2; + overlap[i + 1] = output[i + 1 + 18]; + tmp2 = overlap[i + 3]; + } - sample[16][sb] = output[16 + 0] + tmp1; - overlap[16] = output[16 + 18]; - sample[17][sb] = output[17 + 0] + tmp2; - overlap[17] = output[17 + 18]; - } + sample[16][sb] = output[16 + 0] + tmp1; + overlap[16] = output[16 + 18]; + sample[17][sb] = output[17 + 0] + tmp2; + overlap[17] = output[17 + 18]; + } # elif 0 - for (i = 0; i < 18; i += 2) { - sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0]; - overlap[i + 0] = output[i + 0 + 18]; + for (i = 0; i < 18; i += 2) { + sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0]; + overlap[i + 0] = output[i + 0 + 18]; - sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1]; - overlap[i + 1] = output[i + 1 + 18]; - } + sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1]; + overlap[i + 1] = output[i + 1 + 18]; + } # else - for (i = 0; i < 18; ++i) { - sample[i][sb] = output[i + 0] + overlap[i]; - overlap[i] = output[i + 18]; - } + for (i = 0; i < 18; ++i) { + sample[i][sb] = output[i + 0] + overlap[i]; + overlap[i] = output[i + 18]; + } # endif } /* - NAME: III_overlap_z() - DESCRIPTION: perform "overlap-add" of zero IMDCT outputs + NAME: III_overlap_z() + DESCRIPTION: perform "overlap-add" of zero IMDCT outputs */ static inline void III_overlap_z(mad_fixed_t overlap[18], - mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; + mad_fixed_t sample[18][32], unsigned int sb) { + unsigned int i; # if defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; + { + register mad_fixed_t tmp1, tmp2; - tmp1 = overlap[0]; - tmp2 = overlap[1]; + tmp1 = overlap[0]; + tmp2 = overlap[1]; - for (i = 0; i < 16; i += 2) { - sample[i + 0][sb] = tmp1; - overlap[i + 0] = 0; - tmp1 = overlap[i + 2]; + for (i = 0; i < 16; i += 2) { + sample[i + 0][sb] = tmp1; + overlap[i + 0] = 0; + tmp1 = overlap[i + 2]; - sample[i + 1][sb] = tmp2; - overlap[i + 1] = 0; - tmp2 = overlap[i + 3]; - } + sample[i + 1][sb] = tmp2; + overlap[i + 1] = 0; + tmp2 = overlap[i + 3]; + } - sample[16][sb] = tmp1; - overlap[16] = 0; - sample[17][sb] = tmp2; - overlap[17] = 0; - } + sample[16][sb] = tmp1; + overlap[16] = 0; + sample[17][sb] = tmp2; + overlap[17] = 0; + } # else - for (i = 0; i < 18; ++i) { - sample[i][sb] = overlap[i]; - overlap[i] = 0; - } + for (i = 0; i < 18; ++i) { + sample[i][sb] = overlap[i]; + overlap[i] = 0; + } # endif } /* - NAME: III_freqinver() - DESCRIPTION: perform subband frequency inversion for odd sample lines + NAME: III_freqinver() + DESCRIPTION: perform subband frequency inversion for odd sample lines */ static -void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; - stack(__FUNCTION__, __FILE__, __LINE__); +void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) { + unsigned int i; + stackenter(__FUNCTION__, __FILE__, __LINE__); # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; + { + register mad_fixed_t tmp1, tmp2; - tmp1 = sample[1][sb]; - tmp2 = sample[3][sb]; + tmp1 = sample[1][sb]; + tmp2 = sample[3][sb]; - for (i = 1; i < 13; i += 4) { - sample[i + 0][sb] = -tmp1; - tmp1 = sample[i + 4][sb]; - sample[i + 2][sb] = -tmp2; - tmp2 = sample[i + 6][sb]; - } + for (i = 1; i < 13; i += 4) { + sample[i + 0][sb] = -tmp1; + tmp1 = sample[i + 4][sb]; + sample[i + 2][sb] = -tmp2; + tmp2 = sample[i + 6][sb]; + } - sample[13][sb] = -tmp1; - tmp1 = sample[17][sb]; - sample[15][sb] = -tmp2; - sample[17][sb] = -tmp1; - } + sample[13][sb] = -tmp1; + tmp1 = sample[17][sb]; + sample[15][sb] = -tmp2; + sample[17][sb] = -tmp1; + } # else - for (i = 1; i < 18; i += 2) - sample[i][sb] = -sample[i][sb]; + for (i = 1; i < 18; i += 2) { + sample[i][sb] = -sample[i][sb]; + } # endif } /* - NAME: III_decode() - DESCRIPTION: decode frame main_data + NAME: III_decode() + DESCRIPTION: decode frame main_data */ static enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, - struct sideinfo *si, unsigned int nch) -{ - struct mad_header *header = &frame->header; - mad_fixed_t *xr[2]; // Moved from stack to dynheap -// mad_fixed_t *xr_raw; // [2][576] - unsigned int sfreqi, ngr, gr; -// xr_raw = (mad_fixed_t*)malloc(sizeof(mad_fixed_t) * 2 * 576); -// if (!xr_raw) -// return MAD_ERROR_NOMEM; - xr[0] = frame->xr_raw; //xr_raw; - xr[1] = frame->xr_raw + 576; //xr_raw + 576; - - stack(__FUNCTION__, __FILE__, __LINE__); - { - unsigned int sfreq; - - sfreq = header->samplerate; - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - sfreq *= 2; - - /* 48000 => 0, 44100 => 1, 32000 => 2, - 24000 => 3, 22050 => 4, 16000 => 5 */ - sfreqi = ((sfreq >> 7) & 0x000f) + - ((sfreq >> 15) & 0x0001) - 8; - - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - sfreqi += 3; - } - - /* scalefactors, Huffman decoding, requantization */ - - ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; - - for (gr = 0; gr < ngr; ++gr) { - struct granule *granule = &si->gr[gr]; - unsigned int const *sfbwidth[2]; - unsigned int ch; - enum mad_error error; - - for (ch = 0; ch < nch; ++ch) { - struct channel *channel = &granule->ch[ch]; - unsigned int part2_length; - - sfbwidth[ch] = sfbwidth_table[sfreqi].l; - if (channel->block_type == 2) { - sfbwidth[ch] = (channel->flags & mixed_block_flag) ? - sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; - } - - if (header->flags & MAD_FLAG_LSF_EXT) { - part2_length = III_scalefactors_lsf(ptr, channel, - ch == 0 ? 0 : &si->gr[1].ch[1], - header->mode_extension); - } - else { - part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch], - gr == 0 ? 0 : si->scfsi[ch]); - } - - error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length); - if (error) { -// free(xr_raw); - return error; - } - } + struct sideinfo *si, unsigned int nch) { + struct mad_header *header = &frame->header; + mad_fixed_t *xr[2]; // Moved from stack to dynheap + // mad_fixed_t *xr_raw; // [2][576] + unsigned int sfreqi, ngr, gr; + // xr_raw = (mad_fixed_t*)malloc(sizeof(mad_fixed_t) * 2 * 576); + // if (!xr_raw) + // return MAD_ERROR_NOMEM; + xr[0] = frame->xr_raw; //xr_raw; + xr[1] = frame->xr_raw + 576; //xr_raw + 576; + + stackenter(__FUNCTION__, __FILE__, __LINE__); + { + unsigned int sfreq; + + sfreq = header->samplerate; + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { + sfreq *= 2; + } - /* joint stereo processing */ + /* 48000 => 0, 44100 => 1, 32000 => 2, + 24000 => 3, 22050 => 4, 16000 => 5 */ + sfreqi = ((sfreq >> 7) & 0x000f) + + ((sfreq >> 15) & 0x0001) - 8; - if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) { - // (void*) below just to get rid of warning about passing in a * and not a [2][576] - error = III_stereo((void*)frame->xr_raw, granule, header, sfbwidth[0]); - if (error) { -// free(xr_raw); - return error; - } + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { + sfreqi += 3; + } } - /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */ + /* scalefactors, Huffman decoding, requantization */ - for (ch = 0; ch < nch; ++ch) { - struct channel const *channel = &granule->ch[ch]; - mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr]; - unsigned int sb, l, i, sblimit; - mad_fixed_t output[36]; + ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; - if (channel->block_type == 2) { - error = III_reorder(xr[ch], channel, sfbwidth[ch], frame->tmp); - if (error) { -// free(xr_raw); - return error; - } + for (gr = 0; gr < ngr; ++gr) { + struct granule *granule = &si->gr[gr]; + unsigned int const *sfbwidth[2]; + unsigned int ch; + enum mad_error error; -# if !defined(OPT_STRICT) - /* - According to ISO/IEC 11172-3, "Alias reduction is not applied for - granules with block_type == 2 (short block)." However, other - sources suggest alias reduction should indeed be performed on the - lower two subbands of mixed blocks. Most other implementations do - this, so by default we will too. - */ - if (channel->flags & mixed_block_flag) - III_aliasreduce(xr[ch], 36); -# endif - } - else - III_aliasreduce(xr[ch], 576); + for (ch = 0; ch < nch; ++ch) { + struct channel *channel = &granule->ch[ch]; + unsigned int part2_length; - l = 0; + sfbwidth[ch] = sfbwidth_table[sfreqi].l; + if (channel->block_type == 2) { + sfbwidth[ch] = (channel->flags & mixed_block_flag) ? + sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; + } - /* subbands 0-1 */ + if (header->flags & MAD_FLAG_LSF_EXT) { + part2_length = III_scalefactors_lsf(ptr, channel, + ch == 0 ? 0 : &si->gr[1].ch[1], + header->mode_extension); + } else { + part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch], + gr == 0 ? 0 : si->scfsi[ch]); + } - if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) { - unsigned int block_type; + error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length); + if (error) { + // free(xr_raw); + return error; + } + } - block_type = channel->block_type; - if (channel->flags & mixed_block_flag) - block_type = 0; + /* joint stereo processing */ - /* long blocks */ - for (sb = 0; sb < 2; ++sb, l += 18) { - III_imdct_l(&xr[ch][l], output, block_type); - III_overlap(output, frame->overlap[ch][sb], sample, sb); - } - } - else { - /* short blocks */ - for (sb = 0; sb < 2; ++sb, l += 18) { - III_imdct_s(&xr[ch][l], output); - III_overlap(output, frame->overlap[ch][sb], sample, sb); + if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) { + // (void*) below just to get rid of warning about passing in a * and not a [2][576] + error = III_stereo((void*)frame->xr_raw, granule, header, sfbwidth[0]); + if (error) { + // free(xr_raw); + return error; + } } - } - III_freqinver(sample, 1); + /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */ + + for (ch = 0; ch < nch; ++ch) { + struct channel const *channel = &granule->ch[ch]; + mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr]; + unsigned int sb, l, i, sblimit; + mad_fixed_t output[36]; - /* (nonzero) subbands 2-31 */ + if (channel->block_type == 2) { + error = III_reorder(xr[ch], channel, sfbwidth[ch], frame->tmp); + if (error) { + // free(xr_raw); + return error; + } - i = 576; - while (i > 36 && xr[ch][i - 1] == 0) - --i; +# if !defined(OPT_STRICT) + /* + According to ISO/IEC 11172-3, "Alias reduction is not applied for + granules with block_type == 2 (short block)." However, other + sources suggest alias reduction should indeed be performed on the + lower two subbands of mixed blocks. Most other implementations do + this, so by default we will too. + */ + if (channel->flags & mixed_block_flag) { + III_aliasreduce(xr[ch], 36); + } +# endif + } else { + III_aliasreduce(xr[ch], 576); + } - sblimit = 32 - (576 - i) / 18; + l = 0; + + /* subbands 0-1 */ + + if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) { + unsigned int block_type; + + block_type = channel->block_type; + if (channel->flags & mixed_block_flag) { + block_type = 0; + } + + /* long blocks */ + for (sb = 0; sb < 2; ++sb, l += 18) { + III_imdct_l(&xr[ch][l], output, block_type); + III_overlap(output, frame->overlap[ch][sb], sample, sb); + } + } else { + /* short blocks */ + for (sb = 0; sb < 2; ++sb, l += 18) { + III_imdct_s(&xr[ch][l], output); + III_overlap(output, frame->overlap[ch][sb], sample, sb); + } + } - if (channel->block_type != 2) { - /* long blocks */ - for (sb = 2; sb < sblimit; ++sb, l += 18) { - III_imdct_l(&xr[ch][l], output, channel->block_type); - III_overlap(output, frame->overlap[ch][sb], sample, sb); + III_freqinver(sample, 1); - if (sb & 1) - III_freqinver(sample, sb); - } - } - else { - /* short blocks */ - for (sb = 2; sb < sblimit; ++sb, l += 18) { - III_imdct_s(&xr[ch][l], output); - III_overlap(output, frame->overlap[ch][sb], sample, sb); - - if (sb & 1) - III_freqinver(sample, sb); - } - } + /* (nonzero) subbands 2-31 */ + + i = 576; + while (i > 36 && xr[ch][i - 1] == 0) { + --i; + } - /* remaining (zero) subbands */ + sblimit = 32 - (576 - i) / 18; + + if (channel->block_type != 2) { + /* long blocks */ + for (sb = 2; sb < sblimit; ++sb, l += 18) { + III_imdct_l(&xr[ch][l], output, channel->block_type); + III_overlap(output, frame->overlap[ch][sb], sample, sb); + + if (sb & 1) { + III_freqinver(sample, sb); + } + } + } else { + /* short blocks */ + for (sb = 2; sb < sblimit; ++sb, l += 18) { + III_imdct_s(&xr[ch][l], output); + III_overlap(output, frame->overlap[ch][sb], sample, sb); + + if (sb & 1) { + III_freqinver(sample, sb); + } + } + } - for (sb = sblimit; sb < 32; ++sb) { - III_overlap_z(frame->overlap[ch][sb], sample, sb); + /* remaining (zero) subbands */ - if (sb & 1) - III_freqinver(sample, sb); - } + for (sb = sblimit; sb < 32; ++sb) { + III_overlap_z(frame->overlap[ch][sb], sample, sb); + + if (sb & 1) { + III_freqinver(sample, sb); + } + } + } } - } -// free(xr_raw); - return MAD_ERROR_NONE; + // free(xr_raw); + return MAD_ERROR_NONE; } /* - NAME: layer->III() - DESCRIPTION: decode a single Layer III frame + NAME: layer->III() + DESCRIPTION: decode a single Layer III frame */ -int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) -{ - struct mad_header *header = &frame->header; - unsigned int nch, priv_bitlen, next_md_begin = 0; - unsigned int si_len, data_bitlen, md_len; - unsigned int frame_space, frame_used, frame_free; - struct mad_bitptr ptr; - struct sideinfo si; - enum mad_error error; - int result = 0; - stack(__FUNCTION__, __FILE__, __LINE__); - - nch = MAD_NCHANNELS(header); - si_len = (header->flags & MAD_FLAG_LSF_EXT) ? - (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); - - /* check frame sanity */ - - if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < - (signed int) si_len) { - stream->error = MAD_ERROR_BADFRAMELEN; - stream->md_len = 0; - return -1; - } - - /* check CRC word */ - - if (header->flags & MAD_FLAG_PROTECTION) { - header->crc_check = - mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); - - if (header->crc_check != header->crc_target && - !(frame->options & MAD_OPTION_IGNORECRC)) { - stream->error = MAD_ERROR_BADCRC; - result = -1; - } - } +int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) { + struct mad_header *header = &frame->header; + unsigned int nch, priv_bitlen, next_md_begin = 0; + unsigned int si_len, data_bitlen, md_len; + unsigned int frame_space, frame_used, frame_free; + struct mad_bitptr ptr; + struct sideinfo si; + enum mad_error error; + int result = 0; + stackenter(__FUNCTION__, __FILE__, __LINE__); - /* decode frame side information */ + nch = MAD_NCHANNELS(header); + si_len = (header->flags & MAD_FLAG_LSF_EXT) ? + (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); - error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, - &si, &data_bitlen, &priv_bitlen); - if (error && result == 0) { - stream->error = error; - result = -1; - } + /* check frame sanity */ - header->flags |= priv_bitlen; - header->private_bits |= si.private_bits; + if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < + (signed int) si_len) { + stream->error = MAD_ERROR_BADFRAMELEN; + stream->md_len = 0; + return -1; + } - /* find main_data of next frame */ + /* check CRC word */ - { - struct mad_bitptr peek; - unsigned long header; + if (header->flags & MAD_FLAG_PROTECTION) { + header->crc_check = + mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); - mad_bit_init(&peek, stream->next_frame); + if (header->crc_check != header->crc_target && + !(frame->options & MAD_OPTION_IGNORECRC)) { + stream->error = MAD_ERROR_BADCRC; + result = -1; + } + } - header = mad_bit_read(&peek, 32); - if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { - if (!(header & 0x00010000L)) /* protection_bit */ - mad_bit_skip(&peek, 16); /* crc_check */ + /* decode frame side information */ - next_md_begin = - mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); + error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, + &si, &data_bitlen, &priv_bitlen); + if (error && result == 0) { + stream->error = error; + result = -1; } - mad_bit_finish(&peek); - } - - /* find main_data of this frame */ + header->flags |= priv_bitlen; + header->private_bits |= si.private_bits; - frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); + /* find main_data of next frame */ - if (next_md_begin > si.main_data_begin + frame_space) - next_md_begin = 0; + { + struct mad_bitptr peek; + unsigned long header; - md_len = si.main_data_begin + frame_space - next_md_begin; + mad_bit_init(&peek, stream->next_frame); - frame_used = 0; + header = mad_bit_read(&peek, 32); + if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { + if (!(header & 0x00010000L)) { /* protection_bit */ + mad_bit_skip(&peek, 16); /* crc_check */ + } - if (si.main_data_begin == 0) { - ptr = stream->ptr; - stream->md_len = 0; + next_md_begin = + mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); + } - frame_used = md_len; - } - else { - if (si.main_data_begin > stream->md_len) { - if (result == 0) { - stream->error = MAD_ERROR_BADDATAPTR; - result = -1; - } + mad_bit_finish(&peek); } - else { - mad_bit_init(&ptr, - stream->main_data + stream->md_len - si.main_data_begin); - if (md_len > si.main_data_begin) { - assert(stream->md_len + md_len - - si.main_data_begin <= MAD_BUFFER_MDLEN); + /* find main_data of this frame */ - memcpy(stream->main_data + stream->md_len, - mad_bit_nextbyte(&stream->ptr), - frame_used = md_len - si.main_data_begin); - stream->md_len += frame_used; - } + frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); + + if (next_md_begin > si.main_data_begin + frame_space) { + next_md_begin = 0; } - } - frame_free = frame_space - frame_used; + md_len = si.main_data_begin + frame_space - next_md_begin; - /* decode main_data */ + frame_used = 0; - if (result == 0) { - error = III_decode(&ptr, frame, &si, nch); - if (error) { - stream->error = error; - result = -1; + if (si.main_data_begin == 0) { + ptr = stream->ptr; + stream->md_len = 0; + + frame_used = md_len; + } else { + if (si.main_data_begin > stream->md_len) { + if (result == 0) { + stream->error = MAD_ERROR_BADDATAPTR; + result = -1; + } + } else { + mad_bit_init(&ptr, + stream->main_data + stream->md_len - si.main_data_begin); + + if (md_len > si.main_data_begin) { + assert(stream->md_len + md_len - + si.main_data_begin <= MAD_BUFFER_MDLEN); + + memcpy(stream->main_data + stream->md_len, + mad_bit_nextbyte(&stream->ptr), + frame_used = md_len - si.main_data_begin); + stream->md_len += frame_used; + } + } } - /* designate ancillary bits */ + frame_free = frame_space - frame_used; + + /* decode main_data */ - stream->anc_ptr = ptr; - stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; - } + if (result == 0) { + error = III_decode(&ptr, frame, &si, nch); + if (error) { + stream->error = error; + result = -1; + } + + /* designate ancillary bits */ + + stream->anc_ptr = ptr; + stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; + } # if 0 && defined(DEBUG) - fprintf(stderr, - "main_data_begin:%u, md_len:%u, frame_free:%u, " - "data_bitlen:%u, anc_bitlen: %u\n", - si.main_data_begin, md_len, frame_free, - data_bitlen, stream->anc_bitlen); + fprintf(stderr, + "main_data_begin:%u, md_len:%u, frame_free:%u, " + "data_bitlen:%u, anc_bitlen: %u\n", + si.main_data_begin, md_len, frame_free, + data_bitlen, stream->anc_bitlen); # endif - /* preload main_data buffer with up to 511 bytes for next frame(s) */ - - if (frame_free >= next_md_begin) { - memcpy(stream->main_data, - stream->next_frame - next_md_begin, next_md_begin); - stream->md_len = next_md_begin; - } - else { - if (md_len < si.main_data_begin) { - unsigned int extra; - - extra = si.main_data_begin - md_len; - if (extra + frame_free > next_md_begin) - extra = next_md_begin - frame_free; - - if (extra < stream->md_len) { - memmove(stream->main_data, - stream->main_data + stream->md_len - extra, extra); - stream->md_len = extra; - } - } - else - stream->md_len = 0; + /* preload main_data buffer with up to 511 bytes for next frame(s) */ - memcpy(stream->main_data + stream->md_len, - stream->next_frame - frame_free, frame_free); - stream->md_len += frame_free; - } + if (frame_free >= next_md_begin) { + memcpy(stream->main_data, + stream->next_frame - next_md_begin, next_md_begin); + stream->md_len = next_md_begin; + } else { + if (md_len < si.main_data_begin) { + unsigned int extra; + + extra = si.main_data_begin - md_len; + if (extra + frame_free > next_md_begin) { + extra = next_md_begin - frame_free; + } + + if (extra < stream->md_len) { + memmove(stream->main_data, + stream->main_data + stream->md_len - extra, extra); + stream->md_len = extra; + } + } else { + stream->md_len = 0; + } + + memcpy(stream->main_data + stream->md_len, + stream->next_frame - frame_free, frame_free); + stream->md_len += frame_free; + } - return result; + return result; } diff --git a/src/libmad/layer3.h b/src/libmad/layer3.h index 2504d461..70ba11ce 100644 --- a/src/libmad/layer3.h +++ b/src/libmad/layer3.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: layer3.h,v 1.10 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: layer3.h,v 1.10 2004/01/23 09:41:32 rob Exp $ +*/ # ifndef LIBMAD_LAYER3_H # define LIBMAD_LAYER3_H diff --git a/src/libmad/mad.h b/src/libmad/mad.h index 0ed3a16a..0c415a07 100644 --- a/src/libmad/mad.h +++ b/src/libmad/mad.h @@ -1,24 +1,24 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * If you would like to negotiate alternate licensing terms, you may do - * so by contacting: Underbit Technologies, Inc. - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + If you would like to negotiate alternate licensing terms, you may do + so by contacting: Underbit Technologies, Inc. +*/ # ifdef __cplusplus extern "C" { @@ -89,27 +89,27 @@ typedef mad_fixed_t mad_sample_t; # endif /* - * Fixed-point format: 0xABBBBBBB - * A == whole part (sign + 3 bits) - * B == fractional part (28 bits) - * - * Values are signed two's complement, so the effective range is: - * 0x80000000 to 0x7fffffff - * -8.0 to +7.9999999962747097015380859375 - * - * The smallest representable value is: - * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) - * - * 28 bits of fractional accuracy represent about - * 8.6 digits of decimal accuracy. - * - * Fixed-point numbers can be added or subtracted as normal - * integers, but multiplication requires shifting the 64-bit result - * from 56 fractional bits back to 28 (and rounding.) - * - * Changing the definition of MAD_F_FRACBITS is only partially - * supported, and must be done with care. - */ + Fixed-point format: 0xABBBBBBB + A == whole part (sign + 3 bits) + B == fractional part (28 bits) + + Values are signed two's complement, so the effective range is: + 0x80000000 to 0x7fffffff + -8.0 to +7.9999999962747097015380859375 + + The smallest representable value is: + 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) + + 28 bits of fractional accuracy represent about + 8.6 digits of decimal accuracy. + + Fixed-point numbers can be added or subtracted as normal + integers, but multiplication requires shifting the 64-bit result + from 56 fractional bits back to 28 (and rounding.) + + Changing the definition of MAD_F_FRACBITS is only partially + supported, and must be done with care. +*/ # define MAD_F_FRACBITS 28 @@ -141,7 +141,7 @@ typedef mad_fixed_t mad_sample_t; # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) - /* (x should be positive) */ +/* (x should be positive) */ # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) @@ -162,9 +162,9 @@ typedef mad_fixed_t mad_sample_t; # elif defined(FPM_64BIT) /* - * This version should be the most accurate if 64-bit types are supported by - * the compiler, although it may not be the most efficient. - */ + This version should be the most accurate if 64-bit types are supported by + the compiler, although it may not be the most efficient. +*/ # if defined(OPT_ACCURACY) # define mad_f_mul(x, y) \ ((mad_fixed_t) \ @@ -185,19 +185,18 @@ typedef mad_fixed_t mad_sample_t; # pragma warning(push) # pragma warning(disable: 4035) /* no return value */ static __forceinline -mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) -{ - enum { - fracbits = MAD_F_FRACBITS - }; - - __asm { - mov eax, x - imul y - shrd eax, edx, fracbits - } - - /* implicit return of eax */ +mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) { + enum { + fracbits = MAD_F_FRACBITS + }; + + __asm { + mov eax, x + imul y + shrd eax, edx, fracbits + } + + /* implicit return of eax */ } # pragma warning(pop) @@ -205,9 +204,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # define mad_f_scale64 # else /* - * This Intel version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This Intel version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("imull %3" \ : "=a" (lo), "=d" (hi) \ @@ -216,8 +215,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This gives best accuracy but is not very fast. - */ + This gives best accuracy but is not very fast. +*/ # define MAD_F_MLA(hi, lo, x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -232,8 +231,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * Surprisingly, this is faster than SHRD followed by ADC. - */ + Surprisingly, this is faster than SHRD followed by ADC. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed64hi_t __hi_; \ mad_fixed64lo_t __lo_; \ @@ -252,8 +251,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) }) # elif defined(OPT_INTEL) /* - * Alternate Intel scaling that may or may not perform better. - */ + Alternate Intel scaling that may or may not perform better. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed_t __result; \ asm ("shrl %3,%1\n\t" \ @@ -283,15 +282,15 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_ARM) -/* - * This ARM V4 version is as accurate as FPM_64BIT but much faster. The - * least significant bit is properly rounded at no CPU cycle cost! - */ +/* + This ARM V4 version is as accurate as FPM_64BIT but much faster. The + least significant bit is properly rounded at no CPU cycle cost! +*/ # if 1 /* - * This is faster than the default implementation via MAD_F_MLX() and - * mad_f_scale64(). - */ + This is faster than the default implementation via MAD_F_MLX() and + mad_f_scale64(). +*/ # define mad_f_mul(x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -342,9 +341,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_MIPS) /* - * This MIPS version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This MIPS version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("mult %2,%3" \ : "=l" (lo), "=h" (hi) \ @@ -357,9 +356,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) : "%r" (x), "r" (y)) # elif defined(HAVE_MADD16_ASM) /* - * This loses significant accuracy due to the 16-bit integer limit in the - * multiply/accumulate instruction. - */ + This loses significant accuracy due to the 16-bit integer limit in the + multiply/accumulate instruction. +*/ # define MAD_F_ML0(hi, lo, x, y) \ asm ("mult %2,%3" \ : "=l" (lo), "=h" (hi) \ @@ -382,9 +381,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_SPARC) /* - * This SPARC V8 version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This SPARC V8 version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ asm ("smul %2, %3, %0\n\t" \ "rd %%y, %1" \ @@ -396,9 +395,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_PPC) /* - * This PowerPC version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ + This PowerPC version is fast and accurate; the disposition of the least + significant bit depends on OPT_ACCURACY via mad_f_scale64(). +*/ # define MAD_F_MLX(hi, lo, x, y) \ do { \ asm ("mullw %0,%1,%2" \ @@ -412,8 +411,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This gives best accuracy but is not very fast. - */ + This gives best accuracy but is not very fast. +*/ # define MAD_F_MLA(hi, lo, x, y) \ ({ mad_fixed64hi_t __hi; \ mad_fixed64lo_t __lo; \ @@ -429,8 +428,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # if defined(OPT_ACCURACY) /* - * This is slower than the truncating version below it. - */ + This is slower than the truncating version below it. +*/ # define mad_f_scale64(hi, lo) \ ({ mad_fixed_t __result, __round; \ asm ("rotrwi %0,%1,%2" \ @@ -467,14 +466,14 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) # elif defined(FPM_DEFAULT) /* - * This version is the most portable but it loses significant accuracy. - * Furthermore, accuracy is biased against the second argument, so care - * should be taken when ordering operands. - * - * The scale factors are constant as this is not used with SSO. - * - * Pre-rounding is required to stay within the limits of compliance. - */ + This version is the most portable but it loses significant accuracy. + Furthermore, accuracy is biased against the second argument, so care + should be taken when ordering operands. + + The scale factors are constant as this is not used with SSO. + + Pre-rounding is required to stay within the limits of compliance. +*/ # if defined(OPT_SPEED) # define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) # else @@ -546,9 +545,9 @@ mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); # define LIBMAD_BIT_H struct mad_bitptr { - unsigned char const *byte; - unsigned short cache; - unsigned short left; + unsigned char const *byte; + unsigned short cache; + unsigned short left; }; void mad_bit_init(struct mad_bitptr *, unsigned char const *); @@ -556,7 +555,7 @@ void mad_bit_init(struct mad_bitptr *, unsigned char const *); # define mad_bit_finish(bitptr) /* nothing */ unsigned int mad_bit_length(struct mad_bitptr const *, - struct mad_bitptr const *); + struct mad_bitptr const *); # define mad_bit_bitsleft(bitptr) ((bitptr)->left) unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); @@ -575,8 +574,8 @@ unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); # define LIBMAD_TIMER_H typedef struct { - signed long seconds; /* whole seconds */ - unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ + signed long seconds; /* whole seconds */ + unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ } mad_timer_t; extern mad_timer_t const mad_timer_zero; @@ -584,51 +583,51 @@ extern mad_timer_t const mad_timer_zero; # define MAD_TIMER_RESOLUTION 352800000UL enum mad_units { - MAD_UNITS_HOURS = -2, - MAD_UNITS_MINUTES = -1, - MAD_UNITS_SECONDS = 0, + MAD_UNITS_HOURS = -2, + MAD_UNITS_MINUTES = -1, + MAD_UNITS_SECONDS = 0, - /* metric units */ + /* metric units */ - MAD_UNITS_DECISECONDS = 10, - MAD_UNITS_CENTISECONDS = 100, - MAD_UNITS_MILLISECONDS = 1000, + MAD_UNITS_DECISECONDS = 10, + MAD_UNITS_CENTISECONDS = 100, + MAD_UNITS_MILLISECONDS = 1000, - /* audio sample units */ + /* audio sample units */ - MAD_UNITS_8000_HZ = 8000, - MAD_UNITS_11025_HZ = 11025, - MAD_UNITS_12000_HZ = 12000, + MAD_UNITS_8000_HZ = 8000, + MAD_UNITS_11025_HZ = 11025, + MAD_UNITS_12000_HZ = 12000, - MAD_UNITS_16000_HZ = 16000, - MAD_UNITS_22050_HZ = 22050, - MAD_UNITS_24000_HZ = 24000, + MAD_UNITS_16000_HZ = 16000, + MAD_UNITS_22050_HZ = 22050, + MAD_UNITS_24000_HZ = 24000, - MAD_UNITS_32000_HZ = 32000, - MAD_UNITS_44100_HZ = 44100, - MAD_UNITS_48000_HZ = 48000, + MAD_UNITS_32000_HZ = 32000, + MAD_UNITS_44100_HZ = 44100, + MAD_UNITS_48000_HZ = 48000, - /* video frame/field units */ + /* video frame/field units */ - MAD_UNITS_24_FPS = 24, - MAD_UNITS_25_FPS = 25, - MAD_UNITS_30_FPS = 30, - MAD_UNITS_48_FPS = 48, - MAD_UNITS_50_FPS = 50, - MAD_UNITS_60_FPS = 60, + MAD_UNITS_24_FPS = 24, + MAD_UNITS_25_FPS = 25, + MAD_UNITS_30_FPS = 30, + MAD_UNITS_48_FPS = 48, + MAD_UNITS_50_FPS = 50, + MAD_UNITS_60_FPS = 60, - /* CD audio frames */ + /* CD audio frames */ - MAD_UNITS_75_FPS = 75, + MAD_UNITS_75_FPS = 75, - /* video drop-frame units */ + /* video drop-frame units */ - MAD_UNITS_23_976_FPS = -24, - MAD_UNITS_24_975_FPS = -25, - MAD_UNITS_29_97_FPS = -30, - MAD_UNITS_47_952_FPS = -48, - MAD_UNITS_49_95_FPS = -50, - MAD_UNITS_59_94_FPS = -60 + MAD_UNITS_23_976_FPS = -24, + MAD_UNITS_24_975_FPS = -25, + MAD_UNITS_29_97_FPS = -30, + MAD_UNITS_47_952_FPS = -48, + MAD_UNITS_49_95_FPS = -50, + MAD_UNITS_59_94_FPS = -60 }; # define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) @@ -647,7 +646,7 @@ void mad_timer_multiply(mad_timer_t *, signed long); signed long mad_timer_count(mad_timer_t, enum mad_units); unsigned long mad_timer_fraction(mad_timer_t, unsigned long); void mad_timer_string(mad_timer_t, char *, char const *, - enum mad_units, enum mad_units, unsigned long); + enum mad_units, enum mad_units, unsigned long); # endif @@ -661,66 +660,66 @@ void mad_timer_string(mad_timer_t, char *, char const *, # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) enum mad_error { - MAD_ERROR_NONE = 0x0000, /* no error */ - - MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ - MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ - - MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ - - MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ - MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ - MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ - MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ - MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ - - MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ - MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ - MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ - MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ - MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ - MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ - MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ - MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ - MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ - MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ - MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ - MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ - MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ + MAD_ERROR_NONE = 0x0000, /* no error */ + + MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ + MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ + + MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ + + MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ + MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ + MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ + MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ + MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ + + MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ + MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ + MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ + MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ + MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ + MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ + MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ + MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ + MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ + MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ + MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ + MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ + MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ }; # define MAD_RECOVERABLE(error) ((error) & 0xff00) struct mad_stream { - unsigned char const *buffer; /* input bitstream buffer */ - unsigned char const *bufend; /* end of buffer */ - unsigned long skiplen; /* bytes to skip before next frame */ + unsigned char const *buffer; /* input bitstream buffer */ + unsigned char const *bufend; /* end of buffer */ + unsigned long skiplen; /* bytes to skip before next frame */ - int sync; /* stream sync found */ - unsigned long freerate; /* free bitrate (fixed) */ + int sync; /* stream sync found */ + unsigned long freerate; /* free bitrate (fixed) */ - unsigned char const *this_frame; /* start of current frame */ - unsigned char const *next_frame; /* start of next frame */ - struct mad_bitptr ptr; /* current processing bit pointer */ + unsigned char const *this_frame; /* start of current frame */ + unsigned char const *next_frame; /* start of next frame */ + struct mad_bitptr ptr; /* current processing bit pointer */ - struct mad_bitptr anc_ptr; /* ancillary bits pointer */ - unsigned int anc_bitlen; /* number of ancillary bits */ + struct mad_bitptr anc_ptr; /* ancillary bits pointer */ + unsigned int anc_bitlen; /* number of ancillary bits */ - unsigned char main_data[MAD_BUFFER_MDLEN]; - /* Layer III main_data() */ - unsigned int md_len; /* bytes in main_data */ + unsigned char main_data[MAD_BUFFER_MDLEN]; + /* Layer III main_data() */ + unsigned int md_len; /* bytes in main_data */ - int options; /* decoding options (see below) */ - enum mad_error error; /* error code (see above) */ + int options; /* decoding options (see below) */ + enum mad_error error; /* error code (see above) */ }; enum { - MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ - MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ + MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ + MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ # if 0 /* not yet implemented */ - MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ - MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ - MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ + MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ + MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ + MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ # endif }; @@ -731,7 +730,7 @@ void mad_stream_finish(struct mad_stream *); ((void) ((stream)->options = (opts))) void mad_stream_buffer(struct mad_stream *, - unsigned char const *, unsigned long); + unsigned char const *, unsigned long); void mad_stream_skip(struct mad_stream *, unsigned long); int mad_stream_sync(struct mad_stream *); @@ -747,53 +746,53 @@ char const *mad_stream_errorstr(struct mad_stream const *); enum mad_layer { - MAD_LAYER_I = 1, /* Layer I */ - MAD_LAYER_II = 2, /* Layer II */ - MAD_LAYER_III = 3 /* Layer III */ + MAD_LAYER_I = 1, /* Layer I */ + MAD_LAYER_II = 2, /* Layer II */ + MAD_LAYER_III = 3 /* Layer III */ }; enum mad_mode { - MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ - MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ - MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ - MAD_MODE_STEREO = 3 /* normal LR stereo */ + MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ + MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ + MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ + MAD_MODE_STEREO = 3 /* normal LR stereo */ }; enum mad_emphasis { - MAD_EMPHASIS_NONE = 0, /* no emphasis */ - MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ - MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ - MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ + MAD_EMPHASIS_NONE = 0, /* no emphasis */ + MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ + MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ + MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ }; struct mad_header { - enum mad_layer layer; /* audio layer (1, 2, or 3) */ - enum mad_mode mode; /* channel mode (see above) */ - int mode_extension; /* additional mode info */ - enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ + enum mad_layer layer; /* audio layer (1, 2, or 3) */ + enum mad_mode mode; /* channel mode (see above) */ + int mode_extension; /* additional mode info */ + enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ - unsigned long bitrate; /* stream bitrate (bps) */ - unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned long bitrate; /* stream bitrate (bps) */ + unsigned int samplerate; /* sampling frequency (Hz) */ - unsigned short crc_check; /* frame CRC accumulator */ - unsigned short crc_target; /* final target CRC checksum */ + unsigned short crc_check; /* frame CRC accumulator */ + unsigned short crc_target; /* final target CRC checksum */ - int flags; /* flags (see below) */ - int private_bits; /* private bits (see below) */ + int flags; /* flags (see below) */ + int private_bits; /* private bits (see below) */ - mad_timer_t duration; /* audio playing time of frame */ + mad_timer_t duration; /* audio playing time of frame */ }; struct mad_frame { - struct mad_header header; /* MPEG audio header */ + struct mad_header header; /* MPEG audio header */ - int options; /* decoding options (from stream) */ + int options; /* decoding options (from stream) */ - mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ - mad_fixed_t overlap[2][32][18]; /* Layer III block overlap data */ + mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ + mad_fixed_t overlap[2][32][18]; /* Layer III block overlap data */ - mad_fixed_t xr_raw[576*2]; - mad_fixed_t tmp[576]; + mad_fixed_t xr_raw[576 * 2]; + mad_fixed_t tmp[576]; }; # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) @@ -803,26 +802,26 @@ struct mad_frame { ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) enum { - MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ - MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ + MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ + MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ - MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ - MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ - MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ - MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ + MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ + MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ + MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ + MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ - MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ - MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ - MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ + MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ + MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ + MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ - MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ - MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ - MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ + MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ + MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ + MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ }; enum { - MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ - MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ + MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ + MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ }; void mad_header_init(struct mad_header *); @@ -847,36 +846,36 @@ void mad_frame_mute(struct mad_frame *); struct mad_pcm { - unsigned int samplerate; /* sampling frequency (Hz) */ - unsigned short channels; /* number of channels */ - unsigned short length; /* number of samples per channel */ - int16_t samples[2][32];//1152]; /* PCM output samples [ch][sample] */ + unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned short channels; /* number of channels */ + unsigned short length; /* number of samples per channel */ + int16_t samples[2][32];//1152]; /* PCM output samples [ch][sample] */ }; struct mad_synth { - mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ - /* [ch][eo][peo][s][v] */ + mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ + /* [ch][eo][peo][s][v] */ - unsigned int phase; /* current processing phase */ + unsigned int phase; /* current processing phase */ - struct mad_pcm pcm; /* PCM output */ + struct mad_pcm pcm; /* PCM output */ }; /* single channel PCM selector */ enum { - MAD_PCM_CHANNEL_SINGLE = 0 + MAD_PCM_CHANNEL_SINGLE = 0 }; /* dual channel PCM selector */ enum { - MAD_PCM_CHANNEL_DUAL_1 = 0, - MAD_PCM_CHANNEL_DUAL_2 = 1 + MAD_PCM_CHANNEL_DUAL_1 = 0, + MAD_PCM_CHANNEL_DUAL_2 = 1 }; /* stereo PCM selector */ enum { - MAD_PCM_CHANNEL_STEREO_LEFT = 0, - MAD_PCM_CHANNEL_STEREO_RIGHT = 1 + MAD_PCM_CHANNEL_STEREO_LEFT = 0, + MAD_PCM_CHANNEL_STEREO_RIGHT = 1 }; void mad_synth_init(struct mad_synth *); @@ -885,16 +884,16 @@ void mad_synth_init(struct mad_synth *); enum mad_flow { - MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ - MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ - MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ - MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ + MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ + MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ + MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ + MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ }; void mad_synth_mute(struct mad_synth *); -enum mad_flow mad_synth_frame(struct mad_synth *, struct mad_frame const *, enum mad_flow (*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata ); +enum mad_flow mad_synth_frame(struct mad_synth *, struct mad_frame const *, enum mad_flow(*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata); enum mad_flow mad_synth_frame_onens(struct mad_synth *synth, struct mad_frame const *frame, unsigned int ns); # endif @@ -906,53 +905,53 @@ enum mad_flow mad_synth_frame_onens(struct mad_synth *synth, struct mad_frame co enum mad_decoder_mode { - MAD_DECODER_MODE_SYNC = 0, - MAD_DECODER_MODE_ASYNC + MAD_DECODER_MODE_SYNC = 0, + MAD_DECODER_MODE_ASYNC }; struct mad_decoder { - enum mad_decoder_mode mode; - - int options; - - struct { - long pid; - int in; - int out; - } async; - - struct { - struct mad_stream stream; - struct mad_frame frame; - struct mad_synth synth; - } *sync; - - void *cb_data; - - enum mad_flow (*input_func)(void *, struct mad_stream *); - enum mad_flow (*header_func)(void *, struct mad_header const *); - enum mad_flow (*filter_func)(void *, - struct mad_stream const *, struct mad_frame *); - enum mad_flow (*output_func)(void *, - struct mad_header const *, struct mad_pcm *); - enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); - enum mad_flow (*message_func)(void *, void *, unsigned int *); + enum mad_decoder_mode mode; + + int options; + + struct { + long pid; + int in; + int out; + } async; + + struct { + struct mad_stream stream; + struct mad_frame frame; + struct mad_synth synth; + } *sync; + + void *cb_data; + + enum mad_flow(*input_func)(void *, struct mad_stream *); + enum mad_flow(*header_func)(void *, struct mad_header const *); + enum mad_flow(*filter_func)(void *, + struct mad_stream const *, struct mad_frame *); + enum mad_flow(*output_func)(void *, + struct mad_header const *, struct mad_pcm *); + enum mad_flow(*error_func)(void *, struct mad_stream *, struct mad_frame *); + enum mad_flow(*message_func)(void *, void *, unsigned int *); }; void mad_decoder_init(struct mad_decoder *, void *, - enum mad_flow (*)(void *, struct mad_stream *), - enum mad_flow (*)(void *, struct mad_header const *), - enum mad_flow (*)(void *, - struct mad_stream const *, - struct mad_frame *), - enum mad_flow (*)(void *, - struct mad_header const *, - struct mad_pcm *), - enum mad_flow (*)(void *, - struct mad_stream *, - struct mad_frame *), - enum mad_flow (*)(void *, void *, unsigned int *)); + enum mad_flow(*)(void *, struct mad_stream *), + enum mad_flow(*)(void *, struct mad_header const *), + enum mad_flow(*)(void *, + struct mad_stream const *, + struct mad_frame *), + enum mad_flow(*)(void *, + struct mad_header const *, + struct mad_pcm *), + enum mad_flow(*)(void *, + struct mad_stream *, + struct mad_frame *), + enum mad_flow(*)(void *, void *, unsigned int *)); int mad_decoder_finish(struct mad_decoder *); # define mad_decoder_options(decoder, opts) \ diff --git a/src/libmad/qc_table.dat.h b/src/libmad/qc_table.dat.h index 35a22234..6fb36ec0 100644 --- a/src/libmad/qc_table.dat.h +++ b/src/libmad/qc_table.dat.h @@ -1,77 +1,95 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: qc_table.dat,v 1.7 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: qc_table.dat,v 1.7 2004/01/23 09:41:32 rob Exp $ +*/ /* - * These are the Layer II classes of quantization. - * The table is derived from Table B.4 of ISO/IEC 11172-3. - */ + These are the Layer II classes of quantization. + The table is derived from Table B.4 of ISO/IEC 11172-3. +*/ - { 3, 2, 5, +{ + 3, 2, 5, MAD_F(0x15555555) /* 1.33333333333 => 1.33333333209, e 0.00000000124 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 5, 3, 7, + MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ +}, { + 5, 3, 7, MAD_F(0x1999999a) /* 1.60000000000 => 1.60000000149, e -0.00000000149 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 7, 0, 3, + MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ +}, { + 7, 0, 3, MAD_F(0x12492492) /* 1.14285714286 => 1.14285714179, e 0.00000000107 */, - MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ }, - { 9, 4, 10, + MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ +}, { + 9, 4, 10, MAD_F(0x1c71c71c) /* 1.77777777777 => 1.77777777612, e 0.00000000165 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 15, 0, 4, + MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ +}, { + 15, 0, 4, MAD_F(0x11111111) /* 1.06666666666 => 1.06666666642, e 0.00000000024 */, - MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ }, - { 31, 0, 5, + MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ +}, { + 31, 0, 5, MAD_F(0x10842108) /* 1.03225806452 => 1.03225806355, e 0.00000000097 */, - MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ }, - { 63, 0, 6, + MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ +}, { + 63, 0, 6, MAD_F(0x10410410) /* 1.01587301587 => 1.01587301493, e 0.00000000094 */, - MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ }, - { 127, 0, 7, + MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ +}, { + 127, 0, 7, MAD_F(0x10204081) /* 1.00787401575 => 1.00787401572, e 0.00000000003 */, - MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ }, - { 255, 0, 8, + MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ +}, { + 255, 0, 8, MAD_F(0x10101010) /* 1.00392156863 => 1.00392156839, e 0.00000000024 */, - MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ }, - { 511, 0, 9, + MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ +}, { + 511, 0, 9, MAD_F(0x10080402) /* 1.00195694716 => 1.00195694715, e 0.00000000001 */, - MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ }, - { 1023, 0, 10, + MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ +}, { + 1023, 0, 10, MAD_F(0x10040100) /* 1.00097751711 => 1.00097751617, e 0.00000000094 */, - MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ }, - { 2047, 0, 11, + MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ +}, { + 2047, 0, 11, MAD_F(0x10020040) /* 1.00048851979 => 1.00048851967, e 0.00000000012 */, - MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ }, - { 4095, 0, 12, + MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ +}, { + 4095, 0, 12, MAD_F(0x10010010) /* 1.00024420024 => 1.00024420023, e 0.00000000001 */, - MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ }, - { 8191, 0, 13, + MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ +}, { + 8191, 0, 13, MAD_F(0x10008004) /* 1.00012208522 => 1.00012208521, e 0.00000000001 */, - MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ }, - { 16383, 0, 14, + MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ +}, { + 16383, 0, 14, MAD_F(0x10004001) /* 1.00006103888 => 1.00006103888, e -0.00000000000 */, - MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ }, - { 32767, 0, 15, + MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ +}, { + 32767, 0, 15, MAD_F(0x10002000) /* 1.00003051851 => 1.00003051758, e 0.00000000093 */, - MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ }, - { 65535, 0, 16, + MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ +}, { + 65535, 0, 16, MAD_F(0x10001000) /* 1.00001525902 => 1.00001525879, e 0.00000000023 */, - MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ } + MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ +} diff --git a/src/libmad/rq_table.dat.h b/src/libmad/rq_table.dat.h index 059c4f31..34b26303 100644 --- a/src/libmad/rq_table.dat.h +++ b/src/libmad/rq_table.dat.h @@ -1,8747 +1,8747 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: rq_table.dat,v 1.7 2004/01/23 09:41:32 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: rq_table.dat,v 1.7 2004/01/23 09:41:32 rob Exp $ +*/ /* - * This is the lookup table used to compute x^(4/3) for Layer III - * requantization. To maintain the best possible accuracy, the value is - * stored as a normalized mantissa with exponent. The requantization - * algorithm recombines these parts with appropriate scaling. - */ - - /* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, - /* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, - /* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, - /* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, - /* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, - /* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, - /* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, - /* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, - /* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, - /* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, - /* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, - /* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, - /* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, - /* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, - /* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, - /* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, - - /* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, - /* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, - /* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, - /* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, - /* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, - /* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, - /* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, - /* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, - /* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, - /* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, - /* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, - /* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, - /* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, - /* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, - /* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, - /* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, - - /* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, - /* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, - /* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, - /* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, - /* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, - /* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, - /* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, - /* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, - /* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, - /* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, - /* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, - /* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, - /* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, - /* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, - /* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, - /* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, - - /* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, - /* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, - /* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, - /* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, - /* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, - /* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, - /* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, - /* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, - /* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, - /* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, - /* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, - /* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, - /* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, - /* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, - /* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, - /* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, - - /* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, - /* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, - /* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, - /* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, - /* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, - /* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, - /* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, - /* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, - /* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, - /* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, - /* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, - /* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, - /* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, - /* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, - /* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, - /* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, - - /* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, - /* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, - /* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, - /* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, - /* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, - /* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, - /* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, - /* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, - /* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, - /* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, - /* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, - /* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, - /* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, - /* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, - /* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, - /* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, - - /* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, - /* 97 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 10 }, - /* 98 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 10 }, - /* 99 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 10 }, - /* 100 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 10 }, - /* 101 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 10 }, - /* 102 */ { MAD_F(0x07724f64) /* 0.465407744 */, 10 }, - /* 103 */ { MAD_F(0x078b4514) /* 0.471501425 */, 10 }, - /* 104 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 10 }, - /* 105 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 10 }, - /* 106 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 10 }, - /* 107 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 10 }, - /* 108 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 11 }, - /* 109 */ { MAD_F(0x04115aca) /* 0.254236974 */, 11 }, - /* 110 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 11 }, - /* 111 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 11 }, - - /* 112 */ { MAD_F(0x0437be65) /* 0.263609310 */, 11 }, - /* 113 */ { MAD_F(0x04449dee) /* 0.266752177 */, 11 }, - /* 114 */ { MAD_F(0x04518733) /* 0.269904329 */, 11 }, - /* 115 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 11 }, - /* 116 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 11 }, - /* 117 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 11 }, - /* 118 */ { MAD_F(0x04858c83) /* 0.282604707 */, 11 }, - /* 119 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 11 }, - /* 120 */ { MAD_F(0x049fc824) /* 0.289009227 */, 11 }, - /* 121 */ { MAD_F(0x04acf402) /* 0.292224893 */, 11 }, - /* 122 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 11 }, - /* 123 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 11 }, - /* 124 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 11 }, - /* 125 */ { MAD_F(0x04e20000) /* 0.305175781 */, 11 }, - /* 126 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 11 }, - /* 127 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 11 }, - - /* 128 */ { MAD_F(0x050a28be) /* 0.314980262 */, 11 }, - /* 129 */ { MAD_F(0x05179da4) /* 0.318265572 */, 11 }, - /* 130 */ { MAD_F(0x05251b73) /* 0.321559381 */, 11 }, - /* 131 */ { MAD_F(0x0532a220) /* 0.324861647 */, 11 }, - /* 132 */ { MAD_F(0x054031a0) /* 0.328172327 */, 11 }, - /* 133 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 11 }, - /* 134 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 11 }, - /* 135 */ { MAD_F(0x0569149c) /* 0.338154423 */, 11 }, - /* 136 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 11 }, - /* 137 */ { MAD_F(0x058481e9) /* 0.344850455 */, 11 }, - /* 138 */ { MAD_F(0x0592456d) /* 0.348210741 */, 11 }, - /* 139 */ { MAD_F(0x05a01176) /* 0.351579152 */, 11 }, - /* 140 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 11 }, - /* 141 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 11 }, - /* 142 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 11 }, - /* 143 */ { MAD_F(0x05d79601) /* 0.365133291 */, 11 }, - - /* 144 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 11 }, - /* 145 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 11 }, - /* 146 */ { MAD_F(0x060190ee) /* 0.375382356 */, 11 }, - /* 147 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 11 }, - /* 148 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 11 }, - /* 149 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 11 }, - /* 150 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 11 }, - /* 151 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 11 }, - /* 152 */ { MAD_F(0x06566361) /* 0.396090870 */, 11 }, - /* 153 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 11 }, - /* 154 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 11 }, - /* 155 */ { MAD_F(0x068138f3) /* 0.406548452 */, 11 }, - /* 156 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 11 }, - /* 157 */ { MAD_F(0x069deed1) /* 0.413557833 */, 11 }, - /* 158 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 11 }, - /* 159 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 11 }, - - /* 160 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 11 }, - /* 161 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 11 }, - /* 162 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 11 }, - /* 163 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 11 }, - /* 164 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 11 }, - /* 165 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 11 }, - /* 166 */ { MAD_F(0x0720a087) /* 0.445465593 */, 11 }, - /* 167 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 11 }, - /* 168 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 11 }, - /* 169 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 11 }, - /* 170 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 11 }, - /* 171 */ { MAD_F(0x076a454c) /* 0.463444993 */, 11 }, - /* 172 */ { MAD_F(0x07791620) /* 0.467062117 */, 11 }, - /* 173 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 11 }, - /* 174 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 11 }, - /* 175 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 11 }, - - /* 176 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 11 }, - /* 177 */ { MAD_F(0x07c39812) /* 0.485252449 */, 11 }, - /* 178 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 11 }, - /* 179 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 11 }, - /* 180 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 11 }, - /* 181 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 11 }, - /* 182 */ { MAD_F(0x0407673f) /* 0.251807447 */, 12 }, - /* 183 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 12 }, - /* 184 */ { MAD_F(0x04168b05) /* 0.255503674 */, 12 }, - /* 185 */ { MAD_F(0x041e2230) /* 0.257356825 */, 12 }, - /* 186 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 12 }, - /* 187 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 12 }, - /* 188 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 12 }, - /* 189 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 12 }, - /* 190 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 12 }, - /* 191 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 12 }, - - /* 192 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 12 }, - /* 193 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 12 }, - /* 194 */ { MAD_F(0x04630eed) /* 0.274184158 */, 12 }, - /* 195 */ { MAD_F(0x046ac896) /* 0.276070203 */, 12 }, - /* 196 */ { MAD_F(0x047285a2) /* 0.277959474 */, 12 }, - /* 197 */ { MAD_F(0x047a460c) /* 0.279851960 */, 12 }, - /* 198 */ { MAD_F(0x048209d3) /* 0.281747652 */, 12 }, - /* 199 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 12 }, - /* 200 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 12 }, - /* 201 */ { MAD_F(0x04996935) /* 0.287453849 */, 12 }, - /* 202 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 12 }, - /* 203 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 12 }, - /* 204 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 12 }, - /* 205 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 12 }, - /* 206 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 12 }, - /* 207 */ { MAD_F(0x04c88135) /* 0.298951346 */, 12 }, - - /* 208 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 12 }, - /* 209 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 12 }, - /* 210 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 12 }, - /* 211 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 12 }, - /* 212 */ { MAD_F(0x04f01963) /* 0.308617963 */, 12 }, - /* 213 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 12 }, - /* 214 */ { MAD_F(0x05000655) /* 0.312506041 */, 12 }, - /* 215 */ { MAD_F(0x05080195) /* 0.314454634 */, 12 }, - /* 216 */ { MAD_F(0x05100000) /* 0.316406250 */, 12 }, - /* 217 */ { MAD_F(0x05180194) /* 0.318360880 */, 12 }, - /* 218 */ { MAD_F(0x0520064f) /* 0.320318516 */, 12 }, - /* 219 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 12 }, - /* 220 */ { MAD_F(0x0530192e) /* 0.324242764 */, 12 }, - /* 221 */ { MAD_F(0x0538274e) /* 0.326209359 */, 12 }, - /* 222 */ { MAD_F(0x0540388a) /* 0.328178922 */, 12 }, - /* 223 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 12 }, - - /* 224 */ { MAD_F(0x05506451) /* 0.332126919 */, 12 }, - /* 225 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 12 }, - /* 226 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 12 }, - /* 227 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 12 }, - /* 228 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 12 }, - /* 229 */ { MAD_F(0x05790793) /* 0.342048241 */, 12 }, - /* 230 */ { MAD_F(0x05813162) /* 0.344041237 */, 12 }, - /* 231 */ { MAD_F(0x05895e39) /* 0.346037122 */, 12 }, - /* 232 */ { MAD_F(0x05918e15) /* 0.348035890 */, 12 }, - /* 233 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 12 }, - /* 234 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 12 }, - /* 235 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 12 }, - /* 236 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 12 }, - /* 237 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 12 }, - /* 238 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 12 }, - /* 239 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 12 }, - - /* 240 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 12 }, - /* 241 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 12 }, - /* 242 */ { MAD_F(0x05e41105) /* 0.368180294 */, 12 }, - /* 243 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 12 }, - /* 244 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 12 }, - /* 245 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 12 }, - /* 246 */ { MAD_F(0x060564b1) /* 0.376316732 */, 12 }, - /* 247 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 12 }, - /* 248 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 12 }, - /* 249 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 12 }, - /* 250 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 12 }, - /* 251 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 12 }, - /* 252 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 12 }, - /* 253 */ { MAD_F(0x06402666) /* 0.390661620 */, 12 }, - /* 254 */ { MAD_F(0x064896a7) /* 0.392721798 */, 12 }, - /* 255 */ { MAD_F(0x065109be) /* 0.394784681 */, 12 }, - - /* 256 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 12 }, - /* 257 */ { MAD_F(0x0661f867) /* 0.398918536 */, 12 }, - /* 258 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 12 }, - /* 259 */ { MAD_F(0x0672f252) /* 0.403063128 */, 12 }, - /* 260 */ { MAD_F(0x067b737c) /* 0.405139433 */, 12 }, - /* 261 */ { MAD_F(0x0683f771) /* 0.407218402 */, 12 }, - /* 262 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 12 }, - /* 263 */ { MAD_F(0x069507b5) /* 0.411384303 */, 12 }, - /* 264 */ { MAD_F(0x069d9400) /* 0.413471222 */, 12 }, - /* 265 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 12 }, - /* 266 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 12 }, - /* 267 */ { MAD_F(0x06b74971) /* 0.419747773 */, 12 }, - /* 268 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 12 }, - /* 269 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 12 }, - /* 270 */ { MAD_F(0x06d11794) /* 0.426047876 */, 12 }, - /* 271 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 12 }, - - /* 272 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 12 }, - /* 273 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 12 }, - /* 274 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 12 }, - /* 275 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 12 }, - /* 276 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 12 }, - /* 277 */ { MAD_F(0x070dacea) /* 0.440838732 */, 12 }, - /* 278 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 12 }, - /* 279 */ { MAD_F(0x071f1459) /* 0.445087765 */, 12 }, - /* 280 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 12 }, - /* 281 */ { MAD_F(0x07308671) /* 0.449346964 */, 12 }, - /* 282 */ { MAD_F(0x07394378) /* 0.451480360 */, 12 }, - /* 283 */ { MAD_F(0x07420325) /* 0.453616280 */, 12 }, - /* 284 */ { MAD_F(0x074ac575) /* 0.455754717 */, 12 }, - /* 285 */ { MAD_F(0x07538a67) /* 0.457895665 */, 12 }, - /* 286 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 12 }, - /* 287 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 12 }, - - /* 288 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 12 }, - /* 289 */ { MAD_F(0x0776b867) /* 0.466484455 */, 12 }, - /* 290 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 12 }, - /* 291 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 12 }, - /* 292 */ { MAD_F(0x07913641) /* 0.472952132 */, 12 }, - /* 293 */ { MAD_F(0x079a100c) /* 0.475112962 */, 12 }, - /* 294 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 12 }, - /* 295 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 12 }, - /* 296 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 12 }, - /* 297 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 12 }, - /* 298 */ { MAD_F(0x07c67798) /* 0.485953899 */, 12 }, - /* 299 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 12 }, - /* 300 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 12 }, - /* 301 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 12 }, - /* 302 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 12 }, - /* 303 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 12 }, - - /* 304 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 12 }, - /* 305 */ { MAD_F(0x0402868e) /* 0.250616605 */, 13 }, - /* 306 */ { MAD_F(0x040703ff) /* 0.251712795 */, 13 }, - /* 307 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 13 }, - /* 308 */ { MAD_F(0x041002a1) /* 0.253908756 */, 13 }, - /* 309 */ { MAD_F(0x041483d1) /* 0.255008523 */, 13 }, - /* 310 */ { MAD_F(0x04190640) /* 0.256109476 */, 13 }, - /* 311 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 13 }, - /* 312 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 13 }, - /* 313 */ { MAD_F(0x042694fe) /* 0.259419433 */, 13 }, - /* 314 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 13 }, - /* 315 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 13 }, - /* 316 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 13 }, - /* 317 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 13 }, - /* 318 */ { MAD_F(0x043d4635) /* 0.264959533 */, 13 }, - /* 319 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 13 }, - - /* 320 */ { MAD_F(0x04466275) /* 0.267183742 */, 13 }, - /* 321 */ { MAD_F(0x044af269) /* 0.268297587 */, 13 }, - /* 322 */ { MAD_F(0x044f8393) /* 0.269412589 */, 13 }, - /* 323 */ { MAD_F(0x045415f3) /* 0.270528746 */, 13 }, - /* 324 */ { MAD_F(0x0458a989) /* 0.271646056 */, 13 }, - /* 325 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 13 }, - /* 326 */ { MAD_F(0x0461d451) /* 0.273884123 */, 13 }, - /* 327 */ { MAD_F(0x04666b83) /* 0.275004875 */, 13 }, - /* 328 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 13 }, - /* 329 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 13 }, - /* 330 */ { MAD_F(0x04743847) /* 0.278373983 */, 13 }, - /* 331 */ { MAD_F(0x0478d440) /* 0.279499294 */, 13 }, - /* 332 */ { MAD_F(0x047d716a) /* 0.280625739 */, 13 }, - /* 333 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 13 }, - /* 334 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 13 }, - /* 335 */ { MAD_F(0x048b5003) /* 0.284011853 */, 13 }, - - /* 336 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 13 }, - /* 337 */ { MAD_F(0x049494fb) /* 0.286274891 */, 13 }, - /* 338 */ { MAD_F(0x0499393a) /* 0.287408091 */, 13 }, - /* 339 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 13 }, - /* 340 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 13 }, - /* 341 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 13 }, - /* 342 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 13 }, - /* 343 */ { MAD_F(0x04b08000) /* 0.293090820 */, 13 }, - /* 344 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 13 }, - /* 345 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 13 }, - /* 346 */ { MAD_F(0x04be8537) /* 0.296513762 */, 13 }, - /* 347 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 13 }, - /* 348 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 13 }, - /* 349 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 13 }, - /* 350 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 13 }, - /* 351 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 13 }, - - /* 352 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 13 }, - /* 353 */ { MAD_F(0x04df6458) /* 0.304539056 */, 13 }, - /* 354 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 13 }, - /* 355 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 13 }, - /* 356 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 13 }, - /* 357 */ { MAD_F(0x04f24618) /* 0.309148880 */, 13 }, - /* 358 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 13 }, - /* 359 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 13 }, - /* 360 */ { MAD_F(0x05007b49) /* 0.312617576 */, 13 }, - /* 361 */ { MAD_F(0x050539ef) /* 0.313775954 */, 13 }, - /* 362 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 13 }, - /* 363 */ { MAD_F(0x050eba98) /* 0.316095920 */, 13 }, - /* 364 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 13 }, - /* 365 */ { MAD_F(0x05183fba) /* 0.318420150 */, 13 }, - /* 366 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 13 }, - /* 367 */ { MAD_F(0x0521c950) /* 0.320748629 */, 13 }, - - /* 368 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 13 }, - /* 369 */ { MAD_F(0x052b5757) /* 0.323081342 */, 13 }, - /* 370 */ { MAD_F(0x05302003) /* 0.324249281 */, 13 }, - /* 371 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 13 }, - /* 372 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 13 }, - /* 373 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 13 }, - /* 374 */ { MAD_F(0x05434db9) /* 0.328931546 */, 13 }, - /* 375 */ { MAD_F(0x05481be5) /* 0.330104730 */, 13 }, - /* 376 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 13 }, - /* 377 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 13 }, - /* 378 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 13 }, - /* 379 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 13 }, - /* 380 */ { MAD_F(0x05603321) /* 0.335986261 */, 13 }, - /* 381 */ { MAD_F(0x056507d6) /* 0.337165677 */, 13 }, - /* 382 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 13 }, - /* 383 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 13 }, - - /* 384 */ { MAD_F(0x05738c72) /* 0.340710111 */, 13 }, - /* 385 */ { MAD_F(0x05786578) /* 0.341893646 */, 13 }, - /* 386 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 13 }, - /* 387 */ { MAD_F(0x05821abf) /* 0.344263788 */, 13 }, - /* 388 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 13 }, - /* 389 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 13 }, - /* 390 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 13 }, - /* 391 */ { MAD_F(0x05959222) /* 0.349016318 */, 13 }, - /* 392 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 13 }, - /* 393 */ { MAD_F(0x059f5438) /* 0.351398678 */, 13 }, - /* 394 */ { MAD_F(0x05a436da) /* 0.352591376 */, 13 }, - /* 395 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 13 }, - /* 396 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 13 }, - /* 397 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 13 }, - /* 398 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 13 }, - /* 399 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 13 }, - - /* 400 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 13 }, - /* 401 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 13 }, - /* 402 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 13 }, - /* 403 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 13 }, - /* 404 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 13 }, - /* 405 */ { MAD_F(0x05da394d) /* 0.365777304 */, 13 }, - /* 406 */ { MAD_F(0x05df2885) /* 0.366982004 */, 13 }, - /* 407 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 13 }, - /* 408 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 13 }, - /* 409 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 13 }, - /* 410 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 13 }, - /* 411 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 13 }, - /* 412 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 13 }, - /* 413 */ { MAD_F(0x0601d004) /* 0.375442522 */, 13 }, - /* 414 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 13 }, - /* 415 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 13 }, - - /* 416 */ { MAD_F(0x0610b982) /* 0.379083164 */, 13 }, - /* 417 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 13 }, - /* 418 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 13 }, - /* 419 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 13 }, - /* 420 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 13 }, - /* 421 */ { MAD_F(0x0629a863) /* 0.385170352 */, 13 }, - /* 422 */ { MAD_F(0x062ea802) /* 0.386390694 */, 13 }, - /* 423 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 13 }, - /* 424 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 13 }, - /* 425 */ { MAD_F(0x063dacee) /* 0.390057497 */, 13 }, - /* 426 */ { MAD_F(0x0642b096) /* 0.391281687 */, 13 }, - /* 427 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 13 }, - /* 428 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 13 }, - /* 429 */ { MAD_F(0x0651c193) /* 0.394959999 */, 13 }, - /* 430 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 13 }, - /* 431 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 13 }, - - /* 432 */ { MAD_F(0x0660db91) /* 0.398646895 */, 13 }, - /* 433 */ { MAD_F(0x0665e639) /* 0.399877761 */, 13 }, - /* 434 */ { MAD_F(0x066af1df) /* 0.401109575 */, 13 }, - /* 435 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 13 }, - /* 436 */ { MAD_F(0x06750c26) /* 0.403576041 */, 13 }, - /* 437 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 13 }, - /* 438 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 13 }, - /* 439 */ { MAD_F(0x06843afb) /* 0.407282813 */, 13 }, - /* 440 */ { MAD_F(0x06894c90) /* 0.408520284 */, 13 }, - /* 441 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 13 }, - /* 442 */ { MAD_F(0x069372ae) /* 0.410998038 */, 13 }, - /* 443 */ { MAD_F(0x06988735) /* 0.412238319 */, 13 }, - /* 444 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 13 }, - /* 445 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 13 }, - /* 446 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 13 }, - /* 447 */ { MAD_F(0x06ace318) /* 0.417208762 */, 13 }, - - /* 448 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 13 }, - /* 449 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 13 }, - /* 450 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 13 }, - /* 451 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 13 }, - /* 452 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 13 }, - /* 453 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 13 }, - /* 454 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 13 }, - /* 455 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 13 }, - /* 456 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 13 }, - /* 457 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 13 }, - /* 458 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 13 }, - /* 459 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 13 }, - /* 460 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 13 }, - /* 461 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 13 }, - /* 462 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 13 }, - /* 463 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 13 }, - - /* 464 */ { MAD_F(0x07041636) /* 0.438497744 */, 13 }, - /* 465 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 13 }, - /* 466 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 13 }, - /* 467 */ { MAD_F(0x07139641) /* 0.442281965 */, 13 }, - /* 468 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 13 }, - /* 469 */ { MAD_F(0x071df058) /* 0.444809288 */, 13 }, - /* 470 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 13 }, - /* 471 */ { MAD_F(0x07284e34) /* 0.447340205 */, 13 }, - /* 472 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 13 }, - /* 473 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 13 }, - /* 474 */ { MAD_F(0x0737e209) /* 0.451143300 */, 13 }, - /* 475 */ { MAD_F(0x073d1530) /* 0.452412785 */, 13 }, - /* 476 */ { MAD_F(0x07424946) /* 0.453683161 */, 13 }, - /* 477 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 13 }, - /* 478 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 13 }, - /* 479 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 13 }, - - /* 480 */ { MAD_F(0x075722ef) /* 0.458773552 */, 13 }, - /* 481 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 13 }, - /* 482 */ { MAD_F(0x07619557) /* 0.461324062 */, 13 }, - /* 483 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 13 }, - /* 484 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 13 }, - /* 485 */ { MAD_F(0x077147e2) /* 0.465156443 */, 13 }, - /* 486 */ { MAD_F(0x0776853e) /* 0.466435663 */, 13 }, - /* 487 */ { MAD_F(0x077bc385) /* 0.467715761 */, 13 }, - /* 488 */ { MAD_F(0x078102b8) /* 0.468996735 */, 13 }, - /* 489 */ { MAD_F(0x078642d6) /* 0.470278584 */, 13 }, - /* 490 */ { MAD_F(0x078b83de) /* 0.471561307 */, 13 }, - /* 491 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 13 }, - /* 492 */ { MAD_F(0x079608ae) /* 0.474129372 */, 13 }, - /* 493 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 13 }, - /* 494 */ { MAD_F(0x07a09124) /* 0.476700918 */, 13 }, - /* 495 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 13 }, - - /* 496 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 13 }, - /* 497 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 13 }, - /* 498 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 13 }, - /* 499 */ { MAD_F(0x07baf635) /* 0.483144957 */, 13 }, - /* 500 */ { MAD_F(0x07c04056) /* 0.484436356 */, 13 }, - /* 501 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 13 }, - /* 502 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 13 }, - /* 503 */ { MAD_F(0x07d02424) /* 0.488315717 */, 13 }, - /* 504 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 13 }, - /* 505 */ { MAD_F(0x07dac083) /* 0.490906249 */, 13 }, - /* 506 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 13 }, - /* 507 */ { MAD_F(0x07e56078) /* 0.493500203 */, 13 }, - /* 508 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 13 }, - /* 509 */ { MAD_F(0x07f00401) /* 0.496097570 */, 13 }, - /* 510 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 13 }, - /* 511 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 13 }, - - /* 512 */ { MAD_F(0x04000000) /* 0.250000000 */, 14 }, - /* 513 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 14 }, - /* 514 */ { MAD_F(0x04055638) /* 0.251302930 */, 14 }, - /* 515 */ { MAD_F(0x040801ff) /* 0.251955030 */, 14 }, - /* 516 */ { MAD_F(0x040aae37) /* 0.252607552 */, 14 }, - /* 517 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 14 }, - /* 518 */ { MAD_F(0x041007fa) /* 0.253913860 */, 14 }, - /* 519 */ { MAD_F(0x0412b586) /* 0.254567645 */, 14 }, - /* 520 */ { MAD_F(0x04156381) /* 0.255221850 */, 14 }, - /* 521 */ { MAD_F(0x041811ee) /* 0.255876475 */, 14 }, - /* 522 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 14 }, - /* 523 */ { MAD_F(0x041d7018) /* 0.257186980 */, 14 }, - /* 524 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 14 }, - /* 525 */ { MAD_F(0x0422d003) /* 0.258499157 */, 14 }, - /* 526 */ { MAD_F(0x042580a0) /* 0.259155872 */, 14 }, - /* 527 */ { MAD_F(0x042831ad) /* 0.259813002 */, 14 }, - - /* 528 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 14 }, - /* 529 */ { MAD_F(0x042d9516) /* 0.261128510 */, 14 }, - /* 530 */ { MAD_F(0x04304772) /* 0.261786886 */, 14 }, - /* 531 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 14 }, - /* 532 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 14 }, - /* 533 */ { MAD_F(0x0438611f) /* 0.263764497 */, 14 }, - /* 534 */ { MAD_F(0x043b1536) /* 0.264424527 */, 14 }, - /* 535 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 14 }, - /* 536 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 14 }, - /* 537 */ { MAD_F(0x04433414) /* 0.266407088 */, 14 }, - /* 538 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 14 }, - /* 539 */ { MAD_F(0x0448a024) /* 0.267730848 */, 14 }, - /* 540 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 14 }, - /* 541 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 14 }, - /* 542 */ { MAD_F(0x0450c575) /* 0.269719560 */, 14 }, - /* 543 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 14 }, - - /* 544 */ { MAD_F(0x045635cf) /* 0.271047409 */, 14 }, - /* 545 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 14 }, - /* 546 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 14 }, - /* 547 */ { MAD_F(0x045e6188) /* 0.273042234 */, 14 }, - /* 548 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 14 }, - /* 549 */ { MAD_F(0x0463d625) /* 0.274374147 */, 14 }, - /* 550 */ { MAD_F(0x04669116) /* 0.275040710 */, 14 }, - /* 551 */ { MAD_F(0x04694c74) /* 0.275707677 */, 14 }, - /* 552 */ { MAD_F(0x046c083e) /* 0.276375048 */, 14 }, - /* 553 */ { MAD_F(0x046ec474) /* 0.277042822 */, 14 }, - /* 554 */ { MAD_F(0x04718116) /* 0.277710999 */, 14 }, - /* 555 */ { MAD_F(0x04743e25) /* 0.278379578 */, 14 }, - /* 556 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 14 }, - /* 557 */ { MAD_F(0x0479b984) /* 0.279717940 */, 14 }, - /* 558 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 14 }, - /* 559 */ { MAD_F(0x047f3693) /* 0.281057905 */, 14 }, - - /* 560 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 14 }, - /* 561 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 14 }, - /* 562 */ { MAD_F(0x0487754c) /* 0.283070849 */, 14 }, - /* 563 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 14 }, - /* 564 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 14 }, - /* 565 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 14 }, - /* 566 */ { MAD_F(0x04927972) /* 0.285760350 */, 14 }, - /* 567 */ { MAD_F(0x04953b85) /* 0.286433717 */, 14 }, - /* 568 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 14 }, - /* 569 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 14 }, - /* 570 */ { MAD_F(0x049d843e) /* 0.288456194 */, 14 }, - /* 571 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 14 }, - /* 572 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 14 }, - /* 573 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 14 }, - /* 574 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 14 }, - /* 575 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 14 }, - - /* 576 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 14 }, - /* 577 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 14 }, - /* 578 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 14 }, - /* 579 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 14 }, - /* 580 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 14 }, - /* 581 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 14 }, - /* 582 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 14 }, - /* 583 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 14 }, - /* 584 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 14 }, - /* 585 */ { MAD_F(0x04c72771) /* 0.298621598 */, 14 }, - /* 586 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 14 }, - /* 587 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 14 }, - /* 588 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 14 }, - /* 589 */ { MAD_F(0x04d25169) /* 0.301347172 */, 14 }, - /* 590 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 14 }, - /* 591 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 14 }, - - /* 592 */ { MAD_F(0x04dab524) /* 0.303395408 */, 14 }, - /* 593 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 14 }, - /* 594 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 14 }, - /* 595 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 14 }, - /* 596 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 14 }, - /* 597 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 14 }, - /* 598 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 14 }, - /* 599 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 14 }, - /* 600 */ { MAD_F(0x04f12624) /* 0.308874267 */, 14 }, - /* 601 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 14 }, - /* 602 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 14 }, - /* 603 */ { MAD_F(0x04f99721) /* 0.310935143 */, 14 }, - /* 604 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 14 }, - /* 605 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 14 }, - /* 606 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 14 }, - /* 607 */ { MAD_F(0x0504de05) /* 0.313688296 */, 14 }, - - /* 608 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 14 }, - /* 609 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 14 }, - /* 610 */ { MAD_F(0x050d575b) /* 0.315757136 */, 14 }, - /* 611 */ { MAD_F(0x05102b42) /* 0.316447504 */, 14 }, - /* 612 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 14 }, - /* 613 */ { MAD_F(0x0515d440) /* 0.317829370 */, 14 }, - /* 614 */ { MAD_F(0x0518a956) /* 0.318520867 */, 14 }, - /* 615 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 14 }, - /* 616 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 14 }, - /* 617 */ { MAD_F(0x05212af5) /* 0.320597609 */, 14 }, - /* 618 */ { MAD_F(0x0524019e) /* 0.321290606 */, 14 }, - /* 619 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 14 }, - /* 620 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 14 }, - /* 621 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 14 }, - /* 622 */ { MAD_F(0x052f602c) /* 0.324066327 */, 14 }, - /* 623 */ { MAD_F(0x053238ca) /* 0.324761189 */, 14 }, - - /* 624 */ { MAD_F(0x053511cb) /* 0.325456423 */, 14 }, - /* 625 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 14 }, - /* 626 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 14 }, - /* 627 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 14 }, - /* 628 */ { MAD_F(0x054079b5) /* 0.328241070 */, 14 }, - /* 629 */ { MAD_F(0x054354a8) /* 0.328938157 */, 14 }, - /* 630 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 14 }, - /* 631 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 14 }, - /* 632 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 14 }, - /* 633 */ { MAD_F(0x054ec453) /* 0.331730198 */, 14 }, - /* 634 */ { MAD_F(0x0551a134) /* 0.332429129 */, 14 }, - /* 635 */ { MAD_F(0x05547e79) /* 0.333128427 */, 14 }, - /* 636 */ { MAD_F(0x05575c20) /* 0.333828093 */, 14 }, - /* 637 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 14 }, - /* 638 */ { MAD_F(0x055d1896) /* 0.335228525 */, 14 }, - /* 639 */ { MAD_F(0x055ff764) /* 0.335929290 */, 14 }, - - /* 640 */ { MAD_F(0x0562d694) /* 0.336630420 */, 14 }, - /* 641 */ { MAD_F(0x0565b627) /* 0.337331916 */, 14 }, - /* 642 */ { MAD_F(0x0568961b) /* 0.338033777 */, 14 }, - /* 643 */ { MAD_F(0x056b7671) /* 0.338736002 */, 14 }, - /* 644 */ { MAD_F(0x056e5729) /* 0.339438592 */, 14 }, - /* 645 */ { MAD_F(0x05713843) /* 0.340141545 */, 14 }, - /* 646 */ { MAD_F(0x057419be) /* 0.340844862 */, 14 }, - /* 647 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 14 }, - /* 648 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 14 }, - /* 649 */ { MAD_F(0x057cc077) /* 0.342956988 */, 14 }, - /* 650 */ { MAD_F(0x057fa378) /* 0.343661754 */, 14 }, - /* 651 */ { MAD_F(0x058286d9) /* 0.344366882 */, 14 }, - /* 652 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 14 }, - /* 653 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 14 }, - /* 654 */ { MAD_F(0x058b3342) /* 0.346484431 */, 14 }, - /* 655 */ { MAD_F(0x058e1827) /* 0.347191002 */, 14 }, - - /* 656 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 14 }, - /* 657 */ { MAD_F(0x0593e311) /* 0.348605221 */, 14 }, - /* 658 */ { MAD_F(0x0596c917) /* 0.349312869 */, 14 }, - /* 659 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 14 }, - /* 660 */ { MAD_F(0x059c9643) /* 0.350729240 */, 14 }, - /* 661 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 14 }, - /* 662 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 14 }, - /* 663 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 14 }, - /* 664 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 14 }, - /* 665 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 14 }, - /* 666 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 14 }, - /* 667 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 14 }, - /* 668 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 14 }, - /* 669 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 14 }, - /* 670 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 14 }, - /* 671 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 14 }, - - /* 672 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 14 }, - /* 673 */ { MAD_F(0x05c27057) /* 0.359970419 */, 14 }, - /* 674 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 14 }, - /* 675 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 14 }, - /* 676 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 14 }, - /* 677 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 14 }, - /* 678 */ { MAD_F(0x05d11001) /* 0.363540655 */, 14 }, - /* 679 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 14 }, - /* 680 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 14 }, - /* 681 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 14 }, - /* 682 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 14 }, - /* 683 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 14 }, - /* 684 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 14 }, - /* 685 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 14 }, - /* 686 */ { MAD_F(0x05e88904) /* 0.369271294 */, 14 }, - /* 687 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 14 }, - - /* 688 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 14 }, - /* 689 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 14 }, - /* 690 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 14 }, - /* 691 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 14 }, - /* 692 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 14 }, - /* 693 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 14 }, - /* 694 */ { MAD_F(0x0600196e) /* 0.375024253 */, 14 }, - /* 695 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 14 }, - /* 696 */ { MAD_F(0x0606012b) /* 0.376465960 */, 14 }, - /* 697 */ { MAD_F(0x0608f595) /* 0.377187332 */, 14 }, - /* 698 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 14 }, - /* 699 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 14 }, - /* 700 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 14 }, - /* 701 */ { MAD_F(0x0614cada) /* 0.380076266 */, 14 }, - /* 702 */ { MAD_F(0x0617c112) /* 0.380799360 */, 14 }, - /* 703 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 14 }, - - /* 704 */ { MAD_F(0x061dae96) /* 0.382246578 */, 14 }, - /* 705 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 14 }, - /* 706 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 14 }, - /* 707 */ { MAD_F(0x0626958f) /* 0.384419975 */, 14 }, - /* 708 */ { MAD_F(0x06298def) /* 0.385145124 */, 14 }, - /* 709 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 14 }, - /* 710 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 14 }, - /* 711 */ { MAD_F(0x06327934) /* 0.387322621 */, 14 }, - /* 712 */ { MAD_F(0x06357302) /* 0.388049134 */, 14 }, - /* 713 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 14 }, - /* 714 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 14 }, - /* 715 */ { MAD_F(0x063e6290) /* 0.390230715 */, 14 }, - /* 716 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 14 }, - /* 717 */ { MAD_F(0x06445960) /* 0.391686799 */, 14 }, - /* 718 */ { MAD_F(0x06475551) /* 0.392415349 */, 14 }, - /* 719 */ { MAD_F(0x064a519c) /* 0.393144238 */, 14 }, - - /* 720 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 14 }, - /* 721 */ { MAD_F(0x06504b44) /* 0.394603028 */, 14 }, - /* 722 */ { MAD_F(0x0653489f) /* 0.395332930 */, 14 }, - /* 723 */ { MAD_F(0x06564655) /* 0.396063168 */, 14 }, - /* 724 */ { MAD_F(0x06594465) /* 0.396793743 */, 14 }, - /* 725 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 14 }, - /* 726 */ { MAD_F(0x065f4195) /* 0.398255903 */, 14 }, - /* 727 */ { MAD_F(0x066240b4) /* 0.398987487 */, 14 }, - /* 728 */ { MAD_F(0x0665402d) /* 0.399719406 */, 14 }, - /* 729 */ { MAD_F(0x06684000) /* 0.400451660 */, 14 }, - /* 730 */ { MAD_F(0x066b402d) /* 0.401184249 */, 14 }, - /* 731 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 14 }, - /* 732 */ { MAD_F(0x06714194) /* 0.402650431 */, 14 }, - /* 733 */ { MAD_F(0x067442ce) /* 0.403384024 */, 14 }, - /* 734 */ { MAD_F(0x06774462) /* 0.404117949 */, 14 }, - /* 735 */ { MAD_F(0x067a464f) /* 0.404852209 */, 14 }, - - /* 736 */ { MAD_F(0x067d4896) /* 0.405586801 */, 14 }, - /* 737 */ { MAD_F(0x06804b36) /* 0.406321726 */, 14 }, - /* 738 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 14 }, - /* 739 */ { MAD_F(0x06865181) /* 0.407792573 */, 14 }, - /* 740 */ { MAD_F(0x0689552c) /* 0.408528495 */, 14 }, - /* 741 */ { MAD_F(0x068c5931) /* 0.409264748 */, 14 }, - /* 742 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 14 }, - /* 743 */ { MAD_F(0x06926245) /* 0.410738247 */, 14 }, - /* 744 */ { MAD_F(0x06956753) /* 0.411475493 */, 14 }, - /* 745 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 14 }, - /* 746 */ { MAD_F(0x069b727b) /* 0.412950976 */, 14 }, - /* 747 */ { MAD_F(0x069e7894) /* 0.413689213 */, 14 }, - /* 748 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 14 }, - /* 749 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 14 }, - /* 750 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 14 }, - /* 751 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 14 }, - - /* 752 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 14 }, - /* 753 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 14 }, - /* 754 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 14 }, - /* 755 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 14 }, - /* 756 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 14 }, - /* 757 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 14 }, - /* 758 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 14 }, - /* 759 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 14 }, - /* 760 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 14 }, - /* 761 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 14 }, - /* 762 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 14 }, - /* 763 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 14 }, - /* 764 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 14 }, - /* 765 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 14 }, - /* 766 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 14 }, - /* 767 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 14 }, - - /* 768 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 14 }, - /* 769 */ { MAD_F(0x06e15595) /* 0.430013259 */, 14 }, - /* 770 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 14 }, - /* 771 */ { MAD_F(0x06e771db) /* 0.431505065 */, 14 }, - /* 772 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 14 }, - /* 773 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 14 }, - /* 774 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 14 }, - /* 775 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 14 }, - /* 776 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 14 }, - /* 777 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 14 }, - /* 778 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 14 }, - /* 779 */ { MAD_F(0x06fff073) /* 0.437485172 */, 14 }, - /* 780 */ { MAD_F(0x070301ca) /* 0.438234130 */, 14 }, - /* 781 */ { MAD_F(0x07061377) /* 0.438983408 */, 14 }, - /* 782 */ { MAD_F(0x0709257a) /* 0.439733006 */, 14 }, - /* 783 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 14 }, - - /* 784 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 14 }, - /* 785 */ { MAD_F(0x07125d84) /* 0.441983717 */, 14 }, - /* 786 */ { MAD_F(0x071570de) /* 0.442734592 */, 14 }, - /* 787 */ { MAD_F(0x0718848d) /* 0.443485785 */, 14 }, - /* 788 */ { MAD_F(0x071b9891) /* 0.444237296 */, 14 }, - /* 789 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 14 }, - /* 790 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 14 }, - /* 791 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 14 }, - /* 792 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 14 }, - /* 793 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 14 }, - /* 794 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 14 }, - /* 795 */ { MAD_F(0x07312e01) /* 0.449506765 */, 14 }, - /* 796 */ { MAD_F(0x073444ae) /* 0.450260813 */, 14 }, - /* 797 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 14 }, - /* 798 */ { MAD_F(0x073a7307) /* 0.451769856 */, 14 }, - /* 799 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 14 }, - - /* 800 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 14 }, - /* 801 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 14 }, - /* 802 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 14 }, - /* 803 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 14 }, - /* 804 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 14 }, - /* 805 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 14 }, - /* 806 */ { MAD_F(0x0753399d) /* 0.457818618 */, 14 }, - /* 807 */ { MAD_F(0x075653eb) /* 0.458576125 */, 14 }, - /* 808 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 14 }, - /* 809 */ { MAD_F(0x075c8983) /* 0.460092079 */, 14 }, - /* 810 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 14 }, - /* 811 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 14 }, - /* 812 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 14 }, - /* 813 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 14 }, - /* 814 */ { MAD_F(0x076c1538) /* 0.463887426 */, 14 }, - /* 815 */ { MAD_F(0x076f3224) /* 0.464647430 */, 14 }, - - /* 816 */ { MAD_F(0x07724f64) /* 0.465407744 */, 14 }, - /* 817 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 14 }, - /* 818 */ { MAD_F(0x07788add) /* 0.466929306 */, 14 }, - /* 819 */ { MAD_F(0x077ba916) /* 0.467690552 */, 14 }, - /* 820 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 14 }, - /* 821 */ { MAD_F(0x0781e683) /* 0.469213973 */, 14 }, - /* 822 */ { MAD_F(0x078505b5) /* 0.469976148 */, 14 }, - /* 823 */ { MAD_F(0x0788253b) /* 0.470738632 */, 14 }, - /* 824 */ { MAD_F(0x078b4514) /* 0.471501425 */, 14 }, - /* 825 */ { MAD_F(0x078e653f) /* 0.472264527 */, 14 }, - /* 826 */ { MAD_F(0x079185be) /* 0.473027937 */, 14 }, - /* 827 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 14 }, - /* 828 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 14 }, - /* 829 */ { MAD_F(0x079ae929) /* 0.475320014 */, 14 }, - /* 830 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 14 }, - /* 831 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 14 }, - - /* 832 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 14 }, - /* 833 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 14 }, - /* 834 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 14 }, - /* 835 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 14 }, - /* 836 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 14 }, - /* 837 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 14 }, - /* 838 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 14 }, - /* 839 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 14 }, - /* 840 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 14 }, - /* 841 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 14 }, - /* 842 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 14 }, - /* 843 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 14 }, - /* 844 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 14 }, - /* 845 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 14 }, - /* 846 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 14 }, - /* 847 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 14 }, - - /* 848 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 14 }, - /* 849 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 14 }, - /* 850 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 14 }, - /* 851 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 14 }, - /* 852 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 14 }, - /* 853 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 14 }, - /* 854 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 14 }, - /* 855 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 14 }, - /* 856 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 14 }, - /* 857 */ { MAD_F(0x07f31405) /* 0.496845266 */, 14 }, - /* 858 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 14 }, - /* 859 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 14 }, - /* 860 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 14 }, - /* 861 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 14 }, - /* 862 */ { MAD_F(0x04017659) /* 0.250357008 */, 15 }, - /* 863 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 15 }, - - /* 864 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 15 }, - /* 865 */ { MAD_F(0x0406393d) /* 0.251519431 */, 15 }, - /* 866 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 15 }, - /* 867 */ { MAD_F(0x0409669d) /* 0.252295127 */, 15 }, - /* 868 */ { MAD_F(0x040afd89) /* 0.252683198 */, 15 }, - /* 869 */ { MAD_F(0x040c949e) /* 0.253071419 */, 15 }, - /* 870 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 15 }, - /* 871 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 15 }, - /* 872 */ { MAD_F(0x04115aca) /* 0.254236974 */, 15 }, - /* 873 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 15 }, - /* 874 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 15 }, - /* 875 */ { MAD_F(0x0416225d) /* 0.255403867 */, 15 }, - /* 876 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 15 }, - /* 877 */ { MAD_F(0x041952dc) /* 0.256182537 */, 15 }, - /* 878 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 15 }, - /* 879 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 15 }, - - /* 880 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 15 }, - /* 881 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 15 }, - /* 882 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 15 }, - /* 883 */ { MAD_F(0x0422e811) /* 0.258522097 */, 15 }, - /* 884 */ { MAD_F(0x04248179) /* 0.258912540 */, 15 }, - /* 885 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 15 }, - /* 886 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 15 }, - /* 887 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 15 }, - /* 888 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 15 }, - /* 889 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 15 }, - /* 890 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 15 }, - /* 891 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 15 }, - /* 892 */ { MAD_F(0x0431524c) /* 0.262041376 */, 15 }, - /* 893 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 15 }, - /* 894 */ { MAD_F(0x0434880a) /* 0.262825051 */, 15 }, - /* 895 */ { MAD_F(0x04362324) /* 0.263217107 */, 15 }, - - /* 896 */ { MAD_F(0x0437be65) /* 0.263609310 */, 15 }, - /* 897 */ { MAD_F(0x043959cd) /* 0.264001659 */, 15 }, - /* 898 */ { MAD_F(0x043af55d) /* 0.264394153 */, 15 }, - /* 899 */ { MAD_F(0x043c9113) /* 0.264786794 */, 15 }, - /* 900 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 15 }, - /* 901 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 15 }, - /* 902 */ { MAD_F(0x04416522) /* 0.265965588 */, 15 }, - /* 903 */ { MAD_F(0x04430174) /* 0.266358810 */, 15 }, - /* 904 */ { MAD_F(0x04449dee) /* 0.266752177 */, 15 }, - /* 905 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 15 }, - /* 906 */ { MAD_F(0x0447d756) /* 0.267539347 */, 15 }, - /* 907 */ { MAD_F(0x04497445) /* 0.267933149 */, 15 }, - /* 908 */ { MAD_F(0x044b115a) /* 0.268327096 */, 15 }, - /* 909 */ { MAD_F(0x044cae96) /* 0.268721187 */, 15 }, - /* 910 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 15 }, - /* 911 */ { MAD_F(0x044fe983) /* 0.269509804 */, 15 }, - - /* 912 */ { MAD_F(0x04518733) /* 0.269904329 */, 15 }, - /* 913 */ { MAD_F(0x0453250a) /* 0.270298998 */, 15 }, - /* 914 */ { MAD_F(0x0454c308) /* 0.270693811 */, 15 }, - /* 915 */ { MAD_F(0x0456612d) /* 0.271088768 */, 15 }, - /* 916 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 15 }, - /* 917 */ { MAD_F(0x04599dea) /* 0.271879114 */, 15 }, - /* 918 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 15 }, - /* 919 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 15 }, - /* 920 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 15 }, - /* 921 */ { MAD_F(0x04601932) /* 0.273461530 */, 15 }, - /* 922 */ { MAD_F(0x0461b864) /* 0.273857492 */, 15 }, - /* 923 */ { MAD_F(0x046357bd) /* 0.274253597 */, 15 }, - /* 924 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 15 }, - /* 925 */ { MAD_F(0x046696e2) /* 0.275046238 */, 15 }, - /* 926 */ { MAD_F(0x046836ae) /* 0.275442772 */, 15 }, - /* 927 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 15 }, - - /* 928 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 15 }, - /* 929 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 15 }, - /* 930 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 15 }, - /* 931 */ { MAD_F(0x047057e8) /* 0.277427584 */, 15 }, - /* 932 */ { MAD_F(0x0471f899) /* 0.277824973 */, 15 }, - /* 933 */ { MAD_F(0x04739971) /* 0.278222505 */, 15 }, - /* 934 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 15 }, - /* 935 */ { MAD_F(0x0476db92) /* 0.279017995 */, 15 }, - /* 936 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 15 }, - /* 937 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 15 }, - /* 938 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 15 }, - /* 939 */ { MAD_F(0x047d619e) /* 0.280610675 */, 15 }, - /* 940 */ { MAD_F(0x047f0380) /* 0.281009199 */, 15 }, - /* 941 */ { MAD_F(0x0480a588) /* 0.281407864 */, 15 }, - /* 942 */ { MAD_F(0x048247b6) /* 0.281806670 */, 15 }, - /* 943 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 15 }, - - /* 944 */ { MAD_F(0x04858c83) /* 0.282604707 */, 15 }, - /* 945 */ { MAD_F(0x04872f22) /* 0.283003936 */, 15 }, - /* 946 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 15 }, - /* 947 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 15 }, - /* 948 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 15 }, - /* 949 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 15 }, - /* 950 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 15 }, - /* 951 */ { MAD_F(0x049101f8) /* 0.285402269 */, 15 }, - /* 952 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 15 }, - /* 953 */ { MAD_F(0x0494496c) /* 0.286202836 */, 15 }, - /* 954 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 15 }, - /* 955 */ { MAD_F(0x04979177) /* 0.287003963 */, 15 }, - /* 956 */ { MAD_F(0x049935b5) /* 0.287404737 */, 15 }, - /* 957 */ { MAD_F(0x049ada19) /* 0.287805650 */, 15 }, - /* 958 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 15 }, - /* 959 */ { MAD_F(0x049e2350) /* 0.288607895 */, 15 }, - - /* 960 */ { MAD_F(0x049fc824) /* 0.289009227 */, 15 }, - /* 961 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 15 }, - /* 962 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 15 }, - /* 963 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 15 }, - /* 964 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 15 }, - /* 965 */ { MAD_F(0x04a80277) /* 0.291017976 */, 15 }, - /* 966 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 15 }, - /* 967 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 15 }, - /* 968 */ { MAD_F(0x04acf402) /* 0.292224893 */, 15 }, - /* 969 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 15 }, - /* 970 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 15 }, - /* 971 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 15 }, - /* 972 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 15 }, - /* 973 */ { MAD_F(0x04b53427) /* 0.294239192 */, 15 }, - /* 974 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 15 }, - /* 975 */ { MAD_F(0x04b88207) /* 0.295045879 */, 15 }, - - /* 976 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 15 }, - /* 977 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 15 }, - /* 978 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 15 }, - /* 979 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 15 }, - /* 980 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 15 }, - /* 981 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 15 }, - /* 982 */ { MAD_F(0x04c41722) /* 0.297873624 */, 15 }, - /* 983 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 15 }, - /* 984 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 15 }, - /* 985 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 15 }, - /* 986 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 15 }, - /* 987 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 15 }, - /* 988 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 15 }, - /* 989 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 15 }, - /* 990 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 15 }, - /* 991 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 15 }, - - /* 992 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 15 }, - /* 993 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 15 }, - /* 994 */ { MAD_F(0x04d80290) /* 0.302736820 */, 15 }, - /* 995 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 15 }, - /* 996 */ { MAD_F(0x04db5679) /* 0.303549263 */, 15 }, - /* 997 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 15 }, - /* 998 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 15 }, - /* 999 */ { MAD_F(0x04e05567) /* 0.304768948 */, 15 }, - /* 1000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 15 }, - /* 1001 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 15 }, - /* 1002 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 15 }, - /* 1003 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 15 }, - /* 1004 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 15 }, - /* 1005 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 15 }, - /* 1006 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 15 }, - /* 1007 */ { MAD_F(0x04edae25) /* 0.308027406 */, 15 }, - - /* 1008 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 15 }, - /* 1009 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 15 }, - /* 1010 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 15 }, - /* 1011 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 15 }, - /* 1012 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 15 }, - /* 1013 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 15 }, - /* 1014 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 15 }, - /* 1015 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 15 }, - /* 1016 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 15 }, - /* 1017 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 15 }, - /* 1018 */ { MAD_F(0x050016f3) /* 0.312521885 */, 15 }, - /* 1019 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 15 }, - /* 1020 */ { MAD_F(0x050371a7) /* 0.313340809 */, 15 }, - /* 1021 */ { MAD_F(0x05051f37) /* 0.313750472 */, 15 }, - /* 1022 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 15 }, - /* 1023 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 15 }, - - /* 1024 */ { MAD_F(0x050a28be) /* 0.314980262 */, 15 }, - /* 1025 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 15 }, - /* 1026 */ { MAD_F(0x050d8521) /* 0.315800790 */, 15 }, - /* 1027 */ { MAD_F(0x050f3388) /* 0.316211255 */, 15 }, - /* 1028 */ { MAD_F(0x0510e213) /* 0.316621852 */, 15 }, - /* 1029 */ { MAD_F(0x051290c2) /* 0.317032582 */, 15 }, - /* 1030 */ { MAD_F(0x05143f94) /* 0.317443446 */, 15 }, - /* 1031 */ { MAD_F(0x0515ee8a) /* 0.317854442 */, 15 }, - /* 1032 */ { MAD_F(0x05179da4) /* 0.318265572 */, 15 }, - /* 1033 */ { MAD_F(0x05194ce1) /* 0.318676834 */, 15 }, - /* 1034 */ { MAD_F(0x051afc42) /* 0.319088229 */, 15 }, - /* 1035 */ { MAD_F(0x051cabc7) /* 0.319499756 */, 15 }, - /* 1036 */ { MAD_F(0x051e5b6f) /* 0.319911417 */, 15 }, - /* 1037 */ { MAD_F(0x05200b3a) /* 0.320323209 */, 15 }, - /* 1038 */ { MAD_F(0x0521bb2a) /* 0.320735134 */, 15 }, - /* 1039 */ { MAD_F(0x05236b3d) /* 0.321147192 */, 15 }, - - /* 1040 */ { MAD_F(0x05251b73) /* 0.321559381 */, 15 }, - /* 1041 */ { MAD_F(0x0526cbcd) /* 0.321971703 */, 15 }, - /* 1042 */ { MAD_F(0x05287c4a) /* 0.322384156 */, 15 }, - /* 1043 */ { MAD_F(0x052a2cea) /* 0.322796742 */, 15 }, - /* 1044 */ { MAD_F(0x052bddae) /* 0.323209460 */, 15 }, - /* 1045 */ { MAD_F(0x052d8e96) /* 0.323622309 */, 15 }, - /* 1046 */ { MAD_F(0x052f3fa1) /* 0.324035290 */, 15 }, - /* 1047 */ { MAD_F(0x0530f0cf) /* 0.324448403 */, 15 }, - /* 1048 */ { MAD_F(0x0532a220) /* 0.324861647 */, 15 }, - /* 1049 */ { MAD_F(0x05345395) /* 0.325275023 */, 15 }, - /* 1050 */ { MAD_F(0x0536052d) /* 0.325688530 */, 15 }, - /* 1051 */ { MAD_F(0x0537b6e8) /* 0.326102168 */, 15 }, - /* 1052 */ { MAD_F(0x053968c6) /* 0.326515938 */, 15 }, - /* 1053 */ { MAD_F(0x053b1ac8) /* 0.326929839 */, 15 }, - /* 1054 */ { MAD_F(0x053ccced) /* 0.327343870 */, 15 }, - /* 1055 */ { MAD_F(0x053e7f35) /* 0.327758033 */, 15 }, - - /* 1056 */ { MAD_F(0x054031a0) /* 0.328172327 */, 15 }, - /* 1057 */ { MAD_F(0x0541e42e) /* 0.328586751 */, 15 }, - /* 1058 */ { MAD_F(0x054396df) /* 0.329001306 */, 15 }, - /* 1059 */ { MAD_F(0x054549b4) /* 0.329415992 */, 15 }, - /* 1060 */ { MAD_F(0x0546fcab) /* 0.329830808 */, 15 }, - /* 1061 */ { MAD_F(0x0548afc6) /* 0.330245755 */, 15 }, - /* 1062 */ { MAD_F(0x054a6303) /* 0.330660832 */, 15 }, - /* 1063 */ { MAD_F(0x054c1663) /* 0.331076039 */, 15 }, - /* 1064 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 15 }, - /* 1065 */ { MAD_F(0x054f7d8d) /* 0.331906845 */, 15 }, - /* 1066 */ { MAD_F(0x05513156) /* 0.332322443 */, 15 }, - /* 1067 */ { MAD_F(0x0552e542) /* 0.332738170 */, 15 }, - /* 1068 */ { MAD_F(0x05549951) /* 0.333154028 */, 15 }, - /* 1069 */ { MAD_F(0x05564d83) /* 0.333570016 */, 15 }, - /* 1070 */ { MAD_F(0x055801d8) /* 0.333986133 */, 15 }, - /* 1071 */ { MAD_F(0x0559b64f) /* 0.334402380 */, 15 }, - - /* 1072 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 15 }, - /* 1073 */ { MAD_F(0x055d1fa6) /* 0.335235262 */, 15 }, - /* 1074 */ { MAD_F(0x055ed486) /* 0.335651898 */, 15 }, - /* 1075 */ { MAD_F(0x05608988) /* 0.336068662 */, 15 }, - /* 1076 */ { MAD_F(0x05623ead) /* 0.336485556 */, 15 }, - /* 1077 */ { MAD_F(0x0563f3f5) /* 0.336902579 */, 15 }, - /* 1078 */ { MAD_F(0x0565a960) /* 0.337319732 */, 15 }, - /* 1079 */ { MAD_F(0x05675eed) /* 0.337737013 */, 15 }, - /* 1080 */ { MAD_F(0x0569149c) /* 0.338154423 */, 15 }, - /* 1081 */ { MAD_F(0x056aca6f) /* 0.338571962 */, 15 }, - /* 1082 */ { MAD_F(0x056c8064) /* 0.338989630 */, 15 }, - /* 1083 */ { MAD_F(0x056e367b) /* 0.339407426 */, 15 }, - /* 1084 */ { MAD_F(0x056fecb5) /* 0.339825351 */, 15 }, - /* 1085 */ { MAD_F(0x0571a311) /* 0.340243405 */, 15 }, - /* 1086 */ { MAD_F(0x05735990) /* 0.340661587 */, 15 }, - /* 1087 */ { MAD_F(0x05751032) /* 0.341079898 */, 15 }, - - /* 1088 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 15 }, - /* 1089 */ { MAD_F(0x05787ddc) /* 0.341916903 */, 15 }, - /* 1090 */ { MAD_F(0x057a34e4) /* 0.342335598 */, 15 }, - /* 1091 */ { MAD_F(0x057bec0f) /* 0.342754421 */, 15 }, - /* 1092 */ { MAD_F(0x057da35d) /* 0.343173373 */, 15 }, - /* 1093 */ { MAD_F(0x057f5acc) /* 0.343592452 */, 15 }, - /* 1094 */ { MAD_F(0x0581125e) /* 0.344011659 */, 15 }, - /* 1095 */ { MAD_F(0x0582ca12) /* 0.344430993 */, 15 }, - /* 1096 */ { MAD_F(0x058481e9) /* 0.344850455 */, 15 }, - /* 1097 */ { MAD_F(0x058639e2) /* 0.345270045 */, 15 }, - /* 1098 */ { MAD_F(0x0587f1fd) /* 0.345689763 */, 15 }, - /* 1099 */ { MAD_F(0x0589aa3a) /* 0.346109608 */, 15 }, - /* 1100 */ { MAD_F(0x058b629a) /* 0.346529580 */, 15 }, - /* 1101 */ { MAD_F(0x058d1b1b) /* 0.346949679 */, 15 }, - /* 1102 */ { MAD_F(0x058ed3bf) /* 0.347369906 */, 15 }, - /* 1103 */ { MAD_F(0x05908c85) /* 0.347790260 */, 15 }, - - /* 1104 */ { MAD_F(0x0592456d) /* 0.348210741 */, 15 }, - /* 1105 */ { MAD_F(0x0593fe77) /* 0.348631348 */, 15 }, - /* 1106 */ { MAD_F(0x0595b7a3) /* 0.349052083 */, 15 }, - /* 1107 */ { MAD_F(0x059770f1) /* 0.349472945 */, 15 }, - /* 1108 */ { MAD_F(0x05992a61) /* 0.349893933 */, 15 }, - /* 1109 */ { MAD_F(0x059ae3f3) /* 0.350315048 */, 15 }, - /* 1110 */ { MAD_F(0x059c9da8) /* 0.350736290 */, 15 }, - /* 1111 */ { MAD_F(0x059e577e) /* 0.351157658 */, 15 }, - /* 1112 */ { MAD_F(0x05a01176) /* 0.351579152 */, 15 }, - /* 1113 */ { MAD_F(0x05a1cb90) /* 0.352000773 */, 15 }, - /* 1114 */ { MAD_F(0x05a385cc) /* 0.352422520 */, 15 }, - /* 1115 */ { MAD_F(0x05a5402a) /* 0.352844394 */, 15 }, - /* 1116 */ { MAD_F(0x05a6faa9) /* 0.353266393 */, 15 }, - /* 1117 */ { MAD_F(0x05a8b54b) /* 0.353688519 */, 15 }, - /* 1118 */ { MAD_F(0x05aa700e) /* 0.354110771 */, 15 }, - /* 1119 */ { MAD_F(0x05ac2af3) /* 0.354533148 */, 15 }, - - /* 1120 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 15 }, - /* 1121 */ { MAD_F(0x05afa123) /* 0.355378281 */, 15 }, - /* 1122 */ { MAD_F(0x05b15c6d) /* 0.355801035 */, 15 }, - /* 1123 */ { MAD_F(0x05b317d9) /* 0.356223916 */, 15 }, - /* 1124 */ { MAD_F(0x05b4d367) /* 0.356646922 */, 15 }, - /* 1125 */ { MAD_F(0x05b68f16) /* 0.357070053 */, 15 }, - /* 1126 */ { MAD_F(0x05b84ae7) /* 0.357493310 */, 15 }, - /* 1127 */ { MAD_F(0x05ba06da) /* 0.357916692 */, 15 }, - /* 1128 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 15 }, - /* 1129 */ { MAD_F(0x05bd7f25) /* 0.358763832 */, 15 }, - /* 1130 */ { MAD_F(0x05bf3b7c) /* 0.359187590 */, 15 }, - /* 1131 */ { MAD_F(0x05c0f7f5) /* 0.359611472 */, 15 }, - /* 1132 */ { MAD_F(0x05c2b490) /* 0.360035480 */, 15 }, - /* 1133 */ { MAD_F(0x05c4714c) /* 0.360459613 */, 15 }, - /* 1134 */ { MAD_F(0x05c62e2a) /* 0.360883870 */, 15 }, - /* 1135 */ { MAD_F(0x05c7eb29) /* 0.361308252 */, 15 }, - - /* 1136 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 15 }, - /* 1137 */ { MAD_F(0x05cb658c) /* 0.362157390 */, 15 }, - /* 1138 */ { MAD_F(0x05cd22ef) /* 0.362582145 */, 15 }, - /* 1139 */ { MAD_F(0x05cee074) /* 0.363007026 */, 15 }, - /* 1140 */ { MAD_F(0x05d09e1b) /* 0.363432030 */, 15 }, - /* 1141 */ { MAD_F(0x05d25be2) /* 0.363857159 */, 15 }, - /* 1142 */ { MAD_F(0x05d419cb) /* 0.364282412 */, 15 }, - /* 1143 */ { MAD_F(0x05d5d7d5) /* 0.364707789 */, 15 }, - /* 1144 */ { MAD_F(0x05d79601) /* 0.365133291 */, 15 }, - /* 1145 */ { MAD_F(0x05d9544e) /* 0.365558916 */, 15 }, - /* 1146 */ { MAD_F(0x05db12bc) /* 0.365984665 */, 15 }, - /* 1147 */ { MAD_F(0x05dcd14c) /* 0.366410538 */, 15 }, - /* 1148 */ { MAD_F(0x05de8ffc) /* 0.366836535 */, 15 }, - /* 1149 */ { MAD_F(0x05e04ece) /* 0.367262655 */, 15 }, - /* 1150 */ { MAD_F(0x05e20dc1) /* 0.367688900 */, 15 }, - /* 1151 */ { MAD_F(0x05e3ccd5) /* 0.368115267 */, 15 }, - - /* 1152 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 15 }, - /* 1153 */ { MAD_F(0x05e74b61) /* 0.368968373 */, 15 }, - /* 1154 */ { MAD_F(0x05e90ad9) /* 0.369395111 */, 15 }, - /* 1155 */ { MAD_F(0x05eaca72) /* 0.369821973 */, 15 }, - /* 1156 */ { MAD_F(0x05ec8a2b) /* 0.370248957 */, 15 }, - /* 1157 */ { MAD_F(0x05ee4a06) /* 0.370676065 */, 15 }, - /* 1158 */ { MAD_F(0x05f00a02) /* 0.371103295 */, 15 }, - /* 1159 */ { MAD_F(0x05f1ca1f) /* 0.371530649 */, 15 }, - /* 1160 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 15 }, - /* 1161 */ { MAD_F(0x05f54abc) /* 0.372385725 */, 15 }, - /* 1162 */ { MAD_F(0x05f70b3c) /* 0.372813448 */, 15 }, - /* 1163 */ { MAD_F(0x05f8cbdc) /* 0.373241292 */, 15 }, - /* 1164 */ { MAD_F(0x05fa8c9e) /* 0.373669260 */, 15 }, - /* 1165 */ { MAD_F(0x05fc4d81) /* 0.374097350 */, 15 }, - /* 1166 */ { MAD_F(0x05fe0e84) /* 0.374525563 */, 15 }, - /* 1167 */ { MAD_F(0x05ffcfa8) /* 0.374953898 */, 15 }, - - /* 1168 */ { MAD_F(0x060190ee) /* 0.375382356 */, 15 }, - /* 1169 */ { MAD_F(0x06035254) /* 0.375810936 */, 15 }, - /* 1170 */ { MAD_F(0x060513da) /* 0.376239638 */, 15 }, - /* 1171 */ { MAD_F(0x0606d582) /* 0.376668462 */, 15 }, - /* 1172 */ { MAD_F(0x0608974a) /* 0.377097408 */, 15 }, - /* 1173 */ { MAD_F(0x060a5934) /* 0.377526476 */, 15 }, - /* 1174 */ { MAD_F(0x060c1b3d) /* 0.377955667 */, 15 }, - /* 1175 */ { MAD_F(0x060ddd68) /* 0.378384979 */, 15 }, - /* 1176 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 15 }, - /* 1177 */ { MAD_F(0x0611621f) /* 0.379243968 */, 15 }, - /* 1178 */ { MAD_F(0x061324ac) /* 0.379673646 */, 15 }, - /* 1179 */ { MAD_F(0x0614e759) /* 0.380103444 */, 15 }, - /* 1180 */ { MAD_F(0x0616aa27) /* 0.380533365 */, 15 }, - /* 1181 */ { MAD_F(0x06186d16) /* 0.380963407 */, 15 }, - /* 1182 */ { MAD_F(0x061a3025) /* 0.381393570 */, 15 }, - /* 1183 */ { MAD_F(0x061bf354) /* 0.381823855 */, 15 }, - - /* 1184 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 15 }, - /* 1185 */ { MAD_F(0x061f7a15) /* 0.382684788 */, 15 }, - /* 1186 */ { MAD_F(0x06213da7) /* 0.383115436 */, 15 }, - /* 1187 */ { MAD_F(0x06230158) /* 0.383546205 */, 15 }, - /* 1188 */ { MAD_F(0x0624c52a) /* 0.383977096 */, 15 }, - /* 1189 */ { MAD_F(0x0626891d) /* 0.384408107 */, 15 }, - /* 1190 */ { MAD_F(0x06284d30) /* 0.384839239 */, 15 }, - /* 1191 */ { MAD_F(0x062a1164) /* 0.385270492 */, 15 }, - /* 1192 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 15 }, - /* 1193 */ { MAD_F(0x062d9a2c) /* 0.386133359 */, 15 }, - /* 1194 */ { MAD_F(0x062f5ec1) /* 0.386564974 */, 15 }, - /* 1195 */ { MAD_F(0x06312376) /* 0.386996709 */, 15 }, - /* 1196 */ { MAD_F(0x0632e84b) /* 0.387428565 */, 15 }, - /* 1197 */ { MAD_F(0x0634ad41) /* 0.387860541 */, 15 }, - /* 1198 */ { MAD_F(0x06367257) /* 0.388292637 */, 15 }, - /* 1199 */ { MAD_F(0x0638378d) /* 0.388724854 */, 15 }, - - /* 1200 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 15 }, - /* 1201 */ { MAD_F(0x063bc25b) /* 0.389589648 */, 15 }, - /* 1202 */ { MAD_F(0x063d87f2) /* 0.390022225 */, 15 }, - /* 1203 */ { MAD_F(0x063f4da9) /* 0.390454922 */, 15 }, - /* 1204 */ { MAD_F(0x06411380) /* 0.390887739 */, 15 }, - /* 1205 */ { MAD_F(0x0642d978) /* 0.391320675 */, 15 }, - /* 1206 */ { MAD_F(0x06449f8f) /* 0.391753732 */, 15 }, - /* 1207 */ { MAD_F(0x064665c7) /* 0.392186908 */, 15 }, - /* 1208 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 15 }, - /* 1209 */ { MAD_F(0x0649f297) /* 0.393053619 */, 15 }, - /* 1210 */ { MAD_F(0x064bb92f) /* 0.393487154 */, 15 }, - /* 1211 */ { MAD_F(0x064d7fe8) /* 0.393920808 */, 15 }, - /* 1212 */ { MAD_F(0x064f46c0) /* 0.394354582 */, 15 }, - /* 1213 */ { MAD_F(0x06510db8) /* 0.394788475 */, 15 }, - /* 1214 */ { MAD_F(0x0652d4d0) /* 0.395222488 */, 15 }, - /* 1215 */ { MAD_F(0x06549c09) /* 0.395656619 */, 15 }, - - /* 1216 */ { MAD_F(0x06566361) /* 0.396090870 */, 15 }, - /* 1217 */ { MAD_F(0x06582ad9) /* 0.396525239 */, 15 }, - /* 1218 */ { MAD_F(0x0659f271) /* 0.396959728 */, 15 }, - /* 1219 */ { MAD_F(0x065bba29) /* 0.397394336 */, 15 }, - /* 1220 */ { MAD_F(0x065d8201) /* 0.397829062 */, 15 }, - /* 1221 */ { MAD_F(0x065f49f9) /* 0.398263907 */, 15 }, - /* 1222 */ { MAD_F(0x06611211) /* 0.398698871 */, 15 }, - /* 1223 */ { MAD_F(0x0662da49) /* 0.399133954 */, 15 }, - /* 1224 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 15 }, - /* 1225 */ { MAD_F(0x06666b17) /* 0.400004475 */, 15 }, - /* 1226 */ { MAD_F(0x066833ae) /* 0.400439913 */, 15 }, - /* 1227 */ { MAD_F(0x0669fc65) /* 0.400875470 */, 15 }, - /* 1228 */ { MAD_F(0x066bc53c) /* 0.401311145 */, 15 }, - /* 1229 */ { MAD_F(0x066d8e32) /* 0.401746938 */, 15 }, - /* 1230 */ { MAD_F(0x066f5748) /* 0.402182850 */, 15 }, - /* 1231 */ { MAD_F(0x0671207e) /* 0.402618879 */, 15 }, - - /* 1232 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 15 }, - /* 1233 */ { MAD_F(0x0674b349) /* 0.403491293 */, 15 }, - /* 1234 */ { MAD_F(0x06767cde) /* 0.403927676 */, 15 }, - /* 1235 */ { MAD_F(0x06784692) /* 0.404364178 */, 15 }, - /* 1236 */ { MAD_F(0x067a1066) /* 0.404800797 */, 15 }, - /* 1237 */ { MAD_F(0x067bda5a) /* 0.405237535 */, 15 }, - /* 1238 */ { MAD_F(0x067da46d) /* 0.405674390 */, 15 }, - /* 1239 */ { MAD_F(0x067f6ea0) /* 0.406111362 */, 15 }, - /* 1240 */ { MAD_F(0x068138f3) /* 0.406548452 */, 15 }, - /* 1241 */ { MAD_F(0x06830365) /* 0.406985660 */, 15 }, - /* 1242 */ { MAD_F(0x0684cdf6) /* 0.407422985 */, 15 }, - /* 1243 */ { MAD_F(0x068698a8) /* 0.407860427 */, 15 }, - /* 1244 */ { MAD_F(0x06886378) /* 0.408297987 */, 15 }, - /* 1245 */ { MAD_F(0x068a2e68) /* 0.408735664 */, 15 }, - /* 1246 */ { MAD_F(0x068bf978) /* 0.409173458 */, 15 }, - /* 1247 */ { MAD_F(0x068dc4a7) /* 0.409611370 */, 15 }, - - /* 1248 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 15 }, - /* 1249 */ { MAD_F(0x06915b63) /* 0.410487544 */, 15 }, - /* 1250 */ { MAD_F(0x069326f0) /* 0.410925806 */, 15 }, - /* 1251 */ { MAD_F(0x0694f29c) /* 0.411364185 */, 15 }, - /* 1252 */ { MAD_F(0x0696be68) /* 0.411802681 */, 15 }, - /* 1253 */ { MAD_F(0x06988a54) /* 0.412241294 */, 15 }, - /* 1254 */ { MAD_F(0x069a565e) /* 0.412680024 */, 15 }, - /* 1255 */ { MAD_F(0x069c2288) /* 0.413118870 */, 15 }, - /* 1256 */ { MAD_F(0x069deed1) /* 0.413557833 */, 15 }, - /* 1257 */ { MAD_F(0x069fbb3a) /* 0.413996912 */, 15 }, - /* 1258 */ { MAD_F(0x06a187c1) /* 0.414436108 */, 15 }, - /* 1259 */ { MAD_F(0x06a35468) /* 0.414875420 */, 15 }, - /* 1260 */ { MAD_F(0x06a5212f) /* 0.415314849 */, 15 }, - /* 1261 */ { MAD_F(0x06a6ee14) /* 0.415754393 */, 15 }, - /* 1262 */ { MAD_F(0x06a8bb18) /* 0.416194054 */, 15 }, - /* 1263 */ { MAD_F(0x06aa883c) /* 0.416633831 */, 15 }, - - /* 1264 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 15 }, - /* 1265 */ { MAD_F(0x06ae22e1) /* 0.417513734 */, 15 }, - /* 1266 */ { MAD_F(0x06aff062) /* 0.417953859 */, 15 }, - /* 1267 */ { MAD_F(0x06b1be03) /* 0.418394100 */, 15 }, - /* 1268 */ { MAD_F(0x06b38bc2) /* 0.418834457 */, 15 }, - /* 1269 */ { MAD_F(0x06b559a1) /* 0.419274929 */, 15 }, - /* 1270 */ { MAD_F(0x06b7279e) /* 0.419715518 */, 15 }, - /* 1271 */ { MAD_F(0x06b8f5bb) /* 0.420156222 */, 15 }, - /* 1272 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 15 }, - /* 1273 */ { MAD_F(0x06bc9251) /* 0.421037977 */, 15 }, - /* 1274 */ { MAD_F(0x06be60cb) /* 0.421479027 */, 15 }, - /* 1275 */ { MAD_F(0x06c02f63) /* 0.421920193 */, 15 }, - /* 1276 */ { MAD_F(0x06c1fe1b) /* 0.422361475 */, 15 }, - /* 1277 */ { MAD_F(0x06c3ccf1) /* 0.422802871 */, 15 }, - /* 1278 */ { MAD_F(0x06c59be7) /* 0.423244383 */, 15 }, - /* 1279 */ { MAD_F(0x06c76afb) /* 0.423686010 */, 15 }, - - /* 1280 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 15 }, - /* 1281 */ { MAD_F(0x06cb0981) /* 0.424569610 */, 15 }, - /* 1282 */ { MAD_F(0x06ccd8f2) /* 0.425011582 */, 15 }, - /* 1283 */ { MAD_F(0x06cea881) /* 0.425453669 */, 15 }, - /* 1284 */ { MAD_F(0x06d07830) /* 0.425895871 */, 15 }, - /* 1285 */ { MAD_F(0x06d247fe) /* 0.426338188 */, 15 }, - /* 1286 */ { MAD_F(0x06d417ea) /* 0.426780620 */, 15 }, - /* 1287 */ { MAD_F(0x06d5e7f5) /* 0.427223166 */, 15 }, - /* 1288 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 15 }, - /* 1289 */ { MAD_F(0x06d98868) /* 0.428108603 */, 15 }, - /* 1290 */ { MAD_F(0x06db58cf) /* 0.428551493 */, 15 }, - /* 1291 */ { MAD_F(0x06dd2955) /* 0.428994497 */, 15 }, - /* 1292 */ { MAD_F(0x06def9fa) /* 0.429437616 */, 15 }, - /* 1293 */ { MAD_F(0x06e0cabe) /* 0.429880849 */, 15 }, - /* 1294 */ { MAD_F(0x06e29ba0) /* 0.430324197 */, 15 }, - /* 1295 */ { MAD_F(0x06e46ca1) /* 0.430767659 */, 15 }, - - /* 1296 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 15 }, - /* 1297 */ { MAD_F(0x06e80efe) /* 0.431654924 */, 15 }, - /* 1298 */ { MAD_F(0x06e9e05b) /* 0.432098728 */, 15 }, - /* 1299 */ { MAD_F(0x06ebb1d6) /* 0.432542647 */, 15 }, - /* 1300 */ { MAD_F(0x06ed8370) /* 0.432986678 */, 15 }, - /* 1301 */ { MAD_F(0x06ef5529) /* 0.433430824 */, 15 }, - /* 1302 */ { MAD_F(0x06f12700) /* 0.433875084 */, 15 }, - /* 1303 */ { MAD_F(0x06f2f8f5) /* 0.434319457 */, 15 }, - /* 1304 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 15 }, - /* 1305 */ { MAD_F(0x06f69d3c) /* 0.435208545 */, 15 }, - /* 1306 */ { MAD_F(0x06f86f8d) /* 0.435653259 */, 15 }, - /* 1307 */ { MAD_F(0x06fa41fd) /* 0.436098087 */, 15 }, - /* 1308 */ { MAD_F(0x06fc148b) /* 0.436543029 */, 15 }, - /* 1309 */ { MAD_F(0x06fde737) /* 0.436988083 */, 15 }, - /* 1310 */ { MAD_F(0x06ffba02) /* 0.437433251 */, 15 }, - /* 1311 */ { MAD_F(0x07018ceb) /* 0.437878533 */, 15 }, - - /* 1312 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 15 }, - /* 1313 */ { MAD_F(0x07053319) /* 0.438769435 */, 15 }, - /* 1314 */ { MAD_F(0x0707065d) /* 0.439215056 */, 15 }, - /* 1315 */ { MAD_F(0x0708d9c0) /* 0.439660790 */, 15 }, - /* 1316 */ { MAD_F(0x070aad41) /* 0.440106636 */, 15 }, - /* 1317 */ { MAD_F(0x070c80e1) /* 0.440552596 */, 15 }, - /* 1318 */ { MAD_F(0x070e549f) /* 0.440998669 */, 15 }, - /* 1319 */ { MAD_F(0x0710287b) /* 0.441444855 */, 15 }, - /* 1320 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 15 }, - /* 1321 */ { MAD_F(0x0713d08d) /* 0.442337564 */, 15 }, - /* 1322 */ { MAD_F(0x0715a4c4) /* 0.442784088 */, 15 }, - /* 1323 */ { MAD_F(0x07177919) /* 0.443230724 */, 15 }, - /* 1324 */ { MAD_F(0x07194d8c) /* 0.443677473 */, 15 }, - /* 1325 */ { MAD_F(0x071b221e) /* 0.444124334 */, 15 }, - /* 1326 */ { MAD_F(0x071cf6ce) /* 0.444571308 */, 15 }, - /* 1327 */ { MAD_F(0x071ecb9b) /* 0.445018394 */, 15 }, - - /* 1328 */ { MAD_F(0x0720a087) /* 0.445465593 */, 15 }, - /* 1329 */ { MAD_F(0x07227591) /* 0.445912903 */, 15 }, - /* 1330 */ { MAD_F(0x07244ab9) /* 0.446360326 */, 15 }, - /* 1331 */ { MAD_F(0x07262000) /* 0.446807861 */, 15 }, - /* 1332 */ { MAD_F(0x0727f564) /* 0.447255509 */, 15 }, - /* 1333 */ { MAD_F(0x0729cae7) /* 0.447703268 */, 15 }, - /* 1334 */ { MAD_F(0x072ba087) /* 0.448151139 */, 15 }, - /* 1335 */ { MAD_F(0x072d7646) /* 0.448599122 */, 15 }, - /* 1336 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 15 }, - /* 1337 */ { MAD_F(0x0731221d) /* 0.449495424 */, 15 }, - /* 1338 */ { MAD_F(0x0732f835) /* 0.449943742 */, 15 }, - /* 1339 */ { MAD_F(0x0734ce6c) /* 0.450392173 */, 15 }, - /* 1340 */ { MAD_F(0x0736a4c1) /* 0.450840715 */, 15 }, - /* 1341 */ { MAD_F(0x07387b33) /* 0.451289368 */, 15 }, - /* 1342 */ { MAD_F(0x073a51c4) /* 0.451738133 */, 15 }, - /* 1343 */ { MAD_F(0x073c2872) /* 0.452187010 */, 15 }, - - /* 1344 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 15 }, - /* 1345 */ { MAD_F(0x073fd628) /* 0.453085097 */, 15 }, - /* 1346 */ { MAD_F(0x0741ad30) /* 0.453534308 */, 15 }, - /* 1347 */ { MAD_F(0x07438456) /* 0.453983630 */, 15 }, - /* 1348 */ { MAD_F(0x07455b9a) /* 0.454433063 */, 15 }, - /* 1349 */ { MAD_F(0x074732fc) /* 0.454882607 */, 15 }, - /* 1350 */ { MAD_F(0x07490a7b) /* 0.455332262 */, 15 }, - /* 1351 */ { MAD_F(0x074ae218) /* 0.455782029 */, 15 }, - /* 1352 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 15 }, - /* 1353 */ { MAD_F(0x074e91ac) /* 0.456681894 */, 15 }, - /* 1354 */ { MAD_F(0x075069a3) /* 0.457131993 */, 15 }, - /* 1355 */ { MAD_F(0x075241b7) /* 0.457582203 */, 15 }, - /* 1356 */ { MAD_F(0x075419e9) /* 0.458032524 */, 15 }, - /* 1357 */ { MAD_F(0x0755f239) /* 0.458482956 */, 15 }, - /* 1358 */ { MAD_F(0x0757caa7) /* 0.458933498 */, 15 }, - /* 1359 */ { MAD_F(0x0759a332) /* 0.459384151 */, 15 }, - - /* 1360 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 15 }, - /* 1361 */ { MAD_F(0x075d54a1) /* 0.460285788 */, 15 }, - /* 1362 */ { MAD_F(0x075f2d85) /* 0.460736772 */, 15 }, - /* 1363 */ { MAD_F(0x07610687) /* 0.461187867 */, 15 }, - /* 1364 */ { MAD_F(0x0762dfa6) /* 0.461639071 */, 15 }, - /* 1365 */ { MAD_F(0x0764b8e3) /* 0.462090387 */, 15 }, - /* 1366 */ { MAD_F(0x0766923e) /* 0.462541812 */, 15 }, - /* 1367 */ { MAD_F(0x07686bb6) /* 0.462993348 */, 15 }, - /* 1368 */ { MAD_F(0x076a454c) /* 0.463444993 */, 15 }, - /* 1369 */ { MAD_F(0x076c1eff) /* 0.463896749 */, 15 }, - /* 1370 */ { MAD_F(0x076df8d0) /* 0.464348615 */, 15 }, - /* 1371 */ { MAD_F(0x076fd2be) /* 0.464800591 */, 15 }, - /* 1372 */ { MAD_F(0x0771acca) /* 0.465252676 */, 15 }, - /* 1373 */ { MAD_F(0x077386f3) /* 0.465704872 */, 15 }, - /* 1374 */ { MAD_F(0x0775613a) /* 0.466157177 */, 15 }, - /* 1375 */ { MAD_F(0x07773b9e) /* 0.466609592 */, 15 }, - - /* 1376 */ { MAD_F(0x07791620) /* 0.467062117 */, 15 }, - /* 1377 */ { MAD_F(0x077af0bf) /* 0.467514751 */, 15 }, - /* 1378 */ { MAD_F(0x077ccb7c) /* 0.467967495 */, 15 }, - /* 1379 */ { MAD_F(0x077ea656) /* 0.468420349 */, 15 }, - /* 1380 */ { MAD_F(0x0780814d) /* 0.468873312 */, 15 }, - /* 1381 */ { MAD_F(0x07825c62) /* 0.469326384 */, 15 }, - /* 1382 */ { MAD_F(0x07843794) /* 0.469779566 */, 15 }, - /* 1383 */ { MAD_F(0x078612e3) /* 0.470232857 */, 15 }, - /* 1384 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 15 }, - /* 1385 */ { MAD_F(0x0789c9da) /* 0.471139767 */, 15 }, - /* 1386 */ { MAD_F(0x078ba581) /* 0.471593386 */, 15 }, - /* 1387 */ { MAD_F(0x078d8146) /* 0.472047114 */, 15 }, - /* 1388 */ { MAD_F(0x078f5d28) /* 0.472500951 */, 15 }, - /* 1389 */ { MAD_F(0x07913927) /* 0.472954896 */, 15 }, - /* 1390 */ { MAD_F(0x07931543) /* 0.473408951 */, 15 }, - /* 1391 */ { MAD_F(0x0794f17d) /* 0.473863115 */, 15 }, - - /* 1392 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 15 }, - /* 1393 */ { MAD_F(0x0798aa48) /* 0.474771769 */, 15 }, - /* 1394 */ { MAD_F(0x079a86d9) /* 0.475226259 */, 15 }, - /* 1395 */ { MAD_F(0x079c6388) /* 0.475680858 */, 15 }, - /* 1396 */ { MAD_F(0x079e4053) /* 0.476135565 */, 15 }, - /* 1397 */ { MAD_F(0x07a01d3c) /* 0.476590381 */, 15 }, - /* 1398 */ { MAD_F(0x07a1fa42) /* 0.477045306 */, 15 }, - /* 1399 */ { MAD_F(0x07a3d765) /* 0.477500339 */, 15 }, - /* 1400 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 15 }, - /* 1401 */ { MAD_F(0x07a79202) /* 0.478410731 */, 15 }, - /* 1402 */ { MAD_F(0x07a96f7d) /* 0.478866089 */, 15 }, - /* 1403 */ { MAD_F(0x07ab4d14) /* 0.479321555 */, 15 }, - /* 1404 */ { MAD_F(0x07ad2ac8) /* 0.479777130 */, 15 }, - /* 1405 */ { MAD_F(0x07af089a) /* 0.480232813 */, 15 }, - /* 1406 */ { MAD_F(0x07b0e688) /* 0.480688604 */, 15 }, - /* 1407 */ { MAD_F(0x07b2c494) /* 0.481144503 */, 15 }, - - /* 1408 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 15 }, - /* 1409 */ { MAD_F(0x07b68102) /* 0.482056625 */, 15 }, - /* 1410 */ { MAD_F(0x07b85f64) /* 0.482512848 */, 15 }, - /* 1411 */ { MAD_F(0x07ba3de4) /* 0.482969179 */, 15 }, - /* 1412 */ { MAD_F(0x07bc1c80) /* 0.483425618 */, 15 }, - /* 1413 */ { MAD_F(0x07bdfb39) /* 0.483882164 */, 15 }, - /* 1414 */ { MAD_F(0x07bfda0f) /* 0.484338818 */, 15 }, - /* 1415 */ { MAD_F(0x07c1b902) /* 0.484795580 */, 15 }, - /* 1416 */ { MAD_F(0x07c39812) /* 0.485252449 */, 15 }, - /* 1417 */ { MAD_F(0x07c5773f) /* 0.485709426 */, 15 }, - /* 1418 */ { MAD_F(0x07c75689) /* 0.486166511 */, 15 }, - /* 1419 */ { MAD_F(0x07c935ef) /* 0.486623703 */, 15 }, - /* 1420 */ { MAD_F(0x07cb1573) /* 0.487081002 */, 15 }, - /* 1421 */ { MAD_F(0x07ccf513) /* 0.487538409 */, 15 }, - /* 1422 */ { MAD_F(0x07ced4d0) /* 0.487995923 */, 15 }, - /* 1423 */ { MAD_F(0x07d0b4aa) /* 0.488453544 */, 15 }, - - /* 1424 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 15 }, - /* 1425 */ { MAD_F(0x07d474b3) /* 0.489369108 */, 15 }, - /* 1426 */ { MAD_F(0x07d654e4) /* 0.489827051 */, 15 }, - /* 1427 */ { MAD_F(0x07d83530) /* 0.490285101 */, 15 }, - /* 1428 */ { MAD_F(0x07da159a) /* 0.490743258 */, 15 }, - /* 1429 */ { MAD_F(0x07dbf620) /* 0.491201522 */, 15 }, - /* 1430 */ { MAD_F(0x07ddd6c3) /* 0.491659892 */, 15 }, - /* 1431 */ { MAD_F(0x07dfb783) /* 0.492118370 */, 15 }, - /* 1432 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 15 }, - /* 1433 */ { MAD_F(0x07e37958) /* 0.493035645 */, 15 }, - /* 1434 */ { MAD_F(0x07e55a6e) /* 0.493494443 */, 15 }, - /* 1435 */ { MAD_F(0x07e73ba0) /* 0.493953348 */, 15 }, - /* 1436 */ { MAD_F(0x07e91cef) /* 0.494412359 */, 15 }, - /* 1437 */ { MAD_F(0x07eafe5a) /* 0.494871476 */, 15 }, - /* 1438 */ { MAD_F(0x07ecdfe2) /* 0.495330701 */, 15 }, - /* 1439 */ { MAD_F(0x07eec187) /* 0.495790031 */, 15 }, - - /* 1440 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 15 }, - /* 1441 */ { MAD_F(0x07f28526) /* 0.496709012 */, 15 }, - /* 1442 */ { MAD_F(0x07f46720) /* 0.497168662 */, 15 }, - /* 1443 */ { MAD_F(0x07f64937) /* 0.497628418 */, 15 }, - /* 1444 */ { MAD_F(0x07f82b6a) /* 0.498088280 */, 15 }, - /* 1445 */ { MAD_F(0x07fa0dba) /* 0.498548248 */, 15 }, - /* 1446 */ { MAD_F(0x07fbf026) /* 0.499008323 */, 15 }, - /* 1447 */ { MAD_F(0x07fdd2af) /* 0.499468503 */, 15 }, - /* 1448 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 15 }, - /* 1449 */ { MAD_F(0x0400cc0b) /* 0.250194591 */, 16 }, - /* 1450 */ { MAD_F(0x0401bd7a) /* 0.250424840 */, 16 }, - /* 1451 */ { MAD_F(0x0402aef7) /* 0.250655143 */, 16 }, - /* 1452 */ { MAD_F(0x0403a083) /* 0.250885498 */, 16 }, - /* 1453 */ { MAD_F(0x0404921c) /* 0.251115906 */, 16 }, - /* 1454 */ { MAD_F(0x040583c4) /* 0.251346367 */, 16 }, - /* 1455 */ { MAD_F(0x0406757a) /* 0.251576880 */, 16 }, - - /* 1456 */ { MAD_F(0x0407673f) /* 0.251807447 */, 16 }, - /* 1457 */ { MAD_F(0x04085911) /* 0.252038066 */, 16 }, - /* 1458 */ { MAD_F(0x04094af1) /* 0.252268738 */, 16 }, - /* 1459 */ { MAD_F(0x040a3ce0) /* 0.252499463 */, 16 }, - /* 1460 */ { MAD_F(0x040b2edd) /* 0.252730240 */, 16 }, - /* 1461 */ { MAD_F(0x040c20e8) /* 0.252961071 */, 16 }, - /* 1462 */ { MAD_F(0x040d1301) /* 0.253191953 */, 16 }, - /* 1463 */ { MAD_F(0x040e0529) /* 0.253422889 */, 16 }, - /* 1464 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 16 }, - /* 1465 */ { MAD_F(0x040fe9a1) /* 0.253884918 */, 16 }, - /* 1466 */ { MAD_F(0x0410dbf3) /* 0.254116011 */, 16 }, - /* 1467 */ { MAD_F(0x0411ce53) /* 0.254347157 */, 16 }, - /* 1468 */ { MAD_F(0x0412c0c1) /* 0.254578356 */, 16 }, - /* 1469 */ { MAD_F(0x0413b33d) /* 0.254809606 */, 16 }, - /* 1470 */ { MAD_F(0x0414a5c7) /* 0.255040910 */, 16 }, - /* 1471 */ { MAD_F(0x0415985f) /* 0.255272266 */, 16 }, - - /* 1472 */ { MAD_F(0x04168b05) /* 0.255503674 */, 16 }, - /* 1473 */ { MAD_F(0x04177db9) /* 0.255735135 */, 16 }, - /* 1474 */ { MAD_F(0x0418707c) /* 0.255966648 */, 16 }, - /* 1475 */ { MAD_F(0x0419634c) /* 0.256198213 */, 16 }, - /* 1476 */ { MAD_F(0x041a562a) /* 0.256429831 */, 16 }, - /* 1477 */ { MAD_F(0x041b4917) /* 0.256661501 */, 16 }, - /* 1478 */ { MAD_F(0x041c3c11) /* 0.256893223 */, 16 }, - /* 1479 */ { MAD_F(0x041d2f1a) /* 0.257124998 */, 16 }, - /* 1480 */ { MAD_F(0x041e2230) /* 0.257356825 */, 16 }, - /* 1481 */ { MAD_F(0x041f1555) /* 0.257588704 */, 16 }, - /* 1482 */ { MAD_F(0x04200888) /* 0.257820635 */, 16 }, - /* 1483 */ { MAD_F(0x0420fbc8) /* 0.258052619 */, 16 }, - /* 1484 */ { MAD_F(0x0421ef17) /* 0.258284654 */, 16 }, - /* 1485 */ { MAD_F(0x0422e273) /* 0.258516742 */, 16 }, - /* 1486 */ { MAD_F(0x0423d5de) /* 0.258748882 */, 16 }, - /* 1487 */ { MAD_F(0x0424c956) /* 0.258981074 */, 16 }, - - /* 1488 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 16 }, - /* 1489 */ { MAD_F(0x0426b071) /* 0.259445614 */, 16 }, - /* 1490 */ { MAD_F(0x0427a414) /* 0.259677962 */, 16 }, - /* 1491 */ { MAD_F(0x042897c4) /* 0.259910362 */, 16 }, - /* 1492 */ { MAD_F(0x04298b83) /* 0.260142814 */, 16 }, - /* 1493 */ { MAD_F(0x042a7f4f) /* 0.260375318 */, 16 }, - /* 1494 */ { MAD_F(0x042b7329) /* 0.260607874 */, 16 }, - /* 1495 */ { MAD_F(0x042c6711) /* 0.260840481 */, 16 }, - /* 1496 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 16 }, - /* 1497 */ { MAD_F(0x042e4f0b) /* 0.261305852 */, 16 }, - /* 1498 */ { MAD_F(0x042f431d) /* 0.261538616 */, 16 }, - /* 1499 */ { MAD_F(0x0430373d) /* 0.261771431 */, 16 }, - /* 1500 */ { MAD_F(0x04312b6b) /* 0.262004297 */, 16 }, - /* 1501 */ { MAD_F(0x04321fa6) /* 0.262237216 */, 16 }, - /* 1502 */ { MAD_F(0x043313f0) /* 0.262470186 */, 16 }, - /* 1503 */ { MAD_F(0x04340847) /* 0.262703208 */, 16 }, - - /* 1504 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 16 }, - /* 1505 */ { MAD_F(0x0435f120) /* 0.263169407 */, 16 }, - /* 1506 */ { MAD_F(0x0436e5a1) /* 0.263402584 */, 16 }, - /* 1507 */ { MAD_F(0x0437da2f) /* 0.263635813 */, 16 }, - /* 1508 */ { MAD_F(0x0438cecc) /* 0.263869093 */, 16 }, - /* 1509 */ { MAD_F(0x0439c377) /* 0.264102425 */, 16 }, - /* 1510 */ { MAD_F(0x043ab82f) /* 0.264335808 */, 16 }, - /* 1511 */ { MAD_F(0x043bacf5) /* 0.264569243 */, 16 }, - /* 1512 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 16 }, - /* 1513 */ { MAD_F(0x043d96ab) /* 0.265036267 */, 16 }, - /* 1514 */ { MAD_F(0x043e8b9b) /* 0.265269857 */, 16 }, - /* 1515 */ { MAD_F(0x043f8098) /* 0.265503498 */, 16 }, - /* 1516 */ { MAD_F(0x044075a3) /* 0.265737190 */, 16 }, - /* 1517 */ { MAD_F(0x04416abc) /* 0.265970933 */, 16 }, - /* 1518 */ { MAD_F(0x04425fe3) /* 0.266204728 */, 16 }, - /* 1519 */ { MAD_F(0x04435518) /* 0.266438574 */, 16 }, - - /* 1520 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 16 }, - /* 1521 */ { MAD_F(0x04453fab) /* 0.266906421 */, 16 }, - /* 1522 */ { MAD_F(0x04463508) /* 0.267140421 */, 16 }, - /* 1523 */ { MAD_F(0x04472a74) /* 0.267374472 */, 16 }, - /* 1524 */ { MAD_F(0x04481fee) /* 0.267608575 */, 16 }, - /* 1525 */ { MAD_F(0x04491575) /* 0.267842729 */, 16 }, - /* 1526 */ { MAD_F(0x044a0b0a) /* 0.268076934 */, 16 }, - /* 1527 */ { MAD_F(0x044b00ac) /* 0.268311190 */, 16 }, - /* 1528 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 16 }, - /* 1529 */ { MAD_F(0x044cec1b) /* 0.268779856 */, 16 }, - /* 1530 */ { MAD_F(0x044de1e7) /* 0.269014265 */, 16 }, - /* 1531 */ { MAD_F(0x044ed7c0) /* 0.269248726 */, 16 }, - /* 1532 */ { MAD_F(0x044fcda8) /* 0.269483238 */, 16 }, - /* 1533 */ { MAD_F(0x0450c39c) /* 0.269717800 */, 16 }, - /* 1534 */ { MAD_F(0x0451b99f) /* 0.269952414 */, 16 }, - /* 1535 */ { MAD_F(0x0452afaf) /* 0.270187079 */, 16 }, - - /* 1536 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 16 }, - /* 1537 */ { MAD_F(0x04549bf9) /* 0.270656561 */, 16 }, - /* 1538 */ { MAD_F(0x04559232) /* 0.270891379 */, 16 }, - /* 1539 */ { MAD_F(0x04568879) /* 0.271126247 */, 16 }, - /* 1540 */ { MAD_F(0x04577ece) /* 0.271361166 */, 16 }, - /* 1541 */ { MAD_F(0x04587530) /* 0.271596136 */, 16 }, - /* 1542 */ { MAD_F(0x04596ba0) /* 0.271831157 */, 16 }, - /* 1543 */ { MAD_F(0x045a621e) /* 0.272066229 */, 16 }, - /* 1544 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 16 }, - /* 1545 */ { MAD_F(0x045c4f42) /* 0.272536525 */, 16 }, - /* 1546 */ { MAD_F(0x045d45e9) /* 0.272771749 */, 16 }, - /* 1547 */ { MAD_F(0x045e3c9d) /* 0.273007024 */, 16 }, - /* 1548 */ { MAD_F(0x045f335e) /* 0.273242350 */, 16 }, - /* 1549 */ { MAD_F(0x04602a2e) /* 0.273477726 */, 16 }, - /* 1550 */ { MAD_F(0x0461210b) /* 0.273713153 */, 16 }, - /* 1551 */ { MAD_F(0x046217f5) /* 0.273948630 */, 16 }, - - /* 1552 */ { MAD_F(0x04630eed) /* 0.274184158 */, 16 }, - /* 1553 */ { MAD_F(0x046405f3) /* 0.274419737 */, 16 }, - /* 1554 */ { MAD_F(0x0464fd06) /* 0.274655366 */, 16 }, - /* 1555 */ { MAD_F(0x0465f427) /* 0.274891046 */, 16 }, - /* 1556 */ { MAD_F(0x0466eb55) /* 0.275126776 */, 16 }, - /* 1557 */ { MAD_F(0x0467e291) /* 0.275362557 */, 16 }, - /* 1558 */ { MAD_F(0x0468d9db) /* 0.275598389 */, 16 }, - /* 1559 */ { MAD_F(0x0469d132) /* 0.275834270 */, 16 }, - /* 1560 */ { MAD_F(0x046ac896) /* 0.276070203 */, 16 }, - /* 1561 */ { MAD_F(0x046bc009) /* 0.276306185 */, 16 }, - /* 1562 */ { MAD_F(0x046cb788) /* 0.276542218 */, 16 }, - /* 1563 */ { MAD_F(0x046daf15) /* 0.276778302 */, 16 }, - /* 1564 */ { MAD_F(0x046ea6b0) /* 0.277014435 */, 16 }, - /* 1565 */ { MAD_F(0x046f9e58) /* 0.277250619 */, 16 }, - /* 1566 */ { MAD_F(0x0470960e) /* 0.277486854 */, 16 }, - /* 1567 */ { MAD_F(0x04718dd1) /* 0.277723139 */, 16 }, - - /* 1568 */ { MAD_F(0x047285a2) /* 0.277959474 */, 16 }, - /* 1569 */ { MAD_F(0x04737d80) /* 0.278195859 */, 16 }, - /* 1570 */ { MAD_F(0x0474756c) /* 0.278432294 */, 16 }, - /* 1571 */ { MAD_F(0x04756d65) /* 0.278668780 */, 16 }, - /* 1572 */ { MAD_F(0x0476656b) /* 0.278905316 */, 16 }, - /* 1573 */ { MAD_F(0x04775d7f) /* 0.279141902 */, 16 }, - /* 1574 */ { MAD_F(0x047855a1) /* 0.279378538 */, 16 }, - /* 1575 */ { MAD_F(0x04794dd0) /* 0.279615224 */, 16 }, - /* 1576 */ { MAD_F(0x047a460c) /* 0.279851960 */, 16 }, - /* 1577 */ { MAD_F(0x047b3e56) /* 0.280088747 */, 16 }, - /* 1578 */ { MAD_F(0x047c36ae) /* 0.280325583 */, 16 }, - /* 1579 */ { MAD_F(0x047d2f12) /* 0.280562470 */, 16 }, - /* 1580 */ { MAD_F(0x047e2784) /* 0.280799406 */, 16 }, - /* 1581 */ { MAD_F(0x047f2004) /* 0.281036393 */, 16 }, - /* 1582 */ { MAD_F(0x04801891) /* 0.281273429 */, 16 }, - /* 1583 */ { MAD_F(0x0481112b) /* 0.281510516 */, 16 }, - - /* 1584 */ { MAD_F(0x048209d3) /* 0.281747652 */, 16 }, - /* 1585 */ { MAD_F(0x04830288) /* 0.281984838 */, 16 }, - /* 1586 */ { MAD_F(0x0483fb4b) /* 0.282222075 */, 16 }, - /* 1587 */ { MAD_F(0x0484f41b) /* 0.282459361 */, 16 }, - /* 1588 */ { MAD_F(0x0485ecf8) /* 0.282696697 */, 16 }, - /* 1589 */ { MAD_F(0x0486e5e3) /* 0.282934082 */, 16 }, - /* 1590 */ { MAD_F(0x0487dedb) /* 0.283171518 */, 16 }, - /* 1591 */ { MAD_F(0x0488d7e1) /* 0.283409003 */, 16 }, - /* 1592 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 16 }, - /* 1593 */ { MAD_F(0x048aca14) /* 0.283884123 */, 16 }, - /* 1594 */ { MAD_F(0x048bc341) /* 0.284121757 */, 16 }, - /* 1595 */ { MAD_F(0x048cbc7c) /* 0.284359441 */, 16 }, - /* 1596 */ { MAD_F(0x048db5c4) /* 0.284597175 */, 16 }, - /* 1597 */ { MAD_F(0x048eaf1a) /* 0.284834959 */, 16 }, - /* 1598 */ { MAD_F(0x048fa87d) /* 0.285072792 */, 16 }, - /* 1599 */ { MAD_F(0x0490a1ed) /* 0.285310675 */, 16 }, - - /* 1600 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 16 }, - /* 1601 */ { MAD_F(0x049294f5) /* 0.285786589 */, 16 }, - /* 1602 */ { MAD_F(0x04938e8d) /* 0.286024621 */, 16 }, - /* 1603 */ { MAD_F(0x04948833) /* 0.286262702 */, 16 }, - /* 1604 */ { MAD_F(0x049581e5) /* 0.286500832 */, 16 }, - /* 1605 */ { MAD_F(0x04967ba5) /* 0.286739012 */, 16 }, - /* 1606 */ { MAD_F(0x04977573) /* 0.286977242 */, 16 }, - /* 1607 */ { MAD_F(0x04986f4d) /* 0.287215521 */, 16 }, - /* 1608 */ { MAD_F(0x04996935) /* 0.287453849 */, 16 }, - /* 1609 */ { MAD_F(0x049a632a) /* 0.287692227 */, 16 }, - /* 1610 */ { MAD_F(0x049b5d2c) /* 0.287930654 */, 16 }, - /* 1611 */ { MAD_F(0x049c573c) /* 0.288169131 */, 16 }, - /* 1612 */ { MAD_F(0x049d5159) /* 0.288407657 */, 16 }, - /* 1613 */ { MAD_F(0x049e4b83) /* 0.288646232 */, 16 }, - /* 1614 */ { MAD_F(0x049f45ba) /* 0.288884857 */, 16 }, - /* 1615 */ { MAD_F(0x04a03ffe) /* 0.289123530 */, 16 }, - - /* 1616 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 16 }, - /* 1617 */ { MAD_F(0x04a234af) /* 0.289601026 */, 16 }, - /* 1618 */ { MAD_F(0x04a32f1b) /* 0.289839847 */, 16 }, - /* 1619 */ { MAD_F(0x04a42995) /* 0.290078718 */, 16 }, - /* 1620 */ { MAD_F(0x04a5241b) /* 0.290317638 */, 16 }, - /* 1621 */ { MAD_F(0x04a61eaf) /* 0.290556607 */, 16 }, - /* 1622 */ { MAD_F(0x04a71950) /* 0.290795626 */, 16 }, - /* 1623 */ { MAD_F(0x04a813fe) /* 0.291034693 */, 16 }, - /* 1624 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 16 }, - /* 1625 */ { MAD_F(0x04aa0982) /* 0.291512975 */, 16 }, - /* 1626 */ { MAD_F(0x04ab0458) /* 0.291752190 */, 16 }, - /* 1627 */ { MAD_F(0x04abff3b) /* 0.291991453 */, 16 }, - /* 1628 */ { MAD_F(0x04acfa2b) /* 0.292230766 */, 16 }, - /* 1629 */ { MAD_F(0x04adf528) /* 0.292470128 */, 16 }, - /* 1630 */ { MAD_F(0x04aef032) /* 0.292709539 */, 16 }, - /* 1631 */ { MAD_F(0x04afeb4a) /* 0.292948998 */, 16 }, - - /* 1632 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 16 }, - /* 1633 */ { MAD_F(0x04b1e1a0) /* 0.293428065 */, 16 }, - /* 1634 */ { MAD_F(0x04b2dcdf) /* 0.293667671 */, 16 }, - /* 1635 */ { MAD_F(0x04b3d82b) /* 0.293907326 */, 16 }, - /* 1636 */ { MAD_F(0x04b4d384) /* 0.294147031 */, 16 }, - /* 1637 */ { MAD_F(0x04b5ceea) /* 0.294386784 */, 16 }, - /* 1638 */ { MAD_F(0x04b6ca5e) /* 0.294626585 */, 16 }, - /* 1639 */ { MAD_F(0x04b7c5de) /* 0.294866436 */, 16 }, - /* 1640 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 16 }, - /* 1641 */ { MAD_F(0x04b9bd06) /* 0.295346284 */, 16 }, - /* 1642 */ { MAD_F(0x04bab8ae) /* 0.295586281 */, 16 }, - /* 1643 */ { MAD_F(0x04bbb463) /* 0.295826327 */, 16 }, - /* 1644 */ { MAD_F(0x04bcb024) /* 0.296066421 */, 16 }, - /* 1645 */ { MAD_F(0x04bdabf3) /* 0.296306564 */, 16 }, - /* 1646 */ { MAD_F(0x04bea7cf) /* 0.296546756 */, 16 }, - /* 1647 */ { MAD_F(0x04bfa3b8) /* 0.296786996 */, 16 }, - - /* 1648 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 16 }, - /* 1649 */ { MAD_F(0x04c19bb2) /* 0.297267623 */, 16 }, - /* 1650 */ { MAD_F(0x04c297c2) /* 0.297508009 */, 16 }, - /* 1651 */ { MAD_F(0x04c393df) /* 0.297748444 */, 16 }, - /* 1652 */ { MAD_F(0x04c49009) /* 0.297988927 */, 16 }, - /* 1653 */ { MAD_F(0x04c58c41) /* 0.298229459 */, 16 }, - /* 1654 */ { MAD_F(0x04c68885) /* 0.298470039 */, 16 }, - /* 1655 */ { MAD_F(0x04c784d6) /* 0.298710668 */, 16 }, - /* 1656 */ { MAD_F(0x04c88135) /* 0.298951346 */, 16 }, - /* 1657 */ { MAD_F(0x04c97da0) /* 0.299192071 */, 16 }, - /* 1658 */ { MAD_F(0x04ca7a18) /* 0.299432846 */, 16 }, - /* 1659 */ { MAD_F(0x04cb769e) /* 0.299673668 */, 16 }, - /* 1660 */ { MAD_F(0x04cc7330) /* 0.299914539 */, 16 }, - /* 1661 */ { MAD_F(0x04cd6fcf) /* 0.300155459 */, 16 }, - /* 1662 */ { MAD_F(0x04ce6c7b) /* 0.300396426 */, 16 }, - /* 1663 */ { MAD_F(0x04cf6935) /* 0.300637443 */, 16 }, - - /* 1664 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 16 }, - /* 1665 */ { MAD_F(0x04d162ce) /* 0.301119620 */, 16 }, - /* 1666 */ { MAD_F(0x04d25fae) /* 0.301360781 */, 16 }, - /* 1667 */ { MAD_F(0x04d35c9b) /* 0.301601990 */, 16 }, - /* 1668 */ { MAD_F(0x04d45995) /* 0.301843247 */, 16 }, - /* 1669 */ { MAD_F(0x04d5569c) /* 0.302084553 */, 16 }, - /* 1670 */ { MAD_F(0x04d653b0) /* 0.302325907 */, 16 }, - /* 1671 */ { MAD_F(0x04d750d1) /* 0.302567309 */, 16 }, - /* 1672 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 16 }, - /* 1673 */ { MAD_F(0x04d94b3a) /* 0.303050257 */, 16 }, - /* 1674 */ { MAD_F(0x04da4881) /* 0.303291804 */, 16 }, - /* 1675 */ { MAD_F(0x04db45d6) /* 0.303533399 */, 16 }, - /* 1676 */ { MAD_F(0x04dc4337) /* 0.303775041 */, 16 }, - /* 1677 */ { MAD_F(0x04dd40a6) /* 0.304016732 */, 16 }, - /* 1678 */ { MAD_F(0x04de3e21) /* 0.304258471 */, 16 }, - /* 1679 */ { MAD_F(0x04df3ba9) /* 0.304500257 */, 16 }, - - /* 1680 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 16 }, - /* 1681 */ { MAD_F(0x04e136e0) /* 0.304983975 */, 16 }, - /* 1682 */ { MAD_F(0x04e2348f) /* 0.305225906 */, 16 }, - /* 1683 */ { MAD_F(0x04e3324b) /* 0.305467885 */, 16 }, - /* 1684 */ { MAD_F(0x04e43013) /* 0.305709911 */, 16 }, - /* 1685 */ { MAD_F(0x04e52de9) /* 0.305951986 */, 16 }, - /* 1686 */ { MAD_F(0x04e62bcb) /* 0.306194108 */, 16 }, - /* 1687 */ { MAD_F(0x04e729ba) /* 0.306436279 */, 16 }, - /* 1688 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 16 }, - /* 1689 */ { MAD_F(0x04e925bf) /* 0.306920763 */, 16 }, - /* 1690 */ { MAD_F(0x04ea23d4) /* 0.307163077 */, 16 }, - /* 1691 */ { MAD_F(0x04eb21f7) /* 0.307405438 */, 16 }, - /* 1692 */ { MAD_F(0x04ec2026) /* 0.307647848 */, 16 }, - /* 1693 */ { MAD_F(0x04ed1e62) /* 0.307890305 */, 16 }, - /* 1694 */ { MAD_F(0x04ee1cab) /* 0.308132810 */, 16 }, - /* 1695 */ { MAD_F(0x04ef1b01) /* 0.308375362 */, 16 }, - - /* 1696 */ { MAD_F(0x04f01963) /* 0.308617963 */, 16 }, - /* 1697 */ { MAD_F(0x04f117d3) /* 0.308860611 */, 16 }, - /* 1698 */ { MAD_F(0x04f2164f) /* 0.309103306 */, 16 }, - /* 1699 */ { MAD_F(0x04f314d8) /* 0.309346050 */, 16 }, - /* 1700 */ { MAD_F(0x04f4136d) /* 0.309588841 */, 16 }, - /* 1701 */ { MAD_F(0x04f51210) /* 0.309831679 */, 16 }, - /* 1702 */ { MAD_F(0x04f610bf) /* 0.310074565 */, 16 }, - /* 1703 */ { MAD_F(0x04f70f7b) /* 0.310317499 */, 16 }, - /* 1704 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 16 }, - /* 1705 */ { MAD_F(0x04f90d19) /* 0.310803509 */, 16 }, - /* 1706 */ { MAD_F(0x04fa0bfc) /* 0.311046586 */, 16 }, - /* 1707 */ { MAD_F(0x04fb0aeb) /* 0.311289710 */, 16 }, - /* 1708 */ { MAD_F(0x04fc09e7) /* 0.311532881 */, 16 }, - /* 1709 */ { MAD_F(0x04fd08ef) /* 0.311776100 */, 16 }, - /* 1710 */ { MAD_F(0x04fe0805) /* 0.312019366 */, 16 }, - /* 1711 */ { MAD_F(0x04ff0727) /* 0.312262680 */, 16 }, - - /* 1712 */ { MAD_F(0x05000655) /* 0.312506041 */, 16 }, - /* 1713 */ { MAD_F(0x05010591) /* 0.312749449 */, 16 }, - /* 1714 */ { MAD_F(0x050204d9) /* 0.312992905 */, 16 }, - /* 1715 */ { MAD_F(0x0503042e) /* 0.313236408 */, 16 }, - /* 1716 */ { MAD_F(0x0504038f) /* 0.313479959 */, 16 }, - /* 1717 */ { MAD_F(0x050502fe) /* 0.313723556 */, 16 }, - /* 1718 */ { MAD_F(0x05060279) /* 0.313967202 */, 16 }, - /* 1719 */ { MAD_F(0x05070200) /* 0.314210894 */, 16 }, - /* 1720 */ { MAD_F(0x05080195) /* 0.314454634 */, 16 }, - /* 1721 */ { MAD_F(0x05090136) /* 0.314698420 */, 16 }, - /* 1722 */ { MAD_F(0x050a00e3) /* 0.314942255 */, 16 }, - /* 1723 */ { MAD_F(0x050b009e) /* 0.315186136 */, 16 }, - /* 1724 */ { MAD_F(0x050c0065) /* 0.315430064 */, 16 }, - /* 1725 */ { MAD_F(0x050d0039) /* 0.315674040 */, 16 }, - /* 1726 */ { MAD_F(0x050e0019) /* 0.315918063 */, 16 }, - /* 1727 */ { MAD_F(0x050f0006) /* 0.316162133 */, 16 }, - - /* 1728 */ { MAD_F(0x05100000) /* 0.316406250 */, 16 }, - /* 1729 */ { MAD_F(0x05110006) /* 0.316650414 */, 16 }, - /* 1730 */ { MAD_F(0x05120019) /* 0.316894625 */, 16 }, - /* 1731 */ { MAD_F(0x05130039) /* 0.317138884 */, 16 }, - /* 1732 */ { MAD_F(0x05140065) /* 0.317383189 */, 16 }, - /* 1733 */ { MAD_F(0x0515009e) /* 0.317627541 */, 16 }, - /* 1734 */ { MAD_F(0x051600e3) /* 0.317871941 */, 16 }, - /* 1735 */ { MAD_F(0x05170135) /* 0.318116387 */, 16 }, - /* 1736 */ { MAD_F(0x05180194) /* 0.318360880 */, 16 }, - /* 1737 */ { MAD_F(0x051901ff) /* 0.318605421 */, 16 }, - /* 1738 */ { MAD_F(0x051a0277) /* 0.318850008 */, 16 }, - /* 1739 */ { MAD_F(0x051b02fc) /* 0.319094642 */, 16 }, - /* 1740 */ { MAD_F(0x051c038d) /* 0.319339323 */, 16 }, - /* 1741 */ { MAD_F(0x051d042a) /* 0.319584051 */, 16 }, - /* 1742 */ { MAD_F(0x051e04d4) /* 0.319828826 */, 16 }, - /* 1743 */ { MAD_F(0x051f058b) /* 0.320073647 */, 16 }, - - /* 1744 */ { MAD_F(0x0520064f) /* 0.320318516 */, 16 }, - /* 1745 */ { MAD_F(0x0521071f) /* 0.320563431 */, 16 }, - /* 1746 */ { MAD_F(0x052207fb) /* 0.320808393 */, 16 }, - /* 1747 */ { MAD_F(0x052308e4) /* 0.321053402 */, 16 }, - /* 1748 */ { MAD_F(0x052409da) /* 0.321298457 */, 16 }, - /* 1749 */ { MAD_F(0x05250adc) /* 0.321543560 */, 16 }, - /* 1750 */ { MAD_F(0x05260bea) /* 0.321788709 */, 16 }, - /* 1751 */ { MAD_F(0x05270d06) /* 0.322033904 */, 16 }, - /* 1752 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 16 }, - /* 1753 */ { MAD_F(0x05290f62) /* 0.322524436 */, 16 }, - /* 1754 */ { MAD_F(0x052a10a3) /* 0.322769771 */, 16 }, - /* 1755 */ { MAD_F(0x052b11f0) /* 0.323015154 */, 16 }, - /* 1756 */ { MAD_F(0x052c134a) /* 0.323260583 */, 16 }, - /* 1757 */ { MAD_F(0x052d14b0) /* 0.323506058 */, 16 }, - /* 1758 */ { MAD_F(0x052e1623) /* 0.323751580 */, 16 }, - /* 1759 */ { MAD_F(0x052f17a2) /* 0.323997149 */, 16 }, - - /* 1760 */ { MAD_F(0x0530192e) /* 0.324242764 */, 16 }, - /* 1761 */ { MAD_F(0x05311ac6) /* 0.324488426 */, 16 }, - /* 1762 */ { MAD_F(0x05321c6b) /* 0.324734134 */, 16 }, - /* 1763 */ { MAD_F(0x05331e1c) /* 0.324979889 */, 16 }, - /* 1764 */ { MAD_F(0x05341fda) /* 0.325225690 */, 16 }, - /* 1765 */ { MAD_F(0x053521a4) /* 0.325471538 */, 16 }, - /* 1766 */ { MAD_F(0x0536237b) /* 0.325717432 */, 16 }, - /* 1767 */ { MAD_F(0x0537255e) /* 0.325963372 */, 16 }, - /* 1768 */ { MAD_F(0x0538274e) /* 0.326209359 */, 16 }, - /* 1769 */ { MAD_F(0x0539294a) /* 0.326455392 */, 16 }, - /* 1770 */ { MAD_F(0x053a2b52) /* 0.326701472 */, 16 }, - /* 1771 */ { MAD_F(0x053b2d67) /* 0.326947598 */, 16 }, - /* 1772 */ { MAD_F(0x053c2f89) /* 0.327193770 */, 16 }, - /* 1773 */ { MAD_F(0x053d31b6) /* 0.327439989 */, 16 }, - /* 1774 */ { MAD_F(0x053e33f1) /* 0.327686254 */, 16 }, - /* 1775 */ { MAD_F(0x053f3637) /* 0.327932565 */, 16 }, - - /* 1776 */ { MAD_F(0x0540388a) /* 0.328178922 */, 16 }, - /* 1777 */ { MAD_F(0x05413aea) /* 0.328425326 */, 16 }, - /* 1778 */ { MAD_F(0x05423d56) /* 0.328671776 */, 16 }, - /* 1779 */ { MAD_F(0x05433fce) /* 0.328918272 */, 16 }, - /* 1780 */ { MAD_F(0x05444253) /* 0.329164814 */, 16 }, - /* 1781 */ { MAD_F(0x054544e4) /* 0.329411403 */, 16 }, - /* 1782 */ { MAD_F(0x05464781) /* 0.329658038 */, 16 }, - /* 1783 */ { MAD_F(0x05474a2b) /* 0.329904718 */, 16 }, - /* 1784 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 16 }, - /* 1785 */ { MAD_F(0x05494fa4) /* 0.330398218 */, 16 }, - /* 1786 */ { MAD_F(0x054a5273) /* 0.330645037 */, 16 }, - /* 1787 */ { MAD_F(0x054b554e) /* 0.330891903 */, 16 }, - /* 1788 */ { MAD_F(0x054c5836) /* 0.331138814 */, 16 }, - /* 1789 */ { MAD_F(0x054d5b2a) /* 0.331385771 */, 16 }, - /* 1790 */ { MAD_F(0x054e5e2b) /* 0.331632774 */, 16 }, - /* 1791 */ { MAD_F(0x054f6138) /* 0.331879824 */, 16 }, - - /* 1792 */ { MAD_F(0x05506451) /* 0.332126919 */, 16 }, - /* 1793 */ { MAD_F(0x05516776) /* 0.332374060 */, 16 }, - /* 1794 */ { MAD_F(0x05526aa8) /* 0.332621247 */, 16 }, - /* 1795 */ { MAD_F(0x05536de6) /* 0.332868480 */, 16 }, - /* 1796 */ { MAD_F(0x05547131) /* 0.333115759 */, 16 }, - /* 1797 */ { MAD_F(0x05557487) /* 0.333363084 */, 16 }, - /* 1798 */ { MAD_F(0x055677ea) /* 0.333610455 */, 16 }, - /* 1799 */ { MAD_F(0x05577b5a) /* 0.333857872 */, 16 }, - /* 1800 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 16 }, - /* 1801 */ { MAD_F(0x0559825e) /* 0.334352843 */, 16 }, - /* 1802 */ { MAD_F(0x055a85f2) /* 0.334600397 */, 16 }, - /* 1803 */ { MAD_F(0x055b8992) /* 0.334847997 */, 16 }, - /* 1804 */ { MAD_F(0x055c8d3f) /* 0.335095642 */, 16 }, - /* 1805 */ { MAD_F(0x055d90f9) /* 0.335343334 */, 16 }, - /* 1806 */ { MAD_F(0x055e94be) /* 0.335591071 */, 16 }, - /* 1807 */ { MAD_F(0x055f9890) /* 0.335838854 */, 16 }, - - /* 1808 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 16 }, - /* 1809 */ { MAD_F(0x0561a058) /* 0.336334557 */, 16 }, - /* 1810 */ { MAD_F(0x0562a44f) /* 0.336582477 */, 16 }, - /* 1811 */ { MAD_F(0x0563a851) /* 0.336830443 */, 16 }, - /* 1812 */ { MAD_F(0x0564ac60) /* 0.337078454 */, 16 }, - /* 1813 */ { MAD_F(0x0565b07c) /* 0.337326511 */, 16 }, - /* 1814 */ { MAD_F(0x0566b4a3) /* 0.337574614 */, 16 }, - /* 1815 */ { MAD_F(0x0567b8d7) /* 0.337822762 */, 16 }, - /* 1816 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 16 }, - /* 1817 */ { MAD_F(0x0569c163) /* 0.338319195 */, 16 }, - /* 1818 */ { MAD_F(0x056ac5bc) /* 0.338567480 */, 16 }, - /* 1819 */ { MAD_F(0x056bca20) /* 0.338815811 */, 16 }, - /* 1820 */ { MAD_F(0x056cce91) /* 0.339064186 */, 16 }, - /* 1821 */ { MAD_F(0x056dd30e) /* 0.339312608 */, 16 }, - /* 1822 */ { MAD_F(0x056ed798) /* 0.339561075 */, 16 }, - /* 1823 */ { MAD_F(0x056fdc2d) /* 0.339809587 */, 16 }, - - /* 1824 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 16 }, - /* 1825 */ { MAD_F(0x0571e57d) /* 0.340306748 */, 16 }, - /* 1826 */ { MAD_F(0x0572ea37) /* 0.340555397 */, 16 }, - /* 1827 */ { MAD_F(0x0573eefd) /* 0.340804091 */, 16 }, - /* 1828 */ { MAD_F(0x0574f3d0) /* 0.341052830 */, 16 }, - /* 1829 */ { MAD_F(0x0575f8ae) /* 0.341301615 */, 16 }, - /* 1830 */ { MAD_F(0x0576fd99) /* 0.341550445 */, 16 }, - /* 1831 */ { MAD_F(0x05780290) /* 0.341799321 */, 16 }, - /* 1832 */ { MAD_F(0x05790793) /* 0.342048241 */, 16 }, - /* 1833 */ { MAD_F(0x057a0ca3) /* 0.342297207 */, 16 }, - /* 1834 */ { MAD_F(0x057b11be) /* 0.342546219 */, 16 }, - /* 1835 */ { MAD_F(0x057c16e6) /* 0.342795275 */, 16 }, - /* 1836 */ { MAD_F(0x057d1c1a) /* 0.343044377 */, 16 }, - /* 1837 */ { MAD_F(0x057e2159) /* 0.343293524 */, 16 }, - /* 1838 */ { MAD_F(0x057f26a6) /* 0.343542717 */, 16 }, - /* 1839 */ { MAD_F(0x05802bfe) /* 0.343791954 */, 16 }, - - /* 1840 */ { MAD_F(0x05813162) /* 0.344041237 */, 16 }, - /* 1841 */ { MAD_F(0x058236d2) /* 0.344290564 */, 16 }, - /* 1842 */ { MAD_F(0x05833c4f) /* 0.344539937 */, 16 }, - /* 1843 */ { MAD_F(0x058441d8) /* 0.344789356 */, 16 }, - /* 1844 */ { MAD_F(0x0585476c) /* 0.345038819 */, 16 }, - /* 1845 */ { MAD_F(0x05864d0d) /* 0.345288327 */, 16 }, - /* 1846 */ { MAD_F(0x058752ba) /* 0.345537880 */, 16 }, - /* 1847 */ { MAD_F(0x05885873) /* 0.345787479 */, 16 }, - /* 1848 */ { MAD_F(0x05895e39) /* 0.346037122 */, 16 }, - /* 1849 */ { MAD_F(0x058a640a) /* 0.346286811 */, 16 }, - /* 1850 */ { MAD_F(0x058b69e7) /* 0.346536545 */, 16 }, - /* 1851 */ { MAD_F(0x058c6fd1) /* 0.346786323 */, 16 }, - /* 1852 */ { MAD_F(0x058d75c6) /* 0.347036147 */, 16 }, - /* 1853 */ { MAD_F(0x058e7bc8) /* 0.347286015 */, 16 }, - /* 1854 */ { MAD_F(0x058f81d5) /* 0.347535929 */, 16 }, - /* 1855 */ { MAD_F(0x059087ef) /* 0.347785887 */, 16 }, - - /* 1856 */ { MAD_F(0x05918e15) /* 0.348035890 */, 16 }, - /* 1857 */ { MAD_F(0x05929447) /* 0.348285939 */, 16 }, - /* 1858 */ { MAD_F(0x05939a84) /* 0.348536032 */, 16 }, - /* 1859 */ { MAD_F(0x0594a0ce) /* 0.348786170 */, 16 }, - /* 1860 */ { MAD_F(0x0595a724) /* 0.349036353 */, 16 }, - /* 1861 */ { MAD_F(0x0596ad86) /* 0.349286580 */, 16 }, - /* 1862 */ { MAD_F(0x0597b3f4) /* 0.349536853 */, 16 }, - /* 1863 */ { MAD_F(0x0598ba6e) /* 0.349787170 */, 16 }, - /* 1864 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 16 }, - /* 1865 */ { MAD_F(0x059ac786) /* 0.350287939 */, 16 }, - /* 1866 */ { MAD_F(0x059bce25) /* 0.350538391 */, 16 }, - /* 1867 */ { MAD_F(0x059cd4cf) /* 0.350788887 */, 16 }, - /* 1868 */ { MAD_F(0x059ddb85) /* 0.351039428 */, 16 }, - /* 1869 */ { MAD_F(0x059ee247) /* 0.351290014 */, 16 }, - /* 1870 */ { MAD_F(0x059fe915) /* 0.351540645 */, 16 }, - /* 1871 */ { MAD_F(0x05a0efef) /* 0.351791320 */, 16 }, - - /* 1872 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 16 }, - /* 1873 */ { MAD_F(0x05a2fdc7) /* 0.352292804 */, 16 }, - /* 1874 */ { MAD_F(0x05a404c5) /* 0.352543613 */, 16 }, - /* 1875 */ { MAD_F(0x05a50bcf) /* 0.352794467 */, 16 }, - /* 1876 */ { MAD_F(0x05a612e5) /* 0.353045365 */, 16 }, - /* 1877 */ { MAD_F(0x05a71a07) /* 0.353296308 */, 16 }, - /* 1878 */ { MAD_F(0x05a82135) /* 0.353547296 */, 16 }, - /* 1879 */ { MAD_F(0x05a9286f) /* 0.353798328 */, 16 }, - /* 1880 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 16 }, - /* 1881 */ { MAD_F(0x05ab3707) /* 0.354300526 */, 16 }, - /* 1882 */ { MAD_F(0x05ac3e65) /* 0.354551691 */, 16 }, - /* 1883 */ { MAD_F(0x05ad45ce) /* 0.354802901 */, 16 }, - /* 1884 */ { MAD_F(0x05ae4d44) /* 0.355054156 */, 16 }, - /* 1885 */ { MAD_F(0x05af54c6) /* 0.355305455 */, 16 }, - /* 1886 */ { MAD_F(0x05b05c53) /* 0.355556799 */, 16 }, - /* 1887 */ { MAD_F(0x05b163ed) /* 0.355808187 */, 16 }, - - /* 1888 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 16 }, - /* 1889 */ { MAD_F(0x05b37343) /* 0.356311096 */, 16 }, - /* 1890 */ { MAD_F(0x05b47b00) /* 0.356562617 */, 16 }, - /* 1891 */ { MAD_F(0x05b582c9) /* 0.356814182 */, 16 }, - /* 1892 */ { MAD_F(0x05b68a9e) /* 0.357065792 */, 16 }, - /* 1893 */ { MAD_F(0x05b7927f) /* 0.357317446 */, 16 }, - /* 1894 */ { MAD_F(0x05b89a6c) /* 0.357569145 */, 16 }, - /* 1895 */ { MAD_F(0x05b9a265) /* 0.357820887 */, 16 }, - /* 1896 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 16 }, - /* 1897 */ { MAD_F(0x05bbb27a) /* 0.358324506 */, 16 }, - /* 1898 */ { MAD_F(0x05bcba96) /* 0.358576381 */, 16 }, - /* 1899 */ { MAD_F(0x05bdc2be) /* 0.358828301 */, 16 }, - /* 1900 */ { MAD_F(0x05becaf2) /* 0.359080265 */, 16 }, - /* 1901 */ { MAD_F(0x05bfd332) /* 0.359332273 */, 16 }, - /* 1902 */ { MAD_F(0x05c0db7e) /* 0.359584326 */, 16 }, - /* 1903 */ { MAD_F(0x05c1e3d6) /* 0.359836423 */, 16 }, - - /* 1904 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 16 }, - /* 1905 */ { MAD_F(0x05c3f4a9) /* 0.360340748 */, 16 }, - /* 1906 */ { MAD_F(0x05c4fd24) /* 0.360592977 */, 16 }, - /* 1907 */ { MAD_F(0x05c605ab) /* 0.360845251 */, 16 }, - /* 1908 */ { MAD_F(0x05c70e3e) /* 0.361097568 */, 16 }, - /* 1909 */ { MAD_F(0x05c816dd) /* 0.361349929 */, 16 }, - /* 1910 */ { MAD_F(0x05c91f87) /* 0.361602335 */, 16 }, - /* 1911 */ { MAD_F(0x05ca283e) /* 0.361854784 */, 16 }, - /* 1912 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 16 }, - /* 1913 */ { MAD_F(0x05cc39ce) /* 0.362359815 */, 16 }, - /* 1914 */ { MAD_F(0x05cd42a8) /* 0.362612397 */, 16 }, - /* 1915 */ { MAD_F(0x05ce4b8d) /* 0.362865022 */, 16 }, - /* 1916 */ { MAD_F(0x05cf547f) /* 0.363117692 */, 16 }, - /* 1917 */ { MAD_F(0x05d05d7c) /* 0.363370405 */, 16 }, - /* 1918 */ { MAD_F(0x05d16685) /* 0.363623163 */, 16 }, - /* 1919 */ { MAD_F(0x05d26f9a) /* 0.363875964 */, 16 }, - - /* 1920 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 16 }, - /* 1921 */ { MAD_F(0x05d481e7) /* 0.364381698 */, 16 }, - /* 1922 */ { MAD_F(0x05d58b1f) /* 0.364634632 */, 16 }, - /* 1923 */ { MAD_F(0x05d69463) /* 0.364887608 */, 16 }, - /* 1924 */ { MAD_F(0x05d79db3) /* 0.365140629 */, 16 }, - /* 1925 */ { MAD_F(0x05d8a70f) /* 0.365393694 */, 16 }, - /* 1926 */ { MAD_F(0x05d9b076) /* 0.365646802 */, 16 }, - /* 1927 */ { MAD_F(0x05dab9e9) /* 0.365899955 */, 16 }, - /* 1928 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 16 }, - /* 1929 */ { MAD_F(0x05dcccf2) /* 0.366406390 */, 16 }, - /* 1930 */ { MAD_F(0x05ddd689) /* 0.366659674 */, 16 }, - /* 1931 */ { MAD_F(0x05dee02b) /* 0.366913001 */, 16 }, - /* 1932 */ { MAD_F(0x05dfe9d8) /* 0.367166372 */, 16 }, - /* 1933 */ { MAD_F(0x05e0f392) /* 0.367419787 */, 16 }, - /* 1934 */ { MAD_F(0x05e1fd57) /* 0.367673246 */, 16 }, - /* 1935 */ { MAD_F(0x05e30728) /* 0.367926748 */, 16 }, - - /* 1936 */ { MAD_F(0x05e41105) /* 0.368180294 */, 16 }, - /* 1937 */ { MAD_F(0x05e51aed) /* 0.368433883 */, 16 }, - /* 1938 */ { MAD_F(0x05e624e1) /* 0.368687517 */, 16 }, - /* 1939 */ { MAD_F(0x05e72ee1) /* 0.368941193 */, 16 }, - /* 1940 */ { MAD_F(0x05e838ed) /* 0.369194914 */, 16 }, - /* 1941 */ { MAD_F(0x05e94304) /* 0.369448678 */, 16 }, - /* 1942 */ { MAD_F(0x05ea4d27) /* 0.369702485 */, 16 }, - /* 1943 */ { MAD_F(0x05eb5756) /* 0.369956336 */, 16 }, - /* 1944 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 16 }, - /* 1945 */ { MAD_F(0x05ed6bd6) /* 0.370464169 */, 16 }, - /* 1946 */ { MAD_F(0x05ee7628) /* 0.370718151 */, 16 }, - /* 1947 */ { MAD_F(0x05ef8085) /* 0.370972177 */, 16 }, - /* 1948 */ { MAD_F(0x05f08aee) /* 0.371226245 */, 16 }, - /* 1949 */ { MAD_F(0x05f19563) /* 0.371480358 */, 16 }, - /* 1950 */ { MAD_F(0x05f29fe3) /* 0.371734513 */, 16 }, - /* 1951 */ { MAD_F(0x05f3aa6f) /* 0.371988712 */, 16 }, - - /* 1952 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 16 }, - /* 1953 */ { MAD_F(0x05f5bfab) /* 0.372497241 */, 16 }, - /* 1954 */ { MAD_F(0x05f6ca5a) /* 0.372751570 */, 16 }, - /* 1955 */ { MAD_F(0x05f7d514) /* 0.373005943 */, 16 }, - /* 1956 */ { MAD_F(0x05f8dfdb) /* 0.373260359 */, 16 }, - /* 1957 */ { MAD_F(0x05f9eaad) /* 0.373514819 */, 16 }, - /* 1958 */ { MAD_F(0x05faf58a) /* 0.373769322 */, 16 }, - /* 1959 */ { MAD_F(0x05fc0073) /* 0.374023868 */, 16 }, - /* 1960 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 16 }, - /* 1961 */ { MAD_F(0x05fe1669) /* 0.374533091 */, 16 }, - /* 1962 */ { MAD_F(0x05ff2175) /* 0.374787767 */, 16 }, - /* 1963 */ { MAD_F(0x06002c8d) /* 0.375042486 */, 16 }, - /* 1964 */ { MAD_F(0x060137b0) /* 0.375297249 */, 16 }, - /* 1965 */ { MAD_F(0x060242df) /* 0.375552055 */, 16 }, - /* 1966 */ { MAD_F(0x06034e19) /* 0.375806904 */, 16 }, - /* 1967 */ { MAD_F(0x0604595f) /* 0.376061796 */, 16 }, - - /* 1968 */ { MAD_F(0x060564b1) /* 0.376316732 */, 16 }, - /* 1969 */ { MAD_F(0x0606700f) /* 0.376571710 */, 16 }, - /* 1970 */ { MAD_F(0x06077b77) /* 0.376826732 */, 16 }, - /* 1971 */ { MAD_F(0x060886ec) /* 0.377081797 */, 16 }, - /* 1972 */ { MAD_F(0x0609926c) /* 0.377336905 */, 16 }, - /* 1973 */ { MAD_F(0x060a9df8) /* 0.377592057 */, 16 }, - /* 1974 */ { MAD_F(0x060ba98f) /* 0.377847251 */, 16 }, - /* 1975 */ { MAD_F(0x060cb532) /* 0.378102489 */, 16 }, - /* 1976 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 16 }, - /* 1977 */ { MAD_F(0x060ecc9a) /* 0.378613093 */, 16 }, - /* 1978 */ { MAD_F(0x060fd860) /* 0.378868460 */, 16 }, - /* 1979 */ { MAD_F(0x0610e431) /* 0.379123870 */, 16 }, - /* 1980 */ { MAD_F(0x0611f00d) /* 0.379379322 */, 16 }, - /* 1981 */ { MAD_F(0x0612fbf5) /* 0.379634818 */, 16 }, - /* 1982 */ { MAD_F(0x061407e9) /* 0.379890357 */, 16 }, - /* 1983 */ { MAD_F(0x061513e8) /* 0.380145939 */, 16 }, - - /* 1984 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 16 }, - /* 1985 */ { MAD_F(0x06172c09) /* 0.380657231 */, 16 }, - /* 1986 */ { MAD_F(0x0618382b) /* 0.380912942 */, 16 }, - /* 1987 */ { MAD_F(0x06194458) /* 0.381168695 */, 16 }, - /* 1988 */ { MAD_F(0x061a5091) /* 0.381424492 */, 16 }, - /* 1989 */ { MAD_F(0x061b5cd5) /* 0.381680331 */, 16 }, - /* 1990 */ { MAD_F(0x061c6925) /* 0.381936213 */, 16 }, - /* 1991 */ { MAD_F(0x061d7581) /* 0.382192138 */, 16 }, - /* 1992 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 16 }, - /* 1993 */ { MAD_F(0x061f8e5a) /* 0.382704117 */, 16 }, - /* 1994 */ { MAD_F(0x06209ad8) /* 0.382960171 */, 16 }, - /* 1995 */ { MAD_F(0x0621a761) /* 0.383216267 */, 16 }, - /* 1996 */ { MAD_F(0x0622b3f6) /* 0.383472406 */, 16 }, - /* 1997 */ { MAD_F(0x0623c096) /* 0.383728588 */, 16 }, - /* 1998 */ { MAD_F(0x0624cd42) /* 0.383984813 */, 16 }, - /* 1999 */ { MAD_F(0x0625d9f9) /* 0.384241080 */, 16 }, - - /* 2000 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 16 }, - /* 2001 */ { MAD_F(0x0627f38a) /* 0.384753744 */, 16 }, - /* 2002 */ { MAD_F(0x06290064) /* 0.385010139 */, 16 }, - /* 2003 */ { MAD_F(0x062a0d49) /* 0.385266578 */, 16 }, - /* 2004 */ { MAD_F(0x062b1a3a) /* 0.385523059 */, 16 }, - /* 2005 */ { MAD_F(0x062c2736) /* 0.385779582 */, 16 }, - /* 2006 */ { MAD_F(0x062d343d) /* 0.386036149 */, 16 }, - /* 2007 */ { MAD_F(0x062e4150) /* 0.386292758 */, 16 }, - /* 2008 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 16 }, - /* 2009 */ { MAD_F(0x06305b99) /* 0.386806104 */, 16 }, - /* 2010 */ { MAD_F(0x063168ce) /* 0.387062840 */, 16 }, - /* 2011 */ { MAD_F(0x0632760f) /* 0.387319620 */, 16 }, - /* 2012 */ { MAD_F(0x0633835b) /* 0.387576442 */, 16 }, - /* 2013 */ { MAD_F(0x063490b2) /* 0.387833306 */, 16 }, - /* 2014 */ { MAD_F(0x06359e15) /* 0.388090213 */, 16 }, - /* 2015 */ { MAD_F(0x0636ab83) /* 0.388347163 */, 16 }, - - /* 2016 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 16 }, - /* 2017 */ { MAD_F(0x0638c682) /* 0.388861190 */, 16 }, - /* 2018 */ { MAD_F(0x0639d413) /* 0.389118267 */, 16 }, - /* 2019 */ { MAD_F(0x063ae1af) /* 0.389375386 */, 16 }, - /* 2020 */ { MAD_F(0x063bef56) /* 0.389632548 */, 16 }, - /* 2021 */ { MAD_F(0x063cfd09) /* 0.389889752 */, 16 }, - /* 2022 */ { MAD_F(0x063e0ac7) /* 0.390146999 */, 16 }, - /* 2023 */ { MAD_F(0x063f1891) /* 0.390404289 */, 16 }, - /* 2024 */ { MAD_F(0x06402666) /* 0.390661620 */, 16 }, - /* 2025 */ { MAD_F(0x06413446) /* 0.390918994 */, 16 }, - /* 2026 */ { MAD_F(0x06424232) /* 0.391176411 */, 16 }, - /* 2027 */ { MAD_F(0x06435029) /* 0.391433869 */, 16 }, - /* 2028 */ { MAD_F(0x06445e2b) /* 0.391691371 */, 16 }, - /* 2029 */ { MAD_F(0x06456c39) /* 0.391948914 */, 16 }, - /* 2030 */ { MAD_F(0x06467a52) /* 0.392206500 */, 16 }, - /* 2031 */ { MAD_F(0x06478877) /* 0.392464128 */, 16 }, - - /* 2032 */ { MAD_F(0x064896a7) /* 0.392721798 */, 16 }, - /* 2033 */ { MAD_F(0x0649a4e2) /* 0.392979511 */, 16 }, - /* 2034 */ { MAD_F(0x064ab328) /* 0.393237266 */, 16 }, - /* 2035 */ { MAD_F(0x064bc17a) /* 0.393495063 */, 16 }, - /* 2036 */ { MAD_F(0x064ccfd8) /* 0.393752902 */, 16 }, - /* 2037 */ { MAD_F(0x064dde40) /* 0.394010784 */, 16 }, - /* 2038 */ { MAD_F(0x064eecb4) /* 0.394268707 */, 16 }, - /* 2039 */ { MAD_F(0x064ffb33) /* 0.394526673 */, 16 }, - /* 2040 */ { MAD_F(0x065109be) /* 0.394784681 */, 16 }, - /* 2041 */ { MAD_F(0x06521854) /* 0.395042732 */, 16 }, - /* 2042 */ { MAD_F(0x065326f5) /* 0.395300824 */, 16 }, - /* 2043 */ { MAD_F(0x065435a1) /* 0.395558959 */, 16 }, - /* 2044 */ { MAD_F(0x06554459) /* 0.395817135 */, 16 }, - /* 2045 */ { MAD_F(0x0656531c) /* 0.396075354 */, 16 }, - /* 2046 */ { MAD_F(0x065761ea) /* 0.396333615 */, 16 }, - /* 2047 */ { MAD_F(0x065870c4) /* 0.396591918 */, 16 }, - - /* 2048 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 16 }, - /* 2049 */ { MAD_F(0x065a8e99) /* 0.397108650 */, 16 }, - /* 2050 */ { MAD_F(0x065b9d95) /* 0.397367079 */, 16 }, - /* 2051 */ { MAD_F(0x065cac9c) /* 0.397625550 */, 16 }, - /* 2052 */ { MAD_F(0x065dbbae) /* 0.397884063 */, 16 }, - /* 2053 */ { MAD_F(0x065ecacb) /* 0.398142619 */, 16 }, - /* 2054 */ { MAD_F(0x065fd9f4) /* 0.398401216 */, 16 }, - /* 2055 */ { MAD_F(0x0660e928) /* 0.398659855 */, 16 }, - /* 2056 */ { MAD_F(0x0661f867) /* 0.398918536 */, 16 }, - /* 2057 */ { MAD_F(0x066307b1) /* 0.399177259 */, 16 }, - /* 2058 */ { MAD_F(0x06641707) /* 0.399436024 */, 16 }, - /* 2059 */ { MAD_F(0x06652668) /* 0.399694831 */, 16 }, - /* 2060 */ { MAD_F(0x066635d4) /* 0.399953679 */, 16 }, - /* 2061 */ { MAD_F(0x0667454c) /* 0.400212570 */, 16 }, - /* 2062 */ { MAD_F(0x066854ce) /* 0.400471503 */, 16 }, - /* 2063 */ { MAD_F(0x0669645c) /* 0.400730477 */, 16 }, - - /* 2064 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 16 }, - /* 2065 */ { MAD_F(0x066b839a) /* 0.401248551 */, 16 }, - /* 2066 */ { MAD_F(0x066c9349) /* 0.401507651 */, 16 }, - /* 2067 */ { MAD_F(0x066da304) /* 0.401766793 */, 16 }, - /* 2068 */ { MAD_F(0x066eb2ca) /* 0.402025976 */, 16 }, - /* 2069 */ { MAD_F(0x066fc29b) /* 0.402285202 */, 16 }, - /* 2070 */ { MAD_F(0x0670d278) /* 0.402544469 */, 16 }, - /* 2071 */ { MAD_F(0x0671e25f) /* 0.402803777 */, 16 }, - /* 2072 */ { MAD_F(0x0672f252) /* 0.403063128 */, 16 }, - /* 2073 */ { MAD_F(0x06740250) /* 0.403322520 */, 16 }, - /* 2074 */ { MAD_F(0x0675125a) /* 0.403581954 */, 16 }, - /* 2075 */ { MAD_F(0x0676226e) /* 0.403841430 */, 16 }, - /* 2076 */ { MAD_F(0x0677328e) /* 0.404100947 */, 16 }, - /* 2077 */ { MAD_F(0x067842b9) /* 0.404360506 */, 16 }, - /* 2078 */ { MAD_F(0x067952ef) /* 0.404620107 */, 16 }, - /* 2079 */ { MAD_F(0x067a6330) /* 0.404879749 */, 16 }, - - /* 2080 */ { MAD_F(0x067b737c) /* 0.405139433 */, 16 }, - /* 2081 */ { MAD_F(0x067c83d4) /* 0.405399159 */, 16 }, - /* 2082 */ { MAD_F(0x067d9436) /* 0.405658926 */, 16 }, - /* 2083 */ { MAD_F(0x067ea4a4) /* 0.405918735 */, 16 }, - /* 2084 */ { MAD_F(0x067fb51d) /* 0.406178585 */, 16 }, - /* 2085 */ { MAD_F(0x0680c5a2) /* 0.406438477 */, 16 }, - /* 2086 */ { MAD_F(0x0681d631) /* 0.406698410 */, 16 }, - /* 2087 */ { MAD_F(0x0682e6cb) /* 0.406958385 */, 16 }, - /* 2088 */ { MAD_F(0x0683f771) /* 0.407218402 */, 16 }, - /* 2089 */ { MAD_F(0x06850822) /* 0.407478460 */, 16 }, - /* 2090 */ { MAD_F(0x068618de) /* 0.407738559 */, 16 }, - /* 2091 */ { MAD_F(0x068729a5) /* 0.407998700 */, 16 }, - /* 2092 */ { MAD_F(0x06883a77) /* 0.408258883 */, 16 }, - /* 2093 */ { MAD_F(0x06894b55) /* 0.408519107 */, 16 }, - /* 2094 */ { MAD_F(0x068a5c3d) /* 0.408779372 */, 16 }, - /* 2095 */ { MAD_F(0x068b6d31) /* 0.409039679 */, 16 }, - - /* 2096 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 16 }, - /* 2097 */ { MAD_F(0x068d8f39) /* 0.409560417 */, 16 }, - /* 2098 */ { MAD_F(0x068ea04e) /* 0.409820848 */, 16 }, - /* 2099 */ { MAD_F(0x068fb16e) /* 0.410081321 */, 16 }, - /* 2100 */ { MAD_F(0x0690c299) /* 0.410341834 */, 16 }, - /* 2101 */ { MAD_F(0x0691d3cf) /* 0.410602390 */, 16 }, - /* 2102 */ { MAD_F(0x0692e511) /* 0.410862986 */, 16 }, - /* 2103 */ { MAD_F(0x0693f65d) /* 0.411123624 */, 16 }, - /* 2104 */ { MAD_F(0x069507b5) /* 0.411384303 */, 16 }, - /* 2105 */ { MAD_F(0x06961917) /* 0.411645024 */, 16 }, - /* 2106 */ { MAD_F(0x06972a85) /* 0.411905785 */, 16 }, - /* 2107 */ { MAD_F(0x06983bfe) /* 0.412166588 */, 16 }, - /* 2108 */ { MAD_F(0x06994d82) /* 0.412427433 */, 16 }, - /* 2109 */ { MAD_F(0x069a5f11) /* 0.412688318 */, 16 }, - /* 2110 */ { MAD_F(0x069b70ab) /* 0.412949245 */, 16 }, - /* 2111 */ { MAD_F(0x069c8250) /* 0.413210213 */, 16 }, - - /* 2112 */ { MAD_F(0x069d9400) /* 0.413471222 */, 16 }, - /* 2113 */ { MAD_F(0x069ea5bb) /* 0.413732273 */, 16 }, - /* 2114 */ { MAD_F(0x069fb781) /* 0.413993364 */, 16 }, - /* 2115 */ { MAD_F(0x06a0c953) /* 0.414254497 */, 16 }, - /* 2116 */ { MAD_F(0x06a1db2f) /* 0.414515671 */, 16 }, - /* 2117 */ { MAD_F(0x06a2ed16) /* 0.414776886 */, 16 }, - /* 2118 */ { MAD_F(0x06a3ff09) /* 0.415038142 */, 16 }, - /* 2119 */ { MAD_F(0x06a51106) /* 0.415299440 */, 16 }, - /* 2120 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 16 }, - /* 2121 */ { MAD_F(0x06a73522) /* 0.415822157 */, 16 }, - /* 2122 */ { MAD_F(0x06a84741) /* 0.416083578 */, 16 }, - /* 2123 */ { MAD_F(0x06a9596a) /* 0.416345040 */, 16 }, - /* 2124 */ { MAD_F(0x06aa6b9f) /* 0.416606542 */, 16 }, - /* 2125 */ { MAD_F(0x06ab7ddf) /* 0.416868086 */, 16 }, - /* 2126 */ { MAD_F(0x06ac9029) /* 0.417129671 */, 16 }, - /* 2127 */ { MAD_F(0x06ada27f) /* 0.417391297 */, 16 }, - - /* 2128 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 16 }, - /* 2129 */ { MAD_F(0x06afc74b) /* 0.417914672 */, 16 }, - /* 2130 */ { MAD_F(0x06b0d9c2) /* 0.418176420 */, 16 }, - /* 2131 */ { MAD_F(0x06b1ec43) /* 0.418438210 */, 16 }, - /* 2132 */ { MAD_F(0x06b2fed0) /* 0.418700041 */, 16 }, - /* 2133 */ { MAD_F(0x06b41168) /* 0.418961912 */, 16 }, - /* 2134 */ { MAD_F(0x06b5240a) /* 0.419223825 */, 16 }, - /* 2135 */ { MAD_F(0x06b636b8) /* 0.419485778 */, 16 }, - /* 2136 */ { MAD_F(0x06b74971) /* 0.419747773 */, 16 }, - /* 2137 */ { MAD_F(0x06b85c34) /* 0.420009808 */, 16 }, - /* 2138 */ { MAD_F(0x06b96f03) /* 0.420271884 */, 16 }, - /* 2139 */ { MAD_F(0x06ba81dc) /* 0.420534001 */, 16 }, - /* 2140 */ { MAD_F(0x06bb94c1) /* 0.420796159 */, 16 }, - /* 2141 */ { MAD_F(0x06bca7b0) /* 0.421058358 */, 16 }, - /* 2142 */ { MAD_F(0x06bdbaaa) /* 0.421320597 */, 16 }, - /* 2143 */ { MAD_F(0x06becdb0) /* 0.421582878 */, 16 }, - - /* 2144 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 16 }, - /* 2145 */ { MAD_F(0x06c0f3db) /* 0.422107561 */, 16 }, - /* 2146 */ { MAD_F(0x06c20702) /* 0.422369964 */, 16 }, - /* 2147 */ { MAD_F(0x06c31a33) /* 0.422632407 */, 16 }, - /* 2148 */ { MAD_F(0x06c42d6f) /* 0.422894891 */, 16 }, - /* 2149 */ { MAD_F(0x06c540b6) /* 0.423157416 */, 16 }, - /* 2150 */ { MAD_F(0x06c65408) /* 0.423419982 */, 16 }, - /* 2151 */ { MAD_F(0x06c76765) /* 0.423682588 */, 16 }, - /* 2152 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 16 }, - /* 2153 */ { MAD_F(0x06c98e3f) /* 0.424207923 */, 16 }, - /* 2154 */ { MAD_F(0x06caa1bd) /* 0.424470652 */, 16 }, - /* 2155 */ { MAD_F(0x06cbb545) /* 0.424733421 */, 16 }, - /* 2156 */ { MAD_F(0x06ccc8d9) /* 0.424996230 */, 16 }, - /* 2157 */ { MAD_F(0x06cddc77) /* 0.425259081 */, 16 }, - /* 2158 */ { MAD_F(0x06cef020) /* 0.425521972 */, 16 }, - /* 2159 */ { MAD_F(0x06d003d4) /* 0.425784903 */, 16 }, - - /* 2160 */ { MAD_F(0x06d11794) /* 0.426047876 */, 16 }, - /* 2161 */ { MAD_F(0x06d22b5e) /* 0.426310889 */, 16 }, - /* 2162 */ { MAD_F(0x06d33f32) /* 0.426573942 */, 16 }, - /* 2163 */ { MAD_F(0x06d45312) /* 0.426837036 */, 16 }, - /* 2164 */ { MAD_F(0x06d566fd) /* 0.427100170 */, 16 }, - /* 2165 */ { MAD_F(0x06d67af2) /* 0.427363345 */, 16 }, - /* 2166 */ { MAD_F(0x06d78ef3) /* 0.427626561 */, 16 }, - /* 2167 */ { MAD_F(0x06d8a2fe) /* 0.427889817 */, 16 }, - /* 2168 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 16 }, - /* 2169 */ { MAD_F(0x06dacb35) /* 0.428416451 */, 16 }, - /* 2170 */ { MAD_F(0x06dbdf61) /* 0.428679828 */, 16 }, - /* 2171 */ { MAD_F(0x06dcf398) /* 0.428943246 */, 16 }, - /* 2172 */ { MAD_F(0x06de07d9) /* 0.429206704 */, 16 }, - /* 2173 */ { MAD_F(0x06df1c26) /* 0.429470203 */, 16 }, - /* 2174 */ { MAD_F(0x06e0307d) /* 0.429733743 */, 16 }, - /* 2175 */ { MAD_F(0x06e144df) /* 0.429997322 */, 16 }, - - /* 2176 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 16 }, - /* 2177 */ { MAD_F(0x06e36dc4) /* 0.430524603 */, 16 }, - /* 2178 */ { MAD_F(0x06e48246) /* 0.430788304 */, 16 }, - /* 2179 */ { MAD_F(0x06e596d4) /* 0.431052045 */, 16 }, - /* 2180 */ { MAD_F(0x06e6ab6c) /* 0.431315826 */, 16 }, - /* 2181 */ { MAD_F(0x06e7c00f) /* 0.431579648 */, 16 }, - /* 2182 */ { MAD_F(0x06e8d4bd) /* 0.431843511 */, 16 }, - /* 2183 */ { MAD_F(0x06e9e976) /* 0.432107413 */, 16 }, - /* 2184 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 16 }, - /* 2185 */ { MAD_F(0x06ec1308) /* 0.432635339 */, 16 }, - /* 2186 */ { MAD_F(0x06ed27e2) /* 0.432899362 */, 16 }, - /* 2187 */ { MAD_F(0x06ee3cc6) /* 0.433163426 */, 16 }, - /* 2188 */ { MAD_F(0x06ef51b4) /* 0.433427530 */, 16 }, - /* 2189 */ { MAD_F(0x06f066ae) /* 0.433691674 */, 16 }, - /* 2190 */ { MAD_F(0x06f17bb3) /* 0.433955859 */, 16 }, - /* 2191 */ { MAD_F(0x06f290c2) /* 0.434220083 */, 16 }, - - /* 2192 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 16 }, - /* 2193 */ { MAD_F(0x06f4bb01) /* 0.434748653 */, 16 }, - /* 2194 */ { MAD_F(0x06f5d030) /* 0.435012998 */, 16 }, - /* 2195 */ { MAD_F(0x06f6e56b) /* 0.435277383 */, 16 }, - /* 2196 */ { MAD_F(0x06f7fab0) /* 0.435541809 */, 16 }, - /* 2197 */ { MAD_F(0x06f91000) /* 0.435806274 */, 16 }, - /* 2198 */ { MAD_F(0x06fa255a) /* 0.436070780 */, 16 }, - /* 2199 */ { MAD_F(0x06fb3ac0) /* 0.436335326 */, 16 }, - /* 2200 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 16 }, - /* 2201 */ { MAD_F(0x06fd65ab) /* 0.436864538 */, 16 }, - /* 2202 */ { MAD_F(0x06fe7b31) /* 0.437129204 */, 16 }, - /* 2203 */ { MAD_F(0x06ff90c2) /* 0.437393910 */, 16 }, - /* 2204 */ { MAD_F(0x0700a65d) /* 0.437658657 */, 16 }, - /* 2205 */ { MAD_F(0x0701bc03) /* 0.437923443 */, 16 }, - /* 2206 */ { MAD_F(0x0702d1b4) /* 0.438188269 */, 16 }, - /* 2207 */ { MAD_F(0x0703e76f) /* 0.438453136 */, 16 }, - - /* 2208 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 16 }, - /* 2209 */ { MAD_F(0x07061306) /* 0.438982988 */, 16 }, - /* 2210 */ { MAD_F(0x070728e2) /* 0.439247975 */, 16 }, - /* 2211 */ { MAD_F(0x07083ec9) /* 0.439513001 */, 16 }, - /* 2212 */ { MAD_F(0x070954ba) /* 0.439778067 */, 16 }, - /* 2213 */ { MAD_F(0x070a6ab6) /* 0.440043173 */, 16 }, - /* 2214 */ { MAD_F(0x070b80bc) /* 0.440308320 */, 16 }, - /* 2215 */ { MAD_F(0x070c96ce) /* 0.440573506 */, 16 }, - /* 2216 */ { MAD_F(0x070dacea) /* 0.440838732 */, 16 }, - /* 2217 */ { MAD_F(0x070ec310) /* 0.441103997 */, 16 }, - /* 2218 */ { MAD_F(0x070fd942) /* 0.441369303 */, 16 }, - /* 2219 */ { MAD_F(0x0710ef7e) /* 0.441634649 */, 16 }, - /* 2220 */ { MAD_F(0x071205c5) /* 0.441900034 */, 16 }, - /* 2221 */ { MAD_F(0x07131c17) /* 0.442165460 */, 16 }, - /* 2222 */ { MAD_F(0x07143273) /* 0.442430925 */, 16 }, - /* 2223 */ { MAD_F(0x071548da) /* 0.442696430 */, 16 }, - - /* 2224 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 16 }, - /* 2225 */ { MAD_F(0x071775c8) /* 0.443227559 */, 16 }, - /* 2226 */ { MAD_F(0x07188c4f) /* 0.443493184 */, 16 }, - /* 2227 */ { MAD_F(0x0719a2e0) /* 0.443758848 */, 16 }, - /* 2228 */ { MAD_F(0x071ab97d) /* 0.444024552 */, 16 }, - /* 2229 */ { MAD_F(0x071bd024) /* 0.444290296 */, 16 }, - /* 2230 */ { MAD_F(0x071ce6d6) /* 0.444556079 */, 16 }, - /* 2231 */ { MAD_F(0x071dfd92) /* 0.444821902 */, 16 }, - /* 2232 */ { MAD_F(0x071f1459) /* 0.445087765 */, 16 }, - /* 2233 */ { MAD_F(0x07202b2b) /* 0.445353668 */, 16 }, - /* 2234 */ { MAD_F(0x07214207) /* 0.445619610 */, 16 }, - /* 2235 */ { MAD_F(0x072258ee) /* 0.445885592 */, 16 }, - /* 2236 */ { MAD_F(0x07236fe0) /* 0.446151614 */, 16 }, - /* 2237 */ { MAD_F(0x072486dc) /* 0.446417675 */, 16 }, - /* 2238 */ { MAD_F(0x07259de3) /* 0.446683776 */, 16 }, - /* 2239 */ { MAD_F(0x0726b4f4) /* 0.446949917 */, 16 }, - - /* 2240 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 16 }, - /* 2241 */ { MAD_F(0x0728e338) /* 0.447482317 */, 16 }, - /* 2242 */ { MAD_F(0x0729fa69) /* 0.447748576 */, 16 }, - /* 2243 */ { MAD_F(0x072b11a5) /* 0.448014875 */, 16 }, - /* 2244 */ { MAD_F(0x072c28ec) /* 0.448281214 */, 16 }, - /* 2245 */ { MAD_F(0x072d403d) /* 0.448547592 */, 16 }, - /* 2246 */ { MAD_F(0x072e5799) /* 0.448814010 */, 16 }, - /* 2247 */ { MAD_F(0x072f6f00) /* 0.449080467 */, 16 }, - /* 2248 */ { MAD_F(0x07308671) /* 0.449346964 */, 16 }, - /* 2249 */ { MAD_F(0x07319ded) /* 0.449613501 */, 16 }, - /* 2250 */ { MAD_F(0x0732b573) /* 0.449880076 */, 16 }, - /* 2251 */ { MAD_F(0x0733cd04) /* 0.450146692 */, 16 }, - /* 2252 */ { MAD_F(0x0734e4a0) /* 0.450413347 */, 16 }, - /* 2253 */ { MAD_F(0x0735fc46) /* 0.450680041 */, 16 }, - /* 2254 */ { MAD_F(0x073713f7) /* 0.450946775 */, 16 }, - /* 2255 */ { MAD_F(0x07382bb2) /* 0.451213548 */, 16 }, - - /* 2256 */ { MAD_F(0x07394378) /* 0.451480360 */, 16 }, - /* 2257 */ { MAD_F(0x073a5b49) /* 0.451747213 */, 16 }, - /* 2258 */ { MAD_F(0x073b7324) /* 0.452014104 */, 16 }, - /* 2259 */ { MAD_F(0x073c8b0a) /* 0.452281035 */, 16 }, - /* 2260 */ { MAD_F(0x073da2fa) /* 0.452548005 */, 16 }, - /* 2261 */ { MAD_F(0x073ebaf5) /* 0.452815015 */, 16 }, - /* 2262 */ { MAD_F(0x073fd2fa) /* 0.453082064 */, 16 }, - /* 2263 */ { MAD_F(0x0740eb0a) /* 0.453349152 */, 16 }, - /* 2264 */ { MAD_F(0x07420325) /* 0.453616280 */, 16 }, - /* 2265 */ { MAD_F(0x07431b4a) /* 0.453883447 */, 16 }, - /* 2266 */ { MAD_F(0x0744337a) /* 0.454150653 */, 16 }, - /* 2267 */ { MAD_F(0x07454bb4) /* 0.454417899 */, 16 }, - /* 2268 */ { MAD_F(0x074663f8) /* 0.454685184 */, 16 }, - /* 2269 */ { MAD_F(0x07477c48) /* 0.454952508 */, 16 }, - /* 2270 */ { MAD_F(0x074894a2) /* 0.455219872 */, 16 }, - /* 2271 */ { MAD_F(0x0749ad06) /* 0.455487275 */, 16 }, - - /* 2272 */ { MAD_F(0x074ac575) /* 0.455754717 */, 16 }, - /* 2273 */ { MAD_F(0x074bddee) /* 0.456022198 */, 16 }, - /* 2274 */ { MAD_F(0x074cf672) /* 0.456289719 */, 16 }, - /* 2275 */ { MAD_F(0x074e0f01) /* 0.456557278 */, 16 }, - /* 2276 */ { MAD_F(0x074f279a) /* 0.456824877 */, 16 }, - /* 2277 */ { MAD_F(0x0750403e) /* 0.457092516 */, 16 }, - /* 2278 */ { MAD_F(0x075158ec) /* 0.457360193 */, 16 }, - /* 2279 */ { MAD_F(0x075271a4) /* 0.457627909 */, 16 }, - /* 2280 */ { MAD_F(0x07538a67) /* 0.457895665 */, 16 }, - /* 2281 */ { MAD_F(0x0754a335) /* 0.458163460 */, 16 }, - /* 2282 */ { MAD_F(0x0755bc0d) /* 0.458431294 */, 16 }, - /* 2283 */ { MAD_F(0x0756d4f0) /* 0.458699167 */, 16 }, - /* 2284 */ { MAD_F(0x0757eddd) /* 0.458967079 */, 16 }, - /* 2285 */ { MAD_F(0x075906d5) /* 0.459235030 */, 16 }, - /* 2286 */ { MAD_F(0x075a1fd7) /* 0.459503021 */, 16 }, - /* 2287 */ { MAD_F(0x075b38e3) /* 0.459771050 */, 16 }, - - /* 2288 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 16 }, - /* 2289 */ { MAD_F(0x075d6b1c) /* 0.460307226 */, 16 }, - /* 2290 */ { MAD_F(0x075e8448) /* 0.460575373 */, 16 }, - /* 2291 */ { MAD_F(0x075f9d7f) /* 0.460843559 */, 16 }, - /* 2292 */ { MAD_F(0x0760b6c0) /* 0.461111783 */, 16 }, - /* 2293 */ { MAD_F(0x0761d00b) /* 0.461380047 */, 16 }, - /* 2294 */ { MAD_F(0x0762e961) /* 0.461648350 */, 16 }, - /* 2295 */ { MAD_F(0x076402c1) /* 0.461916691 */, 16 }, - /* 2296 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 16 }, - /* 2297 */ { MAD_F(0x076635a2) /* 0.462453492 */, 16 }, - /* 2298 */ { MAD_F(0x07674f22) /* 0.462721950 */, 16 }, - /* 2299 */ { MAD_F(0x076868ac) /* 0.462990448 */, 16 }, - /* 2300 */ { MAD_F(0x07698240) /* 0.463258984 */, 16 }, - /* 2301 */ { MAD_F(0x076a9be0) /* 0.463527560 */, 16 }, - /* 2302 */ { MAD_F(0x076bb589) /* 0.463796174 */, 16 }, - /* 2303 */ { MAD_F(0x076ccf3d) /* 0.464064827 */, 16 }, - - /* 2304 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 16 }, - /* 2305 */ { MAD_F(0x076f02c5) /* 0.464602250 */, 16 }, - /* 2306 */ { MAD_F(0x07701c98) /* 0.464871020 */, 16 }, - /* 2307 */ { MAD_F(0x07713676) /* 0.465139829 */, 16 }, - /* 2308 */ { MAD_F(0x0772505e) /* 0.465408676 */, 16 }, - /* 2309 */ { MAD_F(0x07736a51) /* 0.465677563 */, 16 }, - /* 2310 */ { MAD_F(0x0774844e) /* 0.465946488 */, 16 }, - /* 2311 */ { MAD_F(0x07759e55) /* 0.466215452 */, 16 }, - /* 2312 */ { MAD_F(0x0776b867) /* 0.466484455 */, 16 }, - /* 2313 */ { MAD_F(0x0777d283) /* 0.466753496 */, 16 }, - /* 2314 */ { MAD_F(0x0778ecaa) /* 0.467022577 */, 16 }, - /* 2315 */ { MAD_F(0x077a06db) /* 0.467291696 */, 16 }, - /* 2316 */ { MAD_F(0x077b2117) /* 0.467560854 */, 16 }, - /* 2317 */ { MAD_F(0x077c3b5d) /* 0.467830050 */, 16 }, - /* 2318 */ { MAD_F(0x077d55ad) /* 0.468099285 */, 16 }, - /* 2319 */ { MAD_F(0x077e7008) /* 0.468368560 */, 16 }, - - /* 2320 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 16 }, - /* 2321 */ { MAD_F(0x0780a4dc) /* 0.468907224 */, 16 }, - /* 2322 */ { MAD_F(0x0781bf56) /* 0.469176614 */, 16 }, - /* 2323 */ { MAD_F(0x0782d9da) /* 0.469446043 */, 16 }, - /* 2324 */ { MAD_F(0x0783f469) /* 0.469715510 */, 16 }, - /* 2325 */ { MAD_F(0x07850f02) /* 0.469985016 */, 16 }, - /* 2326 */ { MAD_F(0x078629a5) /* 0.470254561 */, 16 }, - /* 2327 */ { MAD_F(0x07874453) /* 0.470524145 */, 16 }, - /* 2328 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 16 }, - /* 2329 */ { MAD_F(0x078979ce) /* 0.471063427 */, 16 }, - /* 2330 */ { MAD_F(0x078a949a) /* 0.471333126 */, 16 }, - /* 2331 */ { MAD_F(0x078baf72) /* 0.471602864 */, 16 }, - /* 2332 */ { MAD_F(0x078cca53) /* 0.471872641 */, 16 }, - /* 2333 */ { MAD_F(0x078de53f) /* 0.472142456 */, 16 }, - /* 2334 */ { MAD_F(0x078f0035) /* 0.472412309 */, 16 }, - /* 2335 */ { MAD_F(0x07901b36) /* 0.472682201 */, 16 }, - - /* 2336 */ { MAD_F(0x07913641) /* 0.472952132 */, 16 }, - /* 2337 */ { MAD_F(0x07925156) /* 0.473222101 */, 16 }, - /* 2338 */ { MAD_F(0x07936c76) /* 0.473492108 */, 16 }, - /* 2339 */ { MAD_F(0x079487a0) /* 0.473762155 */, 16 }, - /* 2340 */ { MAD_F(0x0795a2d4) /* 0.474032239 */, 16 }, - /* 2341 */ { MAD_F(0x0796be13) /* 0.474302362 */, 16 }, - /* 2342 */ { MAD_F(0x0797d95c) /* 0.474572524 */, 16 }, - /* 2343 */ { MAD_F(0x0798f4af) /* 0.474842724 */, 16 }, - /* 2344 */ { MAD_F(0x079a100c) /* 0.475112962 */, 16 }, - /* 2345 */ { MAD_F(0x079b2b74) /* 0.475383239 */, 16 }, - /* 2346 */ { MAD_F(0x079c46e7) /* 0.475653554 */, 16 }, - /* 2347 */ { MAD_F(0x079d6263) /* 0.475923908 */, 16 }, - /* 2348 */ { MAD_F(0x079e7dea) /* 0.476194300 */, 16 }, - /* 2349 */ { MAD_F(0x079f997b) /* 0.476464731 */, 16 }, - /* 2350 */ { MAD_F(0x07a0b516) /* 0.476735200 */, 16 }, - /* 2351 */ { MAD_F(0x07a1d0bc) /* 0.477005707 */, 16 }, - - /* 2352 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 16 }, - /* 2353 */ { MAD_F(0x07a40827) /* 0.477546836 */, 16 }, - /* 2354 */ { MAD_F(0x07a523eb) /* 0.477817459 */, 16 }, - /* 2355 */ { MAD_F(0x07a63fba) /* 0.478088119 */, 16 }, - /* 2356 */ { MAD_F(0x07a75b93) /* 0.478358818 */, 16 }, - /* 2357 */ { MAD_F(0x07a87777) /* 0.478629555 */, 16 }, - /* 2358 */ { MAD_F(0x07a99364) /* 0.478900331 */, 16 }, - /* 2359 */ { MAD_F(0x07aaaf5c) /* 0.479171145 */, 16 }, - /* 2360 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 16 }, - /* 2361 */ { MAD_F(0x07ace76b) /* 0.479712887 */, 16 }, - /* 2362 */ { MAD_F(0x07ae0382) /* 0.479983816 */, 16 }, - /* 2363 */ { MAD_F(0x07af1fa3) /* 0.480254782 */, 16 }, - /* 2364 */ { MAD_F(0x07b03bcf) /* 0.480525787 */, 16 }, - /* 2365 */ { MAD_F(0x07b15804) /* 0.480796831 */, 16 }, - /* 2366 */ { MAD_F(0x07b27444) /* 0.481067912 */, 16 }, - /* 2367 */ { MAD_F(0x07b3908e) /* 0.481339032 */, 16 }, - - /* 2368 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 16 }, - /* 2369 */ { MAD_F(0x07b5c941) /* 0.481881385 */, 16 }, - /* 2370 */ { MAD_F(0x07b6e5aa) /* 0.482152620 */, 16 }, - /* 2371 */ { MAD_F(0x07b8021d) /* 0.482423892 */, 16 }, - /* 2372 */ { MAD_F(0x07b91e9b) /* 0.482695202 */, 16 }, - /* 2373 */ { MAD_F(0x07ba3b22) /* 0.482966551 */, 16 }, - /* 2374 */ { MAD_F(0x07bb57b4) /* 0.483237938 */, 16 }, - /* 2375 */ { MAD_F(0x07bc7450) /* 0.483509362 */, 16 }, - /* 2376 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 16 }, - /* 2377 */ { MAD_F(0x07beada7) /* 0.484052326 */, 16 }, - /* 2378 */ { MAD_F(0x07bfca61) /* 0.484323865 */, 16 }, - /* 2379 */ { MAD_F(0x07c0e726) /* 0.484595443 */, 16 }, - /* 2380 */ { MAD_F(0x07c203f5) /* 0.484867058 */, 16 }, - /* 2381 */ { MAD_F(0x07c320cf) /* 0.485138711 */, 16 }, - /* 2382 */ { MAD_F(0x07c43db2) /* 0.485410402 */, 16 }, - /* 2383 */ { MAD_F(0x07c55aa0) /* 0.485682131 */, 16 }, - - /* 2384 */ { MAD_F(0x07c67798) /* 0.485953899 */, 16 }, - /* 2385 */ { MAD_F(0x07c7949a) /* 0.486225704 */, 16 }, - /* 2386 */ { MAD_F(0x07c8b1a7) /* 0.486497547 */, 16 }, - /* 2387 */ { MAD_F(0x07c9cebd) /* 0.486769429 */, 16 }, - /* 2388 */ { MAD_F(0x07caebde) /* 0.487041348 */, 16 }, - /* 2389 */ { MAD_F(0x07cc0909) /* 0.487313305 */, 16 }, - /* 2390 */ { MAD_F(0x07cd263e) /* 0.487585300 */, 16 }, - /* 2391 */ { MAD_F(0x07ce437d) /* 0.487857333 */, 16 }, - /* 2392 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 16 }, - /* 2393 */ { MAD_F(0x07d07e1b) /* 0.488401513 */, 16 }, - /* 2394 */ { MAD_F(0x07d19b79) /* 0.488673660 */, 16 }, - /* 2395 */ { MAD_F(0x07d2b8e1) /* 0.488945845 */, 16 }, - /* 2396 */ { MAD_F(0x07d3d653) /* 0.489218067 */, 16 }, - /* 2397 */ { MAD_F(0x07d4f3cf) /* 0.489490328 */, 16 }, - /* 2398 */ { MAD_F(0x07d61156) /* 0.489762626 */, 16 }, - /* 2399 */ { MAD_F(0x07d72ee6) /* 0.490034962 */, 16 }, - - /* 2400 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 16 }, - /* 2401 */ { MAD_F(0x07d96a26) /* 0.490579748 */, 16 }, - /* 2402 */ { MAD_F(0x07da87d5) /* 0.490852198 */, 16 }, - /* 2403 */ { MAD_F(0x07dba58f) /* 0.491124686 */, 16 }, - /* 2404 */ { MAD_F(0x07dcc352) /* 0.491397211 */, 16 }, - /* 2405 */ { MAD_F(0x07dde120) /* 0.491669774 */, 16 }, - /* 2406 */ { MAD_F(0x07defef7) /* 0.491942375 */, 16 }, - /* 2407 */ { MAD_F(0x07e01cd9) /* 0.492215014 */, 16 }, - /* 2408 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 16 }, - /* 2409 */ { MAD_F(0x07e258bc) /* 0.492760404 */, 16 }, - /* 2410 */ { MAD_F(0x07e376bc) /* 0.493033156 */, 16 }, - /* 2411 */ { MAD_F(0x07e494c6) /* 0.493305946 */, 16 }, - /* 2412 */ { MAD_F(0x07e5b2db) /* 0.493578773 */, 16 }, - /* 2413 */ { MAD_F(0x07e6d0f9) /* 0.493851638 */, 16 }, - /* 2414 */ { MAD_F(0x07e7ef22) /* 0.494124541 */, 16 }, - /* 2415 */ { MAD_F(0x07e90d55) /* 0.494397481 */, 16 }, - - /* 2416 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 16 }, - /* 2417 */ { MAD_F(0x07eb49d9) /* 0.494943475 */, 16 }, - /* 2418 */ { MAD_F(0x07ec682a) /* 0.495216529 */, 16 }, - /* 2419 */ { MAD_F(0x07ed8686) /* 0.495489620 */, 16 }, - /* 2420 */ { MAD_F(0x07eea4eb) /* 0.495762748 */, 16 }, - /* 2421 */ { MAD_F(0x07efc35b) /* 0.496035915 */, 16 }, - /* 2422 */ { MAD_F(0x07f0e1d4) /* 0.496309119 */, 16 }, - /* 2423 */ { MAD_F(0x07f20058) /* 0.496582360 */, 16 }, - /* 2424 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 16 }, - /* 2425 */ { MAD_F(0x07f43d7e) /* 0.497128956 */, 16 }, - /* 2426 */ { MAD_F(0x07f55c20) /* 0.497402310 */, 16 }, - /* 2427 */ { MAD_F(0x07f67acc) /* 0.497675702 */, 16 }, - /* 2428 */ { MAD_F(0x07f79982) /* 0.497949132 */, 16 }, - /* 2429 */ { MAD_F(0x07f8b842) /* 0.498222598 */, 16 }, - /* 2430 */ { MAD_F(0x07f9d70c) /* 0.498496103 */, 16 }, - /* 2431 */ { MAD_F(0x07faf5e1) /* 0.498769645 */, 16 }, - - /* 2432 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 16 }, - /* 2433 */ { MAD_F(0x07fd33a8) /* 0.499316841 */, 16 }, - /* 2434 */ { MAD_F(0x07fe529a) /* 0.499590496 */, 16 }, - /* 2435 */ { MAD_F(0x07ff7197) /* 0.499864188 */, 16 }, - /* 2436 */ { MAD_F(0x0400484f) /* 0.250068959 */, 17 }, - /* 2437 */ { MAD_F(0x0400d7d7) /* 0.250205842 */, 17 }, - /* 2438 */ { MAD_F(0x04016764) /* 0.250342744 */, 17 }, - /* 2439 */ { MAD_F(0x0401f6f7) /* 0.250479665 */, 17 }, - /* 2440 */ { MAD_F(0x0402868e) /* 0.250616605 */, 17 }, - /* 2441 */ { MAD_F(0x0403162b) /* 0.250753563 */, 17 }, - /* 2442 */ { MAD_F(0x0403a5cc) /* 0.250890540 */, 17 }, - /* 2443 */ { MAD_F(0x04043573) /* 0.251027536 */, 17 }, - /* 2444 */ { MAD_F(0x0404c51e) /* 0.251164550 */, 17 }, - /* 2445 */ { MAD_F(0x040554cf) /* 0.251301583 */, 17 }, - /* 2446 */ { MAD_F(0x0405e484) /* 0.251438635 */, 17 }, - /* 2447 */ { MAD_F(0x0406743f) /* 0.251575706 */, 17 }, - - /* 2448 */ { MAD_F(0x040703ff) /* 0.251712795 */, 17 }, - /* 2449 */ { MAD_F(0x040793c3) /* 0.251849903 */, 17 }, - /* 2450 */ { MAD_F(0x0408238d) /* 0.251987029 */, 17 }, - /* 2451 */ { MAD_F(0x0408b35b) /* 0.252124174 */, 17 }, - /* 2452 */ { MAD_F(0x0409432f) /* 0.252261338 */, 17 }, - /* 2453 */ { MAD_F(0x0409d308) /* 0.252398520 */, 17 }, - /* 2454 */ { MAD_F(0x040a62e5) /* 0.252535721 */, 17 }, - /* 2455 */ { MAD_F(0x040af2c8) /* 0.252672941 */, 17 }, - /* 2456 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 17 }, - /* 2457 */ { MAD_F(0x040c129c) /* 0.252947436 */, 17 }, - /* 2458 */ { MAD_F(0x040ca28e) /* 0.253084712 */, 17 }, - /* 2459 */ { MAD_F(0x040d3284) /* 0.253222006 */, 17 }, - /* 2460 */ { MAD_F(0x040dc280) /* 0.253359319 */, 17 }, - /* 2461 */ { MAD_F(0x040e5281) /* 0.253496651 */, 17 }, - /* 2462 */ { MAD_F(0x040ee286) /* 0.253634001 */, 17 }, - /* 2463 */ { MAD_F(0x040f7291) /* 0.253771369 */, 17 }, - - /* 2464 */ { MAD_F(0x041002a1) /* 0.253908756 */, 17 }, - /* 2465 */ { MAD_F(0x041092b5) /* 0.254046162 */, 17 }, - /* 2466 */ { MAD_F(0x041122cf) /* 0.254183587 */, 17 }, - /* 2467 */ { MAD_F(0x0411b2ed) /* 0.254321030 */, 17 }, - /* 2468 */ { MAD_F(0x04124311) /* 0.254458491 */, 17 }, - /* 2469 */ { MAD_F(0x0412d339) /* 0.254595971 */, 17 }, - /* 2470 */ { MAD_F(0x04136367) /* 0.254733470 */, 17 }, - /* 2471 */ { MAD_F(0x0413f399) /* 0.254870987 */, 17 }, - /* 2472 */ { MAD_F(0x041483d1) /* 0.255008523 */, 17 }, - /* 2473 */ { MAD_F(0x0415140d) /* 0.255146077 */, 17 }, - /* 2474 */ { MAD_F(0x0415a44f) /* 0.255283650 */, 17 }, - /* 2475 */ { MAD_F(0x04163495) /* 0.255421241 */, 17 }, - /* 2476 */ { MAD_F(0x0416c4e1) /* 0.255558851 */, 17 }, - /* 2477 */ { MAD_F(0x04175531) /* 0.255696480 */, 17 }, - /* 2478 */ { MAD_F(0x0417e586) /* 0.255834127 */, 17 }, - /* 2479 */ { MAD_F(0x041875e1) /* 0.255971792 */, 17 }, - - /* 2480 */ { MAD_F(0x04190640) /* 0.256109476 */, 17 }, - /* 2481 */ { MAD_F(0x041996a4) /* 0.256247179 */, 17 }, - /* 2482 */ { MAD_F(0x041a270d) /* 0.256384900 */, 17 }, - /* 2483 */ { MAD_F(0x041ab77b) /* 0.256522639 */, 17 }, - /* 2484 */ { MAD_F(0x041b47ef) /* 0.256660397 */, 17 }, - /* 2485 */ { MAD_F(0x041bd867) /* 0.256798174 */, 17 }, - /* 2486 */ { MAD_F(0x041c68e4) /* 0.256935969 */, 17 }, - /* 2487 */ { MAD_F(0x041cf966) /* 0.257073782 */, 17 }, - /* 2488 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 17 }, - /* 2489 */ { MAD_F(0x041e1a79) /* 0.257349465 */, 17 }, - /* 2490 */ { MAD_F(0x041eab0a) /* 0.257487334 */, 17 }, - /* 2491 */ { MAD_F(0x041f3b9f) /* 0.257625221 */, 17 }, - /* 2492 */ { MAD_F(0x041fcc3a) /* 0.257763127 */, 17 }, - /* 2493 */ { MAD_F(0x04205cda) /* 0.257901051 */, 17 }, - /* 2494 */ { MAD_F(0x0420ed7f) /* 0.258038994 */, 17 }, - /* 2495 */ { MAD_F(0x04217e28) /* 0.258176955 */, 17 }, - - /* 2496 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 17 }, - /* 2497 */ { MAD_F(0x04229f8a) /* 0.258452932 */, 17 }, - /* 2498 */ { MAD_F(0x04233043) /* 0.258590948 */, 17 }, - /* 2499 */ { MAD_F(0x0423c100) /* 0.258728983 */, 17 }, - /* 2500 */ { MAD_F(0x042451c3) /* 0.258867036 */, 17 }, - /* 2501 */ { MAD_F(0x0424e28a) /* 0.259005108 */, 17 }, - /* 2502 */ { MAD_F(0x04257356) /* 0.259143198 */, 17 }, - /* 2503 */ { MAD_F(0x04260428) /* 0.259281307 */, 17 }, - /* 2504 */ { MAD_F(0x042694fe) /* 0.259419433 */, 17 }, - /* 2505 */ { MAD_F(0x042725d9) /* 0.259557579 */, 17 }, - /* 2506 */ { MAD_F(0x0427b6b9) /* 0.259695742 */, 17 }, - /* 2507 */ { MAD_F(0x0428479e) /* 0.259833924 */, 17 }, - /* 2508 */ { MAD_F(0x0428d888) /* 0.259972124 */, 17 }, - /* 2509 */ { MAD_F(0x04296976) /* 0.260110343 */, 17 }, - /* 2510 */ { MAD_F(0x0429fa6a) /* 0.260248580 */, 17 }, - /* 2511 */ { MAD_F(0x042a8b63) /* 0.260386836 */, 17 }, - - /* 2512 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 17 }, - /* 2513 */ { MAD_F(0x042bad63) /* 0.260663402 */, 17 }, - /* 2514 */ { MAD_F(0x042c3e6a) /* 0.260801712 */, 17 }, - /* 2515 */ { MAD_F(0x042ccf77) /* 0.260940041 */, 17 }, - /* 2516 */ { MAD_F(0x042d6088) /* 0.261078388 */, 17 }, - /* 2517 */ { MAD_F(0x042df19e) /* 0.261216754 */, 17 }, - /* 2518 */ { MAD_F(0x042e82b9) /* 0.261355137 */, 17 }, - /* 2519 */ { MAD_F(0x042f13d9) /* 0.261493540 */, 17 }, - /* 2520 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 17 }, - /* 2521 */ { MAD_F(0x04303628) /* 0.261770399 */, 17 }, - /* 2522 */ { MAD_F(0x0430c757) /* 0.261908856 */, 17 }, - /* 2523 */ { MAD_F(0x0431588b) /* 0.262047331 */, 17 }, - /* 2524 */ { MAD_F(0x0431e9c3) /* 0.262185825 */, 17 }, - /* 2525 */ { MAD_F(0x04327b01) /* 0.262324337 */, 17 }, - /* 2526 */ { MAD_F(0x04330c43) /* 0.262462867 */, 17 }, - /* 2527 */ { MAD_F(0x04339d8a) /* 0.262601416 */, 17 }, - - /* 2528 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 17 }, - /* 2529 */ { MAD_F(0x0434c028) /* 0.262878568 */, 17 }, - /* 2530 */ { MAD_F(0x0435517e) /* 0.263017171 */, 17 }, - /* 2531 */ { MAD_F(0x0435e2d9) /* 0.263155792 */, 17 }, - /* 2532 */ { MAD_F(0x04367439) /* 0.263294432 */, 17 }, - /* 2533 */ { MAD_F(0x0437059e) /* 0.263433090 */, 17 }, - /* 2534 */ { MAD_F(0x04379707) /* 0.263571767 */, 17 }, - /* 2535 */ { MAD_F(0x04382876) /* 0.263710461 */, 17 }, - /* 2536 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 17 }, - /* 2537 */ { MAD_F(0x04394b61) /* 0.263987905 */, 17 }, - /* 2538 */ { MAD_F(0x0439dcdf) /* 0.264126655 */, 17 }, - /* 2539 */ { MAD_F(0x043a6e61) /* 0.264265422 */, 17 }, - /* 2540 */ { MAD_F(0x043affe8) /* 0.264404208 */, 17 }, - /* 2541 */ { MAD_F(0x043b9174) /* 0.264543012 */, 17 }, - /* 2542 */ { MAD_F(0x043c2305) /* 0.264681834 */, 17 }, - /* 2543 */ { MAD_F(0x043cb49a) /* 0.264820674 */, 17 }, - - /* 2544 */ { MAD_F(0x043d4635) /* 0.264959533 */, 17 }, - /* 2545 */ { MAD_F(0x043dd7d4) /* 0.265098410 */, 17 }, - /* 2546 */ { MAD_F(0x043e6979) /* 0.265237305 */, 17 }, - /* 2547 */ { MAD_F(0x043efb22) /* 0.265376218 */, 17 }, - /* 2548 */ { MAD_F(0x043f8cd0) /* 0.265515149 */, 17 }, - /* 2549 */ { MAD_F(0x04401e83) /* 0.265654099 */, 17 }, - /* 2550 */ { MAD_F(0x0440b03b) /* 0.265793066 */, 17 }, - /* 2551 */ { MAD_F(0x044141f7) /* 0.265932052 */, 17 }, - /* 2552 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 17 }, - /* 2553 */ { MAD_F(0x04426580) /* 0.266210078 */, 17 }, - /* 2554 */ { MAD_F(0x0442f74b) /* 0.266349119 */, 17 }, - /* 2555 */ { MAD_F(0x0443891b) /* 0.266488177 */, 17 }, - /* 2556 */ { MAD_F(0x04441af0) /* 0.266627254 */, 17 }, - /* 2557 */ { MAD_F(0x0444acca) /* 0.266766349 */, 17 }, - /* 2558 */ { MAD_F(0x04453ea9) /* 0.266905462 */, 17 }, - /* 2559 */ { MAD_F(0x0445d08d) /* 0.267044593 */, 17 }, - - /* 2560 */ { MAD_F(0x04466275) /* 0.267183742 */, 17 }, - /* 2561 */ { MAD_F(0x0446f463) /* 0.267322909 */, 17 }, - /* 2562 */ { MAD_F(0x04478655) /* 0.267462094 */, 17 }, - /* 2563 */ { MAD_F(0x0448184c) /* 0.267601298 */, 17 }, - /* 2564 */ { MAD_F(0x0448aa48) /* 0.267740519 */, 17 }, - /* 2565 */ { MAD_F(0x04493c49) /* 0.267879759 */, 17 }, - /* 2566 */ { MAD_F(0x0449ce4f) /* 0.268019017 */, 17 }, - /* 2567 */ { MAD_F(0x044a6059) /* 0.268158293 */, 17 }, - /* 2568 */ { MAD_F(0x044af269) /* 0.268297587 */, 17 }, - /* 2569 */ { MAD_F(0x044b847d) /* 0.268436899 */, 17 }, - /* 2570 */ { MAD_F(0x044c1696) /* 0.268576229 */, 17 }, - /* 2571 */ { MAD_F(0x044ca8b4) /* 0.268715577 */, 17 }, - /* 2572 */ { MAD_F(0x044d3ad7) /* 0.268854943 */, 17 }, - /* 2573 */ { MAD_F(0x044dccff) /* 0.268994328 */, 17 }, - /* 2574 */ { MAD_F(0x044e5f2b) /* 0.269133730 */, 17 }, - /* 2575 */ { MAD_F(0x044ef15d) /* 0.269273150 */, 17 }, - - /* 2576 */ { MAD_F(0x044f8393) /* 0.269412589 */, 17 }, - /* 2577 */ { MAD_F(0x045015ce) /* 0.269552045 */, 17 }, - /* 2578 */ { MAD_F(0x0450a80e) /* 0.269691520 */, 17 }, - /* 2579 */ { MAD_F(0x04513a53) /* 0.269831013 */, 17 }, - /* 2580 */ { MAD_F(0x0451cc9c) /* 0.269970523 */, 17 }, - /* 2581 */ { MAD_F(0x04525eeb) /* 0.270110052 */, 17 }, - /* 2582 */ { MAD_F(0x0452f13e) /* 0.270249599 */, 17 }, - /* 2583 */ { MAD_F(0x04538396) /* 0.270389163 */, 17 }, - /* 2584 */ { MAD_F(0x045415f3) /* 0.270528746 */, 17 }, - /* 2585 */ { MAD_F(0x0454a855) /* 0.270668347 */, 17 }, - /* 2586 */ { MAD_F(0x04553abb) /* 0.270807965 */, 17 }, - /* 2587 */ { MAD_F(0x0455cd27) /* 0.270947602 */, 17 }, - /* 2588 */ { MAD_F(0x04565f97) /* 0.271087257 */, 17 }, - /* 2589 */ { MAD_F(0x0456f20c) /* 0.271226930 */, 17 }, - /* 2590 */ { MAD_F(0x04578486) /* 0.271366620 */, 17 }, - /* 2591 */ { MAD_F(0x04581705) /* 0.271506329 */, 17 }, - - /* 2592 */ { MAD_F(0x0458a989) /* 0.271646056 */, 17 }, - /* 2593 */ { MAD_F(0x04593c11) /* 0.271785800 */, 17 }, - /* 2594 */ { MAD_F(0x0459ce9e) /* 0.271925563 */, 17 }, - /* 2595 */ { MAD_F(0x045a6130) /* 0.272065343 */, 17 }, - /* 2596 */ { MAD_F(0x045af3c7) /* 0.272205142 */, 17 }, - /* 2597 */ { MAD_F(0x045b8663) /* 0.272344958 */, 17 }, - /* 2598 */ { MAD_F(0x045c1903) /* 0.272484793 */, 17 }, - /* 2599 */ { MAD_F(0x045caba9) /* 0.272624645 */, 17 }, - /* 2600 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 17 }, - /* 2601 */ { MAD_F(0x045dd102) /* 0.272904403 */, 17 }, - /* 2602 */ { MAD_F(0x045e63b6) /* 0.273044310 */, 17 }, - /* 2603 */ { MAD_F(0x045ef66e) /* 0.273184234 */, 17 }, - /* 2604 */ { MAD_F(0x045f892b) /* 0.273324176 */, 17 }, - /* 2605 */ { MAD_F(0x04601bee) /* 0.273464136 */, 17 }, - /* 2606 */ { MAD_F(0x0460aeb5) /* 0.273604113 */, 17 }, - /* 2607 */ { MAD_F(0x04614180) /* 0.273744109 */, 17 }, - - /* 2608 */ { MAD_F(0x0461d451) /* 0.273884123 */, 17 }, - /* 2609 */ { MAD_F(0x04626727) /* 0.274024154 */, 17 }, - /* 2610 */ { MAD_F(0x0462fa01) /* 0.274164204 */, 17 }, - /* 2611 */ { MAD_F(0x04638ce0) /* 0.274304271 */, 17 }, - /* 2612 */ { MAD_F(0x04641fc4) /* 0.274444356 */, 17 }, - /* 2613 */ { MAD_F(0x0464b2ac) /* 0.274584459 */, 17 }, - /* 2614 */ { MAD_F(0x0465459a) /* 0.274724580 */, 17 }, - /* 2615 */ { MAD_F(0x0465d88c) /* 0.274864719 */, 17 }, - /* 2616 */ { MAD_F(0x04666b83) /* 0.275004875 */, 17 }, - /* 2617 */ { MAD_F(0x0466fe7f) /* 0.275145050 */, 17 }, - /* 2618 */ { MAD_F(0x0467917f) /* 0.275285242 */, 17 }, - /* 2619 */ { MAD_F(0x04682485) /* 0.275425452 */, 17 }, - /* 2620 */ { MAD_F(0x0468b78f) /* 0.275565681 */, 17 }, - /* 2621 */ { MAD_F(0x04694a9e) /* 0.275705926 */, 17 }, - /* 2622 */ { MAD_F(0x0469ddb2) /* 0.275846190 */, 17 }, - /* 2623 */ { MAD_F(0x046a70ca) /* 0.275986472 */, 17 }, - - /* 2624 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 17 }, - /* 2625 */ { MAD_F(0x046b970a) /* 0.276267088 */, 17 }, - /* 2626 */ { MAD_F(0x046c2a31) /* 0.276407423 */, 17 }, - /* 2627 */ { MAD_F(0x046cbd5c) /* 0.276547776 */, 17 }, - /* 2628 */ { MAD_F(0x046d508d) /* 0.276688147 */, 17 }, - /* 2629 */ { MAD_F(0x046de3c2) /* 0.276828535 */, 17 }, - /* 2630 */ { MAD_F(0x046e76fc) /* 0.276968942 */, 17 }, - /* 2631 */ { MAD_F(0x046f0a3b) /* 0.277109366 */, 17 }, - /* 2632 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 17 }, - /* 2633 */ { MAD_F(0x047030c7) /* 0.277390267 */, 17 }, - /* 2634 */ { MAD_F(0x0470c414) /* 0.277530745 */, 17 }, - /* 2635 */ { MAD_F(0x04715766) /* 0.277671240 */, 17 }, - /* 2636 */ { MAD_F(0x0471eabc) /* 0.277811753 */, 17 }, - /* 2637 */ { MAD_F(0x04727e18) /* 0.277952284 */, 17 }, - /* 2638 */ { MAD_F(0x04731178) /* 0.278092832 */, 17 }, - /* 2639 */ { MAD_F(0x0473a4dd) /* 0.278233399 */, 17 }, - - /* 2640 */ { MAD_F(0x04743847) /* 0.278373983 */, 17 }, - /* 2641 */ { MAD_F(0x0474cbb5) /* 0.278514584 */, 17 }, - /* 2642 */ { MAD_F(0x04755f29) /* 0.278655204 */, 17 }, - /* 2643 */ { MAD_F(0x0475f2a1) /* 0.278795841 */, 17 }, - /* 2644 */ { MAD_F(0x0476861d) /* 0.278936496 */, 17 }, - /* 2645 */ { MAD_F(0x0477199f) /* 0.279077169 */, 17 }, - /* 2646 */ { MAD_F(0x0477ad25) /* 0.279217860 */, 17 }, - /* 2647 */ { MAD_F(0x047840b0) /* 0.279358568 */, 17 }, - /* 2648 */ { MAD_F(0x0478d440) /* 0.279499294 */, 17 }, - /* 2649 */ { MAD_F(0x047967d5) /* 0.279640037 */, 17 }, - /* 2650 */ { MAD_F(0x0479fb6e) /* 0.279780799 */, 17 }, - /* 2651 */ { MAD_F(0x047a8f0c) /* 0.279921578 */, 17 }, - /* 2652 */ { MAD_F(0x047b22af) /* 0.280062375 */, 17 }, - /* 2653 */ { MAD_F(0x047bb657) /* 0.280203189 */, 17 }, - /* 2654 */ { MAD_F(0x047c4a03) /* 0.280344021 */, 17 }, - /* 2655 */ { MAD_F(0x047cddb4) /* 0.280484871 */, 17 }, - - /* 2656 */ { MAD_F(0x047d716a) /* 0.280625739 */, 17 }, - /* 2657 */ { MAD_F(0x047e0524) /* 0.280766624 */, 17 }, - /* 2658 */ { MAD_F(0x047e98e4) /* 0.280907527 */, 17 }, - /* 2659 */ { MAD_F(0x047f2ca8) /* 0.281048447 */, 17 }, - /* 2660 */ { MAD_F(0x047fc071) /* 0.281189385 */, 17 }, - /* 2661 */ { MAD_F(0x0480543e) /* 0.281330341 */, 17 }, - /* 2662 */ { MAD_F(0x0480e811) /* 0.281471315 */, 17 }, - /* 2663 */ { MAD_F(0x04817be8) /* 0.281612306 */, 17 }, - /* 2664 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 17 }, - /* 2665 */ { MAD_F(0x0482a3a4) /* 0.281894341 */, 17 }, - /* 2666 */ { MAD_F(0x04833789) /* 0.282035386 */, 17 }, - /* 2667 */ { MAD_F(0x0483cb73) /* 0.282176447 */, 17 }, - /* 2668 */ { MAD_F(0x04845f62) /* 0.282317527 */, 17 }, - /* 2669 */ { MAD_F(0x0484f355) /* 0.282458624 */, 17 }, - /* 2670 */ { MAD_F(0x0485874d) /* 0.282599738 */, 17 }, - /* 2671 */ { MAD_F(0x04861b4a) /* 0.282740871 */, 17 }, - - /* 2672 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 17 }, - /* 2673 */ { MAD_F(0x04874352) /* 0.283023188 */, 17 }, - /* 2674 */ { MAD_F(0x0487d75d) /* 0.283164373 */, 17 }, - /* 2675 */ { MAD_F(0x04886b6d) /* 0.283305576 */, 17 }, - /* 2676 */ { MAD_F(0x0488ff82) /* 0.283446796 */, 17 }, - /* 2677 */ { MAD_F(0x0489939b) /* 0.283588034 */, 17 }, - /* 2678 */ { MAD_F(0x048a27b9) /* 0.283729290 */, 17 }, - /* 2679 */ { MAD_F(0x048abbdc) /* 0.283870563 */, 17 }, - /* 2680 */ { MAD_F(0x048b5003) /* 0.284011853 */, 17 }, - /* 2681 */ { MAD_F(0x048be42f) /* 0.284153161 */, 17 }, - /* 2682 */ { MAD_F(0x048c7860) /* 0.284294487 */, 17 }, - /* 2683 */ { MAD_F(0x048d0c96) /* 0.284435831 */, 17 }, - /* 2684 */ { MAD_F(0x048da0d0) /* 0.284577192 */, 17 }, - /* 2685 */ { MAD_F(0x048e350f) /* 0.284718570 */, 17 }, - /* 2686 */ { MAD_F(0x048ec953) /* 0.284859966 */, 17 }, - /* 2687 */ { MAD_F(0x048f5d9b) /* 0.285001380 */, 17 }, - - /* 2688 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 17 }, - /* 2689 */ { MAD_F(0x0490863a) /* 0.285284259 */, 17 }, - /* 2690 */ { MAD_F(0x04911a91) /* 0.285425726 */, 17 }, - /* 2691 */ { MAD_F(0x0491aeec) /* 0.285567209 */, 17 }, - /* 2692 */ { MAD_F(0x0492434c) /* 0.285708711 */, 17 }, - /* 2693 */ { MAD_F(0x0492d7b0) /* 0.285850229 */, 17 }, - /* 2694 */ { MAD_F(0x04936c1a) /* 0.285991766 */, 17 }, - /* 2695 */ { MAD_F(0x04940088) /* 0.286133319 */, 17 }, - /* 2696 */ { MAD_F(0x049494fb) /* 0.286274891 */, 17 }, - /* 2697 */ { MAD_F(0x04952972) /* 0.286416480 */, 17 }, - /* 2698 */ { MAD_F(0x0495bdee) /* 0.286558086 */, 17 }, - /* 2699 */ { MAD_F(0x0496526f) /* 0.286699710 */, 17 }, - /* 2700 */ { MAD_F(0x0496e6f5) /* 0.286841351 */, 17 }, - /* 2701 */ { MAD_F(0x04977b7f) /* 0.286983010 */, 17 }, - /* 2702 */ { MAD_F(0x0498100e) /* 0.287124686 */, 17 }, - /* 2703 */ { MAD_F(0x0498a4a1) /* 0.287266380 */, 17 }, - - /* 2704 */ { MAD_F(0x0499393a) /* 0.287408091 */, 17 }, - /* 2705 */ { MAD_F(0x0499cdd7) /* 0.287549820 */, 17 }, - /* 2706 */ { MAD_F(0x049a6278) /* 0.287691566 */, 17 }, - /* 2707 */ { MAD_F(0x049af71f) /* 0.287833330 */, 17 }, - /* 2708 */ { MAD_F(0x049b8bca) /* 0.287975111 */, 17 }, - /* 2709 */ { MAD_F(0x049c207a) /* 0.288116909 */, 17 }, - /* 2710 */ { MAD_F(0x049cb52e) /* 0.288258725 */, 17 }, - /* 2711 */ { MAD_F(0x049d49e7) /* 0.288400559 */, 17 }, - /* 2712 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 17 }, - /* 2713 */ { MAD_F(0x049e7367) /* 0.288684278 */, 17 }, - /* 2714 */ { MAD_F(0x049f082f) /* 0.288826163 */, 17 }, - /* 2715 */ { MAD_F(0x049f9cfa) /* 0.288968067 */, 17 }, - /* 2716 */ { MAD_F(0x04a031cb) /* 0.289109987 */, 17 }, - /* 2717 */ { MAD_F(0x04a0c6a0) /* 0.289251925 */, 17 }, - /* 2718 */ { MAD_F(0x04a15b7a) /* 0.289393881 */, 17 }, - /* 2719 */ { MAD_F(0x04a1f059) /* 0.289535854 */, 17 }, - - /* 2720 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 17 }, - /* 2721 */ { MAD_F(0x04a31a24) /* 0.289819851 */, 17 }, - /* 2722 */ { MAD_F(0x04a3af10) /* 0.289961876 */, 17 }, - /* 2723 */ { MAD_F(0x04a44401) /* 0.290103919 */, 17 }, - /* 2724 */ { MAD_F(0x04a4d8f7) /* 0.290245979 */, 17 }, - /* 2725 */ { MAD_F(0x04a56df2) /* 0.290388056 */, 17 }, - /* 2726 */ { MAD_F(0x04a602f1) /* 0.290530150 */, 17 }, - /* 2727 */ { MAD_F(0x04a697f5) /* 0.290672262 */, 17 }, - /* 2728 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 17 }, - /* 2729 */ { MAD_F(0x04a7c20b) /* 0.290956538 */, 17 }, - /* 2730 */ { MAD_F(0x04a8571d) /* 0.291098703 */, 17 }, - /* 2731 */ { MAD_F(0x04a8ec33) /* 0.291240884 */, 17 }, - /* 2732 */ { MAD_F(0x04a9814e) /* 0.291383083 */, 17 }, - /* 2733 */ { MAD_F(0x04aa166e) /* 0.291525299 */, 17 }, - /* 2734 */ { MAD_F(0x04aaab93) /* 0.291667532 */, 17 }, - /* 2735 */ { MAD_F(0x04ab40bc) /* 0.291809783 */, 17 }, - - /* 2736 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 17 }, - /* 2737 */ { MAD_F(0x04ac6b1c) /* 0.292094337 */, 17 }, - /* 2738 */ { MAD_F(0x04ad0053) /* 0.292236640 */, 17 }, - /* 2739 */ { MAD_F(0x04ad958f) /* 0.292378960 */, 17 }, - /* 2740 */ { MAD_F(0x04ae2ad0) /* 0.292521297 */, 17 }, - /* 2741 */ { MAD_F(0x04aec015) /* 0.292663652 */, 17 }, - /* 2742 */ { MAD_F(0x04af555e) /* 0.292806024 */, 17 }, - /* 2743 */ { MAD_F(0x04afeaad) /* 0.292948414 */, 17 }, - /* 2744 */ { MAD_F(0x04b08000) /* 0.293090820 */, 17 }, - /* 2745 */ { MAD_F(0x04b11557) /* 0.293233244 */, 17 }, - /* 2746 */ { MAD_F(0x04b1aab4) /* 0.293375686 */, 17 }, - /* 2747 */ { MAD_F(0x04b24015) /* 0.293518144 */, 17 }, - /* 2748 */ { MAD_F(0x04b2d57a) /* 0.293660620 */, 17 }, - /* 2749 */ { MAD_F(0x04b36ae4) /* 0.293803113 */, 17 }, - /* 2750 */ { MAD_F(0x04b40053) /* 0.293945624 */, 17 }, - /* 2751 */ { MAD_F(0x04b495c7) /* 0.294088151 */, 17 }, - - /* 2752 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 17 }, - /* 2753 */ { MAD_F(0x04b5c0bc) /* 0.294373259 */, 17 }, - /* 2754 */ { MAD_F(0x04b6563d) /* 0.294515838 */, 17 }, - /* 2755 */ { MAD_F(0x04b6ebc3) /* 0.294658435 */, 17 }, - /* 2756 */ { MAD_F(0x04b7814e) /* 0.294801049 */, 17 }, - /* 2757 */ { MAD_F(0x04b816dd) /* 0.294943680 */, 17 }, - /* 2758 */ { MAD_F(0x04b8ac71) /* 0.295086329 */, 17 }, - /* 2759 */ { MAD_F(0x04b9420a) /* 0.295228995 */, 17 }, - /* 2760 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 17 }, - /* 2761 */ { MAD_F(0x04ba6d49) /* 0.295514378 */, 17 }, - /* 2762 */ { MAD_F(0x04bb02ef) /* 0.295657095 */, 17 }, - /* 2763 */ { MAD_F(0x04bb989a) /* 0.295799830 */, 17 }, - /* 2764 */ { MAD_F(0x04bc2e4a) /* 0.295942582 */, 17 }, - /* 2765 */ { MAD_F(0x04bcc3fe) /* 0.296085351 */, 17 }, - /* 2766 */ { MAD_F(0x04bd59b7) /* 0.296228138 */, 17 }, - /* 2767 */ { MAD_F(0x04bdef74) /* 0.296370941 */, 17 }, - - /* 2768 */ { MAD_F(0x04be8537) /* 0.296513762 */, 17 }, - /* 2769 */ { MAD_F(0x04bf1afd) /* 0.296656600 */, 17 }, - /* 2770 */ { MAD_F(0x04bfb0c9) /* 0.296799455 */, 17 }, - /* 2771 */ { MAD_F(0x04c04699) /* 0.296942327 */, 17 }, - /* 2772 */ { MAD_F(0x04c0dc6d) /* 0.297085217 */, 17 }, - /* 2773 */ { MAD_F(0x04c17247) /* 0.297228124 */, 17 }, - /* 2774 */ { MAD_F(0x04c20824) /* 0.297371048 */, 17 }, - /* 2775 */ { MAD_F(0x04c29e07) /* 0.297513989 */, 17 }, - /* 2776 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 17 }, - /* 2777 */ { MAD_F(0x04c3c9da) /* 0.297799922 */, 17 }, - /* 2778 */ { MAD_F(0x04c45fca) /* 0.297942915 */, 17 }, - /* 2779 */ { MAD_F(0x04c4f5bf) /* 0.298085925 */, 17 }, - /* 2780 */ { MAD_F(0x04c58bb8) /* 0.298228951 */, 17 }, - /* 2781 */ { MAD_F(0x04c621b6) /* 0.298371996 */, 17 }, - /* 2782 */ { MAD_F(0x04c6b7b9) /* 0.298515057 */, 17 }, - /* 2783 */ { MAD_F(0x04c74dc0) /* 0.298658135 */, 17 }, - - /* 2784 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 17 }, - /* 2785 */ { MAD_F(0x04c879dd) /* 0.298944343 */, 17 }, - /* 2786 */ { MAD_F(0x04c90ff2) /* 0.299087473 */, 17 }, - /* 2787 */ { MAD_F(0x04c9a60c) /* 0.299230620 */, 17 }, - /* 2788 */ { MAD_F(0x04ca3c2a) /* 0.299373784 */, 17 }, - /* 2789 */ { MAD_F(0x04cad24d) /* 0.299516965 */, 17 }, - /* 2790 */ { MAD_F(0x04cb6874) /* 0.299660163 */, 17 }, - /* 2791 */ { MAD_F(0x04cbfea0) /* 0.299803378 */, 17 }, - /* 2792 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 17 }, - /* 2793 */ { MAD_F(0x04cd2b06) /* 0.300089860 */, 17 }, - /* 2794 */ { MAD_F(0x04cdc140) /* 0.300233127 */, 17 }, - /* 2795 */ { MAD_F(0x04ce577f) /* 0.300376411 */, 17 }, - /* 2796 */ { MAD_F(0x04ceedc2) /* 0.300519711 */, 17 }, - /* 2797 */ { MAD_F(0x04cf8409) /* 0.300663029 */, 17 }, - /* 2798 */ { MAD_F(0x04d01a55) /* 0.300806364 */, 17 }, - /* 2799 */ { MAD_F(0x04d0b0a6) /* 0.300949716 */, 17 }, - - /* 2800 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 17 }, - /* 2801 */ { MAD_F(0x04d1dd55) /* 0.301236472 */, 17 }, - /* 2802 */ { MAD_F(0x04d273b4) /* 0.301379875 */, 17 }, - /* 2803 */ { MAD_F(0x04d30a17) /* 0.301523295 */, 17 }, - /* 2804 */ { MAD_F(0x04d3a07f) /* 0.301666733 */, 17 }, - /* 2805 */ { MAD_F(0x04d436eb) /* 0.301810187 */, 17 }, - /* 2806 */ { MAD_F(0x04d4cd5c) /* 0.301953659 */, 17 }, - /* 2807 */ { MAD_F(0x04d563d1) /* 0.302097147 */, 17 }, - /* 2808 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 17 }, - /* 2809 */ { MAD_F(0x04d690ca) /* 0.302384175 */, 17 }, - /* 2810 */ { MAD_F(0x04d7274d) /* 0.302527715 */, 17 }, - /* 2811 */ { MAD_F(0x04d7bdd5) /* 0.302671271 */, 17 }, - /* 2812 */ { MAD_F(0x04d85461) /* 0.302814845 */, 17 }, - /* 2813 */ { MAD_F(0x04d8eaf2) /* 0.302958436 */, 17 }, - /* 2814 */ { MAD_F(0x04d98187) /* 0.303102044 */, 17 }, - /* 2815 */ { MAD_F(0x04da1821) /* 0.303245668 */, 17 }, - - /* 2816 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 17 }, - /* 2817 */ { MAD_F(0x04db4563) /* 0.303532969 */, 17 }, - /* 2818 */ { MAD_F(0x04dbdc0a) /* 0.303676645 */, 17 }, - /* 2819 */ { MAD_F(0x04dc72b7) /* 0.303820337 */, 17 }, - /* 2820 */ { MAD_F(0x04dd0967) /* 0.303964047 */, 17 }, - /* 2821 */ { MAD_F(0x04dda01d) /* 0.304107774 */, 17 }, - /* 2822 */ { MAD_F(0x04de36d7) /* 0.304251517 */, 17 }, - /* 2823 */ { MAD_F(0x04decd95) /* 0.304395278 */, 17 }, - /* 2824 */ { MAD_F(0x04df6458) /* 0.304539056 */, 17 }, - /* 2825 */ { MAD_F(0x04dffb20) /* 0.304682850 */, 17 }, - /* 2826 */ { MAD_F(0x04e091ec) /* 0.304826662 */, 17 }, - /* 2827 */ { MAD_F(0x04e128bc) /* 0.304970491 */, 17 }, - /* 2828 */ { MAD_F(0x04e1bf92) /* 0.305114336 */, 17 }, - /* 2829 */ { MAD_F(0x04e2566b) /* 0.305258199 */, 17 }, - /* 2830 */ { MAD_F(0x04e2ed4a) /* 0.305402078 */, 17 }, - /* 2831 */ { MAD_F(0x04e3842d) /* 0.305545974 */, 17 }, - - /* 2832 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 17 }, - /* 2833 */ { MAD_F(0x04e4b200) /* 0.305833818 */, 17 }, - /* 2834 */ { MAD_F(0x04e548f1) /* 0.305977765 */, 17 }, - /* 2835 */ { MAD_F(0x04e5dfe6) /* 0.306121729 */, 17 }, - /* 2836 */ { MAD_F(0x04e676df) /* 0.306265710 */, 17 }, - /* 2837 */ { MAD_F(0x04e70dde) /* 0.306409708 */, 17 }, - /* 2838 */ { MAD_F(0x04e7a4e0) /* 0.306553723 */, 17 }, - /* 2839 */ { MAD_F(0x04e83be7) /* 0.306697755 */, 17 }, - /* 2840 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 17 }, - /* 2841 */ { MAD_F(0x04e96a04) /* 0.306985869 */, 17 }, - /* 2842 */ { MAD_F(0x04ea0118) /* 0.307129952 */, 17 }, - /* 2843 */ { MAD_F(0x04ea9832) /* 0.307274051 */, 17 }, - /* 2844 */ { MAD_F(0x04eb2f50) /* 0.307418168 */, 17 }, - /* 2845 */ { MAD_F(0x04ebc672) /* 0.307562301 */, 17 }, - /* 2846 */ { MAD_F(0x04ec5d99) /* 0.307706451 */, 17 }, - /* 2847 */ { MAD_F(0x04ecf4c5) /* 0.307850618 */, 17 }, - - /* 2848 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 17 }, - /* 2849 */ { MAD_F(0x04ee2329) /* 0.308139003 */, 17 }, - /* 2850 */ { MAD_F(0x04eeba63) /* 0.308283220 */, 17 }, - /* 2851 */ { MAD_F(0x04ef51a0) /* 0.308427455 */, 17 }, - /* 2852 */ { MAD_F(0x04efe8e2) /* 0.308571706 */, 17 }, - /* 2853 */ { MAD_F(0x04f08029) /* 0.308715974 */, 17 }, - /* 2854 */ { MAD_F(0x04f11774) /* 0.308860260 */, 17 }, - /* 2855 */ { MAD_F(0x04f1aec4) /* 0.309004561 */, 17 }, - /* 2856 */ { MAD_F(0x04f24618) /* 0.309148880 */, 17 }, - /* 2857 */ { MAD_F(0x04f2dd71) /* 0.309293216 */, 17 }, - /* 2858 */ { MAD_F(0x04f374cf) /* 0.309437568 */, 17 }, - /* 2859 */ { MAD_F(0x04f40c30) /* 0.309581938 */, 17 }, - /* 2860 */ { MAD_F(0x04f4a397) /* 0.309726324 */, 17 }, - /* 2861 */ { MAD_F(0x04f53b02) /* 0.309870727 */, 17 }, - /* 2862 */ { MAD_F(0x04f5d271) /* 0.310015147 */, 17 }, - /* 2863 */ { MAD_F(0x04f669e5) /* 0.310159583 */, 17 }, - - /* 2864 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 17 }, - /* 2865 */ { MAD_F(0x04f798da) /* 0.310448507 */, 17 }, - /* 2866 */ { MAD_F(0x04f8305c) /* 0.310592994 */, 17 }, - /* 2867 */ { MAD_F(0x04f8c7e2) /* 0.310737498 */, 17 }, - /* 2868 */ { MAD_F(0x04f95f6c) /* 0.310882018 */, 17 }, - /* 2869 */ { MAD_F(0x04f9f6fb) /* 0.311026556 */, 17 }, - /* 2870 */ { MAD_F(0x04fa8e8f) /* 0.311171110 */, 17 }, - /* 2871 */ { MAD_F(0x04fb2627) /* 0.311315681 */, 17 }, - /* 2872 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 17 }, - /* 2873 */ { MAD_F(0x04fc5564) /* 0.311604874 */, 17 }, - /* 2874 */ { MAD_F(0x04fced0a) /* 0.311749495 */, 17 }, - /* 2875 */ { MAD_F(0x04fd84b4) /* 0.311894133 */, 17 }, - /* 2876 */ { MAD_F(0x04fe1c62) /* 0.312038788 */, 17 }, - /* 2877 */ { MAD_F(0x04feb415) /* 0.312183460 */, 17 }, - /* 2878 */ { MAD_F(0x04ff4bcd) /* 0.312328148 */, 17 }, - /* 2879 */ { MAD_F(0x04ffe389) /* 0.312472854 */, 17 }, - - /* 2880 */ { MAD_F(0x05007b49) /* 0.312617576 */, 17 }, - /* 2881 */ { MAD_F(0x0501130e) /* 0.312762314 */, 17 }, - /* 2882 */ { MAD_F(0x0501aad8) /* 0.312907070 */, 17 }, - /* 2883 */ { MAD_F(0x050242a6) /* 0.313051842 */, 17 }, - /* 2884 */ { MAD_F(0x0502da78) /* 0.313196631 */, 17 }, - /* 2885 */ { MAD_F(0x0503724f) /* 0.313341437 */, 17 }, - /* 2886 */ { MAD_F(0x05040a2b) /* 0.313486259 */, 17 }, - /* 2887 */ { MAD_F(0x0504a20b) /* 0.313631098 */, 17 }, - /* 2888 */ { MAD_F(0x050539ef) /* 0.313775954 */, 17 }, - /* 2889 */ { MAD_F(0x0505d1d8) /* 0.313920827 */, 17 }, - /* 2890 */ { MAD_F(0x050669c5) /* 0.314065716 */, 17 }, - /* 2891 */ { MAD_F(0x050701b7) /* 0.314210622 */, 17 }, - /* 2892 */ { MAD_F(0x050799ae) /* 0.314355545 */, 17 }, - /* 2893 */ { MAD_F(0x050831a9) /* 0.314500484 */, 17 }, - /* 2894 */ { MAD_F(0x0508c9a8) /* 0.314645440 */, 17 }, - /* 2895 */ { MAD_F(0x050961ac) /* 0.314790413 */, 17 }, - - /* 2896 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 17 }, - /* 2897 */ { MAD_F(0x050a91c1) /* 0.315080409 */, 17 }, - /* 2898 */ { MAD_F(0x050b29d2) /* 0.315225432 */, 17 }, - /* 2899 */ { MAD_F(0x050bc1e8) /* 0.315370472 */, 17 }, - /* 2900 */ { MAD_F(0x050c5a02) /* 0.315515528 */, 17 }, - /* 2901 */ { MAD_F(0x050cf221) /* 0.315660601 */, 17 }, - /* 2902 */ { MAD_F(0x050d8a44) /* 0.315805690 */, 17 }, - /* 2903 */ { MAD_F(0x050e226c) /* 0.315950797 */, 17 }, - /* 2904 */ { MAD_F(0x050eba98) /* 0.316095920 */, 17 }, - /* 2905 */ { MAD_F(0x050f52c9) /* 0.316241059 */, 17 }, - /* 2906 */ { MAD_F(0x050feafe) /* 0.316386216 */, 17 }, - /* 2907 */ { MAD_F(0x05108337) /* 0.316531388 */, 17 }, - /* 2908 */ { MAD_F(0x05111b75) /* 0.316676578 */, 17 }, - /* 2909 */ { MAD_F(0x0511b3b8) /* 0.316821784 */, 17 }, - /* 2910 */ { MAD_F(0x05124bff) /* 0.316967007 */, 17 }, - /* 2911 */ { MAD_F(0x0512e44a) /* 0.317112247 */, 17 }, - - /* 2912 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 17 }, - /* 2913 */ { MAD_F(0x051414ee) /* 0.317402775 */, 17 }, - /* 2914 */ { MAD_F(0x0514ad47) /* 0.317548065 */, 17 }, - /* 2915 */ { MAD_F(0x051545a5) /* 0.317693371 */, 17 }, - /* 2916 */ { MAD_F(0x0515de06) /* 0.317838693 */, 17 }, - /* 2917 */ { MAD_F(0x0516766d) /* 0.317984033 */, 17 }, - /* 2918 */ { MAD_F(0x05170ed7) /* 0.318129388 */, 17 }, - /* 2919 */ { MAD_F(0x0517a746) /* 0.318274761 */, 17 }, - /* 2920 */ { MAD_F(0x05183fba) /* 0.318420150 */, 17 }, - /* 2921 */ { MAD_F(0x0518d832) /* 0.318565555 */, 17 }, - /* 2922 */ { MAD_F(0x051970ae) /* 0.318710978 */, 17 }, - /* 2923 */ { MAD_F(0x051a092f) /* 0.318856416 */, 17 }, - /* 2924 */ { MAD_F(0x051aa1b5) /* 0.319001872 */, 17 }, - /* 2925 */ { MAD_F(0x051b3a3f) /* 0.319147344 */, 17 }, - /* 2926 */ { MAD_F(0x051bd2cd) /* 0.319292832 */, 17 }, - /* 2927 */ { MAD_F(0x051c6b60) /* 0.319438338 */, 17 }, - - /* 2928 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 17 }, - /* 2929 */ { MAD_F(0x051d9c92) /* 0.319729398 */, 17 }, - /* 2930 */ { MAD_F(0x051e3532) /* 0.319874952 */, 17 }, - /* 2931 */ { MAD_F(0x051ecdd7) /* 0.320020524 */, 17 }, - /* 2932 */ { MAD_F(0x051f6680) /* 0.320166112 */, 17 }, - /* 2933 */ { MAD_F(0x051fff2d) /* 0.320311716 */, 17 }, - /* 2934 */ { MAD_F(0x052097df) /* 0.320457337 */, 17 }, - /* 2935 */ { MAD_F(0x05213095) /* 0.320602975 */, 17 }, - /* 2936 */ { MAD_F(0x0521c950) /* 0.320748629 */, 17 }, - /* 2937 */ { MAD_F(0x0522620f) /* 0.320894300 */, 17 }, - /* 2938 */ { MAD_F(0x0522fad3) /* 0.321039987 */, 17 }, - /* 2939 */ { MAD_F(0x0523939b) /* 0.321185691 */, 17 }, - /* 2940 */ { MAD_F(0x05242c68) /* 0.321331411 */, 17 }, - /* 2941 */ { MAD_F(0x0524c538) /* 0.321477148 */, 17 }, - /* 2942 */ { MAD_F(0x05255e0e) /* 0.321622901 */, 17 }, - /* 2943 */ { MAD_F(0x0525f6e8) /* 0.321768671 */, 17 }, - - /* 2944 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 17 }, - /* 2945 */ { MAD_F(0x052728a9) /* 0.322060260 */, 17 }, - /* 2946 */ { MAD_F(0x0527c190) /* 0.322206079 */, 17 }, - /* 2947 */ { MAD_F(0x05285a7b) /* 0.322351915 */, 17 }, - /* 2948 */ { MAD_F(0x0528f36b) /* 0.322497768 */, 17 }, - /* 2949 */ { MAD_F(0x05298c5f) /* 0.322643636 */, 17 }, - /* 2950 */ { MAD_F(0x052a2558) /* 0.322789522 */, 17 }, - /* 2951 */ { MAD_F(0x052abe55) /* 0.322935424 */, 17 }, - /* 2952 */ { MAD_F(0x052b5757) /* 0.323081342 */, 17 }, - /* 2953 */ { MAD_F(0x052bf05d) /* 0.323227277 */, 17 }, - /* 2954 */ { MAD_F(0x052c8968) /* 0.323373228 */, 17 }, - /* 2955 */ { MAD_F(0x052d2277) /* 0.323519196 */, 17 }, - /* 2956 */ { MAD_F(0x052dbb8a) /* 0.323665180 */, 17 }, - /* 2957 */ { MAD_F(0x052e54a2) /* 0.323811180 */, 17 }, - /* 2958 */ { MAD_F(0x052eedbe) /* 0.323957197 */, 17 }, - /* 2959 */ { MAD_F(0x052f86de) /* 0.324103231 */, 17 }, - - /* 2960 */ { MAD_F(0x05302003) /* 0.324249281 */, 17 }, - /* 2961 */ { MAD_F(0x0530b92d) /* 0.324395347 */, 17 }, - /* 2962 */ { MAD_F(0x0531525b) /* 0.324541430 */, 17 }, - /* 2963 */ { MAD_F(0x0531eb8d) /* 0.324687530 */, 17 }, - /* 2964 */ { MAD_F(0x053284c4) /* 0.324833646 */, 17 }, - /* 2965 */ { MAD_F(0x05331dff) /* 0.324979778 */, 17 }, - /* 2966 */ { MAD_F(0x0533b73e) /* 0.325125926 */, 17 }, - /* 2967 */ { MAD_F(0x05345082) /* 0.325272091 */, 17 }, - /* 2968 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 17 }, - /* 2969 */ { MAD_F(0x05358317) /* 0.325564471 */, 17 }, - /* 2970 */ { MAD_F(0x05361c68) /* 0.325710685 */, 17 }, - /* 2971 */ { MAD_F(0x0536b5be) /* 0.325856916 */, 17 }, - /* 2972 */ { MAD_F(0x05374f17) /* 0.326003163 */, 17 }, - /* 2973 */ { MAD_F(0x0537e876) /* 0.326149427 */, 17 }, - /* 2974 */ { MAD_F(0x053881d9) /* 0.326295707 */, 17 }, - /* 2975 */ { MAD_F(0x05391b40) /* 0.326442003 */, 17 }, - - /* 2976 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 17 }, - /* 2977 */ { MAD_F(0x053a4e1b) /* 0.326734645 */, 17 }, - /* 2978 */ { MAD_F(0x053ae78f) /* 0.326880990 */, 17 }, - /* 2979 */ { MAD_F(0x053b8108) /* 0.327027352 */, 17 }, - /* 2980 */ { MAD_F(0x053c1a85) /* 0.327173730 */, 17 }, - /* 2981 */ { MAD_F(0x053cb407) /* 0.327320125 */, 17 }, - /* 2982 */ { MAD_F(0x053d4d8d) /* 0.327466536 */, 17 }, - /* 2983 */ { MAD_F(0x053de717) /* 0.327612963 */, 17 }, - /* 2984 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 17 }, - /* 2985 */ { MAD_F(0x053f1a39) /* 0.327905867 */, 17 }, - /* 2986 */ { MAD_F(0x053fb3d0) /* 0.328052344 */, 17 }, - /* 2987 */ { MAD_F(0x05404d6c) /* 0.328198837 */, 17 }, - /* 2988 */ { MAD_F(0x0540e70c) /* 0.328345346 */, 17 }, - /* 2989 */ { MAD_F(0x054180b1) /* 0.328491871 */, 17 }, - /* 2990 */ { MAD_F(0x05421a5a) /* 0.328638413 */, 17 }, - /* 2991 */ { MAD_F(0x0542b407) /* 0.328784971 */, 17 }, - - /* 2992 */ { MAD_F(0x05434db9) /* 0.328931546 */, 17 }, - /* 2993 */ { MAD_F(0x0543e76f) /* 0.329078137 */, 17 }, - /* 2994 */ { MAD_F(0x0544812a) /* 0.329224744 */, 17 }, - /* 2995 */ { MAD_F(0x05451ae9) /* 0.329371367 */, 17 }, - /* 2996 */ { MAD_F(0x0545b4ac) /* 0.329518007 */, 17 }, - /* 2997 */ { MAD_F(0x05464e74) /* 0.329664663 */, 17 }, - /* 2998 */ { MAD_F(0x0546e840) /* 0.329811336 */, 17 }, - /* 2999 */ { MAD_F(0x05478211) /* 0.329958024 */, 17 }, - /* 3000 */ { MAD_F(0x05481be5) /* 0.330104730 */, 17 }, - /* 3001 */ { MAD_F(0x0548b5bf) /* 0.330251451 */, 17 }, - /* 3002 */ { MAD_F(0x05494f9c) /* 0.330398189 */, 17 }, - /* 3003 */ { MAD_F(0x0549e97e) /* 0.330544943 */, 17 }, - /* 3004 */ { MAD_F(0x054a8364) /* 0.330691713 */, 17 }, - /* 3005 */ { MAD_F(0x054b1d4f) /* 0.330838499 */, 17 }, - /* 3006 */ { MAD_F(0x054bb73e) /* 0.330985302 */, 17 }, - /* 3007 */ { MAD_F(0x054c5132) /* 0.331132121 */, 17 }, - - /* 3008 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 17 }, - /* 3009 */ { MAD_F(0x054d8526) /* 0.331425808 */, 17 }, - /* 3010 */ { MAD_F(0x054e1f26) /* 0.331572676 */, 17 }, - /* 3011 */ { MAD_F(0x054eb92b) /* 0.331719560 */, 17 }, - /* 3012 */ { MAD_F(0x054f5334) /* 0.331866461 */, 17 }, - /* 3013 */ { MAD_F(0x054fed42) /* 0.332013377 */, 17 }, - /* 3014 */ { MAD_F(0x05508754) /* 0.332160310 */, 17 }, - /* 3015 */ { MAD_F(0x0551216b) /* 0.332307260 */, 17 }, - /* 3016 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 17 }, - /* 3017 */ { MAD_F(0x055255a4) /* 0.332601207 */, 17 }, - /* 3018 */ { MAD_F(0x0552efc8) /* 0.332748205 */, 17 }, - /* 3019 */ { MAD_F(0x055389f0) /* 0.332895219 */, 17 }, - /* 3020 */ { MAD_F(0x0554241c) /* 0.333042249 */, 17 }, - /* 3021 */ { MAD_F(0x0554be4c) /* 0.333189296 */, 17 }, - /* 3022 */ { MAD_F(0x05555881) /* 0.333336359 */, 17 }, - /* 3023 */ { MAD_F(0x0555f2ba) /* 0.333483438 */, 17 }, - - /* 3024 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 17 }, - /* 3025 */ { MAD_F(0x0557273a) /* 0.333777645 */, 17 }, - /* 3026 */ { MAD_F(0x0557c180) /* 0.333924772 */, 17 }, - /* 3027 */ { MAD_F(0x05585bcb) /* 0.334071916 */, 17 }, - /* 3028 */ { MAD_F(0x0558f61a) /* 0.334219076 */, 17 }, - /* 3029 */ { MAD_F(0x0559906d) /* 0.334366253 */, 17 }, - /* 3030 */ { MAD_F(0x055a2ac5) /* 0.334513445 */, 17 }, - /* 3031 */ { MAD_F(0x055ac521) /* 0.334660654 */, 17 }, - /* 3032 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 17 }, - /* 3033 */ { MAD_F(0x055bf9e6) /* 0.334955120 */, 17 }, - /* 3034 */ { MAD_F(0x055c944f) /* 0.335102377 */, 17 }, - /* 3035 */ { MAD_F(0x055d2ebd) /* 0.335249651 */, 17 }, - /* 3036 */ { MAD_F(0x055dc92e) /* 0.335396941 */, 17 }, - /* 3037 */ { MAD_F(0x055e63a5) /* 0.335544246 */, 17 }, - /* 3038 */ { MAD_F(0x055efe1f) /* 0.335691568 */, 17 }, - /* 3039 */ { MAD_F(0x055f989e) /* 0.335838906 */, 17 }, - - /* 3040 */ { MAD_F(0x05603321) /* 0.335986261 */, 17 }, - /* 3041 */ { MAD_F(0x0560cda8) /* 0.336133631 */, 17 }, - /* 3042 */ { MAD_F(0x05616834) /* 0.336281018 */, 17 }, - /* 3043 */ { MAD_F(0x056202c4) /* 0.336428421 */, 17 }, - /* 3044 */ { MAD_F(0x05629d59) /* 0.336575840 */, 17 }, - /* 3045 */ { MAD_F(0x056337f2) /* 0.336723275 */, 17 }, - /* 3046 */ { MAD_F(0x0563d28f) /* 0.336870726 */, 17 }, - /* 3047 */ { MAD_F(0x05646d30) /* 0.337018193 */, 17 }, - /* 3048 */ { MAD_F(0x056507d6) /* 0.337165677 */, 17 }, - /* 3049 */ { MAD_F(0x0565a280) /* 0.337313176 */, 17 }, - /* 3050 */ { MAD_F(0x05663d2f) /* 0.337460692 */, 17 }, - /* 3051 */ { MAD_F(0x0566d7e1) /* 0.337608224 */, 17 }, - /* 3052 */ { MAD_F(0x05677298) /* 0.337755772 */, 17 }, - /* 3053 */ { MAD_F(0x05680d54) /* 0.337903336 */, 17 }, - /* 3054 */ { MAD_F(0x0568a814) /* 0.338050916 */, 17 }, - /* 3055 */ { MAD_F(0x056942d8) /* 0.338198513 */, 17 }, - - /* 3056 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 17 }, - /* 3057 */ { MAD_F(0x056a786d) /* 0.338493753 */, 17 }, - /* 3058 */ { MAD_F(0x056b133e) /* 0.338641398 */, 17 }, - /* 3059 */ { MAD_F(0x056bae13) /* 0.338789059 */, 17 }, - /* 3060 */ { MAD_F(0x056c48ed) /* 0.338936736 */, 17 }, - /* 3061 */ { MAD_F(0x056ce3cb) /* 0.339084429 */, 17 }, - /* 3062 */ { MAD_F(0x056d7ead) /* 0.339232138 */, 17 }, - /* 3063 */ { MAD_F(0x056e1994) /* 0.339379863 */, 17 }, - /* 3064 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 17 }, - /* 3065 */ { MAD_F(0x056f4f6e) /* 0.339675361 */, 17 }, - /* 3066 */ { MAD_F(0x056fea62) /* 0.339823134 */, 17 }, - /* 3067 */ { MAD_F(0x0570855a) /* 0.339970924 */, 17 }, - /* 3068 */ { MAD_F(0x05712056) /* 0.340118729 */, 17 }, - /* 3069 */ { MAD_F(0x0571bb56) /* 0.340266550 */, 17 }, - /* 3070 */ { MAD_F(0x0572565b) /* 0.340414388 */, 17 }, - /* 3071 */ { MAD_F(0x0572f164) /* 0.340562242 */, 17 }, - - /* 3072 */ { MAD_F(0x05738c72) /* 0.340710111 */, 17 }, - /* 3073 */ { MAD_F(0x05742784) /* 0.340857997 */, 17 }, - /* 3074 */ { MAD_F(0x0574c29a) /* 0.341005899 */, 17 }, - /* 3075 */ { MAD_F(0x05755db4) /* 0.341153816 */, 17 }, - /* 3076 */ { MAD_F(0x0575f8d3) /* 0.341301750 */, 17 }, - /* 3077 */ { MAD_F(0x057693f6) /* 0.341449700 */, 17 }, - /* 3078 */ { MAD_F(0x05772f1d) /* 0.341597666 */, 17 }, - /* 3079 */ { MAD_F(0x0577ca49) /* 0.341745648 */, 17 }, - /* 3080 */ { MAD_F(0x05786578) /* 0.341893646 */, 17 }, - /* 3081 */ { MAD_F(0x057900ad) /* 0.342041659 */, 17 }, - /* 3082 */ { MAD_F(0x05799be5) /* 0.342189689 */, 17 }, - /* 3083 */ { MAD_F(0x057a3722) /* 0.342337735 */, 17 }, - /* 3084 */ { MAD_F(0x057ad263) /* 0.342485797 */, 17 }, - /* 3085 */ { MAD_F(0x057b6da8) /* 0.342633875 */, 17 }, - /* 3086 */ { MAD_F(0x057c08f2) /* 0.342781969 */, 17 }, - /* 3087 */ { MAD_F(0x057ca440) /* 0.342930079 */, 17 }, - - /* 3088 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 17 }, - /* 3089 */ { MAD_F(0x057ddae9) /* 0.343226347 */, 17 }, - /* 3090 */ { MAD_F(0x057e7644) /* 0.343374505 */, 17 }, - /* 3091 */ { MAD_F(0x057f11a3) /* 0.343522679 */, 17 }, - /* 3092 */ { MAD_F(0x057fad06) /* 0.343670869 */, 17 }, - /* 3093 */ { MAD_F(0x0580486e) /* 0.343819075 */, 17 }, - /* 3094 */ { MAD_F(0x0580e3da) /* 0.343967296 */, 17 }, - /* 3095 */ { MAD_F(0x05817f4a) /* 0.344115534 */, 17 }, - /* 3096 */ { MAD_F(0x05821abf) /* 0.344263788 */, 17 }, - /* 3097 */ { MAD_F(0x0582b638) /* 0.344412058 */, 17 }, - /* 3098 */ { MAD_F(0x058351b5) /* 0.344560343 */, 17 }, - /* 3099 */ { MAD_F(0x0583ed36) /* 0.344708645 */, 17 }, - /* 3100 */ { MAD_F(0x058488bc) /* 0.344856963 */, 17 }, - /* 3101 */ { MAD_F(0x05852446) /* 0.345005296 */, 17 }, - /* 3102 */ { MAD_F(0x0585bfd4) /* 0.345153646 */, 17 }, - /* 3103 */ { MAD_F(0x05865b67) /* 0.345302011 */, 17 }, - - /* 3104 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 17 }, - /* 3105 */ { MAD_F(0x05879298) /* 0.345598790 */, 17 }, - /* 3106 */ { MAD_F(0x05882e38) /* 0.345747203 */, 17 }, - /* 3107 */ { MAD_F(0x0588c9dc) /* 0.345895632 */, 17 }, - /* 3108 */ { MAD_F(0x05896583) /* 0.346044077 */, 17 }, - /* 3109 */ { MAD_F(0x058a0130) /* 0.346192538 */, 17 }, - /* 3110 */ { MAD_F(0x058a9ce0) /* 0.346341015 */, 17 }, - /* 3111 */ { MAD_F(0x058b3895) /* 0.346489508 */, 17 }, - /* 3112 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 17 }, - /* 3113 */ { MAD_F(0x058c700b) /* 0.346786542 */, 17 }, - /* 3114 */ { MAD_F(0x058d0bcd) /* 0.346935082 */, 17 }, - /* 3115 */ { MAD_F(0x058da793) /* 0.347083639 */, 17 }, - /* 3116 */ { MAD_F(0x058e435d) /* 0.347232211 */, 17 }, - /* 3117 */ { MAD_F(0x058edf2b) /* 0.347380799 */, 17 }, - /* 3118 */ { MAD_F(0x058f7afe) /* 0.347529403 */, 17 }, - /* 3119 */ { MAD_F(0x059016d5) /* 0.347678023 */, 17 }, - - /* 3120 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 17 }, - /* 3121 */ { MAD_F(0x05914e8f) /* 0.347975311 */, 17 }, - /* 3122 */ { MAD_F(0x0591ea73) /* 0.348123979 */, 17 }, - /* 3123 */ { MAD_F(0x0592865b) /* 0.348272662 */, 17 }, - /* 3124 */ { MAD_F(0x05932247) /* 0.348421362 */, 17 }, - /* 3125 */ { MAD_F(0x0593be37) /* 0.348570077 */, 17 }, - /* 3126 */ { MAD_F(0x05945a2c) /* 0.348718808 */, 17 }, - /* 3127 */ { MAD_F(0x0594f625) /* 0.348867555 */, 17 }, - /* 3128 */ { MAD_F(0x05959222) /* 0.349016318 */, 17 }, - /* 3129 */ { MAD_F(0x05962e24) /* 0.349165097 */, 17 }, - /* 3130 */ { MAD_F(0x0596ca2a) /* 0.349313892 */, 17 }, - /* 3131 */ { MAD_F(0x05976634) /* 0.349462702 */, 17 }, - /* 3132 */ { MAD_F(0x05980242) /* 0.349611528 */, 17 }, - /* 3133 */ { MAD_F(0x05989e54) /* 0.349760370 */, 17 }, - /* 3134 */ { MAD_F(0x05993a6b) /* 0.349909228 */, 17 }, - /* 3135 */ { MAD_F(0x0599d686) /* 0.350058102 */, 17 }, - - /* 3136 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 17 }, - /* 3137 */ { MAD_F(0x059b0ec9) /* 0.350355897 */, 17 }, - /* 3138 */ { MAD_F(0x059baaf1) /* 0.350504818 */, 17 }, - /* 3139 */ { MAD_F(0x059c471d) /* 0.350653756 */, 17 }, - /* 3140 */ { MAD_F(0x059ce34d) /* 0.350802708 */, 17 }, - /* 3141 */ { MAD_F(0x059d7f81) /* 0.350951677 */, 17 }, - /* 3142 */ { MAD_F(0x059e1bba) /* 0.351100662 */, 17 }, - /* 3143 */ { MAD_F(0x059eb7f7) /* 0.351249662 */, 17 }, - /* 3144 */ { MAD_F(0x059f5438) /* 0.351398678 */, 17 }, - /* 3145 */ { MAD_F(0x059ff07e) /* 0.351547710 */, 17 }, - /* 3146 */ { MAD_F(0x05a08cc7) /* 0.351696758 */, 17 }, - /* 3147 */ { MAD_F(0x05a12915) /* 0.351845821 */, 17 }, - /* 3148 */ { MAD_F(0x05a1c567) /* 0.351994901 */, 17 }, - /* 3149 */ { MAD_F(0x05a261be) /* 0.352143996 */, 17 }, - /* 3150 */ { MAD_F(0x05a2fe18) /* 0.352293107 */, 17 }, - /* 3151 */ { MAD_F(0x05a39a77) /* 0.352442233 */, 17 }, - - /* 3152 */ { MAD_F(0x05a436da) /* 0.352591376 */, 17 }, - /* 3153 */ { MAD_F(0x05a4d342) /* 0.352740534 */, 17 }, - /* 3154 */ { MAD_F(0x05a56fad) /* 0.352889708 */, 17 }, - /* 3155 */ { MAD_F(0x05a60c1d) /* 0.353038898 */, 17 }, - /* 3156 */ { MAD_F(0x05a6a891) /* 0.353188103 */, 17 }, - /* 3157 */ { MAD_F(0x05a7450a) /* 0.353337325 */, 17 }, - /* 3158 */ { MAD_F(0x05a7e186) /* 0.353486562 */, 17 }, - /* 3159 */ { MAD_F(0x05a87e07) /* 0.353635814 */, 17 }, - /* 3160 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 17 }, - /* 3161 */ { MAD_F(0x05a9b715) /* 0.353934367 */, 17 }, - /* 3162 */ { MAD_F(0x05aa53a2) /* 0.354083667 */, 17 }, - /* 3163 */ { MAD_F(0x05aaf034) /* 0.354232983 */, 17 }, - /* 3164 */ { MAD_F(0x05ab8cca) /* 0.354382314 */, 17 }, - /* 3165 */ { MAD_F(0x05ac2964) /* 0.354531662 */, 17 }, - /* 3166 */ { MAD_F(0x05acc602) /* 0.354681025 */, 17 }, - /* 3167 */ { MAD_F(0x05ad62a5) /* 0.354830403 */, 17 }, - - /* 3168 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 17 }, - /* 3169 */ { MAD_F(0x05ae9bf7) /* 0.355129208 */, 17 }, - /* 3170 */ { MAD_F(0x05af38a6) /* 0.355278634 */, 17 }, - /* 3171 */ { MAD_F(0x05afd559) /* 0.355428075 */, 17 }, - /* 3172 */ { MAD_F(0x05b07211) /* 0.355577533 */, 17 }, - /* 3173 */ { MAD_F(0x05b10ecd) /* 0.355727006 */, 17 }, - /* 3174 */ { MAD_F(0x05b1ab8d) /* 0.355876494 */, 17 }, - /* 3175 */ { MAD_F(0x05b24851) /* 0.356025999 */, 17 }, - /* 3176 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 17 }, - /* 3177 */ { MAD_F(0x05b381e6) /* 0.356325054 */, 17 }, - /* 3178 */ { MAD_F(0x05b41eb7) /* 0.356474606 */, 17 }, - /* 3179 */ { MAD_F(0x05b4bb8c) /* 0.356624173 */, 17 }, - /* 3180 */ { MAD_F(0x05b55866) /* 0.356773756 */, 17 }, - /* 3181 */ { MAD_F(0x05b5f543) /* 0.356923354 */, 17 }, - /* 3182 */ { MAD_F(0x05b69225) /* 0.357072969 */, 17 }, - /* 3183 */ { MAD_F(0x05b72f0b) /* 0.357222598 */, 17 }, - - /* 3184 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 17 }, - /* 3185 */ { MAD_F(0x05b868e3) /* 0.357521905 */, 17 }, - /* 3186 */ { MAD_F(0x05b905d6) /* 0.357671582 */, 17 }, - /* 3187 */ { MAD_F(0x05b9a2cd) /* 0.357821275 */, 17 }, - /* 3188 */ { MAD_F(0x05ba3fc8) /* 0.357970983 */, 17 }, - /* 3189 */ { MAD_F(0x05badcc7) /* 0.358120707 */, 17 }, - /* 3190 */ { MAD_F(0x05bb79ca) /* 0.358270446 */, 17 }, - /* 3191 */ { MAD_F(0x05bc16d2) /* 0.358420201 */, 17 }, - /* 3192 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 17 }, - /* 3193 */ { MAD_F(0x05bd50ee) /* 0.358719758 */, 17 }, - /* 3194 */ { MAD_F(0x05bdee02) /* 0.358869560 */, 17 }, - /* 3195 */ { MAD_F(0x05be8b1a) /* 0.359019378 */, 17 }, - /* 3196 */ { MAD_F(0x05bf2837) /* 0.359169211 */, 17 }, - /* 3197 */ { MAD_F(0x05bfc558) /* 0.359319060 */, 17 }, - /* 3198 */ { MAD_F(0x05c0627d) /* 0.359468925 */, 17 }, - /* 3199 */ { MAD_F(0x05c0ffa6) /* 0.359618805 */, 17 }, - - /* 3200 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 17 }, - /* 3201 */ { MAD_F(0x05c23a05) /* 0.359918612 */, 17 }, - /* 3202 */ { MAD_F(0x05c2d73a) /* 0.360068540 */, 17 }, - /* 3203 */ { MAD_F(0x05c37474) /* 0.360218482 */, 17 }, - /* 3204 */ { MAD_F(0x05c411b2) /* 0.360368440 */, 17 }, - /* 3205 */ { MAD_F(0x05c4aef5) /* 0.360518414 */, 17 }, - /* 3206 */ { MAD_F(0x05c54c3b) /* 0.360668404 */, 17 }, - /* 3207 */ { MAD_F(0x05c5e986) /* 0.360818409 */, 17 }, - /* 3208 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 17 }, - /* 3209 */ { MAD_F(0x05c72428) /* 0.361118466 */, 17 }, - /* 3210 */ { MAD_F(0x05c7c17f) /* 0.361268517 */, 17 }, - /* 3211 */ { MAD_F(0x05c85eda) /* 0.361418585 */, 17 }, - /* 3212 */ { MAD_F(0x05c8fc3a) /* 0.361568668 */, 17 }, - /* 3213 */ { MAD_F(0x05c9999e) /* 0.361718766 */, 17 }, - /* 3214 */ { MAD_F(0x05ca3706) /* 0.361868881 */, 17 }, - /* 3215 */ { MAD_F(0x05cad472) /* 0.362019010 */, 17 }, - - /* 3216 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 17 }, - /* 3217 */ { MAD_F(0x05cc0f57) /* 0.362319316 */, 17 }, - /* 3218 */ { MAD_F(0x05ccaccf) /* 0.362469493 */, 17 }, - /* 3219 */ { MAD_F(0x05cd4a4c) /* 0.362619685 */, 17 }, - /* 3220 */ { MAD_F(0x05cde7cd) /* 0.362769892 */, 17 }, - /* 3221 */ { MAD_F(0x05ce8552) /* 0.362920115 */, 17 }, - /* 3222 */ { MAD_F(0x05cf22dc) /* 0.363070354 */, 17 }, - /* 3223 */ { MAD_F(0x05cfc069) /* 0.363220608 */, 17 }, - /* 3224 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 17 }, - /* 3225 */ { MAD_F(0x05d0fb91) /* 0.363521163 */, 17 }, - /* 3226 */ { MAD_F(0x05d1992b) /* 0.363671464 */, 17 }, - /* 3227 */ { MAD_F(0x05d236c9) /* 0.363821780 */, 17 }, - /* 3228 */ { MAD_F(0x05d2d46c) /* 0.363972112 */, 17 }, - /* 3229 */ { MAD_F(0x05d37212) /* 0.364122459 */, 17 }, - /* 3230 */ { MAD_F(0x05d40fbd) /* 0.364272822 */, 17 }, - /* 3231 */ { MAD_F(0x05d4ad6c) /* 0.364423200 */, 17 }, - - /* 3232 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 17 }, - /* 3233 */ { MAD_F(0x05d5e8d6) /* 0.364724004 */, 17 }, - /* 3234 */ { MAD_F(0x05d68691) /* 0.364874429 */, 17 }, - /* 3235 */ { MAD_F(0x05d72451) /* 0.365024869 */, 17 }, - /* 3236 */ { MAD_F(0x05d7c215) /* 0.365175325 */, 17 }, - /* 3237 */ { MAD_F(0x05d85fdc) /* 0.365325796 */, 17 }, - /* 3238 */ { MAD_F(0x05d8fda8) /* 0.365476283 */, 17 }, - /* 3239 */ { MAD_F(0x05d99b79) /* 0.365626786 */, 17 }, - /* 3240 */ { MAD_F(0x05da394d) /* 0.365777304 */, 17 }, - /* 3241 */ { MAD_F(0x05dad726) /* 0.365927837 */, 17 }, - /* 3242 */ { MAD_F(0x05db7502) /* 0.366078386 */, 17 }, - /* 3243 */ { MAD_F(0x05dc12e3) /* 0.366228950 */, 17 }, - /* 3244 */ { MAD_F(0x05dcb0c8) /* 0.366379530 */, 17 }, - /* 3245 */ { MAD_F(0x05dd4eb1) /* 0.366530125 */, 17 }, - /* 3246 */ { MAD_F(0x05ddec9e) /* 0.366680736 */, 17 }, - /* 3247 */ { MAD_F(0x05de8a90) /* 0.366831362 */, 17 }, - - /* 3248 */ { MAD_F(0x05df2885) /* 0.366982004 */, 17 }, - /* 3249 */ { MAD_F(0x05dfc67f) /* 0.367132661 */, 17 }, - /* 3250 */ { MAD_F(0x05e0647d) /* 0.367283334 */, 17 }, - /* 3251 */ { MAD_F(0x05e1027f) /* 0.367434022 */, 17 }, - /* 3252 */ { MAD_F(0x05e1a085) /* 0.367584725 */, 17 }, - /* 3253 */ { MAD_F(0x05e23e8f) /* 0.367735444 */, 17 }, - /* 3254 */ { MAD_F(0x05e2dc9e) /* 0.367886179 */, 17 }, - /* 3255 */ { MAD_F(0x05e37ab0) /* 0.368036929 */, 17 }, - /* 3256 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 17 }, - /* 3257 */ { MAD_F(0x05e4b6e2) /* 0.368338475 */, 17 }, - /* 3258 */ { MAD_F(0x05e55501) /* 0.368489271 */, 17 }, - /* 3259 */ { MAD_F(0x05e5f324) /* 0.368640082 */, 17 }, - /* 3260 */ { MAD_F(0x05e6914c) /* 0.368790909 */, 17 }, - /* 3261 */ { MAD_F(0x05e72f77) /* 0.368941752 */, 17 }, - /* 3262 */ { MAD_F(0x05e7cda7) /* 0.369092610 */, 17 }, - /* 3263 */ { MAD_F(0x05e86bda) /* 0.369243483 */, 17 }, - - /* 3264 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 17 }, - /* 3265 */ { MAD_F(0x05e9a84e) /* 0.369545276 */, 17 }, - /* 3266 */ { MAD_F(0x05ea468e) /* 0.369696195 */, 17 }, - /* 3267 */ { MAD_F(0x05eae4d3) /* 0.369847130 */, 17 }, - /* 3268 */ { MAD_F(0x05eb831b) /* 0.369998080 */, 17 }, - /* 3269 */ { MAD_F(0x05ec2168) /* 0.370149046 */, 17 }, - /* 3270 */ { MAD_F(0x05ecbfb8) /* 0.370300027 */, 17 }, - /* 3271 */ { MAD_F(0x05ed5e0d) /* 0.370451024 */, 17 }, - /* 3272 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 17 }, - /* 3273 */ { MAD_F(0x05ee9ac3) /* 0.370753063 */, 17 }, - /* 3274 */ { MAD_F(0x05ef3924) /* 0.370904105 */, 17 }, - /* 3275 */ { MAD_F(0x05efd78a) /* 0.371055163 */, 17 }, - /* 3276 */ { MAD_F(0x05f075f3) /* 0.371206237 */, 17 }, - /* 3277 */ { MAD_F(0x05f11461) /* 0.371357326 */, 17 }, - /* 3278 */ { MAD_F(0x05f1b2d3) /* 0.371508430 */, 17 }, - /* 3279 */ { MAD_F(0x05f25148) /* 0.371659549 */, 17 }, - - /* 3280 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 17 }, - /* 3281 */ { MAD_F(0x05f38e40) /* 0.371961834 */, 17 }, - /* 3282 */ { MAD_F(0x05f42cc3) /* 0.372113000 */, 17 }, - /* 3283 */ { MAD_F(0x05f4cb49) /* 0.372264181 */, 17 }, - /* 3284 */ { MAD_F(0x05f569d3) /* 0.372415377 */, 17 }, - /* 3285 */ { MAD_F(0x05f60862) /* 0.372566589 */, 17 }, - /* 3286 */ { MAD_F(0x05f6a6f5) /* 0.372717816 */, 17 }, - /* 3287 */ { MAD_F(0x05f7458b) /* 0.372869058 */, 17 }, - /* 3288 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 17 }, - /* 3289 */ { MAD_F(0x05f882c5) /* 0.373171589 */, 17 }, - /* 3290 */ { MAD_F(0x05f92169) /* 0.373322877 */, 17 }, - /* 3291 */ { MAD_F(0x05f9c010) /* 0.373474181 */, 17 }, - /* 3292 */ { MAD_F(0x05fa5ebb) /* 0.373625500 */, 17 }, - /* 3293 */ { MAD_F(0x05fafd6b) /* 0.373776834 */, 17 }, - /* 3294 */ { MAD_F(0x05fb9c1e) /* 0.373928184 */, 17 }, - /* 3295 */ { MAD_F(0x05fc3ad6) /* 0.374079549 */, 17 }, - - /* 3296 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 17 }, - /* 3297 */ { MAD_F(0x05fd7852) /* 0.374382325 */, 17 }, - /* 3298 */ { MAD_F(0x05fe1716) /* 0.374533735 */, 17 }, - /* 3299 */ { MAD_F(0x05feb5de) /* 0.374685162 */, 17 }, - /* 3300 */ { MAD_F(0x05ff54aa) /* 0.374836603 */, 17 }, - /* 3301 */ { MAD_F(0x05fff37b) /* 0.374988060 */, 17 }, - /* 3302 */ { MAD_F(0x0600924f) /* 0.375139532 */, 17 }, - /* 3303 */ { MAD_F(0x06013128) /* 0.375291019 */, 17 }, - /* 3304 */ { MAD_F(0x0601d004) /* 0.375442522 */, 17 }, - /* 3305 */ { MAD_F(0x06026ee5) /* 0.375594040 */, 17 }, - /* 3306 */ { MAD_F(0x06030dca) /* 0.375745573 */, 17 }, - /* 3307 */ { MAD_F(0x0603acb3) /* 0.375897122 */, 17 }, - /* 3308 */ { MAD_F(0x06044ba0) /* 0.376048685 */, 17 }, - /* 3309 */ { MAD_F(0x0604ea91) /* 0.376200265 */, 17 }, - /* 3310 */ { MAD_F(0x06058987) /* 0.376351859 */, 17 }, - /* 3311 */ { MAD_F(0x06062880) /* 0.376503468 */, 17 }, - - /* 3312 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 17 }, - /* 3313 */ { MAD_F(0x0607667f) /* 0.376806733 */, 17 }, - /* 3314 */ { MAD_F(0x06080585) /* 0.376958389 */, 17 }, - /* 3315 */ { MAD_F(0x0608a48f) /* 0.377110059 */, 17 }, - /* 3316 */ { MAD_F(0x0609439c) /* 0.377261745 */, 17 }, - /* 3317 */ { MAD_F(0x0609e2ae) /* 0.377413446 */, 17 }, - /* 3318 */ { MAD_F(0x060a81c4) /* 0.377565163 */, 17 }, - /* 3319 */ { MAD_F(0x060b20df) /* 0.377716894 */, 17 }, - /* 3320 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 17 }, - /* 3321 */ { MAD_F(0x060c5f1f) /* 0.378020403 */, 17 }, - /* 3322 */ { MAD_F(0x060cfe46) /* 0.378172181 */, 17 }, - /* 3323 */ { MAD_F(0x060d9d70) /* 0.378323973 */, 17 }, - /* 3324 */ { MAD_F(0x060e3c9f) /* 0.378475781 */, 17 }, - /* 3325 */ { MAD_F(0x060edbd1) /* 0.378627604 */, 17 }, - /* 3326 */ { MAD_F(0x060f7b08) /* 0.378779442 */, 17 }, - /* 3327 */ { MAD_F(0x06101a43) /* 0.378931296 */, 17 }, - - /* 3328 */ { MAD_F(0x0610b982) /* 0.379083164 */, 17 }, - /* 3329 */ { MAD_F(0x061158c5) /* 0.379235048 */, 17 }, - /* 3330 */ { MAD_F(0x0611f80c) /* 0.379386947 */, 17 }, - /* 3331 */ { MAD_F(0x06129757) /* 0.379538862 */, 17 }, - /* 3332 */ { MAD_F(0x061336a6) /* 0.379690791 */, 17 }, - /* 3333 */ { MAD_F(0x0613d5fa) /* 0.379842736 */, 17 }, - /* 3334 */ { MAD_F(0x06147551) /* 0.379994696 */, 17 }, - /* 3335 */ { MAD_F(0x061514ad) /* 0.380146671 */, 17 }, - /* 3336 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 17 }, - /* 3337 */ { MAD_F(0x06165370) /* 0.380450666 */, 17 }, - /* 3338 */ { MAD_F(0x0616f2d8) /* 0.380602687 */, 17 }, - /* 3339 */ { MAD_F(0x06179243) /* 0.380754723 */, 17 }, - /* 3340 */ { MAD_F(0x061831b3) /* 0.380906774 */, 17 }, - /* 3341 */ { MAD_F(0x0618d127) /* 0.381058840 */, 17 }, - /* 3342 */ { MAD_F(0x0619709f) /* 0.381210921 */, 17 }, - /* 3343 */ { MAD_F(0x061a101b) /* 0.381363018 */, 17 }, - - /* 3344 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 17 }, - /* 3345 */ { MAD_F(0x061b4f20) /* 0.381667257 */, 17 }, - /* 3346 */ { MAD_F(0x061beea8) /* 0.381819399 */, 17 }, - /* 3347 */ { MAD_F(0x061c8e34) /* 0.381971556 */, 17 }, - /* 3348 */ { MAD_F(0x061d2dc5) /* 0.382123728 */, 17 }, - /* 3349 */ { MAD_F(0x061dcd59) /* 0.382275916 */, 17 }, - /* 3350 */ { MAD_F(0x061e6cf2) /* 0.382428118 */, 17 }, - /* 3351 */ { MAD_F(0x061f0c8f) /* 0.382580336 */, 17 }, - /* 3352 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 17 }, - /* 3353 */ { MAD_F(0x06204bd4) /* 0.382884817 */, 17 }, - /* 3354 */ { MAD_F(0x0620eb7d) /* 0.383037080 */, 17 }, - /* 3355 */ { MAD_F(0x06218b2a) /* 0.383189358 */, 17 }, - /* 3356 */ { MAD_F(0x06222adb) /* 0.383341652 */, 17 }, - /* 3357 */ { MAD_F(0x0622ca90) /* 0.383493960 */, 17 }, - /* 3358 */ { MAD_F(0x06236a49) /* 0.383646284 */, 17 }, - /* 3359 */ { MAD_F(0x06240a06) /* 0.383798623 */, 17 }, - - /* 3360 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 17 }, - /* 3361 */ { MAD_F(0x0625498d) /* 0.384103346 */, 17 }, - /* 3362 */ { MAD_F(0x0625e956) /* 0.384255730 */, 17 }, - /* 3363 */ { MAD_F(0x06268923) /* 0.384408129 */, 17 }, - /* 3364 */ { MAD_F(0x062728f5) /* 0.384560544 */, 17 }, - /* 3365 */ { MAD_F(0x0627c8ca) /* 0.384712973 */, 17 }, - /* 3366 */ { MAD_F(0x062868a4) /* 0.384865418 */, 17 }, - /* 3367 */ { MAD_F(0x06290881) /* 0.385017878 */, 17 }, - /* 3368 */ { MAD_F(0x0629a863) /* 0.385170352 */, 17 }, - /* 3369 */ { MAD_F(0x062a4849) /* 0.385322842 */, 17 }, - /* 3370 */ { MAD_F(0x062ae832) /* 0.385475347 */, 17 }, - /* 3371 */ { MAD_F(0x062b8820) /* 0.385627867 */, 17 }, - /* 3372 */ { MAD_F(0x062c2812) /* 0.385780402 */, 17 }, - /* 3373 */ { MAD_F(0x062cc808) /* 0.385932953 */, 17 }, - /* 3374 */ { MAD_F(0x062d6802) /* 0.386085518 */, 17 }, - /* 3375 */ { MAD_F(0x062e0800) /* 0.386238098 */, 17 }, - - /* 3376 */ { MAD_F(0x062ea802) /* 0.386390694 */, 17 }, - /* 3377 */ { MAD_F(0x062f4808) /* 0.386543304 */, 17 }, - /* 3378 */ { MAD_F(0x062fe812) /* 0.386695930 */, 17 }, - /* 3379 */ { MAD_F(0x06308820) /* 0.386848570 */, 17 }, - /* 3380 */ { MAD_F(0x06312832) /* 0.387001226 */, 17 }, - /* 3381 */ { MAD_F(0x0631c849) /* 0.387153897 */, 17 }, - /* 3382 */ { MAD_F(0x06326863) /* 0.387306582 */, 17 }, - /* 3383 */ { MAD_F(0x06330881) /* 0.387459283 */, 17 }, - /* 3384 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 17 }, - /* 3385 */ { MAD_F(0x063448ca) /* 0.387764730 */, 17 }, - /* 3386 */ { MAD_F(0x0634e8f4) /* 0.387917476 */, 17 }, - /* 3387 */ { MAD_F(0x06358923) /* 0.388070237 */, 17 }, - /* 3388 */ { MAD_F(0x06362955) /* 0.388223013 */, 17 }, - /* 3389 */ { MAD_F(0x0636c98c) /* 0.388375804 */, 17 }, - /* 3390 */ { MAD_F(0x063769c6) /* 0.388528610 */, 17 }, - /* 3391 */ { MAD_F(0x06380a05) /* 0.388681431 */, 17 }, - - /* 3392 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 17 }, - /* 3393 */ { MAD_F(0x06394a8e) /* 0.388987119 */, 17 }, - /* 3394 */ { MAD_F(0x0639ead9) /* 0.389139985 */, 17 }, - /* 3395 */ { MAD_F(0x063a8b28) /* 0.389292866 */, 17 }, - /* 3396 */ { MAD_F(0x063b2b7b) /* 0.389445762 */, 17 }, - /* 3397 */ { MAD_F(0x063bcbd1) /* 0.389598674 */, 17 }, - /* 3398 */ { MAD_F(0x063c6c2c) /* 0.389751600 */, 17 }, - /* 3399 */ { MAD_F(0x063d0c8b) /* 0.389904541 */, 17 }, - /* 3400 */ { MAD_F(0x063dacee) /* 0.390057497 */, 17 }, - /* 3401 */ { MAD_F(0x063e4d55) /* 0.390210468 */, 17 }, - /* 3402 */ { MAD_F(0x063eedc0) /* 0.390363455 */, 17 }, - /* 3403 */ { MAD_F(0x063f8e2f) /* 0.390516456 */, 17 }, - /* 3404 */ { MAD_F(0x06402ea2) /* 0.390669472 */, 17 }, - /* 3405 */ { MAD_F(0x0640cf19) /* 0.390822503 */, 17 }, - /* 3406 */ { MAD_F(0x06416f94) /* 0.390975549 */, 17 }, - /* 3407 */ { MAD_F(0x06421013) /* 0.391128611 */, 17 }, - - /* 3408 */ { MAD_F(0x0642b096) /* 0.391281687 */, 17 }, - /* 3409 */ { MAD_F(0x0643511d) /* 0.391434778 */, 17 }, - /* 3410 */ { MAD_F(0x0643f1a8) /* 0.391587884 */, 17 }, - /* 3411 */ { MAD_F(0x06449237) /* 0.391741005 */, 17 }, - /* 3412 */ { MAD_F(0x064532ca) /* 0.391894141 */, 17 }, - /* 3413 */ { MAD_F(0x0645d361) /* 0.392047292 */, 17 }, - /* 3414 */ { MAD_F(0x064673fc) /* 0.392200458 */, 17 }, - /* 3415 */ { MAD_F(0x0647149c) /* 0.392353638 */, 17 }, - /* 3416 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 17 }, - /* 3417 */ { MAD_F(0x064855e6) /* 0.392660045 */, 17 }, - /* 3418 */ { MAD_F(0x0648f691) /* 0.392813271 */, 17 }, - /* 3419 */ { MAD_F(0x06499740) /* 0.392966511 */, 17 }, - /* 3420 */ { MAD_F(0x064a37f4) /* 0.393119767 */, 17 }, - /* 3421 */ { MAD_F(0x064ad8ab) /* 0.393273038 */, 17 }, - /* 3422 */ { MAD_F(0x064b7966) /* 0.393426323 */, 17 }, - /* 3423 */ { MAD_F(0x064c1a25) /* 0.393579623 */, 17 }, - - /* 3424 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 17 }, - /* 3425 */ { MAD_F(0x064d5bb0) /* 0.393886269 */, 17 }, - /* 3426 */ { MAD_F(0x064dfc7b) /* 0.394039614 */, 17 }, - /* 3427 */ { MAD_F(0x064e9d4b) /* 0.394192974 */, 17 }, - /* 3428 */ { MAD_F(0x064f3e1e) /* 0.394346349 */, 17 }, - /* 3429 */ { MAD_F(0x064fdef5) /* 0.394499739 */, 17 }, - /* 3430 */ { MAD_F(0x06507fd0) /* 0.394653144 */, 17 }, - /* 3431 */ { MAD_F(0x065120b0) /* 0.394806564 */, 17 }, - /* 3432 */ { MAD_F(0x0651c193) /* 0.394959999 */, 17 }, - /* 3433 */ { MAD_F(0x0652627a) /* 0.395113448 */, 17 }, - /* 3434 */ { MAD_F(0x06530366) /* 0.395266913 */, 17 }, - /* 3435 */ { MAD_F(0x0653a455) /* 0.395420392 */, 17 }, - /* 3436 */ { MAD_F(0x06544548) /* 0.395573886 */, 17 }, - /* 3437 */ { MAD_F(0x0654e640) /* 0.395727395 */, 17 }, - /* 3438 */ { MAD_F(0x0655873b) /* 0.395880919 */, 17 }, - /* 3439 */ { MAD_F(0x0656283a) /* 0.396034458 */, 17 }, - - /* 3440 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 17 }, - /* 3441 */ { MAD_F(0x06576a45) /* 0.396341581 */, 17 }, - /* 3442 */ { MAD_F(0x06580b50) /* 0.396495164 */, 17 }, - /* 3443 */ { MAD_F(0x0658ac5f) /* 0.396648763 */, 17 }, - /* 3444 */ { MAD_F(0x06594d73) /* 0.396802376 */, 17 }, - /* 3445 */ { MAD_F(0x0659ee8a) /* 0.396956004 */, 17 }, - /* 3446 */ { MAD_F(0x065a8fa5) /* 0.397109647 */, 17 }, - /* 3447 */ { MAD_F(0x065b30c4) /* 0.397263305 */, 17 }, - /* 3448 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 17 }, - /* 3449 */ { MAD_F(0x065c730f) /* 0.397570666 */, 17 }, - /* 3450 */ { MAD_F(0x065d143a) /* 0.397724368 */, 17 }, - /* 3451 */ { MAD_F(0x065db569) /* 0.397878085 */, 17 }, - /* 3452 */ { MAD_F(0x065e569c) /* 0.398031818 */, 17 }, - /* 3453 */ { MAD_F(0x065ef7d3) /* 0.398185565 */, 17 }, - /* 3454 */ { MAD_F(0x065f990e) /* 0.398339326 */, 17 }, - /* 3455 */ { MAD_F(0x06603a4e) /* 0.398493103 */, 17 }, - - /* 3456 */ { MAD_F(0x0660db91) /* 0.398646895 */, 17 }, - /* 3457 */ { MAD_F(0x06617cd8) /* 0.398800701 */, 17 }, - /* 3458 */ { MAD_F(0x06621e23) /* 0.398954522 */, 17 }, - /* 3459 */ { MAD_F(0x0662bf72) /* 0.399108358 */, 17 }, - /* 3460 */ { MAD_F(0x066360c5) /* 0.399262209 */, 17 }, - /* 3461 */ { MAD_F(0x0664021c) /* 0.399416075 */, 17 }, - /* 3462 */ { MAD_F(0x0664a377) /* 0.399569955 */, 17 }, - /* 3463 */ { MAD_F(0x066544d6) /* 0.399723851 */, 17 }, - /* 3464 */ { MAD_F(0x0665e639) /* 0.399877761 */, 17 }, - /* 3465 */ { MAD_F(0x066687a0) /* 0.400031686 */, 17 }, - /* 3466 */ { MAD_F(0x0667290b) /* 0.400185625 */, 17 }, - /* 3467 */ { MAD_F(0x0667ca79) /* 0.400339580 */, 17 }, - /* 3468 */ { MAD_F(0x06686bec) /* 0.400493549 */, 17 }, - /* 3469 */ { MAD_F(0x06690d63) /* 0.400647534 */, 17 }, - /* 3470 */ { MAD_F(0x0669aede) /* 0.400801533 */, 17 }, - /* 3471 */ { MAD_F(0x066a505d) /* 0.400955546 */, 17 }, - - /* 3472 */ { MAD_F(0x066af1df) /* 0.401109575 */, 17 }, - /* 3473 */ { MAD_F(0x066b9366) /* 0.401263618 */, 17 }, - /* 3474 */ { MAD_F(0x066c34f1) /* 0.401417676 */, 17 }, - /* 3475 */ { MAD_F(0x066cd67f) /* 0.401571749 */, 17 }, - /* 3476 */ { MAD_F(0x066d7812) /* 0.401725837 */, 17 }, - /* 3477 */ { MAD_F(0x066e19a9) /* 0.401879939 */, 17 }, - /* 3478 */ { MAD_F(0x066ebb43) /* 0.402034056 */, 17 }, - /* 3479 */ { MAD_F(0x066f5ce2) /* 0.402188188 */, 17 }, - /* 3480 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 17 }, - /* 3481 */ { MAD_F(0x0670a02a) /* 0.402496497 */, 17 }, - /* 3482 */ { MAD_F(0x067141d5) /* 0.402650673 */, 17 }, - /* 3483 */ { MAD_F(0x0671e383) /* 0.402804864 */, 17 }, - /* 3484 */ { MAD_F(0x06728535) /* 0.402959070 */, 17 }, - /* 3485 */ { MAD_F(0x067326ec) /* 0.403113291 */, 17 }, - /* 3486 */ { MAD_F(0x0673c8a6) /* 0.403267526 */, 17 }, - /* 3487 */ { MAD_F(0x06746a64) /* 0.403421776 */, 17 }, - - /* 3488 */ { MAD_F(0x06750c26) /* 0.403576041 */, 17 }, - /* 3489 */ { MAD_F(0x0675adec) /* 0.403730320 */, 17 }, - /* 3490 */ { MAD_F(0x06764fb6) /* 0.403884615 */, 17 }, - /* 3491 */ { MAD_F(0x0676f184) /* 0.404038924 */, 17 }, - /* 3492 */ { MAD_F(0x06779356) /* 0.404193247 */, 17 }, - /* 3493 */ { MAD_F(0x0678352c) /* 0.404347586 */, 17 }, - /* 3494 */ { MAD_F(0x0678d706) /* 0.404501939 */, 17 }, - /* 3495 */ { MAD_F(0x067978e4) /* 0.404656307 */, 17 }, - /* 3496 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 17 }, - /* 3497 */ { MAD_F(0x067abcac) /* 0.404965087 */, 17 }, - /* 3498 */ { MAD_F(0x067b5e95) /* 0.405119499 */, 17 }, - /* 3499 */ { MAD_F(0x067c0083) /* 0.405273926 */, 17 }, - /* 3500 */ { MAD_F(0x067ca275) /* 0.405428368 */, 17 }, - /* 3501 */ { MAD_F(0x067d446a) /* 0.405582824 */, 17 }, - /* 3502 */ { MAD_F(0x067de664) /* 0.405737295 */, 17 }, - /* 3503 */ { MAD_F(0x067e8861) /* 0.405891781 */, 17 }, - - /* 3504 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 17 }, - /* 3505 */ { MAD_F(0x067fcc68) /* 0.406200796 */, 17 }, - /* 3506 */ { MAD_F(0x06806e71) /* 0.406355326 */, 17 }, - /* 3507 */ { MAD_F(0x0681107e) /* 0.406509870 */, 17 }, - /* 3508 */ { MAD_F(0x0681b28f) /* 0.406664429 */, 17 }, - /* 3509 */ { MAD_F(0x068254a4) /* 0.406819003 */, 17 }, - /* 3510 */ { MAD_F(0x0682f6bd) /* 0.406973592 */, 17 }, - /* 3511 */ { MAD_F(0x068398da) /* 0.407128195 */, 17 }, - /* 3512 */ { MAD_F(0x06843afb) /* 0.407282813 */, 17 }, - /* 3513 */ { MAD_F(0x0684dd20) /* 0.407437445 */, 17 }, - /* 3514 */ { MAD_F(0x06857f49) /* 0.407592093 */, 17 }, - /* 3515 */ { MAD_F(0x06862176) /* 0.407746754 */, 17 }, - /* 3516 */ { MAD_F(0x0686c3a6) /* 0.407901431 */, 17 }, - /* 3517 */ { MAD_F(0x068765db) /* 0.408056122 */, 17 }, - /* 3518 */ { MAD_F(0x06880814) /* 0.408210828 */, 17 }, - /* 3519 */ { MAD_F(0x0688aa50) /* 0.408365549 */, 17 }, - - /* 3520 */ { MAD_F(0x06894c90) /* 0.408520284 */, 17 }, - /* 3521 */ { MAD_F(0x0689eed5) /* 0.408675034 */, 17 }, - /* 3522 */ { MAD_F(0x068a911d) /* 0.408829798 */, 17 }, - /* 3523 */ { MAD_F(0x068b3369) /* 0.408984577 */, 17 }, - /* 3524 */ { MAD_F(0x068bd5b9) /* 0.409139371 */, 17 }, - /* 3525 */ { MAD_F(0x068c780e) /* 0.409294180 */, 17 }, - /* 3526 */ { MAD_F(0x068d1a66) /* 0.409449003 */, 17 }, - /* 3527 */ { MAD_F(0x068dbcc1) /* 0.409603840 */, 17 }, - /* 3528 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 17 }, - /* 3529 */ { MAD_F(0x068f0185) /* 0.409913560 */, 17 }, - /* 3530 */ { MAD_F(0x068fa3ed) /* 0.410068441 */, 17 }, - /* 3531 */ { MAD_F(0x06904658) /* 0.410223338 */, 17 }, - /* 3532 */ { MAD_F(0x0690e8c8) /* 0.410378249 */, 17 }, - /* 3533 */ { MAD_F(0x06918b3c) /* 0.410533174 */, 17 }, - /* 3534 */ { MAD_F(0x06922db3) /* 0.410688114 */, 17 }, - /* 3535 */ { MAD_F(0x0692d02e) /* 0.410843069 */, 17 }, - - /* 3536 */ { MAD_F(0x069372ae) /* 0.410998038 */, 17 }, - /* 3537 */ { MAD_F(0x06941531) /* 0.411153022 */, 17 }, - /* 3538 */ { MAD_F(0x0694b7b8) /* 0.411308021 */, 17 }, - /* 3539 */ { MAD_F(0x06955a43) /* 0.411463034 */, 17 }, - /* 3540 */ { MAD_F(0x0695fcd2) /* 0.411618062 */, 17 }, - /* 3541 */ { MAD_F(0x06969f65) /* 0.411773104 */, 17 }, - /* 3542 */ { MAD_F(0x069741fb) /* 0.411928161 */, 17 }, - /* 3543 */ { MAD_F(0x0697e496) /* 0.412083232 */, 17 }, - /* 3544 */ { MAD_F(0x06988735) /* 0.412238319 */, 17 }, - /* 3545 */ { MAD_F(0x069929d7) /* 0.412393419 */, 17 }, - /* 3546 */ { MAD_F(0x0699cc7e) /* 0.412548535 */, 17 }, - /* 3547 */ { MAD_F(0x069a6f28) /* 0.412703664 */, 17 }, - /* 3548 */ { MAD_F(0x069b11d6) /* 0.412858809 */, 17 }, - /* 3549 */ { MAD_F(0x069bb489) /* 0.413013968 */, 17 }, - /* 3550 */ { MAD_F(0x069c573f) /* 0.413169142 */, 17 }, - /* 3551 */ { MAD_F(0x069cf9f9) /* 0.413324330 */, 17 }, - - /* 3552 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 17 }, - /* 3553 */ { MAD_F(0x069e3f78) /* 0.413634750 */, 17 }, - /* 3554 */ { MAD_F(0x069ee23e) /* 0.413789982 */, 17 }, - /* 3555 */ { MAD_F(0x069f8508) /* 0.413945228 */, 17 }, - /* 3556 */ { MAD_F(0x06a027d5) /* 0.414100489 */, 17 }, - /* 3557 */ { MAD_F(0x06a0caa7) /* 0.414255765 */, 17 }, - /* 3558 */ { MAD_F(0x06a16d7c) /* 0.414411055 */, 17 }, - /* 3559 */ { MAD_F(0x06a21055) /* 0.414566359 */, 17 }, - /* 3560 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 17 }, - /* 3561 */ { MAD_F(0x06a35614) /* 0.414877012 */, 17 }, - /* 3562 */ { MAD_F(0x06a3f8f9) /* 0.415032361 */, 17 }, - /* 3563 */ { MAD_F(0x06a49be2) /* 0.415187723 */, 17 }, - /* 3564 */ { MAD_F(0x06a53ece) /* 0.415343101 */, 17 }, - /* 3565 */ { MAD_F(0x06a5e1bf) /* 0.415498493 */, 17 }, - /* 3566 */ { MAD_F(0x06a684b4) /* 0.415653899 */, 17 }, - /* 3567 */ { MAD_F(0x06a727ac) /* 0.415809320 */, 17 }, - - /* 3568 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 17 }, - /* 3569 */ { MAD_F(0x06a86da9) /* 0.416120206 */, 17 }, - /* 3570 */ { MAD_F(0x06a910ad) /* 0.416275670 */, 17 }, - /* 3571 */ { MAD_F(0x06a9b3b5) /* 0.416431149 */, 17 }, - /* 3572 */ { MAD_F(0x06aa56c1) /* 0.416586643 */, 17 }, - /* 3573 */ { MAD_F(0x06aaf9d1) /* 0.416742151 */, 17 }, - /* 3574 */ { MAD_F(0x06ab9ce5) /* 0.416897673 */, 17 }, - /* 3575 */ { MAD_F(0x06ac3ffc) /* 0.417053210 */, 17 }, - /* 3576 */ { MAD_F(0x06ace318) /* 0.417208762 */, 17 }, - /* 3577 */ { MAD_F(0x06ad8637) /* 0.417364328 */, 17 }, - /* 3578 */ { MAD_F(0x06ae295b) /* 0.417519909 */, 17 }, - /* 3579 */ { MAD_F(0x06aecc82) /* 0.417675504 */, 17 }, - /* 3580 */ { MAD_F(0x06af6fad) /* 0.417831113 */, 17 }, - /* 3581 */ { MAD_F(0x06b012dc) /* 0.417986737 */, 17 }, - /* 3582 */ { MAD_F(0x06b0b60f) /* 0.418142376 */, 17 }, - /* 3583 */ { MAD_F(0x06b15946) /* 0.418298029 */, 17 }, - - /* 3584 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 17 }, - /* 3585 */ { MAD_F(0x06b29fbf) /* 0.418609378 */, 17 }, - /* 3586 */ { MAD_F(0x06b34302) /* 0.418765075 */, 17 }, - /* 3587 */ { MAD_F(0x06b3e648) /* 0.418920786 */, 17 }, - /* 3588 */ { MAD_F(0x06b48992) /* 0.419076511 */, 17 }, - /* 3589 */ { MAD_F(0x06b52ce0) /* 0.419232251 */, 17 }, - /* 3590 */ { MAD_F(0x06b5d032) /* 0.419388005 */, 17 }, - /* 3591 */ { MAD_F(0x06b67388) /* 0.419543774 */, 17 }, - /* 3592 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 17 }, - /* 3593 */ { MAD_F(0x06b7ba3f) /* 0.419855355 */, 17 }, - /* 3594 */ { MAD_F(0x06b85da1) /* 0.420011167 */, 17 }, - /* 3595 */ { MAD_F(0x06b90106) /* 0.420166994 */, 17 }, - /* 3596 */ { MAD_F(0x06b9a470) /* 0.420322835 */, 17 }, - /* 3597 */ { MAD_F(0x06ba47dd) /* 0.420478690 */, 17 }, - /* 3598 */ { MAD_F(0x06baeb4e) /* 0.420634560 */, 17 }, - /* 3599 */ { MAD_F(0x06bb8ec3) /* 0.420790445 */, 17 }, - - /* 3600 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 17 }, - /* 3601 */ { MAD_F(0x06bcd5b8) /* 0.421102257 */, 17 }, - /* 3602 */ { MAD_F(0x06bd7939) /* 0.421258184 */, 17 }, - /* 3603 */ { MAD_F(0x06be1cbd) /* 0.421414127 */, 17 }, - /* 3604 */ { MAD_F(0x06bec045) /* 0.421570083 */, 17 }, - /* 3605 */ { MAD_F(0x06bf63d1) /* 0.421726054 */, 17 }, - /* 3606 */ { MAD_F(0x06c00761) /* 0.421882040 */, 17 }, - /* 3607 */ { MAD_F(0x06c0aaf5) /* 0.422038039 */, 17 }, - /* 3608 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 17 }, - /* 3609 */ { MAD_F(0x06c1f229) /* 0.422350082 */, 17 }, - /* 3610 */ { MAD_F(0x06c295c8) /* 0.422506125 */, 17 }, - /* 3611 */ { MAD_F(0x06c3396c) /* 0.422662183 */, 17 }, - /* 3612 */ { MAD_F(0x06c3dd13) /* 0.422818255 */, 17 }, - /* 3613 */ { MAD_F(0x06c480be) /* 0.422974341 */, 17 }, - /* 3614 */ { MAD_F(0x06c5246d) /* 0.423130442 */, 17 }, - /* 3615 */ { MAD_F(0x06c5c820) /* 0.423286557 */, 17 }, - - /* 3616 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 17 }, - /* 3617 */ { MAD_F(0x06c70f91) /* 0.423598830 */, 17 }, - /* 3618 */ { MAD_F(0x06c7b34f) /* 0.423754988 */, 17 }, - /* 3619 */ { MAD_F(0x06c85712) /* 0.423911161 */, 17 }, - /* 3620 */ { MAD_F(0x06c8fad8) /* 0.424067348 */, 17 }, - /* 3621 */ { MAD_F(0x06c99ea2) /* 0.424223550 */, 17 }, - /* 3622 */ { MAD_F(0x06ca4270) /* 0.424379765 */, 17 }, - /* 3623 */ { MAD_F(0x06cae641) /* 0.424535996 */, 17 }, - /* 3624 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 17 }, - /* 3625 */ { MAD_F(0x06cc2df0) /* 0.424848499 */, 17 }, - /* 3626 */ { MAD_F(0x06ccd1ce) /* 0.425004772 */, 17 }, - /* 3627 */ { MAD_F(0x06cd75af) /* 0.425161060 */, 17 }, - /* 3628 */ { MAD_F(0x06ce1994) /* 0.425317362 */, 17 }, - /* 3629 */ { MAD_F(0x06cebd7d) /* 0.425473678 */, 17 }, - /* 3630 */ { MAD_F(0x06cf6169) /* 0.425630009 */, 17 }, - /* 3631 */ { MAD_F(0x06d0055a) /* 0.425786354 */, 17 }, - - /* 3632 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 17 }, - /* 3633 */ { MAD_F(0x06d14d47) /* 0.426099088 */, 17 }, - /* 3634 */ { MAD_F(0x06d1f143) /* 0.426255476 */, 17 }, - /* 3635 */ { MAD_F(0x06d29543) /* 0.426411878 */, 17 }, - /* 3636 */ { MAD_F(0x06d33947) /* 0.426568295 */, 17 }, - /* 3637 */ { MAD_F(0x06d3dd4e) /* 0.426724726 */, 17 }, - /* 3638 */ { MAD_F(0x06d4815a) /* 0.426881172 */, 17 }, - /* 3639 */ { MAD_F(0x06d52569) /* 0.427037632 */, 17 }, - /* 3640 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 17 }, - /* 3641 */ { MAD_F(0x06d66d93) /* 0.427350594 */, 17 }, - /* 3642 */ { MAD_F(0x06d711ae) /* 0.427507097 */, 17 }, - /* 3643 */ { MAD_F(0x06d7b5cd) /* 0.427663614 */, 17 }, - /* 3644 */ { MAD_F(0x06d859f0) /* 0.427820146 */, 17 }, - /* 3645 */ { MAD_F(0x06d8fe16) /* 0.427976692 */, 17 }, - /* 3646 */ { MAD_F(0x06d9a240) /* 0.428133252 */, 17 }, - /* 3647 */ { MAD_F(0x06da466f) /* 0.428289826 */, 17 }, - - /* 3648 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 17 }, - /* 3649 */ { MAD_F(0x06db8ed6) /* 0.428603018 */, 17 }, - /* 3650 */ { MAD_F(0x06dc3310) /* 0.428759635 */, 17 }, - /* 3651 */ { MAD_F(0x06dcd74d) /* 0.428916267 */, 17 }, - /* 3652 */ { MAD_F(0x06dd7b8f) /* 0.429072913 */, 17 }, - /* 3653 */ { MAD_F(0x06de1fd4) /* 0.429229573 */, 17 }, - /* 3654 */ { MAD_F(0x06dec41d) /* 0.429386248 */, 17 }, - /* 3655 */ { MAD_F(0x06df686a) /* 0.429542937 */, 17 }, - /* 3656 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 17 }, - /* 3657 */ { MAD_F(0x06e0b10f) /* 0.429856357 */, 17 }, - /* 3658 */ { MAD_F(0x06e15567) /* 0.430013089 */, 17 }, - /* 3659 */ { MAD_F(0x06e1f9c4) /* 0.430169835 */, 17 }, - /* 3660 */ { MAD_F(0x06e29e24) /* 0.430326595 */, 17 }, - /* 3661 */ { MAD_F(0x06e34287) /* 0.430483370 */, 17 }, - /* 3662 */ { MAD_F(0x06e3e6ef) /* 0.430640159 */, 17 }, - /* 3663 */ { MAD_F(0x06e48b5b) /* 0.430796962 */, 17 }, - - /* 3664 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 17 }, - /* 3665 */ { MAD_F(0x06e5d43d) /* 0.431110611 */, 17 }, - /* 3666 */ { MAD_F(0x06e678b4) /* 0.431267457 */, 17 }, - /* 3667 */ { MAD_F(0x06e71d2f) /* 0.431424317 */, 17 }, - /* 3668 */ { MAD_F(0x06e7c1ae) /* 0.431581192 */, 17 }, - /* 3669 */ { MAD_F(0x06e86630) /* 0.431738080 */, 17 }, - /* 3670 */ { MAD_F(0x06e90ab7) /* 0.431894983 */, 17 }, - /* 3671 */ { MAD_F(0x06e9af41) /* 0.432051900 */, 17 }, - /* 3672 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 17 }, - /* 3673 */ { MAD_F(0x06eaf860) /* 0.432365778 */, 17 }, - /* 3674 */ { MAD_F(0x06eb9cf6) /* 0.432522737 */, 17 }, - /* 3675 */ { MAD_F(0x06ec418f) /* 0.432679712 */, 17 }, - /* 3676 */ { MAD_F(0x06ece62d) /* 0.432836700 */, 17 }, - /* 3677 */ { MAD_F(0x06ed8ace) /* 0.432993703 */, 17 }, - /* 3678 */ { MAD_F(0x06ee2f73) /* 0.433150720 */, 17 }, - /* 3679 */ { MAD_F(0x06eed41b) /* 0.433307751 */, 17 }, - - /* 3680 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 17 }, - /* 3681 */ { MAD_F(0x06f01d78) /* 0.433621856 */, 17 }, - /* 3682 */ { MAD_F(0x06f0c22c) /* 0.433778929 */, 17 }, - /* 3683 */ { MAD_F(0x06f166e4) /* 0.433936017 */, 17 }, - /* 3684 */ { MAD_F(0x06f20ba0) /* 0.434093120 */, 17 }, - /* 3685 */ { MAD_F(0x06f2b060) /* 0.434250236 */, 17 }, - /* 3686 */ { MAD_F(0x06f35523) /* 0.434407367 */, 17 }, - /* 3687 */ { MAD_F(0x06f3f9eb) /* 0.434564512 */, 17 }, - /* 3688 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 17 }, - /* 3689 */ { MAD_F(0x06f54385) /* 0.434878844 */, 17 }, - /* 3690 */ { MAD_F(0x06f5e857) /* 0.435036032 */, 17 }, - /* 3691 */ { MAD_F(0x06f68d2e) /* 0.435193233 */, 17 }, - /* 3692 */ { MAD_F(0x06f73208) /* 0.435350449 */, 17 }, - /* 3693 */ { MAD_F(0x06f7d6e6) /* 0.435507679 */, 17 }, - /* 3694 */ { MAD_F(0x06f87bc8) /* 0.435664924 */, 17 }, - /* 3695 */ { MAD_F(0x06f920ae) /* 0.435822182 */, 17 }, - - /* 3696 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 17 }, - /* 3697 */ { MAD_F(0x06fa6a85) /* 0.436136741 */, 17 }, - /* 3698 */ { MAD_F(0x06fb0f76) /* 0.436294042 */, 17 }, - /* 3699 */ { MAD_F(0x06fbb46b) /* 0.436451358 */, 17 }, - /* 3700 */ { MAD_F(0x06fc5964) /* 0.436608687 */, 17 }, - /* 3701 */ { MAD_F(0x06fcfe60) /* 0.436766031 */, 17 }, - /* 3702 */ { MAD_F(0x06fda361) /* 0.436923388 */, 17 }, - /* 3703 */ { MAD_F(0x06fe4865) /* 0.437080760 */, 17 }, - /* 3704 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 17 }, - /* 3705 */ { MAD_F(0x06ff9279) /* 0.437395547 */, 17 }, - /* 3706 */ { MAD_F(0x07003788) /* 0.437552961 */, 17 }, - /* 3707 */ { MAD_F(0x0700dc9c) /* 0.437710389 */, 17 }, - /* 3708 */ { MAD_F(0x070181b3) /* 0.437867832 */, 17 }, - /* 3709 */ { MAD_F(0x070226ce) /* 0.438025289 */, 17 }, - /* 3710 */ { MAD_F(0x0702cbed) /* 0.438182760 */, 17 }, - /* 3711 */ { MAD_F(0x0703710f) /* 0.438340245 */, 17 }, - - /* 3712 */ { MAD_F(0x07041636) /* 0.438497744 */, 17 }, - /* 3713 */ { MAD_F(0x0704bb60) /* 0.438655258 */, 17 }, - /* 3714 */ { MAD_F(0x0705608e) /* 0.438812785 */, 17 }, - /* 3715 */ { MAD_F(0x070605c0) /* 0.438970327 */, 17 }, - /* 3716 */ { MAD_F(0x0706aaf5) /* 0.439127883 */, 17 }, - /* 3717 */ { MAD_F(0x0707502f) /* 0.439285453 */, 17 }, - /* 3718 */ { MAD_F(0x0707f56c) /* 0.439443037 */, 17 }, - /* 3719 */ { MAD_F(0x07089aad) /* 0.439600635 */, 17 }, - /* 3720 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 17 }, - /* 3721 */ { MAD_F(0x0709e53a) /* 0.439915874 */, 17 }, - /* 3722 */ { MAD_F(0x070a8a86) /* 0.440073515 */, 17 }, - /* 3723 */ { MAD_F(0x070b2fd7) /* 0.440231170 */, 17 }, - /* 3724 */ { MAD_F(0x070bd52a) /* 0.440388839 */, 17 }, - /* 3725 */ { MAD_F(0x070c7a82) /* 0.440546522 */, 17 }, - /* 3726 */ { MAD_F(0x070d1fde) /* 0.440704219 */, 17 }, - /* 3727 */ { MAD_F(0x070dc53d) /* 0.440861930 */, 17 }, - - /* 3728 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 17 }, - /* 3729 */ { MAD_F(0x070f1007) /* 0.441177395 */, 17 }, - /* 3730 */ { MAD_F(0x070fb571) /* 0.441335148 */, 17 }, - /* 3731 */ { MAD_F(0x07105ae0) /* 0.441492916 */, 17 }, - /* 3732 */ { MAD_F(0x07110052) /* 0.441650697 */, 17 }, - /* 3733 */ { MAD_F(0x0711a5c8) /* 0.441808493 */, 17 }, - /* 3734 */ { MAD_F(0x07124b42) /* 0.441966303 */, 17 }, - /* 3735 */ { MAD_F(0x0712f0bf) /* 0.442124127 */, 17 }, - /* 3736 */ { MAD_F(0x07139641) /* 0.442281965 */, 17 }, - /* 3737 */ { MAD_F(0x07143bc6) /* 0.442439817 */, 17 }, - /* 3738 */ { MAD_F(0x0714e14f) /* 0.442597683 */, 17 }, - /* 3739 */ { MAD_F(0x071586db) /* 0.442755564 */, 17 }, - /* 3740 */ { MAD_F(0x07162c6c) /* 0.442913458 */, 17 }, - /* 3741 */ { MAD_F(0x0716d200) /* 0.443071366 */, 17 }, - /* 3742 */ { MAD_F(0x07177798) /* 0.443229289 */, 17 }, - /* 3743 */ { MAD_F(0x07181d34) /* 0.443387226 */, 17 }, - - /* 3744 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 17 }, - /* 3745 */ { MAD_F(0x07196877) /* 0.443703141 */, 17 }, - /* 3746 */ { MAD_F(0x071a0e1e) /* 0.443861120 */, 17 }, - /* 3747 */ { MAD_F(0x071ab3c9) /* 0.444019113 */, 17 }, - /* 3748 */ { MAD_F(0x071b5977) /* 0.444177119 */, 17 }, - /* 3749 */ { MAD_F(0x071bff2a) /* 0.444335140 */, 17 }, - /* 3750 */ { MAD_F(0x071ca4e0) /* 0.444493175 */, 17 }, - /* 3751 */ { MAD_F(0x071d4a9a) /* 0.444651224 */, 17 }, - /* 3752 */ { MAD_F(0x071df058) /* 0.444809288 */, 17 }, - /* 3753 */ { MAD_F(0x071e9619) /* 0.444967365 */, 17 }, - /* 3754 */ { MAD_F(0x071f3bde) /* 0.445125456 */, 17 }, - /* 3755 */ { MAD_F(0x071fe1a8) /* 0.445283561 */, 17 }, - /* 3756 */ { MAD_F(0x07208774) /* 0.445441680 */, 17 }, - /* 3757 */ { MAD_F(0x07212d45) /* 0.445599814 */, 17 }, - /* 3758 */ { MAD_F(0x0721d319) /* 0.445757961 */, 17 }, - /* 3759 */ { MAD_F(0x072278f1) /* 0.445916122 */, 17 }, - - /* 3760 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 17 }, - /* 3761 */ { MAD_F(0x0723c4ad) /* 0.446232487 */, 17 }, - /* 3762 */ { MAD_F(0x07246a90) /* 0.446390690 */, 17 }, - /* 3763 */ { MAD_F(0x07251077) /* 0.446548908 */, 17 }, - /* 3764 */ { MAD_F(0x0725b662) /* 0.446707139 */, 17 }, - /* 3765 */ { MAD_F(0x07265c51) /* 0.446865385 */, 17 }, - /* 3766 */ { MAD_F(0x07270244) /* 0.447023644 */, 17 }, - /* 3767 */ { MAD_F(0x0727a83a) /* 0.447181918 */, 17 }, - /* 3768 */ { MAD_F(0x07284e34) /* 0.447340205 */, 17 }, - /* 3769 */ { MAD_F(0x0728f431) /* 0.447498507 */, 17 }, - /* 3770 */ { MAD_F(0x07299a33) /* 0.447656822 */, 17 }, - /* 3771 */ { MAD_F(0x072a4038) /* 0.447815152 */, 17 }, - /* 3772 */ { MAD_F(0x072ae641) /* 0.447973495 */, 17 }, - /* 3773 */ { MAD_F(0x072b8c4e) /* 0.448131853 */, 17 }, - /* 3774 */ { MAD_F(0x072c325e) /* 0.448290224 */, 17 }, - /* 3775 */ { MAD_F(0x072cd873) /* 0.448448609 */, 17 }, - - /* 3776 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 17 }, - /* 3777 */ { MAD_F(0x072e24a7) /* 0.448765422 */, 17 }, - /* 3778 */ { MAD_F(0x072ecac6) /* 0.448923850 */, 17 }, - /* 3779 */ { MAD_F(0x072f70e9) /* 0.449082291 */, 17 }, - /* 3780 */ { MAD_F(0x07301710) /* 0.449240746 */, 17 }, - /* 3781 */ { MAD_F(0x0730bd3b) /* 0.449399216 */, 17 }, - /* 3782 */ { MAD_F(0x0731636a) /* 0.449557699 */, 17 }, - /* 3783 */ { MAD_F(0x0732099c) /* 0.449716196 */, 17 }, - /* 3784 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 17 }, - /* 3785 */ { MAD_F(0x0733560c) /* 0.450033233 */, 17 }, - /* 3786 */ { MAD_F(0x0733fc49) /* 0.450191772 */, 17 }, - /* 3787 */ { MAD_F(0x0734a28b) /* 0.450350325 */, 17 }, - /* 3788 */ { MAD_F(0x073548d0) /* 0.450508892 */, 17 }, - /* 3789 */ { MAD_F(0x0735ef18) /* 0.450667473 */, 17 }, - /* 3790 */ { MAD_F(0x07369565) /* 0.450826068 */, 17 }, - /* 3791 */ { MAD_F(0x07373bb5) /* 0.450984677 */, 17 }, - - /* 3792 */ { MAD_F(0x0737e209) /* 0.451143300 */, 17 }, - /* 3793 */ { MAD_F(0x07388861) /* 0.451301937 */, 17 }, - /* 3794 */ { MAD_F(0x07392ebc) /* 0.451460588 */, 17 }, - /* 3795 */ { MAD_F(0x0739d51c) /* 0.451619252 */, 17 }, - /* 3796 */ { MAD_F(0x073a7b7f) /* 0.451777931 */, 17 }, - /* 3797 */ { MAD_F(0x073b21e5) /* 0.451936623 */, 17 }, - /* 3798 */ { MAD_F(0x073bc850) /* 0.452095330 */, 17 }, - /* 3799 */ { MAD_F(0x073c6ebe) /* 0.452254050 */, 17 }, - /* 3800 */ { MAD_F(0x073d1530) /* 0.452412785 */, 17 }, - /* 3801 */ { MAD_F(0x073dbba6) /* 0.452571533 */, 17 }, - /* 3802 */ { MAD_F(0x073e621f) /* 0.452730295 */, 17 }, - /* 3803 */ { MAD_F(0x073f089c) /* 0.452889071 */, 17 }, - /* 3804 */ { MAD_F(0x073faf1d) /* 0.453047861 */, 17 }, - /* 3805 */ { MAD_F(0x074055a2) /* 0.453206665 */, 17 }, - /* 3806 */ { MAD_F(0x0740fc2a) /* 0.453365483 */, 17 }, - /* 3807 */ { MAD_F(0x0741a2b6) /* 0.453524315 */, 17 }, - - /* 3808 */ { MAD_F(0x07424946) /* 0.453683161 */, 17 }, - /* 3809 */ { MAD_F(0x0742efd9) /* 0.453842020 */, 17 }, - /* 3810 */ { MAD_F(0x07439671) /* 0.454000894 */, 17 }, - /* 3811 */ { MAD_F(0x07443d0c) /* 0.454159781 */, 17 }, - /* 3812 */ { MAD_F(0x0744e3aa) /* 0.454318683 */, 17 }, - /* 3813 */ { MAD_F(0x07458a4d) /* 0.454477598 */, 17 }, - /* 3814 */ { MAD_F(0x074630f3) /* 0.454636527 */, 17 }, - /* 3815 */ { MAD_F(0x0746d79d) /* 0.454795470 */, 17 }, - /* 3816 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 17 }, - /* 3817 */ { MAD_F(0x074824fc) /* 0.455113397 */, 17 }, - /* 3818 */ { MAD_F(0x0748cbb1) /* 0.455272382 */, 17 }, - /* 3819 */ { MAD_F(0x0749726a) /* 0.455431381 */, 17 }, - /* 3820 */ { MAD_F(0x074a1927) /* 0.455590393 */, 17 }, - /* 3821 */ { MAD_F(0x074abfe7) /* 0.455749419 */, 17 }, - /* 3822 */ { MAD_F(0x074b66ab) /* 0.455908459 */, 17 }, - /* 3823 */ { MAD_F(0x074c0d73) /* 0.456067513 */, 17 }, - - /* 3824 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 17 }, - /* 3825 */ { MAD_F(0x074d5b0d) /* 0.456385663 */, 17 }, - /* 3826 */ { MAD_F(0x074e01e0) /* 0.456544759 */, 17 }, - /* 3827 */ { MAD_F(0x074ea8b7) /* 0.456703868 */, 17 }, - /* 3828 */ { MAD_F(0x074f4f91) /* 0.456862992 */, 17 }, - /* 3829 */ { MAD_F(0x074ff66f) /* 0.457022129 */, 17 }, - /* 3830 */ { MAD_F(0x07509d51) /* 0.457181280 */, 17 }, - /* 3831 */ { MAD_F(0x07514437) /* 0.457340445 */, 17 }, - /* 3832 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 17 }, - /* 3833 */ { MAD_F(0x0752920d) /* 0.457658816 */, 17 }, - /* 3834 */ { MAD_F(0x075338fd) /* 0.457818022 */, 17 }, - /* 3835 */ { MAD_F(0x0753dff2) /* 0.457977243 */, 17 }, - /* 3836 */ { MAD_F(0x075486ea) /* 0.458136477 */, 17 }, - /* 3837 */ { MAD_F(0x07552de6) /* 0.458295725 */, 17 }, - /* 3838 */ { MAD_F(0x0755d4e5) /* 0.458454987 */, 17 }, - /* 3839 */ { MAD_F(0x07567be8) /* 0.458614262 */, 17 }, - - /* 3840 */ { MAD_F(0x075722ef) /* 0.458773552 */, 17 }, - /* 3841 */ { MAD_F(0x0757c9fa) /* 0.458932855 */, 17 }, - /* 3842 */ { MAD_F(0x07587108) /* 0.459092172 */, 17 }, - /* 3843 */ { MAD_F(0x0759181a) /* 0.459251503 */, 17 }, - /* 3844 */ { MAD_F(0x0759bf30) /* 0.459410848 */, 17 }, - /* 3845 */ { MAD_F(0x075a664a) /* 0.459570206 */, 17 }, - /* 3846 */ { MAD_F(0x075b0d67) /* 0.459729579 */, 17 }, - /* 3847 */ { MAD_F(0x075bb488) /* 0.459888965 */, 17 }, - /* 3848 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 17 }, - /* 3849 */ { MAD_F(0x075d02d5) /* 0.460207779 */, 17 }, - /* 3850 */ { MAD_F(0x075daa01) /* 0.460367206 */, 17 }, - /* 3851 */ { MAD_F(0x075e5130) /* 0.460526648 */, 17 }, - /* 3852 */ { MAD_F(0x075ef864) /* 0.460686103 */, 17 }, - /* 3853 */ { MAD_F(0x075f9f9b) /* 0.460845572 */, 17 }, - /* 3854 */ { MAD_F(0x076046d6) /* 0.461005055 */, 17 }, - /* 3855 */ { MAD_F(0x0760ee14) /* 0.461164552 */, 17 }, - - /* 3856 */ { MAD_F(0x07619557) /* 0.461324062 */, 17 }, - /* 3857 */ { MAD_F(0x07623c9d) /* 0.461483586 */, 17 }, - /* 3858 */ { MAD_F(0x0762e3e6) /* 0.461643124 */, 17 }, - /* 3859 */ { MAD_F(0x07638b34) /* 0.461802676 */, 17 }, - /* 3860 */ { MAD_F(0x07643285) /* 0.461962242 */, 17 }, - /* 3861 */ { MAD_F(0x0764d9d9) /* 0.462121821 */, 17 }, - /* 3862 */ { MAD_F(0x07658132) /* 0.462281414 */, 17 }, - /* 3863 */ { MAD_F(0x0766288e) /* 0.462441021 */, 17 }, - /* 3864 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 17 }, - /* 3865 */ { MAD_F(0x07677751) /* 0.462760276 */, 17 }, - /* 3866 */ { MAD_F(0x07681eb9) /* 0.462919924 */, 17 }, - /* 3867 */ { MAD_F(0x0768c624) /* 0.463079586 */, 17 }, - /* 3868 */ { MAD_F(0x07696d92) /* 0.463239262 */, 17 }, - /* 3869 */ { MAD_F(0x076a1505) /* 0.463398951 */, 17 }, - /* 3870 */ { MAD_F(0x076abc7b) /* 0.463558655 */, 17 }, - /* 3871 */ { MAD_F(0x076b63f4) /* 0.463718372 */, 17 }, - - /* 3872 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 17 }, - /* 3873 */ { MAD_F(0x076cb2f3) /* 0.464037847 */, 17 }, - /* 3874 */ { MAD_F(0x076d5a78) /* 0.464197605 */, 17 }, - /* 3875 */ { MAD_F(0x076e0200) /* 0.464357377 */, 17 }, - /* 3876 */ { MAD_F(0x076ea98c) /* 0.464517163 */, 17 }, - /* 3877 */ { MAD_F(0x076f511c) /* 0.464676962 */, 17 }, - /* 3878 */ { MAD_F(0x076ff8b0) /* 0.464836776 */, 17 }, - /* 3879 */ { MAD_F(0x0770a047) /* 0.464996603 */, 17 }, - /* 3880 */ { MAD_F(0x077147e2) /* 0.465156443 */, 17 }, - /* 3881 */ { MAD_F(0x0771ef80) /* 0.465316298 */, 17 }, - /* 3882 */ { MAD_F(0x07729723) /* 0.465476166 */, 17 }, - /* 3883 */ { MAD_F(0x07733ec9) /* 0.465636048 */, 17 }, - /* 3884 */ { MAD_F(0x0773e672) /* 0.465795943 */, 17 }, - /* 3885 */ { MAD_F(0x07748e20) /* 0.465955853 */, 17 }, - /* 3886 */ { MAD_F(0x077535d1) /* 0.466115776 */, 17 }, - /* 3887 */ { MAD_F(0x0775dd85) /* 0.466275713 */, 17 }, - - /* 3888 */ { MAD_F(0x0776853e) /* 0.466435663 */, 17 }, - /* 3889 */ { MAD_F(0x07772cfa) /* 0.466595627 */, 17 }, - /* 3890 */ { MAD_F(0x0777d4ba) /* 0.466755605 */, 17 }, - /* 3891 */ { MAD_F(0x07787c7d) /* 0.466915597 */, 17 }, - /* 3892 */ { MAD_F(0x07792444) /* 0.467075602 */, 17 }, - /* 3893 */ { MAD_F(0x0779cc0f) /* 0.467235621 */, 17 }, - /* 3894 */ { MAD_F(0x077a73dd) /* 0.467395654 */, 17 }, - /* 3895 */ { MAD_F(0x077b1baf) /* 0.467555701 */, 17 }, - /* 3896 */ { MAD_F(0x077bc385) /* 0.467715761 */, 17 }, - /* 3897 */ { MAD_F(0x077c6b5f) /* 0.467875835 */, 17 }, - /* 3898 */ { MAD_F(0x077d133c) /* 0.468035922 */, 17 }, - /* 3899 */ { MAD_F(0x077dbb1d) /* 0.468196023 */, 17 }, - /* 3900 */ { MAD_F(0x077e6301) /* 0.468356138 */, 17 }, - /* 3901 */ { MAD_F(0x077f0ae9) /* 0.468516267 */, 17 }, - /* 3902 */ { MAD_F(0x077fb2d5) /* 0.468676409 */, 17 }, - /* 3903 */ { MAD_F(0x07805ac5) /* 0.468836565 */, 17 }, - - /* 3904 */ { MAD_F(0x078102b8) /* 0.468996735 */, 17 }, - /* 3905 */ { MAD_F(0x0781aaaf) /* 0.469156918 */, 17 }, - /* 3906 */ { MAD_F(0x078252aa) /* 0.469317115 */, 17 }, - /* 3907 */ { MAD_F(0x0782faa8) /* 0.469477326 */, 17 }, - /* 3908 */ { MAD_F(0x0783a2aa) /* 0.469637550 */, 17 }, - /* 3909 */ { MAD_F(0x07844aaf) /* 0.469797788 */, 17 }, - /* 3910 */ { MAD_F(0x0784f2b8) /* 0.469958040 */, 17 }, - /* 3911 */ { MAD_F(0x07859ac5) /* 0.470118305 */, 17 }, - /* 3912 */ { MAD_F(0x078642d6) /* 0.470278584 */, 17 }, - /* 3913 */ { MAD_F(0x0786eaea) /* 0.470438877 */, 17 }, - /* 3914 */ { MAD_F(0x07879302) /* 0.470599183 */, 17 }, - /* 3915 */ { MAD_F(0x07883b1e) /* 0.470759503 */, 17 }, - /* 3916 */ { MAD_F(0x0788e33d) /* 0.470919836 */, 17 }, - /* 3917 */ { MAD_F(0x07898b60) /* 0.471080184 */, 17 }, - /* 3918 */ { MAD_F(0x078a3386) /* 0.471240545 */, 17 }, - /* 3919 */ { MAD_F(0x078adbb0) /* 0.471400919 */, 17 }, - - /* 3920 */ { MAD_F(0x078b83de) /* 0.471561307 */, 17 }, - /* 3921 */ { MAD_F(0x078c2c10) /* 0.471721709 */, 17 }, - /* 3922 */ { MAD_F(0x078cd445) /* 0.471882125 */, 17 }, - /* 3923 */ { MAD_F(0x078d7c7e) /* 0.472042554 */, 17 }, - /* 3924 */ { MAD_F(0x078e24ba) /* 0.472202996 */, 17 }, - /* 3925 */ { MAD_F(0x078eccfb) /* 0.472363453 */, 17 }, - /* 3926 */ { MAD_F(0x078f753e) /* 0.472523923 */, 17 }, - /* 3927 */ { MAD_F(0x07901d86) /* 0.472684406 */, 17 }, - /* 3928 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 17 }, - /* 3929 */ { MAD_F(0x07916e20) /* 0.473005414 */, 17 }, - /* 3930 */ { MAD_F(0x07921672) /* 0.473165939 */, 17 }, - /* 3931 */ { MAD_F(0x0792bec8) /* 0.473326477 */, 17 }, - /* 3932 */ { MAD_F(0x07936722) /* 0.473487029 */, 17 }, - /* 3933 */ { MAD_F(0x07940f80) /* 0.473647594 */, 17 }, - /* 3934 */ { MAD_F(0x0794b7e1) /* 0.473808173 */, 17 }, - /* 3935 */ { MAD_F(0x07956045) /* 0.473968765 */, 17 }, - - /* 3936 */ { MAD_F(0x079608ae) /* 0.474129372 */, 17 }, - /* 3937 */ { MAD_F(0x0796b11a) /* 0.474289991 */, 17 }, - /* 3938 */ { MAD_F(0x0797598a) /* 0.474450625 */, 17 }, - /* 3939 */ { MAD_F(0x079801fd) /* 0.474611272 */, 17 }, - /* 3940 */ { MAD_F(0x0798aa74) /* 0.474771932 */, 17 }, - /* 3941 */ { MAD_F(0x079952ee) /* 0.474932606 */, 17 }, - /* 3942 */ { MAD_F(0x0799fb6d) /* 0.475093294 */, 17 }, - /* 3943 */ { MAD_F(0x079aa3ef) /* 0.475253995 */, 17 }, - /* 3944 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 17 }, - /* 3945 */ { MAD_F(0x079bf4fd) /* 0.475575439 */, 17 }, - /* 3946 */ { MAD_F(0x079c9d8a) /* 0.475736181 */, 17 }, - /* 3947 */ { MAD_F(0x079d461b) /* 0.475896936 */, 17 }, - /* 3948 */ { MAD_F(0x079deeaf) /* 0.476057705 */, 17 }, - /* 3949 */ { MAD_F(0x079e9747) /* 0.476218488 */, 17 }, - /* 3950 */ { MAD_F(0x079f3fe2) /* 0.476379285 */, 17 }, - /* 3951 */ { MAD_F(0x079fe881) /* 0.476540095 */, 17 }, - - /* 3952 */ { MAD_F(0x07a09124) /* 0.476700918 */, 17 }, - /* 3953 */ { MAD_F(0x07a139ca) /* 0.476861755 */, 17 }, - /* 3954 */ { MAD_F(0x07a1e274) /* 0.477022606 */, 17 }, - /* 3955 */ { MAD_F(0x07a28b22) /* 0.477183470 */, 17 }, - /* 3956 */ { MAD_F(0x07a333d3) /* 0.477344348 */, 17 }, - /* 3957 */ { MAD_F(0x07a3dc88) /* 0.477505239 */, 17 }, - /* 3958 */ { MAD_F(0x07a48541) /* 0.477666144 */, 17 }, - /* 3959 */ { MAD_F(0x07a52dfd) /* 0.477827062 */, 17 }, - /* 3960 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 17 }, - /* 3961 */ { MAD_F(0x07a67f80) /* 0.478148940 */, 17 }, - /* 3962 */ { MAD_F(0x07a72847) /* 0.478309899 */, 17 }, - /* 3963 */ { MAD_F(0x07a7d112) /* 0.478470871 */, 17 }, - /* 3964 */ { MAD_F(0x07a879e1) /* 0.478631857 */, 17 }, - /* 3965 */ { MAD_F(0x07a922b3) /* 0.478792857 */, 17 }, - /* 3966 */ { MAD_F(0x07a9cb88) /* 0.478953870 */, 17 }, - /* 3967 */ { MAD_F(0x07aa7462) /* 0.479114897 */, 17 }, - - /* 3968 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 17 }, - /* 3969 */ { MAD_F(0x07abc61f) /* 0.479436991 */, 17 }, - /* 3970 */ { MAD_F(0x07ac6f03) /* 0.479598058 */, 17 }, - /* 3971 */ { MAD_F(0x07ad17eb) /* 0.479759139 */, 17 }, - /* 3972 */ { MAD_F(0x07adc0d6) /* 0.479920233 */, 17 }, - /* 3973 */ { MAD_F(0x07ae69c6) /* 0.480081341 */, 17 }, - /* 3974 */ { MAD_F(0x07af12b8) /* 0.480242463 */, 17 }, - /* 3975 */ { MAD_F(0x07afbbaf) /* 0.480403598 */, 17 }, - /* 3976 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 17 }, - /* 3977 */ { MAD_F(0x07b10da6) /* 0.480725908 */, 17 }, - /* 3978 */ { MAD_F(0x07b1b6a7) /* 0.480887083 */, 17 }, - /* 3979 */ { MAD_F(0x07b25fac) /* 0.481048272 */, 17 }, - /* 3980 */ { MAD_F(0x07b308b5) /* 0.481209475 */, 17 }, - /* 3981 */ { MAD_F(0x07b3b1c1) /* 0.481370691 */, 17 }, - /* 3982 */ { MAD_F(0x07b45ad0) /* 0.481531920 */, 17 }, - /* 3983 */ { MAD_F(0x07b503e4) /* 0.481693163 */, 17 }, - - /* 3984 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 17 }, - /* 3985 */ { MAD_F(0x07b65615) /* 0.482015690 */, 17 }, - /* 3986 */ { MAD_F(0x07b6ff33) /* 0.482176973 */, 17 }, - /* 3987 */ { MAD_F(0x07b7a855) /* 0.482338270 */, 17 }, - /* 3988 */ { MAD_F(0x07b8517b) /* 0.482499580 */, 17 }, - /* 3989 */ { MAD_F(0x07b8faa4) /* 0.482660904 */, 17 }, - /* 3990 */ { MAD_F(0x07b9a3d0) /* 0.482822242 */, 17 }, - /* 3991 */ { MAD_F(0x07ba4d01) /* 0.482983592 */, 17 }, - /* 3992 */ { MAD_F(0x07baf635) /* 0.483144957 */, 17 }, - /* 3993 */ { MAD_F(0x07bb9f6c) /* 0.483306335 */, 17 }, - /* 3994 */ { MAD_F(0x07bc48a7) /* 0.483467726 */, 17 }, - /* 3995 */ { MAD_F(0x07bcf1e6) /* 0.483629131 */, 17 }, - /* 3996 */ { MAD_F(0x07bd9b28) /* 0.483790549 */, 17 }, - /* 3997 */ { MAD_F(0x07be446e) /* 0.483951980 */, 17 }, - /* 3998 */ { MAD_F(0x07beedb8) /* 0.484113426 */, 17 }, - /* 3999 */ { MAD_F(0x07bf9705) /* 0.484274884 */, 17 }, - - /* 4000 */ { MAD_F(0x07c04056) /* 0.484436356 */, 17 }, - /* 4001 */ { MAD_F(0x07c0e9aa) /* 0.484597842 */, 17 }, - /* 4002 */ { MAD_F(0x07c19302) /* 0.484759341 */, 17 }, - /* 4003 */ { MAD_F(0x07c23c5e) /* 0.484920853 */, 17 }, - /* 4004 */ { MAD_F(0x07c2e5bd) /* 0.485082379 */, 17 }, - /* 4005 */ { MAD_F(0x07c38f20) /* 0.485243918 */, 17 }, - /* 4006 */ { MAD_F(0x07c43887) /* 0.485405471 */, 17 }, - /* 4007 */ { MAD_F(0x07c4e1f1) /* 0.485567037 */, 17 }, - /* 4008 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 17 }, - /* 4009 */ { MAD_F(0x07c634d0) /* 0.485890210 */, 17 }, - /* 4010 */ { MAD_F(0x07c6de45) /* 0.486051817 */, 17 }, - /* 4011 */ { MAD_F(0x07c787bd) /* 0.486213436 */, 17 }, - /* 4012 */ { MAD_F(0x07c83139) /* 0.486375070 */, 17 }, - /* 4013 */ { MAD_F(0x07c8dab9) /* 0.486536717 */, 17 }, - /* 4014 */ { MAD_F(0x07c9843c) /* 0.486698377 */, 17 }, - /* 4015 */ { MAD_F(0x07ca2dc3) /* 0.486860051 */, 17 }, - - /* 4016 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 17 }, - /* 4017 */ { MAD_F(0x07cb80dc) /* 0.487183438 */, 17 }, - /* 4018 */ { MAD_F(0x07cc2a6e) /* 0.487345152 */, 17 }, - /* 4019 */ { MAD_F(0x07ccd403) /* 0.487506879 */, 17 }, - /* 4020 */ { MAD_F(0x07cd7d9c) /* 0.487668620 */, 17 }, - /* 4021 */ { MAD_F(0x07ce2739) /* 0.487830374 */, 17 }, - /* 4022 */ { MAD_F(0x07ced0d9) /* 0.487992142 */, 17 }, - /* 4023 */ { MAD_F(0x07cf7a7d) /* 0.488153923 */, 17 }, - /* 4024 */ { MAD_F(0x07d02424) /* 0.488315717 */, 17 }, - /* 4025 */ { MAD_F(0x07d0cdcf) /* 0.488477525 */, 17 }, - /* 4026 */ { MAD_F(0x07d1777e) /* 0.488639346 */, 17 }, - /* 4027 */ { MAD_F(0x07d22130) /* 0.488801181 */, 17 }, - /* 4028 */ { MAD_F(0x07d2cae5) /* 0.488963029 */, 17 }, - /* 4029 */ { MAD_F(0x07d3749f) /* 0.489124890 */, 17 }, - /* 4030 */ { MAD_F(0x07d41e5c) /* 0.489286765 */, 17 }, - /* 4031 */ { MAD_F(0x07d4c81c) /* 0.489448653 */, 17 }, - - /* 4032 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 17 }, - /* 4033 */ { MAD_F(0x07d61ba8) /* 0.489772470 */, 17 }, - /* 4034 */ { MAD_F(0x07d6c573) /* 0.489934398 */, 17 }, - /* 4035 */ { MAD_F(0x07d76f42) /* 0.490096340 */, 17 }, - /* 4036 */ { MAD_F(0x07d81915) /* 0.490258295 */, 17 }, - /* 4037 */ { MAD_F(0x07d8c2eb) /* 0.490420263 */, 17 }, - /* 4038 */ { MAD_F(0x07d96cc4) /* 0.490582245 */, 17 }, - /* 4039 */ { MAD_F(0x07da16a2) /* 0.490744240 */, 17 }, - /* 4040 */ { MAD_F(0x07dac083) /* 0.490906249 */, 17 }, - /* 4041 */ { MAD_F(0x07db6a67) /* 0.491068271 */, 17 }, - /* 4042 */ { MAD_F(0x07dc144f) /* 0.491230306 */, 17 }, - /* 4043 */ { MAD_F(0x07dcbe3b) /* 0.491392355 */, 17 }, - /* 4044 */ { MAD_F(0x07dd682a) /* 0.491554417 */, 17 }, - /* 4045 */ { MAD_F(0x07de121d) /* 0.491716492 */, 17 }, - /* 4046 */ { MAD_F(0x07debc13) /* 0.491878581 */, 17 }, - /* 4047 */ { MAD_F(0x07df660d) /* 0.492040683 */, 17 }, - - /* 4048 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 17 }, - /* 4049 */ { MAD_F(0x07e0ba0c) /* 0.492364928 */, 17 }, - /* 4050 */ { MAD_F(0x07e16410) /* 0.492527070 */, 17 }, - /* 4051 */ { MAD_F(0x07e20e19) /* 0.492689225 */, 17 }, - /* 4052 */ { MAD_F(0x07e2b824) /* 0.492851394 */, 17 }, - /* 4053 */ { MAD_F(0x07e36234) /* 0.493013576 */, 17 }, - /* 4054 */ { MAD_F(0x07e40c47) /* 0.493175772 */, 17 }, - /* 4055 */ { MAD_F(0x07e4b65e) /* 0.493337981 */, 17 }, - /* 4056 */ { MAD_F(0x07e56078) /* 0.493500203 */, 17 }, - /* 4057 */ { MAD_F(0x07e60a95) /* 0.493662438 */, 17 }, - /* 4058 */ { MAD_F(0x07e6b4b7) /* 0.493824687 */, 17 }, - /* 4059 */ { MAD_F(0x07e75edc) /* 0.493986949 */, 17 }, - /* 4060 */ { MAD_F(0x07e80904) /* 0.494149225 */, 17 }, - /* 4061 */ { MAD_F(0x07e8b330) /* 0.494311514 */, 17 }, - /* 4062 */ { MAD_F(0x07e95d60) /* 0.494473816 */, 17 }, - /* 4063 */ { MAD_F(0x07ea0793) /* 0.494636131 */, 17 }, - - /* 4064 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 17 }, - /* 4065 */ { MAD_F(0x07eb5c04) /* 0.494960802 */, 17 }, - /* 4066 */ { MAD_F(0x07ec0642) /* 0.495123158 */, 17 }, - /* 4067 */ { MAD_F(0x07ecb084) /* 0.495285526 */, 17 }, - /* 4068 */ { MAD_F(0x07ed5ac9) /* 0.495447908 */, 17 }, - /* 4069 */ { MAD_F(0x07ee0512) /* 0.495610304 */, 17 }, - /* 4070 */ { MAD_F(0x07eeaf5e) /* 0.495772712 */, 17 }, - /* 4071 */ { MAD_F(0x07ef59ae) /* 0.495935134 */, 17 }, - /* 4072 */ { MAD_F(0x07f00401) /* 0.496097570 */, 17 }, - /* 4073 */ { MAD_F(0x07f0ae58) /* 0.496260018 */, 17 }, - /* 4074 */ { MAD_F(0x07f158b3) /* 0.496422480 */, 17 }, - /* 4075 */ { MAD_F(0x07f20311) /* 0.496584955 */, 17 }, - /* 4076 */ { MAD_F(0x07f2ad72) /* 0.496747444 */, 17 }, - /* 4077 */ { MAD_F(0x07f357d8) /* 0.496909945 */, 17 }, - /* 4078 */ { MAD_F(0x07f40240) /* 0.497072460 */, 17 }, - /* 4079 */ { MAD_F(0x07f4acad) /* 0.497234989 */, 17 }, - - /* 4080 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 17 }, - /* 4081 */ { MAD_F(0x07f60190) /* 0.497560085 */, 17 }, - /* 4082 */ { MAD_F(0x07f6ac07) /* 0.497722653 */, 17 }, - /* 4083 */ { MAD_F(0x07f75682) /* 0.497885235 */, 17 }, - /* 4084 */ { MAD_F(0x07f80100) /* 0.498047829 */, 17 }, - /* 4085 */ { MAD_F(0x07f8ab82) /* 0.498210437 */, 17 }, - /* 4086 */ { MAD_F(0x07f95607) /* 0.498373058 */, 17 }, - /* 4087 */ { MAD_F(0x07fa0090) /* 0.498535693 */, 17 }, - /* 4088 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 17 }, - /* 4089 */ { MAD_F(0x07fb55ac) /* 0.498861002 */, 17 }, - /* 4090 */ { MAD_F(0x07fc0040) /* 0.499023676 */, 17 }, - /* 4091 */ { MAD_F(0x07fcaad7) /* 0.499186364 */, 17 }, - /* 4092 */ { MAD_F(0x07fd5572) /* 0.499349064 */, 17 }, - /* 4093 */ { MAD_F(0x07fe0010) /* 0.499511778 */, 17 }, - /* 4094 */ { MAD_F(0x07feaab2) /* 0.499674506 */, 17 }, - /* 4095 */ { MAD_F(0x07ff5557) /* 0.499837246 */, 17 }, - - /* 4096 */ { MAD_F(0x04000000) /* 0.250000000 */, 18 }, - /* 4097 */ { MAD_F(0x04005556) /* 0.250081384 */, 18 }, - /* 4098 */ { MAD_F(0x0400aaae) /* 0.250162774 */, 18 }, - /* 4099 */ { MAD_F(0x04010008) /* 0.250244170 */, 18 }, - /* 4100 */ { MAD_F(0x04015563) /* 0.250325574 */, 18 }, - /* 4101 */ { MAD_F(0x0401aac1) /* 0.250406984 */, 18 }, - /* 4102 */ { MAD_F(0x04020020) /* 0.250488400 */, 18 }, - /* 4103 */ { MAD_F(0x04025581) /* 0.250569824 */, 18 }, - /* 4104 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 18 }, - /* 4105 */ { MAD_F(0x04030048) /* 0.250732690 */, 18 }, - /* 4106 */ { MAD_F(0x040355ae) /* 0.250814133 */, 18 }, - /* 4107 */ { MAD_F(0x0403ab16) /* 0.250895583 */, 18 }, - /* 4108 */ { MAD_F(0x04040080) /* 0.250977039 */, 18 }, - /* 4109 */ { MAD_F(0x040455eb) /* 0.251058502 */, 18 }, - /* 4110 */ { MAD_F(0x0404ab59) /* 0.251139971 */, 18 }, - /* 4111 */ { MAD_F(0x040500c8) /* 0.251221448 */, 18 }, - - /* 4112 */ { MAD_F(0x04055638) /* 0.251302930 */, 18 }, - /* 4113 */ { MAD_F(0x0405abab) /* 0.251384420 */, 18 }, - /* 4114 */ { MAD_F(0x0406011f) /* 0.251465916 */, 18 }, - /* 4115 */ { MAD_F(0x04065696) /* 0.251547418 */, 18 }, - /* 4116 */ { MAD_F(0x0406ac0e) /* 0.251628927 */, 18 }, - /* 4117 */ { MAD_F(0x04070187) /* 0.251710443 */, 18 }, - /* 4118 */ { MAD_F(0x04075703) /* 0.251791965 */, 18 }, - /* 4119 */ { MAD_F(0x0407ac80) /* 0.251873494 */, 18 }, - /* 4120 */ { MAD_F(0x040801ff) /* 0.251955030 */, 18 }, - /* 4121 */ { MAD_F(0x04085780) /* 0.252036572 */, 18 }, - /* 4122 */ { MAD_F(0x0408ad02) /* 0.252118121 */, 18 }, - /* 4123 */ { MAD_F(0x04090287) /* 0.252199676 */, 18 }, - /* 4124 */ { MAD_F(0x0409580d) /* 0.252281238 */, 18 }, - /* 4125 */ { MAD_F(0x0409ad95) /* 0.252362807 */, 18 }, - /* 4126 */ { MAD_F(0x040a031e) /* 0.252444382 */, 18 }, - /* 4127 */ { MAD_F(0x040a58aa) /* 0.252525963 */, 18 }, - - /* 4128 */ { MAD_F(0x040aae37) /* 0.252607552 */, 18 }, - /* 4129 */ { MAD_F(0x040b03c6) /* 0.252689147 */, 18 }, - /* 4130 */ { MAD_F(0x040b5957) /* 0.252770748 */, 18 }, - /* 4131 */ { MAD_F(0x040baee9) /* 0.252852356 */, 18 }, - /* 4132 */ { MAD_F(0x040c047e) /* 0.252933971 */, 18 }, - /* 4133 */ { MAD_F(0x040c5a14) /* 0.253015592 */, 18 }, - /* 4134 */ { MAD_F(0x040cafab) /* 0.253097220 */, 18 }, - /* 4135 */ { MAD_F(0x040d0545) /* 0.253178854 */, 18 }, - /* 4136 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 18 }, - /* 4137 */ { MAD_F(0x040db07d) /* 0.253342143 */, 18 }, - /* 4138 */ { MAD_F(0x040e061c) /* 0.253423797 */, 18 }, - /* 4139 */ { MAD_F(0x040e5bbd) /* 0.253505457 */, 18 }, - /* 4140 */ { MAD_F(0x040eb15f) /* 0.253587125 */, 18 }, - /* 4141 */ { MAD_F(0x040f0703) /* 0.253668799 */, 18 }, - /* 4142 */ { MAD_F(0x040f5ca9) /* 0.253750479 */, 18 }, - /* 4143 */ { MAD_F(0x040fb251) /* 0.253832166 */, 18 }, - - /* 4144 */ { MAD_F(0x041007fa) /* 0.253913860 */, 18 }, - /* 4145 */ { MAD_F(0x04105da6) /* 0.253995560 */, 18 }, - /* 4146 */ { MAD_F(0x0410b353) /* 0.254077266 */, 18 }, - /* 4147 */ { MAD_F(0x04110901) /* 0.254158980 */, 18 }, - /* 4148 */ { MAD_F(0x04115eb2) /* 0.254240700 */, 18 }, - /* 4149 */ { MAD_F(0x0411b464) /* 0.254322426 */, 18 }, - /* 4150 */ { MAD_F(0x04120a18) /* 0.254404159 */, 18 }, - /* 4151 */ { MAD_F(0x04125fce) /* 0.254485899 */, 18 }, - /* 4152 */ { MAD_F(0x0412b586) /* 0.254567645 */, 18 }, - /* 4153 */ { MAD_F(0x04130b3f) /* 0.254649397 */, 18 }, - /* 4154 */ { MAD_F(0x041360fa) /* 0.254731157 */, 18 }, - /* 4155 */ { MAD_F(0x0413b6b7) /* 0.254812922 */, 18 }, - /* 4156 */ { MAD_F(0x04140c75) /* 0.254894695 */, 18 }, - /* 4157 */ { MAD_F(0x04146236) /* 0.254976474 */, 18 }, - /* 4158 */ { MAD_F(0x0414b7f8) /* 0.255058259 */, 18 }, - /* 4159 */ { MAD_F(0x04150dbc) /* 0.255140051 */, 18 }, - - /* 4160 */ { MAD_F(0x04156381) /* 0.255221850 */, 18 }, - /* 4161 */ { MAD_F(0x0415b949) /* 0.255303655 */, 18 }, - /* 4162 */ { MAD_F(0x04160f12) /* 0.255385467 */, 18 }, - /* 4163 */ { MAD_F(0x041664dd) /* 0.255467285 */, 18 }, - /* 4164 */ { MAD_F(0x0416baaa) /* 0.255549110 */, 18 }, - /* 4165 */ { MAD_F(0x04171078) /* 0.255630941 */, 18 }, - /* 4166 */ { MAD_F(0x04176648) /* 0.255712779 */, 18 }, - /* 4167 */ { MAD_F(0x0417bc1a) /* 0.255794624 */, 18 }, - /* 4168 */ { MAD_F(0x041811ee) /* 0.255876475 */, 18 }, - /* 4169 */ { MAD_F(0x041867c3) /* 0.255958332 */, 18 }, - /* 4170 */ { MAD_F(0x0418bd9b) /* 0.256040196 */, 18 }, - /* 4171 */ { MAD_F(0x04191374) /* 0.256122067 */, 18 }, - /* 4172 */ { MAD_F(0x0419694e) /* 0.256203944 */, 18 }, - /* 4173 */ { MAD_F(0x0419bf2b) /* 0.256285828 */, 18 }, - /* 4174 */ { MAD_F(0x041a1509) /* 0.256367718 */, 18 }, - /* 4175 */ { MAD_F(0x041a6ae9) /* 0.256449615 */, 18 }, - - /* 4176 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 18 }, - /* 4177 */ { MAD_F(0x041b16ae) /* 0.256613428 */, 18 }, - /* 4178 */ { MAD_F(0x041b6c94) /* 0.256695344 */, 18 }, - /* 4179 */ { MAD_F(0x041bc27b) /* 0.256777267 */, 18 }, - /* 4180 */ { MAD_F(0x041c1863) /* 0.256859197 */, 18 }, - /* 4181 */ { MAD_F(0x041c6e4e) /* 0.256941133 */, 18 }, - /* 4182 */ { MAD_F(0x041cc43a) /* 0.257023076 */, 18 }, - /* 4183 */ { MAD_F(0x041d1a28) /* 0.257105025 */, 18 }, - /* 4184 */ { MAD_F(0x041d7018) /* 0.257186980 */, 18 }, - /* 4185 */ { MAD_F(0x041dc60a) /* 0.257268942 */, 18 }, - /* 4186 */ { MAD_F(0x041e1bfd) /* 0.257350911 */, 18 }, - /* 4187 */ { MAD_F(0x041e71f2) /* 0.257432886 */, 18 }, - /* 4188 */ { MAD_F(0x041ec7e9) /* 0.257514868 */, 18 }, - /* 4189 */ { MAD_F(0x041f1de1) /* 0.257596856 */, 18 }, - /* 4190 */ { MAD_F(0x041f73dc) /* 0.257678851 */, 18 }, - /* 4191 */ { MAD_F(0x041fc9d8) /* 0.257760852 */, 18 }, - - /* 4192 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 18 }, - /* 4193 */ { MAD_F(0x042075d5) /* 0.257924875 */, 18 }, - /* 4194 */ { MAD_F(0x0420cbd6) /* 0.258006895 */, 18 }, - /* 4195 */ { MAD_F(0x042121d9) /* 0.258088923 */, 18 }, - /* 4196 */ { MAD_F(0x042177de) /* 0.258170957 */, 18 }, - /* 4197 */ { MAD_F(0x0421cde5) /* 0.258252997 */, 18 }, - /* 4198 */ { MAD_F(0x042223ed) /* 0.258335044 */, 18 }, - /* 4199 */ { MAD_F(0x042279f7) /* 0.258417097 */, 18 }, - /* 4200 */ { MAD_F(0x0422d003) /* 0.258499157 */, 18 }, - /* 4201 */ { MAD_F(0x04232611) /* 0.258581224 */, 18 }, - /* 4202 */ { MAD_F(0x04237c20) /* 0.258663297 */, 18 }, - /* 4203 */ { MAD_F(0x0423d231) /* 0.258745376 */, 18 }, - /* 4204 */ { MAD_F(0x04242844) /* 0.258827462 */, 18 }, - /* 4205 */ { MAD_F(0x04247e58) /* 0.258909555 */, 18 }, - /* 4206 */ { MAD_F(0x0424d46e) /* 0.258991654 */, 18 }, - /* 4207 */ { MAD_F(0x04252a87) /* 0.259073760 */, 18 }, - - /* 4208 */ { MAD_F(0x042580a0) /* 0.259155872 */, 18 }, - /* 4209 */ { MAD_F(0x0425d6bc) /* 0.259237990 */, 18 }, - /* 4210 */ { MAD_F(0x04262cd9) /* 0.259320115 */, 18 }, - /* 4211 */ { MAD_F(0x042682f8) /* 0.259402247 */, 18 }, - /* 4212 */ { MAD_F(0x0426d919) /* 0.259484385 */, 18 }, - /* 4213 */ { MAD_F(0x04272f3b) /* 0.259566529 */, 18 }, - /* 4214 */ { MAD_F(0x04278560) /* 0.259648680 */, 18 }, - /* 4215 */ { MAD_F(0x0427db86) /* 0.259730838 */, 18 }, - /* 4216 */ { MAD_F(0x042831ad) /* 0.259813002 */, 18 }, - /* 4217 */ { MAD_F(0x042887d7) /* 0.259895173 */, 18 }, - /* 4218 */ { MAD_F(0x0428de02) /* 0.259977350 */, 18 }, - /* 4219 */ { MAD_F(0x0429342f) /* 0.260059533 */, 18 }, - /* 4220 */ { MAD_F(0x04298a5e) /* 0.260141723 */, 18 }, - /* 4221 */ { MAD_F(0x0429e08e) /* 0.260223920 */, 18 }, - /* 4222 */ { MAD_F(0x042a36c0) /* 0.260306123 */, 18 }, - /* 4223 */ { MAD_F(0x042a8cf4) /* 0.260388332 */, 18 }, - - /* 4224 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 18 }, - /* 4225 */ { MAD_F(0x042b3962) /* 0.260552771 */, 18 }, - /* 4226 */ { MAD_F(0x042b8f9b) /* 0.260635000 */, 18 }, - /* 4227 */ { MAD_F(0x042be5d6) /* 0.260717235 */, 18 }, - /* 4228 */ { MAD_F(0x042c3c12) /* 0.260799477 */, 18 }, - /* 4229 */ { MAD_F(0x042c9251) /* 0.260881725 */, 18 }, - /* 4230 */ { MAD_F(0x042ce891) /* 0.260963980 */, 18 }, - /* 4231 */ { MAD_F(0x042d3ed3) /* 0.261046242 */, 18 }, - /* 4232 */ { MAD_F(0x042d9516) /* 0.261128510 */, 18 }, - /* 4233 */ { MAD_F(0x042deb5c) /* 0.261210784 */, 18 }, - /* 4234 */ { MAD_F(0x042e41a3) /* 0.261293065 */, 18 }, - /* 4235 */ { MAD_F(0x042e97ec) /* 0.261375352 */, 18 }, - /* 4236 */ { MAD_F(0x042eee36) /* 0.261457646 */, 18 }, - /* 4237 */ { MAD_F(0x042f4482) /* 0.261539946 */, 18 }, - /* 4238 */ { MAD_F(0x042f9ad1) /* 0.261622253 */, 18 }, - /* 4239 */ { MAD_F(0x042ff120) /* 0.261704566 */, 18 }, - - /* 4240 */ { MAD_F(0x04304772) /* 0.261786886 */, 18 }, - /* 4241 */ { MAD_F(0x04309dc5) /* 0.261869212 */, 18 }, - /* 4242 */ { MAD_F(0x0430f41a) /* 0.261951545 */, 18 }, - /* 4243 */ { MAD_F(0x04314a71) /* 0.262033884 */, 18 }, - /* 4244 */ { MAD_F(0x0431a0c9) /* 0.262116229 */, 18 }, - /* 4245 */ { MAD_F(0x0431f723) /* 0.262198581 */, 18 }, - /* 4246 */ { MAD_F(0x04324d7f) /* 0.262280940 */, 18 }, - /* 4247 */ { MAD_F(0x0432a3dd) /* 0.262363305 */, 18 }, - /* 4248 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 18 }, - /* 4249 */ { MAD_F(0x0433509e) /* 0.262528054 */, 18 }, - /* 4250 */ { MAD_F(0x0433a701) /* 0.262610438 */, 18 }, - /* 4251 */ { MAD_F(0x0433fd65) /* 0.262692829 */, 18 }, - /* 4252 */ { MAD_F(0x043453cc) /* 0.262775227 */, 18 }, - /* 4253 */ { MAD_F(0x0434aa34) /* 0.262857630 */, 18 }, - /* 4254 */ { MAD_F(0x0435009d) /* 0.262940040 */, 18 }, - /* 4255 */ { MAD_F(0x04355709) /* 0.263022457 */, 18 }, - - /* 4256 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 18 }, - /* 4257 */ { MAD_F(0x043603e5) /* 0.263187310 */, 18 }, - /* 4258 */ { MAD_F(0x04365a56) /* 0.263269746 */, 18 }, - /* 4259 */ { MAD_F(0x0436b0c9) /* 0.263352188 */, 18 }, - /* 4260 */ { MAD_F(0x0437073d) /* 0.263434637 */, 18 }, - /* 4261 */ { MAD_F(0x04375db3) /* 0.263517093 */, 18 }, - /* 4262 */ { MAD_F(0x0437b42a) /* 0.263599554 */, 18 }, - /* 4263 */ { MAD_F(0x04380aa4) /* 0.263682023 */, 18 }, - /* 4264 */ { MAD_F(0x0438611f) /* 0.263764497 */, 18 }, - /* 4265 */ { MAD_F(0x0438b79c) /* 0.263846979 */, 18 }, - /* 4266 */ { MAD_F(0x04390e1a) /* 0.263929466 */, 18 }, - /* 4267 */ { MAD_F(0x0439649b) /* 0.264011960 */, 18 }, - /* 4268 */ { MAD_F(0x0439bb1d) /* 0.264094461 */, 18 }, - /* 4269 */ { MAD_F(0x043a11a1) /* 0.264176968 */, 18 }, - /* 4270 */ { MAD_F(0x043a6826) /* 0.264259481 */, 18 }, - /* 4271 */ { MAD_F(0x043abead) /* 0.264342001 */, 18 }, - - /* 4272 */ { MAD_F(0x043b1536) /* 0.264424527 */, 18 }, - /* 4273 */ { MAD_F(0x043b6bc1) /* 0.264507060 */, 18 }, - /* 4274 */ { MAD_F(0x043bc24d) /* 0.264589599 */, 18 }, - /* 4275 */ { MAD_F(0x043c18dc) /* 0.264672145 */, 18 }, - /* 4276 */ { MAD_F(0x043c6f6c) /* 0.264754697 */, 18 }, - /* 4277 */ { MAD_F(0x043cc5fd) /* 0.264837255 */, 18 }, - /* 4278 */ { MAD_F(0x043d1c91) /* 0.264919820 */, 18 }, - /* 4279 */ { MAD_F(0x043d7326) /* 0.265002392 */, 18 }, - /* 4280 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 18 }, - /* 4281 */ { MAD_F(0x043e2055) /* 0.265167554 */, 18 }, - /* 4282 */ { MAD_F(0x043e76ef) /* 0.265250144 */, 18 }, - /* 4283 */ { MAD_F(0x043ecd8b) /* 0.265332741 */, 18 }, - /* 4284 */ { MAD_F(0x043f2429) /* 0.265415345 */, 18 }, - /* 4285 */ { MAD_F(0x043f7ac8) /* 0.265497955 */, 18 }, - /* 4286 */ { MAD_F(0x043fd169) /* 0.265580571 */, 18 }, - /* 4287 */ { MAD_F(0x0440280c) /* 0.265663194 */, 18 }, - - /* 4288 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 18 }, - /* 4289 */ { MAD_F(0x0440d557) /* 0.265828459 */, 18 }, - /* 4290 */ { MAD_F(0x04412bff) /* 0.265911101 */, 18 }, - /* 4291 */ { MAD_F(0x044182a9) /* 0.265993749 */, 18 }, - /* 4292 */ { MAD_F(0x0441d955) /* 0.266076404 */, 18 }, - /* 4293 */ { MAD_F(0x04423002) /* 0.266159065 */, 18 }, - /* 4294 */ { MAD_F(0x044286b1) /* 0.266241733 */, 18 }, - /* 4295 */ { MAD_F(0x0442dd61) /* 0.266324407 */, 18 }, - /* 4296 */ { MAD_F(0x04433414) /* 0.266407088 */, 18 }, - /* 4297 */ { MAD_F(0x04438ac8) /* 0.266489775 */, 18 }, - /* 4298 */ { MAD_F(0x0443e17e) /* 0.266572468 */, 18 }, - /* 4299 */ { MAD_F(0x04443835) /* 0.266655168 */, 18 }, - /* 4300 */ { MAD_F(0x04448eef) /* 0.266737874 */, 18 }, - /* 4301 */ { MAD_F(0x0444e5aa) /* 0.266820587 */, 18 }, - /* 4302 */ { MAD_F(0x04453c66) /* 0.266903306 */, 18 }, - /* 4303 */ { MAD_F(0x04459325) /* 0.266986031 */, 18 }, - - /* 4304 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 18 }, - /* 4305 */ { MAD_F(0x044640a7) /* 0.267151501 */, 18 }, - /* 4306 */ { MAD_F(0x0446976a) /* 0.267234246 */, 18 }, - /* 4307 */ { MAD_F(0x0446ee30) /* 0.267316997 */, 18 }, - /* 4308 */ { MAD_F(0x044744f7) /* 0.267399755 */, 18 }, - /* 4309 */ { MAD_F(0x04479bc0) /* 0.267482518 */, 18 }, - /* 4310 */ { MAD_F(0x0447f28a) /* 0.267565289 */, 18 }, - /* 4311 */ { MAD_F(0x04484956) /* 0.267648065 */, 18 }, - /* 4312 */ { MAD_F(0x0448a024) /* 0.267730848 */, 18 }, - /* 4313 */ { MAD_F(0x0448f6f4) /* 0.267813638 */, 18 }, - /* 4314 */ { MAD_F(0x04494dc5) /* 0.267896434 */, 18 }, - /* 4315 */ { MAD_F(0x0449a498) /* 0.267979236 */, 18 }, - /* 4316 */ { MAD_F(0x0449fb6d) /* 0.268062045 */, 18 }, - /* 4317 */ { MAD_F(0x044a5243) /* 0.268144860 */, 18 }, - /* 4318 */ { MAD_F(0x044aa91c) /* 0.268227681 */, 18 }, - /* 4319 */ { MAD_F(0x044afff6) /* 0.268310509 */, 18 }, - - /* 4320 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 18 }, - /* 4321 */ { MAD_F(0x044badaf) /* 0.268476184 */, 18 }, - /* 4322 */ { MAD_F(0x044c048e) /* 0.268559031 */, 18 }, - /* 4323 */ { MAD_F(0x044c5b6f) /* 0.268641885 */, 18 }, - /* 4324 */ { MAD_F(0x044cb251) /* 0.268724744 */, 18 }, - /* 4325 */ { MAD_F(0x044d0935) /* 0.268807611 */, 18 }, - /* 4326 */ { MAD_F(0x044d601b) /* 0.268890483 */, 18 }, - /* 4327 */ { MAD_F(0x044db703) /* 0.268973362 */, 18 }, - /* 4328 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 18 }, - /* 4329 */ { MAD_F(0x044e64d7) /* 0.269139139 */, 18 }, - /* 4330 */ { MAD_F(0x044ebbc4) /* 0.269222037 */, 18 }, - /* 4331 */ { MAD_F(0x044f12b3) /* 0.269304942 */, 18 }, - /* 4332 */ { MAD_F(0x044f69a3) /* 0.269387853 */, 18 }, - /* 4333 */ { MAD_F(0x044fc095) /* 0.269470770 */, 18 }, - /* 4334 */ { MAD_F(0x04501788) /* 0.269553694 */, 18 }, - /* 4335 */ { MAD_F(0x04506e7e) /* 0.269636624 */, 18 }, - - /* 4336 */ { MAD_F(0x0450c575) /* 0.269719560 */, 18 }, - /* 4337 */ { MAD_F(0x04511c6e) /* 0.269802503 */, 18 }, - /* 4338 */ { MAD_F(0x04517368) /* 0.269885452 */, 18 }, - /* 4339 */ { MAD_F(0x0451ca64) /* 0.269968408 */, 18 }, - /* 4340 */ { MAD_F(0x04522162) /* 0.270051370 */, 18 }, - /* 4341 */ { MAD_F(0x04527862) /* 0.270134338 */, 18 }, - /* 4342 */ { MAD_F(0x0452cf63) /* 0.270217312 */, 18 }, - /* 4343 */ { MAD_F(0x04532666) /* 0.270300293 */, 18 }, - /* 4344 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 18 }, - /* 4345 */ { MAD_F(0x0453d472) /* 0.270466275 */, 18 }, - /* 4346 */ { MAD_F(0x04542b7a) /* 0.270549275 */, 18 }, - /* 4347 */ { MAD_F(0x04548284) /* 0.270632281 */, 18 }, - /* 4348 */ { MAD_F(0x0454d98f) /* 0.270715294 */, 18 }, - /* 4349 */ { MAD_F(0x0455309c) /* 0.270798313 */, 18 }, - /* 4350 */ { MAD_F(0x045587ab) /* 0.270881339 */, 18 }, - /* 4351 */ { MAD_F(0x0455debc) /* 0.270964371 */, 18 }, - - /* 4352 */ { MAD_F(0x045635cf) /* 0.271047409 */, 18 }, - /* 4353 */ { MAD_F(0x04568ce3) /* 0.271130454 */, 18 }, - /* 4354 */ { MAD_F(0x0456e3f9) /* 0.271213505 */, 18 }, - /* 4355 */ { MAD_F(0x04573b10) /* 0.271296562 */, 18 }, - /* 4356 */ { MAD_F(0x04579229) /* 0.271379626 */, 18 }, - /* 4357 */ { MAD_F(0x0457e944) /* 0.271462696 */, 18 }, - /* 4358 */ { MAD_F(0x04584061) /* 0.271545772 */, 18 }, - /* 4359 */ { MAD_F(0x0458977f) /* 0.271628855 */, 18 }, - /* 4360 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 18 }, - /* 4361 */ { MAD_F(0x045945c1) /* 0.271795040 */, 18 }, - /* 4362 */ { MAD_F(0x04599ce5) /* 0.271878142 */, 18 }, - /* 4363 */ { MAD_F(0x0459f40a) /* 0.271961250 */, 18 }, - /* 4364 */ { MAD_F(0x045a4b31) /* 0.272044365 */, 18 }, - /* 4365 */ { MAD_F(0x045aa259) /* 0.272127486 */, 18 }, - /* 4366 */ { MAD_F(0x045af984) /* 0.272210613 */, 18 }, - /* 4367 */ { MAD_F(0x045b50b0) /* 0.272293746 */, 18 }, - - /* 4368 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 18 }, - /* 4369 */ { MAD_F(0x045bff0d) /* 0.272460033 */, 18 }, - /* 4370 */ { MAD_F(0x045c563e) /* 0.272543185 */, 18 }, - /* 4371 */ { MAD_F(0x045cad71) /* 0.272626344 */, 18 }, - /* 4372 */ { MAD_F(0x045d04a5) /* 0.272709510 */, 18 }, - /* 4373 */ { MAD_F(0x045d5bdc) /* 0.272792681 */, 18 }, - /* 4374 */ { MAD_F(0x045db313) /* 0.272875859 */, 18 }, - /* 4375 */ { MAD_F(0x045e0a4d) /* 0.272959044 */, 18 }, - /* 4376 */ { MAD_F(0x045e6188) /* 0.273042234 */, 18 }, - /* 4377 */ { MAD_F(0x045eb8c5) /* 0.273125431 */, 18 }, - /* 4378 */ { MAD_F(0x045f1004) /* 0.273208635 */, 18 }, - /* 4379 */ { MAD_F(0x045f6745) /* 0.273291844 */, 18 }, - /* 4380 */ { MAD_F(0x045fbe87) /* 0.273375060 */, 18 }, - /* 4381 */ { MAD_F(0x046015cb) /* 0.273458283 */, 18 }, - /* 4382 */ { MAD_F(0x04606d10) /* 0.273541511 */, 18 }, - /* 4383 */ { MAD_F(0x0460c457) /* 0.273624747 */, 18 }, - - /* 4384 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 18 }, - /* 4385 */ { MAD_F(0x046172eb) /* 0.273791236 */, 18 }, - /* 4386 */ { MAD_F(0x0461ca37) /* 0.273874490 */, 18 }, - /* 4387 */ { MAD_F(0x04622185) /* 0.273957750 */, 18 }, - /* 4388 */ { MAD_F(0x046278d5) /* 0.274041017 */, 18 }, - /* 4389 */ { MAD_F(0x0462d026) /* 0.274124290 */, 18 }, - /* 4390 */ { MAD_F(0x0463277a) /* 0.274207569 */, 18 }, - /* 4391 */ { MAD_F(0x04637ece) /* 0.274290855 */, 18 }, - /* 4392 */ { MAD_F(0x0463d625) /* 0.274374147 */, 18 }, - /* 4393 */ { MAD_F(0x04642d7d) /* 0.274457445 */, 18 }, - /* 4394 */ { MAD_F(0x046484d7) /* 0.274540749 */, 18 }, - /* 4395 */ { MAD_F(0x0464dc33) /* 0.274624060 */, 18 }, - /* 4396 */ { MAD_F(0x04653390) /* 0.274707378 */, 18 }, - /* 4397 */ { MAD_F(0x04658aef) /* 0.274790701 */, 18 }, - /* 4398 */ { MAD_F(0x0465e250) /* 0.274874031 */, 18 }, - /* 4399 */ { MAD_F(0x046639b2) /* 0.274957367 */, 18 }, - - /* 4400 */ { MAD_F(0x04669116) /* 0.275040710 */, 18 }, - /* 4401 */ { MAD_F(0x0466e87c) /* 0.275124059 */, 18 }, - /* 4402 */ { MAD_F(0x04673fe3) /* 0.275207414 */, 18 }, - /* 4403 */ { MAD_F(0x0467974d) /* 0.275290775 */, 18 }, - /* 4404 */ { MAD_F(0x0467eeb7) /* 0.275374143 */, 18 }, - /* 4405 */ { MAD_F(0x04684624) /* 0.275457517 */, 18 }, - /* 4406 */ { MAD_F(0x04689d92) /* 0.275540897 */, 18 }, - /* 4407 */ { MAD_F(0x0468f502) /* 0.275624284 */, 18 }, - /* 4408 */ { MAD_F(0x04694c74) /* 0.275707677 */, 18 }, - /* 4409 */ { MAD_F(0x0469a3e7) /* 0.275791076 */, 18 }, - /* 4410 */ { MAD_F(0x0469fb5c) /* 0.275874482 */, 18 }, - /* 4411 */ { MAD_F(0x046a52d3) /* 0.275957894 */, 18 }, - /* 4412 */ { MAD_F(0x046aaa4b) /* 0.276041312 */, 18 }, - /* 4413 */ { MAD_F(0x046b01c5) /* 0.276124737 */, 18 }, - /* 4414 */ { MAD_F(0x046b5941) /* 0.276208167 */, 18 }, - /* 4415 */ { MAD_F(0x046bb0bf) /* 0.276291605 */, 18 }, - - /* 4416 */ { MAD_F(0x046c083e) /* 0.276375048 */, 18 }, - /* 4417 */ { MAD_F(0x046c5fbf) /* 0.276458498 */, 18 }, - /* 4418 */ { MAD_F(0x046cb741) /* 0.276541954 */, 18 }, - /* 4419 */ { MAD_F(0x046d0ec5) /* 0.276625416 */, 18 }, - /* 4420 */ { MAD_F(0x046d664b) /* 0.276708885 */, 18 }, - /* 4421 */ { MAD_F(0x046dbdd3) /* 0.276792360 */, 18 }, - /* 4422 */ { MAD_F(0x046e155c) /* 0.276875841 */, 18 }, - /* 4423 */ { MAD_F(0x046e6ce7) /* 0.276959328 */, 18 }, - /* 4424 */ { MAD_F(0x046ec474) /* 0.277042822 */, 18 }, - /* 4425 */ { MAD_F(0x046f1c02) /* 0.277126322 */, 18 }, - /* 4426 */ { MAD_F(0x046f7392) /* 0.277209829 */, 18 }, - /* 4427 */ { MAD_F(0x046fcb24) /* 0.277293341 */, 18 }, - /* 4428 */ { MAD_F(0x047022b8) /* 0.277376860 */, 18 }, - /* 4429 */ { MAD_F(0x04707a4d) /* 0.277460385 */, 18 }, - /* 4430 */ { MAD_F(0x0470d1e4) /* 0.277543917 */, 18 }, - /* 4431 */ { MAD_F(0x0471297c) /* 0.277627455 */, 18 }, - - /* 4432 */ { MAD_F(0x04718116) /* 0.277710999 */, 18 }, - /* 4433 */ { MAD_F(0x0471d8b2) /* 0.277794549 */, 18 }, - /* 4434 */ { MAD_F(0x04723050) /* 0.277878106 */, 18 }, - /* 4435 */ { MAD_F(0x047287ef) /* 0.277961669 */, 18 }, - /* 4436 */ { MAD_F(0x0472df90) /* 0.278045238 */, 18 }, - /* 4437 */ { MAD_F(0x04733733) /* 0.278128813 */, 18 }, - /* 4438 */ { MAD_F(0x04738ed7) /* 0.278212395 */, 18 }, - /* 4439 */ { MAD_F(0x0473e67d) /* 0.278295983 */, 18 }, - /* 4440 */ { MAD_F(0x04743e25) /* 0.278379578 */, 18 }, - /* 4441 */ { MAD_F(0x047495ce) /* 0.278463178 */, 18 }, - /* 4442 */ { MAD_F(0x0474ed79) /* 0.278546785 */, 18 }, - /* 4443 */ { MAD_F(0x04754526) /* 0.278630398 */, 18 }, - /* 4444 */ { MAD_F(0x04759cd4) /* 0.278714018 */, 18 }, - /* 4445 */ { MAD_F(0x0475f484) /* 0.278797643 */, 18 }, - /* 4446 */ { MAD_F(0x04764c36) /* 0.278881275 */, 18 }, - /* 4447 */ { MAD_F(0x0476a3ea) /* 0.278964914 */, 18 }, - - /* 4448 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 18 }, - /* 4449 */ { MAD_F(0x04775356) /* 0.279132209 */, 18 }, - /* 4450 */ { MAD_F(0x0477ab0e) /* 0.279215866 */, 18 }, - /* 4451 */ { MAD_F(0x047802c8) /* 0.279299529 */, 18 }, - /* 4452 */ { MAD_F(0x04785a84) /* 0.279383199 */, 18 }, - /* 4453 */ { MAD_F(0x0478b242) /* 0.279466875 */, 18 }, - /* 4454 */ { MAD_F(0x04790a01) /* 0.279550557 */, 18 }, - /* 4455 */ { MAD_F(0x047961c2) /* 0.279634245 */, 18 }, - /* 4456 */ { MAD_F(0x0479b984) /* 0.279717940 */, 18 }, - /* 4457 */ { MAD_F(0x047a1149) /* 0.279801641 */, 18 }, - /* 4458 */ { MAD_F(0x047a690f) /* 0.279885348 */, 18 }, - /* 4459 */ { MAD_F(0x047ac0d6) /* 0.279969061 */, 18 }, - /* 4460 */ { MAD_F(0x047b18a0) /* 0.280052781 */, 18 }, - /* 4461 */ { MAD_F(0x047b706b) /* 0.280136507 */, 18 }, - /* 4462 */ { MAD_F(0x047bc837) /* 0.280220239 */, 18 }, - /* 4463 */ { MAD_F(0x047c2006) /* 0.280303978 */, 18 }, - - /* 4464 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 18 }, - /* 4465 */ { MAD_F(0x047ccfa8) /* 0.280471473 */, 18 }, - /* 4466 */ { MAD_F(0x047d277b) /* 0.280555230 */, 18 }, - /* 4467 */ { MAD_F(0x047d7f50) /* 0.280638994 */, 18 }, - /* 4468 */ { MAD_F(0x047dd727) /* 0.280722764 */, 18 }, - /* 4469 */ { MAD_F(0x047e2eff) /* 0.280806540 */, 18 }, - /* 4470 */ { MAD_F(0x047e86d9) /* 0.280890322 */, 18 }, - /* 4471 */ { MAD_F(0x047edeb5) /* 0.280974110 */, 18 }, - /* 4472 */ { MAD_F(0x047f3693) /* 0.281057905 */, 18 }, - /* 4473 */ { MAD_F(0x047f8e72) /* 0.281141706 */, 18 }, - /* 4474 */ { MAD_F(0x047fe653) /* 0.281225513 */, 18 }, - /* 4475 */ { MAD_F(0x04803e35) /* 0.281309326 */, 18 }, - /* 4476 */ { MAD_F(0x04809619) /* 0.281393146 */, 18 }, - /* 4477 */ { MAD_F(0x0480edff) /* 0.281476972 */, 18 }, - /* 4478 */ { MAD_F(0x048145e7) /* 0.281560804 */, 18 }, - /* 4479 */ { MAD_F(0x04819dd0) /* 0.281644643 */, 18 }, - - /* 4480 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 18 }, - /* 4481 */ { MAD_F(0x04824da7) /* 0.281812338 */, 18 }, - /* 4482 */ { MAD_F(0x0482a595) /* 0.281896195 */, 18 }, - /* 4483 */ { MAD_F(0x0482fd85) /* 0.281980059 */, 18 }, - /* 4484 */ { MAD_F(0x04835577) /* 0.282063928 */, 18 }, - /* 4485 */ { MAD_F(0x0483ad6a) /* 0.282147804 */, 18 }, - /* 4486 */ { MAD_F(0x0484055f) /* 0.282231686 */, 18 }, - /* 4487 */ { MAD_F(0x04845d56) /* 0.282315574 */, 18 }, - /* 4488 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 18 }, - /* 4489 */ { MAD_F(0x04850d48) /* 0.282483370 */, 18 }, - /* 4490 */ { MAD_F(0x04856544) /* 0.282567277 */, 18 }, - /* 4491 */ { MAD_F(0x0485bd41) /* 0.282651190 */, 18 }, - /* 4492 */ { MAD_F(0x04861540) /* 0.282735109 */, 18 }, - /* 4493 */ { MAD_F(0x04866d40) /* 0.282819035 */, 18 }, - /* 4494 */ { MAD_F(0x0486c543) /* 0.282902967 */, 18 }, - /* 4495 */ { MAD_F(0x04871d47) /* 0.282986905 */, 18 }, - - /* 4496 */ { MAD_F(0x0487754c) /* 0.283070849 */, 18 }, - /* 4497 */ { MAD_F(0x0487cd54) /* 0.283154800 */, 18 }, - /* 4498 */ { MAD_F(0x0488255d) /* 0.283238757 */, 18 }, - /* 4499 */ { MAD_F(0x04887d67) /* 0.283322720 */, 18 }, - /* 4500 */ { MAD_F(0x0488d574) /* 0.283406689 */, 18 }, - /* 4501 */ { MAD_F(0x04892d82) /* 0.283490665 */, 18 }, - /* 4502 */ { MAD_F(0x04898591) /* 0.283574646 */, 18 }, - /* 4503 */ { MAD_F(0x0489dda3) /* 0.283658634 */, 18 }, - /* 4504 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 18 }, - /* 4505 */ { MAD_F(0x048a8dca) /* 0.283826629 */, 18 }, - /* 4506 */ { MAD_F(0x048ae5e1) /* 0.283910635 */, 18 }, - /* 4507 */ { MAD_F(0x048b3df9) /* 0.283994648 */, 18 }, - /* 4508 */ { MAD_F(0x048b9612) /* 0.284078667 */, 18 }, - /* 4509 */ { MAD_F(0x048bee2e) /* 0.284162692 */, 18 }, - /* 4510 */ { MAD_F(0x048c464b) /* 0.284246723 */, 18 }, - /* 4511 */ { MAD_F(0x048c9e69) /* 0.284330761 */, 18 }, - - /* 4512 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 18 }, - /* 4513 */ { MAD_F(0x048d4eac) /* 0.284498855 */, 18 }, - /* 4514 */ { MAD_F(0x048da6cf) /* 0.284582911 */, 18 }, - /* 4515 */ { MAD_F(0x048dfef5) /* 0.284666974 */, 18 }, - /* 4516 */ { MAD_F(0x048e571c) /* 0.284751042 */, 18 }, - /* 4517 */ { MAD_F(0x048eaf44) /* 0.284835117 */, 18 }, - /* 4518 */ { MAD_F(0x048f076f) /* 0.284919198 */, 18 }, - /* 4519 */ { MAD_F(0x048f5f9b) /* 0.285003285 */, 18 }, - /* 4520 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 18 }, - /* 4521 */ { MAD_F(0x04900ff8) /* 0.285171479 */, 18 }, - /* 4522 */ { MAD_F(0x04906829) /* 0.285255584 */, 18 }, - /* 4523 */ { MAD_F(0x0490c05b) /* 0.285339697 */, 18 }, - /* 4524 */ { MAD_F(0x04911890) /* 0.285423815 */, 18 }, - /* 4525 */ { MAD_F(0x049170c6) /* 0.285507939 */, 18 }, - /* 4526 */ { MAD_F(0x0491c8fd) /* 0.285592070 */, 18 }, - /* 4527 */ { MAD_F(0x04922137) /* 0.285676207 */, 18 }, - - /* 4528 */ { MAD_F(0x04927972) /* 0.285760350 */, 18 }, - /* 4529 */ { MAD_F(0x0492d1ae) /* 0.285844499 */, 18 }, - /* 4530 */ { MAD_F(0x049329ed) /* 0.285928655 */, 18 }, - /* 4531 */ { MAD_F(0x0493822c) /* 0.286012816 */, 18 }, - /* 4532 */ { MAD_F(0x0493da6e) /* 0.286096984 */, 18 }, - /* 4533 */ { MAD_F(0x049432b1) /* 0.286181158 */, 18 }, - /* 4534 */ { MAD_F(0x04948af6) /* 0.286265338 */, 18 }, - /* 4535 */ { MAD_F(0x0494e33d) /* 0.286349525 */, 18 }, - /* 4536 */ { MAD_F(0x04953b85) /* 0.286433717 */, 18 }, - /* 4537 */ { MAD_F(0x049593cf) /* 0.286517916 */, 18 }, - /* 4538 */ { MAD_F(0x0495ec1b) /* 0.286602121 */, 18 }, - /* 4539 */ { MAD_F(0x04964468) /* 0.286686332 */, 18 }, - /* 4540 */ { MAD_F(0x04969cb7) /* 0.286770550 */, 18 }, - /* 4541 */ { MAD_F(0x0496f508) /* 0.286854773 */, 18 }, - /* 4542 */ { MAD_F(0x04974d5a) /* 0.286939003 */, 18 }, - /* 4543 */ { MAD_F(0x0497a5ae) /* 0.287023239 */, 18 }, - - /* 4544 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 18 }, - /* 4545 */ { MAD_F(0x0498565a) /* 0.287191729 */, 18 }, - /* 4546 */ { MAD_F(0x0498aeb3) /* 0.287275983 */, 18 }, - /* 4547 */ { MAD_F(0x0499070e) /* 0.287360244 */, 18 }, - /* 4548 */ { MAD_F(0x04995f6a) /* 0.287444511 */, 18 }, - /* 4549 */ { MAD_F(0x0499b7c8) /* 0.287528784 */, 18 }, - /* 4550 */ { MAD_F(0x049a1027) /* 0.287613063 */, 18 }, - /* 4551 */ { MAD_F(0x049a6889) /* 0.287697348 */, 18 }, - /* 4552 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 18 }, - /* 4553 */ { MAD_F(0x049b1950) /* 0.287865937 */, 18 }, - /* 4554 */ { MAD_F(0x049b71b6) /* 0.287950241 */, 18 }, - /* 4555 */ { MAD_F(0x049bca1e) /* 0.288034551 */, 18 }, - /* 4556 */ { MAD_F(0x049c2287) /* 0.288118867 */, 18 }, - /* 4557 */ { MAD_F(0x049c7af2) /* 0.288203190 */, 18 }, - /* 4558 */ { MAD_F(0x049cd35f) /* 0.288287518 */, 18 }, - /* 4559 */ { MAD_F(0x049d2bce) /* 0.288371853 */, 18 }, - - /* 4560 */ { MAD_F(0x049d843e) /* 0.288456194 */, 18 }, - /* 4561 */ { MAD_F(0x049ddcaf) /* 0.288540541 */, 18 }, - /* 4562 */ { MAD_F(0x049e3523) /* 0.288624894 */, 18 }, - /* 4563 */ { MAD_F(0x049e8d98) /* 0.288709253 */, 18 }, - /* 4564 */ { MAD_F(0x049ee60e) /* 0.288793619 */, 18 }, - /* 4565 */ { MAD_F(0x049f3e87) /* 0.288877990 */, 18 }, - /* 4566 */ { MAD_F(0x049f9701) /* 0.288962368 */, 18 }, - /* 4567 */ { MAD_F(0x049fef7c) /* 0.289046752 */, 18 }, - /* 4568 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 18 }, - /* 4569 */ { MAD_F(0x04a0a079) /* 0.289215538 */, 18 }, - /* 4570 */ { MAD_F(0x04a0f8f9) /* 0.289299941 */, 18 }, - /* 4571 */ { MAD_F(0x04a1517c) /* 0.289384349 */, 18 }, - /* 4572 */ { MAD_F(0x04a1a9ff) /* 0.289468764 */, 18 }, - /* 4573 */ { MAD_F(0x04a20285) /* 0.289553185 */, 18 }, - /* 4574 */ { MAD_F(0x04a25b0c) /* 0.289637612 */, 18 }, - /* 4575 */ { MAD_F(0x04a2b395) /* 0.289722045 */, 18 }, - - /* 4576 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 18 }, - /* 4577 */ { MAD_F(0x04a364ac) /* 0.289890930 */, 18 }, - /* 4578 */ { MAD_F(0x04a3bd3a) /* 0.289975382 */, 18 }, - /* 4579 */ { MAD_F(0x04a415c9) /* 0.290059840 */, 18 }, - /* 4580 */ { MAD_F(0x04a46e5a) /* 0.290144304 */, 18 }, - /* 4581 */ { MAD_F(0x04a4c6ed) /* 0.290228774 */, 18 }, - /* 4582 */ { MAD_F(0x04a51f81) /* 0.290313250 */, 18 }, - /* 4583 */ { MAD_F(0x04a57818) /* 0.290397733 */, 18 }, - /* 4584 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 18 }, - /* 4585 */ { MAD_F(0x04a62949) /* 0.290566716 */, 18 }, - /* 4586 */ { MAD_F(0x04a681e4) /* 0.290651217 */, 18 }, - /* 4587 */ { MAD_F(0x04a6da80) /* 0.290735724 */, 18 }, - /* 4588 */ { MAD_F(0x04a7331f) /* 0.290820237 */, 18 }, - /* 4589 */ { MAD_F(0x04a78bbf) /* 0.290904756 */, 18 }, - /* 4590 */ { MAD_F(0x04a7e460) /* 0.290989281 */, 18 }, - /* 4591 */ { MAD_F(0x04a83d03) /* 0.291073813 */, 18 }, - - /* 4592 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 18 }, - /* 4593 */ { MAD_F(0x04a8ee4f) /* 0.291242894 */, 18 }, - /* 4594 */ { MAD_F(0x04a946f7) /* 0.291327444 */, 18 }, - /* 4595 */ { MAD_F(0x04a99fa1) /* 0.291412001 */, 18 }, - /* 4596 */ { MAD_F(0x04a9f84c) /* 0.291496563 */, 18 }, - /* 4597 */ { MAD_F(0x04aa50fa) /* 0.291581131 */, 18 }, - /* 4598 */ { MAD_F(0x04aaa9a8) /* 0.291665706 */, 18 }, - /* 4599 */ { MAD_F(0x04ab0259) /* 0.291750286 */, 18 }, - /* 4600 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 18 }, - /* 4601 */ { MAD_F(0x04abb3bf) /* 0.291919466 */, 18 }, - /* 4602 */ { MAD_F(0x04ac0c74) /* 0.292004065 */, 18 }, - /* 4603 */ { MAD_F(0x04ac652b) /* 0.292088670 */, 18 }, - /* 4604 */ { MAD_F(0x04acbde4) /* 0.292173281 */, 18 }, - /* 4605 */ { MAD_F(0x04ad169e) /* 0.292257899 */, 18 }, - /* 4606 */ { MAD_F(0x04ad6f5a) /* 0.292342522 */, 18 }, - /* 4607 */ { MAD_F(0x04adc818) /* 0.292427152 */, 18 }, - - /* 4608 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 18 }, - /* 4609 */ { MAD_F(0x04ae7998) /* 0.292596430 */, 18 }, - /* 4610 */ { MAD_F(0x04aed25a) /* 0.292681078 */, 18 }, - /* 4611 */ { MAD_F(0x04af2b1e) /* 0.292765732 */, 18 }, - /* 4612 */ { MAD_F(0x04af83e4) /* 0.292850392 */, 18 }, - /* 4613 */ { MAD_F(0x04afdcac) /* 0.292935058 */, 18 }, - /* 4614 */ { MAD_F(0x04b03575) /* 0.293019731 */, 18 }, - /* 4615 */ { MAD_F(0x04b08e40) /* 0.293104409 */, 18 }, - /* 4616 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 18 }, - /* 4617 */ { MAD_F(0x04b13fda) /* 0.293273785 */, 18 }, - /* 4618 */ { MAD_F(0x04b198aa) /* 0.293358482 */, 18 }, - /* 4619 */ { MAD_F(0x04b1f17b) /* 0.293443185 */, 18 }, - /* 4620 */ { MAD_F(0x04b24a4e) /* 0.293527894 */, 18 }, - /* 4621 */ { MAD_F(0x04b2a322) /* 0.293612609 */, 18 }, - /* 4622 */ { MAD_F(0x04b2fbf9) /* 0.293697331 */, 18 }, - /* 4623 */ { MAD_F(0x04b354d1) /* 0.293782058 */, 18 }, - - /* 4624 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 18 }, - /* 4625 */ { MAD_F(0x04b40685) /* 0.293951532 */, 18 }, - /* 4626 */ { MAD_F(0x04b45f62) /* 0.294036278 */, 18 }, - /* 4627 */ { MAD_F(0x04b4b840) /* 0.294121029 */, 18 }, - /* 4628 */ { MAD_F(0x04b51120) /* 0.294205788 */, 18 }, - /* 4629 */ { MAD_F(0x04b56a02) /* 0.294290552 */, 18 }, - /* 4630 */ { MAD_F(0x04b5c2e6) /* 0.294375322 */, 18 }, - /* 4631 */ { MAD_F(0x04b61bcb) /* 0.294460098 */, 18 }, - /* 4632 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 18 }, - /* 4633 */ { MAD_F(0x04b6cd99) /* 0.294629669 */, 18 }, - /* 4634 */ { MAD_F(0x04b72683) /* 0.294714464 */, 18 }, - /* 4635 */ { MAD_F(0x04b77f6f) /* 0.294799265 */, 18 }, - /* 4636 */ { MAD_F(0x04b7d85c) /* 0.294884072 */, 18 }, - /* 4637 */ { MAD_F(0x04b8314b) /* 0.294968885 */, 18 }, - /* 4638 */ { MAD_F(0x04b88a3b) /* 0.295053704 */, 18 }, - /* 4639 */ { MAD_F(0x04b8e32d) /* 0.295138529 */, 18 }, - - /* 4640 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 18 }, - /* 4641 */ { MAD_F(0x04b99516) /* 0.295308197 */, 18 }, - /* 4642 */ { MAD_F(0x04b9ee0d) /* 0.295393041 */, 18 }, - /* 4643 */ { MAD_F(0x04ba4706) /* 0.295477890 */, 18 }, - /* 4644 */ { MAD_F(0x04baa000) /* 0.295562746 */, 18 }, - /* 4645 */ { MAD_F(0x04baf8fc) /* 0.295647608 */, 18 }, - /* 4646 */ { MAD_F(0x04bb51fa) /* 0.295732476 */, 18 }, - /* 4647 */ { MAD_F(0x04bbaaf9) /* 0.295817349 */, 18 }, - /* 4648 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 18 }, - /* 4649 */ { MAD_F(0x04bc5cfc) /* 0.295987115 */, 18 }, - /* 4650 */ { MAD_F(0x04bcb600) /* 0.296072008 */, 18 }, - /* 4651 */ { MAD_F(0x04bd0f06) /* 0.296156906 */, 18 }, - /* 4652 */ { MAD_F(0x04bd680d) /* 0.296241810 */, 18 }, - /* 4653 */ { MAD_F(0x04bdc116) /* 0.296326721 */, 18 }, - /* 4654 */ { MAD_F(0x04be1a21) /* 0.296411637 */, 18 }, - /* 4655 */ { MAD_F(0x04be732d) /* 0.296496560 */, 18 }, - - /* 4656 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 18 }, - /* 4657 */ { MAD_F(0x04bf254a) /* 0.296666423 */, 18 }, - /* 4658 */ { MAD_F(0x04bf7e5b) /* 0.296751364 */, 18 }, - /* 4659 */ { MAD_F(0x04bfd76e) /* 0.296836311 */, 18 }, - /* 4660 */ { MAD_F(0x04c03083) /* 0.296921264 */, 18 }, - /* 4661 */ { MAD_F(0x04c08999) /* 0.297006223 */, 18 }, - /* 4662 */ { MAD_F(0x04c0e2b0) /* 0.297091188 */, 18 }, - /* 4663 */ { MAD_F(0x04c13bca) /* 0.297176159 */, 18 }, - /* 4664 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 18 }, - /* 4665 */ { MAD_F(0x04c1ee01) /* 0.297346120 */, 18 }, - /* 4666 */ { MAD_F(0x04c2471f) /* 0.297431109 */, 18 }, - /* 4667 */ { MAD_F(0x04c2a03f) /* 0.297516105 */, 18 }, - /* 4668 */ { MAD_F(0x04c2f960) /* 0.297601106 */, 18 }, - /* 4669 */ { MAD_F(0x04c35283) /* 0.297686114 */, 18 }, - /* 4670 */ { MAD_F(0x04c3aba8) /* 0.297771128 */, 18 }, - /* 4671 */ { MAD_F(0x04c404ce) /* 0.297856147 */, 18 }, - - /* 4672 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 18 }, - /* 4673 */ { MAD_F(0x04c4b720) /* 0.298026205 */, 18 }, - /* 4674 */ { MAD_F(0x04c5104b) /* 0.298111243 */, 18 }, - /* 4675 */ { MAD_F(0x04c56978) /* 0.298196287 */, 18 }, - /* 4676 */ { MAD_F(0x04c5c2a7) /* 0.298281337 */, 18 }, - /* 4677 */ { MAD_F(0x04c61bd7) /* 0.298366393 */, 18 }, - /* 4678 */ { MAD_F(0x04c67508) /* 0.298451456 */, 18 }, - /* 4679 */ { MAD_F(0x04c6ce3c) /* 0.298536524 */, 18 }, - /* 4680 */ { MAD_F(0x04c72771) /* 0.298621598 */, 18 }, - /* 4681 */ { MAD_F(0x04c780a7) /* 0.298706679 */, 18 }, - /* 4682 */ { MAD_F(0x04c7d9df) /* 0.298791765 */, 18 }, - /* 4683 */ { MAD_F(0x04c83319) /* 0.298876858 */, 18 }, - /* 4684 */ { MAD_F(0x04c88c55) /* 0.298961956 */, 18 }, - /* 4685 */ { MAD_F(0x04c8e592) /* 0.299047061 */, 18 }, - /* 4686 */ { MAD_F(0x04c93ed1) /* 0.299132172 */, 18 }, - /* 4687 */ { MAD_F(0x04c99811) /* 0.299217288 */, 18 }, - - /* 4688 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 18 }, - /* 4689 */ { MAD_F(0x04ca4a97) /* 0.299387540 */, 18 }, - /* 4690 */ { MAD_F(0x04caa3dc) /* 0.299472675 */, 18 }, - /* 4691 */ { MAD_F(0x04cafd23) /* 0.299557816 */, 18 }, - /* 4692 */ { MAD_F(0x04cb566b) /* 0.299642963 */, 18 }, - /* 4693 */ { MAD_F(0x04cbafb5) /* 0.299728116 */, 18 }, - /* 4694 */ { MAD_F(0x04cc0901) /* 0.299813275 */, 18 }, - /* 4695 */ { MAD_F(0x04cc624e) /* 0.299898440 */, 18 }, - /* 4696 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 18 }, - /* 4697 */ { MAD_F(0x04cd14ee) /* 0.300068789 */, 18 }, - /* 4698 */ { MAD_F(0x04cd6e40) /* 0.300153972 */, 18 }, - /* 4699 */ { MAD_F(0x04cdc794) /* 0.300239161 */, 18 }, - /* 4700 */ { MAD_F(0x04ce20e9) /* 0.300324357 */, 18 }, - /* 4701 */ { MAD_F(0x04ce7a40) /* 0.300409558 */, 18 }, - /* 4702 */ { MAD_F(0x04ced399) /* 0.300494765 */, 18 }, - /* 4703 */ { MAD_F(0x04cf2cf3) /* 0.300579979 */, 18 }, - - /* 4704 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 18 }, - /* 4705 */ { MAD_F(0x04cfdfad) /* 0.300750424 */, 18 }, - /* 4706 */ { MAD_F(0x04d0390c) /* 0.300835656 */, 18 }, - /* 4707 */ { MAD_F(0x04d0926d) /* 0.300920893 */, 18 }, - /* 4708 */ { MAD_F(0x04d0ebcf) /* 0.301006137 */, 18 }, - /* 4709 */ { MAD_F(0x04d14533) /* 0.301091387 */, 18 }, - /* 4710 */ { MAD_F(0x04d19e99) /* 0.301176643 */, 18 }, - /* 4711 */ { MAD_F(0x04d1f800) /* 0.301261904 */, 18 }, - /* 4712 */ { MAD_F(0x04d25169) /* 0.301347172 */, 18 }, - /* 4713 */ { MAD_F(0x04d2aad4) /* 0.301432446 */, 18 }, - /* 4714 */ { MAD_F(0x04d30440) /* 0.301517726 */, 18 }, - /* 4715 */ { MAD_F(0x04d35dae) /* 0.301603012 */, 18 }, - /* 4716 */ { MAD_F(0x04d3b71d) /* 0.301688304 */, 18 }, - /* 4717 */ { MAD_F(0x04d4108e) /* 0.301773602 */, 18 }, - /* 4718 */ { MAD_F(0x04d46a01) /* 0.301858906 */, 18 }, - /* 4719 */ { MAD_F(0x04d4c375) /* 0.301944216 */, 18 }, - - /* 4720 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 18 }, - /* 4721 */ { MAD_F(0x04d57662) /* 0.302114854 */, 18 }, - /* 4722 */ { MAD_F(0x04d5cfdb) /* 0.302200182 */, 18 }, - /* 4723 */ { MAD_F(0x04d62956) /* 0.302285516 */, 18 }, - /* 4724 */ { MAD_F(0x04d682d2) /* 0.302370856 */, 18 }, - /* 4725 */ { MAD_F(0x04d6dc50) /* 0.302456203 */, 18 }, - /* 4726 */ { MAD_F(0x04d735d0) /* 0.302541555 */, 18 }, - /* 4727 */ { MAD_F(0x04d78f51) /* 0.302626913 */, 18 }, - /* 4728 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 18 }, - /* 4729 */ { MAD_F(0x04d84258) /* 0.302797648 */, 18 }, - /* 4730 */ { MAD_F(0x04d89bde) /* 0.302883024 */, 18 }, - /* 4731 */ { MAD_F(0x04d8f566) /* 0.302968406 */, 18 }, - /* 4732 */ { MAD_F(0x04d94eef) /* 0.303053794 */, 18 }, - /* 4733 */ { MAD_F(0x04d9a87a) /* 0.303139189 */, 18 }, - /* 4734 */ { MAD_F(0x04da0207) /* 0.303224589 */, 18 }, - /* 4735 */ { MAD_F(0x04da5b95) /* 0.303309995 */, 18 }, - - /* 4736 */ { MAD_F(0x04dab524) /* 0.303395408 */, 18 }, - /* 4737 */ { MAD_F(0x04db0eb6) /* 0.303480826 */, 18 }, - /* 4738 */ { MAD_F(0x04db6849) /* 0.303566251 */, 18 }, - /* 4739 */ { MAD_F(0x04dbc1dd) /* 0.303651681 */, 18 }, - /* 4740 */ { MAD_F(0x04dc1b73) /* 0.303737117 */, 18 }, - /* 4741 */ { MAD_F(0x04dc750b) /* 0.303822560 */, 18 }, - /* 4742 */ { MAD_F(0x04dccea5) /* 0.303908008 */, 18 }, - /* 4743 */ { MAD_F(0x04dd2840) /* 0.303993463 */, 18 }, - /* 4744 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 18 }, - /* 4745 */ { MAD_F(0x04dddb7a) /* 0.304164390 */, 18 }, - /* 4746 */ { MAD_F(0x04de351a) /* 0.304249862 */, 18 }, - /* 4747 */ { MAD_F(0x04de8ebc) /* 0.304335340 */, 18 }, - /* 4748 */ { MAD_F(0x04dee85f) /* 0.304420825 */, 18 }, - /* 4749 */ { MAD_F(0x04df4203) /* 0.304506315 */, 18 }, - /* 4750 */ { MAD_F(0x04df9baa) /* 0.304591812 */, 18 }, - /* 4751 */ { MAD_F(0x04dff552) /* 0.304677314 */, 18 }, - - /* 4752 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 18 }, - /* 4753 */ { MAD_F(0x04e0a8a6) /* 0.304848337 */, 18 }, - /* 4754 */ { MAD_F(0x04e10253) /* 0.304933858 */, 18 }, - /* 4755 */ { MAD_F(0x04e15c01) /* 0.305019384 */, 18 }, - /* 4756 */ { MAD_F(0x04e1b5b1) /* 0.305104917 */, 18 }, - /* 4757 */ { MAD_F(0x04e20f63) /* 0.305190455 */, 18 }, - /* 4758 */ { MAD_F(0x04e26916) /* 0.305275999 */, 18 }, - /* 4759 */ { MAD_F(0x04e2c2cb) /* 0.305361550 */, 18 }, - /* 4760 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 18 }, - /* 4761 */ { MAD_F(0x04e37639) /* 0.305532669 */, 18 }, - /* 4762 */ { MAD_F(0x04e3cff3) /* 0.305618237 */, 18 }, - /* 4763 */ { MAD_F(0x04e429ae) /* 0.305703811 */, 18 }, - /* 4764 */ { MAD_F(0x04e4836b) /* 0.305789392 */, 18 }, - /* 4765 */ { MAD_F(0x04e4dd29) /* 0.305874978 */, 18 }, - /* 4766 */ { MAD_F(0x04e536e9) /* 0.305960571 */, 18 }, - /* 4767 */ { MAD_F(0x04e590ab) /* 0.306046169 */, 18 }, - - /* 4768 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 18 }, - /* 4769 */ { MAD_F(0x04e64433) /* 0.306217383 */, 18 }, - /* 4770 */ { MAD_F(0x04e69df9) /* 0.306303000 */, 18 }, - /* 4771 */ { MAD_F(0x04e6f7c1) /* 0.306388622 */, 18 }, - /* 4772 */ { MAD_F(0x04e7518b) /* 0.306474250 */, 18 }, - /* 4773 */ { MAD_F(0x04e7ab56) /* 0.306559885 */, 18 }, - /* 4774 */ { MAD_F(0x04e80523) /* 0.306645525 */, 18 }, - /* 4775 */ { MAD_F(0x04e85ef2) /* 0.306731171 */, 18 }, - /* 4776 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 18 }, - /* 4777 */ { MAD_F(0x04e91293) /* 0.306902481 */, 18 }, - /* 4778 */ { MAD_F(0x04e96c67) /* 0.306988145 */, 18 }, - /* 4779 */ { MAD_F(0x04e9c63b) /* 0.307073816 */, 18 }, - /* 4780 */ { MAD_F(0x04ea2012) /* 0.307159492 */, 18 }, - /* 4781 */ { MAD_F(0x04ea79ea) /* 0.307245174 */, 18 }, - /* 4782 */ { MAD_F(0x04ead3c4) /* 0.307330862 */, 18 }, - /* 4783 */ { MAD_F(0x04eb2d9f) /* 0.307416556 */, 18 }, - - /* 4784 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 18 }, - /* 4785 */ { MAD_F(0x04ebe15b) /* 0.307587962 */, 18 }, - /* 4786 */ { MAD_F(0x04ec3b3b) /* 0.307673674 */, 18 }, - /* 4787 */ { MAD_F(0x04ec951c) /* 0.307759392 */, 18 }, - /* 4788 */ { MAD_F(0x04ecef00) /* 0.307845115 */, 18 }, - /* 4789 */ { MAD_F(0x04ed48e5) /* 0.307930845 */, 18 }, - /* 4790 */ { MAD_F(0x04eda2cb) /* 0.308016581 */, 18 }, - /* 4791 */ { MAD_F(0x04edfcb3) /* 0.308102323 */, 18 }, - /* 4792 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 18 }, - /* 4793 */ { MAD_F(0x04eeb088) /* 0.308273824 */, 18 }, - /* 4794 */ { MAD_F(0x04ef0a75) /* 0.308359584 */, 18 }, - /* 4795 */ { MAD_F(0x04ef6464) /* 0.308445350 */, 18 }, - /* 4796 */ { MAD_F(0x04efbe54) /* 0.308531121 */, 18 }, - /* 4797 */ { MAD_F(0x04f01846) /* 0.308616899 */, 18 }, - /* 4798 */ { MAD_F(0x04f07239) /* 0.308702682 */, 18 }, - /* 4799 */ { MAD_F(0x04f0cc2e) /* 0.308788472 */, 18 }, - - /* 4800 */ { MAD_F(0x04f12624) /* 0.308874267 */, 18 }, - /* 4801 */ { MAD_F(0x04f1801d) /* 0.308960068 */, 18 }, - /* 4802 */ { MAD_F(0x04f1da16) /* 0.309045876 */, 18 }, - /* 4803 */ { MAD_F(0x04f23412) /* 0.309131689 */, 18 }, - /* 4804 */ { MAD_F(0x04f28e0f) /* 0.309217508 */, 18 }, - /* 4805 */ { MAD_F(0x04f2e80d) /* 0.309303334 */, 18 }, - /* 4806 */ { MAD_F(0x04f3420d) /* 0.309389165 */, 18 }, - /* 4807 */ { MAD_F(0x04f39c0f) /* 0.309475002 */, 18 }, - /* 4808 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 18 }, - /* 4809 */ { MAD_F(0x04f45017) /* 0.309646694 */, 18 }, - /* 4810 */ { MAD_F(0x04f4aa1e) /* 0.309732549 */, 18 }, - /* 4811 */ { MAD_F(0x04f50426) /* 0.309818410 */, 18 }, - /* 4812 */ { MAD_F(0x04f55e30) /* 0.309904277 */, 18 }, - /* 4813 */ { MAD_F(0x04f5b83b) /* 0.309990150 */, 18 }, - /* 4814 */ { MAD_F(0x04f61248) /* 0.310076028 */, 18 }, - /* 4815 */ { MAD_F(0x04f66c56) /* 0.310161913 */, 18 }, - - /* 4816 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 18 }, - /* 4817 */ { MAD_F(0x04f72078) /* 0.310333700 */, 18 }, - /* 4818 */ { MAD_F(0x04f77a8b) /* 0.310419603 */, 18 }, - /* 4819 */ { MAD_F(0x04f7d4a0) /* 0.310505511 */, 18 }, - /* 4820 */ { MAD_F(0x04f82eb7) /* 0.310591426 */, 18 }, - /* 4821 */ { MAD_F(0x04f888cf) /* 0.310677346 */, 18 }, - /* 4822 */ { MAD_F(0x04f8e2e9) /* 0.310763272 */, 18 }, - /* 4823 */ { MAD_F(0x04f93d04) /* 0.310849205 */, 18 }, - /* 4824 */ { MAD_F(0x04f99721) /* 0.310935143 */, 18 }, - /* 4825 */ { MAD_F(0x04f9f13f) /* 0.311021087 */, 18 }, - /* 4826 */ { MAD_F(0x04fa4b5f) /* 0.311107037 */, 18 }, - /* 4827 */ { MAD_F(0x04faa581) /* 0.311192993 */, 18 }, - /* 4828 */ { MAD_F(0x04faffa4) /* 0.311278955 */, 18 }, - /* 4829 */ { MAD_F(0x04fb59c9) /* 0.311364923 */, 18 }, - /* 4830 */ { MAD_F(0x04fbb3ef) /* 0.311450897 */, 18 }, - /* 4831 */ { MAD_F(0x04fc0e17) /* 0.311536877 */, 18 }, - - /* 4832 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 18 }, - /* 4833 */ { MAD_F(0x04fcc26c) /* 0.311708854 */, 18 }, - /* 4834 */ { MAD_F(0x04fd1c99) /* 0.311794851 */, 18 }, - /* 4835 */ { MAD_F(0x04fd76c7) /* 0.311880855 */, 18 }, - /* 4836 */ { MAD_F(0x04fdd0f7) /* 0.311966864 */, 18 }, - /* 4837 */ { MAD_F(0x04fe2b29) /* 0.312052880 */, 18 }, - /* 4838 */ { MAD_F(0x04fe855c) /* 0.312138901 */, 18 }, - /* 4839 */ { MAD_F(0x04fedf91) /* 0.312224928 */, 18 }, - /* 4840 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 18 }, - /* 4841 */ { MAD_F(0x04ff93ff) /* 0.312397000 */, 18 }, - /* 4842 */ { MAD_F(0x04ffee38) /* 0.312483045 */, 18 }, - /* 4843 */ { MAD_F(0x05004874) /* 0.312569096 */, 18 }, - /* 4844 */ { MAD_F(0x0500a2b0) /* 0.312655153 */, 18 }, - /* 4845 */ { MAD_F(0x0500fcef) /* 0.312741216 */, 18 }, - /* 4846 */ { MAD_F(0x0501572e) /* 0.312827284 */, 18 }, - /* 4847 */ { MAD_F(0x0501b170) /* 0.312913359 */, 18 }, - - /* 4848 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 18 }, - /* 4849 */ { MAD_F(0x050265f8) /* 0.313085526 */, 18 }, - /* 4850 */ { MAD_F(0x0502c03e) /* 0.313171618 */, 18 }, - /* 4851 */ { MAD_F(0x05031a86) /* 0.313257716 */, 18 }, - /* 4852 */ { MAD_F(0x050374cf) /* 0.313343820 */, 18 }, - /* 4853 */ { MAD_F(0x0503cf1a) /* 0.313429931 */, 18 }, - /* 4854 */ { MAD_F(0x05042967) /* 0.313516047 */, 18 }, - /* 4855 */ { MAD_F(0x050483b5) /* 0.313602168 */, 18 }, - /* 4856 */ { MAD_F(0x0504de05) /* 0.313688296 */, 18 }, - /* 4857 */ { MAD_F(0x05053856) /* 0.313774430 */, 18 }, - /* 4858 */ { MAD_F(0x050592a9) /* 0.313860570 */, 18 }, - /* 4859 */ { MAD_F(0x0505ecfd) /* 0.313946715 */, 18 }, - /* 4860 */ { MAD_F(0x05064754) /* 0.314032867 */, 18 }, - /* 4861 */ { MAD_F(0x0506a1ab) /* 0.314119024 */, 18 }, - /* 4862 */ { MAD_F(0x0506fc04) /* 0.314205187 */, 18 }, - /* 4863 */ { MAD_F(0x0507565f) /* 0.314291357 */, 18 }, - - /* 4864 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 18 }, - /* 4865 */ { MAD_F(0x05080b1a) /* 0.314463713 */, 18 }, - /* 4866 */ { MAD_F(0x05086579) /* 0.314549900 */, 18 }, - /* 4867 */ { MAD_F(0x0508bfdb) /* 0.314636092 */, 18 }, - /* 4868 */ { MAD_F(0x05091a3d) /* 0.314722291 */, 18 }, - /* 4869 */ { MAD_F(0x050974a2) /* 0.314808496 */, 18 }, - /* 4870 */ { MAD_F(0x0509cf08) /* 0.314894706 */, 18 }, - /* 4871 */ { MAD_F(0x050a296f) /* 0.314980923 */, 18 }, - /* 4872 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 18 }, - /* 4873 */ { MAD_F(0x050ade43) /* 0.315153373 */, 18 }, - /* 4874 */ { MAD_F(0x050b38af) /* 0.315239607 */, 18 }, - /* 4875 */ { MAD_F(0x050b931d) /* 0.315325847 */, 18 }, - /* 4876 */ { MAD_F(0x050bed8d) /* 0.315412093 */, 18 }, - /* 4877 */ { MAD_F(0x050c47fe) /* 0.315498345 */, 18 }, - /* 4878 */ { MAD_F(0x050ca271) /* 0.315584603 */, 18 }, - /* 4879 */ { MAD_F(0x050cfce5) /* 0.315670866 */, 18 }, - - /* 4880 */ { MAD_F(0x050d575b) /* 0.315757136 */, 18 }, - /* 4881 */ { MAD_F(0x050db1d2) /* 0.315843411 */, 18 }, - /* 4882 */ { MAD_F(0x050e0c4b) /* 0.315929693 */, 18 }, - /* 4883 */ { MAD_F(0x050e66c5) /* 0.316015980 */, 18 }, - /* 4884 */ { MAD_F(0x050ec141) /* 0.316102273 */, 18 }, - /* 4885 */ { MAD_F(0x050f1bbf) /* 0.316188572 */, 18 }, - /* 4886 */ { MAD_F(0x050f763e) /* 0.316274877 */, 18 }, - /* 4887 */ { MAD_F(0x050fd0bf) /* 0.316361187 */, 18 }, - /* 4888 */ { MAD_F(0x05102b42) /* 0.316447504 */, 18 }, - /* 4889 */ { MAD_F(0x051085c6) /* 0.316533826 */, 18 }, - /* 4890 */ { MAD_F(0x0510e04b) /* 0.316620155 */, 18 }, - /* 4891 */ { MAD_F(0x05113ad3) /* 0.316706489 */, 18 }, - /* 4892 */ { MAD_F(0x0511955b) /* 0.316792829 */, 18 }, - /* 4893 */ { MAD_F(0x0511efe6) /* 0.316879175 */, 18 }, - /* 4894 */ { MAD_F(0x05124a72) /* 0.316965527 */, 18 }, - /* 4895 */ { MAD_F(0x0512a4ff) /* 0.317051885 */, 18 }, - - /* 4896 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 18 }, - /* 4897 */ { MAD_F(0x05135a1f) /* 0.317224618 */, 18 }, - /* 4898 */ { MAD_F(0x0513b4b1) /* 0.317310994 */, 18 }, - /* 4899 */ { MAD_F(0x05140f45) /* 0.317397375 */, 18 }, - /* 4900 */ { MAD_F(0x051469da) /* 0.317483762 */, 18 }, - /* 4901 */ { MAD_F(0x0514c471) /* 0.317570155 */, 18 }, - /* 4902 */ { MAD_F(0x05151f0a) /* 0.317656554 */, 18 }, - /* 4903 */ { MAD_F(0x051579a4) /* 0.317742959 */, 18 }, - /* 4904 */ { MAD_F(0x0515d440) /* 0.317829370 */, 18 }, - /* 4905 */ { MAD_F(0x05162edd) /* 0.317915786 */, 18 }, - /* 4906 */ { MAD_F(0x0516897c) /* 0.318002209 */, 18 }, - /* 4907 */ { MAD_F(0x0516e41c) /* 0.318088637 */, 18 }, - /* 4908 */ { MAD_F(0x05173ebe) /* 0.318175071 */, 18 }, - /* 4909 */ { MAD_F(0x05179962) /* 0.318261511 */, 18 }, - /* 4910 */ { MAD_F(0x0517f407) /* 0.318347957 */, 18 }, - /* 4911 */ { MAD_F(0x05184eae) /* 0.318434409 */, 18 }, - - /* 4912 */ { MAD_F(0x0518a956) /* 0.318520867 */, 18 }, - /* 4913 */ { MAD_F(0x05190400) /* 0.318607330 */, 18 }, - /* 4914 */ { MAD_F(0x05195eab) /* 0.318693800 */, 18 }, - /* 4915 */ { MAD_F(0x0519b958) /* 0.318780275 */, 18 }, - /* 4916 */ { MAD_F(0x051a1407) /* 0.318866756 */, 18 }, - /* 4917 */ { MAD_F(0x051a6eb7) /* 0.318953243 */, 18 }, - /* 4918 */ { MAD_F(0x051ac969) /* 0.319039736 */, 18 }, - /* 4919 */ { MAD_F(0x051b241c) /* 0.319126235 */, 18 }, - /* 4920 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 18 }, - /* 4921 */ { MAD_F(0x051bd987) /* 0.319299250 */, 18 }, - /* 4922 */ { MAD_F(0x051c3440) /* 0.319385766 */, 18 }, - /* 4923 */ { MAD_F(0x051c8ef9) /* 0.319472288 */, 18 }, - /* 4924 */ { MAD_F(0x051ce9b4) /* 0.319558816 */, 18 }, - /* 4925 */ { MAD_F(0x051d4471) /* 0.319645350 */, 18 }, - /* 4926 */ { MAD_F(0x051d9f2f) /* 0.319731890 */, 18 }, - /* 4927 */ { MAD_F(0x051df9ef) /* 0.319818435 */, 18 }, - - /* 4928 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 18 }, - /* 4929 */ { MAD_F(0x051eaf74) /* 0.319991544 */, 18 }, - /* 4930 */ { MAD_F(0x051f0a38) /* 0.320078107 */, 18 }, - /* 4931 */ { MAD_F(0x051f64ff) /* 0.320164676 */, 18 }, - /* 4932 */ { MAD_F(0x051fbfc6) /* 0.320251251 */, 18 }, - /* 4933 */ { MAD_F(0x05201a90) /* 0.320337832 */, 18 }, - /* 4934 */ { MAD_F(0x0520755b) /* 0.320424419 */, 18 }, - /* 4935 */ { MAD_F(0x0520d027) /* 0.320511011 */, 18 }, - /* 4936 */ { MAD_F(0x05212af5) /* 0.320597609 */, 18 }, - /* 4937 */ { MAD_F(0x052185c5) /* 0.320684213 */, 18 }, - /* 4938 */ { MAD_F(0x0521e096) /* 0.320770823 */, 18 }, - /* 4939 */ { MAD_F(0x05223b69) /* 0.320857439 */, 18 }, - /* 4940 */ { MAD_F(0x0522963d) /* 0.320944061 */, 18 }, - /* 4941 */ { MAD_F(0x0522f113) /* 0.321030688 */, 18 }, - /* 4942 */ { MAD_F(0x05234bea) /* 0.321117322 */, 18 }, - /* 4943 */ { MAD_F(0x0523a6c3) /* 0.321203961 */, 18 }, - - /* 4944 */ { MAD_F(0x0524019e) /* 0.321290606 */, 18 }, - /* 4945 */ { MAD_F(0x05245c7a) /* 0.321377257 */, 18 }, - /* 4946 */ { MAD_F(0x0524b758) /* 0.321463913 */, 18 }, - /* 4947 */ { MAD_F(0x05251237) /* 0.321550576 */, 18 }, - /* 4948 */ { MAD_F(0x05256d18) /* 0.321637244 */, 18 }, - /* 4949 */ { MAD_F(0x0525c7fb) /* 0.321723919 */, 18 }, - /* 4950 */ { MAD_F(0x052622df) /* 0.321810599 */, 18 }, - /* 4951 */ { MAD_F(0x05267dc4) /* 0.321897285 */, 18 }, - /* 4952 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 18 }, - /* 4953 */ { MAD_F(0x05273394) /* 0.322070674 */, 18 }, - /* 4954 */ { MAD_F(0x05278e7e) /* 0.322157377 */, 18 }, - /* 4955 */ { MAD_F(0x0527e96a) /* 0.322244087 */, 18 }, - /* 4956 */ { MAD_F(0x05284457) /* 0.322330802 */, 18 }, - /* 4957 */ { MAD_F(0x05289f46) /* 0.322417523 */, 18 }, - /* 4958 */ { MAD_F(0x0528fa37) /* 0.322504249 */, 18 }, - /* 4959 */ { MAD_F(0x05295529) /* 0.322590982 */, 18 }, - - /* 4960 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 18 }, - /* 4961 */ { MAD_F(0x052a0b12) /* 0.322764465 */, 18 }, - /* 4962 */ { MAD_F(0x052a6609) /* 0.322851215 */, 18 }, - /* 4963 */ { MAD_F(0x052ac101) /* 0.322937971 */, 18 }, - /* 4964 */ { MAD_F(0x052b1bfb) /* 0.323024732 */, 18 }, - /* 4965 */ { MAD_F(0x052b76f7) /* 0.323111500 */, 18 }, - /* 4966 */ { MAD_F(0x052bd1f4) /* 0.323198273 */, 18 }, - /* 4967 */ { MAD_F(0x052c2cf2) /* 0.323285052 */, 18 }, - /* 4968 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 18 }, - /* 4969 */ { MAD_F(0x052ce2f4) /* 0.323458628 */, 18 }, - /* 4970 */ { MAD_F(0x052d3df7) /* 0.323545425 */, 18 }, - /* 4971 */ { MAD_F(0x052d98fc) /* 0.323632227 */, 18 }, - /* 4972 */ { MAD_F(0x052df403) /* 0.323719036 */, 18 }, - /* 4973 */ { MAD_F(0x052e4f0b) /* 0.323805850 */, 18 }, - /* 4974 */ { MAD_F(0x052eaa14) /* 0.323892670 */, 18 }, - /* 4975 */ { MAD_F(0x052f051f) /* 0.323979496 */, 18 }, - - /* 4976 */ { MAD_F(0x052f602c) /* 0.324066327 */, 18 }, - /* 4977 */ { MAD_F(0x052fbb3a) /* 0.324153165 */, 18 }, - /* 4978 */ { MAD_F(0x0530164a) /* 0.324240008 */, 18 }, - /* 4979 */ { MAD_F(0x0530715b) /* 0.324326857 */, 18 }, - /* 4980 */ { MAD_F(0x0530cc6e) /* 0.324413712 */, 18 }, - /* 4981 */ { MAD_F(0x05312783) /* 0.324500572 */, 18 }, - /* 4982 */ { MAD_F(0x05318299) /* 0.324587439 */, 18 }, - /* 4983 */ { MAD_F(0x0531ddb0) /* 0.324674311 */, 18 }, - /* 4984 */ { MAD_F(0x053238ca) /* 0.324761189 */, 18 }, - /* 4985 */ { MAD_F(0x053293e4) /* 0.324848073 */, 18 }, - /* 4986 */ { MAD_F(0x0532ef01) /* 0.324934963 */, 18 }, - /* 4987 */ { MAD_F(0x05334a1e) /* 0.325021858 */, 18 }, - /* 4988 */ { MAD_F(0x0533a53e) /* 0.325108760 */, 18 }, - /* 4989 */ { MAD_F(0x0534005f) /* 0.325195667 */, 18 }, - /* 4990 */ { MAD_F(0x05345b81) /* 0.325282580 */, 18 }, - /* 4991 */ { MAD_F(0x0534b6a5) /* 0.325369498 */, 18 }, - - /* 4992 */ { MAD_F(0x053511cb) /* 0.325456423 */, 18 }, - /* 4993 */ { MAD_F(0x05356cf2) /* 0.325543353 */, 18 }, - /* 4994 */ { MAD_F(0x0535c81b) /* 0.325630290 */, 18 }, - /* 4995 */ { MAD_F(0x05362345) /* 0.325717232 */, 18 }, - /* 4996 */ { MAD_F(0x05367e71) /* 0.325804179 */, 18 }, - /* 4997 */ { MAD_F(0x0536d99f) /* 0.325891133 */, 18 }, - /* 4998 */ { MAD_F(0x053734ce) /* 0.325978092 */, 18 }, - /* 4999 */ { MAD_F(0x05378ffe) /* 0.326065057 */, 18 }, - /* 5000 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 18 }, - /* 5001 */ { MAD_F(0x05384664) /* 0.326239005 */, 18 }, - /* 5002 */ { MAD_F(0x0538a199) /* 0.326325988 */, 18 }, - /* 5003 */ { MAD_F(0x0538fcd0) /* 0.326412976 */, 18 }, - /* 5004 */ { MAD_F(0x05395808) /* 0.326499970 */, 18 }, - /* 5005 */ { MAD_F(0x0539b342) /* 0.326586970 */, 18 }, - /* 5006 */ { MAD_F(0x053a0e7d) /* 0.326673976 */, 18 }, - /* 5007 */ { MAD_F(0x053a69ba) /* 0.326760988 */, 18 }, - - /* 5008 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 18 }, - /* 5009 */ { MAD_F(0x053b2039) /* 0.326935028 */, 18 }, - /* 5010 */ { MAD_F(0x053b7b7b) /* 0.327022057 */, 18 }, - /* 5011 */ { MAD_F(0x053bd6be) /* 0.327109092 */, 18 }, - /* 5012 */ { MAD_F(0x053c3203) /* 0.327196132 */, 18 }, - /* 5013 */ { MAD_F(0x053c8d49) /* 0.327283178 */, 18 }, - /* 5014 */ { MAD_F(0x053ce891) /* 0.327370231 */, 18 }, - /* 5015 */ { MAD_F(0x053d43da) /* 0.327457288 */, 18 }, - /* 5016 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 18 }, - /* 5017 */ { MAD_F(0x053dfa72) /* 0.327631421 */, 18 }, - /* 5018 */ { MAD_F(0x053e55c0) /* 0.327718497 */, 18 }, - /* 5019 */ { MAD_F(0x053eb10f) /* 0.327805578 */, 18 }, - /* 5020 */ { MAD_F(0x053f0c61) /* 0.327892665 */, 18 }, - /* 5021 */ { MAD_F(0x053f67b3) /* 0.327979757 */, 18 }, - /* 5022 */ { MAD_F(0x053fc308) /* 0.328066855 */, 18 }, - /* 5023 */ { MAD_F(0x05401e5e) /* 0.328153960 */, 18 }, - - /* 5024 */ { MAD_F(0x054079b5) /* 0.328241070 */, 18 }, - /* 5025 */ { MAD_F(0x0540d50e) /* 0.328328185 */, 18 }, - /* 5026 */ { MAD_F(0x05413068) /* 0.328415307 */, 18 }, - /* 5027 */ { MAD_F(0x05418bc4) /* 0.328502434 */, 18 }, - /* 5028 */ { MAD_F(0x0541e722) /* 0.328589567 */, 18 }, - /* 5029 */ { MAD_F(0x05424281) /* 0.328676706 */, 18 }, - /* 5030 */ { MAD_F(0x05429de2) /* 0.328763850 */, 18 }, - /* 5031 */ { MAD_F(0x0542f944) /* 0.328851001 */, 18 }, - /* 5032 */ { MAD_F(0x054354a8) /* 0.328938157 */, 18 }, - /* 5033 */ { MAD_F(0x0543b00d) /* 0.329025319 */, 18 }, - /* 5034 */ { MAD_F(0x05440b74) /* 0.329112486 */, 18 }, - /* 5035 */ { MAD_F(0x054466dd) /* 0.329199660 */, 18 }, - /* 5036 */ { MAD_F(0x0544c247) /* 0.329286839 */, 18 }, - /* 5037 */ { MAD_F(0x05451db2) /* 0.329374024 */, 18 }, - /* 5038 */ { MAD_F(0x0545791f) /* 0.329461215 */, 18 }, - /* 5039 */ { MAD_F(0x0545d48e) /* 0.329548411 */, 18 }, - - /* 5040 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 18 }, - /* 5041 */ { MAD_F(0x05468b70) /* 0.329722822 */, 18 }, - /* 5042 */ { MAD_F(0x0546e6e3) /* 0.329810036 */, 18 }, - /* 5043 */ { MAD_F(0x05474258) /* 0.329897255 */, 18 }, - /* 5044 */ { MAD_F(0x05479dce) /* 0.329984481 */, 18 }, - /* 5045 */ { MAD_F(0x0547f946) /* 0.330071712 */, 18 }, - /* 5046 */ { MAD_F(0x054854c0) /* 0.330158949 */, 18 }, - /* 5047 */ { MAD_F(0x0548b03b) /* 0.330246191 */, 18 }, - /* 5048 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 18 }, - /* 5049 */ { MAD_F(0x05496735) /* 0.330420694 */, 18 }, - /* 5050 */ { MAD_F(0x0549c2b5) /* 0.330507954 */, 18 }, - /* 5051 */ { MAD_F(0x054a1e36) /* 0.330595220 */, 18 }, - /* 5052 */ { MAD_F(0x054a79b9) /* 0.330682491 */, 18 }, - /* 5053 */ { MAD_F(0x054ad53d) /* 0.330769768 */, 18 }, - /* 5054 */ { MAD_F(0x054b30c3) /* 0.330857051 */, 18 }, - /* 5055 */ { MAD_F(0x054b8c4b) /* 0.330944340 */, 18 }, - - /* 5056 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 18 }, - /* 5057 */ { MAD_F(0x054c435e) /* 0.331118935 */, 18 }, - /* 5058 */ { MAD_F(0x054c9eea) /* 0.331206241 */, 18 }, - /* 5059 */ { MAD_F(0x054cfa78) /* 0.331293553 */, 18 }, - /* 5060 */ { MAD_F(0x054d5607) /* 0.331380870 */, 18 }, - /* 5061 */ { MAD_F(0x054db197) /* 0.331468193 */, 18 }, - /* 5062 */ { MAD_F(0x054e0d2a) /* 0.331555522 */, 18 }, - /* 5063 */ { MAD_F(0x054e68bd) /* 0.331642857 */, 18 }, - /* 5064 */ { MAD_F(0x054ec453) /* 0.331730198 */, 18 }, - /* 5065 */ { MAD_F(0x054f1fe9) /* 0.331817544 */, 18 }, - /* 5066 */ { MAD_F(0x054f7b82) /* 0.331904896 */, 18 }, - /* 5067 */ { MAD_F(0x054fd71c) /* 0.331992254 */, 18 }, - /* 5068 */ { MAD_F(0x055032b7) /* 0.332079617 */, 18 }, - /* 5069 */ { MAD_F(0x05508e54) /* 0.332166986 */, 18 }, - /* 5070 */ { MAD_F(0x0550e9f3) /* 0.332254361 */, 18 }, - /* 5071 */ { MAD_F(0x05514593) /* 0.332341742 */, 18 }, - - /* 5072 */ { MAD_F(0x0551a134) /* 0.332429129 */, 18 }, - /* 5073 */ { MAD_F(0x0551fcd8) /* 0.332516521 */, 18 }, - /* 5074 */ { MAD_F(0x0552587c) /* 0.332603919 */, 18 }, - /* 5075 */ { MAD_F(0x0552b423) /* 0.332691323 */, 18 }, - /* 5076 */ { MAD_F(0x05530fca) /* 0.332778732 */, 18 }, - /* 5077 */ { MAD_F(0x05536b74) /* 0.332866147 */, 18 }, - /* 5078 */ { MAD_F(0x0553c71f) /* 0.332953568 */, 18 }, - /* 5079 */ { MAD_F(0x055422cb) /* 0.333040995 */, 18 }, - /* 5080 */ { MAD_F(0x05547e79) /* 0.333128427 */, 18 }, - /* 5081 */ { MAD_F(0x0554da29) /* 0.333215865 */, 18 }, - /* 5082 */ { MAD_F(0x055535da) /* 0.333303309 */, 18 }, - /* 5083 */ { MAD_F(0x0555918c) /* 0.333390759 */, 18 }, - /* 5084 */ { MAD_F(0x0555ed40) /* 0.333478214 */, 18 }, - /* 5085 */ { MAD_F(0x055648f6) /* 0.333565675 */, 18 }, - /* 5086 */ { MAD_F(0x0556a4ad) /* 0.333653142 */, 18 }, - /* 5087 */ { MAD_F(0x05570066) /* 0.333740615 */, 18 }, - - /* 5088 */ { MAD_F(0x05575c20) /* 0.333828093 */, 18 }, - /* 5089 */ { MAD_F(0x0557b7dc) /* 0.333915577 */, 18 }, - /* 5090 */ { MAD_F(0x05581399) /* 0.334003067 */, 18 }, - /* 5091 */ { MAD_F(0x05586f58) /* 0.334090562 */, 18 }, - /* 5092 */ { MAD_F(0x0558cb19) /* 0.334178063 */, 18 }, - /* 5093 */ { MAD_F(0x055926db) /* 0.334265570 */, 18 }, - /* 5094 */ { MAD_F(0x0559829e) /* 0.334353083 */, 18 }, - /* 5095 */ { MAD_F(0x0559de63) /* 0.334440601 */, 18 }, - /* 5096 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 18 }, - /* 5097 */ { MAD_F(0x055a95f2) /* 0.334615655 */, 18 }, - /* 5098 */ { MAD_F(0x055af1bb) /* 0.334703191 */, 18 }, - /* 5099 */ { MAD_F(0x055b4d87) /* 0.334790732 */, 18 }, - /* 5100 */ { MAD_F(0x055ba953) /* 0.334878279 */, 18 }, - /* 5101 */ { MAD_F(0x055c0522) /* 0.334965832 */, 18 }, - /* 5102 */ { MAD_F(0x055c60f1) /* 0.335053391 */, 18 }, - /* 5103 */ { MAD_F(0x055cbcc3) /* 0.335140955 */, 18 }, - - /* 5104 */ { MAD_F(0x055d1896) /* 0.335228525 */, 18 }, - /* 5105 */ { MAD_F(0x055d746a) /* 0.335316100 */, 18 }, - /* 5106 */ { MAD_F(0x055dd040) /* 0.335403682 */, 18 }, - /* 5107 */ { MAD_F(0x055e2c17) /* 0.335491269 */, 18 }, - /* 5108 */ { MAD_F(0x055e87f0) /* 0.335578861 */, 18 }, - /* 5109 */ { MAD_F(0x055ee3cb) /* 0.335666460 */, 18 }, - /* 5110 */ { MAD_F(0x055f3fa7) /* 0.335754064 */, 18 }, - /* 5111 */ { MAD_F(0x055f9b85) /* 0.335841674 */, 18 }, - /* 5112 */ { MAD_F(0x055ff764) /* 0.335929290 */, 18 }, - /* 5113 */ { MAD_F(0x05605344) /* 0.336016911 */, 18 }, - /* 5114 */ { MAD_F(0x0560af27) /* 0.336104538 */, 18 }, - /* 5115 */ { MAD_F(0x05610b0a) /* 0.336192171 */, 18 }, - /* 5116 */ { MAD_F(0x056166f0) /* 0.336279809 */, 18 }, - /* 5117 */ { MAD_F(0x0561c2d7) /* 0.336367453 */, 18 }, - /* 5118 */ { MAD_F(0x05621ebf) /* 0.336455103 */, 18 }, - /* 5119 */ { MAD_F(0x05627aa9) /* 0.336542759 */, 18 }, - - /* 5120 */ { MAD_F(0x0562d694) /* 0.336630420 */, 18 }, - /* 5121 */ { MAD_F(0x05633281) /* 0.336718087 */, 18 }, - /* 5122 */ { MAD_F(0x05638e70) /* 0.336805760 */, 18 }, - /* 5123 */ { MAD_F(0x0563ea60) /* 0.336893439 */, 18 }, - /* 5124 */ { MAD_F(0x05644651) /* 0.336981123 */, 18 }, - /* 5125 */ { MAD_F(0x0564a244) /* 0.337068813 */, 18 }, - /* 5126 */ { MAD_F(0x0564fe39) /* 0.337156508 */, 18 }, - /* 5127 */ { MAD_F(0x05655a2f) /* 0.337244209 */, 18 }, - /* 5128 */ { MAD_F(0x0565b627) /* 0.337331916 */, 18 }, - /* 5129 */ { MAD_F(0x05661220) /* 0.337419629 */, 18 }, - /* 5130 */ { MAD_F(0x05666e1a) /* 0.337507347 */, 18 }, - /* 5131 */ { MAD_F(0x0566ca17) /* 0.337595071 */, 18 }, - /* 5132 */ { MAD_F(0x05672614) /* 0.337682801 */, 18 }, - /* 5133 */ { MAD_F(0x05678214) /* 0.337770537 */, 18 }, - /* 5134 */ { MAD_F(0x0567de15) /* 0.337858278 */, 18 }, - /* 5135 */ { MAD_F(0x05683a17) /* 0.337946025 */, 18 }, - - /* 5136 */ { MAD_F(0x0568961b) /* 0.338033777 */, 18 }, - /* 5137 */ { MAD_F(0x0568f220) /* 0.338121535 */, 18 }, - /* 5138 */ { MAD_F(0x05694e27) /* 0.338209299 */, 18 }, - /* 5139 */ { MAD_F(0x0569aa30) /* 0.338297069 */, 18 }, - /* 5140 */ { MAD_F(0x056a063a) /* 0.338384844 */, 18 }, - /* 5141 */ { MAD_F(0x056a6245) /* 0.338472625 */, 18 }, - /* 5142 */ { MAD_F(0x056abe52) /* 0.338560412 */, 18 }, - /* 5143 */ { MAD_F(0x056b1a61) /* 0.338648204 */, 18 }, - /* 5144 */ { MAD_F(0x056b7671) /* 0.338736002 */, 18 }, - /* 5145 */ { MAD_F(0x056bd283) /* 0.338823806 */, 18 }, - /* 5146 */ { MAD_F(0x056c2e96) /* 0.338911616 */, 18 }, - /* 5147 */ { MAD_F(0x056c8aab) /* 0.338999431 */, 18 }, - /* 5148 */ { MAD_F(0x056ce6c1) /* 0.339087252 */, 18 }, - /* 5149 */ { MAD_F(0x056d42d9) /* 0.339175078 */, 18 }, - /* 5150 */ { MAD_F(0x056d9ef2) /* 0.339262910 */, 18 }, - /* 5151 */ { MAD_F(0x056dfb0d) /* 0.339350748 */, 18 }, - - /* 5152 */ { MAD_F(0x056e5729) /* 0.339438592 */, 18 }, - /* 5153 */ { MAD_F(0x056eb347) /* 0.339526441 */, 18 }, - /* 5154 */ { MAD_F(0x056f0f66) /* 0.339614296 */, 18 }, - /* 5155 */ { MAD_F(0x056f6b87) /* 0.339702157 */, 18 }, - /* 5156 */ { MAD_F(0x056fc7aa) /* 0.339790023 */, 18 }, - /* 5157 */ { MAD_F(0x057023cd) /* 0.339877895 */, 18 }, - /* 5158 */ { MAD_F(0x05707ff3) /* 0.339965773 */, 18 }, - /* 5159 */ { MAD_F(0x0570dc1a) /* 0.340053656 */, 18 }, - /* 5160 */ { MAD_F(0x05713843) /* 0.340141545 */, 18 }, - /* 5161 */ { MAD_F(0x0571946d) /* 0.340229440 */, 18 }, - /* 5162 */ { MAD_F(0x0571f098) /* 0.340317340 */, 18 }, - /* 5163 */ { MAD_F(0x05724cc5) /* 0.340405246 */, 18 }, - /* 5164 */ { MAD_F(0x0572a8f4) /* 0.340493158 */, 18 }, - /* 5165 */ { MAD_F(0x05730524) /* 0.340581075 */, 18 }, - /* 5166 */ { MAD_F(0x05736156) /* 0.340668999 */, 18 }, - /* 5167 */ { MAD_F(0x0573bd89) /* 0.340756927 */, 18 }, - - /* 5168 */ { MAD_F(0x057419be) /* 0.340844862 */, 18 }, - /* 5169 */ { MAD_F(0x057475f4) /* 0.340932802 */, 18 }, - /* 5170 */ { MAD_F(0x0574d22c) /* 0.341020748 */, 18 }, - /* 5171 */ { MAD_F(0x05752e65) /* 0.341108699 */, 18 }, - /* 5172 */ { MAD_F(0x05758aa0) /* 0.341196656 */, 18 }, - /* 5173 */ { MAD_F(0x0575e6dc) /* 0.341284619 */, 18 }, - /* 5174 */ { MAD_F(0x0576431a) /* 0.341372587 */, 18 }, - /* 5175 */ { MAD_F(0x05769f59) /* 0.341460562 */, 18 }, - /* 5176 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 18 }, - /* 5177 */ { MAD_F(0x057757dd) /* 0.341636527 */, 18 }, - /* 5178 */ { MAD_F(0x0577b421) /* 0.341724518 */, 18 }, - /* 5179 */ { MAD_F(0x05781066) /* 0.341812515 */, 18 }, - /* 5180 */ { MAD_F(0x05786cad) /* 0.341900517 */, 18 }, - /* 5181 */ { MAD_F(0x0578c8f5) /* 0.341988525 */, 18 }, - /* 5182 */ { MAD_F(0x0579253f) /* 0.342076539 */, 18 }, - /* 5183 */ { MAD_F(0x0579818b) /* 0.342164558 */, 18 }, - - /* 5184 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 18 }, - /* 5185 */ { MAD_F(0x057a3a27) /* 0.342340614 */, 18 }, - /* 5186 */ { MAD_F(0x057a9677) /* 0.342428651 */, 18 }, - /* 5187 */ { MAD_F(0x057af2c8) /* 0.342516693 */, 18 }, - /* 5188 */ { MAD_F(0x057b4f1c) /* 0.342604741 */, 18 }, - /* 5189 */ { MAD_F(0x057bab70) /* 0.342692794 */, 18 }, - /* 5190 */ { MAD_F(0x057c07c6) /* 0.342780853 */, 18 }, - /* 5191 */ { MAD_F(0x057c641e) /* 0.342868918 */, 18 }, - /* 5192 */ { MAD_F(0x057cc077) /* 0.342956988 */, 18 }, - /* 5193 */ { MAD_F(0x057d1cd2) /* 0.343045064 */, 18 }, - /* 5194 */ { MAD_F(0x057d792e) /* 0.343133146 */, 18 }, - /* 5195 */ { MAD_F(0x057dd58c) /* 0.343221233 */, 18 }, - /* 5196 */ { MAD_F(0x057e31eb) /* 0.343309326 */, 18 }, - /* 5197 */ { MAD_F(0x057e8e4c) /* 0.343397425 */, 18 }, - /* 5198 */ { MAD_F(0x057eeaae) /* 0.343485529 */, 18 }, - /* 5199 */ { MAD_F(0x057f4712) /* 0.343573639 */, 18 }, - - /* 5200 */ { MAD_F(0x057fa378) /* 0.343661754 */, 18 }, - /* 5201 */ { MAD_F(0x057fffde) /* 0.343749876 */, 18 }, - /* 5202 */ { MAD_F(0x05805c47) /* 0.343838003 */, 18 }, - /* 5203 */ { MAD_F(0x0580b8b1) /* 0.343926135 */, 18 }, - /* 5204 */ { MAD_F(0x0581151c) /* 0.344014273 */, 18 }, - /* 5205 */ { MAD_F(0x05817189) /* 0.344102417 */, 18 }, - /* 5206 */ { MAD_F(0x0581cdf7) /* 0.344190566 */, 18 }, - /* 5207 */ { MAD_F(0x05822a67) /* 0.344278722 */, 18 }, - /* 5208 */ { MAD_F(0x058286d9) /* 0.344366882 */, 18 }, - /* 5209 */ { MAD_F(0x0582e34c) /* 0.344455049 */, 18 }, - /* 5210 */ { MAD_F(0x05833fc0) /* 0.344543221 */, 18 }, - /* 5211 */ { MAD_F(0x05839c36) /* 0.344631398 */, 18 }, - /* 5212 */ { MAD_F(0x0583f8ae) /* 0.344719582 */, 18 }, - /* 5213 */ { MAD_F(0x05845527) /* 0.344807771 */, 18 }, - /* 5214 */ { MAD_F(0x0584b1a1) /* 0.344895965 */, 18 }, - /* 5215 */ { MAD_F(0x05850e1e) /* 0.344984165 */, 18 }, - - /* 5216 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 18 }, - /* 5217 */ { MAD_F(0x0585c71a) /* 0.345160583 */, 18 }, - /* 5218 */ { MAD_F(0x0586239b) /* 0.345248800 */, 18 }, - /* 5219 */ { MAD_F(0x0586801d) /* 0.345337023 */, 18 }, - /* 5220 */ { MAD_F(0x0586dca1) /* 0.345425251 */, 18 }, - /* 5221 */ { MAD_F(0x05873926) /* 0.345513485 */, 18 }, - /* 5222 */ { MAD_F(0x058795ac) /* 0.345601725 */, 18 }, - /* 5223 */ { MAD_F(0x0587f235) /* 0.345689970 */, 18 }, - /* 5224 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 18 }, - /* 5225 */ { MAD_F(0x0588ab49) /* 0.345866478 */, 18 }, - /* 5226 */ { MAD_F(0x058907d6) /* 0.345954740 */, 18 }, - /* 5227 */ { MAD_F(0x05896464) /* 0.346043008 */, 18 }, - /* 5228 */ { MAD_F(0x0589c0f4) /* 0.346131281 */, 18 }, - /* 5229 */ { MAD_F(0x058a1d85) /* 0.346219560 */, 18 }, - /* 5230 */ { MAD_F(0x058a7a18) /* 0.346307845 */, 18 }, - /* 5231 */ { MAD_F(0x058ad6ac) /* 0.346396135 */, 18 }, - - /* 5232 */ { MAD_F(0x058b3342) /* 0.346484431 */, 18 }, - /* 5233 */ { MAD_F(0x058b8fd9) /* 0.346572733 */, 18 }, - /* 5234 */ { MAD_F(0x058bec72) /* 0.346661040 */, 18 }, - /* 5235 */ { MAD_F(0x058c490c) /* 0.346749353 */, 18 }, - /* 5236 */ { MAD_F(0x058ca5a8) /* 0.346837671 */, 18 }, - /* 5237 */ { MAD_F(0x058d0246) /* 0.346925996 */, 18 }, - /* 5238 */ { MAD_F(0x058d5ee4) /* 0.347014325 */, 18 }, - /* 5239 */ { MAD_F(0x058dbb85) /* 0.347102661 */, 18 }, - /* 5240 */ { MAD_F(0x058e1827) /* 0.347191002 */, 18 }, - /* 5241 */ { MAD_F(0x058e74ca) /* 0.347279348 */, 18 }, - /* 5242 */ { MAD_F(0x058ed16f) /* 0.347367700 */, 18 }, - /* 5243 */ { MAD_F(0x058f2e15) /* 0.347456058 */, 18 }, - /* 5244 */ { MAD_F(0x058f8abd) /* 0.347544422 */, 18 }, - /* 5245 */ { MAD_F(0x058fe766) /* 0.347632791 */, 18 }, - /* 5246 */ { MAD_F(0x05904411) /* 0.347721165 */, 18 }, - /* 5247 */ { MAD_F(0x0590a0be) /* 0.347809546 */, 18 }, - - /* 5248 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 18 }, - /* 5249 */ { MAD_F(0x05915a1b) /* 0.347986323 */, 18 }, - /* 5250 */ { MAD_F(0x0591b6cc) /* 0.348074720 */, 18 }, - /* 5251 */ { MAD_F(0x0592137e) /* 0.348163123 */, 18 }, - /* 5252 */ { MAD_F(0x05927032) /* 0.348251531 */, 18 }, - /* 5253 */ { MAD_F(0x0592cce8) /* 0.348339945 */, 18 }, - /* 5254 */ { MAD_F(0x0593299f) /* 0.348428365 */, 18 }, - /* 5255 */ { MAD_F(0x05938657) /* 0.348516790 */, 18 }, - /* 5256 */ { MAD_F(0x0593e311) /* 0.348605221 */, 18 }, - /* 5257 */ { MAD_F(0x05943fcd) /* 0.348693657 */, 18 }, - /* 5258 */ { MAD_F(0x05949c8a) /* 0.348782099 */, 18 }, - /* 5259 */ { MAD_F(0x0594f948) /* 0.348870547 */, 18 }, - /* 5260 */ { MAD_F(0x05955608) /* 0.348959000 */, 18 }, - /* 5261 */ { MAD_F(0x0595b2ca) /* 0.349047459 */, 18 }, - /* 5262 */ { MAD_F(0x05960f8c) /* 0.349135923 */, 18 }, - /* 5263 */ { MAD_F(0x05966c51) /* 0.349224393 */, 18 }, - - /* 5264 */ { MAD_F(0x0596c917) /* 0.349312869 */, 18 }, - /* 5265 */ { MAD_F(0x059725de) /* 0.349401350 */, 18 }, - /* 5266 */ { MAD_F(0x059782a7) /* 0.349489837 */, 18 }, - /* 5267 */ { MAD_F(0x0597df72) /* 0.349578329 */, 18 }, - /* 5268 */ { MAD_F(0x05983c3e) /* 0.349666827 */, 18 }, - /* 5269 */ { MAD_F(0x0598990c) /* 0.349755331 */, 18 }, - /* 5270 */ { MAD_F(0x0598f5db) /* 0.349843840 */, 18 }, - /* 5271 */ { MAD_F(0x059952ab) /* 0.349932355 */, 18 }, - /* 5272 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 18 }, - /* 5273 */ { MAD_F(0x059a0c51) /* 0.350109402 */, 18 }, - /* 5274 */ { MAD_F(0x059a6926) /* 0.350197933 */, 18 }, - /* 5275 */ { MAD_F(0x059ac5fc) /* 0.350286470 */, 18 }, - /* 5276 */ { MAD_F(0x059b22d4) /* 0.350375013 */, 18 }, - /* 5277 */ { MAD_F(0x059b7fae) /* 0.350463562 */, 18 }, - /* 5278 */ { MAD_F(0x059bdc89) /* 0.350552116 */, 18 }, - /* 5279 */ { MAD_F(0x059c3965) /* 0.350640675 */, 18 }, - - /* 5280 */ { MAD_F(0x059c9643) /* 0.350729240 */, 18 }, - /* 5281 */ { MAD_F(0x059cf323) /* 0.350817811 */, 18 }, - /* 5282 */ { MAD_F(0x059d5004) /* 0.350906388 */, 18 }, - /* 5283 */ { MAD_F(0x059dace6) /* 0.350994970 */, 18 }, - /* 5284 */ { MAD_F(0x059e09cb) /* 0.351083557 */, 18 }, - /* 5285 */ { MAD_F(0x059e66b0) /* 0.351172150 */, 18 }, - /* 5286 */ { MAD_F(0x059ec397) /* 0.351260749 */, 18 }, - /* 5287 */ { MAD_F(0x059f2080) /* 0.351349353 */, 18 }, - /* 5288 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 18 }, - /* 5289 */ { MAD_F(0x059fda55) /* 0.351526579 */, 18 }, - /* 5290 */ { MAD_F(0x05a03742) /* 0.351615200 */, 18 }, - /* 5291 */ { MAD_F(0x05a09431) /* 0.351703827 */, 18 }, - /* 5292 */ { MAD_F(0x05a0f121) /* 0.351792459 */, 18 }, - /* 5293 */ { MAD_F(0x05a14e12) /* 0.351881097 */, 18 }, - /* 5294 */ { MAD_F(0x05a1ab05) /* 0.351969740 */, 18 }, - /* 5295 */ { MAD_F(0x05a207fa) /* 0.352058389 */, 18 }, - - /* 5296 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 18 }, - /* 5297 */ { MAD_F(0x05a2c1e7) /* 0.352235704 */, 18 }, - /* 5298 */ { MAD_F(0x05a31ee1) /* 0.352324369 */, 18 }, - /* 5299 */ { MAD_F(0x05a37bdb) /* 0.352413041 */, 18 }, - /* 5300 */ { MAD_F(0x05a3d8d7) /* 0.352501718 */, 18 }, - /* 5301 */ { MAD_F(0x05a435d5) /* 0.352590400 */, 18 }, - /* 5302 */ { MAD_F(0x05a492d4) /* 0.352679088 */, 18 }, - /* 5303 */ { MAD_F(0x05a4efd4) /* 0.352767782 */, 18 }, - /* 5304 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 18 }, - /* 5305 */ { MAD_F(0x05a5a9da) /* 0.352945186 */, 18 }, - /* 5306 */ { MAD_F(0x05a606df) /* 0.353033896 */, 18 }, - /* 5307 */ { MAD_F(0x05a663e5) /* 0.353122612 */, 18 }, - /* 5308 */ { MAD_F(0x05a6c0ed) /* 0.353211333 */, 18 }, - /* 5309 */ { MAD_F(0x05a71df7) /* 0.353300061 */, 18 }, - /* 5310 */ { MAD_F(0x05a77b02) /* 0.353388793 */, 18 }, - /* 5311 */ { MAD_F(0x05a7d80e) /* 0.353477531 */, 18 }, - - /* 5312 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 18 }, - /* 5313 */ { MAD_F(0x05a8922c) /* 0.353655024 */, 18 }, - /* 5314 */ { MAD_F(0x05a8ef3c) /* 0.353743779 */, 18 }, - /* 5315 */ { MAD_F(0x05a94c4f) /* 0.353832540 */, 18 }, - /* 5316 */ { MAD_F(0x05a9a963) /* 0.353921306 */, 18 }, - /* 5317 */ { MAD_F(0x05aa0678) /* 0.354010077 */, 18 }, - /* 5318 */ { MAD_F(0x05aa638f) /* 0.354098855 */, 18 }, - /* 5319 */ { MAD_F(0x05aac0a8) /* 0.354187637 */, 18 }, - /* 5320 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 18 }, - /* 5321 */ { MAD_F(0x05ab7add) /* 0.354365220 */, 18 }, - /* 5322 */ { MAD_F(0x05abd7fa) /* 0.354454019 */, 18 }, - /* 5323 */ { MAD_F(0x05ac3518) /* 0.354542824 */, 18 }, - /* 5324 */ { MAD_F(0x05ac9238) /* 0.354631635 */, 18 }, - /* 5325 */ { MAD_F(0x05acef5a) /* 0.354720451 */, 18 }, - /* 5326 */ { MAD_F(0x05ad4c7d) /* 0.354809272 */, 18 }, - /* 5327 */ { MAD_F(0x05ada9a1) /* 0.354898100 */, 18 }, - - /* 5328 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 18 }, - /* 5329 */ { MAD_F(0x05ae63ee) /* 0.355075771 */, 18 }, - /* 5330 */ { MAD_F(0x05aec117) /* 0.355164615 */, 18 }, - /* 5331 */ { MAD_F(0x05af1e41) /* 0.355253464 */, 18 }, - /* 5332 */ { MAD_F(0x05af7b6d) /* 0.355342319 */, 18 }, - /* 5333 */ { MAD_F(0x05afd89b) /* 0.355431180 */, 18 }, - /* 5334 */ { MAD_F(0x05b035c9) /* 0.355520046 */, 18 }, - /* 5335 */ { MAD_F(0x05b092fa) /* 0.355608917 */, 18 }, - /* 5336 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 18 }, - /* 5337 */ { MAD_F(0x05b14d5f) /* 0.355786677 */, 18 }, - /* 5338 */ { MAD_F(0x05b1aa94) /* 0.355875566 */, 18 }, - /* 5339 */ { MAD_F(0x05b207ca) /* 0.355964460 */, 18 }, - /* 5340 */ { MAD_F(0x05b26502) /* 0.356053359 */, 18 }, - /* 5341 */ { MAD_F(0x05b2c23b) /* 0.356142264 */, 18 }, - /* 5342 */ { MAD_F(0x05b31f76) /* 0.356231175 */, 18 }, - /* 5343 */ { MAD_F(0x05b37cb2) /* 0.356320091 */, 18 }, - - /* 5344 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 18 }, - /* 5345 */ { MAD_F(0x05b4372f) /* 0.356497940 */, 18 }, - /* 5346 */ { MAD_F(0x05b4946f) /* 0.356586872 */, 18 }, - /* 5347 */ { MAD_F(0x05b4f1b2) /* 0.356675811 */, 18 }, - /* 5348 */ { MAD_F(0x05b54ef5) /* 0.356764754 */, 18 }, - /* 5349 */ { MAD_F(0x05b5ac3a) /* 0.356853704 */, 18 }, - /* 5350 */ { MAD_F(0x05b60981) /* 0.356942659 */, 18 }, - /* 5351 */ { MAD_F(0x05b666c9) /* 0.357031619 */, 18 }, - /* 5352 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 18 }, - /* 5353 */ { MAD_F(0x05b7215e) /* 0.357209557 */, 18 }, - /* 5354 */ { MAD_F(0x05b77eab) /* 0.357298534 */, 18 }, - /* 5355 */ { MAD_F(0x05b7dbf9) /* 0.357387516 */, 18 }, - /* 5356 */ { MAD_F(0x05b83948) /* 0.357476504 */, 18 }, - /* 5357 */ { MAD_F(0x05b89699) /* 0.357565498 */, 18 }, - /* 5358 */ { MAD_F(0x05b8f3ec) /* 0.357654497 */, 18 }, - /* 5359 */ { MAD_F(0x05b95140) /* 0.357743502 */, 18 }, - - /* 5360 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 18 }, - /* 5361 */ { MAD_F(0x05ba0bec) /* 0.357921528 */, 18 }, - /* 5362 */ { MAD_F(0x05ba6945) /* 0.358010550 */, 18 }, - /* 5363 */ { MAD_F(0x05bac69f) /* 0.358099576 */, 18 }, - /* 5364 */ { MAD_F(0x05bb23fa) /* 0.358188609 */, 18 }, - /* 5365 */ { MAD_F(0x05bb8157) /* 0.358277647 */, 18 }, - /* 5366 */ { MAD_F(0x05bbdeb6) /* 0.358366690 */, 18 }, - /* 5367 */ { MAD_F(0x05bc3c16) /* 0.358455739 */, 18 }, - /* 5368 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 18 }, - /* 5369 */ { MAD_F(0x05bcf6da) /* 0.358633854 */, 18 }, - /* 5370 */ { MAD_F(0x05bd543e) /* 0.358722920 */, 18 }, - /* 5371 */ { MAD_F(0x05bdb1a4) /* 0.358811991 */, 18 }, - /* 5372 */ { MAD_F(0x05be0f0b) /* 0.358901067 */, 18 }, - /* 5373 */ { MAD_F(0x05be6c74) /* 0.358990150 */, 18 }, - /* 5374 */ { MAD_F(0x05bec9df) /* 0.359079237 */, 18 }, - /* 5375 */ { MAD_F(0x05bf274a) /* 0.359168331 */, 18 }, - - /* 5376 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 18 }, - /* 5377 */ { MAD_F(0x05bfe226) /* 0.359346534 */, 18 }, - /* 5378 */ { MAD_F(0x05c03f97) /* 0.359435644 */, 18 }, - /* 5379 */ { MAD_F(0x05c09d08) /* 0.359524759 */, 18 }, - /* 5380 */ { MAD_F(0x05c0fa7c) /* 0.359613880 */, 18 }, - /* 5381 */ { MAD_F(0x05c157f0) /* 0.359703006 */, 18 }, - /* 5382 */ { MAD_F(0x05c1b566) /* 0.359792138 */, 18 }, - /* 5383 */ { MAD_F(0x05c212de) /* 0.359881276 */, 18 }, - /* 5384 */ { MAD_F(0x05c27057) /* 0.359970419 */, 18 }, - /* 5385 */ { MAD_F(0x05c2cdd2) /* 0.360059567 */, 18 }, - /* 5386 */ { MAD_F(0x05c32b4e) /* 0.360148721 */, 18 }, - /* 5387 */ { MAD_F(0x05c388cb) /* 0.360237881 */, 18 }, - /* 5388 */ { MAD_F(0x05c3e64b) /* 0.360327046 */, 18 }, - /* 5389 */ { MAD_F(0x05c443cb) /* 0.360416216 */, 18 }, - /* 5390 */ { MAD_F(0x05c4a14d) /* 0.360505392 */, 18 }, - /* 5391 */ { MAD_F(0x05c4fed1) /* 0.360594574 */, 18 }, - - /* 5392 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 18 }, - /* 5393 */ { MAD_F(0x05c5b9dc) /* 0.360772953 */, 18 }, - /* 5394 */ { MAD_F(0x05c61764) /* 0.360862152 */, 18 }, - /* 5395 */ { MAD_F(0x05c674ed) /* 0.360951355 */, 18 }, - /* 5396 */ { MAD_F(0x05c6d278) /* 0.361040564 */, 18 }, - /* 5397 */ { MAD_F(0x05c73005) /* 0.361129779 */, 18 }, - /* 5398 */ { MAD_F(0x05c78d93) /* 0.361218999 */, 18 }, - /* 5399 */ { MAD_F(0x05c7eb22) /* 0.361308225 */, 18 }, - /* 5400 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 18 }, - /* 5401 */ { MAD_F(0x05c8a645) /* 0.361486693 */, 18 }, - /* 5402 */ { MAD_F(0x05c903d9) /* 0.361575935 */, 18 }, - /* 5403 */ { MAD_F(0x05c9616e) /* 0.361665183 */, 18 }, - /* 5404 */ { MAD_F(0x05c9bf05) /* 0.361754436 */, 18 }, - /* 5405 */ { MAD_F(0x05ca1c9d) /* 0.361843695 */, 18 }, - /* 5406 */ { MAD_F(0x05ca7a37) /* 0.361932959 */, 18 }, - /* 5407 */ { MAD_F(0x05cad7d2) /* 0.362022229 */, 18 }, - - /* 5408 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 18 }, - /* 5409 */ { MAD_F(0x05cb930d) /* 0.362200785 */, 18 }, - /* 5410 */ { MAD_F(0x05cbf0ac) /* 0.362290071 */, 18 }, - /* 5411 */ { MAD_F(0x05cc4e4d) /* 0.362379362 */, 18 }, - /* 5412 */ { MAD_F(0x05ccabf0) /* 0.362468660 */, 18 }, - /* 5413 */ { MAD_F(0x05cd0994) /* 0.362557962 */, 18 }, - /* 5414 */ { MAD_F(0x05cd6739) /* 0.362647271 */, 18 }, - /* 5415 */ { MAD_F(0x05cdc4e0) /* 0.362736584 */, 18 }, - /* 5416 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 18 }, - /* 5417 */ { MAD_F(0x05ce8033) /* 0.362915228 */, 18 }, - /* 5418 */ { MAD_F(0x05ceddde) /* 0.363004559 */, 18 }, - /* 5419 */ { MAD_F(0x05cf3b8b) /* 0.363093894 */, 18 }, - /* 5420 */ { MAD_F(0x05cf9939) /* 0.363183236 */, 18 }, - /* 5421 */ { MAD_F(0x05cff6e9) /* 0.363272582 */, 18 }, - /* 5422 */ { MAD_F(0x05d0549a) /* 0.363361935 */, 18 }, - /* 5423 */ { MAD_F(0x05d0b24d) /* 0.363451292 */, 18 }, - - /* 5424 */ { MAD_F(0x05d11001) /* 0.363540655 */, 18 }, - /* 5425 */ { MAD_F(0x05d16db7) /* 0.363630024 */, 18 }, - /* 5426 */ { MAD_F(0x05d1cb6e) /* 0.363719398 */, 18 }, - /* 5427 */ { MAD_F(0x05d22927) /* 0.363808778 */, 18 }, - /* 5428 */ { MAD_F(0x05d286e1) /* 0.363898163 */, 18 }, - /* 5429 */ { MAD_F(0x05d2e49d) /* 0.363987554 */, 18 }, - /* 5430 */ { MAD_F(0x05d3425a) /* 0.364076950 */, 18 }, - /* 5431 */ { MAD_F(0x05d3a018) /* 0.364166352 */, 18 }, - /* 5432 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 18 }, - /* 5433 */ { MAD_F(0x05d45b9a) /* 0.364345171 */, 18 }, - /* 5434 */ { MAD_F(0x05d4b95d) /* 0.364434589 */, 18 }, - /* 5435 */ { MAD_F(0x05d51721) /* 0.364524013 */, 18 }, - /* 5436 */ { MAD_F(0x05d574e7) /* 0.364613442 */, 18 }, - /* 5437 */ { MAD_F(0x05d5d2af) /* 0.364702877 */, 18 }, - /* 5438 */ { MAD_F(0x05d63078) /* 0.364792317 */, 18 }, - /* 5439 */ { MAD_F(0x05d68e42) /* 0.364881762 */, 18 }, - - /* 5440 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 18 }, - /* 5441 */ { MAD_F(0x05d749db) /* 0.365060669 */, 18 }, - /* 5442 */ { MAD_F(0x05d7a7aa) /* 0.365150131 */, 18 }, - /* 5443 */ { MAD_F(0x05d8057a) /* 0.365239599 */, 18 }, - /* 5444 */ { MAD_F(0x05d8634c) /* 0.365329072 */, 18 }, - /* 5445 */ { MAD_F(0x05d8c11f) /* 0.365418550 */, 18 }, - /* 5446 */ { MAD_F(0x05d91ef4) /* 0.365508034 */, 18 }, - /* 5447 */ { MAD_F(0x05d97cca) /* 0.365597523 */, 18 }, - /* 5448 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 18 }, - /* 5449 */ { MAD_F(0x05da387a) /* 0.365776518 */, 18 }, - /* 5450 */ { MAD_F(0x05da9655) /* 0.365866024 */, 18 }, - /* 5451 */ { MAD_F(0x05daf431) /* 0.365955536 */, 18 }, - /* 5452 */ { MAD_F(0x05db520e) /* 0.366045052 */, 18 }, - /* 5453 */ { MAD_F(0x05dbafed) /* 0.366134574 */, 18 }, - /* 5454 */ { MAD_F(0x05dc0dce) /* 0.366224102 */, 18 }, - /* 5455 */ { MAD_F(0x05dc6baf) /* 0.366313635 */, 18 }, - - /* 5456 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 18 }, - /* 5457 */ { MAD_F(0x05dd2778) /* 0.366492718 */, 18 }, - /* 5458 */ { MAD_F(0x05dd855e) /* 0.366582267 */, 18 }, - /* 5459 */ { MAD_F(0x05dde346) /* 0.366671822 */, 18 }, - /* 5460 */ { MAD_F(0x05de412f) /* 0.366761383 */, 18 }, - /* 5461 */ { MAD_F(0x05de9f1a) /* 0.366850949 */, 18 }, - /* 5462 */ { MAD_F(0x05defd06) /* 0.366940520 */, 18 }, - /* 5463 */ { MAD_F(0x05df5af3) /* 0.367030097 */, 18 }, - /* 5464 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 18 }, - /* 5465 */ { MAD_F(0x05e016d3) /* 0.367209267 */, 18 }, - /* 5466 */ { MAD_F(0x05e074c5) /* 0.367298861 */, 18 }, - /* 5467 */ { MAD_F(0x05e0d2b8) /* 0.367388459 */, 18 }, - /* 5468 */ { MAD_F(0x05e130ad) /* 0.367478064 */, 18 }, - /* 5469 */ { MAD_F(0x05e18ea4) /* 0.367567673 */, 18 }, - /* 5470 */ { MAD_F(0x05e1ec9c) /* 0.367657288 */, 18 }, - /* 5471 */ { MAD_F(0x05e24a95) /* 0.367746909 */, 18 }, - - /* 5472 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 18 }, - /* 5473 */ { MAD_F(0x05e3068c) /* 0.367926167 */, 18 }, - /* 5474 */ { MAD_F(0x05e3648a) /* 0.368015804 */, 18 }, - /* 5475 */ { MAD_F(0x05e3c289) /* 0.368105446 */, 18 }, - /* 5476 */ { MAD_F(0x05e4208a) /* 0.368195094 */, 18 }, - /* 5477 */ { MAD_F(0x05e47e8c) /* 0.368284747 */, 18 }, - /* 5478 */ { MAD_F(0x05e4dc8f) /* 0.368374406 */, 18 }, - /* 5479 */ { MAD_F(0x05e53a94) /* 0.368464070 */, 18 }, - /* 5480 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 18 }, - /* 5481 */ { MAD_F(0x05e5f6a3) /* 0.368643415 */, 18 }, - /* 5482 */ { MAD_F(0x05e654ac) /* 0.368733096 */, 18 }, - /* 5483 */ { MAD_F(0x05e6b2b7) /* 0.368822782 */, 18 }, - /* 5484 */ { MAD_F(0x05e710c4) /* 0.368912473 */, 18 }, - /* 5485 */ { MAD_F(0x05e76ed2) /* 0.369002170 */, 18 }, - /* 5486 */ { MAD_F(0x05e7cce1) /* 0.369091873 */, 18 }, - /* 5487 */ { MAD_F(0x05e82af2) /* 0.369181581 */, 18 }, - - /* 5488 */ { MAD_F(0x05e88904) /* 0.369271294 */, 18 }, - /* 5489 */ { MAD_F(0x05e8e718) /* 0.369361013 */, 18 }, - /* 5490 */ { MAD_F(0x05e9452d) /* 0.369450737 */, 18 }, - /* 5491 */ { MAD_F(0x05e9a343) /* 0.369540467 */, 18 }, - /* 5492 */ { MAD_F(0x05ea015c) /* 0.369630202 */, 18 }, - /* 5493 */ { MAD_F(0x05ea5f75) /* 0.369719942 */, 18 }, - /* 5494 */ { MAD_F(0x05eabd90) /* 0.369809688 */, 18 }, - /* 5495 */ { MAD_F(0x05eb1bad) /* 0.369899440 */, 18 }, - /* 5496 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 18 }, - /* 5497 */ { MAD_F(0x05ebd7ea) /* 0.370078959 */, 18 }, - /* 5498 */ { MAD_F(0x05ec360b) /* 0.370168727 */, 18 }, - /* 5499 */ { MAD_F(0x05ec942d) /* 0.370258500 */, 18 }, - /* 5500 */ { MAD_F(0x05ecf251) /* 0.370348279 */, 18 }, - /* 5501 */ { MAD_F(0x05ed5076) /* 0.370438063 */, 18 }, - /* 5502 */ { MAD_F(0x05edae9d) /* 0.370527853 */, 18 }, - /* 5503 */ { MAD_F(0x05ee0cc5) /* 0.370617648 */, 18 }, - - /* 5504 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 18 }, - /* 5505 */ { MAD_F(0x05eec91a) /* 0.370797254 */, 18 }, - /* 5506 */ { MAD_F(0x05ef2746) /* 0.370887065 */, 18 }, - /* 5507 */ { MAD_F(0x05ef8574) /* 0.370976882 */, 18 }, - /* 5508 */ { MAD_F(0x05efe3a4) /* 0.371066704 */, 18 }, - /* 5509 */ { MAD_F(0x05f041d5) /* 0.371156532 */, 18 }, - /* 5510 */ { MAD_F(0x05f0a007) /* 0.371246365 */, 18 }, - /* 5511 */ { MAD_F(0x05f0fe3b) /* 0.371336203 */, 18 }, - /* 5512 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 18 }, - /* 5513 */ { MAD_F(0x05f1baa7) /* 0.371515897 */, 18 }, - /* 5514 */ { MAD_F(0x05f218df) /* 0.371605751 */, 18 }, - /* 5515 */ { MAD_F(0x05f27719) /* 0.371695612 */, 18 }, - /* 5516 */ { MAD_F(0x05f2d554) /* 0.371785477 */, 18 }, - /* 5517 */ { MAD_F(0x05f33390) /* 0.371875348 */, 18 }, - /* 5518 */ { MAD_F(0x05f391cf) /* 0.371965225 */, 18 }, - /* 5519 */ { MAD_F(0x05f3f00e) /* 0.372055107 */, 18 }, - - /* 5520 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 18 }, - /* 5521 */ { MAD_F(0x05f4ac91) /* 0.372234887 */, 18 }, - /* 5522 */ { MAD_F(0x05f50ad5) /* 0.372324785 */, 18 }, - /* 5523 */ { MAD_F(0x05f5691b) /* 0.372414689 */, 18 }, - /* 5524 */ { MAD_F(0x05f5c761) /* 0.372504598 */, 18 }, - /* 5525 */ { MAD_F(0x05f625aa) /* 0.372594513 */, 18 }, - /* 5526 */ { MAD_F(0x05f683f3) /* 0.372684433 */, 18 }, - /* 5527 */ { MAD_F(0x05f6e23f) /* 0.372774358 */, 18 }, - /* 5528 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 18 }, - /* 5529 */ { MAD_F(0x05f79ed9) /* 0.372954225 */, 18 }, - /* 5530 */ { MAD_F(0x05f7fd29) /* 0.373044167 */, 18 }, - /* 5531 */ { MAD_F(0x05f85b7a) /* 0.373134114 */, 18 }, - /* 5532 */ { MAD_F(0x05f8b9cc) /* 0.373224066 */, 18 }, - /* 5533 */ { MAD_F(0x05f91820) /* 0.373314024 */, 18 }, - /* 5534 */ { MAD_F(0x05f97675) /* 0.373403987 */, 18 }, - /* 5535 */ { MAD_F(0x05f9d4cc) /* 0.373493956 */, 18 }, - - /* 5536 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 18 }, - /* 5537 */ { MAD_F(0x05fa917e) /* 0.373673910 */, 18 }, - /* 5538 */ { MAD_F(0x05faefd9) /* 0.373763895 */, 18 }, - /* 5539 */ { MAD_F(0x05fb4e36) /* 0.373853885 */, 18 }, - /* 5540 */ { MAD_F(0x05fbac94) /* 0.373943881 */, 18 }, - /* 5541 */ { MAD_F(0x05fc0af3) /* 0.374033882 */, 18 }, - /* 5542 */ { MAD_F(0x05fc6954) /* 0.374123889 */, 18 }, - /* 5543 */ { MAD_F(0x05fcc7b7) /* 0.374213901 */, 18 }, - /* 5544 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 18 }, - /* 5545 */ { MAD_F(0x05fd8480) /* 0.374393941 */, 18 }, - /* 5546 */ { MAD_F(0x05fde2e7) /* 0.374483970 */, 18 }, - /* 5547 */ { MAD_F(0x05fe414f) /* 0.374574003 */, 18 }, - /* 5548 */ { MAD_F(0x05fe9fb9) /* 0.374664042 */, 18 }, - /* 5549 */ { MAD_F(0x05fefe24) /* 0.374754087 */, 18 }, - /* 5550 */ { MAD_F(0x05ff5c91) /* 0.374844137 */, 18 }, - /* 5551 */ { MAD_F(0x05ffbaff) /* 0.374934192 */, 18 }, - - /* 5552 */ { MAD_F(0x0600196e) /* 0.375024253 */, 18 }, - /* 5553 */ { MAD_F(0x060077df) /* 0.375114319 */, 18 }, - /* 5554 */ { MAD_F(0x0600d651) /* 0.375204391 */, 18 }, - /* 5555 */ { MAD_F(0x060134c5) /* 0.375294468 */, 18 }, - /* 5556 */ { MAD_F(0x0601933b) /* 0.375384550 */, 18 }, - /* 5557 */ { MAD_F(0x0601f1b1) /* 0.375474638 */, 18 }, - /* 5558 */ { MAD_F(0x0602502a) /* 0.375564731 */, 18 }, - /* 5559 */ { MAD_F(0x0602aea3) /* 0.375654830 */, 18 }, - /* 5560 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 18 }, - /* 5561 */ { MAD_F(0x06036b9b) /* 0.375835043 */, 18 }, - /* 5562 */ { MAD_F(0x0603ca19) /* 0.375925158 */, 18 }, - /* 5563 */ { MAD_F(0x06042898) /* 0.376015278 */, 18 }, - /* 5564 */ { MAD_F(0x06048719) /* 0.376105404 */, 18 }, - /* 5565 */ { MAD_F(0x0604e59c) /* 0.376195535 */, 18 }, - /* 5566 */ { MAD_F(0x0605441f) /* 0.376285671 */, 18 }, - /* 5567 */ { MAD_F(0x0605a2a5) /* 0.376375813 */, 18 }, - - /* 5568 */ { MAD_F(0x0606012b) /* 0.376465960 */, 18 }, - /* 5569 */ { MAD_F(0x06065fb4) /* 0.376556113 */, 18 }, - /* 5570 */ { MAD_F(0x0606be3d) /* 0.376646271 */, 18 }, - /* 5571 */ { MAD_F(0x06071cc8) /* 0.376736434 */, 18 }, - /* 5572 */ { MAD_F(0x06077b55) /* 0.376826603 */, 18 }, - /* 5573 */ { MAD_F(0x0607d9e3) /* 0.376916777 */, 18 }, - /* 5574 */ { MAD_F(0x06083872) /* 0.377006957 */, 18 }, - /* 5575 */ { MAD_F(0x06089703) /* 0.377097141 */, 18 }, - /* 5576 */ { MAD_F(0x0608f595) /* 0.377187332 */, 18 }, - /* 5577 */ { MAD_F(0x06095429) /* 0.377277528 */, 18 }, - /* 5578 */ { MAD_F(0x0609b2be) /* 0.377367729 */, 18 }, - /* 5579 */ { MAD_F(0x060a1155) /* 0.377457935 */, 18 }, - /* 5580 */ { MAD_F(0x060a6fed) /* 0.377548147 */, 18 }, - /* 5581 */ { MAD_F(0x060ace86) /* 0.377638364 */, 18 }, - /* 5582 */ { MAD_F(0x060b2d21) /* 0.377728587 */, 18 }, - /* 5583 */ { MAD_F(0x060b8bbe) /* 0.377818815 */, 18 }, - - /* 5584 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 18 }, - /* 5585 */ { MAD_F(0x060c48fb) /* 0.377999288 */, 18 }, - /* 5586 */ { MAD_F(0x060ca79c) /* 0.378089532 */, 18 }, - /* 5587 */ { MAD_F(0x060d063e) /* 0.378179781 */, 18 }, - /* 5588 */ { MAD_F(0x060d64e1) /* 0.378270036 */, 18 }, - /* 5589 */ { MAD_F(0x060dc387) /* 0.378360297 */, 18 }, - /* 5590 */ { MAD_F(0x060e222d) /* 0.378450563 */, 18 }, - /* 5591 */ { MAD_F(0x060e80d5) /* 0.378540834 */, 18 }, - /* 5592 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 18 }, - /* 5593 */ { MAD_F(0x060f3e29) /* 0.378721392 */, 18 }, - /* 5594 */ { MAD_F(0x060f9cd6) /* 0.378811680 */, 18 }, - /* 5595 */ { MAD_F(0x060ffb83) /* 0.378901972 */, 18 }, - /* 5596 */ { MAD_F(0x06105a33) /* 0.378992270 */, 18 }, - /* 5597 */ { MAD_F(0x0610b8e3) /* 0.379082574 */, 18 }, - /* 5598 */ { MAD_F(0x06111795) /* 0.379172883 */, 18 }, - /* 5599 */ { MAD_F(0x06117649) /* 0.379263197 */, 18 }, - - /* 5600 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 18 }, - /* 5601 */ { MAD_F(0x061233b4) /* 0.379443841 */, 18 }, - /* 5602 */ { MAD_F(0x0612926c) /* 0.379534172 */, 18 }, - /* 5603 */ { MAD_F(0x0612f125) /* 0.379624507 */, 18 }, - /* 5604 */ { MAD_F(0x06134fe0) /* 0.379714848 */, 18 }, - /* 5605 */ { MAD_F(0x0613ae9c) /* 0.379805195 */, 18 }, - /* 5606 */ { MAD_F(0x06140d5a) /* 0.379895547 */, 18 }, - /* 5607 */ { MAD_F(0x06146c19) /* 0.379985904 */, 18 }, - /* 5608 */ { MAD_F(0x0614cada) /* 0.380076266 */, 18 }, - /* 5609 */ { MAD_F(0x0615299c) /* 0.380166634 */, 18 }, - /* 5610 */ { MAD_F(0x0615885f) /* 0.380257008 */, 18 }, - /* 5611 */ { MAD_F(0x0615e724) /* 0.380347386 */, 18 }, - /* 5612 */ { MAD_F(0x061645ea) /* 0.380437770 */, 18 }, - /* 5613 */ { MAD_F(0x0616a4b2) /* 0.380528160 */, 18 }, - /* 5614 */ { MAD_F(0x0617037b) /* 0.380618555 */, 18 }, - /* 5615 */ { MAD_F(0x06176246) /* 0.380708955 */, 18 }, - - /* 5616 */ { MAD_F(0x0617c112) /* 0.380799360 */, 18 }, - /* 5617 */ { MAD_F(0x06181fdf) /* 0.380889771 */, 18 }, - /* 5618 */ { MAD_F(0x06187eae) /* 0.380980187 */, 18 }, - /* 5619 */ { MAD_F(0x0618dd7e) /* 0.381070609 */, 18 }, - /* 5620 */ { MAD_F(0x06193c50) /* 0.381161036 */, 18 }, - /* 5621 */ { MAD_F(0x06199b24) /* 0.381251468 */, 18 }, - /* 5622 */ { MAD_F(0x0619f9f8) /* 0.381341906 */, 18 }, - /* 5623 */ { MAD_F(0x061a58ce) /* 0.381432349 */, 18 }, - /* 5624 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 18 }, - /* 5625 */ { MAD_F(0x061b167f) /* 0.381613251 */, 18 }, - /* 5626 */ { MAD_F(0x061b7559) /* 0.381703711 */, 18 }, - /* 5627 */ { MAD_F(0x061bd435) /* 0.381794175 */, 18 }, - /* 5628 */ { MAD_F(0x061c3313) /* 0.381884645 */, 18 }, - /* 5629 */ { MAD_F(0x061c91f1) /* 0.381975120 */, 18 }, - /* 5630 */ { MAD_F(0x061cf0d2) /* 0.382065601 */, 18 }, - /* 5631 */ { MAD_F(0x061d4fb3) /* 0.382156087 */, 18 }, - - /* 5632 */ { MAD_F(0x061dae96) /* 0.382246578 */, 18 }, - /* 5633 */ { MAD_F(0x061e0d7b) /* 0.382337075 */, 18 }, - /* 5634 */ { MAD_F(0x061e6c61) /* 0.382427577 */, 18 }, - /* 5635 */ { MAD_F(0x061ecb48) /* 0.382518084 */, 18 }, - /* 5636 */ { MAD_F(0x061f2a31) /* 0.382608597 */, 18 }, - /* 5637 */ { MAD_F(0x061f891b) /* 0.382699115 */, 18 }, - /* 5638 */ { MAD_F(0x061fe807) /* 0.382789638 */, 18 }, - /* 5639 */ { MAD_F(0x062046f4) /* 0.382880167 */, 18 }, - /* 5640 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 18 }, - /* 5641 */ { MAD_F(0x062104d3) /* 0.383061241 */, 18 }, - /* 5642 */ { MAD_F(0x062163c4) /* 0.383151786 */, 18 }, - /* 5643 */ { MAD_F(0x0621c2b7) /* 0.383242336 */, 18 }, - /* 5644 */ { MAD_F(0x062221ab) /* 0.383332891 */, 18 }, - /* 5645 */ { MAD_F(0x062280a1) /* 0.383423452 */, 18 }, - /* 5646 */ { MAD_F(0x0622df98) /* 0.383514018 */, 18 }, - /* 5647 */ { MAD_F(0x06233e91) /* 0.383604590 */, 18 }, - - /* 5648 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 18 }, - /* 5649 */ { MAD_F(0x0623fc86) /* 0.383785749 */, 18 }, - /* 5650 */ { MAD_F(0x06245b83) /* 0.383876337 */, 18 }, - /* 5651 */ { MAD_F(0x0624ba82) /* 0.383966930 */, 18 }, - /* 5652 */ { MAD_F(0x06251981) /* 0.384057528 */, 18 }, - /* 5653 */ { MAD_F(0x06257883) /* 0.384148132 */, 18 }, - /* 5654 */ { MAD_F(0x0625d785) /* 0.384238741 */, 18 }, - /* 5655 */ { MAD_F(0x06263689) /* 0.384329355 */, 18 }, - /* 5656 */ { MAD_F(0x0626958f) /* 0.384419975 */, 18 }, - /* 5657 */ { MAD_F(0x0626f496) /* 0.384510600 */, 18 }, - /* 5658 */ { MAD_F(0x0627539e) /* 0.384601230 */, 18 }, - /* 5659 */ { MAD_F(0x0627b2a8) /* 0.384691866 */, 18 }, - /* 5660 */ { MAD_F(0x062811b3) /* 0.384782507 */, 18 }, - /* 5661 */ { MAD_F(0x062870c0) /* 0.384873153 */, 18 }, - /* 5662 */ { MAD_F(0x0628cfce) /* 0.384963805 */, 18 }, - /* 5663 */ { MAD_F(0x06292ede) /* 0.385054462 */, 18 }, - - /* 5664 */ { MAD_F(0x06298def) /* 0.385145124 */, 18 }, - /* 5665 */ { MAD_F(0x0629ed01) /* 0.385235792 */, 18 }, - /* 5666 */ { MAD_F(0x062a4c15) /* 0.385326465 */, 18 }, - /* 5667 */ { MAD_F(0x062aab2a) /* 0.385417143 */, 18 }, - /* 5668 */ { MAD_F(0x062b0a41) /* 0.385507827 */, 18 }, - /* 5669 */ { MAD_F(0x062b6959) /* 0.385598516 */, 18 }, - /* 5670 */ { MAD_F(0x062bc873) /* 0.385689211 */, 18 }, - /* 5671 */ { MAD_F(0x062c278e) /* 0.385779910 */, 18 }, - /* 5672 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 18 }, - /* 5673 */ { MAD_F(0x062ce5c8) /* 0.385961326 */, 18 }, - /* 5674 */ { MAD_F(0x062d44e8) /* 0.386052041 */, 18 }, - /* 5675 */ { MAD_F(0x062da408) /* 0.386142762 */, 18 }, - /* 5676 */ { MAD_F(0x062e032a) /* 0.386233489 */, 18 }, - /* 5677 */ { MAD_F(0x062e624e) /* 0.386324221 */, 18 }, - /* 5678 */ { MAD_F(0x062ec173) /* 0.386414958 */, 18 }, - /* 5679 */ { MAD_F(0x062f209a) /* 0.386505700 */, 18 }, - - /* 5680 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 18 }, - /* 5681 */ { MAD_F(0x062fdeeb) /* 0.386687201 */, 18 }, - /* 5682 */ { MAD_F(0x06303e16) /* 0.386777959 */, 18 }, - /* 5683 */ { MAD_F(0x06309d42) /* 0.386868723 */, 18 }, - /* 5684 */ { MAD_F(0x0630fc6f) /* 0.386959492 */, 18 }, - /* 5685 */ { MAD_F(0x06315b9e) /* 0.387050266 */, 18 }, - /* 5686 */ { MAD_F(0x0631bacf) /* 0.387141045 */, 18 }, - /* 5687 */ { MAD_F(0x06321a01) /* 0.387231830 */, 18 }, - /* 5688 */ { MAD_F(0x06327934) /* 0.387322621 */, 18 }, - /* 5689 */ { MAD_F(0x0632d869) /* 0.387413416 */, 18 }, - /* 5690 */ { MAD_F(0x0633379f) /* 0.387504217 */, 18 }, - /* 5691 */ { MAD_F(0x063396d7) /* 0.387595023 */, 18 }, - /* 5692 */ { MAD_F(0x0633f610) /* 0.387685835 */, 18 }, - /* 5693 */ { MAD_F(0x0634554a) /* 0.387776652 */, 18 }, - /* 5694 */ { MAD_F(0x0634b486) /* 0.387867474 */, 18 }, - /* 5695 */ { MAD_F(0x063513c3) /* 0.387958301 */, 18 }, - - /* 5696 */ { MAD_F(0x06357302) /* 0.388049134 */, 18 }, - /* 5697 */ { MAD_F(0x0635d242) /* 0.388139972 */, 18 }, - /* 5698 */ { MAD_F(0x06363184) /* 0.388230816 */, 18 }, - /* 5699 */ { MAD_F(0x063690c7) /* 0.388321665 */, 18 }, - /* 5700 */ { MAD_F(0x0636f00b) /* 0.388412519 */, 18 }, - /* 5701 */ { MAD_F(0x06374f51) /* 0.388503378 */, 18 }, - /* 5702 */ { MAD_F(0x0637ae99) /* 0.388594243 */, 18 }, - /* 5703 */ { MAD_F(0x06380de1) /* 0.388685113 */, 18 }, - /* 5704 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 18 }, - /* 5705 */ { MAD_F(0x0638cc77) /* 0.388866869 */, 18 }, - /* 5706 */ { MAD_F(0x06392bc4) /* 0.388957755 */, 18 }, - /* 5707 */ { MAD_F(0x06398b12) /* 0.389048646 */, 18 }, - /* 5708 */ { MAD_F(0x0639ea62) /* 0.389139542 */, 18 }, - /* 5709 */ { MAD_F(0x063a49b4) /* 0.389230444 */, 18 }, - /* 5710 */ { MAD_F(0x063aa906) /* 0.389321352 */, 18 }, - /* 5711 */ { MAD_F(0x063b085a) /* 0.389412264 */, 18 }, - - /* 5712 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 18 }, - /* 5713 */ { MAD_F(0x063bc707) /* 0.389594105 */, 18 }, - /* 5714 */ { MAD_F(0x063c265f) /* 0.389685033 */, 18 }, - /* 5715 */ { MAD_F(0x063c85b9) /* 0.389775967 */, 18 }, - /* 5716 */ { MAD_F(0x063ce514) /* 0.389866906 */, 18 }, - /* 5717 */ { MAD_F(0x063d4471) /* 0.389957850 */, 18 }, - /* 5718 */ { MAD_F(0x063da3cf) /* 0.390048800 */, 18 }, - /* 5719 */ { MAD_F(0x063e032f) /* 0.390139755 */, 18 }, - /* 5720 */ { MAD_F(0x063e6290) /* 0.390230715 */, 18 }, - /* 5721 */ { MAD_F(0x063ec1f2) /* 0.390321681 */, 18 }, - /* 5722 */ { MAD_F(0x063f2156) /* 0.390412651 */, 18 }, - /* 5723 */ { MAD_F(0x063f80bb) /* 0.390503628 */, 18 }, - /* 5724 */ { MAD_F(0x063fe022) /* 0.390594609 */, 18 }, - /* 5725 */ { MAD_F(0x06403f8a) /* 0.390685596 */, 18 }, - /* 5726 */ { MAD_F(0x06409ef3) /* 0.390776588 */, 18 }, - /* 5727 */ { MAD_F(0x0640fe5e) /* 0.390867585 */, 18 }, - - /* 5728 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 18 }, - /* 5729 */ { MAD_F(0x0641bd38) /* 0.391049596 */, 18 }, - /* 5730 */ { MAD_F(0x06421ca7) /* 0.391140609 */, 18 }, - /* 5731 */ { MAD_F(0x06427c18) /* 0.391231627 */, 18 }, - /* 5732 */ { MAD_F(0x0642db8a) /* 0.391322651 */, 18 }, - /* 5733 */ { MAD_F(0x06433afd) /* 0.391413680 */, 18 }, - /* 5734 */ { MAD_F(0x06439a72) /* 0.391504714 */, 18 }, - /* 5735 */ { MAD_F(0x0643f9e9) /* 0.391595754 */, 18 }, - /* 5736 */ { MAD_F(0x06445960) /* 0.391686799 */, 18 }, - /* 5737 */ { MAD_F(0x0644b8d9) /* 0.391777849 */, 18 }, - /* 5738 */ { MAD_F(0x06451854) /* 0.391868905 */, 18 }, - /* 5739 */ { MAD_F(0x064577d0) /* 0.391959966 */, 18 }, - /* 5740 */ { MAD_F(0x0645d74d) /* 0.392051032 */, 18 }, - /* 5741 */ { MAD_F(0x064636cc) /* 0.392142103 */, 18 }, - /* 5742 */ { MAD_F(0x0646964c) /* 0.392233180 */, 18 }, - /* 5743 */ { MAD_F(0x0646f5ce) /* 0.392324262 */, 18 }, - - /* 5744 */ { MAD_F(0x06475551) /* 0.392415349 */, 18 }, - /* 5745 */ { MAD_F(0x0647b4d5) /* 0.392506442 */, 18 }, - /* 5746 */ { MAD_F(0x0648145b) /* 0.392597540 */, 18 }, - /* 5747 */ { MAD_F(0x064873e3) /* 0.392688643 */, 18 }, - /* 5748 */ { MAD_F(0x0648d36b) /* 0.392779751 */, 18 }, - /* 5749 */ { MAD_F(0x064932f6) /* 0.392870865 */, 18 }, - /* 5750 */ { MAD_F(0x06499281) /* 0.392961984 */, 18 }, - /* 5751 */ { MAD_F(0x0649f20e) /* 0.393053108 */, 18 }, - /* 5752 */ { MAD_F(0x064a519c) /* 0.393144238 */, 18 }, - /* 5753 */ { MAD_F(0x064ab12c) /* 0.393235372 */, 18 }, - /* 5754 */ { MAD_F(0x064b10be) /* 0.393326513 */, 18 }, - /* 5755 */ { MAD_F(0x064b7050) /* 0.393417658 */, 18 }, - /* 5756 */ { MAD_F(0x064bcfe4) /* 0.393508809 */, 18 }, - /* 5757 */ { MAD_F(0x064c2f7a) /* 0.393599965 */, 18 }, - /* 5758 */ { MAD_F(0x064c8f11) /* 0.393691126 */, 18 }, - /* 5759 */ { MAD_F(0x064ceea9) /* 0.393782292 */, 18 }, - - /* 5760 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 18 }, - /* 5761 */ { MAD_F(0x064dadde) /* 0.393964641 */, 18 }, - /* 5762 */ { MAD_F(0x064e0d7a) /* 0.394055823 */, 18 }, - /* 5763 */ { MAD_F(0x064e6d18) /* 0.394147011 */, 18 }, - /* 5764 */ { MAD_F(0x064eccb8) /* 0.394238204 */, 18 }, - /* 5765 */ { MAD_F(0x064f2c59) /* 0.394329402 */, 18 }, - /* 5766 */ { MAD_F(0x064f8bfb) /* 0.394420605 */, 18 }, - /* 5767 */ { MAD_F(0x064feb9e) /* 0.394511814 */, 18 }, - /* 5768 */ { MAD_F(0x06504b44) /* 0.394603028 */, 18 }, - /* 5769 */ { MAD_F(0x0650aaea) /* 0.394694247 */, 18 }, - /* 5770 */ { MAD_F(0x06510a92) /* 0.394785472 */, 18 }, - /* 5771 */ { MAD_F(0x06516a3b) /* 0.394876702 */, 18 }, - /* 5772 */ { MAD_F(0x0651c9e6) /* 0.394967937 */, 18 }, - /* 5773 */ { MAD_F(0x06522992) /* 0.395059177 */, 18 }, - /* 5774 */ { MAD_F(0x06528940) /* 0.395150423 */, 18 }, - /* 5775 */ { MAD_F(0x0652e8ef) /* 0.395241673 */, 18 }, - - /* 5776 */ { MAD_F(0x0653489f) /* 0.395332930 */, 18 }, - /* 5777 */ { MAD_F(0x0653a851) /* 0.395424191 */, 18 }, - /* 5778 */ { MAD_F(0x06540804) /* 0.395515458 */, 18 }, - /* 5779 */ { MAD_F(0x065467b9) /* 0.395606730 */, 18 }, - /* 5780 */ { MAD_F(0x0654c76f) /* 0.395698007 */, 18 }, - /* 5781 */ { MAD_F(0x06552726) /* 0.395789289 */, 18 }, - /* 5782 */ { MAD_F(0x065586df) /* 0.395880577 */, 18 }, - /* 5783 */ { MAD_F(0x0655e699) /* 0.395971870 */, 18 }, - /* 5784 */ { MAD_F(0x06564655) /* 0.396063168 */, 18 }, - /* 5785 */ { MAD_F(0x0656a612) /* 0.396154472 */, 18 }, - /* 5786 */ { MAD_F(0x065705d0) /* 0.396245780 */, 18 }, - /* 5787 */ { MAD_F(0x06576590) /* 0.396337094 */, 18 }, - /* 5788 */ { MAD_F(0x0657c552) /* 0.396428414 */, 18 }, - /* 5789 */ { MAD_F(0x06582514) /* 0.396519738 */, 18 }, - /* 5790 */ { MAD_F(0x065884d9) /* 0.396611068 */, 18 }, - /* 5791 */ { MAD_F(0x0658e49e) /* 0.396702403 */, 18 }, - - /* 5792 */ { MAD_F(0x06594465) /* 0.396793743 */, 18 }, - /* 5793 */ { MAD_F(0x0659a42e) /* 0.396885089 */, 18 }, - /* 5794 */ { MAD_F(0x065a03f7) /* 0.396976440 */, 18 }, - /* 5795 */ { MAD_F(0x065a63c3) /* 0.397067796 */, 18 }, - /* 5796 */ { MAD_F(0x065ac38f) /* 0.397159157 */, 18 }, - /* 5797 */ { MAD_F(0x065b235d) /* 0.397250524 */, 18 }, - /* 5798 */ { MAD_F(0x065b832d) /* 0.397341896 */, 18 }, - /* 5799 */ { MAD_F(0x065be2fe) /* 0.397433273 */, 18 }, - /* 5800 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 18 }, - /* 5801 */ { MAD_F(0x065ca2a3) /* 0.397616043 */, 18 }, - /* 5802 */ { MAD_F(0x065d0279) /* 0.397707436 */, 18 }, - /* 5803 */ { MAD_F(0x065d624f) /* 0.397798834 */, 18 }, - /* 5804 */ { MAD_F(0x065dc227) /* 0.397890237 */, 18 }, - /* 5805 */ { MAD_F(0x065e2200) /* 0.397981646 */, 18 }, - /* 5806 */ { MAD_F(0x065e81db) /* 0.398073059 */, 18 }, - /* 5807 */ { MAD_F(0x065ee1b7) /* 0.398164479 */, 18 }, - - /* 5808 */ { MAD_F(0x065f4195) /* 0.398255903 */, 18 }, - /* 5809 */ { MAD_F(0x065fa174) /* 0.398347333 */, 18 }, - /* 5810 */ { MAD_F(0x06600154) /* 0.398438767 */, 18 }, - /* 5811 */ { MAD_F(0x06606136) /* 0.398530207 */, 18 }, - /* 5812 */ { MAD_F(0x0660c119) /* 0.398621653 */, 18 }, - /* 5813 */ { MAD_F(0x066120fd) /* 0.398713103 */, 18 }, - /* 5814 */ { MAD_F(0x066180e3) /* 0.398804559 */, 18 }, - /* 5815 */ { MAD_F(0x0661e0cb) /* 0.398896020 */, 18 }, - /* 5816 */ { MAD_F(0x066240b4) /* 0.398987487 */, 18 }, - /* 5817 */ { MAD_F(0x0662a09e) /* 0.399078958 */, 18 }, - /* 5818 */ { MAD_F(0x06630089) /* 0.399170435 */, 18 }, - /* 5819 */ { MAD_F(0x06636077) /* 0.399261917 */, 18 }, - /* 5820 */ { MAD_F(0x0663c065) /* 0.399353404 */, 18 }, - /* 5821 */ { MAD_F(0x06642055) /* 0.399444897 */, 18 }, - /* 5822 */ { MAD_F(0x06648046) /* 0.399536395 */, 18 }, - /* 5823 */ { MAD_F(0x0664e039) /* 0.399627898 */, 18 }, - - /* 5824 */ { MAD_F(0x0665402d) /* 0.399719406 */, 18 }, - /* 5825 */ { MAD_F(0x0665a022) /* 0.399810919 */, 18 }, - /* 5826 */ { MAD_F(0x06660019) /* 0.399902438 */, 18 }, - /* 5827 */ { MAD_F(0x06666011) /* 0.399993962 */, 18 }, - /* 5828 */ { MAD_F(0x0666c00b) /* 0.400085491 */, 18 }, - /* 5829 */ { MAD_F(0x06672006) /* 0.400177026 */, 18 }, - /* 5830 */ { MAD_F(0x06678003) /* 0.400268565 */, 18 }, - /* 5831 */ { MAD_F(0x0667e000) /* 0.400360110 */, 18 }, - /* 5832 */ { MAD_F(0x06684000) /* 0.400451660 */, 18 }, - /* 5833 */ { MAD_F(0x0668a000) /* 0.400543216 */, 18 }, - /* 5834 */ { MAD_F(0x06690003) /* 0.400634776 */, 18 }, - /* 5835 */ { MAD_F(0x06696006) /* 0.400726342 */, 18 }, - /* 5836 */ { MAD_F(0x0669c00b) /* 0.400817913 */, 18 }, - /* 5837 */ { MAD_F(0x066a2011) /* 0.400909489 */, 18 }, - /* 5838 */ { MAD_F(0x066a8019) /* 0.401001071 */, 18 }, - /* 5839 */ { MAD_F(0x066ae022) /* 0.401092657 */, 18 }, - - /* 5840 */ { MAD_F(0x066b402d) /* 0.401184249 */, 18 }, - /* 5841 */ { MAD_F(0x066ba039) /* 0.401275847 */, 18 }, - /* 5842 */ { MAD_F(0x066c0046) /* 0.401367449 */, 18 }, - /* 5843 */ { MAD_F(0x066c6055) /* 0.401459057 */, 18 }, - /* 5844 */ { MAD_F(0x066cc065) /* 0.401550670 */, 18 }, - /* 5845 */ { MAD_F(0x066d2076) /* 0.401642288 */, 18 }, - /* 5846 */ { MAD_F(0x066d8089) /* 0.401733911 */, 18 }, - /* 5847 */ { MAD_F(0x066de09e) /* 0.401825540 */, 18 }, - /* 5848 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 18 }, - /* 5849 */ { MAD_F(0x066ea0cb) /* 0.402008812 */, 18 }, - /* 5850 */ { MAD_F(0x066f00e3) /* 0.402100457 */, 18 }, - /* 5851 */ { MAD_F(0x066f60fd) /* 0.402192106 */, 18 }, - /* 5852 */ { MAD_F(0x066fc118) /* 0.402283761 */, 18 }, - /* 5853 */ { MAD_F(0x06702135) /* 0.402375420 */, 18 }, - /* 5854 */ { MAD_F(0x06708153) /* 0.402467086 */, 18 }, - /* 5855 */ { MAD_F(0x0670e173) /* 0.402558756 */, 18 }, - - /* 5856 */ { MAD_F(0x06714194) /* 0.402650431 */, 18 }, - /* 5857 */ { MAD_F(0x0671a1b6) /* 0.402742112 */, 18 }, - /* 5858 */ { MAD_F(0x067201da) /* 0.402833798 */, 18 }, - /* 5859 */ { MAD_F(0x067261ff) /* 0.402925489 */, 18 }, - /* 5860 */ { MAD_F(0x0672c226) /* 0.403017186 */, 18 }, - /* 5861 */ { MAD_F(0x0673224e) /* 0.403108887 */, 18 }, - /* 5862 */ { MAD_F(0x06738277) /* 0.403200594 */, 18 }, - /* 5863 */ { MAD_F(0x0673e2a2) /* 0.403292306 */, 18 }, - /* 5864 */ { MAD_F(0x067442ce) /* 0.403384024 */, 18 }, - /* 5865 */ { MAD_F(0x0674a2fc) /* 0.403475746 */, 18 }, - /* 5866 */ { MAD_F(0x0675032b) /* 0.403567474 */, 18 }, - /* 5867 */ { MAD_F(0x0675635b) /* 0.403659207 */, 18 }, - /* 5868 */ { MAD_F(0x0675c38d) /* 0.403750945 */, 18 }, - /* 5869 */ { MAD_F(0x067623c0) /* 0.403842688 */, 18 }, - /* 5870 */ { MAD_F(0x067683f4) /* 0.403934437 */, 18 }, - /* 5871 */ { MAD_F(0x0676e42a) /* 0.404026190 */, 18 }, - - /* 5872 */ { MAD_F(0x06774462) /* 0.404117949 */, 18 }, - /* 5873 */ { MAD_F(0x0677a49b) /* 0.404209714 */, 18 }, - /* 5874 */ { MAD_F(0x067804d5) /* 0.404301483 */, 18 }, - /* 5875 */ { MAD_F(0x06786510) /* 0.404393258 */, 18 }, - /* 5876 */ { MAD_F(0x0678c54d) /* 0.404485037 */, 18 }, - /* 5877 */ { MAD_F(0x0679258c) /* 0.404576822 */, 18 }, - /* 5878 */ { MAD_F(0x067985cb) /* 0.404668613 */, 18 }, - /* 5879 */ { MAD_F(0x0679e60c) /* 0.404760408 */, 18 }, - /* 5880 */ { MAD_F(0x067a464f) /* 0.404852209 */, 18 }, - /* 5881 */ { MAD_F(0x067aa693) /* 0.404944014 */, 18 }, - /* 5882 */ { MAD_F(0x067b06d8) /* 0.405035825 */, 18 }, - /* 5883 */ { MAD_F(0x067b671f) /* 0.405127642 */, 18 }, - /* 5884 */ { MAD_F(0x067bc767) /* 0.405219463 */, 18 }, - /* 5885 */ { MAD_F(0x067c27b1) /* 0.405311290 */, 18 }, - /* 5886 */ { MAD_F(0x067c87fc) /* 0.405403122 */, 18 }, - /* 5887 */ { MAD_F(0x067ce848) /* 0.405494959 */, 18 }, - - /* 5888 */ { MAD_F(0x067d4896) /* 0.405586801 */, 18 }, - /* 5889 */ { MAD_F(0x067da8e5) /* 0.405678648 */, 18 }, - /* 5890 */ { MAD_F(0x067e0935) /* 0.405770501 */, 18 }, - /* 5891 */ { MAD_F(0x067e6987) /* 0.405862359 */, 18 }, - /* 5892 */ { MAD_F(0x067ec9da) /* 0.405954222 */, 18 }, - /* 5893 */ { MAD_F(0x067f2a2f) /* 0.406046090 */, 18 }, - /* 5894 */ { MAD_F(0x067f8a85) /* 0.406137963 */, 18 }, - /* 5895 */ { MAD_F(0x067feadd) /* 0.406229842 */, 18 }, - /* 5896 */ { MAD_F(0x06804b36) /* 0.406321726 */, 18 }, - /* 5897 */ { MAD_F(0x0680ab90) /* 0.406413615 */, 18 }, - /* 5898 */ { MAD_F(0x06810beb) /* 0.406505509 */, 18 }, - /* 5899 */ { MAD_F(0x06816c49) /* 0.406597408 */, 18 }, - /* 5900 */ { MAD_F(0x0681cca7) /* 0.406689313 */, 18 }, - /* 5901 */ { MAD_F(0x06822d07) /* 0.406781223 */, 18 }, - /* 5902 */ { MAD_F(0x06828d68) /* 0.406873138 */, 18 }, - /* 5903 */ { MAD_F(0x0682edcb) /* 0.406965058 */, 18 }, - - /* 5904 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 18 }, - /* 5905 */ { MAD_F(0x0683ae94) /* 0.407148914 */, 18 }, - /* 5906 */ { MAD_F(0x06840efb) /* 0.407240850 */, 18 }, - /* 5907 */ { MAD_F(0x06846f63) /* 0.407332791 */, 18 }, - /* 5908 */ { MAD_F(0x0684cfcd) /* 0.407424737 */, 18 }, - /* 5909 */ { MAD_F(0x06853038) /* 0.407516688 */, 18 }, - /* 5910 */ { MAD_F(0x068590a4) /* 0.407608645 */, 18 }, - /* 5911 */ { MAD_F(0x0685f112) /* 0.407700606 */, 18 }, - /* 5912 */ { MAD_F(0x06865181) /* 0.407792573 */, 18 }, - /* 5913 */ { MAD_F(0x0686b1f2) /* 0.407884545 */, 18 }, - /* 5914 */ { MAD_F(0x06871264) /* 0.407976522 */, 18 }, - /* 5915 */ { MAD_F(0x068772d7) /* 0.408068505 */, 18 }, - /* 5916 */ { MAD_F(0x0687d34c) /* 0.408160492 */, 18 }, - /* 5917 */ { MAD_F(0x068833c2) /* 0.408252485 */, 18 }, - /* 5918 */ { MAD_F(0x06889439) /* 0.408344483 */, 18 }, - /* 5919 */ { MAD_F(0x0688f4b2) /* 0.408436486 */, 18 }, - - /* 5920 */ { MAD_F(0x0689552c) /* 0.408528495 */, 18 }, - /* 5921 */ { MAD_F(0x0689b5a8) /* 0.408620508 */, 18 }, - /* 5922 */ { MAD_F(0x068a1625) /* 0.408712527 */, 18 }, - /* 5923 */ { MAD_F(0x068a76a4) /* 0.408804551 */, 18 }, - /* 5924 */ { MAD_F(0x068ad724) /* 0.408896580 */, 18 }, - /* 5925 */ { MAD_F(0x068b37a5) /* 0.408988614 */, 18 }, - /* 5926 */ { MAD_F(0x068b9827) /* 0.409080653 */, 18 }, - /* 5927 */ { MAD_F(0x068bf8ac) /* 0.409172698 */, 18 }, - /* 5928 */ { MAD_F(0x068c5931) /* 0.409264748 */, 18 }, - /* 5929 */ { MAD_F(0x068cb9b8) /* 0.409356803 */, 18 }, - /* 5930 */ { MAD_F(0x068d1a40) /* 0.409448863 */, 18 }, - /* 5931 */ { MAD_F(0x068d7aca) /* 0.409540928 */, 18 }, - /* 5932 */ { MAD_F(0x068ddb54) /* 0.409632999 */, 18 }, - /* 5933 */ { MAD_F(0x068e3be1) /* 0.409725074 */, 18 }, - /* 5934 */ { MAD_F(0x068e9c6f) /* 0.409817155 */, 18 }, - /* 5935 */ { MAD_F(0x068efcfe) /* 0.409909241 */, 18 }, - - /* 5936 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 18 }, - /* 5937 */ { MAD_F(0x068fbe20) /* 0.410093428 */, 18 }, - /* 5938 */ { MAD_F(0x06901eb4) /* 0.410185530 */, 18 }, - /* 5939 */ { MAD_F(0x06907f48) /* 0.410277637 */, 18 }, - /* 5940 */ { MAD_F(0x0690dfde) /* 0.410369748 */, 18 }, - /* 5941 */ { MAD_F(0x06914076) /* 0.410461865 */, 18 }, - /* 5942 */ { MAD_F(0x0691a10f) /* 0.410553988 */, 18 }, - /* 5943 */ { MAD_F(0x069201a9) /* 0.410646115 */, 18 }, - /* 5944 */ { MAD_F(0x06926245) /* 0.410738247 */, 18 }, - /* 5945 */ { MAD_F(0x0692c2e2) /* 0.410830385 */, 18 }, - /* 5946 */ { MAD_F(0x06932380) /* 0.410922528 */, 18 }, - /* 5947 */ { MAD_F(0x06938420) /* 0.411014676 */, 18 }, - /* 5948 */ { MAD_F(0x0693e4c1) /* 0.411106829 */, 18 }, - /* 5949 */ { MAD_F(0x06944563) /* 0.411198987 */, 18 }, - /* 5950 */ { MAD_F(0x0694a607) /* 0.411291151 */, 18 }, - /* 5951 */ { MAD_F(0x069506ad) /* 0.411383320 */, 18 }, - - /* 5952 */ { MAD_F(0x06956753) /* 0.411475493 */, 18 }, - /* 5953 */ { MAD_F(0x0695c7fc) /* 0.411567672 */, 18 }, - /* 5954 */ { MAD_F(0x069628a5) /* 0.411659857 */, 18 }, - /* 5955 */ { MAD_F(0x06968950) /* 0.411752046 */, 18 }, - /* 5956 */ { MAD_F(0x0696e9fc) /* 0.411844240 */, 18 }, - /* 5957 */ { MAD_F(0x06974aaa) /* 0.411936440 */, 18 }, - /* 5958 */ { MAD_F(0x0697ab59) /* 0.412028645 */, 18 }, - /* 5959 */ { MAD_F(0x06980c09) /* 0.412120855 */, 18 }, - /* 5960 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 18 }, - /* 5961 */ { MAD_F(0x0698cd6e) /* 0.412305290 */, 18 }, - /* 5962 */ { MAD_F(0x06992e23) /* 0.412397516 */, 18 }, - /* 5963 */ { MAD_F(0x06998ed9) /* 0.412489746 */, 18 }, - /* 5964 */ { MAD_F(0x0699ef90) /* 0.412581982 */, 18 }, - /* 5965 */ { MAD_F(0x069a5049) /* 0.412674223 */, 18 }, - /* 5966 */ { MAD_F(0x069ab103) /* 0.412766469 */, 18 }, - /* 5967 */ { MAD_F(0x069b11bf) /* 0.412858720 */, 18 }, - - /* 5968 */ { MAD_F(0x069b727b) /* 0.412950976 */, 18 }, - /* 5969 */ { MAD_F(0x069bd33a) /* 0.413043238 */, 18 }, - /* 5970 */ { MAD_F(0x069c33f9) /* 0.413135505 */, 18 }, - /* 5971 */ { MAD_F(0x069c94ba) /* 0.413227776 */, 18 }, - /* 5972 */ { MAD_F(0x069cf57d) /* 0.413320053 */, 18 }, - /* 5973 */ { MAD_F(0x069d5641) /* 0.413412335 */, 18 }, - /* 5974 */ { MAD_F(0x069db706) /* 0.413504623 */, 18 }, - /* 5975 */ { MAD_F(0x069e17cc) /* 0.413596915 */, 18 }, - /* 5976 */ { MAD_F(0x069e7894) /* 0.413689213 */, 18 }, - /* 5977 */ { MAD_F(0x069ed95e) /* 0.413781515 */, 18 }, - /* 5978 */ { MAD_F(0x069f3a28) /* 0.413873823 */, 18 }, - /* 5979 */ { MAD_F(0x069f9af4) /* 0.413966136 */, 18 }, - /* 5980 */ { MAD_F(0x069ffbc2) /* 0.414058454 */, 18 }, - /* 5981 */ { MAD_F(0x06a05c91) /* 0.414150778 */, 18 }, - /* 5982 */ { MAD_F(0x06a0bd61) /* 0.414243106 */, 18 }, - /* 5983 */ { MAD_F(0x06a11e32) /* 0.414335440 */, 18 }, - - /* 5984 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 18 }, - /* 5985 */ { MAD_F(0x06a1dfda) /* 0.414520122 */, 18 }, - /* 5986 */ { MAD_F(0x06a240b0) /* 0.414612471 */, 18 }, - /* 5987 */ { MAD_F(0x06a2a187) /* 0.414704826 */, 18 }, - /* 5988 */ { MAD_F(0x06a3025f) /* 0.414797185 */, 18 }, - /* 5989 */ { MAD_F(0x06a36339) /* 0.414889549 */, 18 }, - /* 5990 */ { MAD_F(0x06a3c414) /* 0.414981919 */, 18 }, - /* 5991 */ { MAD_F(0x06a424f1) /* 0.415074294 */, 18 }, - /* 5992 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 18 }, - /* 5993 */ { MAD_F(0x06a4e6ae) /* 0.415259059 */, 18 }, - /* 5994 */ { MAD_F(0x06a5478f) /* 0.415351449 */, 18 }, - /* 5995 */ { MAD_F(0x06a5a871) /* 0.415443844 */, 18 }, - /* 5996 */ { MAD_F(0x06a60955) /* 0.415536244 */, 18 }, - /* 5997 */ { MAD_F(0x06a66a3a) /* 0.415628650 */, 18 }, - /* 5998 */ { MAD_F(0x06a6cb20) /* 0.415721061 */, 18 }, - /* 5999 */ { MAD_F(0x06a72c08) /* 0.415813476 */, 18 }, - - /* 6000 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 18 }, - /* 6001 */ { MAD_F(0x06a7eddb) /* 0.415998324 */, 18 }, - /* 6002 */ { MAD_F(0x06a84ec7) /* 0.416090755 */, 18 }, - /* 6003 */ { MAD_F(0x06a8afb4) /* 0.416183191 */, 18 }, - /* 6004 */ { MAD_F(0x06a910a3) /* 0.416275633 */, 18 }, - /* 6005 */ { MAD_F(0x06a97193) /* 0.416368079 */, 18 }, - /* 6006 */ { MAD_F(0x06a9d284) /* 0.416460531 */, 18 }, - /* 6007 */ { MAD_F(0x06aa3377) /* 0.416552988 */, 18 }, - /* 6008 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 18 }, - /* 6009 */ { MAD_F(0x06aaf561) /* 0.416737917 */, 18 }, - /* 6010 */ { MAD_F(0x06ab5657) /* 0.416830389 */, 18 }, - /* 6011 */ { MAD_F(0x06abb750) /* 0.416922867 */, 18 }, - /* 6012 */ { MAD_F(0x06ac1849) /* 0.417015349 */, 18 }, - /* 6013 */ { MAD_F(0x06ac7944) /* 0.417107837 */, 18 }, - /* 6014 */ { MAD_F(0x06acda41) /* 0.417200330 */, 18 }, - /* 6015 */ { MAD_F(0x06ad3b3e) /* 0.417292828 */, 18 }, - - /* 6016 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 18 }, - /* 6017 */ { MAD_F(0x06adfd3e) /* 0.417477839 */, 18 }, - /* 6018 */ { MAD_F(0x06ae5e40) /* 0.417570352 */, 18 }, - /* 6019 */ { MAD_F(0x06aebf43) /* 0.417662871 */, 18 }, - /* 6020 */ { MAD_F(0x06af2047) /* 0.417755394 */, 18 }, - /* 6021 */ { MAD_F(0x06af814d) /* 0.417847923 */, 18 }, - /* 6022 */ { MAD_F(0x06afe255) /* 0.417940457 */, 18 }, - /* 6023 */ { MAD_F(0x06b0435e) /* 0.418032996 */, 18 }, - /* 6024 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 18 }, - /* 6025 */ { MAD_F(0x06b10573) /* 0.418218089 */, 18 }, - /* 6026 */ { MAD_F(0x06b16680) /* 0.418310643 */, 18 }, - /* 6027 */ { MAD_F(0x06b1c78e) /* 0.418403203 */, 18 }, - /* 6028 */ { MAD_F(0x06b2289e) /* 0.418495767 */, 18 }, - /* 6029 */ { MAD_F(0x06b289af) /* 0.418588337 */, 18 }, - /* 6030 */ { MAD_F(0x06b2eac1) /* 0.418680911 */, 18 }, - /* 6031 */ { MAD_F(0x06b34bd5) /* 0.418773491 */, 18 }, - - /* 6032 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 18 }, - /* 6033 */ { MAD_F(0x06b40e00) /* 0.418958666 */, 18 }, - /* 6034 */ { MAD_F(0x06b46f18) /* 0.419051262 */, 18 }, - /* 6035 */ { MAD_F(0x06b4d031) /* 0.419143862 */, 18 }, - /* 6036 */ { MAD_F(0x06b5314c) /* 0.419236467 */, 18 }, - /* 6037 */ { MAD_F(0x06b59268) /* 0.419329078 */, 18 }, - /* 6038 */ { MAD_F(0x06b5f385) /* 0.419421694 */, 18 }, - /* 6039 */ { MAD_F(0x06b654a4) /* 0.419514314 */, 18 }, - /* 6040 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 18 }, - /* 6041 */ { MAD_F(0x06b716e6) /* 0.419699571 */, 18 }, - /* 6042 */ { MAD_F(0x06b77808) /* 0.419792208 */, 18 }, - /* 6043 */ { MAD_F(0x06b7d92d) /* 0.419884849 */, 18 }, - /* 6044 */ { MAD_F(0x06b83a52) /* 0.419977495 */, 18 }, - /* 6045 */ { MAD_F(0x06b89b79) /* 0.420070147 */, 18 }, - /* 6046 */ { MAD_F(0x06b8fca1) /* 0.420162803 */, 18 }, - /* 6047 */ { MAD_F(0x06b95dcb) /* 0.420255465 */, 18 }, - - /* 6048 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 18 }, - /* 6049 */ { MAD_F(0x06ba2023) /* 0.420440803 */, 18 }, - /* 6050 */ { MAD_F(0x06ba8150) /* 0.420533481 */, 18 }, - /* 6051 */ { MAD_F(0x06bae280) /* 0.420626163 */, 18 }, - /* 6052 */ { MAD_F(0x06bb43b0) /* 0.420718850 */, 18 }, - /* 6053 */ { MAD_F(0x06bba4e2) /* 0.420811542 */, 18 }, - /* 6054 */ { MAD_F(0x06bc0615) /* 0.420904240 */, 18 }, - /* 6055 */ { MAD_F(0x06bc674a) /* 0.420996942 */, 18 }, - /* 6056 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 18 }, - /* 6057 */ { MAD_F(0x06bd29b7) /* 0.421182362 */, 18 }, - /* 6058 */ { MAD_F(0x06bd8af0) /* 0.421275080 */, 18 }, - /* 6059 */ { MAD_F(0x06bdec2a) /* 0.421367803 */, 18 }, - /* 6060 */ { MAD_F(0x06be4d66) /* 0.421460531 */, 18 }, - /* 6061 */ { MAD_F(0x06beaea3) /* 0.421553264 */, 18 }, - /* 6062 */ { MAD_F(0x06bf0fe1) /* 0.421646003 */, 18 }, - /* 6063 */ { MAD_F(0x06bf7120) /* 0.421738746 */, 18 }, - - /* 6064 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 18 }, - /* 6065 */ { MAD_F(0x06c033a4) /* 0.421924248 */, 18 }, - /* 6066 */ { MAD_F(0x06c094e7) /* 0.422017007 */, 18 }, - /* 6067 */ { MAD_F(0x06c0f62c) /* 0.422109770 */, 18 }, - /* 6068 */ { MAD_F(0x06c15773) /* 0.422202539 */, 18 }, - /* 6069 */ { MAD_F(0x06c1b8bb) /* 0.422295313 */, 18 }, - /* 6070 */ { MAD_F(0x06c21a04) /* 0.422388092 */, 18 }, - /* 6071 */ { MAD_F(0x06c27b4e) /* 0.422480876 */, 18 }, - /* 6072 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 18 }, - /* 6073 */ { MAD_F(0x06c33de8) /* 0.422666460 */, 18 }, - /* 6074 */ { MAD_F(0x06c39f36) /* 0.422759259 */, 18 }, - /* 6075 */ { MAD_F(0x06c40086) /* 0.422852064 */, 18 }, - /* 6076 */ { MAD_F(0x06c461d8) /* 0.422944873 */, 18 }, - /* 6077 */ { MAD_F(0x06c4c32a) /* 0.423037688 */, 18 }, - /* 6078 */ { MAD_F(0x06c5247f) /* 0.423130508 */, 18 }, - /* 6079 */ { MAD_F(0x06c585d4) /* 0.423223333 */, 18 }, - - /* 6080 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 18 }, - /* 6081 */ { MAD_F(0x06c64883) /* 0.423408997 */, 18 }, - /* 6082 */ { MAD_F(0x06c6a9dd) /* 0.423501838 */, 18 }, - /* 6083 */ { MAD_F(0x06c70b38) /* 0.423594683 */, 18 }, - /* 6084 */ { MAD_F(0x06c76c94) /* 0.423687533 */, 18 }, - /* 6085 */ { MAD_F(0x06c7cdf2) /* 0.423780389 */, 18 }, - /* 6086 */ { MAD_F(0x06c82f51) /* 0.423873249 */, 18 }, - /* 6087 */ { MAD_F(0x06c890b1) /* 0.423966115 */, 18 }, - /* 6088 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 18 }, - /* 6089 */ { MAD_F(0x06c95376) /* 0.424151861 */, 18 }, - /* 6090 */ { MAD_F(0x06c9b4da) /* 0.424244742 */, 18 }, - /* 6091 */ { MAD_F(0x06ca1640) /* 0.424337628 */, 18 }, - /* 6092 */ { MAD_F(0x06ca77a8) /* 0.424430519 */, 18 }, - /* 6093 */ { MAD_F(0x06cad910) /* 0.424523415 */, 18 }, - /* 6094 */ { MAD_F(0x06cb3a7a) /* 0.424616316 */, 18 }, - /* 6095 */ { MAD_F(0x06cb9be5) /* 0.424709222 */, 18 }, - - /* 6096 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 18 }, - /* 6097 */ { MAD_F(0x06cc5ec0) /* 0.424895050 */, 18 }, - /* 6098 */ { MAD_F(0x06ccc030) /* 0.424987971 */, 18 }, - /* 6099 */ { MAD_F(0x06cd21a0) /* 0.425080898 */, 18 }, - /* 6100 */ { MAD_F(0x06cd8313) /* 0.425173829 */, 18 }, - /* 6101 */ { MAD_F(0x06cde486) /* 0.425266766 */, 18 }, - /* 6102 */ { MAD_F(0x06ce45fb) /* 0.425359708 */, 18 }, - /* 6103 */ { MAD_F(0x06cea771) /* 0.425452655 */, 18 }, - /* 6104 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 18 }, - /* 6105 */ { MAD_F(0x06cf6a62) /* 0.425638564 */, 18 }, - /* 6106 */ { MAD_F(0x06cfcbdc) /* 0.425731526 */, 18 }, - /* 6107 */ { MAD_F(0x06d02d58) /* 0.425824493 */, 18 }, - /* 6108 */ { MAD_F(0x06d08ed5) /* 0.425917465 */, 18 }, - /* 6109 */ { MAD_F(0x06d0f053) /* 0.426010443 */, 18 }, - /* 6110 */ { MAD_F(0x06d151d3) /* 0.426103425 */, 18 }, - /* 6111 */ { MAD_F(0x06d1b354) /* 0.426196412 */, 18 }, - - /* 6112 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 18 }, - /* 6113 */ { MAD_F(0x06d2765a) /* 0.426382403 */, 18 }, - /* 6114 */ { MAD_F(0x06d2d7e0) /* 0.426475405 */, 18 }, - /* 6115 */ { MAD_F(0x06d33966) /* 0.426568413 */, 18 }, - /* 6116 */ { MAD_F(0x06d39aee) /* 0.426661426 */, 18 }, - /* 6117 */ { MAD_F(0x06d3fc77) /* 0.426754444 */, 18 }, - /* 6118 */ { MAD_F(0x06d45e02) /* 0.426847467 */, 18 }, - /* 6119 */ { MAD_F(0x06d4bf8e) /* 0.426940495 */, 18 }, - /* 6120 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 18 }, - /* 6121 */ { MAD_F(0x06d582aa) /* 0.427126566 */, 18 }, - /* 6122 */ { MAD_F(0x06d5e43a) /* 0.427219609 */, 18 }, - /* 6123 */ { MAD_F(0x06d645cc) /* 0.427312657 */, 18 }, - /* 6124 */ { MAD_F(0x06d6a75f) /* 0.427405711 */, 18 }, - /* 6125 */ { MAD_F(0x06d708f3) /* 0.427498769 */, 18 }, - /* 6126 */ { MAD_F(0x06d76a88) /* 0.427591833 */, 18 }, - /* 6127 */ { MAD_F(0x06d7cc1f) /* 0.427684901 */, 18 }, - - /* 6128 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 18 }, - /* 6129 */ { MAD_F(0x06d88f51) /* 0.427871054 */, 18 }, - /* 6130 */ { MAD_F(0x06d8f0ec) /* 0.427964137 */, 18 }, - /* 6131 */ { MAD_F(0x06d95288) /* 0.428057226 */, 18 }, - /* 6132 */ { MAD_F(0x06d9b426) /* 0.428150320 */, 18 }, - /* 6133 */ { MAD_F(0x06da15c5) /* 0.428243419 */, 18 }, - /* 6134 */ { MAD_F(0x06da7766) /* 0.428336523 */, 18 }, - /* 6135 */ { MAD_F(0x06dad907) /* 0.428429632 */, 18 }, - /* 6136 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 18 }, - /* 6137 */ { MAD_F(0x06db9c4f) /* 0.428615865 */, 18 }, - /* 6138 */ { MAD_F(0x06dbfdf5) /* 0.428708989 */, 18 }, - /* 6139 */ { MAD_F(0x06dc5f9c) /* 0.428802119 */, 18 }, - /* 6140 */ { MAD_F(0x06dcc145) /* 0.428895253 */, 18 }, - /* 6141 */ { MAD_F(0x06dd22ee) /* 0.428988392 */, 18 }, - /* 6142 */ { MAD_F(0x06dd849a) /* 0.429081537 */, 18 }, - /* 6143 */ { MAD_F(0x06dde646) /* 0.429174686 */, 18 }, - - /* 6144 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 18 }, - /* 6145 */ { MAD_F(0x06dea9a4) /* 0.429361001 */, 18 }, - /* 6146 */ { MAD_F(0x06df0b54) /* 0.429454165 */, 18 }, - /* 6147 */ { MAD_F(0x06df6d06) /* 0.429547335 */, 18 }, - /* 6148 */ { MAD_F(0x06dfceba) /* 0.429640510 */, 18 }, - /* 6149 */ { MAD_F(0x06e0306f) /* 0.429733690 */, 18 }, - /* 6150 */ { MAD_F(0x06e09225) /* 0.429826874 */, 18 }, - /* 6151 */ { MAD_F(0x06e0f3dc) /* 0.429920064 */, 18 }, - /* 6152 */ { MAD_F(0x06e15595) /* 0.430013259 */, 18 }, - /* 6153 */ { MAD_F(0x06e1b74f) /* 0.430106459 */, 18 }, - /* 6154 */ { MAD_F(0x06e2190b) /* 0.430199664 */, 18 }, - /* 6155 */ { MAD_F(0x06e27ac8) /* 0.430292875 */, 18 }, - /* 6156 */ { MAD_F(0x06e2dc86) /* 0.430386090 */, 18 }, - /* 6157 */ { MAD_F(0x06e33e46) /* 0.430479310 */, 18 }, - /* 6158 */ { MAD_F(0x06e3a007) /* 0.430572535 */, 18 }, - /* 6159 */ { MAD_F(0x06e401c9) /* 0.430665765 */, 18 }, - - /* 6160 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 18 }, - /* 6161 */ { MAD_F(0x06e4c552) /* 0.430852241 */, 18 }, - /* 6162 */ { MAD_F(0x06e52718) /* 0.430945487 */, 18 }, - /* 6163 */ { MAD_F(0x06e588e0) /* 0.431038737 */, 18 }, - /* 6164 */ { MAD_F(0x06e5eaa9) /* 0.431131993 */, 18 }, - /* 6165 */ { MAD_F(0x06e64c73) /* 0.431225253 */, 18 }, - /* 6166 */ { MAD_F(0x06e6ae3f) /* 0.431318519 */, 18 }, - /* 6167 */ { MAD_F(0x06e7100c) /* 0.431411790 */, 18 }, - /* 6168 */ { MAD_F(0x06e771db) /* 0.431505065 */, 18 }, - /* 6169 */ { MAD_F(0x06e7d3ab) /* 0.431598346 */, 18 }, - /* 6170 */ { MAD_F(0x06e8357c) /* 0.431691632 */, 18 }, - /* 6171 */ { MAD_F(0x06e8974e) /* 0.431784923 */, 18 }, - /* 6172 */ { MAD_F(0x06e8f922) /* 0.431878218 */, 18 }, - /* 6173 */ { MAD_F(0x06e95af8) /* 0.431971519 */, 18 }, - /* 6174 */ { MAD_F(0x06e9bcce) /* 0.432064825 */, 18 }, - /* 6175 */ { MAD_F(0x06ea1ea6) /* 0.432158136 */, 18 }, - - /* 6176 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 18 }, - /* 6177 */ { MAD_F(0x06eae25a) /* 0.432344773 */, 18 }, - /* 6178 */ { MAD_F(0x06eb4436) /* 0.432438099 */, 18 }, - /* 6179 */ { MAD_F(0x06eba614) /* 0.432531431 */, 18 }, - /* 6180 */ { MAD_F(0x06ec07f2) /* 0.432624767 */, 18 }, - /* 6181 */ { MAD_F(0x06ec69d2) /* 0.432718108 */, 18 }, - /* 6182 */ { MAD_F(0x06eccbb4) /* 0.432811454 */, 18 }, - /* 6183 */ { MAD_F(0x06ed2d97) /* 0.432904805 */, 18 }, - /* 6184 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 18 }, - /* 6185 */ { MAD_F(0x06edf160) /* 0.433091523 */, 18 }, - /* 6186 */ { MAD_F(0x06ee5347) /* 0.433184889 */, 18 }, - /* 6187 */ { MAD_F(0x06eeb52f) /* 0.433278261 */, 18 }, - /* 6188 */ { MAD_F(0x06ef1719) /* 0.433371637 */, 18 }, - /* 6189 */ { MAD_F(0x06ef7904) /* 0.433465019 */, 18 }, - /* 6190 */ { MAD_F(0x06efdaf0) /* 0.433558405 */, 18 }, - /* 6191 */ { MAD_F(0x06f03cde) /* 0.433651797 */, 18 }, - - /* 6192 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 18 }, - /* 6193 */ { MAD_F(0x06f100bd) /* 0.433838595 */, 18 }, - /* 6194 */ { MAD_F(0x06f162ae) /* 0.433932001 */, 18 }, - /* 6195 */ { MAD_F(0x06f1c4a1) /* 0.434025413 */, 18 }, - /* 6196 */ { MAD_F(0x06f22696) /* 0.434118830 */, 18 }, - /* 6197 */ { MAD_F(0x06f2888b) /* 0.434212251 */, 18 }, - /* 6198 */ { MAD_F(0x06f2ea82) /* 0.434305678 */, 18 }, - /* 6199 */ { MAD_F(0x06f34c7b) /* 0.434399110 */, 18 }, - /* 6200 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 18 }, - /* 6201 */ { MAD_F(0x06f41070) /* 0.434585988 */, 18 }, - /* 6202 */ { MAD_F(0x06f4726c) /* 0.434679435 */, 18 }, - /* 6203 */ { MAD_F(0x06f4d46a) /* 0.434772887 */, 18 }, - /* 6204 */ { MAD_F(0x06f53669) /* 0.434866344 */, 18 }, - /* 6205 */ { MAD_F(0x06f59869) /* 0.434959806 */, 18 }, - /* 6206 */ { MAD_F(0x06f5fa6b) /* 0.435053272 */, 18 }, - /* 6207 */ { MAD_F(0x06f65c6e) /* 0.435146744 */, 18 }, - - /* 6208 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 18 }, - /* 6209 */ { MAD_F(0x06f72079) /* 0.435333703 */, 18 }, - /* 6210 */ { MAD_F(0x06f78280) /* 0.435427190 */, 18 }, - /* 6211 */ { MAD_F(0x06f7e489) /* 0.435520682 */, 18 }, - /* 6212 */ { MAD_F(0x06f84693) /* 0.435614179 */, 18 }, - /* 6213 */ { MAD_F(0x06f8a89e) /* 0.435707681 */, 18 }, - /* 6214 */ { MAD_F(0x06f90aaa) /* 0.435801188 */, 18 }, - /* 6215 */ { MAD_F(0x06f96cb8) /* 0.435894700 */, 18 }, - /* 6216 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 18 }, - /* 6217 */ { MAD_F(0x06fa30d8) /* 0.436081739 */, 18 }, - /* 6218 */ { MAD_F(0x06fa92ea) /* 0.436175266 */, 18 }, - /* 6219 */ { MAD_F(0x06faf4fe) /* 0.436268799 */, 18 }, - /* 6220 */ { MAD_F(0x06fb5712) /* 0.436362336 */, 18 }, - /* 6221 */ { MAD_F(0x06fbb928) /* 0.436455878 */, 18 }, - /* 6222 */ { MAD_F(0x06fc1b40) /* 0.436549425 */, 18 }, - /* 6223 */ { MAD_F(0x06fc7d58) /* 0.436642977 */, 18 }, - - /* 6224 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 18 }, - /* 6225 */ { MAD_F(0x06fd418e) /* 0.436830096 */, 18 }, - /* 6226 */ { MAD_F(0x06fda3ab) /* 0.436923664 */, 18 }, - /* 6227 */ { MAD_F(0x06fe05c9) /* 0.437017236 */, 18 }, - /* 6228 */ { MAD_F(0x06fe67e8) /* 0.437110813 */, 18 }, - /* 6229 */ { MAD_F(0x06feca09) /* 0.437204395 */, 18 }, - /* 6230 */ { MAD_F(0x06ff2c2b) /* 0.437297982 */, 18 }, - /* 6231 */ { MAD_F(0x06ff8e4f) /* 0.437391575 */, 18 }, - /* 6232 */ { MAD_F(0x06fff073) /* 0.437485172 */, 18 }, - /* 6233 */ { MAD_F(0x0700529a) /* 0.437578774 */, 18 }, - /* 6234 */ { MAD_F(0x0700b4c1) /* 0.437672381 */, 18 }, - /* 6235 */ { MAD_F(0x070116ea) /* 0.437765994 */, 18 }, - /* 6236 */ { MAD_F(0x07017914) /* 0.437859611 */, 18 }, - /* 6237 */ { MAD_F(0x0701db40) /* 0.437953233 */, 18 }, - /* 6238 */ { MAD_F(0x07023d6c) /* 0.438046860 */, 18 }, - /* 6239 */ { MAD_F(0x07029f9b) /* 0.438140493 */, 18 }, - - /* 6240 */ { MAD_F(0x070301ca) /* 0.438234130 */, 18 }, - /* 6241 */ { MAD_F(0x070363fb) /* 0.438327772 */, 18 }, - /* 6242 */ { MAD_F(0x0703c62d) /* 0.438421419 */, 18 }, - /* 6243 */ { MAD_F(0x07042861) /* 0.438515072 */, 18 }, - /* 6244 */ { MAD_F(0x07048a96) /* 0.438608729 */, 18 }, - /* 6245 */ { MAD_F(0x0704eccc) /* 0.438702391 */, 18 }, - /* 6246 */ { MAD_F(0x07054f04) /* 0.438796059 */, 18 }, - /* 6247 */ { MAD_F(0x0705b13d) /* 0.438889731 */, 18 }, - /* 6248 */ { MAD_F(0x07061377) /* 0.438983408 */, 18 }, - /* 6249 */ { MAD_F(0x070675b3) /* 0.439077090 */, 18 }, - /* 6250 */ { MAD_F(0x0706d7f0) /* 0.439170778 */, 18 }, - /* 6251 */ { MAD_F(0x07073a2e) /* 0.439264470 */, 18 }, - /* 6252 */ { MAD_F(0x07079c6e) /* 0.439358167 */, 18 }, - /* 6253 */ { MAD_F(0x0707feaf) /* 0.439451869 */, 18 }, - /* 6254 */ { MAD_F(0x070860f1) /* 0.439545577 */, 18 }, - /* 6255 */ { MAD_F(0x0708c335) /* 0.439639289 */, 18 }, - - /* 6256 */ { MAD_F(0x0709257a) /* 0.439733006 */, 18 }, - /* 6257 */ { MAD_F(0x070987c0) /* 0.439826728 */, 18 }, - /* 6258 */ { MAD_F(0x0709ea08) /* 0.439920456 */, 18 }, - /* 6259 */ { MAD_F(0x070a4c51) /* 0.440014188 */, 18 }, - /* 6260 */ { MAD_F(0x070aae9b) /* 0.440107925 */, 18 }, - /* 6261 */ { MAD_F(0x070b10e7) /* 0.440201667 */, 18 }, - /* 6262 */ { MAD_F(0x070b7334) /* 0.440295414 */, 18 }, - /* 6263 */ { MAD_F(0x070bd583) /* 0.440389167 */, 18 }, - /* 6264 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 18 }, - /* 6265 */ { MAD_F(0x070c9a23) /* 0.440576686 */, 18 }, - /* 6266 */ { MAD_F(0x070cfc76) /* 0.440670453 */, 18 }, - /* 6267 */ { MAD_F(0x070d5eca) /* 0.440764225 */, 18 }, - /* 6268 */ { MAD_F(0x070dc11f) /* 0.440858002 */, 18 }, - /* 6269 */ { MAD_F(0x070e2375) /* 0.440951784 */, 18 }, - /* 6270 */ { MAD_F(0x070e85cd) /* 0.441045572 */, 18 }, - /* 6271 */ { MAD_F(0x070ee826) /* 0.441139364 */, 18 }, - - /* 6272 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 18 }, - /* 6273 */ { MAD_F(0x070facdc) /* 0.441326963 */, 18 }, - /* 6274 */ { MAD_F(0x07100f39) /* 0.441420770 */, 18 }, - /* 6275 */ { MAD_F(0x07107198) /* 0.441514582 */, 18 }, - /* 6276 */ { MAD_F(0x0710d3f8) /* 0.441608399 */, 18 }, - /* 6277 */ { MAD_F(0x07113659) /* 0.441702221 */, 18 }, - /* 6278 */ { MAD_F(0x071198bb) /* 0.441796048 */, 18 }, - /* 6279 */ { MAD_F(0x0711fb1f) /* 0.441889880 */, 18 }, - /* 6280 */ { MAD_F(0x07125d84) /* 0.441983717 */, 18 }, - /* 6281 */ { MAD_F(0x0712bfeb) /* 0.442077559 */, 18 }, - /* 6282 */ { MAD_F(0x07132253) /* 0.442171406 */, 18 }, - /* 6283 */ { MAD_F(0x071384bc) /* 0.442265257 */, 18 }, - /* 6284 */ { MAD_F(0x0713e726) /* 0.442359114 */, 18 }, - /* 6285 */ { MAD_F(0x07144992) /* 0.442452976 */, 18 }, - /* 6286 */ { MAD_F(0x0714abff) /* 0.442546843 */, 18 }, - /* 6287 */ { MAD_F(0x07150e6e) /* 0.442640715 */, 18 }, - - /* 6288 */ { MAD_F(0x071570de) /* 0.442734592 */, 18 }, - /* 6289 */ { MAD_F(0x0715d34f) /* 0.442828473 */, 18 }, - /* 6290 */ { MAD_F(0x071635c1) /* 0.442922360 */, 18 }, - /* 6291 */ { MAD_F(0x07169835) /* 0.443016252 */, 18 }, - /* 6292 */ { MAD_F(0x0716faaa) /* 0.443110148 */, 18 }, - /* 6293 */ { MAD_F(0x07175d21) /* 0.443204050 */, 18 }, - /* 6294 */ { MAD_F(0x0717bf99) /* 0.443297957 */, 18 }, - /* 6295 */ { MAD_F(0x07182212) /* 0.443391868 */, 18 }, - /* 6296 */ { MAD_F(0x0718848d) /* 0.443485785 */, 18 }, - /* 6297 */ { MAD_F(0x0718e709) /* 0.443579706 */, 18 }, - /* 6298 */ { MAD_F(0x07194986) /* 0.443673633 */, 18 }, - /* 6299 */ { MAD_F(0x0719ac04) /* 0.443767564 */, 18 }, - /* 6300 */ { MAD_F(0x071a0e84) /* 0.443861501 */, 18 }, - /* 6301 */ { MAD_F(0x071a7105) /* 0.443955442 */, 18 }, - /* 6302 */ { MAD_F(0x071ad388) /* 0.444049389 */, 18 }, - /* 6303 */ { MAD_F(0x071b360c) /* 0.444143340 */, 18 }, - - /* 6304 */ { MAD_F(0x071b9891) /* 0.444237296 */, 18 }, - /* 6305 */ { MAD_F(0x071bfb18) /* 0.444331258 */, 18 }, - /* 6306 */ { MAD_F(0x071c5d9f) /* 0.444425224 */, 18 }, - /* 6307 */ { MAD_F(0x071cc029) /* 0.444519195 */, 18 }, - /* 6308 */ { MAD_F(0x071d22b3) /* 0.444613171 */, 18 }, - /* 6309 */ { MAD_F(0x071d853f) /* 0.444707153 */, 18 }, - /* 6310 */ { MAD_F(0x071de7cc) /* 0.444801139 */, 18 }, - /* 6311 */ { MAD_F(0x071e4a5b) /* 0.444895130 */, 18 }, - /* 6312 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 18 }, - /* 6313 */ { MAD_F(0x071f0f7c) /* 0.445083127 */, 18 }, - /* 6314 */ { MAD_F(0x071f720e) /* 0.445177133 */, 18 }, - /* 6315 */ { MAD_F(0x071fd4a2) /* 0.445271144 */, 18 }, - /* 6316 */ { MAD_F(0x07203737) /* 0.445365160 */, 18 }, - /* 6317 */ { MAD_F(0x072099ce) /* 0.445459181 */, 18 }, - /* 6318 */ { MAD_F(0x0720fc66) /* 0.445553206 */, 18 }, - /* 6319 */ { MAD_F(0x07215eff) /* 0.445647237 */, 18 }, - - /* 6320 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 18 }, - /* 6321 */ { MAD_F(0x07222436) /* 0.445835314 */, 18 }, - /* 6322 */ { MAD_F(0x072286d3) /* 0.445929359 */, 18 }, - /* 6323 */ { MAD_F(0x0722e971) /* 0.446023410 */, 18 }, - /* 6324 */ { MAD_F(0x07234c11) /* 0.446117466 */, 18 }, - /* 6325 */ { MAD_F(0x0723aeb2) /* 0.446211526 */, 18 }, - /* 6326 */ { MAD_F(0x07241155) /* 0.446305592 */, 18 }, - /* 6327 */ { MAD_F(0x072473f9) /* 0.446399662 */, 18 }, - /* 6328 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 18 }, - /* 6329 */ { MAD_F(0x07253944) /* 0.446587818 */, 18 }, - /* 6330 */ { MAD_F(0x07259bec) /* 0.446681903 */, 18 }, - /* 6331 */ { MAD_F(0x0725fe95) /* 0.446775994 */, 18 }, - /* 6332 */ { MAD_F(0x07266140) /* 0.446870089 */, 18 }, - /* 6333 */ { MAD_F(0x0726c3ec) /* 0.446964189 */, 18 }, - /* 6334 */ { MAD_F(0x07272699) /* 0.447058294 */, 18 }, - /* 6335 */ { MAD_F(0x07278947) /* 0.447152404 */, 18 }, - - /* 6336 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 18 }, - /* 6337 */ { MAD_F(0x07284ea8) /* 0.447340639 */, 18 }, - /* 6338 */ { MAD_F(0x0728b15b) /* 0.447434764 */, 18 }, - /* 6339 */ { MAD_F(0x0729140f) /* 0.447528894 */, 18 }, - /* 6340 */ { MAD_F(0x072976c4) /* 0.447623029 */, 18 }, - /* 6341 */ { MAD_F(0x0729d97a) /* 0.447717169 */, 18 }, - /* 6342 */ { MAD_F(0x072a3c32) /* 0.447811314 */, 18 }, - /* 6343 */ { MAD_F(0x072a9eeb) /* 0.447905463 */, 18 }, - /* 6344 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 18 }, - /* 6345 */ { MAD_F(0x072b6461) /* 0.448093778 */, 18 }, - /* 6346 */ { MAD_F(0x072bc71e) /* 0.448187942 */, 18 }, - /* 6347 */ { MAD_F(0x072c29dd) /* 0.448282112 */, 18 }, - /* 6348 */ { MAD_F(0x072c8c9d) /* 0.448376286 */, 18 }, - /* 6349 */ { MAD_F(0x072cef5e) /* 0.448470466 */, 18 }, - /* 6350 */ { MAD_F(0x072d5220) /* 0.448564650 */, 18 }, - /* 6351 */ { MAD_F(0x072db4e4) /* 0.448658839 */, 18 }, - - /* 6352 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 18 }, - /* 6353 */ { MAD_F(0x072e7a6f) /* 0.448847233 */, 18 }, - /* 6354 */ { MAD_F(0x072edd37) /* 0.448941437 */, 18 }, - /* 6355 */ { MAD_F(0x072f4000) /* 0.449035646 */, 18 }, - /* 6356 */ { MAD_F(0x072fa2ca) /* 0.449129860 */, 18 }, - /* 6357 */ { MAD_F(0x07300596) /* 0.449224079 */, 18 }, - /* 6358 */ { MAD_F(0x07306863) /* 0.449318303 */, 18 }, - /* 6359 */ { MAD_F(0x0730cb32) /* 0.449412531 */, 18 }, - /* 6360 */ { MAD_F(0x07312e01) /* 0.449506765 */, 18 }, - /* 6361 */ { MAD_F(0x073190d2) /* 0.449601004 */, 18 }, - /* 6362 */ { MAD_F(0x0731f3a5) /* 0.449695247 */, 18 }, - /* 6363 */ { MAD_F(0x07325678) /* 0.449789496 */, 18 }, - /* 6364 */ { MAD_F(0x0732b94d) /* 0.449883749 */, 18 }, - /* 6365 */ { MAD_F(0x07331c23) /* 0.449978008 */, 18 }, - /* 6366 */ { MAD_F(0x07337efb) /* 0.450072271 */, 18 }, - /* 6367 */ { MAD_F(0x0733e1d4) /* 0.450166540 */, 18 }, - - /* 6368 */ { MAD_F(0x073444ae) /* 0.450260813 */, 18 }, - /* 6369 */ { MAD_F(0x0734a78a) /* 0.450355091 */, 18 }, - /* 6370 */ { MAD_F(0x07350a67) /* 0.450449374 */, 18 }, - /* 6371 */ { MAD_F(0x07356d45) /* 0.450543662 */, 18 }, - /* 6372 */ { MAD_F(0x0735d025) /* 0.450637955 */, 18 }, - /* 6373 */ { MAD_F(0x07363306) /* 0.450732253 */, 18 }, - /* 6374 */ { MAD_F(0x073695e8) /* 0.450826556 */, 18 }, - /* 6375 */ { MAD_F(0x0736f8cb) /* 0.450920864 */, 18 }, - /* 6376 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 18 }, - /* 6377 */ { MAD_F(0x0737be96) /* 0.451109494 */, 18 }, - /* 6378 */ { MAD_F(0x0738217e) /* 0.451203817 */, 18 }, - /* 6379 */ { MAD_F(0x07388467) /* 0.451298144 */, 18 }, - /* 6380 */ { MAD_F(0x0738e751) /* 0.451392477 */, 18 }, - /* 6381 */ { MAD_F(0x07394a3d) /* 0.451486814 */, 18 }, - /* 6382 */ { MAD_F(0x0739ad29) /* 0.451581156 */, 18 }, - /* 6383 */ { MAD_F(0x073a1017) /* 0.451675503 */, 18 }, - - /* 6384 */ { MAD_F(0x073a7307) /* 0.451769856 */, 18 }, - /* 6385 */ { MAD_F(0x073ad5f8) /* 0.451864213 */, 18 }, - /* 6386 */ { MAD_F(0x073b38ea) /* 0.451958575 */, 18 }, - /* 6387 */ { MAD_F(0x073b9bdd) /* 0.452052942 */, 18 }, - /* 6388 */ { MAD_F(0x073bfed2) /* 0.452147313 */, 18 }, - /* 6389 */ { MAD_F(0x073c61c8) /* 0.452241690 */, 18 }, - /* 6390 */ { MAD_F(0x073cc4bf) /* 0.452336072 */, 18 }, - /* 6391 */ { MAD_F(0x073d27b8) /* 0.452430458 */, 18 }, - /* 6392 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 18 }, - /* 6393 */ { MAD_F(0x073dedae) /* 0.452619246 */, 18 }, - /* 6394 */ { MAD_F(0x073e50aa) /* 0.452713648 */, 18 }, - /* 6395 */ { MAD_F(0x073eb3a8) /* 0.452808054 */, 18 }, - /* 6396 */ { MAD_F(0x073f16a8) /* 0.452902465 */, 18 }, - /* 6397 */ { MAD_F(0x073f79a8) /* 0.452996882 */, 18 }, - /* 6398 */ { MAD_F(0x073fdcaa) /* 0.453091303 */, 18 }, - /* 6399 */ { MAD_F(0x07403fad) /* 0.453185729 */, 18 }, - - /* 6400 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 18 }, - /* 6401 */ { MAD_F(0x074105b8) /* 0.453374595 */, 18 }, - /* 6402 */ { MAD_F(0x074168bf) /* 0.453469036 */, 18 }, - /* 6403 */ { MAD_F(0x0741cbc8) /* 0.453563482 */, 18 }, - /* 6404 */ { MAD_F(0x07422ed2) /* 0.453657932 */, 18 }, - /* 6405 */ { MAD_F(0x074291dd) /* 0.453752388 */, 18 }, - /* 6406 */ { MAD_F(0x0742f4e9) /* 0.453846848 */, 18 }, - /* 6407 */ { MAD_F(0x074357f7) /* 0.453941314 */, 18 }, - /* 6408 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 18 }, - /* 6409 */ { MAD_F(0x07441e17) /* 0.454130259 */, 18 }, - /* 6410 */ { MAD_F(0x07448129) /* 0.454224739 */, 18 }, - /* 6411 */ { MAD_F(0x0744e43c) /* 0.454319224 */, 18 }, - /* 6412 */ { MAD_F(0x07454750) /* 0.454413714 */, 18 }, - /* 6413 */ { MAD_F(0x0745aa66) /* 0.454508209 */, 18 }, - /* 6414 */ { MAD_F(0x07460d7d) /* 0.454602708 */, 18 }, - /* 6415 */ { MAD_F(0x07467095) /* 0.454697213 */, 18 }, - - /* 6416 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 18 }, - /* 6417 */ { MAD_F(0x074736ca) /* 0.454886237 */, 18 }, - /* 6418 */ { MAD_F(0x074799e7) /* 0.454980756 */, 18 }, - /* 6419 */ { MAD_F(0x0747fd04) /* 0.455075281 */, 18 }, - /* 6420 */ { MAD_F(0x07486023) /* 0.455169810 */, 18 }, - /* 6421 */ { MAD_F(0x0748c344) /* 0.455264344 */, 18 }, - /* 6422 */ { MAD_F(0x07492665) /* 0.455358883 */, 18 }, - /* 6423 */ { MAD_F(0x07498988) /* 0.455453427 */, 18 }, - /* 6424 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 18 }, - /* 6425 */ { MAD_F(0x074a4fd2) /* 0.455642529 */, 18 }, - /* 6426 */ { MAD_F(0x074ab2f9) /* 0.455737088 */, 18 }, - /* 6427 */ { MAD_F(0x074b1621) /* 0.455831652 */, 18 }, - /* 6428 */ { MAD_F(0x074b794b) /* 0.455926220 */, 18 }, - /* 6429 */ { MAD_F(0x074bdc75) /* 0.456020793 */, 18 }, - /* 6430 */ { MAD_F(0x074c3fa1) /* 0.456115372 */, 18 }, - /* 6431 */ { MAD_F(0x074ca2cf) /* 0.456209955 */, 18 }, - - /* 6432 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 18 }, - /* 6433 */ { MAD_F(0x074d692e) /* 0.456399136 */, 18 }, - /* 6434 */ { MAD_F(0x074dcc5f) /* 0.456493733 */, 18 }, - /* 6435 */ { MAD_F(0x074e2f92) /* 0.456588336 */, 18 }, - /* 6436 */ { MAD_F(0x074e92c6) /* 0.456682944 */, 18 }, - /* 6437 */ { MAD_F(0x074ef5fb) /* 0.456777556 */, 18 }, - /* 6438 */ { MAD_F(0x074f5932) /* 0.456872174 */, 18 }, - /* 6439 */ { MAD_F(0x074fbc6a) /* 0.456966796 */, 18 }, - /* 6440 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 18 }, - /* 6441 */ { MAD_F(0x075082de) /* 0.457156056 */, 18 }, - /* 6442 */ { MAD_F(0x0750e61a) /* 0.457250693 */, 18 }, - /* 6443 */ { MAD_F(0x07514957) /* 0.457345335 */, 18 }, - /* 6444 */ { MAD_F(0x0751ac96) /* 0.457439981 */, 18 }, - /* 6445 */ { MAD_F(0x07520fd6) /* 0.457534633 */, 18 }, - /* 6446 */ { MAD_F(0x07527317) /* 0.457629290 */, 18 }, - /* 6447 */ { MAD_F(0x0752d659) /* 0.457723951 */, 18 }, - - /* 6448 */ { MAD_F(0x0753399d) /* 0.457818618 */, 18 }, - /* 6449 */ { MAD_F(0x07539ce2) /* 0.457913289 */, 18 }, - /* 6450 */ { MAD_F(0x07540029) /* 0.458007965 */, 18 }, - /* 6451 */ { MAD_F(0x07546371) /* 0.458102646 */, 18 }, - /* 6452 */ { MAD_F(0x0754c6ba) /* 0.458197332 */, 18 }, - /* 6453 */ { MAD_F(0x07552a04) /* 0.458292023 */, 18 }, - /* 6454 */ { MAD_F(0x07558d50) /* 0.458386719 */, 18 }, - /* 6455 */ { MAD_F(0x0755f09d) /* 0.458481420 */, 18 }, - /* 6456 */ { MAD_F(0x075653eb) /* 0.458576125 */, 18 }, - /* 6457 */ { MAD_F(0x0756b73b) /* 0.458670836 */, 18 }, - /* 6458 */ { MAD_F(0x07571a8c) /* 0.458765551 */, 18 }, - /* 6459 */ { MAD_F(0x07577dde) /* 0.458860271 */, 18 }, - /* 6460 */ { MAD_F(0x0757e131) /* 0.458954996 */, 18 }, - /* 6461 */ { MAD_F(0x07584486) /* 0.459049726 */, 18 }, - /* 6462 */ { MAD_F(0x0758a7dd) /* 0.459144461 */, 18 }, - /* 6463 */ { MAD_F(0x07590b34) /* 0.459239201 */, 18 }, - - /* 6464 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 18 }, - /* 6465 */ { MAD_F(0x0759d1e7) /* 0.459428695 */, 18 }, - /* 6466 */ { MAD_F(0x075a3542) /* 0.459523450 */, 18 }, - /* 6467 */ { MAD_F(0x075a989f) /* 0.459618209 */, 18 }, - /* 6468 */ { MAD_F(0x075afbfd) /* 0.459712973 */, 18 }, - /* 6469 */ { MAD_F(0x075b5f5d) /* 0.459807742 */, 18 }, - /* 6470 */ { MAD_F(0x075bc2bd) /* 0.459902516 */, 18 }, - /* 6471 */ { MAD_F(0x075c261f) /* 0.459997295 */, 18 }, - /* 6472 */ { MAD_F(0x075c8983) /* 0.460092079 */, 18 }, - /* 6473 */ { MAD_F(0x075cece7) /* 0.460186867 */, 18 }, - /* 6474 */ { MAD_F(0x075d504d) /* 0.460281661 */, 18 }, - /* 6475 */ { MAD_F(0x075db3b5) /* 0.460376459 */, 18 }, - /* 6476 */ { MAD_F(0x075e171d) /* 0.460471262 */, 18 }, - /* 6477 */ { MAD_F(0x075e7a87) /* 0.460566071 */, 18 }, - /* 6478 */ { MAD_F(0x075eddf2) /* 0.460660884 */, 18 }, - /* 6479 */ { MAD_F(0x075f415f) /* 0.460755701 */, 18 }, - - /* 6480 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 18 }, - /* 6481 */ { MAD_F(0x0760083b) /* 0.460945352 */, 18 }, - /* 6482 */ { MAD_F(0x07606bac) /* 0.461040184 */, 18 }, - /* 6483 */ { MAD_F(0x0760cf1e) /* 0.461135022 */, 18 }, - /* 6484 */ { MAD_F(0x07613291) /* 0.461229864 */, 18 }, - /* 6485 */ { MAD_F(0x07619605) /* 0.461324711 */, 18 }, - /* 6486 */ { MAD_F(0x0761f97b) /* 0.461419563 */, 18 }, - /* 6487 */ { MAD_F(0x07625cf2) /* 0.461514420 */, 18 }, - /* 6488 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 18 }, - /* 6489 */ { MAD_F(0x076323e3) /* 0.461704149 */, 18 }, - /* 6490 */ { MAD_F(0x0763875e) /* 0.461799020 */, 18 }, - /* 6491 */ { MAD_F(0x0763eadb) /* 0.461893897 */, 18 }, - /* 6492 */ { MAD_F(0x07644e58) /* 0.461988778 */, 18 }, - /* 6493 */ { MAD_F(0x0764b1d7) /* 0.462083664 */, 18 }, - /* 6494 */ { MAD_F(0x07651557) /* 0.462178555 */, 18 }, - /* 6495 */ { MAD_F(0x076578d8) /* 0.462273451 */, 18 }, - - /* 6496 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 18 }, - /* 6497 */ { MAD_F(0x07663fdf) /* 0.462463257 */, 18 }, - /* 6498 */ { MAD_F(0x0766a364) /* 0.462558168 */, 18 }, - /* 6499 */ { MAD_F(0x076706eb) /* 0.462653083 */, 18 }, - /* 6500 */ { MAD_F(0x07676a73) /* 0.462748003 */, 18 }, - /* 6501 */ { MAD_F(0x0767cdfc) /* 0.462842928 */, 18 }, - /* 6502 */ { MAD_F(0x07683187) /* 0.462937858 */, 18 }, - /* 6503 */ { MAD_F(0x07689513) /* 0.463032793 */, 18 }, - /* 6504 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 18 }, - /* 6505 */ { MAD_F(0x07695c2e) /* 0.463222678 */, 18 }, - /* 6506 */ { MAD_F(0x0769bfbe) /* 0.463317627 */, 18 }, - /* 6507 */ { MAD_F(0x076a234f) /* 0.463412581 */, 18 }, - /* 6508 */ { MAD_F(0x076a86e2) /* 0.463507540 */, 18 }, - /* 6509 */ { MAD_F(0x076aea75) /* 0.463602504 */, 18 }, - /* 6510 */ { MAD_F(0x076b4e0a) /* 0.463697473 */, 18 }, - /* 6511 */ { MAD_F(0x076bb1a1) /* 0.463792447 */, 18 }, - - /* 6512 */ { MAD_F(0x076c1538) /* 0.463887426 */, 18 }, - /* 6513 */ { MAD_F(0x076c78d1) /* 0.463982409 */, 18 }, - /* 6514 */ { MAD_F(0x076cdc6c) /* 0.464077398 */, 18 }, - /* 6515 */ { MAD_F(0x076d4007) /* 0.464172391 */, 18 }, - /* 6516 */ { MAD_F(0x076da3a4) /* 0.464267389 */, 18 }, - /* 6517 */ { MAD_F(0x076e0742) /* 0.464362392 */, 18 }, - /* 6518 */ { MAD_F(0x076e6ae2) /* 0.464457399 */, 18 }, - /* 6519 */ { MAD_F(0x076ece82) /* 0.464552412 */, 18 }, - /* 6520 */ { MAD_F(0x076f3224) /* 0.464647430 */, 18 }, - /* 6521 */ { MAD_F(0x076f95c8) /* 0.464742452 */, 18 }, - /* 6522 */ { MAD_F(0x076ff96c) /* 0.464837479 */, 18 }, - /* 6523 */ { MAD_F(0x07705d12) /* 0.464932511 */, 18 }, - /* 6524 */ { MAD_F(0x0770c0ba) /* 0.465027548 */, 18 }, - /* 6525 */ { MAD_F(0x07712462) /* 0.465122590 */, 18 }, - /* 6526 */ { MAD_F(0x0771880c) /* 0.465217637 */, 18 }, - /* 6527 */ { MAD_F(0x0771ebb7) /* 0.465312688 */, 18 }, - - /* 6528 */ { MAD_F(0x07724f64) /* 0.465407744 */, 18 }, - /* 6529 */ { MAD_F(0x0772b312) /* 0.465502806 */, 18 }, - /* 6530 */ { MAD_F(0x077316c1) /* 0.465597872 */, 18 }, - /* 6531 */ { MAD_F(0x07737a71) /* 0.465692943 */, 18 }, - /* 6532 */ { MAD_F(0x0773de23) /* 0.465788018 */, 18 }, - /* 6533 */ { MAD_F(0x077441d6) /* 0.465883099 */, 18 }, - /* 6534 */ { MAD_F(0x0774a58a) /* 0.465978184 */, 18 }, - /* 6535 */ { MAD_F(0x07750940) /* 0.466073275 */, 18 }, - /* 6536 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 18 }, - /* 6537 */ { MAD_F(0x0775d0af) /* 0.466263470 */, 18 }, - /* 6538 */ { MAD_F(0x07763468) /* 0.466358575 */, 18 }, - /* 6539 */ { MAD_F(0x07769823) /* 0.466453684 */, 18 }, - /* 6540 */ { MAD_F(0x0776fbdf) /* 0.466548799 */, 18 }, - /* 6541 */ { MAD_F(0x07775f9d) /* 0.466643918 */, 18 }, - /* 6542 */ { MAD_F(0x0777c35c) /* 0.466739043 */, 18 }, - /* 6543 */ { MAD_F(0x0778271c) /* 0.466834172 */, 18 }, - - /* 6544 */ { MAD_F(0x07788add) /* 0.466929306 */, 18 }, - /* 6545 */ { MAD_F(0x0778ee9f) /* 0.467024445 */, 18 }, - /* 6546 */ { MAD_F(0x07795263) /* 0.467119588 */, 18 }, - /* 6547 */ { MAD_F(0x0779b629) /* 0.467214737 */, 18 }, - /* 6548 */ { MAD_F(0x077a19ef) /* 0.467309890 */, 18 }, - /* 6549 */ { MAD_F(0x077a7db7) /* 0.467405048 */, 18 }, - /* 6550 */ { MAD_F(0x077ae180) /* 0.467500211 */, 18 }, - /* 6551 */ { MAD_F(0x077b454b) /* 0.467595379 */, 18 }, - /* 6552 */ { MAD_F(0x077ba916) /* 0.467690552 */, 18 }, - /* 6553 */ { MAD_F(0x077c0ce3) /* 0.467785729 */, 18 }, - /* 6554 */ { MAD_F(0x077c70b2) /* 0.467880912 */, 18 }, - /* 6555 */ { MAD_F(0x077cd481) /* 0.467976099 */, 18 }, - /* 6556 */ { MAD_F(0x077d3852) /* 0.468071291 */, 18 }, - /* 6557 */ { MAD_F(0x077d9c24) /* 0.468166488 */, 18 }, - /* 6558 */ { MAD_F(0x077dfff8) /* 0.468261690 */, 18 }, - /* 6559 */ { MAD_F(0x077e63cd) /* 0.468356896 */, 18 }, - - /* 6560 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 18 }, - /* 6561 */ { MAD_F(0x077f2b7a) /* 0.468547324 */, 18 }, - /* 6562 */ { MAD_F(0x077f8f53) /* 0.468642545 */, 18 }, - /* 6563 */ { MAD_F(0x077ff32d) /* 0.468737771 */, 18 }, - /* 6564 */ { MAD_F(0x07805708) /* 0.468833002 */, 18 }, - /* 6565 */ { MAD_F(0x0780bae5) /* 0.468928237 */, 18 }, - /* 6566 */ { MAD_F(0x07811ec3) /* 0.469023478 */, 18 }, - /* 6567 */ { MAD_F(0x078182a2) /* 0.469118723 */, 18 }, - /* 6568 */ { MAD_F(0x0781e683) /* 0.469213973 */, 18 }, - /* 6569 */ { MAD_F(0x07824a64) /* 0.469309228 */, 18 }, - /* 6570 */ { MAD_F(0x0782ae47) /* 0.469404488 */, 18 }, - /* 6571 */ { MAD_F(0x0783122c) /* 0.469499752 */, 18 }, - /* 6572 */ { MAD_F(0x07837612) /* 0.469595022 */, 18 }, - /* 6573 */ { MAD_F(0x0783d9f9) /* 0.469690296 */, 18 }, - /* 6574 */ { MAD_F(0x07843de1) /* 0.469785575 */, 18 }, - /* 6575 */ { MAD_F(0x0784a1ca) /* 0.469880859 */, 18 }, - - /* 6576 */ { MAD_F(0x078505b5) /* 0.469976148 */, 18 }, - /* 6577 */ { MAD_F(0x078569a2) /* 0.470071442 */, 18 }, - /* 6578 */ { MAD_F(0x0785cd8f) /* 0.470166740 */, 18 }, - /* 6579 */ { MAD_F(0x0786317e) /* 0.470262043 */, 18 }, - /* 6580 */ { MAD_F(0x0786956e) /* 0.470357351 */, 18 }, - /* 6581 */ { MAD_F(0x0786f95f) /* 0.470452664 */, 18 }, - /* 6582 */ { MAD_F(0x07875d52) /* 0.470547982 */, 18 }, - /* 6583 */ { MAD_F(0x0787c146) /* 0.470643305 */, 18 }, - /* 6584 */ { MAD_F(0x0788253b) /* 0.470738632 */, 18 }, - /* 6585 */ { MAD_F(0x07888932) /* 0.470833964 */, 18 }, - /* 6586 */ { MAD_F(0x0788ed2a) /* 0.470929301 */, 18 }, - /* 6587 */ { MAD_F(0x07895123) /* 0.471024643 */, 18 }, - /* 6588 */ { MAD_F(0x0789b51d) /* 0.471119990 */, 18 }, - /* 6589 */ { MAD_F(0x078a1919) /* 0.471215341 */, 18 }, - /* 6590 */ { MAD_F(0x078a7d16) /* 0.471310698 */, 18 }, - /* 6591 */ { MAD_F(0x078ae114) /* 0.471406059 */, 18 }, - - /* 6592 */ { MAD_F(0x078b4514) /* 0.471501425 */, 18 }, - /* 6593 */ { MAD_F(0x078ba915) /* 0.471596796 */, 18 }, - /* 6594 */ { MAD_F(0x078c0d17) /* 0.471692171 */, 18 }, - /* 6595 */ { MAD_F(0x078c711a) /* 0.471787552 */, 18 }, - /* 6596 */ { MAD_F(0x078cd51f) /* 0.471882937 */, 18 }, - /* 6597 */ { MAD_F(0x078d3925) /* 0.471978327 */, 18 }, - /* 6598 */ { MAD_F(0x078d9d2d) /* 0.472073722 */, 18 }, - /* 6599 */ { MAD_F(0x078e0135) /* 0.472169122 */, 18 }, - /* 6600 */ { MAD_F(0x078e653f) /* 0.472264527 */, 18 }, - /* 6601 */ { MAD_F(0x078ec94b) /* 0.472359936 */, 18 }, - /* 6602 */ { MAD_F(0x078f2d57) /* 0.472455350 */, 18 }, - /* 6603 */ { MAD_F(0x078f9165) /* 0.472550769 */, 18 }, - /* 6604 */ { MAD_F(0x078ff574) /* 0.472646193 */, 18 }, - /* 6605 */ { MAD_F(0x07905985) /* 0.472741622 */, 18 }, - /* 6606 */ { MAD_F(0x0790bd96) /* 0.472837055 */, 18 }, - /* 6607 */ { MAD_F(0x079121a9) /* 0.472932493 */, 18 }, - - /* 6608 */ { MAD_F(0x079185be) /* 0.473027937 */, 18 }, - /* 6609 */ { MAD_F(0x0791e9d3) /* 0.473123384 */, 18 }, - /* 6610 */ { MAD_F(0x07924dea) /* 0.473218837 */, 18 }, - /* 6611 */ { MAD_F(0x0792b202) /* 0.473314295 */, 18 }, - /* 6612 */ { MAD_F(0x0793161c) /* 0.473409757 */, 18 }, - /* 6613 */ { MAD_F(0x07937a37) /* 0.473505224 */, 18 }, - /* 6614 */ { MAD_F(0x0793de53) /* 0.473600696 */, 18 }, - /* 6615 */ { MAD_F(0x07944270) /* 0.473696173 */, 18 }, - /* 6616 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 18 }, - /* 6617 */ { MAD_F(0x07950aaf) /* 0.473887141 */, 18 }, - /* 6618 */ { MAD_F(0x07956ed0) /* 0.473982632 */, 18 }, - /* 6619 */ { MAD_F(0x0795d2f2) /* 0.474078128 */, 18 }, - /* 6620 */ { MAD_F(0x07963716) /* 0.474173629 */, 18 }, - /* 6621 */ { MAD_F(0x07969b3b) /* 0.474269135 */, 18 }, - /* 6622 */ { MAD_F(0x0796ff62) /* 0.474364645 */, 18 }, - /* 6623 */ { MAD_F(0x07976389) /* 0.474460161 */, 18 }, - - /* 6624 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 18 }, - /* 6625 */ { MAD_F(0x07982bdd) /* 0.474651205 */, 18 }, - /* 6626 */ { MAD_F(0x07989008) /* 0.474746735 */, 18 }, - /* 6627 */ { MAD_F(0x0798f435) /* 0.474842270 */, 18 }, - /* 6628 */ { MAD_F(0x07995863) /* 0.474937809 */, 18 }, - /* 6629 */ { MAD_F(0x0799bc92) /* 0.475033353 */, 18 }, - /* 6630 */ { MAD_F(0x079a20c3) /* 0.475128902 */, 18 }, - /* 6631 */ { MAD_F(0x079a84f5) /* 0.475224456 */, 18 }, - /* 6632 */ { MAD_F(0x079ae929) /* 0.475320014 */, 18 }, - /* 6633 */ { MAD_F(0x079b4d5d) /* 0.475415578 */, 18 }, - /* 6634 */ { MAD_F(0x079bb193) /* 0.475511146 */, 18 }, - /* 6635 */ { MAD_F(0x079c15ca) /* 0.475606719 */, 18 }, - /* 6636 */ { MAD_F(0x079c7a03) /* 0.475702296 */, 18 }, - /* 6637 */ { MAD_F(0x079cde3c) /* 0.475797879 */, 18 }, - /* 6638 */ { MAD_F(0x079d4277) /* 0.475893466 */, 18 }, - /* 6639 */ { MAD_F(0x079da6b4) /* 0.475989058 */, 18 }, - - /* 6640 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 18 }, - /* 6641 */ { MAD_F(0x079e6f30) /* 0.476180257 */, 18 }, - /* 6642 */ { MAD_F(0x079ed370) /* 0.476275863 */, 18 }, - /* 6643 */ { MAD_F(0x079f37b2) /* 0.476371475 */, 18 }, - /* 6644 */ { MAD_F(0x079f9bf5) /* 0.476467091 */, 18 }, - /* 6645 */ { MAD_F(0x07a00039) /* 0.476562712 */, 18 }, - /* 6646 */ { MAD_F(0x07a0647e) /* 0.476658338 */, 18 }, - /* 6647 */ { MAD_F(0x07a0c8c5) /* 0.476753968 */, 18 }, - /* 6648 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 18 }, - /* 6649 */ { MAD_F(0x07a19156) /* 0.476945243 */, 18 }, - /* 6650 */ { MAD_F(0x07a1f5a0) /* 0.477040888 */, 18 }, - /* 6651 */ { MAD_F(0x07a259ec) /* 0.477136538 */, 18 }, - /* 6652 */ { MAD_F(0x07a2be39) /* 0.477232193 */, 18 }, - /* 6653 */ { MAD_F(0x07a32287) /* 0.477327852 */, 18 }, - /* 6654 */ { MAD_F(0x07a386d7) /* 0.477423516 */, 18 }, - /* 6655 */ { MAD_F(0x07a3eb28) /* 0.477519185 */, 18 }, - - /* 6656 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 18 }, - /* 6657 */ { MAD_F(0x07a4b3ce) /* 0.477710537 */, 18 }, - /* 6658 */ { MAD_F(0x07a51822) /* 0.477806220 */, 18 }, - /* 6659 */ { MAD_F(0x07a57c78) /* 0.477901908 */, 18 }, - /* 6660 */ { MAD_F(0x07a5e0d0) /* 0.477997601 */, 18 }, - /* 6661 */ { MAD_F(0x07a64528) /* 0.478093299 */, 18 }, - /* 6662 */ { MAD_F(0x07a6a982) /* 0.478189001 */, 18 }, - /* 6663 */ { MAD_F(0x07a70ddd) /* 0.478284708 */, 18 }, - /* 6664 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 18 }, - /* 6665 */ { MAD_F(0x07a7d698) /* 0.478476137 */, 18 }, - /* 6666 */ { MAD_F(0x07a83af7) /* 0.478571858 */, 18 }, - /* 6667 */ { MAD_F(0x07a89f57) /* 0.478667585 */, 18 }, - /* 6668 */ { MAD_F(0x07a903b9) /* 0.478763316 */, 18 }, - /* 6669 */ { MAD_F(0x07a9681c) /* 0.478859052 */, 18 }, - /* 6670 */ { MAD_F(0x07a9cc80) /* 0.478954793 */, 18 }, - /* 6671 */ { MAD_F(0x07aa30e5) /* 0.479050538 */, 18 }, - - /* 6672 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 18 }, - /* 6673 */ { MAD_F(0x07aaf9b4) /* 0.479242043 */, 18 }, - /* 6674 */ { MAD_F(0x07ab5e1e) /* 0.479337803 */, 18 }, - /* 6675 */ { MAD_F(0x07abc288) /* 0.479433568 */, 18 }, - /* 6676 */ { MAD_F(0x07ac26f4) /* 0.479529337 */, 18 }, - /* 6677 */ { MAD_F(0x07ac8b61) /* 0.479625111 */, 18 }, - /* 6678 */ { MAD_F(0x07acefd0) /* 0.479720890 */, 18 }, - /* 6679 */ { MAD_F(0x07ad543f) /* 0.479816674 */, 18 }, - /* 6680 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 18 }, - /* 6681 */ { MAD_F(0x07ae1d23) /* 0.480008256 */, 18 }, - /* 6682 */ { MAD_F(0x07ae8196) /* 0.480104054 */, 18 }, - /* 6683 */ { MAD_F(0x07aee60b) /* 0.480199857 */, 18 }, - /* 6684 */ { MAD_F(0x07af4a81) /* 0.480295664 */, 18 }, - /* 6685 */ { MAD_F(0x07afaef9) /* 0.480391477 */, 18 }, - /* 6686 */ { MAD_F(0x07b01372) /* 0.480487294 */, 18 }, - /* 6687 */ { MAD_F(0x07b077ec) /* 0.480583116 */, 18 }, - - /* 6688 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 18 }, - /* 6689 */ { MAD_F(0x07b140e4) /* 0.480774774 */, 18 }, - /* 6690 */ { MAD_F(0x07b1a561) /* 0.480870611 */, 18 }, - /* 6691 */ { MAD_F(0x07b209e1) /* 0.480966452 */, 18 }, - /* 6692 */ { MAD_F(0x07b26e61) /* 0.481062298 */, 18 }, - /* 6693 */ { MAD_F(0x07b2d2e3) /* 0.481158148 */, 18 }, - /* 6694 */ { MAD_F(0x07b33766) /* 0.481254004 */, 18 }, - /* 6695 */ { MAD_F(0x07b39bea) /* 0.481349864 */, 18 }, - /* 6696 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 18 }, - /* 6697 */ { MAD_F(0x07b464f6) /* 0.481541598 */, 18 }, - /* 6698 */ { MAD_F(0x07b4c97e) /* 0.481637473 */, 18 }, - /* 6699 */ { MAD_F(0x07b52e08) /* 0.481733352 */, 18 }, - /* 6700 */ { MAD_F(0x07b59292) /* 0.481829236 */, 18 }, - /* 6701 */ { MAD_F(0x07b5f71e) /* 0.481925125 */, 18 }, - /* 6702 */ { MAD_F(0x07b65bac) /* 0.482021019 */, 18 }, - /* 6703 */ { MAD_F(0x07b6c03a) /* 0.482116917 */, 18 }, - - /* 6704 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 18 }, - /* 6705 */ { MAD_F(0x07b7895b) /* 0.482308728 */, 18 }, - /* 6706 */ { MAD_F(0x07b7eded) /* 0.482404640 */, 18 }, - /* 6707 */ { MAD_F(0x07b85281) /* 0.482500558 */, 18 }, - /* 6708 */ { MAD_F(0x07b8b716) /* 0.482596480 */, 18 }, - /* 6709 */ { MAD_F(0x07b91bac) /* 0.482692407 */, 18 }, - /* 6710 */ { MAD_F(0x07b98044) /* 0.482788339 */, 18 }, - /* 6711 */ { MAD_F(0x07b9e4dc) /* 0.482884275 */, 18 }, - /* 6712 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 18 }, - /* 6713 */ { MAD_F(0x07baae12) /* 0.483076162 */, 18 }, - /* 6714 */ { MAD_F(0x07bb12ae) /* 0.483172113 */, 18 }, - /* 6715 */ { MAD_F(0x07bb774c) /* 0.483268069 */, 18 }, - /* 6716 */ { MAD_F(0x07bbdbeb) /* 0.483364029 */, 18 }, - /* 6717 */ { MAD_F(0x07bc408c) /* 0.483459994 */, 18 }, - /* 6718 */ { MAD_F(0x07bca52d) /* 0.483555964 */, 18 }, - /* 6719 */ { MAD_F(0x07bd09d0) /* 0.483651939 */, 18 }, - - /* 6720 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 18 }, - /* 6721 */ { MAD_F(0x07bdd31a) /* 0.483843902 */, 18 }, - /* 6722 */ { MAD_F(0x07be37c1) /* 0.483939891 */, 18 }, - /* 6723 */ { MAD_F(0x07be9c69) /* 0.484035885 */, 18 }, - /* 6724 */ { MAD_F(0x07bf0113) /* 0.484131883 */, 18 }, - /* 6725 */ { MAD_F(0x07bf65bd) /* 0.484227886 */, 18 }, - /* 6726 */ { MAD_F(0x07bfca69) /* 0.484323894 */, 18 }, - /* 6727 */ { MAD_F(0x07c02f16) /* 0.484419907 */, 18 }, - /* 6728 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 18 }, - /* 6729 */ { MAD_F(0x07c0f875) /* 0.484611946 */, 18 }, - /* 6730 */ { MAD_F(0x07c15d26) /* 0.484707973 */, 18 }, - /* 6731 */ { MAD_F(0x07c1c1d8) /* 0.484804005 */, 18 }, - /* 6732 */ { MAD_F(0x07c2268b) /* 0.484900041 */, 18 }, - /* 6733 */ { MAD_F(0x07c28b40) /* 0.484996083 */, 18 }, - /* 6734 */ { MAD_F(0x07c2eff6) /* 0.485092128 */, 18 }, - /* 6735 */ { MAD_F(0x07c354ae) /* 0.485188179 */, 18 }, - - /* 6736 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 18 }, - /* 6737 */ { MAD_F(0x07c41e21) /* 0.485380295 */, 18 }, - /* 6738 */ { MAD_F(0x07c482dc) /* 0.485476360 */, 18 }, - /* 6739 */ { MAD_F(0x07c4e798) /* 0.485572430 */, 18 }, - /* 6740 */ { MAD_F(0x07c54c56) /* 0.485668504 */, 18 }, - /* 6741 */ { MAD_F(0x07c5b115) /* 0.485764583 */, 18 }, - /* 6742 */ { MAD_F(0x07c615d6) /* 0.485860667 */, 18 }, - /* 6743 */ { MAD_F(0x07c67a97) /* 0.485956756 */, 18 }, - /* 6744 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 18 }, - /* 6745 */ { MAD_F(0x07c7441e) /* 0.486148948 */, 18 }, - /* 6746 */ { MAD_F(0x07c7a8e4) /* 0.486245051 */, 18 }, - /* 6747 */ { MAD_F(0x07c80daa) /* 0.486341158 */, 18 }, - /* 6748 */ { MAD_F(0x07c87272) /* 0.486437271 */, 18 }, - /* 6749 */ { MAD_F(0x07c8d73c) /* 0.486533388 */, 18 }, - /* 6750 */ { MAD_F(0x07c93c06) /* 0.486629510 */, 18 }, - /* 6751 */ { MAD_F(0x07c9a0d2) /* 0.486725637 */, 18 }, - - /* 6752 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 18 }, - /* 6753 */ { MAD_F(0x07ca6a6d) /* 0.486917905 */, 18 }, - /* 6754 */ { MAD_F(0x07cacf3d) /* 0.487014045 */, 18 }, - /* 6755 */ { MAD_F(0x07cb340e) /* 0.487110191 */, 18 }, - /* 6756 */ { MAD_F(0x07cb98e0) /* 0.487206342 */, 18 }, - /* 6757 */ { MAD_F(0x07cbfdb4) /* 0.487302497 */, 18 }, - /* 6758 */ { MAD_F(0x07cc6288) /* 0.487398657 */, 18 }, - /* 6759 */ { MAD_F(0x07ccc75e) /* 0.487494821 */, 18 }, - /* 6760 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 18 }, - /* 6761 */ { MAD_F(0x07cd910e) /* 0.487687165 */, 18 }, - /* 6762 */ { MAD_F(0x07cdf5e8) /* 0.487783344 */, 18 }, - /* 6763 */ { MAD_F(0x07ce5ac3) /* 0.487879528 */, 18 }, - /* 6764 */ { MAD_F(0x07cebfa0) /* 0.487975716 */, 18 }, - /* 6765 */ { MAD_F(0x07cf247d) /* 0.488071909 */, 18 }, - /* 6766 */ { MAD_F(0x07cf895c) /* 0.488168107 */, 18 }, - /* 6767 */ { MAD_F(0x07cfee3c) /* 0.488264310 */, 18 }, - - /* 6768 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 18 }, - /* 6769 */ { MAD_F(0x07d0b801) /* 0.488456729 */, 18 }, - /* 6770 */ { MAD_F(0x07d11ce5) /* 0.488552946 */, 18 }, - /* 6771 */ { MAD_F(0x07d181ca) /* 0.488649167 */, 18 }, - /* 6772 */ { MAD_F(0x07d1e6b0) /* 0.488745394 */, 18 }, - /* 6773 */ { MAD_F(0x07d24b98) /* 0.488841625 */, 18 }, - /* 6774 */ { MAD_F(0x07d2b081) /* 0.488937860 */, 18 }, - /* 6775 */ { MAD_F(0x07d3156c) /* 0.489034101 */, 18 }, - /* 6776 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 18 }, - /* 6777 */ { MAD_F(0x07d3df44) /* 0.489226596 */, 18 }, - /* 6778 */ { MAD_F(0x07d44432) /* 0.489322851 */, 18 }, - /* 6779 */ { MAD_F(0x07d4a922) /* 0.489419110 */, 18 }, - /* 6780 */ { MAD_F(0x07d50e13) /* 0.489515375 */, 18 }, - /* 6781 */ { MAD_F(0x07d57305) /* 0.489611643 */, 18 }, - /* 6782 */ { MAD_F(0x07d5d7f8) /* 0.489707917 */, 18 }, - /* 6783 */ { MAD_F(0x07d63cec) /* 0.489804195 */, 18 }, - - /* 6784 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 18 }, - /* 6785 */ { MAD_F(0x07d706d9) /* 0.489996766 */, 18 }, - /* 6786 */ { MAD_F(0x07d76bd2) /* 0.490093059 */, 18 }, - /* 6787 */ { MAD_F(0x07d7d0cb) /* 0.490189356 */, 18 }, - /* 6788 */ { MAD_F(0x07d835c6) /* 0.490285658 */, 18 }, - /* 6789 */ { MAD_F(0x07d89ac2) /* 0.490381965 */, 18 }, - /* 6790 */ { MAD_F(0x07d8ffc0) /* 0.490478277 */, 18 }, - /* 6791 */ { MAD_F(0x07d964be) /* 0.490574593 */, 18 }, - /* 6792 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 18 }, - /* 6793 */ { MAD_F(0x07da2ebf) /* 0.490767239 */, 18 }, - /* 6794 */ { MAD_F(0x07da93c2) /* 0.490863570 */, 18 }, - /* 6795 */ { MAD_F(0x07daf8c6) /* 0.490959905 */, 18 }, - /* 6796 */ { MAD_F(0x07db5dcb) /* 0.491056245 */, 18 }, - /* 6797 */ { MAD_F(0x07dbc2d1) /* 0.491152589 */, 18 }, - /* 6798 */ { MAD_F(0x07dc27d9) /* 0.491248939 */, 18 }, - /* 6799 */ { MAD_F(0x07dc8ce1) /* 0.491345293 */, 18 }, - - /* 6800 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 18 }, - /* 6801 */ { MAD_F(0x07dd56f7) /* 0.491538015 */, 18 }, - /* 6802 */ { MAD_F(0x07ddbc04) /* 0.491634383 */, 18 }, - /* 6803 */ { MAD_F(0x07de2111) /* 0.491730756 */, 18 }, - /* 6804 */ { MAD_F(0x07de8621) /* 0.491827134 */, 18 }, - /* 6805 */ { MAD_F(0x07deeb31) /* 0.491923516 */, 18 }, - /* 6806 */ { MAD_F(0x07df5043) /* 0.492019903 */, 18 }, - /* 6807 */ { MAD_F(0x07dfb556) /* 0.492116295 */, 18 }, - /* 6808 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 18 }, - /* 6809 */ { MAD_F(0x07e07f80) /* 0.492309093 */, 18 }, - /* 6810 */ { MAD_F(0x07e0e496) /* 0.492405499 */, 18 }, - /* 6811 */ { MAD_F(0x07e149ae) /* 0.492501909 */, 18 }, - /* 6812 */ { MAD_F(0x07e1aec8) /* 0.492598325 */, 18 }, - /* 6813 */ { MAD_F(0x07e213e2) /* 0.492694745 */, 18 }, - /* 6814 */ { MAD_F(0x07e278fe) /* 0.492791170 */, 18 }, - /* 6815 */ { MAD_F(0x07e2de1b) /* 0.492887599 */, 18 }, - - /* 6816 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 18 }, - /* 6817 */ { MAD_F(0x07e3a859) /* 0.493080472 */, 18 }, - /* 6818 */ { MAD_F(0x07e40d7a) /* 0.493176916 */, 18 }, - /* 6819 */ { MAD_F(0x07e4729c) /* 0.493273365 */, 18 }, - /* 6820 */ { MAD_F(0x07e4d7c0) /* 0.493369818 */, 18 }, - /* 6821 */ { MAD_F(0x07e53ce4) /* 0.493466275 */, 18 }, - /* 6822 */ { MAD_F(0x07e5a20a) /* 0.493562738 */, 18 }, - /* 6823 */ { MAD_F(0x07e60732) /* 0.493659205 */, 18 }, - /* 6824 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 18 }, - /* 6825 */ { MAD_F(0x07e6d184) /* 0.493852154 */, 18 }, - /* 6826 */ { MAD_F(0x07e736af) /* 0.493948635 */, 18 }, - /* 6827 */ { MAD_F(0x07e79bdb) /* 0.494045122 */, 18 }, - /* 6828 */ { MAD_F(0x07e80109) /* 0.494141612 */, 18 }, - /* 6829 */ { MAD_F(0x07e86638) /* 0.494238108 */, 18 }, - /* 6830 */ { MAD_F(0x07e8cb68) /* 0.494334608 */, 18 }, - /* 6831 */ { MAD_F(0x07e93099) /* 0.494431113 */, 18 }, - - /* 6832 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 18 }, - /* 6833 */ { MAD_F(0x07e9fb00) /* 0.494624137 */, 18 }, - /* 6834 */ { MAD_F(0x07ea6035) /* 0.494720656 */, 18 }, - /* 6835 */ { MAD_F(0x07eac56b) /* 0.494817180 */, 18 }, - /* 6836 */ { MAD_F(0x07eb2aa3) /* 0.494913709 */, 18 }, - /* 6837 */ { MAD_F(0x07eb8fdc) /* 0.495010242 */, 18 }, - /* 6838 */ { MAD_F(0x07ebf516) /* 0.495106780 */, 18 }, - /* 6839 */ { MAD_F(0x07ec5a51) /* 0.495203322 */, 18 }, - /* 6840 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 18 }, - /* 6841 */ { MAD_F(0x07ed24cc) /* 0.495396422 */, 18 }, - /* 6842 */ { MAD_F(0x07ed8a0b) /* 0.495492978 */, 18 }, - /* 6843 */ { MAD_F(0x07edef4c) /* 0.495589540 */, 18 }, - /* 6844 */ { MAD_F(0x07ee548e) /* 0.495686106 */, 18 }, - /* 6845 */ { MAD_F(0x07eeb9d1) /* 0.495782677 */, 18 }, - /* 6846 */ { MAD_F(0x07ef1f15) /* 0.495879252 */, 18 }, - /* 6847 */ { MAD_F(0x07ef845b) /* 0.495975833 */, 18 }, - - /* 6848 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 18 }, - /* 6849 */ { MAD_F(0x07f04ee9) /* 0.496169007 */, 18 }, - /* 6850 */ { MAD_F(0x07f0b433) /* 0.496265602 */, 18 }, - /* 6851 */ { MAD_F(0x07f1197d) /* 0.496362201 */, 18 }, - /* 6852 */ { MAD_F(0x07f17ec9) /* 0.496458804 */, 18 }, - /* 6853 */ { MAD_F(0x07f1e416) /* 0.496555413 */, 18 }, - /* 6854 */ { MAD_F(0x07f24965) /* 0.496652026 */, 18 }, - /* 6855 */ { MAD_F(0x07f2aeb5) /* 0.496748644 */, 18 }, - /* 6856 */ { MAD_F(0x07f31405) /* 0.496845266 */, 18 }, - /* 6857 */ { MAD_F(0x07f37958) /* 0.496941894 */, 18 }, - /* 6858 */ { MAD_F(0x07f3deab) /* 0.497038526 */, 18 }, - /* 6859 */ { MAD_F(0x07f44400) /* 0.497135162 */, 18 }, - /* 6860 */ { MAD_F(0x07f4a956) /* 0.497231804 */, 18 }, - /* 6861 */ { MAD_F(0x07f50ead) /* 0.497328450 */, 18 }, - /* 6862 */ { MAD_F(0x07f57405) /* 0.497425100 */, 18 }, - /* 6863 */ { MAD_F(0x07f5d95f) /* 0.497521756 */, 18 }, - - /* 6864 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 18 }, - /* 6865 */ { MAD_F(0x07f6a416) /* 0.497715081 */, 18 }, - /* 6866 */ { MAD_F(0x07f70974) /* 0.497811750 */, 18 }, - /* 6867 */ { MAD_F(0x07f76ed3) /* 0.497908425 */, 18 }, - /* 6868 */ { MAD_F(0x07f7d433) /* 0.498005103 */, 18 }, - /* 6869 */ { MAD_F(0x07f83994) /* 0.498101787 */, 18 }, - /* 6870 */ { MAD_F(0x07f89ef7) /* 0.498198475 */, 18 }, - /* 6871 */ { MAD_F(0x07f9045a) /* 0.498295168 */, 18 }, - /* 6872 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 18 }, - /* 6873 */ { MAD_F(0x07f9cf26) /* 0.498488568 */, 18 }, - /* 6874 */ { MAD_F(0x07fa348e) /* 0.498585275 */, 18 }, - /* 6875 */ { MAD_F(0x07fa99f6) /* 0.498681987 */, 18 }, - /* 6876 */ { MAD_F(0x07faff60) /* 0.498778704 */, 18 }, - /* 6877 */ { MAD_F(0x07fb64cc) /* 0.498875425 */, 18 }, - /* 6878 */ { MAD_F(0x07fbca38) /* 0.498972150 */, 18 }, - /* 6879 */ { MAD_F(0x07fc2fa6) /* 0.499068881 */, 18 }, - - /* 6880 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 18 }, - /* 6881 */ { MAD_F(0x07fcfa86) /* 0.499262356 */, 18 }, - /* 6882 */ { MAD_F(0x07fd5ff8) /* 0.499359101 */, 18 }, - /* 6883 */ { MAD_F(0x07fdc56b) /* 0.499455850 */, 18 }, - /* 6884 */ { MAD_F(0x07fe2adf) /* 0.499552604 */, 18 }, - /* 6885 */ { MAD_F(0x07fe9054) /* 0.499649362 */, 18 }, - /* 6886 */ { MAD_F(0x07fef5cb) /* 0.499746126 */, 18 }, - /* 6887 */ { MAD_F(0x07ff5b43) /* 0.499842894 */, 18 }, - /* 6888 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 18 }, - /* 6889 */ { MAD_F(0x0400131b) /* 0.250018222 */, 19 }, - /* 6890 */ { MAD_F(0x040045d9) /* 0.250066613 */, 19 }, - /* 6891 */ { MAD_F(0x04007897) /* 0.250115006 */, 19 }, - /* 6892 */ { MAD_F(0x0400ab57) /* 0.250163402 */, 19 }, - /* 6893 */ { MAD_F(0x0400de16) /* 0.250211800 */, 19 }, - /* 6894 */ { MAD_F(0x040110d7) /* 0.250260200 */, 19 }, - /* 6895 */ { MAD_F(0x04014398) /* 0.250308603 */, 19 }, - - /* 6896 */ { MAD_F(0x04017659) /* 0.250357008 */, 19 }, - /* 6897 */ { MAD_F(0x0401a91c) /* 0.250405415 */, 19 }, - /* 6898 */ { MAD_F(0x0401dbdf) /* 0.250453825 */, 19 }, - /* 6899 */ { MAD_F(0x04020ea2) /* 0.250502237 */, 19 }, - /* 6900 */ { MAD_F(0x04024166) /* 0.250550652 */, 19 }, - /* 6901 */ { MAD_F(0x0402742b) /* 0.250599068 */, 19 }, - /* 6902 */ { MAD_F(0x0402a6f0) /* 0.250647488 */, 19 }, - /* 6903 */ { MAD_F(0x0402d9b6) /* 0.250695909 */, 19 }, - /* 6904 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 19 }, - /* 6905 */ { MAD_F(0x04033f44) /* 0.250792759 */, 19 }, - /* 6906 */ { MAD_F(0x0403720c) /* 0.250841187 */, 19 }, - /* 6907 */ { MAD_F(0x0403a4d5) /* 0.250889618 */, 19 }, - /* 6908 */ { MAD_F(0x0403d79e) /* 0.250938051 */, 19 }, - /* 6909 */ { MAD_F(0x04040a68) /* 0.250986487 */, 19 }, - /* 6910 */ { MAD_F(0x04043d32) /* 0.251034924 */, 19 }, - /* 6911 */ { MAD_F(0x04046ffd) /* 0.251083365 */, 19 }, - - /* 6912 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 19 }, - /* 6913 */ { MAD_F(0x0404d595) /* 0.251180252 */, 19 }, - /* 6914 */ { MAD_F(0x04050862) /* 0.251228699 */, 19 }, - /* 6915 */ { MAD_F(0x04053b30) /* 0.251277148 */, 19 }, - /* 6916 */ { MAD_F(0x04056dfe) /* 0.251325600 */, 19 }, - /* 6917 */ { MAD_F(0x0405a0cd) /* 0.251374054 */, 19 }, - /* 6918 */ { MAD_F(0x0405d39c) /* 0.251422511 */, 19 }, - /* 6919 */ { MAD_F(0x0406066c) /* 0.251470970 */, 19 }, - /* 6920 */ { MAD_F(0x0406393d) /* 0.251519431 */, 19 }, - /* 6921 */ { MAD_F(0x04066c0e) /* 0.251567894 */, 19 }, - /* 6922 */ { MAD_F(0x04069ee0) /* 0.251616360 */, 19 }, - /* 6923 */ { MAD_F(0x0406d1b3) /* 0.251664828 */, 19 }, - /* 6924 */ { MAD_F(0x04070486) /* 0.251713299 */, 19 }, - /* 6925 */ { MAD_F(0x0407375a) /* 0.251761772 */, 19 }, - /* 6926 */ { MAD_F(0x04076a2e) /* 0.251810247 */, 19 }, - /* 6927 */ { MAD_F(0x04079d03) /* 0.251858724 */, 19 }, - - /* 6928 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 19 }, - /* 6929 */ { MAD_F(0x040802af) /* 0.251955686 */, 19 }, - /* 6930 */ { MAD_F(0x04083586) /* 0.252004171 */, 19 }, - /* 6931 */ { MAD_F(0x0408685e) /* 0.252052658 */, 19 }, - /* 6932 */ { MAD_F(0x04089b36) /* 0.252101147 */, 19 }, - /* 6933 */ { MAD_F(0x0408ce0f) /* 0.252149638 */, 19 }, - /* 6934 */ { MAD_F(0x040900e8) /* 0.252198132 */, 19 }, - /* 6935 */ { MAD_F(0x040933c2) /* 0.252246628 */, 19 }, - /* 6936 */ { MAD_F(0x0409669d) /* 0.252295127 */, 19 }, - /* 6937 */ { MAD_F(0x04099978) /* 0.252343627 */, 19 }, - /* 6938 */ { MAD_F(0x0409cc54) /* 0.252392131 */, 19 }, - /* 6939 */ { MAD_F(0x0409ff31) /* 0.252440636 */, 19 }, - /* 6940 */ { MAD_F(0x040a320e) /* 0.252489144 */, 19 }, - /* 6941 */ { MAD_F(0x040a64ec) /* 0.252537654 */, 19 }, - /* 6942 */ { MAD_F(0x040a97cb) /* 0.252586166 */, 19 }, - /* 6943 */ { MAD_F(0x040acaaa) /* 0.252634681 */, 19 }, - - /* 6944 */ { MAD_F(0x040afd89) /* 0.252683198 */, 19 }, - /* 6945 */ { MAD_F(0x040b306a) /* 0.252731718 */, 19 }, - /* 6946 */ { MAD_F(0x040b634b) /* 0.252780240 */, 19 }, - /* 6947 */ { MAD_F(0x040b962c) /* 0.252828764 */, 19 }, - /* 6948 */ { MAD_F(0x040bc90e) /* 0.252877290 */, 19 }, - /* 6949 */ { MAD_F(0x040bfbf1) /* 0.252925819 */, 19 }, - /* 6950 */ { MAD_F(0x040c2ed5) /* 0.252974350 */, 19 }, - /* 6951 */ { MAD_F(0x040c61b9) /* 0.253022883 */, 19 }, - /* 6952 */ { MAD_F(0x040c949e) /* 0.253071419 */, 19 }, - /* 6953 */ { MAD_F(0x040cc783) /* 0.253119957 */, 19 }, - /* 6954 */ { MAD_F(0x040cfa69) /* 0.253168498 */, 19 }, - /* 6955 */ { MAD_F(0x040d2d4f) /* 0.253217040 */, 19 }, - /* 6956 */ { MAD_F(0x040d6037) /* 0.253265585 */, 19 }, - /* 6957 */ { MAD_F(0x040d931e) /* 0.253314133 */, 19 }, - /* 6958 */ { MAD_F(0x040dc607) /* 0.253362682 */, 19 }, - /* 6959 */ { MAD_F(0x040df8f0) /* 0.253411234 */, 19 }, - - /* 6960 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 19 }, - /* 6961 */ { MAD_F(0x040e5ec4) /* 0.253508345 */, 19 }, - /* 6962 */ { MAD_F(0x040e91af) /* 0.253556904 */, 19 }, - /* 6963 */ { MAD_F(0x040ec49b) /* 0.253605466 */, 19 }, - /* 6964 */ { MAD_F(0x040ef787) /* 0.253654029 */, 19 }, - /* 6965 */ { MAD_F(0x040f2a74) /* 0.253702595 */, 19 }, - /* 6966 */ { MAD_F(0x040f5d61) /* 0.253751164 */, 19 }, - /* 6967 */ { MAD_F(0x040f904f) /* 0.253799734 */, 19 }, - /* 6968 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 19 }, - /* 6969 */ { MAD_F(0x040ff62d) /* 0.253896883 */, 19 }, - /* 6970 */ { MAD_F(0x0410291d) /* 0.253945460 */, 19 }, - /* 6971 */ { MAD_F(0x04105c0e) /* 0.253994040 */, 19 }, - /* 6972 */ { MAD_F(0x04108eff) /* 0.254042622 */, 19 }, - /* 6973 */ { MAD_F(0x0410c1f1) /* 0.254091207 */, 19 }, - /* 6974 */ { MAD_F(0x0410f4e3) /* 0.254139794 */, 19 }, - /* 6975 */ { MAD_F(0x041127d6) /* 0.254188383 */, 19 }, - - /* 6976 */ { MAD_F(0x04115aca) /* 0.254236974 */, 19 }, - /* 6977 */ { MAD_F(0x04118dbe) /* 0.254285568 */, 19 }, - /* 6978 */ { MAD_F(0x0411c0b3) /* 0.254334165 */, 19 }, - /* 6979 */ { MAD_F(0x0411f3a9) /* 0.254382763 */, 19 }, - /* 6980 */ { MAD_F(0x0412269f) /* 0.254431364 */, 19 }, - /* 6981 */ { MAD_F(0x04125996) /* 0.254479967 */, 19 }, - /* 6982 */ { MAD_F(0x04128c8d) /* 0.254528572 */, 19 }, - /* 6983 */ { MAD_F(0x0412bf85) /* 0.254577180 */, 19 }, - /* 6984 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 19 }, - /* 6985 */ { MAD_F(0x04132577) /* 0.254674403 */, 19 }, - /* 6986 */ { MAD_F(0x04135871) /* 0.254723017 */, 19 }, - /* 6987 */ { MAD_F(0x04138b6c) /* 0.254771635 */, 19 }, - /* 6988 */ { MAD_F(0x0413be67) /* 0.254820254 */, 19 }, - /* 6989 */ { MAD_F(0x0413f163) /* 0.254868876 */, 19 }, - /* 6990 */ { MAD_F(0x0414245f) /* 0.254917500 */, 19 }, - /* 6991 */ { MAD_F(0x0414575c) /* 0.254966126 */, 19 }, - - /* 6992 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 19 }, - /* 6993 */ { MAD_F(0x0414bd58) /* 0.255063386 */, 19 }, - /* 6994 */ { MAD_F(0x0414f057) /* 0.255112019 */, 19 }, - /* 6995 */ { MAD_F(0x04152356) /* 0.255160655 */, 19 }, - /* 6996 */ { MAD_F(0x04155657) /* 0.255209292 */, 19 }, - /* 6997 */ { MAD_F(0x04158957) /* 0.255257933 */, 19 }, - /* 6998 */ { MAD_F(0x0415bc59) /* 0.255306575 */, 19 }, - /* 6999 */ { MAD_F(0x0415ef5b) /* 0.255355220 */, 19 }, - /* 7000 */ { MAD_F(0x0416225d) /* 0.255403867 */, 19 }, - /* 7001 */ { MAD_F(0x04165561) /* 0.255452517 */, 19 }, - /* 7002 */ { MAD_F(0x04168864) /* 0.255501169 */, 19 }, - /* 7003 */ { MAD_F(0x0416bb69) /* 0.255549823 */, 19 }, - /* 7004 */ { MAD_F(0x0416ee6e) /* 0.255598479 */, 19 }, - /* 7005 */ { MAD_F(0x04172174) /* 0.255647138 */, 19 }, - /* 7006 */ { MAD_F(0x0417547a) /* 0.255695799 */, 19 }, - /* 7007 */ { MAD_F(0x04178781) /* 0.255744463 */, 19 }, - - /* 7008 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 19 }, - /* 7009 */ { MAD_F(0x0417ed91) /* 0.255841796 */, 19 }, - /* 7010 */ { MAD_F(0x0418209a) /* 0.255890467 */, 19 }, - /* 7011 */ { MAD_F(0x041853a3) /* 0.255939139 */, 19 }, - /* 7012 */ { MAD_F(0x041886ad) /* 0.255987814 */, 19 }, - /* 7013 */ { MAD_F(0x0418b9b8) /* 0.256036492 */, 19 }, - /* 7014 */ { MAD_F(0x0418ecc3) /* 0.256085171 */, 19 }, - /* 7015 */ { MAD_F(0x04191fcf) /* 0.256133853 */, 19 }, - /* 7016 */ { MAD_F(0x041952dc) /* 0.256182537 */, 19 }, - /* 7017 */ { MAD_F(0x041985e9) /* 0.256231224 */, 19 }, - /* 7018 */ { MAD_F(0x0419b8f7) /* 0.256279913 */, 19 }, - /* 7019 */ { MAD_F(0x0419ec05) /* 0.256328604 */, 19 }, - /* 7020 */ { MAD_F(0x041a1f15) /* 0.256377297 */, 19 }, - /* 7021 */ { MAD_F(0x041a5224) /* 0.256425993 */, 19 }, - /* 7022 */ { MAD_F(0x041a8534) /* 0.256474691 */, 19 }, - /* 7023 */ { MAD_F(0x041ab845) /* 0.256523392 */, 19 }, - - /* 7024 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 19 }, - /* 7025 */ { MAD_F(0x041b1e69) /* 0.256620800 */, 19 }, - /* 7026 */ { MAD_F(0x041b517c) /* 0.256669507 */, 19 }, - /* 7027 */ { MAD_F(0x041b848f) /* 0.256718217 */, 19 }, - /* 7028 */ { MAD_F(0x041bb7a3) /* 0.256766929 */, 19 }, - /* 7029 */ { MAD_F(0x041beab8) /* 0.256815643 */, 19 }, - /* 7030 */ { MAD_F(0x041c1dcd) /* 0.256864359 */, 19 }, - /* 7031 */ { MAD_F(0x041c50e3) /* 0.256913078 */, 19 }, - /* 7032 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 19 }, - /* 7033 */ { MAD_F(0x041cb711) /* 0.257010523 */, 19 }, - /* 7034 */ { MAD_F(0x041cea28) /* 0.257059249 */, 19 }, - /* 7035 */ { MAD_F(0x041d1d41) /* 0.257107977 */, 19 }, - /* 7036 */ { MAD_F(0x041d505a) /* 0.257156708 */, 19 }, - /* 7037 */ { MAD_F(0x041d8373) /* 0.257205440 */, 19 }, - /* 7038 */ { MAD_F(0x041db68e) /* 0.257254175 */, 19 }, - /* 7039 */ { MAD_F(0x041de9a8) /* 0.257302913 */, 19 }, - - /* 7040 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 19 }, - /* 7041 */ { MAD_F(0x041e4fe0) /* 0.257400394 */, 19 }, - /* 7042 */ { MAD_F(0x041e82fd) /* 0.257449139 */, 19 }, - /* 7043 */ { MAD_F(0x041eb61a) /* 0.257497885 */, 19 }, - /* 7044 */ { MAD_F(0x041ee938) /* 0.257546634 */, 19 }, - /* 7045 */ { MAD_F(0x041f1c57) /* 0.257595386 */, 19 }, - /* 7046 */ { MAD_F(0x041f4f76) /* 0.257644139 */, 19 }, - /* 7047 */ { MAD_F(0x041f8296) /* 0.257692895 */, 19 }, - /* 7048 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 19 }, - /* 7049 */ { MAD_F(0x041fe8d7) /* 0.257790414 */, 19 }, - /* 7050 */ { MAD_F(0x04201bf9) /* 0.257839176 */, 19 }, - /* 7051 */ { MAD_F(0x04204f1b) /* 0.257887941 */, 19 }, - /* 7052 */ { MAD_F(0x0420823e) /* 0.257936709 */, 19 }, - /* 7053 */ { MAD_F(0x0420b561) /* 0.257985478 */, 19 }, - /* 7054 */ { MAD_F(0x0420e885) /* 0.258034250 */, 19 }, - /* 7055 */ { MAD_F(0x04211baa) /* 0.258083025 */, 19 }, - - /* 7056 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 19 }, - /* 7057 */ { MAD_F(0x042181f6) /* 0.258180580 */, 19 }, - /* 7058 */ { MAD_F(0x0421b51c) /* 0.258229361 */, 19 }, - /* 7059 */ { MAD_F(0x0421e843) /* 0.258278145 */, 19 }, - /* 7060 */ { MAD_F(0x04221b6b) /* 0.258326931 */, 19 }, - /* 7061 */ { MAD_F(0x04224e94) /* 0.258375719 */, 19 }, - /* 7062 */ { MAD_F(0x042281bd) /* 0.258424509 */, 19 }, - /* 7063 */ { MAD_F(0x0422b4e6) /* 0.258473302 */, 19 }, - /* 7064 */ { MAD_F(0x0422e811) /* 0.258522097 */, 19 }, - /* 7065 */ { MAD_F(0x04231b3c) /* 0.258570894 */, 19 }, - /* 7066 */ { MAD_F(0x04234e67) /* 0.258619694 */, 19 }, - /* 7067 */ { MAD_F(0x04238193) /* 0.258668496 */, 19 }, - /* 7068 */ { MAD_F(0x0423b4c0) /* 0.258717300 */, 19 }, - /* 7069 */ { MAD_F(0x0423e7ee) /* 0.258766106 */, 19 }, - /* 7070 */ { MAD_F(0x04241b1c) /* 0.258814915 */, 19 }, - /* 7071 */ { MAD_F(0x04244e4a) /* 0.258863726 */, 19 }, - - /* 7072 */ { MAD_F(0x04248179) /* 0.258912540 */, 19 }, - /* 7073 */ { MAD_F(0x0424b4a9) /* 0.258961356 */, 19 }, - /* 7074 */ { MAD_F(0x0424e7da) /* 0.259010174 */, 19 }, - /* 7075 */ { MAD_F(0x04251b0b) /* 0.259058994 */, 19 }, - /* 7076 */ { MAD_F(0x04254e3d) /* 0.259107817 */, 19 }, - /* 7077 */ { MAD_F(0x0425816f) /* 0.259156642 */, 19 }, - /* 7078 */ { MAD_F(0x0425b4a2) /* 0.259205469 */, 19 }, - /* 7079 */ { MAD_F(0x0425e7d6) /* 0.259254298 */, 19 }, - /* 7080 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 19 }, - /* 7081 */ { MAD_F(0x04264e3f) /* 0.259351964 */, 19 }, - /* 7082 */ { MAD_F(0x04268174) /* 0.259400801 */, 19 }, - /* 7083 */ { MAD_F(0x0426b4aa) /* 0.259449639 */, 19 }, - /* 7084 */ { MAD_F(0x0426e7e1) /* 0.259498480 */, 19 }, - /* 7085 */ { MAD_F(0x04271b18) /* 0.259547324 */, 19 }, - /* 7086 */ { MAD_F(0x04274e50) /* 0.259596169 */, 19 }, - /* 7087 */ { MAD_F(0x04278188) /* 0.259645017 */, 19 }, - - /* 7088 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 19 }, - /* 7089 */ { MAD_F(0x0427e7fb) /* 0.259742720 */, 19 }, - /* 7090 */ { MAD_F(0x04281b36) /* 0.259791575 */, 19 }, - /* 7091 */ { MAD_F(0x04284e71) /* 0.259840432 */, 19 }, - /* 7092 */ { MAD_F(0x042881ac) /* 0.259889291 */, 19 }, - /* 7093 */ { MAD_F(0x0428b4e8) /* 0.259938153 */, 19 }, - /* 7094 */ { MAD_F(0x0428e825) /* 0.259987017 */, 19 }, - /* 7095 */ { MAD_F(0x04291b63) /* 0.260035883 */, 19 }, - /* 7096 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 19 }, - /* 7097 */ { MAD_F(0x042981df) /* 0.260133623 */, 19 }, - /* 7098 */ { MAD_F(0x0429b51f) /* 0.260182496 */, 19 }, - /* 7099 */ { MAD_F(0x0429e85f) /* 0.260231372 */, 19 }, - /* 7100 */ { MAD_F(0x042a1b9f) /* 0.260280249 */, 19 }, - /* 7101 */ { MAD_F(0x042a4ee0) /* 0.260329129 */, 19 }, - /* 7102 */ { MAD_F(0x042a8222) /* 0.260378012 */, 19 }, - /* 7103 */ { MAD_F(0x042ab564) /* 0.260426896 */, 19 }, - - /* 7104 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 19 }, - /* 7105 */ { MAD_F(0x042b1beb) /* 0.260524673 */, 19 }, - /* 7106 */ { MAD_F(0x042b4f2f) /* 0.260573564 */, 19 }, - /* 7107 */ { MAD_F(0x042b8274) /* 0.260622458 */, 19 }, - /* 7108 */ { MAD_F(0x042bb5ba) /* 0.260671354 */, 19 }, - /* 7109 */ { MAD_F(0x042be900) /* 0.260720252 */, 19 }, - /* 7110 */ { MAD_F(0x042c1c46) /* 0.260769153 */, 19 }, - /* 7111 */ { MAD_F(0x042c4f8e) /* 0.260818056 */, 19 }, - /* 7112 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 19 }, - /* 7113 */ { MAD_F(0x042cb61e) /* 0.260915869 */, 19 }, - /* 7114 */ { MAD_F(0x042ce967) /* 0.260964779 */, 19 }, - /* 7115 */ { MAD_F(0x042d1cb1) /* 0.261013691 */, 19 }, - /* 7116 */ { MAD_F(0x042d4ffb) /* 0.261062606 */, 19 }, - /* 7117 */ { MAD_F(0x042d8346) /* 0.261111522 */, 19 }, - /* 7118 */ { MAD_F(0x042db692) /* 0.261160441 */, 19 }, - /* 7119 */ { MAD_F(0x042de9de) /* 0.261209363 */, 19 }, - - /* 7120 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 19 }, - /* 7121 */ { MAD_F(0x042e5078) /* 0.261307212 */, 19 }, - /* 7122 */ { MAD_F(0x042e83c6) /* 0.261356140 */, 19 }, - /* 7123 */ { MAD_F(0x042eb715) /* 0.261405071 */, 19 }, - /* 7124 */ { MAD_F(0x042eea64) /* 0.261454004 */, 19 }, - /* 7125 */ { MAD_F(0x042f1db4) /* 0.261502939 */, 19 }, - /* 7126 */ { MAD_F(0x042f5105) /* 0.261551876 */, 19 }, - /* 7127 */ { MAD_F(0x042f8456) /* 0.261600816 */, 19 }, - /* 7128 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 19 }, - /* 7129 */ { MAD_F(0x042feafa) /* 0.261698702 */, 19 }, - /* 7130 */ { MAD_F(0x04301e4d) /* 0.261747649 */, 19 }, - /* 7131 */ { MAD_F(0x043051a1) /* 0.261796597 */, 19 }, - /* 7132 */ { MAD_F(0x043084f5) /* 0.261845548 */, 19 }, - /* 7133 */ { MAD_F(0x0430b84a) /* 0.261894502 */, 19 }, - /* 7134 */ { MAD_F(0x0430eb9f) /* 0.261943458 */, 19 }, - /* 7135 */ { MAD_F(0x04311ef5) /* 0.261992416 */, 19 }, - - /* 7136 */ { MAD_F(0x0431524c) /* 0.262041376 */, 19 }, - /* 7137 */ { MAD_F(0x043185a3) /* 0.262090338 */, 19 }, - /* 7138 */ { MAD_F(0x0431b8fb) /* 0.262139303 */, 19 }, - /* 7139 */ { MAD_F(0x0431ec54) /* 0.262188270 */, 19 }, - /* 7140 */ { MAD_F(0x04321fad) /* 0.262237240 */, 19 }, - /* 7141 */ { MAD_F(0x04325306) /* 0.262286211 */, 19 }, - /* 7142 */ { MAD_F(0x04328661) /* 0.262335185 */, 19 }, - /* 7143 */ { MAD_F(0x0432b9bc) /* 0.262384162 */, 19 }, - /* 7144 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 19 }, - /* 7145 */ { MAD_F(0x04332074) /* 0.262482121 */, 19 }, - /* 7146 */ { MAD_F(0x043353d0) /* 0.262531104 */, 19 }, - /* 7147 */ { MAD_F(0x0433872e) /* 0.262580089 */, 19 }, - /* 7148 */ { MAD_F(0x0433ba8c) /* 0.262629077 */, 19 }, - /* 7149 */ { MAD_F(0x0433edea) /* 0.262678067 */, 19 }, - /* 7150 */ { MAD_F(0x0434214a) /* 0.262727059 */, 19 }, - /* 7151 */ { MAD_F(0x043454aa) /* 0.262776054 */, 19 }, - - /* 7152 */ { MAD_F(0x0434880a) /* 0.262825051 */, 19 }, - /* 7153 */ { MAD_F(0x0434bb6b) /* 0.262874050 */, 19 }, - /* 7154 */ { MAD_F(0x0434eecd) /* 0.262923051 */, 19 }, - /* 7155 */ { MAD_F(0x0435222f) /* 0.262972055 */, 19 }, - /* 7156 */ { MAD_F(0x04355592) /* 0.263021061 */, 19 }, - /* 7157 */ { MAD_F(0x043588f6) /* 0.263070069 */, 19 }, - /* 7158 */ { MAD_F(0x0435bc5a) /* 0.263119079 */, 19 }, - /* 7159 */ { MAD_F(0x0435efbf) /* 0.263168092 */, 19 }, - /* 7160 */ { MAD_F(0x04362324) /* 0.263217107 */, 19 }, - /* 7161 */ { MAD_F(0x0436568a) /* 0.263266125 */, 19 }, - /* 7162 */ { MAD_F(0x043689f1) /* 0.263315144 */, 19 }, - /* 7163 */ { MAD_F(0x0436bd58) /* 0.263364166 */, 19 }, - /* 7164 */ { MAD_F(0x0436f0c0) /* 0.263413191 */, 19 }, - /* 7165 */ { MAD_F(0x04372428) /* 0.263462217 */, 19 }, - /* 7166 */ { MAD_F(0x04375791) /* 0.263511246 */, 19 }, - /* 7167 */ { MAD_F(0x04378afb) /* 0.263560277 */, 19 }, - - /* 7168 */ { MAD_F(0x0437be65) /* 0.263609310 */, 19 }, - /* 7169 */ { MAD_F(0x0437f1d0) /* 0.263658346 */, 19 }, - /* 7170 */ { MAD_F(0x0438253c) /* 0.263707384 */, 19 }, - /* 7171 */ { MAD_F(0x043858a8) /* 0.263756424 */, 19 }, - /* 7172 */ { MAD_F(0x04388c14) /* 0.263805466 */, 19 }, - /* 7173 */ { MAD_F(0x0438bf82) /* 0.263854511 */, 19 }, - /* 7174 */ { MAD_F(0x0438f2f0) /* 0.263903558 */, 19 }, - /* 7175 */ { MAD_F(0x0439265e) /* 0.263952607 */, 19 }, - /* 7176 */ { MAD_F(0x043959cd) /* 0.264001659 */, 19 }, - /* 7177 */ { MAD_F(0x04398d3d) /* 0.264050713 */, 19 }, - /* 7178 */ { MAD_F(0x0439c0ae) /* 0.264099769 */, 19 }, - /* 7179 */ { MAD_F(0x0439f41f) /* 0.264148827 */, 19 }, - /* 7180 */ { MAD_F(0x043a2790) /* 0.264197888 */, 19 }, - /* 7181 */ { MAD_F(0x043a5b02) /* 0.264246951 */, 19 }, - /* 7182 */ { MAD_F(0x043a8e75) /* 0.264296016 */, 19 }, - /* 7183 */ { MAD_F(0x043ac1e9) /* 0.264345084 */, 19 }, - - /* 7184 */ { MAD_F(0x043af55d) /* 0.264394153 */, 19 }, - /* 7185 */ { MAD_F(0x043b28d2) /* 0.264443225 */, 19 }, - /* 7186 */ { MAD_F(0x043b5c47) /* 0.264492300 */, 19 }, - /* 7187 */ { MAD_F(0x043b8fbd) /* 0.264541376 */, 19 }, - /* 7188 */ { MAD_F(0x043bc333) /* 0.264590455 */, 19 }, - /* 7189 */ { MAD_F(0x043bf6aa) /* 0.264639536 */, 19 }, - /* 7190 */ { MAD_F(0x043c2a22) /* 0.264688620 */, 19 }, - /* 7191 */ { MAD_F(0x043c5d9a) /* 0.264737706 */, 19 }, - /* 7192 */ { MAD_F(0x043c9113) /* 0.264786794 */, 19 }, - /* 7193 */ { MAD_F(0x043cc48d) /* 0.264835884 */, 19 }, - /* 7194 */ { MAD_F(0x043cf807) /* 0.264884976 */, 19 }, - /* 7195 */ { MAD_F(0x043d2b82) /* 0.264934071 */, 19 }, - /* 7196 */ { MAD_F(0x043d5efd) /* 0.264983168 */, 19 }, - /* 7197 */ { MAD_F(0x043d9279) /* 0.265032268 */, 19 }, - /* 7198 */ { MAD_F(0x043dc5f6) /* 0.265081369 */, 19 }, - /* 7199 */ { MAD_F(0x043df973) /* 0.265130473 */, 19 }, - - /* 7200 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 19 }, - /* 7201 */ { MAD_F(0x043e6070) /* 0.265228688 */, 19 }, - /* 7202 */ { MAD_F(0x043e93ef) /* 0.265277799 */, 19 }, - /* 7203 */ { MAD_F(0x043ec76e) /* 0.265326912 */, 19 }, - /* 7204 */ { MAD_F(0x043efaef) /* 0.265376027 */, 19 }, - /* 7205 */ { MAD_F(0x043f2e6f) /* 0.265425145 */, 19 }, - /* 7206 */ { MAD_F(0x043f61f1) /* 0.265474264 */, 19 }, - /* 7207 */ { MAD_F(0x043f9573) /* 0.265523387 */, 19 }, - /* 7208 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 19 }, - /* 7209 */ { MAD_F(0x043ffc79) /* 0.265621638 */, 19 }, - /* 7210 */ { MAD_F(0x04402ffd) /* 0.265670766 */, 19 }, - /* 7211 */ { MAD_F(0x04406382) /* 0.265719898 */, 19 }, - /* 7212 */ { MAD_F(0x04409707) /* 0.265769031 */, 19 }, - /* 7213 */ { MAD_F(0x0440ca8d) /* 0.265818167 */, 19 }, - /* 7214 */ { MAD_F(0x0440fe13) /* 0.265867305 */, 19 }, - /* 7215 */ { MAD_F(0x0441319a) /* 0.265916445 */, 19 }, - - /* 7216 */ { MAD_F(0x04416522) /* 0.265965588 */, 19 }, - /* 7217 */ { MAD_F(0x044198aa) /* 0.266014732 */, 19 }, - /* 7218 */ { MAD_F(0x0441cc33) /* 0.266063880 */, 19 }, - /* 7219 */ { MAD_F(0x0441ffbc) /* 0.266113029 */, 19 }, - /* 7220 */ { MAD_F(0x04423346) /* 0.266162181 */, 19 }, - /* 7221 */ { MAD_F(0x044266d1) /* 0.266211334 */, 19 }, - /* 7222 */ { MAD_F(0x04429a5c) /* 0.266260491 */, 19 }, - /* 7223 */ { MAD_F(0x0442cde8) /* 0.266309649 */, 19 }, - /* 7224 */ { MAD_F(0x04430174) /* 0.266358810 */, 19 }, - /* 7225 */ { MAD_F(0x04433501) /* 0.266407973 */, 19 }, - /* 7226 */ { MAD_F(0x0443688f) /* 0.266457138 */, 19 }, - /* 7227 */ { MAD_F(0x04439c1d) /* 0.266506305 */, 19 }, - /* 7228 */ { MAD_F(0x0443cfac) /* 0.266555475 */, 19 }, - /* 7229 */ { MAD_F(0x0444033c) /* 0.266604647 */, 19 }, - /* 7230 */ { MAD_F(0x044436cc) /* 0.266653822 */, 19 }, - /* 7231 */ { MAD_F(0x04446a5d) /* 0.266702998 */, 19 }, - - /* 7232 */ { MAD_F(0x04449dee) /* 0.266752177 */, 19 }, - /* 7233 */ { MAD_F(0x0444d180) /* 0.266801358 */, 19 }, - /* 7234 */ { MAD_F(0x04450513) /* 0.266850541 */, 19 }, - /* 7235 */ { MAD_F(0x044538a6) /* 0.266899727 */, 19 }, - /* 7236 */ { MAD_F(0x04456c39) /* 0.266948915 */, 19 }, - /* 7237 */ { MAD_F(0x04459fce) /* 0.266998105 */, 19 }, - /* 7238 */ { MAD_F(0x0445d363) /* 0.267047298 */, 19 }, - /* 7239 */ { MAD_F(0x044606f8) /* 0.267096492 */, 19 }, - /* 7240 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 19 }, - /* 7241 */ { MAD_F(0x04466e25) /* 0.267194888 */, 19 }, - /* 7242 */ { MAD_F(0x0446a1bd) /* 0.267244090 */, 19 }, - /* 7243 */ { MAD_F(0x0446d555) /* 0.267293294 */, 19 }, - /* 7244 */ { MAD_F(0x044708ee) /* 0.267342500 */, 19 }, - /* 7245 */ { MAD_F(0x04473c87) /* 0.267391708 */, 19 }, - /* 7246 */ { MAD_F(0x04477021) /* 0.267440919 */, 19 }, - /* 7247 */ { MAD_F(0x0447a3bb) /* 0.267490131 */, 19 }, - - /* 7248 */ { MAD_F(0x0447d756) /* 0.267539347 */, 19 }, - /* 7249 */ { MAD_F(0x04480af2) /* 0.267588564 */, 19 }, - /* 7250 */ { MAD_F(0x04483e8e) /* 0.267637783 */, 19 }, - /* 7251 */ { MAD_F(0x0448722b) /* 0.267687005 */, 19 }, - /* 7252 */ { MAD_F(0x0448a5c9) /* 0.267736229 */, 19 }, - /* 7253 */ { MAD_F(0x0448d967) /* 0.267785456 */, 19 }, - /* 7254 */ { MAD_F(0x04490d05) /* 0.267834685 */, 19 }, - /* 7255 */ { MAD_F(0x044940a5) /* 0.267883915 */, 19 }, - /* 7256 */ { MAD_F(0x04497445) /* 0.267933149 */, 19 }, - /* 7257 */ { MAD_F(0x0449a7e5) /* 0.267982384 */, 19 }, - /* 7258 */ { MAD_F(0x0449db86) /* 0.268031622 */, 19 }, - /* 7259 */ { MAD_F(0x044a0f28) /* 0.268080862 */, 19 }, - /* 7260 */ { MAD_F(0x044a42ca) /* 0.268130104 */, 19 }, - /* 7261 */ { MAD_F(0x044a766d) /* 0.268179349 */, 19 }, - /* 7262 */ { MAD_F(0x044aaa11) /* 0.268228595 */, 19 }, - /* 7263 */ { MAD_F(0x044addb5) /* 0.268277844 */, 19 }, - - /* 7264 */ { MAD_F(0x044b115a) /* 0.268327096 */, 19 }, - /* 7265 */ { MAD_F(0x044b44ff) /* 0.268376349 */, 19 }, - /* 7266 */ { MAD_F(0x044b78a5) /* 0.268425605 */, 19 }, - /* 7267 */ { MAD_F(0x044bac4c) /* 0.268474863 */, 19 }, - /* 7268 */ { MAD_F(0x044bdff3) /* 0.268524123 */, 19 }, - /* 7269 */ { MAD_F(0x044c139b) /* 0.268573386 */, 19 }, - /* 7270 */ { MAD_F(0x044c4743) /* 0.268622651 */, 19 }, - /* 7271 */ { MAD_F(0x044c7aec) /* 0.268671918 */, 19 }, - /* 7272 */ { MAD_F(0x044cae96) /* 0.268721187 */, 19 }, - /* 7273 */ { MAD_F(0x044ce240) /* 0.268770459 */, 19 }, - /* 7274 */ { MAD_F(0x044d15eb) /* 0.268819733 */, 19 }, - /* 7275 */ { MAD_F(0x044d4997) /* 0.268869009 */, 19 }, - /* 7276 */ { MAD_F(0x044d7d43) /* 0.268918287 */, 19 }, - /* 7277 */ { MAD_F(0x044db0ef) /* 0.268967568 */, 19 }, - /* 7278 */ { MAD_F(0x044de49d) /* 0.269016851 */, 19 }, - /* 7279 */ { MAD_F(0x044e184b) /* 0.269066136 */, 19 }, - - /* 7280 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 19 }, - /* 7281 */ { MAD_F(0x044e7fa8) /* 0.269164713 */, 19 }, - /* 7282 */ { MAD_F(0x044eb358) /* 0.269214005 */, 19 }, - /* 7283 */ { MAD_F(0x044ee708) /* 0.269263299 */, 19 }, - /* 7284 */ { MAD_F(0x044f1ab9) /* 0.269312595 */, 19 }, - /* 7285 */ { MAD_F(0x044f4e6b) /* 0.269361894 */, 19 }, - /* 7286 */ { MAD_F(0x044f821d) /* 0.269411195 */, 19 }, - /* 7287 */ { MAD_F(0x044fb5cf) /* 0.269460498 */, 19 }, - /* 7288 */ { MAD_F(0x044fe983) /* 0.269509804 */, 19 }, - /* 7289 */ { MAD_F(0x04501d37) /* 0.269559111 */, 19 }, - /* 7290 */ { MAD_F(0x045050eb) /* 0.269608421 */, 19 }, - /* 7291 */ { MAD_F(0x045084a0) /* 0.269657734 */, 19 }, - /* 7292 */ { MAD_F(0x0450b856) /* 0.269707048 */, 19 }, - /* 7293 */ { MAD_F(0x0450ec0d) /* 0.269756365 */, 19 }, - /* 7294 */ { MAD_F(0x04511fc4) /* 0.269805684 */, 19 }, - /* 7295 */ { MAD_F(0x0451537b) /* 0.269855005 */, 19 }, - - /* 7296 */ { MAD_F(0x04518733) /* 0.269904329 */, 19 }, - /* 7297 */ { MAD_F(0x0451baec) /* 0.269953654 */, 19 }, - /* 7298 */ { MAD_F(0x0451eea5) /* 0.270002982 */, 19 }, - /* 7299 */ { MAD_F(0x0452225f) /* 0.270052313 */, 19 }, - /* 7300 */ { MAD_F(0x0452561a) /* 0.270101645 */, 19 }, - /* 7301 */ { MAD_F(0x045289d5) /* 0.270150980 */, 19 }, - /* 7302 */ { MAD_F(0x0452bd91) /* 0.270200317 */, 19 }, - /* 7303 */ { MAD_F(0x0452f14d) /* 0.270249656 */, 19 }, - /* 7304 */ { MAD_F(0x0453250a) /* 0.270298998 */, 19 }, - /* 7305 */ { MAD_F(0x045358c8) /* 0.270348341 */, 19 }, - /* 7306 */ { MAD_F(0x04538c86) /* 0.270397687 */, 19 }, - /* 7307 */ { MAD_F(0x0453c045) /* 0.270447036 */, 19 }, - /* 7308 */ { MAD_F(0x0453f405) /* 0.270496386 */, 19 }, - /* 7309 */ { MAD_F(0x045427c5) /* 0.270545739 */, 19 }, - /* 7310 */ { MAD_F(0x04545b85) /* 0.270595094 */, 19 }, - /* 7311 */ { MAD_F(0x04548f46) /* 0.270644451 */, 19 }, - - /* 7312 */ { MAD_F(0x0454c308) /* 0.270693811 */, 19 }, - /* 7313 */ { MAD_F(0x0454f6cb) /* 0.270743173 */, 19 }, - /* 7314 */ { MAD_F(0x04552a8e) /* 0.270792537 */, 19 }, - /* 7315 */ { MAD_F(0x04555e51) /* 0.270841903 */, 19 }, - /* 7316 */ { MAD_F(0x04559216) /* 0.270891271 */, 19 }, - /* 7317 */ { MAD_F(0x0455c5db) /* 0.270940642 */, 19 }, - /* 7318 */ { MAD_F(0x0455f9a0) /* 0.270990015 */, 19 }, - /* 7319 */ { MAD_F(0x04562d66) /* 0.271039390 */, 19 }, - /* 7320 */ { MAD_F(0x0456612d) /* 0.271088768 */, 19 }, - /* 7321 */ { MAD_F(0x045694f4) /* 0.271138148 */, 19 }, - /* 7322 */ { MAD_F(0x0456c8bc) /* 0.271187530 */, 19 }, - /* 7323 */ { MAD_F(0x0456fc84) /* 0.271236914 */, 19 }, - /* 7324 */ { MAD_F(0x0457304e) /* 0.271286301 */, 19 }, - /* 7325 */ { MAD_F(0x04576417) /* 0.271335689 */, 19 }, - /* 7326 */ { MAD_F(0x045797e2) /* 0.271385080 */, 19 }, - /* 7327 */ { MAD_F(0x0457cbac) /* 0.271434474 */, 19 }, - - /* 7328 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 19 }, - /* 7329 */ { MAD_F(0x04583344) /* 0.271533267 */, 19 }, - /* 7330 */ { MAD_F(0x04586711) /* 0.271582667 */, 19 }, - /* 7331 */ { MAD_F(0x04589ade) /* 0.271632069 */, 19 }, - /* 7332 */ { MAD_F(0x0458ceac) /* 0.271681474 */, 19 }, - /* 7333 */ { MAD_F(0x0459027b) /* 0.271730880 */, 19 }, - /* 7334 */ { MAD_F(0x0459364a) /* 0.271780289 */, 19 }, - /* 7335 */ { MAD_F(0x04596a19) /* 0.271829701 */, 19 }, - /* 7336 */ { MAD_F(0x04599dea) /* 0.271879114 */, 19 }, - /* 7337 */ { MAD_F(0x0459d1bb) /* 0.271928530 */, 19 }, - /* 7338 */ { MAD_F(0x045a058c) /* 0.271977948 */, 19 }, - /* 7339 */ { MAD_F(0x045a395e) /* 0.272027368 */, 19 }, - /* 7340 */ { MAD_F(0x045a6d31) /* 0.272076790 */, 19 }, - /* 7341 */ { MAD_F(0x045aa104) /* 0.272126215 */, 19 }, - /* 7342 */ { MAD_F(0x045ad4d8) /* 0.272175642 */, 19 }, - /* 7343 */ { MAD_F(0x045b08ad) /* 0.272225071 */, 19 }, - - /* 7344 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 19 }, - /* 7345 */ { MAD_F(0x045b7058) /* 0.272323936 */, 19 }, - /* 7346 */ { MAD_F(0x045ba42e) /* 0.272373372 */, 19 }, - /* 7347 */ { MAD_F(0x045bd805) /* 0.272422810 */, 19 }, - /* 7348 */ { MAD_F(0x045c0bdd) /* 0.272472251 */, 19 }, - /* 7349 */ { MAD_F(0x045c3fb5) /* 0.272521693 */, 19 }, - /* 7350 */ { MAD_F(0x045c738e) /* 0.272571138 */, 19 }, - /* 7351 */ { MAD_F(0x045ca767) /* 0.272620585 */, 19 }, - /* 7352 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 19 }, - /* 7353 */ { MAD_F(0x045d0f1b) /* 0.272719486 */, 19 }, - /* 7354 */ { MAD_F(0x045d42f7) /* 0.272768940 */, 19 }, - /* 7355 */ { MAD_F(0x045d76d2) /* 0.272818396 */, 19 }, - /* 7356 */ { MAD_F(0x045daaaf) /* 0.272867855 */, 19 }, - /* 7357 */ { MAD_F(0x045dde8c) /* 0.272917315 */, 19 }, - /* 7358 */ { MAD_F(0x045e1269) /* 0.272966778 */, 19 }, - /* 7359 */ { MAD_F(0x045e4647) /* 0.273016243 */, 19 }, - - /* 7360 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 19 }, - /* 7361 */ { MAD_F(0x045eae06) /* 0.273115180 */, 19 }, - /* 7362 */ { MAD_F(0x045ee1e6) /* 0.273164652 */, 19 }, - /* 7363 */ { MAD_F(0x045f15c6) /* 0.273214126 */, 19 }, - /* 7364 */ { MAD_F(0x045f49a7) /* 0.273263602 */, 19 }, - /* 7365 */ { MAD_F(0x045f7d89) /* 0.273313081 */, 19 }, - /* 7366 */ { MAD_F(0x045fb16c) /* 0.273362561 */, 19 }, - /* 7367 */ { MAD_F(0x045fe54f) /* 0.273412044 */, 19 }, - /* 7368 */ { MAD_F(0x04601932) /* 0.273461530 */, 19 }, - /* 7369 */ { MAD_F(0x04604d16) /* 0.273511017 */, 19 }, - /* 7370 */ { MAD_F(0x046080fb) /* 0.273560507 */, 19 }, - /* 7371 */ { MAD_F(0x0460b4e1) /* 0.273609999 */, 19 }, - /* 7372 */ { MAD_F(0x0460e8c7) /* 0.273659493 */, 19 }, - /* 7373 */ { MAD_F(0x04611cad) /* 0.273708989 */, 19 }, - /* 7374 */ { MAD_F(0x04615094) /* 0.273758488 */, 19 }, - /* 7375 */ { MAD_F(0x0461847c) /* 0.273807989 */, 19 }, - - /* 7376 */ { MAD_F(0x0461b864) /* 0.273857492 */, 19 }, - /* 7377 */ { MAD_F(0x0461ec4d) /* 0.273906997 */, 19 }, - /* 7378 */ { MAD_F(0x04622037) /* 0.273956505 */, 19 }, - /* 7379 */ { MAD_F(0x04625421) /* 0.274006015 */, 19 }, - /* 7380 */ { MAD_F(0x0462880c) /* 0.274055527 */, 19 }, - /* 7381 */ { MAD_F(0x0462bbf7) /* 0.274105041 */, 19 }, - /* 7382 */ { MAD_F(0x0462efe3) /* 0.274154558 */, 19 }, - /* 7383 */ { MAD_F(0x046323d0) /* 0.274204076 */, 19 }, - /* 7384 */ { MAD_F(0x046357bd) /* 0.274253597 */, 19 }, - /* 7385 */ { MAD_F(0x04638bab) /* 0.274303121 */, 19 }, - /* 7386 */ { MAD_F(0x0463bf99) /* 0.274352646 */, 19 }, - /* 7387 */ { MAD_F(0x0463f388) /* 0.274402174 */, 19 }, - /* 7388 */ { MAD_F(0x04642778) /* 0.274451704 */, 19 }, - /* 7389 */ { MAD_F(0x04645b68) /* 0.274501236 */, 19 }, - /* 7390 */ { MAD_F(0x04648f59) /* 0.274550771 */, 19 }, - /* 7391 */ { MAD_F(0x0464c34a) /* 0.274600307 */, 19 }, - - /* 7392 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 19 }, - /* 7393 */ { MAD_F(0x04652b2f) /* 0.274699387 */, 19 }, - /* 7394 */ { MAD_F(0x04655f22) /* 0.274748931 */, 19 }, - /* 7395 */ { MAD_F(0x04659316) /* 0.274798476 */, 19 }, - /* 7396 */ { MAD_F(0x0465c70a) /* 0.274848024 */, 19 }, - /* 7397 */ { MAD_F(0x0465faff) /* 0.274897574 */, 19 }, - /* 7398 */ { MAD_F(0x04662ef5) /* 0.274947126 */, 19 }, - /* 7399 */ { MAD_F(0x046662eb) /* 0.274996681 */, 19 }, - /* 7400 */ { MAD_F(0x046696e2) /* 0.275046238 */, 19 }, - /* 7401 */ { MAD_F(0x0466cad9) /* 0.275095797 */, 19 }, - /* 7402 */ { MAD_F(0x0466fed1) /* 0.275145358 */, 19 }, - /* 7403 */ { MAD_F(0x046732ca) /* 0.275194921 */, 19 }, - /* 7404 */ { MAD_F(0x046766c3) /* 0.275244487 */, 19 }, - /* 7405 */ { MAD_F(0x04679abd) /* 0.275294055 */, 19 }, - /* 7406 */ { MAD_F(0x0467ceb7) /* 0.275343625 */, 19 }, - /* 7407 */ { MAD_F(0x046802b2) /* 0.275393198 */, 19 }, - - /* 7408 */ { MAD_F(0x046836ae) /* 0.275442772 */, 19 }, - /* 7409 */ { MAD_F(0x04686aaa) /* 0.275492349 */, 19 }, - /* 7410 */ { MAD_F(0x04689ea7) /* 0.275541928 */, 19 }, - /* 7411 */ { MAD_F(0x0468d2a4) /* 0.275591509 */, 19 }, - /* 7412 */ { MAD_F(0x046906a2) /* 0.275641093 */, 19 }, - /* 7413 */ { MAD_F(0x04693aa1) /* 0.275690679 */, 19 }, - /* 7414 */ { MAD_F(0x04696ea0) /* 0.275740267 */, 19 }, - /* 7415 */ { MAD_F(0x0469a2a0) /* 0.275789857 */, 19 }, - /* 7416 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 19 }, - /* 7417 */ { MAD_F(0x046a0aa1) /* 0.275889044 */, 19 }, - /* 7418 */ { MAD_F(0x046a3ea3) /* 0.275938641 */, 19 }, - /* 7419 */ { MAD_F(0x046a72a5) /* 0.275988240 */, 19 }, - /* 7420 */ { MAD_F(0x046aa6a8) /* 0.276037842 */, 19 }, - /* 7421 */ { MAD_F(0x046adaab) /* 0.276087445 */, 19 }, - /* 7422 */ { MAD_F(0x046b0eaf) /* 0.276137051 */, 19 }, - /* 7423 */ { MAD_F(0x046b42b3) /* 0.276186659 */, 19 }, - - /* 7424 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 19 }, - /* 7425 */ { MAD_F(0x046baabe) /* 0.276285882 */, 19 }, - /* 7426 */ { MAD_F(0x046bdec5) /* 0.276335497 */, 19 }, - /* 7427 */ { MAD_F(0x046c12cc) /* 0.276385113 */, 19 }, - /* 7428 */ { MAD_F(0x046c46d3) /* 0.276434733 */, 19 }, - /* 7429 */ { MAD_F(0x046c7adb) /* 0.276484354 */, 19 }, - /* 7430 */ { MAD_F(0x046caee4) /* 0.276533978 */, 19 }, - /* 7431 */ { MAD_F(0x046ce2ee) /* 0.276583604 */, 19 }, - /* 7432 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 19 }, - /* 7433 */ { MAD_F(0x046d4b02) /* 0.276682862 */, 19 }, - /* 7434 */ { MAD_F(0x046d7f0d) /* 0.276732495 */, 19 }, - /* 7435 */ { MAD_F(0x046db319) /* 0.276782129 */, 19 }, - /* 7436 */ { MAD_F(0x046de725) /* 0.276831766 */, 19 }, - /* 7437 */ { MAD_F(0x046e1b32) /* 0.276881406 */, 19 }, - /* 7438 */ { MAD_F(0x046e4f40) /* 0.276931047 */, 19 }, - /* 7439 */ { MAD_F(0x046e834e) /* 0.276980691 */, 19 }, - - /* 7440 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 19 }, - /* 7441 */ { MAD_F(0x046eeb6c) /* 0.277079985 */, 19 }, - /* 7442 */ { MAD_F(0x046f1f7c) /* 0.277129635 */, 19 }, - /* 7443 */ { MAD_F(0x046f538c) /* 0.277179288 */, 19 }, - /* 7444 */ { MAD_F(0x046f879d) /* 0.277228942 */, 19 }, - /* 7445 */ { MAD_F(0x046fbbaf) /* 0.277278600 */, 19 }, - /* 7446 */ { MAD_F(0x046fefc1) /* 0.277328259 */, 19 }, - /* 7447 */ { MAD_F(0x047023d4) /* 0.277377920 */, 19 }, - /* 7448 */ { MAD_F(0x047057e8) /* 0.277427584 */, 19 }, - /* 7449 */ { MAD_F(0x04708bfc) /* 0.277477250 */, 19 }, - /* 7450 */ { MAD_F(0x0470c011) /* 0.277526918 */, 19 }, - /* 7451 */ { MAD_F(0x0470f426) /* 0.277576588 */, 19 }, - /* 7452 */ { MAD_F(0x0471283c) /* 0.277626261 */, 19 }, - /* 7453 */ { MAD_F(0x04715c52) /* 0.277675936 */, 19 }, - /* 7454 */ { MAD_F(0x04719069) /* 0.277725613 */, 19 }, - /* 7455 */ { MAD_F(0x0471c481) /* 0.277775292 */, 19 }, - - /* 7456 */ { MAD_F(0x0471f899) /* 0.277824973 */, 19 }, - /* 7457 */ { MAD_F(0x04722cb2) /* 0.277874657 */, 19 }, - /* 7458 */ { MAD_F(0x047260cc) /* 0.277924343 */, 19 }, - /* 7459 */ { MAD_F(0x047294e6) /* 0.277974031 */, 19 }, - /* 7460 */ { MAD_F(0x0472c900) /* 0.278023722 */, 19 }, - /* 7461 */ { MAD_F(0x0472fd1b) /* 0.278073414 */, 19 }, - /* 7462 */ { MAD_F(0x04733137) /* 0.278123109 */, 19 }, - /* 7463 */ { MAD_F(0x04736554) /* 0.278172806 */, 19 }, - /* 7464 */ { MAD_F(0x04739971) /* 0.278222505 */, 19 }, - /* 7465 */ { MAD_F(0x0473cd8e) /* 0.278272207 */, 19 }, - /* 7466 */ { MAD_F(0x047401ad) /* 0.278321910 */, 19 }, - /* 7467 */ { MAD_F(0x047435cb) /* 0.278371616 */, 19 }, - /* 7468 */ { MAD_F(0x047469eb) /* 0.278421324 */, 19 }, - /* 7469 */ { MAD_F(0x04749e0b) /* 0.278471035 */, 19 }, - /* 7470 */ { MAD_F(0x0474d22c) /* 0.278520747 */, 19 }, - /* 7471 */ { MAD_F(0x0475064d) /* 0.278570462 */, 19 }, - - /* 7472 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 19 }, - /* 7473 */ { MAD_F(0x04756e91) /* 0.278669898 */, 19 }, - /* 7474 */ { MAD_F(0x0475a2b4) /* 0.278719619 */, 19 }, - /* 7475 */ { MAD_F(0x0475d6d7) /* 0.278769343 */, 19 }, - /* 7476 */ { MAD_F(0x04760afc) /* 0.278819069 */, 19 }, - /* 7477 */ { MAD_F(0x04763f20) /* 0.278868797 */, 19 }, - /* 7478 */ { MAD_F(0x04767346) /* 0.278918527 */, 19 }, - /* 7479 */ { MAD_F(0x0476a76c) /* 0.278968260 */, 19 }, - /* 7480 */ { MAD_F(0x0476db92) /* 0.279017995 */, 19 }, - /* 7481 */ { MAD_F(0x04770fba) /* 0.279067731 */, 19 }, - /* 7482 */ { MAD_F(0x047743e1) /* 0.279117471 */, 19 }, - /* 7483 */ { MAD_F(0x0477780a) /* 0.279167212 */, 19 }, - /* 7484 */ { MAD_F(0x0477ac33) /* 0.279216956 */, 19 }, - /* 7485 */ { MAD_F(0x0477e05c) /* 0.279266701 */, 19 }, - /* 7486 */ { MAD_F(0x04781486) /* 0.279316449 */, 19 }, - /* 7487 */ { MAD_F(0x047848b1) /* 0.279366200 */, 19 }, - - /* 7488 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 19 }, - /* 7489 */ { MAD_F(0x0478b108) /* 0.279465707 */, 19 }, - /* 7490 */ { MAD_F(0x0478e535) /* 0.279515464 */, 19 }, - /* 7491 */ { MAD_F(0x04791962) /* 0.279565223 */, 19 }, - /* 7492 */ { MAD_F(0x04794d8f) /* 0.279614984 */, 19 }, - /* 7493 */ { MAD_F(0x047981be) /* 0.279664748 */, 19 }, - /* 7494 */ { MAD_F(0x0479b5ed) /* 0.279714513 */, 19 }, - /* 7495 */ { MAD_F(0x0479ea1c) /* 0.279764281 */, 19 }, - /* 7496 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 19 }, - /* 7497 */ { MAD_F(0x047a527d) /* 0.279863824 */, 19 }, - /* 7498 */ { MAD_F(0x047a86ae) /* 0.279913598 */, 19 }, - /* 7499 */ { MAD_F(0x047abae0) /* 0.279963375 */, 19 }, - /* 7500 */ { MAD_F(0x047aef12) /* 0.280013154 */, 19 }, - /* 7501 */ { MAD_F(0x047b2346) /* 0.280062935 */, 19 }, - /* 7502 */ { MAD_F(0x047b5779) /* 0.280112719 */, 19 }, - /* 7503 */ { MAD_F(0x047b8bad) /* 0.280162504 */, 19 }, - - /* 7504 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 19 }, - /* 7505 */ { MAD_F(0x047bf418) /* 0.280262082 */, 19 }, - /* 7506 */ { MAD_F(0x047c284e) /* 0.280311875 */, 19 }, - /* 7507 */ { MAD_F(0x047c5c84) /* 0.280361669 */, 19 }, - /* 7508 */ { MAD_F(0x047c90bb) /* 0.280411466 */, 19 }, - /* 7509 */ { MAD_F(0x047cc4f3) /* 0.280461265 */, 19 }, - /* 7510 */ { MAD_F(0x047cf92c) /* 0.280511066 */, 19 }, - /* 7511 */ { MAD_F(0x047d2d65) /* 0.280560869 */, 19 }, - /* 7512 */ { MAD_F(0x047d619e) /* 0.280610675 */, 19 }, - /* 7513 */ { MAD_F(0x047d95d8) /* 0.280660483 */, 19 }, - /* 7514 */ { MAD_F(0x047dca13) /* 0.280710292 */, 19 }, - /* 7515 */ { MAD_F(0x047dfe4e) /* 0.280760105 */, 19 }, - /* 7516 */ { MAD_F(0x047e328a) /* 0.280809919 */, 19 }, - /* 7517 */ { MAD_F(0x047e66c7) /* 0.280859736 */, 19 }, - /* 7518 */ { MAD_F(0x047e9b04) /* 0.280909554 */, 19 }, - /* 7519 */ { MAD_F(0x047ecf42) /* 0.280959375 */, 19 }, - - /* 7520 */ { MAD_F(0x047f0380) /* 0.281009199 */, 19 }, - /* 7521 */ { MAD_F(0x047f37bf) /* 0.281059024 */, 19 }, - /* 7522 */ { MAD_F(0x047f6bff) /* 0.281108852 */, 19 }, - /* 7523 */ { MAD_F(0x047fa03f) /* 0.281158682 */, 19 }, - /* 7524 */ { MAD_F(0x047fd47f) /* 0.281208514 */, 19 }, - /* 7525 */ { MAD_F(0x048008c1) /* 0.281258348 */, 19 }, - /* 7526 */ { MAD_F(0x04803d02) /* 0.281308184 */, 19 }, - /* 7527 */ { MAD_F(0x04807145) /* 0.281358023 */, 19 }, - /* 7528 */ { MAD_F(0x0480a588) /* 0.281407864 */, 19 }, - /* 7529 */ { MAD_F(0x0480d9cc) /* 0.281457707 */, 19 }, - /* 7530 */ { MAD_F(0x04810e10) /* 0.281507552 */, 19 }, - /* 7531 */ { MAD_F(0x04814255) /* 0.281557400 */, 19 }, - /* 7532 */ { MAD_F(0x0481769a) /* 0.281607250 */, 19 }, - /* 7533 */ { MAD_F(0x0481aae0) /* 0.281657101 */, 19 }, - /* 7534 */ { MAD_F(0x0481df27) /* 0.281706956 */, 19 }, - /* 7535 */ { MAD_F(0x0482136e) /* 0.281756812 */, 19 }, - - /* 7536 */ { MAD_F(0x048247b6) /* 0.281806670 */, 19 }, - /* 7537 */ { MAD_F(0x04827bfe) /* 0.281856531 */, 19 }, - /* 7538 */ { MAD_F(0x0482b047) /* 0.281906394 */, 19 }, - /* 7539 */ { MAD_F(0x0482e491) /* 0.281956259 */, 19 }, - /* 7540 */ { MAD_F(0x048318db) /* 0.282006127 */, 19 }, - /* 7541 */ { MAD_F(0x04834d26) /* 0.282055996 */, 19 }, - /* 7542 */ { MAD_F(0x04838171) /* 0.282105868 */, 19 }, - /* 7543 */ { MAD_F(0x0483b5bd) /* 0.282155742 */, 19 }, - /* 7544 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 19 }, - /* 7545 */ { MAD_F(0x04841e57) /* 0.282255496 */, 19 }, - /* 7546 */ { MAD_F(0x048452a4) /* 0.282305377 */, 19 }, - /* 7547 */ { MAD_F(0x048486f3) /* 0.282355260 */, 19 }, - /* 7548 */ { MAD_F(0x0484bb42) /* 0.282405145 */, 19 }, - /* 7549 */ { MAD_F(0x0484ef91) /* 0.282455032 */, 19 }, - /* 7550 */ { MAD_F(0x048523e1) /* 0.282504921 */, 19 }, - /* 7551 */ { MAD_F(0x04855832) /* 0.282554813 */, 19 }, - - /* 7552 */ { MAD_F(0x04858c83) /* 0.282604707 */, 19 }, - /* 7553 */ { MAD_F(0x0485c0d5) /* 0.282654603 */, 19 }, - /* 7554 */ { MAD_F(0x0485f527) /* 0.282704501 */, 19 }, - /* 7555 */ { MAD_F(0x0486297a) /* 0.282754401 */, 19 }, - /* 7556 */ { MAD_F(0x04865dce) /* 0.282804304 */, 19 }, - /* 7557 */ { MAD_F(0x04869222) /* 0.282854209 */, 19 }, - /* 7558 */ { MAD_F(0x0486c677) /* 0.282904116 */, 19 }, - /* 7559 */ { MAD_F(0x0486facc) /* 0.282954025 */, 19 }, - /* 7560 */ { MAD_F(0x04872f22) /* 0.283003936 */, 19 }, - /* 7561 */ { MAD_F(0x04876379) /* 0.283053850 */, 19 }, - /* 7562 */ { MAD_F(0x048797d0) /* 0.283103766 */, 19 }, - /* 7563 */ { MAD_F(0x0487cc28) /* 0.283153684 */, 19 }, - /* 7564 */ { MAD_F(0x04880080) /* 0.283203604 */, 19 }, - /* 7565 */ { MAD_F(0x048834d9) /* 0.283253527 */, 19 }, - /* 7566 */ { MAD_F(0x04886933) /* 0.283303451 */, 19 }, - /* 7567 */ { MAD_F(0x04889d8d) /* 0.283353378 */, 19 }, - - /* 7568 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 19 }, - /* 7569 */ { MAD_F(0x04890643) /* 0.283453238 */, 19 }, - /* 7570 */ { MAD_F(0x04893a9f) /* 0.283503172 */, 19 }, - /* 7571 */ { MAD_F(0x04896efb) /* 0.283553107 */, 19 }, - /* 7572 */ { MAD_F(0x0489a358) /* 0.283603045 */, 19 }, - /* 7573 */ { MAD_F(0x0489d7b6) /* 0.283652985 */, 19 }, - /* 7574 */ { MAD_F(0x048a0c14) /* 0.283702927 */, 19 }, - /* 7575 */ { MAD_F(0x048a4073) /* 0.283752872 */, 19 }, - /* 7576 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 19 }, - /* 7577 */ { MAD_F(0x048aa933) /* 0.283852767 */, 19 }, - /* 7578 */ { MAD_F(0x048add93) /* 0.283902718 */, 19 }, - /* 7579 */ { MAD_F(0x048b11f5) /* 0.283952671 */, 19 }, - /* 7580 */ { MAD_F(0x048b4656) /* 0.284002627 */, 19 }, - /* 7581 */ { MAD_F(0x048b7ab9) /* 0.284052584 */, 19 }, - /* 7582 */ { MAD_F(0x048baf1c) /* 0.284102544 */, 19 }, - /* 7583 */ { MAD_F(0x048be37f) /* 0.284152506 */, 19 }, - - /* 7584 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 19 }, - /* 7585 */ { MAD_F(0x048c4c48) /* 0.284252436 */, 19 }, - /* 7586 */ { MAD_F(0x048c80ad) /* 0.284302405 */, 19 }, - /* 7587 */ { MAD_F(0x048cb513) /* 0.284352376 */, 19 }, - /* 7588 */ { MAD_F(0x048ce97a) /* 0.284402349 */, 19 }, - /* 7589 */ { MAD_F(0x048d1de1) /* 0.284452324 */, 19 }, - /* 7590 */ { MAD_F(0x048d5249) /* 0.284502301 */, 19 }, - /* 7591 */ { MAD_F(0x048d86b1) /* 0.284552281 */, 19 }, - /* 7592 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 19 }, - /* 7593 */ { MAD_F(0x048def83) /* 0.284652246 */, 19 }, - /* 7594 */ { MAD_F(0x048e23ed) /* 0.284702233 */, 19 }, - /* 7595 */ { MAD_F(0x048e5858) /* 0.284752221 */, 19 }, - /* 7596 */ { MAD_F(0x048e8cc3) /* 0.284802211 */, 19 }, - /* 7597 */ { MAD_F(0x048ec12f) /* 0.284852204 */, 19 }, - /* 7598 */ { MAD_F(0x048ef59b) /* 0.284902199 */, 19 }, - /* 7599 */ { MAD_F(0x048f2a08) /* 0.284952196 */, 19 }, - - /* 7600 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 19 }, - /* 7601 */ { MAD_F(0x048f92e4) /* 0.285052197 */, 19 }, - /* 7602 */ { MAD_F(0x048fc753) /* 0.285102201 */, 19 }, - /* 7603 */ { MAD_F(0x048ffbc2) /* 0.285152206 */, 19 }, - /* 7604 */ { MAD_F(0x04903032) /* 0.285202214 */, 19 }, - /* 7605 */ { MAD_F(0x049064a3) /* 0.285252225 */, 19 }, - /* 7606 */ { MAD_F(0x04909914) /* 0.285302237 */, 19 }, - /* 7607 */ { MAD_F(0x0490cd86) /* 0.285352252 */, 19 }, - /* 7608 */ { MAD_F(0x049101f8) /* 0.285402269 */, 19 }, - /* 7609 */ { MAD_F(0x0491366b) /* 0.285452288 */, 19 }, - /* 7610 */ { MAD_F(0x04916ade) /* 0.285502309 */, 19 }, - /* 7611 */ { MAD_F(0x04919f52) /* 0.285552332 */, 19 }, - /* 7612 */ { MAD_F(0x0491d3c7) /* 0.285602358 */, 19 }, - /* 7613 */ { MAD_F(0x0492083c) /* 0.285652386 */, 19 }, - /* 7614 */ { MAD_F(0x04923cb2) /* 0.285702416 */, 19 }, - /* 7615 */ { MAD_F(0x04927128) /* 0.285752448 */, 19 }, - - /* 7616 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 19 }, - /* 7617 */ { MAD_F(0x0492da17) /* 0.285852519 */, 19 }, - /* 7618 */ { MAD_F(0x04930e8f) /* 0.285902557 */, 19 }, - /* 7619 */ { MAD_F(0x04934308) /* 0.285952598 */, 19 }, - /* 7620 */ { MAD_F(0x04937781) /* 0.286002641 */, 19 }, - /* 7621 */ { MAD_F(0x0493abfb) /* 0.286052687 */, 19 }, - /* 7622 */ { MAD_F(0x0493e076) /* 0.286102734 */, 19 }, - /* 7623 */ { MAD_F(0x049414f1) /* 0.286152784 */, 19 }, - /* 7624 */ { MAD_F(0x0494496c) /* 0.286202836 */, 19 }, - /* 7625 */ { MAD_F(0x04947de9) /* 0.286252890 */, 19 }, - /* 7626 */ { MAD_F(0x0494b266) /* 0.286302946 */, 19 }, - /* 7627 */ { MAD_F(0x0494e6e3) /* 0.286353005 */, 19 }, - /* 7628 */ { MAD_F(0x04951b61) /* 0.286403065 */, 19 }, - /* 7629 */ { MAD_F(0x04954fe0) /* 0.286453128 */, 19 }, - /* 7630 */ { MAD_F(0x0495845f) /* 0.286503193 */, 19 }, - /* 7631 */ { MAD_F(0x0495b8df) /* 0.286553260 */, 19 }, - - /* 7632 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 19 }, - /* 7633 */ { MAD_F(0x049621e0) /* 0.286653401 */, 19 }, - /* 7634 */ { MAD_F(0x04965662) /* 0.286703475 */, 19 }, - /* 7635 */ { MAD_F(0x04968ae4) /* 0.286753551 */, 19 }, - /* 7636 */ { MAD_F(0x0496bf67) /* 0.286803629 */, 19 }, - /* 7637 */ { MAD_F(0x0496f3ea) /* 0.286853709 */, 19 }, - /* 7638 */ { MAD_F(0x0497286e) /* 0.286903792 */, 19 }, - /* 7639 */ { MAD_F(0x04975cf2) /* 0.286953876 */, 19 }, - /* 7640 */ { MAD_F(0x04979177) /* 0.287003963 */, 19 }, - /* 7641 */ { MAD_F(0x0497c5fd) /* 0.287054052 */, 19 }, - /* 7642 */ { MAD_F(0x0497fa83) /* 0.287104143 */, 19 }, - /* 7643 */ { MAD_F(0x04982f0a) /* 0.287154237 */, 19 }, - /* 7644 */ { MAD_F(0x04986392) /* 0.287204332 */, 19 }, - /* 7645 */ { MAD_F(0x0498981a) /* 0.287254430 */, 19 }, - /* 7646 */ { MAD_F(0x0498cca2) /* 0.287304530 */, 19 }, - /* 7647 */ { MAD_F(0x0499012c) /* 0.287354632 */, 19 }, - - /* 7648 */ { MAD_F(0x049935b5) /* 0.287404737 */, 19 }, - /* 7649 */ { MAD_F(0x04996a40) /* 0.287454843 */, 19 }, - /* 7650 */ { MAD_F(0x04999ecb) /* 0.287504952 */, 19 }, - /* 7651 */ { MAD_F(0x0499d356) /* 0.287555063 */, 19 }, - /* 7652 */ { MAD_F(0x049a07e2) /* 0.287605176 */, 19 }, - /* 7653 */ { MAD_F(0x049a3c6f) /* 0.287655291 */, 19 }, - /* 7654 */ { MAD_F(0x049a70fc) /* 0.287705409 */, 19 }, - /* 7655 */ { MAD_F(0x049aa58a) /* 0.287755528 */, 19 }, - /* 7656 */ { MAD_F(0x049ada19) /* 0.287805650 */, 19 }, - /* 7657 */ { MAD_F(0x049b0ea8) /* 0.287855774 */, 19 }, - /* 7658 */ { MAD_F(0x049b4337) /* 0.287905900 */, 19 }, - /* 7659 */ { MAD_F(0x049b77c8) /* 0.287956028 */, 19 }, - /* 7660 */ { MAD_F(0x049bac58) /* 0.288006159 */, 19 }, - /* 7661 */ { MAD_F(0x049be0ea) /* 0.288056292 */, 19 }, - /* 7662 */ { MAD_F(0x049c157c) /* 0.288106427 */, 19 }, - /* 7663 */ { MAD_F(0x049c4a0e) /* 0.288156564 */, 19 }, - - /* 7664 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 19 }, - /* 7665 */ { MAD_F(0x049cb335) /* 0.288256844 */, 19 }, - /* 7666 */ { MAD_F(0x049ce7ca) /* 0.288306988 */, 19 }, - /* 7667 */ { MAD_F(0x049d1c5e) /* 0.288357134 */, 19 }, - /* 7668 */ { MAD_F(0x049d50f4) /* 0.288407282 */, 19 }, - /* 7669 */ { MAD_F(0x049d858a) /* 0.288457432 */, 19 }, - /* 7670 */ { MAD_F(0x049dba21) /* 0.288507584 */, 19 }, - /* 7671 */ { MAD_F(0x049deeb8) /* 0.288557739 */, 19 }, - /* 7672 */ { MAD_F(0x049e2350) /* 0.288607895 */, 19 }, - /* 7673 */ { MAD_F(0x049e57e8) /* 0.288658054 */, 19 }, - /* 7674 */ { MAD_F(0x049e8c81) /* 0.288708215 */, 19 }, - /* 7675 */ { MAD_F(0x049ec11b) /* 0.288758379 */, 19 }, - /* 7676 */ { MAD_F(0x049ef5b5) /* 0.288808544 */, 19 }, - /* 7677 */ { MAD_F(0x049f2a50) /* 0.288858712 */, 19 }, - /* 7678 */ { MAD_F(0x049f5eeb) /* 0.288908881 */, 19 }, - /* 7679 */ { MAD_F(0x049f9387) /* 0.288959053 */, 19 }, - - /* 7680 */ { MAD_F(0x049fc824) /* 0.289009227 */, 19 }, - /* 7681 */ { MAD_F(0x049ffcc1) /* 0.289059404 */, 19 }, - /* 7682 */ { MAD_F(0x04a0315e) /* 0.289109582 */, 19 }, - /* 7683 */ { MAD_F(0x04a065fd) /* 0.289159763 */, 19 }, - /* 7684 */ { MAD_F(0x04a09a9b) /* 0.289209946 */, 19 }, - /* 7685 */ { MAD_F(0x04a0cf3b) /* 0.289260131 */, 19 }, - /* 7686 */ { MAD_F(0x04a103db) /* 0.289310318 */, 19 }, - /* 7687 */ { MAD_F(0x04a1387b) /* 0.289360507 */, 19 }, - /* 7688 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 19 }, - /* 7689 */ { MAD_F(0x04a1a1be) /* 0.289460893 */, 19 }, - /* 7690 */ { MAD_F(0x04a1d661) /* 0.289511088 */, 19 }, - /* 7691 */ { MAD_F(0x04a20b04) /* 0.289561287 */, 19 }, - /* 7692 */ { MAD_F(0x04a23fa7) /* 0.289611487 */, 19 }, - /* 7693 */ { MAD_F(0x04a2744b) /* 0.289661689 */, 19 }, - /* 7694 */ { MAD_F(0x04a2a8f0) /* 0.289711894 */, 19 }, - /* 7695 */ { MAD_F(0x04a2dd95) /* 0.289762101 */, 19 }, - - /* 7696 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 19 }, - /* 7697 */ { MAD_F(0x04a346e2) /* 0.289862521 */, 19 }, - /* 7698 */ { MAD_F(0x04a37b89) /* 0.289912734 */, 19 }, - /* 7699 */ { MAD_F(0x04a3b030) /* 0.289962949 */, 19 }, - /* 7700 */ { MAD_F(0x04a3e4d8) /* 0.290013167 */, 19 }, - /* 7701 */ { MAD_F(0x04a41981) /* 0.290063387 */, 19 }, - /* 7702 */ { MAD_F(0x04a44e2b) /* 0.290113609 */, 19 }, - /* 7703 */ { MAD_F(0x04a482d5) /* 0.290163833 */, 19 }, - /* 7704 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 19 }, - /* 7705 */ { MAD_F(0x04a4ec2a) /* 0.290264288 */, 19 }, - /* 7706 */ { MAD_F(0x04a520d6) /* 0.290314519 */, 19 }, - /* 7707 */ { MAD_F(0x04a55582) /* 0.290364751 */, 19 }, - /* 7708 */ { MAD_F(0x04a58a2f) /* 0.290414986 */, 19 }, - /* 7709 */ { MAD_F(0x04a5bedd) /* 0.290465224 */, 19 }, - /* 7710 */ { MAD_F(0x04a5f38b) /* 0.290515463 */, 19 }, - /* 7711 */ { MAD_F(0x04a62839) /* 0.290565705 */, 19 }, - - /* 7712 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 19 }, - /* 7713 */ { MAD_F(0x04a69198) /* 0.290666194 */, 19 }, - /* 7714 */ { MAD_F(0x04a6c648) /* 0.290716442 */, 19 }, - /* 7715 */ { MAD_F(0x04a6faf9) /* 0.290766692 */, 19 }, - /* 7716 */ { MAD_F(0x04a72fab) /* 0.290816945 */, 19 }, - /* 7717 */ { MAD_F(0x04a7645d) /* 0.290867199 */, 19 }, - /* 7718 */ { MAD_F(0x04a79910) /* 0.290917456 */, 19 }, - /* 7719 */ { MAD_F(0x04a7cdc3) /* 0.290967715 */, 19 }, - /* 7720 */ { MAD_F(0x04a80277) /* 0.291017976 */, 19 }, - /* 7721 */ { MAD_F(0x04a8372b) /* 0.291068239 */, 19 }, - /* 7722 */ { MAD_F(0x04a86be0) /* 0.291118505 */, 19 }, - /* 7723 */ { MAD_F(0x04a8a096) /* 0.291168772 */, 19 }, - /* 7724 */ { MAD_F(0x04a8d54c) /* 0.291219042 */, 19 }, - /* 7725 */ { MAD_F(0x04a90a03) /* 0.291269314 */, 19 }, - /* 7726 */ { MAD_F(0x04a93eba) /* 0.291319588 */, 19 }, - /* 7727 */ { MAD_F(0x04a97372) /* 0.291369865 */, 19 }, - - /* 7728 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 19 }, - /* 7729 */ { MAD_F(0x04a9dce4) /* 0.291470424 */, 19 }, - /* 7730 */ { MAD_F(0x04aa119d) /* 0.291520706 */, 19 }, - /* 7731 */ { MAD_F(0x04aa4658) /* 0.291570991 */, 19 }, - /* 7732 */ { MAD_F(0x04aa7b13) /* 0.291621278 */, 19 }, - /* 7733 */ { MAD_F(0x04aaafce) /* 0.291671568 */, 19 }, - /* 7734 */ { MAD_F(0x04aae48a) /* 0.291721859 */, 19 }, - /* 7735 */ { MAD_F(0x04ab1947) /* 0.291772153 */, 19 }, - /* 7736 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 19 }, - /* 7737 */ { MAD_F(0x04ab82c2) /* 0.291872747 */, 19 }, - /* 7738 */ { MAD_F(0x04abb780) /* 0.291923047 */, 19 }, - /* 7739 */ { MAD_F(0x04abec3f) /* 0.291973349 */, 19 }, - /* 7740 */ { MAD_F(0x04ac20fe) /* 0.292023653 */, 19 }, - /* 7741 */ { MAD_F(0x04ac55be) /* 0.292073960 */, 19 }, - /* 7742 */ { MAD_F(0x04ac8a7f) /* 0.292124269 */, 19 }, - /* 7743 */ { MAD_F(0x04acbf40) /* 0.292174580 */, 19 }, - - /* 7744 */ { MAD_F(0x04acf402) /* 0.292224893 */, 19 }, - /* 7745 */ { MAD_F(0x04ad28c5) /* 0.292275208 */, 19 }, - /* 7746 */ { MAD_F(0x04ad5d88) /* 0.292325526 */, 19 }, - /* 7747 */ { MAD_F(0x04ad924b) /* 0.292375845 */, 19 }, - /* 7748 */ { MAD_F(0x04adc70f) /* 0.292426167 */, 19 }, - /* 7749 */ { MAD_F(0x04adfbd4) /* 0.292476491 */, 19 }, - /* 7750 */ { MAD_F(0x04ae3099) /* 0.292526817 */, 19 }, - /* 7751 */ { MAD_F(0x04ae655f) /* 0.292577145 */, 19 }, - /* 7752 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 19 }, - /* 7753 */ { MAD_F(0x04aeceed) /* 0.292677808 */, 19 }, - /* 7754 */ { MAD_F(0x04af03b4) /* 0.292728143 */, 19 }, - /* 7755 */ { MAD_F(0x04af387d) /* 0.292778480 */, 19 }, - /* 7756 */ { MAD_F(0x04af6d45) /* 0.292828819 */, 19 }, - /* 7757 */ { MAD_F(0x04afa20f) /* 0.292879160 */, 19 }, - /* 7758 */ { MAD_F(0x04afd6d9) /* 0.292929504 */, 19 }, - /* 7759 */ { MAD_F(0x04b00ba3) /* 0.292979849 */, 19 }, - - /* 7760 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 19 }, - /* 7761 */ { MAD_F(0x04b0753a) /* 0.293080547 */, 19 }, - /* 7762 */ { MAD_F(0x04b0aa06) /* 0.293130899 */, 19 }, - /* 7763 */ { MAD_F(0x04b0ded3) /* 0.293181253 */, 19 }, - /* 7764 */ { MAD_F(0x04b113a1) /* 0.293231610 */, 19 }, - /* 7765 */ { MAD_F(0x04b1486f) /* 0.293281968 */, 19 }, - /* 7766 */ { MAD_F(0x04b17d3d) /* 0.293332329 */, 19 }, - /* 7767 */ { MAD_F(0x04b1b20c) /* 0.293382692 */, 19 }, - /* 7768 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 19 }, - /* 7769 */ { MAD_F(0x04b21bad) /* 0.293483424 */, 19 }, - /* 7770 */ { MAD_F(0x04b2507d) /* 0.293533794 */, 19 }, - /* 7771 */ { MAD_F(0x04b2854f) /* 0.293584165 */, 19 }, - /* 7772 */ { MAD_F(0x04b2ba21) /* 0.293634539 */, 19 }, - /* 7773 */ { MAD_F(0x04b2eef4) /* 0.293684915 */, 19 }, - /* 7774 */ { MAD_F(0x04b323c7) /* 0.293735293 */, 19 }, - /* 7775 */ { MAD_F(0x04b3589b) /* 0.293785673 */, 19 }, - - /* 7776 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 19 }, - /* 7777 */ { MAD_F(0x04b3c244) /* 0.293886440 */, 19 }, - /* 7778 */ { MAD_F(0x04b3f71a) /* 0.293936826 */, 19 }, - /* 7779 */ { MAD_F(0x04b42bf0) /* 0.293987215 */, 19 }, - /* 7780 */ { MAD_F(0x04b460c7) /* 0.294037606 */, 19 }, - /* 7781 */ { MAD_F(0x04b4959e) /* 0.294087999 */, 19 }, - /* 7782 */ { MAD_F(0x04b4ca76) /* 0.294138395 */, 19 }, - /* 7783 */ { MAD_F(0x04b4ff4e) /* 0.294188792 */, 19 }, - /* 7784 */ { MAD_F(0x04b53427) /* 0.294239192 */, 19 }, - /* 7785 */ { MAD_F(0x04b56901) /* 0.294289593 */, 19 }, - /* 7786 */ { MAD_F(0x04b59ddb) /* 0.294339997 */, 19 }, - /* 7787 */ { MAD_F(0x04b5d2b6) /* 0.294390403 */, 19 }, - /* 7788 */ { MAD_F(0x04b60791) /* 0.294440812 */, 19 }, - /* 7789 */ { MAD_F(0x04b63c6d) /* 0.294491222 */, 19 }, - /* 7790 */ { MAD_F(0x04b6714a) /* 0.294541635 */, 19 }, - /* 7791 */ { MAD_F(0x04b6a627) /* 0.294592049 */, 19 }, - - /* 7792 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 19 }, - /* 7793 */ { MAD_F(0x04b70fe3) /* 0.294692885 */, 19 }, - /* 7794 */ { MAD_F(0x04b744c2) /* 0.294743306 */, 19 }, - /* 7795 */ { MAD_F(0x04b779a1) /* 0.294793730 */, 19 }, - /* 7796 */ { MAD_F(0x04b7ae81) /* 0.294844155 */, 19 }, - /* 7797 */ { MAD_F(0x04b7e362) /* 0.294894583 */, 19 }, - /* 7798 */ { MAD_F(0x04b81843) /* 0.294945013 */, 19 }, - /* 7799 */ { MAD_F(0x04b84d24) /* 0.294995445 */, 19 }, - /* 7800 */ { MAD_F(0x04b88207) /* 0.295045879 */, 19 }, - /* 7801 */ { MAD_F(0x04b8b6ea) /* 0.295096315 */, 19 }, - /* 7802 */ { MAD_F(0x04b8ebcd) /* 0.295146753 */, 19 }, - /* 7803 */ { MAD_F(0x04b920b1) /* 0.295197194 */, 19 }, - /* 7804 */ { MAD_F(0x04b95596) /* 0.295247637 */, 19 }, - /* 7805 */ { MAD_F(0x04b98a7b) /* 0.295298082 */, 19 }, - /* 7806 */ { MAD_F(0x04b9bf61) /* 0.295348529 */, 19 }, - /* 7807 */ { MAD_F(0x04b9f447) /* 0.295398978 */, 19 }, - - /* 7808 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 19 }, - /* 7809 */ { MAD_F(0x04ba5e16) /* 0.295499883 */, 19 }, - /* 7810 */ { MAD_F(0x04ba92fe) /* 0.295550338 */, 19 }, - /* 7811 */ { MAD_F(0x04bac7e6) /* 0.295600796 */, 19 }, - /* 7812 */ { MAD_F(0x04bafcd0) /* 0.295651256 */, 19 }, - /* 7813 */ { MAD_F(0x04bb31b9) /* 0.295701718 */, 19 }, - /* 7814 */ { MAD_F(0x04bb66a4) /* 0.295752183 */, 19 }, - /* 7815 */ { MAD_F(0x04bb9b8f) /* 0.295802649 */, 19 }, - /* 7816 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 19 }, - /* 7817 */ { MAD_F(0x04bc0566) /* 0.295903588 */, 19 }, - /* 7818 */ { MAD_F(0x04bc3a53) /* 0.295954061 */, 19 }, - /* 7819 */ { MAD_F(0x04bc6f40) /* 0.296004536 */, 19 }, - /* 7820 */ { MAD_F(0x04bca42e) /* 0.296055013 */, 19 }, - /* 7821 */ { MAD_F(0x04bcd91d) /* 0.296105493 */, 19 }, - /* 7822 */ { MAD_F(0x04bd0e0c) /* 0.296155974 */, 19 }, - /* 7823 */ { MAD_F(0x04bd42fb) /* 0.296206458 */, 19 }, - - /* 7824 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 19 }, - /* 7825 */ { MAD_F(0x04bdacdc) /* 0.296307432 */, 19 }, - /* 7826 */ { MAD_F(0x04bde1ce) /* 0.296357922 */, 19 }, - /* 7827 */ { MAD_F(0x04be16c0) /* 0.296408414 */, 19 }, - /* 7828 */ { MAD_F(0x04be4bb2) /* 0.296458908 */, 19 }, - /* 7829 */ { MAD_F(0x04be80a5) /* 0.296509405 */, 19 }, - /* 7830 */ { MAD_F(0x04beb599) /* 0.296559904 */, 19 }, - /* 7831 */ { MAD_F(0x04beea8d) /* 0.296610404 */, 19 }, - /* 7832 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 19 }, - /* 7833 */ { MAD_F(0x04bf5477) /* 0.296711413 */, 19 }, - /* 7834 */ { MAD_F(0x04bf896d) /* 0.296761920 */, 19 }, - /* 7835 */ { MAD_F(0x04bfbe64) /* 0.296812429 */, 19 }, - /* 7836 */ { MAD_F(0x04bff35b) /* 0.296862941 */, 19 }, - /* 7837 */ { MAD_F(0x04c02852) /* 0.296913455 */, 19 }, - /* 7838 */ { MAD_F(0x04c05d4b) /* 0.296963971 */, 19 }, - /* 7839 */ { MAD_F(0x04c09243) /* 0.297014489 */, 19 }, - - /* 7840 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 19 }, - /* 7841 */ { MAD_F(0x04c0fc37) /* 0.297115531 */, 19 }, - /* 7842 */ { MAD_F(0x04c13131) /* 0.297166056 */, 19 }, - /* 7843 */ { MAD_F(0x04c1662d) /* 0.297216582 */, 19 }, - /* 7844 */ { MAD_F(0x04c19b28) /* 0.297267111 */, 19 }, - /* 7845 */ { MAD_F(0x04c1d025) /* 0.297317642 */, 19 }, - /* 7846 */ { MAD_F(0x04c20521) /* 0.297368175 */, 19 }, - /* 7847 */ { MAD_F(0x04c23a1f) /* 0.297418710 */, 19 }, - /* 7848 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 19 }, - /* 7849 */ { MAD_F(0x04c2a41b) /* 0.297519787 */, 19 }, - /* 7850 */ { MAD_F(0x04c2d91b) /* 0.297570329 */, 19 }, - /* 7851 */ { MAD_F(0x04c30e1a) /* 0.297620873 */, 19 }, - /* 7852 */ { MAD_F(0x04c3431b) /* 0.297671418 */, 19 }, - /* 7853 */ { MAD_F(0x04c3781c) /* 0.297721967 */, 19 }, - /* 7854 */ { MAD_F(0x04c3ad1d) /* 0.297772517 */, 19 }, - /* 7855 */ { MAD_F(0x04c3e21f) /* 0.297823069 */, 19 }, - - /* 7856 */ { MAD_F(0x04c41722) /* 0.297873624 */, 19 }, - /* 7857 */ { MAD_F(0x04c44c25) /* 0.297924180 */, 19 }, - /* 7858 */ { MAD_F(0x04c48129) /* 0.297974739 */, 19 }, - /* 7859 */ { MAD_F(0x04c4b62d) /* 0.298025300 */, 19 }, - /* 7860 */ { MAD_F(0x04c4eb32) /* 0.298075863 */, 19 }, - /* 7861 */ { MAD_F(0x04c52038) /* 0.298126429 */, 19 }, - /* 7862 */ { MAD_F(0x04c5553e) /* 0.298176996 */, 19 }, - /* 7863 */ { MAD_F(0x04c58a44) /* 0.298227565 */, 19 }, - /* 7864 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 19 }, - /* 7865 */ { MAD_F(0x04c5f453) /* 0.298328711 */, 19 }, - /* 7866 */ { MAD_F(0x04c6295c) /* 0.298379287 */, 19 }, - /* 7867 */ { MAD_F(0x04c65e65) /* 0.298429865 */, 19 }, - /* 7868 */ { MAD_F(0x04c6936e) /* 0.298480445 */, 19 }, - /* 7869 */ { MAD_F(0x04c6c878) /* 0.298531028 */, 19 }, - /* 7870 */ { MAD_F(0x04c6fd83) /* 0.298581612 */, 19 }, - /* 7871 */ { MAD_F(0x04c7328e) /* 0.298632199 */, 19 }, - - /* 7872 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 19 }, - /* 7873 */ { MAD_F(0x04c79ca7) /* 0.298733379 */, 19 }, - /* 7874 */ { MAD_F(0x04c7d1b4) /* 0.298783972 */, 19 }, - /* 7875 */ { MAD_F(0x04c806c1) /* 0.298834567 */, 19 }, - /* 7876 */ { MAD_F(0x04c83bcf) /* 0.298885165 */, 19 }, - /* 7877 */ { MAD_F(0x04c870de) /* 0.298935764 */, 19 }, - /* 7878 */ { MAD_F(0x04c8a5ed) /* 0.298986366 */, 19 }, - /* 7879 */ { MAD_F(0x04c8dafd) /* 0.299036970 */, 19 }, - /* 7880 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 19 }, - /* 7881 */ { MAD_F(0x04c9451e) /* 0.299138184 */, 19 }, - /* 7882 */ { MAD_F(0x04c97a30) /* 0.299188794 */, 19 }, - /* 7883 */ { MAD_F(0x04c9af42) /* 0.299239406 */, 19 }, - /* 7884 */ { MAD_F(0x04c9e455) /* 0.299290021 */, 19 }, - /* 7885 */ { MAD_F(0x04ca1968) /* 0.299340638 */, 19 }, - /* 7886 */ { MAD_F(0x04ca4e7c) /* 0.299391256 */, 19 }, - /* 7887 */ { MAD_F(0x04ca8391) /* 0.299441877 */, 19 }, - - /* 7888 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 19 }, - /* 7889 */ { MAD_F(0x04caedbb) /* 0.299543126 */, 19 }, - /* 7890 */ { MAD_F(0x04cb22d1) /* 0.299593753 */, 19 }, - /* 7891 */ { MAD_F(0x04cb57e8) /* 0.299644382 */, 19 }, - /* 7892 */ { MAD_F(0x04cb8d00) /* 0.299695014 */, 19 }, - /* 7893 */ { MAD_F(0x04cbc217) /* 0.299745648 */, 19 }, - /* 7894 */ { MAD_F(0x04cbf730) /* 0.299796284 */, 19 }, - /* 7895 */ { MAD_F(0x04cc2c49) /* 0.299846922 */, 19 }, - /* 7896 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 19 }, - /* 7897 */ { MAD_F(0x04cc967d) /* 0.299948204 */, 19 }, - /* 7898 */ { MAD_F(0x04cccb98) /* 0.299998849 */, 19 }, - /* 7899 */ { MAD_F(0x04cd00b3) /* 0.300049495 */, 19 }, - /* 7900 */ { MAD_F(0x04cd35cf) /* 0.300100144 */, 19 }, - /* 7901 */ { MAD_F(0x04cd6aeb) /* 0.300150795 */, 19 }, - /* 7902 */ { MAD_F(0x04cda008) /* 0.300201448 */, 19 }, - /* 7903 */ { MAD_F(0x04cdd526) /* 0.300252103 */, 19 }, - - /* 7904 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 19 }, - /* 7905 */ { MAD_F(0x04ce3f63) /* 0.300353420 */, 19 }, - /* 7906 */ { MAD_F(0x04ce7482) /* 0.300404082 */, 19 }, - /* 7907 */ { MAD_F(0x04cea9a2) /* 0.300454745 */, 19 }, - /* 7908 */ { MAD_F(0x04cedec3) /* 0.300505411 */, 19 }, - /* 7909 */ { MAD_F(0x04cf13e4) /* 0.300556079 */, 19 }, - /* 7910 */ { MAD_F(0x04cf4906) /* 0.300606749 */, 19 }, - /* 7911 */ { MAD_F(0x04cf7e28) /* 0.300657421 */, 19 }, - /* 7912 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 19 }, - /* 7913 */ { MAD_F(0x04cfe86e) /* 0.300758772 */, 19 }, - /* 7914 */ { MAD_F(0x04d01d92) /* 0.300809451 */, 19 }, - /* 7915 */ { MAD_F(0x04d052b6) /* 0.300860132 */, 19 }, - /* 7916 */ { MAD_F(0x04d087db) /* 0.300910815 */, 19 }, - /* 7917 */ { MAD_F(0x04d0bd01) /* 0.300961500 */, 19 }, - /* 7918 */ { MAD_F(0x04d0f227) /* 0.301012187 */, 19 }, - /* 7919 */ { MAD_F(0x04d1274e) /* 0.301062876 */, 19 }, - - /* 7920 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 19 }, - /* 7921 */ { MAD_F(0x04d1919e) /* 0.301164261 */, 19 }, - /* 7922 */ { MAD_F(0x04d1c6c6) /* 0.301214957 */, 19 }, - /* 7923 */ { MAD_F(0x04d1fbef) /* 0.301265655 */, 19 }, - /* 7924 */ { MAD_F(0x04d23119) /* 0.301316355 */, 19 }, - /* 7925 */ { MAD_F(0x04d26643) /* 0.301367057 */, 19 }, - /* 7926 */ { MAD_F(0x04d29b6e) /* 0.301417761 */, 19 }, - /* 7927 */ { MAD_F(0x04d2d099) /* 0.301468468 */, 19 }, - /* 7928 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 19 }, - /* 7929 */ { MAD_F(0x04d33af2) /* 0.301569887 */, 19 }, - /* 7930 */ { MAD_F(0x04d3701f) /* 0.301620599 */, 19 }, - /* 7931 */ { MAD_F(0x04d3a54d) /* 0.301671314 */, 19 }, - /* 7932 */ { MAD_F(0x04d3da7b) /* 0.301722031 */, 19 }, - /* 7933 */ { MAD_F(0x04d40faa) /* 0.301772751 */, 19 }, - /* 7934 */ { MAD_F(0x04d444d9) /* 0.301823472 */, 19 }, - /* 7935 */ { MAD_F(0x04d47a09) /* 0.301874195 */, 19 }, - - /* 7936 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 19 }, - /* 7937 */ { MAD_F(0x04d4e46b) /* 0.301975649 */, 19 }, - /* 7938 */ { MAD_F(0x04d5199c) /* 0.302026378 */, 19 }, - /* 7939 */ { MAD_F(0x04d54ecf) /* 0.302077110 */, 19 }, - /* 7940 */ { MAD_F(0x04d58401) /* 0.302127845 */, 19 }, - /* 7941 */ { MAD_F(0x04d5b935) /* 0.302178581 */, 19 }, - /* 7942 */ { MAD_F(0x04d5ee69) /* 0.302229319 */, 19 }, - /* 7943 */ { MAD_F(0x04d6239d) /* 0.302280060 */, 19 }, - /* 7944 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 19 }, - /* 7945 */ { MAD_F(0x04d68e08) /* 0.302381547 */, 19 }, - /* 7946 */ { MAD_F(0x04d6c33e) /* 0.302432294 */, 19 }, - /* 7947 */ { MAD_F(0x04d6f875) /* 0.302483043 */, 19 }, - /* 7948 */ { MAD_F(0x04d72dad) /* 0.302533794 */, 19 }, - /* 7949 */ { MAD_F(0x04d762e5) /* 0.302584547 */, 19 }, - /* 7950 */ { MAD_F(0x04d7981d) /* 0.302635303 */, 19 }, - /* 7951 */ { MAD_F(0x04d7cd56) /* 0.302686060 */, 19 }, - - /* 7952 */ { MAD_F(0x04d80290) /* 0.302736820 */, 19 }, - /* 7953 */ { MAD_F(0x04d837ca) /* 0.302787581 */, 19 }, - /* 7954 */ { MAD_F(0x04d86d05) /* 0.302838345 */, 19 }, - /* 7955 */ { MAD_F(0x04d8a240) /* 0.302889111 */, 19 }, - /* 7956 */ { MAD_F(0x04d8d77c) /* 0.302939879 */, 19 }, - /* 7957 */ { MAD_F(0x04d90cb9) /* 0.302990650 */, 19 }, - /* 7958 */ { MAD_F(0x04d941f6) /* 0.303041422 */, 19 }, - /* 7959 */ { MAD_F(0x04d97734) /* 0.303092197 */, 19 }, - /* 7960 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 19 }, - /* 7961 */ { MAD_F(0x04d9e1b1) /* 0.303193752 */, 19 }, - /* 7962 */ { MAD_F(0x04da16f0) /* 0.303244533 */, 19 }, - /* 7963 */ { MAD_F(0x04da4c30) /* 0.303295316 */, 19 }, - /* 7964 */ { MAD_F(0x04da8171) /* 0.303346101 */, 19 }, - /* 7965 */ { MAD_F(0x04dab6b2) /* 0.303396889 */, 19 }, - /* 7966 */ { MAD_F(0x04daebf4) /* 0.303447678 */, 19 }, - /* 7967 */ { MAD_F(0x04db2136) /* 0.303498469 */, 19 }, - - /* 7968 */ { MAD_F(0x04db5679) /* 0.303549263 */, 19 }, - /* 7969 */ { MAD_F(0x04db8bbc) /* 0.303600059 */, 19 }, - /* 7970 */ { MAD_F(0x04dbc100) /* 0.303650857 */, 19 }, - /* 7971 */ { MAD_F(0x04dbf644) /* 0.303701657 */, 19 }, - /* 7972 */ { MAD_F(0x04dc2b8a) /* 0.303752459 */, 19 }, - /* 7973 */ { MAD_F(0x04dc60cf) /* 0.303803263 */, 19 }, - /* 7974 */ { MAD_F(0x04dc9616) /* 0.303854070 */, 19 }, - /* 7975 */ { MAD_F(0x04dccb5c) /* 0.303904878 */, 19 }, - /* 7976 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 19 }, - /* 7977 */ { MAD_F(0x04dd35ec) /* 0.304006502 */, 19 }, - /* 7978 */ { MAD_F(0x04dd6b34) /* 0.304057317 */, 19 }, - /* 7979 */ { MAD_F(0x04dda07d) /* 0.304108134 */, 19 }, - /* 7980 */ { MAD_F(0x04ddd5c7) /* 0.304158953 */, 19 }, - /* 7981 */ { MAD_F(0x04de0b11) /* 0.304209774 */, 19 }, - /* 7982 */ { MAD_F(0x04de405c) /* 0.304260597 */, 19 }, - /* 7983 */ { MAD_F(0x04de75a7) /* 0.304311423 */, 19 }, - - /* 7984 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 19 }, - /* 7985 */ { MAD_F(0x04dee040) /* 0.304413080 */, 19 }, - /* 7986 */ { MAD_F(0x04df158d) /* 0.304463912 */, 19 }, - /* 7987 */ { MAD_F(0x04df4adb) /* 0.304514746 */, 19 }, - /* 7988 */ { MAD_F(0x04df8029) /* 0.304565582 */, 19 }, - /* 7989 */ { MAD_F(0x04dfb578) /* 0.304616421 */, 19 }, - /* 7990 */ { MAD_F(0x04dfeac7) /* 0.304667261 */, 19 }, - /* 7991 */ { MAD_F(0x04e02017) /* 0.304718103 */, 19 }, - /* 7992 */ { MAD_F(0x04e05567) /* 0.304768948 */, 19 }, - /* 7993 */ { MAD_F(0x04e08ab8) /* 0.304819795 */, 19 }, - /* 7994 */ { MAD_F(0x04e0c00a) /* 0.304870644 */, 19 }, - /* 7995 */ { MAD_F(0x04e0f55c) /* 0.304921495 */, 19 }, - /* 7996 */ { MAD_F(0x04e12aaf) /* 0.304972348 */, 19 }, - /* 7997 */ { MAD_F(0x04e16002) /* 0.305023203 */, 19 }, - /* 7998 */ { MAD_F(0x04e19556) /* 0.305074060 */, 19 }, - /* 7999 */ { MAD_F(0x04e1caab) /* 0.305124920 */, 19 }, - - /* 8000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 19 }, - /* 8001 */ { MAD_F(0x04e23555) /* 0.305226645 */, 19 }, - /* 8002 */ { MAD_F(0x04e26aac) /* 0.305277511 */, 19 }, - /* 8003 */ { MAD_F(0x04e2a002) /* 0.305328379 */, 19 }, - /* 8004 */ { MAD_F(0x04e2d55a) /* 0.305379249 */, 19 }, - /* 8005 */ { MAD_F(0x04e30ab2) /* 0.305430121 */, 19 }, - /* 8006 */ { MAD_F(0x04e3400a) /* 0.305480995 */, 19 }, - /* 8007 */ { MAD_F(0x04e37563) /* 0.305531872 */, 19 }, - /* 8008 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 19 }, - /* 8009 */ { MAD_F(0x04e3e017) /* 0.305633631 */, 19 }, - /* 8010 */ { MAD_F(0x04e41572) /* 0.305684513 */, 19 }, - /* 8011 */ { MAD_F(0x04e44acd) /* 0.305735398 */, 19 }, - /* 8012 */ { MAD_F(0x04e48029) /* 0.305786285 */, 19 }, - /* 8013 */ { MAD_F(0x04e4b585) /* 0.305837174 */, 19 }, - /* 8014 */ { MAD_F(0x04e4eae2) /* 0.305888066 */, 19 }, - /* 8015 */ { MAD_F(0x04e52040) /* 0.305938959 */, 19 }, - - /* 8016 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 19 }, - /* 8017 */ { MAD_F(0x04e58afd) /* 0.306040752 */, 19 }, - /* 8018 */ { MAD_F(0x04e5c05c) /* 0.306091652 */, 19 }, - /* 8019 */ { MAD_F(0x04e5f5bc) /* 0.306142554 */, 19 }, - /* 8020 */ { MAD_F(0x04e62b1c) /* 0.306193457 */, 19 }, - /* 8021 */ { MAD_F(0x04e6607d) /* 0.306244364 */, 19 }, - /* 8022 */ { MAD_F(0x04e695df) /* 0.306295272 */, 19 }, - /* 8023 */ { MAD_F(0x04e6cb41) /* 0.306346182 */, 19 }, - /* 8024 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 19 }, - /* 8025 */ { MAD_F(0x04e73607) /* 0.306448009 */, 19 }, - /* 8026 */ { MAD_F(0x04e76b6b) /* 0.306498925 */, 19 }, - /* 8027 */ { MAD_F(0x04e7a0cf) /* 0.306549844 */, 19 }, - /* 8028 */ { MAD_F(0x04e7d634) /* 0.306600765 */, 19 }, - /* 8029 */ { MAD_F(0x04e80b99) /* 0.306651688 */, 19 }, - /* 8030 */ { MAD_F(0x04e84100) /* 0.306702613 */, 19 }, - /* 8031 */ { MAD_F(0x04e87666) /* 0.306753540 */, 19 }, - - /* 8032 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 19 }, - /* 8033 */ { MAD_F(0x04e8e135) /* 0.306855401 */, 19 }, - /* 8034 */ { MAD_F(0x04e9169e) /* 0.306906334 */, 19 }, - /* 8035 */ { MAD_F(0x04e94c07) /* 0.306957270 */, 19 }, - /* 8036 */ { MAD_F(0x04e98170) /* 0.307008208 */, 19 }, - /* 8037 */ { MAD_F(0x04e9b6da) /* 0.307059148 */, 19 }, - /* 8038 */ { MAD_F(0x04e9ec45) /* 0.307110090 */, 19 }, - /* 8039 */ { MAD_F(0x04ea21b0) /* 0.307161034 */, 19 }, - /* 8040 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 19 }, - /* 8041 */ { MAD_F(0x04ea8c88) /* 0.307262928 */, 19 }, - /* 8042 */ { MAD_F(0x04eac1f5) /* 0.307313879 */, 19 }, - /* 8043 */ { MAD_F(0x04eaf762) /* 0.307364831 */, 19 }, - /* 8044 */ { MAD_F(0x04eb2cd0) /* 0.307415786 */, 19 }, - /* 8045 */ { MAD_F(0x04eb623f) /* 0.307466743 */, 19 }, - /* 8046 */ { MAD_F(0x04eb97ae) /* 0.307517702 */, 19 }, - /* 8047 */ { MAD_F(0x04ebcd1e) /* 0.307568663 */, 19 }, - - /* 8048 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 19 }, - /* 8049 */ { MAD_F(0x04ec37ff) /* 0.307670591 */, 19 }, - /* 8050 */ { MAD_F(0x04ec6d71) /* 0.307721558 */, 19 }, - /* 8051 */ { MAD_F(0x04eca2e3) /* 0.307772528 */, 19 }, - /* 8052 */ { MAD_F(0x04ecd855) /* 0.307823499 */, 19 }, - /* 8053 */ { MAD_F(0x04ed0dc8) /* 0.307874473 */, 19 }, - /* 8054 */ { MAD_F(0x04ed433c) /* 0.307925449 */, 19 }, - /* 8055 */ { MAD_F(0x04ed78b0) /* 0.307976426 */, 19 }, - /* 8056 */ { MAD_F(0x04edae25) /* 0.308027406 */, 19 }, - /* 8057 */ { MAD_F(0x04ede39a) /* 0.308078389 */, 19 }, - /* 8058 */ { MAD_F(0x04ee1910) /* 0.308129373 */, 19 }, - /* 8059 */ { MAD_F(0x04ee4e87) /* 0.308180359 */, 19 }, - /* 8060 */ { MAD_F(0x04ee83fe) /* 0.308231347 */, 19 }, - /* 8061 */ { MAD_F(0x04eeb976) /* 0.308282338 */, 19 }, - /* 8062 */ { MAD_F(0x04eeeeee) /* 0.308333331 */, 19 }, - /* 8063 */ { MAD_F(0x04ef2467) /* 0.308384325 */, 19 }, - - /* 8064 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 19 }, - /* 8065 */ { MAD_F(0x04ef8f5a) /* 0.308486321 */, 19 }, - /* 8066 */ { MAD_F(0x04efc4d5) /* 0.308537322 */, 19 }, - /* 8067 */ { MAD_F(0x04effa50) /* 0.308588325 */, 19 }, - /* 8068 */ { MAD_F(0x04f02fcb) /* 0.308639331 */, 19 }, - /* 8069 */ { MAD_F(0x04f06547) /* 0.308690338 */, 19 }, - /* 8070 */ { MAD_F(0x04f09ac4) /* 0.308741348 */, 19 }, - /* 8071 */ { MAD_F(0x04f0d041) /* 0.308792359 */, 19 }, - /* 8072 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 19 }, - /* 8073 */ { MAD_F(0x04f13b3e) /* 0.308894389 */, 19 }, - /* 8074 */ { MAD_F(0x04f170bd) /* 0.308945407 */, 19 }, - /* 8075 */ { MAD_F(0x04f1a63c) /* 0.308996427 */, 19 }, - /* 8076 */ { MAD_F(0x04f1dbbd) /* 0.309047449 */, 19 }, - /* 8077 */ { MAD_F(0x04f2113d) /* 0.309098473 */, 19 }, - /* 8078 */ { MAD_F(0x04f246bf) /* 0.309149499 */, 19 }, - /* 8079 */ { MAD_F(0x04f27c40) /* 0.309200528 */, 19 }, - - /* 8080 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 19 }, - /* 8081 */ { MAD_F(0x04f2e746) /* 0.309302591 */, 19 }, - /* 8082 */ { MAD_F(0x04f31cc9) /* 0.309353626 */, 19 }, - /* 8083 */ { MAD_F(0x04f3524d) /* 0.309404663 */, 19 }, - /* 8084 */ { MAD_F(0x04f387d2) /* 0.309455702 */, 19 }, - /* 8085 */ { MAD_F(0x04f3bd57) /* 0.309506743 */, 19 }, - /* 8086 */ { MAD_F(0x04f3f2dd) /* 0.309557786 */, 19 }, - /* 8087 */ { MAD_F(0x04f42864) /* 0.309608831 */, 19 }, - /* 8088 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 19 }, - /* 8089 */ { MAD_F(0x04f49372) /* 0.309710928 */, 19 }, - /* 8090 */ { MAD_F(0x04f4c8fa) /* 0.309761980 */, 19 }, - /* 8091 */ { MAD_F(0x04f4fe83) /* 0.309813033 */, 19 }, - /* 8092 */ { MAD_F(0x04f5340c) /* 0.309864089 */, 19 }, - /* 8093 */ { MAD_F(0x04f56996) /* 0.309915147 */, 19 }, - /* 8094 */ { MAD_F(0x04f59f20) /* 0.309966207 */, 19 }, - /* 8095 */ { MAD_F(0x04f5d4ab) /* 0.310017269 */, 19 }, - - /* 8096 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 19 }, - /* 8097 */ { MAD_F(0x04f63fc2) /* 0.310119400 */, 19 }, - /* 8098 */ { MAD_F(0x04f6754f) /* 0.310170468 */, 19 }, - /* 8099 */ { MAD_F(0x04f6aadc) /* 0.310221539 */, 19 }, - /* 8100 */ { MAD_F(0x04f6e06a) /* 0.310272611 */, 19 }, - /* 8101 */ { MAD_F(0x04f715f8) /* 0.310323686 */, 19 }, - /* 8102 */ { MAD_F(0x04f74b87) /* 0.310374763 */, 19 }, - /* 8103 */ { MAD_F(0x04f78116) /* 0.310425842 */, 19 }, - /* 8104 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 19 }, - /* 8105 */ { MAD_F(0x04f7ec37) /* 0.310528006 */, 19 }, - /* 8106 */ { MAD_F(0x04f821c8) /* 0.310579091 */, 19 }, - /* 8107 */ { MAD_F(0x04f85759) /* 0.310630179 */, 19 }, - /* 8108 */ { MAD_F(0x04f88cec) /* 0.310681268 */, 19 }, - /* 8109 */ { MAD_F(0x04f8c27e) /* 0.310732360 */, 19 }, - /* 8110 */ { MAD_F(0x04f8f812) /* 0.310783453 */, 19 }, - /* 8111 */ { MAD_F(0x04f92da6) /* 0.310834549 */, 19 }, - - /* 8112 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 19 }, - /* 8113 */ { MAD_F(0x04f998cf) /* 0.310936747 */, 19 }, - /* 8114 */ { MAD_F(0x04f9ce65) /* 0.310987849 */, 19 }, - /* 8115 */ { MAD_F(0x04fa03fb) /* 0.311038953 */, 19 }, - /* 8116 */ { MAD_F(0x04fa3992) /* 0.311090059 */, 19 }, - /* 8117 */ { MAD_F(0x04fa6f29) /* 0.311141168 */, 19 }, - /* 8118 */ { MAD_F(0x04faa4c1) /* 0.311192278 */, 19 }, - /* 8119 */ { MAD_F(0x04fada59) /* 0.311243390 */, 19 }, - /* 8120 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 19 }, - /* 8121 */ { MAD_F(0x04fb458c) /* 0.311345622 */, 19 }, - /* 8122 */ { MAD_F(0x04fb7b26) /* 0.311396741 */, 19 }, - /* 8123 */ { MAD_F(0x04fbb0c1) /* 0.311447862 */, 19 }, - /* 8124 */ { MAD_F(0x04fbe65c) /* 0.311498985 */, 19 }, - /* 8125 */ { MAD_F(0x04fc1bf8) /* 0.311550110 */, 19 }, - /* 8126 */ { MAD_F(0x04fc5194) /* 0.311601237 */, 19 }, - /* 8127 */ { MAD_F(0x04fc8731) /* 0.311652366 */, 19 }, - - /* 8128 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 19 }, - /* 8129 */ { MAD_F(0x04fcf26c) /* 0.311754631 */, 19 }, - /* 8130 */ { MAD_F(0x04fd280b) /* 0.311805767 */, 19 }, - /* 8131 */ { MAD_F(0x04fd5daa) /* 0.311856905 */, 19 }, - /* 8132 */ { MAD_F(0x04fd934a) /* 0.311908044 */, 19 }, - /* 8133 */ { MAD_F(0x04fdc8ea) /* 0.311959186 */, 19 }, - /* 8134 */ { MAD_F(0x04fdfe8b) /* 0.312010330 */, 19 }, - /* 8135 */ { MAD_F(0x04fe342c) /* 0.312061476 */, 19 }, - /* 8136 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 19 }, - /* 8137 */ { MAD_F(0x04fe9f71) /* 0.312163775 */, 19 }, - /* 8138 */ { MAD_F(0x04fed514) /* 0.312214927 */, 19 }, - /* 8139 */ { MAD_F(0x04ff0ab8) /* 0.312266082 */, 19 }, - /* 8140 */ { MAD_F(0x04ff405c) /* 0.312317238 */, 19 }, - /* 8141 */ { MAD_F(0x04ff7601) /* 0.312368397 */, 19 }, - /* 8142 */ { MAD_F(0x04ffaba6) /* 0.312419558 */, 19 }, - /* 8143 */ { MAD_F(0x04ffe14c) /* 0.312470720 */, 19 }, - - /* 8144 */ { MAD_F(0x050016f3) /* 0.312521885 */, 19 }, - /* 8145 */ { MAD_F(0x05004c9a) /* 0.312573052 */, 19 }, - /* 8146 */ { MAD_F(0x05008241) /* 0.312624222 */, 19 }, - /* 8147 */ { MAD_F(0x0500b7e9) /* 0.312675393 */, 19 }, - /* 8148 */ { MAD_F(0x0500ed92) /* 0.312726566 */, 19 }, - /* 8149 */ { MAD_F(0x0501233b) /* 0.312777742 */, 19 }, - /* 8150 */ { MAD_F(0x050158e5) /* 0.312828919 */, 19 }, - /* 8151 */ { MAD_F(0x05018e90) /* 0.312880099 */, 19 }, - /* 8152 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 19 }, - /* 8153 */ { MAD_F(0x0501f9e6) /* 0.312982464 */, 19 }, - /* 8154 */ { MAD_F(0x05022f92) /* 0.313033650 */, 19 }, - /* 8155 */ { MAD_F(0x0502653f) /* 0.313084838 */, 19 }, - /* 8156 */ { MAD_F(0x05029aec) /* 0.313136028 */, 19 }, - /* 8157 */ { MAD_F(0x0502d09a) /* 0.313187220 */, 19 }, - /* 8158 */ { MAD_F(0x05030648) /* 0.313238414 */, 19 }, - /* 8159 */ { MAD_F(0x05033bf7) /* 0.313289611 */, 19 }, - - /* 8160 */ { MAD_F(0x050371a7) /* 0.313340809 */, 19 }, - /* 8161 */ { MAD_F(0x0503a757) /* 0.313392010 */, 19 }, - /* 8162 */ { MAD_F(0x0503dd07) /* 0.313443212 */, 19 }, - /* 8163 */ { MAD_F(0x050412b9) /* 0.313494417 */, 19 }, - /* 8164 */ { MAD_F(0x0504486a) /* 0.313545624 */, 19 }, - /* 8165 */ { MAD_F(0x05047e1d) /* 0.313596833 */, 19 }, - /* 8166 */ { MAD_F(0x0504b3cf) /* 0.313648044 */, 19 }, - /* 8167 */ { MAD_F(0x0504e983) /* 0.313699257 */, 19 }, - /* 8168 */ { MAD_F(0x05051f37) /* 0.313750472 */, 19 }, - /* 8169 */ { MAD_F(0x050554eb) /* 0.313801689 */, 19 }, - /* 8170 */ { MAD_F(0x05058aa0) /* 0.313852909 */, 19 }, - /* 8171 */ { MAD_F(0x0505c056) /* 0.313904130 */, 19 }, - /* 8172 */ { MAD_F(0x0505f60c) /* 0.313955354 */, 19 }, - /* 8173 */ { MAD_F(0x05062bc3) /* 0.314006579 */, 19 }, - /* 8174 */ { MAD_F(0x0506617a) /* 0.314057807 */, 19 }, - /* 8175 */ { MAD_F(0x05069732) /* 0.314109037 */, 19 }, - - /* 8176 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 19 }, - /* 8177 */ { MAD_F(0x050702a4) /* 0.314211502 */, 19 }, - /* 8178 */ { MAD_F(0x0507385d) /* 0.314262739 */, 19 }, - /* 8179 */ { MAD_F(0x05076e17) /* 0.314313977 */, 19 }, - /* 8180 */ { MAD_F(0x0507a3d2) /* 0.314365217 */, 19 }, - /* 8181 */ { MAD_F(0x0507d98d) /* 0.314416459 */, 19 }, - /* 8182 */ { MAD_F(0x05080f49) /* 0.314467704 */, 19 }, - /* 8183 */ { MAD_F(0x05084506) /* 0.314518950 */, 19 }, - /* 8184 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 19 }, - /* 8185 */ { MAD_F(0x0508b080) /* 0.314621449 */, 19 }, - /* 8186 */ { MAD_F(0x0508e63e) /* 0.314672702 */, 19 }, - /* 8187 */ { MAD_F(0x05091bfd) /* 0.314723957 */, 19 }, - /* 8188 */ { MAD_F(0x050951bc) /* 0.314775214 */, 19 }, - /* 8189 */ { MAD_F(0x0509877c) /* 0.314826473 */, 19 }, - /* 8190 */ { MAD_F(0x0509bd3c) /* 0.314877734 */, 19 }, - /* 8191 */ { MAD_F(0x0509f2fd) /* 0.314928997 */, 19 }, - - /* 8192 */ { MAD_F(0x050a28be) /* 0.314980262 */, 19 }, - /* 8193 */ { MAD_F(0x050a5e80) /* 0.315031530 */, 19 }, - /* 8194 */ { MAD_F(0x050a9443) /* 0.315082799 */, 19 }, - /* 8195 */ { MAD_F(0x050aca06) /* 0.315134071 */, 19 }, - /* 8196 */ { MAD_F(0x050affc9) /* 0.315185344 */, 19 }, - /* 8197 */ { MAD_F(0x050b358e) /* 0.315236620 */, 19 }, - /* 8198 */ { MAD_F(0x050b6b52) /* 0.315287898 */, 19 }, - /* 8199 */ { MAD_F(0x050ba118) /* 0.315339178 */, 19 }, - /* 8200 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 19 }, - /* 8201 */ { MAD_F(0x050c0ca4) /* 0.315441744 */, 19 }, - /* 8202 */ { MAD_F(0x050c426b) /* 0.315493030 */, 19 }, - /* 8203 */ { MAD_F(0x050c7833) /* 0.315544318 */, 19 }, - /* 8204 */ { MAD_F(0x050cadfb) /* 0.315595608 */, 19 }, - /* 8205 */ { MAD_F(0x050ce3c4) /* 0.315646901 */, 19 }, - /* 8206 */ { MAD_F(0x050d198d) /* 0.315698195 */, 19 } + This is the lookup table used to compute x^(4/3) for Layer III + requantization. To maintain the best possible accuracy, the value is + stored as a normalized mantissa with exponent. The requantization + algorithm recombines these parts with appropriate scaling. +*/ + +/* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, +/* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, +/* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, +/* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, +/* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, +/* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, +/* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, +/* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, +/* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, +/* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, +/* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, +/* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, +/* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, +/* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, +/* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, +/* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, + +/* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, +/* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, +/* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, +/* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, +/* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, +/* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, +/* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, +/* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, +/* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, +/* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, +/* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, +/* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, +/* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, +/* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, +/* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, +/* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, + +/* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, +/* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, +/* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, +/* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, +/* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, +/* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, +/* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, +/* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, +/* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, +/* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, +/* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, +/* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, +/* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, +/* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, +/* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, +/* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, + +/* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, +/* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, +/* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, +/* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, +/* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, +/* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, +/* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, +/* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, +/* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, +/* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, +/* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, +/* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, +/* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, +/* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, +/* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, +/* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, + +/* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, +/* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, +/* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, +/* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, +/* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, +/* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, +/* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, +/* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, +/* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, +/* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, +/* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, +/* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, +/* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, +/* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, +/* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, +/* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, + +/* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, +/* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, +/* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, +/* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, +/* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, +/* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, +/* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, +/* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, +/* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, +/* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, +/* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, +/* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, +/* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, +/* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, +/* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, +/* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, + +/* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, +/* 97 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 10 }, +/* 98 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 10 }, +/* 99 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 10 }, +/* 100 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 10 }, +/* 101 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 10 }, +/* 102 */ { MAD_F(0x07724f64) /* 0.465407744 */, 10 }, +/* 103 */ { MAD_F(0x078b4514) /* 0.471501425 */, 10 }, +/* 104 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 10 }, +/* 105 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 10 }, +/* 106 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 10 }, +/* 107 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 10 }, +/* 108 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 11 }, +/* 109 */ { MAD_F(0x04115aca) /* 0.254236974 */, 11 }, +/* 110 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 11 }, +/* 111 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 11 }, + +/* 112 */ { MAD_F(0x0437be65) /* 0.263609310 */, 11 }, +/* 113 */ { MAD_F(0x04449dee) /* 0.266752177 */, 11 }, +/* 114 */ { MAD_F(0x04518733) /* 0.269904329 */, 11 }, +/* 115 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 11 }, +/* 116 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 11 }, +/* 117 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 11 }, +/* 118 */ { MAD_F(0x04858c83) /* 0.282604707 */, 11 }, +/* 119 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 11 }, +/* 120 */ { MAD_F(0x049fc824) /* 0.289009227 */, 11 }, +/* 121 */ { MAD_F(0x04acf402) /* 0.292224893 */, 11 }, +/* 122 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 11 }, +/* 123 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 11 }, +/* 124 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 11 }, +/* 125 */ { MAD_F(0x04e20000) /* 0.305175781 */, 11 }, +/* 126 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 11 }, +/* 127 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 11 }, + +/* 128 */ { MAD_F(0x050a28be) /* 0.314980262 */, 11 }, +/* 129 */ { MAD_F(0x05179da4) /* 0.318265572 */, 11 }, +/* 130 */ { MAD_F(0x05251b73) /* 0.321559381 */, 11 }, +/* 131 */ { MAD_F(0x0532a220) /* 0.324861647 */, 11 }, +/* 132 */ { MAD_F(0x054031a0) /* 0.328172327 */, 11 }, +/* 133 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 11 }, +/* 134 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 11 }, +/* 135 */ { MAD_F(0x0569149c) /* 0.338154423 */, 11 }, +/* 136 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 11 }, +/* 137 */ { MAD_F(0x058481e9) /* 0.344850455 */, 11 }, +/* 138 */ { MAD_F(0x0592456d) /* 0.348210741 */, 11 }, +/* 139 */ { MAD_F(0x05a01176) /* 0.351579152 */, 11 }, +/* 140 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 11 }, +/* 141 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 11 }, +/* 142 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 11 }, +/* 143 */ { MAD_F(0x05d79601) /* 0.365133291 */, 11 }, + +/* 144 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 11 }, +/* 145 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 11 }, +/* 146 */ { MAD_F(0x060190ee) /* 0.375382356 */, 11 }, +/* 147 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 11 }, +/* 148 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 11 }, +/* 149 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 11 }, +/* 150 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 11 }, +/* 151 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 11 }, +/* 152 */ { MAD_F(0x06566361) /* 0.396090870 */, 11 }, +/* 153 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 11 }, +/* 154 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 11 }, +/* 155 */ { MAD_F(0x068138f3) /* 0.406548452 */, 11 }, +/* 156 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 11 }, +/* 157 */ { MAD_F(0x069deed1) /* 0.413557833 */, 11 }, +/* 158 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 11 }, +/* 159 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 11 }, + +/* 160 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 11 }, +/* 161 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 11 }, +/* 162 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 11 }, +/* 163 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 11 }, +/* 164 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 11 }, +/* 165 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 11 }, +/* 166 */ { MAD_F(0x0720a087) /* 0.445465593 */, 11 }, +/* 167 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 11 }, +/* 168 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 11 }, +/* 169 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 11 }, +/* 170 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 11 }, +/* 171 */ { MAD_F(0x076a454c) /* 0.463444993 */, 11 }, +/* 172 */ { MAD_F(0x07791620) /* 0.467062117 */, 11 }, +/* 173 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 11 }, +/* 174 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 11 }, +/* 175 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 11 }, + +/* 176 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 11 }, +/* 177 */ { MAD_F(0x07c39812) /* 0.485252449 */, 11 }, +/* 178 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 11 }, +/* 179 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 11 }, +/* 180 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 11 }, +/* 181 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 11 }, +/* 182 */ { MAD_F(0x0407673f) /* 0.251807447 */, 12 }, +/* 183 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 12 }, +/* 184 */ { MAD_F(0x04168b05) /* 0.255503674 */, 12 }, +/* 185 */ { MAD_F(0x041e2230) /* 0.257356825 */, 12 }, +/* 186 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 12 }, +/* 187 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 12 }, +/* 188 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 12 }, +/* 189 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 12 }, +/* 190 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 12 }, +/* 191 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 12 }, + +/* 192 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 12 }, +/* 193 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 12 }, +/* 194 */ { MAD_F(0x04630eed) /* 0.274184158 */, 12 }, +/* 195 */ { MAD_F(0x046ac896) /* 0.276070203 */, 12 }, +/* 196 */ { MAD_F(0x047285a2) /* 0.277959474 */, 12 }, +/* 197 */ { MAD_F(0x047a460c) /* 0.279851960 */, 12 }, +/* 198 */ { MAD_F(0x048209d3) /* 0.281747652 */, 12 }, +/* 199 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 12 }, +/* 200 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 12 }, +/* 201 */ { MAD_F(0x04996935) /* 0.287453849 */, 12 }, +/* 202 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 12 }, +/* 203 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 12 }, +/* 204 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 12 }, +/* 205 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 12 }, +/* 206 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 12 }, +/* 207 */ { MAD_F(0x04c88135) /* 0.298951346 */, 12 }, + +/* 208 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 12 }, +/* 209 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 12 }, +/* 210 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 12 }, +/* 211 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 12 }, +/* 212 */ { MAD_F(0x04f01963) /* 0.308617963 */, 12 }, +/* 213 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 12 }, +/* 214 */ { MAD_F(0x05000655) /* 0.312506041 */, 12 }, +/* 215 */ { MAD_F(0x05080195) /* 0.314454634 */, 12 }, +/* 216 */ { MAD_F(0x05100000) /* 0.316406250 */, 12 }, +/* 217 */ { MAD_F(0x05180194) /* 0.318360880 */, 12 }, +/* 218 */ { MAD_F(0x0520064f) /* 0.320318516 */, 12 }, +/* 219 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 12 }, +/* 220 */ { MAD_F(0x0530192e) /* 0.324242764 */, 12 }, +/* 221 */ { MAD_F(0x0538274e) /* 0.326209359 */, 12 }, +/* 222 */ { MAD_F(0x0540388a) /* 0.328178922 */, 12 }, +/* 223 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 12 }, + +/* 224 */ { MAD_F(0x05506451) /* 0.332126919 */, 12 }, +/* 225 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 12 }, +/* 226 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 12 }, +/* 227 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 12 }, +/* 228 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 12 }, +/* 229 */ { MAD_F(0x05790793) /* 0.342048241 */, 12 }, +/* 230 */ { MAD_F(0x05813162) /* 0.344041237 */, 12 }, +/* 231 */ { MAD_F(0x05895e39) /* 0.346037122 */, 12 }, +/* 232 */ { MAD_F(0x05918e15) /* 0.348035890 */, 12 }, +/* 233 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 12 }, +/* 234 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 12 }, +/* 235 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 12 }, +/* 236 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 12 }, +/* 237 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 12 }, +/* 238 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 12 }, +/* 239 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 12 }, + +/* 240 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 12 }, +/* 241 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 12 }, +/* 242 */ { MAD_F(0x05e41105) /* 0.368180294 */, 12 }, +/* 243 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 12 }, +/* 244 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 12 }, +/* 245 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 12 }, +/* 246 */ { MAD_F(0x060564b1) /* 0.376316732 */, 12 }, +/* 247 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 12 }, +/* 248 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 12 }, +/* 249 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 12 }, +/* 250 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 12 }, +/* 251 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 12 }, +/* 252 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 12 }, +/* 253 */ { MAD_F(0x06402666) /* 0.390661620 */, 12 }, +/* 254 */ { MAD_F(0x064896a7) /* 0.392721798 */, 12 }, +/* 255 */ { MAD_F(0x065109be) /* 0.394784681 */, 12 }, + +/* 256 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 12 }, +/* 257 */ { MAD_F(0x0661f867) /* 0.398918536 */, 12 }, +/* 258 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 12 }, +/* 259 */ { MAD_F(0x0672f252) /* 0.403063128 */, 12 }, +/* 260 */ { MAD_F(0x067b737c) /* 0.405139433 */, 12 }, +/* 261 */ { MAD_F(0x0683f771) /* 0.407218402 */, 12 }, +/* 262 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 12 }, +/* 263 */ { MAD_F(0x069507b5) /* 0.411384303 */, 12 }, +/* 264 */ { MAD_F(0x069d9400) /* 0.413471222 */, 12 }, +/* 265 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 12 }, +/* 266 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 12 }, +/* 267 */ { MAD_F(0x06b74971) /* 0.419747773 */, 12 }, +/* 268 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 12 }, +/* 269 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 12 }, +/* 270 */ { MAD_F(0x06d11794) /* 0.426047876 */, 12 }, +/* 271 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 12 }, + +/* 272 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 12 }, +/* 273 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 12 }, +/* 274 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 12 }, +/* 275 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 12 }, +/* 276 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 12 }, +/* 277 */ { MAD_F(0x070dacea) /* 0.440838732 */, 12 }, +/* 278 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 12 }, +/* 279 */ { MAD_F(0x071f1459) /* 0.445087765 */, 12 }, +/* 280 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 12 }, +/* 281 */ { MAD_F(0x07308671) /* 0.449346964 */, 12 }, +/* 282 */ { MAD_F(0x07394378) /* 0.451480360 */, 12 }, +/* 283 */ { MAD_F(0x07420325) /* 0.453616280 */, 12 }, +/* 284 */ { MAD_F(0x074ac575) /* 0.455754717 */, 12 }, +/* 285 */ { MAD_F(0x07538a67) /* 0.457895665 */, 12 }, +/* 286 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 12 }, +/* 287 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 12 }, + +/* 288 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 12 }, +/* 289 */ { MAD_F(0x0776b867) /* 0.466484455 */, 12 }, +/* 290 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 12 }, +/* 291 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 12 }, +/* 292 */ { MAD_F(0x07913641) /* 0.472952132 */, 12 }, +/* 293 */ { MAD_F(0x079a100c) /* 0.475112962 */, 12 }, +/* 294 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 12 }, +/* 295 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 12 }, +/* 296 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 12 }, +/* 297 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 12 }, +/* 298 */ { MAD_F(0x07c67798) /* 0.485953899 */, 12 }, +/* 299 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 12 }, +/* 300 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 12 }, +/* 301 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 12 }, +/* 302 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 12 }, +/* 303 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 12 }, + +/* 304 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 12 }, +/* 305 */ { MAD_F(0x0402868e) /* 0.250616605 */, 13 }, +/* 306 */ { MAD_F(0x040703ff) /* 0.251712795 */, 13 }, +/* 307 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 13 }, +/* 308 */ { MAD_F(0x041002a1) /* 0.253908756 */, 13 }, +/* 309 */ { MAD_F(0x041483d1) /* 0.255008523 */, 13 }, +/* 310 */ { MAD_F(0x04190640) /* 0.256109476 */, 13 }, +/* 311 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 13 }, +/* 312 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 13 }, +/* 313 */ { MAD_F(0x042694fe) /* 0.259419433 */, 13 }, +/* 314 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 13 }, +/* 315 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 13 }, +/* 316 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 13 }, +/* 317 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 13 }, +/* 318 */ { MAD_F(0x043d4635) /* 0.264959533 */, 13 }, +/* 319 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 13 }, + +/* 320 */ { MAD_F(0x04466275) /* 0.267183742 */, 13 }, +/* 321 */ { MAD_F(0x044af269) /* 0.268297587 */, 13 }, +/* 322 */ { MAD_F(0x044f8393) /* 0.269412589 */, 13 }, +/* 323 */ { MAD_F(0x045415f3) /* 0.270528746 */, 13 }, +/* 324 */ { MAD_F(0x0458a989) /* 0.271646056 */, 13 }, +/* 325 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 13 }, +/* 326 */ { MAD_F(0x0461d451) /* 0.273884123 */, 13 }, +/* 327 */ { MAD_F(0x04666b83) /* 0.275004875 */, 13 }, +/* 328 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 13 }, +/* 329 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 13 }, +/* 330 */ { MAD_F(0x04743847) /* 0.278373983 */, 13 }, +/* 331 */ { MAD_F(0x0478d440) /* 0.279499294 */, 13 }, +/* 332 */ { MAD_F(0x047d716a) /* 0.280625739 */, 13 }, +/* 333 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 13 }, +/* 334 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 13 }, +/* 335 */ { MAD_F(0x048b5003) /* 0.284011853 */, 13 }, + +/* 336 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 13 }, +/* 337 */ { MAD_F(0x049494fb) /* 0.286274891 */, 13 }, +/* 338 */ { MAD_F(0x0499393a) /* 0.287408091 */, 13 }, +/* 339 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 13 }, +/* 340 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 13 }, +/* 341 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 13 }, +/* 342 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 13 }, +/* 343 */ { MAD_F(0x04b08000) /* 0.293090820 */, 13 }, +/* 344 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 13 }, +/* 345 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 13 }, +/* 346 */ { MAD_F(0x04be8537) /* 0.296513762 */, 13 }, +/* 347 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 13 }, +/* 348 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 13 }, +/* 349 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 13 }, +/* 350 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 13 }, +/* 351 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 13 }, + +/* 352 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 13 }, +/* 353 */ { MAD_F(0x04df6458) /* 0.304539056 */, 13 }, +/* 354 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 13 }, +/* 355 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 13 }, +/* 356 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 13 }, +/* 357 */ { MAD_F(0x04f24618) /* 0.309148880 */, 13 }, +/* 358 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 13 }, +/* 359 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 13 }, +/* 360 */ { MAD_F(0x05007b49) /* 0.312617576 */, 13 }, +/* 361 */ { MAD_F(0x050539ef) /* 0.313775954 */, 13 }, +/* 362 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 13 }, +/* 363 */ { MAD_F(0x050eba98) /* 0.316095920 */, 13 }, +/* 364 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 13 }, +/* 365 */ { MAD_F(0x05183fba) /* 0.318420150 */, 13 }, +/* 366 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 13 }, +/* 367 */ { MAD_F(0x0521c950) /* 0.320748629 */, 13 }, + +/* 368 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 13 }, +/* 369 */ { MAD_F(0x052b5757) /* 0.323081342 */, 13 }, +/* 370 */ { MAD_F(0x05302003) /* 0.324249281 */, 13 }, +/* 371 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 13 }, +/* 372 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 13 }, +/* 373 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 13 }, +/* 374 */ { MAD_F(0x05434db9) /* 0.328931546 */, 13 }, +/* 375 */ { MAD_F(0x05481be5) /* 0.330104730 */, 13 }, +/* 376 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 13 }, +/* 377 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 13 }, +/* 378 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 13 }, +/* 379 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 13 }, +/* 380 */ { MAD_F(0x05603321) /* 0.335986261 */, 13 }, +/* 381 */ { MAD_F(0x056507d6) /* 0.337165677 */, 13 }, +/* 382 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 13 }, +/* 383 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 13 }, + +/* 384 */ { MAD_F(0x05738c72) /* 0.340710111 */, 13 }, +/* 385 */ { MAD_F(0x05786578) /* 0.341893646 */, 13 }, +/* 386 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 13 }, +/* 387 */ { MAD_F(0x05821abf) /* 0.344263788 */, 13 }, +/* 388 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 13 }, +/* 389 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 13 }, +/* 390 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 13 }, +/* 391 */ { MAD_F(0x05959222) /* 0.349016318 */, 13 }, +/* 392 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 13 }, +/* 393 */ { MAD_F(0x059f5438) /* 0.351398678 */, 13 }, +/* 394 */ { MAD_F(0x05a436da) /* 0.352591376 */, 13 }, +/* 395 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 13 }, +/* 396 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 13 }, +/* 397 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 13 }, +/* 398 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 13 }, +/* 399 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 13 }, + +/* 400 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 13 }, +/* 401 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 13 }, +/* 402 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 13 }, +/* 403 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 13 }, +/* 404 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 13 }, +/* 405 */ { MAD_F(0x05da394d) /* 0.365777304 */, 13 }, +/* 406 */ { MAD_F(0x05df2885) /* 0.366982004 */, 13 }, +/* 407 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 13 }, +/* 408 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 13 }, +/* 409 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 13 }, +/* 410 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 13 }, +/* 411 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 13 }, +/* 412 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 13 }, +/* 413 */ { MAD_F(0x0601d004) /* 0.375442522 */, 13 }, +/* 414 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 13 }, +/* 415 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 13 }, + +/* 416 */ { MAD_F(0x0610b982) /* 0.379083164 */, 13 }, +/* 417 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 13 }, +/* 418 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 13 }, +/* 419 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 13 }, +/* 420 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 13 }, +/* 421 */ { MAD_F(0x0629a863) /* 0.385170352 */, 13 }, +/* 422 */ { MAD_F(0x062ea802) /* 0.386390694 */, 13 }, +/* 423 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 13 }, +/* 424 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 13 }, +/* 425 */ { MAD_F(0x063dacee) /* 0.390057497 */, 13 }, +/* 426 */ { MAD_F(0x0642b096) /* 0.391281687 */, 13 }, +/* 427 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 13 }, +/* 428 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 13 }, +/* 429 */ { MAD_F(0x0651c193) /* 0.394959999 */, 13 }, +/* 430 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 13 }, +/* 431 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 13 }, + +/* 432 */ { MAD_F(0x0660db91) /* 0.398646895 */, 13 }, +/* 433 */ { MAD_F(0x0665e639) /* 0.399877761 */, 13 }, +/* 434 */ { MAD_F(0x066af1df) /* 0.401109575 */, 13 }, +/* 435 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 13 }, +/* 436 */ { MAD_F(0x06750c26) /* 0.403576041 */, 13 }, +/* 437 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 13 }, +/* 438 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 13 }, +/* 439 */ { MAD_F(0x06843afb) /* 0.407282813 */, 13 }, +/* 440 */ { MAD_F(0x06894c90) /* 0.408520284 */, 13 }, +/* 441 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 13 }, +/* 442 */ { MAD_F(0x069372ae) /* 0.410998038 */, 13 }, +/* 443 */ { MAD_F(0x06988735) /* 0.412238319 */, 13 }, +/* 444 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 13 }, +/* 445 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 13 }, +/* 446 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 13 }, +/* 447 */ { MAD_F(0x06ace318) /* 0.417208762 */, 13 }, + +/* 448 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 13 }, +/* 449 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 13 }, +/* 450 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 13 }, +/* 451 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 13 }, +/* 452 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 13 }, +/* 453 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 13 }, +/* 454 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 13 }, +/* 455 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 13 }, +/* 456 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 13 }, +/* 457 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 13 }, +/* 458 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 13 }, +/* 459 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 13 }, +/* 460 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 13 }, +/* 461 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 13 }, +/* 462 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 13 }, +/* 463 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 13 }, + +/* 464 */ { MAD_F(0x07041636) /* 0.438497744 */, 13 }, +/* 465 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 13 }, +/* 466 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 13 }, +/* 467 */ { MAD_F(0x07139641) /* 0.442281965 */, 13 }, +/* 468 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 13 }, +/* 469 */ { MAD_F(0x071df058) /* 0.444809288 */, 13 }, +/* 470 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 13 }, +/* 471 */ { MAD_F(0x07284e34) /* 0.447340205 */, 13 }, +/* 472 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 13 }, +/* 473 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 13 }, +/* 474 */ { MAD_F(0x0737e209) /* 0.451143300 */, 13 }, +/* 475 */ { MAD_F(0x073d1530) /* 0.452412785 */, 13 }, +/* 476 */ { MAD_F(0x07424946) /* 0.453683161 */, 13 }, +/* 477 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 13 }, +/* 478 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 13 }, +/* 479 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 13 }, + +/* 480 */ { MAD_F(0x075722ef) /* 0.458773552 */, 13 }, +/* 481 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 13 }, +/* 482 */ { MAD_F(0x07619557) /* 0.461324062 */, 13 }, +/* 483 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 13 }, +/* 484 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 13 }, +/* 485 */ { MAD_F(0x077147e2) /* 0.465156443 */, 13 }, +/* 486 */ { MAD_F(0x0776853e) /* 0.466435663 */, 13 }, +/* 487 */ { MAD_F(0x077bc385) /* 0.467715761 */, 13 }, +/* 488 */ { MAD_F(0x078102b8) /* 0.468996735 */, 13 }, +/* 489 */ { MAD_F(0x078642d6) /* 0.470278584 */, 13 }, +/* 490 */ { MAD_F(0x078b83de) /* 0.471561307 */, 13 }, +/* 491 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 13 }, +/* 492 */ { MAD_F(0x079608ae) /* 0.474129372 */, 13 }, +/* 493 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 13 }, +/* 494 */ { MAD_F(0x07a09124) /* 0.476700918 */, 13 }, +/* 495 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 13 }, + +/* 496 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 13 }, +/* 497 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 13 }, +/* 498 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 13 }, +/* 499 */ { MAD_F(0x07baf635) /* 0.483144957 */, 13 }, +/* 500 */ { MAD_F(0x07c04056) /* 0.484436356 */, 13 }, +/* 501 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 13 }, +/* 502 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 13 }, +/* 503 */ { MAD_F(0x07d02424) /* 0.488315717 */, 13 }, +/* 504 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 13 }, +/* 505 */ { MAD_F(0x07dac083) /* 0.490906249 */, 13 }, +/* 506 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 13 }, +/* 507 */ { MAD_F(0x07e56078) /* 0.493500203 */, 13 }, +/* 508 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 13 }, +/* 509 */ { MAD_F(0x07f00401) /* 0.496097570 */, 13 }, +/* 510 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 13 }, +/* 511 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 13 }, + +/* 512 */ { MAD_F(0x04000000) /* 0.250000000 */, 14 }, +/* 513 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 14 }, +/* 514 */ { MAD_F(0x04055638) /* 0.251302930 */, 14 }, +/* 515 */ { MAD_F(0x040801ff) /* 0.251955030 */, 14 }, +/* 516 */ { MAD_F(0x040aae37) /* 0.252607552 */, 14 }, +/* 517 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 14 }, +/* 518 */ { MAD_F(0x041007fa) /* 0.253913860 */, 14 }, +/* 519 */ { MAD_F(0x0412b586) /* 0.254567645 */, 14 }, +/* 520 */ { MAD_F(0x04156381) /* 0.255221850 */, 14 }, +/* 521 */ { MAD_F(0x041811ee) /* 0.255876475 */, 14 }, +/* 522 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 14 }, +/* 523 */ { MAD_F(0x041d7018) /* 0.257186980 */, 14 }, +/* 524 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 14 }, +/* 525 */ { MAD_F(0x0422d003) /* 0.258499157 */, 14 }, +/* 526 */ { MAD_F(0x042580a0) /* 0.259155872 */, 14 }, +/* 527 */ { MAD_F(0x042831ad) /* 0.259813002 */, 14 }, + +/* 528 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 14 }, +/* 529 */ { MAD_F(0x042d9516) /* 0.261128510 */, 14 }, +/* 530 */ { MAD_F(0x04304772) /* 0.261786886 */, 14 }, +/* 531 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 14 }, +/* 532 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 14 }, +/* 533 */ { MAD_F(0x0438611f) /* 0.263764497 */, 14 }, +/* 534 */ { MAD_F(0x043b1536) /* 0.264424527 */, 14 }, +/* 535 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 14 }, +/* 536 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 14 }, +/* 537 */ { MAD_F(0x04433414) /* 0.266407088 */, 14 }, +/* 538 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 14 }, +/* 539 */ { MAD_F(0x0448a024) /* 0.267730848 */, 14 }, +/* 540 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 14 }, +/* 541 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 14 }, +/* 542 */ { MAD_F(0x0450c575) /* 0.269719560 */, 14 }, +/* 543 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 14 }, + +/* 544 */ { MAD_F(0x045635cf) /* 0.271047409 */, 14 }, +/* 545 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 14 }, +/* 546 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 14 }, +/* 547 */ { MAD_F(0x045e6188) /* 0.273042234 */, 14 }, +/* 548 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 14 }, +/* 549 */ { MAD_F(0x0463d625) /* 0.274374147 */, 14 }, +/* 550 */ { MAD_F(0x04669116) /* 0.275040710 */, 14 }, +/* 551 */ { MAD_F(0x04694c74) /* 0.275707677 */, 14 }, +/* 552 */ { MAD_F(0x046c083e) /* 0.276375048 */, 14 }, +/* 553 */ { MAD_F(0x046ec474) /* 0.277042822 */, 14 }, +/* 554 */ { MAD_F(0x04718116) /* 0.277710999 */, 14 }, +/* 555 */ { MAD_F(0x04743e25) /* 0.278379578 */, 14 }, +/* 556 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 14 }, +/* 557 */ { MAD_F(0x0479b984) /* 0.279717940 */, 14 }, +/* 558 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 14 }, +/* 559 */ { MAD_F(0x047f3693) /* 0.281057905 */, 14 }, + +/* 560 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 14 }, +/* 561 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 14 }, +/* 562 */ { MAD_F(0x0487754c) /* 0.283070849 */, 14 }, +/* 563 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 14 }, +/* 564 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 14 }, +/* 565 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 14 }, +/* 566 */ { MAD_F(0x04927972) /* 0.285760350 */, 14 }, +/* 567 */ { MAD_F(0x04953b85) /* 0.286433717 */, 14 }, +/* 568 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 14 }, +/* 569 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 14 }, +/* 570 */ { MAD_F(0x049d843e) /* 0.288456194 */, 14 }, +/* 571 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 14 }, +/* 572 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 14 }, +/* 573 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 14 }, +/* 574 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 14 }, +/* 575 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 14 }, + +/* 576 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 14 }, +/* 577 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 14 }, +/* 578 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 14 }, +/* 579 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 14 }, +/* 580 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 14 }, +/* 581 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 14 }, +/* 582 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 14 }, +/* 583 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 14 }, +/* 584 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 14 }, +/* 585 */ { MAD_F(0x04c72771) /* 0.298621598 */, 14 }, +/* 586 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 14 }, +/* 587 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 14 }, +/* 588 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 14 }, +/* 589 */ { MAD_F(0x04d25169) /* 0.301347172 */, 14 }, +/* 590 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 14 }, +/* 591 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 14 }, + +/* 592 */ { MAD_F(0x04dab524) /* 0.303395408 */, 14 }, +/* 593 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 14 }, +/* 594 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 14 }, +/* 595 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 14 }, +/* 596 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 14 }, +/* 597 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 14 }, +/* 598 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 14 }, +/* 599 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 14 }, +/* 600 */ { MAD_F(0x04f12624) /* 0.308874267 */, 14 }, +/* 601 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 14 }, +/* 602 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 14 }, +/* 603 */ { MAD_F(0x04f99721) /* 0.310935143 */, 14 }, +/* 604 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 14 }, +/* 605 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 14 }, +/* 606 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 14 }, +/* 607 */ { MAD_F(0x0504de05) /* 0.313688296 */, 14 }, + +/* 608 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 14 }, +/* 609 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 14 }, +/* 610 */ { MAD_F(0x050d575b) /* 0.315757136 */, 14 }, +/* 611 */ { MAD_F(0x05102b42) /* 0.316447504 */, 14 }, +/* 612 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 14 }, +/* 613 */ { MAD_F(0x0515d440) /* 0.317829370 */, 14 }, +/* 614 */ { MAD_F(0x0518a956) /* 0.318520867 */, 14 }, +/* 615 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 14 }, +/* 616 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 14 }, +/* 617 */ { MAD_F(0x05212af5) /* 0.320597609 */, 14 }, +/* 618 */ { MAD_F(0x0524019e) /* 0.321290606 */, 14 }, +/* 619 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 14 }, +/* 620 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 14 }, +/* 621 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 14 }, +/* 622 */ { MAD_F(0x052f602c) /* 0.324066327 */, 14 }, +/* 623 */ { MAD_F(0x053238ca) /* 0.324761189 */, 14 }, + +/* 624 */ { MAD_F(0x053511cb) /* 0.325456423 */, 14 }, +/* 625 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 14 }, +/* 626 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 14 }, +/* 627 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 14 }, +/* 628 */ { MAD_F(0x054079b5) /* 0.328241070 */, 14 }, +/* 629 */ { MAD_F(0x054354a8) /* 0.328938157 */, 14 }, +/* 630 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 14 }, +/* 631 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 14 }, +/* 632 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 14 }, +/* 633 */ { MAD_F(0x054ec453) /* 0.331730198 */, 14 }, +/* 634 */ { MAD_F(0x0551a134) /* 0.332429129 */, 14 }, +/* 635 */ { MAD_F(0x05547e79) /* 0.333128427 */, 14 }, +/* 636 */ { MAD_F(0x05575c20) /* 0.333828093 */, 14 }, +/* 637 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 14 }, +/* 638 */ { MAD_F(0x055d1896) /* 0.335228525 */, 14 }, +/* 639 */ { MAD_F(0x055ff764) /* 0.335929290 */, 14 }, + +/* 640 */ { MAD_F(0x0562d694) /* 0.336630420 */, 14 }, +/* 641 */ { MAD_F(0x0565b627) /* 0.337331916 */, 14 }, +/* 642 */ { MAD_F(0x0568961b) /* 0.338033777 */, 14 }, +/* 643 */ { MAD_F(0x056b7671) /* 0.338736002 */, 14 }, +/* 644 */ { MAD_F(0x056e5729) /* 0.339438592 */, 14 }, +/* 645 */ { MAD_F(0x05713843) /* 0.340141545 */, 14 }, +/* 646 */ { MAD_F(0x057419be) /* 0.340844862 */, 14 }, +/* 647 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 14 }, +/* 648 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 14 }, +/* 649 */ { MAD_F(0x057cc077) /* 0.342956988 */, 14 }, +/* 650 */ { MAD_F(0x057fa378) /* 0.343661754 */, 14 }, +/* 651 */ { MAD_F(0x058286d9) /* 0.344366882 */, 14 }, +/* 652 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 14 }, +/* 653 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 14 }, +/* 654 */ { MAD_F(0x058b3342) /* 0.346484431 */, 14 }, +/* 655 */ { MAD_F(0x058e1827) /* 0.347191002 */, 14 }, + +/* 656 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 14 }, +/* 657 */ { MAD_F(0x0593e311) /* 0.348605221 */, 14 }, +/* 658 */ { MAD_F(0x0596c917) /* 0.349312869 */, 14 }, +/* 659 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 14 }, +/* 660 */ { MAD_F(0x059c9643) /* 0.350729240 */, 14 }, +/* 661 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 14 }, +/* 662 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 14 }, +/* 663 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 14 }, +/* 664 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 14 }, +/* 665 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 14 }, +/* 666 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 14 }, +/* 667 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 14 }, +/* 668 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 14 }, +/* 669 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 14 }, +/* 670 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 14 }, +/* 671 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 14 }, + +/* 672 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 14 }, +/* 673 */ { MAD_F(0x05c27057) /* 0.359970419 */, 14 }, +/* 674 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 14 }, +/* 675 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 14 }, +/* 676 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 14 }, +/* 677 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 14 }, +/* 678 */ { MAD_F(0x05d11001) /* 0.363540655 */, 14 }, +/* 679 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 14 }, +/* 680 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 14 }, +/* 681 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 14 }, +/* 682 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 14 }, +/* 683 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 14 }, +/* 684 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 14 }, +/* 685 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 14 }, +/* 686 */ { MAD_F(0x05e88904) /* 0.369271294 */, 14 }, +/* 687 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 14 }, + +/* 688 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 14 }, +/* 689 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 14 }, +/* 690 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 14 }, +/* 691 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 14 }, +/* 692 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 14 }, +/* 693 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 14 }, +/* 694 */ { MAD_F(0x0600196e) /* 0.375024253 */, 14 }, +/* 695 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 14 }, +/* 696 */ { MAD_F(0x0606012b) /* 0.376465960 */, 14 }, +/* 697 */ { MAD_F(0x0608f595) /* 0.377187332 */, 14 }, +/* 698 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 14 }, +/* 699 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 14 }, +/* 700 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 14 }, +/* 701 */ { MAD_F(0x0614cada) /* 0.380076266 */, 14 }, +/* 702 */ { MAD_F(0x0617c112) /* 0.380799360 */, 14 }, +/* 703 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 14 }, + +/* 704 */ { MAD_F(0x061dae96) /* 0.382246578 */, 14 }, +/* 705 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 14 }, +/* 706 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 14 }, +/* 707 */ { MAD_F(0x0626958f) /* 0.384419975 */, 14 }, +/* 708 */ { MAD_F(0x06298def) /* 0.385145124 */, 14 }, +/* 709 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 14 }, +/* 710 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 14 }, +/* 711 */ { MAD_F(0x06327934) /* 0.387322621 */, 14 }, +/* 712 */ { MAD_F(0x06357302) /* 0.388049134 */, 14 }, +/* 713 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 14 }, +/* 714 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 14 }, +/* 715 */ { MAD_F(0x063e6290) /* 0.390230715 */, 14 }, +/* 716 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 14 }, +/* 717 */ { MAD_F(0x06445960) /* 0.391686799 */, 14 }, +/* 718 */ { MAD_F(0x06475551) /* 0.392415349 */, 14 }, +/* 719 */ { MAD_F(0x064a519c) /* 0.393144238 */, 14 }, + +/* 720 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 14 }, +/* 721 */ { MAD_F(0x06504b44) /* 0.394603028 */, 14 }, +/* 722 */ { MAD_F(0x0653489f) /* 0.395332930 */, 14 }, +/* 723 */ { MAD_F(0x06564655) /* 0.396063168 */, 14 }, +/* 724 */ { MAD_F(0x06594465) /* 0.396793743 */, 14 }, +/* 725 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 14 }, +/* 726 */ { MAD_F(0x065f4195) /* 0.398255903 */, 14 }, +/* 727 */ { MAD_F(0x066240b4) /* 0.398987487 */, 14 }, +/* 728 */ { MAD_F(0x0665402d) /* 0.399719406 */, 14 }, +/* 729 */ { MAD_F(0x06684000) /* 0.400451660 */, 14 }, +/* 730 */ { MAD_F(0x066b402d) /* 0.401184249 */, 14 }, +/* 731 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 14 }, +/* 732 */ { MAD_F(0x06714194) /* 0.402650431 */, 14 }, +/* 733 */ { MAD_F(0x067442ce) /* 0.403384024 */, 14 }, +/* 734 */ { MAD_F(0x06774462) /* 0.404117949 */, 14 }, +/* 735 */ { MAD_F(0x067a464f) /* 0.404852209 */, 14 }, + +/* 736 */ { MAD_F(0x067d4896) /* 0.405586801 */, 14 }, +/* 737 */ { MAD_F(0x06804b36) /* 0.406321726 */, 14 }, +/* 738 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 14 }, +/* 739 */ { MAD_F(0x06865181) /* 0.407792573 */, 14 }, +/* 740 */ { MAD_F(0x0689552c) /* 0.408528495 */, 14 }, +/* 741 */ { MAD_F(0x068c5931) /* 0.409264748 */, 14 }, +/* 742 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 14 }, +/* 743 */ { MAD_F(0x06926245) /* 0.410738247 */, 14 }, +/* 744 */ { MAD_F(0x06956753) /* 0.411475493 */, 14 }, +/* 745 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 14 }, +/* 746 */ { MAD_F(0x069b727b) /* 0.412950976 */, 14 }, +/* 747 */ { MAD_F(0x069e7894) /* 0.413689213 */, 14 }, +/* 748 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 14 }, +/* 749 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 14 }, +/* 750 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 14 }, +/* 751 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 14 }, + +/* 752 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 14 }, +/* 753 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 14 }, +/* 754 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 14 }, +/* 755 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 14 }, +/* 756 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 14 }, +/* 757 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 14 }, +/* 758 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 14 }, +/* 759 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 14 }, +/* 760 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 14 }, +/* 761 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 14 }, +/* 762 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 14 }, +/* 763 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 14 }, +/* 764 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 14 }, +/* 765 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 14 }, +/* 766 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 14 }, +/* 767 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 14 }, + +/* 768 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 14 }, +/* 769 */ { MAD_F(0x06e15595) /* 0.430013259 */, 14 }, +/* 770 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 14 }, +/* 771 */ { MAD_F(0x06e771db) /* 0.431505065 */, 14 }, +/* 772 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 14 }, +/* 773 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 14 }, +/* 774 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 14 }, +/* 775 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 14 }, +/* 776 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 14 }, +/* 777 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 14 }, +/* 778 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 14 }, +/* 779 */ { MAD_F(0x06fff073) /* 0.437485172 */, 14 }, +/* 780 */ { MAD_F(0x070301ca) /* 0.438234130 */, 14 }, +/* 781 */ { MAD_F(0x07061377) /* 0.438983408 */, 14 }, +/* 782 */ { MAD_F(0x0709257a) /* 0.439733006 */, 14 }, +/* 783 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 14 }, + +/* 784 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 14 }, +/* 785 */ { MAD_F(0x07125d84) /* 0.441983717 */, 14 }, +/* 786 */ { MAD_F(0x071570de) /* 0.442734592 */, 14 }, +/* 787 */ { MAD_F(0x0718848d) /* 0.443485785 */, 14 }, +/* 788 */ { MAD_F(0x071b9891) /* 0.444237296 */, 14 }, +/* 789 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 14 }, +/* 790 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 14 }, +/* 791 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 14 }, +/* 792 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 14 }, +/* 793 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 14 }, +/* 794 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 14 }, +/* 795 */ { MAD_F(0x07312e01) /* 0.449506765 */, 14 }, +/* 796 */ { MAD_F(0x073444ae) /* 0.450260813 */, 14 }, +/* 797 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 14 }, +/* 798 */ { MAD_F(0x073a7307) /* 0.451769856 */, 14 }, +/* 799 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 14 }, + +/* 800 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 14 }, +/* 801 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 14 }, +/* 802 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 14 }, +/* 803 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 14 }, +/* 804 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 14 }, +/* 805 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 14 }, +/* 806 */ { MAD_F(0x0753399d) /* 0.457818618 */, 14 }, +/* 807 */ { MAD_F(0x075653eb) /* 0.458576125 */, 14 }, +/* 808 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 14 }, +/* 809 */ { MAD_F(0x075c8983) /* 0.460092079 */, 14 }, +/* 810 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 14 }, +/* 811 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 14 }, +/* 812 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 14 }, +/* 813 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 14 }, +/* 814 */ { MAD_F(0x076c1538) /* 0.463887426 */, 14 }, +/* 815 */ { MAD_F(0x076f3224) /* 0.464647430 */, 14 }, + +/* 816 */ { MAD_F(0x07724f64) /* 0.465407744 */, 14 }, +/* 817 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 14 }, +/* 818 */ { MAD_F(0x07788add) /* 0.466929306 */, 14 }, +/* 819 */ { MAD_F(0x077ba916) /* 0.467690552 */, 14 }, +/* 820 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 14 }, +/* 821 */ { MAD_F(0x0781e683) /* 0.469213973 */, 14 }, +/* 822 */ { MAD_F(0x078505b5) /* 0.469976148 */, 14 }, +/* 823 */ { MAD_F(0x0788253b) /* 0.470738632 */, 14 }, +/* 824 */ { MAD_F(0x078b4514) /* 0.471501425 */, 14 }, +/* 825 */ { MAD_F(0x078e653f) /* 0.472264527 */, 14 }, +/* 826 */ { MAD_F(0x079185be) /* 0.473027937 */, 14 }, +/* 827 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 14 }, +/* 828 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 14 }, +/* 829 */ { MAD_F(0x079ae929) /* 0.475320014 */, 14 }, +/* 830 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 14 }, +/* 831 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 14 }, + +/* 832 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 14 }, +/* 833 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 14 }, +/* 834 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 14 }, +/* 835 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 14 }, +/* 836 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 14 }, +/* 837 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 14 }, +/* 838 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 14 }, +/* 839 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 14 }, +/* 840 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 14 }, +/* 841 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 14 }, +/* 842 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 14 }, +/* 843 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 14 }, +/* 844 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 14 }, +/* 845 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 14 }, +/* 846 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 14 }, +/* 847 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 14 }, + +/* 848 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 14 }, +/* 849 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 14 }, +/* 850 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 14 }, +/* 851 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 14 }, +/* 852 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 14 }, +/* 853 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 14 }, +/* 854 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 14 }, +/* 855 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 14 }, +/* 856 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 14 }, +/* 857 */ { MAD_F(0x07f31405) /* 0.496845266 */, 14 }, +/* 858 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 14 }, +/* 859 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 14 }, +/* 860 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 14 }, +/* 861 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 14 }, +/* 862 */ { MAD_F(0x04017659) /* 0.250357008 */, 15 }, +/* 863 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 15 }, + +/* 864 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 15 }, +/* 865 */ { MAD_F(0x0406393d) /* 0.251519431 */, 15 }, +/* 866 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 15 }, +/* 867 */ { MAD_F(0x0409669d) /* 0.252295127 */, 15 }, +/* 868 */ { MAD_F(0x040afd89) /* 0.252683198 */, 15 }, +/* 869 */ { MAD_F(0x040c949e) /* 0.253071419 */, 15 }, +/* 870 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 15 }, +/* 871 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 15 }, +/* 872 */ { MAD_F(0x04115aca) /* 0.254236974 */, 15 }, +/* 873 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 15 }, +/* 874 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 15 }, +/* 875 */ { MAD_F(0x0416225d) /* 0.255403867 */, 15 }, +/* 876 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 15 }, +/* 877 */ { MAD_F(0x041952dc) /* 0.256182537 */, 15 }, +/* 878 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 15 }, +/* 879 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 15 }, + +/* 880 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 15 }, +/* 881 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 15 }, +/* 882 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 15 }, +/* 883 */ { MAD_F(0x0422e811) /* 0.258522097 */, 15 }, +/* 884 */ { MAD_F(0x04248179) /* 0.258912540 */, 15 }, +/* 885 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 15 }, +/* 886 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 15 }, +/* 887 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 15 }, +/* 888 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 15 }, +/* 889 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 15 }, +/* 890 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 15 }, +/* 891 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 15 }, +/* 892 */ { MAD_F(0x0431524c) /* 0.262041376 */, 15 }, +/* 893 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 15 }, +/* 894 */ { MAD_F(0x0434880a) /* 0.262825051 */, 15 }, +/* 895 */ { MAD_F(0x04362324) /* 0.263217107 */, 15 }, + +/* 896 */ { MAD_F(0x0437be65) /* 0.263609310 */, 15 }, +/* 897 */ { MAD_F(0x043959cd) /* 0.264001659 */, 15 }, +/* 898 */ { MAD_F(0x043af55d) /* 0.264394153 */, 15 }, +/* 899 */ { MAD_F(0x043c9113) /* 0.264786794 */, 15 }, +/* 900 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 15 }, +/* 901 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 15 }, +/* 902 */ { MAD_F(0x04416522) /* 0.265965588 */, 15 }, +/* 903 */ { MAD_F(0x04430174) /* 0.266358810 */, 15 }, +/* 904 */ { MAD_F(0x04449dee) /* 0.266752177 */, 15 }, +/* 905 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 15 }, +/* 906 */ { MAD_F(0x0447d756) /* 0.267539347 */, 15 }, +/* 907 */ { MAD_F(0x04497445) /* 0.267933149 */, 15 }, +/* 908 */ { MAD_F(0x044b115a) /* 0.268327096 */, 15 }, +/* 909 */ { MAD_F(0x044cae96) /* 0.268721187 */, 15 }, +/* 910 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 15 }, +/* 911 */ { MAD_F(0x044fe983) /* 0.269509804 */, 15 }, + +/* 912 */ { MAD_F(0x04518733) /* 0.269904329 */, 15 }, +/* 913 */ { MAD_F(0x0453250a) /* 0.270298998 */, 15 }, +/* 914 */ { MAD_F(0x0454c308) /* 0.270693811 */, 15 }, +/* 915 */ { MAD_F(0x0456612d) /* 0.271088768 */, 15 }, +/* 916 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 15 }, +/* 917 */ { MAD_F(0x04599dea) /* 0.271879114 */, 15 }, +/* 918 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 15 }, +/* 919 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 15 }, +/* 920 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 15 }, +/* 921 */ { MAD_F(0x04601932) /* 0.273461530 */, 15 }, +/* 922 */ { MAD_F(0x0461b864) /* 0.273857492 */, 15 }, +/* 923 */ { MAD_F(0x046357bd) /* 0.274253597 */, 15 }, +/* 924 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 15 }, +/* 925 */ { MAD_F(0x046696e2) /* 0.275046238 */, 15 }, +/* 926 */ { MAD_F(0x046836ae) /* 0.275442772 */, 15 }, +/* 927 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 15 }, + +/* 928 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 15 }, +/* 929 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 15 }, +/* 930 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 15 }, +/* 931 */ { MAD_F(0x047057e8) /* 0.277427584 */, 15 }, +/* 932 */ { MAD_F(0x0471f899) /* 0.277824973 */, 15 }, +/* 933 */ { MAD_F(0x04739971) /* 0.278222505 */, 15 }, +/* 934 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 15 }, +/* 935 */ { MAD_F(0x0476db92) /* 0.279017995 */, 15 }, +/* 936 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 15 }, +/* 937 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 15 }, +/* 938 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 15 }, +/* 939 */ { MAD_F(0x047d619e) /* 0.280610675 */, 15 }, +/* 940 */ { MAD_F(0x047f0380) /* 0.281009199 */, 15 }, +/* 941 */ { MAD_F(0x0480a588) /* 0.281407864 */, 15 }, +/* 942 */ { MAD_F(0x048247b6) /* 0.281806670 */, 15 }, +/* 943 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 15 }, + +/* 944 */ { MAD_F(0x04858c83) /* 0.282604707 */, 15 }, +/* 945 */ { MAD_F(0x04872f22) /* 0.283003936 */, 15 }, +/* 946 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 15 }, +/* 947 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 15 }, +/* 948 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 15 }, +/* 949 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 15 }, +/* 950 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 15 }, +/* 951 */ { MAD_F(0x049101f8) /* 0.285402269 */, 15 }, +/* 952 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 15 }, +/* 953 */ { MAD_F(0x0494496c) /* 0.286202836 */, 15 }, +/* 954 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 15 }, +/* 955 */ { MAD_F(0x04979177) /* 0.287003963 */, 15 }, +/* 956 */ { MAD_F(0x049935b5) /* 0.287404737 */, 15 }, +/* 957 */ { MAD_F(0x049ada19) /* 0.287805650 */, 15 }, +/* 958 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 15 }, +/* 959 */ { MAD_F(0x049e2350) /* 0.288607895 */, 15 }, + +/* 960 */ { MAD_F(0x049fc824) /* 0.289009227 */, 15 }, +/* 961 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 15 }, +/* 962 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 15 }, +/* 963 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 15 }, +/* 964 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 15 }, +/* 965 */ { MAD_F(0x04a80277) /* 0.291017976 */, 15 }, +/* 966 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 15 }, +/* 967 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 15 }, +/* 968 */ { MAD_F(0x04acf402) /* 0.292224893 */, 15 }, +/* 969 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 15 }, +/* 970 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 15 }, +/* 971 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 15 }, +/* 972 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 15 }, +/* 973 */ { MAD_F(0x04b53427) /* 0.294239192 */, 15 }, +/* 974 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 15 }, +/* 975 */ { MAD_F(0x04b88207) /* 0.295045879 */, 15 }, + +/* 976 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 15 }, +/* 977 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 15 }, +/* 978 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 15 }, +/* 979 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 15 }, +/* 980 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 15 }, +/* 981 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 15 }, +/* 982 */ { MAD_F(0x04c41722) /* 0.297873624 */, 15 }, +/* 983 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 15 }, +/* 984 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 15 }, +/* 985 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 15 }, +/* 986 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 15 }, +/* 987 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 15 }, +/* 988 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 15 }, +/* 989 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 15 }, +/* 990 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 15 }, +/* 991 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 15 }, + +/* 992 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 15 }, +/* 993 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 15 }, +/* 994 */ { MAD_F(0x04d80290) /* 0.302736820 */, 15 }, +/* 995 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 15 }, +/* 996 */ { MAD_F(0x04db5679) /* 0.303549263 */, 15 }, +/* 997 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 15 }, +/* 998 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 15 }, +/* 999 */ { MAD_F(0x04e05567) /* 0.304768948 */, 15 }, +/* 1000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 15 }, +/* 1001 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 15 }, +/* 1002 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 15 }, +/* 1003 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 15 }, +/* 1004 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 15 }, +/* 1005 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 15 }, +/* 1006 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 15 }, +/* 1007 */ { MAD_F(0x04edae25) /* 0.308027406 */, 15 }, + +/* 1008 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 15 }, +/* 1009 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 15 }, +/* 1010 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 15 }, +/* 1011 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 15 }, +/* 1012 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 15 }, +/* 1013 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 15 }, +/* 1014 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 15 }, +/* 1015 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 15 }, +/* 1016 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 15 }, +/* 1017 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 15 }, +/* 1018 */ { MAD_F(0x050016f3) /* 0.312521885 */, 15 }, +/* 1019 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 15 }, +/* 1020 */ { MAD_F(0x050371a7) /* 0.313340809 */, 15 }, +/* 1021 */ { MAD_F(0x05051f37) /* 0.313750472 */, 15 }, +/* 1022 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 15 }, +/* 1023 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 15 }, + +/* 1024 */ { MAD_F(0x050a28be) /* 0.314980262 */, 15 }, +/* 1025 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 15 }, +/* 1026 */ { MAD_F(0x050d8521) /* 0.315800790 */, 15 }, +/* 1027 */ { MAD_F(0x050f3388) /* 0.316211255 */, 15 }, +/* 1028 */ { MAD_F(0x0510e213) /* 0.316621852 */, 15 }, +/* 1029 */ { MAD_F(0x051290c2) /* 0.317032582 */, 15 }, +/* 1030 */ { MAD_F(0x05143f94) /* 0.317443446 */, 15 }, +/* 1031 */ { MAD_F(0x0515ee8a) /* 0.317854442 */, 15 }, +/* 1032 */ { MAD_F(0x05179da4) /* 0.318265572 */, 15 }, +/* 1033 */ { MAD_F(0x05194ce1) /* 0.318676834 */, 15 }, +/* 1034 */ { MAD_F(0x051afc42) /* 0.319088229 */, 15 }, +/* 1035 */ { MAD_F(0x051cabc7) /* 0.319499756 */, 15 }, +/* 1036 */ { MAD_F(0x051e5b6f) /* 0.319911417 */, 15 }, +/* 1037 */ { MAD_F(0x05200b3a) /* 0.320323209 */, 15 }, +/* 1038 */ { MAD_F(0x0521bb2a) /* 0.320735134 */, 15 }, +/* 1039 */ { MAD_F(0x05236b3d) /* 0.321147192 */, 15 }, + +/* 1040 */ { MAD_F(0x05251b73) /* 0.321559381 */, 15 }, +/* 1041 */ { MAD_F(0x0526cbcd) /* 0.321971703 */, 15 }, +/* 1042 */ { MAD_F(0x05287c4a) /* 0.322384156 */, 15 }, +/* 1043 */ { MAD_F(0x052a2cea) /* 0.322796742 */, 15 }, +/* 1044 */ { MAD_F(0x052bddae) /* 0.323209460 */, 15 }, +/* 1045 */ { MAD_F(0x052d8e96) /* 0.323622309 */, 15 }, +/* 1046 */ { MAD_F(0x052f3fa1) /* 0.324035290 */, 15 }, +/* 1047 */ { MAD_F(0x0530f0cf) /* 0.324448403 */, 15 }, +/* 1048 */ { MAD_F(0x0532a220) /* 0.324861647 */, 15 }, +/* 1049 */ { MAD_F(0x05345395) /* 0.325275023 */, 15 }, +/* 1050 */ { MAD_F(0x0536052d) /* 0.325688530 */, 15 }, +/* 1051 */ { MAD_F(0x0537b6e8) /* 0.326102168 */, 15 }, +/* 1052 */ { MAD_F(0x053968c6) /* 0.326515938 */, 15 }, +/* 1053 */ { MAD_F(0x053b1ac8) /* 0.326929839 */, 15 }, +/* 1054 */ { MAD_F(0x053ccced) /* 0.327343870 */, 15 }, +/* 1055 */ { MAD_F(0x053e7f35) /* 0.327758033 */, 15 }, + +/* 1056 */ { MAD_F(0x054031a0) /* 0.328172327 */, 15 }, +/* 1057 */ { MAD_F(0x0541e42e) /* 0.328586751 */, 15 }, +/* 1058 */ { MAD_F(0x054396df) /* 0.329001306 */, 15 }, +/* 1059 */ { MAD_F(0x054549b4) /* 0.329415992 */, 15 }, +/* 1060 */ { MAD_F(0x0546fcab) /* 0.329830808 */, 15 }, +/* 1061 */ { MAD_F(0x0548afc6) /* 0.330245755 */, 15 }, +/* 1062 */ { MAD_F(0x054a6303) /* 0.330660832 */, 15 }, +/* 1063 */ { MAD_F(0x054c1663) /* 0.331076039 */, 15 }, +/* 1064 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 15 }, +/* 1065 */ { MAD_F(0x054f7d8d) /* 0.331906845 */, 15 }, +/* 1066 */ { MAD_F(0x05513156) /* 0.332322443 */, 15 }, +/* 1067 */ { MAD_F(0x0552e542) /* 0.332738170 */, 15 }, +/* 1068 */ { MAD_F(0x05549951) /* 0.333154028 */, 15 }, +/* 1069 */ { MAD_F(0x05564d83) /* 0.333570016 */, 15 }, +/* 1070 */ { MAD_F(0x055801d8) /* 0.333986133 */, 15 }, +/* 1071 */ { MAD_F(0x0559b64f) /* 0.334402380 */, 15 }, + +/* 1072 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 15 }, +/* 1073 */ { MAD_F(0x055d1fa6) /* 0.335235262 */, 15 }, +/* 1074 */ { MAD_F(0x055ed486) /* 0.335651898 */, 15 }, +/* 1075 */ { MAD_F(0x05608988) /* 0.336068662 */, 15 }, +/* 1076 */ { MAD_F(0x05623ead) /* 0.336485556 */, 15 }, +/* 1077 */ { MAD_F(0x0563f3f5) /* 0.336902579 */, 15 }, +/* 1078 */ { MAD_F(0x0565a960) /* 0.337319732 */, 15 }, +/* 1079 */ { MAD_F(0x05675eed) /* 0.337737013 */, 15 }, +/* 1080 */ { MAD_F(0x0569149c) /* 0.338154423 */, 15 }, +/* 1081 */ { MAD_F(0x056aca6f) /* 0.338571962 */, 15 }, +/* 1082 */ { MAD_F(0x056c8064) /* 0.338989630 */, 15 }, +/* 1083 */ { MAD_F(0x056e367b) /* 0.339407426 */, 15 }, +/* 1084 */ { MAD_F(0x056fecb5) /* 0.339825351 */, 15 }, +/* 1085 */ { MAD_F(0x0571a311) /* 0.340243405 */, 15 }, +/* 1086 */ { MAD_F(0x05735990) /* 0.340661587 */, 15 }, +/* 1087 */ { MAD_F(0x05751032) /* 0.341079898 */, 15 }, + +/* 1088 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 15 }, +/* 1089 */ { MAD_F(0x05787ddc) /* 0.341916903 */, 15 }, +/* 1090 */ { MAD_F(0x057a34e4) /* 0.342335598 */, 15 }, +/* 1091 */ { MAD_F(0x057bec0f) /* 0.342754421 */, 15 }, +/* 1092 */ { MAD_F(0x057da35d) /* 0.343173373 */, 15 }, +/* 1093 */ { MAD_F(0x057f5acc) /* 0.343592452 */, 15 }, +/* 1094 */ { MAD_F(0x0581125e) /* 0.344011659 */, 15 }, +/* 1095 */ { MAD_F(0x0582ca12) /* 0.344430993 */, 15 }, +/* 1096 */ { MAD_F(0x058481e9) /* 0.344850455 */, 15 }, +/* 1097 */ { MAD_F(0x058639e2) /* 0.345270045 */, 15 }, +/* 1098 */ { MAD_F(0x0587f1fd) /* 0.345689763 */, 15 }, +/* 1099 */ { MAD_F(0x0589aa3a) /* 0.346109608 */, 15 }, +/* 1100 */ { MAD_F(0x058b629a) /* 0.346529580 */, 15 }, +/* 1101 */ { MAD_F(0x058d1b1b) /* 0.346949679 */, 15 }, +/* 1102 */ { MAD_F(0x058ed3bf) /* 0.347369906 */, 15 }, +/* 1103 */ { MAD_F(0x05908c85) /* 0.347790260 */, 15 }, + +/* 1104 */ { MAD_F(0x0592456d) /* 0.348210741 */, 15 }, +/* 1105 */ { MAD_F(0x0593fe77) /* 0.348631348 */, 15 }, +/* 1106 */ { MAD_F(0x0595b7a3) /* 0.349052083 */, 15 }, +/* 1107 */ { MAD_F(0x059770f1) /* 0.349472945 */, 15 }, +/* 1108 */ { MAD_F(0x05992a61) /* 0.349893933 */, 15 }, +/* 1109 */ { MAD_F(0x059ae3f3) /* 0.350315048 */, 15 }, +/* 1110 */ { MAD_F(0x059c9da8) /* 0.350736290 */, 15 }, +/* 1111 */ { MAD_F(0x059e577e) /* 0.351157658 */, 15 }, +/* 1112 */ { MAD_F(0x05a01176) /* 0.351579152 */, 15 }, +/* 1113 */ { MAD_F(0x05a1cb90) /* 0.352000773 */, 15 }, +/* 1114 */ { MAD_F(0x05a385cc) /* 0.352422520 */, 15 }, +/* 1115 */ { MAD_F(0x05a5402a) /* 0.352844394 */, 15 }, +/* 1116 */ { MAD_F(0x05a6faa9) /* 0.353266393 */, 15 }, +/* 1117 */ { MAD_F(0x05a8b54b) /* 0.353688519 */, 15 }, +/* 1118 */ { MAD_F(0x05aa700e) /* 0.354110771 */, 15 }, +/* 1119 */ { MAD_F(0x05ac2af3) /* 0.354533148 */, 15 }, + +/* 1120 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 15 }, +/* 1121 */ { MAD_F(0x05afa123) /* 0.355378281 */, 15 }, +/* 1122 */ { MAD_F(0x05b15c6d) /* 0.355801035 */, 15 }, +/* 1123 */ { MAD_F(0x05b317d9) /* 0.356223916 */, 15 }, +/* 1124 */ { MAD_F(0x05b4d367) /* 0.356646922 */, 15 }, +/* 1125 */ { MAD_F(0x05b68f16) /* 0.357070053 */, 15 }, +/* 1126 */ { MAD_F(0x05b84ae7) /* 0.357493310 */, 15 }, +/* 1127 */ { MAD_F(0x05ba06da) /* 0.357916692 */, 15 }, +/* 1128 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 15 }, +/* 1129 */ { MAD_F(0x05bd7f25) /* 0.358763832 */, 15 }, +/* 1130 */ { MAD_F(0x05bf3b7c) /* 0.359187590 */, 15 }, +/* 1131 */ { MAD_F(0x05c0f7f5) /* 0.359611472 */, 15 }, +/* 1132 */ { MAD_F(0x05c2b490) /* 0.360035480 */, 15 }, +/* 1133 */ { MAD_F(0x05c4714c) /* 0.360459613 */, 15 }, +/* 1134 */ { MAD_F(0x05c62e2a) /* 0.360883870 */, 15 }, +/* 1135 */ { MAD_F(0x05c7eb29) /* 0.361308252 */, 15 }, + +/* 1136 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 15 }, +/* 1137 */ { MAD_F(0x05cb658c) /* 0.362157390 */, 15 }, +/* 1138 */ { MAD_F(0x05cd22ef) /* 0.362582145 */, 15 }, +/* 1139 */ { MAD_F(0x05cee074) /* 0.363007026 */, 15 }, +/* 1140 */ { MAD_F(0x05d09e1b) /* 0.363432030 */, 15 }, +/* 1141 */ { MAD_F(0x05d25be2) /* 0.363857159 */, 15 }, +/* 1142 */ { MAD_F(0x05d419cb) /* 0.364282412 */, 15 }, +/* 1143 */ { MAD_F(0x05d5d7d5) /* 0.364707789 */, 15 }, +/* 1144 */ { MAD_F(0x05d79601) /* 0.365133291 */, 15 }, +/* 1145 */ { MAD_F(0x05d9544e) /* 0.365558916 */, 15 }, +/* 1146 */ { MAD_F(0x05db12bc) /* 0.365984665 */, 15 }, +/* 1147 */ { MAD_F(0x05dcd14c) /* 0.366410538 */, 15 }, +/* 1148 */ { MAD_F(0x05de8ffc) /* 0.366836535 */, 15 }, +/* 1149 */ { MAD_F(0x05e04ece) /* 0.367262655 */, 15 }, +/* 1150 */ { MAD_F(0x05e20dc1) /* 0.367688900 */, 15 }, +/* 1151 */ { MAD_F(0x05e3ccd5) /* 0.368115267 */, 15 }, + +/* 1152 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 15 }, +/* 1153 */ { MAD_F(0x05e74b61) /* 0.368968373 */, 15 }, +/* 1154 */ { MAD_F(0x05e90ad9) /* 0.369395111 */, 15 }, +/* 1155 */ { MAD_F(0x05eaca72) /* 0.369821973 */, 15 }, +/* 1156 */ { MAD_F(0x05ec8a2b) /* 0.370248957 */, 15 }, +/* 1157 */ { MAD_F(0x05ee4a06) /* 0.370676065 */, 15 }, +/* 1158 */ { MAD_F(0x05f00a02) /* 0.371103295 */, 15 }, +/* 1159 */ { MAD_F(0x05f1ca1f) /* 0.371530649 */, 15 }, +/* 1160 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 15 }, +/* 1161 */ { MAD_F(0x05f54abc) /* 0.372385725 */, 15 }, +/* 1162 */ { MAD_F(0x05f70b3c) /* 0.372813448 */, 15 }, +/* 1163 */ { MAD_F(0x05f8cbdc) /* 0.373241292 */, 15 }, +/* 1164 */ { MAD_F(0x05fa8c9e) /* 0.373669260 */, 15 }, +/* 1165 */ { MAD_F(0x05fc4d81) /* 0.374097350 */, 15 }, +/* 1166 */ { MAD_F(0x05fe0e84) /* 0.374525563 */, 15 }, +/* 1167 */ { MAD_F(0x05ffcfa8) /* 0.374953898 */, 15 }, + +/* 1168 */ { MAD_F(0x060190ee) /* 0.375382356 */, 15 }, +/* 1169 */ { MAD_F(0x06035254) /* 0.375810936 */, 15 }, +/* 1170 */ { MAD_F(0x060513da) /* 0.376239638 */, 15 }, +/* 1171 */ { MAD_F(0x0606d582) /* 0.376668462 */, 15 }, +/* 1172 */ { MAD_F(0x0608974a) /* 0.377097408 */, 15 }, +/* 1173 */ { MAD_F(0x060a5934) /* 0.377526476 */, 15 }, +/* 1174 */ { MAD_F(0x060c1b3d) /* 0.377955667 */, 15 }, +/* 1175 */ { MAD_F(0x060ddd68) /* 0.378384979 */, 15 }, +/* 1176 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 15 }, +/* 1177 */ { MAD_F(0x0611621f) /* 0.379243968 */, 15 }, +/* 1178 */ { MAD_F(0x061324ac) /* 0.379673646 */, 15 }, +/* 1179 */ { MAD_F(0x0614e759) /* 0.380103444 */, 15 }, +/* 1180 */ { MAD_F(0x0616aa27) /* 0.380533365 */, 15 }, +/* 1181 */ { MAD_F(0x06186d16) /* 0.380963407 */, 15 }, +/* 1182 */ { MAD_F(0x061a3025) /* 0.381393570 */, 15 }, +/* 1183 */ { MAD_F(0x061bf354) /* 0.381823855 */, 15 }, + +/* 1184 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 15 }, +/* 1185 */ { MAD_F(0x061f7a15) /* 0.382684788 */, 15 }, +/* 1186 */ { MAD_F(0x06213da7) /* 0.383115436 */, 15 }, +/* 1187 */ { MAD_F(0x06230158) /* 0.383546205 */, 15 }, +/* 1188 */ { MAD_F(0x0624c52a) /* 0.383977096 */, 15 }, +/* 1189 */ { MAD_F(0x0626891d) /* 0.384408107 */, 15 }, +/* 1190 */ { MAD_F(0x06284d30) /* 0.384839239 */, 15 }, +/* 1191 */ { MAD_F(0x062a1164) /* 0.385270492 */, 15 }, +/* 1192 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 15 }, +/* 1193 */ { MAD_F(0x062d9a2c) /* 0.386133359 */, 15 }, +/* 1194 */ { MAD_F(0x062f5ec1) /* 0.386564974 */, 15 }, +/* 1195 */ { MAD_F(0x06312376) /* 0.386996709 */, 15 }, +/* 1196 */ { MAD_F(0x0632e84b) /* 0.387428565 */, 15 }, +/* 1197 */ { MAD_F(0x0634ad41) /* 0.387860541 */, 15 }, +/* 1198 */ { MAD_F(0x06367257) /* 0.388292637 */, 15 }, +/* 1199 */ { MAD_F(0x0638378d) /* 0.388724854 */, 15 }, + +/* 1200 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 15 }, +/* 1201 */ { MAD_F(0x063bc25b) /* 0.389589648 */, 15 }, +/* 1202 */ { MAD_F(0x063d87f2) /* 0.390022225 */, 15 }, +/* 1203 */ { MAD_F(0x063f4da9) /* 0.390454922 */, 15 }, +/* 1204 */ { MAD_F(0x06411380) /* 0.390887739 */, 15 }, +/* 1205 */ { MAD_F(0x0642d978) /* 0.391320675 */, 15 }, +/* 1206 */ { MAD_F(0x06449f8f) /* 0.391753732 */, 15 }, +/* 1207 */ { MAD_F(0x064665c7) /* 0.392186908 */, 15 }, +/* 1208 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 15 }, +/* 1209 */ { MAD_F(0x0649f297) /* 0.393053619 */, 15 }, +/* 1210 */ { MAD_F(0x064bb92f) /* 0.393487154 */, 15 }, +/* 1211 */ { MAD_F(0x064d7fe8) /* 0.393920808 */, 15 }, +/* 1212 */ { MAD_F(0x064f46c0) /* 0.394354582 */, 15 }, +/* 1213 */ { MAD_F(0x06510db8) /* 0.394788475 */, 15 }, +/* 1214 */ { MAD_F(0x0652d4d0) /* 0.395222488 */, 15 }, +/* 1215 */ { MAD_F(0x06549c09) /* 0.395656619 */, 15 }, + +/* 1216 */ { MAD_F(0x06566361) /* 0.396090870 */, 15 }, +/* 1217 */ { MAD_F(0x06582ad9) /* 0.396525239 */, 15 }, +/* 1218 */ { MAD_F(0x0659f271) /* 0.396959728 */, 15 }, +/* 1219 */ { MAD_F(0x065bba29) /* 0.397394336 */, 15 }, +/* 1220 */ { MAD_F(0x065d8201) /* 0.397829062 */, 15 }, +/* 1221 */ { MAD_F(0x065f49f9) /* 0.398263907 */, 15 }, +/* 1222 */ { MAD_F(0x06611211) /* 0.398698871 */, 15 }, +/* 1223 */ { MAD_F(0x0662da49) /* 0.399133954 */, 15 }, +/* 1224 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 15 }, +/* 1225 */ { MAD_F(0x06666b17) /* 0.400004475 */, 15 }, +/* 1226 */ { MAD_F(0x066833ae) /* 0.400439913 */, 15 }, +/* 1227 */ { MAD_F(0x0669fc65) /* 0.400875470 */, 15 }, +/* 1228 */ { MAD_F(0x066bc53c) /* 0.401311145 */, 15 }, +/* 1229 */ { MAD_F(0x066d8e32) /* 0.401746938 */, 15 }, +/* 1230 */ { MAD_F(0x066f5748) /* 0.402182850 */, 15 }, +/* 1231 */ { MAD_F(0x0671207e) /* 0.402618879 */, 15 }, + +/* 1232 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 15 }, +/* 1233 */ { MAD_F(0x0674b349) /* 0.403491293 */, 15 }, +/* 1234 */ { MAD_F(0x06767cde) /* 0.403927676 */, 15 }, +/* 1235 */ { MAD_F(0x06784692) /* 0.404364178 */, 15 }, +/* 1236 */ { MAD_F(0x067a1066) /* 0.404800797 */, 15 }, +/* 1237 */ { MAD_F(0x067bda5a) /* 0.405237535 */, 15 }, +/* 1238 */ { MAD_F(0x067da46d) /* 0.405674390 */, 15 }, +/* 1239 */ { MAD_F(0x067f6ea0) /* 0.406111362 */, 15 }, +/* 1240 */ { MAD_F(0x068138f3) /* 0.406548452 */, 15 }, +/* 1241 */ { MAD_F(0x06830365) /* 0.406985660 */, 15 }, +/* 1242 */ { MAD_F(0x0684cdf6) /* 0.407422985 */, 15 }, +/* 1243 */ { MAD_F(0x068698a8) /* 0.407860427 */, 15 }, +/* 1244 */ { MAD_F(0x06886378) /* 0.408297987 */, 15 }, +/* 1245 */ { MAD_F(0x068a2e68) /* 0.408735664 */, 15 }, +/* 1246 */ { MAD_F(0x068bf978) /* 0.409173458 */, 15 }, +/* 1247 */ { MAD_F(0x068dc4a7) /* 0.409611370 */, 15 }, + +/* 1248 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 15 }, +/* 1249 */ { MAD_F(0x06915b63) /* 0.410487544 */, 15 }, +/* 1250 */ { MAD_F(0x069326f0) /* 0.410925806 */, 15 }, +/* 1251 */ { MAD_F(0x0694f29c) /* 0.411364185 */, 15 }, +/* 1252 */ { MAD_F(0x0696be68) /* 0.411802681 */, 15 }, +/* 1253 */ { MAD_F(0x06988a54) /* 0.412241294 */, 15 }, +/* 1254 */ { MAD_F(0x069a565e) /* 0.412680024 */, 15 }, +/* 1255 */ { MAD_F(0x069c2288) /* 0.413118870 */, 15 }, +/* 1256 */ { MAD_F(0x069deed1) /* 0.413557833 */, 15 }, +/* 1257 */ { MAD_F(0x069fbb3a) /* 0.413996912 */, 15 }, +/* 1258 */ { MAD_F(0x06a187c1) /* 0.414436108 */, 15 }, +/* 1259 */ { MAD_F(0x06a35468) /* 0.414875420 */, 15 }, +/* 1260 */ { MAD_F(0x06a5212f) /* 0.415314849 */, 15 }, +/* 1261 */ { MAD_F(0x06a6ee14) /* 0.415754393 */, 15 }, +/* 1262 */ { MAD_F(0x06a8bb18) /* 0.416194054 */, 15 }, +/* 1263 */ { MAD_F(0x06aa883c) /* 0.416633831 */, 15 }, + +/* 1264 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 15 }, +/* 1265 */ { MAD_F(0x06ae22e1) /* 0.417513734 */, 15 }, +/* 1266 */ { MAD_F(0x06aff062) /* 0.417953859 */, 15 }, +/* 1267 */ { MAD_F(0x06b1be03) /* 0.418394100 */, 15 }, +/* 1268 */ { MAD_F(0x06b38bc2) /* 0.418834457 */, 15 }, +/* 1269 */ { MAD_F(0x06b559a1) /* 0.419274929 */, 15 }, +/* 1270 */ { MAD_F(0x06b7279e) /* 0.419715518 */, 15 }, +/* 1271 */ { MAD_F(0x06b8f5bb) /* 0.420156222 */, 15 }, +/* 1272 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 15 }, +/* 1273 */ { MAD_F(0x06bc9251) /* 0.421037977 */, 15 }, +/* 1274 */ { MAD_F(0x06be60cb) /* 0.421479027 */, 15 }, +/* 1275 */ { MAD_F(0x06c02f63) /* 0.421920193 */, 15 }, +/* 1276 */ { MAD_F(0x06c1fe1b) /* 0.422361475 */, 15 }, +/* 1277 */ { MAD_F(0x06c3ccf1) /* 0.422802871 */, 15 }, +/* 1278 */ { MAD_F(0x06c59be7) /* 0.423244383 */, 15 }, +/* 1279 */ { MAD_F(0x06c76afb) /* 0.423686010 */, 15 }, + +/* 1280 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 15 }, +/* 1281 */ { MAD_F(0x06cb0981) /* 0.424569610 */, 15 }, +/* 1282 */ { MAD_F(0x06ccd8f2) /* 0.425011582 */, 15 }, +/* 1283 */ { MAD_F(0x06cea881) /* 0.425453669 */, 15 }, +/* 1284 */ { MAD_F(0x06d07830) /* 0.425895871 */, 15 }, +/* 1285 */ { MAD_F(0x06d247fe) /* 0.426338188 */, 15 }, +/* 1286 */ { MAD_F(0x06d417ea) /* 0.426780620 */, 15 }, +/* 1287 */ { MAD_F(0x06d5e7f5) /* 0.427223166 */, 15 }, +/* 1288 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 15 }, +/* 1289 */ { MAD_F(0x06d98868) /* 0.428108603 */, 15 }, +/* 1290 */ { MAD_F(0x06db58cf) /* 0.428551493 */, 15 }, +/* 1291 */ { MAD_F(0x06dd2955) /* 0.428994497 */, 15 }, +/* 1292 */ { MAD_F(0x06def9fa) /* 0.429437616 */, 15 }, +/* 1293 */ { MAD_F(0x06e0cabe) /* 0.429880849 */, 15 }, +/* 1294 */ { MAD_F(0x06e29ba0) /* 0.430324197 */, 15 }, +/* 1295 */ { MAD_F(0x06e46ca1) /* 0.430767659 */, 15 }, + +/* 1296 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 15 }, +/* 1297 */ { MAD_F(0x06e80efe) /* 0.431654924 */, 15 }, +/* 1298 */ { MAD_F(0x06e9e05b) /* 0.432098728 */, 15 }, +/* 1299 */ { MAD_F(0x06ebb1d6) /* 0.432542647 */, 15 }, +/* 1300 */ { MAD_F(0x06ed8370) /* 0.432986678 */, 15 }, +/* 1301 */ { MAD_F(0x06ef5529) /* 0.433430824 */, 15 }, +/* 1302 */ { MAD_F(0x06f12700) /* 0.433875084 */, 15 }, +/* 1303 */ { MAD_F(0x06f2f8f5) /* 0.434319457 */, 15 }, +/* 1304 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 15 }, +/* 1305 */ { MAD_F(0x06f69d3c) /* 0.435208545 */, 15 }, +/* 1306 */ { MAD_F(0x06f86f8d) /* 0.435653259 */, 15 }, +/* 1307 */ { MAD_F(0x06fa41fd) /* 0.436098087 */, 15 }, +/* 1308 */ { MAD_F(0x06fc148b) /* 0.436543029 */, 15 }, +/* 1309 */ { MAD_F(0x06fde737) /* 0.436988083 */, 15 }, +/* 1310 */ { MAD_F(0x06ffba02) /* 0.437433251 */, 15 }, +/* 1311 */ { MAD_F(0x07018ceb) /* 0.437878533 */, 15 }, + +/* 1312 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 15 }, +/* 1313 */ { MAD_F(0x07053319) /* 0.438769435 */, 15 }, +/* 1314 */ { MAD_F(0x0707065d) /* 0.439215056 */, 15 }, +/* 1315 */ { MAD_F(0x0708d9c0) /* 0.439660790 */, 15 }, +/* 1316 */ { MAD_F(0x070aad41) /* 0.440106636 */, 15 }, +/* 1317 */ { MAD_F(0x070c80e1) /* 0.440552596 */, 15 }, +/* 1318 */ { MAD_F(0x070e549f) /* 0.440998669 */, 15 }, +/* 1319 */ { MAD_F(0x0710287b) /* 0.441444855 */, 15 }, +/* 1320 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 15 }, +/* 1321 */ { MAD_F(0x0713d08d) /* 0.442337564 */, 15 }, +/* 1322 */ { MAD_F(0x0715a4c4) /* 0.442784088 */, 15 }, +/* 1323 */ { MAD_F(0x07177919) /* 0.443230724 */, 15 }, +/* 1324 */ { MAD_F(0x07194d8c) /* 0.443677473 */, 15 }, +/* 1325 */ { MAD_F(0x071b221e) /* 0.444124334 */, 15 }, +/* 1326 */ { MAD_F(0x071cf6ce) /* 0.444571308 */, 15 }, +/* 1327 */ { MAD_F(0x071ecb9b) /* 0.445018394 */, 15 }, + +/* 1328 */ { MAD_F(0x0720a087) /* 0.445465593 */, 15 }, +/* 1329 */ { MAD_F(0x07227591) /* 0.445912903 */, 15 }, +/* 1330 */ { MAD_F(0x07244ab9) /* 0.446360326 */, 15 }, +/* 1331 */ { MAD_F(0x07262000) /* 0.446807861 */, 15 }, +/* 1332 */ { MAD_F(0x0727f564) /* 0.447255509 */, 15 }, +/* 1333 */ { MAD_F(0x0729cae7) /* 0.447703268 */, 15 }, +/* 1334 */ { MAD_F(0x072ba087) /* 0.448151139 */, 15 }, +/* 1335 */ { MAD_F(0x072d7646) /* 0.448599122 */, 15 }, +/* 1336 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 15 }, +/* 1337 */ { MAD_F(0x0731221d) /* 0.449495424 */, 15 }, +/* 1338 */ { MAD_F(0x0732f835) /* 0.449943742 */, 15 }, +/* 1339 */ { MAD_F(0x0734ce6c) /* 0.450392173 */, 15 }, +/* 1340 */ { MAD_F(0x0736a4c1) /* 0.450840715 */, 15 }, +/* 1341 */ { MAD_F(0x07387b33) /* 0.451289368 */, 15 }, +/* 1342 */ { MAD_F(0x073a51c4) /* 0.451738133 */, 15 }, +/* 1343 */ { MAD_F(0x073c2872) /* 0.452187010 */, 15 }, + +/* 1344 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 15 }, +/* 1345 */ { MAD_F(0x073fd628) /* 0.453085097 */, 15 }, +/* 1346 */ { MAD_F(0x0741ad30) /* 0.453534308 */, 15 }, +/* 1347 */ { MAD_F(0x07438456) /* 0.453983630 */, 15 }, +/* 1348 */ { MAD_F(0x07455b9a) /* 0.454433063 */, 15 }, +/* 1349 */ { MAD_F(0x074732fc) /* 0.454882607 */, 15 }, +/* 1350 */ { MAD_F(0x07490a7b) /* 0.455332262 */, 15 }, +/* 1351 */ { MAD_F(0x074ae218) /* 0.455782029 */, 15 }, +/* 1352 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 15 }, +/* 1353 */ { MAD_F(0x074e91ac) /* 0.456681894 */, 15 }, +/* 1354 */ { MAD_F(0x075069a3) /* 0.457131993 */, 15 }, +/* 1355 */ { MAD_F(0x075241b7) /* 0.457582203 */, 15 }, +/* 1356 */ { MAD_F(0x075419e9) /* 0.458032524 */, 15 }, +/* 1357 */ { MAD_F(0x0755f239) /* 0.458482956 */, 15 }, +/* 1358 */ { MAD_F(0x0757caa7) /* 0.458933498 */, 15 }, +/* 1359 */ { MAD_F(0x0759a332) /* 0.459384151 */, 15 }, + +/* 1360 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 15 }, +/* 1361 */ { MAD_F(0x075d54a1) /* 0.460285788 */, 15 }, +/* 1362 */ { MAD_F(0x075f2d85) /* 0.460736772 */, 15 }, +/* 1363 */ { MAD_F(0x07610687) /* 0.461187867 */, 15 }, +/* 1364 */ { MAD_F(0x0762dfa6) /* 0.461639071 */, 15 }, +/* 1365 */ { MAD_F(0x0764b8e3) /* 0.462090387 */, 15 }, +/* 1366 */ { MAD_F(0x0766923e) /* 0.462541812 */, 15 }, +/* 1367 */ { MAD_F(0x07686bb6) /* 0.462993348 */, 15 }, +/* 1368 */ { MAD_F(0x076a454c) /* 0.463444993 */, 15 }, +/* 1369 */ { MAD_F(0x076c1eff) /* 0.463896749 */, 15 }, +/* 1370 */ { MAD_F(0x076df8d0) /* 0.464348615 */, 15 }, +/* 1371 */ { MAD_F(0x076fd2be) /* 0.464800591 */, 15 }, +/* 1372 */ { MAD_F(0x0771acca) /* 0.465252676 */, 15 }, +/* 1373 */ { MAD_F(0x077386f3) /* 0.465704872 */, 15 }, +/* 1374 */ { MAD_F(0x0775613a) /* 0.466157177 */, 15 }, +/* 1375 */ { MAD_F(0x07773b9e) /* 0.466609592 */, 15 }, + +/* 1376 */ { MAD_F(0x07791620) /* 0.467062117 */, 15 }, +/* 1377 */ { MAD_F(0x077af0bf) /* 0.467514751 */, 15 }, +/* 1378 */ { MAD_F(0x077ccb7c) /* 0.467967495 */, 15 }, +/* 1379 */ { MAD_F(0x077ea656) /* 0.468420349 */, 15 }, +/* 1380 */ { MAD_F(0x0780814d) /* 0.468873312 */, 15 }, +/* 1381 */ { MAD_F(0x07825c62) /* 0.469326384 */, 15 }, +/* 1382 */ { MAD_F(0x07843794) /* 0.469779566 */, 15 }, +/* 1383 */ { MAD_F(0x078612e3) /* 0.470232857 */, 15 }, +/* 1384 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 15 }, +/* 1385 */ { MAD_F(0x0789c9da) /* 0.471139767 */, 15 }, +/* 1386 */ { MAD_F(0x078ba581) /* 0.471593386 */, 15 }, +/* 1387 */ { MAD_F(0x078d8146) /* 0.472047114 */, 15 }, +/* 1388 */ { MAD_F(0x078f5d28) /* 0.472500951 */, 15 }, +/* 1389 */ { MAD_F(0x07913927) /* 0.472954896 */, 15 }, +/* 1390 */ { MAD_F(0x07931543) /* 0.473408951 */, 15 }, +/* 1391 */ { MAD_F(0x0794f17d) /* 0.473863115 */, 15 }, + +/* 1392 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 15 }, +/* 1393 */ { MAD_F(0x0798aa48) /* 0.474771769 */, 15 }, +/* 1394 */ { MAD_F(0x079a86d9) /* 0.475226259 */, 15 }, +/* 1395 */ { MAD_F(0x079c6388) /* 0.475680858 */, 15 }, +/* 1396 */ { MAD_F(0x079e4053) /* 0.476135565 */, 15 }, +/* 1397 */ { MAD_F(0x07a01d3c) /* 0.476590381 */, 15 }, +/* 1398 */ { MAD_F(0x07a1fa42) /* 0.477045306 */, 15 }, +/* 1399 */ { MAD_F(0x07a3d765) /* 0.477500339 */, 15 }, +/* 1400 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 15 }, +/* 1401 */ { MAD_F(0x07a79202) /* 0.478410731 */, 15 }, +/* 1402 */ { MAD_F(0x07a96f7d) /* 0.478866089 */, 15 }, +/* 1403 */ { MAD_F(0x07ab4d14) /* 0.479321555 */, 15 }, +/* 1404 */ { MAD_F(0x07ad2ac8) /* 0.479777130 */, 15 }, +/* 1405 */ { MAD_F(0x07af089a) /* 0.480232813 */, 15 }, +/* 1406 */ { MAD_F(0x07b0e688) /* 0.480688604 */, 15 }, +/* 1407 */ { MAD_F(0x07b2c494) /* 0.481144503 */, 15 }, + +/* 1408 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 15 }, +/* 1409 */ { MAD_F(0x07b68102) /* 0.482056625 */, 15 }, +/* 1410 */ { MAD_F(0x07b85f64) /* 0.482512848 */, 15 }, +/* 1411 */ { MAD_F(0x07ba3de4) /* 0.482969179 */, 15 }, +/* 1412 */ { MAD_F(0x07bc1c80) /* 0.483425618 */, 15 }, +/* 1413 */ { MAD_F(0x07bdfb39) /* 0.483882164 */, 15 }, +/* 1414 */ { MAD_F(0x07bfda0f) /* 0.484338818 */, 15 }, +/* 1415 */ { MAD_F(0x07c1b902) /* 0.484795580 */, 15 }, +/* 1416 */ { MAD_F(0x07c39812) /* 0.485252449 */, 15 }, +/* 1417 */ { MAD_F(0x07c5773f) /* 0.485709426 */, 15 }, +/* 1418 */ { MAD_F(0x07c75689) /* 0.486166511 */, 15 }, +/* 1419 */ { MAD_F(0x07c935ef) /* 0.486623703 */, 15 }, +/* 1420 */ { MAD_F(0x07cb1573) /* 0.487081002 */, 15 }, +/* 1421 */ { MAD_F(0x07ccf513) /* 0.487538409 */, 15 }, +/* 1422 */ { MAD_F(0x07ced4d0) /* 0.487995923 */, 15 }, +/* 1423 */ { MAD_F(0x07d0b4aa) /* 0.488453544 */, 15 }, + +/* 1424 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 15 }, +/* 1425 */ { MAD_F(0x07d474b3) /* 0.489369108 */, 15 }, +/* 1426 */ { MAD_F(0x07d654e4) /* 0.489827051 */, 15 }, +/* 1427 */ { MAD_F(0x07d83530) /* 0.490285101 */, 15 }, +/* 1428 */ { MAD_F(0x07da159a) /* 0.490743258 */, 15 }, +/* 1429 */ { MAD_F(0x07dbf620) /* 0.491201522 */, 15 }, +/* 1430 */ { MAD_F(0x07ddd6c3) /* 0.491659892 */, 15 }, +/* 1431 */ { MAD_F(0x07dfb783) /* 0.492118370 */, 15 }, +/* 1432 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 15 }, +/* 1433 */ { MAD_F(0x07e37958) /* 0.493035645 */, 15 }, +/* 1434 */ { MAD_F(0x07e55a6e) /* 0.493494443 */, 15 }, +/* 1435 */ { MAD_F(0x07e73ba0) /* 0.493953348 */, 15 }, +/* 1436 */ { MAD_F(0x07e91cef) /* 0.494412359 */, 15 }, +/* 1437 */ { MAD_F(0x07eafe5a) /* 0.494871476 */, 15 }, +/* 1438 */ { MAD_F(0x07ecdfe2) /* 0.495330701 */, 15 }, +/* 1439 */ { MAD_F(0x07eec187) /* 0.495790031 */, 15 }, + +/* 1440 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 15 }, +/* 1441 */ { MAD_F(0x07f28526) /* 0.496709012 */, 15 }, +/* 1442 */ { MAD_F(0x07f46720) /* 0.497168662 */, 15 }, +/* 1443 */ { MAD_F(0x07f64937) /* 0.497628418 */, 15 }, +/* 1444 */ { MAD_F(0x07f82b6a) /* 0.498088280 */, 15 }, +/* 1445 */ { MAD_F(0x07fa0dba) /* 0.498548248 */, 15 }, +/* 1446 */ { MAD_F(0x07fbf026) /* 0.499008323 */, 15 }, +/* 1447 */ { MAD_F(0x07fdd2af) /* 0.499468503 */, 15 }, +/* 1448 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 15 }, +/* 1449 */ { MAD_F(0x0400cc0b) /* 0.250194591 */, 16 }, +/* 1450 */ { MAD_F(0x0401bd7a) /* 0.250424840 */, 16 }, +/* 1451 */ { MAD_F(0x0402aef7) /* 0.250655143 */, 16 }, +/* 1452 */ { MAD_F(0x0403a083) /* 0.250885498 */, 16 }, +/* 1453 */ { MAD_F(0x0404921c) /* 0.251115906 */, 16 }, +/* 1454 */ { MAD_F(0x040583c4) /* 0.251346367 */, 16 }, +/* 1455 */ { MAD_F(0x0406757a) /* 0.251576880 */, 16 }, + +/* 1456 */ { MAD_F(0x0407673f) /* 0.251807447 */, 16 }, +/* 1457 */ { MAD_F(0x04085911) /* 0.252038066 */, 16 }, +/* 1458 */ { MAD_F(0x04094af1) /* 0.252268738 */, 16 }, +/* 1459 */ { MAD_F(0x040a3ce0) /* 0.252499463 */, 16 }, +/* 1460 */ { MAD_F(0x040b2edd) /* 0.252730240 */, 16 }, +/* 1461 */ { MAD_F(0x040c20e8) /* 0.252961071 */, 16 }, +/* 1462 */ { MAD_F(0x040d1301) /* 0.253191953 */, 16 }, +/* 1463 */ { MAD_F(0x040e0529) /* 0.253422889 */, 16 }, +/* 1464 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 16 }, +/* 1465 */ { MAD_F(0x040fe9a1) /* 0.253884918 */, 16 }, +/* 1466 */ { MAD_F(0x0410dbf3) /* 0.254116011 */, 16 }, +/* 1467 */ { MAD_F(0x0411ce53) /* 0.254347157 */, 16 }, +/* 1468 */ { MAD_F(0x0412c0c1) /* 0.254578356 */, 16 }, +/* 1469 */ { MAD_F(0x0413b33d) /* 0.254809606 */, 16 }, +/* 1470 */ { MAD_F(0x0414a5c7) /* 0.255040910 */, 16 }, +/* 1471 */ { MAD_F(0x0415985f) /* 0.255272266 */, 16 }, + +/* 1472 */ { MAD_F(0x04168b05) /* 0.255503674 */, 16 }, +/* 1473 */ { MAD_F(0x04177db9) /* 0.255735135 */, 16 }, +/* 1474 */ { MAD_F(0x0418707c) /* 0.255966648 */, 16 }, +/* 1475 */ { MAD_F(0x0419634c) /* 0.256198213 */, 16 }, +/* 1476 */ { MAD_F(0x041a562a) /* 0.256429831 */, 16 }, +/* 1477 */ { MAD_F(0x041b4917) /* 0.256661501 */, 16 }, +/* 1478 */ { MAD_F(0x041c3c11) /* 0.256893223 */, 16 }, +/* 1479 */ { MAD_F(0x041d2f1a) /* 0.257124998 */, 16 }, +/* 1480 */ { MAD_F(0x041e2230) /* 0.257356825 */, 16 }, +/* 1481 */ { MAD_F(0x041f1555) /* 0.257588704 */, 16 }, +/* 1482 */ { MAD_F(0x04200888) /* 0.257820635 */, 16 }, +/* 1483 */ { MAD_F(0x0420fbc8) /* 0.258052619 */, 16 }, +/* 1484 */ { MAD_F(0x0421ef17) /* 0.258284654 */, 16 }, +/* 1485 */ { MAD_F(0x0422e273) /* 0.258516742 */, 16 }, +/* 1486 */ { MAD_F(0x0423d5de) /* 0.258748882 */, 16 }, +/* 1487 */ { MAD_F(0x0424c956) /* 0.258981074 */, 16 }, + +/* 1488 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 16 }, +/* 1489 */ { MAD_F(0x0426b071) /* 0.259445614 */, 16 }, +/* 1490 */ { MAD_F(0x0427a414) /* 0.259677962 */, 16 }, +/* 1491 */ { MAD_F(0x042897c4) /* 0.259910362 */, 16 }, +/* 1492 */ { MAD_F(0x04298b83) /* 0.260142814 */, 16 }, +/* 1493 */ { MAD_F(0x042a7f4f) /* 0.260375318 */, 16 }, +/* 1494 */ { MAD_F(0x042b7329) /* 0.260607874 */, 16 }, +/* 1495 */ { MAD_F(0x042c6711) /* 0.260840481 */, 16 }, +/* 1496 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 16 }, +/* 1497 */ { MAD_F(0x042e4f0b) /* 0.261305852 */, 16 }, +/* 1498 */ { MAD_F(0x042f431d) /* 0.261538616 */, 16 }, +/* 1499 */ { MAD_F(0x0430373d) /* 0.261771431 */, 16 }, +/* 1500 */ { MAD_F(0x04312b6b) /* 0.262004297 */, 16 }, +/* 1501 */ { MAD_F(0x04321fa6) /* 0.262237216 */, 16 }, +/* 1502 */ { MAD_F(0x043313f0) /* 0.262470186 */, 16 }, +/* 1503 */ { MAD_F(0x04340847) /* 0.262703208 */, 16 }, + +/* 1504 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 16 }, +/* 1505 */ { MAD_F(0x0435f120) /* 0.263169407 */, 16 }, +/* 1506 */ { MAD_F(0x0436e5a1) /* 0.263402584 */, 16 }, +/* 1507 */ { MAD_F(0x0437da2f) /* 0.263635813 */, 16 }, +/* 1508 */ { MAD_F(0x0438cecc) /* 0.263869093 */, 16 }, +/* 1509 */ { MAD_F(0x0439c377) /* 0.264102425 */, 16 }, +/* 1510 */ { MAD_F(0x043ab82f) /* 0.264335808 */, 16 }, +/* 1511 */ { MAD_F(0x043bacf5) /* 0.264569243 */, 16 }, +/* 1512 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 16 }, +/* 1513 */ { MAD_F(0x043d96ab) /* 0.265036267 */, 16 }, +/* 1514 */ { MAD_F(0x043e8b9b) /* 0.265269857 */, 16 }, +/* 1515 */ { MAD_F(0x043f8098) /* 0.265503498 */, 16 }, +/* 1516 */ { MAD_F(0x044075a3) /* 0.265737190 */, 16 }, +/* 1517 */ { MAD_F(0x04416abc) /* 0.265970933 */, 16 }, +/* 1518 */ { MAD_F(0x04425fe3) /* 0.266204728 */, 16 }, +/* 1519 */ { MAD_F(0x04435518) /* 0.266438574 */, 16 }, + +/* 1520 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 16 }, +/* 1521 */ { MAD_F(0x04453fab) /* 0.266906421 */, 16 }, +/* 1522 */ { MAD_F(0x04463508) /* 0.267140421 */, 16 }, +/* 1523 */ { MAD_F(0x04472a74) /* 0.267374472 */, 16 }, +/* 1524 */ { MAD_F(0x04481fee) /* 0.267608575 */, 16 }, +/* 1525 */ { MAD_F(0x04491575) /* 0.267842729 */, 16 }, +/* 1526 */ { MAD_F(0x044a0b0a) /* 0.268076934 */, 16 }, +/* 1527 */ { MAD_F(0x044b00ac) /* 0.268311190 */, 16 }, +/* 1528 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 16 }, +/* 1529 */ { MAD_F(0x044cec1b) /* 0.268779856 */, 16 }, +/* 1530 */ { MAD_F(0x044de1e7) /* 0.269014265 */, 16 }, +/* 1531 */ { MAD_F(0x044ed7c0) /* 0.269248726 */, 16 }, +/* 1532 */ { MAD_F(0x044fcda8) /* 0.269483238 */, 16 }, +/* 1533 */ { MAD_F(0x0450c39c) /* 0.269717800 */, 16 }, +/* 1534 */ { MAD_F(0x0451b99f) /* 0.269952414 */, 16 }, +/* 1535 */ { MAD_F(0x0452afaf) /* 0.270187079 */, 16 }, + +/* 1536 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 16 }, +/* 1537 */ { MAD_F(0x04549bf9) /* 0.270656561 */, 16 }, +/* 1538 */ { MAD_F(0x04559232) /* 0.270891379 */, 16 }, +/* 1539 */ { MAD_F(0x04568879) /* 0.271126247 */, 16 }, +/* 1540 */ { MAD_F(0x04577ece) /* 0.271361166 */, 16 }, +/* 1541 */ { MAD_F(0x04587530) /* 0.271596136 */, 16 }, +/* 1542 */ { MAD_F(0x04596ba0) /* 0.271831157 */, 16 }, +/* 1543 */ { MAD_F(0x045a621e) /* 0.272066229 */, 16 }, +/* 1544 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 16 }, +/* 1545 */ { MAD_F(0x045c4f42) /* 0.272536525 */, 16 }, +/* 1546 */ { MAD_F(0x045d45e9) /* 0.272771749 */, 16 }, +/* 1547 */ { MAD_F(0x045e3c9d) /* 0.273007024 */, 16 }, +/* 1548 */ { MAD_F(0x045f335e) /* 0.273242350 */, 16 }, +/* 1549 */ { MAD_F(0x04602a2e) /* 0.273477726 */, 16 }, +/* 1550 */ { MAD_F(0x0461210b) /* 0.273713153 */, 16 }, +/* 1551 */ { MAD_F(0x046217f5) /* 0.273948630 */, 16 }, + +/* 1552 */ { MAD_F(0x04630eed) /* 0.274184158 */, 16 }, +/* 1553 */ { MAD_F(0x046405f3) /* 0.274419737 */, 16 }, +/* 1554 */ { MAD_F(0x0464fd06) /* 0.274655366 */, 16 }, +/* 1555 */ { MAD_F(0x0465f427) /* 0.274891046 */, 16 }, +/* 1556 */ { MAD_F(0x0466eb55) /* 0.275126776 */, 16 }, +/* 1557 */ { MAD_F(0x0467e291) /* 0.275362557 */, 16 }, +/* 1558 */ { MAD_F(0x0468d9db) /* 0.275598389 */, 16 }, +/* 1559 */ { MAD_F(0x0469d132) /* 0.275834270 */, 16 }, +/* 1560 */ { MAD_F(0x046ac896) /* 0.276070203 */, 16 }, +/* 1561 */ { MAD_F(0x046bc009) /* 0.276306185 */, 16 }, +/* 1562 */ { MAD_F(0x046cb788) /* 0.276542218 */, 16 }, +/* 1563 */ { MAD_F(0x046daf15) /* 0.276778302 */, 16 }, +/* 1564 */ { MAD_F(0x046ea6b0) /* 0.277014435 */, 16 }, +/* 1565 */ { MAD_F(0x046f9e58) /* 0.277250619 */, 16 }, +/* 1566 */ { MAD_F(0x0470960e) /* 0.277486854 */, 16 }, +/* 1567 */ { MAD_F(0x04718dd1) /* 0.277723139 */, 16 }, + +/* 1568 */ { MAD_F(0x047285a2) /* 0.277959474 */, 16 }, +/* 1569 */ { MAD_F(0x04737d80) /* 0.278195859 */, 16 }, +/* 1570 */ { MAD_F(0x0474756c) /* 0.278432294 */, 16 }, +/* 1571 */ { MAD_F(0x04756d65) /* 0.278668780 */, 16 }, +/* 1572 */ { MAD_F(0x0476656b) /* 0.278905316 */, 16 }, +/* 1573 */ { MAD_F(0x04775d7f) /* 0.279141902 */, 16 }, +/* 1574 */ { MAD_F(0x047855a1) /* 0.279378538 */, 16 }, +/* 1575 */ { MAD_F(0x04794dd0) /* 0.279615224 */, 16 }, +/* 1576 */ { MAD_F(0x047a460c) /* 0.279851960 */, 16 }, +/* 1577 */ { MAD_F(0x047b3e56) /* 0.280088747 */, 16 }, +/* 1578 */ { MAD_F(0x047c36ae) /* 0.280325583 */, 16 }, +/* 1579 */ { MAD_F(0x047d2f12) /* 0.280562470 */, 16 }, +/* 1580 */ { MAD_F(0x047e2784) /* 0.280799406 */, 16 }, +/* 1581 */ { MAD_F(0x047f2004) /* 0.281036393 */, 16 }, +/* 1582 */ { MAD_F(0x04801891) /* 0.281273429 */, 16 }, +/* 1583 */ { MAD_F(0x0481112b) /* 0.281510516 */, 16 }, + +/* 1584 */ { MAD_F(0x048209d3) /* 0.281747652 */, 16 }, +/* 1585 */ { MAD_F(0x04830288) /* 0.281984838 */, 16 }, +/* 1586 */ { MAD_F(0x0483fb4b) /* 0.282222075 */, 16 }, +/* 1587 */ { MAD_F(0x0484f41b) /* 0.282459361 */, 16 }, +/* 1588 */ { MAD_F(0x0485ecf8) /* 0.282696697 */, 16 }, +/* 1589 */ { MAD_F(0x0486e5e3) /* 0.282934082 */, 16 }, +/* 1590 */ { MAD_F(0x0487dedb) /* 0.283171518 */, 16 }, +/* 1591 */ { MAD_F(0x0488d7e1) /* 0.283409003 */, 16 }, +/* 1592 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 16 }, +/* 1593 */ { MAD_F(0x048aca14) /* 0.283884123 */, 16 }, +/* 1594 */ { MAD_F(0x048bc341) /* 0.284121757 */, 16 }, +/* 1595 */ { MAD_F(0x048cbc7c) /* 0.284359441 */, 16 }, +/* 1596 */ { MAD_F(0x048db5c4) /* 0.284597175 */, 16 }, +/* 1597 */ { MAD_F(0x048eaf1a) /* 0.284834959 */, 16 }, +/* 1598 */ { MAD_F(0x048fa87d) /* 0.285072792 */, 16 }, +/* 1599 */ { MAD_F(0x0490a1ed) /* 0.285310675 */, 16 }, + +/* 1600 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 16 }, +/* 1601 */ { MAD_F(0x049294f5) /* 0.285786589 */, 16 }, +/* 1602 */ { MAD_F(0x04938e8d) /* 0.286024621 */, 16 }, +/* 1603 */ { MAD_F(0x04948833) /* 0.286262702 */, 16 }, +/* 1604 */ { MAD_F(0x049581e5) /* 0.286500832 */, 16 }, +/* 1605 */ { MAD_F(0x04967ba5) /* 0.286739012 */, 16 }, +/* 1606 */ { MAD_F(0x04977573) /* 0.286977242 */, 16 }, +/* 1607 */ { MAD_F(0x04986f4d) /* 0.287215521 */, 16 }, +/* 1608 */ { MAD_F(0x04996935) /* 0.287453849 */, 16 }, +/* 1609 */ { MAD_F(0x049a632a) /* 0.287692227 */, 16 }, +/* 1610 */ { MAD_F(0x049b5d2c) /* 0.287930654 */, 16 }, +/* 1611 */ { MAD_F(0x049c573c) /* 0.288169131 */, 16 }, +/* 1612 */ { MAD_F(0x049d5159) /* 0.288407657 */, 16 }, +/* 1613 */ { MAD_F(0x049e4b83) /* 0.288646232 */, 16 }, +/* 1614 */ { MAD_F(0x049f45ba) /* 0.288884857 */, 16 }, +/* 1615 */ { MAD_F(0x04a03ffe) /* 0.289123530 */, 16 }, + +/* 1616 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 16 }, +/* 1617 */ { MAD_F(0x04a234af) /* 0.289601026 */, 16 }, +/* 1618 */ { MAD_F(0x04a32f1b) /* 0.289839847 */, 16 }, +/* 1619 */ { MAD_F(0x04a42995) /* 0.290078718 */, 16 }, +/* 1620 */ { MAD_F(0x04a5241b) /* 0.290317638 */, 16 }, +/* 1621 */ { MAD_F(0x04a61eaf) /* 0.290556607 */, 16 }, +/* 1622 */ { MAD_F(0x04a71950) /* 0.290795626 */, 16 }, +/* 1623 */ { MAD_F(0x04a813fe) /* 0.291034693 */, 16 }, +/* 1624 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 16 }, +/* 1625 */ { MAD_F(0x04aa0982) /* 0.291512975 */, 16 }, +/* 1626 */ { MAD_F(0x04ab0458) /* 0.291752190 */, 16 }, +/* 1627 */ { MAD_F(0x04abff3b) /* 0.291991453 */, 16 }, +/* 1628 */ { MAD_F(0x04acfa2b) /* 0.292230766 */, 16 }, +/* 1629 */ { MAD_F(0x04adf528) /* 0.292470128 */, 16 }, +/* 1630 */ { MAD_F(0x04aef032) /* 0.292709539 */, 16 }, +/* 1631 */ { MAD_F(0x04afeb4a) /* 0.292948998 */, 16 }, + +/* 1632 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 16 }, +/* 1633 */ { MAD_F(0x04b1e1a0) /* 0.293428065 */, 16 }, +/* 1634 */ { MAD_F(0x04b2dcdf) /* 0.293667671 */, 16 }, +/* 1635 */ { MAD_F(0x04b3d82b) /* 0.293907326 */, 16 }, +/* 1636 */ { MAD_F(0x04b4d384) /* 0.294147031 */, 16 }, +/* 1637 */ { MAD_F(0x04b5ceea) /* 0.294386784 */, 16 }, +/* 1638 */ { MAD_F(0x04b6ca5e) /* 0.294626585 */, 16 }, +/* 1639 */ { MAD_F(0x04b7c5de) /* 0.294866436 */, 16 }, +/* 1640 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 16 }, +/* 1641 */ { MAD_F(0x04b9bd06) /* 0.295346284 */, 16 }, +/* 1642 */ { MAD_F(0x04bab8ae) /* 0.295586281 */, 16 }, +/* 1643 */ { MAD_F(0x04bbb463) /* 0.295826327 */, 16 }, +/* 1644 */ { MAD_F(0x04bcb024) /* 0.296066421 */, 16 }, +/* 1645 */ { MAD_F(0x04bdabf3) /* 0.296306564 */, 16 }, +/* 1646 */ { MAD_F(0x04bea7cf) /* 0.296546756 */, 16 }, +/* 1647 */ { MAD_F(0x04bfa3b8) /* 0.296786996 */, 16 }, + +/* 1648 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 16 }, +/* 1649 */ { MAD_F(0x04c19bb2) /* 0.297267623 */, 16 }, +/* 1650 */ { MAD_F(0x04c297c2) /* 0.297508009 */, 16 }, +/* 1651 */ { MAD_F(0x04c393df) /* 0.297748444 */, 16 }, +/* 1652 */ { MAD_F(0x04c49009) /* 0.297988927 */, 16 }, +/* 1653 */ { MAD_F(0x04c58c41) /* 0.298229459 */, 16 }, +/* 1654 */ { MAD_F(0x04c68885) /* 0.298470039 */, 16 }, +/* 1655 */ { MAD_F(0x04c784d6) /* 0.298710668 */, 16 }, +/* 1656 */ { MAD_F(0x04c88135) /* 0.298951346 */, 16 }, +/* 1657 */ { MAD_F(0x04c97da0) /* 0.299192071 */, 16 }, +/* 1658 */ { MAD_F(0x04ca7a18) /* 0.299432846 */, 16 }, +/* 1659 */ { MAD_F(0x04cb769e) /* 0.299673668 */, 16 }, +/* 1660 */ { MAD_F(0x04cc7330) /* 0.299914539 */, 16 }, +/* 1661 */ { MAD_F(0x04cd6fcf) /* 0.300155459 */, 16 }, +/* 1662 */ { MAD_F(0x04ce6c7b) /* 0.300396426 */, 16 }, +/* 1663 */ { MAD_F(0x04cf6935) /* 0.300637443 */, 16 }, + +/* 1664 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 16 }, +/* 1665 */ { MAD_F(0x04d162ce) /* 0.301119620 */, 16 }, +/* 1666 */ { MAD_F(0x04d25fae) /* 0.301360781 */, 16 }, +/* 1667 */ { MAD_F(0x04d35c9b) /* 0.301601990 */, 16 }, +/* 1668 */ { MAD_F(0x04d45995) /* 0.301843247 */, 16 }, +/* 1669 */ { MAD_F(0x04d5569c) /* 0.302084553 */, 16 }, +/* 1670 */ { MAD_F(0x04d653b0) /* 0.302325907 */, 16 }, +/* 1671 */ { MAD_F(0x04d750d1) /* 0.302567309 */, 16 }, +/* 1672 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 16 }, +/* 1673 */ { MAD_F(0x04d94b3a) /* 0.303050257 */, 16 }, +/* 1674 */ { MAD_F(0x04da4881) /* 0.303291804 */, 16 }, +/* 1675 */ { MAD_F(0x04db45d6) /* 0.303533399 */, 16 }, +/* 1676 */ { MAD_F(0x04dc4337) /* 0.303775041 */, 16 }, +/* 1677 */ { MAD_F(0x04dd40a6) /* 0.304016732 */, 16 }, +/* 1678 */ { MAD_F(0x04de3e21) /* 0.304258471 */, 16 }, +/* 1679 */ { MAD_F(0x04df3ba9) /* 0.304500257 */, 16 }, + +/* 1680 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 16 }, +/* 1681 */ { MAD_F(0x04e136e0) /* 0.304983975 */, 16 }, +/* 1682 */ { MAD_F(0x04e2348f) /* 0.305225906 */, 16 }, +/* 1683 */ { MAD_F(0x04e3324b) /* 0.305467885 */, 16 }, +/* 1684 */ { MAD_F(0x04e43013) /* 0.305709911 */, 16 }, +/* 1685 */ { MAD_F(0x04e52de9) /* 0.305951986 */, 16 }, +/* 1686 */ { MAD_F(0x04e62bcb) /* 0.306194108 */, 16 }, +/* 1687 */ { MAD_F(0x04e729ba) /* 0.306436279 */, 16 }, +/* 1688 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 16 }, +/* 1689 */ { MAD_F(0x04e925bf) /* 0.306920763 */, 16 }, +/* 1690 */ { MAD_F(0x04ea23d4) /* 0.307163077 */, 16 }, +/* 1691 */ { MAD_F(0x04eb21f7) /* 0.307405438 */, 16 }, +/* 1692 */ { MAD_F(0x04ec2026) /* 0.307647848 */, 16 }, +/* 1693 */ { MAD_F(0x04ed1e62) /* 0.307890305 */, 16 }, +/* 1694 */ { MAD_F(0x04ee1cab) /* 0.308132810 */, 16 }, +/* 1695 */ { MAD_F(0x04ef1b01) /* 0.308375362 */, 16 }, + +/* 1696 */ { MAD_F(0x04f01963) /* 0.308617963 */, 16 }, +/* 1697 */ { MAD_F(0x04f117d3) /* 0.308860611 */, 16 }, +/* 1698 */ { MAD_F(0x04f2164f) /* 0.309103306 */, 16 }, +/* 1699 */ { MAD_F(0x04f314d8) /* 0.309346050 */, 16 }, +/* 1700 */ { MAD_F(0x04f4136d) /* 0.309588841 */, 16 }, +/* 1701 */ { MAD_F(0x04f51210) /* 0.309831679 */, 16 }, +/* 1702 */ { MAD_F(0x04f610bf) /* 0.310074565 */, 16 }, +/* 1703 */ { MAD_F(0x04f70f7b) /* 0.310317499 */, 16 }, +/* 1704 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 16 }, +/* 1705 */ { MAD_F(0x04f90d19) /* 0.310803509 */, 16 }, +/* 1706 */ { MAD_F(0x04fa0bfc) /* 0.311046586 */, 16 }, +/* 1707 */ { MAD_F(0x04fb0aeb) /* 0.311289710 */, 16 }, +/* 1708 */ { MAD_F(0x04fc09e7) /* 0.311532881 */, 16 }, +/* 1709 */ { MAD_F(0x04fd08ef) /* 0.311776100 */, 16 }, +/* 1710 */ { MAD_F(0x04fe0805) /* 0.312019366 */, 16 }, +/* 1711 */ { MAD_F(0x04ff0727) /* 0.312262680 */, 16 }, + +/* 1712 */ { MAD_F(0x05000655) /* 0.312506041 */, 16 }, +/* 1713 */ { MAD_F(0x05010591) /* 0.312749449 */, 16 }, +/* 1714 */ { MAD_F(0x050204d9) /* 0.312992905 */, 16 }, +/* 1715 */ { MAD_F(0x0503042e) /* 0.313236408 */, 16 }, +/* 1716 */ { MAD_F(0x0504038f) /* 0.313479959 */, 16 }, +/* 1717 */ { MAD_F(0x050502fe) /* 0.313723556 */, 16 }, +/* 1718 */ { MAD_F(0x05060279) /* 0.313967202 */, 16 }, +/* 1719 */ { MAD_F(0x05070200) /* 0.314210894 */, 16 }, +/* 1720 */ { MAD_F(0x05080195) /* 0.314454634 */, 16 }, +/* 1721 */ { MAD_F(0x05090136) /* 0.314698420 */, 16 }, +/* 1722 */ { MAD_F(0x050a00e3) /* 0.314942255 */, 16 }, +/* 1723 */ { MAD_F(0x050b009e) /* 0.315186136 */, 16 }, +/* 1724 */ { MAD_F(0x050c0065) /* 0.315430064 */, 16 }, +/* 1725 */ { MAD_F(0x050d0039) /* 0.315674040 */, 16 }, +/* 1726 */ { MAD_F(0x050e0019) /* 0.315918063 */, 16 }, +/* 1727 */ { MAD_F(0x050f0006) /* 0.316162133 */, 16 }, + +/* 1728 */ { MAD_F(0x05100000) /* 0.316406250 */, 16 }, +/* 1729 */ { MAD_F(0x05110006) /* 0.316650414 */, 16 }, +/* 1730 */ { MAD_F(0x05120019) /* 0.316894625 */, 16 }, +/* 1731 */ { MAD_F(0x05130039) /* 0.317138884 */, 16 }, +/* 1732 */ { MAD_F(0x05140065) /* 0.317383189 */, 16 }, +/* 1733 */ { MAD_F(0x0515009e) /* 0.317627541 */, 16 }, +/* 1734 */ { MAD_F(0x051600e3) /* 0.317871941 */, 16 }, +/* 1735 */ { MAD_F(0x05170135) /* 0.318116387 */, 16 }, +/* 1736 */ { MAD_F(0x05180194) /* 0.318360880 */, 16 }, +/* 1737 */ { MAD_F(0x051901ff) /* 0.318605421 */, 16 }, +/* 1738 */ { MAD_F(0x051a0277) /* 0.318850008 */, 16 }, +/* 1739 */ { MAD_F(0x051b02fc) /* 0.319094642 */, 16 }, +/* 1740 */ { MAD_F(0x051c038d) /* 0.319339323 */, 16 }, +/* 1741 */ { MAD_F(0x051d042a) /* 0.319584051 */, 16 }, +/* 1742 */ { MAD_F(0x051e04d4) /* 0.319828826 */, 16 }, +/* 1743 */ { MAD_F(0x051f058b) /* 0.320073647 */, 16 }, + +/* 1744 */ { MAD_F(0x0520064f) /* 0.320318516 */, 16 }, +/* 1745 */ { MAD_F(0x0521071f) /* 0.320563431 */, 16 }, +/* 1746 */ { MAD_F(0x052207fb) /* 0.320808393 */, 16 }, +/* 1747 */ { MAD_F(0x052308e4) /* 0.321053402 */, 16 }, +/* 1748 */ { MAD_F(0x052409da) /* 0.321298457 */, 16 }, +/* 1749 */ { MAD_F(0x05250adc) /* 0.321543560 */, 16 }, +/* 1750 */ { MAD_F(0x05260bea) /* 0.321788709 */, 16 }, +/* 1751 */ { MAD_F(0x05270d06) /* 0.322033904 */, 16 }, +/* 1752 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 16 }, +/* 1753 */ { MAD_F(0x05290f62) /* 0.322524436 */, 16 }, +/* 1754 */ { MAD_F(0x052a10a3) /* 0.322769771 */, 16 }, +/* 1755 */ { MAD_F(0x052b11f0) /* 0.323015154 */, 16 }, +/* 1756 */ { MAD_F(0x052c134a) /* 0.323260583 */, 16 }, +/* 1757 */ { MAD_F(0x052d14b0) /* 0.323506058 */, 16 }, +/* 1758 */ { MAD_F(0x052e1623) /* 0.323751580 */, 16 }, +/* 1759 */ { MAD_F(0x052f17a2) /* 0.323997149 */, 16 }, + +/* 1760 */ { MAD_F(0x0530192e) /* 0.324242764 */, 16 }, +/* 1761 */ { MAD_F(0x05311ac6) /* 0.324488426 */, 16 }, +/* 1762 */ { MAD_F(0x05321c6b) /* 0.324734134 */, 16 }, +/* 1763 */ { MAD_F(0x05331e1c) /* 0.324979889 */, 16 }, +/* 1764 */ { MAD_F(0x05341fda) /* 0.325225690 */, 16 }, +/* 1765 */ { MAD_F(0x053521a4) /* 0.325471538 */, 16 }, +/* 1766 */ { MAD_F(0x0536237b) /* 0.325717432 */, 16 }, +/* 1767 */ { MAD_F(0x0537255e) /* 0.325963372 */, 16 }, +/* 1768 */ { MAD_F(0x0538274e) /* 0.326209359 */, 16 }, +/* 1769 */ { MAD_F(0x0539294a) /* 0.326455392 */, 16 }, +/* 1770 */ { MAD_F(0x053a2b52) /* 0.326701472 */, 16 }, +/* 1771 */ { MAD_F(0x053b2d67) /* 0.326947598 */, 16 }, +/* 1772 */ { MAD_F(0x053c2f89) /* 0.327193770 */, 16 }, +/* 1773 */ { MAD_F(0x053d31b6) /* 0.327439989 */, 16 }, +/* 1774 */ { MAD_F(0x053e33f1) /* 0.327686254 */, 16 }, +/* 1775 */ { MAD_F(0x053f3637) /* 0.327932565 */, 16 }, + +/* 1776 */ { MAD_F(0x0540388a) /* 0.328178922 */, 16 }, +/* 1777 */ { MAD_F(0x05413aea) /* 0.328425326 */, 16 }, +/* 1778 */ { MAD_F(0x05423d56) /* 0.328671776 */, 16 }, +/* 1779 */ { MAD_F(0x05433fce) /* 0.328918272 */, 16 }, +/* 1780 */ { MAD_F(0x05444253) /* 0.329164814 */, 16 }, +/* 1781 */ { MAD_F(0x054544e4) /* 0.329411403 */, 16 }, +/* 1782 */ { MAD_F(0x05464781) /* 0.329658038 */, 16 }, +/* 1783 */ { MAD_F(0x05474a2b) /* 0.329904718 */, 16 }, +/* 1784 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 16 }, +/* 1785 */ { MAD_F(0x05494fa4) /* 0.330398218 */, 16 }, +/* 1786 */ { MAD_F(0x054a5273) /* 0.330645037 */, 16 }, +/* 1787 */ { MAD_F(0x054b554e) /* 0.330891903 */, 16 }, +/* 1788 */ { MAD_F(0x054c5836) /* 0.331138814 */, 16 }, +/* 1789 */ { MAD_F(0x054d5b2a) /* 0.331385771 */, 16 }, +/* 1790 */ { MAD_F(0x054e5e2b) /* 0.331632774 */, 16 }, +/* 1791 */ { MAD_F(0x054f6138) /* 0.331879824 */, 16 }, + +/* 1792 */ { MAD_F(0x05506451) /* 0.332126919 */, 16 }, +/* 1793 */ { MAD_F(0x05516776) /* 0.332374060 */, 16 }, +/* 1794 */ { MAD_F(0x05526aa8) /* 0.332621247 */, 16 }, +/* 1795 */ { MAD_F(0x05536de6) /* 0.332868480 */, 16 }, +/* 1796 */ { MAD_F(0x05547131) /* 0.333115759 */, 16 }, +/* 1797 */ { MAD_F(0x05557487) /* 0.333363084 */, 16 }, +/* 1798 */ { MAD_F(0x055677ea) /* 0.333610455 */, 16 }, +/* 1799 */ { MAD_F(0x05577b5a) /* 0.333857872 */, 16 }, +/* 1800 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 16 }, +/* 1801 */ { MAD_F(0x0559825e) /* 0.334352843 */, 16 }, +/* 1802 */ { MAD_F(0x055a85f2) /* 0.334600397 */, 16 }, +/* 1803 */ { MAD_F(0x055b8992) /* 0.334847997 */, 16 }, +/* 1804 */ { MAD_F(0x055c8d3f) /* 0.335095642 */, 16 }, +/* 1805 */ { MAD_F(0x055d90f9) /* 0.335343334 */, 16 }, +/* 1806 */ { MAD_F(0x055e94be) /* 0.335591071 */, 16 }, +/* 1807 */ { MAD_F(0x055f9890) /* 0.335838854 */, 16 }, + +/* 1808 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 16 }, +/* 1809 */ { MAD_F(0x0561a058) /* 0.336334557 */, 16 }, +/* 1810 */ { MAD_F(0x0562a44f) /* 0.336582477 */, 16 }, +/* 1811 */ { MAD_F(0x0563a851) /* 0.336830443 */, 16 }, +/* 1812 */ { MAD_F(0x0564ac60) /* 0.337078454 */, 16 }, +/* 1813 */ { MAD_F(0x0565b07c) /* 0.337326511 */, 16 }, +/* 1814 */ { MAD_F(0x0566b4a3) /* 0.337574614 */, 16 }, +/* 1815 */ { MAD_F(0x0567b8d7) /* 0.337822762 */, 16 }, +/* 1816 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 16 }, +/* 1817 */ { MAD_F(0x0569c163) /* 0.338319195 */, 16 }, +/* 1818 */ { MAD_F(0x056ac5bc) /* 0.338567480 */, 16 }, +/* 1819 */ { MAD_F(0x056bca20) /* 0.338815811 */, 16 }, +/* 1820 */ { MAD_F(0x056cce91) /* 0.339064186 */, 16 }, +/* 1821 */ { MAD_F(0x056dd30e) /* 0.339312608 */, 16 }, +/* 1822 */ { MAD_F(0x056ed798) /* 0.339561075 */, 16 }, +/* 1823 */ { MAD_F(0x056fdc2d) /* 0.339809587 */, 16 }, + +/* 1824 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 16 }, +/* 1825 */ { MAD_F(0x0571e57d) /* 0.340306748 */, 16 }, +/* 1826 */ { MAD_F(0x0572ea37) /* 0.340555397 */, 16 }, +/* 1827 */ { MAD_F(0x0573eefd) /* 0.340804091 */, 16 }, +/* 1828 */ { MAD_F(0x0574f3d0) /* 0.341052830 */, 16 }, +/* 1829 */ { MAD_F(0x0575f8ae) /* 0.341301615 */, 16 }, +/* 1830 */ { MAD_F(0x0576fd99) /* 0.341550445 */, 16 }, +/* 1831 */ { MAD_F(0x05780290) /* 0.341799321 */, 16 }, +/* 1832 */ { MAD_F(0x05790793) /* 0.342048241 */, 16 }, +/* 1833 */ { MAD_F(0x057a0ca3) /* 0.342297207 */, 16 }, +/* 1834 */ { MAD_F(0x057b11be) /* 0.342546219 */, 16 }, +/* 1835 */ { MAD_F(0x057c16e6) /* 0.342795275 */, 16 }, +/* 1836 */ { MAD_F(0x057d1c1a) /* 0.343044377 */, 16 }, +/* 1837 */ { MAD_F(0x057e2159) /* 0.343293524 */, 16 }, +/* 1838 */ { MAD_F(0x057f26a6) /* 0.343542717 */, 16 }, +/* 1839 */ { MAD_F(0x05802bfe) /* 0.343791954 */, 16 }, + +/* 1840 */ { MAD_F(0x05813162) /* 0.344041237 */, 16 }, +/* 1841 */ { MAD_F(0x058236d2) /* 0.344290564 */, 16 }, +/* 1842 */ { MAD_F(0x05833c4f) /* 0.344539937 */, 16 }, +/* 1843 */ { MAD_F(0x058441d8) /* 0.344789356 */, 16 }, +/* 1844 */ { MAD_F(0x0585476c) /* 0.345038819 */, 16 }, +/* 1845 */ { MAD_F(0x05864d0d) /* 0.345288327 */, 16 }, +/* 1846 */ { MAD_F(0x058752ba) /* 0.345537880 */, 16 }, +/* 1847 */ { MAD_F(0x05885873) /* 0.345787479 */, 16 }, +/* 1848 */ { MAD_F(0x05895e39) /* 0.346037122 */, 16 }, +/* 1849 */ { MAD_F(0x058a640a) /* 0.346286811 */, 16 }, +/* 1850 */ { MAD_F(0x058b69e7) /* 0.346536545 */, 16 }, +/* 1851 */ { MAD_F(0x058c6fd1) /* 0.346786323 */, 16 }, +/* 1852 */ { MAD_F(0x058d75c6) /* 0.347036147 */, 16 }, +/* 1853 */ { MAD_F(0x058e7bc8) /* 0.347286015 */, 16 }, +/* 1854 */ { MAD_F(0x058f81d5) /* 0.347535929 */, 16 }, +/* 1855 */ { MAD_F(0x059087ef) /* 0.347785887 */, 16 }, + +/* 1856 */ { MAD_F(0x05918e15) /* 0.348035890 */, 16 }, +/* 1857 */ { MAD_F(0x05929447) /* 0.348285939 */, 16 }, +/* 1858 */ { MAD_F(0x05939a84) /* 0.348536032 */, 16 }, +/* 1859 */ { MAD_F(0x0594a0ce) /* 0.348786170 */, 16 }, +/* 1860 */ { MAD_F(0x0595a724) /* 0.349036353 */, 16 }, +/* 1861 */ { MAD_F(0x0596ad86) /* 0.349286580 */, 16 }, +/* 1862 */ { MAD_F(0x0597b3f4) /* 0.349536853 */, 16 }, +/* 1863 */ { MAD_F(0x0598ba6e) /* 0.349787170 */, 16 }, +/* 1864 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 16 }, +/* 1865 */ { MAD_F(0x059ac786) /* 0.350287939 */, 16 }, +/* 1866 */ { MAD_F(0x059bce25) /* 0.350538391 */, 16 }, +/* 1867 */ { MAD_F(0x059cd4cf) /* 0.350788887 */, 16 }, +/* 1868 */ { MAD_F(0x059ddb85) /* 0.351039428 */, 16 }, +/* 1869 */ { MAD_F(0x059ee247) /* 0.351290014 */, 16 }, +/* 1870 */ { MAD_F(0x059fe915) /* 0.351540645 */, 16 }, +/* 1871 */ { MAD_F(0x05a0efef) /* 0.351791320 */, 16 }, + +/* 1872 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 16 }, +/* 1873 */ { MAD_F(0x05a2fdc7) /* 0.352292804 */, 16 }, +/* 1874 */ { MAD_F(0x05a404c5) /* 0.352543613 */, 16 }, +/* 1875 */ { MAD_F(0x05a50bcf) /* 0.352794467 */, 16 }, +/* 1876 */ { MAD_F(0x05a612e5) /* 0.353045365 */, 16 }, +/* 1877 */ { MAD_F(0x05a71a07) /* 0.353296308 */, 16 }, +/* 1878 */ { MAD_F(0x05a82135) /* 0.353547296 */, 16 }, +/* 1879 */ { MAD_F(0x05a9286f) /* 0.353798328 */, 16 }, +/* 1880 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 16 }, +/* 1881 */ { MAD_F(0x05ab3707) /* 0.354300526 */, 16 }, +/* 1882 */ { MAD_F(0x05ac3e65) /* 0.354551691 */, 16 }, +/* 1883 */ { MAD_F(0x05ad45ce) /* 0.354802901 */, 16 }, +/* 1884 */ { MAD_F(0x05ae4d44) /* 0.355054156 */, 16 }, +/* 1885 */ { MAD_F(0x05af54c6) /* 0.355305455 */, 16 }, +/* 1886 */ { MAD_F(0x05b05c53) /* 0.355556799 */, 16 }, +/* 1887 */ { MAD_F(0x05b163ed) /* 0.355808187 */, 16 }, + +/* 1888 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 16 }, +/* 1889 */ { MAD_F(0x05b37343) /* 0.356311096 */, 16 }, +/* 1890 */ { MAD_F(0x05b47b00) /* 0.356562617 */, 16 }, +/* 1891 */ { MAD_F(0x05b582c9) /* 0.356814182 */, 16 }, +/* 1892 */ { MAD_F(0x05b68a9e) /* 0.357065792 */, 16 }, +/* 1893 */ { MAD_F(0x05b7927f) /* 0.357317446 */, 16 }, +/* 1894 */ { MAD_F(0x05b89a6c) /* 0.357569145 */, 16 }, +/* 1895 */ { MAD_F(0x05b9a265) /* 0.357820887 */, 16 }, +/* 1896 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 16 }, +/* 1897 */ { MAD_F(0x05bbb27a) /* 0.358324506 */, 16 }, +/* 1898 */ { MAD_F(0x05bcba96) /* 0.358576381 */, 16 }, +/* 1899 */ { MAD_F(0x05bdc2be) /* 0.358828301 */, 16 }, +/* 1900 */ { MAD_F(0x05becaf2) /* 0.359080265 */, 16 }, +/* 1901 */ { MAD_F(0x05bfd332) /* 0.359332273 */, 16 }, +/* 1902 */ { MAD_F(0x05c0db7e) /* 0.359584326 */, 16 }, +/* 1903 */ { MAD_F(0x05c1e3d6) /* 0.359836423 */, 16 }, + +/* 1904 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 16 }, +/* 1905 */ { MAD_F(0x05c3f4a9) /* 0.360340748 */, 16 }, +/* 1906 */ { MAD_F(0x05c4fd24) /* 0.360592977 */, 16 }, +/* 1907 */ { MAD_F(0x05c605ab) /* 0.360845251 */, 16 }, +/* 1908 */ { MAD_F(0x05c70e3e) /* 0.361097568 */, 16 }, +/* 1909 */ { MAD_F(0x05c816dd) /* 0.361349929 */, 16 }, +/* 1910 */ { MAD_F(0x05c91f87) /* 0.361602335 */, 16 }, +/* 1911 */ { MAD_F(0x05ca283e) /* 0.361854784 */, 16 }, +/* 1912 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 16 }, +/* 1913 */ { MAD_F(0x05cc39ce) /* 0.362359815 */, 16 }, +/* 1914 */ { MAD_F(0x05cd42a8) /* 0.362612397 */, 16 }, +/* 1915 */ { MAD_F(0x05ce4b8d) /* 0.362865022 */, 16 }, +/* 1916 */ { MAD_F(0x05cf547f) /* 0.363117692 */, 16 }, +/* 1917 */ { MAD_F(0x05d05d7c) /* 0.363370405 */, 16 }, +/* 1918 */ { MAD_F(0x05d16685) /* 0.363623163 */, 16 }, +/* 1919 */ { MAD_F(0x05d26f9a) /* 0.363875964 */, 16 }, + +/* 1920 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 16 }, +/* 1921 */ { MAD_F(0x05d481e7) /* 0.364381698 */, 16 }, +/* 1922 */ { MAD_F(0x05d58b1f) /* 0.364634632 */, 16 }, +/* 1923 */ { MAD_F(0x05d69463) /* 0.364887608 */, 16 }, +/* 1924 */ { MAD_F(0x05d79db3) /* 0.365140629 */, 16 }, +/* 1925 */ { MAD_F(0x05d8a70f) /* 0.365393694 */, 16 }, +/* 1926 */ { MAD_F(0x05d9b076) /* 0.365646802 */, 16 }, +/* 1927 */ { MAD_F(0x05dab9e9) /* 0.365899955 */, 16 }, +/* 1928 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 16 }, +/* 1929 */ { MAD_F(0x05dcccf2) /* 0.366406390 */, 16 }, +/* 1930 */ { MAD_F(0x05ddd689) /* 0.366659674 */, 16 }, +/* 1931 */ { MAD_F(0x05dee02b) /* 0.366913001 */, 16 }, +/* 1932 */ { MAD_F(0x05dfe9d8) /* 0.367166372 */, 16 }, +/* 1933 */ { MAD_F(0x05e0f392) /* 0.367419787 */, 16 }, +/* 1934 */ { MAD_F(0x05e1fd57) /* 0.367673246 */, 16 }, +/* 1935 */ { MAD_F(0x05e30728) /* 0.367926748 */, 16 }, + +/* 1936 */ { MAD_F(0x05e41105) /* 0.368180294 */, 16 }, +/* 1937 */ { MAD_F(0x05e51aed) /* 0.368433883 */, 16 }, +/* 1938 */ { MAD_F(0x05e624e1) /* 0.368687517 */, 16 }, +/* 1939 */ { MAD_F(0x05e72ee1) /* 0.368941193 */, 16 }, +/* 1940 */ { MAD_F(0x05e838ed) /* 0.369194914 */, 16 }, +/* 1941 */ { MAD_F(0x05e94304) /* 0.369448678 */, 16 }, +/* 1942 */ { MAD_F(0x05ea4d27) /* 0.369702485 */, 16 }, +/* 1943 */ { MAD_F(0x05eb5756) /* 0.369956336 */, 16 }, +/* 1944 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 16 }, +/* 1945 */ { MAD_F(0x05ed6bd6) /* 0.370464169 */, 16 }, +/* 1946 */ { MAD_F(0x05ee7628) /* 0.370718151 */, 16 }, +/* 1947 */ { MAD_F(0x05ef8085) /* 0.370972177 */, 16 }, +/* 1948 */ { MAD_F(0x05f08aee) /* 0.371226245 */, 16 }, +/* 1949 */ { MAD_F(0x05f19563) /* 0.371480358 */, 16 }, +/* 1950 */ { MAD_F(0x05f29fe3) /* 0.371734513 */, 16 }, +/* 1951 */ { MAD_F(0x05f3aa6f) /* 0.371988712 */, 16 }, + +/* 1952 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 16 }, +/* 1953 */ { MAD_F(0x05f5bfab) /* 0.372497241 */, 16 }, +/* 1954 */ { MAD_F(0x05f6ca5a) /* 0.372751570 */, 16 }, +/* 1955 */ { MAD_F(0x05f7d514) /* 0.373005943 */, 16 }, +/* 1956 */ { MAD_F(0x05f8dfdb) /* 0.373260359 */, 16 }, +/* 1957 */ { MAD_F(0x05f9eaad) /* 0.373514819 */, 16 }, +/* 1958 */ { MAD_F(0x05faf58a) /* 0.373769322 */, 16 }, +/* 1959 */ { MAD_F(0x05fc0073) /* 0.374023868 */, 16 }, +/* 1960 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 16 }, +/* 1961 */ { MAD_F(0x05fe1669) /* 0.374533091 */, 16 }, +/* 1962 */ { MAD_F(0x05ff2175) /* 0.374787767 */, 16 }, +/* 1963 */ { MAD_F(0x06002c8d) /* 0.375042486 */, 16 }, +/* 1964 */ { MAD_F(0x060137b0) /* 0.375297249 */, 16 }, +/* 1965 */ { MAD_F(0x060242df) /* 0.375552055 */, 16 }, +/* 1966 */ { MAD_F(0x06034e19) /* 0.375806904 */, 16 }, +/* 1967 */ { MAD_F(0x0604595f) /* 0.376061796 */, 16 }, + +/* 1968 */ { MAD_F(0x060564b1) /* 0.376316732 */, 16 }, +/* 1969 */ { MAD_F(0x0606700f) /* 0.376571710 */, 16 }, +/* 1970 */ { MAD_F(0x06077b77) /* 0.376826732 */, 16 }, +/* 1971 */ { MAD_F(0x060886ec) /* 0.377081797 */, 16 }, +/* 1972 */ { MAD_F(0x0609926c) /* 0.377336905 */, 16 }, +/* 1973 */ { MAD_F(0x060a9df8) /* 0.377592057 */, 16 }, +/* 1974 */ { MAD_F(0x060ba98f) /* 0.377847251 */, 16 }, +/* 1975 */ { MAD_F(0x060cb532) /* 0.378102489 */, 16 }, +/* 1976 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 16 }, +/* 1977 */ { MAD_F(0x060ecc9a) /* 0.378613093 */, 16 }, +/* 1978 */ { MAD_F(0x060fd860) /* 0.378868460 */, 16 }, +/* 1979 */ { MAD_F(0x0610e431) /* 0.379123870 */, 16 }, +/* 1980 */ { MAD_F(0x0611f00d) /* 0.379379322 */, 16 }, +/* 1981 */ { MAD_F(0x0612fbf5) /* 0.379634818 */, 16 }, +/* 1982 */ { MAD_F(0x061407e9) /* 0.379890357 */, 16 }, +/* 1983 */ { MAD_F(0x061513e8) /* 0.380145939 */, 16 }, + +/* 1984 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 16 }, +/* 1985 */ { MAD_F(0x06172c09) /* 0.380657231 */, 16 }, +/* 1986 */ { MAD_F(0x0618382b) /* 0.380912942 */, 16 }, +/* 1987 */ { MAD_F(0x06194458) /* 0.381168695 */, 16 }, +/* 1988 */ { MAD_F(0x061a5091) /* 0.381424492 */, 16 }, +/* 1989 */ { MAD_F(0x061b5cd5) /* 0.381680331 */, 16 }, +/* 1990 */ { MAD_F(0x061c6925) /* 0.381936213 */, 16 }, +/* 1991 */ { MAD_F(0x061d7581) /* 0.382192138 */, 16 }, +/* 1992 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 16 }, +/* 1993 */ { MAD_F(0x061f8e5a) /* 0.382704117 */, 16 }, +/* 1994 */ { MAD_F(0x06209ad8) /* 0.382960171 */, 16 }, +/* 1995 */ { MAD_F(0x0621a761) /* 0.383216267 */, 16 }, +/* 1996 */ { MAD_F(0x0622b3f6) /* 0.383472406 */, 16 }, +/* 1997 */ { MAD_F(0x0623c096) /* 0.383728588 */, 16 }, +/* 1998 */ { MAD_F(0x0624cd42) /* 0.383984813 */, 16 }, +/* 1999 */ { MAD_F(0x0625d9f9) /* 0.384241080 */, 16 }, + +/* 2000 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 16 }, +/* 2001 */ { MAD_F(0x0627f38a) /* 0.384753744 */, 16 }, +/* 2002 */ { MAD_F(0x06290064) /* 0.385010139 */, 16 }, +/* 2003 */ { MAD_F(0x062a0d49) /* 0.385266578 */, 16 }, +/* 2004 */ { MAD_F(0x062b1a3a) /* 0.385523059 */, 16 }, +/* 2005 */ { MAD_F(0x062c2736) /* 0.385779582 */, 16 }, +/* 2006 */ { MAD_F(0x062d343d) /* 0.386036149 */, 16 }, +/* 2007 */ { MAD_F(0x062e4150) /* 0.386292758 */, 16 }, +/* 2008 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 16 }, +/* 2009 */ { MAD_F(0x06305b99) /* 0.386806104 */, 16 }, +/* 2010 */ { MAD_F(0x063168ce) /* 0.387062840 */, 16 }, +/* 2011 */ { MAD_F(0x0632760f) /* 0.387319620 */, 16 }, +/* 2012 */ { MAD_F(0x0633835b) /* 0.387576442 */, 16 }, +/* 2013 */ { MAD_F(0x063490b2) /* 0.387833306 */, 16 }, +/* 2014 */ { MAD_F(0x06359e15) /* 0.388090213 */, 16 }, +/* 2015 */ { MAD_F(0x0636ab83) /* 0.388347163 */, 16 }, + +/* 2016 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 16 }, +/* 2017 */ { MAD_F(0x0638c682) /* 0.388861190 */, 16 }, +/* 2018 */ { MAD_F(0x0639d413) /* 0.389118267 */, 16 }, +/* 2019 */ { MAD_F(0x063ae1af) /* 0.389375386 */, 16 }, +/* 2020 */ { MAD_F(0x063bef56) /* 0.389632548 */, 16 }, +/* 2021 */ { MAD_F(0x063cfd09) /* 0.389889752 */, 16 }, +/* 2022 */ { MAD_F(0x063e0ac7) /* 0.390146999 */, 16 }, +/* 2023 */ { MAD_F(0x063f1891) /* 0.390404289 */, 16 }, +/* 2024 */ { MAD_F(0x06402666) /* 0.390661620 */, 16 }, +/* 2025 */ { MAD_F(0x06413446) /* 0.390918994 */, 16 }, +/* 2026 */ { MAD_F(0x06424232) /* 0.391176411 */, 16 }, +/* 2027 */ { MAD_F(0x06435029) /* 0.391433869 */, 16 }, +/* 2028 */ { MAD_F(0x06445e2b) /* 0.391691371 */, 16 }, +/* 2029 */ { MAD_F(0x06456c39) /* 0.391948914 */, 16 }, +/* 2030 */ { MAD_F(0x06467a52) /* 0.392206500 */, 16 }, +/* 2031 */ { MAD_F(0x06478877) /* 0.392464128 */, 16 }, + +/* 2032 */ { MAD_F(0x064896a7) /* 0.392721798 */, 16 }, +/* 2033 */ { MAD_F(0x0649a4e2) /* 0.392979511 */, 16 }, +/* 2034 */ { MAD_F(0x064ab328) /* 0.393237266 */, 16 }, +/* 2035 */ { MAD_F(0x064bc17a) /* 0.393495063 */, 16 }, +/* 2036 */ { MAD_F(0x064ccfd8) /* 0.393752902 */, 16 }, +/* 2037 */ { MAD_F(0x064dde40) /* 0.394010784 */, 16 }, +/* 2038 */ { MAD_F(0x064eecb4) /* 0.394268707 */, 16 }, +/* 2039 */ { MAD_F(0x064ffb33) /* 0.394526673 */, 16 }, +/* 2040 */ { MAD_F(0x065109be) /* 0.394784681 */, 16 }, +/* 2041 */ { MAD_F(0x06521854) /* 0.395042732 */, 16 }, +/* 2042 */ { MAD_F(0x065326f5) /* 0.395300824 */, 16 }, +/* 2043 */ { MAD_F(0x065435a1) /* 0.395558959 */, 16 }, +/* 2044 */ { MAD_F(0x06554459) /* 0.395817135 */, 16 }, +/* 2045 */ { MAD_F(0x0656531c) /* 0.396075354 */, 16 }, +/* 2046 */ { MAD_F(0x065761ea) /* 0.396333615 */, 16 }, +/* 2047 */ { MAD_F(0x065870c4) /* 0.396591918 */, 16 }, + +/* 2048 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 16 }, +/* 2049 */ { MAD_F(0x065a8e99) /* 0.397108650 */, 16 }, +/* 2050 */ { MAD_F(0x065b9d95) /* 0.397367079 */, 16 }, +/* 2051 */ { MAD_F(0x065cac9c) /* 0.397625550 */, 16 }, +/* 2052 */ { MAD_F(0x065dbbae) /* 0.397884063 */, 16 }, +/* 2053 */ { MAD_F(0x065ecacb) /* 0.398142619 */, 16 }, +/* 2054 */ { MAD_F(0x065fd9f4) /* 0.398401216 */, 16 }, +/* 2055 */ { MAD_F(0x0660e928) /* 0.398659855 */, 16 }, +/* 2056 */ { MAD_F(0x0661f867) /* 0.398918536 */, 16 }, +/* 2057 */ { MAD_F(0x066307b1) /* 0.399177259 */, 16 }, +/* 2058 */ { MAD_F(0x06641707) /* 0.399436024 */, 16 }, +/* 2059 */ { MAD_F(0x06652668) /* 0.399694831 */, 16 }, +/* 2060 */ { MAD_F(0x066635d4) /* 0.399953679 */, 16 }, +/* 2061 */ { MAD_F(0x0667454c) /* 0.400212570 */, 16 }, +/* 2062 */ { MAD_F(0x066854ce) /* 0.400471503 */, 16 }, +/* 2063 */ { MAD_F(0x0669645c) /* 0.400730477 */, 16 }, + +/* 2064 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 16 }, +/* 2065 */ { MAD_F(0x066b839a) /* 0.401248551 */, 16 }, +/* 2066 */ { MAD_F(0x066c9349) /* 0.401507651 */, 16 }, +/* 2067 */ { MAD_F(0x066da304) /* 0.401766793 */, 16 }, +/* 2068 */ { MAD_F(0x066eb2ca) /* 0.402025976 */, 16 }, +/* 2069 */ { MAD_F(0x066fc29b) /* 0.402285202 */, 16 }, +/* 2070 */ { MAD_F(0x0670d278) /* 0.402544469 */, 16 }, +/* 2071 */ { MAD_F(0x0671e25f) /* 0.402803777 */, 16 }, +/* 2072 */ { MAD_F(0x0672f252) /* 0.403063128 */, 16 }, +/* 2073 */ { MAD_F(0x06740250) /* 0.403322520 */, 16 }, +/* 2074 */ { MAD_F(0x0675125a) /* 0.403581954 */, 16 }, +/* 2075 */ { MAD_F(0x0676226e) /* 0.403841430 */, 16 }, +/* 2076 */ { MAD_F(0x0677328e) /* 0.404100947 */, 16 }, +/* 2077 */ { MAD_F(0x067842b9) /* 0.404360506 */, 16 }, +/* 2078 */ { MAD_F(0x067952ef) /* 0.404620107 */, 16 }, +/* 2079 */ { MAD_F(0x067a6330) /* 0.404879749 */, 16 }, + +/* 2080 */ { MAD_F(0x067b737c) /* 0.405139433 */, 16 }, +/* 2081 */ { MAD_F(0x067c83d4) /* 0.405399159 */, 16 }, +/* 2082 */ { MAD_F(0x067d9436) /* 0.405658926 */, 16 }, +/* 2083 */ { MAD_F(0x067ea4a4) /* 0.405918735 */, 16 }, +/* 2084 */ { MAD_F(0x067fb51d) /* 0.406178585 */, 16 }, +/* 2085 */ { MAD_F(0x0680c5a2) /* 0.406438477 */, 16 }, +/* 2086 */ { MAD_F(0x0681d631) /* 0.406698410 */, 16 }, +/* 2087 */ { MAD_F(0x0682e6cb) /* 0.406958385 */, 16 }, +/* 2088 */ { MAD_F(0x0683f771) /* 0.407218402 */, 16 }, +/* 2089 */ { MAD_F(0x06850822) /* 0.407478460 */, 16 }, +/* 2090 */ { MAD_F(0x068618de) /* 0.407738559 */, 16 }, +/* 2091 */ { MAD_F(0x068729a5) /* 0.407998700 */, 16 }, +/* 2092 */ { MAD_F(0x06883a77) /* 0.408258883 */, 16 }, +/* 2093 */ { MAD_F(0x06894b55) /* 0.408519107 */, 16 }, +/* 2094 */ { MAD_F(0x068a5c3d) /* 0.408779372 */, 16 }, +/* 2095 */ { MAD_F(0x068b6d31) /* 0.409039679 */, 16 }, + +/* 2096 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 16 }, +/* 2097 */ { MAD_F(0x068d8f39) /* 0.409560417 */, 16 }, +/* 2098 */ { MAD_F(0x068ea04e) /* 0.409820848 */, 16 }, +/* 2099 */ { MAD_F(0x068fb16e) /* 0.410081321 */, 16 }, +/* 2100 */ { MAD_F(0x0690c299) /* 0.410341834 */, 16 }, +/* 2101 */ { MAD_F(0x0691d3cf) /* 0.410602390 */, 16 }, +/* 2102 */ { MAD_F(0x0692e511) /* 0.410862986 */, 16 }, +/* 2103 */ { MAD_F(0x0693f65d) /* 0.411123624 */, 16 }, +/* 2104 */ { MAD_F(0x069507b5) /* 0.411384303 */, 16 }, +/* 2105 */ { MAD_F(0x06961917) /* 0.411645024 */, 16 }, +/* 2106 */ { MAD_F(0x06972a85) /* 0.411905785 */, 16 }, +/* 2107 */ { MAD_F(0x06983bfe) /* 0.412166588 */, 16 }, +/* 2108 */ { MAD_F(0x06994d82) /* 0.412427433 */, 16 }, +/* 2109 */ { MAD_F(0x069a5f11) /* 0.412688318 */, 16 }, +/* 2110 */ { MAD_F(0x069b70ab) /* 0.412949245 */, 16 }, +/* 2111 */ { MAD_F(0x069c8250) /* 0.413210213 */, 16 }, + +/* 2112 */ { MAD_F(0x069d9400) /* 0.413471222 */, 16 }, +/* 2113 */ { MAD_F(0x069ea5bb) /* 0.413732273 */, 16 }, +/* 2114 */ { MAD_F(0x069fb781) /* 0.413993364 */, 16 }, +/* 2115 */ { MAD_F(0x06a0c953) /* 0.414254497 */, 16 }, +/* 2116 */ { MAD_F(0x06a1db2f) /* 0.414515671 */, 16 }, +/* 2117 */ { MAD_F(0x06a2ed16) /* 0.414776886 */, 16 }, +/* 2118 */ { MAD_F(0x06a3ff09) /* 0.415038142 */, 16 }, +/* 2119 */ { MAD_F(0x06a51106) /* 0.415299440 */, 16 }, +/* 2120 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 16 }, +/* 2121 */ { MAD_F(0x06a73522) /* 0.415822157 */, 16 }, +/* 2122 */ { MAD_F(0x06a84741) /* 0.416083578 */, 16 }, +/* 2123 */ { MAD_F(0x06a9596a) /* 0.416345040 */, 16 }, +/* 2124 */ { MAD_F(0x06aa6b9f) /* 0.416606542 */, 16 }, +/* 2125 */ { MAD_F(0x06ab7ddf) /* 0.416868086 */, 16 }, +/* 2126 */ { MAD_F(0x06ac9029) /* 0.417129671 */, 16 }, +/* 2127 */ { MAD_F(0x06ada27f) /* 0.417391297 */, 16 }, + +/* 2128 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 16 }, +/* 2129 */ { MAD_F(0x06afc74b) /* 0.417914672 */, 16 }, +/* 2130 */ { MAD_F(0x06b0d9c2) /* 0.418176420 */, 16 }, +/* 2131 */ { MAD_F(0x06b1ec43) /* 0.418438210 */, 16 }, +/* 2132 */ { MAD_F(0x06b2fed0) /* 0.418700041 */, 16 }, +/* 2133 */ { MAD_F(0x06b41168) /* 0.418961912 */, 16 }, +/* 2134 */ { MAD_F(0x06b5240a) /* 0.419223825 */, 16 }, +/* 2135 */ { MAD_F(0x06b636b8) /* 0.419485778 */, 16 }, +/* 2136 */ { MAD_F(0x06b74971) /* 0.419747773 */, 16 }, +/* 2137 */ { MAD_F(0x06b85c34) /* 0.420009808 */, 16 }, +/* 2138 */ { MAD_F(0x06b96f03) /* 0.420271884 */, 16 }, +/* 2139 */ { MAD_F(0x06ba81dc) /* 0.420534001 */, 16 }, +/* 2140 */ { MAD_F(0x06bb94c1) /* 0.420796159 */, 16 }, +/* 2141 */ { MAD_F(0x06bca7b0) /* 0.421058358 */, 16 }, +/* 2142 */ { MAD_F(0x06bdbaaa) /* 0.421320597 */, 16 }, +/* 2143 */ { MAD_F(0x06becdb0) /* 0.421582878 */, 16 }, + +/* 2144 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 16 }, +/* 2145 */ { MAD_F(0x06c0f3db) /* 0.422107561 */, 16 }, +/* 2146 */ { MAD_F(0x06c20702) /* 0.422369964 */, 16 }, +/* 2147 */ { MAD_F(0x06c31a33) /* 0.422632407 */, 16 }, +/* 2148 */ { MAD_F(0x06c42d6f) /* 0.422894891 */, 16 }, +/* 2149 */ { MAD_F(0x06c540b6) /* 0.423157416 */, 16 }, +/* 2150 */ { MAD_F(0x06c65408) /* 0.423419982 */, 16 }, +/* 2151 */ { MAD_F(0x06c76765) /* 0.423682588 */, 16 }, +/* 2152 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 16 }, +/* 2153 */ { MAD_F(0x06c98e3f) /* 0.424207923 */, 16 }, +/* 2154 */ { MAD_F(0x06caa1bd) /* 0.424470652 */, 16 }, +/* 2155 */ { MAD_F(0x06cbb545) /* 0.424733421 */, 16 }, +/* 2156 */ { MAD_F(0x06ccc8d9) /* 0.424996230 */, 16 }, +/* 2157 */ { MAD_F(0x06cddc77) /* 0.425259081 */, 16 }, +/* 2158 */ { MAD_F(0x06cef020) /* 0.425521972 */, 16 }, +/* 2159 */ { MAD_F(0x06d003d4) /* 0.425784903 */, 16 }, + +/* 2160 */ { MAD_F(0x06d11794) /* 0.426047876 */, 16 }, +/* 2161 */ { MAD_F(0x06d22b5e) /* 0.426310889 */, 16 }, +/* 2162 */ { MAD_F(0x06d33f32) /* 0.426573942 */, 16 }, +/* 2163 */ { MAD_F(0x06d45312) /* 0.426837036 */, 16 }, +/* 2164 */ { MAD_F(0x06d566fd) /* 0.427100170 */, 16 }, +/* 2165 */ { MAD_F(0x06d67af2) /* 0.427363345 */, 16 }, +/* 2166 */ { MAD_F(0x06d78ef3) /* 0.427626561 */, 16 }, +/* 2167 */ { MAD_F(0x06d8a2fe) /* 0.427889817 */, 16 }, +/* 2168 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 16 }, +/* 2169 */ { MAD_F(0x06dacb35) /* 0.428416451 */, 16 }, +/* 2170 */ { MAD_F(0x06dbdf61) /* 0.428679828 */, 16 }, +/* 2171 */ { MAD_F(0x06dcf398) /* 0.428943246 */, 16 }, +/* 2172 */ { MAD_F(0x06de07d9) /* 0.429206704 */, 16 }, +/* 2173 */ { MAD_F(0x06df1c26) /* 0.429470203 */, 16 }, +/* 2174 */ { MAD_F(0x06e0307d) /* 0.429733743 */, 16 }, +/* 2175 */ { MAD_F(0x06e144df) /* 0.429997322 */, 16 }, + +/* 2176 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 16 }, +/* 2177 */ { MAD_F(0x06e36dc4) /* 0.430524603 */, 16 }, +/* 2178 */ { MAD_F(0x06e48246) /* 0.430788304 */, 16 }, +/* 2179 */ { MAD_F(0x06e596d4) /* 0.431052045 */, 16 }, +/* 2180 */ { MAD_F(0x06e6ab6c) /* 0.431315826 */, 16 }, +/* 2181 */ { MAD_F(0x06e7c00f) /* 0.431579648 */, 16 }, +/* 2182 */ { MAD_F(0x06e8d4bd) /* 0.431843511 */, 16 }, +/* 2183 */ { MAD_F(0x06e9e976) /* 0.432107413 */, 16 }, +/* 2184 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 16 }, +/* 2185 */ { MAD_F(0x06ec1308) /* 0.432635339 */, 16 }, +/* 2186 */ { MAD_F(0x06ed27e2) /* 0.432899362 */, 16 }, +/* 2187 */ { MAD_F(0x06ee3cc6) /* 0.433163426 */, 16 }, +/* 2188 */ { MAD_F(0x06ef51b4) /* 0.433427530 */, 16 }, +/* 2189 */ { MAD_F(0x06f066ae) /* 0.433691674 */, 16 }, +/* 2190 */ { MAD_F(0x06f17bb3) /* 0.433955859 */, 16 }, +/* 2191 */ { MAD_F(0x06f290c2) /* 0.434220083 */, 16 }, + +/* 2192 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 16 }, +/* 2193 */ { MAD_F(0x06f4bb01) /* 0.434748653 */, 16 }, +/* 2194 */ { MAD_F(0x06f5d030) /* 0.435012998 */, 16 }, +/* 2195 */ { MAD_F(0x06f6e56b) /* 0.435277383 */, 16 }, +/* 2196 */ { MAD_F(0x06f7fab0) /* 0.435541809 */, 16 }, +/* 2197 */ { MAD_F(0x06f91000) /* 0.435806274 */, 16 }, +/* 2198 */ { MAD_F(0x06fa255a) /* 0.436070780 */, 16 }, +/* 2199 */ { MAD_F(0x06fb3ac0) /* 0.436335326 */, 16 }, +/* 2200 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 16 }, +/* 2201 */ { MAD_F(0x06fd65ab) /* 0.436864538 */, 16 }, +/* 2202 */ { MAD_F(0x06fe7b31) /* 0.437129204 */, 16 }, +/* 2203 */ { MAD_F(0x06ff90c2) /* 0.437393910 */, 16 }, +/* 2204 */ { MAD_F(0x0700a65d) /* 0.437658657 */, 16 }, +/* 2205 */ { MAD_F(0x0701bc03) /* 0.437923443 */, 16 }, +/* 2206 */ { MAD_F(0x0702d1b4) /* 0.438188269 */, 16 }, +/* 2207 */ { MAD_F(0x0703e76f) /* 0.438453136 */, 16 }, + +/* 2208 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 16 }, +/* 2209 */ { MAD_F(0x07061306) /* 0.438982988 */, 16 }, +/* 2210 */ { MAD_F(0x070728e2) /* 0.439247975 */, 16 }, +/* 2211 */ { MAD_F(0x07083ec9) /* 0.439513001 */, 16 }, +/* 2212 */ { MAD_F(0x070954ba) /* 0.439778067 */, 16 }, +/* 2213 */ { MAD_F(0x070a6ab6) /* 0.440043173 */, 16 }, +/* 2214 */ { MAD_F(0x070b80bc) /* 0.440308320 */, 16 }, +/* 2215 */ { MAD_F(0x070c96ce) /* 0.440573506 */, 16 }, +/* 2216 */ { MAD_F(0x070dacea) /* 0.440838732 */, 16 }, +/* 2217 */ { MAD_F(0x070ec310) /* 0.441103997 */, 16 }, +/* 2218 */ { MAD_F(0x070fd942) /* 0.441369303 */, 16 }, +/* 2219 */ { MAD_F(0x0710ef7e) /* 0.441634649 */, 16 }, +/* 2220 */ { MAD_F(0x071205c5) /* 0.441900034 */, 16 }, +/* 2221 */ { MAD_F(0x07131c17) /* 0.442165460 */, 16 }, +/* 2222 */ { MAD_F(0x07143273) /* 0.442430925 */, 16 }, +/* 2223 */ { MAD_F(0x071548da) /* 0.442696430 */, 16 }, + +/* 2224 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 16 }, +/* 2225 */ { MAD_F(0x071775c8) /* 0.443227559 */, 16 }, +/* 2226 */ { MAD_F(0x07188c4f) /* 0.443493184 */, 16 }, +/* 2227 */ { MAD_F(0x0719a2e0) /* 0.443758848 */, 16 }, +/* 2228 */ { MAD_F(0x071ab97d) /* 0.444024552 */, 16 }, +/* 2229 */ { MAD_F(0x071bd024) /* 0.444290296 */, 16 }, +/* 2230 */ { MAD_F(0x071ce6d6) /* 0.444556079 */, 16 }, +/* 2231 */ { MAD_F(0x071dfd92) /* 0.444821902 */, 16 }, +/* 2232 */ { MAD_F(0x071f1459) /* 0.445087765 */, 16 }, +/* 2233 */ { MAD_F(0x07202b2b) /* 0.445353668 */, 16 }, +/* 2234 */ { MAD_F(0x07214207) /* 0.445619610 */, 16 }, +/* 2235 */ { MAD_F(0x072258ee) /* 0.445885592 */, 16 }, +/* 2236 */ { MAD_F(0x07236fe0) /* 0.446151614 */, 16 }, +/* 2237 */ { MAD_F(0x072486dc) /* 0.446417675 */, 16 }, +/* 2238 */ { MAD_F(0x07259de3) /* 0.446683776 */, 16 }, +/* 2239 */ { MAD_F(0x0726b4f4) /* 0.446949917 */, 16 }, + +/* 2240 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 16 }, +/* 2241 */ { MAD_F(0x0728e338) /* 0.447482317 */, 16 }, +/* 2242 */ { MAD_F(0x0729fa69) /* 0.447748576 */, 16 }, +/* 2243 */ { MAD_F(0x072b11a5) /* 0.448014875 */, 16 }, +/* 2244 */ { MAD_F(0x072c28ec) /* 0.448281214 */, 16 }, +/* 2245 */ { MAD_F(0x072d403d) /* 0.448547592 */, 16 }, +/* 2246 */ { MAD_F(0x072e5799) /* 0.448814010 */, 16 }, +/* 2247 */ { MAD_F(0x072f6f00) /* 0.449080467 */, 16 }, +/* 2248 */ { MAD_F(0x07308671) /* 0.449346964 */, 16 }, +/* 2249 */ { MAD_F(0x07319ded) /* 0.449613501 */, 16 }, +/* 2250 */ { MAD_F(0x0732b573) /* 0.449880076 */, 16 }, +/* 2251 */ { MAD_F(0x0733cd04) /* 0.450146692 */, 16 }, +/* 2252 */ { MAD_F(0x0734e4a0) /* 0.450413347 */, 16 }, +/* 2253 */ { MAD_F(0x0735fc46) /* 0.450680041 */, 16 }, +/* 2254 */ { MAD_F(0x073713f7) /* 0.450946775 */, 16 }, +/* 2255 */ { MAD_F(0x07382bb2) /* 0.451213548 */, 16 }, + +/* 2256 */ { MAD_F(0x07394378) /* 0.451480360 */, 16 }, +/* 2257 */ { MAD_F(0x073a5b49) /* 0.451747213 */, 16 }, +/* 2258 */ { MAD_F(0x073b7324) /* 0.452014104 */, 16 }, +/* 2259 */ { MAD_F(0x073c8b0a) /* 0.452281035 */, 16 }, +/* 2260 */ { MAD_F(0x073da2fa) /* 0.452548005 */, 16 }, +/* 2261 */ { MAD_F(0x073ebaf5) /* 0.452815015 */, 16 }, +/* 2262 */ { MAD_F(0x073fd2fa) /* 0.453082064 */, 16 }, +/* 2263 */ { MAD_F(0x0740eb0a) /* 0.453349152 */, 16 }, +/* 2264 */ { MAD_F(0x07420325) /* 0.453616280 */, 16 }, +/* 2265 */ { MAD_F(0x07431b4a) /* 0.453883447 */, 16 }, +/* 2266 */ { MAD_F(0x0744337a) /* 0.454150653 */, 16 }, +/* 2267 */ { MAD_F(0x07454bb4) /* 0.454417899 */, 16 }, +/* 2268 */ { MAD_F(0x074663f8) /* 0.454685184 */, 16 }, +/* 2269 */ { MAD_F(0x07477c48) /* 0.454952508 */, 16 }, +/* 2270 */ { MAD_F(0x074894a2) /* 0.455219872 */, 16 }, +/* 2271 */ { MAD_F(0x0749ad06) /* 0.455487275 */, 16 }, + +/* 2272 */ { MAD_F(0x074ac575) /* 0.455754717 */, 16 }, +/* 2273 */ { MAD_F(0x074bddee) /* 0.456022198 */, 16 }, +/* 2274 */ { MAD_F(0x074cf672) /* 0.456289719 */, 16 }, +/* 2275 */ { MAD_F(0x074e0f01) /* 0.456557278 */, 16 }, +/* 2276 */ { MAD_F(0x074f279a) /* 0.456824877 */, 16 }, +/* 2277 */ { MAD_F(0x0750403e) /* 0.457092516 */, 16 }, +/* 2278 */ { MAD_F(0x075158ec) /* 0.457360193 */, 16 }, +/* 2279 */ { MAD_F(0x075271a4) /* 0.457627909 */, 16 }, +/* 2280 */ { MAD_F(0x07538a67) /* 0.457895665 */, 16 }, +/* 2281 */ { MAD_F(0x0754a335) /* 0.458163460 */, 16 }, +/* 2282 */ { MAD_F(0x0755bc0d) /* 0.458431294 */, 16 }, +/* 2283 */ { MAD_F(0x0756d4f0) /* 0.458699167 */, 16 }, +/* 2284 */ { MAD_F(0x0757eddd) /* 0.458967079 */, 16 }, +/* 2285 */ { MAD_F(0x075906d5) /* 0.459235030 */, 16 }, +/* 2286 */ { MAD_F(0x075a1fd7) /* 0.459503021 */, 16 }, +/* 2287 */ { MAD_F(0x075b38e3) /* 0.459771050 */, 16 }, + +/* 2288 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 16 }, +/* 2289 */ { MAD_F(0x075d6b1c) /* 0.460307226 */, 16 }, +/* 2290 */ { MAD_F(0x075e8448) /* 0.460575373 */, 16 }, +/* 2291 */ { MAD_F(0x075f9d7f) /* 0.460843559 */, 16 }, +/* 2292 */ { MAD_F(0x0760b6c0) /* 0.461111783 */, 16 }, +/* 2293 */ { MAD_F(0x0761d00b) /* 0.461380047 */, 16 }, +/* 2294 */ { MAD_F(0x0762e961) /* 0.461648350 */, 16 }, +/* 2295 */ { MAD_F(0x076402c1) /* 0.461916691 */, 16 }, +/* 2296 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 16 }, +/* 2297 */ { MAD_F(0x076635a2) /* 0.462453492 */, 16 }, +/* 2298 */ { MAD_F(0x07674f22) /* 0.462721950 */, 16 }, +/* 2299 */ { MAD_F(0x076868ac) /* 0.462990448 */, 16 }, +/* 2300 */ { MAD_F(0x07698240) /* 0.463258984 */, 16 }, +/* 2301 */ { MAD_F(0x076a9be0) /* 0.463527560 */, 16 }, +/* 2302 */ { MAD_F(0x076bb589) /* 0.463796174 */, 16 }, +/* 2303 */ { MAD_F(0x076ccf3d) /* 0.464064827 */, 16 }, + +/* 2304 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 16 }, +/* 2305 */ { MAD_F(0x076f02c5) /* 0.464602250 */, 16 }, +/* 2306 */ { MAD_F(0x07701c98) /* 0.464871020 */, 16 }, +/* 2307 */ { MAD_F(0x07713676) /* 0.465139829 */, 16 }, +/* 2308 */ { MAD_F(0x0772505e) /* 0.465408676 */, 16 }, +/* 2309 */ { MAD_F(0x07736a51) /* 0.465677563 */, 16 }, +/* 2310 */ { MAD_F(0x0774844e) /* 0.465946488 */, 16 }, +/* 2311 */ { MAD_F(0x07759e55) /* 0.466215452 */, 16 }, +/* 2312 */ { MAD_F(0x0776b867) /* 0.466484455 */, 16 }, +/* 2313 */ { MAD_F(0x0777d283) /* 0.466753496 */, 16 }, +/* 2314 */ { MAD_F(0x0778ecaa) /* 0.467022577 */, 16 }, +/* 2315 */ { MAD_F(0x077a06db) /* 0.467291696 */, 16 }, +/* 2316 */ { MAD_F(0x077b2117) /* 0.467560854 */, 16 }, +/* 2317 */ { MAD_F(0x077c3b5d) /* 0.467830050 */, 16 }, +/* 2318 */ { MAD_F(0x077d55ad) /* 0.468099285 */, 16 }, +/* 2319 */ { MAD_F(0x077e7008) /* 0.468368560 */, 16 }, + +/* 2320 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 16 }, +/* 2321 */ { MAD_F(0x0780a4dc) /* 0.468907224 */, 16 }, +/* 2322 */ { MAD_F(0x0781bf56) /* 0.469176614 */, 16 }, +/* 2323 */ { MAD_F(0x0782d9da) /* 0.469446043 */, 16 }, +/* 2324 */ { MAD_F(0x0783f469) /* 0.469715510 */, 16 }, +/* 2325 */ { MAD_F(0x07850f02) /* 0.469985016 */, 16 }, +/* 2326 */ { MAD_F(0x078629a5) /* 0.470254561 */, 16 }, +/* 2327 */ { MAD_F(0x07874453) /* 0.470524145 */, 16 }, +/* 2328 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 16 }, +/* 2329 */ { MAD_F(0x078979ce) /* 0.471063427 */, 16 }, +/* 2330 */ { MAD_F(0x078a949a) /* 0.471333126 */, 16 }, +/* 2331 */ { MAD_F(0x078baf72) /* 0.471602864 */, 16 }, +/* 2332 */ { MAD_F(0x078cca53) /* 0.471872641 */, 16 }, +/* 2333 */ { MAD_F(0x078de53f) /* 0.472142456 */, 16 }, +/* 2334 */ { MAD_F(0x078f0035) /* 0.472412309 */, 16 }, +/* 2335 */ { MAD_F(0x07901b36) /* 0.472682201 */, 16 }, + +/* 2336 */ { MAD_F(0x07913641) /* 0.472952132 */, 16 }, +/* 2337 */ { MAD_F(0x07925156) /* 0.473222101 */, 16 }, +/* 2338 */ { MAD_F(0x07936c76) /* 0.473492108 */, 16 }, +/* 2339 */ { MAD_F(0x079487a0) /* 0.473762155 */, 16 }, +/* 2340 */ { MAD_F(0x0795a2d4) /* 0.474032239 */, 16 }, +/* 2341 */ { MAD_F(0x0796be13) /* 0.474302362 */, 16 }, +/* 2342 */ { MAD_F(0x0797d95c) /* 0.474572524 */, 16 }, +/* 2343 */ { MAD_F(0x0798f4af) /* 0.474842724 */, 16 }, +/* 2344 */ { MAD_F(0x079a100c) /* 0.475112962 */, 16 }, +/* 2345 */ { MAD_F(0x079b2b74) /* 0.475383239 */, 16 }, +/* 2346 */ { MAD_F(0x079c46e7) /* 0.475653554 */, 16 }, +/* 2347 */ { MAD_F(0x079d6263) /* 0.475923908 */, 16 }, +/* 2348 */ { MAD_F(0x079e7dea) /* 0.476194300 */, 16 }, +/* 2349 */ { MAD_F(0x079f997b) /* 0.476464731 */, 16 }, +/* 2350 */ { MAD_F(0x07a0b516) /* 0.476735200 */, 16 }, +/* 2351 */ { MAD_F(0x07a1d0bc) /* 0.477005707 */, 16 }, + +/* 2352 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 16 }, +/* 2353 */ { MAD_F(0x07a40827) /* 0.477546836 */, 16 }, +/* 2354 */ { MAD_F(0x07a523eb) /* 0.477817459 */, 16 }, +/* 2355 */ { MAD_F(0x07a63fba) /* 0.478088119 */, 16 }, +/* 2356 */ { MAD_F(0x07a75b93) /* 0.478358818 */, 16 }, +/* 2357 */ { MAD_F(0x07a87777) /* 0.478629555 */, 16 }, +/* 2358 */ { MAD_F(0x07a99364) /* 0.478900331 */, 16 }, +/* 2359 */ { MAD_F(0x07aaaf5c) /* 0.479171145 */, 16 }, +/* 2360 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 16 }, +/* 2361 */ { MAD_F(0x07ace76b) /* 0.479712887 */, 16 }, +/* 2362 */ { MAD_F(0x07ae0382) /* 0.479983816 */, 16 }, +/* 2363 */ { MAD_F(0x07af1fa3) /* 0.480254782 */, 16 }, +/* 2364 */ { MAD_F(0x07b03bcf) /* 0.480525787 */, 16 }, +/* 2365 */ { MAD_F(0x07b15804) /* 0.480796831 */, 16 }, +/* 2366 */ { MAD_F(0x07b27444) /* 0.481067912 */, 16 }, +/* 2367 */ { MAD_F(0x07b3908e) /* 0.481339032 */, 16 }, + +/* 2368 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 16 }, +/* 2369 */ { MAD_F(0x07b5c941) /* 0.481881385 */, 16 }, +/* 2370 */ { MAD_F(0x07b6e5aa) /* 0.482152620 */, 16 }, +/* 2371 */ { MAD_F(0x07b8021d) /* 0.482423892 */, 16 }, +/* 2372 */ { MAD_F(0x07b91e9b) /* 0.482695202 */, 16 }, +/* 2373 */ { MAD_F(0x07ba3b22) /* 0.482966551 */, 16 }, +/* 2374 */ { MAD_F(0x07bb57b4) /* 0.483237938 */, 16 }, +/* 2375 */ { MAD_F(0x07bc7450) /* 0.483509362 */, 16 }, +/* 2376 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 16 }, +/* 2377 */ { MAD_F(0x07beada7) /* 0.484052326 */, 16 }, +/* 2378 */ { MAD_F(0x07bfca61) /* 0.484323865 */, 16 }, +/* 2379 */ { MAD_F(0x07c0e726) /* 0.484595443 */, 16 }, +/* 2380 */ { MAD_F(0x07c203f5) /* 0.484867058 */, 16 }, +/* 2381 */ { MAD_F(0x07c320cf) /* 0.485138711 */, 16 }, +/* 2382 */ { MAD_F(0x07c43db2) /* 0.485410402 */, 16 }, +/* 2383 */ { MAD_F(0x07c55aa0) /* 0.485682131 */, 16 }, + +/* 2384 */ { MAD_F(0x07c67798) /* 0.485953899 */, 16 }, +/* 2385 */ { MAD_F(0x07c7949a) /* 0.486225704 */, 16 }, +/* 2386 */ { MAD_F(0x07c8b1a7) /* 0.486497547 */, 16 }, +/* 2387 */ { MAD_F(0x07c9cebd) /* 0.486769429 */, 16 }, +/* 2388 */ { MAD_F(0x07caebde) /* 0.487041348 */, 16 }, +/* 2389 */ { MAD_F(0x07cc0909) /* 0.487313305 */, 16 }, +/* 2390 */ { MAD_F(0x07cd263e) /* 0.487585300 */, 16 }, +/* 2391 */ { MAD_F(0x07ce437d) /* 0.487857333 */, 16 }, +/* 2392 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 16 }, +/* 2393 */ { MAD_F(0x07d07e1b) /* 0.488401513 */, 16 }, +/* 2394 */ { MAD_F(0x07d19b79) /* 0.488673660 */, 16 }, +/* 2395 */ { MAD_F(0x07d2b8e1) /* 0.488945845 */, 16 }, +/* 2396 */ { MAD_F(0x07d3d653) /* 0.489218067 */, 16 }, +/* 2397 */ { MAD_F(0x07d4f3cf) /* 0.489490328 */, 16 }, +/* 2398 */ { MAD_F(0x07d61156) /* 0.489762626 */, 16 }, +/* 2399 */ { MAD_F(0x07d72ee6) /* 0.490034962 */, 16 }, + +/* 2400 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 16 }, +/* 2401 */ { MAD_F(0x07d96a26) /* 0.490579748 */, 16 }, +/* 2402 */ { MAD_F(0x07da87d5) /* 0.490852198 */, 16 }, +/* 2403 */ { MAD_F(0x07dba58f) /* 0.491124686 */, 16 }, +/* 2404 */ { MAD_F(0x07dcc352) /* 0.491397211 */, 16 }, +/* 2405 */ { MAD_F(0x07dde120) /* 0.491669774 */, 16 }, +/* 2406 */ { MAD_F(0x07defef7) /* 0.491942375 */, 16 }, +/* 2407 */ { MAD_F(0x07e01cd9) /* 0.492215014 */, 16 }, +/* 2408 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 16 }, +/* 2409 */ { MAD_F(0x07e258bc) /* 0.492760404 */, 16 }, +/* 2410 */ { MAD_F(0x07e376bc) /* 0.493033156 */, 16 }, +/* 2411 */ { MAD_F(0x07e494c6) /* 0.493305946 */, 16 }, +/* 2412 */ { MAD_F(0x07e5b2db) /* 0.493578773 */, 16 }, +/* 2413 */ { MAD_F(0x07e6d0f9) /* 0.493851638 */, 16 }, +/* 2414 */ { MAD_F(0x07e7ef22) /* 0.494124541 */, 16 }, +/* 2415 */ { MAD_F(0x07e90d55) /* 0.494397481 */, 16 }, + +/* 2416 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 16 }, +/* 2417 */ { MAD_F(0x07eb49d9) /* 0.494943475 */, 16 }, +/* 2418 */ { MAD_F(0x07ec682a) /* 0.495216529 */, 16 }, +/* 2419 */ { MAD_F(0x07ed8686) /* 0.495489620 */, 16 }, +/* 2420 */ { MAD_F(0x07eea4eb) /* 0.495762748 */, 16 }, +/* 2421 */ { MAD_F(0x07efc35b) /* 0.496035915 */, 16 }, +/* 2422 */ { MAD_F(0x07f0e1d4) /* 0.496309119 */, 16 }, +/* 2423 */ { MAD_F(0x07f20058) /* 0.496582360 */, 16 }, +/* 2424 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 16 }, +/* 2425 */ { MAD_F(0x07f43d7e) /* 0.497128956 */, 16 }, +/* 2426 */ { MAD_F(0x07f55c20) /* 0.497402310 */, 16 }, +/* 2427 */ { MAD_F(0x07f67acc) /* 0.497675702 */, 16 }, +/* 2428 */ { MAD_F(0x07f79982) /* 0.497949132 */, 16 }, +/* 2429 */ { MAD_F(0x07f8b842) /* 0.498222598 */, 16 }, +/* 2430 */ { MAD_F(0x07f9d70c) /* 0.498496103 */, 16 }, +/* 2431 */ { MAD_F(0x07faf5e1) /* 0.498769645 */, 16 }, + +/* 2432 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 16 }, +/* 2433 */ { MAD_F(0x07fd33a8) /* 0.499316841 */, 16 }, +/* 2434 */ { MAD_F(0x07fe529a) /* 0.499590496 */, 16 }, +/* 2435 */ { MAD_F(0x07ff7197) /* 0.499864188 */, 16 }, +/* 2436 */ { MAD_F(0x0400484f) /* 0.250068959 */, 17 }, +/* 2437 */ { MAD_F(0x0400d7d7) /* 0.250205842 */, 17 }, +/* 2438 */ { MAD_F(0x04016764) /* 0.250342744 */, 17 }, +/* 2439 */ { MAD_F(0x0401f6f7) /* 0.250479665 */, 17 }, +/* 2440 */ { MAD_F(0x0402868e) /* 0.250616605 */, 17 }, +/* 2441 */ { MAD_F(0x0403162b) /* 0.250753563 */, 17 }, +/* 2442 */ { MAD_F(0x0403a5cc) /* 0.250890540 */, 17 }, +/* 2443 */ { MAD_F(0x04043573) /* 0.251027536 */, 17 }, +/* 2444 */ { MAD_F(0x0404c51e) /* 0.251164550 */, 17 }, +/* 2445 */ { MAD_F(0x040554cf) /* 0.251301583 */, 17 }, +/* 2446 */ { MAD_F(0x0405e484) /* 0.251438635 */, 17 }, +/* 2447 */ { MAD_F(0x0406743f) /* 0.251575706 */, 17 }, + +/* 2448 */ { MAD_F(0x040703ff) /* 0.251712795 */, 17 }, +/* 2449 */ { MAD_F(0x040793c3) /* 0.251849903 */, 17 }, +/* 2450 */ { MAD_F(0x0408238d) /* 0.251987029 */, 17 }, +/* 2451 */ { MAD_F(0x0408b35b) /* 0.252124174 */, 17 }, +/* 2452 */ { MAD_F(0x0409432f) /* 0.252261338 */, 17 }, +/* 2453 */ { MAD_F(0x0409d308) /* 0.252398520 */, 17 }, +/* 2454 */ { MAD_F(0x040a62e5) /* 0.252535721 */, 17 }, +/* 2455 */ { MAD_F(0x040af2c8) /* 0.252672941 */, 17 }, +/* 2456 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 17 }, +/* 2457 */ { MAD_F(0x040c129c) /* 0.252947436 */, 17 }, +/* 2458 */ { MAD_F(0x040ca28e) /* 0.253084712 */, 17 }, +/* 2459 */ { MAD_F(0x040d3284) /* 0.253222006 */, 17 }, +/* 2460 */ { MAD_F(0x040dc280) /* 0.253359319 */, 17 }, +/* 2461 */ { MAD_F(0x040e5281) /* 0.253496651 */, 17 }, +/* 2462 */ { MAD_F(0x040ee286) /* 0.253634001 */, 17 }, +/* 2463 */ { MAD_F(0x040f7291) /* 0.253771369 */, 17 }, + +/* 2464 */ { MAD_F(0x041002a1) /* 0.253908756 */, 17 }, +/* 2465 */ { MAD_F(0x041092b5) /* 0.254046162 */, 17 }, +/* 2466 */ { MAD_F(0x041122cf) /* 0.254183587 */, 17 }, +/* 2467 */ { MAD_F(0x0411b2ed) /* 0.254321030 */, 17 }, +/* 2468 */ { MAD_F(0x04124311) /* 0.254458491 */, 17 }, +/* 2469 */ { MAD_F(0x0412d339) /* 0.254595971 */, 17 }, +/* 2470 */ { MAD_F(0x04136367) /* 0.254733470 */, 17 }, +/* 2471 */ { MAD_F(0x0413f399) /* 0.254870987 */, 17 }, +/* 2472 */ { MAD_F(0x041483d1) /* 0.255008523 */, 17 }, +/* 2473 */ { MAD_F(0x0415140d) /* 0.255146077 */, 17 }, +/* 2474 */ { MAD_F(0x0415a44f) /* 0.255283650 */, 17 }, +/* 2475 */ { MAD_F(0x04163495) /* 0.255421241 */, 17 }, +/* 2476 */ { MAD_F(0x0416c4e1) /* 0.255558851 */, 17 }, +/* 2477 */ { MAD_F(0x04175531) /* 0.255696480 */, 17 }, +/* 2478 */ { MAD_F(0x0417e586) /* 0.255834127 */, 17 }, +/* 2479 */ { MAD_F(0x041875e1) /* 0.255971792 */, 17 }, + +/* 2480 */ { MAD_F(0x04190640) /* 0.256109476 */, 17 }, +/* 2481 */ { MAD_F(0x041996a4) /* 0.256247179 */, 17 }, +/* 2482 */ { MAD_F(0x041a270d) /* 0.256384900 */, 17 }, +/* 2483 */ { MAD_F(0x041ab77b) /* 0.256522639 */, 17 }, +/* 2484 */ { MAD_F(0x041b47ef) /* 0.256660397 */, 17 }, +/* 2485 */ { MAD_F(0x041bd867) /* 0.256798174 */, 17 }, +/* 2486 */ { MAD_F(0x041c68e4) /* 0.256935969 */, 17 }, +/* 2487 */ { MAD_F(0x041cf966) /* 0.257073782 */, 17 }, +/* 2488 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 17 }, +/* 2489 */ { MAD_F(0x041e1a79) /* 0.257349465 */, 17 }, +/* 2490 */ { MAD_F(0x041eab0a) /* 0.257487334 */, 17 }, +/* 2491 */ { MAD_F(0x041f3b9f) /* 0.257625221 */, 17 }, +/* 2492 */ { MAD_F(0x041fcc3a) /* 0.257763127 */, 17 }, +/* 2493 */ { MAD_F(0x04205cda) /* 0.257901051 */, 17 }, +/* 2494 */ { MAD_F(0x0420ed7f) /* 0.258038994 */, 17 }, +/* 2495 */ { MAD_F(0x04217e28) /* 0.258176955 */, 17 }, + +/* 2496 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 17 }, +/* 2497 */ { MAD_F(0x04229f8a) /* 0.258452932 */, 17 }, +/* 2498 */ { MAD_F(0x04233043) /* 0.258590948 */, 17 }, +/* 2499 */ { MAD_F(0x0423c100) /* 0.258728983 */, 17 }, +/* 2500 */ { MAD_F(0x042451c3) /* 0.258867036 */, 17 }, +/* 2501 */ { MAD_F(0x0424e28a) /* 0.259005108 */, 17 }, +/* 2502 */ { MAD_F(0x04257356) /* 0.259143198 */, 17 }, +/* 2503 */ { MAD_F(0x04260428) /* 0.259281307 */, 17 }, +/* 2504 */ { MAD_F(0x042694fe) /* 0.259419433 */, 17 }, +/* 2505 */ { MAD_F(0x042725d9) /* 0.259557579 */, 17 }, +/* 2506 */ { MAD_F(0x0427b6b9) /* 0.259695742 */, 17 }, +/* 2507 */ { MAD_F(0x0428479e) /* 0.259833924 */, 17 }, +/* 2508 */ { MAD_F(0x0428d888) /* 0.259972124 */, 17 }, +/* 2509 */ { MAD_F(0x04296976) /* 0.260110343 */, 17 }, +/* 2510 */ { MAD_F(0x0429fa6a) /* 0.260248580 */, 17 }, +/* 2511 */ { MAD_F(0x042a8b63) /* 0.260386836 */, 17 }, + +/* 2512 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 17 }, +/* 2513 */ { MAD_F(0x042bad63) /* 0.260663402 */, 17 }, +/* 2514 */ { MAD_F(0x042c3e6a) /* 0.260801712 */, 17 }, +/* 2515 */ { MAD_F(0x042ccf77) /* 0.260940041 */, 17 }, +/* 2516 */ { MAD_F(0x042d6088) /* 0.261078388 */, 17 }, +/* 2517 */ { MAD_F(0x042df19e) /* 0.261216754 */, 17 }, +/* 2518 */ { MAD_F(0x042e82b9) /* 0.261355137 */, 17 }, +/* 2519 */ { MAD_F(0x042f13d9) /* 0.261493540 */, 17 }, +/* 2520 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 17 }, +/* 2521 */ { MAD_F(0x04303628) /* 0.261770399 */, 17 }, +/* 2522 */ { MAD_F(0x0430c757) /* 0.261908856 */, 17 }, +/* 2523 */ { MAD_F(0x0431588b) /* 0.262047331 */, 17 }, +/* 2524 */ { MAD_F(0x0431e9c3) /* 0.262185825 */, 17 }, +/* 2525 */ { MAD_F(0x04327b01) /* 0.262324337 */, 17 }, +/* 2526 */ { MAD_F(0x04330c43) /* 0.262462867 */, 17 }, +/* 2527 */ { MAD_F(0x04339d8a) /* 0.262601416 */, 17 }, + +/* 2528 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 17 }, +/* 2529 */ { MAD_F(0x0434c028) /* 0.262878568 */, 17 }, +/* 2530 */ { MAD_F(0x0435517e) /* 0.263017171 */, 17 }, +/* 2531 */ { MAD_F(0x0435e2d9) /* 0.263155792 */, 17 }, +/* 2532 */ { MAD_F(0x04367439) /* 0.263294432 */, 17 }, +/* 2533 */ { MAD_F(0x0437059e) /* 0.263433090 */, 17 }, +/* 2534 */ { MAD_F(0x04379707) /* 0.263571767 */, 17 }, +/* 2535 */ { MAD_F(0x04382876) /* 0.263710461 */, 17 }, +/* 2536 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 17 }, +/* 2537 */ { MAD_F(0x04394b61) /* 0.263987905 */, 17 }, +/* 2538 */ { MAD_F(0x0439dcdf) /* 0.264126655 */, 17 }, +/* 2539 */ { MAD_F(0x043a6e61) /* 0.264265422 */, 17 }, +/* 2540 */ { MAD_F(0x043affe8) /* 0.264404208 */, 17 }, +/* 2541 */ { MAD_F(0x043b9174) /* 0.264543012 */, 17 }, +/* 2542 */ { MAD_F(0x043c2305) /* 0.264681834 */, 17 }, +/* 2543 */ { MAD_F(0x043cb49a) /* 0.264820674 */, 17 }, + +/* 2544 */ { MAD_F(0x043d4635) /* 0.264959533 */, 17 }, +/* 2545 */ { MAD_F(0x043dd7d4) /* 0.265098410 */, 17 }, +/* 2546 */ { MAD_F(0x043e6979) /* 0.265237305 */, 17 }, +/* 2547 */ { MAD_F(0x043efb22) /* 0.265376218 */, 17 }, +/* 2548 */ { MAD_F(0x043f8cd0) /* 0.265515149 */, 17 }, +/* 2549 */ { MAD_F(0x04401e83) /* 0.265654099 */, 17 }, +/* 2550 */ { MAD_F(0x0440b03b) /* 0.265793066 */, 17 }, +/* 2551 */ { MAD_F(0x044141f7) /* 0.265932052 */, 17 }, +/* 2552 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 17 }, +/* 2553 */ { MAD_F(0x04426580) /* 0.266210078 */, 17 }, +/* 2554 */ { MAD_F(0x0442f74b) /* 0.266349119 */, 17 }, +/* 2555 */ { MAD_F(0x0443891b) /* 0.266488177 */, 17 }, +/* 2556 */ { MAD_F(0x04441af0) /* 0.266627254 */, 17 }, +/* 2557 */ { MAD_F(0x0444acca) /* 0.266766349 */, 17 }, +/* 2558 */ { MAD_F(0x04453ea9) /* 0.266905462 */, 17 }, +/* 2559 */ { MAD_F(0x0445d08d) /* 0.267044593 */, 17 }, + +/* 2560 */ { MAD_F(0x04466275) /* 0.267183742 */, 17 }, +/* 2561 */ { MAD_F(0x0446f463) /* 0.267322909 */, 17 }, +/* 2562 */ { MAD_F(0x04478655) /* 0.267462094 */, 17 }, +/* 2563 */ { MAD_F(0x0448184c) /* 0.267601298 */, 17 }, +/* 2564 */ { MAD_F(0x0448aa48) /* 0.267740519 */, 17 }, +/* 2565 */ { MAD_F(0x04493c49) /* 0.267879759 */, 17 }, +/* 2566 */ { MAD_F(0x0449ce4f) /* 0.268019017 */, 17 }, +/* 2567 */ { MAD_F(0x044a6059) /* 0.268158293 */, 17 }, +/* 2568 */ { MAD_F(0x044af269) /* 0.268297587 */, 17 }, +/* 2569 */ { MAD_F(0x044b847d) /* 0.268436899 */, 17 }, +/* 2570 */ { MAD_F(0x044c1696) /* 0.268576229 */, 17 }, +/* 2571 */ { MAD_F(0x044ca8b4) /* 0.268715577 */, 17 }, +/* 2572 */ { MAD_F(0x044d3ad7) /* 0.268854943 */, 17 }, +/* 2573 */ { MAD_F(0x044dccff) /* 0.268994328 */, 17 }, +/* 2574 */ { MAD_F(0x044e5f2b) /* 0.269133730 */, 17 }, +/* 2575 */ { MAD_F(0x044ef15d) /* 0.269273150 */, 17 }, + +/* 2576 */ { MAD_F(0x044f8393) /* 0.269412589 */, 17 }, +/* 2577 */ { MAD_F(0x045015ce) /* 0.269552045 */, 17 }, +/* 2578 */ { MAD_F(0x0450a80e) /* 0.269691520 */, 17 }, +/* 2579 */ { MAD_F(0x04513a53) /* 0.269831013 */, 17 }, +/* 2580 */ { MAD_F(0x0451cc9c) /* 0.269970523 */, 17 }, +/* 2581 */ { MAD_F(0x04525eeb) /* 0.270110052 */, 17 }, +/* 2582 */ { MAD_F(0x0452f13e) /* 0.270249599 */, 17 }, +/* 2583 */ { MAD_F(0x04538396) /* 0.270389163 */, 17 }, +/* 2584 */ { MAD_F(0x045415f3) /* 0.270528746 */, 17 }, +/* 2585 */ { MAD_F(0x0454a855) /* 0.270668347 */, 17 }, +/* 2586 */ { MAD_F(0x04553abb) /* 0.270807965 */, 17 }, +/* 2587 */ { MAD_F(0x0455cd27) /* 0.270947602 */, 17 }, +/* 2588 */ { MAD_F(0x04565f97) /* 0.271087257 */, 17 }, +/* 2589 */ { MAD_F(0x0456f20c) /* 0.271226930 */, 17 }, +/* 2590 */ { MAD_F(0x04578486) /* 0.271366620 */, 17 }, +/* 2591 */ { MAD_F(0x04581705) /* 0.271506329 */, 17 }, + +/* 2592 */ { MAD_F(0x0458a989) /* 0.271646056 */, 17 }, +/* 2593 */ { MAD_F(0x04593c11) /* 0.271785800 */, 17 }, +/* 2594 */ { MAD_F(0x0459ce9e) /* 0.271925563 */, 17 }, +/* 2595 */ { MAD_F(0x045a6130) /* 0.272065343 */, 17 }, +/* 2596 */ { MAD_F(0x045af3c7) /* 0.272205142 */, 17 }, +/* 2597 */ { MAD_F(0x045b8663) /* 0.272344958 */, 17 }, +/* 2598 */ { MAD_F(0x045c1903) /* 0.272484793 */, 17 }, +/* 2599 */ { MAD_F(0x045caba9) /* 0.272624645 */, 17 }, +/* 2600 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 17 }, +/* 2601 */ { MAD_F(0x045dd102) /* 0.272904403 */, 17 }, +/* 2602 */ { MAD_F(0x045e63b6) /* 0.273044310 */, 17 }, +/* 2603 */ { MAD_F(0x045ef66e) /* 0.273184234 */, 17 }, +/* 2604 */ { MAD_F(0x045f892b) /* 0.273324176 */, 17 }, +/* 2605 */ { MAD_F(0x04601bee) /* 0.273464136 */, 17 }, +/* 2606 */ { MAD_F(0x0460aeb5) /* 0.273604113 */, 17 }, +/* 2607 */ { MAD_F(0x04614180) /* 0.273744109 */, 17 }, + +/* 2608 */ { MAD_F(0x0461d451) /* 0.273884123 */, 17 }, +/* 2609 */ { MAD_F(0x04626727) /* 0.274024154 */, 17 }, +/* 2610 */ { MAD_F(0x0462fa01) /* 0.274164204 */, 17 }, +/* 2611 */ { MAD_F(0x04638ce0) /* 0.274304271 */, 17 }, +/* 2612 */ { MAD_F(0x04641fc4) /* 0.274444356 */, 17 }, +/* 2613 */ { MAD_F(0x0464b2ac) /* 0.274584459 */, 17 }, +/* 2614 */ { MAD_F(0x0465459a) /* 0.274724580 */, 17 }, +/* 2615 */ { MAD_F(0x0465d88c) /* 0.274864719 */, 17 }, +/* 2616 */ { MAD_F(0x04666b83) /* 0.275004875 */, 17 }, +/* 2617 */ { MAD_F(0x0466fe7f) /* 0.275145050 */, 17 }, +/* 2618 */ { MAD_F(0x0467917f) /* 0.275285242 */, 17 }, +/* 2619 */ { MAD_F(0x04682485) /* 0.275425452 */, 17 }, +/* 2620 */ { MAD_F(0x0468b78f) /* 0.275565681 */, 17 }, +/* 2621 */ { MAD_F(0x04694a9e) /* 0.275705926 */, 17 }, +/* 2622 */ { MAD_F(0x0469ddb2) /* 0.275846190 */, 17 }, +/* 2623 */ { MAD_F(0x046a70ca) /* 0.275986472 */, 17 }, + +/* 2624 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 17 }, +/* 2625 */ { MAD_F(0x046b970a) /* 0.276267088 */, 17 }, +/* 2626 */ { MAD_F(0x046c2a31) /* 0.276407423 */, 17 }, +/* 2627 */ { MAD_F(0x046cbd5c) /* 0.276547776 */, 17 }, +/* 2628 */ { MAD_F(0x046d508d) /* 0.276688147 */, 17 }, +/* 2629 */ { MAD_F(0x046de3c2) /* 0.276828535 */, 17 }, +/* 2630 */ { MAD_F(0x046e76fc) /* 0.276968942 */, 17 }, +/* 2631 */ { MAD_F(0x046f0a3b) /* 0.277109366 */, 17 }, +/* 2632 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 17 }, +/* 2633 */ { MAD_F(0x047030c7) /* 0.277390267 */, 17 }, +/* 2634 */ { MAD_F(0x0470c414) /* 0.277530745 */, 17 }, +/* 2635 */ { MAD_F(0x04715766) /* 0.277671240 */, 17 }, +/* 2636 */ { MAD_F(0x0471eabc) /* 0.277811753 */, 17 }, +/* 2637 */ { MAD_F(0x04727e18) /* 0.277952284 */, 17 }, +/* 2638 */ { MAD_F(0x04731178) /* 0.278092832 */, 17 }, +/* 2639 */ { MAD_F(0x0473a4dd) /* 0.278233399 */, 17 }, + +/* 2640 */ { MAD_F(0x04743847) /* 0.278373983 */, 17 }, +/* 2641 */ { MAD_F(0x0474cbb5) /* 0.278514584 */, 17 }, +/* 2642 */ { MAD_F(0x04755f29) /* 0.278655204 */, 17 }, +/* 2643 */ { MAD_F(0x0475f2a1) /* 0.278795841 */, 17 }, +/* 2644 */ { MAD_F(0x0476861d) /* 0.278936496 */, 17 }, +/* 2645 */ { MAD_F(0x0477199f) /* 0.279077169 */, 17 }, +/* 2646 */ { MAD_F(0x0477ad25) /* 0.279217860 */, 17 }, +/* 2647 */ { MAD_F(0x047840b0) /* 0.279358568 */, 17 }, +/* 2648 */ { MAD_F(0x0478d440) /* 0.279499294 */, 17 }, +/* 2649 */ { MAD_F(0x047967d5) /* 0.279640037 */, 17 }, +/* 2650 */ { MAD_F(0x0479fb6e) /* 0.279780799 */, 17 }, +/* 2651 */ { MAD_F(0x047a8f0c) /* 0.279921578 */, 17 }, +/* 2652 */ { MAD_F(0x047b22af) /* 0.280062375 */, 17 }, +/* 2653 */ { MAD_F(0x047bb657) /* 0.280203189 */, 17 }, +/* 2654 */ { MAD_F(0x047c4a03) /* 0.280344021 */, 17 }, +/* 2655 */ { MAD_F(0x047cddb4) /* 0.280484871 */, 17 }, + +/* 2656 */ { MAD_F(0x047d716a) /* 0.280625739 */, 17 }, +/* 2657 */ { MAD_F(0x047e0524) /* 0.280766624 */, 17 }, +/* 2658 */ { MAD_F(0x047e98e4) /* 0.280907527 */, 17 }, +/* 2659 */ { MAD_F(0x047f2ca8) /* 0.281048447 */, 17 }, +/* 2660 */ { MAD_F(0x047fc071) /* 0.281189385 */, 17 }, +/* 2661 */ { MAD_F(0x0480543e) /* 0.281330341 */, 17 }, +/* 2662 */ { MAD_F(0x0480e811) /* 0.281471315 */, 17 }, +/* 2663 */ { MAD_F(0x04817be8) /* 0.281612306 */, 17 }, +/* 2664 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 17 }, +/* 2665 */ { MAD_F(0x0482a3a4) /* 0.281894341 */, 17 }, +/* 2666 */ { MAD_F(0x04833789) /* 0.282035386 */, 17 }, +/* 2667 */ { MAD_F(0x0483cb73) /* 0.282176447 */, 17 }, +/* 2668 */ { MAD_F(0x04845f62) /* 0.282317527 */, 17 }, +/* 2669 */ { MAD_F(0x0484f355) /* 0.282458624 */, 17 }, +/* 2670 */ { MAD_F(0x0485874d) /* 0.282599738 */, 17 }, +/* 2671 */ { MAD_F(0x04861b4a) /* 0.282740871 */, 17 }, + +/* 2672 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 17 }, +/* 2673 */ { MAD_F(0x04874352) /* 0.283023188 */, 17 }, +/* 2674 */ { MAD_F(0x0487d75d) /* 0.283164373 */, 17 }, +/* 2675 */ { MAD_F(0x04886b6d) /* 0.283305576 */, 17 }, +/* 2676 */ { MAD_F(0x0488ff82) /* 0.283446796 */, 17 }, +/* 2677 */ { MAD_F(0x0489939b) /* 0.283588034 */, 17 }, +/* 2678 */ { MAD_F(0x048a27b9) /* 0.283729290 */, 17 }, +/* 2679 */ { MAD_F(0x048abbdc) /* 0.283870563 */, 17 }, +/* 2680 */ { MAD_F(0x048b5003) /* 0.284011853 */, 17 }, +/* 2681 */ { MAD_F(0x048be42f) /* 0.284153161 */, 17 }, +/* 2682 */ { MAD_F(0x048c7860) /* 0.284294487 */, 17 }, +/* 2683 */ { MAD_F(0x048d0c96) /* 0.284435831 */, 17 }, +/* 2684 */ { MAD_F(0x048da0d0) /* 0.284577192 */, 17 }, +/* 2685 */ { MAD_F(0x048e350f) /* 0.284718570 */, 17 }, +/* 2686 */ { MAD_F(0x048ec953) /* 0.284859966 */, 17 }, +/* 2687 */ { MAD_F(0x048f5d9b) /* 0.285001380 */, 17 }, + +/* 2688 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 17 }, +/* 2689 */ { MAD_F(0x0490863a) /* 0.285284259 */, 17 }, +/* 2690 */ { MAD_F(0x04911a91) /* 0.285425726 */, 17 }, +/* 2691 */ { MAD_F(0x0491aeec) /* 0.285567209 */, 17 }, +/* 2692 */ { MAD_F(0x0492434c) /* 0.285708711 */, 17 }, +/* 2693 */ { MAD_F(0x0492d7b0) /* 0.285850229 */, 17 }, +/* 2694 */ { MAD_F(0x04936c1a) /* 0.285991766 */, 17 }, +/* 2695 */ { MAD_F(0x04940088) /* 0.286133319 */, 17 }, +/* 2696 */ { MAD_F(0x049494fb) /* 0.286274891 */, 17 }, +/* 2697 */ { MAD_F(0x04952972) /* 0.286416480 */, 17 }, +/* 2698 */ { MAD_F(0x0495bdee) /* 0.286558086 */, 17 }, +/* 2699 */ { MAD_F(0x0496526f) /* 0.286699710 */, 17 }, +/* 2700 */ { MAD_F(0x0496e6f5) /* 0.286841351 */, 17 }, +/* 2701 */ { MAD_F(0x04977b7f) /* 0.286983010 */, 17 }, +/* 2702 */ { MAD_F(0x0498100e) /* 0.287124686 */, 17 }, +/* 2703 */ { MAD_F(0x0498a4a1) /* 0.287266380 */, 17 }, + +/* 2704 */ { MAD_F(0x0499393a) /* 0.287408091 */, 17 }, +/* 2705 */ { MAD_F(0x0499cdd7) /* 0.287549820 */, 17 }, +/* 2706 */ { MAD_F(0x049a6278) /* 0.287691566 */, 17 }, +/* 2707 */ { MAD_F(0x049af71f) /* 0.287833330 */, 17 }, +/* 2708 */ { MAD_F(0x049b8bca) /* 0.287975111 */, 17 }, +/* 2709 */ { MAD_F(0x049c207a) /* 0.288116909 */, 17 }, +/* 2710 */ { MAD_F(0x049cb52e) /* 0.288258725 */, 17 }, +/* 2711 */ { MAD_F(0x049d49e7) /* 0.288400559 */, 17 }, +/* 2712 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 17 }, +/* 2713 */ { MAD_F(0x049e7367) /* 0.288684278 */, 17 }, +/* 2714 */ { MAD_F(0x049f082f) /* 0.288826163 */, 17 }, +/* 2715 */ { MAD_F(0x049f9cfa) /* 0.288968067 */, 17 }, +/* 2716 */ { MAD_F(0x04a031cb) /* 0.289109987 */, 17 }, +/* 2717 */ { MAD_F(0x04a0c6a0) /* 0.289251925 */, 17 }, +/* 2718 */ { MAD_F(0x04a15b7a) /* 0.289393881 */, 17 }, +/* 2719 */ { MAD_F(0x04a1f059) /* 0.289535854 */, 17 }, + +/* 2720 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 17 }, +/* 2721 */ { MAD_F(0x04a31a24) /* 0.289819851 */, 17 }, +/* 2722 */ { MAD_F(0x04a3af10) /* 0.289961876 */, 17 }, +/* 2723 */ { MAD_F(0x04a44401) /* 0.290103919 */, 17 }, +/* 2724 */ { MAD_F(0x04a4d8f7) /* 0.290245979 */, 17 }, +/* 2725 */ { MAD_F(0x04a56df2) /* 0.290388056 */, 17 }, +/* 2726 */ { MAD_F(0x04a602f1) /* 0.290530150 */, 17 }, +/* 2727 */ { MAD_F(0x04a697f5) /* 0.290672262 */, 17 }, +/* 2728 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 17 }, +/* 2729 */ { MAD_F(0x04a7c20b) /* 0.290956538 */, 17 }, +/* 2730 */ { MAD_F(0x04a8571d) /* 0.291098703 */, 17 }, +/* 2731 */ { MAD_F(0x04a8ec33) /* 0.291240884 */, 17 }, +/* 2732 */ { MAD_F(0x04a9814e) /* 0.291383083 */, 17 }, +/* 2733 */ { MAD_F(0x04aa166e) /* 0.291525299 */, 17 }, +/* 2734 */ { MAD_F(0x04aaab93) /* 0.291667532 */, 17 }, +/* 2735 */ { MAD_F(0x04ab40bc) /* 0.291809783 */, 17 }, + +/* 2736 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 17 }, +/* 2737 */ { MAD_F(0x04ac6b1c) /* 0.292094337 */, 17 }, +/* 2738 */ { MAD_F(0x04ad0053) /* 0.292236640 */, 17 }, +/* 2739 */ { MAD_F(0x04ad958f) /* 0.292378960 */, 17 }, +/* 2740 */ { MAD_F(0x04ae2ad0) /* 0.292521297 */, 17 }, +/* 2741 */ { MAD_F(0x04aec015) /* 0.292663652 */, 17 }, +/* 2742 */ { MAD_F(0x04af555e) /* 0.292806024 */, 17 }, +/* 2743 */ { MAD_F(0x04afeaad) /* 0.292948414 */, 17 }, +/* 2744 */ { MAD_F(0x04b08000) /* 0.293090820 */, 17 }, +/* 2745 */ { MAD_F(0x04b11557) /* 0.293233244 */, 17 }, +/* 2746 */ { MAD_F(0x04b1aab4) /* 0.293375686 */, 17 }, +/* 2747 */ { MAD_F(0x04b24015) /* 0.293518144 */, 17 }, +/* 2748 */ { MAD_F(0x04b2d57a) /* 0.293660620 */, 17 }, +/* 2749 */ { MAD_F(0x04b36ae4) /* 0.293803113 */, 17 }, +/* 2750 */ { MAD_F(0x04b40053) /* 0.293945624 */, 17 }, +/* 2751 */ { MAD_F(0x04b495c7) /* 0.294088151 */, 17 }, + +/* 2752 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 17 }, +/* 2753 */ { MAD_F(0x04b5c0bc) /* 0.294373259 */, 17 }, +/* 2754 */ { MAD_F(0x04b6563d) /* 0.294515838 */, 17 }, +/* 2755 */ { MAD_F(0x04b6ebc3) /* 0.294658435 */, 17 }, +/* 2756 */ { MAD_F(0x04b7814e) /* 0.294801049 */, 17 }, +/* 2757 */ { MAD_F(0x04b816dd) /* 0.294943680 */, 17 }, +/* 2758 */ { MAD_F(0x04b8ac71) /* 0.295086329 */, 17 }, +/* 2759 */ { MAD_F(0x04b9420a) /* 0.295228995 */, 17 }, +/* 2760 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 17 }, +/* 2761 */ { MAD_F(0x04ba6d49) /* 0.295514378 */, 17 }, +/* 2762 */ { MAD_F(0x04bb02ef) /* 0.295657095 */, 17 }, +/* 2763 */ { MAD_F(0x04bb989a) /* 0.295799830 */, 17 }, +/* 2764 */ { MAD_F(0x04bc2e4a) /* 0.295942582 */, 17 }, +/* 2765 */ { MAD_F(0x04bcc3fe) /* 0.296085351 */, 17 }, +/* 2766 */ { MAD_F(0x04bd59b7) /* 0.296228138 */, 17 }, +/* 2767 */ { MAD_F(0x04bdef74) /* 0.296370941 */, 17 }, + +/* 2768 */ { MAD_F(0x04be8537) /* 0.296513762 */, 17 }, +/* 2769 */ { MAD_F(0x04bf1afd) /* 0.296656600 */, 17 }, +/* 2770 */ { MAD_F(0x04bfb0c9) /* 0.296799455 */, 17 }, +/* 2771 */ { MAD_F(0x04c04699) /* 0.296942327 */, 17 }, +/* 2772 */ { MAD_F(0x04c0dc6d) /* 0.297085217 */, 17 }, +/* 2773 */ { MAD_F(0x04c17247) /* 0.297228124 */, 17 }, +/* 2774 */ { MAD_F(0x04c20824) /* 0.297371048 */, 17 }, +/* 2775 */ { MAD_F(0x04c29e07) /* 0.297513989 */, 17 }, +/* 2776 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 17 }, +/* 2777 */ { MAD_F(0x04c3c9da) /* 0.297799922 */, 17 }, +/* 2778 */ { MAD_F(0x04c45fca) /* 0.297942915 */, 17 }, +/* 2779 */ { MAD_F(0x04c4f5bf) /* 0.298085925 */, 17 }, +/* 2780 */ { MAD_F(0x04c58bb8) /* 0.298228951 */, 17 }, +/* 2781 */ { MAD_F(0x04c621b6) /* 0.298371996 */, 17 }, +/* 2782 */ { MAD_F(0x04c6b7b9) /* 0.298515057 */, 17 }, +/* 2783 */ { MAD_F(0x04c74dc0) /* 0.298658135 */, 17 }, + +/* 2784 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 17 }, +/* 2785 */ { MAD_F(0x04c879dd) /* 0.298944343 */, 17 }, +/* 2786 */ { MAD_F(0x04c90ff2) /* 0.299087473 */, 17 }, +/* 2787 */ { MAD_F(0x04c9a60c) /* 0.299230620 */, 17 }, +/* 2788 */ { MAD_F(0x04ca3c2a) /* 0.299373784 */, 17 }, +/* 2789 */ { MAD_F(0x04cad24d) /* 0.299516965 */, 17 }, +/* 2790 */ { MAD_F(0x04cb6874) /* 0.299660163 */, 17 }, +/* 2791 */ { MAD_F(0x04cbfea0) /* 0.299803378 */, 17 }, +/* 2792 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 17 }, +/* 2793 */ { MAD_F(0x04cd2b06) /* 0.300089860 */, 17 }, +/* 2794 */ { MAD_F(0x04cdc140) /* 0.300233127 */, 17 }, +/* 2795 */ { MAD_F(0x04ce577f) /* 0.300376411 */, 17 }, +/* 2796 */ { MAD_F(0x04ceedc2) /* 0.300519711 */, 17 }, +/* 2797 */ { MAD_F(0x04cf8409) /* 0.300663029 */, 17 }, +/* 2798 */ { MAD_F(0x04d01a55) /* 0.300806364 */, 17 }, +/* 2799 */ { MAD_F(0x04d0b0a6) /* 0.300949716 */, 17 }, + +/* 2800 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 17 }, +/* 2801 */ { MAD_F(0x04d1dd55) /* 0.301236472 */, 17 }, +/* 2802 */ { MAD_F(0x04d273b4) /* 0.301379875 */, 17 }, +/* 2803 */ { MAD_F(0x04d30a17) /* 0.301523295 */, 17 }, +/* 2804 */ { MAD_F(0x04d3a07f) /* 0.301666733 */, 17 }, +/* 2805 */ { MAD_F(0x04d436eb) /* 0.301810187 */, 17 }, +/* 2806 */ { MAD_F(0x04d4cd5c) /* 0.301953659 */, 17 }, +/* 2807 */ { MAD_F(0x04d563d1) /* 0.302097147 */, 17 }, +/* 2808 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 17 }, +/* 2809 */ { MAD_F(0x04d690ca) /* 0.302384175 */, 17 }, +/* 2810 */ { MAD_F(0x04d7274d) /* 0.302527715 */, 17 }, +/* 2811 */ { MAD_F(0x04d7bdd5) /* 0.302671271 */, 17 }, +/* 2812 */ { MAD_F(0x04d85461) /* 0.302814845 */, 17 }, +/* 2813 */ { MAD_F(0x04d8eaf2) /* 0.302958436 */, 17 }, +/* 2814 */ { MAD_F(0x04d98187) /* 0.303102044 */, 17 }, +/* 2815 */ { MAD_F(0x04da1821) /* 0.303245668 */, 17 }, + +/* 2816 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 17 }, +/* 2817 */ { MAD_F(0x04db4563) /* 0.303532969 */, 17 }, +/* 2818 */ { MAD_F(0x04dbdc0a) /* 0.303676645 */, 17 }, +/* 2819 */ { MAD_F(0x04dc72b7) /* 0.303820337 */, 17 }, +/* 2820 */ { MAD_F(0x04dd0967) /* 0.303964047 */, 17 }, +/* 2821 */ { MAD_F(0x04dda01d) /* 0.304107774 */, 17 }, +/* 2822 */ { MAD_F(0x04de36d7) /* 0.304251517 */, 17 }, +/* 2823 */ { MAD_F(0x04decd95) /* 0.304395278 */, 17 }, +/* 2824 */ { MAD_F(0x04df6458) /* 0.304539056 */, 17 }, +/* 2825 */ { MAD_F(0x04dffb20) /* 0.304682850 */, 17 }, +/* 2826 */ { MAD_F(0x04e091ec) /* 0.304826662 */, 17 }, +/* 2827 */ { MAD_F(0x04e128bc) /* 0.304970491 */, 17 }, +/* 2828 */ { MAD_F(0x04e1bf92) /* 0.305114336 */, 17 }, +/* 2829 */ { MAD_F(0x04e2566b) /* 0.305258199 */, 17 }, +/* 2830 */ { MAD_F(0x04e2ed4a) /* 0.305402078 */, 17 }, +/* 2831 */ { MAD_F(0x04e3842d) /* 0.305545974 */, 17 }, + +/* 2832 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 17 }, +/* 2833 */ { MAD_F(0x04e4b200) /* 0.305833818 */, 17 }, +/* 2834 */ { MAD_F(0x04e548f1) /* 0.305977765 */, 17 }, +/* 2835 */ { MAD_F(0x04e5dfe6) /* 0.306121729 */, 17 }, +/* 2836 */ { MAD_F(0x04e676df) /* 0.306265710 */, 17 }, +/* 2837 */ { MAD_F(0x04e70dde) /* 0.306409708 */, 17 }, +/* 2838 */ { MAD_F(0x04e7a4e0) /* 0.306553723 */, 17 }, +/* 2839 */ { MAD_F(0x04e83be7) /* 0.306697755 */, 17 }, +/* 2840 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 17 }, +/* 2841 */ { MAD_F(0x04e96a04) /* 0.306985869 */, 17 }, +/* 2842 */ { MAD_F(0x04ea0118) /* 0.307129952 */, 17 }, +/* 2843 */ { MAD_F(0x04ea9832) /* 0.307274051 */, 17 }, +/* 2844 */ { MAD_F(0x04eb2f50) /* 0.307418168 */, 17 }, +/* 2845 */ { MAD_F(0x04ebc672) /* 0.307562301 */, 17 }, +/* 2846 */ { MAD_F(0x04ec5d99) /* 0.307706451 */, 17 }, +/* 2847 */ { MAD_F(0x04ecf4c5) /* 0.307850618 */, 17 }, + +/* 2848 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 17 }, +/* 2849 */ { MAD_F(0x04ee2329) /* 0.308139003 */, 17 }, +/* 2850 */ { MAD_F(0x04eeba63) /* 0.308283220 */, 17 }, +/* 2851 */ { MAD_F(0x04ef51a0) /* 0.308427455 */, 17 }, +/* 2852 */ { MAD_F(0x04efe8e2) /* 0.308571706 */, 17 }, +/* 2853 */ { MAD_F(0x04f08029) /* 0.308715974 */, 17 }, +/* 2854 */ { MAD_F(0x04f11774) /* 0.308860260 */, 17 }, +/* 2855 */ { MAD_F(0x04f1aec4) /* 0.309004561 */, 17 }, +/* 2856 */ { MAD_F(0x04f24618) /* 0.309148880 */, 17 }, +/* 2857 */ { MAD_F(0x04f2dd71) /* 0.309293216 */, 17 }, +/* 2858 */ { MAD_F(0x04f374cf) /* 0.309437568 */, 17 }, +/* 2859 */ { MAD_F(0x04f40c30) /* 0.309581938 */, 17 }, +/* 2860 */ { MAD_F(0x04f4a397) /* 0.309726324 */, 17 }, +/* 2861 */ { MAD_F(0x04f53b02) /* 0.309870727 */, 17 }, +/* 2862 */ { MAD_F(0x04f5d271) /* 0.310015147 */, 17 }, +/* 2863 */ { MAD_F(0x04f669e5) /* 0.310159583 */, 17 }, + +/* 2864 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 17 }, +/* 2865 */ { MAD_F(0x04f798da) /* 0.310448507 */, 17 }, +/* 2866 */ { MAD_F(0x04f8305c) /* 0.310592994 */, 17 }, +/* 2867 */ { MAD_F(0x04f8c7e2) /* 0.310737498 */, 17 }, +/* 2868 */ { MAD_F(0x04f95f6c) /* 0.310882018 */, 17 }, +/* 2869 */ { MAD_F(0x04f9f6fb) /* 0.311026556 */, 17 }, +/* 2870 */ { MAD_F(0x04fa8e8f) /* 0.311171110 */, 17 }, +/* 2871 */ { MAD_F(0x04fb2627) /* 0.311315681 */, 17 }, +/* 2872 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 17 }, +/* 2873 */ { MAD_F(0x04fc5564) /* 0.311604874 */, 17 }, +/* 2874 */ { MAD_F(0x04fced0a) /* 0.311749495 */, 17 }, +/* 2875 */ { MAD_F(0x04fd84b4) /* 0.311894133 */, 17 }, +/* 2876 */ { MAD_F(0x04fe1c62) /* 0.312038788 */, 17 }, +/* 2877 */ { MAD_F(0x04feb415) /* 0.312183460 */, 17 }, +/* 2878 */ { MAD_F(0x04ff4bcd) /* 0.312328148 */, 17 }, +/* 2879 */ { MAD_F(0x04ffe389) /* 0.312472854 */, 17 }, + +/* 2880 */ { MAD_F(0x05007b49) /* 0.312617576 */, 17 }, +/* 2881 */ { MAD_F(0x0501130e) /* 0.312762314 */, 17 }, +/* 2882 */ { MAD_F(0x0501aad8) /* 0.312907070 */, 17 }, +/* 2883 */ { MAD_F(0x050242a6) /* 0.313051842 */, 17 }, +/* 2884 */ { MAD_F(0x0502da78) /* 0.313196631 */, 17 }, +/* 2885 */ { MAD_F(0x0503724f) /* 0.313341437 */, 17 }, +/* 2886 */ { MAD_F(0x05040a2b) /* 0.313486259 */, 17 }, +/* 2887 */ { MAD_F(0x0504a20b) /* 0.313631098 */, 17 }, +/* 2888 */ { MAD_F(0x050539ef) /* 0.313775954 */, 17 }, +/* 2889 */ { MAD_F(0x0505d1d8) /* 0.313920827 */, 17 }, +/* 2890 */ { MAD_F(0x050669c5) /* 0.314065716 */, 17 }, +/* 2891 */ { MAD_F(0x050701b7) /* 0.314210622 */, 17 }, +/* 2892 */ { MAD_F(0x050799ae) /* 0.314355545 */, 17 }, +/* 2893 */ { MAD_F(0x050831a9) /* 0.314500484 */, 17 }, +/* 2894 */ { MAD_F(0x0508c9a8) /* 0.314645440 */, 17 }, +/* 2895 */ { MAD_F(0x050961ac) /* 0.314790413 */, 17 }, + +/* 2896 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 17 }, +/* 2897 */ { MAD_F(0x050a91c1) /* 0.315080409 */, 17 }, +/* 2898 */ { MAD_F(0x050b29d2) /* 0.315225432 */, 17 }, +/* 2899 */ { MAD_F(0x050bc1e8) /* 0.315370472 */, 17 }, +/* 2900 */ { MAD_F(0x050c5a02) /* 0.315515528 */, 17 }, +/* 2901 */ { MAD_F(0x050cf221) /* 0.315660601 */, 17 }, +/* 2902 */ { MAD_F(0x050d8a44) /* 0.315805690 */, 17 }, +/* 2903 */ { MAD_F(0x050e226c) /* 0.315950797 */, 17 }, +/* 2904 */ { MAD_F(0x050eba98) /* 0.316095920 */, 17 }, +/* 2905 */ { MAD_F(0x050f52c9) /* 0.316241059 */, 17 }, +/* 2906 */ { MAD_F(0x050feafe) /* 0.316386216 */, 17 }, +/* 2907 */ { MAD_F(0x05108337) /* 0.316531388 */, 17 }, +/* 2908 */ { MAD_F(0x05111b75) /* 0.316676578 */, 17 }, +/* 2909 */ { MAD_F(0x0511b3b8) /* 0.316821784 */, 17 }, +/* 2910 */ { MAD_F(0x05124bff) /* 0.316967007 */, 17 }, +/* 2911 */ { MAD_F(0x0512e44a) /* 0.317112247 */, 17 }, + +/* 2912 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 17 }, +/* 2913 */ { MAD_F(0x051414ee) /* 0.317402775 */, 17 }, +/* 2914 */ { MAD_F(0x0514ad47) /* 0.317548065 */, 17 }, +/* 2915 */ { MAD_F(0x051545a5) /* 0.317693371 */, 17 }, +/* 2916 */ { MAD_F(0x0515de06) /* 0.317838693 */, 17 }, +/* 2917 */ { MAD_F(0x0516766d) /* 0.317984033 */, 17 }, +/* 2918 */ { MAD_F(0x05170ed7) /* 0.318129388 */, 17 }, +/* 2919 */ { MAD_F(0x0517a746) /* 0.318274761 */, 17 }, +/* 2920 */ { MAD_F(0x05183fba) /* 0.318420150 */, 17 }, +/* 2921 */ { MAD_F(0x0518d832) /* 0.318565555 */, 17 }, +/* 2922 */ { MAD_F(0x051970ae) /* 0.318710978 */, 17 }, +/* 2923 */ { MAD_F(0x051a092f) /* 0.318856416 */, 17 }, +/* 2924 */ { MAD_F(0x051aa1b5) /* 0.319001872 */, 17 }, +/* 2925 */ { MAD_F(0x051b3a3f) /* 0.319147344 */, 17 }, +/* 2926 */ { MAD_F(0x051bd2cd) /* 0.319292832 */, 17 }, +/* 2927 */ { MAD_F(0x051c6b60) /* 0.319438338 */, 17 }, + +/* 2928 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 17 }, +/* 2929 */ { MAD_F(0x051d9c92) /* 0.319729398 */, 17 }, +/* 2930 */ { MAD_F(0x051e3532) /* 0.319874952 */, 17 }, +/* 2931 */ { MAD_F(0x051ecdd7) /* 0.320020524 */, 17 }, +/* 2932 */ { MAD_F(0x051f6680) /* 0.320166112 */, 17 }, +/* 2933 */ { MAD_F(0x051fff2d) /* 0.320311716 */, 17 }, +/* 2934 */ { MAD_F(0x052097df) /* 0.320457337 */, 17 }, +/* 2935 */ { MAD_F(0x05213095) /* 0.320602975 */, 17 }, +/* 2936 */ { MAD_F(0x0521c950) /* 0.320748629 */, 17 }, +/* 2937 */ { MAD_F(0x0522620f) /* 0.320894300 */, 17 }, +/* 2938 */ { MAD_F(0x0522fad3) /* 0.321039987 */, 17 }, +/* 2939 */ { MAD_F(0x0523939b) /* 0.321185691 */, 17 }, +/* 2940 */ { MAD_F(0x05242c68) /* 0.321331411 */, 17 }, +/* 2941 */ { MAD_F(0x0524c538) /* 0.321477148 */, 17 }, +/* 2942 */ { MAD_F(0x05255e0e) /* 0.321622901 */, 17 }, +/* 2943 */ { MAD_F(0x0525f6e8) /* 0.321768671 */, 17 }, + +/* 2944 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 17 }, +/* 2945 */ { MAD_F(0x052728a9) /* 0.322060260 */, 17 }, +/* 2946 */ { MAD_F(0x0527c190) /* 0.322206079 */, 17 }, +/* 2947 */ { MAD_F(0x05285a7b) /* 0.322351915 */, 17 }, +/* 2948 */ { MAD_F(0x0528f36b) /* 0.322497768 */, 17 }, +/* 2949 */ { MAD_F(0x05298c5f) /* 0.322643636 */, 17 }, +/* 2950 */ { MAD_F(0x052a2558) /* 0.322789522 */, 17 }, +/* 2951 */ { MAD_F(0x052abe55) /* 0.322935424 */, 17 }, +/* 2952 */ { MAD_F(0x052b5757) /* 0.323081342 */, 17 }, +/* 2953 */ { MAD_F(0x052bf05d) /* 0.323227277 */, 17 }, +/* 2954 */ { MAD_F(0x052c8968) /* 0.323373228 */, 17 }, +/* 2955 */ { MAD_F(0x052d2277) /* 0.323519196 */, 17 }, +/* 2956 */ { MAD_F(0x052dbb8a) /* 0.323665180 */, 17 }, +/* 2957 */ { MAD_F(0x052e54a2) /* 0.323811180 */, 17 }, +/* 2958 */ { MAD_F(0x052eedbe) /* 0.323957197 */, 17 }, +/* 2959 */ { MAD_F(0x052f86de) /* 0.324103231 */, 17 }, + +/* 2960 */ { MAD_F(0x05302003) /* 0.324249281 */, 17 }, +/* 2961 */ { MAD_F(0x0530b92d) /* 0.324395347 */, 17 }, +/* 2962 */ { MAD_F(0x0531525b) /* 0.324541430 */, 17 }, +/* 2963 */ { MAD_F(0x0531eb8d) /* 0.324687530 */, 17 }, +/* 2964 */ { MAD_F(0x053284c4) /* 0.324833646 */, 17 }, +/* 2965 */ { MAD_F(0x05331dff) /* 0.324979778 */, 17 }, +/* 2966 */ { MAD_F(0x0533b73e) /* 0.325125926 */, 17 }, +/* 2967 */ { MAD_F(0x05345082) /* 0.325272091 */, 17 }, +/* 2968 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 17 }, +/* 2969 */ { MAD_F(0x05358317) /* 0.325564471 */, 17 }, +/* 2970 */ { MAD_F(0x05361c68) /* 0.325710685 */, 17 }, +/* 2971 */ { MAD_F(0x0536b5be) /* 0.325856916 */, 17 }, +/* 2972 */ { MAD_F(0x05374f17) /* 0.326003163 */, 17 }, +/* 2973 */ { MAD_F(0x0537e876) /* 0.326149427 */, 17 }, +/* 2974 */ { MAD_F(0x053881d9) /* 0.326295707 */, 17 }, +/* 2975 */ { MAD_F(0x05391b40) /* 0.326442003 */, 17 }, + +/* 2976 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 17 }, +/* 2977 */ { MAD_F(0x053a4e1b) /* 0.326734645 */, 17 }, +/* 2978 */ { MAD_F(0x053ae78f) /* 0.326880990 */, 17 }, +/* 2979 */ { MAD_F(0x053b8108) /* 0.327027352 */, 17 }, +/* 2980 */ { MAD_F(0x053c1a85) /* 0.327173730 */, 17 }, +/* 2981 */ { MAD_F(0x053cb407) /* 0.327320125 */, 17 }, +/* 2982 */ { MAD_F(0x053d4d8d) /* 0.327466536 */, 17 }, +/* 2983 */ { MAD_F(0x053de717) /* 0.327612963 */, 17 }, +/* 2984 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 17 }, +/* 2985 */ { MAD_F(0x053f1a39) /* 0.327905867 */, 17 }, +/* 2986 */ { MAD_F(0x053fb3d0) /* 0.328052344 */, 17 }, +/* 2987 */ { MAD_F(0x05404d6c) /* 0.328198837 */, 17 }, +/* 2988 */ { MAD_F(0x0540e70c) /* 0.328345346 */, 17 }, +/* 2989 */ { MAD_F(0x054180b1) /* 0.328491871 */, 17 }, +/* 2990 */ { MAD_F(0x05421a5a) /* 0.328638413 */, 17 }, +/* 2991 */ { MAD_F(0x0542b407) /* 0.328784971 */, 17 }, + +/* 2992 */ { MAD_F(0x05434db9) /* 0.328931546 */, 17 }, +/* 2993 */ { MAD_F(0x0543e76f) /* 0.329078137 */, 17 }, +/* 2994 */ { MAD_F(0x0544812a) /* 0.329224744 */, 17 }, +/* 2995 */ { MAD_F(0x05451ae9) /* 0.329371367 */, 17 }, +/* 2996 */ { MAD_F(0x0545b4ac) /* 0.329518007 */, 17 }, +/* 2997 */ { MAD_F(0x05464e74) /* 0.329664663 */, 17 }, +/* 2998 */ { MAD_F(0x0546e840) /* 0.329811336 */, 17 }, +/* 2999 */ { MAD_F(0x05478211) /* 0.329958024 */, 17 }, +/* 3000 */ { MAD_F(0x05481be5) /* 0.330104730 */, 17 }, +/* 3001 */ { MAD_F(0x0548b5bf) /* 0.330251451 */, 17 }, +/* 3002 */ { MAD_F(0x05494f9c) /* 0.330398189 */, 17 }, +/* 3003 */ { MAD_F(0x0549e97e) /* 0.330544943 */, 17 }, +/* 3004 */ { MAD_F(0x054a8364) /* 0.330691713 */, 17 }, +/* 3005 */ { MAD_F(0x054b1d4f) /* 0.330838499 */, 17 }, +/* 3006 */ { MAD_F(0x054bb73e) /* 0.330985302 */, 17 }, +/* 3007 */ { MAD_F(0x054c5132) /* 0.331132121 */, 17 }, + +/* 3008 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 17 }, +/* 3009 */ { MAD_F(0x054d8526) /* 0.331425808 */, 17 }, +/* 3010 */ { MAD_F(0x054e1f26) /* 0.331572676 */, 17 }, +/* 3011 */ { MAD_F(0x054eb92b) /* 0.331719560 */, 17 }, +/* 3012 */ { MAD_F(0x054f5334) /* 0.331866461 */, 17 }, +/* 3013 */ { MAD_F(0x054fed42) /* 0.332013377 */, 17 }, +/* 3014 */ { MAD_F(0x05508754) /* 0.332160310 */, 17 }, +/* 3015 */ { MAD_F(0x0551216b) /* 0.332307260 */, 17 }, +/* 3016 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 17 }, +/* 3017 */ { MAD_F(0x055255a4) /* 0.332601207 */, 17 }, +/* 3018 */ { MAD_F(0x0552efc8) /* 0.332748205 */, 17 }, +/* 3019 */ { MAD_F(0x055389f0) /* 0.332895219 */, 17 }, +/* 3020 */ { MAD_F(0x0554241c) /* 0.333042249 */, 17 }, +/* 3021 */ { MAD_F(0x0554be4c) /* 0.333189296 */, 17 }, +/* 3022 */ { MAD_F(0x05555881) /* 0.333336359 */, 17 }, +/* 3023 */ { MAD_F(0x0555f2ba) /* 0.333483438 */, 17 }, + +/* 3024 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 17 }, +/* 3025 */ { MAD_F(0x0557273a) /* 0.333777645 */, 17 }, +/* 3026 */ { MAD_F(0x0557c180) /* 0.333924772 */, 17 }, +/* 3027 */ { MAD_F(0x05585bcb) /* 0.334071916 */, 17 }, +/* 3028 */ { MAD_F(0x0558f61a) /* 0.334219076 */, 17 }, +/* 3029 */ { MAD_F(0x0559906d) /* 0.334366253 */, 17 }, +/* 3030 */ { MAD_F(0x055a2ac5) /* 0.334513445 */, 17 }, +/* 3031 */ { MAD_F(0x055ac521) /* 0.334660654 */, 17 }, +/* 3032 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 17 }, +/* 3033 */ { MAD_F(0x055bf9e6) /* 0.334955120 */, 17 }, +/* 3034 */ { MAD_F(0x055c944f) /* 0.335102377 */, 17 }, +/* 3035 */ { MAD_F(0x055d2ebd) /* 0.335249651 */, 17 }, +/* 3036 */ { MAD_F(0x055dc92e) /* 0.335396941 */, 17 }, +/* 3037 */ { MAD_F(0x055e63a5) /* 0.335544246 */, 17 }, +/* 3038 */ { MAD_F(0x055efe1f) /* 0.335691568 */, 17 }, +/* 3039 */ { MAD_F(0x055f989e) /* 0.335838906 */, 17 }, + +/* 3040 */ { MAD_F(0x05603321) /* 0.335986261 */, 17 }, +/* 3041 */ { MAD_F(0x0560cda8) /* 0.336133631 */, 17 }, +/* 3042 */ { MAD_F(0x05616834) /* 0.336281018 */, 17 }, +/* 3043 */ { MAD_F(0x056202c4) /* 0.336428421 */, 17 }, +/* 3044 */ { MAD_F(0x05629d59) /* 0.336575840 */, 17 }, +/* 3045 */ { MAD_F(0x056337f2) /* 0.336723275 */, 17 }, +/* 3046 */ { MAD_F(0x0563d28f) /* 0.336870726 */, 17 }, +/* 3047 */ { MAD_F(0x05646d30) /* 0.337018193 */, 17 }, +/* 3048 */ { MAD_F(0x056507d6) /* 0.337165677 */, 17 }, +/* 3049 */ { MAD_F(0x0565a280) /* 0.337313176 */, 17 }, +/* 3050 */ { MAD_F(0x05663d2f) /* 0.337460692 */, 17 }, +/* 3051 */ { MAD_F(0x0566d7e1) /* 0.337608224 */, 17 }, +/* 3052 */ { MAD_F(0x05677298) /* 0.337755772 */, 17 }, +/* 3053 */ { MAD_F(0x05680d54) /* 0.337903336 */, 17 }, +/* 3054 */ { MAD_F(0x0568a814) /* 0.338050916 */, 17 }, +/* 3055 */ { MAD_F(0x056942d8) /* 0.338198513 */, 17 }, + +/* 3056 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 17 }, +/* 3057 */ { MAD_F(0x056a786d) /* 0.338493753 */, 17 }, +/* 3058 */ { MAD_F(0x056b133e) /* 0.338641398 */, 17 }, +/* 3059 */ { MAD_F(0x056bae13) /* 0.338789059 */, 17 }, +/* 3060 */ { MAD_F(0x056c48ed) /* 0.338936736 */, 17 }, +/* 3061 */ { MAD_F(0x056ce3cb) /* 0.339084429 */, 17 }, +/* 3062 */ { MAD_F(0x056d7ead) /* 0.339232138 */, 17 }, +/* 3063 */ { MAD_F(0x056e1994) /* 0.339379863 */, 17 }, +/* 3064 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 17 }, +/* 3065 */ { MAD_F(0x056f4f6e) /* 0.339675361 */, 17 }, +/* 3066 */ { MAD_F(0x056fea62) /* 0.339823134 */, 17 }, +/* 3067 */ { MAD_F(0x0570855a) /* 0.339970924 */, 17 }, +/* 3068 */ { MAD_F(0x05712056) /* 0.340118729 */, 17 }, +/* 3069 */ { MAD_F(0x0571bb56) /* 0.340266550 */, 17 }, +/* 3070 */ { MAD_F(0x0572565b) /* 0.340414388 */, 17 }, +/* 3071 */ { MAD_F(0x0572f164) /* 0.340562242 */, 17 }, + +/* 3072 */ { MAD_F(0x05738c72) /* 0.340710111 */, 17 }, +/* 3073 */ { MAD_F(0x05742784) /* 0.340857997 */, 17 }, +/* 3074 */ { MAD_F(0x0574c29a) /* 0.341005899 */, 17 }, +/* 3075 */ { MAD_F(0x05755db4) /* 0.341153816 */, 17 }, +/* 3076 */ { MAD_F(0x0575f8d3) /* 0.341301750 */, 17 }, +/* 3077 */ { MAD_F(0x057693f6) /* 0.341449700 */, 17 }, +/* 3078 */ { MAD_F(0x05772f1d) /* 0.341597666 */, 17 }, +/* 3079 */ { MAD_F(0x0577ca49) /* 0.341745648 */, 17 }, +/* 3080 */ { MAD_F(0x05786578) /* 0.341893646 */, 17 }, +/* 3081 */ { MAD_F(0x057900ad) /* 0.342041659 */, 17 }, +/* 3082 */ { MAD_F(0x05799be5) /* 0.342189689 */, 17 }, +/* 3083 */ { MAD_F(0x057a3722) /* 0.342337735 */, 17 }, +/* 3084 */ { MAD_F(0x057ad263) /* 0.342485797 */, 17 }, +/* 3085 */ { MAD_F(0x057b6da8) /* 0.342633875 */, 17 }, +/* 3086 */ { MAD_F(0x057c08f2) /* 0.342781969 */, 17 }, +/* 3087 */ { MAD_F(0x057ca440) /* 0.342930079 */, 17 }, + +/* 3088 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 17 }, +/* 3089 */ { MAD_F(0x057ddae9) /* 0.343226347 */, 17 }, +/* 3090 */ { MAD_F(0x057e7644) /* 0.343374505 */, 17 }, +/* 3091 */ { MAD_F(0x057f11a3) /* 0.343522679 */, 17 }, +/* 3092 */ { MAD_F(0x057fad06) /* 0.343670869 */, 17 }, +/* 3093 */ { MAD_F(0x0580486e) /* 0.343819075 */, 17 }, +/* 3094 */ { MAD_F(0x0580e3da) /* 0.343967296 */, 17 }, +/* 3095 */ { MAD_F(0x05817f4a) /* 0.344115534 */, 17 }, +/* 3096 */ { MAD_F(0x05821abf) /* 0.344263788 */, 17 }, +/* 3097 */ { MAD_F(0x0582b638) /* 0.344412058 */, 17 }, +/* 3098 */ { MAD_F(0x058351b5) /* 0.344560343 */, 17 }, +/* 3099 */ { MAD_F(0x0583ed36) /* 0.344708645 */, 17 }, +/* 3100 */ { MAD_F(0x058488bc) /* 0.344856963 */, 17 }, +/* 3101 */ { MAD_F(0x05852446) /* 0.345005296 */, 17 }, +/* 3102 */ { MAD_F(0x0585bfd4) /* 0.345153646 */, 17 }, +/* 3103 */ { MAD_F(0x05865b67) /* 0.345302011 */, 17 }, + +/* 3104 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 17 }, +/* 3105 */ { MAD_F(0x05879298) /* 0.345598790 */, 17 }, +/* 3106 */ { MAD_F(0x05882e38) /* 0.345747203 */, 17 }, +/* 3107 */ { MAD_F(0x0588c9dc) /* 0.345895632 */, 17 }, +/* 3108 */ { MAD_F(0x05896583) /* 0.346044077 */, 17 }, +/* 3109 */ { MAD_F(0x058a0130) /* 0.346192538 */, 17 }, +/* 3110 */ { MAD_F(0x058a9ce0) /* 0.346341015 */, 17 }, +/* 3111 */ { MAD_F(0x058b3895) /* 0.346489508 */, 17 }, +/* 3112 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 17 }, +/* 3113 */ { MAD_F(0x058c700b) /* 0.346786542 */, 17 }, +/* 3114 */ { MAD_F(0x058d0bcd) /* 0.346935082 */, 17 }, +/* 3115 */ { MAD_F(0x058da793) /* 0.347083639 */, 17 }, +/* 3116 */ { MAD_F(0x058e435d) /* 0.347232211 */, 17 }, +/* 3117 */ { MAD_F(0x058edf2b) /* 0.347380799 */, 17 }, +/* 3118 */ { MAD_F(0x058f7afe) /* 0.347529403 */, 17 }, +/* 3119 */ { MAD_F(0x059016d5) /* 0.347678023 */, 17 }, + +/* 3120 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 17 }, +/* 3121 */ { MAD_F(0x05914e8f) /* 0.347975311 */, 17 }, +/* 3122 */ { MAD_F(0x0591ea73) /* 0.348123979 */, 17 }, +/* 3123 */ { MAD_F(0x0592865b) /* 0.348272662 */, 17 }, +/* 3124 */ { MAD_F(0x05932247) /* 0.348421362 */, 17 }, +/* 3125 */ { MAD_F(0x0593be37) /* 0.348570077 */, 17 }, +/* 3126 */ { MAD_F(0x05945a2c) /* 0.348718808 */, 17 }, +/* 3127 */ { MAD_F(0x0594f625) /* 0.348867555 */, 17 }, +/* 3128 */ { MAD_F(0x05959222) /* 0.349016318 */, 17 }, +/* 3129 */ { MAD_F(0x05962e24) /* 0.349165097 */, 17 }, +/* 3130 */ { MAD_F(0x0596ca2a) /* 0.349313892 */, 17 }, +/* 3131 */ { MAD_F(0x05976634) /* 0.349462702 */, 17 }, +/* 3132 */ { MAD_F(0x05980242) /* 0.349611528 */, 17 }, +/* 3133 */ { MAD_F(0x05989e54) /* 0.349760370 */, 17 }, +/* 3134 */ { MAD_F(0x05993a6b) /* 0.349909228 */, 17 }, +/* 3135 */ { MAD_F(0x0599d686) /* 0.350058102 */, 17 }, + +/* 3136 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 17 }, +/* 3137 */ { MAD_F(0x059b0ec9) /* 0.350355897 */, 17 }, +/* 3138 */ { MAD_F(0x059baaf1) /* 0.350504818 */, 17 }, +/* 3139 */ { MAD_F(0x059c471d) /* 0.350653756 */, 17 }, +/* 3140 */ { MAD_F(0x059ce34d) /* 0.350802708 */, 17 }, +/* 3141 */ { MAD_F(0x059d7f81) /* 0.350951677 */, 17 }, +/* 3142 */ { MAD_F(0x059e1bba) /* 0.351100662 */, 17 }, +/* 3143 */ { MAD_F(0x059eb7f7) /* 0.351249662 */, 17 }, +/* 3144 */ { MAD_F(0x059f5438) /* 0.351398678 */, 17 }, +/* 3145 */ { MAD_F(0x059ff07e) /* 0.351547710 */, 17 }, +/* 3146 */ { MAD_F(0x05a08cc7) /* 0.351696758 */, 17 }, +/* 3147 */ { MAD_F(0x05a12915) /* 0.351845821 */, 17 }, +/* 3148 */ { MAD_F(0x05a1c567) /* 0.351994901 */, 17 }, +/* 3149 */ { MAD_F(0x05a261be) /* 0.352143996 */, 17 }, +/* 3150 */ { MAD_F(0x05a2fe18) /* 0.352293107 */, 17 }, +/* 3151 */ { MAD_F(0x05a39a77) /* 0.352442233 */, 17 }, + +/* 3152 */ { MAD_F(0x05a436da) /* 0.352591376 */, 17 }, +/* 3153 */ { MAD_F(0x05a4d342) /* 0.352740534 */, 17 }, +/* 3154 */ { MAD_F(0x05a56fad) /* 0.352889708 */, 17 }, +/* 3155 */ { MAD_F(0x05a60c1d) /* 0.353038898 */, 17 }, +/* 3156 */ { MAD_F(0x05a6a891) /* 0.353188103 */, 17 }, +/* 3157 */ { MAD_F(0x05a7450a) /* 0.353337325 */, 17 }, +/* 3158 */ { MAD_F(0x05a7e186) /* 0.353486562 */, 17 }, +/* 3159 */ { MAD_F(0x05a87e07) /* 0.353635814 */, 17 }, +/* 3160 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 17 }, +/* 3161 */ { MAD_F(0x05a9b715) /* 0.353934367 */, 17 }, +/* 3162 */ { MAD_F(0x05aa53a2) /* 0.354083667 */, 17 }, +/* 3163 */ { MAD_F(0x05aaf034) /* 0.354232983 */, 17 }, +/* 3164 */ { MAD_F(0x05ab8cca) /* 0.354382314 */, 17 }, +/* 3165 */ { MAD_F(0x05ac2964) /* 0.354531662 */, 17 }, +/* 3166 */ { MAD_F(0x05acc602) /* 0.354681025 */, 17 }, +/* 3167 */ { MAD_F(0x05ad62a5) /* 0.354830403 */, 17 }, + +/* 3168 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 17 }, +/* 3169 */ { MAD_F(0x05ae9bf7) /* 0.355129208 */, 17 }, +/* 3170 */ { MAD_F(0x05af38a6) /* 0.355278634 */, 17 }, +/* 3171 */ { MAD_F(0x05afd559) /* 0.355428075 */, 17 }, +/* 3172 */ { MAD_F(0x05b07211) /* 0.355577533 */, 17 }, +/* 3173 */ { MAD_F(0x05b10ecd) /* 0.355727006 */, 17 }, +/* 3174 */ { MAD_F(0x05b1ab8d) /* 0.355876494 */, 17 }, +/* 3175 */ { MAD_F(0x05b24851) /* 0.356025999 */, 17 }, +/* 3176 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 17 }, +/* 3177 */ { MAD_F(0x05b381e6) /* 0.356325054 */, 17 }, +/* 3178 */ { MAD_F(0x05b41eb7) /* 0.356474606 */, 17 }, +/* 3179 */ { MAD_F(0x05b4bb8c) /* 0.356624173 */, 17 }, +/* 3180 */ { MAD_F(0x05b55866) /* 0.356773756 */, 17 }, +/* 3181 */ { MAD_F(0x05b5f543) /* 0.356923354 */, 17 }, +/* 3182 */ { MAD_F(0x05b69225) /* 0.357072969 */, 17 }, +/* 3183 */ { MAD_F(0x05b72f0b) /* 0.357222598 */, 17 }, + +/* 3184 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 17 }, +/* 3185 */ { MAD_F(0x05b868e3) /* 0.357521905 */, 17 }, +/* 3186 */ { MAD_F(0x05b905d6) /* 0.357671582 */, 17 }, +/* 3187 */ { MAD_F(0x05b9a2cd) /* 0.357821275 */, 17 }, +/* 3188 */ { MAD_F(0x05ba3fc8) /* 0.357970983 */, 17 }, +/* 3189 */ { MAD_F(0x05badcc7) /* 0.358120707 */, 17 }, +/* 3190 */ { MAD_F(0x05bb79ca) /* 0.358270446 */, 17 }, +/* 3191 */ { MAD_F(0x05bc16d2) /* 0.358420201 */, 17 }, +/* 3192 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 17 }, +/* 3193 */ { MAD_F(0x05bd50ee) /* 0.358719758 */, 17 }, +/* 3194 */ { MAD_F(0x05bdee02) /* 0.358869560 */, 17 }, +/* 3195 */ { MAD_F(0x05be8b1a) /* 0.359019378 */, 17 }, +/* 3196 */ { MAD_F(0x05bf2837) /* 0.359169211 */, 17 }, +/* 3197 */ { MAD_F(0x05bfc558) /* 0.359319060 */, 17 }, +/* 3198 */ { MAD_F(0x05c0627d) /* 0.359468925 */, 17 }, +/* 3199 */ { MAD_F(0x05c0ffa6) /* 0.359618805 */, 17 }, + +/* 3200 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 17 }, +/* 3201 */ { MAD_F(0x05c23a05) /* 0.359918612 */, 17 }, +/* 3202 */ { MAD_F(0x05c2d73a) /* 0.360068540 */, 17 }, +/* 3203 */ { MAD_F(0x05c37474) /* 0.360218482 */, 17 }, +/* 3204 */ { MAD_F(0x05c411b2) /* 0.360368440 */, 17 }, +/* 3205 */ { MAD_F(0x05c4aef5) /* 0.360518414 */, 17 }, +/* 3206 */ { MAD_F(0x05c54c3b) /* 0.360668404 */, 17 }, +/* 3207 */ { MAD_F(0x05c5e986) /* 0.360818409 */, 17 }, +/* 3208 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 17 }, +/* 3209 */ { MAD_F(0x05c72428) /* 0.361118466 */, 17 }, +/* 3210 */ { MAD_F(0x05c7c17f) /* 0.361268517 */, 17 }, +/* 3211 */ { MAD_F(0x05c85eda) /* 0.361418585 */, 17 }, +/* 3212 */ { MAD_F(0x05c8fc3a) /* 0.361568668 */, 17 }, +/* 3213 */ { MAD_F(0x05c9999e) /* 0.361718766 */, 17 }, +/* 3214 */ { MAD_F(0x05ca3706) /* 0.361868881 */, 17 }, +/* 3215 */ { MAD_F(0x05cad472) /* 0.362019010 */, 17 }, + +/* 3216 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 17 }, +/* 3217 */ { MAD_F(0x05cc0f57) /* 0.362319316 */, 17 }, +/* 3218 */ { MAD_F(0x05ccaccf) /* 0.362469493 */, 17 }, +/* 3219 */ { MAD_F(0x05cd4a4c) /* 0.362619685 */, 17 }, +/* 3220 */ { MAD_F(0x05cde7cd) /* 0.362769892 */, 17 }, +/* 3221 */ { MAD_F(0x05ce8552) /* 0.362920115 */, 17 }, +/* 3222 */ { MAD_F(0x05cf22dc) /* 0.363070354 */, 17 }, +/* 3223 */ { MAD_F(0x05cfc069) /* 0.363220608 */, 17 }, +/* 3224 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 17 }, +/* 3225 */ { MAD_F(0x05d0fb91) /* 0.363521163 */, 17 }, +/* 3226 */ { MAD_F(0x05d1992b) /* 0.363671464 */, 17 }, +/* 3227 */ { MAD_F(0x05d236c9) /* 0.363821780 */, 17 }, +/* 3228 */ { MAD_F(0x05d2d46c) /* 0.363972112 */, 17 }, +/* 3229 */ { MAD_F(0x05d37212) /* 0.364122459 */, 17 }, +/* 3230 */ { MAD_F(0x05d40fbd) /* 0.364272822 */, 17 }, +/* 3231 */ { MAD_F(0x05d4ad6c) /* 0.364423200 */, 17 }, + +/* 3232 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 17 }, +/* 3233 */ { MAD_F(0x05d5e8d6) /* 0.364724004 */, 17 }, +/* 3234 */ { MAD_F(0x05d68691) /* 0.364874429 */, 17 }, +/* 3235 */ { MAD_F(0x05d72451) /* 0.365024869 */, 17 }, +/* 3236 */ { MAD_F(0x05d7c215) /* 0.365175325 */, 17 }, +/* 3237 */ { MAD_F(0x05d85fdc) /* 0.365325796 */, 17 }, +/* 3238 */ { MAD_F(0x05d8fda8) /* 0.365476283 */, 17 }, +/* 3239 */ { MAD_F(0x05d99b79) /* 0.365626786 */, 17 }, +/* 3240 */ { MAD_F(0x05da394d) /* 0.365777304 */, 17 }, +/* 3241 */ { MAD_F(0x05dad726) /* 0.365927837 */, 17 }, +/* 3242 */ { MAD_F(0x05db7502) /* 0.366078386 */, 17 }, +/* 3243 */ { MAD_F(0x05dc12e3) /* 0.366228950 */, 17 }, +/* 3244 */ { MAD_F(0x05dcb0c8) /* 0.366379530 */, 17 }, +/* 3245 */ { MAD_F(0x05dd4eb1) /* 0.366530125 */, 17 }, +/* 3246 */ { MAD_F(0x05ddec9e) /* 0.366680736 */, 17 }, +/* 3247 */ { MAD_F(0x05de8a90) /* 0.366831362 */, 17 }, + +/* 3248 */ { MAD_F(0x05df2885) /* 0.366982004 */, 17 }, +/* 3249 */ { MAD_F(0x05dfc67f) /* 0.367132661 */, 17 }, +/* 3250 */ { MAD_F(0x05e0647d) /* 0.367283334 */, 17 }, +/* 3251 */ { MAD_F(0x05e1027f) /* 0.367434022 */, 17 }, +/* 3252 */ { MAD_F(0x05e1a085) /* 0.367584725 */, 17 }, +/* 3253 */ { MAD_F(0x05e23e8f) /* 0.367735444 */, 17 }, +/* 3254 */ { MAD_F(0x05e2dc9e) /* 0.367886179 */, 17 }, +/* 3255 */ { MAD_F(0x05e37ab0) /* 0.368036929 */, 17 }, +/* 3256 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 17 }, +/* 3257 */ { MAD_F(0x05e4b6e2) /* 0.368338475 */, 17 }, +/* 3258 */ { MAD_F(0x05e55501) /* 0.368489271 */, 17 }, +/* 3259 */ { MAD_F(0x05e5f324) /* 0.368640082 */, 17 }, +/* 3260 */ { MAD_F(0x05e6914c) /* 0.368790909 */, 17 }, +/* 3261 */ { MAD_F(0x05e72f77) /* 0.368941752 */, 17 }, +/* 3262 */ { MAD_F(0x05e7cda7) /* 0.369092610 */, 17 }, +/* 3263 */ { MAD_F(0x05e86bda) /* 0.369243483 */, 17 }, + +/* 3264 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 17 }, +/* 3265 */ { MAD_F(0x05e9a84e) /* 0.369545276 */, 17 }, +/* 3266 */ { MAD_F(0x05ea468e) /* 0.369696195 */, 17 }, +/* 3267 */ { MAD_F(0x05eae4d3) /* 0.369847130 */, 17 }, +/* 3268 */ { MAD_F(0x05eb831b) /* 0.369998080 */, 17 }, +/* 3269 */ { MAD_F(0x05ec2168) /* 0.370149046 */, 17 }, +/* 3270 */ { MAD_F(0x05ecbfb8) /* 0.370300027 */, 17 }, +/* 3271 */ { MAD_F(0x05ed5e0d) /* 0.370451024 */, 17 }, +/* 3272 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 17 }, +/* 3273 */ { MAD_F(0x05ee9ac3) /* 0.370753063 */, 17 }, +/* 3274 */ { MAD_F(0x05ef3924) /* 0.370904105 */, 17 }, +/* 3275 */ { MAD_F(0x05efd78a) /* 0.371055163 */, 17 }, +/* 3276 */ { MAD_F(0x05f075f3) /* 0.371206237 */, 17 }, +/* 3277 */ { MAD_F(0x05f11461) /* 0.371357326 */, 17 }, +/* 3278 */ { MAD_F(0x05f1b2d3) /* 0.371508430 */, 17 }, +/* 3279 */ { MAD_F(0x05f25148) /* 0.371659549 */, 17 }, + +/* 3280 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 17 }, +/* 3281 */ { MAD_F(0x05f38e40) /* 0.371961834 */, 17 }, +/* 3282 */ { MAD_F(0x05f42cc3) /* 0.372113000 */, 17 }, +/* 3283 */ { MAD_F(0x05f4cb49) /* 0.372264181 */, 17 }, +/* 3284 */ { MAD_F(0x05f569d3) /* 0.372415377 */, 17 }, +/* 3285 */ { MAD_F(0x05f60862) /* 0.372566589 */, 17 }, +/* 3286 */ { MAD_F(0x05f6a6f5) /* 0.372717816 */, 17 }, +/* 3287 */ { MAD_F(0x05f7458b) /* 0.372869058 */, 17 }, +/* 3288 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 17 }, +/* 3289 */ { MAD_F(0x05f882c5) /* 0.373171589 */, 17 }, +/* 3290 */ { MAD_F(0x05f92169) /* 0.373322877 */, 17 }, +/* 3291 */ { MAD_F(0x05f9c010) /* 0.373474181 */, 17 }, +/* 3292 */ { MAD_F(0x05fa5ebb) /* 0.373625500 */, 17 }, +/* 3293 */ { MAD_F(0x05fafd6b) /* 0.373776834 */, 17 }, +/* 3294 */ { MAD_F(0x05fb9c1e) /* 0.373928184 */, 17 }, +/* 3295 */ { MAD_F(0x05fc3ad6) /* 0.374079549 */, 17 }, + +/* 3296 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 17 }, +/* 3297 */ { MAD_F(0x05fd7852) /* 0.374382325 */, 17 }, +/* 3298 */ { MAD_F(0x05fe1716) /* 0.374533735 */, 17 }, +/* 3299 */ { MAD_F(0x05feb5de) /* 0.374685162 */, 17 }, +/* 3300 */ { MAD_F(0x05ff54aa) /* 0.374836603 */, 17 }, +/* 3301 */ { MAD_F(0x05fff37b) /* 0.374988060 */, 17 }, +/* 3302 */ { MAD_F(0x0600924f) /* 0.375139532 */, 17 }, +/* 3303 */ { MAD_F(0x06013128) /* 0.375291019 */, 17 }, +/* 3304 */ { MAD_F(0x0601d004) /* 0.375442522 */, 17 }, +/* 3305 */ { MAD_F(0x06026ee5) /* 0.375594040 */, 17 }, +/* 3306 */ { MAD_F(0x06030dca) /* 0.375745573 */, 17 }, +/* 3307 */ { MAD_F(0x0603acb3) /* 0.375897122 */, 17 }, +/* 3308 */ { MAD_F(0x06044ba0) /* 0.376048685 */, 17 }, +/* 3309 */ { MAD_F(0x0604ea91) /* 0.376200265 */, 17 }, +/* 3310 */ { MAD_F(0x06058987) /* 0.376351859 */, 17 }, +/* 3311 */ { MAD_F(0x06062880) /* 0.376503468 */, 17 }, + +/* 3312 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 17 }, +/* 3313 */ { MAD_F(0x0607667f) /* 0.376806733 */, 17 }, +/* 3314 */ { MAD_F(0x06080585) /* 0.376958389 */, 17 }, +/* 3315 */ { MAD_F(0x0608a48f) /* 0.377110059 */, 17 }, +/* 3316 */ { MAD_F(0x0609439c) /* 0.377261745 */, 17 }, +/* 3317 */ { MAD_F(0x0609e2ae) /* 0.377413446 */, 17 }, +/* 3318 */ { MAD_F(0x060a81c4) /* 0.377565163 */, 17 }, +/* 3319 */ { MAD_F(0x060b20df) /* 0.377716894 */, 17 }, +/* 3320 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 17 }, +/* 3321 */ { MAD_F(0x060c5f1f) /* 0.378020403 */, 17 }, +/* 3322 */ { MAD_F(0x060cfe46) /* 0.378172181 */, 17 }, +/* 3323 */ { MAD_F(0x060d9d70) /* 0.378323973 */, 17 }, +/* 3324 */ { MAD_F(0x060e3c9f) /* 0.378475781 */, 17 }, +/* 3325 */ { MAD_F(0x060edbd1) /* 0.378627604 */, 17 }, +/* 3326 */ { MAD_F(0x060f7b08) /* 0.378779442 */, 17 }, +/* 3327 */ { MAD_F(0x06101a43) /* 0.378931296 */, 17 }, + +/* 3328 */ { MAD_F(0x0610b982) /* 0.379083164 */, 17 }, +/* 3329 */ { MAD_F(0x061158c5) /* 0.379235048 */, 17 }, +/* 3330 */ { MAD_F(0x0611f80c) /* 0.379386947 */, 17 }, +/* 3331 */ { MAD_F(0x06129757) /* 0.379538862 */, 17 }, +/* 3332 */ { MAD_F(0x061336a6) /* 0.379690791 */, 17 }, +/* 3333 */ { MAD_F(0x0613d5fa) /* 0.379842736 */, 17 }, +/* 3334 */ { MAD_F(0x06147551) /* 0.379994696 */, 17 }, +/* 3335 */ { MAD_F(0x061514ad) /* 0.380146671 */, 17 }, +/* 3336 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 17 }, +/* 3337 */ { MAD_F(0x06165370) /* 0.380450666 */, 17 }, +/* 3338 */ { MAD_F(0x0616f2d8) /* 0.380602687 */, 17 }, +/* 3339 */ { MAD_F(0x06179243) /* 0.380754723 */, 17 }, +/* 3340 */ { MAD_F(0x061831b3) /* 0.380906774 */, 17 }, +/* 3341 */ { MAD_F(0x0618d127) /* 0.381058840 */, 17 }, +/* 3342 */ { MAD_F(0x0619709f) /* 0.381210921 */, 17 }, +/* 3343 */ { MAD_F(0x061a101b) /* 0.381363018 */, 17 }, + +/* 3344 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 17 }, +/* 3345 */ { MAD_F(0x061b4f20) /* 0.381667257 */, 17 }, +/* 3346 */ { MAD_F(0x061beea8) /* 0.381819399 */, 17 }, +/* 3347 */ { MAD_F(0x061c8e34) /* 0.381971556 */, 17 }, +/* 3348 */ { MAD_F(0x061d2dc5) /* 0.382123728 */, 17 }, +/* 3349 */ { MAD_F(0x061dcd59) /* 0.382275916 */, 17 }, +/* 3350 */ { MAD_F(0x061e6cf2) /* 0.382428118 */, 17 }, +/* 3351 */ { MAD_F(0x061f0c8f) /* 0.382580336 */, 17 }, +/* 3352 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 17 }, +/* 3353 */ { MAD_F(0x06204bd4) /* 0.382884817 */, 17 }, +/* 3354 */ { MAD_F(0x0620eb7d) /* 0.383037080 */, 17 }, +/* 3355 */ { MAD_F(0x06218b2a) /* 0.383189358 */, 17 }, +/* 3356 */ { MAD_F(0x06222adb) /* 0.383341652 */, 17 }, +/* 3357 */ { MAD_F(0x0622ca90) /* 0.383493960 */, 17 }, +/* 3358 */ { MAD_F(0x06236a49) /* 0.383646284 */, 17 }, +/* 3359 */ { MAD_F(0x06240a06) /* 0.383798623 */, 17 }, + +/* 3360 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 17 }, +/* 3361 */ { MAD_F(0x0625498d) /* 0.384103346 */, 17 }, +/* 3362 */ { MAD_F(0x0625e956) /* 0.384255730 */, 17 }, +/* 3363 */ { MAD_F(0x06268923) /* 0.384408129 */, 17 }, +/* 3364 */ { MAD_F(0x062728f5) /* 0.384560544 */, 17 }, +/* 3365 */ { MAD_F(0x0627c8ca) /* 0.384712973 */, 17 }, +/* 3366 */ { MAD_F(0x062868a4) /* 0.384865418 */, 17 }, +/* 3367 */ { MAD_F(0x06290881) /* 0.385017878 */, 17 }, +/* 3368 */ { MAD_F(0x0629a863) /* 0.385170352 */, 17 }, +/* 3369 */ { MAD_F(0x062a4849) /* 0.385322842 */, 17 }, +/* 3370 */ { MAD_F(0x062ae832) /* 0.385475347 */, 17 }, +/* 3371 */ { MAD_F(0x062b8820) /* 0.385627867 */, 17 }, +/* 3372 */ { MAD_F(0x062c2812) /* 0.385780402 */, 17 }, +/* 3373 */ { MAD_F(0x062cc808) /* 0.385932953 */, 17 }, +/* 3374 */ { MAD_F(0x062d6802) /* 0.386085518 */, 17 }, +/* 3375 */ { MAD_F(0x062e0800) /* 0.386238098 */, 17 }, + +/* 3376 */ { MAD_F(0x062ea802) /* 0.386390694 */, 17 }, +/* 3377 */ { MAD_F(0x062f4808) /* 0.386543304 */, 17 }, +/* 3378 */ { MAD_F(0x062fe812) /* 0.386695930 */, 17 }, +/* 3379 */ { MAD_F(0x06308820) /* 0.386848570 */, 17 }, +/* 3380 */ { MAD_F(0x06312832) /* 0.387001226 */, 17 }, +/* 3381 */ { MAD_F(0x0631c849) /* 0.387153897 */, 17 }, +/* 3382 */ { MAD_F(0x06326863) /* 0.387306582 */, 17 }, +/* 3383 */ { MAD_F(0x06330881) /* 0.387459283 */, 17 }, +/* 3384 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 17 }, +/* 3385 */ { MAD_F(0x063448ca) /* 0.387764730 */, 17 }, +/* 3386 */ { MAD_F(0x0634e8f4) /* 0.387917476 */, 17 }, +/* 3387 */ { MAD_F(0x06358923) /* 0.388070237 */, 17 }, +/* 3388 */ { MAD_F(0x06362955) /* 0.388223013 */, 17 }, +/* 3389 */ { MAD_F(0x0636c98c) /* 0.388375804 */, 17 }, +/* 3390 */ { MAD_F(0x063769c6) /* 0.388528610 */, 17 }, +/* 3391 */ { MAD_F(0x06380a05) /* 0.388681431 */, 17 }, + +/* 3392 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 17 }, +/* 3393 */ { MAD_F(0x06394a8e) /* 0.388987119 */, 17 }, +/* 3394 */ { MAD_F(0x0639ead9) /* 0.389139985 */, 17 }, +/* 3395 */ { MAD_F(0x063a8b28) /* 0.389292866 */, 17 }, +/* 3396 */ { MAD_F(0x063b2b7b) /* 0.389445762 */, 17 }, +/* 3397 */ { MAD_F(0x063bcbd1) /* 0.389598674 */, 17 }, +/* 3398 */ { MAD_F(0x063c6c2c) /* 0.389751600 */, 17 }, +/* 3399 */ { MAD_F(0x063d0c8b) /* 0.389904541 */, 17 }, +/* 3400 */ { MAD_F(0x063dacee) /* 0.390057497 */, 17 }, +/* 3401 */ { MAD_F(0x063e4d55) /* 0.390210468 */, 17 }, +/* 3402 */ { MAD_F(0x063eedc0) /* 0.390363455 */, 17 }, +/* 3403 */ { MAD_F(0x063f8e2f) /* 0.390516456 */, 17 }, +/* 3404 */ { MAD_F(0x06402ea2) /* 0.390669472 */, 17 }, +/* 3405 */ { MAD_F(0x0640cf19) /* 0.390822503 */, 17 }, +/* 3406 */ { MAD_F(0x06416f94) /* 0.390975549 */, 17 }, +/* 3407 */ { MAD_F(0x06421013) /* 0.391128611 */, 17 }, + +/* 3408 */ { MAD_F(0x0642b096) /* 0.391281687 */, 17 }, +/* 3409 */ { MAD_F(0x0643511d) /* 0.391434778 */, 17 }, +/* 3410 */ { MAD_F(0x0643f1a8) /* 0.391587884 */, 17 }, +/* 3411 */ { MAD_F(0x06449237) /* 0.391741005 */, 17 }, +/* 3412 */ { MAD_F(0x064532ca) /* 0.391894141 */, 17 }, +/* 3413 */ { MAD_F(0x0645d361) /* 0.392047292 */, 17 }, +/* 3414 */ { MAD_F(0x064673fc) /* 0.392200458 */, 17 }, +/* 3415 */ { MAD_F(0x0647149c) /* 0.392353638 */, 17 }, +/* 3416 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 17 }, +/* 3417 */ { MAD_F(0x064855e6) /* 0.392660045 */, 17 }, +/* 3418 */ { MAD_F(0x0648f691) /* 0.392813271 */, 17 }, +/* 3419 */ { MAD_F(0x06499740) /* 0.392966511 */, 17 }, +/* 3420 */ { MAD_F(0x064a37f4) /* 0.393119767 */, 17 }, +/* 3421 */ { MAD_F(0x064ad8ab) /* 0.393273038 */, 17 }, +/* 3422 */ { MAD_F(0x064b7966) /* 0.393426323 */, 17 }, +/* 3423 */ { MAD_F(0x064c1a25) /* 0.393579623 */, 17 }, + +/* 3424 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 17 }, +/* 3425 */ { MAD_F(0x064d5bb0) /* 0.393886269 */, 17 }, +/* 3426 */ { MAD_F(0x064dfc7b) /* 0.394039614 */, 17 }, +/* 3427 */ { MAD_F(0x064e9d4b) /* 0.394192974 */, 17 }, +/* 3428 */ { MAD_F(0x064f3e1e) /* 0.394346349 */, 17 }, +/* 3429 */ { MAD_F(0x064fdef5) /* 0.394499739 */, 17 }, +/* 3430 */ { MAD_F(0x06507fd0) /* 0.394653144 */, 17 }, +/* 3431 */ { MAD_F(0x065120b0) /* 0.394806564 */, 17 }, +/* 3432 */ { MAD_F(0x0651c193) /* 0.394959999 */, 17 }, +/* 3433 */ { MAD_F(0x0652627a) /* 0.395113448 */, 17 }, +/* 3434 */ { MAD_F(0x06530366) /* 0.395266913 */, 17 }, +/* 3435 */ { MAD_F(0x0653a455) /* 0.395420392 */, 17 }, +/* 3436 */ { MAD_F(0x06544548) /* 0.395573886 */, 17 }, +/* 3437 */ { MAD_F(0x0654e640) /* 0.395727395 */, 17 }, +/* 3438 */ { MAD_F(0x0655873b) /* 0.395880919 */, 17 }, +/* 3439 */ { MAD_F(0x0656283a) /* 0.396034458 */, 17 }, + +/* 3440 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 17 }, +/* 3441 */ { MAD_F(0x06576a45) /* 0.396341581 */, 17 }, +/* 3442 */ { MAD_F(0x06580b50) /* 0.396495164 */, 17 }, +/* 3443 */ { MAD_F(0x0658ac5f) /* 0.396648763 */, 17 }, +/* 3444 */ { MAD_F(0x06594d73) /* 0.396802376 */, 17 }, +/* 3445 */ { MAD_F(0x0659ee8a) /* 0.396956004 */, 17 }, +/* 3446 */ { MAD_F(0x065a8fa5) /* 0.397109647 */, 17 }, +/* 3447 */ { MAD_F(0x065b30c4) /* 0.397263305 */, 17 }, +/* 3448 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 17 }, +/* 3449 */ { MAD_F(0x065c730f) /* 0.397570666 */, 17 }, +/* 3450 */ { MAD_F(0x065d143a) /* 0.397724368 */, 17 }, +/* 3451 */ { MAD_F(0x065db569) /* 0.397878085 */, 17 }, +/* 3452 */ { MAD_F(0x065e569c) /* 0.398031818 */, 17 }, +/* 3453 */ { MAD_F(0x065ef7d3) /* 0.398185565 */, 17 }, +/* 3454 */ { MAD_F(0x065f990e) /* 0.398339326 */, 17 }, +/* 3455 */ { MAD_F(0x06603a4e) /* 0.398493103 */, 17 }, + +/* 3456 */ { MAD_F(0x0660db91) /* 0.398646895 */, 17 }, +/* 3457 */ { MAD_F(0x06617cd8) /* 0.398800701 */, 17 }, +/* 3458 */ { MAD_F(0x06621e23) /* 0.398954522 */, 17 }, +/* 3459 */ { MAD_F(0x0662bf72) /* 0.399108358 */, 17 }, +/* 3460 */ { MAD_F(0x066360c5) /* 0.399262209 */, 17 }, +/* 3461 */ { MAD_F(0x0664021c) /* 0.399416075 */, 17 }, +/* 3462 */ { MAD_F(0x0664a377) /* 0.399569955 */, 17 }, +/* 3463 */ { MAD_F(0x066544d6) /* 0.399723851 */, 17 }, +/* 3464 */ { MAD_F(0x0665e639) /* 0.399877761 */, 17 }, +/* 3465 */ { MAD_F(0x066687a0) /* 0.400031686 */, 17 }, +/* 3466 */ { MAD_F(0x0667290b) /* 0.400185625 */, 17 }, +/* 3467 */ { MAD_F(0x0667ca79) /* 0.400339580 */, 17 }, +/* 3468 */ { MAD_F(0x06686bec) /* 0.400493549 */, 17 }, +/* 3469 */ { MAD_F(0x06690d63) /* 0.400647534 */, 17 }, +/* 3470 */ { MAD_F(0x0669aede) /* 0.400801533 */, 17 }, +/* 3471 */ { MAD_F(0x066a505d) /* 0.400955546 */, 17 }, + +/* 3472 */ { MAD_F(0x066af1df) /* 0.401109575 */, 17 }, +/* 3473 */ { MAD_F(0x066b9366) /* 0.401263618 */, 17 }, +/* 3474 */ { MAD_F(0x066c34f1) /* 0.401417676 */, 17 }, +/* 3475 */ { MAD_F(0x066cd67f) /* 0.401571749 */, 17 }, +/* 3476 */ { MAD_F(0x066d7812) /* 0.401725837 */, 17 }, +/* 3477 */ { MAD_F(0x066e19a9) /* 0.401879939 */, 17 }, +/* 3478 */ { MAD_F(0x066ebb43) /* 0.402034056 */, 17 }, +/* 3479 */ { MAD_F(0x066f5ce2) /* 0.402188188 */, 17 }, +/* 3480 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 17 }, +/* 3481 */ { MAD_F(0x0670a02a) /* 0.402496497 */, 17 }, +/* 3482 */ { MAD_F(0x067141d5) /* 0.402650673 */, 17 }, +/* 3483 */ { MAD_F(0x0671e383) /* 0.402804864 */, 17 }, +/* 3484 */ { MAD_F(0x06728535) /* 0.402959070 */, 17 }, +/* 3485 */ { MAD_F(0x067326ec) /* 0.403113291 */, 17 }, +/* 3486 */ { MAD_F(0x0673c8a6) /* 0.403267526 */, 17 }, +/* 3487 */ { MAD_F(0x06746a64) /* 0.403421776 */, 17 }, + +/* 3488 */ { MAD_F(0x06750c26) /* 0.403576041 */, 17 }, +/* 3489 */ { MAD_F(0x0675adec) /* 0.403730320 */, 17 }, +/* 3490 */ { MAD_F(0x06764fb6) /* 0.403884615 */, 17 }, +/* 3491 */ { MAD_F(0x0676f184) /* 0.404038924 */, 17 }, +/* 3492 */ { MAD_F(0x06779356) /* 0.404193247 */, 17 }, +/* 3493 */ { MAD_F(0x0678352c) /* 0.404347586 */, 17 }, +/* 3494 */ { MAD_F(0x0678d706) /* 0.404501939 */, 17 }, +/* 3495 */ { MAD_F(0x067978e4) /* 0.404656307 */, 17 }, +/* 3496 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 17 }, +/* 3497 */ { MAD_F(0x067abcac) /* 0.404965087 */, 17 }, +/* 3498 */ { MAD_F(0x067b5e95) /* 0.405119499 */, 17 }, +/* 3499 */ { MAD_F(0x067c0083) /* 0.405273926 */, 17 }, +/* 3500 */ { MAD_F(0x067ca275) /* 0.405428368 */, 17 }, +/* 3501 */ { MAD_F(0x067d446a) /* 0.405582824 */, 17 }, +/* 3502 */ { MAD_F(0x067de664) /* 0.405737295 */, 17 }, +/* 3503 */ { MAD_F(0x067e8861) /* 0.405891781 */, 17 }, + +/* 3504 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 17 }, +/* 3505 */ { MAD_F(0x067fcc68) /* 0.406200796 */, 17 }, +/* 3506 */ { MAD_F(0x06806e71) /* 0.406355326 */, 17 }, +/* 3507 */ { MAD_F(0x0681107e) /* 0.406509870 */, 17 }, +/* 3508 */ { MAD_F(0x0681b28f) /* 0.406664429 */, 17 }, +/* 3509 */ { MAD_F(0x068254a4) /* 0.406819003 */, 17 }, +/* 3510 */ { MAD_F(0x0682f6bd) /* 0.406973592 */, 17 }, +/* 3511 */ { MAD_F(0x068398da) /* 0.407128195 */, 17 }, +/* 3512 */ { MAD_F(0x06843afb) /* 0.407282813 */, 17 }, +/* 3513 */ { MAD_F(0x0684dd20) /* 0.407437445 */, 17 }, +/* 3514 */ { MAD_F(0x06857f49) /* 0.407592093 */, 17 }, +/* 3515 */ { MAD_F(0x06862176) /* 0.407746754 */, 17 }, +/* 3516 */ { MAD_F(0x0686c3a6) /* 0.407901431 */, 17 }, +/* 3517 */ { MAD_F(0x068765db) /* 0.408056122 */, 17 }, +/* 3518 */ { MAD_F(0x06880814) /* 0.408210828 */, 17 }, +/* 3519 */ { MAD_F(0x0688aa50) /* 0.408365549 */, 17 }, + +/* 3520 */ { MAD_F(0x06894c90) /* 0.408520284 */, 17 }, +/* 3521 */ { MAD_F(0x0689eed5) /* 0.408675034 */, 17 }, +/* 3522 */ { MAD_F(0x068a911d) /* 0.408829798 */, 17 }, +/* 3523 */ { MAD_F(0x068b3369) /* 0.408984577 */, 17 }, +/* 3524 */ { MAD_F(0x068bd5b9) /* 0.409139371 */, 17 }, +/* 3525 */ { MAD_F(0x068c780e) /* 0.409294180 */, 17 }, +/* 3526 */ { MAD_F(0x068d1a66) /* 0.409449003 */, 17 }, +/* 3527 */ { MAD_F(0x068dbcc1) /* 0.409603840 */, 17 }, +/* 3528 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 17 }, +/* 3529 */ { MAD_F(0x068f0185) /* 0.409913560 */, 17 }, +/* 3530 */ { MAD_F(0x068fa3ed) /* 0.410068441 */, 17 }, +/* 3531 */ { MAD_F(0x06904658) /* 0.410223338 */, 17 }, +/* 3532 */ { MAD_F(0x0690e8c8) /* 0.410378249 */, 17 }, +/* 3533 */ { MAD_F(0x06918b3c) /* 0.410533174 */, 17 }, +/* 3534 */ { MAD_F(0x06922db3) /* 0.410688114 */, 17 }, +/* 3535 */ { MAD_F(0x0692d02e) /* 0.410843069 */, 17 }, + +/* 3536 */ { MAD_F(0x069372ae) /* 0.410998038 */, 17 }, +/* 3537 */ { MAD_F(0x06941531) /* 0.411153022 */, 17 }, +/* 3538 */ { MAD_F(0x0694b7b8) /* 0.411308021 */, 17 }, +/* 3539 */ { MAD_F(0x06955a43) /* 0.411463034 */, 17 }, +/* 3540 */ { MAD_F(0x0695fcd2) /* 0.411618062 */, 17 }, +/* 3541 */ { MAD_F(0x06969f65) /* 0.411773104 */, 17 }, +/* 3542 */ { MAD_F(0x069741fb) /* 0.411928161 */, 17 }, +/* 3543 */ { MAD_F(0x0697e496) /* 0.412083232 */, 17 }, +/* 3544 */ { MAD_F(0x06988735) /* 0.412238319 */, 17 }, +/* 3545 */ { MAD_F(0x069929d7) /* 0.412393419 */, 17 }, +/* 3546 */ { MAD_F(0x0699cc7e) /* 0.412548535 */, 17 }, +/* 3547 */ { MAD_F(0x069a6f28) /* 0.412703664 */, 17 }, +/* 3548 */ { MAD_F(0x069b11d6) /* 0.412858809 */, 17 }, +/* 3549 */ { MAD_F(0x069bb489) /* 0.413013968 */, 17 }, +/* 3550 */ { MAD_F(0x069c573f) /* 0.413169142 */, 17 }, +/* 3551 */ { MAD_F(0x069cf9f9) /* 0.413324330 */, 17 }, + +/* 3552 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 17 }, +/* 3553 */ { MAD_F(0x069e3f78) /* 0.413634750 */, 17 }, +/* 3554 */ { MAD_F(0x069ee23e) /* 0.413789982 */, 17 }, +/* 3555 */ { MAD_F(0x069f8508) /* 0.413945228 */, 17 }, +/* 3556 */ { MAD_F(0x06a027d5) /* 0.414100489 */, 17 }, +/* 3557 */ { MAD_F(0x06a0caa7) /* 0.414255765 */, 17 }, +/* 3558 */ { MAD_F(0x06a16d7c) /* 0.414411055 */, 17 }, +/* 3559 */ { MAD_F(0x06a21055) /* 0.414566359 */, 17 }, +/* 3560 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 17 }, +/* 3561 */ { MAD_F(0x06a35614) /* 0.414877012 */, 17 }, +/* 3562 */ { MAD_F(0x06a3f8f9) /* 0.415032361 */, 17 }, +/* 3563 */ { MAD_F(0x06a49be2) /* 0.415187723 */, 17 }, +/* 3564 */ { MAD_F(0x06a53ece) /* 0.415343101 */, 17 }, +/* 3565 */ { MAD_F(0x06a5e1bf) /* 0.415498493 */, 17 }, +/* 3566 */ { MAD_F(0x06a684b4) /* 0.415653899 */, 17 }, +/* 3567 */ { MAD_F(0x06a727ac) /* 0.415809320 */, 17 }, + +/* 3568 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 17 }, +/* 3569 */ { MAD_F(0x06a86da9) /* 0.416120206 */, 17 }, +/* 3570 */ { MAD_F(0x06a910ad) /* 0.416275670 */, 17 }, +/* 3571 */ { MAD_F(0x06a9b3b5) /* 0.416431149 */, 17 }, +/* 3572 */ { MAD_F(0x06aa56c1) /* 0.416586643 */, 17 }, +/* 3573 */ { MAD_F(0x06aaf9d1) /* 0.416742151 */, 17 }, +/* 3574 */ { MAD_F(0x06ab9ce5) /* 0.416897673 */, 17 }, +/* 3575 */ { MAD_F(0x06ac3ffc) /* 0.417053210 */, 17 }, +/* 3576 */ { MAD_F(0x06ace318) /* 0.417208762 */, 17 }, +/* 3577 */ { MAD_F(0x06ad8637) /* 0.417364328 */, 17 }, +/* 3578 */ { MAD_F(0x06ae295b) /* 0.417519909 */, 17 }, +/* 3579 */ { MAD_F(0x06aecc82) /* 0.417675504 */, 17 }, +/* 3580 */ { MAD_F(0x06af6fad) /* 0.417831113 */, 17 }, +/* 3581 */ { MAD_F(0x06b012dc) /* 0.417986737 */, 17 }, +/* 3582 */ { MAD_F(0x06b0b60f) /* 0.418142376 */, 17 }, +/* 3583 */ { MAD_F(0x06b15946) /* 0.418298029 */, 17 }, + +/* 3584 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 17 }, +/* 3585 */ { MAD_F(0x06b29fbf) /* 0.418609378 */, 17 }, +/* 3586 */ { MAD_F(0x06b34302) /* 0.418765075 */, 17 }, +/* 3587 */ { MAD_F(0x06b3e648) /* 0.418920786 */, 17 }, +/* 3588 */ { MAD_F(0x06b48992) /* 0.419076511 */, 17 }, +/* 3589 */ { MAD_F(0x06b52ce0) /* 0.419232251 */, 17 }, +/* 3590 */ { MAD_F(0x06b5d032) /* 0.419388005 */, 17 }, +/* 3591 */ { MAD_F(0x06b67388) /* 0.419543774 */, 17 }, +/* 3592 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 17 }, +/* 3593 */ { MAD_F(0x06b7ba3f) /* 0.419855355 */, 17 }, +/* 3594 */ { MAD_F(0x06b85da1) /* 0.420011167 */, 17 }, +/* 3595 */ { MAD_F(0x06b90106) /* 0.420166994 */, 17 }, +/* 3596 */ { MAD_F(0x06b9a470) /* 0.420322835 */, 17 }, +/* 3597 */ { MAD_F(0x06ba47dd) /* 0.420478690 */, 17 }, +/* 3598 */ { MAD_F(0x06baeb4e) /* 0.420634560 */, 17 }, +/* 3599 */ { MAD_F(0x06bb8ec3) /* 0.420790445 */, 17 }, + +/* 3600 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 17 }, +/* 3601 */ { MAD_F(0x06bcd5b8) /* 0.421102257 */, 17 }, +/* 3602 */ { MAD_F(0x06bd7939) /* 0.421258184 */, 17 }, +/* 3603 */ { MAD_F(0x06be1cbd) /* 0.421414127 */, 17 }, +/* 3604 */ { MAD_F(0x06bec045) /* 0.421570083 */, 17 }, +/* 3605 */ { MAD_F(0x06bf63d1) /* 0.421726054 */, 17 }, +/* 3606 */ { MAD_F(0x06c00761) /* 0.421882040 */, 17 }, +/* 3607 */ { MAD_F(0x06c0aaf5) /* 0.422038039 */, 17 }, +/* 3608 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 17 }, +/* 3609 */ { MAD_F(0x06c1f229) /* 0.422350082 */, 17 }, +/* 3610 */ { MAD_F(0x06c295c8) /* 0.422506125 */, 17 }, +/* 3611 */ { MAD_F(0x06c3396c) /* 0.422662183 */, 17 }, +/* 3612 */ { MAD_F(0x06c3dd13) /* 0.422818255 */, 17 }, +/* 3613 */ { MAD_F(0x06c480be) /* 0.422974341 */, 17 }, +/* 3614 */ { MAD_F(0x06c5246d) /* 0.423130442 */, 17 }, +/* 3615 */ { MAD_F(0x06c5c820) /* 0.423286557 */, 17 }, + +/* 3616 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 17 }, +/* 3617 */ { MAD_F(0x06c70f91) /* 0.423598830 */, 17 }, +/* 3618 */ { MAD_F(0x06c7b34f) /* 0.423754988 */, 17 }, +/* 3619 */ { MAD_F(0x06c85712) /* 0.423911161 */, 17 }, +/* 3620 */ { MAD_F(0x06c8fad8) /* 0.424067348 */, 17 }, +/* 3621 */ { MAD_F(0x06c99ea2) /* 0.424223550 */, 17 }, +/* 3622 */ { MAD_F(0x06ca4270) /* 0.424379765 */, 17 }, +/* 3623 */ { MAD_F(0x06cae641) /* 0.424535996 */, 17 }, +/* 3624 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 17 }, +/* 3625 */ { MAD_F(0x06cc2df0) /* 0.424848499 */, 17 }, +/* 3626 */ { MAD_F(0x06ccd1ce) /* 0.425004772 */, 17 }, +/* 3627 */ { MAD_F(0x06cd75af) /* 0.425161060 */, 17 }, +/* 3628 */ { MAD_F(0x06ce1994) /* 0.425317362 */, 17 }, +/* 3629 */ { MAD_F(0x06cebd7d) /* 0.425473678 */, 17 }, +/* 3630 */ { MAD_F(0x06cf6169) /* 0.425630009 */, 17 }, +/* 3631 */ { MAD_F(0x06d0055a) /* 0.425786354 */, 17 }, + +/* 3632 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 17 }, +/* 3633 */ { MAD_F(0x06d14d47) /* 0.426099088 */, 17 }, +/* 3634 */ { MAD_F(0x06d1f143) /* 0.426255476 */, 17 }, +/* 3635 */ { MAD_F(0x06d29543) /* 0.426411878 */, 17 }, +/* 3636 */ { MAD_F(0x06d33947) /* 0.426568295 */, 17 }, +/* 3637 */ { MAD_F(0x06d3dd4e) /* 0.426724726 */, 17 }, +/* 3638 */ { MAD_F(0x06d4815a) /* 0.426881172 */, 17 }, +/* 3639 */ { MAD_F(0x06d52569) /* 0.427037632 */, 17 }, +/* 3640 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 17 }, +/* 3641 */ { MAD_F(0x06d66d93) /* 0.427350594 */, 17 }, +/* 3642 */ { MAD_F(0x06d711ae) /* 0.427507097 */, 17 }, +/* 3643 */ { MAD_F(0x06d7b5cd) /* 0.427663614 */, 17 }, +/* 3644 */ { MAD_F(0x06d859f0) /* 0.427820146 */, 17 }, +/* 3645 */ { MAD_F(0x06d8fe16) /* 0.427976692 */, 17 }, +/* 3646 */ { MAD_F(0x06d9a240) /* 0.428133252 */, 17 }, +/* 3647 */ { MAD_F(0x06da466f) /* 0.428289826 */, 17 }, + +/* 3648 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 17 }, +/* 3649 */ { MAD_F(0x06db8ed6) /* 0.428603018 */, 17 }, +/* 3650 */ { MAD_F(0x06dc3310) /* 0.428759635 */, 17 }, +/* 3651 */ { MAD_F(0x06dcd74d) /* 0.428916267 */, 17 }, +/* 3652 */ { MAD_F(0x06dd7b8f) /* 0.429072913 */, 17 }, +/* 3653 */ { MAD_F(0x06de1fd4) /* 0.429229573 */, 17 }, +/* 3654 */ { MAD_F(0x06dec41d) /* 0.429386248 */, 17 }, +/* 3655 */ { MAD_F(0x06df686a) /* 0.429542937 */, 17 }, +/* 3656 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 17 }, +/* 3657 */ { MAD_F(0x06e0b10f) /* 0.429856357 */, 17 }, +/* 3658 */ { MAD_F(0x06e15567) /* 0.430013089 */, 17 }, +/* 3659 */ { MAD_F(0x06e1f9c4) /* 0.430169835 */, 17 }, +/* 3660 */ { MAD_F(0x06e29e24) /* 0.430326595 */, 17 }, +/* 3661 */ { MAD_F(0x06e34287) /* 0.430483370 */, 17 }, +/* 3662 */ { MAD_F(0x06e3e6ef) /* 0.430640159 */, 17 }, +/* 3663 */ { MAD_F(0x06e48b5b) /* 0.430796962 */, 17 }, + +/* 3664 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 17 }, +/* 3665 */ { MAD_F(0x06e5d43d) /* 0.431110611 */, 17 }, +/* 3666 */ { MAD_F(0x06e678b4) /* 0.431267457 */, 17 }, +/* 3667 */ { MAD_F(0x06e71d2f) /* 0.431424317 */, 17 }, +/* 3668 */ { MAD_F(0x06e7c1ae) /* 0.431581192 */, 17 }, +/* 3669 */ { MAD_F(0x06e86630) /* 0.431738080 */, 17 }, +/* 3670 */ { MAD_F(0x06e90ab7) /* 0.431894983 */, 17 }, +/* 3671 */ { MAD_F(0x06e9af41) /* 0.432051900 */, 17 }, +/* 3672 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 17 }, +/* 3673 */ { MAD_F(0x06eaf860) /* 0.432365778 */, 17 }, +/* 3674 */ { MAD_F(0x06eb9cf6) /* 0.432522737 */, 17 }, +/* 3675 */ { MAD_F(0x06ec418f) /* 0.432679712 */, 17 }, +/* 3676 */ { MAD_F(0x06ece62d) /* 0.432836700 */, 17 }, +/* 3677 */ { MAD_F(0x06ed8ace) /* 0.432993703 */, 17 }, +/* 3678 */ { MAD_F(0x06ee2f73) /* 0.433150720 */, 17 }, +/* 3679 */ { MAD_F(0x06eed41b) /* 0.433307751 */, 17 }, + +/* 3680 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 17 }, +/* 3681 */ { MAD_F(0x06f01d78) /* 0.433621856 */, 17 }, +/* 3682 */ { MAD_F(0x06f0c22c) /* 0.433778929 */, 17 }, +/* 3683 */ { MAD_F(0x06f166e4) /* 0.433936017 */, 17 }, +/* 3684 */ { MAD_F(0x06f20ba0) /* 0.434093120 */, 17 }, +/* 3685 */ { MAD_F(0x06f2b060) /* 0.434250236 */, 17 }, +/* 3686 */ { MAD_F(0x06f35523) /* 0.434407367 */, 17 }, +/* 3687 */ { MAD_F(0x06f3f9eb) /* 0.434564512 */, 17 }, +/* 3688 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 17 }, +/* 3689 */ { MAD_F(0x06f54385) /* 0.434878844 */, 17 }, +/* 3690 */ { MAD_F(0x06f5e857) /* 0.435036032 */, 17 }, +/* 3691 */ { MAD_F(0x06f68d2e) /* 0.435193233 */, 17 }, +/* 3692 */ { MAD_F(0x06f73208) /* 0.435350449 */, 17 }, +/* 3693 */ { MAD_F(0x06f7d6e6) /* 0.435507679 */, 17 }, +/* 3694 */ { MAD_F(0x06f87bc8) /* 0.435664924 */, 17 }, +/* 3695 */ { MAD_F(0x06f920ae) /* 0.435822182 */, 17 }, + +/* 3696 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 17 }, +/* 3697 */ { MAD_F(0x06fa6a85) /* 0.436136741 */, 17 }, +/* 3698 */ { MAD_F(0x06fb0f76) /* 0.436294042 */, 17 }, +/* 3699 */ { MAD_F(0x06fbb46b) /* 0.436451358 */, 17 }, +/* 3700 */ { MAD_F(0x06fc5964) /* 0.436608687 */, 17 }, +/* 3701 */ { MAD_F(0x06fcfe60) /* 0.436766031 */, 17 }, +/* 3702 */ { MAD_F(0x06fda361) /* 0.436923388 */, 17 }, +/* 3703 */ { MAD_F(0x06fe4865) /* 0.437080760 */, 17 }, +/* 3704 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 17 }, +/* 3705 */ { MAD_F(0x06ff9279) /* 0.437395547 */, 17 }, +/* 3706 */ { MAD_F(0x07003788) /* 0.437552961 */, 17 }, +/* 3707 */ { MAD_F(0x0700dc9c) /* 0.437710389 */, 17 }, +/* 3708 */ { MAD_F(0x070181b3) /* 0.437867832 */, 17 }, +/* 3709 */ { MAD_F(0x070226ce) /* 0.438025289 */, 17 }, +/* 3710 */ { MAD_F(0x0702cbed) /* 0.438182760 */, 17 }, +/* 3711 */ { MAD_F(0x0703710f) /* 0.438340245 */, 17 }, + +/* 3712 */ { MAD_F(0x07041636) /* 0.438497744 */, 17 }, +/* 3713 */ { MAD_F(0x0704bb60) /* 0.438655258 */, 17 }, +/* 3714 */ { MAD_F(0x0705608e) /* 0.438812785 */, 17 }, +/* 3715 */ { MAD_F(0x070605c0) /* 0.438970327 */, 17 }, +/* 3716 */ { MAD_F(0x0706aaf5) /* 0.439127883 */, 17 }, +/* 3717 */ { MAD_F(0x0707502f) /* 0.439285453 */, 17 }, +/* 3718 */ { MAD_F(0x0707f56c) /* 0.439443037 */, 17 }, +/* 3719 */ { MAD_F(0x07089aad) /* 0.439600635 */, 17 }, +/* 3720 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 17 }, +/* 3721 */ { MAD_F(0x0709e53a) /* 0.439915874 */, 17 }, +/* 3722 */ { MAD_F(0x070a8a86) /* 0.440073515 */, 17 }, +/* 3723 */ { MAD_F(0x070b2fd7) /* 0.440231170 */, 17 }, +/* 3724 */ { MAD_F(0x070bd52a) /* 0.440388839 */, 17 }, +/* 3725 */ { MAD_F(0x070c7a82) /* 0.440546522 */, 17 }, +/* 3726 */ { MAD_F(0x070d1fde) /* 0.440704219 */, 17 }, +/* 3727 */ { MAD_F(0x070dc53d) /* 0.440861930 */, 17 }, + +/* 3728 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 17 }, +/* 3729 */ { MAD_F(0x070f1007) /* 0.441177395 */, 17 }, +/* 3730 */ { MAD_F(0x070fb571) /* 0.441335148 */, 17 }, +/* 3731 */ { MAD_F(0x07105ae0) /* 0.441492916 */, 17 }, +/* 3732 */ { MAD_F(0x07110052) /* 0.441650697 */, 17 }, +/* 3733 */ { MAD_F(0x0711a5c8) /* 0.441808493 */, 17 }, +/* 3734 */ { MAD_F(0x07124b42) /* 0.441966303 */, 17 }, +/* 3735 */ { MAD_F(0x0712f0bf) /* 0.442124127 */, 17 }, +/* 3736 */ { MAD_F(0x07139641) /* 0.442281965 */, 17 }, +/* 3737 */ { MAD_F(0x07143bc6) /* 0.442439817 */, 17 }, +/* 3738 */ { MAD_F(0x0714e14f) /* 0.442597683 */, 17 }, +/* 3739 */ { MAD_F(0x071586db) /* 0.442755564 */, 17 }, +/* 3740 */ { MAD_F(0x07162c6c) /* 0.442913458 */, 17 }, +/* 3741 */ { MAD_F(0x0716d200) /* 0.443071366 */, 17 }, +/* 3742 */ { MAD_F(0x07177798) /* 0.443229289 */, 17 }, +/* 3743 */ { MAD_F(0x07181d34) /* 0.443387226 */, 17 }, + +/* 3744 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 17 }, +/* 3745 */ { MAD_F(0x07196877) /* 0.443703141 */, 17 }, +/* 3746 */ { MAD_F(0x071a0e1e) /* 0.443861120 */, 17 }, +/* 3747 */ { MAD_F(0x071ab3c9) /* 0.444019113 */, 17 }, +/* 3748 */ { MAD_F(0x071b5977) /* 0.444177119 */, 17 }, +/* 3749 */ { MAD_F(0x071bff2a) /* 0.444335140 */, 17 }, +/* 3750 */ { MAD_F(0x071ca4e0) /* 0.444493175 */, 17 }, +/* 3751 */ { MAD_F(0x071d4a9a) /* 0.444651224 */, 17 }, +/* 3752 */ { MAD_F(0x071df058) /* 0.444809288 */, 17 }, +/* 3753 */ { MAD_F(0x071e9619) /* 0.444967365 */, 17 }, +/* 3754 */ { MAD_F(0x071f3bde) /* 0.445125456 */, 17 }, +/* 3755 */ { MAD_F(0x071fe1a8) /* 0.445283561 */, 17 }, +/* 3756 */ { MAD_F(0x07208774) /* 0.445441680 */, 17 }, +/* 3757 */ { MAD_F(0x07212d45) /* 0.445599814 */, 17 }, +/* 3758 */ { MAD_F(0x0721d319) /* 0.445757961 */, 17 }, +/* 3759 */ { MAD_F(0x072278f1) /* 0.445916122 */, 17 }, + +/* 3760 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 17 }, +/* 3761 */ { MAD_F(0x0723c4ad) /* 0.446232487 */, 17 }, +/* 3762 */ { MAD_F(0x07246a90) /* 0.446390690 */, 17 }, +/* 3763 */ { MAD_F(0x07251077) /* 0.446548908 */, 17 }, +/* 3764 */ { MAD_F(0x0725b662) /* 0.446707139 */, 17 }, +/* 3765 */ { MAD_F(0x07265c51) /* 0.446865385 */, 17 }, +/* 3766 */ { MAD_F(0x07270244) /* 0.447023644 */, 17 }, +/* 3767 */ { MAD_F(0x0727a83a) /* 0.447181918 */, 17 }, +/* 3768 */ { MAD_F(0x07284e34) /* 0.447340205 */, 17 }, +/* 3769 */ { MAD_F(0x0728f431) /* 0.447498507 */, 17 }, +/* 3770 */ { MAD_F(0x07299a33) /* 0.447656822 */, 17 }, +/* 3771 */ { MAD_F(0x072a4038) /* 0.447815152 */, 17 }, +/* 3772 */ { MAD_F(0x072ae641) /* 0.447973495 */, 17 }, +/* 3773 */ { MAD_F(0x072b8c4e) /* 0.448131853 */, 17 }, +/* 3774 */ { MAD_F(0x072c325e) /* 0.448290224 */, 17 }, +/* 3775 */ { MAD_F(0x072cd873) /* 0.448448609 */, 17 }, + +/* 3776 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 17 }, +/* 3777 */ { MAD_F(0x072e24a7) /* 0.448765422 */, 17 }, +/* 3778 */ { MAD_F(0x072ecac6) /* 0.448923850 */, 17 }, +/* 3779 */ { MAD_F(0x072f70e9) /* 0.449082291 */, 17 }, +/* 3780 */ { MAD_F(0x07301710) /* 0.449240746 */, 17 }, +/* 3781 */ { MAD_F(0x0730bd3b) /* 0.449399216 */, 17 }, +/* 3782 */ { MAD_F(0x0731636a) /* 0.449557699 */, 17 }, +/* 3783 */ { MAD_F(0x0732099c) /* 0.449716196 */, 17 }, +/* 3784 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 17 }, +/* 3785 */ { MAD_F(0x0733560c) /* 0.450033233 */, 17 }, +/* 3786 */ { MAD_F(0x0733fc49) /* 0.450191772 */, 17 }, +/* 3787 */ { MAD_F(0x0734a28b) /* 0.450350325 */, 17 }, +/* 3788 */ { MAD_F(0x073548d0) /* 0.450508892 */, 17 }, +/* 3789 */ { MAD_F(0x0735ef18) /* 0.450667473 */, 17 }, +/* 3790 */ { MAD_F(0x07369565) /* 0.450826068 */, 17 }, +/* 3791 */ { MAD_F(0x07373bb5) /* 0.450984677 */, 17 }, + +/* 3792 */ { MAD_F(0x0737e209) /* 0.451143300 */, 17 }, +/* 3793 */ { MAD_F(0x07388861) /* 0.451301937 */, 17 }, +/* 3794 */ { MAD_F(0x07392ebc) /* 0.451460588 */, 17 }, +/* 3795 */ { MAD_F(0x0739d51c) /* 0.451619252 */, 17 }, +/* 3796 */ { MAD_F(0x073a7b7f) /* 0.451777931 */, 17 }, +/* 3797 */ { MAD_F(0x073b21e5) /* 0.451936623 */, 17 }, +/* 3798 */ { MAD_F(0x073bc850) /* 0.452095330 */, 17 }, +/* 3799 */ { MAD_F(0x073c6ebe) /* 0.452254050 */, 17 }, +/* 3800 */ { MAD_F(0x073d1530) /* 0.452412785 */, 17 }, +/* 3801 */ { MAD_F(0x073dbba6) /* 0.452571533 */, 17 }, +/* 3802 */ { MAD_F(0x073e621f) /* 0.452730295 */, 17 }, +/* 3803 */ { MAD_F(0x073f089c) /* 0.452889071 */, 17 }, +/* 3804 */ { MAD_F(0x073faf1d) /* 0.453047861 */, 17 }, +/* 3805 */ { MAD_F(0x074055a2) /* 0.453206665 */, 17 }, +/* 3806 */ { MAD_F(0x0740fc2a) /* 0.453365483 */, 17 }, +/* 3807 */ { MAD_F(0x0741a2b6) /* 0.453524315 */, 17 }, + +/* 3808 */ { MAD_F(0x07424946) /* 0.453683161 */, 17 }, +/* 3809 */ { MAD_F(0x0742efd9) /* 0.453842020 */, 17 }, +/* 3810 */ { MAD_F(0x07439671) /* 0.454000894 */, 17 }, +/* 3811 */ { MAD_F(0x07443d0c) /* 0.454159781 */, 17 }, +/* 3812 */ { MAD_F(0x0744e3aa) /* 0.454318683 */, 17 }, +/* 3813 */ { MAD_F(0x07458a4d) /* 0.454477598 */, 17 }, +/* 3814 */ { MAD_F(0x074630f3) /* 0.454636527 */, 17 }, +/* 3815 */ { MAD_F(0x0746d79d) /* 0.454795470 */, 17 }, +/* 3816 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 17 }, +/* 3817 */ { MAD_F(0x074824fc) /* 0.455113397 */, 17 }, +/* 3818 */ { MAD_F(0x0748cbb1) /* 0.455272382 */, 17 }, +/* 3819 */ { MAD_F(0x0749726a) /* 0.455431381 */, 17 }, +/* 3820 */ { MAD_F(0x074a1927) /* 0.455590393 */, 17 }, +/* 3821 */ { MAD_F(0x074abfe7) /* 0.455749419 */, 17 }, +/* 3822 */ { MAD_F(0x074b66ab) /* 0.455908459 */, 17 }, +/* 3823 */ { MAD_F(0x074c0d73) /* 0.456067513 */, 17 }, + +/* 3824 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 17 }, +/* 3825 */ { MAD_F(0x074d5b0d) /* 0.456385663 */, 17 }, +/* 3826 */ { MAD_F(0x074e01e0) /* 0.456544759 */, 17 }, +/* 3827 */ { MAD_F(0x074ea8b7) /* 0.456703868 */, 17 }, +/* 3828 */ { MAD_F(0x074f4f91) /* 0.456862992 */, 17 }, +/* 3829 */ { MAD_F(0x074ff66f) /* 0.457022129 */, 17 }, +/* 3830 */ { MAD_F(0x07509d51) /* 0.457181280 */, 17 }, +/* 3831 */ { MAD_F(0x07514437) /* 0.457340445 */, 17 }, +/* 3832 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 17 }, +/* 3833 */ { MAD_F(0x0752920d) /* 0.457658816 */, 17 }, +/* 3834 */ { MAD_F(0x075338fd) /* 0.457818022 */, 17 }, +/* 3835 */ { MAD_F(0x0753dff2) /* 0.457977243 */, 17 }, +/* 3836 */ { MAD_F(0x075486ea) /* 0.458136477 */, 17 }, +/* 3837 */ { MAD_F(0x07552de6) /* 0.458295725 */, 17 }, +/* 3838 */ { MAD_F(0x0755d4e5) /* 0.458454987 */, 17 }, +/* 3839 */ { MAD_F(0x07567be8) /* 0.458614262 */, 17 }, + +/* 3840 */ { MAD_F(0x075722ef) /* 0.458773552 */, 17 }, +/* 3841 */ { MAD_F(0x0757c9fa) /* 0.458932855 */, 17 }, +/* 3842 */ { MAD_F(0x07587108) /* 0.459092172 */, 17 }, +/* 3843 */ { MAD_F(0x0759181a) /* 0.459251503 */, 17 }, +/* 3844 */ { MAD_F(0x0759bf30) /* 0.459410848 */, 17 }, +/* 3845 */ { MAD_F(0x075a664a) /* 0.459570206 */, 17 }, +/* 3846 */ { MAD_F(0x075b0d67) /* 0.459729579 */, 17 }, +/* 3847 */ { MAD_F(0x075bb488) /* 0.459888965 */, 17 }, +/* 3848 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 17 }, +/* 3849 */ { MAD_F(0x075d02d5) /* 0.460207779 */, 17 }, +/* 3850 */ { MAD_F(0x075daa01) /* 0.460367206 */, 17 }, +/* 3851 */ { MAD_F(0x075e5130) /* 0.460526648 */, 17 }, +/* 3852 */ { MAD_F(0x075ef864) /* 0.460686103 */, 17 }, +/* 3853 */ { MAD_F(0x075f9f9b) /* 0.460845572 */, 17 }, +/* 3854 */ { MAD_F(0x076046d6) /* 0.461005055 */, 17 }, +/* 3855 */ { MAD_F(0x0760ee14) /* 0.461164552 */, 17 }, + +/* 3856 */ { MAD_F(0x07619557) /* 0.461324062 */, 17 }, +/* 3857 */ { MAD_F(0x07623c9d) /* 0.461483586 */, 17 }, +/* 3858 */ { MAD_F(0x0762e3e6) /* 0.461643124 */, 17 }, +/* 3859 */ { MAD_F(0x07638b34) /* 0.461802676 */, 17 }, +/* 3860 */ { MAD_F(0x07643285) /* 0.461962242 */, 17 }, +/* 3861 */ { MAD_F(0x0764d9d9) /* 0.462121821 */, 17 }, +/* 3862 */ { MAD_F(0x07658132) /* 0.462281414 */, 17 }, +/* 3863 */ { MAD_F(0x0766288e) /* 0.462441021 */, 17 }, +/* 3864 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 17 }, +/* 3865 */ { MAD_F(0x07677751) /* 0.462760276 */, 17 }, +/* 3866 */ { MAD_F(0x07681eb9) /* 0.462919924 */, 17 }, +/* 3867 */ { MAD_F(0x0768c624) /* 0.463079586 */, 17 }, +/* 3868 */ { MAD_F(0x07696d92) /* 0.463239262 */, 17 }, +/* 3869 */ { MAD_F(0x076a1505) /* 0.463398951 */, 17 }, +/* 3870 */ { MAD_F(0x076abc7b) /* 0.463558655 */, 17 }, +/* 3871 */ { MAD_F(0x076b63f4) /* 0.463718372 */, 17 }, + +/* 3872 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 17 }, +/* 3873 */ { MAD_F(0x076cb2f3) /* 0.464037847 */, 17 }, +/* 3874 */ { MAD_F(0x076d5a78) /* 0.464197605 */, 17 }, +/* 3875 */ { MAD_F(0x076e0200) /* 0.464357377 */, 17 }, +/* 3876 */ { MAD_F(0x076ea98c) /* 0.464517163 */, 17 }, +/* 3877 */ { MAD_F(0x076f511c) /* 0.464676962 */, 17 }, +/* 3878 */ { MAD_F(0x076ff8b0) /* 0.464836776 */, 17 }, +/* 3879 */ { MAD_F(0x0770a047) /* 0.464996603 */, 17 }, +/* 3880 */ { MAD_F(0x077147e2) /* 0.465156443 */, 17 }, +/* 3881 */ { MAD_F(0x0771ef80) /* 0.465316298 */, 17 }, +/* 3882 */ { MAD_F(0x07729723) /* 0.465476166 */, 17 }, +/* 3883 */ { MAD_F(0x07733ec9) /* 0.465636048 */, 17 }, +/* 3884 */ { MAD_F(0x0773e672) /* 0.465795943 */, 17 }, +/* 3885 */ { MAD_F(0x07748e20) /* 0.465955853 */, 17 }, +/* 3886 */ { MAD_F(0x077535d1) /* 0.466115776 */, 17 }, +/* 3887 */ { MAD_F(0x0775dd85) /* 0.466275713 */, 17 }, + +/* 3888 */ { MAD_F(0x0776853e) /* 0.466435663 */, 17 }, +/* 3889 */ { MAD_F(0x07772cfa) /* 0.466595627 */, 17 }, +/* 3890 */ { MAD_F(0x0777d4ba) /* 0.466755605 */, 17 }, +/* 3891 */ { MAD_F(0x07787c7d) /* 0.466915597 */, 17 }, +/* 3892 */ { MAD_F(0x07792444) /* 0.467075602 */, 17 }, +/* 3893 */ { MAD_F(0x0779cc0f) /* 0.467235621 */, 17 }, +/* 3894 */ { MAD_F(0x077a73dd) /* 0.467395654 */, 17 }, +/* 3895 */ { MAD_F(0x077b1baf) /* 0.467555701 */, 17 }, +/* 3896 */ { MAD_F(0x077bc385) /* 0.467715761 */, 17 }, +/* 3897 */ { MAD_F(0x077c6b5f) /* 0.467875835 */, 17 }, +/* 3898 */ { MAD_F(0x077d133c) /* 0.468035922 */, 17 }, +/* 3899 */ { MAD_F(0x077dbb1d) /* 0.468196023 */, 17 }, +/* 3900 */ { MAD_F(0x077e6301) /* 0.468356138 */, 17 }, +/* 3901 */ { MAD_F(0x077f0ae9) /* 0.468516267 */, 17 }, +/* 3902 */ { MAD_F(0x077fb2d5) /* 0.468676409 */, 17 }, +/* 3903 */ { MAD_F(0x07805ac5) /* 0.468836565 */, 17 }, + +/* 3904 */ { MAD_F(0x078102b8) /* 0.468996735 */, 17 }, +/* 3905 */ { MAD_F(0x0781aaaf) /* 0.469156918 */, 17 }, +/* 3906 */ { MAD_F(0x078252aa) /* 0.469317115 */, 17 }, +/* 3907 */ { MAD_F(0x0782faa8) /* 0.469477326 */, 17 }, +/* 3908 */ { MAD_F(0x0783a2aa) /* 0.469637550 */, 17 }, +/* 3909 */ { MAD_F(0x07844aaf) /* 0.469797788 */, 17 }, +/* 3910 */ { MAD_F(0x0784f2b8) /* 0.469958040 */, 17 }, +/* 3911 */ { MAD_F(0x07859ac5) /* 0.470118305 */, 17 }, +/* 3912 */ { MAD_F(0x078642d6) /* 0.470278584 */, 17 }, +/* 3913 */ { MAD_F(0x0786eaea) /* 0.470438877 */, 17 }, +/* 3914 */ { MAD_F(0x07879302) /* 0.470599183 */, 17 }, +/* 3915 */ { MAD_F(0x07883b1e) /* 0.470759503 */, 17 }, +/* 3916 */ { MAD_F(0x0788e33d) /* 0.470919836 */, 17 }, +/* 3917 */ { MAD_F(0x07898b60) /* 0.471080184 */, 17 }, +/* 3918 */ { MAD_F(0x078a3386) /* 0.471240545 */, 17 }, +/* 3919 */ { MAD_F(0x078adbb0) /* 0.471400919 */, 17 }, + +/* 3920 */ { MAD_F(0x078b83de) /* 0.471561307 */, 17 }, +/* 3921 */ { MAD_F(0x078c2c10) /* 0.471721709 */, 17 }, +/* 3922 */ { MAD_F(0x078cd445) /* 0.471882125 */, 17 }, +/* 3923 */ { MAD_F(0x078d7c7e) /* 0.472042554 */, 17 }, +/* 3924 */ { MAD_F(0x078e24ba) /* 0.472202996 */, 17 }, +/* 3925 */ { MAD_F(0x078eccfb) /* 0.472363453 */, 17 }, +/* 3926 */ { MAD_F(0x078f753e) /* 0.472523923 */, 17 }, +/* 3927 */ { MAD_F(0x07901d86) /* 0.472684406 */, 17 }, +/* 3928 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 17 }, +/* 3929 */ { MAD_F(0x07916e20) /* 0.473005414 */, 17 }, +/* 3930 */ { MAD_F(0x07921672) /* 0.473165939 */, 17 }, +/* 3931 */ { MAD_F(0x0792bec8) /* 0.473326477 */, 17 }, +/* 3932 */ { MAD_F(0x07936722) /* 0.473487029 */, 17 }, +/* 3933 */ { MAD_F(0x07940f80) /* 0.473647594 */, 17 }, +/* 3934 */ { MAD_F(0x0794b7e1) /* 0.473808173 */, 17 }, +/* 3935 */ { MAD_F(0x07956045) /* 0.473968765 */, 17 }, + +/* 3936 */ { MAD_F(0x079608ae) /* 0.474129372 */, 17 }, +/* 3937 */ { MAD_F(0x0796b11a) /* 0.474289991 */, 17 }, +/* 3938 */ { MAD_F(0x0797598a) /* 0.474450625 */, 17 }, +/* 3939 */ { MAD_F(0x079801fd) /* 0.474611272 */, 17 }, +/* 3940 */ { MAD_F(0x0798aa74) /* 0.474771932 */, 17 }, +/* 3941 */ { MAD_F(0x079952ee) /* 0.474932606 */, 17 }, +/* 3942 */ { MAD_F(0x0799fb6d) /* 0.475093294 */, 17 }, +/* 3943 */ { MAD_F(0x079aa3ef) /* 0.475253995 */, 17 }, +/* 3944 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 17 }, +/* 3945 */ { MAD_F(0x079bf4fd) /* 0.475575439 */, 17 }, +/* 3946 */ { MAD_F(0x079c9d8a) /* 0.475736181 */, 17 }, +/* 3947 */ { MAD_F(0x079d461b) /* 0.475896936 */, 17 }, +/* 3948 */ { MAD_F(0x079deeaf) /* 0.476057705 */, 17 }, +/* 3949 */ { MAD_F(0x079e9747) /* 0.476218488 */, 17 }, +/* 3950 */ { MAD_F(0x079f3fe2) /* 0.476379285 */, 17 }, +/* 3951 */ { MAD_F(0x079fe881) /* 0.476540095 */, 17 }, + +/* 3952 */ { MAD_F(0x07a09124) /* 0.476700918 */, 17 }, +/* 3953 */ { MAD_F(0x07a139ca) /* 0.476861755 */, 17 }, +/* 3954 */ { MAD_F(0x07a1e274) /* 0.477022606 */, 17 }, +/* 3955 */ { MAD_F(0x07a28b22) /* 0.477183470 */, 17 }, +/* 3956 */ { MAD_F(0x07a333d3) /* 0.477344348 */, 17 }, +/* 3957 */ { MAD_F(0x07a3dc88) /* 0.477505239 */, 17 }, +/* 3958 */ { MAD_F(0x07a48541) /* 0.477666144 */, 17 }, +/* 3959 */ { MAD_F(0x07a52dfd) /* 0.477827062 */, 17 }, +/* 3960 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 17 }, +/* 3961 */ { MAD_F(0x07a67f80) /* 0.478148940 */, 17 }, +/* 3962 */ { MAD_F(0x07a72847) /* 0.478309899 */, 17 }, +/* 3963 */ { MAD_F(0x07a7d112) /* 0.478470871 */, 17 }, +/* 3964 */ { MAD_F(0x07a879e1) /* 0.478631857 */, 17 }, +/* 3965 */ { MAD_F(0x07a922b3) /* 0.478792857 */, 17 }, +/* 3966 */ { MAD_F(0x07a9cb88) /* 0.478953870 */, 17 }, +/* 3967 */ { MAD_F(0x07aa7462) /* 0.479114897 */, 17 }, + +/* 3968 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 17 }, +/* 3969 */ { MAD_F(0x07abc61f) /* 0.479436991 */, 17 }, +/* 3970 */ { MAD_F(0x07ac6f03) /* 0.479598058 */, 17 }, +/* 3971 */ { MAD_F(0x07ad17eb) /* 0.479759139 */, 17 }, +/* 3972 */ { MAD_F(0x07adc0d6) /* 0.479920233 */, 17 }, +/* 3973 */ { MAD_F(0x07ae69c6) /* 0.480081341 */, 17 }, +/* 3974 */ { MAD_F(0x07af12b8) /* 0.480242463 */, 17 }, +/* 3975 */ { MAD_F(0x07afbbaf) /* 0.480403598 */, 17 }, +/* 3976 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 17 }, +/* 3977 */ { MAD_F(0x07b10da6) /* 0.480725908 */, 17 }, +/* 3978 */ { MAD_F(0x07b1b6a7) /* 0.480887083 */, 17 }, +/* 3979 */ { MAD_F(0x07b25fac) /* 0.481048272 */, 17 }, +/* 3980 */ { MAD_F(0x07b308b5) /* 0.481209475 */, 17 }, +/* 3981 */ { MAD_F(0x07b3b1c1) /* 0.481370691 */, 17 }, +/* 3982 */ { MAD_F(0x07b45ad0) /* 0.481531920 */, 17 }, +/* 3983 */ { MAD_F(0x07b503e4) /* 0.481693163 */, 17 }, + +/* 3984 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 17 }, +/* 3985 */ { MAD_F(0x07b65615) /* 0.482015690 */, 17 }, +/* 3986 */ { MAD_F(0x07b6ff33) /* 0.482176973 */, 17 }, +/* 3987 */ { MAD_F(0x07b7a855) /* 0.482338270 */, 17 }, +/* 3988 */ { MAD_F(0x07b8517b) /* 0.482499580 */, 17 }, +/* 3989 */ { MAD_F(0x07b8faa4) /* 0.482660904 */, 17 }, +/* 3990 */ { MAD_F(0x07b9a3d0) /* 0.482822242 */, 17 }, +/* 3991 */ { MAD_F(0x07ba4d01) /* 0.482983592 */, 17 }, +/* 3992 */ { MAD_F(0x07baf635) /* 0.483144957 */, 17 }, +/* 3993 */ { MAD_F(0x07bb9f6c) /* 0.483306335 */, 17 }, +/* 3994 */ { MAD_F(0x07bc48a7) /* 0.483467726 */, 17 }, +/* 3995 */ { MAD_F(0x07bcf1e6) /* 0.483629131 */, 17 }, +/* 3996 */ { MAD_F(0x07bd9b28) /* 0.483790549 */, 17 }, +/* 3997 */ { MAD_F(0x07be446e) /* 0.483951980 */, 17 }, +/* 3998 */ { MAD_F(0x07beedb8) /* 0.484113426 */, 17 }, +/* 3999 */ { MAD_F(0x07bf9705) /* 0.484274884 */, 17 }, + +/* 4000 */ { MAD_F(0x07c04056) /* 0.484436356 */, 17 }, +/* 4001 */ { MAD_F(0x07c0e9aa) /* 0.484597842 */, 17 }, +/* 4002 */ { MAD_F(0x07c19302) /* 0.484759341 */, 17 }, +/* 4003 */ { MAD_F(0x07c23c5e) /* 0.484920853 */, 17 }, +/* 4004 */ { MAD_F(0x07c2e5bd) /* 0.485082379 */, 17 }, +/* 4005 */ { MAD_F(0x07c38f20) /* 0.485243918 */, 17 }, +/* 4006 */ { MAD_F(0x07c43887) /* 0.485405471 */, 17 }, +/* 4007 */ { MAD_F(0x07c4e1f1) /* 0.485567037 */, 17 }, +/* 4008 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 17 }, +/* 4009 */ { MAD_F(0x07c634d0) /* 0.485890210 */, 17 }, +/* 4010 */ { MAD_F(0x07c6de45) /* 0.486051817 */, 17 }, +/* 4011 */ { MAD_F(0x07c787bd) /* 0.486213436 */, 17 }, +/* 4012 */ { MAD_F(0x07c83139) /* 0.486375070 */, 17 }, +/* 4013 */ { MAD_F(0x07c8dab9) /* 0.486536717 */, 17 }, +/* 4014 */ { MAD_F(0x07c9843c) /* 0.486698377 */, 17 }, +/* 4015 */ { MAD_F(0x07ca2dc3) /* 0.486860051 */, 17 }, + +/* 4016 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 17 }, +/* 4017 */ { MAD_F(0x07cb80dc) /* 0.487183438 */, 17 }, +/* 4018 */ { MAD_F(0x07cc2a6e) /* 0.487345152 */, 17 }, +/* 4019 */ { MAD_F(0x07ccd403) /* 0.487506879 */, 17 }, +/* 4020 */ { MAD_F(0x07cd7d9c) /* 0.487668620 */, 17 }, +/* 4021 */ { MAD_F(0x07ce2739) /* 0.487830374 */, 17 }, +/* 4022 */ { MAD_F(0x07ced0d9) /* 0.487992142 */, 17 }, +/* 4023 */ { MAD_F(0x07cf7a7d) /* 0.488153923 */, 17 }, +/* 4024 */ { MAD_F(0x07d02424) /* 0.488315717 */, 17 }, +/* 4025 */ { MAD_F(0x07d0cdcf) /* 0.488477525 */, 17 }, +/* 4026 */ { MAD_F(0x07d1777e) /* 0.488639346 */, 17 }, +/* 4027 */ { MAD_F(0x07d22130) /* 0.488801181 */, 17 }, +/* 4028 */ { MAD_F(0x07d2cae5) /* 0.488963029 */, 17 }, +/* 4029 */ { MAD_F(0x07d3749f) /* 0.489124890 */, 17 }, +/* 4030 */ { MAD_F(0x07d41e5c) /* 0.489286765 */, 17 }, +/* 4031 */ { MAD_F(0x07d4c81c) /* 0.489448653 */, 17 }, + +/* 4032 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 17 }, +/* 4033 */ { MAD_F(0x07d61ba8) /* 0.489772470 */, 17 }, +/* 4034 */ { MAD_F(0x07d6c573) /* 0.489934398 */, 17 }, +/* 4035 */ { MAD_F(0x07d76f42) /* 0.490096340 */, 17 }, +/* 4036 */ { MAD_F(0x07d81915) /* 0.490258295 */, 17 }, +/* 4037 */ { MAD_F(0x07d8c2eb) /* 0.490420263 */, 17 }, +/* 4038 */ { MAD_F(0x07d96cc4) /* 0.490582245 */, 17 }, +/* 4039 */ { MAD_F(0x07da16a2) /* 0.490744240 */, 17 }, +/* 4040 */ { MAD_F(0x07dac083) /* 0.490906249 */, 17 }, +/* 4041 */ { MAD_F(0x07db6a67) /* 0.491068271 */, 17 }, +/* 4042 */ { MAD_F(0x07dc144f) /* 0.491230306 */, 17 }, +/* 4043 */ { MAD_F(0x07dcbe3b) /* 0.491392355 */, 17 }, +/* 4044 */ { MAD_F(0x07dd682a) /* 0.491554417 */, 17 }, +/* 4045 */ { MAD_F(0x07de121d) /* 0.491716492 */, 17 }, +/* 4046 */ { MAD_F(0x07debc13) /* 0.491878581 */, 17 }, +/* 4047 */ { MAD_F(0x07df660d) /* 0.492040683 */, 17 }, + +/* 4048 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 17 }, +/* 4049 */ { MAD_F(0x07e0ba0c) /* 0.492364928 */, 17 }, +/* 4050 */ { MAD_F(0x07e16410) /* 0.492527070 */, 17 }, +/* 4051 */ { MAD_F(0x07e20e19) /* 0.492689225 */, 17 }, +/* 4052 */ { MAD_F(0x07e2b824) /* 0.492851394 */, 17 }, +/* 4053 */ { MAD_F(0x07e36234) /* 0.493013576 */, 17 }, +/* 4054 */ { MAD_F(0x07e40c47) /* 0.493175772 */, 17 }, +/* 4055 */ { MAD_F(0x07e4b65e) /* 0.493337981 */, 17 }, +/* 4056 */ { MAD_F(0x07e56078) /* 0.493500203 */, 17 }, +/* 4057 */ { MAD_F(0x07e60a95) /* 0.493662438 */, 17 }, +/* 4058 */ { MAD_F(0x07e6b4b7) /* 0.493824687 */, 17 }, +/* 4059 */ { MAD_F(0x07e75edc) /* 0.493986949 */, 17 }, +/* 4060 */ { MAD_F(0x07e80904) /* 0.494149225 */, 17 }, +/* 4061 */ { MAD_F(0x07e8b330) /* 0.494311514 */, 17 }, +/* 4062 */ { MAD_F(0x07e95d60) /* 0.494473816 */, 17 }, +/* 4063 */ { MAD_F(0x07ea0793) /* 0.494636131 */, 17 }, + +/* 4064 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 17 }, +/* 4065 */ { MAD_F(0x07eb5c04) /* 0.494960802 */, 17 }, +/* 4066 */ { MAD_F(0x07ec0642) /* 0.495123158 */, 17 }, +/* 4067 */ { MAD_F(0x07ecb084) /* 0.495285526 */, 17 }, +/* 4068 */ { MAD_F(0x07ed5ac9) /* 0.495447908 */, 17 }, +/* 4069 */ { MAD_F(0x07ee0512) /* 0.495610304 */, 17 }, +/* 4070 */ { MAD_F(0x07eeaf5e) /* 0.495772712 */, 17 }, +/* 4071 */ { MAD_F(0x07ef59ae) /* 0.495935134 */, 17 }, +/* 4072 */ { MAD_F(0x07f00401) /* 0.496097570 */, 17 }, +/* 4073 */ { MAD_F(0x07f0ae58) /* 0.496260018 */, 17 }, +/* 4074 */ { MAD_F(0x07f158b3) /* 0.496422480 */, 17 }, +/* 4075 */ { MAD_F(0x07f20311) /* 0.496584955 */, 17 }, +/* 4076 */ { MAD_F(0x07f2ad72) /* 0.496747444 */, 17 }, +/* 4077 */ { MAD_F(0x07f357d8) /* 0.496909945 */, 17 }, +/* 4078 */ { MAD_F(0x07f40240) /* 0.497072460 */, 17 }, +/* 4079 */ { MAD_F(0x07f4acad) /* 0.497234989 */, 17 }, + +/* 4080 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 17 }, +/* 4081 */ { MAD_F(0x07f60190) /* 0.497560085 */, 17 }, +/* 4082 */ { MAD_F(0x07f6ac07) /* 0.497722653 */, 17 }, +/* 4083 */ { MAD_F(0x07f75682) /* 0.497885235 */, 17 }, +/* 4084 */ { MAD_F(0x07f80100) /* 0.498047829 */, 17 }, +/* 4085 */ { MAD_F(0x07f8ab82) /* 0.498210437 */, 17 }, +/* 4086 */ { MAD_F(0x07f95607) /* 0.498373058 */, 17 }, +/* 4087 */ { MAD_F(0x07fa0090) /* 0.498535693 */, 17 }, +/* 4088 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 17 }, +/* 4089 */ { MAD_F(0x07fb55ac) /* 0.498861002 */, 17 }, +/* 4090 */ { MAD_F(0x07fc0040) /* 0.499023676 */, 17 }, +/* 4091 */ { MAD_F(0x07fcaad7) /* 0.499186364 */, 17 }, +/* 4092 */ { MAD_F(0x07fd5572) /* 0.499349064 */, 17 }, +/* 4093 */ { MAD_F(0x07fe0010) /* 0.499511778 */, 17 }, +/* 4094 */ { MAD_F(0x07feaab2) /* 0.499674506 */, 17 }, +/* 4095 */ { MAD_F(0x07ff5557) /* 0.499837246 */, 17 }, + +/* 4096 */ { MAD_F(0x04000000) /* 0.250000000 */, 18 }, +/* 4097 */ { MAD_F(0x04005556) /* 0.250081384 */, 18 }, +/* 4098 */ { MAD_F(0x0400aaae) /* 0.250162774 */, 18 }, +/* 4099 */ { MAD_F(0x04010008) /* 0.250244170 */, 18 }, +/* 4100 */ { MAD_F(0x04015563) /* 0.250325574 */, 18 }, +/* 4101 */ { MAD_F(0x0401aac1) /* 0.250406984 */, 18 }, +/* 4102 */ { MAD_F(0x04020020) /* 0.250488400 */, 18 }, +/* 4103 */ { MAD_F(0x04025581) /* 0.250569824 */, 18 }, +/* 4104 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 18 }, +/* 4105 */ { MAD_F(0x04030048) /* 0.250732690 */, 18 }, +/* 4106 */ { MAD_F(0x040355ae) /* 0.250814133 */, 18 }, +/* 4107 */ { MAD_F(0x0403ab16) /* 0.250895583 */, 18 }, +/* 4108 */ { MAD_F(0x04040080) /* 0.250977039 */, 18 }, +/* 4109 */ { MAD_F(0x040455eb) /* 0.251058502 */, 18 }, +/* 4110 */ { MAD_F(0x0404ab59) /* 0.251139971 */, 18 }, +/* 4111 */ { MAD_F(0x040500c8) /* 0.251221448 */, 18 }, + +/* 4112 */ { MAD_F(0x04055638) /* 0.251302930 */, 18 }, +/* 4113 */ { MAD_F(0x0405abab) /* 0.251384420 */, 18 }, +/* 4114 */ { MAD_F(0x0406011f) /* 0.251465916 */, 18 }, +/* 4115 */ { MAD_F(0x04065696) /* 0.251547418 */, 18 }, +/* 4116 */ { MAD_F(0x0406ac0e) /* 0.251628927 */, 18 }, +/* 4117 */ { MAD_F(0x04070187) /* 0.251710443 */, 18 }, +/* 4118 */ { MAD_F(0x04075703) /* 0.251791965 */, 18 }, +/* 4119 */ { MAD_F(0x0407ac80) /* 0.251873494 */, 18 }, +/* 4120 */ { MAD_F(0x040801ff) /* 0.251955030 */, 18 }, +/* 4121 */ { MAD_F(0x04085780) /* 0.252036572 */, 18 }, +/* 4122 */ { MAD_F(0x0408ad02) /* 0.252118121 */, 18 }, +/* 4123 */ { MAD_F(0x04090287) /* 0.252199676 */, 18 }, +/* 4124 */ { MAD_F(0x0409580d) /* 0.252281238 */, 18 }, +/* 4125 */ { MAD_F(0x0409ad95) /* 0.252362807 */, 18 }, +/* 4126 */ { MAD_F(0x040a031e) /* 0.252444382 */, 18 }, +/* 4127 */ { MAD_F(0x040a58aa) /* 0.252525963 */, 18 }, + +/* 4128 */ { MAD_F(0x040aae37) /* 0.252607552 */, 18 }, +/* 4129 */ { MAD_F(0x040b03c6) /* 0.252689147 */, 18 }, +/* 4130 */ { MAD_F(0x040b5957) /* 0.252770748 */, 18 }, +/* 4131 */ { MAD_F(0x040baee9) /* 0.252852356 */, 18 }, +/* 4132 */ { MAD_F(0x040c047e) /* 0.252933971 */, 18 }, +/* 4133 */ { MAD_F(0x040c5a14) /* 0.253015592 */, 18 }, +/* 4134 */ { MAD_F(0x040cafab) /* 0.253097220 */, 18 }, +/* 4135 */ { MAD_F(0x040d0545) /* 0.253178854 */, 18 }, +/* 4136 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 18 }, +/* 4137 */ { MAD_F(0x040db07d) /* 0.253342143 */, 18 }, +/* 4138 */ { MAD_F(0x040e061c) /* 0.253423797 */, 18 }, +/* 4139 */ { MAD_F(0x040e5bbd) /* 0.253505457 */, 18 }, +/* 4140 */ { MAD_F(0x040eb15f) /* 0.253587125 */, 18 }, +/* 4141 */ { MAD_F(0x040f0703) /* 0.253668799 */, 18 }, +/* 4142 */ { MAD_F(0x040f5ca9) /* 0.253750479 */, 18 }, +/* 4143 */ { MAD_F(0x040fb251) /* 0.253832166 */, 18 }, + +/* 4144 */ { MAD_F(0x041007fa) /* 0.253913860 */, 18 }, +/* 4145 */ { MAD_F(0x04105da6) /* 0.253995560 */, 18 }, +/* 4146 */ { MAD_F(0x0410b353) /* 0.254077266 */, 18 }, +/* 4147 */ { MAD_F(0x04110901) /* 0.254158980 */, 18 }, +/* 4148 */ { MAD_F(0x04115eb2) /* 0.254240700 */, 18 }, +/* 4149 */ { MAD_F(0x0411b464) /* 0.254322426 */, 18 }, +/* 4150 */ { MAD_F(0x04120a18) /* 0.254404159 */, 18 }, +/* 4151 */ { MAD_F(0x04125fce) /* 0.254485899 */, 18 }, +/* 4152 */ { MAD_F(0x0412b586) /* 0.254567645 */, 18 }, +/* 4153 */ { MAD_F(0x04130b3f) /* 0.254649397 */, 18 }, +/* 4154 */ { MAD_F(0x041360fa) /* 0.254731157 */, 18 }, +/* 4155 */ { MAD_F(0x0413b6b7) /* 0.254812922 */, 18 }, +/* 4156 */ { MAD_F(0x04140c75) /* 0.254894695 */, 18 }, +/* 4157 */ { MAD_F(0x04146236) /* 0.254976474 */, 18 }, +/* 4158 */ { MAD_F(0x0414b7f8) /* 0.255058259 */, 18 }, +/* 4159 */ { MAD_F(0x04150dbc) /* 0.255140051 */, 18 }, + +/* 4160 */ { MAD_F(0x04156381) /* 0.255221850 */, 18 }, +/* 4161 */ { MAD_F(0x0415b949) /* 0.255303655 */, 18 }, +/* 4162 */ { MAD_F(0x04160f12) /* 0.255385467 */, 18 }, +/* 4163 */ { MAD_F(0x041664dd) /* 0.255467285 */, 18 }, +/* 4164 */ { MAD_F(0x0416baaa) /* 0.255549110 */, 18 }, +/* 4165 */ { MAD_F(0x04171078) /* 0.255630941 */, 18 }, +/* 4166 */ { MAD_F(0x04176648) /* 0.255712779 */, 18 }, +/* 4167 */ { MAD_F(0x0417bc1a) /* 0.255794624 */, 18 }, +/* 4168 */ { MAD_F(0x041811ee) /* 0.255876475 */, 18 }, +/* 4169 */ { MAD_F(0x041867c3) /* 0.255958332 */, 18 }, +/* 4170 */ { MAD_F(0x0418bd9b) /* 0.256040196 */, 18 }, +/* 4171 */ { MAD_F(0x04191374) /* 0.256122067 */, 18 }, +/* 4172 */ { MAD_F(0x0419694e) /* 0.256203944 */, 18 }, +/* 4173 */ { MAD_F(0x0419bf2b) /* 0.256285828 */, 18 }, +/* 4174 */ { MAD_F(0x041a1509) /* 0.256367718 */, 18 }, +/* 4175 */ { MAD_F(0x041a6ae9) /* 0.256449615 */, 18 }, + +/* 4176 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 18 }, +/* 4177 */ { MAD_F(0x041b16ae) /* 0.256613428 */, 18 }, +/* 4178 */ { MAD_F(0x041b6c94) /* 0.256695344 */, 18 }, +/* 4179 */ { MAD_F(0x041bc27b) /* 0.256777267 */, 18 }, +/* 4180 */ { MAD_F(0x041c1863) /* 0.256859197 */, 18 }, +/* 4181 */ { MAD_F(0x041c6e4e) /* 0.256941133 */, 18 }, +/* 4182 */ { MAD_F(0x041cc43a) /* 0.257023076 */, 18 }, +/* 4183 */ { MAD_F(0x041d1a28) /* 0.257105025 */, 18 }, +/* 4184 */ { MAD_F(0x041d7018) /* 0.257186980 */, 18 }, +/* 4185 */ { MAD_F(0x041dc60a) /* 0.257268942 */, 18 }, +/* 4186 */ { MAD_F(0x041e1bfd) /* 0.257350911 */, 18 }, +/* 4187 */ { MAD_F(0x041e71f2) /* 0.257432886 */, 18 }, +/* 4188 */ { MAD_F(0x041ec7e9) /* 0.257514868 */, 18 }, +/* 4189 */ { MAD_F(0x041f1de1) /* 0.257596856 */, 18 }, +/* 4190 */ { MAD_F(0x041f73dc) /* 0.257678851 */, 18 }, +/* 4191 */ { MAD_F(0x041fc9d8) /* 0.257760852 */, 18 }, + +/* 4192 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 18 }, +/* 4193 */ { MAD_F(0x042075d5) /* 0.257924875 */, 18 }, +/* 4194 */ { MAD_F(0x0420cbd6) /* 0.258006895 */, 18 }, +/* 4195 */ { MAD_F(0x042121d9) /* 0.258088923 */, 18 }, +/* 4196 */ { MAD_F(0x042177de) /* 0.258170957 */, 18 }, +/* 4197 */ { MAD_F(0x0421cde5) /* 0.258252997 */, 18 }, +/* 4198 */ { MAD_F(0x042223ed) /* 0.258335044 */, 18 }, +/* 4199 */ { MAD_F(0x042279f7) /* 0.258417097 */, 18 }, +/* 4200 */ { MAD_F(0x0422d003) /* 0.258499157 */, 18 }, +/* 4201 */ { MAD_F(0x04232611) /* 0.258581224 */, 18 }, +/* 4202 */ { MAD_F(0x04237c20) /* 0.258663297 */, 18 }, +/* 4203 */ { MAD_F(0x0423d231) /* 0.258745376 */, 18 }, +/* 4204 */ { MAD_F(0x04242844) /* 0.258827462 */, 18 }, +/* 4205 */ { MAD_F(0x04247e58) /* 0.258909555 */, 18 }, +/* 4206 */ { MAD_F(0x0424d46e) /* 0.258991654 */, 18 }, +/* 4207 */ { MAD_F(0x04252a87) /* 0.259073760 */, 18 }, + +/* 4208 */ { MAD_F(0x042580a0) /* 0.259155872 */, 18 }, +/* 4209 */ { MAD_F(0x0425d6bc) /* 0.259237990 */, 18 }, +/* 4210 */ { MAD_F(0x04262cd9) /* 0.259320115 */, 18 }, +/* 4211 */ { MAD_F(0x042682f8) /* 0.259402247 */, 18 }, +/* 4212 */ { MAD_F(0x0426d919) /* 0.259484385 */, 18 }, +/* 4213 */ { MAD_F(0x04272f3b) /* 0.259566529 */, 18 }, +/* 4214 */ { MAD_F(0x04278560) /* 0.259648680 */, 18 }, +/* 4215 */ { MAD_F(0x0427db86) /* 0.259730838 */, 18 }, +/* 4216 */ { MAD_F(0x042831ad) /* 0.259813002 */, 18 }, +/* 4217 */ { MAD_F(0x042887d7) /* 0.259895173 */, 18 }, +/* 4218 */ { MAD_F(0x0428de02) /* 0.259977350 */, 18 }, +/* 4219 */ { MAD_F(0x0429342f) /* 0.260059533 */, 18 }, +/* 4220 */ { MAD_F(0x04298a5e) /* 0.260141723 */, 18 }, +/* 4221 */ { MAD_F(0x0429e08e) /* 0.260223920 */, 18 }, +/* 4222 */ { MAD_F(0x042a36c0) /* 0.260306123 */, 18 }, +/* 4223 */ { MAD_F(0x042a8cf4) /* 0.260388332 */, 18 }, + +/* 4224 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 18 }, +/* 4225 */ { MAD_F(0x042b3962) /* 0.260552771 */, 18 }, +/* 4226 */ { MAD_F(0x042b8f9b) /* 0.260635000 */, 18 }, +/* 4227 */ { MAD_F(0x042be5d6) /* 0.260717235 */, 18 }, +/* 4228 */ { MAD_F(0x042c3c12) /* 0.260799477 */, 18 }, +/* 4229 */ { MAD_F(0x042c9251) /* 0.260881725 */, 18 }, +/* 4230 */ { MAD_F(0x042ce891) /* 0.260963980 */, 18 }, +/* 4231 */ { MAD_F(0x042d3ed3) /* 0.261046242 */, 18 }, +/* 4232 */ { MAD_F(0x042d9516) /* 0.261128510 */, 18 }, +/* 4233 */ { MAD_F(0x042deb5c) /* 0.261210784 */, 18 }, +/* 4234 */ { MAD_F(0x042e41a3) /* 0.261293065 */, 18 }, +/* 4235 */ { MAD_F(0x042e97ec) /* 0.261375352 */, 18 }, +/* 4236 */ { MAD_F(0x042eee36) /* 0.261457646 */, 18 }, +/* 4237 */ { MAD_F(0x042f4482) /* 0.261539946 */, 18 }, +/* 4238 */ { MAD_F(0x042f9ad1) /* 0.261622253 */, 18 }, +/* 4239 */ { MAD_F(0x042ff120) /* 0.261704566 */, 18 }, + +/* 4240 */ { MAD_F(0x04304772) /* 0.261786886 */, 18 }, +/* 4241 */ { MAD_F(0x04309dc5) /* 0.261869212 */, 18 }, +/* 4242 */ { MAD_F(0x0430f41a) /* 0.261951545 */, 18 }, +/* 4243 */ { MAD_F(0x04314a71) /* 0.262033884 */, 18 }, +/* 4244 */ { MAD_F(0x0431a0c9) /* 0.262116229 */, 18 }, +/* 4245 */ { MAD_F(0x0431f723) /* 0.262198581 */, 18 }, +/* 4246 */ { MAD_F(0x04324d7f) /* 0.262280940 */, 18 }, +/* 4247 */ { MAD_F(0x0432a3dd) /* 0.262363305 */, 18 }, +/* 4248 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 18 }, +/* 4249 */ { MAD_F(0x0433509e) /* 0.262528054 */, 18 }, +/* 4250 */ { MAD_F(0x0433a701) /* 0.262610438 */, 18 }, +/* 4251 */ { MAD_F(0x0433fd65) /* 0.262692829 */, 18 }, +/* 4252 */ { MAD_F(0x043453cc) /* 0.262775227 */, 18 }, +/* 4253 */ { MAD_F(0x0434aa34) /* 0.262857630 */, 18 }, +/* 4254 */ { MAD_F(0x0435009d) /* 0.262940040 */, 18 }, +/* 4255 */ { MAD_F(0x04355709) /* 0.263022457 */, 18 }, + +/* 4256 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 18 }, +/* 4257 */ { MAD_F(0x043603e5) /* 0.263187310 */, 18 }, +/* 4258 */ { MAD_F(0x04365a56) /* 0.263269746 */, 18 }, +/* 4259 */ { MAD_F(0x0436b0c9) /* 0.263352188 */, 18 }, +/* 4260 */ { MAD_F(0x0437073d) /* 0.263434637 */, 18 }, +/* 4261 */ { MAD_F(0x04375db3) /* 0.263517093 */, 18 }, +/* 4262 */ { MAD_F(0x0437b42a) /* 0.263599554 */, 18 }, +/* 4263 */ { MAD_F(0x04380aa4) /* 0.263682023 */, 18 }, +/* 4264 */ { MAD_F(0x0438611f) /* 0.263764497 */, 18 }, +/* 4265 */ { MAD_F(0x0438b79c) /* 0.263846979 */, 18 }, +/* 4266 */ { MAD_F(0x04390e1a) /* 0.263929466 */, 18 }, +/* 4267 */ { MAD_F(0x0439649b) /* 0.264011960 */, 18 }, +/* 4268 */ { MAD_F(0x0439bb1d) /* 0.264094461 */, 18 }, +/* 4269 */ { MAD_F(0x043a11a1) /* 0.264176968 */, 18 }, +/* 4270 */ { MAD_F(0x043a6826) /* 0.264259481 */, 18 }, +/* 4271 */ { MAD_F(0x043abead) /* 0.264342001 */, 18 }, + +/* 4272 */ { MAD_F(0x043b1536) /* 0.264424527 */, 18 }, +/* 4273 */ { MAD_F(0x043b6bc1) /* 0.264507060 */, 18 }, +/* 4274 */ { MAD_F(0x043bc24d) /* 0.264589599 */, 18 }, +/* 4275 */ { MAD_F(0x043c18dc) /* 0.264672145 */, 18 }, +/* 4276 */ { MAD_F(0x043c6f6c) /* 0.264754697 */, 18 }, +/* 4277 */ { MAD_F(0x043cc5fd) /* 0.264837255 */, 18 }, +/* 4278 */ { MAD_F(0x043d1c91) /* 0.264919820 */, 18 }, +/* 4279 */ { MAD_F(0x043d7326) /* 0.265002392 */, 18 }, +/* 4280 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 18 }, +/* 4281 */ { MAD_F(0x043e2055) /* 0.265167554 */, 18 }, +/* 4282 */ { MAD_F(0x043e76ef) /* 0.265250144 */, 18 }, +/* 4283 */ { MAD_F(0x043ecd8b) /* 0.265332741 */, 18 }, +/* 4284 */ { MAD_F(0x043f2429) /* 0.265415345 */, 18 }, +/* 4285 */ { MAD_F(0x043f7ac8) /* 0.265497955 */, 18 }, +/* 4286 */ { MAD_F(0x043fd169) /* 0.265580571 */, 18 }, +/* 4287 */ { MAD_F(0x0440280c) /* 0.265663194 */, 18 }, + +/* 4288 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 18 }, +/* 4289 */ { MAD_F(0x0440d557) /* 0.265828459 */, 18 }, +/* 4290 */ { MAD_F(0x04412bff) /* 0.265911101 */, 18 }, +/* 4291 */ { MAD_F(0x044182a9) /* 0.265993749 */, 18 }, +/* 4292 */ { MAD_F(0x0441d955) /* 0.266076404 */, 18 }, +/* 4293 */ { MAD_F(0x04423002) /* 0.266159065 */, 18 }, +/* 4294 */ { MAD_F(0x044286b1) /* 0.266241733 */, 18 }, +/* 4295 */ { MAD_F(0x0442dd61) /* 0.266324407 */, 18 }, +/* 4296 */ { MAD_F(0x04433414) /* 0.266407088 */, 18 }, +/* 4297 */ { MAD_F(0x04438ac8) /* 0.266489775 */, 18 }, +/* 4298 */ { MAD_F(0x0443e17e) /* 0.266572468 */, 18 }, +/* 4299 */ { MAD_F(0x04443835) /* 0.266655168 */, 18 }, +/* 4300 */ { MAD_F(0x04448eef) /* 0.266737874 */, 18 }, +/* 4301 */ { MAD_F(0x0444e5aa) /* 0.266820587 */, 18 }, +/* 4302 */ { MAD_F(0x04453c66) /* 0.266903306 */, 18 }, +/* 4303 */ { MAD_F(0x04459325) /* 0.266986031 */, 18 }, + +/* 4304 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 18 }, +/* 4305 */ { MAD_F(0x044640a7) /* 0.267151501 */, 18 }, +/* 4306 */ { MAD_F(0x0446976a) /* 0.267234246 */, 18 }, +/* 4307 */ { MAD_F(0x0446ee30) /* 0.267316997 */, 18 }, +/* 4308 */ { MAD_F(0x044744f7) /* 0.267399755 */, 18 }, +/* 4309 */ { MAD_F(0x04479bc0) /* 0.267482518 */, 18 }, +/* 4310 */ { MAD_F(0x0447f28a) /* 0.267565289 */, 18 }, +/* 4311 */ { MAD_F(0x04484956) /* 0.267648065 */, 18 }, +/* 4312 */ { MAD_F(0x0448a024) /* 0.267730848 */, 18 }, +/* 4313 */ { MAD_F(0x0448f6f4) /* 0.267813638 */, 18 }, +/* 4314 */ { MAD_F(0x04494dc5) /* 0.267896434 */, 18 }, +/* 4315 */ { MAD_F(0x0449a498) /* 0.267979236 */, 18 }, +/* 4316 */ { MAD_F(0x0449fb6d) /* 0.268062045 */, 18 }, +/* 4317 */ { MAD_F(0x044a5243) /* 0.268144860 */, 18 }, +/* 4318 */ { MAD_F(0x044aa91c) /* 0.268227681 */, 18 }, +/* 4319 */ { MAD_F(0x044afff6) /* 0.268310509 */, 18 }, + +/* 4320 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 18 }, +/* 4321 */ { MAD_F(0x044badaf) /* 0.268476184 */, 18 }, +/* 4322 */ { MAD_F(0x044c048e) /* 0.268559031 */, 18 }, +/* 4323 */ { MAD_F(0x044c5b6f) /* 0.268641885 */, 18 }, +/* 4324 */ { MAD_F(0x044cb251) /* 0.268724744 */, 18 }, +/* 4325 */ { MAD_F(0x044d0935) /* 0.268807611 */, 18 }, +/* 4326 */ { MAD_F(0x044d601b) /* 0.268890483 */, 18 }, +/* 4327 */ { MAD_F(0x044db703) /* 0.268973362 */, 18 }, +/* 4328 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 18 }, +/* 4329 */ { MAD_F(0x044e64d7) /* 0.269139139 */, 18 }, +/* 4330 */ { MAD_F(0x044ebbc4) /* 0.269222037 */, 18 }, +/* 4331 */ { MAD_F(0x044f12b3) /* 0.269304942 */, 18 }, +/* 4332 */ { MAD_F(0x044f69a3) /* 0.269387853 */, 18 }, +/* 4333 */ { MAD_F(0x044fc095) /* 0.269470770 */, 18 }, +/* 4334 */ { MAD_F(0x04501788) /* 0.269553694 */, 18 }, +/* 4335 */ { MAD_F(0x04506e7e) /* 0.269636624 */, 18 }, + +/* 4336 */ { MAD_F(0x0450c575) /* 0.269719560 */, 18 }, +/* 4337 */ { MAD_F(0x04511c6e) /* 0.269802503 */, 18 }, +/* 4338 */ { MAD_F(0x04517368) /* 0.269885452 */, 18 }, +/* 4339 */ { MAD_F(0x0451ca64) /* 0.269968408 */, 18 }, +/* 4340 */ { MAD_F(0x04522162) /* 0.270051370 */, 18 }, +/* 4341 */ { MAD_F(0x04527862) /* 0.270134338 */, 18 }, +/* 4342 */ { MAD_F(0x0452cf63) /* 0.270217312 */, 18 }, +/* 4343 */ { MAD_F(0x04532666) /* 0.270300293 */, 18 }, +/* 4344 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 18 }, +/* 4345 */ { MAD_F(0x0453d472) /* 0.270466275 */, 18 }, +/* 4346 */ { MAD_F(0x04542b7a) /* 0.270549275 */, 18 }, +/* 4347 */ { MAD_F(0x04548284) /* 0.270632281 */, 18 }, +/* 4348 */ { MAD_F(0x0454d98f) /* 0.270715294 */, 18 }, +/* 4349 */ { MAD_F(0x0455309c) /* 0.270798313 */, 18 }, +/* 4350 */ { MAD_F(0x045587ab) /* 0.270881339 */, 18 }, +/* 4351 */ { MAD_F(0x0455debc) /* 0.270964371 */, 18 }, + +/* 4352 */ { MAD_F(0x045635cf) /* 0.271047409 */, 18 }, +/* 4353 */ { MAD_F(0x04568ce3) /* 0.271130454 */, 18 }, +/* 4354 */ { MAD_F(0x0456e3f9) /* 0.271213505 */, 18 }, +/* 4355 */ { MAD_F(0x04573b10) /* 0.271296562 */, 18 }, +/* 4356 */ { MAD_F(0x04579229) /* 0.271379626 */, 18 }, +/* 4357 */ { MAD_F(0x0457e944) /* 0.271462696 */, 18 }, +/* 4358 */ { MAD_F(0x04584061) /* 0.271545772 */, 18 }, +/* 4359 */ { MAD_F(0x0458977f) /* 0.271628855 */, 18 }, +/* 4360 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 18 }, +/* 4361 */ { MAD_F(0x045945c1) /* 0.271795040 */, 18 }, +/* 4362 */ { MAD_F(0x04599ce5) /* 0.271878142 */, 18 }, +/* 4363 */ { MAD_F(0x0459f40a) /* 0.271961250 */, 18 }, +/* 4364 */ { MAD_F(0x045a4b31) /* 0.272044365 */, 18 }, +/* 4365 */ { MAD_F(0x045aa259) /* 0.272127486 */, 18 }, +/* 4366 */ { MAD_F(0x045af984) /* 0.272210613 */, 18 }, +/* 4367 */ { MAD_F(0x045b50b0) /* 0.272293746 */, 18 }, + +/* 4368 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 18 }, +/* 4369 */ { MAD_F(0x045bff0d) /* 0.272460033 */, 18 }, +/* 4370 */ { MAD_F(0x045c563e) /* 0.272543185 */, 18 }, +/* 4371 */ { MAD_F(0x045cad71) /* 0.272626344 */, 18 }, +/* 4372 */ { MAD_F(0x045d04a5) /* 0.272709510 */, 18 }, +/* 4373 */ { MAD_F(0x045d5bdc) /* 0.272792681 */, 18 }, +/* 4374 */ { MAD_F(0x045db313) /* 0.272875859 */, 18 }, +/* 4375 */ { MAD_F(0x045e0a4d) /* 0.272959044 */, 18 }, +/* 4376 */ { MAD_F(0x045e6188) /* 0.273042234 */, 18 }, +/* 4377 */ { MAD_F(0x045eb8c5) /* 0.273125431 */, 18 }, +/* 4378 */ { MAD_F(0x045f1004) /* 0.273208635 */, 18 }, +/* 4379 */ { MAD_F(0x045f6745) /* 0.273291844 */, 18 }, +/* 4380 */ { MAD_F(0x045fbe87) /* 0.273375060 */, 18 }, +/* 4381 */ { MAD_F(0x046015cb) /* 0.273458283 */, 18 }, +/* 4382 */ { MAD_F(0x04606d10) /* 0.273541511 */, 18 }, +/* 4383 */ { MAD_F(0x0460c457) /* 0.273624747 */, 18 }, + +/* 4384 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 18 }, +/* 4385 */ { MAD_F(0x046172eb) /* 0.273791236 */, 18 }, +/* 4386 */ { MAD_F(0x0461ca37) /* 0.273874490 */, 18 }, +/* 4387 */ { MAD_F(0x04622185) /* 0.273957750 */, 18 }, +/* 4388 */ { MAD_F(0x046278d5) /* 0.274041017 */, 18 }, +/* 4389 */ { MAD_F(0x0462d026) /* 0.274124290 */, 18 }, +/* 4390 */ { MAD_F(0x0463277a) /* 0.274207569 */, 18 }, +/* 4391 */ { MAD_F(0x04637ece) /* 0.274290855 */, 18 }, +/* 4392 */ { MAD_F(0x0463d625) /* 0.274374147 */, 18 }, +/* 4393 */ { MAD_F(0x04642d7d) /* 0.274457445 */, 18 }, +/* 4394 */ { MAD_F(0x046484d7) /* 0.274540749 */, 18 }, +/* 4395 */ { MAD_F(0x0464dc33) /* 0.274624060 */, 18 }, +/* 4396 */ { MAD_F(0x04653390) /* 0.274707378 */, 18 }, +/* 4397 */ { MAD_F(0x04658aef) /* 0.274790701 */, 18 }, +/* 4398 */ { MAD_F(0x0465e250) /* 0.274874031 */, 18 }, +/* 4399 */ { MAD_F(0x046639b2) /* 0.274957367 */, 18 }, + +/* 4400 */ { MAD_F(0x04669116) /* 0.275040710 */, 18 }, +/* 4401 */ { MAD_F(0x0466e87c) /* 0.275124059 */, 18 }, +/* 4402 */ { MAD_F(0x04673fe3) /* 0.275207414 */, 18 }, +/* 4403 */ { MAD_F(0x0467974d) /* 0.275290775 */, 18 }, +/* 4404 */ { MAD_F(0x0467eeb7) /* 0.275374143 */, 18 }, +/* 4405 */ { MAD_F(0x04684624) /* 0.275457517 */, 18 }, +/* 4406 */ { MAD_F(0x04689d92) /* 0.275540897 */, 18 }, +/* 4407 */ { MAD_F(0x0468f502) /* 0.275624284 */, 18 }, +/* 4408 */ { MAD_F(0x04694c74) /* 0.275707677 */, 18 }, +/* 4409 */ { MAD_F(0x0469a3e7) /* 0.275791076 */, 18 }, +/* 4410 */ { MAD_F(0x0469fb5c) /* 0.275874482 */, 18 }, +/* 4411 */ { MAD_F(0x046a52d3) /* 0.275957894 */, 18 }, +/* 4412 */ { MAD_F(0x046aaa4b) /* 0.276041312 */, 18 }, +/* 4413 */ { MAD_F(0x046b01c5) /* 0.276124737 */, 18 }, +/* 4414 */ { MAD_F(0x046b5941) /* 0.276208167 */, 18 }, +/* 4415 */ { MAD_F(0x046bb0bf) /* 0.276291605 */, 18 }, + +/* 4416 */ { MAD_F(0x046c083e) /* 0.276375048 */, 18 }, +/* 4417 */ { MAD_F(0x046c5fbf) /* 0.276458498 */, 18 }, +/* 4418 */ { MAD_F(0x046cb741) /* 0.276541954 */, 18 }, +/* 4419 */ { MAD_F(0x046d0ec5) /* 0.276625416 */, 18 }, +/* 4420 */ { MAD_F(0x046d664b) /* 0.276708885 */, 18 }, +/* 4421 */ { MAD_F(0x046dbdd3) /* 0.276792360 */, 18 }, +/* 4422 */ { MAD_F(0x046e155c) /* 0.276875841 */, 18 }, +/* 4423 */ { MAD_F(0x046e6ce7) /* 0.276959328 */, 18 }, +/* 4424 */ { MAD_F(0x046ec474) /* 0.277042822 */, 18 }, +/* 4425 */ { MAD_F(0x046f1c02) /* 0.277126322 */, 18 }, +/* 4426 */ { MAD_F(0x046f7392) /* 0.277209829 */, 18 }, +/* 4427 */ { MAD_F(0x046fcb24) /* 0.277293341 */, 18 }, +/* 4428 */ { MAD_F(0x047022b8) /* 0.277376860 */, 18 }, +/* 4429 */ { MAD_F(0x04707a4d) /* 0.277460385 */, 18 }, +/* 4430 */ { MAD_F(0x0470d1e4) /* 0.277543917 */, 18 }, +/* 4431 */ { MAD_F(0x0471297c) /* 0.277627455 */, 18 }, + +/* 4432 */ { MAD_F(0x04718116) /* 0.277710999 */, 18 }, +/* 4433 */ { MAD_F(0x0471d8b2) /* 0.277794549 */, 18 }, +/* 4434 */ { MAD_F(0x04723050) /* 0.277878106 */, 18 }, +/* 4435 */ { MAD_F(0x047287ef) /* 0.277961669 */, 18 }, +/* 4436 */ { MAD_F(0x0472df90) /* 0.278045238 */, 18 }, +/* 4437 */ { MAD_F(0x04733733) /* 0.278128813 */, 18 }, +/* 4438 */ { MAD_F(0x04738ed7) /* 0.278212395 */, 18 }, +/* 4439 */ { MAD_F(0x0473e67d) /* 0.278295983 */, 18 }, +/* 4440 */ { MAD_F(0x04743e25) /* 0.278379578 */, 18 }, +/* 4441 */ { MAD_F(0x047495ce) /* 0.278463178 */, 18 }, +/* 4442 */ { MAD_F(0x0474ed79) /* 0.278546785 */, 18 }, +/* 4443 */ { MAD_F(0x04754526) /* 0.278630398 */, 18 }, +/* 4444 */ { MAD_F(0x04759cd4) /* 0.278714018 */, 18 }, +/* 4445 */ { MAD_F(0x0475f484) /* 0.278797643 */, 18 }, +/* 4446 */ { MAD_F(0x04764c36) /* 0.278881275 */, 18 }, +/* 4447 */ { MAD_F(0x0476a3ea) /* 0.278964914 */, 18 }, + +/* 4448 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 18 }, +/* 4449 */ { MAD_F(0x04775356) /* 0.279132209 */, 18 }, +/* 4450 */ { MAD_F(0x0477ab0e) /* 0.279215866 */, 18 }, +/* 4451 */ { MAD_F(0x047802c8) /* 0.279299529 */, 18 }, +/* 4452 */ { MAD_F(0x04785a84) /* 0.279383199 */, 18 }, +/* 4453 */ { MAD_F(0x0478b242) /* 0.279466875 */, 18 }, +/* 4454 */ { MAD_F(0x04790a01) /* 0.279550557 */, 18 }, +/* 4455 */ { MAD_F(0x047961c2) /* 0.279634245 */, 18 }, +/* 4456 */ { MAD_F(0x0479b984) /* 0.279717940 */, 18 }, +/* 4457 */ { MAD_F(0x047a1149) /* 0.279801641 */, 18 }, +/* 4458 */ { MAD_F(0x047a690f) /* 0.279885348 */, 18 }, +/* 4459 */ { MAD_F(0x047ac0d6) /* 0.279969061 */, 18 }, +/* 4460 */ { MAD_F(0x047b18a0) /* 0.280052781 */, 18 }, +/* 4461 */ { MAD_F(0x047b706b) /* 0.280136507 */, 18 }, +/* 4462 */ { MAD_F(0x047bc837) /* 0.280220239 */, 18 }, +/* 4463 */ { MAD_F(0x047c2006) /* 0.280303978 */, 18 }, + +/* 4464 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 18 }, +/* 4465 */ { MAD_F(0x047ccfa8) /* 0.280471473 */, 18 }, +/* 4466 */ { MAD_F(0x047d277b) /* 0.280555230 */, 18 }, +/* 4467 */ { MAD_F(0x047d7f50) /* 0.280638994 */, 18 }, +/* 4468 */ { MAD_F(0x047dd727) /* 0.280722764 */, 18 }, +/* 4469 */ { MAD_F(0x047e2eff) /* 0.280806540 */, 18 }, +/* 4470 */ { MAD_F(0x047e86d9) /* 0.280890322 */, 18 }, +/* 4471 */ { MAD_F(0x047edeb5) /* 0.280974110 */, 18 }, +/* 4472 */ { MAD_F(0x047f3693) /* 0.281057905 */, 18 }, +/* 4473 */ { MAD_F(0x047f8e72) /* 0.281141706 */, 18 }, +/* 4474 */ { MAD_F(0x047fe653) /* 0.281225513 */, 18 }, +/* 4475 */ { MAD_F(0x04803e35) /* 0.281309326 */, 18 }, +/* 4476 */ { MAD_F(0x04809619) /* 0.281393146 */, 18 }, +/* 4477 */ { MAD_F(0x0480edff) /* 0.281476972 */, 18 }, +/* 4478 */ { MAD_F(0x048145e7) /* 0.281560804 */, 18 }, +/* 4479 */ { MAD_F(0x04819dd0) /* 0.281644643 */, 18 }, + +/* 4480 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 18 }, +/* 4481 */ { MAD_F(0x04824da7) /* 0.281812338 */, 18 }, +/* 4482 */ { MAD_F(0x0482a595) /* 0.281896195 */, 18 }, +/* 4483 */ { MAD_F(0x0482fd85) /* 0.281980059 */, 18 }, +/* 4484 */ { MAD_F(0x04835577) /* 0.282063928 */, 18 }, +/* 4485 */ { MAD_F(0x0483ad6a) /* 0.282147804 */, 18 }, +/* 4486 */ { MAD_F(0x0484055f) /* 0.282231686 */, 18 }, +/* 4487 */ { MAD_F(0x04845d56) /* 0.282315574 */, 18 }, +/* 4488 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 18 }, +/* 4489 */ { MAD_F(0x04850d48) /* 0.282483370 */, 18 }, +/* 4490 */ { MAD_F(0x04856544) /* 0.282567277 */, 18 }, +/* 4491 */ { MAD_F(0x0485bd41) /* 0.282651190 */, 18 }, +/* 4492 */ { MAD_F(0x04861540) /* 0.282735109 */, 18 }, +/* 4493 */ { MAD_F(0x04866d40) /* 0.282819035 */, 18 }, +/* 4494 */ { MAD_F(0x0486c543) /* 0.282902967 */, 18 }, +/* 4495 */ { MAD_F(0x04871d47) /* 0.282986905 */, 18 }, + +/* 4496 */ { MAD_F(0x0487754c) /* 0.283070849 */, 18 }, +/* 4497 */ { MAD_F(0x0487cd54) /* 0.283154800 */, 18 }, +/* 4498 */ { MAD_F(0x0488255d) /* 0.283238757 */, 18 }, +/* 4499 */ { MAD_F(0x04887d67) /* 0.283322720 */, 18 }, +/* 4500 */ { MAD_F(0x0488d574) /* 0.283406689 */, 18 }, +/* 4501 */ { MAD_F(0x04892d82) /* 0.283490665 */, 18 }, +/* 4502 */ { MAD_F(0x04898591) /* 0.283574646 */, 18 }, +/* 4503 */ { MAD_F(0x0489dda3) /* 0.283658634 */, 18 }, +/* 4504 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 18 }, +/* 4505 */ { MAD_F(0x048a8dca) /* 0.283826629 */, 18 }, +/* 4506 */ { MAD_F(0x048ae5e1) /* 0.283910635 */, 18 }, +/* 4507 */ { MAD_F(0x048b3df9) /* 0.283994648 */, 18 }, +/* 4508 */ { MAD_F(0x048b9612) /* 0.284078667 */, 18 }, +/* 4509 */ { MAD_F(0x048bee2e) /* 0.284162692 */, 18 }, +/* 4510 */ { MAD_F(0x048c464b) /* 0.284246723 */, 18 }, +/* 4511 */ { MAD_F(0x048c9e69) /* 0.284330761 */, 18 }, + +/* 4512 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 18 }, +/* 4513 */ { MAD_F(0x048d4eac) /* 0.284498855 */, 18 }, +/* 4514 */ { MAD_F(0x048da6cf) /* 0.284582911 */, 18 }, +/* 4515 */ { MAD_F(0x048dfef5) /* 0.284666974 */, 18 }, +/* 4516 */ { MAD_F(0x048e571c) /* 0.284751042 */, 18 }, +/* 4517 */ { MAD_F(0x048eaf44) /* 0.284835117 */, 18 }, +/* 4518 */ { MAD_F(0x048f076f) /* 0.284919198 */, 18 }, +/* 4519 */ { MAD_F(0x048f5f9b) /* 0.285003285 */, 18 }, +/* 4520 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 18 }, +/* 4521 */ { MAD_F(0x04900ff8) /* 0.285171479 */, 18 }, +/* 4522 */ { MAD_F(0x04906829) /* 0.285255584 */, 18 }, +/* 4523 */ { MAD_F(0x0490c05b) /* 0.285339697 */, 18 }, +/* 4524 */ { MAD_F(0x04911890) /* 0.285423815 */, 18 }, +/* 4525 */ { MAD_F(0x049170c6) /* 0.285507939 */, 18 }, +/* 4526 */ { MAD_F(0x0491c8fd) /* 0.285592070 */, 18 }, +/* 4527 */ { MAD_F(0x04922137) /* 0.285676207 */, 18 }, + +/* 4528 */ { MAD_F(0x04927972) /* 0.285760350 */, 18 }, +/* 4529 */ { MAD_F(0x0492d1ae) /* 0.285844499 */, 18 }, +/* 4530 */ { MAD_F(0x049329ed) /* 0.285928655 */, 18 }, +/* 4531 */ { MAD_F(0x0493822c) /* 0.286012816 */, 18 }, +/* 4532 */ { MAD_F(0x0493da6e) /* 0.286096984 */, 18 }, +/* 4533 */ { MAD_F(0x049432b1) /* 0.286181158 */, 18 }, +/* 4534 */ { MAD_F(0x04948af6) /* 0.286265338 */, 18 }, +/* 4535 */ { MAD_F(0x0494e33d) /* 0.286349525 */, 18 }, +/* 4536 */ { MAD_F(0x04953b85) /* 0.286433717 */, 18 }, +/* 4537 */ { MAD_F(0x049593cf) /* 0.286517916 */, 18 }, +/* 4538 */ { MAD_F(0x0495ec1b) /* 0.286602121 */, 18 }, +/* 4539 */ { MAD_F(0x04964468) /* 0.286686332 */, 18 }, +/* 4540 */ { MAD_F(0x04969cb7) /* 0.286770550 */, 18 }, +/* 4541 */ { MAD_F(0x0496f508) /* 0.286854773 */, 18 }, +/* 4542 */ { MAD_F(0x04974d5a) /* 0.286939003 */, 18 }, +/* 4543 */ { MAD_F(0x0497a5ae) /* 0.287023239 */, 18 }, + +/* 4544 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 18 }, +/* 4545 */ { MAD_F(0x0498565a) /* 0.287191729 */, 18 }, +/* 4546 */ { MAD_F(0x0498aeb3) /* 0.287275983 */, 18 }, +/* 4547 */ { MAD_F(0x0499070e) /* 0.287360244 */, 18 }, +/* 4548 */ { MAD_F(0x04995f6a) /* 0.287444511 */, 18 }, +/* 4549 */ { MAD_F(0x0499b7c8) /* 0.287528784 */, 18 }, +/* 4550 */ { MAD_F(0x049a1027) /* 0.287613063 */, 18 }, +/* 4551 */ { MAD_F(0x049a6889) /* 0.287697348 */, 18 }, +/* 4552 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 18 }, +/* 4553 */ { MAD_F(0x049b1950) /* 0.287865937 */, 18 }, +/* 4554 */ { MAD_F(0x049b71b6) /* 0.287950241 */, 18 }, +/* 4555 */ { MAD_F(0x049bca1e) /* 0.288034551 */, 18 }, +/* 4556 */ { MAD_F(0x049c2287) /* 0.288118867 */, 18 }, +/* 4557 */ { MAD_F(0x049c7af2) /* 0.288203190 */, 18 }, +/* 4558 */ { MAD_F(0x049cd35f) /* 0.288287518 */, 18 }, +/* 4559 */ { MAD_F(0x049d2bce) /* 0.288371853 */, 18 }, + +/* 4560 */ { MAD_F(0x049d843e) /* 0.288456194 */, 18 }, +/* 4561 */ { MAD_F(0x049ddcaf) /* 0.288540541 */, 18 }, +/* 4562 */ { MAD_F(0x049e3523) /* 0.288624894 */, 18 }, +/* 4563 */ { MAD_F(0x049e8d98) /* 0.288709253 */, 18 }, +/* 4564 */ { MAD_F(0x049ee60e) /* 0.288793619 */, 18 }, +/* 4565 */ { MAD_F(0x049f3e87) /* 0.288877990 */, 18 }, +/* 4566 */ { MAD_F(0x049f9701) /* 0.288962368 */, 18 }, +/* 4567 */ { MAD_F(0x049fef7c) /* 0.289046752 */, 18 }, +/* 4568 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 18 }, +/* 4569 */ { MAD_F(0x04a0a079) /* 0.289215538 */, 18 }, +/* 4570 */ { MAD_F(0x04a0f8f9) /* 0.289299941 */, 18 }, +/* 4571 */ { MAD_F(0x04a1517c) /* 0.289384349 */, 18 }, +/* 4572 */ { MAD_F(0x04a1a9ff) /* 0.289468764 */, 18 }, +/* 4573 */ { MAD_F(0x04a20285) /* 0.289553185 */, 18 }, +/* 4574 */ { MAD_F(0x04a25b0c) /* 0.289637612 */, 18 }, +/* 4575 */ { MAD_F(0x04a2b395) /* 0.289722045 */, 18 }, + +/* 4576 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 18 }, +/* 4577 */ { MAD_F(0x04a364ac) /* 0.289890930 */, 18 }, +/* 4578 */ { MAD_F(0x04a3bd3a) /* 0.289975382 */, 18 }, +/* 4579 */ { MAD_F(0x04a415c9) /* 0.290059840 */, 18 }, +/* 4580 */ { MAD_F(0x04a46e5a) /* 0.290144304 */, 18 }, +/* 4581 */ { MAD_F(0x04a4c6ed) /* 0.290228774 */, 18 }, +/* 4582 */ { MAD_F(0x04a51f81) /* 0.290313250 */, 18 }, +/* 4583 */ { MAD_F(0x04a57818) /* 0.290397733 */, 18 }, +/* 4584 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 18 }, +/* 4585 */ { MAD_F(0x04a62949) /* 0.290566716 */, 18 }, +/* 4586 */ { MAD_F(0x04a681e4) /* 0.290651217 */, 18 }, +/* 4587 */ { MAD_F(0x04a6da80) /* 0.290735724 */, 18 }, +/* 4588 */ { MAD_F(0x04a7331f) /* 0.290820237 */, 18 }, +/* 4589 */ { MAD_F(0x04a78bbf) /* 0.290904756 */, 18 }, +/* 4590 */ { MAD_F(0x04a7e460) /* 0.290989281 */, 18 }, +/* 4591 */ { MAD_F(0x04a83d03) /* 0.291073813 */, 18 }, + +/* 4592 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 18 }, +/* 4593 */ { MAD_F(0x04a8ee4f) /* 0.291242894 */, 18 }, +/* 4594 */ { MAD_F(0x04a946f7) /* 0.291327444 */, 18 }, +/* 4595 */ { MAD_F(0x04a99fa1) /* 0.291412001 */, 18 }, +/* 4596 */ { MAD_F(0x04a9f84c) /* 0.291496563 */, 18 }, +/* 4597 */ { MAD_F(0x04aa50fa) /* 0.291581131 */, 18 }, +/* 4598 */ { MAD_F(0x04aaa9a8) /* 0.291665706 */, 18 }, +/* 4599 */ { MAD_F(0x04ab0259) /* 0.291750286 */, 18 }, +/* 4600 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 18 }, +/* 4601 */ { MAD_F(0x04abb3bf) /* 0.291919466 */, 18 }, +/* 4602 */ { MAD_F(0x04ac0c74) /* 0.292004065 */, 18 }, +/* 4603 */ { MAD_F(0x04ac652b) /* 0.292088670 */, 18 }, +/* 4604 */ { MAD_F(0x04acbde4) /* 0.292173281 */, 18 }, +/* 4605 */ { MAD_F(0x04ad169e) /* 0.292257899 */, 18 }, +/* 4606 */ { MAD_F(0x04ad6f5a) /* 0.292342522 */, 18 }, +/* 4607 */ { MAD_F(0x04adc818) /* 0.292427152 */, 18 }, + +/* 4608 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 18 }, +/* 4609 */ { MAD_F(0x04ae7998) /* 0.292596430 */, 18 }, +/* 4610 */ { MAD_F(0x04aed25a) /* 0.292681078 */, 18 }, +/* 4611 */ { MAD_F(0x04af2b1e) /* 0.292765732 */, 18 }, +/* 4612 */ { MAD_F(0x04af83e4) /* 0.292850392 */, 18 }, +/* 4613 */ { MAD_F(0x04afdcac) /* 0.292935058 */, 18 }, +/* 4614 */ { MAD_F(0x04b03575) /* 0.293019731 */, 18 }, +/* 4615 */ { MAD_F(0x04b08e40) /* 0.293104409 */, 18 }, +/* 4616 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 18 }, +/* 4617 */ { MAD_F(0x04b13fda) /* 0.293273785 */, 18 }, +/* 4618 */ { MAD_F(0x04b198aa) /* 0.293358482 */, 18 }, +/* 4619 */ { MAD_F(0x04b1f17b) /* 0.293443185 */, 18 }, +/* 4620 */ { MAD_F(0x04b24a4e) /* 0.293527894 */, 18 }, +/* 4621 */ { MAD_F(0x04b2a322) /* 0.293612609 */, 18 }, +/* 4622 */ { MAD_F(0x04b2fbf9) /* 0.293697331 */, 18 }, +/* 4623 */ { MAD_F(0x04b354d1) /* 0.293782058 */, 18 }, + +/* 4624 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 18 }, +/* 4625 */ { MAD_F(0x04b40685) /* 0.293951532 */, 18 }, +/* 4626 */ { MAD_F(0x04b45f62) /* 0.294036278 */, 18 }, +/* 4627 */ { MAD_F(0x04b4b840) /* 0.294121029 */, 18 }, +/* 4628 */ { MAD_F(0x04b51120) /* 0.294205788 */, 18 }, +/* 4629 */ { MAD_F(0x04b56a02) /* 0.294290552 */, 18 }, +/* 4630 */ { MAD_F(0x04b5c2e6) /* 0.294375322 */, 18 }, +/* 4631 */ { MAD_F(0x04b61bcb) /* 0.294460098 */, 18 }, +/* 4632 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 18 }, +/* 4633 */ { MAD_F(0x04b6cd99) /* 0.294629669 */, 18 }, +/* 4634 */ { MAD_F(0x04b72683) /* 0.294714464 */, 18 }, +/* 4635 */ { MAD_F(0x04b77f6f) /* 0.294799265 */, 18 }, +/* 4636 */ { MAD_F(0x04b7d85c) /* 0.294884072 */, 18 }, +/* 4637 */ { MAD_F(0x04b8314b) /* 0.294968885 */, 18 }, +/* 4638 */ { MAD_F(0x04b88a3b) /* 0.295053704 */, 18 }, +/* 4639 */ { MAD_F(0x04b8e32d) /* 0.295138529 */, 18 }, + +/* 4640 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 18 }, +/* 4641 */ { MAD_F(0x04b99516) /* 0.295308197 */, 18 }, +/* 4642 */ { MAD_F(0x04b9ee0d) /* 0.295393041 */, 18 }, +/* 4643 */ { MAD_F(0x04ba4706) /* 0.295477890 */, 18 }, +/* 4644 */ { MAD_F(0x04baa000) /* 0.295562746 */, 18 }, +/* 4645 */ { MAD_F(0x04baf8fc) /* 0.295647608 */, 18 }, +/* 4646 */ { MAD_F(0x04bb51fa) /* 0.295732476 */, 18 }, +/* 4647 */ { MAD_F(0x04bbaaf9) /* 0.295817349 */, 18 }, +/* 4648 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 18 }, +/* 4649 */ { MAD_F(0x04bc5cfc) /* 0.295987115 */, 18 }, +/* 4650 */ { MAD_F(0x04bcb600) /* 0.296072008 */, 18 }, +/* 4651 */ { MAD_F(0x04bd0f06) /* 0.296156906 */, 18 }, +/* 4652 */ { MAD_F(0x04bd680d) /* 0.296241810 */, 18 }, +/* 4653 */ { MAD_F(0x04bdc116) /* 0.296326721 */, 18 }, +/* 4654 */ { MAD_F(0x04be1a21) /* 0.296411637 */, 18 }, +/* 4655 */ { MAD_F(0x04be732d) /* 0.296496560 */, 18 }, + +/* 4656 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 18 }, +/* 4657 */ { MAD_F(0x04bf254a) /* 0.296666423 */, 18 }, +/* 4658 */ { MAD_F(0x04bf7e5b) /* 0.296751364 */, 18 }, +/* 4659 */ { MAD_F(0x04bfd76e) /* 0.296836311 */, 18 }, +/* 4660 */ { MAD_F(0x04c03083) /* 0.296921264 */, 18 }, +/* 4661 */ { MAD_F(0x04c08999) /* 0.297006223 */, 18 }, +/* 4662 */ { MAD_F(0x04c0e2b0) /* 0.297091188 */, 18 }, +/* 4663 */ { MAD_F(0x04c13bca) /* 0.297176159 */, 18 }, +/* 4664 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 18 }, +/* 4665 */ { MAD_F(0x04c1ee01) /* 0.297346120 */, 18 }, +/* 4666 */ { MAD_F(0x04c2471f) /* 0.297431109 */, 18 }, +/* 4667 */ { MAD_F(0x04c2a03f) /* 0.297516105 */, 18 }, +/* 4668 */ { MAD_F(0x04c2f960) /* 0.297601106 */, 18 }, +/* 4669 */ { MAD_F(0x04c35283) /* 0.297686114 */, 18 }, +/* 4670 */ { MAD_F(0x04c3aba8) /* 0.297771128 */, 18 }, +/* 4671 */ { MAD_F(0x04c404ce) /* 0.297856147 */, 18 }, + +/* 4672 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 18 }, +/* 4673 */ { MAD_F(0x04c4b720) /* 0.298026205 */, 18 }, +/* 4674 */ { MAD_F(0x04c5104b) /* 0.298111243 */, 18 }, +/* 4675 */ { MAD_F(0x04c56978) /* 0.298196287 */, 18 }, +/* 4676 */ { MAD_F(0x04c5c2a7) /* 0.298281337 */, 18 }, +/* 4677 */ { MAD_F(0x04c61bd7) /* 0.298366393 */, 18 }, +/* 4678 */ { MAD_F(0x04c67508) /* 0.298451456 */, 18 }, +/* 4679 */ { MAD_F(0x04c6ce3c) /* 0.298536524 */, 18 }, +/* 4680 */ { MAD_F(0x04c72771) /* 0.298621598 */, 18 }, +/* 4681 */ { MAD_F(0x04c780a7) /* 0.298706679 */, 18 }, +/* 4682 */ { MAD_F(0x04c7d9df) /* 0.298791765 */, 18 }, +/* 4683 */ { MAD_F(0x04c83319) /* 0.298876858 */, 18 }, +/* 4684 */ { MAD_F(0x04c88c55) /* 0.298961956 */, 18 }, +/* 4685 */ { MAD_F(0x04c8e592) /* 0.299047061 */, 18 }, +/* 4686 */ { MAD_F(0x04c93ed1) /* 0.299132172 */, 18 }, +/* 4687 */ { MAD_F(0x04c99811) /* 0.299217288 */, 18 }, + +/* 4688 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 18 }, +/* 4689 */ { MAD_F(0x04ca4a97) /* 0.299387540 */, 18 }, +/* 4690 */ { MAD_F(0x04caa3dc) /* 0.299472675 */, 18 }, +/* 4691 */ { MAD_F(0x04cafd23) /* 0.299557816 */, 18 }, +/* 4692 */ { MAD_F(0x04cb566b) /* 0.299642963 */, 18 }, +/* 4693 */ { MAD_F(0x04cbafb5) /* 0.299728116 */, 18 }, +/* 4694 */ { MAD_F(0x04cc0901) /* 0.299813275 */, 18 }, +/* 4695 */ { MAD_F(0x04cc624e) /* 0.299898440 */, 18 }, +/* 4696 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 18 }, +/* 4697 */ { MAD_F(0x04cd14ee) /* 0.300068789 */, 18 }, +/* 4698 */ { MAD_F(0x04cd6e40) /* 0.300153972 */, 18 }, +/* 4699 */ { MAD_F(0x04cdc794) /* 0.300239161 */, 18 }, +/* 4700 */ { MAD_F(0x04ce20e9) /* 0.300324357 */, 18 }, +/* 4701 */ { MAD_F(0x04ce7a40) /* 0.300409558 */, 18 }, +/* 4702 */ { MAD_F(0x04ced399) /* 0.300494765 */, 18 }, +/* 4703 */ { MAD_F(0x04cf2cf3) /* 0.300579979 */, 18 }, + +/* 4704 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 18 }, +/* 4705 */ { MAD_F(0x04cfdfad) /* 0.300750424 */, 18 }, +/* 4706 */ { MAD_F(0x04d0390c) /* 0.300835656 */, 18 }, +/* 4707 */ { MAD_F(0x04d0926d) /* 0.300920893 */, 18 }, +/* 4708 */ { MAD_F(0x04d0ebcf) /* 0.301006137 */, 18 }, +/* 4709 */ { MAD_F(0x04d14533) /* 0.301091387 */, 18 }, +/* 4710 */ { MAD_F(0x04d19e99) /* 0.301176643 */, 18 }, +/* 4711 */ { MAD_F(0x04d1f800) /* 0.301261904 */, 18 }, +/* 4712 */ { MAD_F(0x04d25169) /* 0.301347172 */, 18 }, +/* 4713 */ { MAD_F(0x04d2aad4) /* 0.301432446 */, 18 }, +/* 4714 */ { MAD_F(0x04d30440) /* 0.301517726 */, 18 }, +/* 4715 */ { MAD_F(0x04d35dae) /* 0.301603012 */, 18 }, +/* 4716 */ { MAD_F(0x04d3b71d) /* 0.301688304 */, 18 }, +/* 4717 */ { MAD_F(0x04d4108e) /* 0.301773602 */, 18 }, +/* 4718 */ { MAD_F(0x04d46a01) /* 0.301858906 */, 18 }, +/* 4719 */ { MAD_F(0x04d4c375) /* 0.301944216 */, 18 }, + +/* 4720 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 18 }, +/* 4721 */ { MAD_F(0x04d57662) /* 0.302114854 */, 18 }, +/* 4722 */ { MAD_F(0x04d5cfdb) /* 0.302200182 */, 18 }, +/* 4723 */ { MAD_F(0x04d62956) /* 0.302285516 */, 18 }, +/* 4724 */ { MAD_F(0x04d682d2) /* 0.302370856 */, 18 }, +/* 4725 */ { MAD_F(0x04d6dc50) /* 0.302456203 */, 18 }, +/* 4726 */ { MAD_F(0x04d735d0) /* 0.302541555 */, 18 }, +/* 4727 */ { MAD_F(0x04d78f51) /* 0.302626913 */, 18 }, +/* 4728 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 18 }, +/* 4729 */ { MAD_F(0x04d84258) /* 0.302797648 */, 18 }, +/* 4730 */ { MAD_F(0x04d89bde) /* 0.302883024 */, 18 }, +/* 4731 */ { MAD_F(0x04d8f566) /* 0.302968406 */, 18 }, +/* 4732 */ { MAD_F(0x04d94eef) /* 0.303053794 */, 18 }, +/* 4733 */ { MAD_F(0x04d9a87a) /* 0.303139189 */, 18 }, +/* 4734 */ { MAD_F(0x04da0207) /* 0.303224589 */, 18 }, +/* 4735 */ { MAD_F(0x04da5b95) /* 0.303309995 */, 18 }, + +/* 4736 */ { MAD_F(0x04dab524) /* 0.303395408 */, 18 }, +/* 4737 */ { MAD_F(0x04db0eb6) /* 0.303480826 */, 18 }, +/* 4738 */ { MAD_F(0x04db6849) /* 0.303566251 */, 18 }, +/* 4739 */ { MAD_F(0x04dbc1dd) /* 0.303651681 */, 18 }, +/* 4740 */ { MAD_F(0x04dc1b73) /* 0.303737117 */, 18 }, +/* 4741 */ { MAD_F(0x04dc750b) /* 0.303822560 */, 18 }, +/* 4742 */ { MAD_F(0x04dccea5) /* 0.303908008 */, 18 }, +/* 4743 */ { MAD_F(0x04dd2840) /* 0.303993463 */, 18 }, +/* 4744 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 18 }, +/* 4745 */ { MAD_F(0x04dddb7a) /* 0.304164390 */, 18 }, +/* 4746 */ { MAD_F(0x04de351a) /* 0.304249862 */, 18 }, +/* 4747 */ { MAD_F(0x04de8ebc) /* 0.304335340 */, 18 }, +/* 4748 */ { MAD_F(0x04dee85f) /* 0.304420825 */, 18 }, +/* 4749 */ { MAD_F(0x04df4203) /* 0.304506315 */, 18 }, +/* 4750 */ { MAD_F(0x04df9baa) /* 0.304591812 */, 18 }, +/* 4751 */ { MAD_F(0x04dff552) /* 0.304677314 */, 18 }, + +/* 4752 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 18 }, +/* 4753 */ { MAD_F(0x04e0a8a6) /* 0.304848337 */, 18 }, +/* 4754 */ { MAD_F(0x04e10253) /* 0.304933858 */, 18 }, +/* 4755 */ { MAD_F(0x04e15c01) /* 0.305019384 */, 18 }, +/* 4756 */ { MAD_F(0x04e1b5b1) /* 0.305104917 */, 18 }, +/* 4757 */ { MAD_F(0x04e20f63) /* 0.305190455 */, 18 }, +/* 4758 */ { MAD_F(0x04e26916) /* 0.305275999 */, 18 }, +/* 4759 */ { MAD_F(0x04e2c2cb) /* 0.305361550 */, 18 }, +/* 4760 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 18 }, +/* 4761 */ { MAD_F(0x04e37639) /* 0.305532669 */, 18 }, +/* 4762 */ { MAD_F(0x04e3cff3) /* 0.305618237 */, 18 }, +/* 4763 */ { MAD_F(0x04e429ae) /* 0.305703811 */, 18 }, +/* 4764 */ { MAD_F(0x04e4836b) /* 0.305789392 */, 18 }, +/* 4765 */ { MAD_F(0x04e4dd29) /* 0.305874978 */, 18 }, +/* 4766 */ { MAD_F(0x04e536e9) /* 0.305960571 */, 18 }, +/* 4767 */ { MAD_F(0x04e590ab) /* 0.306046169 */, 18 }, + +/* 4768 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 18 }, +/* 4769 */ { MAD_F(0x04e64433) /* 0.306217383 */, 18 }, +/* 4770 */ { MAD_F(0x04e69df9) /* 0.306303000 */, 18 }, +/* 4771 */ { MAD_F(0x04e6f7c1) /* 0.306388622 */, 18 }, +/* 4772 */ { MAD_F(0x04e7518b) /* 0.306474250 */, 18 }, +/* 4773 */ { MAD_F(0x04e7ab56) /* 0.306559885 */, 18 }, +/* 4774 */ { MAD_F(0x04e80523) /* 0.306645525 */, 18 }, +/* 4775 */ { MAD_F(0x04e85ef2) /* 0.306731171 */, 18 }, +/* 4776 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 18 }, +/* 4777 */ { MAD_F(0x04e91293) /* 0.306902481 */, 18 }, +/* 4778 */ { MAD_F(0x04e96c67) /* 0.306988145 */, 18 }, +/* 4779 */ { MAD_F(0x04e9c63b) /* 0.307073816 */, 18 }, +/* 4780 */ { MAD_F(0x04ea2012) /* 0.307159492 */, 18 }, +/* 4781 */ { MAD_F(0x04ea79ea) /* 0.307245174 */, 18 }, +/* 4782 */ { MAD_F(0x04ead3c4) /* 0.307330862 */, 18 }, +/* 4783 */ { MAD_F(0x04eb2d9f) /* 0.307416556 */, 18 }, + +/* 4784 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 18 }, +/* 4785 */ { MAD_F(0x04ebe15b) /* 0.307587962 */, 18 }, +/* 4786 */ { MAD_F(0x04ec3b3b) /* 0.307673674 */, 18 }, +/* 4787 */ { MAD_F(0x04ec951c) /* 0.307759392 */, 18 }, +/* 4788 */ { MAD_F(0x04ecef00) /* 0.307845115 */, 18 }, +/* 4789 */ { MAD_F(0x04ed48e5) /* 0.307930845 */, 18 }, +/* 4790 */ { MAD_F(0x04eda2cb) /* 0.308016581 */, 18 }, +/* 4791 */ { MAD_F(0x04edfcb3) /* 0.308102323 */, 18 }, +/* 4792 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 18 }, +/* 4793 */ { MAD_F(0x04eeb088) /* 0.308273824 */, 18 }, +/* 4794 */ { MAD_F(0x04ef0a75) /* 0.308359584 */, 18 }, +/* 4795 */ { MAD_F(0x04ef6464) /* 0.308445350 */, 18 }, +/* 4796 */ { MAD_F(0x04efbe54) /* 0.308531121 */, 18 }, +/* 4797 */ { MAD_F(0x04f01846) /* 0.308616899 */, 18 }, +/* 4798 */ { MAD_F(0x04f07239) /* 0.308702682 */, 18 }, +/* 4799 */ { MAD_F(0x04f0cc2e) /* 0.308788472 */, 18 }, + +/* 4800 */ { MAD_F(0x04f12624) /* 0.308874267 */, 18 }, +/* 4801 */ { MAD_F(0x04f1801d) /* 0.308960068 */, 18 }, +/* 4802 */ { MAD_F(0x04f1da16) /* 0.309045876 */, 18 }, +/* 4803 */ { MAD_F(0x04f23412) /* 0.309131689 */, 18 }, +/* 4804 */ { MAD_F(0x04f28e0f) /* 0.309217508 */, 18 }, +/* 4805 */ { MAD_F(0x04f2e80d) /* 0.309303334 */, 18 }, +/* 4806 */ { MAD_F(0x04f3420d) /* 0.309389165 */, 18 }, +/* 4807 */ { MAD_F(0x04f39c0f) /* 0.309475002 */, 18 }, +/* 4808 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 18 }, +/* 4809 */ { MAD_F(0x04f45017) /* 0.309646694 */, 18 }, +/* 4810 */ { MAD_F(0x04f4aa1e) /* 0.309732549 */, 18 }, +/* 4811 */ { MAD_F(0x04f50426) /* 0.309818410 */, 18 }, +/* 4812 */ { MAD_F(0x04f55e30) /* 0.309904277 */, 18 }, +/* 4813 */ { MAD_F(0x04f5b83b) /* 0.309990150 */, 18 }, +/* 4814 */ { MAD_F(0x04f61248) /* 0.310076028 */, 18 }, +/* 4815 */ { MAD_F(0x04f66c56) /* 0.310161913 */, 18 }, + +/* 4816 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 18 }, +/* 4817 */ { MAD_F(0x04f72078) /* 0.310333700 */, 18 }, +/* 4818 */ { MAD_F(0x04f77a8b) /* 0.310419603 */, 18 }, +/* 4819 */ { MAD_F(0x04f7d4a0) /* 0.310505511 */, 18 }, +/* 4820 */ { MAD_F(0x04f82eb7) /* 0.310591426 */, 18 }, +/* 4821 */ { MAD_F(0x04f888cf) /* 0.310677346 */, 18 }, +/* 4822 */ { MAD_F(0x04f8e2e9) /* 0.310763272 */, 18 }, +/* 4823 */ { MAD_F(0x04f93d04) /* 0.310849205 */, 18 }, +/* 4824 */ { MAD_F(0x04f99721) /* 0.310935143 */, 18 }, +/* 4825 */ { MAD_F(0x04f9f13f) /* 0.311021087 */, 18 }, +/* 4826 */ { MAD_F(0x04fa4b5f) /* 0.311107037 */, 18 }, +/* 4827 */ { MAD_F(0x04faa581) /* 0.311192993 */, 18 }, +/* 4828 */ { MAD_F(0x04faffa4) /* 0.311278955 */, 18 }, +/* 4829 */ { MAD_F(0x04fb59c9) /* 0.311364923 */, 18 }, +/* 4830 */ { MAD_F(0x04fbb3ef) /* 0.311450897 */, 18 }, +/* 4831 */ { MAD_F(0x04fc0e17) /* 0.311536877 */, 18 }, + +/* 4832 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 18 }, +/* 4833 */ { MAD_F(0x04fcc26c) /* 0.311708854 */, 18 }, +/* 4834 */ { MAD_F(0x04fd1c99) /* 0.311794851 */, 18 }, +/* 4835 */ { MAD_F(0x04fd76c7) /* 0.311880855 */, 18 }, +/* 4836 */ { MAD_F(0x04fdd0f7) /* 0.311966864 */, 18 }, +/* 4837 */ { MAD_F(0x04fe2b29) /* 0.312052880 */, 18 }, +/* 4838 */ { MAD_F(0x04fe855c) /* 0.312138901 */, 18 }, +/* 4839 */ { MAD_F(0x04fedf91) /* 0.312224928 */, 18 }, +/* 4840 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 18 }, +/* 4841 */ { MAD_F(0x04ff93ff) /* 0.312397000 */, 18 }, +/* 4842 */ { MAD_F(0x04ffee38) /* 0.312483045 */, 18 }, +/* 4843 */ { MAD_F(0x05004874) /* 0.312569096 */, 18 }, +/* 4844 */ { MAD_F(0x0500a2b0) /* 0.312655153 */, 18 }, +/* 4845 */ { MAD_F(0x0500fcef) /* 0.312741216 */, 18 }, +/* 4846 */ { MAD_F(0x0501572e) /* 0.312827284 */, 18 }, +/* 4847 */ { MAD_F(0x0501b170) /* 0.312913359 */, 18 }, + +/* 4848 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 18 }, +/* 4849 */ { MAD_F(0x050265f8) /* 0.313085526 */, 18 }, +/* 4850 */ { MAD_F(0x0502c03e) /* 0.313171618 */, 18 }, +/* 4851 */ { MAD_F(0x05031a86) /* 0.313257716 */, 18 }, +/* 4852 */ { MAD_F(0x050374cf) /* 0.313343820 */, 18 }, +/* 4853 */ { MAD_F(0x0503cf1a) /* 0.313429931 */, 18 }, +/* 4854 */ { MAD_F(0x05042967) /* 0.313516047 */, 18 }, +/* 4855 */ { MAD_F(0x050483b5) /* 0.313602168 */, 18 }, +/* 4856 */ { MAD_F(0x0504de05) /* 0.313688296 */, 18 }, +/* 4857 */ { MAD_F(0x05053856) /* 0.313774430 */, 18 }, +/* 4858 */ { MAD_F(0x050592a9) /* 0.313860570 */, 18 }, +/* 4859 */ { MAD_F(0x0505ecfd) /* 0.313946715 */, 18 }, +/* 4860 */ { MAD_F(0x05064754) /* 0.314032867 */, 18 }, +/* 4861 */ { MAD_F(0x0506a1ab) /* 0.314119024 */, 18 }, +/* 4862 */ { MAD_F(0x0506fc04) /* 0.314205187 */, 18 }, +/* 4863 */ { MAD_F(0x0507565f) /* 0.314291357 */, 18 }, + +/* 4864 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 18 }, +/* 4865 */ { MAD_F(0x05080b1a) /* 0.314463713 */, 18 }, +/* 4866 */ { MAD_F(0x05086579) /* 0.314549900 */, 18 }, +/* 4867 */ { MAD_F(0x0508bfdb) /* 0.314636092 */, 18 }, +/* 4868 */ { MAD_F(0x05091a3d) /* 0.314722291 */, 18 }, +/* 4869 */ { MAD_F(0x050974a2) /* 0.314808496 */, 18 }, +/* 4870 */ { MAD_F(0x0509cf08) /* 0.314894706 */, 18 }, +/* 4871 */ { MAD_F(0x050a296f) /* 0.314980923 */, 18 }, +/* 4872 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 18 }, +/* 4873 */ { MAD_F(0x050ade43) /* 0.315153373 */, 18 }, +/* 4874 */ { MAD_F(0x050b38af) /* 0.315239607 */, 18 }, +/* 4875 */ { MAD_F(0x050b931d) /* 0.315325847 */, 18 }, +/* 4876 */ { MAD_F(0x050bed8d) /* 0.315412093 */, 18 }, +/* 4877 */ { MAD_F(0x050c47fe) /* 0.315498345 */, 18 }, +/* 4878 */ { MAD_F(0x050ca271) /* 0.315584603 */, 18 }, +/* 4879 */ { MAD_F(0x050cfce5) /* 0.315670866 */, 18 }, + +/* 4880 */ { MAD_F(0x050d575b) /* 0.315757136 */, 18 }, +/* 4881 */ { MAD_F(0x050db1d2) /* 0.315843411 */, 18 }, +/* 4882 */ { MAD_F(0x050e0c4b) /* 0.315929693 */, 18 }, +/* 4883 */ { MAD_F(0x050e66c5) /* 0.316015980 */, 18 }, +/* 4884 */ { MAD_F(0x050ec141) /* 0.316102273 */, 18 }, +/* 4885 */ { MAD_F(0x050f1bbf) /* 0.316188572 */, 18 }, +/* 4886 */ { MAD_F(0x050f763e) /* 0.316274877 */, 18 }, +/* 4887 */ { MAD_F(0x050fd0bf) /* 0.316361187 */, 18 }, +/* 4888 */ { MAD_F(0x05102b42) /* 0.316447504 */, 18 }, +/* 4889 */ { MAD_F(0x051085c6) /* 0.316533826 */, 18 }, +/* 4890 */ { MAD_F(0x0510e04b) /* 0.316620155 */, 18 }, +/* 4891 */ { MAD_F(0x05113ad3) /* 0.316706489 */, 18 }, +/* 4892 */ { MAD_F(0x0511955b) /* 0.316792829 */, 18 }, +/* 4893 */ { MAD_F(0x0511efe6) /* 0.316879175 */, 18 }, +/* 4894 */ { MAD_F(0x05124a72) /* 0.316965527 */, 18 }, +/* 4895 */ { MAD_F(0x0512a4ff) /* 0.317051885 */, 18 }, + +/* 4896 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 18 }, +/* 4897 */ { MAD_F(0x05135a1f) /* 0.317224618 */, 18 }, +/* 4898 */ { MAD_F(0x0513b4b1) /* 0.317310994 */, 18 }, +/* 4899 */ { MAD_F(0x05140f45) /* 0.317397375 */, 18 }, +/* 4900 */ { MAD_F(0x051469da) /* 0.317483762 */, 18 }, +/* 4901 */ { MAD_F(0x0514c471) /* 0.317570155 */, 18 }, +/* 4902 */ { MAD_F(0x05151f0a) /* 0.317656554 */, 18 }, +/* 4903 */ { MAD_F(0x051579a4) /* 0.317742959 */, 18 }, +/* 4904 */ { MAD_F(0x0515d440) /* 0.317829370 */, 18 }, +/* 4905 */ { MAD_F(0x05162edd) /* 0.317915786 */, 18 }, +/* 4906 */ { MAD_F(0x0516897c) /* 0.318002209 */, 18 }, +/* 4907 */ { MAD_F(0x0516e41c) /* 0.318088637 */, 18 }, +/* 4908 */ { MAD_F(0x05173ebe) /* 0.318175071 */, 18 }, +/* 4909 */ { MAD_F(0x05179962) /* 0.318261511 */, 18 }, +/* 4910 */ { MAD_F(0x0517f407) /* 0.318347957 */, 18 }, +/* 4911 */ { MAD_F(0x05184eae) /* 0.318434409 */, 18 }, + +/* 4912 */ { MAD_F(0x0518a956) /* 0.318520867 */, 18 }, +/* 4913 */ { MAD_F(0x05190400) /* 0.318607330 */, 18 }, +/* 4914 */ { MAD_F(0x05195eab) /* 0.318693800 */, 18 }, +/* 4915 */ { MAD_F(0x0519b958) /* 0.318780275 */, 18 }, +/* 4916 */ { MAD_F(0x051a1407) /* 0.318866756 */, 18 }, +/* 4917 */ { MAD_F(0x051a6eb7) /* 0.318953243 */, 18 }, +/* 4918 */ { MAD_F(0x051ac969) /* 0.319039736 */, 18 }, +/* 4919 */ { MAD_F(0x051b241c) /* 0.319126235 */, 18 }, +/* 4920 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 18 }, +/* 4921 */ { MAD_F(0x051bd987) /* 0.319299250 */, 18 }, +/* 4922 */ { MAD_F(0x051c3440) /* 0.319385766 */, 18 }, +/* 4923 */ { MAD_F(0x051c8ef9) /* 0.319472288 */, 18 }, +/* 4924 */ { MAD_F(0x051ce9b4) /* 0.319558816 */, 18 }, +/* 4925 */ { MAD_F(0x051d4471) /* 0.319645350 */, 18 }, +/* 4926 */ { MAD_F(0x051d9f2f) /* 0.319731890 */, 18 }, +/* 4927 */ { MAD_F(0x051df9ef) /* 0.319818435 */, 18 }, + +/* 4928 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 18 }, +/* 4929 */ { MAD_F(0x051eaf74) /* 0.319991544 */, 18 }, +/* 4930 */ { MAD_F(0x051f0a38) /* 0.320078107 */, 18 }, +/* 4931 */ { MAD_F(0x051f64ff) /* 0.320164676 */, 18 }, +/* 4932 */ { MAD_F(0x051fbfc6) /* 0.320251251 */, 18 }, +/* 4933 */ { MAD_F(0x05201a90) /* 0.320337832 */, 18 }, +/* 4934 */ { MAD_F(0x0520755b) /* 0.320424419 */, 18 }, +/* 4935 */ { MAD_F(0x0520d027) /* 0.320511011 */, 18 }, +/* 4936 */ { MAD_F(0x05212af5) /* 0.320597609 */, 18 }, +/* 4937 */ { MAD_F(0x052185c5) /* 0.320684213 */, 18 }, +/* 4938 */ { MAD_F(0x0521e096) /* 0.320770823 */, 18 }, +/* 4939 */ { MAD_F(0x05223b69) /* 0.320857439 */, 18 }, +/* 4940 */ { MAD_F(0x0522963d) /* 0.320944061 */, 18 }, +/* 4941 */ { MAD_F(0x0522f113) /* 0.321030688 */, 18 }, +/* 4942 */ { MAD_F(0x05234bea) /* 0.321117322 */, 18 }, +/* 4943 */ { MAD_F(0x0523a6c3) /* 0.321203961 */, 18 }, + +/* 4944 */ { MAD_F(0x0524019e) /* 0.321290606 */, 18 }, +/* 4945 */ { MAD_F(0x05245c7a) /* 0.321377257 */, 18 }, +/* 4946 */ { MAD_F(0x0524b758) /* 0.321463913 */, 18 }, +/* 4947 */ { MAD_F(0x05251237) /* 0.321550576 */, 18 }, +/* 4948 */ { MAD_F(0x05256d18) /* 0.321637244 */, 18 }, +/* 4949 */ { MAD_F(0x0525c7fb) /* 0.321723919 */, 18 }, +/* 4950 */ { MAD_F(0x052622df) /* 0.321810599 */, 18 }, +/* 4951 */ { MAD_F(0x05267dc4) /* 0.321897285 */, 18 }, +/* 4952 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 18 }, +/* 4953 */ { MAD_F(0x05273394) /* 0.322070674 */, 18 }, +/* 4954 */ { MAD_F(0x05278e7e) /* 0.322157377 */, 18 }, +/* 4955 */ { MAD_F(0x0527e96a) /* 0.322244087 */, 18 }, +/* 4956 */ { MAD_F(0x05284457) /* 0.322330802 */, 18 }, +/* 4957 */ { MAD_F(0x05289f46) /* 0.322417523 */, 18 }, +/* 4958 */ { MAD_F(0x0528fa37) /* 0.322504249 */, 18 }, +/* 4959 */ { MAD_F(0x05295529) /* 0.322590982 */, 18 }, + +/* 4960 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 18 }, +/* 4961 */ { MAD_F(0x052a0b12) /* 0.322764465 */, 18 }, +/* 4962 */ { MAD_F(0x052a6609) /* 0.322851215 */, 18 }, +/* 4963 */ { MAD_F(0x052ac101) /* 0.322937971 */, 18 }, +/* 4964 */ { MAD_F(0x052b1bfb) /* 0.323024732 */, 18 }, +/* 4965 */ { MAD_F(0x052b76f7) /* 0.323111500 */, 18 }, +/* 4966 */ { MAD_F(0x052bd1f4) /* 0.323198273 */, 18 }, +/* 4967 */ { MAD_F(0x052c2cf2) /* 0.323285052 */, 18 }, +/* 4968 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 18 }, +/* 4969 */ { MAD_F(0x052ce2f4) /* 0.323458628 */, 18 }, +/* 4970 */ { MAD_F(0x052d3df7) /* 0.323545425 */, 18 }, +/* 4971 */ { MAD_F(0x052d98fc) /* 0.323632227 */, 18 }, +/* 4972 */ { MAD_F(0x052df403) /* 0.323719036 */, 18 }, +/* 4973 */ { MAD_F(0x052e4f0b) /* 0.323805850 */, 18 }, +/* 4974 */ { MAD_F(0x052eaa14) /* 0.323892670 */, 18 }, +/* 4975 */ { MAD_F(0x052f051f) /* 0.323979496 */, 18 }, + +/* 4976 */ { MAD_F(0x052f602c) /* 0.324066327 */, 18 }, +/* 4977 */ { MAD_F(0x052fbb3a) /* 0.324153165 */, 18 }, +/* 4978 */ { MAD_F(0x0530164a) /* 0.324240008 */, 18 }, +/* 4979 */ { MAD_F(0x0530715b) /* 0.324326857 */, 18 }, +/* 4980 */ { MAD_F(0x0530cc6e) /* 0.324413712 */, 18 }, +/* 4981 */ { MAD_F(0x05312783) /* 0.324500572 */, 18 }, +/* 4982 */ { MAD_F(0x05318299) /* 0.324587439 */, 18 }, +/* 4983 */ { MAD_F(0x0531ddb0) /* 0.324674311 */, 18 }, +/* 4984 */ { MAD_F(0x053238ca) /* 0.324761189 */, 18 }, +/* 4985 */ { MAD_F(0x053293e4) /* 0.324848073 */, 18 }, +/* 4986 */ { MAD_F(0x0532ef01) /* 0.324934963 */, 18 }, +/* 4987 */ { MAD_F(0x05334a1e) /* 0.325021858 */, 18 }, +/* 4988 */ { MAD_F(0x0533a53e) /* 0.325108760 */, 18 }, +/* 4989 */ { MAD_F(0x0534005f) /* 0.325195667 */, 18 }, +/* 4990 */ { MAD_F(0x05345b81) /* 0.325282580 */, 18 }, +/* 4991 */ { MAD_F(0x0534b6a5) /* 0.325369498 */, 18 }, + +/* 4992 */ { MAD_F(0x053511cb) /* 0.325456423 */, 18 }, +/* 4993 */ { MAD_F(0x05356cf2) /* 0.325543353 */, 18 }, +/* 4994 */ { MAD_F(0x0535c81b) /* 0.325630290 */, 18 }, +/* 4995 */ { MAD_F(0x05362345) /* 0.325717232 */, 18 }, +/* 4996 */ { MAD_F(0x05367e71) /* 0.325804179 */, 18 }, +/* 4997 */ { MAD_F(0x0536d99f) /* 0.325891133 */, 18 }, +/* 4998 */ { MAD_F(0x053734ce) /* 0.325978092 */, 18 }, +/* 4999 */ { MAD_F(0x05378ffe) /* 0.326065057 */, 18 }, +/* 5000 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 18 }, +/* 5001 */ { MAD_F(0x05384664) /* 0.326239005 */, 18 }, +/* 5002 */ { MAD_F(0x0538a199) /* 0.326325988 */, 18 }, +/* 5003 */ { MAD_F(0x0538fcd0) /* 0.326412976 */, 18 }, +/* 5004 */ { MAD_F(0x05395808) /* 0.326499970 */, 18 }, +/* 5005 */ { MAD_F(0x0539b342) /* 0.326586970 */, 18 }, +/* 5006 */ { MAD_F(0x053a0e7d) /* 0.326673976 */, 18 }, +/* 5007 */ { MAD_F(0x053a69ba) /* 0.326760988 */, 18 }, + +/* 5008 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 18 }, +/* 5009 */ { MAD_F(0x053b2039) /* 0.326935028 */, 18 }, +/* 5010 */ { MAD_F(0x053b7b7b) /* 0.327022057 */, 18 }, +/* 5011 */ { MAD_F(0x053bd6be) /* 0.327109092 */, 18 }, +/* 5012 */ { MAD_F(0x053c3203) /* 0.327196132 */, 18 }, +/* 5013 */ { MAD_F(0x053c8d49) /* 0.327283178 */, 18 }, +/* 5014 */ { MAD_F(0x053ce891) /* 0.327370231 */, 18 }, +/* 5015 */ { MAD_F(0x053d43da) /* 0.327457288 */, 18 }, +/* 5016 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 18 }, +/* 5017 */ { MAD_F(0x053dfa72) /* 0.327631421 */, 18 }, +/* 5018 */ { MAD_F(0x053e55c0) /* 0.327718497 */, 18 }, +/* 5019 */ { MAD_F(0x053eb10f) /* 0.327805578 */, 18 }, +/* 5020 */ { MAD_F(0x053f0c61) /* 0.327892665 */, 18 }, +/* 5021 */ { MAD_F(0x053f67b3) /* 0.327979757 */, 18 }, +/* 5022 */ { MAD_F(0x053fc308) /* 0.328066855 */, 18 }, +/* 5023 */ { MAD_F(0x05401e5e) /* 0.328153960 */, 18 }, + +/* 5024 */ { MAD_F(0x054079b5) /* 0.328241070 */, 18 }, +/* 5025 */ { MAD_F(0x0540d50e) /* 0.328328185 */, 18 }, +/* 5026 */ { MAD_F(0x05413068) /* 0.328415307 */, 18 }, +/* 5027 */ { MAD_F(0x05418bc4) /* 0.328502434 */, 18 }, +/* 5028 */ { MAD_F(0x0541e722) /* 0.328589567 */, 18 }, +/* 5029 */ { MAD_F(0x05424281) /* 0.328676706 */, 18 }, +/* 5030 */ { MAD_F(0x05429de2) /* 0.328763850 */, 18 }, +/* 5031 */ { MAD_F(0x0542f944) /* 0.328851001 */, 18 }, +/* 5032 */ { MAD_F(0x054354a8) /* 0.328938157 */, 18 }, +/* 5033 */ { MAD_F(0x0543b00d) /* 0.329025319 */, 18 }, +/* 5034 */ { MAD_F(0x05440b74) /* 0.329112486 */, 18 }, +/* 5035 */ { MAD_F(0x054466dd) /* 0.329199660 */, 18 }, +/* 5036 */ { MAD_F(0x0544c247) /* 0.329286839 */, 18 }, +/* 5037 */ { MAD_F(0x05451db2) /* 0.329374024 */, 18 }, +/* 5038 */ { MAD_F(0x0545791f) /* 0.329461215 */, 18 }, +/* 5039 */ { MAD_F(0x0545d48e) /* 0.329548411 */, 18 }, + +/* 5040 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 18 }, +/* 5041 */ { MAD_F(0x05468b70) /* 0.329722822 */, 18 }, +/* 5042 */ { MAD_F(0x0546e6e3) /* 0.329810036 */, 18 }, +/* 5043 */ { MAD_F(0x05474258) /* 0.329897255 */, 18 }, +/* 5044 */ { MAD_F(0x05479dce) /* 0.329984481 */, 18 }, +/* 5045 */ { MAD_F(0x0547f946) /* 0.330071712 */, 18 }, +/* 5046 */ { MAD_F(0x054854c0) /* 0.330158949 */, 18 }, +/* 5047 */ { MAD_F(0x0548b03b) /* 0.330246191 */, 18 }, +/* 5048 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 18 }, +/* 5049 */ { MAD_F(0x05496735) /* 0.330420694 */, 18 }, +/* 5050 */ { MAD_F(0x0549c2b5) /* 0.330507954 */, 18 }, +/* 5051 */ { MAD_F(0x054a1e36) /* 0.330595220 */, 18 }, +/* 5052 */ { MAD_F(0x054a79b9) /* 0.330682491 */, 18 }, +/* 5053 */ { MAD_F(0x054ad53d) /* 0.330769768 */, 18 }, +/* 5054 */ { MAD_F(0x054b30c3) /* 0.330857051 */, 18 }, +/* 5055 */ { MAD_F(0x054b8c4b) /* 0.330944340 */, 18 }, + +/* 5056 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 18 }, +/* 5057 */ { MAD_F(0x054c435e) /* 0.331118935 */, 18 }, +/* 5058 */ { MAD_F(0x054c9eea) /* 0.331206241 */, 18 }, +/* 5059 */ { MAD_F(0x054cfa78) /* 0.331293553 */, 18 }, +/* 5060 */ { MAD_F(0x054d5607) /* 0.331380870 */, 18 }, +/* 5061 */ { MAD_F(0x054db197) /* 0.331468193 */, 18 }, +/* 5062 */ { MAD_F(0x054e0d2a) /* 0.331555522 */, 18 }, +/* 5063 */ { MAD_F(0x054e68bd) /* 0.331642857 */, 18 }, +/* 5064 */ { MAD_F(0x054ec453) /* 0.331730198 */, 18 }, +/* 5065 */ { MAD_F(0x054f1fe9) /* 0.331817544 */, 18 }, +/* 5066 */ { MAD_F(0x054f7b82) /* 0.331904896 */, 18 }, +/* 5067 */ { MAD_F(0x054fd71c) /* 0.331992254 */, 18 }, +/* 5068 */ { MAD_F(0x055032b7) /* 0.332079617 */, 18 }, +/* 5069 */ { MAD_F(0x05508e54) /* 0.332166986 */, 18 }, +/* 5070 */ { MAD_F(0x0550e9f3) /* 0.332254361 */, 18 }, +/* 5071 */ { MAD_F(0x05514593) /* 0.332341742 */, 18 }, + +/* 5072 */ { MAD_F(0x0551a134) /* 0.332429129 */, 18 }, +/* 5073 */ { MAD_F(0x0551fcd8) /* 0.332516521 */, 18 }, +/* 5074 */ { MAD_F(0x0552587c) /* 0.332603919 */, 18 }, +/* 5075 */ { MAD_F(0x0552b423) /* 0.332691323 */, 18 }, +/* 5076 */ { MAD_F(0x05530fca) /* 0.332778732 */, 18 }, +/* 5077 */ { MAD_F(0x05536b74) /* 0.332866147 */, 18 }, +/* 5078 */ { MAD_F(0x0553c71f) /* 0.332953568 */, 18 }, +/* 5079 */ { MAD_F(0x055422cb) /* 0.333040995 */, 18 }, +/* 5080 */ { MAD_F(0x05547e79) /* 0.333128427 */, 18 }, +/* 5081 */ { MAD_F(0x0554da29) /* 0.333215865 */, 18 }, +/* 5082 */ { MAD_F(0x055535da) /* 0.333303309 */, 18 }, +/* 5083 */ { MAD_F(0x0555918c) /* 0.333390759 */, 18 }, +/* 5084 */ { MAD_F(0x0555ed40) /* 0.333478214 */, 18 }, +/* 5085 */ { MAD_F(0x055648f6) /* 0.333565675 */, 18 }, +/* 5086 */ { MAD_F(0x0556a4ad) /* 0.333653142 */, 18 }, +/* 5087 */ { MAD_F(0x05570066) /* 0.333740615 */, 18 }, + +/* 5088 */ { MAD_F(0x05575c20) /* 0.333828093 */, 18 }, +/* 5089 */ { MAD_F(0x0557b7dc) /* 0.333915577 */, 18 }, +/* 5090 */ { MAD_F(0x05581399) /* 0.334003067 */, 18 }, +/* 5091 */ { MAD_F(0x05586f58) /* 0.334090562 */, 18 }, +/* 5092 */ { MAD_F(0x0558cb19) /* 0.334178063 */, 18 }, +/* 5093 */ { MAD_F(0x055926db) /* 0.334265570 */, 18 }, +/* 5094 */ { MAD_F(0x0559829e) /* 0.334353083 */, 18 }, +/* 5095 */ { MAD_F(0x0559de63) /* 0.334440601 */, 18 }, +/* 5096 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 18 }, +/* 5097 */ { MAD_F(0x055a95f2) /* 0.334615655 */, 18 }, +/* 5098 */ { MAD_F(0x055af1bb) /* 0.334703191 */, 18 }, +/* 5099 */ { MAD_F(0x055b4d87) /* 0.334790732 */, 18 }, +/* 5100 */ { MAD_F(0x055ba953) /* 0.334878279 */, 18 }, +/* 5101 */ { MAD_F(0x055c0522) /* 0.334965832 */, 18 }, +/* 5102 */ { MAD_F(0x055c60f1) /* 0.335053391 */, 18 }, +/* 5103 */ { MAD_F(0x055cbcc3) /* 0.335140955 */, 18 }, + +/* 5104 */ { MAD_F(0x055d1896) /* 0.335228525 */, 18 }, +/* 5105 */ { MAD_F(0x055d746a) /* 0.335316100 */, 18 }, +/* 5106 */ { MAD_F(0x055dd040) /* 0.335403682 */, 18 }, +/* 5107 */ { MAD_F(0x055e2c17) /* 0.335491269 */, 18 }, +/* 5108 */ { MAD_F(0x055e87f0) /* 0.335578861 */, 18 }, +/* 5109 */ { MAD_F(0x055ee3cb) /* 0.335666460 */, 18 }, +/* 5110 */ { MAD_F(0x055f3fa7) /* 0.335754064 */, 18 }, +/* 5111 */ { MAD_F(0x055f9b85) /* 0.335841674 */, 18 }, +/* 5112 */ { MAD_F(0x055ff764) /* 0.335929290 */, 18 }, +/* 5113 */ { MAD_F(0x05605344) /* 0.336016911 */, 18 }, +/* 5114 */ { MAD_F(0x0560af27) /* 0.336104538 */, 18 }, +/* 5115 */ { MAD_F(0x05610b0a) /* 0.336192171 */, 18 }, +/* 5116 */ { MAD_F(0x056166f0) /* 0.336279809 */, 18 }, +/* 5117 */ { MAD_F(0x0561c2d7) /* 0.336367453 */, 18 }, +/* 5118 */ { MAD_F(0x05621ebf) /* 0.336455103 */, 18 }, +/* 5119 */ { MAD_F(0x05627aa9) /* 0.336542759 */, 18 }, + +/* 5120 */ { MAD_F(0x0562d694) /* 0.336630420 */, 18 }, +/* 5121 */ { MAD_F(0x05633281) /* 0.336718087 */, 18 }, +/* 5122 */ { MAD_F(0x05638e70) /* 0.336805760 */, 18 }, +/* 5123 */ { MAD_F(0x0563ea60) /* 0.336893439 */, 18 }, +/* 5124 */ { MAD_F(0x05644651) /* 0.336981123 */, 18 }, +/* 5125 */ { MAD_F(0x0564a244) /* 0.337068813 */, 18 }, +/* 5126 */ { MAD_F(0x0564fe39) /* 0.337156508 */, 18 }, +/* 5127 */ { MAD_F(0x05655a2f) /* 0.337244209 */, 18 }, +/* 5128 */ { MAD_F(0x0565b627) /* 0.337331916 */, 18 }, +/* 5129 */ { MAD_F(0x05661220) /* 0.337419629 */, 18 }, +/* 5130 */ { MAD_F(0x05666e1a) /* 0.337507347 */, 18 }, +/* 5131 */ { MAD_F(0x0566ca17) /* 0.337595071 */, 18 }, +/* 5132 */ { MAD_F(0x05672614) /* 0.337682801 */, 18 }, +/* 5133 */ { MAD_F(0x05678214) /* 0.337770537 */, 18 }, +/* 5134 */ { MAD_F(0x0567de15) /* 0.337858278 */, 18 }, +/* 5135 */ { MAD_F(0x05683a17) /* 0.337946025 */, 18 }, + +/* 5136 */ { MAD_F(0x0568961b) /* 0.338033777 */, 18 }, +/* 5137 */ { MAD_F(0x0568f220) /* 0.338121535 */, 18 }, +/* 5138 */ { MAD_F(0x05694e27) /* 0.338209299 */, 18 }, +/* 5139 */ { MAD_F(0x0569aa30) /* 0.338297069 */, 18 }, +/* 5140 */ { MAD_F(0x056a063a) /* 0.338384844 */, 18 }, +/* 5141 */ { MAD_F(0x056a6245) /* 0.338472625 */, 18 }, +/* 5142 */ { MAD_F(0x056abe52) /* 0.338560412 */, 18 }, +/* 5143 */ { MAD_F(0x056b1a61) /* 0.338648204 */, 18 }, +/* 5144 */ { MAD_F(0x056b7671) /* 0.338736002 */, 18 }, +/* 5145 */ { MAD_F(0x056bd283) /* 0.338823806 */, 18 }, +/* 5146 */ { MAD_F(0x056c2e96) /* 0.338911616 */, 18 }, +/* 5147 */ { MAD_F(0x056c8aab) /* 0.338999431 */, 18 }, +/* 5148 */ { MAD_F(0x056ce6c1) /* 0.339087252 */, 18 }, +/* 5149 */ { MAD_F(0x056d42d9) /* 0.339175078 */, 18 }, +/* 5150 */ { MAD_F(0x056d9ef2) /* 0.339262910 */, 18 }, +/* 5151 */ { MAD_F(0x056dfb0d) /* 0.339350748 */, 18 }, + +/* 5152 */ { MAD_F(0x056e5729) /* 0.339438592 */, 18 }, +/* 5153 */ { MAD_F(0x056eb347) /* 0.339526441 */, 18 }, +/* 5154 */ { MAD_F(0x056f0f66) /* 0.339614296 */, 18 }, +/* 5155 */ { MAD_F(0x056f6b87) /* 0.339702157 */, 18 }, +/* 5156 */ { MAD_F(0x056fc7aa) /* 0.339790023 */, 18 }, +/* 5157 */ { MAD_F(0x057023cd) /* 0.339877895 */, 18 }, +/* 5158 */ { MAD_F(0x05707ff3) /* 0.339965773 */, 18 }, +/* 5159 */ { MAD_F(0x0570dc1a) /* 0.340053656 */, 18 }, +/* 5160 */ { MAD_F(0x05713843) /* 0.340141545 */, 18 }, +/* 5161 */ { MAD_F(0x0571946d) /* 0.340229440 */, 18 }, +/* 5162 */ { MAD_F(0x0571f098) /* 0.340317340 */, 18 }, +/* 5163 */ { MAD_F(0x05724cc5) /* 0.340405246 */, 18 }, +/* 5164 */ { MAD_F(0x0572a8f4) /* 0.340493158 */, 18 }, +/* 5165 */ { MAD_F(0x05730524) /* 0.340581075 */, 18 }, +/* 5166 */ { MAD_F(0x05736156) /* 0.340668999 */, 18 }, +/* 5167 */ { MAD_F(0x0573bd89) /* 0.340756927 */, 18 }, + +/* 5168 */ { MAD_F(0x057419be) /* 0.340844862 */, 18 }, +/* 5169 */ { MAD_F(0x057475f4) /* 0.340932802 */, 18 }, +/* 5170 */ { MAD_F(0x0574d22c) /* 0.341020748 */, 18 }, +/* 5171 */ { MAD_F(0x05752e65) /* 0.341108699 */, 18 }, +/* 5172 */ { MAD_F(0x05758aa0) /* 0.341196656 */, 18 }, +/* 5173 */ { MAD_F(0x0575e6dc) /* 0.341284619 */, 18 }, +/* 5174 */ { MAD_F(0x0576431a) /* 0.341372587 */, 18 }, +/* 5175 */ { MAD_F(0x05769f59) /* 0.341460562 */, 18 }, +/* 5176 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 18 }, +/* 5177 */ { MAD_F(0x057757dd) /* 0.341636527 */, 18 }, +/* 5178 */ { MAD_F(0x0577b421) /* 0.341724518 */, 18 }, +/* 5179 */ { MAD_F(0x05781066) /* 0.341812515 */, 18 }, +/* 5180 */ { MAD_F(0x05786cad) /* 0.341900517 */, 18 }, +/* 5181 */ { MAD_F(0x0578c8f5) /* 0.341988525 */, 18 }, +/* 5182 */ { MAD_F(0x0579253f) /* 0.342076539 */, 18 }, +/* 5183 */ { MAD_F(0x0579818b) /* 0.342164558 */, 18 }, + +/* 5184 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 18 }, +/* 5185 */ { MAD_F(0x057a3a27) /* 0.342340614 */, 18 }, +/* 5186 */ { MAD_F(0x057a9677) /* 0.342428651 */, 18 }, +/* 5187 */ { MAD_F(0x057af2c8) /* 0.342516693 */, 18 }, +/* 5188 */ { MAD_F(0x057b4f1c) /* 0.342604741 */, 18 }, +/* 5189 */ { MAD_F(0x057bab70) /* 0.342692794 */, 18 }, +/* 5190 */ { MAD_F(0x057c07c6) /* 0.342780853 */, 18 }, +/* 5191 */ { MAD_F(0x057c641e) /* 0.342868918 */, 18 }, +/* 5192 */ { MAD_F(0x057cc077) /* 0.342956988 */, 18 }, +/* 5193 */ { MAD_F(0x057d1cd2) /* 0.343045064 */, 18 }, +/* 5194 */ { MAD_F(0x057d792e) /* 0.343133146 */, 18 }, +/* 5195 */ { MAD_F(0x057dd58c) /* 0.343221233 */, 18 }, +/* 5196 */ { MAD_F(0x057e31eb) /* 0.343309326 */, 18 }, +/* 5197 */ { MAD_F(0x057e8e4c) /* 0.343397425 */, 18 }, +/* 5198 */ { MAD_F(0x057eeaae) /* 0.343485529 */, 18 }, +/* 5199 */ { MAD_F(0x057f4712) /* 0.343573639 */, 18 }, + +/* 5200 */ { MAD_F(0x057fa378) /* 0.343661754 */, 18 }, +/* 5201 */ { MAD_F(0x057fffde) /* 0.343749876 */, 18 }, +/* 5202 */ { MAD_F(0x05805c47) /* 0.343838003 */, 18 }, +/* 5203 */ { MAD_F(0x0580b8b1) /* 0.343926135 */, 18 }, +/* 5204 */ { MAD_F(0x0581151c) /* 0.344014273 */, 18 }, +/* 5205 */ { MAD_F(0x05817189) /* 0.344102417 */, 18 }, +/* 5206 */ { MAD_F(0x0581cdf7) /* 0.344190566 */, 18 }, +/* 5207 */ { MAD_F(0x05822a67) /* 0.344278722 */, 18 }, +/* 5208 */ { MAD_F(0x058286d9) /* 0.344366882 */, 18 }, +/* 5209 */ { MAD_F(0x0582e34c) /* 0.344455049 */, 18 }, +/* 5210 */ { MAD_F(0x05833fc0) /* 0.344543221 */, 18 }, +/* 5211 */ { MAD_F(0x05839c36) /* 0.344631398 */, 18 }, +/* 5212 */ { MAD_F(0x0583f8ae) /* 0.344719582 */, 18 }, +/* 5213 */ { MAD_F(0x05845527) /* 0.344807771 */, 18 }, +/* 5214 */ { MAD_F(0x0584b1a1) /* 0.344895965 */, 18 }, +/* 5215 */ { MAD_F(0x05850e1e) /* 0.344984165 */, 18 }, + +/* 5216 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 18 }, +/* 5217 */ { MAD_F(0x0585c71a) /* 0.345160583 */, 18 }, +/* 5218 */ { MAD_F(0x0586239b) /* 0.345248800 */, 18 }, +/* 5219 */ { MAD_F(0x0586801d) /* 0.345337023 */, 18 }, +/* 5220 */ { MAD_F(0x0586dca1) /* 0.345425251 */, 18 }, +/* 5221 */ { MAD_F(0x05873926) /* 0.345513485 */, 18 }, +/* 5222 */ { MAD_F(0x058795ac) /* 0.345601725 */, 18 }, +/* 5223 */ { MAD_F(0x0587f235) /* 0.345689970 */, 18 }, +/* 5224 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 18 }, +/* 5225 */ { MAD_F(0x0588ab49) /* 0.345866478 */, 18 }, +/* 5226 */ { MAD_F(0x058907d6) /* 0.345954740 */, 18 }, +/* 5227 */ { MAD_F(0x05896464) /* 0.346043008 */, 18 }, +/* 5228 */ { MAD_F(0x0589c0f4) /* 0.346131281 */, 18 }, +/* 5229 */ { MAD_F(0x058a1d85) /* 0.346219560 */, 18 }, +/* 5230 */ { MAD_F(0x058a7a18) /* 0.346307845 */, 18 }, +/* 5231 */ { MAD_F(0x058ad6ac) /* 0.346396135 */, 18 }, + +/* 5232 */ { MAD_F(0x058b3342) /* 0.346484431 */, 18 }, +/* 5233 */ { MAD_F(0x058b8fd9) /* 0.346572733 */, 18 }, +/* 5234 */ { MAD_F(0x058bec72) /* 0.346661040 */, 18 }, +/* 5235 */ { MAD_F(0x058c490c) /* 0.346749353 */, 18 }, +/* 5236 */ { MAD_F(0x058ca5a8) /* 0.346837671 */, 18 }, +/* 5237 */ { MAD_F(0x058d0246) /* 0.346925996 */, 18 }, +/* 5238 */ { MAD_F(0x058d5ee4) /* 0.347014325 */, 18 }, +/* 5239 */ { MAD_F(0x058dbb85) /* 0.347102661 */, 18 }, +/* 5240 */ { MAD_F(0x058e1827) /* 0.347191002 */, 18 }, +/* 5241 */ { MAD_F(0x058e74ca) /* 0.347279348 */, 18 }, +/* 5242 */ { MAD_F(0x058ed16f) /* 0.347367700 */, 18 }, +/* 5243 */ { MAD_F(0x058f2e15) /* 0.347456058 */, 18 }, +/* 5244 */ { MAD_F(0x058f8abd) /* 0.347544422 */, 18 }, +/* 5245 */ { MAD_F(0x058fe766) /* 0.347632791 */, 18 }, +/* 5246 */ { MAD_F(0x05904411) /* 0.347721165 */, 18 }, +/* 5247 */ { MAD_F(0x0590a0be) /* 0.347809546 */, 18 }, + +/* 5248 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 18 }, +/* 5249 */ { MAD_F(0x05915a1b) /* 0.347986323 */, 18 }, +/* 5250 */ { MAD_F(0x0591b6cc) /* 0.348074720 */, 18 }, +/* 5251 */ { MAD_F(0x0592137e) /* 0.348163123 */, 18 }, +/* 5252 */ { MAD_F(0x05927032) /* 0.348251531 */, 18 }, +/* 5253 */ { MAD_F(0x0592cce8) /* 0.348339945 */, 18 }, +/* 5254 */ { MAD_F(0x0593299f) /* 0.348428365 */, 18 }, +/* 5255 */ { MAD_F(0x05938657) /* 0.348516790 */, 18 }, +/* 5256 */ { MAD_F(0x0593e311) /* 0.348605221 */, 18 }, +/* 5257 */ { MAD_F(0x05943fcd) /* 0.348693657 */, 18 }, +/* 5258 */ { MAD_F(0x05949c8a) /* 0.348782099 */, 18 }, +/* 5259 */ { MAD_F(0x0594f948) /* 0.348870547 */, 18 }, +/* 5260 */ { MAD_F(0x05955608) /* 0.348959000 */, 18 }, +/* 5261 */ { MAD_F(0x0595b2ca) /* 0.349047459 */, 18 }, +/* 5262 */ { MAD_F(0x05960f8c) /* 0.349135923 */, 18 }, +/* 5263 */ { MAD_F(0x05966c51) /* 0.349224393 */, 18 }, + +/* 5264 */ { MAD_F(0x0596c917) /* 0.349312869 */, 18 }, +/* 5265 */ { MAD_F(0x059725de) /* 0.349401350 */, 18 }, +/* 5266 */ { MAD_F(0x059782a7) /* 0.349489837 */, 18 }, +/* 5267 */ { MAD_F(0x0597df72) /* 0.349578329 */, 18 }, +/* 5268 */ { MAD_F(0x05983c3e) /* 0.349666827 */, 18 }, +/* 5269 */ { MAD_F(0x0598990c) /* 0.349755331 */, 18 }, +/* 5270 */ { MAD_F(0x0598f5db) /* 0.349843840 */, 18 }, +/* 5271 */ { MAD_F(0x059952ab) /* 0.349932355 */, 18 }, +/* 5272 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 18 }, +/* 5273 */ { MAD_F(0x059a0c51) /* 0.350109402 */, 18 }, +/* 5274 */ { MAD_F(0x059a6926) /* 0.350197933 */, 18 }, +/* 5275 */ { MAD_F(0x059ac5fc) /* 0.350286470 */, 18 }, +/* 5276 */ { MAD_F(0x059b22d4) /* 0.350375013 */, 18 }, +/* 5277 */ { MAD_F(0x059b7fae) /* 0.350463562 */, 18 }, +/* 5278 */ { MAD_F(0x059bdc89) /* 0.350552116 */, 18 }, +/* 5279 */ { MAD_F(0x059c3965) /* 0.350640675 */, 18 }, + +/* 5280 */ { MAD_F(0x059c9643) /* 0.350729240 */, 18 }, +/* 5281 */ { MAD_F(0x059cf323) /* 0.350817811 */, 18 }, +/* 5282 */ { MAD_F(0x059d5004) /* 0.350906388 */, 18 }, +/* 5283 */ { MAD_F(0x059dace6) /* 0.350994970 */, 18 }, +/* 5284 */ { MAD_F(0x059e09cb) /* 0.351083557 */, 18 }, +/* 5285 */ { MAD_F(0x059e66b0) /* 0.351172150 */, 18 }, +/* 5286 */ { MAD_F(0x059ec397) /* 0.351260749 */, 18 }, +/* 5287 */ { MAD_F(0x059f2080) /* 0.351349353 */, 18 }, +/* 5288 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 18 }, +/* 5289 */ { MAD_F(0x059fda55) /* 0.351526579 */, 18 }, +/* 5290 */ { MAD_F(0x05a03742) /* 0.351615200 */, 18 }, +/* 5291 */ { MAD_F(0x05a09431) /* 0.351703827 */, 18 }, +/* 5292 */ { MAD_F(0x05a0f121) /* 0.351792459 */, 18 }, +/* 5293 */ { MAD_F(0x05a14e12) /* 0.351881097 */, 18 }, +/* 5294 */ { MAD_F(0x05a1ab05) /* 0.351969740 */, 18 }, +/* 5295 */ { MAD_F(0x05a207fa) /* 0.352058389 */, 18 }, + +/* 5296 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 18 }, +/* 5297 */ { MAD_F(0x05a2c1e7) /* 0.352235704 */, 18 }, +/* 5298 */ { MAD_F(0x05a31ee1) /* 0.352324369 */, 18 }, +/* 5299 */ { MAD_F(0x05a37bdb) /* 0.352413041 */, 18 }, +/* 5300 */ { MAD_F(0x05a3d8d7) /* 0.352501718 */, 18 }, +/* 5301 */ { MAD_F(0x05a435d5) /* 0.352590400 */, 18 }, +/* 5302 */ { MAD_F(0x05a492d4) /* 0.352679088 */, 18 }, +/* 5303 */ { MAD_F(0x05a4efd4) /* 0.352767782 */, 18 }, +/* 5304 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 18 }, +/* 5305 */ { MAD_F(0x05a5a9da) /* 0.352945186 */, 18 }, +/* 5306 */ { MAD_F(0x05a606df) /* 0.353033896 */, 18 }, +/* 5307 */ { MAD_F(0x05a663e5) /* 0.353122612 */, 18 }, +/* 5308 */ { MAD_F(0x05a6c0ed) /* 0.353211333 */, 18 }, +/* 5309 */ { MAD_F(0x05a71df7) /* 0.353300061 */, 18 }, +/* 5310 */ { MAD_F(0x05a77b02) /* 0.353388793 */, 18 }, +/* 5311 */ { MAD_F(0x05a7d80e) /* 0.353477531 */, 18 }, + +/* 5312 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 18 }, +/* 5313 */ { MAD_F(0x05a8922c) /* 0.353655024 */, 18 }, +/* 5314 */ { MAD_F(0x05a8ef3c) /* 0.353743779 */, 18 }, +/* 5315 */ { MAD_F(0x05a94c4f) /* 0.353832540 */, 18 }, +/* 5316 */ { MAD_F(0x05a9a963) /* 0.353921306 */, 18 }, +/* 5317 */ { MAD_F(0x05aa0678) /* 0.354010077 */, 18 }, +/* 5318 */ { MAD_F(0x05aa638f) /* 0.354098855 */, 18 }, +/* 5319 */ { MAD_F(0x05aac0a8) /* 0.354187637 */, 18 }, +/* 5320 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 18 }, +/* 5321 */ { MAD_F(0x05ab7add) /* 0.354365220 */, 18 }, +/* 5322 */ { MAD_F(0x05abd7fa) /* 0.354454019 */, 18 }, +/* 5323 */ { MAD_F(0x05ac3518) /* 0.354542824 */, 18 }, +/* 5324 */ { MAD_F(0x05ac9238) /* 0.354631635 */, 18 }, +/* 5325 */ { MAD_F(0x05acef5a) /* 0.354720451 */, 18 }, +/* 5326 */ { MAD_F(0x05ad4c7d) /* 0.354809272 */, 18 }, +/* 5327 */ { MAD_F(0x05ada9a1) /* 0.354898100 */, 18 }, + +/* 5328 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 18 }, +/* 5329 */ { MAD_F(0x05ae63ee) /* 0.355075771 */, 18 }, +/* 5330 */ { MAD_F(0x05aec117) /* 0.355164615 */, 18 }, +/* 5331 */ { MAD_F(0x05af1e41) /* 0.355253464 */, 18 }, +/* 5332 */ { MAD_F(0x05af7b6d) /* 0.355342319 */, 18 }, +/* 5333 */ { MAD_F(0x05afd89b) /* 0.355431180 */, 18 }, +/* 5334 */ { MAD_F(0x05b035c9) /* 0.355520046 */, 18 }, +/* 5335 */ { MAD_F(0x05b092fa) /* 0.355608917 */, 18 }, +/* 5336 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 18 }, +/* 5337 */ { MAD_F(0x05b14d5f) /* 0.355786677 */, 18 }, +/* 5338 */ { MAD_F(0x05b1aa94) /* 0.355875566 */, 18 }, +/* 5339 */ { MAD_F(0x05b207ca) /* 0.355964460 */, 18 }, +/* 5340 */ { MAD_F(0x05b26502) /* 0.356053359 */, 18 }, +/* 5341 */ { MAD_F(0x05b2c23b) /* 0.356142264 */, 18 }, +/* 5342 */ { MAD_F(0x05b31f76) /* 0.356231175 */, 18 }, +/* 5343 */ { MAD_F(0x05b37cb2) /* 0.356320091 */, 18 }, + +/* 5344 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 18 }, +/* 5345 */ { MAD_F(0x05b4372f) /* 0.356497940 */, 18 }, +/* 5346 */ { MAD_F(0x05b4946f) /* 0.356586872 */, 18 }, +/* 5347 */ { MAD_F(0x05b4f1b2) /* 0.356675811 */, 18 }, +/* 5348 */ { MAD_F(0x05b54ef5) /* 0.356764754 */, 18 }, +/* 5349 */ { MAD_F(0x05b5ac3a) /* 0.356853704 */, 18 }, +/* 5350 */ { MAD_F(0x05b60981) /* 0.356942659 */, 18 }, +/* 5351 */ { MAD_F(0x05b666c9) /* 0.357031619 */, 18 }, +/* 5352 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 18 }, +/* 5353 */ { MAD_F(0x05b7215e) /* 0.357209557 */, 18 }, +/* 5354 */ { MAD_F(0x05b77eab) /* 0.357298534 */, 18 }, +/* 5355 */ { MAD_F(0x05b7dbf9) /* 0.357387516 */, 18 }, +/* 5356 */ { MAD_F(0x05b83948) /* 0.357476504 */, 18 }, +/* 5357 */ { MAD_F(0x05b89699) /* 0.357565498 */, 18 }, +/* 5358 */ { MAD_F(0x05b8f3ec) /* 0.357654497 */, 18 }, +/* 5359 */ { MAD_F(0x05b95140) /* 0.357743502 */, 18 }, + +/* 5360 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 18 }, +/* 5361 */ { MAD_F(0x05ba0bec) /* 0.357921528 */, 18 }, +/* 5362 */ { MAD_F(0x05ba6945) /* 0.358010550 */, 18 }, +/* 5363 */ { MAD_F(0x05bac69f) /* 0.358099576 */, 18 }, +/* 5364 */ { MAD_F(0x05bb23fa) /* 0.358188609 */, 18 }, +/* 5365 */ { MAD_F(0x05bb8157) /* 0.358277647 */, 18 }, +/* 5366 */ { MAD_F(0x05bbdeb6) /* 0.358366690 */, 18 }, +/* 5367 */ { MAD_F(0x05bc3c16) /* 0.358455739 */, 18 }, +/* 5368 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 18 }, +/* 5369 */ { MAD_F(0x05bcf6da) /* 0.358633854 */, 18 }, +/* 5370 */ { MAD_F(0x05bd543e) /* 0.358722920 */, 18 }, +/* 5371 */ { MAD_F(0x05bdb1a4) /* 0.358811991 */, 18 }, +/* 5372 */ { MAD_F(0x05be0f0b) /* 0.358901067 */, 18 }, +/* 5373 */ { MAD_F(0x05be6c74) /* 0.358990150 */, 18 }, +/* 5374 */ { MAD_F(0x05bec9df) /* 0.359079237 */, 18 }, +/* 5375 */ { MAD_F(0x05bf274a) /* 0.359168331 */, 18 }, + +/* 5376 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 18 }, +/* 5377 */ { MAD_F(0x05bfe226) /* 0.359346534 */, 18 }, +/* 5378 */ { MAD_F(0x05c03f97) /* 0.359435644 */, 18 }, +/* 5379 */ { MAD_F(0x05c09d08) /* 0.359524759 */, 18 }, +/* 5380 */ { MAD_F(0x05c0fa7c) /* 0.359613880 */, 18 }, +/* 5381 */ { MAD_F(0x05c157f0) /* 0.359703006 */, 18 }, +/* 5382 */ { MAD_F(0x05c1b566) /* 0.359792138 */, 18 }, +/* 5383 */ { MAD_F(0x05c212de) /* 0.359881276 */, 18 }, +/* 5384 */ { MAD_F(0x05c27057) /* 0.359970419 */, 18 }, +/* 5385 */ { MAD_F(0x05c2cdd2) /* 0.360059567 */, 18 }, +/* 5386 */ { MAD_F(0x05c32b4e) /* 0.360148721 */, 18 }, +/* 5387 */ { MAD_F(0x05c388cb) /* 0.360237881 */, 18 }, +/* 5388 */ { MAD_F(0x05c3e64b) /* 0.360327046 */, 18 }, +/* 5389 */ { MAD_F(0x05c443cb) /* 0.360416216 */, 18 }, +/* 5390 */ { MAD_F(0x05c4a14d) /* 0.360505392 */, 18 }, +/* 5391 */ { MAD_F(0x05c4fed1) /* 0.360594574 */, 18 }, + +/* 5392 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 18 }, +/* 5393 */ { MAD_F(0x05c5b9dc) /* 0.360772953 */, 18 }, +/* 5394 */ { MAD_F(0x05c61764) /* 0.360862152 */, 18 }, +/* 5395 */ { MAD_F(0x05c674ed) /* 0.360951355 */, 18 }, +/* 5396 */ { MAD_F(0x05c6d278) /* 0.361040564 */, 18 }, +/* 5397 */ { MAD_F(0x05c73005) /* 0.361129779 */, 18 }, +/* 5398 */ { MAD_F(0x05c78d93) /* 0.361218999 */, 18 }, +/* 5399 */ { MAD_F(0x05c7eb22) /* 0.361308225 */, 18 }, +/* 5400 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 18 }, +/* 5401 */ { MAD_F(0x05c8a645) /* 0.361486693 */, 18 }, +/* 5402 */ { MAD_F(0x05c903d9) /* 0.361575935 */, 18 }, +/* 5403 */ { MAD_F(0x05c9616e) /* 0.361665183 */, 18 }, +/* 5404 */ { MAD_F(0x05c9bf05) /* 0.361754436 */, 18 }, +/* 5405 */ { MAD_F(0x05ca1c9d) /* 0.361843695 */, 18 }, +/* 5406 */ { MAD_F(0x05ca7a37) /* 0.361932959 */, 18 }, +/* 5407 */ { MAD_F(0x05cad7d2) /* 0.362022229 */, 18 }, + +/* 5408 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 18 }, +/* 5409 */ { MAD_F(0x05cb930d) /* 0.362200785 */, 18 }, +/* 5410 */ { MAD_F(0x05cbf0ac) /* 0.362290071 */, 18 }, +/* 5411 */ { MAD_F(0x05cc4e4d) /* 0.362379362 */, 18 }, +/* 5412 */ { MAD_F(0x05ccabf0) /* 0.362468660 */, 18 }, +/* 5413 */ { MAD_F(0x05cd0994) /* 0.362557962 */, 18 }, +/* 5414 */ { MAD_F(0x05cd6739) /* 0.362647271 */, 18 }, +/* 5415 */ { MAD_F(0x05cdc4e0) /* 0.362736584 */, 18 }, +/* 5416 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 18 }, +/* 5417 */ { MAD_F(0x05ce8033) /* 0.362915228 */, 18 }, +/* 5418 */ { MAD_F(0x05ceddde) /* 0.363004559 */, 18 }, +/* 5419 */ { MAD_F(0x05cf3b8b) /* 0.363093894 */, 18 }, +/* 5420 */ { MAD_F(0x05cf9939) /* 0.363183236 */, 18 }, +/* 5421 */ { MAD_F(0x05cff6e9) /* 0.363272582 */, 18 }, +/* 5422 */ { MAD_F(0x05d0549a) /* 0.363361935 */, 18 }, +/* 5423 */ { MAD_F(0x05d0b24d) /* 0.363451292 */, 18 }, + +/* 5424 */ { MAD_F(0x05d11001) /* 0.363540655 */, 18 }, +/* 5425 */ { MAD_F(0x05d16db7) /* 0.363630024 */, 18 }, +/* 5426 */ { MAD_F(0x05d1cb6e) /* 0.363719398 */, 18 }, +/* 5427 */ { MAD_F(0x05d22927) /* 0.363808778 */, 18 }, +/* 5428 */ { MAD_F(0x05d286e1) /* 0.363898163 */, 18 }, +/* 5429 */ { MAD_F(0x05d2e49d) /* 0.363987554 */, 18 }, +/* 5430 */ { MAD_F(0x05d3425a) /* 0.364076950 */, 18 }, +/* 5431 */ { MAD_F(0x05d3a018) /* 0.364166352 */, 18 }, +/* 5432 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 18 }, +/* 5433 */ { MAD_F(0x05d45b9a) /* 0.364345171 */, 18 }, +/* 5434 */ { MAD_F(0x05d4b95d) /* 0.364434589 */, 18 }, +/* 5435 */ { MAD_F(0x05d51721) /* 0.364524013 */, 18 }, +/* 5436 */ { MAD_F(0x05d574e7) /* 0.364613442 */, 18 }, +/* 5437 */ { MAD_F(0x05d5d2af) /* 0.364702877 */, 18 }, +/* 5438 */ { MAD_F(0x05d63078) /* 0.364792317 */, 18 }, +/* 5439 */ { MAD_F(0x05d68e42) /* 0.364881762 */, 18 }, + +/* 5440 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 18 }, +/* 5441 */ { MAD_F(0x05d749db) /* 0.365060669 */, 18 }, +/* 5442 */ { MAD_F(0x05d7a7aa) /* 0.365150131 */, 18 }, +/* 5443 */ { MAD_F(0x05d8057a) /* 0.365239599 */, 18 }, +/* 5444 */ { MAD_F(0x05d8634c) /* 0.365329072 */, 18 }, +/* 5445 */ { MAD_F(0x05d8c11f) /* 0.365418550 */, 18 }, +/* 5446 */ { MAD_F(0x05d91ef4) /* 0.365508034 */, 18 }, +/* 5447 */ { MAD_F(0x05d97cca) /* 0.365597523 */, 18 }, +/* 5448 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 18 }, +/* 5449 */ { MAD_F(0x05da387a) /* 0.365776518 */, 18 }, +/* 5450 */ { MAD_F(0x05da9655) /* 0.365866024 */, 18 }, +/* 5451 */ { MAD_F(0x05daf431) /* 0.365955536 */, 18 }, +/* 5452 */ { MAD_F(0x05db520e) /* 0.366045052 */, 18 }, +/* 5453 */ { MAD_F(0x05dbafed) /* 0.366134574 */, 18 }, +/* 5454 */ { MAD_F(0x05dc0dce) /* 0.366224102 */, 18 }, +/* 5455 */ { MAD_F(0x05dc6baf) /* 0.366313635 */, 18 }, + +/* 5456 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 18 }, +/* 5457 */ { MAD_F(0x05dd2778) /* 0.366492718 */, 18 }, +/* 5458 */ { MAD_F(0x05dd855e) /* 0.366582267 */, 18 }, +/* 5459 */ { MAD_F(0x05dde346) /* 0.366671822 */, 18 }, +/* 5460 */ { MAD_F(0x05de412f) /* 0.366761383 */, 18 }, +/* 5461 */ { MAD_F(0x05de9f1a) /* 0.366850949 */, 18 }, +/* 5462 */ { MAD_F(0x05defd06) /* 0.366940520 */, 18 }, +/* 5463 */ { MAD_F(0x05df5af3) /* 0.367030097 */, 18 }, +/* 5464 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 18 }, +/* 5465 */ { MAD_F(0x05e016d3) /* 0.367209267 */, 18 }, +/* 5466 */ { MAD_F(0x05e074c5) /* 0.367298861 */, 18 }, +/* 5467 */ { MAD_F(0x05e0d2b8) /* 0.367388459 */, 18 }, +/* 5468 */ { MAD_F(0x05e130ad) /* 0.367478064 */, 18 }, +/* 5469 */ { MAD_F(0x05e18ea4) /* 0.367567673 */, 18 }, +/* 5470 */ { MAD_F(0x05e1ec9c) /* 0.367657288 */, 18 }, +/* 5471 */ { MAD_F(0x05e24a95) /* 0.367746909 */, 18 }, + +/* 5472 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 18 }, +/* 5473 */ { MAD_F(0x05e3068c) /* 0.367926167 */, 18 }, +/* 5474 */ { MAD_F(0x05e3648a) /* 0.368015804 */, 18 }, +/* 5475 */ { MAD_F(0x05e3c289) /* 0.368105446 */, 18 }, +/* 5476 */ { MAD_F(0x05e4208a) /* 0.368195094 */, 18 }, +/* 5477 */ { MAD_F(0x05e47e8c) /* 0.368284747 */, 18 }, +/* 5478 */ { MAD_F(0x05e4dc8f) /* 0.368374406 */, 18 }, +/* 5479 */ { MAD_F(0x05e53a94) /* 0.368464070 */, 18 }, +/* 5480 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 18 }, +/* 5481 */ { MAD_F(0x05e5f6a3) /* 0.368643415 */, 18 }, +/* 5482 */ { MAD_F(0x05e654ac) /* 0.368733096 */, 18 }, +/* 5483 */ { MAD_F(0x05e6b2b7) /* 0.368822782 */, 18 }, +/* 5484 */ { MAD_F(0x05e710c4) /* 0.368912473 */, 18 }, +/* 5485 */ { MAD_F(0x05e76ed2) /* 0.369002170 */, 18 }, +/* 5486 */ { MAD_F(0x05e7cce1) /* 0.369091873 */, 18 }, +/* 5487 */ { MAD_F(0x05e82af2) /* 0.369181581 */, 18 }, + +/* 5488 */ { MAD_F(0x05e88904) /* 0.369271294 */, 18 }, +/* 5489 */ { MAD_F(0x05e8e718) /* 0.369361013 */, 18 }, +/* 5490 */ { MAD_F(0x05e9452d) /* 0.369450737 */, 18 }, +/* 5491 */ { MAD_F(0x05e9a343) /* 0.369540467 */, 18 }, +/* 5492 */ { MAD_F(0x05ea015c) /* 0.369630202 */, 18 }, +/* 5493 */ { MAD_F(0x05ea5f75) /* 0.369719942 */, 18 }, +/* 5494 */ { MAD_F(0x05eabd90) /* 0.369809688 */, 18 }, +/* 5495 */ { MAD_F(0x05eb1bad) /* 0.369899440 */, 18 }, +/* 5496 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 18 }, +/* 5497 */ { MAD_F(0x05ebd7ea) /* 0.370078959 */, 18 }, +/* 5498 */ { MAD_F(0x05ec360b) /* 0.370168727 */, 18 }, +/* 5499 */ { MAD_F(0x05ec942d) /* 0.370258500 */, 18 }, +/* 5500 */ { MAD_F(0x05ecf251) /* 0.370348279 */, 18 }, +/* 5501 */ { MAD_F(0x05ed5076) /* 0.370438063 */, 18 }, +/* 5502 */ { MAD_F(0x05edae9d) /* 0.370527853 */, 18 }, +/* 5503 */ { MAD_F(0x05ee0cc5) /* 0.370617648 */, 18 }, + +/* 5504 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 18 }, +/* 5505 */ { MAD_F(0x05eec91a) /* 0.370797254 */, 18 }, +/* 5506 */ { MAD_F(0x05ef2746) /* 0.370887065 */, 18 }, +/* 5507 */ { MAD_F(0x05ef8574) /* 0.370976882 */, 18 }, +/* 5508 */ { MAD_F(0x05efe3a4) /* 0.371066704 */, 18 }, +/* 5509 */ { MAD_F(0x05f041d5) /* 0.371156532 */, 18 }, +/* 5510 */ { MAD_F(0x05f0a007) /* 0.371246365 */, 18 }, +/* 5511 */ { MAD_F(0x05f0fe3b) /* 0.371336203 */, 18 }, +/* 5512 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 18 }, +/* 5513 */ { MAD_F(0x05f1baa7) /* 0.371515897 */, 18 }, +/* 5514 */ { MAD_F(0x05f218df) /* 0.371605751 */, 18 }, +/* 5515 */ { MAD_F(0x05f27719) /* 0.371695612 */, 18 }, +/* 5516 */ { MAD_F(0x05f2d554) /* 0.371785477 */, 18 }, +/* 5517 */ { MAD_F(0x05f33390) /* 0.371875348 */, 18 }, +/* 5518 */ { MAD_F(0x05f391cf) /* 0.371965225 */, 18 }, +/* 5519 */ { MAD_F(0x05f3f00e) /* 0.372055107 */, 18 }, + +/* 5520 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 18 }, +/* 5521 */ { MAD_F(0x05f4ac91) /* 0.372234887 */, 18 }, +/* 5522 */ { MAD_F(0x05f50ad5) /* 0.372324785 */, 18 }, +/* 5523 */ { MAD_F(0x05f5691b) /* 0.372414689 */, 18 }, +/* 5524 */ { MAD_F(0x05f5c761) /* 0.372504598 */, 18 }, +/* 5525 */ { MAD_F(0x05f625aa) /* 0.372594513 */, 18 }, +/* 5526 */ { MAD_F(0x05f683f3) /* 0.372684433 */, 18 }, +/* 5527 */ { MAD_F(0x05f6e23f) /* 0.372774358 */, 18 }, +/* 5528 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 18 }, +/* 5529 */ { MAD_F(0x05f79ed9) /* 0.372954225 */, 18 }, +/* 5530 */ { MAD_F(0x05f7fd29) /* 0.373044167 */, 18 }, +/* 5531 */ { MAD_F(0x05f85b7a) /* 0.373134114 */, 18 }, +/* 5532 */ { MAD_F(0x05f8b9cc) /* 0.373224066 */, 18 }, +/* 5533 */ { MAD_F(0x05f91820) /* 0.373314024 */, 18 }, +/* 5534 */ { MAD_F(0x05f97675) /* 0.373403987 */, 18 }, +/* 5535 */ { MAD_F(0x05f9d4cc) /* 0.373493956 */, 18 }, + +/* 5536 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 18 }, +/* 5537 */ { MAD_F(0x05fa917e) /* 0.373673910 */, 18 }, +/* 5538 */ { MAD_F(0x05faefd9) /* 0.373763895 */, 18 }, +/* 5539 */ { MAD_F(0x05fb4e36) /* 0.373853885 */, 18 }, +/* 5540 */ { MAD_F(0x05fbac94) /* 0.373943881 */, 18 }, +/* 5541 */ { MAD_F(0x05fc0af3) /* 0.374033882 */, 18 }, +/* 5542 */ { MAD_F(0x05fc6954) /* 0.374123889 */, 18 }, +/* 5543 */ { MAD_F(0x05fcc7b7) /* 0.374213901 */, 18 }, +/* 5544 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 18 }, +/* 5545 */ { MAD_F(0x05fd8480) /* 0.374393941 */, 18 }, +/* 5546 */ { MAD_F(0x05fde2e7) /* 0.374483970 */, 18 }, +/* 5547 */ { MAD_F(0x05fe414f) /* 0.374574003 */, 18 }, +/* 5548 */ { MAD_F(0x05fe9fb9) /* 0.374664042 */, 18 }, +/* 5549 */ { MAD_F(0x05fefe24) /* 0.374754087 */, 18 }, +/* 5550 */ { MAD_F(0x05ff5c91) /* 0.374844137 */, 18 }, +/* 5551 */ { MAD_F(0x05ffbaff) /* 0.374934192 */, 18 }, + +/* 5552 */ { MAD_F(0x0600196e) /* 0.375024253 */, 18 }, +/* 5553 */ { MAD_F(0x060077df) /* 0.375114319 */, 18 }, +/* 5554 */ { MAD_F(0x0600d651) /* 0.375204391 */, 18 }, +/* 5555 */ { MAD_F(0x060134c5) /* 0.375294468 */, 18 }, +/* 5556 */ { MAD_F(0x0601933b) /* 0.375384550 */, 18 }, +/* 5557 */ { MAD_F(0x0601f1b1) /* 0.375474638 */, 18 }, +/* 5558 */ { MAD_F(0x0602502a) /* 0.375564731 */, 18 }, +/* 5559 */ { MAD_F(0x0602aea3) /* 0.375654830 */, 18 }, +/* 5560 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 18 }, +/* 5561 */ { MAD_F(0x06036b9b) /* 0.375835043 */, 18 }, +/* 5562 */ { MAD_F(0x0603ca19) /* 0.375925158 */, 18 }, +/* 5563 */ { MAD_F(0x06042898) /* 0.376015278 */, 18 }, +/* 5564 */ { MAD_F(0x06048719) /* 0.376105404 */, 18 }, +/* 5565 */ { MAD_F(0x0604e59c) /* 0.376195535 */, 18 }, +/* 5566 */ { MAD_F(0x0605441f) /* 0.376285671 */, 18 }, +/* 5567 */ { MAD_F(0x0605a2a5) /* 0.376375813 */, 18 }, + +/* 5568 */ { MAD_F(0x0606012b) /* 0.376465960 */, 18 }, +/* 5569 */ { MAD_F(0x06065fb4) /* 0.376556113 */, 18 }, +/* 5570 */ { MAD_F(0x0606be3d) /* 0.376646271 */, 18 }, +/* 5571 */ { MAD_F(0x06071cc8) /* 0.376736434 */, 18 }, +/* 5572 */ { MAD_F(0x06077b55) /* 0.376826603 */, 18 }, +/* 5573 */ { MAD_F(0x0607d9e3) /* 0.376916777 */, 18 }, +/* 5574 */ { MAD_F(0x06083872) /* 0.377006957 */, 18 }, +/* 5575 */ { MAD_F(0x06089703) /* 0.377097141 */, 18 }, +/* 5576 */ { MAD_F(0x0608f595) /* 0.377187332 */, 18 }, +/* 5577 */ { MAD_F(0x06095429) /* 0.377277528 */, 18 }, +/* 5578 */ { MAD_F(0x0609b2be) /* 0.377367729 */, 18 }, +/* 5579 */ { MAD_F(0x060a1155) /* 0.377457935 */, 18 }, +/* 5580 */ { MAD_F(0x060a6fed) /* 0.377548147 */, 18 }, +/* 5581 */ { MAD_F(0x060ace86) /* 0.377638364 */, 18 }, +/* 5582 */ { MAD_F(0x060b2d21) /* 0.377728587 */, 18 }, +/* 5583 */ { MAD_F(0x060b8bbe) /* 0.377818815 */, 18 }, + +/* 5584 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 18 }, +/* 5585 */ { MAD_F(0x060c48fb) /* 0.377999288 */, 18 }, +/* 5586 */ { MAD_F(0x060ca79c) /* 0.378089532 */, 18 }, +/* 5587 */ { MAD_F(0x060d063e) /* 0.378179781 */, 18 }, +/* 5588 */ { MAD_F(0x060d64e1) /* 0.378270036 */, 18 }, +/* 5589 */ { MAD_F(0x060dc387) /* 0.378360297 */, 18 }, +/* 5590 */ { MAD_F(0x060e222d) /* 0.378450563 */, 18 }, +/* 5591 */ { MAD_F(0x060e80d5) /* 0.378540834 */, 18 }, +/* 5592 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 18 }, +/* 5593 */ { MAD_F(0x060f3e29) /* 0.378721392 */, 18 }, +/* 5594 */ { MAD_F(0x060f9cd6) /* 0.378811680 */, 18 }, +/* 5595 */ { MAD_F(0x060ffb83) /* 0.378901972 */, 18 }, +/* 5596 */ { MAD_F(0x06105a33) /* 0.378992270 */, 18 }, +/* 5597 */ { MAD_F(0x0610b8e3) /* 0.379082574 */, 18 }, +/* 5598 */ { MAD_F(0x06111795) /* 0.379172883 */, 18 }, +/* 5599 */ { MAD_F(0x06117649) /* 0.379263197 */, 18 }, + +/* 5600 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 18 }, +/* 5601 */ { MAD_F(0x061233b4) /* 0.379443841 */, 18 }, +/* 5602 */ { MAD_F(0x0612926c) /* 0.379534172 */, 18 }, +/* 5603 */ { MAD_F(0x0612f125) /* 0.379624507 */, 18 }, +/* 5604 */ { MAD_F(0x06134fe0) /* 0.379714848 */, 18 }, +/* 5605 */ { MAD_F(0x0613ae9c) /* 0.379805195 */, 18 }, +/* 5606 */ { MAD_F(0x06140d5a) /* 0.379895547 */, 18 }, +/* 5607 */ { MAD_F(0x06146c19) /* 0.379985904 */, 18 }, +/* 5608 */ { MAD_F(0x0614cada) /* 0.380076266 */, 18 }, +/* 5609 */ { MAD_F(0x0615299c) /* 0.380166634 */, 18 }, +/* 5610 */ { MAD_F(0x0615885f) /* 0.380257008 */, 18 }, +/* 5611 */ { MAD_F(0x0615e724) /* 0.380347386 */, 18 }, +/* 5612 */ { MAD_F(0x061645ea) /* 0.380437770 */, 18 }, +/* 5613 */ { MAD_F(0x0616a4b2) /* 0.380528160 */, 18 }, +/* 5614 */ { MAD_F(0x0617037b) /* 0.380618555 */, 18 }, +/* 5615 */ { MAD_F(0x06176246) /* 0.380708955 */, 18 }, + +/* 5616 */ { MAD_F(0x0617c112) /* 0.380799360 */, 18 }, +/* 5617 */ { MAD_F(0x06181fdf) /* 0.380889771 */, 18 }, +/* 5618 */ { MAD_F(0x06187eae) /* 0.380980187 */, 18 }, +/* 5619 */ { MAD_F(0x0618dd7e) /* 0.381070609 */, 18 }, +/* 5620 */ { MAD_F(0x06193c50) /* 0.381161036 */, 18 }, +/* 5621 */ { MAD_F(0x06199b24) /* 0.381251468 */, 18 }, +/* 5622 */ { MAD_F(0x0619f9f8) /* 0.381341906 */, 18 }, +/* 5623 */ { MAD_F(0x061a58ce) /* 0.381432349 */, 18 }, +/* 5624 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 18 }, +/* 5625 */ { MAD_F(0x061b167f) /* 0.381613251 */, 18 }, +/* 5626 */ { MAD_F(0x061b7559) /* 0.381703711 */, 18 }, +/* 5627 */ { MAD_F(0x061bd435) /* 0.381794175 */, 18 }, +/* 5628 */ { MAD_F(0x061c3313) /* 0.381884645 */, 18 }, +/* 5629 */ { MAD_F(0x061c91f1) /* 0.381975120 */, 18 }, +/* 5630 */ { MAD_F(0x061cf0d2) /* 0.382065601 */, 18 }, +/* 5631 */ { MAD_F(0x061d4fb3) /* 0.382156087 */, 18 }, + +/* 5632 */ { MAD_F(0x061dae96) /* 0.382246578 */, 18 }, +/* 5633 */ { MAD_F(0x061e0d7b) /* 0.382337075 */, 18 }, +/* 5634 */ { MAD_F(0x061e6c61) /* 0.382427577 */, 18 }, +/* 5635 */ { MAD_F(0x061ecb48) /* 0.382518084 */, 18 }, +/* 5636 */ { MAD_F(0x061f2a31) /* 0.382608597 */, 18 }, +/* 5637 */ { MAD_F(0x061f891b) /* 0.382699115 */, 18 }, +/* 5638 */ { MAD_F(0x061fe807) /* 0.382789638 */, 18 }, +/* 5639 */ { MAD_F(0x062046f4) /* 0.382880167 */, 18 }, +/* 5640 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 18 }, +/* 5641 */ { MAD_F(0x062104d3) /* 0.383061241 */, 18 }, +/* 5642 */ { MAD_F(0x062163c4) /* 0.383151786 */, 18 }, +/* 5643 */ { MAD_F(0x0621c2b7) /* 0.383242336 */, 18 }, +/* 5644 */ { MAD_F(0x062221ab) /* 0.383332891 */, 18 }, +/* 5645 */ { MAD_F(0x062280a1) /* 0.383423452 */, 18 }, +/* 5646 */ { MAD_F(0x0622df98) /* 0.383514018 */, 18 }, +/* 5647 */ { MAD_F(0x06233e91) /* 0.383604590 */, 18 }, + +/* 5648 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 18 }, +/* 5649 */ { MAD_F(0x0623fc86) /* 0.383785749 */, 18 }, +/* 5650 */ { MAD_F(0x06245b83) /* 0.383876337 */, 18 }, +/* 5651 */ { MAD_F(0x0624ba82) /* 0.383966930 */, 18 }, +/* 5652 */ { MAD_F(0x06251981) /* 0.384057528 */, 18 }, +/* 5653 */ { MAD_F(0x06257883) /* 0.384148132 */, 18 }, +/* 5654 */ { MAD_F(0x0625d785) /* 0.384238741 */, 18 }, +/* 5655 */ { MAD_F(0x06263689) /* 0.384329355 */, 18 }, +/* 5656 */ { MAD_F(0x0626958f) /* 0.384419975 */, 18 }, +/* 5657 */ { MAD_F(0x0626f496) /* 0.384510600 */, 18 }, +/* 5658 */ { MAD_F(0x0627539e) /* 0.384601230 */, 18 }, +/* 5659 */ { MAD_F(0x0627b2a8) /* 0.384691866 */, 18 }, +/* 5660 */ { MAD_F(0x062811b3) /* 0.384782507 */, 18 }, +/* 5661 */ { MAD_F(0x062870c0) /* 0.384873153 */, 18 }, +/* 5662 */ { MAD_F(0x0628cfce) /* 0.384963805 */, 18 }, +/* 5663 */ { MAD_F(0x06292ede) /* 0.385054462 */, 18 }, + +/* 5664 */ { MAD_F(0x06298def) /* 0.385145124 */, 18 }, +/* 5665 */ { MAD_F(0x0629ed01) /* 0.385235792 */, 18 }, +/* 5666 */ { MAD_F(0x062a4c15) /* 0.385326465 */, 18 }, +/* 5667 */ { MAD_F(0x062aab2a) /* 0.385417143 */, 18 }, +/* 5668 */ { MAD_F(0x062b0a41) /* 0.385507827 */, 18 }, +/* 5669 */ { MAD_F(0x062b6959) /* 0.385598516 */, 18 }, +/* 5670 */ { MAD_F(0x062bc873) /* 0.385689211 */, 18 }, +/* 5671 */ { MAD_F(0x062c278e) /* 0.385779910 */, 18 }, +/* 5672 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 18 }, +/* 5673 */ { MAD_F(0x062ce5c8) /* 0.385961326 */, 18 }, +/* 5674 */ { MAD_F(0x062d44e8) /* 0.386052041 */, 18 }, +/* 5675 */ { MAD_F(0x062da408) /* 0.386142762 */, 18 }, +/* 5676 */ { MAD_F(0x062e032a) /* 0.386233489 */, 18 }, +/* 5677 */ { MAD_F(0x062e624e) /* 0.386324221 */, 18 }, +/* 5678 */ { MAD_F(0x062ec173) /* 0.386414958 */, 18 }, +/* 5679 */ { MAD_F(0x062f209a) /* 0.386505700 */, 18 }, + +/* 5680 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 18 }, +/* 5681 */ { MAD_F(0x062fdeeb) /* 0.386687201 */, 18 }, +/* 5682 */ { MAD_F(0x06303e16) /* 0.386777959 */, 18 }, +/* 5683 */ { MAD_F(0x06309d42) /* 0.386868723 */, 18 }, +/* 5684 */ { MAD_F(0x0630fc6f) /* 0.386959492 */, 18 }, +/* 5685 */ { MAD_F(0x06315b9e) /* 0.387050266 */, 18 }, +/* 5686 */ { MAD_F(0x0631bacf) /* 0.387141045 */, 18 }, +/* 5687 */ { MAD_F(0x06321a01) /* 0.387231830 */, 18 }, +/* 5688 */ { MAD_F(0x06327934) /* 0.387322621 */, 18 }, +/* 5689 */ { MAD_F(0x0632d869) /* 0.387413416 */, 18 }, +/* 5690 */ { MAD_F(0x0633379f) /* 0.387504217 */, 18 }, +/* 5691 */ { MAD_F(0x063396d7) /* 0.387595023 */, 18 }, +/* 5692 */ { MAD_F(0x0633f610) /* 0.387685835 */, 18 }, +/* 5693 */ { MAD_F(0x0634554a) /* 0.387776652 */, 18 }, +/* 5694 */ { MAD_F(0x0634b486) /* 0.387867474 */, 18 }, +/* 5695 */ { MAD_F(0x063513c3) /* 0.387958301 */, 18 }, + +/* 5696 */ { MAD_F(0x06357302) /* 0.388049134 */, 18 }, +/* 5697 */ { MAD_F(0x0635d242) /* 0.388139972 */, 18 }, +/* 5698 */ { MAD_F(0x06363184) /* 0.388230816 */, 18 }, +/* 5699 */ { MAD_F(0x063690c7) /* 0.388321665 */, 18 }, +/* 5700 */ { MAD_F(0x0636f00b) /* 0.388412519 */, 18 }, +/* 5701 */ { MAD_F(0x06374f51) /* 0.388503378 */, 18 }, +/* 5702 */ { MAD_F(0x0637ae99) /* 0.388594243 */, 18 }, +/* 5703 */ { MAD_F(0x06380de1) /* 0.388685113 */, 18 }, +/* 5704 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 18 }, +/* 5705 */ { MAD_F(0x0638cc77) /* 0.388866869 */, 18 }, +/* 5706 */ { MAD_F(0x06392bc4) /* 0.388957755 */, 18 }, +/* 5707 */ { MAD_F(0x06398b12) /* 0.389048646 */, 18 }, +/* 5708 */ { MAD_F(0x0639ea62) /* 0.389139542 */, 18 }, +/* 5709 */ { MAD_F(0x063a49b4) /* 0.389230444 */, 18 }, +/* 5710 */ { MAD_F(0x063aa906) /* 0.389321352 */, 18 }, +/* 5711 */ { MAD_F(0x063b085a) /* 0.389412264 */, 18 }, + +/* 5712 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 18 }, +/* 5713 */ { MAD_F(0x063bc707) /* 0.389594105 */, 18 }, +/* 5714 */ { MAD_F(0x063c265f) /* 0.389685033 */, 18 }, +/* 5715 */ { MAD_F(0x063c85b9) /* 0.389775967 */, 18 }, +/* 5716 */ { MAD_F(0x063ce514) /* 0.389866906 */, 18 }, +/* 5717 */ { MAD_F(0x063d4471) /* 0.389957850 */, 18 }, +/* 5718 */ { MAD_F(0x063da3cf) /* 0.390048800 */, 18 }, +/* 5719 */ { MAD_F(0x063e032f) /* 0.390139755 */, 18 }, +/* 5720 */ { MAD_F(0x063e6290) /* 0.390230715 */, 18 }, +/* 5721 */ { MAD_F(0x063ec1f2) /* 0.390321681 */, 18 }, +/* 5722 */ { MAD_F(0x063f2156) /* 0.390412651 */, 18 }, +/* 5723 */ { MAD_F(0x063f80bb) /* 0.390503628 */, 18 }, +/* 5724 */ { MAD_F(0x063fe022) /* 0.390594609 */, 18 }, +/* 5725 */ { MAD_F(0x06403f8a) /* 0.390685596 */, 18 }, +/* 5726 */ { MAD_F(0x06409ef3) /* 0.390776588 */, 18 }, +/* 5727 */ { MAD_F(0x0640fe5e) /* 0.390867585 */, 18 }, + +/* 5728 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 18 }, +/* 5729 */ { MAD_F(0x0641bd38) /* 0.391049596 */, 18 }, +/* 5730 */ { MAD_F(0x06421ca7) /* 0.391140609 */, 18 }, +/* 5731 */ { MAD_F(0x06427c18) /* 0.391231627 */, 18 }, +/* 5732 */ { MAD_F(0x0642db8a) /* 0.391322651 */, 18 }, +/* 5733 */ { MAD_F(0x06433afd) /* 0.391413680 */, 18 }, +/* 5734 */ { MAD_F(0x06439a72) /* 0.391504714 */, 18 }, +/* 5735 */ { MAD_F(0x0643f9e9) /* 0.391595754 */, 18 }, +/* 5736 */ { MAD_F(0x06445960) /* 0.391686799 */, 18 }, +/* 5737 */ { MAD_F(0x0644b8d9) /* 0.391777849 */, 18 }, +/* 5738 */ { MAD_F(0x06451854) /* 0.391868905 */, 18 }, +/* 5739 */ { MAD_F(0x064577d0) /* 0.391959966 */, 18 }, +/* 5740 */ { MAD_F(0x0645d74d) /* 0.392051032 */, 18 }, +/* 5741 */ { MAD_F(0x064636cc) /* 0.392142103 */, 18 }, +/* 5742 */ { MAD_F(0x0646964c) /* 0.392233180 */, 18 }, +/* 5743 */ { MAD_F(0x0646f5ce) /* 0.392324262 */, 18 }, + +/* 5744 */ { MAD_F(0x06475551) /* 0.392415349 */, 18 }, +/* 5745 */ { MAD_F(0x0647b4d5) /* 0.392506442 */, 18 }, +/* 5746 */ { MAD_F(0x0648145b) /* 0.392597540 */, 18 }, +/* 5747 */ { MAD_F(0x064873e3) /* 0.392688643 */, 18 }, +/* 5748 */ { MAD_F(0x0648d36b) /* 0.392779751 */, 18 }, +/* 5749 */ { MAD_F(0x064932f6) /* 0.392870865 */, 18 }, +/* 5750 */ { MAD_F(0x06499281) /* 0.392961984 */, 18 }, +/* 5751 */ { MAD_F(0x0649f20e) /* 0.393053108 */, 18 }, +/* 5752 */ { MAD_F(0x064a519c) /* 0.393144238 */, 18 }, +/* 5753 */ { MAD_F(0x064ab12c) /* 0.393235372 */, 18 }, +/* 5754 */ { MAD_F(0x064b10be) /* 0.393326513 */, 18 }, +/* 5755 */ { MAD_F(0x064b7050) /* 0.393417658 */, 18 }, +/* 5756 */ { MAD_F(0x064bcfe4) /* 0.393508809 */, 18 }, +/* 5757 */ { MAD_F(0x064c2f7a) /* 0.393599965 */, 18 }, +/* 5758 */ { MAD_F(0x064c8f11) /* 0.393691126 */, 18 }, +/* 5759 */ { MAD_F(0x064ceea9) /* 0.393782292 */, 18 }, + +/* 5760 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 18 }, +/* 5761 */ { MAD_F(0x064dadde) /* 0.393964641 */, 18 }, +/* 5762 */ { MAD_F(0x064e0d7a) /* 0.394055823 */, 18 }, +/* 5763 */ { MAD_F(0x064e6d18) /* 0.394147011 */, 18 }, +/* 5764 */ { MAD_F(0x064eccb8) /* 0.394238204 */, 18 }, +/* 5765 */ { MAD_F(0x064f2c59) /* 0.394329402 */, 18 }, +/* 5766 */ { MAD_F(0x064f8bfb) /* 0.394420605 */, 18 }, +/* 5767 */ { MAD_F(0x064feb9e) /* 0.394511814 */, 18 }, +/* 5768 */ { MAD_F(0x06504b44) /* 0.394603028 */, 18 }, +/* 5769 */ { MAD_F(0x0650aaea) /* 0.394694247 */, 18 }, +/* 5770 */ { MAD_F(0x06510a92) /* 0.394785472 */, 18 }, +/* 5771 */ { MAD_F(0x06516a3b) /* 0.394876702 */, 18 }, +/* 5772 */ { MAD_F(0x0651c9e6) /* 0.394967937 */, 18 }, +/* 5773 */ { MAD_F(0x06522992) /* 0.395059177 */, 18 }, +/* 5774 */ { MAD_F(0x06528940) /* 0.395150423 */, 18 }, +/* 5775 */ { MAD_F(0x0652e8ef) /* 0.395241673 */, 18 }, + +/* 5776 */ { MAD_F(0x0653489f) /* 0.395332930 */, 18 }, +/* 5777 */ { MAD_F(0x0653a851) /* 0.395424191 */, 18 }, +/* 5778 */ { MAD_F(0x06540804) /* 0.395515458 */, 18 }, +/* 5779 */ { MAD_F(0x065467b9) /* 0.395606730 */, 18 }, +/* 5780 */ { MAD_F(0x0654c76f) /* 0.395698007 */, 18 }, +/* 5781 */ { MAD_F(0x06552726) /* 0.395789289 */, 18 }, +/* 5782 */ { MAD_F(0x065586df) /* 0.395880577 */, 18 }, +/* 5783 */ { MAD_F(0x0655e699) /* 0.395971870 */, 18 }, +/* 5784 */ { MAD_F(0x06564655) /* 0.396063168 */, 18 }, +/* 5785 */ { MAD_F(0x0656a612) /* 0.396154472 */, 18 }, +/* 5786 */ { MAD_F(0x065705d0) /* 0.396245780 */, 18 }, +/* 5787 */ { MAD_F(0x06576590) /* 0.396337094 */, 18 }, +/* 5788 */ { MAD_F(0x0657c552) /* 0.396428414 */, 18 }, +/* 5789 */ { MAD_F(0x06582514) /* 0.396519738 */, 18 }, +/* 5790 */ { MAD_F(0x065884d9) /* 0.396611068 */, 18 }, +/* 5791 */ { MAD_F(0x0658e49e) /* 0.396702403 */, 18 }, + +/* 5792 */ { MAD_F(0x06594465) /* 0.396793743 */, 18 }, +/* 5793 */ { MAD_F(0x0659a42e) /* 0.396885089 */, 18 }, +/* 5794 */ { MAD_F(0x065a03f7) /* 0.396976440 */, 18 }, +/* 5795 */ { MAD_F(0x065a63c3) /* 0.397067796 */, 18 }, +/* 5796 */ { MAD_F(0x065ac38f) /* 0.397159157 */, 18 }, +/* 5797 */ { MAD_F(0x065b235d) /* 0.397250524 */, 18 }, +/* 5798 */ { MAD_F(0x065b832d) /* 0.397341896 */, 18 }, +/* 5799 */ { MAD_F(0x065be2fe) /* 0.397433273 */, 18 }, +/* 5800 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 18 }, +/* 5801 */ { MAD_F(0x065ca2a3) /* 0.397616043 */, 18 }, +/* 5802 */ { MAD_F(0x065d0279) /* 0.397707436 */, 18 }, +/* 5803 */ { MAD_F(0x065d624f) /* 0.397798834 */, 18 }, +/* 5804 */ { MAD_F(0x065dc227) /* 0.397890237 */, 18 }, +/* 5805 */ { MAD_F(0x065e2200) /* 0.397981646 */, 18 }, +/* 5806 */ { MAD_F(0x065e81db) /* 0.398073059 */, 18 }, +/* 5807 */ { MAD_F(0x065ee1b7) /* 0.398164479 */, 18 }, + +/* 5808 */ { MAD_F(0x065f4195) /* 0.398255903 */, 18 }, +/* 5809 */ { MAD_F(0x065fa174) /* 0.398347333 */, 18 }, +/* 5810 */ { MAD_F(0x06600154) /* 0.398438767 */, 18 }, +/* 5811 */ { MAD_F(0x06606136) /* 0.398530207 */, 18 }, +/* 5812 */ { MAD_F(0x0660c119) /* 0.398621653 */, 18 }, +/* 5813 */ { MAD_F(0x066120fd) /* 0.398713103 */, 18 }, +/* 5814 */ { MAD_F(0x066180e3) /* 0.398804559 */, 18 }, +/* 5815 */ { MAD_F(0x0661e0cb) /* 0.398896020 */, 18 }, +/* 5816 */ { MAD_F(0x066240b4) /* 0.398987487 */, 18 }, +/* 5817 */ { MAD_F(0x0662a09e) /* 0.399078958 */, 18 }, +/* 5818 */ { MAD_F(0x06630089) /* 0.399170435 */, 18 }, +/* 5819 */ { MAD_F(0x06636077) /* 0.399261917 */, 18 }, +/* 5820 */ { MAD_F(0x0663c065) /* 0.399353404 */, 18 }, +/* 5821 */ { MAD_F(0x06642055) /* 0.399444897 */, 18 }, +/* 5822 */ { MAD_F(0x06648046) /* 0.399536395 */, 18 }, +/* 5823 */ { MAD_F(0x0664e039) /* 0.399627898 */, 18 }, + +/* 5824 */ { MAD_F(0x0665402d) /* 0.399719406 */, 18 }, +/* 5825 */ { MAD_F(0x0665a022) /* 0.399810919 */, 18 }, +/* 5826 */ { MAD_F(0x06660019) /* 0.399902438 */, 18 }, +/* 5827 */ { MAD_F(0x06666011) /* 0.399993962 */, 18 }, +/* 5828 */ { MAD_F(0x0666c00b) /* 0.400085491 */, 18 }, +/* 5829 */ { MAD_F(0x06672006) /* 0.400177026 */, 18 }, +/* 5830 */ { MAD_F(0x06678003) /* 0.400268565 */, 18 }, +/* 5831 */ { MAD_F(0x0667e000) /* 0.400360110 */, 18 }, +/* 5832 */ { MAD_F(0x06684000) /* 0.400451660 */, 18 }, +/* 5833 */ { MAD_F(0x0668a000) /* 0.400543216 */, 18 }, +/* 5834 */ { MAD_F(0x06690003) /* 0.400634776 */, 18 }, +/* 5835 */ { MAD_F(0x06696006) /* 0.400726342 */, 18 }, +/* 5836 */ { MAD_F(0x0669c00b) /* 0.400817913 */, 18 }, +/* 5837 */ { MAD_F(0x066a2011) /* 0.400909489 */, 18 }, +/* 5838 */ { MAD_F(0x066a8019) /* 0.401001071 */, 18 }, +/* 5839 */ { MAD_F(0x066ae022) /* 0.401092657 */, 18 }, + +/* 5840 */ { MAD_F(0x066b402d) /* 0.401184249 */, 18 }, +/* 5841 */ { MAD_F(0x066ba039) /* 0.401275847 */, 18 }, +/* 5842 */ { MAD_F(0x066c0046) /* 0.401367449 */, 18 }, +/* 5843 */ { MAD_F(0x066c6055) /* 0.401459057 */, 18 }, +/* 5844 */ { MAD_F(0x066cc065) /* 0.401550670 */, 18 }, +/* 5845 */ { MAD_F(0x066d2076) /* 0.401642288 */, 18 }, +/* 5846 */ { MAD_F(0x066d8089) /* 0.401733911 */, 18 }, +/* 5847 */ { MAD_F(0x066de09e) /* 0.401825540 */, 18 }, +/* 5848 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 18 }, +/* 5849 */ { MAD_F(0x066ea0cb) /* 0.402008812 */, 18 }, +/* 5850 */ { MAD_F(0x066f00e3) /* 0.402100457 */, 18 }, +/* 5851 */ { MAD_F(0x066f60fd) /* 0.402192106 */, 18 }, +/* 5852 */ { MAD_F(0x066fc118) /* 0.402283761 */, 18 }, +/* 5853 */ { MAD_F(0x06702135) /* 0.402375420 */, 18 }, +/* 5854 */ { MAD_F(0x06708153) /* 0.402467086 */, 18 }, +/* 5855 */ { MAD_F(0x0670e173) /* 0.402558756 */, 18 }, + +/* 5856 */ { MAD_F(0x06714194) /* 0.402650431 */, 18 }, +/* 5857 */ { MAD_F(0x0671a1b6) /* 0.402742112 */, 18 }, +/* 5858 */ { MAD_F(0x067201da) /* 0.402833798 */, 18 }, +/* 5859 */ { MAD_F(0x067261ff) /* 0.402925489 */, 18 }, +/* 5860 */ { MAD_F(0x0672c226) /* 0.403017186 */, 18 }, +/* 5861 */ { MAD_F(0x0673224e) /* 0.403108887 */, 18 }, +/* 5862 */ { MAD_F(0x06738277) /* 0.403200594 */, 18 }, +/* 5863 */ { MAD_F(0x0673e2a2) /* 0.403292306 */, 18 }, +/* 5864 */ { MAD_F(0x067442ce) /* 0.403384024 */, 18 }, +/* 5865 */ { MAD_F(0x0674a2fc) /* 0.403475746 */, 18 }, +/* 5866 */ { MAD_F(0x0675032b) /* 0.403567474 */, 18 }, +/* 5867 */ { MAD_F(0x0675635b) /* 0.403659207 */, 18 }, +/* 5868 */ { MAD_F(0x0675c38d) /* 0.403750945 */, 18 }, +/* 5869 */ { MAD_F(0x067623c0) /* 0.403842688 */, 18 }, +/* 5870 */ { MAD_F(0x067683f4) /* 0.403934437 */, 18 }, +/* 5871 */ { MAD_F(0x0676e42a) /* 0.404026190 */, 18 }, + +/* 5872 */ { MAD_F(0x06774462) /* 0.404117949 */, 18 }, +/* 5873 */ { MAD_F(0x0677a49b) /* 0.404209714 */, 18 }, +/* 5874 */ { MAD_F(0x067804d5) /* 0.404301483 */, 18 }, +/* 5875 */ { MAD_F(0x06786510) /* 0.404393258 */, 18 }, +/* 5876 */ { MAD_F(0x0678c54d) /* 0.404485037 */, 18 }, +/* 5877 */ { MAD_F(0x0679258c) /* 0.404576822 */, 18 }, +/* 5878 */ { MAD_F(0x067985cb) /* 0.404668613 */, 18 }, +/* 5879 */ { MAD_F(0x0679e60c) /* 0.404760408 */, 18 }, +/* 5880 */ { MAD_F(0x067a464f) /* 0.404852209 */, 18 }, +/* 5881 */ { MAD_F(0x067aa693) /* 0.404944014 */, 18 }, +/* 5882 */ { MAD_F(0x067b06d8) /* 0.405035825 */, 18 }, +/* 5883 */ { MAD_F(0x067b671f) /* 0.405127642 */, 18 }, +/* 5884 */ { MAD_F(0x067bc767) /* 0.405219463 */, 18 }, +/* 5885 */ { MAD_F(0x067c27b1) /* 0.405311290 */, 18 }, +/* 5886 */ { MAD_F(0x067c87fc) /* 0.405403122 */, 18 }, +/* 5887 */ { MAD_F(0x067ce848) /* 0.405494959 */, 18 }, + +/* 5888 */ { MAD_F(0x067d4896) /* 0.405586801 */, 18 }, +/* 5889 */ { MAD_F(0x067da8e5) /* 0.405678648 */, 18 }, +/* 5890 */ { MAD_F(0x067e0935) /* 0.405770501 */, 18 }, +/* 5891 */ { MAD_F(0x067e6987) /* 0.405862359 */, 18 }, +/* 5892 */ { MAD_F(0x067ec9da) /* 0.405954222 */, 18 }, +/* 5893 */ { MAD_F(0x067f2a2f) /* 0.406046090 */, 18 }, +/* 5894 */ { MAD_F(0x067f8a85) /* 0.406137963 */, 18 }, +/* 5895 */ { MAD_F(0x067feadd) /* 0.406229842 */, 18 }, +/* 5896 */ { MAD_F(0x06804b36) /* 0.406321726 */, 18 }, +/* 5897 */ { MAD_F(0x0680ab90) /* 0.406413615 */, 18 }, +/* 5898 */ { MAD_F(0x06810beb) /* 0.406505509 */, 18 }, +/* 5899 */ { MAD_F(0x06816c49) /* 0.406597408 */, 18 }, +/* 5900 */ { MAD_F(0x0681cca7) /* 0.406689313 */, 18 }, +/* 5901 */ { MAD_F(0x06822d07) /* 0.406781223 */, 18 }, +/* 5902 */ { MAD_F(0x06828d68) /* 0.406873138 */, 18 }, +/* 5903 */ { MAD_F(0x0682edcb) /* 0.406965058 */, 18 }, + +/* 5904 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 18 }, +/* 5905 */ { MAD_F(0x0683ae94) /* 0.407148914 */, 18 }, +/* 5906 */ { MAD_F(0x06840efb) /* 0.407240850 */, 18 }, +/* 5907 */ { MAD_F(0x06846f63) /* 0.407332791 */, 18 }, +/* 5908 */ { MAD_F(0x0684cfcd) /* 0.407424737 */, 18 }, +/* 5909 */ { MAD_F(0x06853038) /* 0.407516688 */, 18 }, +/* 5910 */ { MAD_F(0x068590a4) /* 0.407608645 */, 18 }, +/* 5911 */ { MAD_F(0x0685f112) /* 0.407700606 */, 18 }, +/* 5912 */ { MAD_F(0x06865181) /* 0.407792573 */, 18 }, +/* 5913 */ { MAD_F(0x0686b1f2) /* 0.407884545 */, 18 }, +/* 5914 */ { MAD_F(0x06871264) /* 0.407976522 */, 18 }, +/* 5915 */ { MAD_F(0x068772d7) /* 0.408068505 */, 18 }, +/* 5916 */ { MAD_F(0x0687d34c) /* 0.408160492 */, 18 }, +/* 5917 */ { MAD_F(0x068833c2) /* 0.408252485 */, 18 }, +/* 5918 */ { MAD_F(0x06889439) /* 0.408344483 */, 18 }, +/* 5919 */ { MAD_F(0x0688f4b2) /* 0.408436486 */, 18 }, + +/* 5920 */ { MAD_F(0x0689552c) /* 0.408528495 */, 18 }, +/* 5921 */ { MAD_F(0x0689b5a8) /* 0.408620508 */, 18 }, +/* 5922 */ { MAD_F(0x068a1625) /* 0.408712527 */, 18 }, +/* 5923 */ { MAD_F(0x068a76a4) /* 0.408804551 */, 18 }, +/* 5924 */ { MAD_F(0x068ad724) /* 0.408896580 */, 18 }, +/* 5925 */ { MAD_F(0x068b37a5) /* 0.408988614 */, 18 }, +/* 5926 */ { MAD_F(0x068b9827) /* 0.409080653 */, 18 }, +/* 5927 */ { MAD_F(0x068bf8ac) /* 0.409172698 */, 18 }, +/* 5928 */ { MAD_F(0x068c5931) /* 0.409264748 */, 18 }, +/* 5929 */ { MAD_F(0x068cb9b8) /* 0.409356803 */, 18 }, +/* 5930 */ { MAD_F(0x068d1a40) /* 0.409448863 */, 18 }, +/* 5931 */ { MAD_F(0x068d7aca) /* 0.409540928 */, 18 }, +/* 5932 */ { MAD_F(0x068ddb54) /* 0.409632999 */, 18 }, +/* 5933 */ { MAD_F(0x068e3be1) /* 0.409725074 */, 18 }, +/* 5934 */ { MAD_F(0x068e9c6f) /* 0.409817155 */, 18 }, +/* 5935 */ { MAD_F(0x068efcfe) /* 0.409909241 */, 18 }, + +/* 5936 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 18 }, +/* 5937 */ { MAD_F(0x068fbe20) /* 0.410093428 */, 18 }, +/* 5938 */ { MAD_F(0x06901eb4) /* 0.410185530 */, 18 }, +/* 5939 */ { MAD_F(0x06907f48) /* 0.410277637 */, 18 }, +/* 5940 */ { MAD_F(0x0690dfde) /* 0.410369748 */, 18 }, +/* 5941 */ { MAD_F(0x06914076) /* 0.410461865 */, 18 }, +/* 5942 */ { MAD_F(0x0691a10f) /* 0.410553988 */, 18 }, +/* 5943 */ { MAD_F(0x069201a9) /* 0.410646115 */, 18 }, +/* 5944 */ { MAD_F(0x06926245) /* 0.410738247 */, 18 }, +/* 5945 */ { MAD_F(0x0692c2e2) /* 0.410830385 */, 18 }, +/* 5946 */ { MAD_F(0x06932380) /* 0.410922528 */, 18 }, +/* 5947 */ { MAD_F(0x06938420) /* 0.411014676 */, 18 }, +/* 5948 */ { MAD_F(0x0693e4c1) /* 0.411106829 */, 18 }, +/* 5949 */ { MAD_F(0x06944563) /* 0.411198987 */, 18 }, +/* 5950 */ { MAD_F(0x0694a607) /* 0.411291151 */, 18 }, +/* 5951 */ { MAD_F(0x069506ad) /* 0.411383320 */, 18 }, + +/* 5952 */ { MAD_F(0x06956753) /* 0.411475493 */, 18 }, +/* 5953 */ { MAD_F(0x0695c7fc) /* 0.411567672 */, 18 }, +/* 5954 */ { MAD_F(0x069628a5) /* 0.411659857 */, 18 }, +/* 5955 */ { MAD_F(0x06968950) /* 0.411752046 */, 18 }, +/* 5956 */ { MAD_F(0x0696e9fc) /* 0.411844240 */, 18 }, +/* 5957 */ { MAD_F(0x06974aaa) /* 0.411936440 */, 18 }, +/* 5958 */ { MAD_F(0x0697ab59) /* 0.412028645 */, 18 }, +/* 5959 */ { MAD_F(0x06980c09) /* 0.412120855 */, 18 }, +/* 5960 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 18 }, +/* 5961 */ { MAD_F(0x0698cd6e) /* 0.412305290 */, 18 }, +/* 5962 */ { MAD_F(0x06992e23) /* 0.412397516 */, 18 }, +/* 5963 */ { MAD_F(0x06998ed9) /* 0.412489746 */, 18 }, +/* 5964 */ { MAD_F(0x0699ef90) /* 0.412581982 */, 18 }, +/* 5965 */ { MAD_F(0x069a5049) /* 0.412674223 */, 18 }, +/* 5966 */ { MAD_F(0x069ab103) /* 0.412766469 */, 18 }, +/* 5967 */ { MAD_F(0x069b11bf) /* 0.412858720 */, 18 }, + +/* 5968 */ { MAD_F(0x069b727b) /* 0.412950976 */, 18 }, +/* 5969 */ { MAD_F(0x069bd33a) /* 0.413043238 */, 18 }, +/* 5970 */ { MAD_F(0x069c33f9) /* 0.413135505 */, 18 }, +/* 5971 */ { MAD_F(0x069c94ba) /* 0.413227776 */, 18 }, +/* 5972 */ { MAD_F(0x069cf57d) /* 0.413320053 */, 18 }, +/* 5973 */ { MAD_F(0x069d5641) /* 0.413412335 */, 18 }, +/* 5974 */ { MAD_F(0x069db706) /* 0.413504623 */, 18 }, +/* 5975 */ { MAD_F(0x069e17cc) /* 0.413596915 */, 18 }, +/* 5976 */ { MAD_F(0x069e7894) /* 0.413689213 */, 18 }, +/* 5977 */ { MAD_F(0x069ed95e) /* 0.413781515 */, 18 }, +/* 5978 */ { MAD_F(0x069f3a28) /* 0.413873823 */, 18 }, +/* 5979 */ { MAD_F(0x069f9af4) /* 0.413966136 */, 18 }, +/* 5980 */ { MAD_F(0x069ffbc2) /* 0.414058454 */, 18 }, +/* 5981 */ { MAD_F(0x06a05c91) /* 0.414150778 */, 18 }, +/* 5982 */ { MAD_F(0x06a0bd61) /* 0.414243106 */, 18 }, +/* 5983 */ { MAD_F(0x06a11e32) /* 0.414335440 */, 18 }, + +/* 5984 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 18 }, +/* 5985 */ { MAD_F(0x06a1dfda) /* 0.414520122 */, 18 }, +/* 5986 */ { MAD_F(0x06a240b0) /* 0.414612471 */, 18 }, +/* 5987 */ { MAD_F(0x06a2a187) /* 0.414704826 */, 18 }, +/* 5988 */ { MAD_F(0x06a3025f) /* 0.414797185 */, 18 }, +/* 5989 */ { MAD_F(0x06a36339) /* 0.414889549 */, 18 }, +/* 5990 */ { MAD_F(0x06a3c414) /* 0.414981919 */, 18 }, +/* 5991 */ { MAD_F(0x06a424f1) /* 0.415074294 */, 18 }, +/* 5992 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 18 }, +/* 5993 */ { MAD_F(0x06a4e6ae) /* 0.415259059 */, 18 }, +/* 5994 */ { MAD_F(0x06a5478f) /* 0.415351449 */, 18 }, +/* 5995 */ { MAD_F(0x06a5a871) /* 0.415443844 */, 18 }, +/* 5996 */ { MAD_F(0x06a60955) /* 0.415536244 */, 18 }, +/* 5997 */ { MAD_F(0x06a66a3a) /* 0.415628650 */, 18 }, +/* 5998 */ { MAD_F(0x06a6cb20) /* 0.415721061 */, 18 }, +/* 5999 */ { MAD_F(0x06a72c08) /* 0.415813476 */, 18 }, + +/* 6000 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 18 }, +/* 6001 */ { MAD_F(0x06a7eddb) /* 0.415998324 */, 18 }, +/* 6002 */ { MAD_F(0x06a84ec7) /* 0.416090755 */, 18 }, +/* 6003 */ { MAD_F(0x06a8afb4) /* 0.416183191 */, 18 }, +/* 6004 */ { MAD_F(0x06a910a3) /* 0.416275633 */, 18 }, +/* 6005 */ { MAD_F(0x06a97193) /* 0.416368079 */, 18 }, +/* 6006 */ { MAD_F(0x06a9d284) /* 0.416460531 */, 18 }, +/* 6007 */ { MAD_F(0x06aa3377) /* 0.416552988 */, 18 }, +/* 6008 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 18 }, +/* 6009 */ { MAD_F(0x06aaf561) /* 0.416737917 */, 18 }, +/* 6010 */ { MAD_F(0x06ab5657) /* 0.416830389 */, 18 }, +/* 6011 */ { MAD_F(0x06abb750) /* 0.416922867 */, 18 }, +/* 6012 */ { MAD_F(0x06ac1849) /* 0.417015349 */, 18 }, +/* 6013 */ { MAD_F(0x06ac7944) /* 0.417107837 */, 18 }, +/* 6014 */ { MAD_F(0x06acda41) /* 0.417200330 */, 18 }, +/* 6015 */ { MAD_F(0x06ad3b3e) /* 0.417292828 */, 18 }, + +/* 6016 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 18 }, +/* 6017 */ { MAD_F(0x06adfd3e) /* 0.417477839 */, 18 }, +/* 6018 */ { MAD_F(0x06ae5e40) /* 0.417570352 */, 18 }, +/* 6019 */ { MAD_F(0x06aebf43) /* 0.417662871 */, 18 }, +/* 6020 */ { MAD_F(0x06af2047) /* 0.417755394 */, 18 }, +/* 6021 */ { MAD_F(0x06af814d) /* 0.417847923 */, 18 }, +/* 6022 */ { MAD_F(0x06afe255) /* 0.417940457 */, 18 }, +/* 6023 */ { MAD_F(0x06b0435e) /* 0.418032996 */, 18 }, +/* 6024 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 18 }, +/* 6025 */ { MAD_F(0x06b10573) /* 0.418218089 */, 18 }, +/* 6026 */ { MAD_F(0x06b16680) /* 0.418310643 */, 18 }, +/* 6027 */ { MAD_F(0x06b1c78e) /* 0.418403203 */, 18 }, +/* 6028 */ { MAD_F(0x06b2289e) /* 0.418495767 */, 18 }, +/* 6029 */ { MAD_F(0x06b289af) /* 0.418588337 */, 18 }, +/* 6030 */ { MAD_F(0x06b2eac1) /* 0.418680911 */, 18 }, +/* 6031 */ { MAD_F(0x06b34bd5) /* 0.418773491 */, 18 }, + +/* 6032 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 18 }, +/* 6033 */ { MAD_F(0x06b40e00) /* 0.418958666 */, 18 }, +/* 6034 */ { MAD_F(0x06b46f18) /* 0.419051262 */, 18 }, +/* 6035 */ { MAD_F(0x06b4d031) /* 0.419143862 */, 18 }, +/* 6036 */ { MAD_F(0x06b5314c) /* 0.419236467 */, 18 }, +/* 6037 */ { MAD_F(0x06b59268) /* 0.419329078 */, 18 }, +/* 6038 */ { MAD_F(0x06b5f385) /* 0.419421694 */, 18 }, +/* 6039 */ { MAD_F(0x06b654a4) /* 0.419514314 */, 18 }, +/* 6040 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 18 }, +/* 6041 */ { MAD_F(0x06b716e6) /* 0.419699571 */, 18 }, +/* 6042 */ { MAD_F(0x06b77808) /* 0.419792208 */, 18 }, +/* 6043 */ { MAD_F(0x06b7d92d) /* 0.419884849 */, 18 }, +/* 6044 */ { MAD_F(0x06b83a52) /* 0.419977495 */, 18 }, +/* 6045 */ { MAD_F(0x06b89b79) /* 0.420070147 */, 18 }, +/* 6046 */ { MAD_F(0x06b8fca1) /* 0.420162803 */, 18 }, +/* 6047 */ { MAD_F(0x06b95dcb) /* 0.420255465 */, 18 }, + +/* 6048 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 18 }, +/* 6049 */ { MAD_F(0x06ba2023) /* 0.420440803 */, 18 }, +/* 6050 */ { MAD_F(0x06ba8150) /* 0.420533481 */, 18 }, +/* 6051 */ { MAD_F(0x06bae280) /* 0.420626163 */, 18 }, +/* 6052 */ { MAD_F(0x06bb43b0) /* 0.420718850 */, 18 }, +/* 6053 */ { MAD_F(0x06bba4e2) /* 0.420811542 */, 18 }, +/* 6054 */ { MAD_F(0x06bc0615) /* 0.420904240 */, 18 }, +/* 6055 */ { MAD_F(0x06bc674a) /* 0.420996942 */, 18 }, +/* 6056 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 18 }, +/* 6057 */ { MAD_F(0x06bd29b7) /* 0.421182362 */, 18 }, +/* 6058 */ { MAD_F(0x06bd8af0) /* 0.421275080 */, 18 }, +/* 6059 */ { MAD_F(0x06bdec2a) /* 0.421367803 */, 18 }, +/* 6060 */ { MAD_F(0x06be4d66) /* 0.421460531 */, 18 }, +/* 6061 */ { MAD_F(0x06beaea3) /* 0.421553264 */, 18 }, +/* 6062 */ { MAD_F(0x06bf0fe1) /* 0.421646003 */, 18 }, +/* 6063 */ { MAD_F(0x06bf7120) /* 0.421738746 */, 18 }, + +/* 6064 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 18 }, +/* 6065 */ { MAD_F(0x06c033a4) /* 0.421924248 */, 18 }, +/* 6066 */ { MAD_F(0x06c094e7) /* 0.422017007 */, 18 }, +/* 6067 */ { MAD_F(0x06c0f62c) /* 0.422109770 */, 18 }, +/* 6068 */ { MAD_F(0x06c15773) /* 0.422202539 */, 18 }, +/* 6069 */ { MAD_F(0x06c1b8bb) /* 0.422295313 */, 18 }, +/* 6070 */ { MAD_F(0x06c21a04) /* 0.422388092 */, 18 }, +/* 6071 */ { MAD_F(0x06c27b4e) /* 0.422480876 */, 18 }, +/* 6072 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 18 }, +/* 6073 */ { MAD_F(0x06c33de8) /* 0.422666460 */, 18 }, +/* 6074 */ { MAD_F(0x06c39f36) /* 0.422759259 */, 18 }, +/* 6075 */ { MAD_F(0x06c40086) /* 0.422852064 */, 18 }, +/* 6076 */ { MAD_F(0x06c461d8) /* 0.422944873 */, 18 }, +/* 6077 */ { MAD_F(0x06c4c32a) /* 0.423037688 */, 18 }, +/* 6078 */ { MAD_F(0x06c5247f) /* 0.423130508 */, 18 }, +/* 6079 */ { MAD_F(0x06c585d4) /* 0.423223333 */, 18 }, + +/* 6080 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 18 }, +/* 6081 */ { MAD_F(0x06c64883) /* 0.423408997 */, 18 }, +/* 6082 */ { MAD_F(0x06c6a9dd) /* 0.423501838 */, 18 }, +/* 6083 */ { MAD_F(0x06c70b38) /* 0.423594683 */, 18 }, +/* 6084 */ { MAD_F(0x06c76c94) /* 0.423687533 */, 18 }, +/* 6085 */ { MAD_F(0x06c7cdf2) /* 0.423780389 */, 18 }, +/* 6086 */ { MAD_F(0x06c82f51) /* 0.423873249 */, 18 }, +/* 6087 */ { MAD_F(0x06c890b1) /* 0.423966115 */, 18 }, +/* 6088 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 18 }, +/* 6089 */ { MAD_F(0x06c95376) /* 0.424151861 */, 18 }, +/* 6090 */ { MAD_F(0x06c9b4da) /* 0.424244742 */, 18 }, +/* 6091 */ { MAD_F(0x06ca1640) /* 0.424337628 */, 18 }, +/* 6092 */ { MAD_F(0x06ca77a8) /* 0.424430519 */, 18 }, +/* 6093 */ { MAD_F(0x06cad910) /* 0.424523415 */, 18 }, +/* 6094 */ { MAD_F(0x06cb3a7a) /* 0.424616316 */, 18 }, +/* 6095 */ { MAD_F(0x06cb9be5) /* 0.424709222 */, 18 }, + +/* 6096 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 18 }, +/* 6097 */ { MAD_F(0x06cc5ec0) /* 0.424895050 */, 18 }, +/* 6098 */ { MAD_F(0x06ccc030) /* 0.424987971 */, 18 }, +/* 6099 */ { MAD_F(0x06cd21a0) /* 0.425080898 */, 18 }, +/* 6100 */ { MAD_F(0x06cd8313) /* 0.425173829 */, 18 }, +/* 6101 */ { MAD_F(0x06cde486) /* 0.425266766 */, 18 }, +/* 6102 */ { MAD_F(0x06ce45fb) /* 0.425359708 */, 18 }, +/* 6103 */ { MAD_F(0x06cea771) /* 0.425452655 */, 18 }, +/* 6104 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 18 }, +/* 6105 */ { MAD_F(0x06cf6a62) /* 0.425638564 */, 18 }, +/* 6106 */ { MAD_F(0x06cfcbdc) /* 0.425731526 */, 18 }, +/* 6107 */ { MAD_F(0x06d02d58) /* 0.425824493 */, 18 }, +/* 6108 */ { MAD_F(0x06d08ed5) /* 0.425917465 */, 18 }, +/* 6109 */ { MAD_F(0x06d0f053) /* 0.426010443 */, 18 }, +/* 6110 */ { MAD_F(0x06d151d3) /* 0.426103425 */, 18 }, +/* 6111 */ { MAD_F(0x06d1b354) /* 0.426196412 */, 18 }, + +/* 6112 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 18 }, +/* 6113 */ { MAD_F(0x06d2765a) /* 0.426382403 */, 18 }, +/* 6114 */ { MAD_F(0x06d2d7e0) /* 0.426475405 */, 18 }, +/* 6115 */ { MAD_F(0x06d33966) /* 0.426568413 */, 18 }, +/* 6116 */ { MAD_F(0x06d39aee) /* 0.426661426 */, 18 }, +/* 6117 */ { MAD_F(0x06d3fc77) /* 0.426754444 */, 18 }, +/* 6118 */ { MAD_F(0x06d45e02) /* 0.426847467 */, 18 }, +/* 6119 */ { MAD_F(0x06d4bf8e) /* 0.426940495 */, 18 }, +/* 6120 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 18 }, +/* 6121 */ { MAD_F(0x06d582aa) /* 0.427126566 */, 18 }, +/* 6122 */ { MAD_F(0x06d5e43a) /* 0.427219609 */, 18 }, +/* 6123 */ { MAD_F(0x06d645cc) /* 0.427312657 */, 18 }, +/* 6124 */ { MAD_F(0x06d6a75f) /* 0.427405711 */, 18 }, +/* 6125 */ { MAD_F(0x06d708f3) /* 0.427498769 */, 18 }, +/* 6126 */ { MAD_F(0x06d76a88) /* 0.427591833 */, 18 }, +/* 6127 */ { MAD_F(0x06d7cc1f) /* 0.427684901 */, 18 }, + +/* 6128 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 18 }, +/* 6129 */ { MAD_F(0x06d88f51) /* 0.427871054 */, 18 }, +/* 6130 */ { MAD_F(0x06d8f0ec) /* 0.427964137 */, 18 }, +/* 6131 */ { MAD_F(0x06d95288) /* 0.428057226 */, 18 }, +/* 6132 */ { MAD_F(0x06d9b426) /* 0.428150320 */, 18 }, +/* 6133 */ { MAD_F(0x06da15c5) /* 0.428243419 */, 18 }, +/* 6134 */ { MAD_F(0x06da7766) /* 0.428336523 */, 18 }, +/* 6135 */ { MAD_F(0x06dad907) /* 0.428429632 */, 18 }, +/* 6136 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 18 }, +/* 6137 */ { MAD_F(0x06db9c4f) /* 0.428615865 */, 18 }, +/* 6138 */ { MAD_F(0x06dbfdf5) /* 0.428708989 */, 18 }, +/* 6139 */ { MAD_F(0x06dc5f9c) /* 0.428802119 */, 18 }, +/* 6140 */ { MAD_F(0x06dcc145) /* 0.428895253 */, 18 }, +/* 6141 */ { MAD_F(0x06dd22ee) /* 0.428988392 */, 18 }, +/* 6142 */ { MAD_F(0x06dd849a) /* 0.429081537 */, 18 }, +/* 6143 */ { MAD_F(0x06dde646) /* 0.429174686 */, 18 }, + +/* 6144 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 18 }, +/* 6145 */ { MAD_F(0x06dea9a4) /* 0.429361001 */, 18 }, +/* 6146 */ { MAD_F(0x06df0b54) /* 0.429454165 */, 18 }, +/* 6147 */ { MAD_F(0x06df6d06) /* 0.429547335 */, 18 }, +/* 6148 */ { MAD_F(0x06dfceba) /* 0.429640510 */, 18 }, +/* 6149 */ { MAD_F(0x06e0306f) /* 0.429733690 */, 18 }, +/* 6150 */ { MAD_F(0x06e09225) /* 0.429826874 */, 18 }, +/* 6151 */ { MAD_F(0x06e0f3dc) /* 0.429920064 */, 18 }, +/* 6152 */ { MAD_F(0x06e15595) /* 0.430013259 */, 18 }, +/* 6153 */ { MAD_F(0x06e1b74f) /* 0.430106459 */, 18 }, +/* 6154 */ { MAD_F(0x06e2190b) /* 0.430199664 */, 18 }, +/* 6155 */ { MAD_F(0x06e27ac8) /* 0.430292875 */, 18 }, +/* 6156 */ { MAD_F(0x06e2dc86) /* 0.430386090 */, 18 }, +/* 6157 */ { MAD_F(0x06e33e46) /* 0.430479310 */, 18 }, +/* 6158 */ { MAD_F(0x06e3a007) /* 0.430572535 */, 18 }, +/* 6159 */ { MAD_F(0x06e401c9) /* 0.430665765 */, 18 }, + +/* 6160 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 18 }, +/* 6161 */ { MAD_F(0x06e4c552) /* 0.430852241 */, 18 }, +/* 6162 */ { MAD_F(0x06e52718) /* 0.430945487 */, 18 }, +/* 6163 */ { MAD_F(0x06e588e0) /* 0.431038737 */, 18 }, +/* 6164 */ { MAD_F(0x06e5eaa9) /* 0.431131993 */, 18 }, +/* 6165 */ { MAD_F(0x06e64c73) /* 0.431225253 */, 18 }, +/* 6166 */ { MAD_F(0x06e6ae3f) /* 0.431318519 */, 18 }, +/* 6167 */ { MAD_F(0x06e7100c) /* 0.431411790 */, 18 }, +/* 6168 */ { MAD_F(0x06e771db) /* 0.431505065 */, 18 }, +/* 6169 */ { MAD_F(0x06e7d3ab) /* 0.431598346 */, 18 }, +/* 6170 */ { MAD_F(0x06e8357c) /* 0.431691632 */, 18 }, +/* 6171 */ { MAD_F(0x06e8974e) /* 0.431784923 */, 18 }, +/* 6172 */ { MAD_F(0x06e8f922) /* 0.431878218 */, 18 }, +/* 6173 */ { MAD_F(0x06e95af8) /* 0.431971519 */, 18 }, +/* 6174 */ { MAD_F(0x06e9bcce) /* 0.432064825 */, 18 }, +/* 6175 */ { MAD_F(0x06ea1ea6) /* 0.432158136 */, 18 }, + +/* 6176 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 18 }, +/* 6177 */ { MAD_F(0x06eae25a) /* 0.432344773 */, 18 }, +/* 6178 */ { MAD_F(0x06eb4436) /* 0.432438099 */, 18 }, +/* 6179 */ { MAD_F(0x06eba614) /* 0.432531431 */, 18 }, +/* 6180 */ { MAD_F(0x06ec07f2) /* 0.432624767 */, 18 }, +/* 6181 */ { MAD_F(0x06ec69d2) /* 0.432718108 */, 18 }, +/* 6182 */ { MAD_F(0x06eccbb4) /* 0.432811454 */, 18 }, +/* 6183 */ { MAD_F(0x06ed2d97) /* 0.432904805 */, 18 }, +/* 6184 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 18 }, +/* 6185 */ { MAD_F(0x06edf160) /* 0.433091523 */, 18 }, +/* 6186 */ { MAD_F(0x06ee5347) /* 0.433184889 */, 18 }, +/* 6187 */ { MAD_F(0x06eeb52f) /* 0.433278261 */, 18 }, +/* 6188 */ { MAD_F(0x06ef1719) /* 0.433371637 */, 18 }, +/* 6189 */ { MAD_F(0x06ef7904) /* 0.433465019 */, 18 }, +/* 6190 */ { MAD_F(0x06efdaf0) /* 0.433558405 */, 18 }, +/* 6191 */ { MAD_F(0x06f03cde) /* 0.433651797 */, 18 }, + +/* 6192 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 18 }, +/* 6193 */ { MAD_F(0x06f100bd) /* 0.433838595 */, 18 }, +/* 6194 */ { MAD_F(0x06f162ae) /* 0.433932001 */, 18 }, +/* 6195 */ { MAD_F(0x06f1c4a1) /* 0.434025413 */, 18 }, +/* 6196 */ { MAD_F(0x06f22696) /* 0.434118830 */, 18 }, +/* 6197 */ { MAD_F(0x06f2888b) /* 0.434212251 */, 18 }, +/* 6198 */ { MAD_F(0x06f2ea82) /* 0.434305678 */, 18 }, +/* 6199 */ { MAD_F(0x06f34c7b) /* 0.434399110 */, 18 }, +/* 6200 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 18 }, +/* 6201 */ { MAD_F(0x06f41070) /* 0.434585988 */, 18 }, +/* 6202 */ { MAD_F(0x06f4726c) /* 0.434679435 */, 18 }, +/* 6203 */ { MAD_F(0x06f4d46a) /* 0.434772887 */, 18 }, +/* 6204 */ { MAD_F(0x06f53669) /* 0.434866344 */, 18 }, +/* 6205 */ { MAD_F(0x06f59869) /* 0.434959806 */, 18 }, +/* 6206 */ { MAD_F(0x06f5fa6b) /* 0.435053272 */, 18 }, +/* 6207 */ { MAD_F(0x06f65c6e) /* 0.435146744 */, 18 }, + +/* 6208 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 18 }, +/* 6209 */ { MAD_F(0x06f72079) /* 0.435333703 */, 18 }, +/* 6210 */ { MAD_F(0x06f78280) /* 0.435427190 */, 18 }, +/* 6211 */ { MAD_F(0x06f7e489) /* 0.435520682 */, 18 }, +/* 6212 */ { MAD_F(0x06f84693) /* 0.435614179 */, 18 }, +/* 6213 */ { MAD_F(0x06f8a89e) /* 0.435707681 */, 18 }, +/* 6214 */ { MAD_F(0x06f90aaa) /* 0.435801188 */, 18 }, +/* 6215 */ { MAD_F(0x06f96cb8) /* 0.435894700 */, 18 }, +/* 6216 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 18 }, +/* 6217 */ { MAD_F(0x06fa30d8) /* 0.436081739 */, 18 }, +/* 6218 */ { MAD_F(0x06fa92ea) /* 0.436175266 */, 18 }, +/* 6219 */ { MAD_F(0x06faf4fe) /* 0.436268799 */, 18 }, +/* 6220 */ { MAD_F(0x06fb5712) /* 0.436362336 */, 18 }, +/* 6221 */ { MAD_F(0x06fbb928) /* 0.436455878 */, 18 }, +/* 6222 */ { MAD_F(0x06fc1b40) /* 0.436549425 */, 18 }, +/* 6223 */ { MAD_F(0x06fc7d58) /* 0.436642977 */, 18 }, + +/* 6224 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 18 }, +/* 6225 */ { MAD_F(0x06fd418e) /* 0.436830096 */, 18 }, +/* 6226 */ { MAD_F(0x06fda3ab) /* 0.436923664 */, 18 }, +/* 6227 */ { MAD_F(0x06fe05c9) /* 0.437017236 */, 18 }, +/* 6228 */ { MAD_F(0x06fe67e8) /* 0.437110813 */, 18 }, +/* 6229 */ { MAD_F(0x06feca09) /* 0.437204395 */, 18 }, +/* 6230 */ { MAD_F(0x06ff2c2b) /* 0.437297982 */, 18 }, +/* 6231 */ { MAD_F(0x06ff8e4f) /* 0.437391575 */, 18 }, +/* 6232 */ { MAD_F(0x06fff073) /* 0.437485172 */, 18 }, +/* 6233 */ { MAD_F(0x0700529a) /* 0.437578774 */, 18 }, +/* 6234 */ { MAD_F(0x0700b4c1) /* 0.437672381 */, 18 }, +/* 6235 */ { MAD_F(0x070116ea) /* 0.437765994 */, 18 }, +/* 6236 */ { MAD_F(0x07017914) /* 0.437859611 */, 18 }, +/* 6237 */ { MAD_F(0x0701db40) /* 0.437953233 */, 18 }, +/* 6238 */ { MAD_F(0x07023d6c) /* 0.438046860 */, 18 }, +/* 6239 */ { MAD_F(0x07029f9b) /* 0.438140493 */, 18 }, + +/* 6240 */ { MAD_F(0x070301ca) /* 0.438234130 */, 18 }, +/* 6241 */ { MAD_F(0x070363fb) /* 0.438327772 */, 18 }, +/* 6242 */ { MAD_F(0x0703c62d) /* 0.438421419 */, 18 }, +/* 6243 */ { MAD_F(0x07042861) /* 0.438515072 */, 18 }, +/* 6244 */ { MAD_F(0x07048a96) /* 0.438608729 */, 18 }, +/* 6245 */ { MAD_F(0x0704eccc) /* 0.438702391 */, 18 }, +/* 6246 */ { MAD_F(0x07054f04) /* 0.438796059 */, 18 }, +/* 6247 */ { MAD_F(0x0705b13d) /* 0.438889731 */, 18 }, +/* 6248 */ { MAD_F(0x07061377) /* 0.438983408 */, 18 }, +/* 6249 */ { MAD_F(0x070675b3) /* 0.439077090 */, 18 }, +/* 6250 */ { MAD_F(0x0706d7f0) /* 0.439170778 */, 18 }, +/* 6251 */ { MAD_F(0x07073a2e) /* 0.439264470 */, 18 }, +/* 6252 */ { MAD_F(0x07079c6e) /* 0.439358167 */, 18 }, +/* 6253 */ { MAD_F(0x0707feaf) /* 0.439451869 */, 18 }, +/* 6254 */ { MAD_F(0x070860f1) /* 0.439545577 */, 18 }, +/* 6255 */ { MAD_F(0x0708c335) /* 0.439639289 */, 18 }, + +/* 6256 */ { MAD_F(0x0709257a) /* 0.439733006 */, 18 }, +/* 6257 */ { MAD_F(0x070987c0) /* 0.439826728 */, 18 }, +/* 6258 */ { MAD_F(0x0709ea08) /* 0.439920456 */, 18 }, +/* 6259 */ { MAD_F(0x070a4c51) /* 0.440014188 */, 18 }, +/* 6260 */ { MAD_F(0x070aae9b) /* 0.440107925 */, 18 }, +/* 6261 */ { MAD_F(0x070b10e7) /* 0.440201667 */, 18 }, +/* 6262 */ { MAD_F(0x070b7334) /* 0.440295414 */, 18 }, +/* 6263 */ { MAD_F(0x070bd583) /* 0.440389167 */, 18 }, +/* 6264 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 18 }, +/* 6265 */ { MAD_F(0x070c9a23) /* 0.440576686 */, 18 }, +/* 6266 */ { MAD_F(0x070cfc76) /* 0.440670453 */, 18 }, +/* 6267 */ { MAD_F(0x070d5eca) /* 0.440764225 */, 18 }, +/* 6268 */ { MAD_F(0x070dc11f) /* 0.440858002 */, 18 }, +/* 6269 */ { MAD_F(0x070e2375) /* 0.440951784 */, 18 }, +/* 6270 */ { MAD_F(0x070e85cd) /* 0.441045572 */, 18 }, +/* 6271 */ { MAD_F(0x070ee826) /* 0.441139364 */, 18 }, + +/* 6272 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 18 }, +/* 6273 */ { MAD_F(0x070facdc) /* 0.441326963 */, 18 }, +/* 6274 */ { MAD_F(0x07100f39) /* 0.441420770 */, 18 }, +/* 6275 */ { MAD_F(0x07107198) /* 0.441514582 */, 18 }, +/* 6276 */ { MAD_F(0x0710d3f8) /* 0.441608399 */, 18 }, +/* 6277 */ { MAD_F(0x07113659) /* 0.441702221 */, 18 }, +/* 6278 */ { MAD_F(0x071198bb) /* 0.441796048 */, 18 }, +/* 6279 */ { MAD_F(0x0711fb1f) /* 0.441889880 */, 18 }, +/* 6280 */ { MAD_F(0x07125d84) /* 0.441983717 */, 18 }, +/* 6281 */ { MAD_F(0x0712bfeb) /* 0.442077559 */, 18 }, +/* 6282 */ { MAD_F(0x07132253) /* 0.442171406 */, 18 }, +/* 6283 */ { MAD_F(0x071384bc) /* 0.442265257 */, 18 }, +/* 6284 */ { MAD_F(0x0713e726) /* 0.442359114 */, 18 }, +/* 6285 */ { MAD_F(0x07144992) /* 0.442452976 */, 18 }, +/* 6286 */ { MAD_F(0x0714abff) /* 0.442546843 */, 18 }, +/* 6287 */ { MAD_F(0x07150e6e) /* 0.442640715 */, 18 }, + +/* 6288 */ { MAD_F(0x071570de) /* 0.442734592 */, 18 }, +/* 6289 */ { MAD_F(0x0715d34f) /* 0.442828473 */, 18 }, +/* 6290 */ { MAD_F(0x071635c1) /* 0.442922360 */, 18 }, +/* 6291 */ { MAD_F(0x07169835) /* 0.443016252 */, 18 }, +/* 6292 */ { MAD_F(0x0716faaa) /* 0.443110148 */, 18 }, +/* 6293 */ { MAD_F(0x07175d21) /* 0.443204050 */, 18 }, +/* 6294 */ { MAD_F(0x0717bf99) /* 0.443297957 */, 18 }, +/* 6295 */ { MAD_F(0x07182212) /* 0.443391868 */, 18 }, +/* 6296 */ { MAD_F(0x0718848d) /* 0.443485785 */, 18 }, +/* 6297 */ { MAD_F(0x0718e709) /* 0.443579706 */, 18 }, +/* 6298 */ { MAD_F(0x07194986) /* 0.443673633 */, 18 }, +/* 6299 */ { MAD_F(0x0719ac04) /* 0.443767564 */, 18 }, +/* 6300 */ { MAD_F(0x071a0e84) /* 0.443861501 */, 18 }, +/* 6301 */ { MAD_F(0x071a7105) /* 0.443955442 */, 18 }, +/* 6302 */ { MAD_F(0x071ad388) /* 0.444049389 */, 18 }, +/* 6303 */ { MAD_F(0x071b360c) /* 0.444143340 */, 18 }, + +/* 6304 */ { MAD_F(0x071b9891) /* 0.444237296 */, 18 }, +/* 6305 */ { MAD_F(0x071bfb18) /* 0.444331258 */, 18 }, +/* 6306 */ { MAD_F(0x071c5d9f) /* 0.444425224 */, 18 }, +/* 6307 */ { MAD_F(0x071cc029) /* 0.444519195 */, 18 }, +/* 6308 */ { MAD_F(0x071d22b3) /* 0.444613171 */, 18 }, +/* 6309 */ { MAD_F(0x071d853f) /* 0.444707153 */, 18 }, +/* 6310 */ { MAD_F(0x071de7cc) /* 0.444801139 */, 18 }, +/* 6311 */ { MAD_F(0x071e4a5b) /* 0.444895130 */, 18 }, +/* 6312 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 18 }, +/* 6313 */ { MAD_F(0x071f0f7c) /* 0.445083127 */, 18 }, +/* 6314 */ { MAD_F(0x071f720e) /* 0.445177133 */, 18 }, +/* 6315 */ { MAD_F(0x071fd4a2) /* 0.445271144 */, 18 }, +/* 6316 */ { MAD_F(0x07203737) /* 0.445365160 */, 18 }, +/* 6317 */ { MAD_F(0x072099ce) /* 0.445459181 */, 18 }, +/* 6318 */ { MAD_F(0x0720fc66) /* 0.445553206 */, 18 }, +/* 6319 */ { MAD_F(0x07215eff) /* 0.445647237 */, 18 }, + +/* 6320 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 18 }, +/* 6321 */ { MAD_F(0x07222436) /* 0.445835314 */, 18 }, +/* 6322 */ { MAD_F(0x072286d3) /* 0.445929359 */, 18 }, +/* 6323 */ { MAD_F(0x0722e971) /* 0.446023410 */, 18 }, +/* 6324 */ { MAD_F(0x07234c11) /* 0.446117466 */, 18 }, +/* 6325 */ { MAD_F(0x0723aeb2) /* 0.446211526 */, 18 }, +/* 6326 */ { MAD_F(0x07241155) /* 0.446305592 */, 18 }, +/* 6327 */ { MAD_F(0x072473f9) /* 0.446399662 */, 18 }, +/* 6328 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 18 }, +/* 6329 */ { MAD_F(0x07253944) /* 0.446587818 */, 18 }, +/* 6330 */ { MAD_F(0x07259bec) /* 0.446681903 */, 18 }, +/* 6331 */ { MAD_F(0x0725fe95) /* 0.446775994 */, 18 }, +/* 6332 */ { MAD_F(0x07266140) /* 0.446870089 */, 18 }, +/* 6333 */ { MAD_F(0x0726c3ec) /* 0.446964189 */, 18 }, +/* 6334 */ { MAD_F(0x07272699) /* 0.447058294 */, 18 }, +/* 6335 */ { MAD_F(0x07278947) /* 0.447152404 */, 18 }, + +/* 6336 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 18 }, +/* 6337 */ { MAD_F(0x07284ea8) /* 0.447340639 */, 18 }, +/* 6338 */ { MAD_F(0x0728b15b) /* 0.447434764 */, 18 }, +/* 6339 */ { MAD_F(0x0729140f) /* 0.447528894 */, 18 }, +/* 6340 */ { MAD_F(0x072976c4) /* 0.447623029 */, 18 }, +/* 6341 */ { MAD_F(0x0729d97a) /* 0.447717169 */, 18 }, +/* 6342 */ { MAD_F(0x072a3c32) /* 0.447811314 */, 18 }, +/* 6343 */ { MAD_F(0x072a9eeb) /* 0.447905463 */, 18 }, +/* 6344 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 18 }, +/* 6345 */ { MAD_F(0x072b6461) /* 0.448093778 */, 18 }, +/* 6346 */ { MAD_F(0x072bc71e) /* 0.448187942 */, 18 }, +/* 6347 */ { MAD_F(0x072c29dd) /* 0.448282112 */, 18 }, +/* 6348 */ { MAD_F(0x072c8c9d) /* 0.448376286 */, 18 }, +/* 6349 */ { MAD_F(0x072cef5e) /* 0.448470466 */, 18 }, +/* 6350 */ { MAD_F(0x072d5220) /* 0.448564650 */, 18 }, +/* 6351 */ { MAD_F(0x072db4e4) /* 0.448658839 */, 18 }, + +/* 6352 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 18 }, +/* 6353 */ { MAD_F(0x072e7a6f) /* 0.448847233 */, 18 }, +/* 6354 */ { MAD_F(0x072edd37) /* 0.448941437 */, 18 }, +/* 6355 */ { MAD_F(0x072f4000) /* 0.449035646 */, 18 }, +/* 6356 */ { MAD_F(0x072fa2ca) /* 0.449129860 */, 18 }, +/* 6357 */ { MAD_F(0x07300596) /* 0.449224079 */, 18 }, +/* 6358 */ { MAD_F(0x07306863) /* 0.449318303 */, 18 }, +/* 6359 */ { MAD_F(0x0730cb32) /* 0.449412531 */, 18 }, +/* 6360 */ { MAD_F(0x07312e01) /* 0.449506765 */, 18 }, +/* 6361 */ { MAD_F(0x073190d2) /* 0.449601004 */, 18 }, +/* 6362 */ { MAD_F(0x0731f3a5) /* 0.449695247 */, 18 }, +/* 6363 */ { MAD_F(0x07325678) /* 0.449789496 */, 18 }, +/* 6364 */ { MAD_F(0x0732b94d) /* 0.449883749 */, 18 }, +/* 6365 */ { MAD_F(0x07331c23) /* 0.449978008 */, 18 }, +/* 6366 */ { MAD_F(0x07337efb) /* 0.450072271 */, 18 }, +/* 6367 */ { MAD_F(0x0733e1d4) /* 0.450166540 */, 18 }, + +/* 6368 */ { MAD_F(0x073444ae) /* 0.450260813 */, 18 }, +/* 6369 */ { MAD_F(0x0734a78a) /* 0.450355091 */, 18 }, +/* 6370 */ { MAD_F(0x07350a67) /* 0.450449374 */, 18 }, +/* 6371 */ { MAD_F(0x07356d45) /* 0.450543662 */, 18 }, +/* 6372 */ { MAD_F(0x0735d025) /* 0.450637955 */, 18 }, +/* 6373 */ { MAD_F(0x07363306) /* 0.450732253 */, 18 }, +/* 6374 */ { MAD_F(0x073695e8) /* 0.450826556 */, 18 }, +/* 6375 */ { MAD_F(0x0736f8cb) /* 0.450920864 */, 18 }, +/* 6376 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 18 }, +/* 6377 */ { MAD_F(0x0737be96) /* 0.451109494 */, 18 }, +/* 6378 */ { MAD_F(0x0738217e) /* 0.451203817 */, 18 }, +/* 6379 */ { MAD_F(0x07388467) /* 0.451298144 */, 18 }, +/* 6380 */ { MAD_F(0x0738e751) /* 0.451392477 */, 18 }, +/* 6381 */ { MAD_F(0x07394a3d) /* 0.451486814 */, 18 }, +/* 6382 */ { MAD_F(0x0739ad29) /* 0.451581156 */, 18 }, +/* 6383 */ { MAD_F(0x073a1017) /* 0.451675503 */, 18 }, + +/* 6384 */ { MAD_F(0x073a7307) /* 0.451769856 */, 18 }, +/* 6385 */ { MAD_F(0x073ad5f8) /* 0.451864213 */, 18 }, +/* 6386 */ { MAD_F(0x073b38ea) /* 0.451958575 */, 18 }, +/* 6387 */ { MAD_F(0x073b9bdd) /* 0.452052942 */, 18 }, +/* 6388 */ { MAD_F(0x073bfed2) /* 0.452147313 */, 18 }, +/* 6389 */ { MAD_F(0x073c61c8) /* 0.452241690 */, 18 }, +/* 6390 */ { MAD_F(0x073cc4bf) /* 0.452336072 */, 18 }, +/* 6391 */ { MAD_F(0x073d27b8) /* 0.452430458 */, 18 }, +/* 6392 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 18 }, +/* 6393 */ { MAD_F(0x073dedae) /* 0.452619246 */, 18 }, +/* 6394 */ { MAD_F(0x073e50aa) /* 0.452713648 */, 18 }, +/* 6395 */ { MAD_F(0x073eb3a8) /* 0.452808054 */, 18 }, +/* 6396 */ { MAD_F(0x073f16a8) /* 0.452902465 */, 18 }, +/* 6397 */ { MAD_F(0x073f79a8) /* 0.452996882 */, 18 }, +/* 6398 */ { MAD_F(0x073fdcaa) /* 0.453091303 */, 18 }, +/* 6399 */ { MAD_F(0x07403fad) /* 0.453185729 */, 18 }, + +/* 6400 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 18 }, +/* 6401 */ { MAD_F(0x074105b8) /* 0.453374595 */, 18 }, +/* 6402 */ { MAD_F(0x074168bf) /* 0.453469036 */, 18 }, +/* 6403 */ { MAD_F(0x0741cbc8) /* 0.453563482 */, 18 }, +/* 6404 */ { MAD_F(0x07422ed2) /* 0.453657932 */, 18 }, +/* 6405 */ { MAD_F(0x074291dd) /* 0.453752388 */, 18 }, +/* 6406 */ { MAD_F(0x0742f4e9) /* 0.453846848 */, 18 }, +/* 6407 */ { MAD_F(0x074357f7) /* 0.453941314 */, 18 }, +/* 6408 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 18 }, +/* 6409 */ { MAD_F(0x07441e17) /* 0.454130259 */, 18 }, +/* 6410 */ { MAD_F(0x07448129) /* 0.454224739 */, 18 }, +/* 6411 */ { MAD_F(0x0744e43c) /* 0.454319224 */, 18 }, +/* 6412 */ { MAD_F(0x07454750) /* 0.454413714 */, 18 }, +/* 6413 */ { MAD_F(0x0745aa66) /* 0.454508209 */, 18 }, +/* 6414 */ { MAD_F(0x07460d7d) /* 0.454602708 */, 18 }, +/* 6415 */ { MAD_F(0x07467095) /* 0.454697213 */, 18 }, + +/* 6416 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 18 }, +/* 6417 */ { MAD_F(0x074736ca) /* 0.454886237 */, 18 }, +/* 6418 */ { MAD_F(0x074799e7) /* 0.454980756 */, 18 }, +/* 6419 */ { MAD_F(0x0747fd04) /* 0.455075281 */, 18 }, +/* 6420 */ { MAD_F(0x07486023) /* 0.455169810 */, 18 }, +/* 6421 */ { MAD_F(0x0748c344) /* 0.455264344 */, 18 }, +/* 6422 */ { MAD_F(0x07492665) /* 0.455358883 */, 18 }, +/* 6423 */ { MAD_F(0x07498988) /* 0.455453427 */, 18 }, +/* 6424 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 18 }, +/* 6425 */ { MAD_F(0x074a4fd2) /* 0.455642529 */, 18 }, +/* 6426 */ { MAD_F(0x074ab2f9) /* 0.455737088 */, 18 }, +/* 6427 */ { MAD_F(0x074b1621) /* 0.455831652 */, 18 }, +/* 6428 */ { MAD_F(0x074b794b) /* 0.455926220 */, 18 }, +/* 6429 */ { MAD_F(0x074bdc75) /* 0.456020793 */, 18 }, +/* 6430 */ { MAD_F(0x074c3fa1) /* 0.456115372 */, 18 }, +/* 6431 */ { MAD_F(0x074ca2cf) /* 0.456209955 */, 18 }, + +/* 6432 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 18 }, +/* 6433 */ { MAD_F(0x074d692e) /* 0.456399136 */, 18 }, +/* 6434 */ { MAD_F(0x074dcc5f) /* 0.456493733 */, 18 }, +/* 6435 */ { MAD_F(0x074e2f92) /* 0.456588336 */, 18 }, +/* 6436 */ { MAD_F(0x074e92c6) /* 0.456682944 */, 18 }, +/* 6437 */ { MAD_F(0x074ef5fb) /* 0.456777556 */, 18 }, +/* 6438 */ { MAD_F(0x074f5932) /* 0.456872174 */, 18 }, +/* 6439 */ { MAD_F(0x074fbc6a) /* 0.456966796 */, 18 }, +/* 6440 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 18 }, +/* 6441 */ { MAD_F(0x075082de) /* 0.457156056 */, 18 }, +/* 6442 */ { MAD_F(0x0750e61a) /* 0.457250693 */, 18 }, +/* 6443 */ { MAD_F(0x07514957) /* 0.457345335 */, 18 }, +/* 6444 */ { MAD_F(0x0751ac96) /* 0.457439981 */, 18 }, +/* 6445 */ { MAD_F(0x07520fd6) /* 0.457534633 */, 18 }, +/* 6446 */ { MAD_F(0x07527317) /* 0.457629290 */, 18 }, +/* 6447 */ { MAD_F(0x0752d659) /* 0.457723951 */, 18 }, + +/* 6448 */ { MAD_F(0x0753399d) /* 0.457818618 */, 18 }, +/* 6449 */ { MAD_F(0x07539ce2) /* 0.457913289 */, 18 }, +/* 6450 */ { MAD_F(0x07540029) /* 0.458007965 */, 18 }, +/* 6451 */ { MAD_F(0x07546371) /* 0.458102646 */, 18 }, +/* 6452 */ { MAD_F(0x0754c6ba) /* 0.458197332 */, 18 }, +/* 6453 */ { MAD_F(0x07552a04) /* 0.458292023 */, 18 }, +/* 6454 */ { MAD_F(0x07558d50) /* 0.458386719 */, 18 }, +/* 6455 */ { MAD_F(0x0755f09d) /* 0.458481420 */, 18 }, +/* 6456 */ { MAD_F(0x075653eb) /* 0.458576125 */, 18 }, +/* 6457 */ { MAD_F(0x0756b73b) /* 0.458670836 */, 18 }, +/* 6458 */ { MAD_F(0x07571a8c) /* 0.458765551 */, 18 }, +/* 6459 */ { MAD_F(0x07577dde) /* 0.458860271 */, 18 }, +/* 6460 */ { MAD_F(0x0757e131) /* 0.458954996 */, 18 }, +/* 6461 */ { MAD_F(0x07584486) /* 0.459049726 */, 18 }, +/* 6462 */ { MAD_F(0x0758a7dd) /* 0.459144461 */, 18 }, +/* 6463 */ { MAD_F(0x07590b34) /* 0.459239201 */, 18 }, + +/* 6464 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 18 }, +/* 6465 */ { MAD_F(0x0759d1e7) /* 0.459428695 */, 18 }, +/* 6466 */ { MAD_F(0x075a3542) /* 0.459523450 */, 18 }, +/* 6467 */ { MAD_F(0x075a989f) /* 0.459618209 */, 18 }, +/* 6468 */ { MAD_F(0x075afbfd) /* 0.459712973 */, 18 }, +/* 6469 */ { MAD_F(0x075b5f5d) /* 0.459807742 */, 18 }, +/* 6470 */ { MAD_F(0x075bc2bd) /* 0.459902516 */, 18 }, +/* 6471 */ { MAD_F(0x075c261f) /* 0.459997295 */, 18 }, +/* 6472 */ { MAD_F(0x075c8983) /* 0.460092079 */, 18 }, +/* 6473 */ { MAD_F(0x075cece7) /* 0.460186867 */, 18 }, +/* 6474 */ { MAD_F(0x075d504d) /* 0.460281661 */, 18 }, +/* 6475 */ { MAD_F(0x075db3b5) /* 0.460376459 */, 18 }, +/* 6476 */ { MAD_F(0x075e171d) /* 0.460471262 */, 18 }, +/* 6477 */ { MAD_F(0x075e7a87) /* 0.460566071 */, 18 }, +/* 6478 */ { MAD_F(0x075eddf2) /* 0.460660884 */, 18 }, +/* 6479 */ { MAD_F(0x075f415f) /* 0.460755701 */, 18 }, + +/* 6480 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 18 }, +/* 6481 */ { MAD_F(0x0760083b) /* 0.460945352 */, 18 }, +/* 6482 */ { MAD_F(0x07606bac) /* 0.461040184 */, 18 }, +/* 6483 */ { MAD_F(0x0760cf1e) /* 0.461135022 */, 18 }, +/* 6484 */ { MAD_F(0x07613291) /* 0.461229864 */, 18 }, +/* 6485 */ { MAD_F(0x07619605) /* 0.461324711 */, 18 }, +/* 6486 */ { MAD_F(0x0761f97b) /* 0.461419563 */, 18 }, +/* 6487 */ { MAD_F(0x07625cf2) /* 0.461514420 */, 18 }, +/* 6488 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 18 }, +/* 6489 */ { MAD_F(0x076323e3) /* 0.461704149 */, 18 }, +/* 6490 */ { MAD_F(0x0763875e) /* 0.461799020 */, 18 }, +/* 6491 */ { MAD_F(0x0763eadb) /* 0.461893897 */, 18 }, +/* 6492 */ { MAD_F(0x07644e58) /* 0.461988778 */, 18 }, +/* 6493 */ { MAD_F(0x0764b1d7) /* 0.462083664 */, 18 }, +/* 6494 */ { MAD_F(0x07651557) /* 0.462178555 */, 18 }, +/* 6495 */ { MAD_F(0x076578d8) /* 0.462273451 */, 18 }, + +/* 6496 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 18 }, +/* 6497 */ { MAD_F(0x07663fdf) /* 0.462463257 */, 18 }, +/* 6498 */ { MAD_F(0x0766a364) /* 0.462558168 */, 18 }, +/* 6499 */ { MAD_F(0x076706eb) /* 0.462653083 */, 18 }, +/* 6500 */ { MAD_F(0x07676a73) /* 0.462748003 */, 18 }, +/* 6501 */ { MAD_F(0x0767cdfc) /* 0.462842928 */, 18 }, +/* 6502 */ { MAD_F(0x07683187) /* 0.462937858 */, 18 }, +/* 6503 */ { MAD_F(0x07689513) /* 0.463032793 */, 18 }, +/* 6504 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 18 }, +/* 6505 */ { MAD_F(0x07695c2e) /* 0.463222678 */, 18 }, +/* 6506 */ { MAD_F(0x0769bfbe) /* 0.463317627 */, 18 }, +/* 6507 */ { MAD_F(0x076a234f) /* 0.463412581 */, 18 }, +/* 6508 */ { MAD_F(0x076a86e2) /* 0.463507540 */, 18 }, +/* 6509 */ { MAD_F(0x076aea75) /* 0.463602504 */, 18 }, +/* 6510 */ { MAD_F(0x076b4e0a) /* 0.463697473 */, 18 }, +/* 6511 */ { MAD_F(0x076bb1a1) /* 0.463792447 */, 18 }, + +/* 6512 */ { MAD_F(0x076c1538) /* 0.463887426 */, 18 }, +/* 6513 */ { MAD_F(0x076c78d1) /* 0.463982409 */, 18 }, +/* 6514 */ { MAD_F(0x076cdc6c) /* 0.464077398 */, 18 }, +/* 6515 */ { MAD_F(0x076d4007) /* 0.464172391 */, 18 }, +/* 6516 */ { MAD_F(0x076da3a4) /* 0.464267389 */, 18 }, +/* 6517 */ { MAD_F(0x076e0742) /* 0.464362392 */, 18 }, +/* 6518 */ { MAD_F(0x076e6ae2) /* 0.464457399 */, 18 }, +/* 6519 */ { MAD_F(0x076ece82) /* 0.464552412 */, 18 }, +/* 6520 */ { MAD_F(0x076f3224) /* 0.464647430 */, 18 }, +/* 6521 */ { MAD_F(0x076f95c8) /* 0.464742452 */, 18 }, +/* 6522 */ { MAD_F(0x076ff96c) /* 0.464837479 */, 18 }, +/* 6523 */ { MAD_F(0x07705d12) /* 0.464932511 */, 18 }, +/* 6524 */ { MAD_F(0x0770c0ba) /* 0.465027548 */, 18 }, +/* 6525 */ { MAD_F(0x07712462) /* 0.465122590 */, 18 }, +/* 6526 */ { MAD_F(0x0771880c) /* 0.465217637 */, 18 }, +/* 6527 */ { MAD_F(0x0771ebb7) /* 0.465312688 */, 18 }, + +/* 6528 */ { MAD_F(0x07724f64) /* 0.465407744 */, 18 }, +/* 6529 */ { MAD_F(0x0772b312) /* 0.465502806 */, 18 }, +/* 6530 */ { MAD_F(0x077316c1) /* 0.465597872 */, 18 }, +/* 6531 */ { MAD_F(0x07737a71) /* 0.465692943 */, 18 }, +/* 6532 */ { MAD_F(0x0773de23) /* 0.465788018 */, 18 }, +/* 6533 */ { MAD_F(0x077441d6) /* 0.465883099 */, 18 }, +/* 6534 */ { MAD_F(0x0774a58a) /* 0.465978184 */, 18 }, +/* 6535 */ { MAD_F(0x07750940) /* 0.466073275 */, 18 }, +/* 6536 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 18 }, +/* 6537 */ { MAD_F(0x0775d0af) /* 0.466263470 */, 18 }, +/* 6538 */ { MAD_F(0x07763468) /* 0.466358575 */, 18 }, +/* 6539 */ { MAD_F(0x07769823) /* 0.466453684 */, 18 }, +/* 6540 */ { MAD_F(0x0776fbdf) /* 0.466548799 */, 18 }, +/* 6541 */ { MAD_F(0x07775f9d) /* 0.466643918 */, 18 }, +/* 6542 */ { MAD_F(0x0777c35c) /* 0.466739043 */, 18 }, +/* 6543 */ { MAD_F(0x0778271c) /* 0.466834172 */, 18 }, + +/* 6544 */ { MAD_F(0x07788add) /* 0.466929306 */, 18 }, +/* 6545 */ { MAD_F(0x0778ee9f) /* 0.467024445 */, 18 }, +/* 6546 */ { MAD_F(0x07795263) /* 0.467119588 */, 18 }, +/* 6547 */ { MAD_F(0x0779b629) /* 0.467214737 */, 18 }, +/* 6548 */ { MAD_F(0x077a19ef) /* 0.467309890 */, 18 }, +/* 6549 */ { MAD_F(0x077a7db7) /* 0.467405048 */, 18 }, +/* 6550 */ { MAD_F(0x077ae180) /* 0.467500211 */, 18 }, +/* 6551 */ { MAD_F(0x077b454b) /* 0.467595379 */, 18 }, +/* 6552 */ { MAD_F(0x077ba916) /* 0.467690552 */, 18 }, +/* 6553 */ { MAD_F(0x077c0ce3) /* 0.467785729 */, 18 }, +/* 6554 */ { MAD_F(0x077c70b2) /* 0.467880912 */, 18 }, +/* 6555 */ { MAD_F(0x077cd481) /* 0.467976099 */, 18 }, +/* 6556 */ { MAD_F(0x077d3852) /* 0.468071291 */, 18 }, +/* 6557 */ { MAD_F(0x077d9c24) /* 0.468166488 */, 18 }, +/* 6558 */ { MAD_F(0x077dfff8) /* 0.468261690 */, 18 }, +/* 6559 */ { MAD_F(0x077e63cd) /* 0.468356896 */, 18 }, + +/* 6560 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 18 }, +/* 6561 */ { MAD_F(0x077f2b7a) /* 0.468547324 */, 18 }, +/* 6562 */ { MAD_F(0x077f8f53) /* 0.468642545 */, 18 }, +/* 6563 */ { MAD_F(0x077ff32d) /* 0.468737771 */, 18 }, +/* 6564 */ { MAD_F(0x07805708) /* 0.468833002 */, 18 }, +/* 6565 */ { MAD_F(0x0780bae5) /* 0.468928237 */, 18 }, +/* 6566 */ { MAD_F(0x07811ec3) /* 0.469023478 */, 18 }, +/* 6567 */ { MAD_F(0x078182a2) /* 0.469118723 */, 18 }, +/* 6568 */ { MAD_F(0x0781e683) /* 0.469213973 */, 18 }, +/* 6569 */ { MAD_F(0x07824a64) /* 0.469309228 */, 18 }, +/* 6570 */ { MAD_F(0x0782ae47) /* 0.469404488 */, 18 }, +/* 6571 */ { MAD_F(0x0783122c) /* 0.469499752 */, 18 }, +/* 6572 */ { MAD_F(0x07837612) /* 0.469595022 */, 18 }, +/* 6573 */ { MAD_F(0x0783d9f9) /* 0.469690296 */, 18 }, +/* 6574 */ { MAD_F(0x07843de1) /* 0.469785575 */, 18 }, +/* 6575 */ { MAD_F(0x0784a1ca) /* 0.469880859 */, 18 }, + +/* 6576 */ { MAD_F(0x078505b5) /* 0.469976148 */, 18 }, +/* 6577 */ { MAD_F(0x078569a2) /* 0.470071442 */, 18 }, +/* 6578 */ { MAD_F(0x0785cd8f) /* 0.470166740 */, 18 }, +/* 6579 */ { MAD_F(0x0786317e) /* 0.470262043 */, 18 }, +/* 6580 */ { MAD_F(0x0786956e) /* 0.470357351 */, 18 }, +/* 6581 */ { MAD_F(0x0786f95f) /* 0.470452664 */, 18 }, +/* 6582 */ { MAD_F(0x07875d52) /* 0.470547982 */, 18 }, +/* 6583 */ { MAD_F(0x0787c146) /* 0.470643305 */, 18 }, +/* 6584 */ { MAD_F(0x0788253b) /* 0.470738632 */, 18 }, +/* 6585 */ { MAD_F(0x07888932) /* 0.470833964 */, 18 }, +/* 6586 */ { MAD_F(0x0788ed2a) /* 0.470929301 */, 18 }, +/* 6587 */ { MAD_F(0x07895123) /* 0.471024643 */, 18 }, +/* 6588 */ { MAD_F(0x0789b51d) /* 0.471119990 */, 18 }, +/* 6589 */ { MAD_F(0x078a1919) /* 0.471215341 */, 18 }, +/* 6590 */ { MAD_F(0x078a7d16) /* 0.471310698 */, 18 }, +/* 6591 */ { MAD_F(0x078ae114) /* 0.471406059 */, 18 }, + +/* 6592 */ { MAD_F(0x078b4514) /* 0.471501425 */, 18 }, +/* 6593 */ { MAD_F(0x078ba915) /* 0.471596796 */, 18 }, +/* 6594 */ { MAD_F(0x078c0d17) /* 0.471692171 */, 18 }, +/* 6595 */ { MAD_F(0x078c711a) /* 0.471787552 */, 18 }, +/* 6596 */ { MAD_F(0x078cd51f) /* 0.471882937 */, 18 }, +/* 6597 */ { MAD_F(0x078d3925) /* 0.471978327 */, 18 }, +/* 6598 */ { MAD_F(0x078d9d2d) /* 0.472073722 */, 18 }, +/* 6599 */ { MAD_F(0x078e0135) /* 0.472169122 */, 18 }, +/* 6600 */ { MAD_F(0x078e653f) /* 0.472264527 */, 18 }, +/* 6601 */ { MAD_F(0x078ec94b) /* 0.472359936 */, 18 }, +/* 6602 */ { MAD_F(0x078f2d57) /* 0.472455350 */, 18 }, +/* 6603 */ { MAD_F(0x078f9165) /* 0.472550769 */, 18 }, +/* 6604 */ { MAD_F(0x078ff574) /* 0.472646193 */, 18 }, +/* 6605 */ { MAD_F(0x07905985) /* 0.472741622 */, 18 }, +/* 6606 */ { MAD_F(0x0790bd96) /* 0.472837055 */, 18 }, +/* 6607 */ { MAD_F(0x079121a9) /* 0.472932493 */, 18 }, + +/* 6608 */ { MAD_F(0x079185be) /* 0.473027937 */, 18 }, +/* 6609 */ { MAD_F(0x0791e9d3) /* 0.473123384 */, 18 }, +/* 6610 */ { MAD_F(0x07924dea) /* 0.473218837 */, 18 }, +/* 6611 */ { MAD_F(0x0792b202) /* 0.473314295 */, 18 }, +/* 6612 */ { MAD_F(0x0793161c) /* 0.473409757 */, 18 }, +/* 6613 */ { MAD_F(0x07937a37) /* 0.473505224 */, 18 }, +/* 6614 */ { MAD_F(0x0793de53) /* 0.473600696 */, 18 }, +/* 6615 */ { MAD_F(0x07944270) /* 0.473696173 */, 18 }, +/* 6616 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 18 }, +/* 6617 */ { MAD_F(0x07950aaf) /* 0.473887141 */, 18 }, +/* 6618 */ { MAD_F(0x07956ed0) /* 0.473982632 */, 18 }, +/* 6619 */ { MAD_F(0x0795d2f2) /* 0.474078128 */, 18 }, +/* 6620 */ { MAD_F(0x07963716) /* 0.474173629 */, 18 }, +/* 6621 */ { MAD_F(0x07969b3b) /* 0.474269135 */, 18 }, +/* 6622 */ { MAD_F(0x0796ff62) /* 0.474364645 */, 18 }, +/* 6623 */ { MAD_F(0x07976389) /* 0.474460161 */, 18 }, + +/* 6624 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 18 }, +/* 6625 */ { MAD_F(0x07982bdd) /* 0.474651205 */, 18 }, +/* 6626 */ { MAD_F(0x07989008) /* 0.474746735 */, 18 }, +/* 6627 */ { MAD_F(0x0798f435) /* 0.474842270 */, 18 }, +/* 6628 */ { MAD_F(0x07995863) /* 0.474937809 */, 18 }, +/* 6629 */ { MAD_F(0x0799bc92) /* 0.475033353 */, 18 }, +/* 6630 */ { MAD_F(0x079a20c3) /* 0.475128902 */, 18 }, +/* 6631 */ { MAD_F(0x079a84f5) /* 0.475224456 */, 18 }, +/* 6632 */ { MAD_F(0x079ae929) /* 0.475320014 */, 18 }, +/* 6633 */ { MAD_F(0x079b4d5d) /* 0.475415578 */, 18 }, +/* 6634 */ { MAD_F(0x079bb193) /* 0.475511146 */, 18 }, +/* 6635 */ { MAD_F(0x079c15ca) /* 0.475606719 */, 18 }, +/* 6636 */ { MAD_F(0x079c7a03) /* 0.475702296 */, 18 }, +/* 6637 */ { MAD_F(0x079cde3c) /* 0.475797879 */, 18 }, +/* 6638 */ { MAD_F(0x079d4277) /* 0.475893466 */, 18 }, +/* 6639 */ { MAD_F(0x079da6b4) /* 0.475989058 */, 18 }, + +/* 6640 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 18 }, +/* 6641 */ { MAD_F(0x079e6f30) /* 0.476180257 */, 18 }, +/* 6642 */ { MAD_F(0x079ed370) /* 0.476275863 */, 18 }, +/* 6643 */ { MAD_F(0x079f37b2) /* 0.476371475 */, 18 }, +/* 6644 */ { MAD_F(0x079f9bf5) /* 0.476467091 */, 18 }, +/* 6645 */ { MAD_F(0x07a00039) /* 0.476562712 */, 18 }, +/* 6646 */ { MAD_F(0x07a0647e) /* 0.476658338 */, 18 }, +/* 6647 */ { MAD_F(0x07a0c8c5) /* 0.476753968 */, 18 }, +/* 6648 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 18 }, +/* 6649 */ { MAD_F(0x07a19156) /* 0.476945243 */, 18 }, +/* 6650 */ { MAD_F(0x07a1f5a0) /* 0.477040888 */, 18 }, +/* 6651 */ { MAD_F(0x07a259ec) /* 0.477136538 */, 18 }, +/* 6652 */ { MAD_F(0x07a2be39) /* 0.477232193 */, 18 }, +/* 6653 */ { MAD_F(0x07a32287) /* 0.477327852 */, 18 }, +/* 6654 */ { MAD_F(0x07a386d7) /* 0.477423516 */, 18 }, +/* 6655 */ { MAD_F(0x07a3eb28) /* 0.477519185 */, 18 }, + +/* 6656 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 18 }, +/* 6657 */ { MAD_F(0x07a4b3ce) /* 0.477710537 */, 18 }, +/* 6658 */ { MAD_F(0x07a51822) /* 0.477806220 */, 18 }, +/* 6659 */ { MAD_F(0x07a57c78) /* 0.477901908 */, 18 }, +/* 6660 */ { MAD_F(0x07a5e0d0) /* 0.477997601 */, 18 }, +/* 6661 */ { MAD_F(0x07a64528) /* 0.478093299 */, 18 }, +/* 6662 */ { MAD_F(0x07a6a982) /* 0.478189001 */, 18 }, +/* 6663 */ { MAD_F(0x07a70ddd) /* 0.478284708 */, 18 }, +/* 6664 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 18 }, +/* 6665 */ { MAD_F(0x07a7d698) /* 0.478476137 */, 18 }, +/* 6666 */ { MAD_F(0x07a83af7) /* 0.478571858 */, 18 }, +/* 6667 */ { MAD_F(0x07a89f57) /* 0.478667585 */, 18 }, +/* 6668 */ { MAD_F(0x07a903b9) /* 0.478763316 */, 18 }, +/* 6669 */ { MAD_F(0x07a9681c) /* 0.478859052 */, 18 }, +/* 6670 */ { MAD_F(0x07a9cc80) /* 0.478954793 */, 18 }, +/* 6671 */ { MAD_F(0x07aa30e5) /* 0.479050538 */, 18 }, + +/* 6672 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 18 }, +/* 6673 */ { MAD_F(0x07aaf9b4) /* 0.479242043 */, 18 }, +/* 6674 */ { MAD_F(0x07ab5e1e) /* 0.479337803 */, 18 }, +/* 6675 */ { MAD_F(0x07abc288) /* 0.479433568 */, 18 }, +/* 6676 */ { MAD_F(0x07ac26f4) /* 0.479529337 */, 18 }, +/* 6677 */ { MAD_F(0x07ac8b61) /* 0.479625111 */, 18 }, +/* 6678 */ { MAD_F(0x07acefd0) /* 0.479720890 */, 18 }, +/* 6679 */ { MAD_F(0x07ad543f) /* 0.479816674 */, 18 }, +/* 6680 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 18 }, +/* 6681 */ { MAD_F(0x07ae1d23) /* 0.480008256 */, 18 }, +/* 6682 */ { MAD_F(0x07ae8196) /* 0.480104054 */, 18 }, +/* 6683 */ { MAD_F(0x07aee60b) /* 0.480199857 */, 18 }, +/* 6684 */ { MAD_F(0x07af4a81) /* 0.480295664 */, 18 }, +/* 6685 */ { MAD_F(0x07afaef9) /* 0.480391477 */, 18 }, +/* 6686 */ { MAD_F(0x07b01372) /* 0.480487294 */, 18 }, +/* 6687 */ { MAD_F(0x07b077ec) /* 0.480583116 */, 18 }, + +/* 6688 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 18 }, +/* 6689 */ { MAD_F(0x07b140e4) /* 0.480774774 */, 18 }, +/* 6690 */ { MAD_F(0x07b1a561) /* 0.480870611 */, 18 }, +/* 6691 */ { MAD_F(0x07b209e1) /* 0.480966452 */, 18 }, +/* 6692 */ { MAD_F(0x07b26e61) /* 0.481062298 */, 18 }, +/* 6693 */ { MAD_F(0x07b2d2e3) /* 0.481158148 */, 18 }, +/* 6694 */ { MAD_F(0x07b33766) /* 0.481254004 */, 18 }, +/* 6695 */ { MAD_F(0x07b39bea) /* 0.481349864 */, 18 }, +/* 6696 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 18 }, +/* 6697 */ { MAD_F(0x07b464f6) /* 0.481541598 */, 18 }, +/* 6698 */ { MAD_F(0x07b4c97e) /* 0.481637473 */, 18 }, +/* 6699 */ { MAD_F(0x07b52e08) /* 0.481733352 */, 18 }, +/* 6700 */ { MAD_F(0x07b59292) /* 0.481829236 */, 18 }, +/* 6701 */ { MAD_F(0x07b5f71e) /* 0.481925125 */, 18 }, +/* 6702 */ { MAD_F(0x07b65bac) /* 0.482021019 */, 18 }, +/* 6703 */ { MAD_F(0x07b6c03a) /* 0.482116917 */, 18 }, + +/* 6704 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 18 }, +/* 6705 */ { MAD_F(0x07b7895b) /* 0.482308728 */, 18 }, +/* 6706 */ { MAD_F(0x07b7eded) /* 0.482404640 */, 18 }, +/* 6707 */ { MAD_F(0x07b85281) /* 0.482500558 */, 18 }, +/* 6708 */ { MAD_F(0x07b8b716) /* 0.482596480 */, 18 }, +/* 6709 */ { MAD_F(0x07b91bac) /* 0.482692407 */, 18 }, +/* 6710 */ { MAD_F(0x07b98044) /* 0.482788339 */, 18 }, +/* 6711 */ { MAD_F(0x07b9e4dc) /* 0.482884275 */, 18 }, +/* 6712 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 18 }, +/* 6713 */ { MAD_F(0x07baae12) /* 0.483076162 */, 18 }, +/* 6714 */ { MAD_F(0x07bb12ae) /* 0.483172113 */, 18 }, +/* 6715 */ { MAD_F(0x07bb774c) /* 0.483268069 */, 18 }, +/* 6716 */ { MAD_F(0x07bbdbeb) /* 0.483364029 */, 18 }, +/* 6717 */ { MAD_F(0x07bc408c) /* 0.483459994 */, 18 }, +/* 6718 */ { MAD_F(0x07bca52d) /* 0.483555964 */, 18 }, +/* 6719 */ { MAD_F(0x07bd09d0) /* 0.483651939 */, 18 }, + +/* 6720 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 18 }, +/* 6721 */ { MAD_F(0x07bdd31a) /* 0.483843902 */, 18 }, +/* 6722 */ { MAD_F(0x07be37c1) /* 0.483939891 */, 18 }, +/* 6723 */ { MAD_F(0x07be9c69) /* 0.484035885 */, 18 }, +/* 6724 */ { MAD_F(0x07bf0113) /* 0.484131883 */, 18 }, +/* 6725 */ { MAD_F(0x07bf65bd) /* 0.484227886 */, 18 }, +/* 6726 */ { MAD_F(0x07bfca69) /* 0.484323894 */, 18 }, +/* 6727 */ { MAD_F(0x07c02f16) /* 0.484419907 */, 18 }, +/* 6728 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 18 }, +/* 6729 */ { MAD_F(0x07c0f875) /* 0.484611946 */, 18 }, +/* 6730 */ { MAD_F(0x07c15d26) /* 0.484707973 */, 18 }, +/* 6731 */ { MAD_F(0x07c1c1d8) /* 0.484804005 */, 18 }, +/* 6732 */ { MAD_F(0x07c2268b) /* 0.484900041 */, 18 }, +/* 6733 */ { MAD_F(0x07c28b40) /* 0.484996083 */, 18 }, +/* 6734 */ { MAD_F(0x07c2eff6) /* 0.485092128 */, 18 }, +/* 6735 */ { MAD_F(0x07c354ae) /* 0.485188179 */, 18 }, + +/* 6736 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 18 }, +/* 6737 */ { MAD_F(0x07c41e21) /* 0.485380295 */, 18 }, +/* 6738 */ { MAD_F(0x07c482dc) /* 0.485476360 */, 18 }, +/* 6739 */ { MAD_F(0x07c4e798) /* 0.485572430 */, 18 }, +/* 6740 */ { MAD_F(0x07c54c56) /* 0.485668504 */, 18 }, +/* 6741 */ { MAD_F(0x07c5b115) /* 0.485764583 */, 18 }, +/* 6742 */ { MAD_F(0x07c615d6) /* 0.485860667 */, 18 }, +/* 6743 */ { MAD_F(0x07c67a97) /* 0.485956756 */, 18 }, +/* 6744 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 18 }, +/* 6745 */ { MAD_F(0x07c7441e) /* 0.486148948 */, 18 }, +/* 6746 */ { MAD_F(0x07c7a8e4) /* 0.486245051 */, 18 }, +/* 6747 */ { MAD_F(0x07c80daa) /* 0.486341158 */, 18 }, +/* 6748 */ { MAD_F(0x07c87272) /* 0.486437271 */, 18 }, +/* 6749 */ { MAD_F(0x07c8d73c) /* 0.486533388 */, 18 }, +/* 6750 */ { MAD_F(0x07c93c06) /* 0.486629510 */, 18 }, +/* 6751 */ { MAD_F(0x07c9a0d2) /* 0.486725637 */, 18 }, + +/* 6752 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 18 }, +/* 6753 */ { MAD_F(0x07ca6a6d) /* 0.486917905 */, 18 }, +/* 6754 */ { MAD_F(0x07cacf3d) /* 0.487014045 */, 18 }, +/* 6755 */ { MAD_F(0x07cb340e) /* 0.487110191 */, 18 }, +/* 6756 */ { MAD_F(0x07cb98e0) /* 0.487206342 */, 18 }, +/* 6757 */ { MAD_F(0x07cbfdb4) /* 0.487302497 */, 18 }, +/* 6758 */ { MAD_F(0x07cc6288) /* 0.487398657 */, 18 }, +/* 6759 */ { MAD_F(0x07ccc75e) /* 0.487494821 */, 18 }, +/* 6760 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 18 }, +/* 6761 */ { MAD_F(0x07cd910e) /* 0.487687165 */, 18 }, +/* 6762 */ { MAD_F(0x07cdf5e8) /* 0.487783344 */, 18 }, +/* 6763 */ { MAD_F(0x07ce5ac3) /* 0.487879528 */, 18 }, +/* 6764 */ { MAD_F(0x07cebfa0) /* 0.487975716 */, 18 }, +/* 6765 */ { MAD_F(0x07cf247d) /* 0.488071909 */, 18 }, +/* 6766 */ { MAD_F(0x07cf895c) /* 0.488168107 */, 18 }, +/* 6767 */ { MAD_F(0x07cfee3c) /* 0.488264310 */, 18 }, + +/* 6768 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 18 }, +/* 6769 */ { MAD_F(0x07d0b801) /* 0.488456729 */, 18 }, +/* 6770 */ { MAD_F(0x07d11ce5) /* 0.488552946 */, 18 }, +/* 6771 */ { MAD_F(0x07d181ca) /* 0.488649167 */, 18 }, +/* 6772 */ { MAD_F(0x07d1e6b0) /* 0.488745394 */, 18 }, +/* 6773 */ { MAD_F(0x07d24b98) /* 0.488841625 */, 18 }, +/* 6774 */ { MAD_F(0x07d2b081) /* 0.488937860 */, 18 }, +/* 6775 */ { MAD_F(0x07d3156c) /* 0.489034101 */, 18 }, +/* 6776 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 18 }, +/* 6777 */ { MAD_F(0x07d3df44) /* 0.489226596 */, 18 }, +/* 6778 */ { MAD_F(0x07d44432) /* 0.489322851 */, 18 }, +/* 6779 */ { MAD_F(0x07d4a922) /* 0.489419110 */, 18 }, +/* 6780 */ { MAD_F(0x07d50e13) /* 0.489515375 */, 18 }, +/* 6781 */ { MAD_F(0x07d57305) /* 0.489611643 */, 18 }, +/* 6782 */ { MAD_F(0x07d5d7f8) /* 0.489707917 */, 18 }, +/* 6783 */ { MAD_F(0x07d63cec) /* 0.489804195 */, 18 }, + +/* 6784 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 18 }, +/* 6785 */ { MAD_F(0x07d706d9) /* 0.489996766 */, 18 }, +/* 6786 */ { MAD_F(0x07d76bd2) /* 0.490093059 */, 18 }, +/* 6787 */ { MAD_F(0x07d7d0cb) /* 0.490189356 */, 18 }, +/* 6788 */ { MAD_F(0x07d835c6) /* 0.490285658 */, 18 }, +/* 6789 */ { MAD_F(0x07d89ac2) /* 0.490381965 */, 18 }, +/* 6790 */ { MAD_F(0x07d8ffc0) /* 0.490478277 */, 18 }, +/* 6791 */ { MAD_F(0x07d964be) /* 0.490574593 */, 18 }, +/* 6792 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 18 }, +/* 6793 */ { MAD_F(0x07da2ebf) /* 0.490767239 */, 18 }, +/* 6794 */ { MAD_F(0x07da93c2) /* 0.490863570 */, 18 }, +/* 6795 */ { MAD_F(0x07daf8c6) /* 0.490959905 */, 18 }, +/* 6796 */ { MAD_F(0x07db5dcb) /* 0.491056245 */, 18 }, +/* 6797 */ { MAD_F(0x07dbc2d1) /* 0.491152589 */, 18 }, +/* 6798 */ { MAD_F(0x07dc27d9) /* 0.491248939 */, 18 }, +/* 6799 */ { MAD_F(0x07dc8ce1) /* 0.491345293 */, 18 }, + +/* 6800 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 18 }, +/* 6801 */ { MAD_F(0x07dd56f7) /* 0.491538015 */, 18 }, +/* 6802 */ { MAD_F(0x07ddbc04) /* 0.491634383 */, 18 }, +/* 6803 */ { MAD_F(0x07de2111) /* 0.491730756 */, 18 }, +/* 6804 */ { MAD_F(0x07de8621) /* 0.491827134 */, 18 }, +/* 6805 */ { MAD_F(0x07deeb31) /* 0.491923516 */, 18 }, +/* 6806 */ { MAD_F(0x07df5043) /* 0.492019903 */, 18 }, +/* 6807 */ { MAD_F(0x07dfb556) /* 0.492116295 */, 18 }, +/* 6808 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 18 }, +/* 6809 */ { MAD_F(0x07e07f80) /* 0.492309093 */, 18 }, +/* 6810 */ { MAD_F(0x07e0e496) /* 0.492405499 */, 18 }, +/* 6811 */ { MAD_F(0x07e149ae) /* 0.492501909 */, 18 }, +/* 6812 */ { MAD_F(0x07e1aec8) /* 0.492598325 */, 18 }, +/* 6813 */ { MAD_F(0x07e213e2) /* 0.492694745 */, 18 }, +/* 6814 */ { MAD_F(0x07e278fe) /* 0.492791170 */, 18 }, +/* 6815 */ { MAD_F(0x07e2de1b) /* 0.492887599 */, 18 }, + +/* 6816 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 18 }, +/* 6817 */ { MAD_F(0x07e3a859) /* 0.493080472 */, 18 }, +/* 6818 */ { MAD_F(0x07e40d7a) /* 0.493176916 */, 18 }, +/* 6819 */ { MAD_F(0x07e4729c) /* 0.493273365 */, 18 }, +/* 6820 */ { MAD_F(0x07e4d7c0) /* 0.493369818 */, 18 }, +/* 6821 */ { MAD_F(0x07e53ce4) /* 0.493466275 */, 18 }, +/* 6822 */ { MAD_F(0x07e5a20a) /* 0.493562738 */, 18 }, +/* 6823 */ { MAD_F(0x07e60732) /* 0.493659205 */, 18 }, +/* 6824 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 18 }, +/* 6825 */ { MAD_F(0x07e6d184) /* 0.493852154 */, 18 }, +/* 6826 */ { MAD_F(0x07e736af) /* 0.493948635 */, 18 }, +/* 6827 */ { MAD_F(0x07e79bdb) /* 0.494045122 */, 18 }, +/* 6828 */ { MAD_F(0x07e80109) /* 0.494141612 */, 18 }, +/* 6829 */ { MAD_F(0x07e86638) /* 0.494238108 */, 18 }, +/* 6830 */ { MAD_F(0x07e8cb68) /* 0.494334608 */, 18 }, +/* 6831 */ { MAD_F(0x07e93099) /* 0.494431113 */, 18 }, + +/* 6832 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 18 }, +/* 6833 */ { MAD_F(0x07e9fb00) /* 0.494624137 */, 18 }, +/* 6834 */ { MAD_F(0x07ea6035) /* 0.494720656 */, 18 }, +/* 6835 */ { MAD_F(0x07eac56b) /* 0.494817180 */, 18 }, +/* 6836 */ { MAD_F(0x07eb2aa3) /* 0.494913709 */, 18 }, +/* 6837 */ { MAD_F(0x07eb8fdc) /* 0.495010242 */, 18 }, +/* 6838 */ { MAD_F(0x07ebf516) /* 0.495106780 */, 18 }, +/* 6839 */ { MAD_F(0x07ec5a51) /* 0.495203322 */, 18 }, +/* 6840 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 18 }, +/* 6841 */ { MAD_F(0x07ed24cc) /* 0.495396422 */, 18 }, +/* 6842 */ { MAD_F(0x07ed8a0b) /* 0.495492978 */, 18 }, +/* 6843 */ { MAD_F(0x07edef4c) /* 0.495589540 */, 18 }, +/* 6844 */ { MAD_F(0x07ee548e) /* 0.495686106 */, 18 }, +/* 6845 */ { MAD_F(0x07eeb9d1) /* 0.495782677 */, 18 }, +/* 6846 */ { MAD_F(0x07ef1f15) /* 0.495879252 */, 18 }, +/* 6847 */ { MAD_F(0x07ef845b) /* 0.495975833 */, 18 }, + +/* 6848 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 18 }, +/* 6849 */ { MAD_F(0x07f04ee9) /* 0.496169007 */, 18 }, +/* 6850 */ { MAD_F(0x07f0b433) /* 0.496265602 */, 18 }, +/* 6851 */ { MAD_F(0x07f1197d) /* 0.496362201 */, 18 }, +/* 6852 */ { MAD_F(0x07f17ec9) /* 0.496458804 */, 18 }, +/* 6853 */ { MAD_F(0x07f1e416) /* 0.496555413 */, 18 }, +/* 6854 */ { MAD_F(0x07f24965) /* 0.496652026 */, 18 }, +/* 6855 */ { MAD_F(0x07f2aeb5) /* 0.496748644 */, 18 }, +/* 6856 */ { MAD_F(0x07f31405) /* 0.496845266 */, 18 }, +/* 6857 */ { MAD_F(0x07f37958) /* 0.496941894 */, 18 }, +/* 6858 */ { MAD_F(0x07f3deab) /* 0.497038526 */, 18 }, +/* 6859 */ { MAD_F(0x07f44400) /* 0.497135162 */, 18 }, +/* 6860 */ { MAD_F(0x07f4a956) /* 0.497231804 */, 18 }, +/* 6861 */ { MAD_F(0x07f50ead) /* 0.497328450 */, 18 }, +/* 6862 */ { MAD_F(0x07f57405) /* 0.497425100 */, 18 }, +/* 6863 */ { MAD_F(0x07f5d95f) /* 0.497521756 */, 18 }, + +/* 6864 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 18 }, +/* 6865 */ { MAD_F(0x07f6a416) /* 0.497715081 */, 18 }, +/* 6866 */ { MAD_F(0x07f70974) /* 0.497811750 */, 18 }, +/* 6867 */ { MAD_F(0x07f76ed3) /* 0.497908425 */, 18 }, +/* 6868 */ { MAD_F(0x07f7d433) /* 0.498005103 */, 18 }, +/* 6869 */ { MAD_F(0x07f83994) /* 0.498101787 */, 18 }, +/* 6870 */ { MAD_F(0x07f89ef7) /* 0.498198475 */, 18 }, +/* 6871 */ { MAD_F(0x07f9045a) /* 0.498295168 */, 18 }, +/* 6872 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 18 }, +/* 6873 */ { MAD_F(0x07f9cf26) /* 0.498488568 */, 18 }, +/* 6874 */ { MAD_F(0x07fa348e) /* 0.498585275 */, 18 }, +/* 6875 */ { MAD_F(0x07fa99f6) /* 0.498681987 */, 18 }, +/* 6876 */ { MAD_F(0x07faff60) /* 0.498778704 */, 18 }, +/* 6877 */ { MAD_F(0x07fb64cc) /* 0.498875425 */, 18 }, +/* 6878 */ { MAD_F(0x07fbca38) /* 0.498972150 */, 18 }, +/* 6879 */ { MAD_F(0x07fc2fa6) /* 0.499068881 */, 18 }, + +/* 6880 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 18 }, +/* 6881 */ { MAD_F(0x07fcfa86) /* 0.499262356 */, 18 }, +/* 6882 */ { MAD_F(0x07fd5ff8) /* 0.499359101 */, 18 }, +/* 6883 */ { MAD_F(0x07fdc56b) /* 0.499455850 */, 18 }, +/* 6884 */ { MAD_F(0x07fe2adf) /* 0.499552604 */, 18 }, +/* 6885 */ { MAD_F(0x07fe9054) /* 0.499649362 */, 18 }, +/* 6886 */ { MAD_F(0x07fef5cb) /* 0.499746126 */, 18 }, +/* 6887 */ { MAD_F(0x07ff5b43) /* 0.499842894 */, 18 }, +/* 6888 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 18 }, +/* 6889 */ { MAD_F(0x0400131b) /* 0.250018222 */, 19 }, +/* 6890 */ { MAD_F(0x040045d9) /* 0.250066613 */, 19 }, +/* 6891 */ { MAD_F(0x04007897) /* 0.250115006 */, 19 }, +/* 6892 */ { MAD_F(0x0400ab57) /* 0.250163402 */, 19 }, +/* 6893 */ { MAD_F(0x0400de16) /* 0.250211800 */, 19 }, +/* 6894 */ { MAD_F(0x040110d7) /* 0.250260200 */, 19 }, +/* 6895 */ { MAD_F(0x04014398) /* 0.250308603 */, 19 }, + +/* 6896 */ { MAD_F(0x04017659) /* 0.250357008 */, 19 }, +/* 6897 */ { MAD_F(0x0401a91c) /* 0.250405415 */, 19 }, +/* 6898 */ { MAD_F(0x0401dbdf) /* 0.250453825 */, 19 }, +/* 6899 */ { MAD_F(0x04020ea2) /* 0.250502237 */, 19 }, +/* 6900 */ { MAD_F(0x04024166) /* 0.250550652 */, 19 }, +/* 6901 */ { MAD_F(0x0402742b) /* 0.250599068 */, 19 }, +/* 6902 */ { MAD_F(0x0402a6f0) /* 0.250647488 */, 19 }, +/* 6903 */ { MAD_F(0x0402d9b6) /* 0.250695909 */, 19 }, +/* 6904 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 19 }, +/* 6905 */ { MAD_F(0x04033f44) /* 0.250792759 */, 19 }, +/* 6906 */ { MAD_F(0x0403720c) /* 0.250841187 */, 19 }, +/* 6907 */ { MAD_F(0x0403a4d5) /* 0.250889618 */, 19 }, +/* 6908 */ { MAD_F(0x0403d79e) /* 0.250938051 */, 19 }, +/* 6909 */ { MAD_F(0x04040a68) /* 0.250986487 */, 19 }, +/* 6910 */ { MAD_F(0x04043d32) /* 0.251034924 */, 19 }, +/* 6911 */ { MAD_F(0x04046ffd) /* 0.251083365 */, 19 }, + +/* 6912 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 19 }, +/* 6913 */ { MAD_F(0x0404d595) /* 0.251180252 */, 19 }, +/* 6914 */ { MAD_F(0x04050862) /* 0.251228699 */, 19 }, +/* 6915 */ { MAD_F(0x04053b30) /* 0.251277148 */, 19 }, +/* 6916 */ { MAD_F(0x04056dfe) /* 0.251325600 */, 19 }, +/* 6917 */ { MAD_F(0x0405a0cd) /* 0.251374054 */, 19 }, +/* 6918 */ { MAD_F(0x0405d39c) /* 0.251422511 */, 19 }, +/* 6919 */ { MAD_F(0x0406066c) /* 0.251470970 */, 19 }, +/* 6920 */ { MAD_F(0x0406393d) /* 0.251519431 */, 19 }, +/* 6921 */ { MAD_F(0x04066c0e) /* 0.251567894 */, 19 }, +/* 6922 */ { MAD_F(0x04069ee0) /* 0.251616360 */, 19 }, +/* 6923 */ { MAD_F(0x0406d1b3) /* 0.251664828 */, 19 }, +/* 6924 */ { MAD_F(0x04070486) /* 0.251713299 */, 19 }, +/* 6925 */ { MAD_F(0x0407375a) /* 0.251761772 */, 19 }, +/* 6926 */ { MAD_F(0x04076a2e) /* 0.251810247 */, 19 }, +/* 6927 */ { MAD_F(0x04079d03) /* 0.251858724 */, 19 }, + +/* 6928 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 19 }, +/* 6929 */ { MAD_F(0x040802af) /* 0.251955686 */, 19 }, +/* 6930 */ { MAD_F(0x04083586) /* 0.252004171 */, 19 }, +/* 6931 */ { MAD_F(0x0408685e) /* 0.252052658 */, 19 }, +/* 6932 */ { MAD_F(0x04089b36) /* 0.252101147 */, 19 }, +/* 6933 */ { MAD_F(0x0408ce0f) /* 0.252149638 */, 19 }, +/* 6934 */ { MAD_F(0x040900e8) /* 0.252198132 */, 19 }, +/* 6935 */ { MAD_F(0x040933c2) /* 0.252246628 */, 19 }, +/* 6936 */ { MAD_F(0x0409669d) /* 0.252295127 */, 19 }, +/* 6937 */ { MAD_F(0x04099978) /* 0.252343627 */, 19 }, +/* 6938 */ { MAD_F(0x0409cc54) /* 0.252392131 */, 19 }, +/* 6939 */ { MAD_F(0x0409ff31) /* 0.252440636 */, 19 }, +/* 6940 */ { MAD_F(0x040a320e) /* 0.252489144 */, 19 }, +/* 6941 */ { MAD_F(0x040a64ec) /* 0.252537654 */, 19 }, +/* 6942 */ { MAD_F(0x040a97cb) /* 0.252586166 */, 19 }, +/* 6943 */ { MAD_F(0x040acaaa) /* 0.252634681 */, 19 }, + +/* 6944 */ { MAD_F(0x040afd89) /* 0.252683198 */, 19 }, +/* 6945 */ { MAD_F(0x040b306a) /* 0.252731718 */, 19 }, +/* 6946 */ { MAD_F(0x040b634b) /* 0.252780240 */, 19 }, +/* 6947 */ { MAD_F(0x040b962c) /* 0.252828764 */, 19 }, +/* 6948 */ { MAD_F(0x040bc90e) /* 0.252877290 */, 19 }, +/* 6949 */ { MAD_F(0x040bfbf1) /* 0.252925819 */, 19 }, +/* 6950 */ { MAD_F(0x040c2ed5) /* 0.252974350 */, 19 }, +/* 6951 */ { MAD_F(0x040c61b9) /* 0.253022883 */, 19 }, +/* 6952 */ { MAD_F(0x040c949e) /* 0.253071419 */, 19 }, +/* 6953 */ { MAD_F(0x040cc783) /* 0.253119957 */, 19 }, +/* 6954 */ { MAD_F(0x040cfa69) /* 0.253168498 */, 19 }, +/* 6955 */ { MAD_F(0x040d2d4f) /* 0.253217040 */, 19 }, +/* 6956 */ { MAD_F(0x040d6037) /* 0.253265585 */, 19 }, +/* 6957 */ { MAD_F(0x040d931e) /* 0.253314133 */, 19 }, +/* 6958 */ { MAD_F(0x040dc607) /* 0.253362682 */, 19 }, +/* 6959 */ { MAD_F(0x040df8f0) /* 0.253411234 */, 19 }, + +/* 6960 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 19 }, +/* 6961 */ { MAD_F(0x040e5ec4) /* 0.253508345 */, 19 }, +/* 6962 */ { MAD_F(0x040e91af) /* 0.253556904 */, 19 }, +/* 6963 */ { MAD_F(0x040ec49b) /* 0.253605466 */, 19 }, +/* 6964 */ { MAD_F(0x040ef787) /* 0.253654029 */, 19 }, +/* 6965 */ { MAD_F(0x040f2a74) /* 0.253702595 */, 19 }, +/* 6966 */ { MAD_F(0x040f5d61) /* 0.253751164 */, 19 }, +/* 6967 */ { MAD_F(0x040f904f) /* 0.253799734 */, 19 }, +/* 6968 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 19 }, +/* 6969 */ { MAD_F(0x040ff62d) /* 0.253896883 */, 19 }, +/* 6970 */ { MAD_F(0x0410291d) /* 0.253945460 */, 19 }, +/* 6971 */ { MAD_F(0x04105c0e) /* 0.253994040 */, 19 }, +/* 6972 */ { MAD_F(0x04108eff) /* 0.254042622 */, 19 }, +/* 6973 */ { MAD_F(0x0410c1f1) /* 0.254091207 */, 19 }, +/* 6974 */ { MAD_F(0x0410f4e3) /* 0.254139794 */, 19 }, +/* 6975 */ { MAD_F(0x041127d6) /* 0.254188383 */, 19 }, + +/* 6976 */ { MAD_F(0x04115aca) /* 0.254236974 */, 19 }, +/* 6977 */ { MAD_F(0x04118dbe) /* 0.254285568 */, 19 }, +/* 6978 */ { MAD_F(0x0411c0b3) /* 0.254334165 */, 19 }, +/* 6979 */ { MAD_F(0x0411f3a9) /* 0.254382763 */, 19 }, +/* 6980 */ { MAD_F(0x0412269f) /* 0.254431364 */, 19 }, +/* 6981 */ { MAD_F(0x04125996) /* 0.254479967 */, 19 }, +/* 6982 */ { MAD_F(0x04128c8d) /* 0.254528572 */, 19 }, +/* 6983 */ { MAD_F(0x0412bf85) /* 0.254577180 */, 19 }, +/* 6984 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 19 }, +/* 6985 */ { MAD_F(0x04132577) /* 0.254674403 */, 19 }, +/* 6986 */ { MAD_F(0x04135871) /* 0.254723017 */, 19 }, +/* 6987 */ { MAD_F(0x04138b6c) /* 0.254771635 */, 19 }, +/* 6988 */ { MAD_F(0x0413be67) /* 0.254820254 */, 19 }, +/* 6989 */ { MAD_F(0x0413f163) /* 0.254868876 */, 19 }, +/* 6990 */ { MAD_F(0x0414245f) /* 0.254917500 */, 19 }, +/* 6991 */ { MAD_F(0x0414575c) /* 0.254966126 */, 19 }, + +/* 6992 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 19 }, +/* 6993 */ { MAD_F(0x0414bd58) /* 0.255063386 */, 19 }, +/* 6994 */ { MAD_F(0x0414f057) /* 0.255112019 */, 19 }, +/* 6995 */ { MAD_F(0x04152356) /* 0.255160655 */, 19 }, +/* 6996 */ { MAD_F(0x04155657) /* 0.255209292 */, 19 }, +/* 6997 */ { MAD_F(0x04158957) /* 0.255257933 */, 19 }, +/* 6998 */ { MAD_F(0x0415bc59) /* 0.255306575 */, 19 }, +/* 6999 */ { MAD_F(0x0415ef5b) /* 0.255355220 */, 19 }, +/* 7000 */ { MAD_F(0x0416225d) /* 0.255403867 */, 19 }, +/* 7001 */ { MAD_F(0x04165561) /* 0.255452517 */, 19 }, +/* 7002 */ { MAD_F(0x04168864) /* 0.255501169 */, 19 }, +/* 7003 */ { MAD_F(0x0416bb69) /* 0.255549823 */, 19 }, +/* 7004 */ { MAD_F(0x0416ee6e) /* 0.255598479 */, 19 }, +/* 7005 */ { MAD_F(0x04172174) /* 0.255647138 */, 19 }, +/* 7006 */ { MAD_F(0x0417547a) /* 0.255695799 */, 19 }, +/* 7007 */ { MAD_F(0x04178781) /* 0.255744463 */, 19 }, + +/* 7008 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 19 }, +/* 7009 */ { MAD_F(0x0417ed91) /* 0.255841796 */, 19 }, +/* 7010 */ { MAD_F(0x0418209a) /* 0.255890467 */, 19 }, +/* 7011 */ { MAD_F(0x041853a3) /* 0.255939139 */, 19 }, +/* 7012 */ { MAD_F(0x041886ad) /* 0.255987814 */, 19 }, +/* 7013 */ { MAD_F(0x0418b9b8) /* 0.256036492 */, 19 }, +/* 7014 */ { MAD_F(0x0418ecc3) /* 0.256085171 */, 19 }, +/* 7015 */ { MAD_F(0x04191fcf) /* 0.256133853 */, 19 }, +/* 7016 */ { MAD_F(0x041952dc) /* 0.256182537 */, 19 }, +/* 7017 */ { MAD_F(0x041985e9) /* 0.256231224 */, 19 }, +/* 7018 */ { MAD_F(0x0419b8f7) /* 0.256279913 */, 19 }, +/* 7019 */ { MAD_F(0x0419ec05) /* 0.256328604 */, 19 }, +/* 7020 */ { MAD_F(0x041a1f15) /* 0.256377297 */, 19 }, +/* 7021 */ { MAD_F(0x041a5224) /* 0.256425993 */, 19 }, +/* 7022 */ { MAD_F(0x041a8534) /* 0.256474691 */, 19 }, +/* 7023 */ { MAD_F(0x041ab845) /* 0.256523392 */, 19 }, + +/* 7024 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 19 }, +/* 7025 */ { MAD_F(0x041b1e69) /* 0.256620800 */, 19 }, +/* 7026 */ { MAD_F(0x041b517c) /* 0.256669507 */, 19 }, +/* 7027 */ { MAD_F(0x041b848f) /* 0.256718217 */, 19 }, +/* 7028 */ { MAD_F(0x041bb7a3) /* 0.256766929 */, 19 }, +/* 7029 */ { MAD_F(0x041beab8) /* 0.256815643 */, 19 }, +/* 7030 */ { MAD_F(0x041c1dcd) /* 0.256864359 */, 19 }, +/* 7031 */ { MAD_F(0x041c50e3) /* 0.256913078 */, 19 }, +/* 7032 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 19 }, +/* 7033 */ { MAD_F(0x041cb711) /* 0.257010523 */, 19 }, +/* 7034 */ { MAD_F(0x041cea28) /* 0.257059249 */, 19 }, +/* 7035 */ { MAD_F(0x041d1d41) /* 0.257107977 */, 19 }, +/* 7036 */ { MAD_F(0x041d505a) /* 0.257156708 */, 19 }, +/* 7037 */ { MAD_F(0x041d8373) /* 0.257205440 */, 19 }, +/* 7038 */ { MAD_F(0x041db68e) /* 0.257254175 */, 19 }, +/* 7039 */ { MAD_F(0x041de9a8) /* 0.257302913 */, 19 }, + +/* 7040 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 19 }, +/* 7041 */ { MAD_F(0x041e4fe0) /* 0.257400394 */, 19 }, +/* 7042 */ { MAD_F(0x041e82fd) /* 0.257449139 */, 19 }, +/* 7043 */ { MAD_F(0x041eb61a) /* 0.257497885 */, 19 }, +/* 7044 */ { MAD_F(0x041ee938) /* 0.257546634 */, 19 }, +/* 7045 */ { MAD_F(0x041f1c57) /* 0.257595386 */, 19 }, +/* 7046 */ { MAD_F(0x041f4f76) /* 0.257644139 */, 19 }, +/* 7047 */ { MAD_F(0x041f8296) /* 0.257692895 */, 19 }, +/* 7048 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 19 }, +/* 7049 */ { MAD_F(0x041fe8d7) /* 0.257790414 */, 19 }, +/* 7050 */ { MAD_F(0x04201bf9) /* 0.257839176 */, 19 }, +/* 7051 */ { MAD_F(0x04204f1b) /* 0.257887941 */, 19 }, +/* 7052 */ { MAD_F(0x0420823e) /* 0.257936709 */, 19 }, +/* 7053 */ { MAD_F(0x0420b561) /* 0.257985478 */, 19 }, +/* 7054 */ { MAD_F(0x0420e885) /* 0.258034250 */, 19 }, +/* 7055 */ { MAD_F(0x04211baa) /* 0.258083025 */, 19 }, + +/* 7056 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 19 }, +/* 7057 */ { MAD_F(0x042181f6) /* 0.258180580 */, 19 }, +/* 7058 */ { MAD_F(0x0421b51c) /* 0.258229361 */, 19 }, +/* 7059 */ { MAD_F(0x0421e843) /* 0.258278145 */, 19 }, +/* 7060 */ { MAD_F(0x04221b6b) /* 0.258326931 */, 19 }, +/* 7061 */ { MAD_F(0x04224e94) /* 0.258375719 */, 19 }, +/* 7062 */ { MAD_F(0x042281bd) /* 0.258424509 */, 19 }, +/* 7063 */ { MAD_F(0x0422b4e6) /* 0.258473302 */, 19 }, +/* 7064 */ { MAD_F(0x0422e811) /* 0.258522097 */, 19 }, +/* 7065 */ { MAD_F(0x04231b3c) /* 0.258570894 */, 19 }, +/* 7066 */ { MAD_F(0x04234e67) /* 0.258619694 */, 19 }, +/* 7067 */ { MAD_F(0x04238193) /* 0.258668496 */, 19 }, +/* 7068 */ { MAD_F(0x0423b4c0) /* 0.258717300 */, 19 }, +/* 7069 */ { MAD_F(0x0423e7ee) /* 0.258766106 */, 19 }, +/* 7070 */ { MAD_F(0x04241b1c) /* 0.258814915 */, 19 }, +/* 7071 */ { MAD_F(0x04244e4a) /* 0.258863726 */, 19 }, + +/* 7072 */ { MAD_F(0x04248179) /* 0.258912540 */, 19 }, +/* 7073 */ { MAD_F(0x0424b4a9) /* 0.258961356 */, 19 }, +/* 7074 */ { MAD_F(0x0424e7da) /* 0.259010174 */, 19 }, +/* 7075 */ { MAD_F(0x04251b0b) /* 0.259058994 */, 19 }, +/* 7076 */ { MAD_F(0x04254e3d) /* 0.259107817 */, 19 }, +/* 7077 */ { MAD_F(0x0425816f) /* 0.259156642 */, 19 }, +/* 7078 */ { MAD_F(0x0425b4a2) /* 0.259205469 */, 19 }, +/* 7079 */ { MAD_F(0x0425e7d6) /* 0.259254298 */, 19 }, +/* 7080 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 19 }, +/* 7081 */ { MAD_F(0x04264e3f) /* 0.259351964 */, 19 }, +/* 7082 */ { MAD_F(0x04268174) /* 0.259400801 */, 19 }, +/* 7083 */ { MAD_F(0x0426b4aa) /* 0.259449639 */, 19 }, +/* 7084 */ { MAD_F(0x0426e7e1) /* 0.259498480 */, 19 }, +/* 7085 */ { MAD_F(0x04271b18) /* 0.259547324 */, 19 }, +/* 7086 */ { MAD_F(0x04274e50) /* 0.259596169 */, 19 }, +/* 7087 */ { MAD_F(0x04278188) /* 0.259645017 */, 19 }, + +/* 7088 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 19 }, +/* 7089 */ { MAD_F(0x0427e7fb) /* 0.259742720 */, 19 }, +/* 7090 */ { MAD_F(0x04281b36) /* 0.259791575 */, 19 }, +/* 7091 */ { MAD_F(0x04284e71) /* 0.259840432 */, 19 }, +/* 7092 */ { MAD_F(0x042881ac) /* 0.259889291 */, 19 }, +/* 7093 */ { MAD_F(0x0428b4e8) /* 0.259938153 */, 19 }, +/* 7094 */ { MAD_F(0x0428e825) /* 0.259987017 */, 19 }, +/* 7095 */ { MAD_F(0x04291b63) /* 0.260035883 */, 19 }, +/* 7096 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 19 }, +/* 7097 */ { MAD_F(0x042981df) /* 0.260133623 */, 19 }, +/* 7098 */ { MAD_F(0x0429b51f) /* 0.260182496 */, 19 }, +/* 7099 */ { MAD_F(0x0429e85f) /* 0.260231372 */, 19 }, +/* 7100 */ { MAD_F(0x042a1b9f) /* 0.260280249 */, 19 }, +/* 7101 */ { MAD_F(0x042a4ee0) /* 0.260329129 */, 19 }, +/* 7102 */ { MAD_F(0x042a8222) /* 0.260378012 */, 19 }, +/* 7103 */ { MAD_F(0x042ab564) /* 0.260426896 */, 19 }, + +/* 7104 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 19 }, +/* 7105 */ { MAD_F(0x042b1beb) /* 0.260524673 */, 19 }, +/* 7106 */ { MAD_F(0x042b4f2f) /* 0.260573564 */, 19 }, +/* 7107 */ { MAD_F(0x042b8274) /* 0.260622458 */, 19 }, +/* 7108 */ { MAD_F(0x042bb5ba) /* 0.260671354 */, 19 }, +/* 7109 */ { MAD_F(0x042be900) /* 0.260720252 */, 19 }, +/* 7110 */ { MAD_F(0x042c1c46) /* 0.260769153 */, 19 }, +/* 7111 */ { MAD_F(0x042c4f8e) /* 0.260818056 */, 19 }, +/* 7112 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 19 }, +/* 7113 */ { MAD_F(0x042cb61e) /* 0.260915869 */, 19 }, +/* 7114 */ { MAD_F(0x042ce967) /* 0.260964779 */, 19 }, +/* 7115 */ { MAD_F(0x042d1cb1) /* 0.261013691 */, 19 }, +/* 7116 */ { MAD_F(0x042d4ffb) /* 0.261062606 */, 19 }, +/* 7117 */ { MAD_F(0x042d8346) /* 0.261111522 */, 19 }, +/* 7118 */ { MAD_F(0x042db692) /* 0.261160441 */, 19 }, +/* 7119 */ { MAD_F(0x042de9de) /* 0.261209363 */, 19 }, + +/* 7120 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 19 }, +/* 7121 */ { MAD_F(0x042e5078) /* 0.261307212 */, 19 }, +/* 7122 */ { MAD_F(0x042e83c6) /* 0.261356140 */, 19 }, +/* 7123 */ { MAD_F(0x042eb715) /* 0.261405071 */, 19 }, +/* 7124 */ { MAD_F(0x042eea64) /* 0.261454004 */, 19 }, +/* 7125 */ { MAD_F(0x042f1db4) /* 0.261502939 */, 19 }, +/* 7126 */ { MAD_F(0x042f5105) /* 0.261551876 */, 19 }, +/* 7127 */ { MAD_F(0x042f8456) /* 0.261600816 */, 19 }, +/* 7128 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 19 }, +/* 7129 */ { MAD_F(0x042feafa) /* 0.261698702 */, 19 }, +/* 7130 */ { MAD_F(0x04301e4d) /* 0.261747649 */, 19 }, +/* 7131 */ { MAD_F(0x043051a1) /* 0.261796597 */, 19 }, +/* 7132 */ { MAD_F(0x043084f5) /* 0.261845548 */, 19 }, +/* 7133 */ { MAD_F(0x0430b84a) /* 0.261894502 */, 19 }, +/* 7134 */ { MAD_F(0x0430eb9f) /* 0.261943458 */, 19 }, +/* 7135 */ { MAD_F(0x04311ef5) /* 0.261992416 */, 19 }, + +/* 7136 */ { MAD_F(0x0431524c) /* 0.262041376 */, 19 }, +/* 7137 */ { MAD_F(0x043185a3) /* 0.262090338 */, 19 }, +/* 7138 */ { MAD_F(0x0431b8fb) /* 0.262139303 */, 19 }, +/* 7139 */ { MAD_F(0x0431ec54) /* 0.262188270 */, 19 }, +/* 7140 */ { MAD_F(0x04321fad) /* 0.262237240 */, 19 }, +/* 7141 */ { MAD_F(0x04325306) /* 0.262286211 */, 19 }, +/* 7142 */ { MAD_F(0x04328661) /* 0.262335185 */, 19 }, +/* 7143 */ { MAD_F(0x0432b9bc) /* 0.262384162 */, 19 }, +/* 7144 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 19 }, +/* 7145 */ { MAD_F(0x04332074) /* 0.262482121 */, 19 }, +/* 7146 */ { MAD_F(0x043353d0) /* 0.262531104 */, 19 }, +/* 7147 */ { MAD_F(0x0433872e) /* 0.262580089 */, 19 }, +/* 7148 */ { MAD_F(0x0433ba8c) /* 0.262629077 */, 19 }, +/* 7149 */ { MAD_F(0x0433edea) /* 0.262678067 */, 19 }, +/* 7150 */ { MAD_F(0x0434214a) /* 0.262727059 */, 19 }, +/* 7151 */ { MAD_F(0x043454aa) /* 0.262776054 */, 19 }, + +/* 7152 */ { MAD_F(0x0434880a) /* 0.262825051 */, 19 }, +/* 7153 */ { MAD_F(0x0434bb6b) /* 0.262874050 */, 19 }, +/* 7154 */ { MAD_F(0x0434eecd) /* 0.262923051 */, 19 }, +/* 7155 */ { MAD_F(0x0435222f) /* 0.262972055 */, 19 }, +/* 7156 */ { MAD_F(0x04355592) /* 0.263021061 */, 19 }, +/* 7157 */ { MAD_F(0x043588f6) /* 0.263070069 */, 19 }, +/* 7158 */ { MAD_F(0x0435bc5a) /* 0.263119079 */, 19 }, +/* 7159 */ { MAD_F(0x0435efbf) /* 0.263168092 */, 19 }, +/* 7160 */ { MAD_F(0x04362324) /* 0.263217107 */, 19 }, +/* 7161 */ { MAD_F(0x0436568a) /* 0.263266125 */, 19 }, +/* 7162 */ { MAD_F(0x043689f1) /* 0.263315144 */, 19 }, +/* 7163 */ { MAD_F(0x0436bd58) /* 0.263364166 */, 19 }, +/* 7164 */ { MAD_F(0x0436f0c0) /* 0.263413191 */, 19 }, +/* 7165 */ { MAD_F(0x04372428) /* 0.263462217 */, 19 }, +/* 7166 */ { MAD_F(0x04375791) /* 0.263511246 */, 19 }, +/* 7167 */ { MAD_F(0x04378afb) /* 0.263560277 */, 19 }, + +/* 7168 */ { MAD_F(0x0437be65) /* 0.263609310 */, 19 }, +/* 7169 */ { MAD_F(0x0437f1d0) /* 0.263658346 */, 19 }, +/* 7170 */ { MAD_F(0x0438253c) /* 0.263707384 */, 19 }, +/* 7171 */ { MAD_F(0x043858a8) /* 0.263756424 */, 19 }, +/* 7172 */ { MAD_F(0x04388c14) /* 0.263805466 */, 19 }, +/* 7173 */ { MAD_F(0x0438bf82) /* 0.263854511 */, 19 }, +/* 7174 */ { MAD_F(0x0438f2f0) /* 0.263903558 */, 19 }, +/* 7175 */ { MAD_F(0x0439265e) /* 0.263952607 */, 19 }, +/* 7176 */ { MAD_F(0x043959cd) /* 0.264001659 */, 19 }, +/* 7177 */ { MAD_F(0x04398d3d) /* 0.264050713 */, 19 }, +/* 7178 */ { MAD_F(0x0439c0ae) /* 0.264099769 */, 19 }, +/* 7179 */ { MAD_F(0x0439f41f) /* 0.264148827 */, 19 }, +/* 7180 */ { MAD_F(0x043a2790) /* 0.264197888 */, 19 }, +/* 7181 */ { MAD_F(0x043a5b02) /* 0.264246951 */, 19 }, +/* 7182 */ { MAD_F(0x043a8e75) /* 0.264296016 */, 19 }, +/* 7183 */ { MAD_F(0x043ac1e9) /* 0.264345084 */, 19 }, + +/* 7184 */ { MAD_F(0x043af55d) /* 0.264394153 */, 19 }, +/* 7185 */ { MAD_F(0x043b28d2) /* 0.264443225 */, 19 }, +/* 7186 */ { MAD_F(0x043b5c47) /* 0.264492300 */, 19 }, +/* 7187 */ { MAD_F(0x043b8fbd) /* 0.264541376 */, 19 }, +/* 7188 */ { MAD_F(0x043bc333) /* 0.264590455 */, 19 }, +/* 7189 */ { MAD_F(0x043bf6aa) /* 0.264639536 */, 19 }, +/* 7190 */ { MAD_F(0x043c2a22) /* 0.264688620 */, 19 }, +/* 7191 */ { MAD_F(0x043c5d9a) /* 0.264737706 */, 19 }, +/* 7192 */ { MAD_F(0x043c9113) /* 0.264786794 */, 19 }, +/* 7193 */ { MAD_F(0x043cc48d) /* 0.264835884 */, 19 }, +/* 7194 */ { MAD_F(0x043cf807) /* 0.264884976 */, 19 }, +/* 7195 */ { MAD_F(0x043d2b82) /* 0.264934071 */, 19 }, +/* 7196 */ { MAD_F(0x043d5efd) /* 0.264983168 */, 19 }, +/* 7197 */ { MAD_F(0x043d9279) /* 0.265032268 */, 19 }, +/* 7198 */ { MAD_F(0x043dc5f6) /* 0.265081369 */, 19 }, +/* 7199 */ { MAD_F(0x043df973) /* 0.265130473 */, 19 }, + +/* 7200 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 19 }, +/* 7201 */ { MAD_F(0x043e6070) /* 0.265228688 */, 19 }, +/* 7202 */ { MAD_F(0x043e93ef) /* 0.265277799 */, 19 }, +/* 7203 */ { MAD_F(0x043ec76e) /* 0.265326912 */, 19 }, +/* 7204 */ { MAD_F(0x043efaef) /* 0.265376027 */, 19 }, +/* 7205 */ { MAD_F(0x043f2e6f) /* 0.265425145 */, 19 }, +/* 7206 */ { MAD_F(0x043f61f1) /* 0.265474264 */, 19 }, +/* 7207 */ { MAD_F(0x043f9573) /* 0.265523387 */, 19 }, +/* 7208 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 19 }, +/* 7209 */ { MAD_F(0x043ffc79) /* 0.265621638 */, 19 }, +/* 7210 */ { MAD_F(0x04402ffd) /* 0.265670766 */, 19 }, +/* 7211 */ { MAD_F(0x04406382) /* 0.265719898 */, 19 }, +/* 7212 */ { MAD_F(0x04409707) /* 0.265769031 */, 19 }, +/* 7213 */ { MAD_F(0x0440ca8d) /* 0.265818167 */, 19 }, +/* 7214 */ { MAD_F(0x0440fe13) /* 0.265867305 */, 19 }, +/* 7215 */ { MAD_F(0x0441319a) /* 0.265916445 */, 19 }, + +/* 7216 */ { MAD_F(0x04416522) /* 0.265965588 */, 19 }, +/* 7217 */ { MAD_F(0x044198aa) /* 0.266014732 */, 19 }, +/* 7218 */ { MAD_F(0x0441cc33) /* 0.266063880 */, 19 }, +/* 7219 */ { MAD_F(0x0441ffbc) /* 0.266113029 */, 19 }, +/* 7220 */ { MAD_F(0x04423346) /* 0.266162181 */, 19 }, +/* 7221 */ { MAD_F(0x044266d1) /* 0.266211334 */, 19 }, +/* 7222 */ { MAD_F(0x04429a5c) /* 0.266260491 */, 19 }, +/* 7223 */ { MAD_F(0x0442cde8) /* 0.266309649 */, 19 }, +/* 7224 */ { MAD_F(0x04430174) /* 0.266358810 */, 19 }, +/* 7225 */ { MAD_F(0x04433501) /* 0.266407973 */, 19 }, +/* 7226 */ { MAD_F(0x0443688f) /* 0.266457138 */, 19 }, +/* 7227 */ { MAD_F(0x04439c1d) /* 0.266506305 */, 19 }, +/* 7228 */ { MAD_F(0x0443cfac) /* 0.266555475 */, 19 }, +/* 7229 */ { MAD_F(0x0444033c) /* 0.266604647 */, 19 }, +/* 7230 */ { MAD_F(0x044436cc) /* 0.266653822 */, 19 }, +/* 7231 */ { MAD_F(0x04446a5d) /* 0.266702998 */, 19 }, + +/* 7232 */ { MAD_F(0x04449dee) /* 0.266752177 */, 19 }, +/* 7233 */ { MAD_F(0x0444d180) /* 0.266801358 */, 19 }, +/* 7234 */ { MAD_F(0x04450513) /* 0.266850541 */, 19 }, +/* 7235 */ { MAD_F(0x044538a6) /* 0.266899727 */, 19 }, +/* 7236 */ { MAD_F(0x04456c39) /* 0.266948915 */, 19 }, +/* 7237 */ { MAD_F(0x04459fce) /* 0.266998105 */, 19 }, +/* 7238 */ { MAD_F(0x0445d363) /* 0.267047298 */, 19 }, +/* 7239 */ { MAD_F(0x044606f8) /* 0.267096492 */, 19 }, +/* 7240 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 19 }, +/* 7241 */ { MAD_F(0x04466e25) /* 0.267194888 */, 19 }, +/* 7242 */ { MAD_F(0x0446a1bd) /* 0.267244090 */, 19 }, +/* 7243 */ { MAD_F(0x0446d555) /* 0.267293294 */, 19 }, +/* 7244 */ { MAD_F(0x044708ee) /* 0.267342500 */, 19 }, +/* 7245 */ { MAD_F(0x04473c87) /* 0.267391708 */, 19 }, +/* 7246 */ { MAD_F(0x04477021) /* 0.267440919 */, 19 }, +/* 7247 */ { MAD_F(0x0447a3bb) /* 0.267490131 */, 19 }, + +/* 7248 */ { MAD_F(0x0447d756) /* 0.267539347 */, 19 }, +/* 7249 */ { MAD_F(0x04480af2) /* 0.267588564 */, 19 }, +/* 7250 */ { MAD_F(0x04483e8e) /* 0.267637783 */, 19 }, +/* 7251 */ { MAD_F(0x0448722b) /* 0.267687005 */, 19 }, +/* 7252 */ { MAD_F(0x0448a5c9) /* 0.267736229 */, 19 }, +/* 7253 */ { MAD_F(0x0448d967) /* 0.267785456 */, 19 }, +/* 7254 */ { MAD_F(0x04490d05) /* 0.267834685 */, 19 }, +/* 7255 */ { MAD_F(0x044940a5) /* 0.267883915 */, 19 }, +/* 7256 */ { MAD_F(0x04497445) /* 0.267933149 */, 19 }, +/* 7257 */ { MAD_F(0x0449a7e5) /* 0.267982384 */, 19 }, +/* 7258 */ { MAD_F(0x0449db86) /* 0.268031622 */, 19 }, +/* 7259 */ { MAD_F(0x044a0f28) /* 0.268080862 */, 19 }, +/* 7260 */ { MAD_F(0x044a42ca) /* 0.268130104 */, 19 }, +/* 7261 */ { MAD_F(0x044a766d) /* 0.268179349 */, 19 }, +/* 7262 */ { MAD_F(0x044aaa11) /* 0.268228595 */, 19 }, +/* 7263 */ { MAD_F(0x044addb5) /* 0.268277844 */, 19 }, + +/* 7264 */ { MAD_F(0x044b115a) /* 0.268327096 */, 19 }, +/* 7265 */ { MAD_F(0x044b44ff) /* 0.268376349 */, 19 }, +/* 7266 */ { MAD_F(0x044b78a5) /* 0.268425605 */, 19 }, +/* 7267 */ { MAD_F(0x044bac4c) /* 0.268474863 */, 19 }, +/* 7268 */ { MAD_F(0x044bdff3) /* 0.268524123 */, 19 }, +/* 7269 */ { MAD_F(0x044c139b) /* 0.268573386 */, 19 }, +/* 7270 */ { MAD_F(0x044c4743) /* 0.268622651 */, 19 }, +/* 7271 */ { MAD_F(0x044c7aec) /* 0.268671918 */, 19 }, +/* 7272 */ { MAD_F(0x044cae96) /* 0.268721187 */, 19 }, +/* 7273 */ { MAD_F(0x044ce240) /* 0.268770459 */, 19 }, +/* 7274 */ { MAD_F(0x044d15eb) /* 0.268819733 */, 19 }, +/* 7275 */ { MAD_F(0x044d4997) /* 0.268869009 */, 19 }, +/* 7276 */ { MAD_F(0x044d7d43) /* 0.268918287 */, 19 }, +/* 7277 */ { MAD_F(0x044db0ef) /* 0.268967568 */, 19 }, +/* 7278 */ { MAD_F(0x044de49d) /* 0.269016851 */, 19 }, +/* 7279 */ { MAD_F(0x044e184b) /* 0.269066136 */, 19 }, + +/* 7280 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 19 }, +/* 7281 */ { MAD_F(0x044e7fa8) /* 0.269164713 */, 19 }, +/* 7282 */ { MAD_F(0x044eb358) /* 0.269214005 */, 19 }, +/* 7283 */ { MAD_F(0x044ee708) /* 0.269263299 */, 19 }, +/* 7284 */ { MAD_F(0x044f1ab9) /* 0.269312595 */, 19 }, +/* 7285 */ { MAD_F(0x044f4e6b) /* 0.269361894 */, 19 }, +/* 7286 */ { MAD_F(0x044f821d) /* 0.269411195 */, 19 }, +/* 7287 */ { MAD_F(0x044fb5cf) /* 0.269460498 */, 19 }, +/* 7288 */ { MAD_F(0x044fe983) /* 0.269509804 */, 19 }, +/* 7289 */ { MAD_F(0x04501d37) /* 0.269559111 */, 19 }, +/* 7290 */ { MAD_F(0x045050eb) /* 0.269608421 */, 19 }, +/* 7291 */ { MAD_F(0x045084a0) /* 0.269657734 */, 19 }, +/* 7292 */ { MAD_F(0x0450b856) /* 0.269707048 */, 19 }, +/* 7293 */ { MAD_F(0x0450ec0d) /* 0.269756365 */, 19 }, +/* 7294 */ { MAD_F(0x04511fc4) /* 0.269805684 */, 19 }, +/* 7295 */ { MAD_F(0x0451537b) /* 0.269855005 */, 19 }, + +/* 7296 */ { MAD_F(0x04518733) /* 0.269904329 */, 19 }, +/* 7297 */ { MAD_F(0x0451baec) /* 0.269953654 */, 19 }, +/* 7298 */ { MAD_F(0x0451eea5) /* 0.270002982 */, 19 }, +/* 7299 */ { MAD_F(0x0452225f) /* 0.270052313 */, 19 }, +/* 7300 */ { MAD_F(0x0452561a) /* 0.270101645 */, 19 }, +/* 7301 */ { MAD_F(0x045289d5) /* 0.270150980 */, 19 }, +/* 7302 */ { MAD_F(0x0452bd91) /* 0.270200317 */, 19 }, +/* 7303 */ { MAD_F(0x0452f14d) /* 0.270249656 */, 19 }, +/* 7304 */ { MAD_F(0x0453250a) /* 0.270298998 */, 19 }, +/* 7305 */ { MAD_F(0x045358c8) /* 0.270348341 */, 19 }, +/* 7306 */ { MAD_F(0x04538c86) /* 0.270397687 */, 19 }, +/* 7307 */ { MAD_F(0x0453c045) /* 0.270447036 */, 19 }, +/* 7308 */ { MAD_F(0x0453f405) /* 0.270496386 */, 19 }, +/* 7309 */ { MAD_F(0x045427c5) /* 0.270545739 */, 19 }, +/* 7310 */ { MAD_F(0x04545b85) /* 0.270595094 */, 19 }, +/* 7311 */ { MAD_F(0x04548f46) /* 0.270644451 */, 19 }, + +/* 7312 */ { MAD_F(0x0454c308) /* 0.270693811 */, 19 }, +/* 7313 */ { MAD_F(0x0454f6cb) /* 0.270743173 */, 19 }, +/* 7314 */ { MAD_F(0x04552a8e) /* 0.270792537 */, 19 }, +/* 7315 */ { MAD_F(0x04555e51) /* 0.270841903 */, 19 }, +/* 7316 */ { MAD_F(0x04559216) /* 0.270891271 */, 19 }, +/* 7317 */ { MAD_F(0x0455c5db) /* 0.270940642 */, 19 }, +/* 7318 */ { MAD_F(0x0455f9a0) /* 0.270990015 */, 19 }, +/* 7319 */ { MAD_F(0x04562d66) /* 0.271039390 */, 19 }, +/* 7320 */ { MAD_F(0x0456612d) /* 0.271088768 */, 19 }, +/* 7321 */ { MAD_F(0x045694f4) /* 0.271138148 */, 19 }, +/* 7322 */ { MAD_F(0x0456c8bc) /* 0.271187530 */, 19 }, +/* 7323 */ { MAD_F(0x0456fc84) /* 0.271236914 */, 19 }, +/* 7324 */ { MAD_F(0x0457304e) /* 0.271286301 */, 19 }, +/* 7325 */ { MAD_F(0x04576417) /* 0.271335689 */, 19 }, +/* 7326 */ { MAD_F(0x045797e2) /* 0.271385080 */, 19 }, +/* 7327 */ { MAD_F(0x0457cbac) /* 0.271434474 */, 19 }, + +/* 7328 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 19 }, +/* 7329 */ { MAD_F(0x04583344) /* 0.271533267 */, 19 }, +/* 7330 */ { MAD_F(0x04586711) /* 0.271582667 */, 19 }, +/* 7331 */ { MAD_F(0x04589ade) /* 0.271632069 */, 19 }, +/* 7332 */ { MAD_F(0x0458ceac) /* 0.271681474 */, 19 }, +/* 7333 */ { MAD_F(0x0459027b) /* 0.271730880 */, 19 }, +/* 7334 */ { MAD_F(0x0459364a) /* 0.271780289 */, 19 }, +/* 7335 */ { MAD_F(0x04596a19) /* 0.271829701 */, 19 }, +/* 7336 */ { MAD_F(0x04599dea) /* 0.271879114 */, 19 }, +/* 7337 */ { MAD_F(0x0459d1bb) /* 0.271928530 */, 19 }, +/* 7338 */ { MAD_F(0x045a058c) /* 0.271977948 */, 19 }, +/* 7339 */ { MAD_F(0x045a395e) /* 0.272027368 */, 19 }, +/* 7340 */ { MAD_F(0x045a6d31) /* 0.272076790 */, 19 }, +/* 7341 */ { MAD_F(0x045aa104) /* 0.272126215 */, 19 }, +/* 7342 */ { MAD_F(0x045ad4d8) /* 0.272175642 */, 19 }, +/* 7343 */ { MAD_F(0x045b08ad) /* 0.272225071 */, 19 }, + +/* 7344 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 19 }, +/* 7345 */ { MAD_F(0x045b7058) /* 0.272323936 */, 19 }, +/* 7346 */ { MAD_F(0x045ba42e) /* 0.272373372 */, 19 }, +/* 7347 */ { MAD_F(0x045bd805) /* 0.272422810 */, 19 }, +/* 7348 */ { MAD_F(0x045c0bdd) /* 0.272472251 */, 19 }, +/* 7349 */ { MAD_F(0x045c3fb5) /* 0.272521693 */, 19 }, +/* 7350 */ { MAD_F(0x045c738e) /* 0.272571138 */, 19 }, +/* 7351 */ { MAD_F(0x045ca767) /* 0.272620585 */, 19 }, +/* 7352 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 19 }, +/* 7353 */ { MAD_F(0x045d0f1b) /* 0.272719486 */, 19 }, +/* 7354 */ { MAD_F(0x045d42f7) /* 0.272768940 */, 19 }, +/* 7355 */ { MAD_F(0x045d76d2) /* 0.272818396 */, 19 }, +/* 7356 */ { MAD_F(0x045daaaf) /* 0.272867855 */, 19 }, +/* 7357 */ { MAD_F(0x045dde8c) /* 0.272917315 */, 19 }, +/* 7358 */ { MAD_F(0x045e1269) /* 0.272966778 */, 19 }, +/* 7359 */ { MAD_F(0x045e4647) /* 0.273016243 */, 19 }, + +/* 7360 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 19 }, +/* 7361 */ { MAD_F(0x045eae06) /* 0.273115180 */, 19 }, +/* 7362 */ { MAD_F(0x045ee1e6) /* 0.273164652 */, 19 }, +/* 7363 */ { MAD_F(0x045f15c6) /* 0.273214126 */, 19 }, +/* 7364 */ { MAD_F(0x045f49a7) /* 0.273263602 */, 19 }, +/* 7365 */ { MAD_F(0x045f7d89) /* 0.273313081 */, 19 }, +/* 7366 */ { MAD_F(0x045fb16c) /* 0.273362561 */, 19 }, +/* 7367 */ { MAD_F(0x045fe54f) /* 0.273412044 */, 19 }, +/* 7368 */ { MAD_F(0x04601932) /* 0.273461530 */, 19 }, +/* 7369 */ { MAD_F(0x04604d16) /* 0.273511017 */, 19 }, +/* 7370 */ { MAD_F(0x046080fb) /* 0.273560507 */, 19 }, +/* 7371 */ { MAD_F(0x0460b4e1) /* 0.273609999 */, 19 }, +/* 7372 */ { MAD_F(0x0460e8c7) /* 0.273659493 */, 19 }, +/* 7373 */ { MAD_F(0x04611cad) /* 0.273708989 */, 19 }, +/* 7374 */ { MAD_F(0x04615094) /* 0.273758488 */, 19 }, +/* 7375 */ { MAD_F(0x0461847c) /* 0.273807989 */, 19 }, + +/* 7376 */ { MAD_F(0x0461b864) /* 0.273857492 */, 19 }, +/* 7377 */ { MAD_F(0x0461ec4d) /* 0.273906997 */, 19 }, +/* 7378 */ { MAD_F(0x04622037) /* 0.273956505 */, 19 }, +/* 7379 */ { MAD_F(0x04625421) /* 0.274006015 */, 19 }, +/* 7380 */ { MAD_F(0x0462880c) /* 0.274055527 */, 19 }, +/* 7381 */ { MAD_F(0x0462bbf7) /* 0.274105041 */, 19 }, +/* 7382 */ { MAD_F(0x0462efe3) /* 0.274154558 */, 19 }, +/* 7383 */ { MAD_F(0x046323d0) /* 0.274204076 */, 19 }, +/* 7384 */ { MAD_F(0x046357bd) /* 0.274253597 */, 19 }, +/* 7385 */ { MAD_F(0x04638bab) /* 0.274303121 */, 19 }, +/* 7386 */ { MAD_F(0x0463bf99) /* 0.274352646 */, 19 }, +/* 7387 */ { MAD_F(0x0463f388) /* 0.274402174 */, 19 }, +/* 7388 */ { MAD_F(0x04642778) /* 0.274451704 */, 19 }, +/* 7389 */ { MAD_F(0x04645b68) /* 0.274501236 */, 19 }, +/* 7390 */ { MAD_F(0x04648f59) /* 0.274550771 */, 19 }, +/* 7391 */ { MAD_F(0x0464c34a) /* 0.274600307 */, 19 }, + +/* 7392 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 19 }, +/* 7393 */ { MAD_F(0x04652b2f) /* 0.274699387 */, 19 }, +/* 7394 */ { MAD_F(0x04655f22) /* 0.274748931 */, 19 }, +/* 7395 */ { MAD_F(0x04659316) /* 0.274798476 */, 19 }, +/* 7396 */ { MAD_F(0x0465c70a) /* 0.274848024 */, 19 }, +/* 7397 */ { MAD_F(0x0465faff) /* 0.274897574 */, 19 }, +/* 7398 */ { MAD_F(0x04662ef5) /* 0.274947126 */, 19 }, +/* 7399 */ { MAD_F(0x046662eb) /* 0.274996681 */, 19 }, +/* 7400 */ { MAD_F(0x046696e2) /* 0.275046238 */, 19 }, +/* 7401 */ { MAD_F(0x0466cad9) /* 0.275095797 */, 19 }, +/* 7402 */ { MAD_F(0x0466fed1) /* 0.275145358 */, 19 }, +/* 7403 */ { MAD_F(0x046732ca) /* 0.275194921 */, 19 }, +/* 7404 */ { MAD_F(0x046766c3) /* 0.275244487 */, 19 }, +/* 7405 */ { MAD_F(0x04679abd) /* 0.275294055 */, 19 }, +/* 7406 */ { MAD_F(0x0467ceb7) /* 0.275343625 */, 19 }, +/* 7407 */ { MAD_F(0x046802b2) /* 0.275393198 */, 19 }, + +/* 7408 */ { MAD_F(0x046836ae) /* 0.275442772 */, 19 }, +/* 7409 */ { MAD_F(0x04686aaa) /* 0.275492349 */, 19 }, +/* 7410 */ { MAD_F(0x04689ea7) /* 0.275541928 */, 19 }, +/* 7411 */ { MAD_F(0x0468d2a4) /* 0.275591509 */, 19 }, +/* 7412 */ { MAD_F(0x046906a2) /* 0.275641093 */, 19 }, +/* 7413 */ { MAD_F(0x04693aa1) /* 0.275690679 */, 19 }, +/* 7414 */ { MAD_F(0x04696ea0) /* 0.275740267 */, 19 }, +/* 7415 */ { MAD_F(0x0469a2a0) /* 0.275789857 */, 19 }, +/* 7416 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 19 }, +/* 7417 */ { MAD_F(0x046a0aa1) /* 0.275889044 */, 19 }, +/* 7418 */ { MAD_F(0x046a3ea3) /* 0.275938641 */, 19 }, +/* 7419 */ { MAD_F(0x046a72a5) /* 0.275988240 */, 19 }, +/* 7420 */ { MAD_F(0x046aa6a8) /* 0.276037842 */, 19 }, +/* 7421 */ { MAD_F(0x046adaab) /* 0.276087445 */, 19 }, +/* 7422 */ { MAD_F(0x046b0eaf) /* 0.276137051 */, 19 }, +/* 7423 */ { MAD_F(0x046b42b3) /* 0.276186659 */, 19 }, + +/* 7424 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 19 }, +/* 7425 */ { MAD_F(0x046baabe) /* 0.276285882 */, 19 }, +/* 7426 */ { MAD_F(0x046bdec5) /* 0.276335497 */, 19 }, +/* 7427 */ { MAD_F(0x046c12cc) /* 0.276385113 */, 19 }, +/* 7428 */ { MAD_F(0x046c46d3) /* 0.276434733 */, 19 }, +/* 7429 */ { MAD_F(0x046c7adb) /* 0.276484354 */, 19 }, +/* 7430 */ { MAD_F(0x046caee4) /* 0.276533978 */, 19 }, +/* 7431 */ { MAD_F(0x046ce2ee) /* 0.276583604 */, 19 }, +/* 7432 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 19 }, +/* 7433 */ { MAD_F(0x046d4b02) /* 0.276682862 */, 19 }, +/* 7434 */ { MAD_F(0x046d7f0d) /* 0.276732495 */, 19 }, +/* 7435 */ { MAD_F(0x046db319) /* 0.276782129 */, 19 }, +/* 7436 */ { MAD_F(0x046de725) /* 0.276831766 */, 19 }, +/* 7437 */ { MAD_F(0x046e1b32) /* 0.276881406 */, 19 }, +/* 7438 */ { MAD_F(0x046e4f40) /* 0.276931047 */, 19 }, +/* 7439 */ { MAD_F(0x046e834e) /* 0.276980691 */, 19 }, + +/* 7440 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 19 }, +/* 7441 */ { MAD_F(0x046eeb6c) /* 0.277079985 */, 19 }, +/* 7442 */ { MAD_F(0x046f1f7c) /* 0.277129635 */, 19 }, +/* 7443 */ { MAD_F(0x046f538c) /* 0.277179288 */, 19 }, +/* 7444 */ { MAD_F(0x046f879d) /* 0.277228942 */, 19 }, +/* 7445 */ { MAD_F(0x046fbbaf) /* 0.277278600 */, 19 }, +/* 7446 */ { MAD_F(0x046fefc1) /* 0.277328259 */, 19 }, +/* 7447 */ { MAD_F(0x047023d4) /* 0.277377920 */, 19 }, +/* 7448 */ { MAD_F(0x047057e8) /* 0.277427584 */, 19 }, +/* 7449 */ { MAD_F(0x04708bfc) /* 0.277477250 */, 19 }, +/* 7450 */ { MAD_F(0x0470c011) /* 0.277526918 */, 19 }, +/* 7451 */ { MAD_F(0x0470f426) /* 0.277576588 */, 19 }, +/* 7452 */ { MAD_F(0x0471283c) /* 0.277626261 */, 19 }, +/* 7453 */ { MAD_F(0x04715c52) /* 0.277675936 */, 19 }, +/* 7454 */ { MAD_F(0x04719069) /* 0.277725613 */, 19 }, +/* 7455 */ { MAD_F(0x0471c481) /* 0.277775292 */, 19 }, + +/* 7456 */ { MAD_F(0x0471f899) /* 0.277824973 */, 19 }, +/* 7457 */ { MAD_F(0x04722cb2) /* 0.277874657 */, 19 }, +/* 7458 */ { MAD_F(0x047260cc) /* 0.277924343 */, 19 }, +/* 7459 */ { MAD_F(0x047294e6) /* 0.277974031 */, 19 }, +/* 7460 */ { MAD_F(0x0472c900) /* 0.278023722 */, 19 }, +/* 7461 */ { MAD_F(0x0472fd1b) /* 0.278073414 */, 19 }, +/* 7462 */ { MAD_F(0x04733137) /* 0.278123109 */, 19 }, +/* 7463 */ { MAD_F(0x04736554) /* 0.278172806 */, 19 }, +/* 7464 */ { MAD_F(0x04739971) /* 0.278222505 */, 19 }, +/* 7465 */ { MAD_F(0x0473cd8e) /* 0.278272207 */, 19 }, +/* 7466 */ { MAD_F(0x047401ad) /* 0.278321910 */, 19 }, +/* 7467 */ { MAD_F(0x047435cb) /* 0.278371616 */, 19 }, +/* 7468 */ { MAD_F(0x047469eb) /* 0.278421324 */, 19 }, +/* 7469 */ { MAD_F(0x04749e0b) /* 0.278471035 */, 19 }, +/* 7470 */ { MAD_F(0x0474d22c) /* 0.278520747 */, 19 }, +/* 7471 */ { MAD_F(0x0475064d) /* 0.278570462 */, 19 }, + +/* 7472 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 19 }, +/* 7473 */ { MAD_F(0x04756e91) /* 0.278669898 */, 19 }, +/* 7474 */ { MAD_F(0x0475a2b4) /* 0.278719619 */, 19 }, +/* 7475 */ { MAD_F(0x0475d6d7) /* 0.278769343 */, 19 }, +/* 7476 */ { MAD_F(0x04760afc) /* 0.278819069 */, 19 }, +/* 7477 */ { MAD_F(0x04763f20) /* 0.278868797 */, 19 }, +/* 7478 */ { MAD_F(0x04767346) /* 0.278918527 */, 19 }, +/* 7479 */ { MAD_F(0x0476a76c) /* 0.278968260 */, 19 }, +/* 7480 */ { MAD_F(0x0476db92) /* 0.279017995 */, 19 }, +/* 7481 */ { MAD_F(0x04770fba) /* 0.279067731 */, 19 }, +/* 7482 */ { MAD_F(0x047743e1) /* 0.279117471 */, 19 }, +/* 7483 */ { MAD_F(0x0477780a) /* 0.279167212 */, 19 }, +/* 7484 */ { MAD_F(0x0477ac33) /* 0.279216956 */, 19 }, +/* 7485 */ { MAD_F(0x0477e05c) /* 0.279266701 */, 19 }, +/* 7486 */ { MAD_F(0x04781486) /* 0.279316449 */, 19 }, +/* 7487 */ { MAD_F(0x047848b1) /* 0.279366200 */, 19 }, + +/* 7488 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 19 }, +/* 7489 */ { MAD_F(0x0478b108) /* 0.279465707 */, 19 }, +/* 7490 */ { MAD_F(0x0478e535) /* 0.279515464 */, 19 }, +/* 7491 */ { MAD_F(0x04791962) /* 0.279565223 */, 19 }, +/* 7492 */ { MAD_F(0x04794d8f) /* 0.279614984 */, 19 }, +/* 7493 */ { MAD_F(0x047981be) /* 0.279664748 */, 19 }, +/* 7494 */ { MAD_F(0x0479b5ed) /* 0.279714513 */, 19 }, +/* 7495 */ { MAD_F(0x0479ea1c) /* 0.279764281 */, 19 }, +/* 7496 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 19 }, +/* 7497 */ { MAD_F(0x047a527d) /* 0.279863824 */, 19 }, +/* 7498 */ { MAD_F(0x047a86ae) /* 0.279913598 */, 19 }, +/* 7499 */ { MAD_F(0x047abae0) /* 0.279963375 */, 19 }, +/* 7500 */ { MAD_F(0x047aef12) /* 0.280013154 */, 19 }, +/* 7501 */ { MAD_F(0x047b2346) /* 0.280062935 */, 19 }, +/* 7502 */ { MAD_F(0x047b5779) /* 0.280112719 */, 19 }, +/* 7503 */ { MAD_F(0x047b8bad) /* 0.280162504 */, 19 }, + +/* 7504 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 19 }, +/* 7505 */ { MAD_F(0x047bf418) /* 0.280262082 */, 19 }, +/* 7506 */ { MAD_F(0x047c284e) /* 0.280311875 */, 19 }, +/* 7507 */ { MAD_F(0x047c5c84) /* 0.280361669 */, 19 }, +/* 7508 */ { MAD_F(0x047c90bb) /* 0.280411466 */, 19 }, +/* 7509 */ { MAD_F(0x047cc4f3) /* 0.280461265 */, 19 }, +/* 7510 */ { MAD_F(0x047cf92c) /* 0.280511066 */, 19 }, +/* 7511 */ { MAD_F(0x047d2d65) /* 0.280560869 */, 19 }, +/* 7512 */ { MAD_F(0x047d619e) /* 0.280610675 */, 19 }, +/* 7513 */ { MAD_F(0x047d95d8) /* 0.280660483 */, 19 }, +/* 7514 */ { MAD_F(0x047dca13) /* 0.280710292 */, 19 }, +/* 7515 */ { MAD_F(0x047dfe4e) /* 0.280760105 */, 19 }, +/* 7516 */ { MAD_F(0x047e328a) /* 0.280809919 */, 19 }, +/* 7517 */ { MAD_F(0x047e66c7) /* 0.280859736 */, 19 }, +/* 7518 */ { MAD_F(0x047e9b04) /* 0.280909554 */, 19 }, +/* 7519 */ { MAD_F(0x047ecf42) /* 0.280959375 */, 19 }, + +/* 7520 */ { MAD_F(0x047f0380) /* 0.281009199 */, 19 }, +/* 7521 */ { MAD_F(0x047f37bf) /* 0.281059024 */, 19 }, +/* 7522 */ { MAD_F(0x047f6bff) /* 0.281108852 */, 19 }, +/* 7523 */ { MAD_F(0x047fa03f) /* 0.281158682 */, 19 }, +/* 7524 */ { MAD_F(0x047fd47f) /* 0.281208514 */, 19 }, +/* 7525 */ { MAD_F(0x048008c1) /* 0.281258348 */, 19 }, +/* 7526 */ { MAD_F(0x04803d02) /* 0.281308184 */, 19 }, +/* 7527 */ { MAD_F(0x04807145) /* 0.281358023 */, 19 }, +/* 7528 */ { MAD_F(0x0480a588) /* 0.281407864 */, 19 }, +/* 7529 */ { MAD_F(0x0480d9cc) /* 0.281457707 */, 19 }, +/* 7530 */ { MAD_F(0x04810e10) /* 0.281507552 */, 19 }, +/* 7531 */ { MAD_F(0x04814255) /* 0.281557400 */, 19 }, +/* 7532 */ { MAD_F(0x0481769a) /* 0.281607250 */, 19 }, +/* 7533 */ { MAD_F(0x0481aae0) /* 0.281657101 */, 19 }, +/* 7534 */ { MAD_F(0x0481df27) /* 0.281706956 */, 19 }, +/* 7535 */ { MAD_F(0x0482136e) /* 0.281756812 */, 19 }, + +/* 7536 */ { MAD_F(0x048247b6) /* 0.281806670 */, 19 }, +/* 7537 */ { MAD_F(0x04827bfe) /* 0.281856531 */, 19 }, +/* 7538 */ { MAD_F(0x0482b047) /* 0.281906394 */, 19 }, +/* 7539 */ { MAD_F(0x0482e491) /* 0.281956259 */, 19 }, +/* 7540 */ { MAD_F(0x048318db) /* 0.282006127 */, 19 }, +/* 7541 */ { MAD_F(0x04834d26) /* 0.282055996 */, 19 }, +/* 7542 */ { MAD_F(0x04838171) /* 0.282105868 */, 19 }, +/* 7543 */ { MAD_F(0x0483b5bd) /* 0.282155742 */, 19 }, +/* 7544 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 19 }, +/* 7545 */ { MAD_F(0x04841e57) /* 0.282255496 */, 19 }, +/* 7546 */ { MAD_F(0x048452a4) /* 0.282305377 */, 19 }, +/* 7547 */ { MAD_F(0x048486f3) /* 0.282355260 */, 19 }, +/* 7548 */ { MAD_F(0x0484bb42) /* 0.282405145 */, 19 }, +/* 7549 */ { MAD_F(0x0484ef91) /* 0.282455032 */, 19 }, +/* 7550 */ { MAD_F(0x048523e1) /* 0.282504921 */, 19 }, +/* 7551 */ { MAD_F(0x04855832) /* 0.282554813 */, 19 }, + +/* 7552 */ { MAD_F(0x04858c83) /* 0.282604707 */, 19 }, +/* 7553 */ { MAD_F(0x0485c0d5) /* 0.282654603 */, 19 }, +/* 7554 */ { MAD_F(0x0485f527) /* 0.282704501 */, 19 }, +/* 7555 */ { MAD_F(0x0486297a) /* 0.282754401 */, 19 }, +/* 7556 */ { MAD_F(0x04865dce) /* 0.282804304 */, 19 }, +/* 7557 */ { MAD_F(0x04869222) /* 0.282854209 */, 19 }, +/* 7558 */ { MAD_F(0x0486c677) /* 0.282904116 */, 19 }, +/* 7559 */ { MAD_F(0x0486facc) /* 0.282954025 */, 19 }, +/* 7560 */ { MAD_F(0x04872f22) /* 0.283003936 */, 19 }, +/* 7561 */ { MAD_F(0x04876379) /* 0.283053850 */, 19 }, +/* 7562 */ { MAD_F(0x048797d0) /* 0.283103766 */, 19 }, +/* 7563 */ { MAD_F(0x0487cc28) /* 0.283153684 */, 19 }, +/* 7564 */ { MAD_F(0x04880080) /* 0.283203604 */, 19 }, +/* 7565 */ { MAD_F(0x048834d9) /* 0.283253527 */, 19 }, +/* 7566 */ { MAD_F(0x04886933) /* 0.283303451 */, 19 }, +/* 7567 */ { MAD_F(0x04889d8d) /* 0.283353378 */, 19 }, + +/* 7568 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 19 }, +/* 7569 */ { MAD_F(0x04890643) /* 0.283453238 */, 19 }, +/* 7570 */ { MAD_F(0x04893a9f) /* 0.283503172 */, 19 }, +/* 7571 */ { MAD_F(0x04896efb) /* 0.283553107 */, 19 }, +/* 7572 */ { MAD_F(0x0489a358) /* 0.283603045 */, 19 }, +/* 7573 */ { MAD_F(0x0489d7b6) /* 0.283652985 */, 19 }, +/* 7574 */ { MAD_F(0x048a0c14) /* 0.283702927 */, 19 }, +/* 7575 */ { MAD_F(0x048a4073) /* 0.283752872 */, 19 }, +/* 7576 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 19 }, +/* 7577 */ { MAD_F(0x048aa933) /* 0.283852767 */, 19 }, +/* 7578 */ { MAD_F(0x048add93) /* 0.283902718 */, 19 }, +/* 7579 */ { MAD_F(0x048b11f5) /* 0.283952671 */, 19 }, +/* 7580 */ { MAD_F(0x048b4656) /* 0.284002627 */, 19 }, +/* 7581 */ { MAD_F(0x048b7ab9) /* 0.284052584 */, 19 }, +/* 7582 */ { MAD_F(0x048baf1c) /* 0.284102544 */, 19 }, +/* 7583 */ { MAD_F(0x048be37f) /* 0.284152506 */, 19 }, + +/* 7584 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 19 }, +/* 7585 */ { MAD_F(0x048c4c48) /* 0.284252436 */, 19 }, +/* 7586 */ { MAD_F(0x048c80ad) /* 0.284302405 */, 19 }, +/* 7587 */ { MAD_F(0x048cb513) /* 0.284352376 */, 19 }, +/* 7588 */ { MAD_F(0x048ce97a) /* 0.284402349 */, 19 }, +/* 7589 */ { MAD_F(0x048d1de1) /* 0.284452324 */, 19 }, +/* 7590 */ { MAD_F(0x048d5249) /* 0.284502301 */, 19 }, +/* 7591 */ { MAD_F(0x048d86b1) /* 0.284552281 */, 19 }, +/* 7592 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 19 }, +/* 7593 */ { MAD_F(0x048def83) /* 0.284652246 */, 19 }, +/* 7594 */ { MAD_F(0x048e23ed) /* 0.284702233 */, 19 }, +/* 7595 */ { MAD_F(0x048e5858) /* 0.284752221 */, 19 }, +/* 7596 */ { MAD_F(0x048e8cc3) /* 0.284802211 */, 19 }, +/* 7597 */ { MAD_F(0x048ec12f) /* 0.284852204 */, 19 }, +/* 7598 */ { MAD_F(0x048ef59b) /* 0.284902199 */, 19 }, +/* 7599 */ { MAD_F(0x048f2a08) /* 0.284952196 */, 19 }, + +/* 7600 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 19 }, +/* 7601 */ { MAD_F(0x048f92e4) /* 0.285052197 */, 19 }, +/* 7602 */ { MAD_F(0x048fc753) /* 0.285102201 */, 19 }, +/* 7603 */ { MAD_F(0x048ffbc2) /* 0.285152206 */, 19 }, +/* 7604 */ { MAD_F(0x04903032) /* 0.285202214 */, 19 }, +/* 7605 */ { MAD_F(0x049064a3) /* 0.285252225 */, 19 }, +/* 7606 */ { MAD_F(0x04909914) /* 0.285302237 */, 19 }, +/* 7607 */ { MAD_F(0x0490cd86) /* 0.285352252 */, 19 }, +/* 7608 */ { MAD_F(0x049101f8) /* 0.285402269 */, 19 }, +/* 7609 */ { MAD_F(0x0491366b) /* 0.285452288 */, 19 }, +/* 7610 */ { MAD_F(0x04916ade) /* 0.285502309 */, 19 }, +/* 7611 */ { MAD_F(0x04919f52) /* 0.285552332 */, 19 }, +/* 7612 */ { MAD_F(0x0491d3c7) /* 0.285602358 */, 19 }, +/* 7613 */ { MAD_F(0x0492083c) /* 0.285652386 */, 19 }, +/* 7614 */ { MAD_F(0x04923cb2) /* 0.285702416 */, 19 }, +/* 7615 */ { MAD_F(0x04927128) /* 0.285752448 */, 19 }, + +/* 7616 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 19 }, +/* 7617 */ { MAD_F(0x0492da17) /* 0.285852519 */, 19 }, +/* 7618 */ { MAD_F(0x04930e8f) /* 0.285902557 */, 19 }, +/* 7619 */ { MAD_F(0x04934308) /* 0.285952598 */, 19 }, +/* 7620 */ { MAD_F(0x04937781) /* 0.286002641 */, 19 }, +/* 7621 */ { MAD_F(0x0493abfb) /* 0.286052687 */, 19 }, +/* 7622 */ { MAD_F(0x0493e076) /* 0.286102734 */, 19 }, +/* 7623 */ { MAD_F(0x049414f1) /* 0.286152784 */, 19 }, +/* 7624 */ { MAD_F(0x0494496c) /* 0.286202836 */, 19 }, +/* 7625 */ { MAD_F(0x04947de9) /* 0.286252890 */, 19 }, +/* 7626 */ { MAD_F(0x0494b266) /* 0.286302946 */, 19 }, +/* 7627 */ { MAD_F(0x0494e6e3) /* 0.286353005 */, 19 }, +/* 7628 */ { MAD_F(0x04951b61) /* 0.286403065 */, 19 }, +/* 7629 */ { MAD_F(0x04954fe0) /* 0.286453128 */, 19 }, +/* 7630 */ { MAD_F(0x0495845f) /* 0.286503193 */, 19 }, +/* 7631 */ { MAD_F(0x0495b8df) /* 0.286553260 */, 19 }, + +/* 7632 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 19 }, +/* 7633 */ { MAD_F(0x049621e0) /* 0.286653401 */, 19 }, +/* 7634 */ { MAD_F(0x04965662) /* 0.286703475 */, 19 }, +/* 7635 */ { MAD_F(0x04968ae4) /* 0.286753551 */, 19 }, +/* 7636 */ { MAD_F(0x0496bf67) /* 0.286803629 */, 19 }, +/* 7637 */ { MAD_F(0x0496f3ea) /* 0.286853709 */, 19 }, +/* 7638 */ { MAD_F(0x0497286e) /* 0.286903792 */, 19 }, +/* 7639 */ { MAD_F(0x04975cf2) /* 0.286953876 */, 19 }, +/* 7640 */ { MAD_F(0x04979177) /* 0.287003963 */, 19 }, +/* 7641 */ { MAD_F(0x0497c5fd) /* 0.287054052 */, 19 }, +/* 7642 */ { MAD_F(0x0497fa83) /* 0.287104143 */, 19 }, +/* 7643 */ { MAD_F(0x04982f0a) /* 0.287154237 */, 19 }, +/* 7644 */ { MAD_F(0x04986392) /* 0.287204332 */, 19 }, +/* 7645 */ { MAD_F(0x0498981a) /* 0.287254430 */, 19 }, +/* 7646 */ { MAD_F(0x0498cca2) /* 0.287304530 */, 19 }, +/* 7647 */ { MAD_F(0x0499012c) /* 0.287354632 */, 19 }, + +/* 7648 */ { MAD_F(0x049935b5) /* 0.287404737 */, 19 }, +/* 7649 */ { MAD_F(0x04996a40) /* 0.287454843 */, 19 }, +/* 7650 */ { MAD_F(0x04999ecb) /* 0.287504952 */, 19 }, +/* 7651 */ { MAD_F(0x0499d356) /* 0.287555063 */, 19 }, +/* 7652 */ { MAD_F(0x049a07e2) /* 0.287605176 */, 19 }, +/* 7653 */ { MAD_F(0x049a3c6f) /* 0.287655291 */, 19 }, +/* 7654 */ { MAD_F(0x049a70fc) /* 0.287705409 */, 19 }, +/* 7655 */ { MAD_F(0x049aa58a) /* 0.287755528 */, 19 }, +/* 7656 */ { MAD_F(0x049ada19) /* 0.287805650 */, 19 }, +/* 7657 */ { MAD_F(0x049b0ea8) /* 0.287855774 */, 19 }, +/* 7658 */ { MAD_F(0x049b4337) /* 0.287905900 */, 19 }, +/* 7659 */ { MAD_F(0x049b77c8) /* 0.287956028 */, 19 }, +/* 7660 */ { MAD_F(0x049bac58) /* 0.288006159 */, 19 }, +/* 7661 */ { MAD_F(0x049be0ea) /* 0.288056292 */, 19 }, +/* 7662 */ { MAD_F(0x049c157c) /* 0.288106427 */, 19 }, +/* 7663 */ { MAD_F(0x049c4a0e) /* 0.288156564 */, 19 }, + +/* 7664 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 19 }, +/* 7665 */ { MAD_F(0x049cb335) /* 0.288256844 */, 19 }, +/* 7666 */ { MAD_F(0x049ce7ca) /* 0.288306988 */, 19 }, +/* 7667 */ { MAD_F(0x049d1c5e) /* 0.288357134 */, 19 }, +/* 7668 */ { MAD_F(0x049d50f4) /* 0.288407282 */, 19 }, +/* 7669 */ { MAD_F(0x049d858a) /* 0.288457432 */, 19 }, +/* 7670 */ { MAD_F(0x049dba21) /* 0.288507584 */, 19 }, +/* 7671 */ { MAD_F(0x049deeb8) /* 0.288557739 */, 19 }, +/* 7672 */ { MAD_F(0x049e2350) /* 0.288607895 */, 19 }, +/* 7673 */ { MAD_F(0x049e57e8) /* 0.288658054 */, 19 }, +/* 7674 */ { MAD_F(0x049e8c81) /* 0.288708215 */, 19 }, +/* 7675 */ { MAD_F(0x049ec11b) /* 0.288758379 */, 19 }, +/* 7676 */ { MAD_F(0x049ef5b5) /* 0.288808544 */, 19 }, +/* 7677 */ { MAD_F(0x049f2a50) /* 0.288858712 */, 19 }, +/* 7678 */ { MAD_F(0x049f5eeb) /* 0.288908881 */, 19 }, +/* 7679 */ { MAD_F(0x049f9387) /* 0.288959053 */, 19 }, + +/* 7680 */ { MAD_F(0x049fc824) /* 0.289009227 */, 19 }, +/* 7681 */ { MAD_F(0x049ffcc1) /* 0.289059404 */, 19 }, +/* 7682 */ { MAD_F(0x04a0315e) /* 0.289109582 */, 19 }, +/* 7683 */ { MAD_F(0x04a065fd) /* 0.289159763 */, 19 }, +/* 7684 */ { MAD_F(0x04a09a9b) /* 0.289209946 */, 19 }, +/* 7685 */ { MAD_F(0x04a0cf3b) /* 0.289260131 */, 19 }, +/* 7686 */ { MAD_F(0x04a103db) /* 0.289310318 */, 19 }, +/* 7687 */ { MAD_F(0x04a1387b) /* 0.289360507 */, 19 }, +/* 7688 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 19 }, +/* 7689 */ { MAD_F(0x04a1a1be) /* 0.289460893 */, 19 }, +/* 7690 */ { MAD_F(0x04a1d661) /* 0.289511088 */, 19 }, +/* 7691 */ { MAD_F(0x04a20b04) /* 0.289561287 */, 19 }, +/* 7692 */ { MAD_F(0x04a23fa7) /* 0.289611487 */, 19 }, +/* 7693 */ { MAD_F(0x04a2744b) /* 0.289661689 */, 19 }, +/* 7694 */ { MAD_F(0x04a2a8f0) /* 0.289711894 */, 19 }, +/* 7695 */ { MAD_F(0x04a2dd95) /* 0.289762101 */, 19 }, + +/* 7696 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 19 }, +/* 7697 */ { MAD_F(0x04a346e2) /* 0.289862521 */, 19 }, +/* 7698 */ { MAD_F(0x04a37b89) /* 0.289912734 */, 19 }, +/* 7699 */ { MAD_F(0x04a3b030) /* 0.289962949 */, 19 }, +/* 7700 */ { MAD_F(0x04a3e4d8) /* 0.290013167 */, 19 }, +/* 7701 */ { MAD_F(0x04a41981) /* 0.290063387 */, 19 }, +/* 7702 */ { MAD_F(0x04a44e2b) /* 0.290113609 */, 19 }, +/* 7703 */ { MAD_F(0x04a482d5) /* 0.290163833 */, 19 }, +/* 7704 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 19 }, +/* 7705 */ { MAD_F(0x04a4ec2a) /* 0.290264288 */, 19 }, +/* 7706 */ { MAD_F(0x04a520d6) /* 0.290314519 */, 19 }, +/* 7707 */ { MAD_F(0x04a55582) /* 0.290364751 */, 19 }, +/* 7708 */ { MAD_F(0x04a58a2f) /* 0.290414986 */, 19 }, +/* 7709 */ { MAD_F(0x04a5bedd) /* 0.290465224 */, 19 }, +/* 7710 */ { MAD_F(0x04a5f38b) /* 0.290515463 */, 19 }, +/* 7711 */ { MAD_F(0x04a62839) /* 0.290565705 */, 19 }, + +/* 7712 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 19 }, +/* 7713 */ { MAD_F(0x04a69198) /* 0.290666194 */, 19 }, +/* 7714 */ { MAD_F(0x04a6c648) /* 0.290716442 */, 19 }, +/* 7715 */ { MAD_F(0x04a6faf9) /* 0.290766692 */, 19 }, +/* 7716 */ { MAD_F(0x04a72fab) /* 0.290816945 */, 19 }, +/* 7717 */ { MAD_F(0x04a7645d) /* 0.290867199 */, 19 }, +/* 7718 */ { MAD_F(0x04a79910) /* 0.290917456 */, 19 }, +/* 7719 */ { MAD_F(0x04a7cdc3) /* 0.290967715 */, 19 }, +/* 7720 */ { MAD_F(0x04a80277) /* 0.291017976 */, 19 }, +/* 7721 */ { MAD_F(0x04a8372b) /* 0.291068239 */, 19 }, +/* 7722 */ { MAD_F(0x04a86be0) /* 0.291118505 */, 19 }, +/* 7723 */ { MAD_F(0x04a8a096) /* 0.291168772 */, 19 }, +/* 7724 */ { MAD_F(0x04a8d54c) /* 0.291219042 */, 19 }, +/* 7725 */ { MAD_F(0x04a90a03) /* 0.291269314 */, 19 }, +/* 7726 */ { MAD_F(0x04a93eba) /* 0.291319588 */, 19 }, +/* 7727 */ { MAD_F(0x04a97372) /* 0.291369865 */, 19 }, + +/* 7728 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 19 }, +/* 7729 */ { MAD_F(0x04a9dce4) /* 0.291470424 */, 19 }, +/* 7730 */ { MAD_F(0x04aa119d) /* 0.291520706 */, 19 }, +/* 7731 */ { MAD_F(0x04aa4658) /* 0.291570991 */, 19 }, +/* 7732 */ { MAD_F(0x04aa7b13) /* 0.291621278 */, 19 }, +/* 7733 */ { MAD_F(0x04aaafce) /* 0.291671568 */, 19 }, +/* 7734 */ { MAD_F(0x04aae48a) /* 0.291721859 */, 19 }, +/* 7735 */ { MAD_F(0x04ab1947) /* 0.291772153 */, 19 }, +/* 7736 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 19 }, +/* 7737 */ { MAD_F(0x04ab82c2) /* 0.291872747 */, 19 }, +/* 7738 */ { MAD_F(0x04abb780) /* 0.291923047 */, 19 }, +/* 7739 */ { MAD_F(0x04abec3f) /* 0.291973349 */, 19 }, +/* 7740 */ { MAD_F(0x04ac20fe) /* 0.292023653 */, 19 }, +/* 7741 */ { MAD_F(0x04ac55be) /* 0.292073960 */, 19 }, +/* 7742 */ { MAD_F(0x04ac8a7f) /* 0.292124269 */, 19 }, +/* 7743 */ { MAD_F(0x04acbf40) /* 0.292174580 */, 19 }, + +/* 7744 */ { MAD_F(0x04acf402) /* 0.292224893 */, 19 }, +/* 7745 */ { MAD_F(0x04ad28c5) /* 0.292275208 */, 19 }, +/* 7746 */ { MAD_F(0x04ad5d88) /* 0.292325526 */, 19 }, +/* 7747 */ { MAD_F(0x04ad924b) /* 0.292375845 */, 19 }, +/* 7748 */ { MAD_F(0x04adc70f) /* 0.292426167 */, 19 }, +/* 7749 */ { MAD_F(0x04adfbd4) /* 0.292476491 */, 19 }, +/* 7750 */ { MAD_F(0x04ae3099) /* 0.292526817 */, 19 }, +/* 7751 */ { MAD_F(0x04ae655f) /* 0.292577145 */, 19 }, +/* 7752 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 19 }, +/* 7753 */ { MAD_F(0x04aeceed) /* 0.292677808 */, 19 }, +/* 7754 */ { MAD_F(0x04af03b4) /* 0.292728143 */, 19 }, +/* 7755 */ { MAD_F(0x04af387d) /* 0.292778480 */, 19 }, +/* 7756 */ { MAD_F(0x04af6d45) /* 0.292828819 */, 19 }, +/* 7757 */ { MAD_F(0x04afa20f) /* 0.292879160 */, 19 }, +/* 7758 */ { MAD_F(0x04afd6d9) /* 0.292929504 */, 19 }, +/* 7759 */ { MAD_F(0x04b00ba3) /* 0.292979849 */, 19 }, + +/* 7760 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 19 }, +/* 7761 */ { MAD_F(0x04b0753a) /* 0.293080547 */, 19 }, +/* 7762 */ { MAD_F(0x04b0aa06) /* 0.293130899 */, 19 }, +/* 7763 */ { MAD_F(0x04b0ded3) /* 0.293181253 */, 19 }, +/* 7764 */ { MAD_F(0x04b113a1) /* 0.293231610 */, 19 }, +/* 7765 */ { MAD_F(0x04b1486f) /* 0.293281968 */, 19 }, +/* 7766 */ { MAD_F(0x04b17d3d) /* 0.293332329 */, 19 }, +/* 7767 */ { MAD_F(0x04b1b20c) /* 0.293382692 */, 19 }, +/* 7768 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 19 }, +/* 7769 */ { MAD_F(0x04b21bad) /* 0.293483424 */, 19 }, +/* 7770 */ { MAD_F(0x04b2507d) /* 0.293533794 */, 19 }, +/* 7771 */ { MAD_F(0x04b2854f) /* 0.293584165 */, 19 }, +/* 7772 */ { MAD_F(0x04b2ba21) /* 0.293634539 */, 19 }, +/* 7773 */ { MAD_F(0x04b2eef4) /* 0.293684915 */, 19 }, +/* 7774 */ { MAD_F(0x04b323c7) /* 0.293735293 */, 19 }, +/* 7775 */ { MAD_F(0x04b3589b) /* 0.293785673 */, 19 }, + +/* 7776 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 19 }, +/* 7777 */ { MAD_F(0x04b3c244) /* 0.293886440 */, 19 }, +/* 7778 */ { MAD_F(0x04b3f71a) /* 0.293936826 */, 19 }, +/* 7779 */ { MAD_F(0x04b42bf0) /* 0.293987215 */, 19 }, +/* 7780 */ { MAD_F(0x04b460c7) /* 0.294037606 */, 19 }, +/* 7781 */ { MAD_F(0x04b4959e) /* 0.294087999 */, 19 }, +/* 7782 */ { MAD_F(0x04b4ca76) /* 0.294138395 */, 19 }, +/* 7783 */ { MAD_F(0x04b4ff4e) /* 0.294188792 */, 19 }, +/* 7784 */ { MAD_F(0x04b53427) /* 0.294239192 */, 19 }, +/* 7785 */ { MAD_F(0x04b56901) /* 0.294289593 */, 19 }, +/* 7786 */ { MAD_F(0x04b59ddb) /* 0.294339997 */, 19 }, +/* 7787 */ { MAD_F(0x04b5d2b6) /* 0.294390403 */, 19 }, +/* 7788 */ { MAD_F(0x04b60791) /* 0.294440812 */, 19 }, +/* 7789 */ { MAD_F(0x04b63c6d) /* 0.294491222 */, 19 }, +/* 7790 */ { MAD_F(0x04b6714a) /* 0.294541635 */, 19 }, +/* 7791 */ { MAD_F(0x04b6a627) /* 0.294592049 */, 19 }, + +/* 7792 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 19 }, +/* 7793 */ { MAD_F(0x04b70fe3) /* 0.294692885 */, 19 }, +/* 7794 */ { MAD_F(0x04b744c2) /* 0.294743306 */, 19 }, +/* 7795 */ { MAD_F(0x04b779a1) /* 0.294793730 */, 19 }, +/* 7796 */ { MAD_F(0x04b7ae81) /* 0.294844155 */, 19 }, +/* 7797 */ { MAD_F(0x04b7e362) /* 0.294894583 */, 19 }, +/* 7798 */ { MAD_F(0x04b81843) /* 0.294945013 */, 19 }, +/* 7799 */ { MAD_F(0x04b84d24) /* 0.294995445 */, 19 }, +/* 7800 */ { MAD_F(0x04b88207) /* 0.295045879 */, 19 }, +/* 7801 */ { MAD_F(0x04b8b6ea) /* 0.295096315 */, 19 }, +/* 7802 */ { MAD_F(0x04b8ebcd) /* 0.295146753 */, 19 }, +/* 7803 */ { MAD_F(0x04b920b1) /* 0.295197194 */, 19 }, +/* 7804 */ { MAD_F(0x04b95596) /* 0.295247637 */, 19 }, +/* 7805 */ { MAD_F(0x04b98a7b) /* 0.295298082 */, 19 }, +/* 7806 */ { MAD_F(0x04b9bf61) /* 0.295348529 */, 19 }, +/* 7807 */ { MAD_F(0x04b9f447) /* 0.295398978 */, 19 }, + +/* 7808 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 19 }, +/* 7809 */ { MAD_F(0x04ba5e16) /* 0.295499883 */, 19 }, +/* 7810 */ { MAD_F(0x04ba92fe) /* 0.295550338 */, 19 }, +/* 7811 */ { MAD_F(0x04bac7e6) /* 0.295600796 */, 19 }, +/* 7812 */ { MAD_F(0x04bafcd0) /* 0.295651256 */, 19 }, +/* 7813 */ { MAD_F(0x04bb31b9) /* 0.295701718 */, 19 }, +/* 7814 */ { MAD_F(0x04bb66a4) /* 0.295752183 */, 19 }, +/* 7815 */ { MAD_F(0x04bb9b8f) /* 0.295802649 */, 19 }, +/* 7816 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 19 }, +/* 7817 */ { MAD_F(0x04bc0566) /* 0.295903588 */, 19 }, +/* 7818 */ { MAD_F(0x04bc3a53) /* 0.295954061 */, 19 }, +/* 7819 */ { MAD_F(0x04bc6f40) /* 0.296004536 */, 19 }, +/* 7820 */ { MAD_F(0x04bca42e) /* 0.296055013 */, 19 }, +/* 7821 */ { MAD_F(0x04bcd91d) /* 0.296105493 */, 19 }, +/* 7822 */ { MAD_F(0x04bd0e0c) /* 0.296155974 */, 19 }, +/* 7823 */ { MAD_F(0x04bd42fb) /* 0.296206458 */, 19 }, + +/* 7824 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 19 }, +/* 7825 */ { MAD_F(0x04bdacdc) /* 0.296307432 */, 19 }, +/* 7826 */ { MAD_F(0x04bde1ce) /* 0.296357922 */, 19 }, +/* 7827 */ { MAD_F(0x04be16c0) /* 0.296408414 */, 19 }, +/* 7828 */ { MAD_F(0x04be4bb2) /* 0.296458908 */, 19 }, +/* 7829 */ { MAD_F(0x04be80a5) /* 0.296509405 */, 19 }, +/* 7830 */ { MAD_F(0x04beb599) /* 0.296559904 */, 19 }, +/* 7831 */ { MAD_F(0x04beea8d) /* 0.296610404 */, 19 }, +/* 7832 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 19 }, +/* 7833 */ { MAD_F(0x04bf5477) /* 0.296711413 */, 19 }, +/* 7834 */ { MAD_F(0x04bf896d) /* 0.296761920 */, 19 }, +/* 7835 */ { MAD_F(0x04bfbe64) /* 0.296812429 */, 19 }, +/* 7836 */ { MAD_F(0x04bff35b) /* 0.296862941 */, 19 }, +/* 7837 */ { MAD_F(0x04c02852) /* 0.296913455 */, 19 }, +/* 7838 */ { MAD_F(0x04c05d4b) /* 0.296963971 */, 19 }, +/* 7839 */ { MAD_F(0x04c09243) /* 0.297014489 */, 19 }, + +/* 7840 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 19 }, +/* 7841 */ { MAD_F(0x04c0fc37) /* 0.297115531 */, 19 }, +/* 7842 */ { MAD_F(0x04c13131) /* 0.297166056 */, 19 }, +/* 7843 */ { MAD_F(0x04c1662d) /* 0.297216582 */, 19 }, +/* 7844 */ { MAD_F(0x04c19b28) /* 0.297267111 */, 19 }, +/* 7845 */ { MAD_F(0x04c1d025) /* 0.297317642 */, 19 }, +/* 7846 */ { MAD_F(0x04c20521) /* 0.297368175 */, 19 }, +/* 7847 */ { MAD_F(0x04c23a1f) /* 0.297418710 */, 19 }, +/* 7848 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 19 }, +/* 7849 */ { MAD_F(0x04c2a41b) /* 0.297519787 */, 19 }, +/* 7850 */ { MAD_F(0x04c2d91b) /* 0.297570329 */, 19 }, +/* 7851 */ { MAD_F(0x04c30e1a) /* 0.297620873 */, 19 }, +/* 7852 */ { MAD_F(0x04c3431b) /* 0.297671418 */, 19 }, +/* 7853 */ { MAD_F(0x04c3781c) /* 0.297721967 */, 19 }, +/* 7854 */ { MAD_F(0x04c3ad1d) /* 0.297772517 */, 19 }, +/* 7855 */ { MAD_F(0x04c3e21f) /* 0.297823069 */, 19 }, + +/* 7856 */ { MAD_F(0x04c41722) /* 0.297873624 */, 19 }, +/* 7857 */ { MAD_F(0x04c44c25) /* 0.297924180 */, 19 }, +/* 7858 */ { MAD_F(0x04c48129) /* 0.297974739 */, 19 }, +/* 7859 */ { MAD_F(0x04c4b62d) /* 0.298025300 */, 19 }, +/* 7860 */ { MAD_F(0x04c4eb32) /* 0.298075863 */, 19 }, +/* 7861 */ { MAD_F(0x04c52038) /* 0.298126429 */, 19 }, +/* 7862 */ { MAD_F(0x04c5553e) /* 0.298176996 */, 19 }, +/* 7863 */ { MAD_F(0x04c58a44) /* 0.298227565 */, 19 }, +/* 7864 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 19 }, +/* 7865 */ { MAD_F(0x04c5f453) /* 0.298328711 */, 19 }, +/* 7866 */ { MAD_F(0x04c6295c) /* 0.298379287 */, 19 }, +/* 7867 */ { MAD_F(0x04c65e65) /* 0.298429865 */, 19 }, +/* 7868 */ { MAD_F(0x04c6936e) /* 0.298480445 */, 19 }, +/* 7869 */ { MAD_F(0x04c6c878) /* 0.298531028 */, 19 }, +/* 7870 */ { MAD_F(0x04c6fd83) /* 0.298581612 */, 19 }, +/* 7871 */ { MAD_F(0x04c7328e) /* 0.298632199 */, 19 }, + +/* 7872 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 19 }, +/* 7873 */ { MAD_F(0x04c79ca7) /* 0.298733379 */, 19 }, +/* 7874 */ { MAD_F(0x04c7d1b4) /* 0.298783972 */, 19 }, +/* 7875 */ { MAD_F(0x04c806c1) /* 0.298834567 */, 19 }, +/* 7876 */ { MAD_F(0x04c83bcf) /* 0.298885165 */, 19 }, +/* 7877 */ { MAD_F(0x04c870de) /* 0.298935764 */, 19 }, +/* 7878 */ { MAD_F(0x04c8a5ed) /* 0.298986366 */, 19 }, +/* 7879 */ { MAD_F(0x04c8dafd) /* 0.299036970 */, 19 }, +/* 7880 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 19 }, +/* 7881 */ { MAD_F(0x04c9451e) /* 0.299138184 */, 19 }, +/* 7882 */ { MAD_F(0x04c97a30) /* 0.299188794 */, 19 }, +/* 7883 */ { MAD_F(0x04c9af42) /* 0.299239406 */, 19 }, +/* 7884 */ { MAD_F(0x04c9e455) /* 0.299290021 */, 19 }, +/* 7885 */ { MAD_F(0x04ca1968) /* 0.299340638 */, 19 }, +/* 7886 */ { MAD_F(0x04ca4e7c) /* 0.299391256 */, 19 }, +/* 7887 */ { MAD_F(0x04ca8391) /* 0.299441877 */, 19 }, + +/* 7888 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 19 }, +/* 7889 */ { MAD_F(0x04caedbb) /* 0.299543126 */, 19 }, +/* 7890 */ { MAD_F(0x04cb22d1) /* 0.299593753 */, 19 }, +/* 7891 */ { MAD_F(0x04cb57e8) /* 0.299644382 */, 19 }, +/* 7892 */ { MAD_F(0x04cb8d00) /* 0.299695014 */, 19 }, +/* 7893 */ { MAD_F(0x04cbc217) /* 0.299745648 */, 19 }, +/* 7894 */ { MAD_F(0x04cbf730) /* 0.299796284 */, 19 }, +/* 7895 */ { MAD_F(0x04cc2c49) /* 0.299846922 */, 19 }, +/* 7896 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 19 }, +/* 7897 */ { MAD_F(0x04cc967d) /* 0.299948204 */, 19 }, +/* 7898 */ { MAD_F(0x04cccb98) /* 0.299998849 */, 19 }, +/* 7899 */ { MAD_F(0x04cd00b3) /* 0.300049495 */, 19 }, +/* 7900 */ { MAD_F(0x04cd35cf) /* 0.300100144 */, 19 }, +/* 7901 */ { MAD_F(0x04cd6aeb) /* 0.300150795 */, 19 }, +/* 7902 */ { MAD_F(0x04cda008) /* 0.300201448 */, 19 }, +/* 7903 */ { MAD_F(0x04cdd526) /* 0.300252103 */, 19 }, + +/* 7904 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 19 }, +/* 7905 */ { MAD_F(0x04ce3f63) /* 0.300353420 */, 19 }, +/* 7906 */ { MAD_F(0x04ce7482) /* 0.300404082 */, 19 }, +/* 7907 */ { MAD_F(0x04cea9a2) /* 0.300454745 */, 19 }, +/* 7908 */ { MAD_F(0x04cedec3) /* 0.300505411 */, 19 }, +/* 7909 */ { MAD_F(0x04cf13e4) /* 0.300556079 */, 19 }, +/* 7910 */ { MAD_F(0x04cf4906) /* 0.300606749 */, 19 }, +/* 7911 */ { MAD_F(0x04cf7e28) /* 0.300657421 */, 19 }, +/* 7912 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 19 }, +/* 7913 */ { MAD_F(0x04cfe86e) /* 0.300758772 */, 19 }, +/* 7914 */ { MAD_F(0x04d01d92) /* 0.300809451 */, 19 }, +/* 7915 */ { MAD_F(0x04d052b6) /* 0.300860132 */, 19 }, +/* 7916 */ { MAD_F(0x04d087db) /* 0.300910815 */, 19 }, +/* 7917 */ { MAD_F(0x04d0bd01) /* 0.300961500 */, 19 }, +/* 7918 */ { MAD_F(0x04d0f227) /* 0.301012187 */, 19 }, +/* 7919 */ { MAD_F(0x04d1274e) /* 0.301062876 */, 19 }, + +/* 7920 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 19 }, +/* 7921 */ { MAD_F(0x04d1919e) /* 0.301164261 */, 19 }, +/* 7922 */ { MAD_F(0x04d1c6c6) /* 0.301214957 */, 19 }, +/* 7923 */ { MAD_F(0x04d1fbef) /* 0.301265655 */, 19 }, +/* 7924 */ { MAD_F(0x04d23119) /* 0.301316355 */, 19 }, +/* 7925 */ { MAD_F(0x04d26643) /* 0.301367057 */, 19 }, +/* 7926 */ { MAD_F(0x04d29b6e) /* 0.301417761 */, 19 }, +/* 7927 */ { MAD_F(0x04d2d099) /* 0.301468468 */, 19 }, +/* 7928 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 19 }, +/* 7929 */ { MAD_F(0x04d33af2) /* 0.301569887 */, 19 }, +/* 7930 */ { MAD_F(0x04d3701f) /* 0.301620599 */, 19 }, +/* 7931 */ { MAD_F(0x04d3a54d) /* 0.301671314 */, 19 }, +/* 7932 */ { MAD_F(0x04d3da7b) /* 0.301722031 */, 19 }, +/* 7933 */ { MAD_F(0x04d40faa) /* 0.301772751 */, 19 }, +/* 7934 */ { MAD_F(0x04d444d9) /* 0.301823472 */, 19 }, +/* 7935 */ { MAD_F(0x04d47a09) /* 0.301874195 */, 19 }, + +/* 7936 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 19 }, +/* 7937 */ { MAD_F(0x04d4e46b) /* 0.301975649 */, 19 }, +/* 7938 */ { MAD_F(0x04d5199c) /* 0.302026378 */, 19 }, +/* 7939 */ { MAD_F(0x04d54ecf) /* 0.302077110 */, 19 }, +/* 7940 */ { MAD_F(0x04d58401) /* 0.302127845 */, 19 }, +/* 7941 */ { MAD_F(0x04d5b935) /* 0.302178581 */, 19 }, +/* 7942 */ { MAD_F(0x04d5ee69) /* 0.302229319 */, 19 }, +/* 7943 */ { MAD_F(0x04d6239d) /* 0.302280060 */, 19 }, +/* 7944 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 19 }, +/* 7945 */ { MAD_F(0x04d68e08) /* 0.302381547 */, 19 }, +/* 7946 */ { MAD_F(0x04d6c33e) /* 0.302432294 */, 19 }, +/* 7947 */ { MAD_F(0x04d6f875) /* 0.302483043 */, 19 }, +/* 7948 */ { MAD_F(0x04d72dad) /* 0.302533794 */, 19 }, +/* 7949 */ { MAD_F(0x04d762e5) /* 0.302584547 */, 19 }, +/* 7950 */ { MAD_F(0x04d7981d) /* 0.302635303 */, 19 }, +/* 7951 */ { MAD_F(0x04d7cd56) /* 0.302686060 */, 19 }, + +/* 7952 */ { MAD_F(0x04d80290) /* 0.302736820 */, 19 }, +/* 7953 */ { MAD_F(0x04d837ca) /* 0.302787581 */, 19 }, +/* 7954 */ { MAD_F(0x04d86d05) /* 0.302838345 */, 19 }, +/* 7955 */ { MAD_F(0x04d8a240) /* 0.302889111 */, 19 }, +/* 7956 */ { MAD_F(0x04d8d77c) /* 0.302939879 */, 19 }, +/* 7957 */ { MAD_F(0x04d90cb9) /* 0.302990650 */, 19 }, +/* 7958 */ { MAD_F(0x04d941f6) /* 0.303041422 */, 19 }, +/* 7959 */ { MAD_F(0x04d97734) /* 0.303092197 */, 19 }, +/* 7960 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 19 }, +/* 7961 */ { MAD_F(0x04d9e1b1) /* 0.303193752 */, 19 }, +/* 7962 */ { MAD_F(0x04da16f0) /* 0.303244533 */, 19 }, +/* 7963 */ { MAD_F(0x04da4c30) /* 0.303295316 */, 19 }, +/* 7964 */ { MAD_F(0x04da8171) /* 0.303346101 */, 19 }, +/* 7965 */ { MAD_F(0x04dab6b2) /* 0.303396889 */, 19 }, +/* 7966 */ { MAD_F(0x04daebf4) /* 0.303447678 */, 19 }, +/* 7967 */ { MAD_F(0x04db2136) /* 0.303498469 */, 19 }, + +/* 7968 */ { MAD_F(0x04db5679) /* 0.303549263 */, 19 }, +/* 7969 */ { MAD_F(0x04db8bbc) /* 0.303600059 */, 19 }, +/* 7970 */ { MAD_F(0x04dbc100) /* 0.303650857 */, 19 }, +/* 7971 */ { MAD_F(0x04dbf644) /* 0.303701657 */, 19 }, +/* 7972 */ { MAD_F(0x04dc2b8a) /* 0.303752459 */, 19 }, +/* 7973 */ { MAD_F(0x04dc60cf) /* 0.303803263 */, 19 }, +/* 7974 */ { MAD_F(0x04dc9616) /* 0.303854070 */, 19 }, +/* 7975 */ { MAD_F(0x04dccb5c) /* 0.303904878 */, 19 }, +/* 7976 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 19 }, +/* 7977 */ { MAD_F(0x04dd35ec) /* 0.304006502 */, 19 }, +/* 7978 */ { MAD_F(0x04dd6b34) /* 0.304057317 */, 19 }, +/* 7979 */ { MAD_F(0x04dda07d) /* 0.304108134 */, 19 }, +/* 7980 */ { MAD_F(0x04ddd5c7) /* 0.304158953 */, 19 }, +/* 7981 */ { MAD_F(0x04de0b11) /* 0.304209774 */, 19 }, +/* 7982 */ { MAD_F(0x04de405c) /* 0.304260597 */, 19 }, +/* 7983 */ { MAD_F(0x04de75a7) /* 0.304311423 */, 19 }, + +/* 7984 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 19 }, +/* 7985 */ { MAD_F(0x04dee040) /* 0.304413080 */, 19 }, +/* 7986 */ { MAD_F(0x04df158d) /* 0.304463912 */, 19 }, +/* 7987 */ { MAD_F(0x04df4adb) /* 0.304514746 */, 19 }, +/* 7988 */ { MAD_F(0x04df8029) /* 0.304565582 */, 19 }, +/* 7989 */ { MAD_F(0x04dfb578) /* 0.304616421 */, 19 }, +/* 7990 */ { MAD_F(0x04dfeac7) /* 0.304667261 */, 19 }, +/* 7991 */ { MAD_F(0x04e02017) /* 0.304718103 */, 19 }, +/* 7992 */ { MAD_F(0x04e05567) /* 0.304768948 */, 19 }, +/* 7993 */ { MAD_F(0x04e08ab8) /* 0.304819795 */, 19 }, +/* 7994 */ { MAD_F(0x04e0c00a) /* 0.304870644 */, 19 }, +/* 7995 */ { MAD_F(0x04e0f55c) /* 0.304921495 */, 19 }, +/* 7996 */ { MAD_F(0x04e12aaf) /* 0.304972348 */, 19 }, +/* 7997 */ { MAD_F(0x04e16002) /* 0.305023203 */, 19 }, +/* 7998 */ { MAD_F(0x04e19556) /* 0.305074060 */, 19 }, +/* 7999 */ { MAD_F(0x04e1caab) /* 0.305124920 */, 19 }, + +/* 8000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 19 }, +/* 8001 */ { MAD_F(0x04e23555) /* 0.305226645 */, 19 }, +/* 8002 */ { MAD_F(0x04e26aac) /* 0.305277511 */, 19 }, +/* 8003 */ { MAD_F(0x04e2a002) /* 0.305328379 */, 19 }, +/* 8004 */ { MAD_F(0x04e2d55a) /* 0.305379249 */, 19 }, +/* 8005 */ { MAD_F(0x04e30ab2) /* 0.305430121 */, 19 }, +/* 8006 */ { MAD_F(0x04e3400a) /* 0.305480995 */, 19 }, +/* 8007 */ { MAD_F(0x04e37563) /* 0.305531872 */, 19 }, +/* 8008 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 19 }, +/* 8009 */ { MAD_F(0x04e3e017) /* 0.305633631 */, 19 }, +/* 8010 */ { MAD_F(0x04e41572) /* 0.305684513 */, 19 }, +/* 8011 */ { MAD_F(0x04e44acd) /* 0.305735398 */, 19 }, +/* 8012 */ { MAD_F(0x04e48029) /* 0.305786285 */, 19 }, +/* 8013 */ { MAD_F(0x04e4b585) /* 0.305837174 */, 19 }, +/* 8014 */ { MAD_F(0x04e4eae2) /* 0.305888066 */, 19 }, +/* 8015 */ { MAD_F(0x04e52040) /* 0.305938959 */, 19 }, + +/* 8016 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 19 }, +/* 8017 */ { MAD_F(0x04e58afd) /* 0.306040752 */, 19 }, +/* 8018 */ { MAD_F(0x04e5c05c) /* 0.306091652 */, 19 }, +/* 8019 */ { MAD_F(0x04e5f5bc) /* 0.306142554 */, 19 }, +/* 8020 */ { MAD_F(0x04e62b1c) /* 0.306193457 */, 19 }, +/* 8021 */ { MAD_F(0x04e6607d) /* 0.306244364 */, 19 }, +/* 8022 */ { MAD_F(0x04e695df) /* 0.306295272 */, 19 }, +/* 8023 */ { MAD_F(0x04e6cb41) /* 0.306346182 */, 19 }, +/* 8024 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 19 }, +/* 8025 */ { MAD_F(0x04e73607) /* 0.306448009 */, 19 }, +/* 8026 */ { MAD_F(0x04e76b6b) /* 0.306498925 */, 19 }, +/* 8027 */ { MAD_F(0x04e7a0cf) /* 0.306549844 */, 19 }, +/* 8028 */ { MAD_F(0x04e7d634) /* 0.306600765 */, 19 }, +/* 8029 */ { MAD_F(0x04e80b99) /* 0.306651688 */, 19 }, +/* 8030 */ { MAD_F(0x04e84100) /* 0.306702613 */, 19 }, +/* 8031 */ { MAD_F(0x04e87666) /* 0.306753540 */, 19 }, + +/* 8032 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 19 }, +/* 8033 */ { MAD_F(0x04e8e135) /* 0.306855401 */, 19 }, +/* 8034 */ { MAD_F(0x04e9169e) /* 0.306906334 */, 19 }, +/* 8035 */ { MAD_F(0x04e94c07) /* 0.306957270 */, 19 }, +/* 8036 */ { MAD_F(0x04e98170) /* 0.307008208 */, 19 }, +/* 8037 */ { MAD_F(0x04e9b6da) /* 0.307059148 */, 19 }, +/* 8038 */ { MAD_F(0x04e9ec45) /* 0.307110090 */, 19 }, +/* 8039 */ { MAD_F(0x04ea21b0) /* 0.307161034 */, 19 }, +/* 8040 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 19 }, +/* 8041 */ { MAD_F(0x04ea8c88) /* 0.307262928 */, 19 }, +/* 8042 */ { MAD_F(0x04eac1f5) /* 0.307313879 */, 19 }, +/* 8043 */ { MAD_F(0x04eaf762) /* 0.307364831 */, 19 }, +/* 8044 */ { MAD_F(0x04eb2cd0) /* 0.307415786 */, 19 }, +/* 8045 */ { MAD_F(0x04eb623f) /* 0.307466743 */, 19 }, +/* 8046 */ { MAD_F(0x04eb97ae) /* 0.307517702 */, 19 }, +/* 8047 */ { MAD_F(0x04ebcd1e) /* 0.307568663 */, 19 }, + +/* 8048 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 19 }, +/* 8049 */ { MAD_F(0x04ec37ff) /* 0.307670591 */, 19 }, +/* 8050 */ { MAD_F(0x04ec6d71) /* 0.307721558 */, 19 }, +/* 8051 */ { MAD_F(0x04eca2e3) /* 0.307772528 */, 19 }, +/* 8052 */ { MAD_F(0x04ecd855) /* 0.307823499 */, 19 }, +/* 8053 */ { MAD_F(0x04ed0dc8) /* 0.307874473 */, 19 }, +/* 8054 */ { MAD_F(0x04ed433c) /* 0.307925449 */, 19 }, +/* 8055 */ { MAD_F(0x04ed78b0) /* 0.307976426 */, 19 }, +/* 8056 */ { MAD_F(0x04edae25) /* 0.308027406 */, 19 }, +/* 8057 */ { MAD_F(0x04ede39a) /* 0.308078389 */, 19 }, +/* 8058 */ { MAD_F(0x04ee1910) /* 0.308129373 */, 19 }, +/* 8059 */ { MAD_F(0x04ee4e87) /* 0.308180359 */, 19 }, +/* 8060 */ { MAD_F(0x04ee83fe) /* 0.308231347 */, 19 }, +/* 8061 */ { MAD_F(0x04eeb976) /* 0.308282338 */, 19 }, +/* 8062 */ { MAD_F(0x04eeeeee) /* 0.308333331 */, 19 }, +/* 8063 */ { MAD_F(0x04ef2467) /* 0.308384325 */, 19 }, + +/* 8064 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 19 }, +/* 8065 */ { MAD_F(0x04ef8f5a) /* 0.308486321 */, 19 }, +/* 8066 */ { MAD_F(0x04efc4d5) /* 0.308537322 */, 19 }, +/* 8067 */ { MAD_F(0x04effa50) /* 0.308588325 */, 19 }, +/* 8068 */ { MAD_F(0x04f02fcb) /* 0.308639331 */, 19 }, +/* 8069 */ { MAD_F(0x04f06547) /* 0.308690338 */, 19 }, +/* 8070 */ { MAD_F(0x04f09ac4) /* 0.308741348 */, 19 }, +/* 8071 */ { MAD_F(0x04f0d041) /* 0.308792359 */, 19 }, +/* 8072 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 19 }, +/* 8073 */ { MAD_F(0x04f13b3e) /* 0.308894389 */, 19 }, +/* 8074 */ { MAD_F(0x04f170bd) /* 0.308945407 */, 19 }, +/* 8075 */ { MAD_F(0x04f1a63c) /* 0.308996427 */, 19 }, +/* 8076 */ { MAD_F(0x04f1dbbd) /* 0.309047449 */, 19 }, +/* 8077 */ { MAD_F(0x04f2113d) /* 0.309098473 */, 19 }, +/* 8078 */ { MAD_F(0x04f246bf) /* 0.309149499 */, 19 }, +/* 8079 */ { MAD_F(0x04f27c40) /* 0.309200528 */, 19 }, + +/* 8080 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 19 }, +/* 8081 */ { MAD_F(0x04f2e746) /* 0.309302591 */, 19 }, +/* 8082 */ { MAD_F(0x04f31cc9) /* 0.309353626 */, 19 }, +/* 8083 */ { MAD_F(0x04f3524d) /* 0.309404663 */, 19 }, +/* 8084 */ { MAD_F(0x04f387d2) /* 0.309455702 */, 19 }, +/* 8085 */ { MAD_F(0x04f3bd57) /* 0.309506743 */, 19 }, +/* 8086 */ { MAD_F(0x04f3f2dd) /* 0.309557786 */, 19 }, +/* 8087 */ { MAD_F(0x04f42864) /* 0.309608831 */, 19 }, +/* 8088 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 19 }, +/* 8089 */ { MAD_F(0x04f49372) /* 0.309710928 */, 19 }, +/* 8090 */ { MAD_F(0x04f4c8fa) /* 0.309761980 */, 19 }, +/* 8091 */ { MAD_F(0x04f4fe83) /* 0.309813033 */, 19 }, +/* 8092 */ { MAD_F(0x04f5340c) /* 0.309864089 */, 19 }, +/* 8093 */ { MAD_F(0x04f56996) /* 0.309915147 */, 19 }, +/* 8094 */ { MAD_F(0x04f59f20) /* 0.309966207 */, 19 }, +/* 8095 */ { MAD_F(0x04f5d4ab) /* 0.310017269 */, 19 }, + +/* 8096 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 19 }, +/* 8097 */ { MAD_F(0x04f63fc2) /* 0.310119400 */, 19 }, +/* 8098 */ { MAD_F(0x04f6754f) /* 0.310170468 */, 19 }, +/* 8099 */ { MAD_F(0x04f6aadc) /* 0.310221539 */, 19 }, +/* 8100 */ { MAD_F(0x04f6e06a) /* 0.310272611 */, 19 }, +/* 8101 */ { MAD_F(0x04f715f8) /* 0.310323686 */, 19 }, +/* 8102 */ { MAD_F(0x04f74b87) /* 0.310374763 */, 19 }, +/* 8103 */ { MAD_F(0x04f78116) /* 0.310425842 */, 19 }, +/* 8104 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 19 }, +/* 8105 */ { MAD_F(0x04f7ec37) /* 0.310528006 */, 19 }, +/* 8106 */ { MAD_F(0x04f821c8) /* 0.310579091 */, 19 }, +/* 8107 */ { MAD_F(0x04f85759) /* 0.310630179 */, 19 }, +/* 8108 */ { MAD_F(0x04f88cec) /* 0.310681268 */, 19 }, +/* 8109 */ { MAD_F(0x04f8c27e) /* 0.310732360 */, 19 }, +/* 8110 */ { MAD_F(0x04f8f812) /* 0.310783453 */, 19 }, +/* 8111 */ { MAD_F(0x04f92da6) /* 0.310834549 */, 19 }, + +/* 8112 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 19 }, +/* 8113 */ { MAD_F(0x04f998cf) /* 0.310936747 */, 19 }, +/* 8114 */ { MAD_F(0x04f9ce65) /* 0.310987849 */, 19 }, +/* 8115 */ { MAD_F(0x04fa03fb) /* 0.311038953 */, 19 }, +/* 8116 */ { MAD_F(0x04fa3992) /* 0.311090059 */, 19 }, +/* 8117 */ { MAD_F(0x04fa6f29) /* 0.311141168 */, 19 }, +/* 8118 */ { MAD_F(0x04faa4c1) /* 0.311192278 */, 19 }, +/* 8119 */ { MAD_F(0x04fada59) /* 0.311243390 */, 19 }, +/* 8120 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 19 }, +/* 8121 */ { MAD_F(0x04fb458c) /* 0.311345622 */, 19 }, +/* 8122 */ { MAD_F(0x04fb7b26) /* 0.311396741 */, 19 }, +/* 8123 */ { MAD_F(0x04fbb0c1) /* 0.311447862 */, 19 }, +/* 8124 */ { MAD_F(0x04fbe65c) /* 0.311498985 */, 19 }, +/* 8125 */ { MAD_F(0x04fc1bf8) /* 0.311550110 */, 19 }, +/* 8126 */ { MAD_F(0x04fc5194) /* 0.311601237 */, 19 }, +/* 8127 */ { MAD_F(0x04fc8731) /* 0.311652366 */, 19 }, + +/* 8128 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 19 }, +/* 8129 */ { MAD_F(0x04fcf26c) /* 0.311754631 */, 19 }, +/* 8130 */ { MAD_F(0x04fd280b) /* 0.311805767 */, 19 }, +/* 8131 */ { MAD_F(0x04fd5daa) /* 0.311856905 */, 19 }, +/* 8132 */ { MAD_F(0x04fd934a) /* 0.311908044 */, 19 }, +/* 8133 */ { MAD_F(0x04fdc8ea) /* 0.311959186 */, 19 }, +/* 8134 */ { MAD_F(0x04fdfe8b) /* 0.312010330 */, 19 }, +/* 8135 */ { MAD_F(0x04fe342c) /* 0.312061476 */, 19 }, +/* 8136 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 19 }, +/* 8137 */ { MAD_F(0x04fe9f71) /* 0.312163775 */, 19 }, +/* 8138 */ { MAD_F(0x04fed514) /* 0.312214927 */, 19 }, +/* 8139 */ { MAD_F(0x04ff0ab8) /* 0.312266082 */, 19 }, +/* 8140 */ { MAD_F(0x04ff405c) /* 0.312317238 */, 19 }, +/* 8141 */ { MAD_F(0x04ff7601) /* 0.312368397 */, 19 }, +/* 8142 */ { MAD_F(0x04ffaba6) /* 0.312419558 */, 19 }, +/* 8143 */ { MAD_F(0x04ffe14c) /* 0.312470720 */, 19 }, + +/* 8144 */ { MAD_F(0x050016f3) /* 0.312521885 */, 19 }, +/* 8145 */ { MAD_F(0x05004c9a) /* 0.312573052 */, 19 }, +/* 8146 */ { MAD_F(0x05008241) /* 0.312624222 */, 19 }, +/* 8147 */ { MAD_F(0x0500b7e9) /* 0.312675393 */, 19 }, +/* 8148 */ { MAD_F(0x0500ed92) /* 0.312726566 */, 19 }, +/* 8149 */ { MAD_F(0x0501233b) /* 0.312777742 */, 19 }, +/* 8150 */ { MAD_F(0x050158e5) /* 0.312828919 */, 19 }, +/* 8151 */ { MAD_F(0x05018e90) /* 0.312880099 */, 19 }, +/* 8152 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 19 }, +/* 8153 */ { MAD_F(0x0501f9e6) /* 0.312982464 */, 19 }, +/* 8154 */ { MAD_F(0x05022f92) /* 0.313033650 */, 19 }, +/* 8155 */ { MAD_F(0x0502653f) /* 0.313084838 */, 19 }, +/* 8156 */ { MAD_F(0x05029aec) /* 0.313136028 */, 19 }, +/* 8157 */ { MAD_F(0x0502d09a) /* 0.313187220 */, 19 }, +/* 8158 */ { MAD_F(0x05030648) /* 0.313238414 */, 19 }, +/* 8159 */ { MAD_F(0x05033bf7) /* 0.313289611 */, 19 }, + +/* 8160 */ { MAD_F(0x050371a7) /* 0.313340809 */, 19 }, +/* 8161 */ { MAD_F(0x0503a757) /* 0.313392010 */, 19 }, +/* 8162 */ { MAD_F(0x0503dd07) /* 0.313443212 */, 19 }, +/* 8163 */ { MAD_F(0x050412b9) /* 0.313494417 */, 19 }, +/* 8164 */ { MAD_F(0x0504486a) /* 0.313545624 */, 19 }, +/* 8165 */ { MAD_F(0x05047e1d) /* 0.313596833 */, 19 }, +/* 8166 */ { MAD_F(0x0504b3cf) /* 0.313648044 */, 19 }, +/* 8167 */ { MAD_F(0x0504e983) /* 0.313699257 */, 19 }, +/* 8168 */ { MAD_F(0x05051f37) /* 0.313750472 */, 19 }, +/* 8169 */ { MAD_F(0x050554eb) /* 0.313801689 */, 19 }, +/* 8170 */ { MAD_F(0x05058aa0) /* 0.313852909 */, 19 }, +/* 8171 */ { MAD_F(0x0505c056) /* 0.313904130 */, 19 }, +/* 8172 */ { MAD_F(0x0505f60c) /* 0.313955354 */, 19 }, +/* 8173 */ { MAD_F(0x05062bc3) /* 0.314006579 */, 19 }, +/* 8174 */ { MAD_F(0x0506617a) /* 0.314057807 */, 19 }, +/* 8175 */ { MAD_F(0x05069732) /* 0.314109037 */, 19 }, + +/* 8176 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 19 }, +/* 8177 */ { MAD_F(0x050702a4) /* 0.314211502 */, 19 }, +/* 8178 */ { MAD_F(0x0507385d) /* 0.314262739 */, 19 }, +/* 8179 */ { MAD_F(0x05076e17) /* 0.314313977 */, 19 }, +/* 8180 */ { MAD_F(0x0507a3d2) /* 0.314365217 */, 19 }, +/* 8181 */ { MAD_F(0x0507d98d) /* 0.314416459 */, 19 }, +/* 8182 */ { MAD_F(0x05080f49) /* 0.314467704 */, 19 }, +/* 8183 */ { MAD_F(0x05084506) /* 0.314518950 */, 19 }, +/* 8184 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 19 }, +/* 8185 */ { MAD_F(0x0508b080) /* 0.314621449 */, 19 }, +/* 8186 */ { MAD_F(0x0508e63e) /* 0.314672702 */, 19 }, +/* 8187 */ { MAD_F(0x05091bfd) /* 0.314723957 */, 19 }, +/* 8188 */ { MAD_F(0x050951bc) /* 0.314775214 */, 19 }, +/* 8189 */ { MAD_F(0x0509877c) /* 0.314826473 */, 19 }, +/* 8190 */ { MAD_F(0x0509bd3c) /* 0.314877734 */, 19 }, +/* 8191 */ { MAD_F(0x0509f2fd) /* 0.314928997 */, 19 }, + +/* 8192 */ { MAD_F(0x050a28be) /* 0.314980262 */, 19 }, +/* 8193 */ { MAD_F(0x050a5e80) /* 0.315031530 */, 19 }, +/* 8194 */ { MAD_F(0x050a9443) /* 0.315082799 */, 19 }, +/* 8195 */ { MAD_F(0x050aca06) /* 0.315134071 */, 19 }, +/* 8196 */ { MAD_F(0x050affc9) /* 0.315185344 */, 19 }, +/* 8197 */ { MAD_F(0x050b358e) /* 0.315236620 */, 19 }, +/* 8198 */ { MAD_F(0x050b6b52) /* 0.315287898 */, 19 }, +/* 8199 */ { MAD_F(0x050ba118) /* 0.315339178 */, 19 }, +/* 8200 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 19 }, +/* 8201 */ { MAD_F(0x050c0ca4) /* 0.315441744 */, 19 }, +/* 8202 */ { MAD_F(0x050c426b) /* 0.315493030 */, 19 }, +/* 8203 */ { MAD_F(0x050c7833) /* 0.315544318 */, 19 }, +/* 8204 */ { MAD_F(0x050cadfb) /* 0.315595608 */, 19 }, +/* 8205 */ { MAD_F(0x050ce3c4) /* 0.315646901 */, 19 }, +/* 8206 */ { MAD_F(0x050d198d) /* 0.315698195 */, 19 } diff --git a/src/libmad/sf_table.dat.h b/src/libmad/sf_table.dat.h index db1484a0..5432d8d3 100644 --- a/src/libmad/sf_table.dat.h +++ b/src/libmad/sf_table.dat.h @@ -1,106 +1,106 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: sf_table.dat,v 1.7 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: sf_table.dat,v 1.7 2004/01/23 09:41:33 rob Exp $ +*/ /* - * These are the scalefactor values for Layer I and Layer II. - * The values are from Table B.1 of ISO/IEC 11172-3. - * - * There is some error introduced by the 32-bit fixed-point representation; - * the amount of error is shown. For 16-bit PCM output, this shouldn't be - * too much of a problem. - * - * Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict - * interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of - * 63 is invalid. However, for better compatibility with current practices, we - * add a 64th entry. - */ + These are the scalefactor values for Layer I and Layer II. + The values are from Table B.1 of ISO/IEC 11172-3. + + There is some error introduced by the 32-bit fixed-point representation; + the amount of error is shown. For 16-bit PCM output, this shouldn't be + too much of a problem. + + Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict + interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of + 63 is invalid. However, for better compatibility with current practices, we + add a 64th entry. +*/ - MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ - MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ - MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ - MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ - MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ - MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ - MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ - MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ +MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ + MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ + MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ + MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ + MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ + MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ + MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ + MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ - MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ - MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ - MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ - MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ - MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ - MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ - MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ - MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ + MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ + MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ + MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ + MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ + MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ + MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ + MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ + MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ - MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ - MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ - MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ - MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ - MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ - MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ - MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ - MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ + MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ + MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ + MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ + MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ + MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ + MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ + MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ + MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ - MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ - MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ - MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ - MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ - MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ - MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ - MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ - MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ + MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ + MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ + MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ + MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ + MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ + MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ + MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ + MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ - MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ - MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ - MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ - MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ - MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ - MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ - MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ - MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ + MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ + MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ + MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ + MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ + MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ + MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ + MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ + MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ - MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ - MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ - MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ - MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ - MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ - MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ - MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ - MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ + MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ + MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ + MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ + MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ + MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ + MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ + MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ + MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ - MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ - MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ - MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ - MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ - MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ - MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ - MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ - MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ + MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ + MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ + MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ + MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ + MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ + MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ + MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ + MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ - MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ - MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ - MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ - MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ - MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ - MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ - MAD_F(0x00000143), /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ - MAD_F(0x00000000) /* this compatibility entry is not part of Table B.1 */ + MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ + MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ + MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ + MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ + MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ + MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ + MAD_F(0x00000143), /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ + MAD_F(0x00000000) /* this compatibility entry is not part of Table B.1 */ diff --git a/src/libmad/stream.c b/src/libmad/stream.c index 837cd9e7..c9d43b94 100644 --- a/src/libmad/stream.c +++ b/src/libmad/stream.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: stream.c,v 1.12 2004/02/05 09:02:39 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: stream.c,v 1.12 2004/02/05 09:02:39 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -32,133 +32,129 @@ # include "stream.h" /* - * NAME: stream->init() - * DESCRIPTION: initialize stream struct - */ -void mad_stream_init(struct mad_stream *stream) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - stream->buffer = 0; - stream->bufend = 0; - stream->skiplen = 0; - - stream->sync = 0; - stream->freerate = 0; - - stream->this_frame = 0; - stream->next_frame = 0; - mad_bit_init(&stream->ptr, 0); - - mad_bit_init(&stream->anc_ptr, 0); - stream->anc_bitlen = 0; - - stream->md_len = 0; - - stream->options = 0; - stream->error = MAD_ERROR_NONE; + NAME: stream->init() + DESCRIPTION: initialize stream struct +*/ +void mad_stream_init(struct mad_stream *stream) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + stream->buffer = 0; + stream->bufend = 0; + stream->skiplen = 0; + + stream->sync = 0; + stream->freerate = 0; + + stream->this_frame = 0; + stream->next_frame = 0; + mad_bit_init(&stream->ptr, 0); + + mad_bit_init(&stream->anc_ptr, 0); + stream->anc_bitlen = 0; + + stream->md_len = 0; + + stream->options = 0; + stream->error = MAD_ERROR_NONE; } /* - * NAME: stream->finish() - * DESCRIPTION: deallocate any dynamic memory associated with stream - */ -void mad_stream_finish(struct mad_stream *stream) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - (void) stream; - - mad_bit_finish(&stream->anc_ptr); - mad_bit_finish(&stream->ptr); + NAME: stream->finish() + DESCRIPTION: deallocate any dynamic memory associated with stream +*/ +void mad_stream_finish(struct mad_stream *stream) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + (void) stream; + + mad_bit_finish(&stream->anc_ptr); + mad_bit_finish(&stream->ptr); } /* - * NAME: stream->buffer() - * DESCRIPTION: set stream buffer pointers - */ + NAME: stream->buffer() + DESCRIPTION: set stream buffer pointers +*/ void mad_stream_buffer(struct mad_stream *stream, - unsigned char const *buffer, unsigned long length) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - stream->buffer = buffer; - stream->bufend = buffer + length; + unsigned char const *buffer, unsigned long length) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + stream->buffer = buffer; + stream->bufend = buffer + length; - stream->this_frame = buffer; - stream->next_frame = buffer; + stream->this_frame = buffer; + stream->next_frame = buffer; - stream->sync = 1; + stream->sync = 1; - mad_bit_init(&stream->ptr, buffer); + mad_bit_init(&stream->ptr, buffer); } /* - * NAME: stream->skip() - * DESCRIPTION: arrange to skip bytes before the next frame - */ -void mad_stream_skip(struct mad_stream *stream, unsigned long length) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - stream->skiplen += length; + NAME: stream->skip() + DESCRIPTION: arrange to skip bytes before the next frame +*/ +void mad_stream_skip(struct mad_stream *stream, unsigned long length) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + stream->skiplen += length; } /* - * NAME: stream->sync() - * DESCRIPTION: locate the next stream sync word - */ -int mad_stream_sync(struct mad_stream *stream) -{ - register unsigned char const *ptr, *end; -stack(__FUNCTION__, __FILE__, __LINE__); + NAME: stream->sync() + DESCRIPTION: locate the next stream sync word +*/ +int mad_stream_sync(struct mad_stream *stream) { + register unsigned char const *ptr, *end; + stackenter(__FUNCTION__, __FILE__, __LINE__); - ptr = mad_bit_nextbyte(&stream->ptr); - end = stream->bufend; + ptr = mad_bit_nextbyte(&stream->ptr); + end = stream->bufend; - while (ptr < end - 1 && - !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) - ++ptr; + while (ptr < end - 1 && + !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { + ++ptr; + } - if (end - ptr < MAD_BUFFER_GUARD) - return -1; + if (end - ptr < MAD_BUFFER_GUARD) { + return -1; + } - mad_bit_init(&stream->ptr, ptr); + mad_bit_init(&stream->ptr, ptr); - return 0; + return 0; } /* - * NAME: stream->errorstr() - * DESCRIPTION: return a string description of the current error condition - */ -char const *mad_stream_errorstr(struct mad_stream const *stream) -{ -stack(__FUNCTION__, __FILE__, __LINE__); - switch (stream->error) { - case MAD_ERROR_NONE: return PSTR("no error"); - - case MAD_ERROR_BUFLEN: return PSTR("input buffer too small (or EOF)"); - case MAD_ERROR_BUFPTR: return PSTR("invalid (null) buffer pointer"); - - case MAD_ERROR_NOMEM: return PSTR("not enough memory"); - - case MAD_ERROR_LOSTSYNC: return PSTR("lost synchronization"); - case MAD_ERROR_BADLAYER: return PSTR("reserved header layer value"); - case MAD_ERROR_BADBITRATE: return PSTR("forbidden bitrate value"); - case MAD_ERROR_BADSAMPLERATE: return PSTR("reserved sample frequency value"); - case MAD_ERROR_BADEMPHASIS: return PSTR("reserved emphasis value"); - - case MAD_ERROR_BADCRC: return PSTR("CRC check failed"); - case MAD_ERROR_BADBITALLOC: return PSTR("forbidden bit allocation value"); - case MAD_ERROR_BADSCALEFACTOR: return PSTR("bad scalefactor index"); - case MAD_ERROR_BADMODE: return PSTR("bad bitrate/mode combination"); - case MAD_ERROR_BADFRAMELEN: return PSTR("bad frame length"); - case MAD_ERROR_BADBIGVALUES: return PSTR("bad big_values count"); - case MAD_ERROR_BADBLOCKTYPE: return PSTR("reserved block_type"); - case MAD_ERROR_BADSCFSI: return PSTR("bad scalefactor selection info"); - case MAD_ERROR_BADDATAPTR: return PSTR("bad main_data_begin pointer"); - case MAD_ERROR_BADPART3LEN: return PSTR("bad audio data length"); - case MAD_ERROR_BADHUFFTABLE: return PSTR("bad Huffman table select"); - case MAD_ERROR_BADHUFFDATA: return PSTR("Huffman data overrun"); - case MAD_ERROR_BADSTEREO: return PSTR("incompatible block_type for JS"); - } - - return 0; + NAME: stream->errorstr() + DESCRIPTION: return a string description of the current error condition +*/ +char const *mad_stream_errorstr(struct mad_stream const *stream) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + switch (stream->error) { + case MAD_ERROR_NONE: return PSTR("no error"); + + case MAD_ERROR_BUFLEN: return PSTR("input buffer too small (or EOF)"); + case MAD_ERROR_BUFPTR: return PSTR("invalid (null) buffer pointer"); + + case MAD_ERROR_NOMEM: return PSTR("not enough memory"); + + case MAD_ERROR_LOSTSYNC: return PSTR("lost synchronization"); + case MAD_ERROR_BADLAYER: return PSTR("reserved header layer value"); + case MAD_ERROR_BADBITRATE: return PSTR("forbidden bitrate value"); + case MAD_ERROR_BADSAMPLERATE: return PSTR("reserved sample frequency value"); + case MAD_ERROR_BADEMPHASIS: return PSTR("reserved emphasis value"); + + case MAD_ERROR_BADCRC: return PSTR("CRC check failed"); + case MAD_ERROR_BADBITALLOC: return PSTR("forbidden bit allocation value"); + case MAD_ERROR_BADSCALEFACTOR: return PSTR("bad scalefactor index"); + case MAD_ERROR_BADMODE: return PSTR("bad bitrate/mode combination"); + case MAD_ERROR_BADFRAMELEN: return PSTR("bad frame length"); + case MAD_ERROR_BADBIGVALUES: return PSTR("bad big_values count"); + case MAD_ERROR_BADBLOCKTYPE: return PSTR("reserved block_type"); + case MAD_ERROR_BADSCFSI: return PSTR("bad scalefactor selection info"); + case MAD_ERROR_BADDATAPTR: return PSTR("bad main_data_begin pointer"); + case MAD_ERROR_BADPART3LEN: return PSTR("bad audio data length"); + case MAD_ERROR_BADHUFFTABLE: return PSTR("bad Huffman table select"); + case MAD_ERROR_BADHUFFDATA: return PSTR("Huffman data overrun"); + case MAD_ERROR_BADSTEREO: return PSTR("incompatible block_type for JS"); + } + + return 0; } diff --git a/src/libmad/stream.h b/src/libmad/stream.h index 8dc8ec12..7661ee8d 100644 --- a/src/libmad/stream.h +++ b/src/libmad/stream.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp $ +*/ # ifndef LIBMAD_STREAM_H # define LIBMAD_STREAM_H @@ -28,66 +28,66 @@ # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) enum mad_error { - MAD_ERROR_NONE = 0x0000, /* no error */ - - MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ - MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ - - MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ - - MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ - MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ - MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ - MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ - MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ - - MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ - MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ - MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ - MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ - MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ - MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ - MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ - MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ - MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ - MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ - MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ - MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ - MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ + MAD_ERROR_NONE = 0x0000, /* no error */ + + MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ + MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ + + MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ + + MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ + MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ + MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ + MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ + MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ + + MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ + MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ + MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ + MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ + MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ + MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ + MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ + MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ + MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ + MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ + MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ + MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ + MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ }; # define MAD_RECOVERABLE(error) ((error) & 0xff00) struct mad_stream { - unsigned char const *buffer; /* input bitstream buffer */ - unsigned char const *bufend; /* end of buffer */ - unsigned long skiplen; /* bytes to skip before next frame */ + unsigned char const *buffer; /* input bitstream buffer */ + unsigned char const *bufend; /* end of buffer */ + unsigned long skiplen; /* bytes to skip before next frame */ - int sync; /* stream sync found */ - unsigned long freerate; /* free bitrate (fixed) */ + int sync; /* stream sync found */ + unsigned long freerate; /* free bitrate (fixed) */ - unsigned char const *this_frame; /* start of current frame */ - unsigned char const *next_frame; /* start of next frame */ - struct mad_bitptr ptr; /* current processing bit pointer */ + unsigned char const *this_frame; /* start of current frame */ + unsigned char const *next_frame; /* start of next frame */ + struct mad_bitptr ptr; /* current processing bit pointer */ - struct mad_bitptr anc_ptr; /* ancillary bits pointer */ - unsigned int anc_bitlen; /* number of ancillary bits */ + struct mad_bitptr anc_ptr; /* ancillary bits pointer */ + unsigned int anc_bitlen; /* number of ancillary bits */ - unsigned char main_data[MAD_BUFFER_MDLEN]; - /* Layer III main_data() */ - unsigned int md_len; /* bytes in main_data */ + unsigned char main_data[MAD_BUFFER_MDLEN]; + /* Layer III main_data() */ + unsigned int md_len; /* bytes in main_data */ - int options; /* decoding options (see below) */ - enum mad_error error; /* error code (see above) */ + int options; /* decoding options (see below) */ + enum mad_error error; /* error code (see above) */ }; enum { - MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ - MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ + MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ + MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ # if 0 /* not yet implemented */ - MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ - MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ - MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ + MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ + MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ + MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ # endif }; @@ -98,7 +98,7 @@ void mad_stream_finish(struct mad_stream *); ((void) ((stream)->options = (opts))) void mad_stream_buffer(struct mad_stream *, - unsigned char const *, unsigned long); + unsigned char const *, unsigned long); void mad_stream_skip(struct mad_stream *, unsigned long); int mad_stream_sync(struct mad_stream *); diff --git a/src/libmad/synth.c b/src/libmad/synth.c index d694b5c9..833d77a7 100644 --- a/src/libmad/synth.c +++ b/src/libmad/synth.c @@ -1,22 +1,22 @@ /* - libmad - MPEG audio decoder library - Copyright (C) 2000-2004 Underbit Technologies, Inc. + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: synth.c,v 1.25 2004/01/23 09:41:33 rob Exp $ + $Id: synth.c,v 1.25 2004/01/23 09:41:33 rob Exp $ */ #pragma GCC optimize ("O3") @@ -32,79 +32,77 @@ # include "synth.h" #include "decoder.h" -static int16_t scale(mad_fixed_t sample) -{ - /* round */ - sample += (1L << (MAD_F_FRACBITS - 16)); +static int16_t scale(mad_fixed_t sample) { + /* round */ + sample += (1L << (MAD_F_FRACBITS - 16)); - /* clip */ - if (sample >= MAD_F_ONE) - sample = MAD_F_ONE - 1; - else if (sample < -MAD_F_ONE) - sample = -MAD_F_ONE; + /* clip */ + if (sample >= MAD_F_ONE) { + sample = MAD_F_ONE - 1; + } else if (sample < -MAD_F_ONE) { + sample = -MAD_F_ONE; + } - /* quantize */ - return sample >> (MAD_F_FRACBITS + 1 - 16); + /* quantize */ + return sample >> (MAD_F_FRACBITS + 1 - 16); } /* - NAME: synth->init() - DESCRIPTION: initialize synth struct + NAME: synth->init() + DESCRIPTION: initialize synth struct */ -void mad_synth_init(struct mad_synth *synth) -{ - stack(__FUNCTION__,__FILE__,__LINE__); - mad_synth_mute(synth); +void mad_synth_init(struct mad_synth *synth) { + stackenter(__FUNCTION__, __FILE__, __LINE__); + mad_synth_mute(synth); - synth->phase = 0; + synth->phase = 0; - synth->pcm.samplerate = 0; - synth->pcm.channels = 0; - synth->pcm.length = 0; + synth->pcm.samplerate = 0; + synth->pcm.channels = 0; + synth->pcm.length = 0; } /* - NAME: synth->mute() - DESCRIPTION: zero all polyphase filterbank values, resetting synthesis + NAME: synth->mute() + DESCRIPTION: zero all polyphase filterbank values, resetting synthesis */ -void mad_synth_mute(struct mad_synth *synth) -{ - unsigned int ch, s, v; - stack(__FUNCTION__, __FILE__, __LINE__); - - for (ch = 0; ch < 2; ++ch) { - for (s = 0; s < 16; ++s) { - for (v = 0; v < 8; ++v) { - synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = - synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; - } +void mad_synth_mute(struct mad_synth *synth) { + unsigned int ch, s, v; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + for (ch = 0; ch < 2; ++ch) { + for (s = 0; s < 16; ++s) { + for (v = 0; v < 8; ++v) { + synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = + synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; + } + } } - } } /* - An optional optimization called here the Subband Synthesis Optimization - (SSO) improves the performance of subband synthesis at the expense of - accuracy. - - The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such - that extra scaling and rounding are not necessary. This often allows the - compiler to use faster 32-bit multiply-accumulate instructions instead of - explicit 64-bit multiply, shift, and add instructions. - - SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t - values requires the result to be right-shifted 28 bits to be properly - scaled to the same fixed-point format. Right shifts can be applied at any - time to either operand or to the result, so the optimization involves - careful placement of these shifts to minimize the loss of accuracy. - - First, a 14-bit shift is applied with rounding at compile-time to the D[] - table of coefficients for the subband synthesis window. This only loses 2 - bits of accuracy because the lower 12 bits are always zero. A second - 12-bit shift occurs after the DCT calculation. This loses 12 bits of - accuracy. Finally, a third 2-bit shift occurs just before the sample is - saved in the PCM buffer. 14 + 12 + 2 == 28 bits. + An optional optimization called here the Subband Synthesis Optimization + (SSO) improves the performance of subband synthesis at the expense of + accuracy. + + The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such + that extra scaling and rounding are not necessary. This often allows the + compiler to use faster 32-bit multiply-accumulate instructions instead of + explicit 64-bit multiply, shift, and add instructions. + + SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t + values requires the result to be right-shifted 28 bits to be properly + scaled to the same fixed-point format. Right shifts can be applied at any + time to either operand or to the result, so the optimization involves + careful placement of these shifts to minimize the loss of accuracy. + + First, a 14-bit shift is applied with rounding at compile-time to the D[] + table of coefficients for the subband synthesis window. This only loses 2 + bits of accuracy because the lower 12 bits are always zero. A second + 12-bit shift occurs after the DCT calculation. This loses 12 bits of + accuracy. Finally, a third 2-bit shift occurs just before the sample is + saved in the PCM buffer. 14 + 12 + 2 == 28 bits. */ /* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ @@ -137,38 +135,37 @@ void mad_synth_mute(struct mad_synth *synth) # endif /* - NAME: dct32() - DESCRIPTION: perform fast in[32]->out[32] DCT + NAME: dct32() + DESCRIPTION: perform fast in[32]->out[32] DCT */ static void dct32(mad_fixed_t const in[32], unsigned int slot, - mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) -{ - mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; - mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; - mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; - mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; - mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; - mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; - mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55; - mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63; - mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71; - mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79; - mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87; - mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95; - mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103; - mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111; - mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119; - mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127; - mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135; - mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143; - mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151; - mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159; - mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167; - mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175; - mad_fixed_t t176; - stack(__FUNCTION__, __FILE__, __LINE__); - /* costab[i] = cos(PI / (2 * 32) * i) */ + mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) { + mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; + mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; + mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; + mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; + mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; + mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; + mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55; + mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63; + mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71; + mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79; + mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87; + mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95; + mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103; + mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111; + mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119; + mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127; + mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135; + mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143; + mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151; + mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159; + mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167; + mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175; + mad_fixed_t t176; + stackenter(__FUNCTION__, __FILE__, __LINE__); + /* costab[i] = cos(PI / (2 * 32) * i) */ # if defined(OPT_DCTO) # define costab1 MAD_F(0x7fd8878e) @@ -236,300 +233,300 @@ void dct32(mad_fixed_t const in[32], unsigned int slot, # define costab31 MAD_F(0x00c8fb30) /* 0.049067674 */ # endif - t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1); - t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31); + t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1); + t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31); - t41 = t16 + t17; - t59 = MUL(t16 - t17, costab2); - t33 = t0 + t1; - t50 = MUL(t0 - t1, costab2); + t41 = t16 + t17; + t59 = MUL(t16 - t17, costab2); + t33 = t0 + t1; + t50 = MUL(t0 - t1, costab2); - t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15); - t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17); + t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15); + t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17); - t42 = t18 + t19; - t60 = MUL(t18 - t19, costab30); - t34 = t2 + t3; - t51 = MUL(t2 - t3, costab30); + t42 = t18 + t19; + t60 = MUL(t18 - t19, costab30); + t34 = t2 + t3; + t51 = MUL(t2 - t3, costab30); - t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7); - t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25); + t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7); + t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25); - t43 = t20 + t21; - t61 = MUL(t20 - t21, costab14); - t35 = t4 + t5; - t52 = MUL(t4 - t5, costab14); + t43 = t20 + t21; + t61 = MUL(t20 - t21, costab14); + t35 = t4 + t5; + t52 = MUL(t4 - t5, costab14); - t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9); - t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23); + t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9); + t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23); - t44 = t22 + t23; - t62 = MUL(t22 - t23, costab18); - t36 = t6 + t7; - t53 = MUL(t6 - t7, costab18); + t44 = t22 + t23; + t62 = MUL(t22 - t23, costab18); + t36 = t6 + t7; + t53 = MUL(t6 - t7, costab18); - t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3); - t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29); + t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3); + t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29); - t45 = t24 + t25; - t63 = MUL(t24 - t25, costab6); - t37 = t8 + t9; - t54 = MUL(t8 - t9, costab6); + t45 = t24 + t25; + t63 = MUL(t24 - t25, costab6); + t37 = t8 + t9; + t54 = MUL(t8 - t9, costab6); - t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13); - t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19); + t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13); + t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19); - t46 = t26 + t27; - t64 = MUL(t26 - t27, costab26); - t38 = t10 + t11; - t55 = MUL(t10 - t11, costab26); + t46 = t26 + t27; + t64 = MUL(t26 - t27, costab26); + t38 = t10 + t11; + t55 = MUL(t10 - t11, costab26); - t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5); - t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27); + t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5); + t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27); - t47 = t28 + t29; - t65 = MUL(t28 - t29, costab10); - t39 = t12 + t13; - t56 = MUL(t12 - t13, costab10); + t47 = t28 + t29; + t65 = MUL(t28 - t29, costab10); + t39 = t12 + t13; + t56 = MUL(t12 - t13, costab10); - t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11); - t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21); + t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11); + t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21); - t48 = t30 + t31; - t66 = MUL(t30 - t31, costab22); - t40 = t14 + t15; - t57 = MUL(t14 - t15, costab22); + t48 = t30 + t31; + t66 = MUL(t30 - t31, costab22); + t40 = t14 + t15; + t57 = MUL(t14 - t15, costab22); - t69 = t33 + t34; t89 = MUL(t33 - t34, costab4); - t70 = t35 + t36; t90 = MUL(t35 - t36, costab28); - t71 = t37 + t38; t91 = MUL(t37 - t38, costab12); - t72 = t39 + t40; t92 = MUL(t39 - t40, costab20); - t73 = t41 + t42; t94 = MUL(t41 - t42, costab4); - t74 = t43 + t44; t95 = MUL(t43 - t44, costab28); - t75 = t45 + t46; t96 = MUL(t45 - t46, costab12); - t76 = t47 + t48; t97 = MUL(t47 - t48, costab20); + t69 = t33 + t34; t89 = MUL(t33 - t34, costab4); + t70 = t35 + t36; t90 = MUL(t35 - t36, costab28); + t71 = t37 + t38; t91 = MUL(t37 - t38, costab12); + t72 = t39 + t40; t92 = MUL(t39 - t40, costab20); + t73 = t41 + t42; t94 = MUL(t41 - t42, costab4); + t74 = t43 + t44; t95 = MUL(t43 - t44, costab28); + t75 = t45 + t46; t96 = MUL(t45 - t46, costab12); + t76 = t47 + t48; t97 = MUL(t47 - t48, costab20); - t78 = t50 + t51; t100 = MUL(t50 - t51, costab4); - t79 = t52 + t53; t101 = MUL(t52 - t53, costab28); - t80 = t54 + t55; t102 = MUL(t54 - t55, costab12); - t81 = t56 + t57; t103 = MUL(t56 - t57, costab20); + t78 = t50 + t51; t100 = MUL(t50 - t51, costab4); + t79 = t52 + t53; t101 = MUL(t52 - t53, costab28); + t80 = t54 + t55; t102 = MUL(t54 - t55, costab12); + t81 = t56 + t57; t103 = MUL(t56 - t57, costab20); - t83 = t59 + t60; t106 = MUL(t59 - t60, costab4); - t84 = t61 + t62; t107 = MUL(t61 - t62, costab28); - t85 = t63 + t64; t108 = MUL(t63 - t64, costab12); - t86 = t65 + t66; t109 = MUL(t65 - t66, costab20); + t83 = t59 + t60; t106 = MUL(t59 - t60, costab4); + t84 = t61 + t62; t107 = MUL(t61 - t62, costab28); + t85 = t63 + t64; t108 = MUL(t63 - t64, costab12); + t86 = t65 + t66; t109 = MUL(t65 - t66, costab20); - t113 = t69 + t70; - t114 = t71 + t72; + t113 = t69 + t70; + t114 = t71 + t72; - /* 0 */ hi[15][slot] = SHIFT(t113 + t114); - /* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16)); + /* 0 */ hi[15][slot] = SHIFT(t113 + t114); + /* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16)); - t115 = t73 + t74; - t116 = t75 + t76; + t115 = t73 + t74; + t116 = t75 + t76; - t32 = t115 + t116; + t32 = t115 + t116; - /* 1 */ hi[14][slot] = SHIFT(t32); + /* 1 */ hi[14][slot] = SHIFT(t32); - t118 = t78 + t79; - t119 = t80 + t81; + t118 = t78 + t79; + t119 = t80 + t81; - t58 = t118 + t119; + t58 = t118 + t119; - /* 2 */ hi[13][slot] = SHIFT(t58); + /* 2 */ hi[13][slot] = SHIFT(t58); - t121 = t83 + t84; - t122 = t85 + t86; + t121 = t83 + t84; + t122 = t85 + t86; - t67 = t121 + t122; + t67 = t121 + t122; - t49 = (t67 * 2) - t32; + t49 = (t67 * 2) - t32; - /* 3 */ hi[12][slot] = SHIFT(t49); + /* 3 */ hi[12][slot] = SHIFT(t49); - t125 = t89 + t90; - t126 = t91 + t92; + t125 = t89 + t90; + t126 = t91 + t92; - t93 = t125 + t126; + t93 = t125 + t126; - /* 4 */ hi[11][slot] = SHIFT(t93); + /* 4 */ hi[11][slot] = SHIFT(t93); - t128 = t94 + t95; - t129 = t96 + t97; + t128 = t94 + t95; + t129 = t96 + t97; - t98 = t128 + t129; + t98 = t128 + t129; - t68 = (t98 * 2) - t49; + t68 = (t98 * 2) - t49; - /* 5 */ hi[10][slot] = SHIFT(t68); + /* 5 */ hi[10][slot] = SHIFT(t68); - t132 = t100 + t101; - t133 = t102 + t103; + t132 = t100 + t101; + t133 = t102 + t103; - t104 = t132 + t133; + t104 = t132 + t133; - t82 = (t104 * 2) - t58; + t82 = (t104 * 2) - t58; - /* 6 */ hi[ 9][slot] = SHIFT(t82); + /* 6 */ hi[ 9][slot] = SHIFT(t82); - t136 = t106 + t107; - t137 = t108 + t109; + t136 = t106 + t107; + t137 = t108 + t109; - t110 = t136 + t137; + t110 = t136 + t137; - t87 = (t110 * 2) - t67; + t87 = (t110 * 2) - t67; - t77 = (t87 * 2) - t68; + t77 = (t87 * 2) - t68; - /* 7 */ hi[ 8][slot] = SHIFT(t77); + /* 7 */ hi[ 8][slot] = SHIFT(t77); - t141 = MUL(t69 - t70, costab8); - t142 = MUL(t71 - t72, costab24); - t143 = t141 + t142; + t141 = MUL(t69 - t70, costab8); + t142 = MUL(t71 - t72, costab24); + t143 = t141 + t142; - /* 8 */ hi[ 7][slot] = SHIFT(t143); - /* 24 */ lo[ 8][slot] = - SHIFT((MUL(t141 - t142, costab16) * 2) - t143); + /* 8 */ hi[ 7][slot] = SHIFT(t143); + /* 24 */ lo[ 8][slot] = + SHIFT((MUL(t141 - t142, costab16) * 2) - t143); - t144 = MUL(t73 - t74, costab8); - t145 = MUL(t75 - t76, costab24); - t146 = t144 + t145; + t144 = MUL(t73 - t74, costab8); + t145 = MUL(t75 - t76, costab24); + t146 = t144 + t145; - t88 = (t146 * 2) - t77; + t88 = (t146 * 2) - t77; - /* 9 */ hi[ 6][slot] = SHIFT(t88); + /* 9 */ hi[ 6][slot] = SHIFT(t88); - t148 = MUL(t78 - t79, costab8); - t149 = MUL(t80 - t81, costab24); - t150 = t148 + t149; + t148 = MUL(t78 - t79, costab8); + t149 = MUL(t80 - t81, costab24); + t150 = t148 + t149; - t105 = (t150 * 2) - t82; + t105 = (t150 * 2) - t82; - /* 10 */ hi[ 5][slot] = SHIFT(t105); + /* 10 */ hi[ 5][slot] = SHIFT(t105); - t152 = MUL(t83 - t84, costab8); - t153 = MUL(t85 - t86, costab24); - t154 = t152 + t153; + t152 = MUL(t83 - t84, costab8); + t153 = MUL(t85 - t86, costab24); + t154 = t152 + t153; - t111 = (t154 * 2) - t87; + t111 = (t154 * 2) - t87; - t99 = (t111 * 2) - t88; + t99 = (t111 * 2) - t88; - /* 11 */ hi[ 4][slot] = SHIFT(t99); + /* 11 */ hi[ 4][slot] = SHIFT(t99); - t157 = MUL(t89 - t90, costab8); - t158 = MUL(t91 - t92, costab24); - t159 = t157 + t158; + t157 = MUL(t89 - t90, costab8); + t158 = MUL(t91 - t92, costab24); + t159 = t157 + t158; - t127 = (t159 * 2) - t93; + t127 = (t159 * 2) - t93; - /* 12 */ hi[ 3][slot] = SHIFT(t127); + /* 12 */ hi[ 3][slot] = SHIFT(t127); - t160 = (MUL(t125 - t126, costab16) * 2) - t127; + t160 = (MUL(t125 - t126, costab16) * 2) - t127; - /* 20 */ lo[ 4][slot] = SHIFT(t160); - /* 28 */ lo[12][slot] = - SHIFT((((MUL(t157 - t158, costab16) * 2) - t159) * 2) - t160); + /* 20 */ lo[ 4][slot] = SHIFT(t160); + /* 28 */ lo[12][slot] = + SHIFT((((MUL(t157 - t158, costab16) * 2) - t159) * 2) - t160); - t161 = MUL(t94 - t95, costab8); - t162 = MUL(t96 - t97, costab24); - t163 = t161 + t162; + t161 = MUL(t94 - t95, costab8); + t162 = MUL(t96 - t97, costab24); + t163 = t161 + t162; - t130 = (t163 * 2) - t98; + t130 = (t163 * 2) - t98; - t112 = (t130 * 2) - t99; + t112 = (t130 * 2) - t99; - /* 13 */ hi[ 2][slot] = SHIFT(t112); + /* 13 */ hi[ 2][slot] = SHIFT(t112); - t164 = (MUL(t128 - t129, costab16) * 2) - t130; + t164 = (MUL(t128 - t129, costab16) * 2) - t130; - t166 = MUL(t100 - t101, costab8); - t167 = MUL(t102 - t103, costab24); - t168 = t166 + t167; + t166 = MUL(t100 - t101, costab8); + t167 = MUL(t102 - t103, costab24); + t168 = t166 + t167; - t134 = (t168 * 2) - t104; + t134 = (t168 * 2) - t104; - t120 = (t134 * 2) - t105; + t120 = (t134 * 2) - t105; - /* 14 */ hi[ 1][slot] = SHIFT(t120); + /* 14 */ hi[ 1][slot] = SHIFT(t120); - t135 = (MUL(t118 - t119, costab16) * 2) - t120; + t135 = (MUL(t118 - t119, costab16) * 2) - t120; - /* 18 */ lo[ 2][slot] = SHIFT(t135); + /* 18 */ lo[ 2][slot] = SHIFT(t135); - t169 = (MUL(t132 - t133, costab16) * 2) - t134; + t169 = (MUL(t132 - t133, costab16) * 2) - t134; - t151 = (t169 * 2) - t135; + t151 = (t169 * 2) - t135; - /* 22 */ lo[ 6][slot] = SHIFT(t151); + /* 22 */ lo[ 6][slot] = SHIFT(t151); - t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151; + t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151; - /* 26 */ lo[10][slot] = SHIFT(t170); - /* 30 */ lo[14][slot] = - SHIFT((((((MUL(t166 - t167, costab16) * 2) - - t168) * 2) - t169) * 2) - t170); + /* 26 */ lo[10][slot] = SHIFT(t170); + /* 30 */ lo[14][slot] = + SHIFT((((((MUL(t166 - t167, costab16) * 2) - + t168) * 2) - t169) * 2) - t170); - t171 = MUL(t106 - t107, costab8); - t172 = MUL(t108 - t109, costab24); - t173 = t171 + t172; + t171 = MUL(t106 - t107, costab8); + t172 = MUL(t108 - t109, costab24); + t173 = t171 + t172; - t138 = (t173 * 2) - t110; + t138 = (t173 * 2) - t110; - t123 = (t138 * 2) - t111; + t123 = (t138 * 2) - t111; - t139 = (MUL(t121 - t122, costab16) * 2) - t123; + t139 = (MUL(t121 - t122, costab16) * 2) - t123; - t117 = (t123 * 2) - t112; + t117 = (t123 * 2) - t112; - /* 15 */ hi[ 0][slot] = SHIFT(t117); + /* 15 */ hi[ 0][slot] = SHIFT(t117); - t124 = (MUL(t115 - t116, costab16) * 2) - t117; + t124 = (MUL(t115 - t116, costab16) * 2) - t117; - /* 17 */ lo[ 1][slot] = SHIFT(t124); + /* 17 */ lo[ 1][slot] = SHIFT(t124); - t131 = (t139 * 2) - t124; + t131 = (t139 * 2) - t124; - /* 19 */ lo[ 3][slot] = SHIFT(t131); + /* 19 */ lo[ 3][slot] = SHIFT(t131); - t140 = (t164 * 2) - t131; + t140 = (t164 * 2) - t131; - /* 21 */ lo[ 5][slot] = SHIFT(t140); + /* 21 */ lo[ 5][slot] = SHIFT(t140); - t174 = (MUL(t136 - t137, costab16) * 2) - t138; + t174 = (MUL(t136 - t137, costab16) * 2) - t138; - t155 = (t174 * 2) - t139; + t155 = (t174 * 2) - t139; - t147 = (t155 * 2) - t140; + t147 = (t155 * 2) - t140; - /* 23 */ lo[ 7][slot] = SHIFT(t147); + /* 23 */ lo[ 7][slot] = SHIFT(t147); - t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147; + t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147; - /* 25 */ lo[ 9][slot] = SHIFT(t156); + /* 25 */ lo[ 9][slot] = SHIFT(t156); - t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155; + t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155; - t165 = (t175 * 2) - t156; + t165 = (t175 * 2) - t156; - /* 27 */ lo[11][slot] = SHIFT(t165); + /* 27 */ lo[11][slot] = SHIFT(t165); - t176 = (((((MUL(t161 - t162, costab16) * 2) - - t163) * 2) - t164) * 2) - t165; + t176 = (((((MUL(t161 - t162, costab16) * 2) - + t163) * 2) - t164) * 2) - t165; - /* 29 */ lo[13][slot] = SHIFT(t176); - /* 31 */ lo[15][slot] = - SHIFT((((((((MUL(t171 - t172, costab16) * 2) - - t173) * 2) - t174) * 2) - t175) * 2) - t176); + /* 29 */ lo[13][slot] = SHIFT(t176); + /* 31 */ lo[15][slot] = + SHIFT((((((((MUL(t171 - t172, costab16) * 2) - + t173) * 2) - t174) * 2) - t175) * 2) - t176); - /* - Totals: - 80 multiplies - 80 additions - 119 subtractions - 49 shifts (not counting SSO) - */ + /* + Totals: + 80 multiplies + 80 additions + 119 subtractions + 49 shifts (not counting SSO) + */ } # undef MUL @@ -572,359 +569,361 @@ void synth_full(struct mad_synth *, struct mad_frame const *, unsigned int, unsigned int); # else /* - NAME: synth->full() - DESCRIPTION: perform full frequency PCM synthesis + NAME: synth->full() + DESCRIPTION: perform full frequency PCM synthesis */ static enum mad_flow synth_full(struct mad_synth *synth, struct mad_frame const *frame, - unsigned int nch, unsigned int startns, unsigned int endns, - enum mad_flow (*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata) -{ - unsigned int phase, ch, s, sb, pe, po; - int16_t *pcm1, *pcm2; - mad_fixed_t (*filter)[2][2][16][8]; - mad_fixed_t const (*sbsample)[36][32]; - register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; - register mad_fixed_t const (*Dptr)[32], *ptr; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - stack(__FUNCTION__, __FILE__, __LINE__); - - for (unsigned int start = startns; start < endns; start ++) { - for (ch = 0; ch < nch; ++ch) { - sbsample = &frame->sbsample[ch]; - filter = &synth->filter[ch]; - phase = (synth->phase + start ) % 16; - pcm1 = synth->pcm.samples[ch];// + start * 32; - - for (s = start; s <= start; ++s) { - dct32((*sbsample)[s], phase >> 1, - (*filter)[0][phase & 1], (*filter)[1][phase & 1]); - - pe = phase & ~1; - po = ((phase - 1) & 0xf) | 1; - - /* calculate 32 samples */ - - fe = &(*filter)[0][ phase & 1][0]; - fx = &(*filter)[0][~phase & 1][0]; - fo = &(*filter)[1][~phase & 1][0]; - - Dptr = &D[0]; - - ptr = *Dptr + po; - ML0(hi, lo, (*fx)[0], ptr[ 0]); - MLA(hi, lo, (*fx)[1], ptr[14]); - MLA(hi, lo, (*fx)[2], ptr[12]); - MLA(hi, lo, (*fx)[3], ptr[10]); - MLA(hi, lo, (*fx)[4], ptr[ 8]); - MLA(hi, lo, (*fx)[5], ptr[ 6]); - MLA(hi, lo, (*fx)[6], ptr[ 4]); - MLA(hi, lo, (*fx)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[0], ptr[ 0]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[7], ptr[ 2]); - - *pcm1++ = scale(SHIFT(MLZ(hi, lo))); - - pcm2 = pcm1 + 30; - - for (sb = 1; sb < 16; ++sb) { - ++fe; - ++Dptr; - - /* D[32 - sb][i] == -D[sb][31 - i] */ - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[7], ptr[ 2]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[0], ptr[ 0]); - - *pcm1++ = scale(SHIFT(MLZ(hi, lo))); - - ptr = *Dptr - pe; - ML0(hi, lo, (*fe)[0], ptr[31 - 16]); - MLA(hi, lo, (*fe)[1], ptr[31 - 14]); - MLA(hi, lo, (*fe)[2], ptr[31 - 12]); - MLA(hi, lo, (*fe)[3], ptr[31 - 10]); - MLA(hi, lo, (*fe)[4], ptr[31 - 8]); - MLA(hi, lo, (*fe)[5], ptr[31 - 6]); - MLA(hi, lo, (*fe)[6], ptr[31 - 4]); - MLA(hi, lo, (*fe)[7], ptr[31 - 2]); - - ptr = *Dptr - po; - MLA(hi, lo, (*fo)[7], ptr[31 - 2]); - MLA(hi, lo, (*fo)[6], ptr[31 - 4]); - MLA(hi, lo, (*fo)[5], ptr[31 - 6]); - MLA(hi, lo, (*fo)[4], ptr[31 - 8]); - MLA(hi, lo, (*fo)[3], ptr[31 - 10]); - MLA(hi, lo, (*fo)[2], ptr[31 - 12]); - MLA(hi, lo, (*fo)[1], ptr[31 - 14]); - MLA(hi, lo, (*fo)[0], ptr[31 - 16]); - - *pcm2-- = scale(SHIFT(MLZ(hi, lo))); - - ++fo; + unsigned int nch, unsigned int startns, unsigned int endns, + enum mad_flow(*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata) { + unsigned int phase, ch, s, sb, pe, po; + int16_t *pcm1, *pcm2; + mad_fixed_t (*filter)[2][2][16][8]; + mad_fixed_t const(*sbsample)[36][32]; + register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; + register mad_fixed_t const(*Dptr)[32], *ptr; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + stackenter(__FUNCTION__, __FILE__, __LINE__); + + for (unsigned int start = startns; start < endns; start ++) { + for (ch = 0; ch < nch; ++ch) { + sbsample = &frame->sbsample[ch]; + filter = &synth->filter[ch]; + phase = (synth->phase + start) % 16; + pcm1 = synth->pcm.samples[ch];// + start * 32; + + for (s = start; s <= start; ++s) { + dct32((*sbsample)[s], phase >> 1, + (*filter)[0][phase & 1], (*filter)[1][phase & 1]); + + pe = phase & ~1; + po = ((phase - 1) & 0xf) | 1; + + /* calculate 32 samples */ + + fe = &(*filter)[0][ phase & 1][0]; + fx = &(*filter)[0][~phase & 1][0]; + fo = &(*filter)[1][~phase & 1][0]; + + Dptr = &D[0]; + + ptr = *Dptr + po; + ML0(hi, lo, (*fx)[0], ptr[ 0]); + MLA(hi, lo, (*fx)[1], ptr[14]); + MLA(hi, lo, (*fx)[2], ptr[12]); + MLA(hi, lo, (*fx)[3], ptr[10]); + MLA(hi, lo, (*fx)[4], ptr[ 8]); + MLA(hi, lo, (*fx)[5], ptr[ 6]); + MLA(hi, lo, (*fx)[6], ptr[ 4]); + MLA(hi, lo, (*fx)[7], ptr[ 2]); + MLN(hi, lo); + + ptr = *Dptr + pe; + MLA(hi, lo, (*fe)[0], ptr[ 0]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[7], ptr[ 2]); + + *pcm1++ = scale(SHIFT(MLZ(hi, lo))); + + pcm2 = pcm1 + 30; + + for (sb = 1; sb < 16; ++sb) { + ++fe; + ++Dptr; + + /* D[32 - sb][i] == -D[sb][31 - i] */ + + ptr = *Dptr + po; + ML0(hi, lo, (*fo)[0], ptr[ 0]); + MLA(hi, lo, (*fo)[1], ptr[14]); + MLA(hi, lo, (*fo)[2], ptr[12]); + MLA(hi, lo, (*fo)[3], ptr[10]); + MLA(hi, lo, (*fo)[4], ptr[ 8]); + MLA(hi, lo, (*fo)[5], ptr[ 6]); + MLA(hi, lo, (*fo)[6], ptr[ 4]); + MLA(hi, lo, (*fo)[7], ptr[ 2]); + MLN(hi, lo); + + ptr = *Dptr + pe; + MLA(hi, lo, (*fe)[7], ptr[ 2]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[0], ptr[ 0]); + + *pcm1++ = scale(SHIFT(MLZ(hi, lo))); + + ptr = *Dptr - pe; + ML0(hi, lo, (*fe)[0], ptr[31 - 16]); + MLA(hi, lo, (*fe)[1], ptr[31 - 14]); + MLA(hi, lo, (*fe)[2], ptr[31 - 12]); + MLA(hi, lo, (*fe)[3], ptr[31 - 10]); + MLA(hi, lo, (*fe)[4], ptr[31 - 8]); + MLA(hi, lo, (*fe)[5], ptr[31 - 6]); + MLA(hi, lo, (*fe)[6], ptr[31 - 4]); + MLA(hi, lo, (*fe)[7], ptr[31 - 2]); + + ptr = *Dptr - po; + MLA(hi, lo, (*fo)[7], ptr[31 - 2]); + MLA(hi, lo, (*fo)[6], ptr[31 - 4]); + MLA(hi, lo, (*fo)[5], ptr[31 - 6]); + MLA(hi, lo, (*fo)[4], ptr[31 - 8]); + MLA(hi, lo, (*fo)[3], ptr[31 - 10]); + MLA(hi, lo, (*fo)[2], ptr[31 - 12]); + MLA(hi, lo, (*fo)[1], ptr[31 - 14]); + MLA(hi, lo, (*fo)[0], ptr[31 - 16]); + + *pcm2-- = scale(SHIFT(MLZ(hi, lo))); + + ++fo; + } + + ++Dptr; + + ptr = *Dptr + po; + ML0(hi, lo, (*fo)[0], ptr[ 0]); + MLA(hi, lo, (*fo)[1], ptr[14]); + MLA(hi, lo, (*fo)[2], ptr[12]); + MLA(hi, lo, (*fo)[3], ptr[10]); + MLA(hi, lo, (*fo)[4], ptr[ 8]); + MLA(hi, lo, (*fo)[5], ptr[ 6]); + MLA(hi, lo, (*fo)[6], ptr[ 4]); + MLA(hi, lo, (*fo)[7], ptr[ 2]); + + *pcm1 = scale(SHIFT(-MLZ(hi, lo))); + pcm1 += 16; + + phase = (phase + 1) % 16; + } + } + if (output_func) { + enum mad_flow ret = output_func(cbdata, &frame->header, &synth->pcm); + if (ret != MAD_FLOW_CONTINUE) { + return ret; + } } - - ++Dptr; - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - - *pcm1 = scale(SHIFT(-MLZ(hi, lo))); - pcm1 += 16; - - phase = (phase + 1) % 16; - } - } - if (output_func) { - enum mad_flow ret = output_func(cbdata, &frame->header, &synth->pcm); - if (ret != MAD_FLOW_CONTINUE) return ret; } - } - return MAD_FLOW_CONTINUE; + return MAD_FLOW_CONTINUE; } # endif /* - NAME: synth->half() - DESCRIPTION: perform half frequency PCM synthesis + NAME: synth->half() + DESCRIPTION: perform half frequency PCM synthesis */ static enum mad_flow synth_half(struct mad_synth *synth, struct mad_frame const *frame, - unsigned int nch, unsigned int startns, unsigned int endns, - enum mad_flow (*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata ) -{ - unsigned int phase, ch, s, sb, pe, po; - int16_t *pcm1, *pcm2; - mad_fixed_t (*filter)[2][2][16][8]; - mad_fixed_t const (*sbsample)[36][32]; - register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; - register mad_fixed_t const (*Dptr)[32], *ptr; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - stack(__FUNCTION__, __FILE__, __LINE__); - for (unsigned int start = startns; start < endns; start ++) { - for (ch = 0; ch < nch; ++ch) { - sbsample = &frame->sbsample[ch]; - filter = &synth->filter[ch]; - phase = (synth->phase + start) % 16; - pcm1 = synth->pcm.samples[ch];// + start * 32; - - for (s = start; s <= start; ++s) { - dct32((*sbsample)[s], phase >> 1, - (*filter)[0][phase & 1], (*filter)[1][phase & 1]); - - pe = phase & ~1; - po = ((phase - 1) & 0xf) | 1; - - /* calculate 16 samples */ - - fe = &(*filter)[0][ phase & 1][0]; - fx = &(*filter)[0][~phase & 1][0]; - fo = &(*filter)[1][~phase & 1][0]; - - Dptr = &D[0]; - - ptr = *Dptr + po; - ML0(hi, lo, (*fx)[0], ptr[ 0]); - MLA(hi, lo, (*fx)[1], ptr[14]); - MLA(hi, lo, (*fx)[2], ptr[12]); - MLA(hi, lo, (*fx)[3], ptr[10]); - MLA(hi, lo, (*fx)[4], ptr[ 8]); - MLA(hi, lo, (*fx)[5], ptr[ 6]); - MLA(hi, lo, (*fx)[6], ptr[ 4]); - MLA(hi, lo, (*fx)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[0], ptr[ 0]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[7], ptr[ 2]); - - *pcm1++ = scale(SHIFT(MLZ(hi, lo))); - - pcm2 = pcm1 + 14; - - for (sb = 1; sb < 16; ++sb) { - ++fe; - ++Dptr; - - /* D[32 - sb][i] == -D[sb][31 - i] */ - - if (!(sb & 1)) { - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[7], ptr[ 2]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[0], ptr[ 0]); - - *pcm1++ = scale(SHIFT(MLZ(hi, lo))); - - ptr = *Dptr - po; - ML0(hi, lo, (*fo)[7], ptr[31 - 2]); - MLA(hi, lo, (*fo)[6], ptr[31 - 4]); - MLA(hi, lo, (*fo)[5], ptr[31 - 6]); - MLA(hi, lo, (*fo)[4], ptr[31 - 8]); - MLA(hi, lo, (*fo)[3], ptr[31 - 10]); - MLA(hi, lo, (*fo)[2], ptr[31 - 12]); - MLA(hi, lo, (*fo)[1], ptr[31 - 14]); - MLA(hi, lo, (*fo)[0], ptr[31 - 16]); - - ptr = *Dptr - pe; - MLA(hi, lo, (*fe)[0], ptr[31 - 16]); - MLA(hi, lo, (*fe)[1], ptr[31 - 14]); - MLA(hi, lo, (*fe)[2], ptr[31 - 12]); - MLA(hi, lo, (*fe)[3], ptr[31 - 10]); - MLA(hi, lo, (*fe)[4], ptr[31 - 8]); - MLA(hi, lo, (*fe)[5], ptr[31 - 6]); - MLA(hi, lo, (*fe)[6], ptr[31 - 4]); - MLA(hi, lo, (*fe)[7], ptr[31 - 2]); - - *pcm2-- = scale(SHIFT(MLZ(hi, lo))); - } - - ++fo; + unsigned int nch, unsigned int startns, unsigned int endns, + enum mad_flow(*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata) { + unsigned int phase, ch, s, sb, pe, po; + int16_t *pcm1, *pcm2; + mad_fixed_t (*filter)[2][2][16][8]; + mad_fixed_t const(*sbsample)[36][32]; + register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; + register mad_fixed_t const(*Dptr)[32], *ptr; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + stackenter(__FUNCTION__, __FILE__, __LINE__); + for (unsigned int start = startns; start < endns; start ++) { + for (ch = 0; ch < nch; ++ch) { + sbsample = &frame->sbsample[ch]; + filter = &synth->filter[ch]; + phase = (synth->phase + start) % 16; + pcm1 = synth->pcm.samples[ch];// + start * 32; + + for (s = start; s <= start; ++s) { + dct32((*sbsample)[s], phase >> 1, + (*filter)[0][phase & 1], (*filter)[1][phase & 1]); + + pe = phase & ~1; + po = ((phase - 1) & 0xf) | 1; + + /* calculate 16 samples */ + + fe = &(*filter)[0][ phase & 1][0]; + fx = &(*filter)[0][~phase & 1][0]; + fo = &(*filter)[1][~phase & 1][0]; + + Dptr = &D[0]; + + ptr = *Dptr + po; + ML0(hi, lo, (*fx)[0], ptr[ 0]); + MLA(hi, lo, (*fx)[1], ptr[14]); + MLA(hi, lo, (*fx)[2], ptr[12]); + MLA(hi, lo, (*fx)[3], ptr[10]); + MLA(hi, lo, (*fx)[4], ptr[ 8]); + MLA(hi, lo, (*fx)[5], ptr[ 6]); + MLA(hi, lo, (*fx)[6], ptr[ 4]); + MLA(hi, lo, (*fx)[7], ptr[ 2]); + MLN(hi, lo); + + ptr = *Dptr + pe; + MLA(hi, lo, (*fe)[0], ptr[ 0]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[7], ptr[ 2]); + + *pcm1++ = scale(SHIFT(MLZ(hi, lo))); + + pcm2 = pcm1 + 14; + + for (sb = 1; sb < 16; ++sb) { + ++fe; + ++Dptr; + + /* D[32 - sb][i] == -D[sb][31 - i] */ + + if (!(sb & 1)) { + ptr = *Dptr + po; + ML0(hi, lo, (*fo)[0], ptr[ 0]); + MLA(hi, lo, (*fo)[1], ptr[14]); + MLA(hi, lo, (*fo)[2], ptr[12]); + MLA(hi, lo, (*fo)[3], ptr[10]); + MLA(hi, lo, (*fo)[4], ptr[ 8]); + MLA(hi, lo, (*fo)[5], ptr[ 6]); + MLA(hi, lo, (*fo)[6], ptr[ 4]); + MLA(hi, lo, (*fo)[7], ptr[ 2]); + MLN(hi, lo); + + ptr = *Dptr + pe; + MLA(hi, lo, (*fe)[7], ptr[ 2]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[0], ptr[ 0]); + + *pcm1++ = scale(SHIFT(MLZ(hi, lo))); + + ptr = *Dptr - po; + ML0(hi, lo, (*fo)[7], ptr[31 - 2]); + MLA(hi, lo, (*fo)[6], ptr[31 - 4]); + MLA(hi, lo, (*fo)[5], ptr[31 - 6]); + MLA(hi, lo, (*fo)[4], ptr[31 - 8]); + MLA(hi, lo, (*fo)[3], ptr[31 - 10]); + MLA(hi, lo, (*fo)[2], ptr[31 - 12]); + MLA(hi, lo, (*fo)[1], ptr[31 - 14]); + MLA(hi, lo, (*fo)[0], ptr[31 - 16]); + + ptr = *Dptr - pe; + MLA(hi, lo, (*fe)[0], ptr[31 - 16]); + MLA(hi, lo, (*fe)[1], ptr[31 - 14]); + MLA(hi, lo, (*fe)[2], ptr[31 - 12]); + MLA(hi, lo, (*fe)[3], ptr[31 - 10]); + MLA(hi, lo, (*fe)[4], ptr[31 - 8]); + MLA(hi, lo, (*fe)[5], ptr[31 - 6]); + MLA(hi, lo, (*fe)[6], ptr[31 - 4]); + MLA(hi, lo, (*fe)[7], ptr[31 - 2]); + + *pcm2-- = scale(SHIFT(MLZ(hi, lo))); + } + + ++fo; + } + + ++Dptr; + + ptr = *Dptr + po; + ML0(hi, lo, (*fo)[0], ptr[ 0]); + MLA(hi, lo, (*fo)[1], ptr[14]); + MLA(hi, lo, (*fo)[2], ptr[12]); + MLA(hi, lo, (*fo)[3], ptr[10]); + MLA(hi, lo, (*fo)[4], ptr[ 8]); + MLA(hi, lo, (*fo)[5], ptr[ 6]); + MLA(hi, lo, (*fo)[6], ptr[ 4]); + MLA(hi, lo, (*fo)[7], ptr[ 2]); + + *pcm1 = scale(SHIFT(-MLZ(hi, lo))); + pcm1 += 8; + + phase = (phase + 1) % 16; + + } + } + if (output_func) { + enum mad_flow ret = output_func(cbdata, &frame->header, &synth->pcm); + if (ret != MAD_FLOW_CONTINUE) { + return ret; + } } - - ++Dptr; - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - - *pcm1 = scale(SHIFT(-MLZ(hi, lo))); - pcm1 += 8; - - phase = (phase + 1) % 16; - - } - } - if (output_func) { - enum mad_flow ret = output_func(cbdata, &frame->header, &synth->pcm); - if (ret != MAD_FLOW_CONTINUE) return ret; } - } - return MAD_FLOW_CONTINUE; + return MAD_FLOW_CONTINUE; } /* - NAME: synth->frame() - DESCRIPTION: perform PCM synthesis of frame subband samples + NAME: synth->frame() + DESCRIPTION: perform PCM synthesis of frame subband samples */ -enum mad_flow mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame, enum mad_flow (*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata) +enum mad_flow mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame, enum mad_flow(*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata) //void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame) { - unsigned int nch, ns; - enum mad_flow (*synth_frame)(struct mad_synth *, struct mad_frame const *, unsigned int, unsigned int, unsigned int, enum mad_flow (*output_func)(), void *); + unsigned int nch, ns; + enum mad_flow(*synth_frame)(struct mad_synth *, struct mad_frame const *, unsigned int, unsigned int, unsigned int, enum mad_flow(*output_func)(), void *); - nch = MAD_NCHANNELS(&frame->header); - ns = MAD_NSBSAMPLES(&frame->header); + nch = MAD_NCHANNELS(&frame->header); + ns = MAD_NSBSAMPLES(&frame->header); - synth->pcm.samplerate = frame->header.samplerate; - synth->pcm.channels = nch; - synth->pcm.length = 32;// * ns; + synth->pcm.samplerate = frame->header.samplerate; + synth->pcm.channels = nch; + synth->pcm.length = 32;// * ns; - synth_frame = synth_full; + synth_frame = synth_full; - if (frame->options & MAD_OPTION_HALFSAMPLERATE) { - synth->pcm.samplerate /= 2; - synth->pcm.length /= 2; + if (frame->options & MAD_OPTION_HALFSAMPLERATE) { + synth->pcm.samplerate /= 2; + synth->pcm.length /= 2; - synth_frame = synth_half; - } + synth_frame = synth_half; + } - enum mad_flow ret = synth_frame(synth, frame, nch, 0, ns, output_func, cbdata); + enum mad_flow ret = synth_frame(synth, frame, nch, 0, ns, output_func, cbdata); - synth->phase = (synth->phase + ns) % 16; + synth->phase = (synth->phase + ns) % 16; - return ret; + return ret; } // Synthesize a single NS of the frame, return in the synth->pcm.samples // Up to caller to increment synth->phase, only call proper # of ns -enum mad_flow mad_synth_frame_onens(struct mad_synth *synth, struct mad_frame const *frame, unsigned int ns) -{ - unsigned int nch; //, ns; - enum mad_flow (*synth_frame)(struct mad_synth *, struct mad_frame const *, unsigned int, unsigned int, unsigned int, enum mad_flow (*output_func)(), void *); +enum mad_flow mad_synth_frame_onens(struct mad_synth *synth, struct mad_frame const *frame, unsigned int ns) { + unsigned int nch; //, ns; + enum mad_flow(*synth_frame)(struct mad_synth *, struct mad_frame const *, unsigned int, unsigned int, unsigned int, enum mad_flow(*output_func)(), void *); - nch = MAD_NCHANNELS(&frame->header); -// ns = MAD_NSBSAMPLES(&frame->header); + nch = MAD_NCHANNELS(&frame->header); + // ns = MAD_NSBSAMPLES(&frame->header); - synth->pcm.samplerate = frame->header.samplerate; - synth->pcm.channels = nch; - synth->pcm.length = 32;// * ns; + synth->pcm.samplerate = frame->header.samplerate; + synth->pcm.channels = nch; + synth->pcm.length = 32;// * ns; - synth_frame = synth_full; + synth_frame = synth_full; - if (frame->options & MAD_OPTION_HALFSAMPLERATE) { - synth->pcm.samplerate /= 2; - synth->pcm.length /= 2; + if (frame->options & MAD_OPTION_HALFSAMPLERATE) { + synth->pcm.samplerate /= 2; + synth->pcm.length /= 2; - synth_frame = synth_half; - } - enum mad_flow ret = synth_frame(synth, frame, nch, ns, ns+1, NULL, NULL); + synth_frame = synth_half; + } + enum mad_flow ret = synth_frame(synth, frame, nch, ns, ns + 1, NULL, NULL); - if (ns==MAD_NSBSAMPLES(&frame->header)-1) - synth->phase = (synth->phase + MAD_NSBSAMPLES(&frame->header)) % 16; + if (ns == MAD_NSBSAMPLES(&frame->header) - 1) { + synth->phase = (synth->phase + MAD_NSBSAMPLES(&frame->header)) % 16; + } - return ret; + return ret; } diff --git a/src/libmad/synth.h b/src/libmad/synth.h index 3cdf9220..0f52349c 100644 --- a/src/libmad/synth.h +++ b/src/libmad/synth.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp $ +*/ # ifndef LIBMAD_SYNTH_H # define LIBMAD_SYNTH_H @@ -27,36 +27,36 @@ #include struct mad_pcm { - unsigned int samplerate; /* sampling frequency (Hz) */ - unsigned short channels; /* number of channels */ - unsigned short length; /* number of samples per channel */ - int16_t samples[2][32]; //1152]; /* PCM output samples [ch][sample] */ + unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned short channels; /* number of channels */ + unsigned short length; /* number of samples per channel */ + int16_t samples[2][32]; //1152]; /* PCM output samples [ch][sample] */ }; struct mad_synth { - mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ - /* [ch][eo][peo][s][v] */ + mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ + /* [ch][eo][peo][s][v] */ - unsigned int phase; /* current processing phase */ + unsigned int phase; /* current processing phase */ - struct mad_pcm pcm; /* PCM output */ + struct mad_pcm pcm; /* PCM output */ }; /* single channel PCM selector */ enum { - MAD_PCM_CHANNEL_SINGLE = 0 + MAD_PCM_CHANNEL_SINGLE = 0 }; /* dual channel PCM selector */ enum { - MAD_PCM_CHANNEL_DUAL_1 = 0, - MAD_PCM_CHANNEL_DUAL_2 = 1 + MAD_PCM_CHANNEL_DUAL_1 = 0, + MAD_PCM_CHANNEL_DUAL_2 = 1 }; /* stereo PCM selector */ enum { - MAD_PCM_CHANNEL_STEREO_LEFT = 0, - MAD_PCM_CHANNEL_STEREO_RIGHT = 1 + MAD_PCM_CHANNEL_STEREO_LEFT = 0, + MAD_PCM_CHANNEL_STEREO_RIGHT = 1 }; void mad_synth_init(struct mad_synth *); @@ -65,7 +65,7 @@ void mad_synth_init(struct mad_synth *); void mad_synth_mute(struct mad_synth *); -enum mad_flow mad_synth_frame(struct mad_synth *, struct mad_frame const *, enum mad_flow (*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata ); +enum mad_flow mad_synth_frame(struct mad_synth *, struct mad_frame const *, enum mad_flow(*output_func)(void *s, struct mad_header const *, struct mad_pcm *), void *cbdata); enum mad_flow mad_synth_frame_onens(struct mad_synth *synth, struct mad_frame const *frame, unsigned int ns); # endif diff --git a/src/libmad/timer.c b/src/libmad/timer.c index 6b434c9c..7bf777c7 100644 --- a/src/libmad/timer.c +++ b/src/libmad/timer.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: timer.c,v 1.18 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: timer.c,v 1.18 2004/01/23 09:41:33 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -36,450 +36,445 @@ mad_timer_t const mad_timer_zero = { 0, 0 }; /* - * NAME: timer->compare() - * DESCRIPTION: indicate relative order of two timers - */ -int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) -{ - signed long diff; - - diff = timer1.seconds - timer2.seconds; - if (diff < 0) - return -1; - else if (diff > 0) - return +1; - - diff = timer1.fraction - timer2.fraction; - if (diff < 0) - return -1; - else if (diff > 0) - return +1; - - return 0; + NAME: timer->compare() + DESCRIPTION: indicate relative order of two timers +*/ +int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) { + signed long diff; + + diff = timer1.seconds - timer2.seconds; + if (diff < 0) { + return -1; + } else if (diff > 0) { + return +1; + } + + diff = timer1.fraction - timer2.fraction; + if (diff < 0) { + return -1; + } else if (diff > 0) { + return +1; + } + + return 0; } /* - * NAME: timer->negate() - * DESCRIPTION: invert the sign of a timer - */ -void mad_timer_negate(mad_timer_t *timer) -{ - timer->seconds = -timer->seconds; - - if (timer->fraction) { - timer->seconds -= 1; - timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; - } + NAME: timer->negate() + DESCRIPTION: invert the sign of a timer +*/ +void mad_timer_negate(mad_timer_t *timer) { + timer->seconds = -timer->seconds; + + if (timer->fraction) { + timer->seconds -= 1; + timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; + } } /* - * NAME: timer->abs() - * DESCRIPTION: return the absolute value of a timer - */ -mad_timer_t mad_timer_abs(mad_timer_t timer) -{ - if (timer.seconds < 0) - mad_timer_negate(&timer); - - return timer; + NAME: timer->abs() + DESCRIPTION: return the absolute value of a timer +*/ +mad_timer_t mad_timer_abs(mad_timer_t timer) { + if (timer.seconds < 0) { + mad_timer_negate(&timer); + } + + return timer; } /* - * NAME: reduce_timer() - * DESCRIPTION: carry timer fraction into seconds - */ + NAME: reduce_timer() + DESCRIPTION: carry timer fraction into seconds +*/ static -void reduce_timer(mad_timer_t *timer) -{ - timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; - timer->fraction %= MAD_TIMER_RESOLUTION; +void reduce_timer(mad_timer_t *timer) { + timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; + timer->fraction %= MAD_TIMER_RESOLUTION; } /* - * NAME: gcd() - * DESCRIPTION: compute greatest common denominator - */ + NAME: gcd() + DESCRIPTION: compute greatest common denominator +*/ static -unsigned long gcd(unsigned long num1, unsigned long num2) -{ - unsigned long tmp; +unsigned long gcd(unsigned long num1, unsigned long num2) { + unsigned long tmp; - while (num2) { - tmp = num2; - num2 = num1 % num2; - num1 = tmp; - } + while (num2) { + tmp = num2; + num2 = num1 % num2; + num1 = tmp; + } - return num1; + return num1; } /* - * NAME: reduce_rational() - * DESCRIPTION: convert rational expression to lowest terms - */ + NAME: reduce_rational() + DESCRIPTION: convert rational expression to lowest terms +*/ static -void reduce_rational(unsigned long *numer, unsigned long *denom) -{ - unsigned long factor; +void reduce_rational(unsigned long *numer, unsigned long *denom) { + unsigned long factor; - factor = gcd(*numer, *denom); + factor = gcd(*numer, *denom); - assert(factor != 0); + assert(factor != 0); - *numer /= factor; - *denom /= factor; + *numer /= factor; + *denom /= factor; } /* - * NAME: scale_rational() - * DESCRIPTION: solve numer/denom == ?/scale avoiding overflowing - */ + NAME: scale_rational() + DESCRIPTION: solve numer/denom == ?/scale avoiding overflowing +*/ static unsigned long scale_rational(unsigned long numer, unsigned long denom, - unsigned long scale) -{ - reduce_rational(&numer, &denom); - reduce_rational(&scale, &denom); + unsigned long scale) { + reduce_rational(&numer, &denom); + reduce_rational(&scale, &denom); - assert(denom != 0); + assert(denom != 0); - if (denom < scale) - return numer * (scale / denom) + numer * (scale % denom) / denom; - if (denom < numer) - return scale * (numer / denom) + scale * (numer % denom) / denom; + if (denom < scale) { + return numer * (scale / denom) + numer * (scale % denom) / denom; + } + if (denom < numer) { + return scale * (numer / denom) + scale * (numer % denom) / denom; + } - return numer * scale / denom; + return numer * scale / denom; } /* - * NAME: timer->set() - * DESCRIPTION: set timer to specific (positive) value - */ + NAME: timer->set() + DESCRIPTION: set timer to specific (positive) value +*/ void mad_timer_set(mad_timer_t *timer, unsigned long seconds, - unsigned long numer, unsigned long denom) -{ - timer->seconds = seconds; - if (numer >= denom && denom > 0) { - timer->seconds += numer / denom; - numer %= denom; - } - - switch (denom) { - case 0: - case 1: - timer->fraction = 0; - break; + unsigned long numer, unsigned long denom) { + timer->seconds = seconds; + if (numer >= denom && denom > 0) { + timer->seconds += numer / denom; + numer %= denom; + } - case MAD_TIMER_RESOLUTION: - timer->fraction = numer; - break; + switch (denom) { + case 0: + case 1: + timer->fraction = 0; + break; - case 1000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); - break; + case MAD_TIMER_RESOLUTION: + timer->fraction = numer; + break; - case 8000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); - break; + case 1000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); + break; - case 11025: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); - break; + case 8000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); + break; - case 12000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); - break; + case 11025: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); + break; - case 16000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); - break; + case 12000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); + break; - case 22050: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); - break; + case 16000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); + break; - case 24000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); - break; + case 22050: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); + break; - case 32000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); - break; + case 24000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); + break; - case 44100: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); - break; + case 32000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); + break; - case 48000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); - break; + case 44100: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); + break; - default: - timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); - break; - } + case 48000: + timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); + break; + + default: + timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); + break; + } - if (timer->fraction >= MAD_TIMER_RESOLUTION) - reduce_timer(timer); + if (timer->fraction >= MAD_TIMER_RESOLUTION) { + reduce_timer(timer); + } } /* - * NAME: timer->add() - * DESCRIPTION: add one timer to another - */ -void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) -{ - timer->seconds += incr.seconds; - timer->fraction += incr.fraction; - - if (timer->fraction >= MAD_TIMER_RESOLUTION) - reduce_timer(timer); + NAME: timer->add() + DESCRIPTION: add one timer to another +*/ +void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) { + timer->seconds += incr.seconds; + timer->fraction += incr.fraction; + + if (timer->fraction >= MAD_TIMER_RESOLUTION) { + reduce_timer(timer); + } } /* - * NAME: timer->multiply() - * DESCRIPTION: multiply a timer by a scalar value - */ -void mad_timer_multiply(mad_timer_t *timer, signed long scalar) -{ - mad_timer_t addend; - unsigned long factor; - - factor = scalar; - if (scalar < 0) { - factor = -scalar; - mad_timer_negate(timer); - } - - addend = *timer; - *timer = mad_timer_zero; - - while (factor) { - if (factor & 1) - mad_timer_add(timer, addend); - - mad_timer_add(&addend, addend); - factor >>= 1; - } + NAME: timer->multiply() + DESCRIPTION: multiply a timer by a scalar value +*/ +void mad_timer_multiply(mad_timer_t *timer, signed long scalar) { + mad_timer_t addend; + unsigned long factor; + + factor = scalar; + if (scalar < 0) { + factor = -scalar; + mad_timer_negate(timer); + } + + addend = *timer; + *timer = mad_timer_zero; + + while (factor) { + if (factor & 1) { + mad_timer_add(timer, addend); + } + + mad_timer_add(&addend, addend); + factor >>= 1; + } } /* - * NAME: timer->count() - * DESCRIPTION: return timer value in selected units - */ -signed long mad_timer_count(mad_timer_t timer, enum mad_units units) -{ - switch (units) { - case MAD_UNITS_HOURS: - return timer.seconds / 60 / 60; - - case MAD_UNITS_MINUTES: - return timer.seconds / 60; - - case MAD_UNITS_SECONDS: - return timer.seconds; - - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - return timer.seconds * (signed long) units + - (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, - units); - - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; - } - - /* unsupported units */ - return 0; + NAME: timer->count() + DESCRIPTION: return timer value in selected units +*/ +signed long mad_timer_count(mad_timer_t timer, enum mad_units units) { + switch (units) { + case MAD_UNITS_HOURS: + return timer.seconds / 60 / 60; + + case MAD_UNITS_MINUTES: + return timer.seconds / 60; + + case MAD_UNITS_SECONDS: + return timer.seconds; + + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: + return timer.seconds * (signed long) units + + (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, + units); + + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; + } + + /* unsupported units */ + return 0; } /* - * NAME: timer->fraction() - * DESCRIPTION: return fractional part of timer in arbitrary terms - */ -unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) -{ - timer = mad_timer_abs(timer); - - switch (denom) { - case 0: - return timer.fraction ? - MAD_TIMER_RESOLUTION / timer.fraction : MAD_TIMER_RESOLUTION + 1; - - case MAD_TIMER_RESOLUTION: - return timer.fraction; - - default: - return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); - } + NAME: timer->fraction() + DESCRIPTION: return fractional part of timer in arbitrary terms +*/ +unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) { + timer = mad_timer_abs(timer); + + switch (denom) { + case 0: + return timer.fraction ? + MAD_TIMER_RESOLUTION / timer.fraction : MAD_TIMER_RESOLUTION + 1; + + case MAD_TIMER_RESOLUTION: + return timer.fraction; + + default: + return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); + } } /* - * NAME: timer->string() - * DESCRIPTION: write a string representation of a timer using a template - */ + NAME: timer->string() + DESCRIPTION: write a string representation of a timer using a template +*/ void mad_timer_string(mad_timer_t timer, - char *dest, char const *format, enum mad_units units, - enum mad_units fracunits, unsigned long subparts) -{ - unsigned long hours, minutes, seconds, sub; - unsigned int frac; - - timer = mad_timer_abs(timer); - - seconds = timer.seconds; - frac = sub = 0; - - switch (fracunits) { - case MAD_UNITS_HOURS: - case MAD_UNITS_MINUTES: - case MAD_UNITS_SECONDS: - break; - - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - { - unsigned long denom; - - denom = MAD_TIMER_RESOLUTION / fracunits; - - frac = timer.fraction / denom; - sub = scale_rational(timer.fraction % denom, denom, subparts); + char *dest, char const *format, enum mad_units units, + enum mad_units fracunits, unsigned long subparts) { + unsigned long hours, minutes, seconds, sub; + unsigned int frac; + + timer = mad_timer_abs(timer); + + seconds = timer.seconds; + frac = sub = 0; + + switch (fracunits) { + case MAD_UNITS_HOURS: + case MAD_UNITS_MINUTES: + case MAD_UNITS_SECONDS: + break; + + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: { + unsigned long denom; + + denom = MAD_TIMER_RESOLUTION / fracunits; + + frac = timer.fraction / denom; + sub = scale_rational(timer.fraction % denom, denom, subparts); } break; - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - /* drop-frame encoding */ - /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + /* drop-frame encoding */ + /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ { - unsigned long frame, cycle, d, m; + unsigned long frame, cycle, d, m; - frame = mad_timer_count(timer, fracunits); + frame = mad_timer_count(timer, fracunits); - cycle = -fracunits * 60 * 10 - (10 - 1) * 2; + cycle = -fracunits * 60 * 10 - (10 - 1) * 2; - d = frame / cycle; - m = frame % cycle; - frame += (10 - 1) * 2 * d; - if (m > 2) - frame += 2 * ((m - 2) / (cycle / 10)); + d = frame / cycle; + m = frame % cycle; + frame += (10 - 1) * 2 * d; + if (m > 2) { + frame += 2 * ((m - 2) / (cycle / 10)); + } - frac = frame % -fracunits; - seconds = frame / -fracunits; + frac = frame % -fracunits; + seconds = frame / -fracunits; } break; - } - - switch (units) { - case MAD_UNITS_HOURS: - minutes = seconds / 60; - hours = minutes / 60; - - sprintf(dest, format, - hours, - (unsigned int) (minutes % 60), - (unsigned int) (seconds % 60), - frac, sub); - break; - - case MAD_UNITS_MINUTES: - minutes = seconds / 60; - - sprintf(dest, format, - minutes, - (unsigned int) (seconds % 60), - frac, sub); - break; - - case MAD_UNITS_SECONDS: - sprintf(dest, format, - seconds, - frac, sub); - break; - - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - if (fracunits < 0) { - /* not yet implemented */ - sub = 0; } + switch (units) { + case MAD_UNITS_HOURS: + minutes = seconds / 60; + hours = minutes / 60; + + sprintf(dest, format, + hours, + (unsigned int)(minutes % 60), + (unsigned int)(seconds % 60), + frac, sub); + break; + + case MAD_UNITS_MINUTES: + minutes = seconds / 60; + + sprintf(dest, format, + minutes, + (unsigned int)(seconds % 60), + frac, sub); + break; + + case MAD_UNITS_SECONDS: + sprintf(dest, format, + seconds, + frac, sub); + break; + + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + if (fracunits < 0) { + /* not yet implemented */ + sub = 0; + } + /* fall through */ - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - sprintf(dest, format, mad_timer_count(timer, units), sub); - break; - } + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: + sprintf(dest, format, mad_timer_count(timer, units), sub); + break; + } } diff --git a/src/libmad/timer.h b/src/libmad/timer.h index eb4542bb..64afdd5f 100644 --- a/src/libmad/timer.h +++ b/src/libmad/timer.h @@ -1,30 +1,30 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp $ +*/ # ifndef LIBMAD_TIMER_H # define LIBMAD_TIMER_H typedef struct { - signed long seconds; /* whole seconds */ - unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ + signed long seconds; /* whole seconds */ + unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ } mad_timer_t; extern mad_timer_t const mad_timer_zero; @@ -32,51 +32,51 @@ extern mad_timer_t const mad_timer_zero; # define MAD_TIMER_RESOLUTION 352800000UL enum mad_units { - MAD_UNITS_HOURS = -2, - MAD_UNITS_MINUTES = -1, - MAD_UNITS_SECONDS = 0, + MAD_UNITS_HOURS = -2, + MAD_UNITS_MINUTES = -1, + MAD_UNITS_SECONDS = 0, - /* metric units */ + /* metric units */ - MAD_UNITS_DECISECONDS = 10, - MAD_UNITS_CENTISECONDS = 100, - MAD_UNITS_MILLISECONDS = 1000, + MAD_UNITS_DECISECONDS = 10, + MAD_UNITS_CENTISECONDS = 100, + MAD_UNITS_MILLISECONDS = 1000, - /* audio sample units */ + /* audio sample units */ - MAD_UNITS_8000_HZ = 8000, - MAD_UNITS_11025_HZ = 11025, - MAD_UNITS_12000_HZ = 12000, + MAD_UNITS_8000_HZ = 8000, + MAD_UNITS_11025_HZ = 11025, + MAD_UNITS_12000_HZ = 12000, - MAD_UNITS_16000_HZ = 16000, - MAD_UNITS_22050_HZ = 22050, - MAD_UNITS_24000_HZ = 24000, + MAD_UNITS_16000_HZ = 16000, + MAD_UNITS_22050_HZ = 22050, + MAD_UNITS_24000_HZ = 24000, - MAD_UNITS_32000_HZ = 32000, - MAD_UNITS_44100_HZ = 44100, - MAD_UNITS_48000_HZ = 48000, + MAD_UNITS_32000_HZ = 32000, + MAD_UNITS_44100_HZ = 44100, + MAD_UNITS_48000_HZ = 48000, - /* video frame/field units */ + /* video frame/field units */ - MAD_UNITS_24_FPS = 24, - MAD_UNITS_25_FPS = 25, - MAD_UNITS_30_FPS = 30, - MAD_UNITS_48_FPS = 48, - MAD_UNITS_50_FPS = 50, - MAD_UNITS_60_FPS = 60, + MAD_UNITS_24_FPS = 24, + MAD_UNITS_25_FPS = 25, + MAD_UNITS_30_FPS = 30, + MAD_UNITS_48_FPS = 48, + MAD_UNITS_50_FPS = 50, + MAD_UNITS_60_FPS = 60, - /* CD audio frames */ + /* CD audio frames */ - MAD_UNITS_75_FPS = 75, + MAD_UNITS_75_FPS = 75, - /* video drop-frame units */ + /* video drop-frame units */ - MAD_UNITS_23_976_FPS = -24, - MAD_UNITS_24_975_FPS = -25, - MAD_UNITS_29_97_FPS = -30, - MAD_UNITS_47_952_FPS = -48, - MAD_UNITS_49_95_FPS = -50, - MAD_UNITS_59_94_FPS = -60 + MAD_UNITS_23_976_FPS = -24, + MAD_UNITS_24_975_FPS = -25, + MAD_UNITS_29_97_FPS = -30, + MAD_UNITS_47_952_FPS = -48, + MAD_UNITS_49_95_FPS = -50, + MAD_UNITS_59_94_FPS = -60 }; # define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) @@ -95,6 +95,6 @@ void mad_timer_multiply(mad_timer_t *, signed long); signed long mad_timer_count(mad_timer_t, enum mad_units); unsigned long mad_timer_fraction(mad_timer_t, unsigned long); void mad_timer_string(mad_timer_t, char *, char const *, - enum mad_units, enum mad_units, unsigned long); + enum mad_units, enum mad_units, unsigned long); # endif diff --git a/src/libmad/version.c b/src/libmad/version.c index b1cf1d34..bb54e044 100644 --- a/src/libmad/version.c +++ b/src/libmad/version.c @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: version.c,v 1.15 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: version.c,v 1.15 2004/01/23 09:41:33 rob Exp $ +*/ #pragma GCC optimize ("O3") @@ -33,59 +33,59 @@ char const mad_author[] = MAD_AUTHOR " <" MAD_EMAIL ">"; char const mad_build[] = "" # if defined(DEBUG) - "DEBUG " + "DEBUG " # elif defined(NDEBUG) - "NDEBUG " + "NDEBUG " # endif # if defined(EXPERIMENTAL) - "EXPERIMENTAL " + "EXPERIMENTAL " # endif # if defined(FPM_64BIT) - "FPM_64BIT " + "FPM_64BIT " # elif defined(FPM_INTEL) - "FPM_INTEL " + "FPM_INTEL " # elif defined(FPM_ARM) - "FPM_ARM " + "FPM_ARM " # elif defined(FPM_MIPS) - "FPM_MIPS " + "FPM_MIPS " # elif defined(FPM_SPARC) - "FPM_SPARC " + "FPM_SPARC " # elif defined(FPM_PPC) - "FPM_PPC " + "FPM_PPC " # elif defined(FPM_DEFAULT) - "FPM_DEFAULT " + "FPM_DEFAULT " # endif # if defined(ASO_IMDCT) - "ASO_IMDCT " + "ASO_IMDCT " # endif # if defined(ASO_INTERLEAVE1) - "ASO_INTERLEAVE1 " + "ASO_INTERLEAVE1 " # endif # if defined(ASO_INTERLEAVE2) - "ASO_INTERLEAVE2 " + "ASO_INTERLEAVE2 " # endif # if defined(ASO_ZEROCHECK) - "ASO_ZEROCHECK " + "ASO_ZEROCHECK " # endif # if defined(OPT_SPEED) - "OPT_SPEED " + "OPT_SPEED " # elif defined(OPT_ACCURACY) - "OPT_ACCURACY " + "OPT_ACCURACY " # endif # if defined(OPT_SSO) - "OPT_SSO " + "OPT_SSO " # endif # if defined(OPT_DCTO) /* never defined here */ - "OPT_DCTO " + "OPT_DCTO " # endif # if defined(OPT_STRICT) - "OPT_STRICT " + "OPT_STRICT " # endif -; + ; diff --git a/src/libmad/version.h b/src/libmad/version.h index d215d4c1..8774f680 100644 --- a/src/libmad/version.h +++ b/src/libmad/version.h @@ -1,23 +1,23 @@ /* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2004 Underbit Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp $ - */ + libmad - MPEG audio decoder library + Copyright (C) 2000-2004 Underbit Technologies, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp $ +*/ # ifndef LIBMAD_VERSION_H # define LIBMAD_VERSION_H diff --git a/src/libopus/AUTHORS b/src/libopus/AUTHORS new file mode 100644 index 00000000..b3d22a20 --- /dev/null +++ b/src/libopus/AUTHORS @@ -0,0 +1,6 @@ +Jean-Marc Valin (jmvalin@jmvalin.ca) +Koen Vos (koenvos74@gmail.com) +Timothy Terriberry (tterribe@xiph.org) +Karsten Vandborg Sorensen (karsten.vandborg.sorensen@skype.net) +Soren Skak Jensen (ssjensen@gn.com) +Gregory Maxwell (greg@xiph.org) diff --git a/src/libopus/COPYING b/src/libopus/COPYING new file mode 100644 index 00000000..75711467 --- /dev/null +++ b/src/libopus/COPYING @@ -0,0 +1,44 @@ +Copyright 2001-2023 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo, Mozilla, Amazon + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- 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. + +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``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 COPYRIGHT OWNER +OR CONTRIBUTORS 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. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ diff --git a/src/libopus/LICENSE_PLEASE_READ.txt b/src/libopus/LICENSE_PLEASE_READ.txt new file mode 100644 index 00000000..bc88efa6 --- /dev/null +++ b/src/libopus/LICENSE_PLEASE_READ.txt @@ -0,0 +1,22 @@ +Contributions to the collaboration shall not be considered confidential. + +Each contributor represents and warrants that it has the right and +authority to license copyright in its contributions to the collaboration. + +Each contributor agrees to license the copyright in the contributions +under the Modified (2-clause or 3-clause) BSD License or the Clear BSD License. + +Please see the IPR statements submitted to the IETF for the complete +patent licensing details: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Skype Limited: +https://datatracker.ietf.org/ipr/1602/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ diff --git a/src/libopus/README b/src/libopus/README new file mode 100644 index 00000000..bcf2376d --- /dev/null +++ b/src/libopus/README @@ -0,0 +1,189 @@ +== Opus audio codec == + +Opus is a codec for interactive speech and audio transmission over the Internet. + + Opus can handle a wide range of interactive audio applications, including +Voice over IP, videoconferencing, in-game chat, and even remote live music +performances. It can scale from low bit-rate narrowband speech to very high +quality stereo music. + + Opus, when coupled with an appropriate container format, is also suitable +for non-realtime stored-file applications such as music distribution, game +soundtracks, portable music players, jukeboxes, and other applications that +have historically used high latency formats such as MP3, AAC, or Vorbis. + + Opus is specified by IETF RFC 6716: + https://tools.ietf.org/html/rfc6716 + + The Opus format and this implementation of it are subject to the royalty- +free patent and copyright licenses specified in the file COPYING. + +This package implements a shared library for encoding and decoding raw Opus +bitstreams. Raw Opus bitstreams should be used over RTP according to + https://tools.ietf.org/html/rfc7587 + +The package also includes a number of test tools used for testing the +correct operation of the library. The bitstreams read/written by these +tools should not be used for Opus file distribution: They include +additional debugging data and cannot support seeking. + +Opus stored in files should use the Ogg encapsulation for Opus which is +described at: + https://tools.ietf.org/html/rfc7845 + +An opus-tools package is available which provides encoding and decoding of +Ogg encapsulated Opus files and includes a number of useful features. + +Opus-tools can be found at: + https://gitlab.xiph.org/xiph/opus-tools.git +or on the main Opus website: + https://opus-codec.org/ + +== Deep Learning and Opus == + +Lossy networks continue to be a challenge for real-time communications. +While the original implementation of Opus provides an excellent packet loss +concealment mechanism, the team has continued to advance the methodology used +to improve audio quality in challenge network environments. + +In Opus 1.5, we added a deep learning based redundancy encoder that enhances +audio in lossy networks by embedding one second of recovery data in the padding +data of each packet. The underlying algorithm behind encoding and decoding the +recovery data is called the deep redundancy (DRED) algorithm. By leveraging +the padding data within the packet, Opus 1.5 is fully backward compatible with +prior revisions of Opus. Please see the README under the "dnn" subdirectory to +understand DRED. + +DRED was developed by a team that Amazon Web Services initially sponsored, +who open-sourced the implementation as well as began the +standardization process at the IETF: + https://datatracker.ietf.org/doc/draft-ietf-mlcodec-opus-extension/ +The license behind Opus or the intellectual property position of Opus does +not change with Opus 1.5. + +== Compiling libopus == + +To build from a distribution tarball, you only need to do the following: + + % ./configure + % make + +To build from the git repository, the following steps are necessary: + +0) Set up a development environment: + +On an Ubuntu or Debian family Linux distribution: + + % sudo apt-get install git autoconf automake libtool gcc make + +On a Fedora/Redhat based Linux: + + % sudo dnf install git autoconf automake libtool gcc make + +Or for older Redhat/Centos Linux releases: + + % sudo yum install git autoconf automake libtool gcc make + +On Apple macOS, install Xcode and brew.sh, then in the Terminal enter: + + % brew install autoconf automake libtool + +1) Clone the repository: + + % git clone https://gitlab.xiph.org/xiph/opus.git + % cd opus + +2) Compiling the source + + % ./autogen.sh + % ./configure + % make + +On x86, it's a good idea to use a -march= option that allows the use of AVX2. + +3) Install the codec libraries (optional) + + % sudo make install + +Once you have compiled the codec, there will be a opus_demo executable +in the top directory. + +Usage: opus_demo [-e] + [options] + opus_demo -d [options] + + +mode: voip | audio | restricted-lowdelay +options: + -e : only runs the encoder (output the bit-stream) + -d : only runs the decoder (reads the bit-stream as input) + -cbr : enable constant bitrate; default: variable bitrate + -cvbr : enable constrained variable bitrate; default: + unconstrained + -bandwidth + : audio bandwidth (from narrowband to fullband); + default: sampling rate + -framesize <2.5|5|10|20|40|60> + : frame size in ms; default: 20 + -max_payload + : maximum payload size in bytes, default: 1024 + -complexity + : complexity, 0 (lowest) ... 10 (highest); default: 10 + -inbandfec : enable SILK inband FEC + -forcemono : force mono encoding, even for stereo input + -dtx : enable SILK DTX + -loss : simulate packet loss, in percent (0-100); default: 0 + +input and output are little-endian signed 16-bit PCM files or opus +bitstreams with simple opus_demo proprietary framing. + +== Testing == + +This package includes a collection of automated unit and system tests +which SHOULD be run after compiling the package especially the first +time it is run on a new platform. + +To run the integrated tests: + + % make check + +There is also collection of standard test vectors which are not +included in this package for size reasons but can be obtained from: +https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz + +To run compare the code to these test vectors: + + % curl -OL https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz + % tar -zxf opus_testvectors-rfc8251.tar.gz + % ./tests/run_vectors.sh ./ opus_newvectors 48000 + +== Compiling libopus for Windows and alternative build systems == + +See cmake/README.md or meson/README.md. + +== Portability notes == + +This implementation uses floating-point by default but can be compiled to +use only fixed-point arithmetic by setting --enable-fixed-point (if using +autoconf) or by defining the FIXED_POINT macro (if building manually). +The fixed point implementation has somewhat lower audio quality and is +slower on platforms with fast FPUs, it is normally only used in embedded +environments. + +The implementation can be compiled with either a C89 or a C99 compiler. +While it does not rely on any _undefined behavior_ as defined by C89 or +C99, it relies on common _implementation-defined behavior_ for two's +complement architectures: + +o Right shifts of negative values are consistent with two's + complement arithmetic, so that a>>b is equivalent to + floor(a/(2^b)), + +o For conversion to a signed integer of N bits, the value is reduced + modulo 2^N to be within range of the type, + +o The result of integer division of a negative value is truncated + towards zero, and + +o The compiler provides a 64-bit integer type (a C99 requirement + which is supported by most C89 compilers). diff --git a/src/libopus/celt/_kiss_fft_guts.h b/src/libopus/celt/_kiss_fft_guts.h new file mode 100644 index 00000000..17392b3e --- /dev/null +++ b/src/libopus/celt/_kiss_fft_guts.h @@ -0,0 +1,182 @@ +/*Copyright (c) 2003-2004, Mark Borgerding + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 KISS_FFT_GUTS_H +#define KISS_FFT_GUTS_H + +#define MIN(a,b) ((a)<(b) ? (a):(b)) +#define MAX(a,b) ((a)>(b) ? (a):(b)) + +/* kiss_fft.h + defines kiss_fft_scalar as either short or a float type + and defines + typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ +#include "kiss_fft.h" + +/* + Explanation of macros dealing with complex math: + + C_MUL(m,a,b) : m = a*b + C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise + C_SUB( res, a,b) : res = a - b + C_SUBFROM( res , a) : res -= a + C_ADDTO( res , a) : res += a + * */ +#ifdef FIXED_POINT +#include "arch.h" + + +#define SAMP_MAX 2147483647 +#define TWID_MAX 32767 +#define TRIG_UPSCALE 1 + +#define SAMP_MIN -SAMP_MAX + + +# define S_MUL(a,b) MULT16_32_Q15(b, a) + +# define C_MUL(m,a,b) \ + do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) + +# define C_MULC(m,a,b) \ + do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) + +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r = S_MUL( (c).r , s ) ;\ + (c).i = S_MUL( (c).i , s ) ; }while(0) + +# define DIVSCALAR(x,k) \ + (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) + +# define C_FIXDIV(c,div) \ + do { DIVSCALAR( (c).r , div); \ + DIVSCALAR( (c).i , div); }while (0) + +#define C_ADD( res, a,b)\ + do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \ + }while(0) +#define C_SUB( res, a,b)\ + do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \ + }while(0) +#define C_ADDTO( res , a)\ + do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\ + }while(0) + +#define C_SUBFROM( res , a)\ + do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \ + }while(0) + +#if defined(OPUS_ARM_INLINE_ASM) +#include "arm/kiss_fft_armv4.h" +#endif + +#if defined(OPUS_ARM_INLINE_EDSP) +#include "arm/kiss_fft_armv5e.h" +#endif +#if defined(MIPSr1_ASM) +#include "mips/kiss_fft_mipsr1.h" +#endif + +#else /* not FIXED_POINT*/ + +# define S_MUL(a,b) ( (a)*(b) ) +#define C_MUL(m,a,b) \ + do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ + (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) +#define C_MULC(m,a,b) \ + do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ + (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) + +#define C_MUL4(m,a,b) C_MUL(m,a,b) + +# define C_FIXDIV(c,div) /* NOOP */ +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r *= (s);\ + (c).i *= (s); }while(0) +#endif + +#ifndef CHECK_OVERFLOW_OP +# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ +#endif + +#ifndef C_ADD +#define C_ADD( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,+,(b).r)\ + CHECK_OVERFLOW_OP((a).i,+,(b).i)\ + (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ + }while(0) +#define C_SUB( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,-,(b).r)\ + CHECK_OVERFLOW_OP((a).i,-,(b).i)\ + (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ + }while(0) +#define C_ADDTO( res , a)\ + do { \ + CHECK_OVERFLOW_OP((res).r,+,(a).r)\ + CHECK_OVERFLOW_OP((res).i,+,(a).i)\ + (res).r += (a).r; (res).i += (a).i;\ + }while(0) + +#define C_SUBFROM( res , a)\ + do {\ + CHECK_OVERFLOW_OP((res).r,-,(a).r)\ + CHECK_OVERFLOW_OP((res).i,-,(a).i)\ + (res).r -= (a).r; (res).i -= (a).i; \ + }while(0) +#endif /* C_ADD defined */ + +#ifdef FIXED_POINT +/*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) +# define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ +# define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) +# define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) +# define HALF_OF(x) ((x)>>1) +#elif defined(USE_SIMD) +# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) +# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) +# define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) +#else +# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) +# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) +# define HALF_OF(x) ((x)*.5f) +#endif + +#define kf_cexp(x,phase) \ + do{ \ + (x)->r = KISS_FFT_COS(phase);\ + (x)->i = KISS_FFT_SIN(phase);\ + }while(0) + +#define kf_cexp2(x,phase) \ + do{ \ + (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ + (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ +}while(0) + +#endif /* KISS_FFT_GUTS_H */ diff --git a/src/libopus/celt/arch.h b/src/libopus/celt/arch.h new file mode 100644 index 00000000..3845c3a0 --- /dev/null +++ b/src/libopus/celt/arch.h @@ -0,0 +1,291 @@ +/* Copyright (c) 2003-2008 Jean-Marc Valin + Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/** + @file arch.h + @brief Various architecture definitions for CELT +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 ARCH_H +#define ARCH_H + +#include "opus_types.h" +#include "opus_defines.h" + +# if !defined(__GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define __GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define __GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +#if OPUS_GNUC_PREREQ(3, 0) +#define opus_likely(x) (__builtin_expect(!!(x), 1)) +#define opus_unlikely(x) (__builtin_expect(!!(x), 0)) +#else +#define opus_likely(x) (!!(x)) +#define opus_unlikely(x) (!!(x)) +#endif + +#define CELT_SIG_SCALE 32768.f + +#define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__); + +#if defined(ENABLE_ASSERTIONS) || defined(ENABLE_HARDENING) +#ifdef __GNUC__ +__attribute__((noreturn)) +#endif +void celt_fatal(const char *str, const char *file, int line); + +#if defined(CELT_C) && !defined(OVERRIDE_celt_fatal) +#include +#include +#ifdef __GNUC__ +__attribute__((noreturn)) +#endif +void celt_fatal(const char *str, const char *file, int line) +{ + fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); +#if defined(_MSC_VER) + _set_abort_behavior( 0, _WRITE_ABORT_MSG); +#endif + abort(); +} +#endif + +#define celt_assert(cond) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond);}} +#define celt_assert2(cond, message) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond "\n" message);}} +#define MUST_SUCCEED(call) celt_assert((call) == OPUS_OK) +#else +#define celt_assert(cond) +#define celt_assert2(cond, message) +#define MUST_SUCCEED(call) do {if((call) != OPUS_OK) {RESTORE_STACK; return OPUS_INTERNAL_ERROR;} } while (0) +#endif + +#if defined(ENABLE_ASSERTIONS) +#define celt_sig_assert(cond) {if (!(cond)) {CELT_FATAL("signal assertion failed: " #cond);}} +#else +#define celt_sig_assert(cond) +#endif + +#define IMUL32(a,b) ((a)*(b)) + +#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ +#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ +#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ +#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ +#define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ +#define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ +#define UADD32(a,b) ((a)+(b)) +#define USUB32(a,b) ((a)-(b)) + +/* Set this if opus_int64 is a native type of the CPU. */ +/* Assume that all LP64 architectures have fast 64-bit types; also x86_64 + (which can be ILP32 for x32) and Win64 (which is LLP64). */ +#if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64) +#define OPUS_FAST_INT64 1 +#else +#define OPUS_FAST_INT64 0 +#endif + +#define PRINT_MIPS(file) + +#ifdef FIXED_POINT + +typedef opus_int16 opus_val16; +typedef opus_int32 opus_val32; +typedef opus_int64 opus_val64; + +typedef opus_val32 celt_sig; +typedef opus_val16 celt_norm; +typedef opus_val32 celt_ener; + +#define celt_isnan(x) 0 + +#define Q15ONE 32767 + +#define SIG_SHIFT 12 +/* Safe saturation value for 32-bit signals. Should be less than + 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ +#define SIG_SAT (300000000) + +#define NORM_SCALING 16384 + +#define DB_SHIFT 10 + +#define EPSILON 1 +#define VERY_SMALL 0 +#define VERY_LARGE16 ((opus_val16)32767) +#define Q15_ONE ((opus_val16)32767) + +#define SCALEIN(a) (a) +#define SCALEOUT(a) (a) + +#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) +#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) + +static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { + return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; +} + +#ifdef FIXED_DEBUG +#include "fixed_debug.h" +#else + +#include "fixed_generic.h" + +#ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR +#include "arm/fixed_arm64.h" +#elif defined (OPUS_ARM_INLINE_EDSP) +#include "arm/fixed_armv5e.h" +#elif defined (OPUS_ARM_INLINE_ASM) +#include "arm/fixed_armv4.h" +#elif defined (BFIN_ASM) +#include "fixed_bfin.h" +#elif defined (TI_C5X_ASM) +#include "fixed_c5x.h" +#elif defined (TI_C6X_ASM) +#include "fixed_c6x.h" +#endif + +#endif + +#else /* FIXED_POINT */ + +typedef float opus_val16; +typedef float opus_val32; +typedef float opus_val64; + +typedef float celt_sig; +typedef float celt_norm; +typedef float celt_ener; + +#ifdef FLOAT_APPROX +/* This code should reliably detect NaN/inf even when -ffast-math is used. + Assumes IEEE 754 format. */ +static OPUS_INLINE int celt_isnan(float x) +{ + union {float f; opus_uint32 i;} in; + in.f = x; + return ((in.i>>23)&0xFF)==0xFF && (in.i&0x007FFFFF)!=0; +} +#else +#ifdef __FAST_MATH__ +#error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input +#endif +#define celt_isnan(x) ((x)!=(x)) +#endif + +#define Q15ONE 1.0f + +#define NORM_SCALING 1.f + +#define EPSILON 1e-15f +#define VERY_SMALL 1e-30f +#define VERY_LARGE16 1e15f +#define Q15_ONE ((opus_val16)1.f) + +/* This appears to be the same speed as C99's fabsf() but it's more portable. */ +#define ABS16(x) ((float)fabs(x)) +#define ABS32(x) ((float)fabs(x)) + +#define QCONST16(x,bits) (x) +#define QCONST32(x,bits) (x) + +#define NEG16(x) (-(x)) +#define NEG32(x) (-(x)) +#define NEG32_ovflw(x) (-(x)) +#define EXTRACT16(x) (x) +#define EXTEND32(x) (x) +#define SHR16(a,shift) (a) +#define SHL16(a,shift) (a) +#define SHR32(a,shift) (a) +#define SHL32(a,shift) (a) +#define PSHR32(a,shift) (a) +#define VSHR32(a,shift) (a) + +#define PSHR(a,shift) (a) +#define SHR(a,shift) (a) +#define SHL(a,shift) (a) +#define SATURATE(x,a) (x) +#define SATURATE16(x) (x) + +#define ROUND16(a,shift) (a) +#define SROUND16(a,shift) (a) +#define HALF16(x) (.5f*(x)) +#define HALF32(x) (.5f*(x)) + +#define ADD16(a,b) ((a)+(b)) +#define SUB16(a,b) ((a)-(b)) +#define ADD32(a,b) ((a)+(b)) +#define SUB32(a,b) ((a)-(b)) +#define ADD32_ovflw(a,b) ((a)+(b)) +#define SUB32_ovflw(a,b) ((a)-(b)) +#define MULT16_16_16(a,b) ((a)*(b)) +#define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) +#define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) + +#define MULT16_32_Q15(a,b) ((a)*(b)) +#define MULT16_32_Q16(a,b) ((a)*(b)) + +#define MULT32_32_Q31(a,b) ((a)*(b)) + +#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) +#define MAC16_32_Q16(c,a,b) ((c)+(a)*(b)) + +#define MULT16_16_Q11_32(a,b) ((a)*(b)) +#define MULT16_16_Q11(a,b) ((a)*(b)) +#define MULT16_16_Q13(a,b) ((a)*(b)) +#define MULT16_16_Q14(a,b) ((a)*(b)) +#define MULT16_16_Q15(a,b) ((a)*(b)) +#define MULT16_16_P15(a,b) ((a)*(b)) +#define MULT16_16_P13(a,b) ((a)*(b)) +#define MULT16_16_P14(a,b) ((a)*(b)) +#define MULT16_32_P16(a,b) ((a)*(b)) + +#define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) +#define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) + +#define SCALEIN(a) ((a)*CELT_SIG_SCALE) +#define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) + +#define SIG2WORD16(x) (x) + +#endif /* !FIXED_POINT */ + +#ifndef GLOBAL_STACK_SIZE +#ifdef FIXED_POINT +#define GLOBAL_STACK_SIZE 120000 +#else +#define GLOBAL_STACK_SIZE 120000 +#endif +#endif + +#endif /* ARCH_H */ diff --git a/src/libopus/celt/bands.c b/src/libopus/celt/bands.c new file mode 100644 index 00000000..979a13b7 --- /dev/null +++ b/src/libopus/celt/bands.c @@ -0,0 +1,1673 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008-2009 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include +#include "bands.h" +#include "modes.h" +#include "vq.h" +#include "cwrs.h" +#include "stack_alloc.h" +#include "os_support.h" +#include "mathops.h" +#include "rate.h" +#include "quant_bands.h" +#include "pitch.h" + +int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev) +{ + int i; + for (i=0;iprev && val < thresholds[prev]+hysteresis[prev]) + i=prev; + if (i thresholds[prev-1]-hysteresis[prev-1]) + i=prev; + return i; +} + +opus_uint32 celt_lcg_rand(opus_uint32 seed) +{ + return 1664525 * seed + 1013904223; +} + +/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness + with this approximation is important because it has an impact on the bit allocation */ +opus_int16 bitexact_cos(opus_int16 x) +{ + opus_int32 tmp; + opus_int16 x2; + tmp = (4096+((opus_int32)(x)*(x)))>>13; + celt_sig_assert(tmp<=32767); + x2 = tmp; + x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); + celt_sig_assert(x2<=32766); + return 1+x2; +} + +int bitexact_log2tan(int isin,int icos) +{ + int lc; + int ls; + lc=EC_ILOG(icos); + ls=EC_ILOG(isin); + icos<<=15-lc; + isin<<=15-ls; + return (ls-lc)*(1<<11) + +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) + -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); +} + +#ifdef FIXED_POINT +/* Compute the amplitude (sqrt energy) in each of the bands */ +void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) +{ + int i, c, N; + const opus_int16 *eBands = m->eBands; + (void)arch; + N = m->shortMdctSize< 0) + { + int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>1); + j=eBands[i]<0) + { + do { + sum = MAC16_16(sum, EXTRACT16(SHR32(X[j+c*N],shift)), + EXTRACT16(SHR32(X[j+c*N],shift))); + } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); + } else { + bandE[i+c*m->nbEBands] = EPSILON; + } + /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ + } + } while (++ceBands; + N = M*m->shortMdctSize; + c=0; do { + i=0; do { + opus_val16 g; + int j,shift; + opus_val16 E; + shift = celt_zlog2(bandE[i+c*m->nbEBands])-13; + E = VSHR32(bandE[i+c*m->nbEBands], shift); + g = EXTRACT16(celt_rcp(SHL32(E,3))); + j=M*eBands[i]; do { + X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); + } while (++jeBands; + N = m->shortMdctSize<nbEBands] = celt_sqrt(sum); + /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ + } + } while (++ceBands; + N = M*m->shortMdctSize; + c=0; do { + for (i=0;inbEBands]); + for (j=M*eBands[i];jeBands; + N = M*m->shortMdctSize; + bound = M*eBands[end]; + if (downsample!=1) + bound = IMIN(bound, N/downsample); + if (silence) + { + bound = 0; + start = end = 0; + } + f = freq; + x = X+M*eBands[start]; + for (i=0;i>DB_SHIFT); + if (shift>31) + { + shift=0; + g=0; + } else { + /* Handle the fractional part. */ + g = celt_exp2_frac(lg&((1< 16384 we'd be likely to overflow, so we're + capping the gain here, which is equivalent to a cap of 18 on lg. + This shouldn't trigger unless the bitstream is already corrupted. */ + if (shift <= -2) + { + g = 16384; + shift = -2; + } + do { + *f++ = SHL32(MULT16_16(*x++, g), -shift); + } while (++jeBands[i+1]-m->eBands[i]; + /* depth in 1/8 bits */ + celt_sig_assert(pulses[i]>=0); + depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; + +#ifdef FIXED_POINT + thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); + thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32)); + { + opus_val32 t; + t = N0<>1; + t = SHL32(t, (7-shift)<<1); + sqrt_1 = celt_rsqrt_norm(t); + } +#else + thresh = .5f*celt_exp2(-.125f*depth); + sqrt_1 = celt_rsqrt(N0<nbEBands+i]; + prev2 = prev2logE[c*m->nbEBands+i]; + if (C==1) + { + prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]); + prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); + } + Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2)); + Ediff = MAX32(0, Ediff); + +#ifdef FIXED_POINT + if (Ediff < 16384) + { + opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1); + r = 2*MIN16(16383,r32); + } else { + r = 0; + } + if (LM==3) + r = MULT16_16_Q14(23170, MIN32(23169, r)); + r = SHR16(MIN16(thresh, r),1); + r = SHR32(MULT16_16_Q15(sqrt_1, r),shift); +#else + /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because + short blocks don't have the same energy as long */ + r = 2.f*celt_exp2(-Ediff); + if (LM==3) + r *= 1.41421356f; + r = MIN16(thresh, r); + r = r*sqrt_1; +#endif + X = X_+c*size+(m->eBands[i]<nbEBands]))-13; +#endif + left = VSHR32(bandE[i],shift); + right = VSHR32(bandE[i+m->nbEBands],shift); + norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); + a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); + a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); + for (j=0;j>1; + kr = celt_ilog2(Er)>>1; +#endif + t = VSHR32(El, (kl-7)<<1); + lgain = celt_rsqrt_norm(t); + t = VSHR32(Er, (kr-7)<<1); + rgain = celt_rsqrt_norm(t); + +#ifdef FIXED_POINT + if (kl < 7) + kl = 7; + if (kr < 7) + kr = 7; +#endif + + for (j=0;jeBands; + int decision; + int hf_sum=0; + + celt_assert(end>0); + + N0 = M*m->shortMdctSize; + + if (M*(eBands[end]-eBands[end-1]) <= 8) + return SPREAD_NONE; + c=0; do { + for (i=0;im->nbEBands-4) + hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); + tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); + sum += tmp*spread_weight[i]; + nbBands+=spread_weight[i]; + } + } while (++cnbEBands+end)); + *hf_average = (*hf_average+hf_sum)>>1; + hf_sum = *hf_average; + if (*tapset_decision==2) + hf_sum += 4; + else if (*tapset_decision==0) + hf_sum -= 4; + if (hf_sum > 22) + *tapset_decision=2; + else if (hf_sum > 18) + *tapset_decision=1; + else + *tapset_decision=0; + } + /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ + celt_assert(nbBands>0); /* end has to be non-zero */ + celt_assert(sum>=0); + sum = celt_udiv((opus_int32)sum<<8, nbBands); + /* Recursive averaging */ + sum = (sum+*average)>>1; + *average = sum; + /* Hysteresis */ + sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; + if (sum < 80) + { + decision = SPREAD_AGGRESSIVE; + } else if (sum < 256) + { + decision = SPREAD_NORMAL; + } else if (sum < 384) + { + decision = SPREAD_LIGHT; + } else { + decision = SPREAD_NONE; + } +#ifdef FUZZING + decision = rand()&0x3; + *tapset_decision=rand()%3; +#endif + return decision; +} + +/* Indexing table for converting from natural Hadamard to ordery Hadamard + This is essentially a bit-reversed Gray, on top of which we've added + an inversion of the order because we want the DC at the end rather than + the beginning. The lines are for N=2, 4, 8, 16 */ +static const int ordery_table[] = { + 1, 0, + 3, 0, 2, 1, + 7, 0, 4, 3, 6, 1, 5, 2, + 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, +}; + +static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) +{ + int i,j; + VARDECL(celt_norm, tmp); + int N; + SAVE_STACK; + N = N0*stride; + ALLOC(tmp, N, celt_norm); + celt_assert(stride>0); + if (hadamard) + { + const int *ordery = ordery_table+stride-2; + for (i=0;i>= 1; + for (i=0;i>1)) { + qn = 1; + } else { + qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); + qn = (qn+1)>>1<<1; + } + celt_assert(qn <= 256); + return qn; +} + +struct band_ctx { + int encode; + int resynth; + const CELTMode *m; + int i; + int intensity; + int spread; + int tf_change; + ec_ctx *ec; + opus_int32 remaining_bits; + const celt_ener *bandE; + opus_uint32 seed; + int arch; + int theta_round; + int disable_inv; + int avoid_split_noise; +}; + +struct split_ctx { + int inv; + int imid; + int iside; + int delta; + int itheta; + int qalloc; +}; + +static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, + celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0, + int LM, + int stereo, int *fill) +{ + int qn; + int itheta=0; + int delta; + int imid, iside; + int qalloc; + int pulse_cap; + int offset; + opus_int32 tell; + int inv=0; + int encode; + const CELTMode *m; + int i; + int intensity; + ec_ctx *ec; + const celt_ener *bandE; + + encode = ctx->encode; + m = ctx->m; + i = ctx->i; + intensity = ctx->intensity; + ec = ctx->ec; + bandE = ctx->bandE; + + /* Decide on the resolution to give to the split parameter theta */ + pulse_cap = m->logN[i]+LM*(1<>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); + qn = compute_qn(N, *b, offset, pulse_cap, stereo); + if (stereo && i>=intensity) + qn = 1; + if (encode) + { + /* theta is the atan() of the ratio between the (normalized) + side and mid. With just that parameter, we can re-scale both + mid and side because we know that 1) they have unit norm and + 2) they are orthogonal. */ + itheta = stereo_itheta(X, Y, stereo, N, ctx->arch); + } + tell = ec_tell_frac(ec); + if (qn!=1) + { + if (encode) + { + if (!stereo || ctx->theta_round == 0) + { + itheta = (itheta*(opus_int32)qn+8192)>>14; + if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn) + { + /* Check if the selected value of theta will cause the bit allocation + to inject noise on one side. If so, make sure the energy of that side + is zero. */ + int unquantized = celt_udiv((opus_int32)itheta*16384, qn); + imid = bitexact_cos((opus_int16)unquantized); + iside = bitexact_cos((opus_int16)(16384-unquantized)); + delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); + if (delta > *b) + itheta = qn; + else if (delta < -*b) + itheta = 0; + } + } else { + int down; + /* Bias quantization towards itheta=0 and itheta=16384. */ + int bias = itheta > 8192 ? 32767/qn : -32767/qn; + down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14)); + if (ctx->theta_round < 0) + itheta = down; + else + itheta = down+1; + } + } + /* Entropy coding of the angle. We use a uniform pdf for the + time split, a step for stereo, and a triangular one for the rest. */ + if (stereo && N>2) + { + int p0 = 3; + int x = itheta; + int x0 = qn/2; + int ft = p0*(x0+1) + x0; + /* Use a probability of p0 up to itheta=8192 and then use 1 after */ + if (encode) + { + ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); + } else { + int fs; + fs=ec_decode(ec,ft); + if (fs<(x0+1)*p0) + x=fs/p0; + else + x=x0+1+(fs-(x0+1)*p0); + ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); + itheta = x; + } + } else if (B0>1 || stereo) { + /* Uniform pdf */ + if (encode) + ec_enc_uint(ec, itheta, qn+1); + else + itheta = ec_dec_uint(ec, qn+1); + } else { + int fs=1, ft; + ft = ((qn>>1)+1)*((qn>>1)+1); + if (encode) + { + int fl; + + fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; + fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 : + ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); + + ec_encode(ec, fl, fl+fs, ft); + } else { + /* Triangular pdf */ + int fl=0; + int fm; + fm = ec_decode(ec, ft); + + if (fm < ((qn>>1)*((qn>>1) + 1)>>1)) + { + itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1; + fs = itheta + 1; + fl = itheta*(itheta + 1)>>1; + } + else + { + itheta = (2*(qn + 1) + - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; + fs = qn + 1 - itheta; + fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); + } + + ec_dec_update(ec, fl, fl+fs, ft); + } + } + celt_assert(itheta>=0); + itheta = celt_udiv((opus_int32)itheta*16384, qn); + if (encode && stereo) + { + if (itheta==0) + intensity_stereo(m, X, Y, bandE, i, N); + else + stereo_split(X, Y, N); + } + /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. + Let's do that at higher complexity */ + } else if (stereo) { + if (encode) + { + inv = itheta > 8192 && !ctx->disable_inv; + if (inv) + { + int j; + for (j=0;j2<remaining_bits > 2<disable_inv) + inv = 0; + itheta = 0; + } + qalloc = ec_tell_frac(ec) - tell; + *b -= qalloc; + + if (itheta == 0) + { + imid = 32767; + iside = 0; + *fill &= (1<inv = inv; + sctx->imid = imid; + sctx->iside = iside; + sctx->delta = delta; + sctx->itheta = itheta; + sctx->qalloc = qalloc; +} +static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, + celt_norm *lowband_out) +{ + int c; + int stereo; + celt_norm *x = X; + int encode; + ec_ctx *ec; + + encode = ctx->encode; + ec = ctx->ec; + + stereo = Y != NULL; + c=0; do { + int sign=0; + if (ctx->remaining_bits>=1<remaining_bits -= 1<resynth) + x[0] = sign ? -NORM_SCALING : NORM_SCALING; + x = Y; + } while (++c<1+stereo); + if (lowband_out) + lowband_out[0] = SHR16(X[0],4); + return 1; +} + +/* This function is responsible for encoding and decoding a mono partition. + It can split the band in two and transmit the energy difference with + the two half-bands. It can be called recursively so bands can end up being + split in 8 parts. */ +static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, + int N, int b, int B, celt_norm *lowband, + int LM, + opus_val16 gain, int fill) +{ + const unsigned char *cache; + int q; + int curr_bits; + int imid=0, iside=0; + int B0=B; + opus_val16 mid=0, side=0; + unsigned cm=0; + celt_norm *Y=NULL; + int encode; + const CELTMode *m; + int i; + int spread; + ec_ctx *ec; + + encode = ctx->encode; + m = ctx->m; + i = ctx->i; + spread = ctx->spread; + ec = ctx->ec; + + /* If we need 1.5 more bit than we can produce, split the band in two. */ + cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; + if (LM != -1 && b > cache[cache[0]]+12 && N>2) + { + int mbits, sbits, delta; + int itheta; + int qalloc; + struct split_ctx sctx; + celt_norm *next_lowband2=NULL; + opus_int32 rebalance; + + N >>= 1; + Y = X+N; + LM -= 1; + if (B==1) + fill = (fill&1)|(fill<<1); + B = (B+1)>>1; + + compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); + imid = sctx.imid; + iside = sctx.iside; + delta = sctx.delta; + itheta = sctx.itheta; + qalloc = sctx.qalloc; +#ifdef FIXED_POINT + mid = imid; + side = iside; +#else + mid = (1.f/32768)*imid; + side = (1.f/32768)*iside; +#endif + + /* Give more bits to low-energy MDCTs than they would otherwise deserve */ + if (B0>1 && (itheta&0x3fff)) + { + if (itheta > 8192) + /* Rough approximation for pre-echo masking */ + delta -= delta>>(4-LM); + else + /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ + delta = IMIN(0, delta + (N<>(5-LM))); + } + mbits = IMAX(0, IMIN(b, (b-delta)/2)); + sbits = b-mbits; + ctx->remaining_bits -= qalloc; + + if (lowband) + next_lowband2 = lowband+N; /* >32-bit split case */ + + rebalance = ctx->remaining_bits; + if (mbits >= sbits) + { + cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, + MULT16_16_P15(gain,mid), fill); + rebalance = mbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<>B)<<(B0>>1); + } else { + cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, + MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); + rebalance = sbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<remaining_bits -= curr_bits; + + /* Ensures we can never bust the budget */ + while (ctx->remaining_bits < 0 && q > 0) + { + ctx->remaining_bits += curr_bits; + q--; + curr_bits = pulses2bits(m, i, LM, q); + ctx->remaining_bits -= curr_bits; + } + + if (q!=0) + { + int K = get_pulses(q); + + /* Finally do the actual quantization */ + if (encode) + { + cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); + } else { + cm = alg_unquant(X, N, K, spread, B, ec, gain); + } + } else { + /* If there's no pulse, fill the band anyway */ + int j; + if (ctx->resynth) + { + unsigned cm_mask; + /* B can be as large as 16, so this shift might overflow an int on a + 16-bit platform; use a long to get defined behavior.*/ + cm_mask = (unsigned)(1UL<seed = celt_lcg_rand(ctx->seed); + X[j] = (celt_norm)((opus_int32)ctx->seed>>20); + } + cm = cm_mask; + } else { + /* Folded spectrum */ + for (j=0;jseed = celt_lcg_rand(ctx->seed); + /* About 48 dB below the "normal" folding level */ + tmp = QCONST16(1.0f/256, 10); + tmp = (ctx->seed)&0x8000 ? tmp : -tmp; + X[j] = lowband[j]+tmp; + } + cm = fill; + } + renormalise_vector(X, N, gain, ctx->arch); + } + } + } + } + + return cm; +} + + +/* This function is responsible for encoding and decoding a band for the mono case. */ +static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, + int N, int b, int B, celt_norm *lowband, + int LM, celt_norm *lowband_out, + opus_val16 gain, celt_norm *lowband_scratch, int fill) +{ + int N0=N; + int N_B=N; + int N_B0; + int B0=B; + int time_divide=0; + int recombine=0; + int longBlocks; + unsigned cm=0; + int k; + int encode; + int tf_change; + + encode = ctx->encode; + tf_change = ctx->tf_change; + + longBlocks = B0==1; + + N_B = celt_udiv(N_B, B); + + /* Special case for one sample */ + if (N==1) + { + return quant_band_n1(ctx, X, NULL, lowband_out); + } + + if (tf_change>0) + recombine = tf_change; + /* Band recombining to increase frequency resolution */ + + if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1)) + { + OPUS_COPY(lowband_scratch, lowband, N); + lowband = lowband_scratch; + } + + for (k=0;k>k, 1<>k, 1<>4]<<2; + } + B>>=recombine; + N_B<<=recombine; + + /* Increasing the time resolution */ + while ((N_B&1) == 0 && tf_change<0) + { + if (encode) + haar1(X, N_B, B); + if (lowband) + haar1(lowband, N_B, B); + fill |= fill<>= 1; + time_divide++; + tf_change++; + } + B0=B; + N_B0 = N_B; + + /* Reorganize the samples in time order instead of frequency order */ + if (B0>1) + { + if (encode) + deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<resynth) + { + /* Undo the sample reorganization going from time order to frequency order */ + if (B0>1) + interleave_hadamard(X, N_B>>recombine, B0<>= 1; + N_B <<= 1; + cm |= cm>>B; + haar1(X, N_B, B); + } + + for (k=0;k>k, 1<encode; + ec = ctx->ec; + + /* Special case for one sample */ + if (N==1) + { + return quant_band_n1(ctx, X, Y, lowband_out); + } + + orig_fill = fill; + + compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); + inv = sctx.inv; + imid = sctx.imid; + iside = sctx.iside; + delta = sctx.delta; + itheta = sctx.itheta; + qalloc = sctx.qalloc; +#ifdef FIXED_POINT + mid = imid; + side = iside; +#else + mid = (1.f/32768)*imid; + side = (1.f/32768)*iside; +#endif + + /* This is a special case for N=2 that only works for stereo and takes + advantage of the fact that mid and side are orthogonal to encode + the side with just one bit. */ + if (N==2) + { + int c; + int sign=0; + celt_norm *x2, *y2; + mbits = b; + sbits = 0; + /* Only need one bit for the side. */ + if (itheta != 0 && itheta != 16384) + sbits = 1< 8192; + ctx->remaining_bits -= qalloc+sbits; + + x2 = c ? Y : X; + y2 = c ? X : Y; + if (sbits) + { + if (encode) + { + /* Here we only need to encode a sign for the side. */ + sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; + ec_enc_bits(ec, sign, 1); + } else { + sign = ec_dec_bits(ec, 1); + } + } + sign = 1-2*sign; + /* We use orig_fill here because we want to fold the side, but if + itheta==16384, we'll have cleared the low bits of fill. */ + cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, + lowband_scratch, orig_fill); + /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), + and there's no need to worry about mixing with the other channel. */ + y2[0] = -sign*x2[1]; + y2[1] = sign*x2[0]; + if (ctx->resynth) + { + celt_norm tmp; + X[0] = MULT16_16_Q15(mid, X[0]); + X[1] = MULT16_16_Q15(mid, X[1]); + Y[0] = MULT16_16_Q15(side, Y[0]); + Y[1] = MULT16_16_Q15(side, Y[1]); + tmp = X[0]; + X[0] = SUB16(tmp,Y[0]); + Y[0] = ADD16(tmp,Y[0]); + tmp = X[1]; + X[1] = SUB16(tmp,Y[1]); + Y[1] = ADD16(tmp,Y[1]); + } + } else { + /* "Normal" split code */ + opus_int32 rebalance; + + mbits = IMAX(0, IMIN(b, (b-delta)/2)); + sbits = b-mbits; + ctx->remaining_bits -= qalloc; + + rebalance = ctx->remaining_bits; + if (mbits >= sbits) + { + /* In stereo mode, we do not apply a scaling to the mid because we need the normalized + mid for folding later. */ + cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, + lowband_scratch, fill); + rebalance = mbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<>B); + } else { + /* For a stereo split, the high bits of fill are always zero, so no + folding will be done to the side. */ + cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); + rebalance = sbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<resynth) + { + if (N!=2) + stereo_merge(X, Y, mid, N, ctx->arch); + if (inv) + { + int j; + for (j=0;jeBands; + n1 = M*(eBands[start+1]-eBands[start]); + n2 = M*(eBands[start+2]-eBands[start+1]); + /* Duplicate enough of the first band folding data to be able to fold the second band. + Copies no data for CELT-only mode. */ + OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1); + if (dual_stereo) + OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1); +} +#endif + +void quant_all_bands(int encode, const CELTMode *m, int start, int end, + celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, + const celt_ener *bandE, int *pulses, int shortBlocks, int spread, + int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, + opus_int32 balance, ec_ctx *ec, int LM, int codedBands, + opus_uint32 *seed, int complexity, int arch, int disable_inv) +{ + int i; + opus_int32 remaining_bits; + const opus_int16 * OPUS_RESTRICT eBands = m->eBands; + celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; + VARDECL(celt_norm, _norm); + VARDECL(celt_norm, _lowband_scratch); + VARDECL(celt_norm, X_save); + VARDECL(celt_norm, Y_save); + VARDECL(celt_norm, X_save2); + VARDECL(celt_norm, Y_save2); + VARDECL(celt_norm, norm_save2); + int resynth_alloc; + celt_norm *lowband_scratch; + int B; + int M; + int lowband_offset; + int update_lowband = 1; + int C = Y_ != NULL ? 2 : 1; + int norm_offset; + int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8; +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !encode || theta_rdo; +#endif + struct band_ctx ctx; + SAVE_STACK; + + M = 1<nbEBands-1]-norm_offset), celt_norm); + norm = _norm; + norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset; + + /* For decoding, we can use the last band as scratch space because we don't need that + scratch space for the last band and we don't care about the data there until we're + decoding the last band. */ + if (encode && resynth) + resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]); + else + resynth_alloc = ALLOC_NONE; + ALLOC(_lowband_scratch, resynth_alloc, celt_norm); + if (encode && resynth) + lowband_scratch = _lowband_scratch; + else + lowband_scratch = X_+M*eBands[m->effEBands-1]; + ALLOC(X_save, resynth_alloc, celt_norm); + ALLOC(Y_save, resynth_alloc, celt_norm); + ALLOC(X_save2, resynth_alloc, celt_norm); + ALLOC(Y_save2, resynth_alloc, celt_norm); + ALLOC(norm_save2, resynth_alloc, celt_norm); + + lowband_offset = 0; + ctx.bandE = bandE; + ctx.ec = ec; + ctx.encode = encode; + ctx.intensity = intensity; + ctx.m = m; + ctx.seed = *seed; + ctx.spread = spread; + ctx.arch = arch; + ctx.disable_inv = disable_inv; + ctx.resynth = resynth; + ctx.theta_round = 0; + /* Avoid injecting noise in the first band on transients. */ + ctx.avoid_split_noise = B > 1; + for (i=start;i 0); + tell = ec_tell_frac(ec); + + /* Compute how many bits we want to allocate to this band */ + if (i != start) + balance -= tell; + remaining_bits = total_bits-tell-1; + ctx.remaining_bits = remaining_bits; + if (i <= codedBands-1) + { + curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i)); + b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance))); + } else { + b = 0; + } + +#ifndef DISABLE_UPDATE_DRAFT + if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) + lowband_offset = i; + if (i == start+1) + special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); +#else + if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) + lowband_offset = i; +#endif + + tf_change = tf_res[i]; + ctx.tf_change = tf_change; + if (i>=m->effEBands) + { + X=norm; + if (Y_!=NULL) + Y = norm; + lowband_scratch = NULL; + } + if (last && !theta_rdo) + lowband_scratch = NULL; + + /* Get a conservative estimate of the collapse_mask's for the bands we're + going to be folding from. */ + if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0)) + { + int fold_start; + int fold_end; + int fold_i; + /* This ensures we never repeat spectral content within one band */ + effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N); + fold_start = lowband_offset; + while(M*eBands[--fold_start] > effective_lowband+norm_offset); + fold_end = lowband_offset-1; +#ifndef DISABLE_UPDATE_DRAFT + while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N); +#else + while(M*eBands[++fold_end] < effective_lowband+norm_offset+N); +#endif + x_cm = y_cm = 0; + fold_i = fold_start; do { + x_cm |= collapse_masks[fold_i*C+0]; + y_cm |= collapse_masks[fold_i*C+C-1]; + } while (++fold_inbEBands], w); + /* Make a copy. */ + cm = x_cm|y_cm; + ec_save = *ec; + ctx_save = ctx; + OPUS_COPY(X_save, X, N); + OPUS_COPY(Y_save, Y, N); + /* Encode and round down. */ + ctx.theta_round = -1; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); + dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); + + /* Save first result. */ + cm2 = x_cm; + ec_save2 = *ec; + ctx_save2 = ctx; + OPUS_COPY(X_save2, X, N); + OPUS_COPY(Y_save2, Y, N); + if (!last) + OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N); + nstart_bytes = ec_save.offs; + nend_bytes = ec_save.storage; + bytes_buf = ec_save.buf+nstart_bytes; + save_bytes = nend_bytes-nstart_bytes; + OPUS_COPY(bytes_save, bytes_buf, save_bytes); + + /* Restore */ + *ec = ec_save; + ctx = ctx_save; + OPUS_COPY(X, X_save, N); + OPUS_COPY(Y, Y_save, N); +#ifndef DISABLE_UPDATE_DRAFT + if (i == start+1) + special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); +#endif + /* Encode and round up. */ + ctx.theta_round = 1; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); + dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); + if (dist0 >= dist1) { + x_cm = cm2; + *ec = ec_save2; + ctx = ctx_save2; + OPUS_COPY(X, X_save2, N); + OPUS_COPY(Y, Y_save2, N); + if (!last) + OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N); + OPUS_COPY(bytes_buf, bytes_save, save_bytes); + } + } else { + ctx.theta_round = 0; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); + } + } else { + x_cm = quant_band(&ctx, X, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); + } + y_cm = x_cm; + } + collapse_masks[i*C+0] = (unsigned char)x_cm; + collapse_masks[i*C+C-1] = (unsigned char)y_cm; + balance += pulses[i] + tell; + + /* Update the folding position only as long as we have 1 bit/sample depth. */ + update_lowband = b>(N< +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + +#ifndef PACKAGE_VERSION +#define PACKAGE_VERSION "unknown" +#endif + +#if defined(MIPSr1_ASM) +#include "mips/celt_mipsr1.h" +#endif + + +int resampling_factor(opus_int32 rate) +{ + int ret; + switch (rate) + { + case 48000: + ret = 1; + break; + case 24000: + ret = 2; + break; + case 16000: + ret = 3; + break; + case 12000: + ret = 4; + break; + case 8000: + ret = 6; + break; + default: +#ifndef CUSTOM_MODES + celt_assert(0); +#endif + ret = 0; + break; + } + return ret; +} + +#if !defined(OVERRIDE_COMB_FILTER_CONST) || defined(NON_STATIC_COMB_FILTER_CONST_C) +/* This version should be faster on ARM */ +#ifdef OPUS_ARM_ASM +#ifndef NON_STATIC_COMB_FILTER_CONST_C +static +#endif +void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, + opus_val16 g10, opus_val16 g11, opus_val16 g12) +{ + opus_val32 x0, x1, x2, x3, x4; + int i; + x4 = SHL32(x[-T-2], 1); + x3 = SHL32(x[-T-1], 1); + x2 = SHL32(x[-T], 1); + x1 = SHL32(x[-T+1], 1); + for (i=0;inbEBands;i++) + { + int N; + N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; + } +} + + + +const char *opus_strerror(int error) +{ + static const char * const error_strings[8] = { + "success", + "invalid argument", + "buffer too small", + "internal error", + "corrupted stream", + "request not implemented", + "invalid state", + "memory allocation failed" + }; + if (error > 0 || error < -7) + return "unknown error"; + else + return error_strings[-error]; +} + +const char *opus_get_version_string(void) +{ + return "libopus " PACKAGE_VERSION + /* Applications may rely on the presence of this substring in the version + string to determine if they have a fixed-point or floating-point build + at runtime. */ +#ifdef FIXED_POINT + "-fixed" +#endif +#ifdef FUZZING + "-fuzzing" +#endif + ; +} diff --git a/src/libopus/celt/celt.h b/src/libopus/celt/celt.h new file mode 100644 index 00000000..2f501951 --- /dev/null +++ b/src/libopus/celt/celt.h @@ -0,0 +1,252 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/** + @file celt.h + @brief Contains all the functions for encoding and decoding audio + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 CELT_H +#define CELT_H + +#include "opus_types.h" +#include "opus_defines.h" +#include "opus_custom.h" +#include "entenc.h" +#include "entdec.h" +#include "arch.h" + +#ifdef ENABLE_DEEP_PLC +#include "lpcnet.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define CELTEncoder OpusCustomEncoder +#define CELTDecoder OpusCustomDecoder +#define CELTMode OpusCustomMode + +#define LEAK_BANDS 19 + +typedef struct { + int valid; + float tonality; + float tonality_slope; + float noisiness; + float activity; + float music_prob; + float music_prob_min; + float music_prob_max; + int bandwidth; + float activity_probability; + float max_pitch_ratio; + /* Store as Q6 char to save space. */ + unsigned char leak_boost[LEAK_BANDS]; +} AnalysisInfo; + +typedef struct { + int signalType; + int offset; +} SILKInfo; + +#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) + +#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr))) + +#define __celt_check_silkinfo_ptr(ptr) ((ptr) + ((ptr) - (const SILKInfo*)(ptr))) + +/* Encoder/decoder Requests */ + + +#define CELT_SET_PREDICTION_REQUEST 10002 +/** Controls the use of interframe prediction. + 0=Independent frames + 1=Short term interframe prediction allowed + 2=Long term prediction allowed + */ +#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x) + +#define CELT_SET_INPUT_CLIPPING_REQUEST 10004 +#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x) + +#define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007 +#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x) + +#define CELT_SET_CHANNELS_REQUEST 10008 +#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x) + + +/* Internal */ +#define CELT_SET_START_BAND_REQUEST 10010 +#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x) + +#define CELT_SET_END_BAND_REQUEST 10012 +#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x) + +#define CELT_GET_MODE_REQUEST 10015 +/** Get the CELTMode used by an encoder or decoder */ +#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, __celt_check_mode_ptr_ptr(x) + +#define CELT_SET_SIGNALLING_REQUEST 10016 +#define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x) + +#define CELT_SET_TONALITY_REQUEST 10018 +#define CELT_SET_TONALITY(x) CELT_SET_TONALITY_REQUEST, __opus_check_int(x) +#define CELT_SET_TONALITY_SLOPE_REQUEST 10020 +#define CELT_SET_TONALITY_SLOPE(x) CELT_SET_TONALITY_SLOPE_REQUEST, __opus_check_int(x) + +#define CELT_SET_ANALYSIS_REQUEST 10022 +#define CELT_SET_ANALYSIS(x) CELT_SET_ANALYSIS_REQUEST, __celt_check_analysis_ptr(x) + +#define OPUS_SET_LFE_REQUEST 10024 +#define OPUS_SET_LFE(x) OPUS_SET_LFE_REQUEST, __opus_check_int(x) + +#define OPUS_SET_ENERGY_MASK_REQUEST 10026 +#define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x) + +#define CELT_SET_SILK_INFO_REQUEST 10028 +#define CELT_SET_SILK_INFO(x) CELT_SET_SILK_INFO_REQUEST, __celt_check_silkinfo_ptr(x) + +/* Encoder stuff */ + +int celt_encoder_get_size(int channels); + +int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); + +int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, + int arch); + + + +/* Decoder stuff */ + +int celt_decoder_get_size(int channels); + + +int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels); + +int celt_decode_with_ec_dred(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, + int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum +#ifdef ENABLE_DEEP_PLC + ,LPCNetPLCState *lpcnet +#endif + ); + +int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, + int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum); + +#define celt_encoder_ctl opus_custom_encoder_ctl +#define celt_decoder_ctl opus_custom_decoder_ctl + + +#ifdef CUSTOM_MODES +#define OPUS_CUSTOM_NOSTATIC +#else +#define OPUS_CUSTOM_NOSTATIC static OPUS_INLINE +#endif + +static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; +/* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ +static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; + +static const unsigned char tapset_icdf[3]={2,1,0}; + +#ifdef CUSTOM_MODES +static const unsigned char toOpusTable[20] = { + 0xE0, 0xE8, 0xF0, 0xF8, + 0xC0, 0xC8, 0xD0, 0xD8, + 0xA0, 0xA8, 0xB0, 0xB8, + 0x00, 0x00, 0x00, 0x00, + 0x80, 0x88, 0x90, 0x98, +}; + +static const unsigned char fromOpusTable[16] = { + 0x80, 0x88, 0x90, 0x98, + 0x40, 0x48, 0x50, 0x58, + 0x20, 0x28, 0x30, 0x38, + 0x00, 0x08, 0x10, 0x18 +}; + +static OPUS_INLINE int toOpus(unsigned char c) +{ + int ret=0; + if (c<0xA0) + ret = toOpusTable[c>>3]; + if (ret == 0) + return -1; + else + return ret|(c&0x7); +} + +static OPUS_INLINE int fromOpus(unsigned char c) +{ + if (c<0x80) + return -1; + else + return fromOpusTable[(c>>3)-16] | (c&0x7); +} +#endif /* CUSTOM_MODES */ + +#define COMBFILTER_MAXPERIOD 1024 +#define COMBFILTER_MINPERIOD 15 + +extern const signed char tf_select_table[4][8]; + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +void validate_celt_decoder(CELTDecoder *st); +#define VALIDATE_CELT_DECODER(st) validate_celt_decoder(st) +#else +#define VALIDATE_CELT_DECODER(st) +#endif + +int resampling_factor(opus_int32 rate); + +void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, + int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip); + +void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, + opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, + const opus_val16 *window, int overlap, int arch); + +void init_caps(const CELTMode *m,int *cap,int LM,int C); + +#ifdef RESYNTH +void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, int accum); +void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], + opus_val16 *oldBandE, int start, int effEnd, int C, int CC, int isTransient, + int LM, int downsample, int silence, int arch); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* CELT_H */ diff --git a/src/libopus/celt/celt_decoder.c b/src/libopus/celt/celt_decoder.c new file mode 100644 index 00000000..3e50eb2e --- /dev/null +++ b/src/libopus/celt/celt_decoder.c @@ -0,0 +1,1591 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2010 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#define CELT_DECODER_C + +#include "cpu_support.h" +#include "os_support.h" +#include "mdct.h" +#include +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + +#ifdef ENABLE_DEEP_PLC +#include "lpcnet.h" +#include "lpcnet_private.h" +#endif + +/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save + CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The + current value corresponds to a pitch of 66.67 Hz. */ +#define PLC_PITCH_LAG_MAX (720) +/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a + pitch of 480 Hz. */ +#define PLC_PITCH_LAG_MIN (100) + +/**********************************************************************/ +/* */ +/* DECODER */ +/* */ +/**********************************************************************/ +#define DECODE_BUFFER_SIZE 2048 + +#define PLC_UPDATE_FRAMES 4 +#define PLC_UPDATE_SAMPLES (PLC_UPDATE_FRAMES*FRAME_SIZE) + +/** Decoder state + @brief Decoder state + */ +struct OpusCustomDecoder { + const OpusCustomMode *mode; + int overlap; + int channels; + int stream_channels; + + int downsample; + int start, end; + int signalling; + int disable_inv; + int complexity; + int arch; + + /* Everything beyond this point gets cleared on a reset */ +#define DECODER_RESET_START rng + + opus_uint32 rng; + int error; + int last_pitch_index; + int loss_duration; + int skip_plc; + int postfilter_period; + int postfilter_period_old; + opus_val16 postfilter_gain; + opus_val16 postfilter_gain_old; + int postfilter_tapset; + int postfilter_tapset_old; + int prefilter_and_fold; + + celt_sig preemph_memD[2]; + +#ifdef ENABLE_DEEP_PLC + opus_int16 plc_pcm[PLC_UPDATE_SAMPLES]; + int plc_fill; + float plc_preemphasis_mem; +#endif + + celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ + /* opus_val16 lpc[], Size = channels*CELT_LPC_ORDER */ + /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */ + /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */ + /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */ + /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ +}; + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +/* Make basic checks on the CELT state to ensure we don't end + up writing all over memory. */ +void validate_celt_decoder(CELTDecoder *st) +{ +#ifndef CUSTOM_MODES + celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL)); + celt_assert(st->overlap == 120); + celt_assert(st->end <= 21); +#else +/* From Section 4.3 in the spec: "The normal CELT layer uses 21 of those bands, + though Opus Custom (see Section 6.2) may use a different number of bands" + + Check if it's within the maximum number of Bark frequency bands instead */ + celt_assert(st->end <= 25); +#endif + celt_assert(st->channels == 1 || st->channels == 2); + celt_assert(st->stream_channels == 1 || st->stream_channels == 2); + celt_assert(st->downsample > 0); + celt_assert(st->start == 0 || st->start == 17); + celt_assert(st->start < st->end); +#ifdef OPUS_ARCHMASK + celt_assert(st->arch >= 0); + celt_assert(st->arch <= OPUS_ARCHMASK); +#endif + celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX); + celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0); + celt_assert(st->postfilter_period < MAX_PERIOD); + celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0); + celt_assert(st->postfilter_period_old < MAX_PERIOD); + celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0); + celt_assert(st->postfilter_tapset <= 2); + celt_assert(st->postfilter_tapset >= 0); + celt_assert(st->postfilter_tapset_old <= 2); + celt_assert(st->postfilter_tapset_old >= 0); +} +#endif + +int celt_decoder_get_size(int channels) +{ + const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + return opus_custom_decoder_get_size(mode, channels); +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) +{ + int size = sizeof(struct CELTDecoder) + + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) + + channels*CELT_LPC_ORDER*sizeof(opus_val16) + + 4*2*mode->nbEBands*sizeof(opus_val16); + return size; +} + +#ifdef CUSTOM_MODES +CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) +{ + int ret; + CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); + ret = opus_custom_decoder_init(st, mode, channels); + if (ret != OPUS_OK) + { + opus_custom_decoder_destroy(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} +#endif /* CUSTOM_MODES */ + +int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) +{ + int ret; + ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); + if (ret != OPUS_OK) + return ret; + st->downsample = resampling_factor(sampling_rate); + if (st->downsample==0) + return OPUS_BAD_ARG; + else + return OPUS_OK; +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) +{ + if (channels < 0 || channels > 2) + return OPUS_BAD_ARG; + + if (st==NULL) + return OPUS_ALLOC_FAIL; + + OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); + + st->mode = mode; + st->overlap = mode->overlap; + st->stream_channels = st->channels = channels; + + st->downsample = 1; + st->start = 0; + st->end = st->mode->effEBands; + st->signalling = 1; +#ifndef DISABLE_UPDATE_DRAFT + st->disable_inv = channels == 1; +#else + st->disable_inv = 0; +#endif + st->arch = opus_select_arch(); + + opus_custom_decoder_ctl(st, OPUS_RESET_STATE); + + return OPUS_OK; +} + +#ifdef CUSTOM_MODES +void opus_custom_decoder_destroy(CELTDecoder *st) +{ + opus_free(st); +} +#endif /* CUSTOM_MODES */ + +#ifndef CUSTOM_MODES +/* Special case for stereo with no downsampling and no accumulation. This is + quite common and we can make it faster by processing both channels in the + same loop, reducing overhead due to the dependency loop in the IIR filter. */ +static void deemphasis_stereo_simple(celt_sig *in[], opus_val16 *pcm, int N, const opus_val16 coef0, + celt_sig *mem) +{ + celt_sig * OPUS_RESTRICT x0; + celt_sig * OPUS_RESTRICT x1; + celt_sig m0, m1; + int j; + x0=in[0]; + x1=in[1]; + m0 = mem[0]; + m1 = mem[1]; + for (j=0;j1) + { + /* Shortcut for the standard (non-custom modes) case */ + for (j=0;joverlap; + nbEBands = mode->nbEBands; + N = mode->shortMdctSize<shortMdctSize; + shift = mode->maxLM; + } else { + B = 1; + NB = mode->shortMdctSize<maxLM-LM; + } + + if (CC==2&&C==1) + { + /* Copying a mono streams to two channels */ + celt_sig *freq2; + denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, + downsample, silence); + /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */ + freq2 = out_syn[1]+overlap/2; + OPUS_COPY(freq2, freq, N); + for (b=0;bmdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); + for (b=0;bmdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch); + } else if (CC==1&&C==2) + { + /* Downmixing a stereo stream to mono */ + celt_sig *freq2; + freq2 = out_syn[0]+overlap/2; + denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, + downsample, silence); + /* Use the output buffer as temp array before downmixing. */ + denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, + downsample, silence); + for (i=0;imdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); + } else { + /* Normal case (mono or stereo) */ + c=0; do { + denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M, + downsample, silence); + for (b=0;bmdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch); + } while (++cstorage*8; + tell = ec_tell(dec); + logp = isTransient ? 2 : 4; + tf_select_rsv = LM>0 && tell+logp+1<=budget; + budget -= tf_select_rsv; + tf_changed = curr = 0; + for (i=start;i>1, opus_val16 ); + pitch_downsample(decode_mem, lp_pitch_buf, + DECODE_BUFFER_SIZE, C, arch); + pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, + DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, + PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); + pitch_index = PLC_PITCH_LAG_MAX-pitch_index; + RESTORE_STACK; + return pitch_index; +} + +static void prefilter_and_fold(CELTDecoder * OPUS_RESTRICT st, int N) +{ + int c; + int CC; + int i; + int overlap; + celt_sig *decode_mem[2]; + const OpusCustomMode *mode; + VARDECL(opus_val32, etmp); + mode = st->mode; + overlap = st->overlap; + CC = st->channels; + ALLOC(etmp, overlap, opus_val32); + c=0; do { + decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); + } while (++cpostfilter_period_old, st->postfilter_period, overlap, + -st->postfilter_gain_old, -st->postfilter_gain, + st->postfilter_tapset_old, st->postfilter_tapset, NULL, 0, st->arch); + + /* Simulate TDAC on the concealed audio so that it blends with the + MDCT of the next frame. */ + for (i=0;iwindow[i], etmp[overlap-1-i]) + + MULT16_32_Q15(mode->window[overlap-i-1], etmp[i]); + } + } while (++cfec_read_pos; + tmp_fec_skip = lpcnet->fec_skip; + for (i=0;ifec_read_pos = tmp_read_post; + lpcnet->fec_skip = tmp_fec_skip; +} +#endif + +static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM +#ifdef ENABLE_DEEP_PLC + ,LPCNetPLCState *lpcnet +#endif + ) +{ + int c; + int i; + const int C = st->channels; + celt_sig *decode_mem[2]; + celt_sig *out_syn[2]; + opus_val16 *lpc; + opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; + const OpusCustomMode *mode; + int nbEBands; + int overlap; + int start; + int loss_duration; + int noise_based; + const opus_int16 *eBands; + SAVE_STACK; + + mode = st->mode; + nbEBands = mode->nbEBands; + overlap = mode->overlap; + eBands = mode->eBands; + + c=0; do { + decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); + out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; + } while (++c_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); + oldBandE = lpc+C*CELT_LPC_ORDER; + oldLogE = oldBandE + 2*nbEBands; + oldLogE2 = oldLogE + 2*nbEBands; + backgroundLogE = oldLogE2 + 2*nbEBands; + + loss_duration = st->loss_duration; + start = st->start; +#ifdef ENABLE_DEEP_PLC + noise_based = start != 0 || (lpcnet->fec_fill_pos == 0 && (st->skip_plc || loss_duration >= 80)); +#else + noise_based = loss_duration >= 40 || start != 0 || st->skip_plc; +#endif + if (noise_based) + { + /* Noise-based PLC/CNG */ + VARDECL(celt_norm, X); + opus_uint32 seed; + int end; + int effEnd; + opus_val16 decay; + end = st->end; + effEnd = IMAX(start, IMIN(end, mode->effEBands)); + + ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ + c=0; do { + OPUS_MOVE(decode_mem[c], decode_mem[c]+N, + DECODE_BUFFER_SIZE-N+overlap); + } while (++cprefilter_and_fold) { + prefilter_and_fold(st, N); + } + + /* Energy decay */ + decay = loss_duration==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); + c=0; do + { + for (i=start;irng; + for (c=0;c>20); + } + renormalise_vector(X+boffs, blen, Q15ONE, st->arch); + } + } + st->rng = seed; + + celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch); + st->prefilter_and_fold = 0; + /* Skip regular PLC until we get two consecutive packets. */ + st->skip_plc = 1; + } else { + int exc_length; + /* Pitch-based PLC */ + const opus_val16 *window; + opus_val16 *exc; + opus_val16 fade = Q15ONE; + int pitch_index; + VARDECL(opus_val16, _exc); + VARDECL(opus_val16, fir_tmp); + + if (loss_duration == 0) + { +#ifdef ENABLE_DEEP_PLC + if (lpcnet->loaded) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C); +#endif + st->last_pitch_index = pitch_index = celt_plc_pitch_search(decode_mem, C, st->arch); + } else { + pitch_index = st->last_pitch_index; + fade = QCONST16(.8f,15); + } + + /* We want the excitation for 2 pitch periods in order to look for a + decaying signal, but we can't get more than MAX_PERIOD. */ + exc_length = IMIN(2*pitch_index, MAX_PERIOD); + + ALLOC(_exc, MAX_PERIOD+CELT_LPC_ORDER, opus_val16); + ALLOC(fir_tmp, exc_length, opus_val16); + exc = _exc+CELT_LPC_ORDER; + window = mode->window; + c=0; do { + opus_val16 decay; + opus_val16 attenuation; + opus_val32 S1=0; + celt_sig *buf; + int extrapolation_offset; + int extrapolation_len; + int j; + + buf = decode_mem[c]; + for (i=0;iarch); + /* Add a noise floor of -40 dB. */ +#ifdef FIXED_POINT + ac[0] += SHR32(ac[0],13); +#else + ac[0] *= 1.0001f; +#endif + /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ + for (i=1;i<=CELT_LPC_ORDER;i++) + { + /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ +#ifdef FIXED_POINT + ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); +#else + ac[i] -= ac[i]*(0.008f*0.008f)*i*i; +#endif + } + _celt_lpc(lpc+c*CELT_LPC_ORDER, ac, CELT_LPC_ORDER); +#ifdef FIXED_POINT + /* For fixed-point, apply bandwidth expansion until we can guarantee that + no overflow can happen in the IIR filter. This means: + 32768*sum(abs(filter)) < 2^31 */ + while (1) { + opus_val16 tmp=Q15ONE; + opus_val32 sum=QCONST16(1., SIG_SHIFT); + for (i=0;iarch); + OPUS_COPY(exc+MAX_PERIOD-exc_length, fir_tmp, exc_length); + } + + /* Check if the waveform is decaying, and if so how fast. + We do this to avoid adding energy when concealing in a segment + with decaying energy. */ + { + opus_val32 E1=1, E2=1; + int decay_length; +#ifdef FIXED_POINT + int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20); +#endif + decay_length = exc_length>>1; + for (i=0;i= pitch_index) { + j -= pitch_index; + attenuation = MULT16_16_Q15(attenuation, decay); + } + buf[DECODE_BUFFER_SIZE-N+i] = + SHL32(EXTEND32(MULT16_16_Q15(attenuation, + exc[extrapolation_offset+j])), SIG_SHIFT); + /* Compute the energy of the previously decoded signal whose + excitation we're copying. */ + tmp = SROUND16( + buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], + SIG_SHIFT); + S1 += SHR32(MULT16_16(tmp, tmp), 10); + } + { + opus_val16 lpc_mem[CELT_LPC_ORDER]; + /* Copy the last decoded samples (prior to the overlap region) to + synthesis filter memory so we can have a continuous signal. */ + for (i=0;iarch); +#ifdef FIXED_POINT + for (i=0; i < extrapolation_len; i++) + buf[DECODE_BUFFER_SIZE-N+i] = SATURATE(buf[DECODE_BUFFER_SIZE-N+i], SIG_SAT); +#endif + } + + /* Check if the synthesis energy is higher than expected, which can + happen with the signal changes during our window. If so, + attenuate. */ + { + opus_val32 S2=0; + for (i=0;i SHR32(S2,2))) +#else + /* The float test is written this way to catch NaNs in the output + of the IIR filter at the same time. */ + if (!(S1 > 0.2f*S2)) +#endif + { + for (i=0;iloaded && (st->complexity >= 5 || lpcnet->fec_fill_pos > 0)) { + float overlap_mem; + int samples_needed16k; + celt_sig *buf; + VARDECL(float, buf_copy); + buf = decode_mem[0]; + ALLOC(buf_copy, C*overlap, float); + c=0; do { + OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][DECODE_BUFFER_SIZE-N], overlap); + } while (++cplc_fill = 0; + } + while (st->plc_fill < samples_needed16k) { + lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]); + st->plc_fill += FRAME_SIZE; + } + /* Resample to 48 kHz. */ + for (i=0;i<(N+overlap)/3;i++) { + int j; + float sum; + for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j]; + buf[DECODE_BUFFER_SIZE-N+3*i] = sum; + for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2]; + buf[DECODE_BUFFER_SIZE-N+3*i+1] = sum; + for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1]; + buf[DECODE_BUFFER_SIZE-N+3*i+2] = sum; + } + OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3); + st->plc_fill -= N/3; + for (i=0;iplc_preemphasis_mem; + st->plc_preemphasis_mem = tmp; + } + overlap_mem = st->plc_preemphasis_mem; + for (i=0;iprefilter_and_fold = 1; + } + + /* Saturate to soemthing large to avoid wrap-around. */ + st->loss_duration = IMIN(10000, loss_duration+(1<channels; + int LM, M; + int start; + int end; + int effEnd; + int codedBands; + int alloc_trim; + int postfilter_pitch; + opus_val16 postfilter_gain; + int intensity=0; + int dual_stereo=0; + opus_int32 total_bits; + opus_int32 balance; + opus_int32 tell; + int dynalloc_logp; + int postfilter_tapset; + int anti_collapse_rsv; + int anti_collapse_on=0; + int silence; + int C = st->stream_channels; + const OpusCustomMode *mode; + int nbEBands; + int overlap; + const opus_int16 *eBands; + opus_val16 max_background_increase; + ALLOC_STACK; + + VALIDATE_CELT_DECODER(st); + mode = st->mode; + nbEBands = mode->nbEBands; + overlap = mode->overlap; + eBands = mode->eBands; + start = st->start; + end = st->end; + frame_size *= st->downsample; + + lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); + oldBandE = lpc+CC*CELT_LPC_ORDER; + oldLogE = oldBandE + 2*nbEBands; + oldLogE2 = oldLogE + 2*nbEBands; + backgroundLogE = oldLogE2 + 2*nbEBands; + +#ifdef CUSTOM_MODES + if (st->signalling && data!=NULL) + { + int data0=data[0]; + /* Convert "standard mode" to Opus header */ + if (mode->Fs==48000 && mode->shortMdctSize==120) + { + data0 = fromOpus(data0); + if (data0<0) + return OPUS_INVALID_PACKET; + } + st->end = end = IMAX(1, mode->effEBands-2*(data0>>5)); + LM = (data0>>3)&0x3; + C = 1 + ((data0>>2)&0x1); + data++; + len--; + if (LM>mode->maxLM) + return OPUS_INVALID_PACKET; + if (frame_size < mode->shortMdctSize<shortMdctSize<maxLM;LM++) + if (mode->shortMdctSize<mode->maxLM) + return OPUS_BAD_ARG; + } + M=1<1275 || pcm==NULL) + return OPUS_BAD_ARG; + + N = M*mode->shortMdctSize; + c=0; do { + decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); + out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; + } while (++c mode->effEBands) + effEnd = mode->effEBands; + + if (data == NULL || len<=1) + { + celt_decode_lost(st, N, LM +#ifdef ENABLE_DEEP_PLC + , lpcnet +#endif + ); + deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); + RESTORE_STACK; + return frame_size/st->downsample; + } +#ifdef ENABLE_DEEP_PLC + else { + /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */ + if (lpcnet) lpcnet->blend = 0; + } +#endif + + /* Check if there are at least two packets received consecutively before + * turning on the pitch-based PLC */ + if (st->loss_duration == 0) st->skip_plc = 0; + + if (dec == NULL) + { + ec_dec_init(&_dec,(unsigned char*)data,len); + dec = &_dec; + } + + if (C==1) + { + for (i=0;i= total_bits) + silence = 1; + else if (tell==1) + silence = ec_dec_bit_logp(dec, 15); + else + silence = 0; + if (silence) + { + /* Pretend we've read all the remaining bits */ + tell = len*8; + dec->nbits_total+=tell-ec_tell(dec); + } + + postfilter_gain = 0; + postfilter_pitch = 0; + postfilter_tapset = 0; + if (start==0 && tell+16 <= total_bits) + { + if(ec_dec_bit_logp(dec, 1)) + { + int qg, octave; + octave = ec_dec_uint(dec, 6); + postfilter_pitch = (16< 0 && tell+3 <= total_bits) + { + isTransient = ec_dec_bit_logp(dec, 3); + tell = ec_tell(dec); + } + else + isTransient = 0; + + if (isTransient) + shortBlocks = M; + else + shortBlocks = 0; + + /* Decode the global flags (first symbols in the stream) */ + intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; + /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the + risk of getting loud artifacts. */ + if (!intra_ener && st->loss_duration != 0) { + c=0; do + { + opus_val16 safety = 0; + int missing = IMIN(10, st->loss_duration>>LM); + if (LM==0) safety = QCONST16(1.5f,DB_SHIFT); + else if (LM==1) safety = QCONST16(.5f,DB_SHIFT); + for (i=start;i0) + dynalloc_logp = IMAX(2, dynalloc_logp-1); + } + + ALLOC(fine_quant, nbEBands, int); + alloc_trim = tell+(6<=2&&bits>=((LM+2)<rng, 0, + st->arch, st->disable_inv); + + if (anti_collapse_rsv > 0) + { + anti_collapse_on = ec_dec_bits(dec, 1); + } + + unquant_energy_finalise(mode, start, end, oldBandE, + fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); + + if (anti_collapse_on) + anti_collapse(mode, X, collapse_masks, LM, C, N, + start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch); + + if (silence) + { + for (i=0;iprefilter_and_fold) { + prefilter_and_fold(st, N); + } + celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, + C, CC, isTransient, LM, st->downsample, silence, st->arch); + + c=0; do { + st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); + st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); + comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize, + st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, + mode->window, overlap, st->arch); + if (LM!=0) + comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, + st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, + mode->window, overlap, st->arch); + + } while (++cpostfilter_period_old = st->postfilter_period; + st->postfilter_gain_old = st->postfilter_gain; + st->postfilter_tapset_old = st->postfilter_tapset; + st->postfilter_period = postfilter_pitch; + st->postfilter_gain = postfilter_gain; + st->postfilter_tapset = postfilter_tapset; + if (LM!=0) + { + st->postfilter_period_old = st->postfilter_period; + st->postfilter_gain_old = st->postfilter_gain; + st->postfilter_tapset_old = st->postfilter_tapset; + } + + if (C==1) + OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); + + if (!isTransient) + { + OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands); + OPUS_COPY(oldLogE, oldBandE, 2*nbEBands); + } else { + for (i=0;i<2*nbEBands;i++) + oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); + } + /* In normal circumstances, we only allow the noise floor to increase by + up to 2.4 dB/second, but when we're in DTX we give the weight of + all missing packets to the update packet. */ + max_background_increase = IMIN(160, st->loss_duration+M)*QCONST16(0.001f,DB_SHIFT); + for (i=0;i<2*nbEBands;i++) + backgroundLogE[i] = MIN16(backgroundLogE[i] + max_background_increase, oldBandE[i]); + /* In case start or end were to change */ + c=0; do + { + for (i=0;irng = dec->rng; + + deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); + st->loss_duration = 0; + st->prefilter_and_fold = 0; + RESTORE_STACK; + if (ec_tell(dec) > 8*len) + return OPUS_INTERNAL_ERROR; + if(ec_get_error(dec)) + st->error = 1; + return frame_size/st->downsample; +} + +int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, + int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum) +{ + return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum +#ifdef ENABLE_DEEP_PLC + , NULL +#endif + ); +} + +#ifdef CUSTOM_MODES + +#ifdef FIXED_POINT +int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) +{ + return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0); +} + +#ifndef DISABLE_FLOAT_API +int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) +{ + int j, ret, C, N; + VARDECL(opus_int16, out); + ALLOC_STACK; + + if (pcm==NULL) + return OPUS_BAD_ARG; + + C = st->channels; + N = frame_size; + + ALLOC(out, C*N, opus_int16); + ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); + if (ret>0) + for (j=0;jchannels; + N = frame_size; + ALLOC(out, C*N, celt_sig); + + ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); + + if (ret>0) + for (j=0;j10) + { + goto bad_arg; + } + st->complexity = value; + } + break; + case OPUS_GET_COMPLEXITY_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->complexity; + } + break; + case CELT_SET_START_BAND_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<0 || value>=st->mode->nbEBands) + goto bad_arg; + st->start = value; + } + break; + case CELT_SET_END_BAND_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>st->mode->nbEBands) + goto bad_arg; + st->end = value; + } + break; + case CELT_SET_CHANNELS_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>2) + goto bad_arg; + st->stream_channels = value; + } + break; + case CELT_GET_AND_CLEAR_ERROR_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value=st->error; + st->error = 0; + } + break; + case OPUS_GET_LOOKAHEAD_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value = st->overlap/st->downsample; + } + break; + case OPUS_RESET_STATE: + { + int i; + opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2; + lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels); + oldBandE = lpc+st->channels*CELT_LPC_ORDER; + oldLogE = oldBandE + 2*st->mode->nbEBands; + oldLogE2 = oldLogE + 2*st->mode->nbEBands; + OPUS_CLEAR((char*)&st->DECODER_RESET_START, + opus_custom_decoder_get_size(st->mode, st->channels)- + ((char*)&st->DECODER_RESET_START - (char*)st)); + for (i=0;i<2*st->mode->nbEBands;i++) + oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); + st->skip_plc = 1; + } + break; + case OPUS_GET_PITCH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value = st->postfilter_period; + } + break; + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (value==0) + goto bad_arg; + *value=st->mode; + } + break; + case CELT_SET_SIGNALLING_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->signalling = value; + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + opus_uint32 * value = va_arg(ap, opus_uint32 *); + if (value==0) + goto bad_arg; + *value=st->rng; + } + break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->disable_inv = value; + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->disable_inv; + } + break; + default: + goto bad_request; + } + va_end(ap); + return OPUS_OK; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +bad_request: + va_end(ap); + return OPUS_UNIMPLEMENTED; +} diff --git a/src/libopus/celt/celt_lpc.c b/src/libopus/celt/celt_lpc.c new file mode 100644 index 00000000..7e022946 --- /dev/null +++ b/src/libopus/celt/celt_lpc.c @@ -0,0 +1,363 @@ +/* Copyright (c) 2009-2010 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "pitch.h" + +void _celt_lpc( + opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */ +const opus_val32 *ac, /* in: [0...p] autocorrelation values */ +int p +) +{ + int i, j; + opus_val32 r; + opus_val32 error = ac[0]; +#ifdef FIXED_POINT + opus_val32 lpc[CELT_LPC_ORDER]; +#else + float *lpc = _lpc; +#endif + + OPUS_CLEAR(lpc, p); +#ifdef FIXED_POINT + if (ac[0] != 0) +#else + if (ac[0] > 1e-10f) +#endif + { + for (i = 0; i < p; i++) { + /* Sum up this iteration's reflection coefficient */ + opus_val32 rr = 0; + for (j = 0; j < i; j++) + rr += MULT32_32_Q31(lpc[j],ac[i - j]); + rr += SHR32(ac[i + 1],6); + r = -frac_div32(SHL32(rr,6), error); + /* Update LPC coefficients and total error */ + lpc[i] = SHR32(r,6); + for (j = 0; j < (i+1)>>1; j++) + { + opus_val32 tmp1, tmp2; + tmp1 = lpc[j]; + tmp2 = lpc[i-1-j]; + lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); + lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); + } + + error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); + /* Bail out once we get 30 dB gain */ +#ifdef FIXED_POINT + if (error<=SHR32(ac[0],10)) + break; +#else + if (error<=.001f*ac[0]) + break; +#endif + } + } +#ifdef FIXED_POINT + { + /* Convert the int32 lpcs to int16 and ensure there are no wrap-arounds. + This reuses the logic in silk_LPC_fit() and silk_bwexpander_32(). Any bug + fixes should also be applied there. */ + int iter, idx = 0; + opus_val32 maxabs, absval, chirp_Q16, chirp_minus_one_Q16; + + for (iter = 0; iter < 10; iter++) { + maxabs = 0; + for (i = 0; i < p; i++) { + absval = ABS32(lpc[i]); + if (absval > maxabs) { + maxabs = absval; + idx = i; + } + } + maxabs = PSHR32(maxabs, 13); /* Q25->Q12 */ + + if (maxabs > 32767) { + maxabs = MIN32(maxabs, 163838); + chirp_Q16 = QCONST32(0.999, 16) - DIV32(SHL32(maxabs - 32767, 14), + SHR32(MULT32_32_32(maxabs, idx + 1), 2)); + chirp_minus_one_Q16 = chirp_Q16 - 65536; + + /* Apply bandwidth expansion. */ + for (i = 0; i < p - 1; i++) { + lpc[i] = MULT32_32_Q16(chirp_Q16, lpc[i]); + chirp_Q16 += PSHR32(MULT32_32_32(chirp_Q16, chirp_minus_one_Q16), 16); + } + lpc[p - 1] = MULT32_32_Q16(chirp_Q16, lpc[p - 1]); + } else { + break; + } + } + + if (iter == 10) { + /* If the coeffs still do not fit into the 16 bit range after 10 iterations, + fall back to the A(z)=1 filter. */ + OPUS_CLEAR(lpc, p); + _lpc[0] = 4096; /* Q12 */ + } else { + for (i = 0; i < p; i++) { + _lpc[i] = EXTRACT16(PSHR32(lpc[i], 13)); /* Q25->Q12 */ + } + } + } +#endif +} + + +void celt_fir_c( + const opus_val16 *x, + const opus_val16 *num, + opus_val16 *y, + int N, + int ord, + int arch) +{ + int i,j; + VARDECL(opus_val16, rnum); + SAVE_STACK; + celt_assert(x != y); + ALLOC(rnum, ord, opus_val16); + for(i=0;i=1;j--) + { + mem[j]=mem[j-1]; + } + mem[0] = SROUND16(sum, SIG_SHIFT); + _y[i] = sum; + } +#else + int i,j; + VARDECL(opus_val16, rden); + VARDECL(opus_val16, y); + SAVE_STACK; + + celt_assert((ord&3)==0); + ALLOC(rden, ord, opus_val16); + ALLOC(y, N+ord, opus_val16); + for(i=0;i0); + celt_assert(overlap>=0); + if (overlap == 0) + { + xptr = x; + } else { + for (i=0;i0) + { + for(i=0;i= 536870912) + { + int shift2=1; + if (ac[0] >= 1073741824) + shift2++; + for (i=0;i<=lag;i++) + ac[i] = SHR32(ac[i], shift2); + shift += shift2; + } +#endif + + RESTORE_STACK; + return shift; +} diff --git a/src/libopus/celt/celt_lpc.h b/src/libopus/celt/celt_lpc.h new file mode 100644 index 00000000..97dee82f --- /dev/null +++ b/src/libopus/celt/celt_lpc.h @@ -0,0 +1,66 @@ +/* Copyright (c) 2009-2010 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 PLC_H +#define PLC_H + +#include "arch.h" +#include "cpu_support.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/celt_lpc_sse.h" +#endif + +#define CELT_LPC_ORDER 24 + +void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p); + +void celt_fir_c( + const opus_val16 *x, + const opus_val16 *num, + opus_val16 *y, + int N, + int ord, + int arch); + +#if !defined(OVERRIDE_CELT_FIR) +#define celt_fir(x, num, y, N, ord, arch) \ + (celt_fir_c(x, num, y, N, ord, arch)) +#endif + +void celt_iir(const opus_val32 *x, + const opus_val16 *den, + opus_val32 *y, + int N, + int ord, + opus_val16 *mem, + int arch); + +int _celt_autocorr(const opus_val16 *x, opus_val32 *ac, + const opus_val16 *window, int overlap, int lag, int n, int arch); + +#endif /* PLC_H */ diff --git a/src/libopus/celt/config.h b/src/libopus/celt/config.h new file mode 100644 index 00000000..2989b6b0 --- /dev/null +++ b/src/libopus/celt/config.h @@ -0,0 +1 @@ +#include "../include/config.h" diff --git a/src/libopus/celt/cpu_support.h b/src/libopus/celt/cpu_support.h new file mode 100644 index 00000000..9f13d8ae --- /dev/null +++ b/src/libopus/celt/cpu_support.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 CPU_SUPPORT_H +#define CPU_SUPPORT_H + +#include "opus_types.h" +#include "opus_defines.h" + +#if defined(OPUS_HAVE_RTCD) && \ + (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/armcpu.h" + +/* We currently support 5 ARM variants: + * arch[0] -> ARMv4 + * arch[1] -> ARMv5E + * arch[2] -> ARMv6 + * arch[3] -> NEON + * arch[4] -> NEON+DOTPROD + */ +#define OPUS_ARCHMASK 7 + +#elif defined(OPUS_HAVE_RTCD) && \ + ((defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)) || \ + (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)) || \ + (defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \ + (defined(OPUS_X86_MAY_HAVE_AVX2) && !defined(OPUS_X86_PRESUME_AVX2))) + +#include "x86/x86cpu.h" +/* We currently support 5 x86 variants: + * arch[0] -> non-sse + * arch[1] -> sse + * arch[2] -> sse2 + * arch[3] -> sse4.1 + * arch[4] -> avx + */ +#define OPUS_ARCHMASK 7 +int opus_select_arch(void); + +#else +#define OPUS_ARCHMASK 0 + +static OPUS_INLINE int opus_select_arch(void) +{ + return 0; +} +#endif +#endif diff --git a/src/libopus/celt/cwrs.c b/src/libopus/celt/cwrs.c new file mode 100644 index 00000000..58c92628 --- /dev/null +++ b/src/libopus/celt/cwrs.c @@ -0,0 +1,715 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2007-2009 Timothy B. Terriberry + Written by Timothy B. Terriberry and Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "os_support.h" +#include "cwrs.h" +#include "mathops.h" +#include "arch.h" + +#ifdef CUSTOM_MODES + +/*Guaranteed to return a conservatively large estimate of the binary logarithm + with frac bits of fractional precision. + Tested for all possible 32-bit inputs with frac=4, where the maximum + overestimation is 0.06254243 bits.*/ +int log2_frac(opus_uint32 val, int frac) +{ + int l; + l=EC_ILOG(val); + if(val&(val-1)){ + /*This is (val>>l-16), but guaranteed to round up, even if adding a bias + before the shift would cause overflow (e.g., for 0xFFFFxxxx). + Doesn't work for val=0, but that case fails the test above.*/ + if(l>16)val=((val-1)>>(l-16))+1; + else val<<=16-l; + l=(l-1)<>16); + l+=b<>b; + val=(val*val+0x7FFF)>>15; + } + while(frac-->0); + /*If val is not exactly 0x8000, then we have to round up the remainder.*/ + return l+(val>0x8000); + } + /*Exact powers of two require no rounding.*/ + else return (l-1)<0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, + where choose() is the binomial function. + A table of values for N<10 and K<10 looks like: + V[10][10] = { + {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, + {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, + {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, + {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, + {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, + {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, + {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, + {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} + }; + + U(N,K) = the number of such combinations wherein N-1 objects are taken at + most K-1 at a time. + This is given by + U(N,K) = sum(k=0...K-1,V(N-1,k)) + = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. + The latter expression also makes clear that U(N,K) is half the number of such + combinations wherein the first object is taken at least once. + Although it may not be clear from either of these definitions, U(N,K) is the + natural function to work with when enumerating the pulse vector codebooks, + not V(N,K). + U(N,K) is not well-defined for N=0, but with the extension + U(0,K) = K>0 ? 0 : 1, + the function becomes symmetric: U(N,K) = U(K,N), with a similar table: + U[10][10] = { + {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, + {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, + {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, + {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, + {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, + {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, + {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, + {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} + }; + + With this extension, V(N,K) may be written in terms of U(N,K): + V(N,K) = U(N,K) + U(N,K+1) + for all N>=0, K>=0. + Thus U(N,K+1) represents the number of combinations where the first element + is positive or zero, and U(N,K) represents the number of combinations where + it is negative. + With a large enough table of U(N,K) values, we could write O(N) encoding + and O(min(N*log(K),N+K)) decoding routines, but such a table would be + prohibitively large for small embedded devices (K may be as large as 32767 + for small N, and N may be as large as 200). + + Both functions obey the same recurrence relation: + V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), + U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), + for all N>0, K>0, with different initial conditions at N=0 or K=0. + This allows us to construct a row of one of the tables above given the + previous row or the next row. + Thus we can derive O(NK) encoding and decoding routines with O(K) memory + using only addition and subtraction. + + When encoding, we build up from the U(2,K) row and work our way forwards. + When decoding, we need to start at the U(N,K) row and work our way backwards, + which requires a means of computing U(N,K). + U(N,K) may be computed from two previous values with the same N: + U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) + for all N>1, and since U(N,K) is symmetric, a similar relation holds for two + previous values with the same K: + U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) + for all K>1. + This allows us to construct an arbitrary row of the U(N,K) table by starting + with the first two values, which are constants. + This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) + multiplications. + Similar relations can be derived for V(N,K), but are not used here. + + For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree + polynomial for fixed N. + The first few are + U(1,K) = 1, + U(2,K) = 2*K-1, + U(3,K) = (2*K-2)*K+1, + U(4,K) = (((4*K-6)*K+8)*K-3)/3, + U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, + and + V(1,K) = 2, + V(2,K) = 4*K, + V(3,K) = 4*K*K+2, + V(4,K) = 8*(K*K+2)*K/3, + V(5,K) = ((4*K*K+20)*K*K+6)/3, + for all K>0. + This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for + small N (and indeed decoding is also O(N) for N<3). + + @ARTICLE{Fis86, + author="Thomas R. Fischer", + title="A Pyramid Vector Quantizer", + journal="IEEE Transactions on Information Theory", + volume="IT-32", + number=4, + pages="568--583", + month=Jul, + year=1986 + }*/ + +#if !defined(SMALL_FOOTPRINT) + +/*U(N,K) = U(K,N) := N>0?K>0?U(N-1,K)+U(N,K-1)+U(N-1,K-1):0:K>0?1:0*/ +# define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)]) +/*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N + with K pulses allocated to it.*/ +# define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1)) + +/*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)). + Thus, the number of entries in row I is the larger of the maximum number of + pulses we will ever allocate for a given N=I (K=128, or however many fit in + 32 bits, whichever is smaller), plus one, and the maximum N for which + K=I-1 pulses fit in 32 bits. + The largest band size in an Opus Custom mode is 208. + Otherwise, we can limit things to the set of N which can be achieved by + splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48, + 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/ +#if defined(CUSTOM_MODES) +static const opus_uint32 CELT_PVQ_U_DATA[1488]={ +#else +static const opus_uint32 CELT_PVQ_U_DATA[1272]={ +#endif + /*N=0, K=0...176:*/ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if defined(CUSTOM_MODES) + /*...208:*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +#endif + /*N=1, K=1...176:*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +#if defined(CUSTOM_MODES) + /*...208:*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, +#endif + /*N=2, K=2...176:*/ + 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, + 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, + 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, + 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, + 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, + 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, + 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, + 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, + 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, + 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323, + 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, +#if defined(CUSTOM_MODES) + /*...208:*/ + 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, + 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, + 413, 415, +#endif + /*N=3, K=3...176:*/ + 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613, + 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861, + 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785, + 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385, + 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661, + 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961, + 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745, + 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013, + 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765, + 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001, + 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721, + 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925, + 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613, + 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785, + 57461, 58141, 58825, 59513, 60205, 60901, 61601, +#if defined(CUSTOM_MODES) + /*...208:*/ + 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565, + 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013, + 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113, +#endif + /*N=4, K=4...176:*/ + 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017, + 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775, + 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153, + 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193, + 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575, + 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217, + 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951, + 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609, + 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023, + 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407, + 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759, + 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175, + 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751, + 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583, + 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767, + 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399, + 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575, + 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391, + 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943, + 7085049, 7207551, +#if defined(CUSTOM_MODES) + /*...208:*/ + 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783, + 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967, + 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199, + 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177, + 11912575, +#endif + /*N=5, K=5...176:*/ + 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041, + 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401, + 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241, + 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241, + 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801, + 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849, + 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849, + 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809, + 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881, + 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641, + 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081, + 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609, + 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049, + 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641, + 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041, + 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321, + 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969, + 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889, + 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401, + 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241, + 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561, + 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929, + 590359041, 604167209, 618216201, 632508801, +#if defined(CUSTOM_MODES) + /*...208:*/ + 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241, + 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161, + 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329, + 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041, + 1143412929, 1166053121, 1189027881, 1212340489, 1235994241, +#endif + /*N=6, K=6...96:*/ + 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047, + 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409, + 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793, + 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455, + 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189, + 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651, + 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185, + 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647, + 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229, + 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283, + 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135, + 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187, + 2011371957, 2120032959, +#if defined(CUSTOM_MODES) + /*...109:*/ + 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U, + 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U, + 4012305913U, +#endif + /*N=7, K=7...54*/ + 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777, + 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233, + 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013, + 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805, + 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433, + 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821, + 1667010073, 1870535785, 2094367717, +#if defined(CUSTOM_MODES) + /*...60:*/ + 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U, +#endif + /*N=8, K=8...37*/ + 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767, + 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017, + 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351, + 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615, + 2229491905U, +#if defined(CUSTOM_MODES) + /*...40:*/ + 2691463695U, 3233240945U, 3866006015U, +#endif + /*N=9, K=9...28:*/ + 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777, + 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145, + 628496897, 872893441, 1196924561, 1621925137, 2173806145U, +#if defined(CUSTOM_MODES) + /*...29:*/ + 2883810113U, +#endif + /*N=10, K=10...24:*/ + 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073, + 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U, + 3375210671U, + /*N=11, K=11...19:*/ + 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585, + 948062325, 1616336765, +#if defined(CUSTOM_MODES) + /*...20:*/ + 2684641785U, +#endif + /*N=12, K=12...18:*/ + 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185, + 3248227095U, + /*N=13, K=13...16:*/ + 251595969, 579168825, 1267854873, 2653649025U, + /*N=14, K=14:*/ + 1409933619 +}; + +#if defined(CUSTOM_MODES) +static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ + CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415, + CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030, + CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389, + CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455, + CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473 +}; +#else +static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ + CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351, + CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870, + CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178, + CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240, + CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257 +}; +#endif + +#if defined(CUSTOM_MODES) +void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ + int k; + /*_maxk==0 => there's nothing to do.*/ + celt_assert(_maxk>0); + _bits[0]=0; + for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac); +} +#endif + +static opus_uint32 icwrs(int _n,const int *_y){ + opus_uint32 i; + int j; + int k; + celt_assert(_n>=2); + j=_n-1; + i=_y[j]<0; + k=abs(_y[j]); + do{ + j--; + i+=CELT_PVQ_U(_n-j,k); + k+=abs(_y[j]); + if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1); + } + while(j>0); + return i; +} + +void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ + celt_assert(_k>0); + ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); +} + +static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ + opus_uint32 p; + int s; + int k0; + opus_int16 val; + opus_val32 yy=0; + celt_assert(_k>0); + celt_assert(_n>1); + while(_n>2){ + opus_uint32 q; + /*Lots of pulses case:*/ + if(_k>=_n){ + const opus_uint32 *row; + row=CELT_PVQ_U_ROW[_n]; + /*Are the pulses in this dimension negative?*/ + p=row[_k+1]; + s=-(_i>=p); + _i-=p&s; + /*Count how many pulses were placed in this dimension.*/ + k0=_k; + q=row[_n]; + if(q>_i){ + celt_sig_assert(p>q); + _k=_n; + do p=CELT_PVQ_U_ROW[--_k][_n]; + while(p>_i); + } + else for(p=row[_k];p>_i;p=row[_k])_k--; + _i-=p; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + } + /*Lots of dimensions case:*/ + else{ + /*Are there any pulses in this dimension at all?*/ + p=CELT_PVQ_U_ROW[_k][_n]; + q=CELT_PVQ_U_ROW[_k+1][_n]; + if(p<=_i&&_i=q); + _i-=q&s; + /*Count how many pulses were placed in this dimension.*/ + k0=_k; + do p=CELT_PVQ_U_ROW[--_k][_n]; + while(p>_i); + _i-=p; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + } + } + _n--; + } + /*_n==2*/ + p=2*_k+1; + s=-(_i>=p); + _i-=p&s; + k0=_k; + _k=(_i+1)>>1; + if(_k)_i-=2*_k-1; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + /*_n==1*/ + s=-(int)_i; + val=(_k+s)^s; + *_y=val; + yy=MAC16_16(yy,val,val); + return yy; +} + +opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ + return cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); +} + +#else /* SMALL_FOOTPRINT */ + +/*Computes the next row/column of any recurrence that obeys the relation + u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. + _ui0 is the base case for the new row/column.*/ +static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ + opus_uint32 ui1; + unsigned j; + /*This do-while will overrun the array if we don't have storage for at least + 2 values.*/ + j=1; do { + ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); + _ui[j-1]=_ui0; + _ui0=ui1; + } while (++j<_len); + _ui[j-1]=_ui0; +} + +/*Computes the previous row/column of any recurrence that obeys the relation + u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. + _ui0 is the base case for the new row/column.*/ +static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){ + opus_uint32 ui1; + unsigned j; + /*This do-while will overrun the array if we don't have storage for at least + 2 values.*/ + j=1; do { + ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); + _ui[j-1]=_ui0; + _ui0=ui1; + } while (++j<_n); + _ui[j-1]=_ui0; +} + +/*Compute V(_n,_k), as well as U(_n,0..._k+1). + _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ +static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ + opus_uint32 um2; + unsigned len; + unsigned k; + len=_k+2; + /*We require storage at least 3 values (e.g., _k>0).*/ + celt_assert(len>=3); + _u[0]=0; + _u[1]=um2=1; + /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ + /*If _n==1, _u[i] should be 1 for i>1.*/ + celt_assert(_n>=2); + /*If _k==0, the following do-while loop will overflow the buffer.*/ + celt_assert(_k>0); + k=2; + do _u[k]=(k<<1)-1; + while(++k0); + j=0; + do{ + opus_uint32 p; + int s; + int yj; + p=_u[_k+1]; + s=-(_i>=p); + _i-=p&s; + yj=_k; + p=_u[_k]; + while(p>_i)p=_u[--_k]; + _i-=p; + yj-=_k; + val=(yj+s)^s; + _y[j]=val; + yy=MAC16_16(yy,val,val); + uprev(_u,_k+2,0); + } + while(++j<_n); + return yy; +} + +/*Returns the index of the given combination of K elements chosen from a set + of size 1 with associated sign bits. + _y: The vector of pulses, whose sum of absolute values is K. + _k: Returns K.*/ +static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ + *_k=abs(_y[0]); + return _y[0]<0; +} + +/*Returns the index of the given combination of K elements chosen from a set + of size _n with associated sign bits. + _y: The vector of pulses, whose sum of absolute values must be _k. + _nc: Returns V(_n,_k).*/ +static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, + opus_uint32 *_u){ + opus_uint32 i; + int j; + int k; + /*We can't unroll the first two iterations of the loop unless _n>=2.*/ + celt_assert(_n>=2); + _u[0]=0; + for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; + i=icwrs1(_y+_n-1,&k); + j=_n-2; + i+=_u[k]; + k+=abs(_y[j]); + if(_y[j]<0)i+=_u[k+1]; + while(j-->0){ + unext(_u,_k+2,0); + i+=_u[k]; + k+=abs(_y[j]); + if(_y[j]<0)i+=_u[k+1]; + } + *_nc=_u[k]+_u[k+1]; + return i; +} + +#ifdef CUSTOM_MODES +void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ + int k; + /*_maxk==0 => there's nothing to do.*/ + celt_assert(_maxk>0); + _bits[0]=0; + if (_n==1) + { + for (k=1;k<=_maxk;k++) + _bits[k] = 1<<_frac; + } + else { + VARDECL(opus_uint32,u); + SAVE_STACK; + ALLOC(u,_maxk+2U,opus_uint32); + ncwrs_urow(_n,_maxk,u); + for(k=1;k<=_maxk;k++) + _bits[k]=log2_frac(u[k]+u[k+1],_frac); + RESTORE_STACK; + } +} +#endif /* CUSTOM_MODES */ + +void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ + opus_uint32 i; + VARDECL(opus_uint32,u); + opus_uint32 nc; + SAVE_STACK; + celt_assert(_k>0); + ALLOC(u,_k+2U,opus_uint32); + i=icwrs(_n,_k,&nc,_y,u); + ec_enc_uint(_enc,i,nc); + RESTORE_STACK; +} + +opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ + VARDECL(opus_uint32,u); + int ret; + SAVE_STACK; + celt_assert(_k>0); + ALLOC(u,_k+2U,opus_uint32); + ret = cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); + RESTORE_STACK; + return ret; +} + +#endif /* SMALL_FOOTPRINT */ diff --git a/src/libopus/celt/cwrs.h b/src/libopus/celt/cwrs.h new file mode 100644 index 00000000..7cd47174 --- /dev/null +++ b/src/libopus/celt/cwrs.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2007-2009 Timothy B. Terriberry + Written by Timothy B. Terriberry and Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 CWRS_H +#define CWRS_H + +#include "arch.h" +#include "stack_alloc.h" +#include "entenc.h" +#include "entdec.h" + +#ifdef CUSTOM_MODES +int log2_frac(opus_uint32 val, int frac); +#endif + +void get_required_bits(opus_int16 *bits, int N, int K, int frac); + +void encode_pulses(const int *_y, int N, int K, ec_enc *enc); + +opus_val32 decode_pulses(int *_y, int N, int K, ec_dec *dec); + +#endif /* CWRS_H */ diff --git a/src/libopus/celt/ecintrin.h b/src/libopus/celt/ecintrin.h new file mode 100644 index 00000000..66a4c36e --- /dev/null +++ b/src/libopus/celt/ecintrin.h @@ -0,0 +1,91 @@ +/* Copyright (c) 2003-2008 Timothy B. Terriberry + Copyright (c) 2008 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/*Some common macros for potential platform-specific optimization.*/ +#include "opus_types.h" +#include +#include +#include "arch.h" +#if !defined(_ecintrin_H) +# define _ecintrin_H (1) + +/*Some specific platforms may have optimized intrinsic or OPUS_INLINE assembly + versions of these functions which can substantially improve performance. + We define macros for them to allow easy incorporation of these non-ANSI + features.*/ + +/*Modern gcc (4.x) can compile the naive versions of min and max with cmov if + given an appropriate architecture, but the branchless bit-twiddling versions + are just as fast, and do not require any special target architecture. + Earlier gcc versions (3.x) compiled both code to the same assembly + instructions, because of the way they represented ((_b)>(_a)) internally.*/ +# define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a)))) + +/*Count leading zeros. + This macro should only be used for implementing ec_ilog(), if it is defined. + All other code should use EC_ILOG() instead.*/ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#if defined(_MSC_VER) && (_MSC_VER >= 1910) +# include /* Improve compiler throughput. */ +#else +# include +#endif +/*In _DEBUG mode this is not an intrinsic by default.*/ +# pragma intrinsic(_BitScanReverse) + +static __inline int ec_bsr(unsigned long _x){ + unsigned long ret; + _BitScanReverse(&ret,_x); + return (int)ret; +} +# define EC_CLZ0 (1) +# define EC_CLZ(_x) (-ec_bsr(_x)) +#elif defined(ENABLE_TI_DSPLIB) +# include "dsplib.h" +# define EC_CLZ0 (31) +# define EC_CLZ(_x) (_lnorm(_x)) +#elif __GNUC_PREREQ(3,4) +# if INT_MAX>=2147483647 +# define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) +# define EC_CLZ(_x) (__builtin_clz(_x)) +# elif LONG_MAX>=2147483647L +# define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) +# define EC_CLZ(_x) (__builtin_clzl(_x)) +# endif +#endif + +#if defined(EC_CLZ) +/*Note that __builtin_clz is not defined when _x==0, according to the gcc + documentation (and that of the BSR instruction that implements it on x86). + The majority of the time we can never pass it zero. + When we need to, it can be special cased.*/ +# define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) +#else +int ec_ilog(opus_uint32 _v); +# define EC_ILOG(_x) (ec_ilog(_x)) +#endif +#endif diff --git a/src/libopus/celt/entcode.c b/src/libopus/celt/entcode.c new file mode 100644 index 00000000..62e0ddfb --- /dev/null +++ b/src/libopus/celt/entcode.c @@ -0,0 +1,153 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "entcode.h" +#include "arch.h" + +#if !defined(EC_CLZ) +/*This is a fallback for systems where we don't know how to access + a BSR or CLZ instruction (see ecintrin.h). + If you are optimizing Opus on a new platform and it has a native CLZ or + BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be + an easy performance win.*/ +int ec_ilog(opus_uint32 _v){ + /*On a Pentium M, this branchless version tested as the fastest on + 1,000,000,000 random 32-bit integers, edging out a similar version with + branches, and a 256-entry LUT version.*/ + int ret; + int m; + ret=!!_v; + m=!!(_v&0xFFFF0000)<<4; + _v>>=m; + ret|=m; + m=!!(_v&0xFF00)<<3; + _v>>=m; + ret|=m; + m=!!(_v&0xF0)<<2; + _v>>=m; + ret|=m; + m=!!(_v&0xC)<<1; + _v>>=m; + ret|=m; + ret+=!!(_v&0x2); + return ret; +} +#endif + +#if 1 +/* This is a faster version of ec_tell_frac() that takes advantage + of the low (1/8 bit) resolution to use just a linear function + followed by a lookup to determine the exact transition thresholds. */ +opus_uint32 ec_tell_frac(ec_ctx *_this){ + static const unsigned correction[8] = + {35733, 38967, 42495, 46340, + 50535, 55109, 60097, 65535}; + opus_uint32 nbits; + opus_uint32 r; + int l; + unsigned b; + nbits=_this->nbits_total<rng); + r=_this->rng>>(l-16); + b = (r>>12)-8; + b += r>correction[b]; + l = (l<<3)+b; + return nbits-l; +} +#else +opus_uint32 ec_tell_frac(ec_ctx *_this){ + opus_uint32 nbits; + opus_uint32 r; + int l; + int i; + /*To handle the non-integral number of bits still left in the encoder/decoder + state, we compute the worst-case number of bits of val that must be + encoded to ensure that the value is inside the range for any possible + subsequent bits. + The computation here is independent of val itself (the decoder does not + even track that value), even though the real number of bits used after + ec_enc_done() may be 1 smaller if rng is a power of two and the + corresponding trailing bits of val are all zeros. + If we did try to track that special case, then coding a value with a + probability of 1/(1<nbits_total<rng); + r=_this->rng>>(l-16); + for(i=BITRES;i-->0;){ + int b; + r=r*r>>15; + b=(int)(r>>16); + l=l<<1|b; + r>>=b; + } + return nbits-l; +} +#endif + +#ifdef USE_SMALL_DIV_TABLE +/* Result of 2^32/(2*i+1), except for i=0. */ +const opus_uint32 SMALL_DIV_TABLE[129] = { + 0xFFFFFFFF, 0x55555555, 0x33333333, 0x24924924, + 0x1C71C71C, 0x1745D174, 0x13B13B13, 0x11111111, + 0x0F0F0F0F, 0x0D79435E, 0x0C30C30C, 0x0B21642C, + 0x0A3D70A3, 0x097B425E, 0x08D3DCB0, 0x08421084, + 0x07C1F07C, 0x07507507, 0x06EB3E45, 0x06906906, + 0x063E7063, 0x05F417D0, 0x05B05B05, 0x0572620A, + 0x05397829, 0x05050505, 0x04D4873E, 0x04A7904A, + 0x047DC11F, 0x0456C797, 0x04325C53, 0x04104104, + 0x03F03F03, 0x03D22635, 0x03B5CC0E, 0x039B0AD1, + 0x0381C0E0, 0x0369D036, 0x03531DEC, 0x033D91D2, + 0x0329161F, 0x03159721, 0x03030303, 0x02F14990, + 0x02E05C0B, 0x02D02D02, 0x02C0B02C, 0x02B1DA46, + 0x02A3A0FD, 0x0295FAD4, 0x0288DF0C, 0x027C4597, + 0x02702702, 0x02647C69, 0x02593F69, 0x024E6A17, + 0x0243F6F0, 0x0239E0D5, 0x02302302, 0x0226B902, + 0x021D9EAD, 0x0214D021, 0x020C49BA, 0x02040810, + 0x01FC07F0, 0x01F44659, 0x01ECC07B, 0x01E573AC, + 0x01DE5D6E, 0x01D77B65, 0x01D0CB58, 0x01CA4B30, + 0x01C3F8F0, 0x01BDD2B8, 0x01B7D6C3, 0x01B20364, + 0x01AC5701, 0x01A6D01A, 0x01A16D3F, 0x019C2D14, + 0x01970E4F, 0x01920FB4, 0x018D3018, 0x01886E5F, + 0x0183C977, 0x017F405F, 0x017AD220, 0x01767DCE, + 0x01724287, 0x016E1F76, 0x016A13CD, 0x01661EC6, + 0x01623FA7, 0x015E75BB, 0x015AC056, 0x01571ED3, + 0x01539094, 0x01501501, 0x014CAB88, 0x0149539E, + 0x01460CBC, 0x0142D662, 0x013FB013, 0x013C995A, + 0x013991C2, 0x013698DF, 0x0133AE45, 0x0130D190, + 0x012E025C, 0x012B404A, 0x01288B01, 0x0125E227, + 0x01234567, 0x0120B470, 0x011E2EF3, 0x011BB4A4, + 0x01194538, 0x0116E068, 0x011485F0, 0x0112358E, + 0x010FEF01, 0x010DB20A, 0x010B7E6E, 0x010953F3, + 0x01073260, 0x0105197F, 0x0103091B, 0x01010101 +}; +#endif diff --git a/src/libopus/celt/entcode.h b/src/libopus/celt/entcode.h new file mode 100644 index 00000000..3763e3f2 --- /dev/null +++ b/src/libopus/celt/entcode.h @@ -0,0 +1,152 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +#include "opus_types.h" +#include "opus_defines.h" + +#if !defined(_entcode_H) +# define _entcode_H (1) +# include +# include +# include "ecintrin.h" + +extern const opus_uint32 SMALL_DIV_TABLE[129]; + +#ifdef OPUS_ARM_ASM +#define USE_SMALL_DIV_TABLE +#endif + +/*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a + larger type, you can speed up the decoder by using it here.*/ +typedef opus_uint32 ec_window; +typedef struct ec_ctx ec_ctx; +typedef struct ec_ctx ec_enc; +typedef struct ec_ctx ec_dec; + +# define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT) + +/*The number of bits to use for the range-coded part of unsigned integers.*/ +# define EC_UINT_BITS (8) + +/*The resolution of fractional-precision bit usage measurements, i.e., + 3 => 1/8th bits.*/ +# define BITRES 3 + +/*The entropy encoder/decoder context. + We use the same structure for both, so that common functions like ec_tell() + can be used on either one.*/ +struct ec_ctx{ + /*Buffered input/output.*/ + unsigned char *buf; + /*The size of the buffer.*/ + opus_uint32 storage; + /*The offset at which the last byte containing raw bits was read/written.*/ + opus_uint32 end_offs; + /*Bits that will be read from/written at the end.*/ + ec_window end_window; + /*Number of valid bits in end_window.*/ + int nend_bits; + /*The total number of whole bits read/written. + This does not include partial bits currently in the range coder.*/ + int nbits_total; + /*The offset at which the next range coder byte will be read/written.*/ + opus_uint32 offs; + /*The number of values in the current range.*/ + opus_uint32 rng; + /*In the decoder: the difference between the top of the current range and + the input value, minus one. + In the encoder: the low end of the current range.*/ + opus_uint32 val; + /*In the decoder: the saved normalization factor from ec_decode(). + In the encoder: the number of oustanding carry propagating symbols.*/ + opus_uint32 ext; + /*A buffered input/output symbol, awaiting carry propagation.*/ + int rem; + /*Nonzero if an error occurred.*/ + int error; +}; + +static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ + return _this->offs; +} + +static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ + return _this->buf; +} + +static OPUS_INLINE int ec_get_error(ec_ctx *_this){ + return _this->error; +} + +/*Returns the number of bits "used" by the encoded or decoded symbols so far. + This same number can be computed in either the encoder or the decoder, and is + suitable for making coding decisions. + Return: The number of bits. + This will always be slightly larger than the exact value (e.g., all + rounding error is in the positive direction).*/ +static OPUS_INLINE int ec_tell(ec_ctx *_this){ + return _this->nbits_total-EC_ILOG(_this->rng); +} + +/*Returns the number of bits "used" by the encoded or decoded symbols so far. + This same number can be computed in either the encoder or the decoder, and is + suitable for making coding decisions. + Return: The number of bits scaled by 2**BITRES. + This will always be slightly larger than the exact value (e.g., all + rounding error is in the positive direction).*/ +opus_uint32 ec_tell_frac(ec_ctx *_this); + +/* Tested exhaustively for all n and for 1<=d<=256 */ +static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { + celt_sig_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (d>256) + return n/d; + else { + opus_uint32 t, q; + t = EC_ILOG(d&-d); + q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; + return q+(n-q*d >= d); + } +#else + return n/d; +#endif +} + +static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { + celt_sig_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (n<0) + return -(opus_int32)celt_udiv(-n, d); + else + return celt_udiv(n, d); +#else + return n/d; +#endif +} + +#endif diff --git a/src/libopus/celt/entdec.c b/src/libopus/celt/entdec.c new file mode 100644 index 00000000..c27dd4e1 --- /dev/null +++ b/src/libopus/celt/entdec.c @@ -0,0 +1,266 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include +#include "os_support.h" +#include "arch.h" +#include "entdec.h" +#include "mfrngcod.h" + +/*A range decoder. + This is an entropy decoder based upon \cite{Mar79}, which is itself a + rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. + It is very similar to arithmetic encoding, except that encoding is done with + digits in any base, instead of with bits, and so it is faster when using + larger bases (i.e.: a byte). + The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ + is the base, longer than the theoretical optimum, but to my knowledge there + is no published justification for this claim. + This only seems true when using near-infinite precision arithmetic so that + the process is carried out with no rounding errors. + + An excellent description of implementation details is available at + http://www.arturocampos.com/ac_range.html + A recent work \cite{MNW98} which proposes several changes to arithmetic + encoding for efficiency actually re-discovers many of the principles + behind range encoding, and presents a good theoretical analysis of them. + + End of stream is handled by writing out the smallest number of bits that + ensures that the stream will be correctly decoded regardless of the value of + any subsequent bits. + ec_tell() can be used to determine how many bits were needed to decode + all the symbols thus far; other data can be packed in the remaining bits of + the input buffer. + @PHDTHESIS{Pas76, + author="Richard Clark Pasco", + title="Source coding algorithms for fast data compression", + school="Dept. of Electrical Engineering, Stanford University", + address="Stanford, CA", + month=May, + year=1976 + } + @INPROCEEDINGS{Mar79, + author="Martin, G.N.N.", + title="Range encoding: an algorithm for removing redundancy from a digitised + message", + booktitle="Video & Data Recording Conference", + year=1979, + address="Southampton", + month=Jul + } + @ARTICLE{MNW98, + author="Alistair Moffat and Radford Neal and Ian H. Witten", + title="Arithmetic Coding Revisited", + journal="{ACM} Transactions on Information Systems", + year=1998, + volume=16, + number=3, + pages="256--294", + month=Jul, + URL="http://www.stanford.edu/class/ee398a/handouts/papers/Moffat98ArithmCoding.pdf" + }*/ + +static int ec_read_byte(ec_dec *_this){ + return _this->offs<_this->storage?_this->buf[_this->offs++]:0; +} + +static int ec_read_byte_from_end(ec_dec *_this){ + return _this->end_offs<_this->storage? + _this->buf[_this->storage-++(_this->end_offs)]:0; +} + +/*Normalizes the contents of val and rng so that rng lies entirely in the + high-order symbol.*/ +static void ec_dec_normalize(ec_dec *_this){ + /*If the range is too small, rescale it and input some bits.*/ + while(_this->rng<=EC_CODE_BOT){ + int sym; + _this->nbits_total+=EC_SYM_BITS; + _this->rng<<=EC_SYM_BITS; + /*Use up the remaining bits from our last symbol.*/ + sym=_this->rem; + /*Read the next value from the input.*/ + _this->rem=ec_read_byte(_this); + /*Take the rest of the bits we need from this new symbol.*/ + sym=(sym<rem)>>(EC_SYM_BITS-EC_CODE_EXTRA); + /*And subtract them from val, capped to be less than EC_CODE_TOP.*/ + _this->val=((_this->val<buf=_buf; + _this->storage=_storage; + _this->end_offs=0; + _this->end_window=0; + _this->nend_bits=0; + /*This is the offset from which ec_tell() will subtract partial bits. + The final value after the ec_dec_normalize() call will be the same as in + the encoder, but we have to compensate for the bits that are added there.*/ + _this->nbits_total=EC_CODE_BITS+1 + -((EC_CODE_BITS-EC_CODE_EXTRA)/EC_SYM_BITS)*EC_SYM_BITS; + _this->offs=0; + _this->rng=1U<rem=ec_read_byte(_this); + _this->val=_this->rng-1-(_this->rem>>(EC_SYM_BITS-EC_CODE_EXTRA)); + _this->error=0; + /*Normalize the interval.*/ + ec_dec_normalize(_this); +} + +unsigned ec_decode(ec_dec *_this,unsigned _ft){ + unsigned s; + _this->ext=celt_udiv(_this->rng,_ft); + s=(unsigned)(_this->val/_this->ext); + return _ft-EC_MINI(s+1,_ft); +} + +unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){ + unsigned s; + _this->ext=_this->rng>>_bits; + s=(unsigned)(_this->val/_this->ext); + return (1U<<_bits)-EC_MINI(s+1U,1U<<_bits); +} + +void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ + opus_uint32 s; + s=IMUL32(_this->ext,_ft-_fh); + _this->val-=s; + _this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s; + ec_dec_normalize(_this); +} + +/*The probability of having a "one" is 1/(1<<_logp).*/ +int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){ + opus_uint32 r; + opus_uint32 d; + opus_uint32 s; + int ret; + r=_this->rng; + d=_this->val; + s=r>>_logp; + ret=dval=d-s; + _this->rng=ret?s:r-s; + ec_dec_normalize(_this); + return ret; +} + +int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){ + opus_uint32 r; + opus_uint32 d; + opus_uint32 s; + opus_uint32 t; + int ret; + s=_this->rng; + d=_this->val; + r=s>>_ftb; + ret=-1; + do{ + t=s; + s=IMUL32(r,_icdf[++ret]); + } + while(dval=d-s; + _this->rng=t-s; + ec_dec_normalize(_this); + return ret; +} + +int ec_dec_icdf16(ec_dec *_this,const opus_uint16 *_icdf,unsigned _ftb){ + opus_uint32 r; + opus_uint32 d; + opus_uint32 s; + opus_uint32 t; + int ret; + s=_this->rng; + d=_this->val; + r=s>>_ftb; + ret=-1; + do{ + t=s; + s=IMUL32(r,_icdf[++ret]); + } + while(dval=d-s; + _this->rng=t-s; + ec_dec_normalize(_this); + return ret; +} + +opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft){ + unsigned ft; + unsigned s; + int ftb; + /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ + celt_assert(_ft>1); + _ft--; + ftb=EC_ILOG(_ft); + if(ftb>EC_UINT_BITS){ + opus_uint32 t; + ftb-=EC_UINT_BITS; + ft=(unsigned)(_ft>>ftb)+1; + s=ec_decode(_this,ft); + ec_dec_update(_this,s,s+1,ft); + t=(opus_uint32)s<error=1; + return _ft; + } + else{ + _ft++; + s=ec_decode(_this,(unsigned)_ft); + ec_dec_update(_this,s,s+1,(unsigned)_ft); + return s; + } +} + +opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){ + ec_window window; + int available; + opus_uint32 ret; + window=_this->end_window; + available=_this->nend_bits; + if((unsigned)available<_bits){ + do{ + window|=(ec_window)ec_read_byte_from_end(_this)<>=_bits; + available-=_bits; + _this->end_window=window; + _this->nend_bits=available; + _this->nbits_total+=_bits; + return ret; +} diff --git a/src/libopus/celt/entdec.h b/src/libopus/celt/entdec.h new file mode 100644 index 00000000..c81f26fd --- /dev/null +++ b/src/libopus/celt/entdec.h @@ -0,0 +1,110 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +#if !defined(_entdec_H) +# define _entdec_H (1) +# include +# include "entcode.h" + +/*Initializes the decoder. + _buf: The input buffer to use. + Return: 0 on success, or a negative value on error.*/ +void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage); + +/*Calculates the cumulative frequency for the next symbol. + This can then be fed into the probability model to determine what that + symbol is, and the additional frequency information required to advance to + the next symbol. + This function cannot be called more than once without a corresponding call to + ec_dec_update(), or decoding will not proceed correctly. + _ft: The total frequency of the symbols in the alphabet the next symbol was + encoded with. + Return: A cumulative frequency representing the encoded symbol. + If the cumulative frequency of all the symbols before the one that + was encoded was fl, and the cumulative frequency of all the symbols + up to and including the one encoded is fh, then the returned value + will fall in the range [fl,fh).*/ +unsigned ec_decode(ec_dec *_this,unsigned _ft); + +/*Equivalent to ec_decode() with _ft==1<<_bits.*/ +unsigned ec_decode_bin(ec_dec *_this,unsigned _bits); + +/*Advance the decoder past the next symbol using the frequency information the + symbol was encoded with. + Exactly one call to ec_decode() must have been made so that all necessary + intermediate calculations are performed. + _fl: The cumulative frequency of all symbols that come before the symbol + decoded. + _fh: The cumulative frequency of all symbols up to and including the symbol + decoded. + Together with _fl, this defines the range [_fl,_fh) in which the value + returned above must fall. + _ft: The total frequency of the symbols in the alphabet the symbol decoded + was encoded in. + This must be the same as passed to the preceding call to ec_decode().*/ +void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft); + +/* Decode a bit that has a 1/(1<<_logp) probability of being a one */ +int ec_dec_bit_logp(ec_dec *_this,unsigned _logp); + +/*Decodes a symbol given an "inverse" CDF table. + No call to ec_dec_update() is necessary after this call. + _icdf: The "inverse" CDF, such that symbol s falls in the range + [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb. + The values must be monotonically non-increasing, and the last value + must be 0. + _ftb: The number of bits of precision in the cumulative distribution. + Return: The decoded symbol s.*/ +int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); + +/*Decodes a symbol given an "inverse" CDF table. + No call to ec_dec_update() is necessary after this call. + _icdf: The "inverse" CDF, such that symbol s falls in the range + [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb. + The values must be monotonically non-increasing, and the last value + must be 0. + _ftb: The number of bits of precision in the cumulative distribution. + Return: The decoded symbol s.*/ +int ec_dec_icdf16(ec_dec *_this,const opus_uint16 *_icdf,unsigned _ftb); + +/*Extracts a raw unsigned integer with a non-power-of-2 range from the stream. + The bits must have been encoded with ec_enc_uint(). + No call to ec_dec_update() is necessary after this call. + _ft: The number of integers that can be decoded (one more than the max). + This must be at least 2, and no more than 2**32-1. + Return: The decoded bits.*/ +opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft); + +/*Extracts a sequence of raw bits from the stream. + The bits must have been encoded with ec_enc_bits(). + No call to ec_dec_update() is necessary after this call. + _ftb: The number of bits to extract. + This must be between 0 and 25, inclusive. + Return: The decoded bits.*/ +opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb); + +#endif diff --git a/src/libopus/celt/entenc.c b/src/libopus/celt/entenc.c new file mode 100644 index 00000000..b297ad76 --- /dev/null +++ b/src/libopus/celt/entenc.c @@ -0,0 +1,305 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +#if defined(__STDC__) +# include "config.h" +#endif +#include "os_support.h" +#include "arch.h" +#include "entenc.h" +#include "mfrngcod.h" + +/*A range encoder. + See entdec.c and the references for implementation details \cite{Mar79,MNW98}. + + @INPROCEEDINGS{Mar79, + author="Martin, G.N.N.", + title="Range encoding: an algorithm for removing redundancy from a digitised + message", + booktitle="Video \& Data Recording Conference", + year=1979, + address="Southampton", + month=Jul + } + @ARTICLE{MNW98, + author="Alistair Moffat and Radford Neal and Ian H. Witten", + title="Arithmetic Coding Revisited", + journal="{ACM} Transactions on Information Systems", + year=1998, + volume=16, + number=3, + pages="256--294", + month=Jul, + URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" + }*/ + +static int ec_write_byte(ec_enc *_this,unsigned _value){ + if(_this->offs+_this->end_offs>=_this->storage)return -1; + _this->buf[_this->offs++]=(unsigned char)_value; + return 0; +} + +static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){ + if(_this->offs+_this->end_offs>=_this->storage)return -1; + _this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value; + return 0; +} + +/*Outputs a symbol, with a carry bit. + If there is a potential to propagate a carry over several symbols, they are + buffered until it can be determined whether or not an actual carry will + occur. + If the counter for the buffered symbols overflows, then the stream becomes + undecodable. + This gives a theoretical limit of a few billion symbols in a single packet on + 32-bit systems. + The alternative is to truncate the range in order to force a carry, but + requires similar carry tracking in the decoder, needlessly slowing it down.*/ +static void ec_enc_carry_out(ec_enc *_this,int _c){ + if(_c!=EC_SYM_MAX){ + /*No further carry propagation possible, flush buffer.*/ + int carry; + carry=_c>>EC_SYM_BITS; + /*Don't output a byte on the first write. + This compare should be taken care of by branch-prediction thereafter.*/ + if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry); + if(_this->ext>0){ + unsigned sym; + sym=(EC_SYM_MAX+carry)&EC_SYM_MAX; + do _this->error|=ec_write_byte(_this,sym); + while(--(_this->ext)>0); + } + _this->rem=_c&EC_SYM_MAX; + } + else _this->ext++; +} + +static OPUS_INLINE void ec_enc_normalize(ec_enc *_this){ + /*If the range is too small, output some bits and rescale it.*/ + while(_this->rng<=EC_CODE_BOT){ + ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT)); + /*Move the next-to-high-order symbol into the high-order position.*/ + _this->val=(_this->val<rng<<=EC_SYM_BITS; + _this->nbits_total+=EC_SYM_BITS; + } +} + +void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){ + _this->buf=_buf; + _this->end_offs=0; + _this->end_window=0; + _this->nend_bits=0; + /*This is the offset from which ec_tell() will subtract partial bits.*/ + _this->nbits_total=EC_CODE_BITS+1; + _this->offs=0; + _this->rng=EC_CODE_TOP; + _this->rem=-1; + _this->val=0; + _this->ext=0; + _this->storage=_size; + _this->error=0; +} + +void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ + opus_uint32 r; + r=celt_udiv(_this->rng,_ft); + if(_fl>0){ + _this->val+=_this->rng-IMUL32(r,(_ft-_fl)); + _this->rng=IMUL32(r,(_fh-_fl)); + } + else _this->rng-=IMUL32(r,(_ft-_fh)); + ec_enc_normalize(_this); +} + +void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){ + opus_uint32 r; + r=_this->rng>>_bits; + if(_fl>0){ + _this->val+=_this->rng-IMUL32(r,((1U<<_bits)-_fl)); + _this->rng=IMUL32(r,(_fh-_fl)); + } + else _this->rng-=IMUL32(r,((1U<<_bits)-_fh)); + ec_enc_normalize(_this); +} + +/*The probability of having a "one" is 1/(1<<_logp).*/ +void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){ + opus_uint32 r; + opus_uint32 s; + opus_uint32 l; + r=_this->rng; + l=_this->val; + s=r>>_logp; + r-=s; + if(_val)_this->val=l+r; + _this->rng=_val?s:r; + ec_enc_normalize(_this); +} + +void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){ + opus_uint32 r; + r=_this->rng>>_ftb; + if(_s>0){ + _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]); + _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]); + } + else _this->rng-=IMUL32(r,_icdf[_s]); + ec_enc_normalize(_this); +} + +void ec_enc_icdf16(ec_enc *_this,int _s,const opus_uint16 *_icdf,unsigned _ftb){ + opus_uint32 r; + r=_this->rng>>_ftb; + if(_s>0){ + _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]); + _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]); + } + else _this->rng-=IMUL32(r,_icdf[_s]); + ec_enc_normalize(_this); +} + +void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){ + unsigned ft; + unsigned fl; + int ftb; + /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ + celt_assert(_ft>1); + _ft--; + ftb=EC_ILOG(_ft); + if(ftb>EC_UINT_BITS){ + ftb-=EC_UINT_BITS; + ft=(_ft>>ftb)+1; + fl=(unsigned)(_fl>>ftb); + ec_encode(_this,fl,fl+1,ft); + ec_enc_bits(_this,_fl&(((opus_uint32)1<end_window; + used=_this->nend_bits; + celt_assert(_bits>0); + if(used+_bits>EC_WINDOW_SIZE){ + do{ + _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); + window>>=EC_SYM_BITS; + used-=EC_SYM_BITS; + } + while(used>=EC_SYM_BITS); + } + window|=(ec_window)_fl<end_window=window; + _this->nend_bits=used; + _this->nbits_total+=_bits; +} + +void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){ + int shift; + unsigned mask; + celt_assert(_nbits<=EC_SYM_BITS); + shift=EC_SYM_BITS-_nbits; + mask=((1<<_nbits)-1)<offs>0){ + /*The first byte has been finalized.*/ + _this->buf[0]=(unsigned char)((_this->buf[0]&~mask)|_val<rem>=0){ + /*The first byte is still awaiting carry propagation.*/ + _this->rem=(_this->rem&~mask)|_val<rng<=(EC_CODE_TOP>>_nbits)){ + /*The renormalization loop has never been run.*/ + _this->val=(_this->val&~((opus_uint32)mask<error=-1; +} + +void ec_enc_shrink(ec_enc *_this,opus_uint32 _size){ + celt_assert(_this->offs+_this->end_offs<=_size); + OPUS_MOVE(_this->buf+_size-_this->end_offs, + _this->buf+_this->storage-_this->end_offs,_this->end_offs); + _this->storage=_size; +} + +void ec_enc_done(ec_enc *_this){ + ec_window window; + int used; + opus_uint32 msk; + opus_uint32 end; + int l; + /*We output the minimum number of bits that ensures that the symbols encoded + thus far will be decoded correctly regardless of the bits that follow.*/ + l=EC_CODE_BITS-EC_ILOG(_this->rng); + msk=(EC_CODE_TOP-1)>>l; + end=(_this->val+msk)&~msk; + if((end|msk)>=_this->val+_this->rng){ + l++; + msk>>=1; + end=(_this->val+msk)&~msk; + } + while(l>0){ + ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); + end=(end<rem>=0||_this->ext>0)ec_enc_carry_out(_this,0); + /*If we have buffered extra bits, flush them as well.*/ + window=_this->end_window; + used=_this->nend_bits; + while(used>=EC_SYM_BITS){ + _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); + window>>=EC_SYM_BITS; + used-=EC_SYM_BITS; + } + /*Clear any excess space and add any remaining extra bits to the last byte.*/ + if(!_this->error){ + OPUS_CLEAR(_this->buf+_this->offs, + _this->storage-_this->offs-_this->end_offs); + if(used>0){ + /*If there's no range coder data at all, give up.*/ + if(_this->end_offs>=_this->storage)_this->error=-1; + else{ + l=-l; + /*If we've busted, don't add too many extra bits to the last byte; it + would corrupt the range coder data, and that's more important.*/ + if(_this->offs+_this->end_offs>=_this->storage&&lerror=-1; + } + _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window; + } + } + } +} diff --git a/src/libopus/celt/entenc.h b/src/libopus/celt/entenc.h new file mode 100644 index 00000000..010874bb --- /dev/null +++ b/src/libopus/celt/entenc.h @@ -0,0 +1,119 @@ +/* Copyright (c) 2001-2011 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +#if !defined(_entenc_H) +# define _entenc_H (1) +# include +# include "entcode.h" + +/*Initializes the encoder. + _buf: The buffer to store output bytes in. + _size: The size of the buffer, in chars.*/ +void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size); +/*Encodes a symbol given its frequency information. + The frequency information must be discernable by the decoder, assuming it + has read only the previous symbols from the stream. + It is allowable to change the frequency information, or even the entire + source alphabet, so long as the decoder can tell from the context of the + previously encoded information that it is supposed to do so as well. + _fl: The cumulative frequency of all symbols that come before the one to be + encoded. + _fh: The cumulative frequency of all symbols up to and including the one to + be encoded. + Together with _fl, this defines the range [_fl,_fh) in which the + decoded value will fall. + _ft: The sum of the frequencies of all the symbols*/ +void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft); + +/*Equivalent to ec_encode() with _ft==1<<_bits.*/ +void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits); + +/* Encode a bit that has a 1/(1<<_logp) probability of being a one */ +void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp); + +/*Encodes a symbol given an "inverse" CDF table. + _s: The index of the symbol to encode. + _icdf: The "inverse" CDF, such that symbol _s falls in the range + [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb. + The values must be monotonically non-increasing, and the last value + must be 0. + _ftb: The number of bits of precision in the cumulative distribution.*/ +void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb); + +/*Encodes a symbol given an "inverse" CDF table. + _s: The index of the symbol to encode. + _icdf: The "inverse" CDF, such that symbol _s falls in the range + [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb. + The values must be monotonically non-increasing, and the last value + must be 0. + _ftb: The number of bits of precision in the cumulative distribution.*/ +void ec_enc_icdf16(ec_enc *_this,int _s,const opus_uint16 *_icdf,unsigned _ftb); + +/*Encodes a raw unsigned integer in the stream. + _fl: The integer to encode. + _ft: The number of integers that can be encoded (one more than the max). + This must be at least 2, and no more than 2**32-1.*/ +void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft); + +/*Encodes a sequence of raw bits in the stream. + _fl: The bits to encode. + _ftb: The number of bits to encode. + This must be between 1 and 25, inclusive.*/ +void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _ftb); + +/*Overwrites a few bits at the very start of an existing stream, after they + have already been encoded. + This makes it possible to have a few flags up front, where it is easy for + decoders to access them without parsing the whole stream, even if their + values are not determined until late in the encoding process, without having + to buffer all the intermediate symbols in the encoder. + In order for this to work, at least _nbits bits must have already been + encoded using probabilities that are an exact power of two. + The encoder can verify the number of encoded bits is sufficient, but cannot + check this latter condition. + _val: The bits to encode (in the least _nbits significant bits). + They will be decoded in order from most-significant to least. + _nbits: The number of bits to overwrite. + This must be no more than 8.*/ +void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits); + +/*Compacts the data to fit in the target size. + This moves up the raw bits at the end of the current buffer so they are at + the end of the new buffer size. + The caller must ensure that the amount of data that's already been written + will fit in the new size. + _size: The number of bytes in the new buffer. + This must be large enough to contain the bits already written, and + must be no larger than the existing size.*/ +void ec_enc_shrink(ec_enc *_this,opus_uint32 _size); + +/*Indicates that there are no more symbols to encode. + All reamining output bytes are flushed to the output buffer. + ec_enc_init() must be called before the encoder can be used again.*/ +void ec_enc_done(ec_enc *_this); + +#endif diff --git a/src/libopus/celt/fixed_debug.h b/src/libopus/celt/fixed_debug.h new file mode 100644 index 00000000..ef2e5d02 --- /dev/null +++ b/src/libopus/celt/fixed_debug.h @@ -0,0 +1,836 @@ +/* Copyright (C) 2003-2008 Jean-Marc Valin + Copyright (C) 2007-2012 Xiph.Org Foundation */ +/** + @file fixed_debug.h + @brief Fixed-point operations with debugging +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 FIXED_DEBUG_H +#define FIXED_DEBUG_H + +#include +#include "opus_defines.h" + +#ifdef CELT_C +OPUS_EXPORT opus_int64 celt_mips=0; +#else +extern opus_int64 celt_mips; +#endif + +#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) +#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15)) + +/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16)) + +#define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16) + +#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) +#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) + +#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) +#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) +#define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1)) + +#define SHR(a,b) SHR32(a,b) +#define PSHR(a,b) PSHR32(a,b) + +/** Add two 32-bit values, ignore any overflows */ +#define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) +/** Subtract two 32-bit values, ignore any overflows */ +#define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) +/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ +/** Negate 32-bit value, ignore any overflows */ +#define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a))) + +static OPUS_INLINE short NEG16(int x) +{ + int res; + if (!VERIFY_SHORT(x)) + { + fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = -x; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips++; + return res; +} +static OPUS_INLINE int NEG32(opus_int64 x) +{ + opus_int64 res; + if (!VERIFY_INT(x)) + { + fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = -x; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} + +#define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__) +static OPUS_INLINE short EXTRACT16_(int x, char *file, int line) +{ + int res; + if (!VERIFY_SHORT(x)) + { + fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = x; + celt_mips++; + return res; +} + +#define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__) +static OPUS_INLINE int EXTEND32_(int x, char *file, int line) +{ + int res; + if (!VERIFY_SHORT(x)) + { + fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = x; + celt_mips++; + return res; +} + +#define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__) +static OPUS_INLINE short SHR16_(int a, int shift, char *file, int line) +{ + int res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) + { + fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a>>shift; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips++; + return res; +} +#define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__) +static OPUS_INLINE short SHL16_(int a, int shift, char *file, int line) +{ + opus_int32 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) + { + fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = (opus_int32)((opus_uint32)a<>shift; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} +#define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__) +static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) + { + fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", (long long)a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = (opus_int64)((opus_uint64)a<>1))),shift)) +#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) + +#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) +#define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767))); + +#define HALF16(x) (SHR16(x,1)) +#define HALF32(x) (SHR32(x,1)) + +#define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__) +static OPUS_INLINE short ADD16_(int a, int b, char *file, int line) +{ + int res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a+b; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips++; + return res; +} + +#define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__) +static OPUS_INLINE short SUB16_(int a, int b, char *file, int line) +{ + int res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a-b; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips++; + return res; +} + +#define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__) +static OPUS_INLINE int ADD32_(opus_int64 a, opus_int64 b, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_INT(a) || !VERIFY_INT(b)) + { + fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a+b; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} + +#define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__) +static OPUS_INLINE int SUB32_(opus_int64 a, opus_int64 b, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_INT(a) || !VERIFY_INT(b)) + { + fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a-b; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} + +#undef UADD32 +#define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__) +static OPUS_INLINE unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line) +{ + opus_uint64 res; + if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) + { + fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", (unsigned long long)a, (unsigned long long)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a+b; + if (!VERIFY_UINT(res)) + { + fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", (unsigned long long)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} + +#undef USUB32 +#define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__) +static OPUS_INLINE unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line) +{ + opus_uint64 res; + if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) + { + fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", (unsigned long long)a, (unsigned long long)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + if (a> 16; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT32_32_Q16: output is not int: %lld*%lld=%lld\n", (long long)a, (long long)b, (long long)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=5; + return res; +} + +#define MULT16_16(a, b) MULT16_16_(a, b, __FILE__, __LINE__) +static OPUS_INLINE int MULT16_16_(int a, int b, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips++; + return res; +} + +#define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b)))) + +#define MULT16_32_QX(a, b, Q) MULT16_32_QX_(a, b, Q, __FILE__, __LINE__) +static OPUS_INLINE int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) + { + fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + if (ABS32(b)>=((opus_int64)(1)<<(16+Q))) + { + fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = (((opus_int64)a)*(opus_int64)b) >> Q; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + if (Q==15) + celt_mips+=3; + else + celt_mips+=4; + return res; +} + +#define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__) +static OPUS_INLINE int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) + { + fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + if (ABS32(b)>=((opus_int64)(1)<<(16+Q))) + { + fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<>1))>> Q; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + if (Q==15) + celt_mips+=4; + else + celt_mips+=5; + return res; +} + +#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) +#define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b)))) +#define MAC16_32_Q16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q16((a),(b)))) + +static OPUS_INLINE int SATURATE(int a, int b) +{ + if (a>b) + a=b; + if (a<-b) + a = -b; + celt_mips+=3; + return a; +} + +static OPUS_INLINE opus_int16 SATURATE16(opus_int32 a) +{ + celt_mips+=3; + if (a>32767) + return 32767; + else if (a<-32768) + return -32768; + else return a; +} + +static OPUS_INLINE int MULT16_16_Q11_32(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res >>= 11; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=3; + return res; +} +static OPUS_INLINE short MULT16_16_Q13(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res >>= 13; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=3; + return res; +} +static OPUS_INLINE short MULT16_16_Q14(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res >>= 14; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=3; + return res; +} + +#define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__) +static OPUS_INLINE short MULT16_16_Q15_(int a, int b, char *file, int line) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res >>= 15; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=1; + return res; +} + +static OPUS_INLINE short MULT16_16_P13(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res += 4096; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res >>= 13; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=4; + return res; +} +static OPUS_INLINE short MULT16_16_P14(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res += 8192; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res >>= 14; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=4; + return res; +} +static OPUS_INLINE short MULT16_16_P15(int a, int b) +{ + opus_int64 res; + if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = ((opus_int64)a)*b; + res += 16384; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res >>= 15; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=2; + return res; +} + +#define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__) + +static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) +{ + opus_int64 res; + if (b==0) + { + fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + return 0; + } + if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) + { + fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a/b; + if (!VERIFY_SHORT(res)) + { + fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); + if (res>32767) + res = 32767; + if (res<-32768) + res = -32768; +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=35; + return res; +} + +#define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__) +static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) +{ + opus_int64 res; + if (b==0) + { + fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + return 0; + } + + if (!VERIFY_INT(a) || !VERIFY_INT(b)) + { + fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + res = a/b; + if (!VERIFY_INT(res)) + { + fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); +#ifdef FIXED_DEBUG_ASSERT + celt_assert(0); +#endif + } + celt_mips+=70; + return res; +} + +static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) +{ + x = PSHR32(x, SIG_SHIFT); + x = MAX32(x, -32768); + x = MIN32(x, 32767); + return EXTRACT16(x); +} +#define SIG2WORD16(x) (SIG2WORD16_generic(x)) + + +#undef PRINT_MIPS +#define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", (unsigned long long)celt_mips);} while (0); + +#endif diff --git a/src/libopus/celt/fixed_generic.h b/src/libopus/celt/fixed_generic.h new file mode 100644 index 00000000..8f29d46b --- /dev/null +++ b/src/libopus/celt/fixed_generic.h @@ -0,0 +1,188 @@ +/* Copyright (C) 2007-2009 Xiph.Org Foundation + Copyright (C) 2003-2008 Jean-Marc Valin + Copyright (C) 2007-2008 CSIRO */ +/** + @file fixed_generic.h + @brief Generic fixed-point operations +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 FIXED_GENERIC_H +#define FIXED_GENERIC_H + +/** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */ +#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) + +/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT16_32_Q16(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),16)) +#else +#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) +#endif + +/** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT16_32_P16(a,b) ((opus_val32)PSHR((opus_int64)((opus_val16)(a))*(b),16)) +#else +#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) +#endif + +/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT16_32_Q15(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),15)) +#else +#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) +#endif + +/** 32x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT32_32_Q16(a,b) ((opus_val32)SHR((opus_int64)(a)*(opus_int64)(b),16)) +#else +#define MULT32_32_Q16(a,b) (ADD32(ADD32(ADD32((opus_val32)(SHR32(((opus_uint32)((a)&0x0000ffff)*(opus_uint32)((b)&0x0000ffff)),16)), MULT16_16SU(SHR32(a,16),((b)&0x0000ffff))), MULT16_16SU(SHR32(b,16),((a)&0x0000ffff))), SHL32(MULT16_16(SHR32(a,16),SHR32(b,16)),16))) +#endif + +/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT32_32_Q31(a,b) ((opus_val32)SHR((opus_int64)(a)*(opus_int64)(b),31)) +#else +#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) +#endif + +/** Compile-time conversion of float constant to 16-bit value */ +#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) + +/** Compile-time conversion of float constant to 32-bit value */ +#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) + +/** Negate a 16-bit value */ +#define NEG16(x) (-(x)) +/** Negate a 32-bit value */ +#define NEG32(x) (-(x)) + +/** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */ +#define EXTRACT16(x) ((opus_val16)(x)) +/** Change a 16-bit value into a 32-bit value */ +#define EXTEND32(x) ((opus_val32)(x)) + +/** Arithmetic shift-right of a 16-bit value */ +#define SHR16(a,shift) ((a) >> (shift)) +/** Arithmetic shift-left of a 16-bit value */ +#define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift))) +/** Arithmetic shift-right of a 32-bit value */ +#define SHR32(a,shift) ((a) >> (shift)) +/** Arithmetic shift-left of a 32-bit value */ +#define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift))) + +/** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ +#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +/** 32-bit arithmetic shift right where the argument can be negative */ +#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) + +/** "RAW" macros, should not be used outside of this header file */ +#define SHR(a,shift) ((a) >> (shift)) +#define SHL(a,shift) SHL32(a,shift) +#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) + +#define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) + +/** Shift by a and round-to-nearest 32-bit value. Result is a 16-bit value */ +#define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) +/** Shift by a and round-to-nearest 32-bit value. Result is a saturated 16-bit value */ +#define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767)); + +/** Divide by two */ +#define HALF16(x) (SHR16(x,1)) +#define HALF32(x) (SHR32(x,1)) + +/** Add two 16-bit values */ +#define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) +/** Subtract two 16-bit values */ +#define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) +/** Add two 32-bit values */ +#define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) +/** Subtract two 32-bit values */ +#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) + +/** Add two 32-bit values, ignore any overflows */ +#define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) +/** Subtract two 32-bit values, ignore any overflows */ +#define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) +/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ +/** Negate 32-bit value, ignore any overflows */ +#define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a))) + +/** 16x16 multiplication where the result fits in 16 bits */ +#define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) + +/** 32x32 multiplication where the result fits in 32 bits */ +#define MULT32_32_32(a,b) ((((opus_val32)(a))*((opus_val32)(b)))) + +/* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */ +/** 16x16 multiplication where the result fits in 32 bits */ +#define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b))) + +/** 16x16 multiply-add where the result fits in 32 bits */ +#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) +/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. + b must fit in 31 bits. + Result fits in 32 bits. */ +#define MAC16_32_Q15(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) + +/** 16x32 multiplication, followed by a 16-bit shift right and 32-bit add. + Results fits in 32 bits */ +#define MAC16_32_Q16(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))) + +#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) +#define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) +#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) +#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) +#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) + +#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) +#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) +#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) + +/** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ +#define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b)))) + +/** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ +#define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b))) + +#if defined(MIPSr1_ASM) +#include "mips/fixed_generic_mipsr1.h" +#endif + +static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) +{ + x = PSHR32(x, SIG_SHIFT); + x = MAX32(x, -32768); + x = MIN32(x, 32767); + return EXTRACT16(x); +} +#define SIG2WORD16(x) (SIG2WORD16_generic(x)) + +#endif diff --git a/src/libopus/celt/float_cast.h b/src/libopus/celt/float_cast.h new file mode 100644 index 00000000..8915a5fd --- /dev/null +++ b/src/libopus/celt/float_cast.h @@ -0,0 +1,152 @@ +/* Copyright (C) 2001 Erik de Castro Lopo */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/* Version 1.1 */ + +#ifndef FLOAT_CAST_H +#define FLOAT_CAST_H + + +#include "arch.h" + +/*============================================================================ +** On Intel Pentium processors (especially PIII and probably P4), converting +** from float to int is very slow. To meet the C specs, the code produced by +** most C compilers targeting Pentium needs to change the FPU rounding mode +** before the float to int conversion is performed. +** +** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It +** is this flushing of the pipeline which is so slow. +** +** Fortunately the ISO C99 specifications define the functions lrint, lrintf, +** llrint and llrintf which fix this problem as a side effect. +** +** On Unix-like systems, the configure process should have detected the +** presence of these functions. If they weren't found we have to replace them +** here with a standard C cast. +*/ + +/* +** The C99 prototypes for lrint and lrintf are as follows: +** +** long int lrintf (float x) ; +** long int lrint (double x) ; +*/ + +/* The presence of the required functions are detected during the configure +** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in +** the config.h file. +*/ + +/* With GCC, when SSE is available, the fastest conversion is cvtss2si. */ +#if defined(__GNUC__) && defined(__SSE__) + +#include +static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_ss(x));} + +#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1)) + + #include + static OPUS_INLINE opus_int32 float2int(float value) + { + /* _mm_load_ss will generate same code as _mm_set_ss + ** in _MSC_VER >= 1914 /02 so keep __mm_load__ss + ** for backward compatibility. + */ + return _mm_cvtss_si32(_mm_load_ss(&value)); + } + +#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_IX86) + + #include + + /* Win32 doesn't seem to have these functions. + ** Therefore implement OPUS_INLINE versions of these functions here. + */ + + static OPUS_INLINE opus_int32 + float2int (float flt) + { int intgr; + + _asm + { fld flt + fistp intgr + } ; + + return intgr ; + } + +#elif defined(HAVE_LRINTF) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* These defines enable functionality introduced with the 1999 ISO C +** standard. They must be defined before the inclusion of math.h to +** engage them. If optimisation is enabled, these functions will be +** inlined. With optimisation switched off, you have to link in the +** maths library using -lm. +*/ + +#define _ISOC9X_SOURCE 1 +#define _ISOC99_SOURCE 1 + +#define __USE_ISOC9X 1 +#define __USE_ISOC99 1 + +#include +#define float2int(x) lrintf(x) + +#elif defined(HAVE_LRINT) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +#define _ISOC9X_SOURCE 1 +#define _ISOC99_SOURCE 1 + +#define __USE_ISOC9X 1 +#define __USE_ISOC99 1 + +#include +#define float2int(x) lrint(x) + +#else + +#if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) + /* supported by gcc in C99 mode, but not by all other compilers */ + #warning "Don't have the functions lrint() and lrintf ()." + #warning "Replacing these functions with a standard C cast." +#endif /* __STDC_VERSION__ >= 199901L */ + #include + #define float2int(flt) ((int)(floor(.5+flt))) +#endif + +#ifndef DISABLE_FLOAT_API +static OPUS_INLINE opus_int16 FLOAT2INT16(float x) +{ + x = x*CELT_SIG_SCALE; + x = MAX32(x, -32768); + x = MIN32(x, 32767); + return (opus_int16)float2int(x); +} +#endif /* DISABLE_FLOAT_API */ + +#endif /* FLOAT_CAST_H */ diff --git a/src/libopus/celt/kiss_fft.c b/src/libopus/celt/kiss_fft.c new file mode 100644 index 00000000..2df03146 --- /dev/null +++ b/src/libopus/celt/kiss_fft.c @@ -0,0 +1,604 @@ +/*Copyright (c) 2003-2004, Mark Borgerding + Lots of modifications by Jean-Marc Valin + Copyright (c) 2005-2007, Xiph.Org Foundation + Copyright (c) 2008, Xiph.Org Foundation, CSIRO + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.*/ + +/* This code is originally from Mark Borgerding's KISS-FFT but has been + heavily modified to better suit Opus */ + +#ifndef SKIP_CONFIG_H +# ifdef __STDC__ +# include "config.h" +# endif +#endif + +#include "_kiss_fft_guts.h" +#include "arch.h" +#include "os_support.h" +#include "mathops.h" +#include "stack_alloc.h" + +/* The guts header contains all the multiplication and addition macros that are defined for + complex numbers. It also delares the kf_ internal functions. +*/ + +static void kf_bfly2( + kiss_fft_cpx * Fout, + int m, + int N + ) +{ + kiss_fft_cpx * Fout2; + int i; + (void)m; +#ifdef CUSTOM_MODES + if (m==1) + { + celt_assert(m==1); + for (i=0;itwiddles; + /* m is guaranteed to be a multiple of 4. */ + for (j=0;jtwiddles[fstride*m]; +#endif + for (i=0;itwiddles; + /* For non-custom modes, m is guaranteed to be a multiple of 4. */ + k=m; + do { + + C_MUL(scratch[1],Fout[m] , *tw1); + C_MUL(scratch[2],Fout[m2] , *tw2); + + C_ADD(scratch[3],scratch[1],scratch[2]); + C_SUB(scratch[0],scratch[1],scratch[2]); + tw1 += fstride; + tw2 += fstride*2; + + Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); + Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); + + C_MULBYSCALAR( scratch[0] , epi3.i ); + + C_ADDTO(*Fout,scratch[3]); + + Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); + Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); + + Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); + Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); + + ++Fout; + } while(--k); + } +} + + +#ifndef OVERRIDE_kf_bfly5 +static void kf_bfly5( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_state *st, + int m, + int N, + int mm + ) +{ + kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; + int i, u; + kiss_fft_cpx scratch[13]; + const kiss_twiddle_cpx *tw; + kiss_twiddle_cpx ya,yb; + kiss_fft_cpx * Fout_beg = Fout; + +#ifdef FIXED_POINT + ya.r = 10126; + ya.i = -31164; + yb.r = -26510; + yb.i = -19261; +#else + ya = st->twiddles[fstride*m]; + yb = st->twiddles[fstride*2*m]; +#endif + tw=st->twiddles; + + for (i=0;ir = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); + Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i)); + + scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r))); + scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r))); + + scratch[6].r = ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i)); + scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i))); + + C_SUB(*Fout1,scratch[5],scratch[6]); + C_ADD(*Fout4,scratch[5],scratch[6]); + + scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r))); + scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); + scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i)); + scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i)); + + C_ADD(*Fout2,scratch[11],scratch[12]); + C_SUB(*Fout3,scratch[11],scratch[12]); + + ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; + } + } +} +#endif /* OVERRIDE_kf_bfly5 */ + + +#endif + + +#ifdef CUSTOM_MODES + +static +void compute_bitrev_table( + int Fout, + opus_int16 *f, + const size_t fstride, + int in_stride, + opus_int16 * factors, + const kiss_fft_state *st + ) +{ + const int p=*factors++; /* the radix */ + const int m=*factors++; /* stage's fft length/p */ + + /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ + if (m==1) + { + int j; + for (j=0;j32000 || (opus_int32)p*(opus_int32)p > n) + p = n; /* no more factors, skip to end */ + } + n /= p; +#ifdef RADIX_TWO_ONLY + if (p!=2 && p != 4) +#else + if (p>5) +#endif + { + return 0; + } + facbuf[2*stages] = p; + if (p==2 && stages > 1) + { + facbuf[2*stages] = 4; + facbuf[2] = 2; + } + stages++; + } while (n > 1); + n = nbak; + /* Reverse the order to get the radix 4 at the end, so we can use the + fast degenerate case. It turns out that reversing the order also + improves the noise behaviour. */ + for (i=0;i= memneeded) + st = (kiss_fft_state*)mem; + *lenmem = memneeded; + } + if (st) { + opus_int16 *bitrev; + kiss_twiddle_cpx *twiddles; + + st->nfft=nfft; +#ifdef FIXED_POINT + st->scale_shift = celt_ilog2(st->nfft); + if (st->nfft == 1<scale_shift) + st->scale = Q15ONE; + else + st->scale = (1073741824+st->nfft/2)/st->nfft>>(15-st->scale_shift); +#else + st->scale = 1.f/nfft; +#endif + if (base != NULL) + { + st->twiddles = base->twiddles; + st->shift = 0; + while (st->shift < 32 && nfft<shift != base->nfft) + st->shift++; + if (st->shift>=32) + goto fail; + } else { + st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); + compute_twiddles(twiddles, nfft); + st->shift = -1; + } + if (!kf_factor(nfft,st->factors)) + { + goto fail; + } + + /* bitrev */ + st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft); + if (st->bitrev==NULL) + goto fail; + compute_bitrev_table(0, bitrev, 1,1, st->factors,st); + + /* Initialize architecture specific fft parameters */ + if (opus_fft_alloc_arch(st, arch)) + goto fail; + } + return st; +fail: + opus_fft_free(st, arch); + return NULL; +} + +kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch) +{ + return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL, arch); +} + +void opus_fft_free_arch_c(kiss_fft_state *st) { + (void)st; +} + +void opus_fft_free(const kiss_fft_state *cfg, int arch) +{ + if (cfg) + { + opus_fft_free_arch((kiss_fft_state *)cfg, arch); + opus_free((opus_int16*)cfg->bitrev); + if (cfg->shift < 0) + opus_free((kiss_twiddle_cpx*)cfg->twiddles); + opus_free((kiss_fft_state*)cfg); + } +} + +#endif /* CUSTOM_MODES */ + +void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout) +{ + int m2, m; + int p; + int L; + int fstride[MAXFACTORS]; + int i; + int shift; + + /* st->shift can be -1 */ + shift = st->shift>0 ? st->shift : 0; + + fstride[0] = 1; + L=0; + do { + p = st->factors[2*L]; + m = st->factors[2*L+1]; + fstride[L+1] = fstride[L]*p; + L++; + } while(m!=1); + m = st->factors[2*L-1]; + for (i=L-1;i>=0;i--) + { + if (i!=0) + m2 = st->factors[2*i-1]; + else + m2 = 1; + switch (st->factors[2*i]) + { + case 2: + kf_bfly2(fout, m, fstride[i]); + break; + case 4: + kf_bfly4(fout,fstride[i]<scale_shift-1; +#endif + scale = st->scale; + + celt_assert2 (fin != fout, "In-place FFT not supported"); + /* Bit-reverse the input */ + for (i=0;infft;i++) + { + kiss_fft_cpx x = fin[i]; + fout[st->bitrev[i]].r = SHR32(MULT16_32_Q16(scale, x.r), scale_shift); + fout[st->bitrev[i]].i = SHR32(MULT16_32_Q16(scale, x.i), scale_shift); + } + opus_fft_impl(st, fout); +} + + +void opus_ifft_c(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +{ + int i; + celt_assert2 (fin != fout, "In-place FFT not supported"); + /* Bit-reverse the input */ + for (i=0;infft;i++) + fout[st->bitrev[i]] = fin[i]; + for (i=0;infft;i++) + fout[i].i = -fout[i].i; + opus_fft_impl(st, fout); + for (i=0;infft;i++) + fout[i].i = -fout[i].i; +} diff --git a/src/libopus/celt/kiss_fft.h b/src/libopus/celt/kiss_fft.h new file mode 100644 index 00000000..267f72f9 --- /dev/null +++ b/src/libopus/celt/kiss_fft.h @@ -0,0 +1,210 @@ +/*Copyright (c) 2003-2004, Mark Borgerding + Lots of modifications by Jean-Marc Valin + Copyright (c) 2005-2007, Xiph.Org Foundation + Copyright (c) 2008, Xiph.Org Foundation, CSIRO + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 KISS_FFT_H +#define KISS_FFT_H + +#include +#include +#include "arch.h" +#include "cpu_support.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef USE_SIMD +# include +# define kiss_fft_scalar __m128 +#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) +#else +#define KISS_FFT_MALLOC opus_alloc +#endif + +#ifdef FIXED_POINT +#include "arch.h" + +# define kiss_fft_scalar opus_int32 +# define kiss_twiddle_scalar opus_int16 + +/* Some 32-bit CPUs would load/store a kiss_twiddle_cpx with a single memory + * access, and could benefit from additional alignment. + */ +# define KISS_TWIDDLE_CPX_ALIGNMENT (sizeof(opus_int32)) + +#else +# ifndef kiss_fft_scalar +/* default is float */ +# define kiss_fft_scalar float +# define kiss_twiddle_scalar float +# define KF_SUFFIX _celt_single +# endif +#endif + +#if defined(__GNUC__) && defined(KISS_TWIDDLE_CPX_ALIGNMENT) +#define KISS_TWIDDLE_CPX_ALIGNED __attribute__((aligned(KISS_TWIDDLE_CPX_ALIGNMENT))) +#else +#define KISS_TWIDDLE_CPX_ALIGNED +#endif + +typedef struct { + kiss_fft_scalar r; + kiss_fft_scalar i; +}kiss_fft_cpx; + +typedef struct { + kiss_twiddle_scalar r; + kiss_twiddle_scalar i; +} KISS_TWIDDLE_CPX_ALIGNED kiss_twiddle_cpx; + +#define MAXFACTORS 8 +/* e.g. an fft of length 128 has 4 factors + as far as kissfft is concerned + 4*4*4*2 + */ + +typedef struct arch_fft_state{ + int is_supported; + void *priv; +} arch_fft_state; + +typedef struct kiss_fft_state{ + int nfft; + opus_val16 scale; +#ifdef FIXED_POINT + int scale_shift; +#endif + int shift; + opus_int16 factors[2*MAXFACTORS]; + const opus_int16 *bitrev; + const kiss_twiddle_cpx *twiddles; + arch_fft_state *arch_fft; +} kiss_fft_state; + +#if defined(HAVE_ARM_NE10) +#include "arm/fft_arm.h" +#endif + +/*typedef struct kiss_fft_state* kiss_fft_cfg;*/ + +/** + * opus_fft_alloc + * + * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. + * + * typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL); + * + * The return value from fft_alloc is a cfg buffer used internally + * by the fft routine or NULL. + * + * If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc. + * The returned value should be free()d when done to avoid memory leaks. + * + * The state can be placed in a user supplied buffer 'mem': + * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, + * then the function places the cfg in mem and the size used in *lenmem + * and returns mem. + * + * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), + * then the function returns NULL and places the minimum cfg + * buffer size in *lenmem. + * */ + +kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base, int arch); + +kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch); + +/** + * opus_fft(cfg,in_out_buf) + * + * Perform an FFT on a complex input buffer. + * for a forward FFT, + * fin should be f[0] , f[1] , ... ,f[nfft-1] + * fout will be F[0] , F[1] , ... ,F[nfft-1] + * Note that each element is complex and can be accessed like + f[k].r and f[k].i + * */ +void opus_fft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); +void opus_ifft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); + +void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); +void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); + +void opus_fft_free(const kiss_fft_state *cfg, int arch); + + +void opus_fft_free_arch_c(kiss_fft_state *st); +int opus_fft_alloc_arch_c(kiss_fft_state *st); + +#if !defined(OVERRIDE_OPUS_FFT) +/* Is run-time CPU detection enabled on this platform? */ +#if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) + +extern int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])( + kiss_fft_state *st); + +#define opus_fft_alloc_arch(_st, arch) \ + ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) + +extern void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])( + kiss_fft_state *st); +#define opus_fft_free_arch(_st, arch) \ + ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) + +extern void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, kiss_fft_cpx *fout); +#define opus_fft(_cfg, _fin, _fout, arch) \ + ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) + +extern void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, kiss_fft_cpx *fout); +#define opus_ifft(_cfg, _fin, _fout, arch) \ + ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) + +#else /* else for if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ + +#define opus_fft_alloc_arch(_st, arch) \ + ((void)(arch), opus_fft_alloc_arch_c(_st)) + +#define opus_fft_free_arch(_st, arch) \ + ((void)(arch), opus_fft_free_arch_c(_st)) + +#define opus_fft(_cfg, _fin, _fout, arch) \ + ((void)(arch), opus_fft_c(_cfg, _fin, _fout)) + +#define opus_ifft(_cfg, _fin, _fout, arch) \ + ((void)(arch), opus_ifft_c(_cfg, _fin, _fout)) + +#endif /* end if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ +#endif /* end if !defined(OVERRIDE_OPUS_FFT) */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/celt/laplace.c b/src/libopus/celt/laplace.c new file mode 100644 index 00000000..8c719a91 --- /dev/null +++ b/src/libopus/celt/laplace.c @@ -0,0 +1,235 @@ +/* Copyright (c) 2007 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "laplace.h" +#include "mathops.h" + +/* The minimum probability of an energy delta (out of 32768). */ +#define LAPLACE_LOG_MINP (0) +#define LAPLACE_MINP (1<>15; +} + +void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) +{ + unsigned fl; + int val = *value; + fl = 0; + if (val) + { + int s; + int i; + s = -(val<0); + val = (val+s)^s; + fl = fs; + fs = ec_laplace_get_freq1(fs, decay); + /* Search the decaying part of the PDF.*/ + for (i=1; fs > 0 && i < val; i++) + { + fs *= 2; + fl += fs+2*LAPLACE_MINP; + fs = (fs*(opus_int32)decay)>>15; + } + /* Everything beyond that has probability LAPLACE_MINP. */ + if (!fs) + { + int di; + int ndi_max; + ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP; + ndi_max = (ndi_max-s)>>1; + di = IMIN(val - i, ndi_max - 1); + fl += (2*di+1+s)*LAPLACE_MINP; + fs = IMIN(LAPLACE_MINP, 32768-fl); + *value = (i+di+s)^s; + } + else + { + fs += LAPLACE_MINP; + fl += fs&~s; + } + celt_assert(fl+fs<=32768); + celt_assert(fs>0); + } + ec_encode_bin(enc, fl, fl+fs, 15); +} + +int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay) +{ + int val=0; + unsigned fl; + unsigned fm; + fm = ec_decode_bin(dec, 15); + fl = 0; + if (fm >= fs) + { + val++; + fl = fs; + fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP; + /* Search the decaying part of the PDF.*/ + while(fs > LAPLACE_MINP && fm >= fl+2*fs) + { + fs *= 2; + fl += fs; + fs = ((fs-2*LAPLACE_MINP)*(opus_int32)decay)>>15; + fs += LAPLACE_MINP; + val++; + } + /* Everything beyond that has probability LAPLACE_MINP. */ + if (fs <= LAPLACE_MINP) + { + int di; + di = (fm-fl)>>(LAPLACE_LOG_MINP+1); + val += di; + fl += 2*di*LAPLACE_MINP; + } + if (fm < fl+fs) + val = -val; + else + fl += fs; + } + celt_assert(fl<32768); + celt_assert(fs>0); + celt_assert(fl<=fm); + celt_assert(fm 0 ? 1 : 2); + ec_enc_icdf16(enc, s, sign_icdf, 15); + value = abs(value); + if (value) + { + int i; + opus_uint16 icdf[8]; + icdf[0] = IMAX(7, decay); + for (i=1;i<7;i++) + { + icdf[i] = IMAX(7-i, (icdf[i-1] * (opus_int32)decay) >> 15); + } + icdf[7] = 0; + value--; + do { + ec_enc_icdf16(enc, IMIN(value, 7), icdf, 15); + value -= 7; + } while (value >= 0); + } +} + +int ec_laplace_decode_p0(ec_dec *dec, opus_uint16 p0, opus_uint16 decay) +{ + int s; + int value; + opus_uint16 sign_icdf[3]; + sign_icdf[0] = 32768-p0; + sign_icdf[1] = sign_icdf[0]/2; + sign_icdf[2] = 0; + s = ec_dec_icdf16(dec, sign_icdf, 15); + if (s==2) s = -1; + if (s != 0) + { + int i; + int v; + opus_uint16 icdf[8]; + icdf[0] = IMAX(7, decay); + for (i=1;i<7;i++) + { + icdf[i] = IMAX(7-i, (icdf[i-1] * (opus_int32)decay) >> 15); + } + icdf[7] = 0; + value = 1; + do { + v = ec_dec_icdf16(dec, icdf, 15); + value += v; + } while (v == 7); + return s*value; + } else return 0; +} + +#if 0 + +#include +#define NB_VALS 10 +#define DATA_SIZE 10000 +int main() { + ec_enc enc; + ec_dec dec; + unsigned char *ptr; + int i; + int decay, p0; + int val[NB_VALS] = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + /*for (i=0;i>1; + b=1U<>=1; + bshift--; + } + while(bshift>=0); + return g; +} + +#ifdef FIXED_POINT + +opus_val32 frac_div32(opus_val32 a, opus_val32 b) +{ + opus_val16 rcp; + opus_val32 result, rem; + int shift = celt_ilog2(b)-29; + a = VSHR32(a,shift); + b = VSHR32(b,shift); + /* 16-bit reciprocal */ + rcp = ROUND16(celt_rcp(ROUND16(b,16)),3); + result = MULT16_32_Q15(rcp, a); + rem = PSHR32(a,2)-MULT32_32_Q31(result, b); + result = ADD32(result, SHL32(MULT16_32_Q15(rcp, rem),2)); + if (result >= 536870912) /* 2^29 */ + return 2147483647; /* 2^31 - 1 */ + else if (result <= -536870912) /* -2^29 */ + return -2147483647; /* -2^31 */ + else + return SHL32(result, 2); +} + +/** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */ +opus_val16 celt_rsqrt_norm(opus_val32 x) +{ + opus_val16 n; + opus_val16 r; + opus_val16 r2; + opus_val16 y; + /* Range of n is [-16384,32767] ([-0.5,1) in Q15). */ + n = x-32768; + /* Get a rough initial guess for the root. + The optimal minimax quadratic approximation (using relative error) is + r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485). + Coefficients here, and the final result r, are Q14.*/ + r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713)))); + /* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14. + We can compute the result from n and r using Q15 multiplies with some + adjustment, carefully done to avoid overflow. + Range of y is [-1564,1594]. */ + r2 = MULT16_16_Q15(r, r); + y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1); + /* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5). + This yields the Q14 reciprocal square root of the Q16 x, with a maximum + relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a + peak absolute error of 2.26591/16384. */ + return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y, + SUB16(MULT16_16_Q15(y, 12288), 16384)))); +} + +/** Sqrt approximation (QX input, QX/2 output) */ +opus_val32 celt_sqrt(opus_val32 x) +{ + int k; + opus_val16 n; + opus_val32 rt; + static const opus_val16 C[5] = {23175, 11561, -3011, 1699, -664}; + if (x==0) + return 0; + else if (x>=1073741824) + return 32767; + k = (celt_ilog2(x)>>1)-7; + x = VSHR32(x, 2*k); + n = x-32768; + rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], + MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); + rt = VSHR32(rt,7-k); + return rt; +} + +#define L1 32767 +#define L2 -7651 +#define L3 8277 +#define L4 -626 + +static OPUS_INLINE opus_val16 _celt_cos_pi_2(opus_val16 x) +{ + opus_val16 x2; + + x2 = MULT16_16_P15(x,x); + return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2 + )))))))); +} + +#undef L1 +#undef L2 +#undef L3 +#undef L4 + +opus_val16 celt_cos_norm(opus_val32 x) +{ + x = x&0x0001ffff; + if (x>SHL32(EXTEND32(1), 16)) + x = SUB32(SHL32(EXTEND32(1), 17),x); + if (x&0x00007fff) + { + if (x0); + i = celt_ilog2(x); + /* n is Q15 with range [0,1). */ + n = VSHR32(x,i-15)-32768; + /* Start with a linear approximation: + r = 1.8823529411764706-0.9411764705882353*n. + The coefficients and the result are Q14 in the range [15420,30840].*/ + r = ADD16(30840, MULT16_16_Q15(-15420, n)); + /* Perform two Newton iterations: + r -= r*((r*n)-1.Q15) + = r*((r*n)+(r-1.Q15)). */ + r = SUB16(r, MULT16_16_Q15(r, + ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))); + /* We subtract an extra 1 in the second iteration to avoid overflow; it also + neatly compensates for truncation error in the rest of the process. */ + r = SUB16(r, ADD16(1, MULT16_16_Q15(r, + ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))))); + /* r is now the Q15 solution to 2/(n+1), with a maximum relative error + of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute + error of 1.24665/32768. */ + return VSHR32(EXTEND32(r),i-16); +} + +#endif diff --git a/src/libopus/celt/mathops.h b/src/libopus/celt/mathops.h new file mode 100644 index 00000000..e2eece29 --- /dev/null +++ b/src/libopus/celt/mathops.h @@ -0,0 +1,296 @@ +/* Copyright (c) 2002-2008 Jean-Marc Valin + Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/** + @file mathops.h + @brief Various math functions +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 MATHOPS_H +#define MATHOPS_H + +#include "arch.h" +#include "entcode.h" +#include "os_support.h" + +#define PI 3.141592653f + +/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ +#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15) + +unsigned isqrt32(opus_uint32 _val); + +/* CELT doesn't need it for fixed-point, by analysis.c does. */ +#if !defined(FIXED_POINT) || defined(ANALYSIS_C) +#define cA 0.43157974f +#define cB 0.67848403f +#define cC 0.08595542f +#define cE ((float)PI/2) +static OPUS_INLINE float fast_atan2f(float y, float x) { + float x2, y2; + x2 = x*x; + y2 = y*y; + /* For very small values, we don't care about the answer, so + we can just return 0. */ + if (x2 + y2 < 1e-18f) + { + return 0; + } + if(x2>23)-127; + in.i -= (opus_uint32)integer<<23; + frac = in.f - 1.5f; + frac = -0.41445418f + frac*(0.95909232f + + frac*(-0.33951290f + frac*0.16541097f)); + return 1+integer+frac; +} + +/** Base-2 exponential approximation (2^x). */ +static OPUS_INLINE float celt_exp2(float x) +{ + int integer; + float frac; + union { + float f; + opus_uint32 i; + } res; + integer = (int)floor(x); + if (integer < -50) + return 0; + frac = x-integer; + /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */ + res.f = 0.99992522f + frac * (0.69583354f + + frac * (0.22606716f + 0.078024523f*frac)); + res.i = (res.i + ((opus_uint32)integer<<23)) & 0x7fffffff; + return res.f; +} + +#else +#define celt_log2(x) ((float)(1.442695040888963387*log(x))) +#define celt_exp2(x) ((float)exp(0.6931471805599453094*(x))) +#endif + +#endif + +#ifdef FIXED_POINT + +#include "os_support.h" + +#ifndef OVERRIDE_CELT_ILOG2 +/** Integer log in base2. Undefined for zero and negative numbers */ +static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) +{ + celt_sig_assert(x>0); + return EC_ILOG(x)-1; +} +#endif + + +/** Integer log in base2. Defined for zero, but not for negative numbers */ +static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x) +{ + return x <= 0 ? 0 : celt_ilog2(x); +} + +opus_val16 celt_rsqrt_norm(opus_val32 x); + +opus_val32 celt_sqrt(opus_val32 x); + +opus_val16 celt_cos_norm(opus_val32 x); + +/** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */ +static OPUS_INLINE opus_val16 celt_log2(opus_val32 x) +{ + int i; + opus_val16 n, frac; + /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, + 0.15530808010959576, -0.08556153059057618 */ + static const opus_val16 C[5] = {-6801+(1<<(13-DB_SHIFT)), 15746, -5217, 2545, -1401}; + if (x==0) + return -32767; + i = celt_ilog2(x); + n = VSHR32(x,i-15)-32768-16384; + frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); + return SHL16(i-13,DB_SHIFT)+SHR16(frac,14-DB_SHIFT); +} + +/* + K0 = 1 + K1 = log(2) + K2 = 3-4*log(2) + K3 = 3*log(2) - 2 +*/ +#define D0 16383 +#define D1 22804 +#define D2 14819 +#define D3 10204 + +static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x) +{ + opus_val16 frac; + frac = SHL16(x, 4); + return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); +} + +#undef D0 +#undef D1 +#undef D2 +#undef D3 + +/** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */ +static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x) +{ + int integer; + opus_val16 frac; + integer = SHR16(x,10); + if (integer>14) + return 0x7f000000; + else if (integer < -15) + return 0; + frac = celt_exp2_frac(x-SHL16(integer,10)); + return VSHR32(EXTEND32(frac), -integer-2); +} + +opus_val32 celt_rcp(opus_val32 x); + +#define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b)) + +opus_val32 frac_div32(opus_val32 a, opus_val32 b); + +#define M1 32767 +#define M2 -21 +#define M3 -11943 +#define M4 4936 + +/* Atan approximation using a 4th order polynomial. Input is in Q15 format + and normalized by pi/4. Output is in Q15 format */ +static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x) +{ + return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); +} + +#undef M1 +#undef M2 +#undef M3 +#undef M4 + +/* atan2() approximation valid for positive input values */ +static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x) +{ + if (y < x) + { + opus_val32 arg; + arg = celt_div(SHL32(EXTEND32(y),15),x); + if (arg >= 32767) + arg = 32767; + return SHR16(celt_atan01(EXTRACT16(arg)),1); + } else { + opus_val32 arg; + arg = celt_div(SHL32(EXTEND32(x),15),y); + if (arg >= 32767) + arg = 32767; + return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); + } +} + +#endif /* FIXED_POINT */ +#endif /* MATHOPS_H */ diff --git a/src/libopus/celt/mdct.c b/src/libopus/celt/mdct.c new file mode 100644 index 00000000..b67f3c83 --- /dev/null +++ b/src/libopus/celt/mdct.c @@ -0,0 +1,343 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2008 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/* This is a simple MDCT implementation that uses a N/4 complex FFT + to do most of the work. It should be relatively straightforward to + plug in pretty much and FFT here. + + This replaces the Vorbis FFT (and uses the exact same API), which + was a bit too messy and that was ending up duplicating code + (might as well use the same FFT everywhere). + + The algorithm is similar to (and inspired from) Fabrice Bellard's + MDCT implementation in FFMPEG, but has differences in signs, ordering + and scaling in many places. +*/ + +#ifndef SKIP_CONFIG_H +#ifdef __STDC__ +#include "config.h" +#endif +#endif + +#include "mdct.h" +#include "kiss_fft.h" +#include "_kiss_fft_guts.h" +#include +#include "os_support.h" +#include "mathops.h" +#include "stack_alloc.h" + +#if defined(MIPSr1_ASM) +#include "mips/mdct_mipsr1.h" +#endif + + +#ifdef CUSTOM_MODES + +int clt_mdct_init(mdct_lookup *l,int N, int maxshift, int arch) +{ + int i; + kiss_twiddle_scalar *trig; + int shift; + int N2=N>>1; + l->n = N; + l->maxshift = maxshift; + for (i=0;i<=maxshift;i++) + { + if (i==0) + l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0, arch); + else + l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0], arch); +#ifndef ENABLE_TI_DSPLIB55 + if (l->kfft[i]==NULL) + return 0; +#endif + } + l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N-(N2>>maxshift))*sizeof(kiss_twiddle_scalar)); + if (l->trig==NULL) + return 0; + for (shift=0;shift<=maxshift;shift++) + { + /* We have enough points that sine isn't necessary */ +#if defined(FIXED_POINT) +#if 1 + for (i=0;i>= 1; + N >>= 1; + } + return 1; +} + +void clt_mdct_clear(mdct_lookup *l, int arch) +{ + int i; + for (i=0;i<=l->maxshift;i++) + opus_fft_free(l->kfft[i], arch); + opus_free((kiss_twiddle_scalar*)l->trig); +} + +#endif /* CUSTOM_MODES */ + +/* Forward MDCT trashes the input array */ +#ifndef OVERRIDE_clt_mdct_forward +void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + VARDECL(kiss_fft_scalar, f); + VARDECL(kiss_fft_cpx, f2); + const kiss_fft_state *st = l->kfft[shift]; + const kiss_twiddle_scalar *trig; + opus_val16 scale; +#ifdef FIXED_POINT + /* Allows us to scale with MULT16_32_Q16(), which is faster than + MULT16_32_Q15() on ARM. */ + int scale_shift = st->scale_shift-1; +#endif + SAVE_STACK; + (void)arch; + scale = st->scale; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + ALLOC(f, N2, kiss_fft_scalar); + ALLOC(f2, N4, kiss_fft_cpx); + + /* Consider the input to be composed of four blocks: [a, b, c, d] */ + /* Window, shuffle, fold */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); + kiss_fft_scalar * OPUS_RESTRICT yp = f; + const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); + const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; + for(i=0;i<((overlap+3)>>2);i++) + { + /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ + *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); + *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); + xp1+=2; + xp2-=2; + wp1+=2; + wp2-=2; + } + wp1 = window; + wp2 = window+overlap-1; + for(;i>2);i++) + { + /* Real part arranged as a-bR, Imag part arranged as -c-dR */ + *yp++ = *xp2; + *yp++ = *xp1; + xp1+=2; + xp2-=2; + } + for(;ibitrev[i]] = yc; + } + } + + /* N/4 complex FFT, does not downscale anymore */ + opus_fft_impl(st, f2); + + /* Post-rotate */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_cpx * OPUS_RESTRICT fp = f2; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; + kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1); + const kiss_twiddle_scalar *t = &trig[0]; + /* Temp pointers to make it really clear to the compiler what we're doing */ + for(i=0;ii,t[N4+i]) - S_MUL(fp->r,t[i]); + yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]); + *yp1 = yr; + *yp2 = yi; + fp++; + yp1 += 2*stride; + yp2 -= 2*stride; + } + } + RESTORE_STACK; +} +#endif /* OVERRIDE_clt_mdct_forward */ + +#ifndef OVERRIDE_clt_mdct_backward +void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + const kiss_twiddle_scalar *trig; + (void) arch; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + /* Pre-rotate */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); + kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); + const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; + const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; + for(i=0;ikfft[shift], (kiss_fft_cpx*)(out+(overlap>>1))); + + /* Post-rotate and de-shuffle from both ends of the buffer at once to make + it in-place. */ + { + kiss_fft_scalar * yp0 = out+(overlap>>1); + kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2; + const kiss_twiddle_scalar *t = &trig[0]; + /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the + middle pair will be computed twice. */ + for(i=0;i<(N4+1)>>1;i++) + { + kiss_fft_scalar re, im, yr, yi; + kiss_twiddle_scalar t0, t1; + /* We swap real and imag because we're using an FFT instead of an IFFT. */ + re = yp0[1]; + im = yp0[0]; + t0 = t[i]; + t1 = t[N4+i]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); + yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); + /* We swap real and imag because we're using an FFT instead of an IFFT. */ + re = yp1[1]; + im = yp1[0]; + yp0[0] = yr; + yp1[1] = yi; + + t0 = t[(N4-i-1)]; + t1 = t[(N2-i-1)]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); + yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); + yp1[0] = yr; + yp0[1] = yi; + yp0 += 2; + yp1 -= 2; + } + } + + /* Mirror on both sides for TDAC */ + { + kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; + const opus_val16 * OPUS_RESTRICT wp1 = window; + const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; + + for(i = 0; i < overlap/2; i++) + { + kiss_fft_scalar x1, x2; + x1 = *xp1; + x2 = *yp1; + *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1)); + *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1)); + wp1++; + wp2--; + } + } +} +#endif /* OVERRIDE_clt_mdct_backward */ diff --git a/src/libopus/celt/mdct.h b/src/libopus/celt/mdct.h new file mode 100644 index 00000000..160ae4e0 --- /dev/null +++ b/src/libopus/celt/mdct.h @@ -0,0 +1,112 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2008 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/* This is a simple MDCT implementation that uses a N/4 complex FFT + to do most of the work. It should be relatively straightforward to + plug in pretty much and FFT here. + + This replaces the Vorbis FFT (and uses the exact same API), which + was a bit too messy and that was ending up duplicating code + (might as well use the same FFT everywhere). + + The algorithm is similar to (and inspired from) Fabrice Bellard's + MDCT implementation in FFMPEG, but has differences in signs, ordering + and scaling in many places. +*/ + +#ifndef MDCT_H +#define MDCT_H + +#include "opus_defines.h" +#include "kiss_fft.h" +#include "arch.h" + +typedef struct { + int n; + int maxshift; + const kiss_fft_state *kfft[4]; + const kiss_twiddle_scalar * OPUS_RESTRICT trig; +} mdct_lookup; + +#if defined(HAVE_ARM_NE10) +#include "arm/mdct_arm.h" +#endif + + +int clt_mdct_init(mdct_lookup *l,int N, int maxshift, int arch); +void clt_mdct_clear(mdct_lookup *l, int arch); + +/** Compute a forward MDCT and scale by 4/N, trashes the input array */ +void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, + int shift, int stride, int arch); + +/** Compute a backward MDCT (no scaling) and performs weighted overlap-add + (scales implicitly by 1/2) */ +void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 * OPUS_RESTRICT window, + int overlap, int shift, int stride, int arch); + +#if !defined(OVERRIDE_OPUS_MDCT) +/* Is run-time CPU detection enabled on this platform? */ +#if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) + +extern void (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])( + const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, + int overlap, int shift, int stride, int arch); + +#define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + ((*CLT_MDCT_FORWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ + _window, _overlap, _shift, \ + _stride, _arch)) + +extern void (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])( + const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, + int overlap, int shift, int stride, int arch); + +#define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + (*CLT_MDCT_BACKWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ + _window, _overlap, _shift, \ + _stride, _arch) + +#else /* if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) */ + +#define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + clt_mdct_forward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) + +#define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + clt_mdct_backward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) + +#endif /* end if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) && !defined(FIXED_POINT) */ +#endif /* end if !defined(OVERRIDE_OPUS_MDCT) */ + +#endif diff --git a/src/libopus/celt/mfrngcod.h b/src/libopus/celt/mfrngcod.h new file mode 100644 index 00000000..809152a5 --- /dev/null +++ b/src/libopus/celt/mfrngcod.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2001-2008 Timothy B. Terriberry + Copyright (c) 2008-2009 Xiph.Org Foundation */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +#if !defined(_mfrngcode_H) +# define _mfrngcode_H (1) +# include "entcode.h" + +/*Constants used by the entropy encoder/decoder.*/ + +/*The number of bits to output at a time.*/ +# define EC_SYM_BITS (8) +/*The total number of bits in each of the state registers.*/ +# define EC_CODE_BITS (32) +/*The maximum symbol value.*/ +# define EC_SYM_MAX ((1U<>EC_SYM_BITS) +/*The number of bits available for the last, partial symbol in the code field.*/ +# define EC_CODE_EXTRA ((EC_CODE_BITS-2)%EC_SYM_BITS+1) +#endif diff --git a/src/libopus/celt/modes.c b/src/libopus/celt/modes.c new file mode 100644 index 00000000..4c3ffcf7 --- /dev/null +++ b/src/libopus/celt/modes.c @@ -0,0 +1,445 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "celt.h" +#include "modes.h" +#include "rate.h" +#include "os_support.h" +#include "stack_alloc.h" +#include "quant_bands.h" +#include "cpu_support.h" + +static const opus_int16 eband5ms[] = { +/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 +}; + +/* Alternate tuning (partially derived from Vorbis) */ +#define BITALLOC_SIZE 11 +/* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */ +static const unsigned char band_allocation[] = { +/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0, +110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, +118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, +126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, +134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, +144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, +152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, +162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, +172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, +200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104, +}; + +#ifndef CUSTOM_MODES_ONLY + #ifdef FIXED_POINT + #include "static_modes_fixed.h" + #else + #include "static_modes_float.h" + #endif +#endif /* CUSTOM_MODES_ONLY */ + +#ifndef M_PI +#define M_PI 3.141592653 +#endif + +#ifdef CUSTOM_MODES + +/* Defining 25 critical bands for the full 0-20 kHz audio bandwidth + Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ +#define BARK_BANDS 25 +static const opus_int16 bark_freq[BARK_BANDS+1] = { + 0, 100, 200, 300, 400, + 510, 630, 770, 920, 1080, + 1270, 1480, 1720, 2000, 2320, + 2700, 3150, 3700, 4400, 5300, + 6400, 7700, 9500, 12000, 15500, + 20000}; + +static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands) +{ + opus_int16 *eBands; + int i, j, lin, low, high, nBark, offset=0; + + /* All modes that have 2.5 ms short blocks use the same definition */ + if (Fs == 400*(opus_int32)frame_size) + { + *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; + eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1)); + for (i=0;i<*nbEBands+1;i++) + eBands[i] = eband5ms[i]; + return eBands; + } + /* Find the number of critical bands supported by our sampling rate */ + for (nBark=1;nBark= Fs) + break; + + /* Find where the linear part ends (i.e. where the spacing is more than min_width */ + for (lin=0;lin= res) + break; + + low = (bark_freq[lin]+res/2)/res; + high = nBark-lin; + *nbEBands = low+high; + eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2)); + + if (eBands==NULL) + return NULL; + + /* Linear spacing (min_width) */ + for (i=0;i0) + offset = eBands[low-1]*res - bark_freq[lin-1]; + /* Spacing follows critical bands */ + for (i=0;i frame_size) + eBands[*nbEBands] = frame_size; + for (i=1;i<*nbEBands-1;i++) + { + if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) + { + eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; + } + } + /* Remove any empty bands. */ + for (i=j=0;i<*nbEBands;i++) + if(eBands[i+1]>eBands[j]) + eBands[++j]=eBands[i+1]; + *nbEBands=j; + + for (i=1;i<*nbEBands;i++) + { + /* Every band must be smaller than the last band. */ + celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]); + /* Each band must be no larger than twice the size of the previous one. */ + celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1])); + } + + return eBands; +} + +static void compute_allocation_table(CELTMode *mode) +{ + int i, j; + unsigned char *allocVectors; + int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; + + mode->nbAllocVectors = BITALLOC_SIZE; + allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands)); + if (allocVectors==NULL) + { + mode->allocVectors = NULL; + return; + } + + /* Check for standard mode */ + if (mode->Fs == 400*(opus_int32)mode->shortMdctSize) + { + for (i=0;inbEBands;i++) + allocVectors[i] = band_allocation[i]; + mode->allocVectors = allocVectors; + return; + } + /* If not the standard mode, interpolate */ + /* Compute per-codec-band allocation from per-critical-band matrix */ + for (i=0;inbEBands;j++) + { + int k; + for (k=0;k mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize) + break; + } + if (k>maxBands-1) + allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1]; + else { + opus_int32 a0, a1; + a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1]; + a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize; + allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1] + + a1*band_allocation[i*maxBands+k])/(a0+a1); + } + } + } + + /*printf ("\n"); + for (i=0;inbEBands;j++) + printf ("%d ", allocVectors[i*mode->nbEBands+j]); + printf ("\n"); + } + exit(0);*/ + + mode->allocVectors = allocVectors; +} + +#endif /* CUSTOM_MODES */ + +CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) +{ + int i; +#ifdef CUSTOM_MODES + CELTMode *mode=NULL; + int res; + opus_val16 *window; + opus_int16 *logN; + int LM; + int arch = opus_select_arch(); + ALLOC_STACK; +#if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA) + if (global_stack==NULL) + goto failure; +#endif +#endif + +#ifndef CUSTOM_MODES_ONLY + for (i=0;iFs && + (frame_size<shortMdctSize*static_mode_list[i]->nbShortMdcts) + { + if (error) + *error = OPUS_OK; + return (CELTMode*)static_mode_list[i]; + } + } + } +#endif /* CUSTOM_MODES_ONLY */ + +#ifndef CUSTOM_MODES + if (error) + *error = OPUS_BAD_ARG; + return NULL; +#else + + /* The good thing here is that permutation of the arguments will automatically be invalid */ + + if (Fs < 8000 || Fs > 96000) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + /* Frames of less than 1ms are not supported. */ + if ((opus_int32)frame_size*1000 < Fs) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + + if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0) + { + LM = 3; + } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0) + { + LM = 2; + } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0) + { + LM = 1; + } else + { + LM = 0; + } + + /* Shorts longer than 3.3ms are not supported. */ + if ((opus_int32)(frame_size>>LM)*300 > Fs) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + + mode = opus_alloc(sizeof(CELTMode)); + if (mode==NULL) + goto failure; + mode->Fs = Fs; + + /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis + is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should + approximate that. */ + if(Fs < 12000) /* 8 kHz */ + { + mode->preemph[0] = QCONST16(0.3500061035f, 15); + mode->preemph[1] = -QCONST16(0.1799926758f, 15); + mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */ + mode->preemph[3] = QCONST16(3.6765136719f, 13); + } else if(Fs < 24000) /* 16 kHz */ + { + mode->preemph[0] = QCONST16(0.6000061035f, 15); + mode->preemph[1] = -QCONST16(0.1799926758f, 15); + mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */ + mode->preemph[3] = QCONST16(2.2598876953f, 13); + } else if(Fs < 40000) /* 32 kHz */ + { + mode->preemph[0] = QCONST16(0.7799987793f, 15); + mode->preemph[1] = -QCONST16(0.1000061035f, 15); + mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */ + mode->preemph[3] = QCONST16(1.3333740234f, 13); + } else /* 48 kHz */ + { + mode->preemph[0] = QCONST16(0.8500061035f, 15); + mode->preemph[1] = QCONST16(0.0f, 15); + mode->preemph[2] = QCONST16(1.f, SIG_SHIFT); + mode->preemph[3] = QCONST16(1.f, 13); + } + + mode->maxLM = LM; + mode->nbShortMdcts = 1<shortMdctSize = frame_size/mode->nbShortMdcts; + res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize); + + mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands); + if (mode->eBands==NULL) + goto failure; +#if !defined(SMALL_FOOTPRINT) + /* Make sure we don't allocate a band larger than our PVQ table. + 208 should be enough, but let's be paranoid. */ + if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])< + 208) { + goto failure; + } +#endif + + mode->effEBands = mode->nbEBands; + while (mode->eBands[mode->effEBands] > mode->shortMdctSize) + mode->effEBands--; + + /* Overlap must be divisible by 4 */ + mode->overlap = ((mode->shortMdctSize>>2)<<2); + + compute_allocation_table(mode); + if (mode->allocVectors==NULL) + goto failure; + + window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16)); + if (window==NULL) + goto failure; + +#ifndef FIXED_POINT + for (i=0;ioverlap;i++) + window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); +#else + for (i=0;ioverlap;i++) + window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)))); +#endif + mode->window = window; + + logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16)); + if (logN==NULL) + goto failure; + + for (i=0;inbEBands;i++) + logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES); + mode->logN = logN; + + compute_pulse_cache(mode, mode->maxLM); + + if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, + mode->maxLM, arch) == 0) + goto failure; + + if (error) + *error = OPUS_OK; + + return mode; +failure: + if (error) + *error = OPUS_ALLOC_FAIL; + if (mode!=NULL) + opus_custom_mode_destroy(mode); + return NULL; +#endif /* !CUSTOM_MODES */ +} + +#ifdef CUSTOM_MODES +void opus_custom_mode_destroy(CELTMode *mode) +{ + int arch = opus_select_arch(); + + if (mode == NULL) + return; +#ifndef CUSTOM_MODES_ONLY + { + int i; + for (i=0;ieBands); + opus_free((unsigned char*)mode->allocVectors); + + opus_free((opus_val16*)mode->window); + opus_free((opus_int16*)mode->logN); + + opus_free((opus_int16*)mode->cache.index); + opus_free((unsigned char*)mode->cache.bits); + opus_free((unsigned char*)mode->cache.caps); + clt_mdct_clear(&mode->mdct, arch); + + opus_free((CELTMode *)mode); +} +#endif diff --git a/src/libopus/celt/modes.h b/src/libopus/celt/modes.h new file mode 100644 index 00000000..be813ccc --- /dev/null +++ b/src/libopus/celt/modes.h @@ -0,0 +1,75 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 MODES_H +#define MODES_H + +#include "opus_types.h" +#include "celt.h" +#include "arch.h" +#include "mdct.h" +#include "entenc.h" +#include "entdec.h" + +#define MAX_PERIOD 1024 + +typedef struct { + int size; + const opus_int16 *index; + const unsigned char *bits; + const unsigned char *caps; +} PulseCache; + +/** Mode definition (opaque) + @brief Mode definition + */ +struct OpusCustomMode { + opus_int32 Fs; + int overlap; + + int nbEBands; + int effEBands; + opus_val16 preemph[4]; + const opus_int16 *eBands; /**< Definition for each "pseudo-critical band" */ + + int maxLM; + int nbShortMdcts; + int shortMdctSize; + + int nbAllocVectors; /**< Number of lines in the matrix below */ + const unsigned char *allocVectors; /**< Number of bits in each band for several rates */ + const opus_int16 *logN; + + const opus_val16 *window; + mdct_lookup mdct; + PulseCache cache; +}; + + +#endif diff --git a/src/libopus/celt/opus.h b/src/libopus/celt/opus.h new file mode 100644 index 00000000..0a1b59ca --- /dev/null +++ b/src/libopus/celt/opus.h @@ -0,0 +1 @@ +#include "../include/opus.h" diff --git a/src/libopus/celt/opus_custom.h b/src/libopus/celt/opus_custom.h new file mode 100644 index 00000000..f54a1034 --- /dev/null +++ b/src/libopus/celt/opus_custom.h @@ -0,0 +1 @@ +#include "../include/opus_custom.h" diff --git a/src/libopus/celt/opus_defines.h b/src/libopus/celt/opus_defines.h new file mode 100644 index 00000000..dcc24434 --- /dev/null +++ b/src/libopus/celt/opus_defines.h @@ -0,0 +1 @@ +#include "../include/opus_defines.h" diff --git a/src/libopus/celt/opus_multistream.h b/src/libopus/celt/opus_multistream.h new file mode 100644 index 00000000..89f62298 --- /dev/null +++ b/src/libopus/celt/opus_multistream.h @@ -0,0 +1 @@ +#include "../include/opus_multistream.h" diff --git a/src/libopus/celt/opus_projection.h b/src/libopus/celt/opus_projection.h new file mode 100644 index 00000000..72f59cc1 --- /dev/null +++ b/src/libopus/celt/opus_projection.h @@ -0,0 +1 @@ +#include "../include/opus_projection.h" diff --git a/src/libopus/celt/opus_types.h b/src/libopus/celt/opus_types.h new file mode 100644 index 00000000..a7958a5d --- /dev/null +++ b/src/libopus/celt/opus_types.h @@ -0,0 +1 @@ +#include "../include/opus_types.h" diff --git a/src/libopus/celt/os_support.h b/src/libopus/celt/os_support.h new file mode 100644 index 00000000..7d2d3781 --- /dev/null +++ b/src/libopus/celt/os_support.h @@ -0,0 +1,99 @@ +/* Copyright (C) 2007 Jean-Marc Valin + + File: os_support.h + This is the (tiny) OS abstraction layer. Aside from math.h, this is the + only place where system headers are allowed. + + 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. + + 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 OS_SUPPORT_H +#define OS_SUPPORT_H + +#ifdef CUSTOM_SUPPORT +# include "custom_support.h" +#endif + +#include "opus_types.h" +#include "opus_defines.h" + +#include +#include + +/** Opus wrapper for malloc(). To do your own dynamic allocation replace this function, opus_realloc, and opus_free */ +#ifndef OVERRIDE_OPUS_ALLOC +static OPUS_INLINE void *opus_alloc (size_t size) +{ + return malloc(size); +} +#endif + +#ifndef OVERRIDE_OPUS_REALLOC +static OPUS_INLINE void *opus_realloc (void *ptr, size_t size) +{ + return realloc(ptr, size); +} +#endif + +/** Used only for non-threadsafe pseudostack. + If desired, this can always return the same area of memory rather than allocating a new one every time. */ +#ifndef OVERRIDE_OPUS_ALLOC_SCRATCH +static OPUS_INLINE void *opus_alloc_scratch (size_t size) +{ + /* Scratch space doesn't need to be cleared */ + return opus_alloc(size); +} +#endif + +/** Opus wrapper for free(). To do your own dynamic allocation replace this function, opus_realloc, and opus_free */ +#ifndef OVERRIDE_OPUS_FREE +static OPUS_INLINE void opus_free (void *ptr) +{ + free(ptr); +} +#endif + +/** Copy n elements from src to dst. The 0* term provides compile-time type checking */ +#ifndef OVERRIDE_OPUS_COPY +#define OPUS_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) +#endif + +/** Copy n elements from src to dst, allowing overlapping regions. The 0* term + provides compile-time type checking */ +#ifndef OVERRIDE_OPUS_MOVE +#define OPUS_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) +#endif + +/** Set n elements of dst to zero */ +#ifndef OVERRIDE_OPUS_CLEAR +#define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst)))) +#endif + +/*#ifdef __GNUC__ +#pragma GCC poison printf sprintf +#pragma GCC poison malloc free realloc calloc +#endif*/ + +#endif /* OS_SUPPORT_H */ + diff --git a/src/libopus/celt/pitch.c b/src/libopus/celt/pitch.c new file mode 100644 index 00000000..9bc9916c --- /dev/null +++ b/src/libopus/celt/pitch.c @@ -0,0 +1,555 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/** + @file pitch.c + @brief Pitch analysis + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "pitch.h" +#include "os_support.h" +#include "modes.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "celt_lpc.h" + +static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len, + int max_pitch, int *best_pitch +#ifdef FIXED_POINT + , int yshift, opus_val32 maxcorr +#endif + ) +{ + int i, j; + opus_val32 Syy=1; + opus_val16 best_num[2]; + opus_val32 best_den[2]; +#ifdef FIXED_POINT + int xshift; + + xshift = celt_ilog2(maxcorr)-14; +#endif + + best_num[0] = -1; + best_num[1] = -1; + best_den[0] = 0; + best_den[1] = 0; + best_pitch[0] = 0; + best_pitch[1] = 1; + for (j=0;j0) + { + opus_val16 num; + opus_val32 xcorr16; + xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); +#ifndef FIXED_POINT + /* Considering the range of xcorr16, this should avoid both underflows + and overflows (inf) when squaring xcorr16 */ + xcorr16 *= 1e-12f; +#endif + num = MULT16_16_Q15(xcorr16,xcorr16); + if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) + { + if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) + { + best_num[1] = best_num[0]; + best_den[1] = best_den[0]; + best_pitch[1] = best_pitch[0]; + best_num[0] = num; + best_den[0] = Syy; + best_pitch[0] = i; + } else { + best_num[1] = num; + best_den[1] = Syy; + best_pitch[1] = i; + } + } + } + Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); + Syy = MAX32(1, Syy); + } +} + +static void celt_fir5(opus_val16 *x, + const opus_val16 *num, + int N) +{ + int i; + opus_val16 num0, num1, num2, num3, num4; + opus_val32 mem0, mem1, mem2, mem3, mem4; + num0=num[0]; + num1=num[1]; + num2=num[2]; + num3=num[3]; + num4=num[4]; + mem0=0; + mem1=0; + mem2=0; + mem3=0; + mem4=0; + for (i=0;i>1;i++) + x_lp[i] = SHR32(x[0][(2*i-1)], shift+2) + SHR32(x[0][(2*i+1)], shift+2) + SHR32(x[0][2*i], shift+1); + x_lp[0] = SHR32(x[0][1], shift+2) + SHR32(x[0][0], shift+1); + if (C==2) + { + for (i=1;i>1;i++) + x_lp[i] += SHR32(x[1][(2*i-1)], shift+2) + SHR32(x[1][(2*i+1)], shift+2) + SHR32(x[1][2*i], shift+1); + x_lp[0] += SHR32(x[1][1], shift+2) + SHR32(x[1][0], shift+1); + } +#else + for (i=1;i>1;i++) + x_lp[i] = .25f*x[0][(2*i-1)] + .25f*x[0][(2*i+1)] + .5f*x[0][2*i]; + x_lp[0] = .25f*x[0][1] + .5f*x[0][0]; + if (C==2) + { + for (i=1;i>1;i++) + x_lp[i] += .25f*x[1][(2*i-1)] + .25f*x[1][(2*i+1)] + .5f*x[1][2*i]; + x_lp[0] += .25f*x[1][1] + .5f*x[1][0]; + } +#endif + _celt_autocorr(x_lp, ac, NULL, 0, + 4, len>>1, arch); + + /* Noise floor -40 dB */ +#ifdef FIXED_POINT + ac[0] += SHR32(ac[0],13); +#else + ac[0] *= 1.0001f; +#endif + /* Lag windowing */ + for (i=1;i<=4;i++) + { + /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ +#ifdef FIXED_POINT + ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); +#else + ac[i] -= ac[i]*(.008f*i)*(.008f*i); +#endif + } + + _celt_lpc(lpc, ac, 4); + for (i=0;i<4;i++) + { + tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); + lpc[i] = MULT16_16_Q15(lpc[i], tmp); + } + /* Add a zero */ + lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT); + lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]); + lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]); + lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]); + lpc2[4] = MULT16_16_Q15(c1,lpc[3]); + celt_fir5(x_lp, lpc2, len>>1); +} + +/* Pure C implementation. */ +#ifdef FIXED_POINT +opus_val32 +#else +void +#endif +celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch) +{ + +#if 0 /* This is a simple version of the pitch correlation that should work + well on DSPs like Blackfin and TI C5x/C6x */ + int i, j; +#ifdef FIXED_POINT + opus_val32 maxcorr=1; +#endif +#if !defined(OVERRIDE_PITCH_XCORR) + (void)arch; +#endif + for (i=0;i0); + celt_sig_assert(((size_t)_x&3)==0); + for (i=0;i0); + celt_assert(max_pitch>0); + lag = len+max_pitch; + + ALLOC(x_lp4, len>>2, opus_val16); + ALLOC(y_lp4, lag>>2, opus_val16); + ALLOC(xcorr, max_pitch>>1, opus_val32); + + /* Downsample by 2 again */ + for (j=0;j>2;j++) + x_lp4[j] = x_lp[2*j]; + for (j=0;j>2;j++) + y_lp4[j] = y[2*j]; + +#ifdef FIXED_POINT + xmax = celt_maxabs16(x_lp4, len>>2); + ymax = celt_maxabs16(y_lp4, lag>>2); + shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11; + if (shift>0) + { + for (j=0;j>2;j++) + x_lp4[j] = SHR16(x_lp4[j], shift); + for (j=0;j>2;j++) + y_lp4[j] = SHR16(y_lp4[j], shift); + /* Use double the shift for a MAC */ + shift *= 2; + } else { + shift = 0; + } +#endif + + /* Coarse search with 4x decimation */ + +#ifdef FIXED_POINT + maxcorr = +#endif + celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch); + + find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch +#ifdef FIXED_POINT + , 0, maxcorr +#endif + ); + + /* Finer search with 2x decimation */ +#ifdef FIXED_POINT + maxcorr=1; +#endif + for (i=0;i>1;i++) + { + opus_val32 sum; + xcorr[i] = 0; + if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) + continue; +#ifdef FIXED_POINT + sum = 0; + for (j=0;j>1;j++) + sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); +#else + sum = celt_inner_prod(x_lp, y+i, len>>1, arch); +#endif + xcorr[i] = MAX32(-1, sum); +#ifdef FIXED_POINT + maxcorr = MAX32(maxcorr, sum); +#endif + } + find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch +#ifdef FIXED_POINT + , shift+1, maxcorr +#endif + ); + + /* Refine by pseudo-interpolation */ + if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) + { + opus_val32 a, b, c; + a = xcorr[best_pitch[0]-1]; + b = xcorr[best_pitch[0]]; + c = xcorr[best_pitch[0]+1]; + if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) + offset = 1; + else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) + offset = -1; + else + offset = 0; + } else { + offset = 0; + } + *pitch = 2*best_pitch[0]-offset; + + RESTORE_STACK; +} + +#ifdef FIXED_POINT +static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) +{ + opus_val32 x2y2; + int sx, sy, shift; + opus_val32 g; + opus_val16 den; + if (xy == 0 || xx == 0 || yy == 0) + return 0; + sx = celt_ilog2(xx)-14; + sy = celt_ilog2(yy)-14; + shift = sx + sy; + x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14); + if (shift & 1) { + if (x2y2 < 32768) + { + x2y2 <<= 1; + shift--; + } else { + x2y2 >>= 1; + shift++; + } + } + den = celt_rsqrt_norm(x2y2); + g = MULT16_32_Q15(den, xy); + g = VSHR32(g, (shift>>1)-1); + return EXTRACT16(MIN32(g, Q15ONE)); +} +#else +static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) +{ + return xy/celt_sqrt(1+xx*yy); +} +#endif + +static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; +opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, + int N, int *T0_, int prev_period, opus_val16 prev_gain, int arch) +{ + int k, i, T, T0; + opus_val16 g, g0; + opus_val16 pg; + opus_val32 xy,xx,yy,xy2; + opus_val32 xcorr[3]; + opus_val32 best_xy, best_yy; + int offset; + int minperiod0; + VARDECL(opus_val32, yy_lookup); + SAVE_STACK; + + minperiod0 = minperiod; + maxperiod /= 2; + minperiod /= 2; + *T0_ /= 2; + prev_period /= 2; + N /= 2; + x += maxperiod; + if (*T0_>=maxperiod) + *T0_=maxperiod-1; + + T = T0 = *T0_; + ALLOC(yy_lookup, maxperiod+1, opus_val32); + dual_inner_prod(x, x, x-T0, N, &xx, &xy, arch); + yy_lookup[0] = xx; + yy=xx; + for (i=1;i<=maxperiod;i++) + { + yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]); + yy_lookup[i] = MAX32(0, yy); + } + yy = yy_lookup[T0]; + best_xy = xy; + best_yy = yy; + g = g0 = compute_pitch_gain(xy, xx, yy); + /* Look for any pitch at T/k */ + for (k=2;k<=15;k++) + { + int T1, T1b; + opus_val16 g1; + opus_val16 cont=0; + opus_val16 thresh; + T1 = celt_udiv(2*T0+k, 2*k); + if (T1 < minperiod) + break; + /* Look for another strong correlation at T1b */ + if (k==2) + { + if (T1+T0>maxperiod) + T1b = T0; + else + T1b = T0+T1; + } else + { + T1b = celt_udiv(2*second_check[k]*T0+k, 2*k); + } + dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch); + xy = HALF32(xy + xy2); + yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]); + g1 = compute_pitch_gain(xy, xx, yy); + if (abs(T1-prev_period)<=1) + cont = prev_gain; + else if (abs(T1-prev_period)<=2 && 5*k*k < T0) + cont = HALF16(prev_gain); + else + cont = 0; + thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont); + /* Bias against very high pitch (very short period) to avoid false-positives + due to short-term correlation */ + if (T1<3*minperiod) + thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont); + else if (T1<2*minperiod) + thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont); + if (g1 > thresh) + { + best_xy = xy; + best_yy = yy; + T = T1; + g = g1; + } + } + best_xy = MAX32(0, best_xy); + if (best_yy <= best_xy) + pg = Q15ONE; + else + pg = SHR32(frac_div32(best_xy,best_yy+1),16); + + for (k=0;k<3;k++) + xcorr[k] = celt_inner_prod(x, x-(T+k-1), N, arch); + if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) + offset = 1; + else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) + offset = -1; + else + offset = 0; + if (pg > g) + pg = g; + *T0_ = 2*T+offset; + + if (*T0_=3); + y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */ + y_0=*y++; + y_1=*y++; + y_2=*y++; + for (j=0;j +#include "os_support.h" +#include "arch.h" +#include "mathops.h" +#include "stack_alloc.h" +#include "rate.h" + +#ifdef FIXED_POINT +/* Mean energy in each band quantized in Q4 */ +const signed char eMeans[25] = { + 103,100, 92, 85, 81, + 77, 72, 70, 78, 75, + 73, 71, 78, 74, 69, + 72, 70, 74, 76, 71, + 60, 60, 60, 60, 60 +}; +#else +/* Mean energy in each band quantized in Q4 and converted back to float */ +const opus_val16 eMeans[25] = { + 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, + 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, + 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, + 4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f, + 3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f +}; +#endif +/* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */ +#ifdef FIXED_POINT +static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384}; +static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554}; +static const opus_val16 beta_intra = 4915; +#else +static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.}; +static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.}; +static const opus_val16 beta_intra = 4915/32768.; +#endif + +/*Parameters of the Laplace-like probability models used for the coarse energy. + There is one pair of parameters for each frame size, prediction type + (inter/intra), and band number. + The first number of each pair is the probability of 0, and the second is the + decay rate, both in Q8 precision.*/ +static const unsigned char e_prob_model[4][2][42] = { + /*120 sample frames.*/ + { + /*Inter*/ + { + 72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128, + 64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40, + 114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11 + }, + /*Intra*/ + { + 24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132, + 55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66, + 91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50 + } + }, + /*240 sample frames.*/ + { + /*Inter*/ + { + 83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74, + 93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18, + 146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9 + }, + /*Intra*/ + { + 23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91, + 73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60, + 104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45 + } + }, + /*480 sample frames.*/ + { + /*Inter*/ + { + 61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38, + 112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16, + 158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10 + }, + /*Intra*/ + { + 21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73, + 87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55, + 112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42 + } + }, + /*960 sample frames.*/ + { + /*Inter*/ + { + 42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36, + 119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25, + 154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15 + }, + /*Intra*/ + { + 22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72, + 96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52, + 117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40 + } + } +}; + +static const unsigned char small_energy_icdf[3]={2,1,0}; + +static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C) +{ + int c, i; + opus_val32 dist = 0; + c=0; do { + for (i=start;inbEBands]; + oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); +#ifdef FIXED_POINT + f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c]; + /* Rounding to nearest integer here is really important! */ + qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7); + decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT), + SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay))); +#else + f = x-coef*oldE-prev[c]; + /* Rounding to nearest integer here is really important! */ + qi = (int)floor(.5f+f); + decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay; +#endif + /* Prevent the energy from going down too quickly (e.g. for bands + that have just one bin) */ + if (qi < 0 && x < decay_bound) + { + qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT); + if (qi > 0) + qi = 0; + } + qi0 = qi; + /* If we don't have enough bits to encode all the energy, just assume + something safe. */ + tell = ec_tell(enc); + bits_left = budget-tell-3*C*(end-i); + if (i!=start && bits_left < 30) + { + if (bits_left < 24) + qi = IMIN(1, qi); + if (bits_left < 16) + qi = IMAX(-1, qi); + } + if (lfe && i>=2) + qi = IMIN(qi, 0); + if (budget-tell >= 15) + { + int pi; + pi = 2*IMIN(i,20); + ec_laplace_encode(enc, &qi, + prob_model[pi]<<7, prob_model[pi+1]<<6); + } + else if(budget-tell >= 2) + { + qi = IMAX(-1, IMIN(qi, 1)); + ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2); + } + else if(budget-tell >= 1) + { + qi = IMIN(0, qi); + ec_enc_bit_logp(enc, -qi, 1); + } + else + qi = -1; + error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT); + badness += abs(qi0-qi); + q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); + + tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7); +#ifdef FIXED_POINT + tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); +#endif + oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); + prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); + } while (++c < C); + } + return lfe ? 0 : badness; +} + +void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, + const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, + opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, + int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe) +{ + int intra; + opus_val16 max_decay; + VARDECL(opus_val16, oldEBands_intra); + VARDECL(opus_val16, error_intra); + ec_enc enc_start_state; + opus_uint32 tell; + int badness1=0; + opus_int32 intra_bias; + opus_val32 new_distortion; + SAVE_STACK; + + intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C); + intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512)); + new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C); + + tell = ec_tell(enc); + if (tell+3 > budget) + two_pass = intra = 0; + + max_decay = QCONST16(16.f,DB_SHIFT); + if (end-start>10) + { +#ifdef FIXED_POINT + max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); +#else + max_decay = MIN32(max_decay, .125f*nbAvailableBytes); +#endif + } + if (lfe) + max_decay = QCONST16(3.f,DB_SHIFT); + enc_start_state = *enc; + + ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); + ALLOC(error_intra, C*m->nbEBands, opus_val16); + OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands); + + if (two_pass || intra) + { + badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, + tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe); + } + + if (!intra) + { + unsigned char *intra_buf; + ec_enc enc_intra_state; + opus_int32 tell_intra; + opus_uint32 nstart_bytes; + opus_uint32 nintra_bytes; + opus_uint32 save_bytes; + int badness2; + VARDECL(unsigned char, intra_bits); + + tell_intra = ec_tell_frac(enc); + + enc_intra_state = *enc; + + nstart_bytes = ec_range_bytes(&enc_start_state); + nintra_bytes = ec_range_bytes(&enc_intra_state); + intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes; + save_bytes = nintra_bytes-nstart_bytes; + if (save_bytes == 0) + save_bytes = ALLOC_NONE; + ALLOC(intra_bits, save_bytes, unsigned char); + /* Copy bits from intra bit-stream */ + OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes); + + *enc = enc_start_state; + + badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, + tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe); + + if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) + { + *enc = enc_intra_state; + /* Copy intra bits to bit-stream */ + OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes); + OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); + OPUS_COPY(error, error_intra, C*m->nbEBands); + intra = 1; + } + } else { + OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); + OPUS_COPY(error, error_intra, C*m->nbEBands); + } + + if (intra) + *delayedIntra = new_distortion; + else + *delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra), + new_distortion); + + RESTORE_STACK; +} + +void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C) +{ + int i, c; + + /* Encode finer resolution */ + for (i=start;inbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]); +#else + q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac); +#endif + if (q2 > frac-1) + q2 = frac-1; + if (q2<0) + q2 = 0; + ec_enc_bits(enc, q2, fine_quant[i]); +#ifdef FIXED_POINT + offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT)); +#else + offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; +#endif + oldEBands[i+c*m->nbEBands] += offset; + error[i+c*m->nbEBands] -= offset; + /*printf ("%f ", error[i] - offset);*/ + } while (++c < C); + } +} + +void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C) +{ + int i, prio, c; + + /* Use up the remaining bits */ + for (prio=0;prio<2;prio++) + { + for (i=start;i=C ;i++) + { + if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) + continue; + c=0; + do { + int q2; + opus_val16 offset; + q2 = error[i+c*m->nbEBands]<0 ? 0 : 1; + ec_enc_bits(enc, q2, 1); +#ifdef FIXED_POINT + offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); +#else + offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); +#endif + oldEBands[i+c*m->nbEBands] += offset; + error[i+c*m->nbEBands] -= offset; + bits_left--; + } while (++c < C); + } + } +} + +void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM) +{ + const unsigned char *prob_model = e_prob_model[LM][intra]; + int i, c; + opus_val32 prev[2] = {0, 0}; + opus_val16 coef; + opus_val16 beta; + opus_int32 budget; + opus_int32 tell; + + if (intra) + { + coef = 0; + beta = beta_intra; + } else { + beta = beta_coef[LM]; + coef = pred_coef[LM]; + } + + budget = dec->storage*8; + + /* Decode at a fixed coarse resolution */ + for (i=start;i=15) + { + int pi; + pi = 2*IMIN(i,20); + qi = ec_laplace_decode(dec, + prob_model[pi]<<7, prob_model[pi+1]<<6); + } + else if(budget-tell>=2) + { + qi = ec_dec_icdf(dec, small_energy_icdf, 2); + qi = (qi>>1)^-(qi&1); + } + else if(budget-tell>=1) + { + qi = -ec_dec_bit_logp(dec, 1); + } + else + qi = -1; + q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); + + oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); + tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7); +#ifdef FIXED_POINT + tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); +#endif + oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); + prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); + } while (++c < C); + } +} + +void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C) +{ + int i, c; + /* Decode finer resolution */ + for (i=start;inbEBands] += offset; + } while (++c < C); + } +} + +void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C) +{ + int i, prio, c; + + /* Use up the remaining bits */ + for (prio=0;prio<2;prio++) + { + for (i=start;i=C ;i++) + { + if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) + continue; + c=0; + do { + int q2; + opus_val16 offset; + q2 = ec_dec_bits(dec, 1); +#ifdef FIXED_POINT + offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); +#else + offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); +#endif + oldEBands[i+c*m->nbEBands] += offset; + bits_left--; + } while (++c < C); + } + } +} + +void amp2Log2(const CELTMode *m, int effEnd, int end, + celt_ener *bandE, opus_val16 *bandLogE, int C) +{ + int c, i; + c=0; + do { + for (i=0;inbEBands] = + celt_log2(bandE[i+c*m->nbEBands]) + - SHL16((opus_val16)eMeans[i],6); +#ifdef FIXED_POINT + /* Compensate for bandE[] being Q12 but celt_log2() taking a Q14 input. */ + bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT); +#endif + } + for (i=effEnd;inbEBands+i] = -QCONST16(14.f,DB_SHIFT); + } while (++c < C); +} diff --git a/src/libopus/celt/quant_bands.h b/src/libopus/celt/quant_bands.h new file mode 100644 index 00000000..0490bca4 --- /dev/null +++ b/src/libopus/celt/quant_bands.h @@ -0,0 +1,66 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 QUANT_BANDS +#define QUANT_BANDS + +#include "arch.h" +#include "modes.h" +#include "entenc.h" +#include "entdec.h" +#include "mathops.h" + +#ifdef FIXED_POINT +extern const signed char eMeans[25]; +#else +extern const opus_val16 eMeans[25]; +#endif + +void amp2Log2(const CELTMode *m, int effEnd, int end, + celt_ener *bandE, opus_val16 *bandLogE, int C); + +void log2Amp(const CELTMode *m, int start, int end, + celt_ener *eBands, const opus_val16 *oldEBands, int C); + +void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, + const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, + opus_val16 *error, ec_enc *enc, int C, int LM, + int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra, + int two_pass, int loss_rate, int lfe); + +void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C); + +void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C); + +void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM); + +void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C); + +void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C); + +#endif /* QUANT_BANDS */ diff --git a/src/libopus/celt/rate.c b/src/libopus/celt/rate.c new file mode 100644 index 00000000..d6fe1dd1 --- /dev/null +++ b/src/libopus/celt/rate.c @@ -0,0 +1,646 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include +#include "modes.h" +#include "cwrs.h" +#include "arch.h" +#include "os_support.h" + +#include "entcode.h" +#include "rate.h" + +static const unsigned char LOG2_FRAC_TABLE[24]={ + 0, + 8,13, + 16,19,21,23, + 24,26,27,28,29,30,31,32, + 32,33,34,34,35,36,36,37,37 +}; + +#ifdef CUSTOM_MODES + +/*Determines if V(N,K) fits in a 32-bit unsigned integer. + N and K are themselves limited to 15 bits.*/ +static int fits_in32(int _n, int _k) +{ + static const opus_int16 maxN[15] = { + 32767, 32767, 32767, 1476, 283, 109, 60, 40, + 29, 24, 20, 18, 16, 14, 13}; + static const opus_int16 maxK[15] = { + 32767, 32767, 32767, 32767, 1172, 238, 95, 53, + 36, 27, 22, 18, 16, 15, 13}; + if (_n>=14) + { + if (_k>=14) + return 0; + else + return _n <= maxN[_k]; + } else { + return _k <= maxK[_n]; + } +} + +void compute_pulse_cache(CELTMode *m, int LM) +{ + int C; + int i; + int j; + int curr=0; + int nbEntries=0; + int entryN[100], entryK[100], entryI[100]; + const opus_int16 *eBands = m->eBands; + PulseCache *cache = &m->cache; + opus_int16 *cindex; + unsigned char *bits; + unsigned char *cap; + + cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2)); + cache->index = cindex; + + /* Scan for all unique band sizes */ + for (i=0;i<=LM+1;i++) + { + for (j=0;jnbEBands;j++) + { + int k; + int N = (eBands[j+1]-eBands[j])<>1; + cindex[i*m->nbEBands+j] = -1; + /* Find other bands that have the same size */ + for (k=0;k<=i;k++) + { + int n; + for (n=0;nnbEBands && (k!=i || n>1) + { + cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n]; + break; + } + } + } + if (cache->index[i*m->nbEBands+j] == -1 && N!=0) + { + int K; + entryN[nbEntries] = N; + K = 0; + while (fits_in32(N,get_pulses(K+1)) && KnbEBands+j] = curr; + entryI[nbEntries] = curr; + + curr += K+1; + nbEntries++; + } + } + } + bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr); + cache->bits = bits; + cache->size = curr; + /* Compute the cache for all unique sizes */ + for (i=0;icaps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands); + for (i=0;i<=LM;i++) + { + for (C=1;C<=2;C++) + { + for (j=0;jnbEBands;j++) + { + int N0; + int max_bits; + N0 = m->eBands[j+1]-m->eBands[j]; + /* N=1 bands only have a sign bit and fine bits. */ + if (N0<1 are even, including custom modes.*/ + if (N0 > 2) + { + N0>>=1; + LM0--; + } + /* N0=1 bands can't be split down to N<2. */ + else if (N0 <= 1) + { + LM0=IMIN(i,1); + N0<<=LM0; + } + /* Compute the cost for the lowest-level PVQ of a fully split + band. */ + pcache = bits + cindex[(LM0+1)*m->nbEBands+j]; + max_bits = pcache[pcache[0]]+1; + /* Add in the cost of coding regular splits. */ + N = N0; + for(k=0;klogN[j]+((LM0+k)<>1)-QTHETA_OFFSET; + /* The number of qtheta bits we'll allocate if the remainder + is to be max_bits. + The average measured cost for theta is 0.89701 times qb, + approximated here as 459/512. */ + num=459*(opus_int32)((2*N-1)*offset+max_bits); + den=((opus_int32)(2*N-1)<<9)-459; + qb = IMIN((num+(den>>1))/den, 57); + celt_assert(qb >= 0); + max_bits += qb; + N <<= 1; + } + /* Add in the cost of a stereo split, if necessary. */ + if (C==2) + { + max_bits <<= 1; + offset = ((m->logN[j]+(i<>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); + ndof = 2*N-1-(N==2); + /* The average measured cost for theta with the step PDF is + 0.95164 times qb, approximated here as 487/512. */ + num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset); + den = ((opus_int32)ndof<<9)-(N==2?512:487); + qb = IMIN((num+(den>>1))/den, (N==2?64:61)); + celt_assert(qb >= 0); + max_bits += qb; + } + /* Add the fine bits we'll use. */ + /* Compensate for the extra DoF in stereo */ + ndof = C*N + ((C==2 && N>2) ? 1 : 0); + /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET + compared to their "fair share" of total/N */ + offset = ((m->logN[j] + (i<>1)-FINE_OFFSET; + /* N=2 is the only point that doesn't match the curve */ + if (N==2) + offset += 1<>2; + /* The number of fine bits we'll allocate if the remainder is + to be max_bits. */ + num = max_bits+ndof*offset; + den = (ndof-1)<>1))/den, MAX_FINE_BITS); + celt_assert(qb >= 0); + max_bits += C*qb<eBands[j+1]-m->eBands[j])<= 0); + celt_assert(max_bits < 256); + *cap++ = (unsigned char)max_bits; + } + } + } +} + +#endif /* CUSTOM_MODES */ + +#define ALLOC_STEPS 6 + +static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, + const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance, + int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, + int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) +{ + opus_int32 psum; + int lo, hi; + int i, j; + int logM; + int stereo; + int codedBands=-1; + int alloc_floor; + opus_int32 left, percoeff; + int done; + opus_int32 balance; + SAVE_STACK; + + alloc_floor = C<1; + + logM = LM<>1; + psum = 0; + done = 0; + for (j=end;j-->start;) + { + int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS); + if (tmp >= thresh[j] || done) + { + done = 1; + /* Don't allocate more than we can actually use */ + psum += IMIN(tmp, cap[j]); + } else { + if (tmp >= alloc_floor) + psum += alloc_floor; + } + } + if (psum > total) + hi = mid; + else + lo = mid; + } + psum = 0; + /*printf ("interp bisection gave %d\n", lo);*/ + done = 0; + for (j=end;j-->start;) + { + int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS); + if (tmp < thresh[j] && !done) + { + if (tmp >= alloc_floor) + tmp = alloc_floor; + else + tmp = 0; + } else + done = 1; + /* Don't allocate more than we can actually use */ + tmp = IMIN(tmp, cap[j]); + bits[j] = tmp; + psum += tmp; + } + + /* Decide which bands to skip, working backwards from the end. */ + for (codedBands=end;;codedBands--) + { + int band_width; + int band_bits; + int rem; + j = codedBands-1; + /* Never skip the first band, nor a band that has been boosted by + dynalloc. + In the first case, we'd be coding a bit to signal we're going to waste + all the other bits. + In the second case, we'd be coding a bit to redistribute all the bits + we just signaled should be cocentrated in this band. */ + if (j<=skip_start) + { + /* Give the bit we reserved to end skipping back. */ + total += skip_rsv; + break; + } + /*Figure out how many left-over bits we would be adding to this band. + This can include bits we've stolen back from higher, skipped bands.*/ + left = total-psum; + percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); + left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; + rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); + band_width = m->eBands[codedBands]-m->eBands[j]; + band_bits = (int)(bits[j] + percoeff*band_width + rem); + /*Only code a skip decision if we're above the threshold for this band. + Otherwise it is force-skipped. + This ensures that we have enough bits to code the skip flag.*/ + if (band_bits >= IMAX(thresh[j], alloc_floor+(1< 17) + depth_threshold = j (depth_threshold*band_width<>4 && j<=signalBandwidth)) +#endif + { + ec_enc_bit_logp(ec, 1, 1); + break; + } + ec_enc_bit_logp(ec, 0, 1); + } else if (ec_dec_bit_logp(ec, 1)) { + break; + } + /*We used a bit to skip this band.*/ + psum += 1< 0) + intensity_rsv = LOG2_FRAC_TABLE[j-start]; + psum += intensity_rsv; + if (band_bits >= alloc_floor) + { + /*If we have enough for a fine energy bit per channel, use it.*/ + psum += alloc_floor; + bits[j] = alloc_floor; + } else { + /*Otherwise this band gets nothing at all.*/ + bits[j] = 0; + } + } + + celt_assert(codedBands > start); + /* Code the intensity and dual stereo parameters. */ + if (intensity_rsv > 0) + { + if (encode) + { + *intensity = IMIN(*intensity, codedBands); + ec_enc_uint(ec, *intensity-start, codedBands+1-start); + } + else + *intensity = start+ec_dec_uint(ec, codedBands+1-start); + } + else + *intensity = 0; + if (*intensity <= start) + { + total += dual_stereo_rsv; + dual_stereo_rsv = 0; + } + if (dual_stereo_rsv > 0) + { + if (encode) + ec_enc_bit_logp(ec, *dual_stereo, 1); + else + *dual_stereo = ec_dec_bit_logp(ec, 1); + } + else + *dual_stereo = 0; + + /* Allocate the remaining bits */ + left = total-psum; + percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); + left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; + for (j=start;jeBands[j+1]-m->eBands[j])); + for (j=start;jeBands[j+1]-m->eBands[j]); + bits[j] += tmp; + left -= tmp; + } + /*for (j=0;j= 0); + N0 = m->eBands[j+1]-m->eBands[j]; + N=N0<1) + { + excess = MAX32(bit-cap[j],0); + bits[j] = bit-excess; + + /* Compensate for the extra DoF in stereo */ + den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); + + NClogN = den*(m->logN[j] + logM); + + /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET + compared to their "fair share" of total/N */ + offset = (NClogN>>1)-den*FINE_OFFSET; + + /* N=2 is the only point that doesn't match the curve */ + if (N==2) + offset += den<>2; + + /* Changing the offset for allocating the second and third + fine energy bit */ + if (bits[j] + offset < den*2<>2; + else if (bits[j] + offset < den*3<>3; + + /* Divide with rounding */ + ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1)))); + ebits[j] = celt_udiv(ebits[j], den)>>BITRES; + + /* Make sure not to bust */ + if (C*ebits[j] > (bits[j]>>BITRES)) + ebits[j] = bits[j] >> stereo >> BITRES; + + /* More than that is useless because that's about as far as PVQ can go */ + ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); + + /* If we rounded down or capped this band, make it a candidate for the + final fine energy pass */ + fine_priority[j] = ebits[j]*(den<= bits[j]+offset; + + /* Remove the allocated fine bits; the rest are assigned to PVQ */ + bits[j] -= C*ebits[j]< 0) + { + int extra_fine; + int extra_bits; + extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]); + ebits[j] += extra_fine; + extra_bits = extra_fine*C<= excess-balance; + excess -= extra_bits; + } + balance = excess; + + celt_assert(bits[j] >= 0); + celt_assert(ebits[j] >= 0); + } + /* Save any remaining bits over the cap for the rebalancing in + quant_all_bands(). */ + *_balance = balance; + + /* The skipped bands use all their bits for fine energy. */ + for (;j> stereo >> BITRES; + celt_assert(C*ebits[j]<nbEBands; + skip_start = start; + /* Reserve a bit to signal the end of manually skipped bands. */ + skip_rsv = total >= 1<total) + intensity_rsv = 0; + else + { + total -= intensity_rsv; + dual_stereo_rsv = total>=1<eBands[j+1]-m->eBands[j])<>4); + /* Tilt of the allocation curve */ + trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) + *(1<<(LM+BITRES))>>6; + /* Giving less resolution to single-coefficient bands because they get + more benefit from having one coarse value per coefficient*/ + if ((m->eBands[j+1]-m->eBands[j])<nbAllocVectors - 1; + do + { + int done = 0; + int psum = 0; + int mid = (lo+hi) >> 1; + for (j=end;j-->start;) + { + int bitsj; + int N = m->eBands[j+1]-m->eBands[j]; + bitsj = C*N*m->allocVectors[mid*len+j]<>2; + if (bitsj > 0) + bitsj = IMAX(0, bitsj + trim_offset[j]); + bitsj += offsets[j]; + if (bitsj >= thresh[j] || done) + { + done = 1; + /* Don't allocate more than we can actually use */ + psum += IMIN(bitsj, cap[j]); + } else { + if (bitsj >= C< total) + hi = mid - 1; + else + lo = mid + 1; + /*printf ("lo = %d, hi = %d\n", lo, hi);*/ + } + while (lo <= hi); + hi = lo--; + /*printf ("interp between %d and %d\n", lo, hi);*/ + for (j=start;jeBands[j+1]-m->eBands[j]; + bits1j = C*N*m->allocVectors[lo*len+j]<>2; + bits2j = hi>=m->nbAllocVectors ? + cap[j] : C*N*m->allocVectors[hi*len+j]<>2; + if (bits1j > 0) + bits1j = IMAX(0, bits1j + trim_offset[j]); + if (bits2j > 0) + bits2j = IMAX(0, bits2j + trim_offset[j]); + if (lo > 0) + bits1j += offsets[j]; + bits2j += offsets[j]; + if (offsets[j]>0) + skip_start = j; + bits2j = IMAX(0,bits2j-bits1j); + bits1[j] = bits1j; + bits2[j] = bits2j; + } + codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, + total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, + pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); + RESTORE_STACK; + return codedBands; +} + diff --git a/src/libopus/celt/rate.h b/src/libopus/celt/rate.h new file mode 100644 index 00000000..fad5e412 --- /dev/null +++ b/src/libopus/celt/rate.h @@ -0,0 +1,101 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 RATE_H +#define RATE_H + +#define MAX_PSEUDO 40 +#define LOG_MAX_PSEUDO 6 + +#define CELT_MAX_PULSES 128 + +#define MAX_FINE_BITS 8 + +#define FINE_OFFSET 21 +#define QTHETA_OFFSET 4 +#define QTHETA_OFFSET_TWOPHASE 16 + +#include "cwrs.h" +#include "modes.h" + +void compute_pulse_cache(CELTMode *m, int LM); + +static OPUS_INLINE int get_pulses(int i) +{ + return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); +} + +static OPUS_INLINE int bits2pulses(const CELTMode *m, int band, int LM, int bits) +{ + int i; + int lo, hi; + const unsigned char *cache; + + LM++; + cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; + + lo = 0; + hi = cache[0]; + bits--; + for (i=0;i>1; + /* OPT: Make sure this is implemented with a conditional move */ + if ((int)cache[mid] >= bits) + hi = mid; + else + lo = mid; + } + if (bits- (lo == 0 ? -1 : (int)cache[lo]) <= (int)cache[hi]-bits) + return lo; + else + return hi; +} + +static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int pulses) +{ + const unsigned char *cache; + + LM++; + cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; + return pulses == 0 ? 0 : cache[pulses]+1; +} + +/** Compute the pulse allocation, i.e. how many pulses will go in each + * band. + @param m mode + @param offsets Requested increase or decrease in the number of bits for + each band + @param total Number of bands + @param pulses Number of pulses per band (returned) + @return Total number of bits allocated +*/ +int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, + opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth); + +#endif diff --git a/src/libopus/celt/stack_alloc.h b/src/libopus/celt/stack_alloc.h new file mode 100644 index 00000000..e2739bdf --- /dev/null +++ b/src/libopus/celt/stack_alloc.h @@ -0,0 +1,184 @@ +/* Copyright (C) 2002-2003 Jean-Marc Valin + Copyright (C) 2007-2009 Xiph.Org Foundation */ +/** + @file stack_alloc.h + @brief Temporary memory allocation on stack +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 STACK_ALLOC_H +#define STACK_ALLOC_H + +#include "opus_types.h" +#include "opus_defines.h" + +#if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_PSEUDOSTACK)) +#error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTACK be defined to select the temporary allocation mode." +#endif + +#ifdef USE_ALLOCA +# ifdef _WIN32 +# include +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# include +# endif +# endif +#endif + +/** + * @def ALIGN(stack, size) + * + * Aligns the stack to a 'size' boundary + * + * @param stack Stack + * @param size New size boundary + */ + +/** + * @def PUSH(stack, size, type) + * + * Allocates 'size' elements of type 'type' on the stack + * + * @param stack Stack + * @param size Number of elements + * @param type Type of element + */ + +/** + * @def VARDECL(var) + * + * Declare variable on stack + * + * @param var Variable to declare + */ + +/** + * @def ALLOC(var, size, type) + * + * Allocate 'size' elements of 'type' on stack + * + * @param var Name of variable to allocate + * @param size Number of elements + * @param type Type of element + */ + +#if defined(VAR_ARRAYS) + +#define VARDECL(type, var) +#define ALLOC(var, size, type) type var[size] +#define SAVE_STACK +#define RESTORE_STACK +#define ALLOC_STACK +/* C99 does not allow VLAs of size zero */ +#define ALLOC_NONE 1 + +#elif defined(USE_ALLOCA) + +#define VARDECL(type, var) type *var + +# ifdef _WIN32 +# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) +# else +# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) +# endif + +#define SAVE_STACK +#define RESTORE_STACK +#define ALLOC_STACK +#define ALLOC_NONE 0 + +#else + +#ifdef CELT_C +char *scratch_ptr=0; +char *global_stack=0; +#else +extern char *global_stack; +extern char *scratch_ptr; +#endif /* CELT_C */ + +#ifdef ENABLE_VALGRIND + +#include + +#ifdef CELT_C +char *global_stack_top=0; +#else +extern char *global_stack_top; +#endif /* CELT_C */ + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) +#define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char)))) +#define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) +#define ALLOC_STACK char *_saved_stack; ((global_stack = (global_stack==0) ? ((global_stack_top=opus_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)); _saved_stack = global_stack; + +#else + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) +#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/(sizeof(char))),(stack)+=(size)*(sizeof(type)/(sizeof(char))),(type*)((stack)-(size)*(sizeof(type)/(sizeof(char))))) +#if 0 /* Set this to 1 to instrument pseudostack usage */ +#define RESTORE_STACK (printf("%ld %s:%d\n", global_stack-scratch_ptr, __FILE__, __LINE__),global_stack = _saved_stack) +#else +#define RESTORE_STACK (global_stack = _saved_stack) +#endif +#define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? (scratch_ptr=opus_alloc_scratch(GLOBAL_STACK_SIZE)) : global_stack); _saved_stack = global_stack; + +#endif /* ENABLE_VALGRIND */ + +#include "os_support.h" +#define VARDECL(type, var) type *var +#define ALLOC(var, size, type) var = PUSH(global_stack, size, type) +#define SAVE_STACK char *_saved_stack = global_stack; +#define ALLOC_NONE 0 + +#endif /* VAR_ARRAYS */ + + +#ifdef ENABLE_VALGRIND + +#include +#define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) +#define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) +#define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) +#define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) +#define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", value, __FILE__, __LINE__);}while(0) +#define OPUS_FPRINTF fprintf + +#else + +static OPUS_INLINE int _opus_false(void) {return 0;} +#define OPUS_CHECK_ARRAY(ptr, len) _opus_false() +#define OPUS_CHECK_VALUE(value) _opus_false() +#define OPUS_PRINT_INT(value) do{}while(0) +#define OPUS_FPRINTF (void) + +#endif + + +#endif /* STACK_ALLOC_H */ diff --git a/src/libopus/celt/static_modes_fixed.h b/src/libopus/celt/static_modes_fixed.h new file mode 100644 index 00000000..8717d626 --- /dev/null +++ b/src/libopus/celt/static_modes_fixed.h @@ -0,0 +1,892 @@ +/* The contents of this file was automatically generated by dump_modes.c + with arguments: 48000 960 + It contains static definitions for some pre-defined modes. */ +#include "modes.h" +#include "rate.h" + +#ifdef HAVE_ARM_NE10 +#define OVERRIDE_FFT 1 +#include "static_modes_fixed_arm_ne10.h" +#endif + +#ifndef DEF_WINDOW120 +#define DEF_WINDOW120 +static const opus_val16 window120[120] = { +2, 20, 55, 108, 178, +266, 372, 494, 635, 792, +966, 1157, 1365, 1590, 1831, +2089, 2362, 2651, 2956, 3276, +3611, 3961, 4325, 4703, 5094, +5499, 5916, 6346, 6788, 7241, +7705, 8179, 8663, 9156, 9657, +10167, 10684, 11207, 11736, 12271, +12810, 13353, 13899, 14447, 14997, +15547, 16098, 16648, 17197, 17744, +18287, 18827, 19363, 19893, 20418, +20936, 21447, 21950, 22445, 22931, +23407, 23874, 24330, 24774, 25208, +25629, 26039, 26435, 26819, 27190, +27548, 27893, 28224, 28541, 28845, +29135, 29411, 29674, 29924, 30160, +30384, 30594, 30792, 30977, 31151, +31313, 31463, 31602, 31731, 31849, +31958, 32057, 32148, 32229, 32303, +32370, 32429, 32481, 32528, 32568, +32604, 32634, 32661, 32683, 32701, +32717, 32729, 32740, 32748, 32754, +32758, 32762, 32764, 32766, 32767, +32767, 32767, 32767, 32767, 32767, +}; +#endif + +#ifndef DEF_LOGN400 +#define DEF_LOGN400 +static const opus_int16 logN400[21] = { +0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; +#endif + +#ifndef DEF_PULSE_CACHE50 +#define DEF_PULSE_CACHE50 +static const opus_int16 cache_index50[105] = { +-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, +82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, +41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, +41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, +318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, +305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, +240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, +}; +static const unsigned char cache_bits50[392] = { +40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, +31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, +51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, +66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, +64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, +94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, +124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, +97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, +142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, +28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, +153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, +229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, +166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, +86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, +25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, +185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, +110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, +74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, +163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, +228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, +90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, +87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, +106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, +224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, +182, 234, }; +static const unsigned char cache_caps50[168] = { +224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, +178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, +240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, +160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, +138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, +204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, +185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, +207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, +188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, +204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, +140, 66, 40, }; +#endif + +#ifndef FFT_TWIDDLES48000_960 +#define FFT_TWIDDLES48000_960 +static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { +{32767, 0}, {32766, -429}, +{32757, -858}, {32743, -1287}, +{32724, -1715}, {32698, -2143}, +{32667, -2570}, {32631, -2998}, +{32588, -3425}, {32541, -3851}, +{32488, -4277}, {32429, -4701}, +{32364, -5125}, {32295, -5548}, +{32219, -5971}, {32138, -6393}, +{32051, -6813}, {31960, -7231}, +{31863, -7650}, {31760, -8067}, +{31652, -8481}, {31539, -8895}, +{31419, -9306}, {31294, -9716}, +{31165, -10126}, {31030, -10532}, +{30889, -10937}, {30743, -11340}, +{30592, -11741}, {30436, -12141}, +{30274, -12540}, {30107, -12935}, +{29936, -13328}, {29758, -13718}, +{29577, -14107}, {29390, -14493}, +{29197, -14875}, {29000, -15257}, +{28797, -15635}, {28590, -16010}, +{28379, -16384}, {28162, -16753}, +{27940, -17119}, {27714, -17484}, +{27482, -17845}, {27246, -18205}, +{27006, -18560}, {26760, -18911}, +{26510, -19260}, {26257, -19606}, +{25997, -19947}, {25734, -20286}, +{25466, -20621}, {25194, -20952}, +{24918, -21281}, {24637, -21605}, +{24353, -21926}, {24063, -22242}, +{23770, -22555}, {23473, -22865}, +{23171, -23171}, {22866, -23472}, +{22557, -23769}, {22244, -24063}, +{21927, -24352}, {21606, -24636}, +{21282, -24917}, {20954, -25194}, +{20622, -25465}, {20288, -25733}, +{19949, -25997}, {19607, -26255}, +{19261, -26509}, {18914, -26760}, +{18561, -27004}, {18205, -27246}, +{17846, -27481}, {17485, -27713}, +{17122, -27940}, {16755, -28162}, +{16385, -28378}, {16012, -28590}, +{15636, -28797}, {15258, -28999}, +{14878, -29197}, {14494, -29389}, +{14108, -29576}, {13720, -29757}, +{13329, -29934}, {12937, -30107}, +{12540, -30274}, {12142, -30435}, +{11744, -30592}, {11342, -30743}, +{10939, -30889}, {10534, -31030}, +{10127, -31164}, {9718, -31294}, +{9307, -31418}, {8895, -31537}, +{8482, -31652}, {8067, -31759}, +{7650, -31862}, {7233, -31960}, +{6815, -32051}, {6393, -32138}, +{5973, -32219}, {5549, -32294}, +{5127, -32364}, {4703, -32429}, +{4278, -32487}, {3852, -32541}, +{3426, -32588}, {2999, -32630}, +{2572, -32667}, {2144, -32698}, +{1716, -32724}, {1287, -32742}, +{860, -32757}, {430, -32766}, +{0, -32767}, {-429, -32766}, +{-858, -32757}, {-1287, -32743}, +{-1715, -32724}, {-2143, -32698}, +{-2570, -32667}, {-2998, -32631}, +{-3425, -32588}, {-3851, -32541}, +{-4277, -32488}, {-4701, -32429}, +{-5125, -32364}, {-5548, -32295}, +{-5971, -32219}, {-6393, -32138}, +{-6813, -32051}, {-7231, -31960}, +{-7650, -31863}, {-8067, -31760}, +{-8481, -31652}, {-8895, -31539}, +{-9306, -31419}, {-9716, -31294}, +{-10126, -31165}, {-10532, -31030}, +{-10937, -30889}, {-11340, -30743}, +{-11741, -30592}, {-12141, -30436}, +{-12540, -30274}, {-12935, -30107}, +{-13328, -29936}, {-13718, -29758}, +{-14107, -29577}, {-14493, -29390}, +{-14875, -29197}, {-15257, -29000}, +{-15635, -28797}, {-16010, -28590}, +{-16384, -28379}, {-16753, -28162}, +{-17119, -27940}, {-17484, -27714}, +{-17845, -27482}, {-18205, -27246}, +{-18560, -27006}, {-18911, -26760}, +{-19260, -26510}, {-19606, -26257}, +{-19947, -25997}, {-20286, -25734}, +{-20621, -25466}, {-20952, -25194}, +{-21281, -24918}, {-21605, -24637}, +{-21926, -24353}, {-22242, -24063}, +{-22555, -23770}, {-22865, -23473}, +{-23171, -23171}, {-23472, -22866}, +{-23769, -22557}, {-24063, -22244}, +{-24352, -21927}, {-24636, -21606}, +{-24917, -21282}, {-25194, -20954}, +{-25465, -20622}, {-25733, -20288}, +{-25997, -19949}, {-26255, -19607}, +{-26509, -19261}, {-26760, -18914}, +{-27004, -18561}, {-27246, -18205}, +{-27481, -17846}, {-27713, -17485}, +{-27940, -17122}, {-28162, -16755}, +{-28378, -16385}, {-28590, -16012}, +{-28797, -15636}, {-28999, -15258}, +{-29197, -14878}, {-29389, -14494}, +{-29576, -14108}, {-29757, -13720}, +{-29934, -13329}, {-30107, -12937}, +{-30274, -12540}, {-30435, -12142}, +{-30592, -11744}, {-30743, -11342}, +{-30889, -10939}, {-31030, -10534}, +{-31164, -10127}, {-31294, -9718}, +{-31418, -9307}, {-31537, -8895}, +{-31652, -8482}, {-31759, -8067}, +{-31862, -7650}, {-31960, -7233}, +{-32051, -6815}, {-32138, -6393}, +{-32219, -5973}, {-32294, -5549}, +{-32364, -5127}, {-32429, -4703}, +{-32487, -4278}, {-32541, -3852}, +{-32588, -3426}, {-32630, -2999}, +{-32667, -2572}, {-32698, -2144}, +{-32724, -1716}, {-32742, -1287}, +{-32757, -860}, {-32766, -430}, +{-32767, 0}, {-32766, 429}, +{-32757, 858}, {-32743, 1287}, +{-32724, 1715}, {-32698, 2143}, +{-32667, 2570}, {-32631, 2998}, +{-32588, 3425}, {-32541, 3851}, +{-32488, 4277}, {-32429, 4701}, +{-32364, 5125}, {-32295, 5548}, +{-32219, 5971}, {-32138, 6393}, +{-32051, 6813}, {-31960, 7231}, +{-31863, 7650}, {-31760, 8067}, +{-31652, 8481}, {-31539, 8895}, +{-31419, 9306}, {-31294, 9716}, +{-31165, 10126}, {-31030, 10532}, +{-30889, 10937}, {-30743, 11340}, +{-30592, 11741}, {-30436, 12141}, +{-30274, 12540}, {-30107, 12935}, +{-29936, 13328}, {-29758, 13718}, +{-29577, 14107}, {-29390, 14493}, +{-29197, 14875}, {-29000, 15257}, +{-28797, 15635}, {-28590, 16010}, +{-28379, 16384}, {-28162, 16753}, +{-27940, 17119}, {-27714, 17484}, +{-27482, 17845}, {-27246, 18205}, +{-27006, 18560}, {-26760, 18911}, +{-26510, 19260}, {-26257, 19606}, +{-25997, 19947}, {-25734, 20286}, +{-25466, 20621}, {-25194, 20952}, +{-24918, 21281}, {-24637, 21605}, +{-24353, 21926}, {-24063, 22242}, +{-23770, 22555}, {-23473, 22865}, +{-23171, 23171}, {-22866, 23472}, +{-22557, 23769}, {-22244, 24063}, +{-21927, 24352}, {-21606, 24636}, +{-21282, 24917}, {-20954, 25194}, +{-20622, 25465}, {-20288, 25733}, +{-19949, 25997}, {-19607, 26255}, +{-19261, 26509}, {-18914, 26760}, +{-18561, 27004}, {-18205, 27246}, +{-17846, 27481}, {-17485, 27713}, +{-17122, 27940}, {-16755, 28162}, +{-16385, 28378}, {-16012, 28590}, +{-15636, 28797}, {-15258, 28999}, +{-14878, 29197}, {-14494, 29389}, +{-14108, 29576}, {-13720, 29757}, +{-13329, 29934}, {-12937, 30107}, +{-12540, 30274}, {-12142, 30435}, +{-11744, 30592}, {-11342, 30743}, +{-10939, 30889}, {-10534, 31030}, +{-10127, 31164}, {-9718, 31294}, +{-9307, 31418}, {-8895, 31537}, +{-8482, 31652}, {-8067, 31759}, +{-7650, 31862}, {-7233, 31960}, +{-6815, 32051}, {-6393, 32138}, +{-5973, 32219}, {-5549, 32294}, +{-5127, 32364}, {-4703, 32429}, +{-4278, 32487}, {-3852, 32541}, +{-3426, 32588}, {-2999, 32630}, +{-2572, 32667}, {-2144, 32698}, +{-1716, 32724}, {-1287, 32742}, +{-860, 32757}, {-430, 32766}, +{0, 32767}, {429, 32766}, +{858, 32757}, {1287, 32743}, +{1715, 32724}, {2143, 32698}, +{2570, 32667}, {2998, 32631}, +{3425, 32588}, {3851, 32541}, +{4277, 32488}, {4701, 32429}, +{5125, 32364}, {5548, 32295}, +{5971, 32219}, {6393, 32138}, +{6813, 32051}, {7231, 31960}, +{7650, 31863}, {8067, 31760}, +{8481, 31652}, {8895, 31539}, +{9306, 31419}, {9716, 31294}, +{10126, 31165}, {10532, 31030}, +{10937, 30889}, {11340, 30743}, +{11741, 30592}, {12141, 30436}, +{12540, 30274}, {12935, 30107}, +{13328, 29936}, {13718, 29758}, +{14107, 29577}, {14493, 29390}, +{14875, 29197}, {15257, 29000}, +{15635, 28797}, {16010, 28590}, +{16384, 28379}, {16753, 28162}, +{17119, 27940}, {17484, 27714}, +{17845, 27482}, {18205, 27246}, +{18560, 27006}, {18911, 26760}, +{19260, 26510}, {19606, 26257}, +{19947, 25997}, {20286, 25734}, +{20621, 25466}, {20952, 25194}, +{21281, 24918}, {21605, 24637}, +{21926, 24353}, {22242, 24063}, +{22555, 23770}, {22865, 23473}, +{23171, 23171}, {23472, 22866}, +{23769, 22557}, {24063, 22244}, +{24352, 21927}, {24636, 21606}, +{24917, 21282}, {25194, 20954}, +{25465, 20622}, {25733, 20288}, +{25997, 19949}, {26255, 19607}, +{26509, 19261}, {26760, 18914}, +{27004, 18561}, {27246, 18205}, +{27481, 17846}, {27713, 17485}, +{27940, 17122}, {28162, 16755}, +{28378, 16385}, {28590, 16012}, +{28797, 15636}, {28999, 15258}, +{29197, 14878}, {29389, 14494}, +{29576, 14108}, {29757, 13720}, +{29934, 13329}, {30107, 12937}, +{30274, 12540}, {30435, 12142}, +{30592, 11744}, {30743, 11342}, +{30889, 10939}, {31030, 10534}, +{31164, 10127}, {31294, 9718}, +{31418, 9307}, {31537, 8895}, +{31652, 8482}, {31759, 8067}, +{31862, 7650}, {31960, 7233}, +{32051, 6815}, {32138, 6393}, +{32219, 5973}, {32294, 5549}, +{32364, 5127}, {32429, 4703}, +{32487, 4278}, {32541, 3852}, +{32588, 3426}, {32630, 2999}, +{32667, 2572}, {32698, 2144}, +{32724, 1716}, {32742, 1287}, +{32757, 860}, {32766, 430}, +}; +#ifndef FFT_BITREV480 +#define FFT_BITREV480 +static const opus_int16 fft_bitrev480[480] = { +0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, +8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, +16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, +24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, +4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, +12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, +20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, +28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, +1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, +9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, +17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, +25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, +5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, +13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, +21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, +29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, +2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, +10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, +18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, +26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, +6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, +14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, +22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, +30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, +3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, +11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, +19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, +27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, +7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, +15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, +23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, +31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, +}; +#endif + +#ifndef FFT_BITREV240 +#define FFT_BITREV240 +static const opus_int16 fft_bitrev240[240] = { +0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, +4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, +8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, +12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, +1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, +5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, +9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, +13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, +2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, +6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, +10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, +14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, +3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, +7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, +11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, +15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, +}; +#endif + +#ifndef FFT_BITREV120 +#define FFT_BITREV120 +static const opus_int16 fft_bitrev120[120] = { +0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, +4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, +1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, +5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, +2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, +6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, +3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, +7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, +}; +#endif + +#ifndef FFT_BITREV60 +#define FFT_BITREV60 +static const opus_int16 fft_bitrev60[60] = { +0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, +1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, +2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, +3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, +}; +#endif + +#ifndef FFT_STATE48000_960_0 +#define FFT_STATE48000_960_0 +static const kiss_fft_state fft_state48000_960_0 = { +480, /* nfft */ +17476, /* scale */ +8, /* scale_shift */ +-1, /* shift */ +{5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev480, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_480, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_1 +#define FFT_STATE48000_960_1 +static const kiss_fft_state fft_state48000_960_1 = { +240, /* nfft */ +17476, /* scale */ +7, /* scale_shift */ +1, /* shift */ +{5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev240, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_240, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_2 +#define FFT_STATE48000_960_2 +static const kiss_fft_state fft_state48000_960_2 = { +120, /* nfft */ +17476, /* scale */ +6, /* scale_shift */ +2, /* shift */ +{5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev120, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_120, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_3 +#define FFT_STATE48000_960_3 +static const kiss_fft_state fft_state48000_960_3 = { +60, /* nfft */ +17476, /* scale */ +5, /* scale_shift */ +3, /* shift */ +{5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev60, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_60, +#else +NULL, +#endif +}; +#endif + +#endif + +#ifndef MDCT_TWIDDLES960 +#define MDCT_TWIDDLES960 +static const opus_val16 mdct_twiddles960[1800] = { +32767, 32767, 32767, 32766, 32765, +32763, 32761, 32759, 32756, 32753, +32750, 32746, 32742, 32738, 32733, +32728, 32722, 32717, 32710, 32704, +32697, 32690, 32682, 32674, 32666, +32657, 32648, 32639, 32629, 32619, +32609, 32598, 32587, 32576, 32564, +32552, 32539, 32526, 32513, 32500, +32486, 32472, 32457, 32442, 32427, +32411, 32395, 32379, 32362, 32345, +32328, 32310, 32292, 32274, 32255, +32236, 32217, 32197, 32177, 32157, +32136, 32115, 32093, 32071, 32049, +32027, 32004, 31981, 31957, 31933, +31909, 31884, 31859, 31834, 31809, +31783, 31756, 31730, 31703, 31676, +31648, 31620, 31592, 31563, 31534, +31505, 31475, 31445, 31415, 31384, +31353, 31322, 31290, 31258, 31226, +31193, 31160, 31127, 31093, 31059, +31025, 30990, 30955, 30920, 30884, +30848, 30812, 30775, 30738, 30701, +30663, 30625, 30587, 30548, 30509, +30470, 30430, 30390, 30350, 30309, +30269, 30227, 30186, 30144, 30102, +30059, 30016, 29973, 29930, 29886, +29842, 29797, 29752, 29707, 29662, +29616, 29570, 29524, 29477, 29430, +29383, 29335, 29287, 29239, 29190, +29142, 29092, 29043, 28993, 28943, +28892, 28842, 28791, 28739, 28688, +28636, 28583, 28531, 28478, 28425, +28371, 28317, 28263, 28209, 28154, +28099, 28044, 27988, 27932, 27876, +27820, 27763, 27706, 27648, 27591, +27533, 27474, 27416, 27357, 27298, +27238, 27178, 27118, 27058, 26997, +26936, 26875, 26814, 26752, 26690, +26628, 26565, 26502, 26439, 26375, +26312, 26247, 26183, 26119, 26054, +25988, 25923, 25857, 25791, 25725, +25658, 25592, 25524, 25457, 25389, +25322, 25253, 25185, 25116, 25047, +24978, 24908, 24838, 24768, 24698, +24627, 24557, 24485, 24414, 24342, +24270, 24198, 24126, 24053, 23980, +23907, 23834, 23760, 23686, 23612, +23537, 23462, 23387, 23312, 23237, +23161, 23085, 23009, 22932, 22856, +22779, 22701, 22624, 22546, 22468, +22390, 22312, 22233, 22154, 22075, +21996, 21916, 21836, 21756, 21676, +21595, 21515, 21434, 21352, 21271, +21189, 21107, 21025, 20943, 20860, +20777, 20694, 20611, 20528, 20444, +20360, 20276, 20192, 20107, 20022, +19937, 19852, 19767, 19681, 19595, +19509, 19423, 19336, 19250, 19163, +19076, 18988, 18901, 18813, 18725, +18637, 18549, 18460, 18372, 18283, +18194, 18104, 18015, 17925, 17835, +17745, 17655, 17565, 17474, 17383, +17292, 17201, 17110, 17018, 16927, +16835, 16743, 16650, 16558, 16465, +16372, 16279, 16186, 16093, 15999, +15906, 15812, 15718, 15624, 15529, +15435, 15340, 15245, 15150, 15055, +14960, 14864, 14769, 14673, 14577, +14481, 14385, 14288, 14192, 14095, +13998, 13901, 13804, 13706, 13609, +13511, 13414, 13316, 13218, 13119, +13021, 12923, 12824, 12725, 12626, +12527, 12428, 12329, 12230, 12130, +12030, 11930, 11831, 11730, 11630, +11530, 11430, 11329, 11228, 11128, +11027, 10926, 10824, 10723, 10622, +10520, 10419, 10317, 10215, 10113, +10011, 9909, 9807, 9704, 9602, +9499, 9397, 9294, 9191, 9088, +8985, 8882, 8778, 8675, 8572, +8468, 8364, 8261, 8157, 8053, +7949, 7845, 7741, 7637, 7532, +7428, 7323, 7219, 7114, 7009, +6905, 6800, 6695, 6590, 6485, +6380, 6274, 6169, 6064, 5958, +5853, 5747, 5642, 5536, 5430, +5325, 5219, 5113, 5007, 4901, +4795, 4689, 4583, 4476, 4370, +4264, 4157, 4051, 3945, 3838, +3732, 3625, 3518, 3412, 3305, +3198, 3092, 2985, 2878, 2771, +2664, 2558, 2451, 2344, 2237, +2130, 2023, 1916, 1809, 1702, +1594, 1487, 1380, 1273, 1166, +1059, 952, 844, 737, 630, +523, 416, 308, 201, 94, +-13, -121, -228, -335, -442, +-550, -657, -764, -871, -978, +-1086, -1193, -1300, -1407, -1514, +-1621, -1728, -1835, -1942, -2049, +-2157, -2263, -2370, -2477, -2584, +-2691, -2798, -2905, -3012, -3118, +-3225, -3332, -3439, -3545, -3652, +-3758, -3865, -3971, -4078, -4184, +-4290, -4397, -4503, -4609, -4715, +-4821, -4927, -5033, -5139, -5245, +-5351, -5457, -5562, -5668, -5774, +-5879, -5985, -6090, -6195, -6301, +-6406, -6511, -6616, -6721, -6826, +-6931, -7036, -7140, -7245, -7349, +-7454, -7558, -7663, -7767, -7871, +-7975, -8079, -8183, -8287, -8390, +-8494, -8597, -8701, -8804, -8907, +-9011, -9114, -9217, -9319, -9422, +-9525, -9627, -9730, -9832, -9934, +-10037, -10139, -10241, -10342, -10444, +-10546, -10647, -10748, -10850, -10951, +-11052, -11153, -11253, -11354, -11455, +-11555, -11655, -11756, -11856, -11955, +-12055, -12155, -12254, -12354, -12453, +-12552, -12651, -12750, -12849, -12947, +-13046, -13144, -13242, -13340, -13438, +-13536, -13633, -13731, -13828, -13925, +-14022, -14119, -14216, -14312, -14409, +-14505, -14601, -14697, -14793, -14888, +-14984, -15079, -15174, -15269, -15364, +-15459, -15553, -15647, -15741, -15835, +-15929, -16023, -16116, -16210, -16303, +-16396, -16488, -16581, -16673, -16766, +-16858, -16949, -17041, -17133, -17224, +-17315, -17406, -17497, -17587, -17678, +-17768, -17858, -17948, -18037, -18127, +-18216, -18305, -18394, -18483, -18571, +-18659, -18747, -18835, -18923, -19010, +-19098, -19185, -19271, -19358, -19444, +-19531, -19617, -19702, -19788, -19873, +-19959, -20043, -20128, -20213, -20297, +-20381, -20465, -20549, -20632, -20715, +-20798, -20881, -20963, -21046, -21128, +-21210, -21291, -21373, -21454, -21535, +-21616, -21696, -21776, -21856, -21936, +-22016, -22095, -22174, -22253, -22331, +-22410, -22488, -22566, -22643, -22721, +-22798, -22875, -22951, -23028, -23104, +-23180, -23256, -23331, -23406, -23481, +-23556, -23630, -23704, -23778, -23852, +-23925, -23998, -24071, -24144, -24216, +-24288, -24360, -24432, -24503, -24574, +-24645, -24716, -24786, -24856, -24926, +-24995, -25064, -25133, -25202, -25270, +-25339, -25406, -25474, -25541, -25608, +-25675, -25742, -25808, -25874, -25939, +-26005, -26070, -26135, -26199, -26264, +-26327, -26391, -26455, -26518, -26581, +-26643, -26705, -26767, -26829, -26891, +-26952, -27013, -27073, -27133, -27193, +-27253, -27312, -27372, -27430, -27489, +-27547, -27605, -27663, -27720, -27777, +-27834, -27890, -27946, -28002, -28058, +-28113, -28168, -28223, -28277, -28331, +-28385, -28438, -28491, -28544, -28596, +-28649, -28701, -28752, -28803, -28854, +-28905, -28955, -29006, -29055, -29105, +-29154, -29203, -29251, -29299, -29347, +-29395, -29442, -29489, -29535, -29582, +-29628, -29673, -29719, -29764, -29808, +-29853, -29897, -29941, -29984, -30027, +-30070, -30112, -30154, -30196, -30238, +-30279, -30320, -30360, -30400, -30440, +-30480, -30519, -30558, -30596, -30635, +-30672, -30710, -30747, -30784, -30821, +-30857, -30893, -30929, -30964, -30999, +-31033, -31068, -31102, -31135, -31168, +-31201, -31234, -31266, -31298, -31330, +-31361, -31392, -31422, -31453, -31483, +-31512, -31541, -31570, -31599, -31627, +-31655, -31682, -31710, -31737, -31763, +-31789, -31815, -31841, -31866, -31891, +-31915, -31939, -31963, -31986, -32010, +-32032, -32055, -32077, -32099, -32120, +-32141, -32162, -32182, -32202, -32222, +-32241, -32260, -32279, -32297, -32315, +-32333, -32350, -32367, -32383, -32399, +-32415, -32431, -32446, -32461, -32475, +-32489, -32503, -32517, -32530, -32542, +-32555, -32567, -32579, -32590, -32601, +-32612, -32622, -32632, -32641, -32651, +-32659, -32668, -32676, -32684, -32692, +-32699, -32706, -32712, -32718, -32724, +-32729, -32734, -32739, -32743, -32747, +-32751, -32754, -32757, -32760, -32762, +-32764, -32765, -32767, -32767, -32767, +32767, 32767, 32765, 32761, 32756, +32750, 32742, 32732, 32722, 32710, +32696, 32681, 32665, 32647, 32628, +32608, 32586, 32562, 32538, 32512, +32484, 32455, 32425, 32393, 32360, +32326, 32290, 32253, 32214, 32174, +32133, 32090, 32046, 32001, 31954, +31906, 31856, 31805, 31753, 31700, +31645, 31588, 31530, 31471, 31411, +31349, 31286, 31222, 31156, 31089, +31020, 30951, 30880, 30807, 30733, +30658, 30582, 30504, 30425, 30345, +30263, 30181, 30096, 30011, 29924, +29836, 29747, 29656, 29564, 29471, +29377, 29281, 29184, 29086, 28987, +28886, 28784, 28681, 28577, 28471, +28365, 28257, 28147, 28037, 27925, +27812, 27698, 27583, 27467, 27349, +27231, 27111, 26990, 26868, 26744, +26620, 26494, 26367, 26239, 26110, +25980, 25849, 25717, 25583, 25449, +25313, 25176, 25038, 24900, 24760, +24619, 24477, 24333, 24189, 24044, +23898, 23751, 23602, 23453, 23303, +23152, 22999, 22846, 22692, 22537, +22380, 22223, 22065, 21906, 21746, +21585, 21423, 21261, 21097, 20933, +20767, 20601, 20434, 20265, 20096, +19927, 19756, 19584, 19412, 19239, +19065, 18890, 18714, 18538, 18361, +18183, 18004, 17824, 17644, 17463, +17281, 17098, 16915, 16731, 16546, +16361, 16175, 15988, 15800, 15612, +15423, 15234, 15043, 14852, 14661, +14469, 14276, 14083, 13889, 13694, +13499, 13303, 13107, 12910, 12713, +12515, 12317, 12118, 11918, 11718, +11517, 11316, 11115, 10913, 10710, +10508, 10304, 10100, 9896, 9691, +9486, 9281, 9075, 8869, 8662, +8455, 8248, 8040, 7832, 7623, +7415, 7206, 6996, 6787, 6577, +6366, 6156, 5945, 5734, 5523, +5311, 5100, 4888, 4675, 4463, +4251, 4038, 3825, 3612, 3399, +3185, 2972, 2758, 2544, 2330, +2116, 1902, 1688, 1474, 1260, +1045, 831, 617, 402, 188, +-27, -241, -456, -670, -885, +-1099, -1313, -1528, -1742, -1956, +-2170, -2384, -2598, -2811, -3025, +-3239, -3452, -3665, -3878, -4091, +-4304, -4516, -4728, -4941, -5153, +-5364, -5576, -5787, -5998, -6209, +-6419, -6629, -6839, -7049, -7258, +-7467, -7676, -7884, -8092, -8300, +-8507, -8714, -8920, -9127, -9332, +-9538, -9743, -9947, -10151, -10355, +-10558, -10761, -10963, -11165, -11367, +-11568, -11768, -11968, -12167, -12366, +-12565, -12762, -12960, -13156, -13352, +-13548, -13743, -13937, -14131, -14324, +-14517, -14709, -14900, -15091, -15281, +-15470, -15659, -15847, -16035, -16221, +-16407, -16593, -16777, -16961, -17144, +-17326, -17508, -17689, -17869, -18049, +-18227, -18405, -18582, -18758, -18934, +-19108, -19282, -19455, -19627, -19799, +-19969, -20139, -20308, -20475, -20642, +-20809, -20974, -21138, -21301, -21464, +-21626, -21786, -21946, -22105, -22263, +-22420, -22575, -22730, -22884, -23037, +-23189, -23340, -23490, -23640, -23788, +-23935, -24080, -24225, -24369, -24512, +-24654, -24795, -24934, -25073, -25211, +-25347, -25482, -25617, -25750, -25882, +-26013, -26143, -26272, -26399, -26526, +-26651, -26775, -26898, -27020, -27141, +-27260, -27379, -27496, -27612, -27727, +-27841, -27953, -28065, -28175, -28284, +-28391, -28498, -28603, -28707, -28810, +-28911, -29012, -29111, -29209, -29305, +-29401, -29495, -29587, -29679, -29769, +-29858, -29946, -30032, -30118, -30201, +-30284, -30365, -30445, -30524, -30601, +-30677, -30752, -30825, -30897, -30968, +-31038, -31106, -31172, -31238, -31302, +-31365, -31426, -31486, -31545, -31602, +-31658, -31713, -31766, -31818, -31869, +-31918, -31966, -32012, -32058, -32101, +-32144, -32185, -32224, -32262, -32299, +-32335, -32369, -32401, -32433, -32463, +-32491, -32518, -32544, -32568, -32591, +-32613, -32633, -32652, -32669, -32685, +-32700, -32713, -32724, -32735, -32744, +-32751, -32757, -32762, -32766, -32767, +32767, 32764, 32755, 32741, 32720, +32694, 32663, 32626, 32583, 32535, +32481, 32421, 32356, 32286, 32209, +32128, 32041, 31948, 31850, 31747, +31638, 31523, 31403, 31278, 31148, +31012, 30871, 30724, 30572, 30415, +30253, 30086, 29913, 29736, 29553, +29365, 29172, 28974, 28771, 28564, +28351, 28134, 27911, 27684, 27452, +27216, 26975, 26729, 26478, 26223, +25964, 25700, 25432, 25159, 24882, +24601, 24315, 24026, 23732, 23434, +23133, 22827, 22517, 22204, 21886, +21565, 21240, 20912, 20580, 20244, +19905, 19563, 19217, 18868, 18516, +18160, 17802, 17440, 17075, 16708, +16338, 15964, 15588, 15210, 14829, +14445, 14059, 13670, 13279, 12886, +12490, 12093, 11693, 11291, 10888, +10482, 10075, 9666, 9255, 8843, +8429, 8014, 7597, 7180, 6760, +6340, 5919, 5496, 5073, 4649, +4224, 3798, 3372, 2945, 2517, +2090, 1661, 1233, 804, 375, +-54, -483, -911, -1340, -1768, +-2197, -2624, -3052, -3479, -3905, +-4330, -4755, -5179, -5602, -6024, +-6445, -6865, -7284, -7702, -8118, +-8533, -8946, -9358, -9768, -10177, +-10584, -10989, -11392, -11793, -12192, +-12589, -12984, -13377, -13767, -14155, +-14541, -14924, -15305, -15683, -16058, +-16430, -16800, -17167, -17531, -17892, +-18249, -18604, -18956, -19304, -19649, +-19990, -20329, -20663, -20994, -21322, +-21646, -21966, -22282, -22595, -22904, +-23208, -23509, -23806, -24099, -24387, +-24672, -24952, -25228, -25499, -25766, +-26029, -26288, -26541, -26791, -27035, +-27275, -27511, -27741, -27967, -28188, +-28405, -28616, -28823, -29024, -29221, +-29412, -29599, -29780, -29957, -30128, +-30294, -30455, -30611, -30761, -30906, +-31046, -31181, -31310, -31434, -31552, +-31665, -31773, -31875, -31972, -32063, +-32149, -32229, -32304, -32373, -32437, +-32495, -32547, -32594, -32635, -32671, +-32701, -32726, -32745, -32758, -32766, +32767, 32754, 32717, 32658, 32577, +32473, 32348, 32200, 32029, 31837, +31624, 31388, 31131, 30853, 30553, +30232, 29891, 29530, 29148, 28746, +28324, 27883, 27423, 26944, 26447, +25931, 25398, 24847, 24279, 23695, +23095, 22478, 21846, 21199, 20538, +19863, 19174, 18472, 17757, 17030, +16291, 15541, 14781, 14010, 13230, +12441, 11643, 10837, 10024, 9204, +8377, 7545, 6708, 5866, 5020, +4171, 3319, 2464, 1608, 751, +-107, -965, -1822, -2678, -3532, +-4383, -5232, -6077, -6918, -7754, +-8585, -9409, -10228, -11039, -11843, +-12639, -13426, -14204, -14972, -15730, +-16477, -17213, -17937, -18648, -19347, +-20033, -20705, -21363, -22006, -22634, +-23246, -23843, -24423, -24986, -25533, +-26062, -26573, -27066, -27540, -27995, +-28431, -28848, -29245, -29622, -29979, +-30315, -30630, -30924, -31197, -31449, +-31679, -31887, -32074, -32239, -32381, +-32501, -32600, -32675, -32729, -32759, +}; +#endif + +static const CELTMode mode48000_960_120 = { +48000, /* Fs */ +120, /* overlap */ +21, /* nbEBands */ +21, /* effEBands */ +{27853, 0, 4096, 8192, }, /* preemph */ +eband5ms, /* eBands */ +3, /* maxLM */ +8, /* nbShortMdcts */ +120, /* shortMdctSize */ +11, /* nbAllocVectors */ +band_allocation, /* allocVectors */ +logN400, /* logN */ +window120, /* window */ +{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ +{392, cache_index50, cache_bits50, cache_caps50}, /* cache */ +}; + +/* List of all the available modes */ +#define TOTAL_MODES 1 +static const CELTMode * const static_mode_list[TOTAL_MODES] = { +&mode48000_960_120, +}; diff --git a/src/libopus/celt/static_modes_float.h b/src/libopus/celt/static_modes_float.h new file mode 100644 index 00000000..e102a383 --- /dev/null +++ b/src/libopus/celt/static_modes_float.h @@ -0,0 +1,888 @@ +/* The contents of this file was automatically generated by dump_modes.c + with arguments: 48000 960 + It contains static definitions for some pre-defined modes. */ +#include "modes.h" +#include "rate.h" + +#ifdef HAVE_ARM_NE10 +#define OVERRIDE_FFT 1 +#include "static_modes_float_arm_ne10.h" +#endif + +#ifndef DEF_WINDOW120 +#define DEF_WINDOW120 +static const opus_val16 window120[120] = { +6.7286966e-05f, 0.00060551348f, 0.0016815970f, 0.0032947962f, 0.0054439943f, +0.0081276923f, 0.011344001f, 0.015090633f, 0.019364886f, 0.024163635f, +0.029483315f, 0.035319905f, 0.041668911f, 0.048525347f, 0.055883718f, +0.063737999f, 0.072081616f, 0.080907428f, 0.090207705f, 0.099974111f, +0.11019769f, 0.12086883f, 0.13197729f, 0.14351214f, 0.15546177f, +0.16781389f, 0.18055550f, 0.19367290f, 0.20715171f, 0.22097682f, +0.23513243f, 0.24960208f, 0.26436860f, 0.27941419f, 0.29472040f, +0.31026818f, 0.32603788f, 0.34200931f, 0.35816177f, 0.37447407f, +0.39092462f, 0.40749142f, 0.42415215f, 0.44088423f, 0.45766484f, +0.47447104f, 0.49127978f, 0.50806798f, 0.52481261f, 0.54149077f, +0.55807973f, 0.57455701f, 0.59090049f, 0.60708841f, 0.62309951f, +0.63891306f, 0.65450896f, 0.66986776f, 0.68497077f, 0.69980010f, +0.71433873f, 0.72857055f, 0.74248043f, 0.75605424f, 0.76927895f, +0.78214257f, 0.79463430f, 0.80674445f, 0.81846456f, 0.82978733f, +0.84070669f, 0.85121779f, 0.86131698f, 0.87100183f, 0.88027111f, +0.88912479f, 0.89756398f, 0.90559094f, 0.91320904f, 0.92042270f, +0.92723738f, 0.93365955f, 0.93969656f, 0.94535671f, 0.95064907f, +0.95558353f, 0.96017067f, 0.96442171f, 0.96834849f, 0.97196334f, +0.97527906f, 0.97830883f, 0.98106616f, 0.98356480f, 0.98581869f, +0.98784191f, 0.98964856f, 0.99125274f, 0.99266849f, 0.99390969f, +0.99499004f, 0.99592297f, 0.99672162f, 0.99739874f, 0.99796667f, +0.99843728f, 0.99882195f, 0.99913147f, 0.99937606f, 0.99956527f, +0.99970802f, 0.99981248f, 0.99988613f, 0.99993565f, 0.99996697f, +0.99998518f, 0.99999457f, 0.99999859f, 0.99999982f, 1.0000000f, +}; +#endif + +#ifndef DEF_LOGN400 +#define DEF_LOGN400 +static const opus_int16 logN400[21] = { +0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; +#endif + +#ifndef DEF_PULSE_CACHE50 +#define DEF_PULSE_CACHE50 +static const opus_int16 cache_index50[105] = { +-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, +82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, +41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, +41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, +318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, +305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, +240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, +}; +static const unsigned char cache_bits50[392] = { +40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, +31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, +51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, +66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, +64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, +94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, +124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, +97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, +142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, +28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, +153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, +229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, +166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, +86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, +25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, +185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, +110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, +74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, +163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, +228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, +90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, +87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, +106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, +224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, +182, 234, }; +static const unsigned char cache_caps50[168] = { +224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, +178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, +240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, +160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, +138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, +204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, +185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, +207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, +188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, +204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, +140, 66, 40, }; +#endif + +#ifndef FFT_TWIDDLES48000_960 +#define FFT_TWIDDLES48000_960 +static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { +{1.0000000f, -0.0000000f}, {0.99991433f, -0.013089596f}, +{0.99965732f, -0.026176948f}, {0.99922904f, -0.039259816f}, +{0.99862953f, -0.052335956f}, {0.99785892f, -0.065403129f}, +{0.99691733f, -0.078459096f}, {0.99580493f, -0.091501619f}, +{0.99452190f, -0.10452846f}, {0.99306846f, -0.11753740f}, +{0.99144486f, -0.13052619f}, {0.98965139f, -0.14349262f}, +{0.98768834f, -0.15643447f}, {0.98555606f, -0.16934950f}, +{0.98325491f, -0.18223553f}, {0.98078528f, -0.19509032f}, +{0.97814760f, -0.20791169f}, {0.97534232f, -0.22069744f}, +{0.97236992f, -0.23344536f}, {0.96923091f, -0.24615329f}, +{0.96592583f, -0.25881905f}, {0.96245524f, -0.27144045f}, +{0.95881973f, -0.28401534f}, {0.95501994f, -0.29654157f}, +{0.95105652f, -0.30901699f}, {0.94693013f, -0.32143947f}, +{0.94264149f, -0.33380686f}, {0.93819134f, -0.34611706f}, +{0.93358043f, -0.35836795f}, {0.92880955f, -0.37055744f}, +{0.92387953f, -0.38268343f}, {0.91879121f, -0.39474386f}, +{0.91354546f, -0.40673664f}, {0.90814317f, -0.41865974f}, +{0.90258528f, -0.43051110f}, {0.89687274f, -0.44228869f}, +{0.89100652f, -0.45399050f}, {0.88498764f, -0.46561452f}, +{0.87881711f, -0.47715876f}, {0.87249601f, -0.48862124f}, +{0.86602540f, -0.50000000f}, {0.85940641f, -0.51129309f}, +{0.85264016f, -0.52249856f}, {0.84572782f, -0.53361452f}, +{0.83867057f, -0.54463904f}, {0.83146961f, -0.55557023f}, +{0.82412619f, -0.56640624f}, {0.81664156f, -0.57714519f}, +{0.80901699f, -0.58778525f}, {0.80125381f, -0.59832460f}, +{0.79335334f, -0.60876143f}, {0.78531693f, -0.61909395f}, +{0.77714596f, -0.62932039f}, {0.76884183f, -0.63943900f}, +{0.76040597f, -0.64944805f}, {0.75183981f, -0.65934582f}, +{0.74314483f, -0.66913061f}, {0.73432251f, -0.67880075f}, +{0.72537437f, -0.68835458f}, {0.71630194f, -0.69779046f}, +{0.70710678f, -0.70710678f}, {0.69779046f, -0.71630194f}, +{0.68835458f, -0.72537437f}, {0.67880075f, -0.73432251f}, +{0.66913061f, -0.74314483f}, {0.65934582f, -0.75183981f}, +{0.64944805f, -0.76040597f}, {0.63943900f, -0.76884183f}, +{0.62932039f, -0.77714596f}, {0.61909395f, -0.78531693f}, +{0.60876143f, -0.79335334f}, {0.59832460f, -0.80125381f}, +{0.58778525f, -0.80901699f}, {0.57714519f, -0.81664156f}, +{0.56640624f, -0.82412619f}, {0.55557023f, -0.83146961f}, +{0.54463904f, -0.83867057f}, {0.53361452f, -0.84572782f}, +{0.52249856f, -0.85264016f}, {0.51129309f, -0.85940641f}, +{0.50000000f, -0.86602540f}, {0.48862124f, -0.87249601f}, +{0.47715876f, -0.87881711f}, {0.46561452f, -0.88498764f}, +{0.45399050f, -0.89100652f}, {0.44228869f, -0.89687274f}, +{0.43051110f, -0.90258528f}, {0.41865974f, -0.90814317f}, +{0.40673664f, -0.91354546f}, {0.39474386f, -0.91879121f}, +{0.38268343f, -0.92387953f}, {0.37055744f, -0.92880955f}, +{0.35836795f, -0.93358043f}, {0.34611706f, -0.93819134f}, +{0.33380686f, -0.94264149f}, {0.32143947f, -0.94693013f}, +{0.30901699f, -0.95105652f}, {0.29654157f, -0.95501994f}, +{0.28401534f, -0.95881973f}, {0.27144045f, -0.96245524f}, +{0.25881905f, -0.96592583f}, {0.24615329f, -0.96923091f}, +{0.23344536f, -0.97236992f}, {0.22069744f, -0.97534232f}, +{0.20791169f, -0.97814760f}, {0.19509032f, -0.98078528f}, +{0.18223553f, -0.98325491f}, {0.16934950f, -0.98555606f}, +{0.15643447f, -0.98768834f}, {0.14349262f, -0.98965139f}, +{0.13052619f, -0.99144486f}, {0.11753740f, -0.99306846f}, +{0.10452846f, -0.99452190f}, {0.091501619f, -0.99580493f}, +{0.078459096f, -0.99691733f}, {0.065403129f, -0.99785892f}, +{0.052335956f, -0.99862953f}, {0.039259816f, -0.99922904f}, +{0.026176948f, -0.99965732f}, {0.013089596f, -0.99991433f}, +{6.1230318e-17f, -1.0000000f}, {-0.013089596f, -0.99991433f}, +{-0.026176948f, -0.99965732f}, {-0.039259816f, -0.99922904f}, +{-0.052335956f, -0.99862953f}, {-0.065403129f, -0.99785892f}, +{-0.078459096f, -0.99691733f}, {-0.091501619f, -0.99580493f}, +{-0.10452846f, -0.99452190f}, {-0.11753740f, -0.99306846f}, +{-0.13052619f, -0.99144486f}, {-0.14349262f, -0.98965139f}, +{-0.15643447f, -0.98768834f}, {-0.16934950f, -0.98555606f}, +{-0.18223553f, -0.98325491f}, {-0.19509032f, -0.98078528f}, +{-0.20791169f, -0.97814760f}, {-0.22069744f, -0.97534232f}, +{-0.23344536f, -0.97236992f}, {-0.24615329f, -0.96923091f}, +{-0.25881905f, -0.96592583f}, {-0.27144045f, -0.96245524f}, +{-0.28401534f, -0.95881973f}, {-0.29654157f, -0.95501994f}, +{-0.30901699f, -0.95105652f}, {-0.32143947f, -0.94693013f}, +{-0.33380686f, -0.94264149f}, {-0.34611706f, -0.93819134f}, +{-0.35836795f, -0.93358043f}, {-0.37055744f, -0.92880955f}, +{-0.38268343f, -0.92387953f}, {-0.39474386f, -0.91879121f}, +{-0.40673664f, -0.91354546f}, {-0.41865974f, -0.90814317f}, +{-0.43051110f, -0.90258528f}, {-0.44228869f, -0.89687274f}, +{-0.45399050f, -0.89100652f}, {-0.46561452f, -0.88498764f}, +{-0.47715876f, -0.87881711f}, {-0.48862124f, -0.87249601f}, +{-0.50000000f, -0.86602540f}, {-0.51129309f, -0.85940641f}, +{-0.52249856f, -0.85264016f}, {-0.53361452f, -0.84572782f}, +{-0.54463904f, -0.83867057f}, {-0.55557023f, -0.83146961f}, +{-0.56640624f, -0.82412619f}, {-0.57714519f, -0.81664156f}, +{-0.58778525f, -0.80901699f}, {-0.59832460f, -0.80125381f}, +{-0.60876143f, -0.79335334f}, {-0.61909395f, -0.78531693f}, +{-0.62932039f, -0.77714596f}, {-0.63943900f, -0.76884183f}, +{-0.64944805f, -0.76040597f}, {-0.65934582f, -0.75183981f}, +{-0.66913061f, -0.74314483f}, {-0.67880075f, -0.73432251f}, +{-0.68835458f, -0.72537437f}, {-0.69779046f, -0.71630194f}, +{-0.70710678f, -0.70710678f}, {-0.71630194f, -0.69779046f}, +{-0.72537437f, -0.68835458f}, {-0.73432251f, -0.67880075f}, +{-0.74314483f, -0.66913061f}, {-0.75183981f, -0.65934582f}, +{-0.76040597f, -0.64944805f}, {-0.76884183f, -0.63943900f}, +{-0.77714596f, -0.62932039f}, {-0.78531693f, -0.61909395f}, +{-0.79335334f, -0.60876143f}, {-0.80125381f, -0.59832460f}, +{-0.80901699f, -0.58778525f}, {-0.81664156f, -0.57714519f}, +{-0.82412619f, -0.56640624f}, {-0.83146961f, -0.55557023f}, +{-0.83867057f, -0.54463904f}, {-0.84572782f, -0.53361452f}, +{-0.85264016f, -0.52249856f}, {-0.85940641f, -0.51129309f}, +{-0.86602540f, -0.50000000f}, {-0.87249601f, -0.48862124f}, +{-0.87881711f, -0.47715876f}, {-0.88498764f, -0.46561452f}, +{-0.89100652f, -0.45399050f}, {-0.89687274f, -0.44228869f}, +{-0.90258528f, -0.43051110f}, {-0.90814317f, -0.41865974f}, +{-0.91354546f, -0.40673664f}, {-0.91879121f, -0.39474386f}, +{-0.92387953f, -0.38268343f}, {-0.92880955f, -0.37055744f}, +{-0.93358043f, -0.35836795f}, {-0.93819134f, -0.34611706f}, +{-0.94264149f, -0.33380686f}, {-0.94693013f, -0.32143947f}, +{-0.95105652f, -0.30901699f}, {-0.95501994f, -0.29654157f}, +{-0.95881973f, -0.28401534f}, {-0.96245524f, -0.27144045f}, +{-0.96592583f, -0.25881905f}, {-0.96923091f, -0.24615329f}, +{-0.97236992f, -0.23344536f}, {-0.97534232f, -0.22069744f}, +{-0.97814760f, -0.20791169f}, {-0.98078528f, -0.19509032f}, +{-0.98325491f, -0.18223553f}, {-0.98555606f, -0.16934950f}, +{-0.98768834f, -0.15643447f}, {-0.98965139f, -0.14349262f}, +{-0.99144486f, -0.13052619f}, {-0.99306846f, -0.11753740f}, +{-0.99452190f, -0.10452846f}, {-0.99580493f, -0.091501619f}, +{-0.99691733f, -0.078459096f}, {-0.99785892f, -0.065403129f}, +{-0.99862953f, -0.052335956f}, {-0.99922904f, -0.039259816f}, +{-0.99965732f, -0.026176948f}, {-0.99991433f, -0.013089596f}, +{-1.0000000f, -1.2246064e-16f}, {-0.99991433f, 0.013089596f}, +{-0.99965732f, 0.026176948f}, {-0.99922904f, 0.039259816f}, +{-0.99862953f, 0.052335956f}, {-0.99785892f, 0.065403129f}, +{-0.99691733f, 0.078459096f}, {-0.99580493f, 0.091501619f}, +{-0.99452190f, 0.10452846f}, {-0.99306846f, 0.11753740f}, +{-0.99144486f, 0.13052619f}, {-0.98965139f, 0.14349262f}, +{-0.98768834f, 0.15643447f}, {-0.98555606f, 0.16934950f}, +{-0.98325491f, 0.18223553f}, {-0.98078528f, 0.19509032f}, +{-0.97814760f, 0.20791169f}, {-0.97534232f, 0.22069744f}, +{-0.97236992f, 0.23344536f}, {-0.96923091f, 0.24615329f}, +{-0.96592583f, 0.25881905f}, {-0.96245524f, 0.27144045f}, +{-0.95881973f, 0.28401534f}, {-0.95501994f, 0.29654157f}, +{-0.95105652f, 0.30901699f}, {-0.94693013f, 0.32143947f}, +{-0.94264149f, 0.33380686f}, {-0.93819134f, 0.34611706f}, +{-0.93358043f, 0.35836795f}, {-0.92880955f, 0.37055744f}, +{-0.92387953f, 0.38268343f}, {-0.91879121f, 0.39474386f}, +{-0.91354546f, 0.40673664f}, {-0.90814317f, 0.41865974f}, +{-0.90258528f, 0.43051110f}, {-0.89687274f, 0.44228869f}, +{-0.89100652f, 0.45399050f}, {-0.88498764f, 0.46561452f}, +{-0.87881711f, 0.47715876f}, {-0.87249601f, 0.48862124f}, +{-0.86602540f, 0.50000000f}, {-0.85940641f, 0.51129309f}, +{-0.85264016f, 0.52249856f}, {-0.84572782f, 0.53361452f}, +{-0.83867057f, 0.54463904f}, {-0.83146961f, 0.55557023f}, +{-0.82412619f, 0.56640624f}, {-0.81664156f, 0.57714519f}, +{-0.80901699f, 0.58778525f}, {-0.80125381f, 0.59832460f}, +{-0.79335334f, 0.60876143f}, {-0.78531693f, 0.61909395f}, +{-0.77714596f, 0.62932039f}, {-0.76884183f, 0.63943900f}, +{-0.76040597f, 0.64944805f}, {-0.75183981f, 0.65934582f}, +{-0.74314483f, 0.66913061f}, {-0.73432251f, 0.67880075f}, +{-0.72537437f, 0.68835458f}, {-0.71630194f, 0.69779046f}, +{-0.70710678f, 0.70710678f}, {-0.69779046f, 0.71630194f}, +{-0.68835458f, 0.72537437f}, {-0.67880075f, 0.73432251f}, +{-0.66913061f, 0.74314483f}, {-0.65934582f, 0.75183981f}, +{-0.64944805f, 0.76040597f}, {-0.63943900f, 0.76884183f}, +{-0.62932039f, 0.77714596f}, {-0.61909395f, 0.78531693f}, +{-0.60876143f, 0.79335334f}, {-0.59832460f, 0.80125381f}, +{-0.58778525f, 0.80901699f}, {-0.57714519f, 0.81664156f}, +{-0.56640624f, 0.82412619f}, {-0.55557023f, 0.83146961f}, +{-0.54463904f, 0.83867057f}, {-0.53361452f, 0.84572782f}, +{-0.52249856f, 0.85264016f}, {-0.51129309f, 0.85940641f}, +{-0.50000000f, 0.86602540f}, {-0.48862124f, 0.87249601f}, +{-0.47715876f, 0.87881711f}, {-0.46561452f, 0.88498764f}, +{-0.45399050f, 0.89100652f}, {-0.44228869f, 0.89687274f}, +{-0.43051110f, 0.90258528f}, {-0.41865974f, 0.90814317f}, +{-0.40673664f, 0.91354546f}, {-0.39474386f, 0.91879121f}, +{-0.38268343f, 0.92387953f}, {-0.37055744f, 0.92880955f}, +{-0.35836795f, 0.93358043f}, {-0.34611706f, 0.93819134f}, +{-0.33380686f, 0.94264149f}, {-0.32143947f, 0.94693013f}, +{-0.30901699f, 0.95105652f}, {-0.29654157f, 0.95501994f}, +{-0.28401534f, 0.95881973f}, {-0.27144045f, 0.96245524f}, +{-0.25881905f, 0.96592583f}, {-0.24615329f, 0.96923091f}, +{-0.23344536f, 0.97236992f}, {-0.22069744f, 0.97534232f}, +{-0.20791169f, 0.97814760f}, {-0.19509032f, 0.98078528f}, +{-0.18223553f, 0.98325491f}, {-0.16934950f, 0.98555606f}, +{-0.15643447f, 0.98768834f}, {-0.14349262f, 0.98965139f}, +{-0.13052619f, 0.99144486f}, {-0.11753740f, 0.99306846f}, +{-0.10452846f, 0.99452190f}, {-0.091501619f, 0.99580493f}, +{-0.078459096f, 0.99691733f}, {-0.065403129f, 0.99785892f}, +{-0.052335956f, 0.99862953f}, {-0.039259816f, 0.99922904f}, +{-0.026176948f, 0.99965732f}, {-0.013089596f, 0.99991433f}, +{-1.8369095e-16f, 1.0000000f}, {0.013089596f, 0.99991433f}, +{0.026176948f, 0.99965732f}, {0.039259816f, 0.99922904f}, +{0.052335956f, 0.99862953f}, {0.065403129f, 0.99785892f}, +{0.078459096f, 0.99691733f}, {0.091501619f, 0.99580493f}, +{0.10452846f, 0.99452190f}, {0.11753740f, 0.99306846f}, +{0.13052619f, 0.99144486f}, {0.14349262f, 0.98965139f}, +{0.15643447f, 0.98768834f}, {0.16934950f, 0.98555606f}, +{0.18223553f, 0.98325491f}, {0.19509032f, 0.98078528f}, +{0.20791169f, 0.97814760f}, {0.22069744f, 0.97534232f}, +{0.23344536f, 0.97236992f}, {0.24615329f, 0.96923091f}, +{0.25881905f, 0.96592583f}, {0.27144045f, 0.96245524f}, +{0.28401534f, 0.95881973f}, {0.29654157f, 0.95501994f}, +{0.30901699f, 0.95105652f}, {0.32143947f, 0.94693013f}, +{0.33380686f, 0.94264149f}, {0.34611706f, 0.93819134f}, +{0.35836795f, 0.93358043f}, {0.37055744f, 0.92880955f}, +{0.38268343f, 0.92387953f}, {0.39474386f, 0.91879121f}, +{0.40673664f, 0.91354546f}, {0.41865974f, 0.90814317f}, +{0.43051110f, 0.90258528f}, {0.44228869f, 0.89687274f}, +{0.45399050f, 0.89100652f}, {0.46561452f, 0.88498764f}, +{0.47715876f, 0.87881711f}, {0.48862124f, 0.87249601f}, +{0.50000000f, 0.86602540f}, {0.51129309f, 0.85940641f}, +{0.52249856f, 0.85264016f}, {0.53361452f, 0.84572782f}, +{0.54463904f, 0.83867057f}, {0.55557023f, 0.83146961f}, +{0.56640624f, 0.82412619f}, {0.57714519f, 0.81664156f}, +{0.58778525f, 0.80901699f}, {0.59832460f, 0.80125381f}, +{0.60876143f, 0.79335334f}, {0.61909395f, 0.78531693f}, +{0.62932039f, 0.77714596f}, {0.63943900f, 0.76884183f}, +{0.64944805f, 0.76040597f}, {0.65934582f, 0.75183981f}, +{0.66913061f, 0.74314483f}, {0.67880075f, 0.73432251f}, +{0.68835458f, 0.72537437f}, {0.69779046f, 0.71630194f}, +{0.70710678f, 0.70710678f}, {0.71630194f, 0.69779046f}, +{0.72537437f, 0.68835458f}, {0.73432251f, 0.67880075f}, +{0.74314483f, 0.66913061f}, {0.75183981f, 0.65934582f}, +{0.76040597f, 0.64944805f}, {0.76884183f, 0.63943900f}, +{0.77714596f, 0.62932039f}, {0.78531693f, 0.61909395f}, +{0.79335334f, 0.60876143f}, {0.80125381f, 0.59832460f}, +{0.80901699f, 0.58778525f}, {0.81664156f, 0.57714519f}, +{0.82412619f, 0.56640624f}, {0.83146961f, 0.55557023f}, +{0.83867057f, 0.54463904f}, {0.84572782f, 0.53361452f}, +{0.85264016f, 0.52249856f}, {0.85940641f, 0.51129309f}, +{0.86602540f, 0.50000000f}, {0.87249601f, 0.48862124f}, +{0.87881711f, 0.47715876f}, {0.88498764f, 0.46561452f}, +{0.89100652f, 0.45399050f}, {0.89687274f, 0.44228869f}, +{0.90258528f, 0.43051110f}, {0.90814317f, 0.41865974f}, +{0.91354546f, 0.40673664f}, {0.91879121f, 0.39474386f}, +{0.92387953f, 0.38268343f}, {0.92880955f, 0.37055744f}, +{0.93358043f, 0.35836795f}, {0.93819134f, 0.34611706f}, +{0.94264149f, 0.33380686f}, {0.94693013f, 0.32143947f}, +{0.95105652f, 0.30901699f}, {0.95501994f, 0.29654157f}, +{0.95881973f, 0.28401534f}, {0.96245524f, 0.27144045f}, +{0.96592583f, 0.25881905f}, {0.96923091f, 0.24615329f}, +{0.97236992f, 0.23344536f}, {0.97534232f, 0.22069744f}, +{0.97814760f, 0.20791169f}, {0.98078528f, 0.19509032f}, +{0.98325491f, 0.18223553f}, {0.98555606f, 0.16934950f}, +{0.98768834f, 0.15643447f}, {0.98965139f, 0.14349262f}, +{0.99144486f, 0.13052619f}, {0.99306846f, 0.11753740f}, +{0.99452190f, 0.10452846f}, {0.99580493f, 0.091501619f}, +{0.99691733f, 0.078459096f}, {0.99785892f, 0.065403129f}, +{0.99862953f, 0.052335956f}, {0.99922904f, 0.039259816f}, +{0.99965732f, 0.026176948f}, {0.99991433f, 0.013089596f}, +}; +#ifndef FFT_BITREV480 +#define FFT_BITREV480 +static const opus_int16 fft_bitrev480[480] = { +0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, +8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, +16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, +24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, +4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, +12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, +20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, +28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, +1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, +9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, +17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, +25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, +5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, +13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, +21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, +29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, +2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, +10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, +18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, +26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, +6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, +14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, +22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, +30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, +3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, +11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, +19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, +27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, +7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, +15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, +23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, +31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, +}; +#endif + +#ifndef FFT_BITREV240 +#define FFT_BITREV240 +static const opus_int16 fft_bitrev240[240] = { +0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, +4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, +8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, +12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, +1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, +5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, +9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, +13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, +2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, +6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, +10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, +14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, +3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, +7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, +11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, +15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, +}; +#endif + +#ifndef FFT_BITREV120 +#define FFT_BITREV120 +static const opus_int16 fft_bitrev120[120] = { +0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, +4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, +1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, +5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, +2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, +6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, +3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, +7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, +}; +#endif + +#ifndef FFT_BITREV60 +#define FFT_BITREV60 +static const opus_int16 fft_bitrev60[60] = { +0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, +1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, +2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, +3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, +}; +#endif + +#ifndef FFT_STATE48000_960_0 +#define FFT_STATE48000_960_0 +static const kiss_fft_state fft_state48000_960_0 = { +480, /* nfft */ +0.002083333f, /* scale */ +-1, /* shift */ +{5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev480, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_480, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_1 +#define FFT_STATE48000_960_1 +static const kiss_fft_state fft_state48000_960_1 = { +240, /* nfft */ +0.004166667f, /* scale */ +1, /* shift */ +{5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev240, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_240, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_2 +#define FFT_STATE48000_960_2 +static const kiss_fft_state fft_state48000_960_2 = { +120, /* nfft */ +0.008333333f, /* scale */ +2, /* shift */ +{5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev120, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_120, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_3 +#define FFT_STATE48000_960_3 +static const kiss_fft_state fft_state48000_960_3 = { +60, /* nfft */ +0.016666667f, /* scale */ +3, /* shift */ +{5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev60, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_60, +#else +NULL, +#endif +}; +#endif + +#endif + +#ifndef MDCT_TWIDDLES960 +#define MDCT_TWIDDLES960 +static const opus_val16 mdct_twiddles960[1800] = { +0.99999994f, 0.99999321f, 0.99997580f, 0.99994773f, 0.99990886f, +0.99985933f, 0.99979913f, 0.99972820f, 0.99964654f, 0.99955416f, +0.99945110f, 0.99933738f, 0.99921292f, 0.99907774f, 0.99893188f, +0.99877530f, 0.99860805f, 0.99843007f, 0.99824142f, 0.99804211f, +0.99783206f, 0.99761140f, 0.99737996f, 0.99713790f, 0.99688518f, +0.99662173f, 0.99634761f, 0.99606287f, 0.99576741f, 0.99546129f, +0.99514455f, 0.99481714f, 0.99447906f, 0.99413031f, 0.99377096f, +0.99340093f, 0.99302030f, 0.99262899f, 0.99222708f, 0.99181455f, +0.99139136f, 0.99095762f, 0.99051321f, 0.99005818f, 0.98959261f, +0.98911643f, 0.98862964f, 0.98813224f, 0.98762429f, 0.98710573f, +0.98657662f, 0.98603696f, 0.98548669f, 0.98492593f, 0.98435456f, +0.98377270f, 0.98318028f, 0.98257732f, 0.98196387f, 0.98133987f, +0.98070538f, 0.98006040f, 0.97940493f, 0.97873890f, 0.97806245f, +0.97737551f, 0.97667813f, 0.97597027f, 0.97525197f, 0.97452319f, +0.97378403f, 0.97303438f, 0.97227436f, 0.97150391f, 0.97072303f, +0.96993178f, 0.96913016f, 0.96831810f, 0.96749574f, 0.96666300f, +0.96581990f, 0.96496642f, 0.96410263f, 0.96322852f, 0.96234411f, +0.96144938f, 0.96054435f, 0.95962906f, 0.95870346f, 0.95776761f, +0.95682150f, 0.95586514f, 0.95489854f, 0.95392174f, 0.95293468f, +0.95193744f, 0.95093000f, 0.94991243f, 0.94888461f, 0.94784665f, +0.94679856f, 0.94574034f, 0.94467193f, 0.94359344f, 0.94250488f, +0.94140619f, 0.94029742f, 0.93917859f, 0.93804967f, 0.93691075f, +0.93576175f, 0.93460274f, 0.93343377f, 0.93225473f, 0.93106574f, +0.92986679f, 0.92865789f, 0.92743903f, 0.92621022f, 0.92497152f, +0.92372292f, 0.92246443f, 0.92119598f, 0.91991776f, 0.91862965f, +0.91733170f, 0.91602397f, 0.91470635f, 0.91337901f, 0.91204184f, +0.91069490f, 0.90933824f, 0.90797186f, 0.90659571f, 0.90520984f, +0.90381432f, 0.90240908f, 0.90099424f, 0.89956969f, 0.89813554f, +0.89669174f, 0.89523834f, 0.89377540f, 0.89230281f, 0.89082074f, +0.88932908f, 0.88782793f, 0.88631725f, 0.88479710f, 0.88326746f, +0.88172835f, 0.88017982f, 0.87862182f, 0.87705445f, 0.87547767f, +0.87389153f, 0.87229604f, 0.87069118f, 0.86907703f, 0.86745358f, +0.86582077f, 0.86417878f, 0.86252749f, 0.86086690f, 0.85919720f, +0.85751826f, 0.85583007f, 0.85413277f, 0.85242635f, 0.85071075f, +0.84898609f, 0.84725231f, 0.84550947f, 0.84375757f, 0.84199661f, +0.84022665f, 0.83844769f, 0.83665979f, 0.83486289f, 0.83305705f, +0.83124226f, 0.82941860f, 0.82758605f, 0.82574469f, 0.82389444f, +0.82203537f, 0.82016748f, 0.81829083f, 0.81640542f, 0.81451124f, +0.81260836f, 0.81069672f, 0.80877650f, 0.80684757f, 0.80490994f, +0.80296379f, 0.80100900f, 0.79904562f, 0.79707366f, 0.79509324f, +0.79310423f, 0.79110676f, 0.78910083f, 0.78708643f, 0.78506362f, +0.78303236f, 0.78099275f, 0.77894479f, 0.77688843f, 0.77482378f, +0.77275085f, 0.77066964f, 0.76858020f, 0.76648247f, 0.76437658f, +0.76226246f, 0.76014024f, 0.75800985f, 0.75587130f, 0.75372469f, +0.75157005f, 0.74940729f, 0.74723655f, 0.74505776f, 0.74287105f, +0.74067634f, 0.73847371f, 0.73626316f, 0.73404479f, 0.73181850f, +0.72958434f, 0.72734243f, 0.72509271f, 0.72283524f, 0.72057003f, +0.71829706f, 0.71601641f, 0.71372813f, 0.71143216f, 0.70912862f, +0.70681745f, 0.70449871f, 0.70217246f, 0.69983864f, 0.69749737f, +0.69514859f, 0.69279242f, 0.69042879f, 0.68805778f, 0.68567938f, +0.68329364f, 0.68090063f, 0.67850029f, 0.67609268f, 0.67367786f, +0.67125577f, 0.66882652f, 0.66639012f, 0.66394657f, 0.66149592f, +0.65903819f, 0.65657341f, 0.65410155f, 0.65162271f, 0.64913690f, +0.64664418f, 0.64414448f, 0.64163786f, 0.63912445f, 0.63660413f, +0.63407701f, 0.63154310f, 0.62900239f, 0.62645501f, 0.62390089f, +0.62134010f, 0.61877263f, 0.61619854f, 0.61361790f, 0.61103064f, +0.60843682f, 0.60583651f, 0.60322970f, 0.60061646f, 0.59799677f, +0.59537065f, 0.59273821f, 0.59009939f, 0.58745426f, 0.58480281f, +0.58214509f, 0.57948118f, 0.57681108f, 0.57413477f, 0.57145232f, +0.56876373f, 0.56606907f, 0.56336832f, 0.56066155f, 0.55794877f, +0.55523002f, 0.55250537f, 0.54977477f, 0.54703826f, 0.54429591f, +0.54154772f, 0.53879374f, 0.53603399f, 0.53326851f, 0.53049731f, +0.52772039f, 0.52493787f, 0.52214974f, 0.51935595f, 0.51655668f, +0.51375180f, 0.51094145f, 0.50812566f, 0.50530440f, 0.50247771f, +0.49964568f, 0.49680826f, 0.49396557f, 0.49111754f, 0.48826426f, +0.48540577f, 0.48254207f, 0.47967321f, 0.47679919f, 0.47392011f, +0.47103590f, 0.46814668f, 0.46525243f, 0.46235323f, 0.45944905f, +0.45653993f, 0.45362595f, 0.45070711f, 0.44778344f, 0.44485497f, +0.44192174f, 0.43898380f, 0.43604112f, 0.43309379f, 0.43014181f, +0.42718524f, 0.42422408f, 0.42125839f, 0.41828820f, 0.41531351f, +0.41233435f, 0.40935081f, 0.40636289f, 0.40337059f, 0.40037400f, +0.39737311f, 0.39436796f, 0.39135858f, 0.38834500f, 0.38532731f, +0.38230544f, 0.37927949f, 0.37624949f, 0.37321547f, 0.37017745f, +0.36713544f, 0.36408952f, 0.36103970f, 0.35798600f, 0.35492846f, +0.35186714f, 0.34880206f, 0.34573323f, 0.34266070f, 0.33958447f, +0.33650464f, 0.33342120f, 0.33033419f, 0.32724363f, 0.32414958f, +0.32105204f, 0.31795108f, 0.31484672f, 0.31173897f, 0.30862790f, +0.30551350f, 0.30239585f, 0.29927495f, 0.29615086f, 0.29302359f, +0.28989318f, 0.28675964f, 0.28362307f, 0.28048345f, 0.27734083f, +0.27419522f, 0.27104670f, 0.26789525f, 0.26474094f, 0.26158381f, +0.25842386f, 0.25526115f, 0.25209570f, 0.24892756f, 0.24575676f, +0.24258332f, 0.23940729f, 0.23622867f, 0.23304754f, 0.22986393f, +0.22667783f, 0.22348931f, 0.22029841f, 0.21710514f, 0.21390954f, +0.21071166f, 0.20751151f, 0.20430915f, 0.20110460f, 0.19789790f, +0.19468907f, 0.19147816f, 0.18826519f, 0.18505022f, 0.18183327f, +0.17861435f, 0.17539354f, 0.17217083f, 0.16894630f, 0.16571994f, +0.16249183f, 0.15926196f, 0.15603039f, 0.15279715f, 0.14956227f, +0.14632578f, 0.14308774f, 0.13984816f, 0.13660708f, 0.13336454f, +0.13012058f, 0.12687522f, 0.12362850f, 0.12038045f, 0.11713112f, +0.11388054f, 0.11062872f, 0.10737573f, 0.10412160f, 0.10086634f, +0.097609997f, 0.094352618f, 0.091094226f, 0.087834857f, 0.084574550f, +0.081313334f, 0.078051247f, 0.074788325f, 0.071524605f, 0.068260118f, +0.064994894f, 0.061728980f, 0.058462404f, 0.055195201f, 0.051927410f, +0.048659060f, 0.045390189f, 0.042120833f, 0.038851023f, 0.035580799f, +0.032310195f, 0.029039243f, 0.025767982f, 0.022496443f, 0.019224664f, +0.015952680f, 0.012680525f, 0.0094082337f, 0.0061358409f, 0.0028633832f, +-0.00040910527f, -0.0036815894f, -0.0069540343f, -0.010226404f, -0.013498665f, +-0.016770782f, -0.020042717f, -0.023314439f, -0.026585912f, -0.029857099f, +-0.033127967f, -0.036398482f, -0.039668605f, -0.042938303f, -0.046207540f, +-0.049476285f, -0.052744497f, -0.056012146f, -0.059279196f, -0.062545612f, +-0.065811358f, -0.069076397f, -0.072340697f, -0.075604223f, -0.078866936f, +-0.082128808f, -0.085389800f, -0.088649876f, -0.091909006f, -0.095167145f, +-0.098424271f, -0.10168034f, -0.10493532f, -0.10818918f, -0.11144188f, +-0.11469338f, -0.11794366f, -0.12119267f, -0.12444039f, -0.12768677f, +-0.13093179f, -0.13417540f, -0.13741758f, -0.14065829f, -0.14389749f, +-0.14713514f, -0.15037122f, -0.15360570f, -0.15683852f, -0.16006967f, +-0.16329910f, -0.16652679f, -0.16975269f, -0.17297678f, -0.17619900f, +-0.17941935f, -0.18263777f, -0.18585424f, -0.18906870f, -0.19228116f, +-0.19549155f, -0.19869985f, -0.20190603f, -0.20511003f, -0.20831184f, +-0.21151142f, -0.21470875f, -0.21790376f, -0.22109644f, -0.22428675f, +-0.22747467f, -0.23066014f, -0.23384315f, -0.23702365f, -0.24020162f, +-0.24337701f, -0.24654980f, -0.24971995f, -0.25288740f, -0.25605217f, +-0.25921419f, -0.26237345f, -0.26552987f, -0.26868346f, -0.27183419f, +-0.27498198f, -0.27812684f, -0.28126872f, -0.28440759f, -0.28754342f, +-0.29067615f, -0.29380578f, -0.29693225f, -0.30005556f, -0.30317566f, +-0.30629250f, -0.30940607f, -0.31251630f, -0.31562322f, -0.31872672f, +-0.32182685f, -0.32492352f, -0.32801670f, -0.33110636f, -0.33419248f, +-0.33727503f, -0.34035397f, -0.34342924f, -0.34650084f, -0.34956875f, +-0.35263291f, -0.35569328f, -0.35874987f, -0.36180258f, -0.36485144f, +-0.36789638f, -0.37093741f, -0.37397444f, -0.37700745f, -0.38003644f, +-0.38306138f, -0.38608220f, -0.38909888f, -0.39211139f, -0.39511973f, +-0.39812380f, -0.40112361f, -0.40411916f, -0.40711036f, -0.41009718f, +-0.41307965f, -0.41605768f, -0.41903123f, -0.42200032f, -0.42496487f, +-0.42792490f, -0.43088034f, -0.43383113f, -0.43677729f, -0.43971881f, +-0.44265559f, -0.44558764f, -0.44851488f, -0.45143735f, -0.45435500f, +-0.45726776f, -0.46017563f, -0.46307856f, -0.46597654f, -0.46886954f, +-0.47175750f, -0.47464043f, -0.47751826f, -0.48039100f, -0.48325855f, +-0.48612097f, -0.48897815f, -0.49183011f, -0.49467680f, -0.49751821f, +-0.50035429f, -0.50318497f, -0.50601029f, -0.50883019f, -0.51164466f, +-0.51445359f, -0.51725709f, -0.52005500f, -0.52284735f, -0.52563411f, +-0.52841520f, -0.53119069f, -0.53396046f, -0.53672451f, -0.53948283f, +-0.54223537f, -0.54498214f, -0.54772300f, -0.55045801f, -0.55318713f, +-0.55591035f, -0.55862761f, -0.56133890f, -0.56404412f, -0.56674337f, +-0.56943649f, -0.57212353f, -0.57480448f, -0.57747924f, -0.58014780f, +-0.58281022f, -0.58546633f, -0.58811617f, -0.59075975f, -0.59339696f, +-0.59602785f, -0.59865236f, -0.60127044f, -0.60388207f, -0.60648727f, +-0.60908598f, -0.61167812f, -0.61426371f, -0.61684275f, -0.61941516f, +-0.62198097f, -0.62454009f, -0.62709254f, -0.62963831f, -0.63217729f, +-0.63470948f, -0.63723493f, -0.63975352f, -0.64226526f, -0.64477009f, +-0.64726806f, -0.64975911f, -0.65224314f, -0.65472025f, -0.65719032f, +-0.65965337f, -0.66210932f, -0.66455823f, -0.66700000f, -0.66943461f, +-0.67186207f, -0.67428231f, -0.67669535f, -0.67910111f, -0.68149966f, +-0.68389088f, -0.68627477f, -0.68865126f, -0.69102043f, -0.69338220f, +-0.69573659f, -0.69808346f, -0.70042288f, -0.70275480f, -0.70507920f, +-0.70739603f, -0.70970529f, -0.71200693f, -0.71430099f, -0.71658736f, +-0.71886611f, -0.72113711f, -0.72340041f, -0.72565591f, -0.72790372f, +-0.73014367f, -0.73237586f, -0.73460019f, -0.73681659f, -0.73902518f, +-0.74122584f, -0.74341851f, -0.74560326f, -0.74778003f, -0.74994880f, +-0.75210953f, -0.75426215f, -0.75640678f, -0.75854325f, -0.76067162f, +-0.76279181f, -0.76490390f, -0.76700771f, -0.76910341f, -0.77119076f, +-0.77326995f, -0.77534080f, -0.77740335f, -0.77945763f, -0.78150350f, +-0.78354102f, -0.78557014f, -0.78759086f, -0.78960317f, -0.79160696f, +-0.79360235f, -0.79558921f, -0.79756755f, -0.79953730f, -0.80149853f, +-0.80345118f, -0.80539525f, -0.80733067f, -0.80925739f, -0.81117553f, +-0.81308490f, -0.81498563f, -0.81687760f, -0.81876087f, -0.82063532f, +-0.82250100f, -0.82435787f, -0.82620591f, -0.82804507f, -0.82987541f, +-0.83169687f, -0.83350939f, -0.83531296f, -0.83710766f, -0.83889335f, +-0.84067005f, -0.84243774f, -0.84419644f, -0.84594607f, -0.84768665f, +-0.84941816f, -0.85114056f, -0.85285389f, -0.85455805f, -0.85625303f, +-0.85793889f, -0.85961550f, -0.86128294f, -0.86294121f, -0.86459017f, +-0.86622989f, -0.86786032f, -0.86948150f, -0.87109333f, -0.87269586f, +-0.87428904f, -0.87587279f, -0.87744725f, -0.87901229f, -0.88056785f, +-0.88211405f, -0.88365078f, -0.88517809f, -0.88669586f, -0.88820416f, +-0.88970292f, -0.89119220f, -0.89267188f, -0.89414203f, -0.89560264f, +-0.89705360f, -0.89849502f, -0.89992678f, -0.90134889f, -0.90276134f, +-0.90416414f, -0.90555727f, -0.90694070f, -0.90831441f, -0.90967834f, +-0.91103262f, -0.91237706f, -0.91371179f, -0.91503674f, -0.91635185f, +-0.91765714f, -0.91895264f, -0.92023826f, -0.92151409f, -0.92277998f, +-0.92403603f, -0.92528218f, -0.92651838f, -0.92774469f, -0.92896110f, +-0.93016750f, -0.93136400f, -0.93255049f, -0.93372697f, -0.93489349f, +-0.93604994f, -0.93719643f, -0.93833286f, -0.93945926f, -0.94057560f, +-0.94168180f, -0.94277799f, -0.94386405f, -0.94494003f, -0.94600588f, +-0.94706154f, -0.94810712f, -0.94914252f, -0.95016778f, -0.95118284f, +-0.95218778f, -0.95318246f, -0.95416695f, -0.95514119f, -0.95610523f, +-0.95705903f, -0.95800257f, -0.95893586f, -0.95985889f, -0.96077162f, +-0.96167403f, -0.96256620f, -0.96344805f, -0.96431959f, -0.96518075f, +-0.96603161f, -0.96687216f, -0.96770233f, -0.96852213f, -0.96933156f, +-0.97013056f, -0.97091925f, -0.97169751f, -0.97246534f, -0.97322279f, +-0.97396982f, -0.97470641f, -0.97543252f, -0.97614825f, -0.97685349f, +-0.97754824f, -0.97823256f, -0.97890645f, -0.97956979f, -0.98022264f, +-0.98086500f, -0.98149687f, -0.98211825f, -0.98272908f, -0.98332942f, +-0.98391914f, -0.98449844f, -0.98506713f, -0.98562527f, -0.98617285f, +-0.98670989f, -0.98723638f, -0.98775226f, -0.98825759f, -0.98875231f, +-0.98923647f, -0.98971003f, -0.99017298f, -0.99062532f, -0.99106705f, +-0.99149817f, -0.99191868f, -0.99232858f, -0.99272782f, -0.99311644f, +-0.99349445f, -0.99386179f, -0.99421853f, -0.99456459f, -0.99489999f, +-0.99522477f, -0.99553883f, -0.99584228f, -0.99613506f, -0.99641716f, +-0.99668860f, -0.99694937f, -0.99719942f, -0.99743885f, -0.99766755f, +-0.99788558f, -0.99809295f, -0.99828959f, -0.99847561f, -0.99865085f, +-0.99881548f, -0.99896932f, -0.99911255f, -0.99924499f, -0.99936682f, +-0.99947786f, -0.99957830f, -0.99966794f, -0.99974692f, -0.99981517f, +-0.99987274f, -0.99991959f, -0.99995571f, -0.99998116f, -0.99999589f, +0.99999964f, 0.99997288f, 0.99990326f, 0.99979085f, 0.99963558f, +0.99943751f, 0.99919659f, 0.99891287f, 0.99858636f, 0.99821711f, +0.99780506f, 0.99735034f, 0.99685282f, 0.99631262f, 0.99572974f, +0.99510419f, 0.99443603f, 0.99372530f, 0.99297196f, 0.99217612f, +0.99133772f, 0.99045694f, 0.98953366f, 0.98856801f, 0.98756003f, +0.98650974f, 0.98541719f, 0.98428243f, 0.98310548f, 0.98188645f, +0.98062533f, 0.97932225f, 0.97797716f, 0.97659022f, 0.97516143f, +0.97369087f, 0.97217858f, 0.97062469f, 0.96902919f, 0.96739221f, +0.96571374f, 0.96399397f, 0.96223283f, 0.96043050f, 0.95858705f, +0.95670253f, 0.95477700f, 0.95281059f, 0.95080340f, 0.94875544f, +0.94666684f, 0.94453770f, 0.94236809f, 0.94015813f, 0.93790787f, +0.93561745f, 0.93328691f, 0.93091643f, 0.92850608f, 0.92605597f, +0.92356616f, 0.92103678f, 0.91846794f, 0.91585976f, 0.91321236f, +0.91052586f, 0.90780038f, 0.90503591f, 0.90223277f, 0.89939094f, +0.89651060f, 0.89359182f, 0.89063478f, 0.88763964f, 0.88460642f, +0.88153529f, 0.87842643f, 0.87527996f, 0.87209594f, 0.86887461f, +0.86561602f, 0.86232042f, 0.85898781f, 0.85561842f, 0.85221243f, +0.84876984f, 0.84529096f, 0.84177583f, 0.83822471f, 0.83463764f, +0.83101481f, 0.82735640f, 0.82366252f, 0.81993335f, 0.81616908f, +0.81236988f, 0.80853581f, 0.80466717f, 0.80076402f, 0.79682660f, +0.79285502f, 0.78884947f, 0.78481019f, 0.78073722f, 0.77663082f, +0.77249116f, 0.76831841f, 0.76411277f, 0.75987434f, 0.75560343f, +0.75130010f, 0.74696463f, 0.74259710f, 0.73819780f, 0.73376691f, +0.72930455f, 0.72481096f, 0.72028631f, 0.71573079f, 0.71114463f, +0.70652801f, 0.70188117f, 0.69720417f, 0.69249737f, 0.68776089f, +0.68299496f, 0.67819971f, 0.67337549f, 0.66852236f, 0.66364062f, +0.65873051f, 0.65379208f, 0.64882571f, 0.64383155f, 0.63880974f, +0.63376063f, 0.62868434f, 0.62358117f, 0.61845124f, 0.61329484f, +0.60811216f, 0.60290343f, 0.59766883f, 0.59240872f, 0.58712316f, +0.58181250f, 0.57647687f, 0.57111657f, 0.56573176f, 0.56032276f, +0.55488980f, 0.54943299f, 0.54395270f, 0.53844911f, 0.53292239f, +0.52737290f, 0.52180082f, 0.51620632f, 0.51058978f, 0.50495136f, +0.49929130f, 0.49360985f, 0.48790723f, 0.48218375f, 0.47643960f, +0.47067502f, 0.46489030f, 0.45908567f, 0.45326138f, 0.44741765f, +0.44155475f, 0.43567297f, 0.42977250f, 0.42385364f, 0.41791660f, +0.41196167f, 0.40598908f, 0.39999911f, 0.39399201f, 0.38796803f, +0.38192743f, 0.37587047f, 0.36979741f, 0.36370850f, 0.35760403f, +0.35148421f, 0.34534934f, 0.33919969f, 0.33303553f, 0.32685706f, +0.32066461f, 0.31445843f, 0.30823877f, 0.30200592f, 0.29576012f, +0.28950164f, 0.28323078f, 0.27694780f, 0.27065292f, 0.26434645f, +0.25802869f, 0.25169984f, 0.24536023f, 0.23901010f, 0.23264973f, +0.22627939f, 0.21989937f, 0.21350993f, 0.20711134f, 0.20070387f, +0.19428782f, 0.18786344f, 0.18143101f, 0.17499080f, 0.16854310f, +0.16208819f, 0.15562633f, 0.14915779f, 0.14268288f, 0.13620184f, +0.12971498f, 0.12322257f, 0.11672486f, 0.11022217f, 0.10371475f, +0.097202882f, 0.090686858f, 0.084166944f, 0.077643424f, 0.071116582f, +0.064586692f, 0.058054037f, 0.051518895f, 0.044981543f, 0.038442269f, +0.031901345f, 0.025359053f, 0.018815678f, 0.012271495f, 0.0057267868f, +-0.00081816671f, -0.0073630852f, -0.013907688f, -0.020451695f, -0.026994826f, +-0.033536803f, -0.040077340f, -0.046616159f, -0.053152986f, -0.059687532f, +-0.066219524f, -0.072748676f, -0.079274714f, -0.085797355f, -0.092316322f, +-0.098831341f, -0.10534211f, -0.11184838f, -0.11834986f, -0.12484626f, +-0.13133731f, -0.13782275f, -0.14430228f, -0.15077563f, -0.15724251f, +-0.16370267f, -0.17015581f, -0.17660165f, -0.18303993f, -0.18947038f, +-0.19589271f, -0.20230664f, -0.20871192f, -0.21510825f, -0.22149536f, +-0.22787298f, -0.23424086f, -0.24059868f, -0.24694622f, -0.25328314f, +-0.25960925f, -0.26592422f, -0.27222782f, -0.27851975f, -0.28479972f, +-0.29106751f, -0.29732284f, -0.30356544f, -0.30979502f, -0.31601134f, +-0.32221413f, -0.32840309f, -0.33457801f, -0.34073856f, -0.34688455f, +-0.35301566f, -0.35913166f, -0.36523229f, -0.37131724f, -0.37738630f, +-0.38343921f, -0.38947567f, -0.39549544f, -0.40149832f, -0.40748394f, +-0.41345215f, -0.41940263f, -0.42533514f, -0.43124944f, -0.43714526f, +-0.44302234f, -0.44888046f, -0.45471936f, -0.46053877f, -0.46633846f, +-0.47211814f, -0.47787762f, -0.48361665f, -0.48933494f, -0.49503228f, +-0.50070840f, -0.50636309f, -0.51199609f, -0.51760709f, -0.52319598f, +-0.52876246f, -0.53430629f, -0.53982723f, -0.54532504f, -0.55079949f, +-0.55625033f, -0.56167740f, -0.56708032f, -0.57245898f, -0.57781315f, +-0.58314258f, -0.58844697f, -0.59372622f, -0.59897995f, -0.60420811f, +-0.60941035f, -0.61458647f, -0.61973625f, -0.62485951f, -0.62995601f, +-0.63502556f, -0.64006782f, -0.64508271f, -0.65007001f, -0.65502942f, +-0.65996075f, -0.66486382f, -0.66973841f, -0.67458433f, -0.67940134f, +-0.68418926f, -0.68894786f, -0.69367695f, -0.69837630f, -0.70304573f, +-0.70768511f, -0.71229410f, -0.71687263f, -0.72142041f, -0.72593731f, +-0.73042315f, -0.73487765f, -0.73930067f, -0.74369204f, -0.74805158f, +-0.75237900f, -0.75667429f, -0.76093709f, -0.76516730f, -0.76936477f, +-0.77352923f, -0.77766061f, -0.78175867f, -0.78582323f, -0.78985411f, +-0.79385114f, -0.79781419f, -0.80174309f, -0.80563760f, -0.80949765f, +-0.81332302f, -0.81711352f, -0.82086903f, -0.82458937f, -0.82827437f, +-0.83192390f, -0.83553779f, -0.83911592f, -0.84265804f, -0.84616417f, +-0.84963393f, -0.85306740f, -0.85646427f, -0.85982448f, -0.86314780f, +-0.86643422f, -0.86968350f, -0.87289548f, -0.87607014f, -0.87920725f, +-0.88230664f, -0.88536829f, -0.88839203f, -0.89137769f, -0.89432514f, +-0.89723432f, -0.90010506f, -0.90293723f, -0.90573072f, -0.90848541f, +-0.91120118f, -0.91387796f, -0.91651553f, -0.91911387f, -0.92167282f, +-0.92419231f, -0.92667222f, -0.92911243f, -0.93151283f, -0.93387336f, +-0.93619382f, -0.93847424f, -0.94071442f, -0.94291431f, -0.94507378f, +-0.94719279f, -0.94927126f, -0.95130903f, -0.95330608f, -0.95526224f, +-0.95717752f, -0.95905179f, -0.96088499f, -0.96267700f, -0.96442777f, +-0.96613729f, -0.96780539f, -0.96943200f, -0.97101706f, -0.97256058f, +-0.97406244f, -0.97552258f, -0.97694093f, -0.97831738f, -0.97965199f, +-0.98094457f, -0.98219514f, -0.98340368f, -0.98457009f, -0.98569429f, +-0.98677629f, -0.98781598f, -0.98881340f, -0.98976845f, -0.99068111f, +-0.99155134f, -0.99237907f, -0.99316430f, -0.99390697f, -0.99460709f, +-0.99526459f, -0.99587947f, -0.99645168f, -0.99698120f, -0.99746799f, +-0.99791211f, -0.99831343f, -0.99867201f, -0.99898779f, -0.99926084f, +-0.99949104f, -0.99967843f, -0.99982297f, -0.99992472f, -0.99998361f, +0.99999869f, 0.99989158f, 0.99961317f, 0.99916345f, 0.99854255f, +0.99775058f, 0.99678761f, 0.99565387f, 0.99434954f, 0.99287480f, +0.99122995f, 0.98941529f, 0.98743105f, 0.98527765f, 0.98295540f, +0.98046476f, 0.97780609f, 0.97497988f, 0.97198665f, 0.96882683f, +0.96550101f, 0.96200979f, 0.95835376f, 0.95453346f, 0.95054960f, +0.94640291f, 0.94209403f, 0.93762374f, 0.93299282f, 0.92820197f, +0.92325211f, 0.91814411f, 0.91287869f, 0.90745693f, 0.90187967f, +0.89614785f, 0.89026248f, 0.88422459f, 0.87803519f, 0.87169534f, +0.86520612f, 0.85856867f, 0.85178405f, 0.84485358f, 0.83777827f, +0.83055943f, 0.82319832f, 0.81569612f, 0.80805415f, 0.80027372f, +0.79235619f, 0.78430289f, 0.77611518f, 0.76779449f, 0.75934225f, +0.75075996f, 0.74204898f, 0.73321080f, 0.72424710f, 0.71515924f, +0.70594883f, 0.69661748f, 0.68716675f, 0.67759830f, 0.66791373f, +0.65811473f, 0.64820296f, 0.63818014f, 0.62804794f, 0.61780810f, +0.60746247f, 0.59701276f, 0.58646071f, 0.57580817f, 0.56505698f, +0.55420899f, 0.54326600f, 0.53222996f, 0.52110273f, 0.50988621f, +0.49858227f, 0.48719296f, 0.47572014f, 0.46416581f, 0.45253196f, +0.44082057f, 0.42903364f, 0.41717321f, 0.40524128f, 0.39323992f, +0.38117120f, 0.36903715f, 0.35683987f, 0.34458145f, 0.33226398f, +0.31988961f, 0.30746040f, 0.29497850f, 0.28244606f, 0.26986524f, +0.25723818f, 0.24456702f, 0.23185398f, 0.21910121f, 0.20631088f, +0.19348522f, 0.18062639f, 0.16773662f, 0.15481812f, 0.14187308f, +0.12890373f, 0.11591230f, 0.10290100f, 0.089872077f, 0.076827750f, +0.063770257f, 0.050701842f, 0.037624735f, 0.024541186f, 0.011453429f, +-0.0016362892f, -0.014725727f, -0.027812643f, -0.040894791f, -0.053969935f, +-0.067035832f, -0.080090240f, -0.093130924f, -0.10615565f, -0.11916219f, +-0.13214831f, -0.14511178f, -0.15805040f, -0.17096193f, -0.18384418f, +-0.19669491f, -0.20951195f, -0.22229309f, -0.23503613f, -0.24773891f, +-0.26039925f, -0.27301496f, -0.28558388f, -0.29810387f, -0.31057280f, +-0.32298848f, -0.33534884f, -0.34765175f, -0.35989508f, -0.37207675f, +-0.38419467f, -0.39624676f, -0.40823093f, -0.42014518f, -0.43198743f, +-0.44375566f, -0.45544785f, -0.46706200f, -0.47859612f, -0.49004826f, +-0.50141639f, -0.51269865f, -0.52389306f, -0.53499764f, -0.54601061f, +-0.55693001f, -0.56775403f, -0.57848072f, -0.58910829f, -0.59963489f, +-0.61005878f, -0.62037814f, -0.63059121f, -0.64069623f, -0.65069145f, +-0.66057515f, -0.67034572f, -0.68000144f, -0.68954057f, -0.69896162f, +-0.70826286f, -0.71744281f, -0.72649974f, -0.73543227f, -0.74423873f, +-0.75291771f, -0.76146764f, -0.76988715f, -0.77817470f, -0.78632891f, +-0.79434842f, -0.80223179f, -0.80997771f, -0.81758487f, -0.82505190f, +-0.83237761f, -0.83956063f, -0.84659988f, -0.85349399f, -0.86024189f, +-0.86684239f, -0.87329435f, -0.87959671f, -0.88574833f, -0.89174819f, +-0.89759529f, -0.90328854f, -0.90882701f, -0.91420978f, -0.91943592f, +-0.92450452f, -0.92941469f, -0.93416560f, -0.93875647f, -0.94318646f, +-0.94745487f, -0.95156091f, -0.95550388f, -0.95928317f, -0.96289814f, +-0.96634805f, -0.96963239f, -0.97275060f, -0.97570217f, -0.97848648f, +-0.98110318f, -0.98355180f, -0.98583186f, -0.98794299f, -0.98988485f, +-0.99165714f, -0.99325943f, -0.99469161f, -0.99595332f, -0.99704438f, +-0.99796462f, -0.99871385f, -0.99929196f, -0.99969882f, -0.99993443f, +0.99999464f, 0.99956632f, 0.99845290f, 0.99665523f, 0.99417448f, +0.99101239f, 0.98717111f, 0.98265326f, 0.97746199f, 0.97160077f, +0.96507365f, 0.95788515f, 0.95004016f, 0.94154406f, 0.93240267f, +0.92262226f, 0.91220951f, 0.90117162f, 0.88951606f, 0.87725091f, +0.86438453f, 0.85092574f, 0.83688372f, 0.82226819f, 0.80708915f, +0.79135692f, 0.77508235f, 0.75827658f, 0.74095112f, 0.72311783f, +0.70478898f, 0.68597710f, 0.66669506f, 0.64695615f, 0.62677377f, +0.60616189f, 0.58513457f, 0.56370622f, 0.54189157f, 0.51970547f, +0.49716324f, 0.47428027f, 0.45107225f, 0.42755505f, 0.40374488f, +0.37965798f, 0.35531086f, 0.33072025f, 0.30590299f, 0.28087607f, +0.25565663f, 0.23026201f, 0.20470956f, 0.17901683f, 0.15320139f, +0.12728097f, 0.10127331f, 0.075196236f, 0.049067631f, 0.022905400f, +-0.0032725304f, -0.029448219f, -0.055603724f, -0.081721120f, -0.10778251f, +-0.13377003f, -0.15966587f, -0.18545228f, -0.21111161f, -0.23662624f, +-0.26197869f, -0.28715160f, -0.31212771f, -0.33688989f, -0.36142120f, +-0.38570482f, -0.40972409f, -0.43346253f, -0.45690393f, -0.48003218f, +-0.50283146f, -0.52528608f, -0.54738069f, -0.56910020f, -0.59042966f, +-0.61135447f, -0.63186026f, -0.65193301f, -0.67155898f, -0.69072473f, +-0.70941705f, -0.72762316f, -0.74533063f, -0.76252723f, -0.77920127f, +-0.79534131f, -0.81093621f, -0.82597536f, -0.84044844f, -0.85434550f, +-0.86765707f, -0.88037395f, -0.89248747f, -0.90398932f, -0.91487163f, +-0.92512697f, -0.93474823f, -0.94372886f, -0.95206273f, -0.95974404f, +-0.96676767f, -0.97312868f, -0.97882277f, -0.98384601f, -0.98819500f, +-0.99186671f, -0.99485862f, -0.99716878f, -0.99879545f, -0.99973762f, +}; +#endif + +static const CELTMode mode48000_960_120 = { +48000, /* Fs */ +120, /* overlap */ +21, /* nbEBands */ +21, /* effEBands */ +{0.85000610f, 0.0000000f, 1.0000000f, 1.0000000f, }, /* preemph */ +eband5ms, /* eBands */ +3, /* maxLM */ +8, /* nbShortMdcts */ +120, /* shortMdctSize */ +11, /* nbAllocVectors */ +band_allocation, /* allocVectors */ +logN400, /* logN */ +window120, /* window */ +{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ +{392, cache_index50, cache_bits50, cache_caps50}, /* cache */ +}; + +/* List of all the available modes */ +#define TOTAL_MODES 1 +static const CELTMode * const static_mode_list[TOTAL_MODES] = { +&mode48000_960_120, +}; diff --git a/src/libopus/celt/vq.c b/src/libopus/celt/vq.c new file mode 100644 index 00000000..81321d9b --- /dev/null +++ b/src/libopus/celt/vq.c @@ -0,0 +1,442 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "mathops.h" +#include "cwrs.h" +#include "vq.h" +#include "arch.h" +#include "os_support.h" +#include "bands.h" +#include "rate.h" +#include "pitch.h" + +#if defined(MIPSr1_ASM) +#include "mips/vq_mipsr1.h" +#endif + +#ifndef OVERRIDE_vq_exp_rotation1 +static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) +{ + int i; + opus_val16 ms; + celt_norm *Xptr; + Xptr = X; + ms = NEG16(s); + for (i=0;i=0;i--) + { + celt_norm x1, x2; + x1 = Xptr[0]; + x2 = Xptr[stride]; + Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15)); + *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15)); + } +} +#endif /* OVERRIDE_vq_exp_rotation1 */ + +void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) +{ + static const int SPREAD_FACTOR[3]={15,10,5}; + int i; + opus_val16 c, s; + opus_val16 gain, theta; + int stride2=0; + int factor; + + if (2*K>=len || spread==SPREAD_NONE) + return; + factor = SPREAD_FACTOR[spread-1]; + + gain = celt_div((opus_val32)MULT16_16(Q15_ONE,len),(opus_val32)(len+factor*K)); + theta = HALF16(MULT16_16_Q15(gain,gain)); + + c = celt_cos_norm(EXTEND32(theta)); + s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */ + + if (len>=8*stride) + { + stride2 = 1; + /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding. + It's basically incrementing long as (stride2+0.5)^2 < len/stride. */ + while ((stride2*stride2+stride2)*stride + (stride>>2) < len) + stride2++; + } + /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for + extract_collapse_mask().*/ + len = celt_udiv(len, stride); + for (i=0;i>1; +#endif + t = VSHR32(Ryy, 2*(k-7)); + g = MULT16_16_P15(celt_rsqrt_norm(t),gain); + + i=0; + do + X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1)); + while (++i < N); +} + +static unsigned extract_collapse_mask(int *iy, int N, int B) +{ + unsigned collapse_mask; + int N0; + int i; + if (B<=1) + return 1; + /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for + exp_rotation().*/ + N0 = celt_udiv(N, B); + collapse_mask = 0; + i=0; do { + int j; + unsigned tmp=0; + j=0; do { + tmp |= iy[i*N0+j]; + } while (++j (N>>1)) + { + opus_val16 rcp; + j=0; do { + sum += X[j]; + } while (++j EPSILON && sum < 64)) +#endif + { + X[0] = QCONST16(1.f,14); + j=1; do + X[j]=0; + while (++j=0); + + /* This should never happen, but just in case it does (e.g. on silence) + we fill the first bin with pulses. */ +#ifdef FIXED_POINT_DEBUG + celt_sig_assert(pulsesLeft<=N+3); +#endif + if (pulsesLeft > N+3) + { + opus_val16 tmp = (opus_val16)pulsesLeft; + yy = MAC16_16(yy, tmp, tmp); + yy = MAC16_16(yy, tmp, y[0]); + iy[0] += pulsesLeft; + pulsesLeft=0; + } + + for (i=0;i= best_num/best_den, but that way + we can do it without any division */ + /* OPT: It's not clear whether a cmov is faster than a branch here + since the condition is more often false than true and using + a cmov introduces data dependencies across iterations. The optimal + choice may be architecture-dependent. */ + if (opus_unlikely(MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))) + { + best_den = Ryy; + best_num = Rxy; + best_id = j; + } + } while (++j0, "alg_quant() needs at least one pulse"); + celt_assert2(N>1, "alg_quant() needs at least two dimensions"); + + /* Covers vectorization by up to 4. */ + ALLOC(iy, N+3, int); + + exp_rotation(X, N, 1, B, K, spread); + + yy = op_pvq_search(X, iy, K, N, arch); + + encode_pulses(iy, N, K, enc); + + if (resynth) + { + normalise_residual(iy, X, N, yy, gain); + exp_rotation(X, N, -1, B, K, spread); + } + + collapse_mask = extract_collapse_mask(iy, N, B); + RESTORE_STACK; + return collapse_mask; +} + +/** Decode pulse vector and combine the result with the pitch vector to produce + the final normalised signal in the current band. */ +unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, + ec_dec *dec, opus_val16 gain) +{ + opus_val32 Ryy; + unsigned collapse_mask; + VARDECL(int, iy); + SAVE_STACK; + + celt_assert2(K>0, "alg_unquant() needs at least one pulse"); + celt_assert2(N>1, "alg_unquant() needs at least two dimensions"); + ALLOC(iy, N, int); + Ryy = decode_pulses(iy, N, K, dec); + normalise_residual(iy, X, N, Ryy, gain); + exp_rotation(X, N, -1, B, K, spread); + collapse_mask = extract_collapse_mask(iy, N, B); + RESTORE_STACK; + return collapse_mask; +} + +#ifndef OVERRIDE_renormalise_vector +void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch) +{ + int i; +#ifdef FIXED_POINT + int k; +#endif + opus_val32 E; + opus_val16 g; + opus_val32 t; + celt_norm *xptr; + E = EPSILON + celt_inner_prod(X, X, N, arch); +#ifdef FIXED_POINT + k = celt_ilog2(E)>>1; +#endif + t = VSHR32(E, 2*(k-7)); + g = MULT16_16_P15(celt_rsqrt_norm(t),gain); + + xptr = X; + for (i=0;i header file. */ +/* #undef HAVE_ALLOCA_H */ + + +/* NE10 library is installed on host. Make sure it is on target! */ +/* #undef HAVE_ARM_NE10 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `lrint' function. */ +#define HAVE_LRINT 1 + +/* Define to 1 if you have the `lrintf' function. */ +#define HAVE_LRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `__malloc_hook' function. */ +/* #undef HAVE___MALLOC_HOOK */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Make use of ARM asm optimization */ +/* #undef OPUS_ARM_ASM */ + +/* Use generic ARMv4 inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_ASM */ + +/* Use ARMv5E inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_EDSP */ + +/* Use ARMv6 inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_MEDIA */ + +/* Use ARM NEON inline asm optimizations */ +/* #undef OPUS_ARM_INLINE_NEON */ + +/* Compiler supports Aarch64 DOTPROD Intrinsics */ +/* #undef OPUS_ARM_MAY_HAVE_DOTPROD */ + +/* Define if assembler supports EDSP instructions */ +/* #undef OPUS_ARM_MAY_HAVE_EDSP */ + +/* Define if assembler supports ARMv6 media instructions */ +/* #undef OPUS_ARM_MAY_HAVE_MEDIA */ + +/* Define if compiler supports NEON instructions */ +/* #undef OPUS_ARM_MAY_HAVE_NEON */ + +/* Compiler supports ARMv7/Aarch64 Neon Intrinsics */ +/* #undef OPUS_ARM_MAY_HAVE_NEON_INTR */ + +/* Define if binary requires Aarch64 Neon Intrinsics */ +/* #undef OPUS_ARM_PRESUME_AARCH64_NEON_INTR */ + +/* Define if binary requires Aarch64 dotprod Intrinsics */ +/* #undef OPUS_ARM_PRESUME_DOTPROD */ + +/* Define if binary requires EDSP instruction support */ +/* #undef OPUS_ARM_PRESUME_EDSP */ + +/* Define if binary requires ARMv6 media instruction support */ +/* #undef OPUS_ARM_PRESUME_MEDIA */ + +/* Define if binary requires NEON instruction support */ +/* #undef OPUS_ARM_PRESUME_NEON */ + +/* Define if binary requires NEON intrinsics support */ +/* #undef OPUS_ARM_PRESUME_NEON_INTR */ + +/* This is a build of OPUS */ +#define OPUS_BUILD /**/ + +/* Run bit-exactness checks between optimized and c implementations */ +/* #undef OPUS_CHECK_ASM */ + +/* Use run-time CPU capabilities detection */ +/* #undef OPUS_HAVE_RTCD */ + +/* Compiler supports X86 AVX2 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_AVX2 */ + +/* Compiler supports X86 SSE Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE */ + +/* Compiler supports X86 SSE2 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE2 */ + +/* Compiler supports X86 SSE4.1 Intrinsics */ +/* #undef OPUS_X86_MAY_HAVE_SSE4_1 */ + +/* Define if binary requires AVX2 intrinsics support */ +/* #undef OPUS_X86_PRESUME_AVX2 */ + +/* Define if binary requires SSE intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE */ + +/* Define if binary requires SSE2 intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE2 */ + +/* Define if binary requires SSE4.1 intrinsics support */ +/* #undef OPUS_X86_PRESUME_SSE4_1 */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "opus@xiph.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "opus" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "opus 1.5.2" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "opus" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.5.2" + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#define STDC_HEADERS 1 + +/* Make use of alloca */ +#undef USE_ALLOCA + +/* Use C99 variable-size arrays */ +#define VAR_ARRAYS 1 + +// Enable heap-based stack on Pico. ESP32 should use larger task stack in the sketch +#ifdef ARDUINO_ARCH_RP2040 +#undef VAR_ARRAYS +#define NONTHREADSAFE_PSEUDOSTACK 1 +#endif + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#define restrict __restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif diff --git a/src/libopus/include/opus.h b/src/libopus/include/opus.h new file mode 100644 index 00000000..eadeda75 --- /dev/null +++ b/src/libopus/include/opus.h @@ -0,0 +1,1099 @@ +/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited + Written by Jean-Marc Valin and Koen Vos */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/** + * @file opus.h + * @brief Opus reference implementation API + */ + +#ifndef OPUS_H +#define OPUS_H + +#include "opus_types.h" +#include "opus_defines.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @mainpage Opus + * + * The Opus codec is designed for interactive speech and audio transmission over the Internet. + * It is designed by the IETF Codec Working Group and incorporates technology from + * Skype's SILK codec and Xiph.Org's CELT codec. + * + * The Opus codec is designed to handle a wide range of interactive audio applications, + * including Voice over IP, videoconferencing, in-game chat, and even remote live music + * performances. It can scale from low bit-rate narrowband speech to very high quality + * stereo music. Its main features are: + + * @li Sampling rates from 8 to 48 kHz + * @li Bit-rates from 6 kb/s to 510 kb/s + * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR) + * @li Audio bandwidth from narrowband to full-band + * @li Support for speech and music + * @li Support for mono and stereo + * @li Support for multichannel (up to 255 channels) + * @li Frame sizes from 2.5 ms to 60 ms + * @li Good loss robustness and packet loss concealment (PLC) + * @li Floating point and fixed-point implementation + * + * Documentation sections: + * @li @ref opus_encoder + * @li @ref opus_decoder + * @li @ref opus_repacketizer + * @li @ref opus_multistream + * @li @ref opus_libinfo + * @li @ref opus_custom + */ + +/** @defgroup opus_encoder Opus Encoder + * @{ + * + * @brief This page describes the process and functions used to encode Opus. + * + * Since Opus is a stateful codec, the encoding process starts with creating an encoder + * state. This can be done with: + * + * @code + * int error; + * OpusEncoder *enc; + * enc = opus_encoder_create(Fs, channels, application, &error); + * @endcode + * + * From this point, @c enc can be used for encoding an audio stream. An encoder state + * @b must @b not be used for more than one stream at the same time. Similarly, the encoder + * state @b must @b not be re-initialized for each frame. + * + * While opus_encoder_create() allocates memory for the state, it's also possible + * to initialize pre-allocated memory: + * + * @code + * int size; + * int error; + * OpusEncoder *enc; + * size = opus_encoder_get_size(channels); + * enc = malloc(size); + * error = opus_encoder_init(enc, Fs, channels, application); + * @endcode + * + * where opus_encoder_get_size() returns the required size for the encoder state. Note that + * future versions of this code may change the size, so no assumptions should be made about it. + * + * The encoder state is always continuous in memory and only a shallow copy is sufficient + * to copy it (e.g. memcpy()) + * + * It is possible to change some of the encoder's settings using the opus_encoder_ctl() + * interface. All these settings already default to the recommended value, so they should + * only be changed when necessary. The most common settings one may want to change are: + * + * @code + * opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate)); + * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); + * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type)); + * @endcode + * + * where + * + * @arg bitrate is in bits per second (b/s) + * @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest + * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC + * + * See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream. + * + * To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data: + * @code + * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); + * @endcode + * + * where + *
    + *
  • audio_frame is the audio data in opus_int16 (or float for opus_encode_float())
  • + *
  • frame_size is the duration of the frame in samples (per channel)
  • + *
  • packet is the byte array to which the compressed data is written
  • + *
  • max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended). + * Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.
  • + *
+ * + * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet. + * The return value can be negative, which indicates that an error has occurred. If the return value + * is 2 bytes or less, then the packet does not need to be transmitted (DTX). + * + * Once the encoder state if no longer needed, it can be destroyed with + * + * @code + * opus_encoder_destroy(enc); + * @endcode + * + * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(), + * then no action is required aside from potentially freeing the memory that was manually + * allocated for it (calling free(enc) for the example above) + * + */ + +/** Opus encoder state. + * This contains the complete state of an Opus encoder. + * It is position independent and can be freely copied. + * @see opus_encoder_create,opus_encoder_init + */ +typedef struct OpusEncoder OpusEncoder; + +/** Gets the size of an OpusEncoder structure. + * @param[in] channels int: Number of channels. + * This must be 1 or 2. + * @returns The size in bytes. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels); + +/** + */ + +/** Allocates and initializes an encoder state. + * There are three coding modes: + * + * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice + * signals. It enhances the input signal by high-pass filtering and + * emphasizing formants and harmonics. Optionally it includes in-band + * forward error correction to protect against packet loss. Use this + * mode for typical VoIP applications. Because of the enhancement, + * even at high bitrates the output may sound different from the input. + * + * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most + * non-voice signals like music. Use this mode for music and mixed + * (music/voice) content, broadcast, and applications requiring less + * than 15 ms of coding delay. + * + * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that + * disables the speech-optimized mode in exchange for slightly reduced delay. + * This mode can only be set on an newly initialized or freshly reset encoder + * because it changes the codec delay. + * + * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution). + * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param [in] channels int: Number of channels (1 or 2) in input signal + * @param [in] application int: Coding mode (one of @ref OPUS_APPLICATION_VOIP, @ref OPUS_APPLICATION_AUDIO, or @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY) + * @param [out] error int*: @ref opus_errorcodes + * @note Regardless of the sampling rate and number channels selected, the Opus encoder + * can switch to a lower audio bandwidth or number of channels if the bitrate + * selected is too low. This also means that it is safe to always use 48 kHz stereo input + * and let the encoder optimize the encoding. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create( + opus_int32 Fs, + int channels, + int application, + int *error +); + +/** Initializes a previously allocated encoder state + * The memory pointed to by st must be at least the size returned by opus_encoder_get_size(). + * This is intended for applications which use their own allocator instead of malloc. + * @see opus_encoder_create(),opus_encoder_get_size() + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @param [in] st OpusEncoder*: Encoder state + * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param [in] channels int: Number of channels (1 or 2) in input signal + * @param [in] application int: Coding mode (one of OPUS_APPLICATION_VOIP, OPUS_APPLICATION_AUDIO, or OPUS_APPLICATION_RESTRICTED_LOWDELAY) + * @retval #OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_EXPORT int opus_encoder_init( + OpusEncoder *st, + opus_int32 Fs, + int channels, + int application +) OPUS_ARG_NONNULL(1); + +/** Encodes an Opus frame. + * @param [in] st OpusEncoder*: Encoder state + * @param [in] pcm opus_int16*: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16) + * @param [in] frame_size int: Number of samples per channel in the + * input signal. + * This must be an Opus frame size for + * the encoder's sampling rate. + * For example, at 48 kHz the permitted + * values are 120, 240, 480, 960, 1920, + * and 2880. + * Passing in a duration of less than + * 10 ms (480 samples at 48 kHz) will + * prevent the encoder from using the LPC + * or hybrid modes. + * @param [out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode( + OpusEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Encodes an Opus frame from floating point input. + * @param [in] st OpusEncoder*: Encoder state + * @param [in] pcm float*: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0. + * Samples with a range beyond +/-1.0 are supported but will + * be clipped by decoders using the integer API and should + * only be used if it is known that the far end supports + * extended dynamic range. + * length is frame_size*channels*sizeof(float) + * @param [in] frame_size int: Number of samples per channel in the + * input signal. + * This must be an Opus frame size for + * the encoder's sampling rate. + * For example, at 48 kHz the permitted + * values are 120, 240, 480, 960, 1920, + * and 2880. + * Passing in a duration of less than + * 10 ms (480 samples at 48 kHz) will + * prevent the encoder from using the LPC + * or hybrid modes. + * @param [out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float( + OpusEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Frees an OpusEncoder allocated by opus_encoder_create(). + * @param[in] st OpusEncoder*: State to be freed. + */ +OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); + +/** Perform a CTL function on an Opus encoder. + * + * Generally the request and subsequent arguments are generated + * by a convenience macro. + * @param st OpusEncoder*: Encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls or + * @ref opus_encoderctls. + * @see opus_genericctls + * @see opus_encoderctls + */ +OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); +/**@}*/ + +/** @defgroup opus_decoder Opus Decoder + * @{ + * + * @brief This page describes the process and functions used to decode Opus. + * + * The decoding process also starts with creating a decoder + * state. This can be done with: + * @code + * int error; + * OpusDecoder *dec; + * dec = opus_decoder_create(Fs, channels, &error); + * @endcode + * where + * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000 + * @li channels is the number of channels (1 or 2) + * @li error will hold the error code in case of failure (or #OPUS_OK on success) + * @li the return value is a newly created decoder state to be used for decoding + * + * While opus_decoder_create() allocates memory for the state, it's also possible + * to initialize pre-allocated memory: + * @code + * int size; + * int error; + * OpusDecoder *dec; + * size = opus_decoder_get_size(channels); + * dec = malloc(size); + * error = opus_decoder_init(dec, Fs, channels); + * @endcode + * where opus_decoder_get_size() returns the required size for the decoder state. Note that + * future versions of this code may change the size, so no assumptions should be made about it. + * + * The decoder state is always continuous in memory and only a shallow copy is sufficient + * to copy it (e.g. memcpy()) + * + * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: + * @code + * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); + * @endcode + * where + * + * @li packet is the byte array containing the compressed data + * @li len is the exact number of bytes contained in the packet + * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float()) + * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array + * + * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet. + * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio + * buffer is too small to hold the decoded audio. + * + * Opus is a stateful codec with overlapping blocks and as a result Opus + * packets are not coded independently of each other. Packets must be + * passed into the decoder serially and in the correct order for a correct + * decode. Lost packets can be replaced with loss concealment by calling + * the decoder with a null pointer and zero length for the missing packet. + * + * A single codec state may only be accessed from a single thread at + * a time and any required locking must be performed by the caller. Separate + * streams must be decoded with separate decoder states and can be decoded + * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK + * defined. + * + */ + +/** Opus decoder state. + * This contains the complete state of an Opus decoder. + * It is position independent and can be freely copied. + * @see opus_decoder_create,opus_decoder_init + */ +typedef struct OpusDecoder OpusDecoder; + +/** Opus DRED decoder. + * This contains the complete state of an Opus DRED decoder. + * It is position independent and can be freely copied. + * @see opus_dred_decoder_create,opus_dred_decoder_init + */ +typedef struct OpusDREDDecoder OpusDREDDecoder; + + +/** Opus DRED state. + * This contains the complete state of an Opus DRED packet. + * It is position independent and can be freely copied. + * @see opus_dred_create,opus_dred_init + */ +typedef struct OpusDRED OpusDRED; + +/** Gets the size of an OpusDecoder structure. + * @param [in] channels int: Number of channels. + * This must be 1 or 2. + * @returns The size in bytes. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels); + +/** Allocates and initializes a decoder state. + * @param [in] Fs opus_int32: Sample rate to decode at (Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param [in] channels int: Number of channels (1 or 2) to decode + * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes + * + * Internally Opus stores data at 48000 Hz, so that should be the default + * value for Fs. However, the decoder can efficiently decode to buffers + * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use + * data at the full sample rate, or knows the compressed data doesn't + * use the full frequency range, it can request decoding at a reduced + * rate. Likewise, the decoder is capable of filling in either mono or + * interleaved stereo pcm buffers, at the caller's request. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create( + opus_int32 Fs, + int channels, + int *error +); + +/** Initializes a previously allocated decoder state. + * The state must be at least the size returned by opus_decoder_get_size(). + * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @param [in] st OpusDecoder*: Decoder state. + * @param [in] Fs opus_int32: Sampling rate to decode to (Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param [in] channels int: Number of channels (1 or 2) to decode + * @retval #OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_EXPORT int opus_decoder_init( + OpusDecoder *st, + opus_int32 Fs, + int channels +) OPUS_ARG_NONNULL(1); + +/** Decode an Opus packet. + * @param [in] st OpusDecoder*: Decoder state + * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss + * @param [in] len opus_int32: Number of bytes in payload* + * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(opus_int16) + * @param [in] frame_size Number of samples per channel of available space in \a pcm. + * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will + * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), + * then frame_size needs to be exactly the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and + * FEC cases, frame_size must be a multiple of 2.5 ms. + * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be + * decoded. If no such data is available, the frame is decoded as if it were lost. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode( + OpusDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Decode an Opus packet with floating point output. + * @param [in] st OpusDecoder*: Decoder state + * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss + * @param [in] len opus_int32: Number of bytes in payload + * @param [out] pcm float*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(float) + * @param [in] frame_size Number of samples per channel of available space in \a pcm. + * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will + * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), + * then frame_size needs to be exactly the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and + * FEC cases, frame_size must be a multiple of 2.5 ms. + * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be + * decoded. If no such data is available the frame is decoded as if it were lost. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float( + OpusDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Perform a CTL function on an Opus decoder. + * + * Generally the request and subsequent arguments are generated + * by a convenience macro. + * @param st OpusDecoder*: Decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls or + * @ref opus_decoderctls. + * @see opus_genericctls + * @see opus_decoderctls + */ +OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + +/** Frees an OpusDecoder allocated by opus_decoder_create(). + * @param[in] st OpusDecoder*: State to be freed. + */ +OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); + +/** Gets the size of an OpusDREDDecoder structure. + * @returns The size in bytes. + */ +OPUS_EXPORT int opus_dred_decoder_get_size(void); + +/** Allocates and initializes an OpusDREDDecoder state. + * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_EXPORT OpusDREDDecoder *opus_dred_decoder_create(int *error); + +/** Initializes an OpusDREDDecoder state. + * @param[in] dec OpusDREDDecoder*: State to be initialized. + */ +OPUS_EXPORT int opus_dred_decoder_init(OpusDREDDecoder *dec); + +/** Frees an OpusDREDDecoder allocated by opus_dred_decoder_create(). + * @param[in] dec OpusDREDDecoder*: State to be freed. + */ +OPUS_EXPORT void opus_dred_decoder_destroy(OpusDREDDecoder *dec); + +/** Perform a CTL function on an Opus DRED decoder. + * + * Generally the request and subsequent arguments are generated + * by a convenience macro. + * @param dred_dec OpusDREDDecoder*: DRED Decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls or + * @ref opus_decoderctls. + * @see opus_genericctls + * @see opus_decoderctls + */ +OPUS_EXPORT int opus_dred_decoder_ctl(OpusDREDDecoder *dred_dec, int request, ...); + +/** Gets the size of an OpusDRED structure. + * @returns The size in bytes. + */ +OPUS_EXPORT int opus_dred_get_size(void); + +/** Allocates and initializes a DRED state. + * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_EXPORT OpusDRED *opus_dred_alloc(int *error); + +/** Frees an OpusDRED allocated by opus_dred_create(). + * @param[in] dec OpusDRED*: State to be freed. + */ +OPUS_EXPORT void opus_dred_free(OpusDRED *dec); + +/** Decode an Opus DRED packet. + * @param [in] dred_dec OpusDRED*: DRED Decoder state + * @param [in] dred OpusDRED*: DRED state + * @param [in] data char*: Input payload + * @param [in] len opus_int32: Number of bytes in payload + * @param [in] max_dred_samples opus_int32: Maximum number of DRED samples that may be needed (if available in the packet). + * @param [in] sampling_rate opus_int32: Sampling rate used for max_dred_samples argument. Needs not match the actual sampling rate of the decoder. + * @param [out] dred_end opus_int32*: Number of non-encoded (silence) samples between the DRED timestamp and the last DRED sample. + * @param [in] defer_processing int: Flag (0 or 1). If set to one, the CPU-intensive part of the DRED decoding is deferred until opus_dred_process() is called. + * @returns Offset (positive) of the first decoded DRED samples, zero if no DRED is present, or @ref opus_errorcodes + */ +OPUS_EXPORT int opus_dred_parse(OpusDREDDecoder *dred_dec, OpusDRED *dred, const unsigned char *data, opus_int32 len, opus_int32 max_dred_samples, opus_int32 sampling_rate, int *dred_end, int defer_processing) OPUS_ARG_NONNULL(1); + +/** Finish decoding an Opus DRED packet. The function only needs to be called if opus_dred_parse() was called with defer_processing=1. + * The source and destination will often be the same DRED state. + * @param [in] dred_dec OpusDRED*: DRED Decoder state + * @param [in] src OpusDRED*: Source DRED state to start the processing from. + * @param [out] dst OpusDRED*: Destination DRED state to store the updated state after processing. + * @returns @ref opus_errorcodes + */ +OPUS_EXPORT int opus_dred_process(OpusDREDDecoder *dred_dec, const OpusDRED *src, OpusDRED *dst); + +/** Decode audio from an Opus DRED packet with floating point output. + * @param [in] st OpusDecoder*: Decoder state + * @param [in] dred OpusDRED*: DRED state + * @param [in] dred_offset opus_int32: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet). + * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(opus_int16) + * @param [in] frame_size Number of samples per channel to decode in \a pcm. + * frame_size must be a multiple of 2.5 ms. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_EXPORT int opus_decoder_dred_decode(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int16 *pcm, opus_int32 frame_size); + +/** Decode audio from an Opus DRED packet with floating point output. + * @param [in] st OpusDecoder*: Decoder state + * @param [in] dred OpusDRED*: DRED state + * @param [in] dred_offset opus_int32: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet). + * @param [out] pcm float*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(float) + * @param [in] frame_size Number of samples per channel to decode in \a pcm. + * frame_size must be a multiple of 2.5 ms. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_EXPORT int opus_decoder_dred_decode_float(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, float *pcm, opus_int32 frame_size); + + +/** Parse an opus packet into one or more frames. + * Opus_decode will perform this operation internally so most applications do + * not need to use this function. + * This function does not copy the frames, the returned pointers are pointers into + * the input packet. + * @param [in] data char*: Opus packet to be parsed + * @param [in] len opus_int32: size of data + * @param [out] out_toc char*: TOC pointer + * @param [out] frames char*[48] encapsulated frames + * @param [out] size opus_int16[48] sizes of the encapsulated frames + * @param [out] payload_offset int*: returns the position of the payload within the packet (in bytes) + * @returns number of frames + */ +OPUS_EXPORT int opus_packet_parse( + const unsigned char *data, + opus_int32 len, + unsigned char *out_toc, + const unsigned char *frames[48], + opus_int16 size[48], + int *payload_offset +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); + +/** Gets the bandwidth of an Opus packet. + * @param [in] data char*: Opus packet + * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) + * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) + * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) + * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) + * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1); + +/** Gets the number of samples per frame from an Opus packet. + * @param [in] data char*: Opus packet. + * This must contain at least one byte of + * data. + * @param [in] Fs opus_int32: Sampling rate in Hz. + * This must be a multiple of 400, or + * inaccurate results will be returned. + * @returns Number of samples per frame. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1); + +/** Gets the number of channels from an Opus packet. + * @param [in] data char*: Opus packet + * @returns Number of channels + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1); + +/** Gets the number of frames in an Opus packet. + * @param [in] packet char*: Opus packet + * @param [in] len opus_int32: Length of packet + * @returns Number of frames + * @retval OPUS_BAD_ARG Insufficient data was passed to the function + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1); + +/** Gets the number of samples of an Opus packet. + * @param [in] packet char*: Opus packet + * @param [in] len opus_int32: Length of packet + * @param [in] Fs opus_int32: Sampling rate in Hz. + * This must be a multiple of 400, or + * inaccurate results will be returned. + * @returns Number of samples + * @retval OPUS_BAD_ARG Insufficient data was passed to the function + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1); + +/** Checks whether an Opus packet has LBRR. + * @param [in] packet char*: Opus packet + * @param [in] len opus_int32: Length of packet + * @returns 1 is LBRR is present, 0 otherwise + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_has_lbrr(const unsigned char packet[], opus_int32 len); + +/** Gets the number of samples of an Opus packet. + * @param [in] dec OpusDecoder*: Decoder state + * @param [in] packet char*: Opus packet + * @param [in] len opus_int32: Length of packet + * @returns Number of samples + * @retval OPUS_BAD_ARG Insufficient data was passed to the function + * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +/** Applies soft-clipping to bring a float signal within the [-1,1] range. If + * the signal is already in that range, nothing is done. If there are values + * outside of [-1,1], then the signal is clipped as smoothly as possible to + * both fit in the range and avoid creating excessive distortion in the + * process. + * @param [in,out] pcm float*: Input PCM and modified PCM + * @param [in] frame_size int Number of samples per channel to process + * @param [in] channels int: Number of channels + * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) + */ +OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); + + +/**@}*/ + +/** @defgroup opus_repacketizer Repacketizer + * @{ + * + * The repacketizer can be used to merge multiple Opus packets into a single + * packet or alternatively to split Opus packets that have previously been + * merged. Splitting valid Opus packets is always guaranteed to succeed, + * whereas merging valid packets only succeeds if all frames have the same + * mode, bandwidth, and frame size, and when the total duration of the merged + * packet is no more than 120 ms. The 120 ms limit comes from the + * specification and limits decoder memory requirements at a point where + * framing overhead becomes negligible. + * + * The repacketizer currently only operates on elementary Opus + * streams. It will not manipualte multistream packets successfully, except in + * the degenerate case where they consist of data from a single stream. + * + * The repacketizing process starts with creating a repacketizer state, either + * by calling opus_repacketizer_create() or by allocating the memory yourself, + * e.g., + * @code + * OpusRepacketizer *rp; + * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size()); + * if (rp != NULL) + * opus_repacketizer_init(rp); + * @endcode + * + * Then the application should submit packets with opus_repacketizer_cat(), + * extract new packets with opus_repacketizer_out() or + * opus_repacketizer_out_range(), and then reset the state for the next set of + * input packets via opus_repacketizer_init(). + * + * For example, to split a sequence of packets into individual frames: + * @code + * unsigned char *data; + * int len; + * while (get_next_packet(&data, &len)) + * { + * unsigned char out[1276]; + * opus_int32 out_len; + * int nb_frames; + * int err; + * int i; + * err = opus_repacketizer_cat(rp, data, len); + * if (err != OPUS_OK) + * { + * release_packet(data); + * return err; + * } + * nb_frames = opus_repacketizer_get_nb_frames(rp); + * for (i = 0; i < nb_frames; i++) + * { + * out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out)); + * if (out_len < 0) + * { + * release_packet(data); + * return (int)out_len; + * } + * output_next_packet(out, out_len); + * } + * opus_repacketizer_init(rp); + * release_packet(data); + * } + * @endcode + * + * Alternatively, to combine a sequence of frames into packets that each + * contain up to TARGET_DURATION_MS milliseconds of data: + * @code + * // The maximum number of packets with duration TARGET_DURATION_MS occurs + * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5) + * // packets. + * unsigned char *data[(TARGET_DURATION_MS*2/5)+1]; + * opus_int32 len[(TARGET_DURATION_MS*2/5)+1]; + * int nb_packets; + * unsigned char out[1277*(TARGET_DURATION_MS*2/2)]; + * opus_int32 out_len; + * int prev_toc; + * nb_packets = 0; + * while (get_next_packet(data+nb_packets, len+nb_packets)) + * { + * int nb_frames; + * int err; + * nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]); + * if (nb_frames < 1) + * { + * release_packets(data, nb_packets+1); + * return nb_frames; + * } + * nb_frames += opus_repacketizer_get_nb_frames(rp); + * // If adding the next packet would exceed our target, or it has an + * // incompatible TOC sequence, output the packets we already have before + * // submitting it. + * // N.B., The nb_packets > 0 check ensures we've submitted at least one + * // packet since the last call to opus_repacketizer_init(). Otherwise a + * // single packet longer than TARGET_DURATION_MS would cause us to try to + * // output an (invalid) empty packet. It also ensures that prev_toc has + * // been set to a valid value. Additionally, len[nb_packets] > 0 is + * // guaranteed by the call to opus_packet_get_nb_frames() above, so the + * // reference to data[nb_packets][0] should be valid. + * if (nb_packets > 0 && ( + * ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) || + * opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames > + * TARGET_DURATION_MS*48)) + * { + * out_len = opus_repacketizer_out(rp, out, sizeof(out)); + * if (out_len < 0) + * { + * release_packets(data, nb_packets+1); + * return (int)out_len; + * } + * output_next_packet(out, out_len); + * opus_repacketizer_init(rp); + * release_packets(data, nb_packets); + * data[0] = data[nb_packets]; + * len[0] = len[nb_packets]; + * nb_packets = 0; + * } + * err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]); + * if (err != OPUS_OK) + * { + * release_packets(data, nb_packets+1); + * return err; + * } + * prev_toc = data[nb_packets][0]; + * nb_packets++; + * } + * // Output the final, partial packet. + * if (nb_packets > 0) + * { + * out_len = opus_repacketizer_out(rp, out, sizeof(out)); + * release_packets(data, nb_packets); + * if (out_len < 0) + * return (int)out_len; + * output_next_packet(out, out_len); + * } + * @endcode + * + * An alternate way of merging packets is to simply call opus_repacketizer_cat() + * unconditionally until it fails. At that point, the merged packet can be + * obtained with opus_repacketizer_out() and the input packet for which + * opus_repacketizer_cat() needs to be re-added to a newly reinitialized + * repacketizer state. + */ + +typedef struct OpusRepacketizer OpusRepacketizer; + +/** Gets the size of an OpusRepacketizer structure. + * @returns The size in bytes. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void); + +/** (Re)initializes a previously allocated repacketizer state. + * The state must be at least the size returned by opus_repacketizer_get_size(). + * This can be used for applications which use their own allocator instead of + * malloc(). + * It must also be called to reset the queue of packets waiting to be + * repacketized, which is necessary if the maximum packet duration of 120 ms + * is reached or if you wish to submit packets with a different Opus + * configuration (coding mode, audio bandwidth, frame size, or channel count). + * Failure to do so will prevent a new packet from being added with + * opus_repacketizer_cat(). + * @see opus_repacketizer_create + * @see opus_repacketizer_get_size + * @see opus_repacketizer_cat + * @param rp OpusRepacketizer*: The repacketizer state to + * (re)initialize. + * @returns A pointer to the same repacketizer state that was passed in. + */ +OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); + +/** Allocates memory and initializes the new repacketizer with + * opus_repacketizer_init(). + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void); + +/** Frees an OpusRepacketizer allocated by + * opus_repacketizer_create(). + * @param[in] rp OpusRepacketizer*: State to be freed. + */ +OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); + +/** Add a packet to the current repacketizer state. + * This packet must match the configuration of any packets already submitted + * for repacketization since the last call to opus_repacketizer_init(). + * This means that it must have the same coding mode, audio bandwidth, frame + * size, and channel count. + * This can be checked in advance by examining the top 6 bits of the first + * byte of the packet, and ensuring they match the top 6 bits of the first + * byte of any previously submitted packet. + * The total duration of audio in the repacketizer state also must not exceed + * 120 ms, the maximum duration of a single packet, after adding this packet. + * + * The contents of the current repacketizer state can be extracted into new + * packets using opus_repacketizer_out() or opus_repacketizer_out_range(). + * + * In order to add a packet with a different configuration or to add more + * audio beyond 120 ms, you must clear the repacketizer state by calling + * opus_repacketizer_init(). + * If a packet is too large to add to the current repacketizer state, no part + * of it is added, even if it contains multiple frames, some of which might + * fit. + * If you wish to be able to add parts of such packets, you should first use + * another repacketizer to split the packet into pieces and add them + * individually. + * @see opus_repacketizer_out_range + * @see opus_repacketizer_out + * @see opus_repacketizer_init + * @param rp OpusRepacketizer*: The repacketizer state to which to + * add the packet. + * @param[in] data const unsigned char*: The packet data. + * The application must ensure + * this pointer remains valid + * until the next call to + * opus_repacketizer_init() or + * opus_repacketizer_destroy(). + * @param len opus_int32: The number of bytes in the packet data. + * @returns An error code indicating whether or not the operation succeeded. + * @retval #OPUS_OK The packet's contents have been added to the repacketizer + * state. + * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence, + * the packet's TOC sequence was not compatible + * with previously submitted packets (because + * the coding mode, audio bandwidth, frame size, + * or channel count did not match), or adding + * this packet would increase the total amount of + * audio stored in the repacketizer state to more + * than 120 ms. + */ +OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + + +/** Construct a new packet from data previously submitted to the repacketizer + * state via opus_repacketizer_cat(). + * @param rp OpusRepacketizer*: The repacketizer state from which to + * construct the new packet. + * @param begin int: The index of the first frame in the current + * repacketizer state to include in the output. + * @param end int: One past the index of the last frame in the + * current repacketizer state to include in the + * output. + * @param[out] data const unsigned char*: The buffer in which to + * store the output packet. + * @param maxlen opus_int32: The maximum number of bytes to store in + * the output buffer. In order to guarantee + * success, this should be at least + * 1276 for a single frame, + * or for multiple frames, + * 1277*(end-begin). + * However, 1*(end-begin) plus + * the size of all packet data submitted to + * the repacketizer since the last call to + * opus_repacketizer_init() or + * opus_repacketizer_create() is also + * sufficient, and possibly much smaller. + * @returns The total size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG [begin,end) was an invalid range of + * frames (begin < 0, begin >= end, or end > + * opus_repacketizer_get_nb_frames()). + * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the + * complete output packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Return the total number of frames contained in packet data submitted to + * the repacketizer state so far via opus_repacketizer_cat() since the last + * call to opus_repacketizer_init() or opus_repacketizer_create(). + * This defines the valid range of packets that can be extracted with + * opus_repacketizer_out_range() or opus_repacketizer_out(). + * @param rp OpusRepacketizer*: The repacketizer state containing the + * frames. + * @returns The total number of frames contained in the packet data submitted + * to the repacketizer state. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); + +/** Construct a new packet from data previously submitted to the repacketizer + * state via opus_repacketizer_cat(). + * This is a convenience routine that returns all the data submitted so far + * in a single packet. + * It is equivalent to calling + * @code + * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp), + * data, maxlen) + * @endcode + * @param rp OpusRepacketizer*: The repacketizer state from which to + * construct the new packet. + * @param[out] data const unsigned char*: The buffer in which to + * store the output packet. + * @param maxlen opus_int32: The maximum number of bytes to store in + * the output buffer. In order to guarantee + * success, this should be at least + * 1277*opus_repacketizer_get_nb_frames(rp). + * However, + * 1*opus_repacketizer_get_nb_frames(rp) + * plus the size of all packet data + * submitted to the repacketizer since the + * last call to opus_repacketizer_init() or + * opus_repacketizer_create() is also + * sufficient, and possibly much smaller. + * @returns The total size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the + * complete output packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); + +/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); + +/** Remove all padding from a given Opus packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); + +/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); + +/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_H */ diff --git a/src/libopus/include/opus_custom.h b/src/libopus/include/opus_custom.h new file mode 100644 index 00000000..2f22d4b3 --- /dev/null +++ b/src/libopus/include/opus_custom.h @@ -0,0 +1,343 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008-2012 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/** + @file opus_custom.h + @brief Opus-Custom reference implementation API + */ + +#ifndef OPUS_CUSTOM_H +#define OPUS_CUSTOM_H + +#include "opus_defines.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef CUSTOM_MODES +# define OPUS_CUSTOM_EXPORT OPUS_EXPORT +# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT +#else +# define OPUS_CUSTOM_EXPORT +# ifdef OPUS_BUILD +# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_INLINE +# else +# define OPUS_CUSTOM_EXPORT_STATIC +# endif +#endif + +/** @defgroup opus_custom Opus Custom + * @{ + * Opus Custom is an optional part of the Opus specification and + * reference implementation which uses a distinct API from the regular + * API and supports frame sizes that are not normally supported.\ Use + * of Opus Custom is discouraged for all but very special applications + * for which a frame size different from 2.5, 5, 10, or 20 ms is needed + * (for either complexity or latency reasons) and where interoperability + * is less important. + * + * In addition to the interoperability limitations the use of Opus custom + * disables a substantial chunk of the codec and generally lowers the + * quality available at a given bitrate. Normally when an application needs + * a different frame size from the codec it should buffer to match the + * sizes but this adds a small amount of delay which may be important + * in some very low latency applications. Some transports (especially + * constant rate RF transports) may also work best with frames of + * particular durations. + * + * Libopus only supports custom modes if they are enabled at compile time. + * + * The Opus Custom API is similar to the regular API but the + * @ref opus_encoder_create and @ref opus_decoder_create calls take + * an additional mode parameter which is a structure produced by + * a call to @ref opus_custom_mode_create. Both the encoder and decoder + * must create a mode using the same sample rate (fs) and frame size + * (frame size) so these parameters must either be signaled out of band + * or fixed in a particular implementation. + * + * Similar to regular Opus the custom modes support on the fly frame size + * switching, but the sizes available depend on the particular frame size in + * use. For some initial frame sizes on a single on the fly size is available. + */ + +/** Contains the state of an encoder. One encoder state is needed + for each stream. It is initialized once at the beginning of the + stream. Do *not* re-initialize the state for every frame. + @brief Encoder state + */ +typedef struct OpusCustomEncoder OpusCustomEncoder; + +/** State of the decoder. One decoder state is needed for each stream. + It is initialized once at the beginning of the stream. Do *not* + re-initialize the state for every frame. + @brief Decoder state + */ +typedef struct OpusCustomDecoder OpusCustomDecoder; + +/** The mode contains all the information necessary to create an + encoder. Both the encoder and decoder need to be initialized + with exactly the same mode, otherwise the output will be + corrupted. The mode MUST NOT BE DESTROYED until the encoders and + decoders that use it are destroyed as well. + @brief Mode configuration + */ +typedef struct OpusCustomMode OpusCustomMode; + +/** Creates a new mode struct. This will be passed to an encoder or + * decoder. The mode MUST NOT BE DESTROYED until the encoders and + * decoders that use it are destroyed as well. + * @param [in] Fs int: Sampling rate (8000 to 96000 Hz) + * @param [in] frame_size int: Number of samples (per channel) to encode in each + * packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes) + * @param [out] error int*: Returned error code (if NULL, no error will be returned) + * @return A newly created mode + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error); + +/** Destroys a mode struct. Only call this after all encoders and + * decoders using this mode are destroyed as well. + * @param [in] mode OpusCustomMode*: Mode to be freed. + */ +OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode); + + +#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C) + +/* Encoder */ +/** Gets the size of an OpusCustomEncoder structure. + * @param [in] mode OpusCustomMode *: Mode configuration + * @param [in] channels int: Number of channels + * @returns size + */ +OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size( + const OpusCustomMode *mode, + int channels +) OPUS_ARG_NONNULL(1); + +# ifdef CUSTOM_MODES +/** Initializes a previously allocated encoder state + * The memory pointed to by st must be the size returned by opus_custom_encoder_get_size. + * This is intended for applications which use their own allocator instead of malloc. + * @see opus_custom_encoder_create(),opus_custom_encoder_get_size() + * To reset a previously initialized state use the OPUS_RESET_STATE CTL. + * @param [in] st OpusCustomEncoder*: Encoder state + * @param [in] mode OpusCustomMode *: Contains all the information about the characteristics of + * the stream (must be the same characteristics as used for the + * decoder) + * @param [in] channels int: Number of channels + * @return OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_CUSTOM_EXPORT int opus_custom_encoder_init( + OpusCustomEncoder *st, + const OpusCustomMode *mode, + int channels +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); +# endif +#endif + + +/** Creates a new encoder state. Each stream needs its own encoder + * state (can't be shared across simultaneous streams). + * @param [in] mode OpusCustomMode*: Contains all the information about the characteristics of + * the stream (must be the same characteristics as used for the + * decoder) + * @param [in] channels int: Number of channels + * @param [out] error int*: Returns an error code + * @return Newly created encoder state. +*/ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create( + const OpusCustomMode *mode, + int channels, + int *error +) OPUS_ARG_NONNULL(1); + + +/** Destroys an encoder state. + * @param[in] st OpusCustomEncoder*: State to be freed. + */ +OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st); + +/** Encodes a frame of audio. + * @param [in] st OpusCustomEncoder*: Encoder state + * @param [in] pcm float*: PCM audio in float format, with a normal range of +/-1.0. + * Samples with a range beyond +/-1.0 are supported but will + * be clipped by decoders using the integer API and should + * only be used if it is known that the far end supports + * extended dynamic range. There must be exactly + * frame_size samples per channel. + * @param [in] frame_size int: Number of samples per frame of input signal + * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long. + * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame + * (can change from one frame to another) + * @return Number of bytes written to "compressed". + * If negative, an error has occurred (see error codes). It is IMPORTANT that + * the length returned be somehow transmitted to the decoder. Otherwise, no + * decoding is possible. + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float( + OpusCustomEncoder *st, + const float *pcm, + int frame_size, + unsigned char *compressed, + int maxCompressedBytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Encodes a frame of audio. + * @param [in] st OpusCustomEncoder*: Encoder state + * @param [in] pcm opus_int16*: PCM audio in signed 16-bit format (native endian). + * There must be exactly frame_size samples per channel. + * @param [in] frame_size int: Number of samples per frame of input signal + * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long. + * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame + * (can change from one frame to another) + * @return Number of bytes written to "compressed". + * If negative, an error has occurred (see error codes). It is IMPORTANT that + * the length returned be somehow transmitted to the decoder. Otherwise, no + * decoding is possible. + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode( + OpusCustomEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *compressed, + int maxCompressedBytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Perform a CTL function on an Opus custom encoder. + * + * Generally the request and subsequent arguments are generated + * by a convenience macro. + * @see opus_encoderctls + */ +OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1); + + +#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C) +/* Decoder */ + +/** Gets the size of an OpusCustomDecoder structure. + * @param [in] mode OpusCustomMode *: Mode configuration + * @param [in] channels int: Number of channels + * @returns size + */ +OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size( + const OpusCustomMode *mode, + int channels +) OPUS_ARG_NONNULL(1); + +/** Initializes a previously allocated decoder state + * The memory pointed to by st must be the size returned by opus_custom_decoder_get_size. + * This is intended for applications which use their own allocator instead of malloc. + * @see opus_custom_decoder_create(),opus_custom_decoder_get_size() + * To reset a previously initialized state use the OPUS_RESET_STATE CTL. + * @param [in] st OpusCustomDecoder*: Decoder state + * @param [in] mode OpusCustomMode *: Contains all the information about the characteristics of + * the stream (must be the same characteristics as used for the + * encoder) + * @param [in] channels int: Number of channels + * @return OPUS_OK Success or @ref opus_errorcodes + */ +OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init( + OpusCustomDecoder *st, + const OpusCustomMode *mode, + int channels +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +#endif + + +/** Creates a new decoder state. Each stream needs its own decoder state (can't + * be shared across simultaneous streams). + * @param [in] mode OpusCustomMode: Contains all the information about the characteristics of the + * stream (must be the same characteristics as used for the encoder) + * @param [in] channels int: Number of channels + * @param [out] error int*: Returns an error code + * @return Newly created decoder state. + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create( + const OpusCustomMode *mode, + int channels, + int *error +) OPUS_ARG_NONNULL(1); + +/** Destroys a decoder state. + * @param[in] st OpusCustomDecoder*: State to be freed. + */ +OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st); + +/** Decode an opus custom frame with floating point output + * @param [in] st OpusCustomDecoder*: Decoder state + * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss + * @param [in] len int: Number of bytes in payload + * @param [out] pcm float*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(float) + * @param [in] frame_size Number of samples per channel of available space in *pcm. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float( + OpusCustomDecoder *st, + const unsigned char *data, + int len, + float *pcm, + int frame_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Decode an opus custom frame + * @param [in] st OpusCustomDecoder*: Decoder state + * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss + * @param [in] len int: Number of bytes in payload + * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length + * is frame_size*channels*sizeof(opus_int16) + * @param [in] frame_size Number of samples per channel of available space in *pcm. + * @returns Number of decoded samples or @ref opus_errorcodes + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode( + OpusCustomDecoder *st, + const unsigned char *data, + int len, + opus_int16 *pcm, + int frame_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Perform a CTL function on an Opus custom decoder. + * + * Generally the request and subsequent arguments are generated + * by a convenience macro. + * @see opus_genericctls + */ +OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_CUSTOM_H */ diff --git a/src/libopus/include/opus_defines.h b/src/libopus/include/opus_defines.h new file mode 100644 index 00000000..cd8f4dde --- /dev/null +++ b/src/libopus/include/opus_defines.h @@ -0,0 +1,830 @@ +/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited + Written by Jean-Marc Valin and Koen Vos */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/** + * @file opus_defines.h + * @brief Opus reference implementation constants + */ + +#ifndef OPUS_DEFINES_H +#define OPUS_DEFINES_H + +#include "opus_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup opus_errorcodes Error codes + * @{ + */ +/** No error @hideinitializer*/ +#define OPUS_OK 0 +/** One or more invalid/out of range arguments @hideinitializer*/ +#define OPUS_BAD_ARG -1 +/** Not enough bytes allocated in the buffer @hideinitializer*/ +#define OPUS_BUFFER_TOO_SMALL -2 +/** An internal error was detected @hideinitializer*/ +#define OPUS_INTERNAL_ERROR -3 +/** The compressed data passed is corrupted @hideinitializer*/ +#define OPUS_INVALID_PACKET -4 +/** Invalid/unsupported request number @hideinitializer*/ +#define OPUS_UNIMPLEMENTED -5 +/** An encoder or decoder structure is invalid or already freed @hideinitializer*/ +#define OPUS_INVALID_STATE -6 +/** Memory allocation has failed @hideinitializer*/ +#define OPUS_ALLOC_FAIL -7 +/**@}*/ + +/** @cond OPUS_INTERNAL_DOC */ +/**Export control for opus functions */ + +#ifndef OPUS_EXPORT +# if defined(_WIN32) +# if defined(OPUS_BUILD) && defined(DLL_EXPORT) +# define OPUS_EXPORT __declspec(dllexport) +# else +# define OPUS_EXPORT +# endif +# elif defined(__GNUC__) && defined(OPUS_BUILD) +# define OPUS_EXPORT __attribute__ ((visibility ("default"))) +# else +# define OPUS_EXPORT +# endif +#endif + +# if !defined(OPUS_GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define OPUS_GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define OPUS_GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(3,0) +# define OPUS_RESTRICT __restrict__ +# elif (defined(_MSC_VER) && _MSC_VER >= 1400) +# define OPUS_RESTRICT __restrict +# else +# define OPUS_RESTRICT +# endif +#else +# define OPUS_RESTRICT restrict +#endif + +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(2,7) +# define OPUS_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define OPUS_INLINE __inline +# else +# define OPUS_INLINE +# endif +#else +# define OPUS_INLINE inline +#endif + +/**Warning attributes for opus functions + * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out + * some paranoid null checks. */ +#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) +# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) +#else +# define OPUS_WARN_UNUSED_RESULT +#endif +#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) +# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) +#else +# define OPUS_ARG_NONNULL(_x) +#endif + +/** These are the actual Encoder CTL ID numbers. + * They should not be used directly by applications. + * In general, SETs should be even and GETs should be odd.*/ +#define OPUS_SET_APPLICATION_REQUEST 4000 +#define OPUS_GET_APPLICATION_REQUEST 4001 +#define OPUS_SET_BITRATE_REQUEST 4002 +#define OPUS_GET_BITRATE_REQUEST 4003 +#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004 +#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005 +#define OPUS_SET_VBR_REQUEST 4006 +#define OPUS_GET_VBR_REQUEST 4007 +#define OPUS_SET_BANDWIDTH_REQUEST 4008 +#define OPUS_GET_BANDWIDTH_REQUEST 4009 +#define OPUS_SET_COMPLEXITY_REQUEST 4010 +#define OPUS_GET_COMPLEXITY_REQUEST 4011 +#define OPUS_SET_INBAND_FEC_REQUEST 4012 +#define OPUS_GET_INBAND_FEC_REQUEST 4013 +#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014 +#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015 +#define OPUS_SET_DTX_REQUEST 4016 +#define OPUS_GET_DTX_REQUEST 4017 +#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020 +#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021 +#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022 +#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023 +#define OPUS_SET_SIGNAL_REQUEST 4024 +#define OPUS_GET_SIGNAL_REQUEST 4025 +#define OPUS_GET_LOOKAHEAD_REQUEST 4027 +/* #define OPUS_RESET_STATE 4028 */ +#define OPUS_GET_SAMPLE_RATE_REQUEST 4029 +#define OPUS_GET_FINAL_RANGE_REQUEST 4031 +#define OPUS_GET_PITCH_REQUEST 4033 +#define OPUS_SET_GAIN_REQUEST 4034 +#define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */ +#define OPUS_SET_LSB_DEPTH_REQUEST 4036 +#define OPUS_GET_LSB_DEPTH_REQUEST 4037 +#define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039 +#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040 +#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 +#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 +#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 +/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ +#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 +#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 +#define OPUS_GET_IN_DTX_REQUEST 4049 +#define OPUS_SET_DRED_DURATION_REQUEST 4050 +#define OPUS_GET_DRED_DURATION_REQUEST 4051 +#define OPUS_SET_DNN_BLOB_REQUEST 4052 +/*#define OPUS_GET_DNN_BLOB_REQUEST 4053 */ + +/** Defines for the presence of extended APIs. */ +#define OPUS_HAVE_OPUS_PROJECTION_H + +/* Macros to trigger compilation errors when the wrong types are provided to a CTL */ +#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) + +#ifdef DISABLE_PTR_CHECK +/* Disable checks to prevent ubsan from complaining about NULL checks + in test_opus_api. */ +#define __opus_check_int_ptr(ptr) (ptr) +#define __opus_check_uint_ptr(ptr) (ptr) +#define __opus_check_uint8_ptr(ptr) (ptr) +#define __opus_check_val16_ptr(ptr) (ptr) +#define __opus_check_void_ptr(ptr) (ptr) +#else +#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) +#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) +#define __opus_check_uint8_ptr(ptr) ((ptr) + ((ptr) - (opus_uint8*)(ptr))) +#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr))) +#define __opus_check_void_ptr(x) ((void)((void *)0 == (x)), (x)) +#endif +/** @endcond */ + +/** @defgroup opus_ctlvalues Pre-defined values for CTL interface + * @see opus_genericctls, opus_encoderctls + * @{ + */ +/* Values for the various encoder CTLs */ +#define OPUS_AUTO -1000 /**opus_int32: Allowed values: 0-10, inclusive. + * + * @hideinitializer */ +#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_int(x) +/** Gets the encoder's complexity configuration. + * @see OPUS_SET_COMPLEXITY + * @param[out] x opus_int32 *: Returns a value in the range 0-10, + * inclusive. + * @hideinitializer */ +#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_int_ptr(x) + +/** Configures the bitrate in the encoder. + * Rates from 500 to 512000 bits per second are meaningful, as well as the + * special values #OPUS_AUTO and #OPUS_BITRATE_MAX. + * The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much + * rate as it can, which is useful for controlling the rate by adjusting the + * output buffer size. + * @see OPUS_GET_BITRATE + * @param[in] x opus_int32: Bitrate in bits per second. The default + * is determined based on the number of + * channels and the input sampling rate. + * @hideinitializer */ +#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x) +/** Gets the encoder's bitrate configuration. + * @see OPUS_SET_BITRATE + * @param[out] x opus_int32 *: Returns the bitrate in bits per second. + * The default is determined based on the + * number of channels and the input + * sampling rate. + * @hideinitializer */ +#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr(x) + +/** Enables or disables variable bitrate (VBR) in the encoder. + * The configured bitrate may not be met exactly because frames must + * be an integer number of bytes in length. + * @see OPUS_GET_VBR + * @see OPUS_SET_VBR_CONSTRAINT + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Hard CBR. For LPC/hybrid modes at very low bit-rate, this can + * cause noticeable quality degradation.
+ *
1
VBR (default). The exact type of VBR is controlled by + * #OPUS_SET_VBR_CONSTRAINT.
+ *
+ * @hideinitializer */ +#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x) +/** Determine if variable bitrate (VBR) is enabled in the encoder. + * @see OPUS_SET_VBR + * @see OPUS_GET_VBR_CONSTRAINT + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Hard CBR.
+ *
1
VBR (default). The exact type of VBR may be retrieved via + * #OPUS_GET_VBR_CONSTRAINT.
+ *
+ * @hideinitializer */ +#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x) + +/** Enables or disables constrained VBR in the encoder. + * This setting is ignored when the encoder is in CBR mode. + * @warning Only the MDCT mode of Opus currently heeds the constraint. + * Speech mode ignores it completely, hybrid mode may fail to obey it + * if the LPC layer uses more bitrate than the constraint would have + * permitted. + * @see OPUS_GET_VBR_CONSTRAINT + * @see OPUS_SET_VBR + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Unconstrained VBR.
+ *
1
Constrained VBR (default). This creates a maximum of one + * frame of buffering delay assuming a transport with a + * serialization speed of the nominal bitrate.
+ *
+ * @hideinitializer */ +#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_check_int(x) +/** Determine if constrained VBR is enabled in the encoder. + * @see OPUS_SET_VBR_CONSTRAINT + * @see OPUS_GET_VBR + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Unconstrained VBR.
+ *
1
Constrained VBR (default).
+ *
+ * @hideinitializer */ +#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_check_int_ptr(x) + +/** Configures mono/stereo forcing in the encoder. + * This can force the encoder to produce packets encoded as either mono or + * stereo, regardless of the format of the input audio. This is useful when + * the caller knows that the input signal is currently a mono source embedded + * in a stereo stream. + * @see OPUS_GET_FORCE_CHANNELS + * @param[in] x opus_int32: Allowed values: + *
+ *
#OPUS_AUTO
Not forced (default)
+ *
1
Forced mono
+ *
2
Forced stereo
+ *
+ * @hideinitializer */ +#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_check_int(x) +/** Gets the encoder's forced channel configuration. + * @see OPUS_SET_FORCE_CHANNELS + * @param[out] x opus_int32 *: + *
+ *
#OPUS_AUTO
Not forced (default)
+ *
1
Forced mono
+ *
2
Forced stereo
+ *
+ * @hideinitializer */ +#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_check_int_ptr(x) + +/** Configures the maximum bandpass that the encoder will select automatically. + * Applications should normally use this instead of #OPUS_SET_BANDWIDTH + * (leaving that set to the default, #OPUS_AUTO). This allows the + * application to set an upper bound based on the type of input it is + * providing, but still gives the encoder the freedom to reduce the bandpass + * when the bitrate becomes too low, for better overall quality. + * @see OPUS_GET_MAX_BANDWIDTH + * @param[in] x opus_int32: Allowed values: + *
+ *
OPUS_BANDWIDTH_NARROWBAND
4 kHz passband
+ *
OPUS_BANDWIDTH_MEDIUMBAND
6 kHz passband
+ *
OPUS_BANDWIDTH_WIDEBAND
8 kHz passband
+ *
OPUS_BANDWIDTH_SUPERWIDEBAND
12 kHz passband
+ *
OPUS_BANDWIDTH_FULLBAND
20 kHz passband (default)
+ *
+ * @hideinitializer */ +#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_check_int(x) + +/** Gets the encoder's configured maximum allowed bandpass. + * @see OPUS_SET_MAX_BANDWIDTH + * @param[out] x opus_int32 *: Allowed values: + *
+ *
#OPUS_BANDWIDTH_NARROWBAND
4 kHz passband
+ *
#OPUS_BANDWIDTH_MEDIUMBAND
6 kHz passband
+ *
#OPUS_BANDWIDTH_WIDEBAND
8 kHz passband
+ *
#OPUS_BANDWIDTH_SUPERWIDEBAND
12 kHz passband
+ *
#OPUS_BANDWIDTH_FULLBAND
20 kHz passband (default)
+ *
+ * @hideinitializer */ +#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) + +/** Sets the encoder's bandpass to a specific value. + * This prevents the encoder from automatically selecting the bandpass based + * on the available bitrate. If an application knows the bandpass of the input + * audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH + * instead, which still gives the encoder the freedom to reduce the bandpass + * when the bitrate becomes too low, for better overall quality. + * @see OPUS_GET_BANDWIDTH + * @param[in] x opus_int32: Allowed values: + *
+ *
#OPUS_AUTO
(default)
+ *
#OPUS_BANDWIDTH_NARROWBAND
4 kHz passband
+ *
#OPUS_BANDWIDTH_MEDIUMBAND
6 kHz passband
+ *
#OPUS_BANDWIDTH_WIDEBAND
8 kHz passband
+ *
#OPUS_BANDWIDTH_SUPERWIDEBAND
12 kHz passband
+ *
#OPUS_BANDWIDTH_FULLBAND
20 kHz passband
+ *
+ * @hideinitializer */ +#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int(x) + +/** Configures the type of signal being encoded. + * This is a hint which helps the encoder's mode selection. + * @see OPUS_GET_SIGNAL + * @param[in] x opus_int32: Allowed values: + *
+ *
#OPUS_AUTO
(default)
+ *
#OPUS_SIGNAL_VOICE
Bias thresholds towards choosing LPC or Hybrid modes.
+ *
#OPUS_SIGNAL_MUSIC
Bias thresholds towards choosing MDCT modes.
+ *
+ * @hideinitializer */ +#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured signal type. + * @see OPUS_SET_SIGNAL + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
#OPUS_AUTO
(default)
+ *
#OPUS_SIGNAL_VOICE
Bias thresholds towards choosing LPC or Hybrid modes.
+ *
#OPUS_SIGNAL_MUSIC
Bias thresholds towards choosing MDCT modes.
+ *
+ * @hideinitializer */ +#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x) + + +/** Configures the encoder's intended application. + * The initial value is a mandatory argument to the encoder_create function. + * @see OPUS_GET_APPLICATION + * @param[in] x opus_int32: Returns one of the following values: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @hideinitializer */ +#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured application. + * @see OPUS_SET_APPLICATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @hideinitializer */ +#define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the total samples of delay added by the entire codec. + * This can be queried by the encoder and then the provided number of samples can be + * skipped on from the start of the decoder's output to provide time aligned input + * and output. From the perspective of a decoding application the real data begins this many + * samples late. + * + * The decoder contribution to this delay is identical for all decoders, but the + * encoder portion of the delay may vary from implementation to implementation, + * version to version, or even depend on the encoder's initial configuration. + * Applications needing delay compensation should call this CTL rather than + * hard-coding a value. + * @param[out] x opus_int32 *: Number of lookahead samples + * @hideinitializer */ +#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x) + +/** Configures the encoder's use of inband forward error correction (FEC). + * @note This is only applicable to the LPC layer + * @see OPUS_GET_INBAND_FEC + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Disable inband FEC (default).
+ *
1
Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.
+ *
2
Inband FEC enabled, but does not necessarily switch to SILK if we have music.
+ *
+ * @hideinitializer */ +#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_int(x) +/** Gets encoder's configured use of inband forward error correction. + * @see OPUS_SET_INBAND_FEC + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Inband FEC disabled (default).
+ *
1
Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.
+ *
2
Inband FEC enabled, but does not necessarily switch to SILK if we have music.
+ *
+ * @hideinitializer */ +#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x) + +/** Configures the encoder's expected packet loss percentage. + * Higher values trigger progressively more loss resistant behavior in the encoder + * at the expense of quality at a given bitrate in the absence of packet loss, but + * greater quality under loss. + * @see OPUS_GET_PACKET_LOSS_PERC + * @param[in] x opus_int32: Loss percentage in the range 0-100, inclusive (default: 0). + * @hideinitializer */ +#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured packet loss percentage. + * @see OPUS_SET_PACKET_LOSS_PERC + * @param[out] x opus_int32 *: Returns the configured loss percentage + * in the range 0-100, inclusive (default: 0). + * @hideinitializer */ +#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __opus_check_int_ptr(x) + +/** Configures the encoder's use of discontinuous transmission (DTX). + * @note This is only applicable to the LPC layer + * @see OPUS_GET_DTX + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Disable DTX (default).
+ *
1
Enabled DTX.
+ *
+ * @hideinitializer */ +#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x) +/** Gets encoder's configured use of discontinuous transmission. + * @see OPUS_SET_DTX + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
DTX disabled (default).
+ *
1
DTX enabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) +/** Configures the depth of signal being encoded. + * + * This is a hint which helps the encoder identify silence and near-silence. + * It represents the number of significant bits of linear intensity below + * which the signal contains ignorable quantization or other noise. + * + * For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting + * for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate + * for 16-bit linear pcm input with opus_encode_float(). + * + * When using opus_encode() instead of opus_encode_float(), or when libopus + * is compiled for fixed-point, the encoder uses the minimum of the value + * set here and the value 16. + * + * @see OPUS_GET_LSB_DEPTH + * @param[in] x opus_int32: Input precision in bits, between 8 and 24 + * (default: 24). + * @hideinitializer */ +#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured signal depth. + * @see OPUS_SET_LSB_DEPTH + * @param[out] x opus_int32 *: Input precision in bits, between 8 and + * 24 (default: 24). + * @hideinitializer */ +#define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x) + +/** Configures the encoder's use of variable duration frames. + * When variable duration is enabled, the encoder is free to use a shorter frame + * size than the one requested in the opus_encode*() call. + * It is then the user's responsibility + * to verify how much audio was encoded by checking the ToC byte of the encoded + * packet. The part of the audio that was not encoded needs to be resent to the + * encoder for the next call. Do not use this option unless you really + * know what you are doing. + * @see OPUS_GET_EXPERT_FRAME_DURATION + * @param[in] x opus_int32: Allowed values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
+ * @hideinitializer */ +#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured use of variable duration frames. + * @see OPUS_SET_EXPERT_FRAME_DURATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
+ * @hideinitializer */ +#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables almost all use of prediction, making frames almost + * completely independent. This reduces quality. + * @see OPUS_GET_PREDICTION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable prediction (default).
+ *
1
Disable prediction.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured prediction status. + * @see OPUS_SET_PREDICTION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Prediction enabled (default).
+ *
1
Prediction disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) + +/** If non-zero, enables Deep Redundancy (DRED) and use the specified maximum number of 10-ms redundant frames + * @hideinitializer */ +#define OPUS_SET_DRED_DURATION(x) OPUS_SET_DRED_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured Deep Redundancy (DRED) maximum number of frames. + * @hideinitializer */ +#define OPUS_GET_DRED_DURATION(x) OPUS_GET_DRED_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Provide external DNN weights from binary object (only when explicitly built without the weights) + * @hideinitializer */ +#define OPUS_SET_DNN_BLOB(data, len) OPUS_SET_DNN_BLOB_REQUEST, __opus_check_void_ptr(data), __opus_check_int(len) + + +/**@}*/ + +/** @defgroup opus_genericctls Generic CTLs + * + * These macros are used with the \c opus_decoder_ctl and + * \c opus_encoder_ctl calls to generate a particular + * request. + * + * When called on an \c OpusDecoder they apply to that + * particular decoder instance. When called on an + * \c OpusEncoder they apply to the corresponding setting + * on that encoder instance, if present. + * + * Some usage examples: + * + * @code + * int ret; + * opus_int32 pitch; + * ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch)); + * if (ret == OPUS_OK) return ret; + * + * opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE); + * opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE); + * + * opus_int32 enc_bw, dec_bw; + * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw)); + * opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw)); + * if (enc_bw != dec_bw) { + * printf("packet bandwidth mismatch!\n"); + * } + * @endcode + * + * @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls + * @{ + */ + +/** Resets the codec state to be equivalent to a freshly initialized state. + * This should be called when switching streams in order to prevent + * the back to back decoding from giving different results from + * one at a time decoding. + * @hideinitializer */ +#define OPUS_RESET_STATE 4028 + +/** Gets the final state of the codec's entropy coder. + * This is used for testing purposes, + * The encoder and decoder state should be identical after coding a payload + * (assuming no data corruption or software bugs) + * + * @param[out] x opus_uint32 *: Entropy coder state + * + * @hideinitializer */ +#define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x) + +/** Gets the encoder's configured bandpass or the decoder's last bandpass. + * @see OPUS_SET_BANDWIDTH + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
#OPUS_AUTO
(default)
+ *
#OPUS_BANDWIDTH_NARROWBAND
4 kHz passband
+ *
#OPUS_BANDWIDTH_MEDIUMBAND
6 kHz passband
+ *
#OPUS_BANDWIDTH_WIDEBAND
8 kHz passband
+ *
#OPUS_BANDWIDTH_SUPERWIDEBAND
12 kHz passband
+ *
#OPUS_BANDWIDTH_FULLBAND
20 kHz passband
+ *
+ * @hideinitializer */ +#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) + +/** Gets the sampling rate the encoder or decoder was initialized with. + * This simply returns the Fs value passed to opus_encoder_init() + * or opus_decoder_init(). + * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. + * @hideinitializer + */ +#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables the use of phase inversion for intensity stereo, + * improving the quality of mono downmixes, but slightly reducing normal + * stereo quality. Disabling phase inversion in the decoder does not comply + * with RFC 6716, although it does not cause any interoperability issue and + * is expected to become part of the Opus standard once RFC 6716 is updated + * by draft-ietf-codec-opus-update. + * @see OPUS_GET_PHASE_INVERSION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable phase inversion (default).
+ *
1
Disable phase inversion.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured phase inversion status. + * @see OPUS_SET_PHASE_INVERSION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Stereo phase inversion enabled (default).
+ *
1
Stereo phase inversion disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) +/** Gets the DTX state of the encoder. + * Returns whether the last encoded frame was either a comfort noise update + * during DTX or not encoded because of DTX. + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
The encoder is not in DTX.
+ *
1
The encoder is in DTX.
+ *
+ * @hideinitializer */ +#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) + +/**@}*/ + +/** @defgroup opus_decoderctls Decoder related CTLs + * @see opus_genericctls, opus_encoderctls, opus_decoder + * @{ + */ + +/** Configures decoder gain adjustment. + * Scales the decoded output by a factor specified in Q8 dB units. + * This has a maximum range of -32768 to 32767 inclusive, and returns + * OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment. + * This setting survives decoder reset. + * + * gain = pow(10, x/(20.0*256)) + * + * @param[in] x opus_int32: Amount to scale PCM signal by in Q8 dB units. + * @hideinitializer */ +#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x) +/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN + * + * @param[out] x opus_int32 *: Amount to scale PCM signal by in Q8 dB units. + * @hideinitializer */ +#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) + +/** Gets the duration (in samples) of the last packet successfully decoded or concealed. + * @param[out] x opus_int32 *: Number of samples (at current sampling rate). + * @hideinitializer */ +#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the pitch of the last decoded frame, if available. + * This can be used for any post-processing algorithm requiring the use of pitch, + * e.g. time stretching/shortening. If the last frame was not voiced, or if the + * pitch was not coded in the frame, then zero is returned. + * + * This CTL is only implemented for decoder instances. + * + * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) + * + * @hideinitializer */ +#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) + +/**@}*/ + +/** @defgroup opus_libinfo Opus library information functions + * @{ + */ + +/** Converts an opus error code into a human readable string. + * + * @param[in] error int: Error number + * @returns Error string + */ +OPUS_EXPORT const char *opus_strerror(int error); + +/** Gets the libopus version string. + * + * Applications may look for the substring "-fixed" in the version string to + * determine whether they have a fixed-point or floating-point build at + * runtime. + * + * @returns Version string + */ +OPUS_EXPORT const char *opus_get_version_string(void); +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_DEFINES_H */ diff --git a/src/libopus/include/opus_multistream.h b/src/libopus/include/opus_multistream.h new file mode 100644 index 00000000..824cc55a --- /dev/null +++ b/src/libopus/include/opus_multistream.h @@ -0,0 +1,660 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/** + * @file opus_multistream.h + * @brief Opus reference implementation multistream API + */ + +#ifndef OPUS_MULTISTREAM_H +#define OPUS_MULTISTREAM_H + +#include "opus.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** Macros to trigger compilation errors when the wrong types are provided to a + * CTL. */ +/**@{*/ +#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr))) +#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr))) +/**@}*/ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications. + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120 +#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122 +/**@}*/ + +/** @endcond */ + +/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and + * @ref opus_decoderctls may be applied to a multistream encoder or decoder as + * well. + * In addition, you may retrieve the encoder or decoder state for an specific + * stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or + * #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually. + */ +/**@{*/ + +/** Gets the encoder state for an individual stream of a multistream encoder. + * @param[in] x opus_int32: The index of the stream whose encoder you + * wish to retrieve. + * This must be non-negative and less than + * the streams parameter used + * to initialize the encoder. + * @param[out] y OpusEncoder**: Returns a pointer to the given + * encoder state. + * @retval OPUS_BAD_ARG The index of the requested stream was out of range. + * @hideinitializer + */ +#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y) + +/** Gets the decoder state for an individual stream of a multistream decoder. + * @param[in] x opus_int32: The index of the stream whose decoder you + * wish to retrieve. + * This must be non-negative and less than + * the streams parameter used + * to initialize the decoder. + * @param[out] y OpusDecoder**: Returns a pointer to the given + * decoder state. + * @retval OPUS_BAD_ARG The index of the requested stream was out of range. + * @hideinitializer + */ +#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y) + +/**@}*/ + +/** @defgroup opus_multistream Opus Multistream API + * @{ + * + * The multistream API allows individual Opus streams to be combined into a + * single packet, enabling support for up to 255 channels. Unlike an + * elementary Opus stream, the encoder and decoder must negotiate the channel + * configuration before the decoder can successfully interpret the data in the + * packets produced by the encoder. Some basic information, such as packet + * duration, can be computed without any special negotiation. + * + * The format for multistream Opus packets is defined in + * RFC 7845 + * and is based on the self-delimited Opus framing described in Appendix B of + * RFC 6716. + * Normal Opus packets are just a degenerate case of multistream Opus packets, + * and can be encoded or decoded with the multistream API by setting + * streams to 1 when initializing the encoder or + * decoder. + * + * Multistream Opus streams can contain up to 255 elementary Opus streams. + * These may be either "uncoupled" or "coupled", indicating that the decoder + * is configured to decode them to either 1 or 2 channels, respectively. + * The streams are ordered so that all coupled streams appear at the + * beginning. + * + * A mapping table defines which decoded channel i + * should be used for each input/output (I/O) channel j. This table is + * typically provided as an unsigned char array. + * Let i = mapping[j] be the index for I/O channel j. + * If i < 2*coupled_streams, then I/O channel j is + * encoded as the left channel of stream (i/2) if i + * is even, or as the right channel of stream (i/2) if + * i is odd. Otherwise, I/O channel j is encoded as + * mono in stream (i - coupled_streams), unless it has the special + * value 255, in which case it is omitted from the encoding entirely (the + * decoder will reproduce it as silence). Each value i must either + * be the special value 255 or be less than streams + coupled_streams. + * + * The output channels specified by the encoder + * should use the + * Vorbis + * channel ordering. A decoder may wish to apply an additional permutation + * to the mapping the encoder used to achieve a different output channel + * order (e.g. for outputting in WAV order). + * + * Each multistream packet contains an Opus packet for each stream, and all of + * the Opus packets in a single multistream packet must have the same + * duration. Therefore the duration of a multistream packet can be extracted + * from the TOC sequence of the first stream, which is located at the + * beginning of the packet, just like an elementary Opus stream: + * + * @code + * int nb_samples; + * int nb_frames; + * nb_frames = opus_packet_get_nb_frames(data, len); + * if (nb_frames < 1) + * return nb_frames; + * nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames; + * @endcode + * + * The general encoding and decoding process proceeds exactly the same as in + * the normal @ref opus_encoder and @ref opus_decoder APIs. + * See their documentation for an overview of how to use the corresponding + * multistream functions. + */ + +/** Opus multistream encoder state. + * This contains the complete state of a multistream Opus encoder. + * It is position independent and can be freely copied. + * @see opus_multistream_encoder_create + * @see opus_multistream_encoder_init + */ +typedef struct OpusMSEncoder OpusMSEncoder; + +/** Opus multistream decoder state. + * This contains the complete state of a multistream Opus decoder. + * It is position independent and can be freely copied. + * @see opus_multistream_decoder_create + * @see opus_multistream_decoder_init + */ +typedef struct OpusMSDecoder OpusMSDecoder; + +/**\name Multistream encoder functions */ +/**@{*/ + +/** Gets the size of an OpusMSEncoder structure. + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get_size( + int streams, + int coupled_streams +); + +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a multistream encoder state. + * Call opus_multistream_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param[in] mapping const unsigned char[channels]: Mapping from + * encoded channels to input channels, as described in + * @ref opus_multistream. As an extra constraint, the + * multistream encoder does not allow encoding coupled + * streams for which one channel is unused since this + * is never a good idea. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int application, + int *error +) OPUS_ARG_NONNULL(5); + +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + unsigned char *mapping, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + +/** Initialize a previously allocated multistream encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_multistream_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_multistream_encoder_create + * @see opus_multistream_encoder_get_size + * @param st OpusMSEncoder*: Multistream encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param[in] mapping const unsigned char[channels]: Mapping from + * encoded channels to input channels, as described in + * @ref opus_multistream. As an extra constraint, the + * multistream encoder does not allow encoding coupled + * streams for which one channel is unused since this + * is never a good idea. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_multistream_encoder_init( + OpusMSEncoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + +OPUS_EXPORT int opus_multistream_surround_encoder_init( + OpusMSEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + unsigned char *mapping, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); + +/** Encodes a multistream Opus frame. + * @param st OpusMSEncoder*: Multistream encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode( + OpusMSEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Encodes a multistream Opus frame from floating point input. + * @param st OpusMSEncoder*: Multistream encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float( + OpusMSEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + +/** Frees an OpusMSEncoder allocated by + * opus_multistream_encoder_create(). + * @param st OpusMSEncoder*: Multistream encoder state to be freed. + */ +OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st); + +/** Perform a CTL function on a multistream Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusMSEncoder*: Multistream encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, or @ref opus_multistream_ctls. + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + */ +OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + +/**@}*/ + +/**\name Multistream decoder functions */ +/**@{*/ + +/** Gets the size of an OpusMSDecoder structure. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get_size( + int streams, + int coupled_streams +); + +/** Allocates and initializes a multistream decoder state. + * Call opus_multistream_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] mapping const unsigned char[channels]: Mapping from + * coded channels to output channels, as described in + * @ref opus_multistream. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int *error +) OPUS_ARG_NONNULL(5); + +/** Intialize a previously allocated decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_multistream_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_multistream_decoder_create + * @see opus_multistream_deocder_get_size + * @param st OpusMSEncoder*: Multistream encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] mapping const unsigned char[channels]: Mapping from + * coded channels to output channels, as described in + * @ref opus_multistream. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_multistream_decoder_init( + OpusMSDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + +/** Decode a multistream Opus packet. + * @param st OpusMSDecoder*: Multistream decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode( + OpusMSDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Decode a multistream Opus packet with floating point output. + * @param st OpusMSDecoder*: Multistream decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float( + OpusMSDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + +/** Perform a CTL function on a multistream Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusMSDecoder*: Multistream decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, or @ref opus_multistream_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + */ +OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + +/** Frees an OpusMSDecoder allocated by + * opus_multistream_decoder_create(). + * @param st OpusMSDecoder: Multistream decoder state to be freed. + */ +OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st); + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_MULTISTREAM_H */ diff --git a/src/libopus/include/opus_projection.h b/src/libopus/include/opus_projection.h new file mode 100644 index 00000000..9dabf4e8 --- /dev/null +++ b/src/libopus/include/opus_projection.h @@ -0,0 +1,568 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ + +/** + * @file opus_projection.h + * @brief Opus projection reference API + */ + +#ifndef OPUS_PROJECTION_H +#define OPUS_PROJECTION_H + +#include "opus_multistream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications.c + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 +/**@}*/ + + +/** @endcond */ + +/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, + * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a + * projection encoder or decoder as well. + */ +/**@{*/ + +/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format) + * of the demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) + + +/** Gets the size in bytes of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the size in bytes of the + * demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) + + +/** Copies the demixing matrix to the supplied pointer location. + * @param[out] x unsigned char *: Returns the demixing matrix to the + * supplied pointer location. + * @param y opus_int32: The size in bytes of the reserved memory at the + * pointer location. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) + + +/**@}*/ + +/** Opus projection encoder state. + * This contains the complete state of a projection Opus encoder. + * It is position independent and can be freely copied. + * @see opus_projection_ambisonics_encoder_create + */ +typedef struct OpusProjectionEncoder OpusProjectionEncoder; + + +/** Opus projection decoder state. + * This contains the complete state of a projection Opus decoder. + * It is position independent and can be freely copied. + * @see opus_projection_decoder_create + * @see opus_projection_decoder_init + */ +typedef struct OpusProjectionDecoder OpusProjectionDecoder; + + +/**\name Projection encoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionEncoder structure. + * @param channels int: The total number of input channels to encode. + * This must be no more than 255. + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a projection encoder state. + * Call opus_projection_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @param[out] streams int *: The total number of streams that will + * be encoded from the input. + * @param[out] coupled_streams int *: Number of coupled (2 channel) + * streams that will be encoded from the input. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); + + +/** Initialize a previously allocated projection encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_ambisonics_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_ambisonics_encoder_create + * @see opus_projection_ambisonics_encoder_get_size + * @param st OpusProjectionEncoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_ambisonics_encoder_init( + OpusProjectionEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + + +/** Encodes a projection Opus frame. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( + OpusProjectionEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Encodes a projection Opus frame from floating point input. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( + OpusProjectionEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Frees an OpusProjectionEncoder allocated by + * opus_projection_ambisonics_encoder_create(). + * @param st OpusProjectionEncoder*: Projection encoder state to be freed. + */ +OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); + + +/** Perform a CTL function on a projection Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/**@}*/ + +/**\name Projection decoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionDecoder structure. + * @param channels int: The total number of output channels. + * This must be no more than 255. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( + int channels, + int streams, + int coupled_streams +); + + +/** Allocates and initializes a projection decoder state. + * Call opus_projection_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size, + int *error +) OPUS_ARG_NONNULL(5); + + +/** Intialize a previously allocated projection decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_decoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_decoder_create + * @see opus_projection_deocder_get_size + * @param st OpusProjectionDecoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_decoder_init( + OpusProjectionDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + + +/** Decode a projection Opus packet. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Decode a projection Opus packet with floating point output. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Perform a CTL function on a projection Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/** Frees an OpusProjectionDecoder allocated by + * opus_projection_decoder_create(). + * @param st OpusProjectionDecoder: Projection decoder state to be freed. + */ +OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); + + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_PROJECTION_H */ diff --git a/src/libopus/include/opus_types.h b/src/libopus/include/opus_types.h new file mode 100644 index 00000000..7cf67558 --- /dev/null +++ b/src/libopus/include/opus_types.h @@ -0,0 +1,166 @@ +/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ +/* Modified by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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. +*/ +/* opus_types.h based on ogg_types.h from libogg */ + +/** + @file opus_types.h + @brief Opus reference implementation types +*/ +#ifndef OPUS_TYPES_H +#define OPUS_TYPES_H + +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + +/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ +#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#include +# undef opus_int64 +# undef opus_int8 +# undef opus_uint64 +# undef opus_uint8 + typedef int8_t opus_int8; + typedef uint8_t opus_uint8; + typedef int16_t opus_int16; + typedef uint16_t opus_uint16; + typedef int32_t opus_int32; + typedef uint32_t opus_uint32; + typedef int64_t opus_int64; + typedef uint64_t opus_uint64; +#elif defined(_WIN32) + +# if defined(__CYGWIN__) +# include <_G_config.h> + typedef _G_int32_t opus_int32; + typedef _G_uint32_t opus_uint32; + typedef _G_int16 opus_int16; + typedef _G_uint16 opus_uint16; +# elif defined(__MINGW32__) + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef int opus_int32; + typedef unsigned int opus_uint32; +# elif defined(__MWERKS__) + typedef int opus_int32; + typedef unsigned int opus_uint32; + typedef short opus_int16; + typedef unsigned short opus_uint16; +# else + /* MSVC/Borland */ + typedef __int32 opus_int32; + typedef unsigned __int32 opus_uint32; + typedef __int16 opus_int16; + typedef unsigned __int16 opus_uint16; +# endif + +#elif defined(__MACOS__) + +# include + typedef SInt16 opus_int16; + typedef UInt16 opus_uint16; + typedef SInt32 opus_int32; + typedef UInt32 opus_uint32; + +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ + +# include + typedef int16_t opus_int16; + typedef u_int16_t opus_uint16; + typedef int32_t opus_int32; + typedef u_int32_t opus_uint32; + +#elif defined(__BEOS__) + + /* Be */ +# include + typedef int16 opus_int16; + typedef u_int16 opus_uint16; + typedef int32_t opus_int32; + typedef u_int32_t opus_uint32; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef int opus_int32; + typedef unsigned int opus_uint32; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef int opus_int32; + typedef unsigned int opus_uint32; + +#elif defined(R5900) + + /* PS2 EE */ + typedef int opus_int32; + typedef unsigned opus_uint32; + typedef short opus_int16; + typedef unsigned short opus_uint16; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short opus_int16; + typedef unsigned short opus_uint16; + typedef signed int opus_int32; + typedef unsigned int opus_uint32; + +#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) + + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef long opus_int32; + typedef unsigned long opus_uint32; + +#elif defined(CONFIG_TI_C6X) + + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef int opus_int32; + typedef unsigned int opus_uint32; + +#else + + /* Give up, take a reasonable guess */ + typedef short opus_int16; + typedef unsigned short opus_uint16; + typedef int opus_int32; + typedef unsigned int opus_uint32; + +#endif + +#endif /* OPUS_TYPES_H */ diff --git a/src/libopus/silk/A2NLSF.c b/src/libopus/silk/A2NLSF.c new file mode 100644 index 00000000..911315d7 --- /dev/null +++ b/src/libopus/silk/A2NLSF.c @@ -0,0 +1,267 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. +***********************************************************************/ + +/* Conversion between prediction filter coefficients and NLSFs */ +/* Requires the order to be an even number */ +/* A piecewise linear approximation maps LSF <-> cos(LSF) */ +/* Therefore the result is not accurate NLSFs, but the two */ +/* functions are accurate inverses of each other */ + +#ifdef __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "tables.h" + +/* Number of binary divisions, when not in low complexity mode */ +#define BIN_DIV_STEPS_A2NLSF_FIX 3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */ +#define MAX_ITERATIONS_A2NLSF_FIX 16 + +/* Helper function for A2NLSF(..) */ +/* Transforms polynomials from cos(n*f) to cos(f)^n */ +static OPUS_INLINE void silk_A2NLSF_trans_poly( + opus_int32 *p, /* I/O Polynomial */ + const opus_int dd /* I Polynomial order (= filter order / 2 ) */ +) +{ + opus_int k, n; + + for( k = 2; k <= dd; k++ ) { + for( n = dd; n > k; n-- ) { + p[ n - 2 ] -= p[ n ]; + } + p[ k - 2 ] -= silk_LSHIFT( p[ k ], 1 ); + } +} +/* Helper function for A2NLSF(..) */ +/* Polynomial evaluation */ +static OPUS_INLINE opus_int32 silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in Q16 */ + opus_int32 *p, /* I Polynomial, Q16 */ + const opus_int32 x, /* I Evaluation point, Q12 */ + const opus_int dd /* I Order */ +) +{ + opus_int n; + opus_int32 x_Q16, y32; + + y32 = p[ dd ]; /* Q16 */ + x_Q16 = silk_LSHIFT( x, 4 ); + + if ( opus_likely( 8 == dd ) ) + { + y32 = silk_SMLAWW( p[ 7 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 6 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 5 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 4 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 3 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 2 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 1 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 0 ], y32, x_Q16 ); + } + else + { + for( n = dd - 1; n >= 0; n-- ) { + y32 = silk_SMLAWW( p[ n ], y32, x_Q16 ); /* Q16 */ + } + } + return y32; +} + +static OPUS_INLINE void silk_A2NLSF_init( + const opus_int32 *a_Q16, + opus_int32 *P, + opus_int32 *Q, + const opus_int dd +) +{ + opus_int k; + + /* Convert filter coefs to even and odd polynomials */ + P[dd] = silk_LSHIFT( 1, 16 ); + Q[dd] = silk_LSHIFT( 1, 16 ); + for( k = 0; k < dd; k++ ) { + P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; /* Q16 */ + Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; /* Q16 */ + } + + /* Divide out zeros as we have that for even filter orders, */ + /* z = 1 is always a root in Q, and */ + /* z = -1 is always a root in P */ + for( k = dd; k > 0; k-- ) { + P[ k - 1 ] -= P[ k ]; + Q[ k - 1 ] += Q[ k ]; + } + + /* Transform polynomials from cos(n*f) to cos(f)^n */ + silk_A2NLSF_trans_poly( P, dd ); + silk_A2NLSF_trans_poly( Q, dd ); +} + +/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ +/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ +void silk_A2NLSF( + opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ + opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ + const opus_int d /* I Filter order (must be even) */ +) +{ + opus_int i, k, m, dd, root_ix, ffrac; + opus_int32 xlo, xhi, xmid; + opus_int32 ylo, yhi, ymid, thr; + opus_int32 nom, den; + opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ]; + opus_int32 Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; + opus_int32 *PQ[ 2 ]; + opus_int32 *p; + + /* Store pointers to array */ + PQ[ 0 ] = P; + PQ[ 1 ] = Q; + + dd = silk_RSHIFT( d, 1 ); + + silk_A2NLSF_init( a_Q16, P, Q, dd ); + + /* Find roots, alternating between P and Q */ + p = P; /* Pointer to polynomial */ + + xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ + ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); + + if( ylo < 0 ) { + /* Set the first NLSF to zero and move on to the next */ + NLSF[ 0 ] = 0; + p = Q; /* Pointer to polynomial */ + ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); + root_ix = 1; /* Index of current root */ + } else { + root_ix = 0; /* Index of current root */ + } + k = 1; /* Loop counter */ + i = 0; /* Counter for bandwidth expansions applied */ + thr = 0; + while( 1 ) { + /* Evaluate polynomial */ + xhi = silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */ + yhi = silk_A2NLSF_eval_poly( p, xhi, dd ); + + /* Detect zero crossing */ + if( ( ylo <= 0 && yhi >= thr ) || ( ylo >= 0 && yhi <= -thr ) ) { + if( yhi == 0 ) { + /* If the root lies exactly at the end of the current */ + /* interval, look for the next root in the next interval */ + thr = 1; + } else { + thr = 0; + } + /* Binary division */ + ffrac = -256; + for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) { + /* Evaluate polynomial */ + xmid = silk_RSHIFT_ROUND( xlo + xhi, 1 ); + ymid = silk_A2NLSF_eval_poly( p, xmid, dd ); + + /* Detect zero crossing */ + if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) { + /* Reduce frequency */ + xhi = xmid; + yhi = ymid; + } else { + /* Increase frequency */ + xlo = xmid; + ylo = ymid; + ffrac = silk_ADD_RSHIFT( ffrac, 128, m ); + } + } + + /* Interpolate */ + if( silk_abs( ylo ) < 65536 ) { + /* Avoid dividing by zero */ + den = ylo - yhi; + nom = silk_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + silk_RSHIFT( den, 1 ); + if( den != 0 ) { + ffrac += silk_DIV32( nom, den ); + } + } else { + /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */ + ffrac += silk_DIV32( ylo, silk_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) ); + } + NLSF[ root_ix ] = (opus_int16)silk_min_32( silk_LSHIFT( (opus_int32)k, 8 ) + ffrac, silk_int16_MAX ); + + silk_assert( NLSF[ root_ix ] >= 0 ); + + root_ix++; /* Next root */ + if( root_ix >= d ) { + /* Found all roots */ + break; + } + /* Alternate pointer to polynomial */ + p = PQ[ root_ix & 1 ]; + + /* Evaluate polynomial */ + xlo = silk_LSFCosTab_FIX_Q12[ k - 1 ]; /* Q12*/ + ylo = silk_LSHIFT( 1 - ( root_ix & 2 ), 12 ); + } else { + /* Increment loop counter */ + k++; + xlo = xhi; + ylo = yhi; + thr = 0; + + if( k > LSF_COS_TAB_SZ_FIX ) { + i++; + if( i > MAX_ITERATIONS_A2NLSF_FIX ) { + /* Set NLSFs to white spectrum and exit */ + NLSF[ 0 ] = (opus_int16)silk_DIV32_16( 1 << 15, d + 1 ); + for( k = 1; k < d; k++ ) { + NLSF[ k ] = (opus_int16)silk_ADD16( NLSF[ k-1 ], NLSF[ 0 ] ); + } + return; + } + + /* Error: Apply progressively more bandwidth expansion and run again */ + silk_bwexpander_32( a_Q16, d, 65536 - silk_LSHIFT( 1, i ) ); + + silk_A2NLSF_init( a_Q16, P, Q, dd ); + p = P; /* Pointer to polynomial */ + xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ + ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); + if( ylo < 0 ) { + /* Set the first NLSF to zero and move on to the next */ + NLSF[ 0 ] = 0; + p = Q; /* Pointer to polynomial */ + ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); + root_ix = 1; /* Index of current root */ + } else { + root_ix = 0; /* Index of current root */ + } + k = 1; /* Reset loop counter */ + } + } + } +} diff --git a/src/libopus/silk/API.h b/src/libopus/silk/API.h new file mode 100644 index 00000000..878965c7 --- /dev/null +++ b/src/libopus/silk/API.h @@ -0,0 +1,156 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_API_H +#define SILK_API_H + +#include "control.h" +#include "typedef.h" +#include "errors.h" +#include "entenc.h" +#include "entdec.h" + +#ifdef ENABLE_DEEP_PLC +#include "lpcnet_private.h" +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define SILK_MAX_FRAMES_PER_PACKET 3 + +/* Struct for TOC (Table of Contents) */ +typedef struct { + opus_int VADFlag; /* Voice activity for packet */ + opus_int VADFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Voice activity for each frame in packet */ + opus_int inbandFECFlag; /* Flag indicating if packet contains in-band FEC */ +} silk_TOC_struct; + +/****************************************/ +/* Encoder functions */ +/****************************************/ + +/***********************************************/ +/* Get size in bytes of the Silk encoder state */ +/***********************************************/ +opus_int silk_Get_Encoder_Size( /* O Returns error code */ + opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */ +); + +/*************************/ +/* Init or reset encoder */ +/*************************/ +opus_int silk_InitEncoder( /* O Returns error code */ + void *encState, /* I/O State */ + int arch, /* I Run-time architecture */ + silk_EncControlStruct *encStatus /* O Encoder Status */ +); + +/**************************/ +/* Encode frame with Silk */ +/**************************/ +/* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */ +/* encControl->payloadSize_ms is set to */ +opus_int silk_Encode( /* O Returns error code */ + void *encState, /* I/O State */ + silk_EncControlStruct *encControl, /* I Control status */ + const opus_int16 *samplesIn, /* I Speech sample input vector */ + opus_int nSamplesIn, /* I Number of samples in input vector */ + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ + const opus_int prefillFlag, /* I Flag to indicate prefilling buffers no coding */ + int activity /* I Decision of Opus voice activity detector */ +); + +/****************************************/ +/* Decoder functions */ +/****************************************/ + + +/***********************************************/ +/* Load OSCE models from external data pointer */ +/***********************************************/ +opus_int silk_LoadOSCEModels( + void *decState, /* O I/O State */ + const unsigned char *data, /* I pointer to binary blob */ + int len /* I length of binary blob data */ +); + +/***********************************************/ +/* Get size in bytes of the Silk decoder state */ +/***********************************************/ +opus_int silk_Get_Decoder_Size( /* O Returns error code */ + opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ +); + +/*************************/ +/* Init and Reset decoder */ +/*************************/ +opus_int silk_ResetDecoder( /* O Returns error code */ + void *decState /* I/O State */ +); + +opus_int silk_InitDecoder( /* O Returns error code */ + void *decState /* I/O State */ +); + +/******************/ +/* Decode a frame */ +/******************/ +opus_int silk_Decode( /* O Returns error code */ + void* decState, /* I/O State */ + silk_DecControlStruct* decControl, /* I/O Control Structure */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 *samplesOut, /* O Decoded output speech vector */ + opus_int32 *nSamplesOut, /* O Number of samples decoded */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +); + +#if 0 +/**************************************/ +/* Get table of contents for a packet */ +/**************************************/ +opus_int silk_get_TOC( + const opus_uint8 *payload, /* I Payload data */ + const opus_int nBytesIn, /* I Number of input bytes */ + const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ + silk_TOC_struct *Silk_TOC /* O Type of content */ +); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/CNG.c b/src/libopus/silk/CNG.c new file mode 100644 index 00000000..d23f3224 --- /dev/null +++ b/src/libopus/silk/CNG.c @@ -0,0 +1,188 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +/* Generates excitation for CNG LPC synthesis */ +static OPUS_INLINE void silk_CNG_exc( + opus_int32 exc_Q14[], /* O CNG excitation signal Q10 */ + opus_int32 exc_buf_Q14[], /* I Random samples buffer Q10 */ + opus_int length, /* I Length */ + opus_int32 *rand_seed /* I/O Seed to random index generator */ +) +{ + opus_int32 seed; + opus_int i, idx, exc_mask; + + exc_mask = CNG_BUF_MASK_MAX; + while( exc_mask > length ) { + exc_mask = silk_RSHIFT( exc_mask, 1 ); + } + + seed = *rand_seed; + for( i = 0; i < length; i++ ) { + seed = silk_RAND( seed ); + idx = (opus_int)( silk_RSHIFT( seed, 24 ) & exc_mask ); + silk_assert( idx >= 0 ); + silk_assert( idx <= CNG_BUF_MASK_MAX ); + exc_Q14[ i ] = exc_buf_Q14[ idx ]; + } + *rand_seed = seed; +} + +void silk_CNG_Reset( + silk_decoder_state *psDec /* I/O Decoder state */ +) +{ + opus_int i, NLSF_step_Q15, NLSF_acc_Q15; + + NLSF_step_Q15 = silk_DIV32_16( silk_int16_MAX, psDec->LPC_order + 1 ); + NLSF_acc_Q15 = 0; + for( i = 0; i < psDec->LPC_order; i++ ) { + NLSF_acc_Q15 += NLSF_step_Q15; + psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15; + } + psDec->sCNG.CNG_smth_Gain_Q16 = 0; + psDec->sCNG.rand_seed = 3176576; +} + +/* Updates CNG estimate, and applies the CNG when packet was lost */ +void silk_CNG( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* I/O Signal */ + opus_int length /* I Length of residual */ +) +{ + opus_int i, subfr; + opus_int32 LPC_pred_Q10, max_Gain_Q16, gain_Q16, gain_Q10; + opus_int16 A_Q12[ MAX_LPC_ORDER ]; + silk_CNG_struct *psCNG = &psDec->sCNG; + SAVE_STACK; + + if( psDec->fs_kHz != psCNG->fs_kHz ) { + /* Reset state */ + silk_CNG_Reset( psDec ); + + psCNG->fs_kHz = psDec->fs_kHz; + } + if( psDec->lossCnt == 0 && psDec->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { + /* Update CNG parameters */ + + /* Smoothing of LSF's */ + for( i = 0; i < psDec->LPC_order; i++ ) { + psCNG->CNG_smth_NLSF_Q15[ i ] += silk_SMULWB( (opus_int32)psDec->prevNLSF_Q15[ i ] - (opus_int32)psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 ); + } + /* Find the subframe with the highest gain */ + max_Gain_Q16 = 0; + subfr = 0; + for( i = 0; i < psDec->nb_subfr; i++ ) { + if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) { + max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ]; + subfr = i; + } + } + /* Update CNG excitation buffer with excitation from this subframe */ + silk_memmove( &psCNG->CNG_exc_buf_Q14[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q14, ( psDec->nb_subfr - 1 ) * psDec->subfr_length * sizeof( opus_int32 ) ); + silk_memcpy( psCNG->CNG_exc_buf_Q14, &psDec->exc_Q14[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( opus_int32 ) ); + + /* Smooth gains */ + for( i = 0; i < psDec->nb_subfr; i++ ) { + psCNG->CNG_smth_Gain_Q16 += silk_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 ); + /* If the smoothed gain is 3 dB greater than this subframe's gain, use this subframe's gain to adapt faster. */ + if( silk_SMULWW( psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_THRESHOLD_Q16 ) > psDecCtrl->Gains_Q16[ i ] ) { + psCNG->CNG_smth_Gain_Q16 = psDecCtrl->Gains_Q16[ i ]; + } + } + } + + /* Add CNG when packet is lost or during DTX */ + if( psDec->lossCnt ) { + VARDECL( opus_int32, CNG_sig_Q14 ); + ALLOC( CNG_sig_Q14, length + MAX_LPC_ORDER, opus_int32 ); + + /* Generate CNG excitation */ + gain_Q16 = silk_SMULWW( psDec->sPLC.randScale_Q14, psDec->sPLC.prevGain_Q16[1] ); + if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { + gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); + gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); + gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); + } else { + gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); + gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); + gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); + } + gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); + + silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, length, &psCNG->rand_seed ); + + /* Convert CNG NLSF to filter representation */ + silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order, psDec->arch ); + + /* Generate CNG signal, by synthesis filtering */ + silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); + for( i = 0; i < length; i++ ) { + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); + if( psDec->LPC_order == 16 ) { + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12[ 10 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12[ 11 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12[ 12 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12[ 13 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12[ 14 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12[ 15 ] ); + } + + /* Update states */ + CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); + + /* Scale with Gain and add to input signal */ + frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) ) ); + + } + silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); + } else { + silk_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( opus_int32 ) ); + } + RESTORE_STACK; +} diff --git a/src/libopus/silk/HP_variable_cutoff.c b/src/libopus/silk/HP_variable_cutoff.c new file mode 100644 index 00000000..31352e6d --- /dev/null +++ b/src/libopus/silk/HP_variable_cutoff.c @@ -0,0 +1,77 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif +#ifdef FIXED_POINT +#include "main_FIX.h" +#else +#include "main_FLP.h" +#endif +#include "tuning_parameters.h" + +/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ +void silk_HP_variable_cutoff( + silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ +) +{ + opus_int quality_Q15; + opus_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7; + silk_encoder_state *psEncC1 = &state_Fxx[ 0 ].sCmn; + + /* Adaptive cutoff frequency: estimate low end of pitch frequency range */ + if( psEncC1->prevSignalType == TYPE_VOICED ) { + /* difference, in log domain */ + pitch_freq_Hz_Q16 = silk_DIV32_16( silk_LSHIFT( silk_MUL( psEncC1->fs_kHz, 1000 ), 16 ), psEncC1->prevLag ); + pitch_freq_log_Q7 = silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); + + /* adjustment based on quality */ + quality_Q15 = psEncC1->input_quality_bands_Q15[ 0 ]; + pitch_freq_log_Q7 = silk_SMLAWB( pitch_freq_log_Q7, silk_SMULWB( silk_LSHIFT( -quality_Q15, 2 ), quality_Q15 ), + pitch_freq_log_Q7 - ( silk_lin2log( SILK_FIX_CONST( VARIABLE_HP_MIN_CUTOFF_HZ, 16 ) ) - ( 16 << 7 ) ) ); + + /* delta_freq = pitch_freq_log - psEnc->variable_HP_smth1; */ + delta_freq_Q7 = pitch_freq_log_Q7 - silk_RSHIFT( psEncC1->variable_HP_smth1_Q15, 8 ); + if( delta_freq_Q7 < 0 ) { + /* less smoothing for decreasing pitch frequency, to track something close to the minimum */ + delta_freq_Q7 = silk_MUL( delta_freq_Q7, 3 ); + } + + /* limit delta, to reduce impact of outliers in pitch estimation */ + delta_freq_Q7 = silk_LIMIT_32( delta_freq_Q7, -SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ), SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ) ); + + /* update smoother */ + psEncC1->variable_HP_smth1_Q15 = silk_SMLAWB( psEncC1->variable_HP_smth1_Q15, + silk_SMULBB( psEncC1->speech_activity_Q8, delta_freq_Q7 ), SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF1, 16 ) ); + + /* limit frequency range */ + psEncC1->variable_HP_smth1_Q15 = silk_LIMIT_32( psEncC1->variable_HP_smth1_Q15, + silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ), + silk_LSHIFT( silk_lin2log( VARIABLE_HP_MAX_CUTOFF_HZ ), 8 ) ); + } +} diff --git a/src/libopus/silk/Inlines.h b/src/libopus/silk/Inlines.h new file mode 100644 index 00000000..ec986cdf --- /dev/null +++ b/src/libopus/silk/Inlines.h @@ -0,0 +1,188 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. +***********************************************************************/ + +/*! \file silk_Inlines.h + * \brief silk_Inlines.h defines OPUS_INLINE signal processing functions. + */ + +#ifndef SILK_FIX_INLINES_H +#define SILK_FIX_INLINES_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* count leading zeros of opus_int64 */ +static OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in ) +{ + opus_int32 in_upper; + + in_upper = (opus_int32)silk_RSHIFT64(in, 32); + if (in_upper == 0) { + /* Search in the lower 32 bits */ + return 32 + silk_CLZ32( (opus_int32) in ); + } else { + /* Search in the upper 32 bits */ + return silk_CLZ32( in_upper ); + } +} + +/* get number of leading zeros and fractional part (the bits right after the leading one */ +static OPUS_INLINE void silk_CLZ_FRAC( + opus_int32 in, /* I input */ + opus_int32 *lz, /* O number of leading zeros */ + opus_int32 *frac_Q7 /* O the 7 bits right after the leading one */ +) +{ + opus_int32 lzeros = silk_CLZ32(in); + + * lz = lzeros; + * frac_Q7 = silk_ROR32(in, 24 - lzeros) & 0x7f; +} + +/* Approximation of square root */ +/* Accuracy: < +/- 10% for output values > 15 */ +/* < +/- 2.5% for output values > 120 */ +static OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x ) +{ + opus_int32 y, lz, frac_Q7; + + if( x <= 0 ) { + return 0; + } + + silk_CLZ_FRAC(x, &lz, &frac_Q7); + + if( lz & 1 ) { + y = 32768; + } else { + y = 46214; /* 46214 = sqrt(2) * 32768 */ + } + + /* get scaling right */ + y >>= silk_RSHIFT(lz, 1); + + /* increment using fractional part of input */ + y = silk_SMLAWB(y, y, silk_SMULBB(213, frac_Q7)); + + return y; +} + +/* Divide two int32 values and return result as int32 in a given Q-domain */ +static OPUS_INLINE opus_int32 silk_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */ + const opus_int32 a32, /* I numerator (Q0) */ + const opus_int32 b32, /* I denominator (Q0) */ + const opus_int Qres /* I Q-domain of result (>= 0) */ +) +{ + opus_int a_headrm, b_headrm, lshift; + opus_int32 b32_inv, a32_nrm, b32_nrm, result; + + silk_assert( b32 != 0 ); + silk_assert( Qres >= 0 ); + + /* Compute number of bits head room and normalize inputs */ + a_headrm = silk_CLZ32( silk_abs(a32) ) - 1; + a32_nrm = silk_LSHIFT(a32, a_headrm); /* Q: a_headrm */ + b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; + b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ + + /* Inverse of b32, with 14 bits of precision */ + b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ + + /* First approximation */ + result = silk_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ + + /* Compute residual by subtracting product of denominator and first approximation */ + /* It's OK to overflow because the final value of a32_nrm should always be small */ + a32_nrm = silk_SUB32_ovflw(a32_nrm, silk_LSHIFT_ovflw( silk_SMMUL(b32_nrm, result), 3 )); /* Q: a_headrm */ + + /* Refinement */ + result = silk_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ + + /* Convert to Qres domain */ + lshift = 29 + a_headrm - b_headrm - Qres; + if( lshift < 0 ) { + return silk_LSHIFT_SAT32(result, -lshift); + } else { + if( lshift < 32){ + return silk_RSHIFT(result, lshift); + } else { + /* Avoid undefined result */ + return 0; + } + } +} + +/* Invert int32 value and return result as int32 in a given Q-domain */ +static OPUS_INLINE opus_int32 silk_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */ + const opus_int32 b32, /* I denominator (Q0) */ + const opus_int Qres /* I Q-domain of result (> 0) */ +) +{ + opus_int b_headrm, lshift; + opus_int32 b32_inv, b32_nrm, err_Q32, result; + + silk_assert( b32 != 0 ); + silk_assert( Qres > 0 ); + + /* Compute number of bits head room and normalize input */ + b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; + b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ + + /* Inverse of b32, with 14 bits of precision */ + b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ + + /* First approximation */ + result = silk_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */ + + /* Compute residual by subtracting product of denominator and first approximation from one */ + err_Q32 = silk_LSHIFT( ((opus_int32)1<<29) - silk_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */ + + /* Refinement */ + result = silk_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */ + + /* Convert to Qres domain */ + lshift = 61 - b_headrm - Qres; + if( lshift <= 0 ) { + return silk_LSHIFT_SAT32(result, -lshift); + } else { + if( lshift < 32){ + return silk_RSHIFT(result, lshift); + }else{ + /* Avoid undefined result */ + return 0; + } + } +} + +#ifdef __cplusplus +} +#endif + +#endif /* SILK_FIX_INLINES_H */ diff --git a/src/libopus/silk/LPC_analysis_filter.c b/src/libopus/silk/LPC_analysis_filter.c new file mode 100644 index 00000000..494c93c4 --- /dev/null +++ b/src/libopus/silk/LPC_analysis_filter.c @@ -0,0 +1,111 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "celt_lpc.h" + +/*******************************************/ +/* LPC analysis filter */ +/* NB! State is kept internally and the */ +/* filter always starts with zero state */ +/* first d output samples are set to zero */ +/*******************************************/ + +/* OPT: Using celt_fir() for this function should be faster, but it may cause + integer overflows in intermediate values (not final results), which the + current implementation silences by casting to unsigned. Enabling + this should be safe in pretty much all cases, even though it is not technically + C89-compliant. */ +#define USE_CELT_FIR 0 + +void silk_LPC_analysis_filter( + opus_int16 *out, /* O Output signal */ + const opus_int16 *in, /* I Input signal */ + const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ + const opus_int32 len, /* I Signal length */ + const opus_int32 d, /* I Filter order */ + int arch /* I Run-time architecture */ +) +{ + opus_int j; +#if defined(FIXED_POINT) && USE_CELT_FIR + opus_int16 num[SILK_MAX_ORDER_LPC]; +#else + int ix; + opus_int32 out32_Q12, out32; + const opus_int16 *in_ptr; +#endif + + celt_assert( d >= 6 ); + celt_assert( (d & 1) == 0 ); + celt_assert( d <= len ); + +#if defined(FIXED_POINT) && USE_CELT_FIR + celt_assert( d <= SILK_MAX_ORDER_LPC ); + for ( j = 0; j < d; j++ ) { + num[ j ] = -B[ j ]; + } + celt_fir( in + d, num, out + d, len - d, d, arch ); + for ( j = 0; j < d; j++ ) { + out[ j ] = 0; + } +#else + (void)arch; + for( ix = d; ix < len; ix++ ) { + in_ptr = &in[ ix - 1 ]; + + out32_Q12 = silk_SMULBB( in_ptr[ 0 ], B[ 0 ] ); + /* Allowing wrap around so that two wraps can cancel each other. The rare + cases where the result wraps around can only be triggered by invalid streams*/ + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -1 ], B[ 1 ] ); + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -2 ], B[ 2 ] ); + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -3 ], B[ 3 ] ); + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -4 ], B[ 4 ] ); + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -5 ], B[ 5 ] ); + for( j = 6; j < d; j += 2 ) { + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j ], B[ j ] ); + out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j - 1 ], B[ j + 1 ] ); + } + + /* Subtract prediction */ + out32_Q12 = silk_SUB32_ovflw( silk_LSHIFT( (opus_int32)in_ptr[ 1 ], 12 ), out32_Q12 ); + + /* Scale to Q0 */ + out32 = silk_RSHIFT_ROUND( out32_Q12, 12 ); + + /* Saturate output */ + out[ ix ] = (opus_int16)silk_SAT16( out32 ); + } + + /* Set first d output samples to zero */ + silk_memset( out, 0, d * sizeof( opus_int16 ) ); +#endif +} diff --git a/src/libopus/silk/LPC_fit.c b/src/libopus/silk/LPC_fit.c new file mode 100644 index 00000000..c63dbc41 --- /dev/null +++ b/src/libopus/silk/LPC_fit.c @@ -0,0 +1,82 @@ +/*********************************************************************** +Copyright (c) 2013, Koen Vos. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around. + This logic is reused in _celt_lpc(). Any bug fixes should also be applied there. */ +void silk_LPC_fit( + opus_int16 *a_QOUT, /* O Output signal */ + opus_int32 *a_QIN, /* I/O Input signal */ + const opus_int QOUT, /* I Input Q domain */ + const opus_int QIN, /* I Input Q domain */ + const opus_int d /* I Filter order */ +) +{ + opus_int i, k, idx = 0; + opus_int32 maxabs, absval, chirp_Q16; + + /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ + for( i = 0; i < 10; i++ ) { + /* Find maximum absolute value and its index */ + maxabs = 0; + for( k = 0; k < d; k++ ) { + absval = silk_abs( a_QIN[k] ); + if( absval > maxabs ) { + maxabs = absval; + idx = k; + } + } + maxabs = silk_RSHIFT_ROUND( maxabs, QIN - QOUT ); + + if( maxabs > silk_int16_MAX ) { + /* Reduce magnitude of prediction coefficients */ + maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ + chirp_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), + silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); + silk_bwexpander_32( a_QIN, d, chirp_Q16 ); + } else { + break; + } + } + + if( i == 10 ) { + /* Reached the last iteration, clip the coefficients */ + for( k = 0; k < d; k++ ) { + a_QOUT[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ) ); + a_QIN[ k ] = silk_LSHIFT( (opus_int32)a_QOUT[ k ], QIN - QOUT ); + } + } else { + for( k = 0; k < d; k++ ) { + a_QOUT[ k ] = (opus_int16)silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ); + } + } +} diff --git a/src/libopus/silk/LPC_inv_pred_gain.c b/src/libopus/silk/LPC_inv_pred_gain.c new file mode 100644 index 00000000..4cc91b2d --- /dev/null +++ b/src/libopus/silk/LPC_inv_pred_gain.c @@ -0,0 +1,141 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "define.h" + +#define QA 24 +#define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) + +#define MUL32_FRAC_Q(a32, b32, Q) ((opus_int32)(silk_RSHIFT_ROUND64(silk_SMULL(a32, b32), Q))) + +/* Compute inverse of LPC prediction gain, and */ +/* test if LPC coefficients are stable (all poles within unit circle) */ +static opus_int32 LPC_inverse_pred_gain_QA_c( /* O Returns inverse prediction gain in energy domain, Q30 */ + opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ + const opus_int order /* I Prediction order */ +) +{ + opus_int k, n, mult2Q; + opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; + + invGain_Q30 = SILK_FIX_CONST( 1, 30 ); + for( k = order - 1; k > 0; k-- ) { + /* Check for stability */ + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + return 0; + } + + /* Set RC equal to negated AR coef */ + rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); + + /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ + silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); + + /* Update inverse gain */ + /* invGain_Q30 range: [ 0 : 2^30 ] */ + invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } + + /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ + mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); + rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); + + /* Update AR coefficient */ + for( n = 0; n < (k + 1) >> 1; n++ ) { + opus_int64 tmp64; + tmp1 = A_QA[ n ]; + tmp2 = A_QA[ k - n - 1 ]; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, + MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ n ] = ( opus_int32 )tmp64; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, + MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; + } + } + + /* Check for stability */ + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + return 0; + } + + /* Set RC equal to negated AR coef */ + rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); + + /* Range: [ 1 : 2^30 ] */ + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + + /* Update inverse gain */ + /* Range: [ 0 : 2^30 ] */ + invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } + + return invGain_Q30; +} + +/* For input in Q12 domain */ +opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ + const opus_int order /* I Prediction order */ +) +{ + opus_int k; + opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 DC_resp = 0; + + /* Increase Q domain of the AR coefficients */ + for( k = 0; k < order; k++ ) { + DC_resp += (opus_int32)A_Q12[ k ]; + Atmp_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); + } + /* If the DC is unstable, we don't even need to do the full calculations */ + if( DC_resp >= 4096 ) { + return 0; + } + return LPC_inverse_pred_gain_QA_c( Atmp_QA, order ); +} diff --git a/src/libopus/silk/LP_variable_cutoff.c b/src/libopus/silk/LP_variable_cutoff.c new file mode 100644 index 00000000..1f393245 --- /dev/null +++ b/src/libopus/silk/LP_variable_cutoff.c @@ -0,0 +1,135 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* + Elliptic/Cauer filters designed with 0.1 dB passband ripple, + 80 dB minimum stopband attenuation, and + [0.95 : 0.15 : 0.35] normalized cut off frequencies. +*/ + +#include "main.h" + +/* Helper function, interpolates the filter taps */ +static OPUS_INLINE void silk_LP_interpolate_filter_taps( + opus_int32 B_Q28[ TRANSITION_NB ], + opus_int32 A_Q28[ TRANSITION_NA ], + const opus_int ind, + const opus_int32 fac_Q16 +) +{ + opus_int nb, na; + + if( ind < TRANSITION_INT_NUM - 1 ) { + if( fac_Q16 > 0 ) { + if( fac_Q16 < 32768 ) { /* fac_Q16 is in range of a 16-bit int */ + /* Piece-wise linear interpolation of B and A */ + for( nb = 0; nb < TRANSITION_NB; nb++ ) { + B_Q28[ nb ] = silk_SMLAWB( + silk_Transition_LP_B_Q28[ ind ][ nb ], + silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - + silk_Transition_LP_B_Q28[ ind ][ nb ], + fac_Q16 ); + } + for( na = 0; na < TRANSITION_NA; na++ ) { + A_Q28[ na ] = silk_SMLAWB( + silk_Transition_LP_A_Q28[ ind ][ na ], + silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - + silk_Transition_LP_A_Q28[ ind ][ na ], + fac_Q16 ); + } + } else { /* ( fac_Q16 - ( 1 << 16 ) ) is in range of a 16-bit int */ + silk_assert( fac_Q16 - ( 1 << 16 ) == silk_SAT16( fac_Q16 - ( 1 << 16 ) ) ); + /* Piece-wise linear interpolation of B and A */ + for( nb = 0; nb < TRANSITION_NB; nb++ ) { + B_Q28[ nb ] = silk_SMLAWB( + silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], + silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - + silk_Transition_LP_B_Q28[ ind ][ nb ], + fac_Q16 - ( (opus_int32)1 << 16 ) ); + } + for( na = 0; na < TRANSITION_NA; na++ ) { + A_Q28[ na ] = silk_SMLAWB( + silk_Transition_LP_A_Q28[ ind + 1 ][ na ], + silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - + silk_Transition_LP_A_Q28[ ind ][ na ], + fac_Q16 - ( (opus_int32)1 << 16 ) ); + } + } + } else { + silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( opus_int32 ) ); + silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( opus_int32 ) ); + } + } else { + silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( opus_int32 ) ); + silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( opus_int32 ) ); + } +} + +/* Low-pass filter with variable cutoff frequency based on */ +/* piece-wise linear interpolation between elliptic filters */ +/* Start by setting psEncC->mode <> 0; */ +/* Deactivate by setting psEncC->mode = 0; */ +void silk_LP_variable_cutoff( + silk_LP_state *psLP, /* I/O LP filter state */ + opus_int16 *frame, /* I/O Low-pass filtered output signal */ + const opus_int frame_length /* I Frame length */ +) +{ + opus_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ], fac_Q16 = 0; + opus_int ind = 0; + + silk_assert( psLP->transition_frame_no >= 0 && psLP->transition_frame_no <= TRANSITION_FRAMES ); + + /* Run filter if needed */ + if( psLP->mode != 0 ) { + /* Calculate index and interpolation factor for interpolation */ +#if( TRANSITION_INT_STEPS == 64 ) + fac_Q16 = silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 - 6 ); +#else + fac_Q16 = silk_DIV32_16( silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 ), TRANSITION_FRAMES ); +#endif + ind = silk_RSHIFT( fac_Q16, 16 ); + fac_Q16 -= silk_LSHIFT( ind, 16 ); + + silk_assert( ind >= 0 ); + silk_assert( ind < TRANSITION_INT_NUM ); + + /* Interpolate filter coefficients */ + silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 ); + + /* Update transition frame number for next frame */ + psLP->transition_frame_no = silk_LIMIT( psLP->transition_frame_no + psLP->mode, 0, TRANSITION_FRAMES ); + + /* ARMA low-pass filtering */ + silk_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 ); + silk_biquad_alt_stride1( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length); + } +} diff --git a/src/libopus/silk/MacroCount.h b/src/libopus/silk/MacroCount.h new file mode 100644 index 00000000..dab2f57a --- /dev/null +++ b/src/libopus/silk/MacroCount.h @@ -0,0 +1,710 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SIGPROCFIX_API_MACROCOUNT_H +#define SIGPROCFIX_API_MACROCOUNT_H + +#ifdef silk_MACRO_COUNT +#include +#define varDefine opus_int64 ops_count = 0; + +extern opus_int64 ops_count; + +static OPUS_INLINE opus_int64 silk_SaveCount(){ + return(ops_count); +} + +static OPUS_INLINE opus_int64 silk_SaveResetCount(){ + opus_int64 ret; + + ret = ops_count; + ops_count = 0; + return(ret); +} + +static OPUS_INLINE silk_PrintCount(){ + printf("ops_count = %d \n ", (opus_int32)ops_count); +} + +#undef silk_MUL +static OPUS_INLINE opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + ops_count += 4; + ret = a32 * b32; + return ret; +} + +#undef silk_MUL_uint +static OPUS_INLINE opus_uint32 silk_MUL_uint(opus_uint32 a32, opus_uint32 b32){ + opus_uint32 ret; + ops_count += 4; + ret = a32 * b32; + return ret; +} +#undef silk_MLA +static OPUS_INLINE opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 4; + ret = a32 + b32 * c32; + return ret; +} + +#undef silk_MLA_uint +static OPUS_INLINE opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32){ + opus_uint32 ret; + ops_count += 4; + ret = a32 + b32 * c32; + return ret; +} + +#undef silk_SMULWB +static OPUS_INLINE opus_int32 silk_SMULWB(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + ops_count += 5; + ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); + return ret; +} +#undef silk_SMLAWB +static OPUS_INLINE opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 5; + ret = ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))); + return ret; +} + +#undef silk_SMULWT +static OPUS_INLINE opus_int32 silk_SMULWT(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + ops_count += 4; + ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); + return ret; +} +#undef silk_SMLAWT +static OPUS_INLINE opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 4; + ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); + return ret; +} + +#undef silk_SMULBB +static OPUS_INLINE opus_int32 silk_SMULBB(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + ops_count += 1; + ret = (opus_int32)((opus_int16)a32) * (opus_int32)((opus_int16)b32); + return ret; +} +#undef silk_SMLABB +static OPUS_INLINE opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 1; + ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); + return ret; +} + +#undef silk_SMULBT +static OPUS_INLINE opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){ + opus_int32 ret; + ops_count += 4; + ret = ((opus_int32)((opus_int16)a32)) * (b32 >> 16); + return ret; +} + +#undef silk_SMLABT +static OPUS_INLINE opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 1; + ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); + return ret; +} + +#undef silk_SMULTT +static OPUS_INLINE opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + ops_count += 1; + ret = (a32 >> 16) * (b32 >> 16); + return ret; +} + +#undef silk_SMLATT +static OPUS_INLINE opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + ops_count += 1; + ret = a32 + (b32 >> 16) * (c32 >> 16); + return ret; +} + + +/* multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)*/ +#undef silk_MLA_ovflw +#define silk_MLA_ovflw silk_MLA + +#undef silk_SMLABB_ovflw +#define silk_SMLABB_ovflw silk_SMLABB + +#undef silk_SMLABT_ovflw +#define silk_SMLABT_ovflw silk_SMLABT + +#undef silk_SMLATT_ovflw +#define silk_SMLATT_ovflw silk_SMLATT + +#undef silk_SMLAWB_ovflw +#define silk_SMLAWB_ovflw silk_SMLAWB + +#undef silk_SMLAWT_ovflw +#define silk_SMLAWT_ovflw silk_SMLAWT + +#undef silk_SMULL +static OPUS_INLINE opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){ + opus_int64 ret; + ops_count += 8; + ret = ((opus_int64)(a32) * /*(opus_int64)*/(b32)); + return ret; +} + +#undef silk_SMLAL +static OPUS_INLINE opus_int64 silk_SMLAL(opus_int64 a64, opus_int32 b32, opus_int32 c32){ + opus_int64 ret; + ops_count += 8; + ret = a64 + ((opus_int64)(b32) * /*(opus_int64)*/(c32)); + return ret; +} +#undef silk_SMLALBB +static OPUS_INLINE opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 c16){ + opus_int64 ret; + ops_count += 4; + ret = a64 + ((opus_int64)(b16) * /*(opus_int64)*/(c16)); + return ret; +} + +#undef SigProcFIX_CLZ16 +static OPUS_INLINE opus_int32 SigProcFIX_CLZ16(opus_int16 in16) +{ + opus_int32 out32 = 0; + ops_count += 10; + if( in16 == 0 ) { + return 16; + } + /* test nibbles */ + if( in16 & 0xFF00 ) { + if( in16 & 0xF000 ) { + in16 >>= 12; + } else { + out32 += 4; + in16 >>= 8; + } + } else { + if( in16 & 0xFFF0 ) { + out32 += 8; + in16 >>= 4; + } else { + out32 += 12; + } + } + /* test bits and return */ + if( in16 & 0xC ) { + if( in16 & 0x8 ) + return out32 + 0; + else + return out32 + 1; + } else { + if( in16 & 0xE ) + return out32 + 2; + else + return out32 + 3; + } +} + +#undef SigProcFIX_CLZ32 +static OPUS_INLINE opus_int32 SigProcFIX_CLZ32(opus_int32 in32) +{ + /* test highest 16 bits and convert to opus_int16 */ + ops_count += 2; + if( in32 & 0xFFFF0000 ) { + return SigProcFIX_CLZ16((opus_int16)(in32 >> 16)); + } else { + return SigProcFIX_CLZ16((opus_int16)in32) + 16; + } +} + +#undef silk_DIV32 +static OPUS_INLINE opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){ + ops_count += 64; + return a32 / b32; +} + +#undef silk_DIV32_16 +static OPUS_INLINE opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){ + ops_count += 32; + return a32 / b32; +} + +#undef silk_SAT8 +static OPUS_INLINE opus_int8 silk_SAT8(opus_int64 a){ + opus_int8 tmp; + ops_count += 1; + tmp = (opus_int8)((a) > silk_int8_MAX ? silk_int8_MAX : \ + ((a) < silk_int8_MIN ? silk_int8_MIN : (a))); + return(tmp); +} + +#undef silk_SAT16 +static OPUS_INLINE opus_int16 silk_SAT16(opus_int64 a){ + opus_int16 tmp; + ops_count += 1; + tmp = (opus_int16)((a) > silk_int16_MAX ? silk_int16_MAX : \ + ((a) < silk_int16_MIN ? silk_int16_MIN : (a))); + return(tmp); +} +#undef silk_SAT32 +static OPUS_INLINE opus_int32 silk_SAT32(opus_int64 a){ + opus_int32 tmp; + ops_count += 1; + tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : \ + ((a) < silk_int32_MIN ? silk_int32_MIN : (a))); + return(tmp); +} +#undef silk_POS_SAT32 +static OPUS_INLINE opus_int32 silk_POS_SAT32(opus_int64 a){ + opus_int32 tmp; + ops_count += 1; + tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : (a)); + return(tmp); +} + +#undef silk_ADD_POS_SAT8 +static OPUS_INLINE opus_int8 silk_ADD_POS_SAT8(opus_int64 a, opus_int64 b){ + opus_int8 tmp; + ops_count += 1; + tmp = (opus_int8)((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))); + return(tmp); +} +#undef silk_ADD_POS_SAT16 +static OPUS_INLINE opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){ + opus_int16 tmp; + ops_count += 1; + tmp = (opus_int16)((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))); + return(tmp); +} + +#undef silk_ADD_POS_SAT32 +static OPUS_INLINE opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){ + opus_int32 tmp; + ops_count += 1; + tmp = (opus_int32)((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))); + return(tmp); +} + +#undef silk_LSHIFT8 +static OPUS_INLINE opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){ + opus_int8 ret; + ops_count += 1; + ret = a << shift; + return ret; +} +#undef silk_LSHIFT16 +static OPUS_INLINE opus_int16 silk_LSHIFT16(opus_int16 a, opus_int32 shift){ + opus_int16 ret; + ops_count += 1; + ret = a << shift; + return ret; +} +#undef silk_LSHIFT32 +static OPUS_INLINE opus_int32 silk_LSHIFT32(opus_int32 a, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a << shift; + return ret; +} +#undef silk_LSHIFT64 +static OPUS_INLINE opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){ + ops_count += 1; + return a << shift; +} + +#undef silk_LSHIFT_ovflw +static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw(opus_int32 a, opus_int32 shift){ + ops_count += 1; + return a << shift; +} + +#undef silk_LSHIFT_uint +static OPUS_INLINE opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ + opus_uint32 ret; + ops_count += 1; + ret = a << shift; + return ret; +} + +#undef silk_RSHIFT8 +static OPUS_INLINE opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){ + ops_count += 1; + return a >> shift; +} +#undef silk_RSHIFT16 +static OPUS_INLINE opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){ + ops_count += 1; + return a >> shift; +} +#undef silk_RSHIFT32 +static OPUS_INLINE opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){ + ops_count += 1; + return a >> shift; +} +#undef silk_RSHIFT64 +static OPUS_INLINE opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){ + ops_count += 1; + return a >> shift; +} + +#undef silk_RSHIFT_uint +static OPUS_INLINE opus_uint32 silk_RSHIFT_uint(opus_uint32 a, opus_int32 shift){ + ops_count += 1; + return a >> shift; +} + +#undef silk_ADD_LSHIFT +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a + (b << shift); + return ret; /* shift >= 0*/ +} +#undef silk_ADD_LSHIFT32 +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a + (b << shift); + return ret; /* shift >= 0*/ +} +#undef silk_ADD_LSHIFT_uint +static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ + opus_uint32 ret; + ops_count += 1; + ret = a + (b << shift); + return ret; /* shift >= 0*/ +} +#undef silk_ADD_RSHIFT +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a + (b >> shift); + return ret; /* shift > 0*/ +} +#undef silk_ADD_RSHIFT32 +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a + (b >> shift); + return ret; /* shift > 0*/ +} +#undef silk_ADD_RSHIFT_uint +static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ + opus_uint32 ret; + ops_count += 1; + ret = a + (b >> shift); + return ret; /* shift > 0*/ +} +#undef silk_SUB_LSHIFT32 +static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a - (b << shift); + return ret; /* shift >= 0*/ +} +#undef silk_SUB_RSHIFT32 +static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ + opus_int32 ret; + ops_count += 1; + ret = a - (b >> shift); + return ret; /* shift > 0*/ +} + +#undef silk_RSHIFT_ROUND +static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){ + opus_int32 ret; + ops_count += 3; + ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; + return ret; +} + +#undef silk_RSHIFT_ROUND64 +static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){ + opus_int64 ret; + ops_count += 6; + ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; + return ret; +} + +#undef silk_abs_int64 +static OPUS_INLINE opus_int64 silk_abs_int64(opus_int64 a){ + ops_count += 1; + return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN*/ +} + +#undef silk_abs_int32 +static OPUS_INLINE opus_int32 silk_abs_int32(opus_int32 a){ + ops_count += 1; + return silk_abs(a); +} + + +#undef silk_min +static silk_min(a, b){ + ops_count += 1; + return (((a) < (b)) ? (a) : (b)); +} +#undef silk_max +static silk_max(a, b){ + ops_count += 1; + return (((a) > (b)) ? (a) : (b)); +} +#undef silk_sign +static silk_sign(a){ + ops_count += 1; + return ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )); +} + +#undef silk_ADD16 +static OPUS_INLINE opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ + opus_int16 ret; + ops_count += 1; + ret = a + b; + return ret; +} + +#undef silk_ADD32 +static OPUS_INLINE opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ + opus_int32 ret; + ops_count += 1; + ret = a + b; + return ret; +} + +#undef silk_ADD64 +static OPUS_INLINE opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ + opus_int64 ret; + ops_count += 2; + ret = a + b; + return ret; +} + +#undef silk_SUB16 +static OPUS_INLINE opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ + opus_int16 ret; + ops_count += 1; + ret = a - b; + return ret; +} + +#undef silk_SUB32 +static OPUS_INLINE opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ + opus_int32 ret; + ops_count += 1; + ret = a - b; + return ret; +} + +#undef silk_SUB64 +static OPUS_INLINE opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ + opus_int64 ret; + ops_count += 2; + ret = a - b; + return ret; +} + +#undef silk_ADD_SAT16 +static OPUS_INLINE opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { + opus_int16 res; + /* Nb will be counted in AKP_add32 and silk_SAT16*/ + res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); + return res; +} + +#undef silk_ADD_SAT32 +static OPUS_INLINE opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ + opus_int32 res; + ops_count += 1; + res = ((((a32) + (b32)) & 0x80000000) == 0 ? \ + ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ + ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); + return res; +} + +#undef silk_ADD_SAT64 +static OPUS_INLINE opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) { + opus_int64 res; + ops_count += 1; + res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ + ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ + ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); + return res; +} + +#undef silk_SUB_SAT16 +static OPUS_INLINE opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { + opus_int16 res; + silk_assert(0); + /* Nb will be counted in sub-macros*/ + res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); + return res; +} + +#undef silk_SUB_SAT32 +static OPUS_INLINE opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { + opus_int32 res; + ops_count += 1; + res = ((((a32)-(b32)) & 0x80000000) == 0 ? \ + (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ + ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); + return res; +} + +#undef silk_SUB_SAT64 +static OPUS_INLINE opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) { + opus_int64 res; + ops_count += 1; + res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ + (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ + ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); + + return res; +} + +#undef silk_SMULWW +static OPUS_INLINE opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){ + opus_int32 ret; + /* Nb will be counted in sub-macros*/ + ret = silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)); + return ret; +} + +#undef silk_SMLAWW +static OPUS_INLINE opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 c32){ + opus_int32 ret; + /* Nb will be counted in sub-macros*/ + ret = silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)); + return ret; +} + +#undef silk_min_int +static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) +{ + ops_count += 1; + return (((a) < (b)) ? (a) : (b)); +} + +#undef silk_min_16 +static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) +{ + ops_count += 1; + return (((a) < (b)) ? (a) : (b)); +} +#undef silk_min_32 +static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) +{ + ops_count += 1; + return (((a) < (b)) ? (a) : (b)); +} +#undef silk_min_64 +static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) +{ + ops_count += 1; + return (((a) < (b)) ? (a) : (b)); +} + +/* silk_min() versions with typecast in the function call */ +#undef silk_max_int +static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) +{ + ops_count += 1; + return (((a) > (b)) ? (a) : (b)); +} +#undef silk_max_16 +static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) +{ + ops_count += 1; + return (((a) > (b)) ? (a) : (b)); +} +#undef silk_max_32 +static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) +{ + ops_count += 1; + return (((a) > (b)) ? (a) : (b)); +} + +#undef silk_max_64 +static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) +{ + ops_count += 1; + return (((a) > (b)) ? (a) : (b)); +} + + +#undef silk_LIMIT_int +static OPUS_INLINE opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2) +{ + opus_int ret; + ops_count += 6; + + ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ + : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); + + return(ret); +} + +#undef silk_LIMIT_16 +static OPUS_INLINE opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2) +{ + opus_int16 ret; + ops_count += 6; + + ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ + : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); + +return(ret); +} + + +#undef silk_LIMIT_32 +static OPUS_INLINE opus_int32 silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) +{ + opus_int32 ret; + ops_count += 6; + + ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ + : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); + return(ret); +} + +#else +#define varDefine +#define silk_SaveCount() + +#endif +#endif + diff --git a/src/libopus/silk/MacroDebug.h b/src/libopus/silk/MacroDebug.h new file mode 100644 index 00000000..3110da9a --- /dev/null +++ b/src/libopus/silk/MacroDebug.h @@ -0,0 +1,945 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Copyright (C) 2012 Xiph.Org Foundation +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 MACRO_DEBUG_H +#define MACRO_DEBUG_H + +/* Redefine macro functions with extensive assertion in DEBUG mode. + As functions can't be undefined, this file can't work with SigProcFIX_MacroCount.h */ + +#if ( defined (FIXED_DEBUG) || ( 0 && defined (_DEBUG) ) ) && !defined (silk_MACRO_COUNT) + +#undef silk_ADD16 +#define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){ + opus_int16 ret; + + ret = a + b; + if ( ret != silk_ADD_SAT16( a, b ) ) + { + fprintf (stderr, "silk_ADD16(%d, %d) in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_ADD32 +#define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){ + opus_int32 ret; + + ret = (opus_int32)((opus_uint32)a + (opus_uint32)b); + if ( ret != silk_ADD_SAT32( a, b ) ) + { + fprintf (stderr, "silk_ADD32(%d, %d) in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_ADD64 +#define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){ + opus_int64 ret; + + ret = a + b; + if ( ret != silk_ADD_SAT64( a, b ) ) + { + fprintf (stderr, "silk_ADD64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SUB16 +#define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){ + opus_int16 ret; + + ret = a - b; + if ( ret != silk_SUB_SAT16( a, b ) ) + { + fprintf (stderr, "silk_SUB16(%d, %d) in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SUB32 +#define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){ + opus_int64 ret; + + ret = a - (opus_int64)b; + if ( ret != silk_SUB_SAT32( a, b ) ) + { + fprintf (stderr, "silk_SUB32(%d, %d) in %s: line %d\n", a, b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SUB64 +#define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){ + opus_int64 ret; + + ret = a - b; + if ( ret != silk_SUB_SAT64( a, b ) ) + { + fprintf (stderr, "silk_SUB64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_ADD_SAT16 +#define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line) { + opus_int16 res; + res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); + if ( res != silk_SAT16( (opus_int32)a16 + (opus_int32)b16 ) ) + { + fprintf (stderr, "silk_ADD_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_ADD_SAT32 +#define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *file, int line){ + opus_int32 res; + res = ((((opus_uint32)(a32) + (opus_uint32)(b32)) & 0x80000000) == 0 ? \ + ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ + ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); + if ( res != silk_SAT32( (opus_int64)a32 + (opus_int64)b32 ) ) + { + fprintf (stderr, "silk_ADD_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_ADD_SAT64 +#define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line) { + opus_int64 res; + int fail = 0; + res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ + ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ + ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); + if( res != a64 + b64 ) { + /* Check that we saturated to the correct extreme value */ + if ( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || + ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) ) ) + { + fail = 1; + } + } else { + /* Saturation not necessary */ + fail = res != a64 + b64; + } + if ( fail ) + { + fprintf (stderr, "silk_ADD_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_SUB_SAT16 +#define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line ) { + opus_int16 res; + res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); + if ( res != silk_SAT16( (opus_int32)a16 - (opus_int32)b16 ) ) + { + fprintf (stderr, "silk_SUB_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_SUB_SAT32 +#define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char *file, int line ) { + opus_int32 res; + res = ((((opus_uint32)(a32)-(opus_uint32)(b32)) & 0x80000000) == 0 ? \ + (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ + ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); + if ( res != silk_SAT32( (opus_int64)a32 - (opus_int64)b32 ) ) + { + fprintf (stderr, "silk_SUB_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_SUB_SAT64 +#define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line ) { + opus_int64 res; + int fail = 0; + res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ + (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ + ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); + if( res != a64 - b64 ) { + /* Check that we saturated to the correct extreme value */ + if( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || + ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) )) + { + fail = 1; + } + } else { + /* Saturation not necessary */ + fail = res != a64 - b64; + } + if ( fail ) + { + fprintf (stderr, "silk_SUB_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return res; +} + +#undef silk_MUL +#define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, int line){ + opus_int32 ret; + opus_int64 ret64; + ret = (opus_int32)((opus_uint32)a32 * (opus_uint32)b32); + ret64 = (opus_int64)a32 * (opus_int64)b32; + if ( (opus_int64)ret != ret64 ) + { + fprintf (stderr, "silk_MUL(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_MUL_uint +#define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char *file, int line){ + opus_uint32 ret; + ret = a32 * b32; + if ( (opus_uint64)ret != (opus_uint64)a32 * (opus_uint64)b32 ) + { + fprintf (stderr, "silk_MUL_uint(%u, %u) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_MLA +#define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = a32 + b32 * c32; + if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) + { + fprintf (stderr, "silk_MLA(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_MLA_uint +#define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32, char *file, int line){ + opus_uint32 ret; + ret = a32 + b32 * c32; + if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) + { + fprintf (stderr, "silk_MLA_uint(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMULWB +#define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file, int line){ + opus_int32 ret; + ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); + if ( (opus_int64)ret != ((opus_int64)a32 * (opus_int16)b32) >> 16 ) + { + fprintf (stderr, "silk_SMULWB(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMLAWB +#define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = silk_ADD32_ovflw( a32, silk_SMULWB( b32, c32 ) ); + if ( ret != silk_ADD_SAT32( a32, silk_SMULWB( b32, c32 ) ) ) + { + fprintf (stderr, "silk_SMLAWB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMULWT +#define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file, int line){ + opus_int32 ret; + ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); + if ( (opus_int64)ret != ((opus_int64)a32 * (b32 >> 16)) >> 16 ) + { + fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMLAWT +#define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); + if ( (opus_int64)ret != (opus_int64)a32 + (((opus_int64)b32 * (c32 >> 16)) >> 16) ) + { + fprintf (stderr, "silk_SMLAWT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMULL +#define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, int line){ + opus_int64 ret64; + int fail = 0; + ret64 = a64 * b64; + if( b64 != 0 ) { + fail = a64 != (ret64 / b64); + } else if( a64 != 0 ) { + fail = b64 != (ret64 / a64); + } + if ( fail ) + { + fprintf (stderr, "silk_SMULL(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret64; +} + +/* no checking needed for silk_SMULBB */ +#undef silk_SMLABB +#define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); + if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int16)c32 ) + { + fprintf (stderr, "silk_SMLABB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +/* no checking needed for silk_SMULBT */ +#undef silk_SMLABT +#define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); + if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (c32 >> 16) ) + { + fprintf (stderr, "silk_SMLABT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +/* no checking needed for silk_SMULTT */ +#undef silk_SMLATT +#define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret; + ret = a32 + (b32 >> 16) * (c32 >> 16); + if ( (opus_int64)ret != (opus_int64)a32 + (b32 >> 16) * (c32 >> 16) ) + { + fprintf (stderr, "silk_SMLATT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_SMULWW +#define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file, int line){ + opus_int32 ret, tmp1, tmp2; + opus_int64 ret64; + int fail = 0; + + ret = silk_SMULWB( a32, b32 ); + tmp1 = silk_RSHIFT_ROUND( b32, 16 ); + tmp2 = silk_MUL( a32, tmp1 ); + + fail |= (opus_int64)tmp2 != (opus_int64) a32 * (opus_int64) tmp1; + + tmp1 = ret; + ret = silk_ADD32( tmp1, tmp2 ); + fail |= silk_ADD32( tmp1, tmp2 ) != silk_ADD_SAT32( tmp1, tmp2 ); + + ret64 = silk_RSHIFT64( silk_SMULL( a32, b32 ), 16 ); + fail |= (opus_int64)ret != ret64; + + if ( fail ) + { + fprintf (stderr, "silk_SMULWW(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + + return ret; +} + +#undef silk_SMLAWW +#define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ + opus_int32 ret, tmp; + + tmp = silk_SMULWW( b32, c32 ); + ret = silk_ADD32( a32, tmp ); + if ( ret != silk_ADD_SAT32( a32, tmp ) ) + { + fprintf (stderr, "silk_SMLAWW(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +/* no checking needed for silk_SMULL + no checking needed for silk_SMLAL + no checking needed for silk_SMLALBB + no checking needed for SigProcFIX_CLZ16 + no checking needed for SigProcFIX_CLZ32*/ + +#undef silk_DIV32 +#define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, int line){ + if ( b32 == 0 ) + { + fprintf (stderr, "silk_DIV32(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a32 / b32; +} + +#undef silk_DIV32_16 +#define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *file, int line){ + int fail = 0; + fail |= b32 == 0; + fail |= b32 > silk_int16_MAX; + fail |= b32 < silk_int16_MIN; + if ( fail ) + { + fprintf (stderr, "silk_DIV32_16(%d, %d) in %s: line %d\n", a32, b32, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a32 / b32; +} + +/* no checking needed for silk_SAT8 + no checking needed for silk_SAT16 + no checking needed for silk_SAT32 + no checking needed for silk_POS_SAT32 + no checking needed for silk_ADD_POS_SAT8 + no checking needed for silk_ADD_POS_SAT16 + no checking needed for silk_ADD_POS_SAT32 */ + +#undef silk_LSHIFT8 +#define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ + opus_int8 ret; + int fail = 0; + ret = (opus_int8)((opus_uint8)a << shift); + fail |= shift < 0; + fail |= shift >= 8; + fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift); + if ( fail ) + { + fprintf (stderr, "silk_LSHIFT8(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_LSHIFT16 +#define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ + opus_int16 ret; + int fail = 0; + ret = (opus_int16)((opus_uint16)a << shift); + fail |= shift < 0; + fail |= shift >= 16; + fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift); + if ( fail ) + { + fprintf (stderr, "silk_LSHIFT16(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_LSHIFT32 +#define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ + opus_int32 ret; + int fail = 0; + ret = (opus_int32)((opus_uint32)a << shift); + fail |= shift < 0; + fail |= shift >= 32; + fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift); + if ( fail ) + { + fprintf (stderr, "silk_LSHIFT32(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_LSHIFT64 +#define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file, int line){ + opus_int64 ret; + int fail = 0; + ret = (opus_int64)((opus_uint64)a << shift); + fail |= shift < 0; + fail |= shift >= 64; + fail |= (ret>>shift) != ((opus_int64)a); + if ( fail ) + { + fprintf (stderr, "silk_LSHIFT64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_LSHIFT_ovflw +#define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char *file, int line){ + if ( (shift < 0) || (shift >= 32) ) /* no check for overflow */ + { + fprintf (stderr, "silk_LSHIFT_ovflw(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a << shift; +} + +#undef silk_LSHIFT_uint +#define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ + opus_uint32 ret; + ret = a << shift; + if ( (shift < 0) || ((opus_int64)ret != ((opus_int64)a) << shift)) + { + fprintf (stderr, "silk_LSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_RSHIFT8 +#define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ + if ( (shift < 0) || (shift>=8) ) + { + fprintf (stderr, "silk_RSHITF8(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a >> shift; +} + +#undef silk_RSHIFT16 +#define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ + if ( (shift < 0) || (shift>=16) ) + { + fprintf (stderr, "silk_RSHITF16(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a >> shift; +} + +#undef silk_RSHIFT32 +#define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ + if ( (shift < 0) || (shift>=32) ) + { + fprintf (stderr, "silk_RSHITF32(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a >> shift; +} + +#undef silk_RSHIFT64 +#define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *file, int line){ + if ( (shift < 0) || (shift>=64) ) + { + fprintf (stderr, "silk_RSHITF64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a >> shift; +} + +#undef silk_RSHIFT_uint +#define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ + if ( (shift < 0) || (shift>32) ) + { + fprintf (stderr, "silk_RSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return a >> shift; +} + +#undef silk_ADD_LSHIFT +#define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line){ + opus_int16 ret; + ret = a + (opus_int16)((opus_uint16)b << shift); + if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (opus_int64)(((opus_uint64)b) << shift)) ) + { + fprintf (stderr, "silk_ADD_LSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift >= 0 */ +} + +#undef silk_ADD_LSHIFT32 +#define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ + opus_int32 ret; + ret = silk_ADD32_ovflw(a, (opus_int32)((opus_uint32)b << shift)); + if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (opus_int64)(((opus_uint64)b) << shift)) ) + { + fprintf (stderr, "silk_ADD_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift >= 0 */ +} + +#undef silk_ADD_LSHIFT_uint +#define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ + opus_uint32 ret; + ret = a + (b << shift); + if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) + { + fprintf (stderr, "silk_ADD_LSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift >= 0 */ +} + +#undef silk_ADD_RSHIFT +#define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line){ + opus_int16 ret; + ret = a + (b >> shift); + if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) + { + fprintf (stderr, "silk_ADD_RSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift > 0 */ +} + +#undef silk_ADD_RSHIFT32 +#define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ + opus_int32 ret; + ret = silk_ADD32_ovflw(a, (b >> shift)); + if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) + { + fprintf (stderr, "silk_ADD_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift > 0 */ +} + +#undef silk_ADD_RSHIFT_uint +#define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ + opus_uint32 ret; + ret = a + (b >> shift); + if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) + { + fprintf (stderr, "silk_ADD_RSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift > 0 */ +} + +#undef silk_SUB_LSHIFT32 +#define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ + opus_int32 ret; + ret = silk_SUB32_ovflw(a, (opus_int32)((opus_uint32)b << shift)); + if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (opus_int64)(((opus_uint64)b) << shift)) ) + { + fprintf (stderr, "silk_SUB_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift >= 0 */ +} + +#undef silk_SUB_RSHIFT32 +#define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ + opus_int32 ret; + ret = silk_SUB32_ovflw(a, (b >> shift)); + if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) >> shift)) ) + { + fprintf (stderr, "silk_SUB_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; /* shift > 0 */ +} + +#undef silk_RSHIFT_ROUND +#define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char *file, int line){ + opus_int32 ret; + ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; + /* the macro definition can't handle a shift of zero */ + if ( (shift <= 0) || (shift>31) || ((opus_int64)ret != ((opus_int64)a + ((opus_int64)1 << (shift - 1))) >> shift) ) + { + fprintf (stderr, "silk_RSHIFT_ROUND(%d, %d) in %s: line %d\n", a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return ret; +} + +#undef silk_RSHIFT_ROUND64 +#define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, char *file, int line){ + opus_int64 ret; + /* the macro definition can't handle a shift of zero */ + if ( (shift <= 0) || (shift>=64) ) + { + fprintf (stderr, "silk_RSHIFT_ROUND64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; + return ret; +} + +/* silk_abs is used on floats also, so doesn't work... */ +/*#undef silk_abs +static OPUS_INLINE opus_int32 silk_abs(opus_int32 a){ + silk_assert(a != 0x80000000); + return (((a) > 0) ? (a) : -(a)); // Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN +}*/ + +#undef silk_abs_int64 +#define silk_abs_int64(a) silk_abs_int64_((a), __FILE__, __LINE__) +static OPUS_INLINE opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){ + if ( a == silk_int64_MIN ) + { + fprintf (stderr, "silk_abs_int64(%lld) in %s: line %d\n", (long long)a, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ +} + +#undef silk_abs_int32 +#define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){ + if ( a == silk_int32_MIN ) + { + fprintf (stderr, "silk_abs_int32(%d) in %s: line %d\n", a, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return silk_abs(a); +} + +#undef silk_CHECK_FIT8 +#define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __LINE__) +static OPUS_INLINE opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){ + opus_int8 ret; + ret = (opus_int8)a; + if ( (opus_int64)ret != a ) + { + fprintf (stderr, "silk_CHECK_FIT8(%lld) in %s: line %d\n", (long long)a, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return( ret ); +} + +#undef silk_CHECK_FIT16 +#define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __LINE__) +static OPUS_INLINE opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ){ + opus_int16 ret; + ret = (opus_int16)a; + if ( (opus_int64)ret != a ) + { + fprintf (stderr, "silk_CHECK_FIT16(%lld) in %s: line %d\n", (long long)a, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return( ret ); +} + +#undef silk_CHECK_FIT32 +#define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __LINE__) +static OPUS_INLINE opus_int32 silk_CHECK_FIT32_( opus_int64 a, char *file, int line ){ + opus_int32 ret; + ret = (opus_int32)a; + if ( (opus_int64)ret != a ) + { + fprintf (stderr, "silk_CHECK_FIT32(%lld) in %s: line %d\n", (long long)a, file, line); +#ifdef FIXED_DEBUG_ASSERT + silk_assert( 0 ); +#endif + } + return( ret ); +} + +/* no checking for silk_NSHIFT_MUL_32_32 + no checking for silk_NSHIFT_MUL_16_16 + no checking needed for silk_min + no checking needed for silk_max + no checking needed for silk_sign +*/ + +#endif +#endif /* MACRO_DEBUG_H */ diff --git a/src/libopus/silk/NLSF2A.c b/src/libopus/silk/NLSF2A.c new file mode 100644 index 00000000..a2c15b9a --- /dev/null +++ b/src/libopus/silk/NLSF2A.c @@ -0,0 +1,141 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* conversion between prediction filter coefficients and LSFs */ +/* order should be even */ +/* a piecewise linear approximation maps LSF <-> cos(LSF) */ +/* therefore the result is not accurate LSFs, but the two */ +/* functions are accurate inverses of each other */ + +#include "SigProc_FIX.h" +#include "tables.h" + +#define QA 16 + +/* helper function for NLSF2A(..) */ +static OPUS_INLINE void silk_NLSF2A_find_poly( + opus_int32 *out, /* O intermediate polynomial, QA [dd+1] */ + const opus_int32 *cLSF, /* I vector of interleaved 2*cos(LSFs), QA [d] */ + opus_int dd /* I polynomial order (= 1/2 * filter order) */ +) +{ + opus_int k, n; + opus_int32 ftmp; + + out[0] = silk_LSHIFT( 1, QA ); + out[1] = -cLSF[0]; + for( k = 1; k < dd; k++ ) { + ftmp = cLSF[2*k]; /* QA*/ + out[k+1] = silk_LSHIFT( out[k-1], 1 ) - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[k] ), QA ); + for( n = k; n > 1; n-- ) { + out[n] += out[n-2] - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[n-1] ), QA ); + } + out[1] -= ftmp; + } +} + +/* compute whitening filter coefficients from normalized line spectral frequencies */ +void silk_NLSF2A( + opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ + const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ + const opus_int d, /* I filter order (should be even) */ + int arch /* I Run-time architecture */ +) +{ + /* This ordering was found to maximize quality. It improves numerical accuracy of + silk_NLSF2A_find_poly() compared to "standard" ordering. */ + static const unsigned char ordering16[16] = { + 0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1 + }; + static const unsigned char ordering10[10] = { + 0, 9, 6, 3, 4, 5, 8, 1, 2, 7 + }; + const unsigned char *ordering; + opus_int k, i, dd; + opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; + opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; + opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; + + silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); + celt_assert( d==10 || d==16 ); + + /* convert LSFs to 2*cos(LSF), using piecewise linear curve from table */ + ordering = d == 16 ? ordering16 : ordering10; + for( k = 0; k < d; k++ ) { + silk_assert( NLSF[k] >= 0 ); + + /* f_int on a scale 0-127 (rounded down) */ + f_int = silk_RSHIFT( NLSF[k], 15 - 7 ); + + /* f_frac, range: 0..255 */ + f_frac = NLSF[k] - silk_LSHIFT( f_int, 15 - 7 ); + + silk_assert(f_int >= 0); + silk_assert(f_int < LSF_COS_TAB_SZ_FIX ); + + /* Read start and end value from table */ + cos_val = silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */ + delta = silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */ + + /* Linear interpolation */ + cos_LSF_QA[ordering[k]] = silk_RSHIFT_ROUND( silk_LSHIFT( cos_val, 8 ) + silk_MUL( delta, f_frac ), 20 - QA ); /* QA */ + } + + dd = silk_RSHIFT( d, 1 ); + + /* generate even and odd polynomials using convolution */ + silk_NLSF2A_find_poly( P, &cos_LSF_QA[ 0 ], dd ); + silk_NLSF2A_find_poly( Q, &cos_LSF_QA[ 1 ], dd ); + + /* convert even and odd polynomials to opus_int32 Q12 filter coefs */ + for( k = 0; k < dd; k++ ) { + Ptmp = P[ k+1 ] + P[ k ]; + Qtmp = Q[ k+1 ] - Q[ k ]; + + /* the Ptmp and Qtmp values at this stage need to fit in int32 */ + a32_QA1[ k ] = -Qtmp - Ptmp; /* QA+1 */ + a32_QA1[ d-k-1 ] = Qtmp - Ptmp; /* QA+1 */ + } + + /* Convert int32 coefficients to Q12 int16 coefs */ + silk_LPC_fit( a_Q12, a32_QA1, 12, QA + 1, d ); + + for( i = 0; silk_LPC_inverse_pred_gain( a_Q12, d, arch ) == 0 && i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { + /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ + /* on the unscaled coefficients, convert to Q12 and measure again */ + silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); + for( k = 0; k < d; k++ ) { + a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ + } + } +} + diff --git a/src/libopus/silk/NLSF_VQ.c b/src/libopus/silk/NLSF_VQ.c new file mode 100644 index 00000000..81f30e7f --- /dev/null +++ b/src/libopus/silk/NLSF_VQ.c @@ -0,0 +1,76 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ +void silk_NLSF_VQ( + opus_int32 err_Q24[], /* O Quantization errors [K] */ + const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ + const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ + const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ + const opus_int K, /* I Number of codebook vectors */ + const opus_int LPC_order /* I Number of LPCs */ +) +{ + opus_int i, m; + opus_int32 diff_Q15, diffw_Q24, sum_error_Q24, pred_Q24; + const opus_int16 *w_Q9_ptr; + const opus_uint8 *cb_Q8_ptr; + + celt_assert( ( LPC_order & 1 ) == 0 ); + + /* Loop over codebook */ + cb_Q8_ptr = pCB_Q8; + w_Q9_ptr = pWght_Q9; + for( i = 0; i < K; i++ ) { + sum_error_Q24 = 0; + pred_Q24 = 0; + for( m = LPC_order-2; m >= 0; m -= 2 ) { + /* Compute weighted absolute predictive quantization error for index m + 1 */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m + 1 ], (opus_int32)cb_Q8_ptr[ m + 1 ], 7 ); /* range: [ -32767 : 32767 ]*/ + diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m + 1 ] ); + sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); + pred_Q24 = diffw_Q24; + + /* Compute weighted absolute predictive quantization error for index m */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)cb_Q8_ptr[ m ], 7 ); /* range: [ -32767 : 32767 ]*/ + diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m ] ); + sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); + pred_Q24 = diffw_Q24; + + silk_assert( sum_error_Q24 >= 0 ); + } + err_Q24[ i ] = sum_error_Q24; + cb_Q8_ptr += LPC_order; + w_Q9_ptr += LPC_order; + } +} diff --git a/src/libopus/silk/NLSF_VQ_weights_laroia.c b/src/libopus/silk/NLSF_VQ_weights_laroia.c new file mode 100644 index 00000000..86cdc5c6 --- /dev/null +++ b/src/libopus/silk/NLSF_VQ_weights_laroia.c @@ -0,0 +1,80 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "define.h" +#include "SigProc_FIX.h" + +/* +R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP +Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech, +Signal Processing, pp. 641-644, 1991. +*/ + +/* Laroia low complexity NLSF weights */ +void silk_NLSF_VQ_weights_laroia( + opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ + const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ + const opus_int D /* I Input vector dimension (even) */ +) +{ + opus_int k; + opus_int32 tmp1_int, tmp2_int; + + celt_assert( D > 0 ); + celt_assert( ( D & 1 ) == 0 ); + + /* First value */ + tmp1_int = silk_max_int( pNLSF_Q15[ 0 ], 1 ); + tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); + tmp2_int = silk_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], 1 ); + tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); + pNLSFW_Q_OUT[ 0 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); + silk_assert( pNLSFW_Q_OUT[ 0 ] > 0 ); + + /* Main loop */ + for( k = 1; k < D - 1; k += 2 ) { + tmp1_int = silk_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], 1 ); + tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); + pNLSFW_Q_OUT[ k ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); + silk_assert( pNLSFW_Q_OUT[ k ] > 0 ); + + tmp2_int = silk_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], 1 ); + tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); + pNLSFW_Q_OUT[ k + 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); + silk_assert( pNLSFW_Q_OUT[ k + 1 ] > 0 ); + } + + /* Last value */ + tmp1_int = silk_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], 1 ); + tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); + pNLSFW_Q_OUT[ D - 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); + silk_assert( pNLSFW_Q_OUT[ D - 1 ] > 0 ); +} diff --git a/src/libopus/silk/NLSF_decode.c b/src/libopus/silk/NLSF_decode.c new file mode 100644 index 00000000..f4d10fca --- /dev/null +++ b/src/libopus/silk/NLSF_decode.c @@ -0,0 +1,93 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Predictive dequantizer for NLSF residuals */ +static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ + opus_int16 x_Q10[], /* O Output [ order ] */ + const opus_int8 indices[], /* I Quantization indices [ order ] */ + const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ + const opus_int quant_step_size_Q16, /* I Quantization step size */ + const opus_int16 order /* I Number of input values */ +) +{ + opus_int i, out_Q10, pred_Q10; + + out_Q10 = 0; + for( i = order-1; i >= 0; i-- ) { + pred_Q10 = silk_RSHIFT( silk_SMULBB( out_Q10, (opus_int16)pred_coef_Q8[ i ] ), 8 ); + out_Q10 = silk_LSHIFT( indices[ i ], 10 ); + if( out_Q10 > 0 ) { + out_Q10 = silk_SUB16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else if( out_Q10 < 0 ) { + out_Q10 = silk_ADD16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } + out_Q10 = silk_SMLAWB( pred_Q10, (opus_int32)out_Q10, quant_step_size_Q16 ); + x_Q10[ i ] = out_Q10; + } +} + + +/***********************/ +/* NLSF vector decoder */ +/***********************/ +void silk_NLSF_decode( + opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ + opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ + const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ +) +{ + opus_int i; + opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; + opus_int16 ec_ix[ MAX_LPC_ORDER ]; + opus_int16 res_Q10[ MAX_LPC_ORDER ]; + opus_int32 NLSF_Q15_tmp; + const opus_uint8 *pCB_element; + const opus_int16 *pCB_Wght_Q9; + + /* Unpack entropy table indices and predictor for current CB1 index */ + silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); + + /* Predictive residual dequantizer */ + silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); + + /* Apply inverse square-rooted weights to first stage and add to output */ + pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; + pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; + for( i = 0; i < psNLSF_CB->order; i++ ) { + NLSF_Q15_tmp = silk_ADD_LSHIFT32( silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), pCB_Wght_Q9[ i ] ), (opus_int16)pCB_element[ i ], 7 ); + pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); + } + + /* NLSF stabilization */ + silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); +} diff --git a/src/libopus/silk/NLSF_del_dec_quant.c b/src/libopus/silk/NLSF_del_dec_quant.c new file mode 100644 index 00000000..728aa814 --- /dev/null +++ b/src/libopus/silk/NLSF_del_dec_quant.c @@ -0,0 +1,215 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Delayed-decision quantizer for NLSF residuals */ +opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ + opus_int8 indices[], /* O Quantization indices [ order ] */ + const opus_int16 x_Q10[], /* I Input [ order ] */ + const opus_int16 w_Q5[], /* I Weights [ order ] */ + const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ + const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ + const opus_uint8 ec_rates_Q5[], /* I Rates [] */ + const opus_int quant_step_size_Q16, /* I Quantization step size */ + const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ + const opus_int32 mu_Q20, /* I R/D tradeoff */ + const opus_int16 order /* I Number of input values */ +) +{ + opus_int i, j, nStates, ind_tmp, ind_min_max, ind_max_min, in_Q10, res_Q10; + opus_int pred_Q10, diff_Q10, rate0_Q5, rate1_Q5; + opus_int16 out0_Q10, out1_Q10; + opus_int32 RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25; + opus_int ind_sort[ NLSF_QUANT_DEL_DEC_STATES ]; + opus_int8 ind[ NLSF_QUANT_DEL_DEC_STATES ][ MAX_LPC_ORDER ]; + opus_int16 prev_out_Q10[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; + opus_int32 RD_Q25[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; + opus_int32 RD_min_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; + opus_int32 RD_max_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; + const opus_uint8 *rates_Q5; + + opus_int out0_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; + opus_int out1_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; + + for (i = -NLSF_QUANT_MAX_AMPLITUDE_EXT; i <= NLSF_QUANT_MAX_AMPLITUDE_EXT-1; i++) + { + out0_Q10 = silk_LSHIFT( i, 10 ); + out1_Q10 = silk_ADD16( out0_Q10, 1024 ); + if( i > 0 ) { + out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else if( i == 0 ) { + out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else if( i == -1 ) { + out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else { + out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } + out0_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out0_Q10, quant_step_size_Q16 ), 16 ); + out1_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out1_Q10, quant_step_size_Q16 ), 16 ); + } + + silk_assert( (NLSF_QUANT_DEL_DEC_STATES & (NLSF_QUANT_DEL_DEC_STATES-1)) == 0 ); /* must be power of two */ + + nStates = 1; + RD_Q25[ 0 ] = 0; + prev_out_Q10[ 0 ] = 0; + for( i = order - 1; i >= 0; i-- ) { + rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ]; + in_Q10 = x_Q10[ i ]; + for( j = 0; j < nStates; j++ ) { + pred_Q10 = silk_RSHIFT( silk_SMULBB( (opus_int16)pred_coef_Q8[ i ], prev_out_Q10[ j ] ), 8 ); + res_Q10 = silk_SUB16( in_Q10, pred_Q10 ); + ind_tmp = silk_RSHIFT( silk_SMULBB( inv_quant_step_size_Q6, res_Q10 ), 16 ); + ind_tmp = silk_LIMIT( ind_tmp, -NLSF_QUANT_MAX_AMPLITUDE_EXT, NLSF_QUANT_MAX_AMPLITUDE_EXT-1 ); + ind[ j ][ i ] = (opus_int8)ind_tmp; + + /* compute outputs for ind_tmp and ind_tmp + 1 */ + out0_Q10 = out0_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; + out1_Q10 = out1_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; + + out0_Q10 = silk_ADD16( out0_Q10, pred_Q10 ); + out1_Q10 = silk_ADD16( out1_Q10, pred_Q10 ); + prev_out_Q10[ j ] = out0_Q10; + prev_out_Q10[ j + nStates ] = out1_Q10; + + /* compute RD for ind_tmp and ind_tmp + 1 */ + if( ind_tmp + 1 >= NLSF_QUANT_MAX_AMPLITUDE ) { + if( ind_tmp + 1 == NLSF_QUANT_MAX_AMPLITUDE ) { + rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; + rate1_Q5 = 280; + } else { + rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, 43, ind_tmp ); + rate1_Q5 = silk_ADD16( rate0_Q5, 43 ); + } + } else if( ind_tmp <= -NLSF_QUANT_MAX_AMPLITUDE ) { + if( ind_tmp == -NLSF_QUANT_MAX_AMPLITUDE ) { + rate0_Q5 = 280; + rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; + } else { + rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, -43, ind_tmp ); + rate1_Q5 = silk_SUB16( rate0_Q5, 43 ); + } + } else { + rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; + rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; + } + RD_tmp_Q25 = RD_Q25[ j ]; + diff_Q10 = silk_SUB16( in_Q10, out0_Q10 ); + RD_Q25[ j ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate0_Q5 ); + diff_Q10 = silk_SUB16( in_Q10, out1_Q10 ); + RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 ); + } + + if( nStates <= NLSF_QUANT_DEL_DEC_STATES/2 ) { + /* double number of states and copy */ + for( j = 0; j < nStates; j++ ) { + ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; + } + nStates = silk_LSHIFT( nStates, 1 ); + for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { + ind[ j ][ i ] = ind[ j - nStates ][ i ]; + } + } else { + /* sort lower and upper half of RD_Q25, pairwise */ + for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { + if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) { + RD_max_Q25[ j ] = RD_Q25[ j ]; + RD_min_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; + RD_Q25[ j ] = RD_min_Q25[ j ]; + RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] = RD_max_Q25[ j ]; + /* swap prev_out values */ + out0_Q10 = prev_out_Q10[ j ]; + prev_out_Q10[ j ] = prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ]; + prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ] = out0_Q10; + ind_sort[ j ] = j + NLSF_QUANT_DEL_DEC_STATES; + } else { + RD_min_Q25[ j ] = RD_Q25[ j ]; + RD_max_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; + ind_sort[ j ] = j; + } + } + /* compare the highest RD values of the winning half with the lowest one in the losing half, and copy if necessary */ + /* afterwards ind_sort[] will contain the indices of the NLSF_QUANT_DEL_DEC_STATES winning RD values */ + while( 1 ) { + min_max_Q25 = silk_int32_MAX; + max_min_Q25 = 0; + ind_min_max = 0; + ind_max_min = 0; + for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { + if( min_max_Q25 > RD_max_Q25[ j ] ) { + min_max_Q25 = RD_max_Q25[ j ]; + ind_min_max = j; + } + if( max_min_Q25 < RD_min_Q25[ j ] ) { + max_min_Q25 = RD_min_Q25[ j ]; + ind_max_min = j; + } + } + if( min_max_Q25 >= max_min_Q25 ) { + break; + } + /* copy ind_min_max to ind_max_min */ + ind_sort[ ind_max_min ] = ind_sort[ ind_min_max ] ^ NLSF_QUANT_DEL_DEC_STATES; + RD_Q25[ ind_max_min ] = RD_Q25[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; + prev_out_Q10[ ind_max_min ] = prev_out_Q10[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; + RD_min_Q25[ ind_max_min ] = 0; + RD_max_Q25[ ind_min_max ] = silk_int32_MAX; + silk_memcpy( ind[ ind_max_min ], ind[ ind_min_max ], MAX_LPC_ORDER * sizeof( opus_int8 ) ); + } + /* increment index if it comes from the upper half */ + for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { + ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 ); + } + } + } + + /* last sample: find winner, copy indices and return RD value */ + ind_tmp = 0; + min_Q25 = silk_int32_MAX; + for( j = 0; j < 2 * NLSF_QUANT_DEL_DEC_STATES; j++ ) { + if( min_Q25 > RD_Q25[ j ] ) { + min_Q25 = RD_Q25[ j ]; + ind_tmp = j; + } + } + for( j = 0; j < order; j++ ) { + indices[ j ] = ind[ ind_tmp & ( NLSF_QUANT_DEL_DEC_STATES - 1 ) ][ j ]; + silk_assert( indices[ j ] >= -NLSF_QUANT_MAX_AMPLITUDE_EXT ); + silk_assert( indices[ j ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); + } + indices[ 0 ] += silk_RSHIFT( ind_tmp, NLSF_QUANT_DEL_DEC_STATES_LOG2 ); + silk_assert( indices[ 0 ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); + silk_assert( min_Q25 >= 0 ); + return min_Q25; +} diff --git a/src/libopus/silk/NLSF_encode.c b/src/libopus/silk/NLSF_encode.c new file mode 100644 index 00000000..01aadd01 --- /dev/null +++ b/src/libopus/silk/NLSF_encode.c @@ -0,0 +1,124 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +/***********************/ +/* NLSF vector encoder */ +/***********************/ +opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ + opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ + opus_int16 *pNLSF_Q15, /* I/O (Un)quantized NLSF vector [ LPC_ORDER ] */ + const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ + const opus_int16 *pW_Q2, /* I NLSF weight vector [ LPC_ORDER ] */ + const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ + const opus_int nSurvivors, /* I Max survivors after first stage */ + const opus_int signalType /* I Signal type: 0/1/2 */ +) +{ + opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7; + opus_int32 W_tmp_Q9, ret; + VARDECL( opus_int32, err_Q24 ); + VARDECL( opus_int32, RD_Q25 ); + VARDECL( opus_int, tempIndices1 ); + VARDECL( opus_int8, tempIndices2 ); + opus_int16 res_Q10[ MAX_LPC_ORDER ]; + opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ]; + opus_int16 W_adj_Q5[ MAX_LPC_ORDER ]; + opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; + opus_int16 ec_ix[ MAX_LPC_ORDER ]; + const opus_uint8 *pCB_element, *iCDF_ptr; + const opus_int16 *pCB_Wght_Q9; + SAVE_STACK; + + celt_assert( signalType >= 0 && signalType <= 2 ); + silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); + + /* NLSF stabilization */ + silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); + + /* First stage: VQ */ + ALLOC( err_Q24, psNLSF_CB->nVectors, opus_int32 ); + silk_NLSF_VQ( err_Q24, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->CB1_Wght_Q9, psNLSF_CB->nVectors, psNLSF_CB->order ); + + /* Sort the quantization errors */ + ALLOC( tempIndices1, nSurvivors, opus_int ); + silk_insertion_sort_increasing( err_Q24, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); + + ALLOC( RD_Q25, nSurvivors, opus_int32 ); + ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); + + /* Loop over survivors */ + for( s = 0; s < nSurvivors; s++ ) { + ind1 = tempIndices1[ s ]; + + /* Residual after first stage */ + pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; + pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ ind1 * psNLSF_CB->order ]; + for( i = 0; i < psNLSF_CB->order; i++ ) { + NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ); + W_tmp_Q9 = pCB_Wght_Q9[ i ]; + res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ], W_tmp_Q9 ), 14 ); + W_adj_Q5[ i ] = silk_DIV32_varQ( (opus_int32)pW_Q2[ i ], silk_SMULBB( W_tmp_Q9, W_tmp_Q9 ), 21 ); + } + + /* Unpack entropy table indices and predictor for current CB1 index */ + silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, ind1 ); + + /* Trellis quantizer */ + RD_Q25[ s ] = silk_NLSF_del_dec_quant( &tempIndices2[ s * MAX_LPC_ORDER ], res_Q10, W_adj_Q5, pred_Q8, ec_ix, + psNLSF_CB->ec_Rates_Q5, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->invQuantStepSize_Q6, NLSF_mu_Q20, psNLSF_CB->order ); + + /* Add rate for first stage */ + iCDF_ptr = &psNLSF_CB->CB1_iCDF[ ( signalType >> 1 ) * psNLSF_CB->nVectors ]; + if( ind1 == 0 ) { + prob_Q8 = 256 - iCDF_ptr[ ind1 ]; + } else { + prob_Q8 = iCDF_ptr[ ind1 - 1 ] - iCDF_ptr[ ind1 ]; + } + bits_q7 = ( 8 << 7 ) - silk_lin2log( prob_Q8 ); + RD_Q25[ s ] = silk_SMLABB( RD_Q25[ s ], bits_q7, silk_RSHIFT( NLSF_mu_Q20, 2 ) ); + } + + /* Find the lowest rate-distortion error */ + silk_insertion_sort_increasing( RD_Q25, &bestIndex, nSurvivors, 1 ); + + NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; + silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], psNLSF_CB->order * sizeof( opus_int8 ) ); + + /* Decode */ + silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); + + ret = RD_Q25[ 0 ]; + RESTORE_STACK; + return ret; +} diff --git a/src/libopus/silk/NLSF_stabilize.c b/src/libopus/silk/NLSF_stabilize.c new file mode 100644 index 00000000..ab389ccd --- /dev/null +++ b/src/libopus/silk/NLSF_stabilize.c @@ -0,0 +1,142 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* NLSF stabilizer: */ +/* */ +/* - Moves NLSFs further apart if they are too close */ +/* - Moves NLSFs away from borders if they are too close */ +/* - High effort to achieve a modification with minimum */ +/* Euclidean distance to input vector */ +/* - Output are sorted NLSF coefficients */ +/* */ + +#include "SigProc_FIX.h" + +/* Constant Definitions */ +#define MAX_LOOPS 20 + +/* NLSF stabilizer, for a single input data vector */ +void silk_NLSF_stabilize( + opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ + const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ + const opus_int L /* I Number of NLSF parameters in the input vector */ +) +{ + opus_int i, I=0, k, loops; + opus_int16 center_freq_Q15; + opus_int32 diff_Q15, min_diff_Q15, min_center_Q15, max_center_Q15; + + /* This is necessary to ensure an output within range of a opus_int16 */ + silk_assert( NDeltaMin_Q15[L] >= 1 ); + + for( loops = 0; loops < MAX_LOOPS; loops++ ) { + /**************************/ + /* Find smallest distance */ + /**************************/ + /* First element */ + min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0]; + I = 0; + /* Middle elements */ + for( i = 1; i <= L-1; i++ ) { + diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); + if( diff_Q15 < min_diff_Q15 ) { + min_diff_Q15 = diff_Q15; + I = i; + } + } + /* Last element */ + diff_Q15 = ( 1 << 15 ) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] ); + if( diff_Q15 < min_diff_Q15 ) { + min_diff_Q15 = diff_Q15; + I = L; + } + + /***************************************************/ + /* Now check if the smallest distance non-negative */ + /***************************************************/ + if( min_diff_Q15 >= 0 ) { + return; + } + + if( I == 0 ) { + /* Move away from lower limit */ + NLSF_Q15[0] = NDeltaMin_Q15[0]; + + } else if( I == L) { + /* Move away from higher limit */ + NLSF_Q15[L-1] = ( 1 << 15 ) - NDeltaMin_Q15[L]; + + } else { + /* Find the lower extreme for the location of the current center frequency */ + min_center_Q15 = 0; + for( k = 0; k < I; k++ ) { + min_center_Q15 += NDeltaMin_Q15[k]; + } + min_center_Q15 += silk_RSHIFT( NDeltaMin_Q15[I], 1 ); + + /* Find the upper extreme for the location of the current center frequency */ + max_center_Q15 = 1 << 15; + for( k = L; k > I; k-- ) { + max_center_Q15 -= NDeltaMin_Q15[k]; + } + max_center_Q15 -= silk_RSHIFT( NDeltaMin_Q15[I], 1 ); + + /* Move apart, sorted by value, keeping the same center frequency */ + center_freq_Q15 = (opus_int16)silk_LIMIT_32( silk_RSHIFT_ROUND( (opus_int32)NLSF_Q15[I-1] + (opus_int32)NLSF_Q15[I], 1 ), + min_center_Q15, max_center_Q15 ); + NLSF_Q15[I-1] = center_freq_Q15 - silk_RSHIFT( NDeltaMin_Q15[I], 1 ); + NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I]; + } + } + + /* Safe and simple fall back method, which is less ideal than the above */ + if( loops == MAX_LOOPS ) + { + /* Insertion sort (fast for already almost sorted arrays): */ + /* Best case: O(n) for an already sorted array */ + /* Worst case: O(n^2) for an inversely sorted array */ + silk_insertion_sort_increasing_all_values_int16( &NLSF_Q15[0], L ); + + /* First NLSF should be no less than NDeltaMin[0] */ + NLSF_Q15[0] = silk_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] ); + + /* Keep delta_min distance between the NLSFs */ + for( i = 1; i < L; i++ ) + NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], silk_ADD_SAT16( NLSF_Q15[i-1], NDeltaMin_Q15[i] ) ); + + /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ + NLSF_Q15[L-1] = silk_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); + + /* Keep NDeltaMin distance between the NLSFs */ + for( i = L-2; i >= 0; i-- ) + NLSF_Q15[i] = silk_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] ); + } +} diff --git a/src/libopus/silk/NLSF_unpack.c b/src/libopus/silk/NLSF_unpack.c new file mode 100644 index 00000000..ed0d9c38 --- /dev/null +++ b/src/libopus/silk/NLSF_unpack.c @@ -0,0 +1,55 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Unpack predictor values and indices for entropy coding tables */ +void silk_NLSF_unpack( + opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ + opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ + const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ + const opus_int CB1_index /* I Index of vector in first LSF codebook */ +) +{ + opus_int i; + opus_uint8 entry; + const opus_uint8 *ec_sel_ptr; + + ec_sel_ptr = &psNLSF_CB->ec_sel[ CB1_index * psNLSF_CB->order / 2 ]; + for( i = 0; i < psNLSF_CB->order; i += 2 ) { + entry = *ec_sel_ptr++; + ec_ix [ i ] = silk_SMULBB( silk_RSHIFT( entry, 1 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); + pred_Q8[ i ] = psNLSF_CB->pred_Q8[ i + ( entry & 1 ) * ( psNLSF_CB->order - 1 ) ]; + ec_ix [ i + 1 ] = silk_SMULBB( silk_RSHIFT( entry, 5 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); + pred_Q8[ i + 1 ] = psNLSF_CB->pred_Q8[ i + ( silk_RSHIFT( entry, 4 ) & 1 ) * ( psNLSF_CB->order - 1 ) + 1 ]; + } +} + diff --git a/src/libopus/silk/NSQ.h b/src/libopus/silk/NSQ.h new file mode 100644 index 00000000..971832f6 --- /dev/null +++ b/src/libopus/silk/NSQ.h @@ -0,0 +1,101 @@ +/*********************************************************************** +Copyright (c) 2014 Vidyo. +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_NSQ_H +#define SILK_NSQ_H + +#include "SigProc_FIX.h" + +#undef silk_short_prediction_create_arch_coef + +static OPUS_INLINE opus_int32 silk_noise_shape_quantizer_short_prediction_c(const opus_int32 *buf32, const opus_int16 *coef16, opus_int order) +{ + opus_int32 out; + silk_assert( order == 10 || order == 16 ); + + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + out = silk_RSHIFT( order, 1 ); + out = silk_SMLAWB( out, buf32[ 0 ], coef16[ 0 ] ); + out = silk_SMLAWB( out, buf32[ -1 ], coef16[ 1 ] ); + out = silk_SMLAWB( out, buf32[ -2 ], coef16[ 2 ] ); + out = silk_SMLAWB( out, buf32[ -3 ], coef16[ 3 ] ); + out = silk_SMLAWB( out, buf32[ -4 ], coef16[ 4 ] ); + out = silk_SMLAWB( out, buf32[ -5 ], coef16[ 5 ] ); + out = silk_SMLAWB( out, buf32[ -6 ], coef16[ 6 ] ); + out = silk_SMLAWB( out, buf32[ -7 ], coef16[ 7 ] ); + out = silk_SMLAWB( out, buf32[ -8 ], coef16[ 8 ] ); + out = silk_SMLAWB( out, buf32[ -9 ], coef16[ 9 ] ); + + if( order == 16 ) + { + out = silk_SMLAWB( out, buf32[ -10 ], coef16[ 10 ] ); + out = silk_SMLAWB( out, buf32[ -11 ], coef16[ 11 ] ); + out = silk_SMLAWB( out, buf32[ -12 ], coef16[ 12 ] ); + out = silk_SMLAWB( out, buf32[ -13 ], coef16[ 13 ] ); + out = silk_SMLAWB( out, buf32[ -14 ], coef16[ 14 ] ); + out = silk_SMLAWB( out, buf32[ -15 ], coef16[ 15 ] ); + } + return out; +} + +#define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) ((void)arch,silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) + +static OPUS_INLINE opus_int32 silk_NSQ_noise_shape_feedback_loop_c(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) +{ + opus_int32 out; + opus_int32 tmp1, tmp2; + opus_int j; + + tmp2 = data0[0]; + tmp1 = data1[0]; + data1[0] = tmp2; + + out = silk_RSHIFT(order, 1); + out = silk_SMLAWB(out, tmp2, coef[0]); + + for (j = 2; j < order; j += 2) { + tmp2 = data1[j - 1]; + data1[j - 1] = tmp1; + out = silk_SMLAWB(out, tmp1, coef[j - 1]); + tmp1 = data1[j + 0]; + data1[j + 0] = tmp2; + out = silk_SMLAWB(out, tmp2, coef[j]); + } + data1[order - 1] = tmp1; + out = silk_SMLAWB(out, tmp1, coef[order - 1]); + /* Q11 -> Q12 */ + out = silk_LSHIFT32( out, 1 ); + return out; +} + +#define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order)) + +#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +#include "arm/NSQ_neon.h" +#endif + +#endif /* SILK_NSQ_H */ diff --git a/src/libopus/silk/PLC.c b/src/libopus/silk/PLC.c new file mode 100644 index 00000000..d9c6c407 --- /dev/null +++ b/src/libopus/silk/PLC.c @@ -0,0 +1,493 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" +#include "PLC.h" + +#ifdef ENABLE_DEEP_PLC +#include "lpcnet.h" +#endif + +#define NB_ATT 2 +static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */ +static const opus_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */ +static const opus_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */ + +static OPUS_INLINE void silk_PLC_update( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl /* I/O Decoder control */ +); + +static OPUS_INLINE void silk_PLC_conceal( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* O LPC residual signal */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +); + + +void silk_PLC_Reset( + silk_decoder_state *psDec /* I/O Decoder state */ +) +{ + psDec->sPLC.pitchL_Q8 = silk_LSHIFT( psDec->frame_length, 8 - 1 ); + psDec->sPLC.prevGain_Q16[ 0 ] = SILK_FIX_CONST( 1, 16 ); + psDec->sPLC.prevGain_Q16[ 1 ] = SILK_FIX_CONST( 1, 16 ); + psDec->sPLC.subfr_length = 20; + psDec->sPLC.nb_subfr = 2; +} + +void silk_PLC( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* I/O signal */ + opus_int lost, /* I Loss flag */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +) +{ + /* PLC control function */ + if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) { + silk_PLC_Reset( psDec ); + psDec->sPLC.fs_kHz = psDec->fs_kHz; + } + + if( lost ) { + /****************************/ + /* Generate Signal */ + /****************************/ + silk_PLC_conceal( psDec, psDecCtrl, frame, +#ifdef ENABLE_DEEP_PLC + lpcnet, +#endif + arch ); + + psDec->lossCnt++; + } else { + /****************************/ + /* Update state */ + /****************************/ + silk_PLC_update( psDec, psDecCtrl ); +#ifdef ENABLE_DEEP_PLC + if ( lpcnet != NULL && psDec->sPLC.fs_kHz == 16 ) { + int k; + for( k = 0; k < psDec->nb_subfr; k += 2 ) { + lpcnet_plc_update( lpcnet, frame + k * psDec->subfr_length ); + } + } +#endif + } +} + +/**************************************************/ +/* Update state of PLC */ +/**************************************************/ +static OPUS_INLINE void silk_PLC_update( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl /* I/O Decoder control */ +) +{ + opus_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14; + opus_int i, j; + silk_PLC_struct *psPLC; + + psPLC = &psDec->sPLC; + + /* Update parameters used in case of packet loss */ + psDec->prevSignalType = psDec->indices.signalType; + LTP_Gain_Q14 = 0; + if( psDec->indices.signalType == TYPE_VOICED ) { + /* Find the parameters for the last subframe which contains a pitch pulse */ + for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; j++ ) { + if( j == psDec->nb_subfr ) { + break; + } + temp_LTP_Gain_Q14 = 0; + for( i = 0; i < LTP_ORDER; i++ ) { + temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( psDec->nb_subfr - 1 - j ) * LTP_ORDER + i ]; + } + if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) { + LTP_Gain_Q14 = temp_LTP_Gain_Q14; + silk_memcpy( psPLC->LTPCoef_Q14, + &psDecCtrl->LTPCoef_Q14[ silk_SMULBB( psDec->nb_subfr - 1 - j, LTP_ORDER ) ], + LTP_ORDER * sizeof( opus_int16 ) ); + + psPLC->pitchL_Q8 = silk_LSHIFT( psDecCtrl->pitchL[ psDec->nb_subfr - 1 - j ], 8 ); + } + } + + silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); + psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14; + + /* Limit LT coefs */ + if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) { + opus_int scale_Q10; + opus_int32 tmp; + + tmp = silk_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 ); + scale_Q10 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); + for( i = 0; i < LTP_ORDER; i++ ) { + psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 ); + } + } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) { + opus_int scale_Q14; + opus_int32 tmp; + + tmp = silk_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 ); + scale_Q14 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); + for( i = 0; i < LTP_ORDER; i++ ) { + psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 ); + } + } + } else { + psPLC->pitchL_Q8 = silk_LSHIFT( silk_SMULBB( psDec->fs_kHz, 18 ), 8 ); + silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 )); + } + + /* Save LPC coeficients */ + silk_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); + psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14; + + /* Save last two gains */ + silk_memcpy( psPLC->prevGain_Q16, &psDecCtrl->Gains_Q16[ psDec->nb_subfr - 2 ], 2 * sizeof( opus_int32 ) ); + + psPLC->subfr_length = psDec->subfr_length; + psPLC->nb_subfr = psDec->nb_subfr; +} + +static OPUS_INLINE void silk_PLC_energy(opus_int32 *energy1, opus_int *shift1, opus_int32 *energy2, opus_int *shift2, + const opus_int32 *exc_Q14, const opus_int32 *prevGain_Q10, int subfr_length, int nb_subfr) +{ + int i, k; + VARDECL( opus_int16, exc_buf ); + opus_int16 *exc_buf_ptr; + SAVE_STACK; + ALLOC( exc_buf, 2*subfr_length, opus_int16 ); + /* Find random noise component */ + /* Scale previous excitation signal */ + exc_buf_ptr = exc_buf; + for( k = 0; k < 2; k++ ) { + for( i = 0; i < subfr_length; i++ ) { + exc_buf_ptr[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( + silk_SMULWW( exc_Q14[ i + ( k + nb_subfr - 2 ) * subfr_length ], prevGain_Q10[ k ] ), 8 ) ); + } + exc_buf_ptr += subfr_length; + } + /* Find the subframe with lowest energy of the last two and use that as random noise generator */ + silk_sum_sqr_shift( energy1, shift1, exc_buf, subfr_length ); + silk_sum_sqr_shift( energy2, shift2, &exc_buf[ subfr_length ], subfr_length ); + RESTORE_STACK; +} + +static OPUS_INLINE void silk_PLC_conceal( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* O LPC residual signal */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +) +{ + opus_int i, j, k; + opus_int lag, idx, sLTP_buf_idx, shift1, shift2; + opus_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15, inv_gain_Q30; + opus_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; + opus_int32 LPC_pred_Q10, LTP_pred_Q12; + opus_int16 rand_scale_Q14; + opus_int16 *B_Q14; + opus_int32 *sLPC_Q14_ptr; + opus_int16 A_Q12[ MAX_LPC_ORDER ]; +#ifdef SMALL_FOOTPRINT + opus_int16 *sLTP; +#else + VARDECL( opus_int16, sLTP ); +#endif + VARDECL( opus_int32, sLTP_Q14 ); + silk_PLC_struct *psPLC = &psDec->sPLC; + opus_int32 prevGain_Q10[2]; + SAVE_STACK; + + ALLOC( sLTP_Q14, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); +#ifdef SMALL_FOOTPRINT + /* Ugly hack that breaks aliasing rules to save stack: put sLTP at the very end of sLTP_Q14. */ + sLTP = ((opus_int16*)&sLTP_Q14[psDec->ltp_mem_length + psDec->frame_length])-psDec->ltp_mem_length; +#else + ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); +#endif + + prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); + prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); + + if( psDec->first_frame_after_reset ) { + silk_memset( psPLC->prevLPC_Q12, 0, sizeof( psPLC->prevLPC_Q12 ) ); + } + + silk_PLC_energy(&energy1, &shift1, &energy2, &shift2, psDec->exc_Q14, prevGain_Q10, psDec->subfr_length, psDec->nb_subfr); + + if( silk_RSHIFT( energy1, shift2 ) < silk_RSHIFT( energy2, shift1 ) ) { + /* First sub-frame has lowest energy */ + rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, ( psPLC->nb_subfr - 1 ) * psPLC->subfr_length - RAND_BUF_SIZE ) ]; + } else { + /* Second sub-frame has lowest energy */ + rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, psPLC->nb_subfr * psPLC->subfr_length - RAND_BUF_SIZE ) ]; + } + + /* Set up Gain to random noise component */ + B_Q14 = psPLC->LTPCoef_Q14; + rand_scale_Q14 = psPLC->randScale_Q14; + + /* Set up attenuation gains */ + harm_Gain_Q15 = HARM_ATT_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; + if( psDec->prevSignalType == TYPE_VOICED ) { + rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; + } else { + rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; + } + + /* LPC concealment. Apply BWE to previous LPC */ + silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, SILK_FIX_CONST( BWE_COEF, 16 ) ); + + /* Preload LPC coeficients to array on stack. Gives small performance gain */ + silk_memcpy( A_Q12, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); + + /* First Lost frame */ + if( psDec->lossCnt == 0 ) { + rand_scale_Q14 = 1 << 14; + + /* Reduce random noise Gain for voiced frames */ + if( psDec->prevSignalType == TYPE_VOICED ) { + for( i = 0; i < LTP_ORDER; i++ ) { + rand_scale_Q14 -= B_Q14[ i ]; + } + rand_scale_Q14 = silk_max_16( 3277, rand_scale_Q14 ); /* 0.2 */ + rand_scale_Q14 = (opus_int16)silk_RSHIFT( silk_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 ); + } else { + /* Reduce random noise for unvoiced frames with high LPC gain */ + opus_int32 invGain_Q30, down_scale_Q30; + + invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order, arch ); + + down_scale_Q30 = silk_min_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); + down_scale_Q30 = silk_max_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); + down_scale_Q30 = silk_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES ); + + rand_Gain_Q15 = silk_RSHIFT( silk_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 ); + } + } + + rand_seed = psPLC->rand_seed; + lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); + sLTP_buf_idx = psDec->ltp_mem_length; + + /* Rewhiten LTP state */ + idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; + celt_assert( idx > 0 ); + silk_LPC_analysis_filter( &sLTP[ idx ], &psDec->outBuf[ idx ], A_Q12, psDec->ltp_mem_length - idx, psDec->LPC_order, arch ); + /* Scale LTP state */ + inv_gain_Q30 = silk_INVERSE32_varQ( psPLC->prevGain_Q16[ 1 ], 46 ); + inv_gain_Q30 = silk_min( inv_gain_Q30, silk_int32_MAX >> 1 ); + for( i = idx + psDec->LPC_order; i < psDec->ltp_mem_length; i++ ) { + sLTP_Q14[ i ] = silk_SMULWB( inv_gain_Q30, sLTP[ i ] ); + } + + /***************************/ + /* LTP synthesis filtering */ + /***************************/ + for( k = 0; k < psDec->nb_subfr; k++ ) { + /* Set up pointer */ + pred_lag_ptr = &sLTP_Q14[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + for( i = 0; i < psDec->subfr_length; i++ ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LTP_pred_Q12 = 2; + LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); + LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); + LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); + LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); + LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); + pred_lag_ptr++; + + /* Generate LPC excitation */ + rand_seed = silk_RAND( rand_seed ); + idx = silk_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK; + sLTP_Q14[ sLTP_buf_idx ] = silk_LSHIFT32( silk_SMLAWB( LTP_pred_Q12, rand_ptr[ idx ], rand_scale_Q14 ), 2 ); + sLTP_buf_idx++; + } + + /* Gradually reduce LTP gain */ + for( j = 0; j < LTP_ORDER; j++ ) { + B_Q14[ j ] = silk_RSHIFT( silk_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 ); + } + /* Gradually reduce excitation gain */ + rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); + + /* Slowly increase pitch lag */ + psPLC->pitchL_Q8 = silk_SMLAWB( psPLC->pitchL_Q8, psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); + psPLC->pitchL_Q8 = silk_min_32( psPLC->pitchL_Q8, silk_LSHIFT( silk_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) ); + lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); + } + + /***************************/ + /* LPC synthesis filtering */ + /***************************/ + sLPC_Q14_ptr = &sLTP_Q14[ psDec->ltp_mem_length - MAX_LPC_ORDER ]; + + /* Copy LPC state */ + silk_memcpy( sLPC_Q14_ptr, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + + celt_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ + for( i = 0; i < psDec->frame_length; i++ ) { + /* partly unrolled */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); + for( j = 10; j < psDec->LPC_order; j++ ) { + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - j - 1 ], A_Q12[ j ] ); + } + + /* Add prediction to LPC excitation */ + sLPC_Q14_ptr[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], + silk_LSHIFT_SAT32( LPC_pred_Q10, 4 )); + + /* Scale with Gain */ + frame[ i ] = (opus_int16)silk_SAT16( silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], prevGain_Q10[ 1 ] ), 8 ) ) ); + } +#ifdef ENABLE_DEEP_PLC + if ( lpcnet != NULL && lpcnet->loaded && psDec->sPLC.fs_kHz == 16 ) { + int run_deep_plc = psDec->sPLC.enable_deep_plc || lpcnet->fec_fill_pos != 0; + if( run_deep_plc ) { + for( k = 0; k < psDec->nb_subfr; k += 2 ) { + lpcnet_plc_conceal( lpcnet, frame + k * psDec->subfr_length ); + } + /* We *should* be able to copy only from psDec->frame_length-MAX_LPC_ORDER, i.e. the last MAX_LPC_ORDER samples. */ + for( i = 0; i < psDec->frame_length; i++ ) { + sLPC_Q14_ptr[ MAX_LPC_ORDER + i ] = (int)floor(.5 + frame[ i ] * (float)(1 << 24) / prevGain_Q10[ 1 ] ); + } + } else { + for( k = 0; k < psDec->nb_subfr; k += 2 ) { + lpcnet_plc_update( lpcnet, frame + k * psDec->subfr_length ); + } + } + } +#endif + + /* Save LPC state */ + silk_memcpy( psDec->sLPC_Q14_buf, &sLPC_Q14_ptr[ psDec->frame_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); + + /**************************************/ + /* Update states */ + /**************************************/ + psPLC->rand_seed = rand_seed; + psPLC->randScale_Q14 = rand_scale_Q14; + for( i = 0; i < MAX_NB_SUBFR; i++ ) { + psDecCtrl->pitchL[ i ] = lag; + } + RESTORE_STACK; +} + +/* Glues concealed frames with new good received frames */ +void silk_PLC_glue_frames( + silk_decoder_state *psDec, /* I/O decoder state */ + opus_int16 frame[], /* I/O signal */ + opus_int length /* I length of signal */ +) +{ + opus_int i, energy_shift; + opus_int32 energy; + silk_PLC_struct *psPLC; + psPLC = &psDec->sPLC; + + if( psDec->lossCnt ) { + /* Calculate energy in concealed residual */ + silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, frame, length ); + + psPLC->last_frame_lost = 1; + } else { + if( psDec->sPLC.last_frame_lost ) { + /* Calculate residual in decoded signal if last frame was lost */ + silk_sum_sqr_shift( &energy, &energy_shift, frame, length ); + + /* Normalize energies */ + if( energy_shift > psPLC->conc_energy_shift ) { + psPLC->conc_energy = silk_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift ); + } else if( energy_shift < psPLC->conc_energy_shift ) { + energy = silk_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift ); + } + + /* Fade in the energy difference */ + if( energy > psPLC->conc_energy ) { + opus_int32 frac_Q24, LZ; + opus_int32 gain_Q16, slope_Q16; + + LZ = silk_CLZ32( psPLC->conc_energy ); + LZ = LZ - 1; + psPLC->conc_energy = silk_LSHIFT( psPLC->conc_energy, LZ ); + energy = silk_RSHIFT( energy, silk_max_32( 24 - LZ, 0 ) ); + + frac_Q24 = silk_DIV32( psPLC->conc_energy, silk_max( energy, 1 ) ); + + gain_Q16 = silk_LSHIFT( silk_SQRT_APPROX( frac_Q24 ), 4 ); + slope_Q16 = silk_DIV32_16( ( (opus_int32)1 << 16 ) - gain_Q16, length ); + /* Make slope 4x steeper to avoid missing onsets after DTX */ + slope_Q16 = silk_LSHIFT( slope_Q16, 2 ); +#ifdef ENABLE_DEEP_PLC + if ( psDec->sPLC.fs_kHz != 16 ) +#endif + { + for( i = 0; i < length; i++ ) { + frame[ i ] = silk_SMULWB( gain_Q16, frame[ i ] ); + gain_Q16 += slope_Q16; + if( gain_Q16 > (opus_int32)1 << 16 ) { + break; + } + } + } + } + } + psPLC->last_frame_lost = 0; + } +} diff --git a/src/libopus/silk/PLC.h b/src/libopus/silk/PLC.h new file mode 100644 index 00000000..1bebb786 --- /dev/null +++ b/src/libopus/silk/PLC.h @@ -0,0 +1,65 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_PLC_H +#define SILK_PLC_H + +#include "main.h" + +#define BWE_COEF 0.99 +#define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */ +#define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */ +#define MAX_PITCH_LAG_MS 18 +#define RAND_BUF_SIZE 128 +#define RAND_BUF_MASK ( RAND_BUF_SIZE - 1 ) +#define LOG2_INV_LPC_GAIN_HIGH_THRES 3 /* 2^3 = 8 dB LPC gain */ +#define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */ +#define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */ + +void silk_PLC_Reset( + silk_decoder_state *psDec /* I/O Decoder state */ +); + +void silk_PLC( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* I/O signal */ + opus_int lost, /* I Loss flag */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +); + +void silk_PLC_glue_frames( + silk_decoder_state *psDec, /* I/O decoder state */ + opus_int16 frame[], /* I/O signal */ + opus_int length /* I length of signal */ +); + +#endif + diff --git a/src/libopus/silk/SigProc_FIX.h b/src/libopus/silk/SigProc_FIX.h new file mode 100644 index 00000000..fbdfa82e --- /dev/null +++ b/src/libopus/silk/SigProc_FIX.h @@ -0,0 +1,643 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_SIGPROC_FIX_H +#define SILK_SIGPROC_FIX_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*#define silk_MACRO_COUNT */ /* Used to enable WMOPS counting */ + +#define SILK_MAX_ORDER_LPC 24 /* max order of the LPC analysis in schur() and k2a() */ + +#include /* for memset(), memcpy(), memmove() */ +#include "typedef.h" +#include "resampler_structs.h" +#include "macros.h" +#include "cpu_support.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/SigProc_FIX_sse.h" +#endif + +#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/biquad_alt_arm.h" +#include "arm/LPC_inv_pred_gain_arm.h" +#endif + +/********************************************************************/ +/* SIGNAL PROCESSING FUNCTIONS */ +/********************************************************************/ + +/*! + * Initialize/reset the resampler state for a given pair of input/output sampling rates +*/ +opus_int silk_resampler_init( + silk_resampler_state_struct *S, /* I/O Resampler state */ + opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ + opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ + opus_int forEnc /* I If 1: encoder; if 0: decoder */ +); + +/*! + * Resampler: convert from one sampling rate to another + */ +opus_int silk_resampler( + silk_resampler_state_struct *S, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +); + +/*! +* Downsample 2x, mediocre quality +*/ +void silk_resampler_down2( + opus_int32 *S, /* I/O State vector [ 2 ] */ + opus_int16 *out, /* O Output signal [ len ] */ + const opus_int16 *in, /* I Input signal [ floor(len/2) ] */ + opus_int32 inLen /* I Number of input samples */ +); + +/*! + * Downsample by a factor 2/3, low quality +*/ +void silk_resampler_down2_3( + opus_int32 *S, /* I/O State vector [ 6 ] */ + opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ + const opus_int16 *in, /* I Input signal [ inLen ] */ + opus_int32 inLen /* I Number of input samples */ +); + +/*! + * second order ARMA filter; + * slower than biquad() but uses more precise coefficients + * can handle (slowly) varying coefficients + */ +void silk_biquad_alt_stride1( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [2] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +); + +void silk_biquad_alt_stride2_c( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +); + +/* Variable order MA prediction error filter. */ +void silk_LPC_analysis_filter( + opus_int16 *out, /* O Output signal */ + const opus_int16 *in, /* I Input signal */ + const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ + const opus_int32 len, /* I Signal length */ + const opus_int32 d, /* I Filter order */ + int arch /* I Run-time architecture */ +); + +/* Chirp (bandwidth expand) LP AR filter */ +void silk_bwexpander( + opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ + const opus_int d, /* I Length of ar */ + opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ +); + +/* Chirp (bandwidth expand) LP AR filter */ +void silk_bwexpander_32( + opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ + const opus_int d, /* I Length of ar */ + opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ +); + +/* Compute inverse of LPC prediction gain, and */ +/* test if LPC coefficients are stable (all poles within unit circle) */ +opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ + const opus_int order /* I Prediction order */ +); + +/* Split signal in two decimated bands using first-order allpass filters */ +void silk_ana_filt_bank_1( + const opus_int16 *in, /* I Input signal [N] */ + opus_int32 *S, /* I/O State vector [2] */ + opus_int16 *outL, /* O Low band [N/2] */ + opus_int16 *outH, /* O High band [N/2] */ + const opus_int32 N /* I Number of input samples */ +); + +#if !defined(OVERRIDE_silk_biquad_alt_stride2) +#define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_c(in, B_Q28, A_Q28, S, out, len)) +#endif + +#if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) +#define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_c(A_Q12, order)) +#endif + +/********************************************************************/ +/* SCALAR FUNCTIONS */ +/********************************************************************/ + +/* Approximation of 128 * log2() (exact inverse of approx 2^() below) */ +/* Convert input to a log scale */ +opus_int32 silk_lin2log( + const opus_int32 inLin /* I input in linear scale */ +); + +/* Approximation of a sigmoid function */ +opus_int silk_sigm_Q15( + opus_int in_Q5 /* I */ +); + +/* Approximation of 2^() (exact inverse of approx log2() above) */ +/* Convert input to a linear scale */ +opus_int32 silk_log2lin( + const opus_int32 inLog_Q7 /* I input on log scale */ +); + +/* Compute number of bits to right shift the sum of squares of a vector */ +/* of int16s to make it fit in an int32 */ +void silk_sum_sqr_shift( + opus_int32 *energy, /* O Energy of x, after shifting to the right */ + opus_int *shift, /* O Number of bits right shift applied to energy */ + const opus_int16 *x, /* I Input vector */ + opus_int len /* I Length of input vector */ +); + +/* Calculates the reflection coefficients from the correlation sequence */ +/* Faster than schur64(), but much less accurate. */ +/* uses SMLAWB(), requiring armv5E and higher. */ +opus_int32 silk_schur( /* O Returns residual energy */ + opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ + const opus_int32 *c, /* I correlations [order+1] */ + const opus_int32 order /* I prediction order */ +); + +/* Calculates the reflection coefficients from the correlation sequence */ +/* Slower than schur(), but more accurate. */ +/* Uses SMULL(), available on armv4 */ +opus_int32 silk_schur64( /* O returns residual energy */ + opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ + const opus_int32 c[], /* I Correlations [order+1] */ + opus_int32 order /* I Prediction order */ +); + +/* Step up function, converts reflection coefficients to prediction coefficients */ +void silk_k2a( + opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ + const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ + const opus_int32 order /* I Prediction order */ +); + +/* Step up function, converts reflection coefficients to prediction coefficients */ +void silk_k2a_Q16( + opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ + const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ + const opus_int32 order /* I Prediction order */ +); + +/* Apply sine window to signal vector. */ +/* Window types: */ +/* 1 -> sine window from 0 to pi/2 */ +/* 2 -> sine window from pi/2 to pi */ +/* every other sample of window is linearly interpolated, for speed */ +void silk_apply_sine_window( + opus_int16 px_win[], /* O Pointer to windowed signal */ + const opus_int16 px[], /* I Pointer to input signal */ + const opus_int win_type, /* I Selects a window type */ + const opus_int length /* I Window length, multiple of 4 */ +); + +/* Compute autocorrelation */ +void silk_autocorr( + opus_int32 *results, /* O Result (length correlationCount) */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *inputData, /* I Input data to correlate */ + const opus_int inputDataSize, /* I Length of input */ + const opus_int correlationCount, /* I Number of correlation taps to compute */ + int arch /* I Run-time architecture */ +); + +void silk_decode_pitch( + opus_int16 lagIndex, /* I */ + opus_int8 contourIndex, /* O */ + opus_int pitch_lags[], /* O 4 pitch values */ + const opus_int Fs_kHz, /* I sampling frequency (kHz) */ + const opus_int nb_subfr /* I number of sub frames */ +); + +opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ + const opus_int16 *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ + opus_int *pitch_out, /* O 4 pitch lag values */ + opus_int16 *lagIndex, /* O Lag Index */ + opus_int8 *contourIndex, /* O Pitch contour Index */ + opus_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ + opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ + const opus_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ + const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ + const opus_int Fs_kHz, /* I Sample frequency (kHz) */ + const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ + const opus_int nb_subfr, /* I number of 5 ms subframes */ + int arch /* I Run-time architecture */ +); + +/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ +/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ +void silk_A2NLSF( + opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ + opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ + const opus_int d /* I Filter order (must be even) */ +); + +/* compute whitening filter coefficients from normalized line spectral frequencies */ +void silk_NLSF2A( + opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ + const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ + const opus_int d, /* I filter order (should be even) */ + int arch /* I Run-time architecture */ +); + +/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ +void silk_LPC_fit( + opus_int16 *a_QOUT, /* O Output signal */ + opus_int32 *a_QIN, /* I/O Input signal */ + const opus_int QOUT, /* I Input Q domain */ + const opus_int QIN, /* I Input Q domain */ + const opus_int d /* I Filter order */ +); + +void silk_insertion_sort_increasing( + opus_int32 *a, /* I/O Unsorted / Sorted vector */ + opus_int *idx, /* O Index vector for the sorted elements */ + const opus_int L, /* I Vector length */ + const opus_int K /* I Number of correctly sorted positions */ +); + +void silk_insertion_sort_decreasing_int16( + opus_int16 *a, /* I/O Unsorted / Sorted vector */ + opus_int *idx, /* O Index vector for the sorted elements */ + const opus_int L, /* I Vector length */ + const opus_int K /* I Number of correctly sorted positions */ +); + +void silk_insertion_sort_increasing_all_values_int16( + opus_int16 *a, /* I/O Unsorted / Sorted vector */ + const opus_int L /* I Vector length */ +); + +/* NLSF stabilizer, for a single input data vector */ +void silk_NLSF_stabilize( + opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ + const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ + const opus_int L /* I Number of NLSF parameters in the input vector */ +); + +/* Laroia low complexity NLSF weights */ +void silk_NLSF_VQ_weights_laroia( + opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ + const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ + const opus_int D /* I Input vector dimension (even) */ +); + +/* Compute reflection coefficients from input signal */ +void silk_burg_modified_c( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ +); + +/* Copy and multiply a vector by a constant */ +void silk_scale_copy_vector16( + opus_int16 *data_out, + const opus_int16 *data_in, + opus_int32 gain_Q16, /* I Gain in Q16 */ + const opus_int dataSize /* I Length */ +); + +/* Some for the LTP related function requires Q26 to work.*/ +void silk_scale_vector32_Q26_lshift_18( + opus_int32 *data1, /* I/O Q0/Q18 */ + opus_int32 gain_Q26, /* I Q26 */ + opus_int dataSize /* I length */ +); + +/********************************************************************/ +/* INLINE ARM MATH */ +/********************************************************************/ + +/* return sum( inVec1[i] * inVec2[i] ) */ + +opus_int32 silk_inner_prod_aligned( + const opus_int16 *const inVec1, /* I input vector 1 */ + const opus_int16 *const inVec2, /* I input vector 2 */ + const opus_int len, /* I vector lengths */ + int arch /* I Run-time architecture */ +); + + +opus_int32 silk_inner_prod_aligned_scale( + const opus_int16 *const inVec1, /* I input vector 1 */ + const opus_int16 *const inVec2, /* I input vector 2 */ + const opus_int scale, /* I number of bits to shift */ + const opus_int len /* I vector lengths */ +); + +opus_int64 silk_inner_prod16_c( + const opus_int16 *inVec1, /* I input vector 1 */ + const opus_int16 *inVec2, /* I input vector 2 */ + const opus_int len /* I vector lengths */ +); + +/********************************************************************/ +/* MACROS */ +/********************************************************************/ + +/* Rotate a32 right by 'rot' bits. Negative rot values result in rotating + left. Output is 32bit int. + Note: contemporary compilers recognize the C expression below and + compile it into a 'ror' instruction if available. No need for OPUS_INLINE ASM! */ +static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) +{ + opus_uint32 x = (opus_uint32) a32; + opus_uint32 r = (opus_uint32) rot; + opus_uint32 m = (opus_uint32) -rot; + if( rot == 0 ) { + return a32; + } else if( rot < 0 ) { + return (opus_int32) ((x << m) | (x >> (32 - m))); + } else { + return (opus_int32) ((x << (32 - r)) | (x >> r)); + } +} + +/* Allocate opus_int16 aligned to 4-byte memory address */ +#if EMBEDDED_ARM +#define silk_DWORD_ALIGN __attribute__((aligned(4))) +#else +#define silk_DWORD_ALIGN +#endif + +/* Useful Macros that can be adjusted to other platforms */ +#define silk_memcpy(dest, src, size) memcpy((dest), (src), (size)) +#define silk_memset(dest, src, size) memset((dest), (src), (size)) +#define silk_memmove(dest, src, size) memmove((dest), (src), (size)) + +/* Fixed point macros */ + +/* (a32 * b32) output have to be 32bit int */ +#define silk_MUL(a32, b32) ((a32) * (b32)) + +/* (a32 * b32) output have to be 32bit uint */ +#define silk_MUL_uint(a32, b32) silk_MUL(a32, b32) + +/* a32 + (b32 * c32) output have to be 32bit int */ +#define silk_MLA(a32, b32, c32) silk_ADD32((a32),((b32) * (c32))) + +/* a32 + (b32 * c32) output have to be 32bit uint */ +#define silk_MLA_uint(a32, b32, c32) silk_MLA(a32, b32, c32) + +/* ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ +#define silk_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16)) + +/* a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ +#define silk_SMLATT(a32, b32, c32) silk_ADD32((a32),((b32) >> 16) * ((c32) >> 16)) + +#define silk_SMLALBB(a64, b16, c16) silk_ADD64((a64),(opus_int64)((opus_int32)(b16) * (opus_int32)(c16))) + +/* (a32 * b32) */ +#define silk_SMULL(a32, b32) ((opus_int64)(a32) * /*(opus_int64)*/(b32)) + +/* Adds two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour + (just standard two's complement implementation-specific behaviour) */ +#define silk_ADD32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) + (opus_uint32)(b))) +/* Subtractss two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour + (just standard two's complement implementation-specific behaviour) */ +#define silk_SUB32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) - (opus_uint32)(b))) + +/* Multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) */ +#define silk_MLA_ovflw(a32, b32, c32) silk_ADD32_ovflw((a32), (opus_uint32)(b32) * (opus_uint32)(c32)) +#define silk_SMLABB_ovflw(a32, b32, c32) (silk_ADD32_ovflw((a32) , ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32)))) + +#define silk_DIV32_16(a32, b16) ((opus_int32)((a32) / (b16))) +#define silk_DIV32(a32, b32) ((opus_int32)((a32) / (b32))) + +/* These macros enables checking for overflow in silk_API_Debug.h*/ +#define silk_ADD16(a, b) ((a) + (b)) +#define silk_ADD32(a, b) ((a) + (b)) +#define silk_ADD64(a, b) ((a) + (b)) + +#define silk_SUB16(a, b) ((a) - (b)) +#define silk_SUB32(a, b) ((a) - (b)) +#define silk_SUB64(a, b) ((a) - (b)) + +#define silk_SAT8(a) ((a) > silk_int8_MAX ? silk_int8_MAX : \ + ((a) < silk_int8_MIN ? silk_int8_MIN : (a))) +#define silk_SAT16(a) ((a) > silk_int16_MAX ? silk_int16_MAX : \ + ((a) < silk_int16_MIN ? silk_int16_MIN : (a))) +#define silk_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : \ + ((a) < silk_int32_MIN ? silk_int32_MIN : (a))) + +#define silk_CHECK_FIT8(a) (a) +#define silk_CHECK_FIT16(a) (a) +#define silk_CHECK_FIT32(a) (a) + +#define silk_ADD_SAT16(a, b) (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a), (b) ) ) +#define silk_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \ + ((((a) & (b)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a)+(b)) : \ + ((((a) | (b)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a)+(b)) ) + +#define silk_SUB_SAT16(a, b) (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a), (b) ) ) +#define silk_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \ + (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a)-(b)) : \ + ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? silk_int64_MAX : (a)-(b)) ) + +/* Saturation for positive input values */ +#define silk_POS_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : (a)) + +/* Add with saturation for positive input values */ +#define silk_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))) +#define silk_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))) +#define silk_ADD_POS_SAT32(a, b) ((((opus_uint32)(a)+(opus_uint32)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) + +#define silk_LSHIFT8(a, shift) ((opus_int8)((opus_uint8)(a)<<(shift))) /* shift >= 0, shift < 8 */ +#define silk_LSHIFT16(a, shift) ((opus_int16)((opus_uint16)(a)<<(shift))) /* shift >= 0, shift < 16 */ +#define silk_LSHIFT32(a, shift) ((opus_int32)((opus_uint32)(a)<<(shift))) /* shift >= 0, shift < 32 */ +#define silk_LSHIFT64(a, shift) ((opus_int64)((opus_uint64)(a)<<(shift))) /* shift >= 0, shift < 64 */ +#define silk_LSHIFT(a, shift) silk_LSHIFT32(a, shift) /* shift >= 0, shift < 32 */ + +#define silk_RSHIFT8(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 8 */ +#define silk_RSHIFT16(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 16 */ +#define silk_RSHIFT32(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 32 */ +#define silk_RSHIFT64(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 64 */ +#define silk_RSHIFT(a, shift) silk_RSHIFT32(a, shift) /* shift >= 0, shift < 32 */ + +/* saturates before shifting */ +#define silk_LSHIFT_SAT32(a, shift) (silk_LSHIFT32( silk_LIMIT( (a), silk_RSHIFT32( silk_int32_MIN, (shift) ), \ + silk_RSHIFT32( silk_int32_MAX, (shift) ) ), (shift) )) + +#define silk_LSHIFT_ovflw(a, shift) ((opus_int32)((opus_uint32)(a) << (shift))) /* shift >= 0, allowed to overflow */ +#define silk_LSHIFT_uint(a, shift) ((a) << (shift)) /* shift >= 0 */ +#define silk_RSHIFT_uint(a, shift) ((a) >> (shift)) /* shift >= 0 */ + +#define silk_ADD_LSHIFT(a, b, shift) ((a) + silk_LSHIFT((b), (shift))) /* shift >= 0 */ +#define silk_ADD_LSHIFT32(a, b, shift) silk_ADD32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ +#define silk_ADD_LSHIFT_uint(a, b, shift) ((a) + silk_LSHIFT_uint((b), (shift))) /* shift >= 0 */ +#define silk_ADD_RSHIFT(a, b, shift) ((a) + silk_RSHIFT((b), (shift))) /* shift >= 0 */ +#define silk_ADD_RSHIFT32(a, b, shift) silk_ADD32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ +#define silk_ADD_RSHIFT_uint(a, b, shift) ((a) + silk_RSHIFT_uint((b), (shift))) /* shift >= 0 */ +#define silk_SUB_LSHIFT32(a, b, shift) silk_SUB32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ +#define silk_SUB_RSHIFT32(a, b, shift) silk_SUB32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ + +/* Requires that shift > 0 */ +#define silk_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) +#define silk_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) + +/* Number of rightshift required to fit the multiplication */ +#define silk_NSHIFT_MUL_32_32(a, b) ( -(31- (32-silk_CLZ32(silk_abs(a)) + (32-silk_CLZ32(silk_abs(b))))) ) +#define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a)) + (16-silk_CLZ16(silk_abs(b))))) ) + + +#define silk_min(a, b) (((a) < (b)) ? (a) : (b)) +#define silk_max(a, b) (((a) > (b)) ? (a) : (b)) + +/* Macro to convert floating-point constants to fixed-point */ +#define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5)) + +/* silk_min() versions with typecast in the function call */ +static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) +{ + return (((a) < (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) +{ + return (((a) < (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) +{ + return (((a) < (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) +{ + return (((a) < (b)) ? (a) : (b)); +} + +/* silk_min() versions with typecast in the function call */ +static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) +{ + return (((a) > (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) +{ + return (((a) > (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) +{ + return (((a) > (b)) ? (a) : (b)); +} +static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) +{ + return (((a) > (b)) ? (a) : (b)); +} + +#define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ + : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) + +#define silk_LIMIT_int silk_LIMIT +#define silk_LIMIT_16 silk_LIMIT +#define silk_LIMIT_32 silk_LIMIT + +#define silk_abs(a) (((a) > 0) ? (a) : -(a)) /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ +#define silk_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1))) +#define silk_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) +#define silk_abs_int64(a) (((a) > 0) ? (a) : -(a)) + +#define silk_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )) + +/* PSEUDO-RANDOM GENERATOR */ +/* Make sure to store the result as the seed for the next call (also in between */ +/* frames), otherwise result won't be random at all. When only using some of the */ +/* bits, take the most significant bits by right-shifting. */ +#define RAND_MULTIPLIER 196314165 +#define RAND_INCREMENT 907633515 +#define silk_RAND(seed) (silk_MLA_ovflw((RAND_INCREMENT), (seed), (RAND_MULTIPLIER))) + +/* Add some multiplication functions that can be easily mapped to ARM. */ + +/* silk_SMMUL: Signed top word multiply. + ARMv6 2 instruction cycles. + ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM)*/ +/*#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT(silk_SMLAL(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)), 16)*/ +/* the following seems faster on x86 */ +#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL((a32), (b32)), 32) + +#if !defined(OVERRIDE_silk_burg_modified) +#define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ + ((void)(arch), silk_burg_modified_c(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) +#endif + +#if !defined(OVERRIDE_silk_inner_prod16) +#define silk_inner_prod16(inVec1, inVec2, len, arch) \ + ((void)(arch),silk_inner_prod16_c(inVec1, inVec2, len)) +#endif + +#include "Inlines.h" +#include "MacroCount.h" +#include "MacroDebug.h" + +#ifdef OPUS_ARM_INLINE_ASM +#include "arm/SigProc_FIX_armv4.h" +#endif + +#ifdef OPUS_ARM_INLINE_EDSP +#include "arm/SigProc_FIX_armv5e.h" +#endif + +#if defined(MIPSr1_ASM) +#include "mips/sigproc_fix_mipsr1.h" +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* SILK_SIGPROC_FIX_H */ diff --git a/src/libopus/silk/VQ_WMat_EC.c b/src/libopus/silk/VQ_WMat_EC.c new file mode 100644 index 00000000..bf9ef7b3 --- /dev/null +++ b/src/libopus/silk/VQ_WMat_EC.c @@ -0,0 +1,131 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ +void silk_VQ_WMat_EC_c( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *res_nrg_Q15, /* O best residual energy */ + opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int32 *XX_Q17, /* I correlation matrix */ + const opus_int32 *xX_Q17, /* I correlation vector */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + const opus_int L /* I number of vectors in codebook */ +) +{ + opus_int k, gain_tmp_Q7; + const opus_int8 *cb_row_Q7; + opus_int32 neg_xX_Q24[ 5 ]; + opus_int32 sum1_Q15, sum2_Q24; + opus_int32 bits_res_Q8, bits_tot_Q8; + + /* Negate and convert to new Q domain */ + neg_xX_Q24[ 0 ] = -silk_LSHIFT32( xX_Q17[ 0 ], 7 ); + neg_xX_Q24[ 1 ] = -silk_LSHIFT32( xX_Q17[ 1 ], 7 ); + neg_xX_Q24[ 2 ] = -silk_LSHIFT32( xX_Q17[ 2 ], 7 ); + neg_xX_Q24[ 3 ] = -silk_LSHIFT32( xX_Q17[ 3 ], 7 ); + neg_xX_Q24[ 4 ] = -silk_LSHIFT32( xX_Q17[ 4 ], 7 ); + + /* Loop over codebook */ + *rate_dist_Q8 = silk_int32_MAX; + *res_nrg_Q15 = silk_int32_MAX; + cb_row_Q7 = cb_Q7; + /* If things go really bad, at least *ind is set to something safe. */ + *ind = 0; + for( k = 0; k < L; k++ ) { + opus_int32 penalty; + gain_tmp_Q7 = cb_gain_Q7[k]; + /* Weighted rate */ + /* Quantization error: 1 - 2 * xX * cb + cb' * XX * cb */ + sum1_Q15 = SILK_FIX_CONST( 1.001, 15 ); + + /* Penalty for too large gain */ + penalty = silk_LSHIFT32( silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 11 ); + + /* first row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 0 ], XX_Q17[ 1 ], cb_row_Q7[ 1 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 2 ], cb_row_Q7[ 2 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 3 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 4 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 0 ], cb_row_Q7[ 0 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 0 ] ); + + /* second row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 1 ], XX_Q17[ 7 ], cb_row_Q7[ 2 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 8 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 9 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 6 ], cb_row_Q7[ 1 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 1 ] ); + + /* third row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 2 ], XX_Q17[ 13 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 14 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 12 ], cb_row_Q7[ 2 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 2 ] ); + + /* fourth row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 3 ], XX_Q17[ 19 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 18 ], cb_row_Q7[ 3 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 3 ] ); + + /* last row of XX_Q17 */ + sum2_Q24 = silk_LSHIFT32( neg_xX_Q24[ 4 ], 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 24 ], cb_row_Q7[ 4 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 4 ] ); + + /* find best */ + if( sum1_Q15 >= 0 ) { + /* Translate residual energy to bits using high-rate assumption (6 dB ==> 1 bit/sample) */ + bits_res_Q8 = silk_SMULBB( subfr_len, silk_lin2log( sum1_Q15 + penalty) - (15 << 7) ); + /* In the following line we reduce the codelength component by half ("-1"); seems to slightly improve quality */ + bits_tot_Q8 = silk_ADD_LSHIFT32( bits_res_Q8, cl_Q5[ k ], 3-1 ); + if( bits_tot_Q8 <= *rate_dist_Q8 ) { + *rate_dist_Q8 = bits_tot_Q8; + *res_nrg_Q15 = sum1_Q15 + penalty; + *ind = (opus_int8)k; + *gain_Q7 = gain_tmp_Q7; + } + } + + /* Go to next cbk vector */ + cb_row_Q7 += LTP_ORDER; + } +} diff --git a/src/libopus/silk/ana_filt_bank_1.c b/src/libopus/silk/ana_filt_bank_1.c new file mode 100644 index 00000000..1211ffa0 --- /dev/null +++ b/src/libopus/silk/ana_filt_bank_1.c @@ -0,0 +1,74 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Coefficients for 2-band filter bank based on first-order allpass filters */ +static opus_int16 A_fb1_20 = 5394 << 1; +static opus_int16 A_fb1_21 = -24290; /* (opus_int16)(20623 << 1) */ + +/* Split signal into two decimated bands using first-order allpass filters */ +void silk_ana_filt_bank_1( + const opus_int16 *in, /* I Input signal [N] */ + opus_int32 *S, /* I/O State vector [2] */ + opus_int16 *outL, /* O Low band [N/2] */ + opus_int16 *outH, /* O High band [N/2] */ + const opus_int32 N /* I Number of input samples */ +) +{ + opus_int k, N2 = silk_RSHIFT( N, 1 ); + opus_int32 in32, X, Y, out_1, out_2; + + /* Internal variables and state are in Q10 format */ + for( k = 0; k < N2; k++ ) { + /* Convert to Q10 */ + in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); + + /* All-pass section for even input sample */ + Y = silk_SUB32( in32, S[ 0 ] ); + X = silk_SMLAWB( Y, Y, A_fb1_21 ); + out_1 = silk_ADD32( S[ 0 ], X ); + S[ 0 ] = silk_ADD32( in32, X ); + + /* Convert to Q10 */ + in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); + + /* All-pass section for odd input sample, and add to output of previous section */ + Y = silk_SUB32( in32, S[ 1 ] ); + X = silk_SMULWB( Y, A_fb1_20 ); + out_2 = silk_ADD32( S[ 1 ], X ); + S[ 1 ] = silk_ADD32( in32, X ); + + /* Add/subtract, convert back to int16 and store to output */ + outL[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_ADD32( out_2, out_1 ), 11 ) ); + outH[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SUB32( out_2, out_1 ), 11 ) ); + } +} diff --git a/src/libopus/silk/arch.h b/src/libopus/silk/arch.h new file mode 100644 index 00000000..0530293d --- /dev/null +++ b/src/libopus/silk/arch.h @@ -0,0 +1 @@ +#include "../celt/arch.h" diff --git a/src/libopus/silk/biquad_alt.c b/src/libopus/silk/biquad_alt.c new file mode 100644 index 00000000..f3844f37 --- /dev/null +++ b/src/libopus/silk/biquad_alt.c @@ -0,0 +1,121 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. +***********************************************************************/ + +/* * + * silk_biquad_alt.c * + * * + * Second order ARMA filter * + * Can handle slowly varying filter coefficients * + * */ + +#ifdef __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Second order ARMA filter, alternative implementation */ +void silk_biquad_alt_stride1( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [2] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +) +{ + /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ + opus_int k; + opus_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14; + + /* Negate A_Q28 values and split in two parts */ + A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ + A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ + A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ + A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ + + for( k = 0; k < len; k++ ) { + /* S[ 0 ], S[ 1 ]: Q12 */ + inval = in[ k ]; + out32_Q14 = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 ); + + S[ 0 ] = S[1] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A0_L_Q28 ), 14 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval); + + S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A1_L_Q28 ), 14 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval ); + + /* Scale back to Q0 and saturate */ + out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); + } +} + +void silk_biquad_alt_stride2_c( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +) +{ + /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ + opus_int k; + opus_int32 A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14[ 2 ]; + + /* Negate A_Q28 values and split in two parts */ + A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ + A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ + A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ + A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ + + for( k = 0; k < len; k++ ) { + /* S[ 0 ], S[ 1 ], S[ 2 ], S[ 3 ]: Q12 */ + out32_Q14[ 0 ] = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], in[ 2 * k + 0 ] ), 2 ); + out32_Q14[ 1 ] = silk_LSHIFT( silk_SMLAWB( S[ 2 ], B_Q28[ 0 ], in[ 2 * k + 1 ] ), 2 ); + + S[ 0 ] = S[ 1 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A0_L_Q28 ), 14 ); + S[ 2 ] = S[ 3 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A0_L_Q28 ), 14 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14[ 0 ], A0_U_Q28 ); + S[ 2 ] = silk_SMLAWB( S[ 2 ], out32_Q14[ 1 ], A0_U_Q28 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], in[ 2 * k + 0 ] ); + S[ 2 ] = silk_SMLAWB( S[ 2 ], B_Q28[ 1 ], in[ 2 * k + 1 ] ); + + S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A1_L_Q28 ), 14 ); + S[ 3 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A1_L_Q28 ), 14 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14[ 0 ], A1_U_Q28 ); + S[ 3 ] = silk_SMLAWB( S[ 3 ], out32_Q14[ 1 ], A1_U_Q28 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], in[ 2 * k + 0 ] ); + S[ 3 ] = silk_SMLAWB( S[ 3 ], B_Q28[ 2 ], in[ 2 * k + 1 ] ); + + /* Scale back to Q0 and saturate */ + out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 0 ] + (1<<14) - 1, 14 ) ); + out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 1 ] + (1<<14) - 1, 14 ) ); + } +} diff --git a/src/libopus/silk/bwexpander.c b/src/libopus/silk/bwexpander.c new file mode 100644 index 00000000..a70eb08e --- /dev/null +++ b/src/libopus/silk/bwexpander.c @@ -0,0 +1,51 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Chirp (bandwidth expand) LP AR filter */ +void silk_bwexpander( + opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ + const opus_int d, /* I Length of ar */ + opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ +) +{ + opus_int i; + opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; + + /* NB: Dont use silk_SMULWB, instead of silk_RSHIFT_ROUND( silk_MUL(), 16 ), below. */ + /* Bias in silk_SMULWB can lead to unstable filters */ + for( i = 0; i < d - 1; i++ ) { + ar[ i ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ i ] ), 16 ); + chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); + } + ar[ d - 1 ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); +} diff --git a/src/libopus/silk/bwexpander_32.c b/src/libopus/silk/bwexpander_32.c new file mode 100644 index 00000000..d6cd8746 --- /dev/null +++ b/src/libopus/silk/bwexpander_32.c @@ -0,0 +1,51 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Chirp (bandwidth expand) LP AR filter. + This logic is reused in _celt_lpc(). Any bug fixes should also be applied there. */ +void silk_bwexpander_32( + opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ + const opus_int d, /* I Length of ar */ + opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ +) +{ + opus_int i; + opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; + + for( i = 0; i < d - 1; i++ ) { + ar[ i ] = silk_SMULWW( chirp_Q16, ar[ i ] ); + chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); + } + ar[ d - 1 ] = silk_SMULWW( chirp_Q16, ar[ d - 1 ] ); +} + diff --git a/src/libopus/silk/celt_lpc.h b/src/libopus/silk/celt_lpc.h new file mode 100644 index 00000000..69756654 --- /dev/null +++ b/src/libopus/silk/celt_lpc.h @@ -0,0 +1 @@ +#include "../celt/celt_lpc.h" diff --git a/src/libopus/silk/check_control_input.c b/src/libopus/silk/check_control_input.c new file mode 100644 index 00000000..016fee20 --- /dev/null +++ b/src/libopus/silk/check_control_input.c @@ -0,0 +1,106 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "control.h" +#include "errors.h" + +/* Check encoder control struct */ +opus_int check_control_input( + silk_EncControlStruct *encControl /* I Control structure */ +) +{ + celt_assert( encControl != NULL ); + + if( ( ( encControl->API_sampleRate != 8000 ) && + ( encControl->API_sampleRate != 12000 ) && + ( encControl->API_sampleRate != 16000 ) && + ( encControl->API_sampleRate != 24000 ) && + ( encControl->API_sampleRate != 32000 ) && + ( encControl->API_sampleRate != 44100 ) && + ( encControl->API_sampleRate != 48000 ) ) || + ( ( encControl->desiredInternalSampleRate != 8000 ) && + ( encControl->desiredInternalSampleRate != 12000 ) && + ( encControl->desiredInternalSampleRate != 16000 ) ) || + ( ( encControl->maxInternalSampleRate != 8000 ) && + ( encControl->maxInternalSampleRate != 12000 ) && + ( encControl->maxInternalSampleRate != 16000 ) ) || + ( ( encControl->minInternalSampleRate != 8000 ) && + ( encControl->minInternalSampleRate != 12000 ) && + ( encControl->minInternalSampleRate != 16000 ) ) || + ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || + ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || + ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { + celt_assert( 0 ); + return SILK_ENC_FS_NOT_SUPPORTED; + } + if( encControl->payloadSize_ms != 10 && + encControl->payloadSize_ms != 20 && + encControl->payloadSize_ms != 40 && + encControl->payloadSize_ms != 60 ) { + celt_assert( 0 ); + return SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; + } + if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_LOSS_RATE; + } + if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_DTX_SETTING; + } + if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_CBR_SETTING; + } + if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_INBAND_FEC_SETTING; + } + if( encControl->nChannelsAPI < 1 || encControl->nChannelsAPI > ENCODER_NUM_CHANNELS ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; + } + if( encControl->nChannelsInternal < 1 || encControl->nChannelsInternal > ENCODER_NUM_CHANNELS ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; + } + if( encControl->nChannelsInternal > encControl->nChannelsAPI ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; + } + if( encControl->complexity < 0 || encControl->complexity > 10 ) { + celt_assert( 0 ); + return SILK_ENC_INVALID_COMPLEXITY_SETTING; + } + + return SILK_NO_ERROR; +} diff --git a/src/libopus/silk/code_signs.c b/src/libopus/silk/code_signs.c new file mode 100644 index 00000000..b9eae242 --- /dev/null +++ b/src/libopus/silk/code_signs.c @@ -0,0 +1,115 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/*#define silk_enc_map(a) ((a) > 0 ? 1 : 0)*/ +/*#define silk_dec_map(a) ((a) > 0 ? 1 : -1)*/ +/* shifting avoids if-statement */ +#define silk_enc_map(a) ( silk_RSHIFT( (a), 15 ) + 1 ) +#define silk_dec_map(a) ( silk_LSHIFT( (a), 1 ) - 1 ) + +/* Encodes signs of excitation */ +void silk_encode_signs( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + const opus_int8 pulses[], /* I pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ +) +{ + opus_int i, j, p; + opus_uint8 icdf[ 2 ]; + const opus_int8 *q_ptr; + const opus_uint8 *icdf_ptr; + + icdf[ 1 ] = 0; + q_ptr = pulses; + i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); + icdf_ptr = &silk_sign_iCDF[ i ]; + length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); + for( i = 0; i < length; i++ ) { + p = sum_pulses[ i ]; + if( p > 0 ) { + icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; + for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { + if( q_ptr[ j ] != 0 ) { + ec_enc_icdf( psRangeEnc, silk_enc_map( q_ptr[ j ]), icdf, 8 ); + } + } + } + q_ptr += SHELL_CODEC_FRAME_LENGTH; + } +} + +/* Decodes signs of excitation */ +void silk_decode_signs( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* I/O pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ +) +{ + opus_int i, j, p; + opus_uint8 icdf[ 2 ]; + opus_int16 *q_ptr; + const opus_uint8 *icdf_ptr; + + icdf[ 1 ] = 0; + q_ptr = pulses; + i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); + icdf_ptr = &silk_sign_iCDF[ i ]; + length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); + for( i = 0; i < length; i++ ) { + p = sum_pulses[ i ]; + if( p > 0 ) { + icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; + for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { + if( q_ptr[ j ] > 0 ) { + /* attach sign */ +#if 0 + /* conditional implementation */ + if( ec_dec_icdf( psRangeDec, icdf, 8 ) == 0 ) { + q_ptr[ j ] = -q_ptr[ j ]; + } +#else + /* implementation with shift, subtraction, multiplication */ + q_ptr[ j ] *= silk_dec_map( ec_dec_icdf( psRangeDec, icdf, 8 ) ); +#endif + } + } + } + q_ptr += SHELL_CODEC_FRAME_LENGTH; + } +} diff --git a/src/libopus/silk/config.h b/src/libopus/silk/config.h new file mode 100644 index 00000000..2989b6b0 --- /dev/null +++ b/src/libopus/silk/config.h @@ -0,0 +1 @@ +#include "../include/config.h" diff --git a/src/libopus/silk/control.h b/src/libopus/silk/control.h new file mode 100644 index 00000000..f5633e62 --- /dev/null +++ b/src/libopus/silk/control.h @@ -0,0 +1,161 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_CONTROL_H +#define SILK_CONTROL_H + +#include "typedef.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Decoder API flags */ +#define FLAG_DECODE_NORMAL 0 +#define FLAG_PACKET_LOST 1 +#define FLAG_DECODE_LBRR 2 + +/***********************************************/ +/* Structure for controlling encoder operation */ +/***********************************************/ +typedef struct { + /* I: Number of channels; 1/2 */ + opus_int32 nChannelsAPI; + + /* I: Number of channels; 1/2 */ + opus_int32 nChannelsInternal; + + /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ + opus_int32 API_sampleRate; + + /* I: Maximum internal sampling rate in Hertz; 8000/12000/16000 */ + opus_int32 maxInternalSampleRate; + + /* I: Minimum internal sampling rate in Hertz; 8000/12000/16000 */ + opus_int32 minInternalSampleRate; + + /* I: Soft request for internal sampling rate in Hertz; 8000/12000/16000 */ + opus_int32 desiredInternalSampleRate; + + /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ + opus_int payloadSize_ms; + + /* I: Bitrate during active speech in bits/second; internally limited */ + opus_int32 bitRate; + + /* I: Uplink packet loss in percent (0-100) */ + opus_int packetLossPercentage; + + /* I: Complexity mode; 0 is lowest, 10 is highest complexity */ + opus_int complexity; + + /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ + opus_int useInBandFEC; + + /* I: Flag to enable in-band Deep REDundancy (DRED); 0/1 */ + opus_int useDRED; + + /* I: Flag to actually code in-band Forward Error Correction (FEC) in the current packet; 0/1 */ + opus_int LBRR_coded; + + /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ + opus_int useDTX; + + /* I: Flag to use constant bitrate */ + opus_int useCBR; + + /* I: Maximum number of bits allowed for the frame */ + opus_int maxBits; + + /* I: Causes a smooth downmix to mono */ + opus_int toMono; + + /* I: Opus encoder is allowing us to switch bandwidth */ + opus_int opusCanSwitch; + + /* I: Make frames as independent as possible (but still use LPC) */ + opus_int reducedDependency; + + /* O: Internal sampling rate used, in Hertz; 8000/12000/16000 */ + opus_int32 internalSampleRate; + + /* O: Flag that bandwidth switching is allowed (because low voice activity) */ + opus_int allowBandwidthSwitch; + + /* O: Flag that SILK runs in WB mode without variable LP filter (use for switching between WB/SWB/FB) */ + opus_int inWBmodeWithoutVariableLP; + + /* O: Stereo width */ + opus_int stereoWidth_Q14; + + /* O: Tells the Opus encoder we're ready to switch */ + opus_int switchReady; + + /* O: SILK Signal type */ + opus_int signalType; + + /* O: SILK offset (dithering) */ + opus_int offset; +} silk_EncControlStruct; + +/**************************************************************************/ +/* Structure for controlling decoder operation and reading decoder status */ +/**************************************************************************/ +typedef struct { + /* I: Number of channels; 1/2 */ + opus_int32 nChannelsAPI; + + /* I: Number of channels; 1/2 */ + opus_int32 nChannelsInternal; + + /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ + opus_int32 API_sampleRate; + + /* I: Internal sampling rate used, in Hertz; 8000/12000/16000 */ + opus_int32 internalSampleRate; + + /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ + opus_int payloadSize_ms; + + /* O: Pitch lag of previous frame (0 if unvoiced), measured in samples at 48 kHz */ + opus_int prevPitchLag; + + /* I: Enable Deep PLC */ + opus_int enable_deep_plc; + +#ifdef ENABLE_OSCE + /* I: OSCE method */ + opus_int osce_method; +#endif +} silk_DecControlStruct; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/control_SNR.c b/src/libopus/silk/control_SNR.c new file mode 100644 index 00000000..cb26f267 --- /dev/null +++ b/src/libopus/silk/control_SNR.c @@ -0,0 +1,113 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "tuning_parameters.h" + +/* These tables hold SNR values divided by 21 (so they fit in 8 bits) + for different target bitrates spaced at 400 bps interval. The first + 10 values are omitted (0-4 kb/s) because they're all zeros. + These tables were obtained by running different SNRs through the + encoder and measuring the active bitrate. */ +static const unsigned char silk_TargetRate_NB_21[117 - 10] = { + 0, 15, 39, 52, 61, 68, + 74, 79, 84, 88, 92, 95, 99,102,105,108,111,114,117,119,122,124, + 126,129,131,133,135,137,139,142,143,145,147,149,151,153,155,157, + 158,160,162,163,165,167,168,170,171,173,174,176,177,179,180,182, + 183,185,186,187,189,190,192,193,194,196,197,199,200,201,203,204, + 205,207,208,209,211,212,213,215,216,217,219,220,221,223,224,225, + 227,228,230,231,232,234,235,236,238,239,241,242,243,245,246,248, + 249,250,252,253,255 +}; + +static const unsigned char silk_TargetRate_MB_21[165 - 10] = { + 0, 0, 28, 43, 52, 59, + 65, 70, 74, 78, 81, 85, 87, 90, 93, 95, 98,100,102,105,107,109, + 111,113,115,116,118,120,122,123,125,127,128,130,131,133,134,136, + 137,138,140,141,143,144,145,147,148,149,151,152,153,154,156,157, + 158,159,160,162,163,164,165,166,167,168,169,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,188,189,190, + 191,192,193,194,195,196,197,198,199,200,201,202,203,203,204,205, + 206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220, + 221,222,223,224,224,225,226,227,228,229,230,231,232,233,234,235, + 236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250, + 251,252,253,254,255 +}; + +static const unsigned char silk_TargetRate_WB_21[201 - 10] = { + 0, 0, 0, 8, 29, 41, + 49, 56, 62, 66, 70, 74, 77, 80, 83, 86, 88, 91, 93, 95, 97, 99, + 101,103,105,107,108,110,112,113,115,116,118,119,121,122,123,125, + 126,127,129,130,131,132,134,135,136,137,138,140,141,142,143,144, + 145,146,147,148,149,150,151,152,153,154,156,157,158,159,159,160, + 161,162,163,164,165,166,167,168,169,170,171,171,172,173,174,175, + 176,177,177,178,179,180,181,181,182,183,184,185,185,186,187,188, + 189,189,190,191,192,192,193,194,195,195,196,197,198,198,199,200, + 200,201,202,203,203,204,205,206,206,207,208,209,209,210,211,211, + 212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223, + 224,224,225,226,226,227,228,229,229,230,231,232,232,233,234,234, + 235,236,237,237,238,239,240,240,241,242,243,243,244,245,246,246, + 247,248,249,249,250,251,252,253,255 +}; + +/* Control SNR of redidual quantizer */ +opus_int silk_control_SNR( + silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ +) +{ + int id; + int bound; + const unsigned char *snr_table; + + psEncC->TargetRate_bps = TargetRate_bps; + if( psEncC->nb_subfr == 2 ) { + TargetRate_bps -= 2000 + psEncC->fs_kHz/16; + } + if( psEncC->fs_kHz == 8 ) { + bound = sizeof(silk_TargetRate_NB_21); + snr_table = silk_TargetRate_NB_21; + } else if( psEncC->fs_kHz == 12 ) { + bound = sizeof(silk_TargetRate_MB_21); + snr_table = silk_TargetRate_MB_21; + } else { + bound = sizeof(silk_TargetRate_WB_21); + snr_table = silk_TargetRate_WB_21; + } + id = (TargetRate_bps+200)/400; + id = silk_min(id - 10, bound-1); + if( id <= 0 ) { + psEncC->SNR_dB_Q7 = 0; + } else { + psEncC->SNR_dB_Q7 = snr_table[id]*21; + } + return SILK_NO_ERROR; +} diff --git a/src/libopus/silk/control_audio_bandwidth.c b/src/libopus/silk/control_audio_bandwidth.c new file mode 100644 index 00000000..3a05cc04 --- /dev/null +++ b/src/libopus/silk/control_audio_bandwidth.c @@ -0,0 +1,132 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "tuning_parameters.h" + +/* Control internal sampling rate */ +opus_int silk_control_audio_bandwidth( + silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + silk_EncControlStruct *encControl /* I Control structure */ +) +{ + opus_int fs_kHz; + opus_int orig_kHz; + opus_int32 fs_Hz; + + orig_kHz = psEncC->fs_kHz; + /* Handle a bandwidth-switching reset where we need to be aware what the last sampling rate was. */ + if( orig_kHz == 0 ) { + orig_kHz = psEncC->sLP.saved_fs_kHz; + } + fs_kHz = orig_kHz; + fs_Hz = silk_SMULBB( fs_kHz, 1000 ); + if( fs_Hz == 0 ) { + /* Encoder has just been initialized */ + fs_Hz = silk_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz ); + fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); + } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) { + /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ + fs_Hz = psEncC->API_fs_Hz; + fs_Hz = silk_min( fs_Hz, psEncC->maxInternal_fs_Hz ); + fs_Hz = silk_max( fs_Hz, psEncC->minInternal_fs_Hz ); + fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); + } else { + /* State machine for the internal sampling rate switching */ + if( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES ) { + /* Stop transition phase */ + psEncC->sLP.mode = 0; + } + if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) { + /* Check if we should switch down */ + if( silk_SMULBB( orig_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) + { + /* Switch down */ + if( psEncC->sLP.mode == 0 ) { + /* New transition */ + psEncC->sLP.transition_frame_no = TRANSITION_FRAMES; + + /* Reset transition filter state */ + silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); + } + if( encControl->opusCanSwitch ) { + /* Stop transition phase */ + psEncC->sLP.mode = 0; + + /* Switch to a lower sample frequency */ + fs_kHz = orig_kHz == 16 ? 12 : 8; + } else { + if( psEncC->sLP.transition_frame_no <= 0 ) { + encControl->switchReady = 1; + /* Make room for redundancy */ + encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); + } else { + /* Direction: down (at double speed) */ + psEncC->sLP.mode = -2; + } + } + } + else + /* Check if we should switch up */ + if( silk_SMULBB( orig_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) + { + /* Switch up */ + if( encControl->opusCanSwitch ) { + /* Switch to a higher sample frequency */ + fs_kHz = orig_kHz == 8 ? 12 : 16; + + /* New transition */ + psEncC->sLP.transition_frame_no = 0; + + /* Reset transition filter state */ + silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); + + /* Direction: up */ + psEncC->sLP.mode = 1; + } else { + if( psEncC->sLP.mode == 0 ) { + encControl->switchReady = 1; + /* Make room for redundancy */ + encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); + } else { + /* Direction: up */ + psEncC->sLP.mode = 1; + } + } + } else { + if (psEncC->sLP.mode<0) + psEncC->sLP.mode = 1; + } + } + } + + return fs_kHz; +} diff --git a/src/libopus/silk/control_codec.c b/src/libopus/silk/control_codec.c new file mode 100644 index 00000000..2eac36b1 --- /dev/null +++ b/src/libopus/silk/control_codec.c @@ -0,0 +1,423 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif +#ifdef FIXED_POINT +#include "main_FIX.h" +#define silk_encoder_state_Fxx silk_encoder_state_FIX +#else +#include "main_FLP.h" +#define silk_encoder_state_Fxx silk_encoder_state_FLP +#endif +#include "stack_alloc.h" +#include "tuning_parameters.h" +#include "pitch_est_defines.h" + +static opus_int silk_setup_resamplers( + silk_encoder_state_Fxx *psEnc, /* I/O */ + opus_int fs_kHz /* I */ +); + +static opus_int silk_setup_fs( + silk_encoder_state_Fxx *psEnc, /* I/O */ + opus_int fs_kHz, /* I */ + opus_int PacketSize_ms /* I */ +); + +static opus_int silk_setup_complexity( + silk_encoder_state *psEncC, /* I/O */ + opus_int Complexity /* I */ +); + +static OPUS_INLINE opus_int silk_setup_LBRR( + silk_encoder_state *psEncC, /* I/O */ + const silk_EncControlStruct *encControl /* I */ +); + + +/* Control encoder */ +opus_int silk_control_encoder( + silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ + silk_EncControlStruct *encControl, /* I Control structure */ + const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ + const opus_int channelNb, /* I Channel number */ + const opus_int force_fs_kHz +) +{ + opus_int fs_kHz, ret = 0; + + psEnc->sCmn.useDTX = encControl->useDTX; + psEnc->sCmn.useCBR = encControl->useCBR; + psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; + psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; + psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; + psEnc->sCmn.desiredInternal_fs_Hz = encControl->desiredInternalSampleRate; + psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; + psEnc->sCmn.nChannelsAPI = encControl->nChannelsAPI; + psEnc->sCmn.nChannelsInternal = encControl->nChannelsInternal; + psEnc->sCmn.allow_bandwidth_switch = allow_bw_switch; + psEnc->sCmn.channelNb = channelNb; + + if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { + if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { + /* Change in API sampling rate in the middle of encoding a packet */ + ret += silk_setup_resamplers( psEnc, psEnc->sCmn.fs_kHz ); + } + return ret; + } + + /* Beyond this point we know that there are no previously coded frames in the payload buffer */ + + /********************************************/ + /* Determine internal sampling rate */ + /********************************************/ + fs_kHz = silk_control_audio_bandwidth( &psEnc->sCmn, encControl ); + if( force_fs_kHz ) { + fs_kHz = force_fs_kHz; + } + /********************************************/ + /* Prepare resampler and buffered data */ + /********************************************/ + ret += silk_setup_resamplers( psEnc, fs_kHz ); + + /********************************************/ + /* Set internal sampling frequency */ + /********************************************/ + ret += silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms ); + + /********************************************/ + /* Set encoding complexity */ + /********************************************/ + ret += silk_setup_complexity( &psEnc->sCmn, encControl->complexity ); + + /********************************************/ + /* Set packet loss rate measured by farend */ + /********************************************/ + psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage; + + /********************************************/ + /* Set LBRR usage */ + /********************************************/ + ret += silk_setup_LBRR( &psEnc->sCmn, encControl ); + + psEnc->sCmn.controlled_since_last_payload = 1; + + return ret; +} + +static opus_int silk_setup_resamplers( + silk_encoder_state_Fxx *psEnc, /* I/O */ + opus_int fs_kHz /* I */ +) +{ + opus_int ret = SILK_NO_ERROR; + SAVE_STACK; + + if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) + { + if( psEnc->sCmn.fs_kHz == 0 ) { + /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ + ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 ); + } else { + VARDECL( opus_int16, x_buf_API_fs_Hz ); + VARDECL( silk_resampler_state_struct, temp_resampler_state ); +#ifdef FIXED_POINT + opus_int16 *x_bufFIX = psEnc->x_buf; +#else + VARDECL( opus_int16, x_bufFIX ); + opus_int32 new_buf_samples; +#endif + opus_int32 api_buf_samples; + opus_int32 old_buf_samples; + opus_int32 buf_length_ms; + + buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS; + old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz; + +#ifndef FIXED_POINT + new_buf_samples = buf_length_ms * fs_kHz; + ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ), + opus_int16 ); + silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples ); +#endif + + /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */ + ALLOC( temp_resampler_state, 1, silk_resampler_state_struct ); + ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); + + /* Calculate number of samples to temporarily upsample */ + api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 ); + + /* Temporary resampling of x_buf data to API_fs_Hz */ + ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 ); + ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples ); + + /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ + ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 ); + + /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */ + ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples ); + +#ifndef FIXED_POINT + silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples); +#endif + } + } + + psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; + + RESTORE_STACK; + return ret; +} + +static opus_int silk_setup_fs( + silk_encoder_state_Fxx *psEnc, /* I/O */ + opus_int fs_kHz, /* I */ + opus_int PacketSize_ms /* I */ +) +{ + opus_int ret = SILK_NO_ERROR; + + /* Set packet size */ + if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) { + if( ( PacketSize_ms != 10 ) && + ( PacketSize_ms != 20 ) && + ( PacketSize_ms != 40 ) && + ( PacketSize_ms != 60 ) ) { + ret = SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; + } + if( PacketSize_ms <= 10 ) { + psEnc->sCmn.nFramesPerPacket = 1; + psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1; + psEnc->sCmn.frame_length = silk_SMULBB( PacketSize_ms, fs_kHz ); + psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); + if( psEnc->sCmn.fs_kHz == 8 ) { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; + } else { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; + } + } else { + psEnc->sCmn.nFramesPerPacket = silk_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS ); + psEnc->sCmn.nb_subfr = MAX_NB_SUBFR; + psEnc->sCmn.frame_length = silk_SMULBB( 20, fs_kHz ); + psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); + if( psEnc->sCmn.fs_kHz == 8 ) { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; + } else { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; + } + } + psEnc->sCmn.PacketSize_ms = PacketSize_ms; + psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ + } + + /* Set internal sampling frequency */ + celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + celt_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); + if( psEnc->sCmn.fs_kHz != fs_kHz ) { + /* reset part of the state */ + silk_memset( &psEnc->sShape, 0, sizeof( psEnc->sShape ) ); + silk_memset( &psEnc->sCmn.sNSQ, 0, sizeof( psEnc->sCmn.sNSQ ) ); + silk_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); + silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); + psEnc->sCmn.inputBufIx = 0; + psEnc->sCmn.nFramesEncoded = 0; + psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ + + /* Initialize non-zero parameters */ + psEnc->sCmn.prevLag = 100; + psEnc->sCmn.first_frame_after_reset = 1; + psEnc->sShape.LastGainIndex = 10; + psEnc->sCmn.sNSQ.lagPrev = 100; + psEnc->sCmn.sNSQ.prev_gain_Q16 = 65536; + psEnc->sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; + + psEnc->sCmn.fs_kHz = fs_kHz; + if( psEnc->sCmn.fs_kHz == 8 ) { + if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; + } else { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; + } + } else { + if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; + } else { + psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; + } + } + if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) { + psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER; + psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_NB_MB; + } else { + psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER; + psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_WB; + } + psEnc->sCmn.subfr_length = SUB_FRAME_LENGTH_MS * fs_kHz; + psEnc->sCmn.frame_length = silk_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); + psEnc->sCmn.ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); + psEnc->sCmn.la_pitch = silk_SMULBB( LA_PITCH_MS, fs_kHz ); + psEnc->sCmn.max_pitch_lag = silk_SMULBB( 18, fs_kHz ); + if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { + psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); + } else { + psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); + } + if( psEnc->sCmn.fs_kHz == 16 ) { + psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; + } else if( psEnc->sCmn.fs_kHz == 12 ) { + psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; + } else { + psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; + } + } + + /* Check that settings are valid */ + celt_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); + + return ret; +} + +static opus_int silk_setup_complexity( + silk_encoder_state *psEncC, /* I/O */ + opus_int Complexity /* I */ +) +{ + opus_int ret = 0; + + /* Set encoding complexity */ + celt_assert( Complexity >= 0 && Complexity <= 10 ); + if( Complexity < 1 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); + psEncC->pitchEstimationLPCOrder = 6; + psEncC->shapingLPCOrder = 12; + psEncC->la_shape = 3 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 1; + psEncC->useInterpolatedNLSFs = 0; + psEncC->NLSF_MSVQ_Survivors = 2; + psEncC->warping_Q16 = 0; + } else if( Complexity < 2 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); + psEncC->pitchEstimationLPCOrder = 8; + psEncC->shapingLPCOrder = 14; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 1; + psEncC->useInterpolatedNLSFs = 0; + psEncC->NLSF_MSVQ_Survivors = 3; + psEncC->warping_Q16 = 0; + } else if( Complexity < 3 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); + psEncC->pitchEstimationLPCOrder = 6; + psEncC->shapingLPCOrder = 12; + psEncC->la_shape = 3 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 0; + psEncC->NLSF_MSVQ_Survivors = 2; + psEncC->warping_Q16 = 0; + } else if( Complexity < 4 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); + psEncC->pitchEstimationLPCOrder = 8; + psEncC->shapingLPCOrder = 14; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 0; + psEncC->NLSF_MSVQ_Survivors = 4; + psEncC->warping_Q16 = 0; + } else if( Complexity < 6 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.74, 16 ); + psEncC->pitchEstimationLPCOrder = 10; + psEncC->shapingLPCOrder = 16; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 1; + psEncC->NLSF_MSVQ_Survivors = 6; + psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } else if( Complexity < 8 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.72, 16 ); + psEncC->pitchEstimationLPCOrder = 12; + psEncC->shapingLPCOrder = 20; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 3; + psEncC->useInterpolatedNLSFs = 1; + psEncC->NLSF_MSVQ_Survivors = 8; + psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } else { + psEncC->pitchEstimationComplexity = SILK_PE_MAX_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.7, 16 ); + psEncC->pitchEstimationLPCOrder = 16; + psEncC->shapingLPCOrder = 24; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; + psEncC->useInterpolatedNLSFs = 1; + psEncC->NLSF_MSVQ_Survivors = 16; + psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } + + /* Do not allow higher pitch estimation LPC order than predict LPC order */ + psEncC->pitchEstimationLPCOrder = silk_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder ); + psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; + psEncC->Complexity = Complexity; + + celt_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); + celt_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); + celt_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); + celt_assert( psEncC->warping_Q16 <= 32767 ); + celt_assert( psEncC->la_shape <= LA_SHAPE_MAX ); + celt_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); + + return ret; +} + +static OPUS_INLINE opus_int silk_setup_LBRR( + silk_encoder_state *psEncC, /* I/O */ + const silk_EncControlStruct *encControl /* I */ +) +{ + opus_int LBRR_in_previous_packet, ret = SILK_NO_ERROR; + + LBRR_in_previous_packet = psEncC->LBRR_enabled; + psEncC->LBRR_enabled = encControl->LBRR_coded; + if( psEncC->LBRR_enabled ) { + /* Set gain increase for coding LBRR excitation */ + if( LBRR_in_previous_packet == 0 ) { + /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ + psEncC->LBRR_GainIncreases = 7; + } else { + psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.2, 16 ) ), 3 ); + } + } + + return ret; +} diff --git a/src/libopus/silk/cpu_support.h b/src/libopus/silk/cpu_support.h new file mode 100644 index 00000000..32e7df22 --- /dev/null +++ b/src/libopus/silk/cpu_support.h @@ -0,0 +1 @@ +#include "../celt/cpu_support.h" diff --git a/src/libopus/silk/debug.c b/src/libopus/silk/debug.c new file mode 100644 index 00000000..ec8c5256 --- /dev/null +++ b/src/libopus/silk/debug.c @@ -0,0 +1,174 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +typedef int prevent_empty_translation_unit_warning; + +#include "debug.h" + +#if SILK_DEBUG || SILK_TIC_TOC +#include "SigProc_FIX.h" +#endif + +#if SILK_TIC_TOC + +#if (defined(_WIN32) || defined(_WINCE)) +#include /* timer */ +#else /* Linux or Mac*/ +#include +#endif + +#ifdef _WIN32 +unsigned long silk_GetHighResolutionTime(void) /* O time in usec*/ +{ + /* Returns a time counter in microsec */ + /* the resolution is platform dependent */ + /* but is typically 1.62 us resolution */ + LARGE_INTEGER lpPerformanceCount; + LARGE_INTEGER lpFrequency; + QueryPerformanceCounter(&lpPerformanceCount); + QueryPerformanceFrequency(&lpFrequency); + return (unsigned long)((1000000*(lpPerformanceCount.QuadPart)) / lpFrequency.QuadPart); +} +#else /* Linux or Mac*/ +unsigned long GetHighResolutionTime(void) /* O time in usec*/ +{ + struct timeval tv; + gettimeofday(&tv, 0); + return((tv.tv_sec*1000000)+(tv.tv_usec)); +} +#endif + +int silk_Timer_nTimers = 0; +int silk_Timer_depth_ctr = 0; +char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; +#ifdef _WIN32 +LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; +#else +unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; +#endif +unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; +opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; +opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; +opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; +opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; + +#ifdef _WIN32 +void silk_TimerSave(char *file_name) +{ + if( silk_Timer_nTimers > 0 ) + { + int k; + FILE *fp; + LARGE_INTEGER lpFrequency; + LARGE_INTEGER lpPerformanceCount1, lpPerformanceCount2; + int del = 0x7FFFFFFF; + double avg, sum_avg; + /* estimate overhead of calling performance counters */ + for( k = 0; k < 1000; k++ ) { + QueryPerformanceCounter(&lpPerformanceCount1); + QueryPerformanceCounter(&lpPerformanceCount2); + lpPerformanceCount2.QuadPart -= lpPerformanceCount1.QuadPart; + if( (int)lpPerformanceCount2.LowPart < del ) + del = lpPerformanceCount2.LowPart; + } + QueryPerformanceFrequency(&lpFrequency); + /* print results to file */ + sum_avg = 0.0f; + for( k = 0; k < silk_Timer_nTimers; k++ ) { + if (silk_Timer_depth[k] == 0) { + sum_avg += (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart * silk_Timer_cnt[k]; + } + } + fp = fopen(file_name, "w"); + fprintf(fp, " min avg %% max count\n"); + for( k = 0; k < silk_Timer_nTimers; k++ ) { + if (silk_Timer_depth[k] == 0) { + fprintf(fp, "%-28s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 1) { + fprintf(fp, " %-27s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 2) { + fprintf(fp, " %-26s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 3) { + fprintf(fp, " %-25s", silk_Timer_tags[k]); + } else { + fprintf(fp, " %-24s", silk_Timer_tags[k]); + } + avg = (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart; + fprintf(fp, "%8.2f", (1e6 * (silk_max_64(silk_Timer_min[k] - del, 0))) / lpFrequency.QuadPart); + fprintf(fp, "%12.2f %6.2f", avg, 100.0 * avg / sum_avg * silk_Timer_cnt[k]); + fprintf(fp, "%12.2f", (1e6 * (silk_max_64(silk_Timer_max[k] - del, 0))) / lpFrequency.QuadPart); + fprintf(fp, "%10d\n", silk_Timer_cnt[k]); + } + fprintf(fp, " microseconds\n"); + fclose(fp); + } +} +#else +void silk_TimerSave(char *file_name) +{ + if( silk_Timer_nTimers > 0 ) + { + int k; + FILE *fp; + /* print results to file */ + fp = fopen(file_name, "w"); + fprintf(fp, " min avg max count\n"); + for( k = 0; k < silk_Timer_nTimers; k++ ) + { + if (silk_Timer_depth[k] == 0) { + fprintf(fp, "%-28s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 1) { + fprintf(fp, " %-27s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 2) { + fprintf(fp, " %-26s", silk_Timer_tags[k]); + } else if (silk_Timer_depth[k] == 3) { + fprintf(fp, " %-25s", silk_Timer_tags[k]); + } else { + fprintf(fp, " %-24s", silk_Timer_tags[k]); + } + fprintf(fp, "%d ", silk_Timer_min[k]); + fprintf(fp, "%f ", (double)silk_Timer_sum[k] / (double)silk_Timer_cnt[k]); + fprintf(fp, "%d ", silk_Timer_max[k]); + fprintf(fp, "%10d\n", silk_Timer_cnt[k]); + } + fprintf(fp, " microseconds\n"); + fclose(fp); + } +} +#endif + +#endif /* SILK_TIC_TOC */ + +#if SILK_DEBUG +FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; +int silk_debug_store_count = 0; +#endif /* SILK_DEBUG */ + diff --git a/src/libopus/silk/debug.h b/src/libopus/silk/debug.h new file mode 100644 index 00000000..36163e47 --- /dev/null +++ b/src/libopus/silk/debug.h @@ -0,0 +1,267 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_DEBUG_H +#define SILK_DEBUG_H + +/* Set to 1 to enable DEBUG_STORE_DATA() macros for dumping + * intermediate signals from the codec. + */ +#define SILK_DEBUG 0 + +/* Flag for using timers */ +#define SILK_TIC_TOC 0 + +#if SILK_DEBUG || SILK_TIC_TOC +#include "typedef.h" +#include /* strcpy, strcmp */ +#include /* file writing */ +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if SILK_TIC_TOC + +unsigned long GetHighResolutionTime(void); /* O time in usec*/ + +#if (defined(_WIN32) || defined(_WINCE)) +#include /* timer */ +#else /* Linux or Mac*/ +#include +#endif + +/*********************************/ +/* timer functions for profiling */ +/*********************************/ +/* example: */ +/* */ +/* TIC(LPC) */ +/* do_LPC(in_vec, order, acoef); // do LPC analysis */ +/* TOC(LPC) */ +/* */ +/* and call the following just before exiting (from main) */ +/* */ +/* silk_TimerSave("silk_TimingData.txt"); */ +/* */ +/* results are now in silk_TimingData.txt */ + +void silk_TimerSave(char *file_name); + +/* max number of timers (in different locations) */ +#define silk_NUM_TIMERS_MAX 50 +/* max length of name tags in TIC(..), TOC(..) */ +#define silk_NUM_TIMERS_MAX_TAG_LEN 30 + +extern int silk_Timer_nTimers; +extern int silk_Timer_depth_ctr; +extern char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; +#ifdef _WIN32 +extern LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; +#else +extern unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; +#endif +extern unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; +extern opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; +extern opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; +extern opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; +extern opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; + +/* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */ +#ifdef _WIN32 +#define TIC(TAG_NAME) { \ + static int init = 0; \ + static int ID = -1; \ + if( init == 0 ) \ + { \ + int k; \ + init = 1; \ + for( k = 0; k < silk_Timer_nTimers; k++ ) { \ + if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ + ID = k; \ + break; \ + } \ + } \ + if (ID == -1) { \ + ID = silk_Timer_nTimers; \ + silk_Timer_nTimers++; \ + silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ + strcpy(silk_Timer_tags[ID], #TAG_NAME); \ + silk_Timer_cnt[ID] = 0; \ + silk_Timer_sum[ID] = 0; \ + silk_Timer_min[ID] = 0xFFFFFFFF; \ + silk_Timer_max[ID] = 0; \ + } \ + } \ + silk_Timer_depth_ctr++; \ + QueryPerformanceCounter(&silk_Timer_start[ID]); \ +} +#else +#define TIC(TAG_NAME) { \ + static int init = 0; \ + static int ID = -1; \ + if( init == 0 ) \ + { \ + int k; \ + init = 1; \ + for( k = 0; k < silk_Timer_nTimers; k++ ) { \ + if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ + ID = k; \ + break; \ + } \ + } \ + if (ID == -1) { \ + ID = silk_Timer_nTimers; \ + silk_Timer_nTimers++; \ + silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ + strcpy(silk_Timer_tags[ID], #TAG_NAME); \ + silk_Timer_cnt[ID] = 0; \ + silk_Timer_sum[ID] = 0; \ + silk_Timer_min[ID] = 0xFFFFFFFF; \ + silk_Timer_max[ID] = 0; \ + } \ + } \ + silk_Timer_depth_ctr++; \ + silk_Timer_start[ID] = GetHighResolutionTime(); \ +} +#endif + +#ifdef _WIN32 +#define TOC(TAG_NAME) { \ + LARGE_INTEGER lpPerformanceCount; \ + static int init = 0; \ + static int ID = 0; \ + if( init == 0 ) \ + { \ + int k; \ + init = 1; \ + for( k = 0; k < silk_Timer_nTimers; k++ ) { \ + if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ + ID = k; \ + break; \ + } \ + } \ + } \ + QueryPerformanceCounter(&lpPerformanceCount); \ + lpPerformanceCount.QuadPart -= silk_Timer_start[ID].QuadPart; \ + if((lpPerformanceCount.QuadPart < 100000000) && \ + (lpPerformanceCount.QuadPart >= 0)) { \ + silk_Timer_cnt[ID]++; \ + silk_Timer_sum[ID] += lpPerformanceCount.QuadPart; \ + if( lpPerformanceCount.QuadPart > silk_Timer_max[ID] ) \ + silk_Timer_max[ID] = lpPerformanceCount.QuadPart; \ + if( lpPerformanceCount.QuadPart < silk_Timer_min[ID] ) \ + silk_Timer_min[ID] = lpPerformanceCount.QuadPart; \ + } \ + silk_Timer_depth_ctr--; \ +} +#else +#define TOC(TAG_NAME) { \ + unsigned long endTime; \ + static int init = 0; \ + static int ID = 0; \ + if( init == 0 ) \ + { \ + int k; \ + init = 1; \ + for( k = 0; k < silk_Timer_nTimers; k++ ) { \ + if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ + ID = k; \ + break; \ + } \ + } \ + } \ + endTime = GetHighResolutionTime(); \ + endTime -= silk_Timer_start[ID]; \ + if((endTime < 100000000) && \ + (endTime >= 0)) { \ + silk_Timer_cnt[ID]++; \ + silk_Timer_sum[ID] += endTime; \ + if( endTime > silk_Timer_max[ID] ) \ + silk_Timer_max[ID] = endTime; \ + if( endTime < silk_Timer_min[ID] ) \ + silk_Timer_min[ID] = endTime; \ + } \ + silk_Timer_depth_ctr--; \ +} +#endif + +#else /* SILK_TIC_TOC */ + +/* define macros as empty strings */ +#define TIC(TAG_NAME) +#define TOC(TAG_NAME) +#define silk_TimerSave(FILE_NAME) + +#endif /* SILK_TIC_TOC */ + + +#if SILK_DEBUG +/************************************/ +/* write data to file for debugging */ +/************************************/ +/* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(opus_int16)); */ + +#define silk_NUM_STORES_MAX 100 +extern FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; +extern int silk_debug_store_count; + +/* Faster way of storing the data */ +#define DEBUG_STORE_DATA( FILE_NAME, DATA_PTR, N_BYTES ) { \ + static opus_int init = 0, cnt = 0; \ + static FILE **fp; \ + if (init == 0) { \ + init = 1; \ + cnt = silk_debug_store_count++; \ + silk_debug_store_fp[ cnt ] = fopen(#FILE_NAME, "wb"); \ + } \ + fwrite((DATA_PTR), (N_BYTES), 1, silk_debug_store_fp[ cnt ]); \ +} + +/* Call this at the end of main() */ +#define SILK_DEBUG_STORE_CLOSE_FILES { \ + opus_int i; \ + for( i = 0; i < silk_debug_store_count; i++ ) { \ + fclose( silk_debug_store_fp[ i ] ); \ + } \ +} + +#else /* SILK_DEBUG */ + +/* define macros as empty strings */ +#define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) +#define SILK_DEBUG_STORE_CLOSE_FILES + +#endif /* SILK_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* SILK_DEBUG_H */ diff --git a/src/libopus/silk/dec_API.c b/src/libopus/silk/dec_API.c new file mode 100644 index 00000000..ebe80e5f --- /dev/null +++ b/src/libopus/silk/dec_API.c @@ -0,0 +1,486 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif +#include "API.h" +#include "main.h" +#include "stack_alloc.h" +#include "os_support.h" + +#ifdef ENABLE_OSCE +#include "osce.h" +#include "osce_structs.h" +#endif + +/************************/ +/* Decoder Super Struct */ +/************************/ +typedef struct { + silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ]; + stereo_dec_state sStereo; + opus_int nChannelsAPI; + opus_int nChannelsInternal; + opus_int prev_decode_only_middle; +#ifdef ENABLE_OSCE + OSCEModel osce_model; +#endif +} silk_decoder; + +/*********************/ +/* Decoder functions */ +/*********************/ + + + +opus_int silk_LoadOSCEModels(void *decState, const unsigned char *data, int len) +{ +#ifdef ENABLE_OSCE + opus_int ret = SILK_NO_ERROR; + + ret = osce_load_models(&((silk_decoder *)decState)->osce_model, data, len); + ((silk_decoder *)decState)->osce_model.loaded = (ret == 0); + return ret; +#else + (void) decState; + (void) data; + (void) len; + return SILK_NO_ERROR; +#endif +} + +opus_int silk_Get_Decoder_Size( /* O Returns error code */ + opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ +) +{ + opus_int ret = SILK_NO_ERROR; + + *decSizeBytes = sizeof( silk_decoder ); + + return ret; +} + +/* Reset decoder state */ +opus_int silk_ResetDecoder( /* O Returns error code */ + void *decState /* I/O State */ +) +{ + opus_int n, ret = SILK_NO_ERROR; + silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state; + + for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { + ret = silk_reset_decoder( &channel_state[ n ] ); + } + silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); + /* Not strictly needed, but it's cleaner that way */ + ((silk_decoder *)decState)->prev_decode_only_middle = 0; + + return ret; +} + + +opus_int silk_InitDecoder( /* O Returns error code */ + void *decState /* I/O State */ +) +{ + opus_int n, ret = SILK_NO_ERROR; + silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state; +#ifdef ENABLE_OSCE + ((silk_decoder *)decState)->osce_model.loaded = 0; +#endif +#ifndef USE_WEIGHTS_FILE + /* load osce models */ + silk_LoadOSCEModels(decState, NULL, 0); +#endif + + for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { + ret = silk_init_decoder( &channel_state[ n ] ); + } + silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); + /* Not strictly needed, but it's cleaner that way */ + ((silk_decoder *)decState)->prev_decode_only_middle = 0; + + return ret; +} + +/* Decode a frame */ +opus_int silk_Decode( /* O Returns error code */ + void* decState, /* I/O State */ + silk_DecControlStruct* decControl, /* I/O Control Structure */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 *samplesOut, /* O Decoded output speech vector */ + opus_int32 *nSamplesOut, /* O Number of samples decoded */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif + int arch /* I Run-time architecture */ +) +{ + opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR; + opus_int32 nSamplesOutDec, LBRR_symbol; + opus_int16 *samplesOut1_tmp[ 2 ]; + VARDECL( opus_int16, samplesOut1_tmp_storage1 ); + VARDECL( opus_int16, samplesOut1_tmp_storage2 ); + VARDECL( opus_int16, samplesOut2_tmp ); + opus_int32 MS_pred_Q13[ 2 ] = { 0 }; + opus_int16 *resample_out_ptr; + silk_decoder *psDec = ( silk_decoder * )decState; + silk_decoder_state *channel_state = psDec->channel_state; + opus_int has_side; + opus_int stereo_to_mono; + int delay_stack_alloc; + SAVE_STACK; + + celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); + + /**********************************/ + /* Test if first frame in payload */ + /**********************************/ + if( newPacketFlag ) { + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in packet */ + } + } + + /* If Mono -> Stereo transition in bitstream: init state of second channel */ + if( decControl->nChannelsInternal > psDec->nChannelsInternal ) { + ret += silk_init_decoder( &channel_state[ 1 ] ); + } + + stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 && + ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz ); + + if( channel_state[ 0 ].nFramesDecoded == 0 ) { + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + opus_int fs_kHz_dec; + if( decControl->payloadSize_ms == 0 ) { + /* Assuming packet loss, use 10 ms */ + channel_state[ n ].nFramesPerPacket = 1; + channel_state[ n ].nb_subfr = 2; + } else if( decControl->payloadSize_ms == 10 ) { + channel_state[ n ].nFramesPerPacket = 1; + channel_state[ n ].nb_subfr = 2; + } else if( decControl->payloadSize_ms == 20 ) { + channel_state[ n ].nFramesPerPacket = 1; + channel_state[ n ].nb_subfr = 4; + } else if( decControl->payloadSize_ms == 40 ) { + channel_state[ n ].nFramesPerPacket = 2; + channel_state[ n ].nb_subfr = 4; + } else if( decControl->payloadSize_ms == 60 ) { + channel_state[ n ].nFramesPerPacket = 3; + channel_state[ n ].nb_subfr = 4; + } else { + celt_assert( 0 ); + RESTORE_STACK; + return SILK_DEC_INVALID_FRAME_SIZE; + } + fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; + if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { + celt_assert( 0 ); + RESTORE_STACK; + return SILK_DEC_INVALID_SAMPLING_FREQUENCY; + } + ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate ); + } + } + + if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) { + silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) ); + silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) ); + silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) ); + } + psDec->nChannelsAPI = decControl->nChannelsAPI; + psDec->nChannelsInternal = decControl->nChannelsInternal; + + if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) { + ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY; + RESTORE_STACK; + return( ret ); + } + + if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) { + /* First decoder call for this payload */ + /* Decode VAD flags and LBRR flag */ + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { + channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1); + } + channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1); + } + /* Decode LBRR flags */ + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) ); + if( channel_state[ n ].LBRR_flag ) { + if( channel_state[ n ].nFramesPerPacket == 1 ) { + channel_state[ n ].LBRR_flags[ 0 ] = 1; + } else { + LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1; + for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { + channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1; + } + } + } + } + + if( lostFlag == FLAG_DECODE_NORMAL ) { + /* Regular decoding: skip all LBRR data */ + for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) { + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + if( channel_state[ n ].LBRR_flags[ i ] ) { + opus_int16 pulses[ MAX_FRAME_LENGTH ]; + opus_int condCoding; + + if( decControl->nChannelsInternal == 2 && n == 0 ) { + silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); + if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) { + silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); + } + } + /* Use conditional coding if previous frame available */ + if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) { + condCoding = CODE_CONDITIONALLY; + } else { + condCoding = CODE_INDEPENDENTLY; + } + silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding ); + silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType, + channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length ); + } + } + } + } + } + + /* Get MS predictor index */ + if( decControl->nChannelsInternal == 2 ) { + if( lostFlag == FLAG_DECODE_NORMAL || + ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) ) + { + silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); + /* For LBRR data, decode mid-only flag only if side-channel's LBRR flag is false */ + if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) || + ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ) + { + silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); + } else { + decode_only_middle = 0; + } + } else { + for( n = 0; n < 2; n++ ) { + MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ]; + } + } + } + + /* Reset side channel decoder prediction memory for first frame with side coding */ + if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) { + silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) ); + silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) ); + psDec->channel_state[ 1 ].lagPrev = 100; + psDec->channel_state[ 1 ].LastGainIndex = 10; + psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY; + psDec->channel_state[ 1 ].first_frame_after_reset = 1; + } + + /* Check if the temp buffer fits into the output PCM buffer. If it fits, + we can delay allocating the temp buffer until after the SILK peak stack + usage. We need to use a < and not a <= because of the two extra samples. */ + delay_stack_alloc = decControl->internalSampleRate*decControl->nChannelsInternal + < decControl->API_sampleRate*decControl->nChannelsAPI; + ALLOC( samplesOut1_tmp_storage1, delay_stack_alloc ? ALLOC_NONE + : decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ), + opus_int16 ); + if ( delay_stack_alloc ) + { + samplesOut1_tmp[ 0 ] = samplesOut; + samplesOut1_tmp[ 1 ] = samplesOut + channel_state[ 0 ].frame_length + 2; + } else { + samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1; + samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2; + } + + if( lostFlag == FLAG_DECODE_NORMAL ) { + has_side = !decode_only_middle; + } else { + has_side = !psDec->prev_decode_only_middle + || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 ); + } + channel_state[ 0 ].sPLC.enable_deep_plc = decControl->enable_deep_plc; + /* Call decoder for one frame */ + for( n = 0; n < decControl->nChannelsInternal; n++ ) { + if( n == 0 || has_side ) { + opus_int FrameIndex; + opus_int condCoding; + + FrameIndex = channel_state[ 0 ].nFramesDecoded - n; + /* Use independent coding if no previous frame available */ + if( FrameIndex <= 0 ) { + condCoding = CODE_INDEPENDENTLY; + } else if( lostFlag == FLAG_DECODE_LBRR ) { + condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY; + } else if( n > 0 && psDec->prev_decode_only_middle ) { + /* If we skipped a side frame in this packet, we don't + need LTP scaling; the LTP state is well-defined. */ + condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; + } else { + condCoding = CODE_CONDITIONALLY; + } +#ifdef ENABLE_OSCE + if ( channel_state[n].osce.method != decControl->osce_method ) { + osce_reset( &channel_state[n].osce, decControl->osce_method ); + } +#endif + ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding, +#ifdef ENABLE_DEEP_PLC + n == 0 ? lpcnet : NULL, +#endif +#ifdef ENABLE_OSCE + &psDec->osce_model, +#endif + arch); + } else { + silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) ); + } + channel_state[ n ].nFramesDecoded++; + } + + if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) { + /* Convert Mid/Side to Left/Right */ + silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec ); + } else { + /* Buffering */ + silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) ); + silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) ); + } + + /* Number of output samples */ + *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); + + /* Set up pointers to temp buffers */ + ALLOC( samplesOut2_tmp, + decControl->nChannelsAPI == 2 ? *nSamplesOut : ALLOC_NONE, opus_int16 ); + if( decControl->nChannelsAPI == 2 ) { + resample_out_ptr = samplesOut2_tmp; + } else { + resample_out_ptr = samplesOut; + } + + ALLOC( samplesOut1_tmp_storage2, delay_stack_alloc + ? decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ) + : ALLOC_NONE, + opus_int16 ); + if ( delay_stack_alloc ) { + OPUS_COPY(samplesOut1_tmp_storage2, samplesOut, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2)); + samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage2; + samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage2 + channel_state[ 0 ].frame_length + 2; + } + for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) { + + /* Resample decoded signal to API_sampleRate */ + ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec ); + + /* Interleave if stereo output and stereo stream */ + if( decControl->nChannelsAPI == 2 ) { + for( i = 0; i < *nSamplesOut; i++ ) { + samplesOut[ n + 2 * i ] = resample_out_ptr[ i ]; + } + } + } + + /* Create two channel output from mono stream */ + if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) { + if ( stereo_to_mono ){ + /* Resample right channel for newly collapsed stereo just in case + we weren't doing collapsing when switching to mono */ + ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec ); + + for( i = 0; i < *nSamplesOut; i++ ) { + samplesOut[ 1 + 2 * i ] = resample_out_ptr[ i ]; + } + } else { + for( i = 0; i < *nSamplesOut; i++ ) { + samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ]; + } + } + } + + /* Export pitch lag, measured at 48 kHz sampling rate */ + if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) { + int mult_tab[ 3 ] = { 6, 4, 3 }; + decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ]; + } else { + decControl->prevPitchLag = 0; + } + + if( lostFlag == FLAG_PACKET_LOST ) { + /* On packet loss, remove the gain clamping to prevent having the energy "bounce back" + if we lose packets when the energy is going down */ + for ( i = 0; i < psDec->nChannelsInternal; i++ ) + psDec->channel_state[ i ].LastGainIndex = 10; + } else { + psDec->prev_decode_only_middle = decode_only_middle; + } + RESTORE_STACK; + return ret; +} + +#if 0 +/* Getting table of contents for a packet */ +opus_int silk_get_TOC( + const opus_uint8 *payload, /* I Payload data */ + const opus_int nBytesIn, /* I Number of input bytes */ + const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ + silk_TOC_struct *Silk_TOC /* O Type of content */ +) +{ + opus_int i, flags, ret = SILK_NO_ERROR; + + if( nBytesIn < 1 ) { + return -1; + } + if( nFramesPerPayload < 0 || nFramesPerPayload > 3 ) { + return -1; + } + + silk_memset( Silk_TOC, 0, sizeof( *Silk_TOC ) ); + + /* For stereo, extract the flags for the mid channel */ + flags = silk_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( silk_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 ); + + Silk_TOC->inbandFECFlag = flags & 1; + for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) { + flags = silk_RSHIFT( flags, 1 ); + Silk_TOC->VADFlags[ i ] = flags & 1; + Silk_TOC->VADFlag |= flags & 1; + } + + return ret; +} +#endif diff --git a/src/libopus/silk/decode_core.c b/src/libopus/silk/decode_core.c new file mode 100644 index 00000000..ffe752c9 --- /dev/null +++ b/src/libopus/silk/decode_core.c @@ -0,0 +1,237 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +/**********************************************************/ +/* Core decoder. Performs inverse NSQ operation LTP + LPC */ +/**********************************************************/ +void silk_decode_core( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I Decoder control */ + opus_int16 xq[], /* O Decoded speech */ + const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ + int arch /* I Run-time architecture */ +) +{ + opus_int i, k, lag = 0, start_idx, sLTP_buf_idx, NLSF_interpolation_flag, signalType; + opus_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ]; + VARDECL( opus_int16, sLTP ); + VARDECL( opus_int32, sLTP_Q15 ); + opus_int32 LTP_pred_Q13, LPC_pred_Q10, Gain_Q10, inv_gain_Q31, gain_adj_Q16, rand_seed, offset_Q10; + opus_int32 *pred_lag_ptr, *pexc_Q14, *pres_Q14; + VARDECL( opus_int32, res_Q14 ); + VARDECL( opus_int32, sLPC_Q14 ); + SAVE_STACK; + + silk_assert( psDec->prev_gain_Q16 != 0 ); + + ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); + ALLOC( sLTP_Q15, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); + ALLOC( res_Q14, psDec->subfr_length, opus_int32 ); + ALLOC( sLPC_Q14, psDec->subfr_length + MAX_LPC_ORDER, opus_int32 ); + + offset_Q10 = silk_Quantization_Offsets_Q10[ psDec->indices.signalType >> 1 ][ psDec->indices.quantOffsetType ]; + + if( psDec->indices.NLSFInterpCoef_Q2 < 1 << 2 ) { + NLSF_interpolation_flag = 1; + } else { + NLSF_interpolation_flag = 0; + } + + /* Decode excitation */ + rand_seed = psDec->indices.Seed; + for( i = 0; i < psDec->frame_length; i++ ) { + rand_seed = silk_RAND( rand_seed ); + psDec->exc_Q14[ i ] = silk_LSHIFT( (opus_int32)pulses[ i ], 14 ); + if( psDec->exc_Q14[ i ] > 0 ) { + psDec->exc_Q14[ i ] -= QUANT_LEVEL_ADJUST_Q10 << 4; + } else + if( psDec->exc_Q14[ i ] < 0 ) { + psDec->exc_Q14[ i ] += QUANT_LEVEL_ADJUST_Q10 << 4; + } + psDec->exc_Q14[ i ] += offset_Q10 << 4; + if( rand_seed < 0 ) { + psDec->exc_Q14[ i ] = -psDec->exc_Q14[ i ]; + } + + rand_seed = silk_ADD32_ovflw( rand_seed, pulses[ i ] ); + } + + /* Copy LPC state */ + silk_memcpy( sLPC_Q14, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + + pexc_Q14 = psDec->exc_Q14; + pxq = xq; + sLTP_buf_idx = psDec->ltp_mem_length; + /* Loop over subframes */ + for( k = 0; k < psDec->nb_subfr; k++ ) { + pres_Q14 = res_Q14; + A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ]; + + /* Preload LPC coeficients to array on stack. Gives small performance gain */ + silk_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); + B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ]; + signalType = psDec->indices.signalType; + + Gain_Q10 = silk_RSHIFT( psDecCtrl->Gains_Q16[ k ], 6 ); + inv_gain_Q31 = silk_INVERSE32_varQ( psDecCtrl->Gains_Q16[ k ], 47 ); + + /* Calculate gain adjustment factor */ + if( psDecCtrl->Gains_Q16[ k ] != psDec->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( psDec->prev_gain_Q16, psDecCtrl->Gains_Q16[ k ], 16 ); + + /* Scale short term state */ + for( i = 0; i < MAX_LPC_ORDER; i++ ) { + sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, sLPC_Q14[ i ] ); + } + } else { + gain_adj_Q16 = (opus_int32)1 << 16; + } + + /* Save inv_gain */ + silk_assert( inv_gain_Q31 != 0 ); + psDec->prev_gain_Q16 = psDecCtrl->Gains_Q16[ k ]; + + /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */ + if( psDec->lossCnt && psDec->prevSignalType == TYPE_VOICED && + psDec->indices.signalType != TYPE_VOICED && k < MAX_NB_SUBFR/2 ) { + + silk_memset( B_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); + B_Q14[ LTP_ORDER/2 ] = SILK_FIX_CONST( 0.25, 14 ); + + signalType = TYPE_VOICED; + psDecCtrl->pitchL[ k ] = psDec->lagPrev; + } + + if( signalType == TYPE_VOICED ) { + /* Voiced */ + lag = psDecCtrl->pitchL[ k ]; + + /* Re-whitening */ + if( k == 0 || ( k == 2 && NLSF_interpolation_flag ) ) { + /* Rewhiten with new A coefs */ + start_idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; + celt_assert( start_idx > 0 ); + + if( k == 2 ) { + silk_memcpy( &psDec->outBuf[ psDec->ltp_mem_length ], xq, 2 * psDec->subfr_length * sizeof( opus_int16 ) ); + } + + silk_LPC_analysis_filter( &sLTP[ start_idx ], &psDec->outBuf[ start_idx + k * psDec->subfr_length ], + A_Q12, psDec->ltp_mem_length - start_idx, psDec->LPC_order, arch ); + + /* After rewhitening the LTP state is unscaled */ + if( k == 0 ) { + /* Do LTP downscaling to reduce inter-packet dependency */ + inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, psDecCtrl->LTP_scale_Q14 ), 2 ); + } + for( i = 0; i < lag + LTP_ORDER/2; i++ ) { + sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWB( inv_gain_Q31, sLTP[ psDec->ltp_mem_length - i - 1 ] ); + } + } else { + /* Update LTP state when Gain changes */ + if( gain_adj_Q16 != (opus_int32)1 << 16 ) { + for( i = 0; i < lag + LTP_ORDER/2; i++ ) { + sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ sLTP_buf_idx - i - 1 ] ); + } + } + } + } + + /* Long-term prediction */ + if( signalType == TYPE_VOICED ) { + /* Set up pointer */ + pred_lag_ptr = &sLTP_Q15[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + for( i = 0; i < psDec->subfr_length; i++ ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LTP_pred_Q13 = 2; + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); + pred_lag_ptr++; + + /* Generate LPC excitation */ + pres_Q14[ i ] = silk_ADD_LSHIFT32( pexc_Q14[ i ], LTP_pred_Q13, 1 ); + + /* Update states */ + sLTP_Q15[ sLTP_buf_idx ] = silk_LSHIFT( pres_Q14[ i ], 1 ); + sLTP_buf_idx++; + } + } else { + pres_Q14 = pexc_Q14; + } + + for( i = 0; i < psDec->subfr_length; i++ ) { + /* Short-term prediction */ + celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] ); + if( psDec->LPC_order == 16 ) { + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12_tmp[ 10 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12_tmp[ 11 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12_tmp[ 12 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12_tmp[ 13 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12_tmp[ 14 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12_tmp[ 15 ] ); + } + + /* Add prediction to LPC excitation */ + sLPC_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( pres_Q14[ i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); + + /* Scale with gain */ + pxq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14[ MAX_LPC_ORDER + i ], Gain_Q10 ), 8 ) ); + } + + /* Update LPC filter state */ + silk_memcpy( sLPC_Q14, &sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); + pexc_Q14 += psDec->subfr_length; + pxq += psDec->subfr_length; + } + + /* Save LPC state */ + silk_memcpy( psDec->sLPC_Q14_buf, sLPC_Q14, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/decode_frame.c b/src/libopus/silk/decode_frame.c new file mode 100644 index 00000000..fcb51890 --- /dev/null +++ b/src/libopus/silk/decode_frame.c @@ -0,0 +1,169 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" +#include "PLC.h" + +#ifdef ENABLE_OSCE +#include "osce.h" +#endif + +/****************/ +/* Decode frame */ +/****************/ +opus_int silk_decode_frame( + silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pOut[], /* O Pointer to output speech frame */ + opus_int32 *pN, /* O Pointer to size of output frame */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int condCoding, /* I The type of conditional coding to use */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif +#ifdef ENABLE_OSCE + OSCEModel *osce_model, +#endif + int arch /* I Run-time architecture */ +) +{ + VARDECL( silk_decoder_control, psDecCtrl ); + opus_int L, mv_len, ret = 0; + SAVE_STACK; + + L = psDec->frame_length; + ALLOC( psDecCtrl, 1, silk_decoder_control ); + psDecCtrl->LTP_scale_Q14 = 0; + + /* Safety checks */ + celt_assert( L > 0 && L <= MAX_FRAME_LENGTH ); + + if( lostFlag == FLAG_DECODE_NORMAL || + ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) + { + VARDECL( opus_int16, pulses ); +#ifdef ENABLE_OSCE + opus_int32 ec_start; + ec_start = ec_tell(psRangeDec); +#endif + ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) & + ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int16 ); + /*********************************************/ + /* Decode quantization indices of side info */ + /*********************************************/ + silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding ); + + /*********************************************/ + /* Decode quantization indices of excitation */ + /*********************************************/ + silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType, + psDec->indices.quantOffsetType, psDec->frame_length ); + + /********************************************/ + /* Decode parameters and pulse signal */ + /********************************************/ + silk_decode_parameters( psDec, psDecCtrl, condCoding ); + + /********************************************************/ + /* Run inverse NSQ */ + /********************************************************/ + silk_decode_core( psDec, psDecCtrl, pOut, pulses, arch ); + + /*************************/ + /* Update output buffer. */ + /*************************/ + celt_assert( psDec->ltp_mem_length >= psDec->frame_length ); + mv_len = psDec->ltp_mem_length - psDec->frame_length; + silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); + silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); + +#ifdef ENABLE_OSCE + /********************************************************/ + /* Run SILK enhancer */ + /********************************************************/ + osce_enhance_frame( osce_model, psDec, psDecCtrl, pOut, ec_tell(psRangeDec) - ec_start, arch ); +#endif + + /********************************************************/ + /* Update PLC state */ + /********************************************************/ + silk_PLC( psDec, psDecCtrl, pOut, 0, +#ifdef ENABLE_DEEP_PLC + lpcnet, +#endif + arch ); + + psDec->lossCnt = 0; + psDec->prevSignalType = psDec->indices.signalType; + celt_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); + + /* A frame has been decoded without errors */ + psDec->first_frame_after_reset = 0; + } else { + /* Handle packet loss by extrapolation */ + silk_PLC( psDec, psDecCtrl, pOut, 1, +#ifdef ENABLE_DEEP_PLC + lpcnet, +#endif + arch ); + +#ifdef ENABLE_OSCE + osce_reset( &psDec->osce, psDec->osce.method ); +#endif + /*************************/ + /* Update output buffer. */ + /*************************/ + celt_assert( psDec->ltp_mem_length >= psDec->frame_length ); + mv_len = psDec->ltp_mem_length - psDec->frame_length; + silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); + silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); + } + + /************************************************/ + /* Comfort noise generation / estimation */ + /************************************************/ + silk_CNG( psDec, psDecCtrl, pOut, L ); + + /****************************************************************/ + /* Ensure smooth connection of extrapolated and good frames */ + /****************************************************************/ + silk_PLC_glue_frames( psDec, pOut, L ); + + /* Update some decoder state variables */ + psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; + + /* Set output frame length */ + *pN = L; + + RESTORE_STACK; + return ret; +} diff --git a/src/libopus/silk/decode_indices.c b/src/libopus/silk/decode_indices.c new file mode 100644 index 00000000..227235c9 --- /dev/null +++ b/src/libopus/silk/decode_indices.c @@ -0,0 +1,151 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Decode side-information parameters from payload */ +void silk_decode_indices( + silk_decoder_state *psDec, /* I/O State */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int FrameIndex, /* I Frame number */ + opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + opus_int i, k, Ix; + opus_int decode_absolute_lagIndex, delta_lagIndex; + opus_int16 ec_ix[ MAX_LPC_ORDER ]; + opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; + + /*******************************************/ + /* Decode signal type and quantizer offset */ + /*******************************************/ + if( decode_LBRR || psDec->VAD_flags[ FrameIndex ] ) { + Ix = ec_dec_icdf( psRangeDec, silk_type_offset_VAD_iCDF, 8 ) + 2; + } else { + Ix = ec_dec_icdf( psRangeDec, silk_type_offset_no_VAD_iCDF, 8 ); + } + psDec->indices.signalType = (opus_int8)silk_RSHIFT( Ix, 1 ); + psDec->indices.quantOffsetType = (opus_int8)( Ix & 1 ); + + /****************/ + /* Decode gains */ + /****************/ + /* First subframe */ + if( condCoding == CODE_CONDITIONALLY ) { + /* Conditional coding */ + psDec->indices.GainsIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); + } else { + /* Independent coding, in two stages: MSB bits followed by 3 LSBs */ + psDec->indices.GainsIndices[ 0 ] = (opus_int8)silk_LSHIFT( ec_dec_icdf( psRangeDec, silk_gain_iCDF[ psDec->indices.signalType ], 8 ), 3 ); + psDec->indices.GainsIndices[ 0 ] += (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform8_iCDF, 8 ); + } + + /* Remaining subframes */ + for( i = 1; i < psDec->nb_subfr; i++ ) { + psDec->indices.GainsIndices[ i ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); + } + + /**********************/ + /* Decode LSF Indices */ + /**********************/ + psDec->indices.NLSFIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->CB1_iCDF[ ( psDec->indices.signalType >> 1 ) * psDec->psNLSF_CB->nVectors ], 8 ); + silk_NLSF_unpack( ec_ix, pred_Q8, psDec->psNLSF_CB, psDec->indices.NLSFIndices[ 0 ] ); + celt_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); + for( i = 0; i < psDec->psNLSF_CB->order; i++ ) { + Ix = ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); + if( Ix == 0 ) { + Ix -= ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); + } else if( Ix == 2 * NLSF_QUANT_MAX_AMPLITUDE ) { + Ix += ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); + } + psDec->indices.NLSFIndices[ i+1 ] = (opus_int8)( Ix - NLSF_QUANT_MAX_AMPLITUDE ); + } + + /* Decode LSF interpolation factor */ + if( psDec->nb_subfr == MAX_NB_SUBFR ) { + psDec->indices.NLSFInterpCoef_Q2 = (opus_int8)ec_dec_icdf( psRangeDec, silk_NLSF_interpolation_factor_iCDF, 8 ); + } else { + psDec->indices.NLSFInterpCoef_Q2 = 4; + } + + if( psDec->indices.signalType == TYPE_VOICED ) + { + /*********************/ + /* Decode pitch lags */ + /*********************/ + /* Get lag index */ + decode_absolute_lagIndex = 1; + if( condCoding == CODE_CONDITIONALLY && psDec->ec_prevSignalType == TYPE_VOICED ) { + /* Decode Delta index */ + delta_lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_delta_iCDF, 8 ); + if( delta_lagIndex > 0 ) { + delta_lagIndex = delta_lagIndex - 9; + psDec->indices.lagIndex = (opus_int16)( psDec->ec_prevLagIndex + delta_lagIndex ); + decode_absolute_lagIndex = 0; + } + } + if( decode_absolute_lagIndex ) { + /* Absolute decoding */ + psDec->indices.lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_lag_iCDF, 8 ) * silk_RSHIFT( psDec->fs_kHz, 1 ); + psDec->indices.lagIndex += (opus_int16)ec_dec_icdf( psRangeDec, psDec->pitch_lag_low_bits_iCDF, 8 ); + } + psDec->ec_prevLagIndex = psDec->indices.lagIndex; + + /* Get countour index */ + psDec->indices.contourIndex = (opus_int8)ec_dec_icdf( psRangeDec, psDec->pitch_contour_iCDF, 8 ); + + /********************/ + /* Decode LTP gains */ + /********************/ + /* Decode PERIndex value */ + psDec->indices.PERIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_per_index_iCDF, 8 ); + + for( k = 0; k < psDec->nb_subfr; k++ ) { + psDec->indices.LTPIndex[ k ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_gain_iCDF_ptrs[ psDec->indices.PERIndex ], 8 ); + } + + /**********************/ + /* Decode LTP scaling */ + /**********************/ + if( condCoding == CODE_INDEPENDENTLY ) { + psDec->indices.LTP_scaleIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTPscale_iCDF, 8 ); + } else { + psDec->indices.LTP_scaleIndex = 0; + } + } + psDec->ec_prevSignalType = psDec->indices.signalType; + + /***************/ + /* Decode seed */ + /***************/ + psDec->indices.Seed = (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform4_iCDF, 8 ); +} diff --git a/src/libopus/silk/decode_parameters.c b/src/libopus/silk/decode_parameters.c new file mode 100644 index 00000000..80f1497e --- /dev/null +++ b/src/libopus/silk/decode_parameters.c @@ -0,0 +1,115 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Decode parameters from payload */ +void silk_decode_parameters( + silk_decoder_state *psDec, /* I/O State */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + opus_int i, k, Ix; + opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ]; + const opus_int8 *cbk_ptr_Q7; + + /* Dequant Gains */ + silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->indices.GainsIndices, + &psDec->LastGainIndex, condCoding == CODE_CONDITIONALLY, psDec->nb_subfr ); + + /****************/ + /* Decode NLSFs */ + /****************/ + silk_NLSF_decode( pNLSF_Q15, psDec->indices.NLSFIndices, psDec->psNLSF_CB ); + + /* Convert NLSF parameters to AR prediction filter coefficients */ + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order, psDec->arch ); + + /* If just reset, e.g., because internal Fs changed, do not allow interpolation */ + /* improves the case of packet loss in the first frame after a switch */ + if( psDec->first_frame_after_reset == 1 ) { + psDec->indices.NLSFInterpCoef_Q2 = 4; + } + + if( psDec->indices.NLSFInterpCoef_Q2 < 4 ) { + /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */ + /* the previous NLSF1, and the current NLSF1 */ + for( i = 0; i < psDec->LPC_order; i++ ) { + pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + silk_RSHIFT( silk_MUL( psDec->indices.NLSFInterpCoef_Q2, + pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ), 2 ); + } + + /* Convert NLSF parameters to AR prediction filter coefficients */ + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order, psDec->arch ); + } else { + /* Copy LPC coefficients for first half from second half */ + silk_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); + } + + silk_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( opus_int16 ) ); + + /* After a packet loss do BWE of LPC coefs */ + if( psDec->lossCnt ) { + silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); + silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); + } + + if( psDec->indices.signalType == TYPE_VOICED ) { + /*********************/ + /* Decode pitch lags */ + /*********************/ + + /* Decode pitch values */ + silk_decode_pitch( psDec->indices.lagIndex, psDec->indices.contourIndex, psDecCtrl->pitchL, psDec->fs_kHz, psDec->nb_subfr ); + + /* Decode Codebook Index */ + cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ psDec->indices.PERIndex ]; /* set pointer to start of codebook */ + + for( k = 0; k < psDec->nb_subfr; k++ ) { + Ix = psDec->indices.LTPIndex[ k ]; + for( i = 0; i < LTP_ORDER; i++ ) { + psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER + i ] = silk_LSHIFT( cbk_ptr_Q7[ Ix * LTP_ORDER + i ], 7 ); + } + } + + /**********************/ + /* Decode LTP scaling */ + /**********************/ + Ix = psDec->indices.LTP_scaleIndex; + psDecCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ Ix ]; + } else { + silk_memset( psDecCtrl->pitchL, 0, psDec->nb_subfr * sizeof( opus_int ) ); + silk_memset( psDecCtrl->LTPCoef_Q14, 0, LTP_ORDER * psDec->nb_subfr * sizeof( opus_int16 ) ); + psDec->indices.PERIndex = 0; + psDecCtrl->LTP_scale_Q14 = 0; + } +} diff --git a/src/libopus/silk/decode_pitch.c b/src/libopus/silk/decode_pitch.c new file mode 100644 index 00000000..49f59059 --- /dev/null +++ b/src/libopus/silk/decode_pitch.c @@ -0,0 +1,77 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/*********************************************************** +* Pitch analyser function +********************************************************** */ +#include "SigProc_FIX.h" +#include "pitch_est_defines.h" + +void silk_decode_pitch( + opus_int16 lagIndex, /* I */ + opus_int8 contourIndex, /* O */ + opus_int pitch_lags[], /* O 4 pitch values */ + const opus_int Fs_kHz, /* I sampling frequency (kHz) */ + const opus_int nb_subfr /* I number of sub frames */ +) +{ + opus_int lag, k, min_lag, max_lag, cbk_size; + const opus_int8 *Lag_CB_ptr; + + if( Fs_kHz == 8 ) { + if( nb_subfr == PE_MAX_NB_SUBFR ) { + Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; + cbk_size = PE_NB_CBKS_STAGE2_EXT; + } else { + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; + cbk_size = PE_NB_CBKS_STAGE2_10MS; + } + } else { + if( nb_subfr == PE_MAX_NB_SUBFR ) { + Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; + cbk_size = PE_NB_CBKS_STAGE3_MAX; + } else { + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; + cbk_size = PE_NB_CBKS_STAGE3_10MS; + } + } + + min_lag = silk_SMULBB( PE_MIN_LAG_MS, Fs_kHz ); + max_lag = silk_SMULBB( PE_MAX_LAG_MS, Fs_kHz ); + lag = min_lag + lagIndex; + + for( k = 0; k < nb_subfr; k++ ) { + pitch_lags[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, contourIndex, cbk_size ); + pitch_lags[ k ] = silk_LIMIT( pitch_lags[ k ], min_lag, max_lag ); + } +} diff --git a/src/libopus/silk/decode_pulses.c b/src/libopus/silk/decode_pulses.c new file mode 100644 index 00000000..d279820e --- /dev/null +++ b/src/libopus/silk/decode_pulses.c @@ -0,0 +1,115 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/*********************************************/ +/* Decode quantization indices of excitation */ +/*********************************************/ +void silk_decode_pulses( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* O Excitation signal */ + const opus_int signalType, /* I Sigtype */ + const opus_int quantOffsetType, /* I quantOffsetType */ + const opus_int frame_length /* I Frame length */ +) +{ + opus_int i, j, k, iter, abs_q, nLS, RateLevelIndex; + opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ]; + opus_int16 *pulses_ptr; + const opus_uint8 *cdf_ptr; + + /*********************/ + /* Decode rate level */ + /*********************/ + RateLevelIndex = ec_dec_icdf( psRangeDec, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); + + /* Calculate number of shell blocks */ + silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); + iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); + if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { + celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + iter++; + } + + /***************************************************/ + /* Sum-Weighted-Pulses Decoding */ + /***************************************************/ + cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; + for( i = 0; i < iter; i++ ) { + nLshifts[ i ] = 0; + sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 ); + + /* LSB indication */ + while( sum_pulses[ i ] == SILK_MAX_PULSES + 1 ) { + nLshifts[ i ]++; + /* When we've already got 10 LSBs, we shift the table to not allow (SILK_MAX_PULSES + 1) */ + sum_pulses[ i ] = ec_dec_icdf( psRangeDec, + silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 ); + } + } + + /***************************************************/ + /* Shell decoding */ + /***************************************************/ + for( i = 0; i < iter; i++ ) { + if( sum_pulses[ i ] > 0 ) { + silk_shell_decoder( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRangeDec, sum_pulses[ i ] ); + } else { + silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( pulses[0] ) ); + } + } + + /***************************************************/ + /* LSB Decoding */ + /***************************************************/ + for( i = 0; i < iter; i++ ) { + if( nLshifts[ i ] > 0 ) { + nLS = nLshifts[ i ]; + pulses_ptr = &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ]; + for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { + abs_q = pulses_ptr[ k ]; + for( j = 0; j < nLS; j++ ) { + abs_q = silk_LSHIFT( abs_q, 1 ); + abs_q += ec_dec_icdf( psRangeDec, silk_lsb_iCDF, 8 ); + } + pulses_ptr[ k ] = abs_q; + } + /* Mark the number of pulses non-zero for sign decoding. */ + sum_pulses[ i ] |= nLS << 5; + } + } + + /****************************************/ + /* Decode and add signs to pulse signal */ + /****************************************/ + silk_decode_signs( psRangeDec, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); +} diff --git a/src/libopus/silk/decoder_set_fs.c b/src/libopus/silk/decoder_set_fs.c new file mode 100644 index 00000000..3a6a47c7 --- /dev/null +++ b/src/libopus/silk/decoder_set_fs.c @@ -0,0 +1,108 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Set decoder sampling rate */ +opus_int silk_decoder_set_fs( + silk_decoder_state *psDec, /* I/O Decoder state pointer */ + opus_int fs_kHz, /* I Sampling frequency (kHz) */ + opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ +) +{ + opus_int frame_length, ret = 0; + + celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + celt_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); + + /* New (sub)frame length */ + psDec->subfr_length = silk_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz ); + frame_length = silk_SMULBB( psDec->nb_subfr, psDec->subfr_length ); + + /* Initialize resampler when switching internal or external sampling frequency */ + if( psDec->fs_kHz != fs_kHz || psDec->fs_API_hz != fs_API_Hz ) { + /* Initialize the resampler for dec_API.c preparing resampling from fs_kHz to API_fs_Hz */ + ret += silk_resampler_init( &psDec->resampler_state, silk_SMULBB( fs_kHz, 1000 ), fs_API_Hz, 0 ); + + psDec->fs_API_hz = fs_API_Hz; + } + + if( psDec->fs_kHz != fs_kHz || frame_length != psDec->frame_length ) { + if( fs_kHz == 8 ) { + if( psDec->nb_subfr == MAX_NB_SUBFR ) { + psDec->pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; + } else { + psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; + } + } else { + if( psDec->nb_subfr == MAX_NB_SUBFR ) { + psDec->pitch_contour_iCDF = silk_pitch_contour_iCDF; + } else { + psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; + } + } + if( psDec->fs_kHz != fs_kHz ) { + psDec->ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); + if( fs_kHz == 8 || fs_kHz == 12 ) { + psDec->LPC_order = MIN_LPC_ORDER; + psDec->psNLSF_CB = &silk_NLSF_CB_NB_MB; + } else { + psDec->LPC_order = MAX_LPC_ORDER; + psDec->psNLSF_CB = &silk_NLSF_CB_WB; + } + if( fs_kHz == 16 ) { + psDec->pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; + } else if( fs_kHz == 12 ) { + psDec->pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; + } else if( fs_kHz == 8 ) { + psDec->pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; + } else { + /* unsupported sampling rate */ + celt_assert( 0 ); + } + psDec->first_frame_after_reset = 1; + psDec->lagPrev = 100; + psDec->LastGainIndex = 10; + psDec->prevSignalType = TYPE_NO_VOICE_ACTIVITY; + silk_memset( psDec->outBuf, 0, sizeof(psDec->outBuf)); + silk_memset( psDec->sLPC_Q14_buf, 0, sizeof(psDec->sLPC_Q14_buf) ); + } + + psDec->fs_kHz = fs_kHz; + psDec->frame_length = frame_length; + } + + /* Check that settings are valid */ + celt_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); + + return ret; +} + diff --git a/src/libopus/silk/define.h b/src/libopus/silk/define.h new file mode 100644 index 00000000..491c86f3 --- /dev/null +++ b/src/libopus/silk/define.h @@ -0,0 +1,235 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_DEFINE_H +#define SILK_DEFINE_H + +#include "errors.h" +#include "typedef.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Max number of encoder channels (1/2) */ +#define ENCODER_NUM_CHANNELS 2 +/* Number of decoder channels (1/2) */ +#define DECODER_NUM_CHANNELS 2 + +#define MAX_FRAMES_PER_PACKET 3 + +/* Limits on bitrate */ +#define MIN_TARGET_RATE_BPS 5000 +#define MAX_TARGET_RATE_BPS 80000 + +/* LBRR thresholds */ +#define LBRR_NB_MIN_RATE_BPS 12000 +#define LBRR_MB_MIN_RATE_BPS 14000 +#define LBRR_WB_MIN_RATE_BPS 16000 + +/* DTX settings */ +#define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ +#define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ +#define DTX_ACTIVITY_THRESHOLD 0.1f + +/* VAD decision */ +#define VAD_NO_DECISION -1 +#define VAD_NO_ACTIVITY 0 +#define VAD_ACTIVITY 1 + +/* Maximum sampling frequency */ +#define MAX_FS_KHZ 16 +#define MAX_API_FS_KHZ 48 + +/* Signal types */ +#define TYPE_NO_VOICE_ACTIVITY 0 +#define TYPE_UNVOICED 1 +#define TYPE_VOICED 2 + +/* Conditional coding types */ +#define CODE_INDEPENDENTLY 0 +#define CODE_INDEPENDENTLY_NO_LTP_SCALING 1 +#define CODE_CONDITIONALLY 2 + +/* Settings for stereo processing */ +#define STEREO_QUANT_TAB_SIZE 16 +#define STEREO_QUANT_SUB_STEPS 5 +#define STEREO_INTERP_LEN_MS 8 /* must be even */ +#define STEREO_RATIO_SMOOTH_COEF 0.01 /* smoothing coef for signal norms and stereo width */ + +/* Range of pitch lag estimates */ +#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ +#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ + +/* Maximum number of subframes */ +#define MAX_NB_SUBFR 4 + +/* Number of samples per frame */ +#define LTP_MEM_LENGTH_MS 20 +#define SUB_FRAME_LENGTH_MS 5 +#define MAX_SUB_FRAME_LENGTH ( SUB_FRAME_LENGTH_MS * MAX_FS_KHZ ) +#define MAX_FRAME_LENGTH_MS ( SUB_FRAME_LENGTH_MS * MAX_NB_SUBFR ) +#define MAX_FRAME_LENGTH ( MAX_FRAME_LENGTH_MS * MAX_FS_KHZ ) + +/* Milliseconds of lookahead for pitch analysis */ +#define LA_PITCH_MS 2 +#define LA_PITCH_MAX ( LA_PITCH_MS * MAX_FS_KHZ ) + +/* Order of LPC used in find pitch */ +#define MAX_FIND_PITCH_LPC_ORDER 16 + +/* Length of LPC window used in find pitch */ +#define FIND_PITCH_LPC_WIN_MS ( 20 + (LA_PITCH_MS << 1) ) +#define FIND_PITCH_LPC_WIN_MS_2_SF ( 10 + (LA_PITCH_MS << 1) ) +#define FIND_PITCH_LPC_WIN_MAX ( FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ ) + +/* Milliseconds of lookahead for noise shape analysis */ +#define LA_SHAPE_MS 5 +#define LA_SHAPE_MAX ( LA_SHAPE_MS * MAX_FS_KHZ ) + +/* Maximum length of LPC window used in noise shape analysis */ +#define SHAPE_LPC_WIN_MAX ( 15 * MAX_FS_KHZ ) + +/* dB level of lowest gain quantization level */ +#define MIN_QGAIN_DB 2 +/* dB level of highest gain quantization level */ +#define MAX_QGAIN_DB 88 +/* Number of gain quantization levels */ +#define N_LEVELS_QGAIN 64 +/* Max increase in gain quantization index */ +#define MAX_DELTA_GAIN_QUANT 36 +/* Max decrease in gain quantization index */ +#define MIN_DELTA_GAIN_QUANT -4 + +/* Quantization offsets (multiples of 4) */ +#define OFFSET_VL_Q10 32 +#define OFFSET_VH_Q10 100 +#define OFFSET_UVL_Q10 100 +#define OFFSET_UVH_Q10 240 + +#define QUANT_LEVEL_ADJUST_Q10 80 + +/* Maximum numbers of iterations used to stabilize an LPC vector */ +#define MAX_LPC_STABILIZE_ITERATIONS 16 +#define MAX_PREDICTION_POWER_GAIN 1e4f +#define MAX_PREDICTION_POWER_GAIN_AFTER_RESET 1e2f + +#define MAX_LPC_ORDER 16 +#define MIN_LPC_ORDER 10 + +/* Find Pred Coef defines */ +#define LTP_ORDER 5 + +/* LTP quantization settings */ +#define NB_LTP_CBKS 3 + +/* Flag to use harmonic noise shaping */ +#define USE_HARM_SHAPING 1 + +/* Max LPC order of noise shaping filters */ +#define MAX_SHAPE_LPC_ORDER 24 + +#define HARM_SHAPE_FIR_TAPS 3 + +/* Maximum number of delayed decision states */ +#define MAX_DEL_DEC_STATES 4 + +#define LTP_BUF_LENGTH 512 +#define LTP_MASK ( LTP_BUF_LENGTH - 1 ) + +#define DECISION_DELAY 40 + +/* Number of subframes for excitation entropy coding */ +#define SHELL_CODEC_FRAME_LENGTH 16 +#define LOG2_SHELL_CODEC_FRAME_LENGTH 4 +#define MAX_NB_SHELL_BLOCKS ( MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH ) + +/* Number of rate levels, for entropy coding of excitation */ +#define N_RATE_LEVELS 10 + +/* Maximum sum of pulses per shell coding frame */ +#define SILK_MAX_PULSES 16 + +#define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ + +# define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER + +/***************************/ +/* Voice activity detector */ +/***************************/ +#define VAD_N_BANDS 4 + +#define VAD_INTERNAL_SUBFRAMES_LOG2 2 +#define VAD_INTERNAL_SUBFRAMES ( 1 << VAD_INTERNAL_SUBFRAMES_LOG2 ) + +#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */ +#define VAD_NOISE_LEVELS_BIAS 50 + +/* Sigmoid settings */ +#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */ +#define VAD_SNR_FACTOR_Q16 45000 + +/* smoothing for SNR measurement */ +#define VAD_SNR_SMOOTH_COEF_Q18 4096 + +/* Size of the piecewise linear cosine approximation table for the LSFs */ +#define LSF_COS_TAB_SZ_FIX 128 + +/******************/ +/* NLSF quantizer */ +/******************/ +#define NLSF_W_Q 2 +#define NLSF_VQ_MAX_VECTORS 32 +#define NLSF_QUANT_MAX_AMPLITUDE 4 +#define NLSF_QUANT_MAX_AMPLITUDE_EXT 10 +#define NLSF_QUANT_LEVEL_ADJ 0.1 +#define NLSF_QUANT_DEL_DEC_STATES_LOG2 2 +#define NLSF_QUANT_DEL_DEC_STATES ( 1 << NLSF_QUANT_DEL_DEC_STATES_LOG2 ) + +/* Transition filtering for mode switching */ +#define TRANSITION_TIME_MS 5120 /* 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4)*/ +#define TRANSITION_NB 3 /* Hardcoded in tables */ +#define TRANSITION_NA 2 /* Hardcoded in tables */ +#define TRANSITION_INT_NUM 5 /* Hardcoded in tables */ +#define TRANSITION_FRAMES ( TRANSITION_TIME_MS / MAX_FRAME_LENGTH_MS ) +#define TRANSITION_INT_STEPS ( TRANSITION_FRAMES / ( TRANSITION_INT_NUM - 1 ) ) + +/* BWE factors to apply after packet loss */ +#define BWE_AFTER_LOSS_Q16 63570 + +/* Defines for CN generation */ +#define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH))-1 */ +#define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */ +#define CNG_GAIN_SMTH_THRESHOLD_Q16 46396 /* -3 dB */ +#define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/ecintrin.h b/src/libopus/silk/ecintrin.h new file mode 100644 index 00000000..c6cc9b24 --- /dev/null +++ b/src/libopus/silk/ecintrin.h @@ -0,0 +1 @@ +#include "../celt/ecintrin.h" diff --git a/src/libopus/silk/encode_indices.c b/src/libopus/silk/encode_indices.c new file mode 100644 index 00000000..1ef24423 --- /dev/null +++ b/src/libopus/silk/encode_indices.c @@ -0,0 +1,181 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Encode side-information parameters to payload */ +void silk_encode_indices( + silk_encoder_state *psEncC, /* I/O Encoder state */ + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int FrameIndex, /* I Frame number */ + opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + opus_int i, k, typeOffset; + opus_int encode_absolute_lagIndex, delta_lagIndex; + opus_int16 ec_ix[ MAX_LPC_ORDER ]; + opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; + const SideInfoIndices *psIndices; + + if( encode_LBRR ) { + psIndices = &psEncC->indices_LBRR[ FrameIndex ]; + } else { + psIndices = &psEncC->indices; + } + + /*******************************************/ + /* Encode signal type and quantizer offset */ + /*******************************************/ + typeOffset = 2 * psIndices->signalType + psIndices->quantOffsetType; + celt_assert( typeOffset >= 0 && typeOffset < 6 ); + celt_assert( encode_LBRR == 0 || typeOffset >= 2 ); + if( encode_LBRR || typeOffset >= 2 ) { + ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 ); + } else { + ec_enc_icdf( psRangeEnc, typeOffset, silk_type_offset_no_VAD_iCDF, 8 ); + } + + /****************/ + /* Encode gains */ + /****************/ + /* first subframe */ + if( condCoding == CODE_CONDITIONALLY ) { + /* conditional coding */ + silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); + ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 ); + } else { + /* independent coding, in two stages: MSB bits followed by 3 LSBs */ + silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < N_LEVELS_QGAIN ); + ec_enc_icdf( psRangeEnc, silk_RSHIFT( psIndices->GainsIndices[ 0 ], 3 ), silk_gain_iCDF[ psIndices->signalType ], 8 ); + ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ] & 7, silk_uniform8_iCDF, 8 ); + } + + /* remaining subframes */ + for( i = 1; i < psEncC->nb_subfr; i++ ) { + silk_assert( psIndices->GainsIndices[ i ] >= 0 && psIndices->GainsIndices[ i ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); + ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ i ], silk_delta_gain_iCDF, 8 ); + } + + /****************/ + /* Encode NLSFs */ + /****************/ + ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ 0 ], &psEncC->psNLSF_CB->CB1_iCDF[ ( psIndices->signalType >> 1 ) * psEncC->psNLSF_CB->nVectors ], 8 ); + silk_NLSF_unpack( ec_ix, pred_Q8, psEncC->psNLSF_CB, psIndices->NLSFIndices[ 0 ] ); + celt_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); + for( i = 0; i < psEncC->psNLSF_CB->order; i++ ) { + if( psIndices->NLSFIndices[ i+1 ] >= NLSF_QUANT_MAX_AMPLITUDE ) { + ec_enc_icdf( psRangeEnc, 2 * NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); + ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); + } else if( psIndices->NLSFIndices[ i+1 ] <= -NLSF_QUANT_MAX_AMPLITUDE ) { + ec_enc_icdf( psRangeEnc, 0, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); + ec_enc_icdf( psRangeEnc, -psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); + } else { + ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] + NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); + } + } + + /* Encode NLSF interpolation factor */ + if( psEncC->nb_subfr == MAX_NB_SUBFR ) { + silk_assert( psIndices->NLSFInterpCoef_Q2 >= 0 && psIndices->NLSFInterpCoef_Q2 < 5 ); + ec_enc_icdf( psRangeEnc, psIndices->NLSFInterpCoef_Q2, silk_NLSF_interpolation_factor_iCDF, 8 ); + } + + if( psIndices->signalType == TYPE_VOICED ) + { + /*********************/ + /* Encode pitch lags */ + /*********************/ + /* lag index */ + encode_absolute_lagIndex = 1; + if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) { + /* Delta Encoding */ + delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex; + if( delta_lagIndex < -8 || delta_lagIndex > 11 ) { + delta_lagIndex = 0; + } else { + delta_lagIndex = delta_lagIndex + 9; + encode_absolute_lagIndex = 0; /* Only use delta */ + } + silk_assert( delta_lagIndex >= 0 && delta_lagIndex < 21 ); + ec_enc_icdf( psRangeEnc, delta_lagIndex, silk_pitch_delta_iCDF, 8 ); + } + if( encode_absolute_lagIndex ) { + /* Absolute encoding */ + opus_int32 pitch_high_bits, pitch_low_bits; + pitch_high_bits = silk_DIV32_16( psIndices->lagIndex, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); + pitch_low_bits = psIndices->lagIndex - silk_SMULBB( pitch_high_bits, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); + silk_assert( pitch_low_bits < psEncC->fs_kHz / 2 ); + silk_assert( pitch_high_bits < 32 ); + ec_enc_icdf( psRangeEnc, pitch_high_bits, silk_pitch_lag_iCDF, 8 ); + ec_enc_icdf( psRangeEnc, pitch_low_bits, psEncC->pitch_lag_low_bits_iCDF, 8 ); + } + psEncC->ec_prevLagIndex = psIndices->lagIndex; + + /* Countour index */ + silk_assert( psIndices->contourIndex >= 0 ); + silk_assert( ( psIndices->contourIndex < 34 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 4 ) || + ( psIndices->contourIndex < 11 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 4 ) || + ( psIndices->contourIndex < 12 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 2 ) || + ( psIndices->contourIndex < 3 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 2 ) ); + ec_enc_icdf( psRangeEnc, psIndices->contourIndex, psEncC->pitch_contour_iCDF, 8 ); + + /********************/ + /* Encode LTP gains */ + /********************/ + /* PERIndex value */ + silk_assert( psIndices->PERIndex >= 0 && psIndices->PERIndex < 3 ); + ec_enc_icdf( psRangeEnc, psIndices->PERIndex, silk_LTP_per_index_iCDF, 8 ); + + /* Codebook Indices */ + for( k = 0; k < psEncC->nb_subfr; k++ ) { + silk_assert( psIndices->LTPIndex[ k ] >= 0 && psIndices->LTPIndex[ k ] < ( 8 << psIndices->PERIndex ) ); + ec_enc_icdf( psRangeEnc, psIndices->LTPIndex[ k ], silk_LTP_gain_iCDF_ptrs[ psIndices->PERIndex ], 8 ); + } + + /**********************/ + /* Encode LTP scaling */ + /**********************/ + if( condCoding == CODE_INDEPENDENTLY ) { + silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 ); + ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 ); + } + silk_assert( !condCoding || psIndices->LTP_scaleIndex == 0 ); + } + + psEncC->ec_prevSignalType = psIndices->signalType; + + /***************/ + /* Encode seed */ + /***************/ + silk_assert( psIndices->Seed >= 0 && psIndices->Seed < 4 ); + ec_enc_icdf( psRangeEnc, psIndices->Seed, silk_uniform4_iCDF, 8 ); +} diff --git a/src/libopus/silk/encode_pulses.c b/src/libopus/silk/encode_pulses.c new file mode 100644 index 00000000..a753e866 --- /dev/null +++ b/src/libopus/silk/encode_pulses.c @@ -0,0 +1,206 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +/*********************************************/ +/* Encode quantization indices of excitation */ +/*********************************************/ + +static OPUS_INLINE opus_int combine_and_check( /* return ok */ + opus_int *pulses_comb, /* O */ + const opus_int *pulses_in, /* I */ + opus_int max_pulses, /* I max value for sum of pulses */ + opus_int len /* I number of output values */ +) +{ + opus_int k, sum; + + for( k = 0; k < len; k++ ) { + sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ]; + if( sum > max_pulses ) { + return 1; + } + pulses_comb[ k ] = sum; + } + + return 0; +} + +/* Encode quantization indices of excitation */ +void silk_encode_pulses( + ec_enc *psRangeEnc, /* I/O compressor data structure */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I quantOffsetType */ + opus_int8 pulses[], /* I quantization indices */ + const opus_int frame_length /* I Frame length */ +) +{ + opus_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0; + opus_int32 abs_q, minSumBits_Q5, sumBits_Q5; + VARDECL( opus_int, abs_pulses ); + VARDECL( opus_int, sum_pulses ); + VARDECL( opus_int, nRshifts ); + opus_int pulses_comb[ 8 ]; + opus_int *abs_pulses_ptr; + const opus_int8 *pulses_ptr; + const opus_uint8 *cdf_ptr; + const opus_uint8 *nBits_ptr; + SAVE_STACK; + + silk_memset( pulses_comb, 0, 8 * sizeof( opus_int ) ); /* Fixing Valgrind reported problem*/ + + /****************************/ + /* Prepare for shell coding */ + /****************************/ + /* Calculate number of shell blocks */ + silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); + iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); + if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { + celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + iter++; + silk_memset( &pulses[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(opus_int8)); + } + + /* Take the absolute value of the pulses */ + ALLOC( abs_pulses, iter * SHELL_CODEC_FRAME_LENGTH, opus_int ); + silk_assert( !( SHELL_CODEC_FRAME_LENGTH & 3 ) ); + for( i = 0; i < iter * SHELL_CODEC_FRAME_LENGTH; i+=4 ) { + abs_pulses[i+0] = ( opus_int )silk_abs( pulses[ i + 0 ] ); + abs_pulses[i+1] = ( opus_int )silk_abs( pulses[ i + 1 ] ); + abs_pulses[i+2] = ( opus_int )silk_abs( pulses[ i + 2 ] ); + abs_pulses[i+3] = ( opus_int )silk_abs( pulses[ i + 3 ] ); + } + + /* Calc sum pulses per shell code frame */ + ALLOC( sum_pulses, iter, opus_int ); + ALLOC( nRshifts, iter, opus_int ); + abs_pulses_ptr = abs_pulses; + for( i = 0; i < iter; i++ ) { + nRshifts[ i ] = 0; + + while( 1 ) { + /* 1+1 -> 2 */ + scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, silk_max_pulses_table[ 0 ], 8 ); + /* 2+2 -> 4 */ + scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 1 ], 4 ); + /* 4+4 -> 8 */ + scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 2 ], 2 ); + /* 8+8 -> 16 */ + scale_down += combine_and_check( &sum_pulses[ i ], pulses_comb, silk_max_pulses_table[ 3 ], 1 ); + + if( scale_down ) { + /* We need to downscale the quantization signal */ + nRshifts[ i ]++; + for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { + abs_pulses_ptr[ k ] = silk_RSHIFT( abs_pulses_ptr[ k ], 1 ); + } + } else { + /* Jump out of while(1) loop and go to next shell coding frame */ + break; + } + } + abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH; + } + + /**************/ + /* Rate level */ + /**************/ + /* find rate level that leads to fewest bits for coding of pulses per block info */ + minSumBits_Q5 = silk_int32_MAX; + for( k = 0; k < N_RATE_LEVELS - 1; k++ ) { + nBits_ptr = silk_pulses_per_block_BITS_Q5[ k ]; + sumBits_Q5 = silk_rate_levels_BITS_Q5[ signalType >> 1 ][ k ]; + for( i = 0; i < iter; i++ ) { + if( nRshifts[ i ] > 0 ) { + sumBits_Q5 += nBits_ptr[ SILK_MAX_PULSES + 1 ]; + } else { + sumBits_Q5 += nBits_ptr[ sum_pulses[ i ] ]; + } + } + if( sumBits_Q5 < minSumBits_Q5 ) { + minSumBits_Q5 = sumBits_Q5; + RateLevelIndex = k; + } + } + ec_enc_icdf( psRangeEnc, RateLevelIndex, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); + + /***************************************************/ + /* Sum-Weighted-Pulses Encoding */ + /***************************************************/ + cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; + for( i = 0; i < iter; i++ ) { + if( nRshifts[ i ] == 0 ) { + ec_enc_icdf( psRangeEnc, sum_pulses[ i ], cdf_ptr, 8 ); + } else { + ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, cdf_ptr, 8 ); + for( k = 0; k < nRshifts[ i ] - 1; k++ ) { + ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); + } + ec_enc_icdf( psRangeEnc, sum_pulses[ i ], silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); + } + } + + /******************/ + /* Shell Encoding */ + /******************/ + for( i = 0; i < iter; i++ ) { + if( sum_pulses[ i ] > 0 ) { + silk_shell_encoder( psRangeEnc, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] ); + } + } + + /****************/ + /* LSB Encoding */ + /****************/ + for( i = 0; i < iter; i++ ) { + if( nRshifts[ i ] > 0 ) { + pulses_ptr = &pulses[ i * SHELL_CODEC_FRAME_LENGTH ]; + nLS = nRshifts[ i ] - 1; + for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { + abs_q = (opus_int8)silk_abs( pulses_ptr[ k ] ); + for( j = nLS; j > 0; j-- ) { + bit = silk_RSHIFT( abs_q, j ) & 1; + ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); + } + bit = abs_q & 1; + ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); + } + } + } + + /****************/ + /* Encode signs */ + /****************/ + silk_encode_signs( psRangeEnc, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/entdec.h b/src/libopus/silk/entdec.h new file mode 100644 index 00000000..07f6c038 --- /dev/null +++ b/src/libopus/silk/entdec.h @@ -0,0 +1 @@ +#include "../celt/entdec.h" diff --git a/src/libopus/silk/entenc.h b/src/libopus/silk/entenc.h new file mode 100644 index 00000000..0ee730b3 --- /dev/null +++ b/src/libopus/silk/entenc.h @@ -0,0 +1 @@ +#include "../celt/entenc.h" diff --git a/src/libopus/silk/errors.h b/src/libopus/silk/errors.h new file mode 100644 index 00000000..45070800 --- /dev/null +++ b/src/libopus/silk/errors.h @@ -0,0 +1,98 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_ERRORS_H +#define SILK_ERRORS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************/ +/* Error messages */ +/******************/ +#define SILK_NO_ERROR 0 + +/**************************/ +/* Encoder error messages */ +/**************************/ + +/* Input length is not a multiple of 10 ms, or length is longer than the packet length */ +#define SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -101 + +/* Sampling frequency not 8000, 12000 or 16000 Hertz */ +#define SILK_ENC_FS_NOT_SUPPORTED -102 + +/* Packet size not 10, 20, 40, or 60 ms */ +#define SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -103 + +/* Allocated payload buffer too short */ +#define SILK_ENC_PAYLOAD_BUF_TOO_SHORT -104 + +/* Loss rate not between 0 and 100 percent */ +#define SILK_ENC_INVALID_LOSS_RATE -105 + +/* Complexity setting not valid, use 0...10 */ +#define SILK_ENC_INVALID_COMPLEXITY_SETTING -106 + +/* Inband FEC setting not valid, use 0 or 1 */ +#define SILK_ENC_INVALID_INBAND_FEC_SETTING -107 + +/* DTX setting not valid, use 0 or 1 */ +#define SILK_ENC_INVALID_DTX_SETTING -108 + +/* CBR setting not valid, use 0 or 1 */ +#define SILK_ENC_INVALID_CBR_SETTING -109 + +/* Internal encoder error */ +#define SILK_ENC_INTERNAL_ERROR -110 + +/* Internal encoder error */ +#define SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR -111 + +/**************************/ +/* Decoder error messages */ +/**************************/ + +/* Output sampling frequency lower than internal decoded sampling frequency */ +#define SILK_DEC_INVALID_SAMPLING_FREQUENCY -200 + +/* Payload size exceeded the maximum allowed 1024 bytes */ +#define SILK_DEC_PAYLOAD_TOO_LARGE -201 + +/* Payload has bit errors */ +#define SILK_DEC_PAYLOAD_ERROR -202 + +/* Payload has bit errors */ +#define SILK_DEC_INVALID_FRAME_SIZE -203 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/fixed/LTP_analysis_filter_FIX.c b/src/libopus/silk/fixed/LTP_analysis_filter_FIX.c new file mode 100644 index 00000000..e7eaabdb --- /dev/null +++ b/src/libopus/silk/fixed/LTP_analysis_filter_FIX.c @@ -0,0 +1,90 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" + +void silk_LTP_analysis_filter_FIX( + opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ + const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ + const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ + const opus_int subfr_length, /* I Length of each subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ +) +{ + const opus_int16 *x_ptr, *x_lag_ptr; + opus_int16 Btmp_Q14[ LTP_ORDER ]; + opus_int16 *LTP_res_ptr; + opus_int k, i; + opus_int32 LTP_est; + + x_ptr = x; + LTP_res_ptr = LTP_res; + for( k = 0; k < nb_subfr; k++ ) { + + x_lag_ptr = x_ptr - pitchL[ k ]; + + Btmp_Q14[ 0 ] = LTPCoef_Q14[ k * LTP_ORDER ]; + Btmp_Q14[ 1 ] = LTPCoef_Q14[ k * LTP_ORDER + 1 ]; + Btmp_Q14[ 2 ] = LTPCoef_Q14[ k * LTP_ORDER + 2 ]; + Btmp_Q14[ 3 ] = LTPCoef_Q14[ k * LTP_ORDER + 3 ]; + Btmp_Q14[ 4 ] = LTPCoef_Q14[ k * LTP_ORDER + 4 ]; + + /* LTP analysis FIR filter */ + for( i = 0; i < subfr_length + pre_length; i++ ) { + LTP_res_ptr[ i ] = x_ptr[ i ]; + + /* Long-term prediction */ + LTP_est = silk_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 1 ], Btmp_Q14[ 1 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 0 ], Btmp_Q14[ 2 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -1 ], Btmp_Q14[ 3 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -2 ], Btmp_Q14[ 4 ] ); + + LTP_est = silk_RSHIFT_ROUND( LTP_est, 14 ); /* round and -> Q0*/ + + /* Subtract long-term prediction */ + LTP_res_ptr[ i ] = (opus_int16)silk_SAT16( (opus_int32)x_ptr[ i ] - LTP_est ); + + /* Scale residual */ + LTP_res_ptr[ i ] = silk_SMULWB( invGains_Q16[ k ], LTP_res_ptr[ i ] ); + + x_lag_ptr++; + } + + /* Update pointers */ + LTP_res_ptr += subfr_length + pre_length; + x_ptr += subfr_length; + } +} + diff --git a/src/libopus/silk/fixed/LTP_scale_ctrl_FIX.c b/src/libopus/silk/fixed/LTP_scale_ctrl_FIX.c new file mode 100644 index 00000000..9b108796 --- /dev/null +++ b/src/libopus/silk/fixed/LTP_scale_ctrl_FIX.c @@ -0,0 +1,58 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" + +/* Calculation of LTP state scaling */ +void silk_LTP_scale_ctrl_FIX( + silk_encoder_state_FIX *psEnc, /* I/O encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + opus_int round_loss; + + if( condCoding == CODE_INDEPENDENTLY ) { + /* Only scale if first frame in packet */ + round_loss = psEnc->sCmn.PacketLoss_perc * psEnc->sCmn.nFramesPerPacket; + if ( psEnc->sCmn.LBRR_flag ) { + /* LBRR reduces the effective loss. In practice, it does not square the loss because + losses aren't independent, but that still seems to work best. We also never go below 2%. */ + round_loss = 2 + silk_SMULBB( round_loss, round_loss ) / 100; + } + psEnc->sCmn.indices.LTP_scaleIndex = silk_SMULBB( psEncCtrl->LTPredCodGain_Q7, round_loss ) > silk_log2lin( 128*7 + 2900-psEnc->sCmn.SNR_dB_Q7 ); + psEnc->sCmn.indices.LTP_scaleIndex += silk_SMULBB( psEncCtrl->LTPredCodGain_Q7, round_loss ) > silk_log2lin( 128*7 + 3900-psEnc->sCmn.SNR_dB_Q7 ); + } else { + /* Default is minimum scaling */ + psEnc->sCmn.indices.LTP_scaleIndex = 0; + } + psEncCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ]; +} diff --git a/src/libopus/silk/fixed/PLC.h b/src/libopus/silk/fixed/PLC.h new file mode 100644 index 00000000..7b741074 --- /dev/null +++ b/src/libopus/silk/fixed/PLC.h @@ -0,0 +1 @@ +#include "../PLC.h" diff --git a/src/libopus/silk/fixed/SigProc_FIX.h b/src/libopus/silk/fixed/SigProc_FIX.h new file mode 100644 index 00000000..54611bd6 --- /dev/null +++ b/src/libopus/silk/fixed/SigProc_FIX.h @@ -0,0 +1 @@ +#include "../SigProc_FIX.h" diff --git a/src/libopus/silk/fixed/apply_sine_window_FIX.c b/src/libopus/silk/fixed/apply_sine_window_FIX.c new file mode 100644 index 00000000..3349213c --- /dev/null +++ b/src/libopus/silk/fixed/apply_sine_window_FIX.c @@ -0,0 +1,101 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Apply sine window to signal vector. */ +/* Window types: */ +/* 1 -> sine window from 0 to pi/2 */ +/* 2 -> sine window from pi/2 to pi */ +/* Every other sample is linearly interpolated, for speed. */ +/* Window length must be between 16 and 120 (incl) and a multiple of 4. */ + +/* Matlab code for table: + for k=16:9*4:16+2*9*4, fprintf(' %7.d,', -round(65536*pi ./ (k:4:k+8*4))); fprintf('\n'); end +*/ +static const opus_int16 freq_table_Q16[ 27 ] = { + 12111, 9804, 8235, 7100, 6239, 5565, 5022, 4575, 4202, + 3885, 3612, 3375, 3167, 2984, 2820, 2674, 2542, 2422, + 2313, 2214, 2123, 2038, 1961, 1889, 1822, 1760, 1702, +}; + +void silk_apply_sine_window( + opus_int16 px_win[], /* O Pointer to windowed signal */ + const opus_int16 px[], /* I Pointer to input signal */ + const opus_int win_type, /* I Selects a window type */ + const opus_int length /* I Window length, multiple of 4 */ +) +{ + opus_int k, f_Q16, c_Q16; + opus_int32 S0_Q16, S1_Q16; + + celt_assert( win_type == 1 || win_type == 2 ); + + /* Length must be in a range from 16 to 120 and a multiple of 4 */ + celt_assert( length >= 16 && length <= 120 ); + celt_assert( ( length & 3 ) == 0 ); + + /* Frequency */ + k = ( length >> 2 ) - 4; + celt_assert( k >= 0 && k <= 26 ); + f_Q16 = (opus_int)freq_table_Q16[ k ]; + + /* Factor used for cosine approximation */ + c_Q16 = silk_SMULWB( (opus_int32)f_Q16, -f_Q16 ); + silk_assert( c_Q16 >= -32768 ); + + /* initialize state */ + if( win_type == 1 ) { + /* start from 0 */ + S0_Q16 = 0; + /* approximation of sin(f) */ + S1_Q16 = f_Q16 + silk_RSHIFT( length, 3 ); + } else { + /* start from 1 */ + S0_Q16 = ( (opus_int32)1 << 16 ); + /* approximation of cos(f) */ + S1_Q16 = ( (opus_int32)1 << 16 ) + silk_RSHIFT( c_Q16, 1 ) + silk_RSHIFT( length, 4 ); + } + + /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ + /* 4 samples at a time */ + for( k = 0; k < length; k += 4 ) { + px_win[ k ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k ] ); + px_win[ k + 1 ] = (opus_int16)silk_SMULWB( S1_Q16, px[ k + 1] ); + S0_Q16 = silk_SMULWB( S1_Q16, c_Q16 ) + silk_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1; + S0_Q16 = silk_min( S0_Q16, ( (opus_int32)1 << 16 ) ); + + px_win[ k + 2 ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k + 2] ); + px_win[ k + 3 ] = (opus_int16)silk_SMULWB( S0_Q16, px[ k + 3 ] ); + S1_Q16 = silk_SMULWB( S0_Q16, c_Q16 ) + silk_LSHIFT( S0_Q16, 1 ) - S1_Q16; + S1_Q16 = silk_min( S1_Q16, ( (opus_int32)1 << 16 ) ); + } +} diff --git a/src/libopus/silk/fixed/autocorr_FIX.c b/src/libopus/silk/fixed/autocorr_FIX.c new file mode 100644 index 00000000..fe7a800f --- /dev/null +++ b/src/libopus/silk/fixed/autocorr_FIX.c @@ -0,0 +1,48 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "celt_lpc.h" + +/* Compute autocorrelation */ +void silk_autocorr( + opus_int32 *results, /* O Result (length correlationCount) */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *inputData, /* I Input data to correlate */ + const opus_int inputDataSize, /* I Length of input */ + const opus_int correlationCount, /* I Number of correlation taps to compute */ + int arch /* I Run-time architecture */ +) +{ + opus_int corrCount; + corrCount = silk_min_int( inputDataSize, correlationCount ); + *scale = _celt_autocorr(inputData, results, NULL, 0, corrCount-1, inputDataSize, arch); +} diff --git a/src/libopus/silk/fixed/burg_modified_FIX.c b/src/libopus/silk/fixed/burg_modified_FIX.c new file mode 100644 index 00000000..745e3f9f --- /dev/null +++ b/src/libopus/silk/fixed/burg_modified_FIX.c @@ -0,0 +1,280 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "define.h" +#include "tuning_parameters.h" +#include "pitch.h" + +#define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ + +#define QA 25 +#define N_BITS_HEAD_ROOM 3 +#define MIN_RSHIFTS -16 +#define MAX_RSHIFTS (32 - QA) + +/* Compute reflection coefficients from input signal */ +void silk_burg_modified_c( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ +) +{ + opus_int k, n, s, lz, rshifts, reached_max_gain; + opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; + const opus_int16 *x_ptr; + opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; + opus_int64 C0_64; + + celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + + /* Compute autocorrelations, added over subframes */ + C0_64 = silk_inner_prod16( x, x, subfr_length*nb_subfr, arch ); + lz = silk_CLZ64(C0_64); + rshifts = 32 + 1 + N_BITS_HEAD_ROOM - lz; + if (rshifts > MAX_RSHIFTS) rshifts = MAX_RSHIFTS; + if (rshifts < MIN_RSHIFTS) rshifts = MIN_RSHIFTS; + + if (rshifts > 0) { + C0 = (opus_int32)silk_RSHIFT64(C0_64, rshifts ); + } else { + C0 = silk_LSHIFT32((opus_int32)C0_64, -rshifts ); + } + + CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ + silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); + if( rshifts > 0 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + for( n = 1; n < D + 1; n++ ) { + C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64( + silk_inner_prod16( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts ); + } + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + int i; + opus_int32 d; + x_ptr = x + s * subfr_length; + celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch ); + for( n = 1; n < D + 1; n++ ) { + for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ ) + d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] ); + xcorr[ n - 1 ] += d; + } + for( n = 1; n < D + 1; n++ ) { + C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts ); + } + } + } + silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); + + /* Initialize */ + CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ + + invGain_Q30 = (opus_int32)1 << 30; + reached_max_gain = 0; + for( n = 0; n < D; n++ ) { + /* Update first row of correlation matrix (without first element) */ + /* Update last row of correlation matrix (without last element, stored in reversed order) */ + /* Update C * Af */ + /* Update C * flipud(Af) (stored in reversed order) */ + if( rshifts > -2 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], 16 - rshifts ); /* Q(16-rshifts) */ + x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); /* Q(16-rshifts) */ + tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], QA - 16 ); /* Q(QA-16) */ + tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); /* Q(QA-16) */ + for( k = 0; k < n; k++ ) { + C_first_row[ k ] = silk_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ + C_last_row[ k ] = silk_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ + Atmp_QA = Af_QA[ k ]; + tmp1 = silk_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); /* Q(QA-16) */ + tmp2 = silk_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); /* Q(QA-16) */ + } + tmp1 = silk_LSHIFT32( -tmp1, 32 - QA - rshifts ); /* Q(16-rshifts) */ + tmp2 = silk_LSHIFT32( -tmp2, 32 - QA - rshifts ); /* Q(16-rshifts) */ + for( k = 0; k <= n; k++ ) { + CAf[ k ] = silk_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); /* Q( -rshift ) */ + CAb[ k ] = silk_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); /* Q( -rshift ) */ + } + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], -rshifts ); /* Q( -rshifts ) */ + x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); /* Q( -rshifts ) */ + tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], 17 ); /* Q17 */ + tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 17 ); /* Q17 */ + for( k = 0; k < n; k++ ) { + C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ + C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ + Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */ + /* We sometimes get overflows in the multiplications (even beyond +/- 2^32), + but they cancel each other and the real result seems to always fit in a 32-bit + signed integer. This was determined experimentally, not theoretically (unfortunately). */ + tmp1 = silk_MLA_ovflw( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ + tmp2 = silk_MLA_ovflw( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ + } + tmp1 = -tmp1; /* Q17 */ + tmp2 = -tmp2; /* Q17 */ + for( k = 0; k <= n; k++ ) { + CAf[ k ] = silk_SMLAWW( CAf[ k ], tmp1, + silk_LSHIFT32( (opus_int32)x_ptr[ n - k ], -rshifts - 1 ) ); /* Q( -rshift ) */ + CAb[ k ] = silk_SMLAWW( CAb[ k ], tmp2, + silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) ); /* Q( -rshift ) */ + } + } + } + + /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ + tmp1 = C_first_row[ n ]; /* Q( -rshifts ) */ + tmp2 = C_last_row[ n ]; /* Q( -rshifts ) */ + num = 0; /* Q( -rshifts ) */ + nrg = silk_ADD32( CAb[ 0 ], CAf[ 0 ] ); /* Q( 1-rshifts ) */ + for( k = 0; k < n; k++ ) { + Atmp_QA = Af_QA[ k ]; + lz = silk_CLZ32( silk_abs( Atmp_QA ) ) - 1; + lz = silk_min( 32 - QA, lz ); + Atmp1 = silk_LSHIFT32( Atmp_QA, lz ); /* Q( QA + lz ) */ + + tmp1 = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + tmp2 = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + num = silk_ADD_LSHIFT32( num, silk_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + nrg = silk_ADD_LSHIFT32( nrg, silk_SMMUL( silk_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ), + Atmp1 ), 32 - QA - lz ); /* Q( 1-rshifts ) */ + } + CAf[ n + 1 ] = tmp1; /* Q( -rshifts ) */ + CAb[ n + 1 ] = tmp2; /* Q( -rshifts ) */ + num = silk_ADD32( num, tmp2 ); /* Q( -rshifts ) */ + num = silk_LSHIFT32( -num, 1 ); /* Q( 1-rshifts ) */ + + /* Calculate the next order reflection (parcor) coefficient */ + if( silk_abs( num ) < nrg ) { + rc_Q31 = silk_DIV32_varQ( num, nrg, 31 ); + } else { + rc_Q31 = ( num > 0 ) ? silk_int32_MAX : silk_int32_MIN; + } + + /* Update inverse prediction gain */ + tmp1 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); + tmp1 = silk_LSHIFT( silk_SMMUL( invGain_Q30, tmp1 ), 2 ); + if( tmp1 <= minInvGain_Q30 ) { + /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ + tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */ + rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */ + if( rc_Q31 > 0 ) { + /* Newton-Raphson iteration */ + rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ + rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ + if( num < 0 ) { + /* Ensure adjusted reflection coefficients has the original sign */ + rc_Q31 = -rc_Q31; + } + } + invGain_Q30 = minInvGain_Q30; + reached_max_gain = 1; + } else { + invGain_Q30 = tmp1; + } + + /* Update the AR coefficients */ + for( k = 0; k < (n + 1) >> 1; k++ ) { + tmp1 = Af_QA[ k ]; /* QA */ + tmp2 = Af_QA[ n - k - 1 ]; /* QA */ + Af_QA[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* QA */ + Af_QA[ n - k - 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* QA */ + } + Af_QA[ n ] = silk_RSHIFT32( rc_Q31, 31 - QA ); /* QA */ + + if( reached_max_gain ) { + /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ + for( k = n + 1; k < D; k++ ) { + Af_QA[ k ] = 0; + } + break; + } + + /* Update C * Af and C * Ab */ + for( k = 0; k <= n + 1; k++ ) { + tmp1 = CAf[ k ]; /* Q( -rshifts ) */ + tmp2 = CAb[ n - k + 1 ]; /* Q( -rshifts ) */ + CAf[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* Q( -rshifts ) */ + CAb[ n - k + 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* Q( -rshifts ) */ + } + } + + if( reached_max_gain ) { + for( k = 0; k < D; k++ ) { + /* Scale coefficients */ + A_Q16[ k ] = -silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); + } + /* Subtract energy of preceding samples from C0 */ + if( rshifts > 0 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16( x_ptr, x_ptr, D, arch ), rshifts ); + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch), -rshifts); + } + } + /* Approximate residual energy */ + *res_nrg = silk_LSHIFT( silk_SMMUL( invGain_Q30, C0 ), 2 ); + *res_nrg_Q = -rshifts; + } else { + /* Return residual energy */ + nrg = CAf[ 0 ]; /* Q( -rshifts ) */ + tmp1 = (opus_int32)1 << 16; /* Q16 */ + for( k = 0; k < D; k++ ) { + Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); /* Q16 */ + nrg = silk_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); /* Q( -rshifts ) */ + tmp1 = silk_SMLAWW( tmp1, Atmp1, Atmp1 ); /* Q16 */ + A_Q16[ k ] = -Atmp1; + } + *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ + *res_nrg_Q = -rshifts; + } +} diff --git a/src/libopus/silk/fixed/celt_lpc.h b/src/libopus/silk/fixed/celt_lpc.h new file mode 100644 index 00000000..47c4b7d3 --- /dev/null +++ b/src/libopus/silk/fixed/celt_lpc.h @@ -0,0 +1 @@ +#include "../../celt/celt_lpc.h" diff --git a/src/libopus/silk/fixed/config.h b/src/libopus/silk/fixed/config.h new file mode 100644 index 00000000..283c0577 --- /dev/null +++ b/src/libopus/silk/fixed/config.h @@ -0,0 +1 @@ +#include "../../include/config.h" diff --git a/src/libopus/silk/fixed/control.h b/src/libopus/silk/fixed/control.h new file mode 100644 index 00000000..090fb99c --- /dev/null +++ b/src/libopus/silk/fixed/control.h @@ -0,0 +1 @@ +#include "../control.h" diff --git a/src/libopus/silk/fixed/corrMatrix_FIX.c b/src/libopus/silk/fixed/corrMatrix_FIX.c new file mode 100644 index 00000000..28c37dac --- /dev/null +++ b/src/libopus/silk/fixed/corrMatrix_FIX.c @@ -0,0 +1,150 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/********************************************************************** + * Correlation Matrix Computations for LS estimate. + **********************************************************************/ + +#include "main_FIX.h" + +/* Calculates correlation vector X'*t */ +void silk_corrVector_FIX( + const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ + const opus_int16 *t, /* I Target vector [L] */ + const opus_int L, /* I Length of vectors */ + const opus_int order, /* I Max lag for correlation */ + opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ + const opus_int rshifts, /* I Right shifts of correlations */ + int arch /* I Run-time architecture */ +) +{ + opus_int lag, i; + const opus_int16 *ptr1, *ptr2; + opus_int32 inner_prod; + + ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ + ptr2 = t; + /* Calculate X'*t */ + if( rshifts > 0 ) { + /* Right shifting used */ + for( lag = 0; lag < order; lag++ ) { + inner_prod = 0; + for( i = 0; i < L; i++ ) { + inner_prod = silk_ADD_RSHIFT32( inner_prod, silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); + } + Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ + ptr1--; /* Go to next column of X */ + } + } else { + silk_assert( rshifts == 0 ); + for( lag = 0; lag < order; lag++ ) { + Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); /* X[:,lag]'*t */ + ptr1--; /* Go to next column of X */ + } + } +} + +/* Calculates correlation matrix X'*X */ +void silk_corrMatrix_FIX( + const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ + const opus_int L, /* I Length of vectors */ + const opus_int order, /* I Max lag for correlation */ + opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ + opus_int32 *nrg, /* O Energy of x vector */ + opus_int *rshifts, /* O Right shifts of correlations and energy */ + int arch /* I Run-time architecture */ +) +{ + opus_int i, j, lag; + opus_int32 energy; + const opus_int16 *ptr1, *ptr2; + + /* Calculate energy to find shift used to fit in 32 bits */ + silk_sum_sqr_shift( nrg, rshifts, x, L + order - 1 ); + energy = *nrg; + + /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ + /* Remove contribution of first order - 1 samples */ + for( i = 0; i < order - 1; i++ ) { + energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), *rshifts ); + } + + /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ + /* Fill out the diagonal of the correlation matrix */ + matrix_ptr( XX, 0, 0, order ) = energy; + silk_assert( energy >= 0 ); + ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ + for( j = 1; j < order; j++ ) { + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), *rshifts ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), *rshifts ) ); + matrix_ptr( XX, j, j, order ) = energy; + silk_assert( energy >= 0 ); + } + + ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ + /* Calculate the remaining elements of the correlation matrix */ + if( *rshifts > 0 ) { + /* Right shifting used */ + for( lag = 1; lag < order; lag++ ) { + /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ + energy = 0; + for( i = 0; i < L; i++ ) { + energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), *rshifts ); + } + /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ + matrix_ptr( XX, lag, 0, order ) = energy; + matrix_ptr( XX, 0, lag, order ) = energy; + for( j = 1; j < ( order - lag ); j++ ) { + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), *rshifts ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), *rshifts ) ); + matrix_ptr( XX, lag + j, j, order ) = energy; + matrix_ptr( XX, j, lag + j, order ) = energy; + } + ptr2--; /* Update pointer to first sample of next column (lag) in X */ + } + } else { + for( lag = 1; lag < order; lag++ ) { + /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ + energy = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); + matrix_ptr( XX, lag, 0, order ) = energy; + matrix_ptr( XX, 0, lag, order ) = energy; + /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ + for( j = 1; j < ( order - lag ); j++ ) { + energy = silk_SUB32( energy, silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) ); + energy = silk_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] ); + matrix_ptr( XX, lag + j, j, order ) = energy; + matrix_ptr( XX, j, lag + j, order ) = energy; + } + ptr2--;/* Update pointer to first sample of next column (lag) in X */ + } + } +} + diff --git a/src/libopus/silk/fixed/debug.h b/src/libopus/silk/fixed/debug.h new file mode 100644 index 00000000..4b4c44e0 --- /dev/null +++ b/src/libopus/silk/fixed/debug.h @@ -0,0 +1 @@ +#include "../debug.h" diff --git a/src/libopus/silk/fixed/define.h b/src/libopus/silk/fixed/define.h new file mode 100644 index 00000000..ce1ede27 --- /dev/null +++ b/src/libopus/silk/fixed/define.h @@ -0,0 +1 @@ +#include "../define.h" diff --git a/src/libopus/silk/fixed/entdec.h b/src/libopus/silk/fixed/entdec.h new file mode 100644 index 00000000..d3c6484c --- /dev/null +++ b/src/libopus/silk/fixed/entdec.h @@ -0,0 +1 @@ +#include "../../celt/entdec.h" diff --git a/src/libopus/silk/fixed/entenc.h b/src/libopus/silk/fixed/entenc.h new file mode 100644 index 00000000..13312cda --- /dev/null +++ b/src/libopus/silk/fixed/entenc.h @@ -0,0 +1 @@ +#include "../../celt/entenc.h" diff --git a/src/libopus/silk/fixed/find_LPC_FIX.c b/src/libopus/silk/fixed/find_LPC_FIX.c new file mode 100644 index 00000000..e54940d4 --- /dev/null +++ b/src/libopus/silk/fixed/find_LPC_FIX.c @@ -0,0 +1,151 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" +#include "tuning_parameters.h" + +/* Finds LPC vector from correlations, and converts to NLSF */ +void silk_find_LPC_FIX( + silk_encoder_state *psEncC, /* I/O Encoder state */ + opus_int16 NLSF_Q15[], /* O NLSFs */ + const opus_int16 x[], /* I Input signal */ + const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ +) +{ + opus_int k, subfr_length; + opus_int32 a_Q16[ MAX_LPC_ORDER ]; + opus_int isInterpLower, shift; + opus_int32 res_nrg0, res_nrg1; + opus_int rshift0, rshift1; + + /* Used only for LSF interpolation */ + opus_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg; + opus_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q; + opus_int16 a_tmp_Q12[ MAX_LPC_ORDER ]; + opus_int16 NLSF0_Q15[ MAX_LPC_ORDER ]; + SAVE_STACK; + + subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; + + /* Default: no interpolation */ + psEncC->indices.NLSFInterpCoef_Q2 = 4; + + /* Burg AR analysis for the full frame */ + silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, minInvGain_Q30, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder, psEncC->arch ); + + if( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) { + VARDECL( opus_int16, LPC_res ); + + /* Optimal solution for last 10 ms */ + silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + 2 * subfr_length, minInvGain_Q30, subfr_length, 2, psEncC->predictLPCOrder, psEncC->arch ); + + /* subtract residual energy here, as that's easier than adding it to the */ + /* residual energy of the first 10 ms in each iteration of the search below */ + shift = res_tmp_nrg_Q - res_nrg_Q; + if( shift >= 0 ) { + if( shift < 32 ) { + res_nrg = res_nrg - silk_RSHIFT( res_tmp_nrg, shift ); + } + } else { + silk_assert( shift > -32 ); + res_nrg = silk_RSHIFT( res_nrg, -shift ) - res_tmp_nrg; + res_nrg_Q = res_tmp_nrg_Q; + } + + /* Convert to NLSFs */ + silk_A2NLSF( NLSF_Q15, a_tmp_Q16, psEncC->predictLPCOrder ); + + ALLOC( LPC_res, 2 * subfr_length, opus_int16 ); + + /* Search over interpolation indices to find the one with lowest residual energy */ + for( k = 3; k >= 0; k-- ) { + /* Interpolate NLSFs for first half */ + silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); + + /* Convert to LPC for residual energy evaluation */ + silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); + + /* Calculate residual energy with NLSF interpolation */ + silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder, psEncC->arch ); + + silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + psEncC->predictLPCOrder, subfr_length - psEncC->predictLPCOrder ); + silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + psEncC->predictLPCOrder + subfr_length, subfr_length - psEncC->predictLPCOrder ); + + /* Add subframe energies from first half frame */ + shift = rshift0 - rshift1; + if( shift >= 0 ) { + res_nrg1 = silk_RSHIFT( res_nrg1, shift ); + res_nrg_interp_Q = -rshift0; + } else { + res_nrg0 = silk_RSHIFT( res_nrg0, -shift ); + res_nrg_interp_Q = -rshift1; + } + res_nrg_interp = silk_ADD32( res_nrg0, res_nrg1 ); + + /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */ + shift = res_nrg_interp_Q - res_nrg_Q; + if( shift >= 0 ) { + if( silk_RSHIFT( res_nrg_interp, shift ) < res_nrg ) { + isInterpLower = silk_TRUE; + } else { + isInterpLower = silk_FALSE; + } + } else { + if( -shift < 32 ) { + if( res_nrg_interp < silk_RSHIFT( res_nrg, -shift ) ) { + isInterpLower = silk_TRUE; + } else { + isInterpLower = silk_FALSE; + } + } else { + isInterpLower = silk_FALSE; + } + } + + /* Determine whether current interpolated NLSFs are best so far */ + if( isInterpLower == silk_TRUE ) { + /* Interpolation has lower residual energy */ + res_nrg = res_nrg_interp; + res_nrg_Q = res_nrg_interp_Q; + psEncC->indices.NLSFInterpCoef_Q2 = (opus_int8)k; + } + } + } + + if( psEncC->indices.NLSFInterpCoef_Q2 == 4 ) { + /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ + silk_A2NLSF( NLSF_Q15, a_Q16, psEncC->predictLPCOrder ); + } + + celt_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/fixed/find_LTP_FIX.c b/src/libopus/silk/fixed/find_LTP_FIX.c new file mode 100644 index 00000000..70961b0b --- /dev/null +++ b/src/libopus/silk/fixed/find_LTP_FIX.c @@ -0,0 +1,99 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" +#include "tuning_parameters.h" + +void silk_find_LTP_FIX( + opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ + opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ + const opus_int16 r_ptr[], /* I Residual signal after LPC */ + const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +) +{ + opus_int i, k, extra_shifts; + opus_int xx_shifts, xX_shifts, XX_shifts; + const opus_int16 *lag_ptr; + opus_int32 *XXLTP_Q17_ptr, *xXLTP_Q17_ptr; + opus_int32 xx, nrg, temp; + + xXLTP_Q17_ptr = xXLTP_Q17; + XXLTP_Q17_ptr = XXLTP_Q17; + for( k = 0; k < nb_subfr; k++ ) { + lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); + + silk_sum_sqr_shift( &xx, &xx_shifts, r_ptr, subfr_length + LTP_ORDER ); /* xx in Q( -xx_shifts ) */ + silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, XXLTP_Q17_ptr, &nrg, &XX_shifts, arch ); /* XXLTP_Q17_ptr and nrg in Q( -XX_shifts ) */ + extra_shifts = xx_shifts - XX_shifts; + if( extra_shifts > 0 ) { + /* Shift XX */ + xX_shifts = xx_shifts; + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = silk_RSHIFT32( XXLTP_Q17_ptr[ i ], extra_shifts ); /* Q( -xX_shifts ) */ + } + nrg = silk_RSHIFT32( nrg, extra_shifts ); /* Q( -xX_shifts ) */ + } else if( extra_shifts < 0 ) { + /* Shift xx */ + xX_shifts = XX_shifts; + xx = silk_RSHIFT32( xx, -extra_shifts ); /* Q( -xX_shifts ) */ + } else { + xX_shifts = xx_shifts; + } + silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xXLTP_Q17_ptr, xX_shifts, arch ); /* xXLTP_Q17_ptr in Q( -xX_shifts ) */ + + /* At this point all correlations are in Q(-xX_shifts) */ + temp = silk_SMLAWB( 1, nrg, SILK_FIX_CONST( LTP_CORR_INV_MAX, 16 ) ); + temp = silk_max( temp, xx ); +TIC(div) +#if 0 + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( XXLTP_Q17_ptr[ i ], temp, 17 ); + } + for( i = 0; i < LTP_ORDER; i++ ) { + xXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( xXLTP_Q17_ptr[ i ], temp, 17 ); + } +#else + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)XXLTP_Q17_ptr[ i ], 17 ) / temp ); + } + for( i = 0; i < LTP_ORDER; i++ ) { + xXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)xXLTP_Q17_ptr[ i ], 17 ) / temp ); + } +#endif +TOC(div) + r_ptr += subfr_length; + XXLTP_Q17_ptr += LTP_ORDER * LTP_ORDER; + xXLTP_Q17_ptr += LTP_ORDER; + } +} diff --git a/src/libopus/silk/fixed/find_pred_coefs_FIX.c b/src/libopus/silk/fixed/find_pred_coefs_FIX.c new file mode 100644 index 00000000..8be54322 --- /dev/null +++ b/src/libopus/silk/fixed/find_pred_coefs_FIX.c @@ -0,0 +1,146 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" + +void silk_find_pred_coefs_FIX( + silk_encoder_state_FIX *psEnc, /* I/O encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + const opus_int16 res_pitch[], /* I Residual from pitch analysis */ + const opus_int16 x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + opus_int i; + opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ]; + /* Set to NLSF_Q15 to zero so we don't copy junk to the state. */ + opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]={0}; + const opus_int16 *x_ptr; + opus_int16 *x_pre_ptr; + VARDECL( opus_int16, LPC_in_pre ); + opus_int32 min_gain_Q16, minInvGain_Q30; + SAVE_STACK; + + /* weighting for weighted least squares */ + min_gain_Q16 = silk_int32_MAX >> 6; + for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + min_gain_Q16 = silk_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] ); + } + for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + /* Divide to Q16 */ + silk_assert( psEncCtrl->Gains_Q16[ i ] > 0 ); + /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ + invGains_Q16[ i ] = silk_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); + + /* Limit inverse */ + invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 100 ); + + /* Square the inverted gains */ + silk_assert( invGains_Q16[ i ] == silk_SAT16( invGains_Q16[ i ] ) ); + + /* Invert the inverted and normalized gains */ + local_gains[ i ] = silk_DIV32( ( (opus_int32)1 << 16 ), invGains_Q16[ i ] ); + } + + ALLOC( LPC_in_pre, + psEnc->sCmn.nb_subfr * psEnc->sCmn.predictLPCOrder + + psEnc->sCmn.frame_length, opus_int16 ); + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + VARDECL( opus_int32, xXLTP_Q17 ); + VARDECL( opus_int32, XXLTP_Q17 ); + + /**********/ + /* VOICED */ + /**********/ + celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + + ALLOC( xXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER, opus_int32 ); + ALLOC( XXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); + + /* LTP analysis */ + silk_find_LTP_FIX( XXLTP_Q17, xXLTP_Q17, res_pitch, + psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); + + /* Quantize LTP gain parameters */ + silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, + &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain_Q7, XXLTP_Q17, xXLTP_Q17, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); + + /* Control LTP scaling */ + silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); + + /* Create LTP residual */ + silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14, + psEncCtrl->pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); + + } else { + /************/ + /* UNVOICED */ + /************/ + /* Create signal with prepended subframes, scaled by inverse gains */ + x_ptr = x - psEnc->sCmn.predictLPCOrder; + x_pre_ptr = LPC_in_pre; + for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ], + psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); + x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; + x_ptr += psEnc->sCmn.subfr_length; + } + + silk_memset( psEncCtrl->LTPCoef_Q14, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( opus_int16 ) ); + psEncCtrl->LTPredCodGain_Q7 = 0; + psEnc->sCmn.sum_log_gain_Q7 = 0; + } + + /* Limit on total predictive coding gain */ + if( psEnc->sCmn.first_frame_after_reset ) { + minInvGain_Q30 = SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET, 30 ); + } else { + minInvGain_Q30 = silk_log2lin( silk_SMLAWB( 16 << 7, (opus_int32)psEncCtrl->LTPredCodGain_Q7, SILK_FIX_CONST( 1.0 / 3, 16 ) ) ); /* Q16 */ + minInvGain_Q30 = silk_DIV32_varQ( minInvGain_Q30, + silk_SMULWW( SILK_FIX_CONST( MAX_PREDICTION_POWER_GAIN, 0 ), + silk_SMLAWB( SILK_FIX_CONST( 0.25, 18 ), SILK_FIX_CONST( 0.75, 18 ), psEncCtrl->coding_quality_Q14 ) ), 14 ); + } + + /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ + silk_find_LPC_FIX( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain_Q30 ); + + /* Quantize LSFs */ + silk_process_NLSFs( &psEnc->sCmn, psEncCtrl->PredCoef_Q12, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); + + /* Calculate residual energy using quantized LPC coefficients */ + silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains, + psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.arch ); + + /* Copy to prediction struct for use in next frame for interpolation */ + silk_memcpy( psEnc->sCmn.prev_NLSFq_Q15, NLSF_Q15, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/fixed/k2a_FIX.c b/src/libopus/silk/fixed/k2a_FIX.c new file mode 100644 index 00000000..12708681 --- /dev/null +++ b/src/libopus/silk/fixed/k2a_FIX.c @@ -0,0 +1,54 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Step up function, converts reflection coefficients to prediction coefficients */ +void silk_k2a( + opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ + const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ + const opus_int32 order /* I Prediction order */ +) +{ + opus_int k, n; + opus_int32 rc, tmp1, tmp2; + + for( k = 0; k < order; k++ ) { + rc = rc_Q15[ k ]; + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = A_Q24[ n ]; + tmp2 = A_Q24[ k - n - 1 ]; + A_Q24[ n ] = silk_SMLAWB( tmp1, silk_LSHIFT( tmp2, 1 ), rc ); + A_Q24[ k - n - 1 ] = silk_SMLAWB( tmp2, silk_LSHIFT( tmp1, 1 ), rc ); + } + A_Q24[ k ] = -silk_LSHIFT( (opus_int32)rc_Q15[ k ], 9 ); + } +} diff --git a/src/libopus/silk/fixed/k2a_Q16_FIX.c b/src/libopus/silk/fixed/k2a_Q16_FIX.c new file mode 100644 index 00000000..dbb6f0e2 --- /dev/null +++ b/src/libopus/silk/fixed/k2a_Q16_FIX.c @@ -0,0 +1,54 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Step up function, converts reflection coefficients to prediction coefficients */ +void silk_k2a_Q16( + opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ + const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ + const opus_int32 order /* I Prediction order */ +) +{ + opus_int k, n; + opus_int32 rc, tmp1, tmp2; + + for( k = 0; k < order; k++ ) { + rc = rc_Q16[ k ]; + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = A_Q24[ n ]; + tmp2 = A_Q24[ k - n - 1 ]; + A_Q24[ n ] = silk_SMLAWW( tmp1, tmp2, rc ); + A_Q24[ k - n - 1 ] = silk_SMLAWW( tmp2, tmp1, rc ); + } + A_Q24[ k ] = -silk_LSHIFT( rc, 8 ); + } +} diff --git a/src/libopus/silk/fixed/main.h b/src/libopus/silk/fixed/main.h new file mode 100644 index 00000000..44f40ec3 --- /dev/null +++ b/src/libopus/silk/fixed/main.h @@ -0,0 +1 @@ +#include "../main.h" diff --git a/src/libopus/silk/fixed/main_FIX.h b/src/libopus/silk/fixed/main_FIX.h new file mode 100644 index 00000000..6d2112e5 --- /dev/null +++ b/src/libopus/silk/fixed/main_FIX.h @@ -0,0 +1,244 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_MAIN_FIX_H +#define SILK_MAIN_FIX_H + +#include "SigProc_FIX.h" +#include "structs_FIX.h" +#include "control.h" +#include "main.h" +#include "PLC.h" +#include "debug.h" +#include "entenc.h" + +#if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \ + || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "fixed/arm/warped_autocorrelation_FIX_arm.h" +#endif + +#ifndef FORCE_CPP_BUILD +#ifdef __cplusplus +extern "C" +{ +#endif +#endif + +#define silk_encoder_state_Fxx silk_encoder_state_FIX +#define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FIX +#define silk_encode_frame_Fxx silk_encode_frame_FIX + +#define QC 10 +#define QS 13 + +/*********************/ +/* Encoder Functions */ +/*********************/ + +/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ +void silk_HP_variable_cutoff( + silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ +); + +/* Encoder main function */ +void silk_encode_do_VAD_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ + opus_int activity /* I Decision of Opus voice activity detector */ +); + +/* Encoder main function */ +opus_int silk_encode_frame_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ + opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ + ec_enc *psRangeEnc, /* I/O compressor data structure */ + opus_int condCoding, /* I The type of conditional coding to use */ + opus_int maxBits, /* I If > 0: maximum number of output bits */ + opus_int useCBR /* I Flag to force constant-bitrate operation */ +); + +/* Initializes the Silk encoder state */ +opus_int silk_init_encoder( + silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk FIX encoder state */ + int arch /* I Run-time architecture */ +); + +/* Control the Silk encoder */ +opus_int silk_control_encoder( + silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ + silk_EncControlStruct *encControl, /* I Control structure */ + const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ + const opus_int channelNb, /* I Channel number */ + const opus_int force_fs_kHz +); + +/**************************/ +/* Noise shaping analysis */ +/**************************/ +/* Compute noise shaping coefficients and initial gain values */ +void silk_noise_shape_analysis_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ + silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ + const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ + const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ + int arch /* I Run-time architecture */ +); + +/* Autocorrelations for a warped frequency axis */ +void silk_warped_autocorrelation_FIX_c( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +); + +#if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) +#define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ + ((void)(arch), silk_warped_autocorrelation_FIX_c(corr, scale, input, warping_Q16, length, order)) +#endif + +/* Calculation of LTP state scaling */ +void silk_LTP_scale_ctrl_FIX( + silk_encoder_state_FIX *psEnc, /* I/O encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +/**********************************************/ +/* Prediction Analysis */ +/**********************************************/ +/* Find pitch lags */ +void silk_find_pitch_lags_FIX( + silk_encoder_state_FIX *psEnc, /* I/O encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + opus_int16 res[], /* O residual */ + const opus_int16 x[], /* I Speech signal */ + int arch /* I Run-time architecture */ +); + +/* Find LPC and LTP coefficients */ +void silk_find_pred_coefs_FIX( + silk_encoder_state_FIX *psEnc, /* I/O encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + const opus_int16 res_pitch[], /* I Residual from pitch analysis */ + const opus_int16 x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +/* LPC analysis */ +void silk_find_LPC_FIX( + silk_encoder_state *psEncC, /* I/O Encoder state */ + opus_int16 NLSF_Q15[], /* O NLSFs */ + const opus_int16 x[], /* I Input signal */ + const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ +); + +/* LTP analysis */ +void silk_find_LTP_FIX( + opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ + opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ + const opus_int16 r_lpc[], /* I Residual signal after LPC */ + const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +); + +void silk_LTP_analysis_filter_FIX( + opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ + const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ + const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ + const opus_int subfr_length, /* I Length of each subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ +); + +/* Calculates residual energies of input subframes where all subframes have LPC_order */ +/* of preceding samples */ +void silk_residual_energy_FIX( + opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ + opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ + const opus_int16 x[], /* I Input signal */ + opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ + const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ +); + +/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ +opus_int32 silk_residual_energy16_covar_FIX( + const opus_int16 *c, /* I Prediction vector */ + const opus_int32 *wXX, /* I Correlation matrix */ + const opus_int32 *wXx, /* I Correlation vector */ + opus_int32 wxx, /* I Signal energy */ + opus_int D, /* I Dimension */ + opus_int cQ /* I Q value for c vector 0 - 15 */ +); + +/* Processing of gains */ +void silk_process_gains_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +/******************/ +/* Linear Algebra */ +/******************/ +/* Calculates correlation matrix X'*X */ +void silk_corrMatrix_FIX( + const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ + const opus_int L, /* I Length of vectors */ + const opus_int order, /* I Max lag for correlation */ + opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ + opus_int32 *nrg, /* O Energy of x vector */ + opus_int *rshifts, /* O Right shifts of correlations */ + int arch /* I Run-time architecture */ +); + +/* Calculates correlation vector X'*t */ +void silk_corrVector_FIX( + const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ + const opus_int16 *t, /* I Target vector [L] */ + const opus_int L, /* I Length of vectors */ + const opus_int order, /* I Max lag for correlation */ + opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ + const opus_int rshifts, /* I Right shifts of correlations */ + int arch /* I Run-time architecture */ +); + +#ifndef FORCE_CPP_BUILD +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* FORCE_CPP_BUILD */ +#endif /* SILK_MAIN_FIX_H */ diff --git a/src/libopus/silk/fixed/pitch.h b/src/libopus/silk/fixed/pitch.h new file mode 100644 index 00000000..f2cf322e --- /dev/null +++ b/src/libopus/silk/fixed/pitch.h @@ -0,0 +1 @@ +#include "../../celt/pitch.h" diff --git a/src/libopus/silk/fixed/pitch_est_defines.h b/src/libopus/silk/fixed/pitch_est_defines.h new file mode 100644 index 00000000..77b7e3d7 --- /dev/null +++ b/src/libopus/silk/fixed/pitch_est_defines.h @@ -0,0 +1 @@ +#include "../pitch_est_defines.h" diff --git a/src/libopus/silk/fixed/process_gains_FIX.c b/src/libopus/silk/fixed/process_gains_FIX.c new file mode 100644 index 00000000..fb3a4fe0 --- /dev/null +++ b/src/libopus/silk/fixed/process_gains_FIX.c @@ -0,0 +1,117 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" +#include "tuning_parameters.h" + +/* Processing of gains */ +void silk_process_gains_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ + silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +) +{ + silk_shape_state_FIX *psShapeSt = &psEnc->sShape; + opus_int k; + opus_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart, quant_offset_Q10; + + /* Gain reduction when LTP coding gain is high */ + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + /*s = -0.5f * silk_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */ + s_Q16 = -silk_sigm_Q15( silk_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - SILK_FIX_CONST( 12.0, 7 ), 4 ) ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + psEncCtrl->Gains_Q16[ k ] = silk_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 ); + } + } + + /* Limit the quantized signal */ + /* InvMaxSqrVal = pow( 2.0f, 0.33f * ( 21.0f - SNR_dB ) ) / subfr_length; */ + InvMaxSqrVal_Q16 = silk_DIV32_16( silk_log2lin( + silk_SMULWB( SILK_FIX_CONST( 21 + 16 / 0.33, 7 ) - psEnc->sCmn.SNR_dB_Q7, SILK_FIX_CONST( 0.33, 16 ) ) ), psEnc->sCmn.subfr_length ); + + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + /* Soft limit on ratio residual energy and squared gains */ + ResNrg = psEncCtrl->ResNrg[ k ]; + ResNrgPart = silk_SMULWW( ResNrg, InvMaxSqrVal_Q16 ); + if( psEncCtrl->ResNrgQ[ k ] > 0 ) { + ResNrgPart = silk_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] ); + } else { + if( ResNrgPart >= silk_RSHIFT( silk_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) { + ResNrgPart = silk_int32_MAX; + } else { + ResNrgPart = silk_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] ); + } + } + gain = psEncCtrl->Gains_Q16[ k ]; + gain_squared = silk_ADD_SAT32( ResNrgPart, silk_SMMUL( gain, gain ) ); + if( gain_squared < silk_int16_MAX ) { + /* recalculate with higher precision */ + gain_squared = silk_SMLAWW( silk_LSHIFT( ResNrgPart, 16 ), gain, gain ); + silk_assert( gain_squared > 0 ); + gain = silk_SQRT_APPROX( gain_squared ); /* Q8 */ + gain = silk_min( gain, silk_int32_MAX >> 8 ); + psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 8 ); /* Q16 */ + } else { + gain = silk_SQRT_APPROX( gain_squared ); /* Q0 */ + gain = silk_min( gain, silk_int32_MAX >> 16 ); + psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 16 ); /* Q16 */ + } + } + + /* Save unquantized gains and gain Index */ + silk_memcpy( psEncCtrl->GainsUnq_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); + psEncCtrl->lastGainIndexPrev = psShapeSt->LastGainIndex; + + /* Quantize gains */ + silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, + &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); + + /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + if( psEncCtrl->LTPredCodGain_Q7 + silk_RSHIFT( psEnc->sCmn.input_tilt_Q15, 8 ) > SILK_FIX_CONST( 1.0, 7 ) ) { + psEnc->sCmn.indices.quantOffsetType = 0; + } else { + psEnc->sCmn.indices.quantOffsetType = 1; + } + } + + /* Quantizer boundary adjustment */ + quant_offset_Q10 = silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ]; + psEncCtrl->Lambda_Q10 = SILK_FIX_CONST( LAMBDA_OFFSET, 10 ) + + silk_SMULBB( SILK_FIX_CONST( LAMBDA_DELAYED_DECISIONS, 10 ), psEnc->sCmn.nStatesDelayedDecision ) + + silk_SMULWB( SILK_FIX_CONST( LAMBDA_SPEECH_ACT, 18 ), psEnc->sCmn.speech_activity_Q8 ) + + silk_SMULWB( SILK_FIX_CONST( LAMBDA_INPUT_QUALITY, 12 ), psEncCtrl->input_quality_Q14 ) + + silk_SMULWB( SILK_FIX_CONST( LAMBDA_CODING_QUALITY, 12 ), psEncCtrl->coding_quality_Q14 ) + + silk_SMULWB( SILK_FIX_CONST( LAMBDA_QUANT_OFFSET, 16 ), quant_offset_Q10 ); + + silk_assert( psEncCtrl->Lambda_Q10 > 0 ); + silk_assert( psEncCtrl->Lambda_Q10 < SILK_FIX_CONST( 2, 10 ) ); +} diff --git a/src/libopus/silk/fixed/regularize_correlations_FIX.c b/src/libopus/silk/fixed/regularize_correlations_FIX.c new file mode 100644 index 00000000..0d799ec9 --- /dev/null +++ b/src/libopus/silk/fixed/regularize_correlations_FIX.c @@ -0,0 +1,47 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" + +/* Add noise to matrix diagonal */ +void silk_regularize_correlations_FIX( + opus_int32 *XX, /* I/O Correlation matrices */ + opus_int32 *xx, /* I/O Correlation values */ + opus_int32 noise, /* I Noise to add */ + opus_int D /* I Dimension of XX */ +) +{ + opus_int i; + for( i = 0; i < D; i++ ) { + matrix_ptr( &XX[ 0 ], i, i, D ) = silk_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise ); + } + xx[ 0 ] += noise; +} diff --git a/src/libopus/silk/fixed/residual_energy16_FIX.c b/src/libopus/silk/fixed/residual_energy16_FIX.c new file mode 100644 index 00000000..57b876b2 --- /dev/null +++ b/src/libopus/silk/fixed/residual_energy16_FIX.c @@ -0,0 +1,103 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" + +/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ +opus_int32 silk_residual_energy16_covar_FIX( + const opus_int16 *c, /* I Prediction vector */ + const opus_int32 *wXX, /* I Correlation matrix */ + const opus_int32 *wXx, /* I Correlation vector */ + opus_int32 wxx, /* I Signal energy */ + opus_int D, /* I Dimension */ + opus_int cQ /* I Q value for c vector 0 - 15 */ +) +{ + opus_int i, j, lshifts, Qxtra; + opus_int32 c_max, w_max, tmp, tmp2, nrg; + opus_int cn[ MAX_MATRIX_SIZE ]; + const opus_int32 *pRow; + + /* Safety checks */ + celt_assert( D >= 0 ); + celt_assert( D <= 16 ); + celt_assert( cQ > 0 ); + celt_assert( cQ < 16 ); + + lshifts = 16 - cQ; + Qxtra = lshifts; + + c_max = 0; + for( i = 0; i < D; i++ ) { + c_max = silk_max_32( c_max, silk_abs( (opus_int32)c[ i ] ) ); + } + Qxtra = silk_min_int( Qxtra, silk_CLZ32( c_max ) - 17 ); + + w_max = silk_max_32( wXX[ 0 ], wXX[ D * D - 1 ] ); + Qxtra = silk_min_int( Qxtra, silk_CLZ32( silk_MUL( D, silk_RSHIFT( silk_SMULWB( w_max, c_max ), 4 ) ) ) - 5 ); + Qxtra = silk_max_int( Qxtra, 0 ); + for( i = 0; i < D; i++ ) { + cn[ i ] = silk_LSHIFT( ( opus_int )c[ i ], Qxtra ); + silk_assert( silk_abs(cn[i]) <= ( silk_int16_MAX + 1 ) ); /* Check that silk_SMLAWB can be used */ + } + lshifts -= Qxtra; + + /* Compute wxx - 2 * wXx * c */ + tmp = 0; + for( i = 0; i < D; i++ ) { + tmp = silk_SMLAWB( tmp, wXx[ i ], cn[ i ] ); + } + nrg = silk_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */ + + /* Add c' * wXX * c, assuming wXX is symmetric */ + tmp2 = 0; + for( i = 0; i < D; i++ ) { + tmp = 0; + pRow = &wXX[ i * D ]; + for( j = i + 1; j < D; j++ ) { + tmp = silk_SMLAWB( tmp, pRow[ j ], cn[ j ] ); + } + tmp = silk_SMLAWB( tmp, silk_RSHIFT( pRow[ i ], 1 ), cn[ i ] ); + tmp2 = silk_SMLAWB( tmp2, tmp, cn[ i ] ); + } + nrg = silk_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */ + + /* Keep one bit free always, because we add them for LSF interpolation */ + if( nrg < 1 ) { + nrg = 1; + } else if( nrg > silk_RSHIFT( silk_int32_MAX, lshifts + 2 ) ) { + nrg = silk_int32_MAX >> 1; + } else { + nrg = silk_LSHIFT( nrg, lshifts + 1 ); /* Q0 */ + } + return nrg; + +} diff --git a/src/libopus/silk/fixed/residual_energy_FIX.c b/src/libopus/silk/fixed/residual_energy_FIX.c new file mode 100644 index 00000000..14a5a314 --- /dev/null +++ b/src/libopus/silk/fixed/residual_energy_FIX.c @@ -0,0 +1,98 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" + +/* Calculates residual energies of input subframes where all subframes have LPC_order */ +/* of preceding samples */ +void silk_residual_energy_FIX( + opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ + opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ + const opus_int16 x[], /* I Input signal */ + opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ + const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ +) +{ + opus_int offset, i, j, rshift, lz1, lz2; + opus_int16 *LPC_res_ptr; + VARDECL( opus_int16, LPC_res ); + const opus_int16 *x_ptr; + opus_int32 tmp32; + SAVE_STACK; + + x_ptr = x; + offset = LPC_order + subfr_length; + + /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ + ALLOC( LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, opus_int16 ); + celt_assert( ( nb_subfr >> 1 ) * ( MAX_NB_SUBFR >> 1 ) == nb_subfr ); + for( i = 0; i < nb_subfr >> 1; i++ ) { + /* Calculate half frame LPC residual signal including preceding samples */ + silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order, arch ); + + /* Point to first subframe of the just calculated LPC residual signal */ + LPC_res_ptr = LPC_res + LPC_order; + for( j = 0; j < ( MAX_NB_SUBFR >> 1 ); j++ ) { + /* Measure subframe energy */ + silk_sum_sqr_shift( &nrgs[ i * ( MAX_NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length ); + + /* Set Q values for the measured energy */ + nrgsQ[ i * ( MAX_NB_SUBFR >> 1 ) + j ] = -rshift; + + /* Move to next subframe */ + LPC_res_ptr += offset; + } + /* Move to next frame half */ + x_ptr += ( MAX_NB_SUBFR >> 1 ) * offset; + } + + /* Apply the squared subframe gains */ + for( i = 0; i < nb_subfr; i++ ) { + /* Fully upscale gains and energies */ + lz1 = silk_CLZ32( nrgs[ i ] ) - 1; + lz2 = silk_CLZ32( gains[ i ] ) - 1; + + tmp32 = silk_LSHIFT32( gains[ i ], lz2 ); + + /* Find squared gains */ + tmp32 = silk_SMMUL( tmp32, tmp32 ); /* Q( 2 * lz2 - 32 )*/ + + /* Scale energies */ + nrgs[ i ] = silk_SMMUL( tmp32, silk_LSHIFT32( nrgs[ i ], lz1 ) ); /* Q( nrgsQ[ i ] + lz1 + 2 * lz2 - 32 - 32 )*/ + nrgsQ[ i ] += lz1 + 2 * lz2 - 32 - 32; + } + RESTORE_STACK; +} diff --git a/src/libopus/silk/fixed/schur64_FIX.c b/src/libopus/silk/fixed/schur64_FIX.c new file mode 100644 index 00000000..cc44dfa0 --- /dev/null +++ b/src/libopus/silk/fixed/schur64_FIX.c @@ -0,0 +1,93 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Slower than schur(), but more accurate. */ +/* Uses SMULL(), available on armv4 */ +opus_int32 silk_schur64( /* O returns residual energy */ + opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ + const opus_int32 c[], /* I Correlations [order+1] */ + opus_int32 order /* I Prediction order */ +) +{ + opus_int k, n; + opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; + opus_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31; + + celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); + + /* Check for invalid input */ + if( c[ 0 ] <= 0 ) { + silk_memset( rc_Q16, 0, order * sizeof( opus_int32 ) ); + return 0; + } + + k = 0; + do { + C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; + } while( ++k <= order ); + + for( k = 0; k < order; k++ ) { + /* Check that we won't be getting an unstable rc, otherwise stop here. */ + if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { + if ( C[ k + 1 ][ 0 ] > 0 ) { + rc_Q16[ k ] = -SILK_FIX_CONST( .99f, 16 ); + } else { + rc_Q16[ k ] = SILK_FIX_CONST( .99f, 16 ); + } + k++; + break; + } + + /* Get reflection coefficient: divide two Q30 values and get result in Q31 */ + rc_tmp_Q31 = silk_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 ); + + /* Save the output */ + rc_Q16[ k ] = silk_RSHIFT_ROUND( rc_tmp_Q31, 15 ); + + /* Update correlations */ + for( n = 0; n < order - k; n++ ) { + Ctmp1_Q30 = C[ n + k + 1 ][ 0 ]; + Ctmp2_Q30 = C[ n ][ 1 ]; + + /* Multiply and add the highest int32 */ + C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 ); + C[ n ][ 1 ] = Ctmp2_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 ); + } + } + + for(; k < order; k++ ) { + rc_Q16[ k ] = 0; + } + + return silk_max_32( 1, C[ 0 ][ 1 ] ); +} diff --git a/src/libopus/silk/fixed/schur_FIX.c b/src/libopus/silk/fixed/schur_FIX.c new file mode 100644 index 00000000..6278c6a9 --- /dev/null +++ b/src/libopus/silk/fixed/schur_FIX.c @@ -0,0 +1,107 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Faster than schur64(), but much less accurate. */ +/* uses SMLAWB(), requiring armv5E and higher. */ +opus_int32 silk_schur( /* O Returns residual energy */ + opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ + const opus_int32 *c, /* I correlations [order+1] */ + const opus_int32 order /* I prediction order */ +) +{ + opus_int k, n, lz; + opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; + opus_int32 Ctmp1, Ctmp2, rc_tmp_Q15; + + celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); + + /* Get number of leading zeros */ + lz = silk_CLZ32( c[ 0 ] ); + + /* Copy correlations and adjust level to Q30 */ + k = 0; + if( lz < 2 ) { + /* lz must be 1, so shift one to the right */ + do { + C[ k ][ 0 ] = C[ k ][ 1 ] = silk_RSHIFT( c[ k ], 1 ); + } while( ++k <= order ); + } else if( lz > 2 ) { + /* Shift to the left */ + lz -= 2; + do { + C[ k ][ 0 ] = C[ k ][ 1 ] = silk_LSHIFT( c[ k ], lz ); + } while( ++k <= order ); + } else { + /* No need to shift */ + do { + C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; + } while( ++k <= order ); + } + + for( k = 0; k < order; k++ ) { + /* Check that we won't be getting an unstable rc, otherwise stop here. */ + if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { + if ( C[ k + 1 ][ 0 ] > 0 ) { + rc_Q15[ k ] = -SILK_FIX_CONST( .99f, 15 ); + } else { + rc_Q15[ k ] = SILK_FIX_CONST( .99f, 15 ); + } + k++; + break; + } + + /* Get reflection coefficient */ + rc_tmp_Q15 = -silk_DIV32_16( C[ k + 1 ][ 0 ], silk_max_32( silk_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) ); + + /* Clip (shouldn't happen for properly conditioned inputs) */ + rc_tmp_Q15 = silk_SAT16( rc_tmp_Q15 ); + + /* Store */ + rc_Q15[ k ] = (opus_int16)rc_tmp_Q15; + + /* Update correlations */ + for( n = 0; n < order - k; n++ ) { + Ctmp1 = C[ n + k + 1 ][ 0 ]; + Ctmp2 = C[ n ][ 1 ]; + C[ n + k + 1 ][ 0 ] = silk_SMLAWB( Ctmp1, silk_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 ); + C[ n ][ 1 ] = silk_SMLAWB( Ctmp2, silk_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 ); + } + } + + for(; k < order; k++ ) { + rc_Q15[ k ] = 0; + } + + /* return residual energy */ + return silk_max_32( 1, C[ 0 ][ 1 ] ); +} diff --git a/src/libopus/silk/fixed/stack_alloc.h b/src/libopus/silk/fixed/stack_alloc.h new file mode 100644 index 00000000..7b53013e --- /dev/null +++ b/src/libopus/silk/fixed/stack_alloc.h @@ -0,0 +1 @@ +#include "../../celt/stack_alloc.h" diff --git a/src/libopus/silk/fixed/structs.h b/src/libopus/silk/fixed/structs.h new file mode 100644 index 00000000..e564d5dc --- /dev/null +++ b/src/libopus/silk/fixed/structs.h @@ -0,0 +1 @@ +#include "../structs.h" diff --git a/src/libopus/silk/fixed/structs_FIX.h b/src/libopus/silk/fixed/structs_FIX.h new file mode 100644 index 00000000..2774a97b --- /dev/null +++ b/src/libopus/silk/fixed/structs_FIX.h @@ -0,0 +1,116 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_STRUCTS_FIX_H +#define SILK_STRUCTS_FIX_H + +#include "typedef.h" +#include "main.h" +#include "structs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************/ +/* Noise shaping analysis state */ +/********************************/ +typedef struct { + opus_int8 LastGainIndex; + opus_int32 HarmBoost_smth_Q16; + opus_int32 HarmShapeGain_smth_Q16; + opus_int32 Tilt_smth_Q16; +} silk_shape_state_FIX; + +/********************************/ +/* Encoder state FIX */ +/********************************/ +typedef struct { + silk_encoder_state sCmn; /* Common struct, shared with floating-point code */ + silk_shape_state_FIX sShape; /* Shape state */ + + /* Buffer for find pitch and noise shape analysis */ + silk_DWORD_ALIGN opus_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ + opus_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */ + opus_int32 resNrgSmth; +} silk_encoder_state_FIX; + +/************************/ +/* Encoder control FIX */ +/************************/ +typedef struct { + /* Prediction and coding parameters */ + opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; + silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; + opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; + opus_int LTP_scale_Q14; + opus_int pitchL[ MAX_NB_SUBFR ]; + + /* Noise shaping parameters */ + /* Testing */ + silk_DWORD_ALIGN opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ + opus_int Tilt_Q14[ MAX_NB_SUBFR ]; + opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; + opus_int Lambda_Q10; + opus_int input_quality_Q14; + opus_int coding_quality_Q14; + + /* measures */ + opus_int32 predGain_Q16; + opus_int LTPredCodGain_Q7; + opus_int32 ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ + opus_int ResNrgQ[ MAX_NB_SUBFR ]; /* Q domain for the residual energy > 0 */ + + /* Parameters for CBR mode */ + opus_int32 GainsUnq_Q16[ MAX_NB_SUBFR ]; + opus_int8 lastGainIndexPrev; +} silk_encoder_control_FIX; + +/************************/ +/* Encoder Super Struct */ +/************************/ +typedef struct { + silk_encoder_state_FIX state_Fxx[ ENCODER_NUM_CHANNELS ]; + stereo_enc_state sStereo; + opus_int32 nBitsUsedLBRR; + opus_int32 nBitsExceeded; + opus_int nChannelsAPI; + opus_int nChannelsInternal; + opus_int nPrevChannelsInternal; + opus_int timeSinceSwitchAllowed_ms; + opus_int allowBandwidthSwitch; + opus_int prev_decode_only_middle; +} silk_encoder; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/fixed/tuning_parameters.h b/src/libopus/silk/fixed/tuning_parameters.h new file mode 100644 index 00000000..b2cb6386 --- /dev/null +++ b/src/libopus/silk/fixed/tuning_parameters.h @@ -0,0 +1 @@ +#include "../tuning_parameters.h" diff --git a/src/libopus/silk/fixed/typedef.h b/src/libopus/silk/fixed/typedef.h new file mode 100644 index 00000000..95a45fd8 --- /dev/null +++ b/src/libopus/silk/fixed/typedef.h @@ -0,0 +1 @@ +#include "../typedef.h" diff --git a/src/libopus/silk/fixed/vector_ops_FIX.c b/src/libopus/silk/fixed/vector_ops_FIX.c new file mode 100644 index 00000000..dee22257 --- /dev/null +++ b/src/libopus/silk/fixed/vector_ops_FIX.c @@ -0,0 +1,102 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "pitch.h" + +/* Copy and multiply a vector by a constant */ +void silk_scale_copy_vector16( + opus_int16 *data_out, + const opus_int16 *data_in, + opus_int32 gain_Q16, /* I Gain in Q16 */ + const opus_int dataSize /* I Length */ +) +{ + opus_int i; + opus_int32 tmp32; + + for( i = 0; i < dataSize; i++ ) { + tmp32 = silk_SMULWB( gain_Q16, data_in[ i ] ); + data_out[ i ] = (opus_int16)silk_CHECK_FIT16( tmp32 ); + } +} + +/* Multiply a vector by a constant */ +void silk_scale_vector32_Q26_lshift_18( + opus_int32 *data1, /* I/O Q0/Q18 */ + opus_int32 gain_Q26, /* I Q26 */ + opus_int dataSize /* I length */ +) +{ + opus_int i; + + for( i = 0; i < dataSize; i++ ) { + data1[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( silk_SMULL( data1[ i ], gain_Q26 ), 8 ) ); /* OUTPUT: Q18 */ + } +} + +/* sum = for(i=0;i6, memory access can be reduced by half. */ +opus_int32 silk_inner_prod_aligned( + const opus_int16 *const inVec1, /* I input vector 1 */ + const opus_int16 *const inVec2, /* I input vector 2 */ + const opus_int len, /* I vector lengths */ + int arch /* I Run-time architecture */ +) +{ +#ifdef FIXED_POINT + return celt_inner_prod(inVec1, inVec2, len, arch); +#else + opus_int i; + opus_int32 sum = 0; + for( i = 0; i < len; i++ ) { + sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); + } + return sum; +#endif +} + +opus_int64 silk_inner_prod16_c( + const opus_int16 *inVec1, /* I input vector 1 */ + const opus_int16 *inVec2, /* I input vector 2 */ + const opus_int len /* I vector lengths */ +) +{ + opus_int i; + opus_int64 sum = 0; + for( i = 0; i < len; i++ ) { + sum = silk_SMLALBB( sum, inVec1[ i ], inVec2[ i ] ); + } + return sum; +} diff --git a/src/libopus/silk/fixed/warped_autocorrelation_FIX.c b/src/libopus/silk/fixed/warped_autocorrelation_FIX.c new file mode 100644 index 00000000..473e28eb --- /dev/null +++ b/src/libopus/silk/fixed/warped_autocorrelation_FIX.c @@ -0,0 +1,92 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main_FIX.h" + +#if defined(MIPSr1_ASM) +#include "mips/warped_autocorrelation_FIX_mipsr1.h" +#endif + + +/* Autocorrelations for a warped frequency axis */ +#ifndef OVERRIDE_silk_warped_autocorrelation_FIX_c +void silk_warped_autocorrelation_FIX_c( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +) +{ + opus_int n, i, lsh; + opus_int32 tmp1_QS, tmp2_QS; + opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + + /* Order must be even */ + celt_assert( ( order & 1 ) == 0 ); + silk_assert( 2 * QS - QC >= 0 ); + + /* Loop over samples */ + for( n = 0; n < length; n++ ) { + tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); + /* Loop over allpass sections */ + for( i = 0; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); + state_QS[ i ] = tmp1_QS; + corr_QC[ i ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); + /* Output of allpass section */ + tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); + state_QS[ i + 1 ] = tmp2_QS; + corr_QC[ i + 1 ] += silk_RSHIFT64( silk_SMULL( tmp2_QS, state_QS[ 0 ] ), 2 * QS - QC ); + } + state_QS[ order ] = tmp1_QS; + corr_QC[ order ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); + } + + lsh = silk_CLZ64( corr_QC[ 0 ] ) - 35; + lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); + *scale = -( QC + lsh ); + silk_assert( *scale >= -30 && *scale <= 12 ); + if( lsh >= 0 ) { + for( i = 0; i < order + 1; i++ ) { + corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QC[ i ], lsh ) ); + } + } else { + for( i = 0; i < order + 1; i++ ) { + corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QC[ i ], -lsh ) ); + } + } + silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ +} +#endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */ diff --git a/src/libopus/silk/gain_quant.c b/src/libopus/silk/gain_quant.c new file mode 100644 index 00000000..45842bdb --- /dev/null +++ b/src/libopus/silk/gain_quant.c @@ -0,0 +1,142 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +#define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 ) +#define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) +#define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) ) + +/* Gain scalar quantization with hysteresis, uniform on log scale */ +void silk_gains_quant( + opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ + opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ + opus_int8 *prev_ind, /* I/O last index in previous frame */ + const opus_int conditional, /* I first gain is delta coded if 1 */ + const opus_int nb_subfr /* I number of subframes */ +) +{ + opus_int k, double_step_size_threshold; + + for( k = 0; k < nb_subfr; k++ ) { + /* Convert to log scale, scale, floor() */ + ind[ k ] = silk_SMULWB( SCALE_Q16, silk_lin2log( gain_Q16[ k ] ) - OFFSET ); + + /* Round towards previous quantized gain (hysteresis) */ + if( ind[ k ] < *prev_ind ) { + ind[ k ]++; + } + ind[ k ] = silk_LIMIT_int( ind[ k ], 0, N_LEVELS_QGAIN - 1 ); + + /* Compute delta indices and limit */ + if( k == 0 && conditional == 0 ) { + /* Full index */ + ind[ k ] = silk_LIMIT_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT, N_LEVELS_QGAIN - 1 ); + *prev_ind = ind[ k ]; + } else { + /* Delta index */ + ind[ k ] = ind[ k ] - *prev_ind; + + /* Double the quantization step size for large gain increases, so that the max gain level can be reached */ + double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; + if( ind[ k ] > double_step_size_threshold ) { + ind[ k ] = double_step_size_threshold + silk_RSHIFT( ind[ k ] - double_step_size_threshold + 1, 1 ); + } + + ind[ k ] = silk_LIMIT_int( ind[ k ], MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT ); + + /* Accumulate deltas */ + if( ind[ k ] > double_step_size_threshold ) { + *prev_ind += silk_LSHIFT( ind[ k ], 1 ) - double_step_size_threshold; + *prev_ind = silk_min_int( *prev_ind, N_LEVELS_QGAIN - 1 ); + } else { + *prev_ind += ind[ k ]; + } + + /* Shift to make non-negative */ + ind[ k ] -= MIN_DELTA_GAIN_QUANT; + } + + /* Scale and convert to linear scale */ + gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ + } +} + +/* Gains scalar dequantization, uniform on log scale */ +void silk_gains_dequant( + opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ + const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ + opus_int8 *prev_ind, /* I/O last index in previous frame */ + const opus_int conditional, /* I first gain is delta coded if 1 */ + const opus_int nb_subfr /* I number of subframes */ +) +{ + opus_int k, ind_tmp, double_step_size_threshold; + + for( k = 0; k < nb_subfr; k++ ) { + if( k == 0 && conditional == 0 ) { + /* Gain index is not allowed to go down more than 16 steps (~21.8 dB) */ + *prev_ind = silk_max_int( ind[ k ], *prev_ind - 16 ); + } else { + /* Delta index */ + ind_tmp = ind[ k ] + MIN_DELTA_GAIN_QUANT; + + /* Accumulate deltas */ + double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; + if( ind_tmp > double_step_size_threshold ) { + *prev_ind += silk_LSHIFT( ind_tmp, 1 ) - double_step_size_threshold; + } else { + *prev_ind += ind_tmp; + } + } + *prev_ind = silk_LIMIT_int( *prev_ind, 0, N_LEVELS_QGAIN - 1 ); + + /* Scale and convert to linear scale */ + gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ + } +} + +/* Compute unique identifier of gain indices vector */ +opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ + const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ + const opus_int nb_subfr /* I number of subframes */ +) +{ + opus_int k; + opus_int32 gainsID; + + gainsID = 0; + for( k = 0; k < nb_subfr; k++ ) { + gainsID = silk_ADD_LSHIFT32( ind[ k ], gainsID, 8 ); + } + + return gainsID; +} diff --git a/src/libopus/silk/init_decoder.c b/src/libopus/silk/init_decoder.c new file mode 100644 index 00000000..21c8d014 --- /dev/null +++ b/src/libopus/silk/init_decoder.c @@ -0,0 +1,84 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +#ifdef ENABLE_OSCE +#include "osce.h" +#endif + +#include "structs.h" + +/************************/ +/* Reset Decoder State */ +/************************/ +opus_int silk_reset_decoder( + silk_decoder_state *psDec /* I/O Decoder state pointer */ +) +{ + /* Clear the entire encoder state, except anything copied */ + silk_memset( &psDec->SILK_DECODER_STATE_RESET_START, 0, sizeof( silk_decoder_state ) - ((char*) &psDec->SILK_DECODER_STATE_RESET_START - (char*)psDec) ); + + /* Used to deactivate LSF interpolation */ + psDec->first_frame_after_reset = 1; + psDec->prev_gain_Q16 = 65536; + psDec->arch = opus_select_arch(); + + /* Reset CNG state */ + silk_CNG_Reset( psDec ); + + /* Reset PLC state */ + silk_PLC_Reset( psDec ); + +#ifdef ENABLE_OSCE + /* Reset OSCE state and method */ + osce_reset(&psDec->osce, OSCE_DEFAULT_METHOD); +#endif + + return 0; +} + + +/************************/ +/* Init Decoder State */ +/************************/ +opus_int silk_init_decoder( + silk_decoder_state *psDec /* I/O Decoder state pointer */ +) +{ + /* Clear the entire encoder state, except anything copied */ + silk_memset( psDec, 0, sizeof( silk_decoder_state ) ); + + silk_reset_decoder( psDec ); + + return(0); +} + diff --git a/src/libopus/silk/inner_prod_aligned.c b/src/libopus/silk/inner_prod_aligned.c new file mode 100644 index 00000000..69eee899 --- /dev/null +++ b/src/libopus/silk/inner_prod_aligned.c @@ -0,0 +1,47 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +opus_int32 silk_inner_prod_aligned_scale( + const opus_int16 *const inVec1, /* I input vector 1 */ + const opus_int16 *const inVec2, /* I input vector 2 */ + const opus_int scale, /* I number of bits to shift */ + const opus_int len /* I vector lengths */ +) +{ + opus_int i; + opus_int32 sum = 0; + for( i = 0; i < len; i++ ) { + sum = silk_ADD_RSHIFT32( sum, silk_SMULBB( inVec1[ i ], inVec2[ i ] ), scale ); + } + return sum; +} diff --git a/src/libopus/silk/interpolate.c b/src/libopus/silk/interpolate.c new file mode 100644 index 00000000..b2856f87 --- /dev/null +++ b/src/libopus/silk/interpolate.c @@ -0,0 +1,51 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Interpolate two vectors */ +void silk_interpolate( + opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ + const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ + const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ + const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ + const opus_int d /* I number of parameters */ +) +{ + opus_int i; + + celt_assert( ifact_Q2 >= 0 ); + celt_assert( ifact_Q2 <= 4 ); + + for( i = 0; i < d; i++ ) { + xi[ i ] = (opus_int16)silk_ADD_RSHIFT( x0[ i ], silk_SMULBB( x1[ i ] - x0[ i ], ifact_Q2 ), 2 ); + } +} diff --git a/src/libopus/silk/lin2log.c b/src/libopus/silk/lin2log.c new file mode 100644 index 00000000..0826ccd1 --- /dev/null +++ b/src/libopus/silk/lin2log.c @@ -0,0 +1,46 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +/* Approximation of 128 * log2() (very close inverse of silk_log2lin()) */ +/* Convert input to a log scale */ +opus_int32 silk_lin2log( + const opus_int32 inLin /* I input in linear scale */ +) +{ + opus_int32 lz, frac_Q7; + + silk_CLZ_FRAC( inLin, &lz, &frac_Q7 ); + + /* Piece-wise parabolic approximation */ + return silk_ADD_LSHIFT32( silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ), 31 - lz, 7 ); +} + diff --git a/src/libopus/silk/log2lin.c b/src/libopus/silk/log2lin.c new file mode 100644 index 00000000..860c3dcd --- /dev/null +++ b/src/libopus/silk/log2lin.c @@ -0,0 +1,58 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Approximation of 2^() (very close inverse of silk_lin2log()) */ +/* Convert input to a linear scale */ +opus_int32 silk_log2lin( + const opus_int32 inLog_Q7 /* I input on log scale */ +) +{ + opus_int32 out, frac_Q7; + + if( inLog_Q7 < 0 ) { + return 0; + } else if ( inLog_Q7 >= 3967 ) { + return silk_int32_MAX; + } + + out = silk_LSHIFT( 1, silk_RSHIFT( inLog_Q7, 7 ) ); + frac_Q7 = inLog_Q7 & 0x7F; + if( inLog_Q7 < 2048 ) { + /* Piece-wise parabolic approximation */ + out = silk_ADD_RSHIFT32( out, silk_MUL( out, silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 ); + } else { + /* Piece-wise parabolic approximation */ + out = silk_MLA( out, silk_RSHIFT( out, 7 ), silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ); + } + return out; +} diff --git a/src/libopus/silk/macros.h b/src/libopus/silk/macros.h new file mode 100644 index 00000000..d5ac4091 --- /dev/null +++ b/src/libopus/silk/macros.h @@ -0,0 +1,151 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_MACROS_H +#define SILK_MACROS_H + +#ifdef __STDC__ +#include "config.h" +#endif + +#include "opus_types.h" +#include "opus_defines.h" +#include "arch.h" + +/* This is an OPUS_INLINE header file for general platform. */ + +/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ +#if OPUS_FAST_INT64 +#define silk_SMULWB(a32, b32) ((opus_int32)(((a32) * (opus_int64)((opus_int16)(b32))) >> 16)) +#else +#define silk_SMULWB(a32, b32) ((((a32) >> 16) * (opus_int32)((opus_int16)(b32))) + ((((a32) & 0x0000FFFF) * (opus_int32)((opus_int16)(b32))) >> 16)) +#endif + +/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ +#if OPUS_FAST_INT64 +#define silk_SMLAWB(a32, b32, c32) ((opus_int32)((a32) + (((b32) * (opus_int64)((opus_int16)(c32))) >> 16))) +#else +#define silk_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))) +#endif + +/* (a32 * (b32 >> 16)) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMULWT(a32, b32) ((opus_int32)(((a32) * (opus_int64)((b32) >> 16)) >> 16)) +#else +#define silk_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16)) +#endif + +/* a32 + (b32 * (c32 >> 16)) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMLAWT(a32, b32, c32) ((opus_int32)((a32) + (((b32) * ((opus_int64)(c32) >> 16)) >> 16))) +#else +#define silk_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16)) +#endif + +/* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */ +#define silk_SMULBB(a32, b32) ((opus_int32)((opus_int16)(a32)) * (opus_int32)((opus_int16)(b32))) + +/* a32 + (opus_int32)((opus_int16)(b32)) * (opus_int32)((opus_int16)(c32)) output have to be 32bit int */ +#define silk_SMLABB(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))) + +/* (opus_int32)((opus_int16)(a32)) * (b32 >> 16) */ +#define silk_SMULBT(a32, b32) ((opus_int32)((opus_int16)(a32)) * ((b32) >> 16)) + +/* a32 + (opus_int32)((opus_int16)(b32)) * (c32 >> 16) */ +#define silk_SMLABT(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * ((c32) >> 16)) + +/* a64 + (b32 * c32) */ +#define silk_SMLAL(a64, b32, c32) (silk_ADD64((a64), ((opus_int64)(b32) * (opus_int64)(c32)))) + +/* (a32 * b32) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMULWW(a32, b32) ((opus_int32)(((opus_int64)(a32) * (b32)) >> 16)) +#else +#define silk_SMULWW(a32, b32) silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)) +#endif + +/* a32 + ((b32 * c32) >> 16) */ +#if OPUS_FAST_INT64 +#define silk_SMLAWW(a32, b32, c32) ((opus_int32)((a32) + (((opus_int64)(b32) * (c32)) >> 16))) +#else +#define silk_SMLAWW(a32, b32, c32) silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)) +#endif + +/* add/subtract with output saturated */ +#define silk_ADD_SAT32(a, b) ((((opus_uint32)(a) + (opus_uint32)(b)) & 0x80000000) == 0 ? \ + ((((a) & (b)) & 0x80000000) != 0 ? silk_int32_MIN : (a)+(b)) : \ + ((((a) | (b)) & 0x80000000) == 0 ? silk_int32_MAX : (a)+(b)) ) + +#define silk_SUB_SAT32(a, b) ((((opus_uint32)(a)-(opus_uint32)(b)) & 0x80000000) == 0 ? \ + (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) : \ + ((((a)^0x80000000) & (b) & 0x80000000) ? silk_int32_MAX : (a)-(b)) ) + +#if defined(MIPSr1_ASM) +#include "mips/macros_mipsr1.h" +#endif + +#include "ecintrin.h" +#ifndef OVERRIDE_silk_CLZ16 +static OPUS_INLINE opus_int32 silk_CLZ16(opus_int16 in16) +{ + return 32 - EC_ILOG(in16<<16|0x8000); +} +#endif + +#ifndef OVERRIDE_silk_CLZ32 +static OPUS_INLINE opus_int32 silk_CLZ32(opus_int32 in32) +{ + return in32 ? 32 - EC_ILOG(in32) : 32; +} +#endif + +/* Row based */ +#define matrix_ptr(Matrix_base_adr, row, column, N) \ + (*((Matrix_base_adr) + ((row)*(N)+(column)))) +#define matrix_adr(Matrix_base_adr, row, column, N) \ + ((Matrix_base_adr) + ((row)*(N)+(column))) + +/* Column based */ +#ifndef matrix_c_ptr +# define matrix_c_ptr(Matrix_base_adr, row, column, M) \ + (*((Matrix_base_adr) + ((row)+(M)*(column)))) +#endif + +#ifdef OPUS_ARM_INLINE_ASM +#include "arm/macros_armv4.h" +#endif + +#ifdef OPUS_ARM_INLINE_EDSP +#include "arm/macros_armv5e.h" +#endif + +#ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR +#include "arm/macros_arm64.h" +#endif + +#endif /* SILK_MACROS_H */ + diff --git a/src/libopus/silk/main.h b/src/libopus/silk/main.h new file mode 100644 index 00000000..cd576d8c --- /dev/null +++ b/src/libopus/silk/main.h @@ -0,0 +1,486 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_MAIN_H +#define SILK_MAIN_H + +#include "SigProc_FIX.h" +#include "define.h" +#include "structs.h" +#include "tables.h" +#include "PLC.h" +#include "control.h" +#include "debug.h" +#include "entenc.h" +#include "entdec.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/main_sse.h" +#endif + +#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/NSQ_del_dec_arm.h" +#endif + +/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ +void silk_stereo_LR_to_MS( + stereo_enc_state *state, /* I/O State */ + opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ + opus_int16 x2[], /* I/O Right input signal, becomes side signal */ + opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ + opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ + opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ + opus_int32 total_rate_bps, /* I Total bitrate */ + opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ + opus_int toMono, /* I Last frame before a stereo->mono transition */ + opus_int fs_kHz, /* I Sample rate (kHz) */ + opus_int frame_length /* I Number of samples */ +); + +/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ +void silk_stereo_MS_to_LR( + stereo_dec_state *state, /* I/O State */ + opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ + opus_int16 x2[], /* I/O Right input signal, becomes side signal */ + const opus_int32 pred_Q13[], /* I Predictors */ + opus_int fs_kHz, /* I Samples rate (kHz) */ + opus_int frame_length /* I Number of samples */ +); + +/* Find least-squares prediction gain for one signal based on another and quantize it */ +opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ + opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ + const opus_int16 x[], /* I Basis signal */ + const opus_int16 y[], /* I Target signal */ + opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ + opus_int length, /* I Number of samples */ + opus_int smooth_coef_Q16 /* I Smoothing coefficient */ +); + +/* Quantize mid/side predictors */ +void silk_stereo_quant_pred( + opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ + opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ +); + +/* Entropy code the mid/side quantization indices */ +void silk_stereo_encode_pred( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ +); + +/* Entropy code the mid-only flag */ +void silk_stereo_encode_mid_only( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int8 mid_only_flag +); + +/* Decode mid/side predictors */ +void silk_stereo_decode_pred( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int32 pred_Q13[] /* O Predictors */ +); + +/* Decode mid-only flag */ +void silk_stereo_decode_mid_only( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ +); + +/* Encodes signs of excitation */ +void silk_encode_signs( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + const opus_int8 pulses[], /* I pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ +); + +/* Decodes signs of excitation */ +void silk_decode_signs( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* I/O pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ +); + +/* Check encoder control struct */ +opus_int check_control_input( + silk_EncControlStruct *encControl /* I Control structure */ +); + +/* Control internal sampling rate */ +opus_int silk_control_audio_bandwidth( + silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + silk_EncControlStruct *encControl /* I Control structure */ +); + +/* Control SNR of redidual quantizer */ +opus_int silk_control_SNR( + silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ +); + +/***************/ +/* Shell coder */ +/***************/ + +/* Encode quantization indices of excitation */ +void silk_encode_pulses( + ec_enc *psRangeEnc, /* I/O compressor data structure */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I quantOffsetType */ + opus_int8 pulses[], /* I quantization indices */ + const opus_int frame_length /* I Frame length */ +); + +/* Shell encoder, operates on one shell code frame of 16 pulses */ +void silk_shell_encoder( + ec_enc *psRangeEnc, /* I/O compressor data structure */ + const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ +); + +/* Shell decoder, operates on one shell code frame of 16 pulses */ +void silk_shell_decoder( + opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + const opus_int pulses4 /* I number of pulses per pulse-subframe */ +); + +/* Gain scalar quantization with hysteresis, uniform on log scale */ +void silk_gains_quant( + opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ + opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ + opus_int8 *prev_ind, /* I/O last index in previous frame */ + const opus_int conditional, /* I first gain is delta coded if 1 */ + const opus_int nb_subfr /* I number of subframes */ +); + +/* Gains scalar dequantization, uniform on log scale */ +void silk_gains_dequant( + opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ + const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ + opus_int8 *prev_ind, /* I/O last index in previous frame */ + const opus_int conditional, /* I first gain is delta coded if 1 */ + const opus_int nb_subfr /* I number of subframes */ +); + +/* Compute unique identifier of gain indices vector */ +opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ + const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ + const opus_int nb_subfr /* I number of subframes */ +); + +/* Interpolate two vectors */ +void silk_interpolate( + opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ + const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ + const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ + const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ + const opus_int d /* I number of parameters */ +); + +/* LTP tap quantizer */ +void silk_quant_LTP_gains( + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ + opus_int8 *periodicity_index, /* O Periodicity Index */ + opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ + opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ + const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ + const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +); + +/* Entropy constrained matrix-weighted VQ, for a single input data vector */ +void silk_VQ_WMat_EC_c( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *res_nrg_Q15, /* O best residual energy */ + opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int32 *XX_Q17, /* I correlation matrix */ + const opus_int32 *xX_Q17, /* I correlation vector */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + const opus_int L /* I number of vectors in codebook */ +); + +#if !defined(OVERRIDE_silk_VQ_WMat_EC) +#define silk_VQ_WMat_EC(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L, arch) \ + ((void)(arch),silk_VQ_WMat_EC_c(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L)) +#endif + +/************************************/ +/* Noise shaping quantization (NSQ) */ +/************************************/ + +void silk_NSQ_c( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int16 x16[], /* I Input */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 *PredCoef_Q12, /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +#if !defined(OVERRIDE_silk_NSQ) +#define silk_NSQ(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) +#endif + +/* Noise shaping using delayed decision */ +void silk_NSQ_del_dec_c( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int16 x16[], /* I Input */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 *PredCoef_Q12, /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +#if !defined(OVERRIDE_silk_NSQ_del_dec) +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) +#endif + +/************/ +/* Silk VAD */ +/************/ +/* Initialize the Silk VAD */ +opus_int silk_VAD_Init( /* O Return value, 0 if success */ + silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ +); + +/* Get speech activity level in Q8 */ +opus_int silk_VAD_GetSA_Q8_c( /* O Return value, 0 if success */ + silk_encoder_state *psEncC, /* I/O Encoder state */ + const opus_int16 pIn[] /* I PCM input */ +); + +#if !defined(OVERRIDE_silk_VAD_GetSA_Q8) +#define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_c(psEnC, pIn)) +#endif + +/* Low-pass filter with variable cutoff frequency based on */ +/* piece-wise linear interpolation between elliptic filters */ +/* Start by setting transition_frame_no = 1; */ +void silk_LP_variable_cutoff( + silk_LP_state *psLP, /* I/O LP filter state */ + opus_int16 *frame, /* I/O Low-pass filtered output signal */ + const opus_int frame_length /* I Frame length */ +); + +/******************/ +/* NLSF Quantizer */ +/******************/ +/* Limit, stabilize, convert and quantize NLSFs */ +void silk_process_NLSFs( + silk_encoder_state *psEncC, /* I/O Encoder state */ + opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ + opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ + const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ +); + +opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ + opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ + opus_int16 *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ + const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ + const opus_int16 *pW_QW, /* I NLSF weight vector [ LPC_ORDER ] */ + const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ + const opus_int nSurvivors, /* I Max survivors after first stage */ + const opus_int signalType /* I Signal type: 0/1/2 */ +); + +/* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ +void silk_NLSF_VQ( + opus_int32 err_Q26[], /* O Quantization errors [K] */ + const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ + const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ + const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ + const opus_int K, /* I Number of codebook vectors */ + const opus_int LPC_order /* I Number of LPCs */ +); + +/* Delayed-decision quantizer for NLSF residuals */ +opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ + opus_int8 indices[], /* O Quantization indices [ order ] */ + const opus_int16 x_Q10[], /* I Input [ order ] */ + const opus_int16 w_Q5[], /* I Weights [ order ] */ + const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ + const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ + const opus_uint8 ec_rates_Q5[], /* I Rates [] */ + const opus_int quant_step_size_Q16, /* I Quantization step size */ + const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ + const opus_int32 mu_Q20, /* I R/D tradeoff */ + const opus_int16 order /* I Number of input values */ +); + +/* Unpack predictor values and indices for entropy coding tables */ +void silk_NLSF_unpack( + opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ + opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ + const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ + const opus_int CB1_index /* I Index of vector in first LSF codebook */ +); + +/***********************/ +/* NLSF vector decoder */ +/***********************/ +void silk_NLSF_decode( + opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ + opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ + const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ +); + +/****************************************************/ +/* Decoder Functions */ +/****************************************************/ +opus_int silk_reset_decoder( + silk_decoder_state *psDec /* I/O Decoder state pointer */ +); + +opus_int silk_init_decoder( + silk_decoder_state *psDec /* I/O Decoder state pointer */ +); + +/* Set decoder sampling rate */ +opus_int silk_decoder_set_fs( + silk_decoder_state *psDec, /* I/O Decoder state pointer */ + opus_int fs_kHz, /* I Sampling frequency (kHz) */ + opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ +); + +/****************/ +/* Decode frame */ +/****************/ +opus_int silk_decode_frame( + silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pOut[], /* O Pointer to output speech frame */ + opus_int32 *pN, /* O Pointer to size of output frame */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int condCoding, /* I The type of conditional coding to use */ +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState *lpcnet, +#endif +#ifdef ENABLE_OSCE + OSCEModel *osce_model, +#endif + int arch /* I Run-time architecture */ +); + +/* Decode indices from bitstream */ +void silk_decode_indices( + silk_decoder_state *psDec, /* I/O State */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int FrameIndex, /* I Frame number */ + opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +/* Decode parameters from payload */ +void silk_decode_parameters( + silk_decoder_state *psDec, /* I/O State */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +/* Core decoder. Performs inverse NSQ operation LTP + LPC */ +void silk_decode_core( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I Decoder control */ + opus_int16 xq[], /* O Decoded speech */ + const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ + int arch /* I Run-time architecture */ +); + +/* Decode quantization indices of excitation (Shell coding) */ +void silk_decode_pulses( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* O Excitation signal */ + const opus_int signalType, /* I Sigtype */ + const opus_int quantOffsetType, /* I quantOffsetType */ + const opus_int frame_length /* I Frame length */ +); + +/******************/ +/* CNG */ +/******************/ + +/* Reset CNG */ +void silk_CNG_Reset( + silk_decoder_state *psDec /* I/O Decoder state */ +); + +/* Updates CNG estimate, and applies the CNG when packet was lost */ +void silk_CNG( + silk_decoder_state *psDec, /* I/O Decoder state */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int16 frame[], /* I/O Signal */ + opus_int length /* I Length of residual */ +); + +/* Encoding of various parameters */ +void silk_encode_indices( + silk_encoder_state *psEncC, /* I/O Encoder state */ + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int FrameIndex, /* I Frame number */ + opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ + opus_int condCoding /* I The type of conditional coding to use */ +); + +#endif diff --git a/src/libopus/silk/main_FIX.h b/src/libopus/silk/main_FIX.h new file mode 100644 index 00000000..4143f360 --- /dev/null +++ b/src/libopus/silk/main_FIX.h @@ -0,0 +1 @@ +#include "fixed/main_FIX.h" diff --git a/src/libopus/silk/opus.h b/src/libopus/silk/opus.h new file mode 100644 index 00000000..0a1b59ca --- /dev/null +++ b/src/libopus/silk/opus.h @@ -0,0 +1 @@ +#include "../include/opus.h" diff --git a/src/libopus/silk/opus_custom.h b/src/libopus/silk/opus_custom.h new file mode 100644 index 00000000..f54a1034 --- /dev/null +++ b/src/libopus/silk/opus_custom.h @@ -0,0 +1 @@ +#include "../include/opus_custom.h" diff --git a/src/libopus/silk/opus_defines.h b/src/libopus/silk/opus_defines.h new file mode 100644 index 00000000..dcc24434 --- /dev/null +++ b/src/libopus/silk/opus_defines.h @@ -0,0 +1 @@ +#include "../include/opus_defines.h" diff --git a/src/libopus/silk/opus_multistream.h b/src/libopus/silk/opus_multistream.h new file mode 100644 index 00000000..89f62298 --- /dev/null +++ b/src/libopus/silk/opus_multistream.h @@ -0,0 +1 @@ +#include "../include/opus_multistream.h" diff --git a/src/libopus/silk/opus_projection.h b/src/libopus/silk/opus_projection.h new file mode 100644 index 00000000..72f59cc1 --- /dev/null +++ b/src/libopus/silk/opus_projection.h @@ -0,0 +1 @@ +#include "../include/opus_projection.h" diff --git a/src/libopus/silk/opus_types.h b/src/libopus/silk/opus_types.h new file mode 100644 index 00000000..a7958a5d --- /dev/null +++ b/src/libopus/silk/opus_types.h @@ -0,0 +1 @@ +#include "../include/opus_types.h" diff --git a/src/libopus/silk/os_support.h b/src/libopus/silk/os_support.h new file mode 100644 index 00000000..dc47379f --- /dev/null +++ b/src/libopus/silk/os_support.h @@ -0,0 +1 @@ +#include "../celt/os_support.h" diff --git a/src/libopus/silk/pitch_est_defines.h b/src/libopus/silk/pitch_est_defines.h new file mode 100644 index 00000000..e1e4b5d7 --- /dev/null +++ b/src/libopus/silk/pitch_est_defines.h @@ -0,0 +1,88 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_PE_DEFINES_H +#define SILK_PE_DEFINES_H + +#include "SigProc_FIX.h" + +/********************************************************/ +/* Definitions for pitch estimator */ +/********************************************************/ + +#define PE_MAX_FS_KHZ 16 /* Maximum sampling frequency used */ + +#define PE_MAX_NB_SUBFR 4 +#define PE_SUBFR_LENGTH_MS 5 /* 5 ms */ + +#define PE_LTP_MEM_LENGTH_MS ( 4 * PE_SUBFR_LENGTH_MS ) + +#define PE_MAX_FRAME_LENGTH_MS ( PE_LTP_MEM_LENGTH_MS + PE_MAX_NB_SUBFR * PE_SUBFR_LENGTH_MS ) +#define PE_MAX_FRAME_LENGTH ( PE_MAX_FRAME_LENGTH_MS * PE_MAX_FS_KHZ ) +#define PE_MAX_FRAME_LENGTH_ST_1 ( PE_MAX_FRAME_LENGTH >> 2 ) +#define PE_MAX_FRAME_LENGTH_ST_2 ( PE_MAX_FRAME_LENGTH >> 1 ) + +#define PE_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ +#define PE_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ +#define PE_MAX_LAG ( PE_MAX_LAG_MS * PE_MAX_FS_KHZ ) +#define PE_MIN_LAG ( PE_MIN_LAG_MS * PE_MAX_FS_KHZ ) + +#define PE_D_SRCH_LENGTH 24 + +#define PE_NB_STAGE3_LAGS 5 + +#define PE_NB_CBKS_STAGE2 3 +#define PE_NB_CBKS_STAGE2_EXT 11 + +#define PE_NB_CBKS_STAGE3_MAX 34 +#define PE_NB_CBKS_STAGE3_MID 24 +#define PE_NB_CBKS_STAGE3_MIN 16 + +#define PE_NB_CBKS_STAGE3_10MS 12 +#define PE_NB_CBKS_STAGE2_10MS 3 + +#define PE_SHORTLAG_BIAS 0.2f /* for logarithmic weighting */ +#define PE_PREVLAG_BIAS 0.2f /* for logarithmic weighting */ +#define PE_FLATCONTOUR_BIAS 0.05f + +#define SILK_PE_MIN_COMPLEX 0 +#define SILK_PE_MID_COMPLEX 1 +#define SILK_PE_MAX_COMPLEX 2 + +/* Tables for 20 ms frames */ +extern const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ]; +extern const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ]; +extern const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ]; +extern const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ]; + +/* Tables for 10 ms frames */ +extern const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ 3 ]; +extern const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 12 ]; +extern const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ]; + +#endif + diff --git a/src/libopus/silk/pitch_est_tables.c b/src/libopus/silk/pitch_est_tables.c new file mode 100644 index 00000000..3706f21e --- /dev/null +++ b/src/libopus/silk/pitch_est_tables.c @@ -0,0 +1,99 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "typedef.h" +#include "pitch_est_defines.h" + +const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ PE_NB_CBKS_STAGE2_10MS ] = +{ + {0, 1, 0}, + {0, 0, 1} +}; + +const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ PE_NB_CBKS_STAGE3_10MS ] = +{ + { 0, 0, 1,-1, 1,-1, 2,-2, 2,-2, 3,-3}, + { 0, 1, 0, 1,-1, 2,-1, 2,-2, 3,-2, 3} +}; + +const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ] = +{ + {-3, 7}, + {-2, 7} +}; + +const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ] = +{ + {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1}, + {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0}, + {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, + {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1} +}; + +const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ] = +{ + {0, 0, 1,-1, 0, 1,-1, 0,-1, 1,-2, 2,-2,-2, 2,-3, 2, 3,-3,-4, 3,-4, 4, 4,-5, 5,-6,-5, 6,-7, 6, 5, 8,-9}, + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 1,-1, 0, 1,-1,-1, 1,-1, 2, 1,-1, 2,-2,-2, 2,-2, 2, 2, 3,-3}, + {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1,-1, 1, 0, 0, 2, 1,-1, 2,-1,-1, 2,-1, 2, 2,-1, 3,-2,-2,-2, 3}, + {0, 1, 0, 0, 1, 0, 1,-1, 2,-1, 2,-1, 2, 3,-2, 3,-2,-2, 4, 4,-3, 5,-3,-4, 6,-4, 6, 5,-5, 8,-6,-5,-7, 9} +}; + +const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ] = +{ + /* Lags to search for low number of stage3 cbks */ + { + {-5,8}, + {-1,6}, + {-1,6}, + {-4,10} + }, + /* Lags to search for middle number of stage3 cbks */ + { + {-6,10}, + {-2,6}, + {-1,6}, + {-5,10} + }, + /* Lags to search for max number of stage3 cbks */ + { + {-9,12}, + {-3,7}, + {-2,7}, + {-7,13} + } +}; + +const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ] = +{ + PE_NB_CBKS_STAGE3_MIN, + PE_NB_CBKS_STAGE3_MID, + PE_NB_CBKS_STAGE3_MAX +}; diff --git a/src/libopus/silk/process_NLSFs.c b/src/libopus/silk/process_NLSFs.c new file mode 100644 index 00000000..b1f23141 --- /dev/null +++ b/src/libopus/silk/process_NLSFs.c @@ -0,0 +1,107 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Limit, stabilize, convert and quantize NLSFs */ +void silk_process_NLSFs( + silk_encoder_state *psEncC, /* I/O Encoder state */ + opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ + opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ + const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ +) +{ + opus_int i, doInterpolate; + opus_int NLSF_mu_Q20; + opus_int16 i_sqr_Q15; + opus_int16 pNLSF0_temp_Q15[ MAX_LPC_ORDER ]; + opus_int16 pNLSFW_QW[ MAX_LPC_ORDER ]; + opus_int16 pNLSFW0_temp_QW[ MAX_LPC_ORDER ]; + + silk_assert( psEncC->speech_activity_Q8 >= 0 ); + silk_assert( psEncC->speech_activity_Q8 <= SILK_FIX_CONST( 1.0, 8 ) ); + celt_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); + + /***********************/ + /* Calculate mu values */ + /***********************/ + /* NLSF_mu = 0.003 - 0.0015 * psEnc->speech_activity; */ + NLSF_mu_Q20 = silk_SMLAWB( SILK_FIX_CONST( 0.003, 20 ), SILK_FIX_CONST( -0.001, 28 ), psEncC->speech_activity_Q8 ); + if( psEncC->nb_subfr == 2 ) { + /* Multiply by 1.5 for 10 ms packets */ + NLSF_mu_Q20 = silk_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); + } + + celt_assert( NLSF_mu_Q20 > 0 ); + silk_assert( NLSF_mu_Q20 <= SILK_FIX_CONST( 0.005, 20 ) ); + + /* Calculate NLSF weights */ + silk_NLSF_VQ_weights_laroia( pNLSFW_QW, pNLSF_Q15, psEncC->predictLPCOrder ); + + /* Update NLSF weights for interpolated NLSFs */ + doInterpolate = ( psEncC->useInterpolatedNLSFs == 1 ) && ( psEncC->indices.NLSFInterpCoef_Q2 < 4 ); + if( doInterpolate ) { + /* Calculate the interpolated NLSF vector for the first half */ + silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, + psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); + + /* Calculate first half NLSF weights for the interpolated NLSFs */ + silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_QW, pNLSF0_temp_Q15, psEncC->predictLPCOrder ); + + /* Update NLSF weights with contribution from first half */ + i_sqr_Q15 = silk_LSHIFT( silk_SMULBB( psEncC->indices.NLSFInterpCoef_Q2, psEncC->indices.NLSFInterpCoef_Q2 ), 11 ); + for( i = 0; i < psEncC->predictLPCOrder; i++ ) { + pNLSFW_QW[ i ] = silk_ADD16( silk_RSHIFT( pNLSFW_QW[ i ], 1 ), silk_RSHIFT( + silk_SMULBB( pNLSFW0_temp_QW[ i ], i_sqr_Q15 ), 16) ); + silk_assert( pNLSFW_QW[ i ] >= 1 ); + } + } + + silk_NLSF_encode( psEncC->indices.NLSFIndices, pNLSF_Q15, psEncC->psNLSF_CB, pNLSFW_QW, + NLSF_mu_Q20, psEncC->NLSF_MSVQ_Survivors, psEncC->indices.signalType ); + + /* Convert quantized NLSFs back to LPC coefficients */ + silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder, psEncC->arch ); + + if( doInterpolate ) { + /* Calculate the interpolated, quantized LSF vector for the first half */ + silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, + psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); + + /* Convert back to LPC coefficients */ + silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder, psEncC->arch ); + + } else { + /* Copy LPC coefficients for first half from second half */ + celt_assert( psEncC->predictLPCOrder <= MAX_LPC_ORDER ); + silk_memcpy( PredCoef_Q12[ 0 ], PredCoef_Q12[ 1 ], psEncC->predictLPCOrder * sizeof( opus_int16 ) ); + } +} diff --git a/src/libopus/silk/quant_LTP_gains.c b/src/libopus/silk/quant_LTP_gains.c new file mode 100644 index 00000000..197a13cc --- /dev/null +++ b/src/libopus/silk/quant_LTP_gains.c @@ -0,0 +1,132 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "tuning_parameters.h" + +void silk_quant_LTP_gains( + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ + opus_int8 *periodicity_index, /* O Periodicity Index */ + opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ + opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ + const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ + const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +) +{ + opus_int j, k, cbk_size; + opus_int8 temp_idx[ MAX_NB_SUBFR ]; + const opus_uint8 *cl_ptr_Q5; + const opus_int8 *cbk_ptr_Q7; + const opus_uint8 *cbk_gain_ptr_Q7; + const opus_int32 *XX_Q17_ptr, *xX_Q17_ptr; + opus_int32 res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7; + opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7; + opus_int gain_Q7; + + /***************************************************/ + /* iterate over different codebooks with different */ + /* rates/distortions, and choose best */ + /***************************************************/ + min_rate_dist_Q7 = silk_int32_MAX; + best_sum_log_gain_Q7 = 0; + for( k = 0; k < 3; k++ ) { + /* Safety margin for pitch gain control, to take into account factors + such as state rescaling/rewhitening. */ + opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 ); + + cl_ptr_Q5 = silk_LTP_gain_BITS_Q5_ptrs[ k ]; + cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ k ]; + cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ]; + cbk_size = silk_LTP_vq_sizes[ k ]; + + /* Set up pointers to first subframe */ + XX_Q17_ptr = XX_Q17; + xX_Q17_ptr = xX_Q17; + + res_nrg_Q15 = 0; + rate_dist_Q7 = 0; + sum_log_gain_tmp_Q7 = *sum_log_gain_Q7; + for( j = 0; j < nb_subfr; j++ ) { + max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 ) + + SILK_FIX_CONST( 7, 7 ) ) - gain_safety; + silk_VQ_WMat_EC( + &temp_idx[ j ], /* O index of best codebook vector */ + &res_nrg_Q15_subfr, /* O residual energy */ + &rate_dist_Q7_subfr, /* O best weighted quantization error + mu * rate */ + &gain_Q7, /* O sum of absolute LTP coefficients */ + XX_Q17_ptr, /* I correlation matrix */ + xX_Q17_ptr, /* I correlation vector */ + cbk_ptr_Q7, /* I codebook */ + cbk_gain_ptr_Q7, /* I codebook effective gains */ + cl_ptr_Q5, /* I code length for each codebook vector */ + subfr_len, /* I number of samples per subframe */ + max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + cbk_size, /* I number of vectors in codebook */ + arch /* I Run-time architecture */ + ); + + res_nrg_Q15 = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr ); + rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr ); + sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7 + + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 )); + + XX_Q17_ptr += LTP_ORDER * LTP_ORDER; + xX_Q17_ptr += LTP_ORDER; + } + + if( rate_dist_Q7 <= min_rate_dist_Q7 ) { + min_rate_dist_Q7 = rate_dist_Q7; + *periodicity_index = (opus_int8)k; + silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); + best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; + } + } + + cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; + for( j = 0; j < nb_subfr; j++ ) { + for( k = 0; k < LTP_ORDER; k++ ) { + B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); + } + } + + if( nb_subfr == 2 ) { + res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 ); + } else { + res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 ); + } + + *sum_log_gain_Q7 = best_sum_log_gain_Q7; + *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) ); +} diff --git a/src/libopus/silk/resampler.c b/src/libopus/silk/resampler.c new file mode 100644 index 00000000..1f3e6424 --- /dev/null +++ b/src/libopus/silk/resampler.c @@ -0,0 +1,215 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* + * Matrix of resampling methods used: + * Fs_out (kHz) + * 8 12 16 24 48 + * + * 8 C UF U UF UF + * 12 AF C UF U UF + * Fs_in (kHz) 16 D AF C UF UF + * 24 AF D AF C U + * 48 AF AF AF D C + * + * C -> Copy (no resampling) + * D -> Allpass-based 2x downsampling + * U -> Allpass-based 2x upsampling + * UF -> Allpass-based 2x upsampling followed by FIR interpolation + * AF -> AR2 filter followed by FIR interpolation + */ + +#include "resampler_private.h" + +/* Tables with delay compensation values to equalize total delay for different modes */ +static const opus_int8 delay_matrix_enc[ 5 ][ 3 ] = { +/* in \ out 8 12 16 */ +/* 8 */ { 6, 0, 3 }, +/* 12 */ { 0, 7, 3 }, +/* 16 */ { 0, 1, 10 }, +/* 24 */ { 0, 2, 6 }, +/* 48 */ { 18, 10, 12 } +}; + +static const opus_int8 delay_matrix_dec[ 3 ][ 5 ] = { +/* in \ out 8 12 16 24 48 */ +/* 8 */ { 4, 0, 2, 0, 0 }, +/* 12 */ { 0, 9, 4, 7, 4 }, +/* 16 */ { 0, 3, 12, 7, 7 } +}; + +/* Simple way to make [8000, 12000, 16000, 24000, 48000] to [0, 1, 2, 3, 4] */ +#define rateID(R) ( ( ( ((R)>>12) - ((R)>16000) ) >> ((R)>24000) ) - 1 ) + +#define USE_silk_resampler_copy (0) +#define USE_silk_resampler_private_up2_HQ_wrapper (1) +#define USE_silk_resampler_private_IIR_FIR (2) +#define USE_silk_resampler_private_down_FIR (3) + +/* Initialize/reset the resampler state for a given pair of input/output sampling rates */ +opus_int silk_resampler_init( + silk_resampler_state_struct *S, /* I/O Resampler state */ + opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ + opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ + opus_int forEnc /* I If 1: encoder; if 0: decoder */ +) +{ + opus_int up2x; + + /* Clear state */ + silk_memset( S, 0, sizeof( silk_resampler_state_struct ) ); + + /* Input checking */ + if( forEnc ) { + if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 && Fs_Hz_in != 24000 && Fs_Hz_in != 48000 ) || + ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 ) ) { + celt_assert( 0 ); + return -1; + } + S->inputDelay = delay_matrix_enc[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; + } else { + if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 ) || + ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 && Fs_Hz_out != 24000 && Fs_Hz_out != 48000 ) ) { + celt_assert( 0 ); + return -1; + } + S->inputDelay = delay_matrix_dec[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; + } + + S->Fs_in_kHz = silk_DIV32_16( Fs_Hz_in, 1000 ); + S->Fs_out_kHz = silk_DIV32_16( Fs_Hz_out, 1000 ); + + /* Number of samples processed per batch */ + S->batchSize = S->Fs_in_kHz * RESAMPLER_MAX_BATCH_SIZE_MS; + + /* Find resampler with the right sampling ratio */ + up2x = 0; + if( Fs_Hz_out > Fs_Hz_in ) { + /* Upsample */ + if( Fs_Hz_out == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 1 */ + /* Special case: directly use 2x upsampler */ + S->resampler_function = USE_silk_resampler_private_up2_HQ_wrapper; + } else { + /* Default resampler */ + S->resampler_function = USE_silk_resampler_private_IIR_FIR; + up2x = 1; + } + } else if ( Fs_Hz_out < Fs_Hz_in ) { + /* Downsample */ + S->resampler_function = USE_silk_resampler_private_down_FIR; + if( silk_MUL( Fs_Hz_out, 4 ) == silk_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 4 */ + S->FIR_Fracs = 3; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; + S->Coefs = silk_Resampler_3_4_COEFS; + } else if( silk_MUL( Fs_Hz_out, 3 ) == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 3 */ + S->FIR_Fracs = 2; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; + S->Coefs = silk_Resampler_2_3_COEFS; + } else if( silk_MUL( Fs_Hz_out, 2 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 2 */ + S->FIR_Fracs = 1; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR1; + S->Coefs = silk_Resampler_1_2_COEFS; + } else if( silk_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 3 */ + S->FIR_Fracs = 1; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; + S->Coefs = silk_Resampler_1_3_COEFS; + } else if( silk_MUL( Fs_Hz_out, 4 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 4 */ + S->FIR_Fracs = 1; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; + S->Coefs = silk_Resampler_1_4_COEFS; + } else if( silk_MUL( Fs_Hz_out, 6 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 6 */ + S->FIR_Fracs = 1; + S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; + S->Coefs = silk_Resampler_1_6_COEFS; + } else { + /* None available */ + celt_assert( 0 ); + return -1; + } + } else { + /* Input and output sampling rates are equal: copy */ + S->resampler_function = USE_silk_resampler_copy; + } + + /* Ratio of input/output samples */ + S->invRatio_Q16 = silk_LSHIFT32( silk_DIV32( silk_LSHIFT32( Fs_Hz_in, 14 + up2x ), Fs_Hz_out ), 2 ); + /* Make sure the ratio is rounded up */ + while( silk_SMULWW( S->invRatio_Q16, Fs_Hz_out ) < silk_LSHIFT32( Fs_Hz_in, up2x ) ) { + S->invRatio_Q16++; + } + + return 0; +} + +/* Resampler: convert from one sampling rate to another */ +/* Input and output sampling rate are at most 48000 Hz */ +opus_int silk_resampler( + silk_resampler_state_struct *S, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +) +{ + opus_int nSamples; + + /* Need at least 1 ms of input data */ + celt_assert( inLen >= S->Fs_in_kHz ); + /* Delay can't exceed the 1 ms of buffering */ + celt_assert( S->inputDelay <= S->Fs_in_kHz ); + + nSamples = S->Fs_in_kHz - S->inputDelay; + + /* Copy to delay buffer */ + silk_memcpy( &S->delayBuf[ S->inputDelay ], in, nSamples * sizeof( opus_int16 ) ); + + switch( S->resampler_function ) { + case USE_silk_resampler_private_up2_HQ_wrapper: + silk_resampler_private_up2_HQ_wrapper( S, out, S->delayBuf, S->Fs_in_kHz ); + silk_resampler_private_up2_HQ_wrapper( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); + break; + case USE_silk_resampler_private_IIR_FIR: + silk_resampler_private_IIR_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); + silk_resampler_private_IIR_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); + break; + case USE_silk_resampler_private_down_FIR: + silk_resampler_private_down_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); + silk_resampler_private_down_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); + break; + default: + silk_memcpy( out, S->delayBuf, S->Fs_in_kHz * sizeof( opus_int16 ) ); + silk_memcpy( &out[ S->Fs_out_kHz ], &in[ nSamples ], ( inLen - S->Fs_in_kHz ) * sizeof( opus_int16 ) ); + } + + /* Copy to delay buffer */ + silk_memcpy( S->delayBuf, &in[ inLen - S->inputDelay ], S->inputDelay * sizeof( opus_int16 ) ); + + return 0; +} diff --git a/src/libopus/silk/resampler_down2.c b/src/libopus/silk/resampler_down2.c new file mode 100644 index 00000000..2fcd156b --- /dev/null +++ b/src/libopus/silk/resampler_down2.c @@ -0,0 +1,74 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_rom.h" + +/* Downsample by a factor 2 */ +void silk_resampler_down2( + opus_int32 *S, /* I/O State vector [ 2 ] */ + opus_int16 *out, /* O Output signal [ floor(len/2) ] */ + const opus_int16 *in, /* I Input signal [ len ] */ + opus_int32 inLen /* I Number of input samples */ +) +{ + opus_int32 k, len2 = silk_RSHIFT32( inLen, 1 ); + opus_int32 in32, out32, Y, X; + + celt_assert( silk_resampler_down2_0 > 0 ); + celt_assert( silk_resampler_down2_1 < 0 ); + + /* Internal variables and state are in Q10 format */ + for( k = 0; k < len2; k++ ) { + /* Convert to Q10 */ + in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); + + /* All-pass section for even input sample */ + Y = silk_SUB32( in32, S[ 0 ] ); + X = silk_SMLAWB( Y, Y, silk_resampler_down2_1 ); + out32 = silk_ADD32( S[ 0 ], X ); + S[ 0 ] = silk_ADD32( in32, X ); + + /* Convert to Q10 */ + in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); + + /* All-pass section for odd input sample, and add to output of previous section */ + Y = silk_SUB32( in32, S[ 1 ] ); + X = silk_SMULWB( Y, silk_resampler_down2_0 ); + out32 = silk_ADD32( out32, S[ 1 ] ); + out32 = silk_ADD32( out32, X ); + S[ 1 ] = silk_ADD32( in32, X ); + + /* Add, convert back to int16 and store to output */ + out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32, 11 ) ); + } +} + diff --git a/src/libopus/silk/resampler_down2_3.c b/src/libopus/silk/resampler_down2_3.c new file mode 100644 index 00000000..595f00c3 --- /dev/null +++ b/src/libopus/silk/resampler_down2_3.c @@ -0,0 +1,103 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_private.h" +#include "stack_alloc.h" + +#define ORDER_FIR 4 + +/* Downsample by a factor 2/3, low quality */ +void silk_resampler_down2_3( + opus_int32 *S, /* I/O State vector [ 6 ] */ + opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ + const opus_int16 *in, /* I Input signal [ inLen ] */ + opus_int32 inLen /* I Number of input samples */ +) +{ + opus_int32 nSamplesIn, counter, res_Q6; + VARDECL( opus_int32, buf ); + opus_int32 *buf_ptr; + SAVE_STACK; + + ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); + + /* Copy buffered samples to start of buffer */ + silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) ); + + /* Iterate over blocks of frameSizeIn input samples */ + while( 1 ) { + nSamplesIn = silk_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN ); + + /* Second-order AR filter (output in Q8) */ + silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in, + silk_Resampler_2_3_COEFS_LQ, nSamplesIn ); + + /* Interpolate filtered signal */ + buf_ptr = buf; + counter = nSamplesIn; + while( counter > 2 ) { + /* Inner product */ + res_Q6 = silk_SMULWB( buf_ptr[ 0 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); + + /* Scale down, saturate and store in output array */ + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); + + res_Q6 = silk_SMULWB( buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); + + /* Scale down, saturate and store in output array */ + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); + + buf_ptr += 3; + counter -= 3; + } + + in += nSamplesIn; + inLen -= nSamplesIn; + + if( inLen > 0 ) { + /* More iterations to do; copy last part of filtered signal to beginning of buffer */ + silk_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); + } else { + break; + } + } + + /* Copy last part of filtered signal to the state for the next call */ + silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/resampler_private.h b/src/libopus/silk/resampler_private.h new file mode 100644 index 00000000..422a7d9d --- /dev/null +++ b/src/libopus/silk/resampler_private.h @@ -0,0 +1,88 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_RESAMPLER_PRIVATE_H +#define SILK_RESAMPLER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "SigProc_FIX.h" +#include "resampler_structs.h" +#include "resampler_rom.h" + +/* Number of input samples to process in the inner loop */ +#define RESAMPLER_MAX_BATCH_SIZE_MS 10 +#define RESAMPLER_MAX_FS_KHZ 48 +#define RESAMPLER_MAX_BATCH_SIZE_IN ( RESAMPLER_MAX_BATCH_SIZE_MS * RESAMPLER_MAX_FS_KHZ ) + +/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ +void silk_resampler_private_IIR_FIR( + void *SS, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +); + +/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ +void silk_resampler_private_down_FIR( + void *SS, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +); + +/* Upsample by a factor 2, high quality */ +void silk_resampler_private_up2_HQ_wrapper( + void *SS, /* I/O Resampler state (unused) */ + opus_int16 *out, /* O Output signal [ 2 * len ] */ + const opus_int16 *in, /* I Input signal [ len ] */ + opus_int32 len /* I Number of input samples */ +); + +/* Upsample by a factor 2, high quality */ +void silk_resampler_private_up2_HQ( + opus_int32 *S, /* I/O Resampler state [ 6 ] */ + opus_int16 *out, /* O Output signal [ 2 * len ] */ + const opus_int16 *in, /* I Input signal [ len ] */ + opus_int32 len /* I Number of input samples */ +); + +/* Second order AR filter */ +void silk_resampler_private_AR2( + opus_int32 S[], /* I/O State vector [ 2 ] */ + opus_int32 out_Q8[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ + opus_int32 len /* I Signal length */ +); + +#ifdef __cplusplus +} +#endif +#endif /* SILK_RESAMPLER_PRIVATE_H */ diff --git a/src/libopus/silk/resampler_private_AR2.c b/src/libopus/silk/resampler_private_AR2.c new file mode 100644 index 00000000..8468578d --- /dev/null +++ b/src/libopus/silk/resampler_private_AR2.c @@ -0,0 +1,55 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_private.h" + +/* Second order AR filter with single delay elements */ +void silk_resampler_private_AR2( + opus_int32 S[], /* I/O State vector [ 2 ] */ + opus_int32 out_Q8[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ + opus_int32 len /* I Signal length */ +) +{ + opus_int32 k; + opus_int32 out32; + + for( k = 0; k < len; k++ ) { + out32 = silk_ADD_LSHIFT32( S[ 0 ], (opus_int32)in[ k ], 8 ); + out_Q8[ k ] = out32; + out32 = silk_LSHIFT( out32, 2 ); + S[ 0 ] = silk_SMLAWB( S[ 1 ], out32, A_Q14[ 0 ] ); + S[ 1 ] = silk_SMULWB( out32, A_Q14[ 1 ] ); + } +} + diff --git a/src/libopus/silk/resampler_private_IIR_FIR.c b/src/libopus/silk/resampler_private_IIR_FIR.c new file mode 100644 index 00000000..5aff032e --- /dev/null +++ b/src/libopus/silk/resampler_private_IIR_FIR.c @@ -0,0 +1,107 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_private.h" +#include "stack_alloc.h" + +static OPUS_INLINE opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( + opus_int16 *out, + opus_int16 *buf, + opus_int32 max_index_Q16, + opus_int32 index_increment_Q16 +) +{ + opus_int32 index_Q16, res_Q15; + opus_int16 *buf_ptr; + opus_int32 table_index; + + /* Interpolate upsampled signal and store in output array */ + for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { + table_index = silk_SMULWB( index_Q16 & 0xFFFF, 12 ); + buf_ptr = &buf[ index_Q16 >> 16 ]; + + res_Q15 = silk_SMULBB( buf_ptr[ 0 ], silk_resampler_frac_FIR_12[ table_index ][ 0 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 1 ], silk_resampler_frac_FIR_12[ table_index ][ 1 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 2 ], silk_resampler_frac_FIR_12[ table_index ][ 2 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 3 ], silk_resampler_frac_FIR_12[ table_index ][ 3 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 4 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 3 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 5 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 2 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 6 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 1 ] ); + res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 7 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 0 ] ); + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q15, 15 ) ); + } + return out; +} +/* Upsample using a combination of allpass-based 2x upsampling and FIR interpolation */ +void silk_resampler_private_IIR_FIR( + void *SS, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +) +{ + silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; + opus_int32 nSamplesIn; + opus_int32 max_index_Q16, index_increment_Q16; + VARDECL( opus_int16, buf ); + SAVE_STACK; + + ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); + + /* Copy buffered samples to start of buffer */ + silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); + + /* Iterate over blocks of frameSizeIn input samples */ + index_increment_Q16 = S->invRatio_Q16; + while( 1 ) { + nSamplesIn = silk_min( inLen, S->batchSize ); + + /* Upsample 2x */ + silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_12 ], in, nSamplesIn ); + + max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 ); /* + 1 because 2x upsampling */ + out = silk_resampler_private_IIR_FIR_INTERPOL( out, buf, max_index_Q16, index_increment_Q16 ); + in += nSamplesIn; + inLen -= nSamplesIn; + + if( inLen > 0 ) { + /* More iterations to do; copy last part of filtered signal to beginning of buffer */ + silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); + } else { + break; + } + } + + /* Copy last part of filtered signal to the state for the next call */ + silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/resampler_private_down_FIR.c b/src/libopus/silk/resampler_private_down_FIR.c new file mode 100644 index 00000000..4ee88979 --- /dev/null +++ b/src/libopus/silk/resampler_private_down_FIR.c @@ -0,0 +1,194 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_private.h" +#include "stack_alloc.h" + +static OPUS_INLINE opus_int16 *silk_resampler_private_down_FIR_INTERPOL( + opus_int16 *out, + opus_int32 *buf, + const opus_int16 *FIR_Coefs, + opus_int FIR_Order, + opus_int FIR_Fracs, + opus_int32 max_index_Q16, + opus_int32 index_increment_Q16 +) +{ + opus_int32 index_Q16, res_Q6; + opus_int32 *buf_ptr; + opus_int32 interpol_ind; + const opus_int16 *interpol_ptr; + + switch( FIR_Order ) { + case RESAMPLER_DOWN_ORDER_FIR0: + for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { + /* Integer part gives pointer to buffered input */ + buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); + + /* Fractional part gives interpolation coefficients */ + interpol_ind = silk_SMULWB( index_Q16 & 0xFFFF, FIR_Fracs ); + + /* Inner product */ + interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * interpol_ind ]; + res_Q6 = silk_SMULWB( buf_ptr[ 0 ], interpol_ptr[ 0 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], interpol_ptr[ 1 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], interpol_ptr[ 2 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], interpol_ptr[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], interpol_ptr[ 4 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 5 ], interpol_ptr[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 6 ], interpol_ptr[ 6 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 7 ], interpol_ptr[ 7 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 8 ], interpol_ptr[ 8 ] ); + interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * ( FIR_Fracs - 1 - interpol_ind ) ]; + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 17 ], interpol_ptr[ 0 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 16 ], interpol_ptr[ 1 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 15 ], interpol_ptr[ 2 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 14 ], interpol_ptr[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 13 ], interpol_ptr[ 4 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 12 ], interpol_ptr[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 11 ], interpol_ptr[ 6 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 10 ], interpol_ptr[ 7 ] ); + res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 9 ], interpol_ptr[ 8 ] ); + + /* Scale down, saturate and store in output array */ + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); + } + break; + case RESAMPLER_DOWN_ORDER_FIR1: + for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { + /* Integer part gives pointer to buffered input */ + buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); + + /* Inner product */ + res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 23 ] ), FIR_Coefs[ 0 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 22 ] ), FIR_Coefs[ 1 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 21 ] ), FIR_Coefs[ 2 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 20 ] ), FIR_Coefs[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 19 ] ), FIR_Coefs[ 4 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 18 ] ), FIR_Coefs[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 17 ] ), FIR_Coefs[ 6 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 16 ] ), FIR_Coefs[ 7 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 15 ] ), FIR_Coefs[ 8 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 14 ] ), FIR_Coefs[ 9 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 13 ] ), FIR_Coefs[ 10 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 12 ] ), FIR_Coefs[ 11 ] ); + + /* Scale down, saturate and store in output array */ + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); + } + break; + case RESAMPLER_DOWN_ORDER_FIR2: + for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { + /* Integer part gives pointer to buffered input */ + buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); + + /* Inner product */ + res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 35 ] ), FIR_Coefs[ 0 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 34 ] ), FIR_Coefs[ 1 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 33 ] ), FIR_Coefs[ 2 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 32 ] ), FIR_Coefs[ 3 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 31 ] ), FIR_Coefs[ 4 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 30 ] ), FIR_Coefs[ 5 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 29 ] ), FIR_Coefs[ 6 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 28 ] ), FIR_Coefs[ 7 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 27 ] ), FIR_Coefs[ 8 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 26 ] ), FIR_Coefs[ 9 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 25 ] ), FIR_Coefs[ 10 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 24 ] ), FIR_Coefs[ 11 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 12 ], buf_ptr[ 23 ] ), FIR_Coefs[ 12 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 13 ], buf_ptr[ 22 ] ), FIR_Coefs[ 13 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 14 ], buf_ptr[ 21 ] ), FIR_Coefs[ 14 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 15 ], buf_ptr[ 20 ] ), FIR_Coefs[ 15 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 16 ], buf_ptr[ 19 ] ), FIR_Coefs[ 16 ] ); + res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 17 ], buf_ptr[ 18 ] ), FIR_Coefs[ 17 ] ); + + /* Scale down, saturate and store in output array */ + *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); + } + break; + default: + celt_assert( 0 ); + } + return out; +} + +/* Resample with a 2nd order AR filter followed by FIR interpolation */ +void silk_resampler_private_down_FIR( + void *SS, /* I/O Resampler state */ + opus_int16 out[], /* O Output signal */ + const opus_int16 in[], /* I Input signal */ + opus_int32 inLen /* I Number of input samples */ +) +{ + silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; + opus_int32 nSamplesIn; + opus_int32 max_index_Q16, index_increment_Q16; + VARDECL( opus_int32, buf ); + const opus_int16 *FIR_Coefs; + SAVE_STACK; + + ALLOC( buf, S->batchSize + S->FIR_Order, opus_int32 ); + + /* Copy buffered samples to start of buffer */ + silk_memcpy( buf, S->sFIR.i32, S->FIR_Order * sizeof( opus_int32 ) ); + + FIR_Coefs = &S->Coefs[ 2 ]; + + /* Iterate over blocks of frameSizeIn input samples */ + index_increment_Q16 = S->invRatio_Q16; + while( 1 ) { + nSamplesIn = silk_min( inLen, S->batchSize ); + + /* Second-order AR filter (output in Q8) */ + silk_resampler_private_AR2( S->sIIR, &buf[ S->FIR_Order ], in, S->Coefs, nSamplesIn ); + + max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 ); + + /* Interpolate filtered signal */ + out = silk_resampler_private_down_FIR_INTERPOL( out, buf, FIR_Coefs, S->FIR_Order, + S->FIR_Fracs, max_index_Q16, index_increment_Q16 ); + + in += nSamplesIn; + inLen -= nSamplesIn; + + if( inLen > 1 ) { + /* More iterations to do; copy last part of filtered signal to beginning of buffer */ + silk_memcpy( buf, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); + } else { + break; + } + } + + /* Copy last part of filtered signal to the state for the next call */ + silk_memcpy( S->sFIR.i32, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); + RESTORE_STACK; +} diff --git a/src/libopus/silk/resampler_private_up2_HQ.c b/src/libopus/silk/resampler_private_up2_HQ.c new file mode 100644 index 00000000..db8ce7fb --- /dev/null +++ b/src/libopus/silk/resampler_private_up2_HQ.c @@ -0,0 +1,113 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" +#include "resampler_private.h" + +/* Upsample by a factor 2, high quality */ +/* Uses 2nd order allpass filters for the 2x upsampling, followed by a */ +/* notch filter just above Nyquist. */ +void silk_resampler_private_up2_HQ( + opus_int32 *S, /* I/O Resampler state [ 6 ] */ + opus_int16 *out, /* O Output signal [ 2 * len ] */ + const opus_int16 *in, /* I Input signal [ len ] */ + opus_int32 len /* I Number of input samples */ +) +{ + opus_int32 k; + opus_int32 in32, out32_1, out32_2, Y, X; + + silk_assert( silk_resampler_up2_hq_0[ 0 ] > 0 ); + silk_assert( silk_resampler_up2_hq_0[ 1 ] > 0 ); + silk_assert( silk_resampler_up2_hq_0[ 2 ] < 0 ); + silk_assert( silk_resampler_up2_hq_1[ 0 ] > 0 ); + silk_assert( silk_resampler_up2_hq_1[ 1 ] > 0 ); + silk_assert( silk_resampler_up2_hq_1[ 2 ] < 0 ); + + /* Internal variables and state are in Q10 format */ + for( k = 0; k < len; k++ ) { + /* Convert to Q10 */ + in32 = silk_LSHIFT( (opus_int32)in[ k ], 10 ); + + /* First all-pass section for even output sample */ + Y = silk_SUB32( in32, S[ 0 ] ); + X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 0 ] ); + out32_1 = silk_ADD32( S[ 0 ], X ); + S[ 0 ] = silk_ADD32( in32, X ); + + /* Second all-pass section for even output sample */ + Y = silk_SUB32( out32_1, S[ 1 ] ); + X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 1 ] ); + out32_2 = silk_ADD32( S[ 1 ], X ); + S[ 1 ] = silk_ADD32( out32_1, X ); + + /* Third all-pass section for even output sample */ + Y = silk_SUB32( out32_2, S[ 2 ] ); + X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_0[ 2 ] ); + out32_1 = silk_ADD32( S[ 2 ], X ); + S[ 2 ] = silk_ADD32( out32_2, X ); + + /* Apply gain in Q15, convert back to int16 and store to output */ + out[ 2 * k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); + + /* First all-pass section for odd output sample */ + Y = silk_SUB32( in32, S[ 3 ] ); + X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 0 ] ); + out32_1 = silk_ADD32( S[ 3 ], X ); + S[ 3 ] = silk_ADD32( in32, X ); + + /* Second all-pass section for odd output sample */ + Y = silk_SUB32( out32_1, S[ 4 ] ); + X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 1 ] ); + out32_2 = silk_ADD32( S[ 4 ], X ); + S[ 4 ] = silk_ADD32( out32_1, X ); + + /* Third all-pass section for odd output sample */ + Y = silk_SUB32( out32_2, S[ 5 ] ); + X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_1[ 2 ] ); + out32_1 = silk_ADD32( S[ 5 ], X ); + S[ 5 ] = silk_ADD32( out32_2, X ); + + /* Apply gain in Q15, convert back to int16 and store to output */ + out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); + } +} + +void silk_resampler_private_up2_HQ_wrapper( + void *SS, /* I/O Resampler state (unused) */ + opus_int16 *out, /* O Output signal [ 2 * len ] */ + const opus_int16 *in, /* I Input signal [ len ] */ + opus_int32 len /* I Number of input samples */ +) +{ + silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; + silk_resampler_private_up2_HQ( S->sIIR, out, in, len ); +} diff --git a/src/libopus/silk/resampler_rom.c b/src/libopus/silk/resampler_rom.c new file mode 100644 index 00000000..70d9d785 --- /dev/null +++ b/src/libopus/silk/resampler_rom.c @@ -0,0 +1,96 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* Filter coefficients for IIR/FIR polyphase resampling * + * Total size: 179 Words (358 Bytes) */ + +#include "resampler_private.h" + +/* Matlab code for the notch filter coefficients: */ +/* B = [1, 0.147, 1]; A = [1, 0.107, 0.89]; G = 0.93; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]) */ +/* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */ +/* const opus_int16 silk_resampler_up2_hq_notch[ 4 ] = { 9634, -7012, 7209, 30474 }; */ + +/* Tables with IIR and FIR coefficients for fractional downsamplers (123 Words) */ +silk_DWORD_ALIGN const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { + -20694, -13867, + -49, 64, 17, -157, 353, -496, 163, 11047, 22205, + -39, 6, 91, -170, 186, 23, -896, 6336, 19928, + -19, -36, 102, -89, -24, 328, -951, 2568, 15909, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { + -14457, -14019, + 64, 128, -122, 36, 310, -768, 584, 9267, 17733, + 12, 128, 18, -142, 288, -117, -865, 4123, 14459, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ] = { + 616, -14323, + -10, 39, 58, -46, -84, 120, 184, -315, -541, 1284, 5380, 9024, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { + 16102, -15162, + -13, 0, 20, 26, 5, -31, -43, -4, 65, 90, 7, -157, -248, -44, 593, 1583, 2612, 3271, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { + 22500, -15099, + 3, -14, -20, -15, 2, 25, 37, 25, -16, -71, -107, -79, 50, 292, 623, 982, 1288, 1464, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { + 27540, -15257, + 17, 12, 8, 1, -10, -22, -30, -32, -22, 3, 44, 100, 168, 243, 317, 381, 429, 455, +}; + +silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { + -2797, -6507, + 4697, 10739, + 1567, 8276, +}; + +/* Table with interplation fractions of 1/24, 3/24, 5/24, ... , 23/24 : 23/24 (46 Words) */ +silk_DWORD_ALIGN const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ] = { + { 189, -600, 617, 30567 }, + { 117, -159, -1070, 29704 }, + { 52, 221, -2392, 28276 }, + { -4, 529, -3350, 26341 }, + { -48, 758, -3956, 23973 }, + { -80, 905, -4235, 21254 }, + { -99, 972, -4222, 18278 }, + { -107, 967, -3957, 15143 }, + { -103, 896, -3487, 11950 }, + { -91, 773, -2865, 8798 }, + { -71, 611, -2143, 5784 }, + { -46, 425, -1375, 2996 }, +}; diff --git a/src/libopus/silk/resampler_rom.h b/src/libopus/silk/resampler_rom.h new file mode 100644 index 00000000..490b3388 --- /dev/null +++ b/src/libopus/silk/resampler_rom.h @@ -0,0 +1,68 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_FIX_RESAMPLER_ROM_H +#define SILK_FIX_RESAMPLER_ROM_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "typedef.h" +#include "resampler_structs.h" + +#define RESAMPLER_DOWN_ORDER_FIR0 18 +#define RESAMPLER_DOWN_ORDER_FIR1 24 +#define RESAMPLER_DOWN_ORDER_FIR2 36 +#define RESAMPLER_ORDER_FIR_12 8 + +/* Tables for 2x downsampler */ +static const opus_int16 silk_resampler_down2_0 = 9872; +static const opus_int16 silk_resampler_down2_1 = 39809 - 65536; + +/* Tables for 2x upsampler, high quality */ +static const opus_int16 silk_resampler_up2_hq_0[ 3 ] = { 1746, 14986, 39083 - 65536 }; +static const opus_int16 silk_resampler_up2_hq_1[ 3 ] = { 6854, 25769, 55542 - 65536 }; + +/* Tables with IIR and FIR coefficients for fractional downsamplers */ +extern const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; +extern const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; +extern const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ]; +extern const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; +extern const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; +extern const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; +extern const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ]; + +/* Table with interplation fractions of 1/24, 3/24, ..., 23/24 */ +extern const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ]; + +#ifdef __cplusplus +} +#endif + +#endif /* SILK_FIX_RESAMPLER_ROM_H */ diff --git a/src/libopus/silk/resampler_structs.h b/src/libopus/silk/resampler_structs.h new file mode 100644 index 00000000..9e9457d1 --- /dev/null +++ b/src/libopus/silk/resampler_structs.h @@ -0,0 +1,60 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_RESAMPLER_STRUCTS_H +#define SILK_RESAMPLER_STRUCTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define SILK_RESAMPLER_MAX_FIR_ORDER 36 +#define SILK_RESAMPLER_MAX_IIR_ORDER 6 + +typedef struct _silk_resampler_state_struct{ + opus_int32 sIIR[ SILK_RESAMPLER_MAX_IIR_ORDER ]; /* this must be the first element of this struct */ + union{ + opus_int32 i32[ SILK_RESAMPLER_MAX_FIR_ORDER ]; + opus_int16 i16[ SILK_RESAMPLER_MAX_FIR_ORDER ]; + } sFIR; + opus_int16 delayBuf[ 48 ]; + opus_int resampler_function; + opus_int batchSize; + opus_int32 invRatio_Q16; + opus_int FIR_Order; + opus_int FIR_Fracs; + opus_int Fs_in_kHz; + opus_int Fs_out_kHz; + opus_int inputDelay; + const opus_int16 *Coefs; +} silk_resampler_state_struct; + +#ifdef __cplusplus +} +#endif +#endif /* SILK_RESAMPLER_STRUCTS_H */ + diff --git a/src/libopus/silk/shell_coder.c b/src/libopus/silk/shell_coder.c new file mode 100644 index 00000000..6efa4eac --- /dev/null +++ b/src/libopus/silk/shell_coder.c @@ -0,0 +1,151 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* shell coder; pulse-subframe length is hardcoded */ + +static OPUS_INLINE void combine_pulses( + opus_int *out, /* O combined pulses vector [len] */ + const opus_int *in, /* I input vector [2 * len] */ + const opus_int len /* I number of OUTPUT samples */ +) +{ + opus_int k; + for( k = 0; k < len; k++ ) { + out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ]; + } +} + +static OPUS_INLINE void encode_split( + ec_enc *psRangeEnc, /* I/O compressor data structure */ + const opus_int p_child1, /* I pulse amplitude of first child subframe */ + const opus_int p, /* I pulse amplitude of current subframe */ + const opus_uint8 *shell_table /* I table of shell cdfs */ +) +{ + if( p > 0 ) { + ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); + } +} + +static OPUS_INLINE void decode_split( + opus_int16 *p_child1, /* O pulse amplitude of first child subframe */ + opus_int16 *p_child2, /* O pulse amplitude of second child subframe */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + const opus_int p, /* I pulse amplitude of current subframe */ + const opus_uint8 *shell_table /* I table of shell cdfs */ +) +{ + if( p > 0 ) { + p_child1[ 0 ] = ec_dec_icdf( psRangeDec, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); + p_child2[ 0 ] = p - p_child1[ 0 ]; + } else { + p_child1[ 0 ] = 0; + p_child2[ 0 ] = 0; + } +} + +/* Shell encoder, operates on one shell code frame of 16 pulses */ +void silk_shell_encoder( + ec_enc *psRangeEnc, /* I/O compressor data structure */ + const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ +) +{ + opus_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ]; + + /* this function operates on one shell code frame of 16 pulses */ + silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); + + /* tree representation per pulse-subframe */ + combine_pulses( pulses1, pulses0, 8 ); + combine_pulses( pulses2, pulses1, 4 ); + combine_pulses( pulses3, pulses2, 2 ); + combine_pulses( pulses4, pulses3, 1 ); + + encode_split( psRangeEnc, pulses3[ 0 ], pulses4[ 0 ], silk_shell_code_table3 ); + + encode_split( psRangeEnc, pulses2[ 0 ], pulses3[ 0 ], silk_shell_code_table2 ); + + encode_split( psRangeEnc, pulses1[ 0 ], pulses2[ 0 ], silk_shell_code_table1 ); + encode_split( psRangeEnc, pulses0[ 0 ], pulses1[ 0 ], silk_shell_code_table0 ); + encode_split( psRangeEnc, pulses0[ 2 ], pulses1[ 1 ], silk_shell_code_table0 ); + + encode_split( psRangeEnc, pulses1[ 2 ], pulses2[ 1 ], silk_shell_code_table1 ); + encode_split( psRangeEnc, pulses0[ 4 ], pulses1[ 2 ], silk_shell_code_table0 ); + encode_split( psRangeEnc, pulses0[ 6 ], pulses1[ 3 ], silk_shell_code_table0 ); + + encode_split( psRangeEnc, pulses2[ 2 ], pulses3[ 1 ], silk_shell_code_table2 ); + + encode_split( psRangeEnc, pulses1[ 4 ], pulses2[ 2 ], silk_shell_code_table1 ); + encode_split( psRangeEnc, pulses0[ 8 ], pulses1[ 4 ], silk_shell_code_table0 ); + encode_split( psRangeEnc, pulses0[ 10 ], pulses1[ 5 ], silk_shell_code_table0 ); + + encode_split( psRangeEnc, pulses1[ 6 ], pulses2[ 3 ], silk_shell_code_table1 ); + encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 ); + encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 ); +} + + +/* Shell decoder, operates on one shell code frame of 16 pulses */ +void silk_shell_decoder( + opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + const opus_int pulses4 /* I number of pulses per pulse-subframe */ +) +{ + opus_int16 pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ]; + + /* this function operates on one shell code frame of 16 pulses */ + silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); + + decode_split( &pulses3[ 0 ], &pulses3[ 1 ], psRangeDec, pulses4, silk_shell_code_table3 ); + + decode_split( &pulses2[ 0 ], &pulses2[ 1 ], psRangeDec, pulses3[ 0 ], silk_shell_code_table2 ); + + decode_split( &pulses1[ 0 ], &pulses1[ 1 ], psRangeDec, pulses2[ 0 ], silk_shell_code_table1 ); + decode_split( &pulses0[ 0 ], &pulses0[ 1 ], psRangeDec, pulses1[ 0 ], silk_shell_code_table0 ); + decode_split( &pulses0[ 2 ], &pulses0[ 3 ], psRangeDec, pulses1[ 1 ], silk_shell_code_table0 ); + + decode_split( &pulses1[ 2 ], &pulses1[ 3 ], psRangeDec, pulses2[ 1 ], silk_shell_code_table1 ); + decode_split( &pulses0[ 4 ], &pulses0[ 5 ], psRangeDec, pulses1[ 2 ], silk_shell_code_table0 ); + decode_split( &pulses0[ 6 ], &pulses0[ 7 ], psRangeDec, pulses1[ 3 ], silk_shell_code_table0 ); + + decode_split( &pulses2[ 2 ], &pulses2[ 3 ], psRangeDec, pulses3[ 1 ], silk_shell_code_table2 ); + + decode_split( &pulses1[ 4 ], &pulses1[ 5 ], psRangeDec, pulses2[ 2 ], silk_shell_code_table1 ); + decode_split( &pulses0[ 8 ], &pulses0[ 9 ], psRangeDec, pulses1[ 4 ], silk_shell_code_table0 ); + decode_split( &pulses0[ 10 ], &pulses0[ 11 ], psRangeDec, pulses1[ 5 ], silk_shell_code_table0 ); + + decode_split( &pulses1[ 6 ], &pulses1[ 7 ], psRangeDec, pulses2[ 3 ], silk_shell_code_table1 ); + decode_split( &pulses0[ 12 ], &pulses0[ 13 ], psRangeDec, pulses1[ 6 ], silk_shell_code_table0 ); + decode_split( &pulses0[ 14 ], &pulses0[ 15 ], psRangeDec, pulses1[ 7 ], silk_shell_code_table0 ); +} diff --git a/src/libopus/silk/sigm_Q15.c b/src/libopus/silk/sigm_Q15.c new file mode 100644 index 00000000..75c872ec --- /dev/null +++ b/src/libopus/silk/sigm_Q15.c @@ -0,0 +1,76 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* Approximate sigmoid function */ + +#include "SigProc_FIX.h" + +/* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */ +static const opus_int32 sigm_LUT_slope_Q10[ 6 ] = { + 237, 153, 73, 30, 12, 7 +}; +/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */ +static const opus_int32 sigm_LUT_pos_Q15[ 6 ] = { + 16384, 23955, 28861, 31213, 32178, 32548 +}; +/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */ +static const opus_int32 sigm_LUT_neg_Q15[ 6 ] = { + 16384, 8812, 3906, 1554, 589, 219 +}; + +opus_int silk_sigm_Q15( + opus_int in_Q5 /* I */ +) +{ + opus_int ind; + + if( in_Q5 < 0 ) { + /* Negative input */ + in_Q5 = -in_Q5; + if( in_Q5 >= 6 * 32 ) { + return 0; /* Clip */ + } else { + /* Linear interpolation of look up table */ + ind = silk_RSHIFT( in_Q5, 5 ); + return( sigm_LUT_neg_Q15[ ind ] - silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); + } + } else { + /* Positive input */ + if( in_Q5 >= 6 * 32 ) { + return 32767; /* clip */ + } else { + /* Linear interpolation of look up table */ + ind = silk_RSHIFT( in_Q5, 5 ); + return( sigm_LUT_pos_Q15[ ind ] + silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); + } + } +} + diff --git a/src/libopus/silk/sort.c b/src/libopus/silk/sort.c new file mode 100644 index 00000000..776e0884 --- /dev/null +++ b/src/libopus/silk/sort.c @@ -0,0 +1,154 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +/* Insertion sort (fast for already almost sorted arrays): */ +/* Best case: O(n) for an already sorted array */ +/* Worst case: O(n^2) for an inversely sorted array */ +/* */ +/* Shell short: https://en.wikipedia.org/wiki/Shell_sort */ + +#include "SigProc_FIX.h" + +void silk_insertion_sort_increasing( + opus_int32 *a, /* I/O Unsorted / Sorted vector */ + opus_int *idx, /* O Index vector for the sorted elements */ + const opus_int L, /* I Vector length */ + const opus_int K /* I Number of correctly sorted positions */ +) +{ + opus_int32 value; + opus_int i, j; + + /* Safety checks */ + celt_assert( K > 0 ); + celt_assert( L > 0 ); + celt_assert( L >= K ); + + /* Write start indices in index vector */ + for( i = 0; i < K; i++ ) { + idx[ i ] = i; + } + + /* Sort vector elements by value, increasing order */ + for( i = 1; i < K; i++ ) { + value = a[ i ]; + for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { + a[ j + 1 ] = a[ j ]; /* Shift value */ + idx[ j + 1 ] = idx[ j ]; /* Shift index */ + } + a[ j + 1 ] = value; /* Write value */ + idx[ j + 1 ] = i; /* Write index */ + } + + /* If less than L values are asked for, check the remaining values, */ + /* but only spend CPU to ensure that the K first values are correct */ + for( i = K; i < L; i++ ) { + value = a[ i ]; + if( value < a[ K - 1 ] ) { + for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { + a[ j + 1 ] = a[ j ]; /* Shift value */ + idx[ j + 1 ] = idx[ j ]; /* Shift index */ + } + a[ j + 1 ] = value; /* Write value */ + idx[ j + 1 ] = i; /* Write index */ + } + } +} + +#ifdef FIXED_POINT +/* This function is only used by the fixed-point build */ +void silk_insertion_sort_decreasing_int16( + opus_int16 *a, /* I/O Unsorted / Sorted vector */ + opus_int *idx, /* O Index vector for the sorted elements */ + const opus_int L, /* I Vector length */ + const opus_int K /* I Number of correctly sorted positions */ +) +{ + opus_int i, j; + opus_int value; + + /* Safety checks */ + celt_assert( K > 0 ); + celt_assert( L > 0 ); + celt_assert( L >= K ); + + /* Write start indices in index vector */ + for( i = 0; i < K; i++ ) { + idx[ i ] = i; + } + + /* Sort vector elements by value, decreasing order */ + for( i = 1; i < K; i++ ) { + value = a[ i ]; + for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { + a[ j + 1 ] = a[ j ]; /* Shift value */ + idx[ j + 1 ] = idx[ j ]; /* Shift index */ + } + a[ j + 1 ] = value; /* Write value */ + idx[ j + 1 ] = i; /* Write index */ + } + + /* If less than L values are asked for, check the remaining values, */ + /* but only spend CPU to ensure that the K first values are correct */ + for( i = K; i < L; i++ ) { + value = a[ i ]; + if( value > a[ K - 1 ] ) { + for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { + a[ j + 1 ] = a[ j ]; /* Shift value */ + idx[ j + 1 ] = idx[ j ]; /* Shift index */ + } + a[ j + 1 ] = value; /* Write value */ + idx[ j + 1 ] = i; /* Write index */ + } + } +} +#endif + +void silk_insertion_sort_increasing_all_values_int16( + opus_int16 *a, /* I/O Unsorted / Sorted vector */ + const opus_int L /* I Vector length */ +) +{ + opus_int value; + opus_int i, j; + + /* Safety checks */ + celt_assert( L > 0 ); + + /* Sort vector elements by value, increasing order */ + for( i = 1; i < L; i++ ) { + value = a[ i ]; + for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { + a[ j + 1 ] = a[ j ]; /* Shift value */ + } + a[ j + 1 ] = value; /* Write value */ + } +} diff --git a/src/libopus/silk/stack_alloc.h b/src/libopus/silk/stack_alloc.h new file mode 100644 index 00000000..416720bf --- /dev/null +++ b/src/libopus/silk/stack_alloc.h @@ -0,0 +1 @@ +#include "../celt/stack_alloc.h" diff --git a/src/libopus/silk/stereo_LR_to_MS.c b/src/libopus/silk/stereo_LR_to_MS.c new file mode 100644 index 00000000..70501c2d --- /dev/null +++ b/src/libopus/silk/stereo_LR_to_MS.c @@ -0,0 +1,229 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ +void silk_stereo_LR_to_MS( + stereo_enc_state *state, /* I/O State */ + opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ + opus_int16 x2[], /* I/O Right input signal, becomes side signal */ + opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ + opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ + opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ + opus_int32 total_rate_bps, /* I Total bitrate */ + opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ + opus_int toMono, /* I Last frame before a stereo->mono transition */ + opus_int fs_kHz, /* I Sample rate (kHz) */ + opus_int frame_length /* I Number of samples */ +) +{ + opus_int n, is10msFrame, denom_Q16, delta0_Q13, delta1_Q13; + opus_int32 sum, diff, smooth_coef_Q16, pred_Q13[ 2 ], pred0_Q13, pred1_Q13; + opus_int32 LP_ratio_Q14, HP_ratio_Q14, frac_Q16, frac_3_Q16, min_mid_rate_bps, width_Q14, w_Q24, deltaw_Q24; + VARDECL( opus_int16, side ); + VARDECL( opus_int16, LP_mid ); + VARDECL( opus_int16, HP_mid ); + VARDECL( opus_int16, LP_side ); + VARDECL( opus_int16, HP_side ); + opus_int16 *mid = &x1[ -2 ]; + SAVE_STACK; + + ALLOC( side, frame_length + 2, opus_int16 ); + /* Convert to basic mid/side signals */ + for( n = 0; n < frame_length + 2; n++ ) { + sum = x1[ n - 2 ] + (opus_int32)x2[ n - 2 ]; + diff = x1[ n - 2 ] - (opus_int32)x2[ n - 2 ]; + mid[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); + side[ n ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( diff, 1 ) ); + } + + /* Buffering */ + silk_memcpy( mid, state->sMid, 2 * sizeof( opus_int16 ) ); + silk_memcpy( side, state->sSide, 2 * sizeof( opus_int16 ) ); + silk_memcpy( state->sMid, &mid[ frame_length ], 2 * sizeof( opus_int16 ) ); + silk_memcpy( state->sSide, &side[ frame_length ], 2 * sizeof( opus_int16 ) ); + + /* LP and HP filter mid signal */ + ALLOC( LP_mid, frame_length, opus_int16 ); + ALLOC( HP_mid, frame_length, opus_int16 ); + for( n = 0; n < frame_length; n++ ) { + sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT32( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 2 ); + LP_mid[ n ] = sum; + HP_mid[ n ] = mid[ n + 1 ] - sum; + } + + /* LP and HP filter side signal */ + ALLOC( LP_side, frame_length, opus_int16 ); + ALLOC( HP_side, frame_length, opus_int16 ); + for( n = 0; n < frame_length; n++ ) { + sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT32( side[ n ] + (opus_int32)side[ n + 2 ], side[ n + 1 ], 1 ), 2 ); + LP_side[ n ] = sum; + HP_side[ n ] = side[ n + 1 ] - sum; + } + + /* Find energies and predictors */ + is10msFrame = frame_length == 10 * fs_kHz; + smooth_coef_Q16 = is10msFrame ? + SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF / 2, 16 ) : + SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF, 16 ); + smooth_coef_Q16 = silk_SMULWB( silk_SMULBB( prev_speech_act_Q8, prev_speech_act_Q8 ), smooth_coef_Q16 ); + + pred_Q13[ 0 ] = silk_stereo_find_predictor( &LP_ratio_Q14, LP_mid, LP_side, &state->mid_side_amp_Q0[ 0 ], frame_length, smooth_coef_Q16 ); + pred_Q13[ 1 ] = silk_stereo_find_predictor( &HP_ratio_Q14, HP_mid, HP_side, &state->mid_side_amp_Q0[ 2 ], frame_length, smooth_coef_Q16 ); + /* Ratio of the norms of residual and mid signals */ + frac_Q16 = silk_SMLABB( HP_ratio_Q14, LP_ratio_Q14, 3 ); + frac_Q16 = silk_min( frac_Q16, SILK_FIX_CONST( 1, 16 ) ); + + /* Determine bitrate distribution between mid and side, and possibly reduce stereo width */ + total_rate_bps -= is10msFrame ? 1200 : 600; /* Subtract approximate bitrate for coding stereo parameters */ + if( total_rate_bps < 1 ) { + total_rate_bps = 1; + } + min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 600 ); + silk_assert( min_mid_rate_bps < 32767 ); + /* Default bitrate distribution: 8 parts for Mid and (5+3*frac) parts for Side. so: mid_rate = ( 8 / ( 13 + 3 * frac ) ) * total_ rate */ + frac_3_Q16 = silk_MUL( 3, frac_Q16 ); + mid_side_rates_bps[ 0 ] = silk_DIV32_varQ( total_rate_bps, SILK_FIX_CONST( 8 + 5, 16 ) + frac_3_Q16, 16+3 ); + /* If Mid bitrate below minimum, reduce stereo width */ + if( mid_side_rates_bps[ 0 ] < min_mid_rate_bps ) { + mid_side_rates_bps[ 0 ] = min_mid_rate_bps; + mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; + /* width = 4 * ( 2 * side_rate - min_rate ) / ( ( 1 + 3 * frac ) * min_rate ) */ + width_Q14 = silk_DIV32_varQ( silk_LSHIFT( mid_side_rates_bps[ 1 ], 1 ) - min_mid_rate_bps, + silk_SMULWB( SILK_FIX_CONST( 1, 16 ) + frac_3_Q16, min_mid_rate_bps ), 14+2 ); + width_Q14 = silk_LIMIT( width_Q14, 0, SILK_FIX_CONST( 1, 14 ) ); + } else { + mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; + width_Q14 = SILK_FIX_CONST( 1, 14 ); + } + + /* Smoother */ + state->smth_width_Q14 = (opus_int16)silk_SMLAWB( state->smth_width_Q14, width_Q14 - state->smth_width_Q14, smooth_coef_Q16 ); + + /* At very low bitrates or for inputs that are nearly amplitude panned, switch to panned-mono coding */ + *mid_only_flag = 0; + if( toMono ) { + /* Last frame before stereo->mono transition; collapse stereo width */ + width_Q14 = 0; + pred_Q13[ 0 ] = 0; + pred_Q13[ 1 ] = 0; + silk_stereo_quant_pred( pred_Q13, ix ); + } else if( state->width_prev_Q14 == 0 && + ( 8 * total_rate_bps < 13 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.05, 14 ) ) ) + { + /* Code as panned-mono; previous frame already had zero width */ + /* Scale down and quantize predictors */ + pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); + pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); + silk_stereo_quant_pred( pred_Q13, ix ); + /* Collapse stereo width */ + width_Q14 = 0; + pred_Q13[ 0 ] = 0; + pred_Q13[ 1 ] = 0; + mid_side_rates_bps[ 0 ] = total_rate_bps; + mid_side_rates_bps[ 1 ] = 0; + *mid_only_flag = 1; + } else if( state->width_prev_Q14 != 0 && + ( 8 * total_rate_bps < 11 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.02, 14 ) ) ) + { + /* Transition to zero-width stereo */ + /* Scale down and quantize predictors */ + pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); + pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); + silk_stereo_quant_pred( pred_Q13, ix ); + /* Collapse stereo width */ + width_Q14 = 0; + pred_Q13[ 0 ] = 0; + pred_Q13[ 1 ] = 0; + } else if( state->smth_width_Q14 > SILK_FIX_CONST( 0.95, 14 ) ) { + /* Full-width stereo coding */ + silk_stereo_quant_pred( pred_Q13, ix ); + width_Q14 = SILK_FIX_CONST( 1, 14 ); + } else { + /* Reduced-width stereo coding; scale down and quantize predictors */ + pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); + pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); + silk_stereo_quant_pred( pred_Q13, ix ); + width_Q14 = state->smth_width_Q14; + } + + /* Make sure to keep on encoding until the tapered output has been transmitted */ + if( *mid_only_flag == 1 ) { + state->silent_side_len += frame_length - STEREO_INTERP_LEN_MS * fs_kHz; + if( state->silent_side_len < LA_SHAPE_MS * fs_kHz ) { + *mid_only_flag = 0; + } else { + /* Limit to avoid wrapping around */ + state->silent_side_len = 10000; + } + } else { + state->silent_side_len = 0; + } + + if( *mid_only_flag == 0 && mid_side_rates_bps[ 1 ] < 1 ) { + mid_side_rates_bps[ 1 ] = 1; + mid_side_rates_bps[ 0 ] = silk_max_int( 1, total_rate_bps - mid_side_rates_bps[ 1 ]); + } + + /* Interpolate predictors and subtract prediction from side channel */ + pred0_Q13 = -state->pred_prev_Q13[ 0 ]; + pred1_Q13 = -state->pred_prev_Q13[ 1 ]; + w_Q24 = silk_LSHIFT( state->width_prev_Q14, 10 ); + denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); + delta0_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); + delta1_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); + deltaw_Q24 = silk_LSHIFT( silk_SMULWB( width_Q14 - state->width_prev_Q14, denom_Q16 ), 10 ); + for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { + pred0_Q13 += delta0_Q13; + pred1_Q13 += delta1_Q13; + w_Q24 += deltaw_Q24; + sum = silk_LSHIFT( silk_ADD_LSHIFT32( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ + sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ + x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); + } + + pred0_Q13 = -pred_Q13[ 0 ]; + pred1_Q13 = -pred_Q13[ 1 ]; + w_Q24 = silk_LSHIFT( width_Q14, 10 ); + for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { + sum = silk_LSHIFT( silk_ADD_LSHIFT32( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ + sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ + x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); + } + state->pred_prev_Q13[ 0 ] = (opus_int16)pred_Q13[ 0 ]; + state->pred_prev_Q13[ 1 ] = (opus_int16)pred_Q13[ 1 ]; + state->width_prev_Q14 = (opus_int16)width_Q14; + RESTORE_STACK; +} diff --git a/src/libopus/silk/stereo_MS_to_LR.c b/src/libopus/silk/stereo_MS_to_LR.c new file mode 100644 index 00000000..26342fb3 --- /dev/null +++ b/src/libopus/silk/stereo_MS_to_LR.c @@ -0,0 +1,85 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ +void silk_stereo_MS_to_LR( + stereo_dec_state *state, /* I/O State */ + opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ + opus_int16 x2[], /* I/O Right input signal, becomes side signal */ + const opus_int32 pred_Q13[], /* I Predictors */ + opus_int fs_kHz, /* I Samples rate (kHz) */ + opus_int frame_length /* I Number of samples */ +) +{ + opus_int n, denom_Q16, delta0_Q13, delta1_Q13; + opus_int32 sum, diff, pred0_Q13, pred1_Q13; + + /* Buffering */ + silk_memcpy( x1, state->sMid, 2 * sizeof( opus_int16 ) ); + silk_memcpy( x2, state->sSide, 2 * sizeof( opus_int16 ) ); + silk_memcpy( state->sMid, &x1[ frame_length ], 2 * sizeof( opus_int16 ) ); + silk_memcpy( state->sSide, &x2[ frame_length ], 2 * sizeof( opus_int16 ) ); + + /* Interpolate predictors and add prediction to side channel */ + pred0_Q13 = state->pred_prev_Q13[ 0 ]; + pred1_Q13 = state->pred_prev_Q13[ 1 ]; + denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); + delta0_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); + delta1_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); + for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { + pred0_Q13 += delta0_Q13; + pred1_Q13 += delta1_Q13; + sum = silk_LSHIFT( silk_ADD_LSHIFT32( x1[ n ] + (opus_int32)x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ + sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ + x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); + } + pred0_Q13 = pred_Q13[ 0 ]; + pred1_Q13 = pred_Q13[ 1 ]; + for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { + sum = silk_LSHIFT( silk_ADD_LSHIFT32( x1[ n ] + (opus_int32)x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ + sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ + x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); + } + state->pred_prev_Q13[ 0 ] = pred_Q13[ 0 ]; + state->pred_prev_Q13[ 1 ] = pred_Q13[ 1 ]; + + /* Convert to left/right signals */ + for( n = 0; n < frame_length; n++ ) { + sum = x1[ n + 1 ] + (opus_int32)x2[ n + 1 ]; + diff = x1[ n + 1 ] - (opus_int32)x2[ n + 1 ]; + x1[ n + 1 ] = (opus_int16)silk_SAT16( sum ); + x2[ n + 1 ] = (opus_int16)silk_SAT16( diff ); + } +} diff --git a/src/libopus/silk/stereo_decode_pred.c b/src/libopus/silk/stereo_decode_pred.c new file mode 100644 index 00000000..b6075f9f --- /dev/null +++ b/src/libopus/silk/stereo_decode_pred.c @@ -0,0 +1,73 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Decode mid/side predictors */ +void silk_stereo_decode_pred( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int32 pred_Q13[] /* O Predictors */ +) +{ + opus_int n, ix[ 2 ][ 3 ]; + opus_int32 low_Q13, step_Q13; + + /* Entropy decoding */ + n = ec_dec_icdf( psRangeDec, silk_stereo_pred_joint_iCDF, 8 ); + ix[ 0 ][ 2 ] = silk_DIV32_16( n, 5 ); + ix[ 1 ][ 2 ] = n - 5 * ix[ 0 ][ 2 ]; + for( n = 0; n < 2; n++ ) { + ix[ n ][ 0 ] = ec_dec_icdf( psRangeDec, silk_uniform3_iCDF, 8 ); + ix[ n ][ 1 ] = ec_dec_icdf( psRangeDec, silk_uniform5_iCDF, 8 ); + } + + /* Dequantize */ + for( n = 0; n < 2; n++ ) { + ix[ n ][ 0 ] += 3 * ix[ n ][ 2 ]; + low_Q13 = silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] ]; + step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] + 1 ] - low_Q13, + SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); + pred_Q13[ n ] = silk_SMLABB( low_Q13, step_Q13, 2 * ix[ n ][ 1 ] + 1 ); + } + + /* Subtract second from first predictor (helps when actually applying these) */ + pred_Q13[ 0 ] -= pred_Q13[ 1 ]; +} + +/* Decode mid-only flag */ +void silk_stereo_decode_mid_only( + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ +) +{ + /* Decode flag that only mid channel is coded */ + *decode_only_mid = ec_dec_icdf( psRangeDec, silk_stereo_only_code_mid_iCDF, 8 ); +} diff --git a/src/libopus/silk/stereo_encode_pred.c b/src/libopus/silk/stereo_encode_pred.c new file mode 100644 index 00000000..ef1edcd5 --- /dev/null +++ b/src/libopus/silk/stereo_encode_pred.c @@ -0,0 +1,62 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Entropy code the mid/side quantization indices */ +void silk_stereo_encode_pred( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ +) +{ + opus_int n; + + /* Entropy coding */ + n = 5 * ix[ 0 ][ 2 ] + ix[ 1 ][ 2 ]; + celt_assert( n < 25 ); + ec_enc_icdf( psRangeEnc, n, silk_stereo_pred_joint_iCDF, 8 ); + for( n = 0; n < 2; n++ ) { + celt_assert( ix[ n ][ 0 ] < 3 ); + celt_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); + ec_enc_icdf( psRangeEnc, ix[ n ][ 0 ], silk_uniform3_iCDF, 8 ); + ec_enc_icdf( psRangeEnc, ix[ n ][ 1 ], silk_uniform5_iCDF, 8 ); + } +} + +/* Entropy code the mid-only flag */ +void silk_stereo_encode_mid_only( + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + opus_int8 mid_only_flag +) +{ + /* Encode flag that only mid channel is coded */ + ec_enc_icdf( psRangeEnc, mid_only_flag, silk_stereo_only_code_mid_iCDF, 8 ); +} diff --git a/src/libopus/silk/stereo_find_predictor.c b/src/libopus/silk/stereo_find_predictor.c new file mode 100644 index 00000000..96cd3e5b --- /dev/null +++ b/src/libopus/silk/stereo_find_predictor.c @@ -0,0 +1,79 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Find least-squares prediction gain for one signal based on another and quantize it */ +opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ + opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ + const opus_int16 x[], /* I Basis signal */ + const opus_int16 y[], /* I Target signal */ + opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ + opus_int length, /* I Number of samples */ + opus_int smooth_coef_Q16 /* I Smoothing coefficient */ +) +{ + opus_int scale, scale1, scale2; + opus_int32 nrgx, nrgy, corr, pred_Q13, pred2_Q10; + + /* Find predictor */ + silk_sum_sqr_shift( &nrgx, &scale1, x, length ); + silk_sum_sqr_shift( &nrgy, &scale2, y, length ); + scale = silk_max_int( scale1, scale2 ); + scale = scale + ( scale & 1 ); /* make even */ + nrgy = silk_RSHIFT32( nrgy, scale - scale2 ); + nrgx = silk_RSHIFT32( nrgx, scale - scale1 ); + nrgx = silk_max_int( nrgx, 1 ); + corr = silk_inner_prod_aligned_scale( x, y, scale, length ); + pred_Q13 = silk_DIV32_varQ( corr, nrgx, 13 ); + pred_Q13 = silk_LIMIT( pred_Q13, -(1 << 14), 1 << 14 ); + pred2_Q10 = silk_SMULWB( pred_Q13, pred_Q13 ); + + /* Faster update for signals with large prediction parameters */ + smooth_coef_Q16 = (opus_int)silk_max_int( smooth_coef_Q16, silk_abs( pred2_Q10 ) ); + + /* Smoothed mid and residual norms */ + silk_assert( smooth_coef_Q16 < 32768 ); + scale = silk_RSHIFT( scale, 1 ); + mid_res_amp_Q0[ 0 ] = silk_SMLAWB( mid_res_amp_Q0[ 0 ], silk_LSHIFT( silk_SQRT_APPROX( nrgx ), scale ) - mid_res_amp_Q0[ 0 ], + smooth_coef_Q16 ); + /* Residual energy = nrgy - 2 * pred * corr + pred^2 * nrgx */ + nrgy = silk_SUB_LSHIFT32( nrgy, silk_SMULWB( corr, pred_Q13 ), 3 + 1 ); + nrgy = silk_ADD_LSHIFT32( nrgy, silk_SMULWB( nrgx, pred2_Q10 ), 6 ); + mid_res_amp_Q0[ 1 ] = silk_SMLAWB( mid_res_amp_Q0[ 1 ], silk_LSHIFT( silk_SQRT_APPROX( nrgy ), scale ) - mid_res_amp_Q0[ 1 ], + smooth_coef_Q16 ); + + /* Ratio of smoothed residual and mid norms */ + *ratio_Q14 = silk_DIV32_varQ( mid_res_amp_Q0[ 1 ], silk_max( mid_res_amp_Q0[ 0 ], 1 ), 14 ); + *ratio_Q14 = silk_LIMIT( *ratio_Q14, 0, 32767 ); + + return pred_Q13; +} diff --git a/src/libopus/silk/stereo_quant_pred.c b/src/libopus/silk/stereo_quant_pred.c new file mode 100644 index 00000000..5f349da2 --- /dev/null +++ b/src/libopus/silk/stereo_quant_pred.c @@ -0,0 +1,73 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "main.h" + +/* Quantize mid/side predictors */ +void silk_stereo_quant_pred( + opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ + opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ +) +{ + opus_int i, j, n; + opus_int32 low_Q13, step_Q13, lvl_Q13, err_min_Q13, err_Q13, quant_pred_Q13 = 0; + + /* Quantize */ + for( n = 0; n < 2; n++ ) { + /* Brute-force search over quantization levels */ + err_min_Q13 = silk_int32_MAX; + for( i = 0; i < STEREO_QUANT_TAB_SIZE - 1; i++ ) { + low_Q13 = silk_stereo_pred_quant_Q13[ i ]; + step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ i + 1 ] - low_Q13, + SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); + for( j = 0; j < STEREO_QUANT_SUB_STEPS; j++ ) { + lvl_Q13 = silk_SMLABB( low_Q13, step_Q13, 2 * j + 1 ); + err_Q13 = silk_abs( pred_Q13[ n ] - lvl_Q13 ); + if( err_Q13 < err_min_Q13 ) { + err_min_Q13 = err_Q13; + quant_pred_Q13 = lvl_Q13; + ix[ n ][ 0 ] = i; + ix[ n ][ 1 ] = j; + } else { + /* Error increasing, so we're past the optimum */ + goto done; + } + } + } + done: + ix[ n ][ 2 ] = silk_DIV32_16( ix[ n ][ 0 ], 3 ); + ix[ n ][ 0 ] -= ix[ n ][ 2 ] * 3; + pred_Q13[ n ] = quant_pred_Q13; + } + + /* Subtract second from first predictor (helps when actually applying these) */ + pred_Q13[ 0 ] -= pred_Q13[ 1 ]; +} diff --git a/src/libopus/silk/structs.h b/src/libopus/silk/structs.h new file mode 100644 index 00000000..38243be1 --- /dev/null +++ b/src/libopus/silk/structs.h @@ -0,0 +1,357 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_STRUCTS_H +#define SILK_STRUCTS_H + +#include "typedef.h" +#include "SigProc_FIX.h" +#include "define.h" +#include "entenc.h" +#include "entdec.h" + +#ifdef ENABLE_DEEP_PLC +#include "lpcnet.h" +#include "lpcnet_private.h" +#endif + +#ifdef ENABLE_DRED +#include "dred_encoder.h" +#include "dred_decoder.h" +#endif + +#ifdef ENABLE_OSCE +#include "osce_config.h" +#include "osce_structs.h" +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************/ +/* Noise shaping quantization state */ +/************************************/ +typedef struct { + opus_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */ + opus_int32 sLTP_shp_Q14[ 2 * MAX_FRAME_LENGTH ]; + opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; + opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; + opus_int32 sLF_AR_shp_Q14; + opus_int32 sDiff_shp_Q14; + opus_int lagPrev; + opus_int sLTP_buf_idx; + opus_int sLTP_shp_buf_idx; + opus_int32 rand_seed; + opus_int32 prev_gain_Q16; + opus_int rewhite_flag; +} silk_nsq_state; + +/********************************/ +/* VAD state */ +/********************************/ +typedef struct { + opus_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */ + opus_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */ + opus_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */ + opus_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */ + opus_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */ + opus_int16 HPstate; /* State of differentiator in the lowest band */ + opus_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */ + opus_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */ + opus_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */ + opus_int32 counter; /* Frame counter used in the initial phase */ +} silk_VAD_state; + +/* Variable cut-off low-pass filter state */ +typedef struct { + opus_int32 In_LP_State[ 2 ]; /* Low pass filter state */ + opus_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ + opus_int mode; /* Operating mode, <0: switch down, >0: switch up; 0: do nothing */ + opus_int32 saved_fs_kHz; /* If non-zero, holds the last sampling rate before a bandwidth switching reset. */ +} silk_LP_state; + +/* Structure containing NLSF codebook */ +typedef struct { + const opus_int16 nVectors; + const opus_int16 order; + const opus_int16 quantStepSize_Q16; + const opus_int16 invQuantStepSize_Q6; + const opus_uint8 *CB1_NLSF_Q8; + const opus_int16 *CB1_Wght_Q9; + const opus_uint8 *CB1_iCDF; + const opus_uint8 *pred_Q8; + const opus_uint8 *ec_sel; + const opus_uint8 *ec_iCDF; + const opus_uint8 *ec_Rates_Q5; + const opus_int16 *deltaMin_Q15; +} silk_NLSF_CB_struct; + +typedef struct { + opus_int16 pred_prev_Q13[ 2 ]; + opus_int16 sMid[ 2 ]; + opus_int16 sSide[ 2 ]; + opus_int32 mid_side_amp_Q0[ 4 ]; + opus_int16 smth_width_Q14; + opus_int16 width_prev_Q14; + opus_int16 silent_side_len; + opus_int8 predIx[ MAX_FRAMES_PER_PACKET ][ 2 ][ 3 ]; + opus_int8 mid_only_flags[ MAX_FRAMES_PER_PACKET ]; +} stereo_enc_state; + +typedef struct { + opus_int16 pred_prev_Q13[ 2 ]; + opus_int16 sMid[ 2 ]; + opus_int16 sSide[ 2 ]; +} stereo_dec_state; + +typedef struct { + opus_int8 GainsIndices[ MAX_NB_SUBFR ]; + opus_int8 LTPIndex[ MAX_NB_SUBFR ]; + opus_int8 NLSFIndices[ MAX_LPC_ORDER + 1 ]; + opus_int16 lagIndex; + opus_int8 contourIndex; + opus_int8 signalType; + opus_int8 quantOffsetType; + opus_int8 NLSFInterpCoef_Q2; + opus_int8 PERIndex; + opus_int8 LTP_scaleIndex; + opus_int8 Seed; +} SideInfoIndices; + +/********************************/ +/* Encoder state */ +/********************************/ +typedef struct { + opus_int32 In_HP_State[ 2 ]; /* High pass filter state */ + opus_int32 variable_HP_smth1_Q15; /* State of first smoother */ + opus_int32 variable_HP_smth2_Q15; /* State of second smoother */ + silk_LP_state sLP; /* Low pass filter state */ + silk_VAD_state sVAD; /* Voice activity detector state */ + silk_nsq_state sNSQ; /* Noise Shape Quantizer State */ + opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */ + opus_int speech_activity_Q8; /* Speech activity */ + opus_int allow_bandwidth_switch; /* Flag indicating that switching of internal bandwidth is allowed */ + opus_int8 LBRRprevLastGainIndex; + opus_int8 prevSignalType; + opus_int prevLag; + opus_int pitch_LPC_win_length; + opus_int max_pitch_lag; /* Highest possible pitch lag (samples) */ + opus_int32 API_fs_Hz; /* API sampling frequency (Hz) */ + opus_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ + opus_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ + opus_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ + opus_int desiredInternal_fs_Hz; /* Soft request for internal sampling frequency (Hz) */ + opus_int fs_kHz; /* Internal sampling frequency (kHz) */ + opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ + opus_int frame_length; /* Frame length (samples) */ + opus_int subfr_length; /* Subframe length (samples) */ + opus_int ltp_mem_length; /* Length of LTP memory */ + opus_int la_pitch; /* Look-ahead for pitch analysis (samples) */ + opus_int la_shape; /* Look-ahead for noise shape analysis (samples) */ + opus_int shapeWinLength; /* Window length for noise shape analysis (samples) */ + opus_int32 TargetRate_bps; /* Target bitrate (bps) */ + opus_int PacketSize_ms; /* Number of milliseconds to put in each packet */ + opus_int PacketLoss_perc; /* Packet loss rate measured by farend */ + opus_int32 frameCounter; + opus_int Complexity; /* Complexity setting */ + opus_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */ + opus_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */ + opus_int shapingLPCOrder; /* Filter order for noise shaping filters */ + opus_int predictLPCOrder; /* Filter order for prediction filters */ + opus_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ + opus_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ + opus_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ + opus_int32 sum_log_gain_Q7; /* Cumulative max prediction gain */ + opus_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ + opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation, pitch prediction */ + opus_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */ + opus_int warping_Q16; /* Warping parameter for warped noise shaping */ + opus_int useCBR; /* Flag to enable constant bitrate */ + opus_int prefillFlag; /* Flag to indicate that only buffers are prefilled, no coding */ + const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ + const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ + const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ + opus_int input_quality_bands_Q15[ VAD_N_BANDS ]; + opus_int input_tilt_Q15; + opus_int SNR_dB_Q7; /* Quality setting */ + + opus_int8 VAD_flags[ MAX_FRAMES_PER_PACKET ]; + opus_int8 LBRR_flag; + opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; + + SideInfoIndices indices; + opus_int8 pulses[ MAX_FRAME_LENGTH ]; + + int arch; + + /* Input/output buffering */ + opus_int16 inputBuf[ MAX_FRAME_LENGTH + 2 ]; /* Buffer containing input signal */ + opus_int inputBufIx; + opus_int nFramesPerPacket; + opus_int nFramesEncoded; /* Number of frames analyzed in current packet */ + + opus_int nChannelsAPI; + opus_int nChannelsInternal; + opus_int channelNb; + + /* Parameters For LTP scaling Control */ + opus_int frames_since_onset; + + /* Specifically for entropy coding */ + opus_int ec_prevSignalType; + opus_int16 ec_prevLagIndex; + + silk_resampler_state_struct resampler_state; + + /* DTX */ + opus_int useDTX; /* Flag to enable DTX */ + opus_int inDTX; /* Flag to signal DTX period */ + opus_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */ + + /* Inband Low Bitrate Redundancy (LBRR) data */ + opus_int useInBandFEC; /* Saves the API setting for query */ + opus_int LBRR_enabled; /* Depends on useInBandFRC, bitrate and packet loss rate */ + opus_int LBRR_GainIncreases; /* Gains increment for coding LBRR frames */ + SideInfoIndices indices_LBRR[ MAX_FRAMES_PER_PACKET ]; + opus_int8 pulses_LBRR[ MAX_FRAMES_PER_PACKET ][ MAX_FRAME_LENGTH ]; +} silk_encoder_state; + + +#ifdef ENABLE_OSCE +typedef struct { + OSCEFeatureState features; + OSCEState state; + int method; +} silk_OSCE_struct; +#endif + +/* Struct for Packet Loss Concealment */ +typedef struct { + opus_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */ + opus_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */ + opus_int16 prevLPC_Q12[ MAX_LPC_ORDER ]; + opus_int last_frame_lost; /* Was previous frame lost */ + opus_int32 rand_seed; /* Seed for unvoiced signal generation */ + opus_int16 randScale_Q14; /* Scaling of unvoiced random signal */ + opus_int32 conc_energy; + opus_int conc_energy_shift; + opus_int16 prevLTP_scale_Q14; + opus_int32 prevGain_Q16[ 2 ]; + opus_int fs_kHz; + opus_int nb_subfr; + opus_int subfr_length; + opus_int enable_deep_plc; +} silk_PLC_struct; + +/* Struct for CNG */ +typedef struct { + opus_int32 CNG_exc_buf_Q14[ MAX_FRAME_LENGTH ]; + opus_int16 CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ]; + opus_int32 CNG_synth_state[ MAX_LPC_ORDER ]; + opus_int32 CNG_smth_Gain_Q16; + opus_int32 rand_seed; + opus_int fs_kHz; +} silk_CNG_struct; + +/********************************/ +/* Decoder state */ +/********************************/ +typedef struct { +#ifdef ENABLE_OSCE + silk_OSCE_struct osce; +#endif +#define SILK_DECODER_STATE_RESET_START prev_gain_Q16 + opus_int32 prev_gain_Q16; + opus_int32 exc_Q14[ MAX_FRAME_LENGTH ]; + opus_int32 sLPC_Q14_buf[ MAX_LPC_ORDER ]; + opus_int16 outBuf[ MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH ]; /* Buffer for output signal */ + opus_int lagPrev; /* Previous Lag */ + opus_int8 LastGainIndex; /* Previous gain index */ + opus_int fs_kHz; /* Sampling frequency in kHz */ + opus_int32 fs_API_hz; /* API sample frequency (Hz) */ + opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ + opus_int frame_length; /* Frame length (samples) */ + opus_int subfr_length; /* Subframe length (samples) */ + opus_int ltp_mem_length; /* Length of LTP memory */ + opus_int LPC_order; /* LPC order */ + opus_int16 prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */ + opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation */ + const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ + const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ + + /* For buffering payload in case of more frames per packet */ + opus_int nFramesDecoded; + opus_int nFramesPerPacket; + + /* Specifically for entropy coding */ + opus_int ec_prevSignalType; + opus_int16 ec_prevLagIndex; + + opus_int VAD_flags[ MAX_FRAMES_PER_PACKET ]; + opus_int LBRR_flag; + opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; + + silk_resampler_state_struct resampler_state; + + const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ + + /* Quantization indices */ + SideInfoIndices indices; + + /* CNG state */ + silk_CNG_struct sCNG; + + /* Stuff used for PLC */ + opus_int lossCnt; + opus_int prevSignalType; + int arch; + + silk_PLC_struct sPLC; + +} silk_decoder_state; + +/************************/ +/* Decoder control */ +/************************/ +typedef struct { + /* Prediction and coding parameters */ + opus_int pitchL[ MAX_NB_SUBFR ]; + opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; + /* Holds interpolated and final coefficients, 4-byte aligned */ + silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; + opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; + opus_int LTP_scale_Q14; +} silk_decoder_control; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/structs_FIX.h b/src/libopus/silk/structs_FIX.h new file mode 100644 index 00000000..e46bd479 --- /dev/null +++ b/src/libopus/silk/structs_FIX.h @@ -0,0 +1 @@ +#include "fixed/structs_FIX.h" diff --git a/src/libopus/silk/sum_sqr_shift.c b/src/libopus/silk/sum_sqr_shift.c new file mode 100644 index 00000000..5b335079 --- /dev/null +++ b/src/libopus/silk/sum_sqr_shift.c @@ -0,0 +1,83 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Compute number of bits to right shift the sum of squares of a vector */ +/* of int16s to make it fit in an int32 */ +void silk_sum_sqr_shift( + opus_int32 *energy, /* O Energy of x, after shifting to the right */ + opus_int *shift, /* O Number of bits right shift applied to energy */ + const opus_int16 *x, /* I Input vector */ + opus_int len /* I Length of input vector */ +) +{ + opus_int i, shft; + opus_uint32 nrg_tmp; + opus_int32 nrg; + + /* Do a first run with the maximum shift we could have. */ + shft = 31-silk_CLZ32(len); + /* Let's be conservative with rounding and start with nrg=len. */ + nrg = len; + for( i = 0; i < len - 1; i += 2 ) { + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + } + if( i < len ) { + /* One sample left to process */ + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + } + silk_assert( nrg >= 0 ); + /* Make sure the result will fit in a 32-bit signed integer with two bits + of headroom. */ + shft = silk_max_32(0, shft+3 - silk_CLZ32(nrg)); + nrg = 0; + for( i = 0 ; i < len - 1; i += 2 ) { + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + } + if( i < len ) { + /* One sample left to process */ + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + } + + silk_assert( nrg >= 0 ); + + /* Output arguments */ + *shift = shft; + *energy = nrg; +} + diff --git a/src/libopus/silk/table_LSF_cos.c b/src/libopus/silk/table_LSF_cos.c new file mode 100644 index 00000000..6608f5d2 --- /dev/null +++ b/src/libopus/silk/table_LSF_cos.c @@ -0,0 +1,70 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +/* Cosine approximation table for LSF conversion */ +/* Q12 values (even) */ +const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ] = { + 8192, 8190, 8182, 8170, + 8152, 8130, 8104, 8072, + 8034, 7994, 7946, 7896, + 7840, 7778, 7714, 7644, + 7568, 7490, 7406, 7318, + 7226, 7128, 7026, 6922, + 6812, 6698, 6580, 6458, + 6332, 6204, 6070, 5934, + 5792, 5648, 5502, 5352, + 5198, 5040, 4880, 4718, + 4552, 4382, 4212, 4038, + 3862, 3684, 3502, 3320, + 3136, 2948, 2760, 2570, + 2378, 2186, 1990, 1794, + 1598, 1400, 1202, 1002, + 802, 602, 402, 202, + 0, -202, -402, -602, + -802, -1002, -1202, -1400, + -1598, -1794, -1990, -2186, + -2378, -2570, -2760, -2948, + -3136, -3320, -3502, -3684, + -3862, -4038, -4212, -4382, + -4552, -4718, -4880, -5040, + -5198, -5352, -5502, -5648, + -5792, -5934, -6070, -6204, + -6332, -6458, -6580, -6698, + -6812, -6922, -7026, -7128, + -7226, -7318, -7406, -7490, + -7568, -7644, -7714, -7778, + -7840, -7896, -7946, -7994, + -8034, -8072, -8104, -8130, + -8152, -8170, -8182, -8190, + -8192 +}; diff --git a/src/libopus/silk/tables.h b/src/libopus/silk/tables.h new file mode 100644 index 00000000..95230c45 --- /dev/null +++ b/src/libopus/silk/tables.h @@ -0,0 +1,114 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_TABLES_H +#define SILK_TABLES_H + +#include "define.h" +#include "structs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Entropy coding tables (with size in bytes indicated) */ +extern const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ]; /* 24 */ +extern const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ]; /* 41 */ + +extern const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ];/* 32 */ +extern const opus_uint8 silk_pitch_delta_iCDF[ 21 ]; /* 21 */ +extern const opus_uint8 silk_pitch_contour_iCDF[ 34 ]; /* 34 */ +extern const opus_uint8 silk_pitch_contour_NB_iCDF[ 11 ]; /* 11 */ +extern const opus_uint8 silk_pitch_contour_10_ms_iCDF[ 12 ]; /* 12 */ +extern const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[ 3 ]; /* 3 */ + +extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ SILK_MAX_PULSES + 2 ]; /* 180 */ +extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ SILK_MAX_PULSES + 2 ]; /* 162 */ + +extern const opus_uint8 silk_rate_levels_iCDF[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ +extern const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ + +extern const opus_uint8 silk_max_pulses_table[ 4 ]; /* 4 */ + +extern const opus_uint8 silk_shell_code_table0[ 152 ]; /* 152 */ +extern const opus_uint8 silk_shell_code_table1[ 152 ]; /* 152 */ +extern const opus_uint8 silk_shell_code_table2[ 152 ]; /* 152 */ +extern const opus_uint8 silk_shell_code_table3[ 152 ]; /* 152 */ +extern const opus_uint8 silk_shell_code_table_offsets[ SILK_MAX_PULSES + 1 ]; /* 17 */ + +extern const opus_uint8 silk_lsb_iCDF[ 2 ]; /* 2 */ + +extern const opus_uint8 silk_sign_iCDF[ 42 ]; /* 42 */ + +extern const opus_uint8 silk_uniform3_iCDF[ 3 ]; /* 3 */ +extern const opus_uint8 silk_uniform4_iCDF[ 4 ]; /* 4 */ +extern const opus_uint8 silk_uniform5_iCDF[ 5 ]; /* 5 */ +extern const opus_uint8 silk_uniform6_iCDF[ 6 ]; /* 6 */ +extern const opus_uint8 silk_uniform8_iCDF[ 8 ]; /* 8 */ + +extern const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ]; /* 7 */ + +extern const opus_uint8 silk_LTP_per_index_iCDF[ 3 ]; /* 3 */ +extern const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[ NB_LTP_CBKS ]; /* 3 */ +extern const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[ NB_LTP_CBKS ]; /* 3 */ +extern const opus_int8 * const silk_LTP_vq_ptrs_Q7[ NB_LTP_CBKS ]; /* 168 */ +extern const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS]; +extern const opus_int8 silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */ + +extern const opus_uint8 silk_LTPscale_iCDF[ 3 ]; /* 4 */ +extern const opus_int16 silk_LTPScales_table_Q14[ 3 ]; /* 6 */ + +extern const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ]; /* 4 */ +extern const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ]; /* 2 */ + +extern const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ]; /* 32 */ +extern const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ]; /* 25 */ +extern const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ]; /* 2 */ + +extern const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ]; /* 10 */ + +extern const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ]; /* 5 */ + +extern const silk_NLSF_CB_struct silk_NLSF_CB_WB; /* 1040 */ +extern const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB; /* 728 */ + +/* Quantization offsets */ +extern const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ]; /* 8 */ + +/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ +extern const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ]; /* 60 */ +extern const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ]; /* 60 */ + +/* Rom table with cosine values */ +extern const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ]; /* 258 */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopus/silk/tables_LTP.c b/src/libopus/silk/tables_LTP.c new file mode 100644 index 00000000..e79edd92 --- /dev/null +++ b/src/libopus/silk/tables_LTP.c @@ -0,0 +1,294 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +const opus_uint8 silk_LTP_per_index_iCDF[3] = { + 179, 99, 0 +}; + +static const opus_uint8 silk_LTP_gain_iCDF_0[8] = { + 71, 56, 43, 30, 21, 12, 6, 0 +}; + +static const opus_uint8 silk_LTP_gain_iCDF_1[16] = { + 199, 165, 144, 124, 109, 96, 84, 71, + 61, 51, 42, 32, 23, 15, 8, 0 +}; + +static const opus_uint8 silk_LTP_gain_iCDF_2[32] = { + 241, 225, 211, 199, 187, 175, 164, 153, + 142, 132, 123, 114, 105, 96, 88, 80, + 72, 64, 57, 50, 44, 38, 33, 29, + 24, 20, 16, 12, 9, 5, 2, 0 +}; + +static const opus_uint8 silk_LTP_gain_BITS_Q5_0[8] = { + 15, 131, 138, 138, 155, 155, 173, 173 +}; + +static const opus_uint8 silk_LTP_gain_BITS_Q5_1[16] = { + 69, 93, 115, 118, 131, 138, 141, 138, + 150, 150, 155, 150, 155, 160, 166, 160 +}; + +static const opus_uint8 silk_LTP_gain_BITS_Q5_2[32] = { + 131, 128, 134, 141, 141, 141, 145, 145, + 145, 150, 155, 155, 155, 155, 160, 160, + 160, 160, 166, 166, 173, 173, 182, 192, + 182, 192, 192, 192, 205, 192, 205, 224 +}; + +const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[NB_LTP_CBKS] = { + silk_LTP_gain_iCDF_0, + silk_LTP_gain_iCDF_1, + silk_LTP_gain_iCDF_2 +}; + +const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[NB_LTP_CBKS] = { + silk_LTP_gain_BITS_Q5_0, + silk_LTP_gain_BITS_Q5_1, + silk_LTP_gain_BITS_Q5_2 +}; + +static const opus_int8 silk_LTP_gain_vq_0[8][5] = +{ +{ + 4, 6, 24, 7, 5 +}, +{ + 0, 0, 2, 0, 0 +}, +{ + 12, 28, 41, 13, -4 +}, +{ + -9, 15, 42, 25, 14 +}, +{ + 1, -2, 62, 41, -9 +}, +{ + -10, 37, 65, -4, 3 +}, +{ + -6, 4, 66, 7, -8 +}, +{ + 16, 14, 38, -3, 33 +} +}; + +static const opus_int8 silk_LTP_gain_vq_1[16][5] = +{ +{ + 13, 22, 39, 23, 12 +}, +{ + -1, 36, 64, 27, -6 +}, +{ + -7, 10, 55, 43, 17 +}, +{ + 1, 1, 8, 1, 1 +}, +{ + 6, -11, 74, 53, -9 +}, +{ + -12, 55, 76, -12, 8 +}, +{ + -3, 3, 93, 27, -4 +}, +{ + 26, 39, 59, 3, -8 +}, +{ + 2, 0, 77, 11, 9 +}, +{ + -8, 22, 44, -6, 7 +}, +{ + 40, 9, 26, 3, 9 +}, +{ + -7, 20, 101, -7, 4 +}, +{ + 3, -8, 42, 26, 0 +}, +{ + -15, 33, 68, 2, 23 +}, +{ + -2, 55, 46, -2, 15 +}, +{ + 3, -1, 21, 16, 41 +} +}; + +static const opus_int8 silk_LTP_gain_vq_2[32][5] = +{ +{ + -6, 27, 61, 39, 5 +}, +{ + -11, 42, 88, 4, 1 +}, +{ + -2, 60, 65, 6, -4 +}, +{ + -1, -5, 73, 56, 1 +}, +{ + -9, 19, 94, 29, -9 +}, +{ + 0, 12, 99, 6, 4 +}, +{ + 8, -19, 102, 46, -13 +}, +{ + 3, 2, 13, 3, 2 +}, +{ + 9, -21, 84, 72, -18 +}, +{ + -11, 46, 104, -22, 8 +}, +{ + 18, 38, 48, 23, 0 +}, +{ + -16, 70, 83, -21, 11 +}, +{ + 5, -11, 117, 22, -8 +}, +{ + -6, 23, 117, -12, 3 +}, +{ + 3, -8, 95, 28, 4 +}, +{ + -10, 15, 77, 60, -15 +}, +{ + -1, 4, 124, 2, -4 +}, +{ + 3, 38, 84, 24, -25 +}, +{ + 2, 13, 42, 13, 31 +}, +{ + 21, -4, 56, 46, -1 +}, +{ + -1, 35, 79, -13, 19 +}, +{ + -7, 65, 88, -9, -14 +}, +{ + 20, 4, 81, 49, -29 +}, +{ + 20, 0, 75, 3, -17 +}, +{ + 5, -9, 44, 92, -8 +}, +{ + 1, -3, 22, 69, 31 +}, +{ + -6, 95, 41, -12, 5 +}, +{ + 39, 67, 16, -4, 1 +}, +{ + 0, -6, 120, 55, -36 +}, +{ + -13, 44, 122, 4, -24 +}, +{ + 81, 5, 11, 3, 7 +}, +{ + 2, 0, 9, 10, 88 +} +}; + +const opus_int8 * const silk_LTP_vq_ptrs_Q7[NB_LTP_CBKS] = { + (opus_int8 *)&silk_LTP_gain_vq_0[0][0], + (opus_int8 *)&silk_LTP_gain_vq_1[0][0], + (opus_int8 *)&silk_LTP_gain_vq_2[0][0] +}; + +/* Maximum frequency-dependent response of the pitch taps above, + computed as max(abs(freqz(taps))) */ +static const opus_uint8 silk_LTP_gain_vq_0_gain[8] = { + 46, 2, 90, 87, 93, 91, 82, 98 +}; + +static const opus_uint8 silk_LTP_gain_vq_1_gain[16] = { + 109, 120, 118, 12, 113, 115, 117, 119, + 99, 59, 87, 111, 63, 111, 112, 80 +}; + +static const opus_uint8 silk_LTP_gain_vq_2_gain[32] = { + 126, 124, 125, 124, 129, 121, 126, 23, + 132, 127, 127, 127, 126, 127, 122, 133, + 130, 134, 101, 118, 119, 145, 126, 86, + 124, 120, 123, 119, 170, 173, 107, 109 +}; + +const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS] = { + &silk_LTP_gain_vq_0_gain[0], + &silk_LTP_gain_vq_1_gain[0], + &silk_LTP_gain_vq_2_gain[0] +}; + +const opus_int8 silk_LTP_vq_sizes[NB_LTP_CBKS] = { + 8, 16, 32 +}; diff --git a/src/libopus/silk/tables_NLSF_CB_NB_MB.c b/src/libopus/silk/tables_NLSF_CB_NB_MB.c new file mode 100644 index 00000000..4ef4e124 --- /dev/null +++ b/src/libopus/silk/tables_NLSF_CB_NB_MB.c @@ -0,0 +1,195 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +static const opus_uint8 silk_NLSF_CB1_NB_MB_Q8[ 320 ] = { + 12, 35, 60, 83, 108, 132, 157, 180, + 206, 228, 15, 32, 55, 77, 101, 125, + 151, 175, 201, 225, 19, 42, 66, 89, + 114, 137, 162, 184, 209, 230, 12, 25, + 50, 72, 97, 120, 147, 172, 200, 223, + 26, 44, 69, 90, 114, 135, 159, 180, + 205, 225, 13, 22, 53, 80, 106, 130, + 156, 180, 205, 228, 15, 25, 44, 64, + 90, 115, 142, 168, 196, 222, 19, 24, + 62, 82, 100, 120, 145, 168, 190, 214, + 22, 31, 50, 79, 103, 120, 151, 170, + 203, 227, 21, 29, 45, 65, 106, 124, + 150, 171, 196, 224, 30, 49, 75, 97, + 121, 142, 165, 186, 209, 229, 19, 25, + 52, 70, 93, 116, 143, 166, 192, 219, + 26, 34, 62, 75, 97, 118, 145, 167, + 194, 217, 25, 33, 56, 70, 91, 113, + 143, 165, 196, 223, 21, 34, 51, 72, + 97, 117, 145, 171, 196, 222, 20, 29, + 50, 67, 90, 117, 144, 168, 197, 221, + 22, 31, 48, 66, 95, 117, 146, 168, + 196, 222, 24, 33, 51, 77, 116, 134, + 158, 180, 200, 224, 21, 28, 70, 87, + 106, 124, 149, 170, 194, 217, 26, 33, + 53, 64, 83, 117, 152, 173, 204, 225, + 27, 34, 65, 95, 108, 129, 155, 174, + 210, 225, 20, 26, 72, 99, 113, 131, + 154, 176, 200, 219, 34, 43, 61, 78, + 93, 114, 155, 177, 205, 229, 23, 29, + 54, 97, 124, 138, 163, 179, 209, 229, + 30, 38, 56, 89, 118, 129, 158, 178, + 200, 231, 21, 29, 49, 63, 85, 111, + 142, 163, 193, 222, 27, 48, 77, 103, + 133, 158, 179, 196, 215, 232, 29, 47, + 74, 99, 124, 151, 176, 198, 220, 237, + 33, 42, 61, 76, 93, 121, 155, 174, + 207, 225, 29, 53, 87, 112, 136, 154, + 170, 188, 208, 227, 24, 30, 52, 84, + 131, 150, 166, 186, 203, 229, 37, 48, + 64, 84, 104, 118, 156, 177, 201, 230 +}; + +static const opus_int16 silk_NLSF_CB1_Wght_Q9[ 320 ] = { + 2897, 2314, 2314, 2314, 2287, 2287, 2314, 2300, 2327, 2287, + 2888, 2580, 2394, 2367, 2314, 2274, 2274, 2274, 2274, 2194, + 2487, 2340, 2340, 2314, 2314, 2314, 2340, 2340, 2367, 2354, + 3216, 2766, 2340, 2340, 2314, 2274, 2221, 2207, 2261, 2194, + 2460, 2474, 2367, 2394, 2394, 2394, 2394, 2367, 2407, 2314, + 3479, 3056, 2127, 2207, 2274, 2274, 2274, 2287, 2314, 2261, + 3282, 3141, 2580, 2394, 2247, 2221, 2207, 2194, 2194, 2114, + 4096, 3845, 2221, 2620, 2620, 2407, 2314, 2394, 2367, 2074, + 3178, 3244, 2367, 2221, 2553, 2434, 2340, 2314, 2167, 2221, + 3338, 3488, 2726, 2194, 2261, 2460, 2354, 2367, 2207, 2101, + 2354, 2420, 2327, 2367, 2394, 2420, 2420, 2420, 2460, 2367, + 3779, 3629, 2434, 2527, 2367, 2274, 2274, 2300, 2207, 2048, + 3254, 3225, 2713, 2846, 2447, 2327, 2300, 2300, 2274, 2127, + 3263, 3300, 2753, 2806, 2447, 2261, 2261, 2247, 2127, 2101, + 2873, 2981, 2633, 2367, 2407, 2354, 2194, 2247, 2247, 2114, + 3225, 3197, 2633, 2580, 2274, 2181, 2247, 2221, 2221, 2141, + 3178, 3310, 2740, 2407, 2274, 2274, 2274, 2287, 2194, 2114, + 3141, 3272, 2460, 2061, 2287, 2500, 2367, 2487, 2434, 2181, + 3507, 3282, 2314, 2700, 2647, 2474, 2367, 2394, 2340, 2127, + 3423, 3535, 3038, 3056, 2300, 1950, 2221, 2274, 2274, 2274, + 3404, 3366, 2087, 2687, 2873, 2354, 2420, 2274, 2474, 2540, + 3760, 3488, 1950, 2660, 2897, 2527, 2394, 2367, 2460, 2261, + 3028, 3272, 2740, 2888, 2740, 2154, 2127, 2287, 2234, 2247, + 3695, 3657, 2025, 1969, 2660, 2700, 2580, 2500, 2327, 2367, + 3207, 3413, 2354, 2074, 2888, 2888, 2340, 2487, 2247, 2167, + 3338, 3366, 2846, 2780, 2327, 2154, 2274, 2287, 2114, 2061, + 2327, 2300, 2181, 2167, 2181, 2367, 2633, 2700, 2700, 2553, + 2407, 2434, 2221, 2261, 2221, 2221, 2340, 2420, 2607, 2700, + 3038, 3244, 2806, 2888, 2474, 2074, 2300, 2314, 2354, 2380, + 2221, 2154, 2127, 2287, 2500, 2793, 2793, 2620, 2580, 2367, + 3676, 3713, 2234, 1838, 2181, 2753, 2726, 2673, 2513, 2207, + 2793, 3160, 2726, 2553, 2846, 2513, 2181, 2394, 2221, 2181 +}; + +static const opus_uint8 silk_NLSF_CB1_iCDF_NB_MB[ 64 ] = { + 212, 178, 148, 129, 108, 96, 85, 82, + 79, 77, 61, 59, 57, 56, 51, 49, + 48, 45, 42, 41, 40, 38, 36, 34, + 31, 30, 21, 12, 10, 3, 1, 0, + 255, 245, 244, 236, 233, 225, 217, 203, + 190, 176, 175, 161, 149, 136, 125, 114, + 102, 91, 81, 71, 60, 52, 43, 35, + 28, 20, 19, 18, 12, 11, 5, 0 +}; + +static const opus_uint8 silk_NLSF_CB2_SELECT_NB_MB[ 160 ] = { + 16, 0, 0, 0, 0, 99, 66, 36, + 36, 34, 36, 34, 34, 34, 34, 83, + 69, 36, 52, 34, 116, 102, 70, 68, + 68, 176, 102, 68, 68, 34, 65, 85, + 68, 84, 36, 116, 141, 152, 139, 170, + 132, 187, 184, 216, 137, 132, 249, 168, + 185, 139, 104, 102, 100, 68, 68, 178, + 218, 185, 185, 170, 244, 216, 187, 187, + 170, 244, 187, 187, 219, 138, 103, 155, + 184, 185, 137, 116, 183, 155, 152, 136, + 132, 217, 184, 184, 170, 164, 217, 171, + 155, 139, 244, 169, 184, 185, 170, 164, + 216, 223, 218, 138, 214, 143, 188, 218, + 168, 244, 141, 136, 155, 170, 168, 138, + 220, 219, 139, 164, 219, 202, 216, 137, + 168, 186, 246, 185, 139, 116, 185, 219, + 185, 138, 100, 100, 134, 100, 102, 34, + 68, 68, 100, 68, 168, 203, 221, 218, + 168, 167, 154, 136, 104, 70, 164, 246, + 171, 137, 139, 137, 155, 218, 219, 139 +}; + +static const opus_uint8 silk_NLSF_CB2_iCDF_NB_MB[ 72 ] = { + 255, 254, 253, 238, 14, 3, 2, 1, + 0, 255, 254, 252, 218, 35, 3, 2, + 1, 0, 255, 254, 250, 208, 59, 4, + 2, 1, 0, 255, 254, 246, 194, 71, + 10, 2, 1, 0, 255, 252, 236, 183, + 82, 8, 2, 1, 0, 255, 252, 235, + 180, 90, 17, 2, 1, 0, 255, 248, + 224, 171, 97, 30, 4, 1, 0, 255, + 254, 236, 173, 95, 37, 7, 1, 0 +}; + +static const opus_uint8 silk_NLSF_CB2_BITS_NB_MB_Q5[ 72 ] = { + 255, 255, 255, 131, 6, 145, 255, 255, + 255, 255, 255, 236, 93, 15, 96, 255, + 255, 255, 255, 255, 194, 83, 25, 71, + 221, 255, 255, 255, 255, 162, 73, 34, + 66, 162, 255, 255, 255, 210, 126, 73, + 43, 57, 173, 255, 255, 255, 201, 125, + 71, 48, 58, 130, 255, 255, 255, 166, + 110, 73, 57, 62, 104, 210, 255, 255, + 251, 123, 65, 55, 68, 100, 171, 255 +}; + +static const opus_uint8 silk_NLSF_PRED_NB_MB_Q8[ 18 ] = { + 179, 138, 140, 148, 151, 149, 153, 151, + 163, 116, 67, 82, 59, 92, 72, 100, + 89, 92 +}; + +static const opus_int16 silk_NLSF_DELTA_MIN_NB_MB_Q15[ 11 ] = { + 250, 3, 6, 3, 3, 3, 4, 3, + 3, 3, 461 +}; + +const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB = +{ + 32, + 10, + SILK_FIX_CONST( 0.18, 16 ), + SILK_FIX_CONST( 1.0 / 0.18, 6 ), + silk_NLSF_CB1_NB_MB_Q8, + silk_NLSF_CB1_Wght_Q9, + silk_NLSF_CB1_iCDF_NB_MB, + silk_NLSF_PRED_NB_MB_Q8, + silk_NLSF_CB2_SELECT_NB_MB, + silk_NLSF_CB2_iCDF_NB_MB, + silk_NLSF_CB2_BITS_NB_MB_Q5, + silk_NLSF_DELTA_MIN_NB_MB_Q15, +}; diff --git a/src/libopus/silk/tables_NLSF_CB_WB.c b/src/libopus/silk/tables_NLSF_CB_WB.c new file mode 100644 index 00000000..1baa75c9 --- /dev/null +++ b/src/libopus/silk/tables_NLSF_CB_WB.c @@ -0,0 +1,234 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +static const opus_uint8 silk_NLSF_CB1_WB_Q8[ 512 ] = { + 7, 23, 38, 54, 69, 85, 100, 116, + 131, 147, 162, 178, 193, 208, 223, 239, + 13, 25, 41, 55, 69, 83, 98, 112, + 127, 142, 157, 171, 187, 203, 220, 236, + 15, 21, 34, 51, 61, 78, 92, 106, + 126, 136, 152, 167, 185, 205, 225, 240, + 10, 21, 36, 50, 63, 79, 95, 110, + 126, 141, 157, 173, 189, 205, 221, 237, + 17, 20, 37, 51, 59, 78, 89, 107, + 123, 134, 150, 164, 184, 205, 224, 240, + 10, 15, 32, 51, 67, 81, 96, 112, + 129, 142, 158, 173, 189, 204, 220, 236, + 8, 21, 37, 51, 65, 79, 98, 113, + 126, 138, 155, 168, 179, 192, 209, 218, + 12, 15, 34, 55, 63, 78, 87, 108, + 118, 131, 148, 167, 185, 203, 219, 236, + 16, 19, 32, 36, 56, 79, 91, 108, + 118, 136, 154, 171, 186, 204, 220, 237, + 11, 28, 43, 58, 74, 89, 105, 120, + 135, 150, 165, 180, 196, 211, 226, 241, + 6, 16, 33, 46, 60, 75, 92, 107, + 123, 137, 156, 169, 185, 199, 214, 225, + 11, 19, 30, 44, 57, 74, 89, 105, + 121, 135, 152, 169, 186, 202, 218, 234, + 12, 19, 29, 46, 57, 71, 88, 100, + 120, 132, 148, 165, 182, 199, 216, 233, + 17, 23, 35, 46, 56, 77, 92, 106, + 123, 134, 152, 167, 185, 204, 222, 237, + 14, 17, 45, 53, 63, 75, 89, 107, + 115, 132, 151, 171, 188, 206, 221, 240, + 9, 16, 29, 40, 56, 71, 88, 103, + 119, 137, 154, 171, 189, 205, 222, 237, + 16, 19, 36, 48, 57, 76, 87, 105, + 118, 132, 150, 167, 185, 202, 218, 236, + 12, 17, 29, 54, 71, 81, 94, 104, + 126, 136, 149, 164, 182, 201, 221, 237, + 15, 28, 47, 62, 79, 97, 115, 129, + 142, 155, 168, 180, 194, 208, 223, 238, + 8, 14, 30, 45, 62, 78, 94, 111, + 127, 143, 159, 175, 192, 207, 223, 239, + 17, 30, 49, 62, 79, 92, 107, 119, + 132, 145, 160, 174, 190, 204, 220, 235, + 14, 19, 36, 45, 61, 76, 91, 108, + 121, 138, 154, 172, 189, 205, 222, 238, + 12, 18, 31, 45, 60, 76, 91, 107, + 123, 138, 154, 171, 187, 204, 221, 236, + 13, 17, 31, 43, 53, 70, 83, 103, + 114, 131, 149, 167, 185, 203, 220, 237, + 17, 22, 35, 42, 58, 78, 93, 110, + 125, 139, 155, 170, 188, 206, 224, 240, + 8, 15, 34, 50, 67, 83, 99, 115, + 131, 146, 162, 178, 193, 209, 224, 239, + 13, 16, 41, 66, 73, 86, 95, 111, + 128, 137, 150, 163, 183, 206, 225, 241, + 17, 25, 37, 52, 63, 75, 92, 102, + 119, 132, 144, 160, 175, 191, 212, 231, + 19, 31, 49, 65, 83, 100, 117, 133, + 147, 161, 174, 187, 200, 213, 227, 242, + 18, 31, 52, 68, 88, 103, 117, 126, + 138, 149, 163, 177, 192, 207, 223, 239, + 16, 29, 47, 61, 76, 90, 106, 119, + 133, 147, 161, 176, 193, 209, 224, 240, + 15, 21, 35, 50, 61, 73, 86, 97, + 110, 119, 129, 141, 175, 198, 218, 237 +}; + +static const opus_int16 silk_NLSF_CB1_WB_Wght_Q9[ 512 ] = { + 3657, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2963, 2963, 2925, 2846, + 3216, 3085, 2972, 3056, 3056, 3010, 3010, 3010, 2963, 2963, 3010, 2972, 2888, 2846, 2846, 2726, + 3920, 4014, 2981, 3207, 3207, 2934, 3056, 2846, 3122, 3244, 2925, 2846, 2620, 2553, 2780, 2925, + 3516, 3197, 3010, 3103, 3019, 2888, 2925, 2925, 2925, 2925, 2888, 2888, 2888, 2888, 2888, 2753, + 5054, 5054, 2934, 3573, 3385, 3056, 3085, 2793, 3160, 3160, 2972, 2846, 2513, 2540, 2753, 2888, + 4428, 4149, 2700, 2753, 2972, 3010, 2925, 2846, 2981, 3019, 2925, 2925, 2925, 2925, 2888, 2726, + 3620, 3019, 2972, 3056, 3056, 2873, 2806, 3056, 3216, 3047, 2981, 3291, 3291, 2981, 3310, 2991, + 5227, 5014, 2540, 3338, 3526, 3385, 3197, 3094, 3376, 2981, 2700, 2647, 2687, 2793, 2846, 2673, + 5081, 5174, 4615, 4428, 2460, 2897, 3047, 3207, 3169, 2687, 2740, 2888, 2846, 2793, 2846, 2700, + 3122, 2888, 2963, 2925, 2925, 2925, 2925, 2963, 2963, 2963, 2963, 2925, 2925, 2963, 2963, 2963, + 4202, 3207, 2981, 3103, 3010, 2888, 2888, 2925, 2972, 2873, 2916, 3019, 2972, 3010, 3197, 2873, + 3760, 3760, 3244, 3103, 2981, 2888, 2925, 2888, 2972, 2934, 2793, 2793, 2846, 2888, 2888, 2660, + 3854, 4014, 3207, 3122, 3244, 2934, 3047, 2963, 2963, 3085, 2846, 2793, 2793, 2793, 2793, 2580, + 3845, 4080, 3357, 3516, 3094, 2740, 3010, 2934, 3122, 3085, 2846, 2846, 2647, 2647, 2846, 2806, + 5147, 4894, 3225, 3845, 3441, 3169, 2897, 3413, 3451, 2700, 2580, 2673, 2740, 2846, 2806, 2753, + 4109, 3789, 3291, 3160, 2925, 2888, 2888, 2925, 2793, 2740, 2793, 2740, 2793, 2846, 2888, 2806, + 5081, 5054, 3047, 3545, 3244, 3056, 3085, 2944, 3103, 2897, 2740, 2740, 2740, 2846, 2793, 2620, + 4309, 4309, 2860, 2527, 3207, 3376, 3376, 3075, 3075, 3376, 3056, 2846, 2647, 2580, 2726, 2753, + 3056, 2916, 2806, 2888, 2740, 2687, 2897, 3103, 3150, 3150, 3216, 3169, 3056, 3010, 2963, 2846, + 4375, 3882, 2925, 2888, 2846, 2888, 2846, 2846, 2888, 2888, 2888, 2846, 2888, 2925, 2888, 2846, + 2981, 2916, 2916, 2981, 2981, 3056, 3122, 3216, 3150, 3056, 3010, 2972, 2972, 2972, 2925, 2740, + 4229, 4149, 3310, 3347, 2925, 2963, 2888, 2981, 2981, 2846, 2793, 2740, 2846, 2846, 2846, 2793, + 4080, 4014, 3103, 3010, 2925, 2925, 2925, 2888, 2925, 2925, 2846, 2846, 2846, 2793, 2888, 2780, + 4615, 4575, 3169, 3441, 3207, 2981, 2897, 3038, 3122, 2740, 2687, 2687, 2687, 2740, 2793, 2700, + 4149, 4269, 3789, 3657, 2726, 2780, 2888, 2888, 3010, 2972, 2925, 2846, 2687, 2687, 2793, 2888, + 4215, 3554, 2753, 2846, 2846, 2888, 2888, 2888, 2925, 2925, 2888, 2925, 2925, 2925, 2963, 2888, + 5174, 4921, 2261, 3432, 3789, 3479, 3347, 2846, 3310, 3479, 3150, 2897, 2460, 2487, 2753, 2925, + 3451, 3685, 3122, 3197, 3357, 3047, 3207, 3207, 2981, 3216, 3085, 2925, 2925, 2687, 2540, 2434, + 2981, 3010, 2793, 2793, 2740, 2793, 2846, 2972, 3056, 3103, 3150, 3150, 3150, 3103, 3010, 3010, + 2944, 2873, 2687, 2726, 2780, 3010, 3432, 3545, 3357, 3244, 3056, 3010, 2963, 2925, 2888, 2846, + 3019, 2944, 2897, 3010, 3010, 2972, 3019, 3103, 3056, 3056, 3010, 2888, 2846, 2925, 2925, 2888, + 3920, 3967, 3010, 3197, 3357, 3216, 3291, 3291, 3479, 3704, 3441, 2726, 2181, 2460, 2580, 2607 +}; + +static const opus_uint8 silk_NLSF_CB1_iCDF_WB[ 64 ] = { + 225, 204, 201, 184, 183, 175, 158, 154, + 153, 135, 119, 115, 113, 110, 109, 99, + 98, 95, 79, 68, 52, 50, 48, 45, + 43, 32, 31, 27, 18, 10, 3, 0, + 255, 251, 235, 230, 212, 201, 196, 182, + 167, 166, 163, 151, 138, 124, 110, 104, + 90, 78, 76, 70, 69, 57, 45, 34, + 24, 21, 11, 6, 5, 4, 3, 0 +}; + +static const opus_uint8 silk_NLSF_CB2_SELECT_WB[ 256 ] = { + 0, 0, 0, 0, 0, 0, 0, 1, + 100, 102, 102, 68, 68, 36, 34, 96, + 164, 107, 158, 185, 180, 185, 139, 102, + 64, 66, 36, 34, 34, 0, 1, 32, + 208, 139, 141, 191, 152, 185, 155, 104, + 96, 171, 104, 166, 102, 102, 102, 132, + 1, 0, 0, 0, 0, 16, 16, 0, + 80, 109, 78, 107, 185, 139, 103, 101, + 208, 212, 141, 139, 173, 153, 123, 103, + 36, 0, 0, 0, 0, 0, 0, 1, + 48, 0, 0, 0, 0, 0, 0, 32, + 68, 135, 123, 119, 119, 103, 69, 98, + 68, 103, 120, 118, 118, 102, 71, 98, + 134, 136, 157, 184, 182, 153, 139, 134, + 208, 168, 248, 75, 189, 143, 121, 107, + 32, 49, 34, 34, 34, 0, 17, 2, + 210, 235, 139, 123, 185, 137, 105, 134, + 98, 135, 104, 182, 100, 183, 171, 134, + 100, 70, 68, 70, 66, 66, 34, 131, + 64, 166, 102, 68, 36, 2, 1, 0, + 134, 166, 102, 68, 34, 34, 66, 132, + 212, 246, 158, 139, 107, 107, 87, 102, + 100, 219, 125, 122, 137, 118, 103, 132, + 114, 135, 137, 105, 171, 106, 50, 34, + 164, 214, 141, 143, 185, 151, 121, 103, + 192, 34, 0, 0, 0, 0, 0, 1, + 208, 109, 74, 187, 134, 249, 159, 137, + 102, 110, 154, 118, 87, 101, 119, 101, + 0, 2, 0, 36, 36, 66, 68, 35, + 96, 164, 102, 100, 36, 0, 2, 33, + 167, 138, 174, 102, 100, 84, 2, 2, + 100, 107, 120, 119, 36, 197, 24, 0 +}; + +static const opus_uint8 silk_NLSF_CB2_iCDF_WB[ 72 ] = { + 255, 254, 253, 244, 12, 3, 2, 1, + 0, 255, 254, 252, 224, 38, 3, 2, + 1, 0, 255, 254, 251, 209, 57, 4, + 2, 1, 0, 255, 254, 244, 195, 69, + 4, 2, 1, 0, 255, 251, 232, 184, + 84, 7, 2, 1, 0, 255, 254, 240, + 186, 86, 14, 2, 1, 0, 255, 254, + 239, 178, 91, 30, 5, 1, 0, 255, + 248, 227, 177, 100, 19, 2, 1, 0 +}; + +static const opus_uint8 silk_NLSF_CB2_BITS_WB_Q5[ 72 ] = { + 255, 255, 255, 156, 4, 154, 255, 255, + 255, 255, 255, 227, 102, 15, 92, 255, + 255, 255, 255, 255, 213, 83, 24, 72, + 236, 255, 255, 255, 255, 150, 76, 33, + 63, 214, 255, 255, 255, 190, 121, 77, + 43, 55, 185, 255, 255, 255, 245, 137, + 71, 43, 59, 139, 255, 255, 255, 255, + 131, 66, 50, 66, 107, 194, 255, 255, + 166, 116, 76, 55, 53, 125, 255, 255 +}; + +static const opus_uint8 silk_NLSF_PRED_WB_Q8[ 30 ] = { + 175, 148, 160, 176, 178, 173, 174, 164, + 177, 174, 196, 182, 198, 192, 182, 68, + 62, 66, 60, 72, 117, 85, 90, 118, + 136, 151, 142, 160, 142, 155 +}; + +static const opus_int16 silk_NLSF_DELTA_MIN_WB_Q15[ 17 ] = { + 100, 3, 40, 3, 3, 3, 5, 14, + 14, 10, 11, 3, 8, 9, 7, 3, + 347 +}; + +const silk_NLSF_CB_struct silk_NLSF_CB_WB = +{ + 32, + 16, + SILK_FIX_CONST( 0.15, 16 ), + SILK_FIX_CONST( 1.0 / 0.15, 6 ), + silk_NLSF_CB1_WB_Q8, + silk_NLSF_CB1_WB_Wght_Q9, + silk_NLSF_CB1_iCDF_WB, + silk_NLSF_PRED_WB_Q8, + silk_NLSF_CB2_SELECT_WB, + silk_NLSF_CB2_iCDF_WB, + silk_NLSF_CB2_BITS_WB_Q5, + silk_NLSF_DELTA_MIN_WB_Q15, +}; + diff --git a/src/libopus/silk/tables_gain.c b/src/libopus/silk/tables_gain.c new file mode 100644 index 00000000..47b659af --- /dev/null +++ b/src/libopus/silk/tables_gain.c @@ -0,0 +1,63 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ] = +{ +{ + 224, 112, 44, 15, 3, 2, 1, 0 +}, +{ + 254, 237, 192, 132, 70, 23, 4, 0 +}, +{ + 255, 252, 226, 155, 61, 11, 2, 0 +} +}; + +const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ] = { + 250, 245, 234, 203, 71, 50, 42, 38, + 35, 33, 31, 29, 28, 27, 26, 25, + 24, 23, 22, 21, 20, 19, 18, 17, + 16, 15, 14, 13, 12, 11, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, + 0 +}; + +#ifdef __cplusplus +} +#endif diff --git a/src/libopus/silk/tables_other.c b/src/libopus/silk/tables_other.c new file mode 100644 index 00000000..045a7e4e --- /dev/null +++ b/src/libopus/silk/tables_other.c @@ -0,0 +1,124 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "structs.h" +#include "define.h" +#include "tables.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Tables for stereo predictor coding */ +const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ] = { + -13732, -10050, -8266, -7526, -6500, -5000, -2950, -820, + 820, 2950, 5000, 6500, 7526, 8266, 10050, 13732 +}; +const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ] = { + 249, 247, 246, 245, 244, + 234, 210, 202, 201, 200, + 197, 174, 82, 59, 56, + 55, 54, 46, 22, 12, + 11, 10, 9, 7, 0 +}; +const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ] = { 64, 0 }; + +/* Tables for LBRR flags */ +static const opus_uint8 silk_LBRR_flags_2_iCDF[ 3 ] = { 203, 150, 0 }; +static const opus_uint8 silk_LBRR_flags_3_iCDF[ 7 ] = { 215, 195, 166, 125, 110, 82, 0 }; +const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ] = { + silk_LBRR_flags_2_iCDF, + silk_LBRR_flags_3_iCDF +}; + +/* Table for LSB coding */ +const opus_uint8 silk_lsb_iCDF[ 2 ] = { 120, 0 }; + +/* Tables for LTPScale */ +const opus_uint8 silk_LTPscale_iCDF[ 3 ] = { 128, 64, 0 }; + +/* Tables for signal type and offset coding */ +const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ] = { + 232, 158, 10, 0 +}; +const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ] = { + 230, 0 +}; + +/* Tables for NLSF interpolation factor */ +const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ] = { 243, 221, 192, 181, 0 }; + +/* Quantization offsets */ +const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = { + { OFFSET_UVL_Q10, OFFSET_UVH_Q10 }, { OFFSET_VL_Q10, OFFSET_VH_Q10 } +}; + +/* Table for LTPScale */ +const opus_int16 silk_LTPScales_table_Q14[ 3 ] = { 15565, 12288, 8192 }; + +/* Uniform entropy tables */ +const opus_uint8 silk_uniform3_iCDF[ 3 ] = { 171, 85, 0 }; +const opus_uint8 silk_uniform4_iCDF[ 4 ] = { 192, 128, 64, 0 }; +const opus_uint8 silk_uniform5_iCDF[ 5 ] = { 205, 154, 102, 51, 0 }; +const opus_uint8 silk_uniform6_iCDF[ 6 ] = { 213, 171, 128, 85, 43, 0 }; +const opus_uint8 silk_uniform8_iCDF[ 8 ] = { 224, 192, 160, 128, 96, 64, 32, 0 }; + +const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ] = { 100, 40, 16, 7, 3, 1, 0 }; + +/* Elliptic/Cauer filters designed with 0.1 dB passband ripple, + 80 dB minimum stopband attenuation, and + [0.95 : 0.15 : 0.35] normalized cut off frequencies. */ + +/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ +const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] = +{ +{ 250767114, 501534038, 250767114 }, +{ 209867381, 419732057, 209867381 }, +{ 170987846, 341967853, 170987846 }, +{ 131531482, 263046905, 131531482 }, +{ 89306658, 178584282, 89306658 } +}; + +/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ +const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] = +{ +{ 506393414, 239854379 }, +{ 411067935, 169683996 }, +{ 306733530, 116694253 }, +{ 185807084, 77959395 }, +{ 35497197, 57401098 } +}; + +#ifdef __cplusplus +} +#endif + diff --git a/src/libopus/silk/tables_pitch_lag.c b/src/libopus/silk/tables_pitch_lag.c new file mode 100644 index 00000000..bb275217 --- /dev/null +++ b/src/libopus/silk/tables_pitch_lag.c @@ -0,0 +1,69 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ] = { + 253, 250, 244, 233, 212, 182, 150, 131, + 120, 110, 98, 85, 72, 60, 49, 40, + 32, 25, 19, 15, 13, 11, 9, 8, + 7, 6, 5, 4, 3, 2, 1, 0 +}; + +const opus_uint8 silk_pitch_delta_iCDF[21] = { + 210, 208, 206, 203, 199, 193, 183, 168, + 142, 104, 74, 52, 37, 27, 20, 14, + 10, 6, 4, 2, 0 +}; + +const opus_uint8 silk_pitch_contour_iCDF[34] = { + 223, 201, 183, 167, 152, 138, 124, 111, + 98, 88, 79, 70, 62, 56, 50, 44, + 39, 35, 31, 27, 24, 21, 18, 16, + 14, 12, 10, 8, 6, 4, 3, 2, + 1, 0 +}; + +const opus_uint8 silk_pitch_contour_NB_iCDF[11] = { + 188, 176, 155, 138, 119, 97, 67, 43, + 26, 10, 0 +}; + +const opus_uint8 silk_pitch_contour_10_ms_iCDF[12] = { + 165, 119, 80, 61, 47, 35, 27, 20, + 14, 9, 4, 0 +}; + +const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[3] = { + 113, 63, 0 +}; + + diff --git a/src/libopus/silk/tables_pulses_per_block.c b/src/libopus/silk/tables_pulses_per_block.c new file mode 100644 index 00000000..83935b02 --- /dev/null +++ b/src/libopus/silk/tables_pulses_per_block.c @@ -0,0 +1,264 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "tables.h" + +const opus_uint8 silk_max_pulses_table[ 4 ] = { + 8, 10, 12, 16 +}; + +const opus_uint8 silk_pulses_per_block_iCDF[ 10 ][ 18 ] = { +{ + 125, 51, 26, 18, 15, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, + 1, 0 +}, +{ + 198, 105, 45, 22, 15, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, + 1, 0 +}, +{ + 213, 162, 116, 83, 59, 43, 32, 24, + 18, 15, 12, 9, 7, 6, 5, 3, + 2, 0 +}, +{ + 239, 187, 116, 59, 28, 16, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, + 1, 0 +}, +{ + 250, 229, 188, 135, 86, 51, 30, 19, + 13, 10, 8, 6, 5, 4, 3, 2, + 1, 0 +}, +{ + 249, 235, 213, 185, 156, 128, 103, 83, + 66, 53, 42, 33, 26, 21, 17, 13, + 10, 0 +}, +{ + 254, 249, 235, 206, 164, 118, 77, 46, + 27, 16, 10, 7, 5, 4, 3, 2, + 1, 0 +}, +{ + 255, 253, 249, 239, 220, 191, 156, 119, + 85, 57, 37, 23, 15, 10, 6, 4, + 2, 0 +}, +{ + 255, 253, 251, 246, 237, 223, 203, 179, + 152, 124, 98, 75, 55, 40, 29, 21, + 15, 0 +}, +{ + 255, 254, 253, 247, 220, 162, 106, 67, + 42, 28, 18, 12, 9, 6, 4, 3, + 2, 0 +} +}; + +const opus_uint8 silk_pulses_per_block_BITS_Q5[ 9 ][ 18 ] = { +{ + 31, 57, 107, 160, 205, 205, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255 +}, +{ + 69, 47, 67, 111, 166, 205, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255 +}, +{ + 82, 74, 79, 95, 109, 128, 145, 160, + 173, 205, 205, 205, 224, 255, 255, 224, + 255, 224 +}, +{ + 125, 74, 59, 69, 97, 141, 182, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255 +}, +{ + 173, 115, 85, 73, 76, 92, 115, 145, + 173, 205, 224, 224, 255, 255, 255, 255, + 255, 255 +}, +{ + 166, 134, 113, 102, 101, 102, 107, 118, + 125, 138, 145, 155, 166, 182, 192, 192, + 205, 150 +}, +{ + 224, 182, 134, 101, 83, 79, 85, 97, + 120, 145, 173, 205, 224, 255, 255, 255, + 255, 255 +}, +{ + 255, 224, 192, 150, 120, 101, 92, 89, + 93, 102, 118, 134, 160, 182, 192, 224, + 224, 224 +}, +{ + 255, 224, 224, 182, 155, 134, 118, 109, + 104, 102, 106, 111, 118, 131, 145, 160, + 173, 131 +} +}; + +const opus_uint8 silk_rate_levels_iCDF[ 2 ][ 9 ] = +{ +{ + 241, 190, 178, 132, 87, 74, 41, 14, + 0 +}, +{ + 223, 193, 157, 140, 106, 57, 39, 18, + 0 +} +}; + +const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ 9 ] = +{ +{ + 131, 74, 141, 79, 80, 138, 95, 104, + 134 +}, +{ + 95, 99, 91, 125, 93, 76, 123, 115, + 123 +} +}; + +const opus_uint8 silk_shell_code_table0[ 152 ] = { + 128, 0, 214, 42, 0, 235, 128, 21, + 0, 244, 184, 72, 11, 0, 248, 214, + 128, 42, 7, 0, 248, 225, 170, 80, + 25, 5, 0, 251, 236, 198, 126, 54, + 18, 3, 0, 250, 238, 211, 159, 82, + 35, 15, 5, 0, 250, 231, 203, 168, + 128, 88, 53, 25, 6, 0, 252, 238, + 216, 185, 148, 108, 71, 40, 18, 4, + 0, 253, 243, 225, 199, 166, 128, 90, + 57, 31, 13, 3, 0, 254, 246, 233, + 212, 183, 147, 109, 73, 44, 23, 10, + 2, 0, 255, 250, 240, 223, 198, 166, + 128, 90, 58, 33, 16, 6, 1, 0, + 255, 251, 244, 231, 210, 181, 146, 110, + 75, 46, 25, 12, 5, 1, 0, 255, + 253, 248, 238, 221, 196, 164, 128, 92, + 60, 35, 18, 8, 3, 1, 0, 255, + 253, 249, 242, 229, 208, 180, 146, 110, + 76, 48, 27, 14, 7, 3, 1, 0 +}; + +const opus_uint8 silk_shell_code_table1[ 152 ] = { + 129, 0, 207, 50, 0, 236, 129, 20, + 0, 245, 185, 72, 10, 0, 249, 213, + 129, 42, 6, 0, 250, 226, 169, 87, + 27, 4, 0, 251, 233, 194, 130, 62, + 20, 4, 0, 250, 236, 207, 160, 99, + 47, 17, 3, 0, 255, 240, 217, 182, + 131, 81, 41, 11, 1, 0, 255, 254, + 233, 201, 159, 107, 61, 20, 2, 1, + 0, 255, 249, 233, 206, 170, 128, 86, + 50, 23, 7, 1, 0, 255, 250, 238, + 217, 186, 148, 108, 70, 39, 18, 6, + 1, 0, 255, 252, 243, 226, 200, 166, + 128, 90, 56, 30, 13, 4, 1, 0, + 255, 252, 245, 231, 209, 180, 146, 110, + 76, 47, 25, 11, 4, 1, 0, 255, + 253, 248, 237, 219, 194, 163, 128, 93, + 62, 37, 19, 8, 3, 1, 0, 255, + 254, 250, 241, 226, 205, 177, 145, 111, + 79, 51, 30, 15, 6, 2, 1, 0 +}; + +const opus_uint8 silk_shell_code_table2[ 152 ] = { + 129, 0, 203, 54, 0, 234, 129, 23, + 0, 245, 184, 73, 10, 0, 250, 215, + 129, 41, 5, 0, 252, 232, 173, 86, + 24, 3, 0, 253, 240, 200, 129, 56, + 15, 2, 0, 253, 244, 217, 164, 94, + 38, 10, 1, 0, 253, 245, 226, 189, + 132, 71, 27, 7, 1, 0, 253, 246, + 231, 203, 159, 105, 56, 23, 6, 1, + 0, 255, 248, 235, 213, 179, 133, 85, + 47, 19, 5, 1, 0, 255, 254, 243, + 221, 194, 159, 117, 70, 37, 12, 2, + 1, 0, 255, 254, 248, 234, 208, 171, + 128, 85, 48, 22, 8, 2, 1, 0, + 255, 254, 250, 240, 220, 189, 149, 107, + 67, 36, 16, 6, 2, 1, 0, 255, + 254, 251, 243, 227, 201, 166, 128, 90, + 55, 29, 13, 5, 2, 1, 0, 255, + 254, 252, 246, 234, 213, 183, 147, 109, + 73, 43, 22, 10, 4, 2, 1, 0 +}; + +const opus_uint8 silk_shell_code_table3[ 152 ] = { + 130, 0, 200, 58, 0, 231, 130, 26, + 0, 244, 184, 76, 12, 0, 249, 214, + 130, 43, 6, 0, 252, 232, 173, 87, + 24, 3, 0, 253, 241, 203, 131, 56, + 14, 2, 0, 254, 246, 221, 167, 94, + 35, 8, 1, 0, 254, 249, 232, 193, + 130, 65, 23, 5, 1, 0, 255, 251, + 239, 211, 162, 99, 45, 15, 4, 1, + 0, 255, 251, 243, 223, 186, 131, 74, + 33, 11, 3, 1, 0, 255, 252, 245, + 230, 202, 158, 105, 57, 24, 8, 2, + 1, 0, 255, 253, 247, 235, 214, 179, + 132, 84, 44, 19, 7, 2, 1, 0, + 255, 254, 250, 240, 223, 196, 159, 112, + 69, 36, 15, 6, 2, 1, 0, 255, + 254, 253, 245, 231, 209, 176, 136, 93, + 55, 27, 11, 3, 2, 1, 0, 255, + 254, 253, 252, 239, 221, 194, 158, 117, + 76, 42, 18, 4, 3, 2, 1, 0 +}; + +const opus_uint8 silk_shell_code_table_offsets[ 17 ] = { + 0, 0, 2, 5, 9, 14, 20, 27, + 35, 44, 54, 65, 77, 90, 104, 119, + 135 +}; + +const opus_uint8 silk_sign_iCDF[ 42 ] = { + 254, 49, 67, 77, 82, 93, 99, + 198, 11, 18, 24, 31, 36, 45, + 255, 46, 66, 78, 87, 94, 104, + 208, 14, 21, 32, 42, 51, 66, + 255, 94, 104, 109, 112, 115, 118, + 248, 53, 69, 80, 88, 95, 102 +}; diff --git a/src/libopus/silk/tuning_parameters.h b/src/libopus/silk/tuning_parameters.h new file mode 100644 index 00000000..d70275fd --- /dev/null +++ b/src/libopus/silk/tuning_parameters.h @@ -0,0 +1,155 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_TUNING_PARAMETERS_H +#define SILK_TUNING_PARAMETERS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Decay time for bitreservoir */ +#define BITRESERVOIR_DECAY_TIME_MS 500 + +/*******************/ +/* Pitch estimator */ +/*******************/ + +/* Level of noise floor for whitening filter LPC analysis in pitch analysis */ +#define FIND_PITCH_WHITE_NOISE_FRACTION 1e-3f + +/* Bandwidth expansion for whitening filter in pitch analysis */ +#define FIND_PITCH_BANDWIDTH_EXPANSION 0.99f + +/*********************/ +/* Linear prediction */ +/*********************/ + +/* LPC analysis regularization */ +#define FIND_LPC_COND_FAC 1e-5f + +/* Max cumulative LTP gain */ +#define MAX_SUM_LOG_GAIN_DB 250.0f + +/* LTP analysis defines */ +#define LTP_CORR_INV_MAX 0.03f + +/***********************/ +/* High pass filtering */ +/***********************/ + +/* Smoothing parameters for low end of pitch frequency range estimation */ +#define VARIABLE_HP_SMTH_COEF1 0.1f +#define VARIABLE_HP_SMTH_COEF2 0.015f +#define VARIABLE_HP_MAX_DELTA_FREQ 0.4f + +/* Min and max cut-off frequency values (-3 dB points) */ +#define VARIABLE_HP_MIN_CUTOFF_HZ 60 +#define VARIABLE_HP_MAX_CUTOFF_HZ 100 + +/***********/ +/* Various */ +/***********/ + +/* VAD threshold */ +#define SPEECH_ACTIVITY_DTX_THRES 0.05f + +/* Speech Activity LBRR enable threshold */ +#define LBRR_SPEECH_ACTIVITY_THRES 0.3f + +/*************************/ +/* Perceptual parameters */ +/*************************/ + +/* reduction in coding SNR during low speech activity */ +#define BG_SNR_DECR_dB 2.0f + +/* factor for reducing quantization noise during voiced speech */ +#define HARM_SNR_INCR_dB 2.0f + +/* factor for reducing quantization noise for unvoiced sparse signals */ +#define SPARSE_SNR_INCR_dB 2.0f + +/* threshold for sparseness measure above which to use lower quantization offset during unvoiced */ +#define ENERGY_VARIATION_THRESHOLD_QNT_OFFSET 0.6f + +/* warping control */ +#define WARPING_MULTIPLIER 0.015f + +/* fraction added to first autocorrelation value */ +#define SHAPE_WHITE_NOISE_FRACTION 3e-5f + +/* noise shaping filter chirp factor */ +#define BANDWIDTH_EXPANSION 0.94f + +/* harmonic noise shaping */ +#define HARMONIC_SHAPING 0.3f + +/* extra harmonic noise shaping for high bitrates or noisy input */ +#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING 0.2f + +/* parameter for shaping noise towards higher frequencies */ +#define HP_NOISE_COEF 0.25f + +/* parameter for shaping noise even more towards higher frequencies during voiced speech */ +#define HARM_HP_NOISE_COEF 0.35f + +/* parameter for applying a high-pass tilt to the input signal */ +#define INPUT_TILT 0.05f + +/* parameter for extra high-pass tilt to the input signal at high rates */ +#define HIGH_RATE_INPUT_TILT 0.1f + +/* parameter for reducing noise at the very low frequencies */ +#define LOW_FREQ_SHAPING 4.0f + +/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */ +#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR 0.5f + +/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */ +#define SUBFR_SMTH_COEF 0.4f + +/* parameters defining the R/D tradeoff in the residual quantizer */ +#define LAMBDA_OFFSET 1.2f +#define LAMBDA_SPEECH_ACT -0.2f +#define LAMBDA_DELAYED_DECISIONS -0.05f +#define LAMBDA_INPUT_QUALITY -0.1f +#define LAMBDA_CODING_QUALITY -0.2f +#define LAMBDA_QUANT_OFFSET 0.8f + +/* Compensation in bitrate calculations for 10 ms modes */ +#define REDUCE_BITRATE_10_MS_BPS 2200 + +/* Maximum time before allowing a bandwidth transition */ +#define MAX_BANDWIDTH_SWITCH_DELAY_MS 5000 + +#ifdef __cplusplus +} +#endif + +#endif /* SILK_TUNING_PARAMETERS_H */ diff --git a/src/libopus/silk/typedef.h b/src/libopus/silk/typedef.h new file mode 100644 index 00000000..793d2c0c --- /dev/null +++ b/src/libopus/silk/typedef.h @@ -0,0 +1,81 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- 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. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 SILK_TYPEDEF_H +#define SILK_TYPEDEF_H + +#include "opus_types.h" +#include "opus_defines.h" + +#ifndef FIXED_POINT +# include +# define silk_float float +# define silk_float_MAX FLT_MAX +#endif + +#define silk_int64_MAX ((opus_int64)0x7FFFFFFFFFFFFFFFLL) /* 2^63 - 1 */ +#define silk_int64_MIN ((opus_int64)0x8000000000000000LL) /* -2^63 */ +#define silk_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647 */ +#define silk_int32_MIN ((opus_int32)0x80000000) /* -2^31 = -2147483648 */ +#define silk_int16_MAX 0x7FFF /* 2^15 - 1 = 32767 */ +#define silk_int16_MIN ((opus_int16)0x8000) /* -2^15 = -32768 */ +#define silk_int8_MAX 0x7F /* 2^7 - 1 = 127 */ +#define silk_int8_MIN ((opus_int8)0x80) /* -2^7 = -128 */ +#define silk_uint8_MAX 0xFF /* 2^8 - 1 = 255 */ + +#define silk_TRUE 1 +#define silk_FALSE 0 + +/* assertions */ +#if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS)) +# ifndef silk_assert +# include /* ASSERTE() */ +# define silk_assert(COND) _ASSERTE(COND) +# endif +#else +# ifdef ENABLE_ASSERTIONS +# include +# include +#define silk_fatal(str) _silk_fatal(str, __FILE__, __LINE__); +#ifdef __GNUC__ +__attribute__((noreturn)) +#endif +static OPUS_INLINE void _silk_fatal(const char *str, const char *file, int line) +{ + fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); +#if defined(_MSC_VER) + _set_abort_behavior( 0, _WRITE_ABORT_MSG); +#endif + abort(); +} +# define silk_assert(COND) {if (!(COND)) {silk_fatal("assertion failed: " #COND);}} +# else +# define silk_assert(COND) +# endif +#endif + +#endif /* SILK_TYPEDEF_H */ diff --git a/src/libopus/src/API.h b/src/libopus/src/API.h new file mode 100644 index 00000000..55ab447a --- /dev/null +++ b/src/libopus/src/API.h @@ -0,0 +1 @@ +#include "../silk/API.h" diff --git a/src/libopus/src/arch.h b/src/libopus/src/arch.h new file mode 100644 index 00000000..0530293d --- /dev/null +++ b/src/libopus/src/arch.h @@ -0,0 +1 @@ +#include "../celt/arch.h" diff --git a/src/libopus/src/celt.h b/src/libopus/src/celt.h new file mode 100644 index 00000000..f66c3ba0 --- /dev/null +++ b/src/libopus/src/celt.h @@ -0,0 +1 @@ +#include "../celt/celt.h" diff --git a/src/libopus/src/config.h b/src/libopus/src/config.h new file mode 100644 index 00000000..2989b6b0 --- /dev/null +++ b/src/libopus/src/config.h @@ -0,0 +1 @@ +#include "../include/config.h" diff --git a/src/libopus/src/cpu_support.h b/src/libopus/src/cpu_support.h new file mode 100644 index 00000000..32e7df22 --- /dev/null +++ b/src/libopus/src/cpu_support.h @@ -0,0 +1 @@ +#include "../celt/cpu_support.h" diff --git a/src/libopus/src/define.h b/src/libopus/src/define.h new file mode 100644 index 00000000..3a4554e1 --- /dev/null +++ b/src/libopus/src/define.h @@ -0,0 +1 @@ +#include "../silk/define.h" diff --git a/src/libopus/src/entdec.h b/src/libopus/src/entdec.h new file mode 100644 index 00000000..07f6c038 --- /dev/null +++ b/src/libopus/src/entdec.h @@ -0,0 +1 @@ +#include "../celt/entdec.h" diff --git a/src/libopus/src/float_cast.h b/src/libopus/src/float_cast.h new file mode 100644 index 00000000..84ec9349 --- /dev/null +++ b/src/libopus/src/float_cast.h @@ -0,0 +1 @@ +#include "../celt/float_cast.h" diff --git a/src/libopus/src/mathops.h b/src/libopus/src/mathops.h new file mode 100644 index 00000000..f4dee750 --- /dev/null +++ b/src/libopus/src/mathops.h @@ -0,0 +1 @@ +#include "../celt/mathops.h" diff --git a/src/libopus/src/modes.h b/src/libopus/src/modes.h new file mode 100644 index 00000000..5623259a --- /dev/null +++ b/src/libopus/src/modes.h @@ -0,0 +1 @@ +#include "../celt/modes.h" diff --git a/src/libopus/src/opus.c b/src/libopus/src/opus.c new file mode 100644 index 00000000..c08de753 --- /dev/null +++ b/src/libopus/src/opus.c @@ -0,0 +1,362 @@ +/* Copyright (c) 2011 Xiph.Org Foundation, Skype Limited + Written by Jean-Marc Valin and Koen Vos */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 __STDC__ +#include "config.h" +#endif + +#include "opus.h" +#include "opus_private.h" + +#ifndef DISABLE_FLOAT_API +OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem) +{ + int c; + int i; + float *x; + + if (C<1 || N<1 || !_x || !declip_mem) return; + + /* First thing: saturate everything to +/- 2 which is the highest level our + non-linearity can handle. At the point where the signal reaches +/-2, + the derivative will be zero anyway, so this doesn't introduce any + discontinuity in the derivative. */ + for (i=0;i=0) + break; + x[i*C] = x[i*C]+a*x[i*C]*x[i*C]; + } + + curr=0; + x0 = x[0]; + while(1) + { + int start, end; + float maxval; + int special=0; + int peak_pos; + for (i=curr;i1 || x[i*C]<-1) + break; + } + if (i==N) + { + a=0; + break; + } + peak_pos = i; + start=end=i; + maxval=ABS16(x[i*C]); + /* Look for first zero crossing before clipping */ + while (start>0 && x[i*C]*x[(start-1)*C]>=0) + start--; + /* Look for first zero crossing after clipping */ + while (end=0) + { + /* Look for other peaks until the next zero-crossing. */ + if (ABS16(x[end*C])>maxval) + { + maxval = ABS16(x[end*C]); + peak_pos = end; + } + end++; + } + /* Detect the special case where we clip before the first zero crossing */ + special = (start==0 && x[i*C]*x[0]>=0); + + /* Compute a such that maxval + a*maxval^2 = 1 */ + a=(maxval-1)/(maxval*maxval); + /* Slightly boost "a" by 2^-22. This is just enough to ensure -ffast-math + does not cause output values larger than +/-1, but small enough not + to matter even for 24-bit output. */ + a += a*2.4e-7f; + if (x[i*C]>0) + a = -a; + /* Apply soft clipping */ + for (i=start;i=2) + { + /* Add a linear ramp from the first sample to the signal peak. + This avoids a discontinuity at the beginning of the frame. */ + float delta; + float offset = x0-x[0]; + delta = offset / peak_pos; + for (i=curr;i>2; + return 2; + } +} + +static int parse_size(const unsigned char *data, opus_int32 len, opus_int16 *size) +{ + if (len<1) + { + *size = -1; + return -1; + } else if (data[0]<252) + { + *size = data[0]; + return 1; + } else if (len<2) + { + *size = -1; + return -1; + } else { + *size = 4*data[1] + data[0]; + return 2; + } +} + +int opus_packet_get_samples_per_frame(const unsigned char *data, + opus_int32 Fs) +{ + int audiosize; + if (data[0]&0x80) + { + audiosize = ((data[0]>>3)&0x3); + audiosize = (Fs<>3)&0x3); + if (audiosize == 3) + audiosize = Fs*60/1000; + else + audiosize = (Fs< len) + return OPUS_INVALID_PACKET; + data += bytes; + last_size = len-size[0]; + break; + /* Multiple CBR/VBR frames (from 0 to 120 ms) */ + default: /*case 3:*/ + if (len<1) + return OPUS_INVALID_PACKET; + /* Number of frames encoded in bits 0 to 5 */ + ch = *data++; + count = ch&0x3F; + if (count <= 0 || framesize*(opus_int32)count > 5760) + return OPUS_INVALID_PACKET; + len--; + /* Padding flag is bit 6 */ + if (ch&0x40) + { + int p; + do { + int tmp; + if (len<=0) + return OPUS_INVALID_PACKET; + p = *data++; + len--; + tmp = p==255 ? 254: p; + len -= tmp; + pad += tmp; + } while (p==255); + } + if (len<0) + return OPUS_INVALID_PACKET; + /* VBR flag is bit 7 */ + cbr = !(ch&0x80); + if (!cbr) + { + /* VBR case */ + last_size = len; + for (i=0;i len) + return OPUS_INVALID_PACKET; + data += bytes; + last_size -= bytes+size[i]; + } + if (last_size<0) + return OPUS_INVALID_PACKET; + } else if (!self_delimited) + { + /* CBR case */ + last_size = len/count; + if (last_size*count!=len) + return OPUS_INVALID_PACKET; + for (i=0;i len) + return OPUS_INVALID_PACKET; + data += bytes; + /* For CBR packets, apply the size to all the frames. */ + if (cbr) + { + if (size[count-1]*count > len) + return OPUS_INVALID_PACKET; + for (i=0;i last_size) + return OPUS_INVALID_PACKET; + } else + { + /* Because it's not encoded explicitly, it's possible the size of the + last packet (or all the packets, for the CBR case) is larger than + 1275. Reject them here.*/ + if (last_size > 1275) + return OPUS_INVALID_PACKET; + size[count-1] = (opus_int16)last_size; + } + + if (payload_offset) + *payload_offset = (int)(data-data0); + + for (i=0;i= 2) && !defined(__OPTIMIZE__) && !defined(OPUS_WILL_BE_SLOW) +# pragma message "You appear to be compiling without optimization, if so opus will be very slow." +#endif + +#include +#include "celt.h" +#include "opus.h" +#include "entdec.h" +#include "modes.h" +#include "API.h" +#include "stack_alloc.h" +#include "float_cast.h" +#include "opus_private.h" +#include "os_support.h" +#include "structs.h" +#include "define.h" +#include "mathops.h" +#include "cpu_support.h" + +#ifdef ENABLE_DEEP_PLC +#include "dred_rdovae_dec_data.h" +#include "dred_rdovae_dec.h" +#endif + +#ifdef ENABLE_OSCE +#include "osce.h" +#endif + +struct OpusDecoder { + int celt_dec_offset; + int silk_dec_offset; + int channels; + opus_int32 Fs; /** Sampling rate (at the API level) */ + silk_DecControlStruct DecControl; + int decode_gain; + int complexity; + int arch; +#ifdef ENABLE_DEEP_PLC + LPCNetPLCState lpcnet; +#endif + + /* Everything beyond this point gets cleared on a reset */ +#define OPUS_DECODER_RESET_START stream_channels + int stream_channels; + + int bandwidth; + int mode; + int prev_mode; + int frame_size; + int prev_redundancy; + int last_packet_duration; +#ifndef FIXED_POINT + opus_val16 softclip_mem[2]; +#endif + + opus_uint32 rangeFinal; +}; + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +static void validate_opus_decoder(OpusDecoder *st) +{ + celt_assert(st->channels == 1 || st->channels == 2); + celt_assert(st->Fs == 48000 || st->Fs == 24000 || st->Fs == 16000 || st->Fs == 12000 || st->Fs == 8000); + celt_assert(st->DecControl.API_sampleRate == st->Fs); + celt_assert(st->DecControl.internalSampleRate == 0 || st->DecControl.internalSampleRate == 16000 || st->DecControl.internalSampleRate == 12000 || st->DecControl.internalSampleRate == 8000); + celt_assert(st->DecControl.nChannelsAPI == st->channels); + celt_assert(st->DecControl.nChannelsInternal == 0 || st->DecControl.nChannelsInternal == 1 || st->DecControl.nChannelsInternal == 2); + celt_assert(st->DecControl.payloadSize_ms == 0 || st->DecControl.payloadSize_ms == 10 || st->DecControl.payloadSize_ms == 20 || st->DecControl.payloadSize_ms == 40 || st->DecControl.payloadSize_ms == 60); +#ifdef OPUS_ARCHMASK + celt_assert(st->arch >= 0); + celt_assert(st->arch <= OPUS_ARCHMASK); +#endif + celt_assert(st->stream_channels == 1 || st->stream_channels == 2); +} +#define VALIDATE_OPUS_DECODER(st) validate_opus_decoder(st) +#else +#define VALIDATE_OPUS_DECODER(st) +#endif + +int opus_decoder_get_size(int channels) +{ + int silkDecSizeBytes, celtDecSizeBytes; + int ret; + if (channels<1 || channels > 2) + return 0; + ret = silk_Get_Decoder_Size( &silkDecSizeBytes ); + if(ret) + return 0; + silkDecSizeBytes = align(silkDecSizeBytes); + celtDecSizeBytes = celt_decoder_get_size(channels); + return align(sizeof(OpusDecoder))+silkDecSizeBytes+celtDecSizeBytes; +} + +int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) +{ + void *silk_dec; + CELTDecoder *celt_dec; + int ret, silkDecSizeBytes; + + if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) + || (channels!=1&&channels!=2)) + return OPUS_BAD_ARG; + + OPUS_CLEAR((char*)st, opus_decoder_get_size(channels)); + /* Initialize SILK decoder */ + ret = silk_Get_Decoder_Size(&silkDecSizeBytes); + if (ret) + return OPUS_INTERNAL_ERROR; + + silkDecSizeBytes = align(silkDecSizeBytes); + st->silk_dec_offset = align(sizeof(OpusDecoder)); + st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes; + silk_dec = (char*)st+st->silk_dec_offset; + celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); + st->stream_channels = st->channels = channels; + st->complexity = 0; + + st->Fs = Fs; + st->DecControl.API_sampleRate = st->Fs; + st->DecControl.nChannelsAPI = st->channels; + + /* Reset decoder */ + ret = silk_InitDecoder( silk_dec ); + if(ret)return OPUS_INTERNAL_ERROR; + + /* Initialize CELT decoder */ + ret = celt_decoder_init(celt_dec, Fs, channels); + if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR; + + celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0)); + + st->prev_mode = 0; + st->frame_size = Fs/400; +#ifdef ENABLE_DEEP_PLC + lpcnet_plc_init( &st->lpcnet); +#endif + st->arch = opus_select_arch(); + return OPUS_OK; +} + +OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error) +{ + int ret; + OpusDecoder *st; + if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) + || (channels!=1&&channels!=2)) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + st = (OpusDecoder *)opus_alloc(opus_decoder_get_size(channels)); + if (st == NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + ret = opus_decoder_init(st, Fs, channels); + if (error) + *error = ret; + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + return st; +} + +static void smooth_fade(const opus_val16 *in1, const opus_val16 *in2, + opus_val16 *out, int overlap, int channels, + const opus_val16 *window, opus_int32 Fs) +{ + int i, c; + int inc = 48000/Fs; + for (c=0;csilk_dec_offset; + celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); + F20 = st->Fs/50; + F10 = F20>>1; + F5 = F10>>1; + F2_5 = F5>>1; + if (frame_size < F2_5) + { + RESTORE_STACK; + return OPUS_BUFFER_TOO_SMALL; + } + /* Limit frame_size to avoid excessive stack allocations. */ + frame_size = IMIN(frame_size, st->Fs/25*3); + /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */ + if (len<=1) + { + data = NULL; + /* In that case, don't conceal more than what the ToC says */ + frame_size = IMIN(frame_size, st->frame_size); + } + if (data != NULL) + { + audiosize = st->frame_size; + mode = st->mode; + bandwidth = st->bandwidth; + ec_dec_init(&dec,(unsigned char*)data,len); + } else { + audiosize = frame_size; + /* Run PLC using last used mode (CELT if we ended with CELT redundancy) */ + mode = st->prev_redundancy ? MODE_CELT_ONLY : st->prev_mode; + bandwidth = 0; + + if (mode == 0) + { + /* If we haven't got any packet yet, all we can do is return zeros */ + for (i=0;ichannels;i++) + pcm[i] = 0; + RESTORE_STACK; + return audiosize; + } + + /* Avoids trying to run the PLC on sizes other than 2.5 (CELT), 5 (CELT), + 10, or 20 (e.g. 12.5 or 30 ms). */ + if (audiosize > F20) + { + do { + int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20), 0); + if (ret<0) + { + RESTORE_STACK; + return ret; + } + pcm += ret*st->channels; + audiosize -= ret; + } while (audiosize > 0); + RESTORE_STACK; + return frame_size; + } else if (audiosize < F20) + { + if (audiosize > F10) + audiosize = F10; + else if (mode != MODE_SILK_ONLY && audiosize > F5 && audiosize < F10) + audiosize = F5; + } + } + + /* In fixed-point, we can tell CELT to do the accumulation on top of the + SILK PCM buffer. This saves some stack space. */ +#ifdef FIXED_POINT + celt_accum = (mode != MODE_CELT_ONLY) && (frame_size >= F10); +#else + celt_accum = 0; +#endif + + pcm_transition_silk_size = ALLOC_NONE; + pcm_transition_celt_size = ALLOC_NONE; + if (data!=NULL && st->prev_mode > 0 && ( + (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_redundancy) + || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) ) + ) + { + transition = 1; + /* Decide where to allocate the stack memory for pcm_transition */ + if (mode == MODE_CELT_ONLY) + pcm_transition_celt_size = F5*st->channels; + else + pcm_transition_silk_size = F5*st->channels; + } + ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16); + if (transition && mode == MODE_CELT_ONLY) + { + pcm_transition = pcm_transition_celt; + opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); + } + if (audiosize > frame_size) + { + /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);*/ + RESTORE_STACK; + return OPUS_BAD_ARG; + } else { + frame_size = audiosize; + } + + /* Don't allocate any memory when in CELT-only mode */ + pcm_silk_size = (mode != MODE_CELT_ONLY && !celt_accum) ? IMAX(F10, frame_size)*st->channels : ALLOC_NONE; + ALLOC(pcm_silk, pcm_silk_size, opus_int16); + + /* SILK processing */ + if (mode != MODE_CELT_ONLY) + { + int lost_flag, decoded_samples; + opus_int16 *pcm_ptr; +#ifdef FIXED_POINT + if (celt_accum) + pcm_ptr = pcm; + else +#endif + pcm_ptr = pcm_silk; + + if (st->prev_mode==MODE_CELT_ONLY) + silk_ResetDecoder( silk_dec ); + + /* The SILK PLC cannot produce frames of less than 10 ms */ + st->DecControl.payloadSize_ms = IMAX(10, 1000 * audiosize / st->Fs); + + if (data != NULL) + { + st->DecControl.nChannelsInternal = st->stream_channels; + if( mode == MODE_SILK_ONLY ) { + if( bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { + st->DecControl.internalSampleRate = 8000; + } else if( bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { + st->DecControl.internalSampleRate = 12000; + } else if( bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { + st->DecControl.internalSampleRate = 16000; + } else { + st->DecControl.internalSampleRate = 16000; + celt_assert( 0 ); + } + } else { + /* Hybrid mode */ + st->DecControl.internalSampleRate = 16000; + } + } + st->DecControl.enable_deep_plc = st->complexity >= 5; +#ifdef ENABLE_OSCE + st->DecControl.osce_method = OSCE_METHOD_NONE; +#ifndef DISABLE_LACE + if (st->complexity >= 6) {st->DecControl.osce_method = OSCE_METHOD_LACE;} +#endif +#ifndef DISABLE_NOLACE + if (st->complexity >= 7) {st->DecControl.osce_method = OSCE_METHOD_NOLACE;} +#endif +#endif + + lost_flag = data == NULL ? 1 : 2 * !!decode_fec; + decoded_samples = 0; + do { + /* Call SILK decoder */ + int first_frame = decoded_samples == 0; + silk_ret = silk_Decode( silk_dec, &st->DecControl, + lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size, +#ifdef ENABLE_DEEP_PLC + &st->lpcnet, +#endif + st->arch ); + if( silk_ret ) { + if (lost_flag) { + /* PLC failure should not be fatal */ + silk_frame_size = frame_size; + for (i=0;ichannels;i++) + pcm_ptr[i] = 0; + } else { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + } + pcm_ptr += silk_frame_size * st->channels; + decoded_samples += silk_frame_size; + } while( decoded_samples < frame_size ); + } + + start_band = 0; + if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL + && ec_tell(&dec)+17+20*(mode == MODE_HYBRID) <= 8*len) + { + /* Check if we have a redundant 0-8 kHz band */ + if (mode == MODE_HYBRID) + redundancy = ec_dec_bit_logp(&dec, 12); + else + redundancy = 1; + if (redundancy) + { + celt_to_silk = ec_dec_bit_logp(&dec, 1); + /* redundancy_bytes will be at least two, in the non-hybrid + case due to the ec_tell() check above */ + redundancy_bytes = mode==MODE_HYBRID ? + (opus_int32)ec_dec_uint(&dec, 256)+2 : + len-((ec_tell(&dec)+7)>>3); + len -= redundancy_bytes; + /* This is a sanity check. It should never happen for a valid + packet, so the exact behaviour is not normative. */ + if (len*8 < ec_tell(&dec)) + { + len = 0; + redundancy_bytes = 0; + redundancy = 0; + } + /* Shrink decoder because of raw bits */ + dec.storage -= redundancy_bytes; + } + } + if (mode != MODE_CELT_ONLY) + start_band = 17; + + if (redundancy) + { + transition = 0; + pcm_transition_silk_size=ALLOC_NONE; + } + + ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); + + if (transition && mode != MODE_CELT_ONLY) + { + pcm_transition = pcm_transition_silk; + opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); + } + + + if (bandwidth) + { + int endband=21; + + switch(bandwidth) + { + case OPUS_BANDWIDTH_NARROWBAND: + endband = 13; + break; + case OPUS_BANDWIDTH_MEDIUMBAND: + case OPUS_BANDWIDTH_WIDEBAND: + endband = 17; + break; + case OPUS_BANDWIDTH_SUPERWIDEBAND: + endband = 19; + break; + case OPUS_BANDWIDTH_FULLBAND: + endband = 21; + break; + default: + celt_assert(0); + break; + } + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband))); + } + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels))); + + /* Only allocation memory for redundancy if/when needed */ + redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE; + ALLOC(redundant_audio, redundant_audio_size, opus_val16); + + /* 5 ms redundant frame for CELT->SILK*/ + if (redundancy && celt_to_silk) + { + /* If the previous frame did not use CELT (the first redundancy frame in + a transition from SILK may have been lost) then the CELT decoder is + stale at this point and the redundancy audio is not useful, however + the final range is still needed (for testing), so the redundancy is + always decoded but the decoded audio may not be used */ + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, + redundant_audio, F5, NULL, 0); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); + } + + /* MUST be after PLC */ + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band))); + + if (mode != MODE_SILK_ONLY) + { + int celt_frame_size = IMIN(F20, frame_size); + /* Make sure to discard any previous CELT state */ + if (mode != st->prev_mode && st->prev_mode > 0 && !st->prev_redundancy) + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); + /* Decode CELT */ + celt_ret = celt_decode_with_ec_dred(celt_dec, decode_fec ? NULL : data, + len, pcm, celt_frame_size, &dec, celt_accum +#ifdef ENABLE_DEEP_PLC + , &st->lpcnet +#endif + ); + } else { + unsigned char silence[2] = {0xFF, 0xFF}; + if (!celt_accum) + { + for (i=0;ichannels;i++) + pcm[i] = 0; + } + /* For hybrid -> SILK transitions, we let the CELT MDCT + do a fade-out by decoding a silence frame */ + if (st->prev_mode == MODE_HYBRID && !(redundancy && celt_to_silk && st->prev_redundancy) ) + { + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL, celt_accum); + } + } + + if (mode != MODE_CELT_ONLY && !celt_accum) + { +#ifdef FIXED_POINT + for (i=0;ichannels;i++) + pcm[i] = SAT16(ADD32(pcm[i], pcm_silk[i])); +#else + for (i=0;ichannels;i++) + pcm[i] = pcm[i] + (opus_val16)((1.f/32768.f)*pcm_silk[i]); +#endif + } + + { + const CELTMode *celt_mode; + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode))); + window = celt_mode->window; + } + + /* 5 ms redundant frame for SILK->CELT */ + if (redundancy && !celt_to_silk) + { + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + + celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); + smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5, + pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs); + } + /* 5ms redundant frame for CELT->SILK; ignore if the previous frame did not + use CELT (the first redundancy frame in a transition from SILK may have + been lost) */ + if (redundancy && celt_to_silk && (st->prev_mode != MODE_SILK_ONLY || st->prev_redundancy)) + { + for (c=0;cchannels;c++) + { + for (i=0;ichannels*i+c] = redundant_audio[st->channels*i+c]; + } + smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5, + pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs); + } + if (transition) + { + if (audiosize >= F5) + { + for (i=0;ichannels*F2_5;i++) + pcm[i] = pcm_transition[i]; + smooth_fade(pcm_transition+st->channels*F2_5, pcm+st->channels*F2_5, + pcm+st->channels*F2_5, F2_5, + st->channels, window, st->Fs); + } else { + /* Not enough time to do a clean transition, but we do it anyway + This will not preserve amplitude perfectly and may introduce + a bit of temporal aliasing, but it shouldn't be too bad and + that's pretty much the best we can do. In any case, generating this + transition it pretty silly in the first place */ + smooth_fade(pcm_transition, pcm, + pcm, F2_5, + st->channels, window, st->Fs); + } + } + + if(st->decode_gain) + { + opus_val32 gain; + gain = celt_exp2(MULT16_16_P15(QCONST16(6.48814081e-4f, 25), st->decode_gain)); + for (i=0;ichannels;i++) + { + opus_val32 x; + x = MULT16_32_P16(pcm[i],gain); + pcm[i] = SATURATE(x, 32767); + } + } + + if (len <= 1) + st->rangeFinal = 0; + else + st->rangeFinal = dec.rng ^ redundant_rng; + + st->prev_mode = mode; + st->prev_redundancy = redundancy && !celt_to_silk; + + if (celt_ret>=0) + { + if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) + OPUS_PRINT_INT(audiosize); + } + + RESTORE_STACK; + return celt_ret < 0 ? celt_ret : audiosize; + +} + +int opus_decode_native(OpusDecoder *st, const unsigned char *data, + opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec, + int self_delimited, opus_int32 *packet_offset, int soft_clip, const OpusDRED *dred, opus_int32 dred_offset) +{ + int i, nb_samples; + int count, offset; + unsigned char toc; + int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; + /* 48 x 2.5 ms = 120 ms */ + opus_int16 size[48]; + VALIDATE_OPUS_DECODER(st); + if (decode_fec<0 || decode_fec>1) + return OPUS_BAD_ARG; + /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ + if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0) + return OPUS_BAD_ARG; +#ifdef ENABLE_DRED + if (dred != NULL && dred->process_stage == 2) { + int F10; + int features_per_frame; + int needed_feature_frames; + int init_frames; + lpcnet_plc_fec_clear(&st->lpcnet); + F10 = st->Fs/100; + /* if blend==0, the last PLC call was "update" and we need to feed two extra 10-ms frames. */ + init_frames = (st->lpcnet.blend == 0) ? 2 : 0; + features_per_frame = IMAX(1, frame_size/F10); + needed_feature_frames = init_frames + features_per_frame; + lpcnet_plc_fec_clear(&st->lpcnet); + for (i=0;idred_offset*F10/4)/F10); + if (feature_offset <= 4*dred->nb_latents-1 && feature_offset >= 0) { + lpcnet_plc_fec_add(&st->lpcnet, dred->fec_features+feature_offset*DRED_NUM_FEATURES); + } else { + if (feature_offset >= 0) lpcnet_plc_fec_add(&st->lpcnet, NULL); + } + + } + } +#else + (void)dred; + (void)dred_offset; +#endif + if (len==0 || data==NULL) + { + int pcm_count=0; + do { + int ret; + ret = opus_decode_frame(st, NULL, 0, pcm+pcm_count*st->channels, frame_size-pcm_count, 0); + if (ret<0) + return ret; + pcm_count += ret; + } while (pcm_count < frame_size); + celt_assert(pcm_count == frame_size); + if (OPUS_CHECK_ARRAY(pcm, pcm_count*st->channels)) + OPUS_PRINT_INT(pcm_count); + st->last_packet_duration = pcm_count; + return pcm_count; + } else if (len<0) + return OPUS_BAD_ARG; + + packet_mode = opus_packet_get_mode(data); + packet_bandwidth = opus_packet_get_bandwidth(data); + packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs); + packet_stream_channels = opus_packet_get_nb_channels(data); + + count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, + size, &offset, packet_offset, NULL, NULL); + if (count<0) + return count; + + data += offset; + + if (decode_fec) + { + int duration_copy; + int ret; + /* If no FEC can be present, run the PLC (recursive call) */ + if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY) + return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip, NULL, 0); + /* Otherwise, run the PLC on everything except the size for which we might have FEC */ + duration_copy = st->last_packet_duration; + if (frame_size-packet_frame_size!=0) + { + ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip, NULL, 0); + if (ret<0) + { + st->last_packet_duration = duration_copy; + return ret; + } + celt_assert(ret==frame_size-packet_frame_size); + } + /* Complete with FEC */ + st->mode = packet_mode; + st->bandwidth = packet_bandwidth; + st->frame_size = packet_frame_size; + st->stream_channels = packet_stream_channels; + ret = opus_decode_frame(st, data, size[0], pcm+st->channels*(frame_size-packet_frame_size), + packet_frame_size, 1); + if (ret<0) + return ret; + else { + if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) + OPUS_PRINT_INT(frame_size); + st->last_packet_duration = frame_size; + return frame_size; + } + } + + if (count*packet_frame_size > frame_size) + return OPUS_BUFFER_TOO_SMALL; + + /* Update the state as the last step to avoid updating it on an invalid packet */ + st->mode = packet_mode; + st->bandwidth = packet_bandwidth; + st->frame_size = packet_frame_size; + st->stream_channels = packet_stream_channels; + + nb_samples=0; + for (i=0;ichannels, frame_size-nb_samples, 0); + if (ret<0) + return ret; + celt_assert(ret==packet_frame_size); + data += size[i]; + nb_samples += ret; + } + st->last_packet_duration = nb_samples; + if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels)) + OPUS_PRINT_INT(nb_samples); +#ifndef FIXED_POINT + if (soft_clip) + opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem); + else + st->softclip_mem[0]=st->softclip_mem[1]=0; +#endif + return nb_samples; +} + +#ifdef FIXED_POINT + +int opus_decode(OpusDecoder *st, const unsigned char *data, + opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) +{ + if(frame_size<=0) + return OPUS_BAD_ARG; + return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0, NULL, 0); +} + +#ifndef DISABLE_FLOAT_API +int opus_decode_float(OpusDecoder *st, const unsigned char *data, + opus_int32 len, float *pcm, int frame_size, int decode_fec) +{ + VARDECL(opus_int16, out); + int ret, i; + int nb_samples; + ALLOC_STACK; + + if(frame_size<=0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + if (data != NULL && len > 0 && !decode_fec) + { + nb_samples = opus_decoder_get_nb_samples(st, data, len); + if (nb_samples>0) + frame_size = IMIN(frame_size, nb_samples); + else + return OPUS_INVALID_PACKET; + } + celt_assert(st->channels == 1 || st->channels == 2); + ALLOC(out, frame_size*st->channels, opus_int16); + + ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0, NULL, 0); + if (ret > 0) + { + for (i=0;ichannels;i++) + pcm[i] = (1.f/32768.f)*(out[i]); + } + RESTORE_STACK; + return ret; +} +#endif + + +#else +int opus_decode(OpusDecoder *st, const unsigned char *data, + opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) +{ + VARDECL(float, out); + int ret, i; + int nb_samples; + ALLOC_STACK; + + if(frame_size<=0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + if (data != NULL && len > 0 && !decode_fec) + { + nb_samples = opus_decoder_get_nb_samples(st, data, len); + if (nb_samples>0) + frame_size = IMIN(frame_size, nb_samples); + else + return OPUS_INVALID_PACKET; + } + celt_assert(st->channels == 1 || st->channels == 2); + ALLOC(out, frame_size*st->channels, float); + + ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1, NULL, 0); + if (ret > 0) + { + for (i=0;ichannels;i++) + pcm[i] = FLOAT2INT16(out[i]); + } + RESTORE_STACK; + return ret; +} + +int opus_decode_float(OpusDecoder *st, const unsigned char *data, + opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) +{ + if(frame_size<=0) + return OPUS_BAD_ARG; + return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0, NULL, 0); +} + +#endif + +int opus_decoder_ctl(OpusDecoder *st, int request, ...) +{ + int ret = OPUS_OK; + va_list ap; + void *silk_dec; + CELTDecoder *celt_dec; + + silk_dec = (char*)st+st->silk_dec_offset; + celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); + + + va_start(ap, request); + + switch (request) + { + case OPUS_GET_BANDWIDTH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->bandwidth; + } + break; + case OPUS_SET_COMPLEXITY_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>10) + { + goto bad_arg; + } + st->complexity = value; + celt_decoder_ctl(celt_dec, OPUS_SET_COMPLEXITY(value)); + } + break; + case OPUS_GET_COMPLEXITY_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->complexity; + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + opus_uint32 *value = va_arg(ap, opus_uint32*); + if (!value) + { + goto bad_arg; + } + *value = st->rangeFinal; + } + break; + case OPUS_RESET_STATE: + { + OPUS_CLEAR((char*)&st->OPUS_DECODER_RESET_START, + sizeof(OpusDecoder)- + ((char*)&st->OPUS_DECODER_RESET_START - (char*)st)); + + celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); + silk_ResetDecoder( silk_dec ); + st->stream_channels = st->channels; + st->frame_size = st->Fs/400; +#ifdef ENABLE_DEEP_PLC + lpcnet_plc_reset( &st->lpcnet ); +#endif + } + break; + case OPUS_GET_SAMPLE_RATE_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->Fs; + } + break; + case OPUS_GET_PITCH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + if (st->prev_mode == MODE_CELT_ONLY) + ret = celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); + else + *value = st->DecControl.prevPitchLag; + } + break; + case OPUS_GET_GAIN_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->decode_gain; + } + break; + case OPUS_SET_GAIN_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<-32768 || value>32767) + { + goto bad_arg; + } + st->decode_gain = value; + } + break; + case OPUS_GET_LAST_PACKET_DURATION_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->last_packet_duration; + } + break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + ret = celt_decoder_ctl(celt_dec, OPUS_SET_PHASE_INVERSION_DISABLED(value)); + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + ret = celt_decoder_ctl(celt_dec, OPUS_GET_PHASE_INVERSION_DISABLED(value)); + } + break; +#ifdef USE_WEIGHTS_FILE + case OPUS_SET_DNN_BLOB_REQUEST: + { + const unsigned char *data = va_arg(ap, const unsigned char *); + opus_int32 len = va_arg(ap, opus_int32); + if(len<0 || data == NULL) + { + goto bad_arg; + } + ret = lpcnet_plc_load_model(&st->lpcnet, data, len); + ret = silk_LoadOSCEModels(silk_dec, data, len) || ret; + } + break; +#endif + default: + /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ + ret = OPUS_UNIMPLEMENTED; + break; + } + + va_end(ap); + return ret; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +} + +void opus_decoder_destroy(OpusDecoder *st) +{ + opus_free(st); +} + + +int opus_packet_get_bandwidth(const unsigned char *data) +{ + int bandwidth; + if (data[0]&0x80) + { + bandwidth = OPUS_BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3); + if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) + bandwidth = OPUS_BANDWIDTH_NARROWBAND; + } else if ((data[0]&0x60) == 0x60) + { + bandwidth = (data[0]&0x10) ? OPUS_BANDWIDTH_FULLBAND : + OPUS_BANDWIDTH_SUPERWIDEBAND; + } else { + bandwidth = OPUS_BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3); + } + return bandwidth; +} + +int opus_packet_get_nb_channels(const unsigned char *data) +{ + return (data[0]&0x4) ? 2 : 1; +} + +int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) +{ + int count; + if (len<1) + return OPUS_BAD_ARG; + count = packet[0]&0x3; + if (count==0) + return 1; + else if (count!=3) + return 2; + else if (len<2) + return OPUS_INVALID_PACKET; + else + return packet[1]&0x3F; +} + +int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, + opus_int32 Fs) +{ + int samples; + int count = opus_packet_get_nb_frames(packet, len); + + if (count<0) + return count; + + samples = count*opus_packet_get_samples_per_frame(packet, Fs); + /* Can't have more than 120 ms */ + if (samples*25 > Fs*3) + return OPUS_INVALID_PACKET; + else + return samples; +} + +int opus_packet_has_lbrr(const unsigned char packet[], opus_int32 len) +{ + int ret; + const unsigned char *frames[48]; + opus_int16 size[48]; + int packet_mode, packet_frame_size, packet_stream_channels; + int nb_frames=1; + int lbrr; + + packet_mode = opus_packet_get_mode(packet); + if (packet_mode == MODE_CELT_ONLY) + return 0; + packet_frame_size = opus_packet_get_samples_per_frame(packet, 48000); + if (packet_frame_size > 960) + nb_frames = packet_frame_size/960; + packet_stream_channels = opus_packet_get_nb_channels(packet); + ret = opus_packet_parse(packet, len, NULL, frames, size, NULL); + if (ret <= 0) + return ret; + lbrr = (frames[0][0] >> (7-nb_frames)) & 0x1; + if (packet_stream_channels == 2) + lbrr = lbrr || ((frames[0][0] >> (6-2*nb_frames)) & 0x1); + return lbrr; +} + +int opus_decoder_get_nb_samples(const OpusDecoder *dec, + const unsigned char packet[], opus_int32 len) +{ + return opus_packet_get_nb_samples(packet, len, dec->Fs); +} + +struct OpusDREDDecoder { +#ifdef ENABLE_DRED + RDOVAEDec model; +#endif + int loaded; + int arch; + opus_uint32 magic; +}; + +#if defined(ENABLE_DRED) && (defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS)) +static void validate_dred_decoder(OpusDREDDecoder *st) +{ + celt_assert(st->magic == 0xD8EDDEC0); +#ifdef OPUS_ARCHMASK + celt_assert(st->arch >= 0); + celt_assert(st->arch <= OPUS_ARCHMASK); +#endif +} +#define VALIDATE_DRED_DECODER(st) validate_dred_decoder(st) +#else +#define VALIDATE_DRED_DECODER(st) +#endif + + +int opus_dred_decoder_get_size(void) +{ + return sizeof(OpusDREDDecoder); +} + +#ifdef ENABLE_DRED +int dred_decoder_load_model(OpusDREDDecoder *dec, const unsigned char *data, int len) +{ + WeightArray *list; + int ret; + parse_weights(&list, data, len); + ret = init_rdovaedec(&dec->model, list); + opus_free(list); + if (ret == 0) dec->loaded = 1; + return (ret == 0) ? OPUS_OK : OPUS_BAD_ARG; +} +#endif + +int opus_dred_decoder_init(OpusDREDDecoder *dec) +{ + int ret = 0; + dec->loaded = 0; +#if defined(ENABLE_DRED) && !defined(USE_WEIGHTS_FILE) + ret = init_rdovaedec(&dec->model, rdovaedec_arrays); + if (ret == 0) dec->loaded = 1; +#endif + dec->arch = opus_select_arch(); + /* To make sure nobody forgets to init, use a magic number. */ + dec->magic = 0xD8EDDEC0; + return (ret == 0) ? OPUS_OK : OPUS_UNIMPLEMENTED; +} + +OpusDREDDecoder *opus_dred_decoder_create(int *error) +{ + int ret; + OpusDREDDecoder *dec; + dec = (OpusDREDDecoder *)opus_alloc(opus_dred_decoder_get_size()); + if (dec == NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + ret = opus_dred_decoder_init(dec); + if (error) + *error = ret; + if (ret != OPUS_OK) + { + opus_free(dec); + dec = NULL; + } + return dec; +} + +void opus_dred_decoder_destroy(OpusDREDDecoder *dec) +{ + if (dec) dec->magic = 0xDE57801D; + opus_free(dec); +} + +int opus_dred_decoder_ctl(OpusDREDDecoder *dred_dec, int request, ...) +{ +#ifdef ENABLE_DRED + int ret = OPUS_OK; + va_list ap; + + va_start(ap, request); + (void)dred_dec; + switch (request) + { +# ifdef USE_WEIGHTS_FILE + case OPUS_SET_DNN_BLOB_REQUEST: + { + const unsigned char *data = va_arg(ap, const unsigned char *); + opus_int32 len = va_arg(ap, opus_int32); + if(len<0 || data == NULL) + { + goto bad_arg; + } + return dred_decoder_load_model(dred_dec, data, len); + } + break; +# endif + default: + /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ + ret = OPUS_UNIMPLEMENTED; + break; + } + va_end(ap); + return ret; +# ifdef USE_WEIGHTS_FILE +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +# endif +#else + (void)dred_dec; + (void)request; + return OPUS_UNIMPLEMENTED; +#endif +} + +#ifdef ENABLE_DRED +static int dred_find_payload(const unsigned char *data, opus_int32 len, const unsigned char **payload, int *dred_frame_offset) +{ + const unsigned char *data0; + int len0; + int frame = 0; + int ret; + const unsigned char *frames[48]; + opus_int16 size[48]; + int frame_size; + + *payload = NULL; + /* Get the padding section of the packet. */ + ret = opus_packet_parse_impl(data, len, 0, NULL, frames, size, NULL, NULL, &data0, &len0); + if (ret < 0) + return ret; + frame_size = opus_packet_get_samples_per_frame(data, 48000); + data = data0; + len = len0; + /* Scan extensions in order until we find the earliest frame with DRED data. */ + while (len > 0) + { + opus_int32 header_size; + int id, L; + len0 = len; + data0 = data; + id = *data0 >> 1; + L = *data0 & 0x1; + len = skip_extension(&data, len, &header_size); + if (len < 0) + break; + if (id == 1) + { + if (L==0) + { + frame++; + } else { + frame += data0[1]; + } + } else if (id == DRED_EXTENSION_ID) + { + const unsigned char *curr_payload; + opus_int32 curr_payload_len; + curr_payload = data0+header_size; + curr_payload_len = (data-data0)-header_size; + /* DRED position in the packet, in units of 2.5 ms like for the signaled DRED offset. */ + *dred_frame_offset = frame*frame_size/120; +#ifdef DRED_EXPERIMENTAL_VERSION + /* Check that temporary extension type and version match. + This check will be removed once extension is finalized. */ + if (curr_payload_len > DRED_EXPERIMENTAL_BYTES && curr_payload[0] == 'D' && curr_payload[1] == DRED_EXPERIMENTAL_VERSION) { + *payload = curr_payload+2; + return curr_payload_len-2; + } +#else + if (curr_payload_len > 0) { + *payload = curr_payload; + return curr_payload_len; + } +#endif + } + } + return 0; +} +#endif + +int opus_dred_get_size(void) +{ +#ifdef ENABLE_DRED + return sizeof(OpusDRED); +#else + return 0; +#endif +} + +OpusDRED *opus_dred_alloc(int *error) +{ +#ifdef ENABLE_DRED + OpusDRED *dec; + dec = (OpusDRED *)opus_alloc(opus_dred_get_size()); + if (dec == NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + return dec; +#else + if (error) + *error = OPUS_UNIMPLEMENTED; + return NULL; +#endif +} + +void opus_dred_free(OpusDRED *dec) +{ +#ifdef ENABLE_DRED + opus_free(dec); +#else + (void)dec; +#endif +} + +int opus_dred_parse(OpusDREDDecoder *dred_dec, OpusDRED *dred, const unsigned char *data, opus_int32 len, opus_int32 max_dred_samples, opus_int32 sampling_rate, int *dred_end, int defer_processing) +{ +#ifdef ENABLE_DRED + const unsigned char *payload; + opus_int32 payload_len; + int dred_frame_offset=0; + VALIDATE_DRED_DECODER(dred_dec); + if (!dred_dec->loaded) return OPUS_UNIMPLEMENTED; + dred->process_stage = -1; + payload_len = dred_find_payload(data, len, &payload, &dred_frame_offset); + if (payload_len < 0) + return payload_len; + if (payload != NULL) + { + int offset; + int min_feature_frames; + offset = 100*max_dred_samples/sampling_rate; + min_feature_frames = IMIN(2 + offset, 2*DRED_NUM_REDUNDANCY_FRAMES); + dred_ec_decode(dred, payload, payload_len, min_feature_frames, dred_frame_offset); + if (!defer_processing) + opus_dred_process(dred_dec, dred, dred); + if (dred_end) *dred_end = IMAX(0, -dred->dred_offset*sampling_rate/400); + return IMAX(0, dred->nb_latents*sampling_rate/25 - dred->dred_offset* sampling_rate/400); + } + if (dred_end) *dred_end = 0; + return 0; +#else + (void)dred_dec; + (void)dred; + (void)data; + (void)len; + (void)max_dred_samples; + (void)sampling_rate; + (void)defer_processing; + (void)dred_end; + return OPUS_UNIMPLEMENTED; +#endif +} + +int opus_dred_process(OpusDREDDecoder *dred_dec, const OpusDRED *src, OpusDRED *dst) +{ +#ifdef ENABLE_DRED + if (dred_dec == NULL || src == NULL || dst == NULL || (src->process_stage != 1 && src->process_stage != 2)) + return OPUS_BAD_ARG; + VALIDATE_DRED_DECODER(dred_dec); + if (!dred_dec->loaded) return OPUS_UNIMPLEMENTED; + if (src != dst) + OPUS_COPY(dst, src, 1); + if (dst->process_stage == 2) + return OPUS_OK; + DRED_rdovae_decode_all(&dred_dec->model, dst->fec_features, dst->state, dst->latents, dst->nb_latents, dred_dec->arch); + dst->process_stage = 2; + return OPUS_OK; +#else + (void)dred_dec; + (void)src; + (void)dst; + return OPUS_UNIMPLEMENTED; +#endif +} + +int opus_decoder_dred_decode(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int16 *pcm, opus_int32 frame_size) +{ +#ifdef ENABLE_DRED + VARDECL(float, out); + int ret, i; + ALLOC_STACK; + + if(frame_size<=0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + celt_assert(st->channels == 1 || st->channels == 2); + ALLOC(out, frame_size*st->channels, float); + + ret = opus_decode_native(st, NULL, 0, out, frame_size, 0, 0, NULL, 1, dred, dred_offset); + if (ret > 0) + { + for (i=0;ichannels;i++) + pcm[i] = FLOAT2INT16(out[i]); + } + RESTORE_STACK; + return ret; +#else + (void)st; + (void)dred; + (void)dred_offset; + (void)pcm; + (void)frame_size; + return OPUS_UNIMPLEMENTED; +#endif +} + +int opus_decoder_dred_decode_float(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, float *pcm, opus_int32 frame_size) +{ +#ifdef ENABLE_DRED + if(frame_size<=0) + return OPUS_BAD_ARG; + return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, 0, dred, dred_offset); +#else + (void)st; + (void)dred; + (void)dred_offset; + (void)pcm; + (void)frame_size; + return OPUS_UNIMPLEMENTED; +#endif +} diff --git a/src/libopus/src/opus_defines.h b/src/libopus/src/opus_defines.h new file mode 100644 index 00000000..dcc24434 --- /dev/null +++ b/src/libopus/src/opus_defines.h @@ -0,0 +1 @@ +#include "../include/opus_defines.h" diff --git a/src/libopus/src/opus_multistream.h b/src/libopus/src/opus_multistream.h new file mode 100644 index 00000000..89f62298 --- /dev/null +++ b/src/libopus/src/opus_multistream.h @@ -0,0 +1 @@ +#include "../include/opus_multistream.h" diff --git a/src/libopus/src/opus_private.h b/src/libopus/src/opus_private.h new file mode 100644 index 00000000..364c21ce --- /dev/null +++ b/src/libopus/src/opus_private.h @@ -0,0 +1,223 @@ +/* Copyright (c) 2012 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``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 COPYRIGHT OWNER + OR CONTRIBUTORS 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 OPUS_PRIVATE_H +#define OPUS_PRIVATE_H + +#include "arch.h" +#include "opus.h" +#include "celt.h" + +#include /* va_list */ +#include /* offsetof */ + +struct OpusRepacketizer { + unsigned char toc; + int nb_frames; + const unsigned char *frames[48]; + opus_int16 len[48]; + int framesize; + const unsigned char *paddings[48]; + opus_int32 padding_len[48]; +}; + +typedef struct { + int id; + int frame; + const unsigned char *data; + opus_int32 len; +} opus_extension_data; + +typedef struct ChannelLayout { + int nb_channels; + int nb_streams; + int nb_coupled_streams; + unsigned char mapping[256]; +} ChannelLayout; + +typedef enum { + MAPPING_TYPE_NONE, + MAPPING_TYPE_SURROUND, + MAPPING_TYPE_AMBISONICS +} MappingType; + +struct OpusMSEncoder { + ChannelLayout layout; + int arch; + int lfe_stream; + int application; + int variable_duration; + MappingType mapping_type; + opus_int32 bitrate_bps; + /* Encoder states go here */ + /* then opus_val32 window_mem[channels*120]; */ + /* then opus_val32 preemph_mem[channels]; */ +}; + +struct OpusMSDecoder { + ChannelLayout layout; + /* Decoder states go here */ +}; + +int opus_multistream_encoder_ctl_va_list(struct OpusMSEncoder *st, int request, + va_list ap); +int opus_multistream_decoder_ctl_va_list(struct OpusMSDecoder *st, int request, + va_list ap); + +int validate_layout(const ChannelLayout *layout); +int get_left_channel(const ChannelLayout *layout, int stream_id, int prev); +int get_right_channel(const ChannelLayout *layout, int stream_id, int prev); +int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev); + +typedef void (*opus_copy_channel_in_func)( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size, + void *user_data +); + +typedef void (*opus_copy_channel_out_func)( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size, + void *user_data +); + +#define MODE_SILK_ONLY 1000 +#define MODE_HYBRID 1001 +#define MODE_CELT_ONLY 1002 + +#define OPUS_SET_VOICE_RATIO_REQUEST 11018 +#define OPUS_GET_VOICE_RATIO_REQUEST 11019 + +/** Configures the encoder's expected percentage of voice + * opposed to music or other signals. + * + * @note This interface is currently more aspiration than actuality. It's + * ultimately expected to bias an automatic signal classifier, but it currently + * just shifts the static bitrate to mode mapping around a little bit. + * + * @param[in] x int: Voice percentage in the range 0-100, inclusive. + * @hideinitializer */ +#define OPUS_SET_VOICE_RATIO(x) OPUS_SET_VOICE_RATIO_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured voice ratio value, @see OPUS_SET_VOICE_RATIO + * + * @param[out] x int*: Voice percentage in the range 0-100, inclusive. + * @hideinitializer */ +#define OPUS_GET_VOICE_RATIO(x) OPUS_GET_VOICE_RATIO_REQUEST, __opus_check_int_ptr(x) + + +#define OPUS_SET_FORCE_MODE_REQUEST 11002 +#define OPUS_SET_FORCE_MODE(x) OPUS_SET_FORCE_MODE_REQUEST, __opus_check_int(x) + +typedef void (*downmix_func)(const void *, opus_val32 *, int, int, int, int, int); +void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); +void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); +int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth); + +int encode_size(int size, unsigned char *data); + +opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs); + +opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, + unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, + const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, + int analysis_channels, downmix_func downmix, int float_api); + +int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 len, + opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, + opus_int32 *packet_offset, int soft_clip, const OpusDRED *dred, opus_int32 dred_offset); + +/* Make sure everything is properly aligned. */ +static OPUS_INLINE int align(int i) +{ + struct foo {char c; union { void* p; opus_int32 i; opus_val32 v; } u;}; + + unsigned int alignment = offsetof(struct foo, u); + + /* Optimizing compilers should optimize div and multiply into and + for all sensible alignment values. */ + return ((i + alignment - 1) / alignment) * alignment; +} + +/* More than that is ridiculous for now (3 * max frames per packet)*/ +opus_int32 skip_extension(const unsigned char **data, opus_int32 len, opus_int32 *header_size); + +int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, + int self_delimited, unsigned char *out_toc, + const unsigned char *frames[48], opus_int16 size[48], + int *payload_offset, opus_int32 *packet_offset, + const unsigned char **padding, opus_int32 *padding_len); + +opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, + unsigned char *data, opus_int32 maxlen, int self_delimited, int pad, + const opus_extension_data *extensions, int nb_extensions); + +int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len); + +int opus_multistream_encode_native +( + struct OpusMSEncoder *st, + opus_copy_channel_in_func copy_channel_in, + const void *pcm, + int analysis_frame_size, + unsigned char *data, + opus_int32 max_data_bytes, + int lsb_depth, + downmix_func downmix, + int float_api, + void *user_data +); + +int opus_multistream_decode_native( + struct OpusMSDecoder *st, + const unsigned char *data, + opus_int32 len, + void *pcm, + opus_copy_channel_out_func copy_channel_out, + int frame_size, + int decode_fec, + int soft_clip, + void *user_data +); + +opus_int32 opus_packet_extensions_parse(const unsigned char *data, opus_int32 len, opus_extension_data *extensions, opus_int32 *nb_extensions); + +opus_int32 opus_packet_extensions_generate(unsigned char *data, opus_int32 len, const opus_extension_data *extensions, int nb_extensions, int pad); + +opus_int32 opus_packet_extensions_count(const unsigned char *data, opus_int32 len); + +opus_int32 opus_packet_pad_impl(unsigned char *data, opus_int32 len, opus_int32 new_len, int pad, const opus_extension_data *extensions, int nb_extensions); + +#endif /* OPUS_PRIVATE_H */ diff --git a/src/libopus/src/opus_projection.h b/src/libopus/src/opus_projection.h new file mode 100644 index 00000000..72f59cc1 --- /dev/null +++ b/src/libopus/src/opus_projection.h @@ -0,0 +1 @@ +#include "../include/opus_projection.h" diff --git a/src/libopus/src/opus_types.h b/src/libopus/src/opus_types.h new file mode 100644 index 00000000..a7958a5d --- /dev/null +++ b/src/libopus/src/opus_types.h @@ -0,0 +1 @@ +#include "../include/opus_types.h" diff --git a/src/libopus/src/os_support.h b/src/libopus/src/os_support.h new file mode 100644 index 00000000..dc47379f --- /dev/null +++ b/src/libopus/src/os_support.h @@ -0,0 +1 @@ +#include "../celt/os_support.h" diff --git a/src/libopus/src/stack_alloc.h b/src/libopus/src/stack_alloc.h new file mode 100644 index 00000000..416720bf --- /dev/null +++ b/src/libopus/src/stack_alloc.h @@ -0,0 +1 @@ +#include "../celt/stack_alloc.h" diff --git a/src/libopus/src/structs.h b/src/libopus/src/structs.h new file mode 100644 index 00000000..336e73b0 --- /dev/null +++ b/src/libopus/src/structs.h @@ -0,0 +1 @@ +#include "../silk/structs.h" diff --git a/src/libtinysoundfont/1mgm.h b/src/libtinysoundfont/1mgm.h new file mode 100644 index 00000000..9252fb9c --- /dev/null +++ b/src/libtinysoundfont/1mgm.h @@ -0,0 +1,44052 @@ +// Soundfont Header from 'libtinysoundfont/1mgm.h' +#define TSF_HEADER +#include +static const struct tsf_region preset_0_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=17232, .loop_start=10655, .loop_end=17226, + .transpose=0, .tune=-43, .pitch_keycenter=75, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=51, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=17277, .end=39408, .loop_start=34914, .loop_end=39403, + .transpose=0, .tune=8, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=64715, .end=86289, .loop_start=86221, .loop_end=86283, + .transpose=0, .tune=4, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=39453, .end=64670, .loop_start=54881, .loop_end=64664, + .transpose=0, .tune=2, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=86334, .end=93314, .loop_start=93182, .loop_end=93307, + .transpose=0, .tune=2, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=3417.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=93359, .end=99505, .loop_start=99452, .loop_end=99499, + .transpose=0, .tune=29, .pitch_keycenter=106, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=99550, .end=104014, .loop_start=103698, .loop_end=103751, + .transpose=0, .tune=30, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10856, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_1_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=17232, .loop_start=10655, .loop_end=17226, + .transpose=0, .tune=-43, .pitch_keycenter=75, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=51, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=17277, .end=39408, .loop_start=34914, .loop_end=39403, + .transpose=0, .tune=8, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=64715, .end=86289, .loop_start=86221, .loop_end=86283, + .transpose=0, .tune=4, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=39453, .end=64670, .loop_start=54881, .loop_end=64664, + .transpose=0, .tune=2, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=86334, .end=93314, .loop_start=93182, .loop_end=93307, + .transpose=0, .tune=2, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=93359, .end=99505, .loop_start=99452, .loop_end=99499, + .transpose=0, .tune=29, .pitch_keycenter=106, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=99550, .end=104014, .loop_start=103698, .loop_end=103751, + .transpose=0, .tune=30, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_2_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=17232, .loop_start=10655, .loop_end=17226, + .transpose=0, .tune=-43, .pitch_keycenter=75, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=57, .hikey=63, .lovel=0, .hivel=127, + .group=0, .offset=17277, .end=39408, .loop_start=34914, .loop_end=39403, + .transpose=0, .tune=8, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=64, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=64715, .end=86289, .loop_start=86221, .loop_end=86283, + .transpose=0, .tune=4, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=82, .lovel=0, .hivel=127, + .group=0, .offset=39453, .end=64670, .loop_start=54881, .loop_end=64664, + .transpose=0, .tune=2, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=83, .hikey=94, .lovel=0, .hivel=127, + .group=0, .offset=93359, .end=99505, .loop_start=99452, .loop_end=99499, + .transpose=0, .tune=29, .pitch_keycenter=106, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=95, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.008004, .decay=0.400066, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_3_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=17232, .loop_start=10655, .loop_end=17226, + .transpose=0, .tune=-35, .pitch_keycenter=75, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=51, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=17277, .end=39408, .loop_start=34914, .loop_end=39403, + .transpose=0, .tune=16, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=64715, .end=86289, .loop_start=86221, .loop_end=86283, + .transpose=0, .tune=11, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=39453, .end=64670, .loop_start=54881, .loop_end=64664, + .transpose=0, .tune=10, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=86334, .end=93314, .loop_start=93182, .loop_end=93307, + .transpose=0, .tune=10, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=93359, .end=99505, .loop_start=99452, .loop_end=99499, + .transpose=0, .tune=36, .pitch_keycenter=106, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=99550, .end=104014, .loop_start=103698, .loop_end=103751, + .transpose=0, .tune=38, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-40, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.287000, + .attenuationF16P16=132382, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=17232, .loop_start=10655, .loop_end=17226, + .transpose=0, .tune=50, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=51, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=17277, .end=39408, .loop_start=34914, .loop_end=39403, + .transpose=0, .tune=2, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=68, .lovel=0, .hivel=127, + .group=0, .offset=64715, .end=86289, .loop_start=86221, .loop_end=86283, + .transpose=0, .tune=-3, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=69, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=39453, .end=64670, .loop_start=54881, .loop_end=64664, + .transpose=0, .tune=-4, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=86334, .end=93314, .loop_start=93182, .loop_end=93307, + .transpose=0, .tune=-4, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=93359, .end=99505, .loop_start=99452, .loop_end=99499, + .transpose=0, .tune=22, .pitch_keycenter=106, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=99550, .end=104014, .loop_start=103698, .loop_end=103751, + .transpose=0, .tune=24, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=46, .pitch_keycenter=112, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.630314, .decay=4386.000000, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=33.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_4_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=48, .lovel=0, .hivel=127, + .group=0, .offset=458250, .end=458320, .loop_start=458267, .loop_end=458314, + .transpose=0, .tune=21, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.003312, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11151, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=49, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=458250, .end=458320, .loop_start=458267, .loop_end=458314, + .transpose=0, .tune=21, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.860027, .sustain=0.004217, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11151, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=61, .hikey=80, .lovel=0, .hivel=127, + .group=0, .offset=458250, .end=458320, .loop_start=458267, .loop_end=458314, + .transpose=0, .tune=21, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.000031, .sustain=0.003312, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11151, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=81, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=109503, .end=110676, .loop_start=110623, .loop_end=110670, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.003312, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11151, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.003312, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=497443, .end=497727, .loop_start=497450, .loop_end=497721, + .transpose=0, .tune=29, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.839783, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=61, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=-21, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.839783, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.320000, .pan=0.000000, + .attenuationF16P16=152043, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.839783, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_5_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=109503, .end=110676, .loop_start=110623, .loop_end=110670, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.935000, .release=1.799301, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5074, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.935000, .release=1.799301, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5074, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_6_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=104, .lovel=0, .hivel=127, + .group=0, .offset=113751, .end=115142, .loop_start=115045, .loop_end=115136, + .transpose=0, .tune=-45, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=3.150000, .pan=0.000000, + .attenuationF16P16=206438, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.240088, .decay=11.993286, .sustain=0.179893, .release=1.053932, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=105, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=3.150000, .pan=0.000000, + .attenuationF16P16=206438, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=258941, .end=261791, .loop_start=261725, .loop_end=261785, + .transpose=0, .tune=44, .pitch_keycenter=78, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=261836, .end=265419, .loop_start=265376, .loop_end=265414, + .transpose=0, .tune=-31, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_7_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=110721, .end=113706, .loop_start=113557, .loop_end=113700, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.240088, .decay=7.098083, .sustain=0.000021, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8083, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.500000, .pan=0.000000, + .attenuationF16P16=98304, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8083, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_8_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=94, .lovel=0, .hivel=127, + .group=0, .offset=421363, .end=422145, .loop_start=422059, .loop_end=422139, + .transpose=0, .tune=33, .pitch_keycenter=73, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=5.819214, .sustain=0.000000, .release=1.393936, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=9027, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=106, .lovel=0, .hivel=127, + .group=0, .offset=446228, .end=451645, .loop_start=451057, .loop_end=451639, + .transpose=0, .tune=-21, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=1.393936, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9499, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=107, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=1.393936, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9499, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_9_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=490604, .end=490677, .loop_start=490611, .loop_end=490671, + .transpose=0, .tune=11, .pitch_keycenter=52, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.240088, .decay=1.269409, .sustain=0.179893, .release=0.306007, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5841, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=60, .hikey=73, .lovel=0, .hivel=127, + .group=0, .offset=490604, .end=490677, .loop_start=490611, .loop_end=490671, + .transpose=0, .tune=11, .pitch_keycenter=52, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.240088, .decay=1.269409, .sustain=0.179893, .release=0.306007, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5841, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=490343, .end=490559, .loop_start=490350, .loop_end=490553, + .transpose=0, .tune=32, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_10_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=-21, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.012007, .hold=0.240088, .decay=1.799301, .sustain=0.000021, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=61, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=-21, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.012007, .hold=0.240088, .decay=1.799301, .sustain=0.000021, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.012007, .hold=0.240088, .decay=1.799301, .sustain=0.000021, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.670124, .decay=1.209961, .sustain=0.588000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=451690, .end=451830, .loop_start=451759, .loop_end=451824, + .transpose=0, .tune=-21, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.040014, .attack=0.054001, .hold=0.020007, .decay=1.599342, .sustain=0.000143, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=3.799438, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=136, .initialFilterFc=10325, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=61, .hikey=86, .lovel=0, .hivel=127, + .group=0, .offset=451690, .end=451830, .loop_start=451759, .loop_end=451824, + .transpose=0, .tune=-21, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.040014, .attack=0.007000, .hold=0.020007, .decay=1.599342, .sustain=0.000143, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=3.799438, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=136, .initialFilterFc=10325, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.040014, .attack=0.006003, .hold=0.020007, .decay=1.599342, .sustain=0.000143, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=3.799438, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=136, .initialFilterFc=10325, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_11_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=94, .lovel=0, .hivel=127, + .group=0, .offset=421363, .end=422145, .loop_start=422059, .loop_end=422139, + .transpose=0, .tune=24, .pitch_keycenter=73, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.800137, .sustain=0.588000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4779, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=20, + .delayModLFO=0.000000, + .freqModLFO=-646, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=94, .lovel=0, .hivel=127, + .group=0, .offset=421363, .end=422145, .loop_start=422059, .loop_end=422139, + .transpose=0, .tune=24, .pitch_keycenter=73, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=2.439575, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.800137, .sustain=0.588000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4779, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=20, + .delayModLFO=0.000000, + .freqModLFO=-646, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=95, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.800137, .sustain=0.588000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=4779, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=20, + .delayModLFO=0.000000, + .freqModLFO=-646, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_12_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=426801, .end=427618, .loop_start=427589, .loop_end=427612, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.100017, .decay=3.198700, .sustain=0.000011, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.000000, .sustain=0.000000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.100017, .decay=3.198700, .sustain=0.000011, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.000000, .sustain=0.000000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_13_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=419313, .end=420293, .loop_start=419320, .loop_end=420288, + .transpose=0, .tune=-45, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=2.439575, .sustain=0.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=121, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=2.439575, .sustain=0.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_14_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=446228, .end=451645, .loop_start=451057, .loop_end=451639, + .transpose=0, .tune=50, .pitch_keycenter=109, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.560234, .decay=11.196655, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10266, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_15_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=114, .lovel=0, .hivel=127, + .group=0, .offset=245784, .end=249619, .loop_start=249562, .loop_end=249613, + .transpose=0, .tune=-32, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=3.559326, .sustain=0.000000, .release=1.937424, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=115, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=3.559326, .sustain=0.000000, .release=1.937424, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_16_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=86, .lovel=0, .hivel=127, + .group=0, .offset=457580, .end=457720, .loop_start=457649, .loop_end=457714, + .transpose=0, .tune=-15, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=2.170000, .pan=0.000000, + .attenuationF16P16=142213, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.180076, .decay=8.896606, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.170000, .pan=0.000000, + .attenuationF16P16=142213, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.180076, .decay=8.896606, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=451690, .end=451830, .loop_start=451759, .loop_end=451824, + .transpose=0, .tune=-15, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=2.170000, .pan=0.000000, + .attenuationF16P16=142213, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=1.149307, .decay=10.296875, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.170000, .pan=0.000000, + .attenuationF16P16=142213, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.180076, .decay=8.896606, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9617, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_17_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=75, .lovel=0, .hivel=127, + .group=0, .offset=451875, .end=454550, .loop_start=454489, .loop_end=454543, + .transpose=0, .tune=-37, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=76, .hikey=121, .lovel=0, .hivel=127, + .group=0, .offset=454595, .end=457535, .loop_start=457495, .loop_end=457528, + .transpose=0, .tune=30, .pitch_keycenter=100, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=122, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_18_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=75, .lovel=0, .hivel=127, + .group=0, .offset=451875, .end=454550, .loop_start=454489, .loop_end=454543, + .transpose=0, .tune=-35, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.075000, + .attenuationF16P16=122552, .panF16P16 = 4915, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.480177, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-1374, .vibLfoToPitch=28 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=76, .hikey=121, .lovel=0, .hivel=127, + .group=0, .offset=454595, .end=457535, .loop_start=457496, .loop_end=457529, + .transpose=0, .tune=32, .pitch_keycenter=100, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.075000, + .attenuationF16P16=122552, .panF16P16 = 4915, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.480177, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-1374, .vibLfoToPitch=28 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=122, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.075000, + .attenuationF16P16=122552, .panF16P16 = 4915, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.480177, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.189000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-1374, .vibLfoToPitch=28 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=114, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=5, .pitch_keycenter=93, .pitch_keytrack=100, + .attenuation=3.670000, .pan=0.000000, + .attenuationF16P16=240517, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=1.149307, .decay=10.296875, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=118, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=450, .modLfoToVolume=65, + .delayModLFO=0.000000, + .freqModLFO=-2921, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=115, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=3.670000, .pan=0.000000, + .attenuationF16P16=240517, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=1.149307, .decay=10.296875, .sustain=1.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=118, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=450, .modLfoToVolume=65, + .delayModLFO=0.000000, + .freqModLFO=-2921, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_19_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=451690, .end=451830, .loop_start=451759, .loop_end=451824, + .transpose=0, .tune=-20, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.396158, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-3, + .delayModLFO=0.000000, + .freqModLFO=-7925, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.396158, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-3, + .delayModLFO=0.000000, + .freqModLFO=-7925, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=130975, .end=132407, .loop_start=132340, .loop_end=132401, + .transpose=0, .tune=-28, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.000000, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=30, .initialFilterFc=10325, + .modEnvToPitch=-8, .modEnvToFilterFc=-112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=61, .hikey=87, .lovel=0, .hivel=127, + .group=0, .offset=130975, .end=132407, .loop_start=132340, .loop_end=132401, + .transpose=0, .tune=-28, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.000000, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=30, .initialFilterFc=10325, + .modEnvToPitch=-8, .modEnvToFilterFc=-112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=88, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.186103, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.000000, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=10325, + .modEnvToPitch=-8, .modEnvToFilterFc=-112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_20_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=84, .lovel=0, .hivel=127, + .group=0, .offset=181036, .end=182010, .loop_start=181950, .loop_end=182003, + .transpose=0, .tune=33, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.023009, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=85, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=451690, .end=451830, .loop_start=451758, .loop_end=451823, + .transpose=0, .tune=-15, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.023009, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107021, .loop_end=109451, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.023009, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=457580, .end=457720, .loop_start=457649, .loop_end=457714, + .transpose=0, .tune=-20, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.450089, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.450089, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_21_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=55, .lovel=0, .hivel=127, + .group=0, .offset=297718, .end=298767, .loop_start=298697, .loop_end=298761, + .transpose=0, .tune=-46, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-194, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=56, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=298812, .end=299432, .loop_start=299378, .loop_end=299427, + .transpose=0, .tune=-1, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-194, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=299477, .end=300335, .loop_start=300301, .loop_end=300330, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-194, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-194, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=281804, .end=281944, .loop_start=281873, .loop_end=281938, + .transpose=12, .tune=-18, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.575985, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-1297, .vibLfoToPitch=9 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=12, .tune=-46, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.575985, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-1297, .vibLfoToPitch=9 +} +, +}; +static const struct tsf_region preset_22_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=113, .lovel=0, .hivel=127, + .group=0, .offset=181036, .end=182010, .loop_start=181950, .loop_end=182003, + .transpose=0, .tune=33, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-498, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=114, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-498, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_23_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=297718, .end=298767, .loop_start=298696, .loop_end=298760, + .transpose=0, .tune=-46, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.620000, .pan=0.000000, + .attenuationF16P16=171704, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-498, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=299477, .end=300335, .loop_start=300300, .loop_end=300329, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=2.620000, .pan=0.000000, + .attenuationF16P16=171704, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-498, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.620000, .pan=0.000000, + .attenuationF16P16=171704, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=16, + .delayModLFO=0.000000, + .freqModLFO=-498, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=281804, .end=281944, .loop_start=281873, .loop_end=281938, + .transpose=0, .tune=-20, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.620000, .pan=0.000000, + .attenuationF16P16=171704, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.575985, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.620000, .pan=0.000000, + .attenuationF16P16=171704, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.575985, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_24_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=281989, .end=285818, .loop_start=285716, .loop_end=285812, + .transpose=0, .tune=46, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=57, .hikey=77, .lovel=0, .hivel=127, + .group=0, .offset=285863, .end=291056, .loop_start=290988, .loop_end=291050, + .transpose=0, .tune=-1, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=78, .hikey=97, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=98, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=11.993286, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +}; +static const struct tsf_region preset_25_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=267825, .end=272707, .loop_start=272625, .loop_end=272701, + .transpose=0, .tune=47, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.197205, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=97, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.197205, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=98, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.197205, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=1701, .vibLfoToPitch=-8 +} +, +}; +static const struct tsf_region preset_26_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=96, .lovel=0, .hivel=127, + .group=0, .offset=279038, .end=280519, .loop_start=280439, .loop_end=280513, + .transpose=0, .tune=0, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.970000, .pan=0.000000, + .attenuationF16P16=63569, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.199341, .sustain=0.000034, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9263, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-837, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=97, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.970000, .pan=0.000000, + .attenuationF16P16=63569, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.199341, .sustain=0.000034, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9263, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.120045, + .freqModLFO=-698, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-837, .vibLfoToPitch=-8 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=291101, .end=291220, .loop_start=291110, .loop_end=291214, + .transpose=0, .tune=-18, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.970000, .pan=0.000000, + .attenuationF16P16=63569, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=7.197205, .sustain=0.000989, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10089, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.000000, + .freqModLFO=-837, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.970000, .pan=0.000000, + .attenuationF16P16=63569, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=7.197205, .sustain=0.000989, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10089, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.000000, + .freqModLFO=-837, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_27_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=95, .lovel=0, .hivel=127, + .group=0, .offset=279038, .end=280519, .loop_start=280439, .loop_end=280513, + .transpose=0, .tune=7, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=4.557556, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=96, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=295907, .end=297673, .loop_start=297500, .loop_end=297667, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_28_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=280564, .end=281400, .loop_start=281330, .loop_end=281394, + .transpose=0, .tune=-46, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.467346, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-753, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.467346, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-753, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_29_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=62, .lovel=0, .hivel=127, + .group=0, .offset=292553, .end=294385, .loop_start=294298, .loop_end=294379, + .transpose=0, .tune=-45, .pitch_keycenter=72, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=63, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=294430, .end=295862, .loop_start=295802, .loop_end=295856, + .transpose=0, .tune=-35, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=105, .lovel=0, .hivel=127, + .group=0, .offset=291265, .end=292508, .loop_start=292460, .loop_end=292502, + .transpose=0, .tune=38, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=106, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=291101, .end=291220, .loop_start=291110, .loop_end=291214, + .transpose=0, .tune=-18, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=8.315308, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.520012, .decay=8.315308, .sustain=0.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_30_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=62, .lovel=0, .hivel=127, + .group=0, .offset=292553, .end=294385, .loop_start=294298, .loop_end=294379, + .transpose=0, .tune=-45, .pitch_keycenter=72, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=19.595459, .sustain=0.000026, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=63, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=294430, .end=295862, .loop_start=295802, .loop_end=295856, + .transpose=0, .tune=-35, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=19.595459, .sustain=0.000026, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=291265, .end=292508, .loop_start=292460, .loop_end=292502, + .transpose=0, .tune=38, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=19.595459, .sustain=0.000026, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=113, .lovel=0, .hivel=127, + .group=0, .offset=295907, .end=297673, .loop_start=297500, .loop_end=297667, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=19.595459, .sustain=0.000026, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=114, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=19.595459, .sustain=0.000026, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_31_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=116, .lovel=0, .hivel=127, + .group=0, .offset=281445, .end=281759, .loop_start=281743, .loop_end=281752, + .transpose=0, .tune=8, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.460077, .decay=19.595459, .sustain=0.000026, .release=0.247128, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=117, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.460077, .decay=19.595459, .sustain=0.000026, .release=0.247128, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_32_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=87, .lovel=0, .hivel=127, + .group=0, .offset=235537, .end=237072, .loop_start=236945, .loop_end=237066, + .transpose=0, .tune=44, .pitch_keycenter=66, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.148499, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=88, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.148499, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_33_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=84, .lovel=0, .hivel=127, + .group=0, .offset=237117, .end=238022, .loop_start=237867, .loop_end=238016, + .transpose=0, .tune=0, .pitch_keycenter=62, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=85, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_34_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=89, .lovel=0, .hivel=127, + .group=0, .offset=245614, .end=245739, .loop_start=245623, .loop_end=245733, + .transpose=0, .tune=-20, .pitch_keycenter=67, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=20.797119, .sustain=0.087101, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=90, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=20.797119, .sustain=0.087101, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=20.797119, .sustain=0.087101, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_35_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=238067, .end=240408, .loop_start=240232, .loop_end=240402, + .transpose=0, .tune=33, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7434, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7434, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7434, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_36_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=240453, .end=242574, .loop_start=242270, .loop_end=242567, + .transpose=0, .tune=-10, .pitch_keycenter=50, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=32.000000, .sustain=0.000013, .release=0.170068, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8201, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=110721, .end=113706, .loop_start=113557, .loop_end=113700, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=32.000000, .sustain=0.000013, .release=0.170068, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7139, + .modEnvToPitch=0, .modEnvToFilterFc=4050, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=32.000000, .sustain=0.000013, .release=0.170068, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8201, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_37_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=242619, .end=245083, .loop_start=244964, .loop_end=245077, + .transpose=0, .tune=25, .pitch_keycenter=67, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.144999, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8791, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.144999, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8791, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.000000, + .attenuationF16P16=132382, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.144999, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8791, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_38_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=245128, .end=245569, .loop_start=245137, .loop_end=245563, + .transpose=0, .tune=4, .pitch_keycenter=44, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-1, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=0, .tune=2, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.200034, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_39_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=238067, .end=240408, .loop_start=240232, .loop_end=240402, + .transpose=0, .tune=35, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.600105, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9145, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.600105, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9145, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.600105, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9145, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=89, .lovel=0, .hivel=127, + .group=0, .offset=245614, .end=245739, .loop_start=245623, .loop_end=245733, + .transpose=0, .tune=-15, .pitch_keycenter=67, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=63, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=90, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=63, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=32.000000, .sustain=0.000013, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=63, .initialFilterFc=8024, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_40_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=70, .lovel=0, .hivel=127, + .group=0, .offset=226413, .end=228145, .loop_start=228104, .loop_end=228139, + .transpose=0, .tune=30, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=71, .hikey=74, .lovel=0, .hivel=127, + .group=0, .offset=228190, .end=229957, .loop_start=229892, .loop_end=229951, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=75, .hikey=78, .lovel=0, .hivel=127, + .group=0, .offset=230002, .end=231088, .loop_start=231037, .loop_end=231082, + .transpose=0, .tune=-45, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=79, .hikey=82, .lovel=0, .hivel=127, + .group=0, .offset=231133, .end=232208, .loop_start=232165, .loop_end=232202, + .transpose=0, .tune=24, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=83, .hikey=123, .lovel=0, .hivel=127, + .group=0, .offset=232253, .end=233887, .loop_start=233822, .loop_end=233881, + .transpose=0, .tune=15, .pitch_keycenter=102, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=124, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_41_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=226413, .end=228145, .loop_start=228103, .loop_end=228138, + .transpose=0, .tune=30, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.198080, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=69, .lovel=0, .hivel=127, + .group=0, .offset=228190, .end=229957, .loop_start=229891, .loop_end=229950, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=70, .hikey=73, .lovel=0, .hivel=127, + .group=0, .offset=230002, .end=231088, .loop_start=231036, .loop_end=231081, + .transpose=0, .tune=-45, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=74, .hikey=77, .lovel=0, .hivel=127, + .group=0, .offset=231133, .end=232208, .loop_start=232164, .loop_end=232201, + .transpose=0, .tune=24, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=78, .hikey=123, .lovel=0, .hivel=127, + .group=0, .offset=232253, .end=233887, .loop_start=233821, .loop_end=233880, + .transpose=0, .tune=15, .pitch_keycenter=102, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=124, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=9.934570, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_42_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=53, .lovel=0, .hivel=127, + .group=0, .offset=222788, .end=223988, .loop_start=223915, .loop_end=223982, + .transpose=0, .tune=32, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.216002, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=54, .hikey=105, .lovel=0, .hivel=127, + .group=0, .offset=224033, .end=224880, .loop_start=224832, .loop_end=224874, + .transpose=0, .tune=38, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.216002, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=106, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.216002, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_43_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=85, .lovel=0, .hivel=127, + .group=0, .offset=224925, .end=226368, .loop_start=226227, .loop_end=226362, + .transpose=0, .tune=32, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=86, .hikey=105, .lovel=0, .hivel=127, + .group=0, .offset=224033, .end=224880, .loop_start=224832, .loop_end=224874, + .transpose=0, .tune=38, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.043011, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=106, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_44_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=183958, .end=193267, .loop_start=186567, .loop_end=193261, + .transpose=0, .tune=33, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.791401, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=30, + .delayModLFO=0.260006, + .freqModLFO=460, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=193312, .end=201959, .loop_start=196727, .loop_end=201953, + .transpose=0, .tune=50, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.791401, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=30, + .delayModLFO=0.260006, + .freqModLFO=460, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=202004, .end=212731, .loop_start=205102, .loop_end=212725, + .transpose=0, .tune=36, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.791401, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=30, + .delayModLFO=0.260006, + .freqModLFO=460, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.791401, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=30, + .delayModLFO=0.260006, + .freqModLFO=460, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_45_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=233932, .end=235492, .loop_start=235459, .loop_end=235486, + .transpose=0, .tune=3, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.878983, .sustain=0.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-41, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.878983, .sustain=0.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=-1, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_46_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=249664, .end=253142, .loop_start=253073, .loop_end=253136, + .transpose=0, .tune=25, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_47_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=47, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=3.398621, .sustain=0.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=48, .hikey=48, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=3.398621, .sustain=0.000000, .release=1.393936, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=49, .hikey=51, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=3.398621, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=52, .hikey=55, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=3.198700, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=56, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=2.998322, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=71, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=2.799194, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=72, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=2.599640, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.540211, .decay=3.398621, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_48_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=183958, .end=193267, .loop_start=186567, .loop_end=193261, + .transpose=0, .tune=29, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9853, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=193312, .end=201959, .loop_start=196727, .loop_end=201953, + .transpose=0, .tune=50, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11033, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=202004, .end=212731, .loop_start=205102, .loop_end=212725, + .transpose=0, .tune=36, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11033, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11033, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_49_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=183958, .end=193267, .loop_start=186567, .loop_end=193261, + .transpose=0, .tune=29, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.594238, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11682, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=193312, .end=201959, .loop_start=196727, .loop_end=201953, + .transpose=0, .tune=50, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.594238, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11682, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=202004, .end=212731, .loop_start=205102, .loop_end=212725, + .transpose=0, .tune=36, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.594238, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11682, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.594238, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11682, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_50_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=4, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.051000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.051000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_51_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=8, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.270105, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=3.198700, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=-130, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.270105, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=3.198700, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=-130, .modEnvToFilterFc=112, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=116, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=0, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.270105, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.189000, .release=2.799194, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=100, .initialFilterFc=7670, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=117, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.270105, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.189000, .release=2.799194, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=100, .initialFilterFc=7670, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_52_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=119, .lovel=0, .hivel=127, + .group=0, .offset=468470, .end=477229, .loop_start=468808, .loop_end=477224, + .transpose=0, .tune=10, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.378056, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=120, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.378056, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=0, .tune=-28, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.378056, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=69, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.378056, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=69, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_53_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=92, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=1, .tune=-15, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.180076, .hold=0.020007, .decay=7.386719, .sustain=0.327345, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=11505, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=93, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=1, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.180076, .hold=0.020007, .decay=7.386719, .sustain=0.327345, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=11505, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=490722, .end=493781, .loop_start=493721, .loop_end=493775, + .transpose=0, .tune=-28, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.386719, .sustain=0.110918, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.750000, .pan=0.000000, + .attenuationF16P16=49152, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=7.386719, .sustain=0.110918, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_54_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=0, .tune=-25, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.676086, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.676086, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_55_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=119, .lovel=0, .hivel=127, + .group=0, .offset=422190, .end=426756, .loop_start=422197, .loop_end=426751, + .transpose=0, .tune=35, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=120, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_56_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=151820, .end=153494, .loop_start=153448, .loop_end=153488, + .transpose=0, .tune=-43, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=69, .lovel=0, .hivel=127, + .group=0, .offset=145191, .end=146827, .loop_start=146789, .loop_end=146821, + .transpose=0, .tune=-20, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=70, .hikey=74, .lovel=0, .hivel=127, + .group=0, .offset=146872, .end=148525, .loop_start=148470, .loop_end=148519, + .transpose=0, .tune=-1, .pitch_keycenter=93, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=75, .hikey=79, .lovel=0, .hivel=127, + .group=0, .offset=148570, .end=150067, .loop_start=150024, .loop_end=150061, + .transpose=0, .tune=24, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=80, .hikey=125, .lovel=0, .hivel=127, + .group=0, .offset=150112, .end=151775, .loop_start=151714, .loop_end=151769, + .transpose=0, .tune=-4, .pitch_keycenter=103, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=126, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=42, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_57_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=52, .lovel=0, .hivel=127, + .group=0, .offset=153539, .end=154870, .loop_start=154771, .loop_end=154864, + .transpose=0, .tune=-7, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=9.194458, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=53, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=154915, .end=156249, .loop_start=156190, .loop_end=156243, + .transpose=0, .tune=33, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=9.194458, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=156294, .end=157415, .loop_start=157368, .loop_end=157409, + .transpose=0, .tune=-3, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=9.194458, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=157460, .end=159029, .loop_start=158964, .loop_end=159023, + .transpose=0, .tune=16, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=9.194458, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.767365, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=9.194458, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_58_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=86, .lovel=0, .hivel=127, + .group=0, .offset=159074, .end=161038, .loop_start=160905, .loop_end=161033, + .transpose=0, .tune=38, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=157460, .end=159029, .loop_start=158964, .loop_end=159023, + .transpose=0, .tune=16, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_59_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=161083, .end=162568, .loop_start=162503, .loop_end=162563, + .transpose=0, .tune=44, .pitch_keycenter=78, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=10.398560, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=112, .lovel=0, .hivel=127, + .group=0, .offset=162613, .end=163516, .loop_start=163453, .loop_end=163510, + .transpose=0, .tune=-40, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=10.398560, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=113, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=10.398560, .sustain=0.504000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=5251, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_60_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=128341, .end=129826, .loop_start=129762, .loop_end=129821, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.007000, .hold=0.020007, .decay=11.993286, .sustain=0.179893, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107023, .loop_end=109453, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.007000, .hold=0.020007, .decay=11.993286, .sustain=0.179893, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_61_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=71, .lovel=0, .hivel=127, + .group=0, .offset=133920, .end=139520, .loop_start=139453, .loop_end=139514, + .transpose=0, .tune=-35, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=72, .hikey=116, .lovel=0, .hivel=127, + .group=0, .offset=139565, .end=145146, .loop_start=144554, .loop_end=144599, + .transpose=0, .tune=47, .pitch_keycenter=95, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=117, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=71, .lovel=0, .hivel=127, + .group=0, .offset=133920, .end=139520, .loop_start=139453, .loop_end=139514, + .transpose=0, .tune=-26, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.020007, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.250002, + .freqModLFO=-926, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=72, .hikey=116, .lovel=0, .hivel=127, + .group=0, .offset=139565, .end=145146, .loop_start=144554, .loop_end=144599, + .transpose=0, .tune=-43, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.020007, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.250002, + .freqModLFO=-926, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=117, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.020007, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=10.398560, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=6862, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.250002, + .freqModLFO=-926, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_62_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=0, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=10.398560, .sustain=0.000000, .release=5.398254, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=66, .initialFilterFc=9971, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=0.530869, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=10.398560, .sustain=0.000000, .release=5.398254, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=66, .initialFilterFc=9971, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_63_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=108, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=2, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.010004, .decay=10.398560, .sustain=0.011000, .release=4.597229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=21, .initialFilterFc=6195, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=109, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.993286, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.010004, .decay=10.398560, .sustain=0.011000, .release=4.597229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=21, .initialFilterFc=6195, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_64_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=115187, .end=116337, .loop_start=116241, .loop_end=116331, + .transpose=0, .tune=36, .pitch_keycenter=71, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=57, .hikey=58, .lovel=0, .hivel=127, + .group=0, .offset=116382, .end=117610, .loop_start=117532, .loop_end=117604, + .transpose=0, .tune=-45, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=59, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=117655, .end=119294, .loop_start=119222, .loop_end=119288, + .transpose=0, .tune=5, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=119339, .end=120035, .loop_start=119982, .loop_end=120029, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=120080, .end=120990, .loop_start=120943, .loop_end=120984, + .transpose=0, .tune=-3, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=86, .lovel=0, .hivel=127, + .group=0, .offset=121035, .end=122226, .loop_start=122165, .loop_end=122220, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=122271, .end=123460, .loop_start=123407, .loop_end=123454, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_65_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=53, .lovel=0, .hivel=127, + .group=0, .offset=115187, .end=116337, .loop_start=116241, .loop_end=116331, + .transpose=0, .tune=36, .pitch_keycenter=71, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=54, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=116382, .end=117610, .loop_start=117532, .loop_end=117604, + .transpose=0, .tune=-45, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=62, .lovel=0, .hivel=127, + .group=0, .offset=117655, .end=119294, .loop_start=119222, .loop_end=119288, + .transpose=0, .tune=5, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=63, .hikey=69, .lovel=0, .hivel=127, + .group=0, .offset=119339, .end=120035, .loop_start=119982, .loop_end=120029, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=70, .hikey=73, .lovel=0, .hivel=127, + .group=0, .offset=120080, .end=120990, .loop_start=120943, .loop_end=120984, + .transpose=0, .tune=-3, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=74, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=121035, .end=122226, .loop_start=122165, .loop_end=122220, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=82, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=122271, .end=123460, .loop_start=123407, .loop_end=123454, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_66_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=51, .lovel=0, .hivel=127, + .group=0, .offset=115187, .end=116337, .loop_start=116241, .loop_end=116331, + .transpose=0, .tune=36, .pitch_keycenter=71, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=52, .hikey=54, .lovel=0, .hivel=127, + .group=0, .offset=116382, .end=117610, .loop_start=117532, .loop_end=117604, + .transpose=0, .tune=-45, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=55, .hikey=58, .lovel=0, .hivel=127, + .group=0, .offset=117655, .end=119294, .loop_start=119222, .loop_end=119288, + .transpose=0, .tune=5, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=59, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=119339, .end=120035, .loop_start=119982, .loop_end=120029, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=68, .lovel=0, .hivel=127, + .group=0, .offset=120080, .end=120990, .loop_start=120943, .loop_end=120984, + .transpose=0, .tune=-3, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=69, .hikey=74, .lovel=0, .hivel=127, + .group=0, .offset=121035, .end=122226, .loop_start=122165, .loop_end=122220, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=75, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=122271, .end=123460, .loop_start=123407, .loop_end=123454, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.602543, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_67_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=51, .lovel=0, .hivel=127, + .group=0, .offset=116382, .end=117610, .loop_start=117532, .loop_end=117604, + .transpose=0, .tune=-45, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=52, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=117655, .end=119294, .loop_start=119222, .loop_end=119288, + .transpose=0, .tune=5, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=57, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=119339, .end=120035, .loop_start=119982, .loop_end=120029, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=120080, .end=120990, .loop_start=120943, .loop_end=120984, + .transpose=0, .tune=-3, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=68, .lovel=0, .hivel=127, + .group=0, .offset=121035, .end=122226, .loop_start=122165, .loop_end=122220, + .transpose=0, .tune=-4, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=69, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=122271, .end=123460, .loop_start=123407, .loop_end=123454, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_68_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=63, .lovel=0, .hivel=127, + .group=0, .offset=123505, .end=124397, .loop_start=124337, .loop_end=124390, + .transpose=0, .tune=33, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=64, .hikey=68, .lovel=0, .hivel=127, + .group=0, .offset=124442, .end=125668, .loop_start=125619, .loop_end=125661, + .transpose=0, .tune=38, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=69, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=125713, .end=126711, .loop_start=126671, .loop_end=126704, + .transpose=0, .tune=32, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_69_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=126756, .end=128296, .loop_start=128235, .loop_end=128289, + .transpose=0, .tune=-35, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_70_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=88, .lovel=0, .hivel=127, + .group=0, .offset=129871, .end=130930, .loop_start=130809, .loop_end=130923, + .transpose=0, .tune=41, .pitch_keycenter=67, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=89, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=126756, .end=128296, .loop_start=128235, .loop_end=128289, + .transpose=0, .tune=-35, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_71_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=69, .lovel=0, .hivel=127, + .group=0, .offset=132452, .end=133129, .loop_start=133048, .loop_end=133122, + .transpose=0, .tune=0, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=70, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=133174, .end=133875, .loop_start=133760, .loop_end=133868, + .transpose=0, .tune=49, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.220000, .pan=0.000000, + .attenuationF16P16=14417, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.530869, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_72_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=130975, .end=132407, .loop_start=132340, .loop_end=132401, + .transpose=0, .tune=-28, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.467346, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.467346, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=113, .lovel=0, .hivel=127, + .group=0, .offset=163561, .end=164921, .loop_start=164859, .loop_end=164912, + .transpose=0, .tune=33, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.162011, .hold=0.020007, .decay=11.848755, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9853, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=114, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.000000, + .attenuationF16P16=58982, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.162011, .hold=0.020007, .decay=11.848755, .sustain=0.371544, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=9853, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_73_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=130975, .end=132407, .loop_start=132340, .loop_end=132401, + .transpose=0, .tune=-28, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.059025, .hold=0.160057, .decay=5.819214, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=106, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.059025, .hold=0.160057, .decay=5.819214, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=106, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=-1, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=97, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=97, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_74_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=113, .lovel=0, .hivel=127, + .group=0, .offset=163561, .end=164921, .loop_start=164859, .loop_end=164912, + .transpose=0, .tune=33, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.848755, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=114, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=11.848755, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.260006, + .freqModLFO=-837, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_75_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=-1, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=10.537720, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=10.537720, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=113, .lovel=0, .hivel=127, + .group=0, .offset=163561, .end=164921, .loop_start=164859, .loop_end=164912, + .transpose=0, .tune=40, .pitch_keycenter=92, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=7.386719, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=114, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=7.386719, .sustain=0.676086, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_76_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=164966, .end=170280, .loop_start=164973, .loop_end=170275, + .transpose=0, .tune=38, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=2.139740, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=2.139740, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=-7, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=10.537720, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=10.537720, .sustain=1.000000, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_77_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=-7, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.860966, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.289307, .sustain=0.860966, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_78_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=177838, .end=179025, .loop_start=178982, .loop_end=179019, + .transpose=0, .tune=24, .pitch_keycenter=86, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.060022, .hold=0.020007, .decay=0.020007, .sustain=0.860966, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.280115, + .freqModLFO=-1019, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.060022, .hold=0.020007, .decay=0.020007, .sustain=0.860966, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.280115, + .freqModLFO=-1019, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_79_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=177838, .end=179025, .loop_start=178982, .loop_end=179019, + .transpose=0, .tune=24, .pitch_keycenter=86, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.280115, + .freqModLFO=-1019, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.280115, + .freqModLFO=-1019, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_80_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=443756, .end=446183, .loop_start=446121, .loop_end=446175, + .transpose=0, .tune=-32, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=443756, .end=446183, .loop_start=446121, .loop_end=446175, + .transpose=0, .tune=-39, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_81_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-1, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=10325, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=10325, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=0, .tune=2, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=10915, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=10915, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_82_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=164966, .end=170280, .loop_start=164973, .loop_end=170275, + .transpose=0, .tune=38, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=1.599342, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=1.599342, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=101, .lovel=0, .hivel=127, + .group=0, .offset=443756, .end=446183, .loop_start=446121, .loop_end=446175, + .transpose=0, .tune=-32, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=102, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_83_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=164966, .end=170280, .loop_start=164973, .loop_end=170275, + .transpose=0, .tune=38, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=1.599342, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=1.599342, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=-9, .tune=2, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.044016, .hold=1.269409, .decay=32.000000, .sustain=1.000000, .release=3.198700, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=33, .initialFilterFc=4602, + .modEnvToPitch=919, .modEnvToFilterFc=4612, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-9, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.044016, .hold=1.269409, .decay=32.000000, .sustain=1.000000, .release=3.198700, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=33, .initialFilterFc=4602, + .modEnvToPitch=919, .modEnvToFilterFc=4612, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_84_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=108, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=10, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=109, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=110721, .end=113706, .loop_start=113557, .loop_end=113700, + .transpose=-1, .tune=-15, .pitch_keycenter=80, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.420000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=-149, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-1, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.420000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=-149, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_85_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=170325, .end=177793, .loop_start=172410, .loop_end=177787, + .transpose=0, .tune=-1, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=10.537720, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-78, .modLfoToPitch=47, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=10.537720, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-78, .modLfoToPitch=47, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=119, .lovel=0, .hivel=127, + .group=0, .offset=468470, .end=477229, .loop_start=468808, .loop_end=477224, + .transpose=0, .tune=5, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=33, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-42, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=29, .vibLfoToPitch=9 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=120, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=33, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-42, .modLfoToPitch=-8, + .delayVibLFO=0.000000, + .freqVibLFO=29, .vibLfoToPitch=9 +} +, +}; +static const struct tsf_region preset_86_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-1, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=8.824951, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.199860, .sustain=0.273000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=150, .initialFilterFc=4484, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=8.824951, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.199860, .sustain=0.273000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=150, .initialFilterFc=4484, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=0, .tune=2, .pitch_keycenter=86, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.399017, .sustain=0.294000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.399017, .sustain=0.294000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_87_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=245128, .end=245569, .loop_start=245137, .loop_end=245563, + .transpose=0, .tune=8, .pitch_keycenter=44, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.399000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=36, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=5175, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.300053, + .freqModLFO=-780, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-1, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.399000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=36, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=5175, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.300053, + .freqModLFO=-780, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.399000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=36, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=5175, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.300053, + .freqModLFO=-780, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=0, .tune=2, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.399000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=36, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=5175, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.300053, + .freqModLFO=-780, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.100017, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.399000, .release=2.199860, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=36, .initialFilterFc=4956, + .modEnvToPitch=0, .modEnvToFilterFc=5175, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.300053, + .freqModLFO=-780, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_88_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=13, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.216002, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11328, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.216002, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=11328, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=109503, .end=110676, .loop_start=110623, .loop_end=110670, + .transpose=0, .tune=29, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=6.179504, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.599640, .sustain=0.000000, .release=4.198608, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=15, .initialFilterFc=9263, + .modEnvToPitch=0, .modEnvToFilterFc=2362, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.820000, .pan=0.000000, + .attenuationF16P16=53739, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=6.179504, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.599640, .sustain=0.000000, .release=4.198608, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=15, .initialFilterFc=9263, + .modEnvToPitch=0, .modEnvToFilterFc=2362, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_89_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=10, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.007523, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8555, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.007523, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=8555, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_90_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=108, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=2, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.020007, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=11505, + .modEnvToPitch=-243, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=109, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.020007, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=11505, + .modEnvToPitch=-243, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=102, .lovel=0, .hivel=127, + .group=0, .offset=457765, .end=457835, .loop_start=457780, .loop_end=457829, + .transpose=0, .tune=11, .pitch_keycenter=81, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.440063, .attack=1.269409, .hold=0.000000, .decay=1.199509, .sustain=0.000000, .release=8.097534, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=97, .initialFilterFc=11387, + .modEnvToPitch=-8, .modEnvToFilterFc=-4275, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=103, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.440063, .attack=1.269409, .hold=0.000000, .decay=1.199509, .sustain=0.000000, .release=8.097534, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=97, .initialFilterFc=11387, + .modEnvToPitch=-8, .modEnvToFilterFc=-4275, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_91_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=457880, .end=458020, .loop_start=457949, .loop_end=458014, + .transpose=0, .tune=-20, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.072876, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-42, .modLfoToPitch=28, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.072876, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-42, .modLfoToPitch=28, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=119, .lovel=0, .hivel=127, + .group=0, .offset=468470, .end=477229, .loop_start=468808, .loop_end=477224, + .transpose=0, .tune=5, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.007000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.072876, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=180, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=120, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.000000, + .attenuationF16P16=117964, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.007000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=2.072876, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=180, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_92_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=97, .lovel=0, .hivel=127, + .group=0, .offset=497443, .end=497727, .loop_start=497450, .loop_end=497721, + .transpose=0, .tune=36, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.023009, .hold=1.079796, .decay=12.698975, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.710388, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=98, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.023009, .hold=1.079796, .decay=12.698975, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.710388, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=458065, .end=458205, .loop_start=458134, .loop_end=458199, + .transpose=0, .tune=-20, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.032017, .hold=0.020007, .decay=5.148499, .sustain=0.201839, .release=3.024445, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.010004, .attack=0.006201, .hold=0.160057, .decay=4.798096, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.032017, .hold=0.020007, .decay=5.148499, .sustain=0.201839, .release=3.024445, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.010004, .attack=0.006201, .hold=0.160057, .decay=4.798096, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_93_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=85, .lovel=0, .hivel=127, + .group=0, .offset=224925, .end=226368, .loop_start=226227, .loop_end=226362, + .transpose=0, .tune=32, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.031017, .hold=0.020007, .decay=12.698975, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=6.197327, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=6018, + .modEnvToPitch=0, .modEnvToFilterFc=5062, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=86, .hikey=97, .lovel=0, .hivel=127, + .group=0, .offset=497443, .end=497727, .loop_start=497450, .loop_end=497721, + .transpose=0, .tune=36, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.031017, .hold=0.020007, .decay=12.698975, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=6.197327, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=6018, + .modEnvToPitch=0, .modEnvToFilterFc=5062, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=98, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.031017, .hold=0.020007, .decay=12.698975, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=6.197327, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=81, .initialFilterFc=6018, + .modEnvToPitch=0, .modEnvToFilterFc=5062, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.457352, .hold=0.080029, .decay=5.148499, .sustain=0.000088, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=5.799133, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=78, .initialFilterFc=5782, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.457352, .hold=0.080029, .decay=5.819214, .sustain=0.000088, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=5.799133, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=78, .initialFilterFc=5782, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=85, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.457352, .hold=0.080029, .decay=5.148499, .sustain=0.000088, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=5.799133, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=78, .initialFilterFc=5782, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=86, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=458065, .end=458205, .loop_start=458134, .loop_end=458199, + .transpose=0, .tune=-20, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.457352, .hold=0.080029, .decay=28.788818, .sustain=0.000088, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=5.799133, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=78, .initialFilterFc=5782, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.457352, .hold=0.080029, .decay=28.788818, .sustain=0.000088, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=5.799133, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=78, .initialFilterFc=5782, + .modEnvToPitch=0, .modEnvToFilterFc=5287, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_94_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-4, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.342106, .hold=0.020007, .decay=32.000000, .sustain=0.416864, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.010004, .decay=2.199860, .sustain=0.000000, .release=4.699280, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=129, .initialFilterFc=7788, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=168, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-3357, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.342106, .hold=0.020007, .decay=32.000000, .sustain=0.416864, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.010004, .decay=2.199860, .sustain=0.000000, .release=4.699280, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=129, .initialFilterFc=7788, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=168, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-3357, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-4, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.032017, .hold=0.020007, .decay=32.000000, .sustain=0.416864, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.199860, .sustain=0.000000, .release=4.798096, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=4387, .modLfoToFilterFc=168, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-3357, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.400000, .pan=0.000000, + .attenuationF16P16=157286, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.032017, .hold=0.020007, .decay=32.000000, .sustain=0.416864, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.199860, .sustain=0.000000, .release=4.798096, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=7552, + .modEnvToPitch=0, .modEnvToFilterFc=4387, .modLfoToFilterFc=168, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-3357, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_95_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=108, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=7, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.313162, .hold=0.020007, .decay=11.699097, .sustain=1.000000, .release=3.024445, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.140059, .attack=11.794067, .hold=0.000000, .decay=3.799438, .sustain=0.494000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=100, .initialFilterFc=4484, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=109, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.770000, .pan=0.000000, + .attenuationF16P16=181534, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.313162, .hold=0.020007, .decay=11.699097, .sustain=1.000000, .release=3.024445, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.140059, .attack=11.794067, .hold=0.000000, .decay=3.799438, .sustain=0.494000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=100, .initialFilterFc=4484, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_96_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-4, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=16.000244, .sustain=0.000000, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=3.598602, .sustain=0.000000, .release=5.799133, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=6726, + .modEnvToPitch=0, .modEnvToFilterFc=3937, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.020007, .hold=0.020007, .decay=16.000244, .sustain=0.000000, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=3.598602, .sustain=0.000000, .release=5.799133, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=6726, + .modEnvToPitch=0, .modEnvToFilterFc=3937, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=420338, .end=421318, .loop_start=420345, .loop_end=421313, + .transpose=-16, .tune=-24, .pitch_keycenter=82, .pitch_keytrack=50, + .attenuation=1.570000, .pan=0.000000, + .attenuationF16P16=102891, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.162011, .hold=0.020007, .decay=16.000244, .sustain=0.000000, .release=3.646729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006003, .hold=0.000000, .decay=1.599342, .sustain=0.000000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=109, .initialFilterFc=13500, + .modEnvToPitch=1144, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_97_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=112, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=3, .tune=-14, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.882160, .hold=0.020007, .decay=15.598267, .sustain=0.371544, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.220032, .hold=0.000000, .decay=1.199509, .sustain=0.189000, .release=11.294067, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=72, .initialFilterFc=7080, + .modEnvToPitch=0, .modEnvToFilterFc=3712, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=113, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=1, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.882160, .hold=0.020007, .decay=15.598267, .sustain=0.371544, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.220032, .hold=0.000000, .decay=1.199509, .sustain=0.189000, .release=11.294067, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=72, .initialFilterFc=7080, + .modEnvToPitch=0, .modEnvToFilterFc=3712, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=105, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=3, .tune=-14, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.882160, .hold=0.020007, .decay=15.598267, .sustain=0.371544, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.300053, .hold=0.000000, .decay=1.199509, .sustain=0.231000, .release=10.697144, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=60, .initialFilterFc=7316, + .modEnvToPitch=0, .modEnvToFilterFc=4162, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=106, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=1, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.882160, .hold=0.020007, .decay=15.598267, .sustain=0.371544, .release=3.220917, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.300053, .hold=0.000000, .decay=1.199509, .sustain=0.231000, .release=10.697144, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=60, .initialFilterFc=7316, + .modEnvToPitch=0, .modEnvToFilterFc=4162, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_98_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=94, .lovel=0, .hivel=127, + .group=0, .offset=421363, .end=422145, .loop_start=422059, .loop_end=422139, + .transpose=0, .tune=29, .pitch_keycenter=73, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=5.819214, .sustain=0.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10443, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=95, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=5.819214, .sustain=0.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10443, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=118, .lovel=0, .hivel=127, + .group=0, .offset=446228, .end=451645, .loop_start=451057, .loop_end=451639, + .transpose=0, .tune=-45, .pitch_keycenter=96, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=2.846466, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=119, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.870000, .pan=0.000000, + .attenuationF16P16=122552, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.819214, .sustain=0.000000, .release=2.846466, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_99_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=267825, .end=272707, .loop_start=272625, .loop_end=272701, + .transpose=0, .tune=47, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=3.138275, .sustain=0.371544, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.000031, .sustain=0.000000, .release=2.000031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=15, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=73, .hikey=97, .lovel=0, .hivel=127, + .group=0, .offset=272752, .end=278993, .loop_start=278920, .loop_end=278987, + .transpose=0, .tune=32, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=3.138275, .sustain=0.371544, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.000031, .sustain=0.000000, .release=2.000031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=15, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=98, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=3.138275, .sustain=0.371544, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=2.000031, .sustain=0.000000, .release=2.000031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=15, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=4, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.371544, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.120045, + .freqModLFO=-866, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=28 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=8.315308, .sustain=0.371544, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.120045, + .freqModLFO=-866, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=28 +} +, +}; +static const struct tsf_region preset_100_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=0, .tune=-32, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=4.848267, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=460, .modLfoToPitch=66, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=4.848267, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=460, .modLfoToPitch=66, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=212776, .end=222743, .loop_start=214048, .loop_end=222737, + .transpose=0, .tune=4, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=4.848267, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=4.848267, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_101_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=0, .tune=-32, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=2.700000, .pan=0.000000, + .attenuationF16P16=176947, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=3.958588, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=11.876099, .hold=0.060022, .decay=1.599342, .sustain=0.000000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=54, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=6075, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.700000, .pan=0.000000, + .attenuationF16P16=176947, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=3.958588, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=11.876099, .hold=0.060022, .decay=1.599342, .sustain=0.000000, .release=7.498535, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=54, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=6075, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=32, .tune=-32, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=2.700000, .pan=0.000000, + .attenuationF16P16=176947, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=3.958588, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=11.876099, .hold=0.280115, .decay=6.896057, .sustain=0.000000, .release=7.898926, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=94, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=5737, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=32, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.700000, .pan=0.000000, + .attenuationF16P16=176947, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=3.958588, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=11.876099, .hold=0.280115, .decay=6.896057, .sustain=0.000000, .release=7.898926, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=94, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=5737, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_102_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=119, .lovel=0, .hivel=127, + .group=0, .offset=468470, .end=477229, .loop_start=468808, .loop_end=477224, + .transpose=0, .tune=5, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.600105, .sustain=0.273000, .release=5.598328, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=103, .initialFilterFc=5310, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=120, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.010004, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.600105, .sustain=0.273000, .release=5.598328, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=103, .initialFilterFc=5310, + .modEnvToPitch=0, .modEnvToFilterFc=7087, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=477274, .end=486376, .loop_start=477309, .loop_end=486370, + .transpose=0, .tune=-32, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.954266, .hold=0.020007, .decay=6.956055, .sustain=0.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.935158, .hold=0.000000, .decay=2.799194, .sustain=0.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=460, .modLfoToPitch=28, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.954266, .hold=0.020007, .decay=6.956055, .sustain=0.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.935158, .hold=0.000000, .decay=2.799194, .sustain=0.000000, .release=0.200034, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=75, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=6412, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=460, .modLfoToPitch=28, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_103_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=95, .lovel=0, .hivel=127, + .group=0, .offset=279038, .end=280519, .loop_start=280439, .loop_end=280513, + .transpose=0, .tune=5, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=2.100000, .pan=0.000000, + .attenuationF16P16=137625, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.050009, .hold=0.160057, .decay=7.386719, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=4.198608, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=24, .initialFilterFc=6490, + .modEnvToPitch=0, .modEnvToFilterFc=6637, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-753, .modLfoToPitch=19, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=429962, .end=443711, .loop_start=430251, .loop_end=443706, + .transpose=0, .tune=-4, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.100000, .pan=0.000000, + .attenuationF16P16=137625, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.050009, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.000000, .release=6.298340, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=2.100000, .pan=0.000000, + .attenuationF16P16=137625, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.050009, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=1.000000, .sustain=0.000000, .release=6.298340, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=18, .initialFilterFc=7906, + .modEnvToPitch=0, .modEnvToFilterFc=3487, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_104_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=108, .lovel=0, .hivel=127, + .group=0, .offset=265464, .end=267780, .loop_start=267739, .loop_end=267774, + .transpose=0, .tune=30, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=17.989746, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=109, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=17.989746, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_105_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=258941, .end=261791, .loop_start=261725, .loop_end=261785, + .transpose=0, .tune=44, .pitch_keycenter=78, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=67, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=261836, .end=265419, .loop_start=265376, .loop_end=265414, + .transpose=0, .tune=-31, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_106_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=372492, .end=373656, .loop_start=372499, .loop_end=373651, + .transpose=0, .tune=-28, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=10561, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=258941, .end=261791, .loop_start=261725, .loop_end=261785, + .transpose=0, .tune=44, .pitch_keycenter=78, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.054001, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=6726, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=261836, .end=265419, .loop_start=265376, .loop_end=265414, + .transpose=0, .tune=-31, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.054001, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=6726, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.054001, .hold=0.230040, .decay=2.439575, .sustain=0.000000, .release=0.850147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=6726, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_107_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=253187, .end=258896, .loop_start=258853, .loop_end=258890, + .transpose=0, .tune=24, .pitch_keycenter=86, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=4.027771, .sustain=0.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.160057, .decay=4.027771, .sustain=0.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_108_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=98, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=-20, .pitch_keycenter=76, .pitch_keytrack=100, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.159309, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=96, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=99, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.159309, .sustain=0.000000, .release=1.487961, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=96, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=120, .lovel=0, .hivel=127, + .group=0, .offset=372492, .end=373656, .loop_start=372499, .loop_end=373651, + .transpose=0, .tune=-39, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=121, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_109_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=179070, .end=180991, .loop_start=180834, .loop_end=180982, + .transpose=0, .tune=-14, .pitch_keycenter=62, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=182055, .end=183913, .loop_start=183857, .loop_end=183904, + .transpose=0, .tune=32, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=179070, .end=180991, .loop_start=180834, .loop_end=180982, + .transpose=0, .tune=-6, .pitch_keycenter=62, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=0.767365, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_110_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=70, .lovel=0, .hivel=127, + .group=0, .offset=226413, .end=228145, .loop_start=228104, .loop_end=228139, + .transpose=0, .tune=30, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=71, .hikey=74, .lovel=0, .hivel=127, + .group=0, .offset=228190, .end=229957, .loop_start=229892, .loop_end=229951, + .transpose=0, .tune=15, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=75, .hikey=78, .lovel=0, .hivel=127, + .group=0, .offset=230002, .end=231088, .loop_start=231037, .loop_end=231082, + .transpose=0, .tune=-45, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=79, .hikey=82, .lovel=0, .hivel=127, + .group=0, .offset=231133, .end=232208, .loop_start=232165, .loop_end=232202, + .transpose=0, .tune=24, .pitch_keycenter=98, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=83, .hikey=123, .lovel=0, .hivel=127, + .group=0, .offset=232253, .end=233887, .loop_start=233822, .loop_end=233881, + .transpose=0, .tune=15, .pitch_keycenter=102, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=124, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.650000, .pan=0.000000, + .attenuationF16P16=108134, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=9.934570, .sustain=0.860966, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_111_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=115, .lovel=0, .hivel=127, + .group=0, .offset=182055, .end=183913, .loop_start=183860, .loop_end=183907, + .transpose=0, .tune=29, .pitch_keycenter=94, .pitch_keytrack=100, + .attenuation=0.150000, .pan=0.000000, + .attenuationF16P16=9830, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=8.397339, .sustain=0.416864, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=116, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.150000, .pan=0.000000, + .attenuationF16P16=9830, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=8.397339, .sustain=0.416864, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.380026, + .freqModLFO=-780, .modLfoToPitch=9, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_112_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=458250, .end=458320, .loop_start=458267, .loop_end=458314, + .transpose=0, .tune=29, .pitch_keycenter=84, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.749092, .sustain=0.008710, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=77, .hikey=110, .lovel=0, .hivel=127, + .group=0, .offset=458365, .end=458456, .loop_start=458380, .loop_end=458450, + .transpose=0, .tune=7, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.749092, .sustain=0.008710, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=111, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.749092, .sustain=0.008710, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=373701, .end=378168, .loop_start=373708, .loop_end=378163, + .transpose=0, .tune=19, .pitch_keycenter=107, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.930309, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_113_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=116, .lovel=0, .hivel=127, + .group=0, .offset=373701, .end=378168, .loop_start=373708, .loop_end=378163, + .transpose=0, .tune=50, .pitch_keycenter=95, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.239677, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=117, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.239677, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=86, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=-23, .pitch_keycenter=64, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.239677, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=1.200000, .pan=0.000000, + .attenuationF16P16=78643, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.239677, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_114_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=358545, .end=361479, .loop_start=361402, .loop_end=361435, + .transpose=0, .tune=32, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.250002, .decay=1.079796, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-48, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.250002, .decay=1.079796, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_115_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=124, .lovel=0, .hivel=127, + .group=0, .offset=372492, .end=373656, .loop_start=372499, .loop_end=373651, + .transpose=-16, .tune=-10, .pitch_keycenter=102, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=125, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-16, .tune=-11, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_116_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=117, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=-5, .tune=-12, .pitch_keycenter=95, .pitch_keytrack=50, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.079796, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=118, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-5, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.079796, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=-11, .tune=25, .pitch_keycenter=107, .pitch_keytrack=50, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.429832, .sustain=0.000000, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_117_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=104, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=-4, .tune=-12, .pitch_keycenter=83, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.148499, .sustain=0.000000, .release=1.699318, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=105, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-4, .tune=-24, .pitch_keycenter=112, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=5.148499, .sustain=0.000000, .release=1.699318, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_118_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=-12, .tune=-12, .pitch_keycenter=81, .pitch_keytrack=50, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=1.239677, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.800137, .sustain=0.126000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=516, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.080029, .decay=1.239677, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.800137, .sustain=0.126000, .release=12.698975, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=516, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=-12, .tune=-14, .pitch_keycenter=89, .pitch_keytrack=50, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.529785, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.200034, .sustain=0.000000, .release=0.400066, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=591, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.600000, .pan=0.000000, + .attenuationF16P16=39321, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=1.529785, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.200034, .sustain=0.000000, .release=0.400066, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=591, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_119_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=112, .lovel=0, .hivel=127, + .group=0, .offset=378213, .end=391747, .loop_start=386237, .loop_end=391741, + .transpose=-6, .tune=23, .pitch_keycenter=91, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.696373, .hold=0.020007, .decay=0.289997, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=113, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-6, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.696373, .hold=0.020007, .decay=0.289997, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_120_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=103, .lovel=0, .hivel=127, + .group=0, .offset=493826, .end=497398, .loop_start=493833, .loop_end=497392, + .transpose=-12, .tune=-3, .pitch_keycenter=81, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=104, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=190, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_121_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=91, .lovel=0, .hivel=127, + .group=0, .offset=164966, .end=170280, .loop_start=164973, .loop_end=170275, + .transpose=-5, .tune=19, .pitch_keycenter=70, .pitch_keytrack=50, + .attenuation=3.820000, .pan=0.000000, + .attenuationF16P16=250347, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.557556, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=92, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-5, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=3.820000, .pan=0.000000, + .attenuationF16P16=250347, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.020007, .decay=4.557556, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_122_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=109, .lovel=0, .hivel=127, + .group=0, .offset=459001, .end=466795, .loop_start=458508, .loop_end=466789, + .transpose=0, .tune=9, .pitch_keycenter=88, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=2.789490, .hold=1.779663, .decay=4.027771, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=5.235474, .hold=0.260006, .decay=4.198608, .sustain=0.000000, .release=7.696106, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=57, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=3937, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=110, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=2.789490, .hold=1.779663, .decay=4.027771, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=5.235474, .hold=0.260006, .decay=4.198608, .sustain=0.000000, .release=7.696106, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=57, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=3937, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=120, .lovel=0, .hivel=127, + .group=0, .offset=458501, .end=466795, .loop_start=458508, .loop_end=466789, + .transpose=0, .tune=9, .pitch_keycenter=99, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.100017, .hold=0.020007, .decay=6.956055, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=5.235474, .hold=0.260006, .decay=5.799133, .sustain=0.000000, .release=7.898926, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=57, .initialFilterFc=5310, + .modEnvToPitch=0, .modEnvToFilterFc=2587, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=121, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=2.789490, .hold=1.779663, .decay=4.027771, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=5.235474, .hold=0.260006, .decay=4.198608, .sustain=0.000000, .release=7.696106, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=57, .initialFilterFc=4602, + .modEnvToPitch=0, .modEnvToFilterFc=3937, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_123_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=127, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=0, .pitch_keycenter=51, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.450089, .hold=0.020007, .decay=1.878983, .sustain=0.000000, .release=0.800137, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.187073, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=9.099365, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=160, .initialFilterFc=13500, + .modEnvToPitch=-599, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.730358, + .freqModLFO=460, .modLfoToPitch=-55, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=99, .lovel=0, .hivel=127, + .group=0, .offset=859554, .end=523794, .loop_start=859692, .loop_end=523794, + .transpose=0, .tune=0, .pitch_keycenter=51, .pitch_keytrack=50, + .attenuation=0.000700, .pan=0.000000, + .attenuationF16P16=45, .panF16P16 = 0, + .ampenv={ .delay=1.000000, .attack=0.008004, .hold=0.020007, .decay=7.598816, .sustain=1.000000, .release=1.399590, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=1.000000, .attack=0.187073, .hold=1.000000, .decay=1.000000, .sustain=1.000000, .release=9.099365, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=160, .initialFilterFc=13500, + .modEnvToPitch=-599, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.100017, + .freqModLFO=460, .modLfoToPitch=281, + .delayVibLFO=1.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=100, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=0, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=127, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=0, .pitch_keycenter=35, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.450089, .hold=0.210096, .decay=0.600105, .sustain=0.000026, .release=1.199509, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.374147, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=160, .initialFilterFc=13500, + .modEnvToPitch=-599, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.730358, + .freqModLFO=460, .modLfoToPitch=-599, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=83, .lovel=0, .hivel=127, + .group=0, .offset=429777, .end=429917, .loop_start=429846, .loop_end=429911, + .transpose=0, .tune=0, .pitch_keycenter=35, .pitch_keytrack=50, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.210096, .decay=22.393311, .sustain=0.000026, .release=3.098694, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.374147, .hold=0.000000, .decay=0.400066, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=160, .initialFilterFc=13500, + .modEnvToPitch=-599, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.160057, + .freqModLFO=460, .modLfoToPitch=-599, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_124_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=466840, .end=468425, .loop_start=466817, .loop_end=468451, + .transpose=-3, .tune=17, .pitch_keycenter=86, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=103, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-3, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=103, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=107, .lovel=0, .hivel=127, + .group=0, .offset=466840, .end=468425, .loop_start=466817, .loop_end=468451, + .transpose=0, .tune=16, .pitch_keycenter=85, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=112, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=108, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-3, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=1.050000, .pan=0.000000, + .attenuationF16P16=68812, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=103, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_125_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=458501, .end=466795, .loop_start=458508, .loop_end=466789, + .transpose=-12, .tune=9, .pitch_keycenter=85, .pitch_keytrack=50, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.367622, .hold=0.020007, .decay=7.839783, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=4838, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=3543, .modLfoToVolume=118, + .delayModLFO=0.000000, + .freqModLFO=258, .modLfoToPitch=591, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=60, .hikey=106, .lovel=0, .hivel=127, + .group=0, .offset=458501, .end=466795, .loop_start=458508, .loop_end=466789, + .transpose=-12, .tune=9, .pitch_keycenter=85, .pitch_keytrack=50, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.367622, .hold=0.020007, .decay=7.839783, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=4838, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=3543, .modLfoToVolume=118, + .delayModLFO=0.000000, + .freqModLFO=258, .modLfoToPitch=591, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=107, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.367622, .hold=0.020007, .decay=7.839783, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=4838, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=3543, .modLfoToVolume=118, + .delayModLFO=0.000000, + .freqModLFO=258, .modLfoToPitch=591, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=468470, .end=477229, .loop_start=468808, .loop_end=477224, + .transpose=-24, .tune=2, .pitch_keycenter=127, .pitch_keytrack=50, + .attenuation=1.720000, .pan=0.000000, + .attenuationF16P16=112721, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=1.367622, .hold=0.020007, .decay=7.839783, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=9, .initialFilterFc=4838, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=3543, .modLfoToVolume=118, + .delayModLFO=0.000000, + .freqModLFO=258, .modLfoToPitch=47, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_126_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=111, .lovel=0, .hivel=127, + .group=0, .offset=393611, .end=401772, .loop_start=393618, .loop_end=401766, + .transpose=-8, .tune=23, .pitch_keycenter=98, .pitch_keytrack=50, + .attenuation=0.450000, .pan=0.217000, + .attenuationF16P16=29491, .panF16P16 = 14221, + .ampenv={ .delay=0.000000, .attack=2.500946, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=112, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-8, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=2.500946, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=0, .hikey=124, .lovel=0, .hivel=127, + .group=0, .offset=393611, .end=401772, .loop_start=393618, .loop_end=401766, + .transpose=-8, .tune=23, .pitch_keycenter=103, .pitch_keytrack=50, + .attenuation=0.450000, .pan=-0.287000, + .attenuationF16P16=29491, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=2.500946, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=125, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-8, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=2.500946, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_127_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=114, .lovel=0, .hivel=127, + .group=0, .offset=310004, .end=315400, .loop_start=310011, .loop_end=315395, + .transpose=-12, .tune=17, .pitch_keycenter=93, .pitch_keytrack=50, + .attenuation=0.000000, .pan=-0.216000, + .attenuationF16P16=0, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=115, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=-0.216000, + .attenuationF16P16=0, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=0, .hikey=117, .lovel=0, .hivel=127, + .group=0, .offset=310004, .end=315400, .loop_start=310011, .loop_end=315395, + .transpose=-12, .tune=17, .pitch_keycenter=96, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.288000, + .attenuationF16P16=0, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=118, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=104059, .end=109458, .loop_start=107022, .loop_end=109452, + .transpose=-12, .tune=-24, .pitch_keycenter=111, .pitch_keytrack=50, + .attenuation=0.000000, .pan=0.288000, + .attenuationF16P16=0, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_128_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=27, .hikey=27, .lovel=0, .hivel=127, + .group=0, .offset=300380, .end=300800, .loop_start=300387, .loop_end=300795, + .transpose=0, .tune=-31, .pitch_keycenter=45, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.100017, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=28, .hikey=28, .lovel=0, .hivel=127, + .group=0, .offset=458501, .end=466795, .loop_start=458508, .loop_end=466789, + .transpose=0, .tune=19, .pitch_keycenter=51, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.930309, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=28, .hikey=28, .lovel=0, .hivel=127, + .group=0, .offset=315445, .end=316653, .loop_start=315452, .loop_end=316648, + .transpose=0, .tune=-48, .pitch_keycenter=54, .pitch_keytrack=100, + .attenuation=1.420000, .pan=0.000000, + .attenuationF16P16=93061, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.260006, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=29, .hikey=29, .lovel=0, .hivel=127, + .group=0, .offset=323915, .end=325576, .loop_start=323922, .loop_end=325571, + .transpose=0, .tune=-48, .pitch_keycenter=57, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=30, .hikey=30, .lovel=0, .hivel=127, + .group=0, .offset=493826, .end=497398, .loop_start=493833, .loop_end=497392, + .transpose=0, .tune=-12, .pitch_keycenter=42, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=31, .hikey=31, .lovel=0, .hivel=127, + .group=0, .offset=364333, .end=364703, .loop_start=364340, .loop_end=364698, + .transpose=0, .tune=4, .pitch_keycenter=42, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.000000, + .attenuationF16P16=24248, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=32, .hikey=32, .lovel=0, .hivel=127, + .group=0, .offset=490604, .end=490677, .loop_start=490611, .loop_end=490671, + .transpose=0, .tune=0, .pitch_keycenter=31, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.430012, .decay=0.020007, .sustain=1.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=33, .hikey=33, .lovel=0, .hivel=127, + .group=0, .offset=315445, .end=316653, .loop_start=315452, .loop_end=316648, + .transpose=0, .tune=-48, .pitch_keycenter=51, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.040014, .sustain=0.000000, .release=0.034018, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=34, .hikey=34, .lovel=0, .hivel=127, + .group=0, .offset=315445, .end=316653, .loop_start=315452, .loop_end=316648, + .transpose=0, .tune=-48, .pitch_keycenter=51, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.330069, .sustain=0.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=34, .hikey=34, .lovel=0, .hivel=127, + .group=0, .offset=458365, .end=458456, .loop_start=458380, .loop_end=458450, + .transpose=0, .tune=-34, .pitch_keycenter=44, .pitch_keytrack=100, + .attenuation=1.270000, .pan=0.000000, + .attenuationF16P16=83230, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.948517, .sustain=0.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=35, .hikey=35, .lovel=0, .hivel=127, + .group=0, .offset=308356, .end=309959, .loop_start=308363, .loop_end=309954, + .transpose=0, .tune=2, .pitch_keycenter=50, .pitch_keytrack=100, + .attenuation=0.300000, .pan=0.000000, + .attenuationF16P16=19660, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.768616, .sustain=0.000000, .release=0.306007, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=36, .hikey=36, .lovel=0, .hivel=127, + .group=0, .offset=308356, .end=309959, .loop_start=308363, .loop_end=309954, + .transpose=0, .tune=24, .pitch_keycenter=48, .pitch_keytrack=100, + .attenuation=0.070000, .pan=0.000000, + .attenuationF16P16=4587, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.020007, .sustain=1.000000, .release=0.340134, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=37, .hikey=37, .lovel=0, .hivel=127, + .group=0, .offset=315445, .end=316653, .loop_start=315452, .loop_end=316648, + .transpose=0, .tune=-48, .pitch_keycenter=56, .pitch_keytrack=100, + .attenuation=1.350000, .pan=0.000000, + .attenuationF16P16=88473, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.400066, .sustain=0.000000, .release=0.451130, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=38, .hikey=38, .lovel=0, .hivel=127, + .group=0, .offset=486421, .end=490298, .loop_start=486428, .loop_end=490293, + .transpose=0, .tune=-43, .pitch_keycenter=56, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.000000, + .attenuationF16P16=29491, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.529785, .sustain=0.000000, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=39, .hikey=39, .lovel=0, .hivel=127, + .group=0, .offset=393611, .end=401772, .loop_start=393618, .loop_end=401766, + .transpose=0, .tune=-21, .pitch_keycenter=46, .pitch_keytrack=100, + .attenuation=0.900000, .pan=-0.216000, + .attenuationF16P16=58982, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.740124, .sustain=0.000000, .release=0.629219, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=39, .hikey=39, .lovel=0, .hivel=127, + .group=0, .offset=393611, .end=401772, .loop_start=393618, .loop_end=401766, + .transpose=0, .tune=47, .pitch_keycenter=79, .pitch_keytrack=100, + .attenuation=0.900000, .pan=-0.216000, + .attenuationF16P16=58982, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.860027, .sustain=0.000000, .release=0.731201, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=40, .hikey=40, .lovel=0, .hivel=127, + .group=0, .offset=486421, .end=490298, .loop_start=486428, .loop_end=490293, + .transpose=0, .tune=8, .pitch_keycenter=52, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.239677, .sustain=0.000000, .release=1.130867, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=40, .hikey=40, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-48, .pitch_keycenter=51, .pitch_keytrack=100, + .attenuation=1.120000, .pan=0.000000, + .attenuationF16P16=73400, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=41, .hikey=41, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=18, .pitch_keycenter=69, .pitch_keytrack=100, + .attenuation=1.120000, .pan=-0.216000, + .attenuationF16P16=73400, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.948517, .sustain=0.000000, .release=2.506714, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=42, .hikey=42, .lovel=0, .hivel=127, + .group=1, .offset=497772, .end=509482, .loop_start=503600, .loop_end=509476, + .transpose=0, .tune=-37, .pitch_keycenter=50, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.146000, + .attenuationF16P16=43909, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.006003, .hold=0.010004, .decay=0.400066, .sustain=0.000011, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=43, .hikey=43, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-25, .pitch_keycenter=68, .pitch_keytrack=100, + .attenuation=0.670000, .pan=-0.074000, + .attenuationF16P16=43909, .panF16P16 = -4849, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.599640, .sustain=0.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=44, .hikey=44, .lovel=0, .hivel=127, + .group=1, .offset=497772, .end=509482, .loop_start=503600, .loop_end=509476, + .transpose=0, .tune=-46, .pitch_keycenter=52, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.146000, + .attenuationF16P16=43909, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.014001, .hold=0.010004, .decay=0.000000, .sustain=0.000011, .release=0.170068, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=45, .hikey=45, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-25, .pitch_keycenter=67, .pitch_keytrack=100, + .attenuation=0.670000, .pan=-0.074000, + .attenuationF16P16=43909, .panF16P16 = -4849, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.278778, .sustain=0.000000, .release=1.937424, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=46, .hikey=46, .lovel=0, .hivel=127, + .group=1, .offset=497772, .end=509482, .loop_start=503600, .loop_end=509476, + .transpose=0, .tune=-17, .pitch_keycenter=54, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.075000, + .attenuationF16P16=29491, .panF16P16 = 4915, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=3.559326, .sustain=0.000000, .release=1.937424, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=47, .hikey=47, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-4, .pitch_keycenter=66, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.000000, + .attenuationF16P16=34078, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=48, .hikey=48, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=40, .pitch_keycenter=63, .pitch_keytrack=100, + .attenuation=0.670000, .pan=0.000000, + .attenuationF16P16=43909, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.000031, .sustain=0.000000, .release=1.937424, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=49, .hikey=49, .lovel=0, .hivel=127, + .group=0, .offset=378213, .end=391747, .loop_start=386237, .loop_end=391741, + .transpose=0, .tune=47, .pitch_keycenter=68, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.146000, + .attenuationF16P16=0, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=3.138275, .sustain=0.000000, .release=2.668121, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=50, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-25, .pitch_keycenter=61, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.288000, + .attenuationF16P16=58982, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.639542, .sustain=0.000000, .release=1.393936, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=51, .hikey=51, .lovel=0, .hivel=127, + .group=0, .offset=509527, .end=522820, .loop_start=516986, .loop_end=522814, + .transpose=0, .tune=-7, .pitch_keycenter=59, .pitch_keytrack=100, + .attenuation=1.420000, .pan=-0.216000, + .attenuationF16P16=93061, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.768616, .sustain=0.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=52, .hikey=52, .lovel=0, .hivel=127, + .group=0, .offset=407896, .end=417596, .loop_start=414058, .loop_end=417590, + .transpose=0, .tune=47, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.750000, .pan=-0.145000, + .attenuationF16P16=49152, .panF16P16 = -9502, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=3.138275, .sustain=0.000000, .release=2.072876, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=53, .hikey=53, .lovel=0, .hivel=127, + .group=0, .offset=401817, .end=407851, .loop_start=405431, .loop_end=407845, + .transpose=0, .tune=8, .pitch_keycenter=71, .pitch_keytrack=100, + .attenuation=0.900000, .pan=-0.216000, + .attenuationF16P16=58982, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.278778, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=2, + .sample_rate=44100, + .lokey=54, .hikey=54, .lovel=0, .hivel=127, + .group=0, .offset=325621, .end=329225, .loop_start=327778, .loop_end=329205, + .transpose=0, .tune=35, .pitch_keycenter=70, .pitch_keytrack=100, + .attenuation=0.520000, .pan=0.146000, + .attenuationF16P16=34078, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.080029, .decay=2.000031, .sustain=0.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=55, .hikey=55, .lovel=0, .hivel=127, + .group=0, .offset=378213, .end=391747, .loop_start=386237, .loop_end=391741, + .transpose=0, .tune=47, .pitch_keycenter=65, .pitch_keytrack=100, + .attenuation=0.900000, .pan=-0.074000, + .attenuationF16P16=58982, .panF16P16 = -4849, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.599640, .sustain=0.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=56, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=329270, .end=331030, .loop_start=329277, .loop_end=331025, + .transpose=0, .tune=-14, .pitch_keycenter=72, .pitch_keytrack=100, + .attenuation=2.020000, .pan=0.146000, + .attenuationF16P16=132382, .panF16P16 = 9568, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.080029, .decay=1.429832, .sustain=0.000000, .release=3.874817, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=57, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=378213, .end=391747, .loop_start=386237, .loop_end=391741, + .transpose=0, .tune=47, .pitch_keycenter=74, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.216000, + .attenuationF16P16=0, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.599640, .sustain=0.000000, .release=2.208801, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=58, .hikey=58, .lovel=0, .hivel=127, + .group=0, .offset=331075, .end=331863, .loop_start=331084, .loop_end=331857, + .transpose=0, .tune=0, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.429000, + .attenuationF16P16=0, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.599640, .sustain=0.000000, .release=1.597488, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=59, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=509527, .end=522820, .loop_start=516986, .loop_end=522814, + .transpose=0, .tune=18, .pitch_keycenter=66, .pitch_keytrack=100, + .attenuation=1.650000, .pan=-0.287000, + .attenuationF16P16=108134, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.768616, .sustain=0.000000, .release=2.353729, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=60, .hikey=60, .lovel=0, .hivel=127, + .group=0, .offset=331908, .end=335112, .loop_start=331915, .loop_end=335107, + .transpose=0, .tune=21, .pitch_keycenter=78, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.358000, + .attenuationF16P16=0, .panF16P16 = 23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.120045, .decay=1.000000, .sustain=0.000000, .release=0.374147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=61, .hikey=61, .lovel=0, .hivel=127, + .group=0, .offset=335157, .end=337881, .loop_start=335164, .loop_end=337876, + .transpose=0, .tune=-18, .pitch_keycenter=77, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.217000, + .attenuationF16P16=0, .panF16P16 = 14221, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.000000, .sustain=0.000000, .release=0.536171, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=62, .hikey=62, .lovel=0, .hivel=127, + .group=0, .offset=337926, .end=340849, .loop_start=337933, .loop_end=340844, + .transpose=0, .tune=43, .pitch_keycenter=82, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.287000, + .attenuationF16P16=0, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.000000, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=63, .hikey=63, .lovel=0, .hivel=127, + .group=0, .offset=340894, .end=343985, .loop_start=340901, .loop_end=343980, + .transpose=0, .tune=-46, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.429000, + .attenuationF16P16=0, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.860027, .sustain=0.000000, .release=0.374147, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=64, .hikey=64, .lovel=0, .hivel=127, + .group=0, .offset=344030, .end=348052, .loop_start=344037, .loop_end=348047, + .transpose=0, .tune=21, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.429000, + .attenuationF16P16=0, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.930309, .sustain=0.000000, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=65, .hikey=65, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.217000, + .attenuationF16P16=0, .panF16P16 = 14221, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.429832, .sustain=0.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=66, .hikey=66, .lovel=0, .hivel=127, + .group=0, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=95, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.288000, + .attenuationF16P16=0, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.429832, .sustain=0.000000, .release=0.986229, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=67, .hikey=67, .lovel=0, .hivel=127, + .group=0, .offset=373701, .end=378168, .loop_start=373708, .loop_end=378163, + .transpose=0, .tune=50, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.287000, + .attenuationF16P16=0, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.860027, .sustain=0.000000, .release=0.306007, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=68, .hikey=68, .lovel=0, .hivel=127, + .group=0, .offset=373701, .end=378168, .loop_start=373708, .loop_end=378163, + .transpose=0, .tune=50, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.287000, + .attenuationF16P16=0, .panF16P16 = -18808, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.860027, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=69, .hikey=69, .lovel=0, .hivel=127, + .group=0, .offset=348097, .end=350776, .loop_start=348104, .loop_end=350771, + .transpose=0, .tune=-14, .pitch_keycenter=85, .pitch_keytrack=100, + .attenuation=0.000000, .pan=-0.358000, + .attenuationF16P16=0, .panF16P16 = -23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.000000, .sustain=0.000000, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=70, .hikey=70, .lovel=0, .hivel=127, + .group=0, .offset=350821, .end=354075, .loop_start=350828, .loop_end=354070, + .transpose=0, .tune=27, .pitch_keycenter=83, .pitch_keytrack=100, + .attenuation=0.900000, .pan=-0.358000, + .attenuationF16P16=58982, .panF16P16 = -23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.599342, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=71, .hikey=71, .lovel=0, .hivel=127, + .group=2, .offset=354120, .end=355807, .loop_start=355241, .loop_end=355792, + .transpose=0, .tune=36, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=2.100000, .pan=0.217000, + .attenuationF16P16=137625, .panF16P16 = 14221, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.210096, .decay=0.020007, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=72, .hikey=72, .lovel=0, .hivel=127, + .group=2, .offset=354120, .end=355807, .loop_start=355241, .loop_end=355792, + .transpose=0, .tune=36, .pitch_keycenter=91, .pitch_keytrack=100, + .attenuation=1.570000, .pan=0.217000, + .attenuationF16P16=102891, .panF16P16 = 14221, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.550289, .decay=0.020007, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=73, .hikey=73, .lovel=0, .hivel=127, + .group=3, .offset=355852, .end=358500, .loop_start=355859, .loop_end=358495, + .transpose=0, .tune=-25, .pitch_keycenter=90, .pitch_keytrack=100, + .attenuation=1.800000, .pan=0.288000, + .attenuationF16P16=117964, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.000031, .sustain=0.000000, .release=0.306007, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=74, .hikey=74, .lovel=0, .hivel=127, + .group=3, .offset=361524, .end=364288, .loop_start=361531, .loop_end=364282, + .transpose=0, .tune=-46, .pitch_keycenter=102, .pitch_keytrack=100, + .attenuation=0.900000, .pan=0.358000, + .attenuationF16P16=58982, .panF16P16 = 23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.139740, .sustain=0.000000, .release=0.493116, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=75, .hikey=75, .lovel=0, .hivel=127, + .group=0, .offset=391792, .end=393566, .loop_start=391799, .loop_end=393561, + .transpose=0, .tune=40, .pitch_keycenter=100, .pitch_keytrack=100, + .attenuation=0.450000, .pan=0.288000, + .attenuationF16P16=29491, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=76, .hikey=76, .lovel=0, .hivel=127, + .group=0, .offset=372492, .end=373656, .loop_start=372499, .loop_end=373651, + .transpose=0, .tune=-45, .pitch_keycenter=104, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.358000, + .attenuationF16P16=24248, .panF16P16 = 23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.100017, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=77, .hikey=77, .lovel=0, .hivel=127, + .group=0, .offset=372492, .end=373656, .loop_start=372499, .loop_end=373651, + .transpose=0, .tune=-45, .pitch_keycenter=111, .pitch_keytrack=100, + .attenuation=0.370000, .pan=0.288000, + .attenuationF16P16=24248, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.230040, .sustain=0.000000, .release=0.017009, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=78, .hikey=78, .lovel=0, .hivel=127, + .group=4, .offset=417641, .end=419268, .loop_start=417648, .loop_end=419263, + .transpose=0, .tune=35, .pitch_keycenter=87, .pitch_keytrack=100, + .attenuation=1.500000, .pan=-0.216000, + .attenuationF16P16=98304, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.000000, .sustain=0.000000, .release=0.281090, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=79, .hikey=79, .lovel=0, .hivel=127, + .group=4, .offset=417641, .end=419268, .loop_start=417648, .loop_end=419263, + .transpose=0, .tune=35, .pitch_keycenter=105, .pitch_keytrack=100, + .attenuation=0.670000, .pan=-0.216000, + .attenuationF16P16=43909, .panF16P16 = -14155, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.000000, .sustain=0.000000, .release=0.196031, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=80, .hikey=80, .lovel=0, .hivel=127, + .group=5, .offset=427663, .end=429732, .loop_start=427999, .loop_end=429726, + .transpose=0, .tune=-32, .pitch_keycenter=88, .pitch_keytrack=100, + .attenuation=2.770000, .pan=-0.429000, + .attenuationF16P16=181534, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.680267, .sustain=0.000000, .release=0.068036, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=81, .hikey=81, .lovel=0, .hivel=127, + .group=5, .offset=427663, .end=429732, .loop_start=427999, .loop_end=429726, + .transpose=0, .tune=-42, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=2.170000, .pan=-0.358000, + .attenuationF16P16=142213, .panF16P16 = -23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.749092, .sustain=0.000000, .release=1.300583, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=82, .hikey=82, .lovel=0, .hivel=127, + .group=0, .offset=348097, .end=350776, .loop_start=348104, .loop_end=350771, + .transpose=0, .tune=-14, .pitch_keycenter=95, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.288000, + .attenuationF16P16=0, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.800137, .sustain=0.000000, .release=0.247128, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=2, + .sample_rate=44100, + .lokey=83, .hikey=83, .lovel=0, .hivel=127, + .group=0, .offset=325621, .end=329225, .loop_start=327778, .loop_end=329205, + .transpose=0, .tune=4, .pitch_keycenter=104, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.358000, + .attenuationF16P16=0, .panF16P16 = 23461, + .ampenv={ .delay=0.000000, .attack=0.234061, .hold=0.020007, .decay=1.429832, .sustain=0.000000, .release=1.215569, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=83, .hikey=83, .lovel=0, .hivel=127, + .group=0, .offset=407896, .end=417596, .loop_start=414058, .loop_end=417590, + .transpose=0, .tune=47, .pitch_keycenter=73, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.358000, + .attenuationF16P16=0, .panF16P16 = 23461, + .ampenv={ .delay=0.000000, .attack=0.021002, .hold=0.020007, .decay=1.429832, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=84, .hikey=84, .lovel=0, .hivel=127, + .group=0, .offset=300845, .end=308311, .loop_start=307108, .loop_end=308305, + .transpose=0, .tune=-12, .pitch_keycenter=105, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.288000, + .attenuationF16P16=0, .panF16P16 = 18874, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.000031, .sustain=0.000000, .release=0.918022, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=85, .hikey=85, .lovel=0, .hivel=127, + .group=0, .offset=331908, .end=335112, .loop_start=331915, .loop_end=335107, + .transpose=0, .tune=21, .pitch_keycenter=89, .pitch_keytrack=100, + .attenuation=2.850000, .pan=-0.429000, + .attenuationF16P16=186777, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.400066, .sustain=0.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=85, .hikey=85, .lovel=0, .hivel=127, + .group=0, .offset=490604, .end=490677, .loop_start=490611, .loop_end=490671, + .transpose=0, .tune=0, .pitch_keycenter=71, .pitch_keytrack=100, + .attenuation=2.850000, .pan=-0.429000, + .attenuationF16P16=186777, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.400066, .sustain=1.000000, .release=0.577984, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=44100, + .lokey=86, .hikey=86, .lovel=0, .hivel=127, + .group=6, .offset=335157, .end=337881, .loop_start=335164, .loop_end=337876, + .transpose=0, .tune=-18, .pitch_keycenter=104, .pitch_keytrack=100, + .attenuation=2.020000, .pan=-0.358000, + .attenuationF16P16=132382, .panF16P16 = -23461, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=1.599342, .sustain=0.000000, .release=0.680267, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=87, .lovel=0, .hivel=127, + .group=6, .offset=316698, .end=323870, .loop_start=321934, .loop_end=323864, + .transpose=0, .tune=-25, .pitch_keycenter=113, .pitch_keytrack=100, + .attenuation=1.650000, .pan=-0.429000, + .attenuationF16P16=108134, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=2.948517, .sustain=0.000000, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +{ + .loop_mode=1, + .sample_rate=44100, + .lokey=87, .hikey=87, .lovel=0, .hivel=127, + .group=6, .offset=364748, .end=372447, .loop_start=371827, .loop_end=372442, + .transpose=0, .tune=50, .pitch_keycenter=125, .pitch_keytrack=100, + .attenuation=1.650000, .pan=-0.429000, + .attenuationF16P16=108134, .panF16P16 = -28114, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.020007, .decay=0.400066, .sustain=0.012590, .release=1.818115, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.006201, .hold=0.000000, .decay=0.000000, .sustain=0.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=-725, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=-15600, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_preset presets[] PROGMEM = { +{ + .presetName={80,105,97,110,111,32,49,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=0, .bank=0, + .regions=preset_0_regions, + .regionNum=8 +}, +{ + .presetName={80,105,97,110,111,32,50,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=1, .bank=0, + .regions=preset_1_regions, + .regionNum=8 +}, +{ + .presetName={80,105,97,110,111,32,51,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=2, .bank=0, + .regions=preset_2_regions, + .regionNum=6 +}, +{ + .presetName={72,111,110,107,121,45,84,111,110,107,32,32,0,0,0,0,0,0,0,0}, + .preset=3, .bank=0, + .regions=preset_3_regions, + .regionNum=16 +}, +{ + .presetName={69,32,80,105,97,110,111,32,49,32,32,32,0,0,0,0,0,0,0,0}, + .preset=4, .bank=0, + .regions=preset_4_regions, + .regionNum=8 +}, +{ + .presetName={69,32,80,105,97,110,111,32,50,32,32,32,0,0,0,0,0,0,0,0}, + .preset=5, .bank=0, + .regions=preset_5_regions, + .regionNum=2 +}, +{ + .presetName={72,97,114,112,115,105,99,104,111,114,100,32,0,0,0,0,0,0,0,0}, + .preset=6, .bank=0, + .regions=preset_6_regions, + .regionNum=5 +}, +{ + .presetName={67,108,97,118,105,110,101,116,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=7, .bank=0, + .regions=preset_7_regions, + .regionNum=2 +}, +{ + .presetName={67,101,108,101,115,116,97,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=8, .bank=0, + .regions=preset_8_regions, + .regionNum=3 +}, +{ + .presetName={71,108,111,99,107,101,110,115,112,105,101,108,0,0,0,0,0,0,0,0}, + .preset=9, .bank=0, + .regions=preset_9_regions, + .regionNum=4 +}, +{ + .presetName={77,117,115,105,99,32,66,111,120,32,32,32,0,0,0,0,0,0,0,0}, + .preset=10, .bank=0, + .regions=preset_10_regions, + .regionNum=6 +}, +{ + .presetName={86,105,98,114,97,112,104,111,110,101,32,32,0,0,0,0,0,0,0,0}, + .preset=11, .bank=0, + .regions=preset_11_regions, + .regionNum=3 +}, +{ + .presetName={77,97,114,105,109,98,97,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=12, .bank=0, + .regions=preset_12_regions, + .regionNum=2 +}, +{ + .presetName={88,121,108,111,112,104,111,110,101,32,32,32,0,0,0,0,0,0,0,0}, + .preset=13, .bank=0, + .regions=preset_13_regions, + .regionNum=2 +}, +{ + .presetName={84,117,98,117,108,97,114,32,66,101,108,108,0,0,0,0,0,0,0,0}, + .preset=14, .bank=0, + .regions=preset_14_regions, + .regionNum=1 +}, +{ + .presetName={83,97,110,116,117,114,32,32,32,32,0,0,0,0,0,0,0,0,0,0}, + .preset=15, .bank=0, + .regions=preset_15_regions, + .regionNum=2 +}, +{ + .presetName={79,114,103,97,110,32,49,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=16, .bank=0, + .regions=preset_16_regions, + .regionNum=4 +}, +{ + .presetName={79,114,103,97,110,32,50,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=17, .bank=0, + .regions=preset_17_regions, + .regionNum=3 +}, +{ + .presetName={79,114,103,97,110,32,51,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=18, .bank=0, + .regions=preset_18_regions, + .regionNum=5 +}, +{ + .presetName={67,104,117,114,99,104,32,79,114,103,32,49,0,0,0,0,0,0,0,0}, + .preset=19, .bank=0, + .regions=preset_19_regions, + .regionNum=5 +}, +{ + .presetName={82,101,101,100,32,79,114,103,97,110,32,32,0,0,0,0,0,0,0,0}, + .preset=20, .bank=0, + .regions=preset_20_regions, + .regionNum=5 +}, +{ + .presetName={65,99,99,111,114,100,105,97,110,32,0,0,0,0,0,0,0,0,0,0}, + .preset=21, .bank=0, + .regions=preset_21_regions, + .regionNum=6 +}, +{ + .presetName={72,97,114,109,111,110,105,99,97,32,32,32,0,0,0,0,0,0,0,0}, + .preset=22, .bank=0, + .regions=preset_22_regions, + .regionNum=2 +}, +{ + .presetName={66,97,110,100,110,101,111,110,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=23, .bank=0, + .regions=preset_23_regions, + .regionNum=5 +}, +{ + .presetName={78,121,108,111,110,32,115,116,114,46,71,116,0,0,0,0,0,0,0,0}, + .preset=24, .bank=0, + .regions=preset_24_regions, + .regionNum=4 +}, +{ + .presetName={83,116,101,101,108,45,115,116,114,46,71,116,0,0,0,0,0,0,0,0}, + .preset=25, .bank=0, + .regions=preset_25_regions, + .regionNum=3 +}, +{ + .presetName={74,97,122,122,32,71,116,46,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=26, .bank=0, + .regions=preset_26_regions, + .regionNum=4 +}, +{ + .presetName={67,108,101,97,110,32,71,116,46,32,32,32,0,0,0,0,0,0,0,0}, + .preset=27, .bank=0, + .regions=preset_27_regions, + .regionNum=2 +}, +{ + .presetName={77,117,116,101,100,32,71,116,46,32,32,32,0,0,0,0,0,0,0,0}, + .preset=28, .bank=0, + .regions=preset_28_regions, + .regionNum=2 +}, +{ + .presetName={79,118,101,114,100,114,105,118,101,32,71,116,0,0,0,0,0,0,0,0}, + .preset=29, .bank=0, + .regions=preset_29_regions, + .regionNum=6 +}, +{ + .presetName={68,105,115,116,111,114,116,105,111,110,32,71,0,0,0,0,0,0,0,0}, + .preset=30, .bank=0, + .regions=preset_30_regions, + .regionNum=5 +}, +{ + .presetName={71,116,46,72,97,114,109,111,110,105,99,115,0,0,0,0,0,0,0,0}, + .preset=31, .bank=0, + .regions=preset_31_regions, + .regionNum=2 +}, +{ + .presetName={65,99,99,111,117,115,116,105,99,32,66,115,0,0,0,0,0,0,0,0}, + .preset=32, .bank=0, + .regions=preset_32_regions, + .regionNum=3 +}, +{ + .presetName={70,105,110,103,101,114,101,100,32,66,115,46,0,0,0,0,0,0,0,0}, + .preset=33, .bank=0, + .regions=preset_33_regions, + .regionNum=3 +}, +{ + .presetName={80,105,99,107,101,100,32,66,115,46,32,32,0,0,0,0,0,0,0,0}, + .preset=34, .bank=0, + .regions=preset_34_regions, + .regionNum=3 +}, +{ + .presetName={70,114,101,116,108,101,115,115,32,66,115,46,0,0,0,0,0,0,0,0}, + .preset=35, .bank=0, + .regions=preset_35_regions, + .regionNum=3 +}, +{ + .presetName={83,108,97,112,32,66,97,115,115,32,49,32,0,0,0,0,0,0,0,0}, + .preset=36, .bank=0, + .regions=preset_36_regions, + .regionNum=3 +}, +{ + .presetName={83,108,97,112,32,66,97,115,115,32,50,32,0,0,0,0,0,0,0,0}, + .preset=37, .bank=0, + .regions=preset_37_regions, + .regionNum=3 +}, +{ + .presetName={83,121,110,116,104,32,66,97,115,115,32,49,0,0,0,0,0,0,0,0}, + .preset=38, .bank=0, + .regions=preset_38_regions, + .regionNum=5 +}, +{ + .presetName={83,121,110,116,104,32,66,97,115,115,32,50,0,0,0,0,0,0,0,0}, + .preset=39, .bank=0, + .regions=preset_39_regions, + .regionNum=6 +}, +{ + .presetName={86,105,111,108,105,110,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=40, .bank=0, + .regions=preset_40_regions, + .regionNum=6 +}, +{ + .presetName={86,105,111,108,97,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0}, + .preset=41, .bank=0, + .regions=preset_41_regions, + .regionNum=6 +}, +{ + .presetName={67,101,108,108,111,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=42, .bank=0, + .regions=preset_42_regions, + .regionNum=3 +}, +{ + .presetName={67,111,110,116,114,97,98,97,115,115,32,32,0,0,0,0,0,0,0,0}, + .preset=43, .bank=0, + .regions=preset_43_regions, + .regionNum=3 +}, +{ + .presetName={84,114,101,109,101,108,111,32,83,116,114,105,0,0,0,0,0,0,0,0}, + .preset=44, .bank=0, + .regions=preset_44_regions, + .regionNum=4 +}, +{ + .presetName={80,105,122,122,32,83,116,114,105,110,103,115,0,0,0,0,0,0,0,0}, + .preset=45, .bank=0, + .regions=preset_45_regions, + .regionNum=2 +}, +{ + .presetName={72,97,114,112,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=46, .bank=0, + .regions=preset_46_regions, + .regionNum=2 +}, +{ + .presetName={84,105,109,112,97,110,105,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=47, .bank=0, + .regions=preset_47_regions, + .regionNum=8 +}, +{ + .presetName={83,116,114,105,110,103,115,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=48, .bank=0, + .regions=preset_48_regions, + .regionNum=4 +}, +{ + .presetName={83,108,111,119,32,83,116,114,105,110,103,115,0,0,0,0,0,0,0,0}, + .preset=49, .bank=0, + .regions=preset_49_regions, + .regionNum=4 +}, +{ + .presetName={83,121,110,116,104,32,83,116,114,105,110,103,0,0,0,0,0,0,0,0}, + .preset=50, .bank=0, + .regions=preset_50_regions, + .regionNum=2 +}, +{ + .presetName={83,121,110,116,104,32,83,116,114,32,50,32,0,0,0,0,0,0,0,0}, + .preset=51, .bank=0, + .regions=preset_51_regions, + .regionNum=4 +}, +{ + .presetName={67,104,111,105,114,32,65,97,104,115,32,32,0,0,0,0,0,0,0,0}, + .preset=52, .bank=0, + .regions=preset_52_regions, + .regionNum=4 +}, +{ + .presetName={86,111,105,99,101,32,79,111,104,115,32,32,0,0,0,0,0,0,0,0}, + .preset=53, .bank=0, + .regions=preset_53_regions, + .regionNum=4 +}, +{ + .presetName={83,121,110,116,104,32,86,111,105,99,101,32,0,0,0,0,0,0,0,0}, + .preset=54, .bank=0, + .regions=preset_54_regions, + .regionNum=2 +}, +{ + .presetName={79,114,99,104,101,115,116,114,97,32,72,116,0,0,0,0,0,0,0,0}, + .preset=55, .bank=0, + .regions=preset_55_regions, + .regionNum=2 +}, +{ + .presetName={84,114,117,109,112,101,116,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=56, .bank=0, + .regions=preset_56_regions, + .regionNum=6 +}, +{ + .presetName={84,114,111,109,98,111,110,101,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=57, .bank=0, + .regions=preset_57_regions, + .regionNum=5 +}, +{ + .presetName={84,117,98,97,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=58, .bank=0, + .regions=preset_58_regions, + .regionNum=3 +}, +{ + .presetName={77,117,116,101,100,32,84,114,117,109,112,32,0,0,0,0,0,0,0,0}, + .preset=59, .bank=0, + .regions=preset_59_regions, + .regionNum=3 +}, +{ + .presetName={70,114,101,110,99,104,32,72,111,114,110,32,0,0,0,0,0,0,0,0}, + .preset=60, .bank=0, + .regions=preset_60_regions, + .regionNum=2 +}, +{ + .presetName={66,114,97,115,115,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=61, .bank=0, + .regions=preset_61_regions, + .regionNum=6 +}, +{ + .presetName={83,121,110,116,104,32,66,114,97,115,115,49,0,0,0,0,0,0,0,0}, + .preset=62, .bank=0, + .regions=preset_62_regions, + .regionNum=2 +}, +{ + .presetName={83,121,110,116,104,32,66,114,97,115,115,50,0,0,0,0,0,0,0,0}, + .preset=63, .bank=0, + .regions=preset_63_regions, + .regionNum=2 +}, +{ + .presetName={83,111,112,114,97,110,111,32,83,97,120,32,0,0,0,0,0,0,0,0}, + .preset=64, .bank=0, + .regions=preset_64_regions, + .regionNum=8 +}, +{ + .presetName={65,108,116,111,32,83,97,120,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=65, .bank=0, + .regions=preset_65_regions, + .regionNum=8 +}, +{ + .presetName={84,101,110,111,114,32,83,97,120,32,32,32,0,0,0,0,0,0,0,0}, + .preset=66, .bank=0, + .regions=preset_66_regions, + .regionNum=8 +}, +{ + .presetName={66,97,114,105,116,111,110,101,32,83,97,120,0,0,0,0,0,0,0,0}, + .preset=67, .bank=0, + .regions=preset_67_regions, + .regionNum=7 +}, +{ + .presetName={79,98,111,101,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=68, .bank=0, + .regions=preset_68_regions, + .regionNum=4 +}, +{ + .presetName={69,110,103,108,105,115,104,32,72,111,114,110,0,0,0,0,0,0,0,0}, + .preset=69, .bank=0, + .regions=preset_69_regions, + .regionNum=2 +}, +{ + .presetName={66,97,115,115,111,111,110,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=70, .bank=0, + .regions=preset_70_regions, + .regionNum=3 +}, +{ + .presetName={67,108,97,114,105,110,101,116,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=71, .bank=0, + .regions=preset_71_regions, + .regionNum=3 +}, +{ + .presetName={80,105,99,99,111,108,111,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=72, .bank=0, + .regions=preset_72_regions, + .regionNum=4 +}, +{ + .presetName={70,108,117,116,101,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=73, .bank=0, + .regions=preset_73_regions, + .regionNum=4 +}, +{ + .presetName={82,101,99,111,114,100,101,114,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=74, .bank=0, + .regions=preset_74_regions, + .regionNum=2 +}, +{ + .presetName={80,97,110,32,70,108,117,116,101,32,32,32,0,0,0,0,0,0,0,0}, + .preset=75, .bank=0, + .regions=preset_75_regions, + .regionNum=4 +}, +{ + .presetName={66,108,111,119,110,32,66,111,116,116,108,101,0,0,0,0,0,0,0,0}, + .preset=76, .bank=0, + .regions=preset_76_regions, + .regionNum=4 +}, +{ + .presetName={83,104,97,107,117,104,97,99,104,105,32,32,0,0,0,0,0,0,0,0}, + .preset=77, .bank=0, + .regions=preset_77_regions, + .regionNum=2 +}, +{ + .presetName={87,104,105,115,116,108,101,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=78, .bank=0, + .regions=preset_78_regions, + .regionNum=2 +}, +{ + .presetName={79,99,97,114,105,110,97,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=79, .bank=0, + .regions=preset_79_regions, + .regionNum=2 +}, +{ + .presetName={83,113,117,97,114,101,32,87,97,118,101,32,0,0,0,0,0,0,0,0}, + .preset=80, .bank=0, + .regions=preset_80_regions, + .regionNum=4 +}, +{ + .presetName={83,97,119,32,87,97,118,101,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=81, .bank=0, + .regions=preset_81_regions, + .regionNum=4 +}, +{ + .presetName={83,121,110,32,67,97,108,108,105,111,112,101,0,0,0,0,0,0,0,0}, + .preset=82, .bank=0, + .regions=preset_82_regions, + .regionNum=4 +}, +{ + .presetName={67,104,105,102,102,101,114,32,76,101,97,100,0,0,0,0,0,0,0,0}, + .preset=83, .bank=0, + .regions=preset_83_regions, + .regionNum=4 +}, +{ + .presetName={67,104,97,114,97,110,103,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=84, .bank=0, + .regions=preset_84_regions, + .regionNum=4 +}, +{ + .presetName={83,111,108,111,32,86,111,120,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=85, .bank=0, + .regions=preset_85_regions, + .regionNum=4 +}, +{ + .presetName={53,116,104,32,83,97,119,32,87,97,118,101,0,0,0,0,0,0,0,0}, + .preset=86, .bank=0, + .regions=preset_86_regions, + .regionNum=4 +}, +{ + .presetName={66,97,115,115,32,38,32,76,101,97,100,32,0,0,0,0,0,0,0,0}, + .preset=87, .bank=0, + .regions=preset_87_regions, + .regionNum=5 +}, +{ + .presetName={70,97,110,116,97,115,105,97,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=88, .bank=0, + .regions=preset_88_regions, + .regionNum=4 +}, +{ + .presetName={87,97,114,109,32,80,97,100,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=89, .bank=0, + .regions=preset_89_regions, + .regionNum=2 +}, +{ + .presetName={80,111,108,121,115,121,110,116,104,32,32,32,0,0,0,0,0,0,0,0}, + .preset=90, .bank=0, + .regions=preset_90_regions, + .regionNum=4 +}, +{ + .presetName={83,112,97,99,101,32,86,111,105,99,101,32,0,0,0,0,0,0,0,0}, + .preset=91, .bank=0, + .regions=preset_91_regions, + .regionNum=4 +}, +{ + .presetName={66,111,119,101,100,32,71,108,97,115,115,32,0,0,0,0,0,0,0,0}, + .preset=92, .bank=0, + .regions=preset_92_regions, + .regionNum=4 +}, +{ + .presetName={77,101,116,97,108,32,80,97,100,32,32,32,0,0,0,0,0,0,0,0}, + .preset=93, .bank=0, + .regions=preset_93_regions, + .regionNum=8 +}, +{ + .presetName={72,97,108,111,32,80,97,100,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=94, .bank=0, + .regions=preset_94_regions, + .regionNum=4 +}, +{ + .presetName={83,119,101,101,112,32,80,97,100,32,32,32,0,0,0,0,0,0,0,0}, + .preset=95, .bank=0, + .regions=preset_95_regions, + .regionNum=2 +}, +{ + .presetName={73,99,101,32,82,97,105,110,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=96, .bank=0, + .regions=preset_96_regions, + .regionNum=3 +}, +{ + .presetName={83,111,117,110,100,116,114,97,99,107,32,32,0,0,0,0,0,0,0,0}, + .preset=97, .bank=0, + .regions=preset_97_regions, + .regionNum=4 +}, +{ + .presetName={67,114,121,115,116,97,108,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=98, .bank=0, + .regions=preset_98_regions, + .regionNum=4 +}, +{ + .presetName={65,116,109,111,115,112,104,101,114,101,32,32,0,0,0,0,0,0,0,0}, + .preset=99, .bank=0, + .regions=preset_99_regions, + .regionNum=5 +}, +{ + .presetName={66,114,105,103,104,116,110,101,115,115,32,32,0,0,0,0,0,0,0,0}, + .preset=100, .bank=0, + .regions=preset_100_regions, + .regionNum=4 +}, +{ + .presetName={71,111,98,108,105,110,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=101, .bank=0, + .regions=preset_101_regions, + .regionNum=4 +}, +{ + .presetName={69,99,104,111,32,68,114,111,112,115,32,32,0,0,0,0,0,0,0,0}, + .preset=102, .bank=0, + .regions=preset_102_regions, + .regionNum=4 +}, +{ + .presetName={83,116,97,114,32,84,104,101,109,101,32,32,0,0,0,0,0,0,0,0}, + .preset=103, .bank=0, + .regions=preset_103_regions, + .regionNum=3 +}, +{ + .presetName={83,105,116,97,114,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=104, .bank=0, + .regions=preset_104_regions, + .regionNum=2 +}, +{ + .presetName={66,97,110,106,111,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=105, .bank=0, + .regions=preset_105_regions, + .regionNum=3 +}, +{ + .presetName={83,104,97,109,105,115,101,110,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=106, .bank=0, + .regions=preset_106_regions, + .regionNum=5 +}, +{ + .presetName={75,111,116,111,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=107, .bank=0, + .regions=preset_107_regions, + .regionNum=2 +}, +{ + .presetName={75,97,108,105,109,98,97,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=108, .bank=0, + .regions=preset_108_regions, + .regionNum=4 +}, +{ + .presetName={66,97,103,32,80,105,112,101,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=109, .bank=0, + .regions=preset_109_regions, + .regionNum=4 +}, +{ + .presetName={70,105,100,100,108,101,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=110, .bank=0, + .regions=preset_110_regions, + .regionNum=6 +}, +{ + .presetName={83,104,97,110,97,105,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=111, .bank=0, + .regions=preset_111_regions, + .regionNum=2 +}, +{ + .presetName={84,105,110,107,101,114,32,66,101,108,108,32,0,0,0,0,0,0,0,0}, + .preset=112, .bank=0, + .regions=preset_112_regions, + .regionNum=4 +}, +{ + .presetName={65,103,111,103,111,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=113, .bank=0, + .regions=preset_113_regions, + .regionNum=4 +}, +{ + .presetName={83,116,101,101,108,32,68,114,117,109,115,32,0,0,0,0,0,0,0,0}, + .preset=114, .bank=0, + .regions=preset_114_regions, + .regionNum=2 +}, +{ + .presetName={87,111,111,100,32,66,108,111,99,107,32,32,0,0,0,0,0,0,0,0}, + .preset=115, .bank=0, + .regions=preset_115_regions, + .regionNum=2 +}, +{ + .presetName={84,97,105,107,111,32,68,114,117,109,32,32,0,0,0,0,0,0,0,0}, + .preset=116, .bank=0, + .regions=preset_116_regions, + .regionNum=3 +}, +{ + .presetName={77,101,108,111,32,84,111,109,32,49,32,32,0,0,0,0,0,0,0,0}, + .preset=117, .bank=0, + .regions=preset_117_regions, + .regionNum=2 +}, +{ + .presetName={83,121,110,116,104,32,68,114,117,109,32,32,32,0,0,0,0,0,0,0}, + .preset=118, .bank=0, + .regions=preset_118_regions, + .regionNum=4 +}, +{ + .presetName={82,101,118,101,114,115,101,32,67,121,109,98,0,0,0,0,0,0,0,0}, + .preset=119, .bank=0, + .regions=preset_119_regions, + .regionNum=2 +}, +{ + .presetName={71,116,32,70,114,101,116,78,111,105,115,101,0,0,0,0,0,0,0,0}, + .preset=120, .bank=0, + .regions=preset_120_regions, + .regionNum=2 +}, +{ + .presetName={66,114,101,97,116,104,32,78,111,0,0,0,0,0,0,0,0,0,0,0}, + .preset=121, .bank=0, + .regions=preset_121_regions, + .regionNum=2 +}, +{ + .presetName={83,101,97,83,104,111,114,101,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=122, .bank=0, + .regions=preset_122_regions, + .regionNum=4 +}, +{ + .presetName={66,105,114,100,32,84,119,101,101,116,32,32,0,0,0,0,0,0,0,0}, + .preset=123, .bank=0, + .regions=preset_123_regions, + .regionNum=5 +}, +{ + .presetName={84,101,108,101,112,104,111,110,101,32,32,32,0,0,0,0,0,0,0,0}, + .preset=124, .bank=0, + .regions=preset_124_regions, + .regionNum=4 +}, +{ + .presetName={72,101,108,105,99,111,112,116,101,114,32,32,0,0,0,0,0,0,0,0}, + .preset=125, .bank=0, + .regions=preset_125_regions, + .regionNum=4 +}, +{ + .presetName={65,112,112,108,97,117,115,101,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=126, .bank=0, + .regions=preset_126_regions, + .regionNum=4 +}, +{ + .presetName={71,117,110,32,83,104,111,116,32,32,32,32,0,0,0,0,0,0,0,0}, + .preset=127, .bank=0, + .regions=preset_127_regions, + .regionNum=4 +}, +{ + .presetName={83,116,97,110,100,97,114,100,32,32,0,0,0,0,0,0,0,0,0,0}, + .preset=0, .bank=128, + .regions=preset_128_regions, + .regionNum=68 +}, +}; +static const short shortSamples[523794] PROGMEM = { +0, 0, -381, -212, -48, 111, 141, 432, 509, 1004, 1777, 1550, 1404, 2059, 1560, +874, 695, 1022, 665, -29, 489, 790, 594, 714, -506, 686, -1489, -2817, -554, -1284, -111, +-1522, 310, -1230, -2665, -3367, -2370, 374, -1045, -598, -1481, 4165, 2182, -698, -3755, -123, -4205, +-9318, -12604, -4943, 6591, 3517, -1807, -5981, -8873, -3657, -2867, -1948, -686, -10377, -5175, -8138, -5441, +900, 12394, 5099, -4466, 8859, 13131, 14702, 17414, 23804, 23010, 18922, 13994, 10604, 13152, 11160, 9147, +5422, 2578, -2141, -923, -4940, -11960, 1993, 10004, -3930, -11745, -12441, -17677, -18386, -4685, -852, -1401, +-278, -16723, -16682, -13923, -3862, 4663, 5196, -1455, -1293, 5446, 1934, 2105, 874, 827, 2379, -6422, +-6854, -11893, -7295, -1635, -14661, -17895, -21743, -18677, -13037, -12623, -13976, -7859, -7628, -1731, 1886, 3996, +-4894, -6153, -1826, -2761, 11961, 24422, 21211, 18382, 16714, 12769, 8040, 11534, 16085, 15182, 18007, 18846, +19173, 16361, 4835, 303, 10219, 9627, 9716, 10412, 1595, -9885, -256, 7027, 7439, 8225, -66, -12136, +-18429, -19339, -17556, -46, 355, -2467, -7291, -14926, -12438, -4261, -3237, -6176, -431, 171, -95, -6440, +-5007, -2967, -96, 3789, -1424, -538, 6527, 8628, 6271, -3648, -12607, -12612, -12862, -17278, -17133, -15820, +-16519, -13619, -6045, -1869, -1077, -670, -11100, -13118, -5341, 6179, 13940, 15865, 21677, 18471, 13427, 10132, +9727, 14527, 13844, 14147, 20354, 22981, 10383, 11852, 12707, 8448, 11058, 12577, 1025, -8422, -6102, -1627, +8474, 12614, 1046, -2795, -15268, -26825, -27981, -18676, -11403, -5754, -4000, -17352, -9634, -6969, -2172, -4360, +-2581, 4196, 3966, 4950, -255, -1896, 3557, 5570, 326, -2912, -3681, 6457, 9903, 1814, -6075, -8882, +-11043, -18862, -18758, -20688, -22891, -15126, -11624, -4634, 3513, 8864, 209, -9519, -6053, -1063, 7403, 14603, +20146, 22318, 20882, 13100, 9262, 11340, 5495, 8721, 17744, 16847, 10833, 15286, 10592, 2863, 9085, 11526, +8695, 6676, -4340, -2337, 8363, 13516, 11441, 9962, -2786, -12636, -17313, -26980, -17321, -12941, -8188, -12402, +-15104, -7544, -5052, -6192, -5016, -5640, 1741, 6155, 2505, 249, 1880, 6404, 5252, -834, -7418, -884, +9373, 4433, 1408, -1571, -8654, -9040, -11188, -16510, -19700, -15404, -11738, -11009, -4, 9435, 5934, -2198, +-4604, -6640, 337, 5453, 10958, 19485, 17477, 9909, 9618, 8970, 156, 6349, 15726, 14300, 16171, 18347, +10365, 8626, 6835, 6500, 13146, 10100, -3121, -5943, -3918, -1137, 10477, 6885, 1316, -7403, -18087, -25697, +-29654, -16932, -10833, -10312, -9710, -12040, -8669, -4213, -8670, -8873, -4066, 5200, 7732, 5335, 2072, 5811, +12920, 4178, -3235, -2087, 3652, 5823, 7472, 709, -5442, -8337, -8797, -14686, -18902, -18107, -19128, -18544, +-10347, -2500, 5086, 2667, -2656, -5367, -1376, -1027, 5088, 19739, 16651, 17288, 21895, 15528, 6278, 8477, +9833, 12825, 16909, 15232, 15562, 17594, 5182, 6971, 13134, 10908, 7485, 1184, -4699, -385, 6646, 12939, +11179, 5776, -699, -14998, -21578, -21525, -15216, -8543, -11064, -13477, -12803, -5988, -6200, -10466, -8486, -3989, +5213, 5489, -2029, 1977, 9146, 6648, 1351, -4752, -4220, 1524, 5600, 3833, -5215, -6218, -8641, -15696, +-14854, -19579, -23739, -22905, -18724, -14619, -120, 3957, -523, 1234, -3882, -6924, 1052, 14208, 12277, 19290, +24822, 19440, 15060, 7901, 3823, 12693, 13309, 11496, 18347, 15642, 8352, 8068, 6905, 12897, 11179, 4962, +12, -6253, 199, 5433, 9808, 12447, 6386, -1524, -14113, -20774, -19986, -12786, -11145, -14754, -12578, -10350, +-7093, -6991, -12022, -10167, 1261, 3727, 2012, 1160, 5715, 7991, 6587, 2212, -7131, -1395, 4758, 6180, +2788, 800, -4500, -10413, -9137, -15520, -20331, -21994, -24584, -20319, -8847, -5967, 85, 5818, -3683, -8851, +-1504, 2392, 8210, 16859, 19728, 24542, 25721, 12225, 9795, 11027, 9840, 15375, 16152, 18551, 14060, 9034, +12255, 9082, 16689, 10954, 4348, -435, -4722, -2090, 4530, 12295, 12827, 7665, -2381, -14978, -19491, -14498, +-15851, -12338, -15882, -14504, -8614, -8692, -13959, -13298, -7270, -1673, -1689, 1069, 270, 3958, 8480, 5868, +-2686, -2925, 2020, -365, 9277, 2239, 167, -6411, -7308, -13585, -12179, -20898, -29927, -23114, -20999, -18896, +-6477, 1940, -4012, -4523, -6048, -8575, 5447, 5146, 11995, 24529, 23520, 22592, 15709, 11988, 9859, 11785, +17545, 18143, 18453, 13291, 11889, 12840, 16056, 16111, 11447, 8338, 151, -3053, -1296, 6566, 12181, 15838, +6976, -4591, -12353, -17028, -13151, -16337, -16098, -18163, -11802, -10181, -15140, -14185, -11718, -8792, -5050, -1666, +-3808, 448, 7148, 4476, 2558, 20, -2722, -2942, 6054, 4298, 3355, 2955, -7652, -6323, -4404, -13543, +-22787, -20536, -25373, -23097, -10926, -7527, 2646, -638, -7108, -3516, -4516, 1407, 5403, 15368, 22631, 23222, +23393, 17563, 11641, 9436, 13512, 17867, 20945, 14262, 12267, 12211, 15311, 15620, 14808, 14388, 5684, 770, +-3135, -4084, 7081, 14177, 14823, 5324, -5027, -12062, -13132, -13219, -20649, -17211, -15445, -9615, -16206, -11940, +-14483, -12517, -5590, -6046, -6420, -1426, 4509, 1826, 5843, 2076, -2566, -1579, -2250, 1155, 5384, 4346, +-7662, -3300, -5042, -12383, -11224, -21810, -27397, -24960, -24324, -14443, -5150, -2848, -4607, -5707, -5807, -6378, +-1041, 6287, 14429, 19482, 23988, 21324, 18193, 9371, 9477, 15172, 21351, 18938, 12613, 15145, 12732, 15979, +17833, 16096, 14293, 8609, 1459, -3307, -1450, 10174, 16598, 16063, 4831, -4042, -7497, -7762, -18465, -16920, +-15878, -13061, -12778, -11805, -16471, -14598, -5645, -10403, -8347, -3197, -276, 3654, 6666, 3886, 3530, 4593, +-5288, 262, 10196, 1350, 3969, 1044, -4945, -3824, -5321, -13178, -19107, -26061, -26744, -21666, -12959, -5352, +-4602, -576, -5941, -6477, -6363, -2047, 6171, 11141, 17865, 21300, 21214, 14585, 3745, 8868, 14919, 16926, +15276, 10056, 11873, 10598, 16485, 14560, 16618, 13222, 7707, 909, -6130, -609, 9938, 19493, 10364, 2162, +-789, -4732, -13128, -15905, -18061, -18997, -8894, -14869, -17247, -17021, -10166, -11819, -10455, -9653, -8157, 2288, +1282, 307, 7869, 1625, -4014, 1031, 270, 4953, 4610, 3504, 67, -1604, -3564, -2444, -10498, -18097, +-26489, -23470, -19549, -12016, -4782, -3243, 137, -5523, -3959, -6669, 1058, 7152, 11715, 18403, 27075, 21381, +12704, 7455, 11724, 15870, 18470, 13204, 12329, 9550, 12498, 14489, 15655, 16948, 12340, 10495, -2287, -7347, +2583, 15047, 14037, 9627, 7592, -315, -2597, -8686, -17490, -17419, -10736, -11460, -16634, -14323, -16853, -9708, +-8587, -15859, -9180, -2569, -5441, 2281, 5027, 1601, 266, -2510, -1503, 171, 2442, 3153, 533, -573, +-5763, -2686, -3072, -13125, -20878, -27401, -25723, -21814, -14106, -8261, -5001, -1375, -6564, -8961, -4063, -735, +3606, 10971, 22505, 24313, 21026, 11730, 10352, 12859, 17876, 18099, 14978, 12362, 9293, 14551, 14200, 16521, +15591, 18640, 5548, -5947, -2019, 4644, 11431, 14586, 10717, 5051, 4755, -1119, -12694, -15033, -12914, -14244, +-7690, -18366, -18673, -7909, -13911, -13123, -9860, -10740, -7545, -1737, 3390, 3354, 1319, 499, -2130, 906, +-242, 4162, 3643, 1970, -1869, -1853, -191, -2596, -10795, -20103, -26231, -24916, -19889, -15783, -8136, -2619, +-4682, -7201, -5956, -5027, -3273, 2666, 13245, 22044, 23430, 18897, 12154, 12229, 12981, 18405, 18841, 15247, +9961, 13356, 13555, 11145, 19005, 22229, 13451, 2596, -1461, -3442, 5879, 12765, 11079, 8679, 11300, 1874, +-1005, -11158, -17929, -8503, -11816, -16929, -15989, -14595, -14980, -14056, -11641, -12914, -13897, -7753, -1968, 3396, +1187, 65, 458, -886, -1923, 2964, 3005, 4438, -422, 919, -1390, 811, -67, -10773, -20741, -23820, +-24411, -22486, -14588, -8308, -4861, -7424, -4743, -7087, -5949, -6412, 3543, 14627, 20858, 21459, 17979, 14713, +10460, 14766, 21316, 17074, 14076, 16338, 11362, 10145, 15690, 23796, 19757, 13108, 5172, -6280, 4177, 4593, +7731, 13353, 8101, 10060, 6900, -6777, -12198, -9844, -11380, -15316, -13886, -14938, -16692, -14908, -12113, -11395, +-14874, -14542, -7066, 450, 460, 949, 739, 191, -3209, 888, 3590, 1658, 2848, 630, -658, -143, +4669, -2592, -9807, -18798, -23148, -26212, -21104, -13833, -8977, -7395, -6192, -3682, -7753, -9137, -7436, 6716, +13351, 18307, 21555, 18224, 10586, 13488, 17414, 16546, 16376, 19435, 11902, 7683, 12878, 13600, 25717, 20135, +7892, 4227, -699, -1343, 7024, 7056, 7099, 13697, 11630, 1557, -5905, -7431, -10314, -14002, -11901, -14912, +-14270, -18505, -13411, -9771, -14776, -15769, -13621, -5123, -2322, 1196, 2426, 25, -2406, -336, 1351, 2591, +3715, 668, 163, 234, 3217, 2970, -1524, -7754, -17322, -23861, -25281, -18943, -13897, -10914, -8065, -3417, +-3015, -10404, -11600, -2010, 2024, 14352, 19502, 19588, 13281, 14641, 15688, 11659, 19011, 18071, 16851, 13300, +4924, 9743, 22770, 20947, 18804, 10866, 992, 904, 4063, 2560, 3957, 12697, 15482, 7800, 2806, -4011, +-4861, -11766, -11907, -11279, -14956, -15829, -17755, -9750, -13560, -15428, -15059, -12345, -8522, -1453, 2951, 6, +-412, -2424, -183, 1892, 4324, 1431, -464, 1463, 991, 3267, 1928, 748, -7311, -17809, -24795, -24246, +-17760, -17115, -14374, -5171, -3869, -6816, -12504, -9852, -8050, 2547, 17539, 12409, 16473, 16599, 12285, 13855, +12981, 14814, 22992, 16243, 6383, 7893, 11949, 21691, 23298, 19034, 6254, 5272, 6241, -497, 2062, 6650, +15475, 13724, 8047, 4116, -388, -5730, -10655, -8196, -11540, -15301, -15993, -12368, -12707, -14556, -12224, -16476, +-13971, -8130, 121, 1453, 191, -1802, -2250, 790, 3975, 3561, 674, 178, 3173, 743, 4318, 3270, +3764, -5864, -19882, -21233, -20170, -19931, -20146, -9976, -5810, -6319, -4318, -13440, -15817, -2800, 3127, 11556, +14968, 12844, 16594, 16165, 7656, 12737, 20510, 20494, 12510, 8640, 3984, 13025, 24960, 19803, 15306, 7497, +9499, 2461, -1250, 1179, 9196, 14269, 10675, 9651, 5319, -1127, -6859, -5473, -9476, -14602, -12885, -14338, +-13454, -14448, -11300, -14968, -16988, -14891, -7761, -62, 35, -1071, -3312, -2489, 1756, 2654, 2855, -1626, +531, 2362, -1291, 4121, 6727, 3379, -10566, -16410, -17554, -23856, -21707, -16331, -13978, -3903, -2691, -10957, +-11699, -14188, -5238, 8294, 8203, 12133, 17279, 18764, 9699, 11227, 16117, 19638, 21395, 12496, 4947, 6574, +18149, 21659, 19505, 14214, 13205, 9216, 375, -678, 3711, 10693, 10577, 13987, 11968, 3889, 15, -1912, +-5126, -10411, -10803, -12215, -13661, -12557, -12512, -10725, -15956, -17262, -14208, -6793, 156, -980, -1519, -3592, +-2048, 2217, 2976, 387, 82, 826, -1865, -1584, 8032, 6216, -2970, -5531, -16083, -21186, -20559, -25894, +-18781, -11210, -7013, -4561, -11138, -16989, -14499, -147, -582, 6407, 14578, 14700, 14866, 9859, 10370, 16075, +22991, 18293, 9548, 4789, 10246, 18045, 19333, 18098, 16028, 16027, 3921, 1689, 927, 3428, 6869, 12575, +14620, 8551, 4645, 1700, -1343, -5372, -9991, -10166, -12501, -13527, -11791, -11949, -11219, -16531, -17546, -12914, +-6048, -584, 262, -2378, -2638, -328, 3961, 1408, 4188, 3486, -4130, 366, 5847, 3864, 9559, 10, +-6907, -9889, -19243, -23192, -22840, -17661, -12698, -1361, -7434, -14347, -14113, -10752, -6104, 390, 7605, 13130, +15973, 12383, 8572, 11846, 19743, 22279, 15795, 7899, 6840, 12438, 15406, 16892, 20361, 18798, 11196, 5260, +3474, -300, 1813, 8037, 12959, 12410, 8059, 5415, 2684, -1710, -5560, -9484, -11193, -12751, -14875, -10971, +-11910, -15089, -16483, -19616, -13378, -8110, -812, -3602, -5231, -268, -3540, -325, 7049, 42, -87, -2464, +-1503, 5204, 6996, 4811, -265, -1041, -13553, -17272, -21887, -25961, -17975, -7362, -6057, -10180, -12299, -14537, +-11057, -7995, 213, 6658, 15028, 13568, 10025, 8811, 14305, 22179, 20892, 12871, 9851, 11389, 10479, 13903, +19939, 22271, 17017, 13478, 8061, 3336, 256, 3217, 10248, 12617, 12306, 9990, 6635, 5280, -1060, -2658, +-7754, -10686, -12119, -11828, -8697, -12936, -13569, -16152, -20427, -11854, -4835, -7032, -864, -2837, -5217, -1855, +2196, 3847, 2967, -2852, -5649, 3024, 3809, 3909, 6144, 1675, -4431, -8248, -17844, -26869, -23829, -15943, +-9157, -8520, -10632, -13814, -13327, -13993, -10061, -1416, 8310, 12535, 10582, 6560, 8650, 18364, 20397, 16095, +12967, 12599, 8175, 9419, 14315, 19281, 20229, 17161, 13750, 8281, 390, 2108, 1599, 10576, 10775, 11244, +10524, 6928, 4291, 266, -1639, -8075, -12343, -9704, -10652, -11355, -7449, -18576, -17104, -15201, -14154, -7084, +-2970, -3367, -3451, -3346, -4131, 4530, 6947, -820, -3339, -229, -285, 5404, 6296, 3521, 3792, 365, +-7518, -19755, -24632, -22324, -13960, -9140, -9889, -10444, -10479, -14277, -14942, -10409, 8, 10832, 10954, 7106, +5345, 14846, 17803, 18520, 17371, 14772, 12487, 7793, 11276, 14860, 18704, 22221, 17299, 16064, 7592, 2111, +2331, 4239, 9359, 10341, 12799, 11436, 5741, 5873, 4210, -4569, -5406, -12126, -11670, -6558, -9444, -13921, +-15121, -16437, -18883, -11466, -8598, -5666, -1276, -5551, -7911, 350, 4110, 3786, -573, -3631, -2887, 1958, +4281, 2366, 4877, 5111, 1005, -9084, -20910, -25573, -19678, -14835, -11988, -11450, -9477, -11770, -15495, -18554, +-11863, 3177, 9479, 4586, 5703, 7200, 14357, 16074, 17729, 17563, 13755, 11949, 7937, 10778, 13843, 19127, +20314, 20508, 13619, 8245, 1686, 4109, 4532, 5994, 15075, 10382, 10067, 9246, 5699, 4892, -465, -9229, +-10602, -6282, -8642, -9222, -11553, -16953, -16033, -15235, -15405, -6680, -2490, -5286, -6854, -4387, -221, 5218, +4037, -1919, -2989, -230, 2245, 1826, 4703, 4898, 9476, 1937, -10016, -20720, -22079, -18653, -15281, -12773, +-11728, -7267, -11086, -21002, -18654, -8591, 4188, 4719, 2741, 5968, 7037, 13579, 16016, 17587, 16156, 14128, +9917, 9266, 8570, 14693, 16493, 21881, 20838, 9946, 10558, 2884, 1040, 5428, 8044, 10746, 12216, 9621, +6895, 10617, 4968, -3838, -6249, -9618, -8021, -5174, -10913, -13749, -13607, -17387, -19032, -11865, -7025, -5764, +-5934, -7500, -5365, 1913, 4489, 1239, -961, -2306, 357, 1058, 929, 3605, 8313, 10419, 1091, -9966, +-19117, -20526, -16437, -18111, -13811, -7975, -6265, -15884, -21992, -16528, -6119, 800, 3840, 2748, 3759, 9355, +11486, 18127, 16551, 17594, 13799, 9915, 11663, 7532, 14189, 19966, 20865, 19199, 15455, 7438, 4434, 4164, +3171, 9226, 12665, 8207, 9582, 12104, 8782, 5530, -1733, -8181, -7160, -5063, -8163, -8717, -11846, -14801, +-19241, -16293, -12518, -7013, -5536, -9348, -7212, -3167, 1441, 2598, 850, -991, -1599, 667, -1836, -551, +5141, 8252, 11829, -479, -11205, -16609, -17859, -20567, -19887, -11975, -5711, -11552, -17510, -21557, -16982, -6292, +-2219, 2888, -56, 3177, 8661, 9761, 18313, 16865, 14618, 14560, 11419, 7457, 9730, 13206, 17956, 22873, +19057, 13200, 10924, 4036, 1230, 8096, 8347, 8408, 10505, 10289, 11356, 11481, 4527, -2435, -5168, -6314, +-7173, -4731, -8552, -12333, -14938, -19734, -16514, -10175, -7449, -9192, -9391, -6103, -3355, 1426, 940, 570, +721, -1206, -396, -2876, -1177, 5686, 13160, 8424, -1013, -9319, -11591, -20412, -22820, -16215, -10052, -6441, +-13842, -17305, -21370, -16189, -5938, -3021, -75, 1386, 1515, 5960, 13815, 14404, 16348, 16563, 12516, 11076, +9213, 6784, 14056, 19713, 19009, 20084, 16351, 6686, 5067, 4580, 5982, 8207, 8570, 8890, 11475, 14161, +9229, 5397, -27, -5691, -5777, -4333, -5240, -7198, -11931, -16368, -20172, -13120, -10316, -9155, -10141, -9956, +-4870, -2874, -742, 1197, 519, 550, 1010, -2733, -4252, -2098, 11433, 11614, 4790, 2188, -5599, -12380, +-22265, -20688, -13513, -9670, -7879, -12866, -20094, -18598, -15158, -8546, -1021, -1715, -1083, 2714, 6805, 10830, +16965, 16174, 14531, 15784, 9964, 6639, 10779, 12457, 17879, 21519, 20308, 13940, 9202, 5108, 4842, 8279, +6003, 6922, 11166, 12625, 12493, 11408, 5840, -89, -4231, -4028, -5150, -1885, -6760, -12596, -17437, -17949, +-12335, -9302, -11907, -11247, -8051, -6367, -2533, -1369, 461, -642, 4094, 791, -7855, -4516, 2685, 10218, +7945, 6142, 4797, -4119, -15998, -19943, -20444, -13385, -8001, -10692, -14702, -18798, -20858, -15297, -6747, -6284, +-2278, -559, -1177, 6264, 12200, 12100, 17169, 16096, 12000, 9288, 8377, 7674, 12632, 17947, 20600, 19783, +14256, 6399, 7188, 7568, 4145, 6070, 6918, 10412, 11537, 14394, 10049, 5967, 1282, -4460, -4849, -2231, +-2316, -5331, -15043, -17589, -14297, -12887, -10264, -13120, -10184, -9576, -5637, -1022, -4235, -1325, 4709, 4410, +-3318, -8621, -1776, 4981, 4815, 9760, 8944, 4716, -3529, -15343, -20921, -17382, -12043, -9910, -9159, -15941, +-20655, -17361, -16046, -9546, -3811, -4892, -3077, 1292, 4891, 8741, 15737, 16259, 14833, 13151, 9712, 7093, +9684, 10818, 18975, 22787, 18407, 12915, 9441, 9612, 5212, 6293, 5420, 6461, 10870, 13005, 13191, 11660, +6571, 2188, -4623, -4185, 1269, -969, -6815, -15645, -14250, -13698, -12987, -9711, -12438, -13119, -6944, -3209, +-4906, -5797, 1780, 8345, 130, -5068, -5142, -759, 1442, 6751, 8259, 11109, 7177, -5717, -14682, -18182, +-18291, -10402, -7995, -13015, -15573, -18331, -20397, -14335, -9065, -7894, -4078, -3309, -766, 2867, 10818, 12852, +17113, 14853, 11613, 11089, 7776, 6769, 12314, 21294, 20153, 17604, 14659, 10608, 9106, 7573, 4136, 5927, +6583, 10734, 13804, 12320, 12816, 8099, 994, -5292, -928, 3630, -2716, -8746, -11857, -16168, -13201, -10381, +-12259, -14361, -12509, -3482, -6552, -9392, -2656, 5634, 3880, -646, -4996, -4128, -896, 51, 4151, 12576, +10747, 5039, -2948, -15595, -19380, -13717, -10954, -10168, -11992, -16537, -19840, -18131, -14525, -12139, -5285, -7530, +-3399, -1118, 1721, 9712, 14482, 15303, 13142, 14515, 9851, 4632, 8163, 14375, 18532, 20364, 16200, 15514, +11200, 9224, 8124, 3529, 5205, 7313, 10807, 12205, 13624, 15121, 7093, -2210, -480, 896, 2846, -2484, +-7383, -13201, -15384, -10181, -10764, -16147, -14529, -6515, -7736, -10899, -7608, -728, 4690, 2858, -3302, -2150, +-3307, -5152, 431, 7166, 9307, 13504, 6361, -5935, -14515, -16464, -14007, -10425, -9000, -14613, -15279, -19780, +-18616, -14681, -11249, -8675, -6199, -4058, -4371, 2841, 10255, 11824, 14370, 17105, 12493, 8411, 5177, 9180, +14799, 17469, 19665, 17157, 15199, 12543, 10651, 6995, 4072, 5393, 8952, 6571, 14427, 16956, 12994, 5292, +700, 669, 1932, 3164, -537, -8962, -14085, -9368, -10253, -15558, -14931, -9901, -8994, -9622, -12302, -6412, +2203, 1535, 517, 1216, -3720, -4711, -4364, -172, 4825, 13095, 13190, 4280, -3413, -15251, -14808, -12053, +-10417, -10524, -12730, -17305, -19462, -17163, -16167, -13111, -7487, -7459, -8674, -1513, 1133, 7021, 11574, 15064, +16954, 10565, 6805, 6233, 9102, 14255, 16483, 19468, 16413, 14748, 15681, 8155, 6857, 6504, 5362, 4382, +8968, 16145, 16058, 10848, 5974, 1893, 18, 4573, 5499, -4565, -9303, -7950, -9842, -12887, -15027, -13342, +-7707, -9951, -15073, -8951, -3813, -1281, 961, 3071, -967, -2160, -4711, -6358, 299, 6134, 12947, 13686, +5368, -6031, -11405, -13325, -12428, -8650, -9629, -15041, -16491, -16926, -20143, -14442, -12014, -9605, -9364, -7211, +-2530, 142, 4605, 12668, 16139, 15249, 9423, 7076, 6931, 7941, 14843, 16250, 16446, 17517, 17306, 11991, +9659, 8494, 6613, 2210, 4094, 11571, 15592, 14277, 12224, 5119, -73, 4393, 6548, 1096, -3648, -7642, +-6406, -9294, -17413, -13461, -8869, -9905, -15108, -11897, -9041, -6067, -887, 469, 2002, 304, -3612, -6154, +-5644, -2913, 7935, 13985, 12012, 3439, -3670, -11400, -14871, -8005, -10087, -11634, -13255, -16602, -18557, -18704, +-14217, -12115, -12594, -8578, -6956, -3975, -2076, 4582, 14696, 14696, 13945, 10806, 6062, 6571, 11071, 13060, +14736, 17802, 19121, 15100, 12368, 12133, 10221, 3279, 2335, 6458, 10397, 15915, 16903, 8784, 4600, 3626, +6246, 6729, -359, -3851, -2071, -5279, -15085, -14438, -9157, -10367, -11409, -13820, -12699, -8681, -5730, -2575, +1972, 1458, 460, -2799, -6108, -9621, 16, 9590, 10965, 13172, 4753, -5297, -10067, -11443, -9696, -9843, +-11041, -13016, -18035, -18541, -17589, -14540, -14431, -13451, -8016, -7496, -8063, -1868, 5113, 11751, 15772, 13599, +8419, 6420, 8468, 9763, 11187, 14930, 19062, 16499, 14124, 15435, 13052, 6855, 5938, 1138, 4322, 13143, +16466, 14404, 8246, 4374, 6362, 9105, 2607, -953, 2007, -1538, -9089, -12938, -12781, -8952, -9468, -13830, +-12869, -12512, -9854, -6731, -915, -259, 1745, 3307, -4806, -8988, -6496, -570, 8350, 13551, 11334, 4723, +-4709, -8149, -10878, -9307, -8662, -10727, -13805, -18298, -17291, -15495, -17499, -14822, -11439, -9335, -9505, -7495, +-3609, 4233, 13254, 14823, 11922, 8242, 8540, 8361, 7448, 12449, 16911, 15716, 17250, 16318, 14473, 14418, +9016, 3301, 1030, 6583, 13438, 17755, 12141, 5430, 8582, 10147, 4806, 2876, 2657, 3398, -1856, -10045, +-11550, -10021, -8134, -11662, -11316, -12960, -14377, -8018, -5583, -4527, 1840, 4119, 1166, -4957, -9145, -6512, +-477, 9525, 13381, 10352, 5013, -3368, -7513, -9449, -8950, -6560, -11415, -15505, -16035, -15941, -18096, -16543, +-15092, -12138, -10258, -10167, -9908, -4578, 4835, 12823, 12224, 10152, 10952, 6831, 5946, 9531, 11551, 14771, +16787, 15471, 15613, 17298, 13753, 8148, 2839, -40, 7299, 17708, 13383, 8566, 9152, 10579, 8277, 3699, +3884, 5536, 4102, -4841, -8870, -8763, -10726, -9548, -7846, -14346, -14130, -11202, -10219, -7611, -3638, 2937, +3672, 672, -5136, -10184, -6083, 48, 9478, 13147, 9361, 5938, -2456, -7968, -8557, -5478, -8673, -12109, +-13850, -15549, -16649, -17474, -17423, -14774, -12045, -10648, -11805, -12904, -2533, 5202, 8554, 12707, 11569, 8297, +7048, 6944, 8031, 12220, 14967, 13890, 15809, 17014, 16269, 16647, 6363, -495, 2477, 10970, 14630, 10433, +9518, 11086, 11416, 6148, 3253, 7823, 6728, 361, -1340, -8079, -10377, -8395, -8640, -10201, -13757, -12992, +-12093, -12148, -8051, -3860, 2858, 3788, -3, -6003, -10139, -7289, 985, 8604, 11051, 11809, 4817, -2808, +-6214, -5964, -6529, -8187, -11407, -13583, -14742, -16854, -17245, -18651, -13608, -10466, -13968, -13998, -9919, -4593, +2588, 9994, 11758, 10520, 9978, 6296, 6075, 10271, 11114, 14256, 14047, 14439, 17798, 20708, 14280, 4553, +1079, 5414, 11421, 12390, 9085, 11316, 14576, 7551, 6149, 7623, 7221, 6598, 2724, -1822, -7763, -8081, +-7304, -9401, -9739, -12820, -12681, -12719, -12887, -9131, -2428, 2625, 3906, -45, -7675, -9489, -6575, 244, +7854, 13061, 9741, 4505, -1347, -5539, -4554, -6811, -7848, -11526, -13363, -13207, -17948, -19793, -15484, -12942, +-14366, -14491, -13097, -12897, -4822, 2966, 6566, 12333, 10556, 7902, 6313, 6792, 9013, 12434, 12474, 11506, +15026, 21634, 19495, 12558, 3879, 2046, 9786, 9209, 8355, 12803, 12895, 11193, 8111, 7637, 7622, 8345, +7837, 2229, -1795, -5965, -6917, -7591, -8277, -10697, -10781, -12650, -14461, -12853, -9463, -2188, 3515, 3710, +-2148, -6180, -10196, -7259, 1136, 7858, 12633, 8683, 4621, -470, -4313, -3541, -5378, -9697, -9844, -10151, +-15540, -19415, -16062, -15968, -14331, -13409, -16047, -14668, -11671, -6570, 645, 7927, 10121, 10329, 7567, 5347, +6469, 11132, 10730, 9062, 11563, 15806, 23644, 18729, 7480, 6074, 6451, 6369, 7109, 10169, 12761, 11391, +10910, 7598, 7076, 8985, 9050, 6760, 3089, -2396, -4418, -6340, -7923, -8331, -9172, -10500, -13563, -14283, +-15264, -8360, -1125, 2342, 3486, -1909, -7138, -10803, -7012, 1799, 7785, 10733, 9793, 3316, -363, -979, +-3047, -8319, -6634, -7202, -12903, -15455, -17336, -17003, -14153, -14372, -15125, -15440, -15182, -12663, -7021, 777, +6004, 10892, 10338, 4613, 6655, 8539, 10624, 10071, 5968, 12061, 20954, 22455, 14649, 9986, 8726, 5707, +5729, 7932, 10306, 12788, 12238, 9058, 8191, 8283, 9682, 9834, 7258, 2450, -592, -2974, -7061, -6435, +-8971, -7739, -9251, -14701, -16011, -14252, -8318, -1850, 2744, 3639, -2110, -8779, -9788, -6660, 573, 8117, +12117, 5839, 3843, 3843, -2191, -5559, -4721, -6170, -8076, -12193, -16275, -17117, -15881, -14477, -15329, -14597, +-17241, -15923, -12060, -9547, -705, 8008, 8611, 8514, 4522, 6168, 10975, 10151, 4705, 6164, 15541, 20567, +18862, 15077, 11038, 8606, 6548, 4369, 7911, 11602, 12311, 10986, 9264, 8094, 8913, 11490, 9386, 7594, +3122, 266, -1856, -6322, -7932, -6005, -6755, -10189, -14947, -16162, -13683, -9573, -1384, 4000, 2382, -3480, +-6950, -10806, -8265, 3894, 8182, 7030, 7737, 6709, 2209, -1798, -4396, -4015, -5020, -7460, -13041, -15289, +-16202, -16488, -13005, -15651, -16857, -15115, -16826, -14646, -9039, -901, 7051, 8884, 4946, 4139, 10316, 11491, +5406, 3967, 8863, 15364, 20037, 17691, 14843, 12585, 9622, 4788, 5046, 9175, 10820, 12898, 10181, 8583, +9006, 9576, 11800, 10365, 6242, 5093, 1963, -1902, -6978, -6168, -4024, -6853, -10690, -14085, -15944, -15801, +-8591, 376, 1642, 2427, -1174, -10307, -11265, -4292, 2760, 5516, 7449, 8407, 6863, 2573, -1770, -3650, +-1598, -5400, -7602, -11144, -16623, -15207, -14425, -14923, -15405, -15953, -16448, -17150, -16039, -10623, 448, 7075, +4297, 3052, 8472, 10772, 8705, 4300, 4088, 9398, 16267, 17935, 17025, 16682, 12934, 8873, 5225, 5133, +9792, 11511, 11050, 10908, 7623, 8854, 11113, 11848, 8991, 7257, 7018, 2081, -2977, -6034, -3260, -4836, +-7235, -8003, -14725, -18830, -13460, -8313, -2433, 3939, 3233, -4547, -10717, -9069, -4157, 1056, 5075, 6150, +10553, 6195, 736, 452, -2562, -2383, -2996, -7671, -12472, -14724, -14803, -14425, -14565, -15635, -15607, -15675, +-19821, -18577, -7339, 855, 2178, 2087, 4963, 9021, 10774, 6929, 2180, 5279, 10388, 14098, 17564, 16949, +17461, 13347, 7258, 6230, 5935, 9292, 11620, 11584, 9087, 7044, 10642, 11503, 10482, 9029, 10090, 7259, +150, -1336, -3188, -5581, -3660, -3473, -10825, -15393, -16371, -14933, -9763, -331, 4867, 611, -4857, -10400, +-7520, -3774, -1773, 5251, 8151, 8305, 5967, 2724, -1081, -1069, -852, -3506, -7533, -11786, -14445, -13795, +-14252, -16046, -13376, -13538, -19347, -22006, -15253, -6635, -1821, 214, 1172, 5783, 11400, 8672, 5112, 2970, +5987, 10264, 12485, 17266, 18363, 17079, 12063, 8617, 6080, 5697, 10328, 12077, 10066, 7549, 8830, 11682, +9562, 9870, 12816, 9575, 5072, 3930, -1765, -4352, -3299, -1316, -5547, -10284, -13290, -18642, -15440, -8401, +275, 4866, -1315, -6099, -7045, -7970, -5839, -143, 4337, 7689, 8619, 5815, 2161, 391, -168, -820, +-2306, -8484, -11579, -11894, -14807, -16728, -13332, -11238, -17120, -21325, -20977, -15133, -6279, -5110, -2706, 1711, +6812, 10933, 6817, 3696, 4018, 6118, 7860, 12456, 17790, 17661, 16149, 12658, 8422, 5184, 6779, 11713, +11007, 7287, 9269, 10781, 7756, 10398, 12254, 11491, 8919, 7833, 2848, -2818, -1424, -3123, -1769, -4100, +-9704, -14389, -18793, -17238, -6478, 1676, 871, -1603, -4709, -7661, -8730, -5700, -1244, 4387, 7608, 6917, +6501, 2188, -61, 1847, 413, -4637, -7827, -7786, -13594, -17110, -13701, -11556, -11911, -19052, -22587, -19697, +-13850, -8304, -7568, -4467, 2102, 8236, 8607, 5287, 4812, 4340, 4183, 7423, 13162, 16785, 17527, 16312, +13867, 5925, 5820, 11030, 9112, 8945, 9765, 9870, 7750, 8783, 11679, 10494, 12461, 10442, 6802, 3165, +-1104, -2145, -728, -2133, -3325, -7108, -16717, -20057, -14587, -5404, -597, 498, -1364, -4572, -7348, -9698, +-5821, -522, 2995, 7043, 8141, 4991, 474, 3679, 2672, -2739, -2566, -4537, -9092, -15062, -16201, -11486, +-10096, -13814, -20051, -22525, -18610, -13106, -10672, -10709, -3931, 3317, 6589, 6692, 6325, 4749, 3304, 3139, +8487, 12015, 15004, 19928, 16050, 10599, 7195, 9503, 8391, 8082, 11290, 9005, 8407, 8877, 8548, 10348, +12389, 11901, 11265, 7185, 2247, 718, -1501, -1728, -33, -629, -9604, -17533, -18667, -13801, -5451, -1583, +-400, -349, -4521, -8529, -8598, -5069, -3119, 3796, 9043, 4670, 4051, 4266, 3536, 622, -1446, -539, +-3677, -10823, -15617, -14061, -9954, -10047, -14930, -21274, -21555, -16324, -14257, -14340, -10262, -3759, 2510, 4913, +6867, 7194, 2383, 3353, 4594, 6210, 10696, 18185, 18664, 13297, 11849, 9520, 7615, 9107, 9655, 9094, +10336, 8117, 7873, 9380, 9831, 12613, 13410, 10709, 6936, 4555, 262, -2269, 707, 1828, -859, -10281, +-18020, -17380, -12550, -6966, -2547, 1263, -1396, -5929, -6058, -8915, -7913, -657, 4783, 5803, 4002, 5825, +5451, 2429, 35, 1075, 1176, -4638, -11618, -14675, -12350, -8244, -10176, -17485, -20384, -19508, -15775, -16622, +-15897, -8960, -5156, 654, 5888, 7077, 4526, 3881, 4303, 1670, 5246, 13676, 16631, 16681, 14809, 10397, +10358, 8302, 8277, 9686, 10063, 8809, 8269, 8289, 7652, 10891, 13653, 12532, 11285, 8344, 4328, 158, +-1402, 2723, 3990, -1444, -11821, -15773, -15407, -14597, -6456, -378, -1377, -1507, -3029, -7254, -10635, -5944, +761, 3344, 3571, 5523, 7411, 4449, 1288, 2112, 3380, 1042, -4451, -12427, -13305, -9624, -7417, -11847, +-18527, -18097, -17792, -18149, -17418, -14547, -11259, -6418, 1783, 4979, 4541, 6471, 4881, 1024, 2370, 6000, +12973, 17005, 15853, 13981, 12511, 9825, 8079, 9901, 9440, 9695, 9864, 7984, 7078, 8650, 11028, 13299, +12804, 11990, 9036, 4222, -1139, 238, 6651, 2910, -3479, -8521, -15846, -17225, -12547, -5861, -3450, -1207, +156, -3791, -9723, -9760, -4238, -247, 400, 3721, 7318, 5419, 3816, 1024, 3487, 4880, 874, -5730, +-12992, -11086, -7211, -9066, -14029, -16128, -17459, -19122, -18474, -16808, -18027, -12066, -4886, -1711, 3224, 6092, +5168, 3560, 786, 728, 6556, 12755, 14634, 15407, 14509, 11217, 10163, 8658, 8527, 10178, 9628, 9228, +7292, 6959, 8212, 10903, 12819, 12340, 14220, 8830, 982, 776, 3897, 4976, 2957, -986, -9795, -15815, +-15646, -11806, -8110, -3823, 521, 109, -5937, -9948, -6996, -4888, -2092, 80, 4750, 7539, 4219, 2936, +1742, 5384, 6029, 379, -8011, -10581, -8049, -7941, -10638, -11973, -15908, -18120, -16597, -19003, -19531, -16262, +-12320, -7509, -1355, 2855, 5734, 5961, 2308, -579, 2387, 6529, 11739, 14810, 14922, 14597, 11683, 10250, +8877, 9481, 10514, 9277, 10090, 6140, 7237, 9566, 9094, 12241, 16333, 13667, 6134, 3001, 2435, 4208, +5690, 5326, -2169, -9668, -14092, -14502, -12510, -9786, -1557, 1056, -2071, -6497, -8006, -6086, -6010, -3449, +1123, 5418, 6717, 3759, 1513, 3803, 7903, 6001, -2273, -6768, -7370, -8761, -7501, -9420, -13650, -14596, +-16014, -18348, -19105, -18946, -17352, -13159, -7623, -3946, 3655, 6305, 4039, 1544, -413, 2278, 6130, 11250, +13897, 15162, 14330, 10617, 11174, 8706, 8940, 11405, 9849, 7285, 7728, 8401, 5759, 9251, 14884, 16206, +11534, 7009, 2874, 2628, 5230, 6989, 5451, -3901, -7851, -12459, -15581, -14187, -8274, -804, -580, -3884, +-5634, -6581, -7244, -7039, -3980, 1615, 5600, 5787, 1061, 1450, 7883, 7459, 3644, -855, -6082, -7438, +-6171, -8108, -10813, -11591, -14120, -16580, -17343, -20121, -19516, -16648, -15057, -9569, -3925, 3775, 5014, 3093, +740, -542, 2521, 4744, 10498, 14194, 13972, 13203, 12566, 8753, 8979, 11408, 9758, 8398, 9002, 8874, +4944, 5854, 10749, 15004, 15933, 11349, 7051, 2199, 3812, 7267, 7515, 3664, -1859, -6369, -12502, -17039, +-13792, -6185, -2062, -2257, -4010, -4542, -6595, -8046, -8170, -4431, 3693, 5393, 1127, 1637, 3854, 7097, +7649, 4133, -2685, -4657, -4816, -7418, -8106, -9951, -11865, -13074, -16277, -18125, -20081, -18840, -18359, -16293, +-10651, -4274, 3721, 3494, 1630, 897, 121, 216, 5700, 9939, 12321, 14644, 13360, 10403, 9162, 11684, +9051, 9323, 10034, 9324, 7636, 3729, 6529, 10860, 15321, 15958, 11205, 5498, 3336, 5553, 8141, 6781, +3867, 915, -6082, -13162, -16845, -11631, -5760, -3573, -2692, -3485, -3408, -5686, -10651, -8265, -842, 3032, +2763, 1982, 1208, 4145, 10017, 6711, 2461, -298, -3421, -4314, -6534, -7818, -9675, -10316, -12863, -15927, +-17721, -19275, -18880, -18892, -17830, -11459, -2040, 904, 2729, 2693, -138, -611, 1338, 4924, 8349, 14156, +13549, 11886, 11133, 10841, 10575, 8857, 10290, 10942, 9518, 6182, 4164, 5997, 11595, 16185, 15701, 10098, +5103, 5221, 6705, 7621, 6796, 5722, 2593, -7243, -13297, -14992, -11105, -5593, -5172, -4060, -949, -2711, +-9137, -10275, -6056, -2013, 3373, 1706, -754, 2352, 6038, 9035, 5578, 3189, -226, -2291, -3868, -6723, +-7659, -8817, -10271, -12346, -15793, -18068, -16971, -20189, -21134, -17322, -11032, -4188, 289, 3345, 186, 401, +-289, -320, 4246, 9534, 12686, 12134, 11692, 11757, 10645, 9007, 9915, 10214, 11551, 8823, 5180, 3318, +5724, 12590, 16427, 14280, 9050, 5807, 6598, 5998, 6898, 8529, 6797, 2137, -6934, -13998, -13265, -9283, +-8498, -7068, -758, -1270, -4829, -8658, -10664, -5768, -443, 1812, -1023, -267, 2666, 6735, 8146, 5477, +2975, 1032, -1793, -4077, -5480, -8215, -7734, -9424, -13340, -15381, -15396, -18288, -21668, -20198, -18655, -11985, +-4304, -484, 1185, 1363, 18, -1868, -243, 4671, 9101, 11003, 12178, 11887, 11824, 10130, 8958, 10108, +11157, 11842, 8660, 3940, 3165, 6602, 13512, 16009, 12734, 9839, 7202, 6176, 6325, 7532, 9633, 9066, +2057, -9224, -9916, -10840, -12270, -8620, -5258, -762, -1162, -4927, -10117, -9504, -4005, -347, -123, -1365, +-364, 3982, 7175, 6516, 6921, 3271, 1475, -482, -3400, -6000, -6150, -6717, -10771, -12022, -13397, -15656, +-18367, -20950, -22219, -17766, -12200, -5845, -1221, 1190, 1293, -1735, -1635, 203, 4154, 8370, 10367, 11892, +12058, 11634, 9784, 8571, 10775, 12577, 11570, 8227, 2825, 3439, 8385, 13048, 14953, 12876, 9904, 7687, +7052, 4162, 9640, 13034, 7397, 174, -5310, -8488, -11984, -11742, -9068, -4432, -43, -1377, -6754, -9808, +-8096, -3082, -560, -2475, -1123, 397, 3825, 6400, 7772, 5741, 3856, 3383, -1150, -3168, -3778, -5528, +-7747, -9217, -11610, -12141, -14667, -18477, -21911, -21392, -17826, -13656, -6653, -783, 423, 124, -1865, -1745, +225, 3742, 7771, 9571, 11711, 12807, 10610, 9420, 8503, 11843, 13801, 11319, 6608, 2861, 4979, 7432, +13958, 13634, 12005, 12257, 7463, 3787, 6783, 12500, 11498, 6966, 1364, -3340, -8278, -11376, -12698, -8700, +-2667, -709, -1843, -8089, -9375, -6093, -2816, -2702, -2114, -1653, -167, 4496, 6323, 6254, 6437, 5459, +1328, 82, -2275, -3714, -5395, -7523, -9751, -10675, -10789, -15105, -19376, -21065, -21581, -19607, -13974, -7029, +-1553, -761, -788, -2071, -2620, 417, 2898, 6619, 8918, 12056, 12079, 10124, 7653, 9003, 14282, 12340, +10963, 6570, 1988, 5300, 9153, 11188, 12851, 14985, 10837, 5159, 4502, 9324, 11784, 11472, 6373, 2558, +-1526, -8814, -11866, -12844, -8142, -2308, -406, -4498, -8579, -7745, -5869, -3728, -2593, -3732, -1926, 972, +2959, 5580, 7128, 6430, 4824, 2276, 148, -1747, -2412, -5208, -8539, -8534, -8670, -11338, -14873, -18686, +-20566, -22671, -20280, -13363, -8447, -1984, -1618, -1313, -3030, -2019, 29, 2144, 5557, 8469, 13306, 10703, +7972, 8461, 10077, 12976, 14183, 9960, 3841, 4687, 5667, 7147, 10175, 15417, 14238, 9216, 4902, 5759, +10651, 11519, 10618, 7581, 4589, -1704, -7277, -12870, -12586, -6416, -1271, -2555, -5015, -7837, -7678, -4663, +-4123, -4234, -3232, -1813, -210, 2888, 5477, 6512, 6560, 5442, 1592, 351, 579, -2949, -6015, -7616, +-7031, -8739, -11359, -13537, -18451, -21124, -23234, -19528, -15141, -8114, -2925, -2665, -1935, -3771, -1240, -241, +-3, 5329, 10559, 10909, 10105, 8224, 7198, 11233, 14812, 13255, 7241, 6581, 5106, 4045, 6780, 11168, +16041, 13173, 7604, 5358, 7659, 10059, 11272, 10894, 8382, 5570, 297, -8609, -13154, -10289, -5806, -1696, +-2774, -6318, -7217, -5889, -5106, -4825, -3973, -3311, -2603, 419, 2619, 4154, 7999, 6469, 4507, 2001, +2513, 1154, -3877, -5114, -6429, -6861, -8602, -9404, -13511, -18055, -21134, -23398, -19724, -15836, -8371, -3455, +-3605, -4261, -1265, -2114, -2962, 874, 5505, 9487, 10899, 9634, 5358, 8895, 12685, 14164, 11540, 8720, +6893, 4698, 3073, 6578, 13422, 15200, 11106, 7505, 6528, 7565, 10516, 10895, 10256, 10524, 6937, -513, +-8325, -12535, -9610, -4159, -2482, -4679, -6049, -5906, -6331, -5162, -4245, -5259, -3204, -2366, -187, 1069, +5720, 7895, 5201, 4152, 3533, 3666, -214, -2861, -4455, -6546, -6612, -7668, -8863, -12997, -18238, -21091, +-22531, -22696, -14422, -8197, -6643, -4572, -3003, -1919, -4374, -2324, -489, 5238, 10171, 9643, 6667, 6040, +9289, 12892, 13023, 10864, 9885, 7196, 2574, 2321, 8696, 13098, 13463, 10596, 7022, 6966, 8352, 9163, +10433, 11474, 11012, 7981, -722, -9181, -11976, -7186, -4375, -4940, -3899, -6440, -6258, -5796, -4925, -5861, +-4943, -2919, -3379, -1825, 1604, 6734, 5395, 4808, 5010, 4198, 3049, 155, -2282, -4445, -6238, -6846, +-5502, -9733, -12527, -16565, -21611, -24751, -20540, -13889, -11396, -6726, -4702, -3278, -2746, -4290, -4309, 54, +6339, 9375, 8017, 5623, 6614, 10554, 11971, 11696, 12960, 10754, 5129, 2200, 3774, 9099, 13304, 12285, +9521, 8385, 7490, 8147, 8814, 10823, 11640, 13696, 8498, -2505, -7809, -9502, -6641, -5179, -3956, -4770, +-6357, -5035, -5405, -5671, -5649, -3324, -4100, -4456, -1217, 3129, 4738, 5309, 5346, 5347, 5553, 1877, +2185, -1938, -4964, -5025, -4969, -6709, -8161, -10177, -17515, -22631, -22883, -20032, -15697, -11239, -8244, -4661, +-2718, -3902, -5691, -4463, 843, 6624, 8396, 5700, 5869, 8201, 9192, 10786, 13517, 13575, 9993, 4692, +1394, 5819, 9675, 12316, 11063, 10397, 8492, 7857, 8617, 7386, 10754, 14583, 14650, 6664, -1268, -6385, +-8522, -5869, -4949, -4257, -5577, -4915, -4906, -6143, -5666, -3758, -4675, -4967, -4215, -780, 3549, 2586, +5667, 5986, 5611, 4240, 4600, 1672, -2614, -2928, -4438, -6076, -5170, -5792, -11030, -17278, -22131, -22092, +-19671, -16563, -12940, -8046, -4175, -3784, -4740, -6822, -4630, 2344, 6179, 5663, 5965, 6490, 7270, 8179, +10690, 15036, 13727, 9088, 2745, 3384, 6622, 8500, 12082, 10685, 9571, 9366, 8770, 5898, 7045, 12630, +15722, 13614, 6732, -281, -6166, -6985, -5648, -4796, -5781, -4162, -4918, -6330, -5493, -5049, -3551, -5886, +-5911, -3135, 0, 551, 3660, 5910, 4783, 5483, 6060, 3942, 935, -266, -3316, -5181, -5090, -3796, +-5192, -11082, -17831, -21168, -20678, -21088, -17603, -13301, -8227, -4767, -3780, -7416, -7503, -2908, 1769, 4477, +4706, 6260, 6147, 6169, 6549, 12202, 16424, 11950, 7837, 3788, 4150, 5818, 9980, 10483, 9508, 11034, +10376, 6925, 4834, 8352, 13541, 16051, 13138, 8232, -1231, -3852, -5719, -5953, -4737, -5125, -3830, -5566, +-6447, -4960, -3288, -5420, -6530, -4384, -3101, -1975, 1707, 3588, 3986, 5989, 6203, 5502, 4211, 2308, +-78, -3373, -4968, -4036, -1811, -5148, -11613, -16520, -19203, -21711, -20228, -18998, -13536, -7303, -4919, -5724, +-8591, -6375, -2709, 1280, 3115, 4642, 7086, 4889, 3880, 7916, 14248, 14559, 12228, 7627, 3709, 4703, +7292, 9105, 8646, 10967, 11760, 10031, 5139, 5751, 8616, 14308, 16633, 13258, 7687, 794, -2886, -4993, +-5335, -5242, -3339, -4429, -6690, -5168, -3167, -4925, -5723, -4977, -5292, -3447, -1075, 1124, 2302, 4758, +5696, 6226, 5870, 4351, 3578, -92, -3946, -4694, -1280, -2077, -5176, -10802, -15562, -18312, -21154, -21199, +-20035, -12090, -7835, -5747, -7328, -9075, -5577, -2590, -550, 2509, 6577, 5169, 2832, 4099, 9212, 13130, +15286, 11327, 6533, 4766, 5304, 7810, 6484, 9249, 11722, 11539, 8954, 4625, 5103, 9733, 14504, 16147, +13466, 7338, 2046, -1768, -5132, -5593, -3173, -4090, -6535, -5161, -4456, -4255, -4844, -5268, -6129, -4842, +-3699, -1234, 139, 2026, 4078, 6001, 5913, 4752, 6618, 3447, -1510, -3552, -3296, -868, -2168, -5064, +-10769, -13916, -18039, -21770, -22240, -19840, -12272, -7873, -7304, -9994, -7258, -5821, -4782, -1120, 4245, 4985, +3650, 2206, 4021, 9190, 13474, 15119, 9617, 6685, 5989, 5982, 5940, 6719, 9304, 12327, 11631, 7277, +4450, 5261, 9804, 14957, 16138, 12296, 8971, 3435, -2897, -4100, -3658, -3674, -5629, -5071, -5674, -4286, +-4274, -4898, -5719, -5935, -5362, -3510, -1168, -1731, 2690, 4260, 4823, 5262, 6654, 7105, 2270, -1003, +-3255, -1841, -360, -2250, -5080, -8906, -13298, -17496, -21711, -23920, -18418, -11632, -9290, -10335, -7884, -7951, +-7862, -5036, -583, 4037, 3695, 2638, 1209, 3631, 9852, 13851, 12742, 9542, 7155, 6658, 5955, 4585, +6576, 10401, 12381, 10495, 7120, 3518, 5441, 11039, 14279, 14862, 14301, 9461, 2551, -999, -3019, -3020, +-4125, -4856, -5370, -5040, -3869, -4720, -4112, -6407, -5959, -4547, -3552, -2905, -837, 2882, 2663, 4687, +5596, 7991, 6533, 2128, -1547, -1650, -803, -1082, -1545, -4568, -8071, -11616, -17079, -24059, -21944, -17177, +-13108, -10793, -9853, -7781, -9391, -8681, -4946, -28, 3420, 3324, 805, 704, 4430, 9975, 13266, 11642, +9353, 8340, 7636, 3858, 4860, 7107, 10559, 12364, 10218, 5315, 3903, 6660, 9730, 14041, 15664, 14568, +8653, 3839, -625, -1913, -2252, -5037, -4327, -5263, -5012, -3765, -3971, -5240, -6355, -4837, -5031, -4307, +-2815, 70, 1249, 2760, 3179, 7444, 8676, 5350, 1908, -427, -807, -1036, 189, -2453, -3665, -5501, +-11343, -18630, -22816, -20617, -17352, -14457, -11094, -9100, -9233, -10137, -9315, -4934, 680, 2855, 1827, -36, +320, 4889, 10589, 11214, 10941, 10483, 9324, 6009, 4427, 4338, 7105, 12149, 11328, 9038, 5498, 4670, +5595, 10117, 14263, 15805, 14911, 8460, 4559, 891, -727, -2900, -3836, -4365, -5791, -3762, -3784, -4508, +-5482, -4978, -5565, -5141, -4905, -2033, -47, 128, 999, 4487, 8791, 6704, 6018, 1905, -406, 353, +-241, -1297, -1832, -1360, -4639, -12219, -18649, -20836, -20807, -17973, -14960, -10974, -9389, -10131, -11682, -9564, +-3995, 179, 2695, 276, -1446, 1023, 6102, 8387, 10752, 11176, 10584, 9901, 5498, 3513, 4228, 9141, +11080, 10599, 9308, 5090, 4523, 5412, 9937, 14379, 16578, 13534, 9673, 5293, 1914, -337, -1939, -3693, +-5272, -3827, -4293, -3837, -4689, -4923, -4724, -5566, -6305, -4270, -639, -2053, -1046, 1711, 4948, 8046, +7580, 4897, 1835, 1306, 859, -939, -1809, 328, -236, -5002, -12195, -17155, -20398, -20402, -19171, -14797, +-10280, -10551, -11495, -12390, -9552, -4255, 1182, 757, -1688, -892, 1273, 5186, 7569, 9827, 10781, 12228, +8888, 4008, 4079, 4759, 8978, 10392, 10878, 8146, 5521, 3400, 5085, 10032, 14513, 15370, 13798, 9988, +5153, 3722, -260, -1726, -4142, -4081, -4128, -4078, -4084, -5387, -3435, -5153, -7277, -5463, -2906, -2320, +-2599, -1755, 1427, 5542, 7817, 7195, 3772, 3334, 2088, 404, -1837, -411, 1399, 359, -5291, -11680, +-15622, -19891, -21346, -19027, -13537, -11784, -10704, -12692, -13804, -8928, -3388, 84, -1000, -1935, -1379, 1964, +4380, 5925, 9543, 12315, 11477, 7856, 4843, 3404, 5905, 8554, 10644, 10547, 8415, 4864, 2945, 5879, +9670, 14611, 15297, 13766, 9808, 7328, 3870, 465, -1038, -4223, -3275, -3082, -4926, -4466, -3066, -4045, +-6229, -6698, -4477, -2879, -2758, -3384, -2292, 1887, 5905, 7568, 5687, 5110, 4207, 2239, -178, -1867, +1079, 2598, 24, -5191, -9242, -15438, -19971, -20616, -18681, -13260, -11357, -11429, -14854, -12842, -8702, -3135, +-537, -2447, -2528, -40, 1525, 2432, 5959, 9799, 12603, 10679, 8216, 4020, 4250, 5946, 8081, 11414, +9966, 7938, 4360, 3143, 5091, 10326, 14339, 14334, 14010, 10432, 7602, 5123, 1208, -2471, -1814, -2987, +-4072, -4814, -3193, -2971, -4835, -6354, -6174, -3856, -2861, -3243, -4823, -1635, 2234, 5651, 6442, 5766, +5943, 4851, 2094, -1517, -187, 2138, 1936, 389, -3749, -8753, -15000, -19525, -21531, -17239, -13075, -11955, +-13178, -15186, -13657, -7950, -2801, -3150, -3077, -1842, -7, -219, 2010, 5449, 10311, 12091, 10283, 7993, +4297, 3947, 5871, 9115, 10673, 9844, 8308, 3433, 2734, 6155, 9919, 13683, 14844, 12945, 11547, 8988, +5245, 754, -467, -1314, -3365, -4193, -4233, -2270, -3578, -4985, -6773, -5294, -3212, -3297, -4634, -4737, +-1343, 1994, 5576, 4765, 6572, 7230, 4252, 1194, -527, 854, 1822, 2738, 573, -2477, -7594, -14796, +-20098, -19794, -16943, -12998, -11713, -15163, -15885, -12974, -6687, -5080, -4062, -2807, -1556, -895, -1355, 1541, +5673, 9942, 11125, 10982, 7138, 3879, 4328, 6535, 7937, 11408, 10407, 6450, 3955, 2792, 5888, 10092, +13319, 13362, 13916, 12343, 9331, 5089, 1820, 1039, -1683, -3163, -4275, -3024, -1934, -3961, -5811, -6212, +-4083, -3652, -3551, -5629, -4597, -950, 2042, 3252, 5296, 7800, 6464, 4135, 896, 148, 1211, 2240, +2050, 2087, -1225, -7688, -14551, -19383, -19607, -16067, -11761, -13883, -16810, -15308, -12071, -7647, -6653, -4225, +-2580, -1763, -2485, -1641, 1428, 4863, 9246, 12235, 9258, 6903, 4896, 3413, 6372, 8900, 11413, 9386, +6895, 2930, 3066, 6397, 9538, 11987, 13361, 14730, 12260, 9383, 5457, 3360, 1390, -1498, -3316, -3755, +-1107, -2754, -4344, -5691, -5380, -3619, -3138, -4981, -5666, -3358, -1331, 825, 2895, 6263, 7513, 7323, +2816, 1585, 1555, 855, 1883, 3312, 3378, -1005, -6535, -14393, -19387, -18215, -13851, -12741, -15576, -16760, +-14505, -11664, -9526, -7001, -3705, -2473, -3387, -1980, -2074, 93, 5436, 9535, 10842, 9697, 7516, 3606, +4477, 6070, 9669, 11422, 9290, 6027, 2842, 4129, 5911, 8742, 11379, 14142, 14330, 12577, 9314, 6120, +5059, 1184, -1827, -3204, -1857, -1593, -2937, -4842, -5861, -3967, -3389, -4290, -5251, -4804, -3852, -1341, +-444, 2527, 7200, 7569, 5924, 2996, 3287, 750, 499, 2596, 3898, 3781, 435, -6508, -14926, -18579, +-15847, -13324, -14326, -16601, -16046, -13431, -14021, -10023, -6108, -4895, -3360, -2742, -3281, -3283, 598, 4563, +9017, 10460, 9678, 6738, 3545, 3990, 6023, 10792, 10446, 8831, 5264, 3836, 3821, 5196, 8286, 11014, +14357, 14297, 12084, 9203, 8573, 4737, 1207, -1808, -2217, -967, -1555, -3742, -5483, -4214, -3978, -3603, +-4583, -5611, -4423, -3461, -2965, -1565, 4100, 6672, 6325, 5660, 4430, 2434, 637, 769, 2420, 4235, +5150, 1064, -7500, -14977, -16941, -13392, -14951, -15782, -15596, -15407, -15943, -13517, -9905, -7888, -4603, -3582, +-3681, -4186, -3445, -135, 4347, 8400, 10019, 9815, 5850, 3389, 3296, 7553, 10311, 9631, 8641, 5319, +4034, 3493, 4896, 7047, 11743, 13983, 13270, 11763, 10784, 9028, 4895, 1142, -1973, -182, -880, -2405, +-3773, -5078, -3961, -3425, -3971, -5653, -4581, -3653, -5048, -4224, -130, 3647, 5680, 6214, 6326, 4318, +2351, 1219, 99, 2914, 5257, 7008, 695, -8798, -13214, -13514, -14585, -15397, -14301, -16326, -15792, -15906, +-13653, -11051, -7679, -4894, -4135, -4067, -5167, -3588, -608, 3989, 7469, 10711, 9156, 5079, 2813, 4541, +7862, 9489, 10292, 7741, 6004, 4309, 3093, 4117, 7630, 11734, 13062, 13022, 11721, 12659, 9426, 4505, +1262, 83, 120, -769, -1809, -4287, -4514, -2613, -3547, -5315, -4335, -3512, -4610, -6167, -3078, -458, +2915, 5461, 6271, 6623, 4214, 2821, 1060, -569, 3071, 8412, 6848, -1411, -6885, -11097, -13284, -14325, +-14065, -15015, -15666, -16085, -16017, -13806, -11765, -7543, -5242, -4039, -5285, -5256, -3690, -1210, 2897, 8413, +10557, 7745, 5012, 3040, 5082, 7783, 9804, 9529, 7970, 6803, 3450, 3025, 3670, 8063, 11584, 11757, +12153, 13655, 13017, 8629, 5092, 2087, 437, 652, 266, -3412, -3913, -3059, -2612, -5128, -4479, -3223, +-4209, -5425, -5833, -2943, -1050, 2274, 5290, 6652, 5407, 5483, 3668, -1884, -45, 5745, 8571, 5075, +-377, -6053, -10196, -12782, -13687, -13779, -15177, -15637, -16576, -15556, -15302, -11869, -7709, -5280, -5464, -5610, +-4914, -5261, -2166, 3245, 8395, 9064, 7603, 4114, 3107, 5483, 7233, 9553, 9136, 8269, 6679, 3084, +1791, 4533, 8410, 9597, 10635, 13440, 13710, 12518, 9439, 4980, 2243, 1697, 2056, -1415, -3421, -2254, +-3003, -3820, -4826, -3417, -3331, -4826, -5983, -4688, -4220, -1483, 3113, 4070, 5482, 7392, 6424, 509, +-1514, 1650, 6433, 8155, 4921, 299, -5110, -9352, -12164, -12584, -13794, -15110, -15660, -15846, -16704, -16156, +-10885, -8315, -6390, -5692, -4956, -6410, -6028, -2133, 3174, 8019, 8346, 6829, 4014, 3391, 5179, 7832, +8205, 9646, 9183, 6042, 1806, 2985, 5458, 6623, 8823, 11049, 13269, 13675, 13636, 8972, 4641, 4141, +3076, 1261, -1728, -1651, -2166, -3078, -4585, -3453, -2853, -4438, -4360, -5303, -6122, -4110, -82, 571, +3613, 6875, 8355, 4590, -180, -794, 2713, 7028, 7520, 5438, 1054, -4289, -8807, -10363, -11961, -14139, +-14121, -14796, -16515, -17795, -14606, -11470, -9236, -6297, -5270, -5507, -7374, -6492, -1832, 3287, 7119, 8323, +5997, 3920, 3878, 6048, 6049, 8813, 11269, 8370, 4873, 2808, 4129, 4296, 6252, 8648, 10338, 13366, +15023, 12823, 8263, 6457, 5157, 3715, 408, -630, 19, -2749, -3516, -3031, -2946, -3766, -2750, -4491, +-6277, -5202, -2894, -1880, -289, 4365, 8001, 8293, 3111, -219, 106, 3619, 6468, 7729, 6316, 843, +-3902, -7016, -9617, -12786, -12669, -13238, -15537, -17316, -16907, -15072, -12423, -9723, -6191, -4990, -7244, -7924, +-6601, -2258, 2743, 7390, 6721, 4962, 5006, 3912, 4424, 5966, 10913, 10109, 7441, 5294, 3577, 3442, +4388, 5898, 6995, 10741, 13828, 14917, 11406, 8721, 7904, 5997, 2142, 1295, 1187, -1660, -2405, -2778, +-3626, -3268, -2489, -3436, -5714, -5684, -4528, -3569, -3820, -494, 4906, 8867, 6630, 2024, 594, 514, +3145, 6646, 8667, 5313, 1130, -2009, -6449, -10257, -11102, -11933, -13134, -16368, -16713, -16464, -16192, -13268, +-9386, -5800, -6509, -7521, -8364, -7711, -2052, 3199, 5625, 5265, 6280, 4595, 2380, 3969, 7571, 9994, +9128, 8167, 4460, 4040, 3616, 4012, 4396, 6581, 11067, 14432, 13087, 10973, 10963, 7863, 5303, 3417, +2296, 466, -725, -1873, -3703, -2873, -2362, -2404, -4383, -5366, -4936, -3886, -5006, -5113, 171, 6255, +7999, 5105, 3038, 480, 70, 3777, 7814, 7257, 5656, 2531, -1289, -6597, -9256, -9498, -11532, -13699, +-15946, -15188, -17849, -16614, -12789, -9399, -6385, -6463, -7947, -10083, -6852, -1367, 1913, 3940, 6707, 5989, +3096, 2713, 4234, 7773, 9629, 9392, 7169, 5221, 4346, 4094, 3165, 2799, 7723, 11583, 12642, 12575, +12583, 10370, 8216, 6186, 3441, 2781, 1284, -288, -2808, -3045, -2261, -1991, -2758, -4961, -4816, -3438, +-4670, -7107, -5062, 1722, 5378, 6802, 6038, 1984, -79, 701, 4582, 7024, 6748, 6690, 3326, -1575, +-6417, -6946, -9192, -11930, -13129, -14511, -16267, -18421, -16028, -13875, -9198, -6315, -6964, -10225, -9671, -5888, +-3072, 802, 4445, 6232, 4867, 2862, 2070, 4898, 7614, 9202, 9443, 6159, 6014, 5512, 3146, 1345, +4070, 7770, 10208, 12372, 12628, 12391, 10708, 8969, 5495, 4618, 3391, 1775, -677, -2499, -2747, -1302, +-1695, -4008, -4860, -2603, -3379, -6908, -6837, -4298, 1276, 4981, 7461, 5288, 1133, 484, 1531, 4680, +5768, 8032, 7607, 2791, -1473, -4116, -6405, -9379, -10609, -12387, -14201, -16748, -17437, -17581, -13587, -7968, +-7145, -8904, -9856, -9001, -7188, -3466, 396, 4509, 5703, 3856, 2557, 2063, 4729, 8036, 9171, 7423, +7354, 7542, 4334, 2427, 1787, 4128, 7075, 10122, 11457, 12568, 12908, 10972, 8511, 6579, 5177, 4090, +2038, -732, -2684, -1343, -90, -3701, -4101, -2779, -2167, -4819, -6905, -6851, -4605, 1022, 5311, 7468, +3478, 1487, 1337, 1497, 3301, 6713, 8935, 6382, 3100, -194, -3323, -6590, -8089, -10220, -12138, -13342, +-16485, -19040, -17479, -11792, -9319, -8045, -9034, -9935, -9172, -8022, -3963, 544, 4074, 4823, 3994, 1059, +2457, 5765, 7301, 7457, 8276, 8431, 6747, 4475, 2082, 1529, 4177, 6897, 8744, 11263, 12853, 12660, +10468, 9134, 6802, 5523, 5567, 992, -1307, -1194, 75, -1930, -4194, -2752, -2081, -2597, -5263, -6615, +-7673, -4744, 1419, 6084, 5223, 3594, 2532, 730, 895, 3830, 7695, 7878, 6548, 4049, 315, -2832, +-5227, -8061, -9890, -9875, -13705, -17474, -18671, -16652, -11907, -9980, -8549, -9312, -9610, -10501, -8037, -4401, +8, 4149, 4439, 1878, 1491, 3542, 5025, 6246, 7848, 8349, 8491, 7398, 3730, 1828, 2169, 4193, +5563, 8527, 11596, 12164, 12907, 10619, 8806, 7493, 7741, 4566, 401, 243, 166, -214, -3176, -3098, +-1950, -1863, -2719, -4492, -7770, -8235, -3671, 1723, 4642, 4721, 4633, 1746, 159, 1312, 4452, 6993, +7935, 7033, 3676, 1735, -1990, -5718, -7266, -7731, -9849, -13880, -17482, -18540, -15449, -13004, -9982, -8668, +-9403, -10301, -10235, -9088, -4779, 983, 3488, 2534, 2060, 2121, 2927, 5023, 5618, 7658, 8556, 9456, +6575, 3231, 3069, 1929, 3424, 5457, 8321, 10701, 13046, 12194, 9844, 9443, 9383, 7535, 3438, 1517, +1545, 749, -1508, -2485, -2449, -2131, -956, -1958, -5406, -8543, -7113, -3429, 961, 4224, 5468, 4010, +1102, 1139, 864, 4661, 7641, 7360, 6661, 5599, 2177, -2349, -4903, -5761, -6502, -9726, -14148, -16931, +-17872, -16140, -12544, -10298, -9561, -9102, -10231, -11941, -9451, -3572, 124, 2273, 2073, 2035, 1569, 3487, +4278, 4412, 8406, 9101, 8868, 5946, 4502, 2371, 2075, 3326, 4510, 7925, 11342, 12402, 10787, 10159, +10813, 10196, 6094, 3893, 3011, 1754, 551, -1212, -2378, -2916, -979, -189, -2618, -6252, -7903, -7005, +-4377, 1306, 3892, 4791, 3831, 1519, -445, 2197, 5017, 6234, 7133, 7775, 6094, 1857, -2345, -3791, +-4214, -6537, -9399, -13624, -16989, -18026, -15091, -13481, -11497, -8287, -9635, -11920, -12505, -8629, -4331, -582, +1738, 989, 1589, 2375, 2705, 2451, 5484, 7961, 8948, 8547, 6204, 4269, 2776, 2213, 2012, 4318, +8250, 11404, 10713, 10186, 11472, 11506, 9326, 6179, 4984, 3096, 2466, 963, -1563, -2783, -2207, 403, +-760, -2847, -5813, -8326, -7231, -3521, 68, 3818, 5409, 2903, 367, 762, 2608, 4102, 5747, 7557, +8864, 5726, 1548, -1272, -2432, -4154, -5156, -8805, -14331, -15825, -17027, -15675, -14439, -9799, -8529, -10907, +-12062, -12394, -8981, -4260, -692, -62, 1126, 2076, 1822, 1642, 2801, 5206, 7889, 9272, 7749, 6618, +4637, 3252, 1336, 1220, 5005, 8575, 9870, 9550, 11204, 11562, 11592, 9036, 6699, 5011, 4010, 3452, +562, -2217, -2053, -1169, -55, 220, -2946, -6626, -7511, -6842, -4877, 636, 4397, 4447, 1871, 702, +1726, 1949, 3214, 5776, 8900, 8175, 5272, 2669, -1253, -1904, -2454, -4512, -9936, -12767, -15176, -17549, +-16568, -13122, -10033, -9640, -10728, -13248, -12648, -8441, -4637, -2306, -196, 1047, 1583, 1564, 858, 2609, +5176, 8068, 8612, 7237, 7417, 5257, 2780, 64, 2322, 5202, 7582, 8856, 9576, 11087, 11908, 11741, +9048, 6215, 5976, 5673, 2555, 583, -1468, -2456, -978, 1494, -547, -3538, -5613, -7498, -8036, -4709, +1481, 3680, 3312, 1217, 2370, 1236, 325, 4006, 6232, 8430, 8140, 6400, 1816, -558, 33, -1653, +-5237, -8255, -11532, -15886, -17176, -16180, -12907, -10025, -9498, -12135, -13490, -11882, -8930, -5262, -3013, -532, +804, 1553, 567, 328, 2487, 5508, 7503, 7133, 8363, 8045, 4720, 1806, 744, 2482, 4850, 6839, +8257, 8840, 11109, 12957, 10948, 8154, 7724, 6955, 4812, 3953, 658, -2440, -1592, 476, 1085, -1058, +-2299, -5480, -8163, -8727, -3118, 1462, 1947, 2748, 2813, 1813, -216, 1498, 3617, 5661, 8824, 8842, +5119, 1871, 1436, 174, -1834, -4084, -7345, -11708, -15348, -17422, -16269, -11876, -10657, -10255, -12816, -13404, +-12102, -9216, -6168, -3784, -846, 853, 910, -777, 321, 3064, 4667, 5953, 7898, 8825, 7790, 4091, +1866, 1007, 2121, 4975, 6131, 6389, 9090, 12247, 11259, 10555, 9035, 7624, 6725, 6370, 4052, -966, +-1296, -1007, 681, 184, -112, -1408, -6619, -9385, -7000, -2647, -628, 1934, 3330, 2479, 706, 812, +940, 2593, 6938, 9079, 7648, 5094, 3278, 1616, 718, -1015, -3506, -6088, -11394, -15403, -17325, -14782, +-12180, -10552, -10941, -13005, -13298, -12048, -9379, -7308, -4181, -177, 524, -850, -455, 967, 2493, 3473, +6156, 8549, 8709, 7510, 4686, 1544, 765, 3909, 4028, 4243, 7008, 9963, 10773, 11580, 11165, 8250, +8206, 8042, 7273, 2932, -454, -105, -512, -335, 1211, 1911, -2810, -7473, -7862, -6116, -4202, -462, +2480, 2422, 2517, 1332, 139, -29, 3921, 7046, 8227, 7841, 5050, 3972, 2302, 902, -459, -1738, +-5767, -11310, -15281, -16380, -14399, -12028, -10666, -11508, -13430, -12925, -11555, -11192, -7822, -3247, -627, -1170, +-1077, 139, 568, 1034, 3582, 6537, 7132, 9872, 7577, 3381, 1466, 2977, 2995, 2178, 4915, 6751, +9052, 10855, 11968, 10012, 8209, 9116, 9651, 6128, 2532, 1671, -196, -1765, 603, 3441, 826, -3859, +-6018, -7433, -6878, -4050, -191, 986, 3175, 2580, 524, -352, 182, 4069, 6906, 7908, 7021, 5980, +4387, 2021, 1326, 1029, -992, -5549, -11110, -14544, -16006, -14102, -11061, -11661, -12433, -12459, -12334, -13308, +-11768, -6955, -3206, -2310, -1684, -7, -885, -68, 1344, 3107, 4937, 9120, 9966, 5366, 4053, 3046, +2703, 1862, 2613, 4394, 6015, 8761, 11565, 10925, 8596, 9469, 10552, 8533, 5617, 4743, 1804, -2128, +-620, 2344, 2993, -127, -2658, -6179, -7461, -6458, -4362, -1000, 1427, 3035, 2302, 375, -1186, 795, +4513, 6312, 7160, 7752, 6427, 4069, 2130, 2551, 2129, -871, -4669, -10569, -14798, -15191, -12289, -12444, +-12422, -11751, -11734, -13529, -14859, -10436, -7243, -4897, -2649, -1050, -1708, -836, 514, -489, 1907, 6486, +9216, 7836, 5827, 4651, 3378, 2088, 2041, 2630, 3000, 5871, 9719, 10739, 8760, 9754, 10785, 9414, +8206, 7698, 5184, -127, -1038, 532, 2361, 3009, 207, -2871, -5607, -7166, -6860, -4354, -1398, 1303, +3347, 1979, -924, -716, 1423, 4050, 5438, 7352, 8542, 5690, 3747, 3297, 3162, 2258, 927, -4703, +-10816, -13997, -13064, -12489, -13895, -11248, -10646, -12638, -14970, -13096, -10701, -8661, -4229, -2793, -2656, -912, +-14, -1458, -1195, 2835, 6894, 8124, 7183, 6957, 4632, 3318, 2672, 2546, 918, 2743, 7330, 9037, +8584, 9439, 11073, 9317, 9440, 9946, 8153, 4288, 415, -618, 1277, 3064, 2643, 613, -2231, -5493, +-6947, -6348, -5123, -1408, 2017, 3315, 754, -1018, 330, 1299, 2912, 5733, 8532, 7146, 5981, 4387, +3285, 3571, 4142, 1623, -5583, -10142, -11697, -12538, -14542, -12321, -10050, -12038, -13366, -13657, -14012, -11711, +-7562, -5290, -4285, -2191, -220, -1434, -2945, -707, 3212, 6085, 7006, 8127, 6350, 4180, 4512, 3276, +763, 240, 4509, 6589, 7038, 8994, 10103, 9656, 9353, 10126, 10663, 8304, 3755, 402, 440, 1774, +2540, 3380, 705, -2361, -4907, -6397, -7190, -5430, -758, 2556, 1737, 58, 637, -784, 541, 3205, +6116, 7564, 7110, 6501, 3585, 3251, 5313, 5480, 120, -5198, -7491, -11516, -13940, -12901, -11260, -11666, +-11328, -13027, -14726, -14081, -10974, -8233, -6925, -4119, -1360, -889, -3202, -2663, -411, 2374, 5404, 7596, +7264, 5230, 5861, 5346, 1541, 180, 1840, 3688, 5319, 7000, 9008, 9452, 9023, 9043, 11279, 11447, +7099, 3994, 1154, 808, 1481, 3403, 3244, 474, -1859, -3943, -6934, -8422, -4030, -501, 1108, 1111, +1189, -337, -1408, 855, 3141, 5415, 7401, 7934, 5226, 2614, 5299, 6848, 3807, 496, -2594, -8029, +-11491, -12750, -12435, -11819, -10866, -11197, -14197, -14696, -13519, -11043, -10050, -7266, -3247, -1741, -2437, -3193, +-2586, -1465, 2047, 6174, 6172, 5777, 6939, 6358, 4131, 1322, 889, 1585, 3164, 4639, 6921, 9181, +8107, 8108, 10124, 12190, 10329, 7602, 4218, 1604, 711, 2127, 4246, 2016, 1343, -330, -4530, -7982, +-7005, -3609, -1508, 867, 1762, 844, -1147, -661, 902, 2160, 5711, 8848, 6575, 3433, 5084, 6205, +5768, 4502, 2161, -2699, -7334, -10500, -12516, -12140, -11099, -10151, -12284, -14390, -13852, -13014, -12598, -10628, +-6408, -3411, -2897, -2200, -3303, -4060, -828, 2778, 4842, 4922, 7083, 7159, 6458, 4026, 1452, 1748, +1402, 2253, 4858, 7867, 7626, 7308, 8456, 11186, 11733, 10279, 8605, 3871, 1446, 1999, 2853, 2784, +2879, 3027, -828, -5193, -7114, -6300, -4416, -1515, 1306, 1425, -139, -114, -457, -1351, 3431, 7176, +7177, 5101, 5045, 5448, 5748, 6493, 5286, 2548, -1909, -6304, -10171, -12211, -11136, -9978, -10897, -12805, +-13451, -13011, -14273, -13392, -9768, -7142, -4057, -2393, -2982, -5016, -3338, -799, 1959, 3563, 4733, 7098, +7420, 5826, 3309, 2953, 981, 292, 2253, 5498, 6960, 5866, 7267, 8910, 10456, 11768, 11305, 7447, +3656, 3091, 2206, 1839, 3103, 4414, 2740, -1282, -4641, -6380, -7012, -4382, -629, -74, 994, 1242, +-642, -2891, 82, 4347, 5854, 6261, 5355, 4993, 5215, 6145, 6641, 5414, 3123, -872, -6308, -10075, +-11485, -9616, -10619, -11831, -11743, -12981, -13953, -14596, -12923, -11190, -6977, -3563, -3236, -4245, -4800, -3412, +-688, 1263, 2040, 5659, 7112, 6801, 5487, 4433, 3161, -173, 174, 3359, 5081, 5239, 6039, 6988, +7944, 11024, 12454, 10382, 6885, 5356, 3138, 1716, 1811, 4248, 4675, 1962, -242, -4415, -7185, -6138, +-3636, -2507, 106, 2369, 292, -2217, -2180, 762, 3812, 5509, 5834, 5261, 4785, 5824, 6084, 6767, +6003, 4471, -603, -6532, -9150, -9498, -10007, -11142, -10442, -12060, -12967, -13576, -14801, -14129, -10838, -6575, +-4284, -3663, -5272, -4608, -2899, -1473, -150, 2252, 5857, 6327, 6019, 6482, 5322, 1629, -297, 1421, +2932, 4276, 5332, 5403, 5709, 8778, 11305, 12031, 9658, 8010, 6084, 2382, 1854, 3007, 4124, 4440, +3492, -629, -4969, -5587, -5752, -5173, -2030, 1125, 1901, -702, -2236, -1699, 503, 4204, 4803, 5638, +4941, 5196, 5900, 5777, 7025, 7625, 4784, -1305, -5044, -7868, -9311, -9867, -9863, -11133, -11542, -11987, +-14333, -15002, -14375, -10695, -6317, -4759, -4941, -5309, -4012, -3209, -2673, -499, 3149, 4570, 5386, 7199, +7168, 4396, 1518, 849, 889, 3186, 4436, 4582, 4333, 5881, 9420, 10825, 11271, 10595, 8672, 5124, +3345, 2333, 2344, 4815, 5865, 2469, -732, -3351, -5376, -6761, -4920, -1251, 935, 1518, -1257, -2252, +-1828, 1067, 3745, 4419, 5028, 5196, 5694, 4477, 6146, 8436, 7729, 4140, 122, -4569, -7551, -8139, +-9659, -10103, -10476, -11074, -11913, -14491, -15741, -14344, -10160, -6649, -5849, -5738, -4557, -4281, -4552, -2962, +171, 1682, 3287, 6338, 7027, 6725, 4287, 1534, 553, 1069, 3453, 3762, 3155, 3975, 6312, 8221, +10299, 11866, 10111, 7976, 6571, 2576, 1639, 3336, 5667, 4754, 2289, 685, -3395, -5941, -6788, -4565, +-1379, 1113, 616, -1447, -2815, -1516, 1602, 2519, 3822, 5497, 5512, 3781, 4840, 7276, 7958, 7942, +4852, 135, -3863, -6406, -7919, -9420, -10062, -10079, -10331, -12304, -14959, -16410, -13793, -9925, -7907, -6910, +-5118, -4748, -5785, -4320, -2776, -939, 721, 3364, 5949, 7125, 6579, 4189, 1266, 499, 2153, 3061, +2613, 3256, 3995, 5049, 8681, 10467, 10929, 10319, 9541, 5719, 1949, 3162, 4006, 5165, 4620, 3730, +684, -3086, -6044, -6470, -4332, -1160, 1274, 69, -2258, -2423, -329, 193, 1920, 5201, 4986, 4212, +4209, 5106, 7160, 8647, 8225, 5129, 684, -2845, -5297, -7623, -9049, -9600, -9001, -9744, -12485, -15648, +-15750, -12685, -11093, -8435, -6197, -5441, -5568, -5420, -4329, -2966, -1692, 430, 2971, 5929, 7398, 6737, +3363, 1338, 2027, 1437, 2749, 3013, 2449, 2937, 5908, 8193, 9091, 11294, 11584, 8669, 4742, 3538, +3152, 4079, 4910, 5270, 4311, 789, -2809, -5862, -6505, -4188, 36, 655, -1431, -1218, -1608, -1711, +91, 2892, 4541, 4618, 3983, 3947, 5181, 7319, 9128, 8251, 5233, 1305, -1652, -4789, -7320, -9085, +-8793, -7641, -10152, -13494, -14886, -15122, -13796, -11158, -8556, -6688, -6096, -5835, -5698, -4441, -3615, -2050, +-646, 2261, 7043, 6686, 5741, 3722, 2355, 1041, 2091, 3447, 1698, 1717, 4036, 5450, 6380, 9883, +11988, 11189, 7932, 5497, 4118, 3073, 4000, 5189, 5934, 4148, 1453, -2294, -6937, -6099, -2373, -843, +-736, -429, -1181, -2249, -1942, 295, 2978, 4047, 4449, 3562, 3664, 5045, 7939, 9186, 7995, 5496, +2194, -512, -4341, -8015, -7898, -7066, -8093, -10380, -12930, -14532, -15487, -13572, -11491, -8705, -7094, -6348, +-6079, -6202, -4019, -3857, -3689, -1232, 3630, 5668, 6062, 6267, 3730, 1341, 1980, 3285, 1466, 1285, +2686, 3383, 3703, 6448, 10452, 11580, 10391, 7973, 6312, 3790, 2773, 4769, 5080, 5381, 5669, 1957, +-4070, -6074, -4634, -2817, -1723, -467, -175, -1699, -2670, -1919, 561, 2460, 4135, 4124, 2870, 3407, +5535, 8089, 9171, 7501, 6037, 3980, -318, -4882, -6879, -6444, -7191, -7412, -10387, -12388, -14512, -15354, +-13369, -11951, -8748, -6984, -7132, -6917, -4753, -4358, -5497, -3965, -273, 2353, 5033, 7444, 5181, 2784, +2731, 3074, 1947, 1121, 2370, 2499, 2051, 3098, 7126, 10408, 10582, 10545, 8941, 5512, 4069, 4277, +3524, 5114, 7283, 6081, 858, -3698, -4653, -4316, -3258, -1624, 187, -449, -2092, -2431, -1763, 246, +3011, 3830, 3767, 2338, 3145, 6495, 8085, 8060, 7937, 7834, 3935, -224, -4256, -5685, -5997, -6451, +-7057, -10028, -12352, -14122, -14773, -14528, -11129, -8423, -8476, -7951, -5369, -4816, -6177, -5019, -3707, -1835, +2242, 6171, 6337, 3971, 4068, 3625, 2453, 1421, 2066, 2920, 1331, 1003, 4063, 6844, 9075, 11453, +10421, 8072, 6267, 4986, 3023, 3240, 6543, 7910, 5353, 382, -2612, -4063, -4823, -3244, -1032, -288, +-591, -2421, -2394, -2088, 294, 3066, 3985, 2494, 1473, 4720, 6052, 6901, 8146, 9063, 8000, 4091, +66, -3337, -5368, -5342, -5174, -7628, -9639, -11414, -14036, -15965, -13465, -10117, -10526, -9265, -6498, -5852, +-6218, -5507, -5232, -5570, -1919, 2943, 5200, 4699, 4332, 4884, 3368, 1196, 2271, 3254, 1159, 755, +1713, 3166, 6013, 9767, 10860, 9650, 8741, 7213, 4260, 2341, 4254, 7722, 7682, 4552, 1721, -2095, +-4091, -4619, -2678, -946, -325, -1036, -1891, -2753, -2854, 1599, 3293, 2555, 1668, 2814, 4421, 5168, +6624, 8796, 9436, 7813, 5026, 389, -3313, -4174, -4033, -5796, -7423, -7677, -11910, -15359, -14306, -12382, +-12127, -11042, -8102, -7213, -6633, -5382, -5607, -6863, -5808, -1275, 2950, 3391, 4154, 6092, 4193, 2081, +2568, 3186, 1987, 1238, 1050, 756, 2567, 6517, 9111, 9915, 9571, 9862, 6883, 2715, 3105, 5197, +7597, 6922, 5202, 1928, -1979, -4271, -4223, -2174, -1754, -364, -436, -2862, -4019, -1273, 1644, 2221, +1505, 2255, 3129, 3251, 4876, 6955, 8505, 9401, 8819, 4993, -174, -1699, -2986, -5058, -5130, -5143, +-8531, -13059, -13622, -13431, -13706, -12421, -10354, -9022, -7756, -6147, -5066, -6807, -8213, -4762, -995, 603, +2961, 5549, 4933, 3285, 2843, 3188, 2487, 2352, 1271, 393, 136, 2903, 6475, 7723, 9665, 10789, +10035, 5371, 3285, 3689, 5813, 7339, 6972, 6321, 1937, -2149, -3275, -3401, -3166, -905, 523, -1251, +-3887, -3128, -48, 819, 1333, 2119, 2536, 2276, 3206, 5203, 6113, 8656, 10909, 8377, 4234, 1886, +-734, -3994, -3863, -2857, -5566, -9295, -11290, -12996, -13702, -13593, -12025, -10499, -10110, -7335, -4768, -6329, +-8232, -6836, -4493, -2871, 279, 3895, 4513, 4627, 3330, 3392, 3058, 2619, 3011, 705, -325, 565, +3334, 4721, 7318, 10206, 11389, 9020, 4900, 3825, 4477, 5135, 7220, 8420, 5558, 1726, -945, -3044, +-4225, -2768, 383, -95, -2818, -3505, -2006, -718, -158, 1858, 1999, 1426, 2666, 3255, 3380, 6316, +10098, 9821, 7489, 6038, 2477, -2004, -2786, -2229, -2928, -5931, -8667, -10538, -12976, -14192, -12533, -12193, +-12510, -9628, -5924, -6103, -7768, -7223, -7018, -5597, -3707, 653, 3087, 3778, 4325, 3397, 3112, 2780, +3939, 1996, -35, 4, 911, 2092, 3564, 7248, 11009, 10707, 7643, 5940, 3917, 3563, 5591, 8032, +7810, 5151, 2892, -453, -4021, -4028, -1134, 387, -1673, -2687, -2478, -2635, -1273, 735, 1023, 1183, +2543, 2457, 1340, 3706, 7722, 8716, 9253, 9055, 6327, 1853, -1439, -1441, -1279, -3599, -5271, -7463, +-10962, -13204, -12475, -12519, -14504, -11820, -8661, -6692, -7287, -7314, -7196, -7586, -6608, -3393, 249, 1929, +4014, 3868, 2743, 3175, 3948, 3499, 1320, 122, 593, 779, 184, 3561, 8160, 10161, 9901, 8265, +5859, 3136, 3991, 6556, 7370, 7249, 6277, 3629, -1518, -4234, -2259, -681, -1065, -1440, -2283, -3322, +-2426, -524, -596, 271, 2712, 1935, 538, 1847, 4334, 6480, 8330, 9784, 9728, 5711, 1663, -81, +-421, -2020, -2550, -3847, -8624, -10452, -11558, -11992, -14238, -14123, -11194, -8763, -7613, -7331, -6739, -7944, +-8077, -6483, -3800, -665, 2347, 3278, 3085, 2794, 3581, 4682, 2449, 967, 1477, 518, -929, -35, +4103, 7392, 9508, 10338, 8102, 4874, 3484, 4939, 6140, 6561, 8333, 7552, 2425, -1867, -2435, -1785, +-1268, -439, -1376, -3177, -2388, -1522, -2119, -502, 1738, 2036, 1179, 445, 2469, 3779, 5714, 8685, +10909, 9037, 5256, 3234, 386, -725, -646, -1246, -4923, -8014, -9217, -10516, -12681, -14723, -13129, -11245, +-9472, -7711, -6826, -7479, -7905, -8193, -7044, -4051, -913, 2288, 2549, 2098, 3603, 4507, 3662, 2083, +2422, 1798, -522, -1152, 386, 3401, 6913, 10010, 10329, 7125, 4805, 4925, 4414, 5034, 7781, 9586, +6476, 2118, -563, -2366, -1799, -108, -1156, -2207, -2029, -2278, -2599, -2398, 390, 1433, 1533, 302, +1292, 2075, 2160, 6211, 9474, 10018, 8592, 6527, 2989, 453, 422, 617, -1620, -5147, -6744, -7923, +-10713, -13261, -13528, -13430, -11625, -9311, -7954, -6957, -7558, -8153, -8470, -7717, -4272, -492, 1050, 1147, +2591, 4288, 3535, 2989, 3143, 2756, 1107, -697, -1171, -276, 2563, 7398, 9968, 8804, 6967, 6074, +4185, 3248, 5951, 8808, 8494, 6798, 2654, -1231, -1279, -750, -759, -1596, -1257, -1910, -2531, -3327, +-1563, 821, 615, 1000, 1372, 955, 381, 2988, 6418, 8803, 9962, 9272, 6427, 2788, 1352, 1954, +796, -2325, -3793, -5542, -7941, -10223, -12827, -13467, -13212, -11826, -9377, -7889, -7197, -7266, -8338, -9356, +-7561, -3549, -1307, -478, 1566, 3075, 3602, 3081, 3533, 3806, 2534, 1194, -269, -1909, -1059, 3344, +7481, 8538, 8595, 8438, 4994, 3640, 4142, 5992, 8864, 9224, 6616, 1829, 235, -559, -737, -1107, +-1143, -614, -2105, -3507, -2462, -815, -477, 859, 1712, 945, -21, 728, 2953, 5915, 8742, 10357, +9403, 5529, 3375, 3011, 2031, 621, -1540, -3257, -4696, -7580, -9990, -12292, -13390, -13286, -11691, -9727, +-8065, -6758, -7400, -9514, -9286, -6849, -4154, -2636, -670, 1713, 2713, 2721, 3417, 3908, 3409, 3075, +1746, -949, -2985, 53, 3138, 6013, 8630, 9176, 7449, 5056, 3723, 3336, 6868, 9348, 8835, 5892, +2505, 988, -150, -1267, -933, 85, -1275, -2903, -2683, -2203, -1817, -214, 1310, 1358, 551, -321, +911, 2302, 5493, 9636, 10235, 8320, 6037, 4262, 3624, 2394, 760, -858, -2365, -4171, -7007, -9406, +-11965, -13088, -12866, -12281, -9799, -7273, -6835, -8390, -9530, -8764, -6787, -5342, -2978, -604, 1161, 2155, +2592, 3773, 2842, 4439, 3918, 773, -1589, -1944, -488, 2246, 6269, 8114, 8946, 7758, 4694, 2781, +4168, 7307, 9551, 8263, 5624, 3857, 1462, -802, -645, 325, -493, -1557, -2181, -2642, -2646, -1885, +167, 1455, 495, 709, -132, -444, 2078, 6098, 9223, 9564, 7977, 6228, 4863, 3964, 2381, 1105, +-425, -1831, -3567, -6664, -9311, -11241, -12680, -13833, -12196, -9326, -7182, -7689, -8804, -9116, -8640, -7454, +-5876, -2826, -1586, 789, 2325, 2146, 2407, 4206, 5069, 2837, 1081, -1350, -2440, -660, 2211, 5192, +8163, 9169, 7278, 3888, 2421, 4928, 7847, 8468, 7577, 6966, 3798, 738, -25, 26, -8, -597, +-1311, -1847, -3306, -2818, -1114, -247, 910, 1291, 441, -961, -721, 2349, 6122, 8999, 9039, 7891, +6705, 5466, 4287, 2780, 1231, 374, -700, -3770, -5836, -8551, -10364, -13314, -13835, -11542, -9173, -7472, +-8433, -8409, -9110, -9134, -7537, -5759, -4399, -1409, 1197, 862, 1305, 3285, 4308, 4546, 3621, 672, +-1639, -2036, -985, 1429, 4876, 8402, 9377, 6224, 2815, 3503, 5686, 6676, 8338, 8624, 6612, 3708, +1151, 776, 149, -305, 170, -1074, -2652, -2933, -2350, -1751, -398, 1460, 1175, -138, -1500, -871, +2367, 6169, 8376, 8550, 7766, 6911, 6248, 4041, 2827, 1810, 1409, -1153, -3210, -4878, -7865, -10358, +-13798, -13270, -11268, -9310, -8180, -7912, -8884, -9474, -8311, -8039, -7159, -3830, -1103, -389, 578, 1328, +2857, 4562, 4961, 3282, 590, -1360, -1935, -1519, 383, 5144, 9373, 7964, 5009, 3774, 3746, 5035, +6575, 8733, 8827, 5955, 3988, 2216, 426, 100, 741, 107, -1622, -2190, -2654, -2811, -1990, 279, +1328, 1285, -860, -1713, -760, 2122, 6527, 7596, 8046, 7860, 7888, 5966, 4009, 3676, 2717, 1349, +-893, -2087, -4010, -7116, -11058, -12843, -12785, -11757, -8975, -7871, -8938, -8863, -8205, -9306, -8993, -6597, +-4000, -1985, -654, -100, 901, 2885, 4799, 4947, 3039, 484, -312, -2387, -3246, 962, 6003, 8237, +6906, 5154, 4200, 3141, 4477, 7441, 8580, 7897, 6503, 4667, 1578, 713, 1045, 767, -371, -958, +-2093, -2817, -3342, -1600, 611, 1144, 1160, -1281, -2008, -1223, 2904, 5839, 6497, 8046, 8488, 7518, +5564, 4739, 4224, 2985, 844, -8, -842, -3859, -7308, -9943, -12793, -13489, -10433, -9095, -9368, -8523, +-7989, -9093, -9830, -8858, -6794, -4394, -2431, -1289, -564, 149, 3250, 5386, 3741, 3103, 2138, -859, +-3813, -3043, 1882, 5597, 6867, 6996, 5682, 3084, 3026, 5401, 7071, 7900, 8397, 7154, 3694, 2247, +1461, 1139, 521, -60, -436, -2374, -3263, -3225, -1249, 154, 1703, 731, -2001, -2587, -244, 2626, +4367, 6580, 8189, 8419, 6892, 5795, 5760, 4485, 2221, 1870, 1245, -1111, -3015, -5849, -10674, -12782, +-11759, -10591, -10118, -9011, -7869, -8248, -9355, -9995, -8550, -7083, -4833, -2043, -2288, -1870, 1196, 3445, +4078, 3792, 4552, 2420, -2182, -4157, -1747, 1471, 4425, 7149, 7211, 4364, 2930, 4044, 4603, 6809, +8319, 8648, 6521, 3819, 3208, 1611, 1077, 809, 900, -747, -2492, -3026, -3060, -1684, 1175, 1997, +-474, -2072, -1944, 51, 1643, 4120, 6819, 8464, 7396, 6806, 7320, 5662, 3818, 3482, 2267, 854, +354, -1849, -6658, -10416, -11326, -11720, -11072, -10404, -8569, -7612, -9050, -9322, -9648, -9561, -6982, -4198, +-3387, -3579, -1340, 1436, 2340, 2976, 5487, 5260, 1095, -2507, -3024, -2026, 387, 5199, 6931, 6072, +4138, 3659, 3346, 4327, 7102, 8616, 8080, 6103, 4911, 3241, 1423, 1383, 1691, 574, -777, -1953, +-3601, -3552, -752, 1679, 993, -973, -1904, -1266, -761, 627, 4772, 7107, 6715, 7422, 8079, 6685, +5518, 5074, 3329, 1925, 2470, 1391, -1988, -6347, -9393, -10137, -12001, -11559, -9278, -8509, -8294, -8249, +-9281, -10585, -9237, -6168, -4774, -5170, -3177, -643, 103, 884, 4215, 6633, 3661, 1288, -1721, -3481, +-2794, 1131, 4997, 5916, 5676, 4587, 3200, 2578, 4904, 7308, 8134, 7371, 7134, 5007, 2723, 2144, +1971, 1414, 961, -40, -2534, -4156, -3027, 178, 1439, -107, -808, -581, -2353, -1864, 1945, 4616, +5392, 6937, 8076, 7127, 6929, 6437, 4643, 3014, 2546, 3808, 1597, -2604, -5332, -7886, -11026, -11880, +-10697, -9833, -8854, -7797, -8027, -10608, -10665, -8064, -6366, -6783, -5091, -1994, -2304, -1402, 1699, 4937, +5341, 4121, 1861, -2183, -3942, -2213, 1385, 3941, 5556, 5884, 4239, 2173, 3160, 5273, 6521, 7624, +8197, 6775, 4601, 3499, 2374, 1740, 1759, 1634, -171, -3337, -4460, -1532, 186, -192, 360, 285, +-1964, -3108, -507, 1445, 3250, 5727, 6665, 7415, 7153, 7648, 6733, 3765, 2969, 4352, 3629, 1051, +-1352, -4485, -7924, -10969, -10753, -11239, -10272, -8159, -7182, -9245, -11133, -8733, -7738, -7977, -6344, -3562, +-3331, -3187, -926, 2184, 4330, 5773, 5135, 1500, -2201, -3157, -1328, 798, 3670, 6033, 5443, 3321, +2939, 3665, 4685, 6636, 8025, 7780, 6505, 5230, 3648, 2483, 1553, 2568, 2202, -1644, -3917, -2809, +-1493, -1436, 702, 875, -1081, -2126, -2343, -721, 879, 3092, 5521, 6119, 6463, 8233, 8230, 5481, +3852, 4158, 4356, 2983, 2043, -791, -4391, -7841, -9773, -10965, -12321, -9398, -7221, -8638, -10321, -9251, +-8589, -9074, -7723, -5182, -4433, -4189, -3096, -1029, 1538, 4454, 6573, 4915, 986, -1561, -2259, -1894, +734, 4198, 5316, 4551, 3716, 2920, 3269, 4981, 6546, 7868, 7310, 6436, 5945, 3375, 1733, 2636, +3751, 375, -2212, -2543, -3194, -2447, -733, 810, 61, -1412, -2164, -1749, -1788, 723, 3631, 4111, +5015, 7099, 8870, 6980, 5291, 4556, 4225, 3695, 3555, 2635, -1115, -4275, -6294, -9736, -12672, -10908, +-8338, -8636, -9626, -8951, -8937, -9560, -8801, -6848, -5395, -4927, -4062, -3230, -1694, 1423, 5558, 6367, +4392, 1782, -794, -2577, -1421, 1364, 3619, 5030, 4455, 3603, 2857, 3277, 5232, 6755, 7057, 6999, +7898, 5199, 2274, 3232, 3772, 2365, 142, -1484, -2914, -3507, -2535, 90, 35, -620, -933, -1986, +-2676, -1688, 1789, 2280, 2959, 5357, 7795, 8139, 6635, 5990, 4790, 3558, 4488, 4456, 1605, -700, +-2218, -6417, -11102, -11419, -9675, -9474, -9444, -8917, -8792, -9591, -9545, -8268, -6850, -5860, -4575, -4343, +-4328, -1964, 2294, 5048, 5832, 5087, 1766, -738, -1995, -1157, 1318, 3515, 4596, 4358, 3379, 2291, +4162, 5496, 5400, 7063, 8578, 6851, 4148, 3721, 3661, 3804, 1825, 631, -1402, -3613, -3392, -1674, +-509, -779, 118, -1222, -2889, -2706, -498, 856, 941, 2715, 5892, 7090, 7399, 7452, 5660, 3895, +4616, 5103, 3026, 1969, 1219, -2259, -7459, -10096, -10327, -10096, -9977, -9230, -8633, -9367, -9610, -9026, +-8267, -7064, -4982, -4639, -5458, -4113, -1707, 2047, 5046, 6144, 4903, 2276, -341, -1770, -443, 1215, +3391, 4929, 3705, 2449, 3862, 4165, 4109, 5988, 7689, 8419, 5771, 4688, 4556, 3836, 3475, 2435, +876, -2409, -3277, -2596, -2122, -1133, 55, -29, -2106, -3118, -1439, -348, -629, 901, 3188, 4890, +6800, 8430, 6713, 4887, 5205, 5201, 3687, 3309, 3476, 1488, -2778, -7083, -9002, -10250, -10445, -9814, +-9018, -9306, -9440, -9193, -9698, -8251, -6249, -5219, -5330, -5516, -4603, -1891, 2195, 4461, 6238, 5014, +2179, -61, -973, -1076, 1679, 4098, 3466, 3191, 3333, 3992, 3078, 4176, 6469, 7973, 7153, 5757, +5535, 4264, 3774, 4208, 2630, -238, -2116, -2718, -3056, -2774, -587, 409, -1386, -2797, -1818, -1409, +-1662, -301, 715, 1831, 4825, 7727, 7143, 5863, 6009, 5558, 4147, 3425, 4339, 3832, 1286, -2851, +-5989, -8895, -10346, -9910, -9974, -9635, -8967, -9358, -10012, -9377, -7796, -6278, -5070, -5678, -6000, -4510, +-1709, 1333, 5249, 5777, 4687, 3356, -153, -1179, -110, 2535, 3081, 2959, 3593, 3930, 3153, 2805, +4934, 6817, 7092, 7036, 6601, 4913, 4452, 4829, 4471, 2058, -217, -1270, -2988, -3931, -1858, 104, +-1001, -1922, -1762, -2069, -2053, -758, -829, -746, 2207, 5408, 6734, 6262, 6671, 6428, 5048, 3615, +4140, 4921, 3586, 1620, -2124, -5924, -8486, -9375, -10450, -10013, -9052, -9410, -9713, -9916, -9400, -7630, +-5519, -5874, -5680, -6013, -5078, -1647, 1590, 4398, 5646, 5688, 2765, -197, -529, 1008, 2118, 2196, +3160, 4156, 3197, 2455, 3656, 4836, 6264, 7068, 7318, 5960, 4776, 5332, 5456, 3738, 1959, 956, +-1779, -3978, -2912, -1105, -1196, -1021, -1596, -2419, -2136, -898, -1404, -2132, -469, 2546, 4790, 5774, +6434, 7330, 6041, 4478, 4059, 4392, 4653, 4438, 1509, -2111, -5130, -7893, -9789, -10212, -9536, -9862, +-9065, -10240, -10499, -8835, -7431, -5882, -5513, -6166, -6541, -4527, -1906, 976, 4200, 6442, 5418, 2346, +300, 746, 1382, 1195, 2673, 3741, 3547, 2837, 3058, 3639, 4582, 6343, 7547, 6769, 5162, 6023, +5932, 4713, 3835, 3419, 195, -2560, -3000, -2592, -1782, -796, -1135, -2672, -2190, -1122, -1180, -2344, +-2349, 65, 2108, 3803, 5586, 7100, 6786, 6012, 4630, 3798, 4646, 5552, 3996, 1576, -800, -5229, +-7334, -9272, -10231, -9398, -9197, -9823, -10468, -10104, -9025, -6970, -5576, -5933, -6625, -5910, -4775, -2511, +568, 4775, 6598, 4274, 2397, 1587, 1122, 735, 1679, 2970, 3346, 3070, 3162, 3057, 2960, 4889, +7076, 6711, 5649, 6559, 6335, 4979, 5340, 5067, 2723, -115, -1813, -3225, -2643, -1067, -973, -2212, +-2645, -1360, -813, -1903, -2814, -1448, -515, 1372, 3812, 5501, 6725, 7174, 5845, 3798, 4592, 4984, +4974, 4385, 2060, -975, -4122, -7289, -9364, -9483, -9371, -9446, -10067, -10653, -10573, -8442, -6729, -6048, +-6378, -6279, -5675, -5540, -3235, 1188, 5157, 5125, 4383, 3114, 2172, 1034, 1072, 2274, 2631, 3021, +3674, 3275, 2028, 3616, 5848, 5804, 5916, 6585, 6490, 5223, 5818, 5698, 4559, 2795, 84, -2477, +-3202, -1910, -1043, -1916, -3037, -1720, -1092, -1304, -2205, -2112, -2102, -789, 1513, 2782, 5564, 7423, +6484, 5362, 4563, 4398, 5162, 5158, 4237, 2461, -158, -3915, -7115, -8468, -9423, -8975, -9379, -10550, +-11062, -10250, -7987, -6968, -6742, -6059, -5617, -6773, -6098, -2958, 1570, 4010, 4562, 4637, 3470, 1965, +1363, 1931, 1653, 2225, 3977, 3350, 2035, 2842, 4463, 4544, 5554, 6341, 6096, 5808, 5855, 5754, +5516, 5105, 2676, -325, -2977, -2394, -1316, -1863, -2932, -2351, -1709, -1539, -979, -2294, -2660, -1611, +-1078, 65, 3267, 5637, 6754, 6445, 5278, 4398, 4803, 5101, 4731, 4746, 2837, 130, -3609, -6531, +-8326, -8757, -8660, -9645, -11076, -11331, -9269, -8385, -7736, -6402, -5390, -6304, -7481, -5939, -2500, 1036, +3012, 5052, 4535, 3018, 2846, 2350, 1183, 1563, 3712, 3354, 2479, 2870, 3467, 3624, 4958, 5565, +5909, 6043, 5954, 5912, 5612, 6206, 5552, 2376, -1187, -2107, -1346, -1995, -2274, -2521, -2832, -1513, +-773, -1847, -1968, -1971, -2039, -1762, 338, 3088, 5489, 6870, 5953, 5372, 4894, 4787, 4839, 5186, +4756, 3392, 329, -3042, -6176, -7962, -7651, -8504, -10396, -11183, -10365, -9431, -9064, -7509, -5662, -5459, +-7279, -7198, -5455, -3020, 350, 3618, 4396, 3467, 4501, 3305, 1623, 1419, 2950, 2968, 2878, 2997, +2872, 3271, 3882, 4854, 5127, 5713, 6048, 5856, 5239, 5960, 7291, 4980, 1273, -476, -1563, -1850, +-1601, -2807, -3274, -2335, -1354, -1629, -1464, -1646, -2239, -2194, -2172, 75, 3098, 5570, 6010, 6131, +5448, 4967, 4682, 4887, 5322, 4769, 3807, 813, -3107, -6032, -6509, -7255, -9222, -10521, -10752, -10112, +-10370, -9237, -6788, -5650, -6612, -6936, -6982, -6446, -2961, 789, 2460, 3029, 4955, 4295, 2626, 2204, +2109, 2695, 2836, 3030, 2788, 2934, 3454, 4052, 4401, 4883, 6110, 6051, 4554, 5811, 7369, 6544, +4701, 1668, -664, -1213, -1060, -2397, -3203, -2854, -2396, -1855, -1399, -1499, -1550, -1944, -3043, -2279, +26, 3016, 5010, 5681, 6198, 5427, 4823, 4765, 4879, 4952, 5476, 4176, 438, -2992, -4996, -5411, +-7723, -9415, -10162, -10049, -11153, -10738, -8265, -7057, -6303, -6021, -6976, -8210, -5549, -2483, -528, 1746, +3715, 4718, 3848, 3200, 2465, 2441, 2734, 2923, 2855, 2656, 3179, 3973, 3252, 4058, 5967, 5494, +4806, 5008, 6470, 6934, 7086, 4242, 1146, -3, -560, -1620, -2590, -3124, -3125, -2400, -2179, -1592, +-1157, -1329, -2375, -3471, -2246, 55, 2528, 4474, 5884, 5843, 5434, 5138, 4444, 4520, 5480, 6111, +3746, 277, -2588, -3203, -5748, -8151, -8662, -9538, -11083, -11450, -9860, -9197, -7241, -5505, -6693, -8182, +-7257, -5279, -3465, -1023, 1589, 3498, 4246, 3959, 3271, 2808, 2521, 3138, 2830, 2122, 3496, 3763, +2842, 3385, 5216, 5282, 5032, 4734, 5028, 6605, 7970, 6468, 3777, 1863, 367, -382, -1596, -2796, +-3052, -2939, -2798, -2492, -1357, -683, -1457, -3057, -2984, -2356, -325, 2431, 4264, 5571, 5831, 5962, +4743, 4162, 4657, 6567, 5984, 3009, 681, -774, -3207, -6260, -6585, -8400, -10129, -10641, -10926, -10957, +-8770, -6255, -6290, -7393, -7609, -6816, -5704, -3612, -1452, 1658, 2962, 4164, 4279, 3018, 3185, 3580, +2661, 2025, 3435, 3658, 2828, 3087, 4005, 4860, 5350, 4559, 3896, 5596, 7194, 7663, 6136, 3764, +2053, 850, -392, -1912, -2771, -2878, -3157, -3711, -2220, -1097, -819, -2001, -2764, -3322, -2658, -169, +1729, 3938, 5189, 6245, 5827, 3951, 3866, 5884, 6666, 4607, 3413, 1882, -1027, -3323, -4751, -6982, +-8553, -9208, -10938, -11864, -10684, -7976, -6903, -6785, -7583, -7200, -6986, -5980, -3832, -1600, 668, 3312, +4004, 3219, 3833, 4273, 2754, 2239, 3131, 3400, 3203, 3087, 2988, 4333, 5348, 4766, 3807, 4169, +5971, 7506, 7602, 5773, 4101, 2399, 1446, -782, -1746, -2180, -2937, -3959, -3462, -2023, -1148, -773, +-2074, -2663, -3518, -2385, -481, 1356, 3314, 5700, 6812, 4584, 3600, 5334, 6115, 5437, 5381, 3869, +1641, -331, -2273, -5003, -6724, -7136, -9708, -11287, -11987, -9984, -7998, -7387, -7161, -7158, -7499, -7003, +-5552, -4672, -2126, 1303, 2691, 2646, 4136, 4686, 3523, 2939, 2734, 3164, 3679, 3132, 2653, 3552, +4812, 5286, 4133, 3512, 4391, 6191, 8003, 7051, 5658, 4521, 3082, 930, -656, -1046, -2300, -3368, +-4171, -3450, -2167, -1079, -1095, -1910, -3157, -3450, -2030, -1227, 229, 3885, 6501, 5027, 4246, 4736, +5177, 5469, 6121, 5082, 3559, 2585, 185, -2456, -4622, -5619, -7013, -9892, -11820, -11333, -9704, -8724, +-7252, -7263, -7771, -7061, -6522, -6741, -4816, -1227, 113, 1689, 3042, 4385, 4396, 3750, 2631, 3083, +3620, 3401, 2706, 2747, 4066, 4945, 5069, 3602, 3143, 4579, 7046, 7371, 6599, 6363, 4821, 2882, +1028, 65, -913, -2300, -3685, -4094, -3509, -2218, -919, -957, -2557, -3132, -2012, -3336, -2199, 1018, +4491, 4962, 4967, 4804, 4270, 5379, 5947, 5558, 4798, 4353, 2807, 333, -2545, -3682, -4654, -7557, +-10140, -11207, -11423, -10042, -8130, -7844, -8166, -6791, -6905, -7630, -6472, -4141, -2158, -236, 1128, 3271, +4512, 4450, 3496, 2939, 3791, 3616, 3180, 2686, 3117, 4367, 5592, 4568, 2790, 3452, 5286, 6595, +6960, 7116, 6482, 4855, 2772, 1485, 546, -910, -2518, -3578, -4372, -3982, -1454, -1135, -2154, -2247, +-1700, -3461, -4113, -1483, 968, 3652, 4943, 4781, 4162, 4867, 5571, 5645, 5154, 5065, 5041, 2665, +19, -1618, -2575, -5122, -7172, -9660, -11959, -10934, -9321, -9093, -8582, -7177, -7136, -7517, -7632, -6171, +-4340, -2598, -1061, 821, 3533, 4308, 4048, 3335, 3624, 3725, 3621, 3074, 2267, 3408, 5307, 5273, +3568, 2950, 3680, 5322, 6044, 7242, 7240, 6696, 4490, 3097, 2280, 287, -603, -2067, -4208, -4850, +-2681, -1897, -2409, -1617, -1165, -2657, -3868, -3654, -2046, 1018, 3499, 4380, 4335, 4228, 5341, 5513, +4963, 5156, 6153, 4449, 2408, 845, -961, -2782, -3934, -7172, -10626, -10793, -10568, -10080, -9465, -8231, +-7270, -7521, -7831, -7497, -5828, -4486, -3424, -1682, 1245, 3259, 3789, 4107, 3558, 3719, 4251, 3713, +2166, 2559, 4336, 5526, 4529, 3506, 3040, 4026, 4722, 6029, 7792, 7252, 6208, 4989, 3668, 1698, +1339, 31, -3111, -4446, -3466, -3141, -3023, -1863, -1328, -1311, -2747, -4061, -3847, -2045, 1154, 3032, +3911, 3682, 5244, 5391, 4606, 5136, 6146, 5422, 4562, 3133, 491, -168, -1608, -3992, -7707, -9695, +-10334, -10784, -10335, -9467, -8013, -7475, -7958, -8087, -6798, -5659, -5242, -3951, -1325, 713, 2970, 3989, +3529, 3768, 4417, 4658, 2715, 2196, 3236, 4983, 5216, 4118, 3776, 3466, 3295, 4701, 6917, 7178, +7164, 6894, 4945, 3069, 3207, 2137, -1184, -2862, -3472, -3674, -3741, -2914, -1921, -937, -1392, -2969, +-4102, -4232, -1494, 1146, 2166, 2990, 4845, 5116, 4410, 5271, 5238, 5797, 5898, 4691, 2481, 1433, +850, -1379, -4221, -7284, -9000, -10278, -10843, -10666, -9147, -7852, -8180, -8594, -7299, -6624, -6146, -5461, +-4104, -1895, 681, 3105, 3014, 3468, 4386, 5050, 4138, 2196, 2457, 4216, 4913, 4638, 4753, 3898, +2695, 3538, 5256, 6077, 7317, 8247, 5870, 4753, 4366, 3903, 1390, -888, -2401, -3253, -3881, -4130, +-2930, -1845, -880, -1437, -3063, -5216, -3297, -1067, -427, 1846, 3470, 4359, 4610, 4833, 4674, 5228, +6309, 5688, 3962, 2780, 2340, 981, -1185, -4359, -6628, -8753, -10158, -11640, -10166, -8739, -8790, -8831, +-8257, -7284, -6845, -6106, -6029, -4648, -1955, 735, 2116, 2521, 3397, 5287, 5066, 2978, 2252, 3416, +3933, 4454, 5434, 4502, 3135, 3261, 3402, 4323, 6465, 8100, 6966, 5795, 5282, 4950, 3882, 1137, +-558, -2000, -3205, -4412, -3926, -3562, -1677, -190, -2189, -4084, -4138, -3064, -2228, -365, 1559, 3048, +4461, 4565, 4276, 4622, 5901, 6203, 5192, 3906, 3318, 2790, 1641, -1634, -3824, -5655, -8701, -10798, +-11023, -9589, -9432, -9196, -8910, -8361, -7236, -6580, -6578, -6464, -4792, -1817, 647, 834, 2158, 4460, +5660, 3857, 3163, 3122, 2811, 4119, 5300, 4989, 4202, 4007, 2719, 2960, 4720, 7056, 7660, 6580, +6124, 5798, 5698, 3313, 1755, -7, -2061, -2786, -4322, -4919, -3033, -687, -1289, -2497, -3761, -3822, +-3557, -2079, -1019, 1113, 3290, 4179, 4023, 3994, 5125, 5827, 6120, 4647, 3804, 4081, 3405, 971, +-1057, -2709, -5680, -9064, -10234, -10490, -9816, -9521, -9537, -9210, -8247, -7080, -6461, -7188, -6954, -4410, +-1310, -1065, 122, 3126, 4551, 4746, 4269, 3451, 2283, 3524, 4481, 4846, 5030, 4780, 3487, 2322, +2999, 4970, 7317, 6790, 6337, 6870, 5878, 5512, 3951, 1737, -105, -769, -3267, -5209, -4467, -2324, +-1393, -1367, -2710, -3655, -3694, -3335, -2632, -1608, 1572, 2923, 3801, 3746, 4009, 5419, 6243, 5353, +4248, 4704, 4494, 2919, 1407, -38, -2615, -5729, -8680, -10053, -9984, -9971, -9739, -9934, -9502, -8216, +-6444, -7103, -8167, -6272, -3708, -2874, -1825, 846, 2491, 4605, 4989, 4111, 2914, 2959, 3656, 4282, +5225, 5259, 4981, 3124, 1965, 3508, 5688, 6239, 6963, 6725, 6457, 6732, 5806, 3645, 2023, 1406, +-1090, -3723, -4967, -4069, -2408, -1306, -1729, -3060, -3064, -3535, -3785, -3026, -1390, 1194, 2916, 3328, +3123, 4529, 5990, 5556, 4773, 4975, 4834, 4302, 3107, 2015, 491, -2469, -5690, -8408, -9426, -10075, +-9746, -9900, -10877, -9546, -7173, -7154, -8348, -7380, -5854, -4599, -3411, -2016, 166, 2642, 4792, 4309, +4149, 2876, 2989, 3718, 4224, 5276, 6127, 4279, 2617, 2577, 3659, 5296, 6385, 6571, 6206, 7635, +6620, 5379, 3966, 3097, 1570, -1264, -3686, -5093, -3714, -2103, -1972, -2227, -2559, -3069, -3762, -3852, +-3579, -1397, 1319, 2434, 2125, 3607, 5058, 5421, 5078, 4920, 5155, 4800, 4163, 3337, 2922, 523, +-2299, -5353, -7927, -9599, -9091, -9568, -11480, -10736, -8491, -7765, -8111, -7949, -7245, -5974, -4752, -4211, +-2434, 231, 2549, 4384, 4611, 3402, 3489, 3026, 3062, 4821, 6073, 5578, 4081, 2928, 2316, 4211, +5311, 5755, 6093, 7339, 7601, 6273, 5628, 4643, 3625, 2076, -1288, -4031, -4277, -3204, -2524, -2177, +-2082, -2453, -2830, -3529, -4726, -3273, -811, 755, 1442, 2252, 4079, 4926, 5112, 4825, 5380, 5238, +4406, 4270, 4258, 2941, 823, -1417, -5769, -7800, -8071, -8755, -10931, -11391, -9949, -8836, -8173, -8392, +-8060, -6670, -6108, -5573, -4185, -3014, 185, 2677, 3965, 4190, 4186, 3256, 2301, 3915, 5043, 6197, +5691, 3866, 2542, 3179, 4478, 4468, 5473, 6708, 7512, 7229, 6588, 5401, 5392, 4555, 1814, -1568, +-3547, -3753, -3410, -2547, -2698, -2067, -1961, -2849, -4453, -4432, -2819, -1159, 104, 853, 2503, 4280, +4555, 4593, 5381, 5552, 4519, 4748, 4602, 4212, 3617, 1845, -2336, -5480, -6340, -7480, -9420, -10936, +-11213, -9664, -8779, -9242, -8277, -7581, -6862, -6314, -5614, -5290, -2624, 1, 1913, 3982, 4551, 3787, +2849, 2536, 3751, 5568, 6661, 5039, 3410, 3387, 3604, 3624, 4552, 5354, 6916, 7686, 7131, 6080, +5964, 6599, 4386, 1873, -1368, -3128, -3351, -3289, -3310, -2624, -1508, -2065, -3358, -4613, -4110, -2700, +-1546, -854, 704, 3134, 3428, 4100, 5059, 5268, 4947, 4861, 4426, 4255, 5065, 4404, 939, -2270, +-4649, -5856, -6981, -10327, -11009, -10568, -9811, -9917, -9105, -8578, -7666, -6631, -6919, -6322, -5149, -3057, +-828, 2032, 3753, 4257, 3761, 2440, 2114, 4216, 6429, 5679, 4727, 3932, 3648, 3319, 3632, 3990, +5334, 7529, 7197, 6540, 6250, 6857, 6691, 4762, 1692, -1127, -2263, -3249, -3761, -3426, -2159, -1557, +-2121, -3926, -4594, -3354, -2957, -2663, -846, 1172, 2202, 3294, 4383, 4750, 5152, 5485, 4178, 4207, +5086, 5673, 4431, 832, -2211, -3357, -4819, -7900, -9933, -10310, -10719, -9979, -10068, -9642, -8307, -7299, +-7249, -6938, -6457, -5485, -3652, -683, 1575, 3477, 4935, 2927, 1828, 2723, 5072, 5909, 5546, 4969, +4085, 4058, 3378, 3074, 4030, 6015, 7195, 6964, 6424, 6430, 7837, 6956, 4715, 1828, -82, -1945, +-3262, -3730, -3408, -1747, -1268, -2926, -4017, -3457, -3631, -3567, -2634, -592, 231, 2472, 3146, 3883, +5154, 5344, 4889, 4024, 4166, 5700, 6566, 3722, 546, -798, -2737, -4950, -7568, -9539, -10257, -10129, +-10618, -10451, -9436, -8217, -7766, -7008, -6990, -7180, -5414, -3882, -1417, 1339, 4462, 3910, 2226, 2143, +3201, 5064, 5828, 5410, 4933, 4794, 3931, 3026, 2956, 4121, 6272, 7040, 6415, 6003, 7526, 8074, +6687, 4944, 2383, 211, -1558, -3351, -4171, -2757, -1429, -2208, -3228, -3171, -3888, -3781, -3551, -3016, +-1000, 431, 1675, 2882, 4082, 4891, 5529, 4396, 3130, 4876, 6677, 5739, 3513, 1234, -433, -2161, +-5022, -7485, -9143, -9735, -10666, -11032, -10147, -10044, -8466, -7385, -7337, -7724, -6709, -5881, -4987, -1500, +1905, 3867, 3086, 2246, 1947, 3632, 4991, 5340, 5515, 5211, 4959, 3853, 2728, 2590, 4799, 6358, +6262, 5801, 6917, 7477, 8159, 7003, 4921, 2977, 1049, -1581, -3914, -3275, -2416, -2128, -2207, -3076, +-3293, -3567, -4003, -4120, -2543, -1533, 76, 1644, 2387, 4015, 5789, 4846, 3334, 3794, 5485, 6687, +5439, 3717, 1556, 647, -2208, -5071, -6650, -8654, -10100, -10546, -10770, -11122, -9966, -8070, -7985, -7802, +-7178, -7026, -7071, -4964, -1599, 1975, 3259, 2423, 2056, 2263, 3653, 4602, 5374, 5265, 5660, 5343, +3431, 2068, 3549, 4924, 5784, 5762, 6048, 6777, 7935, 8398, 6534, 5518, 4161, 848, -1683, -3142, +-3090, -2375, -2098, -2674, -2642, -3044, -3987, -3946, -3968, -3249, -1304, -77, 360, 2746, 4625, 5394, +3897, 3337, 4047, 6037, 6573, 4951, 4078, 2732, 526, -2184, -3850, -6449, -8690, -9300, -10420, -11497, +-11001, -9385, -8779, -8067, -7421, -7060, -7693, -7567, -5131, -1035, 1635, 2473, 2373, 1987, 2481, 3624, +4826, 4614, 5997, 6462, 4876, 2890, 2775, 3956, 4620, 5777, 5221, 5982, 7482, 8066, 7708, 7318, +6355, 4192, 1335, -1589, -2676, -2320, -2568, -2450, -1957, -2823, -2938, -3498, -4352, -4046, -2653, -1475, +-1236, 540, 3168, 4793, 4995, 3236, 3190, 4998, 6083, 5612, 5592, 4719, 2555, 660, -1130, -3964, +-6450, -7472, -9414, -10901, -11464, -10726, -9908, -9176, -8116, -6903, -7522, -8594, -7990, -4699, -1402, 991, +2364, 1623, 1857, 2967, 3351, 3850, 5025, 6920, 5963, 4460, 3091, 2900, 4141, 4797, 4701, 5174, +6579, 7068, 7966, 7748, 7624, 6915, 4646, 762, -826, -2021, -2707, -2448, -2395, -2389, -2513, -2737, +-4228, -4499, -3437, -2955, -2272, -1852, 436, 3493, 4987, 3557, 2879, 4127, 4840, 5176, 6128, 5871, +4269, 3180, 1265, -1314, -3845, -5229, -7525, -9364, -11215, -10975, -10946, -10650, -9432, -7453, -6920, -8564, +-8817, -8045, -4942, -1516, 898, 1208, 1350, 2708, 2500, 2404, 4004, 5622, 6674, 6046, 4064, 2959, +3719, 4116, 4028, 4648, 5291, 6324, 7513, 7146, 8065, 8611, 6961, 4512, 1605, -447, -1813, -2184, +-2662, -2624, -1808, -2258, -3347, -4175, -4094, -3469, -2759, -3345, -2488, 1248, 3984, 3641, 3074, 3760, +3794, 4394, 5703, 6021, 5621, 4923, 3572, 1463, -1355, -2826, -4726, -7368, -9566, -10618, -10550, -11936, +-10958, -8823, -7322, -7549, -8655, -9311, -8414, -4489, -1603, -339, 707, 2263, 2077, 2005, 2314, 3806, +6166, 6828, 5271, 3954, 3758, 3604, 4080, 3677, 4197, 5819, 6176, 6704, 7259, 8706, 8397, 7299, +4789, 1658, 228, -1152, -2604, -2855, -1981, -1936, -2331, -3522, -4338, -3851, -2576, -4119, -4474, -1722, +1780, 2704, 3258, 3371, 3161, 3651, 4447, 5612, 5633, 5853, 5247, 3779, 1157, -869, -1696, -4863, +-7561, -8915, -9929, -11538, -12357, -10651, -8932, -7447, -7602, -9452, -10113, -7537, -4851, -2555, -868, 883, +1857, 2120, 1219, 1800, 4746, 6118, 6239, 5335, 3974, 4152, 3978, 3445, 3387, 4839, 5450, 5757, +6682, 7361, 8756, 8957, 7362, 4478, 2907, 735, -1285, -2410, -2475, -2040, -1359, -2545, -4248, -3762, +-2328, -3846, -5049, -3855, -1452, 1295, 2440, 3347, 3003, 3053, 3738, 4597, 5298, 5564, 6569, 5526, +3361, 1525, 578, -1826, -4881, -6572, -8185, -10151, -11860, -12041, -11179, -8281, -7189, -8579, -9995, -9490, +-7755, -5225, -2944, -1641, 1394, 1837, 1031, 939, 2160, 4758, 6129, 5953, 4898, 4749, 4455, 3506, +3311, 3851, 4394, 5460, 5599, 6046, 7796, 9348, 8689, 7153, 5651, 3156, 1075, -835, -2464, -2482, +-798, -1716, -3704, -3502, -2620, -2792, -4704, -4851, -3903, -1565, 954, 2364, 3106, 2503, 3184, 3917, +4111, 4814, 6457, 6536, 5040, 3480, 2740, 449, -1953, -3924, -6236, -7860, -9933, -12287, -12730, -10296, +-8050, -8086, -8749, -10259, -9395, -7583, -6021, -3707, -1144, 1260, 1191, 763, 382, 2698, 4937, 5568, +5505, 5650, 4870, 4212, 3770, 3205, 3564, 4981, 4935, 4782, 6508, 8280, 8822, 8675, 7891, 5591, +3930, 1812, -1503, -2146, -1152, -931, -2834, -3386, -2699, -2358, -3366, -4892, -4744, -4125, -1704, 900, +2413, 2143, 2869, 3385, 3371, 3638, 5587, 6581, 5899, 5383, 4204, 2853, 730, -1259, -3939, -5216, +-6944, -10872, -12396, -12139, -10190, -8075, -8376, -9496, -9888, -9178, -8299, -6511, -4010, -933, 940, 722, +-400, 1124, 2857, 4259, 5343, 5925, 5324, 5164, 4592, 3170, 3238, 4350, 4508, 3939, 5426, 6478, +7918, 9235, 8531, 7788, 6652, 4748, 1129, -1148, -912, -680, -1671, -3087, -2795, -2022, -2627, -3570, +-4603, -5382, -4104, -1580, 783, 1433, 2308, 3220, 2580, 2884, 4145, 5595, 6025, 6209, 5319, 4399, +3665, 453, -1341, -2602, -4429, -7415, -10712, -12533, -11955, -9570, -8655, -8920, -9443, -9691, -9376, -8733, +-7254, -3765, -563, 66, -292, 196, 988, 2325, 4480, 5085, 5526, 5908, 5578, 3678, 3566, 4040, +3845, 4152, 4093, 5082, 6429, 8557, 8385, 8466, 8667, 7501, 4310, 1137, -101, 22, -856, -2249, +-2544, -2307, -1926, -2392, -3334, -5134, -5453, -3501, -1848, 94, 1626, 2730, 2459, 2430, 3225, 3855, +5917, 6099, 5650, 5992, 5498, 2896, 886, -607, -1585, -3960, -7257, -10973, -12175, -11309, -9765, -8869, +-9298, -9402, -9202, -9797, -9976, -6722, -3333, -1457, -448, -163, -191, 633, 2989, 3686, 4547, 6486, +5956, 4917, 4077, 4000, 3826, 4116, 3711, 3687, 5222, 7012, 7574, 8103, 8986, 9564, 7479, 3822, +1918, 973, 168, -1173, -2072, -2408, -2220, -1431, -2290, -3919, -5292, -4822, -4059, -2501, 519, 1231, +2343, 2504, 1993, 2729, 4765, 5264, 5345, 6197, 6667, 5091, 2833, 1008, 237, -792, -3903, -7344, +-10862, -11959, -11072, -9671, -10010, -9400, -8521, -9925, -11095, -9701, -6519, -4391, -1465, -862, -1212, -120, +1011, 1896, 3060, 5260, 6037, 5762, 4848, 4043, 4127, 4279, 3513, 3141, 3869, 5544, 6616, 6642, +8258, 9806, 9653, 6927, 4146, 2812, 1357, 314, -1153, -2248, -2505, -1382, -1397, -2822, -3805, -4873, +-5642, -3912, -2382, -485, 1749, 2232, 1476, 1802, 3554, 4222, 4578, 5440, 6756, 6787, 4777, 2694, +1695, 1141, -640, -3137, -7619, -10938, -10805, -10750, -10776, -10030, -8194, -9229, -10639, -10831, -9886, -7132, +-3773, -2287, -1790, -876, -112, 305, 1537, 3198, 5005, 6203, 5547, 4495, 4521, 4599, 4092, 2866, +3135, 4410, 5397, 5679, 6336, 9052, 9808, 9487, 6739, 4821, 3200, 2042, 611, -1650, -2280, -1506, +-1649, -1433, -2176, -4198, -5114, -5003, -4392, -3112, 400, 1589, 1253, 1228, 2393, 3462, 3563, 4242, +5927, 7331, 6155, 4814, 3053, 1914, 1961, 422, -3413, -8169, -9171, -10623, -11710, -10711, -9141, -8890, +-9355, -10679, -11605, -9878, -6730, -4504, -3048, -1635, -1284, -338, 73, 967, 3213, 5226, 5959, 4985, +4669, 5261, 4780, 3437, 2762, 3796, 4424, 4753, 5182, 6784, 9050, 9968, 9383, 6877, 4848, 4570, +2471, -88, -1041, -1841, -2015, -1040, -908, -2941, -3876, -4647, -5513, -5167, -2361, 444, 724, 768, +1373, 2956, 2571, 2873, 4778, 6247, 6831, 6524, 4801, 2492, 3037, 3315, 1, -3812, -6293, -9007, +-11145, -11269, -10564, -9250, -8574, -9654, -11492, -11380, -9796, -7213, -4782, -3576, -1883, -1427, -506, -842, +811, 3461, 5077, 5164, 4641, 5531, 5479, 4170, 3183, 3207, 3954, 3985, 4233, 5166, 6269, 9523, +10290, 8360, 6990, 6394, 4555, 2191, 965, -1274, -2176, -1214, -559, -1665, -2515, -3252, -5137, -5964, +-5217, -1433, -349, -179, 931, 2177, 2030, 1892, 3426, 4476, 5980, 7585, 6221, 3538, 3710, 4151, +2767, 87, -2719, -6066, -8923, -10793, -11630, -10347, -8807, -9107, -10021, -11646, -11538, -9998, -7283, -5664, +-3829, -2090, -1338, -1567, -1332, 1135, 3513, 4127, 4580, 5249, 5816, 5137, 3757, 3606, 3185, 3783, +4110, 3517, 4198, 7456, 9529, 8809, 8821, 7810, 6194, 4806, 3319, 560, -1594, -1289, -950, -969, +-1658, -1641, -3342, -5955, -6277, -3873, -2011, -1585, 156, 1463, 1437, 1642, 2374, 2456, 4542, 7167, +6967, 5171, 4365, 4496, 4031, 3328, 434, -2226, -5073, -8959, -10814, -11261, -9721, -9098, -8989, -10330, +-11842, -11498, -9762, -7913, -6265, -3761, -1674, -2261, -2394, -782, 1296, 2911, 3298, 5026, 5686, 5461, +5200, 4162, 3016, 3815, 4565, 2730, 3010, 5260, 7587, 8179, 9562, 9006, 7413, 7000, 5725, 3421, +250, -800, -705, -1161, -1326, -384, -1207, -4432, -6160, -4940, -4108, -3288, -955, 163, 722, 1822, +1598, 1126, 2601, 5586, 6537, 6487, 5148, 4611, 4932, 4466, 3068, 1180, -1124, -5161, -8787, -10517, +-10828, -9763, -8826, -9174, -10838, -11973, -10931, -10253, -9005, -6096, -3319, -2435, -3424, -2247, -301, 580, +1873, 3802, 4779, 5109, 6366, 4845, 3236, 3926, 4888, 2986, 2396, 3689, 5068, 6870, 8577, 9466, +8402, 7911, 7841, 6278, 2849, 920, 331, -1083, -1788, 77, 565, -2460, -4378, -4914, -5331, -4506, +-2896, -1299, -525, 1834, 1283, 660, 1124, 2975, 5601, 6480, 5830, 5117, 5409, 5030, 4167, 3706, +2205, -969, -4797, -8410, -10166, -10800, -9184, -8529, -10059, -10934, -11148, -11180, -11407, -9013, -5384, -3588, +-4052, -3003, -1672, -1418, 532, 2018, 3021, 4356, 6602, 5593, 3755, 4390, 4853, 3932, 2739, 2768, +3429, 4707, 6915, 8806, 8495, 8262, 8916, 8419, 5461, 3368, 2510, -262, -1976, -396, 891, -456, +-2238, -3781, -5432, -4915, -4562, -3623, -1603, 204, 1342, 887, 176, 808, 3539, 5685, 5597, 5594, +5839, 5387, 4770, 4414, 4622, 2383, -604, -4023, -8445, -10311, -9868, -8654, -9586, -10342, -10234, -10908, +-12759, -11711, -8086, -6089, -4947, -3759, -3056, -3018, -829, 332, 364, 2855, 5539, 5714, 4440, 4427, +4890, 4488, 3563, 2936, 2500, 2788, 4945, 7138, 7888, 7464, 9548, 9295, 7365, 6072, 5033, 1937, +-995, -770, -13, 745, -118, -2383, -3900, -4594, -5278, -5038, -3698, -1650, 235, 1412, 89, -623, +1509, 3769, 4927, 5064, 6145, 5926, 4841, 5000, 5128, 4553, 2934, 608, -4421, -8296, -9579, -8571, +-9398, -10308, -9046, -9732, -12299, -12869, -10533, -8906, -6611, -4447, -4376, -4008, -1752, -1077, -1228, 419, +3757, 5191, 4851, 4663, 5111, 4861, 4444, 3963, 2917, 1571, 3342, 5651, 6214, 6703, 8890, 9738, +8137, 8268, 7391, 4873, 1894, -419, -534, 860, 1002, -412, -1989, -3143, -4780, -5098, -5076, -4192, +-1191, 768, 775, -884, -202, 2176, 3110, 4304, 5738, 6101, 5368, 5327, 5149, 5160, 4884, 4475, +651, -4970, -7332, -7904, -9209, -10417, -8684, -8709, -11060, -12163, -12247, -11562, -8874, -6189, -5769, -5015, +-3227, -1778, -2567, -1716, 1000, 3532, 4410, 4450, 5239, 4774, 4737, 5187, 3866, 1549, 2171, 4262, +4372, 5319, 7713, 8609, 8751, 8771, 8634, 7967, 5060, 1607, -214, 578, 853, 741, 62, -1849, +-3023, -4378, -5145, -6013, -3832, -494, 523, -661, -656, 518, 1115, 2835, 4514, 5605, 5477, 5695, +5442, 4572, 5151, 6616, 4666, -542, -3852, -5532, -8713, -9827, -8872, -8653, -9591, -10477, -12346, -13006, +-11214, -8468, -7503, -6455, -4534, -2954, -2832, -3448, -1333, 972, 2706, 3990, 4851, 4468, 4565, 5972, +4932, 2443, 2354, 2730, 3212, 3984, 5552, 7413, 8210, 8451, 8618, 9780, 8316, 4290, 2085, 663, +678, 855, 1172, -83, -1635, -2478, -3901, -6484, -6029, -2603, -1006, -511, -749, -192, -303, 799, +3013, 4260, 4861, 5905, 6041, 4148, 4395, 7062, 6775, 3288, 748, -2292, -6444, -8337, -9007, -8884, +-8814, -8911, -10968, -13067, -12568, -10791, -9342, -8504, -6246, -4090, -3602, -3931, -3043, -1502, 128, 2640, +4331, 3445, 4447, 5843, 5469, 4164, 2942, 2559, 2367, 3160, 3395, 5816, 7394, 7126, 8094, 9761, +10216, 7571, 4883, 2589, 1058, 754, 1614, 1012, -301, -372, -1877, -4978, -6614, -4855, -2691, -1664, +-569, -266, -794, -603, 1421, 2677, 3386, 5707, 6637, 4307, 4034, 6284, 6879, 6112, 4356, 1813, +-2570, -5577, -7851, -9032, -8391, -8057, -9135, -11660, -12742, -11863, -11088, -10455, -8508, -5587, -4658, -4466, +-3342, -3648, -2310, 918, 2464, 3003, 3538, 5374, 5568, 5561, 4155, 3134, 2995, 2245, 2315, 4187, +6137, 6062, 6813, 8599, 10523, 9620, 7971, 5539, 2404, 1555, 1744, 1263, 566, 976, 446, -2594, +-5357, -5758, -4623, -3408, -1424, -364, -987, -1195, 369, 651, 1318, 4730, 6113, 4921, 4089, 5231, +5905, 6762, 6646, 4862, 1997, -1608, -5295, -7872, -8473, -7542, -7896, -9842, -11698, -11868, -11776, -12408, +-10363, -8185, -6439, -4862, -4155, -4544, -4348, -1424, 64, 1668, 2536, 3519, 5270, 5713, 4793, 4179, +3857, 2275, 1476, 2586, 4829, 4855, 5136, 7097, 8782, 9947, 10129, 8185, 4962, 3077, 2648, 1405, +678, 1492, 2000, -9, -2870, -4775, -5413, -5448, -2696, -1254, -1707, -709, -209, -814, -633, 2662, +4802, 4918, 4701, 4428, 4885, 6067, 6927, 6582, 5199, 2858, -1259, -5471, -7478, -7685, -6771, -8819, +-10073, -10671, -12001, -12626, -12029, -10746, -9007, -5888, -4976, -5173, -4934, -3855, -2052, 82, 992, 1805, +4243, 5198, 5112, 4789, 5112, 3605, 1338, 1876, 3454, 3919, 4101, 5317, 6651, 8506, 10563, 10140, +7610, 5361, 4437, 2468, 929, 1198, 2633, 1710, -26, -2122, -5030, -5899, -4172, -2899, -2730, -916, +24, -1431, -1663, 221, 2597, 4305, 4756, 4461, 4180, 5264, 6150, 6604, 7019, 5820, 3842, -1604, +-5367, -6346, -6566, -7668, -8641, -9188, -11175, -11841, -12289, -12839, -11363, -8201, -6467, -5454, -5517, -5380, +-3790, -1961, -797, 70, 2184, 4336, 4313, 4806, 5894, 5002, 2511, 1736, 2447, 3127, 3501, 4085, +4550, 6240, 9279, 10365, 9694, 7540, 6713, 4605, 1856, 1527, 2044, 2334, 2333, 795, -2917, -4917, +-4493, -4561, -4034, -1785, -516, -723, -1917, -1443, 82, 2557, 4389, 4066, 4317, 4331, 5432, 5847, +6443, 7573, 7240, 3174, -1658, -3781, -5841, -6726, -7114, -8084, -9842, -10263, -11559, -13059, -12923, -11196, +-8368, -6472, -6013, -6158, -5320, -3379, -2630, -1825, 306, 2566, 3069, 4133, 5784, 5996, 4285, 2756, +2074, 2405, 3364, 3342, 3419, 3950, 6845, 9402, 9637, 9505, 8780, 6783, 4261, 2726, 1589, 1795, +3596, 2929, -246, -2319, -3794, -4762, -5377, -3190, -1703, -812, -781, -2398, -1619, 214, 2711, 3784, +3685, 4106, 4953, 4877, 4953, 7256, 8654, 6511, 3217, -259, -4009, -5306, -5824, -7365, -8282, -9016, +-10134, -11802, -13314, -13166, -11206, -8281, -6854, -7024, -6313, -4643, -4250, -3572, -1733, 446, 1247, 2614, +4697, 5633, 5713, 4100, 2591, 2002, 2733, 3351, 2559, 2409, 4445, 6706, 8244, 9646, 10031, 8277, +6943, 5249, 1823, 1500, 3141, 3897, 1892, 461, -1512, -4163, -5012, -5096, -3265, -1758, -570, -1650, +-2515, -1944, 633, 2523, 2639, 3638, 4991, 4146, 3660, 5976, 7682, 8041, 7207, 3618, -369, -3104, +-4453, -5939, -7299, -7902, -8620, -10045, -12015, -13724, -13430, -10715, -8608, -7981, -7331, -5632, -5425, -5086, +-3334, -1887, -439, 697, 2574, 4601, 5740, 5526, 3848, 2250, 2589, 3228, 2607, 1852, 3101, 3909, +5906, 8838, 9354, 9427, 9127, 8030, 4090, 1947, 3081, 3349, 3392, 2706, 1084, -1510, -3768, -5148, +-4741, -3348, -1272, -702, -2214, -3018, -1047, 773, 932, 2955, 4699, 3862, 3493, 4296, 5833, 7684, +8715, 7271, 3766, 242, -2058, -4074, -5841, -6810, -7527, -7949, -9815, -12430, -13974, -12605, -10707, -9592, +-8072, -6854, -6200, -5810, -5007, -3486, -2120, -1130, 415, 2272, 4828, 5971, 5129, 3125, 3079, 3158, +2396, 2641, 2141, 2209, 3421, 6806, 7617, 8501, 10455, 9913, 6752, 4103, 3228, 2922, 3422, 3659, +3222, 1330, -1234, -3568, -5053, -5029, -2794, -447, -1969, -2910, -1520, -1270, -687, 1447, 3469, 3933, +3602, 3420, 4036, 5763, 8173, 8811, 7130, 4133, 949, -1345, -3825, -5643, -6744, -6597, -7406, -10461, +-12734, -13162, -12788, -11365, -9763, -8184, -7231, -6638, -6051, -5345, -3529, -2695, -1582, -631, 2439, 5583, +4915, 4519, 3981, 3285, 2429, 3264, 2689, 1026, 2165, 4699, 5234, 6663, 9760, 10739, 9321, 6689, +4901, 3486, 2998, 3646, 4205, 3465, 1458, -272, -3718, -5996, -3771, -1709, -2055, -2335, -1632, -1986, +-2016, -634, 1667, 3176, 3711, 3473, 2974, 3790, 6063, 8414, 8675, 7102, 4510, 1821, -619, -3858, +-5865, -5355, -5912, -7934, -10387, -12224, -13135, -12981, -11463, -10076, -8240, -7635, -6613, -6775, -5351, -3158, +-3501, -3027, -354, 3305, 4090, 4687, 5158, 3514, 2589, 3830, 3103, 1067, 1528, 2956, 3360, 4055, +7252, 9944, 10263, 8938, 7074, 5321, 3143, 3301, 4385, 3659, 3704, 3159, -962, -4755, -4474, -3077, +-2636, -2513, -1548, -1778, -2571, -2208, -594, 1490, 3014, 3663, 3003, 2485, 3849, 6343, 8455, 8511, +6739, 5650, 2812, -887, -3888, -4642, -4635, -6072, -7452, -10288, -11858, -13163, -12824, -11736, -10332, -8129, +-7551, -7881, -6664, -4093, -4275, -4844, -2657, 284, 1800, 4268, 5572, 3837, 3259, 4186, 3742, 1811, +1579, 2411, 2291, 2269, 3955, 7818, 9540, 9659, 9617, 7398, 4588, 4234, 4029, 3222, 4528, 5446, +2781, -1760, -3640, -3518, -3369, -2959, -1957, -1252, -2079, -2731, -2108, -679, 1429, 3251, 3351, 2668, +1949, 4163, 6883, 8035, 7697, 7985, 6537, 2548, -504, -3263, -3718, -4488, -5453, -7243, -10114, -11699, +-12613, -13257, -12273, -9437, -8365, -9122, -7903, -5025, -5287, -5587, -3975, -2959, -1178, 2426, 4831, 4094, +3516, 4626, 4286, 2818, 1845, 2580, 2446, 1036, 1927, 4876, 6722, 9102, 10679, 8929, 6879, 5833, +4524, 2811, 3748, 6023, 5471, 1982, -1330, -2713, -3465, -3845, -2628, -1650, -1589, -2108, -3096, -2049, +-1084, 1505, 3382, 3043, 1421, 2196, 4989, 6087, 7232, 8294, 8767, 6347, 2893, -178, -2478, -3668, +-3616, -4926, -7755, -9411, -10895, -13296, -13949, -10806, -9493, -10468, -8818, -6648, -6258, -6074, -4729, -4888, +-4425, -538, 2663, 3486, 3250, 4283, 5097, 3388, 2102, 3240, 2643, 1002, 1317, 2158, 3605, 6683, +9807, 9691, 8559, 7985, 6318, 3509, 2925, 5065, 6691, 4889, 2210, -259, -2373, -3553, -3649, -2053, +-1671, -1570, -2357, -2589, -2800, -1228, 2618, 2931, 1743, 1537, 3065, 4365, 5393, 7309, 9091, 8475, +6688, 3644, -115, -2256, -2368, -3086, -5697, -6857, -7941, -12116, -13905, -12024, -10929, -11442, -10013, -8119, +-7710, -6461, -5250, -5621, -6148, -4110, -74, 2038, 1946, 3770, 5417, 3794, 2862, 3553, 3098, 1846, +1541, 1136, 1026, 3556, 7267, 8650, 9159, 9043, 8782, 5381, 2841, 3992, 5710, 6306, 4706, 2879, +48, -2351, -3871, -2827, -2207, -2159, -1219, -2074, -3826, -3194, 123, 2103, 1781, 1356, 2277, 2680, +3441, 5500, 7470, 8652, 8822, 7506, 3162, -166, -426, -2141, -4176, -4278, -5275, -9440, -12440, -12093, +-12112, -12243, -11073, -9885, -9032, -7719, -6042, -5344, -7107, -6653, -2929, -776, 40, 2570, 4540, 4063, +3451, 3692, 3367, 2769, 2462, 1236, 383, 713, 4218, 6469, 7663, 9560, 9980, 8375, 4383, 3670, +4662, 6030, 5977, 5383, 3729, -31, -2404, -2572, -3037, -2636, -1025, -864, -3061, -4318, -1986, 551, +970, 1465, 2058, 2018, 1995, 3719, 5434, 6673, 9395, 9884, 6406, 3275, 2081, -539, -3051, -2362, +-2742, -6376, -9390, -10888, -12013, -12426, -12069, -10815, -10468, -9700, -6783, -5383, -7276, -7380, -5325, -3601, +-2417, 477, 3032, 3499, 4041, 3648, 3690, 3172, 3406, 2532, 597, -83, 1510, 3798, 4984, 7893, +10019, 10268, 7213, 4408, 4487, 4973, 5315, 6678, 6219, 3111, 313, -1405, -2835, -3669, -1708, -145, +-1979, -3994, -3386, -1489, -476, 515, 2037, 1488, 1307, 2630, 3054, 4037, 7716, 10092, 8325, 6475, +5326, 1585, -1415, -1358, -1394, -3182, -6415, -8678, -10410, -12344, -12443, -11233, -11896, -11655, -8565, -6139, +-7313, -7599, -6425, -6163, -4539, -2799, 715, 2086, 3276, 3894, 3416, 3245, 3726, 3837, 1617, 220, +425, 1473, 2417, 4350, 8193, 10642, 9069, 6640, 5547, 4179, 4391, 6082, 7198, 5630, 3358, 1522, +-1532, -3698, -2783, -437, -796, -3100, -3190, -2818, -2433, -498, 1107, 935, 1301, 2360, 1648, 1622, +5298, 8136, 8462, 8717, 7942, 4977, 1276, -621, -202, -1018, -3712, -5408, -8020, -11016, -11912, -11094, +-12434, -13173, -10570, -8135, -7315, -7901, -6891, -7044, -6569, -5356, -2517, -62, 1621, 3454, 3212, 2866, +3719, 4346, 3205, 1189, 442, 1121, 492, 944, 5055, 8585, 9542, 8738, 7301, 5203, 3638, 5135, +6631, 6427, 5784, 4679, 1604, -2571, -3189, -1170, -894, -1829, -2291, -3216, -3620, -1829, -260, -456, +1089, 2497, 952, 434, 2664, 5134, 7032, 8361, 9446, 8278, 4193, 1660, 572, 198, -1610, -2282, +-4899, -9001, -9986, -10569, -11750, -13530, -12511, -10245, -8527, -8111, -7398, -7031, -7596, -6878, -5460, -3131, +-459, 1960, 2627, 2669, 2943, 4361, 4422, 2142, 1534, 1574, 275, -846, 1258, 5335, 7609, 9271, +9243, 6825, 4525, 4355, 5696, 5944, 6263, 7338, 5156, 401, -2025, -1682, -1374, -1203, -883, -2761, +-3710, -2287, -1767, -1852, 442, 1998, 1455, 389, 806, 2945, 4364, 6525, 9055, 10248, 7117, 4759, +2802, 598, 188, -37, -1869, -5819, -7929, -8824, -10333, -12565, -13386, -11963, -10470, -9160, -7817, -7424, +-7542, -7373, -7436, -5906, -3354, -534, 1874, 1710, 2164, 3966, 4567, 3315, 2452, 2788, 1314, -751, +-595, 1409, 4494, 7507, 9758, 8906, 6009, 5061, 5319, 4728, 5533, 7903, 7874, 4115, 905, -1024, +-2046, -895, -223, -2233, -2623, -2563, -2777, -2749, -1585, 1115, 1417, 795, 155, 1511, 1934, 3422, +7231, 9449, 9083, 7650, 5542, 2275, 1126, 1357, 611, -2499, -5421, -6628, -8147, -10844, -12531, -12776, +-12348, -10577, -9209, -8050, -7399, -7699, -7617, -7921, -6578, -3233, -360, 435, 929, 2929, 4146, 3382, +3262, 3483, 2641, 724, -800, -644, 553, 4092, 8077, 9237, 7627, 6555, 5925, 4120, 4183, 6867, +8206, 7154, 4986, 827, -1188, -805, -302, -1268, -1855, -1748, -2751, -3093, -3142, -567, 998, 527, +838, 1029, 505, 1122, 4164, 7051, 8892, 9450, 8171, 5079, 2553, 2170, 2402, 276, -2619, -3978, +-5962, -8097, -10438, -12369, -12646, -12282, -10843, -9149, -8167, -7381, -7431, -8198, -8690, -6132, -2808, -1536, +-541, 1674, 3026, 3301, 3211, 3967, 3757, 2371, 947, -597, -1704, 394, 4787, 7645, 7906, 8196, +7556, 4415, 4229, 4928, 6689, 8603, 7919, 4282, 906, 108, -377, -590, -1377, -1069, -1443, -3163, +-3723, -1930, -568, -121, 1100, 1257, 278, 33, 1441, 3794, 6703, 9057, 9848, 7859, 4505, 3731, +3167, 2170, 387, -1900, -3466, -5195, -7964, -10199, -12032, -12694, -12289, -10948, -9513, -8096, -6899, -8008, +-9293, -8224, -5787, -3750, -2564, -344, 1699, 2410, 2715, 3694, 3981, 3589, 2897, 1293, -1801, -1978, +1518, 3704, 6714, 8432, 8391, 6527, 4868, 3908, 4425, 7749, 8941, 7302, 4136, 1772, 744, -295, +-1210, -431, -414, -2339, -3413, -2729, -2202, -1348, 409, 1245, 822, 28, -33, 1265, 3114, 6864, +9756, 9157, 7403, 5273, 4334, 3741, 2330, 590, -1136, -2675, -4736, -7491, -9759, -11796, -12303, -12297, +-11531, -9234, -7309, -7408, -8808, -9035, -7891, -6065, -4920, -2442, -419, 1135, 1957, 2856, 3518, 3442, +4776, 3129, 73, -1661, -1158, 267, 3557, 6795, 7824, 8461, 6821, 4147, 3304, 5396, 8115, 8898, +6775, 4605, 3000, 664, -759, -65, 264, -1210, -2026, -2808, -2928, -2531, -1186, 653, 1040, 313, +393, -478, 196, 3360, 7104, 9234, 8678, 7222, 5642, 4846, 3927, 2260, 996, -715, -2088, -4278, +-7340, -9554, -11042, -12500, -13109, -11282, -8758, -7417, -8424, -8638, -8979, -7843, -6999, -5094, -2439, -1410, +1093, 2056, 1921, 2942, 4916, 4523, 2434, 532, -1663, -1841, 495, 3105, 5825, 8307, 8510, 6184, +3353, 3342, 6229, 8138, 7782, 7015, 5771, 2491, 391, 210, 163, -44, -1081, -1720, -2665, -3593, +-2202, -783, -23, 1047, 937, -191, -1153, 170, 3527, 7074, 8918, 8307, 7328, 6198, 5376, 4094, +2600, 1129, 329, -1338, -4485, -6444, -8727, -10700, -13218, -12836, -10848, -8535, -8100, -8613, -8360, -9175, +-8394, -6893, -5337, -3886, -638, 932, 492, 1777, 3790, 4485, 4515, 2930, -66, -1673, -1562, -62, +2311, 5816, 8662, 8442, 4872, 2903, 4606, 6255, 7031, 8328, 7780, 5398, 2565, 1015, 811, -20, +23, -217, -2045, -3066, -2912, -2175, -1470, 185, 1490, 594, -760, -1530, 49, 3581, 6977, 8210, +8187, 7023, 6959, 5690, 3756, 2818, 1829, 1118, -1930, -3615, -5553, -8283, -11037, -13434, -12402, -10558, +-9085, -8259, -8144, -9281, -8923, -7885, -7905, -6321, -2857, -1024, -513, 634, 1656, 3408, 4909, 4707, +2514, -17, -1399, -1591, -965, 1564, 6597, 9183, 6571, 4489, 3940, 4318, 5630, 7222, 8835, 7685, +4995, 3350, 1582, 324, 502, 787, -644, -2186, -2389, -2954, -2655, -1412, 811, 1260, 585, -1401, +-1552, -68, 3685, 6899, 7595, 7700, 7649, 7706, 5031, 4169, 3621, 2561, 843, -1354, -2503, -4738, +-8080, -11430, -12483, -12411, -10894, -8506, -8316, -9283, -8385, -8337, -9380, -8237, -5690, -3436, -1759, -644, +-53, 1341, 3568, 5102, 4574, 2127, 362, -541, -2904, -2122, 2701, 6815, 7836, 6008, 4895, 4022, +3468, 5559, 7993, 8295, 7250, 5877, 3479, 1151, 921, 1292, 343, -691, -1365, -2631, -3006, -3176, +-750, 865, 1093, 443, -1779, -2007, -58, 4138, 5916, 6804, 8033, 8301, 6811, 5241, 4754, 4107, +2567, 462, -97, -1565, -4898, -7908, -10484, -13080, -12456, -9717, -9312, -9397, -8189, -8253, -9357, -9605, +-8110, -6078, -3803, -2157, -1227, -595, 854, 4236, 5054, 3408, 3004, 1489, -1752, -3921, -1560, 3417, +5841, 6886, 6557, 4958, 2793, 3878, 6162, 7337, 8011, 8115, 5884, 2977, 2021, 1432, 1226, 75, +54, -1203, -2898, -3358, -2854, -609, 516, 1669, -185, -2554, -2062, 814, 3187, 4947, 6996, 8302, +7999, 6284, 5858, 5634, 3955, 1953, 1987, 609, -1792, -3602, -7090, -11475, -12402, -11141, -10446, -9973, +-8610, -7928, -8569, -9612, -9695, -7836, -6636, -3915, -1905, -2608, -1204, 2057, 3788, 3887, 4074, 4334, +1088, -3126, -3551, -527, 2247, 5331, 7320, 6439, 3566, 3254, 4444, 5139, 7441, 8532, 8080, 5367, +3583, 2696, 1541, 924, 952, 542, -1552, -2782, -3127, -2825, -899, 1759, 1387, -1274, -2254, -1371, +584, 2319, 4845, 7510, 8204, 6894, 6994, 7129, 4914, 3781, 3373, 1779, 631, -17, -3121, -7971, +-10710, -11323, -11464, -10945, -9987, -8005, -8080, -9340, -9159, -9867, -8881, -6012, -3749, -3573, -3297, -416, +1868, 2360, 3684, 5876, 4216, -204, -2896, -2549, -1648, 1885, 6166, 6572, 5588, 3683, 3756, 3449, +5158, 7820, 8615, 7398, 5602, 4470, 2589, 1318, 1566, 1596, -90, -990, -2593, -3817, -2972, 245, +1759, 331, -1476, -1806, -1045, -582, 1771, 5827, 7003, 6684, 7806, 7726, 6217, 5407, 4832, 2714, +1979, 2477, 514, -3302, -7445, -9586, -10603, -12149, -10827, -8933, -8451, -8298, -8362, -9830, -10459, -8302, +-5436, -4871, -4973, -2286, -277, 150, 1664, 5391, 5986, 2945, 355, -2376, -3532, -1898, 2651, 5436, +5859, 5404, 4082, 2868, 3154, 5984, 7797, 7862, 7261, 6371, 3908, 2358, 2098, 1754, 1154, 592, +-1240, -3536, -3768, -1383, 1121, 669, -651, -653, -1554, -2294, 396, 3769, 5138, 6328, 7807, 7464, +6899, 6702, 5153, 3469, 2603, 3451, 2336, -1646, -4788, -7325, -10415, -11802, -10921, -9969, -9003, -7951, +-7940, -10291, -10746, -8296, -6496, -6727, -5232, -2129, -2275, -1436, 1660, 4937, 5403, 3803, 51, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-424, -408, -429, -415, -274, -100, 70, 187, 333, 388, 323, 312, 323, 284, 309, 357, +395, 552, 711, 860, 951, 997, 969, 894, 847, 763, 726, 651, 489, 400, 342, 185, +96, 20, -100, -301, -400, -587, -488, -1209, -1173, 301, -10, 107, -655, -803, -115, -733, +-2609, -1458, -1602, -1265, -339, -304, -1811, -2213, 1004, 2488, -51, -2323, -3301, -6829, -11129, -7727, +-4877, -5657, -3798, 2475, 4814, 11381, 5478, -3233, -10176, -7897, -4490, 2344, 6522, 8294, 10778, 16654, +20738, 15464, 17440, 14676, 15641, 19357, 6672, -1674, -3520, -2838, -6341, -8229, -11079, -19886, -15230, -7156, +-5618, -6835, -1736, 1406, -5027, -2987, -1616, -3892, -1511, 2753, 7907, 8780, 5573, -6458, -14166, -19623, +-20123, -18182, -17838, -12132, -8961, 230, 9103, 14530, 9949, 6969, -1823, -10455, -8521, -98, 7461, 3524, +14027, 20212, 14697, 16575, 8751, 13621, 21131, 23494, 19995, 8675, 3928, -1011, -3368, -4660, -14414, -19404, +-11084, -8483, -9507, -7924, -5334, -4816, -2844, -3717, -1813, -4396, -971, 5447, 18001, 20585, 14991, -154, +-13163, -17949, -23072, -21869, -16116, -12821, -13907, -2883, 9170, 12930, 14355, 9284, -2698, -20694, -15990, -8433, +-6273, 5984, 11658, 14929, 13934, 16963, 16095, 13849, 20338, 22077, 14441, 5932, 1781, -1886, -251, -8096, +-18991, -19810, -16699, -14594, -7971, -7428, -1744, -5286, -647, -553, 1873, -2974, 1957, 10191, 18777, 17915, +9943, 298, -7913, -14858, -23229, -23029, -17456, -16951, -12490, -5821, 7925, 9715, 15069, 12100, -8378, -15743, +-19255, -13196, -5332, 913, 7231, 12721, 17534, 17474, 16281, 19612, 23916, 22758, 22259, 15311, 10573, 12532, +11416, -3616, -12966, -18220, -14874, -14183, -5847, -5857, -1468, -5495, -2457, -3149, -2982, -9188, -7650, 2196, +12006, 16382, 12537, 5890, -3706, -15577, -21988, -25532, -19263, -21221, -14705, -1959, 3172, 17208, 20766, 12687, +269, -11283, -16869, -11914, -6892, -1850, 4925, 14354, 19644, 15327, 17149, 19957, 19495, 25904, 23059, 12271, +13791, 14338, 10828, -4835, -11766, -19913, -17590, -15649, -8687, -8509, -7153, -5501, -4092, -1558, -5326, -10743, +-12625, -2625, 8708, 10245, 12010, 6776, -1722, -18084, -23988, -22466, -29598, -24366, -19365, -13474, -1410, 11938, +14833, 8371, -1401, -11971, -19111, -13450, -9607, -8107, 1138, 15117, 15701, 17929, 19664, 20494, 27422, 29643, +24305, 15510, 18426, 19339, 13697, 589, -6134, -13595, -15411, -11353, -7345, -3127, -4987, -1866, -1025, -114, +-3054, -12821, -11053, -3931, 8013, 10484, 12801, 14593, -2741, -11654, -14525, -20263, -22636, -18225, -18266, -11105, +35, 14238, 16431, 12964, 2131, -11630, -17471, -12098, -15520, -8734, -438, 10154, 13804, 16344, 16691, 18052, +27801, 28406, 22494, 15573, 18172, 18010, 10239, 2339, -7990, -13063, -16843, -10456, -6208, -5302, -3505, -3622, +1102, -2146, -3893, -12745, -14723, -2753, -1485, 5841, 13241, 9576, -2033, -6344, -14149, -18035, -20094, -18880, +-20151, -13891, -4080, 9943, 12108, 13561, -3802, -10988, -16056, -17999, -17452, -11140, -3579, 7287, 16666, 17236, +18122, 23103, 31017, 30424, 23002, 21440, 20100, 20563, 13474, 5946, -5403, -16167, -16670, -15994, -7858, -9186, +-7191, -4345, -2819, 2982, -7273, -12772, -11816, -11758, -7172, 2990, 7427, 6910, -1281, -5712, -14115, -17150, +-19675, -20170, -23459, -14506, -10549, 8311, 15264, 10841, 894, -5106, -12463, -17320, -15137, -13715, -5179, 7253, +15831, 15482, 15800, 27029, 30799, 30988, 25194, 23170, 23860, 21236, 19729, 7640, -1041, -12043, -15555, -12725, +-9590, -4807, -6206, -1523, 6587, 3005, -4042, -5825, -10760, -12784, -5806, 2568, 6302, 6681, 91, -6495, +-15604, -13654, -22626, -23140, -24196, -23080, -13272, 5605, 14163, 9927, 5724, -2824, -10105, -14142, -14763, -13861, +-6804, 8881, 13040, 13970, 15988, 25985, 30494, 26499, 26738, 20188, 22032, 19945, 17020, 8399, -4344, -11837, +-18175, -18179, -9284, -11636, -9353, 433, 5389, 1390, 732, -2828, -8910, -10658, -3545, 3905, 6388, 12666, +3293, -3821, -7517, -12041, -18267, -20206, -23923, -25615, -11527, 2567, 11757, 10856, 6750, 1742, -8325, -10035, +-15999, -13677, -5051, 7410, 13924, 10454, 20386, 24467, 29750, 27574, 25556, 23039, 20253, 21056, 18609, 6509, +-76, -14409, -19971, -17649, -13694, -18003, -10623, -4668, 144, -1652, -1233, -5512, -16998, -13011, -10840, -4388, +4572, 6085, 1740, -3440, -7415, -13125, -14427, -20632, -26293, -25472, -14817, 1867, 8484, 12640, 7354, 2519, +-2747, -10467, -14481, -17138, -4475, 4022, 9853, 10138, 17768, 24886, 27504, 27960, 27824, 21010, 23843, 20894, +20093, 12021, 2282, -13585, -14676, -16456, -15909, -16639, -10564, -4206, -2882, 2460, 429, -4914, -10456, -13463, +-10707, -1810, 5878, 6664, 7305, 1251, -3746, -6974, -9501, -17033, -26870, -22572, -17025, -2385, 8332, 9278, +9335, 2562, 1263, -9326, -16308, -15044, -6388, 2762, 6305, 9605, 18885, 21816, 29777, 28749, 27489, 25237, +25835, 21258, 26002, 15975, 3072, -8068, -12309, -14049, -19250, -15186, -12520, -8506, -2061, 763, -845, -4183, +-9192, -17642, -10937, -4379, 823, 7267, 6145, 2528, -4746, -1764, -7229, -17377, -23944, -25843, -17226, -6231, +6261, 8771, 7336, 7989, 1990, -7720, -17322, -15803, -7123, -3518, 4309, 7273, 13252, 20740, 27951, 24617, +28395, 24876, 21995, 23701, 25082, 18739, 2551, -3677, -9741, -17625, -17617, -17120, -16718, -11216, -3596, -3195, +-201, -3807, -12979, -16830, -14427, -6446, -3783, 6635, 4584, -297, -1921, -1394, -4949, -15859, -23437, -24894, +-21144, -5896, 2467, 8301, 8128, 10553, 6125, -8108, -13947, -12820, -9980, -4070, 3668, 2940, 11965, 19644, +23766, 25737, 26864, 24625, 19600, 25655, 27098, 17357, 7404, 359, -8404, -15486, -15393, -18526, -15181, -10779, +-6422, 162, 35, 434, -11675, -12698, -13363, -8520, 89, 6244, 5383, 2648, 376, 3776, -3531, -9807, +-22474, -23833, -19581, -7658, 1731, 5970, 10711, 15211, 7516, -4347, -8111, -13829, -8438, -3344, -908, 3997, +10376, 18026, 20442, 26910, 26983, 20744, 21976, 26701, 26288, 18325, 11694, 1109, -6961, -12381, -18277, -17218, +-19142, -13325, -10523, -1294, -391, -2726, -8892, -14548, -16040, -10056, -2982, 4902, 1582, 4014, -363, 3804, +-616, -9754, -20364, -24847, -20303, -9781, -3311, 2004, 13195, 12515, 8721, -475, -10802, -11334, -9652, -6327, +-4889, 1495, 7976, 11580, 19665, 26031, 22608, 19238, 24088, 24091, 25485, 21605, 11574, 5485, -6268, -10733, +-17513, -17103, -17955, -18125, -9132, -2424, -1494, -250, -7416, -12378, -17744, -8362, -3418, 2553, 2902, 2586, +2987, 4827, 2601, -5849, -18930, -24204, -17596, -14639, -6505, 3054, 9250, 13862, 10072, 1061, -9671, -9713, +-8885, -11042, -5217, 252, 2468, 7755, 21003, 22101, 20228, 20545, 21760, 24910, 25450, 23527, 15230, 7755, +-255, -9998, -12467, -15061, -19024, -16185, -9718, -1709, -709, 2277, -3982, -11855, -15328, -9138, -3150, 1466, +2142, 2785, 3742, 5385, 7631, -5272, -17083, -18880, -19811, -15758, -8614, 1236, 8606, 14794, 13791, 1214, +-4620, -6359, -9188, -11883, -2194, -3844, -780, 8545, 16980, 20589, 18954, 19510, 21185, 22841, 27189, 21398, +19124, 9944, 755, -6617, -11780, -13630, -20687, -16626, -10959, -4589, -353, 2654, -2500, -11076, -14833, -9765, +-3531, -1207, 3247, 641, 1985, 9311, 6836, -3976, -14378, -18772, -21245, -19788, -11703, -6198, 5387, 12335, +10441, -1063, -2284, -10073, -12960, -10660, -8504, -8432, -4134, 3628, 14994, 15457, 18794, 16014, 20329, 22876, +23865, 23747, 19665, 12863, 2175, -3325, -9236, -14277, -18512, -17282, -13233, -6124, -495, 3247, -995, -11375, +-11538, -10382, -5077, 1325, 505, 81, 4906, 11393, 8818, -640, -8268, -16851, -18917, -18475, -13610, -8259, +7823, 10585, 10313, 5499, -888, -7723, -9375, -9102, -7691, -10287, -2564, 2432, 13256, 17128, 16916, 18072, +20770, 23095, 24505, 26610, 22658, 15138, 6569, 295, -7308, -12714, -16391, -17956, -14314, -9495, -13, 2998, +-2483, -7596, -13606, -11585, -4606, -751, -2924, -1684, 5894, 9730, 9479, 1703, -6490, -16480, -16444, -20652, +-19877, -7628, 2194, 7043, 9988, 5582, -526, -9180, -6146, -10543, -10221, -10438, -7445, 1705, 10160, 14848, +15432, 18053, 20415, 21596, 25282, 28542, 23869, 17568, 10557, 3095, -3779, -11106, -13579, -17313, -17676, -7361, +-1390, 2614, 7, -6221, -13495, -10410, -3324, -2561, -4432, -992, 5095, 8467, 11389, 4348, -7611, -10557, +-16615, -23824, -19828, -10975, -875, 3124, 10924, 5862, -1588, -5744, -7099, -9595, -11625, -12597, -9652, -858, +6918, 11391, 13274, 17015, 17504, 19665, 24529, 27027, 24979, 18007, 12854, 6013, -4790, -6457, -13242, -18871, +-18447, -9110, -3656, 3006, 732, -6553, -13260, -8127, -3349, -5156, -3604, -474, 2323, 12468, 11863, 4824, +-1337, -7228, -13958, -23687, -18332, -12476, -4680, 4858, 9702, 6857, 767, -3613, -5293, -7547, -11416, -13402, +-10840, -2323, 3783, 9439, 12915, 15133, 16337, 18414, 24078, 28245, 23555, 22370, 15437, 8231, -660, -2468, +-11910, -17200, -17388, -11705, -4249, 3857, 1033, -7306, -11466, -6641, -7347, -3990, -5625, -4987, 2975, 9606, +11026, 4547, 2168, -5505, -15376, -20849, -20887, -16521, -7248, 2053, 7660, 6727, 671, -2088, -4380, -6025, +-12019, -14290, -9964, -5625, 1945, 7902, 11344, 15109, 13170, 19141, 23352, 26171, 25167, 24413, 16012, 10859, +3867, -1422, -9701, -15496, -18431, -13881, -4067, 4804, -1931, -4838, -8871, -8670, -4255, -5025, -6547, -5678, +3664, 8591, 8076, 8337, 4556, -4335, -12303, -18730, -22376, -18472, -9392, -209, 6110, 6304, 1084, -1691, +-1452, -6175, -11155, -13943, -11578, -6626, -1821, 6756, 10415, 11611, 12955, 18881, 20525, 25306, 27308, 24147, +17645, 13336, 6500, -107, -7187, -13042, -22177, -14145, -3660, 443, -224, -5250, -8746, -8089, -3659, -5430, +-9994, -4924, 3017, 4600, 8623, 9718, 5802, -1467, -9367, -17294, -22677, -19858, -11507, -3100, 5621, 4071, +2260, 315, -270, -4572, -11161, -12503, -11814, -9967, -3180, 5698, 7959, 9489, 14090, 16547, 18954, 25964, +28116, 24744, 19513, 18235, 7419, 4399, -1716, -14584, -19747, -14228, -4924, -622, 548, -4296, -8840, -5790, +-2172, -7878, -8939, -4324, 395, 3823, 8173, 10411, 7719, 812, -5241, -16269, -20662, -21884, -12941, -3780, +3188, 3390, 2633, 1859, 1378, -4545, -9405, -10882, -13306, -12164, -3510, 2386, 5101, 9435, 12500, 14052, +16925, 26491, 25481, 25235, 23518, 15873, 11457, 8194, -101, -13464, -18469, -14452, -7452, -937, 255, -6168, +-7017, -4171, -3688, -8065, -8356, -5414, -1328, 1898, 8175, 9364, 10434, 2706, -2563, -13119, -20627, -22317, +-15053, -5984, 717, 1334, 2312, 3181, 1013, -4269, -6276, -11439, -14859, -12551, -6353, -570, 2455, 9244, +8687, 11501, 18494, 21415, 25863, 26987, 22220, 17390, 14627, 11093, 1098, -11721, -16688, -17046, -8093, -1090, +-3322, -6583, -5830, -4727, -4791, -8931, -8168, -8150, -2992, -11, 5938, 9183, 10188, 5326, -459, -10699, +-19357, -22876, -15710, -7434, -1950, -640, 3945, 3093, 533, -1238, -5044, -10759, -14904, -11024, -9512, -3233, +4234, 5402, 7456, 11590, 15338, 20160, 26510, 27355, 22431, 19346, 19141, 13115, 4306, -6448, -16742, -15438, +-6975, -2307, -3666, -5518, -3240, -4451, -3821, -6769, -7618, -7695, -3810, -541, 5090, 9242, 11324, 8044, +2767, -7382, -17342, -23047, -15293, -9768, -5833, -304, 2302, 2730, 392, 1803, -4311, -10932, -11442, -13549, +-11262, -3322, 1214, 3823, 6696, 10128, 12381, 18953, 27096, 26081, 21752, 22908, 19418, 16105, 8254, -4942, +-15486, -14828, -6580, -4891, -4736, -4849, -3688, -3915, -4218, -6066, -7620, -8293, -5083, -2197, 3418, 7885, +11416, 9091, 6117, -5098, -17306, -19887, -16534, -12216, -8552, -881, 977, 180, 3029, 1537, -4932, -7386, +-12332, -14477, -11984, -5462, -1876, 2036, 5895, 7104, 8616, 19473, 23786, 24209, 22692, 22182, 20399, 18643, +11053, -3730, -14086, -13484, -7934, -6310, -6158, -5181, -3871, -4277, -4216, -5727, -7385, -9031, -6046, -3976, +2129, 6276, 9837, 12184, 7740, -2637, -15363, -17151, -17181, -15132, -8059, -3213, -1924, 2126, 2317, 1466, +-2097, -6130, -12206, -14334, -12004, -7605, -4469, 3712, 2827, 4342, 9093, 17593, 22483, 24261, 23553, 22298, +23104, 22790, 13865, -461, -10197, -10503, -7723, -6153, -5612, -4539, -2394, -3897, -2471, -4852, -6096, -7420, +-7901, -2907, 595, 5043, 10100, 14687, 10020, -1245, -9493, -15001, -18379, -13355, -9455, -5542, -1288, 1881, +2237, 2833, 539, -4413, -11882, -11149, -13432, -10325, -3452, 1677, 735, 2465, 8021, 14798, 20391, 23837, +21421, 21461, 24484, 24489, 15248, 1670, -7701, -10065, -8365, -7984, -5982, -6096, -3911, -3569, -4438, -4087, +-6552, -8863, -8849, -4897, -2584, 555, 9881, 14176, 8329, 2066, -7498, -16001, -17820, -15521, -12613, -8324, +-3515, -628, -805, 3718, 310, -5610, -9276, -11655, -15669, -11607, -4289, -1204, -1518, 1511, 5301, 12206, +19070, 22642, 19665, 21302, 26527, 25509, 17575, 3983, -3738, -8904, -8501, -6915, -7195, -5750, -4143, -3729, +-3434, -3142, -5143, -9378, -6860, -4989, -5560, 1196, 10608, 12920, 12045, 5184, -4315, -12924, -15679, -14450, +-14527, -7432, -4465, -2862, 1378, 4193, 464, -2903, -6259, -11727, -15518, -10621, -5332, -2448, -2081, 583, +3155, 10689, 19576, 20265, 19254, 21154, 28349, 27349, 19362, 8913, -770, -6626, -6987, -6950, -6565, -5823, +-3398, -4364, -1816, -2125, -5965, -7403, -5303, -7793, -5750, 92, 8063, 12656, 12932, 8230, -2955, -9473, +-14317, -16479, -13287, -9293, -7654, -3542, 1069, 2466, 594, -423, -5813, -11933, -15076, -11302, -7551, -4335, +-2501, -3127, 1424, 8580, 17316, 17296, 16639, 21206, 27227, 27213, 21375, 10562, 1473, -5387, -6202, -8085, +-6643, -5886, -6360, -4336, -1028, -4804, -5274, -5819, -6861, -9094, -7437, -1721, 5055, 12285, 13636, 7672, +262, -7512, -14790, -15632, -13093, -12002, -9810, -3861, -1256, 930, 1598, 1200, -4945, -11811, -13263, -13164, +-7748, -4787, -3987, -4931, -601, 8324, 14797, 15206, 16354, 20793, 27501, 28500, 24127, 13595, 5196, -1024, +-5649, -6342, -3858, -8030, -5289, -2212, -1794, -3815, -4012, -3771, -7210, -8550, -7155, -4567, 4328, 12021, +12964, 10046, 4142, -5498, -12840, -13037, -13631, -13270, -10265, -4682, -2580, -370, 3565, 1421, -3551, -9701, +-13177, -12984, -8603, -4536, -6071, -6869, -1190, 6970, 12278, 13331, 15298, 19011, 26690, 29588, 24489, 15991, +9568, -910, -4330, -4221, -5675, -7906, -5190, -2105, -3341, -4115, -2169, -4419, -6203, -8115, -9484, -6029, +3059, 9520, 12088, 12665, 5494, -3474, -10473, -11688, -14208, -14505, -9703, -7173, -4804, -498, 2652, 2417, +-3083, -8006, -13192, -13623, -8208, -5846, -7946, -8030, -2171, 4903, 9667, 12127, 12906, 17229, 27114, 28092, +25803, 19998, 10893, 1538, -1767, -2913, -6282, -8049, -4242, -3941, -3798, -3117, -2803, -3353, -4977, -8193, +-10850, -5843, 90, 7591, 12479, 13633, 7123, -1351, -6392, -10746, -14239, -13140, -11056, -8571, -6377, -933, +2338, 2940, -540, -6691, -12869, -12500, -7795, -6667, -9335, -8349, -3480, 2188, 9312, 9204, 11104, 17651, +24179, 27488, 27545, 22322, 12643, 4161, 1589, -2928, -6323, -6006, -5073, -4350, -3369, -3339, -3194, -1136, +-5097, -8186, -10218, -7146, -2256, 5030, 12714, 13272, 7485, 2321, -4785, -9899, -13640, -12956, -12258, -10563, +-7618, -2755, 864, 3309, 537, -6738, -12709, -11398, -8144, -8715, -9226, -10508, -5973, 2199, 5893, 6744, +9788, 15632, 21544, 26595, 29530, 22931, 14256, 8379, 3061, -2178, -4799, -5522, -5994, -3283, -4622, -4034, +-1963, -788, -4207, -8440, -9262, -8903, -5337, 4854, 11268, 12728, 9496, 5108, -2559, -8836, -11850, -12180, +-12997, -11132, -8675, -4698, -85, 4532, 1489, -6987, -10324, -10654, -8977, -7317, -10701, -11593, -5795, 730, +3669, 5025, 9619, 12927, 19110, 27492, 29299, 23509, 17321, 11584, 4261, 235, -3766, -5361, -4666, -4041, +-4484, -4348, -813, -365, -4285, -6119, -9393, -10550, -6213, 3257, 9274, 11820, 10883, 7232, -1181, -6688, +-10222, -11969, -13272, -11580, -10291, -7711, 261, 4494, 321, -5025, -9967, -10823, -7840, -8059, -11957, -12625, +-6130, -1644, 1080, 4342, 7473, 9509, 17958, 26739, 27650, 25198, 19711, 13337, 7277, 1100, -2531, -4658, +-3995, -4290, -6048, -3562, -1198, -1083, -2779, -4929, -9650, -11409, -7290, 1216, 6799, 11276, 11870, 8491, +808, -4426, -8293, -11906, -11623, -11753, -12927, -7502, -557, 3436, 1845, -4397, -8815, -9760, -6092, -8795, +-12580, -11569, -6903, -4018, 622, 4147, 4180, 8531, 17137, 24427, 27999, 25655, 22032, 15831, 9629, 3313, +-1859, -2415, -3246, -5289, -5308, -3265, -1713, -589, -1503, -4038, -9792, -11274, -7816, -1224, 4845, 10584, +12500, 8791, 3332, -2206, -8041, -9572, -10546, -13685, -13446, -9257, -1804, 2685, 2485, -4648, -8676, -7473, +-6341, -10296, -12255, -11216, -9823, -5014, 87, 813, 2493, 6273, 14791, 21947, 26502, 26180, 22479, 18178, +11491, 3713, 38, -1081, -3646, -5530, -5307, -3684, -2625, -286, -298, -3785, -9256, -11140, -8304, -4140, +3306, 9963, 11137, 10429, 5525, -1730, -5729, -7673, -10201, -14099, -13816, -11013, -3510, 3081, 1976, -5098, +-7037, -5528, -7618, -9800, -10871, -13186, -10383, -5883, -1346, -866, 407, 4986, 11944, 20039, 25619, 25256, +24155, 20313, 12709, 5773, 2437, 282, -3354, -4970, -4714, -4419, -2926, 217, 1024, -3629, -8302, -9608, +-10425, -5133, 2163, 7660, 11685, 11757, 6808, -39, -2945, -5812, -9411, -12799, -14501, -12502, -3941, 3211, +145, -4242, -4319, -6024, -6678, -8691, -10721, -13456, -11366, -6014, -2746, -2316, -454, 2369, 9940, 18174, +23161, 25276, 25681, 21869, 14365, 8171, 4627, 1360, -2626, -3880, -4410, -5406, -3321, 1451, 348, -2421, +-6359, -10152, -10558, -6660, -579, 5488, 11507, 12131, 7264, 2242, -1223, -4446, -7850, -11646, -16348, -13544, +-3563, 401, -298, -3335, -4164, -5467, -6327, -7625, -11091, -14043, -11192, -7522, -3962, -3195, -3008, 545, +7920, 15503, 20585, 25030, 26202, 22321, 15674, 10409, 6564, 2086, -1598, -2189, -5586, -5578, -2551, 408, +821, -1202, -5552, -9717, -10237, -7891, -3071, 4632, 10866, 11753, 8095, 4385, -105, -2656, -4638, -12430, +-16521, -12848, -5354, -876, -895, -2636, -3806, -5105, -4714, -7171, -10944, -13057, -12078, -8047, -4639, -4557, +-4675, -540, 5830, 12136, 18658, 24516, 26257, 22933, 17264, 13547, 7162, 3462, 1111, -2445, -5406, -5219, +-3007, -442, 1310, -287, -5114, -8280, -9976, -9451, -5222, 3659, 9092, 10979, 10128, 4402, 1430, 804, +-3854, -11823, -16071, -12815, -6758, -2903, -1017, -2752, -4129, -3799, -4341, -6857, -10324, -13326, -12623, -8104, +-5476, -6095, -5491, -1753, 3342, 9264, 16555, 24457, 25168, 23224, 20191, 14358, 8735, 5882, 2739, -1755, +-4557, -4700, -3970, -123, 1793, 271, -3987, -6330, -9981, -10958, -5270, 1230, 7542, 11879, 9497, 5262, +3688, 3131, -2318, -11280, -14456, -12909, -8377, -3382, -1827, -3081, -3454, -3274, -3798, -5969, -9907, -13579, +-12256, -8481, -6753, -7269, -6605, -2471, 164, 6051, 15499, 21787, 23694, 24089, 21092, 15149, 10554, 8079, +3284, -721, -4041, -5195, -4504, -100, 1283, -263, -1798, -5902, -10619, -10555, -7553, -1076, 6584, 10626, +8803, 5288, 5926, 4774, -1709, -9476, -13608, -13543, -9139, -4762, -2980, -3412, -3497, -3446, -2945, -5217, +-9840, -13110, -12380, -8436, -8261, -8311, -5951, -4711, -2570, 4426, 13125, 19176, 23150, 24849, 21288, 16759, +12569, 9645, 4759, 1193, -3023, -5686, -3217, -618, 339, 1590, -830, -4960, -8986, -10908, -8660, -2657, +6055, 9594, 7809, 6851, 7852, 5982, 430, -7320, -12466, -12919, -9376, -5873, -3401, -3607, -3796, -2552, +-2313, -3961, -9446, -12679, -10571, -9452, -8888, -7496, -6330, -6436, -3994, 3102, 10118, 17457, 22652, 24485, +21675, 18337, 14507, 10357, 7529, 2563, -3298, -4212, -3505, -1719, 840, 1721, 86, -4004, -7827, -11144, +-10650, -3359, 4822, 7287, 7204, 7455, 8403, 7142, 2173, -5932, -11243, -12711, -10380, -6681, -4797, -4342, +-4490, -3057, -966, -4521, -9593, -11423, -10816, -10825, -9471, -7384, -7974, -8017, -5277, 199, 6799, 15068, +21288, 22627, 22337, 19284, 14465, 12761, 8889, 2904, -1781, -3860, -3824, -2425, 510, 1730, 92, -2339, +-6779, -12161, -11330, -4193, 2705, 5361, 6605, 7254, 9187, 8440, 3629, -3534, -10034, -11890, -10415, -7863, +-4784, -5590, -5115, -2100, -672, -4605, -8434, -9757, -11384, -11225, -9020, -7740, -8772, -8636, -6221, -2860, +4512, 13438, 18523, 22752, 22646, 19232, 16632, 14499, 10616, 4759, -38, -2684, -4057, -2345, 566, 1217, +1464, -173, -5982, -12022, -11095, -5350, 1159, 4098, 5431, 7827, 9525, 9633, 6101, -1935, -7432, -11062, +-10368, -7262, -5608, -6657, -4995, -1126, -1212, -4141, -6765, -9165, -11549, -11011, -8580, -8632, -8902, -8363, +-8458, -4110, 2645, 10073, 17396, 21839, 22046, 19848, 18052, 16216, 11781, 6620, 1910, -2352, -3600, -1951, +-366, 939, 2898, 798, -5204, -11253, -11364, -5710, -698, 2335, 4971, 6715, 10027, 10364, 7117, 617, +-6062, -10375, -9719, -6875, -7158, -7454, -4480, -1609, -1630, -3338, -5337, -9133, -11313, -10075, -9701, -8352, +-8450, -9847, -9014, -5766, -377, 7534, 15608, 20482, 20862, 20246, 19266, 16772, 13140, 8723, 2931, -1804, +-2461, -2482, -1599, 1126, 3188, 2018, -4826, -10890, -10694, -7256, -1997, 770, 2970, 6163, 9523, 10441, +8310, 2638, -5293, -9535, -8464, -7684, -8516, -7940, -4660, -2765, -2287, -2152, -5642, -8666, -10284, -11024, +-9547, -8288, -9260, -10082, -9766, -7543, -3109, 5222, 13787, 18316, 19882, 20769, 19707, 17548, 15312, 10284, +3828, 319, -1863, -2372, -2063, 957, 4733, 2415, -3394, -9282, -10621, -7331, -3116, -710, 1876, 5713, +8751, 10871, 10549, 4380, -3505, -7301, -6927, -8044, -9150, -7178, -5861, -3593, -1383, -2306, -4643, -7246, +-10146, -10667, -9431, -8330, -9342, -9993, -10059, -9430, -5697, 2866, 10962, 15728, 19162, 20386, 19376, 19098, +16379, 11781, 5795, 1588, -287, -3315, -2761, 1178, 4382, 3226, -2315, -8294, -10279, -7783, -4703, -2508, +796, 3837, 7422, 11100, 11556, 5236, -2214, -4514, -6680, -8499, -8381, -8201, -6615, -3753, -2108, -2047, +-4054, -6781, -9863, -10349, -9251, -8832, -9397, -9651, -10772, -11271, -7124, 735, 7758, 14319, 17616, 19285, +19728, 19400, 18040, 12530, 7283, 3976, 80, -3352, -2906, 960, 4515, 3909, -1379, -7360, -9195, -8175, +-5850, -3286, -484, 2018, 6225, 12072, 11581, 5657, 701, -3186, -5984, -7357, -8441, -8337, -6868, -4311, +-2403, -1702, -3145, -6265, -9132, -9606, -9242, -9207, -8625, -9083, -11866, -11437, -8520, -1895, 5872, 11902, +16590, 18137, 19584, 20720, 18316, 13679, 9537, 5735, 894, -2899, -3059, 685, 4997, 4272, -464, -5761, +-8091, -8182, -6657, -3258, -2061, -65, 6688, 11529, 11203, 7410, 2426, -1548, -4590, -6605, -8136, -8375, +-7134, -5110, -2725, -1417, -2734, -6009, -8214, -8873, -10105, -8547, -8073, -9411, -11492, -12705, -9702, -4188, +3204, 10484, 14158, 16821, 19729, 20711, 18551, 15039, 11545, 7178, 2236, -2623, -3186, 758, 4970, 4552, +100, -3838, -7361, -8818, -5659, -4300, -4204, -570, 5739, 10525, 11266, 8423, 3984, -33, -3064, -5866, +-7708, -8174, -7494, -5899, -2990, -1008, -3356, -5125, -7287, -9251, -9597, -8806, -7648, -9244, -12046, -12712, +-11441, -6458, 1408, 7964, 11783, 15676, 19412, 20195, 18908, 16087, 13173, 9009, 3314, -2016, -3355, 930, +4687, 3904, 1952, -2804, -7415, -7623, -5742, -5666, -5404, -1691, 4425, 9318, 11063, 8849, 5242, 1498, +-1774, -4975, -7261, -7627, -8688, -6192, -3099, -2218, -2622, -4711, -6761, -9020, -10069, -8276, -7655, -9219, +-11458, -13314, -13098, -8091, -524, 4977, 9686, 14384, 18418, 19655, 18654, 17038, 14446, 10790, 4643, -2136, +-2454, 543, 3274, 4848, 2843, -2515, -6447, -6687, -5845, -6677, -6267, -3011, 2932, 8056, 10430, 9299, +6190, 3447, -921, -3616, -5792, -8338, -8268, -6474, -3716, -2148, -2740, -3589, -6228, -9024, -9264, -7943, +-7434, -8289, -10637, -13771, -13588, -8943, -2501, 2900, 7809, 13426, 17402, 19316, 19093, 17423, 16825, 12837, +5321, -145, -1571, -93, 3407, 5703, 3588, -1802, -4852, -5562, -5675, -7012, -6921, -3875, 1330, 7218, +9333, 9630, 7890, 3900, 883, -2191, -5219, -7519, -8463, -6451, -4339, -2987, -2163, -3023, -6147, -8603, +-8860, -8292, -7187, -7536, -10581, -13855, -14147, -9921, -4874, 326, 5992, 11151, 16539, 18478, 17784, 18535, +18202, 13507, 6735, 1194, -1507, -946, 3540, 5708, 3552, -1060, -3808, -4584, -5995, -6903, -7908, -5257, +527, 4894, 8593, 9737, 7942, 5262, 1974, -676, -4171, -7353, -7931, -6627, -5280, -3185, -1631, -2951, +-5777, -7845, -8978, -8231, -6769, -6702, -10397, -13995, -13833, -11524, -6725, -1631, 3107, 9909, 15196, 16463, +17378, 19149, 18964, 14444, 8808, 2462, -1400, -840, 3338, 5822, 3290, 219, -2670, -4050, -4848, -7500, +-8088, -5596, -1351, 3824, 7542, 9574, 8660, 6020, 3676, 955, -3344, -6329, -7014, -7028, -5669, -3011, +-1648, -2443, -5161, -7092, -8764, -8146, -5585, -6606, -9932, -12955, -14363, -11862, -8070, -4302, 1502, 8518, +13352, 14707, 17262, 19274, 19249, 16198, 10585, 4014, -1336, -271, 3415, 5135, 4236, 606, -1499, -2593, +-4848, -6940, -8245, -6488, -2545, 2034, 6627, 9178, 8524, 6844, 5333, 1951, -2238, -4804, -6673, -7142, +-6035, -3172, -1842, -2635, -4052, -7202, -9103, -7476, -6136, -6268, -9201, -13068, -14064, -12595, -10129, -6977, +-167, 6368, 10511, 13390, 16187, 18904, 19009, 17523, 12366, 4441, -18, -270, 2885, 5188, 3743, 1368, +-447, -2053, -4106, -6860, -8282, -7067, -4182, 456, 5762, 8161, 8181, 7918, 6163, 3074, -868, -3560, +-6062, -7452, -5682, -3679, -2430, -1531, -4015, -7038, -8460, -7672, -5695, -5795, -8761, -12695, -13176, -13025, +-12216, -8287, -2039, 4403, 8266, 11978, 15392, 17334, 19772, 18672, 13480, 6245, 552, 269, 3053, 4617, +4014, 2026, 501, -915, -3498, -6322, -7586, -7713, -5390, -86, 4323, 7166, 8216, 8650, 7229, 3903, +1161, -2273, -5865, -6227, -6044, -4256, -1953, -1583, -3449, -6688, -8168, -7749, -5206, -5424, -8861, -11375, +-12708, -13495, -13438, -9634, -3398, 1461, 6733, 10574, 13497, 17030, 19621, 19668, 15079, 7296, 1950, 978, +2991, 4644, 4114, 2568, 1712, -162, -2915, -4934, -7324, -8084, -5959, -1246, 3055, 5738, 8334, 9055, +7136, 5810, 2390, -1522, -4356, -6158, -6155, -4701, -1903, -1574, -3116, -6259, -8549, -7080, -5211, -5634, +-8462, -10465, -11851, -14527, -14209, -10880, -6066, -373, 4590, 8550, 11900, 15404, 19273, 20139, 15789, 8591, +3075, 1338, 3091, 4146, 3557, 3480, 2256, 338, -1793, -4247, -6939, -8634, -6262, -2109, 885, 5389, +7774, 8399, 8279, 6587, 3671, -214, -2931, -5626, -6204, -4531, -2471, -912, -2797, -6130, -8051, -6778, +-4834, -6098, -7437, -8890, -11831, -14104, -14534, -12094, -7424, -2286, 3007, 6939, 10029, 14301, 19139, 20424, +17080, 10218, 4166, 2652, 3130, 3676, 4102, 3854, 2953, 952, -595, -2860, -7225, -7797, -6495, -3986, +254, 4141, 6926, 8068, 8723, 7367, 4614, 1600, -2231, -4739, -6016, -4792, -2341, -981, -2439, -6361, +-7492, -6057, -5769, -5936, -6703, -8452, -11052, -14002, -14874, -13159, -9314, -4187, 1184, 4500, 8085, 12938, +17930, 20598, 17627, 11088, 5779, 3383, 3247, 3405, 4096, 4497, 2460, 2313, 771, -2825, -5836, -7443, +-6979, -4918, -757, 2993, 5804, 8295, 8623, 8061, 5780, 2858, -709, -4026, -5421, -5046, -2163, -256, +-2787, -5721, -6459, -6173, -5775, -5787, -5978, -7528, -10381, -13512, -14659, -14234, -10771, -5312, -819, 2743, +6249, 11043, 17298, 20285, 18242, 12532, 7186, 4840, 2609, 3836, 4700, 3738, 3510, 3133, 1457, -2002, +-4843, -6987, -7590, -5074, -2087, 1670, 4909, 7464, 8684, 8196, 6936, 3947, 300, -2891, -5781, -5036, +-1738, -830, -2785, -5185, -6158, -6281, -6157, -5848, -5400, -7195, -9906, -12600, -15109, -15060, -11833, -7308, +-2540, 471, 3878, 9318, 15613, 20131, 17745, 13624, 9087, 4610, 3437, 3974, 4187, 3629, 4042, 3696, +1608, -711, -4133, -6630, -7360, -5865, -3095, 146, 4052, 6708, 8088, 8771, 7266, 5097, 2053, -2417, +-5428, -4485, -1726, -1073, -2652, -4715, -5491, -6367, -6417, -5276, -5362, -6651, -8572, -12060, -14583, -15462, +-12888, -8345, -4559, -763, 1568, 7548, 15010, 18262, 18374, 14957, 10060, 5581, 4292, 4278, 3599, 4134, +4325, 3960, 2619, 144, -3085, -6151, -7007, -6218, -4290, -501, 2827, 5794, 8039, 8448, 7828, 6647, +3321, -1672, -4587, -3918, -1571, -1228, -2522, -3779, -5259, -6526, -5848, -5580, -5068, -5899, -7825, -10905, +-14730, -15200, -13763, -9655, -5178, -3579, -17, 6177, 13057, 17268, 18646, 16115, 10750, 7081, 5069, 4081, +3888, 4237, 4600, 4257, 3335, 1084, -2448, -4927, -6641, -6647, -4707, -1769, 1497, 5083, 7263, 7957, +8634, 7706, 4323, -910, -3972, -3193, -1665, -1656, -1669, -3716, -5120, -6182, -6185, -5336, -5523, -5000, +-7044, -10549, -13373, -16080, -14242, -10147, -7006, -5459, -1756, 4371, 10451, 16283, 18568, 16226, 11924, 8181, +5742, 4139, 3944, 4343, 4265, 4837, 3910, 1645, -1180, -4116, -6270, -6488, -5288, -3033, 798, 4134, +6304, 7709, 9110, 8935, 5366, -222, -2267, -2741, -1698, -1006, -1574, -2656, -4967, -5427, -5957, -6041, +-4387, -5036, -6225, -8995, -13186, -15955, -14328, -10661, -8917, -6777, -3146, 1826, 8496, 14953, 17909, 16330, +12967, 9459, 6023, 4626, 4006, 3895, 4465, 5005, 4199, 2518, -228, -3491, -5489, -6398, -6029, -3717, +-200, 2995, 5210, 6718, 9766, 9386, 5790, 1428, -1785, -2009, -1929, -639, -1114, -3022, -3666, -5478, +-6127, -5555, -4868, -4824, -5282, -7894, -13135, -15519, -14058, -12024, -10139, -7966, -5009, -554, 6493, 13502, +16533, 16465, 13839, 10140, 6927, 5185, 3940, 3965, 4559, 4907, 4702, 3314, 445, -2235, -4634, -6226, +-6084, -4695, -616, 1855, 3648, 7069, 9437, 10084, 6450, 2748, -278, -2181, -870, -632, -1116, -1944, +-3514, -5313, -5904, -5460, -5441, -4360, -4087, -7769, -12461, -14718, -14200, -12917, -11061, -8944, -7241, -2511, +4519, 11300, 15316, 16488, 14202, 11062, 7935, 5558, 4175, 4165, 4428, 5227, 5149, 3676, 1733, -1428, +-3488, -5724, -6816, -4238, -1817, 758, 2483, 6273, 9774, 9509, 7867, 3777, 94, -933, -718, -644, +-621, -1310, -3391, -4819, -5282, -6165, -5669, -3682, -3598, -7346, -11552, -13701, -14537, -13162, -11506, -10318, +-8819, -4096, 2252, 9208, 14222, 16036, 14582, 12131, 8705, 6201, 4686, 3900, 4837, 5113, 5588, 4576, +2012, 415, -2888, -5219, -6471, -4582, -1961, -1074, 2052, 5704, 8782, 10238, 8572, 4649, 1327, 33, +-685, -392, 249, -1168, -2820, -3836, -5232, -6645, -5574, -3077, -3637, -6460, -10186, -13206, -14442, -13053, +-12101, -11410, -9809, -5753, -32, 7309, 12702, 15262, 15235, 12534, 10020, 6728, 4952, 4542, 4206, 5746, +5487, 4929, 3300, 1169, -1589, -5439, -5719, -4326, -3365, -1661, 1007, 4411, 8197, 10351, 8716, 5354, +2759, 307, -463, 204, 361, -1129, -2079, -3078, -5660, -6762, -5199, -3321, -3643, -5480, -9371, -12807, +-13838, -13052, -12787, -12092, -10921, -7928, -1832, 4745, 11276, 14239, 14806, 13604, 10120, 7875, 5186, 4364, +4604, 5249, 5883, 4619, 4262, 2512, -1562, -4410, -5072, -4835, -3995, -2339, -313, 3145, 7902, 9648, +8875, 6425, 3615, 656, 203, 861, 52, -704, -1010, -2903, -5720, -6408, -5273, -3720, -3198, -4675, +-8794, -11865, -12998, -13429, -12614, -12925, -11705, -9327, -4187, 3223, 8805, 13606, 14662, 13681, 11375, 8289, +6190, 4245, 4772, 5693, 5081, 5300, 5416, 2932, -766, -3320, -4528, -5033, -3854, -3429, -1581, 2332, +7007, 8821, 9231, 7545, 3991, 1368, 1193, 860, 89, 299, -205, -2641, -5311, -6025, -5676, -3801, +-2418, -4606, -7554, -11230, -12458, -12918, -13161, -12630, -13101, -10496, -5903, 488, 7152, 11771, 14440, 13717, +11918, 9364, 6015, 4671, 5289, 5108, 4927, 5943, 5889, 3197, 604, -2574, -4081, -4432, -3923, -4435, +-2472, 1680, 5504, 8213, 9687, 7873, 4433, 2609, 1760, 719, 425, 1206, 99, -2256, -4224, -6352, +-5291, -3815, -2526, -3774, -7225, -9611, -12304, -12527, -12682, -13379, -13276, -12007, -7450, -1725, 4876, 10720, +13128, 13742, 12785, 9603, 6427, 5548, 5268, 4303, 5273, 6015, 5972, 4077, 1540, -2003, -3498, -3663, +-4579, -5096, -2875, 335, 3899, 7928, 9451, 7865, 5168, 3834, 1986, 578, 1384, 1044, 891, -1377, +-4042, -5691, -5765, -3303, -2804, -3505, -5999, -9318, -11192, -12227, -12404, -13383, -14042, -12437, -9505, -3801, +3135, 8641, 12000, 14105, 13112, 9672, 7676, 6195, 4993, 4325, 5481, 6018, 6230, 5286, 2000, -1119, +-2092, -3174, -4936, -4801, -3550, -995, 2841, 7557, 9051, 7656, 6726, 3966, 2491, 1360, 1360, 1961, +994, -281, -3643, -5541, -5190, -3878, -2602, -3182, -5353, -8373, -10789, -11150, -12346, -13231, -13859, -13436, +-11245, -5375, 1039, 6268, 11436, 13845, 12756, 10311, 8621, 6505, 4851, 4821, 5035, 5741, 6950, 5710, +2141, 222, -1279, -3011, -4779, -4779, -4331, -2743, 2607, 6021, 8118, 8182, 6686, 5014, 2405, 1996, +1556, 2010, 2087, -77, -2928, -5046, -5215, -3844, -3046, -2497, -5026, -7703, -9675, -10695, -12235, -12655, +-13810, -14579, -11968, -7098, -1569, 4493, 10422, 12943, 12458, 11360, 9219, 6697, 5545, 4854, 4333, 6314, +7205, 5797, 3002, 1315, -478, -3178, -3436, -4947, -5333, -2937, 941, 5268, 7151, 8342, 7144, 5135, +3504, 2008, 1822, 2522, 2394, 771, -2573, -4177, -5291, -4231, -2843, -2396, -4788, -6773, -8741, -10643, +-11256, -12282, -14164, -14850, -12632, -9075, -4070, 2990, 8866, 11518, 12561, 11865, 9189, 7735, 5811, 4429, +4315, 6345, 7354, 5207, 4463, 2056, -374, -1650, -3420, -4783, -5851, -3596, -78, 3599, 6867, 7792, +7295, 5843, 3781, 2465, 1849, 3200, 2790, 1182, -1470, -3600, -5224, -4076, -2509, -2848, -3944, -5957, +-8429, -9875, -10262, -12069, -14249, -14589, -13482, -11127, -5778, 1296, 6397, 10850, 12282, 11533, 9930, 8373, +6478, 3571, 4966, 6273, 6340, 6379, 4678, 2617, 439, -811, -2617, -5142, -5513, -4539, -1342, 2683, +5817, 7438, 7182, 6470, 4127, 2434, 2259, 3440, 2930, 1845, -333, -3664, -4598, -3832, -2964, -2733, +-3231, -5547, -8025, -8795, -9674, -11980, -13637, -14112, -14936, -12240, -7418, -1419, 4687, 9374, 11947, 10834, +11025, 9161, 5768, 4592, 4860, 5682, 6387, 6533, 5359, 2750, 1843, -68, -2183, -4397, -5605, -5006, +-2559, 1707, 4806, 6780, 7546, 6955, 4399, 2851, 3093, 3111, 3541, 2907, 181, -2937, -3887, -3846, +-3225, -2314, -2832, -5436, -7209, -7561, -9929, -11206, -12685, -14526, -14987, -13592, -8831, -4119, 3179, 8326, +9956, 11423, 11544, 9090, 6412, 4877, 4984, 4976, 6817, 6699, 5390, 3664, 2476, 776, -1582, -3572, +-5494, -5549, -3219, 582, 3507, 6146, 7931, 6639, 4697, 3522, 3019, 3118, 4219, 3414, 681, -1841, +-3270, -4020, -3147, -1572, -3314, -4833, -5949, -7643, -8879, -10655, -11703, -14667, -15041, -13758, -11513, -5471, +1594, 6025, 9198, 11291, 11849, 8944, 7256, 5278, 4590, 5163, 6593, 6778, 5531, 4524, 3043, 1519, +-552, -2779, -5315, -5801, -3421, -903, 2478, 5930, 7479, 6522, 5394, 3808, 2903, 3585, 4672, 3668, +1315, -344, -3376, -3695, -2363, -2349, -2793, -4374, -5166, -7472, -8415, -9181, -12086, -13772, -14540, -15278, +-12721, -7037, -368, 3661, 8341, 10940, 11237, 9699, 7600, 5544, 4379, 5277, 6163, 6475, 5825, 4911, +3428, 1980, 566, -2572, -5046, -5483, -4389, -2338, 1710, 5103, 6623, 6670, 5677, 3898, 2683, 4379, +4234, 4073, 2939, -458, -2632, -3260, -2183, -2452, -2870, -3086, -5584, -6736, -7123, -9263, -11248, -12762, +-14397, -16171, -13474, -8567, -3112, 2160, 7037, 10117, 10843, 10286, 7892, 5625, 4645, 5238, 5880, 6256, +6357, 4942, 3830, 3175, 1251, -2042, -4041, -5197, -5304, -3027, 760, 4274, 5786, 7364, 5345, 3830, +3840, 3770, 4550, 4831, 3623, 345, -2286, -1896, -2774, -2319, -1831, -3366, -5049, -5795, -6581, -8989, +-9910, -11804, -14688, -16062, -14183, -10130, -5345, 688, 5475, 9031, 10741, 10510, 8250, 5961, 5244, 4966, +5498, 6544, 6262, 4819, 4680, 3957, 1557, -935, -3399, -4922, -6135, -3107, -608, 2703, 6104, 6495, +5347, 4363, 3681, 3785, 4242, 6006, 3607, 822, -694, -2129, -2571, -1863, -1686, -3603, -4143, -4979, +-6794, -8065, -8920, -11148, -14602, -15719, -14936, -11830, -7098, -1300, 3643, 7667, 10531, 10302, 8300, 6566, +5286, 4455, 5571, 6405, 5680, 5303, 4944, 4455, 1686, 535, -2643, -5262, -5312, -4330, -1755, 2288, +5213, 6302, 5145, 5211, 3495, 3429, 5337, 5716, 4074, 2193, 221, -2136, -1726, -1200, -2080, -2861, +-3393, -4616, -6584, -6848, -7977, -10593, -13644, -15381, -15436, -13124, -8416, -3240, 1862, 6751, 9903, 9830, +8981, 7108, 5021, 4942, 5539, 6275, 5101, 5930, 5483, 4052, 3457, 1053, -2056, -4169, -5549, -4739, +-2888, 1858, 4307, 5427, 6090, 4779, 3265, 3997, 5620, 5223, 5031, 3386, 341, -1143, -1001, -1100, +-2132, -2012, -2924, -4686, -5782, -6024, -7284, -9926, -12621, -15174, -15785, -13979, -9852, -5589, 408, 5469, +8288, 9837, 9198, 7406, 4869, 5182, 5687, 4929, 5866, 5753, 5074, 4920, 3687, 1973, -1421, -3253, +-5487, -5797, -2804, 443, 2959, 5336, 6190, 4001, 3634, 4364, 4721, 5490, 5683, 3714, 660, -107, +-557, -1454, -1624, -1604, -2755, -4603, -5052, -5721, -6718, -9063, -11615, -15117, -15501, -14419, -11914, -7153, +-1445, 3775, 6964, 9507, 9649, 6546, 5824, 5380, 4816, 5314, 5409, 5693, 4946, 5345, 4278, 2102, +188, -2714, -5606, -5686, -3140, -1287, 2465, 5397, 5183, 4253, 4147, 4096, 4390, 6063, 6276, 3850, +1833, 867, -237, -1217, -713, -1369, -2448, -4125, -4256, -5580, -5806, -7711, -11226, -13981, -15209, -14960, +-13197, -8675, -2634, 1099, 6351, 9312, 8711, 7528, 5976, 5483, 4674, 5332, 5512, 5071, 5576, 5577, +4446, 3135, 1571, -2646, -4786, -4963, -4469, -1968, 2129, 4575, 4583, 4696, 4279, 3504, 4643, 6379, +6203, 4265, 3207, 1300, 167, -745, -51, -1343, -2169, -3283, -4481, -4685, -5060, -7096, -10388, -13194, +-14294, -16187, -13854, -9681, -5634, -41, 5040, 8314, 8307, 7743, 6418, 4953, 4920, 5156, 4959, 4932, +5940, 4877, 4760, 4517, 1518, -1806, -3782, -5109, -5395, -2322, 1320, 3252, 4543, 4980, 3787, 3222, +5110, 6094, 6155, 4880, 4206, 1794, 556, 302, -293, -657, -1675, -3175, -4023, -4392, -4001, -7050, +-9198, -11532, -15014, -15770, -14403, -11380, -7574, -1711, 3729, 6804, 8185, 7896, 6287, 5044, 5462, 4539, +4583, 5647, 5024, 4876, 5645, 4892, 1902, -315, -2992, -5429, -5489, -2507, 11, 2371, 4762, 4591, +3516, 3307, 5118, 5762, 5978, 5960, 4246, 2560, 1339, 444, 309, -524, -885, -3420, -3685, -3094, +-4726, -5947, -7940, -10931, -14483, -15432, -14845, -13069, -9064, -3322, 1774, 5403, 8192, 7430, 6044, 5979, +4710, 4329, 4995, 5258, 4215, 5414, 5892, 4868, 2819, 1175, -2571, -5288, -4887, -3375, -945, 2000, +4523, 4228, 3164, 3990, 4561, 5599, 6404, 6016, 5164, 3058, 2348, 650, 593, 938, -1453, -2628, +-2897, -3161, -4453, -4904, -6847, -10435, -13427, -14802, -15367, -14366, -9995, -5258, -379, 5079, 6921, 7106, +6763, 6075, 4220, 4927, 5122, 4588, 4117, 5788, 5664, 4899, 4342, 1704, -1983, -4372, -4678, -4017, +-2038, 2014, 3635, 3739, 3590, 3462, 4583, 5151, 6636, 6113, 5129, 4455, 1968, 1318, 1571, 807, +-1297, -1880, -2531, -3498, -3900, -4083, -6205, -9838, -12130, -14446, -16110, -14353, -11827, -7453, -1603, 3506, +5371, 7156, 6825, 5481, 4302, 5306, 4643, 3820, 4654, 5191, 5112, 5505, 4944, 2232, -1518, -3139, +-4938, -4872, -2107, 804, 3148, 3085, 3602, 3345, 3767, 5598, 5787, 6247, 6080, 4431, 2193, 2320, +2094, 752, -469, -1309, -2259, -3637, -2986, -3525, -6051, -8062, -11227, -14295, -15408, -14862, -13582, -8638, +-3176, 1494, 4542, 7116, 6420, 4913, 5330, 5114, 4037, 4123, 4403, 4695, 4806, 6398, 5231, 2466, +227, -2803, -4514, -5275, -2511, 297, 2077, 3540, 2916, 3087, 4163, 4980, 5460, 6817, 6555, 4322, +3274, 2981, 2620, 910, 670, -639, -2664, -2724, -2491, -3587, -4788, -6856, -10749, -13043, -14833, -15693, +-14400, -9751, -5125, -715, 4286, 6357, 5544, 5495, 5413, 4835, 3702, 4490, 3990, 3585, 5478, 6007, +5587, 3176, 1134, -1926, -4753, -4743, -3309, -779, 1947, 2778, 2424, 3234, 3949, 3900, 5736, 6793, +6584, 4318, 4233, 3677, 2176, 1799, 1451, -911, -2034, -2180, -2968, -2910, -3917, -6570, -9751, -11912, +-14561, -16473, -14576, -11376, -7691, -1802, 3019, 5138, 4924, 5844, 5365, 3993, 4601, 3832, 3515, 3408, +5231, 6004, 5226, 4375, 1941, -1584, -3903, -4854, -4009, -1027, 1482, 1605, 2774, 3047, 3468, 3354, +5850, 7007, 5952, 5097, 5151, 3420, 2834, 2930, 1315, -69, -1236, -2298, -2609, -2242, -3213, -6156, +-8000, -10853, -14657, -15576, -15030, -12923, -9326, -2984, 1744, 3430, 5584, 5402, 5087, 4445, 4705, 3900, +2746, 3667, 5005, 5454, 5811, 5077, 2434, -376, -3009, -5335, -3679, -1456, 680, 1157, 2823, 3166, +2551, 3546, 6178, 6222, 6085, 6263, 4957, 3966, 3836, 3144, 2014, 726, -692, -2430, -1816, -1608, +-3545, -4602, -6888, -10216, -13680, -14811, -15297, -14823, -9758, -4708, -165, 2882, 5037, 5277, 4632, 5077, +4804, 3503, 2928, 3736, 4195, 5371, 6271, 4928, 3698, 601, -2685, -4884, -3687, -1863, -538, 1041, +3125, 2194, 2130, 4134, 5112, 5749, 6624, 6172, 5164, 4497, 4316, 3147, 2822, 1684, -1138, -1421, +-1528, -1894, -2993, -3552, -5944, -10133, -11873, -14325, -16195, -15227, -11266, -6344, -2157, 2211, 4180, 4387, +4593, 5486, 4277, 3407, 3270, 2830, 4111, 5085, 5767, 5413, 4506, 1446, -2368, -4272, -3228, -2926, +-1454, 1653, 2151, 1605, 2573, 3483, 4530, 5612, 6697, 5900, 5364, 5266, 3724, 4222, 3562, 1646, +-564, -729, -1192, -2453, -1793, -2793, -5851, -8444, -10836, -13708, -16472, -15259, -12471, -8261, -3607, 1462, +2920, 3777, 5124, 4946, 4582, 3639, 2874, 2796, 3841, 4772, 5381, 5842, 5552, 1789, -1911, -2724, +-3740, -3783, -1109, 888, 1454, 1501, 2484, 2880, 3932, 5904, 5620, 6433, 5859, 4958, 4167, 4918, +4219, 1540, 726, -177, -1773, -1541, -1312, -2494, -5385, -6874, -9810, -13261, -16087, -15264, -13863, -9993, +-4367, -423, 1912, 3615, 4586, 4983, 4734, 3653, 2759, 2700, 3754, 4042, 4841, 6947, 5595, 1978, +-60, -2352, -4011, -3728, -1277, 284, 852, 2106, 1431, 2747, 3918, 5029, 5678, 6594, 6161, 4483, +5186, 5503, 3821, 2775, 1616, -54, -1673, -776, -1092, -2283, -4453, -5433, -8966, -12641, -14715, -15980, +-14923, -10820, -6050, -1852, 1061, 2896, 4232, 4903, 4871, 3602, 2478, 3373, 3091, 2856, 5563, 6701, +5456, 3108, 1050, -1955, -4170, -2944, -2215, -272, 973, 1320, 1408, 2477, 3651, 3929, 6060, 6760, +5316, 5103, 5731, 5436, 4105, 3923, 1965, 92, -1143, -212, -1083, -2342, -2855, -4947, -8241, -11076, +-14250, -16192, -15378, -12060, -7522, -3333, -79, 2077, 3464, 5287, 4742, 2893, 3613, 3020, 2175, 2896, +5583, 6292, 5211, 4735, 1534, -1538, -3132, -3421, -2348, -688, 838, 396, 1622, 2435, 2418, 3962, +6098, 6158, 5128, 5857, 5610, 5349, 4876, 4717, 2304, 80, 64, -261, -1314, -1402, -2383, -4475, +-6864, -9998, -13500, -15944, -15760, -12924, -9094, -4518, -1171, 405, 3998, 4865, 4010, 3522, 4083, 2669, +1345, 3446, 4897, 5587, 6194, 4948, 2376, -750, -2252, -3749, -2247, -690, -136, 612, 1844, 1661, +1804, 4389, 5490, 5617, 5448, 6000, 5491, 5114, 6059, 5087, 2313, 1214, 476, -477, -732, -1119, +-2013, -3669, -5839, -8743, -12832, -15565, -15739, -14611, -9561, -6074, -3326, -176, 3443, 4050, 3353, 4541, +3781, 1850, 1894, 2767, 4152, 5099, 6602, 4914, 3124, 246, -2451, -3352, -2162, -1570, -873, 1097, +1198, 812, 1750, 3910, 4883, 4994, 5911, 5691, 4768, 5776, 6429, 4861, 3171, 1873, 654, -99, +-582, -736, -1791, -3059, -4319, -8375, -11180, -14820, -16385, -14577, -10613, -7678, -5026, -127, 2485, 2817, +4238, 4659, 3656, 1919, 2395, 2221, 3823, 5323, 6110, 5546, 4196, 831, -2056, -2155, -2432, -2226, +-549, 910, 807, 422, 2030, 3514, 3943, 5433, 6020, 5000, 5148, 6340, 6361, 5520, 3889, 2601, +1152, 251, 425, -1045, -1097, -2043, -3978, -6518, -10050, -14229, -16550, -14040, -11800, -9915, -5380, -1221, +1134, 2242, 4585, 4225, 3566, 2557, 1935, 1933, 3598, 4807, 5557, 6438, 4465, 1142, -709, -1828, +-2759, -2539, -494, 611, -106, 696, 1906, 2299, 3761, 5606, 5143, 5000, 5164, 6388, 6484, 5638, +5080, 2681, 1756, 1128, 64, -275, -728, -1513, -3451, -4665, -9040, -14159, -15132, -14207, -13180, -11006, +-5941, -2900, -176, 2321, 4054, 4096, 3879, 2724, 1491, 2255, 2923, 3881, 5980, 6527, 4541, 1922, +292, -1406, -3245, -2126, -441, -276, -155, 1143, 785, 2036, 3687, 5271, 4975, 4422, 5695, 5935, +6520, 6569, 4860, 3560, 2317, 1603, 49, 354, -552, -1790, -1764, -3642, -8632, -13080, -13783, -14877, +-14340, -11384, -7459, -4420, -1150, 1705, 3115, 4405, 3869, 2288, 2101, 2025, 2010, 3646, 5875, 6396, +4379, 3139, 1303, -1554, -3014, -1478, -1447, -536, 97, 624, 529, 1220, 3819, 4506, 4403, 4905, +4947, 6008, 6535, 6873, 4966, 4394, 2972, 1420, 1264, 589, -958, -1247, -208, -3193, -7880, -11071, +-13240, -15073, -14596, -11928, -9124, -5335, -2044, 343, 3128, 4264, 3403, 2822, 2403, 1656, 1333, 3579, +5745, 5633, 4654, 4636, 1323, -1061, -2111, -2014, -1477, -900, 548, 109, -232, 1637, 2992, 4209, +4161, 4745, 4465, 6074, 6720, 6312, 5926, 4926, 3008, 2035, 2367, 238, -1161, 24, 165, -2819, +-6417, -9371, -12916, -14613, -14408, -13210, -9771, -6452, -3635, -237, 2824, 3755, 3301, 3328, 2681, 1100, +1048, 4050, 4666, 5186, 5698, 4532, 2094, -591, -1270, -2194, -2130, -324, -74, -218, -464, 1366, +2292, 3973, 4140, 3768, 4565, 5874, 6220, 6335, 6792, 4774, 3191, 3544, 2443, -182, -575, 834, +123, -2142, -4641, -8801, -11794, -13988, -14909, -13587, -10577, -8027, -4922, -1025, 1991, 2960, 3169, 4187, +2110, 616, 1885, 2921, 4090, 4810, 6096, 4842, 2232, 748, -1402, -2304, -2083, -289, -600, -513, +-279, 395, 2136, 3627, 3495, 3393, 4819, 5067, 5664, 7129, 6644, 4497, 4242, 4569, 2260, -124, +535, 567, 523, -984, -3809, -7488, -10535, -13666, -14706, -13649, -11578, -9291, -6144, -1469, 597, 1923, +4221, 3618, 2138, 852, 1821, 2375, 3135, 5213, 5714, 4918, 3103, 1630, -1368, -2285, -1570, -894, +-556, -621, -778, -115, 2280, 2830, 2762, 3841, 4251, 4210, 5923, 7400, 6022, 4565, 5849, 4594, +2403, 780, 651, 780, 1135, -509, -2756, -5927, -9702, -12885, -14456, -13343, -12612, -10880, -6184, -3307, +-504, 1749, 4078, 3452, 1823, 1734, 1433, 1706, 2852, 5062, 5195, 4995, 4230, 1773, -763, -1869, +-1623, -1163, -241, -908, -1397, 356, 1749, 1969, 2990, 3872, 3327, 3745, 6814, 6772, 5550, 5656, +6275, 4835, 3162, 1184, 883, 1415, 1123, 216, -1892, -4479, -8606, -12504, -12831, -14045, -13471, -11192, +-7279, -4708, -1888, 1902, 3537, 3098, 2126, 2072, 1018, 1230, 2938, 4126, 4839, 5386, 4609, 2012, +-19, -1593, -2032, -533, -541, -1555, -1176, 295, 809, 1396, 3609, 3014, 2361, 4329, 6394, 5879, +5762, 5997, 6348, 5613, 3303, 1844, 1123, 1555, 1418, 171, 2, -3865, -7940, -10871, -12299, -14219, +-14129, -11282, -8739, -6221, -2799, 1361, 2635, 2798, 2824, 1752, 763, 1357, 2470, 3265, 4683, 5641, +4432, 3101, 416, -1662, -1496, -280, -975, -1813, -516, -409, -140, 2091, 3290, 1894, 2499, 4405, +5527, 5788, 5359, 6439, 6654, 5845, 4015, 1687, 2262, 1364, 1134, 1299, 594, -3091, -6907, -9163, +-12068, -14162, -14008, -11678, -10260, -7581, -3251, 127, 1769, 2983, 2847, 1514, 960, 1551, 1391, 3043, +4324, 5136, 4970, 3711, 579, -1465, -617, -686, -1671, -1043, -648, -1550, 42, 2372, 2147, 1824, +2105, 4250, 5195, 5180, 5683, 5897, 7403, 6065, 4110, 2963, 2451, 1314, 1351, 2337, 712, -2269, +-5289, -7787, -11648, -13836, -13333, -12536, -11525, -8280, -4312, -1240, 1193, 3175, 2139, 1852, 1315, 1088, +1304, 2588, 3694, 4846, 5774, 3886, 506, -248, -220, -1495, -1217, -445, -1818, -1355, 11, 2004, +1734, 1170, 2493, 3461, 5000, 4725, 5063, 6494, 7356, 6044, 4719, 4135, 2259, 1391, 2051, 2780, +959, -1425, -3405, -7003, -11046, -12632, -13010, -13329, -12237, -8728, -6031, -2171, 845, 2341, 2221, 2087, +1377, 828, 1441, 1937, 2738, 5205, 6036, 3324, 1301, 885, -1201, -985, -797, -858, -2092, -1979, +478, 1192, 1384, 948, 1859, 3543, 4404, 3941, 4876, 6853, 6794, 6126, 5658, 4558, 2325, 1629, +2944, 2598, 1098, -44, -2193, -6323, -10009, -11228, -13238, -13538, -12391, -10188, -7080, -3036, 25, 1509, +2368, 2102, 1116, 1311, 1378, 726, 2507, 5809, 4783, 3847, 2387, 846, -796, -1006, -20, -1408, +-2214, -1716, 106, 1103, 1087, 569, 1798, 3735, 3591, 3599, 5239, 6500, 6594, 6483, 6888, 4789, +2618, 2664, 3351, 2544, 1709, 1623, -1506, -5180, -8090, -10668, -12699, -13195, -12708, -11180, -7765, -3988, +-1104, 1217, 2398, 1560, 1422, 2440, 42, 448, 2788, 4666, 4808, 3951, 3284, 579, -597, -280, +-205, -1642, -2279, -1883, -144, 1011, 298, 298, 2174, 3019, 2952, 3281, 5329, 5769, 6165, 7168, +7178, 4800, 3097, 3699, 2939, 2458, 2874, 1967, -743, -3874, -6870, -10043, -11876, -12983, -13347, -11874, +-8559, -5549, -2290, 1445, 954, 1538, 2471, 1517, -24, 182, 2661, 3586, 4454, 4669, 3307, 588, +-18, 93, -274, -1469, -2691, -1964, 174, 285, -89, 248, 2227, 2270, 2376, 3549, 4792, 5039, +6048, 7925, 6880, 4914, 4463, 3765, 2927, 2984, 3435, 2248, 389, -2576, -5896, -8934, -10782, -12811, +-13887, -11573, -10344, -6628, -2200, -326, 448, 1734, 2875, 1048, -167, 508, 1835, 2754, 4505, 4897, +3048, 1104, 247, 306, 203, -1907, -2662, -1769, 74, -384, -473, 686, 1773, 1660, 2166, 3843, +3880, 4305, 6698, 7575, 6728, 5741, 5203, 3689, 3356, 3413, 3596, 2771, 1396, -1409, -5257, -6869, +-10516, -12572, -12656, -12852, -11205, -7098, -3131, -1682, -75, 2209, 2611, 852, 270, 569, 755, 2579, +4487, 4702, 3414, 1051, 723, 918, 359, -2130, -2662, -1261, -424, -889, -598, 1005, 1062, 1017, +2763, 3094, 2948, 4293, 6617, 6860, 6908, 6426, 5500, 3972, 3672, 3900, 3271, 4158, 1730, -944, +-2989, -6330, -9667, -11311, -12579, -13641, -11744, -7535, -4602, -2986, -315, 2184, 1771, 1244, 665, 0, +562, 1981, 4305, 4708, 3364, 1235, 1172, 1665, 147, -2086, -2358, -938, -1054, -1414, 104, 525, +284, 1305, 2849, 2140, 2651, 4282, 6038, 6611, 6958, 7145, 5174, 5152, 3883, 3446, 4515, 4081, +2157, 600, -1942, -5564, -8344, -10067, -12732, -14017, -11862, -8125, -6428, -3723, -601, 1133, 1846, 1387, +799, -204, 35, 1545, 3986, 4694, 2783, 1489, 1692, 2041, -158, -2256, -1526, -1358, -1888, -1197, +206, -441, 184, 1476, 2113, 1691, 2197, 4301, 4697, 6687, 7105, 6537, 6332, 5165, 3669, 4242, +4666, 3920, 3006, 1751, -1379, -4534, -6834, -8992, -13022, -13724, -11667, -9749, -7340, -4531, -1437, 496, +1569, 1612, 881, -146, -702, 1379, 3800, 4392, 2508, 1542, 2717, 1997, -425, -1480, -1017, -2151, +-1739, -806, -439, -665, 86, 1948, 1062, 1694, 2434, 3076, 4992, 6294, 6502, 7266, 6770, 5081, +4348, 4861, 4517, 4306, 3868, 2638, -1032, -3031, -4862, -8898, -12323, -13158, -12102, -10611, -8298, -5355, +-2469, -36, 1052, 1890, 1004, -429, -1015, 976, 3878, 3570, 1998, 2127, 3210, 1188, 18, -618, +-1528, -2285, -1863, -452, -1446, -874, 567, 704, 1233, 1559, 1499, 2985, 4566, 5259, 6488, 7552, +6462, 5417, 4824, 5117, 4112, 4711, 4953, 2342, -41, -1416, -3930, -8173, -11472, -12624, -12588, -11135, +-9335, -6171, -3504, -1090, 841, 1821, 1362, -901, -1350, 1107, 3761, 2210, 2113, 2944, 2715, 1398, +400, 104, -1963, -2234, -957, -1526, -1394, -526, -142, 744, 1363, 892, 1477, 2955, 3489, 4916, +6438, 7612, 6348, 5739, 5804, 4517, 4464, 5640, 4975, 2619, 1171, 3, -3113, -6957, -10584, -11956, +-12553, -11801, -9796, -7211, -4375, -2186, 439, 2023, 1678, -1726, -1089, 1567, 2483, 1971, 2192, 3263, +2253, 1462, 1713, -493, -1804, -1436, -1548, -1638, -1155, -1168, -188, 1006, 669, 895, 1427, 2552, +2811, 4411, 6758, 6742, 6523, 6680, 5653, 4390, 5161, 6108, 4765, 3286, 2068, 1131, -1985, -5964, +-9256, -11511, -12315, -12189, -10306, -8149, -5278, -3613, 243, 2441, 590, -1486, -731, 1439, 1525, 1381, +2961, 2409, 2045, 2481, 1461, -510, -1051, -1734, -1734, -1314, -1854, -1201, -264, 564, 340, 592, +1757, 1395, 2234, 4497, 5861, 6135, 6952, 6992, 5158, 4870, 5525, 6130, 4829, 3635, 3113, 1829, +-918, -4793, -8019, -10997, -11901, -12617, -10631, -8457, -7422, -4227, 128, 2011, 133, -1497, 222, 529, +754, 2046, 2379, 1842, 2808, 2460, 1294, 256, -1240, -1440, -1448, -1698, -2003, -1501, 47, -123, +67, 1158, 1203, 765, 2244, 4158, 4652, 6339, 7210, 6862, 5177, 5207, 6145, 6017, 4947, 4160, +4052, 2433, 308, -3670, -6872, -9569, -12299, -12157, -10554, -9712, -8620, -5079, 252, 943, -513, -384, +-48, -410, 1227, 1709, 1546, 2297, 2416, 2526, 1677, 240, -864, -1421, -1070, -2150, -2328, -1046, +-551, -672, 359, 1279, 202, 901, 2045, 3272, 4035, 6172, 7377, 6491, 5270, 5626, 6589, 5824, +5358, 4601, 4388, 3765, 797, -2053, -5274, -9186, -11648, -11721, -10241, -10986, -9946, -4919, -680, -446, +89, -79, -770, 182, 764, 1243, 1524, 1917, 2590, 2449, 2076, 306, -753, -635, -1343, -2499, +-1970, -874, -1568, -431, 457, 787, 69, 961, 1833, 2355, 3687, 5983, 7268, 5974, 5657, 6127, +6311, 6377, 5087, 5084, 5249, 3869, 1949, -691, -3924, -8642, -11211, -10430, -10594, -12563, -10046, -5482, +-2638, -392, -108, -443, -543, -150, 695, 769, 1348, 1557, 2240, 2819, 1905, 198, -196, -114, +-2130, -2133, -1801, -1600, -1757, -429, 277, 143, 162, 861, 1341, 1273, 3419, 5929, 6281, 6136, +5374, 6195, 6776, 5935, 5408, 5452, 5497, 4204, 2727, 1069, -2966, -8480, -9526, -9437, -11983, -12407, +-10478, -6931, -3296, -1271, -322, -773, -486, -225, 264, 794, 939, 1054, 2296, 3052, 1234, 876, +468, -515, -1952, -1768, -1877, -2191, -1588, -472, 69, -316, 378, 1124, 252, 1296, 3018, 5341, +6210, 5535, 5687, 6500, 6784, 6058, 5644, 6065, 5696, 4142, 4439, 2803, -3182, -6672, -7835, -9464, +-11491, -12582, -10863, -7984, -4048, -1797, -812, -675, -389, -317, 314, 950, 69, 1356, 2632, 2406, +1421, 1566, 773, -734, -1348, -1534, -1932, -2408, -1516, -277, -922, 45, 669, 620, 184, 603, +2768, 4948, 5517, 5249, 5753, 6655, 6803, 5643, 6250, 6715, 4529, 5209, 6047, 2699, -1877, -5259, +-6639, -9129, -11178, -12535, -11538, -8814, -4983, -2642, -1374, -604, -1100, -98, 629, 117, -129, 1534, +2277, 1770, 1899, 1751, 789, -575, -1025, -1099, -2767, -2169, -1302, -1120, -892, -132, 702, 468, +-319, 273, 2504, 4300, 5028, 4625, 5790, 7125, 5707, 6318, 7273, 5413, 4802, 6096, 6709, 3141, +-726, -3742, -5685, -8433, -10673, -12494, -12098, -9174, -6455, -3369, -1601, -1476, -1126, 240, 391, -499, +237, 1327, 1689, 1671, 2036, 2291, 369, -31, -355, -1673, -2380, -2030, -1463, -1401, -1174, -84, +862, 114, -420, 4, 2056, 4284, 3550, 4659, 6526, 5747, 5942, 7113, 7140, 4899, 5231, 6811, +7056, 3845, 513, -2410, -4834, -7041, -10385, -12248, -11960, -10318, -7228, -3836, -2355, -2269, -639, 247, +-73, -408, 217, 1420, 985, 1817, 2565, 1701, 879, 573, -258, -1532, -2120, -1867, -1443, -1888, +-1227, 149, 566, 584, -1243, -90, 2622, 2660, 3339, 5071, 5848, 5093, 6500, 7501, 6704, 4784, +5671, 7281, 7007, 4950, 1384, -1321, -3309, -6430, -9606, -11574, -12171, -11357, -7531, -4714, -3544, -2321, +-849, 281, -625, -281, 642, 440, 925, 2097, 2213, 1681, 1262, 839, -51, -1568, -1877, -1424, +-2130, -1613, -1705, -81, 1276, -523, -1181, 524, 1713, 1642, 3577, 4792, 4821, 4829, 6918, 7701, +5976, 5146, 5830, 7250, 7726, 5300, 2372, 114, -2137, -5680, -8262, -11008, -12655, -11281, -8281, -5551, +-4611, -2606, -541, -538, -605, 198, 181, 127, 1049, 1894, 2099, 1652, 1520, 1521, -573, -867, +-1608, -1645, -1533, -2636, -1763, 562, 653, -1140, -432, 425, 653, 1275, 3518, 4277, 3595, 5018, +7029, 7212, 6090, 4986, 5838, 7499, 7941, 5506, 3582, 1261, -1630, -4082, -7350, -10461, -12707, -11467, +-8549, -7056, -5323, -2604, -1302, -1007, -278, 58, -113, 35, 826, 2130, 1211, 2009, 1947, 1168, +266, -1122, -1375, -904, -2077, -3313, -1063, 427, -131, -797, -78, 189, -276, 1582, 3394, 3172, +3400, 4932, 6952, 7200, 6075, 4765, 6255, 7851, 7561, 6551, 4451, 2184, -415, -2776, -5886, -10181, +-12245, -10959, -9487, -8143, -5427, -3266, -1987, -1052, -510, 421, -787, 165, 1026, 1146, 1602, 1797, +1838, 1722, 121, -1305, -374, -936, -2930, -2982, -1024, -65, -899, -243, 90, -869, -346, 1478, +2702, 2430, 2956, 4349, 6863, 7161, 5308, 5123, 6181, 7500, 7689, 6905, 5344, 2591, 692, -1156, +-5202, -9785, -11130, -11140, -10471, -8564, -6475, -3664, -3017, -1214, -253, -569, -421, 153, 459, 1169, +1351, 1375, 2500, 1662, -429, -445, 54, -1167, -3389, -2469, -995, -1180, -641, 81, -317, -1252, +-154, 1134, 2222, 2093, 2014, 4462, 6697, 6597, 5399, 5127, 6354, 7112, 7846, 7669, 5711, 3122, +2448, -75, -4594, -8158, -10658, -10833, -11157, -9016, -6621, -5148, -3182, -1232, -887, -534, -258, -287, +740, 952, 557, 1970, 2638, 1347, -429, 379, 474, -1905, -2835, -2082, -1663, -1689, -204, 5, +-681, -1137, -559, 1335, 1937, 1152, 1819, 4157, 6441, 6135, 5373, 5382, 6138, 6725, 8528, 7874, +5556, 4740, 3365, 1161, -3543, -6930, -9214, -11233, -11077, -9043, -7732, -5755, -3338, -2082, -883, -479, +-794, 218, 607, 316, 436, 2353, 2626, 509, 267, 1096, 142, -2046, -2108, -2244, -2384, -1514, +-536, 39, -819, -1659, -330, 1127, 1424, 433, 1434, 3854, 5859, 5492, 5713, 5240, 5161, 7343, +8295, 7817, 5880, 5374, 4697, 1528, -2239, -5289, -8852, -10939, -10619, -10036, -8374, -6216, -4489, -2187, +-1282, -1050, -763, 451, 364, -656, 823, 2602, 1869, 305, 1096, 1170, -319, -1274, -2032, -2426, +-2567, -1938, -324, -147, -1186, -1827, -108, 1016, 945, -302, 1407, 3535, 4596, 5929, 5390, 4796, +5181, 7159, 8503, 7326, 6380, 6527, 5078, 2361, -339, -4436, -7977, -9845, -10924, -10002, -8853, -7153, +-5011, -2529, -1694, -1739, -278, 626, -465, -896, 1427, 2298, 962, 1052, 1320, 1025, -2, -1072, +-1583, -2553, -2849, -2052, -166, -475, -1416, -2055, 139, 1137, -128, 26, 908, 2584, 4503, 5580, +5335, 4255, 5121, 7535, 7921, 7042, 7433, 6797, 5542, 4011, 461, -3039, -6707, -9231, -10497, -10066, +-9282, -8051, -5164, -2925, -2703, -1815, 390, 378, -1350, -134, 1473, 1646, 1119, 1201, 1584, 1001, +254, -644, -1171, -2808, -2783, -2087, -206, -451, -2285, -1346, 177, 498, 32, -235, 536, 1901, +4118, 5647, 4736, 3753, 5730, 7092, 7194, 7772, 7288, 7125, 6354, 4798, 1693, -1783, -5500, -8607, +-9779, -10016, -10146, -8468, -5325, -3873, -3869, -1211, 279, -509, -1176, -17, 1237, 1153, 1147, 1226, +1681, 680, 622, -162, -1191, -2617, -3508, -1539, -332, -1418, -2114, -1345, 37, 253, -141, -302, +-179, 1079, 4292, 5028, 3733, 4367, 5304, 6534, 7148, 7589, 7442, 7434, 6990, 5384, 2984, -466, +-4594, -7449, -8921, -10181, -10927, -8108, -6017, -5438, -3908, -1160, -192, -999, -977, -83, 1067, 608, +1210, 1442, 1290, 1025, 409, 568, -881, -3246, -3053, -1417, -828, -1777, -2171, -1287, -161, -72, +341, -628, -1317, 1435, 3696, 4142, 3769, 4121, 5017, 6157, 7043, 7253, 7581, 7739, 7187, 6282, +4191, 604, -3766, -5599, -8264, -10724, -10450, -8093, -7093, -6407, -3906, -1542, -452, -1357, -806, 88, +424, 933, 936, 1622, 1433, 553, 1220, 1128, -1055, -3122, -2636, -1330, -1047, -2198, -1780, -1278, +-883, 707, 294, -1345, -1127, 1184, 3105, 3648, 3759, 3837, 4826, 6001, 6585, 7259, 7695, 7885, +7186, 7564, 5165, 1158, -1851, -4093, -7945, -10482, -9669, -8617, -7856, -7046, -4193, -1792, -1390, -1058, +-897, -56, 451, 347, 1271, 1673, 867, 627, 1844, 1221, -1008, -3166, -2216, -1264, -1946, -1777, +-1982, -2150, -585, 775, -137, -1723, -1095, 617, 2454, 3280, 3194, 3617, 4479, 5683, 5901, 7416, +7605, 7356, 7918, 8228, 5423, 2188, 233, -3362, -7346, -9710, -9270, -8767, -9039, -7192, -4653, -2543, +-1529, -1565, -739, -94, -85, 347, 1601, 1180, 644, 750, 2191, 1542, -1458, -2345, -1889, -1983, +-1652, -1775, -2551, -2444, -271, 543, -430, -1576, -1384, 272, 1873, 2969, 2566, 3577, 4217, 4852, +6043, 7283, 6962, 7287, 8960, 8160, 5928, 3760, 1629, -2142, -6826, -8421, -8773, -9317, -9164, -7798, +-5107, -3014, -2236, -1617, -487, -690, -247, 547, 1479, 1003, -63, 1334, 2570, 945, -894, -1892, +-2140, -2057, -1247, -2186, -3101, -2302, -414, 400, -594, -1378, -1742, 114, 1495, 2073, 2639, 3482, +3561, 4455, 6516, 6539, 6554, 7904, 9014, 8388, 6348, 5458, 2962, -1495, -5327, -7348, -8329, -9289, +-9593, -8147, -5343, -4015, -2676, -1440, -817, -805, -706, 934, 1570, 37, 208, 1668, 2251, 918, +-169, -1921, -2393, -1640, -1351, -2529, -3504, -2280, -853, 317, -557, -1821, -1644, -91, 728, 1414, +2853, 2668, 2910, 4804, 5858, 5986, 6171, 8277, 8981, 7906, 7346, 6665, 3851, -312, -4098, -6336, +-7525, -9493, -9778, -8149, -6247, -4575, -3226, -1488, -921, -1711, -353, 1256, 953, -404, 688, 1512, +1917, 1494, 9, -1808, -2282, -1127, -1612, -2689, -3442, -2697, -883, 282, -717, -1942, -1160, -709, +-1, 1783, 2238, 2185, 2649, 4851, 5434, 5117, 6431, 8394, 8439, 8047, 8175, 7457, 5038, 649, +-2765, -4807, -7261, -9103, -9719, -8403, -6714, -5733, -3251, -1514, -1686, -2113, 154, 1024, 325, -119, +510, 1257, 1864, 1977, -154, -1751, -1797, -1171, -1611, -2811, -3703, -3118, -712, -196, -1211, -1236, +-1548, -1190, -234, 1556, 1694, 1438, 2851, 4619, 4483, 4822, 6629, 7925, 8188, 8067, 8691, 8596, +5541, 1930, -1205, -3670, -6297, -8923, -9219, -8450, -7591, -6321, -3043, -2083, -2509, -1697, 123, 725, +162, 202, 121, 1093, 2273, 1949, 27, -1479, -1431, -1157, -1172, -2943, -4228, -2643, -1236, -649, +-927, -1058, -1769, -1634, -80, 1238, 771, 1250, 3061, 3828, 3912, 4680, 6287, 7826, 7466, 8172, +9276, 8928, 6440, 2906, 344, -2463, -5677, -8348, -8437, -8921, -8632, -6177, -3520, -2970, -2992, -1446, +-263, 380, 363, -213, -131, 1019, 2409, 1645, 296, -1257, -1584, -442, -1411, -3336, -4013, -2837, +-1829, -1098, -665, -1115, -2332, -1670, 89, 326, 222, 1344, 2512, 3405, 3117, 4483, 6215, 6977, +7163, 8060, 9619, 9240, 6937, 3965, 2047, -1560, -5177, -6956, -8090, -9520, -9048, -6113, -4337, -3780, +-2934, -1927, -539, 291, 465, -699, -224, 1114, 1951, 2096, 227, -1372, -971, -186, -1557, -3371, +-3756, -3089, -2461, -1174, -348, -1618, -2488, -1194, -437, -98, -242, 1277, 2396, 2498, 2833, 4279, +5983, 6362, 6795, 7959, 10052, 9389, 7245, 5627, 3249, -741, -3917, -5463, -7948, -9788, -8632, -6593, +-4920, -4173, -3017, -2348, -612, 579, 19, -417, -251, 873, 2314, 2198, 138, -1025, -320, -34, +-1566, -3036, -3342, -3635, -2847, -698, -789, -1690, -2336, -1100, -514, -799, -251, 1203, 2082, 1872, +2633, 4003, 5708, 5806, 6196, 8326, 9903, 9178, 7992, 7073, 3904, 110, -2009, -4617, -7614, -9592, +-8537, -7158, -5476, -4350, -3920, -2501, -719, 155, 95, -550, -638, 855, 2496, 1917, 32, -637, +180, -231, -1575, -2258, -3765, -3935, -2863, -1008, -1061, -2069, -2021, -1094, -941, -1339, -218, 922, +1579, 1350, 2094, 4121, 5058, 4969, 5990, 8498, 9266, 8949, 9216, 7646, 4615, 1495, -477, -3806, +-7064, -8799, -8884, -7345, -5713, -5127, -4262, -2760, -1144, 61, 215, -921, -820, 974, 2568, 1562, +-61, 200, -49, -152, -934, -2068, -3860, -4202, -2713, -1304, -1512, -2239, -1603, -1212, -1411, -1495, +-487, 971, 986, 749, 1906, 4094, 4167, 4204, 6325, 7772, 8601, 9253, 9842, 7912, 5260, 3183, +499, -2782, -6029, -8616, -8760, -7407, -6292, -5704, -4565, -3402, -1437, 54, 52, -1234, -1060, 1510, +2013, 1272, 461, 360, -63, 30, -290, -1901, -3906, -4255, -2522, -1683, -1981, -1957, -1564, -1144, +-1757, -1630, -465, 943, 343, 212, 2423, 3374, 3351, 4169, 6152, 7013, 8080, 9838, 9888, 8235, +6454, 4223, 1809, -1394, -5193, -8058, -8251, -7644, -6579, -5993, -5159, -3876, -1815, 408, -532, -1584, +-683, 1367, 1660, 1253, 836, 294, 20, 322, 250, -1832, -3979, -3804, -2752, -2105, -2380, -1861, +-1455, -1239, -2132, -1931, 91, 294, -404, 364, 2243, 2601, 2744, 4308, 5410, 6185, 8131, 9708, +9867, 8765, 7162, 5180, 3286, -393, -4212, -7138, -8011, -7600, -6984, -6042, -6007, -4443, -1675, 19, +-1020, -1600, -479, 922, 1506, 1330, 998, 141, -30, 950, 412, -1710, -3820, -3502, -2953, -2527, +-2632, -2090, -936, -1712, -2595, -1466, -36, -381, -758, 671, 1635, 1799, 2810, 3883, 4600, 5780, +7815, 9284, 10104, 8854, 7661, 6378, 4360, 879, -3287, -6041, -7765, -7575, -6777, -6670, -6779, -4705, +-1699, -740, -1257, -1552, -535, 588, 1223, 1630, 791, 39, 143, 1365, 488, -1554, -3293, -3546, +-2762, -3111, -3099, -1575, -1071, -2244, -2578, -921, -437, -1008, -404, 533, 972, 1648, 2764, 3203, +4354, 5277, 7375, 9308, 9953, 9197, 8169, 7548, 5386, 2059, -1713, -5204, -7288, -7059, -6517, -7450, +-7163, -4839, -2086, -1211, -1543, -1328, -873, 353, 1282, 1803, 534, -72, 647, 1310, 824, -1382, +-3094, -2867, -3064, -3799, -3156, -1270, -1587, -2749, -2065, -1019, -1160, -1145, -247, -214, 721, 1358, +2264, 2839, 3536, 4726, 6801, 9045, 9518, 9027, 8725, 8066, 6170, 3285, -386, -4700, -6510, -6490, +-6786, -7989, -7636, -5029, -2892, -1796, -1761, -1433, -1360, -79, 1571, 1362, 392, -62, 523, 1722, +787, -1317, -2433, -2361, -3547, -4259, -2688, -1461, -2268, -2698, -1573, -1623, -1252, -1053, -559, -335, +257, 1152, 1929, 2539, 2869, 4097, 6534, 8548, 9118, 9041, 9209, 8321, 7287, 4738, 523, -3713, +-5523, -5691, -6972, -8209, -7832, -5353, -3506, -2374, -1570, -1940, -1597, 39, 1312, 1455, 202, -181, +875, 1959, 567, -999, -1357, -2229, -4057, -4165, -2239, -2221, -2429, -2395, -1859, -1629, -1430, -1095, +-811, -498, -94, 861, 1826, 2001, 2229, 3606, 6250, 7701, 8857, 9180, 9078, 8790, 8309, 6027, +1376, -2459, -4343, -5069, -6827, -8394, -7578, -6026, -4097, -2340, -2037, -2074, -1790, -129, 1422, 1506, +-114, -104, 1422, 1798, 393, -267, -304, -2563, -3980, -3612, -2656, -2401, -2453, -2288, -2001, -1622, +-1525, -1155, -772, -819, -359, 689, 1794, 1247, 1737, 3359, 5432, 7160, 8563, 9008, 8731, 9319, +9241, 6819, 2445, -1354, -2851, -4617, -6759, -7876, -8041, -6492, -4468, -2804, -2421, -2304, -2237, -254, +1533, 1076, -383, 120, 1767, 1038, 515, 806, -281, -2470, -3685, -3446, -3016, -2628, -2653, -2441, +-2065, -1932, -1638, -1307, -770, -1352, -651, 697, 1183, 784, 1338, 2833, 4485, 6779, 8214, 8357, +8652, 9502, 10119, 7431, 3197, 361, -2016, -3988, -6123, -7695, -8324, -6776, -5008, -3189, -2612, -2888, +-2434, -190, 1650, 337, -364, 908, 1228, 728, 1019, 1354, -165, -2057, -3342, -3371, -3034, -2898, +-2662, -2597, -2060, -2176, -1644, -1070, -1208, -1550, -642, 595, 620, 634, 1060, 2003, 4122, 6210, +7802, 7770, 8208, 10235, 10379, 7939, 4499, 1669, -1060, -2976, -5531, -7378, -8204, -7301, -5297, -3475, +-2830, -3636, -2552, 316, 936, 51, 206, 1054, 732, 879, 1438, 1629, 301, -1707, -2803, -3275, +-3000, -3064, -2708, -2437, -2447, -2257, -1464, -1043, -1640, -1500, -564, 39, 657, 355, 648, 1471, +3403, 6143, 7009, 6977, 8252, 10389, 10394, 8709, 5501, 2759, 260, -2198, -4683, -6982, -8071, -7781, +-5597, -3393, -3852, -4161, -2223, 30, 53, 200, 539, 745, 515, 704, 1711, 1748, 645, -1321, +-2501, -2937, -3265, -3199, -2716, -2608, -2968, -2243, -1276, -1664, -1619, -1673, -879, -124, 217, 348, +6, 639, 3136, 5578, 5909, 6551, 7974, 10066, 10644, 9017, 6449, 3737, 1418, -1295, -3888, -6117, +-8399, -8071, -5376, -3934, -4975, -4140, -2163, -744, -276, 139, 707, 462, 311, 656, 1668, 2035, +820, -893, -2035, -2755, -3461, -3153, -2500, -3321, -2957, -2259, -1514, -1629, -1910, -1624, -1110, -472, +306, 197, -802, 435, 2850, 4674, 5339, 5906, 7773, 9763, 10707, 9440, 7171, 5103, 2297, -236, +-2472, -5542, -8616, -7559, -5285, -4910, -5248, -4184, -2332, -1346, -519, 283, 684, 473, 148, 676, +1797, 2241, 1065, -339, -1193, -2903, -3047, -2851, -2795, -3215, -3077, -2155, -1493, -1757, -1750, -1540, +-1574, -246, 525, -336, -939, 97, 2559, 4003, 4691, 5442, 7226, 9687, 10501, 9669, 8156, 6016, +3004, 1431, -1216, -5498, -7912, -7082, -5522, -5575, -5483, -4224, -2849, -1776, -835, 290, 672, 360, +-68, 514, 2045, 1818, 1515, 361, -1203, -2513, -2855, -2826, -2908, -3498, -3161, -2135, -2028, -1694, +-1665, -2148, -1492, -299, 397, -734, -1285, -109, 1918, 3476, 3948, 4764, 6894, 9269, 9921, 10244, +8886, 6102, 4398, 2952, -483, -4981, -7158, -6620, -5999, -5938, -5733, -4459, -3344, -2240, -1082, 95, +927, -130, -36, 790, 1532, 1952, 1941, 736, -816, -2166, -2555, -2498, -3303, -3521, -3045, -2727, +-1886, -1679, -1917, -2441, -1572, -176, 66, -939, -1535, -473, 1531, 2927, 2927, 4446, 6586, 8132, +9954, 10622, 8841, 6679, 5799, 4318, 150, -3992, -6223, -6239, -6242, -6181, -5761, -4905, -3521, -3024, +-1368, 361, 432, -133, 104, 502, 1300, 1995, 2070, 1286, -707, -1734, -1940, -2855, -3134, -3459, +-3339, -2936, -1901, -1605, -2291, -2577, -1546, -210, -62, -914, -1959, -567, 1436, 1862, 2638, 4226, +5551, 7568, 10011, 10644, 8646, 7504, 7048, 5366, 996, -2909, -5090, -6064, -6006, -6485, -5972, -4833, +-4370, -3444, -1380, -26, 233, 28, -113, 468, 925, 1961, 2625, 1162, -185, -1151, -1835, -2679, +-3020, -3446, -3706, -3073, -1904, -1812, -2684, -2543, -1797, -316, 38, -1577, -1950, -500, 533, 1289, +2383, 3547, 4458, 7243, 9759, 10208, 8575, 8166, 8221, 5959, 2228, -1779, -4245, -5266, -6248, -6520, +-5713, -5357, -4975, -3553, -1921, -246, 13, -69, 148, -98, 800, 2078, 2479, 1411, 295, -712, +-1645, -2362, -2797, -3527, -4041, -2920, -2036, -2084, -2571, -3066, -1718, -23, -497, -1666, -1726, -822, +-258, 1138, 1944, 2566, 3723, 6818, 9452, 9299, 8674, 8755, 8731, 7058, 3058, -675, -2883, -4922, +-6268, -6003, -5968, -5688, -5375, -4147, -2054, -906, -67, 133, -192, -325, 762, 1927, 2337, 1696, +724, -363, -1485, -1855, -2675, -3833, -3792, -3258, -2142, -1959, -3195, -3191, -1460, -235, -992, -1332, +-1696, -1385, -519, 935, 1598, 1453, 3332, 6559, 8555, 9015, 8634, 9056, 9684, 7754, 3927, 1113, +-1931, -4272, -5582, -5834, -5612, -6060, -5585, -4172, -2613, -1212, 106, 147, -324, -292, 749, 1895, +2246, 2154, 1177, -247, -569, -1498, -2535, -3449, -4075, -3225, -1885, -2210, -3701, -2876, -1432, -711, +-964, -1269, -1680, -1993, -562, 863, 542, 828, 2857, 5719, 7990, 8355, 8168, 9665, 9811, 8133, +5279, 2154, -766, -3770, -5133, -5335, -5788, -6350, -5690, -4711, -3269, -1489, -87, 43, -588, -342, +639, 1262, 2472, 2176, 1131, 392, -349, -1190, -2155, -3539, -4458, -2933, -1996, -2870, -3727, -3019, +-1639, -1242, -866, -1028, -2294, -2133, -474, 221, 21, 312, 2059, 5527, 7061, 7410, 8365, 9551, +10070, 8666, 6305, 3551, 127, -2988, -4240, -5019, -5767, -6184, -5944, -5102, -3805, -1764, -82, -418, +-356, -411, 151, 1448, 2323, 2127, 1523, 753, -162, -432, -1892, -3882, -4057, -2863, -2211, -3292, +-3696, -2913, -2289, -1336, -530, -1451, -2488, -1983, -940, 147, -619, -567, 1969, 4661, 6137, 6833, +8062, 9561, 9998, 9083, 7514, 4598, 1051, -1768, -3551, -4571, -5517, -6125, -5871, -5822, -3991, -2000, +-697, -168, -370, -633, 189, 1424, 2008, 2472, 1805, 738, 740, 173, -1680, -3750, -3666, -2539, +-2654, -3337, -3307, -3387, -2576, -958, -921, -1393, -2445, -2201, -556, -310, -1246, -826, 1519, 4017, +5243, 6191, 7936, 9215, 9735, 9775, 8298, 5557, 2213, -814, -2570, -4362, -4999, -5762, -6416, -5930, +-4384, -2681, -973, -195, -796, -626, 101, 774, 2083, 2372, 1591, 946, 1268, 640, -1834, -3590, +-3143, -2933, -3069, -2925, -3897, -3751, -2681, -1409, -769, -1736, -2779, -1987, -743, -808, -1784, -1287, +1124, 3148, 4119, 5798, 7293, 8574, 9679, 9910, 9134, 6200, 3328, 480, -2136, -3561, -4396, -5721, +-6435, -5998, -5125, -3045, -1093, -750, -666, -682, -301, 677, 2032, 2244, 1324, 1242, 2100, 737, +-1829, -2632, -3260, -3058, -2791, -3260, -3872, -4042, -3076, -1232, -961, -2073, -2742, -1859, -742, -1154, +-2287, -1244, 556, 2184, 3670, 5106, 6937, 7932, 9431, 10403, 9378, 7217, 4585, 1360, -1224, -2522, +-4087, -5332, -6092, -6553, -5325, -3356, -1691, -858, -641, -827, -565, 614, 2168, 1816, 983, 2175, +2220, 871, -947, -2517, -3002, -2859, -2881, -3012, -4008, -4429, -3071, -1268, -1170, -2233, -2816, -1387, +-871, -1698, -2166, -1605, 167, 1479, 2967, 4788, 6045, 7487, 9349, 10271, 9781, 8394, 5423, 2389, +79, -2015, -3262, -4616, -6092, -6569, -5488, -3846, -2112, -1020, -552, -1102, -975, 1131, 1689, 1167, +1547, 2176, 2372, 1414, -646, -2023, -2761, -2880, -2612, -2963, -4335, -4596, -3338, -1218, -1467, -2701, +-2338, -1458, -1080, -1880, -2366, -1624, -586, 848, 2572, 3953, 5205, 7200, 8725, 9989, 10434, 8745, +6331, 3594, 812, -1179, -2386, -4221, -5865, -6623, -5757, -4380, -2807, -764, -970, -1771, -453, 838, +1094, 1164, 1402, 2264, 2607, 1601, -77, -1616, -2712, -2526, -2557, -2919, -4538, -5066, -3023, -1630, +-1983, -2753, -2329, -1285, -1419, -2071, -2238, -1995, -1249, 591, 1834, 3072, 4923, 6316, 8127, 9984, +10413, 9248, 7360, 4434, 1814, -216, -1603, -3560, -5740, -6140, -6078, -5278, -2561, -1189, -1674, -1560, +-488, 566, 888, 826, 1373, 2345, 2530, 2156, 330, -1290, -2366, -2491, -1907, -3061, -4865, -4905, +-3184, -1849, -2381, -2854, -2048, -1353, -1710, -1806, -2317, -2473, -1242, -33, 1166, 2710, 4130, 5569, +7807, 9489, 10486, 9840, 8068, 5443, 2581, 1043, -679, -3275, -4638, -6025, -6750, -5173, -2802, -1815, +-1829, -1658, -546, 483, 390, 778, 1252, 2194, 2794, 2208, 1059, -1065, -2269, -1804, -1754, -3176, +-4958, -4920, -3230, -2278, -2920, -2688, -2092, -1804, -1478, -1943, -2584, -2442, -1740, -744, 825, 1881, +3304, 4950, 6965, 9049, 10134, 10254, 8742, 5747, 3952, 1991, -364, -2073, -3941, -6292, -6777, -5341, +-3332, -2189, -2374, -1693, -686, 102, 359, 258, 1201, 1981, 2591, 2822, 1311, -964, -1853, -1341, +-1522, -3215, -5116, -4605, -3351, -3012, -2874, -2761, -2394, -1624, -1515, -2170, -2302, -2660, -2189, -990, +190, 1402, 2539, 4296, 6415, 8018, 10250, 10589, 8736, 6875, 5063, 2442, 717, -907, -3470, -5833, +-6772, -5306, -3649, -2832, -2354, -1991, -664, 30, -35, 403, 963, 1669, 2841, 3219, 1563, -555, +-1438, -614, -1177, -3441, -4613, -4356, -3791, -3091, -2973, -3114, -2199, -1658, -1698, -1888, -2385, -2664, +-2443, -1341, -7, 500, 2145, 3840, 5194, 7696, 10225, 10204, 9310, 7933, 5550, 3463, 1771, 238, +-2636, -5574, -6198, -5427, -3869, -3035, -2808, -1814, -722, -244, 65, 365, 567, 1666, 2941, 3564, +1889, -425, -580, 44, -1235, -3045, -4140, -4501, -3702, -3271, -3388, -2972, -2402, -1744, -1664, -1902, +-2129, -2999, -2546, -1423, -880, 166, 1838, 2645, 4482, 7410, 9297, 10162, 9688, 8467, 6288, 4085, +3064, 1042, -1978, -4843, -6121, -5305, -4186, -3703, -2985, -1944, -1206, -253, -31, 72, 242, 1253, +3161, 3731, 1621, 18, 156, 64, -912, -2709, -4210, -4195, -3951, -3653, -3585, -3321, -2461, -2118, +-1724, -1654, -2549, -3027, -2422, -2238, -1345, 163, 767, 1915, 3847, 6468, 8704, 9772, 10161, 8713, +6656, 5153, 3851, 2013, -1089, -4414, -5608, -5141, -4783, -3978, -3249, -2358, -1388, -496, -30, -159, +-447, 1171, 3409, 3326, 1771, 645, 303, 602, -644, -2511, -3743, -4143, -3897, -4003, -3809, -3254, +-2957, -2257, -1336, -1979, -2626, -2486, -2987, -2528, -1343, -419, 231, 1151, 3356, 5515, 7785, 9790, +10115, 8910, 7295, 5778, 4861, 3150, -475, -3501, -4948, -5156, -4891, -4300, -3506, -2606, -1825, -486, +134, -822, -745, 1419, 3022, 3368, 2001, 922, 994, 910, -157, -2114, -3330, -3611, -4047, -4182, +-3510, -3633, -3279, -1775, -1697, -1992, -2057, -2594, -3021, -2741, -1361, -792, -409, 928, 2574, 4502, +7313, 9386, 10044, 9269, 7504, 6633, 5901, 3858, 531, -2576, -4373, -4900, -5072, -4512, -3655, -3333, +-2099, -156, -364, -1140, -837, 1046, 2952, 3061, 2093, 1237, 1277, 1375, 57, -1851, -2591, -3530, +-4260, -3714, -4007, -4065, -3047, -2193, -1828, -1960, -1871, -2652, -3298, -2617, -1722, -1445, -627, 302, +1588, 3758, 6334, 8923, 9961, 9011, 7822, 7302, 6568, 4683, 1466, -1640, -3503, -4826, -5098, -4299, +-4385, -3752, -1979, -482, -524, -1511, -1050, 905, 2612, 2928, 2094, 1359, 1862, 1587, 62, -842, +-2362, -3549, -3670, -3993, -4242, -4137, -3177, -2480, -2097, -1642, -1819, -2897, -3013, -2694, -2206, -1515, +-1065, -263, 988, 2676, 5586, 8507, 9552, 8881, 8093, 7755, 7353, 5354, 2348, -269, -3129, -4492, +-4517, -4687, -4813, -4096, -2150, -623, -890, -1755, -1222, 548, 2481, 2674, 1670, 2063, 2025, 1472, +963, -541, -2089, -3023, -3383, -4043, -4459, -4026, -3375, -3001, -1882, -1489, -2070, -2562, -2948, -2899, +-2199, -1818, -1296, -573, 199, 1832, 4948, 7836, 9189, 8667, 8128, 8543, 7653, 5986, 3767, 461, +-2418, -3776, -4203, -4809, -5257, -4403, -2283, -979, -1093, -1852, -1812, 651, 2097, 1913, 2108, 2080, +1927, 1874, 1357, -204, -1761, -2470, -3154, -4342, -4291, -4061, -4051, -3057, -1978, -1793, -1950, -2567, +-2980, -2919, -2532, -2075, -1407, -1122, -545, 1035, 3966, 7420, 8416, 8179, 8538, 8524, 7963, 6920, +4669, 1285, -1626, -3066, -3777, -5010, -5616, -4474, -2864, -1014, -1329, -2571, -1552, 365, 1398, 1825, +2107, 2042, 1996, 2255, 1771, -13, -1047, -1822, -3246, -3943, -4091, -4432, -4096, -3213, -2209, -1731, +-1926, -2486, -2736, -3012, -2731, -2035, -1727, -1303, -1282, 120, 3589, 6438, 7641, 8138, 8423, 8462, +8394, 7658, 5562, 2110, -784, -1966, -3585, -4821, -5631, -5138, -2706, -1253, -1996, -2518, -1580, -88, +959, 1667, 2014, 1780, 2221, 2643, 1636, 607, -319, -1718, -2806, -3622, -4198, -4487, -4267, -3552, +-2328, -1902, -2052, -2205, -2856, -2993, -2884, -2295, -1504, -1862, -2061, -275, 2763, 5387, 7106, 7808, +8166, 8441, 8649, 8524, 6063, 3051, 540, -1420, -2721, -4536, -6104, -5036, -2762, -1778, -2253, -2459, +-1657, -597, 731, 1680, 1472, 1867, 2615, 2446, 2029, 1285, 45, -1228, -2243, -3362, -3990, -4479, +-4535, -3544, -2661, -1979, -1961, -2293, -2494, -3159, -3145, -2035, -1599, -2438, -2394, -809, 1815, 4567, +6377, 7560, 7577, 8262, 9202, 8628, 6830, 4090, 1187, -256, -1900, -4568, -6071, -4941, -2995, -2376, +-2473, -2294, -2201, -869, 746, 988, 1256, 2023, 2403, 2419, 2424, 1603, 484, -705, -1935, -2845, +-3938, -4497, -4511, -3972, -2748, -2193, -2131, -1972, -2439, -3471, -2981, -1914, -1950, -2651, -2839, -1239, +859, 3590, 6033, 6674, 7140, 8335, 9005, 9092, 7549, 4581, 2281, 943, -1218, -4376, -5861, -4663, +-3533, -2720, -2276, -2766, -2405, -833, 274, 570, 1277, 1845, 2285, 2621, 2526, 2123, 894, -227, +-1214, -2579, -3558, -4384, -4685, -3984, -2969, -2608, -1916, -1736, -2702, -3376, -2950, -1809, -2074, -2931, +-2778, -2027, 38, 3150, 5090, 6093, 6883, 7842, 9127, 9542, 7931, 5261, 3439, 2296, -707, -3930, +-5061, -4861, -3760, -2605, -2544, -2992, -2222, -1063, -137, 556, 1047, 1817, 2244, 2609, 2924, 2348, +1481, 397, -751, -1956, -3123, -4425, -4485, -3964, -3527, -2588, -1814, -1720, -2727, -3465, -2612, -2031, +-2272, -2667, -3271, -2651, -404, 2153, 4311, 5527, 6138, 7379, 9080, 9759, 7891, 5754, 4852, 2974, +-125, -3019, -4839, -5069, -3715, -2948, -3108, -2971, -2491, -1401, -484, 135, 888, 1401, 2103, 2596, +2810, 2571, 1936, 644, -187, -1359, -3164, -4105, -4373, -4373, -3902, -2904, -1685, -1966, -3019, -3134, +-2835, -2299, -1998, -2899, -3617, -2957, -1209, 1338, 3566, 4902, 5303, 6853, 9305, 9419, 7828, 6762, +5736, 3639, 983, -2227, -4653, -4657, -3821, -3287, -3248, -3154, -2540, -1793, -774, -32, 503, 1156, +2080, 2365, 2844, 2956, 1974, 1259, 503, -1048, -2704, -3809, -4137, -4631, -4361, -2687, -1867, -2280, +-2698, -3174, -2959, -2076, -2041, -2938, -3780, -3297, -1904, 524, 3167, 3879, 4393, 6821, 8981, 8844, +8138, 7427, 6250, 4791, 1919, -1596, -3987, -4398, -3756, -3554, -3412, -3154, -2774, -2076, -900, -370, +199, 1185, 1656, 2341, 3046, 2881, 2401, 1813, 1111, -507, -2283, -3026, -3979, -4955, -4169, -2807, +-2141, -2073, -2708, -3147, -2895, -1962, -1965, -2940, -3537, -3768, -2586, 347, 2443, 2739, 4028, 6617, +8229, 8778, 8282, 7673, 7095, 5718, 2896, -762, -3277, -3941, -3779, -3713, -3423, -3343, -3060, -2071, +-1392, -670, 153, 646, 1454, 2258, 2863, 2881, 2509, 2408, 1497, -298, -1419, -2585, -4131, -4827, +-4405, -3105, -2259, -2151, -2827, -3340, -2728, -2126, -2151, -2589, -3712, -4521, -2833, -54, 1075, 1971, +3518, 5774, 7692, 8354, 8084, 7817, 7664, 6521, 3690, 73, -2414, -3571, -3862, -3548, -3678, -3591, +-2972, -2537, -1687, -800, -211, 367, 1145, 2175, 2665, 2576, 3009, 2811, 1571, 481, -776, -2242, +-3844, -4756, -4532, -3449, -2214, -2280, -3075, -3091, -2750, -2471, -1842, -2175, -4285, -4628, -2806, -854, +332, 1339, 2914, 5169, 7209, 7961, 7858, 7997, 8304, 7265, 4402, 1280, -1618, -3212, -3351, -3676, +-3822, -3521, -3225, -2749, -1930, -971, -434, -104, 1161, 2051, 2126, 2825, 3291, 2907, 2021, 1151, +-67, -1817, -3331, -4585, -4762, -3351, -2234, -2602, -2912, -2773, -3184, -2318, -1250, -2317, -4285, -4460, +-2959, -1389, -242, 748, 2340, 4654, 6757, 7533, 7492, 8335, 8778, 7757, 5628, 2285, -743, -2323, +-3043, -3526, -3703, -3514, -3232, -3022, -1934, -1074, -1029, -69, 1093, 1577, 1987, 2855, 3398, 2973, +2516, 1770, 389, -1117, -2839, -4657, -4723, -3210, -2789, -2678, -2576, -3243, -3379, -2025, -1199, -2479, +-4201, -4451, -3258, -1907, -942, 37, 1537, 4134, 6113, 6618, 7297, 8170, 8752, 8408, 6301, 3111, +197, -1750, -2710, -3523, -3647, -3543, -3765, -3055, -2101, -1717, -1241, -264, 702, 1051, 1800, 2748, +3127, 3087, 2855, 2015, 998, -258, -2767, -4478, -4314, -3754, -3125, -2479, -2767, -3690, -3356, -1927, +-1333, -2489, -4147, -4438, -3582, -2299, -1548, -947, 1077, 3497, 5130, 6125, 6810, 7805, 8922, 8759, +6997, 3986, 1208, -856, -2513, -3087, -3385, -3873, -3692, -3009, -2379, -2091, -1288, -364, 252, 846, +1741, 2466, 3048, 3442, 2830, 2411, 2085, 114, -2367, -3730, -4233, -4120, -2985, -2307, -3064, -3798, +-3272, -1825, -1403, -2386, -3879, -4549, -3489, -2520, -2365, -1357, 600, 2726, 4597, 5552, 6378, 7553, +8953, 9271, 7525, 5116, 2438, -261, -1749, -2460, -3220, -3876, -3492, -2969, -2735, -2201, -1251, -628, +-55, 878, 1362, 2159, 3369, 3254, 2846, 3220, 2675, 487, -1535, -3091, -4365, -4139, -2869, -2351, +-3346, -3955, -3166, -2050, -1367, -2226, -4061, -4345, -3477, -3140, -2848, -1943, -64, 2044, 3787, 4943, +5573, 7140, 8906, 9088, 8058, 6065, 3228, 446, -977, -2029, -3251, -3757, -3358, -3228, -3133, -2213, +-1588, -1111, -78, 364, 818, 2197, 3071, 2748, 3042, 3667, 2788, 1085, -774, -2795, -4417, -4185, +-2784, -2703, -3602, -4003, -3547, -2090, -1325, -2549, -3897, -4141, -3666, -3445, -3381, -2392, -800, 1375, +3251, 4014, 4985, 6787, 8448, 9019, 8622, 6843, 3946, 1443, -121, -1640, -3086, -3323, -3334, -3522, +-2991, -2477, -2001, -1014, -326, -199, 763, 2193, 2498, 2679, 3375, 3799, 3170, 1873, 95, -2464, +-4203, -3795, -2924, -2753, -3520, -4379, -3529, -1981, -1586, -2534, -3722, -3877, -3780, -3713, -3584, -3054, +-1316, 940, 2446, 3263, 4530, 6266, 7877, 9051, 9063, 7401, 4736, 2620, 670, -1317, -2376, -3019, +-3458, -3282, -3025, -2892, -1961, -927, -916, -391, 886, 1791, 2145, 2691, 3508, 3788, 3548, 2866, +669, -2030, -3571, -3763, -2816, -2589, -3837, -4469, -3501, -1963, -1764, -2557, -3331, -3809, -3730, -3664, +-3987, -3556, -1658, 388, 1610, 2704, 3999, 5530, 7283, 9045, 9232, 7627, 5815, 3600, 1173, -514, +-1779, -2974, -3231, -3030, -3489, -3050, -1783, -1358, -1308, -444, 734, 1306, 1766, 2772, 3240, 3605, +4189, 3363, 1227, -1305, -3366, -3526, -2651, -2675, -4088, -4638, -3426, -2286, -2021, -2457, -3289, -3754, +-3570, -3805, -4467, -3862, -2065, -324, 893, 2201, 3355, 4550, 6904, 8803, 8947, 8174, 6712, 4229, +1985, 407, -1516, -2633, -2687, -3251, -3718, -2934, -1915, -1765, -1619, -437, 356, 719, 1778, 2423, +2806, 3750, 4339, 3912, 1964, -792, -2979, -3193, -2321, -2822, -4239, -4524, -3552, -2543, -2058, -2464, +-3295, -3443, -3409, -3996, -4692, -4063, -2488, -1139, 452, 1680, 2362, 3934, 6428, 8098, 8751, 8723, +7143, 4954, 3132, 885, -1074, -1908, -2465, -3370, -3724, -2797, -2171, -2240, -1486, -669, -156, 692, +1461, 2047, 2637, 3606, 4550, 4478, 2755, -308, -2455, -2511, -2125, -2897, -4092, -4440, -3755, -2531, +-2087, -2578, -3104, -3084, -3190, -4161, -4598, -4129, -3137, -1501, 178, 929, 1684, 3583, 5643, 7439, +8902, 8784, 7546, 6060, 3907, 1448, -303, -1178, -2251, -3495, -3356, -2849, -2686, -2181, -1683, -1117, +-359, 413, 1119, 1667, 2342, 3260, 4596, 5077, 3202, 75, -1739, -1949, -2102, -2790, -4006, -4606, +-3838, -2646, -2288, -2847, -2887, -2780, -3375, -4110, -4484, -4585, -3669, -1711, -480, 86, 1353, 2795, +4635, 7061, 8481, 8561, 8046, 6862, 4544, 1953, 690, -571, -2299, -3033, -3154, -3136, -2727, -2250, +-1912, -1363, -480, 162, 835, 1491, 1885, 2880, 4827, 5563, 3508, 759, -913, -1524, -1768, -2575, +-3882, -4673, -3785, -2644, -2689, -2877, -2579, -2740, -3328, -3726, -4529, -5010, -3657, -2093, -1228, -128, +819, 1932, 4047, 6509, 7969, 8350, 8663, 7557, 4878, 3018, 1644, -237, -1795, -2609, -3080, -3183, +-2723, -2399, -2121, -1458, -740, -99, 729, 1203, 1225, 2668, 5024, 5674, 3962, 1466, -191, -1026, +-1350, -2239, -3896, -4508, -3581, -2900, -2947, -2658, -2467, -2813, -2837, -3473, -4780, -4813, -3772, -2647, +-1465, -436, 268, 1253, 3571, 5904, 7083, 8447, 9083, 7716, 5653, 4021, 2322, 351, -1154, -2260, +-2945, -3032, -2800, -2561, -2205, -1632, -1156, -161, 701, 596, 715, 2429, 4881, 5661, 4314, 2122, +297, -429, -828, -2180, -3874, -4226, -3637, -3380, -2967, -2691, -2887, -2534, -2579, -3661, -4633, -4813, +-4175, -3143, -1794, -872, -634, 790, 2977, 4641, 6451, 8338, 8913, 7905, 6390, 4709, 2908, 1066, +-652, -1967, -2716, -2939, -3045, -2648, -2241, -2160, -1425, -159, 406, 17, 250, 2136, 4487, 5641, +4714, 2512, 850, 351, -370, -2148, -3436, -3832, -4004, -3367, -2934, -3144, -2809, -2272, -2555, -3602, +-4438, -4753, -4671, -3315, -1936, -1702, -1052, 518, 2018, 3635, 5964, 7908, 8620, 8224, 6936, 5311, +3634, 1860, -179, -1510, -2265, -3037, -3039, -2505, -2478, -2527, -1501, -109, 45, -425, -67, 1652, +4089, 5653, 4908, 2716, 1578, 1165, -283, -1720, -2878, -3979, -3938, -3320, -3277, -3376, -2777, -2127, +-2677, -3370, -4078, -5106, -4812, -3286, -2520, -2271, -1172, 11, 1071, 2945, 5351, 7330, 8398, 8489, +7346, 5951, 4535, 2455, 519, -765, -1963, -2873, -2762, -2366, -2777, -2746, -1399, -183, -156, -625, +-376, 1119, 3837, 5733, 4764, 3243, 2577, 1530, 312, -1011, -2612, -3680, -3671, -3245, -3584, -3451, +-2553, -2355, -2526, -2838, -4101, -5217, -4577, -3535, -3130, -2442, -1404, -567, 336, 2260, 4550, 6648, +8178, 8345, 7627, 6647, 5080, 3081, 1327, -176, -1770, -2651, -2429, -2507, -3095, -2911, -1492, -424, +-356, -800, -1090, 611, 3692, 5071, 4687, 3812, 2868, 1994, 893, -558, -2424, -3427, -3340, -3598, +-3839, -3336, -2890, -2603, -2124, -2723, -4289, -4970, -4546, -3969, -3525, -2611, -1771, -1176, -165, 1376, +3663, 6079, 7584, 8079, 7944, 7098, 5479, 3787, 2196, 212, -1491, -2225, -2194, -2650, -3302, -2910, +-1799, -608, -226, -1393, -1576, 493, 3011, 4586, 4741, 4097, 3189, 2546, 1670, -299, -2086, -2777, +-3285, -3839, -3633, -3451, -3325, -2418, -1919, -2817, -4153, -4632, -4600, -4357, -3608, -2879, -2169, -1432, +-789, 561, 2981, 5369, 6888, 7882, 8241, 7308, 5939, 4657, 2958, 676, -1059, -1559, -2004, -2740, +-3112, -3222, -2029, -301, -516, -1743, -1683, 134, 2392, 4166, 4850, 4165, 3543, 3410, 2221, 45, +-1231, -2198, -3294, -3498, -3469, -3772, -3398, -2160, -1835, -2838, -3721, -4364, -4716, -4364, -3811, -3167, +-2319, -1768, -1441, -93, 2340, 4404, 6160, 7683, 8164, 7379, 6355, 5487, 3525, 994, -294, -1224, +-1953, -2405, -3428, -3574, -1968, -436, -854, -2019, -1822, -460, 1666, 3824, 4497, 3910, 4034, 3904, +2312, 709, -586, -2048, -3044, -3215, -3626, -4172, -3382, -2202, -2089, -2655, -3488, -4304, -4639, -4493, +-4144, -3366, -2447, -2252, -1967, -561, 1473, 3462, 5497, 7373, 7922, 7270, 7043, 6101, 3909, 1879, +145, -855, -1368, -2328, -3661, -3674, -1895, -681, -1133, -1986, -2096, -1142, 1282, 3378, 3744, 4018, +4440, 4002, 2790, 1472, -119, -1733, -2442, -2899, -3871, -4124, -3367, -2420, -2084, -2473, -3336, -4066, +-4431, -4726, -4355, -3360, -2777, -2662, -2285, -1055, 639, 2436, 4995, 6832, 7262, 7531, 7352, 6403, +4686, 2439, 584, -230, -799, -2299, -3795, -3521, -1959, -1055, -1083, -1917, -2665, -1368, 980, 2505, +3336, 4161, 4507, 4141, 3495, 2196, 213, -1023, -1764, -2785, -3756, -3967, -3447, -2510, -1941, -2399, +-3100, -3583, -4376, -4806, -4268, -3417, -2957, -2972, -2328, -1440, -384, 1972, 4388, 5977, 7034, 7535, +7524, 6977, 5421, 2943, 1174, 621, -265, -2309, -3601, -3288, -2365, -1060, -882, -2287, -2855, -1437, +358, 1676, 3052, 4092, 4264, 4473, 4129, 2506, 757, -249, -1298, -2564, -3495, -3971, -3568, -2469, +-2086, -2405, -2707, -3363, -4305, -4889, -4219, -3481, -3494, -2933, -2471, -2235, -962, 1300, 3475, 5248, +6588, 7218, 7576, 7440, 5865, 3222, 1833, 1454, -125, -2067, -3246, -3587, -2513, -942, -1072, -2553, +-2795, -1607, -455, 1123, 2760, 3590, 4157, 4831, 4411, 2824, 1434, 358, -865, -2081, -3361, -4012, +-3458, -2671, -2261, -2345, -2420, -3059, -4460, -4649, -4106, -3934, -3517, -2890, -2819, -2665, -1412, 531, +2671, 4581, 6008, 6818, 7719, 7952, 6001, 3748, 2857, 1887, 338, -1477, -3168, -3713, -2374, -912, +-1442, -2515, -2618, -2071, -985, 740, 2159, 3067, 4183, 4975, 4530, 3374, 2030, 880, -123, -1718, +-3151, -3790, -3436, -2731, -2573, -2081, -2025, -3168, -4145, -4328, -4305, -4079, -3409, -3000, -2998, -2888, +-1885, -140, 2015, 4034, 5134, 6451, 8079, 7911, 6229, 4586, 3460, 2441, 1139, -885, -3162, -3511, +-2092, -1181, -1545, -2191, -2659, -2412, -1192, 295, 1419, 2772, 4102, 4832, 4861, 3750, 2527, 1621, +436, -1205, -2978, -3470, -3276, -3215, -2614, -1845, -2111, -3070, -3746, -4309, -4434, -4111, -3504, -3177, +-3216, -3063, -2531, -831, 1596, 2943, 4209, 6314, 7839, 7718, 6577, 5164, 3793, 3102, 1982, -684, +-3022, -3129, -2195, -1537, -1476, -2107, -2921, -2574, -1464, -506, 837, 2247, 3669, 4774, 4816, 4026, +2880, 2244, 1157, -982, -2527, -2992, -3452, -3448, -2490, -1935, -2174, -2786, -3533, -4280, -4567, -4093, +-3677, -3407, -3111, -3539, -3162, -1102, 784, 1798, 3522, 5917, 7302, 7606, 6949, 5325, 4199, 4024, +2564, -405, -2506, -2830, -2409, -1610, -1305, -2252, -2838, -2602, -1899, -918, 161, 1778, 3301, 4563, +4922, 4048, 3378, 3036, 1514, -541, -1758, -2772, -3555, -3398, -2546, -2010, -2143, -2463, -3303, -4301, +-4314, -4227, -3885, -3171, -3246, -3962, -3261, -1346, -90, 988, 3045, 5232, 6856, 7779, 7045, 5494, +5006, 4881, 3054, 260, -1711, -2680, -2209, -1391, -1374, -2023, -2726, -2515, -2017, -1319, -212, 1211, +3011, 4564, 4717, 4207, 4175, 3532, 1959, 325, -1117, -2429, -3403, -3245, -2563, -2230, -1867, -2280, +-3229, -3909, -4342, -4480, -3732, -3089, -3659, -4175, -3235, -1919, -957, 421, 2190, 4327, 6572, 7623, +6742, 5676, 5712, 5199, 3599, 1068, -1403, -2347, -2137, -1446, -1398, -2041, -2559, -2622, -2252, -1612, +-926, 534, 2792, 4065, 4249, 4504, 4476, 3792, 2448, 1019, -535, -2302, -3097, -3230, -2900, -2171, +-1863, -2343, -2904, -3654, -4584, -4497, -3461, -3276, -3998, -4005, -3360, -2506, -1358, -181, 1209, 3648, +6396, 7041, 6466, 6108, 5948, 5736, 4276, 1678, -845, -2047, -1901, -1458, -1449, -1825, -2483, -2663, +-2130, -2005, -1634, 314, 2361, 3473, 4045, 4654, 4809, 3988, 3163, 1800, -139, -1676, -2721, -3307, +-2847, -2103, -2050, -2181, -2428, -3627, -4762, -4195, -3424, -3651, -3980, -3928, -3686, -2890, -1594, -1125, +248, 3243, 5622, 6511, 6315, 6129, 6243, 6145, 4945, 2341, -318, -1552, -1700, -1521, -1284, -1781, +-2557, -2308, -2195, -2502, -1964, -83, 1846, 2816, 3904, 4773, 4731, 4429, 3820, 2288, 581, -993, +-2495, -3123, -2660, -2279, -2227, -1704, -2137, -3774, -4502, -3937, -3560, -3797, -3747, -4078, -3917, -2743, +-2202, -1910, -335, 2526, 4958, 5942, 6046, 6092, 6371, 6554, 5490, 2874, 378, -1063, -1666, -1256, +-1302, -1938, -2260, -2134, -2321, -2909, -2229, -446, 995, 2316, 3688, 4415, 4739, 4796, 4117, 2869, +1367, -515, -2261, -2686, -2629, -2707, -2074, -1428, -2172, -3785, -4157, -3998, -3846, -3567, -4015, -4361, +-3802, -2988, -2785, -2587, -1035, 1738, 4164, 5367, 5666, 5833, 6497, 6932, 5776, 3687, 1050, -791, +-1183, -1087, -1375, -1957, -1949, -1886, -2593, -3023, -2290, -1085, 378, 1953, 3155, 4130, 4838, 4930, +4356, 3646, 2076, -182, -1559, -2241, -2792, -2853, -1726, -1345, -2307, -3246, -4020, -4096, -3559, -3585, +-4202, -4302, -3645, -3106, -3182, -3045, -1582, 960, 3477, 4870, 5035, 5748, 6598, 6939, 6393, 4359, +1632, -243, -665, -825, -1527, -1764, -1464, -1883, -2620, -2829, -2557, -1568, -6, 1460, 2591, 3967, +4811, 4798, 4881, 4329, 2548, 453, -629, -1878, -3036, -2502, -1603, -1466, -1895, -2964, -3939, -3868, +-3344, -3654, -4295, -4186, -3493, -3229, -3470, -3302, -2290, 393, 2933, 4034, 4681, 5492, 6421, 7103, +6877, 5008, 2168, 418, -26, -833, -1562, -1369, -1328, -1877, -2469, -2801, -2884, -1894, -457, 661, +2211, 3667, 4364, 4698, 5320, 4723, 2751, 1417, 27, -1905, -2772, -2447, -1805, -1433, -1698, -2946, +-3874, -3711, -3325, -3841, -4483, -4060, -3637, -3381, -3630, -3965, -2782, -290, 2001, 3307, 4092, 5005, +6068, 7117, 7258, 5271, 2656, 1272, 266, -839, -1387, -1164, -1326, -1721, -2244, -2987, -2913, -2109, +-1101, 80, 1862, 3162, 3741, 4914, 5571, 4654, 3479, 2258, 420, -1515, -2473, -2531, -1842, -1306, +-1664, -2895, -3759, -3399, -3445, -4023, -4424, -4255, -3538, -3349, -3977, -4279, -3193, -974, 1200, 2615, +3577, 4354, 5667, 7313, 7322, 5550, 3455, 2032, 567, -591, -1026, -1188, -1108, -1431, -2213, -2891, +-2800, -2392, -1792, -142, 1468, 2267, 3584, 4995, 5370, 4880, 4231, 2864, 1030, -889, -2232, -2444, +-1814, -1064, -1671, -2818, -3294, -3333, -3346, -3922, -4543, -4164, -3344, -3367, -4112, -4462, -3458, -1590, +504, 2235, 2867, 3716, 5553, 7333, 7288, 5974, 4427, 2611, 1103, -66, -837, -954, -742, -1157, +-2191, -2503, -2596, -2927, -1949, -335, 666, 1696, 3472, 4648, 5171, 5223, 4693, 3502, 1646, -261, +-2039, -2450, -1528, -1176, -1736, -2588, -3195, -3211, -3265, -4086, -4668, -4179, -3318, -3493, -4367, -4518, +-3984, -2341, -47, 1546, 1932, 3011, 5305, 6842, 7110, 6377, 4902, 3141, 1597, 291, -793, -697, +-475, -1357, -1897, -2128, -2891, -3181, -1964, -944, -114, 1273, 2943, 4241, 4900, 5361, 5008, 3960, +2525, 188, -1790, -2086, -1453, -1198, -1630, -2501, -2935, -2972, -3198, -4127, -4756, -3980, -3354, -3593, +-4248, -4624, -4435, -2820, -410, 691, 1123, 2611, 4753, 6372, 6990, 6698, 5318, 3811, 2286, 408, +-392, -256, -584, -1251, -1331, -2083, -3048, -2989, -2245, -1452, -679, 833, 2448, 3672, 4796, 5253, +5154, 4668, 3118, 606, -1325, -1890, -1383, -1167, -1685, -2421, -2800, -2656, -3223, -4270, -4660, -4000, +-3495, -3585, -4056, -4917, -4802, -2961, -1011, -68, 507, 2116, 4099, 5937, 6981, 6668, 5876, 4657, +2649, 815, 340, -99, -579, -607, -1039, -1942, -2797, -2760, -2320, -1904, -903, 382, 1871, 3465, +4539, 5095, 5584, 5259, 3792, 1328, -767, -1412, -1155, -916, -1618, -2269, -2312, -2353, -3147, -4164, +-4373, -4071, -3530, -3204, -4067, -5092, -4860, -3112, -1607, -741, 93, 1336, 3456, 5564, 6504, 6607, +6551, 5085, 2917, 1652, 687, -75, -338, -260, -822, -1914, -2470, -2645, -2634, -2100, -1335, -290, +1460, 2949, 3981, 4874, 5656, 5717, 4265, 1945, -283, -1139, -869, -932, -1739, -2194, -1963, -2293, +-3229, -3916, -4496, -4284, -3472, -3094, -4254, -5298, -4796, -3541, -2200, -1229, -609, 553, 2994, 4837, +5744, 6828, 6762, 5254, 3507, 2234, 940, -59, -38, -46, -854, -1652, -2208, -2747, -2642, -2366, +-1874, -737, 886, 2391, 3376, 4568, 5687, 5952, 4846, 2477, 200, -713, -518, -963, -1845, -1822, +-1817, -2250, -2992, -3757, -4644, -4422, -3230, -3163, -4361, -5200, -4897, -3929, -2473, -1750, -1475, 223, +2265, 3832, 5398, 6768, 6796, 5509, 4187, 2800, 1105, 271, 329, -29, -578, -1354, -2055, -2485, +-2639, -2564, -2267, -1139, 439, 1752, 2894, 4200, 5636, 6251, 5395, 3027, 726, 79, -236, -938, +-1588, -1555, -1665, -2032, -2527, -3724, -4684, -4198, -3117, -3270, -4187, -5036, -5131, -3837, -2795, -2494, +-1768, -223, 1396, 3031, 5036, 6536, 6611, 5895, 4877, 3059, 1521, 651, 414, 202, -396, -1172, +-1872, -2280, -2594, -2858, -2540, -1575, -109, 1095, 2251, 3653, 5294, 6501, 5644, 3386, 1439, 625, +-89, -886, -1317, -1582, -1631, -1670, -2326, -3877, -4641, -4074, -3419, -3161, -4132, -5336, -5052, -3943, +-3404, -3062, -2098, -864, 382, 2262, 4561, 5842, 6475, 6278, 5123, 3488, 1921, 959, 620, 408, +-151, -1038, -1542, -2059, -2550, -2995, -2774, -1877, -699, 614, 1513, 2984, 5142, 6546, 5765, 3812, +2295, 1058, 114, -550, -1121, -1647, -1393, -1181, -2348, -3667, -4381, -4235, -3250, -2995, -4269, -5256, +-4801, -4080, -3846, -3308, -2244, -1633, -336, 1788, 3739, 5296, 6355, 6441, 5457, 3902, 2380, 1192, +909, 598, -8, -816, -1279, -1729, -2528, -2957, -2947, -2233, -989, 51, 757, 2390, 5015, 6357, +5825, 4436, 3018, 1513, 591, -5, -1180, -1469, -916, -1045, -2017, -3316, -4366, -4051, -2979, -2977, +-4258, -4944, -4449, -4312, -3995, -3167, -2625, -2081, -760, 1165, 3072, 4830, 6270, 6531, 5908, 4430, +2900, 1729, 1272, 972, 188, -397, -856, -1425, -2205, -2841, -3029, -2380, -1119, -584, 27, 1976, +4647, 6010, 5891, 5092, 3406, 2068, 1317, 152, -1014, -1121, -813, -753, -1617, -3216, -4274, -3822, +-2805, -3205, -4222, -4503, -4584, -4483, -3982, -3357, -3004, -2531, -1255, 345, 2322, 4193, 5838, 6561, +6075, 4813, 3203, 2166, 1590, 1078, 390, -155, -613, -1171, -1897, -2913, -3150, -2339, -1430, -1270, +-637, 1619, 3936, 5590, 6144, 5258, 3831, 2860, 1709, 411, -656, -1023, -632, -384, -1286, -3203, +-4135, -3410, -3008, -3361, -3927, -4378, -4671, -4517, -3948, -3627, -3245, -2824, -1838, -303, 1512, 3547, +5326, 6482, 6264, 5046, 3620, 2598, 1886, 1238, 686, -3, -384, -738, -1745, -2959, -3166, -2217, +-1935, -1957, -1018, 804, 3114, 5345, 5898, 5283, 4409, 3368, 2124, 772, -411, -992, -473, 103, +-1268, -3133, -3653, -3283, -3155, -3347, -3665, -4396, -4639, -4444, -4079, -3744, -3489, -3043, -2334, -922, +812, 2788, 4868, 6316, 6337, 5267, 4167, 3033, 2228, 1642, 901, 226, 7, -202, -1579, -2884, +-2705, -2220, -2326, -2098, -1536, 31, 2658, 4864, 5624, 5436, 4872, 3892, 2630, 1399, -298, -853, +43, 297, -1190, -2810, -3207, -3310, -3175, -3158, -3602, -4259, -4584, -4346, -4118, -3823, -3582, -3296, +-2684, -1499, 71, 1959, 4368, 5958, 6222, 5531, 4438, 3389, 2565, 1937, 973, 327, 523, 12, +-1650, -2469, -2516, -2431, -2360, -2473, -2187, -618, 1984, 4203, 5158, 5533, 5025, 4266, 3355, 1664, +-204, -532, 446, 311, -988, -2328, -2984, -3146, -3106, -3020, -3496, -4144, -4447, -4315, -4093, -3865, +-3636, -3506, -2890, -2044, -687, 1333, 3716, 5554, 6132, 5722, 4746, 3769, 3179, 2209, 979, 893, +993, 85, -1173, -2109, -2369, -2245, -2330, -2699, -2661, -1022, 1279, 3510, 5000, 5371, 5170, 4933, +4117, 1910, 154, 45, 648, 516, -636, -1861, -2709, -2969, -2930, -2943, -3358, -4002, -4266, -4291, +-3983, -3882, -3727, -3443, -3103, -2523, -1315, 646, 3057, 5010, 6047, 5791, 4835, 4385, 3670, 2149, +1359, 1331, 1165, 403, -800, -1787, -2171, -1926, -2307, -2974, -2805, -1568, 548, 2964, 4655, 4950, +5348, 5651, 4478, 2263, 645, 488, 820, 703, -224, -1491, -2387, -2770, -2708, -2900, -3204, -3845, +-4254, -4160, -4011, -3985, -3755, -3504, -3327, -3049, -1940, -94, 2103, 4508, 5773, 5329, 5080, 4828, +3703, 2305, 1585, 1534, 1249, 685, -592, -1728, -1852, -1831, -2416, -3117, -3077, -2341, -199, 2415, +3753, 4444, 5459, 5975, 4701, 2559, 1081, 743, 932, 808, 60, -1292, -2157, -2572, -2712, -2816, +-3178, -3859, -4179, -4158, -4075, -4094, -3792, -3484, -3633, -3379, -2412, -1102, 1444, 4008, 5035, 5158, +5307, 5100, 3816, 2583, 1854, 1605, 1554, 882, -452, -1438, -1502, -1799, -2360, -2959, -3531, -2877, +-681, 1664, 2863, 4002, 5515, 6140, 4996, 2944, 1581, 993, 1110, 1095, 285, -923, -1862, -2387, +-2508, -2686, -3090, -3727, -4074, -4057, -4214, -4135, -3651, -3708, -3648, -3474, -3211, -1762, 839, 3269, +4317, 4998, 5449, 5177, 4144, 2836, 2031, 1886, 1916, 1003, -249, -939, -1383, -1589, -2005, -2959, +-3868, -3142, -1120, 778, 2064, 3553, 5487, 6230, 5277, 3510, 2007, 1406, 1455, 1342, 690, -491, +-1521, -2032, -2262, -2432, -2954, -3544, -3707, -4129, -4146, -3872, -3826, -3590, -3478, -3705, -3764, -2217, +261, 2358, 3786, 4790, 5416, 5323, 4453, 2995, 2176, 2307, 1997, 1136, 136, -712, -1295, -1204, +-1690, -3073, -4002, -3330, -1579, -83, 1220, 3132, 5149, 6187, 5558, 3857, 2455, 1776, 1657, 1612, +963, -128, -1205, -1829, -1886, -2442, -2908, -3176, -3808, -4115, -4058, -3984, -3967, -3419, -3406, -4144, +-4125, -2690, -533, 1415, 3136, 4317, 5146, 5507, 4468, 3079, 2507, 2500, 2019, 1444, 454, -643, +-980, -800, -1444, -3060, -4024, -3344, -2131, -923, 498, 2470, 4727, 6065, 5655, 4237, 2811, 2094, +1937, 1734, 1365, 102, -982, -1310, -1829, -2321, -2639, -3071, -3792, -3946, -4006, -4260, -3885, -3236, +-3440, -4367, -4329, -3134, -1348, 740, 2337, 3769, 5070, 5502, 4424, 3335, 2782, 2487, 2242, 1706, +558, -530, -708, -392, -1312, -3040, -3826, -3444, -2612, -1612, -318, 1828, 4215, 5790, 5813, 4411, +3270, 2421, 2082, 2177, 1521, 371, -494, -1049, -1695, -2025, -2376, -3081, -3534, -3750, -4095, -4366, +-3699, -3077, -3527, -4262, -4459, -3551, -1821, 6, 1501, 3377, 4947, 5288, 4612, 3675, 2966, 2695, +2572, 2070, 709, -325, -168, -52, -1158, -2737, -3619, -3403, -2919, -2314, -949, 993, 3680, 5489, +5646, 4804, 3494, 2639, 2489, 2379, 1642, 754, -81, -938, -1369, -1771, -2338, -3000, -3246, -3690, +-4383, -4331, -3658, -3182, -3488, -4299, -4739, -3861, -2355, -1029, 713, 2828, 4410, 4998, 4630, 3786, +2961, 2756, 2879, 2117, 629, -66, 79, 94, -992, -2646, -3320, -3506, -3261, -2870, -1868, 335, +2922, 4905, 5616, 4922, 3611, 2968, 2831, 2412, 1949, 1134, 159, -698, -973, -1525, -2362, -2689, +-2962, -3742, -4392, -4282, -3720, -3131, -3342, -4418, -4732, -3952, -2972, -1776, 53, 2238, 3924, 4774, +4774, 3876, 2982, 3151, 3183, 2191, 860, 165, 550, 328, -742, -2155, -3091, -3239, -3355, -3362, +-2392, -347, 2126, 4475, 5567, 4850, 3942, 3389, 3070, 2628, 2330, 1540, 372, -199, -550, -1420, +-2102, -2254, -2767, -3650, -4243, -4366, -3635, -2932, -3387, -4314, -4553, -4078, -3425, -2401, -543, 1599, +3326, 4715, 4797, 3809, 3294, 3421, 3537, 2333, 1022, 682, 788, 653, -364, -1809, -2618, -2907, +-3441, -3618, -2804, -1195, 1465, 4036, 5249, 4863, 4241, 3728, 3210, 2997, 2700, 1704, 750, 321, +-336, -1284, -1725, -2058, -2549, -3427, -4379, -4383, -3537, -2997, -3435, -4188, -4421, -4190, -3937, -2887, +-1262, 657, 2880, 4332, 4584, 3694, 3319, 3783, 3561, 2414, 1249, 863, 1019, 882, -232, -1462, +-2124, -2812, -3386, -3780, -3425, -1951, 751, 3402, 4693, 4842, 4444, 3786, 3419, 3368, 2816, 1871, +1272, 627, -146, -914, -1527, -1752, -2187, -3344, -4375, -4270, -3511, -3026, -3508, -3943, -4252, -4465, +-4065, -3386, -2041, -70, 2250, 4085, 4182, 3565, 3531, 3925, 3632, 2566, 1360, 1076, 1366, 938, +31, -1002, -1804, -2500, -3168, -3865, -4006, -2571, 87, 2576, 4204, 4832, 4409, 3823, 3840, 3580, +2900, 2280, 1635, 963, 190, -710, -1305, -1334, -1949, -3205, -4367, -4142, -3459, -3316, -3345, -3765, +-4213, -4382, -4283, -3733, -2842, -801, 1806, 3554, 3722, 3526, 3623, 4021, 3875, 2603, 1588, 1471, +1527, 1144, 390, -533, -1443, -2005, -2746, -3913, -4277, -2917, -617, 1799, 3959, 4693, 4317, 4201, +4161, 3801, 3255, 2666, 2051, 1514, 516, -377, -908, -859, -1514, -3154, -4010, -3951, -3564, -3244, +-3284, -3526, -4111, -4285, -4210, -4140, -3559, -1345, 1270, 2911, 3410, 3292, 3654, 4224, 3881, 2713, +1840, 1726, 1631, 1337, 705, -287, -1048, -1444, -2464, -3970, -4336, -3417, -1509, 1173, 3398, 4221, +4275, 4296, 4227, 4039, 3373, 2925, 2428, 1789, 810, -320, -461, -480, -1452, -2861, -3856, -3883, +-3685, -3363, -3226, -3521, -4105, -4072, -4223, -4671, -4042, -2019, 573, 2343, 2833, 3033, 3666, 4256, +3838, 2826, 2103, 1838, 1739, 1567, 865, -152, -530, -1018, -2306, -3696, -4402, -4022, -2147, 486, +2626, 3837, 4076, 4322, 4404, 4089, 3624, 3084, 2924, 2208, 858, 72, -63, -189, -1192, -2594, +-3577, -3846, -3808, -3329, -3199, -3684, -3829, -3871, -4304, -4886, -4554, -2597, -38, 1658, 2228, 2768, +3669, 4190, 3862, 3034, 2314, 1917, 2066, 1767, 906, 274, 12, -685, -1801, -3237, -4479, -4269, +-2676, -200, 2042, 3286, 3993, 4250, 4585, 4323, 3651, 3525, 3401, 2493, 1173, 490, 393, 179, +-849, -2098, -3184, -3862, -3591, -3213, -3312, -3526, -3545, -3599, -4204, -5046, -4913, -3047, -563, 948, +1680, 2530, 3584, 4019, 3987, 3192, 2312, 2176, 2333, 1728, 1036, 672, 225, -223, -1289, -2953, +-4355, -4635, -3115, -964, 1287, 2794, 3522, 4255, 4634, 4221, 3772, 3860, 3688, 2712, 1390, 857, +783, 274, -435, -1683, -3099, -3695, -3508, -3328, -3481, -3540, -3395, -3407, -4140, -5270, -5232, -3483, +-1207, 81, 1113, 2176, 3158, 3907, 4026, 3072, 2379, 2467, 2287, 1815, 1234, 777, 573, 81, +-715, -2569, -4241, -4679, -3662, -1560, 577, 2035, 3167, 4184, 4482, 4155, 3880, 4125, 4020, 2779, +1728, 1263, 921, 649, -7, -1369, -2856, -3441, -3384, -3380, -3571, -3547, -3159, -3136, -4002, -5373, +-5310, -3742, -1914, -518, 678, 1671, 2887, 3983, 3849, 3132, 2684, 2585, 2501, 1879, 1441, 980, +782, 629, -279, -2037, -3907, -4759, -3946, -2029, -229, 1384, 2849, 3986, 4393, 3992, 4089, 4487, +4086, 3093, 2115, 1507, 1185, 1061, 401, -1029, -2502, -3161, -3208, -3409, -3656, -3585, -2927, -2834, +-4001, -5291, -5256, -4123, -2518, -928, -38, 1155, 2740, 3698, 3798, 3136, 2853, 2747, 2556, 2143, +1505, 1115, 1109, 983, 208, -1435, -3637, -4684, -4067, -2651, -972, 608, 2413, 3759, 3912, 3895, +4205, 4517, 4186, 3382, 2339, 1648, 1435, 1391, 704, -768, -2152, -2912, -3082, -3435, -3952, -3638, +-2738, -2801, -4030, -5015, -5417, -4550, -2907, -1744, -685, 625, 2343, 3396, 3467, 3197, 2866, 2753, +2667, 2173, 1489, 1229, 1160, 1263, 748, -1067, -3258, -4539, -4231, -3091, -1913, -42, 2012, 3258, +3520, 3836, 4194, 4528, 4392, 3662, 2570, 1812, 1773, 1720, 1018, -356, -1831, -2525, -2797, -3521, +-4190, -3445, -2705, -2811, -3683, -4988, -5400, -4679, -3321, -2311, -1389, 237, 1975, 3031, 3378, 3198, +2903, 2985, 2790, 2284, 1691, 1216, 1379, 1642, 1195, -456, -2865, -4121, -4115, -3592, -2603, -529, +1483, 2690, 3218, 3695, 4134, 4500, 4608, 3891, 2739, 2096, 2045, 2050, 1387, -8, -1482, -1906, +-2582, -3660, -3990, -3499, -2665, -2600, -3501, -4767, -5328, -4665, -3658, -2924, -1889, -220, 1451, 2764, +3192, 3085, 3087, 3022, 3002, 2552, 1765, 1370, 1493, 2024, 1764, 31, -2263, -3477, -3974, -3957, +-3015, -1022, 956, 2188, 2980, 3527, 3993, 4601, 4789, 4108, 2980, 2374, 2267, 2493, 1670, 137, +-750, -1481, -2417, -3543, -4060, -3563, -2719, -2483, -3361, -4699, -5154, -4684, -4095, -3400, -2421, -884, +1051, 2235, 2858, 2997, 2931, 3071, 3037, 2621, 1803, 1237, 1494, 2287, 1970, 310, -1608, -3021, +-3954, -4338, -3472, -1683, 180, 1610, 2489, 3088, 3715, 4541, 4708, 4240, 3099, 2310, 2666, 2662, +1719, 540, -305, -1100, -2208, -3423, -4062, -3694, -2680, -2360, -3358, -4475, -4896, -4804, -4262, -3900, +-2986, -1367, 414, 1798, 2515, 2751, 2872, 3037, 3106, 2799, 1760, 1105, 1689, 2446, 2160, 719, +-853, -2449, -3828, -4377, -3784, -2253, -440, 1153, 1931, 2705, 3572, 4307, 4936, 4348, 3124, 2671, +2973, 2846, 1955, 965, 218, -670, -1846, -3193, -4109, -3702, -2607, -2492, -3168, -4252, -4719, -4659, +-4532, -4240, -3426, -1931, -106, 1317, 2140, 2582, 2722, 2956, 3358, 2897, 1717, 1123, 1867, 2547, +2246, 1262, -146, -1901, -3536, -4213, -4090, -2758, -836, 506, 1585, 2334, 3190, 4368, 5018, 4366, +3315, 3002, 3253, 3011, 2215, 1454, 685, -138, -1284, -3078, -3914, -3601, -2655, -2380, -3120, -4003, +-4395, -4564, -4610, -4472, -3853, -2394, -652, 774, 1845, 2237, 2468, 2976, 3520, 2905, 1609, 1235, +1909, 2472, 2316, 1805, 424, -1398, -3010, -4242, -4229, -3142, -1527, 49, 1045, 1720, 2842, 4265, +4881, 4267, 3400, 3252, 3325, 3059, 2507, 1611, 1159, 401, -1031, -2795, -3859, -3617, -2705, -2493, +-3122, -3821, -4250, -4459, -4688, -4800, -4183, -2971, -1270, 301, 1430, 1800, 2140, 3068, 3559, 2851, +1590, 1404, 1835, 2287, 2541, 2029, 944, -737, -2692, -3982, -4326, -3606, -2011, -445, 359, 1115, +2489, 4102, 4643, 4131, 3648, 3336, 3475, 3298, 2574, 1972, 1620, 908, -564, -2495, -3665, -3457, +-2768, -2529, -3009, -3650, -3919, -4287, -4665, -4840, -4443, -3438, -1837, -29, 956, 1333, 1920, 3153, +3534, 2743, 1872, 1439, 1740, 2325, 2508, 2389, 1539, -152, -2097, -3562, -4350, -3815, -2334, -865, +-231, 538, 2308, 3797, 4446, 4245, 3704, 3604, 3733, 3460, 2809, 2337, 2145, 1590, -44, -2036, +-3228, -3271, -2625, -2494, -2882, -3329, -3587, -4013, -4535, -4700, -4637, -3812, -2185, -326, 479, 822, +1956, 3103, 3436, 2951, 1980, 1544, 1773, 2211, 2533, 2710, 1951, 492, -1459, -3191, -4282, -4016, +-2499, -1457, -919, 140, 1803, 3450, 4212, 4073, 3745, 3734, 3799, 3566, 2863, 2545, 2591, 1978, +396, -1658, -2939, -3101, -2693, -2583, -2910, -3121, -3456, -3880, -4370, -4690, -4940, -4345, -2435, -856, +-255, 458, 1624, 2831, 3305, 2871, 2002, 1614, 1570, 2033, 2484, 2737, 2291, 992, -760, -2898, +-4246, -3920, -2871, -2046, -1491, -467, 1289, 3019, 3803, 3881, 3682, 3763, 3921, 3485, 2893, 2703, +2917, 2421, 801, -1225, -2594, -2860, -2750, -2692, -2860, -3024, -3304, -3736, -3998, -4677, -5293, -4452, +-2762, -1454, -762, 23, 1249, 2640, 3107, 2877, 2161, 1606, 1519, 1843, 2476, 2738, 2518, 1714, +-243, -2560, -3901, -3866, -3112, -2468, -2074, -982, 784, 2511, 3512, 3611, 3677, 3883, 4009, 3555, +2955, 2957, 3279, 2949, 1305, -695, -2026, -2540, -2603, -2698, -2621, -2879, -3225, -3231, -3626, -4684, +-5228, -4449, -3032, -1783, -1206, -315, 1066, 2396, 3078, 2933, 2427, 1752, 1495, 1956, 2389, 2715, +3008, 2352, 362, -1938, -3446, -3587, -3131, -2824, -2413, -1496, 343, 2123, 3115, 3378, 3629, 4007, +4061, 3575, 3001, 3115, 3631, 3295, 1793, -207, -1454, -2236, -2640, -2520, -2545, -2993, -3022, -2843, +-3494, -4571, -5216, -4577, -3270, -2296, -1622, -771, 698, 2058, 2801, 3027, 2473, 1716, 1587, 1811, +2069, 2666, 3201, 2784, 905, -1516, -2961, -3421, -3216, -3118, -2919, -2023, -226, 1595, 2589, 3024, +3492, 3984, 4093, 3474, 3011, 3185, 3880, 3612, 2116, 432, -918, -2077, -2458, -2350, -2740, -3011, +-2821, -2647, -3312, -4576, -5129, -4678, -3569, -2727, -2192, -1164, 208, 1537, 2616, 2932, 2372, 1850, +1595, 1574, 1825, 2484, 3395, 3087, 1334, -963, -2515, -3106, -3199, -3321, -3334, -2486, -729, 990, +2056, 2576, 3339, 3921, 4047, 3413, 2908, 3330, 4057, 3734, 2576, 1122, -588, -1725, -2088, -2307, +-2771, -3051, -2608, -2429, -3156, -4374, -5058, -4612, -3763, -3150, -2483, -1561, -362, 1238, 2402, 2729, +2449, 1977, 1728, 1440, 1590, 2459, 3472, 3433, 1828, -333, -1950, -2661, -2979, -3412, -3563, -2863, +-1132, 473, 1527, 2241, 3146, 3950, 4039, 3268, 2949, 3577, 4009, 3964, 3181, 1601, -97, -1248, +-1693, -2221, -2863, -2966, -2500, -2213, -2999, -4274, -4850, -4554, -4094, -3392, -2817, -2128, -844, 775, +2071, 2472, 2373, 2137, 1667, 1226, 1293, 2282, 3418, 3583, 2211, 130, -1413, -2278, -2789, -3516, +-3849, -3201, -1663, -124, 928, 1702, 2877, 3978, 3788, 3144, 3088, 3450, 3990, 4195, 3632, 2049, +339, -641, -1332, -2085, -2832, -2941, -2323, -2000, -2921, -3976, -4565, -4569, -4122, -3572, -3113, -2550, +-1303, 419, 1611, 2200, 2347, 2278, 1654, 1015, 1069, 2059, 3343, 3674, 2547, 607, -870, -1739, +-2527, -3488, -3950, -3472, -2115, -573, 204, 1203, 2787, 3694, 3581, 3155, 3097, 3343, 3922, 4488, +3938, 2424, 892, -95, -932, -1879, -2904, -2849, -2197, -2065, -2755, -3762, -4426, -4544, -4215, -3694, +-3497, -2972, -1717, -6, 1167, 1907, 2401, 2416, 1750, 944, 936, 1911, 3298, 3837, 2872, 1130, +-190, -1093, -2153, -3195, -3970, -3604, -2207, -1120, -326, 977, 2638, 3549, 3566, 3370, 3157, 3330, +4120, 4772, 4322, 3004, 1528, 650, -293, -1669, -2617, -2599, -2055, -1882, -2508, -3390, -4223, -4365, +-4094, -3766, -3727, -3276, -2030, -489, 700, 1615, 2387, 2501, 1794, 892, 761, 1679, 3139, 3847, +3013, 1606, 326, -642, -1638, -3121, -4021, -3629, -2579, -1794, -937, 580, 2176, 3140, 3485, 3291, +2923, 3221, 4043, 4829, 4534, 3190, 2087, 1263, 57, -1462, -2509, -2523, -2141, -1887, -2360, -3281, +-4127, -4272, -4061, -3987, -4040, -3611, -2423, -1079, 121, 1240, 2233, 2508, 1812, 846, 511, 1494, +2966, 3641, 3224, 1907, 815, 27, -1220, -2968, -3862, -3544, -2937, -2417, -1387, 119, 1605, 2866, +3343, 3128, 2850, 3019, 4077, 4905, 4575, 3553, 2668, 1917, 501, -1104, -2212, -2428, -2125, -1812, +-2177, -3149, -3941, -4091, -3945, -4126, -4232, -3823, -2814, -1630, -443, 862, 1976, 2483, 1867, 639, +402, 1210, 2634, 3537, 3218, 2095, 1316, 618, -916, -2778, -3544, -3494, -3337, -2819, -1858, -509, +1161, 2489, 3205, 3003, 2596, 2937, 4023, 4853, 4572, 3846, 3237, 2474, 1008, -631, -1864, -2287, +-1998, -1668, -1981, -3000, -3685, -3798, -3841, -4140, -4312, -3895, -3134, -2099, -878, 387, 1878, 2513, +1868, 721, 305, 989, 2457, 3414, 3113, 2315, 1956, 1172, -604, -2292, -3125, -3509, -3467, -3191, +-2327, -1043, 548, 2152, 2991, 2791, 2356, 2850, 3992, 4703, 4545, 4126, 3712, 2949, 1564, -164, +-1545, -2174, -1918, -1562, -1958, -2869, -3485, -3544, -3786, -4192, -4286, -4099, -3408, -2572, -1529, -43, +1605, 2375, 1895, 741, 117, 770, 2305, 3140, 2847, 2577, 2468, 1475, -113, -1782, -2744, -3294, +-3558, -3362, -2719, -1582, 76, 1882, 2812, 2583, 2243, 2879, 3924, 4528, 4595, 4393, 4167, 3485, +2183, 450, -1182, -1884, -1732, -1421, -1880, -2710, -3118, -3355, -3641, -4057, -4300, -4080, -3563, -3007, +-2022, -412, 1297, 2273, 2014, 770, -33, 751, 2195, 2681, 2767, 2839, 2775, 1904, 341, -1188, +-2327, -3090, -3513, -3494, -3109, -2164, -424, 1587, 2507, 2273, 2161, 2820, 3776, 4358, 4541, 4628, +4449, 4031, 2834, 1018, -765, -1587, -1404, -1360, -1824, -2449, -2902, -3124, -3441, -3987, -4215, -3989, +-3734, -3377, -2433, -850, 911, 2245, 2134, 642, 57, 831, 1885, 2362, 2654, 3062, 3052, 2263, +882, -576, -1842, -2768, -3317, -3484, -3480, -2714, -812, 1177, 2082, 1977, 1981, 2728, 3477, 4115, +4438, 4621, 4639, 4413, 3427, 1462, -428, -1216, -1281, -1362, -1777, -2388, -2785, -2950, -3440, -3989, +-4162, -4017, -4026, -3783, -2939, -1617, 508, 2083, 1851, 534, 49, 719, 1468, 1900, 2418, 3029, +3103, 2486, 1285, -104, -1495, -2513, -3066, -3603, -3944, -3227, -1365, 688, 1521, 1630, 1793, 2451, +3199, 3823, 4265, 4472, 4707, 4836, 3876, 1898, 61, -851, -1145, -1277, -1795, -2323, -2617, -2847, +-3452, -3945, -4028, -4188, -4161, -4067, -3668, -2224, 125, 1776, 1560, 460, 111, 573, 1046, 1511, +2166, 2902, 3108, 2651, 1763, 308, -1142, -2047, -2769, -3593, -4275, -3611, -1771, 127, 1077, 1311, +1613, 2215, 2922, 3648, 4010, 4299, 4862, 5185, 4252, 2423, 565, -446, -852, -1171, -1757, -2176, +-2322, -2823, -3321, -3709, -4023, -4081, -4074, -4338, -4204, -2677, -191, 1421, 1300, 540, 258, 505, +830, 1218, 2050, 2775, 3086, 3009, 2188, 828, -575, -1399, -2223, -3447, -4285, -3761, -2052, -283, +718, 1191, 1491, 2050, 2875, 3537, 3765, 4289, 5073, 5523, 4773, 3060, 1218, 104, -345, -1035, +-1552, -1832, -2210, -2651, -3047, -3602, -3922, -3853, -3953, -4619, -4684, -3051, -589, 922, 1084, 529, +363, 377, 525, 1041, 1751, 2525, 3051, 3186, 2534, 1121, -61, -811, -1796, -3312, -4359, -3958, +-2494, -868, 279, 856, 1098, 1821, 2667, 3157, 3395, 4059, 5025, 5600, 5138, 3391, 1712, 679, +-164, -931, -1352, -1765, -2175, -2502, -2951, -3608, -3836, -3590, -3891, -4926, -4992, -3456, -1065, 420, +734, 628, 363, 234, 348, 771, 1451, 2183, 2975, 3318, 2688, 1420, 447, -205, -1366, -3096, +-4266, -4046, -2926, -1315, -88, 433, 800, 1658, 2487, 2805, 3129, 3744, 4900, 5767, 5287, 3802, +2394, 1165, 114, -633, -1159, -1667, -2025, -2275, -2890, -3653, -3580, -3346, -3863, -5079, -5329, -3735, +-1624, -161, 496, 553, 375, 123, 237, 560, 1062, 1866, 2896, 3333, 2758, 1690, 982, 428, +-935, -2701, -3995, -4145, -3211, -1644, -463, 25, 641, 1499, 2270, 2662, 2797, 3504, 4938, 5803, +5463, 4380, 3047, 1706, 592, -194, -891, -1537, -1644, -2048, -2872, -3489, -3327, -2979, -3762, -5148, +-5353, -4043, -2132, -660, 252, 508, 303, 98, 209, 336, 670, 1578, 2741, 3292, 2702, 1951, +1484, 857, -481, -2236, -3755, -4265, -3382, -2033, -1047, -360, 260, 1178, 2066, 2261, 2304, 3249, +4681, 5560, 5511, 4749, 3531, 2072, 1106, 106, -842, -1276, -1459, -1940, -2934, -3492, -3033, -2836, +-3746, -5160, -5463, -4401, -2745, -1198, -49, 301, 186, 112, 102, 100, 270, 1321, 2604, 3084, +2635, 2210, 1887, 1233, 86, -1714, -3546, -4114, -3507, -2403, -1413, -782, -102, 1047, 1829, 1866, +1991, 3005, 4421, 5295, 5678, 5119, 3867, 2732, 1628, 454, -589, -995, -1042, -1814, -2927, -3269, +-2748, -2611, -3592, -4969, -5372, -4655, -3211, -1556, -382, 141, 143, 225, 161, -118, 1, 1185, +2418, 2791, 2662, 2435, 2132, 1789, 718, -1232, -3083, -3876, -3575, -2555, -1773, -1212, -305, 913, +1619, 1531, 1838, 2829, 3993, 5242, 5759, 5360, 4377, 3360, 2283, 827, -249, -476, -644, -1662, +-2790, -2991, -2395, -2374, -3353, -4577, -5257, -4827, -3555, -1897, -679, -92, 143, 395, 184, -345, +-100, 1064, 2075, 2636, 2653, 2448, 2431, 2288, 1191, -618, -2627, -3682, -3471, -2742, -2196, -1741, +-577, 687, 1111, 1279, 1528, 2294, 3587, 4905, 5640, 5366, 4637, 3896, 2695, 1033, 55, -122, +-423, -1653, -2809, -2815, -2332, -2330, -3179, -4403, -5260, -5119, -3961, -2363, -1178, -540, 79, 437, +-57, -540, -265, 667, 1718, 2371, 2340, 2381, 2551, 2514, 1671, -155, -2227, -3453, -3354, -2874, +-2773, -2023, -811, 259, 853, 1043, 1254, 1873, 3168, 4645, 5430, 5304, 5044, 4428, 3098, 1386, +452, 374, -187, -1562, -2613, -2646, -2216, -2180, -2897, -4088, -5135, -5280, -4178, -2719, -1764, -832, +112, 339, -132, -549, -476, 427, 1486, 2042, 2184, 2296, 2666, 2793, 2171, 435, -1889, -2968, +-3073, -3142, -3036, -2334, -1163, -97, 562, 809, 899, 1400, 2829, 4256, 5021, 5254, 5338, 4878, +3406, 1701, 979, 795, 27, -1367, -2422, -2510, -2125, -2076, -2573, -3746, -5065, -5238, -4235, -3188, +-2238, -960, -3, 310, -42, -590, -492, 276, 1296, 1851, 2013, 2313, 2659, 3192, 2761, 842, +-1197, -2307, -2779, -3140, -3151, -2517, -1434, -443, 429, 625, 556, 1132, 2501, 3831, 4600, 5139, +5658, 5221, 3692, 2186, 1563, 1218, 355, -1121, -2169, -2361, -2165, -1942, -2245, -3573, -4901, -5023, +-4437, -3683, -2666, -1417, -255, 114, -175, -716, -739, 67, 866, 1528, 1804, 1971, 2719, 3530, +3099, 1374, -457, -1687, -2412, -3078, -3178, -2798, -1975, -827, 67, 226, 128, 682, 2016, 3129, +3917, 4924, 5751, 5341, 3999, 2687, 2140, 1709, 655, -765, -1821, -2358, -2213, -1727, -2131, -3463, +-4533, -4902, -4578, -4071, -3146, -1835, -671, -48, -395, -837, -798, -302, 594, 1337, 1419, 1735, +2817, 3749, 3479, 1943, 345, -947, -2027, -2721, -3076, -3027, -2315, -1141, -201, -126, -224, 424, +1559, 2376, 3354, 4679, 5665, 5420, 4217, 3172, 2727, 2106, 1000, -232, -1577, -2357, -2032, -1665, +-2079, -3255, -4231, -4633, -4696, -4275, -3585, -2283, -908, -365, -526, -824, -1038, -546, 420, 992, +1077, 1496, 2818, 3908, 3706, 2624, 1198, -258, -1395, -2209, -2824, -3091, -2528, -1295, -432, -454, +-346, 292, 1075, 1793, 2861, 4403, 5593, 5431, 4446, 3791, 3271, 2524, 1705, 300, -1244, -2068, +-1842, -1487, -2037, -2923, -3859, -4416, -4553, -4516, -3918, -2551, -1321, -615, -556, -978, -1185, -695, +242, 714, 638, 1293, 2745, 3812, 3924, 3200, 1878, 420, -740, -1615, -2559, -3198, -2624, -1470, +-864, -748, -499, 43, 589, 1142, 2254, 4061, 5264, 5194, 4748, 4156, 3605, 3063, 2263, 832, +-962, -1749, -1627, -1519, -1902, -2734, -3584, -4047, -4543, -4673, -4076, -2968, -1710, -841, -697, -1086, +-1394, -792, 71, 247, 277, 1070, 2461, 3643, 4074, 3670, 2469, 1023, 27, -982, -2346, -3074, +-2599, -1698, -1210, -974, -629, -95, 169, 475, 1871, 3610, 4774, 5104, 4878, 4432, 3895, 3647, +2917, 1253, -440, -1338, -1491, -1367, -1848, -2580, -3157, -3823, -4449, -4669, -4310, -3326, -2135, -1077, +-814, -1348, -1507, -806, -201, -111, -26, 750, 2095, 3363, 4178, 4019, 2837, 1706, 841, -431, +-1986, -2793, -2577, -1898, -1481, -1281, -625, -307, -356, 57, 1394, 3077, 4273, 4976, 5000, 4515, +4301, 4240, 3419, 1876, 122, -928, -1091, -1271, -1760, -2265, -2847, -3505, -4249, -4581, -4383, -3707, +-2440, -1222, -1097, -1572, -1539, -914, -470, -488, -311, 366, 1515, 3062, 4164, 4029, 3125, 2344, +1448, 33, -1551, -2617, -2474, -2152, -1975, -1445, -796, -639, -855, -417, 845, 2244, 3668, 4674, +4666, 4470, 4529, 4515, 3890, 2305, 552, -459, -918, -1241, -1720, -2154, -2624, -3376, -4099, -4475, +-4652, -4111, -2722, -1575, -1469, -1838, -1632, -1050, -820, -720, -555, -162, 998, 2818, 3991, 3970, +3512, 2889, 2166, 698, -1060, -2045, -2259, -2290, -2161, -1504, -818, -925, -1101, -636, 224, 1651, +3271, 4244, 4503, 4448, 4696, 4979, 4354, 2862, 1240, 116, -496, -1058, -1532, -1823, -2391, -3107, +-3685, -4325, -4728, -4270, -2894, -1803, -1784, -1908, -1593, -1226, -996, -791, -850, -679, 663, 2426, +3692, 3907, 3665, 3468, 2756, 1217, -424, -1466, -2002, -2453, -2268, -1462, -1076, -1137, -1167, -1051, +-280, 1105, 2704, 3852, 4135, 4298, 4851, 5229, 4759, 3386, 1854, 773, -142, -844, -1216, -1647, +-2203, -2742, -3318, -4129, -4807, -4308, -3027, -2188, -2064, -1952, -1741, -1488, -996, -955, -1202, -1043, +161, 2042, 3304, 3658, 3828, 3891, 3253, 1723, 270, -758, -1852, -2489, -2170, -1657, -1281, -1214, +-1384, -1376, -817, 486, 2154, 3244, 3677, 4070, 4774, 5398, 5009, 3805, 2559, 1291, 179, -528, +-1020, -1545, -2126, -2427, -2997, -4095, -4817, -4302, -3304, -2663, -2216, -2159, -2059, -1600, -1154, -1150, +-1571, -1539, -284, 1501, 2747, 3268, 3798, 4179, 3459, 2155, 1069, -322, -1687, -2321, -2250, -1829, +-1473, -1363, -1496, -1736, -1317, -9, 1521, 2649, 3159, 3696, 4731, 5382, 5117, 4290, 3127, 1807, +567, -129, -755, -1516, -1957, -2044, -2778, -4097, -4604, -4331, -3666, -2872, -2443, -2402, -2270, -1762, +-1190, -1298, -1865, -1871, -698, 1028, 2124, 2878, 3905, 4203, 3652, 2850, 1748, 250, -1227, -2070, +-2135, -1922, -1580, -1332, -1631, -1962, -1651, -521, 1034, 2030, 2561, 3420, 4532, 5276, 5239, 4757, +3717, 2300, 1118, 394, -507, -1468, -1580, -1726, -2657, -3756, -4384, -4362, -3805, -3055, -2608, -2630, +-2490, -1797, -1235, -1375, -2098, -2147, -887, 451, 1501, 2737, 3763, 4139, 3974, 3438, 2477, 906, +-684, -1598, -2000, -1909, -1504, -1324, -1580, -2087, -1955, -777, 548, 1436, 2082, 3136, 4274, 5066, +5371, 5180, 4193, 2781, 1855, 912, -373, -1130, -1275, -1563, -2404, -3452, -4187, -4372, -3939, -3174, +-2853, -2902, -2723, -1967, -1220, -1602, -2418, -2223, -1299, -267, 985, 2325, 3394, 3942, 4076, 3915, +2973, 1448, -46, -1274, -1845, -1888, -1579, -1276, -1664, -2282, -2194, -1120, -23, 719, 1543, 2674, +3785, 4670, 5464, 5419, 4388, 3421, 2532, 1253, -56, -819, -1071, -1400, -2161, -3120, -4041, -4342, +-3966, -3367, -3010, -3213, -3053, -1944, -1343, -1905, -2454, -2358, -1777, -840, 465, 1935, 2944, 3646, +4241, 4196, 3455, 2131, 534, -760, -1633, -1822, -1481, -1199, -1686, -2390, -2272, -1373, -521, 108, +1139, 2218, 3142, 4445, 5468, 5375, 4719, 4055, 3095, 1711, 357, -433, -880, -1227, -1813, -2887, +-3815, -4253, -4036, -3342, -3232, -3628, -3130, -2018, -1598, -2032, -2491, -2471, -2195, -1405, 79, 1374, +2403, 3405, 4176, 4432, 3890, 2745, 1252, -200, -1316, -1637, -1263, -1079, -1645, -2377, -2199, -1539, +-1056, -236, 783, 1560, 2672, 4222, 5255, 5342, 5042, 4632, 3648, 2222, 941, -90, -624, -936, +-1569, -2503, -3592, -4255, -3839, -3326, -3586, -3829, -3251, -2222, -1841, -2174, -2419, -2697, -2638, -1766, +-453, 793, 1846, 3000, 4018, 4513, 4207, 3292, 1949, 292, -997, -1413, -1044, -989, -1729, -2222, +-2106, -1920, -1399, -510, 211, 937, 2211, 3851, 4882, 5204, 5342, 5020, 4135, 2847, 1407, 331, +-313, -776, -1179, -2155, -3530, -4002, -3601, -3398, -3771, -3994, -3274, -2455, -2084, -2071, -2432, -2844, +-2850, -2090, -905, 235, 1306, 2555, 3810, 4459, 4455, 3846, 2634, 882, -656, -997, -725, -1043, +-1595, -1905, -2152, -2104, -1548, -800, -311, 387, 1837, 3347, 4436, 5143, 5425, 5352, 4697, 3373, +2027, 845, -115, -411, -733, -1957, -3320, -3731, -3344, -3469, -3990, -3988, -3488, -2778, -2231, -2073, +-2494, -3003, -3048, -2405, -1347, -352, 728, 2082, 3442, 4309, 4544, 4358, 3314, 1299, -173, -449, +-613, -986, -1333, -1714, -2182, -2194, -1588, -1138, -830, 25, 1313, 2758, 4047, 4856, 5460, 5684, +5056, 4023, 2732, 1220, 288, 27, -345, -1734, -3089, -3266, -3164, -3509, -3963, -3997, -3693, -3026, +-2313, -2110, -2516, -3107, -3170, -2641, -1796, -876, 124, 1558, 3013, 3890, 4579, 4844, 3671, 1748, +460, -70, -530, -888, -1083, -1658, -2266, -2126, -1727, -1541, -1196, -497, 705, 2204, 3403, 4501, +5383, 5630, 5419, 4605, 3241, 1602, 630, 529, -112, -1595, -2736, -2944, -3060, -3479, -3902, -4101, +-3939, -3317, -2482, -2197, -2654, -3201, -3323, -2908, -2190, -1500, -428, 1086, 2305, 3425, 4664, 5057, +3972, 2301, 1130, 284, -370, -558, -858, -1623, -2089, -2075, -1886, -1712, -1599, -928, 257, 1458, +2833, 4117, 5069, 5571, 5680, 5210, 3690, 1989, 1215, 996, 87, -1323, -2320, -2676, -2895, -3334, +-3792, -4148, -4162, -3504, -2625, -2307, -2692, -3303, -3403, -2983, -2655, -2030, -793, 435, 1531, 3003, +4596, 5062, 4203, 2958, 1693, 551, 7, -254, -768, -1404, -1949, -2021, -1825, -1967, -1857, -1256, +-311, 850, 2253, 3699, 4636, 5401, 6018, 5660, 4045, 2516, 1875, 1375, 362, -930, -1904, -2371, +-2677, -3059, -3598, -4169, -4231, -3648, -2752, -2282, -2786, -3332, -3245, -3146, -3035, -2306, -1140, -244, +828, 2682, 4355, 4896, 4576, 3582, 2119, 1046, 423, -19, -456, -1258, -1729, -1806, -1865, -2047, +-2033, -1539, -849, 227, 1761, 3102, 4019, 5203, 6233, 5880, 4397, 3106, 2446, 1744, 654, -555, +-1565, -2180, -2421, -2799, -3499, -4112, -4380, -3847, -2797, -2465, -2953, -3236, -3204, -3400, -3335, -2473, +-1583, -1029, 239, 2230, 3796, 4756, 4850, 3909, 2654, 1461, 828, 350, -310, -1035, -1502, -1648, +-1872, -2111, -2085, -1846, -1383, -250, 1266, 2347, 3417, 5015, 6245, 5994, 4744, 3696, 2992, 2114, +1070, -106, -1275, -1850, -2135, -2537, -3195, -4087, -4495, -3838, -2889, -2709, -3007, -3061, -3223, -3635, +-3391, -2565, -2143, -1581, -213, 1531, 3339, 4545, 4961, 4346, 3062, 1968, 1305, 714, -60, -771, +-1182, -1471, -1827, -2005, -2074, -2195, -1776, -581, 659, 1553, 2829, 4724, 6093, 6000, 5104, 4253, +3424, 2582, 1517, 229, -883, -1596, -1902, -2148, -2951, -4097, -4482, -3798, -3094, -2977, -2941, -2906, +-3438, -3699, -3276, -2862, -2482, -1990, -800, 948, 2756, 4272, 5026, 4644, 3494, 2489, 1818, 1094, +220, -393, -832, -1347, -1647, -1731, -2109, -2453, -1974, -868, 49, 815, 2290, 4364, 5749, 6030, +5464, 4672, 3978, 3107, 1953, 710, -512, -1353, -1533, -1707, -2776, -4060, -4320, -3736, -3439, -3140, +-2764, -3077, -3526, -3643, -3376, -3057, -2849, -2398, -1385, 224, 2100, 3860, 4907, 4760, 3812, 2967, +2288, 1370, 534, 5, -633, -1236, -1377, -1547, -2206, -2640, -2121, -1187, -670, 91, 1687, 3684, +5307, 5897, 5545, 5008, 4403, 3496, 2417, 1180, -268, -1124, -1135, -1333, -2703, -3887, -3988, -3959, +-3693, -3129, -2858, -3171, -3583, -3614, -3420, -3236, -3102, -2743, -1918, -474, 1425, 3400, 4710, 4760, +4128, 3485, 2665, 1707, 1012, 360, -457, -993, -1033, -1330, -2264, -2637, -2102, -1560, -1213, -476, +1002, 3055, 4840, 5654, 5630, 5341, 4745, 3982, 3002, 1640, -47, -771, -542, -1164, -2494, -3435, +-3863, -4039, -3760, -3144, -2912, -3239, -3570, -3554, -3423, -3336, -3241, -3002, -2382, -1164, 776, 2925, +4328, 4686, 4488, 3892, 2997, 2183, 1533, 715, -247, -607, -583, -1205, -2156, -2443, -2107, -1776, +-1580, -1017, 378, 2468, 4265, 5380, 5689, 5546, 5041, 4518, 3746, 1939, 279, -142, -205, -924, +-2053, -3014, -3690, -4003, -3743, -3157, -2965, -3270, -3520, -3502, -3413, -3411, -3312, -3151, -2850, -1828, +188, 2300, 3790, 4588, 4692, 4137, 3299, 2681, 2029, 893, 9, -150, -312, -1083, -1965, -2302, +-2115, -1911, -1983, -1539, -213, 1744, 3590, 4964, 5683, 5467, 5269, 5223, 4167, 2221, 794, 309, +15, -661, -1630, -2674, -3562, -3986, -3739, -3251, -3091, -3364, -3543, -3497, -3497, -3511, -3313, -3344, +-3333, -2369, -477, 1516, 3179, 4370, 4750, 4160, 3585, 3203, 2327, 1056, 335, 184, -140, -877, +-1815, -2166, -2060, -2059, -2283, -2033, -756, 892, 2828, 4662, 5304, 5259, 5645, 5716, 4480, 2622, +1332, 707, 258, -326, -1187, -2332, -3341, -3851, -3690, -3302, -3205, -3441, -3504, -3534, -3611, -3468, +-3316, -3556, -3681, -2854, -1147, 652, 2559, 4135, 4560, 4149, 3947, 3620, 2536, 1350, 662, 488, +93, -725, -1607, -2017, -1916, -2186, -2563, -2257, -1439, 27, 2278, 4124, 4715, 5127, 5936, 6053, +4828, 3127, 1880, 1077, 565, 85, -731, -1956, -3081, -3662, -3557, -3323, -3307, -3392, -3485, -3630, +-3622, -3396, -3285, -3705, -3858, -3178, -1889, -152, 2038, 3746, 4184, 4220, 4256, 3944, 2848, 1640, +1049, 791, 400, -519, -1423, -1649, -1836, -2264, -2506, -2542, -2163, -602, 1700, 3360, 4089, 4962, +6075, 6253, 5182, 3655, 2376, 1452, 916, 494, -263, -1552, -2808, -3351, -3403, -3375, -3294, -3328, +-3488, -3732, -3589, -3276, -3355, -3778, -3883, -3504, -2665, -807, 1458, 3146, 3850, 4199, 4511, 4191, +3160, 1980, 1343, 1228, 647, -374, -1021, -1384, -1848, -2082, -2388, -2906, -2717, -1092, 1041, 2517, +3474, 4739, 6033, 6376, 5555, 4158, 2855, 1851, 1252, 952, 186, -1207, -2408, -3027, -3259, -3380, +-3251, -3241, -3592, -3821, -3525, -3245, -3493, -3660, -3872, -3960, -3261, -1450, 793, 2403, 3385, 4097, +4536, 4421, 3367, 2161, 1750, 1532, 716, -71, -670, -1309, -1718, -1789, -2359, -3246, -3117, -1555, +276, 1619, 2834, 4354, 5804, 6414, 5832, 4634, 3300, 2185, 1677, 1369, 581, -811, -1966, -2655, +-3123, -3304, -3127, -3187, -3728, -3746, -3441, -3389, -3437, -3488, -3840, -4294, -3739, -1970, 37, 1717, +2904, 3832, 4628, 4609, 3463, 2525, 2159, 1689, 945, 337, -450, -1220, -1422, -1452, -2330, -3447, +-3324, -1980, -491, 806, 2128, 3841, 5473, 6294, 6096, 5002, 3654, 2543, 2064, 1731, 883, -398, +-1514, -2346, -3062, -3126, -3003, -3332, -3737, -3718, -3531, -3533, -3378, -3301, -3912, -4520, -4077, -2580, +-666, 994, 2207, 3577, 4626, 4530, 3619, 2930, 2396, 1818, 1286, 667, -349, -1077, -1061, -1198, +-2342, -3488, -3478, -2400, -1185, -59, 1417, 3191, 4976, 6123, 6268, 5297, 3931, 2927, 2466, 2069, +1144, 71, -1038, -2176, -2803, -2906, -2984, -3393, -3683, -3693, -3740, -3639, -3250, -3244, -3919, -4610, +-4454, -3052, -1292, 87, 1551, 3310, 4379, 4379, 3864, 3231, 2530, 2051, 1704, 913, -273, -790, +-682, -990, -2222, -3473, -3511, -2774, -1866, -843, 665, 2457, 4363, 5887, 6316, 5527, 4183, 3345, +2894, 2256, 1551, 600, -667, -1878, -2430, -2639, -2987, -3348, -3507, -3751, -3904, -3622, -3225, -3146, +-3793, -4741, -4649, -3346, -1996, -756, 1031, 2920, 4014, 4328, 4134, 3452, 2670, 2451, 2131, 1086, +-57, -470, -273, -730, -2030, -3259, -3444, -3011, -2393, -1461, -85, 1714, 3725, 5594, 6363, 5586, +4549, 3828, 3202, 2563, 2038, 1108, -303, -1477, -1956, -2443, -2918, -3113, -3401, -3824, -3953, -3717, +-3176, -2962, -3774, -4786, -4627, -3657, -2715, -1448, 467, 2362, 3554, 4317, 4276, 3499, 2927, 2835, +2493, 1269, 169, -79, 81, -460, -1756, -2908, -3330, -3147, -2769, -2020, -766, 830, 3094, 5264, +6142, 5665, 4916, 4205, 3473, 2927, 2549, 1504, 75, -901, -1571, -2273, -2668, -2911, -3280, -3767, +-4093, -3815, -3034, -2881, -3805, -4638, -4562, -3990, -3354, -2026, -174, 1606, 3172, 4199, 4251, 3514, +3174, 3231, 2766, 1461, 417, 332, 371, -198, -1424, -2583, -3106, -3261, -3007, -2458, -1568, 13, +2455, 4730, 5802, 5722, 5237, 4446, 3703, 3381, 2914, 1799, 590, -413, -1265, -1979, -2452, -2729, +-3059, -3770, -4289, -3790, -2977, -2931, -3808, -4399, -4508, -4377, -3768, -2586, -957, 847, 2725, 3984, +4053, 3501, 3365, 3570, 2938, 1632, 709, 618, 666, 29, -1065, -2160, -2926, -3196, -3057, -2884, +-2312, -721, 1787, 4066, 5382, 5817, 5412, 4589, 4113, 3805, 3195, 2242, 1143, 55, -828, -1650, +-2242, -2342, -2809, -3783, -4360, -3684, -2962, -3081, -3628, -4129, -4491, -4567, -4066, -3115, -1783, 155, +2251, 3661, 3726, 3454, 3605, 3780, 3134, 1815, 992, 958, 859, 304, -610, -1787, -2688, -2958, +-3012, -3249, -2948, -1324, 1038, 3265, 5063, 5789, 5399, 4830, 4504, 4114, 3546, 2700, 1603, 642, +-413, -1376, -1916, -1916, -2585, -3854, -4259, -3633, -3106, -3146, -3442, -3919, -4498, -4592, -4275, -3633, +-2579, -516, 1798, 3150, 3379, 3377, 3751, 3994, 3256, 2021, 1320, 1187, 1046, 634, -230, -1467, +-2382, -2601, -2939, -3594, -3363, -1935, 129, 2526, 4650, 5518, 5380, 5058, 4734, 4465, 3861, 3069, +2120, 1181, -23, -1133, -1420, -1501, -2462, -3739, -4091, -3632, -3294, -3136, -3304, -3783, -4444, -4541, +-4378, -4203, -3280, -1147, 1207, 2608, 2960, 3248, 3877, 4080, 3368, 2309, 1599, 1380, 1263, 988, +95, -1205, -1903, -2206, -2910, -3698, -3622, -2639, -702, 1840, 4021, 5199, 5312, 5165, 4996, 4747, +4164, 3422, 2775, 1727, 252, -716, -855, -1126, -2278, -3440, -3907, -3676, -3396, -3105, -3157, -3732, +-4246, -4327, -4470, -4620, -3852, -1736, 623, 1952, 2471, 3126, 3882, 4103, 3520, 2589, 1854, 1514, +1590, 1303, 302, -803, -1319, -1880, -2716, -3526, -3906, -3205, -1432, 1044, 3353, 4712, 5120, 5120, +5228, 4943, 4288, 3835, 3363, 2133, 561, -180, -354, -811, -1950, -3080, -3681, -3767, -3421, -3026, +-3158, -3657, -3978, -4117, -4517, -4981, -4364, -2276, -47, 1222, 1966, 2874, 3767, 4006, 3688, 2800, +1944, 1709, 1924, 1439, 475, -298, -915, -1508, -2344, -3379, -4052, -3718, -2103, 203, 2631, 4142, +4733, 5109, 5356, 4964, 4395, 4293, 3814, 2430, 959, 324, 99, -537, -1550, -2645, -3539, -3768, +-3366, -3049, -3222, -3577, -3720, -3853, -4546, -5275, -4717, -2788, -736, 454, 1467, 2544, 3466, 3918, +3838, 2841, 1992, 2012, 2048, 1531, 732, 21, -539, -1146, -1915, -3181, -4109, -4111, -2811, -533, +1849, 3400, 4290, 5073, 5294, 4862, 4581, 4663, 4167, 2682, 1366, 824, 420, -198, -1078, -2291, +-3388, -3665, -3319, -3086, -3326, -3516, -3394, -3599, -4499, -5425, -4923, -3223, -1449, -200, 1009, 2086, +3142, 3984, 3819, 2875, 2240, 2232, 2198, 1652, 1021, 324, -161, -678, -1503, -2799, -4030, -4404, +-3357, -1160, 983, 2594, 3931, 4910, 5122, 4761, 4775, 5002, 4371, 2977, 1830, 1206, 721, 229, +-627, -1937, -3174, -3514, -3216, -3182, -3445, -3455, -3098, -3361, -4472, -5440, -5030, -3678, -2136, -678, +384, 1531, 2935, 3873, 3764, 2929, 2471, 2394, 2336, 1872, 1209, 619, 209, -240, -1029, -2304, +-3891, -4600, -3670, -1824, 77, 1822, 3519, 4658, 4780, 4661, 4959, 5176, 4535, 3366, 2219, 1511, +1051, 669, -173, -1621, -2894, -3288, -3123, -3304, -3635, -3400, -2860, -3218, -4457, -5246, -5187, -4179, +-2625, -1330, -292, 1002, 2647, 3627, 3589, 3020, 2581, 2516, 2446, 2004, 1338, 876, 474, 121, +-460, -1870, -3723, -4615, -3936, -2474, -890, 1065, 3056, 4199, 4351, 4602, 5002, 5237, 4741, 3725, +2570, 1757, 1414, 1117, 235, -1272, -2567, -2978, -3010, -3438, -3851, -3243, -2741, -3177, -4205, -5146, +-5319, -4480, -3050, -1982, -994, 542, 2275, 3329, 3463, 3062, 2686, 2693, 2570, 2110, 1562, 1034, +695, 570, 91, -1410, -3446, -4409, -4052, -3106, -1769, 442, 2494, 3614, 3991, 4481, 4973, 5226, +4961, 4057, 2861, 2030, 1795, 1560, 621, -884, -2213, -2518, -2893, -3630, -3811, -3210, -2711, -3018, +-3941, -5027, -5366, -4599, -3467, -2616, -1616, 41, 1803, 3019, 3306, 3013, 2843, 2808, 2700, 2347, +1755, 1167, 926, 1062, 669, -926, -2993, -3963, -4087, -3658, -2401, -167, 1873, 3023, 3669, 4297, +4853, 5235, 5176, 4348, 3097, 2351, 2136, 2035, 982, -609, -1592, -2094, -2818, -3657, -3816, -3286, +-2720, -2814, -3760, -4936, -5295, -4693, -3896, -3192, -2202, -583, 1331, 2569, 2995, 2956, 2848, 2812, +2776, 2515, 1833, 1170, 1068, 1477, 1040, -565, -2405, -3557, -4159, -4153, -2975, -870, 1108, 2370, +3221, 3951, 4566, 5202, 5240, 4549, 3283, 2475, 2561, 2360, 1182, -199, -1030, -1758, -2701, -3576, +-3875, -3420, -2687, -2649, -3651, -4776, -5113, -4804, -4184, -3707, -2798, -1130, 789, 2077, 2691, 2838, +2797, 2809, 2874, 2707, 1840, 1122, 1335, 1798, 1335, -129, -1682, -3066, -4124, -4399, -3413, -1513, +351, 1828, 2713, 3543, 4360, 5070, 5429, 4713, 3409, 2819, 2996, 2631, 1469, 347, -472, -1361, +-2396, -3407, -3919, -3475, -2593, -2601, -3469, -4537, -4930, -4759, -4430, -4147, -3293, -1668, 193, 1577, +2358, 2697, 2676, 2755, 3094, 2829, 1804, 1150, 1605, 2016, 1553, 402, -972, -2544, -3993, -4426, +-3796, -2167, -241, 1188, 2253, 3092, 3998, 5035, 5549, 4756, 3573, 3210, 3320, 2841, 1824, 883, +35, -893, -1956, -3300, -3882, -3465, -2600, -2534, -3348, -4329, -4684, -4668, -4628, -4479, -3749, -2185, +-410, 1033, 2066, 2421, 2461, 2772, 3288, 2849, 1737, 1274, 1753, 2102, 1715, 1001, -313, -2070, +-3629, -4451, -4072, -2708, -935, 628, 1709, 2497, 3618, 4982, 5476, 4703, 3761, 3536, 3504, 3009, +2213, 1256, 546, -342, -1609, -3095, -3823, -3480, -2628, -2511, -3300, -4114, -4457, -4561, -4747, -4786, +-4100, -2768, -1047, 548, 1709, 2028, 2198, 2878, 3377, 2832, 1703, 1452, 1817, 2052, 1984, 1432, +279, -1469, -3271, -4306, -4272, -3247, -1543, 95, 1015, 1841, 3269, 4821, 5258, 4624, 4017, 3726, +3678, 3277, 2471, 1657, 1087, 215, -1182, -2810, -3722, -3403, -2653, -2519, -3195, -3895, -4139, -4424, +-4777, -4893, -4384, -3311, -1645, 175, 1254, 1596, 1983, 2978, 3401, 2747, 1885, 1566, 1785, 2092, +2130, 1857, 883, -867, -2767, -3986, -4408, -3634, -1973, -424, 307, 1213, 2986, 4515, 5025, 4674, +4153, 3938, 3926, 3517, 2739, 2093, 1634, 869, -666, -2442, -3439, -3264, -2565, -2509, -3066, -3585, +-3810, -4223, -4696, -4820, -4650, -3762, -2088, -179, 760, 1091, 1937, 2987, 3320, 2825, 2023, 1668, +1793, 2075, 2236, 2264, 1382, -223, -2128, -3647, -4461, -3904, -2272, -1063, -426, 704, 2524, 4114, +4769, 4585, 4204, 4106, 4058, 3691, 2925, 2412, 2151, 1398, -169, -2085, -3164, -3110, -2588, -2574, +-3017, -3304, -3633, -4066, -4529, -4791, -4942, -4282, -2414, -660, 83, 674, 1720, 2811, 3191, 2815, +2079, 1742, 1672, 1971, 2307, 2444, 1788, 375, -1434, -3370, -4472, -3955, -2656, -1736, -1095, 97, +1949, 3654, 4388, 4400, 4179, 4169, 4177, 3724, 3039, 2644, 2586, 1914, 273, -1688, -2851, -2899, +-2672, -2672, -2929, -3151, -3468, -3903, -4209, -4767, -5278, -4516, -2732, -1239, -500, 263, 1409, 2626, +3029, 2816, 2223, 1754, 1592, 1870, 2373, 2528, 2129, 1101, -832, -3049, -4231, -3931, -3001, -2269, +-1724, -488, 1383, 3115, 4039, 4159, 4157, 4247, 4291, 3812, 3143, 2924, 3024, 2499, 770, -1193, +-2347, -2642, -2612, -2692, -2724, -3004, -3361, -3491, -3834, -4764, -5351, -4581, -3032, -1678, -996, -107, +1189, 2403, 2952, 2872, 2437, 1830, 1577, 1944, 2355, 2565, 2623, 1822, -229, -2513, -3826, -3766, +-3159, -2712, -2193, -1067, 848, 2625, 3633, 3906, 4092, 4348, 4371, 3876, 3216, 3154, 3467, 2948, +1289, -672, -1796, -2379, -2633, -2567, -2605, -3032, -3186, -3074, -3621, -4693, -5346, -4689, -3302, -2182, +-1453, -526, 864, 2082, 2757, 2966, 2517, 1814, 1649, 1894, 2130, 2581, 2966, 2369, 359, -2018, +-3358, -3615, -3284, -3082, -2711, -1653, 231, 2072, 3114, 3561, 3945, 4346, 4430, 3813, 3248, 3314, +3813, 3332, 1707, -39, -1261, -2208, -2523, -2403, -2709, -3066, -2972, -2801, -3440, -4664, -5277, -4779, +-3601, -2671, -1992, -934, 403, 1623, 2585, 2931, 2442, 1908, 1695, 1707, 1906, 2503, 3240, 2771, +872, -1451, -2885, -3350, -3334, -3344, -3178, -2184, -353, 1435, 2569, 3101, 3764, 4307, 4405, 3742, +3204, 3500, 4063, 3566, 2196, 665, -876, -1926, -2222, -2326, -2779, -3101, -2757, -2567, -3270, -4522, +-5195, -4762, -3858, -3129, -2370, -1357, -169, 1278, 2394, 2743, 2450, 2022, 1793, 1543, 1683, 2480, +3396, 3159, 1393, -806, -2336, -2967, -3207, -3508, -3496, -2666, -866, 854, 1985, 2676, 3546, 4295, +4359, 3596, 3221, 3740, 4112, 3820, 2811, 1228, -429, -1503, -1863, -2266, -2869, -3057, -2610, -2344, +-3123, -4401, -5010, -4715, -4188, -3435, -2720, -1923, -694, 856, 2097, 2490, 2394, 2163, 1757, 1340, +1410, 2368, 3417, 3397, 1853, -263, -1773, -2588, -3043, -3623, -3818, -3087, -1428, 225, 1340, 2135, +3273, 4296, 4146, 3457, 3339, 3725, 4122, 4110, 3359, 1725, 31, -936, -1495, -2149, -2880, -3016, +-2430, -2125, -3025, -4128, -4727, -4719, -4292, -3639, -3050, -2406, -1166, 491, 1665, 2223, 2357, 2305, +1725, 1118, 1188, 2187, 3389, 3551, 2257, 277, -1202, -2083, -2796, -3631, -4002, -3421, -1931, -307, +595, 1598, 3122, 4065, 3911, 3435, 3387, 3635, 4103, 4446, 3769, 2167, 579, -367, -1098, -1965, +-2938, -2924, -2283, -2125, -2862, -3873, -4550, -4706, -4366, -3777, -3445, -2858, -1600, 81, 1224, 1931, +2397, 2435, 1783, 1006, 1034, 2043, 3362, 3735, 2647, 843, -537, -1452, -2431, -3416, -4079, -3619, +-2147, -888, -31, 1268, 2952, 3859, 3833, 3592, 3430, 3604, 4269, 4780, 4197, 2747, 1222, 353, +-511, -1776, -2730, -2701, -2147, -1997, -2623, -3522, -4363, -4555, -4287, -3879, -3735, -3214, -1947, -397, +755, 1644, 2395, 2523, 1820, 935, 873, 1840, 3234, 3812, 2891, 1368, 38, -932, -1933, -3306, +-4149, -3704, -2509, -1594, -679, 861, 2511, 3468, 3736, 3554, 3242, 3506, 4261, 4927, 4489, 3044, +1830, 1017, -103, -1580, -2587, -2589, -2195, -1960, -2441, -3358, -4239, -4437, -4229, -4082, -4062, -3566, +-2343, -977, 187, 1276, 2271, 2537, 1822, 875, 639, 1636, 3063, 3686, 3133, 1738, 567, -273, +-1478, -3179, -4044, -3662, -2909, -2277, -1208, 371, 1928, 3135, 3582, 3390, 3123, 3309, 4292, 5039, +4603, 3420, 2455, 1694, 323, -1242, -2315, -2495, -2196, -1892, -2251, -3219, -4060, -4254, -4120, -4240, +-4290, -3818, -2747, -1546, -379, 903, 2042, 2509, 1858, 699, 495, 1352, 2767, 3592, 3203, 1980, +1103, 365, -1137, -2989, -3760, -3622, -3335, -2767, -1722, -267, 1422, 2741, 3425, 3241, 2867, 3187, +4258, 5035, 4640, 3768, 3071, 2292, 831, -783, -1976, -2370, -2092, -1750, -2052, -3071, -3804, -3964, +-4004, -4278, -4400, -3932, -3095, -2052, -847, 453, 1912, 2520, 1862, 727, 381, 1109, 2568, 3495, +3141, 2230, 1762, 963, -801, -2538, -3351, -3635, -3539, -3181, -2226, -855, 789, 2370, 3205, 3019, +2600, 3089, 4230, 4912, 4644, 4099, 3603, 2808, 1399, -295, -1646, -2256, -1996, -1632, -1998, -2933, +-3583, -3687, -3929, -4326, -4402, -4123, -3397, -2546, -1468, 17, 1660, 2402, 1890, 753, 187, 871, +2414, 3251, 2918, 2516, 2336, 1339, -313, -2014, -2954, -3461, -3661, -3411, -2666, -1439, 253, 2060, +2998, 2780, 2442, 3088, 4159, 4744, 4709, 4411, 4095, 3361, 2038, 311, -1285, -1990, -1822, -1489, +-1926, -2772, -3229, -3467, -3785, -4217, -4405, -4143, -3587, -2998, -1986, -361, 1355, 2298, 2006, 779, +23, 819, 2298, 2828, 2828, 2814, 2712, 1784, 175, -1399, -2518, -3254, -3645, -3565, -3084, -2056, +-275, 1751, 2690, 2458, 2334, 3030, 4009, 4571, 4691, 4681, 4437, 3941, 2718, 903, -869, -1687, +-1507, -1409, -1868, -2522, -2978, -3226, -3586, -4129, -4329, -4073, -3775, -3390, -2416, -803, 969, 2264, +2128, 661, 65, 875, 2006, 2482, 2724, 3066, 3022, 2180, 731, -761, -2024, -2946, -3474, -3588, +-3492, -2652, -711, 1327, 2250, 2132, 2146, 2914, 3708, 4331, 4607, 4727, 4665, 4379, 3346, 1387, +-511, -1321, -1349, -1405, -1825, -2432, -2838, -3040, -3554, -4116, -4269, -4096, -4072, -3804, -2924, -1547, +559, 2121, 1895, 547, 59, 775, 1587, 2027, 2508, 3084, 3124, 2446, 1185, -239, -1643, -2668, +-3224, -3700, -3972, -3202, -1271, 819, 1677, 1767, 1937, 2636, 3404, 4036, 4442, 4606, 4772, 4828, +3844, 1843, -27, -941, -1209, -1333, -1841, -2365, -2670, -2924, -3558, -4066, -4144, -4262, -4234, -4114, +-3650, -2187, 165, 1827, 1601, 463, 111, 623, 1151, 1615, 2257, 2982, 3152, 2643, 1687, 207, +-1265, -2209, -2920, -3710, -4340, -3628, -1721, 237, 1193, 1425, 1733, 2371, 3108, 3834, 4192, 4444, +4936, 5218, 4258, 2379, 487, -525, -923, -1231, -1807, -2225, -2385, -2891, -3432, -3838, -4126, -4188, +-4174, -4400, -4224, -2675, -163, 1473, 1333, 523, 245, 537, 893, 1297, 2125, 2855, 3143, 3001, +2147, 743, -699, -1553, -2383, -3578, -4398, -3818, -2041, -217, 801, 1265, 1585, 2175, 3013, 3700, +3936, 4416, 5158, 5582, 4788, 3025, 1149, 33, -427, -1095, -1613, -1897, -2257, -2729, -3157, -3708, +-4030, -3970, -4056, -4692, -4730, -3073, -561, 979, 1109, 525, 355, 405, 579, 1099, 1837, 2611, +3115, 3217, 2525, 1077, -153, -929, -1923, -3439, -4468, -4024, -2491, -811, 347, 933, 1197, 1929, +2805, 3325, 3561, 4204, 5146, 5702, 5190, 3407, 1683, 625, -207, -981, -1407, -1801, -2217, -2573, +-3035, -3699, -3939, -3703, -3989, -5008, -5068, -3487, -1043, 465, 763, 617, 365, 253, 379, 825, +1527, 2271, 3047, 3369, 2713, 1395, 381, -295, -1473, -3219, -4389, -4131, -2945, -1293, -41, 499, +869, 1743, 2603, 2949, 3271, 3887, 5033, 5876, 5372, 3833, 2377, 1137, 73, -689, -1205, -1705, +-2073, -2343, -2965, -3737, -3689, -3449, -3957, -5183, -5419, -3791, -1613, -125, 513, 557, 373, 133, +253, 599, 1127, 1939, 2967, 3399, 2799, 1687, 939, 361, -1021, -2823, -4123, -4237, -3257, -1649, +-435, 65, 683, 1567, 2369, 2771, 2923, 3629, 5061, 5929, 5559, 4423, 3057, 1693, 553, -245, +-933, -1575, -1703, -2109, -2939, -3583, -3423, -3079, -3859, -5263, -5469, -4107, -2141, -643, 265, 513, +305, 95, 217, 365, 719, 1639, 2815, 3365, 2757, 1963, 1469, 827, -545, -2339, -3873, -4361, +-3447, -2051, -1025, -335, 299, 1239, 2149, 2365, 2415, 3361, 4817, 5701, 5625, 4825, 3573, 2085, +1085, 77, -869, -1317, -1501, -1989, -2997, -3573, -3123, -2913, -3837, -5279, -5579, -4475, -2769, -1195, +-37, 311, 189, 107, 109, 119, 303, 1369, 2671, 3161, 2693, 2237, 1897, 1225, 38, -1799, +-3653, -4225, -3583, -2437, -1421, -773, -79, 1087, 1895, 1947, 2073, 3105, 4545, 5429, 5793, 5211, +3929, 2753, 1629, 435, -617, -1031, -1083, -1857, -2993, -3353, -2825, -2683, -3683, -5093, -5495, -4745, +-3259, -1573, -377, 145, 141, 221, 159, -109, 17, 1219, 2483, 2865, 2715, 2475, 2163, 1793, +693, -1291, -3181, -3979, -3655, -2607, -1797, -1219, -301, 943, 1669, 1589, 1897, 2913, 4109, 5363, +5883, 5467, 4451, 3407, 2301, 823, -271, -505, -673, -1705, -2857, -3067, -2461, -2435, -3439, -4695, +-5379, -4925, -3621, -1927, -683, -89, 141, 393, 183, -343, -95, 1093, 2135, 2699, 2711, 2499, +2471, 2317, 1193, -657, -2707, -3775, -3553, -2797, -2233, -1763, -579, 707, 1153, 1319, 1577, 2369, +3681, 5025, 5769, 5481, 4729, 3965, 2737, 1045, 43, -133, -437, -1691, -2871, -2881, -2385, -2383, +-3255, -4507, -5377, -5223, -4037, -2403, -1193, -545, 79, 441, -55, -547, -265, 689, 1763, 2427, +2395, 2431, 2603, 2561, 1691, -171, -2287, -3537, -3431, -2935, -2821, -2063, -823, 271, 875, 1071, +1289, 1923, 3245, 4749, 5551, 5421, 5147, 4513, 3155, 1407, 453, 373, -191, -1597, -2673, -2703, +-2265, -2231, -2965, -4183, -5247, -5393, -4267, -2773, -1795, -847, 111, 345, -133, -561, -483, 437, +1519, 2087, 2231, 2347, 2721, 2847, 2208, 434, -1929, -3029, -3133, -3198, -3087, -2371, -1180, -96, +571, 819, 913, 1419, 2866, 4309, 5081, 5313, 5393, 4925, 3438, 1715, 985, 801, 25, -1378, +-2439, -2526, -2137, -2087, -2585, -3761, -5082, -5252, -4245, -3194, -2241, -961, -3, 321, -199, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +104, 115, 178, 307, 467, 366, 35, 355, 1216, 1428, 1305, 2259, 2516, 2007, 3124, 4965, +5368, 5524, 5318, 2805, 985, 1227, 1258, 135, -723, -860, -929, -739, -2813, -5111, -5781, -7024, +-8052, -9486, -11802, -10979, -7294, -7399, -10161, -11343, -8902, -4408, -3706, -6200, -5740, -4575, 177, 5387, +6038, 1238, 1877, 5178, 1804, 2667, 6771, 7385, 4339, 3030, 6193, 12654, 19093, 21419, 21419, 17132, +12972, 14201, 14107, 6885, 1465, 3876, 1006, -4321, -4949, -7893, -9285, -8712, -10899, -16877, -20501, -16261, +-15505, -20880, -22827, -19445, -15298, -11537, -8656, -12424, -15575, -6619, 2314, 1475, 3265, 7109, 6627, 6109, +7529, 7792, 9516, 11673, 7902, 4053, 6399, 13504, 23522, 30507, 26659, 23720, 26400, 24822, 19308, 13324, +11082, 10156, 5785, 71, -4613, -7434, -7373, -8507, -16261, -23428, -21390, -21243, -25490, -26247, -27756, -26143, +-16026, -10020, -13748, -16738, -13351, -8672, -4799, -968, 2677, 8268, 10468, 8480, 8595, 10220, 9078, 9151, +4698, -4573, -1695, 10718, 19557, 22236, 23886, 26026, 24762, 21912, 18081, 13991, 11857, 12689, 9769, -28, +-3672, 357, -1719, -6609, -10173, -16614, -17918, -14191, -18350, -28634, -28596, -20175, -15524, -14644, -15442, -17603, +-15827, -10763, -9575, -6440, -417, 3502, 6624, 7456, 5999, 9065, 13426, 10254, -619, -5926, -590, 8171, +13386, 18026, 24365, 25999, 25960, 25209, 19002, 16657, 19760, 16687, 8698, 2727, 1436, 1841, 1908, -3672, +-11717, -12637, -8906, -11733, -20282, -25919, -26826, -21094, -18170, -20590, -19165, -19041, -19651, -16058, -11876, -10743, +-5747, 1141, 1382, 302, 5155, 12518, 13162, 3917, -4516, -6739, -6261, -219, 5998, 9107, 16336, 23546, +22182, 18222, 19446, 19774, 19507, 18923, 12675, 6778, 10690, 13659, 7577, 1907, -884, -1360, 227, -5499, +-16841, -22514, -21559, -20186, -19400, -19474, -21154, -22400, -23211, -22979, -21249, -17148, -9755, -6130, -9516, -4994, +5615, 11240, 11494, 6218, -2232, -5824, -3619, -2967, 355, 8612, 15997, 19977, 20266, 18577, 18039, 21788, +22449, 16259, 10622, 9470, 12353, 12977, 7083, 1440, 2213, 3435, 468, -4452, -11871, -18621, -18752, -17311, +-17965, -18515, -18399, -17665, -21213, -23551, -17594, -10391, -7489, -6380, -5862, -396, 11688, 19837, 17870, 13001, +9861, 4680, -811, 287, 2749, 7260, 17075, 20017, 15409, 15600, 19507, 20741, 18539, 12591, 7928, 9734, +12560, 9446, 5205, 3099, 4570, 6579, 4308, -505, -8151, -14211, -15387, -17531, -20614, -18602, -16410, -20716, +-25796, -25553, -20861, -14979, -12275, -14801, -13270, -2123, 7912, 13235, 16872, 15213, 10944, 7114, 1133, -2720, +104, 6784, 12708, 13565, 10425, 11725, 19159, 18966, 13187, 9794, 8241, 9158, 9712, 6892, 3382, 2194, +5093, 8650, 6371, 1203, -1632, -6419, -12655, -15212, -14661, -13644, -13862, -18329, -25001, -23871, -16680, -14258, +-15216, -14271, -12285, -4679, 6484, 12641, 15029, 17509, 16159, 9125, 2522, -1825, 267, 7170, 9858, 7881, +7098, 12735, 18257, 16133, 12096, 10776, 9198, 9005, 9839, 5427, 73, 1288, 5140, 5599, 3831, 3172, +-899, -8078, -13632, -17068, -15300, -11640, -15039, -21705, -24916, -23410, -19755, -17453, -19577, -21287, -16775, -10260, +-2911, 4635, 10219, 15592, 15877, 7699, -863, -1911, 1896, 4274, 3276, 2755, 5863, 10836, 14802, 14553, +11274, 10080, 11733, 12270, 8714, 4785, 3232, 2578, 4383, 6039, 5639, 7114, 4536, -5465, -12688, -10934, +-9375, -10560, -12891, -19266, -21986, -18813, -17477, -18125, -19247, -19882, -16853, -12162, -6859, 599, 10062, 18256, +17650, 7989, 2483, 4500, 5799, 4766, 4008, 3842, 6284, 12669, 17156, 14059, 12494, 15280, 16090, 15055, +12166, 8467, 6656, 5958, 4415, 5689, 10002, 10046, 5602, -2613, -8890, -8039, -6857, -10001, -14911, -19814, +-22134, -21167, -21092, -23209, -24684, -23928, -21839, -21505, -18571, -7696, 5251, 11984, 10773, 5997, 3431, 4073, +6051, 3939, 628, 2492, 7468, 12234, 13982, 12932, 12454, 16152, 18329, 14598, 12553, 12427, 8423, 4623, +4623, 7375, 12018, 13814, 8324, 379, -3420, -2579, -2666, -6568, -11265, -15408, -16938, -16149, -18694, -22111, +-21460, -19903, -22221, -25189, -19832, -8515, 2014, 9705, 10503, 6501, 5721, 8768, 7322, 3583, 2420, 3492, +8540, 12313, 11276, 12093, 15003, 16842, 17435, 16283, 15421, 14787, 10186, 4917, 5116, 9437, 13588, 13571, +8369, 2470, -548, 416, -630, -5997, -11244, -13822, -14014, -17155, -20635, -19944, -18926, -20564, -24276, -26646, +-23161, -11760, -430, 4870, 6972, 6230, 6472, 9640, 7485, 1955, 2387, 5687, 6436, 7423, 9033, 10685, +12839, 14218, 14845, 15499, 16880, 16084, 9469, 4172, 6075, 10399, 13197, 12707, 8748, 3183, 2771, 3846, +-730, -6295, -8275, -9973, -14675, -18189, -19142, -19546, -18068, -20142, -26879, -29687, -24943, -15221, -5218, 41, +2362, 5597, 8561, 8787, 6183, 3135, 3861, 5096, 4772, 5442, 7539, 10650, 11434, 10929, 12956, 15908, +17362, 14671, 8665, 3934, 5118, 10322, 12730, 10234, 6589, 6158, 5653, 1936, -844, -3899, -7065, -9391, +-14259, -18932, -18668, -16860, -17034, -19821, -26651, -30594, -25300, -16969, -11331, -6499, -643, 4258, 6406, 7283, +5309, 3659, 4583, 4341, 2794, 3816, 8248, 10104, 8780, 9793, 13653, 17551, 19579, 17461, 9979, 5709, +10588, 14633, 13206, 12839, 12668, 11529, 10511, 7347, 3300, 1894, -543, -5478, -11203, -16187, -15936, -13369, +-14329, -20171, -27889, -30128, -26624, -21923, -18271, -13317, -6363, -1068, 1269, 1511, 1365, 1549, 549, -798, +-1280, 1411, 4743, 5753, 5646, 6169, 11247, 18530, 19567, 14888, 10430, 8486, 10510, 12914, 11792, 11636, +13366, 12373, 9860, 6865, 4625, 3302, 902, -4244, -12919, -16982, -14084, -12012, -15112, -21081, -26218, -28436, +-26259, -23648, -21293, -15161, -7397, -2698, -947, 1312, 3458, 1956, 387, 12, -912, 1375, 6176, 5349, +2192, 5697, 12883, 17856, 18944, 16189, 12932, 11810, 12733, 12827, 12476, 13420, 14473, 14035, 11321, 8186, +7884, 8253, 5473, -2215, -9969, -12506, -10086, -8892, -13283, -18878, -22881, -25297, -26062, -25769, -22366, -15543, +-9799, -5187, -737, 1862, 3793, 4594, 1041, -1194, 1240, 4097, 5459, 2958, 982, 4863, 11913, 15843, +16021, 15537, 13439, 11572, 11669, 11404, 10777, 12465, 14717, 12597, 8423, 7965, 9805, 10424, 6618, -1397, +-8464, -9664, -6959, -7710, -12478, -15324, -17923, -23681, -26342, -24785, -23392, -18329, -11795, -8287, -4248, 1514, +4880, 2815, -556, -176, 2682, 5559, 4790, 1659, 875, 5026, 11104, 14514, 16043, 16004, 15266, 14452, +12835, 11786, 12668, 14839, 15622, 12309, 8378, 9313, 12730, 13192, 8170, 292, -4514, -5451, -6444, -7169, +-9312, -12857, -16497, -21304, -25503, -26424, -23696, -20177, -17065, -12713, -6499, 260, 2950, 157, -2146, 86, +4158, 5120, 3928, 1904, 941, 5165, 10575, 12973, 15038, 17332, 17414, 15192, 12556, 12038, 14215, 16169, +15518, 10816, 7191, 10803, 14461, 11864, 7645, 2708, -3012, -6144, -6375, -8217, -10570, -11596, -15856, -22728, +-26920, -26877, -25778, -25185, -23348, -18500, -10447, -3633, -2288, -4160, -4839, -2070, 1863, 2518, 773, -893, +-646, 2373, 6451, 8776, 12313, 16298, 16625, 14466, 11529, 12000, 16107, 17386, 13821, 9959, 9500, 11865, +14437, 13925, 9865, 5630, 1208, -2882, -5253, -6527, -6956, -8687, -13590, -20211, -23774, -23585, -24710, -27209, +-25532, -19327, -12042, -5779, -4045, -5461, -4641, -830, 2590, 2282, 245, 94, -138, 861, 3653, 6105, +10376, 15629, 16222, 11772, 10472, 14042, 16545, 16143, 13304, 9920, 9323, 12449, 14948, 13693, 11904, 9711, +4516, -647, -3272, -3496, -3485, -6551, -12672, -17355, -19986, -21998, -25151, -29014, -27859, -21874, -14863, -9609, +-8447, -8483, -5842, -1886, 391, 468, 11, -255, 318, 299, 303, 4835, 11481, 15123, 14297, 12051, +12277, 15554, 18431, 17255, 13772, 11349, 11145, 12939, 14759, 14640, 14307, 12959, 6974, 948, -109, -265, +-1900, -5619, -10414, -13758, -16329, -19097, -23811, -28556, -27737, -21361, -15594, -12574, -10219, -9009, -6445, -1494, +221, -481, 1126, 2454, 173, -2354, -367, 4546, 9808, 12997, 12110, 10104, 11988, 15983, 17406, 16199, +13726, 12234, 11744, 11705, 13613, 15519, 16041, 13940, 8130, 3725, 3011, 2464, -192, -4322, -8024, -10506, +-12483, -17598, -24439, -28552, -28280, -23758, -18916, -16712, -15468, -12240, -8262, -6171, -4893, -2367, 181, 95, +-2571, -5203, -3734, 2256, 7282, 9170, 8661, 7973, 11002, 14635, 15333, 14769, 14243, 12790, 10425, 10403, +13201, 15990, 16433, 13710, 9450, 5971, 5471, 4960, 631, -3284, -4657, -6178, -9445, -14671, -22209, -27943, +-26861, -22837, -21140, -19613, -15478, -12154, -10204, -7640, -5502, -2120, 1472, 831, -2776, -5450, -3277, 2774, +6598, 7579, 7880, 9225, 11548, 13840, 14947, 15730, 16186, 13288, 10142, 10706, 13550, 16443, 17012, 14177, +10542, 9197, 8532, 5905, 1986, -1626, -2902, -2892, -5711, -13180, -21098, -24892, -25542, -24408, -23444, -21455, +-16847, -13789, -12686, -10708, -7177, -2202, 1359, 537, -3786, -5620, -2439, 2017, 4608, 5682, 7839, 9722, +10639, 12961, 15606, 16939, 16860, 14346, 10541, 10791, 14748, 16794, 16119, 14495, 12495, 11108, 10736, 8138, +2100, -850, 564, 251, -3851, -10742, -17210, -21590, -23842, -24826, -24758, -21893, -17696, -15315, -15246, -13598, +-8029, -2134, 841, -669, -4080, -4469, -2294, -38, 2105, 4559, 6294, 7454, 8983, 11262, 14608, 17089, +16688, 13104, 10685, 11928, 14336, 16402, 16101, 13905, 13690, 14249, 12967, 8687, 3681, 2148, 3406, 2902, +-1612, -7055, -12556, -17800, -21646, -24446, -24398, -21218, -17727, -17022, -17843, -15289, -8684, -2935, -1377, -1775, +-2873, -3918, -2759, -803, 886, 3201, 5509, 5665, 5892, 10398, 14776, 16289, 16310, 13476, 10903, 12398, +15698, 16097, 14171, 13962, 15393, 15985, 13552, 9070, 5316, 4040, 5008, 3874, -254, -4486, -9142, -15343, +-21406, -24773, -24665, -21201, -19211, -20546, -20674, -17053, -11141, -6230, -3849, -3448, -4039, -3985, -4065, -3055, +3, 2080, 2755, 2607, 3957, 7820, 12500, 15256, 14093, 11524, 10394, 12276, 14371, 13462, 12353, 13552, +15911, 16296, 13504, 9626, 6920, 6211, 5930, 4665, 1794, -963, -4698, -12363, -20010, -23129, -22284, -20663, +-20648, -21498, -21847, -18514, -12590, -8827, -6284, -4148, -4026, -5459, -5032, -2770, -883, 1286, 1681, 487, +1695, 6614, 11989, 13429, 12291, 10938, 11078, 12372, 12857, 11586, 10869, 13390, 15876, 15183, 12605, 9592, +7859, 6938, 5413, 3683, 2967, 2468, -2763, -11164, -17974, -21402, -21239, -20771, -21819, -23196, -22289, -19325, +-15526, -10908, -7297, -5148, -4898, -6038, -5575, -3275, -337, 1111, 154, -1493, 512, 6218, 10554, 11704, +10826, 10812, 12265, 12589, 11888, 10598, 10880, 13934, 16283, 15333, 12576, 11941, 10915, 7771, 5888, 5651, +6295, 5610, 836, -7698, -14930, -17468, -19005, -20656, -21884, -22948, -23064, -21190, -17287, -12953, -8916, -6198, +-5929, -7229, -6604, -3022, -293, 129, -1321, -2952, -89, 5378, 8956, 9674, 10052, 11765, 12916, 12970, +11203, 9823, 11679, 14462, 15442, 14676, 14511, 14330, 11954, 8825, 6487, 7312, 9240, 8242, 3133, -4083, +-10040, -13948, -16486, -18782, -20684, -21973, -22642, -21557, -18680, -14010, -9036, -6583, -6618, -7734, -6186, -2082, +519, 91, -2217, -2509, 302, 4709, 7569, 7881, 9431, 12469, 13986, 12246, 10414, 10899, 12083, 13871, +14691, 14635, 15620, 15940, 12772, 8532, 7640, 9135, 10312, 9613, 5533, -613, -6851, -10914, -14035, -17596, +-19644, -21367, -23177, -23537, -20694, -15552, -10946, -8440, -8975, -9446, -6541, -2485, -207, -1156, -2910, -2862, +200, 3617, 4632, 6174, 9460, 12429, 12881, 11470, 10656, 11335, 12193, 12324, 13066, 15024, 16764, 16361, +12643, 9363, 8737, 9832, 11411, 10793, 7720, 2670, -2886, -7564, -11668, -14722, -17424, -19994, -23060, -24785, +-21761, -16521, -12269, -10735, -11159, -10698, -7316, -2536, -1176, -2940, -3626, -2235, -403, 773, 2168, 4512, +8315, 11245, 11068, 10429, 10891, 11617, 10713, 10265, 12057, 14292, 16138, 15621, 12251, 9122, 8663, 10197, +10821, 10883, 9104, 4706, -296, -5430, -9396, -12649, -15431, -19286, -24155, -25939, -23057, -18055, -14392, -13673, +-14251, -12674, -8030, -4491, -4060, -4737, -4213, -2526, -2141, -1908, -201, 3235, 6783, 8402, 9242, 10038, +10985, 11019, 9716, 9478, 11082, 14265, 16037, 15067, 12338, 9640, 9380, 10308, 11205, 11631, 10668, 7530, +2192, -2682, -5994, -8954, -12511, -17650, -23418, -26162, -23020, -18363, -16419, -16179, -15720, -12901, -8921, -6309, +-5750, -5350, -3137, -2352, -3430, -3104, -441, 2856, 4904, 7148, 8655, 10089, 11733, 11253, 9509, 9124, +11399, 14499, 16043, 15273, 12602, 10495, 9998, 10411, 11399, 12567, 12556, 9432, 4766, 391, -2488, -4654, +-8759, -15252, -22078, -24203, -21401, -18639, -17757, -17848, -16109, -12793, -9945, -8212, -6876, -4336, -2833, -2910, +-3551, -3298, -759, 1830, 3521, 5359, 7674, 10333, 11806, 11184, 9169, 9008, 11433, 14385, 16081, 15578, +13772, 11530, 10211, 10516, 11636, 13319, 13653, 11098, 6305, 2561, 1540, -701, -5710, -13283, -20070, -21952, +-20287, -19187, -19887, -18721, -15977, -14070, -12060, -9891, -7510, -5028, -3414, -3379, -4315, -3401, -1176, 403, +1409, 3527, 6730, 9299, 10876, 10037, 8193, 8341, 10486, 13150, 14800, 15344, 14032, 11538, 10090, 9747, +11461, 13696, 14143, 11245, 6726, 4753, 4579, 2735, -3435, -11534, -16827, -19037, -19826, -20646, -20769, -19317, +-17385, -15829, -14443, -11855, -8586, -5974, -4761, -4868, -4726, -3618, -1960, -1074, -564, 1986, 5551, 8773, +9989, 9077, 7976, 7820, 9838, 12178, 14032, 15088, 14379, 11980, 9402, 9448, 11710, 14287, 14850, 11065, +7306, 7481, 8181, 4981, -1340, -7678, -12950, -16309, -18517, -20219, -20612, -19479, -18043, -17539, -16245, -13035, +-9606, -7307, -6454, -5691, -5242, -4184, -2818, -2994, -2353, 251, 4030, 7187, 8501, 8271, 7142, 7220, +8350, 10484, 13327, 14869, 14585, 11854, 8528, 8756, 12460, 14933, 13397, 10398, 8985, 9775, 9925, 6690, +1481, -4093, -9152, -13563, -17160, -19279, -19933, -19003, -18809, -18857, -17298, -14070, -10587, -8885, -7800, -6341, +-5124, -3990, -3508, -3748, -3498, -753, 3382, 5997, 7667, 8157, 7225, 6748, 7561, 9295, 12429, 15765, +15215, 10896, 8334, 10072, 13489, 14379, 12873, 10923, 10455, 11630, 11379, 8809, 4519, 81, -4796, -10383, +-14502, -17015, -17984, -18319, -18924, -19178, -17809, -14350, -11551, -10177, -8757, -7156, -5201, -3966, -4118, -4675, +-4176, -1855, 1749, 5050, 6606, 7374, 7566, 6236, 5667, 8049, 12754, 15503, 13973, 10196, 8491, 10752, +12877, 13076, 11976, 10723, 11050, 11855, 11594, 9735, 6901, 3084, -2381, -7982, -12558, -15216, -16798, -18578, +-19685, -19981, -18847, -15769, -13301, -12405, -10755, -8103, -6323, -5134, -4909, -6137, -5790, -3057, -40, 2289, +5299, 7583, 6666, 4300, 3833, 7521, 12169, 13825, 12488, 9687, 9003, 10943, 12258, 11742, 10873, 10903, +10943, 11292, 11576, 10680, 9071, 5709, 251, -5359, -9798, -12778, -15305, -17848, -20080, -20280, -18937, -17145, +-15129, -13976, -12487, -9701, -6680, -5784, -6647, -6759, -6080, -4531, -2634, 550, 5126, 7100, 5250, 2720, +3275, 7010, 10823, 12309, 10903, 9329, 9577, 10589, 11063, 10666, 10392, 10553, 10466, 10624, 11295, 11634, +10432, 7718, 2694, -3046, -6748, -9826, -13660, -17223, -19116, -20089, -19472, -17292, -16467, -15973, -13600, -10171, +-7790, -7384, -6870, -6259, -6561, -6730, -4626, -12, 4370, 6042, 4228, 1717, 3171, 7056, 9740, 10608, +10364, 9876, 10067, 10665, 10553, 10542, 10453, 10225, 10319, 10376, 11326, 12684, 12517, 9401, 5107, 980, +-3399, -6883, -10801, -15391, -18145, -18794, -18125, -17767, -17822, -16571, -13522, -10698, -9307, -7562, -5775, -5881, +-7021, -7701, -5387, -14, 4696, 5658, 3709, 2396, 3985, 7441, 9339, 10168, 11019, 11113, 11240, 11859, +11904, 11298, 11581, 11530, 10230, 10734, 12735, 14013, 14044, 12126, 8506, 4326, 844, -2546, -7672, -13075, +-15798, -16152, -17156, -18654, -18058, -16376, -14496, -12487, -10478, -8025, -5808, -5983, -8464, -9215, -6397, -1088, +3197, 3807, 2503, 2144, 3724, 5989, 7963, 9150, 9668, 10689, 10943, 10750, 11368, 11676, 11223, 10448, +9755, 10135, 11815, 13871, 14233, 12731, 9771, 6879, 4573, 191, -5815, -10372, -12774, -14867, -16938, -18144, +-17825, -16309, -15355, -14058, -11232, -7757, -5500, -6391, -9172, -9828, -6276, -1574, 1422, 2943, 2427, 2056, +4000, 5895, 6869, 8480, 10079, 10463, 10526, 11402, 12068, 12240, 11810, 10821, 9960, 9853, 12173, 14800, +14470, 12761, 12109, 10660, 7309, 2905, -2368, -6857, -9876, -13075, -16033, -17334, -16998, -16782, -16818, -15851, +-12424, -7712, -6115, -7874, -9921, -10506, -7742, -3254, -369, 599, 1020, 1615, 2321, 3845, 5415, 6958, +8271, 8525, 9159, 10249, 10837, 11374, 11426, 9526, 7790, 9049, 11424, 12510, 12319, 12299, 12721, 11565, +8411, 4306, 259, -3977, -8161, -11984, -15371, -16505, -16381, -17969, -19102, -17268, -13288, -9254, -7397, -8732, +-11241, -10859, -8125, -5107, -2482, -713, 296, 564, 1012, 2681, 4632, 5711, 6958, 8018, 7858, 8809, +11130, 12025, 10594, 8601, 7967, 9058, 10673, 11102, 11109, 12449, 13288, 12156, 9658, 6230, 3114, -889, +-6302, -10778, -13182, -14601, -16334, -18284, -20134, -18902, -14181, -10133, -8920, -10026, -11583, -11309, -9291, -6929, +-4188, -1762, -1275, -681, 469, 1422, 2990, 5267, 6365, 5879, 6168, 8272, 10716, 11366, 9503, 8088, +8217, 8447, 9192, 9522, 10030, 11970, 13250, 11899, 9923, 8713, 5687, 797, -4183, -8571, -11241, -12760, +-15401, -19031, -21117, -19601, -15121, -11583, -10791, -10897, -11829, -12615, -10868, -8010, -5984, -3973, -1915, -1282, +-1302, 238, 2628, 4671, 5083, 4313, 5556, 8341, 10429, 10702, 9705, 8869, 8978, 9048, 8254, 8732, +10702, 12067, 12727, 12527, 11817, 11017, 8722, 3793, -1464, -5221, -7514, -9436, -13401, -18239, -20020, -18470, +-15493, -12270, -10323, -10778, -12044, -11615, -10504, -8859, -6465, -3870, -1830, -1887, -1765, 602, 3551, 4650, +4521, 4604, 5849, 8823, 10820, 10400, 10304, 10856, 10197, 9037, 8949, 9667, 11127, 12425, 12837, 13250, +13589, 13478, 11597, 6564, 1274, -1252, -3090, -6757, -11378, -15546, -18827, -18488, -15272, -12542, -11078, -10976, +-11379, -11501, -11311, -9986, -7008, -4165, -3430, -3148, -2078, 219, 3027, 3831, 3095, 3964, 6189, 7795, +9015, 9860, 10428, 10933, 10046, 8524, 8563, 9333, 10379, 11376, 11737, 12431, 14341, 15136, 11983, 7766, +4312, 1519, -743, -4022, -8930, -14315, -17961, -17980, -15742, -13774, -12323, -10902, -11335, -12829, -12492, -10582, +-8034, -5607, -4985, -5144, -3040, 49, 1442, 1782, 2248, 3434, 5057, 6036, 7376, 8993, 10113, 10301, +9557, 8195, 7590, 9144, 9820, 9013, 9900, 12285, 14260, 14414, 12401, 8913, 5654, 3551, 1767, -1467, +-7239, -13166, -16428, -17562, -17260, -15164, -12916, -11884, -12401, -13988, -14170, -11409, -8779, -7985, -7528, -6608, +-4154, -1698, -602, -122, 1209, 2557, 3229, 4565, 5964, 7482, 9596, 9900, 8356, 7500, 8246, 8779, +8249, 7937, 9148, 11814, 13954, 14633, 13236, 9723, 7131, 6468, 4631, 532, -4422, -9895, -14472, -16513, +-17055, -15664, -12637, -11605, -12972, -14308, -13348, -11045, -9499, -9223, -8635, -6391, -4423, -2815, -1072, -238, +946, 2701, 3307, 3439, 5367, 8059, 9242, 9049, 8489, 8577, 9071, 8705, 7919, 7570, 8244, 11011, +14302, 14861, 12867, 11040, 9391, 8491, 7051, 3328, -1351, -6411, -11830, -15955, -16871, -15023, -12734, -12049, +-13656, -14308, -12613, -11392, -10904, -10250, -9383, -7757, -5376, -3704, -2837, -1021, 1064, 1852, 1815, 2605, +5112, 7395, 8087, 8459, 8854, 8886, 9247, 9543, 7629, 6439, 8084, 10988, 13748, 14475, 13218, 11714, +11213, 10490, 8593, 6317, 2600, -2779, -9139, -14264, -15250, -13605, -12822, -13103, -13356, -13456, -12691, -11157, +-10855, -11067, -9666, -7694, -6327, -5264, -3410, -1019, 466, 534, 1033, 2744, 4289, 6249, 7568, 7511, +8125, 9337, 9831, 8852, 6991, 5767, 7099, 10510, 12526, 12972, 12688, 11901, 11521, 10845, 9655, 8665, +6057, -318, -7554, -11833, -13486, -13757, -13375, -13801, -14273, -13738, -12469, -11981, -12202, -11863, -10244, -8946, +-8736, -6775, -4123, -2624, -1152, -307, 21, 1373, 3759, 5271, 5799, 6555, 7667, 9478, 10372, 8775, +6656, 5791, 7015, 9584, 11427, 12030, 12552, 12589, 11113, 10603, 11702, 11533, 8440, 2560, -4132, -9186, +-11311, -12314, -13348, -14188, -14210, -12863, -12632, -13161, -12323, -11316, -10871, -10361, -9354, -7839, -5493, -3162, +-2303, -1751, -832, 714, 3033, 4402, 4351, 5218, 7438, 9579, 10139, 8703, 6377, 5971, 7134, 8162, +9904, 12106, 12815, 11554, 10678, 11175, 12636, 13260, 10690, 5325, -1286, -5878, -8115, -10836, -13222, -13457, +-12817, -13035, -13078, -12537, -12352, -11610, -10914, -10919, -10157, -8276, -5892, -3869, -3033, -2729, -1462, 845, +2669, 3520, 3434, 4292, 7372, 9935, 9770, 8467, 7774, 6707, 6171, 7447, 9737, 11988, 12174, 11029, +10471, 11126, 13397, 14715, 12243, 7054, 2363, -1803, -6236, -9571, -11632, -12715, -12700, -12891, -13263, -12997, +-12294, -11785, -11529, -11621, -11388, -9201, -6666, -5250, -4593, -4002, -2410, 229, 2076, 1642, 1775, 4020, +6536, 8238, 8806, 8887, 8138, 6309, 5651, 6795, 8941, 11053, 11554, 9876, 8994, 11385, 14104, 14444, +13014, 9747, 5382, 846, -3626, -7733, -10434, -11678, -12432, -12867, -13443, -13255, -12332, -11927, -12313, -12734, +-12121, -10375, -7705, -6404, -6751, -5480, -2746, -587, -2, 78, 1165, 2861, 4730, 6804, 8401, 8620, +7662, 6353, 4903, 5568, 8734, 10527, 9673, 8373, 8775, 10799, 13166, 14250, 13449, 11437, 7811, 3342, +-1218, -5493, -8738, -10492, -11697, -13115, -13444, -12973, -12538, -12009, -12785, -13750, -12892, -10468, -8697, -8568, +-7955, -5703, -3360, -2125, -1207, -162, 314, 1540, 3811, 5587, 7454, 8964, 8098, 5505, 4693, 6400, +8603, 9718, 8939, 8019, 8543, 10340, 12476, 14019, 14321, 13079, 10613, 6451, 1572, -2286, -5789, -8518, +-10350, -12053, -12986, -12411, -11310, -11777, -13307, -13511, -12004, -10524, -10292, -9562, -8013, -6445, -4398, -2686, +-1916, -1191, 88, 742, 1777, 4593, 7555, 8690, 7277, 5238, 4962, 6619, 8459, 8791, 8338, 7543, +7733, 9576, 11363, 12999, 14399, 14249, 12170, 8637, 4373, 65, -3337, -6074, -9225, -11878, -12416, -11137, +-11092, -12687, -13251, -12770, -12222, -11516, -10667, -10355, -9206, -6940, -5422, -4345, -2721, -1112, -807, -879, +808, 4063, 7303, 7898, 6433, 5239, 5134, 6599, 8151, 8262, 7709, 7422, 7585, 8335, 10171, 12348, +13920, 14819, 13825, 10646, 6313, 2905, 123, -4075, -8524, -10532, -10469, -10728, -11350, -12027, -12885, -12700, +-11964, -11752, -11854, -10973, -9304, -8120, -6880, -5233, -3026, -1671, -2215, -2110, 153, 3568, 6439, 7171, +5925, 4816, 5538, 6771, 7468, 7907, 7734, 7272, 6955, 7705, 9048, 10716, 13331, 15418, 14341, 11116, +8777, 6474, 2228, -2498, -6400, -8832, -9775, -10003, -10931, -12376, -12580, -12202, -12238, -12468, -12232, -11068, +-10175, -9680, -8069, -5585, -3584, -3026, -3294, -3175, -900, 2985, 5570, 5973, 5247, 5016, 5370, 6189, +7349, 7808, 7403, 7083, 7157, 6677, 7103, 10183, 13415, 14538, 13877, 12800, 11274, 8675, 4999, 80, +-4262, -6638, -7951, -9106, -10632, -11640, -11645, -11857, -12480, -12590, -11724, -11373, -11297, -10488, -8743, -6179, +-4196, -4007, -4811, -4157, -1278, 1933, 4171, 5152, 5091, 4519, 5092, 6582, 6901, 7099, 7980, 8049, +6410, 5407, 7017, 9653, 12087, 13625, 13809, 13613, 13008, 11059, 7219, 2381, -1523, -4107, -6230, -8462, +-9682, -10236, -11107, -11887, -12275, -12129, -11675, -11597, -11955, -11586, -9196, -6263, -4941, -5420, -5659, -4661, +-2693, 660, 3522, 4176, 3929, 4511, 5324, 5255, 5866, 7544, 8267, 7500, 5849, 5161, 6294, 8648, +10818, 12156, 13121, 14034, 14293, 12417, 8693, 4974, 1479, -1988, -5001, -6964, -8251, -9417, -10451, -11601, +-12133, -11679, -11169, -12101, -13274, -11964, -9299, -7194, -5892, -5814, -6607, -6305, -3381, -57, 1616, 2970, +4184, 4531, 4129, 4428, 5887, 7578, 8300, 7349, 5738, 5010, 6072, 7996, 9269, 10525, 12630, 14538, +14587, 12994, 10700, 7496, 3814, 134, -3079, -5504, -6888, -7977, -10138, -11702, -11238, -10624, -11443, -12926, +-13398, -12723, -10603, -7497, -6258, -7297, -7976, -6619, -4383, -2291, 17, 2237, 3580, 3489, 2989, 3527, +5097, 7083, 7826, 6729, 5121, 4935, 5891, 6443, 7264, 9158, 11661, 13468, 14206, 13813, 11893, 9335, +6179, 1964, -1612, -3442, -4923, -7680, -9908, -10356, -10356, -10467, -10986, -12565, -14291, -13602, -10507, -8052, +-7607, -8083, -7979, -7137, -5926, -3822, -1065, 1576, 3008, 2927, 2242, 2697, 5019, 7084, 7286, 6336, +5682, 5566, 5223, 5469, 6503, 8079, 10597, 12956, 13961, 13947, 13672, 11718, 7672, 3947, 1466, -902, +-3713, -6271, -8374, -9690, -9409, -8916, -10178, -12792, -14213, -12984, -10684, -8951, -8255, -8084, -8071, -7850, +-6923, -5151, -2154, 1106, 2582, 1940, 1179, 2596, 4743, 5963, 6611, 6585, 6032, 5595, 5413, 4926, +5125, 7209, 9514, 11005, 12767, 14560, 14433, 12143, 9427, 6508, 3528, 942, -1656, -5013, -8097, -8830, +-8100, -8251, -10245, -12609, -13607, -13161, -11569, -9947, -9033, -8576, -8484, -8595, -8597, -6705, -2746, 282, +1002, 845, 1130, 1969, 3564, 5275, 5790, 5992, 6561, 6260, 4919, 4397, 5402, 6322, 7438, 9684, +12391, 14032, 14192, 13169, 10864, 8122, 5936, 3676, 166, -4132, -6738, -7208, -7048, -7733, -9618, -11612, +-12999, -12986, -11893, -10817, -9458, -8150, -8431, -9833, -9552, -6919, -3846, -1189, 269, 376, 584, 1971, +3397, 3958, 5098, 6581, 6824, 5838, 5132, 5169, 4979, 5173, 6559, 8721, 11216, 13488, 14596, 13510, +11500, 10138, 8784, 6130, 1820, -2320, -4838, -5799, -5943, -6759, -8820, -10796, -11695, -12440, -12780, -11108, +-8919, -8412, -9352, -10249, -10105, -8117, -4756, -2318, -1387, -481, 837, 1630, 1938, 3275, 5103, 6010, +6138, 5941, 5571, 4984, 4714, 4835, 5258, 7034, 10105, 12943, 13796, 12843, 12029, 11680, 10559, 7842, +3788, -611, -3450, -4130, -5023, -6654, -7965, -9315, -11411, -13004, -12687, -11205, -9502, -8678, -9606, -11086, +-10851, -8447, -6172, -4605, -2659, -763, 65, 297, 1335, 2843, 4133, 5326, 5931, 5727, 5364, 5239, +4947, 3959, 3802, 5913, 9345, 11734, 12544, 12596, 12324, 12590, 12395, 9628, 5107, 1489, -815, -2997, +-4387, -5125, -6401, -8391, -10601, -12325, -12877, -11372, -9147, -8905, -10381, -11099, -10279, -9212, -7901, -5660, +-3448, -1941, -936, -196, 661, 1964, 3661, 4989, 5484, 5486, 5905, 6043, 4609, 3142, 3269, 5006, +7939, 10618, 11417, 11312, 12546, 13797, 13006, 10474, 7255, 3818, 462, -1787, -3044, -4205, -5350, -7054, +-9866, -12536, -12695, -10806, -9761, -9949, -10355, -10810, -11053, -10463, -8937, -7019, -4994, -3240, -1944, -1292, +-642, 1180, 2888, 3512, 4243, 5577, 6245, 5816, 4660, 2781, 2219, 4349, 7161, 8563, 9261, 10749, +12507, 13491, 13463, 12022, 9117, 5665, 2570, -119, -2089, -2545, -3225, -5978, -9419, -11314, -11493, -10971, +-10200, -9826, -10109, -10776, -11189, -10588, -9550, -8015, -5693, -3773, -3162, -2470, -768, 571, 1573, 2720, +3759, 5202, 6799, 6765, 4558, 2589, 2887, 4429, 5800, 6996, 8399, 10025, 11770, 13580, 14076, 12906, +11021, 8256, 4347, 1108, 153, -243, -1889, -4780, -7746, -9622, -10563, -10469, -9678, -9449, -10036, -10388, +-10592, -11102, -10210, -7976, -6303, -5098, -3846, -2734, -1460, 109, 1039, 1269, 2749, 5470, 7153, 6371, +4468, 3375, 3182, 3755, 4947, 5936, 6905, 8834, 11182, 12489, 13452, 14036, 12784, 9526, 5644, 3109, +2103, 1091, -943, -3564, -6482, -8968, -9764, -9711, -9918, -9579, -9304, -10182, -11304, -11432, -10595, -9230, +-7504, -6248, -5369, -3850, -1766, -573, -802, -213, 2252, 4945, 6245, 6110, 4866, 3371, 3319, 3928, +4015, 4533, 6091, 7919, 9410, 11146, 13343, 14689, 13450, 10329, 7433, 5106, 3457, 2628, 847, -2409, +-5281, -7235, -8950, -9871, -9463, -8990, -9261, -10049, -11117, -11678, -10990, -9367, -8367, -7935, -6521, -4019, +-2308, -2157, -1859, -827, 1193, 4069, 5866, 5567, 4575, 4132, 3851, 3452, 3371, 4142, 5454, 6284, +7423, 10139, 12868, 14097, 13715, 11567, 8486, 6406, 5483, 3997, 1887, -500, -3311, -6095, -8132, -9099, +-9215, -8833, -8806, -9865, -11508, -11865, -10502, -9782, -9938, -8990, -7001, -5005, -3410, -2851, -3025, -2094, +520, 3245, 4704, 4846, 4744, 4654, 3686, 3008, 3594, 4116, 4189, 4928, 6522, 8713, 11760, 13982, +13671, 11822, 9852, 8162, 6638, 5369, 3707, 1310, -1600, -4458, -6796, -8518, -8601, -7758, -8460, -10291, +-11057, -10844, -10613, -10506, -10427, -9812, -7854, -5523, -4193, -4040, -4171, -2745, -125, 1831, 3269, 4743, +5111, 4201, 3662, 3568, 3482, 3608, 3662, 3692, 4785, 7671, 10908, 12958, 13276, 12318, 10837, 9096, +7835, 6754, 4935, 2883, 555, -2918, -6195, -7279, -7116, -7612, -8713, -9887, -10622, -10611, -10597, -10910, +-11254, -10641, -8333, -5979, -5473, -5614, -4603, -3348, -1947, 301, 2566, 3915, 4472, 4347, 3658, 3536, +3939, 3748, 2943, 2558, 3782, 6448, 9395, 11922, 12978, 12246, 11172, 10265, 8708, 7219, 6666, 5160, +1879, -1731, -4456, -5687, -6139, -7005, -8295, -9438, -10107, -10065, -10167, -11480, -12063, -10549, -8587, -7431, +-6527, -5801, -5391, -4411, -2802, -860, 1385, 3258, 4045, 3791, 3458, 3992, 4383, 3602, 2634, 2227, +2655, 4841, 8359, 10715, 11739, 12386, 11937, 10433, 9046, 8617, 8281, 6588, 3256, -169, -2708, -4389, +-5041, -6033, -7955, -9011, -8719, -9084, -10577, -11569, -11629, -10914, -9431, -8058, -7223, -6564, -5973, -5192, +-4030, -2026, 679, 2578, 3115, 3350, 3934, 4271, 4549, 4271, 2634, 1423, 2102, 4112, 6525, 9105, +11262, 12401, 11972, 10481, 9798, 9881, 9479, 8019, 5224, 1559, -1157, -2212, -3584, -5756, -7140, -7548, +-7888, -8693, -10037, -11121, -11466, -10905, -9726, -8662, -7801, -6927, -6418, -6356, -5075, -2605, -483, 1232, +2476, 2843, 3251, 4470, 5105, 4171, 2568, 1576, 1806, 2775, 4681, 7783, 10539, 11477, 11277, 10657, +9940, 10142, 10726, 9257, 6135, 3409, 1267, -681, -2740, -4700, -6030, -6569, -6976, -7996, -9504, -10831, +-11108, -10904, -10510, -9167, -7771, -7451, -7413, -6750, -5702, -3753, -1253, 440, 1244, 1896, 3128, 4592, +5009, 4147, 3201, 2271, 1291, 1637, 3877, 6673, 9369, 11075, 10828, 10049, 10277, 11203, 11248, 9766, +7520, 5300, 3129, 719, -1523, -3661, -5136, -5470, -6035, -7572, -8876, -9799, -11057, -11452, -10556, -9399, +-8455, -7942, -7885, -7795, -6814, -4605, -2222, -1013, -341, 1145, 2880, 3779, 4471, 4706, 3599, 2172, +1117, 794, 2165, 5398, 8455, 9621, 9485, 9518, 10425, 11244, 11208, 10307, 8621, 6683, 4824, 2295, +-739, -2653, -3736, -4880, -5749, -6565, -7979, -9588, -10818, -11326, -10917, -9789, -8718, -8306, -8692, -8893, +-7315, -5110, -3772, -2524, -1047, 311, 1715, 3289, 4318, 4688, 4287, 2856, 1014, 147, 1573, 4732, +7220, 8128, 8682, 9344, 10153, 11288, 11470, 10526, 9781, 8700, 6353, 3590, 1130, -1000, -2734, -3794, +-4555, -5492, -6879, -8586, -9957, -11057, -11023, -9416, -8420, -8929, -9300, -8703, -7662, -6080, -4406, -3267, +-2053, -485, 1045, 2377, 3757, 4961, 5049, 3213, 869, 196, 1302, 3569, 5976, 7051, 7472, 8738, +10098, 10677, 10910, 11075, 10710, 9600, 7723, 5171, 2679, 285, -1571, -2585, -3621, -4679, -5639, -7388, +-9847, -11000, -10394, -9496, -9087, -9240, -9528, -9361, -8428, -7045, -5694, -4563, -3167, -1523, -410, 946, +3322, 5030, 4870, 3360, 1232, -30, 797, 2844, 4327, 5377, 6741, 8059, 9126, 9852, 10545, 11099, +10952, 10341, 9099, 6703, 3925, 1892, -77, -1999, -2755, -3080, -4554, -6927, -9057, -10187, -10075, -9388, +-9101, -9351, -9745, -9556, -8702, -7971, -6876, -5183, -3925, -3046, -1809, 88, 2504, 4826, 5265, 3425, +1461, 617, 958, 2013, 3142, 4456, 5946, 7123, 8155, 9378, 10127, 10581, 11269, 11185, 9786, 8007, +6037, 3409, 832, -718, -1246, -1848, -3539, -5892, -7956, -9400, -9507, -8975, -9246, -9637, -9541, -9479, +-9470, -8577, -7147, -5880, -4679, -3973, -3180, -1150, 1940, 4441, 4883, 3593, 2155, 1351, 903, 1348, +2596, 3695, 4843, 6480, 7723, 8472, 9606, 10764, 11223, 11185, 10685, 9494, 7378, 4519, 2184, 854, +114, -529, -2157, -4756, -6990, -8038, -8607, -9018, -8970, -9108, -9382, -9533, -9647, -9187, -7725, -6179, +-5504, -5306, -4492, -2072, 1209, 3535, 4282, 3967, 2760, 1481, 1064, 1176, 1557, 2733, 4240, 5406, +6394, 7534, 9029, 10030, 10476, 11165, 11432, 10425, 8349, 5835, 3307, 1839, 1550, 534, -1569, -3681, +-5614, -7263, -8156, -8592, -8803, -8818, -9005, -9599, -10093, -9579, -7869, -6501, -6583, -6707, -5481, -3306, +-477, 2469, 3854, 3619, 3065, 2242, 1342, 832, 1189, 2320, 3381, 4252, 5412, 6836, 7892, 8883, +10003, 10860, 11533, 11336, 9347, 6624, 4671, 3400, 2435, 1340, -456, -2575, -4463, -6166, -7511, -8292, +-8558, -8449, -8849, -10051, -10601, -9496, -8154, -7463, -7292, -7439, -6792, -4777, -1753, 1053, 2591, 3239, +3308, 2487, 1188, 767, 1112, 1403, 2179, 3431, 4492, 5664, 7016, 7869, 8830, 10506, 11733, 11409, +9769, 7614, 5737, 4412, 3409, 2236, 527, -1437, -3248, -5130, -7162, -7943, -7665, -8084, -9177, -10187, +-10535, -9916, -8707, -7895, -8100, -8470, -7839, -5881, -3304, -792, 1538, 3012, 3036, 2339, 1607, 957, +807, 1109, 1470, 2339, 3762, 4919, 5746, 6697, 8116, 9973, 11502, 11599, 10331, 8588, 6787, 5622, +4615, 3031, 1660, 292, -1889, -4413, -6094, -6687, -6967, -7575, -8675, -9809, -10344, -9758, -8498, -8042, +-8634, -8743, -8107, -7035, -4844, -1842, 612, 2224, 2958, 2519, 1845, 1544, 1181, 811, 1148, 2192, +3284, 4103, 4640, 5683, 7230, 9120, 11112, 11613, 10564, 9373, 8283, 6788, 5297, 4341, 3268, 1489, +-869, -3233, -4882, -5707, -6152, -6812, -8271, -9754, -9976, -9270, -8719, -8376, -8451, -8907, -8856, -7926, +-6137, -3437, -546, 1349, 2151, 2468, 2289, 1923, 1225, 617, 1033, 1896, 2678, 3352, 3807, 4541, +6269, 8673, 10360, 10864, 10760, 10154, 8894, 7360, 6288, 5640, 4539, 2710, 511, -1968, -3938, -4496, +-4882, -6298, -7867, -8922, -9464, -9299, -8566, -8311, -8568, -8820, -9182, -8869, -7216, -4557, -1782, 138, +1511, 2505, 2607, 2066, 1436, 937, 891, 1705, 2607, 2653, 2732, 3818, 5673, 7661, 9357, 10531, +11039, 10592, 9430, 8335, 7349, 6564, 5907, 4278, 1592, -842, -2270, -3177, -4012, -5242, -7055, -8296, +-8780, -8866, -8473, -8117, -8226, -8790, -9512, -9439, -7977, -5760, -3495, -1209, 789, 1949, 2487, 2358, +1538, 845, 1125, 1942, 2270, 1993, 2161, 3284, 4577, 6205, 8368, 9941, 10600, 10677, 9963, 8573, +7917, 7956, 7132, 5330, 2922, 524, -995, -1913, -2924, -4477, -6224, -7530, -8377, -8752, -8339, -7676, +-7863, -8781, -9402, -9451, -8796, -7073, -4767, -2581, -447, 1436, 2340, 2112, 1308, 1029, 1453, 1747, +1719, 1671, 1826, 2352, 3598, 5278, 7006, 9009, 10345, 10392, 9679, 8811, 8515, 8636, 8060, 6288, +3903, 1796, 311, -782, -2012, -3515, -5092, -6750, -8115, -8440, -7950, -7704, -7909, -8515, -9411, -9874, +-9450, -8112, -6389, -4326, -1656, 670, 1535, 1340, 1278, 1247, 1147, 1548, 1588, 1099, 1171, 1698, +2387, 3749, 5876, 8057, 9441, 9768, 9270, 8766, 8820, 9111, 8600, 6866, 4805, 3019, 1310, -124, +-1028, -2358, -4436, -6237, -7456, -8014, -7877, -7492, -7604, -8454, -9429, -9933, -9741, -9236, -8020, -5492, +-2779, -699, 660, 988, 919, 1079, 1267, 1332, 1301, 1162, 1020, 1093, 1487, 2640, 4728, 6996, +8533, 9000, 8752, 8642, 9130, 9354, 8780, 7723, 6065, 4048, 2277, 1118, 146, -1388, -3361, -5323, +-6886, -7797, -7708, -7181, -7621, -8456, -8867, -9536, -10235, -10076, -8961, -7002, -4290, -1821, -464, 156, +609, 899, 1014, 1181, 1312, 1233, 990, 718, 797, 1645, 3691, 6174, 7580, 8054, 8390, 8694, +8955, 9294, 9385, 8515, 6913, 5107, 3501, 2393, 1288, -47, -1849, -4268, -6152, -6852, -7007, -7163, +-7334, -7704, -8335, -9068, -9884, -10341, -9693, -7820, -5361, -3003, -1355, -360, 430, 856, 1030, 1325, +1548, 1639, 1359, 632, 240, 1204, 3279, 5229, 6688, 7666, 8176, 8523, 8917, 9623, 9982, 9162, +7847, 6386, 4642, 3447, 2857, 1540, -738, -2902, -4652, -5890, -6414, -6590, -6893, -7143, -7510, -8471, +-9669, -10429, -10069, -8551, -6464, -4155, -2358, -1121, -71, 623, 817, 1083, 1826, 2040, 1259, 410, +74, 729, 2270, 4045, 5721, 6833, 7309, 7899, 8746, 9405, 9807, 9610, 8443, 6816, 5496, 4612, +3740, 2450, 442, -1844, -3647, -5046, -6027, -6489, -6695, -6733, -7093, -8124, -9502, -10459, -10453, -9474, +-7594, -5566, -3762, -1978, -777, -288, 95, 879, 1816, 1927, 1191, 449, -35, 44, 1358, 3256, +4622, 5609, 6562, 7221, 7887, 9049, 9882, 9577, 8675, 7406, 6162, 5373, 4659, 3418, 1537, -480, +-2352, -4088, -5424, -6123, -6207, -6329, -6728, -7562, -9135, -10347, -10452, -9932, -8791, -6871, -4686, -2884, +-1789, -1132, -233, 783, 1505, 1840, 1481, 443, -379, -162, 767, 2103, 3699, 4822, 5562, 6351, +7333, 8637, 9625, 9642, 8854, 7800, 6838, 6068, 5416, 4218, 2581, 899, -1123, -3136, -4657, -5639, +-5878, -5716, -6007, -7088, -8580, -9765, -10367, -10579, -9889, -7898, -5751, -4256, -3015, -1815, -936, 98, +1395, 1806, 1291, 534, -264, -534, 84, 1427, 2788, 3827, 4627, 5375, 6548, 8005, 9160, 9443, +8869, 8145, 7500, 6760, 6108, 5227, 3751, 2124, 352, -1833, -3855, -4986, -5212, -5159, -5567, -6472, +-7609, -8877, -10189, -10747, -10050, -8665, -6884, -5120, -3874, -2812, -1621, -247, 948, 1659, 1566, 781, +-33, -519, -187, 980, 2159, 3076, 3859, 4594, 5861, 7532, 8712, 9151, 8993, 8403, 7854, 7349, +6740, 5915, 4863, 3620, 1840, -608, -2886, -4001, -4404, -4907, -5105, -5450, -6764, -8316, -9550, -10430, +-10476, -9271, -7599, -6210, -4873, -3656, -2390, -860, 507, 1440, 1587, 896, 45, -511, -407, 565, +1611, 2212, 2909, 3838, 5066, 6712, 8181, 8814, 8742, 8523, 8191, 7728, 7112, 6439, 5973, 4902, +2839, 584, -1464, -3085, -4001, -4230, -4368, -4853, -5807, -7312, -8885, -10036, -10472, -9746, -8359, -7090, +-5839, -4552, -3277, -1655, 36, 1229, 1673, 1201, 282, -325, -230, 428, 1136, 1715, 2265, 3093, +4384, 6010, 7623, 8355, 8572, 8868, 8611, 7844, 7471, 7432, 6863, 5766, 4269, 2043, -296, -1978, +-3108, -3610, -3670, -4015, -4897, -6297, -8006, -9412, -10131, -9916, -8911, -7841, -6779, -5544, -4218, -2677, +-776, 850, 1412, 1133, 525, -137, -176, 270, 770, 1159, 1443, 2184, 3608, 5176, 6457, 7655, +8563, 8664, 8327, 8007, 7733, 7687, 7488, 6668, 5344, 3366, 949, -973, -2314, -3096, -3197, -3341, +-4127, -5479, -7175, -8790, -9764, -9827, -9360, -8504, -7525, -6608, -5354, -3719, -1708, 128, 967, 1022, +642, -16, -196, 355, 663, 453, 851, 1806, 2669, 3947, 5665, 7085, 8035, 8417, 8207, 7944, +7844, 7879, 7908, 7435, 6344, 4582, 2303, 156, -1432, -2386, -2715, -2691, -3245, -4649, -6186, -7835, +-9182, -9686, -9472, -8936, -8287, -7549, -6406, -4710, -2697, -782, 597, 919, 394, 156, 297, 314, +278, 307, 541, 1132, 1849, 2954, 4665, 6240, 7333, 7946, 8029, 7816, 7771, 8010, 8097, 7915, +7118, 5501, 3462, 1242, -664, -1761, -2143, -2227, -2707, -3869, -5432, -7129, -8629, -9417, -9385, -9247, +-9018, -8234, -7329, -6133, -3869, -1542, -359, 110, 230, 182, 230, 220, 151, 143, 248, 507, +1049, 2116, 3618, 5313, 6604, 7361, 7711, 7536, 7498, 7942, 8237, 8205, 7803, 6593, 4597, 2415, +462, -916, -1470, -1654, -2051, -2913, -4505, -6337, -7667, -8673, -9257, -9135, -8951, -8852, -8242, -6900, +-4719, -2506, -1113, -386, 66, 177, 110, 277, 328, 178, 141, 172, 503, 1388, 2718, 4376, +5900, 6850, 7192, 7224, 7333, 7739, 8258, 8528, 8406, 7551, 5707, 3550, 1664, -46, -971, -950, +-1310, -2335, -3510, -5075, -6769, -8004, -8515, -8799, -9148, -9378, -9034, -7719, -5765, -3767, -2143, -1094, +-432, -105, -21, 231, 414, 192, -28, -28, 18, 484, 1767, 3409, 4884, 6021, 6585, 6740, +6969, 7330, 7923, 8641, 8695, 8077, 6808, 4689, 2459, 805, -156, -633, -972, -1573, -2692, -4194, +-5940, -7200, -7752, -8411, -9226, -9667, -9570, -8670, -6990, -5051, -3296, -1952, -1125, -640, -247, 35, +176, 186, -11, -260, -415, -255, 764, 2418, 3811, 5089, 6029, 6145, 6262, 6841, 7456, 8077, +8752, 8694, 7456, 5606, 3566, 1743, 486, -215, -483, -887, -2002, -3536, -5071, -6269, -7055, -7906, +-8973, -9697, -9837, -9387, -8054, -6090, -4365, -3021, -1863, -1142, -706, -234, 50, 239, 183, -270, +-616, -538, 95, 1462, 3162, 4490, 5284, 5741, 5916, 6226, 6905, 7811, 8746, 9019, 8149, 6666, +4878, 2885, 1311, 590, 317, -182, -1217, -2654, -4035, -5153, -6130, -7161, -8243, -9314, -9880, -9567, +-8556, -6905, -5260, -3893, -2538, -1590, -1118, -493, 220, 395, 249, 47, -517, -842, -207, 1014, +2406, 3806, 4870, 5416, 5553, 5771, 6521, 7624, 8626, 9136, 8843, 7705, 6014, 4045, 2332, 1499, +1239, 573, -409, -1537, -2979, -4162, -5042, -6124, -7398, -8663, -9498, -9506, -8793, -7649, -6113, -4490, +-3269, -2281, -1414, -772, -52, 582, 634, 274, -311, -716, -378, 515, 1689, 3203, 4509, 5015, +5111, 5421, 6104, 7127, 8311, 9138, 9363, 8625, 6924, 5052, 3486, 2447, 1976, 1392, 427, -705, +-2024, -3221, -4046, -5087, -6668, -7995, -8856, -9440, -9183, -8096, -6791, -5359, -3941, -2891, -2145, -1331, +-336, 491, 642, 311, -176, -621, -701, -88, 1166, 2602, 3857, 4447, 4534, 4940, 5546, 6331, +7645, 8945, 9435, 8949, 7621, 5845, 4288, 3254, 2623, 2058, 1135, -179, -1276, -2206, -3284, -4423, +-5812, -7327, -8508, -9237, -9396, -8751, -7603, -6216, -4858, -3862, -3105, -2058, -786, 36, 389, 360, +-137, -733, -1058, -681, 526, 1875, 2926, 3636, 4006, 4253, 4708, 5539, 6813, 8336, 9191, 8986, +8113, 6552, 4850, 3940, 3386, 2498, 1539, 516, -607, -1608, -2504, -3618, -5054, -6544, -7873, -8903, +-9446, -9223, -8159, -6903, -5856, -4819, -3878, -2812, -1509, -522, 83, 377, -19, -850, -1242, -921, +-105, 1067, 2228, 3043, 3540, 3710, 3968, 4803, 6046, 7526, 8894, 9202, 8348, 7040, 5690, 4695, +3985, 3188, 2187, 1201, 238, -738, -1588, -2711, -4143, -5483, -6961, -8474, -9309, -9264, -8509, -7520, +-6609, -5610, -4526, -3449, -2280, -999, -38, 280, -33, -820, -1317, -1140, -626, 337, 1675, 2548, +2941, 3312, 3557, 3963, 5161, 6955, 8373, 8857, 8447, 7401, 6296, 5374, 4616, 3803, 2728, 1792, +1036, 61, -943, -1889, -3071, -4484, -6105, -7826, -8985, -9102, -8731, -8209, -7301, -6283, -5374, -4340, +-3060, -1585, -354, 61, -158, -664, -1297, -1501, -1008, -109, 928, 1985, 2716, 2915, 2956, 3258, +4346, 6174, 7715, 8452, 8431, 7677, 6789, 6121, 5323, 4301, 3377, 2611, 1749, 767, -226, -1036, +-1937, -3405, -5226, -6917, -8212, -8779, -8735, -8457, -7720, -6812, -6183, -5224, -3677, -2146, -941, -43, +65, -561, -1103, -1301, -1185, -561, 462, 1644, 2450, 2566, 2521, 2786, 3702, 5412, 7167, 8079, +8241, 8014, 7454, 6746, 5951, 4950, 4095, 3431, 2426, 1312, 569, -72, -955, -2349, -4127, -5817, +-7288, -8294, -8570, -8323, -7981, -7554, -6838, -5925, -4663, -2987, -1460, -424, -84, -422, -859, -1194, +-1373, -966, 76, 1181, 1943, 2216, 2092, 2151, 3070, 4690, 6342, 7461, 7950, 8087, 7855, 7136, +6367, 5644, 4851, 4037, 2984, 1940, 1344, 880, -98, -1402, -2826, -4700, -6550, -7592, -8088, -8333, +-8213, -7890, -7494, -6825, -5566, -3808, -2163, -1024, -366, -291, -747, -1232, -1474, -1331, -449, 815, +1576, 1753, 1651, 1646, 2437, 3872, 5320, 6585, 7566, 8038, 7871, 7273, 6649, 6150, 5473, 4394, +3385, 2647, 1933, 1345, 728, -379, -1917, -3718, -5524, -6861, -7686, -8113, -8163, -8110, -8081, -7549, +-6300, -4751, -3166, -1709, -819, -496, -694, -1272, -1717, -1663, -840, 439, 1190, 1254, 1156, 1259, +1786, 2880, 4263, 5644, 6992, 7758, 7570, 7279, 7155, 6606, 5732, 4849, 3909, 2988, 2342, 1955, +1408, 403, -960, -2625, -4534, -6196, -7108, -7565, -8038, -8344, -8416, -8130, -7077, -5611, -4092, -2551, +-1302, -652, -670, -1259, -1920, -1902, -1015, 88, 781, 928, 866, 1050, 1366, 1966, 3326, 5016, +6313, 7090, 7403, 7459, 7381, 7002, 6303, 5415, 4399, 3447, 2912, 2570, 1971, 1242, 173, -1554, +-3493, -5104, -6152, -6859, -7550, -8180, -8557, -8440, -7662, -6401, -5001, -3442, -1786, -716, -685, -1224, +-1864, -1950, -1082, -119, 326, 684, 995, 904, 835, 1448, 2718, 4167, 5501, 6543, 7143, 7403, +7503, 7457, 6848, 5858, 5008, 4186, 3472, 3089, 2716, 2082, 1073, -521, -2415, -4009, -5073, -5974, +-6889, -7782, -8411, -8422, -7940, -7138, -5887, -4259, -2445, -1036, -837, -1454, -1852, -1734, -1282, -607, +124, 632, 802, 647, 520, 1006, 1974, 3246, 4737, 5843, 6503, 7107, 7559, 7588, 7132, 6404, +5561, 4643, 3906, 3536, 3313, 2803, 1835, 370, -1457, -3011, -4005, -5077, -6274, -7244, -8003, -8379, +-8227, -7824, -6954, -5145, -2977, -1683, -1414, -1543, -1763, -1874, -1646, -912, -47, 366, 491, 466, +249, 442, 1335, 2532, 3710, 4838, 5835, 6627, 7246, 7500, 7278, 6755, 5917, 4938, 4230, 3870, +3739, 3444, 2481, 1019, -539, -1954, -3112, -4229, -5537, -6751, -7471, -7999, -8553, -8582, -7671, -5904, +-3920, -2594, -1918, -1690, -1954, -2168, -1876, -1193, -443, 147, 384, 167, -59, 152, 841, 1767, +2773, 3959, 5131, 5997, 6760, 7327, 7312, 6960, 6294, 5218, 4369, 4220, 4242, 3871, 3086, 1831, +313, -879, -2019, -3491, -4917, -5916, -6681, -7694, -8708, -8850, -8066, -6686, -4903, -3282, -2362, -2047, +-2052, -2230, -2138, -1460, -589, 17, 214, -1, -151, 56, 492, 1205, 2144, 3231, 4404, 5461, +6295, 7034, 7526, 7380, 6624, 5660, 4846, 4612, 4769, 4506, 3675, 2592, 1519, 438, -985, -2585, +-3779, -4650, -5770, -7155, -8244, -8722, -8430, -7230, -5518, -3895, -2742, -2167, -2078, -2312, -2293, -1544, +-623, -99, 114, 57, -118, -32, 367, 796, 1505, 2674, 3734, 4641, 5731, 6787, 7466, 7582, +6958, 5934, 5163, 5126, 5277, 4814, 4008, 3385, 2616, 1311, -195, -1486, -2629, -3684, -4829, -6318, +-7737, -8572, -8612, -7816, -6423, -4812, -3380, -2562, -2444, -2630, -2502, -1876, -1008, -355, -157, -154, +-133, -187, -71, 318, 915, 1815, 2780, 3695, 4802, 6104, 7186, 7490, 6886, 5939, 5481, 5508, +5271, 4768, 4397, 3982, 3173, 1976, 597, -703, -1839, -2814, -3958, -5597, -7233, -8268, -8708, -8461, +-7286, -5602, -4213, -3283, -2918, -3088, -2950, -2225, -1456, -883, -466, -281, -330, -427, -312, -42, +427, 1167, 1927, 2618, 3763, 5479, 6803, 6988, 6595, 6191, 5809, 5515, 5222, 4926, 4706, 4379, +3710, 2611, 1277, 51, -910, -1878, -3181, -4727, -6341, -7832, -8723, -8788, -7965, -6376, -4835, -3912, +-3542, -3424, -3182, -2624, -1894, -1217, -681, -415, -470, -599, -617, -380, 219, 759, 1006, 1629, +3129, 4914, 6063, 6462, 6528, 6362, 5971, 5635, 5388, 5141, 4970, 4856, 4237, 3061, 1980, 1031, +-11, -960, -2080, -3602, -5300, -6929, -8307, -8888, -8246, -6845, -5504, -4571, -4000, -3715, -3456, -2941, +-2172, -1482, -856, -337, -384, -788, -738, -215, 173, 201, 324, 1103, 2558, 4177, 5379, 6099, +6417, 6406, 6220, 5834, 5461, 5404, 5430, 5236, 4678, 3770, 2780, 1875, 951, -21, -1014, -2269, +-3977, -5960, -7695, -8554, -8226, -7175, -6004, -4989, -4363, -3990, -3592, -3170, -2643, -1796, -807, -355, +-653, -897, -541, -41, -11, -171, -2, 624, 1844, 3449, 4662, 5465, 6179, 6465, 6230, 5864, +5664, 5610, 5649, 5563, 5039, 4250, 3462, 2601, 1615, 733, 16, -1019, -2819, -4946, -6833, -8064, +-8185, -7404, -6458, -5669, -4858, -4180, -3943, -3798, -3133, -1984, -990, -750, -937, -865, -499, -174, +-174, -452, -485, 115, 1210, 2497, 3730, 4825, 5721, 6192, 6102, 5782, 5664, 5741, 5784, 5650, +5248, 4699, 4006, 3045, 2090, 1416, 849, -123, -1727, -3834, -6021, -7477, -7830, -7583, -7051, -6197, +-5163, -4629, -4728, -4452, -3454, -2375, -1580, -1191, -1188, -1049, -517, -200, -434, -743, -739, -366, +443, 1567, 2774, 4034, 5134, 5741, 5748, 5587, 5667, 5748, 5674, 5622, 5519, 5077, 4305, 3439, +2567, 1899, 1568, 900, -657, -2853, -4979, -6528, -7492, -7873, -7388, -6321, -5494, -5235, -5197, -4790, +-3846, -2752, -2032, -1732, -1499, -1082, -567, -291, -500, -772, -797, -603, -93, 782, 2004, 3409, +4574, 5168, 5344, 5503, 5621, 5610, 5679, 5798, 5751, 5410, 4769, 3867, 2921, 2468, 2430, 1756, +156, -1693, -3578, -5584, -7160, -7700, -7322, -6537, -5859, -5683, -5664, -5130, -4140, -3236, -2676, -2262, +-1805, -1247, -676, -420, -622, -820, -866, -879, -694, 78, 1414, 2711, 3751, 4564, 5025, 5252, +5398, 5471, 5539, 5690, 5911, 5814, 5083, 4029, 3356, 3172, 2939, 2265, 1176, -320, -2295, -4545, +-6438, -7278, -7077, -6522, -6143, -6080, -5946, -5348, -4463, -3701, -3210, -2717, -2077, -1374, -773, -554, +-540, -525, -728, -1062, -1018, -316, 787, 1942, 3077, 4020, 4621, 5050, 5378, 5372, 5325, 5796, +6315, 6032, 5185, 4446, 3920, 3571, 3316, 2902, 2199, 1025, -868, -3332, -5497, -6530, -6642, -6444, +-6333, -6322, -6153, -5584, -4741, -4117, -3764, -3159, -2332, -1685, -1181, -716, -428, -446, -763, -1112, +-1166, -734, 178, 1285, 2301, 3232, 4200, 4893, 4980, 4904, 5212, 5867, 6296, 6022, 5406, 4830, +4342, 3903, 3594, 3452, 3149, 2194, 318, -2217, -4445, -5689, -6147, -6276, -6447, -6600, -6377, -5725, +-5073, -4651, -4211, -3491, -2784, -2240, -1564, -864, -501, -515, -720, -1160, -1448, -1005, -169, 521, +1416, 2668, 3793, 4321, 4418, 4588, 5049, 5731, 6113, 5941, 5558, 5180, 4642, 4025, 3736, 3866, +3861, 3087, 1363, -1074, -3355, -4715, -5395, -5982, -6496, -6613, -6370, -5972, -5543, -5069, -4528, -3957, +-3395, -2710, -1995, -1273, -638, -480, -851, -1277, -1353, -1078, -735, -234, 760, 2100, 3183, 3624, +3836, 4228, 4805, 5433, 5815, 5900, 5834, 5495, 4786, 4087, 3866, 4141, 4383, 3889, 2282, -4, +-2043, -3438, -4553, -5586, -6230, -6400, -6447, -6273, -5762, -5311, -4904, -4312, -3730, -3250, -2506, -1430, +-720, -699, -937, -1125, -1202, -1238, -1191, -758, 284, 1593, 2561, 3013, 3435, 4002, 4530, 5008, +5495, 5864, 5965, 5683, 4947, 4129, 3951, 4487, 4918, 4462, 3021, 1145, -641, -2291, -3706, -4850, +-5688, -6181, -6387, -6321, -6059, -5606, -5028, -4572, -4276, -3777, -2787, -1646, -1025, -946, -921, -890, +-1076, -1431, -1593, -1170, -127, 1041, 1879, 2476, 3099, 3683, 4129, 4592, 5150, 5724, 6065, 5848, +4981, 4112, 4163, 4846, 5169, 4782, 3777, 2250, 448, -1170, -2628, -4062, -5085, -5660, -6157, -6457, +-6237, -5672, -5219, -5035, -4789, -4146, -3078, -2037, -1465, -1193, -860, -646, -950, -1500, -1678, -1280, +-531, 418, 1247, 1969, 2703, 3339, 3757, 4108, 4788, 5741, 6273, 5912, 4985, 4361, 4417, 4892, +5273, 5166, 4407, 3183, 1673, 7, -1653, -3090, -4130, -5014, -5904, -6375, -6104, -5629, -5444, -5456, +-5207, -4492, -3507, -2653, -2051, -1425, -810, -574, -924, -1479, -1664, -1459, -899, -134, 583, 1348, +2250, 2886, 3047, 3394, 4448, 5576, 6018, 5756, 5050, 4405, 4376, 4877, 5243, 5195, 4797, 3971, +2576, 888, -672, -2034, -3282, -4558, -5663, -6159, -5968, -5698, -5823, -5904, -5487, -4809, -4088, -3384, +-2611, -1775, -1049, -734, -987, -1485, -1727, -1593, -1267, -845, -127, 927, 1816, 2172, 2330, 2905, +4003, 5164, 5751, 5573, 4906, 4373, 4370, 4696, 5013, 5200, 5190, 4567, 3254, 1792, 454, -880, +-2414, -4020, -5214, -5697, -5718, -5830, -6116, -6091, -5660, -5156, -4650, -3981, -3129, -2193, -1307, -893, +-1176, -1518, -1518, -1576, -1707, -1326, -427, 555, 1285, 1626, 1794, 2333, 3536, 4801, 5427, 5354, +4961, 4588, 4393, 4536, 4907, 5339, 5536, 5003, 3862, 2731, 1699, 297, -1500, -3175, -4302, -4921, +-5332, -5735, -6026, -6013, -5716, -5347, -4990, -4492, -3564, -2398, -1562, -1268, -1257, -1232, -1316, -1631, +-1825, -1500, -633, 307, 927, 1116, 1209, 1888, 3167, 4363, 5038, 5244, 5115, 4730, 4363, 4413, +4933, 5551, 5741, 5224, 4423, 3736, 2852, 1307, -558, -2105, -3253, -4154, -4801, -5347, -5812, -5848, +-5580, -5509, -5492, -4893, -3748, -2720, -2007, -1509, -1190, -1016, -1142, -1549, -1902, -1651, -761, 117, +513, 574, 777, 1511, 2665, 3807, 4638, 5174, 5272, 4788, 4260, 4374, 5011, 5538, 5611, 5316, +4989, 4570, 3680, 2237, 516, -1048, -2256, -3226, -4201, -5078, -5471, -5499, -5584, -5836, -5828, -5148, +-4140, -3268, -2518, -1859, -1311, -975, -1081, -1645, -2071, -1747, -882, -188, 52, 107, 371, 1020, +1947, 3027, 4123, 4942, 5069, 4502, 4061, 4350, 4892, 5171, 5273, 5318, 5227, 4986, 4339, 2953, +1259, -105, -1246, -2547, -3830, -4641, -5017, -5319, -5704, -6041, -6053, -5504, -4668, -3922, -3229, -2378, +-1525, -1057, -1247, -1857, -2228, -1860, -1101, -613, -434, -244, 27, 404, 1082, 2280, 3661, 4526, +4564, 4166, 4017, 4250, 4637, 4922, 5030, 5173, 5379, 5381, 4747, 3472, 2127, 944, -388, -1903, +-3185, -3985, -4562, -5104, -5652, -6125, -6198, -5721, -5098, -4584, -3884, -2850, -1797, -1295, -1524, -2037, +-2235, -1888, -1345, -991, -696, -383, -330, -340, 372, 1797, 3125, 3948, 4191, 3982, 3867, 4161, +4491, 4562, 4680, 5134, 5586, 5582, 5043, 4170, 3125, 1918, 471, -1076, -2341, -3164, -3842, -4671, +-5463, -5988, -6086, -5799, -5507, -5190, -4438, -3181, -2026, -1561, -1714, -2010, -2086, -1984, -1718, -1181, +-657, -534, -750, -776, -82, 1223, 2580, 3481, 3773, 3765, 3927, 4238, 4298, 4221, 4500, 5098, +5499, 5529, 5299, 4792, 4015, 2892, 1394, -188, -1416, -2231, -3076, -4120, -5073, -5620, -5781, -5794, +-5854, -5736, -4927, -3534, -2449, -2000, -1811, -1814, -2073, -2212, -1821, -1176, -715, -650, -931, -1098, +-534, 757, 2009, 2786, 3211, 3602, 3959, 4094, 4040, 4040, 4379, 4957, 5333, 5431, 5438, 5311, +4775, 3704, 2240, 709, -417, -1297, -2363, -3594, -4583, -5075, -5289, -5691, -6132, -5990, -5131, -4025, +-3073, -2327, -1866, -1882, -2196, -2271, -1874, -1224, -757, -767, -1217, -1451, -786, 381, 1341, 2062, +2752, 3382, 3769, 3875, 3792, 3850, 4229, 4715, 5025, 5187, 5428, 5634, 5267, 4277, 2922, 1577, +568, -330, -1659, -3096, -3914, -4325, -4938, -5684, -6120, -6072, -5582, -4676, -3602, -2676, -2116, -2046, +-2315, -2468, -2031, -1225, -782, -973, -1433, -1562, -1042, -188, 583, 1337, 2248, 3041, 3457, 3579, +3571, 3714, 4073, 4405, 4598, 4873, 5360, 5781, 5599, 4656, 3450, 2475, 1605, 377, -1134, -2329, +-3065, -3735, -4558, -5352, -5911, -6197, -5978, -5180, -4120, -3078, -2330, -2225, -2605, -2681, -2060, -1302, +-1002, -1207, -1548, -1596, -1232, -651, -42, 733, 1741, 2619, 3021, 3193, 3405, 3629, 3893, 4090, +4171, 4505, 5296, 5896, 5621, 4864, 4209, 3488, 2413, 1054, -296, -1435, -2354, -3159, -4011, -4891, +-5631, -6100, -6202, -5704, -4573, -3365, -2633, -2585, -2885, -2776, -2087, -1420, -1210, -1348, -1549, -1586, +-1407, -1110, -597, 263, 1277, 2098, 2556, 2837, 3186, 3607, 3782, 3670, 3739, 4363, 5231, 5640, +5476, 5233, 4927, 4184, 3087, 1874, 592, -585, -1534, -2469, -3443, -4291, -5072, -5859, -6343, -5998, +-4848, -3639, -2991, -2945, -3075, -2826, -2121, -1549, -1428, -1433, -1428, -1484, -1529, -1363, -938, -144, +902, 1670, 2019, 2465, 3173, 3591, 3459, 3313, 3651, 4336, 4979, 5336, 5473, 5476, 5323, 4777, +3787, 2629, 1474, 343, -738, -1734, -2625, -3443, -4429, -5604, -6351, -6093, -5030, -3957, -3403, -3326, +-3256, -2842, -2237, -1796, -1556, -1408, -1334, -1387, -1581, -1639, -1239, -366, 502, 986, 1408, 2229, +3064, 3264, 3133, 3221, 3584, 4121, 4671, 5057, 5320, 5566, 5592, 5147, 4318, 3357, 2340, 1151, +-37, -960, -1717, -2587, -3788, -5189, -6150, -6017, -5105, -4327, -3924, -3681, -3424, -3006, -2441, -2003, +-1762, -1454, -1200, -1364, -1816, -1879, -1273, -553, -100, 353, 1068, 1942, 2644, 2885, 2819, 2980, +3385, 3830, 4288, 4704, 5122, 5527, 5638, 5325, 4766, 4066, 3055, 1792, 612, -207, -832, -1760, +-3235, -4859, -5848, -5858, -5292, -4717, -4349, -4073, -3720, -3219, -2742, -2431, -2009, -1383, -1198, -1660, +-2056, -1862, -1398, -1009, -661, -138, 650, 1543, 2218, 2461, 2509, 2737, 3123, 3443, 3821, 4351, +4892, 5277, 5465, 5426, 5142, 4636, 3668, 2315, 1180, 599, 42, -1039, -2601, -4243, -5364, -5620, +-5282, -4974, -4790, -4390, -3827, -3488, -3304, -2790, -1999, -1452, -1437, -1813, -2029, -1842, -1562, -1384, +-1113, -516, 301, 1159, 1758, 2012, 2240, 2556, 2801, 3045, 3443, 3991, 4543, 4937, 5195, 5431, +5525, 5113, 4079, 2793, 1875, 1398, 816, -278, -1868, -3583, -4775, -5132, -5209, -5313, -5019, -4432, +-4088, -4010, -3705, -2939, -2111, -1650, -1650, -1872, -1952, -1801, -1684, -1706, -1500, -834, -16, 685, +1262, 1693, 2009, 2321, 2532, 2712, 3159, 3774, 4196, 4454, 4856, 5431, 5721, 5383, 4463, 3346, +2503, 2146, 1719, 520, -1180, -2701, -3825, -4636, -5177, -5276, -4916, -4489, -4411, -4418, -3983, -3144, +-2337, -1884, -1795, -1840, -1777, -1712, -1818, -1917, -1679, -1084, -370, 265, 865, 1405, 1824, 2063, +2185, 2465, 3024, 3574, 3818, 4090, 4695, 5373, 5811, 5675, 4787, 3715, 3188, 3048, 2459, 1186, +-245, -1591, -2935, -4156, -4874, -4960, -4710, -4543, -4594, -4620, -4175, -3312, -2619, -2247, -1981, -1786, +-1694, -1708, -1876, -2046, -1845, -1319, -779, -215, 478, 1180, 1545, 1636, 1852, 2282, 2747, 3142, +3386, 3607, 4216, 5215, 5861, 5619, 4781, 4061, 3777, 3550, 2878, 1838, 718, -632, -2237, -3632, +-4437, -4636, -4569, -4661, -4883, -4860, -4349, -3643, -3057, -2633, -2231, -1862, -1702, -1755, -1954, -2086, +-1879, -1574, -1267, -647, 211, 812, 1092, 1298, 1564, 1983, 2547, 2924, 2939, 3109, 3987, 5131, +5649, 5394, 4890, 4530, 4226, 3876, 3342, 2595, 1673, 328, -1416, -2953, -3782, -4114, -4373, -4665, +-4931, -4916, -4518, -3937, -3443, -3007, -2436, -1911, -1768, -1871, -1926, -1945, -1985, -1884, -1504, -892, +-156, 466, 757, 876, 1227, 1880, 2421, 2512, 2369, 2752, 3798, 4788, 5192, 5169, 5006, 4762, +4453, 4102, 3755, 3367, 2572, 1150, -630, -2144, -3050, -3603, -4126, -4579, -4906, -4946, -4629, -4251, +-3904, -3287, -2547, -2119, -1976, -1849, -1831, -1997, -2126, -2105, -1879, -1268, -415, 193, 318, 462, +1092, 1834, 2107, 1977, 1983, 2504, 3464, 4363, 4793, 4995, 5100, 4885, 4480, 4215, 4176, 4016, +3317, 1972, 297, -1204, -2242, -2983, -3762, -4436, -4688, -4747, -4747, -4544, -4078, -3488, -2890, -2414, +-2124, -1921, -1818, -1884, -2094, -2295, -2114, -1399, -582, -257, -203, 220, 1029, 1655, 1751, 1596, +1720, 2270, 3069, 3835, 4427, 4903, 5127, 4846, 4441, 4375, 4490, 4441, 3917, 2692, 1126, -188, +-1225, -2337, -3347, -3946, -4335, -4680, -4820, -4659, -4310, -3818, -3196, -2677, -2367, -2044, -1697, -1737, +-2215, -2485, -2125, -1420, -879, -748, -616, -7, 864, 1363, 1375, 1334, 1530, 1956, 2527, 3297, +4129, 4743, 4960, 4775, 4432, 4383, 4708, 4802, 4238, 3212, 2023, 770, -478, -1664, -2643, -3372, +-3953, -4442, -4728, -4749, -4514, -4006, -3473, -3113, -2683, -2032, -1605, -1809, -2335, -2464, -2024, -1505, +-1261, -1186, -882, -120, 691, 1053, 1135, 1253, 1387, 1572, 2087, 2881, 3741, 4512, 4819, 4582, +4351, 4568, 4928, 4946, 4597, 3938, 2938, 1684, 413, -754, -1879, -2778, -3430, -4072, -4613, -4728, +-4458, -4150, -3904, -3564, -2878, -2047, -1684, -1963, -2393, -2359, -1947, -1670, -1673, -1571, -1121, -453, +216, 720, 951, 1084, 1196, 1283, 1573, 2345, 3389, 4152, 4398, 4318, 4305, 4521, 4793, 4933, +4859, 4434, 3603, 2528, 1330, 61, -1069, -1966, -2828, -3745, -4379, -4467, -4345, -4373, -4335, -3912, +-3062, -2225, -1930, -2209, -2391, -2139, -1882, -1848, -1840, -1704, -1369, -796, -143, 335, 714, 1025, +1045, 900, 1156, 1999, 2983, 3643, 3992, 4141, 4203, 4383, 4729, 4953, 4951, 4743, 4187, 3211, +1988, 811, -198, -1188, -2305, -3346, -3948, -4097, -4219, -4550, -4657, -4075, -3123, -2497, -2348, -2388, +-2348, -2136, -1940, -1940, -2024, -1891, -1547, -1130, -602, 32, 633, 915, 763, 588, 900, 1659, +2513, 3212, 3628, 3806, 3954, 4229, 4562, 4776, 4952, 5029, 4636, 3701, 2658, 1726, 734, -439, +-1766, -2889, -3413, -3646, -4179, -4758, -4748, -4127, -3398, -2880, -2647, -2569, -2380, -2086, -1970, -2075, +-2086, -1884, -1733, -1558, -992, -191, 418, 634, 532, 410, 618, 1277, 2117, 2780, 3188, 3486, +3768, 4019, 4253, 4565, 4926, 5111, 4795, 4026, 3230, 2576, 1626, 202, -1205, -2124, -2697, -3314, +-4077, -4703, -4783, -4278, -3638, -3225, -3002, -2756, -2448, -2230, -2199, -2144, -2013, -1968, -2047, -1893, +-1283, -502, 99, 387, 330, 153, 326, 947, 1632, 2179, 2718, 3196, 3489, 3671, 3928, 4368, +4882, 5097, 4744, 4175, 3828, 3304, 2175, 749, -453, -1333, -2066, -2906, -3856, -4594, -4724, -4311, +-3890, -3608, -3246, -2852, -2639, -2506, -2312, -2111, -2041, -2119, -2223, -2100, -1590, -792, -99, 166, +91, 15, 188, 636, 1190, 1749, 2352, 2916, 3166, 3225, 3600, 4308, 4826, 4885, 4700, 4540, +4394, 3870, 2783, 1477, 385, -441, -1266, -2343, -3477, -4222, -4419, -4310, -4114, -3774, -3304, -2984, +-2839, -2608, -2288, -2094, -2034, -2099, -2310, -2318, -1777, -968, -371, -88, -32, -25, 118, 434, +822, 1424, 2194, 2657, 2702, 2891, 3513, 4192, 4529, 4618, 4670, 4763, 4776, 4331, 3299, 2143, +1292, 550, -488, -1737, -2852, -3670, -4183, -4374, -4209, -3864, -3501, -3230, -3012, -2755, -2393, -2039, +-1917, -2100, -2371, -2395, -1944, -1208, -662, -403, -203, -23, -13, 51, 495, 1267, 1920, 2166, +2260, 2640, 3338, 3951, 4237, 4361, 4584, 4924, 5033, 4548, 3625, 2788, 2153, 1331, 200, -972, +-2071, -3119, -3874, -4175, -4160, -3941, -3589, -3355, -3243, -2959, -2473, -2068, -1925, -2111, -2455, -2445, +-1971, -1430, -1030, -603, -181, -109, -289, -173, 394, 1084, 1542, 1738, 1888, 2354, 3094, 3614, +3818, 4048, 4552, 5052, 5101, 4666, 4063, 3450, 2780, 1974, 981, -173, -1382, -2509, -3413, -3954, +-4072, -3898, -3667, -3506, -3420, -3141, -2572, -2065, -1978, -2256, -2431, -2344, -2121, -1815, -1329, -715, +-336, -373, -519, -323, 246, 825, 1172, 1315, 1557, 2150, 2824, 3153, 3318, 3785, 4436, 4850, +4945, 4764, 4330, 3775, 3239, 2566, 1659, 616, -553, -1819, -2918, -3607, -3898, -3871, -3735, -3757, +-3794, -3398, -2702, -2288, -2280, -2320, -2341, -2407, -2411, -2114, -1513, -882, -568, -653, -785, -563, +21, 501, 661, 826, 1303, 1915, 2348, 2611, 2973, 3515, 4129, 4626, 4829, 4749, 4506, 4095, +3624, 3079, 2330, 1335, 186, -1092, -2341, -3193, -3508, -3560, -3723, -3953, -3875, -3405, -2876, -2561, +-2391, -2256, -2299, -2517, -2585, -2247, -1611, -991, -728, -866, -922, -516, -19, 168, 290, 677, +1162, 1605, 1988, 2275, 2619, 3184, 3843, 4360, 4690, 4807, 4645, 4350, 4027, 3589, 2943, 2160, +1106, -346, -1741, -2556, -2960, -3351, -3772, -3956, -3818, -3469, -3088, -2702, -2369, -2163, -2242, -2553, +-2729, -2377, -1646, -1122, -1050, -1077, -858, -471, -195, -65, 130, 524, 1021, 1429, 1712, 1970, +2334, 2854, 3521, 4132, 4533, 4720, 4739, 4582, 4253, 3899, 3566, 2979, 1862, 375, -897, -1711, +-2393, -3101, -3597, -3783, -3786, -3638, -3318, -2891, -2434, -2090, -2240, -2735, -2839, -2338, -1733, -1441, +-1309, -1142, -909, -606, -442, -385, -162, 296, 753, 1107, 1405, 1627, 1904, 2455, 3145, 3707, +4166, 4578, 4709, 4476, 4192, 4132, 4026, 3447, 2339, 1058, -90, -1038, -1920, -2720, -3317, -3633, +-3768, -3835, -3677, -3130, -2470, -2241, -2541, -2924, -2891, -2470, -2024, -1765, -1581, -1330, -1038, -827, +-745, -647, -434, -50, 428, 796, 1002, 1179, 1520, 2033, 2592, 3164, 3825, 4383, 4467, 4250, +4224, 4398, 4305, 3765, 2875, 1757, 648, -347, -1368, -2333, -2952, -3306, -3736, -4068, -3830, -3148, +-2576, -2431, -2649, -2924, -2863, -2532, -2280, -2105, -1820, -1491, -1222, -986, -854, -831, -655, -213, +263, 537, 721, 1006, 1300, 1578, 2022, 2771, 3564, 4049, 4140, 4132, 4282, 4530, 4549, 4147, +3411, 2531, 1535, 361, -793, -1654, -2278, -2939, -3653, -4048, -3822, -3187, -2672, -2584, -2711, -2794, +-2755, -2609, -2414, -2226, -1963, -1617, -1267, -1024, -977, -982, -742, -310, 12, 249, 600, 917, +995, 1157, 1720, 2533, 3255, 3736, 3901, 3982, 4288, 4643, 4638, 4316, 3925, 3259, 2177, 952, +-71, -860, -1588, -2466, -3389, -3885, -3690, -3212, -2885, -2752, -2724, -2769, -2761, -2625, -2483, -2393, +-2148, -1704, -1306, -1162, -1130, -967, -730, -517, -249, 139, 520, 700, 715, 855, 1382, 2212, +2941, 3331, 3528, 3852, 4273, 4523, 4583, 4587, 4407, 3797, 2746, 1596, 723, -3, -916, -2029, +-3045, -3576, -3573, -3275, -3011, -2843, -2774, -2759, -2666, -2545, -2601, -2582, -2237, -1792, -1559, -1417, +-1180, -1014, -957, -788, -438, -19, 372, 550, 461, 550, 1126, 1879, 2391, 2775, 3197, 3581, +3932, 4196, 4428, 4700, 4712, 4127, 3114, 2180, 1485, 726, -302, -1490, -2555, -3273, -3491, -3337, +-3158, -3067, -2943, -2725, -2595, -2671, -2751, -2613, -2299, -2015, -1786, -1519, -1282, -1157, -1123, -1025, +-680, -132, 234, 254, 193, 391, 909, 1470, 1918, 2367, 2882, 3275, 3521, 3843, 4346, 4802, +4850, 4322, 3478, 2751, 2134, 1361, 366, -800, -1994, -2857, -3156, -3200, -3293, -3244, -2934, -2703, +-2711, -2768, -2750, -2667, -2493, -2228, -1999, -1702, -1333, -1227, -1325, -1174, -714, -245, -26, -1, +27, 277, 676, 1068, 1524, 2106, 2636, 2920, 3124, 3576, 4266, 4786, 4870, 4519, 3927, 3297, +2723, 2086, 1102, -191, -1393, -2203, -2721, -3113, -3298, -3168, -2931, -2765, -2705, -2735, -2724, -2633, +-2547, -2438, -2152, -1729, -1442, -1448, -1495, -1258, -756, -389, -254, -151, -3, 185, 409, 714, +1220, 1873, 2296, 2446, 2712, 3288, 3990, 4538, 4806, 4637, 4127, 3681, 3360, 2749, 1674, 492, +-574, -1571, -2361, -2907, -3212, -3199, -2968, -2843, -2847, -2749, -2635, -2671, -2715, -2575, -2189, -1780, +-1614, -1673, -1648, -1330, -914, -657, -504, -264, -55, 1, 88, 466, 1067, 1579, 1878, 2078, +2354, 2876, 3619, 4329, 4643, 4492, 4239, 4073, 3775, 3163, 2282, 1248, 197, -842, -1830, -2581, +-2947, -3030, -2999, -2986, -2895, -2696, -2600, -2744, -2855, -2615, -2203, -1917, -1810, -1810, -1663, -1335, +-1052, -873, -594, -275, -203, -275, -138, 282, 784, 1259, 1635, 1775, 1937, 2546, 3426, 4050, +4332, 4420, 4373, 4292, 4108, 3578, 2788, 1952, 965, -195, -1286, -2080, -2548, -2821, -3018, -3059, +-2873, -2648, -2648, -2837, -2896, -2621, -2255, -2092, -2046, -1902, -1694, -1528, -1336, -1021, -628, -405, +-400, -408, -307, -6, 561, 1114, 1317, 1330, 1582, 2203, 2994, 3623, 3967, 4194, 4371, 4417, +4266, 3857, 3297, 2605, 1647, 425, -685, -1488, -2107, -2661, -3021, -3065, -2887, -2721, -2823, -2998, +-2902, -2577, -2366, -2279, -2107, -1920, -1873, -1806, -1510, -1169, -864, -572, -488, -612, -572, -142, +425, 857, 1030, 1058, 1303, 1933, 2636, 3171, 3579, 3977, 4291, 4397, 4300, 4109, 3801, 3206, +2247, 1108, 62, -776, -1583, -2359, -2821, -2856, -2745, -2783, -2930, -2950, -2807, -2666, -2542, -2324, +-2129, -2067, -2015, -1882, -1670, -1321, -890, -624, -648, -802, -745, -311, 240, 578, 691, 755, +1044, 1597, 2195, 2677, 3205, 3757, 4105, 4224, 4288, 4303, 4118, 3569, 2674, 1676, 779, -138, +-1183, -2092, -2516, -2615, -2770, -2915, -2902, -2911, -2953, -2823, -2623, -2482, -2309, -2180, -2194, -2164, +-1941, -1501, -1020, -756, -845, -1010, -902, -454, 18, 268, 340, 488, 793, 1193, 1651, 2190, +2813, 3400, 3749, 3938, 4192, 4414, 4310, 3807, 3085, 2353, 1539, 430, -716, -1528, -2062, -2454, +-2693, -2810, -2913, -2981, -2989, -2897, -2727, -2531, -2322, -2212, -2280, -2341, -2094, -1588, -1099, -871, +-1008, -1175, -990, -541, -172, 21, 185, 396, 608, 888, 1300, 1893, 2560, 3080, 3379, 3665, +4136, 4461, 4313, 3957, 3636, 3046, 2125, 1103, 64, -873, -1556, -2041, -2406, -2645, -2787, -2900, +-2972, -2934, -2805, -2553, -2296, -2223, -2364, -2451, -2189, -1624, -1131, -1005, -1135, -1204, -1006, -680, +-424, -213, 25, 219, 326, 490, 910, 1586, 2236, 2611, 2934, 3471, 3963, 4185, 4211, 4150, +3930, 3440, 2677, 1731, 716, -269, -1079, -1664, -2128, -2464, -2637, -2810, -2988, -3051, -2933, -2655, +-2367, -2309, -2527, -2634, -2341, -1792, -1368, -1234, -1237, -1212, -1055, -836, -623, -378, -51, 124, +37, 162, 675, 1254, 1703, 2159, 2674, 3188, 3667, 4002, 4176, 4271, 4195, 3865, 3269, 2427, +1436, 432, -441, -1140, -1694, -2090, -2344, -2604, -2897, -3071, -2938, -2589, -2289, -2295, -2542, -2608, +-2312, -1871, -1532, -1365, -1285, -1170, -1068, -987, -740, -320, -51, -75, -106, 95, 501, 931, +1358, 1859, 2384, 2878, 3347, 3758, 4046, 4245, 4344, 4199, 3744, 3038, 2130, 1127, 188, -608, +-1259, -1682, -1970, -2347, -2810, -3059, -2890, -2533, -2317, -2362, -2567, -2618, -2332, -1966, -1753, -1518, +-1259, -1207, -1278, -1118, -719, -361, -206, -215, -213, -57, 224, 574, 1000, 1487, 2013, 2531, +3035, 3464, 3837, 4146, 4359, 4365, 4055, 3464, 2673, 1719, 738, -157, -827, -1220, -1583, -2123, +-2677, -2934, -2808, -2495, -2359, -2485, -2592, -2524, -2386, -2222, -1915, -1554, -1336, -1377, -1401, -1137, +-745, -456, -315, -264, -249, -162, 37, 299, 651, 1131, 1650, 2164, 2681, 3147, 3566, 3966, +4310, 4449, 4271, 3879, 3276, 2334, 1266, 350, -288, -740, -1188, -1844, -2557, -2815, -2655, -2507, +-2498, -2492, -2487, -2548, -2571, -2397, -2010, -1649, -1524, -1551, -1498, -1256, -932, -653, -482, -391, +-346, -288, -151, 69, 362, 788, 1285, 1772, 2253, 2688, 3145, 3665, 4080, 4267, 4317, 4180, +3686, 2822, 1762, 826, 256, -172, -834, -1661, -2295, -2576, -2630, -2638, -2592, -2489, -2509, -2669, +-2696, -2456, -2115, -1837, -1699, -1680, -1615, -1387, -1074, -811, -609, -483, -425, -388, -303, -164, +49, 449, 970, 1431, 1855, 2362, 2870, 3336, 3770, 4095, 4297, 4412, 4118, 3236, 2183, 1412, +884, 283, -486, -1257, -1879, -2300, -2541, -2587, -2479, -2430, -2537, -2712, -2727, -2495, -2204, -1961, +-1824, -1785, -1721, -1510, -1213, -929, -682, -533, -449, -373, -365, -346, -153, 198, 595, 1038, +1489, 1994, 2539, 3001, 3361, 3770, 4263, 4572, 4321, 3546, 2712, 2071, 1448, 695, -56, -800, +-1530, -2111, -2424, -2489, -2412, -2402, -2535, -2706, -2724, -2547, -2299, -2100, -1959, -1910, -1881, -1702, +-1398, -1145, -908, -636, -478, -452, -442, -423, -326, -42, 317, 646, 1089, 1686, 2202, 2515, +2870, 3467, 4148, 4491, 4316, 3812, 3207, 2597, 1918, 1208, 482, -288, -1122, -1834, -2223, -2349, +-2353, -2395, -2565, -2736, -2740, -2586, -2349, -2128, -2037, -2019, -1949, -1792, -1577, -1312, -1011, -750, +-549, -472, -507, -500, -365, -177, 3, 302, 852, 1489, 1852, 2066, 2532, 3268, 3940, 4327, +4369, 4109, 3634, 3042, 2391, 1749, 1072, 275, -602, -1387, -1850, -2056, -2189, -2290, -2440, -2664, +-2722, -2543, -2332, -2189, -2078, -2022, -1999, -1868, -1670, -1466, -1146, -774, -549, -540, -549, -447, +-370, -403, -335, 66, 673, 1165, 1413, 1669, 2182, 2902, 3564, 4050, 4300, 4234, 3875, 3379, +2819, 2248, 1593, 754, -167, -960, -1511, -1825, -1976, -2154, -2421, -2653, -2717, -2605, -2421, -2267, +-2178, -2107, -2039, -1966, -1882, -1682, -1292, -913, -778, -728, -564, -403, -487, -637, -526, -95, +415, 791, 1031, 1319, 1790, 2449, 3135, 3725, 4147, 4211, 3947, 3595, 3215, 2702, 2069, 1322, +391, -500, -1097, -1450, -1741, -1997, -2309, -2608, -2722, -2615, -2454, -2347, -2235, -2090, -2042, -2087, +-2020, -1709, -1351, -1125, -992, -802, -530, -434, -622, -752, -607, -247, 162, 484, 725, 1029, +1442, 2014, 2712, 3413, 3895, 4069, 4014, 3797, 3491, 3123, 2594, 1841, 918, 27, -641, -1101, +-1442, -1777, -2168, -2506, -2601, -2560, -2528, -2425, -2207, -2072, -2157, -2221, -2065, -1755, -1520, -1375, +-1149, -810, -530, -468, -646, -764, -630, -352, -64, 254, 519, 711, 1056, 1644, 2330, 3040, +3654, 3969, 4016, 3930, 3789, 3525, 3067, 2366, 1467, 527, -191, -650, -1057, -1514, -1920, -2206, +-2412, -2553, -2542, -2335, -2097, -2092, -2236, -2215, -2024, -1816, -1706, -1547, -1229, -826, -556, -538, +-635, -681, -627, -439, -149, 109, 297, 481, 779, 1280, 1949, 2701, 3355, 3758, 3914, 3972, +3957, 3819, 3527, 2909, 1988, 1084, 428, -134, -691, -1188, -1545, -1901, -2290, -2516, -2455, -2233, +-2112, -2157, -2237, -2170, -1971, -1887, -1864, -1656, -1280, -938, -676, -561, -636, -715, -657, -509, +-292, -69, 124, 255, 469, 908, 1571, 2319, 2980, 3460, 3690, 3798, 3933, 4002, 3779, 3203, +2403, 1637, 956, 263, -357, -790, -1200, -1727, -2222, -2443, -2380, -2235, -2212, -2289, -2262, -2135, +-2065, -2061, -2027, -1831, -1493, -1108, -801, -674, -708, -769, -727, -628, -443, -193, -52, 4, +159, 513, 1097, 1848, 2591, 3098, 3329, 3573, 3918, 4094, 3918, 3472, 2880, 2148, 1351, 637, +67, -376, -882, -1527, -2097, -2304, -2275, -2288, -2324, -2298, -2237, -2167, -2139, -2174, -2174, -2004, +-1671, -1285, -992, -817, -790, -844, -831, -696, -515, -347, -223, -185, -122, 120, 684, 1467, +2177, 2604, 2909, 3342, 3773, 3974, 3948, 3717, 3263, 2562, 1762, 1064, 580, 99, -563, -1280, +-1810, -2080, -2212, -2300, -2353, -2306, -2241, -2164, -2149, -2226, -2269, -2123, -1840, -1498, -1145, -932, +-902, -917, -863, -759, -619, -443, -286, -316, -409, -191, 409, 1099, 1685, 2166, 2601, 3082, +3523, 3794, 3935, 3938, 3600, 2885, 2144, 1588, 1099, 510, -198, -898, -1472, -1842, -2062, -2222, +-2328, -2301, -2189, -2143, -2167, -2220, -2281, -2220, -1974, -1614, -1276, -1057, -967, -929, -909, -855, +-651, -354, -270, -436, -548, -342, 153, 723, 1248, 1765, 2303, 2805, 3198, 3599, 3981, 4104, +3801, 3198, 2616, 2135, 1606, 988, 261, -462, -1068, -1484, -1848, -2125, -2241, -2194, -2120, -2070, +-2058, -2164, -2306, -2280, -2048, -1747, -1457, -1154, -967, -995, -1048, -909, -609, -342, -316, -516, +-630, -430, -79, 311, 832, 1433, 1942, 2344, 2815, 3386, 3880, 4061, 3867, 3436, 2958, 2533, +2052, 1407, 689, 15, -613, -1176, -1640, -1980, -2165, -2199, -2131, -2023, -2033, -2196, -2312, -2284, +-2169, -1960, -1590, -1208, -1062, -1131, -1174, -971, -621, -409, -454, -587, -633, -553, -374, -25, +540, 1111, 1528, 1930, 2469, 3108, 3654, 3937, 3865, 3559, 3226, 2892, 2416, 1801, 1150, 481, +-191, -803, -1312, -1780, -2109, -2159, -2070, -2058, -2120, -2182, -2264, -2357, -2333, -2109, -1692, -1297, +-1205, -1334, -1302, -1011, -705, -559, -540, -570, -671, -737, -617, -277, 215, 714, 1101, 1505, +2092, 2796, 3384, 3709, 3755, 3639, 3442, 3157, 2738, 2209, 1591, 908, 263, -332, -982, -1573, +-1908, -2007, -2031, -2057, -2063, -2078, -2209, -2424, -2487, -2223, -1751, -1414, -1388, -1450, -1321, -1082, +-865, -657, -510, -526, -689, -800, -745, -448, -17, 394, 701, 1101, 1731, 2459, 3038, 3434, +3649, 3653, 3522, 3367, 3066, 2558, 1966, 1403, 784, 84, -645, -1267, -1655, -1859, -2000, -2046, +-1969, -1945, -2170, -2488, -2529, -2225, -1842, -1602, -1511, -1470, -1389, -1199, -967, -695, -500, -500, +-684, -858, -816, -553, -203, 85, 341, 773, 1388, 2066, 2704, 3220, 3482, 3584, 3625, 3568, +3285, 2841, 2374, 1888, 1268, 530, -206, -820, -1291, -1683, -1937, -1923, -1772, -1834, -2172, -2458, +-2450, -2250, -1983, -1734, -1582, -1535, -1475, -1319, -1069, -738, -476, -471, -706, -879, -800, -611, +-405, -176, 91, 440, 991, 1691, 2349, 2846, 3226, 3505, 3656, 3643, 3431, 3105, 2780, 2335, +1691, 965, 313, -293, -952, -1519, -1746, -1693, -1626, -1765, -2065, -2313, -2369, -2251, -2029, -1800, +-1619, -1557, -1527, -1432, -1154, -734, -463, -517, -699, -797, -790, -677, -500, -337, -179, 130, +681, 1351, 1952, 2465, 2941, 3348, 3593, 3619, 3496, 3352, 3132, 2663, 2027, 1452, 902, 178, +-640, -1236, -1486, -1510, -1515, -1678, -1968, -2232, -2333, -2299, -2167, -1926, -1694, -1651, -1700, -1578, +-1232, -844, -592, -556, -700, -812, -806, -708, -616, -560, -476, -187, 330, 927, 1470, 2018, +2630, 3134, 3375, 3468, 3530, 3515, 3269, 2817, 2348, 1906, 1349, 554, -297, -941, -1263, -1353, +-1420, -1597, -1877, -2114, -2300, -2393, -2257, -1974, -1823, -1843, -1862, -1711, -1396, -1023, -718, -653, +-771, -853, -817, -732, -724, -756, -700, -432, 6, 454, 943, 1607, 2294, 2751, 3036, 3312, +3536, 3536, 3312, 2987, 2670, 2314, 1773, 981, 85, -596, -953, -1152, -1319, -1450, -1664, -2002, +-2270, -2339, -2204, -1999, -1902, -1913, -1940, -1809, -1494, -1098, -786, -700, -791, -807, -705, -643, +-729, -810, -713, -517, -282, 75, 628, 1325, 1922, 2367, 2785, 3220, 3516, 3560, 3424, 3221, +3016, 2759, 2238, 1429, 595, -85, -596, -919, -1064, -1176, -1456, -1837, -2121, -2213, -2129, -1965, +-1883, -1939, -2000, -1894, -1582, -1188, -895, -819, -822, -709, -585, -636, -752, -752, -681, -651, +-550, -206, 365, 968, 1500, 1986, 2495, 3032, 3423, 3505, 3426, 3376, 3317, 3076, 2586, 1911, +1114, 346, -255, -612, -781, -942, -1262, -1659, -1970, -2091, -2044, -1911, -1857, -1951, -2072, -1985, +-1640, -1290, -1092, -966, -811, -641, -597, -660, -674, -643, -706, -800, -725, -403, 70, 588, +1058, 1544, 2170, 2794, 3167, 3300, 3386, 3476, 3464, 3293, 2939, 2350, 1558, 752, 105, -311, +-539, -745, -1101, -1539, -1879, -2046, -1995, -1852, -1863, -2073, -2189, -2031, -1733, -1528, -1372, -1127, +-885, -787, -749, -699, -664, -660, -757, -916, -913, -606, -191, 152, 546, 1121, 1796, 2379, +2795, 3050, 3232, 3381, 3443, 3405, 3177, 2677, 1917, 1111, 452, 3, -287, -546, -924, -1411, +-1844, -1989, -1883, -1809, -1945, -2177, -2215, -2053, -1930, -1790, -1537, -1257, -1053, -941, -855, -761, +-637, -633, -835, -1030, -976, -737, -505, -259, 135, 702, 1340, 1942, 2432, 2756, 3002, 3231, +3391, 3458, 3360, 2948, 2246, 1496, 822, 316, 17, -235, -687, -1285, -1732, -1794, -1728, -1815, +-1986, -2119, -2168, -2126, -2052, -1920, -1670, -1353, -1175, -1121, -995, -750, -613, -675, -866, -976, +-934, -839, -734, -543, -193, 321, 928, 1545, 2076, 2469, 2738, 3001, 3297, 3494, 3494, 3210, +2641, 1901, 1182, 690, 421, 90, -502, -1136, -1488, -1601, -1671, -1765, -1894, -2027, -2105, -2152, +-2174, -2029, -1727, -1472, -1391, -1305, -1044, -767, -684, -743, -847, -931, -923, -899, -866, -747, +-451, -26, 519, 1167, 1717, 2110, 2408, 2767, 3127, 3409, 3556, 3464, 2948, 2178, 1539, 1179, +864, 384, -239, -829, -1208, -1399, -1543, -1699, -1774, -1852, -2012, -2180, -2198, -2004, -1742, -1619, +-1559, -1387, -1086, -821, -700, -732, -778, -810, -856, -888, -899, -847, -670, -298, 244, 847, +1387, 1801, 2179, 2544, 2891, 3317, 3700, 3686, 3158, 2505, 2004, 1637, 1263, 740, 110, -443, +-840, -1150, -1420, -1547, -1571, -1689, -1966, -2162, -2119, -1951, -1803, -1721, -1670, -1462, -1145, -904, +-795, -735, -732, -752, -790, -821, -880, -951, -844, -502, -31, 490, 1048, 1555, 1873, 2146, +2609, 3215, 3676, 3715, 3323, 2789, 2395, 2062, 1629, 1068, 487, -26, -520, -975, -1265, -1338, +-1398, -1603, -1917, -2101, -2047, -1925, -1877, -1850, -1745, -1539, -1265, -1029, -876, -787, -752, -733, +-704, -754, -927, -1026, -924, -722, -380, 177, 792, 1225, 1467, 1773, 2325, 3017, 3546, 3647, +3355, 3002, 2731, 2391, 1913, 1434, 936, 361, -247, -763, -1049, -1146, -1257, -1549, -1860, -1980, +-1965, -1945, -1954, -1926, -1837, -1675, -1413, -1125, -952, -900, -803, -690, -685, -776, -887, -982, +-1034, -955, -638, -74, 507, 859, 1055, 1371, 1994, 2770, 3305, 3454, 3373, 3201, 2935, 2578, +2183, 1787, 1348, 718, 49, -454, -728, -909, -1132, -1441, -1719, -1849, -1896, -1931, -1947, -1957, +-1955, -1790, -1485, -1253, -1120, -968, -791, -704, -695, -704, -773, -956, -1140, -1134, -836, -282, +251, 502, 645, 1059, 1746, 2451, 2975, 3282, 3390, 3328, 3098, 2776, 2481, 2197, 1741, 1059, +370, -111, -400, -690, -984, -1263, -1537, -1728, -1780, -1808, -1908, -2004, -1956, -1791, -1588, -1407, +-1220, -1008, -850, -764, -675, -609, -655, -888, -1188, -1251, -921, -396, -6, 159, 351, 787, +1426, 2044, 2589, 3052, 3316, 3300, 3127, 2930, 2770, 2532, 2053, 1378, 774, 303, -104, -423, +-725, -1089, -1416, -1576, -1644, -1781, -1950, -2000, -1941, -1855, -1714, -1498, -1302, -1118, -989, -888, +-727, -510, -526, -883, -1252, -1278, -966, -553, -307, -159, 89, 508, 1030, 1611, 2236, 2815, +3157, 3176, 3070, 3051, 2989, 2732, 2301, 1717, 1097, 595, 214, -144, -538, -953, -1224, -1378, +-1539, -1742, -1905, -1989, -1999, -1956, -1860, -1656, -1425, -1280, -1214, -1057, -727, -458, -526, -929, +-1268, -1265, -1033, -792, -604, -448, -193, 147, 547, 1125, 1867, 2508, 2830, 2940, 3006, 3065, +3053, 2893, 2533, 1949, 1349, 922, 541, 69, -384, -750, -1036, -1253, -1448, -1680, -1867, -1939, +-2012, -2063, -1949, -1717, -1540, -1496, -1461, -1190, -745, -475, -585, -941, -1214, -1223, -1091, -982, +-820, -589, -413, -236, 154, 768, 1486, 2110, 2498, 2726, 2875, 3008, 3127, 3056, 2679, 2153, +1669, 1272, 844, 352, -133, -510, -793, -1069, -1340, -1549, -1717, -1874, -2056, -2135, -1959, -1709, +-1636, -1718, -1636, -1285, -817, -546, -648, -923, -1088, -1164, -1194, -1088, -869, -687, -641, -500, +-133, 421, 1078, 1737, 2189, 2440, 2706, 3011, 3197, 3145, 2870, 2437, 2030, 1650, 1186, 676, +220, -139, -483, -841, -1121, -1290, -1471, -1767, -2017, -2031, -1825, -1629, -1675, -1825, -1708, -1285, +-853, -628, -611, -715, -890, -1078, -1130, -1002, -839, -766, -735, -646, -384, 144, 826, 1423, +1860, 2203, 2577, 2974, 3241, 3261, 3069, 2765, 2407, 2010, 1530, 1049, 645, 248, -215, -594, +-782, -956, -1252, -1637, -1916, -1874, -1644, -1586, -1763, -1886, -1693, -1334, -996, -700, -531, -611, +-826, -991, -1028, -970, -831, -756, -826, -826, -577, -93, 516, 1058, 1457, 1859, 2350, 2824, +3129, 3208, 3139, 2960, 2654, 2221, 1795, 1422, 1011, 516, 10, -335, -492, -685, -1117, -1606, +-1831, -1733, -1600, -1669, -1840, -1883, -1776, -1528, -1166, -807, -628, -638, -800, -973, -1033, -948, +-840, -826, -942, -992, -788, -330, 185, 650, 1039, 1477, 2053, 2576, 2881, 3077, 3177, 3069, +2778, 2411, 2087, 1773, 1339, 748, 212, -56, -159, -468, -1043, -1494, -1607, -1592, -1605, -1663, +-1804, -1942, -1901, -1687, -1346, -961, -689, -647, -783, -950, -992, -898, -795, -844, -1009, -1107, +-933, -535, -132, 235, 646, 1159, 1715, 2208, 2614, 2954, 3174, 3120, 2851, 2562, 2367, 2090, +1569, 922, 481, 311, 85, -354, -874, -1273, -1475, -1522, -1545, -1630, -1791, -1947, -1999, -1854, +-1551, -1146, -808, -737, -868, -973, -985, -863, -753, -860, -1105, -1179, -1025, -748, -473, -148, +290, 797, 1314, 1815, 2316, 2790, 3071, 3040, 2830, 2731, 2672, 2329, 1728, 1208, 873, 631, +335, -114, -635, -1040, -1282, -1397, -1448, -1528, -1700, -1903, -2029, -1957, -1658, -1239, -895, -792, +-902, -999, -907, -740, -703, -864, -1073, -1141, -1040, -879, -675, -357, 59, 505, 933, 1437, +2090, 2667, 2898, 2880, 2898, 2970, 2883, 2507, 1983, 1523, 1223, 972, 642, 204, -323, -749, +-1035, -1215, -1307, -1369, -1559, -1825, -2002, -1998, -1746, -1311, -967, -899, -1000, -990, -829, -679, +-686, -824, -975, -1065, -1058, -1026, -883, -544, -159, 103, 467, 1137, 1880, 2364, 2609, 2751, +2934, 3090, 2999, 2648, 2194, 1797, 1510, 1253, 915, 471, -23, -496, -851, -1039, -1145, -1224, +-1402, -1716, -2013, -2067, -1797, -1369, -1082, -1050, -1079, -984, -801, -679, -690, -778, -849, -945, +-1082, -1110, -884, -588, -430, -267, 146, 850, 1550, 2014, 2318, 2626, 2931, 3144, 3122, 2801, +2398, 2085, 1799, 1526, 1225, 803, 288, -206, -597, -851, -968, -1015, -1209, -1601, -1976, -2026, +-1782, -1451, -1225, -1190, -1170, -1000, -807, -762, -730, -671, -739, -980, -1157, -1098, -884, -742, +-728, -592, -151, 502, 1125, 1576, 1932, 2348, 2783, 3056, 3067, 2843, 2513, 2217, 1971, 1731, +1433, 1033, 537, 21, -458, -745, -810, -861, -1127, -1574, -1964, -2057, -1844, -1590, -1480, -1408, +-1258, -1092, -991, -900, -745, -648, -791, -1068, -1162, -1057, -963, -963, -1008, -889, -473, 125, +658, 1078, 1525, 2037, 2533, 2881, 2993, 2846, 2572, 2326, 2107, 1874, 1626, 1307, 808, 191, +-302, -579, -641, -680, -989, -1524, -1910, -1960, -1858, -1757, -1654, -1488, -1339, -1266, -1191, -975, +-719, -671, -858, -1065, -1092, -977, -950, -1065, -1159, -1057, -701, -215, 243, 682, 1159, 1697, +2243, 2673, 2861, 2815, 2664, 2456, 2229, 2073, 1928, 1630, 1107, 440, -114, -346, -351, -482, +-874, -1363, -1679, -1791, -1859, -1850, -1684, -1493, -1454, -1430, -1259, -970, -729, -708, -895, -1016, +-965, -866, -927, -1093, -1191, -1128, -863, -477, -64, 321, 798, 1402, 1985, 2445, 2762, 2847, +2711, 2515, 2345, 2242, 2214, 1993, 1421, 684, 175, 8, -55, -292, -689, -1082, -1403, -1677, +-1844, -1795, -1614, -1501, -1538, -1517, -1295, -971, -759, -771, -899, -934, -824, -771, -866, -1042, +-1181, -1174, -955, -684, -379, 4, 484, 1056, 1657, 2192, 2591, 2780, 2728, 2526, 2383, 2411, +2494, 2292, 1654, 953, 532, 337, 123, -138, -442, -781, -1185, -1552, -1757, -1706, -1580, -1559, +-1666, -1626, -1336, -1006, -859, -879, -927, -910, -803, -716, -836, -1043, -1150, -1161, -1078, -897, +-656, -344, 112, 657, 1232, 1829, 2361, 2659, 2611, 2402, 2374, 2576, 2679, 2398, 1829, 1269, +864, 540, 272, 52, -178, -530, -1026, -1446, -1619, -1576, -1539, -1644, -1747, -1644, -1373, -1106, +-967, -980, -1008, -912, -753, -705, -805, -984, -1115, -1139, -1111, -1019, -845, -577, -202, 251, +801, 1508, 2188, 2494, 2403, 2289, 2415, 2659, 2733, 2519, 2093, 1620, 1155, 757, 471, 311, +120, -299, -865, -1263, -1401, -1452, -1533, -1664, -1780, -1692, -1406, -1175, -1087, -1072, -1044, -932, +-769, -706, -788, -937, -1055, -1120, -1173, -1147, -1005, -772, -541, -213, 384, 1215, 1899, 2170, +2145, 2187, 2389, 2612, 2699, 2601, 2313, 1875, 1359, 912, 701, 610, 356, -134, -657, -1044, +-1212, -1311, -1486, -1706, -1808, -1693, -1447, -1256, -1190, -1168, -1107, -981, -805, -720, -773, -846, +-921, -1069, -1195, -1140, -989, -904, -869, -569, 109, 946, 1594, 1886, 1989, 2129, 2358, 2562, +2697, 2770, 2611, 2148, 1607, 1224, 1025, 894, 622, 109, -395, -725, -904, -1103, -1378, -1646, +-1762, -1658, -1460, -1281, -1224, -1202, -1103, -951, -841, -769, -713, -713, -856, -1069, -1136, -1013, +-946, -1057, -1128, -846, -183, 616, 1222, 1559, 1810, 2038, 2206, 2410, 2665, 2828, 2723, 2303, +1791, 1461, 1310, 1166, 827, 336, -138, -443, -671, -951, -1288, -1596, -1738, -1675, -1489, -1389, +-1364, -1285, -1156, -1065, -994, -826, -651, -686, -902, -1073, -1045, -927, -968, -1220, -1365, -1071, +-471, 173, 767, 1251, 1569, 1772, 1965, 2231, 2586, 2842, 2754, 2363, 1949, 1693, 1553, 1366, +1006, 535, 113, -174, -427, -743, -1156, -1514, -1656, -1612, -1542, -1495, -1417, -1288, -1242, -1231, +-1077, -802, -633, -719, -947, -1038, -903, -819, -1002, -1300, -1422, -1220, -774, -213, 389, 932, +1278, 1471, 1686, 2053, 2502, 2791, 2749, 2421, 2086, 1877, 1738, 1519, 1182, 739, 345, 86, +-151, -551, -1025, -1378, -1545, -1625, -1636, -1549, -1427, -1372, -1391, -1380, -1175, -840, -714, -870, +-1011, -956, -835, -835, -1044, -1341, -1501, -1438, -1151, -631, 10, 582, 917, 1108, 1356, 1809, +2295, 2602, 2597, 2383, 2148, 1999, 1870, 1655, 1272, 845, 541, 335, 33, -410, -835, -1194, +-1470, -1663, -1712, -1587, -1455, -1498, -1610, -1519, -1191, -904, -863, -987, -1036, -916, -802, -819, +-999, -1263, -1491, -1563, -1387, -916, -268, 274, 561, 765, 1104, 1617, 2129, 2464, 2519, 2368, +2224, 2184, 2109, 1825, 1461, 1137, 876, 633, 285, -127, -504, -876, -1285, -1578, -1572, -1428, +-1416, -1572, -1649, -1467, -1140, -932, -943, -996, -936, -808, -715, -715, -831, -1076, -1393, -1603, +-1511, -1068, -468, 2, 267, 495, 862, 1398, 1971, 2342, 2416, 2354, 2354, 2367, 2242, 1971, +1646, 1390, 1164, 866, 522, 209, -125, -628, -1140, -1413, -1374, -1288, -1426, -1629, -1645, -1441, +-1189, -1049, -1036, -1036, -941, -816, -715, -640, -667, -929, -1344, -1632, -1577, -1200, -700, -275, +-30, 153, 556, 1164, 1747, 2096, 2233, 2300, 2393, 2452, 2308, 2057, 1848, 1629, 1322, 1024, +803, 584, 167, -436, -963, -1185, -1174, -1229, -1430, -1598, -1593, -1413, -1242, -1149, -1102, -1049, +-968, -864, -705, -510, -496, -773, -1213, -1563, -1610, -1301, -832, -505, -336, -123, 319, 944, +1492, 1829, 2042, 2269, 2431, 2447, 2345, 2222, 2086, 1815, 1470, 1225, 1132, 912, 415, -206, +-685, -898, -989, -1161, -1398, -1558, -1534, -1435, -1330, -1222, -1113, -1106, -1098, -982, -745, -500, +-428, -660, -1127, -1523, -1587, -1338, -986, -757, -665, -449, 35, 613, 1089, 1481, 1844, 2148, +2292, 2311, 2332, 2332, 2163, 1826, 1543, 1446, 1411, 1150, 613, 7, -424, -677, -865, -1122, +-1363, -1488, -1527, -1508, -1385, -1243, -1186, -1210, -1210, -1094, -817, -488, -364, -584, -1054, -1475, +-1548, -1344, -1106, -1006, -909, -641, -206, 268, 721, 1214, 1680, 1967, 2117, 2250, 2398, 2435, +2214, 1879, 1669, 1664, 1649, 1366, 830, 316, -48, -369, -677, -934, -1175, -1377, -1489, -1480, +-1367, -1227, -1180, -1248, -1304, -1175, -854, -449, -248, -461, -946, -1316, -1359, -1237, -1171, -1131, +-1006, -774, -449, -74, 416, 994, 1460, 1733, 1930, 2216, 2468, 2495, 2243, 1942, 1839, 1894, +1839, 1534, 1103, 677, 268, -106, -425, -714, -999, -1265, -1437, -1459, -1340, -1195, -1162, -1273, +-1393, -1307, -932, -439, -233, -449, -861, -1116, -1171, -1213, -1246, -1185, -1063, -927, -747, -393, +147, 723, 1152, 1417, 1722, 2132, 2442, 2431, 2189, 2009, 1981, 2004, 1935, 1722, 1369, 956, +537, 147, -174, -477, -822, -1132, -1338, -1409, -1314, -1152, -1125, -1321, -1527, -1407, -961, -478, +-301, -458, -718, -908, -1059, -1196, -1233, -1161, -1102, -1088, -975, -633, -89, 427, 759, 1068, +1526, 2038, 2335, 2335, 2192, 2081, 2069, 2086, 2039, 1878, 1587, 1203, 812, 437, 113, -220, +-589, -961, -1258, -1367, -1225, -1036, -1077, -1389, -1636, -1491, -1042, -637, -451, -462, -582, -778, +-1000, -1141, -1170, -1108, -1161, -1263, -1173, -811, -342, 32, 341, 744, 1287, 1799, 2112, 2182, +2132, 2096, 2076, 2088, 2092, 1984, 1718, 1383, 1025, 676, 357, 32, -360, -840, -1225, -1331, +-1131, -961, -1102, -1447, -1649, -1495, -1170, -824, -582, -464, -526, -732, -968, -1057, -1029, -1065, +-1247, -1387, -1265, -933, -598, -328, -21, 437, 1017, 1545, 1887, 2028, 2057, 2042, 2049, 2110, +2145, 2073, 1884, 1594, 1239, 909, 631, 345, -109, -704, -1142, -1179, -994, -926, -1118, -1437, +-1610, -1540, -1320, -1015, -684, -453, -506, -748, -921, -921, -913, -1058, -1300, -1421, -1283, -1043, +-832, -635, -321, 144, 713, 1268, 1668, 1869, 1930, 1950, 2005, 2080, 2153, 2148, 2024, 1749, +1390, 1136, 991, 706, 120, -551, -955, -994, -876, -885, -1091, -1353, -1519, -1586, -1498, -1175, +-740, -506, -570, -732, -801, -761, -817, -1038, -1280, -1362, -1268, -1127, -1019, -876, -611, -174, +391, 980, 1422, 1683, 1823, 1912, 1961, 2020, 2145, 2246, 2121, 1799, 1516, 1403, 1316, 991, +351, -332, -713, -777, -779, -864, -975, -1164, -1426, -1615, -1551, -1217, -819, -627, -671, -724, +-671, -616, -719, -955, -1168, -1253, -1220, -1147, -1092, -1016, -813, -438, 109, 679, 1147, 1497, +1719, 1811, 1853, 1981, 2228, 2329, 2183, 1882, 1679, 1674, 1618, 1237, 585, -19, -388, -596, +-719, -756, -819, -1020, -1365, -1621, -1561, -1232, -917, -781, -766, -710, -599, -568, -680, -894, +-1076, -1181, -1189, -1154, -1186, -1214, -1068, -720, -229, 316, 852, 1288, 1519, 1592, 1664, 1889, +2190, 2282, 2076, 1817, 1773, 1838, 1744, 1369, 820, 279, -174, -487, -636, -632, -677, -963, +-1388, -1630, -1564, -1328, -1112, -1000, -903, -769, -636, -592, -672, -847, -1031, -1130, -1126, -1157, +-1271, -1328, -1233, -1013, -632, -80, 541, 1021, 1249, 1325, 1479, 1835, 2143, 2145, 1966, 1852, +1899, 1956, 1852, 1560, 1114, 566, 21, -360, -482, -459, -551, -898, -1315, -1534, -1506, -1368, +-1243, -1121, -992, -815, -645, -551, -640, -822, -965, -1024, -1082, -1146, -1227, -1287, -1296, -1199, +-912, -342, 331, 784, 954, 1080, 1379, 1783, 2035, 2032, 1921, 1909, 1990, 2024, 1974, 1829, +1480, 899, 275, -125, -215, -229, -427, -795, -1164, -1368, -1421, -1373, -1297, -1217, -1099, -876, +-640, -559, -636, -734, -826, -916, -1005, -1089, -1166, -1253, -1373, -1421, -1159, -553, 81, 445, +636, 866, 1263, 1656, 1863, 1920, 1920, 1936, 1969, 2012, 2077, 2057, 1733, 1126, 511, 161, +45, -43, -264, -624, -981, -1217, -1288, -1305, -1329, -1294, -1136, -892, -686, -580, -606, -645, +-690, -796, -919, -941, -952, -1131, -1391, -1515, -1261, -706, -169, 147, 390, 742, 1166, 1520, +1742, 1877, 1941, 1932, 1949, 2067, 2248, 2281, 1957, 1369, 831, 491, 317, 191, -27, -399, +-771, -977, -1108, -1218, -1314, -1317, -1165, -929, -747, -659, -588, -548, -617, -771, -844, -771, +-783, -1059, -1420, -1534, -1288, -860, -467, -183, 138, 540, 933, 1271, 1568, 1796, 1862, 1809, +1841, 2076, 2339, 2384, 2130, 1610, 1083, 734, 553, 385, 105, -252, -588, -805, -967, -1160, +-1317, -1331, -1185, -1023, -868, -706, -556, -525, -659, -793, -747, -626, -711, -1038, -1392, -1489, +-1315, -1038, -752, -442, -89, 289, 641, 1035, 1448, 1697, 1697, 1641, 1744, 2009, 2305, 2434, +2219, 1778, 1336, 1011, 805, 594, 277, -71, -355, -584, -836, -1088, -1262, -1276, -1231, -1161, +-987, -715, -536, -570, -719, -756, -606, -481, -623, -973, -1278, -1391, -1336, -1203, -965, -630, +-326, -27, 362, 865, 1312, 1553, 1567, 1524, 1642, 1965, 2290, 2458, 2311, 1937, 1537, 1259, +1049, 777, 439, 144, -108, -389, -713, -975, -1117, -1219, -1312, -1287, -1049, -728, -598, -694, +-812, -735, -531, -461, -638, -918, -1159, -1325, -1406, -1325, -1092, -845, -630, -355, 50, 595, +1080, 1330, 1355, 1326, 1445, 1781, 2170, 2389, 2300, 2023, 1732, 1504, 1232, 899, 610, 371, +78, -265, -593, -822, -994, -1204, -1387, -1350, -1062, -753, -691, -810, -826, -675, -496, -467, +-565, -759, -1028, -1257, -1367, -1317, -1151, -989, -854, -613, -169, 384, 899, 1193, 1208, 1171, +1317, 1679, 2083, 2290, 2266, 2120, 1957, 1722, 1393, 1094, 880, 636, 290, -82, -350, -549, +-810, -1151, -1399, -1331, -1034, -826, -846, -879, -813, -684, -545, -448, -476, -647, -908, -1171, +-1306, -1278, -1208, -1164, -1115, -916, -496, 88, 648, 962, 982, 962, 1152, 1543, 1917, 2121, +2190, 2183, 2048, 1783, 1470, 1243, 1043, 763, 398, 59, -129, -330, -716, -1160, -1368, -1278, +-1107, -995, -972, -976, -919, -813, -672, -517, -468, -611, -892, -1147, -1262, -1262, -1251, -1278, +-1319, -1200, -810, -206, 360, 657, 696, 750, 991, 1330, 1626, 1882, 2097, 2170, 2066, 1829, +1606, 1448, 1239, 881, 502, 292, 152, -149, -631, -1052, -1254, -1246, -1152, -1069, -1035, -1018, +-999, -908, -718, -501, -419, -567, -811, -1047, -1173, -1198, -1223, -1328, -1466, -1417, -1035, -428, +100, 376, 502, 645, 840, 1084, 1368, 1697, 1995, 2111, 2001, 1855, 1782, 1652, 1346, 963, +687, 551, 376, 11, -481, -884, -1128, -1213, -1185, -1120, -1064, -1083, -1106, -995, -774, -533, +-428, -517, -745, -967, -1076, -1071, -1121, -1336, -1586, -1562, -1185, -665, -202, 132, 348, 529, +687, 855, 1161, 1588, 1921, 1999, 1955, 1955, 1955, 1791, 1451, 1126, 944, 837, 634, 255, +-192, -608, -909, -1068, -1071, -1014, -1014, -1081, -1110, -1008, -786, -530, -361, -403, -619, -808, +-842, -808, -922, -1228, -1509, -1524, -1224, -796, -404, -26, 299, 476, 560, 749, 1123, 1552, +1829, 1932, 2033, 2177, 2193, 1993, 1657, 1393, 1256, 1132, 920, 585, 152, -291, -643, -849, +-882, -865, -897, -979, -1048, -984, -783, -477, -273, -338, -546, -653, -624, -596, -762, -1122, +-1403, -1437, -1273, -996, -583, -140, 202, 321, 399, 639, 1034, 1394, 1611, 1775, 2006, 2223, +2256, 2059, 1800, 1594, 1452, 1325, 1166, 865, 423, -51, -443, -677, -772, -815, -863, -963, +-1116, -1086, -840, -510, -338, -404, -567, -575, -477, -497, -715, -1013, -1275, -1432, -1441, -1220, +-801, -350, -79, 22, 170, 479, 854, 1125, 1335, 1601, 1917, 2156, 2201, 2061, 1858, 1646, +1494, 1407, 1306, 1044, 612, 149, -249, -548, -674, -698, -785, -987, -1176, -1168, -916, -612, +-506, -579, -621, -539, -449, -497, -657, -878, -1160, -1438, -1545, -1365, -970, -584, -380, -240, +-17, 304, 579, 791, 1054, 1380, 1724, 1990, 2107, 2066, 1887, 1679, 1566, 1511, 1405, 1193, +825, 342, -129, -449, -579, -621, -756, -1033, -1251, -1205, -957, -744, -694, -706, -645, -548, +-506, -522, -579, -757, -1108, -1481, -1622, -1435, -1112, -841, -662, -457, -174, 113, 313, 513, +801, 1123, 1476, 1824, 2010, 1988, 1860, 1726, 1623, 1584, 1545, 1398, 1062, 576, 69, -262, +-375, -444, -706, -1067, -1234, -1161, -977, -850, -788, -723, -645, -563, -520, -441, -404, -584, +-994, -1378, -1522, -1396, -1194, -1023, -827, -563, -293, -38, 183, 376, 602, 924, 1339, 1714, +1947, 1994, 1912, 1800, 1707, 1673, 1693, 1629, 1339, 821, 314, 44, -50, -229, -584, -921, +-1059, -1034, -957, -895, -811, -711, -675, -642, -511, -316, -244, -449, -879, -1223, -1348, -1343, +-1266, -1122, -946, -711, -429, -174, 12, 166, 376, 702, 1122, 1519, 1801, 1932, 1923, 1819, +1708, 1703, 1794, 1801, 1482, 962, 535, 319, 159, -104, -483, -777, -938, -995, -1011, -924, +-815, -761, -802, -769, -548, -281, -220, -417, -749, -1068, -1270, -1330, -1315, -1229, -1086, -860, +-580, -338, -177, -50, 137, 454, 869, 1277, 1613, 1840, 1872, 1738, 1647, 1738, 1902, 1893, +1573, 1127, 803, 593, 327, 7, -320, -613, -840, -995, -1019, -908, -815, -865, -942, -840, +-564, -306, -215, -344, -627, -922, -1160, -1287, -1353, -1340, -1217, -1008, -733, -491, -331, -229, +-45, 233, 582, 1012, 1461, 1747, 1767, 1629, 1600, 1772, 1935, 1894, 1615, 1303, 1038, 794, +500, 171, -115, -442, -787, -980, -960, -856, -885, -996, -1062, -955, -671, -396, -265, -331, +-540, -819, -1048, -1234, -1365, -1409, -1336, -1140, -898, -700, -558, -424, -286, -91, 239, 729, +1261, 1559, 1548, 1482, 1559, 1757, 1896, 1839, 1664, 1448, 1219, 919, 632, 393, 91, -322, +-708, -875, -858, -819, -889, -1030, -1116, -1025, -771, -487, -320, -311, -467, -685, -898, -1125, +-1338, -1440, -1370, -1207, -1016, -824, -635, -507, -438, -345, -9, 558, 1073, 1322, 1348, 1373, +1535, 1737, 1819, 1829, 1771, 1611, 1359, 1104, 917, 690, 324, -157, -549, -729, -747, -771, +-887, -1038, -1141, -1074, -841, -541, -335, -291, -356, -487, -709, -997, -1244, -1367, -1343, -1270, +-1145, -910, -671, -589, -607, -533, -169, 399, 889, 1108, 1204, 1349, 1518, 1652, 1763, 1862, +1854, 1689, 1480, 1324, 1184, 949, 566, 78, -316, -496, -569, -628, -759, -961, -1132, -1103, +-887, -628, -422, -294, -257, -327, -553, -854, -1083, -1219, -1301, -1305, -1166, -890, -672, -672, +-771, -698, -311, 202, 612, 893, 1103, 1271, 1418, 1579, 1765, 1897, 1884, 1731, 1567, 1489, +1393, 1151, 753, 293, -106, -340, -422, -500, -672, -899, -1084, -1105, -950, -759, -570, -360, +-238, -286, -485, -727, -931, -1132, -1322, -1373, -1191, -883, -738, -834, -931, -820, -500, -95, +308, 675, 914, 1078, 1243, 1445, 1689, 1845, 1823, 1709, 1639, 1610, 1524, 1317, 956, 486, +79, -168, -274, -389, -603, -854, -1033, -1101, -1064, -924, -686, -434, -265, -291, -410, -561, +-767, -1069, -1369, -1402, -1184, -942, -883, -953, -999, -924, -698, -349, 66, 437, 697, 852, +1039, 1326, 1594, 1723, 1718, 1656, 1631, 1656, 1631, 1484, 1145, 676, 280, 50, -91, -269, +-509, -735, -942, -1091, -1134, -1033, -785, -514, -369, -349, -328, -376, -624, -1028, -1321, -1324, +-1152, -995, -951, -1005, -1062, -1028, -888, -570, -140, 221, 452, 639, 881, 1191, 1468, 1621, +1649, 1632, 1641, 1712, 1761, 1621, 1280, 854, 503, 260, 79, -132, -356, -550, -777, -1011, +-1135, -1036, -803, -624, -509, -351, -186, -215, -525, -938, -1194, -1214, -1099, -976, -904, -918, +-1011, -1074, -966, -659, -263, 67, 280, 483, 763, 1094, 1388, 1597, 1642, 1630, 1697, 1849, +1928, 1821, 1519, 1142, 828, 574, 302, 79, -86, -281, -590, -900, -1005, -909, -798, -695, +-525, -269, -48, -66, -351, -724, -972, -1074, -1038, -918, -844, -873, -1000, -1074, -967, -695, +-369, -95, 139, 352, 632, 987, 1321, 1515, 1549, 1573, 1694, 1899, 2008, 1920, 1689, 1409, +1114, 786, 501, 327, 166, -106, -468, -753, -847, -856, -864, -819, -604, -274, -41, -21, +-220, -522, -827, -996, -987, -856, -778, -844, -1001, -1082, -1025, -819, -534, -274, -77, 128, +421, 815, 1162, 1353, 1411, 1462, 1652, 1873, 1967, 1921, 1810, 1587, 1232, 889, 670, 521, +311, -23, -374, -599, -722, -856, -960, -931, -703, -412, -168, -81, -188, -472, -816, -1014, +-1001, -876, -811, -870, -1010, -1121, -1113, -953, -725, -519, -352, -168, 157, 570, 918, 1080, +1166, 1332, 1534, 1700, 1820, 1911, 1879, 1646, 1283, 992, 823, 667, 394, 46, -240, -457, +-667, -894, -1059, -1059, -885, -606, -312, -119, -173, -457, -782, -989, -1023, -934, -870, -934, +-1093, -1217, -1225, -1097, -899, -762, -667, -466, -81, 311, 605, 787, 968, 1136, 1296, 1461, +1656, 1833, 1833, 1605, 1305, 1106, 982, 779, 473, 166, -81, -323, -609, -874, -1088, -1162, +-1068, -795, -452, -206, -197, -407, -716, -941, -997, -928, -871, -924, -1084, -1239, -1251, -1120, +-989, -946, -871, -609, -244, 89, 353, 597, 828, 982, 1111, 1326, 1629, 1852, 1848, 1657, +1446, 1317, 1169, 937, 668, 408, 151, -109, -386, -675, -961, -1135, -1094, -841, -495, -202, +-123, -294, -577, -795, -895, -841, -763, -837, -1040, -1157, -1110, -1026, -1011, -999, -903, -660, +-357, -77, 212, 520, 731, 842, 978, 1274, 1630, 1858, 1862, 1763, 1650, 1513, 1348, 1137, +915, 672, 411, 152, -119, -457, -801, -1053, -1089, -882, -526, -220, -94, -186, -441, -698, +-771, -704, -684, -810, -980, -1053, -1024, -1013, -1062, -1044, -941, -763, -555, -263, 84, 395, +554, 636, 822, 1159, 1499, 1702, 1796, 1794, 1731, 1597, 1456, 1287, 1075, 856, 612, 375, +100, -234, -647, -984, -1105, -970, -672, -320, -119, -177, -412, -607, -638, -607, -656, -796, +-913, -947, -971, -1045, -1091, -1079, -1013, -927, -742, -412, -40, 206, 330, 447, 690, 1014, +1317, 1563, 1698, 1741, 1703, 1610, 1511, 1371, 1185, 965, 762, 579, 321, -65, -490, -876, +-1096, -1062, -768, -407, -202, -263, -444, -555, -561, -597, -698, -793, -854, -905, -981, -1050, +-1071, -1068, -1099, -1097, -893, -556, -234, -36, 113, 264, 482, 791, 1114, 1393, 1596, 1684, +1684, 1645, 1582, 1451, 1252, 1078, 937, 769, 516, 176, -287, -756, -1079, -1097, -813, -470, +-294, -332, -415, -444, -478, -568, -665, -714, -764, -868, -968, -997, -992, -1072, -1184, -1180, +-997, -681, -390, -192, -48, 113, 327, 613, 932, 1249, 1471, 1593, 1660, 1685, 1639, 1514, +1361, 1215, 1099, 958, 774, 471, -2, -561, -960, -1026, -797, -533, -404, -365, -346, -336, +-407, -502, -553, -578, -676, -793, -842, -842, -894, -1015, -1152, -1189, -1035, -772, -524, -312, +-148, -7, 181, 477, 825, 1123, 1353, 1528, 1645, 1710, 1686, 1578, 1465, 1340, 1211, 1128, +1041, 796, 285, -332, -772, -878, -761, -607, -490, -379, -312, -328, -386, -407, -444, -516, +-640, -732, -757, -753, -826, -977, -1123, -1165, -1078, -884, -648, -441, -298, -173, 10, 309, +627, 908, 1164, 1408, 1574, 1649, 1666, 1629, 1513, 1350, 1252, 1267, 1267, 1022, 463, -152, +-574, -766, -795, -711, -554, -428, -384, -370, -370, -370, -404, -516, -657, -720, -703, -711, +-812, -945, -1086, -1183, -1156, -994, -761, -590, -473, -361, -168, 95, 372, 662, 969, 1232, +1419, 1559, 1650, 1632, 1490, 1313, 1270, 1375, 1411, 1163, 663, 116, -343, -662, -800, -758, +-627, -528, -492, -456, -380, -342, -405, -540, -648, -683, -677, -696, -769, -891, -1061, -1208, +-1218, -1074, -889, -749, -629, -497, -327, -115, 173, 481, 793, 1060, 1282, 1506, 1679, 1641, +1420, 1257, 1305, 1442, 1470, 1289, 893, 393, -122, -524, -742, -760, -683, -635, -616, -532, +-411, -367, -419, -527, -622, -656, -649, -642, -672, -799, -1005, -1146, -1168, -1088, -962, -836, +-704, -581, -440, -259, 28, 364, 646, 877, 1176, 1531, 1724, 1649, 1444, 1334, 1379, 1502, +1570, 1483, 1189, 702, 141, -307, -561, -647, -668, -678, -647, -542, -415, -359, -383, -442, +-535, -599, -565, -522, -556, -705, -888, -1041, -1088, -1049, -965, -834, -695, -619, -531, -325, +-23, 249, 454, 742, 1162, 1540, 1729, 1684, 1529, 1426, 1461, 1560, 1674, 1679, 1450, 998, +453, -15, -331, -508, -628, -674, -641, -545, -437, -347, -317, -391, -493, -529, -481, -425, +-454, -594, -750, -896, -994, -1015, -935, -786, -713, -683, -577, -344, -109, 71, 270, 612, +1067, 1475, 1689, 1703, 1590, 1485, 1468, 1569, 1742, 1816, 1655, 1243, 749, 295, -92, -383, +-551, -640, -663, -605, -488, -366, -327, -392, -490, -519, -438, -400, -447, -521, -639, -826, +-985, -1003, -894, -817, -807, -764, -610, -397, -236, -122, 64, 430, 886, 1296, 1582, 1670, +1601, 1480, 1437, 1551, 1769, 1875, 1745, 1433, 1000, 528, 93, -237, -493, -651, -724, -693, +-563, -422, -388, -447, -492, -486, -464, -443, -408, -439, -598, -820, -948, -946, -894, -897, +-919, -830, -659, -505, -409, -326, -136, 198, 636, 1063, 1421, 1590, 1534, 1397, 1370, 1510, +1700, 1833, 1792, 1560, 1189, 743, 299, -87, -394, -644, -801, -789, -673, -571, -547, -541, +-544, -585, -588, -505, -420, -451, -633, -823, -920, -904, -939, -994, -989, -898, -752, -646, +-590, -515, -340, -53, 351, 845, 1276, 1472, 1449, 1338, 1316, 1431, 1613, 1771, 1815, 1677, +1350, 933, 524, 130, -270, -614, -784, -809, -764, -709, -617, -575, -621, -682, -658, -524, +-421, -493, -660, -793, -844, -892, -960, -1030, -1025, -925, -823, -744, -674, -621, -538, -305, +122, 632, 1086, 1328, 1358, 1301, 1285, 1369, 1536, 1734, 1845, 1744, 1488, 1182, 820, 362, +-108, -453, -681, -804, -824, -773, -666, -623, -689, -738, -660, -513, -444, -501, -621, -707, +-754, -840, -952, -1019, -1018, -963, -866, -772, -722, -716, -692, -507, -114, 413, 882, 1167, +1271, 1268, 1238, 1280, 1481, 1713, 1798, 1768, 1644, 1422, 1070, 605, 133, -252, -567, -802, +-870, -790, -709, -721, -788, -782, -662, -522, -488, -516, -577, -626, -715, -813, -913, -1001, +-1035, -986, -890, -787, -738, -783, -819, -670, -294, 179, 650, 1020, 1201, 1191, 1167, 1254, +1442, 1623, 1736, 1789, 1766, 1603, 1279, 876, 446, -10, -442, -736, -827, -785, -757, -821, +-871, -808, -694, -606, -547, -531, -560, -600, -659, -767, -881, -984, -1054, -1032, -913, -790, +-786, -865, -905, -803, -529, -75, 447, 859, 1049, 1085, 1121, 1230, 1364, 1512, 1670, 1810, +1832, 1720, 1491, 1172, 766, 243, -260, -585, -712, -735, -797, -873, -890, -831, -739, -651, +-580, -520, -505, -524, -583, -647, -761, -913, -1020, -968, -845, -769, -757, -822, -900, -891, +-670, -244, 294, 692, 927, 1058, 1148, 1222, 1324, 1472, 1664, 1835, 1882, 1818, 1704, 1497, +1082, 518, 3, -332, -533, -649, -763, -841, -881, -848, -779, -707, -614, -531, -519, -520, +-495, -547, -698, -867, -940, -903, -813, -731, -695, -769, -912, -978, -801, -395, 81, 488, +800, 1007, 1133, 1190, 1268, 1443, 1649, 1797, 1863, 1906, 1907, 1732, 1331, 816, 294, -94, +-343, -523, -692, -802, -848, -869, -840, -738, -648, -595, -548, -476, -427, -493, -657, -803, +-879, -896, -829, -689, -627, -735, -921, -1018, -899, -567, -162, 267, 658, 938, 1040, 1099, +1231, 1420, 1568, 1678, 1813, 1955, 2023, 1925, 1591, 1098, 616, 205, -132, -396, -571, -713, +-847, -891, -836, -767, -702, -645, -545, -423, -390, -434, -546, -690, -838, -871, -764, -619, +-572, -691, -893, -994, -924, -715, -364, 103, 533, 786, 919, 1058, 1220, 1371, 1502, 1608, +1746, 1955, 2101, 2047, 1795, 1418, 948, 481, 90, -184, -423, -654, -835, -882, -858, -844, +-810, -712, -588, -493, -413, -393, -482, -660, -839, -884, -761, -609, -578, -694, -846, -979, +-1036, -913, -564, -108, 287, 570, 754, 928, 1118, 1271, 1350, 1446, 1657, 1889, 2050, 2086, +1949, 1618, 1171, 708, 321, -2, -323, -603, -776, -882, -941, -948, -904, -824, -718, -596, +-471, -389, -464, -697, -890, -896, -788, -672, -632, -662, -799, -1001, -1138, -1061, -762, -353, +29, 315, 562, 808, 1011, 1132, 1213, 1332, 1529, 1755, 1969, 2107, 2050, 1772, 1383, 971, +573, 181, -165, -452, -691, -845, -952, -992, -986, -949, -876, -720, -494, -388, -486, -686, +-828, -871, -818, -716, -608, -631, -761, -980, -1163, -1148, -890, -564, -242, 66, 384, 682, +897, 1015, 1130, 1244, 1391, 1631, 1895, 2081, 2076, 1911, 1621, 1250, 825, 409, 28, -278, +-545, -784, -919, -973, -1025, -1067, -997, -790, -558, -481, -522, -650, -803, -879, -846, -741, +-601, -556, -692, -945, -1145, -1161, -1001, -768, -494, -145, 218, 501, 741, 943, 1047, 1121, +1273, 1533, 1809, 2021, 2088, 2013, 1816, 1498, 1085, 670, 293, -59, -397, -656, -788, -914, +-1078, -1130, -1043, -857, -641, -507, -511, -598, -736, -861, -871, -730, -549, -483, -629, -866, +-1036, -1091, -1056, -903, -628, -310, 20, 368, 667, 866, 963, 1032, 1184, 1435, 1710, 1940, +2092, 2132, 2013, 1707, 1348, 993, 571, 129, -213, -459, -652, -866, -1069, -1165, -1119, -947, +-744, -580, -508, -554, -710, -884, -921, -749, -550, -501, -608, -784, -976, -1109, -1117, -1025, +-835, -560, -208, 166, 497, 718, 817, 899, 1040, 1265, 1499, 1770, 2022, 2105, 2011, 1837, +1584, 1215, 766, 338, -11, -289, -530, -818, -1069, -1216, -1221, -1124, -962, -753, -575, -592, +-771, -953, -944, -804, -653, -570, -605, -772, -970, -1102, -1166, -1146, -1041, -836, -496, -83, +262, 482, 648, 786, 891, 1039, 1291, 1622, 1857, 1993, 2014, 1942, 1738, 1402, 951, 525, +169, -123, -411, -740, -1023, -1209, -1296, -1305, -1129, -853, -671, -689, -837, -982, -1015, -906, +-737, -619, -627, -739, -900, -1063, -1148, -1201, -1194, -1019, -683, -327, 1, 316, 545, 660, +742, 891, 1153, 1455, 1707, 1884, 2002, 2024, 1890, 1594, 1168, 774, 434, 103, -246, -561, +-866, -1139, -1338, -1363, -1198, -935, -747, -733, -848, -994, -1031, -935, -779, -642, -610, -687, +-801, -920, -1086, -1225, -1241, -1111, -879, -568, -190, 173, 415, 535, 632, 804, 1038, 1320, +1586, 1799, 1997, 2114, 2042, 1758, 1409, 1074, 713, 343, 13, -283, -632, -987, -1260, -1337, +-1214, -980, -785, -739, -815, -939, -1013, -935, -761, -634, -596, -575, -619, -766, -953, -1094, +-1159, -1137, -987, -693, -311, 70, 323, 471, 585, 759, 993, 1227, 1478, 1767, 2042, 2205, +2164, 1985, 1723, 1384, 1001, 650, 356, 44, -343, -762, -1119, -1245, -1180, -999, -812, -701, +-773, -918, -952, -888, -782, -675, -559, -490, -533, -672, -821, -969, -1107, -1170, -1079, -838, +-470, -86, 163, 324, 494, 689, 851, 1035, 1319, 1651, 1940, 2114, 2184, 2138, 1924, 1614, +1244, 911, 638, 318, -118, -582, -975, -1206, -1231, -1046, -853, -791, -836, -900, -931, -934, +-862, -723, -578, -503, -524, -609, -723, -879, -1067, -1198, -1181, -957, -620, -290, -30, 204, +425, 572, 690, 872, 1159, 1489, 1795, 2019, 2169, 2204, 2064, 1766, 1428, 1144, 883, 556, +153, -338, -828, -1151, -1206, -1082, -959, -896, -878, -905, -977, -1014, -935, -794, -647, -534, +-518, -557, -625, -778, -1020, -1208, -1230, -1058, -815, -542, -239, 57, 275, 412, 534, 724, +1015, 1313, 1593, 1889, 2154, 2238, 2136, 1906, 1645, 1362, 1105, 850, 453, -95, -643, -993, +-1115, -1098, -1014, -910, -885, -921, -1001, -1030, -986, -854, -705, -609, -543, -489, -494, -657, +-908, -1101, -1159, -1100, -934, -679, -355, -43, 160, 288, 442, 640, 873, 1136, 1462, 1811, +2099, 2254, 2250, 2095, 1809, 1571, 1404, 1156, 738, 184, -347, -761, -984, -1042, -978, -899, +-868, -896, -989, -1034, -961, -856, -795, -690, -553, -425, -414, -550, -789, -975, -1096, -1124, +-1046, -785, -461, -194, 3, 184, 356, 506, 702, 956, 1286, 1639, 1976, 2224, 2284, 2140, +1929, 1781, 1643, 1395, 1007, 496, -55, -540, -871, -1004, -1004, -918, -878, -949, -1032, -1040, +-995, -953, -918, -794, -604, -442, -407, -512, -670, -853, -1045, -1170, -1117, -908, -642, -401, +-160, 49, 208, 345, 534, 765, 1028, 1415, 1834, 2138, 2212, 2133, 2015, 1908, 1786, 1603, +1260, 780, 251, -286, -726, -938, -970, -933, -942, -998, -1048, -1043, -1030, -1039, -1035, -897, +-688, -539, -480, -481, -581, -798, -1047, -1184, -1169, -1047, -832, -574, -333, -134, 49, 217, +346, 503, 767, 1173, 1633, 1934, 2080, 2073, 2014, 1964, 1905, 1757, 1478, 1072, 519, -93, +-581, -849, -933, -980, -1044, -1094, -1094, -1081, -1126, -1180, -1148, -1013, -843, -699, -551, -471, +-558, -782, -1022, -1203, -1280, -1189, -982, -777, -561, -327, -98, 50, 131, 266, 529, 937, +1395, 1724, 1879, 1950, 1989, 1973, 1935, 1864, 1693, 1342, 785, 168, -371, -688, -861, -998, +-1106, -1128, -1128, -1158, -1234, -1251, -1233, -1152, -1026, -816, -616, -519, -539, -712, -960, -1201, +-1287, -1222, -1113, -959, -723, -459, -219, -86, -25, 77, 338, 751, 1188, 1535, 1773, 1921, +1972, 1975, 1992, 2006, 1936, 1630, 1120, 502, -23, -394, -671, -886, -988, -1019, -1068, -1142, +-1162, -1198, -1241, -1212, -1073, -874, -672, -481, -432, -587, -832, -1049, -1158, -1184, -1143, -1023, +-818, -531, -265, -154, -125, -28, 209, 577, 1000, 1371, 1671, 1861, 1943, 1966, 2039, 2150, +2144, 1872, 1388, 851, 351, -115, -488, -715, -851, -957, -1029, -1078, -1131, -1202, -1244, -1231, +-1153, -983, -715, -477, -413, -523, -715, -906, -1046, -1135, -1175, -1110, -884, -574, -348, -229, +-198, -107, 96, 401, 792, 1203, 1563, 1772, 1850, 1903, 2084, 2282, 2293, 2084, 1734, 1254, +704, 209, -174, -475, -705, -841, -924, -1015, -1086, -1128, -1202, -1255, -1211, -1033, -742, -478, +-368, -427, -565, -713, -870, -1047, -1154, -1123, -925, -632, -403, -281, -221, -136, 5, 247, +619, 1087, 1458, 1651, 1737, 1883, 2110, 2296, 2371, 2291, 2013, 1575, 1058, 570, 120, -248, +-506, -683, -840, -951, -1007, -1068, -1183, -1296, -1292, -1132, -832, -563, -431, -429, -479, -570, +-750, -999, -1159, -1151, -981, -729, -534, -388, -279, -221, -175, 12, 427, 906, 1230, 1423, +1587, 1756, 1969, 2201, 2377, 2377, 2179, 1837, 1363, 845, 387, -20, -346, -612, -806, -924, +-977, -1049, -1212, -1387, -1410, -1254, -987, -743, -572, -485, -441, -497, -697, -973, -1157, -1189, +-1084, -920, -708, -483, -367, -376, -373, -164, 222, 651, 1002, 1246, 1400, 1575, 1829, 2097, +2298, 2375, 2312, 2046, 1623, 1149, 683, 262, -134, -473, -706, -826, -862, -995, -1214, -1412, +-1451, -1338, -1125, -899, -704, -531, -408, -414, -621, -883, -1058, -1137, -1150, -1006, -753, -533, +-468, -477, -465, -315, 21, 460, 828, 1077, 1262, 1455, 1691, 1961, 2224, 2393, 2409, 2215, +1856, 1430, 1007, 563, 105, -282, -531, -650, -744, -912, -1169, -1388, -1461, -1394, -1251, -1087, +-866, -601, -433, -434, -582, -764, -955, -1143, -1191, -1043, -808, -615, -541, -571, -587, -468, +-152, 240, 585, 873, 1100, 1282, 1500, 1798, 2122, 2371, 2459, 2329, 2049, 1717, 1343, 847, +325, -87, -348, -489, -598, -788, -1086, -1315, -1401, -1418, -1398, -1242, -940, -667, -506, -442, +-485, -658, -890, -1095, -1170, -1076, -856, -663, -604, -634, -654, -562, -304, 39, 396, 715, +955, 1132, 1339, 1645, 2014, 2310, 2437, 2403, 2246, 2009, 1654, 1169, 620, 155, -111, -241, +-417, -688, -963, -1165, -1324, -1476, -1493, -1323, -1060, -811, -595, -438, -417, -539, -780, -1035, +-1165, -1082, -887, -716, -656, -693, -715, -643, -452, -150, 196, 529, 771, 924, 1122, 1464, +1853, 2145, 2322, 2386, 2340, 2187, 1912, 1416, 832, 392, 142, -70, -333, -574, -796, -1048, +-1312, -1505, -1555, -1450, -1243, -1000, -752, -530, -417, -487, -721, -999, -1154, -1107, -939, -796, +-742, -759, -789, -762, -626, -342, 21, 339, 550, 702, 938, 1272, 1669, 1998, 2201, 2321, +2414, 2397, 2144, 1632, 1111, 714, 394, 102, -140, -356, -624, -910, -1184, -1424, -1535, -1494, +-1351, -1138, -873, -584, -390, -420, -638, -912, -1061, -1045, -917, -790, -741, -720, -766, -822, +-707, -427, -112, 173, 393, 555, 758, 1114, 1525, 1827, 2042, 2297, 2528, 2552, 2319, 1901, +1443, 1009, 640, 332, 88, -123, -384, -718, -1047, -1313, -1483, -1515, -1459, -1303, -1014, -674, +-421, -401, -582, -828, -993, -1021, -945, -811, -711, -728, -820, -873, -795, -571, -272, 12, +188, 335, 604, 988, 1314, 1562, 1858, 2214, 2490, 2569, 2449, 2135, 1725, 1293, 879, 543, +289, 81, -178, -528, -875, -1169, -1382, -1511, -1567, -1477, -1215, -831, -529, -459, -558, -743, +-935, -1040, -966, -819, -730, -732, -819, -906, -877, -636, -359, -180, -53, 161, 479, 802, +1064, 1342, 1682, 2079, 2393, 2561, 2547, 2356, 2008, 1582, 1156, 788, 525, 306, 23, -336, +-683, -975, -1217, -1448, -1597, -1558, -1294, -940, -645, -487, -502, -677, -883, -979, -939, -830, +-725, -719, -863, -990, -893, -656, -476, -364, -216, 23, 316, 593, 824, 1081, 1435, 1852, +2220, 2460, 2539, 2471, 2196, 1789, 1368, 1010, 739, 509, 205, -184, -502, -774, -1098, -1421, +-1636, -1655, -1489, -1175, -821, -599, -571, -686, -866, -1015, -1003, -835, -722, -790, -952, -1025, +-929, -753, -651, -557, -393, -137, 128, 363, 579, 839, 1191, 1597, 1986, 2305, 2503, 2528, +2330, 1963, 1570, 1250, 989, 701, 354, 33, -243, -553, -928, -1292, -1572, -1718, -1632, -1328, +-986, -721, -586, -647, -871, -1033, -972, -800, -732, -830, -970, -1004, -924, -818, -767, -687, +-510, -271, -48, 165, 399, 647, 973, 1351, 1743, 2112, 2437, 2566, 2413, 2098, 1796, 1518, +1210, 884, 583, 283, -16, -329, -691, -1121, -1500, -1699, -1692, -1501, -1155, -805, -624, -704, +-922, -1019, -929, -791, -769, -880, -968, -985, -941, -884, -858, -777, -621, -417, -218, -21, +194, 441, 741, 1065, 1469, 1946, 2345, 2522, 2442, 2260, 2028, 1721, 1410, 1117, 805, 490, +226, -69, -485, -919, -1304, -1600, -1748, -1625, -1265, -873, -700, -771, -934, -981, -872, -764, +-787, -859, -909, -912, -899, -885, -874, -818, -657, -492, -337, -156, 80, 302, 516, 817, +1272, 1796, 2211, 2468, 2524, 2412, 2224, 1994, 1683, 1342, 1046, 789, 534, 222, -160, -571, +-1017, -1460, -1724, -1650, -1302, -936, -779, -827, -912, -903, -808, -755, -770, -805, -825, -838, +-864, -883, -870, -782, -670, -559, -443, -230, 1, 143, 313, 631, 1073, 1582, 2058, 2368, +2493, 2492, 2396, 2191, 1886, 1565, 1309, 1049, 764, 475, 148, -259, -769, -1320, -1686, -1654, +-1339, -1050, -918, -896, -915, -870, -797, -753, -779, -796, -786, -808, -894, -930, -868, -787, +-750, -663, -492, -316, -146, -32, 108, 391, 812, 1322, 1819, 2179, 2386, 2505, 2479, 2300, +2046, 1794, 1534, 1255, 966, 731, 482, 84, -522, -1169, -1574, -1600, -1394, -1166, -1050, -997, +-955, -866, -790, -792, -782, -723, -726, -839, -912, -892, -853, -839, -795, -697, -555, -385, +-237, -163, -88, 145, 560, 1057, 1525, 1954, 2273, 2447, 2482, 2377, 2183, 1973, 1705, 1372, +1115, 965, 782, 366, -269, -945, -1409, -1536, -1421, -1282, -1220, -1142, -1007, -940, -919, -860, +-783, -747, -772, -855, -897, -904, -908, -913, -879, -789, -649, -475, -369, -350, -283, -64, +284, 741, 1198, 1673, 2063, 2305, 2387, 2378, 2309, 2121, 1807, 1463, 1249, 1180, 1030, 632, +-4, -714, -1223, -1394, -1426, -1428, -1353, -1207, -1106, -1065, -994, -878, -801, -799, -816, -873, +-916, -919, -929, -961, -966, -857, -696, -547, -480, -480, -433, -245, 41, 422, 891, 1418, +1832, 2097, 2257, 2390, 2414, 2228, 1909, 1592, 1402, 1375, 1299, 904, 255, -404, -903, -1213, +-1394, -1442, -1379, -1285, -1226, -1160, -1064, -948, -870, -837, -841, -878, -886, -877, -931, -1021, +-1016, -888, -720, -608, -562, -560, -512, -415, -226, 123, 627, 1171, 1556, 1858, 2147, 2382, +2477, 2352, 2010, 1685, 1583, 1630, 1534, 1135, 573, -24, -590, -1039, -1288, -1361, -1367, -1323, +-1262, -1205, -1096, -958, -886, -862, -865, -857, -830, -834, -915, -1038, -1024, -894, -750, -659, +-606, -535, -533, -533, -403, -67, 399, 875, 1283, 1606, 1966, 2348, 2540, 2401, 2054, 1805, +1774, 1814, 1719, 1415, 960, 386, -233, -752, -1101, -1272, -1324, -1343, -1335, -1275, -1144, -991, +-921, -921, -887, -823, -775, -803, -908, -1019, -1001, -922, -831, -717, -580, -554, -605, -642, +-540, -245, 197, 653, 996, 1325, 1821, 2306, 2507, 2368, 2107, 1951, 1894, 1918, 1872, 1658, +1283, 751, 127, -440, -849, -1107, -1255, -1347, -1388, -1338, -1203, -1056, -987, -988, -912, -786, +-736, -798, -887, -960, -1009, -977, -867, -726, -597, -559, -644, -735, -684, -376, 19, 354, +632, 1068, 1657, 2153, 2371, 2328, 2165, 2020, 1965, 1989, 1989, 1877, 1566, 1085, 474, -125, +-570, -895, -1146, -1311, -1412, -1386, -1252, -1141, -1124, -1054, -921, -818, -794, -795, -850, -954, +-1028, -1030, -953, -794, -600, -549, -710, -855, -744, -485, -235, -20, 287, 769, 1385, 1924, +2203, 2250, 2167, 2044, 1976, 2010, 2055, 2020, 1787, 1350, 789, 204, -270, -652, -994, -1283, +-1388, -1360, -1309, -1252, -1179, -1115, -1002, -892, -826, -814, -848, -916, -1022, -1110, -1037, -792, +-576, -622, -802, -870, -750, -582, -448, -297, 4, 491, 1091, 1652, 2002, 2152, 2157, 2040, +1969, 2011, 2089, 2109, 1974, 1601, 1074, 565, 108, -388, -850, -1157, -1307, -1366, -1361, -1315, +-1273, -1209, -1084, -967, -916, -862, -804, -873, -1087, -1191, -1046, -778, -629, -707, -851, -877, +-769, -668, -628, -535, -262, 195, 748, 1330, 1781, 2014, 2053, 2016, 1945, 1966, 2101, 2188, +2056, 1744, 1352, 907, 404, -131, -615, -975, -1206, -1330, -1393, -1405, -1358, -1254, -1153, -1108, +-1012, -849, -767, -933, -1171, -1224, -1037, -810, -720, -781, -861, -847, -765, -736, -757, -700, +-507, -134, 425, 1027, 1502, 1832, 1978, 1942, 1887, 1980, 2151, 2213, 2138, 1947, 1649, 1238, +748, 225, -332, -757, -1025, -1235, -1397, -1429, -1357, -1300, -1287, -1239, -1046, -815, -768, -953, +-1159, -1192, -1017, -846, -810, -845, -872, -840, -783, -752, -806, -820, -674, -346, 113, 696, +1270, 1674, 1836, 1853, 1875, 1975, 2113, 2210, 2209, 2102, 1896, 1587, 1143, 582, 41, -396, +-763, -1100, -1312, -1332, -1295, -1343, -1395, -1301, -1052, -826, -788, -967, -1125, -1081, -950, -841, +-797, -822, -850, -809, -738, -763, -834, -846, -770, -575, -167, 436, 1035, 1457, 1688, 1797, +1860, 1974, 2135, 2236, 2260, 2234, 2136, 1879, 1440, 937, 463, -10, -506, -906, -1098, -1157, +-1208, -1354, -1426, -1271, -993, -826, -846, -975, -1074, -1051, -926, -826, -824, -821, -785, -727, +-694, -715, -746, -807, -854, -748, -383, 176, 756, 1237, 1505, 1662, 1790, 1957, 2114, 2198, +2274, 2369, 2333, 2086, 1725, 1341, 876, 328, -243, -683, -880, -969, -1166, -1393, -1430, -1256, +-1020, -871, -859, -988, -1054, -992, -898, -852, -852, -795, -756, -733, -682, -636, -688, -808, +-918, -887, -598, -83, 500, 979, 1267, 1510, 1719, 1892, 1996, 2110, 2266, 2393, 2373, 2196, +1969, 1689, 1251, 623, 9, -380, -619, -857, -1141, -1388, -1463, -1306, -1068, -937, -956, -1036, +-1044, -1001, -971, -917, -866, -833, -823, -781, -689, -629, -682, -816, -975, -1041, -828, -343, +179, 603, 987, 1326, 1568, 1719, 1845, 2014, 2216, 2342, 2319, 2222, 2165, 1965, 1497, 867, +334, -71, -377, -696, -1070, -1399, -1490, -1325, -1119, -1046, -1044, -1062, -1088, -1072, -1022, -960, +-916, -911, -880, -828, -725, -621, -619, -798, -1031, -1108, -938, -581, -157, 275, 713, 1118, +1365, 1492, 1667, 1937, 2131, 2212, 2233, 2294, 2332, 2166, 1728, 1147, 629, 248, -74, -489, +-973, -1331, -1433, -1344, -1210, -1125, -1078, -1092, -1139, -1109, -1041, -1000, -973, -942, -946, -925, +-770, -605, -612, -805, -1020, -1123, -1043, -806, -462, -10, 494, 877, 1084, 1282, 1564, 1828, +1960, 2043, 2151, 2304, 2422, 2322, 1919, 1401, 963, 631, 252, -243, -771, -1176, -1380, -1392, +-1278, -1192, -1159, -1171, -1180, -1160, -1100, -1008, -959, -996, -1024, -965, -780, -607, -633, -815, +-1001, -1087, -1122, -1037, -728, -239, 231, 556, 815, 1112, 1451, 1689, 1808, 1882, 2046, 2283, +2467, 2374, 2025, 1619, 1289, 967, 534, 17, -511, -991, -1276, -1338, -1302, -1253, -1190, -1191, +-1251, -1256, -1153, -1046, -1022, -1081, -1135, -1024, -797, -659, -682, -773, -883, -1046, -1221, -1178, +-879, -464, -85, 232, 525, 888, 1262, 1510, 1607, 1706, 1941, 2269, 2454, 2378, 2139, 1855, +1552, 1245, 847, 313, -274, -774, -1126, -1301, -1334, -1260, -1202, -1223, -1293, -1284, -1157, -1049, +-1067, -1184, -1174, -1023, -866, -773, -709, -696, -806, -1037, -1241, -1227, -991, -672, -351, -46, +287, 707, 1111, 1314, 1380, 1545, 1856, 2177, 2388, 2402, 2232, 1996, 1795, 1553, 1150, 648, +92, -454, -913, -1186, -1251, -1231, -1207, -1266, -1367, -1309, -1133, -1075, -1153, -1179, -1138, -1055, +-957, -823, -681, -626, -743, -1009, -1233, -1272, -1085, -839, -621, -347, 67, 547, 903, 1089, +1210, 1398, 1700, 2067, 2300, 2339, 2266, 2143, 1999, 1795, 1448, 977, 457, -127, -655, -1010, +-1104, -1101, -1192, -1327, -1353, -1248, -1151, -1140, -1156, -1158, -1130, -1098, -1011, -837, -641, -543, +-640, -911, -1143, -1152, -1046, -962, -840, -523, -94, 355, 731, 941, 1062, 1267, 1619, 1981, +2222, 2329, 2311, 2278, 2208, 2039, 1765, 1390, 881, 216, -386, -726, -865, -1012, -1186, -1280, +-1271, -1200, -1152, -1130, -1115, -1091, -1102, -1114, -1062, -868, -603, -482, -613, -834, -975, -1011, +-1016, -1027, -950, -686, -242, 229, 582, 765, 895, 1149, 1503, 1867, 2131, 2282, 2361, 2385, +2322, 2211, 2077, 1794, 1259, 583, 11, -339, -616, -897, -1094, -1170, -1201, -1196, -1162, -1131, +-1095, -1037, -1083, -1185, -1114, -852, -579, -505, -591, -717, -835, -902, -996, -1100, -1095, -850, +-425, 29, 365, 555, 718, 993, 1347, 1669, 1939, 2193, 2338, 2338, 2303, 2331, 2301, 2027, +1499, 904, 395, -27, -396, -717, -967, -1094, -1150, -1211, -1247, -1168, -1053, -1048, -1194, -1294, +-1196, -930, -684, -588, -611, -684, -741, -817, -978, -1162, -1220, -1016, -626, -205, 79, 283, +511, 787, 1078, 1394, 1752, 2077, 2185, 2193, 2288, 2444, 2430, 2174, 1736, 1215, 716, 263, +-176, -582, -845, -976, -1129, -1275, -1269, -1132, -1056, -1107, -1240, -1326, -1238, -996, -791, -720, +-696, -669, -671, -726, -911, -1170, -1273, -1090, -747, -431, -151, 113, 352, 547, 803, 1183, +1594, 1877, 1985, 2095, 2286, 2486, 2535, 2355, 1998, 1579, 1118, 591, 80, -309, -589, -838, +-1084, -1238, -1235, -1108, -1039, -1130, -1267, -1329, -1241, -1044, -868, -798, -758, -663, -578, -640, +-882, -1165, -1269, -1144, -930, -661, -326, -25, 140, 310, 618, 1034, 1409, 1657, 1803, 1960, +2211, 2463, 2531, 2399, 2195, 1880, 1397, 848, 385, -2, -336, -683, -1005, -1201, -1197, -1093, +-1085, -1188, -1324, -1377, -1294, -1109, -986, -943, -847, -644, -502, -590, -834, -1054, -1190, -1233, +-1096, -805, -481, -237, -89, 87, 413, 838, 1209, 1428, 1586, 1836, 2148, 2370, 2485, 2502, +2418, 2131, 1661, 1148, 713, 347, -52, -485, -877, -1087, -1096, -1031, -1049, -1167, -1303, -1336, +-1231, -1103, -1098, -1065, -880, -631, -537, -582, -707, -917, -1159, -1261, -1154, -909, -611, -394, +-289, -99, 261, 668, 937, 1147, 1400, 1678, 1962, 2203, 2392, 2550, 2545, 2300, 1869, 1425, +1052, 678, 221, -275, -720, -982, -1031, -1000, -1070, -1239, -1355, -1310, -1221, -1222, -1237, -1145, +-942, -745, -619, -562, -647, -861, -1122, -1285, -1231, -988, -748, -629, -499, -263, 86, 424, +677, 921, 1190, 1467, 1717, 1995, 2293, 2550, 2601, 2409, 2033, 1663, 1341, 968, 512, -15, +-523, -820, -866, -911, -1102, -1278, -1300, -1252, -1280, -1311, -1294, -1221, -1069, -864, -697, -589, +-561, -762, -1085, -1249, -1182, -1031, -912, -805, -656, -397, -86, 190, 443, 735, 1023, 1256, +1485, 1805, 2190, 2493, 2609, 2490, 2216, 1897, 1617, 1307, 816, 197, -310, -565, -699, -893, +-1098, -1211, -1241, -1250, -1278, -1330, -1346, -1283, -1177, -1010, -778, -570, -545, -770, -1046, -1182, +-1145, -1081, -1045, -948, -771, -541, -288, -37, 235, 544, 786, 979, 1208, 1556, 1977, 2342, +2552, 2501, 2280, 2081, 1927, 1609, 1046, 452, 9, -320, -585, -833, -1068, -1193, -1221, -1262, +-1337, -1355, -1352, -1373, -1324, -1145, -837, -592, -588, -792, -999, -1106, -1138, -1161, -1149, -1051, +-883, -708, -511, -238, 78, 358, 566, 741, 958, 1276, 1735, 2189, 2420, 2382, 2302, 2275, +2139, 1803, 1307, 791, 358, -18, -377, -697, -926, -1073, -1180, -1272, -1323, -1308, -1358, -1452, +-1451, -1202, -860, -650, -614, -735, -869, -957, -1064, -1146, -1155, -1071, -969, -853, -652, -371, +-78, 214, 454, 596, 724, 1099, 1641, 2039, 2240, 2338, 2389, 2421, 2340, 2027, 1569, 1143, +731, 284, -134, -458, -707, -915, -1109, -1211, -1218, -1239, -1361, -1508, -1494, -1255, -943, -749, +-687, -695, -773, -904, -1031, -1104, -1102, -1089, -1049, -945, -792, -575, -223, 125, 266, 306, +497, 903, 1395, 1787, 2017, 2204, 2390, 2506, 2451, 2185, 1836, 1471, 1049, 564, 134, -197, +-511, -822, -1047, -1121, -1136, -1200, -1384, -1541, -1513, -1272, -1011, -836, -699, -655, -737, -857, +-950, -1052, -1115, -1082, -1033, -1038, -960, -654, -283, 4, 111, 159, 351, 775, 1202, 1532, +1806, 2101, 2380, 2538, 2506, 2356, 2130, 1792, 1352, 908, 510, 142, -250, -627, -871, -947, +-989, -1140, -1372, -1501, -1486, -1345, -1138, -904, -731, -682, -695, -748, -879, -987, -995, -1000, +-1068, -1147, -1062, -753, -388, -164, -87, -13, 212, 591, 959, 1247, 1580, 1961, 2275, 2452, +2521, 2474, 2294, 1970, 1562, 1170, 810, 409, -82, -508, -728, -807, -937, -1129, -1307, -1479, +-1570, -1465, -1251, -1069, -882, -724, -719, -820, -923, -965, -945, -984, -1139, -1272, -1173, -859, +-541, -381, -311, -174, 58, 340, 630, 941, 1306, 1715, 2036, 2270, 2460, 2528, 2392, 2113, +1789, 1491, 1158, 659, 129, -252, -506, -693, -837, -1017, -1252, -1461, -1550, -1501, -1357, -1157, +-918, -737, -716, -820, -886, -846, -821, -927, -1154, -1305, -1176, -889, -646, -518, -398, -230, +-33, 189, 442, 787, 1155, 1528, 1849, 2156, 2447, 2576, 2456, 2242, 2086, 1845, 1449, 993, +509, 68, -239, -429, -612, -856, -1111, -1332, -1470, -1514, -1440, -1233, -959, -764, -764, -835, +-822, -719, -705, -876, -1135, -1257, -1151, -960, -799, -668, -512, -351, -205, -31, 221, 572, +945, 1249, 1594, 2019, 2350, 2454, 2416, 2341, 2220, 2018, 1712, 1282, 784, 323, 0, -218, +-458, -727, -966, -1195, -1421, -1577, -1564, -1346, -1053, -871, -880, -906, -816, -672, -686, -884, +-1083, -1174, -1137, -1025, -906, -768, -581, -435, -374, -228, 57, 355, 616, 968, 1397, 1825, +2167, 2364, 2417, 2415, 2369, 2248, 2003, 1583, 1087, 634, 289, 12, -258, -526, -747, -1024, +-1342, -1584, -1597, -1368, -1097, -968, -968, -927, -768, -656, -705, -861, -1036, -1116, -1137, -1113, +-995, -798, -657, -591, -501, -320, -108, 99, 354, 708, 1123, 1554, 1934, 2185, 2293, 2364, +2426, 2386, 2169, 1806, 1358, 924, 541, 203, -102, -328, -538, -865, -1299, -1595, -1610, -1417, +-1242, -1152, -1100, -999, -801, -687, -750, -863, -968, -1095, -1215, -1180, -1028, -894, -807, -728, +-622, -488, -320, -141, 94, 408, 824, 1277, 1684, 1958, 2133, 2288, 2420, 2440, 2274, 1948, +1577, 1166, 745, 347, 66, -93, -317, -720, -1186, -1497, -1548, -1453, -1354, -1319, -1224, -1038, +-871, -800, -782, -812, -921, -1100, -1206, -1164, -1061, -979, -899, -797, -702, -583, -454, -336, +-172, 128, 561, 1006, 1406, 1705, 1944, 2181, 2390, 2453, 2339, 2133, 1856, 1425, 928, 526, +289, 133, -116, -566, -1088, -1384, -1451, -1479, -1493, -1424, -1270, -1127, -1003, -887, -786, -799, +-929, -1088, -1183, -1188, -1140, -1074, -1001, -899, -784, -669, -571, -502, -368, -88, 322, 732, +1105, 1411, 1717, 2057, 2300, 2373, 2378, 2320, 2083, 1653, 1146, 747, 580, 436, 100, -406, +-858, -1153, -1345, -1490, -1531, -1471, -1361, -1257, -1099, -907, -803, -805, -894, -1027, -1136, -1159, +-1140, -1102, -1050, -947, -820, -718, -660, -637, -542, -268, 131, 498, 830, 1202, 1574, 1900, +2146, 2307, 2419, 2481, 2311, 1855, 1344, 1047, 889, 662, 303, -114, -532, -900, -1194, -1379, +-1451, -1459, -1419, -1314, -1145, -941, -814, -782, -834, -944, -1055, -1090, -1092, -1094, -1042, -943, +-797, -682, -683, -730, -633, -391, -86, 236, 578, 982, 1394, 1714, 1928, 2173, 2454, 2603, +2431, 2014, 1617, 1364, 1146, 862, 528, 147, -286, -706, -1023, -1241, -1381, -1460, -1452, -1368, +-1210, -1008, -848, -786, -811, -908, -1009, -1064, -1091, -1142, -1118, -946, -784, -731, -753, -769, +-698, -514, -278, -31, 323, 780, 1173, 1409, 1672, 2040, 2421, 2583, 2464, 2174, 1869, 1610, +1357, 1100, 793, 412, -29, -468, -818, -1092, -1304, -1436, -1492, -1453, -1297, -1082, -894, -800, +-815, -881, -940, -1016, -1124, -1187, -1124, -976, -817, -769, -808, -804, -727, -619, -497, -267, +143, 598, 891, 1107, 1447, 1906, 2296, 2497, 2484, 2310, 2057, 1803, 1567, 1328, 1037, 685, +270, -175, -555, -877, -1168, -1363, -1472, -1495, -1375, -1140, -948, -863, -831, -822, -875, -971, +-1102, -1198, -1122, -947, -828, -824, -819, -761, -737, -767, -703, -427, -3, 354, 592, 853, +1238, 1708, 2115, 2393, 2476, 2389, 2196, 1979, 1766, 1543, 1284, 935, 524, 110, -286, -645, +-951, -1224, -1439, -1515, -1409, -1202, -1039, -920, -838, -772, -787, -926, -1103, -1184, -1090, -961, +-910, -875, -778, -697, -762, -867, -784, -501, -159, 121, 351, 618, 994, 1459, 1918, 2261, +2434, 2416, 2269, 2118, 1955, 1746, 1509, 1221, 831, 398, 12, -338, -717, -1078, -1354, -1482, +-1441, -1278, -1141, -1023, -859, -716, -745, -921, -1068, -1080, -1042, -1026, -997, -891, -746, -715, +-839, -927, -843, -613, -348, -94, 104, 373, 731, 1187, 1669, 2077, 2317, 2373, 2334, 2211, +2062, 1911, 1730, 1451, 1081, 684, 317, -63, -479, -896, -1227, -1399, -1406, -1341, -1269, -1112, +-874, -728, -800, -935, -1003, -1013, -1066, -1099, -1040, -868, -733, -727, -854, -939, -877, -703, +-501, -279, -82, 120, 453, 918, 1417, 1849, 2171, 2340, 2343, 2277, 2192, 2090, 1921, 1661, +1318, 948, 594, 238, -217, -686, -1022, -1209, -1341, -1418, -1347, -1110, -860, -768, -830, -877, +-904, -972, -1092, -1130, -1031, -855, -728, -740, -835, -902, -877, -745, -561, -404, -272, -88, +225, 656, 1129, 1610, 2008, 2219, 2290, 2291, 2269, 2215, 2096, 1866, 1545, 1237, 928, 523, +29, -435, -750, -1031, -1318, -1459, -1370, -1144, -957, -876, -848, -822, -832, -947, -1108, -1151, +-1034, -894, -785, -756, -839, -929, -900, -794, -666, -549, -422, -261, -21, 357, 842, 1351, +1787, 2060, 2176, 2220, 2273, 2277, 2162, 1956, 1726, 1507, 1207, 758, 280, -107, -474, -891, +-1262, -1419, -1374, -1223, -1076, -977, -869, -780, -816, -954, -1105, -1152, -1079, -923, -796, -784, +-856, -917, -904, -839, -748, -630, -530, -438, -252, 62, 525, 1057, 1540, 1855, 2004, 2146, +2285, 2297, 2183, 2056, 1942, 1721, 1368, 967, 577, 205, -218, -730, -1157, -1354, -1359, -1319, +-1225, -1071, -902, -815, -828, -966, -1128, -1182, -1110, -970, -870, -844, -901, -953, -953, -899, +-818, -735, -659, -599, -493, -238, 221, 772, 1229, 1540, 1782, 2049, 2202, 2194, 2159, 2133, +2068, 1862, 1535, 1193, 892, 522, 20, -523, -948, -1218, -1351, -1386, -1330, -1163, -980, -839, +-818, -951, -1124, -1187, -1135, -1017, -915, -885, -918, -950, -951, -917, -871, -776, -699, -718, +-699, -449, 13, 484, 898, 1282, 1636, 1924, 2079, 2118, 2162, 2232, 2197, 1978, 1704, 1476, +1213, 823, 318, -209, -688, -1015, -1242, -1358, -1365, -1227, -1005, -849, -818, -920, -1074, -1162, +-1119, -1029, -947, -898, -896, -919, -947, -943, -851, -714, -720, -813, -792, -568, -214, 173, +591, 1047, 1467, 1771, 1913, 2035, 2196, 2296, 2242, 2075, 1904, 1739, 1485, 1114, 634, 110, +-370, -764, -1101, -1316, -1377, -1254, -1045, -871, -795, -889, -1050, -1123, -1102, -1057, -997, -903, +-869, -946, -1012, -945, -798, -717, -773, -858, -855, -673, -438, -146, 285, 801, 1218, 1489, +1705, 1936, 2139, 2246, 2228, 2140, 2024, 1904, 1718, 1380, 933, 460, -34, -506, -934, -1245, +-1383, -1313, -1116, -914, -838, -902, -995, -1064, -1106, -1093, -978, -866, -881, -984, -1022, -907, +-782, -755, -820, -860, -833, -767, -651, -373, 90, 578, 962, 1263, 1549, 1833, 2064, 2198, +2217, 2169, 2121, 2074, 1919, 1614, 1240, 808, 318, -179, -663, -1090, -1329, -1299, -1128, -995, +-921, -883, -935, -1062, -1143, -1091, -946, -853, -914, -1027, -1010, -879, -792, -796, -813, -811, +-849, -884, -810, -555, -157, 300, 687, 1014, 1360, 1696, 1957, 2105, 2156, 2176, 2196, 2185, +2068, 1842, 1508, 1116, 686, 191, -387, -897, -1166, -1219, -1161, -1048, -913, -836, -906, -1070, +-1151, -1064, -899, -858, -948, -1004, -946, -873, -845, -801, -740, -743, -840, -918, -889, -686, +-325, 73, 433, 770, 1174, 1554, 1836, 1998, 2105, 2164, 2220, 2272, 2213, 2010, 1747, 1478, +1082, 531, -81, -611, -948, -1127, -1169, -1069, -889, -799, -903, -1066, -1098, -992, -906, -901, +-934, -946, -925, -888, -850, -768, -695, -706, -824, -950, -958, -785, -497, -168, 149, 517, +944, 1343, 1655, 1882, 1999, 2095, 2223, 2310, 2245, 2104, 1969, 1760, 1383, 855, 272, -283, +-730, -1045, -1167, -1049, -870, -838, -971, -1069, -1047, -1005, -978, -959, -942, -960, -967, -961, +-902, -784, -673, -686, -841, -986, -994, -895, -704, -430, -118, 231, 651, 1098, 1436, 1644, +1829, 2018, 2167, 2229, 2219, 2163, 2120, 1950, 1603, 1138, 622, 61, -524, -952, -1081, -1001, +-901, -908, -985, -1036, -1047, -1028, -1007, -974, -928, -958, -1001, -1021, -945, -768, -651, -697, +-842, -958, -1012, -967, -827, -635, -398, -45, 416, 853, 1169, 1416, 1672, 1912, 2068, 2138, +2170, 2224, 2233, 2078, 1800, 1471, 1016, 386, -285, -742, -924, -950, -933, -947, -999, -1042, +-1059, -1070, -1074, -1023, -951, -976, -1078, -1087, -982, -819, -709, -712, -843, -985, -1038, -1006, +-947, -854, -665, -308, 135, 534, 857, 1167, 1500, 1761, 1896, 1991, 2115, 2209, 2201, 2092, +1963, 1733, 1303, 653, -7, -509, -787, -895, -942, -969, -1007, -1040, -1088, -1151, -1125, -1024, +-994, -1051, -1142, -1147, -1055, -878, -728, -733, -864, -968, -1008, -1016, -1050, -1022, -850, -524, +-142, 204, 546, 940, 1313, 1553, 1714, 1899, 2073, 2148, 2156, 2151, 2131, 1984, 1596, 993, +324, -214, -550, -756, -885, -909, -921, -1011, -1100, -1132, -1089, -1010, -994, -1046, -1144, -1172, +-1062, -874, -730, -731, -826, -884, -898, -972, -1073, -1075, -902, -660, -390, -72, 339, 770, +1102, 1351, 1591, 1844, 2009, 2094, 2154, 2242, 2296, 2222, 1891, 1330, 716, 171, -280, -588, +-731, -768, -844, -960, -1052, -1092, -1057, -971, -940, -1028, -1148, -1172, -1046, -877, -765, -755, +-767, -751, -785, -924, -1048, -1042, -931, -809, -621, -283, 146, 542, 863, 1164, 1461, 1738, +1933, 2017, 2104, 2267, 2415, 2385, 2118, 1687, 1111, 512, -11, -354, -535, -639, -751, -889, +-1002, -1054, -996, -905, -889, -995, -1147, -1164, -1041, -908, -845, -788, -707, -670, -751, -885, +-961, -963, -973, -937, -755, -444, -76, 273, 612, 936, 1307, 1611, 1778, 1878, 2042, 2273, +2435, 2472, 2348, 1997, 1462, 855, 306, -115, -361, -504, -655, -849, -1005, -1043, -965, -851, +-884, -1044, -1150, -1126, -1048, -1015, -958, -822, -696, -715, -773, -840, -906, -965, -1018, -1026, +-896, -614, -294, -11, 306, 708, 1098, 1375, 1571, 1716, 1905, 2143, 2358, 2493, 2467, 2214, +1744, 1171, 598, 145, -135, -330, -547, -812, -1015, -1025, -908, -856, -925, -1060, -1104, -1088, +-1122, -1117, -997, -851, -760, -739, -760, -797, -835, -926, -1053, -1092, -968, -753, -532, -282, +67, 480, 856, 1161, 1388, 1552, 1747, 2008, 2258, 2457, 2538, 2400, 2009, 1473, 901, 427, +130, -88, -395, -740, -956, -932, -852, -881, -950, -997, -1048, -1106, -1158, -1144, -1041, -893, +-814, -804, -766, -731, -784, -915, -1053, -1079, -997, -893, -749, -520, -183, 218, 603, 929, +1173, 1366, 1558, 1809, 2108, 2373, 2546, 2528, 2247, 1739, 1168, 729, 434, 125, -287, -669, +-839, -878, -884, -900, -919, -965, -1031, -1120, -1199, -1188, -1072, -969, -937, -890, -769, -717, +-802, -929, -1020, -1070, -1046, -990, -902, -714, -412, -44, 333, 695, 960, 1146, 1335, 1594, +1898, 2222, 2511, 2626, 2398, 1912, 1445, 1106, 757, 340, -108, -475, -697, -808, -857, -897, +-882, -885, -975, -1112, -1176, -1149, -1070, -1041, -1005, -896, -770, -719, -760, -869, -944, -987, +-1028, -1031, -980, -838, -593, -237, 142, 494, 781, 992, 1189, 1407, 1686, 2094, 2538, 2705, +2489, 2128, 1788, 1451, 1068, 620, 163, -221, -489, -681, -821, -835, -795, -827, -973, -1091, +-1099, -1088, -1093, -1076, -1048, -925, -784, -731, -767, -812, -881, -938, -994, -1028, -1027, -958, +-745, -427, -82, 264, 605, 866, 991, 1124, 1453, 1957, 2415, 2621, 2536, 2301, 2054, 1756, +1357, 901, 460, 70, -293, -586, -743, -747, -741, -816, -948, -1037, -1043, -1049, -1093, -1114, +-1058, -942, -825, -760, -756, -789, -836, -873, -925, -1000, -1083, -1033, -848, -621, -325, 85, +480, 696, 763, 904, 1265, 1785, 2259, 2504, 2520, 2429, 2282, 2005, 1613, 1217, 810, 354, +-87, -430, -605, -656, -702, -807, -920, -960, -988, -1047, -1113, -1138, -1097, -1001, -875, -783, +-766, -802, -800, -813, -908, -1018, -1068, -1050, -993, -850, -534, -88, 305, 478, 523, 665, +1032, 1556, 2014, 2288, 2440, 2483, 2367, 2126, 1827, 1487, 1099, 617, 127, -224, -432, -558, +-671, -782, -877, -924, -972, -1044, -1109, -1158, -1160, -1071, -931, -858, -831, -787, -743, -798, +-895, -959, -1006, -1083, -1136, -1026, -709, -256, 121, 264, 305, 489, 869, 1320, 1742, 2118, +2380, 2491, 2436, 2274, 2071, 1805, 1415, 900, 397, 36, -206, -412, -575, -685, -782, -850, +-879, -942, -1052, -1134, -1101, -1028, -960, -896, -809, -733, -712, -767, -814, -838, -906, -1050, +-1200, -1134, -799, -363, -51, 74, 173, 359, 671, 1040, 1475, 1917, 2252, 2407, 2429, 2385, +2278, 2056, 1681, 1188, 720, 330, -1, -236, -422, -601, -733, -774, -820, -938, -1067, -1103, +-1077, -1057, -1026, -922, -816, -748, -754, -783, -771, -725, -803, -1059, -1269, -1198, -885, -513, +-257, -105, 34, 208, 444, 780, 1220, 1699, 2065, 2257, 2348, 2434, 2414, 2221, 1906, 1463, +992, 589, 261, -35, -305, -522, -617, -666, -774, -914, -1010, -1061, -1103, -1120, -1086, -977, +-860, -814, -844, -817, -692, -630, -769, -1079, -1290, -1232, -998, -722, -465, -288, -137, 2, +178, 486, 966, 1442, 1783, 2036, 2245, 2392, 2439, 2345, 2081, 1659, 1213, 855, 500, 113, +-205, -401, -523, -639, -760, -890, -977, -1022, -1107, -1180, -1126, -1003, -922, -941, -964, -847, +-653, -592, -773, -1063, -1268, -1257, -1099, -893, -648, -415, -294, -222, -53, 264, 684, 1126, +1496, 1803, 2064, 2289, 2447, 2434, 2184, 1825, 1477, 1126, 729, 317, -19, -241, -402, -565, +-720, -818, -899, -1011, -1154, -1224, -1128, -994, -989, -1069, -1037, -866, -655, -588, -749, -1011, +-1192, -1261, -1210, -1012, -739, -522, -452, -375, -202, 61, 424, 869, 1244, 1556, 1882, 2225, +2442, 2456, 2307, 2050, 1752, 1408, 982, 577, 246, 12, -218, -447, -592, -661, -761, -953, +-1122, -1137, -1034, -947, -1000, -1104, -1049, -828, -619, -557, -649, -833, -1052, -1206, -1197, -1010, +-786, -634, -545, -482, -369, -99, 277, 655, 998, 1350, 1748, 2144, 2414, 2504, 2450, 2294, +2037, 1686, 1270, 884, 568, 279, -49, -287, -380, -466, -644, -873, -1044, -1026, -917, -916, +-1041, -1141, -1037, -845, -660, -526, -530, -728, -985, -1143, -1159, -1047, -841, -674, -638, -611, +-482, -239, 71, 387, 687, 1067, 1527, 1950, 2250, 2420, 2475, 2425, 2203, 1854, 1503, 1189, +844, 456, 97, -130, -221, -331, -592, -879, -1011, -961, -909, -978, -1093, -1149, -1105, -965, +-746, -563, -552, -693, -920, -1124, -1184, -1074, -910, -793, -777, -752, -618, -387, -146, 114, +404, 782, 1263, 1703, 2017, 2281, 2476, 2469, 2282, 2011, 1746, 1459, 1089, 644, 261, 68, +-22, -212, -565, -822, -885, -887, -918, -965, -1072, -1197, -1191, -1052, -839, -631, -541, -636, +-864, -1087, -1164, -1074, -944, -878, -885, -867, -745, -539, -368, -171, 128, 525, 960, 1378, +1766, 2135, 2398, 2441, 2306, 2122, 1954, 1695, 1273, 786, 452, 298, 114, -163, -485, -727, +-852, -877, -890, -963, -1106, -1229, -1282, -1187, -987, -735, -582, -654, -883, -1073, -1149, -1088, +-979, -958, -1005, -964, -835, -714, -614, -429, -136, 228, 615, 1039, 1496, 1944, 2254, 2337, +2270, 2234, 2163, 1879, 1421, 1019, 730, 514, 289, -9, -346, -615, -755, -806, -839, -908, +-1046, -1209, -1312, -1268, -1057, -785, -603, -642, -847, -1033, -1072, -1012, -981, -1003, -1015, -963, +-890, -824, -735, -544, -290, 6, 325, 744, 1295, 1798, 2077, 2194, 2301, 2390, 2324, 2046, +1659, 1285, 1007, 791, 537, 228, -135, -414, -581, -675, -731, -784, -935, -1145, -1292, -1281, +-1095, -800, -616, -645, -827, -936, -958, -950, -973, -976, -962, -945, -924, -918, -846, -657, +-442, -272, 4, 516, 1098, 1538, 1846, 2076, 2297, 2457, 2426, 2196, 1854, 1522, 1260, 1035, +766, 429, 81, -238, -463, -567, -621, -673, -818, -1065, -1288, -1320, -1115, -825, -662, -692, +-794, -857, -891, -924, -953, -943, -902, -893, -949, -959, -827, -676, -611, -511, -213, 296, +835, 1259, 1601, 1934, 2250, 2475, 2519, 2325, 2032, 1773, 1530, 1287, 1029, 699, 323, -25, +-284, -432, -489, -517, -673, -974, -1238, -1257, -1087, -863, -714, -708, -761, -782, -816, -917, +-922, -854, -835, -924, -990, -926, -799, -745, -763, -693, -399, 56, 536, 947, 1310, 1718, +2126, 2414, 2499, 2380, 2157, 1932, 1719, 1506, 1249, 919, 539, 158, -166, -337, -355, -391, +-606, -938, -1206, -1266, -1135, -954, -858, -799, -754, -771, -867, -938, -897, -832, -883, -993, +-1001, -907, -857, -880, -940, -893, -633, -220, 196, 557, 964, 1432, 1892, 2242, 2409, 2369, +2203, 2028, 1852, 1645, 1421, 1147, 741, 278, -57, -220, -245, -290, -524, -899, -1166, -1217, +-1172, -1090, -973, -838, -781, -841, -941, -923, -847, -848, -940, -1012, -982, -877, -850, -942, +-1033, -1014, -799, -463, -123, 236, 652, 1135, 1634, 2046, 2274, 2318, 2262, 2124, 1960, 1827, +1682, 1403, 974, 471, 89, -49, -61, -163, -443, -772, -1009, -1124, -1187, -1153, -995, -839, +-841, -908, -914, -863, -818, -848, -961, -1005, -923, -816, -836, -962, -1067, -1062, -915, -656, +-356, -59, 347, 862, 1382, 1812, 2148, 2295, 2259, 2156, 2054, 1979, 1913, 1679, 1207, 663, +304, 188, 123, -50, -309, -586, -841, -1064, -1188, -1136, -971, -859, -885, -927, -894, -821, +-788, -869, -971, -979, -856, -772, -818, -942, -1061, -1098, -983, -818, -609, -312, 79, 555, +1079, 1580, 1968, 2185, 2221, 2142, 2088, 2121, 2126, 1910, 1410, 886, 568, 402, 237, 68, +-132, -381, -702, -990, -1142, -1098, -976, -908, -964, -985, -883, -784, -806, -906, -983, -964, +-860, -750, -806, -946, -1042, -1081, -1061, -972, -814, -581, -227, 224, 726, 1266, 1745, 2036, +2079, 2025, 2083, 2240, 2272, 2015, 1582, 1150, 818, 550, 353, 202, 46, -219, -594, -922, +-1073, -1039, -967, -987, -1034, -984, -873, -803, -826, -939, -1027, -970, -837, -769, -806, -924, +-1023, -1071, -1087, -1057, -951, -773, -493, -118, 371, 977, 1540, 1839, 1881, 1914, 2080, 2279, +2310, 2137, 1808, 1420, 1037, 722, 505, 386, 248, -53, -487, -810, -944, -979, -995, -1029, +-1075, -1017, -870, -805, -855, -962, -1023, -976, -859, -791, -814, -905, -995, -1067, -1136, -1149, +-1081, -953, -780, -490, 24, 699, 1249, 1531, 1638, 1786, 2008, 2208, 2291, 2216, 1983, 1623, +1202, 855, 678, 603, 424, 72, -328, -661, -818, -892, -984, -1092, -1122, -1028, -881, -826, +-883, -981, -1026, -992, -879, -802, -812, -846, -901, -1022, -1129, -1126, -1074, -1061, -1032, -757, +-209, 446, 978, 1286, 1478, 1681, 1938, 2154, 2290, 2355, 2220, 1848, 1414, 1096, 924, 826, +638, 267, -127, -415, -588, -739, -917, -1067, -1100, -1002, -870, -802, -855, -944, -972, -934, +-879, -821, -762, -752, -852, -1000, -1052, -1013, -1038, -1163, -1206, -964, -448, 172, 677, 1011, +1294, 1567, 1789, 2024, 2262, 2406, 2329, 2003, 1593, 1304, 1162, 1056, 817, 458, 83, -189, +-399, -623, -859, -1047, -1097, -1017, -881, -842, -892, -940, -954, -970, -955, -836, -716, -733, +-862, -966, -952, -927, -1029, -1251, -1354, -1128, -667, -162, 329, 763, 1081, 1330, 1581, 1874, +2199, 2439, 2398, 2101, 1756, 1522, 1389, 1247, 997, 646, 315, 59, -180, -444, -748, -969, +-1028, -957, -889, -865, -868, -873, -944, -1011, -938, -773, -678, -737, -858, -898, -818, -814, +-1009, -1266, -1368, -1223, -882, -440, 44, 508, 840, 1083, 1343, 1705, 2120, 2406, 2415, 2169, +1887, 1690, 1562, 1394, 1155, 829, 524, 290, 50, -287, -644, -881, -971, -988, -955, -885, +-854, -901, -1001, -1054, -971, -787, -728, -826, -891, -833, -761, -803, -1009, -1274, -1423, -1386, +-1168, -768, -264, 212, 533, 759, 1039, 1466, 1927, 2245, 2301, 2152, 1952, 1808, 1689, 1520, +1240, 935, 691, 495, 208, -160, -497, -767, -940, -1027, -1012, -916, -865, -961, -1106, -1104, +-950, -814, -818, -896, -908, -803, -724, -768, -954, -1199, -1403, -1471, -1346, -994, -492, -43, +234, 460, 788, 1267, 1763, 2111, 2222, 2133, 2020, 1965, 1878, 1657, 1395, 1163, 952, 734, +426, 69, -258, -553, -823, -979, -927, -824, -848, -999, -1104, -1041, -888, -814, -866, -906, +-844, -727, -667, -691, -820, -1050, -1331, -1517, -1464, -1143, -678, -289, -40, 189, 533, 1025, +1568, 1953, 2094, 2100, 2105, 2091, 1972, 1770, 1533, 1343, 1163, 919, 623, 329, 5, -390, +-738, -881, -823, -760, -866, -1033, -1089, -1010, -909, -886, -929, -941, -860, -744, -661, -629, +-692, -933, -1284, -1537, -1528, -1260, -868, -523, -307, -126, 244, 790, 1331, 1706, 1918, 2031, +2114, 2144, 2029, 1843, 1680, 1511, 1288, 1064, 859, 615, 228, -240, -609, -747, -714, -742, +-882, -1010, -1039, -970, -923, -935, -963, -952, -880, -789, -662, -538, -559, -802, -1179, -1490, +-1563, -1345, -987, -730, -577, -377, 7, 549, 1058, 1441, 1715, 1956, 2113, 2136, 2065, 1962, +1850, 1648, 1413, 1234, 1117, 869, 430, -66, -421, -563, -613, -715, -879, -993, -994, -968, +-967, -975, -959, -983, -981, -884, -705, -533, -496, -707, -1110, -1457, -1541, -1380, -1121, -940, +-853, -664, -272, 226, 688, 1105, 1493, 1804, 1966, 2021, 2044, 2026, 1888, 1656, 1471, 1406, +1336, 1071, 601, 103, -237, -420, -546, -715, -875, -955, -993, -1012, -994, -976, -1000, -1049, +-1054, -966, -760, -509, -429, -629, -1040, -1401, -1508, -1388, -1214, -1135, -1055, -840, -494, -79, +362, 849, 1305, 1617, 1816, 1966, 2086, 2099, 1933, 1712, 1580, 1578, 1535, 1265, 807, 370, +62, -186, -409, -585, -746, -873, -949, -970, -955, -932, -959, -1056, -1119, -1029, -776, -463, +-326, -515, -922, -1257, -1341, -1288, -1248, -1216, -1128, -964, -705, -365, 81, 610, 1066, 1391, +1643, 1917, 2116, 2138, 1964, 1771, 1720, 1767, 1702, 1431, 1048, 675, 326, 21, -227, -439, +-628, -784, -897, -945, -910, -867, -911, -1045, -1167, -1116, -827, -447, -298, -475, -830, -1081, +-1180, -1244, -1279, -1243, -1179, -1085, -933, -622, -163, 347, 776, 1108, 1445, 1822, 2087, 2093, +1935, 1835, 1840, 1868, 1806, 1614, 1292, 933, 577, 242, -30, -249, -480, -680, -816, -890, +-862, -795, -848, -1055, -1243, -1167, -826, -454, -314, -439, -679, -886, -1053, -1186, -1232, -1209, +-1193, -1193, -1102, -820, -376, 79, 437, 802, 1262, 1722, 1990, 2017, 1940, 1892, 1918, 1950, +1907, 1756, 1501, 1173, 827, 487, 202, -53, -308, -559, -763, -845, -763, -681, -781, -1081, +-1304, -1221, -884, -556, -399, -427, -561, -765, -974, -1109, -1166, -1161, -1223, -1309, -1246, -972, +-598, -258, 74, 501, 1030, 1503, 1795, 1886, 1883, 1902, 1932, 1959, 1963, 1870, 1653, 1366, +1038, 710, 419, 161, -128, -468, -727, -794, -663, -581, -750, -1067, -1276, -1195, -953, -662, +-462, -388, -484, -677, -887, -996, -1022, -1086, -1245, -1364, -1288, -1050, -791, -544, -222, 239, +793, 1291, 1607, 1764, 1837, 1877, 1926, 2000, 2034, 1983, 1836, 1586, 1259, 943, 684, 434, +84, -344, -645, -661, -531, -513, -708, -1019, -1215, -1203, -1035, -777, -517, -359, -427, -644, +-814, -858, -899, -1044, -1250, -1361, -1285, -1130, -976, -803, -496, -31, 514, 1031, 1405, 1612, +1718, 1794, 1882, 1963, 2035, 2050, 1955, 1722, 1409, 1162, 990, 726, 267, -231, -515, -532, +-438, -459, -661, -941, -1145, -1231, -1165, -899, -559, -387, -457, -601, -694, -717, -805, -1005, +-1213, -1301, -1262, -1191, -1132, -1018, -761, -333, 201, 744, 1154, 1428, 1610, 1738, 1816, 1896, +2026, 2122, 2035, 1778, 1536, 1396, 1259, 962, 452, -74, -355, -384, -363, -432, -563, -786, +-1066, -1248, -1204, -940, -630, -483, -524, -587, -587, -592, -719, -934, -1124, -1213, -1215, -1204, +-1206, -1155, -957, -588, -82, 434, 876, 1230, 1475, 1607, 1693, 1832, 2056, 2161, 2071, 1846, +1667, 1618, 1514, 1172, 636, 150, -131, -266, -331, -356, -453, -682, -1019, -1254, -1231, -979, +-726, -614, -596, -577, -528, -550, -685, -887, -1049, -1145, -1183, -1219, -1297, -1330, -1189, -867, +-417, 84, 583, 1001, 1251, 1380, 1498, 1720, 1986, 2093, 1967, 1780, 1731, 1745, 1627, 1290, +819, 365, 11, -193, -273, -270, -343, -630, -1026, -1263, -1243, -1069, -895, -795, -712, -618, +-548, -561, -672, -843, -997, -1088, -1131, -1219, -1361, -1424, -1342, -1137, -787, -286, 273, 723, +988, 1124, 1301, 1627, 1915, 1962, 1864, 1796, 1824, 1850, 1739, 1462, 1052, 580, 150, -114, +-174, -152, -253, -575, -961, -1194, -1209, -1118, -1015, -903, -789, -651, -547, -527, -646, -813, +-938, -1005, -1098, -1204, -1319, -1399, -1416, -1317, -1049, -551, 45, 480, 696, 872, 1166, 1536, +1792, 1850, 1807, 1816, 1889, 1921, 1861, 1695, 1353, 850, 354, 67, 25, 22, -148, -478, +-822, -1045, -1131, -1126, -1072, -992, -876, -693, -535, -521, -624, -724, -808, -900, -1015, -1130, +-1252, -1362, -1474, -1504, -1271, -754, -196, 170, 407, 662, 1031, 1403, 1635, 1741, 1785, 1822, +1876, 1930, 1966, 1900, 1579, 1060, 556, 293, 231, 182, -1, -318, -651, -895, -1004, -1064, +-1097, -1048, -893, -691, -554, -510, -562, -611, -664, -769, -901, -970, -1036, -1226, -1456, -1563, +-1355, -892, -414, -88, 180, 521, 917, 1271, 1520, 1686, 1773, 1807, 1868, 1988, 2120, 2107, +1792, 1279, 827, 563, 445, 369, 197, -119, -455, -674, -846, -989, -1079, -1061, -913, -718, +-587, -545, -518, -515, -582, -718, -809, -803, -867, -1127, -1445, -1563, -1378, -1022, -658, -370, +-57, 321, 704, 1050, 1357, 1589, 1689, 1700, 1775, 1997, 2215, 2220, 1972, 1504, 1053, 774, +644, 525, 309, 20, -277, -503, -704, -917, -1062, -1060, -924, -783, -665, -558, -466, -461, +-580, -708, -704, -651, -763, -1064, -1386, -1502, -1386, -1153, -888, -596, -265, 92, 447, 836, +1229, 1481, 1534, 1546, 1686, 1943, 2196, 2284, 2068, 1668, 1289, 1019, 852, 696, 461, 190, +-60, -298, -570, -832, -1007, -1014, -961, -890, -751, -550, -429, -468, -598, -649, -563, -500, +-644, -962, -1261, -1400, -1378, -1268, -1062, -767, -483, -184, 200, 673, 1091, 1341, 1406, 1431, +1588, 1906, 2192, 2317, 2166, 1828, 1478, 1232, 1058, 851, 600, 376, 159, -114, -446, -721, +-875, -965, -1026, -987, -794, -548, -456, -539, -648, -614, -479, -449, -620, -888, -1132, -1312, +-1404, -1347, -1157, -947, -741, -465, -77, 425, 877, 1128, 1201, 1237, 1407, 1746, 2090, 2268, +2177, 1926, 1659, 1448, 1216, 954, 744, 571, 325, 6, -321, -579, -765, -946, -1087, -1043, +-816, -570, -518, -615, -649, -555, -431, -425, -534, -736, -1005, -1232, -1350, -1331, -1210, -1078, +-944, -707, -292, 222, 688, 972, 1034, 1073, 1267, 1629, 1998, 2177, 2154, 2012, 1851, 1627, +1344, 1107, 956, 781, 502, 169, -111, -343, -603, -898, -1107, -1052, -813, -640, -649, -683, +-649, -563, -462, -397, -453, -632, -889, -1143, -1288, -1296, -1262, -1237, -1188, -993, -599, -64, +439, 736, 802, 850, 1085, 1473, 1824, 2020, 2083, 2062, 1919, 1672, 1397, 1214, 1073, 874, +585, 285, 72, -159, -517, -906, -1096, -1033, -889, -786, -761, -770, -742, -666, -561, -450, +-437, -589, -855, -1104, -1233, -1267, -1288, -1334, -1368, -1243, -879, -334, 165, 445, 526, 635, +903, 1251, 1553, 1801, 1997, 2050, 1942, 1718, 1508, 1376, 1226, 969, 668, 474, 311, 9, +-432, -815, -1015, -1021, -938, -858, -826, -817, -807, -738, -594, -430, -385, -543, -776, -1005, +-1141, -1197, -1253, -1377, -1497, -1434, -1083, -545, -78, 184, 329, 504, 732, 1002, 1303, 1624, +1899, 2001, 1894, 1741, 1652, 1543, 1317, 1036, 820, 692, 512, 168, -289, -670, -908, -994, +-973, -915, -859, -873, -895, -806, -629, -443, -379, -482, -704, -914, -1032, -1065, -1150, -1364, +-1591, -1558, -1219, -761, -347, -41, 175, 375, 568, 774, 1097, 1508, 1827, 1910, 1859, 1826, +1795, 1659, 1404, 1161, 1023, 930, 744, 391, -27, -430, -719, -874, -883, -834, -831, -884, +-903, -818, -634, -433, -315, -375, -582, -763, -812, -823, -970, -1265, -1519, -1533, -1266, -885, +-535, -194, 107, 295, 423, 644, 1019, 1443, 1732, 1851, 1924, 2008, 1999, 1831, 1569, 1373, +1275, 1179, 995, 682, 273, -150, -485, -690, -731, -720, -748, -811, -862, -803, -629, -382, +-234, -315, -510, -610, -611, -627, -810, -1152, -1417, -1455, -1314, -1062, -696, -307, 6, 146, +258, 510, 904, 1280, 1530, 1703, 1893, 2050, 2060, 1890, 1685, 1534, 1435, 1346, 1213, 936, +522, 73, -304, -529, -634, -682, -727, -809, -930, -889, -674, -405, -283, -359, -510, -532, +-472, -519, -744, -1038, -1293, -1443, -1452, -1256, -896, -499, -242, -123, 32, 333, 715, 1027, +1274, 1539, 1810, 2000, 2022, 1894, 1727, 1565, 1462, 1409, 1332, 1095, 697, 262, -118, -411, +-546, -580, -669, -843, -991, -967, -744, -494, -423, -500, -548, -492, -433, -500, -673, -905, +-1179, -1433, -1532, -1385, -1049, -701, -507, -366, -160, 148, 445, 704, 998, 1321, 1632, 1856, +1943, 1898, 1747, 1586, 1514, 1492, 1417, 1234, 896, 446, -2, -310, -455, -518, -655, -892, +-1066, -1009, -787, -607, -576, -601, -559, -484, -461, -501, -588, -781, -1111, -1449, -1593, -1447, +-1167, -914, -744, -561, -311, -33, 194, 435, 752, 1080, 1411, 1718, 1869, 1838, 1727, 1624, +1558, 1554, 1544, 1420, 1115, 668, 195, -124, -259, -356, -607, -921, -1056, -979, -807, -694, +-648, -608, -551, -482, -453, -411, -414, -600, -980, -1338, -1491, -1400, -1223, -1061, -884, -654, +-416, -173, 62, 291, 554, 888, 1286, 1623, 1822, 1854, 1778, 1688, 1628, 1629, 1672, 1628, +1366, 900, 435, 167, 44, -152, -487, -791, -908, -873, -790, -732, -668, -592, -564, -536, +-430, -286, -251, -451, -851, -1184, -1325, -1339, -1271, -1138, -983, -782, -535, -300, -101, 87, +335, 675, 1085, 1453, 1708, 1812, 1794, 1705, 1629, 1656, 1759, 1779, 1502, 1044, 654, 432, +250, -20, -382, -661, -804, -838, -838, -759, -671, -627, -662, -636, -455, -241, -206, -397, +-713, -1028, -1239, -1311, -1303, -1227, -1102, -910, -669, -450, -284, -126, 95, 426, 840, 1230, +1536, 1729, 1746, 1628, 1567, 1674, 1840, 1849, 1583, 1194, 896, 686, 418, 90, -239, -522, +-724, -848, -863, -766, -684, -723, -788, -704, -474, -262, -192, -323, -597, -893, -1133, -1267, +-1334, -1325, -1220, -1045, -812, -600, -441, -314, -104, 196, 556, 976, 1388, 1635, 1646, 1524, +1510, 1680, 1849, 1834, 1605, 1338, 1101, 870, 579, 241, -58, -372, -683, -852, -832, -739, +-761, -851, -910, -820, -578, -342, -230, -307, -517, -795, -1028, -1213, -1340, -1384, -1327, -1165, +-961, -790, -656, -515, -354, -127, 223, 700, 1192, 1458, 1448, 1389, 1462, 1653, 1798, 1771, +1635, 1457, 1264, 992, 705, 447, 135, -258, -614, -771, -760, -722, -776, -893, -968, -892, +-671, -423, -278, -281, -445, -668, -887, -1111, -1314, -1412, -1359, -1228, -1069, -903, -734, -609, +-516, -382, -29, 518, 1004, 1238, 1261, 1282, 1430, 1623, 1714, 1740, 1710, 1589, 1385, 1157, +964, 721, 356, -103, -474, -651, -675, -692, -786, -915, -1005, -948, -741, -472, -290, -258, +-338, -482, -710, -984, -1218, -1340, -1332, -1277, -1176, -976, -770, -692, -683, -574, -200, 353, +827, 1039, 1128, 1259, 1416, 1546, 1656, 1758, 1774, 1655, 1492, 1359, 1215, 972, 595, 127, +-256, -437, -513, -565, -675, -852, -1005, -980, -786, -550, -364, -253, -237, -326, -553, -841, +-1061, -1198, -1283, -1297, -1183, -953, -768, -766, -838, -743, -350, 156, 563, 836, 1034, 1191, +1330, 1480, 1651, 1782, 1793, 1689, 1567, 1507, 1410, 1170, 783, 336, -56, -291, -378, -450, +-601, -802, -968, -989, -849, -671, -495, -309, -213, -277, -474, -712, -915, -1109, -1288, -1344, +-1195, -933, -816, -910, -991, -867, -541, -131, 270, 627, 857, 1018, 1175, 1358, 1579, 1729, +1731, 1659, 1624, 1614, 1535, 1336, 984, 525, 122, -127, -238, -349, -541, -767, -929, -994, +-957, -821, -600, -374, -232, -269, -396, -551, -756, -1043, -1324, -1364, -1180, -974, -937, -1012, +-1055, -970, -731, -377, 33, 394, 654, 811, 990, 1250, 1491, 1615, 1631, 1603, 1606, 1649, +1638, 1499, 1172, 714, 321, 82, -66, -236, -455, -663, -857, -991, -1025, -925, -695, -448, +-319, -312, -310, -373, -614, -995, -1272, -1287, -1139, -1010, -987, -1054, -1112, -1067, -913, -594, +-173, 184, 421, 613, 842, 1123, 1377, 1520, 1561, 1569, 1604, 1695, 1756, 1629, 1306, 893, +538, 285, 101, -102, -314, -498, -710, -922, -1032, -939, -717, -548, -443, -307, -171, -213, +-512, -905, -1150, -1175, -1078, -978, -932, -965, -1058, -1107, -990, -688, -299, 34, 258, 467, +733, 1039, 1309, 1502, 1553, 1562, 1648, 1815, 1908, 1821, 1540, 1173, 852, 591, 321, 103, +-60, -247, -536, -824, -919, -826, -717, -614, -456, -227, -34, -62, -341, -701, -940, -1038, +-1008, -912, -866, -911, -1039, -1105, -997, -732, -409, -129, 117, 337, 608, 940, 1248, 1427, +1465, 1502, 1634, 1849, 1975, 1912, 1700, 1426, 1128, 800, 515, 338, 176, -85, -426, -696, +-783, -788, -787, -740, -538, -233, -22, -15, -216, -511, -803, -963, -958, -850, -797, -876, +-1032, -1112, -1057, -856, -574, -308, -99, 115, 403, 777, 1099, 1276, 1334, 1389, 1582, 1813, +1929, 1907, 1810, 1594, 1246, 906, 680, 524, 315, -6, -342, -559, -673, -796, -888, -855, +-636, -363, -138, -68, -183, -461, -789, -976, -970, -865, -819, -890, -1032, -1143, -1140, -986, +-760, -548, -368, -172, 148, 543, 872, 1023, 1103, 1263, 1465, 1643, 1784, 1891, 1872, 1652, +1301, 1011, 832, 669, 400, 61, -218, -428, -629, -840, -992, -988, -819, -551, -274, -101, +-166, -444, -755, -953, -991, -917, -869, -941, -1104, -1230, -1244, -1125, -930, -785, -674, -466, +-88, 293, 577, 748, 915, 1073, 1233, 1408, 1616, 1806, 1822, 1612, 1323, 1123, 990, 784, +481, 178, -68, -304, -578, -830, -1032, -1098, -1001, -735, -410, -183, -184, -391, -690, -907, +-966, -908, -863, -925, -1088, -1244, -1265, -1145, -1017, -963, -876, -611, -249, 81, 339, 571, +785, 930, 1058, 1276, 1585, 1818, 1833, 1661, 1459, 1328, 1177, 944, 675, 414, 158, -96, +-365, -645, -920, -1081, -1033, -785, -455, -179, -110, -281, -556, -767, -867, -823, -756, -835, +-1038, -1160, -1126, -1051, -1035, -1016, -914, -669, -363, -81, 203, 498, 696, 799, 931, 1223, +1580, 1818, 1840, 1757, 1651, 1517, 1353, 1140, 915, 672, 412, 157, -111, -441, -774, -1012, +-1039, -835, -492, -200, -83, -177, -425, -676, -751, -692, -677, -804, -975, -1057, -1038, -1034, +-1082, -1062, -956, -774, -559, -265, 77, 379, 531, 605, 783, 1113, 1453, 1665, 1772, 1782, +1727, 1600, 1462, 1290, 1076, 856, 613, 377, 103, -225, -627, -951, -1063, -928, -637, -298, +-106, -165, -394, -587, -621, -595, -644, -785, -906, -947, -979, -1057, -1105, -1094, -1026, -935, +-744, -413, -44, 198, 318, 427, 659, 975, 1279, 1530, 1674, 1727, 1699, 1613, 1516, 1374, +1187, 968, 763, 578, 320, -61, -477, -852, -1063, -1026, -739, -387, -188, -249, -427, -538, +-548, -585, -685, -781, -846, -902, -983, -1056, -1081, -1081, -1110, -1103, -895, -557, -235, -37, +109, 252, 461, 763, 1084, 1365, 1573, 1669, 1678, 1645, 1584, 1454, 1256, 1081, 938, 768, +515, 176, -281, -740, -1054, -1069, -790, -453, -280, -318, -401, -432, -467, -557, -654, -704, +-757, -863, -966, -1000, -1000, -1081, -1192, -1185, -1000, -683, -390, -191, -49, 106, 314, 594, +910, 1226, 1451, 1579, 1653, 1682, 1639, 1516, 1363, 1217, 1100, 957, 771, 468, -1, -552, +-944, -1009, -782, -521, -392, -354, -337, -328, -399, -494, -546, -572, -671, -789, -840, -844, +-899, -1021, -1158, -1194, -1039, -774, -524, -311, -148, -10, 174, 465, 809, 1106, 1338, 1516, +1637, 1706, 1684, 1578, 1466, 1341, 1212, 1127, 1037, 792, 284, -328, -764, -870, -753, -599, +-483, -373, -307, -323, -382, -403, -441, -513, -637, -729, -756, -754, -828, -980, -1127, -1169, +-1081, -886, -649, -441, -298, -174, 7, 304, 620, 900, 1156, 1402, 1569, 1646, 1664, 1628, +1513, 1351, 1252, 1266, 1265, 1020, 462, -151, -572, -764, -792, -708, -552, -426, -382, -369, +-369, -369, -403, -515, -656, -720, -703, -711, -813, -946, -1087, -1184, -1261, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, -114, +-63, -4, 122, 566, 642, -117, -294, 407, 422, 952, 1293, 1077, 1467, 809, -470, 17, +1105, 2586, 1951, 228, 984, 2747, 3251, 2774, 1492, 2610, 4998, 4889, 2965, 1457, 2290, 3897, +1955, -1077, -566, 4457, 2426, -665, -1609, -7048, 2, 3559, -5101, -4244, 2841, 5814, 6310, 2479, +-3129, -257, -6924, -18336, -21080, -21813, -17263, -16726, -18315, -10753, -2184, -2094, 1660, 966, -9237, -4300, +2171, -1095, 1535, 6140, 6189, 1271, -6396, -3000, 6660, 12154, 7937, 3152, 1372, 3048, 3004, 2699, +1113, -1319, 3001, 3454, -1090, -4187, -1411, 210, -9908, -9596, -9061, -2872, 5953, -1300, 1657, 7872, +1834, 6286, 14158, 7503, 2800, 4984, 3925, 11188, 11899, 8863, 11007, 8920, 10484, 16308, 13842, 6030, +-1703, -15416, -19877, -25437, -32187, -20961, -8150, -11695, -7451, -1591, -2137, -2437, -5389, -8295, -4544, 4049, +10284, 11016, 10259, 9190, 7796, 7810, 7608, 8739, 12420, 10858, 6173, -1475, 116, 1042, -6043, -4016, +-2876, -1458, 5586, -1660, -4922, -1368, -7940, -7118, -4355, -14906, -12922, -723, -5732, -13567, -14769, -3790, +10638, 7080, -4732, 1746, 9969, 13209, 11505, 7176, 11823, 16068, 9034, 12422, 20477, 15820, 15040, 7477, +-10549, -19709, -16003, -14756, -17556, -18086, -14338, -9788, -6892, -9077, -16067, -15933, -13832, -12457, -10487, -6183, +3804, 5559, 3923, -1686, -6164, 6378, 12325, 6997, 9460, 8937, 8697, 12079, 4104, 311, 10500, 7695, +10729, 14159, 5488, 7159, 12635, 5480, -4700, -8525, -5333, 2038, -7420, -20354, -14072, -3393, 2943, 4138, +-3256, 2784, 9613, 3545, 2557, 7828, 7090, 8521, 9915, 5472, 9887, 21865, 24902, 14196, 3204, -2280, +-10004, -15026, -20464, -19855, -15243, -13192, -10750, -14676, -16601, -16340, -21576, -17767, -15274, -13986, -2037, 1732, +-3001, 1780, 1577, 1994, 12191, 9109, 12481, 19379, 13131, 11010, 15340, 7275, 5052, 10328, 12151, 11716, +7255, 9074, 18074, 10060, -3939, -5014, -4052, -3472, -6691, -18904, -17650, -8625, -8403, -4267, 1879, -436, +-219, 4793, 5790, 628, 2994, 6788, 3719, 2302, 5041, 13123, 20478, 20084, 15424, 5388, -2594, -4417, +-13191, -15710, -15413, -16804, -8708, -6537, -14437, -9549, -13143, -18359, -14123, -11984, -7341, 2515, -737, -1122, +5382, 278, 2866, 11111, 9836, 8522, 9622, 11333, 12880, 4277, 1241, 10678, 7737, 953, 5304, 11375, +16477, 13759, -1049, -3048, 2994, -3061, -11449, -14373, -13063, -15025, -9844, -5069, -5911, -1470, 2576, 1695, +1380, 3067, 8926, 5509, 687, -637, -889, 4232, 14197, 13868, 16406, 14736, 1819, 335, -5889, -14598, +-11742, -11795, -13755, -6390, -6055, -7606, -8046, -19296, -22411, -11596, -10125, -8534, -3079, 217, 3079, -110, +852, 8855, 6561, 5279, 13438, 12215, 4748, 5146, 4018, 6128, 2194, -4669, -706, 11769, 13521, 4009, +1865, 4554, -247, -2231, -5865, -12245, -14359, -13347, -10834, -10422, -5962, 3244, 3129, -396, 5311, 6582, +12609, 13438, 4836, 4433, 4693, -358, 8763, 15891, 14888, 18481, 12026, 1498, -653, -9052, -14493, -12346, +-16454, -16424, -6692, -6357, -10198, -16052, -18762, -15856, -15594, -13577, -3161, -3635, -4238, 3021, 4386, 1491, +1911, 6846, 12089, 13282, 7101, 4578, 11794, 12529, -2757, -7212, 581, 6433, 8138, 6954, 3083, 2598, +2416, 5390, -3282, -10884, -8083, -11468, -14172, -12140, -10869, -828, 5729, -1296, 1485, 9323, 10365, 17154, +15183, 7447, 8004, 6747, 6330, 15887, 18502, 20600, 23622, 14885, 5224, 2382, -3211, -8185, -13602, -14838, +-6036, -6534, -8740, -7711, -13999, -21604, -17384, -11274, -10754, -11746, -5654, -783, 3066, -2049, -6352, 4594, +14712, 7276, 2538, 9121, 14740, 12422, 2733, -981, -839, 3808, 13269, 8419, 3418, 8694, 8330, 7662, +6650, -1896, -2815, -3325, -13842, -13135, -8159, -8546, -1420, -30, -4449, 943, 4850, 9359, 13870, 8297, +1186, 2937, 370, 2837, 8489, 13647, 18303, 13439, 7860, 8505, 3, -9398, -10491, -10713, -14866, -12272, +-5349, -8328, -15194, -20202, -21000, -15808, -14674, -20679, -12255, -745, -3070, -9119, -7347, 2912, 5156, 1296, +4447, 6011, 9470, 16137, 7859, -2594, 554, 2383, 7314, 9733, 4153, 7095, 12984, 6387, 8339, 8956, +2000, -908, -5903, -12001, -9124, -9046, -7639, -1376, -3649, -4881, 1188, 7808, 13356, 11704, 7086, 6046, +64, -1117, 6269, 11793, 10263, 13767, 16945, 10740, 2784, -824, -7212, -12204, -13150, -13245, -6191, -5842, +-15075, -17002, -15166, -16390, -22754, -21640, -9524, -6630, -12244, -7702, -6104, -3688, 2874, -230, -3325, 5831, +8953, 11755, 10729, -489, 247, 4987, 1458, 3875, 8436, 6842, 9557, 7777, 7930, 13463, 10427, 2937, +177, -5109, -6370, -7547, -6511, -3344, -3830, -4722, -386, 4030, 7509, 14864, 15756, 5859, 496, 5800, +6681, 5437, 10354, 13817, 18120, 17504, 11430, 8406, 2511, -7439, -11575, -8428, -2616, -8191, -12377, -4217, +-7731, -20506, -20092, -16264, -13935, -7120, -11877, -12688, -4786, -3453, -1496, -267, -5899, 1320, 10537, 8341, +7444, 6265, 2062, 2884, -60, 539, 6244, 5971, 5121, 5678, 7781, 10957, 11362, 8025, 4689, -2344, +-7617, -6195, -5745, -9698, -8982, -3508, -6793, -5968, 6674, 13433, 13319, 10539, 7043, 7472, 7994, 6290, +10256, 14881, 18100, 17328, 18809, 21850, 9699, -6205, -2113, -1336, -9309, -9144, -8373, -6760, -4979, -16798, +-24587, -19058, -18093, -15524, -15909, -21820, -15215, -5897, -7840, -10036, -10842, -5300, 3454, 4418, 3379, 5171, +3407, 70, -2070, -1176, 2564, 2735, 2223, 4298, 5449, 6702, 11380, 16809, 8510, 559, 572, -3193, +-7573, -5639, -6703, -8533, -10253, -8498, -489, 6734, 9924, 11072, 10183, 9527, 4923, 2098, 12502, 12261, +6713, 17132, 26205, 20742, 15060, 6239, 2241, 2910, -5690, -9712, -4126, -4288, -3064, -7335, -18423, -18061, +-13045, -12883, -16555, -19398, -15247, -6944, -6818, -10433, -10141, -7389, -1455, 1645, 5184, 6834, 5214, 1204, +-47, 2026, -424, -242, 5691, 3087, 142, 6612, 10652, 12683, 13713, 10475, 3468, -1673, -3055, -737, +-5061, -9113, -12119, -11507, -3490, -850, -1361, 11669, 14717, 3248, 4196, 8345, 6078, 5738, 5186, 11606, +23291, 21233, 17679, 15875, 9157, 4253, -644, -6781, -6105, -2167, -1879, -5866, -13607, -15621, -12783, -13731, +-17632, -20211, -17102, -12719, -10487, -10916, -11976, -11580, -10280, -5665, 3675, 2407, -179, 3209, 960, -4154, +-1525, 293, -266, -1322, -554, 2052, 3493, 8589, 14314, 11792, 6729, 911, -3124, 3929, 704, -12632, +-10451, -6981, -13631, -8892, -478, 5180, 8672, 4790, 5730, 10749, 5531, 1062, 4634, 9273, 14741, 19181, +18842, 19826, 17096, 11086, 1727, -4538, -3795, 69, -526, -5734, -9431, -9207, -10838, -13867, -17671, -19240, +-15978, -16720, -15764, -8628, -10074, -16161, -12190, -7347, -3520, 982, 3700, 2988, -38, -599, 2075, -431, +-329, 1498, -543, 1722, 3538, 3325, 15755, 19635, 7047, 5752, 8874, 5329, 3780, -55, -3325, -5874, +-11062, -9501, 749, 2517, 4019, 8705, 11835, 12554, 8905, 4811, 5177, 9186, 13226, 16449, 18955, 23136, +25153, 20846, 8172, 1142, 1755, 3241, 1874, -3523, -6990, -3043, -6974, -13704, -12933, -14880, -19781, -17801, +-13859, -12355, -13239, -14273, -13273, -14227, -9444, -449, -39, 1050, 2415, -2364, 358, 1681, -4350, 747, +2484, -6268, -4471, 5110, 8933, 10494, 8684, 8363, 9115, 3130, 2534, 5538, 648, -8756, -12370, -10340, +-5540, -4575, -2571, 2471, 9124, 11461, 9211, 4767, 3089, 6527, 9992, 8452, 12125, 20281, 25136, 24872, +13372, 2956, 4864, 5070, -605, -1693, -3105, -5494, -6266, -7218, -10209, -16913, -19300, -15046, -16864, -16023, +-11252, -15096, -15092, -13595, -15504, -6361, 858, -2639, 70, 4355, -2450, -2602, 1953, 3271, -545, -7416, +-5319, 2990, 3727, 4288, 9084, 11026, 6504, 2712, 4978, 7816, 3883, -4482, -9996, -10105, -8717, -8446, +-6828, -3604, 4985, 10628, 8065, 5798, 5574, 5993, 8473, 5532, 5436, 17257, 25935, 23923, 19758, 14058, +9235, 5058, 4369, 5263, -1676, -4836, 642, -3332, -6878, -9767, -17016, -16433, -12659, -16630, -14195, -10692, +-17203, -17017, -12220, -12020, -8890, -2846, 2055, 1545, -5106, -3194, 4786, 4623, -2576, -5756, -3318, -1233, +-532, 3482, 8295, 10495, 7361, 4685, 7275, 8996, 8001, 2690, -5147, -7001, -6659, -10122, -10716, -7043, +-1278, 7337, 7324, 3499, 6866, 9295, 5332, 835, 2776, 12953, 17531, 21321, 25816, 18148, 11521, 12072, +8020, 4404, 3481, -3234, -1432, 2479, -4248, -8447, -9558, -16290, -16929, -12791, -12386, -14566, -16610, -14848, +-14303, -18116, -15086, -4946, 191, -3948, -6657, -1847, 1638, 1410, -727, -2030, -3719, -7061, -5335, 1793, +5304, 6101, 5999, 4005, 7335, 10464, 7720, 5570, 2521, -2410, -3579, -8461, -13428, -9371, -2286, 2983, +811, 3932, 12004, 9766, 4170, 4772, 2219, 4758, 15693, 19397, 21641, 24221, 17458, 14807, 15369, 8114, +3937, 4019, 1142, -205, 863, -625, -6992, -14748, -14539, -11195, -12915, -16526, -14353, -11806, -17106, -21310, +-16069, -8254, -4917, -6435, -5534, -1945, -1706, -650, 3265, 1819, -2448, -6181, -7472, -137, 6095, 3886, +4539, 5400, 7442, 10924, 9817, 7229, 6088, 6242, 3243, -7958, -13479, -6043, -4622, -6469, -881, 2199, +5590, 11458, 6990, 1811, 2060, 602, 6320, 16046, 17312, 17900, 20732, 20332, 15215, 10460, 8808, 5735, +1160, 768, 4076, 2598, -5755, -9693, -9384, -12462, -15838, -14093, -11018, -12627, -19489, -21633, -16141, -13593, +-12267, -7951, -6967, -5293, -4240, -4541, 1851, 3965, -1125, -6903, -8580, -4240, 1986, 2530, 1134, 1187, +5580, 12420, 7648, 3074, 11385, 12468, 3508, -1572, -7125, -9033, -4758, -7292, -7802, -884, 3203, 7893, +10730, 6053, -800, -586, 5537, 9155, 11682, 15847, 20721, 21000, 17863, 16728, 13850, 6537, 2848, 5605, +5858, 2196, -1148, -2210, -4816, -12778, -15840, -9206, -9254, -12734, -15805, -18773, -17168, -16006, -15205, -10057, +-6759, -7569, -7475, -4866, 1268, 4377, 1365, -2361, -7111, -6804, 2353, 1033, -4711, 2370, 7107, 4617, +6185, 5999, 8617, 13689, 8744, 1590, -1354, -4804, -8078, -8253, -8224, -8724, -3103, 5635, 9456, 6189, +1393, 521, 1545, 3031, 8383, 13775, 14708, 16605, 22388, 22458, 16371, 8238, 7081, 10797, 5783, 1883, +4315, 3533, -1943, -9021, -13274, -9888, -8026, -11209, -13498, -16146, -18120, -18664, -17508, -11953, -9911, -11595, +-9048, -6730, -4430, 5113, 3745, -5285, -3348, -2211, -4181, -2746, -2326, 202, 4344, 3741, 2228, 6022, +9830, 10411, 10724, 8990, 3695, -1185, -3235, -5033, -9139, -11304, -5926, 2265, 5763, 6972, 7617, 2152, +-872, 1659, 7190, 10326, 8410, 13680, 24281, 24255, 17625, 14453, 12733, 11385, 7898, 4902, 7113, 6722, +2020, -3648, -8160, -8661, -7943, -9323, -8655, -12020, -19400, -17659, -16232, -16937, -10173, -10891, -16266, -10294, +-2091, 421, -204, -1268, -1525, -698, -3820, -6829, -3402, 1518, 1335, -175, 1427, 4229, 6058, 9006, +11159, 10598, 6379, 4447, 3374, -3516, -8570, -9751, -9082, -5345, 146, 6691, 9204, 1892, -1465, 3528, +4922, 3153, 4643, 11043, 18983, 21627, 19626, 18804, 16475, 12468, 9779, 7472, 9161, 8932, 3240, 1960, +-2394, -10328, -7619, -5848, -9590, -9635, -13298, -20807, -19587, -14134, -13272, -16266, -17994, -15073, -7320, -3289, +-4748, -3661, 476, -589, -5884, -7207, -5430, -2433, -1921, -1658, -1363, -2257, 1633, 7712, 8282, 7419, +7414, 7687, 5883, -1001, -5668, -7578, -13216, -13014, -3887, 3068, 2762, 685, 1250, 3161, 920, -2433, +1112, 6083, 11037, 15658, 16641, 20988, 19991, 11816, 11406, 11944, 8224, 9644, 9614, 3578, 748, -1996, +-7462, -7602, -3717, -4891, -11296, -17381, -17879, -13851, -11664, -16765, -19416, -14943, -10626, -8312, -6548, -3035, +638, -527, -2506, -3910, -6623, -4732, -146, -393, -2919, -4065, 430, 6270, 6075, 6596, 10473, 10371, +7643, 6972, 3544, -4286, -11540, -11892, -4218, -474, -976, 2460, 4383, 6058, 2955, -3061, 879, 5856, +4983, 10586, 18178, 19441, 20789, 20046, 13936, 11977, 13767, 12605, 10416, 9878, 7258, 788, -3793, -5187, +-1882, -527, -7600, -14136, -14010, -11818, -12777, -16607, -17145, -14506, -15162, -12927, -7539, -5092, -2303, 13, +139, -2331, -5896, -4880, -57, -903, -4366, -2757, -1054, 17, 3897, 7136, 8828, 6989, 8108, 13432, +9433, -995, -7732, -10503, -6370, -4156, -7056, -1422, 5690, 3752, 1184, 869, -2023, -626, 3329, 5425, +9011, 16604, 20536, 18788, 17110, 14389, 12696, 12957, 12430, 12605, 11165, 4171, -2223, -2755, 102, -79, +-6766, -10303, -9831, -12317, -14439, -14707, -15639, -16436, -17407, -16180, -12168, -9487, -6282, -320, -562, -4445, +-3757, -3192, -2706, -2764, -2562, -1360, -4464, -4391, 3147, 5779, 4460, 4654, 7572, 14551, 15284, 3512, +-2741, -2807, -6694, -9030, -6423, -3500, -407, 4321, 4093, 206, -366, -613, -889, 1814, 5396, 10400, +15944, 18224, 18786, 17211, 13247, 11668, 13399, 16650, 14721, 5664, 659, 2213, 1685, -1104, -3836, -5741, +-7417, -10383, -13286, -12732, -14946, -17295, -15709, -17398, -18414, -13796, -7781, -2956, -3967, -4483, -1162, -2810, +-5022, -1602, -1007, -3275, -4825, -5763, 536, 5165, 520, 28, 8283, 13572, 12531, 10715, 6042, -240, +-3283, -6602, -9054, -6090, -1913, 636, 3250, 2691, 1289, -680, -2556, -1416, 1536, 5204, 9557, 13898, +19158, 19549, 12836, 9788, 15264, 18348, 15175, 8891, 4339, 4564, 2635, -469, -463, -3212, -6840, -7464, +-9890, -12801, -15202, -15239, -14322, -19349, -22797, -16754, -12143, -9613, -5512, -4912, -4697, -4354, -5553, -2675, +201, -5073, -9287, -3779, 193, -2071, -2438, 46, 2962, 8698, 11861, 11192, 10227, 6668, 687, -4698, +-8168, -6958, -4696, -2516, 610, 2940, 3729, 1021, -2886, -2849, 808, 408, 2360, 10900, 17637, 18504, +13619, 10983, 16173, 18676, 16846, 14374, 9967, 6186, 5504, 4475, 2768, -961, -3344, -1861, -6526, -11642, +-10285, -10645, -13484, -16596, -19997, -20031, -15706, -12550, -8288, -3521, -5879, -8910, -3473, 1617, -2176, -5809, +-5404, -3908, -1364, -2064, -3948, -2249, 923, 4985, 8110, 10986, 12911, 11627, 6570, 792, -4453, -6244, +-5263, -5356, -2804, 3416, 3712, 1290, 285, -361, -809, -3520, -1688, 7871, 14327, 14466, 14083, 13215, +14611, 17088, 18120, 18419, 12765, 8249, 9649, 7341, 2677, 2154, 1956, -1615, -4786, -8021, -8749, -8115, +-11233, -15622, -16310, -18942, -22831, -17139, -7984, -7800, -10195, -9326, -4714, -576, -1605, -5250, -6137, -3871, +-1934, -2867, -5021, -4413, -2170, 72, 4126, 7191, 10841, 13804, 9990, 4823, 1420, -3438, -7141, -6937, +-4347, 181, 364, 4, 3992, 2879, -2518, -6130, -4187, 3477, 8313, 10558, 13123, 12622, 11782, 16720, +19303, 17077, 15821, 14424, 11117, 8437, 5916, 4548, 5339, 2301, -4120, -4400, -3594, -8337, -9732, -8658, +-12826, -19629, -22083, -18193, -12266, -10293, -11690, -10716, -6554, -2093, -1616, -4549, -4724, -4016, -2946, -1666, +-3927, -5219, -3090, -2603, -728, 4745, 8678, 11568, 11709, 10025, 8443, 562, -5903, -5101, -3126, -3237, +-4079, -856, 5595, 5143, -1704, -5248, -5505, -2981, 4176, 8849, 8125, 9262, 12545, 14643, 16164, 17039, +16414, 17754, 15232, 8182, 7215, 9595, 6562, 2689, 1554, -728, -4359, -6164, -5606, -5471, -10276, -16833, +-20000, -19295, -15393, -13841, -14299, -11911, -8995, -6177, -2766, -4001, -5483, -3811, -3845, -2894, -2561, -4205, +-4647, -5677, -3887, 1510, 4227, 6362, 11087, 14122, 12126, 4198, -1899, -1223, -1597, -6198, -5984, -1466, +2763, 5607, 3759, -3744, -7377, -3813, 694, 4436, 5543, 5569, 10362, 14411, 12761, 13866, 19445, 19589, +15123, 12438, 11465, 10311, 7714, 6787, 5803, 1600, -2791, -3953, -3037, -2085, -6564, -14138, -16400, -17455, +-17590, -15536, -16346, -14873, -11019, -8318, -5715, -4939, -4819, -3918, -4773, -4116, -1363, -2245, -5675, -6543, +-4786, -1771, -1227, 874, 9180, 14703, 11691, 7330, 5323, 1835, -1278, -3742, -7285, -5778, 770, 5024, +4911, 97, -6286, -5833, -518, 45, 208, 4822, 8129, 8501, 9762, 13779, 17404, 17532, 16999, 16331, +13481, 10841, 9603, 8861, 9619, 4873, -2040, -1989, -635, -65, -2570, -9444, -13743, -14885, -15792, -16751, +-18395, -17603, -13564, -11156, -9702, -6495, -4989, -5358, -5784, -4599, -1530, -2293, -5972, -5437, -3335, -6014, +-7242, -1543, 4739, 9307, 11528, 9845, 7992, 6856, 2746, -2487, -5654, -7658, -3751, 3826, 4805, 422, +-2194, -2968, -4173, -3924, -646, 3168, 3212, 4153, 8290, 10981, 14258, 15724, 16772, 19129, 16143, 11290, +11403, 12204, 12119, 8294, 1875, -751, 798, 2369, 1131, -4667, -9910, -10686, -12388, -15774, -17903, -18017, +-16025, -13864, -11707, -8115, -6160, -7668, -6242, -2042, -2849, -4767, -3176, -1875, -3851, -6149, -8177, -5985, +912, 5275, 7663, 10059, 10212, 9561, 8814, 2998, -5229, -7255, -3406, 1081, 1446, 2091, 2860, -1561, +-4737, -4115, -1997, 1369, 870, 822, 5247, 8318, 9502, 12651, 16343, 18590, 17046, 12853, 12176, 13597, +13929, 11440, 4930, 467, 1611, 3337, 2157, -1496, -5398, -7895, -9936, -13816, -15890, -16960, -19364, -18001, +-12224, -10051, -11833, -9747, -5961, -4455, -4627, -5853, -4367, -777, -1942, -6755, -8599, -8330, -5336, 680, +4106, 5073, 7194, 12054, 13556, 5498, -1838, -3800, -4503, -2605, -524, 1474, 3554, 621, -3919, -3852, +-2247, -1735, -929, -20, 2368, 4351, 5538, 9681, 14233, 17342, 17363, 14456, 12913, 15169, 16432, 13698, +8837, 4423, 3768, 4574, 3310, 1615, 560, -3767, -8410, -8415, -10269, -16392, -19309, -17415, -14359, -12394, +-12880, -12322, -7159, -4933, -6614, -6286, -4240, -1545, -599, -2890, -6805, -10450, -7058, -1239, -1168, -193, +5252, 11175, 14102, 10619, 3836, 107, -2920, -4477, -1687, 1342, 2421, 1164, -802, -1470, -2534, -3568, +-2049, 36, 586, 1124, 1882, 5298, 11337, 15533, 15976, 14317, 13836, 15957, 18150, 15680, 10875, 9491, +7126, 3874, 4443, 5673, 2378, -1349, -3154, -4948, -6966, -12658, -17790, -16622, -15349, -15278, -14827, -12805, +-9499, -8263, -7114, -6718, -7281, -3226, 1511, -1489, -6586, -8179, -7098, -4538, -4629, -4520, 1114, 7487, +11459, 12459, 9937, 4642, -1165, -3898, -1809, 724, 492, 939, 1179, 260, -1841, -4166, -3659, -965, +444, -1360, -1817, 900, 6696, 12875, 13720, 11528, 13372, 16867, 16632, 16104, 15586, 11624, 8446, 6667, +5940, 6505, 3822, 879, 664, -442, -4226, -9955, -13083, -13877, -16574, -17213, -15429, -15055, -12691, -8612, +-9061, -10187, -8584, -4518, -216, -1311, -5030, -5761, -5244, -6484, -7604, -6959, -3198, 1453, 6174, 11759, +13227, 8632, 2252, -1343, -1588, -425, -175, -292, 1364, 2095, -342, -3105, -3915, -2180, 371, -768, +-4989, -3161, 4105, 7807, 9718, 11269, 11897, 14239, 16265, 17622, 17781, 14270, 10527, 9328, 9494, 7948, +4090, 3189, 5242, 2655, -1571, -4154, -8464, -11356, -12985, -16079, -17928, -16461, -13111, -9857, -10448, -12588, +-10186, -5474, -2425, -2697, -3918, -3126, -3530, -6016, -7720, -7507, -6873, -4316, 1307, 7823, 12378, 11416, +6455, 2343, 490, -619, -965, -66, 533, 2073, 2030, -2770, -3855, -614, -119, -1994, -4628, -4487, +-880, 2956, 6342, 8859, 9620, 10674, 13597, 17503, 19120, 14602, 11575, 13149, 11444, 8039, 6100, 4876, +5110, 5503, 2446, -1708, -4971, -7062, -8638, -13802, -18762, -18306, -13741, -10956, -12689, -14485, -11869, -7571, +-5884, -5027, -3521, -2693, -2750, -3826, -5663, -7483, -8972, -8513, -4114, 3506, 8740, 10756, 10422, 5992, +3144, 1662, -1382, -1039, 1975, 2777, 861, -1639, -1739, -58, -130, -1430, -3244, -4711, -3579, -1425, +3123, 7325, 6361, 6454, 12278, 16288, 16673, 16194, 14558, 14026, 13361, 10881, 8000, 5958, 6218, 7595, +5843, 1315, -1855, -2434, -3928, -9833, -16710, -17611, -13946, -12437, -13692, -14519, -13216, -10737, -8425, -6469, +-5177, -3584, -3190, -2674, -2034, -5672, -9378, -9858, -8369, -2564, 4515, 7868, 9400, 9970, 7481, 2960, +-1019, -41, 2836, 2737, 978, -1094, -799, 861, -4, -939, -610, -3962, -6638, -2883, 1202, 2829, +3448, 4763, 8643, 12581, 15018, 15923, 15783, 15366, 15218, 13420, 9807, 7269, 7488, 9087, 7635, 3223, +1438, 1904, -41, -6127, -12233, -14767, -14917, -13522, -13773, -14748, -14073, -13734, -11502, -8018, -7296, -6796, +-4269, -2652, -1521, -2612, -7508, -11109, -11045, -6768, -2074, 1693, 6962, 10584, 9324, 4881, 395, -77, +3141, 2671, 100, 280, -625, -1366, 414, 1464, -535, -4095, -5986, -4347, -1785, -461, 507, 2204, +5104, 9033, 11911, 13604, 14674, 15821, 17161, 15276, 11161, 8806, 10019, 10644, 7612, 5224, 4968, 5028, +3564, -1781, -7344, -10356, -13055, -14051, -12722, -13965, -15122, -14349, -12855, -10490, -8957, -8281, -7122, -4434, +-631, -229, -4698, -8438, -9892, -9843, -6989, -3500, 2181, 9353, 10355, 6395, 3941, 2742, 1968, 2907, +3299, 1521, -986, -1237, 1523, 3114, 1048, -2177, -4407, -3961, -2562, -1927, -1501, -564, 2228, 6167, +8955, 10202, 11666, 16167, 18634, 15990, 12562, 11602, 12229, 12251, 8752, 5880, 7484, 7908, 6307, 3342, +-1650, -6174, -9397, -11341, -12347, -13277, -14154, -14504, -14211, -11710, -9875, -10724, -9265, -6146, -2718, -55, +-1714, -5363, -7010, -9457, -11530, -8279, -1591, 3920, 7393, 8286, 6668, 3445, 1708, 3546, 4582, 2558, +-779, -1679, 1179, 3154, 2278, -869, -3202, -3547, -3009, -2544, -3595, -4101, -549, 3867, 4574, 5384, +8393, 13610, 17708, 15657, 12545, 13174, 13951, 12703, 9885, 7267, 7170, 8470, 8613, 6599, 2033, -1770, +-5162, -9033, -10591, -11737, -14298, -14785, -14074, -13186, -11783, -12327, -12535, -8802, -4583, -3134, -1771, -1333, +-3927, -8770, -11879, -10582, -7157, -2047, 3693, 7267, 7258, 4376, 2987, 4113, 5293, 3604, 43, -1380, +513, 2534, 3136, 959, -2530, -2370, -1184, -2688, -4597, -5242, -2401, 1346, 1340, 941, 5063, 10714, +14411, 14543, 13401, 13909, 14393, 14178, 12044, 8444, 7616, 8924, 9112, 9058, 6710, 1846, -1540, -4165, +-7464, -9680, -12467, -14932, -13906, -12191, -13118, -14522, -13643, -10968, -9230, -6561, -2744, -576, -1728, -5481, +-9342, -11699, -11287, -7194, -989, 3939, 5409, 3998, 3735, 5175, 5312, 4680, 2154, -905, 3, 2628, +3162, 1577, -848, -1017, 266, -1874, -5008, -5114, -2579, -738, -1492, -1606, 1861, 6308, 10605, 12733, +12380, 13600, 15290, 14723, 13527, 11594, 8617, 8287, 9881, 10129, 9466, 6114, 1938, -546, -2216, -5893, +-11055, -12865, -12038, -12102, -13405, -14068, -13877, -13475, -12370, -9523, -5507, -2306, -664, -1824, -5399, -9831, +-13273, -10883, -4848, -263, 2246, 2946, 3108, 5248, 6628, 5673, 3265, 509, 629, 2836, 2795, 1014, +281, 1416, 1768, -1510, -4205, -3725, -2574, -1902, -2427, -3579, -1407, 3222, 6059, 8895, 11436, 12420, +14242, 15385, 14867, 13174, 11061, 9156, 9222, 11498, 11667, 8164, 5192, 4296, 2186, -2413, -7007, -9592, +-10544, -11646, -11918, -12640, -13607, -14225, -14295, -12192, -8889, -6025, -2091, 650, -1712, -6790, -11668, -12579, +-8501, -3824, -1233, 50, 1080, 4099, 6943, 6463, 3575, 1352, 2201, 3624, 1890, 64, 1213, 2485, +2071, 43, -3540, -3481, -1654, -2218, -3659, -4306, -3560, -1067, 2456, 5142, 7357, 10059, 12326, 13804, +15122, 14991, 11832, 9518, 9978, 11475, 11249, 9333, 8343, 7217, 4887, 1522, -2665, -6264, -8627, -10856, +-11181, -11275, -13099, -14417, -14496, -14537, -13170, -10312, -5637, -530, 318, -3328, -8684, -12210, -10933, -7158, +-4276, -3511, -2357, 1556, 6535, 6211, 3251, 2894, 3292, 3752, 2330, -132, 654, 3388, 3352, 567, +-1598, -2225, -1721, -1290, -2620, -4682, -4860, -2897, -1031, 1776, 4616, 6596, 8953, 12429, 15526, 15094, +12426, 11505, 11446, 11249, 11041, 10481, 10622, 10294, 7841, 5271, 2449, -1934, -5525, -7793, -9208, -9934, +-11450, -12717, -13420, -14633, -15359, -13784, -9604, -3588, 426, -625, -4773, -9917, -10912, -7750, -6806, -7086, +-4933, -772, 3826, 5446, 3858, 3197, 5036, 4947, 2460, 619, 1346, 2800, 3634, 2442, -284, -1173, +-513, -459, -1571, -3174, -4615, -4942, -3301, 36, 1412, 2011, 5318, 10048, 13631, 14507, 12975, 12731, +13095, 11659, 10652, 10876, 11172, 11270, 10294, 8626, 6179, 2467, -1462, -4019, -6683, -8546, -9701, -10815, +-11399, -13658, -16271, -16248, -14094, -8323, -1487, 172, -3257, -6589, -8243, -8156, -8190, -9229, -8277, -3991, +634, 2218, 2993, 4244, 5217, 5088, 3575, 1308, 1080, 2558, 3598, 2649, 952, 137, -332, -307, +458, -1160, -4372, -5441, -4185, -2074, -1143, -1461, 1107, 6018, 9974, 12032, 12911, 13214, 13335, 12554, +11186, 10850, 10679, 11220, 11917, 10813, 9011, 6085, 2779, 316, -3250, -6561, -7844, -8719, -9780, -10769, +-14357, -18089, -17602, -12360, -5835, -2051, -2578, -4796, -5389, -5712, -8360, -10442, -9449, -6645, -3621, -1270, +743, 3124, 5232, 5910, 4064, 2000, 2009, 2525, 2747, 3413, 2372, 423, -157, 444, 1526, 379, +-2801, -4623, -3711, -3053, -3261, -3350, -1803, 1902, 5554, 8755, 11496, 12300, 13045, 13259, 12373, 11306, +10436, 10495, 12246, 12303, 10595, 9152, 6710, 3667, 652, -2954, -6448, -7420, -6806, -7792, -11770, -16884, +-19483, -16100, -9620, -5985, -5088, -4311, -3371, -4190, -7167, -9811, -10289, -8636, -6240, -4942, -3312, 840, +3948, 4872, 4259, 2915, 1822, 2109, 2906, 3555, 2805, 565, -174, 1269, 1831, 884, -1616, -3079, +-2965, -3533, -4273, -4474, -4019, -1993, 1234, 4493, 8286, 10385, 11379, 12809, 12904, 11376, 10595, 10509, +11016, 11904, 12125, 10624, 8987, 7586, 4581, 375, -3604, -6026, -5264, -4320, -7780, -14523, -18776, -17664, +-13653, -10482, -7850, -5709, -3708, -2616, -4942, -8533, -9529, -8785, -8233, -7668, -6127, -3051, 1217, 3932, +4644, 3719, 1754, 2049, 3500, 4148, 2998, 924, 539, 2080, 2272, 1335, 132, -1064, -1505, -2368, +-4029, -4514, -4752, -4440, -2177, 985, 4112, 7516, 10301, 11647, 12284, 12581, 11289, 10340, 10824, 11519, +12012, 11989, 11151, 10337, 9067, 5196, -438, -4052, -2871, -1576, -4402, -10002, -15357, -17310, -15587, -13427, +-11562, -8166, -4298, -2837, -3537, -6179, -7966, -8370, -8720, -8688, -8200, -6584, -2430, 2015, 4200, 3811, +1877, 2058, 4129, 4447, 3053, 1521, 1108, 2377, 2913, 1828, 1291, 806, -145, -966, -1938, -3787, +-5110, -4896, -4429, -2683, 527, 3959, 7120, 10196, 11648, 12218, 11771, 11042, 10586, 11010, 11825, 11471, +11254, 12915, 12852, 8739, 2978, -650, -1000, 482, -910, -6215, -11060, -14247, -15683, -15889, -14731, -11265, +-6942, -4492, -3622, -4445, -6182, -7144, -8015, -8965, -9570, -9596, -6434, -1132, 2109, 2672, 1903, 1914, +3652, 4526, 3291, 1825, 1718, 1783, 2401, 2767, 2063, 1129, 1208, 615, -523, -1896, -3894, -5178, +-5306, -4560, -3090, -643, 3404, 7040, 9582, 11392, 11363, 10616, 11074, 11921, 10632, 9808, 10868, 13361, +15030, 12372, 6537, 2576, 1766, 2324, 1306, -2278, -6034, -9498, -13430, -16005, -16511, -14396, -10246, -6981, +-5076, -4164, -4968, -5567, -6107, -7771, -9928, -10858, -9210, -5004, -896, 499, 911, 2053, 3125, 3759, +4067, 2858, 1654, 1795, 2251, 2593, 2397, 1784, 1457, 1256, 1327, -138, -2342, -3888, -4888, -5600, +-5070, -3693, -1660, 2682, 7323, 9032, 9355, 9960, 11262, 12191, 10620, 8301, 9167, 12683, 15629, 14321, +9328, 5705, 4477, 3784, 2910, 725, -2038, -4949, -9446, -13812, -16337, -16354, -13787, -9950, -7562, -6240, +-5327, -4637, -4657, -5921, -9205, -11573, -10460, -7813, -4962, -2312, -825, 559, 1963, 3296, 3813, 3261, +2550, 1693, 1780, 2658, 2773, 1813, 1722, 2188, 1673, 1191, 61, -2470, -4024, -4341, -5353, -6046, +-4876, -1141, 3849, 6276, 6895, 8421, 10958, 12668, 10985, 7478, 7879, 11536, 15049, 15400, 12470, 8997, +7177, 5718, 4477, 3323, 1547, -900, -4375, -9298, -13995, -15977, -15237, -12730, -9746, -8554, -7382, -4749, +-3367, -4325, -7439, -10031, -10840, -9531, -7134, -5078, -3255, -1166, 694, 1999, 3354, 3714, 2527, 2014, +2542, 2390, 2357, 2617, 2039, 2195, 2674, 2337, 1257, -511, -1999, -2690, -4740, -6686, -6733, -4068, +401, 2962, 3749, 6262, 10112, 12181, 10980, 7811, 6852, 9512, 13047, 14769, 14306, 12011, 9474, 7897, +6396, 4768, 4095, 2401, -379, -4427, -9913, -14286, -15386, -13878, -12262, -11313, -9604, -6814, -4102, -3386, +-5503, -8839, -10443, -10120, -9305, -7639, -5434, -4001, -1849, 1035, 2226, 2536, 2711, 2311, 2324, 2372, +2224, 2334, 1875, 2297, 3095, 2815, 1924, 1057, 147, -588, -3144, -6510, -7351, -5400, -2780, -1066, +299, 3297, 7878, 10973, 10429, 8491, 6904, 7420, 10621, 13252, 14224, 13726, 11786, 9757, 8174, 6730, +5468, 4877, 3765, 365, -5188, -10350, -13211, -13965, -13443, -12988, -12267, -9550, -5425, -3766, -4419, -6235, +-8911, -10224, -9390, -8995, -8116, -6549, -4179, -1279, 564, 1645, 2355, 2217, 2284, 2598, 2205, 1896, +1715, 2030, 3139, 3190, 2007, 1747, 2472, 1912, -1085, -4676, -6671, -5536, -4302, -4365, -3079, -116, +4357, 8649, 10048, 8882, 7305, 6907, 8253, 10940, 13137, 13831, 13205, 12199, 10418, 8143, 6743, 7002, +6750, 4570, 274, -5288, -9454, -11104, -12966, -14335, -13584, -11866, -8607, -5123, -3860, -4799, -6948, -8583, +-8889, -9360, -9292, -8272, -6678, -4141, -1368, 282, 1358, 1856, 2201, 2799, 2934, 1788, 1187, 2334, +3173, 3042, 2007, 1758, 3691, 4023, 1124, -2351, -4446, -4735, -4489, -5336, -5877, -3905, 533, 5194, +8037, 8539, 7448, 6531, 7096, 8986, 10778, 12298, 13827, 13788, 11874, 9840, 7735, 7628, 9039, 7762, +4003, -28, -4174, -7639, -10672, -13184, -14289, -13904, -11365, -7536, -5347, -4764, -5412, -6870, -8005, -8718, +-9303, -9467, -8471, -6891, -4198, -1277, -326, 445, 1889, 2891, 3047, 1866, 1105, 2483, 3514, 2538, +1613, 1937, 3727, 4763, 3350, 107, -2236, -2910, -3369, -4984, -6710, -6470, -3396, 1192, 5549, 7138, +6536, 6668, 6746, 7133, 8789, 10354, 12507, 14657, 13765, 10937, 8942, 8777, 9759, 9376, 7223, 4280, +512, -2933, -6286, -10230, -13461, -14410, -13116, -10576, -7637, -6022, -5493, -5485, -6992, -7947, -8285, -9242, +-9679, -8602, -6502, -3794, -2501, -1572, 677, 2639, 2487, 1499, 1436, 2561, 3393, 2799, 1609, 1641, +3312, 4798, 4492, 2127, 262, -772, -1776, -2987, -5667, -7892, -6177, -2375, 1608, 4834, 5708, 5866, +6553, 6632, 6614, 7832, 10897, 14034, 14301, 12472, 10685, 9830, 10139, 10732, 9877, 7265, 4785, 2000, +-1409, -5425, -10216, -13311, -13454, -12493, -10323, -7685, -6232, -5589, -5940, -6712, -7346, -8726, -10125, -9520, +-7740, -6416, -5477, -3472, -740, 1397, 1596, 921, 1251, 2278, 3142, 2597, 1062, 1384, 2791, 3877, +4656, 3496, 1531, 1138, 456, -1485, -4128, -7184, -8056, -5888, -2048, 1317, 3173, 4770, 5950, 5657, +4731, 5569, 8296, 11197, 13329, 12969, 11118, 10203, 10248, 10728, 10930, 9052, 7004, 5614, 2904, -1182, +-6012, -10445, -12856, -13516, -12504, -10202, -8186, -7130, -6213, -5556, -6603, -8596, -9809, -9602, -8771, -8747, +-8125, -5889, -3178, -549, 326, -255, 640, 2094, 2500, 2423, 1096, 335, 1822, 3429, 3900, 3377, +2593, 2355, 2048, 1123, -1606, -5315, -7796, -7306, -5308, -3065, 151, 3245, 4658, 4977, 4108, 3765, +5981, 8915, 11445, 12617, 11496, 10416, 10662, 10953, 10955, 10202, 9222, 8268, 6564, 3407, -662, -5352, +-10225, -12883, -12675, -11603, -10459, -9119, -6884, -5012, -5848, -7566, -8484, -8910, -8541, -9027, -9861, -8058, +-4997, -2669, -1091, -857, -256, 1549, 3179, 2843, 1283, 604, 1622, 3134, 3789, 3567, 2996, 2990, +4003, 3894, 954, -2091, -4656, -6518, -6608, -5554, -2937, 1123, 3580, 4306, 3954, 3188, 4085, 6926, +9908, 11477, 11556, 11143, 11244, 11557, 11102, 10909, 10936, 9983, 8956, 7594, 4784, 151, -5670, -9512, +-10829, -12017, -12092, -10564, -8489, -5921, -5458, -6855, -7433, -7427, -7875, -9009, -9968, -9712, -7383, -4587, +-3083, -2712, -1726, 492, 2568, 2686, 1692, 765, 579, 2338, 3655, 2635, 2165, 2850, 4011, 4794, +3144, 545, -1746, -4421, -6692, -7301, -5862, -2661, 1086, 3113, 2868, 2081, 2212, 4513, 7527, 9024, +10023, 10942, 11118, 11166, 10848, 10911, 11087, 10126, 10006, 10381, 8216, 4458, -343, -5013, -8295, -10815, +-12647, -12275, -10068, -8048, -6987, -6831, -7057, -7015, -7142, -8406, -10053, -10745, -9080, -6565, -5590, -4755, +-3359, -1858, 916, 2534, 1527, 504, 475, 1695, 2895, 2342, 1507, 2253, 3738, 4507, 4463, 3161, +948, -1499, -4515, -7050, -7414, -5655, -1657, 1627, 1868, 1220, 1347, 2668, 5021, 6539, 8382, 10184, +10328, 10743, 11501, 11199, 10524, 10426, 10780, 11612, 10977, 8231, 4575, 847, -3592, -7910, -10908, -11972, +-10934, -9371, -8208, -7474, -7261, -6250, -5681, -7633, -9379, -9982, -9824, -8125, -6801, -6503, -5541, -3396, +-655, 1418, 1408, 403, 715, 1773, 2140, 2190, 1730, 1759, 2959, 4048, 4933, 5017, 3410, 1662, +-1020, -5026, -7324, -7166, -4070, -587, 444, 605, 1171, 1342, 2506, 4852, 6699, 7894, 9064, 10262, +11381, 11463, 10377, 10047, 11162, 12107, 12028, 10781, 8663, 6113, 1612, -3473, -7673, -10809, -10777, -9547, +-9673, -9156, -7583, -6231, -5519, -6308, -8349, -9648, -9614, -8903, -8033, -7930, -7774, -5356, -2216, -392, +402, 321, 622, 1587, 1555, 1880, 1867, 1199, 1898, 3122, 4178, 5076, 5063, 4492, 2530, -2026, +-5915, -6827, -5821, -3697, -1266, -65, -59, 32, 917, 2815, 4789, 5661, 6916, 9014, 10572, 11009, +9978, 9597, 10789, 11339, 11901, 12089, 10870, 9668, 7267, 1875, -3822, -7491, -9204, -9820, -10215, -10539, +-9277, -7088, -5868, -5716, -7096, -9111, -9215, -8630, -8767, -9116, -9499, -7555, -4578, -2712, -1279, -360, +-57, 878, 1531, 1688, 1611, 950, 1158, 2236, 2664, 3388, 5378, 6475, 4963, 1666, -2251, -5335, +-6286, -5509, -3305, -1332, -1178, -1002, -215, 1202, 2801, 3377, 4830, 7554, 9080, 9924, 10183, 9543, +9799, 11061, 11524, 11517, 12160, 12332, 11017, 7293, 1719, -2919, -5745, -8207, -9436, -10522, -10691, -8593, +-6419, -5485, -6343, -8214, -8403, -7780, -8456, -9347, -9839, -9205, -6976, -4696, -3001, -1709, -1096, -48, +1495, 1788, 973, 1165, 1791, 1440, 1290, 2006, 4254, 6578, 6581, 4909, 1567, -2521, -5009, -5690, +-4467, -2608, -2387, -1987, -619, 43, 521, 1818, 3138, 4979, 7433, 8814, 8978, 9452, 9752, 10299, +10704, 10509, 11820, 13215, 12921, 11018, 6906, 2053, -1681, -4936, -7429, -9590, -11178, -9991, -7464, -6352, +-6585, -7427, -7799, -7503, -7872, -9004, -9859, -10133, -9245, -6699, -4650, -4182, -2888, -969, 420, 842, +532, 1150, 1774, 1009, 478, 592, 2079, 4919, 6650, 6719, 4881, 686, -3064, -4245, -4533, -4494, +-3502, -2575, -2053, -916, -686, -329, 1138, 2820, 5149, 6845, 7338, 8535, 9531, 9548, 9557, 9550, +10613, 12605, 13466, 13070, 10729, 6564, 2886, -350, -4116, -7767, -10124, -10354, -8831, -7406, -7300, -7231, +-7273, -7583, -7161, -7710, -9633, -10557, -9940, -8239, -6840, -6275, -4409, -2338, -1173, -249, 306, 878, +1764, 1330, 389, 191, 570, 2188, 5782, 7818, 6516, 4062, 728, -2038, -3181, -4156, -4175, -3263, +-2562, -1371, -998, -1421, -388, 1445, 3189, 4844, 5884, 7424, 9125, 9392, 9168, 9039, 9454, 11380, +13722, 14261, 12789, 10515, 7718, 4765, 688, -4335, -7506, -8865, -9334, -8206, -7377, -7323, -7329, -7005, +-6288, -6847, -8926, -9709, -9542, -9344, -8614, -7630, -6064, -3961, -2502, -1893, -322, 721, 853, 1798, +1514, -231, -722, 390, 3373, 6647, 7307, 6169, 3879, 817, -1131, -2784, -4227, -3983, -3027, -2080, +-1716, -2241, -1715, -86, 1252, 2444, 4098, 5630, 7407, 9009, 8874, 7952, 8149, 9619, 12413, 13967, +13173, 12517, 11484, 8944, 5203, 464, -3845, -6863, -8553, -8141, -7910, -8468, -8024, -6686, -6220, -6721, +-7791, -9037, -9115, -9448, -10280, -9082, -7436, -6517, -4695, -3200, -2353, -948, 262, 1517, 1823, 110, +-1240, -1070, 530, 3818, 6306, 6742, 5766, 3740, 1500, -734, -2990, -3991, -3268, -2700, -2676, -2470, +-2386, -1863, -380, 559, 1715, 3447, 5375, 7754, 8694, 7452, 7065, 8263, 10421, 12218, 12822, 13345, +13344, 12149, 10035, 6361, 922, -3403, -5330, -6726, -7754, -8446, -8692, -7113, -5967, -6772, -6930, -7160, +-8294, -8973, -9610, -9754, -8871, -7842, -6216, -4739, -4249, -2839, -709, 1096, 2015, 1306, -415, -1358, +-887, 1343, 4340, 6100, 6311, 6101, 4410, 1649, -553, -2273, -2926, -2605, -2733, -2658, -2478, -2487, +-1442, -659, -324, 995, 3525, 6359, 7633, 7062, 6704, 7481, 8523, 10234, 12144, 12532, 13012, 14052, +13244, 10471, 5978, 905, -1744, -3753, -6749, -8227, -8220, -7805, -6911, -6691, -6577, -6744, -7643, -8202, +-8822, -9960, -10047, -8939, -7628, -6592, -6032, -5124, -2911, -417, 1145, 1693, 357, -1529, -1578, -469, +1262, 3850, 5579, 6464, 5993, 3753, 1509, -524, -2049, -2480, -2661, -3062, -3216, -2803, -2065, -1816, +-2341, -1446, 1449, 3735, 5297, 6498, 6082, 6033, 7330, 8427, 9823, 10989, 11596, 13747, 15020, 13027, +9675, 5903, 2428, -798, -4137, -6409, -7518, -8197, -7719, -6834, -6662, -6774, -6769, -7242, -8071, -9364, +-10270, -9567, -8392, -7915, -7201, -6738, -5664, -2560, 122, 1262, 899, -554, -1354, -1357, -703, 1252, +3841, 5733, 6551, 5799, 3738, 1562, -174, -1143, -1730, -3120, -3593, -2254, -2082, -2794, -2824, -2720, +-1119, 1712, 3479, 4982, 5527, 5210, 6267, 7663, 7984, 8642, 10249, 12823, 14663, 14388, 12856, 10433, +6780, 3061, -124, -3383, -5954, -7252, -7689, -7298, -6897, -6950, -6235, -6154, -7384, -8325, -9477, -9950, +-9014, -8186, -8049, -8231, -7652, -5184, -1935, 105, 815, 456, -652, -1418, -1536, -799, 1459, 3821, +5745, 6788, 5233, 3017, 2478, 1065, -956, -2106, -2971, -2504, -1764, -2514, -3157, -3391, -3029, -779, +1902, 3289, 3841, 4561, 5891, 6817, 6462, 6744, 8664, 10870, 12786, 14349, 14408, 13099, 10824, 7323, +4104, 526, -3279, -5236, -6457, -7416, -7342, -6912, -6482, -5984, -6268, -7307, -8623, -9529, -9169, -8323, +-8568, -9085, -8891, -7576, -4740, -1971, -344, 664, 73, -1138, -1173, -1865, -1494, 1690, 4371, 5547, +5717, 4718, 4052, 3063, 786, -1015, -1854, -2269, -1902, -1756, -2691, -3961, -4199, -2410, 49, 1181, +1880, 3730, 5161, 5633, 5801, 5579, 6649, 8593, 10482, 12889, 14314, 14031, 13308, 11453, 8077, 4410, +823, -2289, -4536, -6244, -7182, -7195, -6867, -5988, -5449, -6540, -7960, -8623, -8852, -8203, -8462, -9503, +-9323, -9052, -7829, -4409, -2023, -816, 422, 154, -1126, -2166, -2406, -503, 2252, 3814, 4918, 5618, +5353, 4392, 2912, 1025, -660, -1645, -1473, -729, -1955, -3899, -4026, -3276, -1980, -669, 279, 2112, +3984, 4702, 5277, 5280, 4997, 6241, 8604, 10746, 12607, 13847, 14384, 13886, 11682, 8451, 5123, 1474, +-1395, -3546, -6051, -7199, -6906, -6189, -5021, -5686, -7487, -7618, -7845, -8327, -7947, -8592, -9811, -9781, +-9067, -7347, -4817, -2488, -230, 669, -523, -2053, -2337, -1629, -92, 1745, 3445, 5134, 5500, 5300, +5085, 3040, 511, -309, -381, -322, -1105, -2782, -3433, -3325, -3311, -2373, -938, 251, 2007, 3873, +4754, 4671, 4234, 4675, 6550, 8391, 10316, 12512, 13707, 14603, 14413, 11833, 8910, 5732, 2274, -204, +-3422, -6474, -6530, -5691, -5528, -5347, -6219, -7338, -7480, -7448, -7545, -8181, -9317, -9908, -9688, -9453, +-7950, -4888, -1908, -128, -457, -1557, -1861, -2347, -2089, -107, 1518, 2874, 4647, 5790, 5941, 4548, +2073, 966, 859, 172, -676, -1477, -2650, -3401, -3531, -3372, -2589, -1678, 16, 2480, 3546, 3821, +3968, 3523, 4397, 6186, 7560, 9876, 12133, 13544, 15004, 14261, 11450, 9390, 6846, 3149, -515, -3712, +-5681, -5875, -5443, -5234, -5565, -6804, -7251, -6842, -7115, -7757, -8433, -9210, -9742, -10656, -10357, -7499, +-4540, -2353, -662, -750, -1822, -2469, -2497, -1570, -489, 445, 2650, 5302, 5969, 5030, 3759, 2476, +1866, 1224, 313, -412, -1818, -2742, -2777, -3656, -3948, -2953, -1811, 348, 2377, 2849, 3480, 3557, +3093, 4227, 5644, 6890, 9483, 12398, 13961, 14456, 13815, 12387, 10478, 7332, 3613, 10, -3411, -4975, +-4845, -4881, -5188, -5958, -6550, -6298, -6713, -7359, -7071, -7714, -9367, -10421, -10830, -9972, -7581, -4643, +-1965, -756, -1627, -2313, -1860, -1962, -2085, -1286, 674, 3535, 5036, 5180, 4940, 3656, 2815, 2819, +1591, 287, -340, -1494, -1948, -2686, -4196, -4115, -2907, -1688, 347, 2077, 2415, 2836, 3252, 3161, +3549, 4685, 6910, 9796, 11783, 13244, 14243, 13867, 12871, 11065, 7700, 3855, -50, -2860, -3573, -4299, +-5264, -5268, -5580, -6524, -6841, -6683, -6581, -6836, -8200, -9609, -10462, -11389, -10449, -7282, -4347, -2588, +-2200, -2136, -1631, -2211, -3094, -2452, -1444, 729, 3652, 4527, 4529, 4394, 3640, 3417, 2935, 1200, +312, 74, -1020, -2023, -3026, -4321, -4262, -2955, -1432, 88, 1055, 2061, 2994, 2610, 2237, 3012, +4333, 6733, 9327, 11207, 12999, 13841, 13906, 13698, 11496, 7374, 3849, 984, -1701, -3343, -4239, -4600, +-4790, -6004, -6654, -6220, -6293, -6438, -6656, -7887, -9592, -11377, -11645, -9186, -6958, -5155, -2996, -2157, +-1874, -1646, -2714, -3414, -2596, -1185, 1329, 3633, 3997, 4204, 4691, 4189, 3565, 2832, 1642, 963, +441, -438, -1664, -3466, -4264, -3429, -2752, -1708, -169, 1076, 2281, 2582, 1948, 2016, 2712, 4034, +6772, 9226, 10496, 12383, 14291, 14800, 13857, 11120, 7945, 4946, 1353, -1341, -2383, -3400, -4155, -4924, +-5843, -5952, -6357, -6243, -5188, -6132, -8615, -10176, -11230, -10958, -9030, -7360, -5386, -3111, -2167, -1843, +-2033, -3419, -3820, -2483, -796, 1090, 2740, 3619, 4389, 4504, 4194, 3824, 2539, 1756, 1736, 860, +-523, -1976, -3421, -3799, -3513, -3162, -1733, -77, 817, 2007, 2324, 1319, 1210, 2423, 4257, 6293, +7804, 9883, 12816, 14274, 14583, 13902, 11533, 8543, 4935, 1692, -54, -1853, -3424, -3513, -4528, -6220, +-6333, -5792, -5118, -4903, -6733, -8970, -10133, -11029, -10761, -9189, -7696, -5620, -3147, -2079, -2084, -2990, +-3771, -3384, -2595, -1074, 988, 2209, 3300, 4475, 4514, 3964, 3428, 2685, 2568, 2227, 725, -450, +-1673, -3364, -3832, -3439, -3152, -1945, -264, 1208, 2015, 1116, 716, 1691, 2493, 3604, 5312, 7320, +10149, 12420, 13840, 15181, 14248, 11330, 8876, 5844, 2406, 357, -1153, -2319, -3279, -5119, -6323, -5638, +-4927, -4576, -4942, -6873, -8789, -9966, -10689, -10521, -9824, -7959, -5063, -3191, -2482, -2399, -3312, -3855, +-3123, -2321, -1088, 565, 1935, 3606, 4550, 3955, 3707, 3894, 3286, 2994, 2502, 1224, -56, -1657, +-2833, -3325, -4045, -3449, -1320, 134, 958, 1069, 755, 1301, 1514, 1562, 3362, 5158, 6615, 9492, +12330, 13939, 14789, 13992, 11811, 9312, 5809, 2829, 1407, -201, -1964, -3685, -5382, -5902, -5382, -4566, +-4233, -5443, -7209, -8289, -9747, -11014, -10855, -9957, -7905, -5105, -3476, -3048, -3207, -3932, -3745, -2991, +-2915, -1669, 475, 2032, 3240, 3728, 3652, 3802, 3511, 3407, 3444, 2228, 1059, 381, -1204, -2834, +-4086, -4362, -2559, -1090, -750, 316, 1018, 474, 621, 1161, 1535, 2758, 4140, 6202, 9357, 11746, +13511, 14790, 14131, 11868, 8907, 6040, 4048, 2249, 240, -1581, -3905, -5563, -5269, -4710, -4473, -4421, +-5378, -6893, -8096, -9897, -11103, -10938, -10018, -7517, -4835, -4036, -3778, -3472, -3688, -3720, -3749, -3101, +-1293, 230, 1758, 3303, 3344, 3332, 3833, 3856, 3803, 3158, 2105, 2030, 1107, -1664, -3301, -3530, +-3552, -2529, -1363, -595, 290, 391, 338, 850, 816, 986, 2238, 3934, 6151, 8753, 11403, 14052, +14890, 13722, 11837, 9244, 6677, 5183, 3260, 553, -1633, -3692, -4802, -4569, -4477, -4313, -4201, -5323, +-6494, -7809, -10060, -11394, -11013, -9449, -7071, -5530, -4550, -3503, -3726, -4106, -3878, -3942, -3175, -1405, +187, 1806, 2737, 2597, 3562, 4475, 3618, 3268, 3572, 3168, 2361, 599, -1538, -2753, -3483, -3392, +-2171, -1373, -764, 4, 423, 701, 397, 152, 991, 2035, 3049, 5489, 8497, 11304, 14017, 14704, +13345, 11647, 9525, 7635, 6096, 3472, 700, -1404, -3486, -4364, -4164, -4297, -4113, -4117, -4696, -5856, +-8440, -10613, -10957, -10699, -9525, -7334, -5837, -4693, -3785, -4061, -4145, -4142, -4600, -3254, -1080, -186, +837, 2229, 3052, 3599, 3514, 3362, 3978, 3919, 3351, 2458, 594, -1449, -2817, -3329, -2769, -2177, +-1874, -671, 246, 142, 346, 342, 44, 641, 1289, 2356, 5015, 8194, 11362, 13913, 14020, 12960, +11875, 10077, 8533, 6660, 3776, 1043, -1378, -2953, -3505, -4304, -4496, -3376, -3281, -4487, -6115, -8550, +-10243, -10631, -10771, -9419, -7370, -6333, -4954, -3657, -4136, -4731, -4666, -4005, -2760, -1911, -734, 1142, +2265, 2636, 3067, 3301, 3813, 4244, 4147, 3969, 2738, 322, -1198, -2124, -3064, -2828, -2177, -1695, +-615, 9, 64, 504, 272, 13, 344, 410, 1796, 4831, 8122, 11322, 13279, 13448, 12971, 11887, +10748, 9722, 7054, 3720, 1691, -458, -2541, -3612, -4255, -3678, -2593, -3186, -4414, -5855, -8427, -9992, +-10306, -10335, -9512, -7908, -5953, -4405, -4449, -4941, -4577, -4316, -4041, -3239, -2121, -360, 1110, 1610, +2383, 2957, 2929, 3766, 4730, 4432, 3851, 2634, 601, -750, -2112, -2980, -2592, -2271, -1680, -715, +-449, -106, 368, 139, -177, -512, -313, 1718, 4535, 7653, 11125, 12555, 12464, 12757, 12443, 11256, +9762, 7046, 4570, 2598, -390, -2615, -3402, -3766, -3261, -2494, -2874, -4312, -6425, -8165, -9182, -10411, +-10787, -9306, -7425, -5939, -5131, -5074, -4732, -4510, -4896, -4368, -3075, -2216, -587, 1069, 1450, 1942, +2382, 2985, 4259, 4719, 4425, 4080, 2685, 896, -552, -2039, -2610, -2301, -2076, -1475, -1061, -691, +371, 574, -248, -504, -978, -942, 1513, 4658, 7760, 10474, 11573, 12402, 13228, 12528, 11324, 10107, +7916, 5355, 2667, 5, -1987, -3302, -3224, -2100, -2076, -3128, -4265, -5823, -7683, -9451, -10747, -10244, +-8578, -7680, -6405, -5059, -5013, -4924, -4748, -4944, -4392, -3510, -2263, -356, 649, 942, 1653, 2246, +3145, 4302, 4587, 4626, 4134, 2662, 1104, -599, -2165, -2070, -1935, -2354, -1670, -1057, -637, 389, +463, -333, -1189, -2062, -1144, 1697, 4368, 6924, 9501, 11351, 12456, 12632, 12330, 11853, 10283, 8143, +5966, 2999, -167, -1951, -2624, -2457, -2020, -2521, -2885, -3500, -5930, -8222, -9452, -10405, -10117, -8988, +-7818, -6332, -5502, -5386, -4972, -5149, -5339, -4660, -3679, -2267, -722, -91, 509, 1328, 1897, 3237, +4200, 4276, 4839, 4376, 2439, 999, -461, -1740, -1934, -2204, -2318, -1790, -1355, -384, 747, 327, +-1057, -2184, -2164, -802, 1050, 3472, 6515, 8997, 10593, 12083, 12540, 12136, 11832, 10715, 8842, 6289, +2564, 0, -1029, -2250, -2649, -1974, -1879, -2339, -3823, -6127, -7848, -9391, -10369, -9939, -9066, -8038, +-6554, -5771, -5415, -5208, -5728, -5493, -4631, -3886, -2244, -979, -718, 282, 1173, 1595, 2927, 4151, +4747, 5005, 4068, 2635, 1342, -305, -1312, -1608, -2027, -2485, -2204, -1002, 512, 729, -371, -1265, +-2055, -2381, -1012, 913, 3090, 5986, 8368, 10362, 11829, 11838, 12095, 12733, 11408, 8905, 6137, 3219, +943, -986, -2275, -2000, -1470, -1675, -2137, -3742, -5905, -7558, -9269, -10013, -9707, -9339, -7949, -6403, +-6032, -5527, -5531, -6126, -5519, -4480, -3794, -2495, -1440, -691, 35, 447, 1459, 3057, 4189, 4713, +4826, 4113, 2784, 1294, 95, -431, -1418, -2748, -2519, -1560, -649, 478, 513, -549, -1425, -2409, +-2312, -887, 354, 2564, 5846, 8193, 9626, 10806, 11806, 12902, 12849, 11215, 9392, 6798, 3697, 1369, +-648, -1645, -1300, -1264, -1273, -1827, -3833, -5591, -7097, -9045, -9696, -9525, -9190, -7690, -6366, -6006, +-5988, -6141, -5970, -5363, -4848, -3946, -2483, -1478, -1017, -456, 291, 1626, 2942, 3917, 5004, 4913, +3551, 2873, 2164, 759, -322, -1675, -2530, -2001, -1347, -313, 782, 249, -935, -1485, -2136, -2342, +-1589, 77, 2983, 5489, 7043, 9039, 10713, 11849, 12908, 12684, 11626, 9999, 6981, 4089, 1875, -394, +-980, -642, -844, -965, -1764, -3569, -5252, -6938, -8605, -9564, -9625, -8735, -7297, -6579, -6408, -6127, +-6170, -6183, -5773, -5042, -3703, -2568, -2166, -1217, -507, -301, 1288, 3150, 4203, 4708, 4236, 3619, +3478, 2383, 817, -231, -1677, -2483, -1838, -866, 60, 361, -175, -459, -1485, -2919, -2739, -1507, +248, 2629, 4434, 6425, 8774, 10156, 11689, 12970, 12748, 11957, 10224, 7239, 4412, 2078, 311, -368, +-344, -390, -715, -1734, -3161, -4701, -6832, -8731, -9388, -9223, -8425, -7396, -6937, -6269, -6152, -6821, +-6344, -5489, -5091, -3997, -2763, -2186, -1659, -1412, -481, 1706, 3181, 3752, 4371, 4275, 3966, 3679, +2609, 1234, -531, -2092, -1873, -1221, -1027, -67, 460, 248, -487, -2271, -3102, -2468, -1676, -94, +2031, 3835, 5914, 8130, 9842, 11463, 12783, 13032, 12229, 10264, 7511, 4773, 2334, 733, 312, -19, +-348, -435, -1312, -2642, -4636, -7093, -8318, -8786, -9286, -8496, -7193, -6874, -6666, -6643, -6759, -6288, +-5925, -5269, -3644, -2850, -2813, -2317, -1604, -242, 1499, 2616, 3683, 4090, 3844, 4423, 4179, 2527, +921, -719, -1535, -1505, -1662, -1026, 282, 562, -1, -1013, -2409, -3026, -2604, -1768, -443, 1330, +3221, 5307, 7367, 9222, 11255, 12584, 12988, 12550, 10407, 7571, 5052, 2763, 1352, 567, -234, 15, +228, -1166, -2842, -4449, -6571, -8059, -8863, -8994, -7995, -7392, -7255, -6692, -6756, -7076, -6605, -5924, +-4705, -3677, -3558, -2950, -2464, -2007, -229, 1442, 2327, 3117, 3611, 4412, 4974, 3945, 2377, 1177, +-240, -1389, -1765, -1512, -615, 434, 563, -174, -1308, -2471, -2750, -2564, -1963, -525, 930, 2576, +4818, 6716, 8706, 11061, 12587, 13269, 12614, 10164, 7882, 5960, 3265, 1375, 756, 468, 554, 122, +-1093, -2230, -4245, -6609, -7732, -8468, -8557, -7967, -7582, -6911, -6839, -7529, -7178, -6488, -5886, -4684, +-3900, -3731, -3408, -2974, -1712, 6, 875, 1543, 2802, 3998, 4554, 4647, 3931, 2815, 1493, -206, +-1367, -1691, -1235, -69, 511, 217, -209, -1361, -2482, -2650, -2593, -2049, -729, 420, 2106, 4244, +5835, 8245, 11175, 12568, 12840, 12302, 10594, 8598, 5940, 3242, 2075, 1206, 618, 810, 410, -508, +-2171, -4523, -6061, -7322, -8526, -8346, -7684, -7406, -7134, -7346, -7572, -7265, -6674, -5679, -4604, -4376, +-4490, -3701, -2619, -1646, -680, 211, 1474, 2880, 3769, 4482, 4643, 4047, 3172, 1459, -461, -1175, +-1259, -856, 174, 482, 235, -229, -1520, -2404, -2413, -2742, -2278, -787, 163, 1444, 3292, 5514, +8524, 10680, 11880, 12974, 12509, 10786, 8631, 6036, 4032, 2453, 1158, 1229, 1407, 593, -449, -2023, +-4045, -5901, -7338, -8083, -7923, -7608, -7398, -7173, -7591, -8029, -7358, -6238, -5435, -5095, -5082, -4411, +-3461, -2878, -2053, -1089, -73, 1508, 2709, 3404, 4511, 4951, 4365, 3263, 1329, -357, -779, -1028, +-588, 573, 574, 221, -145, -1312, -2140, -2630, -2564, -1535, -1129, -723, 972, 3053, 5444, 8017, +10136, 12254, 13127, 12292, 11047, 9204, 6608, 4262, 2769, 1974, 1834, 1670, 1085, 136, -1621, -3808, +-5449, -6824, -7722, -7570, -7120, -7001, -7488, -8156, -7741, -6681, -6167, -5681, -5358, -5094, -4189, -3571, +-3363, -2342, -1148, -172, 1230, 2227, 3324, 4917, 5068, 4327, 3308, 1263, -234, -703, -676, 18, +392, 495, 758, -200, -1614, -2139, -2266, -1981, -1906, -1959, -938, 737, 2391, 4748, 7628, 10051, +11797, 12731, 12548, 11398, 9228, 6631, 4698, 3191, 2215, 2179, 2139, 1445, 299, -1480, -3378, -5234, +-6859, -7155, -6795, -7066, -7503, -7896, -8138, -7396, -6657, -6574, -5919, -5382, -5117, -4337, -4130, -3676, +-2324, -1591, -731, 734, 1968, 3482, 4742, 5032, 4657, 2867, 940, 129, -424, -593, -121, 524, +994, 536, -768, -1502, -1645, -2019, -2346, -2253, -2016, -1375, -63, 1855, 4431, 7027, 9344, 11594, +12772, 12408, 11249, 9229, 6902, 4912, 3344, 2721, 2638, 2159, 1676, 833, -1286, -3465, -5105, -6387, +-6452, -6577, -7470, -7667, -7885, -7967, -7320, -7102, -6733, -5774, -5576, -5357, -4767, -4340, -3502, -2861, +-2120, -810, 254, 1574, 3567, 4919, 5059, 4172, 2690, 1391, 276, -619, -499, 473, 880, 610, +138, -520, -1172, -1639, -2036, -2097, -2329, -2559, -1721, -298, 1401, 3719, 6358, 9090, 11417, 12413, +12378, 11469, 9218, 6999, 5422, 3704, 2958, 2910, 2525, 2316, 970, -1541, -3302, -4668, -5666, -5935, +-6812, -7452, -7492, -7861, -7920, -7674, -7160, -6348, -6098, -5986, -5307, -4896, -4547, -3753, -2931, -2322, +-1554, -243, 1816, 3801, 4639, 4687, 4359, 3008, 1133, 8, -255, 217, 620, 622, 676, 279, +-593, -1073, -1360, -1858, -2271, -2693, -2685, -1850, -942, 714, 3447, 5868, 8611, 11239, 12237, 12290, +11313, 9180, 7480, 5615, 3766, 3411, 3386, 3305, 2705, 698, -1403, -2845, -4074, -5019, -6000, -6736, +-6950, -7490, -8028, -7818, -7398, -7053, -6558, -6124, -5867, -5593, -5134, -4340, -3518, -3406, -3144, -1705, +104, 1833, 3374, 4543, 5128, 4339, 2490, 1126, 501, 138, 404, 783, 750, 727, 194, -359, +-496, -1315, -1959, -2021, -2690, -2826, -2078, -1330, 477, 2850, 5354, 8622, 10999, 11970, 12238, 11258, +9611, 7717, 5500, 4206, 4010, 4154, 3894, 2522, 672, -747, -2202, -3724, -4747, -5492, -6338, -7019, +-7444, -7746, -7693, -7455, -6896, -6210, -6258, -6350, -5618, -4648, -4150, -4164, -4017, -2983, -1603, -389, +1528, 3662, 4749, 5003, 4030, 2421, 1411, 575, 338, 959, 806, 633, 929, 355, -112, -472, +-1233, -1541, -2092, -2890, -2759, -2436, -1723, -18, 2281, 5235, 8231, 10368, 11746, 12143, 11407, 9769, +7417, 5480, 4845, 4843, 4454, 3756, 2709, 1064, -570, -2027, -3267, -4265, -5399, -6284, -6727, -7369, +-7975, -7783, -7093, -6673, -6749, -6949, -6168, -5150, -5018, -4768, -4333, -4090, -3312, -2267, -760, 1772, +3492, 4454, 4920, 3684, 2226, 1492, 793, 789, 908, 704, 935, 817, 308, 93, -371, -989, +-1520, -2230, -2685, -2917, -2905, -2120, -476, 1929, 4799, 7543, 9793, 11669, 12375, 11192, 9179, 7379, +6078, 5398, 5028, 4716, 4147, 2797, 1110, -166, -1473, -2977, -4086, -5016, -5813, -6772, -7811, -7707, +-6996, -7168, -7227, -6955, -6687, -5874, -5527, -5323, -4566, -4596, -4628, -3685, -2650, -777, 1642, 3402, +4566, 4463, 3335, 2423, 1595, 996, 986, 973, 951, 898, 752, 633, 312, -257, -842, -1345, +-2012, -2606, -3087, -3303, -2397, -536, 1488, 3952, 7013, 9950, 11739, 11867, 10721, 9282, 7699, 6342, +5879, 5605, 5002, 4177, 2930, 1684, 331, -1587, -2587, -3140, -4701, -6024, -6871, -7279, -6957, -7265, +-7604, -7031, -6859, -6677, -6006, -5622, -5115, -4793, -4942, -4744, -4206, -2964, -705, 1576, 3291, 4175, +4122, 3379, 2385, 1587, 1264, 1232, 1040, 902, 964, 889, 778, 426, -250, -705, -980, -1799, +-2917, -3433, -3192, -2331, -1220, 546, 3599, 6979, 9568, 11292, 11480, 10487, 9207, 7640, 6874, 6540, +5507, 5083, 4754, 3279, 1692, 180, -926, -1516, -3138, -4960, -5696, -6330, -6851, -7113, -7447, -7297, +-7115, -7035, -6626, -6150, -5614, -5074, -4912, -5207, -5301, -4559, -2927, -752, 1306, 3023, 3992, 3821, +3078, 2357, 1803, 1474, 1354, 1026, 899, 1177, 1156, 654, 228, 8, -155, -960, -2264, -2805, +-3056, -3334, -2905, -1969, 161, 3422, 6349, 9212, 11082, 10731, 9969, 9244, 8063, 7156, 6290, 5865, +5904, 4698, 2920, 1793, 829, -175, -1591, -3266, -4460, -5354, -6150, -6712, -7086, -7327, -7332, -7199, +-7134, -6811, -6196, -5450, -5061, -5337, -5750, -5598, -4755, -3161, -897, 1201, 2736, 3604, 3494, 2863, +2471, 2038, 1538, 1186, 1024, 1376, 1317, 706, 752, 728, 295, -175, -1240, -1929, -2239, -3288, +-3665, -3161, -2470, -298, 3049, 6334, 9027, 10055, 10233, 10255, 9271, 7899, 7145, 6918, 6659, 5746, +4412, 3299, 2403, 1299, 22, -1404, -2914, -4128, -5070, -5866, -6533, -6947, -7145, -7204, -7398, -7387, +-6732, -5933, -5438, -5248, -5592, -6131, -5878, -4914, -3252, -966, 1009, 2478, 3129, 3039, 3150, 2669, +1687, 1546, 1471, 1374, 1403, 906, 941, 1351, 709, 190, -101, -927, -1594, -2384, -3180, -3668, +-3985, -3019, -285, 2941, 5745, 8051, 9715, 10357, 9837, 8721, 8021, 7773, 7341, 6592, 5691, 4698, +3744, 2779, 1607, 301, -1154, -2568, -3703, -4780, -5767, -6237, -6541, -7085, -7344, -7487, -7365, -6564, +-5838, -5383, -5358, -5985, -6269, -6135, -5334, -3073, -935, 483, 2027, 2895, 3207, 3140, 2143, 1800, +2078, 1609, 1229, 1217, 1261, 1372, 1125, 815, 558, -100, -816, -1189, -1916, -3274, -4413, -4328, +-2822, -543, 2102, 5104, 7917, 9458, 9647, 9221, 8758, 8438, 8074, 7437, 6655, 5844, 4939, 4119, +3158, 1807, 646, -626, -2265, -3519, -4584, -5389, -5801, -6469, -6999, -7413, -7731, -7069, -6290, -5919, +-5189, -5363, -6339, -6638, -6396, -5044, -3036, -1615, 120, 2007, 2885, 2940, 2686, 2469, 2332, 1908, +1467, 1416, 1358, 1281, 1436, 1503, 1009, 321, 31, 13, -609, -2172, -3704, -4338, -4154, -3237, +-1227, 1803, 5063, 7570, 8727, 9052, 9107, 8871, 8715, 8308, 7359, 6744, 6151, 5234, 4358, 3272, +2251, 1167, -503, -1913, -3146, -4411, -4789, -5412, -6563, -7023, -7488, -7656, -7010, -6347, -5507, -5096, +-5885, -6749, -6736, -6171, -5195, -3752, -1786, 253, 1590, 2286, 2736, 2802, 2434, 2134, 1984, 1630, +1230, 1205, 1630, 1783, 1193, 523, 572, 788, 269, -876, -2271, -3485, -4269, -4655, -3731, -1343, +1572, 4667, 6918, 7910, 8587, 8969, 8971, 8803, 8071, 7545, 7098, 6104, 5453, 4633, 3379, 2689, +1462, -376, -1718, -2898, -3794, -4432, -5425, -6332, -6976, -7655, -7748, -6909, -5838, -5378, -5685, -6187, +-6538, -6800, -6657, -5474, -3619, -1849, -275, 1182, 2227, 2559, 2499, 2490, 2481, 1942, 1227, 1326, +1862, 1868, 1436, 885, 897, 1213, 863, 258, -564, -2020, -3383, -4522, -5015, -3807, -1474, 1490, +4296, 5935, 7395, 8466, 8636, 8957, 8813, 8086, 7786, 7275, 6338, 5611, 4829, 4023, 3061, 1509, +-114, -1343, -2416, -3414, -4200, -4945, -6050, -7263, -7783, -7212, -6382, -5914, -5658, -5595, -6085, -6874, +-7127, -6540, -5372, -3901, -2227, -312, 1053, 1651, 2310, 2800, 2687, 2135, 1433, 1520, 2064, 1867, +1512, 1339, 1113, 1296, 1257, 970, 698, -374, -1760, -3401, -5095, -5072, -3601, -1626, 1107, 3600, +5357, 6990, 8118, 8531, 8723, 8627, 8339, 7899, 7176, 6375, 5838, 5253, 4270, 3040, 1729, 325, +-1182, -2317, -2869, -3555, -4953, -6495, -7280, -7374, -7096, -6493, -5853, -5435, -5727, -6557, -6958, -7065, +-6874, -5702, -3992, -2274, -808, 174, 1501, 2707, 2586, 2110, 1724, 1642, 2000, 1837, 1581, 1547, +1213, 1260, 1384, 1069, 1238, 1165, -157, -1954, -3807, -5123, -5043, -3732, -1786, 549, 2920, 4965, +6594, 7578, 8100, 8535, 8717, 8354, 7667, 7149, 6798, 6161, 5297, 4495, 3566, 1939, 153, -870, +-1485, -2304, -3557, -5081, -6197, -7007, -7455, -6892, -6081, -5745, -5577, -5911, -6401, -6961, -7617, -6938, +-5370, -4115, -2846, -1489, 235, 1892, 2259, 2072, 1995, 1740, 1935, 2093, 1618, 1520, 1651, 1376, +1135, 1243, 1502, 1778, 1439, -10, -2083, -3925, -4953, -4859, -3861, -2143, 105, 2572, 4600, 5956, +7020, 8028, 8621, 8462, 8063, 7885, 7374, 6650, 6248, 5822, 4982, 3496, 1709, 663, -106, -1189, +-2056, -3273, -4865, -6209, -7184, -7051, -6456, -6266, -5742, -5361, -5775, -6636, -7531, -7434, -6408, -5741, +-4799, -3233, -1545, 331, 1675, 1813, 1749, 2013, 2048, 1917, 1874, 1819, 1772, 1623, 1268, 1077, +1391, 2021, 2304, 1659, -3, -2085, -3712, -4646, -4842, -4114, -2314, 56, 2068, 3772, 5570, 6912, +7696, 8286, 8421, 8318, 7775, 7003, 7009, 6895, 5984, 4868, 3427, 2165, 1125, 27, -584, -1450, +-3208, -4856, -6093, -6737, -6805, -6787, -6088, -5183, -5436, -6274, -6865, -7269, -7138, -6565, -6123, -5216, +-3381, -1409, 54, 975, 1483, 1779, 1966, 1969, 1882, 1975, 2067, 1874, 1470, 1054, 1089, 1719, +2466, 2550, 1566, -69, -1661, -3409, -4766, -4767, -3912, -2399, -486, 1420, 3578, 5174, 6175, 7513, +8370, 8345, 7970, 7512, 7568, 7577, 6863, 6154, 5124, 3601, 2332, 1380, 796, 61, -1536, -3124, +-4279, -5673, -6802, -6808, -6259, -5608, -5262, -5737, -6495, -6786, -6895, -7126, -7132, -6465, -5117, -3341, +-1659, -350, 674, 1365, 1645, 1703, 1743, 1940, 2186, 2144, 1824, 1164, 823, 1507, 2194, 2513, +2580, 1752, 298, -1673, -3625, -4394, -4520, -4160, -2660, -709, 1238, 2913, 4315, 6114, 7539, 7866, +7883, 7779, 7695, 7726, 7515, 7182, 6515, 4946, 3429, 2802, 2102, 986, 24, -1099, -2598, -4246, +-5823, -6724, -6467, -5703, -5452, -5714, -6023, -6242, -6519, -7015, -7518, -7362, -6493, -5161, -3597, -2094, +-571, 535, 1026, 1436, 1438, 1575, 2269, 2444, 1993, 1407, 939, 1220, 1674, 2077, 2865, 2932, +1841, 221, -1626, -3111, -4233, -4804, -4052, -2585, -1143, 509, 2343, 4230, 5956, 6936, 7433, 7836, +7662, 7458, 7933, 8093, 7269, 6106, 5025, 4010, 3160, 2269, 1302, 472, -531, -2354, -4471, -5846, +-6169, -5844, -5633, -5773, -5803, -5832, -5951, -6525, -7396, -7586, -7341, -6676, -5279, -3914, -2443, -711, +301, 712, 878, 1175, 2082, 2488, 2119, 1780, 1370, 1044, 1085, 1560, 2540, 3142, 2731, 1876, +538, -1396, -3173, -4257, -4458, -3848, -3044, -1820, 178, 2099, 3628, 5385, 6802, 7158, 7108, 7386, +7884, 8192, 7981, 7114, 6132, 5327, 4286, 3175, 2406, 1884, 1202, -441, -2595, -4359, -5400, -5548, +-5668, -5962, -5723, -5567, -5695, -5878, -6698, -7479, -7617, -7419, -6680, -5687, -4294, -2296, -854, -306, +135, 731, 1526, 2089, 2197, 2174, 1829, 1069, 821, 1272, 1887, 2597, 3052, 3002, 2327, 639, +-1520, -2870, -3658, -4328, -4217, -3161, -1854, -386, 1576, 3626, 5247, 6246, 6530, 6870, 7587, 8102, +8175, 7750, 7221, 6569, 5333, 4186, 3465, 3030, 2738, 1485, -674, -2408, -3854, -4861, -5307, -5730, +-5805, -5582, -5422, -5365, -5945, -6828, -7226, -7455, -7583, -7093, -5820, -3991, -2420, -1570, -773, 49, +612, 1336, 2136, 2403, 2123, 1458, 897, 1008, 1314, 1644, 2568, 3479, 3219, 1980, 614, -986, +-2679, -3681, -4141, -4083, -3495, -2487, -728, 1430, 3369, 4708, 5370, 6127, 7039, 7497, 7892, 8059, +7864, 7585, 6418, 4921, 4260, 4010, 3705, 2870, 1273, -432, -2078, -3523, -4486, -5280, -5804, -5666, +-5375, -5357, -5626, -6098, -6525, -7121, -7904, -7922, -6949, -5710, -4316, -2928, -1911, -1099, -452, 297, +1459, 2290, 2167, 1691, 1548, 1134, 647, 1082, 2036, 2859, 3351, 3145, 2280, 817, -933, -2275, +-3261, -3867, -4132, -4018, -2653, -562, 1202, 2827, 4021, 4967, 6134, 6808, 7182, 7841, 8382, 8323, +7401, 6027, 5179, 4827, 4519, 4076, 3022, 1445, -79, -1528, -2973, -4270, -5195, -5339, -5147, -5320, +-5415, -5293, -5659, -6474, -7370, -7904, -7689, -6894, -5767, -4364, -2950, -2267, -1770, -499, 711, 1337, +1922, 2241, 1997, 1339, 741, 832, 1332, 2109, 3032, 3446, 3401, 2522, 758, -588, -1634, -2901, +-3893, -4444, -4028, -2428, -670, 787, 2261, 3711, 4985, 5726, 6231, 7148, 8136, 8503, 8130, 7107, +5977, 5439, 5266, 4983, 4251, 2973, 1759, 559, -1245, -3021, -4130, -4728, -5098, -5314, -5297, -5117, +-5013, -5629, -6663, -7310, -7847, -8016, -6942, -5521, -4582, -3752, -2786, -1632, -705, 184, 1358, 2082, +2198, 1787, 991, 767, 922, 1165, 2123, 3240, 3649, 3341, 2319, 1082, 69, -1217, -2821, -4125, +-4445, -3673, -2474, -1233, 373, 2128, 3441, 4371, 5119, 6046, 7307, 8239, 8455, 7869, 6726, 6053, +5975, 5664, 4953, 4255, 3500, 2264, 657, -1111, -2688, -3629, -4463, -5220, -5133, -4903, -5006, -5046, +-5457, -6493, -7693, -8126, -7480, -6737, -5986, -4917, -3985, -2977, -2007, -1148, 218, 1509, 1920, 1905, +1619, 1065, 657, 652, 1285, 2446, 3344, 3517, 3107, 2458, 1758, 569, -1283, -2903, -3809, -4116, +-3738, -2871, -1443, 334, 1789, 2883, 3780, 4674, 5964, 7498, 8331, 8030, 7393, 6937, 6470, 6130, +5696, 5101, 4754, 3885, 2299, 899, -558, -2189, -3538, -4329, -4700, -5071, -4997, -4436, -4659, -5684, +-6781, -7656, -7758, -7398, -7008, -6105, -4987, -4273, -3527, -2409, -1110, 194, 1186, 1720, 1867, 1502, +815, 381, 586, 1609, 2623, 2960, 3160, 3289, 3004, 2047, 434, -1227, -2546, -3626, -4199, -3950, +-2984, -1584, 87, 1433, 2068, 2976, 4551, 6088, 7343, 7793, 7518, 7402, 7035, 6344, 5986, 5889, +5600, 4768, 3814, 2848, 1181, -593, -1832, -3148, -4315, -4889, -4924, -4417, -4169, -4886, -5861, -6658, +-7428, -7833, -7565, -6867, -6061, -5433, -4798, -3766, -2581, -1265, -2, 1003, 1841, 1952, 1173, 422, +385, 1033, 1776, 2209, 2720, 3397, 3694, 3157, 2079, 780, -838, -2257, -3343, -4240, -4037, -2796, +-1397, -104, 649, 1364, 2870, 4665, 6031, 6902, 7532, 7835, 7295, 6715, 6661, 6352, 5957, 5772, +5186, 4166, 2956, 1511, 132, -1366, -3127, -4320, -4472, -4266, -4150, -4292, -4806, -5592, -6723, -7546, +-7650, -7328, -6777, -6297, -5870, -5004, -3879, -2852, -1677, -190, 1248, 1830, 1416, 687, 484, 824, +1045, 1399, 2173, 2837, 3535, 3853, 3188, 2209, 1103, -377, -1999, -3536, -4270, -3705, -2449, -1380, +-888, -92, 1408, 2754, 4104, 5757, 6844, 7238, 7389, 7215, 6875, 6613, 6362, 6273, 6088, 5188, +4124, 3316, 2195, 473, -1560, -3083, -3805, -4133, -4120, -3944, -4090, -4658, -5700, -6831, -7387, -7369, +-7195, -7048, -6632, -5886, -5097, -4330, -3409, -1780, 182, 1085, 1179, 1074, 712, 619, 748, 802, +1245, 2078, 2969, 3607, 3650, 3233, 2519, 1512, -54, -2291, -3776, -3674, -3137, -2687, -1929, -1132, +-359, 888, 2434, 4031, 5494, 6394, 6997, 7340, 7069, 6650, 6591, 6736, 6540, 5793, 5155, 4740, +3860, 2380, 489, -1367, -2744, -3598, -3926, -3867, -3673, -3913, -4832, -5826, -6585, -7023, -7207, -7436, +-7161, -6364, -6060, -5774, -4843, -3406, -1591, -81, 667, 924, 948, 837, 608, 453, 698, 1202, +2088, 3068, 3360, 3362, 3659, 3262, 1555, -415, -2075, -3147, -3351, -3112, -2650, -2090, -1629, -747, +714, 2274, 3716, 5055, 6325, 7028, 6918, 6750, 6908, 6991, 6751, 6283, 5917, 5608, 5133, 4160, +2548, 783, -991, -2543, -3292, -3473, -3340, -3317, -4065, -4911, -5431, -6254, -7078, -7333, -7114, -6727, +-6558, -6486, -6049, -4915, -3219, -1682, -485, 420, 796, 826, 852, 514, 148, 760, 1655, 2051, +2543, 3310, 3968, 4084, 3160, 1550, -214, -1835, -2789, -2968, -2769, -2661, -2544, -1838, -718, 386, +1745, 3451, 5092, 6019, 6387, 6672, 6909, 7098, 6962, 6516, 6350, 6206, 5867, 5417, 4358, 2831, +1063, -986, -2437, -2784, -2863, -3142, -3529, -3889, -4457, -5381, -6348, -7024, -7078, -6781, -6793, -7052, +-6820, -6113, -5036, -3334, -1841, -973, 82, 933, 819, 347, 141, 455, 944, 1196, 1605, 2494, +3536, 4205, 4097, 3245, 1614, -288, -1570, -2192, -2603, -2972, -2924, -2454, -2008, -1309, -13, 1636, +3413, 4666, 5326, 6068, 6651, 6893, 6953, 6652, 6445, 6494, 6285, 5963, 5661, 4825, 3008, 820, +-848, -1826, -2409, -2803, -3115, -3368, -3600, -4373, -5642, -6379, -6588, -6806, -6776, -6926, -7430, -7207, +-6163, -4967, -3798, -2509, -971, 223, 542, 321, 189, 395, 553, 555, 833, 1471, 2430, 3566, +4398, 4290, 2988, 1437, 215, -997, -1979, -2566, -2832, -2712, -2709, -2577, -1578, -69, 1541, 3011, +4044, 5003, 6024, 6641, 6692, 6671, 6702, 6518, 6251, 6319, 6531, 6112, 4853, 3005, 1051, -286, +-1288, -2329, -2667, -2607, -3037, -3638, -4443, -5540, -6211, -6281, -6320, -6831, -7421, -7448, -6955, -6290, +-5466, -4162, -2399, -976, -246, 71, 239, 359, 347, 425, 521, 492, 1163, 2675, 3931, 4424, +3964, 2920, 1853, 493, -882, -1713, -2149, -2497, -2850, -3087, -2782, -1624, -111, 1177, 2368, 3709, +4918, 5690, 6271, 6720, 6671, 6432, 6286, 6252, 6723, 6965, 6040, 4726, 3303, 1493, -125, -1208, +-1908, -2310, -2433, -2735, -3618, -4724, -5428, -5672, -5877, -6494, -7115, -7290, -7273, -7196, -6794, -5665, +-4031, -2647, -1441, -451, -167, 22, 367, 501, 292, -90, 173, 1436, 2880, 3765, 4147, 3984, +3180, 1929, 582, -553, -1212, -1710, -2445, -3188, -3264, -2581, -1723, -587, 878, 2133, 3369, 4581, +5421, 6285, 6764, 6354, 5998, 6287, 6706, 6906, 6853, 6302, 5046, 3441, 1829, 240, -970, -1593, +-1706, -1942, -2810, -3844, -4489, -4825, -5247, -5968, -6461, -6639, -7126, -7474, -7322, -6776, -5681, -4170, +-2687, -1589, -938, -360, 349, 701, 316, -195, -147, 492, 1584, 2793, 3766, 4267, 4140, 3277, +1903, 848, 289, -621, -1663, -2388, -2999, -3055, -2564, -1906, -715, 771, 1865, 2880, 4342, 5724, +6279, 6248, 6127, 6095, 6396, 6865, 7133, 7012, 6367, 5341, 3885, 1976, 344, -560, -816, -1104, +-2071, -2937, -3383, -3983, -4716, -5252, -5696, -6130, -6590, -7093, -7487, -7542, -6957, -5605, -4070, -3071, +-2244, -1157, -102, 403, 294, -46, -332, -190, 505, 1383, 2638, 4025, 4367, 3827, 3068, 2144, +1373, 600, -538, -1596, -2244, -2814, -3225, -2799, -1725, -793, 92, 1274, 2738, 4273, 5361, 5843, +5874, 5726, 5995, 6495, 6882, 7092, 7017, 6684, 5651, 3654, 1755, 750, 154, -563, -1320, -2010, +-2636, -3249, -3922, -4526, -5051, -5599, -5983, -6428, -7271, -7952, -7781, -6731, -5606, -4719, -3674, -2469, +-1156, -56, 95, -148, -185, -438, -549, 107, 1355, 2800, 3896, 4046, 3548, 3138, 2629, 1617, +614, -181, -1233, -2336, -3053, -3047, -2553, -2014, -1253, -241, 1031, 2649, 4125, 5093, 5453, 5397, +5583, 6078, 6347, 6578, 7191, 7550, 6871, 5368, 3699, 2333, 1307, 399, -357, -1084, -1879, -2496, +-3024, -3705, -4481, -4936, -5008, -5538, -6648, -7508, -7882, -7512, -6610, -5997, -5301, -3913, -2376, -1214, +-385, -19, -94, -355, -724, -854, 91, 1660, 2760, 3401, 3754, 3727, 3262, 2566, 1977, 1222, +-12, -1283, -2278, -2788, -2801, -2647, -2295, -1620, -643, 820, 2639, 3964, 4551, 5004, 5423, 5536, +5629, 6063, 6893, 7567, 7460, 6679, 5439, 3993, 2682, 1677, 862, -139, -1064, -1467, -2047, -3021, +-3751, -4171, -4353, -4614, -5593, -6843, -7393, -7387, -7285, -6971, -6299, -5392, -3997, -2521, -1460, -508, +83, -145, -832, -1139, -606, 365, 1391, 2554, 3443, 3666, 3502, 3214, 2918, 2425, 1373, 25, +-1113, -1997, -2542, -2597, -2595, -2653, -2057, -689, 899, 2251, 3337, 4364, 4991, 5037, 5028, 5417, +6250, 7074, 7498, 7502, 6647, 5294, 4229, 3158, 1892, 856, 54, -585, -1162, -2093, -3162, -3557, +-3494, -3948, -4825, -5776, -6669, -7107, -7295, -7479, -7234, -6433, -5399, -4304, -2955, -1336, -313, -298, +-686, -1007, -1072, -699, 178, 1384, 2580, 3209, 3305, 3441, 3510, 3157, 2543, 1531, 134, -1041, +-1678, -2025, -2574, -3079, -2822, -1921, -759, 477, 1840, 3300, 4214, 4459, 4653, 4854, 5265, 6297, +7280, 7540, 7217, 6567, 5630, 4591, 3342, 1925, 1083, 697, -164, -1318, -2268, -2836, -2992, -3217, +-3941, -4913, -5703, -6272, -6989, -7573, -7480, -7056, -6685, -5967, -4541, -2786, -1359, -678, -653, -848, +-1174, -1373, -792, 339, 1389, 2250, 2863, 3230, 3408, 3566, 3518, 2682, 1309, 178, -558, -1183, +-2016, -2831, -2962, -2713, -2227, -1110, 322, 1663, 2953, 3893, 4070, 4052, 4516, 5340, 6440, 7246, +7232, 7039, 6830, 5939, 4505, 3178, 2282, 1697, 923, -201, -1400, -2103, -2257, -2587, -3316, -3992, +-4555, -5418, -6424, -7051, -7318, -7396, -7409, -7157, -6067, -4430, -2916, -1622, -846, -813, -1288, -1594, +-1363, -774, 132, 1270, 2041, 2484, 3006, 3601, 3958, 3453, 2344, 1463, 710, -274, -1162, -1880, +-2648, -3053, -2797, -2280, -1349, 127, 1584, 2820, 3479, 3410, 3579, 4493, 5551, 6278, 6772, 7222, +7386, 6930, 5842, 4471, 3444, 2880, 2152, 841, -407, -1055, -1539, -2108, -2550, -3002, -3533, -4402, +-5474, -6163, -6601, -7166, -7662, -7682, -7144, -6171, -4658, -2817, -1567, -1104, -1121, -1442, -1657, -1476, +-750, 304, 1057, 1465, 2261, 3350, 3848, 3746, 3405, 2643, 1749, 1024, 83, -909, -1743, -2534, +-2958, -2873, -2493, -1507, 152, 1750, 2515, 2715, 3065, 3728, 4510, 5249, 5959, 6699, 7404, 7582, +6754, 5555, 4821, 4187, 3270, 2108, 957, 90, -695, -1498, -1938, -2135, -2640, -3570, -4451, -5013, +-5725, -6515, -7065, -7551, -7808, -7420, -6244, -4578, -2991, -1871, -1293, -1333, -1828, -1873, -1117, -485, +-103, 592, 1404, 2327, 3299, 3726, 3663, 3371, 2764, 2055, 1338, 419, -644, -1494, -2161, -2908, +-3277, -2668, -1230, 258, 1280, 1931, 2378, 2983, 3749, 4238, 4802, 5918, 7012, 7453, 7122, 6413, +5865, 5265, 4332, 3279, 2354, 1436, 248, -699, -1056, -1391, -2035, -2732, -3432, -4175, -4865, -5528, +-6231, -7005, -7773, -7997, -7352, -6306, -4825, -2951, -1899, -1890, -2007, -1966, -1663, -1176, -817, -404, +363, 1319, 2302, 3162, 3599, 3479, 3223, 2929, 2291, 1324, 481, -143, -1085, -2347, -3199, -3290, +-2476, -1102, -64, 627, 1429, 2265, 2843, 3139, 3684, 4849, 6150, 6913, 6985, 6846, 6655, 5994, +5112, 4473, 3722, 2526, 1336, 445, -223, -726, -1255, -1853, -2496, -3362, -4093, -4431, -5184, -6281, +-7013, -7649, -8086, -7618, -6260, -4509, -3074, -2430, -2331, -2184, -1884, -1650, -1366, -1030, -596, 164, +1306, 2388, 2953, 3222, 3546, 3482, 2872, 2217, 1591, 1026, 269, -1076, -2550, -3267, -2942, -2129, +-1374, -599, 413, 1446, 2062, 2182, 2604, 3772, 5017, 5822, 6505, 6976, 6880, 6455, 5999, 5462, +4788, 3736, 2562, 1670, 729, -69, -377, -905, -1837, -2533, -3054, -3638, -4294, -5031, -5936, -6960, +-7897, -8268, -7529, -6020, -4542, -3474, -2855, -2559, -2328, -1970, -1574, -1544, -1497, -734, 297, 1184, +1993, 2712, 3295, 3574, 3296, 2692, 2253, 2093, 1596, 302, -1330, -2505, -2834, -2634, -2370, -1825, +-622, 570, 1053, 1312, 1880, 2629, 3604, 4708, 5702, 6502, 6726, 6601, 6589, 6242, 5520, 4882, +3991, 2727, 1687, 1068, 484, -205, -907, -1627, -2262, -2861, -3442, -3926, -4597, -5767, -7142, -8084, +-8068, -7295, -6033, -4576, -3694, -3308, -2744, -2120, -1888, -1923, -1861, -1428, -685, 119, 903, 1780, +2781, 3422, 3351, 2957, 2769, 2840, 2694, 1702, 63, -1201, -1913, -2620, -2932, -2431, -1510, -529, +151, 627, 1222, 1675, 2262, 3475, 4713, 5481, 6119, 6625, 6680, 6512, 6352, 5904, 5051, 3977, +2930, 2133, 1428, 649, -36, -661, -1393, -2207, -2742, -2905, -3374, -4456, -5748, -7094, -8059, -7976, +-7006, -5889, -4985, -4189, -3359, -2642, -2198, -2101, -2090, -1807, -1293, -828, -223, 771, 1922, 2857, +3123, 2800, 2845, 3397, 3364, 2640, 1640, 498, -688, -1932, -2781, -2715, -2218, -1666, -808, 51, +428, 739, 1444, 2315, 3304, 4410, 5312, 5922, 6255, 6440, 6606, 6472, 5865, 4996, 4110, 3303, +2382, 1522, 951, 276, -732, -1576, -2090, -2442, -2691, -3125, -4220, -5894, -7313, -7864, -7621, -6993, +-6263, -5457, -4449, -3445, -2899, -2678, -2401, -2140, -1825, -1506, -1337, -524, 968, 2003, 2256, 2289, +2625, 3224, 3427, 3098, 2738, 2052, 670, -780, -1767, -2506, -2775, -2319, -1617, -976, -428, 41, +556, 1146, 2000, 3167, 4266, 5057, 5547, 6000, 6517, 6653, 6260, 5799, 5184, 4217, 3303, 2655, +1968, 1154, 344, -576, -1508, -2051, -2047, -2109, -2894, -4391, -6051, -7136, -7398, -7407, -7197, -6435, +-5485, -4458, -3594, -3272, -2944, -2295, -1991, -2148, -2183, -1451, -37, 1058, 1425, 1759, 2400, 2794, +3043, 3418, 3448, 2946, 2099, 905, -451, -1677, -2392, -2419, -2113, -1641, -1081, -563, -123, 252, +866, 1990, 3140, 3892, 4621, 5457, 6033, 6370, 6589, 6467, 5890, 5116, 4388, 3627, 2861, 2252, +1543, 469, -648, -1468, -1618, -1328, -1735, -2989, -4398, -5767, -6724, -7171, -7470, -7297, -6414, -5349, +-4603, -4102, -3449, -2557, -2119, -2530, -2745, -2030, -1046, -215, 617, 1270, 1691, 2113, 2669, 3240, +3525, 3498, 3188, 2360, 1076, -326, -1473, -2071, -2230, -2116, -1587, -994, -760, -517, 129, 954, +1797, 2744, 3705, 4501, 5139, 5871, 6430, 6534, 6416, 5972, 5210, 4511, 3818, 3228, 2763, 1700, +252, -701, -1044, -972, -974, -1668, -2926, -4188, -5315, -6380, -7217, -7557, -7031, -6160, -5734, -5244, +-4089, -3002, -2654, -2741, -2789, -2552, -2024, -1198, -247, 444, 898, 1413, 1998, 2636, 3202, 3569, +3758, 3469, 2467, 1195, -17, -1212, -2016, -2072, -1756, -1512, -1330, -937, -489, -42, 766, 1738, +2500, 3360, 4195, 4944, 5783, 6276, 6471, 6527, 5993, 5093, 4545, 4275, 3815, 2906, 1527, 192, +-458, -525, -499, -841, -1708, -2642, -3615, -5106, -6573, -7079, -6957, -6866, -6753, -6125, -4997, -3905, +-3229, -2907, -2933, -2980, -2658, -2015, -1205, -466, 65, 638, 1298, 1798, 2416, 3241, 3768, 3787, +3436, 2728, 1486, -57, -1128, -1611, -1865, -1746, -1519, -1403, -1082, -672, -130, 688, 1434, 2123, +3083, 3995, 4688, 5459, 6243, 6601, 6370, 5675, 5085, 4931, 4757, 4075, 2812, 1278, 289, 104, +-103, -597, -888, -1166, -2109, -3749, -5233, -6024, -6538, -7026, -7191, -6888, -6099, -4995, -4007, -3389, +-3164, -3259, -3108, -2539, -1979, -1423, -697, -18, 413, 834, 1617, 2502, 3069, 3656, 4006, 3628, +2775, 1550, 145, -839, -1412, -1677, -1639, -1618, -1633, -1279, -707, -233, 356, 1172, 2031, 2813, +3526, 4404, 5481, 6238, 6333, 5981, 5408, 5197, 5451, 5175, 3920, 2466, 1527, 904, 163, -338, +-274, -319, -1090, -2359, -3689, -4794, -5647, -6476, -7078, -7237, -6977, -6146, -4951, -4092, -3767, -3643, +-3382, -3063, -2807, -2149, -1337, -879, -412, 189, 701, 1388, 2234, 3007, 3703, 3989, 3629, 2831, +1662, 293, -640, -1049, -1406, -1731, -1794, -1587, -1248, -952, -534, 279, 1068, 1647, 2363, 3255, +4332, 5537, 6186, 5936, 5424, 5488, 5913, 5721, 4791, 3844, 2938, 1811, 803, 234, 174, 243, +-201, -1107, -2157, -3341, -4445, -5380, -6289, -7084, -7430, -6842, -5779, -5030, -4380, -3805, -3697, -3601, +-3192, -2723, -2145, -1532, -1045, -527, 6, 499, 1260, 2242, 3044, 3692, 4087, 3787, 2819, 1622, +566, -154, -839, -1422, -1550, -1512, -1534, -1364, -997, -497, 189, 820, 1271, 1870, 3098, 4708, +5597, 5527, 5468, 5769, 6011, 5973, 5572, 5014, 4232, 2961, 1705, 986, 692, 604, 402, -17, +-828, -2024, -2982, -3816, -5155, -6433, -7048, -7166, -6724, -5835, -5014, -4402, -4016, -3873, -3606, -3173, +-2762, -2232, -1580, -1144, -792, -247, 381, 1142, 2013, 3002, 3942, 4167, 3588, 2832, 1956, 892, +-30, -713, -1157, -1403, -1512, -1540, -1488, -1118, -307, 191, 169, 618, 1922, 3459, 4486, 4844, +5128, 5562, 5779, 5850, 5901, 5806, 5245, 4075, 2859, 1915, 1118, 861, 955, 548, -221, -855, +-1604, -2596, -3762, -5152, -6366, -7038, -7158, -6686, -5826, -5163, -4705, -4295, -4068, -3827, -3378, -2835, +-2276, -1872, -1497, -891, -424, -69, 778, 2022, 3111, 3729, 3873, 3626, 2995, 2042, 1107, 171, +-596, -847, -1119, -1681, -1854, -1363, -652, -396, -606, -313, 805, 2126, 3199, 3940, 4611, 5166, +5312, 5531, 6020, 6123, 5856, 5353, 4208, 2819, 1967, 1592, 1333, 1017, 526, -2, -489, -1237, +-2286, -3504, -4966, -6252, -6887, -6919, -6480, -5838, -5241, -4701, -4456, -4302, -3795, -3239, -2924, -2513, +-1888, -1368, -1128, -896, -181, 874, 1954, 3010, 3668, 3799, 3737, 3250, 2194, 1112, 419, 78, +-530, -1455, -1801, -1368, -830, -723, -1000, -888, -77, 794, 1777, 3007, 3853, 4315, 4832, 5257, +5543, 6001, 6361, 6128, 5274, 4046, 2974, 2400, 1951, 1483, 1114, 680, 255, -166, -846, -1889, +-3358, -4906, -5988, -6623, -6816, -6353, -5657, -5269, -5034, -4661, -4164, -3811, -3588, -3026, -2356, -1959, +-1640, -1405, -1112, -318, 805, 1874, 2699, 3389, 3985, 3904, 2982, 2050, 1523, 1064, 261, -937, +-1545, -1231, -994, -1109, -1109, -1089, -1002, -355, 694, 1699, 2674, 3538, 4097, 4515, 4886, 5437, +6173, 6405, 5948, 5070, 4046, 3218, 2640, 2118, 1660, 1155, 686, 513, 207, -668, -1837, -3184, +-4657, -5917, -6568, -6434, -6070, -5888, -5493, -5003, -4739, -4447, -4089, -3656, -3045, -2429, -2024, -1916, +-1798, -1144, -242, 536, 1479, 2613, 3612, 3979, 3416, 2756, 2600, 2169, 1044, -27, -686, -1048, +-1035, -891, -1061, -1278, -1351, -1098, -395, 484, 1493, 2566, 3296, 3698, 4147, 4776, 5614, 6238, +6256, 5828, 5013, 4041, 3436, 2967, 2247, 1586, 1211, 1058, 804, 271, -364, -1465, -3188, -4713, +-5638, -6159, -6316, -6206, -5887, -5485, -5181, -4871, -4621, -4352, -3660, -2924, -2596, -2471, -2259, -1789, +-1181, -723, 0, 1516, 2930, 3324, 3276, 3356, 3228, 2828, 2095, 1030, 51, -577, -804, -753, +-905, -1198, -1354, -1426, -1239, -624, 319, 1456, 2323, 2742, 3253, 3949, 4704, 5596, 6215, 6175, +5601, 4885, 4345, 3737, 2875, 2241, 1800, 1292, 1059, 1050, 775, -100, -1534, -3043, -4333, -5392, +-5956, -6182, -6215, -5870, -5435, -5280, -5164, -4850, -4223, -3448, -3062, -3057, -2611, -1950, -1930, -1897, +-1048, 289, 1590, 2449, 2900, 3273, 3482, 3406, 3001, 2082, 1015, 228, -257, -481, -641, -946, +-1156, -1388, -1668, -1400, -605, 345, 1257, 1949, 2430, 2931, 3646, 4776, 5720, 5925, 5847, 5646, +5088, 4409, 3768, 3167, 2444, 1676, 1387, 1461, 1362, 936, 7, -1415, -2831, -4008, -5072, -5785, +-6059, -5996, -5608, -5416, -5677, -5436, -4560, -4047, -3866, -3432, -2790, -2328, -2333, -2405, -1905, -908, +292, 1399, 2105, 2634, 3241, 3624, 3622, 3061, 2052, 1211, 600, 37, -265, -429, -722, -1158, +-1623, -1706, -1338, -677, 363, 1246, 1546, 1914, 2759, 3820, 4736, 5352, 5811, 5925, 5526, 5085, +4685, 4033, 3214, 2419, 1786, 1638, 1809, 1648, 1051, 101, -1236, -2476, -3634, -4985, -5755, -5630, +-5532, -5780, -5912, -5587, -5028, -4730, -4492, -3887, -3206, -2735, -2555, -2685, -2569, -1883, -910, 194, +1103, 1724, 2543, 3397, 3746, 3578, 2993, 2233, 1434, 667, 302, 114, -288, -678, -1089, -1657, +-1836, -1319, -368, 372, 702, 1146, 1866, 2636, 3578, 4628, 5336, 5653, 5740, 5553, 5276, 4931, +4121, 3154, 2433, 1923, 1929, 2159, 1787, 1042, 347, -687, -2267, -3838, -4723, -4989, -5371, -5839, +-5895, -5709, -5464, -5237, -5056, -4537, -3741, -3171, -2867, -2840, -2979, -2644, -1855, -965, -147, 604, +1580, 2614, 3280, 3679, 3643, 2998, 2205, 1554, 996, 551, 248, 29, -502, -1370, -1833, -1559, +-1036, -505, 77, 502, 897, 1602, 2474, 3498, 4553, 5085, 5351, 5653, 5657, 5436, 5056, 4128, +3033, 2467, 2393, 2315, 2008, 1787, 1631, 722, -853, -2282, -3350, -4134, -4801, -5472, -5740, -5619, +-5601, -5586, -5482, -5186, -4489, -3703, -3200, -3111, -3266, -3039, -2485, -1968, -1277, -421, 421, 1346, +2394, 3257, 3594, 3404, 2979, 2381, 1549, 1002, 957, 748, 16, -743, -1394, -1700, -1464, -1084, +-621, -66, 203, 542, 1417, 2435, 3395, 4278, 4823, 5123, 5495, 5838, 5712, 4807, 3801, 3332, +2887, 2346, 2182, 2309, 2339, 1810, 545, -771, -1843, -2922, -3916, -4759, -5291, -5465, -5530, -5599, +-5721, -5747, -5151, -4240, -3703, -3523, -3414, -3273, -3054, -2660, -2085, -1470, -817, 110, 1346, 2345, +2961, 3528, 3570, 2891, 2162, 1670, 1426, 1324, 775, -72, -703, -1295, -1638, -1376, -946, -637, +-381, -90, 409, 1197, 2278, 3358, 3860, 4236, 5123, 5850, 5827, 5373, 4735, 4133, 3465, 2653, +2327, 2536, 2704, 2438, 1655, 655, -392, -1552, -2654, -3705, -4637, -5077, -5160, -5412, -5852, -6005, +-5628, -4962, -4335, -3905, -3644, -3585, -3457, -2980, -2632, -2470, -1824, -903, -45, 1019, 2122, 3019, +3555, 3295, 2616, 2231, 2011, 1730, 1428, 874, 54, -787, -1312, -1347, -1240, -1031, -669, -612, +-555, 282, 1382, 2178, 2747, 3361, 4341, 5253, 5578, 5563, 5398, 4951, 4130, 3177, 2684, 2718, +2811, 2788, 2470, 1731, 812, -83, -1211, -2559, -3641, -4246, -4574, -5013, -5578, -5868, -5892, -5649, +-4898, -4290, -4193, -3970, -3573, -3341, -3120, -2919, -2548, -1852, -1187, -407, 869, 2174, 2971, 3187, +2978, 2660, 2300, 2080, 2075, 1679, 847, 124, -645, -1270, -1240, -981, -938, -1110, -1098, -458, +441, 1083, 1655, 2415, 3400, 4291, 4863, 5352, 5692, 5482, 4754, 3919, 3181, 2834, 2935, 3058, +2839, 2421, 1887, 1227, 144, -1304, -2399, -3185, -3958, -4411, -4880, -5646, -5994, -5789, -5379, -4902, +-4597, -4339, -3899, -3607, -3536, -3292, -2934, -2595, -2274, -1635, -411, 911, 1952, 2823, 3039, 2719, +2605, 2515, 2337, 2185, 1819, 1069, 59, -742, -854, -735, -905, -1267, -1336, -888, -285, 130, +646, 1510, 2365, 3089, 3938, 4790, 5421, 5730, 5443, 4665, 3813, 3227, 3178, 3199, 2907, 2804, +2739, 2141, 1326, 289, -1055, -2133, -2824, -3450, -4156, -5008, -5679, -5760, -5596, -5427, -5107, -4666, +-4214, -4008, -3896, -3431, -3140, -3161, -2910, -2486, -1823, -567, 839, 1903, 2493, 2702, 2721, 2582, +2491, 2611, 2565, 1932, 860, -17, -315, -352, -723, -1223, -1294, -1086, -901, -550, -45, 594, +1349, 2026, 2811, 3757, 4655, 5508, 5793, 5141, 4405, 3966, 3505, 3242, 3189, 3061, 2999, 2878, +2393, 1521, 264, -921, -1661, -2328, -3208, -4191, -4982, -5293, -5543, -5760, -5394, -4926, -4757, -4469, +-4083, -3766, -3449, -3240, -3203, -3178, -2779, -1797, -545, 638, 1663, 2351, 2533, 2426, 2437, 2765, +3061, 2636, 1618, 884, 496, 70, -377, -825, -1104, -1159, -1202, -993, -581, -202, 463, 1222, +1658, 2427, 3726, 4807, 5380, 5433, 4988, 4451, 3966, 3583, 3371, 3150, 3100, 3263, 3147, 2526, +1403, 233, -425, -1174, -2286, -3173, -3891, -4713, -5312, -5560, -5535, -5365, -5110, -4850, -4609, -4242, +-3731, -3404, -3442, -3541, -3373, -2860, -1966, -791, 469, 1612, 2064, 1937, 2159, 2755, 3104, 2938, +2287, 1678, 1242, 628, 111, -265, -792, -1102, -1112, -1251, -1182, -646, -145, 246, 640, 1287, +2391, 3616, 4620, 5204, 5147, 4814, 4463, 4024, 3661, 3259, 3026, 3381, 3592, 3028, 2245, 1519, +668, -249, -1101, -1959, -2904, -3832, -4600, -5166, -5504, -5508, -5355, -5283, -5127, -4701, -4176, -3717, +-3586, -3719, -3640, -3501, -3219, -2222, -737, 508, 1158, 1301, 1683, 2426, 2843, 2931, 2845, 2325, +1772, 1413, 811, 196, -193, -580, -992, -1313, -1340, -961, -616, -362, -49, 315, 1133, 2341, +3525, 4534, 4965, 4835, 4808, 4673, 4007, 3351, 3271, 3511, 3609, 3480, 3112, 2475, 1662, 861, +83, -797, -1716, -2616, -3639, -4466, -4946, -5248, -5307, -5370, -5434, -5061, -4520, -4179, -3838, -3603, +-3610, -3799, -3950, -3312, -1847, -655, 68, 689, 1145, 1713, 2448, 2830, 2858, 2733, 2456, 2073, +1466, 913, 583, 60, -545, -999, -1272, -1132, -824, -716, -540, -294, 37, 1006, 2446, 3517, +4101, 4663, 5065, 4937, 4381, 3824, 3536, 3478, 3581, 3721, 3548, 3144, 2619, 1841, 1105, 384, +-499, -1387, -2434, -3541, -4202, -4594, -5055, -5360, -5463, -5303, -4941, -4704, -4252, -3545, -3499, -4016, +-4248, -3965, -3063, -1858, -938, -289, 287, 1007, 1847, 2330, 2628, 2903, 2808, 2469, 2055, 1552, +1207, 814, 82, -586, -928, -1125, -1037, -690, -663, -923, -753, 65, 1132, 2077, 3001, 4009, +4694, 4912, 4756, 4235, 3804, 3652, 3584, 3677, 3758, 3533, 3212, 2685, 1910, 1323, 729, -175, +-1233, -2330, -3175, -3711, -4480, -5131, -5202, -5288, -5456, -5229, -4603, -3861, -3537, -3820, -4226, -4380, +-3852, -2841, -2045, -1393, -610, 120, 886, 1635, 2174, 2641, 2940, 2779, 2418, 2207, 1866, 1352, +884, 227, -589, -1010, -848, -552, -745, -1099, -1015, -632, 8, 880, 1789, 2875, 3957, 4541, +4738, 4592, 4128, 3842, 3746, 3650, 3759, 3845, 3625, 3250, 2656, 2113, 1752, 933, -199, -1045, +-1887, -2846, -3712, -4304, -4651, -5100, -5530, -5536, -5132, -4381, -3697, -3762, -4228, -4426, -4252, -3702, +-2953, -2293, -1611, -764, -64, 590, 1466, 2192, 2515, 2691, 2720, 2539, 2206, 2007, 1796, 989, +-30, -520, -593, -545, -621, -993, -1153, -984, -740, -213, 648, 1608, 2782, 3841, 4363, 4544, +4386, 4024, 3841, 3679, 3670, 3957, 3896, 3477, 3187, 2921, 2457, 1713, 931, 229, -736, -1841, +-2680, -3385, -3963, -4477, -5188, -5704, -5501, -4810, -4176, -3867, -4082, -4439, -4389, -4154, -3814, -3151, +-2402, -1774, -1141, -326, 590, 1282, 1905, 2522, 2641, 2440, 2491, 2553, 2347, 1745, 759, 69, +-143, -315, -483, -687, -1035, -1136, -1055, -925, -399, 419, 1445, 2700, 3608, 4089, 4404, 4296, +3897, 3679, 3784, 3960, 3815, 3607, 3634, 3443, 2959, 2470, 1912, 1232, 436, -610, -1700, -2368, +-2900, -3689, -4563, -5371, -5701, -5215, -4536, -4203, -4144, -4234, -4364, -4460, -4248, -3665, -3194, -2738, +-1944, -1228, -604, 312, 1269, 1970, 2293, 2260, 2436, 2861, 2823, 2347, 1637, 834, 379, 115, +-186, -365, -632, -958, -1058, -1149, -1101, -545, 357, 1409, 2443, 3429, 4170, 4212, 3908, 3887, +3949, 3866, 3827, 3829, 3775, 3765, 3529, 3019, 2662, 2284, 1518, 526, -511, -1346, -1833, -2483, +-3560, -4707, -5327, -5238, -4915, -4555, -4117, -4111, -4407, -4402, -4294, -4181, -3798, -3279, -2690, -2074, +-1586, -722, 486, 1307, 1701, 1929, 2190, 2746, 3065, 2809, 2325, 1684, 1049, 673, 354, 28, +-234, -489, -765, -1164, -1331, -1046, -601, 46, 1224, 2545, 3365, 3799, 3969, 3920, 3959, 3937, +3740, 3787, 3936, 3859, 3694, 3444, 3187, 2965, 2484, 1612, 503, -323, -701, -1375, -2539, -3604, +-4559, -5216, -5135, -4729, -4441, -4269, -4327, -4377, -4347, -4458, -4284, -3728, -3322, -2991, -2548, -1823, +-627, 395, 916, 1301, 1724, 2278, 2839, 3031, 2784, 2242, 1703, 1263, 770, 345, 189, 12, +-502, -873, -1033, -1290, -1309, -848, -2, 1226, 2345, 2983, 3472, 3817, 3902, 3846, 3764, 3794, +3901, 3901, 3801, 3551, 3395, 3520, 3216, 2280, 1447, 779, 129, -374, -1167, -2350, -3564, -4603, +-4998, -4830, -4735, -4587, -4337, -4339, -4449, -4583, -4510, -4055, -3716, -3640, -3402, -2740, -1753, -749, +10, 526, 966, 1553, 2335, 2864, 2854, 2693, 2408, 1745, 1186, 942, 602, 261, -38, -413, +-699, -1054, -1475, -1478, -878, 71, 1072, 1956, 2777, 3370, 3629, 3757, 3683, 3610, 3925, 4065, +3703, 3570, 3714, 3771, 3644, 3083, 2297, 1617, 952, 507, 47, -1015, -2333, -3472, -4288, -4651, +-4769, -4695, -4398, -4276, -4487, -4696, -4586, -4243, -4006, -4003, -3903, -3470, -2753, -1745, -842, -395, +117, 902, 1547, 2165, 2766, 2893, 2671, 2275, 1795, 1450, 1128, 704, 364, 129, -123, -646, +-1306, -1562, -1384, -924, -47, 900, 1694, 2664, 3351, 3399, 3423, 3636, 3853, 3954, 3713, 3547, +3725, 3833, 3886, 3713, 3061, 2296, 1738, 1387, 997, 207, -970, -2148, -3181, -4052, -4574, -4602, +-4354, -4239, -4476, -4654, -4541, -4388, -4178, -4047, -4252, -4146, -3410, -2644, -1918, -1196, -615, -22, +667, 1420, 2203, 2715, 2781, 2557, 2249, 2003, 1603, 1030, 778, 696, 333, -90, -662, -1378, +-1554, -1302, -1007, -340, 657, 1737, 2581, 2858, 3070, 3456, 3700, 3786, 3741, 3556, 3520, 3730, +3993, 4025, 3590, 2878, 2339, 2072, 1732, 1145, 292, -704, -1831, -3126, -4035, -4235, -4276, -4300, +-4326, -4620, -4723, -4382, -4143, -4214, -4355, -4388, -4062, -3453, -2752, -2038, -1439, -883, -277, 464, +1442, 2255, 2479, 2604, 2694, 2365, 1980, 1601, 1156, 1048, 986, 530, -110, -758, -1157, -1342, +-1492, -1206, -302, 725, 1574, 2198, 2646, 3051, 3418, 3671, 3731, 3575, 3380, 3548, 3966, 4166, +3927, 3352, 2894, 2696, 2279, 1801, 1443, 643, -541, -1776, -2982, -3769, -3913, -3983, -4248, -4557, +-4655, -4441, -4225, -4192, -4324, -4510, -4440, -4049, -3543, -2819, -2120, -1791, -1246, -348, 444, 1280, +1986, 2342, 2609, 2657, 2365, 1915, 1514, 1415, 1407, 1034, 466, -1, -503, -1100, -1562, -1603, +-1140, -328, 512, 1291, 1920, 2392, 2932, 3411, 3601, 3520, 3236, 3286, 3827, 4068, 3900, 3745, +3413, 2976, 2702, 2411, 2089, 1695, 869, -414, -1801, -2801, -3282, -3613, -4009, -4355, -4618, -4540, +-4244, -4244, -4288, -4345, -4648, -4578, -3998, -3456, -2959, -2515, -2065, -1375, -543, 299, 1101, 1747, +2325, 2709, 2572, 2137, 1880, 1796, 1641, 1374, 1026, 689, 234, -477, -1146, -1543, -1578, -1088, +-360, 340, 1042, 1558, 2171, 3026, 3397, 3234, 3168, 3255, 3473, 3817, 3984, 3914, 3701, 3374, +2999, 2680, 2538, 2488, 1940, 859, -379, -1616, -2415, -2836, -3496, -4052, -4286, -4521, -4467, -4189, +-4126, -4310, -4597, -4700, -4408, -3935, -3488, -3105, -2771, -2227, -1431, -692, -29, 863, 1798, 2390, +2507, 2311, 2191, 2122, 1886, 1691, 1516, 1239, 935, 330, -478, -1080, -1529, -1562, -934, -315, +42, 630, 1512, 2355, 2888, 3039, 3026, 3069, 3222, 3535, 3743, 3885, 3994, 3690, 3214, 2994, +2833, 2866, 2797, 1958, 785, -248, -1240, -2051, -2694, -3337, -3936, -4352, -4420, -4200, -4075, -4208, +-4482, -4732, -4720, -4307, -3905, -3705, -3386, -2855, -2234, -1659, -1094, -170, 922, 1665, 2117, 2277, +2249, 2286, 2144, 1864, 1811, 1696, 1406, 1108, 503, -480, -1245, -1441, -1231, -947, -697, -193, +591, 1497, 2332, 2665, 2757, 2975, 3022, 3107, 3477, 3746, 3942, 3968, 3524, 3063, 3051, 3209, +3194, 2794, 1992, 985, -49, -955, -1680, -2451, -3313, -3932, -4216, -4201, -3983, -3994, -4326, -4629, +-4709, -4509, -4264, -4173, -3845, -3335, -2968, -2541, -1999, -1245, -152, 806, 1381, 1896, 2207, 2200, +2174, 2123, 1914, 1782, 1792, 1779, 1290, 335, -480, -999, -1204, -1122, -1137, -961, -222, 597, +1375, 2100, 2447, 2634, 2840, 2906, 3029, 3451, 3903, 3989, 3670, 3285, 3132, 3236, 3353, 3324, +2866, 1988, 1092, 243, -582, -1394, -2347, -3298, -3857, -4017, -3857, -3836, -4212, -4462, -4505, -4597, +-4578, -4427, -4210, -3775, -3417, -3270, -2856, -2121, -1312, -379, 537, 1242, 1685, 1953, 2210, 2161, +1865, 1855, 1989, 2058, 1919, 1163, 230, -298, -728, -1126, -1292, -1294, -1020, -315, 501, 1226, +1865, 2328, 2520, 2543, 2649, 3080, 3582, 3810, 3765, 3477, 3148, 3164, 3397, 3526, 3397, 2808, +2026, 1293, 521, -224, -1183, -2440, -3295, -3555, -3659, -3751, -3943, -4228, -4326, -4418, -4700, -4709, +-4389, -4073, -3875, -3728, -3394, -2958, -2361, -1386, -440, 238, 995, 1604, 1957, 2125, 1922, 1730, +2005, 2307, 2214, 1809, 1182, 502, -51, -562, -1076, -1360, -1325, -960, -377, 330, 1188, 1888, +2136, 2240, 2387, 2656, 3187, 3620, 3760, 3634, 3289, 3160, 3365, 3580, 3688, 3474, 2774, 2141, +1719, 1033, 20, -1164, -2296, -2896, -3145, -3446, -3708, -3849, -3954, -4217, -4574, -4611, -4471, -4334, +-4011, -3849, -3853, -3565, -3038, -2357, -1474, -676, 26, 927, 1676, 1883, 1777, 1745, 1919, 2245, +2402, 2216, 1807, 1291, 786, 179, -546, -1010, -1212, -1320, -1059, -461, 343, 1171, 1664, 1874, +2035, 2214, 2665, 3294, 3585, 3593, 3462, 3157, 3152, 3551, 3759, 3657, 3267, 2775, 2483, 2093, +1228, 41, -1100, -1881, -2510, -3110, -3313, -3436, -3726, -3946, -4211, -4557, -4586, -4395, -4210, -4010, +-3970, -3999, -3652, -2991, -2420, -1809, -973, 27, 961, 1448, 1552, 1586, 1718, 2089, 2389, 2338, +2207, 1968, 1491, 914, 237, -412, -879, -1269, -1410, -1073, -460, 335, 1127, 1446, 1555, 1823, +2136, 2663, 3274, 3494, 3373, 3129, 3053, 3359, 3689, 3731, 3450, 3115, 3078, 2860, 2097, 1201, +237, -864, -1769, -2408, -2898, -3128, -3309, -3628, -3954, -4279, -4600, -4575, -4270, -4145, -4217, -4264, +-4025, -3570, -3202, -2752, -2006, -1066, 4, 775, 1042, 1222, 1481, 1760, 2075, 2262, 2317, 2311, +2027, 1552, 1067, 383, -328, -835, -1334, -1507, -1084, -425, 325, 921, 1169, 1312, 1560, 2088, +2774, 3200, 3277, 3041, 2857, 3194, 3595, 3543, 3407, 3405, 3340, 3209, 2887, 2199, 1335, 399, +-699, -1622, -2217, -2690, -2959, -3149, -3503, -4001, -4437, -4504, -4308, -4289, -4345, -4330, -4228, -3949, +-3690, -3510, -2998, -2089, -1061, -125, 421, 738, 1122, 1411, 1657, 2043, 2273, 2344, 2370, 2086, +1657, 1193, 558, -173, -876, -1346, -1400, -1074, -368, 353, 706, 889, 1063, 1408, 2188, 2922, +2995, 2812, 2876, 3090, 3325, 3482, 3411, 3381, 3485, 3437, 3294, 3002, 2380, 1526, 544, -452, +-1354, -2083, -2391, -2542, -3005, -3602, -4045, -4267, -4252, -4236, -4376, -4383, -4234, -4082, -3956, -3924, +-3723, -2979, -2075, -1211, -353, 188, 565, 990, 1320, 1642, 2000, 2287, 2427, 2330, 2157, 1893, +1351, 692, -47, -870, -1348, -1328, -965, -265, 386, 492, 447, 900, 1646, 2320, 2673, 2632, +2671, 2938, 3134, 3252, 3333, 3371, 3417, 3447, 3526, 3474, 3054, 2463, 1767, 721, -414, -1242, +-1722, -1975, -2377, -3055, -3602, -3876, -4058, -4138, -4324, -4465, -4263, -4115, -4148, -4151, -4088, -3757, +-3041, -2171, -1316, -607, -28, 445, 765, 1167, 1632, 1954, 2225, 2425, 2373, 2245, 2082, 1573, +811, 56, -809, -1396, -1215, -634, -104, 107, 73, 350, 1049, 1736, 2168, 2346, 2487, 2703, +2874, 3076, 3265, 3251, 3245, 3428, 3535, 3528, 3470, 3208, 2737, 1886, 680, -292, -881, -1324, +-1727, -2381, -3069, -3404, -3655, -3983, -4240, -4370, -4306, -4166, -4118, -4205, -4329, -4203, -3750, -3151, +-2359, -1473, -811, -303, 218, 624, 1018, 1562, 1922, 2106, 2368, 2423, 2309, 2177, 1764, 969, +-68, -974, -1220, -853, -422, -252, -280, -78, 460, 1032, 1536, 1970, 2155, 2295, 2627, 2889, +3022, 3111, 3127, 3288, 3415, 3368, 3497, 3622, 3406, 2818, 1802, 734, 43, -472, -1044, -1704, +-2336, -2813, -3228, -3613, -3981, -4280, -4319, -4144, -4109, -4214, -4281, -4357, -4308, -3840, -3216, -2533, +-1680, -1038, -585, -39, 473, 905, 1388, 1802, 2105, 2243, 2304, 2447, 2427, 1892, 838, -295, +-873, -773, -598, -572, -481, -379, -127, 434, 971, 1421, 1732, 1917, 2290, 2638, 2756, 2905, +3080, 3158, 3222, 3221, 3343, 3668, 3826, 3500, 2693, 1788, 1045, 391, -247, -869, -1544, -2136, +-2540, -3026, -3609, -3933, -4116, -4196, -4034, -4027, -4230, -4336, -4382, -4309, -3881, -3253, -2546, -1864, +-1255, -676, -179, 287, 831, 1383, 1750, 1943, 2068, 2401, 2858, 2667, 1721, 683, -113, -478, +-502, -563, -591, -590, -498, -56, 486, 850, 1216, 1585, 1938, 2251, 2474, 2676, 2914, 3103, +3097, 2982, 3097, 3542, 3885, 3820, 3401, 2714, 1938, 1343, 678, -124, -719, -1267, -1886, -2387, +-2938, -3537, -3876, -4001, -4016, -3972, -4015, -4176, -4376, -4463, -4282, -3882, -3366, -2683, -1996, -1426, +-884, -433, 108, 884, 1330, 1412, 1645, 2139, 2763, 2998, 2466, 1598, 732, 59, -201, -319, +-541, -722, -677, -388, -24, 319, 677, 1081, 1505, 1825, 2027, 2287, 2714, 2986, 2907, 2819, +2883, 3138, 3664, 3937, 3677, 3303, 2828, 2167, 1503, 806, 84, -511, -1039, -1635, -2276, -2907, +-3430, -3765, -3928, -3888, -3861, -4024, -4202, -4388, -4484, -4279, -3970, -3503, -2722, -2100, -1727, -1240, +-548, 262, 784, 886, 1113, 1664, 2341, 2875, 2927, 2380, 1514, 802, 377, 64, -291, -608, +-723, -599, -351, -130, 117, 610, 1097, 1283, 1548, 1954, 2338, 2755, 2882, 2649, 2583, 2865, +3270, 3650, 3798, 3637, 3319, 2910, 2332, 1631, 898, 292, -254, -888, -1504, -2167, -2877, -3345, +-3642, -3811, -3744, -3829, -4063, -4192, -4359, -4522, -4472, -4090, -3390, -2814, -2514, -2065, -1261, -429, +101, 363, 564, 961, 1657, 2447, 2897, 2747, 2174, 1563, 1041, 634, 194, -347, -554, -543, +-634, -544, -224, 124, 559, 892, 1051, 1380, 1966, 2454, 2652, 2600, 2462, 2548, 2864, 3286, +3606, 3671, 3617, 3433, 2984, 2447, 1793, 1062, 539, -13, -687, -1332, -2073, -2790, -3229, -3474, +-3616, -3733, -3838, -3880, -4069, -4472, -4687, -4383, -3853, -3472, -3201, -2776, -2071, -1228, -514, -112, +25, 303, 985, 1800, 2528, 2808, 2513, 2161, 1829, 1263, 698, 274, -109, -367, -508, -626, +-523, -143, 218, 450, 602, 898, 1463, 2027, 2409, 2513, 2370, 2381, 2613, 2861, 3255, 3547, +3617, 3652, 3475, 3044, 2525, 1905, 1297, 771, 240, -406, -1206, -2019, -2594, -2970, -3364, -3650, +-3606, -3529, -3781, -4262, -4575, -4482, -4198, -3922, -3669, -3460, -2913, -2024, -1230, -676, -425, -346, +179, 1132, 1904, 2351, 2572, 2530, 2271, 1884, 1324, 817, 441, 73, -291, -594, -625, -337, +-79, 101, 237, 359, 849, 1520, 1995, 2279, 2316, 2238, 2334, 2545, 2811, 3163, 3465, 3620, +3622, 3455, 3104, 2581, 1967, 1467, 1083, 475, -385, -1144, -1750, -2360, -3021, -3415, -3362, -3321, +-3522, -3914, -4358, -4492, -4289, -4160, -4072, -3915, -3648, -2947, -1915, -1239, -1048, -879, -476, 245, +1074, 1718, 2207, 2499, 2545, 2345, 1860, 1411, 1105, 634, 134, -307, -594, -474, -209, -120, +-70, 42, 320, 897, 1530, 1940, 2109, 2148, 2164, 2255, 2434, 2730, 3117, 3387, 3553, 3680, +3524, 3079, 2565, 2188, 1844, 1190, 437, -143, -815, -1612, -2367, -2952, -3130, -3050, -3221, -3621, +-3991, -4290, -4365, -4181, -4178, -4340, -4226, -3646, -2741, -1976, -1614, -1392, -1112, -571, 182, 831, +1510, 2142, 2437, 2456, 2253, 1902, 1623, 1279, 689, 82, -313, -423, -309, -183, -210, -247, +-88, 329, 930, 1452, 1788, 2000, 2034, 2041, 2186, 2410, 2673, 2944, 3338, 3702, 3637, 3313, +3099, 2821, 2383, 1860, 1256, 719, 194, -646, -1640, -2293, -2670, -2832, -2867, -3154, -3658, -4040, +-4124, -4019, -4151, -4459, -4524, -4211, -3497, -2689, -2210, -1896, -1558, -1205, -683, -13, 695, 1457, +2063, 2315, 2313, 2235, 2079, 1813, 1353, 706, 136, -166, -208, -139, -223, -375, -338, -105, +342, 897, 1416, 1765, 1833, 1889, 2105, 2163, 2177, 2536, 3056, 3410, 3546, 3468, 3362, 3305, +2948, 2364, 1960, 1581, 1060, 328, -613, -1514, -2149, -2404, -2439, -2748, -3288, -3662, -3806, -3785, +-3904, -4330, -4648, -4526, -4069, -3435, -2830, -2381, -2036, -1682, -1343, -862, -140, 674, 1399, 1874, +2091, 2244, 2298, 2217, 1949, 1354, 678, 224, 44, 3, -143, -323, -398, -414, -211, 371, +942, 1250, 1541, 1830, 1924, 1932, 1899, 2088, 2630, 3042, 3193, 3352, 3509, 3517, 3271, 2857, +2503, 2146, 1803, 1326, 414, -670, -1426, -1825, -2009, -2301, -2864, -3339, -3468, -3477, -3646, -4015, +-4469, -4661, -4435, -4015, -3497, -2942, -2487, -2131, -1890, -1574, -963, -199, 585, 1243, 1657, 1963, +2238, 2420, 2374, 1914, 1257, 794, 452, 180, 90, -17, -360, -538, -397, -85, 366, 746, +1108, 1567, 1792, 1717, 1685, 1870, 2250, 2563, 2824, 3158, 3399, 3520, 3518, 3212, 2793, 2550, +2414, 2113, 1415, 353, -605, -1092, -1392, -1825, -2379, -2916, -3182, -3203, -3331, -3678, -4141, -4495, +-4548, -4399, -4041, -3500, -2989, -2603, -2357, -2143, -1734, -1086, -292, 475, 996, 1361, 1902, 2390, +2453, 2291, 1929, 1312, 823, 569, 416, 245, -129, -462, -471, -316, -125, 171, 684, 1259, +1492, 1486, 1556, 1674, 1852, 2149, 2435, 2711, 3070, 3418, 3547, 3407, 3035, 2770, 2812, 2738, +2196, 1294, 340, -292, -696, -1190, -1798, -2412, -2781, -2878, -3014, -3296, -3687, -4121, -4443, -4551, +-4405, -3990, -3474, -3052, -2718, -2516, -2382, -1841, -1021, -406, 144, 735, 1302, 1893, 2342, 2489, +2337, 1840, 1309, 1009, 844, 585, 153, -177, -264, -385, -489, -249, 263, 768, 1136, 1319, +1360, 1470, 1624, 1780, 1992, 2219, 2581, 3127, 3469, 3414, 3133, 2925, 3015, 3109, 2806, 2098, +1211, 523, 60, -463, -1156, -1818, -2287, -2537, -2696, -2932, -3235, -3630, -4175, -4484, -4513, -4440, +-4007, -3414, -3115, -2989, -2786, -2410, -1816, -1218, -644, -76, 501, 1160, 1855, 2379, 2498, 2151, +1725, 1529, 1301, 890, 532, 295, -1, -295, -508, -511, -170, 309, 734, 1041, 1155, 1257, +1467, 1610, 1667, 1742, 2080, 2698, 3199, 3315, 3127, 2959, 3053, 3277, 3199, 2702, 2008, 1370, +851, 322, -421, -1116, -1643, -2135, -2393, -2507, -2840, -3218, -3600, -4107, -4514, -4603, -4310, -3848, +-3533, -3356, -3167, -2892, -2482, -1970, -1395, -838, -383, 210, 1115, 1944, 2217, 2158, 2059, 1868, +1596, 1254, 925, 700, 395, 4, -331, -562, -499, -136, 316, 641, 801, 982, 1289, 1482, +1430, 1369, 1594, 2161, 2811, 3080, 2966, 2882, 2987, 3265, 3389, 3068, 2617, 2198, 1626, 1058, +493, -276, -1020, -1554, -1917, -2201, -2465, -2679, -3004, -3586, -4181, -4487, -4431, -4152, -3885, -3678, +-3456, -3268, -3056, -2552, -1934, -1569, -1247, -616, 266, 1154, 1715, 1985, 2133, 2078, 1862, 1593, +1327, 1098, 844, 495, 50, -381, -576, -371, -12, 235, 437, 695, 1048, 1360, 1335, 1131, +1234, 1674, 2322, 2784, 2739, 2668, 2901, 3144, 3303, 3298, 3061, 2691, 2286, 1870, 1309, 569, +-169, -799, -1363, -1804, -2053, -2196, -2443, -2963, -3650, -4123, -4292, -4325, -4114, -3791, -3687, -3649, +-3405, -2928, -2445, -2182, -1914, -1375, -605, 219, 977, 1576, 1948, 2103, 2044, 1880, 1644, 1430, +1300, 1052, 530, -6, -343, -375, -151, -27, 69, 389, 798, 1177, 1294, 1043, 940, 1324, +1894, 2311, 2507, 2589, 2694, 2914, 3193, 3327, 3215, 3010, 2814, 2512, 2015, 1407, 737, 56, +-631, -1287, -1620, -1724, -2003, -2442, -2956, -3550, -4056, -4263, -4107, -3896, -3898, -3939, -3683, -3240, +-2892, -2680, -2457, -2056, -1458, -749, 65, 860, 1439, 1889, 2078, 1958, 1800, 1675, 1620, 1509, +1030, 414, 36, -156, -187, -157, -187, -22, 499, 996, 1100, 926, 832, 1027, 1408, 1866, +2201, 2329, 2406, 2676, 2997, 3170, 3207, 3132, 3084, 2947, 2538, 2091, 1640, 936, 90, -601, +-1043, -1343, -1603, -1858, -2249, -2935, -3652, -3985, -3963, -3924, -4022, -4104, -3934, -3567, -3281, -3043, +-2836, -2631, -2190, -1603, -938, -128, 656, 1317, 1806, 1860, 1727, 1755, 1838, 1779, 1483, 925, +395, 152, 60, -176, -438, -341, 139, 637, 856, 853, 737, 737, 1040, 1443, 1773, 1983, +2094, 2357, 2693, 2866, 2993, 3157, 3204, 3063, 2863, 2678, 2342, 1704, 918, 226, -412, -948, +-1195, -1299, -1618, -2264, -3034, -3497, -3649, -3815, -3971, -4086, -4096, -3844, -3521, -3301, -3108, -2962, +-2695, -2234, -1741, -1119, -245, 655, 1280, 1565, 1636, 1681, 1868, 2061, 1887, 1373, 890, 686, +460, 43, -319, -436, -188, 292, 651, 743, 685, 605, 797, 1164, 1415, 1572, 1827, 2119, +2335, 2517, 2777, 3053, 3120, 3060, 3084, 3050, 2803, 2403, 1832, 1117, 308, -421, -715, -782, +-1107, -1664, -2313, -2892, -3230, -3486, -3770, -3976, -4102, -4046, -3774, -3522, -3405, -3248, -2995, -2761, +-2470, -1979, -1229, -288, 569, 1100, 1259, 1391, 1791, 2086, 1997, 1684, 1346, 1114, 899, 482, +-17, -358, -392, -42, 427, 619, 515, 482, 656, 883, 1030, 1232, 1562, 1812, 1949, 2213, +2535, 2754, 2901, 2967, 3086, 3127, 2992, 2875, 2631, 1952, 1063, 290, -160, -329, -586, -1075, +-1654, -2218, -2713, -3054, -3375, -3750, -4001, -4006, -3916, -3781, -3623, -3417, -3237, -3106, -2928, -2709, +-2193, -1214, -230, 347, 687, 1031, 1497, 1899, 1983, 1844, 1674, 1508, 1309, 1016, 496, -98, +-385, -199, 193, 392, 375, 463, 567, 611, 769, 1005, 1269, 1467, 1609, 1894, 2231, 2398, +2608, 2860, 2973, 2999, 3042, 3135, 3130, 2724, 1896, 1076, 519, 166, -92, -445, -1010, -1577, +-2026, -2431, -2904, -3380, -3669, -3842, -3942, -3886, -3785, -3641, -3364, -3176, -3217, -3233, -2877, -2069, +-1141, -481, -33, 475, 1040, 1523, 1816, 1866, 1780, 1714, 1688, 1564, 1040, 301, -87, -130, +-23, 143, 300, 422, 463, 423, 576, 829, 947, 1083, 1346, 1603, 1822, 2054, 2316, 2613, +2779, 2764, 2870, 3157, 3320, 3159, 2623, 1852, 1154, 721, 460, 77, -478, -951, -1376, -1856, +-2339, -2849, -3332, -3610, -3754, -3919, -3996, -3827, -3482, -3252, -3366, -3561, -3386, -2791, -2048, -1377, +-842, -266, 344, 954, 1497, 1681, 1610, 1720, 1915, 1883, 1474, 841, 371, 97, -81, -9, +240, 343, 306, 367, 485, 602, 701, 824, 1069, 1321, 1457, 1676, 2042, 2361, 2500, 2522, +2653, 2930, 3248, 3420, 3153, 2488, 1859, 1393, 985, 592, 151, -346, -781, -1174, -1677, -2266, +-2797, -3142, -3391, -3757, -4047, -3951, -3575, -3313, -3392, -3644, -3629, -3323, -2808, -2138, -1570, -1120, +-465, 337, 1002, 1287, 1342, 1585, 1954, 2041, 1820, 1472, 963, 430, 125, 75, 162, 245, +256, 333, 440, 462, 523, 688, 907, 1049, 1142, 1383, 1741, 2039, 2261, 2323, 2318, 2590, +3077, 3405, 3373, 3043, 2508, 2018, 1602, 1175, 707, 215, -184, -523, -1036, -1670, -2157, -2520, +-2880, -3417, -3914, -3943, -3664, -3458, -3399, -3565, -3757, -3678, -3280, -2750, -2319, -1943, -1295, -379, +297, 651, 955, 1298, 1637, 1921, 2015, 1875, 1453, 886, 483, 285, 184, 142, 193, 315, +357, 292, 379, 574, 694, 796, 905, 1035, 1338, 1769, 2009, 2030, 2034, 2222, 2662, 3123, +3346, 3270, 2928, 2537, 2192, 1730, 1196, 752, 414, 95, -447, -1102, -1517, -1828, -2335, -2956, +-3504, -3795, -3749, -3511, -3359, -3458, -3763, -3843, -3516, -3183, -3008, -2669, -2028, -1238, -509, 35, +468, 835, 1184, 1603, 1971, 2067, 1802, 1342, 978, 649, 319, 192, 271, 315, 300, 298, +299, 414, 597, 670, 665, 740, 1030, 1471, 1773, 1849, 1855, 1905, 2235, 2765, 3125, 3234, +3142, 2949, 2727, 2289, 1695, 1305, 1082, 687, 104, -454, -856, -1176, -1650, -2277, -2920, -3472, +-3686, -3455, -3261, -3429, -3679, -3735, -3585, -3468, -3408, -3173, -2703, -2058, -1333, -660, -106, 271, +620, 1156, 1713, 1960, 1939, 1793, 1454, 1014, 648, 393, 308, 352, 349, 275, 223, 327, +545, 592, 517, 539, 721, 1106, 1512, 1676, 1646, 1636, 1851, 2335, 2758, 2942, 3080, 3224, +3102, 2683, 2186, 1835, 1610, 1213, 651, 147, -285, -653, -948, -1455, -2269, -3035, -3366, -3302, +-3259, -3402, -3569, -3630, -3606, -3600, -3614, -3510, -3254, -2835, -2153, -1367, -826, -445, 31, 570, +1100, 1578, 1865, 1931, 1772, 1426, 1033, 654, 462, 468, 412, 264, 197, 251, 412, 524, +437, 347, 438, 738, 1174, 1465, 1416, 1361, 1576, 1915, 2216, 2480, 2821, 3181, 3213, 2903, +2588, 2304, 2017, 1697, 1266, 687, 137, -140, -277, -742, -1585, -2412, -2897, -3046, -3142, -3309, +-3444, -3491, -3575, -3625, -3591, -3653, -3683, -3385, -2812, -2163, -1586, -1099, -594, -92, 452, 1035, +1500, 1809, 1956, 1770, 1378, 1025, 783, 665, 569, 388, 255, 283, 376, 499, 486, 290, +202, 490, 921, 1198, 1227, 1233, 1442, 1626, 1743, 2036, 2512, 2916, 3097, 3074, 2891, 2601, +2382, 2249, 1885, 1237, 647, 379, 282, -42, -797, -1638, -2216, -2621, -2908, -3047, -3212, -3402, +-3476, -3451, -3479, -3673, -3836, -3715, -3353, -2861, -2278, -1774, -1302, -741, -219, 283, 871, 1435, +1811, 1885, 1614, 1299, 1112, 933, 735, 559, 342, 253, 367, 521, 512, 256, 98, 326, +679, 852, 976, 1158, 1306, 1340, 1406, 1658, 2024, 2443, 2851, 3034, 2923, 2759, 2694, 2650, +2371, 1740, 1110, 862, 740, 444, -67, -775, -1503, -2088, -2450, -2693, -3006, -3273, -3310, -3295, +-3386, -3543, -3775, -3901, -3717, -3354, -2931, -2440, -1933, -1413, -905, -448, 114, 838, 1428, 1728, +1734, 1537, 1348, 1213, 1060, 825, 493, 301, 448, 658, 569, 283, 173, 295, 426, 564, +808, 1043, 1153, 1223, 1266, 1314, 1562, 2018, 2517, 2832, 2805, 2718, 2870, 2978, 2730, 2218, +1706, 1358, 1125, 924, 642, 29, -745, -1351, -1806, -2240, -2632, -2956, -3144, -3138, -3148, -3325, +-3574, -3799, -3843, -3660, -3395, -3010, -2485, -1992, -1559, -1137, -607, 93, 823, 1381, 1657, 1612, +1470, 1450, 1424, 1127, 650, 441, 591, 715, 584, 423, 338, 262, 289, 413, 581, 808, +1017, 1138, 1189, 1100, 1143, 1580, 2160, 2482, 2512, 2589, 2864, 3051, 2957, 2664, 2195, 1731, +1500, 1389, 1126, 666, 44, -597, -1113, -1613, -2138, -2584, -2862, -2965, -2969, -3121, -3366, -3576, +-3739, -3809, -3724, -3445, -2988, -2543, -2163, -1776, -1327, -746, -2, 783, 1268, 1373, 1400, 1608, +1668, 1328, 916, 719, 669, 698, 677, 562, 445, 318, 255, 311, 402, 544, 833, 1106, +1137, 934, 876, 1248, 1733, 2018, 2192, 2366, 2585, 2920, 3125, 2965, 2571, 2144, 1857, 1730, +1540, 1168, 695, 150, -371, -884, -1494, -2078, -2478, -2668, -2759, -2896, -3085, -3271, -3509, -3762, +-3855, -3699, -3387, -3000, -2604, -2254, -1979, -1572, -766, 96, 584, 885, 1234, 1553, 1688, 1529, +1220, 978, 834, 771, 773, 704, 553, 419, 357, 309, 206, 265, 663, 1034, 1016, 849, +820, 960, 1300, 1648, 1830, 1975, 2233, 2605, 2996, 3074, 2817, 2453, 2172, 2023, 1897, 1608, +1193, 755, 328, -173, -818, -1486, -1973, -2284, -2530, -2702, -2824, -2961, -3211, -3537, -3738, -3823, +-3749, -3356, -2895, -2724, -2614, -2184, -1469, -726, -177, 280, 816, 1290, 1553, 1596, 1453, 1213, +1000, 907, 909, 821, 640, 617, 612, 354, 106, 177, 464, 801, 939, 829, 738, 793, +1025, 1333, 1527, 1626, 1818, 2213, 2685, 2986, 2949, 2678, 2426, 2297, 2191, 1953, 1598, 1283, +961, 512, -101, -762, -1313, -1798, -2209, -2424, -2533, -2743, -2922, -3111, -3492, -3862, -3884, -3550, +-3194, -3092, -3043, -2708, -2136, -1528, -980, -432, 183, 761, 1200, 1498, 1541, 1312, 1155, 1152, +1008, 814, 775, 813, 768, 515, 192, 105, 291, 594, 815, 808, 686, 675, 840, 1096, +1268, 1320, 1429, 1754, 2251, 2720, 2875, 2760, 2614, 2520, 2418, 2196, 1904, 1688, 1472, 1049, +574, 51, -614, -1233, -1669, -2031, -2340, -2518, -2569, -2720, -3192, -3695, -3841, -3648, -3432, -3368, +-3337, -3110, -2700, -2265, -1744, -1173, -660, -43, 697, 1160, 1291, 1309, 1316, 1264, 1087, 881, +843, 925, 916, 718, 370, 109, 137, 399, 663, 728, 624, 584, 692, 890, 1040, 1059, +1079, 1300, 1754, 2261, 2583, 2635, 2657, 2669, 2513, 2324, 2185, 1985, 1739, 1512, 1192, 694, +59, -506, -1010, -1571, -2063, -2240, -2236, -2379, -2817, -3362, -3621, -3579, -3551, -3521, -3426, -3373, +-3182, -2748, -2305, -1935, -1460, -765, 17, 603, 921, 1170, 1361, 1382, 1218, 993, 904, 995, +1073, 967, 637, 275, 173, 319, 550, 672, 617, 541, 641, 810, 952, 941, 837, 976, +1400, 1807, 2137, 2447, 2632, 2659, 2601, 2537, 2406, 2178, 2006, 1910, 1670, 1216, 764, 313, +-263, -965, -1617, -1887, -1853, -2038, -2466, -2882, -3249, -3486, -3513, -3487, -3533, -3556, -3408, -3083, +-2790, -2550, -2156, -1528, -784, -137, 355, 790, 1156, 1342, 1302, 1108, 962, 1031, 1172, 1164, +915, 517, 262, 295, 460, 599, 594, 474, 521, 784, 930, 832, 724, 798, 1013, 1306, +1687, 2073, 2329, 2481, 2625, 2627, 2463, 2332, 2255, 2160, 1961, 1587, 1284, 1048, 477, -371, +-1038, -1393, -1575, -1741, -2019, -2430, -2895, -3208, -3312, -3419, -3583, -3643, -3533, -3329, -3161, -3016, +-2723, -2219, -1607, -965, -380, 166, 716, 1100, 1209, 1110, 953, 972, 1180, 1274, 1125, 813, +445, 302, 446, 577, 487, 376, 478, 700, 821, 804, 767, 697, 716, 969, 1315, 1594, +1916, 2232, 2482, 2581, 2463, 2368, 2457, 2399, 2090, 1857, 1780, 1623, 1137, 420, -295, -873, +-1193, -1339, -1570, -1992, -2441, -2766, -2963, -3194, -3467, -3577, -3511, -3419, -3356, -3318, -3142, -2749, +-2263, -1746, -1160, -544, 115, 725, 1031, 1030, 953, 944, 1065, 1281, 1321, 1043, 656, 491, +568, 581, 463, 419, 456, 535, 719, 829, 759, 645, 612, 733, 1003, 1207, 1448, 1920, +2304, 2374, 2326, 2428, 2547, 2449, 2208, 2067, 2030, 1974, 1749, 1204, 453, -233, -682, -906, +-1174, -1605, -2009, -2306, -2578, -2885, -3229, -3450, -3435, -3386, -3426, -3453, -3400, -3180, -2798, -2390, +-1970, -1349, -603, 89, 613, 857, 862, 803, 948, 1262, 1371, 1132, 878, 738, 646, 613, +558, 428, 394, 459, 611, 793, 783, 628, 594, 689, 724, 780, 1086, 1575, 1906, 2041, +2188, 2375, 2503, 2481, 2315, 2154, 2115, 2151, 2139, 1809, 1131, 437, -68, -423, -755, -1172, +-1568, -1841, -2127, -2516, -2907, -3191, -3330, -3320, -3353, -3495, -3523, -3380, -3155, -2904, -2588, -2118, +-1477, -714, 68, 527, 549, 583, 833, 1103, 1271, 1230, 1040, 890, 787, 704, 634, 513, +352, 361, 575, 725, 676, 649, 724, 678, 515, 520, 797, 1177, 1479, 1682, 1924, 2196, +2390, 2478, 2381, 2185, 2122, 2244, 2351, 2214, 1740, 1124, 613, 193, -269, -694, -1047, -1373, +-1671, -2031, -2488, -2868, -3064, -3142, -3248, -3401, -3470, -3454, -3390, -3181, -2954, -2793, -2331, -1483, +-626, -47, 199, 318, 577, 906, 1129, 1211, 1162, 1010, 900, 890, 828, 568, 356, 422, +554, 554, 569, 691, 796, 710, 476, 402, 562, 821, 1091, 1314, 1534, 1850, 2183, 2378, +2344, 2169, 2068, 2199, 2400, 2375, 2113, 1709, 1241, 767, 276, -215, -621, -924, -1196, -1579, +-2084, -2458, -2714, -2977, -3114, -3209, -3421, -3531, -3432, -3300, -3274, -3267, -3009, -2332, -1458, -763, +-346, -63, 215, 509, 848, 1118, 1104, 970, 1015, 1083, 949, 674, 501, 519, 528, 445, +471, 659, 794, 760, 575, 416, 436, 628, 812, 970, 1151, 1420, 1849, 2205, 2256, 2107, +2034, 2121, 2320, 2421, 2347, 2126, 1774, 1380, 880, 262, -170, -413, -750, -1138, -1524, -1980, +-2385, -2615, -2791, -3021, -3295, -3450, -3395, -3298, -3363, -3515, -3435, -2961, -2272, -1545, -902, -530, +-284, 106, 581, 880, 924, 941, 1092, 1183, 1049, 868, 764, 689, 577, 468, 455, 600, +790, 824, 706, 537, 454, 545, 715, 766, 833, 1081, 1527, 1961, 2124, 2080, 2016, 2041, +2229, 2432, 2410, 2337, 2261, 1952, 1455, 943, 457, 59, -233, -549, -974, -1470, -1888, -2149, +-2355, -2659, -3045, -3252, -3180, -3157, -3300, -3469, -3561, -3444, -2969, -2230, -1562, -1146, -807, -301, +220, 513, 652, 839, 1050, 1140, 1096, 993, 934, 877, 705, 526, 484, 567, 739, 862, +786, 613, 500, 556, 654, 613, 577, 774, 1127, 1592, 1940, 1963, 1903, 1987, 2105, 2187, +2310, 2427, 2446, 2299, 1997, 1539, 1006, 563, 253, -35, -423, -980, -1447, -1658, -1900, -2323, +-2733, -2953, -3026, -3033, -3087, -3279, -3577, -3721, -3427, -2823, -2278, -1875, -1395, -810, -298, 53, +308, 595, 899, 1032, 1044, 1062, 1076, 1040, 886, 660, 513, 529, 716, 904, 839, 688, +657, 655, 658, 637, 512, 487, 797, 1251, 1575, 1739, 1846, 1903, 1939, 2032, 2159, 2300, +2443, 2480, 2352, 2043, 1527, 1031, 756, 513, 69, -480, -900, -1175, -1474, -1866, -2292, -2681, +-2899, -2897, -2835, -3042, -3482, -3738, -3631, -3294, -2916, -2547, -2037, -1413, -910, -538, -175, 196, +557, 777, 870, 971, 1039, 1099, 1064, 788, 512, 519, 649, 753, 788, 703, 627, 691, +769, 651, 434, 367, 529, 801, 1141, 1427, 1608, 1734, 1779, 1829, 1951, 2086, 2232, 2454, +2554, 2329, 1882, 1492, 1236, 933, 500, 25, -381, -753, -1065, -1356, -1801, -2370, -2707, -2709, +-2647, -2823, -3264, -3588, -3633, -3546, -3391, -3114, -2651, -2060, -1567, -1149, -704, -294, 105, 464, +629, 712, 934, 1133, 1129, 925, 672, 521, 588, 747, 765, 624, 627, 759, 817, 732, +531, 377, 398, 544, 777, 1105, 1382, 1531, 1641, 1750, 1784, 1797, 1998, 2343, 2568, 2480, +2205, 1944, 1682, 1357, 1024, 609, 104, -286, -534, -782, -1253, -1900, -2337, -2410, -2394, -2546, +-2907, -3238, -3411, -3539, -3605, -3440, -3098, -2643, -2106, -1666, -1290, -798, -278, 73, 271, 489, +747, 1003, 1187, 1101, 795, 637, 695, 774, 748, 645, 622, 760, 863, 819, 680, 526, +395, 388, 573, 829, 1053, 1283, 1528, 1669, 1617, 1552, 1763, 2121, 2380, 2499, 2437, 2232, +2009, 1789, 1527, 1115, 550, 139, -45, -260, -722, -1366, -1869, -2040, -2143, -2339, -2555, -2827, +-3137, -3386, -3564, -3648, -3481, -3072, -2653, -2291, -1847, -1324, -833, -392, -97, 81, 380, 794, +1072, 1098, 916, 767, 780, 837, 779, 667, 657, 724, 815, 895, 865, 682, 475, 402, +509, 615, 725, 1036, 1399, 1552, 1505, 1446, 1537, 1807, 2114, 2388, 2484, 2357, 2242, 2186, +2012, 1612, 1050, 618, 484, 283, -206, -783, -1258, -1615, -1854, -2009, -2210, -2455, -2679, -2981, +-3362, -3563, -3531, -3365, -3073, -2745, -2391, -1891, -1310, -821, -524, -301, 32, 492, 889, 1014, +944, 894, 908, 890, 845, 779, 720, 696, 779, 971, 1012, 819, 654, 577, 503, 444, +499, 793, 1156, 1376, 1445, 1408, 1364, 1510, 1847, 2181, 2347, 2304, 2275, 2396, 2380, 1986, +1457, 1125, 939, 700, 333, -176, -731, -1126, -1425, -1755, -1972, -2080, -2275, -2588, -2987, -3346, +-3508, -3460, -3326, -3185, -2932, -2484, -1895, -1363, -1044, -839, -462, 56, 500, 741, 824, 890, +894, 850, 879, 847, 692, 629, 729, 894, 954, 879, 821, 750, 564, 401, 385, 514, +817, 1125, 1307, 1311, 1209, 1219, 1523, 1915, 2071, 2059, 2200, 2444, 2483, 2263, 1862, 1458, +1262, 1117, 766, 295, -143, -577, -1008, -1396, -1679, -1843, -1953, -2190, -2611, -3050, -3316, -3410, +-3403, -3424, -3360, -2992, -2427, -1902, -1584, -1351, -962, -468, -41, 353, 615, 720, 785, 872, +952, 898, 716, 661, 742, 788, 845, 903, 929, 896, 751, 529, 383, 386, 544, 868, +1191, 1233, 1043, 1064, 1339, 1580, 1720, 1831, 1998, 2300, 2534, 2446, 2124, 1813, 1611, 1413, +1147, 799, 388, -35, -475, -963, -1345, -1545, -1651, -1810, -2179, -2654, -2992, -3163, -3293, -3485, +-3614, -3371, -2900, -2464, -2104, -1801, -1488, -1082, -604, -106, 243, 393, 575, 819, 931, 876, +766, 702, 710, 724, 732, 804, 939, 978, 883, 744, 523, 271, 337, 719, 1000, 1043, +966, 957, 1137, 1365, 1463, 1510, 1725, 2100, 2384, 2445, 2329, 2112, 1915, 1725, 1477, 1211, +918, 551, 104, -429, -905, -1194, -1320, -1426, -1749, -2217, -2526, -2725, -2999, -3339, -3555, -3512, +-3247, -2896, -2488, -2158, -1932, -1597, -1072, -559, -197, 68, 348, 648, 848, 887, 830, 817, +796, 725, 740, 833, 865, 968, 1126, 1040, 702, 381, 338, 582, 876, 968, 902, 913, +1100, 1246, 1273, 1297, 1464, 1816, 2162, 2341, 2373, 2313, 2185, 2018, 1774, 1549, 1348, 1078, +709, 157, -430, -770, -907, -1083, -1404, -1781, -2039, -2265, -2631, -3014, -3325, -3520, -3484, -3197, +-2844, -2580, -2365, -2036, -1590, -1098, -695, -390, -26, 353, 573, 734, 878, 844, 766, 784, +798, 723, 714, 905, 1147, 1198, 943, 523, 361, 533, 742, 813, 788, 839, 1008, 1137, +1132, 1106, 1189, 1467, 1814, 2069, 2241, 2324, 2308, 2210, 2004, 1742, 1619, 1522, 1243, 688, +70, -307, -516, -791, -1113, -1393, -1641, -1895, -2192, -2547, -2996, -3373, -3495, -3369, -3138, -2918, +-2773, -2482, -2038, -1669, -1301, -850, -451, -137, 212, 547, 712, 738, 774, 819, 794, 683, +566, 711, 1069, 1264, 1106, 743, 505, 545, 666, 700, 692, 740, 909, 1048, 1034, 985, +1021, 1183, 1481, 1767, 1977, 2167, 2315, 2330, 2133, 1870, 1807, 1844, 1640, 1169, 640, 244, +-86, -415, -722, -1049, -1329, -1504, -1739, -2081, -2526, -3043, -3329, -3311, -3245, -3195, -3019, -2762, +-2503, -2183, -1770, -1370, -1012, -610, -199, 184, 444, 559, 693, 852, 849, 665, 465, 545, +904, 1180, 1160, 918, 683, 634, 666, 620, 597, 655, 789, 931, 968, 905, 874, 968, +1182, 1397, 1599, 1897, 2216, 2316, 2139, 1952, 1956, 1988, 1861, 1584, 1146, 710, 374, 10, +-348, -680, -1015, -1232, -1323, -1584, -2097, -2617, -2961, -3174, -3302, -3279, -3202, -3082, -2877, -2588, +-2238, -1890, -1574, -1172, -696, -270, 8, 196, 477, 786, 860, 666, 434, 411, 704, 1031, +1100, 979, 837, 755, 707, 627, 557, 575, 687, 849, 912, 847, 801, 871, 972, 1023, +1175, 1581, 1970, 2119, 2107, 1990, 1970, 2042, 2008, 1822, 1549, 1161, 767, 457, 120, -342, +-745, -892, -986, -1237, -1614, -2072, -2532, -2900, -3153, -3253, -3276, -3275, -3165, -2928, -2623, -2356, +-2116, -1724, -1191, -769, -494, -248, 110, 559, 796, 663, 408, 339, 527, 802, 943, 962, +917, 870, 814, 693, 557, 498, 604, 780, 799, 734, 813, 879, 824, 778, 889, 1211, +1644, 1894, 1938, 1951, 1983, 2014, 2053, 2063, 1846, 1510, 1270, 1004, 590, 106, -300, -539, +-691, -874, -1135, -1519, -1996, -2439, -2772, -2984, -3133, -3286, -3276, -3078, -2862, -2699, -2511, -2168, +-1653, -1205, -954, -718, -302, 274, 651, 663, 474, 366, 462, 660, 819, 921, 954, 988, +1032, 872, 636, 609, 710, 758, 750, 755, 858, 957, 889, 724, 710, 986, 1328, 1613, +1833, 1901, 1892, 2005, 2143, 2151, 2013, 1844, 1699, 1480, 1098, 639, 198, -146, -361, -533, +-699, -967, -1435, -1904, -2248, -2550, -2852, -3117, -3208, -3098, -2966, -2908, -2823, -2526, -2027, -1607, +-1385, -1185, -780, -167, 350, 547, 521, 404, 404, 585, 719, 750, 888, 1081, 1125, 989, +793, 727, 769, 784, 714, 712, 893, 1007, 923, 782, 692, 729, 993, 1360, 1607, 1677, +1738, 1920, 2089, 2118, 2061, 2004, 1963, 1841, 1539, 1140, 718, 272, -65, -219, -344, -581, +-967, -1373, -1716, -2071, -2479, -2870, -3056, -3030, -3005, -3069, -3070, -2856, -2410, -2023, -1838, -1632, +-1293, -768, -123, 283, 350, 329, 394, 480, 511, 576, 748, 985, 1131, 1042, 874, 858, +875, 767, 682, 706, 819, 939, 996, 905, 696, 588, 779, 1089, 1321, 1436, 1546, 1755, +1957, 2009, 1996, 2025, 2044, 2011, 1874, 1601, 1182, 695, 316, 101, -52, -268, -597, -933, +-1208, -1574, -2046, -2512, -2788, -2828, -2906, -3117, -3208, -3066, -2757, -2403, -2174, -2072, -1850, -1332, +-707, -233, 46, 200, 310, 394, 362, 336, 536, 831, 959, 939, 922, 932, 894, 788, +707, 642, 687, 863, 994, 930, 712, 545, 605, 822, 982, 1113, 1296, 1510, 1696, 1802, +1879, 1924, 1949, 2012, 2044, 1915, 1587, 1089, 675, 432, 218, -17, -310, -589, -759, -1064, +-1614, -2122, -2423, -2584, -2757, -3001, -3243, -3275, -3014, -2668, -2516, -2457, -2287, -1895, -1325, -832, +-472, -120, 175, 240, 146, 148, 354, 581, 723, 819, 879, 909, 931, 876, 730, 593, +564, 749, 947, 931, 747, 601, 603, 650, 709, 848, 1044, 1223, 1417, 1572, 1695, 1763, +1760, 1866, 2053, 2088, 1882, 1462, 1022, 769, 549, 209, -120, -276, -396, -679, -1139, -1658, +-2066, -2248, -2423, -2780, -3162, -3321, -3181, -2906, -2753, -2768, -2662, -2321, -1887, -1507, -1076, -531, +-112, 26, 19, 28, 138, 342, 519, 643, 733, 822, 945, 979, 832, 603, 531, 713, +904, 899, 826, 733, 664, 633, 613, 691, 854, 987, 1172, 1402, 1550, 1622, 1646, 1729, +1962, 2182, 2100, 1783, 1484, 1244, 925, 562, 236, 18, -59, -216, -635, -1171, -1566, -1796, +-1997, -2364, -2850, -3176, -3143, -2949, -2888, -2924, -2815, -2592, -2361, -2060, -1622, -1058, -536, -228, +-119, -83, -9, 160, 355, 482, 546, 664, 915, 1046, 902, 691, 590, 678, 835, 889, +892, 863, 770, 691, 648, 637, 688, 813, 979, 1208, 1442, 1510, 1463, 1577, 1871, 2098, +2159, 2054, 1858, 1655, 1385, 979, 591, 375, 309, 199, -131, -613, -1041, -1263, -1422, -1823, +-2390, -2762, -2871, -2886, -2897, -2879, -2782, -2680, -2586, -2397, -2051, -1533, -976, -534, -257, -172, +-107, 101, 295, 356, 418, 587, 884, 1103, 1046, 884, 775, 756, 817, 926, 984, 981, +939, 863, 782, 758, 727, 685, 826, 1119, 1318, 1357, 1361, 1444, 1686, 1956, 2093, 2112, +2087, 2020, 1804, 1401, 966, 683, 593, 560, 279, -216, -588, -753, -953, -1364, -1879, -2286, +-2548, -2746, -2856, -2874, -2794, -2751, -2759, -2670, -2476, -2112, -1540, -993, -649, -458, -300, -57, +133, 165, 187, 382, 676, 913, 1022, 972, 863, 797, 795, 837, 953, 1027, 967, 914, +925, 860, 700, 591, 669, 916, 1132, 1198, 1170, 1235, 1453, 1691, 1842, 1967, 2067, 2135, +2084, 1747, 1243, 923, 875, 830, 536, 93, -213, -384, -582, -943, -1400, -1792, -2180, -2548, +-2753, -2835, -2839, -2794, -2807, -2868, -2854, -2613, -2116, -1565, -1189, -937, -625, -313, -132, -72, +-36, 75, 343, 642, 811, 885, 878, 774, 697, 748, 844, 898, 895, 914, 959, 920, +741, 540, 507, 713, 921, 968, 977, 1032, 1184, 1402, 1553, 1656, 1837, 2114, 2247, 1974, +1497, 1200, 1113, 1040, 776, 388, 130, -40, -283, -551, -901, -1316, -1737, -2149, -2501, -2723, +-2793, -2757, -2749, -2901, -3062, -2941, -2547, -2117, -1753, -1415, -1061, -668, -384, -301, -273, -143, +46, 287, 551, 760, 811, 741, 685, 720, 753, 786, 802, 861, 1000, 1010, 817, 597, +503, 594, 761, 853, 850, 844, 986, 1202, 1263, 1296, 1534, 1933, 2205, 2081, 1701, 1462, +1364, 1218, 980, 696, 417, 197, -1, -236, -520, -874, -1259, -1662, -2103, -2528, -2681, -2625, +-2654, -2863, -3078, -3112, -2895, -2560, -2275, -1969, -1541, -1074, -751, -568, -456, -356, -258, -45, +258, 514, 674, 683, 661, 709, 734, 688, 680, 787, 977, 1040, 931, 727, 545, 557, +704, 753, 712, 740, 890, 1069, 1059, 1005, 1236, 1695, 2014, 2043, 1886, 1701, 1577, 1445, +1243, 999, 733, 477, 295, 101, -169, -442, -688, -1093, -1657, -2144, -2406, -2451, -2473, -2678, +-2959, -3078, -2998, -2836, -2659, -2391, -1994, -1565, -1146, -829, -645, -544, -470, -319, -15, 279, +472, 554, 631, 738, 728, 645, 615, 693, 895, 1087, 1053, 854, 679, 659, 737, 727, +613, 672, 895, 1003, 906, 829, 996, 1382, 1754, 1933, 1954, 1877, 1758, 1655, 1528, 1285, +1010, 830, 634, 370, 130, -30, -196, -523, -1065, -1641, -2009, -2124, -2225, -2459, -2711, -2876, +-2955, -2942, -2852, -2681, -2379, -2012, -1579, -1157, -860, -713, -665, -532, -245, 19, 210, 395, +554, 718, 793, 706, 583, 614, 817, 1073, 1136, 953, 808, 858, 867, 733, 625, 706, +925, 1018, 888, 761, 844, 1100, 1434, 1756, 1896, 1899, 1914, 1894, 1750, 1538, 1346, 1181, +951, 658, 398, 272, 223, 5, -515, -1079, -1470, -1710, -1901, -2141, -2391, -2598, -2773, -2878, +-2903, -2840, -2658, -2419, -2044, -1533, -1144, -944, -823, -687, -481, -229, -32, 139, 375, 620, +799, 786, 601, 535, 771, 1049, 1106, 1000, 953, 1023, 1007, 803, 638, 729, 906, 1003, +950, 801, 715, 870, 1171, 1462, 1641, 1783, 1922, 1958, 1878, 1723, 1582, 1497, 1297, 920, +611, 518, 530, 391, -19, -524, -966, -1287, -1548, -1826, -2081, -2286, -2534, -2740, -2823, -2872, +-2882, -2748, -2447, -2007, -1554, -1266, -1090, -921, -733, -512, -306, -169, 38, 404, 719, 738, +556, 476, 668, 922, 971, 938, 1026, 1123, 1071, 897, 722, 698, 841, 997, 1017, 834, +675, 735, 918, 1147, 1360, 1559, 1802, 1944, 1896, 1791, 1750, 1747, 1573, 1190, 845, 706, +725, 693, 409, -22, -429, -811, -1162, -1425, -1687, -1982, -2240, -2463, -2623, -2757, -2899, -2936, +-2751, -2420, -2017, -1650, -1409, -1219, -973, -722, -593, -520, -307, 111, 514, 593, 459, 460, +601, 728, 787, 841, 979, 1103, 1133, 1019, 788, 678, 786, 951, 1008, 880, 703, 666, +740, 849, 994, 1243, 1562, 1760, 1761, 1737, 1793, 1855, 1770, 1438, 1059, 887, 853, 799, +670, 389, 0, -398, -760, -1070, -1348, -1672, -1983, -2189, -2365, -2597, -2822, -2980, -2992, -2781, +-2431, -2099, -1846, -1594, -1261, -952, -883, -902, -680, -223, 170, 304, 319, 386, 472, 545, +604, 651, 798, 1010, 1120, 1062, 853, 701, 732, 876, 945, 870, 741, 696, 673, 629, +701, 943, 1255, 1500, 1555, 1559, 1718, 1883, 1849, 1614, 1309, 1059, 947, 895, 829, 694, +388, -11, -361, -656, -991, -1342, -1657, -1915, -2113, -2323, -2602, -2888, -3061, -2986, -2711, -2484, +-2317, -2015, -1565, -1227, -1190, -1211, -1002, -624, -242, 9, 125, 243, 377, 453, 453, 452, +585, 851, 1065, 1087, 920, 755, 777, 885, 907, 898, 878, 831, 732, 584, 515, 706, +1035, 1243, 1327, 1409, 1594, 1830, 1922, 1803, 1564, 1318, 1100, 1016, 1003, 915, 713, 427, +100, -202, -532, -884, -1227, -1550, -1763, -1926, -2205, -2613, -2909, -2917, -2778, -2736, -2649, -2309, +-1847, -1490, -1379, -1375, -1244, -942, -579, -287, -95, 88, 287, 413, 414, 356, 414, 700, +1004, 1077, 984, 878, 854, 917, 933, 899, 966, 1025, 906, 667, 518, 605, 856, 1054, +1120, 1227, 1442, 1690, 1886, 1942, 1810, 1568, 1348, 1224, 1184, 1110, 987, 804, 533, 245, +-32, -366, -758, -1138, -1328, -1447, -1774, -2222, -2534, -2639, -2697, -2797, -2819, -2571, -2137, -1752, +-1548, -1495, -1413, -1182, -876, -590, -349, -138, 147, 375, 376, 272, 313, 544, 860, 1040, +1004, 958, 987, 984, 922, 923, 1026, 1149, 1089, 831, 611, 624, 765, 902, 987, 1050, +1207, 1450, 1732, 1930, 1910, 1748, 1556, 1402, 1302, 1238, 1180, 1046, 806, 610, 422, 69, +-402, -749, -918, -1080, -1424, -1837, -2135, -2315, -2511, -2740, -2895, -2808, -2464, -2089, -1822, -1690, +-1616, -1434, -1157, -942, -738, -438, -91, 194, 280, 180, 154, 361, 640, 815, 893, 943, +1007, 1004, 895, 867, 1024, 1182, 1179, 973, 750, 658, 685, 776, 856, 869, 940, 1147, +1463, 1751, 1862, 1835, 1710, 1512, 1376, 1367, 1306, 1136, 987, 918, 788, 434, -27, -338, +-512, -735, -1076, -1468, -1753, -1945, -2207, -2533, -2814, -2915, -2729, -2385, -2121, -1973, -1837, -1653, +-1448, -1273, -1138, -869, -429, -52, 75, 47, 33, 178, 398, 542, 686, 857, 988, 975, +843, 811, 959, 1133, 1202, 1104, 896, 737, 689, 741, 786, 742, 739, 895, 1131, 1420, +1702, 1831, 1738, 1573, 1499, 1495, 1374, 1169, 1098, 1126, 1044, 752, 339, 31, -139, -398, +-753, -1104, -1393, -1594, -1818, -2184, -2619, -2861, -2841, -2636, -2405, -2256, -2107, -1859, -1655, -1569, +-1498, -1276, -825, -383, -168, -133, -91, 38, 168, 247, 421, 695, 892, 915, 811, 761, +848, 1022, 1165, 1177, 1003, 821, 771, 770, 738, 694, 665, 683, 802, 1073, 1462, 1670, +1646, 1587, 1600, 1566, 1418, 1216, 1160, 1242, 1208, 971, 655, 371, 160, -40, -381, -796, +-1075, -1245, -1447, -1783, -2267, -2668, -2787, -2733, -2624, -2531, -2363, -2079, -1838, -1794, -1806, -1644, +-1226, -774, -515, -375, -227, -85, -18, 16, 164, 469, 724, 834, 806, 722, 733, 933, +1128, 1173, 1087, 972, 900, 826, 773, 769, 696, 563, 581, 822, 1170, 1417, 1500, 1568, +1683, 1668, 1492, 1319, 1266, 1302, 1332, 1199, 931, 702, 536, 333, 23, -393, -718, -865, +-999, -1296, -1781, -2256, -2506, -2607, -2661, -2668, -2541, -2223, -1947, -1911, -1976, -1868, -1548, -1174, +-882, -640, -378, -219, -175, -141, -43, 177, 501, 735, 768, 672, 661, 833, 1023, 1097, +1127, 1095, 982, 906, 908, 908, 792, 575, 484, 657, 915, 1091, 1269, 1466, 1628, 1684, +1563, 1380, 1328, 1364, 1398, 1329, 1128, 945, 829, 675, 388, -24, -390, -560, -651, -878, +-1305, -1768, -2101, -2330, -2575, -2750, -2678, -2390, -2125, -2074, -2110, -2028, -1834, -1580, -1265, -948, +-644, -411, -297, -275, -263, -103, 251, 553, 632, 621, 633, 721, 860, 1027, 1144, 1149, +1030, 954, 1035, 1079, 904, 678, 563, 596, 731, 852, 1012, 1260, 1513, 1646, 1592, 1437, +1372, 1409, 1457, 1418, 1265, 1126, 1078, 999, 748, 355, -32, -232, -325, -523, -881, -1260, +-1574, -1887, -2299, -2641, -2660, -2468, -2285, -2189, -2159, -2121, -2018, -1860, -1612, -1303, -969, -617, +-410, -410, -431, -275, -1, 283, 469, 560, 603, 613, 694, 931, 1146, 1134, 1041, 1030, +1117, 1175, 1061, 839, 687, 641, 658, 676, 770, 1008, 1310, 1536, 1581, 1479, 1399, 1455, +1519, 1474, 1337, 1220, 1238, 1252, 1058, 683, 315, 98, -6, -229, -551, -801, -1026, -1404, +-1913, -2351, -2541, -2511, -2403, -2284, -2237, -2216, -2138, -2025, -1928, -1737, -1352, -917, -653, -598, +-607, -481, -271, -60, 218, 430, 464, 439, 529, 771, 988, 1031, 978, 1002, 1116, 1211, +1161, 997, 857, 760, 676, 608, 595, 744, 1053, 1340, 1463, 1428, 1371, 1429, 1534, 1505, +1358, 1241, 1291, 1407, 1287, 941, 633, 447, 262, -1, -275, -435, -590, -918, -1422, -1919, +-2294, -2441, -2403, -2366, -2355, -2275, -2186, -2156, -2168, -2088, -1734, -1276, -974, -814, -720, -667, +-566, -353, -31, 216, 269, 267, 361, 585, 808, 898, 885, 932, 1055, 1152, 1177, 1094, +982, 893, 776, 605, 485, 524, 775, 1078, 1251, 1279, 1266, 1348, 1510, 1509, 1317, 1213, +1308, 1435, 1375, 1137, 911, 755, 515, 190, -48, -199, -312, -495, -902, -1450, -1918, -2203, +-2314, -2400, -2448, -2336, -2210, -2239, -2332, -2301, -2070, -1733, -1379, -1073, -905, -888, -845, -643, +-329, -46, 50, 67, 173, 384, 586, 709, 750, 808, 938, 1057, 1114, 1103, 1065, 1042, +940, 720, 513, 430, 547, 833, 1036, 1061, 1086, 1256, 1440, 1449, 1288, 1199, 1300, 1385, +1344, 1262, 1144, 986, 780, 460, 168, -2, -68, -147, -443, -949, -1425, -1771, -2088, -2342, +-2428, -2331, -2243, -2281, -2357, -2384, -2336, -2115, -1749, -1371, -1131, -1079, -1074, -901, -587, -318, +-176, -124, -9, 192, 388, 533, 605, 669, 816, 949, 997, 1052, 1106, 1145, 1124, 958, +652, 441, 496, 715, 868, 862, 921, 1170, 1371, 1373, 1298, 1259, 1302, 1366, 1364, 1343, +1314, 1234, 1088, 799, 421, 208, 184, 147, -77, -444, -819, -1223, -1686, -2070, -2236, -2255, +-2216, -2202, -2259, -2348, -2420, -2364, -2065, -1660, -1351, -1250, -1235, -1092, -819, -566, -390, -295, +-187, 25, 229, 355, 452, 576, 715, 856, 954, 994, 1067, 1210, 1316, 1216, 874, 588, +613, 730, 750, 731, 815, 1064, 1281, 1336, 1311, 1308, 1321, 1367, 1376, 1355, 1376, 1453, +1402, 1118, 733, 510, 460, 373, 212, 26, -243, -637, -1126, -1590, -1904, -2063, -2104, -2074, +-2086, -2200, -2368, -2447, -2255, -1898, -1596, -1426, -1368, -1267, -1025, -753, -589, -481, -335, -155, +40, 205, 308, 430, 591, 761, 883, 862, 920, 1182, 1410, 1352, 1064, 813, 755, 775, +703, 641, 702, 876, 1086, 1220, 1234, 1236, 1311, 1375, 1335, 1239, 1319, 1512, 1530, 1298, +1004, 765, 617, 489, 376, 281, 126, -174, -606, -1091, -1523, -1859, -2024, -2001, -1969, -2086, +-2315, -2473, -2433, -2180, -1865, -1695, -1606, -1473, -1282, -1058, -862, -725, -578, -412, -209, -10, +87, 173, 391, 629, 703, 648, 710, 1014, 1319, 1357, 1186, 1019, 918, 851, 752, 631, +590, 691, 900, 1055, 1070, 1122, 1283, 1326, 1224, 1143, 1220, 1421, 1513, 1416, 1220, 987, +768, 597, 486, 430, 342, 144, -147, -550, -1068, -1545, -1813, -1888, -1870, -1936, -2185, -2436, +-2487, -2358, -2136, -1969, -1847, -1697, -1533, -1342, -1122, -967, -863, -672, -423, -246, -187, -79, +182, 458, 507, 440, 522, 803, 1116, 1262, 1239, 1149, 1054, 986, 890, 688, 566, 643, +784, 848, 899, 1039, 1223, 1282, 1190, 1112, 1156, 1297, 1439, 1479, 1401, 1230, 985, 770, +664, 558, 476, 421, 260, -48, -513, -1072, -1499, -1679, -1689, -1744, -1981, -2268, -2409, -2401, +-2300, -2143, -2016, -1913, -1761, -1539, -1336, -1209, -1105, -871, -594, -470, -441, -298, 8, 272, +329, 288, 358, 555, 852, 1105, 1165, 1146, 1177, 1177, 1021, 785, 655, 678, 700, 679, +729, 913, 1114, 1218, 1168, 1082, 1107, 1178, 1300, 1454, 1489, 1380, 1213, 1003, 816, 687, +593, 565, 541, 393, 34, -522, -1056, -1334, -1430, -1535, -1721, -1980, -2221, -2330, -2296, -2195, +-2127, -2082, -1915, -1657, -1498, -1446, -1309, -1024, -743, -665, -643, -470, -179, 95, 240, 225, +216, 383, 689, 931, 1022, 1122, 1282, 1343, 1202, 1004, 894, 853, 797, 677, 659, 841, +1040, 1154, 1205, 1153, 1092, 1120, 1232, 1395, 1510, 1514, 1418, 1254, 1062, 875, 715, 658, +728, 743, 496, 29, -491, -889, -1113, -1256, -1409, -1653, -1965, -2162, -2175, -2166, -2209, -2205, +-2024, -1773, -1685, -1669, -1497, -1211, -964, -854, -824, -726, -454, -114, 83, 69, 50, 227, +475, 640, 785, 981, 1211, 1345, 1271, 1120, 1073, 1013, 884, 735, 650, 697, 870, 1058, +1152, 1142, 1073, 1059, 1113, 1246, 1398, 1482, 1471, 1419, 1291, 1042, 803, 712, 788, 887, +783, 468, 29, -440, -777, -956, -1100, -1365, -1710, -1920, -1992, -2106, -2263, -2267, -2111, -1951, +-1873, -1838, -1715, -1465, -1196, -1035, -1033, -998, -713, -346, -151, -116, -83, 53, 255, 371, +489, 750, 1036, 1188, 1227, 1215, 1183, 1146, 1035, 858, 684, 623, 723, 915, 1057, 1108, +1068, 989, 1010, 1114, 1233, 1336, 1428, 1509, 1471, 1217, 929, 784, 797, 893, 941, 808, +446, -24, -397, -579, -784, -1117, -1405, -1589, -1759, -1987, -2183, -2237, -2171, -2074, -1989, -1985, +-1941, -1678, -1358, -1228, -1226, -1191, -961, -619, -412, -332, -216, -52, 49, 115, 253, 498, +775, 997, 1115, 1179, 1213, 1238, 1196, 1023, 829, 677, 642, 771, 958, 1058, 1048, 970, +967, 1034, 1069, 1137, 1309, 1492, 1537, 1387, 1119, 903, 797, 848, 1016, 1034, 741, 344, +44, -186, -477, -823, -1064, -1253, -1490, -1740, -1996, -2181, -2165, -2065, -2072, -2143, -2115, -1883, +-1568, -1422, -1442, -1385, -1174, -915, -726, -571, -393, -227, -150, -95, 14, 194, 480, 748, +904, 1027, 1150, 1243, 1279, 1198, 1006, 783, 639, 683, 853, 968, 971, 973, 991, 988, +943, 966, 1147, 1365, 1493, 1508, 1358, 1046, 815, 848, 1048, 1113, 930, 687, 455, 169, +-128, -449, -744, -940, -1122, -1414, -1762, -2007, -2054, -1993, -2046, -2209, -2235, -2027, -1761, -1633, +-1614, -1539, -1361, -1198, -1019, -811, -612, -411, -292, -271, -211, -52, 179, 435, 634, 798, +966, 1123, 1252, 1305, 1174, 930, 731, 679, 747, 821, 868, 950, 997, 929, 870, 884, +959, 1104, 1328, 1534, 1486, 1188, 936, 871, 918, 993, 1016, 917, 715, 465, 162, -158, +-459, -699, -885, -1140, -1503, -1790, -1926, -1982, -2058, -2166, -2203, -2140, -2025, -1855, -1676, -1576, +-1515, -1407, -1238, -1019, -802, -601, -433, -325, -271, -184, -40, 168, 432, 655, 805, 968, +1147, 1281, 1287, 1145, 960, 794, 684, 707, 839, 955, 973, 959, 961, 941, 881, 934, +1161, 1394, 1494, 1452, 1272, 1014, 856, 895, 1045, 1086, 930, 716, 482, 178, -124, -416, +-679, -896, -1127, -1424, -1733, -1955, -2023, -2000, -2064, -2203, -2213, -2017, -1768, -1643, -1616, -1539, +-1367, -1204, -1022, -813, -613, -413, -295, -273, -211, -54, 179, 432, 628, 793, 968, 1131, +1256, 1300, 1172, 938, 742, 693, 760, 831, 879, 964, 1006, 925, 852, 866, 969, 1149, +1365, 1517, 1440, 1170, 966, 917, 953, 1009, 1035, 966, 769, 486, 187, -74, -324, -579, +-832, -1112, -1414, -1646, -1800, -1919, -2040, -2137, -2144, -2081, -1985, -1840, -1694, -1606, -1544, -1449, +-1270, -1038, -813, -616, -497, -444, -369, -213, -28, 128, 285, 513, 770, 988, 1178, 1310, +1285, 1136, 989, 876, 792, 793, 897, 1028, 1070, 976, 841, 771, 850, 1067, 1310, 1424, +1389, 1285, 1190, 1079, 953, 970, 1125, 1191, 1034, 757, 515, 367, 202, -70, -408, -725, +-958, -1144, -1375, -1632, -1828, -1966, -2033, -2058, -2025, -1911, -1804, -1751, -1699, -1642, -1539, -1338, +-1063, -807, -723, -755, -650, -398, -245, -176, -42, 126, 337, 654, 985, 1196, 1254, 1210, +1144, 1036, 886, 789, 840, 1010, 1138, 1063, 850, 673, 661, 888, 1168, 1272, 1268, 1292, +1259, 1110, 926, 911, 1086, 1216, 1133, 918, 725, 610, 512, 271, -69, -385, -632, -833, +-1057, -1337, -1581, -1781, -1962, -2067, -2076, -2015, -1937, -1868, -1808, -1807, -1825, -1662, -1310, -1072, +-1021, -949, -802, -658, -511, -387, -293, -203, -46, 246, 593, 884, 1063, 1156, 1190, 1135, +943, 774, 756, 883, 1062, 1127, 932, 667, 599, 740, 917, 1025, 1133, 1282, 1310, 1137, +941, 875, 995, 1156, 1156, 1002, 857, 778, 722, 541, 234, -58, -303, -525, -766, -1021, +-1276, -1516, -1755, -1930, -2008, -2064, -2028, -1865, -1811, -1936, -1976, -1816, -1565, -1360, -1224, -1113, +-988, -861, -691, -546, -476, -423, -330, -107, 209, 501, 768, 1016, 1161, 1180, 1077, 872, +725, 810, 1036, 1150, 1007, 765, 670, 680, 719, 802, 976, 1201, 1315, 1206, 995, 876, +932, 1072, 1107, 1024, 927, 890, 851, 730, 500, 245, 10, -243, -483, -680, -954, -1275, +-1473, -1668, -1932, -2088, -2009, -1868, -1866, -1984, -2035, -1962, -1813, -1609, -1441, -1321, -1213, -1085, +-905, -704, -636, -622, -521, -376, -170, 116, 410, 697, 982, 1171, 1165, 927, 721, 779, +976, 1086, 1046, 904, 799, 727, 634, 629, 774, 1041, 1241, 1217, 1039, 906, 916, 1003, +1057, 1012, 966, 971, 942, 848, 749, 540, 239, 29, -128, -378, -681, -911, -1086, -1375, +-1731, -1930, -1938, -1868, -1843, -1917, -2018, -2017, -1928, -1769, -1567, -1461, -1394, -1235, -1026, -863, +-745, -697, -644, -555, -398, -167, 53, 337, 758, 1115, 1202, 1042, 850, 845, 972, 1069, +1088, 1068, 1012, 914, 737, 608, 675, 927, 1167, 1246, 1138, 1008, 1016, 1055, 1040, 1059, +1074, 1030, 1028, 1065, 991, 777, 557, 416, 226, -65, -315, -469, -671, -970, -1354, -1658, +-1751, -1750, -1761, -1782, -1886, -1997, -1952, -1810, -1668, -1574, -1495, -1360, -1198, -1009, -821, -749, +-734, -642, -499, -386, -287, -42, 414, 895, 1112, 1077, 958, 918, 980, 1045, 1079, 1128, +1178, 1091, 907, 685, 621, 813, 1065, 1156, 1150, 1125, 1076, 1046, 1073, 1091, 1039, 1012, +1094, 1163, 1072, 939, 835, 703, 501, 214, -14, -122, -288, -595, -944, -1285, -1525, -1612, +-1611, -1645, -1777, -1913, -1929, -1866, -1783, -1666, -1586, -1522, -1376, -1153, -963, -875, -827, -705, +-581, -562, -570, -407, 4, 511, 881, 980, 981, 975, 981, 997, 1032, 1100, 1234, 1278, +1081, 799, 683, 758, 896, 1048, 1150, 1131, 1043, 1072, 1126, 1058, 979, 996, 1086, 1153, +1103, 1021, 1017, 934, 704, 440, 232, 104, -17, -236, -560, -958, -1284, -1416, -1479, -1571, +-1681, -1797, -1913, -1932, -1859, -1770, -1725, -1691, -1559, -1351, -1177, -1065, -958, -821, -688, -657, +-720, -687, -422, 11, 465, 782, 892, 935, 968, 949, 932, 1011, 1153, 1260, 1220, 1027, +789, 678, 754, 914, 1039, 1097, 1089, 1049, 1084, 1094, 1014, 966, 1001, 1074, 1122, 1084, +1028, 1018, 921, 693, 434, 232, 111, -11, -237, -564, -959, -1283, -1416, -1479, -1571, -1530, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -131, -130, -112, -55, 7, 88, 261, 384, 401, 344, 79, -214, -427, -992, -1160, +-1241, -1401, -2201, -2055, -527, -855, -1542, -590, 480, 2065, 2442, 2204, 1098, -1111, -1862, -2177, +-2552, -484, 2371, 3523, 3760, 5597, 6960, 6247, 5100, 3271, 1533, 1582, 163, -3814, -5117, -5932, +-9419, -10881, -8405, -6486, -6308, -4201, -527, 2979, 8252, 13054, 11656, 6009, 1835, -1357, -4647, -4065, +695, 1347, -365, -339, 2860, 8373, 11092, 8459, 5760, 5028, 6089, 3362, -650, -2165, -9841, -16419, +-15745, -15059, -12164, -9967, -8689, -4457, -668, 7097, 14251, 11937, 11357, 7828, -501, -3825, -3392, -1188, +-1525, -4824, -4241, -1308, 5813, 10591, 5520, 5111, 5454, 1303, -519, -3452, -5727, -10548, -17605, -17877, +-17967, -17805, -13480, -14475, -12935, -5990, 553, 8473, 13697, 15338, 12118, 4920, 2789, 4347, 3771, 2911, +-1031, -2955, 5506, 11827, 13589, 15175, 13622, 11526, 5651, 1268, 1033, -3960, -9873, -13434, -16759, -15173, +-12138, -11092, -12622, -13175, -7786, -1777, 6062, 14518, 16519, 12621, 7398, 4101, 4555, 5698, 2052, -2819, +-2690, 2520, 7690, 11583, 16445, 18664, 13726, 9740, 8316, 4874, -14, -5568, -12495, -17393, -16192, -12143, +-12599, -15586, -14254, -12197, -6790, 4941, 13203, 16969, 15986, 10492, 7946, 8751, 7352, 795, -4485, -3404, +-536, 2816, 8975, 15248, 14594, 10772, 9540, 7673, 5263, 3458, -2327, -10959, -15415, -13638, -13600, -16470, +-16980, -19826, -20593, -13734, -4547, 5212, 11321, 8182, 3762, 3762, 6132, 3473, -4743, -4370, -3339, -3392, +1838, 9835, 14948, 14418, 12430, 10360, 6911, 8171, 9595, -177, -7308, -9425, -13113, -12410, -12019, -16845, +-20278, -22128, -19197, -8665, 2650, 8721, 5479, 2382, 6790, 7422, 1884, -673, -601, -2377, -787, 5741, +12583, 16069, 18910, 18102, 12416, 13267, 15719, 10179, 3131, -4479, -11214, -14018, -13661, -14535, -16986, -20677, +-21923, -19232, -7189, 6936, 8813, 5551, 6119, 8459, 6319, 1761, -14, -2912, -7463, -3011, 2266, 5979, +14938, 17470, 14273, 13454, 14927, 15664, 12932, 5763, -1747, -9043, -12634, -12778, -14986, -16356, -20513, -26390, +-23336, -9578, 2473, 4760, 4600, 8881, 8765, 6492, 6046, 1269, -4265, -6066, -6486, -4352, 2587, 10898, +12938, 11035, 11665, 12832, 13202, 12267, 5801, -2236, -8387, -13729, -16084, -15631, -15735, -21097, -29322, -24704, +-11408, -4351, -198, 5654, 7322, 8356, 9671, 6762, 1522, -2011, -5898, -9210, -6076, 2716, 10360, 13092, +14518, 15673, 18286, 21093, 20461, 15407, 9367, 2530, -5565, -8562, -5900, -8081, -19188, -25450, -21358, -15459, +-8794, -1539, 1627, 3285, 7475, 7632, 4947, 2382, -1312, -8144, -12397, -9100, -2065, 4866, 10076, 11797, +14794, 19340, 22709, 23163, 20431, 16575, 8384, -1977, -1193, 2073, -5554, -14838, -20455, -22185, -17197, -10743, +-6381, -3290, -268, 2603, 1987, 734, 361, -4863, -11813, -15931, -14018, -7403, -533, 4208, 7803, 12008, +18047, 21563, 22509, 25258, 21161, 10035, 3533, 5257, 4617, -1981, -10141, -17207, -20034, -16084, -11078, -7662, +-2822, 1219, 3473, 5095, 5822, 5789, 895, -7954, -12859, -12878, -8929, -2296, 485, 3920, 10400, 14069, +15383, 21467, 24728, 18381, 9505, 5944, 6209, 5144, 642, -7160, -15689, -18312, -16505, -14411, -10743, -5382, +-1769, -614, 1347, 4397, 4317, -946, -8467, -15086, -16396, -11422, -8335, -6195, 882, 5946, 6260, 11406, +20326, 22278, 16670, 11226, 7263, 6713, 7868, 3579, -5208, -12949, -16321, -17619, -16796, -12719, -6638, -5249, +-3925, 112, 2352, 3401, 1198, -8389, -15081, -14124, -13394, -12253, -6414, 911, 2862, 4317, 13295, 20961, +22839, 20842, 14234, 9771, 11081, 10911, 6232, -2449, -8995, -13834, -18227, -17396, -12599, -9306, -6635, -4127, +-2044, 2254, 6174, 2182, -5971, -8751, -10806, -14375, -11599, -4949, -1895, -158, 3227, 10586, 18994, 23034, +20447, 14500, 11756, 13188, 12762, 8029, 2062, -4341, -11943, -16286, -15770, -14073, -9967, -7317, -7771, -3484, +3347, 5693, 1742, -2050, -6016, -12356, -15559, -12219, -8363, -5455, -3946, -1228, 6346, 15219, 19329, 17073, +12313, 11148, 12743, 11248, 8878, 4608, -3000, -9657, -14219, -15802, -13003, -8679, -8648, -8356, -2173, 3882, +4824, 4760, 3027, -2455, -9297, -13094, -11294, -7759, -6424, -5024, -2263, 4303, 14688, 18424, 15778, 13622, +12722, 12453, 12711, 11287, 7279, 553, -6295, -13124, -15940, -12683, -11187, -12984, -10313, -4452, -358, 2257, +4227, 3943, -1414, -8530, -11613, -10222, -7897, -6247, -5903, -4679, 4462, 13899, 17229, 17804, 16656, 14862, +15218, 15969, 14976, 11811, 7082, -1890, -9668, -10113, -9443, -10692, -11667, -9041, -5055, -2341, 801, 5097, +4398, -936, -6706, -11499, -10892, -7882, -8163, -9657, -6324, 2139, 10383, 15419, 17470, 15950, 14899, 15553, +14984, 15143, 14876, 8687, -1704, -7086, -8990, -10618, -12830, -12873, -9973, -7881, -5155, 633, 4341, 4938, +1930, -5641, -10389, -8857, -7719, -10127, -11278, -8152, -1481, 7168, 13916, 15515, 15696, 15859, 14215, 14403, +16943, 16359, 9365, 571, -4393, -6794, -10852, -12727, -11862, -11449, -9706, -5843, -1052, 4451, 7022, 3343, +-3716, -7360, -6093, -7687, -10408, -11843, -11151, -4803, 3974, 9386, 13527, 15592, 14532, 13503, 14603, 18505, +18242, 10876, 4298, -204, -5543, -9683, -11933, -12845, -13559, -12732, -10198, -6059, 1303, 3939, -128, -5101, +-7716, -8195, -9032, -12089, -14756, -14145, -8736, -1452, 4651, 10510, 13676, 12218, 10805, 14251, 18280, 17045, +11941, 7490, 1549, -4014, -7694, -10911, -12786, -13084, -13568, -12445, -6005, 1801, 3931, 1636, -1747, -4657, +-4501, -5535, -9887, -12803, -12814, -9306, -3654, 2844, 10576, 13203, 10276, 11746, 15453, 18061, 18459, 15834, +11025, 5359, 230, -4625, -8654, -9717, -11373, -14561, -12464, -5924, 1041, 4460, 2817, -615, -2236, -2484, +-4014, -8732, -12197, -12383, -12024, -7667, 849, 7946, 9735, 8960, 10930, 13843, 16343, 18564, 16694, 12737, +8889, 2335, -3370, -6109, -8575, -12492, -15762, -15277, -9224, -2520, 868, 209, -2330, -3076, -2784, -5803, +-9887, -12219, -14554, -15916, -10987, -2285, 3687, 6333, 7071, 8879, 11602, 14994, 17129, 16575, 14767, 9979, +3284, -1454, -4370, -7086, -11354, -16005, -15386, -10294, -3552, 588, -61, -831, -19, -715, -3273, -5278, +-8221, -12541, -14565, -9433, -2271, 3835, 7724, 9032, 10762, 13813, 16459, 18772, 19896, 18410, 14138, 7184, +2366, 287, -3774, -9271, -14135, -15711, -10968, -4127, -1265, -490, 763, 1163, -334, -1255, -2425, -6965, +-12668, -14170, -11208, -5173, 1215, 4747, 6559, 8935, 11511, 13984, 16553, 19493, 19415, 14273, 8741, 4771, +1723, -1904, -7535, -14394, -15961, -11327, -6305, -3835, -974, 1255, 212, 255, 1125, -955, -5508, -10924, +-14208, -12203, -7027, -1260, 2473, 4892, 8340, 9991, 11908, 16023, 19615, 19351, 16123, 10718, 6678, 4693, +1127, -6281, -13629, -15024, -12622, -9706, -5798, -2200, -1141, -860, 382, 1546, 509, -3897, -9932, -13749, +-13018, -8938, -4347, -511, 3185, 5706, 7006, 9649, 14207, 18315, 19485, 16489, 11456, 8836, 7811, 3284, +-4409, -10692, -13500, -13573, -10887, -6984, -4051, -2474, -2406, -304, 1666, 1255, -2315, -8533, -12818, -12559, +-10503, -6765, -2062, 1522, 4111, 5254, 7762, 12402, 16989, 18796, 15713, 11452, 10610, 9203, 4249, -2119, +-8789, -12835, -14751, -12922, -8905, -6374, -5016, -4057, -2228, 560, 1011, -2581, -8160, -12305, -13234, -12764, +-9611, -4600, -1003, 1627, 3381, 5359, 10618, 16380, 18124, 15840, 13376, 13127, 11656, 6944, 1642, -4757, +-10883, -13654, -12424, -9506, -7184, -5686, -4852, -2550, 1233, 2095, -1034, -5365, -9214, -12029, -12478, -10073, +-5766, -2076, 852, 1557, 3671, 9467, 14881, 16158, 14873, 14257, 14069, 12376, 9138, 4562, -2482, -8933, +-12370, -12319, -9852, -7300, -6609, -5917, -2368, 1077, 1900, 323, -2922, -7303, -10706, -12338, -11273, -7146, +-2989, -965, -642, 2317, 8368, 12929, 14329, 14867, 14750, 14373, 13557, 11211, 6524, 146, -6652, -11114, +-11294, -8948, -7498, -7070, -5393, -1862, 1312, 3377, 2774, -82, -3750, -7878, -10948, -10522, -6509, -2919, +-2041, -1738, 1761, 7203, 10795, 13281, 14364, 14322, 14243, 13902, 11957, 8187, 1677, -5774, -11148, -12183, +-11027, -10702, -10032, -8403, -4917, -1169, 1233, 1801, 314, -3174, -7651, -11829, -11673, -7357, -4849, -4479, +-3192, 269, 4944, 9008, 11986, 13722, 14302, 14678, 14881, 13757, 11076, 4849, -2841, -8278, -10095, -10357, +-10657, -10538, -8662, -5492, -1966, 931, 2498, 2104, -453, -6041, -10624, -10049, -7086, -5666, -5052, -4093, +-888, 3473, 7409, 10945, 13038, 14202, 14618, 15180, 15383, 13113, 7567, 241, -5149, -7655, -9276, -10618, +-10467, -9262, -6319, -2736, -163, 2616, 4006, 998, -4681, -8905, -9333, -7433, -6925, -6195, -5349, -2646, +1522, 5238, 9008, 11741, 12757, 13738, 15024, 16175, 14934, 9344, 2603, -2369, -6301, -8683, -10557, -11567, +-10276, -7767, -5497, -2327, 1636, 3808, 1225, -3857, -7652, -8559, -7670, -7375, -7274, -6259, -4079, -314, +3690, 7586, 10618, 11957, 12662, 14962, 17124, 15648, 10940, 5039, -404, -4481, -7776, -11119, -12348, -11581, +-9883, -8106, -4724, 642, 3400, 1382, -2843, -6147, -7403, -7521, -7690, -7457, -7105, -5360, -1742, 1595, +6174, 9546, 10097, 11765, 15157, 17091, 16991, 12997, 7670, 2893, -1538, -5436, -9406, -10897, -10289, -10508, +-9611, -5543, 119, 3195, 1833, -1176, -4170, -6395, -6463, -7122, -7905, -6960, -6057, -3941, 676, 5059, +7638, 8856, 10800, 14446, 17169, 17604, 14608, 9686, 5876, 1139, -4231, -7848, -9457, -10218, -11468, -10992, +-6640, -1271, 1836, 2273, -646, -3547, -4828, -6243, -7498, -7073, -7141, -7246, -4733, -482, 3581, 6146, +7452, 9459, 13332, 16946, 17464, 15167, 11913, 8305, 3033, -2406, -6044, -7751, -10271, -12370, -11843, -8416, +-3096, 1212, 1495, -344, -1955, -4400, -6405, -7016, -7206, -7982, -8438, -6201, -2171, 1833, 4531, 5760, +8270, 12662, 16229, 17254, 16080, 14124, 10967, 5300, 36, -2943, -5843, -9238, -11759, -12722, -9568, -3860, +-314, 1012, 920, -714, -3119, -5025, -5813, -6744, -8160, -9181, -7246, -3355, 585, 3019, 4465, 7135, +11656, 15243, 16308, 16610, 16180, 12683, 7387, 3065, -519, -3590, -7498, -11608, -12854, -10159, -5506, -2096, +212, 849, -642, -2938, -4371, -5087, -6182, -8278, -9551, -8100, -4847, -958, 1255, 2363, 6032, 10710, +13146, 15410, 17310, 16629, 13562, 9008, 4638, 1455, -1660, -6443, -11427, -12945, -11105, -7676, -3974, -754, +695, -442, -2279, -3104, -4289, -5936, -8016, -10271, -9457, -5727, -2838, -1758, 358, 4287, 7241, 10300, +14088, 16370, 16670, 14813, 10048, 6262, 3782, 150, -5230, -10367, -12449, -12011, -9657, -5492, -1620, -120, +-557, -1690, -2577, -3608, -4863, -7771, -10729, -9056, -6343, -5081, -3108, -401, 2339, 5613, 8978, 12476, +15783, 16875, 14899, 10945, 8182, 6186, 2171, -3482, -8548, -12065, -13253, -11489, -7252, -3357, -1376, -758, +-1685, -2422, -2122, -4203, -8143, -9902, -8929, -7606, -6216, -4251, -1912, 869, 3835, 6840, 10872, 15248, +16991, 15364, 12522, 10622, 8575, 4401, -780, -6036, -10733, -13213, -11630, -8395, -4676, -1525, -1442, -2135, +-868, -988, -3768, -6595, -8398, -8398, -7740, -6706, -4966, -2723, 71, 2649, 5292, 9930, 14723, 16504, +15664, 13973, 12929, 10632, 6933, 2663, -3495, -9075, -11824, -12268, -9562, -4995, -2636, -2379, -1347, 244, +-212, -2601, -5247, -7321, -7959, -7648, -7267, -5660, -3263, -1066, 746, 3277, 8370, 13462, 14948, 15329, +15129, 13462, 11941, 9517, 4776, -1055, -6420, -10941, -12410, -9760, -6125, -4412, -3452, -1339, 385, 336, +-1633, -4338, -6471, -7463, -8209, -8044, -6638, -4222, -2393, -1652, 1688, 6994, 11016, 13862, 15499, 14859, +14322, 13757, 11321, 7436, 2439, -3884, -9778, -11489, -9629, -7365, -5663, -4071, -1849, 468, 642, -1044, +-3273, -5541, -6682, -8086, -8809, -6844, -5070, -4897, -3466, -234, 4041, 8684, 12227, 13834, 14308, 14542, +13957, 12103, 9644, 4747, -2436, -8465, -10887, -10322, -8775, -7521, -5632, -2957, -787, 141, -1146, -3192, +-4508, -6400, -8805, -8711, -6925, -6473, -5960, -4568, -2179, 2054, 7028, 10406, 12530, 14019, 14627, 14169, +13662, 12162, 7384, 258, -6236, -9089, -9913, -9887, -8452, -6763, -4241, -774, -71, -1063, -1409, -3011, +-5886, -7709, -7548, -6811, -6501, -5817, -5216, -3497, 1055, 5425, 8584, 11951, 13776, 14322, 14637, 15113, +14592, 9956, 2903, -2773, -7176, -9086, -9181, -9316, -7925, -4384, -1823, -1160, -593, -411, -2741, -5370, +-6606, -7478, -7097, -6514, -7111, -7098, -5052, -1568, 2449, 6162, 9925, 12232, 12611, 13829, 15429, 14708, +11092, 5349, -1247, -5765, -7814, -9902, -10924, -8694, -5636, -3877, -1895, -141, -396, -2292, -4151, -6287, +-6955, -6228, -6520, -7495, -7413, -5928, -3003, 404, 4795, 9027, 10756, 12051, 14278, 15624, 16150, 13929, +7822, 1747, -2193, -5928, -9357, -9937, -8006, -6420, -4093, -1303, 174, 801, -271, -2838, -4568, -5162, +-4817, -5470, -6932, -6754, -5789, -4330, -419, 4231, 7586, 9956, 11687, 13689, 16078, 17843, 15713, 10332, +5628, 1050, -4457, -7848, -8986, -8770, -7157, -5041, -2489, -134, 666, -185, -2489, -4522, -4505, -4636, +-6154, -6808, -7027, -7352, -5979, -2189, 1684, 5287, 7968, 9454, 11660, 15538, 17189, 15289, 12051, 7948, +2527, -2836, -6798, -8803, -9325, -8587, -6557, -4128, -1554, 447, -442, -2817, -3697, -3985, -5041, -5778, +-6381, -7705, -8435, -6989, -4360, -557, 3893, 5766, 6963, 10808, 14554, 16004, 15754, 13784, 10084, 4795, +-636, -4989, -8114, -9548, -9114, -8203, -5774, -1939, -22, -1041, -1842, -2681, -3997, -4452, -4738, -6238, +-7503, -8044, -8075, -5855, -1166, 2139, 3392, 5817, 9676, 12968, 15069, 15813, 15113, 11876, 7171, 2014, +-3079, -6695, -8235, -9629, -9452, -6376, -2960, -1542, -1090, -1179, -2616, -3492, -3358, -4395, -5549, -6343, +-8603, -9229, -6281, -2560, 41, 1731, 4393, 8244, 11257, 13884, 15778, 15338, 13241, 9521, 3973, -917, +-4128, -7160, -9802, -9392, -6801, -4458, -2211, -817, -1557, -2135, -2535, -3397, -3806, -4027, -5919, -8619, +-9205, -6627, -3835, -1755, 304, 3274, 6440, 9757, 13118, 15094, 15778, 15113, 11292, 6084, 2223, -1723, +-6311, -8852, -9213, -8163, -5541, -2846, -1992, -1638, -1701, -2836, -3498, -2957, -3231, -5527, -8617, -8995, +-7060, -5579, -3433, -988, 1222, 4485, 8252, 11106, 13799, 16104, 15692, 12207, 8794, 5100, -68, -4443, +-7509, -9529, -8540, -6098, -4008, -2422, -1388, -1633, -3011, -3352, -2004, -2527, -5373, -7702, -8140, -7651, +-6278, -4181, -2446, -176, 3585, 6395, 9256, 13448, 15964, 15404, 14069, 11321, 7165, 2592, -2142, -6567, +-8886, -8576, -7025, -5116, -2912, -1293, -1984, -3282, -2308, -1074, -2249, -4393, -6386, -7990, -7862, -6582, +-5439, -3828, -795, 1723, 3946, 8043, 12148, 14554, 15654, 15099, 12743, 9721, 5333, 123, -4601, -7360, +-8060, -7670, -5862, -2785, -1590, -2549, -2687, -1381, -993, -1674, -3174, -5819, -7578, -7286, -7384, -6654, +-4149, -2082, -447, 2417, 6160, 10111, 13146, 14894, 15199, 13924, 11668, 7771, 2158, -2484, -5608, -7878, +-8470, -6071, -3297, -2862, -3095, -2327, -1790, -1098, -925, -3128, -5425, -6486, -7670, -8392, -7103, -5287, +-3870, -2228, 452, 3966, 7752, 11248, 13476, 14124, 14073, 12837, 8900, 3792, -285, -4490, -8422, -8903, +-6655, -5393, -4433, -3760, -3622, -2531, -1109, -1727, -3174, -4458, -6030, -7800, -8438, -7562, -6360, -5389, +-3635, -1339, 1841, 5933, 9606, 11722, 13303, 14608, 13548, 9976, 6524, 2150, -3706, -7470, -8184, -7524, +-6013, -4757, -4717, -4020, -2189, -1447, -1763, -2200, -3292, -5270, -7046, -7743, -7362, -6732, -5736, -4327, +-2744, 654, 4870, 7755, 10175, 13359, 14781, 13821, 12227, 9454, 4136, -1366, -5427, -7657, -7146, -5851, +-5582, -5025, -3658, -2277, -1642, -1442, -1471, -2601, -4582, -6000, -7141, -7317, -6638, -5906, -5427, -3858, +-185, 3128, 5535, 9454, 12676, 13762, 14613, 14197, 11438, 7001, 1274, -3704, -6179, -6287, -5995, -5952, +-5166, -3843, -2708, -1806, -1031, -812, -1738, -3406, -4847, -6497, -6894, -6070, -6411, -6300, -4020, -1495, +792, 4160, 7952, 10791, 12897, 14583, 14948, 13267, 9405, 3557, -1565, -4319, -5298, -5909, -6070, -5327, +-4122, -3247, -1954, -706, -590, -998, -1947, -4128, -5717, -5501, -5936, -6951, -6044, -4471, -2970, -430, +2890, 6189, 9305, 11841, 14067, 15375, 14789, 11421, 5765, 768, -2358, -4452, -5828, -6059, -5468, -4963, +-3730, -2012, -1414, -658, -114, -1958, -3941, -4393, -5095, -6330, -6749, -6152, -5484, -4131, -1671, 1276, +4425, 7652, 10287, 13007, 15499, 15796, 12797, 7698, 3193, -396, -3454, -4885, -5387, -5989, -5227, -3611, +-2947, -1681, 76, -128, -1800, -2627, -3414, -4747, -5790, -6247, -6267, -5865, -4709, -2684, 23, 3176, +6133, 8640, 12022, 15492, 16299, 13929, 10146, 5844, 1328, -1565, -3319, -5220, -5674, -4789, -4498, -3625, +-1431, -104, -379, -1150, -1742, -2703, -3939, -4925, -5793, -6152, -6090, -5506, -3806, -1282, 1561, 3968, +6528, 10827, 14618, 15624, 14808, 11727, 7049, 3155, 61, -3038, -4868, -5193, -5570, -5722, -4379, -2231, +-1158, -1007, -1265, -1830, -2712, -3868, -4952, -5898, -6501, -6751, -6641, -5403, -2750, -649, 1092, 4441, +8771, 12386, 14884, 15034, 12195, 8627, 5073, 987, -2457, -4127, -5197, -6416, -6471, -4992, -3163, -1938, +-1447, -1442, -1871, -2708, -3520, -4651, -5706, -6113, -7141, -7535, -5608, -3708, -2511, -304, 2703, 6405, +10781, 13988, 14364, 12683, 10441, 6813, 2385, -774, -2869, -4871, -6574, -6854, -5646, -4163, -2898, -1955, +-1941, -2065, -2350, -3541, -4479, -4985, -6238, -7840, -7601, -6228, -5159, -3649, -1798, 382, 4446, 9330, +12307, 13462, 13399, 11718, 8124, 4068, 1004, -1531, -4217, -6176, -6713, -6124, -4662, -3146, -2414, -2068, +-1588, -2279, -3220, -3225, -4276, -6187, -7328, -7573, -6930, -5598, -4390, -3409, -1233, 3098, 7548, 10795, +13222, 14148, 12883, 9744, 6186, 3212, 119, -2736, -4909, -6311, -6043, -4622, -3722, -2681, -1460, -1452, +-2135, -2173, -2341, -3730, -5225, -6520, -7355, -6613, -5398, -5139, -4643, -2435, 1341, 5444, 9008, 12399, +14124, 13322, 11072, 8116, 4892, 1850, -1228, -4274, -5933, -5798, -5363, -4543, -2665, -1800, -2030, -1892, +-1723, -2044, -2908, -4357, -6224, -7051, -6113, -5336, -5670, -5298, -3297, -144, 3539, 7617, 11587, 13586, +13708, 12402, 9621, 6987, 4273, 407, -2727, -4365, -5551, -5779, -4458, -2931, -2312, -1966, -1611, -1509, +-1352, -1847, -3712, -5778, -6281, -5625, -5512, -6047, -5614, -4041, -1844, 1819, 6097, 9856, 12816, 13762, +12607, 11002, 9075, 5730, 1981, -834, -3319, -5339, -5427, -4436, -3501, -2584, -2108, -2082, -1574, -815, +-1341, -3390, -5292, -5541, -5408, -5827, -6066, -5927, -5312, -3266, -53, 3725, 8230, 11660, 12707, 12751, +12272, 10156, 6987, 3995, 760, -2450, -4451, -5155, -4946, -3916, -2914, -2566, -2406, -1433, -330, -1131, +-3200, -4476, -5041, -5374, -5555, -5946, -6352, -5862, -4444, -2090, 1928, 6709, 9844, 11683, 12932, 12587, +10891, 8589, 5682, 2295, -944, -3509, -4916, -5063, -4170, -3323, -3282, -2823, -1217, -198, -1133, -2566, +-3787, -4738, -5000, -5317, -6084, -6305, -6262, -5938, -3739, 269, 4508, 7924, 10686, 12313, 12430, 11478, +9695, 7082, 3819, 453, -2450, -4533, -5006, -4203, -4057, -4212, -3066, -1454, -734, -1123, -2282, -3636, +-4279, -4601, -5308, -5713, -5946, -6889, -6925, -4917, -1536, 2474, 6271, 9414, 11516, 12207, 12086, 10916, +8505, 5578, 2211, -1523, -3892, -4192, -4117, -4582, -4330, -3206, -2009, -863, -1012, -2200, -2917, -3566, +-4457, -4824, -4944, -5743, -7008, -7309, -5903, -3231, 473, 4560, 7967, 10311, 11868, 12387, 11521, 9911, +7605, 3787, -311, -2377, -3390, -4231, -4579, -4551, -3760, -2027, -958, -1222, -1715, -2282, -3419, -4258, +-4357, -4657, -5646, -6878, -7384, -6681, -4703, -1255, 2617, 5898, 8870, 11086, 11756, 11805, 11272, 8910, +4963, 1317, -1241, -2885, -3892, -4866, -5247, -3979, -2468, -1685, -1317, -1357, -2038, -3162, -3849, -3992, +-4490, -5503, -6701, -7609, -7470, -5876, -2803, 585, 4093, 7638, 9740, 11048, 12227, 11908, 9897, 6628, +2860, 255, -1454, -3309, -4885, -5144, -4120, -2993, -1990, -1160, -1081, -1801, -2704, -3330, -3523, -4036, +-4881, -6041, -7433, -7676, -6452, -4414, -1084, 2817, 6032, 8479, 10586, 12207, 12597, 11121, 7952, 4508, +2115, -53, -2474, -4185, -4724, -4395, -3425, -2220, -1123, -844, -1490, -2136, -2574, -3057, -3257, -3941, +-5473, -6755, -7252, -7103, -5528, -2330, 1158, 4312, 7032, 9476, 11746, 12883, 11760, 9062, 6243, 3768, +1168, -1417, -3447, -4438, -4547, -3922, -2517, -1366, -1161, -1384, -1890, -2560, -2731, -2798, -3692, -4928, +-6181, -7394, -7821, -6567, -3936, -563, 2608, 5263, 8144, 11143, 12562, 11900, 9992, 7716, 5285, 2546, +-277, -2520, -4079, -4803, -4163, -2833, -1815, -1204, -1311, -2025, -2389, -2411, -2741, -3249, -4165, -5614, +-7084, -7962, -7398, -5073, -1976, 814, 3522, 6963, 10241, 12032, 12008, 10762, 9056, 6741, 3922, 1255, +-1247, -3481, -4381, -4128, -3219, -1955, -1228, -1408, -1738, -1923, -2073, -2317, -2616, -3419, -4766, -6416, +-7897, -7665, -5728, -3357, -780, 2038, 5614, 9219, 11230, 11756, 11497, 10160, 8019, 5632, 2919, -176, +-2666, -4057, -4309, -3439, -2108, -1485, -1409, -1525, -1790, -1939, -2115, -2322, -2717, -4027, -6066, -7670, +-7824, -6546, -4709, -2658, 169, 4030, 7589, 9867, 11311, 11521, 10451, 9033, 6986, 4146, 1158, -1709, +-3765, -4422, -3868, -2762, -2047, -1735, -1744, -1833, -2006, -2196, -2068, -2239, -3612, -5627, -7463, -7916, +-7040, -6014, -4355, -1314, 2147, 5641, 8649, 10446, 11048, 10741, 9735, 7935, 5425, 2477, -784, -3181, +-4251, -4206, -3282, -2549, -2265, -2004, -2174, -2439, -2339, -1968, -1977, -3122, -5317, -7022, -7528, -7546, +-7044, -5501, -3008, 230, 3974, 7122, 9251, 10514, 10700, 10076, 8910, 6663, 3708, 566, -2228, -3844, +-4054, -3555, -2995, -2350, -1976, -2200, -2449, -2350, -1738, -1533, -2760, -4697, -6157, -7128, -7543, -7424, +-6500, -4427, -1303, 2249, 5665, 8290, 9867, 10571, 10686, 9740, 7895, 5417, 2073, -1103, -2836, -3706, +-3782, -3082, -2396, -1968, -2119, -2563, -2206, -1393, -1285, -2285, -3865, -5279, -6360, -7206, -7627, -7208, +-5568, -2866, 680, 4303, 7032, 9052, 10427, 10718, 10356, 9322, 6840, 3628, 614, -1747, -3189, -3641, +-3231, -2308, -1838, -2125, -2439, -1881, -1069, -966, -1757, -3174, -4524, -5600, -6744, -7538, -7587, -6587, +-4171, -731, 2577, 5597, 7997, 9430, 10400, 10795, 10062, 8146, 5119, 1904, -782, -2784, -3782, -3370, +-2355, -2071, -2474, -2603, -2115, -1274, -915, -1595, -2731, -3873, -5084, -6193, -7206, -7914, -7317, -5335, +-2420, 944, 4058, 6505, 8382, 9786, 10637, 10600, 9113, 6460, 3565, 604, -2125, -3482, -3182, -2527, +-2354, -2684, -2871, -2289, -1296, -966, -1257, -2133, -3306, -4338, -5511, -6955, -7824, -7724, -6301, -3697, +-571, 2560, 5212, 7240, 9133, 10646, 10976, 9825, 7924, 5301, 1944, -1065, -2644, -2855, -2339, -2274, +-2828, -2827, -2158, -1404, -749, -868, -1633, -2457, -3381, -4616, -6157, -7435, -7825, -6994, -4878, -1862, +1255, 3836, 6093, 8521, 10270, 10827, 10500, 9222, 6695, 3433, 104, -1968, -2285, -2168, -2411, -2695, +-2808, -2346, -1419, -769, -844, -1350, -2019, -2804, -3963, -5444, -6970, -7857, -7716, -6038, -3219, -371, +2092, 4739, 7379, 9290, 10400, 10705, 9991, 8049, 4641, 1063, -1065, -1901, -2171, -2339, -2836, -3066, +-2560, -1712, -1101, -1007, -1288, -1728, -2387, -3355, -4720, -6343, -7848, -8282, -6841, -4436, -2012, 663, +3385, 6051, 8327, 9657, 10622, 10816, 9113, 5901, 2492, -28, -1228, -1800, -2230, -2855, -3125, -2676, +-1911, -1246, -915, -1007, -1331, -1976, -2758, -3797, -5671, -7549, -8059, -7292, -5479, -3174, -725, 2109, +4949, 7035, 8806, 10551, 11343, 10048, 7217, 3922, 1219, -333, -1160, -1904, -2630, -3008, -2676, -1996, +-1460, -998, -877, -1339, -1676, -1915, -2995, -4909, -6833, -7902, -7627, -6320, -4571, -2108, 915, 3543, +5582, 7846, 10141, 11346, 10727, 8468, 5328, 2522, 696, -458, -1546, -2498, -2869, -2652, -2289, -1531, +-888, -1012, -1311, -1212, -1457, -2325, -4095, -6244, -7478, -7573, -7094, -5713, -3219, -411, 1895, 4052, +6671, 9267, 10997, 11130, 9276, 6414, 3692, 1752, 193, -1290, -2215, -2698, -3022, -2477, -1642, -1339, +-1328, -1374, -1260, -1090, -1719, -3541, -5571, -6911, -7687, -7922, -6695, -4224, -1777, 385, 2596, 5198, +8157, 10414, 11140, 9821, 7278, 4963, 2869, 795, -604, -1744, -2814, -3079, -2550, -1933, -1538, -1571, +-1614, -1219, -825, -1457, -3081, -4692, -6109, -7627, -8275, -7375, -5292, -3160, -1166, 1055, 3663, 6763, +9752, 10862, 9976, 8267, 6124, 3716, 1838, 341, -1276, -2581, -3019, -2722, -2092, -1714, -1833, -1763, +-1001, -582, -1211, -2322, -3558, -5244, -7155, -8149, -7519, -5974, -4109, -2092, -268, 2219, 5860, 8949, +10406, 10610, 9405, 7295, 5155, 3295, 1411, -490, -2004, -2690, -2503, -1776, -1698, -1973, -1471, -668, +-482, -869, -1454, -2369, -4298, -6376, -7532, -7641, -6449, -4541, -3131, -1568, 1160, 4571, 7676, 9940, +10757, 9935, 8259, 6520, 4555, 2560, 552, -1457, -2389, -2063, -1763, -2001, -2041, -1350, -639, -571, +-571, -700, -1766, -3501, -5474, -7289, -7679, -6567, -5359, -4303, -2703, -261, 2874, 6251, 8979, 10137, +9935, 8857, 7203, 5522, 3706, 1212, -998, -1887, -1842, -1973, -2315, -2171, -1514, -1119, -741, -379, +-485, -1155, -2601, -4946, -6878, -7379, -6836, -6073, -5112, -3789, -1766, 1301, 4819, 7695, 9521, 9881, +8994, 7905, 6725, 4774, 2096, -228, -1190, -1588, -2154, -2355, -2147, -1885, -1379, -915, -549, -192, +-409, -1814, -4112, -6008, -6868, -6906, -6392, -5741, -4863, -2985, -82, 3384, 6752, 9024, 9586, 9138, +8583, 7776, 5774, 3009, 965, -276, -1342, -1935, -2144, -2203, -1949, -1479, -1150, -679, 36, 50, +-1319, -3323, -5265, -6535, -6792, -6609, -6420, -5752, -4246, -1719, 1698, 5339, 7976, 8832, 8951, 9213, +8398, 6257, 3958, 1890, 155, -1044, -1747, -2225, -2369, -2047, -1842, -1723, -941, -47, -39, -946, +-2766, -4858, -6147, -6698, -6935, -6960, -6538, -5408, -3363, 9, 3889, 6324, 7536, 8641, 9244, 8598, +7017, 4984, 2739, 817, -466, -1604, -2350, -2331, -2289, -2406, -2030, -1233, -357, 69, -561, -2236, +-4171, -5497, -6263, -6898, -6979, -6822, -6509, -4636, -1093, 2371, 4838, 6705, 8352, 9146, 8984, 7982, +6036, 3863, 2115, 309, -1165, -1735, -1977, -2225, -2315, -2122, -1409, -339, 422, 14, -1585, -3177, +-4582, -5855, -6367, -6571, -7174, -7236, -5419, -2285, 695, 3333, 5760, 7586, 8865, 9354, 8522, 6898, +5100, 3085, 987, -515, -1296, -1723, -2079, -2300, -2389, -1785, -395, 501, 160, -884, -2315, -4020, +-5216, -5578, -6236, -7428, -7633, -6098, -3677, -860, 2014, 4439, 6578, 8384, 9133, 8817, 7817, 6246, +4181, 2008, 323, -728, -1379, -1763, -2306, -2658, -1858, -419, 401, 528, -93, -1698, -3501, -4393, +-4803, -5984, -7314, -7633, -6782, -4776, -2085, 514, 3127, 5659, 7719, 8811, 8957, 8482, 7149, 5211, +3190, 1222, -90, -677, -1408, -2354, -2693, -1982, -812, 185, 954, 538, -1225, -2652, -3319, -4163, +-5374, -6792, -7627, -7168, -5578, -3347, -887, 1809, 4585, 6768, 8211, 8936, 8789, 7897, 6371, 4184, +2025, 766, 28, -1058, -2142, -2455, -2206, -1427, 23, 1055, 553, -815, -1887, -2593, -3433, -4714, +-6340, -7489, -7413, -6328, -4593, -2268, 461, 3217, 5614, 7495, 8584, 8921, 8579, 7246, 4971, 2922, +1674, 477, -901, -1773, -2382, -2684, -1761, -90, 915, 634, -414, -1361, -2038, -2865, -4198, -5924, +-7200, -7452, -6965, -5646, -3541, -1069, 1660, 4365, 6452, 7894, 8856, 9079, 7803, 5713, 4024, 2427, +766, -357, -1381, -2560, -3036, -2096, -442, 630, 596, -209, -1081, -1611, -2322, -3735, -5411, -6759, +-7532, -7476, -6449, -4757, -2555, 250, 3017, 5057, 6943, 8687, 8989, 7917, 6506, 4803, 2885, 1412, +366, -1041, -2593, -3174, -2379, -920, 309, 468, -249, -788, -1050, -1820, -3085, -4593, -6225, -7438, +-7676, -7105, -5957, -3746, -849, 1488, 3647, 6252, 8144, 8602, 8325, 7309, 5468, 3616, 2357, 1093, +-614, -2282, -3138, -2730, -1203, 52, 188, -115, -334, -696, -1355, -2257, -3708, -5579, -6825, -7428, +-7730, -6808, -4582, -2317, -169, 2536, 5306, 7246, 8344, 8771, 7949, 6195, 4636, 3323, 1869, 180, +-1769, -3004, -2669, -1388, -361, -7, 71, -71, -457, -736, -1495, -3119, -4703, -5922, -7265, -7878, +-6984, -5341, -3655, -1423, 1388, 4017, 6225, 8082, 8892, 8306, 6954, 5517, 4266, 2939, 1073, -1161, +-2595, -2450, -1596, -773, -33, 230, 31, 19, -130, -1103, -2422, -3611, -5182, -6965, -7657, -7125, +-6268, -4844, -2508, 60, 2598, 5230, 7446, 8530, 8324, 7298, 6122, 5147, 3973, 1858, -596, -2041, +-2335, -1990, -1022, -209, -107, 33, 357, 17, -825, -1557, -2665, -4633, -6405, -7117, -7292, -6976, +-5628, -3650, -1422, 1173, 4093, 6584, 8071, 8276, 7481, 6601, 6084, 4852, 2601, 338, -1400, -2308, +-2011, -1090, -579, -323, 250, 477, -49, -353, -677, -2011, -3817, -5359, -6511, -7238, -7160, -6181, +-4679, -2687, -87, 2855, 5711, 7713, 8063, 7571, 7375, 6971, 5643, 3728, 1411, -841, -1941, -1704, +-1308, -1030, -296, 309, 190, 71, 184, -184, -1384, -2852, -4470, -6005, -6973, -7170, -6630, -5433, +-3789, -1609, 1417, 4705, 6762, 7303, 7538, 7671, 7284, 6471, 4838, 2201, -206, -1239, -1660, -1844, +-1311, -444, -100, -53, 190, 373, -4, -911, -2173, -3828, -5473, -6678, -7278, -7032, -6182, -5144, +-3166, 133, 3358, 5428, 6616, 7235, 7346, 7422, 7155, 5482, 2893, 838, -536, -1669, -1987, -1452, +-863, -601, -273, 150, 314, 160, -415, -1568, -3068, -4760, -6316, -7055, -6959, -6792, -6281, -4322, +-1204, 1719, 4231, 5919, 6528, 7017, 7773, 7644, 6024, 3865, 1890, 14, -1409, -1785, -1504, -1225, +-874, -420, -22, 309, 322, -198, -969, -2208, -4082, -5700, -6333, -6735, -7303, -6954, -5278, -2731, +347, 3285, 4943, 5727, 6879, 7986, 7886, 6738, 5085, 2982, 773, -806, -1468, -1590, -1436, -1049, +-636, -71, 436, 423, 241, -92, -1466, -3409, -4739, -5557, -6557, -7314, -7222, -6292, -4084, -788, +2025, 3673, 4992, 6578, 7741, 7963, 7498, 6209, 3995, 1749, -22, -1095, -1457, -1490, -1350, -825, +-119, 207, 407, 785, 509, -966, -2549, -3708, -4987, -6157, -7003, -7601, -7214, -5062, -1933, 654, +2484, 4304, 6000, 7163, 7897, 7938, 6916, 4949, 2716, 715, -539, -1188, -1617, -1511, -849, -458, +-276, 400, 990, 609, -482, -1695, -3017, -4355, -5427, -6611, -7859, -7830, -5881, -3266, -888, 1288, +3381, 5119, 6555, 7713, 8116, 7484, 5813, 3566, 1604, 228, -906, -1577, -1376, -987, -958, -530, +433, 939, 774, 128, -981, -2315, -3390, -4414, -6128, -7787, -7892, -6457, -4455, -2125, 215, 2277, +4163, 5881, 7309, 8203, 8054, 6570, 4560, 2798, 1025, -558, -1173, -1115, -1233, -1208, -533, 342, +846, 1087, 649, -576, -1684, -2384, -3641, -5692, -7355, -7767, -7019, -5365, -3163, -955, 1168, 3166, +4943, 6778, 8229, 8278, 7121, 5663, 3785, 1566, -14, -646, -1079, -1460, -1314, -749, -36, 773, +1301, 752, -373, -995, -1595, -3033, -5032, -6819, -7744, -7478, -6224, -4308, -2065, 80, 1871, 3825, +6141, 7709, 8073, 7728, 6644, 4560, 2314, 785, -195, -998, -1403, -1423, -1241, -471, 696, 1176, +633, -61, -395, -966, -2292, -4208, -6182, -7455, -7671, -7025, -5278, -3062, -1271, 506, 2833, 5133, +6740, 7748, 8124, 7278, 5328, 3328, 1666, 255, -658, -1195, -1641, -1655, -660, 580, 996, 654, +252, -4, -438, -1590, -3447, -5322, -6859, -7743, -7441, -5895, -4149, -2622, -620, 1815, 3981, 5836, +7484, 8252, 7659, 6133, 4330, 2477, 920, 50, -812, -1757, -1777, -744, 319, 795, 639, 396, +365, 61, -949, -2479, -4251, -6193, -7514, -7365, -6243, -5028, -3555, -1457, 752, 2798, 4992, 7030, +8025, 7938, 7001, 5244, 3276, 1947, 901, -476, -1606, -1714, -860, 142, 638, 588, 596, 739, +414, -319, -1408, -3319, -5625, -7005, -7125, -6624, -5789, -4265, -2327, -514, 1609, 4070, 6133, 7503, +8124, 7465, 5751, 4122, 2912, 1561, -39, -1365, -1749, -1050, -176, 223, 461, 725, 749, 542, +328, -530, -2574, -4900, -6278, -6935, -7065, -6346, -4954, -3457, -1741, 528, 2914, 5092, 7082, 8182, +7714, 6390, 5035, 3744, 2303, 487, -1084, -1533, -1022, -452, 14, 501, 695, 571, 692, 895, +109, -1795, -3768, -5306, -6578, -7008, -6481, -5651, -4505, -2752, -650, 1542, 4073, 6492, 7857, 7814, +6868, 5751, 4681, 3141, 1039, -596, -1254, -1241, -920, -223, 393, 393, 358, 855, 1149, 407, +-1015, -2716, -4601, -6128, -6711, -6682, -6319, -5230, -3698, -2015, 107, 2769, 5389, 7163, 7519, 7043, +6482, 5563, 3858, 1719, 46, -960, -1471, -1181, -320, 71, -34, 265, 925, 1144, 728, -201, +-1941, -3949, -5439, -6387, -6865, -6670, -5841, -4697, -3277, -1317, 1393, 4293, 6293, 6959, 7035, 6951, +6119, 4427, 2558, 869, -663, -1468, -1138, -530, -452, -400, 112, 609, 982, 1106, 358, -1282, +-3095, -4749, -6041, -6755, -6833, -6282, -5455, -4419, -2622, 204, 3204, 5247, 6293, 7006, 7221, 6420, +5059, 3462, 1492, -392, -1160, -993, -820, -754, -504, -177, 279, 947, 1241, 687, -601, -2263, +-3965, -5462, -6478, -6759, -6424, -6027, -5405, -3712, -884, 1930, 4016, 5603, 6797, 7154, 6682, 5866, +4368, 2114, 226, -644, -1015, -1077, -901, -728, -447, 166, 920, 1331, 1015, 3, -1414, -3119, +-4866, -6090, -6440, -6367, -6459, -6152, -4522, -1904, 609, 2874, 4930, 6279, 6836, 7073, 6733, 5166, +2998, 1196, -65, -769, -892, -860, -838, -568, 12, 806, 1325, 1254, 628, -453, -2125, -4054, +-5349, -5805, -6201, -6819, -6635, -5127, -2985, -665, 1944, 4187, 5544, 6614, 7406, 7144, 5793, 3944, +2062, 620, -204, -536, -711, -869, -728, -157, 661, 1233, 1384, 1193, 380, -1388, -3343, -4465, +-5082, -5989, -6822, -6674, -5698, -4170, -1784, 882, 2957, 4674, 6297, 7346, 7441, 6490, 4803, 2890, +1312, 293, -233, -600, -925, -868, -255, 487, 984, 1422, 1647, 912, -879, -2577, -3520, -4541, +-5751, -6489, -6724, -6440, -5062, -2785, -447, 1631, 3624, 5516, 6954, 7519, 6994, 5584, 3750, 2062, +892, 198, -453, -1006, -931, -385, 117, 657, 1514, 2030, 1231, -371, -1661, -2798, -4108, -5149, +-6027, -6784, -6822, -5717, -3789, -1641, 439, 2563, 4674, 6386, 7355, 7324, 6281, 4546, 2871, 1695, +709, -268, -869, -815, -550, -350, 330, 1542, 2022, 1393, 393, -736, -2065, -3358, -4484, -5651, +-6736, -7051, -6236, -4660, -2776, -760, 1388, 3582, 5514, 6971, 7446, 6657, 5133, 3633, 2401, 1134, +-104, -688, -760, -1006, -901, 115, 1282, 1692, 1479, 814, -296, -1561, -2690, -3800, -5159, -6503, +-7125, -6736, -5614, -4036, -2111, -6, 2223, 4462, 6395, 7284, 6809, 5587, 4403, 3100, 1469, 258, +-249, -803, -1376, -1127, -144, 866, 1481, 1590, 1088, 66, -1006, -1976, -3079, -4547, -6019, -6862, +-6854, -6171, -4828, -3109, -1219, 987, 3476, 5841, 7030, 6830, 6189, 5271, 3654, 2062, 1122, 338, +-607, -1285, -1141, -382, 553, 1374, 1709, 1350, 509, -357, -1155, -2268, -3828, -5330, -6435, -6855, +-6495, -5430, -3925, -2300, -214, 2582, 5073, 6322, 6792, 6740, 5755, 4154, 2787, 1827, 734, -411, +-1181, -1268, -715, 198, 1120, 1666, 1420, 742, 160, -568, -1669, -3111, -4668, -5979, -6797, -6760, +-5876, -4881, -3641, -1355, 1488, 3871, 5587, 6768, 7017, 6117, 4746, 3557, 2477, 1254, 0, -920, +-1239, -993, -114, 1001, 1552, 1428, 1041, 609, 19, -973, -2277, -3777, -5427, -6544, -6601, -6200, +-5749, -4601, -2344, 203, 2584, 4809, 6514, 7049, 6487, 5435, 4370, 3228, 1857, 563, -525, -1268, +-1211, -330, 720, 1346, 1400, 1236, 1027, 447, -325, -1317, -2957, -4828, -5927, -6252, -6457, -6367, +-5278, -3373, -1208, 1261, 3835, 5881, 6759, 6547, 5908, 5035, 3874, 2646, 1328, -90, -1123, -1322, +-590, 430, 1027, 1341, 1449, 1198, 780, 401, -507, -2303, -4112, -5173, -5941, -6549, -6540, -5746, +-4301, -2436, -15, 2817, 5095, 6262, 6590, 6252, 5435, 4439, 3314, 2025, 465, -827, -1150, -617, +107, 780, 1336, 1411, 1144, 1107, 1012, -4, -1666, -3192, -4414, -5511, -6376, -6611, -6119, -5190, +-3641, -1144, 1703, 4111, 5735, 6446, 6362, 5722, 4903, 4016, 2701, 938, -447, -963, -844, -306, +580, 1184, 1111, 1130, 1442, 1331, 411, -1012, -2406, -3711, -5112, -6151, -6501, -6535, -6076, -4709, +-2398, 358, 2925, 4920, 6047, 6181, 5789, 5362, 4657, 3257, 1450, 55, -874, -1212, -614, 300, +730, 792, 1054, 1503, 1500, 711, -358, -1571, -3104, -4611, -5646, -6309, -6778, -6673, -5603, -3584, +-1017, 1676, 4020, 5432, 5760, 5773, 5765, 5101, 3758, 2230, 639, -739, -1246, -741, 3, 358, +500, 969, 1460, 1427, 965, 255, -915, -2455, -3917, -5041, -5979, -6784, -6968, -6224, -4619, -2322, +495, 3085, 4554, 5257, 5852, 5973, 5393, 4447, 3047, 1261, -352, -1017, -696, -247, -53, 266, +823, 1244, 1371, 1254, 768, -309, -1723, -3071, -4238, -5398, -6467, -6889, -6616, -5651, -3506, -593, +1841, 3516, 4828, 5684, 5947, 5735, 5130, 3868, 1954, 209, -563, -606, -506, -323, 103, 620, +1011, 1325, 1471, 1169, 190, -1107, -2287, -3541, -4900, -5933, -6606, -7030, -6440, -4428, -1868, 458, +2495, 4144, 5219, 5727, 5893, 5663, 4493, 2555, 860, -87, -525, -677, -506, -79, 379, 763, +1231, 1604, 1361, 511, -420, -1525, -2974, -4217, -5259, -6471, -7322, -6916, -5278, -3046, -734, 1520, +3427, 4624, 5414, 6057, 6097, 5020, 3270, 1666, 509, -268, -650, -565, -214, 112, 546, 1273, +1692, 1457, 1001, 269, -977, -2206, -3219, -4487, -6047, -7190, -7136, -5971, -4170, -1871, 542, 2495, +3843, 5071, 6127, 6367, 5525, 4052, 2495, 1144, 61, -530, -501, -401, -219, 439, 1158, 1485, +1641, 1481, 711, -438, -1433, -2346, -3765, -5512, -6808, -7133, -6567, -5159, -2936, -576, 1298, 2893, +4512, 5838, 6392, 5865, 4700, 3338, 1757, 442, -161, -507, -725, -395, 247, 800, 1298, 1746, +1700, 949, 19, -696, -1566, -3082, -4852, -6243, -7070, -7086, -5909, -3873, -1706, 180, 1936, 3822, +5459, 6155, 6024, 5351, 3966, 2346, 1174, 276, -468, -744, -476, -77, 382, 1106, 1757, 1746, +1107, 476, -20, -917, -2396, -3982, -5539, -6816, -7213, -6409, -4674, -2758, -1041, 934, 3133, 4785, +5832, 6268, 5752, 4474, 3112, 1873, 634, -263, -587, -525, -339, 131, 1020, 1733, 1690, 1250, +923, 465, -385, -1577, -3071, -4795, -6406, -7255, -6740, -5349, -3877, -2136, 3, 2095, 3943, 5503, +6274, 5960, 5039, 3914, 2568, 1144, 122, -361, -590, -622, -34, 990, 1603, 1636, 1479, 1250, +868, 214, -769, -2050, -3882, -5878, -6932, -6792, -6047, -4839, -3096, -1133, 909, 3093, 5012, 6003, +6062, 5555, 4612, 3220, 1747, 734, 22, -660, -827, -206, 647, 1261, 1488, 1466, 1379, 1049, +534, -14, -1103, -3081, -5124, -6346, -6784, -6532, -5516, -4039, -2382, -344, 2009, 4106, 5400, 5941, +5924, 5147, 3747, 2455, 1414, 314, -565, -854, -439, 344, 925, 1231, 1450, 1368, 1001, 825, +600, -485, -2354, -4222, -5722, -6663, -6720, -6013, -4932, -3523, -1508, 920, 3062, 4627, 5755, 6057, +5354, 4258, 3108, 1930, 695, -401, -849, -504, 65, 574, 1155, 1485, 1274, 1079, 1217, 996, +3, -1517, -3333, -5106, -6311, -6632, -6300, -5665, -4452, -2422, -161, 1965, 3963, 5420, 5917, 5539, +4719, 3771, 2649, 1208, -65, -568, -530, -249, 415, 1139, 1308, 1149, 1204, 1396, 1246, 553, +-679, -2455, -4390, -5735, -6268, -6467, -6193, -5078, -3381, -1393, 868, 3136, 4884, 5689, 5579, 5062, +4387, 3217, 1666, 457, -266, -673, -477, 285, 896, 1006, 982, 1146, 1360, 1341, 1034, 112, +-1685, -3590, -4973, -6016, -6673, -6609, -5819, -4487, -2662, -400, 2054, 4087, 5114, 5354, 5357, 4855, +3662, 2292, 1039, -142, -831, -673, 14, 523, 652, 806, 992, 1127, 1420, 1485, 625, -958, +-2623, -4208, -5592, -6474, -6724, -6333, -5355, -3844, -1600, 1076, 3212, 4476, 5268, 5544, 5063, 4127, +3008, 1666, 265, -573, -501, -71, 258, 574, 746, 725, 998, 1576, 1720, 1076, -134, -1695, +-3357, -4863, -6016, -6511, -6416, -5970, -4768, -2511, 36, 2149, 3836, 5030, 5482, 5259, 4682, 3771, +2268, 685, -187, -390, -247, 190, 585, 582, 552, 955, 1514, 1763, 1449, 519, -788, -2387, +-4149, -5455, -6105, -6549, -6554, -5492, -3490, -1181, 1063, 3106, 4570, 5209, 5347, 5201, 4360, 2836, +1377, 315, -311, -280, 169, 411, 390, 466, 874, 1495, 1890, 1733, 1165, 103, -1604, -3349, +-4601, -5608, -6511, -6797, -6016, -4385, -2312, 55, 2330, 3874, 4785, 5454, 5578, 4817, 3568, 2144, +749, -79, -122, 150, 327, 307, 328, 774, 1382, 1733, 1928, 1757, 766, -838, -2411, -3733, +-5063, -6290, -6770, -6343, -5233, -3355, -898, 1325, 2960, 4347, 5339, 5597, 5206, 4249, 2747, 1254, +301, 28, 180, 228, 84, 214, 642, 1073, 1571, 2095, 2119, 1239, -142, -1454, -2843, -4466, +-5824, -6549, -6744, -6062, -4230, -1952, 126, 2066, 3750, 4889, 5514, 5522, 4752, 3390, 1836, 700, +333, 273, 90, 0, 147, 387, 714, 1350, 2109, 2214, 1471, 482, -634, -2174, -3777, -5124, +-6311, -6990, -6482, -4995, -3114, -992, 1088, 2869, 4309, 5243, 5565, 5149, 3892, 2306, 1188, 658, +333, 76, 55, 146, 141, 368, 1173, 1987, 2096, 1731, 1106, -25, -1479, -2862, -4414, -5993, +-6847, -6720, -5736, -4071, -2085, -25, 1893, 3473, 4743, 5525, 5393, 4287, 2862, 1766, 1001, 401, +107, 133, 31, -176, 161, 993, 1623, 1925, 1982, 1465, 480, -601, -1955, -3687, -5387, -6571, +-6897, -6320, -5030, -3200, -1161, 752, 2536, 4206, 5357, 5489, 4636, 3455, 2382, 1342, 560, 327, +233, -166, -368, 36, 642, 1296, 1925, 2082, 1684, 1022, 128, -1147, -2865, -4692, -6113, -6819, +-6709, -5738, -4108, -2249, -396, 1541, 3543, 5020, 5378, 4895, 4074, 2943, 1663, 939, 658, 223, +-241, -357, -184, 301, 1093, 1766, 1987, 1792, 1377, 720, -401, -2047, -3863, -5462, -6559, -6854, +-6208, -4854, -3258, -1542, 557, 2819, 4412, 5035, 5109, 4531, 3289, 2162, 1503, 927, 373, -61, +-353, -353, 88, 846, 1522, 1809, 1792, 1655, 1233, 304, -1144, -2876, -4628, -6071, -6724, -6378, +-5397, -4238, -2665, -411, 1847, 3528, 4746, 5243, 4732, 3711, 2758, 1950, 1268, 701, 166, -301, +-461, -101, 614, 1231, 1565, 1738, 1809, 1584, 882, -319, -1927, -3801, -5555, -6449, -6362, -5917, +-5127, -3506, -1369, 728, 2746, 4390, 5111, 4892, 4154, 3249, 2360, 1614, 1015, 379, -234, -487, +-190, 422, 976, 1374, 1674, 1881, 1815, 1325, 439, -992, -3065, -4944, -5900, -6300, -6371, -5698, +-4266, -2469, -358, 1930, 3820, 4838, 4987, 4512, 3663, 2768, 2039, 1382, 592, -138, -458, -296, +198, 720, 1130, 1565, 1884, 1844, 1671, 1190, -233, -2285, -3998, -5211, -6128, -6473, -6044, -5062, +-3570, -1482, 895, 2955, 4338, 4912, 4690, 3960, 3198, 2530, 1795, 939, 115, -366, -311, 17, +357, 855, 1393, 1603, 1784, 2095, 1731, 371, -1342, -3008, -4552, -5760, -6316, -6273, -5722, -4484, +-2523, -219, 1990, 3750, 4666, 4682, 4216, 3619, 2984, 2263, 1322, 347, -155, -263, -244, 133, +752, 1061, 1273, 1804, 2268, 1979, 949, -449, -2130, -3851, -5205, -6030, -6406, -6216, -5251, -3573, +-1384, 998, 3041, 4235, 4571, 4319, 3851, 3390, 2673, 1608, 731, 161, -306, -352, 117, 531, +666, 1020, 1712, 2206, 2133, 1500, 338, -1314, -3065, -4509, -5627, -6352, -6444, -5855, -4543, -2484, +-58, 2162, 3701, 4303, 4255, 4120, 3768, 2943, 2025, 1212, 358, -282, -276, 98, 290, 423, +898, 1581, 2087, 2273, 1987, 1027, -471, -2108, -3706, -5105, -6041, -6467, -6306, -5312, -3511, -1146, +1327, 3081, 3885, 4273, 4376, 3982, 3300, 2589, 1674, 592, -73, -100, 33, 36, 207, 685, +1276, 1887, 2358, 2285, 1550, 357, -1208, -2901, -4365, -5554, -6333, -6500, -5966, -4512, -2147, 347, +2163, 3370, 4165, 4382, 4111, 3739, 3155, 2073, 911, 285, 101, -19, -50, 122, 439, 965, +1692, 2233, 2358, 2023, 1058, -357, -1923, -3527, -4911, -5881, -6516, -6503, -5278, -3093, -796, 1179, +2822, 3844, 4155, 4195, 4135, 3557, 2425, 1365, 685, 255, 31, -20, -34, 179, 738, 1398, +2033, 2444, 2311, 1608, 444, -1119, -2760, -4117, -5335, -6440, -6765, -5838, -4089, -2009, 198, 2090, +3243, 3831, 4284, 4417, 3857, 2869, 1871, 1007, 471, 198, -39, -128, 42, 436, 1077, 1830, +2335, 2468, 2125, 1117, -380, -1854, -3228, -4762, -6166, -6727, -6259, -5017, -3060, -736, 1225, 2495, +3457, 4208, 4439, 4106, 3312, 2285, 1431, 863, 411, 76, -106, -130, 160, 777, 1471, 2085, +2536, 2438, 1535, 298, -925, -2363, -4093, -5627, -6482, -6601, -5822, -3984, -1749, 142, 1690, 2955, +3857, 4346, 4236, 3539, 2636, 1800, 1112, 590, 190, -152, -296, -65, 411, 1015, 1828, 2516, +2512, 1828, 941, -106, -1620, -3371, -4917, -6200, -6878, -6387, -4852, -2885, -915, 820, 2274, 3477, +4224, 4287, 3797, 3031, 2173, 1436, 892, 357, -120, -276, -184, 33, 603, 1557, 2325, 2409, +2087, 1585, 604, -825, -2373, -4106, -5793, -6790, -6697, -5574, -3806, -1912, -128, 1546, 2974, 3931, +4281, 4073, 3409, 2587, 1901, 1239, 547, 74, -130, -271, -241, 376, 1357, 2023, 2296, 2352, +1968, 1117, 19, -1408, -3228, -5106, -6428, -6768, -6044, -4601, -2890, -1074, 742, 2335, 3544, 4201, +4160, 3633, 2982, 2320, 1546, 811, 396, 55, -390, -409, 212, 993, 1681, 2239, 2446, 2196, +1623, 760, -544, -2354, -4357, -5965, -6659, -6335, -5298, -3808, -2041, -209, 1542, 3047, 3960, 4127, +3843, 3392, 2679, 1777, 1158, 749, 133, -406, -434, -36, 590, 1361, 2030, 2330, 2277, 1990, +1371, 269, -1431, -3512, -5317, -6352, -6501, -5855, -4611, -2998, -1188, 711, 2452, 3501, 3887, 3997, +3677, 2889, 2158, 1647, 1050, 319, -247, -476, -339, 200, 1011, 1719, 2144, 2292, 2223, 1895, +1015, -579, -2623, -4541, -5886, -6443, -6168, -5254, -3955, -2203, -101, 1695, 2893, 3722, 4097, 3800, +3146, 2558, 1982, 1296, 600, -15, -439, -466, -50, 673, 1398, 1876, 2147, 2317, 2266, 1633, +230, -1685, -3670, -5332, -6209, -6262, -5841, -4825, -3060, -1036, 730, 2239, 3420, 3952, 3816, 3398, +2904, 2317, 1671, 963, 241, -328, -536, -249, 400, 1069, 1549, 1911, 2289, 2474, 2092, 1022, +-688, -2793, -4614, -5706, -6257, -6281, -5433, -3836, -2023, -198, 1557, 2917, 3624, 3757, 3538, 3138, +2606, 2015, 1346, 568, -134, -501, -379, 155, 742, 1179, 1649, 2171, 2482, 2423, 1714, 109, +-1911, -3692, -5082, -6116, -6463, -5876, -4636, -3031, -1138, 773, 2320, 3285, 3704, 3673, 3343, 2879, +2363, 1704, 888, 71, -453, -434, -25, 411, 887, 1434, 1958, 2501, 2811, 2300, 858, -911, +-2658, -4370, -5738, -6354, -6171, -5339, -3936, -2079, -119, 1576, 2831, 3519, 3671, 3525, 3184, 2712, +2125, 1273, 323, -258, -385, -226, 147, 642, 1106, 1663, 2433, 2920, 2598, 1565, 120, -1665, +-3557, -5132, -6051, -6273, -5836, -4700, -2977, -1030, 814, 2285, 3235, 3671, 3643, 3373, 3046, 2509, +1669, 804, 126, -304, -363, -46, 368, 793, 1420, 2177, 2700, 2716, 2147, 996, -707, -2685, +-4411, -5598, -6217, -6171, -5349, -3846, -1995, -128, 1558, 2825, 3476, 3625, 3528, 3262, 2739, 2039, +1263, 455, -169, -373, -228, 101, 544, 1106, 1769, 2362, 2649, 2514, 1717, 138, -1806, -3603, +-5046, -6059, -6398, -5868, -4646, -3019, -1127, 763, 2268, 3176, 3601, 3644, 3384, 2941, 2393, 1668, +817, 58, -379, -377, -68, 334, 850, 1449, 2017, 2562, 2823, 2293, 877, -885, -2646, -4352, +-5716, -6341, -6168, -5336, -3933, -2074, -114, 1569, 2817, 3506, 3666, 3525, 3184, 2712, 2123, 1266, +455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 289, 120, 246, 207, 206, 197, 139, 156, 91, 124, 71, 105, 66, 107, +81, 102, 62, 55, 17, 12, -16, -22, -34, -28, -28, -26, -27, -18, -34, -42, +-62, -76, -108, -125, -137, -148, -144, -132, -107, -66, -34, -2, 25, 66, 114, 109, +119, 132, 154, 183, 207, 220, 249, 262, 249, 246, 235, 228, 226, 248, 226, 199, +42, 76, 449, 744, -708, 745, -2440, -2270, -4685, -3028, -267, 4040, 5743, 1296, 4751, 1858, +1839, -1656, -1484, -1149, -6087, -11913, -7112, 1800, 5161, 11965, 12023, 11489, 7341, 515, 589, -6300, +-17471, -22962, -14186, -3862, -556, 13786, 17094, 22590, 8731, -1329, -9921, -17258, -27286, -28297, -8423, 713, +12595, 20661, 28752, 26855, 10283, -723, -3400, -10743, -24117, -26717, -6029, -1505, 13798, 13705, 21322, 19900, +5020, -1588, -5965, -7618, -25368, -16846, -9158, 317, 6724, 12149, 21162, 14632, 883, -4436, -265, -6368, +-23951, -10618, -4800, 7315, 7929, 11229, 18989, 7433, -6581, -13076, -13, -17022, -19237, -13487, -362, 11397, +10138, 18683, 21070, 8752, -7205, -8995, -1020, -18766, -17602, -12610, 2417, 8794, 6618, 17725, 17616, 10015, +-11775, -457, -3489, -14252, -18576, -14351, 1443, 6580, 9115, 18748, 18906, 4884, -10468, -209, -6241, -12107, +-16979, -10590, 8585, 9178, 18448, 19739, 22216, -3409, -10042, -7341, -12618, -17492, -21805, -8668, 7247, 10573, +18664, 27044, 23219, -1535, -5815, -8500, -14473, -18416, -24932, -4919, 1183, 10080, 13856, 30282, 19341, 3190, +240, -3901, -8163, -18983, -22503, -9125, -1747, 1278, 10228, 22677, 9838, -1819, -152, -4122, -763, -16452, +-11014, -3356, 4879, 2349, 14549, 19987, 5475, -2703, -6158, -4930, -9179, -19254, -16640, -6178, -413, 1680, +19406, 25612, 10374, 7682, -2417, 343, -13046, -21622, -21319, -9289, -7534, -249, 20713, 20735, 13633, 5612, +4007, 2541, -7667, -16457, -12494, -4633, -6826, -2022, 17196, 9944, 5500, -4729, -355, -1620, -7771, -15827, +-7400, 1436, -3159, 11364, 20016, 16629, 5538, -1183, -1104, -4376, -15640, -20823, -12732, -5338, -8571, 11941, +19495, 20423, 8593, 5064, 3579, -1605, -15340, -23331, -12484, -16697, -10651, 5660, 18407, 18256, 10456, 7739, +9545, 1191, -12209, -17729, -8612, -15015, -6586, 5749, 18291, 14150, 7029, 6195, 4439, -391, -18635, -12650, +-10842, -10675, -2493, 15014, 24689, 20385, 10739, 8936, 5280, -6096, -23040, -16585, -18345, -16542, -7539, 11881, +23723, 16783, 13119, 8010, 11026, -8418, -17409, -17187, -17490, -17820, -6092, 11933, 20861, 15058, 10267, 10676, +11271, -7822, -12075, -11883, -13507, -12809, -3166, 17888, 20035, 17313, 5785, 11606, 3217, -12117, -16242, -14180, +-15260, -13595, 879, 18288, 22183, 15320, 7452, 13030, 1253, -13270, -15820, -17088, -15954, -16801, 3338, 15813, +22984, 9548, 8145, 9666, -2196, -14379, -16410, -14278, -17606, -13704, 2611, 16933, 20961, 8199, 9252, 10031, +-4763, -12929, -17365, -13430, -20710, -10062, 2382, 22000, 19363, 9514, 12264, 8578, -3762, -14443, -13833, -15524, +-18598, -9790, 6009, 23694, 19808, 11257, 16192, 8323, -2400, -15027, -11016, -18534, -17024, -11466, 7749, 22604, +15096, 12139, 12750, 7511, -7929, -14214, -14312, -19920, -19353, -11418, 10279, 23874, 14860, 14868, 12508, 7196, +-10643, -12402, -17050, -19939, -21109, -12533, 13082, 20156, 16804, 14656, 16939, 6348, -7032, -10074, -14298, -18199, +-21094, -10589, 14059, 17092, 15279, 12077, 15969, 2080, -7080, -11484, -16137, -18809, -24390, -5742, 13336, 19901, +14709, 17087, 15983, 3120, -6504, -11898, -15921, -20815, -24708, -3134, 13032, 20319, 14807, 20157, 16397, 4433, +-2563, -10462, -11230, -23833, -22251, -5135, 13649, 16105, 15659, 20217, 15115, 3832, -4594, -10369, -12529, -25673, +-21109, -4172, 13723, 14151, 15518, 20051, 11780, 4433, -7778, -7754, -16045, -25467, -22024, -2301, 12250, 13237, +17240, 19827, 13503, 4593, -5914, -5896, -17564, -27069, -22794, -2163, 11504, 12038, 19913, 17781, 15776, 2034, +-2882, -6494, -16459, -26716, -19586, 594, 9805, 13206, 18125, 16920, 12959, -577, -3251, -7039, -18112, -26788, +-18553, 2532, 8073, 16465, 17664, 21117, 12035, 1748, -1620, -6035, -18848, -28804, -16676, -520, 6979, 13515, +16914, 20375, 11114, 1908, -335, -6983, -19906, -29839, -14171, -2665, 8756, 12304, 18747, 19199, 9678, 1978, +-725, -5864, -22730, -27205, -14439, -2548, 7040, 11316, 18262, 18387, 8094, 2911, -211, -5718, -25315, -24570, +-15396, -1201, 5891, 12007, 19545, 17061, 9036, 2337, 2943, -7628, -23770, -23605, -13374, -1052, 6094, 12968, +21073, 16646, 9501, 2794, 5305, -10616, -22563, -23346, -11989, -629, 5300, 15232, 19658, 17132, 6875, 5635, +4271, -11009, -23308, -22377, -11622, -934, 5058, 15597, 18509, 15412, 3856, 6641, 1591, -12735, -24335, -23440, +-11433, -4313, 5717, 13234, 19953, 12712, 6009, 8276, 2584, -12000, -22775, -20282, -9787, -3049, 7097, 14815, +21122, 11205, 7718, 9081, 1156, -12770, -24451, -18401, -11645, -1993, 5762, 17501, 19938, 11183, 8689, 9170, +745, -14495, -23964, -18650, -12285, -2597, 5171, 18031, 17910, 9629, 9669, 8000, 391, -16780, -22056, -19464, +-10274, -3372, 8219, 20038, 17774, 10982, 10763, 9779, 59, -16319, -20826, -18752, -10168, -3462, 9443, 20672, +15588, 11688, 9793, 10238, -3232, -16648, -23251, -18824, -12611, -5169, 9794, 18316, 14689, 10546, 10551, 9324, +-4132, -16886, -22621, -18891, -13288, -5292, 11835, 17413, 15673, 11002, 13938, 9249, -2950, -16769, -21761, -18200, +-15115, -4151, 11392, 16930, 14243, 11511, 14293, 9702, -3293, -16416, -21257, -18042, -16429, -2674, 10783, 17171, +12640, 12687, 14597, 9652, -2885, -16070, -18426, -18067, -14550, -1237, 12327, 16499, 12711, 13099, 14441, 8470, +-4248, -17206, -17832, -20274, -13828, -1272, 13137, 15199, 12180, 14117, 14268, 9411, -5549, -15224, -17953, -19813, +-14332, -541, 12121, 13597, 11399, 13321, 13308, 8375, -7191, -13992, -19243, -20244, -14723, 95, 12353, 12663, +12823, 13541, 15398, 7109, -5934, -13793, -18606, -20807, -14555, 924, 11466, 11994, 12733, 13515, 16184, 5766, +-5221, -13072, -18325, -20540, -13928, 2499, 10263, 12431, 11142, 14704, 14927, 5568, -5260, -12441, -17855, -20297, +-11913, 2935, 10175, 12004, 10744, 15450, 13976, 4520, -5594, -13234, -18921, -22062, -11312, 1692, 10064, 10284, +11684, 15856, 13770, 4135, -5834, -12809, -19473, -21852, -10457, 1942, 10042, 9473, 11485, 15806, 12484, 3786, +-5824, -11874, -20918, -20661, -10754, 2795, 9077, 9104, 12126, 15941, 12214, 3200, -5137, -12253, -21252, -20540, +-10278, 2949, 8634, 8960, 13705, 16443, 12856, 2592, -3682, -13210, -21060, -20583, -9682, 3260, 7554, 9094, +14083, 17176, 12308, 3740, -2734, -12509, -20205, -19227, -8025, 4298, 7264, 10142, 14466, 17716, 11036, 4475, +-2954, -12851, -20445, -19182, -6867, 3595, 6925, 10031, 15862, 17341, 10837, 4705, -3111, -13672, -21256, -19627, +-6644, 2197, 6494, 9097, 16189, 15740, 10259, 4354, -4243, -14545, -22561, -18917, -6853, 2247, 5151, 9877, +16342, 15407, 10574, 4936, -4054, -14211, -22800, -17391, -6488, 2434, 4807, 10928, 16614, 15087, 11120, 4833, +-2926, -14811, -21278, -16653, -5378, 1642, 4593, 11544, 16191, 14418, 10700, 4292, -3333, -15674, -21048, -16197, +-4945, 1010, 4738, 12474, 15775, 14917, 10259, 5325, -4089, -15869, -21608, -15743, -5431, -195, 4932, 12434, +15238, 14277, 9498, 5024, -5258, -16677, -21806, -15187, -5398, -769, 5736, 12109, 15861, 13754, 10598, 5314, +-4957, -16724, -20939, -13944, -5594, -658, 6464, 12660, 16216, 13778, 11228, 5386, -5573, -17443, -20907, -13363, +-6618, -306, 5926, 13065, 15111, 13518, 10992, 5064, -6145, -18155, -20361, -13541, -7224, -885, 5707, 12796, +14374, 13075, 10937, 4783, -6198, -18684, -19000, -13890, -6981, -1252, 6052, 12512, 13787, 12828, 10721, 4767, +-7434, -18137, -18397, -13305, -6790, -949, 6724, 12731, 13544, 12856, 10414, 4792, -8707, -17704, -18228, -12882, +-6940, -778, 7158, 12595, 13793, 13324, 11835, 5180, -8081, -16556, -17040, -12442, -6848, -381, 8047, 12494, +14252, 13002, 12245, 3880, -9128, -16929, -17061, -12371, -7066, 25, 8155, 12880, 13641, 13256, 12241, 3284, +-9596, -16968, -17241, -12381, -7801, 546, 7564, 12662, 13221, 14001, 12920, 3076, -9134, -16501, -16087, -12371, +-6964, 580, 8127, 12624, 13009, 14350, 12679, 2172, -9225, -16491, -15655, -12649, -6601, 811, 8663, 12529, +13196, 15239, 11755, 1688, -10318, -16071, -15684, -12442, -6550, 1092, 8774, 11860, 12878, 15435, 11363, 1554, +-10444, -15204, -15612, -12592, -7192, 834, 8577, 10836, 13508, 15035, 11441, 457, -10342, -15135, -15730, -13012, +-7570, 1344, 8737, 10595, 14035, 15063, 11534, -28, -10202, -15107, -15551, -12921, -7517, 2262, 7768, 11160, +13940, 15888, 11147, -185, -9615, -14243, -14991, -12900, -7184, 2116, 6827, 10419, 13468, 15780, 10120, -758, +-9667, -14686, -14952, -13876, -6145, 1744, 6905, 9920, 14117, 15654, 9532, -1036, -9639, -13694, -15323, -13791, +-5644, 1499, 6607, 9965, 14594, 15955, 9191, -612, -9473, -13018, -15843, -12843, -5529, 1865, 6208, 10165, +15029, 15601, 8776, -1493, -9240, -13025, -15994, -12697, -5130, 2104, 6567, 10270, 15369, 15009, 8737, -2025, +-8626, -13807, -15929, -12848, -5426, 1248, 5887, 10715, 15359, 14937, 7855, -1868, -8351, -13624, -16091, -12126, +-5301, 1574, 5450, 11287, 15455, 15500, 7424, -1203, -7938, -13657, -15885, -11952, -4748, 1287, 6016, 11503, +15906, 14558, 6981, -1383, -7637, -14005, -15533, -11848, -4015, 986, 6193, 11319, 16143, 14379, 6642, -989, +-7781, -13953, -15943, -11463, -4613, 483, 5316, 11364, 15902, 13755, 5771, -983, -8625, -14345, -16526, -10981, +-4845, 541, 5382, 11602, 16071, 13064, 6069, -922, -8244, -14559, -15377, -10444, -4451, 549, 5864, 12395, +16312, 12425, 6491, -743, -7574, -14562, -14399, -9882, -4298, 650, 6105, 13445, 15718, 12440, 5815, -244, +-8365, -14579, -14545, -10005, -4700, 194, 5892, 13545, 15233, 12071, 5840, -127, -8772, -14645, -14334, -10134, +-4596, -798, 6428, 12867, 15228, 11199, 6144, -600, -9053, -14626, -14049, -9843, -4501, -487, 7117, 13347, +14926, 10789, 6082, -810, -9501, -14035, -13978, -8916, -5020, -13, 6847, 13463, 14337, 11262, 6406, -948, +-9344, -13644, -13362, -8582, -5091, 323, 7519, 13552, 14122, 11025, 6783, -1249, -8791, -13968, -12471, -9039, +-5222, 113, 8222, 13680, 13847, 11132, 6431, -1437, -9213, -14347, -12652, -9314, -5567, 220, 7934, 13597, +13101, 11582, 5655, -1180, -9763, -13486, -12080, -8946, -5692, 257, 8446, 13172, 13314, 11166, 5943, -1349, +-9809, -13467, -12061, -9657, -5804, 100, 8912, 12480, 13414, 10442, 6066, -2030, -10020, -13300, -12025, -9430, +-6128, 905, 8776, 12780, 13337, 10738, 5814, -2372, -10262, -12591, -11841, -9246, -6420, 1877, 8616, 12984, +13100, 10943, 5876, -2674, -9916, -12562, -11412, -10089, -6111, 1816, 8716, 12408, 12771, 10854, 6022, -3080, +-9793, -12979, -11045, -10623, -5534, 1641, 8825, 12465, 12640, 11166, 5184, -2915, -10037, -11747, -11486, -10425, +-5478, 2185, 8835, 12300, 12335, 11136, 4626, -2994, -10296, -11199, -11976, -10435, -5286, 2101, 8921, 11569, +12701, 10420, 4819, -3970, -9749, -11212, -11689, -10151, -4759, 2344, 8704, 11404, 12790, 10151, 4691, -4211, +-8952, -10868, -11761, -9930, -4938, 3221, 8339, 11833, 12490, 10569, 4083, -4196, -8932, -10842, -12068, -9986, +-4683, 3343, 8272, 12100, 12739, 10895, 3716, -4539, -8533, -11268, -11561, -10449, -3943, 2951, 8819, 11747, +12896, 10302, 3229, -4287, -7992, -11152, -11864, -10335, -3551, 3017, 8435, 11505, 12713, 10234, 2417, -3682, +-8723, -10668, -12613, -9747, -3738, 3075, 8134, 11553, 12722, 9629, 2160, -3905, -8551, -11053, -12846, -9804, +-3647, 2862, 8064, 11193, 13090, 8583, 2401, -4195, -8011, -11479, -12445, -9493, -3169, 3071, 7870, 11616, +12876, 8689, 2562, -3586, -7564, -10929, -12182, -8892, -3232, 3497, 7811, 12677, 12798, 9062, 2385, -3084, +-7448, -10967, -12126, -9073, -2960, 3418, 8304, 12711, 12400, 8484, 2463, -3358, -7534, -11685, -11910, -9257, +-2369, 2626, 8539, 12271, 12386, 8249, 2315, -3137, -7811, -11382, -12396, -8693, -2309, 2941, 8840, 12364, +11927, 8214, 1954, -2706, -8033, -10942, -12590, -7866, -2684, 3270, 8902, 12227, 12051, 7768, 2630, -2986, +-7388, -11239, -12052, -7603, -2580, 3255, 9177, 12256, 12345, 7502, 2718, -3303, -7138, -11801, -11462, -7696, +-2620, 3687, 8921, 12505, 11445, 7584, 1989, -3008, -7754, -12039, -11780, -8031, -2929, 3633, 8677, 12439, +10691, 7524, 1496, -2655, -8100, -11942, -11234, -8188, -2495, 3149, 9222, 11898, 11104, 7032, 1936, -2668, +-8001, -11859, -11224, -8154, -2230, 3196, 9634, 11600, 11072, 6467, 1806, -2810, -8900, -11708, -12102, -7777, +-2914, 3706, 8975, 11589, 10319, 6008, 1699, -3193, -8845, -11636, -11767, -7536, -2972, 3895, 8898, 11576, +10267, 5798, 2575, -3300, -7895, -11869, -10909, -7832, -2159, 4203, 9367, 11910, 10079, 6348, 2575, -3154, +-8047, -11816, -10783, -7913, -2138, 4272, 9333, 12012, 9308, 6643, 1795, -2946, -8954, -11368, -11130, -7868, +-2288, 3826, 9576, 11390, 8950, 6232, 1644, -3319, -9106, -11523, -11254, -8137, -2174, 3584, 10119, 10498, +9154, 5544, 2121, -3872, -8908, -11235, -11114, -7391, -2136, 4389, 10054, 10598, 9033, 6193, 2368, -3575, +-8632, -10742, -11074, -6652, -2240, 5577, 9877, 10938, 8796, 6593, 2610, -3348, -7739, -10857, -10230, -6715, +-1557, 5731, 9950, 10582, 8999, 6635, 2449, -3779, -7619, -11326, -9673, -7420, -1157, 5483, 9807, 10206, +8616, 6906, 1649, -3474, -8197, -10828, -9955, -7356, -1194, 5805, 9886, 10217, 8825, 7167, 1363, -2978, +-8784, -10260, -10234, -7176, -817, 5941, 10191, 9690, 9416, 6347, 1695, -3651, -8551, -10389, -10260, -7082, +-559, 5854, 9997, 9207, 9577, 5667, 1886, -4056, -8412, -10389, -10617, -6916, -892, 6595, 8965, 9935, +8901, 5989, 1506, -4093, -8229, -10267, -10462, -6768, -569, 6624, 8474, 10201, 8731, 6232, 1319, -4472, +-8053, -10803, -10250, -7341, 372, 5825, 8769, 9523, 8479, 5808, 801, -4298, -8011, -10725, -10527, -7410, +532, 5405, 8726, 9290, 8403, 6066, 417, -3958, -8498, -10209, -11145, -6397, 372, 5587, 8640, 9033, +8418, 5638, 439, -4157, -8398, -10503, -11256, -6120, 197, 5556, 8703, 8747, 8906, 4928, 1002, -4678, +-7628, -10835, -10514, -5428, 575, 6000, 8601, 9371, 8809, 5330, 963, -4099, -7284, -10870, -10112, -5040, +622, 6445, 8013, 9981, 8208, 5654, 78, -3828, -7467, -11050, -9775, -5401, 1053, 5761, 8079, 9317, +8164, 5289, -95, -3624, -7817, -11379, -9658, -5675, 1586, 5175, 8542, 8907, 8504, 4743, -212, -3411, +-8426, -10860, -9911, -4841, 1176, 5250, 8161, 8902, 8401, 4276, -181, -3335, -8786, -10530, -10171, -4198, +812, 5522, 7763, 8927, 8430, 3849, 594, -3865, -8215, -10913, -9237, -4132, 1006, 5539, 7830, 9261, +8219, 3682, 1136, -4152, -8152, -11408, -8806, -4161, 1175, 5479, 7492, 9856, 7099, 4032, 335, -3797, +-8588, -11292, -8823, -4132, 1348, 5165, 7549, 9726, 6818, 4340, 289, -3621, -8758, -10653, -8360, -4128, +1912, 4465, 8510, 9120, 7312, 4193, 672, -3855, -8930, -10476, -8495, -3629, 1554, 4661, 8927, 8887, +7176, 3913, 604, -4158, -9172, -10352, -8785, -2828, 735, 5323, 8471, 8927, 6918, 3976, 670, -4434, +-8917, -10270, -7982, -2629, 840, 5696, 8493, 8728, 6799, 4254, 1070, -4767, -8383, -10618, -6904, -3036, +1205, 5745, 8747, 8637, 6632, 4567, 755, -4547, -8847, -10456, -6672, -3072, 1229, 5892, 8330, 8578, +6373, 4873, 84, -4374, -9490, -9824, -6804, -3268, 1112, 5587, 8214, 7703, 6482, 4351, 61, -4720, +-9485, -9577, -6736, -3666, 1404, 5717, 8403, 7206, 6866, 3925, 327, -5205, -9420, -9116, -6743, -3289, +1375, 6289, 7866, 7570, 6801, 4077, 299, -5256, -9278, -8752, -7034, -3008, 1481, 6554, 7291, 7836, +6549, 4114, 70, -5755, -8869, -8741, -6620, -3391, 1949, 6101, 7239, 7637, 6585, 4225, 138, -6155, +-8786, -8917, -6344, -3375, 2293, 5489, 7104, 7582, 6231, 4341, -677, -5863, -8971, -8544, -7032, -3224, +2121, 5287, 7010, 7395, 6270, 4327, -975, -5840, -8958, -8299, -7157, -2803, 2253, 5166, 7291, 6998, +6701, 3861, -645, -6116, -8329, -8440, -7030, -2381, 2090, 5282, 7075, 6943, 6664, 3660, -886, -6304, +-8123, -8571, -6876, -2043, 1850, 5582, 6608, 7303, 6395, 3942, -1343, -6042, -7989, -8753, -6584, -2141, +2044, 5643, 6661, 7458, 6538, 4027, -1464, -5846, -7611, -8698, -5907, -2398, 2410, 5205, 6945, 7207, +6784, 3862, -1552, -5475, -7917, -8549, -5873, -2146, 2441, 5074, 6739, 7200, 6842, 3622, -2039, -5204, +-8374, -7996, -6140, -1813, 2189, 5169, 6701, 7202, 7133, 3091, -1618, -5392, -8208, -8033, -6029, -1807, +2207, 5160, 6552, 7326, 7279, 2621, -1291, -5854, -7909, -8116, -5578, -1555, 2334, 5468, 6260, 7928, +6731, 2634, -1524, -5679, -7748, -7934, -5542, -1593, 2562, 5256, 6057, 8214, 6119, 2888, -1797, -5561, +-7846, -7974, -5688, -1923, 2861, 4617, 6397, 7598, 5862, 2630, -1858, -5699, -7992, -7982, -5581, -1707, +2741, 3910, 6785, 7495, 5980, 2260, -2135, -5709, -8059, -7614, -5910, -942, 2425, 4301, 6717, 7500, +5964, 2286, -2032, -5680, -7821, -7548, -5776, -555, 2002, 4368, 6712, 7403, 5838, 1903, -1931, -5950, +-7355, -8137, -5248, -750, 1874, 4361, 6784, 7606, 5765, 1908, -2173, -6024, -7446, -8344, -4710, -564, +1974, 4529, 6704, 7725, 5480, 2378, -2396, -5275, -7740, -8212, -4577, -711, 1973, 4588, 6919, 7584, +5533, 2426, -2369, -5180, -7960, -7851, -4130, -880, 1960, 4302, 7294, 7238, 5868, 1840, -2134, -5149, +-8183, -7584, -4073, -777, 1910, 4603, 7307, 7308, 5799, 1535, -1994, -5024, -8154, -6853, -4142, -548, +1501, 4914, 6954, 7517, 5587, 1380, -1794, -5519, -8055, -6874, -3740, -669, 1752, 5038, 6852, 7545, +5338, 1411, -1428, -5832, -7613, -6838, -3358, -1099, 1932, 4970, 7158, 7831, 5000, 1722, -1775, -5859, +-7803, -6472, -3350, -992, 2028, 4574, 6969, 7636, 4671, 2167, -2044, -5880, -8067, -6222, -3767, -1249, +1833, 4574, 7437, 7162, 4647, 1894, -2009, -6145, -7880, -6065, -3791, -1103, 1794, 4448, 7652, 6717, +4778, 1801, -1898, -6218, -7467, -5830, -3878, -818, 1519, 5020, 7322, 6610, 4608, 1825, -2282, -6431, +-7337, -5783, -3730, -670, 1364, 5383, 7259, 6719, 4555, 1903, -2445, -6596, -6823, -6074, -3376, -1189, +1561, 5362, 7269, 6469, 4564, 1854, -2960, -6536, -6855, -6046, -3290, -1688, 1524, 5130, 6977, 6055, +4385, 1738, -3537, -6245, -7206, -5742, -3641, -1743, 1535, 5277, 6807, 5812, 4739, 1583, -3590, -6280, +-7342, -5386, -3566, -1593, 1760, 5500, 6763, 5776, 5200, 1033, -3243, -6407, -6954, -5323, -3571, -1532, +2096, 5677, 6314, 6008, 5061, 861, -3358, -6507, -6607, -5197, -3825, -1539, 2120, 5674, 5810, 6386, +4736, 888, -3682, -6482, -6424, -5209, -3837, -1705, 2500, 5358, 5839, 6429, 4536, 627, -3867, -6363, +-6162, -5290, -3939, -1670, 3011, 5107, 6284, 6472, 4596, 618, -3961, -5975, -5985, -5011, -4122, -1093, +3132, 5092, 6343, 6561, 4656, 471, -3903, -5575, -5566, -4574, -4157, -711, 2838, 5150, 6428, 6628, +4625, 182, -3738, -5730, -5276, -4977, -3844, -280, 3032, 5057, 6542, 6652, 4574, -40, -3731, -5591, +-4986, -5203, -3566, -152, 3075, 5112, 6321, 6740, 4103, -42, -4135, -5101, -4984, -5232, -3518, -3, +2848, 4874, 6126, 6522, 3844, -202, -4162, -4831, -5159, -5504, -3351, -74, 2998, 4667, 6455, 6357, +4043, -537, -3928, -4649, -5364, -5583, -3288, -44, 2735, 4748, 6668, 6488, 3889, -808, -3801, -4433, +-5602, -5400, -3245, 200, 2586, 5014, 6501, 6396, 3487, -1121, -3534, -4340, -5604, -5279, -3037, 32, +2417, 5003, 6556, 6492, 3292, -1423, -3224, -4594, -5680, -5446, -2771, -103, 2509, 4816, 6516, 6333, +2771, -1424, -3206, -4739, -5932, -5529, -2883, -280, 2308, 4723, 6333, 6231, 2107, -1390, -3474, -4882, +-6355, -5384, -2944, -320, 2256, 4530, 6552, 5931, 2052, -1269, -3277, -4923, -6138, -5192, -2852, -383, +2348, 4549, 6894, 5621, 2072, -1230, -2938, -4959, -6042, -4977, -2813, -71, 2318, 5006, 7027, 5523, +1848, -1115, -2938, -5047, -6014, -4856, -2768, 109, 2255, 5580, 7095, 5350, 1503, -1149, -2991, -5200, +-5940, -4962, -2437, 55, 2377, 5526, 7002, 4995, 1484, -1133, -3146, -5301, -5730, -4850, -2184, -172, +2492, 5609, 6808, 4753, 1450, -861, -3290, -5013, -5686, -4412, -2120, -166, 2504, 5931, 6858, 4695, +1573, -708, -3217, -4829, -5732, -4200, -2085, -161, 2957, 6121, 6874, 4441, 1693, -991, -3101, -4972, +-5556, -3957, -2009, -139, 3104, 6177, 6642, 4219, 1656, -946, -2852, -4870, -5268, -3746, -2167, -178, +3153, 6431, 6307, 4221, 1447, -817, -2781, -4967, -5271, -3613, -2178, -183, 3241, 6293, 6139, 4155, +1227, -912, -2957, -5032, -5105, -3678, -2270, -333, 3439, 5966, 6029, 3878, 1152, -983, -3105, -5047, +-4771, -3513, -2519, -398, 3357, 5837, 5790, 3653, 1156, -726, -3149, -5015, -4737, -3435, -2798, -388, +3187, 5772, 5682, 3539, 1171, -638, -3217, -5019, -4444, -3563, -2886, -309, 3443, 5921, 5791, 3493, +1367, -711, -3390, -5023, -4224, -3685, -2827, -120, 3793, 5970, 5478, 3231, 1367, -676, -3629, -4863, +-4150, -3691, -2935, -21, 3725, 5929, 5100, 2955, 1162, -888, -3796, -4514, -4060, -3862, -3111, -31, +3777, 5867, 5016, 2954, 1335, -1195, -3909, -4485, -3959, -4165, -3046, 167, 4102, 5858, 4845, 3006, +1613, -1422, -3910, -4296, -3968, -4179, -3057, 292, 4131, 5827, 4684, 3273, 1520, -1665, -4119, -4095, +-3930, -4029, -2940, 463, 4303, 5669, 4535, 3439, 1465, -1804, -3803, -3840, -3934, -4225, -2923, 638, +4565, 5561, 4631, 3641, 1413, -2083, -3823, -3799, -3809, -4085, -2829, 852, 4700, 5432, 4676, 3714, +1203, -2133, -3656, -3668, -3973, -4142, -2783, 1327, 4700, 5219, 4581, 3667, 919, -2107, -3312, -3382, +-3919, -4288, -2697, 1574, 4570, 4909, 4637, 3749, 847, -2170, -3130, -3370, -3733, -4437, -2480, 1646, +4400, 4737, 4848, 3799, 682, -2199, -3017, -3149, -3734, -4511, -2340, 1845, 4349, 4797, 4926, 3718, +318, -2049, -2978, -2978, -3939, -4555, -2178, 1910, 4010, 4622, 5081, 3425, 7, -2410, -3022, -2861, +-3961, -4592, -2003, 1811, 3784, 4531, 4981, 3018, -83, -2335, -2736, -2915, -4228, -4597, -1797, 1726, +3452, 4581, 4981, 2950, -122, -2150, -2463, -2867, -4452, -4456, -1437, 1894, 3331, 4814, 5034, 2964, +-167, -1993, -2199, -2770, -4564, -4384, -1123, 1849, 3453, 4913, 4999, 2727, -317, -1930, -1830, -2783, +-4642, -4320, -933, 1607, 3357, 4872, 5052, 2818, -231, -1703, -1848, -3026, -5029, -4130, -976, 1482, +3335, 5062, 5038, 2643, -526, -1605, -1753, -3255, -5261, -3954, -939, 1469, 3554, 5272, 5083, 2406, +-572, -1486, -1566, -3508, -5040, -3552, -866, 1204, 3479, 5348, 5198, 2167, -653, -1327, -1506, -3744, +-4957, -3401, -1004, 989, 3430, 5499, 5043, 1921, -835, -1049, -1665, -4040, -5062, -3299, -1070, 1077, +3392, 5561, 4835, 1674, -818, -868, -1836, -4276, -4894, -3282, -1018, 944, 3599, 5558, 4686, 1326, +-685, -645, -1904, -4346, -4708, -3200, -1152, 913, 3781, 5601, 4487, 1030, -551, -485, -2294, -4410, +-4657, -2965, -1195, 1031, 3861, 5674, 4068, 822, -275, -423, -2492, -4342, -4351, -2851, -1384, 991, +4121, 5893, 3850, 464, -170, -642, -2560, -4381, -4099, -2886, -1384, 987, 4395, 5912, 3391, 386, +-17, -716, -2750, -4426, -4007, -2936, -1464, 972, 4448, 5844, 2982, 624, 60, -660, -2914, -4140, +-3816, -2846, -1555, 1117, 4800, 5561, 2701, 705, 314, -663, -2969, -4077, -3743, -2965, -1593, 1263, +5200, 5281, 2654, 774, 524, -909, -3013, -3961, -3687, -2987, -1802, 1618, 5282, 5068, 2507, 1014, +705, -939, -3018, -3826, -3583, -3069, -1995, 1932, 5223, 4898, 2190, 1160, 783, -932, -2892, -3738, +-3497, -3353, -1965, 2130, 5309, 4622, 2197, 1453, 1000, -801, -2813, -3692, -3341, -3610, -1816, 2299, +5466, 4577, 2364, 1588, 846, -927, -2858, -3329, -3302, -3648, -1786, 2499, 5189, 4329, 2345, 1848, +846, -1055, -3057, -3186, -3445, -3775, -1655, 2696, 5158, 3963, 2440, 1791, 854, -1254, -2896, -3020, +-3532, -3953, -1490, 2923, 5082, 3812, 2595, 1868, 915, -1448, -2766, -2925, -3769, -4135, -1268, 3266, +4925, 3808, 2499, 1954, 662, -1716, -2757, -2872, -3925, -4097, -971, 3489, 4712, 3711, 2425, 2048, +487, -1834, -2631, -2863, -4016, -4094, -519, 3440, 4659, 3506, 2429, 1945, 264, -1916, -2379, -2902, +-4308, -4118, -226, 3474, 4506, 3340, 2465, 1976, -62, -1956, -2373, -2842, -4565, -3923, -139, 3496, +4380, 3353, 2664, 1966, -354, -1951, -2136, -2881, -4761, -3725, 88, 3502, 4208, 3171, 2907, 1835, +-438, -2036, -1906, -3070, -4807, -3632, 217, 3452, 3925, 3135, 2969, 1688, -719, -2009, -1752, -3279, +-4893, -3496, 269, 3481, 3697, 3313, 3013, 1661, -1057, -1911, -1806, -3489, -4964, -3396, 572, 3449, +3552, 3217, 3014, 1441, -1075, -1559, -1741, -3684, -4904, -3224, 855, 3248, 3471, 3225, 3178, 1191, +-1007, -1222, -1612, -3779, -5024, -3042, 924, 3095, 3331, 3450, 3174, 834, -1141, -973, -1748, -3861, +-5170, -2716, 900, 2911, 3076, 3648, 3202, 663, -953, -812, -1693, -4068, -5045, -2493, 958, 2635, +3148, 3910, 3231, 405, -807, -766, -1613, -4277, -4927, -2308, 1012, 2616, 3292, 4274, 3007, 292, +-745, -561, -1771, -4443, -4853, -2025, 1157, 2548, 3525, 4511, 2712, 225, -781, -404, -1980, -4447, +-4649, -1758, 1152, 2300, 3783, 4465, 2662, 192, -433, -362, -2248, -4746, -4458, -1521, 1147, 2217, +4078, 4409, 2493, 18, -215, -350, -2565, -4926, -4376, -1131, 909, 2354, 4201, 4431, 2163, -13, +-81, -235, -2652, -4961, -4148, -997, 695, 2523, 4404, 4554, 2034, -7, 127, -328, -2746, -5119, +-3772, -1077, 650, 2568, 4613, 4428, 1770, 10, 186, -425, -3030, -5165, -3471, -1196, 519, 2672, +4826, 4223, 1341, -25, 60, -443, -3443, -4945, -3309, -1191, 399, 2757, 4781, 3816, 1166, -1, +248, -561, -3746, -4703, -3086, -1316, 246, 2885, 4889, 3483, 1111, -3, 589, -878, -3799, -4485, +-2820, -1390, 217, 3148, 4817, 3231, 869, 196, 813, -1087, -3997, -4315, -2725, -1430, 254, 3447, +4659, 3144, 642, 462, 837, -1262, -4012, -4068, -2642, -1635, 338, 3459, 4611, 2930, 679, 621, +725, -1666, -4002, -3904, -2599, -1818, 661, 3544, 4520, 2367, 437, 825, 716, -1809, -4044, -3665, +-2761, -1887, 720, 3730, 4470, 2121, 496, 1055, 535, -2033, -4030, -3419, -3056, -1969, 750, 4031, +4399, 1949, 614, 1146, 463, -2286, -3685, -3313, -3057, -2028, 953, 4162, 4214, 1758, 942, 1447, +427, -2516, -3491, -3266, -2999, -1962, 1151, 4281, 3883, 1679, 1122, 1825, 236, -2393, -3377, -3149, +-3103, -1917, 1394, 4442, 3750, 1723, 1335, 1903, 16, -2410, -3269, -3297, -3273, -1994, 1767, 4381, +3552, 1564, 1647, 1732, -355, -2550, -3133, -3227, -3343, -1911, 2014, 4258, 3221, 1442, 1868, 1709, +-522, -2442, -3047, -3164, -3612, -1688, 2236, 4310, 2906, 1462, 1983, 1549, -663, -2310, -2863, -3164, +-3704, -1466, 2402, 4186, 2566, 1563, 2247, 1426, -614, -2299, -2534, -3367, -3710, -1326, 2734, 4065, +2406, 1824, 2392, 1283, -801, -2253, -2419, -3406, -3665, -976, 3011, 4007, 2238, 2058, 2145, 1092, +-1123, -1985, -2322, -3432, -3627, -695, 3159, 3549, 2096, 2115, 2149, 826, -1185, -1775, -2238, -3589, +-3634, -427, 3263, 3086, 2140, 2145, 2272, 573, -1212, -1713, -2386, -3802, -3603, 81, 3249, 2871, +1984, 2178, 2100, 303, -1241, -1576, -2492, -4000, -3571, 589, 3099, 2741, 1883, 2289, 1921, 172, +-1004, -1378, -2392, -4283, -3300, 663, 2924, 2468, 1990, 2476, 1876, 31, -902, -1256, -2407, -4511, +-2979, 670, 2751, 2255, 2158, 2674, 1777, 61, -1018, -1222, -2949, -4623, -2726, 992, 2582, 2179, +2203, 2678, 1513, -84, -875, -971, -3038, -4486, -2408, 1050, 2368, 1984, 2382, 2614, 1539, -178, +-536, -953, -3266, -4516, -2175, 1058, 2167, 1884, 2417, 2514, 1305, -320, -370, -1036, -3534, -4429, +-1996, 1040, 1758, 1845, 2456, 2720, 1123, -269, -170, -1175, -3823, -4375, -1722, 1109, 1675, 1891, +2543, 2664, 909, -173, 42, -1365, -3951, -4322, -1363, 1040, 1692, 1829, 2720, 2499, 744, -60, +139, -1550, -4055, -3975, -1089, 900, 1508, 1870, 2876, 2387, 496, 160, 201, -1605, -4206, -3644, +-1050, 946, 1364, 2068, 3066, 2225, 425, 308, 267, -1957, -4293, -3426, -789, 943, 1336, 2237, +3241, 1979, 405, 303, 209, -2344, -4169, -3111, -592, 783, 1161, 2371, 3144, 1731, 316, 587, +215, -2479, -4224, -3037, -611, 660, 1021, 2508, 2948, 1583, 347, 971, 104, -2734, -4332, -2975, +-559, 394, 1135, 2698, 3032, 1409, 467, 1021, -134, -2986, -4253, -2768, -467, 289, 1384, 2833, +2878, 973, 473, 1123, -226, -2980, -4099, -2345, -505, 117, 1198, 2852, 2585, 884, 822, 1360, +-348, -3130, -3998, -2068, -626, 12, 1252, 2906, 2344, 879, 1228, 1569, -311, -3275, -3802, -2059, +-734, -138, 1540, 3103, 2211, 861, 1363, 1564, -474, -3406, -3536, -1910, -834, -238, 1639, 2992, +1888, 934, 1469, 1581, -801, -3455, -3358, -1760, -1041, -282, 1816, 2877, 1681, 1009, 1650, 1613, +-1099, -3428, -3167, -1714, -1246, -235, 2048, 2637, 1501, 989, 2000, 1583, -1259, -3508, -2960, -1702, +-1379, -27, 2237, 2565, 1355, 1082, 2202, 1446, -1469, -3453, -2761, -1787, -1505, 357, 2315, 2482, +1128, 1305, 2298, 1301, -1719, -3306, -2414, -1850, -1532, 409, 2368, 2219, 1053, 1504, 2550, 1239, +-1831, -3206, -2274, -2124, -1539, 522, 2439, 2059, 1127, 1767, 2630, 975, -2107, -3022, -2349, -2351, +-1574, 674, 2422, 1912, 1155, 2019, 2614, 642, -2374, -2851, -2519, -2476, -1503, 968, 2339, 1578, +1019, 2102, 2669, 352, -2296, -2610, -2533, -2696, -1498, 1046, 2235, 1370, 1070, 2201, 2664, 95, +-2091, -2460, -2629, -2873, -1427, 1118, 1976, 1207, 1125, 2638, 2597, -81, -2034, -2330, -2781, -2977, +-1278, 1292, 1862, 1021, 1170, 2926, 2489, -181, -1946, -2330, -2878, -2964, -948, 1364, 1800, 808, +1346, 3043, 2291, -267, -1758, -2265, -3007, -2975, -813, 1378, 1602, 624, 1624, 3132, 2133, -265, +-1532, -2136, -3196, -2872, -661, 1438, 1290, 565, 1904, 3203, 1881, -354, -1387, -2066, -3207, -2712, +-473, 1472, 1006, 553, 2164, 3185, 1719, -391, -1261, -2272, -3268, -2637, -153, 1472, 748, 521, +2282, 3062, 1534, -235, -1026, -2288, -3312, -2570, 37, 1365, 386, 529, 2371, 3103, 1441, -8, +-1062, -2379, -3492, -2507, 136, 1150, 284, 762, 2647, 2920, 1307, 8, -1103, -2610, -3662, -2374, +386, 1030, 268, 1046, 2910, 2735, 1246, -39, -1147, -2739, -3661, -1937, 599, 859, 84, 1262, +2943, 2596, 1222, 100, -1033, -2779, -3651, -1653, 663, 541, -117, 1361, 2897, 2568, 1295, 278, +-1060, -2978, -3745, -1550, 585, 217, -73, 1540, 2896, 2402, 1296, 264, -1088, -3251, -3612, -1272, +566, 5, -6, 1680, 2798, 2296, 1228, 320, -1179, -3318, -3440, -966, 459, -171, 35, 1775, +2712, 2320, 1344, 522, -1237, -3432, -3236, -691, 320, -367, 259, 1981, 2828, 2340, 1471, 577, +-1447, -3675, -3025, -467, 250, -377, 440, 2010, 2700, 2095, 1485, 657, -1549, -3777, -2820, -377, +6, -406, 502, 2110, 2660, 2129, 1579, 666, -1860, -3798, -2476, -268, -156, -414, 611, 2156, +2522, 2014, 1651, 662, -2004, -3670, -2083, -348, -385, -573, 646, 2120, 2464, 2043, 1811, 556, +-2390, -3687, -1913, -414, -590, -647, 685, 2067, 2327, 2102, 1976, 379, -2789, -3607, -1789, -509, +-739, -491, 944, 2179, 2226, 2065, 2036, 118, -2974, -3418, -1603, -541, -778, -405, 1075, 2093, +2052, 2148, 2199, -105, -3020, -3203, -1409, -658, -910, -409, 1103, 2067, 2048, 2402, 2294, -345, +-3052, -2938, -1353, -793, -1075, -384, 1186, 2014, 1979, 2642, 2238, -600, -3120, -2834, -1360, -936, +-1065, -228, 1225, 1722, 1838, 2781, 2170, -836, -3076, -2635, -1306, -1077, -1154, -238, 1186, 1476, +1935, 2986, 2062, -1012, -3012, -2441, -1324, -1215, -1263, -86, 1249, 1428, 2102, 3158, 1840, -1246, +-3049, -2316, -1321, -1256, -1213, 76, 1176, 1276, 2298, 3254, 1659, -1538, -2960, -2196, -1215, -1269, +-1108, 234, 991, 1208, 2502, 3319, 1418, -1670, -2812, -2032, -1193, -1388, -985, 372, 827, 1115, +2639, 3338, 1232, -1627, -2616, -1847, -1281, -1567, -898, 405, 650, 1228, 2901, 3379, 1074, -1635, +-2537, -1779, -1413, -1637, -641, 507, 638, 1365, 3195, 3292, 808, -1792, -2448, -1658, -1498, -1586, +-383, 526, 541, 1496, 3358, 3183, 583, -1947, -2386, -1577, -1618, -1430, -249, 400, 293, 1618, +3517, 3154, 515, -1868, -2093, -1587, -1777, -1398, -131, 270, 273, 1897, 3730, 3142, 396, -1877, +-2002, -1687, -1910, -1278, 16, 115, 241, 2057, 3769, 2943, 161, -1843, -1842, -1746, -2004, -1138, +-11, -88, 186, 2208, 3822, 2875, 0, -1753, -1747, -1836, -2007, -989, -133, -372, 182, 2378, +3938, 2756, -68, -1590, -1687, -2105, -2083, -839, -131, -503, 214, 2476, 3973, 2517, -211, -1525, +-1731, -2285, -2025, -750, -273, -619, 294, 2638, 3840, 2184, -362, -1363, -1709, -2345, -1930, -621, +-464, -766, 343, 2844, 3831, 1947, -425, -1275, -1799, -2437, -1700, -555, -606, -987, 350, 2941, +3769, 1753, -388, -1154, -1926, -2466, -1545, -536, -757, -1086, 514, 3167, 3690, 1624, -265, -1026, +-2030, -2415, -1382, -517, -898, -1081, 740, 3333, 3551, 1476, -76, -957, -2218, -2442, -1233, -430, +-953, -1025, 987, 3502, 3400, 1324, 21, -1019, -2236, -2248, -1055, -488, -1160, -1086, 1224, 3578, +3161, 1316, 245, -1045, -2351, -2204, -971, -529, -1332, -1030, 1460, 3652, 3014, 1382, 265, -1220, +-2456, -2092, -822, -611, -1472, -997, 1649, 3574, 2778, 1409, 277, -1329, -2427, -1926, -738, -769, +-1658, -939, 1855, 3396, 2606, 1486, 347, -1300, -2361, -1794, -754, -980, -1823, -789, 2012, 3202, +2517, 1607, 372, -1461, -2369, -1637, -697, -1115, -2020, -589, 2174, 3169, 2555, 1673, 254, -1618, +-2377, -1511, -565, -1162, -2002, -351, 2174, 2931, 2552, 1726, 212, -1705, -2318, -1370, -482, -1390, +-2054, -190, 2121, 2870, 2532, 1799, 60, -1797, -2281, -1193, -495, -1647, -2000, -34, 2122, 2799, +2582, 1790, -75, -1865, -2225, -936, -545, -1858, -1917, 147, 2131, 2720, 2649, 1728, -197, -1978, +-2105, -738, -645, -1959, -1732, 323, 2092, 2707, 2717, 1635, -341, -2124, -1996, -582, -801, -2024, +-1596, 469, 2027, 2708, 2723, 1571, -425, -2253, -1800, -480, -929, -2058, -1440, 540, 1942, 2781, +2768, 1618, -553, -2208, -1501, -379, -1096, -2140, -1269, 582, 2020, 2836, 2783, 1578, -738, -2169, +-1283, -371, -1280, -2190, -1186, 529, 2038, 2911, 2829, 1472, -1031, -2151, -1106, -371, -1458, -2155, +-1169, 417, 1996, 2916, 2941, 1399, -1171, -2099, -987, -448, -1615, -2107, -1164, 423, 1974, 2931, +3030, 1297, -1241, -1999, -852, -663, -1845, -2141, -1164, 496, 2003, 3018, 3021, 1059, -1441, -1912, +-737, -772, -1821, -2039, -1144, 444, 1893, 3083, 2969, 879, -1510, -1569, -545, -834, -1834, -2013, +-1045, 424, 1892, 3154, 3014, 711, -1579, -1472, -566, -977, -1849, -1975, -999, 340, 1869, 3188, +2928, 527, -1537, -1258, -634, -1077, -1910, -1930, -997, 322, 1957, 3328, 2847, 202, -1534, -1115, +-595, -1137, -1974, -1931, -1002, 299, 2053, 3483, 2692, -23, -1479, -1039, -638, -1241, -1973, -1819, +-907, 369, 2179, 3610, 2516, -151, -1387, -934, -595, -1248, -1910, -1797, -957, 322, 2368, 3739, +2338, -217, -1246, -803, -646, -1309, -1855, -1630, -928, 330, 2532, 3801, 2179, -253, -1170, -786, +-743, -1355, -1802, -1485, -908, 343, 2706, 3707, 2023, -270, -1052, -733, -721, -1350, -1714, -1480, +-995, 449, 2912, 3609, 1833, -304, -900, -619, -740, -1413, -1703, -1504, -1186, 551, 3031, 3568, +1647, -314, -844, -622, -834, -1469, -1597, -1508, -1165, 730, 3188, 3481, 1519, -296, -764, -585, +-890, -1485, -1481, -1578, -1174, 905, 3227, 3266, 1346, -236, -624, -525, -1004, -1442, -1416, -1705, +-1201, 1048, 3270, 3089, 1220, -183, -512, -449, -1031, -1288, -1389, -1818, -1207, 1189, 3336, 2994, +1169, -224, -451, -522, -1048, -1147, -1398, -1942, -1196, 1360, 3280, 2843, 1122, -157, -370, -708, +-1092, -1073, -1404, -2032, -1136, 1474, 3210, 2708, 975, -114, -367, -783, -1091, -1055, -1525, -2111, +-941, 1676, 3166, 2543, 822, -74, -351, -876, -1041, -1012, -1658, -2256, -868, 1699, 3060, 2417, +789, 47, -386, -947, -1016, -1038, -1847, -2349, -752, 1787, 3122, 2208, 749, 81, -435, -965, +-938, -971, -1945, -2238, -592, 1889, 2980, 1989, 723, 128, -466, -944, -811, -1001, -2100, -2246, +-521, 1940, 2871, 1863, 816, 168, -566, -991, -675, -1082, -2251, -2320, -474, 2025, 2813, 1835, +883, 156, -674, -955, -642, -1247, -2359, -2271, -236, 2140, 2659, 1739, 836, 86, -871, -879, +-527, -1227, -2361, -2232, -120, 2106, 2475, 1663, 922, 32, -813, -636, -399, -1307, -2490, -2217, +42, 2107, 2328, 1647, 1015, 21, -755, -519, -446, -1418, -2566, -2093, 187, 2049, 2159, 1647, +1045, -69, -704, -415, -472, -1545, -2616, -1912, 360, 2000, 2047, 1635, 928, -231, -637, -255, +-333, -1558, -2688, -1826, 483, 1985, 2054, 1753, 921, -299, -600, -182, -304, -1632, -2655, -1676, +551, 1814, 1981, 1824, 832, -362, -554, -81, -306, -1724, -2676, -1533, 608, 1724, 2020, 1835, +733, -348, -440, 42, -372, -1884, -2674, -1319, 682, 1681, 2093, 1830, 650, -422, -386, 138, +-383, -1981, -2584, -1181, 602, 1584, 2122, 1800, 589, -364, -180, 283, -422, -2067, -2494, -1023, +531, 1545, 2135, 1755, 532, -273, 16, 429, -507, -2179, -2387, -915, 452, 1592, 2183, 1724, +482, -235, 134, 422, -640, -2277, -2231, -880, 497, 1640, 2203, 1583, 325, -269, 204, 458, +-769, -2272, -2144, -876, 418, 1605, 2121, 1467, 258, -190, 342, 496, -880, -2253, -2051, -966, +331, 1588, 2139, 1404, 231, -146, 406, 429, -1060, -2231, -2010, -1030, 299, 1626, 2096, 1297, +162, -146, 516, 362, -1131, -2106, -1870, -972, 304, 1566, 1961, 1185, 103, -52, 641, 260, +-1189, -2059, -1831, -947, 328, 1567, 1840, 1068, 49, 127, 745, 190, -1267, -2033, -1842, -937, +415, 1631, 1819, 934, 5, 251, 813, 51, -1327, -2025, -1800, -957, 443, 1578, 1780, 836, +-18, 369, 753, -102, -1380, -1951, -1784, -881, 507, 1601, 1699, 669, -13, 467, 706, -144, +-1311, -1872, -1797, -868, 487, 1576, 1568, 491, 28, 628, 805, -170, -1316, -1952, -1847, -905, +453, 1607, 1485, 415, 141, 706, 747, -212, -1268, -1962, -1859, -928, 471, 1610, 1380, 420, +264, 777, 648, -260, -1276, -1937, -1773, -859, 565, 1631, 1217, 360, 352, 886, 628, -233, +-1237, -1860, -1734, -893, 592, 1453, 1072, 342, 579, 1004, 662, -220, -1277, -1874, -1752, -861, +684, 1474, 971, 343, 682, 1058, 711, -224, -1329, -1886, -1801, -754, 800, 1484, 826, 336, +728, 1026, 667, -291, -1315, -1835, -1737, -645, 823, 1335, 652, 357, 782, 1073, 766, -195, +-1215, -1857, -1771, -627, 854, 1205, 575, 432, 841, 1115, 774, -214, -1208, -1915, -1779, -503, +918, 1094, 509, 545, 915, 1149, 685, -244, -1228, -1928, -1739, -398, 952, 972, 560, 580, +948, 1161, 671, -223, -1230, -1961, -1690, -248, 982, 861, 522, 543, 972, 1135, 643, -225, +-1239, -1991, -1658, -181, 798, 706, 449, 609, 1081, 1162, 624, -270, -1298, -2004, -1552, -113, +685, 652, 463, 677, 1128, 1205, 669, -260, -1388, -2141, -1443, 2, 695, 604, 415, 672, +1116, 1156, 638, -249, -1452, -2172, -1298, 41, 672, 512, 347, 671, 1157, 1214, 743, -123, +-1491, -2156, -1312, -3, 602, 512, 400, 795, 1258, 1263, 801, -170, -1603, -2119, -1215, 2, +512, 408, 410, 876, 1316, 1201, 757, -330, -1748, -2085, -1084, 35, 458, 283, 337, 842, +1244, 1181, 808, -356, -1741, -1978, -1021, 12, 335, 211, 289, 876, 1208, 1283, 879, -425, +-1801, -1930, -985, -71, 199, 65, 313, 910, 1214, 1338, 876, -558, -1899, -1949, -941, -65, +161, 12, 371, 913, 1209, 1361, 803, -690, -1865, -1847, -803, -11, 85, -7, 371, 907, +1233, 1440, 742, -766, -1931, -1738, -762, 5, 25, 2, 410, 875, 1291, 1521, 740, -846, +-1915, -1698, -700, -31, -28, 35, 474, 885, 1399, 1569, 730, -878, -1876, -1653, -676, -52, +-39, 129, 501, 894, 1428, 1592, 604, -960, -1831, -1513, -595, -103, -79, 202, 563, 1004, +1564, 1646, 553, -992, -1779, -1339, -425, -131, -107, 147, 519, 1069, 1704, 1717, 546, -1002, +-1741, -1283, -456, -253, -131, 137, 517, 1122, 1847, 1723, 417, -1142, -1809, -1272, -535, -277, +-97, 163, 478, 1137, 1840, 1621, 313, -1191, -1792, -1180, -556, -296, -99, 114, 419, 1156, +1857, 1571, 257, -1234, -1676, -1112, -589, -347, -141, -5, 348, 1222, 1915, 1566, 202, -1282, +-1629, -1152, -701, -427, -177, -39, 405, 1364, 1979, 1542, 31, -1354, -1624, -1118, -715, -343, +-125, -44, 405, 1321, 1873, 1413, -51, -1300, -1474, -1123, -735, -367, -207, -163, 413, 1365, +1940, 1344, -129, -1282, -1416, -1142, -800, -433, -297, -187, 481, 1442, 1976, 1283, -243, -1304, +-1448, -1183, -781, -395, -381, -211, 497, 1562, 2012, 1196, -367, -1340, -1460, -1162, -614, -273, +-337, -215, 525, 1598, 2014, 1104, -314, -1311, -1453, -1185, -545, -241, -286, -157, 580, 1613, +1930, 1031, -331, -1181, -1427, -1103, -525, -270, -348, -151, 679, 1724, 1937, 1021, -291, -1169, +-1501, -1113, -507, -263, -348, -109, 769, 1755, 1898, 941, -309, -1237, -1513, -1073, -469, -279, +-347, -97, 805, 1723, 1825, 886, -331, -1319, -1549, -994, -403, -267, -406, -86, 815, 1709, +1755, 876, -364, -1322, -1514, -937, -388, -278, -423, -95, 816, 1709, 1779, 905, -361, -1322, +-1511, -1000, -414, -296, -389, -73, 849, 1736, 1801, 875, -388, -1338, -1510, -989, -415, -296, +-367, -66, 837, 1716, 1791, 870, -364, -1339, -1542, -977, -398, -269, -406, -84, 822, 1689, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 211, 253, 292, 316, 332, 350, 365, 369, 361, 360, 360, 357, 346, 323, 303, +283, 249, 214, 197, 185, 168, 143, 122, 100, 45, 8, -23, -61, -91, -102, -93, +-90, -71, -47, -25, -7, 25, 51, 46, 65, 71, 44, 39, 27, 55, 49, 69, +59, -235, 715, 100, 51, -487, -2248, -3397, -2206, 2720, 5140, 3437, 202, 1874, -1440, -2553, +-177, -5282, -6969, 2034, 5270, 6644, 7933, 4554, 2129, -1172, -8006, -10687, -2810, -4049, 2999, 8466, +10598, 3869, -9126, -16585, -15468, -8423, 1181, 13957, 16349, 16959, 6479, -6939, -20129, -13090, -2674, 2771, +11397, 14380, 14074, 1480, -12474, -23886, -13750, -5503, 5519, 15044, 18208, 12235, -1385, -14112, -27651, -17834, +-8832, 8814, 19619, 23884, 17128, 7428, -10071, -27031, -20716, -14714, 685, 14287, 24805, 17745, 9241, -8661, +-20530, -15277, -10563, 1878, 14804, 22902, 17180, 9899, -10435, -20221, -18561, -13329, -1390, 16744, 23095, 17836, +9959, -11564, -19400, -19288, -11902, -1802, 15814, 19053, 15703, 6062, -14230, -17466, -17064, -9136, 3266, 20612, +20726, 15804, 1616, -19334, -23951, -21496, -12516, 4569, 22396, 23846, 22658, 4505, -15605, -23584, -21990, -13666, +4959, 19968, 19764, 19792, 1426, -12013, -18409, -16470, -8399, 9913, 20458, 17650, 14846, -5741, -18893, -23429, +-19400, -8203, 13510, 25091, 26380, 20491, -308, -17598, -24404, -23130, -11198, 11480, 19585, 24107, 14244, -5791, +-20963, -23478, -19339, -5304, 18349, 23457, 26538, 12548, -8271, -24181, -27196, -23468, -7231, 16828, 24177, 28518, +17921, -2479, -18013, -22476, -25559, -10282, 7987, 17743, 22808, 12303, -6149, -18388, -20389, -20803, 45, 15350, +24722, 26569, 15213, -5132, -21384, -24746, -26663, -8175, 9023, 22314, 28519, 19417, 740, -13757, -23328, -25872, +-9210, 4720, 17084, 23678, 16570, -1722, -12073, -24321, -24011, -6601, 8820, 22890, 27602, 18929, -2012, -13304, +-27061, -25314, -12104, 5020, 21734, 28598, 21840, 6289, -4181, -22498, -23183, -10059, 2238, 16755, 24916, 14830, +212, -9669, -25872, -23086, -9280, 5706, 19989, 29164, 14796, 2403, -10200, -27176, -24317, -13312, 3162, 18161, +30020, 16134, 7234, -6331, -22726, -19789, -10071, 3550, 18184, 26358, 10944, 2585, -11602, -25052, -20530, -8816, +3390, 21048, 26257, 13589, 4995, -12420, -25363, -23004, -10166, -120, 21384, 24045, 11705, 4904, -13048, -23399, +-20604, -7289, 2649, 23462, 22895, 11558, 3982, -14996, -24972, -20386, -9621, 3117, 24739, 22916, 14160, 4481, +-13411, -25324, -19213, -11874, 3042, 24181, 21001, 15498, 4675, -10948, -23559, -16778, -11660, 4999, 24263, 18965, +14967, 2979, -14048, -25915, -19920, -15358, 4389, 22900, 18842, 14757, 4378, -13360, -22236, -18089, -15333, 5824, +20593, 18833, 13806, 4429, -14499, -20309, -17061, -14841, 9284, 21683, 21778, 15948, 6217, -13891, -19014, -17936, +-15983, 8223, 19184, 19479, 15308, 4365, -15461, -19227, -20012, -14272, 9007, 20269, 19644, 16792, 3323, -16444, +-18398, -22793, -13292, 8801, 20539, 20045, 18290, 3468, -15251, -15408, -21889, -11118, 8838, 19411, 19333, 18591, +2824, -13671, -15493, -22280, -10417, 9557, 19051, 19813, 18797, 79, -12818, -17365, -22856, -11010, 9201, 17218, +18804, 18527, -2158, -11622, -18510, -22097, -9417, 10153, 17040, 19250, 17137, -3809, -10650, -18960, -22518, -9333, +9804, 16206, 21257, 17040, -2274, -9509, -18834, -22744, -9397, 8637, 13191, 21234, 14248, -1729, -8976, -18203, +-21258, -7258, 10613, 14861, 24293, 13439, -795, -9131, -20040, -22906, -8554, 7848, 13299, 23865, 12859, 187, +-8632, -19585, -22480, -6861, 6520, 14533, 23360, 11587, -131, -9677, -19972, -22784, -5439, 4458, 15251, 21799, +10367, -7, -9885, -20308, -22886, -4996, 3016, 16246, 21486, 10890, 1092, -8695, -20359, -20949, -4232, 3319, +17570, 20850, 10621, 476, -8386, -21809, -19490, -4878, 3385, 18203, 20842, 11635, 1093, -7220, -22814, -18249, +-6080, 3709, 18702, 20413, 11598, 1632, -7175, -23051, -16808, -7594, 3076, 17875, 19220, 10091, 1976, -8855, +-23953, -16712, -8804, 3774, 18290, 20762, 10681, 5078, -7898, -21165, -14311, -8253, 5591, 18586, 20811, 9837, +5473, -10478, -21138, -14567, -8874, 5570, 18576, 20042, 9676, 6105, -11908, -20410, -15417, -9422, 4734, 19003, +18150, 9309, 5325, -13644, -19541, -16356, -9010, 4709, 20312, 17646, 11572, 6260, -13230, -17797, -16255, -8716, +5034, 20918, 16332, 13280, 5770, -12989, -17213, -16651, -10256, 4429, 18979, 13275, 12910, 2969, -13555, -17779, +-16685, -11176, 5359, 18300, 12817, 13745, 1112, -13202, -17932, -15780, -10497, 8135, 18466, 13754, 14975, 561, +-12510, -17667, -16157, -11055, 9194, 16972, 15053, 15338, 507, -12257, -16944, -16682, -11155, 10104, 15079, 15895, +14499, 531, -12039, -15354, -16658, -9701, 10972, 13881, 16948, 13415, -309, -12945, -15607, -18329, -8992, 10520, +13376, 17369, 12949, -667, -12571, -14826, -19249, -7094, 9931, 13405, 17161, 12484, -1204, -12398, -14732, -19950, +-5324, 8863, 13654, 17413, 12793, -783, -10269, -13804, -19215, -3414, 8666, 14244, 17563, 12232, -2343, -9879, +-15077, -19249, -2907, 8262, 14379, 17878, 12590, -2645, -8723, -16707, -19090, -3744, 7002, 13904, 17480, 11971, +-2809, -7284, -17520, -17756, -3279, 7046, 13734, 17556, 10498, -3678, -7866, -19206, -17643, -3992, 6753, 13912, +18697, 10042, -2225, -7197, -18784, -16295, -3588, 6812, 13395, 18837, 8311, -1336, -7585, -19008, -15849, -3799, +6309, 13343, 19220, 7368, -355, -8472, -19575, -15759, -4132, 5242, 13594, 18702, 6913, 1241, -8403, -18854, +-15107, -3542, 4583, 14293, 17538, 6091, 1448, -9160, -18351, -14644, -2633, 4622, 16449, 17374, 7085, 2484, +-9315, -18122, -14739, -3127, 3642, 16698, 15393, 6942, 2042, -9765, -18265, -13807, -3484, 3476, 16964, 13856, +7220, 1572, -10239, -18806, -13081, -4578, 4171, 17480, 13159, 7698, 1359, -9993, -18813, -11627, -5474, 5183, +17298, 12658, 8367, 1503, -9838, -18476, -10730, -6271, 6482, 16838, 12692, 8660, 1845, -10188, -17119, -10195, +-6793, 7365, 15887, 12798, 8510, 1962, -11310, -16081, -10361, -6884, 8058, 15412, 13229, 8955, 2752, -11820, +-14531, -10972, -6569, 8309, 14490, 12859, 9120, 2672, -12567, -14030, -12526, -6615, 7947, 13822, 11843, 9542, +1868, -12668, -13186, -13220, -5772, 8188, 14025, 11474, 10371, 972, -11922, -12611, -13583, -5114, 8044, 13734, +10553, 10798, -244, -11301, -12579, -13928, -4965, 7940, 13327, 10749, 11198, -1510, -10904, -13182, -14376, -5459, +7893, 12009, 11316, 11322, -1931, -9873, -13472, -14427, -5638, 8024, 10759, 11773, 10521, -2621, -9242, -13219, +-14282, -4887, 8718, 10435, 12944, 9866, -3020, -9191, -13576, -14782, -4536, 8346, 9750, 13603, 9181, -2681, +-8530, -13046, -14230, -3319, 8258, 9807, 14646, 9007, -2087, -7902, -13271, -14515, -2739, 7283, 9880, 14908, +8512, -1870, -7320, -13299, -14559, -1729, 6494, 9887, 14783, 7952, -1712, -7385, -13846, -14289, -852, 6128, +10749, 15034, 7769, -1104, -6943, -14370, -13639, -577, 5003, 10957, 14670, 7042, -931, -6751, -14868, -12784, +-430, 4767, 11462, 14029, 6021, -960, -6634, -15660, -12228, -829, 4311, 11810, 13410, 6019, -530, -6418, +-15903, -11448, -1456, 3914, 12207, 12692, 5636, -282, -6833, -16251, -10754, -2182, 3566, 12610, 12818, 5796, +560, -7173, -15824, -9799, -2533, 3956, 12303, 12589, 5620, 1631, -7259, -15314, -8685, -2504, 5114, 12659, +12378, 5255, 1389, -8445, -15484, -8699, -3153, 5019, 12419, 11509, 5436, 1775, -9022, -14854, -9072, -3672, +4683, 12684, 11025, 5499, 1495, -9987, -14259, -9126, -3445, 4883, 13214, 10806, 6201, 1954, -9856, -13028, +-8762, -3206, 5454, 13391, 10385, 6607, 1724, -9890, -12841, -8607, -3119, 6079, 13002, 9438, 7032, 978, +-10226, -13035, -9056, -4395, 5786, 12397, 8887, 7175, 68, -10055, -12764, -9044, -4548, 6251, 11994, 8509, +7472, -308, -10141, -12296, -9252, -4576, 6735, 11504, 8826, 7831, -259, -10347, -11704, -9291, -4277, 7412, +10823, 9571, 8149, -248, -10052, -10934, -9271, -3804, 7971, 10375, 9761, 8126, -981, -10149, -10672, -9788, +-3731, 7569, 9328, 9488, 8037, -1574, -9876, -10813, -10463, -3460, 7472, 8975, 9591, 8107, -1773, -9300, +-10451, -10437, -2629, 7282, 8601, 10280, 8317, -1647, -8504, -10192, -10541, -1810, 7424, 8588, 10514, 7699, +-1981, -8312, -10348, -10914, -1601, 6619, 7997, 10573, 7191, -2248, -8035, -10687, -11087, -1283, 5969, 7588, +10511, 6840, -2349, -7682, -11161, -10841, -898, 5497, 8031, 10928, 6804, -2133, -7321, -11598, -10508, -464, +5315, 8456, 11257, 6454, -2304, -7011, -11644, -9808, -408, 5016, 8750, 11437, 6371, -1927, -6620, -11938, +-9177, -367, 4916, 8847, 11586, 5989, -1925, -6683, -11986, -8490, -495, 4491, 8820, 11543, 5179, -1781, +-7076, -12054, -8339, -490, 4548, 8960, 11703, 4836, -840, -6862, -11608, -7943, -263, 4574, 9383, 11833, +4834, -354, -7105, -11612, -7932, -301, 4181, 9775, 11181, 4341, -502, -7530, -11729, -7825, -531, 3793, +10094, 10584, 4403, -534, -7836, -12149, -7679, -641, 3377, 10394, 9863, 4473, -446, -7774, -12022, -7350, +-951, 3297, 10415, 9303, 4603, -427, -8040, -11985, -6658, -1348, 3333, 10181, 8985, 4651, -433, -8270, +-11906, -6482, -2038, 3918, 10181, 8672, 4563, -486, -8427, -11721, -6210, -2587, 4092, 9882, 8262, 4709, +-585, -8776, -11392, -6321, -2789, 4312, 9771, 8062, 5083, -249, -8791, -10163, -6241, -2791, 4753, 9600, +7945, 5382, -39, -8823, -9470, -6376, -2608, 5276, 9448, 7898, 5480, -230, -9029, -9257, -6847, -2737, +5431, 9150, 7995, 5780, -473, -8883, -9097, -7216, -2614, 5388, 8837, 7864, 6021, -1149, -8867, -8692, +-7351, -2271, 5268, 8712, 7863, 6086, -1693, -8666, -8452, -7546, -1967, 5085, 8523, 7970, 6205, -1906, +-8244, -8200, -7612, -1616, 5148, 8144, 8035, 6050, -2425, -7943, -8375, -7519, -1545, 5253, 7831, 8208, +6051, -2657, -7346, -8578, -7279, -1582, 5321, 7889, 8602, 6195, -2445, -6833, -8583, -6890, -1122, 5549, +7831, 8973, 5903, -2327, -6544, -8622, -6948, -905, 5518, 7623, 9154, 5393, -2232, -6885, -8706, -7107, +-789, 5033, 7249, 9281, 5029, -1945, -6760, -8641, -7094, -466, 4845, 7655, 9522, 4671, -2034, -6832, +-8588, -7044, -243, 4432, 7497, 9335, 4424, -2163, -6877, -8718, -6942, -165, 4123, 7757, 9057, 4264, +-2417, -6567, -8798, -6698, -282, 3512, 7923, 8723, 4181, -2451, -6368, -9143, -6555, -524, 3206, 7759, +8378, 3856, -2587, -6554, -9461, -6286, -834, 2988, 7679, 8421, 3711, -2253, -6484, -9436, -6060, -1028, +3316, 7695, 8510, 3613, -1883, -6498, -9255, -5531, -1128, 3629, 7858, 8388, 3502, -1624, -6726, -9301, +-5590, -1373, 3588, 7902, 8160, 3174, -1755, -6763, -9048, -5425, -1266, 3711, 8014, 7836, 3217, -1635, +-6819, -8350, -5164, -1145, 3767, 8378, 7966, 3472, -1290, -6920, -7815, -5234, -1170, 3891, 8328, 7723, +3449, -1321, -6982, -7737, -5153, -1332, 3788, 8139, 7384, 3486, -1666, -6956, -7652, -5139, -1496, 3707, +8088, 7171, 3682, -1927, -6809, -7664, -5112, -1419, 3660, 8038, 6882, 3879, -1973, -6533, -7233, -5063, +-1577, 3801, 8084, 7070, 3956, -2065, -6538, -7137, -4975, -1561, 4017, 7797, 7000, 3871, -1796, -6221, +-6959, -4688, -1440, 4334, 7515, 7080, 3729, -1872, -6198, -6790, -4719, -1469, 4606, 7322, 7089, 3469, +-1857, -6138, -6833, -5014, -1350, 4502, 7175, 7064, 3526, -1670, -6048, -6460, -5290, -1340, 4452, 7276, +7016, 3442, -1606, -5898, -6290, -5528, -1293, 4177, 7045, 6871, 3390, -1756, -5961, -6404, -5803, -1356, +3895, 6986, 6590, 3181, -2277, -5944, -6454, -5743, -1220, 3571, 6959, 6482, 3288, -2148, -5660, -6434, +-5712, -1077, 3643, 6939, 6522, 3101, -2359, -5649, -6581, -5578, -1258, 3527, 6580, 6300, 3016, -2414, +-5400, -6899, -5407, -1341, 3522, 6482, 6428, 3061, -2372, -5285, -6900, -5130, -1115, 3735, 6600, 6585, +2987, -2329, -5121, -6695, -5000, -903, 3725, 6520, 6512, 2911, -2072, -5142, -6415, -4875, -788, 3862, +6572, 6866, 2783, -1692, -5088, -6137, -4733, -551, 4094, 6482, 6998, 2723, -1579, -5127, -5995, -4778, +-773, 3837, 6469, 6789, 2668, -1824, -5114, -6195, -4884, -747, 3604, 6654, 6412, 2567, -2048, -4979, +-6016, -4843, -313, 3226, 6906, 6085, 2577, -2065, -4809, -5814, -4853, -312, 3169, 6835, 5885, 2407, +-2135, -4667, -5874, -4623, -711, 3212, 6478, 5955, 2373, -2148, -4602, -5990, -4095, -892, 3308, 6333, +5863, 2155, -2185, -4342, -6271, -4148, -1135, 3338, 6129, 5720, 2041, -2208, -4662, -6406, -4050, -1045, +3256, 5970, 5725, 1915, -1922, -4725, -6051, -4035, -805, 3404, 6280, 5796, 1794, -1514, -4749, -5617, +-4025, -671, 3307, 6139, 5663, 1568, -1432, -4843, -5389, -4141, -927, 3038, 6021, 5256, 1451, -1665, +-4879, -5445, -4095, -847, 2873, 6183, 4941, 1746, -1685, -4539, -5251, -3860, -813, 2914, 6309, 4923, +1854, -1763, -4355, -5139, -3860, -913, 3129, 6319, 4666, 1847, -1692, -4332, -5200, -3791, -943, 3258, +6094, 4520, 1859, -1802, -4190, -5216, -3583, -1133, 3397, 5944, 4361, 1617, -1860, -4179, -5178, -3363, +-1103, 3502, 5756, 4573, 1650, -1642, -4104, -4980, -3322, -939, 3792, 5596, 4727, 1716, -1503, -4157, +-4637, -3367, -720, 4065, 5560, 4520, 1727, -1207, -4335, -4413, -3445, -721, 3716, 5447, 4530, 1734, +-1229, -4455, -4322, -3712, -473, 3735, 5507, 4387, 1665, -1295, -4228, -4167, -4034, -347, 3709, 5394, +4200, 1913, -1542, -4227, -4410, -4146, -385, 3479, 5243, 3901, 2019, -1922, -3995, -4463, -3927, -345, +3554, 5110, 3820, 2000, -2225, -3673, -4555, -3789, -469, 3560, 4773, 3725, 1835, -2316, -3709, -4831, +-3881, -631, 3612, 4409, 3944, 1516, -2201, -3691, -4831, -3760, -658, 3720, 3993, 4171, 1220, -1967, +-3581, -4667, -3697, -472, 3792, 4330, 4394, 1043, -1902, -3507, -4326, -3797, -25, 3546, 4573, 4364, +991, -1768, -3532, -4172, -3852, 453, 3137, 4597, 4097, 904, -1690, -3649, -4195, -3867, 730, 2930, +4606, 4009, 1010, -1698, -3358, -4463, -3642, 749, 2948, 4703, 3872, 963, -1894, -3033, -4661, -3146, +708, 3023, 4747, 3685, 1057, -2047, -2920, -4780, -2865, 503, 3011, 4702, 3444, 822, -1973, -2951, +-4807, -2623, 294, 2707, 4311, 3546, 541, -1792, -3386, -4799, -2502, 129, 2844, 4148, 3684, 73, +-1537, -3280, -4685, -2572, -178, 2906, 4205, 3648, 6, -1224, -3321, -4555, -2456, -85, 2897, 4544, +3472, 90, -1214, -3460, -4242, -2533, -10, 2474, 4845, 3200, 123, -1145, -3627, -3917, -2575, 241, +2597, 5077, 2930, -18, -1161, -3602, -3510, -2403, 105, 2697, 5127, 2970, 371, -1091, -3474, -3603, +-2260, -129, 2861, 5136, 2653, 787, -1165, -3360, -3689, -1989, -321, 2906, 5000, 2400, 1096, -1398, +-3289, -3594, -1979, -433, 3056, 4831, 2264, 1183, -1324, -3336, -3502, -2048, -233, 3648, 4482, 2396, +1107, -1287, -3363, -3226, -2122, -422, 3856, 3924, 2649, 1035, -1118, -3450, -3096, -2226, -406, 3993, +3755, 2752, 951, -1458, -3552, -2799, -2236, -32, 3850, 3454, 2498, 1010, -1590, -3332, -2705, -2817, +207, 3750, 3610, 2446, 846, -1792, -3375, -2730, -3138, 645, 3556, 3469, 2456, 869, -1925, -3096, +-2701, -3106, 740, 3319, 3352, 2478, 808, -2049, -2663, -2841, -2907, 640, 3336, 3314, 2436, 822, +-2277, -2466, -3355, -2734, 667, 3288, 3229, 2566, 977, -2306, -2309, -3555, -2518, 778, 3103, 2968, +2630, 767, -2194, -2397, -3585, -2512, 931, 2970, 2848, 2808, 308, -1986, -2647, -3568, -2597, 936, +2727, 2752, 3013, -73, -1721, -2700, -3500, -2504, 1039, 2697, 2619, 2919, -129, -1397, -2500, -3605, +-2382, 1215, 2580, 2885, 2863, -39, -1547, -2414, -3666, -2240, 1329, 2270, 3210, 2484, 17, -1450, +-2265, -3820, -2133, 1505, 1916, 3498, 2354, -34, -1233, -2348, -3871, -1959, 1472, 1942, 3589, 2353, +-157, -1104, -2442, -3862, -1590, 1055, 2125, 3484, 2446, -49, -997, -2556, -3952, -994, 671, 2228, +3489, 2431, 66, -897, -2637, -4041, -798, 597, 2484, 3807, 2099, -91, -926, -2692, -3748, -956, +638, 2300, 3745, 1763, 28, -640, -3134, -3341, -1115, 598, 2421, 3677, 1611, -42, -367, -3227, +-2970, -1235, 371, 2648, 3430, 1608, 148, -354, -3135, -2873, -1228, 166, 2841, 3312, 1452, 430, +-714, -3038, -2915, -1249, 318, 2996, 3439, 1283, 851, -889, -3009, -2757, -1469, 366, 2852, 3531, +1223, 861, -1055, -2998, -2453, -1613, 415, 2953, 3432, 1402, 662, -1356, -2964, -2255, -1591, 376, +3163, 2907, 1465, 628, -1389, -2749, -2340, -1612, 152, 3236, 2789, 1544, 641, -1681, -2643, -2464, +-1631, 158, 2986, 2643, 1407, 623, -1789, -2608, -2482, -1794, 289, 2707, 2320, 1338, 546, -1731, +-2665, -2387, -1959, 593, 2818, 2109, 1510, 580, -1486, -2663, -2310, -1966, 646, 2851, 1881, 1700, +543, -1443, -2461, -2333, -1826, 856, 2786, 1796, 1618, 473, -1579, -2237, -2488, -1918, 1069, 2668, +2111, 1617, 328, -1889, -2078, -2511, -2023, 1234, 2543, 2091, 1618, 270, -1786, -2027, -2571, -1863, +1375, 2420, 2010, 1814, 22, -1600, -1809, -2639, -1713, 1431, 2421, 2003, 2027, -89, -1486, -1582, +-2755, -1401, 1442, 2259, 1984, 1981, -54, -1210, -1510, -2968, -1280, 1253, 1845, 2068, 1951, -112, +-1101, -1698, -3135, -1351, 1302, 1675, 2274, 1986, -110, -1015, -2029, -3106, -1176, 1287, 1539, 2373, +2082, -107, -829, -2182, -3042, -926, 1094, 1539, 2434, 1922, -151, -684, -2175, -3154, -708, 1021, +1567, 2518, 1786, -20, -776, -2211, -3020, -498, 759, 1495, 2570, 1559, 98, -606, -2250, -2878, +-527, 788, 1520, 2605, 1433, 95, -477, -2424, -2550, -487, 788, 1647, 2616, 1453, 134, -291, +-2500, -2276, -462, 590, 1726, 2558, 1447, 225, -196, -2679, -2415, -388, 521, 1796, 2421, 1296, +398, -493, -2803, -2461, -466, 200, 1684, 2432, 1067, 613, -842, -2865, -2390, -501, 376, 1756, +2333, 793, 735, -936, -3032, -2121, -480, 517, 1954, 2155, 789, 618, -944, -3167, -1980, -606, +418, 2133, 1937, 919, 516, -1145, -3137, -1815, -492, 289, 2265, 1681, 851, 604, -1332, -2865, +-1651, -590, 180, 2248, 1666, 880, 817, -1456, -2739, -1647, -820, 510, 2333, 1734, 880, 876, +-1486, -2655, -1343, -936, 716, 2070, 1615, 1152, 830, -1523, -2570, -1248, -1118, 970, 2343, 1447, +1282, 611, -1572, -2407, -1348, -1083, 951, 2368, 1276, 1450, 565, -1789, -2126, -1511, -1006, 1029, +2219, 1224, 1530, 740, -1899, -1881, -1598, -949, 1292, 1927, 1246, 1578, 798, -1852, -1807, -1618, +-1137, 1416, 1627, 1205, 1578, 410, -1818, -1767, -1529, -1057, 1374, 1471, 1014, 1632, 137, -1557, +-1621, -1829, -917, 1320, 1325, 807, 1719, 45, -1524, -1361, -1939, -696, 1286, 1267, 1097, 1786, +42, -1438, -1159, -1957, -473, 1358, 963, 1297, 1777, 75, -1229, -1277, -2017, -540, 1500, 868, +1549, 1794, -161, -1075, -1552, -1918, -223, 1721, 868, 1506, 1651, -401, -937, -1562, -1908, 10, +1404, 823, 1540, 1574, -496, -965, -1621, -2002, 405, 1304, 755, 1690, 1326, -364, -904, -1540, +-2005, 302, 1109, 703, 1928, 1048, -321, -878, -1699, -1876, 226, 832, 590, 2102, 1053, -356, +-786, -2056, -1842, 249, 663, 782, 2028, 981, -417, -721, -2208, -1784, 347, 362, 938, 1969, +963, -391, -792, -2233, -1653, 548, 209, 1107, 1908, 730, -206, -923, -2322, -1496, 471, 81, +1152, 2015, 526, -17, -955, -2488, -1419, 278, 65, 1178, 2039, 558, -5, -1075, -2556, -1006, +202, -79, 1161, 1792, 666, 45, -1116, -2629, -771, 229, -71, 1336, 1539, 666, 206, -1259, +-2616, -715, 196, -129, 1426, 1495, 618, 433, -1364, -2340, -598, 32, 13, 1469, 1453, 641, +643, -1498, -2187, -532, -185, 234, 1583, 1398, 743, 643, -1656, -2170, -377, -343, 215, 1568, +1224, 899, 458, -1722, -1933, -280, -405, 204, 1656, 1020, 1011, 345, -1930, -1681, -262, -303, +352, 1670, 873, 1045, 280, -2030, -1401, -277, -338, 663, 1733, 864, 1123, 156, -2120, -1225, +-73, -286, 789, 1451, 861, 1360, 32, -2071, -1280, -183, -469, 982, 1457, 892, 1438, -327, +-2049, -1232, -336, -510, 1039, 1302, 812, 1520, -396, -2049, -1117, -496, -375, 1084, 1122, 904, +1571, -417, -2070, -942, -679, -370, 1156, 981, 1212, 1646, -482, -2057, -1012, -876, -280, 1331, +800, 1297, 1598, -629, -1850, -943, -1018, -302, 1330, 854, 1457, 1588, -826, -1765, -1040, -1183, +-42, 1252, 822, 1384, 1465, -963, -1642, -976, -1351, 85, 948, 686, 1436, 1311, -1149, -1579, +-897, -1309, 282, 807, 527, 1621, 1254, -1150, -1416, -1052, -1300, 381, 755, 446, 1772, 1152, +-1218, -1190, -1243, -1137, 364, 546, 427, 1824, 1005, -1335, -1036, -1498, -1018, 386, 383, 551, +2004, 948, -1411, -1128, -1678, -934, 512, 309, 633, 1971, 582, -1241, -1054, -1600, -886, 541, +251, 655, 2077, 279, -1034, -1074, -1515, -647, 521, 128, 643, 2058, 51, -781, -980, -1617, +-587, 446, 105, 881, 2010, -105, -740, -1001, -1661, -430, 463, -3, 1123, 1831, 1, -629, +-1074, -1608, -313, 488, -188, 1432, 1713, 71, -509, -1128, -1417, -86, 526, -251, 1617, 1620, +30, -442, -1268, -1407, 112, 395, -136, 1641, 1456, -69, -380, -1285, -1412, 279, 7, -26, +1689, 1467, 147, -372, -1527, -1557, 437, -182, 119, 1765, 1285, 234, -380, -1553, -1479, 286, +-401, 273, 1904, 1207, 375, -367, -1784, -1230, 299, -424, 335, 1815, 1137, 454, -178, -1960, +-1041, 165, -493, 534, 1671, 1094, 525, -113, -2063, -870, 39, -703, 680, 1550, 1026, 633, +-262, -2054, -760, -175, -905, 680, 1523, 926, 749, -537, -1979, -603, -471, -900, 729, 1559, +875, 919, -713, -1922, -446, -658, -750, 758, 1542, 953, 942, -788, -1712, -173, -744, -689, +885, 1404, 1102, 982, -958, -1630, -223, -767, -590, 1045, 1176, 1108, 952, -1259, -1406, -270, +-787, -561, 1025, 904, 1065, 967, -1387, -1280, -525, -892, -394, 1040, 885, 1302, 841, -1600, +-1331, -543, -868, -134, 952, 706, 1464, 681, -1406, -1225, -510, -932, 6, 949, 624, 1544, +385, -1343, -1052, -444, -912, 122, 823, 672, 1796, 311, -1378, -1007, -572, -870, 417, 792, +774, 1703, 225, -1324, -774, -660, -963, 515, 621, 1069, 1694, 90, -1380, -686, -716, -943, +655, 526, 1224, 1562, -125, -1285, -582, -904, -910, 549, 428, 1283, 1588, -294, -1370, -565, +-1023, -628, 444, 328, 1261, 1515, -384, -1246, -405, -1135, -442, 274, 294, 1475, 1618, -423, +-1126, -414, -1205, -207, 288, 269, 1563, 1607, -498, -934, -590, -1225, -136, 226, 312, 1656, +1474, -634, -732, -776, -1144, -80, 64, 286, 1723, 1416, -679, -527, -871, -983, -15, -190, +133, 1655, 1198, -578, -255, -928, -1009, -98, -354, 122, 1705, 963, -374, -112, -975, -933, +-160, -473, 187, 1887, 793, -225, -191, -1135, -738, -81, -409, 303, 1874, 584, -36, -134, +-1141, -624, -180, -417, 619, 1951, 482, 17, -238, -1048, -440, -115, -566, 657, 1697, 438, +202, -330, -996, -483, -144, -616, 921, 1539, 366, 248, -440, -905, -371, -228, -832, 885, +1344, 410, 352, -493, -941, -411, -454, -796, 1067, 1280, 496, 354, -543, -1043, -323, -588, +-632, 1200, 1128, 588, 278, -566, -1141, -262, -745, -603, 1166, 961, 652, 231, -573, -1064, +-289, -1009, -550, 1244, 990, 645, 221, -706, -995, -257, -1067, -380, 1103, 926, 585, 350, +-830, -834, -282, -1227, -154, 1074, 942, 572, 345, -966, -697, -246, -1191, 39, 1001, 817, +599, 274, -1068, -551, -325, -1104, 188, 1064, 726, 723, 258, -1011, -298, -529, -1041, 191, +1011, 617, 889, 207, -985, -95, -706, -986, 158, 847, 545, 1044, 100, -1019, -127, -808, +-932, 264, 719, 579, 1130, -102, -842, -175, -897, -956, 351, 590, 665, 1249, -354, -703, +-299, -923, -818, 497, 544, 724, 1208, -524, -500, -333, -995, -669, 585, 427, 772, 980, +-566, -361, -210, -929, -532, 438, 163, 890, 810, -446, -210, -215, -1052, -507, 439, 74, +1039, 526, -507, -76, -81, -986, -454, 278, -35, 1084, 435, -393, 57, -191, -1046, -280, +162, 85, 1082, 263, -461, 81, -221, -1057, -200, -125, 210, 1116, 220, -458, 55, -325, +-1035, -11, -235, 340, 1118, 196, -335, 132, -415, -1014, -97, -338, 497, 1210, 204, -275, +170, -575, -763, -47, -325, 544, 1147, 152, -194, 294, -773, -595, -34, -308, 603, 1093, +132, -165, 301, -803, -367, -119, -418, 623, 1030, 62, 49, 318, -795, -280, -231, -430, +643, 1001, 17, 298, 167, -839, -269, -366, -440, 638, 926, -107, 551, 125, -807, -286, +-537, -423, 708, 880, -85, 632, -73, -860, -311, -566, -302, 895, 638, -166, 600, -210, +-711, -309, -645, -282, 1102, 511, -88, 578, -348, -631, -359, -617, -178, 1147, 303, 46, +570, -483, -574, -370, -706, -148, 1141, 274, 207, 461, -532, -467, -298, -823, -22, 1035, +125, 415, 462, -493, -503, -377, -1011, 83, 952, 39, 466, 308, -456, -376, -341, -1044, +177, 759, -40, 531, 294, -485, -337, -393, -943, 420, 646, -7, 529, 282, -457, -183, +-497, -938, 539, 554, 171, 572, 236, -509, -123, -603, -808, 701, 492, 231, 585, 240, +-507, -175, -795, -617, 789, 410, 245, 645, 81, -507, -98, -844, -410, 705, 341, 211, +648, -102, -478, -65, -929, -178, 686, 243, 154, 555, -238, -317, -2, -975, -154, 593, +186, 241, 556, -279, -117, -84, -960, -104, 495, 7, 288, 566, -328, 21, -248, -946, +-107, 410, -49, 417, 551, -377, 110, -367, -863, 42, 427, -37, 534, 474, -265, 192, +-529, -926, 158, 471, -3, 633, 313, -199, 182, -544, -758, 314, 381, -46, 721, 152, +-136, 187, -554, -663, 380, 263, -64, 705, 44, 11, 231, -623, -616, 357, 79, 62, +740, -15, 16, 185, -653, -553, 400, -21, 238, 663, -91, 83, 175, -679, -471, 446, +-99, 374, 534, -127, 248, 269, -622, -399, 311, -190, 500, 539, -133, 240, 141, -764, +-313, 166, -228, 505, 370, -177, 289, 129, -875, -262, -40, -210, 629, 381, -69, 340, +25, -949, -146, -113, -136, 672, 307, -2, 433, -107, -910, -15, -123, -47, 656, 204, +-23, 512, -221, -718, 102, -162, 39, 618, 167, -16, 541, -423, -692, 85, -211, 143, +589, 51, -49, 541, -481, -527, 50, -355, 114, 550, 0, 147, 561, -590, -498, -32, +-354, 143, 555, -97, 313, 536, -613, -385, -148, -354, 231, 589, -168, 399, 448, -640, +-313, -219, -321, 323, 471, -262, 439, 347, -616, -335, -350, -377, 434, 386, -278, 468, +219, -553, -320, -404, -439, 530, 322, -178, 587, 22, -594, -327, -425, -371, 619, 176, +-186, 551, -107, -526, -236, -485, -282, 699, 73, -104, 546, -91, -423, -104, -469, -134, +657, -118, 45, 554, -100, -316, 3, -453, 13, 637, -223, 120, 490, -128, -215, 13, +-535, 95, 628, -165, 280, 551, -108, -154, -78, -580, 248, 561, -89, 423, 609, -138, +-86, -178, -619, 469, 500, -86, 469, 551, -207, -57, -245, -565, 548, 361, -118, 492, +467, -200, -5, -404, -531, 584, 304, -166, 366, 269, -158, 132, -498, -419, 589, 158, +-249, 372, 241, -115, 109, -655, -338, 579, 76, -204, 376, 66, -119, 152, -672, -337, +424, -56, -62, 514, 5, -70, 32, -708, -194, 442, -175, -105, 444, -103, 91, 6, +-735, -168, 335, -250, -31, 423, -153, 171, -78, -724, -47, 296, -332, 37, 371, -120, +240, -119, -677, 0, 171, -383, 197, 267, -136, 299, -146, -653, 37, 141, -338, 348, +226, -61, 320, -284, -667, 115, 115, -306, 347, 80, -23, 350, -355, -566, 279, 42, +-296, 274, -27, 102, 446, -335, -493, 279, -107, -191, 267, -149, 144, 449, -361, -458, +251, -181, -78, 243, -233, 186, 447, -367, -383, 167, -272, 10, 243, -165, 262, 347, +-467, -228, 172, -323, 45, 151, -183, 308, 337, -466, -94, 79, -367, 154, 123, -165, +348, 244, -500, 28, 81, -304, 147, -36, -173, 440, 188, -467, 88, -18, -235, 187, +-112, -175, 490, 80, -411, 160, -70, -204, 129, -134, -168, 473, 81, -340, 74, -103, +-165, 138, -81, -125, 457, 84, -309, 31, -68, -154, 134, -68, -95, 449, 128, -297, +34, -52, -215, 149, -65, -102, 415, 129, -335, 66, 0, -217, 139, -125, -136, 442, +141, -384, 93, -36, -207, 182, -125, -170, 490, 76, -388, 156, -79, -160, 120, -187, +-114, 444, 56, -202, 71, -123, -44, 93, -194, 15, 359, 27, -70, 42, -97, 54, +3, -267, 113, 280, 56, 36, -11, -109, 134, -105, -309, 176, 158, 50, 128, -32, +-17, 255, -320, -408, 163, 69, 88, 221, -147, 12, 355, -496, -381, 162, -66, 114, +288, -245, 68, 332, -587, -317, 105, -97, 183, 260, -333, 147, 286, -617, -338, -44, +-168, 249, 246, -364, 206, 153, -637, -275, -80, -209, 293, 197, -333, 346, 44, -651, +-259, -167, -204, 410, 139, -354, 350, -64, -578, -168, -206, -185, 486, 50, -294, 381, +-80, -447, -59, -194, -117, 514, -91, -152, 456, -113, -362, -2, -204, -7, 568, -170, +-57, 432, -157, -283, 30, -264, 62, 595, -154, 97, 467, -154, -251, -18, -325, 202, +575, -147, 245, 507, -154, -215, -57, -398, 385, 546, -147, 323, 462, -201, -181, -81, +-403, 471, 433, -168, 354, 404, -204, -110, -207, -437, 521, 361, -177, 282, 277, -199, +25, -291, -389, 569, 231, -223, 283, 278, -175, 51, -454, -354, 589, 157, -192, 289, +139, -207, 123, -498, -352, 453, 27, -91, 443, 95, -177, 57, -594, -228, 463, -64, +-160, 408, -22, -37, 74, -669, -197, 351, -143, -118, 430, -104, 37, 7, -692, -85, +323, -238, -70, 415, -119, 141, -44, -665, -57, 224, -327, 86, 352, -176, 249, -73, +-647, -40, 206, -328, 248, 328, -125, 321, -212, -676, 21, 200, -331, 280, 173, -102, +375, -282, -604, 196, 148, -352, 250, 30, 51, 364, -27, 32, 2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 55, +58, 101, 106, 102, 93, 49, 32, -5, -55, -92, -98, -102, -70, -29, 31, 63, +118, 116, 134, 133, 136, 128, 105, 54, 19, -62, -149, -186, -224, -219, -205, -198, +-200, -222, -252, -276, -272, -238, -203, -149, -116, -102, -111, -140, -115, -69, 21, 119, +221, 293, 325, 315, 293, 310, 386, 426, 420, 450, 413, 339, 247, 179, 181, 189, +259, 290, 277, 200, 204, 185, 272, 333, 20, 554, -90, -1041, -378, -21, 2302, 2590, +2361, 1665, -529, 673, -924, -3504, -3526, -1939, -2847, -587, 1371, 5949, 5990, 938, -3029, 1929, +-265, -512, -1470, -423, 4059, 919, -5390, -3756, -367, -3784, 711, 2966, 9635, 9478, 388, -6238, +2098, 1981, -5998, -7409, 2776, 11158, 8014, 194, -4098, -6119, -13428, -15852, -4678, 10402, 14349, 7203, +2302, 3274, -1729, -11289, -13079, -1849, 11739, 12393, 2319, 1653, -704, -8879, -15029, -8766, 877, 9303, +3756, 1055, 6075, 2044, -11318, -11025, -1094, 9174, 6322, -1506, 452, -484, -14596, -23098, -14385, 4928, +12105, 8768, 4853, 6585, -168, -15219, -18753, -4206, 11193, 10988, 8289, 5751, 2016, -7496, -14973, -10297, +7223, 15073, 12535, 8126, 5779, -3850, -13105, -15464, -1319, 13550, 17681, 10176, 5923, -4458, -16780, -24618, +-14754, 7555, 22367, 19018, 10819, 3885, -6036, -18542, -20444, -6301, 16449, 24004, 20772, 13300, -1376, -20297, +-30514, -23510, -1184, 16798, 22405, 18849, 9296, -4106, -22427, -27742, -15300, 6317, 19066, 22344, 16268, 6805, +-8768, -25833, -27373, -7336, 10667, 19878, 15265, 6424, -5315, -18109, -28299, -16319, 5587, 19350, 20800, 17936, +7692, -7808, -25154, -27811, -9941, 10193, 19411, 20323, 15433, 3176, -15639, -29973, -22885, -3968, 12679, 18609, +19175, 13499, -1245, -21530, -28098, -16595, 1465, 13133, 17747, 17857, 11395, -7158, -21720, -19723, -3911, 10880, +17477, 17985, 17340, 6564, -12805, -23995, -16757, -1572, 11363, 15779, 16416, 13208, -1815, -17556, -18375, -8309, +3244, 11031, 15294, 17362, 9441, -8105, -18899, -14721, -3918, 5795, 8547, 11171, 11141, 442, -13318, -16738, +-11389, -82, 7400, 11267, 13368, 8458, -5200, -12681, -11844, -3138, 3966, 6796, 8587, 8228, -2455, -14864, +-18978, -11894, -136, 6549, 9901, 12048, 6973, -5473, -14684, -16033, -5897, 4488, 9436, 12046, 11245, 1117, +-9780, -16732, -13311, -3368, 5105, 9855, 14180, 9684, -702, -10200, -13220, -5864, 2386, 6617, 10902, 10185, +1850, -8116, -15633, -13900, -4040, 3602, 9141, 12948, 8967, 1203, -7667, -10535, -3758, 5329, 11004, 15109, +12815, 4542, -5590, -13540, -13393, -5083, 1997, 8467, 12062, 7677, -1381, -10246, -15182, -9272, 79, 7113, +13691, 12673, 4723, -4610, -13495, -14092, -5879, 2449, 10025, 13178, 7767, -164, -8628, -13838, -10012, -2441, +6345, 12788, 11745, 4840, -3376, -11391, -11956, -5857, 2805, 10943, 13228, 7639, -299, -9913, -15195, -12171, +-3800, 6130, 13707, 12750, 7056, -580, -8138, -10220, -5360, 3034, 12491, 14451, 9060, 1078, -8085, -12649, +-10699, -4462, 5356, 13226, 11956, 6176, -2800, -10561, -13161, -10256, -2461, 8889, 12548, 9575, 1722, -7247, +-12802, -13074, -8318, 3314, 13011, 14092, 8502, -1155, -9547, -13038, -12734, -5617, 7014, 13866, 13579, 6627, +-2795, -9433, -12244, -11546, -1323, 8930, 12403, 8882, 350, -8007, -11653, -13348, -7227, 4617, 12603, 13353, +6536, -3504, -9835, -13945, -13456, -3475, 7478, 13580, 11633, 3156, -4743, -9430, -13171, -8658, 2390, 11733, +14667, 9769, 858, -5510, -11890, -13957, -6930, 4069, 11488, 11202, 4008, -2653, -8534, -13779, -11526, -1756, +8050, 12968, 8593, 1113, -4699, -11264, -13928, -7719, 2303, 10970, 11436, 5045, -274, -5844, -11702, -10370, +-2314, 8317, 13814, 9136, 2405, -3019, -9492, -12652, -7918, 1960, 11558, 11653, 4996, -1166, -7324, -13351, +-13029, -5183, 7414, 13993, 11122, 4958, -386, -8228, -13100, -10892, -724, 10333, 12243, 6671, 2012, -4354, +-10602, -12201, -6271, 6233, 14275, 11086, 5772, 299, -7362, -12460, -11766, -1839, 10802, 13842, 9286, 4473, +-2168, -8476, -12056, -7417, 4877, 13871, 12194, 7821, 1780, -4719, -11180, -11810, -2817, 10500, 14267, 11035, +5936, -196, -7212, -12220, -9730, 2809, 12584, 12448, 8378, 2520, -4327, -11316, -14064, -6010, 7932, 13436, +11678, 6792, 1033, -5848, -12311, -11464, 880, 11407, 13185, 9088, 3524, -2585, -9708, -14630, -8133, 4764, +11927, 11469, 6633, 877, -5746, -13243, -13435, -2258, 9112, 12663, 9900, 4314, -1055, -8843, -15298, -10702, +1365, 9467, 10348, 5803, 1225, -4167, -11989, -13744, -4495, 6394, 11468, 9216, 4145, -345, -8214, -15512, +-12411, -1022, 8895, 11797, 7981, 4554, -982, -10007, -13960, -6912, 3913, 11094, 9719, 5982, 2001, -5877, +-14268, -13158, -3767, 6961, 10548, 7956, 5328, 280, -9272, -14753, -10143, 382, 8703, 8791, 6474, 3503, +-3775, -12614, -13417, -5801, 5164, 9128, 7361, 5424, 1227, -7747, -13945, -11617, -1127, 8073, 8777, 6638, +4056, -3091, -11801, -15024, -8725, 2907, 8676, 8154, 6895, 2717, -5659, -12786, -12446, -2611, 6595, 8360, +7566, 5336, -1070, -9453, -14504, -9541, 1409, 7231, 7910, 7717, 3957, -3134, -11111, -12535, -3959, 5288, +7980, 8559, 6688, 1306, -6724, -13105, -10069, 205, 6392, 8414, 8739, 5692, -390, -8353, -11253, -3929, +4694, 7899, 9175, 7436, 2894, -4759, -12029, -9949, -208, 5969, 8756, 8704, 6015, 364, -7837, -11892, +-5409, 2815, 7619, 9481, 8079, 4277, -3001, -10904, -9777, -1452, 4954, 8562, 8712, 6293, 1802, -6618, +-11482, -6051, 1988, 7480, 9904, 8443, 5276, -1895, -10902, -11474, -4435, 2829, 7913, 8637, 6773, 2779, +-6315, -11998, -8630, -1029, 5880, 9533, 8806, 6732, -364, -9387, -11502, -5974, 1265, 7432, 8638, 7992, +4166, -4395, -10841, -9086, -2782, 4481, 8040, 8317, 7314, 1259, -7529, -10540, -6827, 295, 6880, 8558, +8693, 5179, -3256, -9867, -9288, -4185, 3629, 7380, 8625, 7994, 1953, -6736, -10359, -8373, -1267, 5190, +7489, 8354, 5267, -3002, -9550, -10981, -6692, 1031, 5220, 7456, 7897, 2325, -5736, -10441, -10035, -3506, +2856, 6002, 8179, 6132, -1210, -7825, -10534, -6897, 260, 4391, 7164, 7961, 2928, -4272, -9383, -10052, +-4101, 2109, 5570, 8589, 6833, 395, -5970, -10009, -7814, -1317, 2885, 6768, 8066, 3889, -2599, -8436, +-10374, -5053, 813, 5398, 9235, 8066, 2463, -4218, -9375, -7830, -1814, 2595, 7118, 8751, 5220, -581, +-6785, -9541, -5157, -42, 4994, 9050, 8144, 3267, -2929, -8887, -8235, -3503, 1139, 6312, 8413, 5723, +884, -5752, -9142, -6129, -1736, 3760, 8098, 7864, 4077, -2099, -8365, -8191, -4662, 239, 5574, 7750, +5700, 1489, -5325, -8580, -6542, -2645, 3124, 7854, 8014, 5215, -903, -7287, -7988, -5401, -536, 5550, +8076, 6968, 3122, -4070, -7879, -7164, -3942, 2185, 7281, 8401, 6818, 716, -5655, -7301, -5843, -1292, +4703, 7252, 7243, 3618, -2926, -6724, -7192, -4941, 890, 5690, 7700, 6821, 1376, -4603, -7016, -6856, +-2423, 3308, 6387, 7073, 3987, -2016, -5670, -7256, -5484, 327, 5051, 7462, 6705, 1212, -4116, -6759, +-7363, -2994, 2731, 6529, 7829, 4608, -1512, -5284, -7666, -6048, -759, 4200, 7507, 7418, 2112, -2754, +-6449, -7870, -4451, 878, 5199, 7625, 4856, -504, -4572, -7700, -6893, -2341, 2472, 6625, 7086, 2725, +-1925, -6183, -8351, -5578, -737, 4208, 7280, 4814, 387, -3696, -7443, -7304, -3384, 1398, 6498, 7304, +3792, -629, -5448, -8223, -5863, -1657, 4007, 7588, 5863, 1913, -2276, -6621, -6880, -3969, 709, 5940, +7295, 4618, 978, -3829, -6771, -5666, -2227, 3449, 7202, 6107, 2903, -1096, -5525, -6307, -4433, 305, +5771, 7403, 5167, 2009, -3003, -6070, -6031, -2835, 3090, 7189, 6400, 3904, -523, -5057, -6650, -5591, +-979, 4768, 6543, 5067, 2097, -2625, -5781, -6624, -3953, 1970, 6320, 6341, 4294, -91, -4497, -6911, +-6476, -1864, 4067, 6166, 5492, 2637, -1582, -5022, -6974, -5403, 461, 5191, 6511, 5040, 982, -3171, +-6099, -7004, -2978, 2767, 5843, 6191, 3765, -164, -3556, -6526, -5619, -301, 4429, 6500, 5731, 2244, +-1448, -4936, -6717, -3253, 1853, 5362, 6204, 4276, 880, -2284, -5897, -5341, -799, 3815, 6179, 5688, +2463, -632, -4520, -6544, -3800, 1220, 4989, 6360, 4138, 1122, -2195, -6028, -6096, -1899, 2635, 5669, +5513, 2734, -72, -4185, -6856, -4786, 42, 4246, 6172, 4294, 1839, -1597, -5580, -6402, -3099, 1271, +5056, 5087, 3079, 355, -3719, -6838, -5418, -1364, 3381, 5266, 3697, 1484, -1575, -5493, -6485, -4021, +373, 4227, 4548, 2921, 677, -3242, -6416, -5758, -2293, 2489, 4643, 3787, 2142, -662, -4634, -6099, +-4481, -56, 3921, 4559, 3374, 1510, -2386, -5445, -5752, -2712, 2111, 4503, 3855, 2575, -227, -3797, +-5671, -4583, -438, 3581, 4299, 3622, 1946, -1569, -4762, -5758, -3141, 1816, 4452, 4408, 3364, 485, +-3111, -5361, -4827, -531, 3699, 4725, 4415, 2565, -852, -4068, -5708, -3464, 1626, 4468, 4942, 3934, +1066, -2411, -4963, -5146, -1032, 3066, 4658, 4684, 3135, -99, -3467, -5936, -4273, 563, 3994, 5128, +4582, 1796, -1621, -4942, -5780, -2143, 2253, 4492, 5007, 3539, 482, -2882, -5767, -4606, -340, 3106, +4691, 4629, 2327, -595, -4257, -5510, -2666, 1300, 3706, 4787, 3520, 1179, -2098, -5201, -4688, -1075, +2153, 4221, 4348, 2521, -332, -3991, -5657, -3311, 444, 3136, 4405, 3489, 1573, -1656, -4921, -4926, +-1741, 1606, 4116, 4484, 3145, 505, -3339, -5528, -3804, -472, 2713, 4249, 3827, 2342, -775, -4419, +-4991, -2658, 669, 3477, 4285, 3520, 1309, -2648, -5221, -4263, -1297, 1972, 3718, 3703, 2715, -159, +-3816, -4847, -3121, 58, 2871, 3856, 3607, 1925, -1817, -4493, -4337, -1916, 1409, 3454, 3742, 3154, +329, -3070, -4572, -3547, -607, 2438, 3643, 3909, 2390, -1122, -4043, -4435, -2464, 954, 2996, 3506, +3090, 642, -2649, -4363, -3653, -947, 1913, 3073, 3537, 2272, -805, -3696, -4409, -2743, 673, 2636, +3467, 3170, 937, -2270, -4007, -3867, -1177, 1612, 3114, 3703, 2649, -295, -3104, -4525, -3172, 31, +2345, 3514, 3495, 1342, -1643, -3819, -4054, -1579, 1289, 2988, 3814, 2868, 141, -2561, -4171, -3138, +-280, 2065, 3391, 3666, 1705, -949, -3430, -3986, -2048, 743, 2589, 3827, 3030, 745, -2053, -3918, +-3384, -784, 1449, 3275, 3627, 2044, -472, -3046, -4072, -2338, 45, 2129, 3677, 3321, 1275, -1461, +-3699, -3526, -1300, 966, 3078, 3765, 2532, 73, -2626, -3952, -2571, -385, 1945, 3654, 3454, 1616, +-950, -3505, -3583, -1828, 469, 2826, 3896, 2823, 626, -2304, -3809, -2879, -915, 1413, 3308, 3290, +1729, -964, -3463, -3757, -2338, -223, 2211, 3364, 2663, 612, -2290, -3948, -3360, -1713, 632, 2657, +2985, 1917, -616, -3289, -4008, -2934, -830, 1878, 3129, 2792, 955, -1932, -3742, -3378, -1950, 579, +2533, 3051, 2105, -258, -2977, -3789, -3142, -1078, 1483, 2939, 2923, 1387, -1389, -3304, -3397, -2213, +215, 2230, 3034, 2467, 386, -2150, -3183, -2928, -1106, 1207, 2680, 3004, 1821, -781, -2649, -3176, +-2233, 66, 2085, 2977, 2677, 610, -1751, -3020, -3042, -1414, 968, 2591, 3261, 2206, -195, -2157, +-3109, -2491, -227, 1820, 2971, 2891, 1033, -1212, -2693, -3126, -1653, 664, 2332, 3132, 2269, 70, +-1915, -3069, -2657, -558, 1487, 2887, 2902, 1264, -824, -2432, -3172, -1897, 201, 2139, 3171, 2491, +427, -1436, -2942, -2742, -868, 1351, 3067, 3244, 1567, -458, -2213, -3115, -2109, -143, 2016, 3293, +2644, 723, -1199, -2910, -2943, -1368, 877, 2919, 3388, 1958, 78, -1904, -3008, -2352, -516, 1720, +3301, 2843, 1330, -581, -2355, -2698, -1469, 569, 2664, 3261, 2210, 548, -1372, -2543, -2235, -863, +1298, 2955, 2836, 1667, -124, -1925, -2541, -1826, -28, 2275, 3131, 2411, 869, -1101, -2443, -2438, +-1302, 903, 2588, 2755, 1786, 75, -1722, -2483, -2151, -459, 1724, 2744, 2331, 994, -918, -2216, +-2475, -1584, 414, 2100, 2487, 1772, 122, -1598, -2506, -2524, -1016, 1182, 2417, 2342, 1189, -716, +-2068, -2641, -1968, -24, 1796, 2297, 1866, 347, -1237, -2439, -2623, -1366, 816, 2149, 2343, 1266, +-392, -1908, -2676, -2200, -311, 1556, 2444, 2103, 656, -1019, -2404, -2817, -1560, 600, 2078, 2411, +1401, -144, -1634, -2640, -2377, -520, 1354, 2438, 2092, 841, -772, -2157, -2848, -1796, 130, 1874, +2391, 1625, 125, -1390, -2632, -2493, -985, 944, 2120, 2035, 868, -465, -1939, -2709, -2005, -182, +1534, 2252, 1630, 419, -1075, -2381, -2411, -1043, 877, 2177, 2129, 1106, -152, -1695, -2504, -1941, +-226, 1501, 2350, 1847, 732, -822, -2207, -2463, -1244, 578, 2114, 2262, 1535, 251, -1267, -2335, +-2013, -607, 1318, 2359, 2185, 1157, -356, -1916, -2468, -1673, 169, 1803, 2345, 1899, 682, -983, +-2297, -2347, -1069, 962, 2140, 2171, 1216, -227, -1805, -2507, -2032, -205, 1526, 2292, 1878, 843, +-763, -2011, -2407, -1329, 588, 2020, 2293, 1610, 125, -1442, -2431, -2158, -531, 1316, 2255, 2119, +1063, -469, -1806, -2374, -1483, 342, 1849, 2294, 1681, 320, -1150, -2213, -2128, -732, 1116, 2168, +2233, 1249, -71, -1489, -2167, -1592, 131, 1705, 2426, 1839, 579, -896, -2011, -2137, -833, 836, +2073, 2252, 1394, 40, -1265, -2036, -1511, 37, 1565, 2389, 2042, 935, -462, -1692, -2000, -932, +626, 1937, 2210, 1588, 353, -944, -1959, -1617, -351, 1218, 2147, 2123, 1117, -237, -1642, -2105, +-1369, 155, 1521, 2106, 1603, 517, -869, -1918, -1908, -862, 648, 1832, 2002, 1227, -92, -1532, +-2180, -1711, -355, 1121, 1894, 1594, 678, -809, -1948, -2211, -1322, 182, 1563, 1869, 1306, -35, +-1429, -2230, -1863, -691, 900, 1789, 1772, 758, -634, -1845, -2158, -1532, 16, 1451, 2027, 1492, +159, -1353, -2132, -2015, -895, 692, 1774, 1936, 1046, -423, -1737, -2191, -1759, -296, 1118, 1977, +1629, 424, -1135, -1982, -2086, -1092, 255, 1502, 1780, 1117, -328, -1493, -2136, -1734, -633, 757, +1646, 1581, 456, -889, -1884, -2097, -1296, 37, 1213, 1698, 1187, -112, -1305, -2086, -1893, -887, +473, 1474, 1695, 758, -510, -1664, -2038, -1444, -157, 1060, 1787, 1359, 302, -981, -1771, -1845, +-915, 315, 1497, 1767, 1150, -103, -1253, -1845, -1332, -181, 1170, 1880, 1672, 666, -528, -1496, +-1634, -893, 356, 1575, 1986, 1415, 188, -1014, -1722, -1360, -360, 1061, 1867, 1822, 818, -311, +-1469, -1668, -1150, 288, 1584, 2206, 1599, 458, -933, -1675, -1640, -518, 944, 2025, 2048, 1225, +-124, -1256, -1741, -1260, 125, 1512, 2134, 1669, 565, -807, -1637, -1738, -711, 788, 1988, 2021, +1270, -108, -1201, -1864, -1454, -193, 1388, 2099, 1843, 691, -582, -1594, -1817, -1013, 598, 1863, +2183, 1407, 137, -1009, -1722, -1567, -340, 1236, 2204, 2095, 994, -317, -1390, -1857, -1232, 363, +1799, 2314, 1625, 397, -778, -1619, -1770, -664, 939, 2165, 2137, 1142, -182, -1282, -2037, -1585, +-167, 1520, 2237, 1794, 548, -546, -1606, -1922, -1186, 459, 1840, 2196, 1353, 143, -1114, -2022, +-1866, -565, 1175, 2143, 1869, 766, -373, -1530, -1995, -1475, 79, 1550, 2150, 1428, 353, -1010, +-1917, -2071, -968, 642, 1841, 1679, 856, -321, -1375, -2046, -1694, -379, 1236, 1839, 1389, 330, +-906, -1923, -2196, -1328, 381, 1646, 1649, 924, -245, -1391, -2082, -1828, -585, 1048, 1665, 1441, +568, -550, -1701, -2076, -1471, 189, 1404, 1652, 1002, -29, -1241, -1982, -2002, -721, 855, 1658, +1444, 653, -542, -1616, -2225, -1670, -53, 1301, 1627, 1151, 114, -1010, -1847, -2017, -926, 611, +1445, 1424, 827, -287, -1276, -1971, -1614, -175, 1223, 1614, 1298, 294, -738, -1701, -1892, -939, +657, 1481, 1598, 898, 2, -996, -1754, -1596, -181, 1125, 1711, 1439, 598, -435, -1390, -1822, +-1005, 464, 1454, 1739, 1250, 379, -703, -1642, -1630, -365, 987, 1795, 1751, 1051, -31, -1120, +-1779, -1060, 322, 1531, 1837, 1484, 602, -443, -1542, -1543, -449, 959, 1766, 1837, 1220, 313, +-989, -1760, -1276, 84, 1329, 1852, 1536, 794, -352, -1535, -1705, -798, 617, 1622, 1831, 1320, +435, -963, -1805, -1477, -127, 1127, 1798, 1610, 1073, -110, -1375, -1872, -1060, 328, 1466, 1737, +1543, 688, -689, -1800, -1703, -587, 808, 1532, 1548, 1091, -38, -1341, -1844, -1237, 50, 1110, +1447, 1375, 688, -588, -1707, -1828, -900, 495, 1277, 1463, 1173, 243, -1111, -1808, -1497, -319, +732, 1280, 1348, 913, -331, -1495, -1889, -1051, 201, 1087, 1354, 1232, 289, -969, -1862, -1677, +-579, 586, 1166, 1361, 971, -110, -1296, -1862, -1298, -117, 827, 1266, 1297, 491, -743, -1780, +-1771, -862, 311, 961, 1284, 975, 41, -1220, -1819, -1442, -341, 572, 1211, 1291, 691, -578, +-1638, -1828, -994, 69, 902, 1304, 1154, 229, -1010, -1777, -1554, -571, 466, 1238, 1462, 897, +-428, -1601, -1904, -1132, -107, 824, 1320, 1259, 345, -874, -1710, -1480, -618, 375, 1067, 1428, +943, -195, -1376, -1693, -1166, -152, 744, 1363, 1421, 629, -693, -1572, -1548, -832, 137, 998, +1530, 1250, 120, -1116, -1558, -1134, -275, 563, 1292, 1530, 885, -393, -1301, -1365, -724, 76, +943, 1551, 1473, 377, -848, -1513, -1198, -436, 498, 1273, 1724, 1096, -138, -1180, -1325, -833, +-48, 724, 1505, 1577, 650, -656, -1377, -1192, -532, 268, 1140, 1713, 1335, 170, -1000, -1315, +-959, -235, 605, 1563, 1774, 1023, -369, -1224, -1299, -691, 26, 1033, 1666, 1475, 279, -904, +-1391, -956, -367, 429, 1291, 1649, 984, -263, -1243, -1266, -737, -90, 817, 1554, 1516, 469, +-785, -1361, -1067, -605, 241, 1161, 1704, 1185, -62, -1233, -1354, -954, -251, 638, 1527, 1605, +747, -603, -1268, -1163, -696, -13, 938, 1547, 1377, 278, -821, -1164, -965, -492, 447, 1360, +1622, 890, -392, -1120, -1128, -794, -103, 908, 1622, 1471, 324, -829, -1230, -1049, -575, 347, +1252, 1664, 1041, -142, -986, -1086, -952, -339, 558, 1405, 1405, 472, -673, -1077, -1169, -858, +-64, 999, 1631, 1200, -57, -935, -1241, -1214, -694, 298, 1289, 1484, 607, -456, -967, -1139, +-1008, -403, 688, 1469, 1220, 118, -698, -1121, -1161, -826, 76, 1062, 1478, 657, -334, -966, +-1193, -1180, -576, 438, 1423, 1238, 225, -675, -1137, -1290, -978, -213, 931, 1488, 824, -187, +-914, -1248, -1246, -739, 243, 1288, 1236, 406, -505, -1061, -1310, -1142, -453, 825, 1512, 1052, +71, -713, -1222, -1298, -966, 88, 1203, 1370, 600, -235, -890, -1155, -1126, -505, 708, 1462, +1058, 203, -596, -1095, -1231, -984, 37, 1206, 1380, 704, -116, -747, -1078, -1173, -594, 667, +1484, 1165, 336, -494, -949, -1200, -994, -45, 1177, 1433, 882, -4, -644, -1160, -1365, -887, +487, 1438, 1367, 531, -323, -913, -1273, -1314, -321, 1026, 1491, 952, 13, -651, -1006, -1282, +-940, 360, 1357, 1385, 553, -261, -835, -1258, -1412, -458, 866, 1589, 1145, 223, -506, -990, +-1486, -1151, 73, 1310, 1544, 897, 7, -623, -1284, -1546, -706, 782, 1658, 1420, 482, -315, +-951, -1572, -1397, -167, 1218, 1728, 1196, 282, -414, -1246, -1643, -962, 500, 1566, 1594, 752, +16, -779, -1513, -1507, -373, 1027, 1762, 1264, 451, -289, -1079, -1598, -1002, 412, 1647, 1700, +928, 170, -525, -1313, -1430, -487, 947, 1777, 1469, 792, 126, -788, -1555, -1217, 85, 1504, +1782, 1185, 431, -312, -1205, -1431, -679, 773, 1658, 1546, 923, 280, -656, -1366, -1247, -52, +1260, 1654, 1192, 612, -117, -997, -1474, -892, 397, 1327, 1330, 926, 395, -450, -1311, -1467, +-469, 865, 1487, 1282, 822, 40, -899, -1502, -1108, 100, 1106, 1220, 970, 470, -300, -1236, +-1475, -647, 644, 1217, 1169, 726, 91, -839, -1512, -1233, 25, 955, 1156, 942, 592, -133, +-1120, -1567, -812, 460, 1121, 1150, 815, 261, -653, -1408, -1241, -56, 852, 1082, 837, 536, +-101, -990, -1545, -872, 292, 1055, 1104, 821, 285, -535, -1437, -1339, -269, 699, 999, 864, +487, -85, -1003, -1583, -951, 240, 992, 1057, 722, 180, -664, -1586, -1564, -491, 607, 1019, +848, 419, -169, -1130, -1723, -1208, -28, 767, 967, 695, 252, -597, -1553, -1690, -690, 442, +1002, 873, 573, -7, -1014, -1772, -1354, -290, 640, 920, 797, 438, -397, -1550, -1787, -910, +289, 918, 892, 650, 154, -864, -1701, -1415, -393, 609, 925, 883, 620, -140, -1340, -1740, +-1046, 198, 951, 1127, 925, 458, -669, -1573, -1596, -588, 484, 1016, 1047, 884, 67, -1105, +-1677, -1126, 80, 917, 1112, 1044, 649, -402, -1369, -1544, -646, 449, 1089, 1226, 1154, 345, +-817, -1579, -1201, -101, 830, 1153, 1297, 928, -52, -1141, -1418, -689, 401, 999, 1300, 1281, +562, -615, -1468, -1251, -165, 783, 1237, 1472, 1122, 96, -1037, -1443, -822, 228, 868, 1287, +1430, 863, -323, -1300, -1314, -423, 458, 1059, 1476, 1334, 396, -810, -1462, -938, 51, 782, +1267, 1532, 1046, -18, -1109, -1238, -478, 392, 934, 1384, 1273, 532, -632, -1293, -958, -96, +538, 1083, 1410, 1030, -37, -1157, -1392, -686, 152, 763, 1313, 1299, 589, -632, -1366, -1101, +-228, 346, 979, 1340, 1146, 110, -1006, -1396, -757, -42, 611, 1155, 1326, 697, -454, -1311, +-1148, -486, 116, 763, 1282, 1198, 268, -917, -1394, -913, -302, 316, 965, 1304, 833, -283, +-1319, -1268, -620, 72, 698, 1231, 1120, 262, -1003, -1466, -1023, -318, 315, 981, 1320, 966, +-256, -1314, -1397, -786, -177, 513, 1124, 1311, 574, -708, -1398, -1165, -573, 113, 817, 1233, +996, -121, -1221, -1378, -864, -279, 431, 1025, 1267, 617, -598, -1313, -1116, -621, 41, 705, +1243, 1114, 97, -1009, -1227, -891, -311, 297, 954, 1226, 712, -487, -1181, -1153, -696, -97, +590, 1131, 1129, 120, -973, -1326, -1106, -552, 124, 800, 1210, 776, -449, -1160, -1208, -821, +-276, 392, 1002, 1147, 206, -845, -1262, -1079, -652, -24, 639, 1265, 895, -191, -1023, -1198, +-1001, -447, 209, 982, 1227, 433, -663, -1143, -1086, -669, -94, 573, 1206, 919, -91, -900, +-1100, -917, -402, 142, 957, 1276, 569, -477, -996, -1131, -782, -319, 476, 1227, 1129, 152, +-653, -1057, -946, -554, 74, 964, 1420, 782, -232, -894, -1054, -784, -318, 487, 1330, 1298, +369, -537, -1036, -914, -589, -34, 855, 1406, 901, 17, -692, -895, -736, -364, 373, 1324, +1393, 592, -326, -825, -821, -563, -61, 896, 1509, 1138, 177, -672, -911, -681, -375, 370, +1280, 1457, 815, -151, -764, -763, -525, -112, 791, 1410, 1231, 433, -396, -761, -728, -574, +175, 1135, 1474, 974, 57, -694, -847, -792, -331, 631, 1378, 1286, 553, -380, -775, -810, +-641, 45, 1004, 1397, 1075, 158, -614, -855, -912, -524, 463, 1268, 1336, 680, -265, -708, +-888, -888, -238, 808, 1367, 1212, 259, -498, -864, -1026, -757, 236, 1068, 1320, 693, -240, +-763, -1012, -1055, -371, 634, 1306, 1178, 304, -458, -867, -1197, -991, -57, 908, 1353, 827, +-72, -604, -954, -1157, -644, 313, 1136, 1185, 453, -365, -884, -1311, -1114, -241, 812, 1367, +944, 58, -565, -1068, -1290, -806, 107, 995, 1176, 530, -182, -730, -1230, -1166, -453, 588, +1237, 943, 188, -427, -945, -1199, -854, -18, 951, 1189, 692, 15, -656, -1253, -1255, -585, +518, 1243, 1026, 380, -231, -894, -1278, -1031, -176, 825, 1067, 643, 69, -524, -1142, -1278, +-790, 269, 1023, 944, 424, -147, -843, -1299, -1190, -371, 649, 984, 697, 255, -372, -1093, +-1386, -1009, 113, 997, 1045, 572, -28, -764, -1267, -1279, -481, 567, 1025, 819, 419, -223, +-905, -1362, -1122, -50, 898, 1090, 815, 270, -495, -1113, -1290, -576, 472, 1013, 903, 572, +-25, -738, -1319, -1132, -104, 900, 1133, 868, 333, -392, -1046, -1267, -618, 438, 1012, 975, +679, 146, -550, -1142, -1036, -95, 843, 1134, 986, 538, -134, -908, -1255, -615, 520, 1182, +1212, 888, 267, -503, -1235, -1211, -274, 763, 1179, 1093, 673, 9, -817, -1287, -813, 249, +1014, 1189, 950, 434, -296, -1069, -1153, -375, 623, 1136, 1221, 918, 290, -682, -1308, -959, +130, 987, 1278, 1113, 701, -34, -889, -1165, -503, 475, 1075, 1199, 973, 417, -522, -1227, +-1003, -77, 800, 1149, 1112, 809, 92, -899, -1286, -721, 236, 957, 1202, 1114, 618, -355, +-1202, -1146, -317, 616, 1128, 1261, 1052, 313, -752, -1267, -853, 66, 840, 1200, 1243, 849, +-160, -1134, -1243, -525, 400, 1013, 1232, 1111, 425, -709, -1371, -1058, -131, 683, 1095, 1164, +787, -189, -1187, -1422, -770, 208, 913, 1242, 1170, 416, -733, -1455, -1240, -385, 465, 985, +1219, 953, -38, -1127, -1537, -1047, -151, 565, 1003, 1148, 543, -603, -1451, -1420, -684, 146, +716, 1045, 853, -60, -1126, -1612, -1234, -445, 292, 857, 1094, 560, -527, -1378, -1441, -819, +-65, 565, 1003, 940, 76, -967, -1510, -1181, -437, 281, 854, 1178, 720, -307, -1278, -1461, +-890, -78, 628, 1162, 1146, 331, -790, -1448, -1219, -534, 214, 873, 1295, 914, -134, -1191, +-1440, -939, -141, 609, 1233, 1266, 519, -624, -1352, -1271, -627, 113, 871, 1408, 1155, 117, +-1000, -1419, -1042, -279, 565, 1326, 1475, 753, -451, -1298, -1335, -735, 21, 852, 1462, 1300, +307, -843, -1387, -1161, -462, 377, 1173, 1480, 911, -256, -1178, -1362, -881, -145, 725, 1426, +1401, 499, -679, -1352, -1215, -587, 290, 1188, 1604, 1108, -76, -1111, -1340, -908, -209, 661, +1395, 1455, 625, -530, -1288, -1247, -687, 148, 1058, 1573, 1175, 95, -920, -1271, -984, -333, +559, 1393, 1574, 819, -367, -1184, -1276, -878, -65, 953, 1607, 1379, 321, -798, -1276, -1140, +-583, 343, 1244, 1548, 971, -131, -953, -1212, -1010, -302, 717, 1480, 1437, 520, -564, -1148, +-1180, -777, 75, 1079, 1589, 1181, 121, -790, -1177, -1123, -524, 493, 1368, 1484, 652, -453, +-1047, -1135, -804, 34, 996, 1542, 1147, 114, -720, -1095, -1107, -590, 366, 1277, 1495, 691, +-343, -974, -1177, -956, -177, 832, 1518, 1221, 186, -711, -1142, -1191, -751, 177, 1180, 1512, +810, -234, -957, -1265, -1077, -311, 732, 1503, 1280, 330, -564, -1096, -1240, -817, 75, 1098, +1511, 890, -72, -823, -1237, -1165, -521, 500, 1418, 1342, 464, -448, -1086, -1337, -1003, -173, +928, 1505, 1011, 53, -763, -1227, -1247, -686, 352, 1311, 1320, 550, -328, -975, -1239, -1025, +-315, 832, 1445, 1097, 289, -556, -1164, -1271, -861, 159, 1228, 1362, 769, -52, -810, -1214, +-1158, -531, 672, 1376, 1128, 391, -414, -1059, -1267, -998, 13, 1159, 1424, 875, 5, -823, +-1277, -1266, -668, 537, 1337, 1253, 625, -270, -1051, -1412, -1268, -245, 987, 1410, 1043, 220, +-679, -1290, -1498, -929, 388, 1349, 1435, 813, -133, -950, -1472, -1468, -458, 868, 1473, 1219, +409, -527, -1198, -1570, -1165, 55, 1085, 1356, 923, 85, -730, -1369, -1527, -615, 658, 1384, +1313, 598, -276, -975, -1512, -1192, 6, 1047, 1408, 1037, 269, -476, -1183, -1505, -725, 493, +1329, 1388, 754, -44, -781, -1441, -1259, -176, 907, 1445, 1211, 526, -178, -984, -1462, -867, +277, 1309, 1585, 1063, 300, -545, -1402, -1309, -363, 755, 1457, 1331, 732, 85, -847, -1437, +-962, 100, 1146, 1535, 1144, 508, -338, -1309, -1381, -572, 543, 1346, 1321, 790, 194, -785, +-1459, -1171, -215, 911, 1452, 1212, 683, -223, -1243, -1443, -822, 316, 1218, 1313, 975, 389, +-692, -1427, -1299, -455, 686, 1273, 1202, 871, 6, -1119, -1522, -1069, 42, 996, 1161, 981, +527, -502, -1291, -1362, -589, 561, 1175, 1139, 925, 118, -928, -1407, -1095, -15, 932, 1171, +1115, 701, -295, -1104, -1312, -616, 532, 1158, 1258, 1111, 315, -701, -1352, -1224, -178, 827, +1151, 1173, 760, -165, -1022, -1406, -843, 296, 938, 1148, 1114, 426, -540, -1302, -1340, -384, +602, 1003, 1155, 820, 2, -846, -1361, -921, 66, 717, 1113, 1166, 546, -320, -1168, -1326, +-487, 404, 892, 1198, 906, 147, -750, -1411, -1118, -173, 532, 1039, 1184, 651, -240, -1215, +-1523, -770, 141, 749, 1161, 977, 275, -719, -1521, -1365, -485, 317, 977, 1173, 724, -132, +-1191, -1595, -1001, -144, 632, 1142, 1044, 452, -565, -1490, -1430, -719, 92, 840, 1126, 864, +94, -1039, -1561, -1137, -382, 438, 1057, 1094, 609, -417, -1364, -1442, -898, -139, 675, 1078, +983, 284, -826, -1440, -1226, -578, 325, 1012, 1181, 819, -195, -1193, -1419, -1015, -217, 661, +1108, 1126, 494, -652, -1325, -1272, -727, 155, 862, 1188, 992, 34, -959, -1277, -1052, -326, +491, 1064, 1287, 754, -399, -1126, -1237, -786, 35, 769, 1217, 1206, 336, -697, -1182, -1105, +-465, 346, 1013, 1362, 898, -235, -1002, -1227, -854, -124, 611, 1192, 1336, 515, -441, -1021, +-1082, -599, 169, 906, 1448, 1152, 126, -766, -1193, -995, -317, 475, 1217, 1448, 766, -208, +-923, -1105, -695, -31, 755, 1412, 1228, 294, -620, -1133, -988, -433, 283, 1123, 1450, 885, +-66, -825, -1073, -709, -133, 693, 1426, 1319, 422, -546, -1132, -1037, -550, 197, 1079, 1472, +957, 6, -872, -1101, -792, -234, 606, 1391, 1362, 599, -430, -1076, -1071, -672, 20, 942, +1413, 1078, 197, -735, -1062, -895, -409, 449, 1268, 1362, 815, -218, -978, -1118, -849, -199, +799, 1352, 1220, 394, -587, -1051, -993, -633, 223, 1073, 1373, 962, -37, -868, -1113, -999, +-398, 570, 1245, 1276, 546, -468, -1058, -1171, -901, -71, 852, 1336, 1054, 109, -769, -1140, +-1166, -625, 297, 1082, 1289, 704, -320, -922, -1162, -994, -272, 697, 1322, 1209, 270, -618, +-1114, -1197, -764, 142, 995, 1398, 894, -58, -788, -1192, -1128, -494, 471, 1251, 1315, 505, +-392, -1040, -1241, -914, -111, 764, 1343, 960, 77, -729, -1191, -1209, -621, 221, 1059, 1236, +592, -281, -953, -1286, -1045, -329, 621, 1226, 985, 219, -560, -1130, -1245, -843, -10, 914, +1207, 741, -18, -749, -1161, -1052, -458, 488, 1160, 1040, 389, -338, -969, -1117, -858, -70, +829, 1161, 762, 153, -583, -1020, -1048, -524, 403, 1160, 1066, 546, -182, -767, -1045, -864, +-176, 790, 1182, 931, 325, -391, -891, -1032, -646, 283, 1126, 1172, 726, -60, -670, -1052, +-976, -346, 750, 1268, 1185, 507, -267, -863, -1065, -830, 180, 1082, 1358, 982, 230, -521, +-927, -1033, -418, 660, 1303, 1279, 647, -163, -767, -1058, -873, 84, 1027, 1421, 1084, 316, +-465, -949, -1174, -594, 456, 1237, 1334, 780, -49, -687, -1156, -1064, -205, 829, 1374, 1199, +422, -321, -905, -1202, -757, 284, 1157, 1452, 973, 149, -581, -1119, -1140, -342, 723, 1427, +1344, 623, -146, -805, -1211, -885, 89, 1080, 1515, 1058, 258, -488, -1117, -1300, -646, 408, +1357, 1401, 768, -52, -730, -1274, -1076, -296, 828, 1427, 1199, 445, -316, -1096, -1387, -919, +152, 1193, 1440, 921, 143, -659, -1267, -1204, -509, 605, 1306, 1265, 636, -107, -977, -1344, +-1108, -155, 879, 1315, 937, 311, -539, -1152, -1291, -745, 286, 1116, 1134, 682, -93, -928, +-1401, -1288, -449, 681, 1174, 951, 376, -485, -1204, -1424, -950, 107, 1009, 1126, 790, 92, +-721, -1308, -1302, -561, 565, 1110, 1040, 504, -313, -1111, -1455, -1115, 20, 963, 1195, 846, +163, -684, -1301, -1461, -737, 395, 1065, 1075, 649, -162, -930, -1409, -1202, -199, 775, 1115, +931, 340, -471, -1109, -1334, -759, 275, 1004, 1119, 780, 8, -767, -1365, -1204, -275, 756, +1143, 1044, 434, -253, -950, -1278, -828, 218, 952, 1177, 856, 205, -553, -1182, -1197, -397, +574, 1121, 1167, 718, 16, -779, -1252, -892, 66, 875, 1226, 1085, 564, -252, -1010, -1167, +-432, 524, 1172, 1212, 887, 231, -587, -1185, -877, 18, 896, 1255, 1160, 701, -14, -915, +-1199, -628, 355, 1086, 1260, 947, 371, -517, -1190, -1025, -223, 712, 1209, 1171, 779, 78, +-872, -1247, -809, 200, 987, 1267, 1045, 580, -338, -1107, -1196, -458, 498, 1109, 1156, 952, +252, -717, -1309, -1041, -155, 738, 1084, 1011, 581, -310, -1122, -1252, -642, 287, 867, 977, +840, 230, -684, -1292, -1163, -376, 515, 925, 975, 642, -137, -1011, -1288, -838, 34, 638, +903, 847, 372, -537, -1203, -1231, -477, 338, 815, 921, 706, -75, -929, -1377, -993, -149, +550, 851, 885, 465, -330, -1085, -1253, -694, 88, 647, 908, 802, 132, -755, -1331, -1080, +-361, 370, 772, 913, 563, -174, -1021, -1224, -765, -11, 551, 933, 862, 337, -594, -1219, +-1121, -458, 228, 781, 972, 743, -1, -860, -1202, -863, -194, 479, 972, 1030, 528, -475, +-1210, -1204, -586, 103, 720, 995, 845, 104, -770, -1167, -841, -232, 412, 838, 1005, 579, +-314, -1067, -1097, -647, 37, 639, 1016, 974, 299, -676, -1126, -941, -410, 230, 781, 1088, +803, -107, -913, -1048, -646, -44, 516, 955, 1064, 477, -474, -990, -873, -358, 200, 745, +1112, 952, 65, -764, -1081, -738, -170, 447, 938, 1209, 647, -276, -926, -888, -455, 107, +591, 1101, 1047, 281, -617, -994, -751, -232, 295, 870, 1217, 825, -60, -806, -900, -544, +-21, 521, 1157, 1205, 555, -411, -906, -831, -339, 131, 809, 1206, 935, 26, -750, -972, +-553, -126, 400, 991, 1150, 572, -319, -935, -844, -406, 32, 670, 1156, 1010, 189, -683, +-991, -671, -317, 266, 919, 1224, 744, -189, -977, -952, -573, -85, 547, 1143, 1101, 404, +-563, -966, -781, -420, 69, 753, 1115, 894, 66, -691, -845, -635, -288, 408, 1037, 1131, +519, -420, -887, -797, -518, 0, 732, 1183, 976, 102, -701, -900, -710, -353, 326, 961, +1179, 655, -219, -770, -768, -644, -186, 465, 1032, 962, 240, -574, -801, -822, -572, 27, +782, 1176, 784, -157, -744, -902, -840, -432, 291, 965, 1033, 331, -422, -725, -804, -693, +-238, 543, 1071, 819, -9, -559, -812, -818, -555, 106, 797, 1046, 388, -323, -730, -856, +-821, -367, 360, 1040, 837, 71, -548, -838, -919, -666, -109, 703, 1052, 506, -221, -697, +-900, -867, -489, 216, 946, 842, 208, -423, -788, -933, -787, -281, 644, 1098, 699, -14, +-549, -884, -906, -649, 122, 920, 981, 378, -218, -665, -814, -760, -297, 581, 1088, 729, +97, -464, -797, -866, -664, 98, 946, 1009, 472, -124, -558, -765, -806, -365, 566, 1121, +830, 202, -395, -698, -851, -676, 46, 937, 1072, 622, -44, -497, -843, -962, -585, 437, +1101, 1003, 357, -270, -679, -911, -921, -166, 817, 1120, 684, -24, -507, -737, -915, -635, +335, 1043, 1020, 380, -228, -636, -929, -1016, -281, 695, 1198, 839, 133, -406, -750, -1095, +-809, 118, 1017, 1154, 641, -28, -489, -963, -1125, -467, 637, 1260, 1051, 329, -264, -734, +-1181, -1012, -71, 945, 1299, 874, 184, -335, -956, -1232, -688, 411, 1194, 1188, 537, -17, +-617, -1158, -1116, -242, 801, 1328, 925, 308, -246, -838, -1210, -733, 338, 1258, 1273, 677, +104, -426, -1015, -1075, -341, 741, 1350, 1096, 580, 74, -624, -1191, -908, 92, 1162, 1348, +881, 305, -265, -936, -1083, -492, 614, 1271, 1165, 690, 196, -522, -1051, -937, -12, 983, +1261, 895, 452, -111, -781, -1129, -663, 330, 1028, 1011, 698, 286, -366, -1017, -1116, -334, +689, 1147, 978, 620, 10, -710, -1158, -834, 104, 866, 936, 738, 348, -247, -964, -1132, +-478, 519, 945, 899, 551, 55, -666, -1178, -945, 40, 752, 895, 724, 449, -115, -878, +-1216, -617, 373, 875, 891, 628, 194, -518, -1101, -960, -27, 674, 845, 649, 412, -86, +-781, -1208, -669, 243, 833, 866, 641, 219, -431, -1155, -1076, -208, 580, 827, 718, 406, +-75, -854, -1352, -813, 214, 867, 928, 637, 158, -596, -1429, -1415, -445, 558, 940, 786, +390, -159, -1066, -1634, -1151, -26, 739, 937, 677, 246, -588, -1537, -1682, -690, 439, 991, +853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 98, 99, 100, 100, 97, 98, 100, 98, 100, 100, 98, 100, 99, 100, +99, 97, 100, 98, 100, 100, 98, 100, 100, 100, 97, 99, 100, 97, 100, 100, +100, 100, 100, 99, 99, 100, 98, 100, 99, 97, 100, 98, 100, 99, 100, 98, +98, 100, 97, 99, 102, 93, 109, 100, 75, 103, 122, 80, -128, 312, -521, -438, +-776, -1390, -1350, -3967, -626, -5179, -1159, -306, 3409, 5465, -8796, 1709, -20008, 7511, -4158, 1927, +25410, -5049, 32098, -2531, 13660, 9293, -5308, 15242, -14562, 17422, -873, 11746, 22893, 7594, 22808, -8472, +2319, -10768, -11293, 4229, -16464, 11477, -12868, -4142, -10074, -27429, 2009, -28223, 4098, -3627, 534, 13898, +-15509, 8726, -20483, -399, -5410, -14593, 11810, -13850, 15830, -7054, -2204, -2773, -21637, 11481, -14961, 20840, +9774, 9489, 24599, -3799, 24184, -3730, 7036, 5594, -8121, 17016, -7328, 25905, 9681, 14287, 20159, -13896, +13719, -24884, 1842, -8824, -8053, 12275, -24181, 8806, -29429, -7994, -11675, -23590, 9870, -17825, 19867, -5227, +-1542, 2537, -23026, 9996, -21384, 5437, -4332, -4725, 13681, -13391, 13187, -20961, -3653, -1364, -7967, 26986, +-5413, 28726, 5573, 10166, 18712, -9719, 21862, -14002, 11543, 2993, 536, 27007, -369, 29595, -440, 4704, +12, -21853, 7394, -21098, 10314, -8722, -9659, -1595, -29369, 739, -27328, -5475, -5291, -7430, 17267, -10199, +10002, -13035, -7419, -687, -16584, 8557, -13145, 7007, 1762, -2167, 7089, -20653, 3958, -11567, 5814, 15093, +2109, 27485, 448, 20132, 6003, 2002, 13331, -10943, 14964, -6098, 13710, 14030, 8984, 24688, -2458, 10755, +-12285, -9283, -2807, -14530, 8649, -14524, -1340, -13416, -20599, -4589, -27813, 1198, -15305, 4683, 7302, -4720, +10705, -19265, 3274, -12282, -5096, 1540, -12155, 12727, -7879, 9473, -3886, -11354, 1995, -14787, 16508, 1064, +17003, 15538, 6337, 21016, -2728, 15343, -1653, 2059, 6978, -3655, 17989, 4569, 20277, 13748, 3376, 7515, +-15476, -1515, -12989, -4194, 802, -12713, -593, -21103, -10335, -17070, -16798, -4250, -14512, 9498, -1041, 5738, +26, -11028, 912, -14379, 1521, -6367, -3307, 5636, -4329, 10432, -8451, -2625, -5740, -6436, 12217, 2018, +20283, 9681, 12475, 14775, 1295, 14049, -3746, 6569, 1826, 1280, 14601, 5742, 21896, 7996, 8855, 1026, +-12155, -2524, -14436, 183, -6308, -7047, -5909, -21029, -8966, -20662, -11427, -9558, -9366, 7451, -1757, 9018, +-4369, -5781, -2901, -11790, 2368, -8989, 1462, 526, -44, 8135, -7769, 992, -9469, -812, 8426, 5295, +19348, 7637, 16305, 9581, 5353, 11078, -2789, 7854, -1252, 5629, 10987, 7934, 20891, 6098, 10306, -2813, +-9194, -4763, -13869, 1403, -9073, -5268, -10173, -19477, -9692, -21557, -8937, -11906, -6299, 5363, -514, 9813, +-6414, -2689, -4940, -9679, 2053, -9067, 3108, -1826, 2259, 6968, -6327, 1966, -10309, 2878, 6255, 6710, +19426, 6024, 18087, 6710, 8087, 8981, -2938, 9663, -4014, 8889, 8365, 9606, 20001, 3588, 12854, -7228, +-6545, -6680, -12982, 2921, -13322, -1950, -15389, -17074, -10755, -22847, -4783, -16659, -1068, 2206, 939, 10928, +-9283, 2605, -10272, -4465, 458, -10023, 6448, -6567, 8276, 1978, -2694, 3079, -12556, 9134, 41, 12929, +14951, 6927, 20476, 894, 14558, 2387, 1975, 7580, -5726, 14295, 1241, 16294, 14155, 5755, 12687, -12703, +448, -14038, -6410, -1258, -13628, 167, -22716, -9451, -18224, -18025, -5302, -19116, 5368, -5316, 8728, 5701, +-7378, 5363, -15308, 3880, -7732, -3380, 3987, -7982, 13259, -5038, 6273, -3304, -7002, 9489, -3828, 20187, +6470, 14390, 14757, 1847, 17973, -5326, 10875, -870, 713, 11637, -1096, 22843, 4272, 14541, 3798, -8912, +695, -18738, 2213, -11505, -5663, -6324, -22495, -6263, -26028, -7698, -14390, -12174, 3566, -7531, 15788, -3847, +3197, -1988, -11310, 5534, -13030, 5746, -5978, 965, 7957, -4429, 11863, -10658, 3943, 395, 3379, 18304, +2972, 21503, 4748, 11581, 9560, -1453, 12071, -7019, 9532, 1960, 7310, 17665, 3667, 18296, -5365, 210, +-7749, -13115, 865, -14998, 1018, -17119, -14040, -13119, -23561, -5068, -20571, -2401, -5835, 541, 12034, -4250, +9052, -10381, -868, -2711, -7347, 5231, -9397, 7704, -826, 5261, 5969, -7531, 7156, -4940, 11954, 9464, +9735, 17977, 2885, 16831, 1424, 6764, 4812, -3240, 9935, -2642, 14932, 8510, 10574, 12485, -5029, 2972, +-14718, -4392, -7016, -9298, -2352, -20100, -8650, -21936, -14729, -11172, -17195, -1109, -10033, 8204, 4027, 3224, +5256, -9817, 3167, -8370, 590, -1814, -4785, 6812, -2768, 10747, -347, 592, 2688, -2177, 13662, 4781, +15937, 10822, 8310, 13573, 545, 10401, -1414, 3295, 4051, 1311, 13922, 5224, 15328, 5286, 122, -1949, +-12928, -2694, -10947, -4007, -9373, -16125, -11826, -22338, -11298, -16280, -10750, -5791, -6601, 8242, 2145, 8005, +-112, -4021, 359, -6890, 1999, -4943, 200, 1989, 1054, 9551, -303, 4387, -621, 2994, 9808, 6826, +16068, 7923, 11850, 8868, 4108, 7640, -1348, 5213, 714, 4962, 10171, 7380, 13961, 2974, 1878, -5730, +-9405, -4771, -9939, -3899, -12659, -13489, -15621, -20153, -11996, -16314, -8535, -8224, -3074, 6411, 3382, 8626, +-1068, -1041, -1789, -4623, 1336, -4819, 1529, 146, 3507, 7889, 1790, 5432, -1142, 5247, 7990, 8588, +14505, 7660, 12658, 6576, 5663, 5805, -509, 4901, -409, 6662, 8121, 8494, 12251, 1906, 1839, -7301, +-7492, -6144, -9165, -4482, -14126, -13030, -17869, -18501, -12584, -16061, -7199, -9089, -929, 5120, 4727, 9223, +-1737, 1077, -3190, -2853, 1038, -4684, 2615, -1644, 5703, 7114, 3328, 6254, -1404, 7730, 5871, 10251, +13304, 7184, 13302, 4248, 7756, 3425, 429, 4650, -1566, 8682, 5475, 10186, 9774, 1111, 2460, -9498, +-5048, -8392, -7156, -5783, -15864, -11625, -21108, -15597, -14375, -14640, -6166, -10682, 2405, 2479, 7725, 8389, +-1617, 3358, -5765, 1088, -1406, -3129, 2494, -2795, 8877, 4019, 7284, 4926, 28, 9163, 3313, 13750, +9110, 9490, 11955, 2920, 10005, -613, 4040, 1219, 119, 9099, 2626, 13055, 5010, 3844, -361, -9639, +-3026, -11170, -3363, -10338, -13924, -13298, -22640, -12125, -18304, -9924, -9065, -8588, 3479, 239, 12534, 4106, +2406, 1970, -5270, 3779, -5321, 1533, -1212, -230, 8649, 2728, 11624, 1207, 5394, 6183, 4589, 14631, +5502, 13816, 6575, 6488, 7684, -1571, 6537, -3157, 5087, 4273, 4782, 12562, 1786, 6898, -5809, -5170, +-5922, -9697, -2293, -14625, -9965, -18755, -18915, -13784, -18549, -6504, -13130, -3272, 0, 3139, 12920, 1776, +7533, -2464, -453, 1189, -4424, 3551, -4898, 4786, 3963, 6782, 10970, 1261, 9060, 1777, 9776, 10270, +7102, 13820, 3471, 10403, 1988, 2759, 3560, -2951, 6872, 112, 9450, 7245, 4016, 4809, -7529, -1947, +-9816, -4969, -6493, -13311, -10149, -22172, -14676, -18222, -13917, -8627, -12382, -476, -3555, 8368, 8908, 5304, +7312, -3678, 3420, -2984, 263, 565, -3493, 5507, 1520, 11644, 7114, 5750, 7529, 2227, 11835, 6067, +11490, 9211, 5528, 9278, 191, 5766, -1156, 1050, 3696, 913, 10355, 3455, 6813, 0, -4576, -3484, +-9955, -2635, -10314, -9834, -14644, -20375, -14767, -19792, -10195, -12037, -8101, -2638, -2264, 10162, 6420, 9756, +3963, -531, 2620, -3094, 2876, -2861, -22, 2866, 3607, 11989, 6147, 9533, 4588, 5628, 9817, 6182, +12319, 6013, 8367, 5722, 2005, 4545, -2313, 3056, 608, 3929, 7380, 3482, 6473, -2311, -2449, -6362, +-7039, -3937, -10656, -9238, -17706, -17923, -17293, -17585, -10089, -12398, -5664, -4708, 719, 9048, 7612, 10828, +2581, 2222, 1079, -1135, 2092, -3117, 1472, 1142, 5880, 10661, 7943, 10167, 4158, 7643, 7674, 7546, +10768, 5712, 8611, 3788, 3400, 2266, -1528, 2837, -257, 4793, 5082, 4312, 4656, -2775, -2516, -7017, +-5173, -5372, -9916, -10479, -18646, -17286, -18314, -15818, -10676, -11387, -5037, -5016, 2682, 8443, 8980, 10680, +2980, 3643, 385, -70, 1545, -2592, 1640, 709, 6782, 10302, 9105, 10394, 4489, 8179, 6899, 7986, +10008, 5577, 8404, 3153, 3500, 1557, -1191, 2604, -622, 4956, 4520, 4318, 4043, -3032, -2445, -7144, +-4791, -5643, -9876, -10719, -18848, -17142, -18466, -15568, -10696, -11300, -4953, -5030, 2799, 8411, 9005, 10680, +2984, 3701, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 5428, -26287, 17453, 8096, 2243, 14181, -8071, -26815, 11821, 14173, -9703, -488, +-552, -23918, 25570, 16129, -9471, 10683, 6705, 2572, -2514, -5818, 6597, 10607, -24849, 433, -26441, -19210, +29134, 9711, 11509, 4840, -17567, -28321, 17780, -15076, 19840, 26512, -1729, 13055, -7237, -16166, -10380, -13065, +-16232, -1506, 7394, 16979, 8004, -3475, 443, 2409, 11610, 13420, -4585, -29247, 6717, 2784, -11395, -9466, +3698, -11656, 5318, 15267, -17060, 3385, 10225, 25737, 6534, 8491, 15787, -2011, -14095, -27142, -19273, -12254, +29134, 16771, 8648, 7750, -28890, -22841, 9801, -11627, 25942, 20830, 2909, 12215, -9048, -17252, -10130, -15725, +-13562, -935, 7082, 17176, 5436, -3211, 341, 649, 12254, 13283, -9651, -28912, 7944, -2559, -13160, -6284, +856, -10965, 8418, 11002, -15343, 2210, 16800, 22458, 3447, 15076, 6708, 1231, -19731, -22699, -19559, -11932, +29134, 10022, 12602, 6374, -29247, -17816, 6347, -7576, 27816, 17250, 4550, 11383, -12368, -15760, -10803, -16272, +-12987, -468, 8916, 15041, 5732, -1581, -300, 80, 12551, 14284, -16131, -21255, 7105, -5673, -14881, -1459, +-771, -11625, 15465, 3872, -11119, 1138, 23609, 14960, 5952, 14914, 3294, 2541, -26201, -13674, -26550, -4365, +29134, 7372, 14790, 1958, -29247, -15768, 6266, -5565, 29134, 13306, 6917, 10255, -14957, -12335, -11862, -15789, +-10673, -39, 10802, 14037, 4283, 131, -1488, -896, 14682, 11053, -17257, -17016, 7760, -11712, -13132, 478, +-3472, -7964, 14754, 4117, -13870, 6669, 23674, 9553, 11615, 8677, 7247, -2497, -24637, -10153, -29247, 3711, +29134, 6055, 17071, -1110, -29247, -12293, 3156, -1593, 29134, 10175, 8171, 7347, -16112, -11804, -11664, -16816, +-8681, 518, 11226, 13078, 3433, 1566, -2175, -2443, 16253, 7694, -19207, -12150, 6532, -16239, -11923, 4614, +-8238, -1830, 13903, 2736, -13769, 11290, 22138, 6679, 14768, 3679, 11127, -9774, -20394, -10113, -29247, 10643, +29134, 6871, 16684, -3227, -29247, -6437, -869, 4982, 29134, 8293, 10388, 3825, -15753, -11020, -12372, -15960, +-7902, 1462, 12458, 10334, 4654, 1207, -3511, -1772, 16024, 6048, -21547, -4786, 2290, -18401, -10626, 5552, +-9021, -634, 17335, -2683, -10684, 15163, 18392, 7554, 14119, 1986, 13225, -16240, -14056, -12169, -29247, 16205, +26295, 8089, 16042, -6194, -29247, -4085, -3289, 9756, 27410, 6944, 11099, 948, -16289, -9365, -13782, -14995, +-6244, 1726, 13518, 9101, 3936, 3961, -5636, -1212, 16810, 2114, -20263, -2088, 1126, -23597, -5121, 3770, +-8738, 2208, 16351, -4294, -10391, 20210, 12048, 10890, 9675, 3467, 11548, -20598, -8013, -17090, -25411, 18061, +24647, 7194, 18166, -12189, -29247, -2366, -5335, 16588, 23213, 8383, 10454, -967, -15991, -8975, -13367, -15231, +-3870, 2422, 13899, 7810, 5281, 3095, -5881, -835, 16999, -1080, -19206, 3516, -3961, -24178, -3591, 4300, +-10836, 6735, 15012, -7996, -5116, 19995, 9939, 12211, 5852, 6731, 6655, -21243, -4696, -19763, -21727, 19943, +20920, 7900, 17696, -16611, -29247, -1195, -6666, 21222, 20134, 8786, 10065, -3351, -15607, -8077, -14449, -13934, +-2555, 3142, 15109, 4752, 7940, 2459, -6519, 594, 15799, -2948, -19109, 8496, -10457, -23178, -2075, 3669, +-10173, 8281, 15891, -13368, 2293, 17437, 10263, 11484, 5025, 8389, 1820, -19219, -3638, -21080, -18236, 23194, +16338, 10799, 16117, -20531, -29247, -888, -6293, 24884, 17653, 8113, 9875, -6458, -14399, -8191, -15591, -12161, +-2052, 3679, 14927, 3470, 8491, 2407, -7620, 807, 15707, -7765, -14387, 9458, -13467, -23757, -269, 2223, +-9999, 12522, 11308, -12426, 5647, 16874, 9527, 10885, 5597, 7297, -1213, -18217, -2257, -22520, -13081, 22548, +14105, 11697, 15354, -25541, -26119, -3573, -4077, 27819, 13990, 9346, 8563, -8218, -13380, -8486, -15594, -10841, +-1835, 5549, 13288, 3202, 9418, 819, -6380, 29, 15490, -11305, -10790, 9295, -16899, -23162, 1150, 2382, +-10939, 18091, 5383, -9983, 8531, 15663, 9513, 10219, 5595, 7302, -4524, -16376, -694, -25080, -6580, 20768, +12428, 13801, 12784, -28390, -21616, -5138, -2801, 29134, 9783, 11416, 6650, -10150, -11217, -9873, -15185, -9657, +-1623, 7246, 12080, 2541, 11038, 102, -7319, 1847, 12471, -12199, -7671, 11086, -21564, -20721, 1777, 122, +-7684, 17909, 3826, -10397, 12509, 12674, 9830, 8926, 4906, 6895, -8119, -13203, -2499, -23590, -2915, 19917, +9619, 16464, 8410, -29247, -16925, -8856, 1903, 29134, 8188, 12120, 4636, -10427, -11166, -9385, -15430, -8492, +-478, 8038, 10647, 3568, 10022, 518, -7735, 2189, 11600, -15368, -1574, 7611, -22044, -21427, 5731, -3384, +-3542, 19491, -1243, -5181, 11725, 13372, 8917, 8062, 5258, 5577, -10306, -10667, -3250, -23615, 2029, 16674, +9414, 17172, 5008, -29247, -12262, -12197, 5932, 28915, 6616, 13113, 2093, -10315, -10667, -10132, -14420, -7987, +631, 8984, 8972, 4093, 10632, -167, -7621, 1982, 9961, -17362, 3262, 5355, -23767, -19988, 5212, -4432, +-1864, 20433, -5315, -1702, 11995, 12639, 8113, 7548, 5013, 4145, -11649, -8336, -4654, -21875, 6496, 13029, +10166, 17807, 214, -29247, -9887, -14078, 10228, 27768, 6037, 13234, 911, -10993, -9512, -10643, -14313, -6331, +894, 9387, 8458, 3130, 11899, -1650, -8082, 3700, 5596, -15224, 4823, 4845, -27418, -15769, 3919, -5212, +3339, 16788, -4031, -990, 13838, 11303, 8059, 6341, 5643, 2113, -12358, -5975, -6395, -18722, 8415, 11122, +9537, 19261, -5440, -27360, -8173, -16148, 15018, 24084, 6723, 12460, -487, -11043, -9557, -10235, -14688, -4779, +1444, 9815, 6553, 4595, 10951, -1430, -8591, 3994, 2750, -15151, 8994, 995, -26922, -15365, 4719, -7042, +6860, 15521, -5854, 2308, 13317, 10488, 7845, 4956, 5161, 1281, -13087, -4095, -7306, -16092, 11434, 7604, +11346, 17740, -8766, -26075, -6321, -17704, 19166, 22315, 5926, 13506, -3198, -10086, -9405, -10819, -13533, -4320, +2497, 10351, 4408, 5960, 11410, -3971, -6959, 2975, 656, -14537, 12529, -3286, -26663, -13441, 3119, -5489, +7514, 15994, -7939, 5548, 12690, 9628, 7361, 3966, 4356, 318, -13222, -2954, -7353, -13597, 13462, 4382, +12616, 16509, -12783, -21162, -8065, -15578, 20588, 19901, 6323, 12714, -4199, -10606, -8035, -12132, -12050, -3705, +3661, 9866, 3947, 6144, 11615, -4422, -7107, 3535, -3422, -10866, 12517, -4667, -27651, -10887, 1382, -4989, +10643, 12354, -5934, 5973, 13441, 8005, 7253, 2741, 3874, -703, -13489, -984, -8930, -9371, 13445, 2940, +13177, 15478, -17301, -16537, -9831, -14532, 23843, 16332, 8027, 11240, -5226, -10084, -8183, -12067, -11487, -2827, +4689, 9343, 2793, 8126, 10345, -4988, -6558, 2806, -6053, -7850, 13549, -8305, -25825, -10331, 987, -4756, +13125, 10253, -5777, 8551, 12353, 7374, 7145, 1066, 4071, -2380, -12716, -111, -9443, -5199, 13032, 680, +14970, 12204, -18625, -13281, -10391, -12972, 25009, 13604, 8437, 10919, -7413, -8789, -8499, -12497, -10136, -2430, +5632, 8972, 1515, 9656, 9659, -6188, -4770, 461, -7167, -5569, 14252, -11710, -24370, -8899, -1492, -1446, +12359, 9988, -5969, 10771, 11325, 6720, 6870, -225, 3972, -4009, -11326, -29, -8842, -2443, 13096, -1342, +16975, 8608, -20173, -9396, -13477, -8601, 24222, 12881, 8575, 9980, -8141, -8670, -7882, -13166, -8583, -2136, +7187, 7219, 2440, 9683, 9662, -6935, -4559, 92, -10620, 118, 11181, -11776, -24625, -6574, -3641, -55, +14567, 5827, -2468, 10364, 11491, 5383, 6657, -1410, 3442, -5198, -10383, 474, -9154, 2307, 10335, -1195, +16724, 6069, -21521, -5131, -15816, -5149, 23687, 10164, 10343, 7491, -8251, -8179, -8468, -12716, -7783, -1474, +8262, 6015, 2196, 11535, 7521, -6363, -4089, -1764, -11200, 2963, 10228, -14453, -21839, -7482, -3351, 1149, +15337, 4275, -1261, 11847, 10149, 5110, 6037, -2443, 3118, -6562, -8852, 162, -8226, 5305, 8380, -1380, +17583, 1743, -20428, -3782, -17025, -1442, 22267, 9555, 10621, 6492, -9381, -7063, -8966, -12840, -6376, -1085, +8889, 5340, 2165, 12344, 6956, -7275, -2547, -5328, -10297, 4878, 9270, -16683, -19412, -7091, -5711, 5131, +12801, 4718, -645, 13259, 8883, 5073, 5107, -3067, 2589, -7928, -6844, -982, -6144, 7970, 6781, -1643, +18359, -2602, -19052, -1231, -19160, 3349, 19489, 9165, 10967, 4781, -9261, -7251, -8654, -13109, -5181, -404, +9755, 3479, 4006, 12061, 6191, -7098, -2327, -7055, -11025, 9308, 4688, -15939, -19297, -6222, -6927, 7591, +13110, 1895, 3231, 12158, 8795, 4479, 4201, -3662, 1499, -8536, -5749, -1380, -4550, 10630, 3787, 24, +17076, -5448, -17832, -482, -19253, 6230, 18196, 8464, 11867, 2688, -8988, -6741, -9701, -11995, -4805, 569, +10289, 2304, 4753, 13013, 4358, -5981, -2886, -8976, -10745, 12073, 1859, -16689, -16344, -7737, -6134, 8224, +13161, 684, 5433, 12318, 8005, 4074, 3566, -4292, 360, -8730, -4568, -1950, -2394, 12903, 1281, 1161, +16432, -9996, -13904, -1861, -17820, 8692, 15383, 8858, 11254, 1661, -9602, -5947, -10656, -11325, -4071, 1546, +9884, 2085, 5278, 13127, 3704, -6575, -1713, -12941, -7036, 11666, 465, -17932, -14225, -8519, -6573, 12111, +9564, 2655, 5992, 12972, 6853, 4063, 2287, -4377, -975, -9018, -2870, -3448, 1644, 12670, 175, 1849, +15246, -13125, -11012, -2179, -17465, 12392, 11802, 10207, 10553, 32, -8838, -6644, -10464, -11260, -3091, 2275, +9895, 794, 7368, 12057, 3108, -5607, -2855, -14694, -5785, 13666, -3768, -16098, -13156, -9066, -6429, 13272, +8706, 1646, 8922, 11684, 6501, 3825, 814, -4177, -2904, -8257, -2417, -3743, 4444, 13412, -2120, 3989, +12287, -14939, -8583, -3001, -15432, 13497, 10213, 9714, 10993, -2149, -7946, -6672, -11161, -9871, -2857, 3594, +9359, 585, 8179, 12378, 1454, -4430, -4072, -16278, -3096, 13812, -6422, -15952, -11029, -11175, -3936, 13671, +7775, 2132, 10593, 11135, 5915, 3426, -184, -4417, -4554, -7274, -2256, -3673, 7531, 13115, -3662, 5381, +9469, -16955, -4640, -6162, -11154, 13335, 8466, 10441, 9676, -2766, -8242, -6317, -11949, -8766, -2573, 5016, +7875, 1428, 8655, 11745, 1342, -4302, -4213, -19456, 1359, 11573, -7490, -15388, -9300, -11974, -3746, 15828, +4356, 4681, 10839, 11004, 5212, 3033, -1083, -4713, -5971, -6400, -1730, -3988, 11525, 11148, -3296, 5567, +7429, -18710, -1527, -7755, -8287, 13872, 6065, 11930, 7934, -3240, -7586, -6962, -11779, -7959, -1991, 5941, +7203, 1012, 10514, 10030, 1324, -4093, -6014, -19798, 3451, 11354, -11010, -12975, -9705, -12202, -2184, 16080, +3589, 5122, 12880, 9554, 5115, 2358, -2247, -4801, -7893, -4879, -2038, -3307, 14755, 9719, -4012, 7045, +2815, -17444, -139, -9002, -4327, 13039, 4871, 12260, 7344, -4682, -6610, -7401, -12015, -6834, -1331, 6597, +6433, 1823, 10607, 10036, 57, -2358, -9092, -19382, 5899, 9379, -12313, -11655, -8037, -14607, 1277, 14103, +3408, 6263, 13644, 8751, 4774, 1492, -3025, -5144, -9610, -3057, -2845, -1697, 17052, 8008, -3892, 7591, +-392, -17233, 1996, -10741, -378, 11188, 4400, 12471, 5923, -4708, -6715, -7543, -11997, -5913, -882, 7720, +4458, 3656, 10415, 8995, 538, -3174, -9960, -20904, 10593, 5200, -12029, -11372, -7244, -14779, 2253, 15759, +211, 10057, 12910, 8613, 4347, 710, -3582, -5920, -10379, -1964, -2811, -668, 20316, 5185, -2549, 6698, +-3600, -15695, 2659, -10958, 3073, 10125, 3019, 13406, 3980, -4808, -6127, -8665, -11179, -5560, 59, 7941, +3845, 3933, 11555, 7197, 872, -2938, -12508, -19565, 11866, 3572, -14049, -7792, -8874, -13806, 3184, 14641, +410, 10586, 14148, 7127, 4376, -227, -4123, -6655, -11206, -508, -3488, 1697, 21801, 3106, -1730, 6553, +-7336, -12795, 1891, -10291, 5906, 7659, 3698, 12804, 3194, -5264, -5632, -9086, -10964, -4524, 881, 7862, +3383, 5060, 11190, 6908, 547, -2376, -15893, -16727, 12116, 1826, -14680, -6614, -8554, -14404, 6495, 11795, +1746, 11429, 14526, 6225, 4259, -1476, -4385, -7673, -11901, 1029, -4653, 4813, 22028, 1890, -1180, 5398, +-10600, -10461, 1894, -10280, 9879, 4835, 3812, 12509, 1434, -4700, -6067, -9265, -10554, -3826, 1644, 8160, +2019, 7171, 10387, 6044, 1235, -3478, -17024, -16067, 14954, -3023, -12821, -5404, -9005, -13651, 6983, 11677, +323, 14518, 13202, 6120, 3893, -2581, -4494, -8931, -11536, 1348, -4395, 6864, 23147, -910, 979, 2895, +-12259, -8022, 318, -7991, 10445, 4110, 3099, 13000, -202, -4501, -5574, -10463, -9122, -3825, 3005, 7376, +2222, 7596, 10753, 4499, 2216, -4375, -19281, -13094, 14050, -4501, -13287, -3599, -10311, -11339, 7172, 10408, +1401, 15266, 13301, 5336, 3560, -3443, -4796, -10151, -11002, 1607, -4210, 9687, 22697, -1653, 1660, 1206, +-15059, -3961, -2483, -4218, 11387, 2175, 3920, 11014, -314, -4916, -5195, -11011, -8179, -3371, 4310, 6369, +2512, 8826, 9664, 4578, 1777, -4527, -21874, -9213, 12755, -6284, -12707, -2019, -10811, -11285, 9482, 7005, +3662, 15484, 13210, 4615, 3200, -4434, -5191, -11094, -10765, 2229, -4594, 13317, 21048, -2110, 2243, -1295, +-15926, -1827, -3621, -2479, 12716, -89, 5145, 10086, -1399, -3934, -5999, -10815, -7595, -2593, 4927, 6250, +1930, 10565, 8566, 3867, 2894, -6744, -21881, -7686, 12495, -9251, -10308, -2610, -10588, -8855, 8209, 7308, +3587, 17288, 12080, 4588, 2644, -5287, -5368, -12288, -9644, 1912, -3495, 15746, 19969, -2724, 3681, -5232, +-15297, -345, -5085, 1559, 12097, -735, 4494, 9382, -2793, -3541, -6074, -11460, -6376, -2290, 5867, 5061, +3091, 10418, 8581, 2761, 3811, -9042, -22273, -4616, 10356, -10245, -9990, -414, -13013, -5596, 7200, 6048, +5565, 17167, 12029, 4004, 2059, -5914, -6003, -13105, -8590, 1204, -1866, 17859, 18548, -2717, 3887, -7933, +-15362, 2257, -7354, 5237, 11023, -1161, 4998, 7909, -2428, -3924, -6058, -11469, -5614, -1806, 6888, 3535, +4184, 11064, 7086, 3173, 3203, -9634, -23908, -699, 6559, -10301, -8752, -992, -11502, -5379, 8279, 3229, +8639, 16409, 11762, 3782, 1083, -6182, -7098, -13344, -8120, 1067, -741, 20436, 15737, -1381, 3203, -10821, +-13925, 2555, -7597, 8522, 10485, -2497, 5632, 5870, -2906, -3264, -6997, -10892, -5082, -860, 7009, 3484, +4135, 12410, 5681, 3166, 3823, -12684, -21805, -245, 6198, -12808, -5690, -2158, -11093, -3176, 6265, 4312, +8650, 17677, 10482, 3954, 132, -6477, -7876, -13831, -6848, -65, 1848, 21400, 14261, -1096, 3093, -14719, +-11364, 2311, -7714, 11362, 8424, -1458, 4585, 5376, -3301, -3212, -7138, -11026, -4119, -271, 7201, 2620, +5614, 11767, 5534, 2521, 4287, -15137, -20181, 1126, 2884, -11932, -5246, -1260, -11541, 84, 3640, 4383, +10637, 16735, 10453, 3505, -802, -6649, -8813, -13911, -5801, -993, 4600, 22113, 12366, -14, 2018, -17207, +-9090, 2107, -7834, 14853, 6735, -1960, 5029, 3121, -2857, -3370, -7538, -10332, -3696, 771, 7414, 1689, +7180, 11630, 4333, 3358, 3276, -16450, -19709, 3658, -1177, -10543, -4596, -2132, -10105, 175, 3967, 2849, +13327, 15483, 10396, 3185, -1728, -6715, -10197, -13092, -5823, -929, 6726, 22942, 10025, 1830, -337, -19276, +-6647, 711, -5439, 15120, 6637, -2119, 4640, 2160, -2939, -2916, -8530, -9052, -3642, 2148, 6671, 2170, +7391, 12134, 3108, 3715, 2810, -18613, -16667, 2625, -2270, -11404, -2012, -3697, -7903, 1349, 1483, 4246, +13627, 15497, 9469, 3143, -2824, -6793, -11444, -12386, -5477, -1438, 9901, 22157, 9242, 2171, -1561, -21859, +-2808, -1580, -3592, 17247, 4028, -675, 3018, 1525, -3301, -2975, -8666, -8720, -2915, 3040, 6144, 2050, +8821, 11016, 3113, 3374, 2628, -21034, -13534, 1615, -4156, -10214, -1862, -3607, -7607, 3431, -922, 5707, +14456, 14943, 9167, 2928, -3755, -6773, -12518, -11669, -4933, -2054, 13515, 20630, 8666, 3298, -4429, -22291, +-1606, -1799, -2072, 18454, 2811, 47, 2299, -115, -2088, -3998, -8522, -8074, -2382, 3756, 5959, 1688, +10065, 10441, 2072, 4456, 218, -20768, -12388, 1949, -7529, -7920, -1785, -4412, -4585, 2235, -977, 5116, +16377, 13319, 9210, 2425, -4710, -6773, -13746, -10333, -5332, -1280, 15807, 19895, 7539, 4538, -7728, -22117, +994, -4136, 1642, 17620, 2647, -309, 1928, -1086, -2470, -3326, -9477, -6614, -2320, 5090, 4623, 3057, +10098, 10242, 1551, 4688, -840, -22077, -8950, -640, -7795, -7627, -445, -5595, -2455, 2825, -3049, 7490, +16136, 13107, 8832, 1919, -5138, -7322, -14414, -9317, -5672, -617, 18260, 18064, 7472, 4661, -10216, -22587, +2961, -5853, 4759, 16980, 2176, 750, -358, -1055, -2503, -3972, -9231, -6080, -1870, 6021, 3564, 3669, +11138, 8693, 2061, 4102, -1674, -23157, -5794, -3049, -8688, -5851, -1385, -4342, -1793, 3792, -5146, 9170, +16258, 12281, 8567, 1381, -5730, -7858, -14860, -8462, -5739, -26, 20923, 15634, 8326, 4226, -13118, -20820, +3295, -5758, 6633, 16832, 1216, 1282, -1346, -2171, -1760, -4834, -8782, -5483, -1052, 6164, 3516, 3801, +12059, 7717, 1684, 4795, -4697, -21057, -5753, -3707, -10930, -3264, -2045, -4726, 1184, 1663, -4276, 9109, +17338, 10909, 8645, 655, -6164, -8326, -15490, -7154, -6625, 1791, 22067, 14283, 8122, 4649, -16735, -18513, +3141, -6011, 9937, 14912, 2263, 1132, -2486, -2745, -1562, -5141, -8769, -4530, -505, 6677, 2491, 5612, +11381, 7522, 1431, 4863, -6622, -20390, -3369, -7216, -9383, -3381, -1446, -4984, 3500, 646, -5125, 10983, +16437, 10684, 8117, 0, -6534, -9018, -15667, -6237, -7112, 3514, 23141, 12252, 9132, 3101, -18721, -17080, +3635, -6083, 12040, 14001, 1626, 1777, -4325, -2489, -1861, -5563, -8078, -4188, 426, 6952, 1795, 6744, +11800, 5953, 2505, 3632, -7530, -19853, -1504, -10378, -9421, -1445, -2889, -3190, 3829, 1254, -6641, 13051, +15769, 10164, 7914, -702, -6666, -10084, -14862, -6118, -6741, 4997, 24186, 10223, 10276, 1656, -20894, -14166, +1713, -3892, 12984, 13063, 2351, 1566, -5546, -3179, -1275, -6759, -7128, -3943, 1442, 6326, 2200, 7026, +12014, 4996, 2525, 3488, -10207, -16835, -2760, -10883, -10060, 506, -4347, -1717, 5226, -1012, -4847, 12537, +16353, 8952, 7879, -1533, -6729, -10964, -14387, -5457, -7064, 7604, 23556, 9581, 10433, 456, -23188, -11204, +535, -2462, 14781, 10927, 3678, 518, -6161, -3348, -1533, -6707, -6821, -3108, 2153, 6277, 1730, 8833, +10838, 4828, 2558, 2827, -11882, -14555, -2756, -13745, -8668, 543, -3884, -1616, 7468, -2535, -4615, 13720, +15379, 8743, 7300, -2127, -7035, -11745, -13738, -5067, -7187, 10091, 22649, 8633, 11236, -2335, -23286, -9846, +-212, -731, 15416, 10048, 3867, 875, -8272, -2842, -2039, -7179, -5977, -2789, 2970, 5953, 1850, 9658, +10702, 3653, 3747, 763, -11877, -13464, -2433, -16330, -6685, 997, -5161, 1366, 6216, -2257, -4607, 14917, +14361, 8714, 6586, -2560, -7172, -12596, -12524, -5430, -6061, 11601, 22195, 7577, 12176, -5090, -23720, -7487, +-2552, 2957, 14410, 9880, 4072, 262, -8963, -3444, -1636, -8033, -4820, -2721, 4204, 4620, 3085, 9799, +10170, 3195, 3713, -53, -13733, -9752, -5213, -16433, -7059, 2357, -5865, 2563, 7853, -4232, -2802, 14278, +14395, 7996, 6103, -2912, -7633, -13130, -11524, -5559, -5311, 13821, 20266, 8023, 11606, -7101, -23761, -5676, +-3489, 5121, 14658, 8450, 5616, -1417, -9013, -3720, -2292, -7597, -4529, -1811, 4694, 4361, 3198, 11303, +8682, 3441, 3679, -1267, -14122, -7777, -6481, -17983, -4800, 1519, -5368, 3655, 7838, -5322, -1445, 14256, +13555, 7777, 5264, -3233, -8159, -13464, -10638, -5704, -4316, 15634, 18329, 8351, 11367, -10141, -22009, -5878, +-3590, 7430, 14099, 7790, 6467, -1973, -10612, -2950, -3159, -7404, -3918, -949, 4792, 4235, 3773, 11761, +8212, 2764, 4622, -4064, -12532, -7207, -7277, -19426, -3324, 1557, -5735, 6299, 6513, -4177, -1700, 14806, +12535, 7739, 4223, -3280, -8677, -13990, -9235, -6650, -2186, 16207, 17051, 8329, 11309, -13286, -20113, -5303, +-4164, 10673, 12062, 8640, 5828, -2460, -10951, -3643, -3077, -7673, -3023, -608, 5602, 3004, 5557, 11299, +7647, 2692, 4385, -5404, -12703, -4531, -10890, -18453, -2875, 1744, -5831, 7869, 6204, -5671, 958, 13229, +12569, 7348, 3334, -3203, -9403, -13712, -8496, -6868, -423, 17156, 14928, 9641, 9522, -14742, -18746, -5232, +-4155, 12795, 11517, 7742, 7703, -4438, -10969, -3795, -3892, -6787, -2977, 643, 5450, 2890, 6144, 11956, +6087, 3367, 3557, -6540, -12176, -3261, -12828, -18920, -1193, 323, -3949, 7594, 6748, -5953, 1646, 12876, +11914, 7163, 2543, -3164, -10233, -13186, -8398, -6754, 676, 17403, 13739, 10396, 8562, -16106, -16601, -6833, +-2076, 12447, 11269, 8148, 6823, -4090, -11441, -3276, -4527, -6239, -3046, 1055, 4980, 3465, 6050, 11814, +6403, 2978, 4148, -7620, -10280, -5284, -11442, -19418, -936, 465, -4447, 8810, 5012, -4157, 432, 13544, +11601, 7311, 2607, -3205, -9979, -13357, -8083, -7109, 1232, 16548, 14459, 9749, 8857, -16171, -16721, -6605, +-2840, 13150, 10392, 8756, 6497, -3958, -11394, -3856, -3897, -6895, -2652, 609, 5383, 2857, 6734, 11136, +6740, 2880, 3916, -7105, -11156, -4199, -12748, -18147, -1940, 1227, -4942, 8785, 5511, -5223, 1592, 12694, +12155, 7143, 2651, -3165, -9956, -13360, -8136, -6979, 816, 16996, 14296, 10006, 8764, -15295, -17970, -5590, +-3702, 13088, 11237, 7823, 7673, -4589, -10988, -3835, -3954, -6726, -2955, 701, 5434, 2892, 6174, 11947, +6075, 3369, 3553, -6543, -12175, -3261, -12873, -18858, -936, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1785, 6074, -18113, 14064, -3095, 11086, +8732, -6139, 4252, 9926, 9531, -18433, -313, -8528, 2775, -5204, 6318, 3597, -8175, 18842, 5310, 5708, +913, 25672, 2259, -3891, -2513, 12560, 13109, -4136, 7729, 4519, 2543, 16735, 4821, -11995, -7076, 3586, +-3309, -895, 5925, -4718, 1820, -6688, -5224, 3377, -10244, -16841, 2858, -2609, 15188, 25043, 1291, 4579, +9294, -8997, 17189, -11348, -21908, -15289, -782, -11126, -359, 1248, -15120, 7200, 5650, -543, -5721, 16788, +-11068, -9632, -9274, 7485, 4824, -9359, -223, -4660, -4242, 8180, -3854, -17226, -11456, -2664, -7379, -3042, +-71, -8540, -5426, -11302, -7878, 2231, -14908, -12154, -313, -4315, 18413, 22990, 3035, 6905, 10970, -8354, +13323, -13076, -19475, -7316, 744, -10602, 3070, 6333, -8447, 12335, 10319, 1664, -2440, 19763, -4196, -1994, +-3796, 10138, 3939, -5814, 3992, 1772, 512, 9503, 1039, -11305, -3362, -182, -2490, -137, 762, -1535, +-1712, -8336, -3982, 4542, -15611, -10566, 2820, -1825, 20910, 22286, 4678, 7991, 11806, -4713, 17131, -10156, +-16390, -4085, -2957, -7268, 653, 311, -8808, 8722, 6799, 986, -2715, 15178, -5998, -3922, -6547, 13618, +3954, -8513, 1276, -1407, -2395, 5650, -3236, -17730, -7084, -2967, -5446, -434, -4055, -9616, -4524, -10957, +-10236, 6928, -18872, -14573, 2700, -4345, 21190, 21072, 5635, 5257, 10864, -5287, 11196, -14570, -16412, -5348, +-4254, -6784, 4048, 4506, -3125, 12015, 8936, 4070, 555, 16453, -1210, -243, -7321, 14185, 1974, -4758, +4373, 1671, 1067, 7966, 248, -14291, 71, -439, -5267, 2838, -1304, -3937, 505, -6620, -8001, 9233, +-19560, -12154, 5466, -3624, 21109, 21588, 6346, 5560, 15941, -2904, 16840, -7238, -17899, -1437, -2002, -8614, +3201, 1397, -7170, 6948, 8115, 2417, -2458, 12156, -5736, -3342, -7286, 14460, 112, -7749, 646, -2873, +-117, 2468, -5998, -19722, -4748, -5597, -4756, -2715, -7422, -6363, -7137, -9765, -10650, 7812, -23279, -14507, +4529, -6187, 21164, 20369, 5502, 5680, 14790, -6419, 12424, -9556, -20439, -1162, -3100, -7011, 7963, 6084, +-2057, 11317, 11877, 5733, 2243, 15135, 2546, 1490, -7376, 18025, 2271, -1372, 4194, 2218, 6416, 5209, +-56, -11058, 2322, -2526, -822, 1525, -1314, 749, 187, -4642, -6043, 8891, -20323, -9223, 6293, -1613, +22926, 21017, 10491, 5411, 17344, 2694, 16642, -7192, -16750, 2679, -3105, -5494, 7661, 1304, -5038, 7545, +10032, 5985, -1324, 8278, -1888, -742, -9579, 18144, -6, -7207, 575, -1538, 976, 986, -7356, -20437, +-807, -7966, -6421, -2621, -8679, -6479, -7837, -9271, -13079, 5320, -26172, -15019, 1382, -5643, 16793, 15444, +8792, 507, 12509, -3335, 9196, -13409, -20520, -865, -6721, -5610, 7565, 3614, -2125, 9427, 12968, 7346, +2067, 11892, 6076, 1583, -8752, 23043, 3775, -2664, 6656, 4128, 6799, 6663, 948, -11557, 5270, -2939, +-1430, 4085, -2221, 618, 1631, -5529, -7873, 10161, -24781, -8208, 5431, -5396, 21397, 19262, 8966, 1878, +19209, 2274, 11370, -8420, -18411, 2566, -5590, -5675, 5880, 618, -6923, 6109, 11990, 5799, -4204, 6361, +704, -2657, -8611, 18766, -406, -5945, -1664, 263, 4443, -2712, -7384, -18542, -41, -9778, -4544, -1727, +-11181, -5945, -5078, -12182, -11796, 5285, -30779, -11002, 1009, -9329, 16596, 16488, 7853, -1921, 15581, -3710, +6192, -13391, -22004, 8, -9110, -5680, 6043, 2614, -3531, 8190, 13633, 6867, -1389, 10768, 4856, -1218, +-6847, 20215, 1344, -1513, 1266, 3662, 9095, 2102, -1737, -11169, 3307, -5318, 805, 540, -3035, -326, +-371, -5353, -10078, 7893, -24894, -9102, 1664, -4824, 19461, 15853, 10738, -154, 19587, 2773, 9463, -9400, +-16741, 2513, -8195, -3581, 4542, -1510, -6169, 7278, 9521, 6341, -5859, 2548, 4635, -3917, -9256, 20492, +-1687, -6174, -1409, 2226, 5575, -5345, -8064, -16778, -487, -8873, -2637, -5015, -8483, -6905, -4972, -9206, +-13852, 2798, -27540, -10592, -2584, -5953, 15701, 16606, 10781, -3743, 17524, -1099, 4945, -13288, -19366, 280, +-9521, -1651, 5786, 2745, -195, 9851, 12431, 12567, -1263, 8137, 10587, 858, -6247, 24368, 3317, -749, +3556, 7686, 12121, 3355, -2012, -7046, 7134, -5177, 5519, 1538, -1276, 2432, 2987, -5592, -7273, 9337, +-24186, -7890, 2596, -2505, 18287, 17438, 13575, -2017, 22916, 4385, 8183, -7059, -16148, 1714, -5769, -1538, +812, 1175, -5832, 8122, 9942, 6910, -7202, 2639, 6799, -3047, -7225, 20298, -1739, -3597, -99, 4063, +7759, -5045, -10410, -10531, 1646, -9312, 1404, -4035, -8157, -2962, -280, -11035, -9732, 3760, -25791, -9087, +-1634, -3392, 16818, 18217, 13363, -5114, 21049, 2284, 2959, -11181, -18786, 112, -7575, -1137, 2949, 5252, +-2707, 8251, 13862, 10939, -4312, 7875, 9281, -1029, -4925, 20505, 2881, -2075, -537, 9266, 10042, -1238, +-4788, -6252, 3551, -5872, 3682, -2327, -142, 210, 1011, -6943, -6494, 3592, -23580, -9251, -822, -2037, +15475, 14986, 13885, -5486, 21802, 5968, 5119, -11617, -14225, 633, -8755, -127, -3929, 873, -5421, 4947, +7674, 7485, -11993, 1334, 5595, -2687, -9163, 16019, -278, -5585, -3309, 6570, 4370, -8742, -10662, -10151, +-966, -8460, 424, -9334, -4509, -4799, -2057, -11521, -10173, -608, -24451, -11889, -3801, -2614, 14557, 15813, +13762, -7608, 21775, 3937, -469, -15173, -14024, -2969, -10055, 1755, -245, 4181, -2148, 7981, 11053, 14235, +-7800, 7323, 10362, -1543, -4156, 20381, 2730, -1283, -800, 10818, 10748, -2327, -6467, -2211, 3219, -6111, +6016, -3103, 1331, -291, 3193, -6532, -5731, 1160, -20689, -9488, -338, -379, 13598, 17088, 13709, -6693, +26280, 5910, 2763, -11050, -10949, -530, -8097, 681, -4718, 2967, -5290, 4902, 8067, 9385, -15246, 2604, +6593, -3148, -7711, 15095, -162, -4564, -4179, 7820, 4446, -10088, -12310, -6353, -2296, -8331, 2206, -11542, +-2873, -5348, -1167, -11310, -9778, -3730, -21276, -13182, -4007, -870, 12104, 16130, 14500, -8026, 23949, 3725, +-2647, -14145, -11826, -4816, -9795, 2831, -2007, 5512, -1999, 7837, 10687, 15095, -10345, 7868, 10977, -1044, +-3637, 19058, 3748, -1084, -1906, 13321, 9518, -3783, -7472, 1162, 1228, -5101, 7049, -5020, 2843, -787, +4075, -6252, -5441, -2412, -17178, -10975, -555, 1069, 11098, 17637, 14485, -7502, 28086, 6063, 454, -9879, +-9128, -2138, -7500, 1903, -6774, 4106, -5121, 4418, 8311, 9674, -17428, 3488, 6462, -2432, -6600, 13371, +1064, -4494, -5003, 10347, 2894, -11683, -12615, -3251, -4370, -7263, 2538, -12421, -1550, -5615, -263, -11053, +-9755, -6784, -17619, -15180, -3826, 207, 10070, 15876, 15444, -8490, 25617, 3778, -4738, -12736, -10319, -6358, +-8538, 3733, -4461, 6512, -1651, 7333, 10990, 14863, -12580, 8861, 10990, -147, -2974, 17320, 5035, -1162, +-2294, 15379, 7888, -5449, -6903, 3277, -638, -4080, 6903, -5290, 3740, -815, 4579, -5532, -5733, -5446, +-13472, -13149, -263, 1881, 9188, 17788, 15165, -8049, 29858, 5834, -1810, -8455, -7510, -3786, -5711, 2117, +-8644, 5131, -4786, 3833, 8644, 9009, -18907, 4862, 5623, -1052, -6094, 11597, 2624, -4660, -5345, 12156, +1550, -13295, -11587, -1858, -5829, -6200, 2445, -12494, -1014, -5287, -36, -10115, -10589, -9203, -14210, -17061, +-3486, 895, 8268, 15936, 16060, -8800, 27144, 3450, -7245, -10556, -8986, -8052, -6613, 2994, -5355, 7054, +-1041, 6504, 11600, 13840, -13759, 9846, 10458, 1296, -2891, 15934, 5970, -1112, -2543, 16929, 6459, -6918, +-5615, 4133, -2037, -2319, 6341, -5534, 4143, -462, 4584, -4496, -7076, -7225, -10020, -15314, 245, 2465, +7396, 17718, 15651, -7505, 30705, 5512, -4632, -5527, -6860, -5441, -3967, 946, -8538, 5232, -3788, 2979, +9135, 7585, -19019, 5320, 5126, 545, -6560, 10481, 3677, -4635, -5703, 13752, 122, -14666, -10148, -1195, +-7107, -3655, 1094, -12529, -757, -4846, -74, -8992, -12245, -10816, -10937, -18867, -2760, 1029, 6731, 16052, +16402, -8203, 27517, 3415, -9939, -7144, -9060, -9198, -5141, 1689, -4715, 6837, 84, 5217, 12492, 12020, +-13542, 9790, 10080, 2654, -2919, 14838, 6756, -1039, -2606, 18234, 4859, -8452, -3775, 4383, -3120, 487, +4058, -4940, 4065, 94, 4461, -3544, -9186, -8107, -6807, -17468, 1218, 2400, 6222, 17108, 16090, -6371, +30658, 5353, -7013, -1941, -7444, -6515, -2259, -301, -8001, 4801, -2304, 1747, 9884, 5350, -18055, 4768, +5323, 2024, -6935, 9425, 4625, -4645, -5242, 14581, -1409, -16344, -7684, -1306, -8047, -1006, -1409, -11043, +-1235, -3886, -417, -7860, -14417, -11436, -8460, -20318, -1918, 595, 5688, 15772, 16803, -7306, 27333, 3617, +-12101, -3816, -9783, -9942, -2997, -144, -4196, 6386, 1346, 3917, 13258, 9485, -12124, 9334, 9674, 4184, +-3085, 13731, 7575, -986, -1913, 18375, 3445, -10269, -845, 3607, -3667, 2523, 1664, -2982, 3307, 1364, +3894, -2440, -11645, -7865, -4862, -18879, 1999, 1918, 5411, 16352, 16370, -4836, 29865, 5663, -9087, 1588, +-8475, -7001, 482, -2946, -7233, 4058, -832, 648, 10267, 2951, -16518, 3970, 5406, 3647, -7512, 8614, +5308, -4662, -4191, 14387, -2662, -17763, -4776, -2430, -8420, 669, -3390, -9075, -2065, -2538, -1092, -6693, +-16732, -11035, -6814, -21559, -1440, 255, 4851, 15296, 16971, -5494, 26154, 3896, -14082, -321, -10995, -9947, +-558, -3072, -2951, 5484, 2853, 2659, 13484, 6598, -9642, 8286, 9531, 5890, -3851, 12892, 8417, -1031, +-1036, 18035, 2196, -11123, 1571, 2324, -3813, 4315, -432, -1298, 2526, 2584, 3229, -1503, -14059, -7142, +-3705, -19623, 2362, 1490, 4801, 15740, 16624, -3020, 28018, 6111, -11159, 5542, -9994, -6779, 2138, -5333, +-5703, 2921, 893, -850, 10730, 283, -13933, 2518, 5754, 4704, -7873, 8018, 5722, -4680, -3428, 14053, +-3342, -17958, -3723, -3007, -8348, 1474, -4267, -8498, -2282, -2233, -1218, -6559, -17124, -10881, -6695, -21611, +-1427, 255, 4833, 15237, 16962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 772, 1093, 383, 565, 587, 516, 558, 607, 532, 482, +477, 59, -254, -186, -393, -374, -262, -679, -509, -546, -914, -850, -889, -1207, -1204, -1138, +-921, -592, -748, -1120, -842, -721, -1006, -674, -500, -458, 36, 175, 275, 283, 168, 322, +216, 241, 667, 757, 357, 422, 859, 594, 446, 776, 835, 803, 657, 527, 439, 496, +265, -100, -73, -79, -347, -640, -815, -708, -1225, -1367, -1171, -1612, -1618, -1596, -1401, -1513, +-1687, -1493, -1613, -1548, -1305, -931, -663, -774, -409, -112, 177, 440, 434, 496, 829, 1101, +1166, 1442, 1689, 1612, 1437, 1413, 1443, 1625, 1436, 1411, 1418, 1248, 1258, 894, 642, 738, +488, 366, 414, 371, -15, -572, -759, -802, -791, -1005, -1253, -1399, -1379, -1515, -1717, -1807, +-1729, -1747, -1942, -1891, -1285, -1101, -1155, -734, -569, -709, -352, -280, -8, 233, 337, 713, +895, 927, 1118, 1185, 1214, 1292, 1257, 1490, 1505, 1258, 1156, 1254, 1116, 1332, 1329, 1242, +981, 734, 370, -54, -258, 88, 49, -703, -1464, -1699, -1702, -2657, -2929, -2862, -3360, -2988, +-2870, -2888, -2780, -2531, -2208, -1713, -1288, -834, -331, -105, 255, 836, 990, 1344, 1539, 1741, +1952, 2162, 2408, 2509, 2615, 2872, 2853, 2788, 2769, 2634, 2517, 2226, 1821, 1679, 1132, 1044, +841, 589, 238, -93, -243, -509, -487, -753, -1227, -1708, -2025, -2238, -2894, -3094, -2628, -2595, +-2749, -2841, -2802, -2526, -2674, -2511, -1896, -1406, -855, -493, -61, 292, 577, 831, 908, 1340, +1679, 1697, 1922, 2130, 2188, 2056, 2247, 2470, 2324, 2193, 2261, 2316, 1932, 1765, 1964, 1911, +1834, 1864, 1389, 1364, 1205, 517, -146, -623, -682, -1276, -2856, -4584, -6048, -6945, -7144, -6828, +-6123, -5463, -4768, -4203, -3111, -1886, -1093, -510, 233, 812, 1174, 1452, 1767, 1942, 2080, 2387, +2858, 3592, 4049, 4374, 4704, 5005, 5009, 4642, 4190, 3835, 3308, 2659, 1962, 1564, 1088, 521, +287, 264, 411, 375, 264, -93, -340, -884, -1511, -1480, -1973, -2763, -3416, -4424, -4720, -4804, +-5330, -5301, -4804, -4337, -3488, -2562, -1887, -1269, -739, -95, 656, 1099, 1379, 1870, 2135, 2170, +2377, 2764, 2881, 2731, 2862, 3022, 3100, 2853, 2581, 2579, 2290, 2134, 2167, 2116, 2228, 2518, +2717, 3190, 3657, 4143, 4205, 4515, 4224, 2271, -2604, -11409, -17927, -14967, -8845, -6069, -3278, -4405, +-11492, -14003, -10443, -4802, -1258, 1569, 3363, 3210, 2820, 2104, 1024, 124, 80, 1048, 2261, 3702, +5417, 6599, 6686, 7105, 7879, 7457, 6496, 5853, 5237, 3571, 2153, 1369, 413, -718, -612, -289, +-732, -59, 6, 425, 1316, 1713, 1533, 955, 270, -1254, -2763, -3935, -4520, -5062, -5547, -5730, +-5959, -5645, -5184, -4736, -3345, -2327, -1198, 54, 904, 1465, 1902, 2153, 2078, 2322, 2663, 3070, +3180, 2783, 2223, 1679, 1351, 1530, 1685, 2022, 2247, 2488, 2407, 2323, 2453, 3011, 4292, 5736, +7525, 9330, 10705, 10269, 6595, -7381, -24315, -18930, -3190, -6208, -13176, -13401, -19419, -18394, -17899, -12256, +-458, 3272, 4921, 6263, 5910, 3173, 1237, -1286, -3049, -748, 1052, 816, 2243, 4627, 5930, 6375, +8988, 10496, 9684, 9735, 10123, 8582, 4927, 2150, 892, -1116, -2304, -1533, -2371, 2, -885, -2087, +1724, 2145, 2416, 2950, 3529, 2468, 612, 224, -1760, -2731, -3980, -3941, -4400, -5221, -5129, -5227, +-4777, -3642, -2648, -1683, -568, 897, 1605, 1486, 2020, 2688, 3205, 3292, 3061, 1790, 802, 327, +-427, -1458, -1626, -340, 304, 414, 458, 1035, 1490, 1946, 3734, 5732, 7819, 10488, 13943, 15842, +14986, 4252, -20081, -27618, -8472, -5236, -16877, -14563, -18360, -19897, -18374, -21656, -10618, -236, 3677, 6298, +8746, 7699, 5214, 2629, -1029, -844, 1007, -352, -970, 987, 3430, 4243, 6531, 9882, 10278, 11336, +12571, 11611, 8260, 4907, 2954, 1198, -1361, -800, -3450, -1960, -433, -4705, -994, 1888, 1780, 2868, +4307, 4782, 3322, 2469, 477, -1144, -2759, -3362, -4151, -3851, -3595, -4256, -3948, -2162, -1183, -614, +7, 1319, 2895, 2818, 2437, 2322, 3468, 3375, 2803, 2479, 1336, 27, -1460, -2958, -4380, -4045, +-3001, -2340, -1794, -1286, -185, 434, 1991, 5140, 8359, 12018, 16761, 19066, 17018, 3672, -21385, -25428, +-6661, -7735, -18168, -15633, -20811, -17593, -16550, -24412, -19186, -8446, 89, 5121, 10537, 11967, 8446, 4870, +1122, 1426, 2450, 700, -228, 928, 2881, 3416, 5489, 7488, 7918, 10485, 12920, 12294, 10003, 7900, +5963, 2761, 312, 752, -3156, -1033, -881, -4979, -1697, 385, 755, 1621, 3680, 3943, 4249, 4475, +2328, 182, -1755, -2751, -4262, -3372, -2820, -3450, -2794, -844, -704, 31, 1142, 2585, 3998, 4221, +4087, 3563, 3786, 4093, 3076, 2177, 1557, 250, -1626, -3896, -5474, -5563, -5058, -4174, -3198, -2402, +-1464, -474, 674, 3861, 7911, 11926, 17516, 20304, 17473, -823, -26499, -22901, -3959, -10420, -18553, -17695, +-22979, -14976, -17583, -25932, -22997, -13591, -3113, 3734, 10976, 14190, 11070, 5211, 1401, 2828, 3411, 2335, +1741, 3227, 4854, 4374, 6100, 6377, 6205, 9537, 12459, 11741, 9923, 8160, 6743, 2960, 1731, 1291, +-2190, 1073, -1610, -4247, -946, 326, 1073, 1360, 3287, 3254, 3938, 4007, 2066, -262, -1384, -2398, +-3178, -2577, -2943, -3791, -2527, -188, 235, 1127, 1854, 3358, 4883, 5478, 5796, 5241, 5054, 4961, +2969, 1815, 1431, -221, -2522, -5354, -6906, -6562, -6229, -5326, -3837, -2188, -921, 52, 1219, 4899, +9567, 14200, 19404, 20834, 10946, -15271, -29344, -11715, -5079, -17194, -19508, -22890, -20364, -13008, -22233, -26538, +-23726, -14012, -2410, 5049, 11747, 14507, 10656, 3825, 2657, 4497, 3657, 3579, 4282, 6410, 7496, 7195, +7356, 5941, 6938, 10966, 12382, 9910, 8575, 8150, 5503, 2639, 2295, -1327, -429, 760, -3442, -2052, +-650, 579, 1320, 2279, 2989, 3027, 4098, 3787, 1538, -965, -2793, -3214, -3114, -2886, -3423, -3939, +-1430, 108, 773, 2102, 3106, 4204, 4946, 5523, 6541, 6536, 6462, 5686, 3453, 2319, 1277, -384, +-3259, -6155, -7485, -7442, -7100, -6412, -4787, -2500, -495, 1098, 3124, 7562, 12786, 17680, 21903, 16749, +-5864, -27784, -17791, -3792, -13712, -20546, -23661, -24354, -14219, -19218, -26346, -26929, -21021, -9118, 856, 7898, +13356, 13516, 7194, 2763, 4912, 4931, 4118, 4744, 6405, 8677, 10269, 10437, 7511, 6579, 9591, 12116, +11083, 8101, 7504, 6749, 3064, 2723, -846, -1710, 1297, -2579, -2766, -980, -464, 1156, 1983, 2987, +2705, 2992, 4205, 2112, -172, -2768, -3724, -3167, -2890, -2892, -3561, -2306, -725, -6, 1433, 2711, +4041, 4796, 5043, 6285, 7486, 7529, 7553, 5329, 3555, 2759, 855, -2133, -5449, -6891, -7307, -7221, +-7490, -6780, -4325, -1868, 488, 2807, 6657, 12556, 18147, 22343, 18921, -4534, -27298, -17037, -1925, -11833, +-20105, -25596, -25932, -14351, -18803, -26779, -28871, -24288, -13021, -2187, 5237, 11330, 13774, 8306, 2812, 4980, +5635, 4393, 5067, 6716, 8847, 11103, 12596, 9793, 7176, 10377, 13140, 12396, 9629, 7742, 7218, 3890, +3527, -131, -2474, 967, -2442, -2408, -1033, -1545, 342, 1496, 2662, 2523, 2348, 4060, 1979, 86, +-2490, -4516, -3874, -3665, -3219, -3318, -2422, -888, -301, 865, 2522, 4171, 5534, 5543, 6244, 8195, +8703, 8341, 6042, 3668, 2839, 1644, -1401, -5777, -7229, -7650, -7053, -7497, -8409, -6289, -2997, 94, +2978, 6869, 12343, 18227, 21785, 19361, -2352, -26697, -17182, -684, -10483, -18989, -25193, -26526, -14417, -18423, +-27281, -30367, -25818, -14138, -3930, 3274, 9707, 12888, 8912, 2625, 3898, 5394, 4531, 5359, 6947, 8466, +11214, 12395, 10322, 7972, 10728, 14102, 13127, 10479, 8738, 7751, 4448, 3917, 191, -2371, 807, -2351, +-2431, -968, -1610, 30, 1285, 2511, 2562, 2345, 4026, 2030, 81, -2490, -4516, -3958, -3804, -3440, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -318, -331, -122, -217, -296, -210, -59, 6, 18, 45, 42, 65, 157, 229, 286, +234, 277, 309, 367, 328, 360, 422, 313, 354, 331, 444, 364, 156, 352, 519, 408, +250, 243, 284, 471, 286, 175, 291, 258, 296, 214, 287, 216, 212, 46, -137, -25, +170, 103, 12, -60, -70, -95, -104, -143, -236, -320, -341, -268, -282, -608, -735, -671, +-700, -710, -855, -888, -714, -1059, -1384, -1130, -903, -778, -714, -640, -705, -750, -729, -640, +-201, 148, 318, 262, 8, 194, 517, 643, 602, 737, 713, 863, 820, 859, 822, 850, +750, 619, 602, 597, 578, 624, 589, 582, 352, 345, 311, 268, 231, 76, 336, 398, +183, 129, 141, 34, 8, -27, 1, -35, 45, 39, -44, -60, 194, -30, -229, -103, +56, 30, 117, 25, 2, -88, -236, -288, -302, -531, -598, -720, -937, -1115, -1263, -1422, +-1602, -1535, -1721, -2010, -1949, -1703, -1674, -1412, -1243, -1233, -914, -384, -180, -78, 246, 498, +926, 1096, 1213, 1418, 1630, 1870, 1802, 1649, 1689, 1843, 1508, 1329, 1215, 1193, 1101, 1174, +937, 657, 695, 805, 777, 661, 570, 241, 93, 54, 90, 251, 144, 83, 215, 23, +-104, -94, -117, -427, -418, -201, -429, -529, -446, -366, -200, -272, -327, -255, -153, -105, +-46, -292, -372, -186, -357, -786, -851, -1041, -1539, -1597, -1935, -2458, -2683, -2872, -3294, -3295, +-3012, -2867, -2702, -2324, -2237, -1807, -810, -149, 718, 1101, 1327, 1973, 2180, 2393, 2944, 3390, +3432, 3279, 3122, 2975, 2624, 2426, 2122, 1873, 1663, 1705, 1707, 1358, 1091, 1046, 918, 645, +534, 417, 359, 423, 374, 303, 435, 296, 51, 129, 102, -144, -224, -235, -240, -364, +-619, -831, -1009, -1137, -1102, -1055, -910, -766, -598, -606, -474, -406, -594, -813, -757, -1193, +-1360, -1674, -2193, -2328, -3065, -3880, -4143, -4718, -4999, -5270, -5376, -4998, -4636, -3686, -2633, -1485, +107, 883, 1355, 1750, 2844, 4011, 4986, 5594, 5761, 5717, 5547, 5182, 4667, 4359, 3811, 3351, +2904, 2668, 2338, 1826, 1499, 1091, 762, 599, 398, 211, 62, -40, 28, -5, 32, -27, +110, 175, 341, 640, 505, 318, 311, 340, 25, -338, -642, -880, -994, -1038, -876, -584, +-230, -230, -555, -957, -1126, -1227, -1462, -1883, -2075, -2379, -2430, -3007, -3818, -4040, -4355, -4844, +-6222, -9288, -12846, -13159, -7916, -2390, -1680, -1951, -2151, 404, 4486, 2633, 878, 1967, 4087, 8117, +9135, 9929, 8635, 8163, 7551, 5835, 5357, 4870, 4431, 3646, 2907, 2511, 2387, 1636, 811, 343, +249, 146, -3, -103, -346, -235, -86, -269, -330, -532, -70, 888, 579, 1142, 597, 326, +321, -448, -800, -1983, -1970, -2110, -2039, -1238, -390, 471, 25, -424, -1132, -1418, -575, -978, +-1025, -1258, -2022, -2537, -3292, -2833, -2711, -3118, -3963, -6274, -13759, -23691, -20037, -5025, -3476, -7631, +-3401, -938, 2587, 6734, 4317, 4720, 5014, 2240, 1506, 8716, 15345, 13159, 10742, 9433, 8748, 7749, +5238, 3203, 2880, 2655, 2305, 2347, 1043, -16, 202, -114, 173, 147, 191, -496, -377, -1064, +-806, -478, -1621, 960, 1404, 1199, 2371, 2099, 1540, 738, 162, -1724, -3007, -2718, -3792, -3865, +-2609, -1213, -550, -802, -792, -1368, -1805, -904, 109, 327, -348, -1092, -1458, -1528, -2243, -2611, +-1644, -1762, -3337, -7756, -19737, -29619, -19208, -2783, -6494, -7544, -2325, -1141, 6324, 8281, 6346, 6738, +6681, 2614, 1397, 8776, 16993, 14148, 11014, 9964, 9818, 8672, 5265, 3558, 2862, 2099, 1208, 880, +-580, -564, 418, 400, 62, -710, -1476, -1577, -1922, -2668, -1006, -2338, -1993, 1320, 1902, 2823, +4143, 3629, 2188, 1091, 156, -1647, -2725, -2725, -4316, -4211, -2019, -466, -976, -1641, -1505, -2322, +-2237, -912, 307, 367, -419, -1246, -1597, -1469, -2062, -2044, -1048, -1132, -2561, -7817, -21783, -31355, +-18144, -2837, -6880, -7409, -3185, 364, 8467, 9163, 7596, 7502, 6050, 1504, 1939, 11002, 17572, 13214, +11026, 10200, 9553, 8824, 5575, 3240, 2279, 1557, 1019, 650, -1336, -725, 303, 607, -139, -1734, +-2527, -2174, -3049, -3443, -1757, -3563, -1878, 1246, 2300, 3845, 4919, 4495, 2851, 1839, 653, -1373, +-2608, -2795, -3762, -2988, -1001, -461, -1413, -1784, -2077, -3083, -2534, -962, 170, 36, -691, -1287, +-1327, -1469, -2294, -2351, -1161, -745, -2463, -7394, -21348, -31557, -18828, -3254, -6680, -6610, -4766, 793, +9831, 9955, 8345, 7453, 5324, 1285, 2277, 12027, 17512, 12140, 10997, 9712, 9406, 8711, 5156, 3062, +2538, 2133, 1133, 190, -1521, -197, 204, 308, -1087, -2156, -3009, -3051, -4027, -3450, -1665, -3812, +-1839, 841, 3128, 4685, 5284, 5144, 3449, 2584, 1325, -1159, -2136, -1800, -3244, -3095, -1132, 152, +-953, -1882, -2669, -3985, -3351, -1384, -86, -15, -883, -1719, -1356, -1448, -2294, -2642, -1112, -251, +-2298, -9387, -24347, -30689, -14736, -2684, -6613, -6588, -5607, 3122, 9766, 9154, 8669, 7035, 3878, 531, +4124, 14000, 15878, 10773, 10855, 9186, 9265, 8071, 4935, 2861, 2628, 2594, 2077, 178, -1200, -223, +-251, -30, -1135, -2093, -3658, -3909, -5005, -3027, -2178, -4117, -1532, 498, 3801, 5260, 5905, 5570, +3915, 3089, 1199, -1161, -1524, -1815, -3147, -2615, -395, 737, -1185, -2052, -3757, -4878, -3463, -1535, +-39, -458, -1500, -1932, -1607, -1765, -2798, -3132, -942, -593, -3854, -15534, -29635, -26068, -5692, -2750, +-6376, -7160, -3270, 6512, 9228, 8741, 8636, 6355, 1668, 1057, 8834, 16431, 12757, 10330, 9902, 8071, +8656, 6574, 3660, 2421, 3110, 2793, 2041, -670, -980, -700, -354, -395, -1016, -2803, -3840, -4098, +-4839, -1791, -2899, -3133, -899, 1348, 5079, 6103, 6292, 5033, 3823, 2566, 34, -1418, -1447, -2425, +-3458, -1646, 815, 362, -1584, -2606, -4930, -5033, -3521, -1343, 60, -1199, -2081, -1933, -1447, -1510, +-2759, -2975, -2116, -3459, -11174, -25352, -29140, -11267, -1053, -5013, -5650, -5141, 2968, 8173, 8905, 9226, +8388, 3970, 267, 6153, 15250, 14733, 10405, 9649, 7773, 7514, 7053, 4409, 2236, 2342, 2644, 2760, +674, -966, -1122, -335, -10, -419, -1527, -3374, -2883, -5219, -3627, -2296, -2843, -1401, -522, 2791, +5526, 6506, 5740, 4379, 3670, 1107, -1141, -1364, -1999, -2891, -2051, 491, 1227, -680, -1694, -3655, +-5032, -4186, -2720, -587, -989, -2298, -2518, -1844, -1561, -1814, -2808, -3298, -3988, -11802, -25629, -28282, +-11064, -1794, -5791, -3943, -3447, 2556, 7396, 8050, 8855, 9414, 6006, 1557, 5659, 14720, 14589, 11006, +9364, 7402, 6939, 6092, 4640, 2818, 1849, 1849, 2536, 1108, -705, -1184, -225, 44, -471, -1145, +-2998, -2476, -4457, -4591, -3515, -3153, -1125, -1026, 403, 3798, 5539, 5549, 4455, 3783, 1559, -1264, +-1010, -1450, -2448, -1287, 846, 1669, -40, -1198, -2640, -3699, -3730, -2809, -1161, -1297, -2482, -3559, +-2521, -1401, -1533, -1741, -3571, -5657, -15817, -28385, -24310, -6454, -4225, -7471, -3588, -1844, 4882, 7499, +7073, 8226, 9892, 7055, 3037, 6754, 15129, 14450, 10224, 9351, 7921, 6767, 4724, 3712, 2960, 1868, +1508, 1823, 817, -628, -805, 173, 241, -176, -766, -2295, -2508, -4276, -3749, -4941, -4051, -880, +-1087, -561, 2002, 4087, 4156, 3951, 3042, 1130, -705, -729, -1330, -2295, -466, 2487, 1710, 215, +-760, -2290, -2270, -2793, -2650, -1083, -1674, -2608, -4112, -3437, -1490, -1482, -1598, -3522, -7783, -20136, +-29493, -18169, -3251, -7519, -6695, -3193, -612, 7462, 7863, 6775, 8394, 9686, 6232, 4472, 9962, 15449, +12214, 9839, 9519, 8316, 5890, 3035, 2794, 2479, 1406, 1751, 968, -5, -458, -90, 471, 248, +525, -1031, -1865, -2683, -4029, -3108, -5426, -4068, -1287, -1151, -160, 1215, 2557, 2726, 2827, 2112, +-46, -560, -153, -1489, -1853, 267, 3234, 1673, 262, -357, -1949, -1802, -2023, -1994, -1044, -1482, +-2751, -3954, -3633, -2004, -1926, -2184, -3265, -8984, -22434, -28620, -15042, -3361, -8543, -5960, -3169, 301, +7868, 7926, 7131, 8952, 9375, 5861, 5092, 11060, 15423, 11664, 9776, 9502, 8208, 5599, 2852, 2591, +2264, 1232, 1650, 847, -186, -482, -13, 531, 241, 467, -1060, -1868, -2677, -3912, -3132, -5440, +-4027, -1329, -1142, -165, 1233, 2509, 2668, 2547, 2880, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, -855, -1121, -802, -936, -762, +-781, -1102, -1235, -806, -957, -1015, -869, -881, -743, -820, -621, -400, -575, -643, -220, -107, +-336, 60, -21, 348, 661, 563, 509, 514, 1001, 985, 840, 1162, 1269, 1109, 1487, 1338, +1418, 1341, 1281, 1276, 1408, 1293, 1268, 1280, 1140, 1208, 1000, 1194, 970, 767, 747, 588, +496, 437, 259, 132, 309, 122, -230, 80, -279, -288, -414, -827, -852, -810, -832, -942, +-1246, -1324, -894, -1096, -1542, -1432, -1632, -1450, -1288, -1756, -1796, -1700, -1141, -1557, -1457, -845, +-938, -1097, -813, -428, -568, -457, 181, 205, 117, 560, 781, 851, 1120, 1172, 1364, 1722, +1436, 1864, 2010, 1596, 1950, 2265, 2216, 1708, 1873, 2156, 2203, 1814, 1751, 1920, 1528, 1258, +1588, 1680, 1537, 941, 685, 951, 915, 738, 461, 83, 176, 86, -376, -357, -566, -604, +-734, -778, -1014, -1181, -1162, -1423, -1941, -2013, -2059, -1784, -2019, -2367, -2259, -2437, -2977, -2581, +-1717, -2500, -2591, -1921, -2301, -2120, -1087, -1286, -1553, -981, -466, -2, 11, -168, 623, 1301, +1118, 1540, 2013, 2201, 2111, 2446, 2824, 2634, 2531, 2991, 2836, 2881, 3105, 3205, 2945, 2974, +2881, 2538, 2442, 2639, 2391, 1950, 1907, 1862, 1825, 1520, 1161, 1062, 737, 685, 624, 199, +-41, -110, -307, -603, -700, -937, -1180, -1388, -1671, -1583, -1807, -2162, -2536, -3004, -3147, -3041, +-3377, -3638, -3793, -4024, -4180, -4088, -4090, -3918, -3837, -3627, -3042, -2741, -2183, -2116, -1887, -936, +-583, 258, 607, 458, 1028, 2262, 2295, 2560, 3181, 3735, 3807, 4063, 4206, 4327, 4369, 4281, +4521, 4596, 4303, 4257, 4174, 4359, 4103, 3481, 3597, 3288, 2844, 2895, 2822, 2090, 1625, 1644, +1561, 1041, 684, 685, 647, 413, 1, -257, -540, -807, -983, -1452, -1703, -1931, -2316, -2660, +-3240, -4074, -4176, -4363, -4921, -5624, -6019, -6533, -6783, -6486, -6681, -6755, -6319, -6546, -6251, -4775, +-3956, -4151, -3828, -1493, -800, -1160, 84, 1698, 1849, 2363, 3578, 4407, 4972, 5486, 6056, 6384, +6420, 6690, 6763, 6843, 6618, 6473, 6467, 6578, 6538, 6013, 5357, 5004, 4811, 4448, 4145, 3541, +3027, 2587, 2558, 2184, 1739, 1437, 1185, 927, 447, 379, 588, 108, -273, -241, -226, -655, +-1311, -1853, -2421, -3105, -3583, -4534, -5590, -6499, -7414, -8224, -9092, -10026, -10723, -11079, -11262, -10991, +-10512, -9756, -8814, -7714, -7258, -6092, -4263, -2839, -1994, -701, -5, 1293, 2778, 4330, 5808, 7718, +9192, 9026, 8874, 9769, 9678, 8966, 9005, 8985, 8515, 8276, 8609, 9853, 9899, 7911, 6858, 6942, +6246, 5371, 4549, 3924, 3321, 2760, 2311, 2030, 1747, 1336, 1321, 1290, 967, 957, 1011, 1050, +865, 496, -11, -694, -1673, -2504, -3138, -4050, -5292, -6641, -8038, -9489, -10934, -12576, -13864, -14952, +-15759, -16220, -16012, -15115, -13746, -12402, -10569, -8446, -6295, -4422, -3949, -3512, -1776, -735, -1281, 899, +6576, 11726, 12290, 10613, 11307, 12609, 12269, 12240, 11521, 9658, 9613, 9649, 9882, 10822, 12324, 12994, +11823, 9524, 6797, 7735, 6714, 4901, 3920, 3093, 2822, 2594, 2435, 2516, 2028, 1683, 1683, 1842, +1814, 1882, 2338, 2552, 1869, 78, -1466, -2260, -2895, -3656, -4816, -6032, -7791, -9382, -11500, -13957, +-16053, -18069, -19041, -20238, -20668, -20201, -18789, -16570, -13909, -11378, -8776, -6158, -4627, -3852, -3109, -3171, +-6084, -5098, 5314, 15999, 14678, 10457, 12851, 13487, 13520, 15182, 13140, 10660, 10971, 11133, 10149, 9112, +10597, 15756, 18210, 13321, 8319, 7024, 9080, 7417, 4486, 3602, 2948, 2731, 3125, 3525, 3151, 2542, +3075, 3195, 2674, 2236, 2436, 4074, 4347, 1912, -806, -1481, -2140, -3032, -3371, -4446, -6347, -8038, +-10451, -13370, -17219, -20104, -21300, -22413, -23681, -23951, -23454, -21368, -17778, -14937, -11685, -7995, -5396, -3552, +-3493, -4495, -9170, -11702, -1046, 16439, 18489, 9863, 12376, 14352, 13813, 17123, 14667, 11040, 11230, 11708, +11431, 10280, 9000, 12257, 19521, 20471, 12909, 7389, 8499, 10451, 6656, 3946, 3399, 2853, 3269, 4121, +4106, 3132, 3880, 4216, 3632, 2900, 1944, 3471, 5873, 4843, 937, -845, -981, -2479, -2468, -2002, +-4095, -5920, -7995, -11387, -15638, -20170, -22334, -23536, -24815, -25653, -26629, -25680, -22009, -18152, -14890, -10631, +-7221, -5300, -3975, -3680, -7141, -14999, -12706, 6736, 22624, 13683, 8577, 14890, 12382, 15786, 18769, 12318, +10104, 11538, 11949, 11959, 9957, 9896, 15954, 23251, 20055, 10662, 7419, 11011, 10473, 5459, 4229, 3450, +3311, 4040, 5182, 4369, 3827, 4941, 4549, 3823, 2410, 2237, 5029, 7316, 4465, 178, -433, -1228, +-2928, -917, -839, -3876, -5552, -8586, -12628, -17344, -21440, -23455, -25284, -26172, -27433, -28432, -26240, -21755, +-18162, -14615, -10027, -7064, -5754, -4621, -4456, -10791, -19070, -10960, 13529, 23090, 8901, 10844, 14701, 10927, +18688, 17443, 10222, 10055, 10985, 12030, 11937, 9822, 11474, 19349, 25130, 18790, 9314, 9242, 13226, 9250, +4820, 3946, 3631, 3779, 4562, 6036, 4564, 5131, 5960, 4869, 3879, 2156, 2935, 6554, 7713, 3040, +-580, 0, -2096, -2266, 807, -1044, -4082, -5596, -9382, -13701, -18762, -22458, -24489, -26435, -26841, -28632, +-29427, -26029, -21605, -17948, -13837, -9501, -7160, -5803, -4194, -5367, -14397, -20561, -7448, 18311, 21167, 6995, +12817, 12286, 11266, 20200, 15300, 9288, 9657, 10718, 12518, 11579, 10001, 14024, 22949, 25811, 16189, 8989, +11312, 13172, 7877, 4375, 3927, 4006, 4000, 5669, 6741, 4782, 5806, 5814, 4809, 3649, 2145, 3909, +7619, 7396, 1802, -183, 342, -2373, -923, 1646, -1700, -4156, -5808, -10326, -14587, -20107, -23217, -25422, +-27278, -27646, -29659, -28889, -25054, -20784, -16963, -13142, -9026, -6908, -5775, -4364, -7016, -16954, -20214, -3426, +22163, 17914, 6966, 13849, 9918, 13125, 20355, 12848, 8472, 9085, 10520, 12447, 10744, 10832, 17482, 26610, +24666, 13673, 9196, 12670, 12608, 6445, 3869, 3770, 3725, 3988, 6695, 6474, 4505, 6167, 5497, 4804, +3564, 2502, 4882, 8134, 6419, 876, 486, 280, -2668, 423, 1552, -2485, -3841, -6802, -11320, -15953, +-21521, -23927, -26572, -27845, -28354, -29756, -27633, -23814, -19773, -15604, -11237, -7619, -6658, -5490, -4552, -9802, +-19566, -18023, 3735, 24254, 13384, 8391, 13009, 8092, 15381, 18010, 10052, 7870, 8483, 10653, 12003, 10148, +12558, 21164, 28509, 22261, 11600, 10153, 14017, 11082, 4984, 3313, 3390, 3913, 5044, 7680, 5823, 5039, +6356, 5111, 4751, 2868, 2558, 5828, 8351, 5059, 398, 1165, -583, -2488, 1241, 437, -3109, -4363, +-8295, -12655, -18081, -22643, -24456, -27330, -28084, -28941, -28843, -25675, -22058, -18222, -13997, -9504, -6880, -6540, +-5040, -5111, -13215, -21555, -14656, 10920, 23234, 9353, 9760, 10971, 8413, 17762, 15268, 8294, 7400, 8131, +11159, 11249, 10243, 16109, 25864, 27923, 17413, 10720, 12127, 13788, 8821, 4256, 3333, 3701, 3714, 5706, +7608, 5011, 5528, 6195, 5265, 4678, 2618, 3656, 7381, 8040, 3234, 446, 1320, -1661, -1674, 1718, +-1098, -3380, -4912, -9884, -14175, -19880, -22778, -24781, -27793, -28232, -28874, -27689, -24237, -20920, -16648, -12218, +-8617, -7050, -6695, -5047, -7564, -18199, -21744, -6554, 19091, 19058, 7204, 11131, 8151, 11475, 18053, 10981, +7150, 6881, 8489, 11771, 10787, 11962, 19655, 29027, 26266, 14497, 10617, 13494, 12922, 6666, 3230, 2822, +3898, 4753, 7035, 7189, 5071, 6622, 6026, 5056, 3404, 1911, 4887, 8155, 6632, 1621, 874, 777, +-2397, -191, 1650, -1826, -2906, -6085, -11421, -15803, -21112, -23088, -25702, -27677, -28379, -29214, -26614, -22755, +-19312, -15078, -11393, -7958, -6860, -6187, -5276, -10478, -20507, -19841, 1016, 22938, 13717, 7228, 11127, 7176, +14358, 16305, 8383, 6386, 6564, 9317, 11568, 10508, 13922, 23035, 30049, 22421, 12306, 11601, 14094, 11598, +5554, 2959, 3114, 3946, 4955, 7696, 6337, 5236, 6659, 5323, 4901, 2706, 2187, 6026, 8436, 5114, +825, 1611, 69, -2217, 1106, 914, -2497, -3191, -7733, -12493, -17417, -21986, -23477, -26468, -27704, -28828, +-28726, -25233, -21564, -17630, -13927, -10534, -7660, -7181, -5556, -5280, -13176, -22047, -16033, 9186, 23586, 9519, +8578, 9719, 7452, 16696, 13738, 6832, 5990, 6729, 10137, 11237, 11059, 16748, 26751, 30018, 18661, 11199, +12705, 14165, 9100, 4198, 2841, 3009, 3787, 5478, 7569, 5425, 5740, 6414, 5190, 4698, 2003, 3038, +7063, 7853, 3460, 947, 2119, -861, -1427, 2214, -55, -2590, -3754, -9131, -13612, -19072, -22463, -24015, +-26897, -27924, -29155, -27614, -23702, -20171, -16299, -13090, -9546, -7418, -6630, -5142, -7184, -16307, -21913, -10773, +15646, 20912, 6135, 10102, 8556, 9246, 17704, 11368, 6315, 6292, 7766, 10798, 10723, 12238, 19592, 29189, +27422, 15489, 11316, 13581, 13173, 7147, 3324, 2363, 2808, 3760, 5987, 7182, 4959, 6363, 6195, 5008, +3786, 1549, 4242, 7902, 7414, 2386, 1419, 2347, -1508, -326, 2187, -1427, -2741, -4931, -10616, -15165, +-20691, -22466, -24315, -27066, -28147, -28829, -26377, -22494, -19062, -15271, -12167, -8569, -7550, -6797, -5420, -9372, +-19262, -20958, -3670, 21820, 16137, 5333, 11332, 6484, 12226, 17108, 8552, 5556, 6023, 8335, 10891, 10580, +14221, 22674, 30204, 23922, 13734, 11624, 13675, 11422, 5112, 2819, 2260, 2871, 4030, 6698, 6667, 4850, +6755, 5454, 4952, 2890, 1537, 5134, 8194, 6331, 1387, 2296, 1499, -1921, 1030, 2003, -1718, -2439, +-6386, -11970, -16632, -21136, -22342, -25291, -27254, -28225, -28167, -25029, -21738, -17839, -14724, -11993, -8494, -7718, +-6463, -6077, -11503, -19918, -18377, 1979, 23303, 12077, 5832, 11400, 6380, 14107, 15218, 6913, 5339, 6414, +9165, 10735, 11064, 15862, 24715, 29891, 20990, 12589, 12056, 14049, 10056, 4287, 2701, 2456, 3217, 4295, +6915, 5777, 4927, 6734, 5105, 4618, 2019, 2056, 6161, 8414, 5480, 1186, 2896, 771, -1622, 2354, +1523, -2025, -2910, -7882, -12988, -17868, -21466, -22471, -25852, -27492, -28258, -27606, -24208, -20957, -16959, -14297, +-11198, -8065, -7839, -6167, -6372, -13195, -21424, -16443, 8665, 23939, 8641, 7776, 10671, 6355, 16095, 13494, +5880, 5478, 6987, 9760, 10674, 11504, 17643, 26954, 28980, 17870, 11857, 12465, 13517, 8553, 3501, 2371, +2367, 3445, 5198, 7316, 5009, 5345, 6242, 4804, 4368, 1378, 2972, 6954, 8408, 4514, 1579, 3434, +-75, -718, 3203, 879, -1858, -3420, -9075, -13716, -18718, -21361, -23088, -26478, -27662, -28524, -26780, -23528, +-20532, -16841, -14688, -10932, -8137, -7690, -5892, -7273, -14003, -21225, -13830, 12507, 23120, 6940, 8971, 10030, +7104, 16726, 12231, 5565, 5783, 7501, 10089, 11046, 12649, 19266, 28519, 27279, 15239, 11388, 12984, 12334, +6909, 2951, 2497, 3074, 3859, 5567, 7118, 4477, 5204, 5572, 4388, 3428, 1035, 3497, 7335, 8540, +4142, 2190, 3825, -488, 262, 3626, 437, -1593, -3939, -9899, -14486, -19177, -21484, -23870, -27199, -28276, +-28455, -26154, -23279, -20238, -16376, -14395, -10351, -8578, -7926, -5859, -7985, -14654, -21618, -12017, 15171, 22716, +6343, 9686, 9579, 7768, 17029, 11332, 5289, 5958, 7791, 10417, 11159, 13109, 20186, 28903, 26061, 14455, +11726, 12750, 11886, 6575, 2872, 2601, 3036, 3857, 5799, 6987, 4300, 5223, 5503, 4366, 3190, 1063, +3661, 7443, 8496, 4094, 2410, 3711, -666, 469, 3610, 370, -1568, -4117, -9984, -14559, -19222, -21482, +-23959, -27239, -28285, -28432, -26137, -23287, -20229, -16354, -14424, -10291, -8712, -7501, -6484, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 381, +383, 316, 261, 313, 282, 195, 258, 440, 385, 408, 469, 674, 778, 601, 641, 696, +622, 446, 392, 312, 232, 113, 186, -24, -156, -320, -502, -444, -596, -821, -747, -723, +-861, -856, -716, -906, -976, -659, -480, -621, -327, -71, 85, 299, 190, 189, 483, 486, +371, 699, 827, 621, 646, 708, 685, 812, 664, 538, 640, 645, 718, 764, 735, 696, +597, 288, 166, -15, -77, -35, -108, -372, -453, -515, -657, -862, -1018, -1121, -1229, -1255, +-1478, -1426, -1402, -1370, -1327, -1289, -1032, -957, -837, -545, -281, 32, 395, 386, 182, 364, +763, 628, 516, 606, 691, 898, 994, 972, 1001, 789, 889, 1045, 973, 1076, 1079, 1114, +1201, 1019, 794, 734, 426, 37, 63, 23, 42, -231, -480, -480, -919, -1399, -1709, -1728, +-1924, -2008, -2097, -2037, -1872, -1756, -1808, -1586, -1150, -1012, -847, -456, -199, 132, 379, 590, +718, 744, 950, 1151, 1107, 1189, 1320, 1454, 1517, 1482, 1457, 1393, 1233, 1412, 1351, 1146, +1108, 1033, 1019, 854, 633, 329, 173, -24, -406, -698, -956, -1365, -1737, -2181, -2630, -2760, +-3118, -3215, -3095, -2961, -2652, -2197, -2005, -1705, -1501, -1041, -716, -335, 141, 310, 638, 895, +1005, 1109, 1228, 1230, 1335, 1591, 1736, 1926, 1988, 1828, 1658, 1755, 1722, 1579, 1685, 1869, +1937, 1806, 1684, 1627, 1506, 1289, 1187, 1080, 781, 369, -344, -798, -1173, -1849, -2444, -3288, +-4182, -4713, -5024, -4983, -4575, -4011, -3679, -3333, -2775, -2185, -1893, -1521, -868, -89, 500, 1259, +1600, 1596, 1821, 1899, 1967, 1965, 2015, 2227, 2476, 2685, 2784, 2813, 2769, 2699, 2626, 2411, +2471, 2646, 2759, 2704, 2521, 2334, 1931, 1380, 747, 179, -393, -1059, -1761, -3175, -4511, -5866, +-7117, -7855, -7572, -6794, -5509, -4038, -3330, -3000, -2832, -2641, -2072, -1243, -87, 1274, 2286, 2565, +2552, 2350, 2043, 2020, 2227, 2162, 2405, 2635, 2835, 2927, 2925, 2715, 2542, 2443, 2409, 2591, +2884, 3133, 3441, 3721, 3971, 3905, 3724, 3345, 2726, 2093, 1475, 1115, 786, -571, -2720, -6066, +-9612, -12695, -13205, -10940, -7806, -4787, -2761, -2126, -4456, -7559, -8570, -6114, -2130, 856, 2639, 4565, +4962, 3866, 2462, 1360, 1294, 1933, 2793, 3329, 3876, 4722, 5097, 4735, 4194, 3632, 3364, 3424, +3671, 4300, 5036, 5585, 5794, 5341, 4358, 3529, 2887, 3127, 2943, 2925, 2173, -933, -6958, -15879, +-20542, -17729, -9833, -5095, -298, 1131, -5455, -15146, -16842, -10384, -2870, 858, 5788, 9248, 7839, 4677, +1085, -37, 366, 811, 1325, 2303, 3224, 4278, 4553, 4135, 3446, 2928, 2484, 2345, 2690, 3355, +3973, 4491, 5206, 5670, 5965, 5718, 5628, 5512, 5511, 5773, 5714, 6297, 5698, 2946, -4659, -17090, +-24429, -21078, -9010, -5462, -1384, -180, -10826, -23383, -18380, -4295, -2032, -791, 7030, 9092, 4145, 323, +-2152, -677, -649, 356, 1764, 2525, 2996, 5081, 6220, 5448, 5212, 5104, 4345, 2811, 2534, 3333, +4747, 6261, 7041, 6571, 6124, 5734, 6037, 5573, 5340, 7303, 7954, 8765, 7507, 2088, -10963, -25019, +-27251, -16444, -6373, -5666, 360, -7253, -21856, -22610, -3965, 1619, -3222, 4055, 10327, 5655, 1792, -751, +466, 916, 545, 1532, 1961, 1703, 2941, 4777, 3709, 2327, 2455, 3268, 2759, 2462, 2932, 3524, +3898, 4320, 3832, 4109, 5295, 7798, 9025, 7330, 6789, 8491, 8717, 10537, 9965, 5020, -5975, -20729, +-28264, -23901, -8094, -5423, -236, -4031, -20554, -25238, -7471, 2746, -5145, 494, 9660, 4586, 1306, -1760, +-2634, 322, 597, 1097, 2340, 1839, 3964, 6576, 5422, 3568, 4152, 3916, 2835, 2437, 3263, 3739, +4278, 4687, 4103, 3733, 5133, 7182, 8192, 6483, 5510, 8055, 9342, 11913, 12317, 7506, -4445, -22056, +-30199, -26906, -9516, -4730, 1833, -134, -19342, -26630, -9493, 3992, -3738, 264, 11587, 7732, 2749, -410, +-2207, 955, 1608, 978, 2461, 1850, 3063, 5303, 3703, 1463, 1663, 2552, 2956, 2424, 2364, 1922, +2175, 3162, 3053, 3237, 5354, 7571, 8345, 6885, 5141, 7359, 9201, 12395, 14554, 10011, -1019, -18996, +-28881, -28588, -11348, -4821, 1078, 643, -19363, -27221, -11363, 4681, -3167, -1492, 9558, 6183, 1320, -1065, +-3509, -493, 1736, 857, 2817, 3064, 4079, 7370, 5585, 2231, 2065, 2856, 3819, 3506, 3391, 2664, +2165, 2748, 2314, 2458, 4415, 6235, 7362, 6306, 4090, 6243, 8850, 12153, 15019, 11441, 2030, -15554, +-28418, -31265, -14964, -4099, 508, 5154, -13331, -27373, -15957, 3789, -417, -2944, 8720, 8467, 2850, 119, +-2856, -612, 1756, 576, 2445, 2962, 3793, 7042, 5444, 2039, 1743, 2709, 3804, 3494, 3391, 2666, +1896, 1778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 24, 19, 16, 18, 17, 20, 19, 18, 21, 19, 18, 18, 23, +23, 20, 19, 21, 26, 26, 24, 24, 24, 19, 22, 21, 22, 20, 17, 19, +19, 20, 15, 19, 19, 16, 17, 22, 21, 22, 21, 24, 26, 26, 24, 24, +32, 30, 25, 25, 30, 25, 29, 31, 27, 28, 22, 24, 24, 28, -57, -195, +-322, -429, -460, -445, -426, -346, -216, -233, -223, -118, 16, 224, 351, 464, 474, 354, +285, 203, 79, -88, -366, -694, -963, -1257, -1662, -2128, -2601, -2997, -3248, -3584, -3745, -3825, +-3869, -3852, -3832, -3749, -3677, -3500, -3235, -2888, -2489, -2108, -1892, -1462, -982, -445, 33, 519, +1083, 1406, 1523, 1620, 1864, 2084, 2151, 2144, 2132, 2092, 2045, 1972, 1814, 1560, 1302, 898, +413, -125, -694, -1271, -1996, -2589, -3174, -3818, -4450, -4949, -5422, -5680, -5744, -5706, -5509, -5209, +-4748, -4407, -4061, -3570, -3092, -2785, -2330, -1616, -524, 699, 1775, 2662, 3312, 3616, 3733, 3882, +4072, 4405, 4822, 5222, 5606, 5633, 5299, 4760, 4045, 3288, 2421, 1572, 880, 171, -646, -1545, +-2390, -3156, -3893, -4448, -4874, -4903, -4820, -4492, -4129, -3834, -3468, -3296, -3209, -3288, -3286, -3129, +-2197, -418, 1654, 3427, 4426, 4881, 4744, 4152, 3588, 3384, 3834, 4788, 5804, 6444, 6832, 6634, +6056, 5178, 4114, 3401, 2782, 2198, 1731, 949, -211, -1751, -3561, -5198, -6801, -8043, -8812, -8994, +-8525, -7726, -6865, -5902, -4998, -4167, -3987, -4520, -5867, -7176, -6656, -2445, 4427, 9627, 11131, 8020, +4302, 598, -1539, 2144, 9041, 13861, 12488, 11302, 11476, 9554, 5909, 3737, 3944, 5119, 6091, 5524, +4319, 3080, 2045, 661, -1197, -4217, -5913, -7336, -8032, -7809, -6665, -5907, -5354, -5084, -5094, -4923, +-5067, -5771, -7325, -8655, -7965, -4312, 2910, 8977, 11989, 9594, 5234, 1502, -1738, -279, 5392, 11588, +13814, 12438, 11592, 10772, 7352, 4024, 3175, 3920, 6189, 6768, 4624, 1919, 75, -1605, -4166, -6273, +-8815, -10136, -10642, -11106, -10461, -8675, -5729, -4638, -3158, -2849, -3705, -7084, -14430, -20398, -12797, 6283, +17856, 14465, 4895, 162, -5311, 2317, 15513, 14852, 9446, 12368, 12807, 7778, 7037, 6630, 5223, 6371, +8098, 9270, 8880, 7565, 6103, 5722, 4159, 1060, -1786, -6422, -8825, -8091, -8313, -8679, -8224, -8419, +-8719, -6086, -3901, -2728, -1165, -1772, -5715, -14567, -21511, -16045, 2387, 16543, 15116, 7037, 3722, -7179, +-7054, 7802, 19208, 14355, 9784, 15971, 10756, 6827, 4233, 2678, 3553, 6623, 8046, 8104, 6559, 2031, +357, 497, -1397, -3822, -7781, -12653, -14002, -12590, -11548, -9222, -6103, -4435, -2593, 308, -260, -2850, +-11508, -24248, -25571, -5134, 19314, 20540, 9427, -419, -7979, -5684, 15861, 21786, 9191, 10199, 16142, 9942, +7095, 6900, 6272, 5652, 6175, 7017, 9805, 8116, 4772, 5256, 5569, 2838, -231, -2113, -7077, -7513, +-8868, -11876, -12803, -11410, -11505, -7053, -2304, -1035, 193, 615, -3412, -12861, -24358, -23013, -4874, 15705, +17795, 8565, 1488, -8264, -9982, 6776, 20983, 13490, 8088, 16131, 11358, 5419, 5166, 4294, 4433, 6581, +6723, 7271, 7925, 3564, 155, 1098, 423, -2350, -4854, -11782, -14642, -12947, -11476, -10753, -7559, -5579, +-3613, 765, 2956, 1277, -3958, -18389, -29645, -19880, 9115, 24967, 18165, 5193, -7158, -13517, 1693, 22675, +14952, 6071, 15741, 14028, 6952, 6056, 6411, 4672, 5013, 5671, 8587, 9426, 5162, 3944, 5204, 4202, +2009, 1056, -5116, -9326, -9179, -11597, -14471, -13896, -12591, -10345, -4288, -2150, -904, 780, 254, -5689, +-18601, -26279, -16209, 7287, 20783, 14002, 3993, -6356, -11610, -1262, 16665, 16837, 6641, 12372, 13059, 5699, +3868, 5156, 4580, 6297, 6802, 6263, 7794, 6134, 1804, 430, 2060, -342, -1556, -7642, -14264, -14981, +-12477, -11858, -10114, -6764, -4285, 120, 4130, 4157, 14, -10803, -26438, -27529, -6021, 20848, 23053, 12360, +-818, -13780, -11745, 11348, 21314, 7012, 10345, 18858, 10067, 4257, 4346, 3514, 3760, 5078, 6644, 9307, +6802, 3629, 5374, 6089, 3251, 1780, -1341, -8472, -10076, -11502, -14873, -16799, -14699, -13112, -8407, -3152, +-1243, 166, 1394, -1275, -12956, -26457, -23530, -1642, 20662, 18766, 7950, -4556, -12197, -5096, 12692, 17009, +6345, 9672, 13404, 7444, 3945, 4878, 5151, 5586, 7191, 5467, 6696, 7184, 4560, 1670, 3257, 2223, +-179, -4251, -11823, -14913, -13257, -11919, -11775, -8614, -6243, -2001, 2699, 4856, 2319, -5461, -20075, -29014, +-17797, 11145, 25104, 17093, 6562, -7889, -17994, -3770, 18249, 16046, 4904, 15671, 15160, 5256, 2890, 3130, +3061, 4540, 5500, 7253, 7711, 5323, 5228, 6413, 4391, 2295, 989, -5529, -10822, -12318, -14624, -16797, +-16044, -13438, -11449, -6570, -2232, -411, 957, 731, -7366, -23708, -27308, -10815, 17231, 23385, 12627, -1355, +-12742, -9129, 8734, 17231, 7689, 8094, 13145, 7659, 3234, 4918, 5926, 5952, 7605, 6925, 6049, 6824, +5577, 3272, 2475, 3785, 1419, -947, -8637, -13950, -14866, -12421, -12665, -10102, -7487, -3846, -219, 2656, +3107, -1627, -12965, -26645, -24908, -2258, 22650, 20953, 12157, 1325, -14831, -14925, 6574, 19335, 7977, 7237, +17727, 10554, 3964, 1784, 2247, 3391, 5162, 6360, 7259, 6646, 5319, 5987, 4606, 2871, 1277, -1970, +-9410, -12548, -15297, -16576, -17390, -15274, -13128, -9827, -4299, -476, 844, 917, -4228, -20131, -29018, -17335, +11395, 26673, 17376, 3943, -11301, -11662, 5345, 17893, 7681, 6080, 13567, 9204, 4135, 4788, 6226, 5575, +7359, 7784, 7192, 6523, 5657, 4747, 2821, 3770, 1863, 0, -6555, -11844, -15039, -12786, -13145, -11484, +-9566, -5981, -3212, -71, 2395, 401, -7821, -22428, -27792, -13387, 15765, 24747, 15918, 6524, -7761, -17428, +-2396, 16266, 14354, 3952, 13719, 14621, 6443, 2028, 829, 2386, 4373, 6157, 6919, 7062, 6070, 5559, +4287, 3459, 1590, -812, -7642, -12923, -15850, -16915, -17516, -16337, -13425, -10748, -6511, -1524, 694, 707, +-2785, -17214, -29779, -21541, 6603, 27248, 20739, 7848, -8683, -13913, 1741, 18771, 10992, 4399, 14272, 12532, +5372, 2739, 3286, 3435, 5447, 7093, 7987, 7411, 5942, 5514, 4004, 3606, 1863, -378, -6998, -12251, +-15504, -16404, -16993, -16032, -13330, -10507, -6364, -1528, 716, 707, -3115, -17609, -29422, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, -600, +-417, -388, -296, -366, -357, -57, 115, 114, 120, 192, 254, 449, 506, 737, 674, 629, +766, 826, 696, 691, 483, 406, 274, 195, 40, -202, -302, -362, -476, -559, -569, -410, +-316, -346, -175, 57, 157, 197, 231, 307, 287, 277, 249, 195, 187, 95, 85, 50, +0, -216, -321, -230, -342, -488, -566, -459, -401, -570, -451, -452, -498, -120, 59, 54, +95, 380, 643, 929, 1180, 1246, 1394, 1549, 1840, 1767, 1456, 1052, 750, 207, -291, -881, +-1501, -1935, -2144, -2214, -1928, -1694, -1339, -1120, -886, -458, -318, -156, -143, -259, -303, -343, +-207, -59, 304, 810, 1446, 1950, 2170, 2262, 2211, 1947, 1482, 884, 163, -638, -1404, -1955, +-2311, -2393, -2430, -1999, -1424, -689, -18, 934, 1472, 1915, 1868, 1569, 1515, 1409, 1702, 2015, +2461, 2401, 2473, 2388, 1344, 142, -953, -2020, -3106, -3677, -3917, -3862, -3593, -2965, -2240, -1879, +-1282, -766, -670, -680, -389, -658, -590, -177, 201, 800, 1765, 2808, 4520, 6420, 7584, 7478, +6270, 4387, 1947, -1040, -3062, -4752, -5997, -6421, -6125, -5386, -4327, -3038, -1239, 933, 2891, 4308, +3881, 2104, -395, -2508, -3057, -2174, -217, 2921, 6518, 8808, 8975, 7360, 5058, 2306, -716, -3050, +-5076, -6091, -5999, -5465, -4664, -4526, -4434, -4254, -4484, -5337, -3576, 1828, 9228, 8447, 2112, -5848, +-4786, -2248, -1078, 4780, 7855, 10240, 11151, 9967, 6234, 2590, -524, -1831, -3249, -4416, -6889, -7002, +-6778, -5949, -6053, -6283, -5675, -1433, 8060, 12247, 6764, -2686, -9934, -7742, -5912, -1031, 4719, 10792, +15368, 14044, 11311, 6353, 2368, -411, -1640, -4196, -4031, -4156, -3757, -4526, -5474, -8268, -10404, -15348, +-13004, 71, 19958, 17337, -1199, -8886, -10677, -9634, -7798, 221, 6182, 14564, 15698, 11865, 9251, 5862, +1956, 2451, 1390, -1394, -3156, -4639, -4404, -4622, -6475, -9314, -12199, -17418, -9604, 7797, 26860, 12161, +-4494, -9763, -14262, -15514, -4558, 6309, 11710, 17584, 12412, 9504, 10628, 5239, -154, 1159, 876, 1220, +-701, -3607, -4024, -4227, -7582, -11901, -17533, -21377, -8757, 12379, 28048, 6348, -5241, -10754, -15848, -15673, +-1819, 6595, 12739, 16040, 10730, 9281, 10884, 5001, 1272, 2810, 1647, 1355, -251, -1422, -1897, -3411, +-8598, -13570, -19926, -23174, -8601, 14635, 31361, 6144, -3825, -10762, -21206, -19479, -837, 10636, 16338, 14773, +8849, 10007, 10488, 3270, 294, 2372, 3130, 3061, 50, -854, -2168, -4547, -8988, -12868, -18411, -22789, +-10866, 9645, 29380, 11345, -4994, -8993, -19497, -18956, -4101, 10238, 15300, 15126, 9764, 9758, 10162, 4647, +-119, 2522, 4346, 4264, 1970, 490, -2999, -5985, -9483, -12606, -17249, -22972, -13007, 7303, 29178, 14981, +-4443, -6988, -22047, -21447, -4787, 11277, 15435, 14176, 9378, 8445, 9474, 5662, 566, 3288, 5730, 5377, +1753, -663, -4054, -6472, -8954, -11461, -15096, -21794, -17705, 744, 23811, 23448, -2567, -3428, -17942, -23289, +-10899, 8955, 16047, 15048, 9196, 8037, 8963, 6860, 927, 2853, 6583, 5987, 2790, -1002, -3968, -5966, +-7919, -10486, -14192, -20942, -19256, -1451, 20496, 26279, -286, -2439, -16454, -24752, -13304, 7308, 15998, 16401, +10371, 7652, 8538, 8200, 2284, 2946, 6552, 5542, 1801, -1584, -3332, -5596, -7262, -10114, -13643, -19489, +-20498, -5052, 16730, 30191, 3946, -1917, -13798, -27462, -17016, 5645, 17040, 17694, 10946, 8306, 8789, 8461, +2198, 1850, 5968, 5609, 2834, -879, -2502, -4816, -7068, -10154, -13345, -18021, -21151, -7812, 13845, 31621, +7044, -3641, -12684, -27909, -18611, 3503, 16741, 18345, 11875, 8210, 8510, 8310, 2427, 701, 5596, 5553, +2920, -408, -1752, -4752, -7725, -10406, -12489, -16735, -20816, -9281, 12315, 32154, 9611, -3978, -10478, -28072, +-19933, 3192, 17916, 18834, 11946, 8959, 8359, 7584, 2495, 652, 5881, 6896, 4618, 769, -1388, -4884, +-7982, -9940, -11702, -16158, -21993, -11569, 9445, 31223, 12902, -5006, -8297, -27137, -21524, 676, 17079, 19076, +11828, 9013, 7477, 6668, 2846, 335, 5193, 7339, 4962, 931, -1559, -5306, -8163, -9236, -11084, -15218, +-21506, -12630, 7796, 30563, 15505, -4990, -6695, -26852, -22973, -379, 17662, 19705, 12019, 9076, 7618, 6763, +3542, 973, 5247, 7887, 5456, 1234, -1516, -5266, -8373, -9155, -10863, -15129, -21988, -14147, 5650, 29197, +18650, -4346, -4768, -25537, -24528, -2135, 16992, 19310, 11442, 8758, 7701, 6933, 4174, 937, 5048, 8141, +6210, 1865, -1191, -4763, -8062, -8386, -10105, -14615, -21419, -15654, 3568, 27480, 21325, -3871, -3468, -23974, +-25373, -3062, 16841, 19306, 11049, 8830, 7871, 7051, 4795, 1632, 4777, 7871, 6244, 2005, -1267, -4651, +-8583, -8848, -10294, -14661, -21175, -16472, 2188, 25980, 24037, -3101, -2497, -22892, -26536, -4712, 15635, 19648, +10822, 8546, 8268, 7045, 5117, 1296, 3915, 8079, 7020, 2531, -929, -4161, -8632, -8776, -10100, -14439, +-21000, -17574, 663, 24133, 25980, -2116, -2046, -21791, -27234, -5922, 15124, 19881, 10705, 8921, 9218, 7185, +5079, 951, 3275, 7905, 6903, 2120, -1233, -4381, -8552, -8694, -9891, -13850, -20076, -17753, -202, 22960, +27461, -1111, -2156, -20152, -27821, -7424, 14228, 20050, 11103, 9115, 9444, 7493, 5925, 1165, 3178, 8062, +6885, 2458, -818, -4116, -8825, -9416, -10311, -14082, -20520, -18634, -1036, 22488, 28164, -909, -2058, -19614, +-28169, -7565, 14645, 19648, 10308, 8858, 9499, 6964, 5334, 734, 3083, 7785, 6578, 2398, -471, -3588, +-8336, -9376, -10197, -13982, -20405, -18858, -1615, 21640, 29289, -100, -2117, -18527, -28345, -8321, 14050, 19414, +10243, 9276, 10481, 7520, 5975, 1176, 2892, 7550, 6617, 2813, -478, -3942, -9091, -9882, -10338, -13959, +-20337, -18763, -1603, 21243, 29870, 214, -2017, -18480, -28538, -8197, 14140, 19066, 9472, 9013, 10559, 7567, +5934, 1486, 3047, 7865, 6712, 2810, -609, -3723, -9071, -9747, -10453, -14128, -20638, -18892, -1653, 20919, +30143, 361, -1927, -17898, -28700, -8737, 13924, 18319, 9838, 10032, 10612, 7326, 6395, 1605, 2930, 7569, +6033, 2170, -886, -3972, -9194, -10250, -10335, -13676, -20419, -18990, -1600, 20553, 30133, 449, -2107, -17999, +-29135, -8976, 13875, 18348, 9589, 10020, 10556, 7356, 6623, 1849, 2639, 7477, 5982, 2296, -614, -3569, +-8772, -10362, -10420, -14098, -20962, -19508, -1936, 20210, 30401, 1243, -1658, -17932, -29105, -8847, 13975, 18132, +9279, 10789, 11102, 7701, 6120, 1654, 2305, 7259, 5842, 2173, -720, -3542, -8413, -10013, -10036, -13948, +-21130, -19260, -1868, 19887, 30360, 1199, -2149, -18273, -29177, -8697, 14525, 18034, 8790, 11181, 11399, 7128, +5791, 1534, 2124, 7545, 5854, 2238, -420, -3681, -8699, -10193, -10735, -14776, -21758, -19367, -1346, 20943, +30658, 1060, -1993, -18651, -28951, -8525, 14340, 17180, 8450, 11830, 10938, 6862, 5989, 1704, 2488, 7836, +5897, 2267, -158, -3724, -8508, -9939, -10966, -14646, -21853, -19313, -915, 21248, 30379, 822, -1911, -19038, +-28639, -7308, 15178, 17036, 7643, 12294, 11355, 6580, 5712, 1796, 2499, 8045, 5929, 2173, -37, -3952, +-8675, -9760, -10985, -14450, -21839, -18939, -361, 21646, 29970, 192, -2173, -19372, -28223, -6945, 14919, 16118, +7395, 12164, 10699, 6673, 5935, 1892, 2550, 8198, 5761, 1857, -366, -4477, -9100, -9727, -11213, -14656, +-22223, -18548, 284, 22194, 29052, -599, -2470, -19592, -27309, -6037, 15154, 15595, 6953, 12046, 10255, 6484, +6052, 2059, 2628, 7808, 5343, 1207, -525, -4400, -8672, -9100, -11020, -14568, -22342, -18506, 194, 22353, +28523, -1098, -1984, -19716, -26571, -4972, 15538, 15066, 6289, 12344, 10040, 6402, 6431, 2422, 2783, 7951, +5098, 585, -871, -4792, -8600, -8505, -10953, -14678, -22314, -18086, 691, 22955, 28155, -1195, -1567, -19996, +-25658, -3823, 15759, 13691, 5208, 12304, 9823, 6560, 6392, 2354, 2935, 7952, 5068, 372, -905, -4749, +-8670, -8386, -11508, -15478, -23273, -17890, 1297, 23908, 27255, -1593, -1647, -20309, -24971, -3227, 15979, 13265, +5122, 12426, 9708, 6572, 6324, 2417, 3106, 7898, 4916, 181, -958, -4729, -8605, -8297, -11481, -15473, +-23280, -17890, 1297, 23908, 27255, -1593, -1647, -20309, -24971, -3227, 15979, 13265, 5122, 12426, 9708, 6572, +6324, 2417, 3106, 7898, 4916, 181, -958, -4729, -8605, -8297, -11481, -15473, -23280, -17890, 1365, 24100, +27112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, -398, -767, -589, -367, -107, 120, 299, 337, 438, 565, 665, 822, 1050, 973, +801, 929, 997, 919, 1009, 939, 939, 1070, 1050, 1036, 937, 810, 696, 744, 454, 338, +59, -114, -503, -871, -1052, -1393, -1671, -1777, -1729, -1809, -1978, -2144, -1916, -1549, -1314, -1137, +-1116, -928, -621, -235, 168, 474, 590, 948, 1154, 1353, 1630, 1726, 1848, 1956, 1821, 1516, +1353, 1079, 779, 766, 592, 435, 318, 192, -73, -163, -265, -86, -64, -194, -522, -606, +-968, -1264, -1380, -1737, -2243, -2330, -2364, -2516, -2422, -2223, -2110, -1699, -1583, -1340, -914, -444, +-119, 376, 812, 1237, 1558, 1859, 2222, 2562, 2899, 3227, 3279, 3289, 2892, 2406, 1665, 1069, +645, -25, -548, -921, -1237, -1605, -1679, -1705, -1378, -1147, -870, -512, -332, -491, -666, -718, +-1116, -1593, -1991, -2209, -2483, -2727, -2514, -2315, -2097, -1819, -1394, -909, -440, 220, 585, 762, +1044, 1615, 1986, 2427, 2797, 3322, 3944, 4535, 4833, 4729, 4089, 3284, 2018, 997, 122, -883, +-2000, -2948, -3759, -4400, -4739, -4855, -4297, -3288, -2221, -1063, -89, 330, 424, 399, -21, -606, +-1138, -1776, -2223, -2309, -2513, -2308, -1791, -1292, -677, 76, 546, 695, 810, 696, 886, 1034, +1508, 2024, 2604, 3200, 4211, 5750, 6612, 6962, 5983, 4379, 2601, 1344, 420, -249, -1327, -3469, +-5818, -8231, -9823, -8878, -7618, -6271, -3944, -1339, 631, 2097, 2349, 1806, 1345, 670, -181, -503, +-868, -1137, -1179, -967, -577, 134, 967, 1372, 1228, 769, 81, -477, -949, -1235, -1273, -876, +56, 1414, 3016, 5391, 7328, 8747, 8745, 6657, 3554, 1568, 1419, 3643, 4416, 89, -8049, -13361, +-15958, -15428, -11723, -8120, -5016, -2049, 2253, 3343, 3052, 1787, 787, 202, 1395, 2261, 2386, 1747, +1297, 2219, 3612, 4553, 4825, 3272, 1248, -629, -2048, -3120, -3420, -4240, -5488, -5916, -5392, -2795, +687, 3452, 6333, 8472, 11093, 11413, 8300, 3340, 1510, 5434, 12987, 9799, -5825, -19619, -20987, -18252, +-16288, -9110, -4698, -4482, 163, 4234, 2508, 239, -1462, -1237, 1636, 3920, 4730, 3927, 4172, 7102, +10032, 10977, 7563, 1932, -2369, -3774, -3878, -1879, 521, -1395, -7830, -15914, -14884, -7848, -2818, 962, +4582, 9149, 12164, 15780, 14066, 7733, 464, -57, 8199, 19238, 13482, -9532, -25654, -20632, -15801, -15418, +-6077, -4623, -5937, -102, 1028, -3028, -3812, -4623, -2996, 2280, 6726, 7511, 8844, 11523, 13560, 13221, +8558, 2284, -4005, -8401, -3818, 11151, 16303, 941, -22217, -29918, -16738, -13511, -6193, 195, 2824, 8483, +13022, 12038, 9656, 8301, 7405, 6077, 4259, 8105, 18596, 17433, 949, -21281, -20695, -10154, -14950, -12891, +-6091, -5325, -6230, -1862, -5049, -9716, -10061, -6166, 4133, 11524, 11826, 11475, 11170, 12105, 12010, 7941, +-253, -8006, -5193, 14565, 26894, 8282, -21385, -29684, -18529, -21563, -16538, -4334, -2310, 2218, 10962, 9953, +6690, 4873, 4807, 9026, 14063, 11335, 5308, 5503, 17221, 20365, 3008, -18941, -18450, -11597, -19372, -13357, +-3670, -1125, -5980, -8922, -15266, -15611, -6817, 2482, 10730, 14559, 13246, 10178, 10807, 13219, 10152, 919, +-6164, -667, 15935, 28430, 8126, -24674, -26982, -15664, -23940, -17253, -5717, -5471, -246, 7303, 6690, 4215, +2945, 2412, 8893, 13013, 15431, 12770, 5122, 2837, 13744, 23177, 11418, -11791, -25402, -15965, -15929, -15780, +1450, 1884, -16532, -24310, -16394, -6663, 1070, 8341, 11297, 12565, 11317, 11451, 11185, 10951, 5702, -1283, +-2097, 8558, 23415, 18726, -7793, -28780, -18262, -17613, -22754, -9021, -5266, -7477, -406, 4038, 3110, 2298, +1144, 4860, 13351, 14787, 13313, 11629, 5563, 856, 7898, 23520, 20366, -4901, -25106, -18416, -13808, -18098, +-1603, -2135, -21932, -28344, -10176, 636, 5980, 8703, 7956, 10783, 12412, 11984, 9324, 8137, 4646, -244, +3169, 15069, 23908, 10938, -14399, -25408, -14620, -19673, -18354, -4719, -6780, -11350, -3234, 2527, 2253, 1340, +1028, 6739, 14143, 14747, 12824, 11016, 5829, 369, 5951, 23331, 25842, 700, -24394, -22614, -13851, -21123, +-6923, -768, -19650, -28276, -8326, 4448, 6144, 6040, 4940, 9895, 12078, 10865, 8496, 7675, 5987, 2068, +5388, 17021, 23883, 8637, -16202, -24933, -14501, -19294, -15943, -2010, -7259, -15907, -5740, 2475, -57, -269, +2601, 7943, 15237, 16281, 12304, 10375, 7207, 396, 3985, 21112, 28186, 6348, -22558, -25062, -12732, -21204, +-12057, -1015, -15975, -26484, -8532, 4633, 3934, 5321, 4943, 7917, 10571, 10801, 9327, 8474, 8163, 3513, +4127, 15272, 24114, 11292, -13295, -24064, -14332, -17793, -16845, -2562, -7362, -18112, -11314, 818, 1409, 1237, +3753, 7773, 14947, 16968, 12779, 8672, 6211, 1339, 3794, 18522, 29405, 11225, -20012, -27172, -13401, -19878, +-17648, -1653, -8930, -23631, -12159, 3401, 3760, 2471, 863, 5406, 11380, 12453, 10119, 8650, 10104, 6371, +3311, 11908, 23158, 15908, -7963, -23303, -15945, -15273, -21048, -6996, -5253, -17060, -13670, 1418, 3009, 1031, +2887, 7376, 14829, 16536, 10923, 6870, 7758, 5343, 3929, 14398, 27173, 16754, -13583, -27220, -15436, -16333, +-21229, -3723, -3018, -20342, -17771, 747, 2225, -680, 299, 5169, 12552, 13579, 12117, 9879, 10011, 7616, +2823, 7865, 20963, 20685, -1525, -21414, -19435, -13919, -23322, -11101, -2044, -14015, -17018, -759, 3342, -217, +2684, 7301, 12387, 14827, 10953, 6842, 8820, 8518, 4127, 8756, 23236, 22260, -4388, -24210, -18196, -13168, +-23598, -9717, -388, -16018, -22665, -4846, 2415, -474, 1484, 5098, 11156, 13425, 13004, 9783, 8655, 9192, +4167, 5212, 17544, 23584, 5051, -18703, -22202, -12159, -21525, -16538, -1874, -8886, -17873, -6468, 2146, -216, +2949, 6382, 10429, 13783, 11869, 7706, 9179, 11663, 5730, 4029, 17560, 26921, 7495, -18806, -22818, -12442, +-22057, -18380, -1179, -9140, -22430, -10917, 2437, 704, 1225, 3380, 8121, 12785, 14043, 10816, 7856, 10099, +7407, 3404, 11101, 23046, 13077, -12255, -23797, -14194, -17151, -21466, -3140, -3384, -18174, -14019, 841, 580, +1698, 5111, 8209, 12395, 13207, 10457, 8522, 12097, 8762, 2683, 11514, 26045, 16924, -10263, -24151, -16314, +-17093, -23992, -5199, -2654, -18824, -17504, 157, 1564, -246, 2369, 6633, 12357, 14359, 11995, 7528, 9872, +10462, 3284, 4768, 19375, 20089, -2322, -20516, -17797, -12766, -23167, -10811, -888, -12550, -18305, -3498, 1375, +580, 4451, 6920, 11804, 13798, 11878, 8135, 10434, 11561, 4499, 5679, 20153, 23787, 1564, -20972, -22325, +-13691, -23476, -13861, 679, -10342, -20498, -6555, 1700, -1969, 1620, 5238, 9736, 14344, 13880, 8265, 7991, +11568, 5536, 590, 12684, 24349, 9608, -14490, -22051, -13245, -20783, -19352, -1175, -4945, -18180, -10462, 1781, +464, 2955, 5628, 9233, 12909, 12631, 8801, 8052, 12808, 9111, 2924, 11176, 24502, 13951, -13197, -25727, +-14652, -17037, -21980, -2780, -2682, -18624, -15946, -371, -76, 1315, 4339, 7452, 13196, 14568, 10343, 6221, +10086, 9055, 808, 5277, 21896, 20115, -4274, -21994, -17684, -14554, -23404, -7313, 553, -13229, -16599, -2410, +800, 1428, 5257, 6754, 11133, 12940, 10941, 7643, 11188, 12587, 4132, 3874, 18344, 21794, -1123, -22315, +-19595, -11586, -23089, -12463, 162, -12223, -20108, -5999, 1220, -152, 3566, 6525, 11200, 13818, 11369, 6080, +7744, 11520, 4075, 677, 14297, 24412, 8988, -15279, -22620, -13342, -21762, -17971, 362, -5517, -17933, -9850, +1372, 927, 4290, 5867, 8663, 12426, 12677, 8689, 8452, 13395, 7596, 217, 10054, 23660, 12222, -12834, +-22544, -12733, -18601, -21455, -2654, -4182, -18374, -14035, 127, 621, 2819, 5927, 8733, 12208, 12056, 8537, +6872, 11480, 8477, -301, 6484, 22704, 19191, -5689, -22814, -17099, -16257, -23300, -5529, 91, -13694, -16152, +-1685, 2262, 3115, 5088, 6549, 10835, 12823, 10895, 7858, 11772, 11251, 1414, 3272, 19910, 21864, -1341, +-21446, -18485, -14182, -24650, -10109, 633, -12378, -18847, -4365, 1494, 1138, 5063, 7344, 10267, 11966, 11045, +7679, 9352, 10486, 1787, 1384, 17128, 23807, 3884, -19092, -20742, -14090, -23550, -12158, 987, -10609, -18214, +-4962, 1658, 1377, 5034, 7308, 10249, 11964, 11045, 7679, 9352, 10486, 1787, 1384, 17128, 23807, 3884, +-19092, -20742, -14090, -23550, -12158, 987, -10609, -18214, -4962, 1658, 1377, 5034, 7308, 10249, 11964, 11045, +7979, 9653, 8261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 227, 386, 391, 331, 214, 202, 434, 741, 1162, 783, 256, -81, +-356, -941, -1286, -859, -1135, -1337, -1131, -966, -860, -290, 890, 761, 280, 351, 792, 1203, +478, 414, 936, 1693, 1874, 445, 272, 1296, 2153, 1384, -495, -603, -741, -1441, -2545, -2675, +-1019, -449, -1633, -3090, -2388, -1233, -2040, -2387, -974, 614, 703, 539, 1063, 1346, 1348, 928, +328, 227, 273, 197, 102, 53, -139, -592, -966, -1295, -1351, -1355, -1184, -830, -217, 635, +862, 1366, 2242, 2634, 2722, 2703, 2928, 2927, 3050, 3081, 2845, 2659, 2304, 2056, 1362, 298, +-260, -566, -1485, -2637, -2695, -2082, -1580, -1550, -1800, -1721, -1621, -1792, -2109, -1936, -1444, -982, +-516, -388, -174, 607, 1268, 1440, 1309, 1087, 438, -506, -919, -926, -914, -1003, -1070, -1104, +-1138, -1194, -1074, -643, -90, 412, 930, 1443, 1793, 2190, 2698, 3063, 3435, 3895, 4060, 3740, +3370, 3006, 2258, 1237, 266, -505, -1017, -1323, -1545, -1777, -1667, -1450, -1251, -918, -828, -797, +-828, -927, -1116, -1172, -965, -776, -586, -492, -142, 223, 408, 521, 505, 424, 34, -545, +-1046, -1274, -1404, -1701, -1823, -1789, -1592, -1473, -1200, -729, -433, -61, 313, 530, 826, 1438, +2243, 3080, 4016, 4856, 5364, 5533, 4835, 3522, 2196, 884, -330, -1589, -2554, -3093, -3170, -2647, +-1867, -1169, -551, -83, -118, -577, -1164, -1499, -1537, -1597, -1519, -928, -67, 377, 508, 676, +785, 383, -239, -476, -457, -524, -934, -969, -781, -1111, -1492, -1622, -1540, -1406, -1311, -1079, +-689, -373, -491, -520, 4, 823, 1751, 3147, 4975, 6824, 8133, 8372, 7550, 6086, 4039, 1420, +-986, -2742, -4099, -5141, -5295, -4422, -2942, -1038, 617, 1416, 1240, 320, -957, -2204, -2966, -2885, +-1995, -848, 282, 1224, 1790, 1993, 1662, 895, -251, -1381, -1951, -2013, -1879, -1501, -912, -471, +-528, -945, -1426, -1592, -1616, -1632, -1504, -1371, -1489, -1866, -2089, -1619, -16, 2739, 5954, 9289, +11963, 12897, 11878, 9318, 6084, 2648, -507, -3432, -5992, -7467, -7874, -7248, -5284, -1835, 1744, 3829, +4052, 2354, -391, -3031, -5038, -5549, -4040, -1335, 1352, 3455, 4860, 5109, 3974, 1756, -880, -3225, +-4995, -5710, -5031, -3165, -1121, 442, 1045, 562, -511, -1690, -2441, -2642, -2216, -1736, -1935, -2918, +-4140, -4416, -2739, 1033, 6215, 12006, 16625, 18320, 16876, 13427, 9314, 4954, 478, -4053, -7890, -10135, +-11420, -11615, -8902, -2689, 3551, 7072, 7980, 6107, 1359, -4550, -8574, -9303, -7356, -3535, 1377, 6010, +9030, 9745, 8156, 4590, -308, -5541, -9945, -11917, -10875, -7650, -3324, 878, 3713, 4031, 2277, -485, +-3200, -4636, -4504, -3394, -2711, -3560, -5530, -6538, -4647, -8, 6665, 13909, 19656, 21541, 19524, 15539, +11962, 10204, 6465, -1693, -10743, -14759, -14923, -14779, -13276, -7167, 3377, 11578, 12912, 8875, 3282, -2657, +-9439, -13803, -13179, -8050, -1056, 5938, 11485, 14402, 14245, 10174, 2654, -6299, -14112, -18781, -18933, -14978, +-8539, -1016, 5172, 7714, 6406, 2454, -2008, -5675, -7241, -6614, -5067, -4658, -5981, -6970, -4764, 513, +8046, 16266, 22101, 23463, 19718, 14718, 12740, 14142, 13770, 3959, -9581, -16678, -16819, -16396, -16170, -10302, +1492, 12747, 16381, 12308, 6124, 282, -6752, -14439, -17703, -13817, -5932, 2262, 10229, 17160, 20019, 16872, +8057, -3664, -14640, -22470, -25384, -22938, -15921, -6238, 3315, 9861, 11406, 7934, 2011, -3343, -6962, -8706, +-8667, -7926, -7833, -7416, -3948, 2254, 10181, 18729, 24819, 25692, 20418, 13248, 11334, 15677, 18071, 8127, +-8060, -16320, -15863, -15524, -18234, -15294, -1128, 14720, 18860, 12613, 7612, 5156, -2699, -14344, -20151, -16809, +-9364, -1854, 6468, 15545, 21698, 20777, 12180, -340, -12516, -22124, -27472, -27702, -22685, -13003, -1412, 8115, +12336, 11000, 6399, 615, -5167, -9302, -10725, -10804, -10875, -9498, -4820, 2402, 11278, 20822, 27213, 27819, +21514, 12612, 10262, 16111, 19929, 9847, -7284, -15630, -14692, -13799, -18087, -17764, -3614, 14044, 18881, 11900, +7885, 8051, 1174, -12126, -20529, -18227, -11054, -4735, 2803, 12978, 21422, 22119, 13717, 1370, -10431, -20617, +-27658, -30205, -26899, -17752, -5566, 5633, 11587, 11835, 8656, 3658, -2404, -8067, -11350, -12227, -12419, -11219, +-6474, 1488, 11681, 22255, 29186, 29996, 23192, 13396, 10748, 17208, 20984, 10041, -7599, -15402, -13907, -12671, +-17024, -17789, -4540, 12853, 17998, 11021, 7446, 8673, 2596, -10332, -19506, -18530, -11932, -5932, 1193, 11262, +20134, 21506, 13496, 1522, -9590, -19497, -27040, -30373, -28242, -20272, -8467, 3061, 9833, 11174, 9070, 4947, +-717, -6369, -10074, -11913, -13040, -11818, -6767, 849, 10850, 21812, 29457, 30533, 23805, 14401, 11854, 18692, +22550, 11024, -7494, -15501, -13574, -12088, -16177, -17426, -4786, 12515, 17541, 10550, 6556, 8784, 4002, -9203, +-19292, -18652, -11885, -6859, -679, 9724, 19203, 20875, 12871, 851, -9666, -18831, -26461, -30435, -28904, -21433, +-10063, 1475, 8552, 10491, 8914, 5282, 427, -4970, -9039, -11108, -12194, -11112, -6585, 655, 10389, 21394, +29218, 30802, 24411, 15294, 12829, 19400, 23616, 12072, -6401, -14705, -13103, -12046, -16784, -17713, -4934, 12622, +17122, 9411, 5890, 8795, 4653, -8469, -18657, -18265, -12133, -7879, -2984, 7167, 17897, 20688, 13254, 1338, +-8879, -17634, -25467, -29862, -28903, -21766, -10620, 362, 7136, 9440, 8671, 5601, 1119, -3857, -7695, -10268, +-12151, -11515, -7209, -57, 9473, 20488, 28923, 31097, 25405, 16588, 13935, 20367, 24066, 12099, -6576, -15023, +-13391, -12362, -16553, -16854, -4867, 10777, 15287, 9182, 6127, 8457, 4283, -8095, -18116, -18474, -13114, -9431, +-4948, 4921, 16007, 19604, 13054, 1673, -8335, -16576, -24131, -28616, -28141, -21629, -11013, -909, 5527, 8267, +8232, 6054, 2169, -2367, -6258, -9167, -11578, -11945, -8264, -1232, 8173, 19282, 28360, 31517, 26362, 17784, +15001, 21154, 24889, 12695, -6560, -15774, -14140, -12450, -16012, -16306, -4755, 10653, 15123, 9030, 5832, 8202, +4373, -7890, -18023, -18556, -13291, -9718, -5437, 4276, 15406, 19248, 12891, 1611, -8262, -16346, -23813, -28305, +-27917, -21543, -11049, -993, 5458, 8240, 8232, 6061, 2169, -2172, -5787, -8683, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, -96, -52, +121, 204, 44, 292, 376, 246, 159, -123, 123, -43, -46, -111, -146, 127, 118, 169, +-51, -188, -257, -329, -578, -352, -115, -124, 193, 316, 545, 839, 403, 389, 278, -337, +-266, 27, 294, 502, 398, 822, 109, 363, 1156, 1702, 2040, 1025, 250, 845, 231, -368, +-633, -624, -1408, -1835, -1504, -1550, -1240, -1043, 100, 307, -957, -944, 499, 664, -281, -1444, +-726, -378, -461, -643, -417, 72, -412, -630, -487, -519, -945, -781, -228, -194, -505, -29, +1248, 2315, 2659, 2801, 2809, 2425, 2127, 1910, 1265, 556, 228, -56, -660, -1036, -1091, -957, +-1025, -1110, -819, -628, -462, -90, 184, 304, 33, -360, -324, -237, -334, -549, -548, -582, +-742, -957, -868, -639, -550, -449, -745, -866, -889, -584, -15, 512, 1374, 2089, 2738, 3153, +3091, 3068, 2857, 2189, 1049, -193, -1041, -1874, -2199, -2410, -2566, -2208, -1430, -600, -134, 168, +630, 896, 849, 553, 171, -231, -320, -203, -504, -795, -780, -495, -328, -331, -575, -898, +-1193, -1274, -1530, -1666, -1297, -575, 338, 1257, 2490, 3438, 4340, 4603, 4395, 3535, 2204, 879, +-345, -1493, -2561, -3207, -3223, -2624, -2125, -1477, -606, 229, 739, 1079, 1174, 1076, 734, 381, +75, -289, -523, -651, -592, -531, -474, -352, -431, -711, -1061, -1593, -2133, -2373, -2371, -1987, +-1033, 318, 1830, 3255, 4407, 5453, 5789, 5215, 4085, 2803, 1209, -678, -2316, -3482, -4281, -4541, +-4135, -3235, -2103, -1057, 117, 1296, 1828, 1789, 1818, 1783, 1254, 497, -109, -349, -584, -838, +-932, -827, -810, -697, -832, -1136, -1871, -2530, -3150, -3511, -3267, -2182, -180, 2086, 4317, 6233, +7654, 7948, 7347, 5839, 3754, 1165, -1343, -3292, -4726, -5711, -5902, -5025, -4083, -2704, -1025, 692, +2123, 2657, 2837, 2807, 2393, 1528, 666, -41, -497, -738, -947, -1131, -864, -679, -734, -1149, +-1706, -2680, -3783, -4511, -4942, -4535, -3189, -892, 2033, 5218, 8035, 9946, 10500, 9783, 7952, 5181, +1809, -1556, -4410, -6463, -7509, -7636, -6886, -5343, -3439, -1647, 182, 1797, 2839, 3300, 3452, 3289, +2753, 1901, 1012, 325, -446, -1104, -1417, -1480, -1461, -1476, -1712, -2042, -2935, -4304, -5429, -6161, +-6123, -4842, -2094, 1516, 5342, 9198, 12201, 13647, 13262, 10894, 7561, 3486, -1005, -4879, -7574, -9586, +-10213, -9391, -7537, -4907, -2512, -81, 2353, 3770, 4347, 4534, 4514, 4049, 2813, 1715, 484, -414, +-1241, -1792, -1852, -1862, -1849, -1880, -2017, -3073, -4875, -6697, -8193, -8661, -7681, -4837, -124, 5284, +10604, 14790, 17245, 17647, 15506, 11185, 5880, 180, -5406, -9681, -12252, -12984, -12006, -9754, -6540, -3176, +-279, 2362, 4441, 5340, 5336, 5025, 4752, 3930, 2571, 1162, -50, -991, -1769, -2379, -2446, -2206, +-2089, -2355, -3194, -4959, -7388, -9843, -11368, -10919, -7675, -2298, 4319, 11119, 16439, 19872, 21235, 20094, +15901, 9505, 2336, -4439, -10288, -14279, -15819, -14869, -12373, -8360, -4384, -825, 2228, 4795, 6735, 6562, +5691, 4945, 4574, 3503, 1665, -103, -1257, -2159, -2839, -3219, -2991, -2465, -2190, -2642, -4190, -7121, +-10533, -12930, -13225, -10819, -5240, 2478, 10491, 16989, 21656, 24226, 24073, 20447, 13846, 5833, -2852, -10395, +-15657, -17798, -17386, -14557, -10148, -5205, -1448, 1740, 5341, 7906, 8415, 6744, 5398, 5014, 3927, 1717, +-731, -2601, -3727, -4256, -3993, -3148, -2605, -1623, -1534, -2693, -6135, -10584, -13963, -15154, -13140, -7638, +452, 8751, 16101, 21614, 25549, 26209, 23532, 17801, 9667, -164, -9834, -16556, -19569, -19138, -16371, -11337, +-6232, -2300, 1567, 5948, 9139, 8934, 7385, 6117, 5491, 3879, 1005, -1016, -2853, -4493, -5348, -5139, +-3449, -2186, -1162, -668, -1944, -5290, -10083, -13672, -15935, -14756, -9390, -965, 7621, 14745, 20473, 24956, +27846, 27003, 20971, 11021, 437, -8637, -14699, -18882, -20207, -17583, -12528, -7887, -3817, -23, 4796, 9871, +11194, 9654, 6794, 4910, 5061, 3554, -1159, -6231, -8489, -7124, -5371, -3846, -2788, -1272, 808, 197, +-3520, -8844, -13880, -16624, -15553, -10163, -2751, 5555, 13861, 21077, 26077, 28023, 27150, 22794, 14323, 2913, +-7866, -15566, -19474, -19954, -17706, -13101, -8165, -4395, -651, 4889, 9656, 11241, 9484, 6814, 5457, 4692, +2858, -1150, -5903, -9057, -8952, -7215, -5150, -3695, -1580, 527, 524, -2494, -7659, -12696, -15951, -15619, +-10538, -3043, 4880, 12946, 20014, 25528, 28088, 27733, 23215, 14557, 3474, -7070, -14192, -18451, -19581, -17285, +-12609, -8387, -5489, -1587, 4074, 9499, 11270, 9451, 7621, 6200, 5658, 4394, -608, -6908, -11238, -10652, +-8090, -6522, -5187, -2913, 240, 971, -1948, -6646, -11452, -14889, -14756, -10355, -3516, 3921, 12047, 19633, +25403, 27798, 26896, 23300, 16231, 5020, -6195, -14400, -18777, -19025, -16823, -12426, -7976, -5092, -1895, 3866, +9248, 10496, 9230, 7476, 7262, 6317, 3545, -791, -6323, -10597, -11480, -9624, -7309, -6323, -3740, -442, +546, -1772, -6141, -10527, -14043, -14321, -10102, -2913, 4561, 11929, 18663, 24448, 27415, 27036, 23352, 14980, +3658, -5409, -12392, -17000, -18533, -16618, -11425, -7319, -5940, -2801, 3353, 8330, 10032, 8763, 6833, 6711, +6715, 5347, 533, -7242, -11885, -11536, -8509, -7059, -7303, -5082, -1266, 248, -2033, -6545, -10576, -13732, +-13724, -9674, -3278, 3906, 12341, 19924, 24791, 26680, 26054, 23411, 17304, 5839, -5911, -13989, -18124, -17722, +-15376, -11445, -7284, -5244, -3136, 1902, 6899, 9368, 9278, 8497, 8372, 7809, 5456, 802, -5616, -11269, +-13284, -11833, -9243, -7668, -5201, -1426, 761, -491, -4474, -9246, -13481, -14739, -11189, -4193, 3554, 11376, +18699, 24492, 27954, 27940, 24427, 17632, 6166, -5092, -13780, -19126, -19240, -16166, -11843, -7179, -5095, -3685, +1880, 7953, 10374, 9811, 8047, 7950, 7624, 4717, 301, -5788, -10931, -12534, -10883, -8503, -7737, -5857, +-2253, -307, -1093, -4602, -9303, -13231, -14358, -10901, -4180, 3361, 11467, 19017, 24744, 28217, 28305, 24914, +17791, 6097, -5873, -14086, -18544, -19032, -16117, -11482, -6899, -5141, -4170, 856, 6899, 10126, 10001, 8199, +7681, 7229, 5226, 1060, -5389, -11348, -13416, -11478, -8463, -7539, -6084, -2563, 108, -693, -4293, -9027, +-13261, -14877, -11364, -4453, 2793, 10565, 18730, 25223, 28684, 28663, 25169, 18408, 6602, -4998, -13560, -18811, +-19561, -16326, -11193, -6807, -5404, -4255, 1006, 6793, 9917, 9862, 8286, 7312, 7028, 5571, 1555, -5284, +-11540, -13350, -11364, -8596, -7683, -6010, -2457, 108, -534, -3578, -8443, -13342, -15123, -12090, -5500, 1879, +10234, 18973, 25373, 28781, 28886, 25586, 19019, 7814, -3818, -12993, -19323, -20042, -16195, -11051, -6949, -5297, +-4529, 398, 6712, 9793, 9917, 7600, 6796, 7362, 5438, 970, -5093, -10527, -12277, -11356, -9100, -8347, +-6007, -1992, 215, -669, -3778, -8341, -13075, -15118, -12135, -5915, 1479, 9859, 18379, 24940, 28343, 29266, +26186, 19543, 7561, -4212, -12727, -17752, -18899, -15932, -10422, -6160, -5305, -4836, -124, 6092, 9662, 9708, +8017, 6147, 6098, 5367, 1914, -4300, -10530, -12535, -10849, -8286, -7434, -6113, -2390, 271, -557, -3641, +-8149, -13003, -15286, -12632, -6288, 962, 9165, 17692, 24444, 28735, 29212, 25866, 19432, 8825, -2694, -11476, +-17844, -19354, -16230, -11366, -6660, -4951, -5175, -866, 5677, 9360, 9722, 7442, 6427, 7033, 6075, 2174, +-3996, -9571, -11697, -10910, -9278, -8694, -7080, -3233, 0, 244, -2415, -7292, -12141, -14312, -12435, -7011, +-61, 7952, 16792, 23690, 27996, 29021, 26378, 20612, 10255, -1598, -11056, -17402, -19476, -16661, -11729, -7083, +-5219, -5539, -1318, 5443, 9746, 10523, 7779, 6568, 6783, 5105, 1610, -4301, -9712, -11823, -10771, -8551, +-7950, -6301, -2713, 142, 83, -2660, -7301, -12210, -14401, -12409, -6933, 60, 7893, 16144, 22949, 27616, +28802, 26055, 20372, 10282, -1165, -10338, -16873, -19208, -16318, -11395, -7151, -5471, -5635, -1857, 4906, 9450, +10373, 7689, 5991, 6698, 5716, 1844, -4281, -9285, -11326, -10614, -8696, -8146, -6710, -2963, 474, 847, +-1879, -7118, -12216, -13970, -12314, -7547, -747, 7133, 15743, 22715, 27240, 28482, 26253, 20800, 10547, -945, +-10061, -16094, -18295, -16146, -11658, -6991, -5196, -5355, -1844, 4294, 8910, 10310, 7800, 5872, 6041, 5510, +2686, -2987, -8365, -10995, -10627, -8950, -8241, -7007, -3902, -369, 823, -1144, -5799, -11005, -13622, -12726, +-8522, -2128, 5543, 14076, 21444, 26483, 28274, 26537, 21485, 11701, 175, -9334, -15729, -18205, -16191, -11658, +-7537, -5632, -5252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -66, -66, -65, -66, -75, -84, -75, -66, -66, -61, -62, -61, +-55, -44, -32, -55, -75, -129, -97, -37, -66, -156, -120, -8, -40, -100, -93, -85, +-7, 7, 5, -34, -25, -153, -161, -18, 12, -62, 23, 44, 68, -46, -129, -13, +153, 31, -12, 5, -279, -355, -120, -215, -273, -66, 105, 93, -129, -606, -633, -259, +-317, -340, -209, 157, 171, 75, -579, -211, 876, 696, 251, 89, -343, -760, -994, -248, +-94, -163, -138, -560, 362, 820, 952, 696, 566, 97, -506, -642, -691, -8, 520, -883, +-1951, -768, 374, 125, 185, 110, -440, -153, -141, 396, 492, 273, -27, -210, -286, -80, +480, 419, -8, -113, -74, 390, 131, -750, -572, 515, 451, -141, 17, -398, -197, -128, +-296, -272, -558, -900, -923, -932, -972, -734, -57, 327, 170, 154, -210, 251, 889, 878, +399, -561, -811, -219, -141, -93, 34, 205, 211, 477, 700, 566, 669, 197, -338, -1049, +-1246, -826, 8, -3, -986, -652, -289, -737, -758, -886, -865, -802, -469, -78, 158, 650, +718, 783, 616, 411, 474, 486, 224, -23, -134, -173, 44, -139, 40, 708, 592, 330, +293, 162, -113, -645, -1011, -1233, -1044, -1023, -1295, -947, -798, -715, -570, -257, -28, -110, +-177, 49, 490, 829, 1048, 835, 590, 697, 536, 166, 156, 243, 23, -284, -217, 0, +137, 398, 262, -152, -361, -355, -375, -611, -851, -1146, -1364, -1758, -1920, -1781, -1462, -1174, +-870, -367, 257, 1052, 1579, 2033, 2221, 1818, 933, 512, 457, 172, -158, -149, 165, -26, +-589, -293, 214, -20, -34, 117, -13, -521, -594, -742, -1190, -1246, -1383, -1733, -2125, -2160, +-1586, -978, -797, -643, -385, 379, 1039, 1944, 2885, 2949, 2109, 1618, 1416, 970, 109, -592, +-944, -1067, -1098, -1064, -318, 502, 714, 749, 753, 15, -396, -613, -1059, -1988, -2614, -2962, +-3347, -2730, -2028, -1252, -776, -269, 258, 948, 1791, 2566, 2664, 2737, 2643, 1937, 733, 64, +-129, -632, -738, -948, -139, 257, -93, 34, 772, 657, 71, -778, -1369, -1372, -1218, -1932, +-2568, -2351, -2436, -2464, -2284, -2304, -1447, -162, 743, 2740, 3027, 1654, 1611, 3287, 3505, 2442, +2053, 503, -579, -972, -627, 151, -211, -691, -229, 165, 543, 728, 788, 424, -308, -1733, +-3129, -2628, -2368, -2596, -2794, -2533, -2281, -2563, -3021, -866, 1196, 1781, 2431, 2681, 3466, 4296, +4515, 3849, 2751, 1496, 60, -680, -912, -1251, -694, -498, -257, 299, 660, 650, 524, 269, +-205, -847, -2053, -3076, -3379, -3792, -3783, -3730, -3888, -2967, -1127, 269, 787, 2347, 4114, 4237, +4324, 4482, 4482, 3840, 2644, 1101, -89, -1140, -1782, -2043, -2048, -1287, -318, -57, -66, 1484, +2168, 895, -182, -1243, -2847, -3599, -4302, -4833, -4902, -4763, -4238, -3220, -2067, -298, 1776, 3293, +4635, 5586, 6263, 6349, 5891, 4550, 2867, 1198, -789, -2280, -2865, -2547, -2067, -1340, -386, 1207, +2322, 2388, 1878, 1073, 275, -1321, -3283, -4933, -5984, -6545, -6822, -6644, -5746, -4433, -2609, -708, +1950, 4602, 6521, 8074, 9037, 8826, 7567, 5393, 2490, 151, -1527, -3338, -4422, -4151, -3327, -1494, +831, 1969, 2689, 3510, 3273, 1613, 12, -2408, -4909, -6318, -7342, -8110, -8535, -9303, -8567, -5717, +-2659, 154, 2938, 6100, 9315, 11981, 12633, 11776, 9359, 5832, 1752, -1103, -3348, -5428, -6575, -5045, +-1915, 89, 1465, 3390, 5078, 5491, 4560, 2037, -501, -3390, -6274, -8470, -10196, -11616, -11549, -10583, +-7996, -4215, -2107, -1719, 2207, 8683, 12761, 15063, 14890, 12820, 10093, 6474, 2379, -1452, -4684, -7050, +-7773, -6818, -4341, -205, 3437, 6207, 7701, 7221, 5045, 2090, -1230, -4208, -6414, -9435, -12950, -14345, +-14049, -12759, -10624, -7982, -4360, -52, 4757, 9992, 15340, 18824, 18694, 15740, 11379, 7008, 2456, -2595, +-6545, -8727, -9259, -7951, -4685, -282, 4623, 8857, 10545, 10192, 7528, 2261, -3817, -7543, -9003, -10531, +-13127, -15620, -16134, -14946, -13144, -8416, -2784, 921, 5335, 11288, 16688, 20212, 21382, 18931, 13365, 7152, +1117, -4296, -7976, -10328, -10588, -8871, -4859, 229, 5786, 11491, 14985, 14264, 8471, 379, -6080, -8761, +-9875, -11733, -15163, -18668, -19605, -16062, -11955, -8653, -4356, 587, 6086, 12513, 19198, 23242, 23449, 20038, +14058, 7276, 663, -5431, -9090, -11160, -11424, -10103, -5684, 1154, 8569, 14529, 16828, 14468, 7982, -429, +-7047, -9528, -11023, -13125, -16026, -19391, -20623, -17851, -13801, -9183, -3822, 248, 4738, 12107, 20405, 25766, +26261, 22005, 14937, 7166, -12, -6008, -9448, -12061, -12502, -10772, -5925, 1583, 9756, 16381, 19892, 17307, +7312, -3268, -8952, -10389, -10994, -13070, -17272, -20220, -20321, -18087, -14403, -8994, -3908, -239, 4185, 11064, +19977, 27100, 28636, 23905, 15585, 7444, 22, -6690, -10672, -13140, -13580, -11286, -5343, 2560, 11230, 18398, +20918, 17087, 7381, -3700, -10598, -11721, -11346, -13208, -17771, -21140, -20457, -17150, -13968, -9797, -5051, -1486, +3729, 11845, 20584, 27737, 29427, 25096, 16964, 7788, -888, -8141, -12093, -14673, -14408, -11501, -5052, 3881, +12985, 20091, 23047, 18281, 6203, -5386, -11889, -13080, -12372, -13322, -17558, -20709, -20411, -17326, -13099, -7976, +-3929, -1442, 2993, 10134, 19761, 27880, 29897, 24869, 15944, 7323, -157, -7480, -11820, -13865, -14094, -11632, +-5068, 3658, 13316, 20851, 22916, 17671, 6378, -5769, -12681, -12795, -12193, -13648, -17787, -20914, -19846, -15840, +-12783, -9182, -4946, -2266, 2775, 11109, 20364, 28325, 30987, 26048, 16362, 6877, -1194, -7907, -12602, -15977, +-15422, -11101, -3387, 5599, 14831, 22358, 24544, 18254, 5116, -7284, -13767, -14383, -13250, -14010, -17798, -20933, +-20433, -15803, -10267, -5696, -3652, -2493, 1899, 10299, 20331, 28140, 29671, 24388, 15265, 6458, -1019, -7215, +-11865, -15194, -15270, -11597, -3901, 5587, 15245, 22538, 24162, 17231, 4147, -7774, -14068, -14129, -12606, -13807, +-17945, -20791, -19343, -14777, -10186, -6600, -4690, -3340, 1833, 11070, 21737, 29251, 30430, 24772, 15061, 5733, +-1903, -7947, -12673, -16292, -16075, -11049, -2415, 7172, 16280, 23273, 24316, 16784, 2957, -8732, -14431, -14824, +-14005, -15121, -18344, -20665, -19182, -13962, -8460, -4960, -3749, -2459, 2386, 11080, 21350, 28243, 28819, 23322, +14267, 5543, -2018, -8121, -12681, -15752, -15624, -10705, -2049, 7757, 17112, 23551, 23447, 15122, 1770, -9653, +-15008, -14875, -13975, -15061, -18382, -20566, -18587, -13224, -7619, -4128, -3459, -2839, 2235, 11675, 21720, 28230, +28577, 22674, 13818, 5203, -2562, -8136, -13004, -16046, -15658, -10482, -1678, 8372, 17588, 23774, 23654, 14259, +30, -10739, -15005, -15227, -14341, -15474, -18669, -20385, -18196, -12765, -7235, -3987, -3342, -2683, 2349, 11692, +21738, 28222, 28582, 22557, 13556, 4996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 114, 254, 306, 279, 347, 234, 182, 75, -330, +-205, -217, -335, -60, -142, -217, -251, -556, -374, -401, -700, -262, -522, -262, 17, -269, +-180, -267, -18, 172, 102, 259, 663, 473, 331, -13, -424, -272, -456, -554, -447, -446, +119, 487, 268, 394, 27, -215, 202, -11, 691, 1530, 1931, 1967, 1852, 1816, 1649, 1217, +286, -550, -1314, -1026, -708, -855, -517, -803, -1443, -1804, -1949, -1689, -1248, -730, -224, -199, +-410, -350, -738, -1484, -1848, -2090, -2269, -2088, -1747, -1234, -976, -1005, -1079, -1291, -1070, -700, +-379, 556, 943, 521, 584, 446, -117, -264, -483, -539, 219, 1372, 1937, 2420, 2872, 2964, +2883, 2865, 2793, 2537, 2697, 3013, 2377, 1098, -30, -706, -1215, -1542, -1554, -1256, -924, -316, +41, -180, -345, -818, -1290, -1566, -1736, -1859, -1954, -1581, -1421, -1790, -2185, -2308, -2592, -2381, +-2096, -2037, -1624, -1175, -965, -822, -1060, -1259, -921, -684, -298, -205, -209, 520, 808, 686, +913, 973, 1975, 2987, 3134, 3665, 4049, 4021, 3676, 2809, 2482, 2225, 1283, 904, 821, 744, +855, 417, -107, -703, -1327, -1542, -1525, -1668, -1566, -1126, -894, -641, -446, -372, -302, -839, +-1519, -2156, -2369, -2286, -2630, -3306, -3432, -3077, -2778, -2136, -1615, -1172, -1278, -1307, -589, -437, +-1135, -1530, -1403, -971, -582, 152, 1162, 2143, 3209, 3770, 4331, 4598, 4421, 4423, 4636, 4941, +4645, 3665, 2923, 2279, 1015, -76, -777, -1525, -2110, -2586, -2150, -1479, -1023, -472, -190, -117, +-112, -160, -123, -129, -545, -1403, -1847, -2857, -4111, -4720, -4625, -3783, -3515, -3379, -3014, -2172, +-1503, -1595, -1681, -2329, -3083, -3555, -3573, -2697, -2463, -2442, -1256, -796, 606, 2111, 3124, 4788, +5498, 6761, 7942, 7709, 7578, 6969, 5405, 4398, 3212, 1864, 1112, 230, -45, -734, -2140, -2499, +-2492, -2732, -2410, -1680, -550, 574, 1209, 2034, 2051, 898, -109, -1329, -2097, -3459, -4132, -4623, +-4699, -5308, -5374, -4291, -3573, -2468, -2605, -3274, -2500, -1624, -1674, -3161, -4884, -4376, -4639, -4295, +-4193, -3746, -1426, 1030, 4770, 5498, 6542, 9300, 11194, 12295, 11841, 10585, 8936, 7412, 6047, 4438, +1397, -1058, -2694, -4389, -4694, -4353, -3314, -2872, -2873, -1647, 224, 1680, 2687, 3278, 3823, 3811, +2096, -56, -1772, -4422, -6541, -7007, -8878, -8850, -8106, -5909, -4237, -3066, -2642, -3400, -1640, -922, +-1029, -4790, -6943, -7152, -7339, -8689, -9107, -8403, -4888, 915, 4523, 7758, 8556, 11951, 14906, 16051, +16297, 14814, 12810, 11567, 10448, 6562, 2810, -1186, -3198, -4533, -6397, -5468, -4738, -5510, -4922, -3151, +-603, 1951, 3144, 5226, 6225, 6002, 5770, 3976, 1523, -2444, -6763, -10374, -13103, -13686, -13258, -10362, +-7837, -5127, -4432, -4416, -282, 1288, -825, -2950, -6373, -8021, -10895, -12129, -11844, -11777, -7405, -1830, +4268, 7220, 9514, 13196, 14712, 15893, 17083, 17117, 18102, 18159, 15396, 13147, 8047, 3347, -1552, -6642, +-7461, -8809, -8930, -7001, -5680, -2965, 1030, 3584, 4878, 4874, 4423, 5576, 6191, 7229, 6988, 2644, +-3720, -9496, -16242, -18801, -18790, -15927, -11491, -7184, -2824, -781, 223, 653, -434, -4465, -6439, -8244, +-10025, -13292, -14152, -11397, -6508, -3581, -1723, 3542, 7739, 12992, 15789, 15299, 13893, 14907, 18239, 20394, +18971, 16076, 15018, 12309, 8355, 938, -6692, -10874, -13758, -15703, -14153, -8530, -1864, 3569, 6473, 8625, +7665, 5882, 6642, 7941, 9206, 7986, 2354, -6216, -14727, -21481, -23436, -22106, -17835, -12994, -7564, -1010, +4793, 4925, 792, -3202, -6916, -7899, -9870, -11818, -14234, -12304, -7630, -2051, -1860, -4433, -370, 7659, +15085, 15626, 14659, 16053, 19407, 22526, 23177, 19531, 14617, 13484, 11262, 6441, -1207, -8702, -13096, -16657, +-17767, -13575, -7155, -485, 5279, 8573, 10006, 9443, 8442, 8219, 8360, 7942, 6070, -558, -9226, -17226, +-22344, -24249, -23038, -18171, -11471, -5079, 1018, 6619, 4583, -886, -5878, -7646, -8781, -11101, -12814, -12726, +-8741, -3277, 602, -2185, -4177, 1300, 10545, 15222, 15431, 15791, 18152, 20531, 22329, 22287, 17820, 15085, +13782, 11053, 4598, -3986, -10222, -14908, -18231, -18248, -12504, -4762, 2043, 6751, 10094, 10883, 9565, 8485, +7465, 7436, 6764, 4306, -2419, -10859, -18820, -23730, -24987, -22533, -17185, -10440, -3624, 3075, 6434, 2042, +-3090, -7092, -7424, -9836, -11814, -12534, -10535, -5195, -291, 1243, -2476, -2687, 3653, 12144, 15047, 14530, +15649, 19213, 21237, 22634, 21529, 17356, 14937, 12303, 8829, 1844, -5737, -11079, -15834, -18727, -17497, -11116, +-3741, 2282, 6856, 9819, 10692, 10647, 9929, 8339, 6964, 5644, 1906, -5674, -14074, -21537, -24924, -24916, +-21272, -15536, -9329, -2958, 3127, 4704, 1054, -4371, -7039, -7470, -10152, -11563, -11796, -7940, -2807, 1884, +1466, -2073, -949, 5536, 12357, 14054, 14148, 16702, 20855, 22958, 24048, 20864, 16111, 13569, 10671, 6087, +-1306, -7528, -11950, -16818, -19426, -15780, -9114, -2537, 3636, 7919, 10904, 11606, 11280, 10362, 8159, 6430, +4757, -616, -8889, -16594, -23069, -25289, -23947, -19557, -13678, -8079, -1930, 3303, 3243, -316, -4639, -5730, +-6966, -9482, -11233, -10677, -6092, -798, 3466, 473, -2473, 2465, 9813, 13872, 13626, 14111, 18067, 21654, +23675, 23913, 19595, 15282, 12895, 9210, 3399, -3881, -9807, -13609, -17197, -18538, -14084, -7138, -207, 4864, +8341, 11004, 11674, 11397, 10588, 9081, 6782, 2878, -5166, -13332, -20479, -25483, -25649, -21756, -15803, -10627, +-6418, -624, 4005, 1453, -3253, -5794, -4859, -6724, -9494, -11542, -9238, -4245, 817, 3313, -364, -656, +5281, 12243, 13987, 13127, 14676, 19427, 22595, 24068, 22925, 18480, 15784, 12548, 7201, 233, -6959, -11927, +-15866, -18800, -17287, -11409, -4932, 1364, 5532, 8780, 10278, 10202, 10451, 9987, 8806, 6521, 1834, -7100, +-16086, -23476, -26934, -25353, -20905, -14933, -9663, -4788, 1344, 3613, -165, -4870, -5793, -4974, -7024, -9463, +-10403, -6644, -1243, 2737, 2072, -1443, 1432, 8543, 13037, 13414, 13459, 17312, 22000, 23777, 24172, 22022, +18309, 15691, 11812, 5150, -2566, -9656, -14127, -17617, -19499, -15687, -9044, -2308, 3489, 7263, 9726, 10666, +10675, 10205, 9216, 7170, 4465, -2027, -11259, -19250, -24685, -25699, -22742, -18044, -13254, -9111, -4060, 1771, +2047, -1731, -5473, -4748, -5231, -7551, -9604, -8643, -4004, 257, 3266, 1034, -672, 3844, 10516, 13248, +13371, 14451, 18736, 22621, 24670, 24712, 21285, 17957, 14650, 9681, 2606, -4770, -10406, -14695, -18014, -18241, +-13525, -7551, -1781, 2902, 6688, 9163, 9824, 10241, 10117, 9506, 7706, 3852, -4248, -14475, -22557, -26989, +-26589, -22872, -18154, -13624, -9032, -2901, 1927, 968, -3195, -5801, -3987, -4635, -6481, -8457, -6984, -2892, +1296, 2911, -223, -905, 4540, 11683, 13701, 13537, 15101, 20200, 23660, 25289, 24950, 20961, 17543, 14113, +9071, 1164, -6549, -11961, -16247, -19037, -17834, -12240, -5772, 209, 4860, 8592, 10193, 10028, 9706, 8790, +8054, 6329, 1422, -7670, -17318, -24843, -27714, -26091, -21787, -16811, -12311, -7134, -892, 2502, 156, -4549, +-5474, -3511, -4090, -6069, -7924, -5692, -1537, 2532, 2073, -1232, 182, 6801, 12949, 14054, 13884, 16163, +21616, 25057, 26100, 24165, 20012, 17597, 14204, 8437, 549, -6987, -12267, -16686, -19616, -16900, -10619, -4547, +1068, 5421, 8760, 9804, 9538, 9517, 8855, 7501, 5242, -808, -10603, -20088, -26672, -28166, -25267, -20700, +-16179, -11926, -6293, 486, 2232, -742, -4782, -3884, -2639, -3466, -5832, -7656, -5478, -1458, 2276, 262, +-2393, 1174, 8465, 12841, 13706, 14471, 18149, 22790, 25743, 26278, 23188, 20360, 17748, 13724, 7152, -1297, +-8457, -14354, -18244, -19591, -15670, -8978, -2439, 2571, 6685, 9246, 9235, 8946, 8237, 7627, 6323, 3387, +-3517, -13428, -22475, -27592, -28091, -24659, -19924, -15631, -10866, -4485, 1996, 2174, -1794, -5294, -3581, -3090, +-4014, -6498, -7398, -4520, -650, 1681, -837, -1965, 2252, 9411, 12882, 13789, 15741, 20139, 23501, 25572, +25866, 22716, 20114, 17170, 12969, 6072, -2328, -9249, -15100, -19187, -19367, -14623, -8165, -1402, 3759, 7922, +9691, 9405, 8939, 7417, 6575, 5267, 1974, -5517, -15358, -23759, -28078, -27622, -23777, -19124, -14674, -9744, +-2856, 2488, 1695, -1983, -4111, -1931, -2905, -4633, -7082, -6914, -3586, -76, 895, -1933, -1401, 3720, +10054, 13109, 14757, 17599, 22038, 24679, 26171, 25518, 22066, 19207, 15655, 11048, 3920, -3817, -10120, -15694, +-19261, -18239, -12935, -6431, -78, 4854, 8339, 9046, 8422, 7699, 6429, 5677, 4928, 937, -7931, -17879, +-25575, -28867, -27234, -22987, -18256, -13522, -7990, -1170, 2340, 952, -2907, -3016, -1779, -3418, -5655, -7531, +-6402, -3050, 272, -62, -2228, -545, 5964, 11273, 13351, 14909, 18072, 22112, 24678, 26303, 24646, 22126, +19075, 15799, 10525, 1989, -5473, -12143, -16823, -19368, -17580, -11574, -4390, 1573, 6100, 8635, 8291, 7898, +6875, 6336, 5896, 4355, -687, -10571, -20325, -26905, -28994, -27061, -22174, -17041, -12140, -6250, 585, 3071, +288, -3500, -2487, -2022, -3773, -6009, -7596, -5856, -2856, -214, -957, -2454, -8, 7109, 12289, 13937, +15353, 18930, 23426, 25951, 26696, 24259, 21087, 18680, 15102, 8871, 423, -6465, -12185, -17187, -19315, -16284, +-10435, -4065, 2353, 7423, 9362, 9133, 8857, 8088, 6659, 5383, 3476, -3109, -13576, -22751, -28049, -28705, +-25949, -21030, -15716, -10398, -4418, 1732, 2853, -36, -2934, -1445, -1936, -4256, -6871, -8048, -5699, -2631, +-429, -2648, -3573, 1612, 9097, 13181, 14599, 16435, 20056, 23614, 26304, 26666, 23899, 20715, 17587, 13292, +6161, -2167, -8776, -13723, -17464, -18462, -14586, -8176, -1600, 3724, 7934, 8835, 8131, 7651, 6893, 6540, +5526, 2741, -5216, -15877, -24216, -29252, -29077, -25087, -19280, -14118, -9267, -2464, 2832, 2112, -1829, -3508, +-1511, -2715, -4777, -7575, -8023, -5548, -2858, -766, -2933, -2715, 2891, 9999, 13779, 14664, 16435, 20296, +23435, 25500, 25874, 23617, 21062, 17943, 12754, 4975, -3285, -9858, -14893, -18448, -18137, -13322, -7064, -530, +4775, 8021, 8479, 8291, 7868, 6982, 6188, 5392, 2117, -6932, -17408, -25359, -28806, -28166, -24239, -18786, +-13600, -8314, -1397, 3374, 1810, -2028, -2841, -1448, -3229, -5406, -7806, -7525, -5063, -2013, -1297, -3881, +-2337, 4117, 10651, 13769, 15291, 17660, 21457, 24642, 26855, 25690, 22560, 20209, 17049, 11603, 3093, -4733, +-10588, -15447, -18539, -17572, -12310, -5804, 297, 5261, 8305, 8663, 8620, 8147, 7404, 6430, 5105, 1285, +-8065, -18466, -26018, -28974, -27802, -23663, -18207, -13052, -7601, -738, 3118, 1398, -2122, -2414, -1269, -3372, +-5651, -7985, -7470, -5016, -1936, -1469, -4011, -2211, 4408, 10840, 13792, 15308, 17757, 21525, 24613, 26824, +25634, 22553, 20202, 17049, 11397, 2648, -5135, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -34, -45, -54, -55, -52, -40, -23, 2, +36, 69, 99, 122, 153, 165, 185, 183, 178, 160, 143, 114, 84, 51, 18, 1, +-31, -51, -68, -76, -86, -83, -81, -75, -69, -76, -62, -57, -31, 2, 36, 81, +110, 138, 173, 195, 224, 235, 235, 204, 175, 122, 78, 44, 12, -13, -41, -52, +-71, -88, -98, -100, -105, -68, -372, -1070, -1656, -2014, -1838, -1019, -11, 934, 1647, 2049, +2078, 1913, 1637, 1273, 996, 835, 978, 1282, 1842, 2024, 1847, 1005, 52, -1015, -2198, -3352, +-4339, -5051, -5320, -4951, -3922, -2053, 191, 2363, 3961, 4725, 4788, 4107, 3140, 1981, 929, 100, +-216, -289, -149, 84, 452, 854, 1370, 1724, 1595, 1106, 10, -1273, -2843, -4298, -5682, -7036, +-8087, -7500, -4511, -243, 3981, 7029, 8561, 8151, 6574, 4395, 2330, 509, -803, -1520, -1931, -1718, +-1266, -684, -331, 32, 515, 1117, 1622, 1693, 1121, -125, -1680, -3352, -4976, -6634, -8122, -8321, +-5697, -1082, 3736, 7356, 9150, 8981, 7385, 5034, 2657, 592, -716, -1595, -1995, -2081, -1665, -1416, +-1315, -1521, -1155, -71, 1230, 2357, 2613, 2120, 655, -982, -2978, -4869, -6874, -8296, -8644, -5866, +-1036, 3881, 7696, 9508, 9275, 7427, 4850, 2261, 163, -1309, -1944, -2194, -1874, -1535, -1242, -1122, +-888, -272, 660, 1640, 2402, 2448, 1642, 245, -1484, -3206, -4579, -5799, -7012, -8186, -7971, -4564, +808, 6195, 9862, 10947, 9700, 7068, 3837, 899, -1365, -2650, -2929, -2392, -1705, -1107, -779, -464, +-57, 543, 1395, 2110, 2344, 1669, 323, -1315, -3003, -4245, -5131, -5937, -7274, -8896, -8168, -3847, +2761, 8781, 12072, 12274, 10122, 6601, 2963, -304, -2281, -2989, -2485, -1952, -1401, -997, -908, -651, +83, 808, 1813, 2345, 2288, 1209, -585, -2439, -4070, -5340, -6711, -9803, -14911, -14114, -4220, 6286, +14039, 16777, 15673, 11673, 6890, 2374, -1237, -2988, -3066, -2323, -1966, -1409, -769, -451, -597, -689, +-524, -136, 677, 825, -297, -1577, -3280, -4404, -5893, -7720, -11109, -13203, -8307, 663, 9734, 15072, +16454, 14423, 10385, 5544, 1198, -1932, -3270, -3206, -2891, -2519, -1663, -587, -253, -823, -912, -640, +374, 1239, 1026, -70, -1889, -3721, -5252, -6651, -8519, -12145, -13492, -6746, 2906, 11815, 16285, 16924, +14093, 9648, 4501, 144, -2854, -4186, -4332, -4050, -3103, -1695, -143, 338, 459, 548, 723, 1230, +1325, 662, -880, -2921, -5004, -6838, -8568, -10991, -13985, -10800, -1668, 7834, 14841, 17293, 15955, 12072, +7303, 2354, -1658, -3903, -4334, -4264, -3571, -2251, -512, 537, 873, 1193, 1550, 1441, 1151, 318, +-1297, -2803, -4709, -6513, -8411, -10695, -13031, -11639, -3803, 4856, 12384, 16046, 16423, 13409, 8946, 3956, +-434, -3289, -4235, -3813, -3178, -1976, -714, 258, 191, 52, 454, 860, 868, 390, -889, -2179, +-3463, -4828, -6567, -9026, -12184, -13216, -7020, 2241, 10767, 15746, 17045, 14984, 10551, 5488, 582, -3125, +-5270, -5381, -4574, -3392, -2018, -517, 584, 1018, 1442, 1947, 2163, 1773, 640, -1094, -2832, -4598, +-6380, -9087, -13632, -16362, -10240, 711, 10375, 16240, 17715, 15648, 11123, 6085, 1364, -2388, -4826, -5282, +-4792, -3801, -2175, -348, 606, 851, 1207, 1923, 2424, 2281, 847, -725, -2672, -4099, -6040, -9240, +-15470, -18306, -11019, 606, 10980, 16799, 18457, 16207, 11708, 6584, 1967, -1855, -4196, -4739, -4618, -4174, +-2706, -1094, -275, -188, 543, 1731, 2650, 2426, 1310, -527, -2461, -4400, -6033, -8888, -16061, -20508, +-11215, 1380, 12625, 18532, 19969, 17161, 11806, 5978, 1062, -2538, -4581, -4918, -5250, -4969, -3589, -1419, +-68, 224, 968, 2037, 2892, 2615, 1331, -687, -2722, -4805, -6179, -8694, -16484, -23264, -12509, 1712, +14152, 20487, 21778, 18627, 12699, 6256, 509, -3537, -5518, -5518, -5461, -4932, -3476, -1189, 147, 229, +418, 1311, 2500, 2710, 1669, -128, -2260, -4607, -6463, -8727, -15077, -23205, -14657, 359, 13046, 20317, +22049, 19693, 14044, 7635, 1175, -3595, -6137, -6072, -5650, -4761, -3084, -1002, -274, -802, -367, 812, +2374, 2732, 2043, 279, -1719, -4138, -6079, -7752, -11847, -21833, -20147, -3609, 10113, 20064, 22682, 21915, +16707, 10381, 3256, -2402, -6334, -7148, -6915, -5791, -3613, -914, 259, -648, -1108, -706, 1164, 2354, +2745, 1419, -555, -2955, -5048, -6954, -10458, -19734, -23070, -8433, 7049, 18466, 22576, 22347, 18106, 12122, +5451, -665, -5412, -7390, -7545, -7021, -5011, -1864, 652, 503, -677, -706, 275, 1762, 2204, 1786, +-46, -1855, -3910, -5614, -8551, -16299, -24831, -14856, 1508, 14829, 21688, 22721, 19850, 14220, 8096, 2007, +-2759, -5747, -6678, -7139, -5994, -3226, -229, 446, -616, -963, -168, 1428, 1920, 1714, 1, -1548, +-3445, -5234, -8849, -17841, -25907, -14519, 1728, 14829, 21258, 22557, 19905, 14363, 8445, 2791, -1548, -4307, +-5494, -6872, -6646, -4263, -1132, 496, -406, -1115, -640, 367, 1220, 863, 81, -1466, -2857, -4840, +-8612, -17973, -24090, -13529, 1647, 14452, 20670, 22183, 19507, 13981, 7565, 2013, -1869, -3881, -4618, -5721, +-6132, -4491, -1729, -197, -519, -498, 487, 1513, 1447, 536, -556, -2036, -3585, -5286, -9523, -20445, +-24510, -11196, 3818, 16187, 21283, 22255, 18839, 13299, 6586, 963, -2640, -3653, -3939, -4990, -5460, -4152, +-1767, -801, -966, -680, 708, 1719, 1426, 73, -1214, -2470, -3948, -5305, -9624, -22565, -25483, -9353, +5572, 18321, 22493, 23222, 18847, 12935, 5561, -464, -4288, -4959, -4841, -5010, -4564, -2795, -706, -350, +-989, -646, 986, 2136, 1669, -238, -1603, -3076, -4261, -5418, -9416, -23813, -26715, -8166, 7257, 20313, +23532, 23981, 18949, 12728, 4899, -1244, -5170, -5902, -5731, -5663, -4710, -2608, -243, -347, -1392, -1288, +514, 2184, 1930, 220, -861, -2173, -3366, -4816, -8479, -23118, -28053, -9417, 6218, 19953, 23308, 24213, +19616, 13599, 5667, -968, -5785, -6798, -6441, -6414, -5175, -2628, -36, -381, -1661, -1227, 467, 2184, +2033, 772, -473, -1493, -2479, -3692, -6595, -18834, -31936, -14389, 2601, 18690, 23889, 24883, 21233, 14870, +7423, 143, -5078, -7420, -6697, -7022, -5682, -3149, 235, 337, -1198, -1470, -303, 1326, 1616, 803, +-463, -1593, -2179, -3084, -5586, -16260, -30772, -17371, 3, 16178, 23473, 24814, 22164, 16135, 9400, 1874, +-3801, -7027, -7054, -7783, -6701, -4089, -207, 347, -1393, -1584, -564, 1390, 1591, 1031, -279, -1465, +-2257, -2877, -5252, -15445, -30493, -18805, -1171, 14980, 23482, 25091, 22944, 16584, 9639, 1810, -3566, -6638, +-6396, -7270, -6707, -4525, -655, 423, -946, -1408, 27, 1511, 1389, -134, -1394, -2567, -2915, -3180, +-5296, -16486, -28791, -15441, 119, 15265, 22436, 24161, 21554, 15757, 9094, 1912, -3035, -5659, -5415, -6294, +-6556, -4710, -1004, 91, -1060, -1553, -13, 1298, 781, -866, -1850, -2763, -3478, -3551, -6478, -19889, +-26187, -11098, 3156, 16380, 21470, 23070, 19919, 14641, 7919, 1540, -3129, -4970, -4918, -5253, -5817, -4242, +-680, 333, -1167, -1370, 301, 1695, 556, -1767, -2829, -3734, -4419, -4525, -8519, -22994, -21800, -6128, +7598, 17764, 21017, 21692, 17855, 12555, 6216, 675, -3943, -5348, -5212, -4637, -4702, -2962, -322, 8, +-1671, -1432, 516, 2175, 675, -1838, -2904, -3847, -4531, -4863, -9753, -25662, -19126, -3511, 10512, 18625, +20532, 20589, 16610, 11218, 4631, -427, -4743, -5560, -5286, -4209, -3948, -2083, -143, -365, -1796, -960, +1292, 2919, 886, -1699, -3278, -4361, -5044, -5184, -9707, -25987, -19477, -2895, 11845, 20240, 21007, 20846, +16634, 10951, 3784, -1495, -6047, -6833, -6240, -4748, -3517, -1145, 991, 272, -1282, -753, 1469, 2732, +595, -2154, -3891, -4865, -5014, -4729, -7613, -23952, -21835, -3517, 10987, 20985, 21319, 21325, 16809, 11320, +3903, -1737, -6765, -7831, -7075, -5427, -3561, -811, 1521, 556, -986, -774, 1319, 2776, 631, -1947, +-4024, -4782, -4926, -4378, -6658, -22618, -23636, -4579, 10046, 21428, 22187, 21935, 17268, 11563, 3952, -1962, +-7119, -8452, -7626, -6217, -4269, -1280, 1794, 1261, -665, -551, 1611, 3106, 841, -2025, -4140, -4777, +-4670, -4141, -6241, -21300, -24541, -5873, 8898, 21007, 22930, 22766, 17837, 11743, 4034, -2164, -7262, -8659, +-7698, -6711, -4874, -1535, 2044, 1622, -614, -511, 1591, 3171, 769, -2206, -4223, -4520, -4455, -4053, +-6421, -20818, -23610, -5945, 8535, 20132, 22813, 22930, 18150, 11862, 4085, -2184, -6779, -7966, -7165, -6551, +-5331, -2440, 1233, 1273, -817, -671, 1859, 3759, 1243, -2076, -4175, -4618, -4698, -4688, -8558, -22338, +-20379, -4070, 10017, 19446, 22119, 22203, 17811, 11588, 3832, -2437, -6818, -7509, -7094, -6137, -5349, -2342, +1005, 1191, -754, -428, 2100, 4012, 909, -2333, -4467, -4611, -4941, -5013, -10857, -24150, -16609, -1582, +12236, 19058, 21224, 20870, 16823, 10641, 3117, -2822, -6792, -6982, -6605, -5451, -4894, -2281, 578, 784, +-556, 76, 2678, 4288, 884, -2804, -4807, -5175, -5480, -6000, -13463, -24544, -12877, 1331, 14882, 19517, +20566, 19581, 15698, 9596, 2267, -3547, -7128, -7168, -6596, -5122, -4194, -1651, 695, 377, -429, 404, +3023, 4250, 509, -3294, -5209, -5573, -5575, -6250, -15003, -24762, -10498, 3387, 16904, 20356, 20607, 18799, +14796, 8596, 1598, -4205, -7441, -7682, -7218, -5587, -3672, -1262, 425, -260, -337, 876, 3627, 4473, +836, -3288, -5551, -5878, -5698, -6513, -16055, -25227, -9579, 4521, 18442, 21365, 21232, 18930, 14756, 8271, +1247, -4901, -8185, -8694, -8030, -6405, -3546, -579, 905, -168, -313, 817, 3685, 4383, 629, -3076, +-5590, -5786, -5614, -6353, -15185, -25159, -10119, 4467, 18257, 21744, 21684, 19348, 14635, 8115, 1093, -5066, +-8529, -8826, -8122, -6789, -3777, -580, 435, -919, -602, 915, 4187, 4844, 1196, -2824, -5302, -5515, +-5367, -6475, -14948, -25251, -10918, 3884, 17560, 21719, 22382, 20314, 15282, 8598, 1259, -5023, -8796, -8858, +-8209, -7026, -4011, -469, 871, -701, -803, 607, 3972, 4772, 1029, -2923, -5382, -5577, -5447, -6372, +-15013, -25271, -10966, 4025, 17718, 21869, 22337, 19996, 14953, 8253, 1063, -5077, -8602, -8740, -8130, -6988, +-3998, -603, 527, -904, -653, 895, 4234, 4902, 1196, -2838, -5319, -5519, -5371, -6475, -14993, -25260, +-10926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 59, 149, -124, 255, 320, 572, 491, 481, 991, 670, 700, 739, 694, 995, +839, 1195, 1292, 1485, 1839, 1746, 1726, 1882, 1670, 1698, 1146, 1198, 1126, 1063, 1075, 854, +1174, 1043, 766, 1097, 515, 438, 510, -181, -80, -438, -388, -85, -556, -168, -57, 114, +215, 91, 569, 685, 348, 870, 917, 992, 1368, 1346, 2018, 2013, 1419, 1915, 1940, 1717, +1820, 1970, 2230, 1906, 1552, 1693, 1698, 1436, 1547, 1644, 1896, 1606, 1053, 1230, 980, 312, +-93, -539, -1203, -2125, -3106, -3501, -3802, -4418, -4330, -4283, -4916, -5187, -4456, -4442, -4976, -4402, +-3443, -3232, -3137, -3423, -3210, -3190, -3522, -3656, -4155, -4457, -4189, -4703, -4722, -4329, -4160, -3358, +-2711, -2052, -1611, -1171, -301, 195, 675, 1756, 2931, 3639, 4462, 5493, 6280, 6418, 6850, 7677, +7787, 7720, 7422, 7006, 6264, 5241, 4157, 3227, 1806, 726, 30, -1252, -2852, -3328, -3804, -5086, +-6128, -5954, -6332, -7002, -6750, -6186, -5817, -4849, -3432, -1692, -631, 377, 2574, 3899, 4743, 5920, +7098, 8271, 8577, 8799, 9501, 9434, 8882, 8921, 8019, 6610, 5024, 3094, 1253, -1228, -3767, -4986, +-6657, -8149, -9474, -9887, -9916, -10070, -9460, -7608, -5755, -3380, -462, 2037, 4804, 6894, 8766, 10197, +10424, 9550, 8081, 6289, 4214, 2279, 440, -1040, -2197, -3076, -3803, -4816, -4916, -5822, -6303, -6552, +-6850, -7646, -7965, -8756, -8858, -9710, -9664, -9841, -9909, -9178, -8239, -7991, -6091, -4925, -3782, -1893, +-2068, -2368, -2989, -4256, -4989, -6269, -6299, -4608, -2338, 531, 4494, 7582, 10298, 12648, 13890, 14456, +13821, 13312, 12473, 11036, 10175, 9624, 8760, 8276, 7619, 6531, 5323, 3156, 390, -2192, -5372, -8042, +-10258, -11702, -12474, -12863, -12163, -11799, -11188, -9814, -8585, -7282, -6115, -3975, -1674, 273, 3168, 6390, +8966, 11549, 14088, 16164, 17472, 18141, 18666, 18341, 17420, 15883, 13353, 10428, 7000, 3002, -713, -4165, +-7749, -10359, -12391, -14003, -14893, -15451, -15338, -15102, -14510, -13050, -11229, -8343, -4718, -662, 3772, 7001, +10229, 12591, 13423, 14019, 13300, 11012, 8210, 4931, 2208, -389, -2731, -4022, -5108, -5735, -5664, -6397, +-6659, -6293, -5994, -4739, -4400, -3696, -2483, -1770, -1935, -3584, -5767, -6795, -8795, -10613, -10986, -11205, +-10022, -8282, -7262, -5512, -6153, -6419, -7226, -9909, -10221, -11562, -11082, -9066, -7107, -2085, 2790, 7475, +12722, 15742, 18562, 19970, 19201, 18505, 17037, 15166, 14003, 12726, 12154, 11933, 11277, 10420, 8787, 6424, +3243, -549, -4712, -8266, -10740, -12824, -13762, -14307, -13908, -12948, -12921, -12165, -11384, -10844, -9543, -8479, +-6258, -3988, -1242, 2333, 5239, 8126, 10949, 13981, 16211, 17687, 19422, 20624, 20069, 19213, 17505, 14998, +12135, 8911, 5481, 2188, -1408, -4473, -7234, -9348, -11321, -12842, -12866, -13405, -14279, -14441, -14717, -13710, +-12550, -10510, -7148, -3917, -583, 2817, 5146, 6981, 8670, 9501, 9371, 7570, 5798, 4242, 3074, 2332, +1533, 1176, 1159, 585, 316, -603, -1082, -918, -163, 1126, 873, 1029, 1586, -1150, -4484, -7114, +-10600, -13185, -16159, -17258, -17569, -18517, -15760, -14780, -13340, -10413, -9789, -8673, -8592, -9401, -8876, -8921, +-6983, -3806, 125, 5596, 11330, 15820, 19611, 22442, 23556, 22899, 22179, 20764, 19120, 17047, 15447, 14399, +12771, 11374, 9431, 6615, 3864, -278, -4315, -8382, -12459, -14728, -15901, -17303, -17567, -16992, -16257, -16223, +-15454, -13917, -13368, -11794, -9417, -7030, -4177, -999, 3424, 6819, 9741, 13360, 16578, 19047, 20970, 22926, +24592, 24458, 23691, 22203, 19558, 16295, 12474, 8302, 4297, -781, -5760, -8503, -11942, -14975, -16469, -17710, +-18837, -20206, -21768, -21776, -20949, -18611, -14825, -10263, -5693, -1359, 2615, 5478, 7602, 9173, 10078, 9540, +8992, 8136, 7650, 7742, 7968, 8223, 8360, 8202, 6691, 4608, 2488, 190, -230, -1460, -3001, -2190, +-1319, -3421, -5679, -8290, -11348, -14872, -18062, -20180, -22641, -22809, -21574, -20618, -17215, -15563, -12702, -10074, +-10153, -8224, -7645, -6780, -3249, -1486, 4025, 10181, 14790, 20010, 23064, 25718, 27000, 25150, 24825, 23127, +20191, 18367, 15680, 13573, 11368, 8867, 6841, 3309, -156, -3850, -8328, -11956, -15736, -17181, -17347, -18436, +-17655, -16092, -15226, -14848, -13516, -11658, -10963, -9301, -6366, -4128, -1472, 2595, 6719, 9871, 12793, 15971, +18542, 19294, 20486, 21886, 22114, 21826, 20914, 19494, 17073, 13560, 10467, 7073, 3100, -1210, -4930, -7733, +-10868, -13641, -14969, -15779, -17388, -18471, -19039, -18859, -18280, -15903, -12359, -8362, -4840, -962, 2231, 4296, +5588, 6357, 6444, 5813, 5207, 4856, 5180, 6176, 7655, 9048, 10589, 11138, 9991, 8369, 6465, 4113, +2042, 292, -740, -1732, -2813, -4313, -6394, -9409, -12406, -15081, -18421, -20387, -21911, -23384, -22537, -21432, +-19768, -18107, -15968, -13399, -12209, -10062, -7240, -4261, -589, 4179, 9877, 16006, 20369, 24933, 27546, 27826, +27522, 26205, 24257, 22339, 19774, 18186, 16168, 13886, 11676, 8857, 5568, 1489, -3090, -8057, -12759, -16638, +-19478, -20350, -20279, -19134, -17394, -15672, -14289, -12755, -11509, -10136, -8881, -6962, -4622, -1936, 1484, 5445, +9227, 13023, 16143, 18640, 20037, 20604, 21278, 21025, 20316, 19550, 17764, 15565, 12672, 9484, 6707, 3423, +229, -2988, -5936, -8185, -10931, -12197, -12872, -14526, -15107, -15882, -16663, -16860, -15719, -13400, -9910, -6268, +-2741, 633, 3137, 4753, 5146, 5045, 4378, 3113, 2551, 2322, 2415, 3644, 5289, 7375, 9367, 9996, +9444, 9042, 7090, 5357, 4542, 1918, 655, 144, -2316, -5331, -7529, -11247, -13676, -16983, -18331, -19944, +-21983, -20999, -21442, -20828, -19078, -18753, -16176, -15674, -13922, -11009, -9363, -4778, 488, 5234, 13371, 18774, +24478, 28408, 29388, 30222, 28225, 26106, 24506, 21676, 19989, 18139, 16501, 14796, 11830, 9255, 5056, 351, +-4761, -10931, -15547, -20080, -22607, -22427, -22437, -20827, -18485, -16099, -14559, -13148, -10668, -9361, -7768, -4970, +-2728, 336, 4020, 8098, 12178, 15079, 18441, 21232, 21915, 22345, 22228, 21659, 20768, 18249, 16326, 13061, +9424, 6206, 2368, -580, -3937, -7150, -8711, -10729, -12628, -12887, -13523, -13662, -14213, -14953, -14539, -14136, +-12649, -9681, -6438, -2958, 23, 2734, 4782, 5023, 4795, 3966, 2439, 1480, 854, 352, 1176, 2305, +4477, 6588, 7921, 8450, 8421, 7688, 6336, 5277, 4232, 2938, 2174, 919, -1864, -4660, -7664, -10800, +-13762, -16123, -17880, -19518, -20006, -19866, -19673, -19325, -18530, -17805, -16564, -15338, -14211, -12007, -8631, -4247, +1292, 7656, 15354, 21377, 26257, 29500, 30559, 29984, 28306, 26205, 24095, 21581, 19582, 18072, 16037, 13607, +10879, 7288, 2852, -2653, -8650, -14064, -19102, -22592, -23946, -23610, -22521, -20694, -17858, -15974, -14268, -11969, +-10157, -8270, -6084, -3134, -185, 3268, 7558, 11632, 14967, 18266, 20973, 22422, 22856, 22609, 22274, 21235, +18794, 16599, 13384, 9792, 6333, 2507, -520, -4112, -7229, -9095, -11114, -12563, -13064, -13419, -13174, -13564, +-14135, -13748, -13060, -11702, -9201, -5987, -2875, -107, 2402, 4272, 4572, 4174, 3293, 1815, 769, 129, +-287, 582, 1917, 4048, 6322, 7803, 8346, 8464, 7636, 6508, 5560, 4276, 3292, 2841, 1395, -1229, +-3888, -6953, -10059, -13133, -15594, -17352, -19289, -19734, -19750, -19726, -19312, -18721, -17942, -16741, -15626, -14326, +-12206, -8848, -4393, 1073, 7517, 15199, 21222, 26184, 29424, 30518, 29983, 28297, 26216, 24090, 21729, 19941, +18697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 223, 579, 320, -307, -532, -27, 377, -336, -307, 774, 1332, 541, -473, 539, +498, -506, -1006, -211, 1112, 1438, 21, -1353, -62, 1043, 1046, 376, 251, 910, 1752, 1006, +2305, 2356, -168, -773, -230, 1212, 2505, 773, -776, 952, 2442, 711, 170, 614, 1393, 1267, +-1115, -2456, -1180, 496, 914, 1795, 1435, 1490, 13, -360, -509, 1150, 493, 2149, 3307, 2194, +1739, 1534, -478, -946, -283, -1991, 1077, 2938, 1330, 192, -124, 124, -204, 118, -609, 532, +381, -286, 1186, 1630, 2155, 76, -367, -1369, 81, 2374, 2574, 2955, 2629, 1668, -79, 214, +519, 619, -795, -182, 606, 1852, 1109, -662, -689, -2570, -1859, 525, 582, 380, 797, 161, +830, 1414, -932, -2334, -2953, -628, 2359, 4043, 2916, 1865, 2017, 1910, -1068, -313, -802, -1399, +749, 2539, 2091, 2635, 1141, -1370, -2086, -2906, -2228, -1537, -2935, -270, 3506, 2804, 322, -2068, +-3900, -2533, -1792, -793, 2818, 2878, 2679, 3836, 2262, 200, 301, 341, -2110, -2221, -459, 2940, +1870, 2359, 2189, 1246, -585, -2369, -3566, -4254, -3983, -1214, 1141, 1887, 2558, 328, -2383, -3957, +-3187, -1915, -582, 81, 2808, 4560, 4276, 4642, 3285, 257, -2151, -2036, -861, 154, 694, 1469, +2421, 2085, 716, -1404, -3518, -3323, -2841, -2495, -1450, -502, 1084, 550, 864, -1621, -3207, -4145, +-3255, -2382, 551, 3813, 5006, 5583, 5410, 3939, 1703, 267, -773, -989, -1442, -711, 899, 1762, +1050, -341, -748, -1516, -2435, -3176, -3013, -2140, -1195, -245, -474, -613, -764, -1723, -2566, -3241, +-2240, 505, 2936, 4742, 6062, 5945, 5161, 3755, 1898, 328, -633, -1321, -391, 197, -125, 223, +-163, -1232, -1548, -2304, -3677, -4084, -3411, -2051, -1121, -556, 35, -50, -1092, -2557, -2712, -1804, +-20, 2624, 4686, 5398, 6332, 6799, 5965, 2731, 2063, -657, -1343, -769, -56, -1142, -168, -1402, +-2332, -1903, -2504, -4937, -4709, -3725, -3677, -1297, -386, -1419, -263, -665, -1567, -1103, -759, -577, +1532, 3649, 5670, 7529, 7095, 6149, 4988, 3595, 1466, -728, -1752, -1179, -1453, -1471, -1012, -1685, +-2611, -4077, -5150, -5553, -5498, -5542, -3309, -1002, -400, 362, 700, -905, -1096, -104, 579, 1498, +4007, 5144, 7614, 7933, 6454, 6801, 4838, 1249, 194, -1040, -1600, -2146, -1912, -1372, -1472, -3907, +-5156, -5873, -6633, -7546, -6555, -3774, -1666, -23, 752, 656, 705, 766, 719, 1020, 2977, 4778, +6227, 7022, 7289, 6990, 6943, 4108, 2818, 908, -1132, -2285, -1516, -2046, -1887, -2434, -3981, -5455, +-7155, -8981, -8834, -6904, -5822, -3899, -1115, 107, 1629, 2284, 2250, 3706, 3830, 4191, 6135, 7045, +6775, 6564, 6259, 5655, 4771, 3018, 975, -42, -996, -1593, -2131, -2553, -3532, -4093, -5868, -8476, +-9635, -9299, -9387, -7874, -5234, -2382, 211, 1685, 2280, 4376, 5294, 6646, 7819, 8224, 8387, 8389, +7186, 5013, 3614, 2728, 2291, 1639, 663, 44, -1034, -1959, -2427, -3929, -5953, -7747, -9266, -10540, +-11505, -10503, -9434, -7032, -3420, -986, 1238, 2856, 4533, 6710, 9657, 11305, 11504, 10626, 9615, 7420, +3612, 1877, 1104, 936, 1312, 1151, 863, 254, -1218, -2654, -4525, -7898, -9565, -11327, -12322, -12232, +-10884, -9585, -7070, -4828, -2747, 219, 2863, 4370, 8215, 12134, 14060, 15397, 14831, 11993, 7419, 1406, +-1026, -1304, -27, 1625, 2175, 2296, 1295, -361, -2876, -6304, -9600, -11490, -13356, -13812, -12489, -11652, +-9315, -7117, -5455, -3568, -1367, 1104, 4542, 9645, 14500, 18314, 19344, 18959, 14748, 6848, -389, -3583, +-3624, -1123, 1608, 2978, 3531, 3033, 417, -3193, -7520, -11666, -14287, -15533, -15045, -12877, -10888, -9125, +-7364, -5960, -4693, -2718, -745, 4106, 10931, 16566, 21374, 23609, 22789, 16778, 6696, -2243, -6081, -5594, +-2125, 1760, 4182, 5008, 4113, 646, -3723, -8459, -13298, -16208, -17277, -16143, -13439, -10371, -8431, -6100, +-5783, -5150, -4297, -1702, 3634, 11280, 18717, 23997, 27274, 25251, 17511, 6884, -3496, -8272, -7298, -3399, +1571, 5158, 6439, 5408, 1855, -3952, -10005, -15029, -18467, -19018, -17274, -13833, -10238, -7051, -5410, -5543, +-5733, -5045, -2499, 3348, 11156, 19371, 26007, 28557, 26661, 19041, 6389, -4817, -9077, -8335, -4005, 1421, +5328, 7264, 6755, 2519, -3536, -10274, -16297, -19361, -20241, -18578, -14141, -9765, -6788, -4825, -4802, -5680, +-5421, -2890, 3065, 11807, 20313, 27041, 30069, 27618, 19081, 5426, -5609, -9935, -8854, -4200, 1283, 5731, +8171, 7666, 3331, -2882, -10193, -16724, -20191, -20986, -19173, -15294, -10487, -6764, -4738, -4822, -5548, -5300, +-2586, 3677, 12413, 20932, 28132, 30322, 27384, 18374, 3962, -6290, -9737, -8834, -4211, 1750, 5563, 8568, +8261, 3971, -2368, -9848, -16904, -20700, -21896, -19783, -15047, -11007, -7054, -4698, -4926, -5489, -5318, -2131, +4419, 13285, 21878, 28099, 30240, 26903, 17635, 3120, -6333, -9867, -8838, -4302, 1254, 5626, 8767, 8698, +4308, -1848, -9755, -16612, -20951, -22453, -21058, -17006, -11399, -6775, -4384, -4312, -5077, -5016, -1773, 4639, +13139, 21775, 28634, 30789, 27307, 17441, 1418, -6879, -10309, -8963, -4169, 1356, 5733, 9461, 9194, 4853, +-1379, -9431, -16798, -21378, -22933, -21591, -17567, -11719, -7108, -4303, -4027, -4744, -4888, -1349, 4652, 13561, +22304, 28131, 30594, 26919, 16399, 1569, -6935, -10565, -8456, -4104, 1172, 6017, 9469, 9203, 5367, -1140, +-8808, -16065, -21140, -23826, -22615, -17916, -11994, -7109, -4158, -3416, -4148, -4065, -1118, 4840, 13392, 22096, +28247, 30637, 27023, 16801, 1844, -7418, -10875, -9118, -4468, 1146, 5702, 9430, 9963, 6195, -488, -8469, +-15970, -21524, -23792, -23098, -18154, -12372, -7395, -4109, -3171, -3551, -3298, -448, 5022, 13158, 21909, 28396, +30467, 26320, 15985, 1261, -7123, -10740, -9513, -4913, 1121, 6467, 10074, 9881, 5702, -507, -8540, -15746, +-21274, -23879, -22929, -19008, -12814, -7805, -3924, -2780, -3183, -2708, 89, 5612, 13566, 21612, 27221, 28611, +25976, 16205, 1925, -7152, -10632, -9164, -4520, 1397, 6103, 9644, 9638, 5869, -94, -8131, -15599, -21397, +-24083, -23804, -19905, -13361, -8141, -4027, -2497, -2453, -1988, 667, 5435, 12899, 21137, 26710, 28795, 25766, +15500, 2170, -6566, -10325, -8905, -4074, 1269, 6055, 9872, 9827, 6249, 60, -7904, -15315, -21815, -24487, +-23609, -20609, -14836, -7836, -3842, -2256, -1792, -1844, 469, 5486, 12606, 20773, 26988, 28547, 25165, 14861, +1596, -6731, -10025, -8789, -3730, 1457, 6240, 9535, 9564, 6353, 651, -7196, -15044, -20849, -24834, -24432, +-20546, -14361, -8666, -4238, -2412, -1873, -1149, 1190, 5862, 13032, 20540, 26245, 27611, 23880, 14410, 2044, +-6546, -9647, -8202, -3755, 1504, 6058, 9150, 9400, 6517, 1167, -6360, -14229, -20652, -24232, -24039, -21024, +-15504, -9760, -4928, -2410, -1103, -367, 1671, 6452, 13069, 20176, 25450, 27410, 22653, 14118, 1777, -5736, +-9658, -8248, -3770, 1753, 5944, 9060, 9409, 6549, 1584, -5580, -13452, -19977, -24034, -24274, -21538, -16411, +-10131, -5515, -2546, -793, 277, 2189, 6783, 13169, 20020, 24776, 26351, 22164, 13746, 1805, -6205, -9023, +-7477, -3154, 2219, 5868, 8500, 9095, 6405, 1834, -4838, -12460, -19162, -23099, -23884, -21616, -17064, -11758, +-6109, -3152, -696, 606, 2712, 6833, 13208, 19141, 24420, 25348, 21713, 13144, 2007, -5900, -8277, -7157, +-2906, 1996, 5500, 8268, 8961, 6590, 2275, -4027, -11713, -18358, -22557, -23880, -21514, -17454, -12512, -6983, +-3718, -928, 927, 3045, 7129, 13109, 19065, 23323, 24777, 21065, 13167, 2240, -5294, -8247, -6973, -2179, +2580, 5815, 8433, 8884, 6458, 2397, -4102, -11195, -17240, -21533, -23171, -21494, -18445, -13111, -8728, -3864, +-742, 1184, 3158, 7407, 12813, 18892, 22785, 23289, 19744, 12992, 2039, -5063, -7638, -6014, -1346, 2630, +5925, 8309, 8341, 6031, 2294, -3522, -9993, -15819, -20834, -22910, -21390, -18586, -14753, -9095, -4678, -791, +1826, 3532, 7352, 12694, 18105, 21990, 22717, 19221, 11966, 2272, -4766, -7240, -5513, -1286, 3239, 5968, +8024, 8437, 6227, 2610, -2964, -9322, -15158, -20052, -22426, -21411, -18567, -15601, -9902, -5193, -593, 1772, +4019, 7441, 12649, 17913, 21789, 22201, 19169, 11772, 1878, -5306, -7456, -5171, -841, 3803, 6673, 8297, +8370, 6356, 2437, -2528, -8892, -14805, -19184, -21127, -21215, -19081, -15925, -11340, -5557, -1598, 2058, 4388, +7808, 12768, 17900, 21165, 21791, 18831, 11374, 2356, -4739, -7354, -5092, -710, 3624, 6827, 8593, 7986, +6339, 2757, -2165, -7923, -13613, -18457, -20985, -21286, -19430, -16474, -11886, -6445, -2289, 2019, 4392, 8019, +12805, 17976, 21029, 21864, 18296, 12010, 2478, -4632, -7074, -5420, -766, 3912, 6891, 8729, 8472, 6396, +3236, -1608, -7252, -12683, -17549, -20521, -21513, -19798, -16610, -13409, -7444, -2958, 1906, 4681, 8045, 12475, +17622, 20754, 21150, 18494, 11753, 3255, -4379, -7399, -5713, -501, 3716, 7146, 8787, 8883, 7051, 3860, +-1171, -6876, -12107, -16732, -19865, -21050, -19979, -16996, -13918, -9177, -3746, 1842, 4410, 8175, 12201, 16819, +20342, 20991, 17888, 12582, 3787, -4225, -7269, -5156, -1544, 3618, 7153, 9591, 9719, 7836, 3866, -781, +-6357, -11568, -16118, -19590, -21135, -19953, -17118, -14404, -9516, -4113, 399, 3735, 7633, 11523, 16326, 19919, +20594, 18517, 12611, 4689, -3535, -7396, -6217, -1640, 3518, 7528, 9717, 9856, 8573, 4908, -99, -5965, +-11301, -15717, -19060, -20515, -19528, -17267, -14315, -10350, -5270, -219, 3663, 6872, 11167, 15558, 19299, 20423, +18585, 13275, 4693, -2330, -6736, -6433, -2697, 3285, 7420, 9935, 10695, 8689, 5272, 228, -5606, -10947, +-15316, -18969, -20434, -19585, -17288, -14340, -10403, -5503, -219, 3600, 6869, 11145, 15563, 19246, 20466, 18551, +13275, 4712, -2334, -6760, -6401, -2723, 3285, 7420, 9935, 10695, 8689, 5272, 228, -5606, -10947, -15316, +-18969, -20434, -19585, -17288, -14340, -10403, -5503, -219, 3600, 6869, 11145, 15563, 19246, 20466, 18551, 13275, +4712, -2334, -6760, -6401, -2723, 3256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 681, 829, 624, 885, 870, 643, 808, 729, 667, +907, 713, 597, 783, 694, 711, 839, 716, 763, 884, 773, 817, 850, 679, 676, 651, +520, 532, 476, 341, 320, 279, 180, 100, 5, -105, -144, -163, -294, -404, -480, -593, +-583, -593, -631, -535, -509, -525, -517, -525, -490, -417, -443, -531, -568, -651, -626, -548, +-575, -527, -506, -486, -347, -279, -249, -138, -86, 31, 209, 282, 384, 501, 631, 771, +856, 921, 957, 1137, 1239, 1214, 1305, 1259, 1233, 1383, 1358, 1336, 1291, 1169, 1189, 1224, +1180, 1186, 1183, 1165, 1205, 1262, 1204, 1203, 1147, 1084, 1064, 943, 763, 755, 628, 449, +381, 103, -149, -178, -347, -480, -598, -800, -919, -1046, -1181, -1151, -1123, -1147, -1126, -1224, +-1304, -1244, -1292, -1276, -1259, -1361, -1275, -1144, -1128, -1084, -1078, -1099, -1011, -928, -894, -810, +-691, -602, -405, -229, -149, 39, 183, 389, 716, 1004, 1229, 1422, 1598, 1787, 1990, 2160, +2187, 2173, 2177, 2281, 2368, 2305, 2285, 2281, 2218, 2293, 2204, 2143, 2225, 2121, 2151, 2091, +1845, 1874, 1825, 1747, 1676, 1470, 1332, 1186, 1117, 991, 778, 546, 248, -34, -351, -690, +-958, -1286, -1549, -1752, -1960, -2085, -2294, -2448, -2577, -2761, -2858, -2909, -2825, -2749, -2716, -2658, +-2645, -2524, -2398, -2311, -2088, -1994, -1980, -1843, -1801, -1712, -1480, -1276, -1099, -812, -551, -231, +260, 584, 847, 1144, 1409, 1781, 2141, 2504, 2934, 3249, 3607, 3844, 3968, 4142, 4267, 4389, +4468, 4347, 4218, 4089, 3942, 3872, 3723, 3502, 3269, 3115, 3103, 3062, 2957, 2819, 2631, 2479, +2290, 2117, 1921, 1712, 1428, 1024, 634, 248, -188, -556, -1086, -1651, -2088, -2567, -3043, -3584, +-4128, -4521, -4889, -5132, -5447, -5726, -5750, -5830, -5786, -5688, -5665, -5428, -5098, -4793, -4298, -3833, +-3464, -3031, -2673, -2335, -1940, -1663, -1464, -1293, -1204, -1043, -842, -566, -47, 551, 1244, 2005, +2659, 3405, 4169, 4870, 5586, 6269, 6790, 7247, 7588, 7797, 7890, 7913, 7695, 7274, 6971, 6559, +6130, 5728, 5112, 4667, 4471, 4147, 3935, 3867, 3652, 3598, 3706, 3600, 3505, 3235, 2870, 2613, +2039, 1428, 1058, 289, -451, -1070, -2083, -2958, -3721, -4722, -5651, -6677, -7895, -8811, -9511, -10265, +-10616, -10792, -11101, -10889, -10479, -9993, -9004, -7938, -6838, -5257, -3870, -2766, -1653, -1137, -832, -540, +-924, -1472, -2122, -2975, -3345, -3420, -3424, -2873, -2015, -1016, 553, 2063, 3426, 5282, 7008, 8596, +10220, 11431, 12630, 13721, 14224, 14413, 14156, 13328, 12199, 10705, 9147, 7632, 5999, 4473, 3018, 2057, +1782, 2305, 3057, 4414, 5639, 5972, 6532, 6431, 5587, 5048, 4237, 3290, 2663, 2143, 1663, 1351, +842, -153, -1365, -3004, -4991, -6933, -9037, -11074, -12707, -14680, -16618, -17787, -18467, -18668, -18052, -16989, +-14916, -11680, -8365, -4970, -2078, -120, 1762, 2928, 2987, 2539, 835, -1831, -4193, -6503, -7808, -8203, +-8134, -6841, -5323, -4249, -2902, -1605, 158, 2574, 4733, 6410, 8280, 10645, 13297, 16013, 18053, 19635, +21475, 22663, 22537, 21572, 18477, 13668, 8490, 2807, -1771, -4455, -5470, -3326, 73, 3517, 6758, 9266, +10830, 11052, 9915, 8348, 6116, 4026, 3365, 3002, 3236, 4380, 4671, 4550, 4451, 3209, 1010, -1702, +-5801, -10529, -14229, -18417, -21426, -22067, -22561, -22550, -22180, -21897, -20157, -16959, -13026, -8598, -5563, -3972, +-1521, 1481, 4005, 6537, 6550, 3671, 680, -2930, -6801, -9834, -12223, -12420, -10986, -10502, -10073, -9014, +-6397, -1834, 2697, 5718, 7090, 7869, 10046, 13353, 16124, 18780, 21214, 22846, 25333, 27873, 27999, 25617, +20273, 12508, 4644, -2836, -9296, -11193, -8426, -3444, 3229, 8340, 10962, 13683, 14870, 14034, 11683, 7228, +3489, 2138, 2023, 3243, 5557, 6782, 7446, 7769, 6585, 5328, 3269, -1516, -7429, -13697, -19611, -23468, +-25699, -27617, -27808, -26474, -25175, -22327, -18234, -13473, -8365, -5025, -4291, -4312, -2412, 817, 4146, 5689, +5081, 2723, -391, -4594, -9014, -12276, -13734, -13250, -12557, -13061, -13129, -10695, -5588, -304, 4341, 6617, +7136, 9084, 11839, 14686, 17845, 20253, 22519, 25563, 28649, 30458, 29880, 25597, 17937, 9023, -46, -8209, +-12722, -11811, -7196, -638, 5965, 10860, 14346, 16666, 16526, 14066, 9454, 5137, 2705, 1867, 2631, 4424, +5925, 6961, 7371, 7143, 6740, 5194, 842, -5478, -12387, -18491, -22654, -25338, -27847, -28852, -27854, -26400, +-23337, -19288, -14397, -8980, -5251, -4060, -4237, -2657, 535, 3879, 5581, 5092, 2726, -306, -4432, -8913, +-12218, -13694, -13256, -12565, -13061, -13638, -12250, -8558, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 400, 260, 134, -5, -176, -338, +-451, -546, -660, -754, -795, -822, -836, -796, -760, -745, -694, -598, -503, -452, -466, -517, +-570, -646, -766, -856, -854, -813, -789, -774, -716, -595, -417, -204, 23, 245, 444, 628, +802, 929, 994, 1020, 1072, 1133, 1154, 1136, 1089, 1038, 1004, 994, 986, 973, 976, 983, +990, 973, 952, 960, 982, 953, 840, 656, 405, 153, -60, -228, -328, -374, -346, -274, +-207, -176, -202, -228, -299, -420, -466, -527, -628, -748, -858, -928, -949, -888, -818, -755, +-672, -588, -490, -338, -152, 10, 156, 298, 438, 558, 666, 732, 724, 690, 653, 628, +614, 632, 656, 662, 759, 834, 905, 1002, 1064, 1092, 1014, 909, 772, 580, 333, 51, +-182, -394, -584, -738, -863, -986, -1064, -1054, -1068, -1116, -1212, -1309, -1360, -1406, -1426, -1494, +-1484, -1460, -1476, -1460, -1501, -1496, -1450, -1367, -1242, -1102, -892, -640, -342, -97, 94, 296, +516, 730, 914, 1089, 1224, 1327, 1380, 1442, 1538, 1617, 1709, 1787, 1854, 1878, 1920, 1932, +1865, 1830, 1838, 1844, 1763, 1600, 1402, 1208, 966, 672, 404, 170, -44, -254, -458, -590, +-684, -788, -850, -921, -1031, -1176, -1298, -1412, -1576, -1724, -1864, -2020, -2168, -2324, -2332, -2209, +-2010, -1748, -1458, -1133, -792, -456, -170, 88, 268, 459, 666, 816, 1002, 1108, 1292, 1548, +1746, 1850, 1888, 1940, 1937, 1930, 1886, 1824, 1760, 1705, 1636, 1530, 1438, 1238, 1018, 735, +388, 84, -224, -464, -714, -972, -1162, -1326, -1442, -1616, -1768, -1956, -2140, -2286, -2471, -2671, +-2907, -3101, -3274, -3386, -3479, -3513, -3468, -3384, -3188, -2924, -2620, -2266, -1966, -1647, -1304, -912, +-410, 144, 748, 1326, 1838, 2300, 2708, 3030, 3274, 3469, 3590, 3704, 3726, 3696, 3648, 3566, +3526, 3440, 3278, 2984, 2604, 2284, 2005, 1770, 1538, 1365, 1224, 1050, 888, 609, 217, -226, +-676, -1092, -1518, -1939, -2364, -2760, -3100, -3396, -3628, -3746, -3779, -3786, -3746, -3656, -3554, -3454, +-3366, -3302, -3224, -3106, -2916, -2634, -2276, -1844, -1336, -714, -50, 626, 1326, 2062, 2838, 3566, +4252, 4782, 5066, 5155, 5090, 4878, 4554, 4200, 3716, 3128, 2465, 1806, 1302, 1026, 1018, 1154, +1406, 1732, 2078, 2315, 2314, 2002, 1296, 333, -829, -2112, -3410, -4572, -5426, -5990, -6254, -6334, +-6217, -5922, -5505, -4918, -4316, -3755, -3372, -3209, -3214, -3460, -3796, -4156, -4453, -4680, -4806, -4712, +-4346, -3581, -2420, -956, 700, 2392, 4232, 6227, 8076, 9533, 10676, 11127, 10739, 9648, 7477, 4704, +1899, -608, -2352, -3149, -2934, -1742, 196, 2456, 4806, 6857, 8294, 8974, 8631, 7286, 5286, 2914, +236, -2470, -5044, -7282, -8872, -9692, -9770, -9276, -8273, -6785, -4953, -3111, -1680, -836, -622, -870, +-1436, -2393, -3658, -5078, -6458, -7562, -8214, -8260, -7905, -6988, -5364, -3081, 364, 4375, 8447, 12518, +16085, 18111, 18025, 15688, 11075, 5389, -312, -4933, -7619, -8408, -7575, -5586, -2888, 537, 4540, 8572, +12114, 14698, 15665, 14893, 12788, 9114, 4341, -740, -5688, -9940, -13459, -15727, -16179, -15147, -12754, -9324, +-5504, -2025, 224, 1128, 1171, 798, -98, -1554, -3377, -5416, -7472, -9257, -10296, -11082, -11685, -11956, +-11961, -10570, -7163, -2099, 3895, 11276, 18079, 22812, 25523, 24085, 18767, 11174, 3070, -3642, -8050, -10180, +-10425, -9004, -6649, -2862, 2056, 7050, 11742, 15611, 18184, 19653, 20003, 18324, 14678, 8620, 912, -6804, +-13755, -18617, -21136, -20932, -18291, -13690, -7728, -2460, 1334, 2916, 3162, 3023, 2116, 638, -1944, -4476, +-6700, -8706, -10023, -11518, -13619, -15601, -16935, -17129, -14232, -8806, -1480, 7514, 17466, 25008, 29615, 30303, +25147, 16463, 6806, -1692, -7817, -11419, -13013, -12342, -9958, -5814, 278, 6489, 11786, 16192, 19769, 22417, +24688, 24797, 22097, 16816, 8089, -1753, -11438, -19464, -24055, -25396, -22754, -17599, -11048, -4448, 278, 2920, +3381, 3098, 2141, 444, -1862, -4506, -6300, -7848, -9121, -10394, -12858, -15567, -18014, -19662, -18729, -14759, +-8597, -544, 10210, 20067, 27415, 31791, 30135, 23651, 14262, 4554, -3444, -9120, -12218, -12917, -11470, -8525, +-3522, 2495, 8083, 13162, 17476, 20952, 23993, 25672, 24529, 20511, 13094, 3527, -6362, -15294, -21460, -24432, +-23579, -19614, -13486, -6523, -1002, 2492, 3394, 3026, 2206, 800, -990, -3536, -5563, -7240, -8637, -9746, +-11593, -14235, -16808, -18801, -19387, -16564, -11094, -3590, 6193, 16935, 25193, 30578, 31499, 26400, 17691, 7807, +-1048, -7504, -11494, -13299, -12703, -10302, -5944, 260, 6489, 11845, 16394, 20166, 23142, 25610, 25675, 22863, +17253, 8263, -1790, -11664, -19731, -24316, -25532, -22754, -17490, -10874, -4308, 356, 2935, 3376, 3098, 2072, +270, -2179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -74, -244, -569, -918, -1262, -1622, -1888, -2004, -1887, -1431, -577, 622, +1950, 2770, 3206, 3251, 2454, 1527, 118, -1314, -3163, -3832, -3702, -2192, -395, 1002, 1962, 2335, +2480, 2776, 3212, 3954, 4252, 4780, 5436, 6457, 7457, 6726, 4596, 2320, 456, -578, -535, 133, +1582, 1651, -84, -1201, -1387, -595, 546, 1157, 1438, 1203, 186, -2029, -4431, -6074, -6712, -6280, +-4732, -2873, -1707, -705, -190, -419, -1797, -3862, -4656, -4916, -6799, -9711, -12521, -13537, -12029, -8164, +-2228, 3657, 6397, 8373, 8476, 6368, 4496, 1796, -1464, -4975, -5922, -5039, -2659, 551, 3520, 5488, +6438, 6528, 7205, 8586, 9531, 10539, 10750, 10376, 10889, 11029, 8564, 4528, 968, -1223, -1777, -1283, +686, 2890, 2784, -241, -3376, -4621, -4516, -4025, -3090, -2708, -2362, -2097, -2882, -4235, -4801, -4321, +-2597, -338, 1930, 3209, 2324, 417, -1692, -4284, -4644, -3976, -6580, -12664, -17827, -19619, -18805, -14322, +-4943, 3219, 7662, 10685, 9886, 9086, 8145, 5328, 2169, -1217, -4539, -5966, -5022, -1214, 2078, 5328, +8174, 9212, 10303, 10308, 9775, 9293, 8178, 6561, 6089, 5725, 4703, 1981, -675, -2219, -1375, 1219, +3188, 3807, 2504, 473, -1593, -3546, -4935, -5483, -5165, -4547, -3907, -2887, -1886, -948, -443, 7, +1382, 1840, 1194, -2010, -4577, -4356, -3022, -1199, -2126, -7660, -15169, -20662, -21875, -19382, -11834, 1072, +9430, 12717, 12076, 9514, 6914, 4218, 1723, 603, -597, -1368, -2047, -1340, -28, 2291, 4811, 7061, +8283, 9368, 9094, 8837, 7660, 5393, 4143, 4185, 4535, 2605, -612, -2444, -2512, -720, 2717, 5218, +4553, 3052, 1363, 270, -812, -1920, -2574, -2521, -2420, -2800, -2396, -2329, -1807, -1632, -2405, -1979, +-2351, -3976, -5754, -7432, -7318, -3827, -2359, -6603, -13847, -18479, -19652, -18779, -9999, 5027, 12250, 13914, +13120, 11108, 7320, 3132, 113, -2178, -3164, -3624, -3297, -1804, 985, 3777, 5861, 7536, 8093, 7294, +6624, 5660, 5085, 4393, 4613, 5578, 6670, 6707, 4398, 892, -1626, -2519, -589, 2507, 4032, 3754, +2742, 2133, 2425, 2111, 1140, 262, -778, -1344, -1544, -2327, -3782, -4854, -5590, -5597, -5415, -5794, +-8203, -11373, -12339, -8556, -4020, -5475, -9996, -14036, -16205, -16434, -10201, 2836, 10234, 11731, 11145, 9760, +7550, 4820, 1862, -1287, -3037, -3656, -2475, -321, 2107, 3264, 3653, 5101, 6807, 7613, 7456, 6389, +4889, 3379, 2221, 1542, 3089, 7548, 11078, 11065, 7672, 3852, 1330, 480, 566, 444, 395, 798, +1995, 3080, 2766, 1482, 710, 21, -1229, -1704, -2104, -3187, -4797, -6612, -7722, -7785, -8067, -10224, +-12800, -12316, -7932, -4001, -5266, -9591, -14209, -16730, -14316, -3802, 7685, 12362, 12536, 9761, 7478, 5247, +2330, -439, -1999, -2905, -2662, -1348, 1563, 3681, 4922, 5221, 5983, 6286, 6677, 6433, 5241, 3828, +2700, 1896, 2110, 5281, 10064, 13201, 11448, 8074, 5132, 3176, 2202, 1491, 549, -109, -554, -516, +-1012, -1611, -1476, -1006, -1088, -1030, -970, -1465, -2923, -4223, -5575, -6513, -6690, -7744, -10246, -12441, +-11072, -6007, -4135, -7676, -12377, -16702, -18249, -12984, 321, 9208, 12455, 11427, 9474, 9057, 6801, 2834, +-493, -2405, -2214, -797, 1249, 3123, 3987, 4536, 5389, 6217, 6554, 5682, 3786, 2352, 1261, 859, +1087, 3697, 8639, 12877, 13274, 10723, 7637, 5714, 3850, 2034, 870, -643, -1470, -2306, -2466, -2138, +-1654, -1626, -2415, -3321, -3362, -2750, -2222, -2099, -2822, -3673, -3813, -4015, -6012, -10153, -13452, -12595, +-9197, -9305, -12926, -17075, -18932, -14691, -666, 10376, 13157, 11949, 8791, 9028, 8529, 5096, 1012, -2508, +-3253, -1744, 777, 2871, 4233, 4859, 4989, 5441, 5435, 4311, 2822, 724, -462, -511, -224, 1818, +6777, 12580, 16429, 15639, 11383, 6336, 2396, 471, -1024, -2761, -4027, -4461, -4365, -3642, -2885, -2128, +-1302, -1035, -594, -132, -15, -839, -2494, -4262, -4903, -5145, -7766, -12224, -15793, -16293, -12521, -10729, +-12590, -15224, -16772, -11630, 3484, 12958, 14398, 11903, 8161, 8218, 7640, 3647, -574, -3639, -4012, -2344, +-55, 2455, 3930, 5088, 6186, 7485, 7641, 5720, 2934, 157, -1567, -1268, -609, 1641, 6300, 12043, +16377, 16348, 11680, 5911, 1205, -1369, -1898, -1455, -1857, -2938, -3690, -3605, -2827, -2076, -868, 210, +171, 142, -76, -404, -1636, -3791, -5255, -5921, -7989, -12076, -17510, -22446, -22333, -17249, -12849, -11080, +-11447, -5330, 8236, 14650, 15231, 12153, 7641, 6865, 6472, 2878, -1160, -4599, -4547, -2430, 525, 2732, +4354, 5228, 6135, 7007, 7284, 5930, 4257, 1064, -1476, -2303, -1300, 1364, 5878, 11600, 15992, 17572, +13987, 7122, 503, -2890, -3009, -1356, -1078, -2498, -3550, -3091, -1907, -1112, -422, 122, 370, 636, +1106, 787, -147, -2091, -4089, -5417, -7583, -10453, -15072, -21363, -25324, -23539, -17051, -11584, -10380, -5939, +6252, 13111, 13802, 11959, 8169, 6516, 7020, 5102, 1593, -1306, -2329, -1345, 652, 2589, 4174, 4834, +5718, 6440, 6411, 4980, 2862, 270, -2405, -4269, -3622, -803, 4509, 11123, 16367, 18545, 15645, 8489, +1162, -2974, -3134, -967, 1041, 860, -933, -2269, -2449, -1879, -999, -520, 40, 233, 120, 476, +384, -104, -1820, -3755, -6399, -8990, -12783, -18509, -23988, -26280, -22620, -14879, -10539, -6596, 4174, 11521, +12092, 10709, 7573, 5268, 6423, 6992, 5434, 2866, 965, 551, 1464, 2819, 4069, 4588, 5523, 5930, +5086, 2693, 144, -2687, -4245, -4281, -2723, 64, 4181, 9690, 14704, 18496, 17359, 11164, 3125, -2456, +-4195, -2590, -287, 689, 330, -83, -641, -1305, -1615, -1607, -1343, -921, -609, -579, -279, 147, +-84, -1214, -3657, -6513, -10367, -16222, -22298, -27395, -27667, -20161, -12012, -4678, 6749, 13400, 13104, 10784, +6862, 3811, 4298, 5305, 4966, 3745, 2503, 1989, 2599, 3748, 4472, 5102, 5862, 5451, 3670, 667, +-1654, -3530, -4581, -3956, -2391, 224, 4216, 9536, 14264, 17788, 17428, 12463, 4462, -1794, -4034, -3593, +-1833, -482, 31, -186, -495, -768, -1078, -918, -548, -249, -57, -85, -182, -75, -84, -798, +-3520, -7058, -10633, -16386, -22282, -27551, -31480, -28356, -17734, -3734, 11222, 16927, 16373, 13125, 8321, 4675, +3949, 5232, 5998, 5310, 4509, 2983, 1742, 1398, 2005, 3425, 4421, 4119, 2301, -502, -2429, -3258, +-3340, -2980, -1681, 863, 4587, 9785, 14728, 17758, 17095, 11816, 4801, -1193, -3922, -3062, -849, 437, +337, -81, -711, -1751, -2140, -1850, -1247, -546, 410, 1031, 730, 430, 425, -600, -3638, -7623, +-12445, -18295, -23463, -28004, -31756, -30739, -21412, -3991, 14712, 20812, 18491, 13654, 7948, 3913, 2280, 3192, +4791, 5067, 5349, 4771, 3026, 1969, 2022, 2882, 3506, 3489, 1763, -1960, -4262, -5016, -4277, -3028, +-745, 2824, 7323, 12441, 16589, 18380, 16735, 11128, 3552, -2683, -5141, -4040, -1316, 79, 624, 607, +-122, -1217, -1955, -1811, -779, 490, 1091, 1089, 893, 908, 879, -274, -2581, -6280, -11773, -17844, +-22660, -26841, -30336, -31482, -27202, -10968, 11176, 22063, 21215, 15233, 9265, 4839, 2198, 1917, 3335, 4564, +5834, 5612, 4441, 3285, 2973, 2653, 2558, 1978, -28, -2756, -4398, -4867, -4332, -3540, -1703, 1621, +6395, 12034, 16749, 19535, 17999, 11868, 3709, -2582, -4126, -2940, -928, 176, 231, -143, -1006, -1698, +-2279, -2180, -795, 270, 1199, 2056, 1796, 1291, 399, -682, -2605, -6394, -11714, -18013, -23164, -25944, +-28091, -29070, -26080, -11175, 10800, 22378, 22138, 16032, 8323, 2727, -783, -1280, 1248, 3675, 6251, 7221, +6730, 6057, 5072, 3478, 2010, 549, -1620, -4140, -5262, -4853, -3576, -2533, -723, 2002, 6540, 12192, +16735, 18718, 16654, 10917, 3971, -1471, -3239, -2222, -914, -272, 151, 152, -235, -325, -569, -1501, +-1791, -1111, -215, 721, 1160, 1412, 1068, -141, -2445, -5765, -10691, -16947, -22383, -25388, -26465, -26556, +-24676, -13051, 7061, 20107, 23537, 18092, 9960, 3767, -1025, -2786, -652, 2728, 5840, 7306, 7567, 7074, +5430, 3040, 811, -503, -2178, -3489, -4184, -4148, -3425, -2388, 52, 3035, 6872, 11714, 15638, 17307, +15323, 9729, 3196, -1525, -2266, -700, 486, 406, -136, -694, -1344, -1377, -977, -617, -716, -246, +849, 1009, 762, 52, -1345, -2415, -3933, -6991, -11101, -16273, -20909, -23705, -24873, -24946, -22670, -11636, +4408, 16851, 22773, 19348, 11981, 5563, -244, -2819, -1296, 1693, 4583, 6788, 8433, 8563, 6241, 2439, +-640, -2751, -3884, -4189, -4135, -3469, -2626, -1104, 1167, 4171, 7705, 12134, 15474, 16784, 14058, 8150, +1763, -2133, -1872, 303, 1913, 1960, 894, -102, -837, -1239, -1217, -1403, -1533, -480, 580, 1237, +1359, 366, -1135, -2599, -4657, -8166, -12463, -17042, -21370, -24456, -25770, -25379, -20991, -7808, 7662, 17921, +22183, 18721, 12076, 5398, -263, -3410, -2115, 999, 4208, 7501, 9358, 8985, 6268, 2310, -1428, -4073, +-4796, -4627, -3991, -3200, -1873, -192, 1884, 4667, 7591, 11957, 15795, 17115, 13967, 7652, 1020, -3209, +-3021, 59, 3361, 4346, 2878, 667, -1089, -1848, -2131, -2129, -1428, -50, 892, 1083, 560, -719, +-1825, -3367, -5896, -9247, -13263, -17618, -20462, -22721, -24163, -23973, -19537, -8547, 4959, 15953, 22068, 19790, +13370, 6696, 417, -3307, -2697, 343, 3890, 7250, 8930, 8026, 5262, 1534, -1746, -3804, -4840, -4456, +-3689, -2730, -1534, -57, 2027, 4550, 8043, 12151, 15383, 16697, 13406, 6949, 696, -2994, -3120, -559, +2652, 4506, 4282, 2429, -94, -1515, -1705, -1983, -1519, -32, 907, 1409, 1057, -291, -2068, -3997, +-6861, -10622, -14880, -18498, -20609, -22575, -23734, -23545, -17778, -5326, 7173, 16840, 20881, 17975, 12450, 6554, +486, -3571, -3506, -124, 3894, 7831, 9188, 7362, 3930, 356, -2681, -4094, -4767, -4126, -3298, -2280, +-1241, 384, 2536, 5072, 8275, 11902, 14941, 15815, 12382, 6516, 534, -3277, -3731, -1549, 1828, 4329, +4530, 2672, 181, -1190, -1298, -1266, -1023, -86, 870, 975, 128, -1646, -3569, -5837, -8597, -12101, +-16507, -19270, -20535, -21635, -22411, -20778, -12510, -1180, 7756, 15480, 18448, 16304, 11469, 5835, 505, -3265, +-2691, 346, 3733, 7286, 8501, 6627, 2983, -915, -3709, -4327, -4342, -3694, -2837, -1345, 44, 1555, +3124, 5131, 8096, 11989, 14798, 15262, 11384, 5038, -480, -3358, -3049, -929, 2179, 4393, 4342, 3331, +1331, -486, -1167, -1465, -1288, -469, 217, 783, 379, -1994, -4025, -6302, -9371, -13017, -17081, -19488, +-20628, -21109, -21537, -19906, -11504, -792, 8209, 16707, 19711, 16984, 10926, 4409, -730, -3818, -2912, 943, +4848, 7761, 7902, 5203, 1344, -2164, -3815, -3991, -3166, -2368, -1422, -525, 420, 1520, 2924, 5135, +7975, 11647, 14298, 14734, 10864, 4856, -262, -3067, -3030, -1447, 1272, 3865, 4853, 4395, 3103, 1377, +-128, -1070, -1275, -870, -389, -21, -713, -2512, -5243, -8076, -10915, -14093, -17758, -19581, -20672, -21118, +-21485, -17955, -8575, 1401, 10789, 18412, 20182, 16551, 10388, 3469, -2096, -4300, -2324, 2019, 5829, 7923, +6983, 3610, -98, -2602, -3840, -3977, -3326, -2075, -831, 537, 1155, 1820, 2454, 4408, 7684, 11399, +13998, 14471, 10667, 4577, -990, -3885, -3430, -771, 2221, 4109, 4625, 4312, 3728, 2677, 939, -453, +-740, -303, -181, -180, -1326, -3399, -6167, -9096, -12133, -15580, -18029, -19469, -20162, -20548, -20738, -16663, +-6321, 2387, 10944, 17609, 19167, 15998, 9147, 1860, -3059, -4279, -1220, 4466, 7909, 8493, 6045, 1918, +-1487, -3730, -4928, -4625, -3283, -1693, -249, 1399, 2300, 2988, 3836, 5252, 7912, 10655, 12857, 12779, +9221, 4368, -996, -4821, -4167, -1353, 1907, 3762, 4274, 4308, 4244, 3944, 2645, 272, -700, -858, +-965, -844, -1582, -3642, -6315, -9033, -11820, -15292, -18296, -19993, -21525, -22257, -21542, -15566, -4680, 4284, +12839, 19315, 20204, 16406, 8958, 739, -4902, -5846, -1787, 4698, 8630, 8484, 5568, 1295, -1921, -3549, +-4331, -4237, -3369, -1760, 255, 1732, 2914, 3434, 3803, 5222, 8000, 11281, 13653, 13618, 9760, 3880, +-1443, -5005, -5202, -2580, 1005, 3316, 4016, 4089, 4302, 4166, 2936, 701, -829, -1116, -805, -521, +-1543, -3799, -6202, -9327, -12343, -15180, -17926, -19638, -21533, -22264, -20754, -13789, -2827, 5538, 13195, 18733, +19843, 15934, 8064, -384, -6310, -6879, -1881, 4959, 8843, 8144, 5030, 823, -2277, -3734, -4499, -4161, +-3227, -1392, 753, 2143, 2882, 3725, 4534, 6191, 8485, 11068, 12897, 12931, 9542, 4279, -1151, -5328, +-5006, -1998, 1707, 3453, 3237, 2996, 3550, 4613, 4253, 2219, 273, -827, -1388, -2033, -2999, -5452, +-7950, -10336, -13414, -16256, -18425, -19962, -21366, -21647, -19288, -9967, 568, 7849, 15257, 20004, 19645, 14238, +5526, -2648, -7684, -7662, -2442, 5360, 9658, 8595, 5188, 643, -2637, -4297, -5160, -4437, -2954, -1253, +424, 1845, 3012, 4127, 4891, 6121, 8329, 10975, 12924, 12831, 9179, 3415, -2119, -5333, -4605, -1587, +1525, 2810, 3191, 3551, 4132, 5098, 5051, 3352, 1155, -1251, -2760, -3816, -5149, -6692, -8784, -11446, +-14252, -16783, -18912, -20230, -21185, -21073, -16517, -5626, 3269, 9456, 15394, 18780, 18325, 12476, 3628, -4029, +-7952, -6867, -1898, 5164, 8878, 7919, 4485, 342, -2625, -4286, -4485, -3612, -2209, -548, 1054, 2145, +2919, 3341, 4224, 5692, 8198, 11001, 13157, 12673, 8699, 3056, -3093, -6526, -5193, -1516, 1947, 3173, +3502, 3904, 4486, 4914, 4198, 2600, 953, -500, -1656, -2707, -4785, -7347, -9936, -12681, -15147, -17289, +-19411, -20965, -21606, -20899, -15657, -3923, 4957, 11353, 17298, 19930, 18091, 11310, 1988, -5672, -8931, -7317, +-2076, 4524, 8551, 7790, 4727, 852, -1772, -2980, -3332, -3172, -2236, -1109, 376, 1998, 3522, 4009, +4530, 5771, 8136, 11060, 13046, 12877, 9126, 3022, -3930, -7156, -5391, -1310, 2073, 3081, 3032, 3820, +5029, 6014, 5562, 3531, 1021, -1884, -3804, -4140, -5071, -7150, -9687, -12465, -15019, -17423, -19754, -21532, +-21867, -20544, -13764, -2570, 5271, 11908, 17874, 20576, 18717, 11388, 1945, -5936, -9305, -7041, -1836, 4032, +7297, 6676, 4322, 881, -1889, -3225, -3275, -2637, -1597, -301, 1207, 2696, 3869, 3997, 4453, 5721, +8038, 10603, 12251, 11533, 8261, 2319, -4539, -6566, -4387, -361, 2357, 3110, 3448, 4171, 4946, 4970, +3818, 2065, 142, -1700, -2596, -3135, -5039, -7510, -9695, -12281, -14971, -17473, -19929, -21714, -22063, -21002, +-13652, -904, 7839, 15019, 20605, 21545, 17769, 9621, 66, -7099, -9509, -6861, -1700, 2896, 5783, 5499, +3391, 740, -1185, -1879, -1980, -1959, -1334, -411, 823, 2910, 4016, 4153, 4867, 6195, 8678, 10766, +11850, 10956, 7592, 1642, -4666, -6140, -3619, 393, 2679, 2899, 2872, 3181, 4089, 4565, 3883, 2294, +250, -1767, -2894, -3434, -5024, -7299, -9906, -12527, -15159, -17424, -19960, -21841, -22251, -20255, -10280, 2024, +9032, 15402, 19962, 20899, 17075, 8247, -1508, -8062, -9702, -6203, -1147, 3127, 5454, 4708, 2923, 783, +-1125, -2164, -2029, -1437, -893, 70, 1147, 1988, 3137, 3580, 4378, 5869, 8663, 11225, 12363, 11375, +8227, 1418, -5079, -5886, -2728, 1092, 2634, 2202, 2187, 2943, 3939, 4354, 3896, 3027, 690, -1932, +-3171, -3980, -5229, -7846, -10840, -13415, -15771, -17943, -20466, -21748, -21878, -18737, -7399, 4089, 10011, 15817, +19904, 20482, 16022, 7046, -2168, -8364, -9451, -5840, -873, 2674, 4793, 4250, 2407, 550, -835, -1450, +-1262, -942, -543, 60, 1338, 2442, 3479, 3774, 4465, 5902, 8685, 11033, 12573, 11712, 7689, 348, +-5523, -5795, -2734, 973, 2582, 2250, 2252, 3042, 4305, 4434, 3690, 2708, 585, -1637, -2888, -4240, +-5988, -7894, -10550, -13192, -15732, -17931, -20321, -21864, -21891, -17916, -5988, 4647, 11131, 17095, 20847, 20639, +14942, 5662, -3443, -8819, -9271, -5357, -566, 2324, 4095, 3993, 2276, 713, -832, -1617, -1035, -312, +42, 766, 2024, 3230, 3991, 3923, 4370, 5660, 8421, 10796, 12158, 11327, 7525, -139, -5144, -4854, +-1282, 1907, 2419, 1130, 545, 1372, 3191, 4374, 4407, 3462, 947, -1525, -2822, -3900, -5406, -7865, +-10875, -13550, -16523, -19034, -21181, -21950, -21058, -15420, -3079, 5851, 11264, 16637, 20130, 19802, 13774, 4737, +-3561, -8491, -8832, -5360, -606, 1883, 3240, 3120, 1920, 937, -207, -1118, -1217, -1074, -705, -31, +1550, 3478, 4724, 5153, 5675, 6458, 8941, 11014, 12052, 10708, 5956, -1878, -5606, -4349, -433, 2521, +2618, 1658, 1378, 1983, 2925, 3386, 3113, 2150, 652, -1377, -2687, -3763, -5717, -8562, -11406, -14085, +-16508, -18722, -20886, -21518, -20986, -14660, -1758, 6513, 11772, 17345, 20681, 19818, 13196, 3667, -4773, -8731, +-8207, -4315, 244, 1702, 2000, 1833, 748, -180, -871, -1261, -721, 118, 608, 991, 2293, 4067, +5304, 5532, 5607, 6557, 8954, 10718, 11511, 9852, 4744, -2905, -5694, -3725, -181, 2735, 2998, 2537, +2527, 2907, 3260, 3128, 2628, 1550, -493, -2138, -3081, -4187, -5849, -9033, -12450, -15518, -17536, -19177, +-20343, -20447, -18684, -10171, 1309, 7354, 10875, 14878, 18102, 17824, 11281, 2455, -4254, -6976, -6279, -2723, +825, 1807, 1644, 1344, 277, -534, -1000, -1019, -626, -171, -62, 500, 2212, 4361, 5708, 6076, +6584, 8019, 9952, 11026, 10854, 8791, 2836, -4407, -6378, -3472, 840, 3518, 3287, 2672, 2928, 3525, +3692, 2871, 2243, 1310, -739, -2327, -2832, -3497, -6157, -9522, -12432, -15372, -17650, -19638, -20719, -20736, +-17752, -7491, 3207, 8030, 11424, 15381, 18173, 16406, 8929, 613, -5110, -6760, -5583, -1811, 1728, 2342, +1658, 902, -559, -1393, -1722, -1411, -273, 115, 110, 933, 3017, 5097, 6006, 6419, 6583, 7916, +9498, 11180, 10883, 8026, 929, -5331, -5800, -2601, 1401, 3051, 2550, 2160, 2629, 3021, 2742, 2693, +2757, 1387, -866, -2362, -2938, -4020, -6321, -9687, -13151, -16072, -18146, -19560, -20214, -19674, -15830, -4452, +5233, 9148, 12134, 15672, 17916, 15134, 7030, -1305, -6491, -7536, -5634, -1564, 1644, 1907, 1185, 1259, +374, -182, -390, -636, -228, 73, 102, 1030, 2962, 4863, 5544, 6191, 6556, 8208, 9644, 10890, +10355, 7306, 420, -5451, -5883, -2134, 1925, 3515, 2784, 2374, 2854, 3254, 3369, 3444, 2731, 845, +-1382, -2876, -3644, -5281, -7869, -10886, -13978, -16581, -18042, -18961, -19145, -18806, -12984, -1635, 5274, 8590, +12144, 15885, 17899, 14771, 6585, -1369, -6147, -6890, -5024, -1228, 1658, 1469, 197, -108, -788, -989, +-825, -578, 355, 996, 1086, 1913, 3230, 4892, 5383, 5722, 6220, 7803, 9648, 11450, 11307, 7888, +-64, -5440, -5367, -1806, 1811, 3027, 2469, 1867, 1967, 2589, 2434, 2797, 2405, 524, -1414, -2810, +-3207, -4371, -6977, -9847, -13077, -16293, -17850, -19561, -20093, -18868, -11985, 409, 7190, 9934, 12536, 15108, +16525, 13411, 6014, -1525, -5759, -6770, -4830, -952, 1712, 1208, -831, -963, -932, -1067, -425, 41, +798, 1426, 1418, 1583, 2392, 4055, 4971, 5822, 6780, 8539, 10364, 12353, 11761, 7417, -1083, -6406, +-5410, -1251, 2167, 2393, 1115, 881, 1506, 2550, 3206, 3607, 3113, 1072, -1664, -2924, -3251, -4719, +-7550, -10900, -14283, -17165, -18683, -19614, -19751, -17873, -9444, 2337, 7559, 10336, 12534, 15241, 16377, 11935, +4450, -2110, -5266, -5539, -3692, -27, 1722, 685, -1857, -2434, -2184, -1542, -40, 709, 1493, 1753, +1653, 2348, 2940, 4121, 4728, 5590, 6811, 8634, 10496, 12320, 11127, 6515, -1372, -5387, -4565, -944, +1723, 1430, 350, 556, 1399, 1944, 2537, 3719, 3392, 1550, -1272, -2582, -3215, -5175, -8509, -12199, +-15496, -18170, -19034, -19304, -18864, -16200, -6302, 3904, 7410, 9240, 11989, 15202, 15814, 10836, 3517, -2523, +-5306, -5373, -3069, 462, 2100, 764, -2104, -2854, -2513, -1928, -839, 360, 1447, 2353, 2951, 3123, +3316, 4368, 4783, 5756, 6861, 8986, 11009, 12417, 10987, 5751, -2325, -6377, -4889, -860, 2007, 1913, +493, 165, 361, 871, 1878, 3120, 3308, 1280, -1091, -2291, -3292, -5415, -8910, -12509, -15770, -17905, +-18737, -19198, -18819, -14986, -3946, 4985, 7541, 10002, 12663, 15289, 14421, 8819, 2003, -2707, -4635, -4201, +-1825, 949, 1910, 188, -2712, -3561, -2769, -1494, -122, 689, 1403, 1973, 2338, 2905, 3329, 4148, +4644, 5177, 6434, 8601, 11126, 13445, 12551, 6542, -2820, -7294, -5570, -822, 2294, 1572, 180, 132, +590, 994, 2245, 3322, 3148, 1578, -718, -2272, -3900, -6387, -10653, -14775, -17676, -18942, -18772, -18363, +-17201, -11393, 192, 6419, 8086, 10002, 12904, 15333, 13067, 6477, -233, -3741, -4695, -3266, -313, 2167, +2294, 39, -3004, -3724, -2439, -1103, -81, 961, 1687, 2116, 2456, 2848, 3415, 3894, 3993, 4845, +6197, 8656, 11578, 14009, 13006, 5914, -3478, -6613, -4394, -531, 1433, 695, -163, 325, 650, 548, +1364, 2818, 2543, 464, -1172, -2238, -3869, -6575, -10556, -14155, -17105, -19081, -19083, -18767, -17247, -10065, +1382, 6637, 9107, 11757, 14394, 15171, 11440, 4914, -1007, -4106, -4518, -2683, 443, 2434, 1923, -690, +-3973, -5019, -2993, -789, 936, 2133, 2608, 2969, 3449, 3564, 3423, 3610, 3246, 3598, 4772, 7374, +10933, 14143, 13724, 5846, -3541, -6653, -4262, -127, 1910, 1208, 386, 307, 502, 366, 1083, 2267, +2004, 675, -1118, -2844, -4691, -8034, -12436, -16126, -18731, -19606, -18986, -18246, -16036, -7114, 3380, 7063, +10517, 13986, 16220, 15179, 9676, 2271, -3154, -5558, -5216, -2649, 829, 3277, 2614, -200, -3744, -5004, +-3191, -1112, 800, 2180, 2912, 3554, 4152, 4097, 3612, 3272, 2485, 2560, 4043, 7116, 11223, 14994, +14969, 6382, -3294, -6453, -4451, -607, 1064, 263, -226, 151, 617, 820, 1506, 2366, 1690, -226, +-1538, -2789, -4901, -8236, -12636, -16772, -19446, -19978, -19041, -17840, -14676, -4187, 4738, 7538, 11154, 14778, +16671, 14347, 8044, 1426, -3512, -5712, -5431, -2883, 962, 3282, 2831, 139, -3442, -5158, -3651, -1295, +503, 1979, 3001, 3988, 4947, 4610, 3507, 2744, 2536, 2731, 4098, 7239, 11322, 15379, 15053, 6399, +-3421, -6726, -4696, -851, 909, 257, 120, 278, -13, 99, 1364, 2114, 1290, -529, -1834, -2941, +-5038, -9014, -13773, -17560, -19974, -20073, -18842, -17267, -12062, -766, 5861, 8068, 11897, 15610, 17205, 13472, +6423, -355, -4602, -5955, -5178, -2295, 1293, 3459, 2592, -612, -4229, -5481, -3229, -245, 1993, 3304, +3844, 4056, 4501, 4059, 2706, 1973, 1883, 2304, 3603, 6738, 11413, 16289, 16467, 6477, -3622, -6444, +-3958, -233, 874, -165, -870, -663, -168, 134, 960, 1530, 905, -641, -1989, -3345, -5714, -9749, +-14267, -18151, -20073, -19744, -18341, -16662, -10400, 526, 5465, 8253, 12740, 16430, 17064, 12644, 5551, -868, +-4786, -5546, -4608, -1810, 1566, 3352, 2444, -745, -4252, -5815, -3389, -142, 2046, 3539, 4171, 4297, +4951, 4529, 3185, 2029, 1710, 1782, 3399, 6575, 10978, 15997, 17024, 6831, -3628, -6227, -3491, 85, +1000, -304, -1010, -1083, -1147, -328, 904, 1533, 1067, -621, -2260, -3774, -6347, -10655, -14815, -18656, +-20405, -19650, -18190, -15898, -8514, 2023, 6053, 8959, 13434, 16847, 16085, 10559, 3628, -1891, -4738, -5338, +-4036, -1137, 1969, 3924, 3224, -50, -3970, -6252, -4252, -986, 1618, 3633, 4385, 4854, 5344, 4805, +3284, 2097, 1889, 1610, 2625, 5788, 10580, 16222, 17585, 7250, -3443, -6493, -3826, -371, 666, -196, +-917, -1138, -978, -356, 720, 1358, 1241, 62, -1572, -3731, -7170, -11671, -15890, -19605, -20839, -19792, +-17728, -14141, -5263, 3632, 6347, 9244, 13666, 16680, 14776, 8912, 2492, -2691, -5148, -5344, -3859, -782, +2048, 3890, 3120, 95, -3424, -5721, -3971, -743, 1707, 3285, 3851, 4691, 5415, 5119, 3733, 2435, +1446, 897, 2158, 5654, 10713, 16599, 18564, 7453, -3842, -7063, -4224, -214, 697, -85, -742, -1116, +-1040, -12, 919, 1162, 696, -607, -2073, -3987, -7739, -12479, -17210, -20576, -21476, -20001, -17178, -12041, +-1436, 5678, 7560, 10738, 14786, 16586, 13154, 6735, 689, -3987, -6041, -5988, -3886, -617, 2715, 4883, +4293, 836, -3380, -6375, -4865, -1382, 1694, 4000, 4325, 5071, 5699, 5232, 3677, 2499, 1490, 1133, +2688, 6779, 12167, 17434, 18112, 5728, -5541, -7826, -4642, -303, 884, -90, -875, -1185, -1311, -837, +613, 1863, 1493, 326, -1529, -4206, -8527, -13821, -18765, -21882, -21971, -20085, -16829, -10755, 175, 6583, +8708, 12543, 16438, 17218, 12435, 5556, -590, -5025, -6672, -6216, -3908, -885, 2282, 4925, 4562, 1501, +-2330, -5405, -4490, -1238, 1874, 3846, 4751, 5478, 6006, 5499, 3859, 1901, 384, -724, 942, 5020, +11072, 18036, 21686, 11075, -3074, -8000, -6067, -1572, 236, -522, -1665, -2175, -1848, -658, 653, 1309, +1196, 157, -1826, -4547, -9354, -14935, -20265, -23250, -22786, -19895, -15357, -6603, 4544, 8558, 9974, 12756, +16309, 15896, 10316, 3119, -2664, -6089, -6925, -6251, -3842, -570, 2774, 5735, 5757, 2741, -1291, -4470, +-4315, -1118, 1809, 3832, 4786, 5466, 5698, 4533, 2541, 700, -697, -1098, 535, 4831, 11355, 19071, +24237, 12746, -2458, -7483, -5420, -1471, -120, -1048, -2221, -3096, -2643, -1355, -239, 939, 1149, -177, +-1820, -4809, -9949, -15460, -20573, -23363, -22523, -19686, -14281, -3791, 6174, 9280, 10919, 13740, 16351, 14972, +8525, 1794, -3484, -6381, -7269, -6172, -3666, -905, 2227, 5127, 5964, 4016, 115, -3182, -3501, -603, +2648, 4487, 4868, 5111, 4891, 3990, 2523, 1098, -246, -869, 440, 4200, 10182, 17578, 23070, 14150, +-561, -6346, -5994, -2388, -224, -700, -2117, -3447, -3329, -2518, -1277, 225, 1305, 835, -1186, -4938, +-10461, -16693, -21957, -24641, -23458, -19706, -12983, -825, 7905, 10724, 12383, 14434, 16089, 13699, 6925, 83, +-4979, -7202, -7386, -5731, -3502, -1193, 1591, 4790, 6391, 5048, 1543, -1833, -2393, -167, 1894, 3365, +4659, 5221, 5867, 4748, 2601, 374, -1332, -1776, -463, 3624, 10105, 17407, 24363, 18087, 1217, -6698, +-7814, -4213, -1374, -1406, -2503, -3711, -3610, -2071, -711, 694, 1417, 590, -1359, -5107, -11194, -17526, +-22692, -25158, -24320, -20309, -11656, 2099, 10154, 12542, 14001, 15193, 15427, 11635, 4897, -1215, -5638, -7446, +-7419, -5876, -3656, -1567, 845, 4153, 6404, 6031, 2992, -374, -2151, -573, 1554, 3449, 4851, 5502, +5354, 3967, 2025, -194, -2039, -2277, -341, 4775, 11741, 18969, 25363, 17621, 595, -7303, -7894, -4284, +-1886, -2015, -3114, -4387, -4095, -3428, -2160, -217, 1326, 1264, -921, -5239, -11496, -18224, -23377, -25717, +-24293, -19483, -8609, 6103, 12534, 14434, 14987, 15182, 13891, 9640, 3004, -2776, -6147, -7681, -7577, -5945, +-4312, -2207, 443, 3385, 5941, 6307, 4166, 1261, -471, 1237, 2822, 4027, 4204, 4441, 4267, 3259, +1923, -186, -1452, -1828, -628, 3752, 10787, 18294, 25619, 18523, 1423, -6696, -7631, -4267, -2072, -2425, +-3757, -4708, -4578, -4198, -2882, -476, 1340, 788, -1185, -5784, -12746, -19750, -24424, -26023, -24300, -18660, +-6100, 7776, 13997, 16431, 17133, 16732, 13925, 8374, 1019, -4622, -7560, -8461, -7647, -6098, -4579, -2587, +-79, 2653, 5711, 7184, 5885, 3546, 1593, 1772, 2338, 3385, 3968, 4310, 4268, 2999, 1035, -1190, +-2391, -2295, -721, 3748, 10360, 17110, 24671, 21298, 3865, -5712, -8218, -5111, -2387, -2325, -3813, -5120, +-4999, -4429, -2836, -645, 744, 763, -1496, -5934, -12277, -19296, -24264, -26506, -24849, -18306, -4514, 8756, +15444, 18702, 19168, 17385, 12926, 6241, -893, -6218, -8289, -8514, -7724, -6612, -5367, -3167, -309, 2479, +6099, 8513, 7895, 5248, 2507, 1780, 2441, 3250, 3399, 3304, 3229, 2286, 798, -716, -1897, -1490, +-86, 4029, 10309, 17142, 24689, 20986, 3229, -6479, -8319, -4802, -2131, -2337, -4035, -5386, -5874, -5484, +-3264, -1113, 583, 665, -1573, -6140, -12764, -19508, -24216, -26176, -24342, -17097, -2789, 9892, 17031, 20559, +20608, 17370, 11280, 4521, -1947, -6850, -8624, -8527, -7414, -6470, -5628, -3667, -1272, 1194, 5001, 8173, +8644, 6758, 3990, 2948, 3120, 3968, 3715, 3172, 2475, 1404, -394, -1721, -2507, -2217, -123, 4709, +11291, 18069, 25354, 20875, 2871, -6518, -7856, -4461, -1949, -2382, -4046, -5518, -5998, -5541, -3923, -2115, +-337, 85, -2577, -7181, -14068, -20771, -24684, -26235, -23901, -14312, 1070, 12041, 19250, 22812, 22056, 17216, +9633, 2286, -3869, -8123, -9208, -8911, -7640, -6590, -5966, -4201, -1864, 371, 4025, 8292, 10544, 9324, +6239, 4521, 4035, 3949, 3329, 1809, 1198, 226, -1079, -2677, -3316, -2611, 122, 5470, 12638, 19252, +25893, 20468, 2684, -6506, -7950, -4204, -1820, -2446, -4472, -6167, -6518, -5791, -4602, -3202, -1385, -1421, +-4000, -8251, -14869, -20409, -24051, -25384, -22621, -11592, 2102, 12008, 20530, 24466, 23796, 17640, 8505, 745, +-5447, -9104, -9603, -9109, -7628, -6477, -5672, -3997, -2531, -724, 2621, 7548, 11174, 11277, 8863, 6753, +4951, 4044, 3080, 1716, 442, -973, -2640, -3699, -3486, -1901, 1171, 6618, 13556, 19844, 26055, 19283, +1617, -7220, -7884, -3985, -1693, -2615, -4763, -6544, -7432, -7099, -5315, -3260, -1756, -2270, -4932, -9003, +-15022, -20618, -23602, -24320, -20447, -8389, 3356, 12251, 20700, 24646, 23411, 16788, 7680, -166, -6574, -9852, +-10157, -9290, -7686, -6497, -5430, -3333, -1884, -186, 2342, 6610, 10719, 11765, 9519, 7292, 5931, 4848, +3380, 1057, -474, -1949, -3501, -4271, -3333, -1367, 1666, 7068, 13714, 20088, 25997, 18683, 885, -7994, +-8451, -4521, -2128, -2954, -4821, -6428, -7296, -6838, -5721, -4414, -3158, -3468, -5736, -9662, -15195, -20080, +-22868, -23169, -18315, -6648, 3299, 12087, 21055, 26058, 24511, 16777, 7045, -1052, -7384, -10545, -10537, -9194, +-7439, -6100, -5102, -3536, -2364, -1111, 1358, 5959, 10861, 13205, 11520, 8838, 6614, 4505, 2596, 613, +-1241, -3118, -4395, -4504, -3180, -884, 3009, 8480, 15413, 21684, 26901, 16901, -1133, -9280, -9235, -5107, +-2842, -3797, -4830, -6150, -7219, -6575, -5352, -4407, -3144, -3757, -5591, -9589, -15286, -20312, -22737, -22861, +-17490, -5974, 3293, 12662, 22271, 27205, 25082, 16809, 6919, -1306, -7627, -11031, -11419, -9771, -7787, -6342, +-5078, -3363, -2463, -1278, 1136, 5742, 10996, 13840, 12358, 9579, 7943, 5449, 2916, 356, -2057, -3924, +-5213, -4993, -3515, -798, 3502, 9026, 16104, 22914, 27332, 15352, -1920, -9606, -9407, -5398, -3332, -4315, +-5239, -6700, -7492, -6700, -5623, -4482, -4204, -5302, -7650, -11748, -16795, -20559, -22071, -20815, -12383, -1908, +5006, 13716, 22512, 26992, 24295, 15869, 6378, -1578, -7877, -11325, -11868, -10477, -8445, -6670, -5248, -3981, +-2882, -1794, 604, 4916, 10483, 14756, 14684, 12332, 10182, 6710, 3462, -15, -2948, -5426, -6910, -6470, +-4095, -813, 4055, 10287, 17506, 24351, 27729, 14365, -2659, -9638, -9254, -5452, -3791, -5061, -6115, -7143, +-7468, -6402, -5294, -4518, -4869, -6544, -8825, -12279, -16411, -19683, -20782, -18126, -8687, 40, 5592, 13574, +21786, 25650, 22718, 14766, 6183, -1470, -7985, -11417, -11896, -10960, -9279, -7248, -5088, -3656, -2809, -1654, +846, 4824, 10325, 14899, 15495, 13736, 11390, 7318, 3323, -589, -3206, -5834, -7593, -6681, -4417, -869, +4472, 11348, 19072, 25672, 26777, 11164, -4465, -9942, -8532, -4961, -4347, -5440, -6275, -7189, -7195, -6554, +-5687, -5863, -6819, -8086, -10178, -13040, -16201, -18421, -18363, -13728, -4039, 1771, 5789, 13021, 20479, 24053, +20661, 13312, 5507, -1504, -7366, -11038, -11743, -10987, -9225, -7005, -4674, -3085, -2333, -1426, 779, 4248, +9133, 14381, 16091, 15306, 12739, 8226, 3066, -1597, -4952, -7206, -7963, -6258, -3466, 352, 5258, 11463, +18640, 25934, 26556, 10137, -4576, -9890, -8351, -5171, -4606, -5672, -6648, -7534, -7505, -6831, -6412, -6473, +-7468, -9141, -11194, -13588, -16197, -18219, -17551, -11519, -2230, 2476, 7109, 14310, 20977, 23125, 19456, 12223, +4703, -1681, -6899, -10395, -11458, -11021, -9444, -6851, -4514, -2865, -2000, -904, 1370, 4475, 8955, 13560, +15062, 14127, 12121, 8093, 3631, -721, -4140, -6924, -7890, -6023, -3415, 314, 5491, 12051, 19266, 26232, +25208, 8031, -5616, -10062, -7848, -4737, -5105, -6470, -6756, -6958, -6893, -6346, -5696, -6440, -8098, -9698, +-12281, -14530, -16773, -17567, -16148, -8737, 617, 4269, 8547, 14838, 20021, 20841, 16934, 10356, 3755, -2036, +-7225, -10251, -11191, -10822, -9395, -6850, -3992, -2333, -1166, -61, 1563, 4022, 7738, 13082, 15750, 15098, +12882, 8757, 3667, -1326, -5197, -8212, -8422, -6246, -3224, 1210, 6153, 12542, 19498, 26362, 23699, 5960, +-6203, -9823, -7555, -4932, -5048, -6210, -6678, -6971, -7013, -6662, -6544, -7567, -10275, -12590, -14578, -15968, +-17129, -16852, -12882, -2883, 4119, 6462, 9909, 15376, 19572, 19330, 15145, 9164, 3234, -2335, -7511, -10374, +-11262, -11172, -9702, -6874, -4135, -2397, -1043, 32, 1741, 4301, 8011, 12873, 15604, 15334, 13290, 8630, +3346, -1480, -5625, -8155, -8422, -6256, -3137, 1025, 6142, 12813, 20192, 26915, 22858, 4739, -7210, -10225, +-7510, -4967, -5527, -6065, -6768, -6890, -6648, -6904, -7163, -8520, -11339, -13547, -15350, -16440, -17354, -16373, +-10546, -27, 5927, 8157, 11205, 16011, 18877, 17505, 13075, 7223, 2290, -2100, -6837, -9730, -11137, -11485, +-9875, -6818, -4002, -2392, -734, 490, 2318, 4756, 7979, 12590, 15877, 16061, 13507, 8798, 3023, -1980, +-6207, -8998, -8790, -6323, -2684, 2036, 7170, 13782, 20840, 27259, 20859, 2169, -7882, -9552, -6440, -4806, +-6144, -7040, -7311, -7158, -7322, -7359, -7893, -9818, -12710, -14898, -15863, -16162, -16319, -14257, -6184, 3581, +7349, 8918, 11699, 15750, 17313, 15213, 11218, 6775, 2827, -1603, -6225, -9398, -11417, -11528, -9615, -6623, +-3714, -1540, 207, 1009, 2259, 4369, 7187, 12064, 15876, 16431, 14340, 9230, 2807, -2930, -7255, -9405, +-8404, -5227, -1583, 2606, 7597, 14209, 21505, 27352, 19099, 1336, -7968, -9832, -6814, -4880, -5977, -7144, +-7386, -7175, -7844, -8047, -8213, -10309, -13183, -15237, -15980, -15946, -15832, -13038, -4347, 4690, 8262, 10293, +13192, 16353, 16575, 13518, 9850, 5994, 2726, -1534, -5783, -8935, -11106, -11429, -9600, -6711, -3710, -1316, +563, 1807, 3629, 5185, 7250, 11642, 15062, 15543, 13294, 8692, 2774, -2463, -6615, -8947, -8008, -5344, +-1649, 2696, 7793, 14468, 21979, 27735, 17432, -234, -8839, -10016, -7000, -5827, -7036, -7652, -7429, -7000, +-7045, -7396, -8031, -10202, -13463, -15863, -16250, -16036, -15761, -11758, -2115, 5921, 9144, 11535, 14557, 16543, +15020, 11660, 8509, 5567, 2848, -1583, -6021, -9343, -11399, -11355, -9351, -6457, -3027, -186, 1681, 2630, +3827, 4891, 6702, 11263, 15205, 15835, 13370, 8161, 2129, -3356, -7189, -9198, -7691, -4708, -1021, 2791, +7305, 13860, 21327, 27672, 17759, -855, -9382, -10260, -7168, -5891, -6768, -7209, -6933, -6676, -7544, -8042, +-9005, -11579, -15141, -16867, -16765, -16239, -15018, -8898, 1293, 7475, 10217, 12340, 14570, 15512, 13183, 9653, +7024, 5078, 2726, -1311, -5639, -9441, -11463, -10933, -8795, -5959, -2504, 254, 2134, 3103, 4322, 5043, +6865, 11436, 15160, 15675, 13069, 7761, 1228, -4074, -8038, -9429, -7778, -4405, -682, 3263, 7777, 14166, +22006, 28354, 16881, -2174, -10403, -10861, -7187, -5989, -7554, -7700, -7200, -7262, -8029, -8792, -10196, -13017, +-16368, -17330, -16356, -15224, -12648, -4112, 4883, 8813, 10810, 12367, 14287, 13990, 10812, 7292, 5100, 4195, +2499, -1235, -5328, -8949, -11349, -11015, -8572, -5388, -2225, 430, 2585, 4128, 5110, 5342, 6991, 11204, +15355, 16193, 13273, 7728, 835, -4659, -8243, -9589, -7599, -3941, -694, 2674, 7195, 14111, 21868, 28419, +17666, -1744, -10854, -12088, -8530, -6584, -7597, -7899, -7220, -7279, -8543, -9779, -11645, -14151, -17214, -17761, +-16154, -13924, -9935, -917, 6355, 9424, 11428, 12875, 14106, 12674, 8869, 5451, 4187, 4482, 3438, -128, +-4496, -8728, -11404, -11075, -8800, -5502, -1539, 1496, 3197, 4276, 5032, 5408, 7179, 11375, 14995, 15441, +12774, 7265, 540, -4281, -8277, -9511, -7895, -4245, -410, 2951, 7289, 13666, 20760, 28208, 19701, -546, +-11135, -13387, -9999, -7976, -8224, -8185, -7535, -7861, -9096, -10472, -12236, -14859, -17730, -17747, -15391, -12870, +-7524, 1527, 6798, 9339, 11893, 13628, 14109, 11450, 7127, 3886, 3472, 4221, 3516, 124, -4384, -8325, +-10599, -10036, -8331, -5452, -1729, 1358, 3317, 4781, 5617, 5818, 7535, 11442, 14959, 15091, 12316, 6984, +556, -4279, -7705, -9097, -7820, -4418, -423, 2420, 6748, 12907, 19798, 28009, 21869, -524, -11938, -14547, +-10965, -8209, -8316, -8034, -6971, -7481, -9178, -10823, -12808, -16094, -18624, -18144, -15517, -12374, -5518, 4102, +8260, 10481, 12906, 14437, 13832, 10212, 5629, 2499, 2456, 3991, 3881, 583, -4050, -8266, -10399, -10086, +-8416, -5268, -1019, 2487, 4450, 5732, 6103, 5721, 7012, 10730, 14073, 14315, 11637, 6591, 409, -4090, +-7476, -9162, -7410, -3786, -278, 1969, 6338, 12663, 19605, 28193, 21467, -737, -12085, -15037, -11660, -9082, +-8500, -7303, -7326, -8542, -10613, -12745, -14642, -17209, -18556, -16774, -13701, -9732, -1074, 6758, 8986, 10807, +13127, 14162, 12377, 8408, 3803, 1568, 2735, 4146, 4390, 898, -4267, -8394, -10733, -10356, -8117, -4754, +-229, 3042, 4775, 5644, 6322, 6410, 8147, 11641, 14221, 14210, 11564, 6164, -52, -4637, -7627, -8752, +-7242, -3935, -861, 1836, 6680, 13056, 19880, 28932, 21670, -1779, -13008, -15534, -11445, -9434, -9038, -7318, +-7357, -9164, -11683, -13768, -15896, -18273, -19206, -17139, -13210, -6828, 2949, 8916, 10176, 11569, 13849, 14209, +11288, 6503, 2345, 815, 2029, 3690, 4000, 549, -4181, -7965, -9909, -10031, -8054, -4601, -350, 3106, +5238, 6520, 7050, 6668, 7779, 10860, 13711, 13944, 11021, 5882, 250, -3918, -7087, -8333, -7098, -4244, +-1423, 973, 5471, 12029, 18427, 27750, 24457, 1127, -12526, -16703, -13757, -10178, -8246, -7289, -7798, -9398, +-11792, -14587, -17587, -20229, -19983, -16827, -11663, -3941, 5035, 9213, 10214, 12534, 15214, 14936, 10792, 5328, +845, -560, 1213, 3947, 4646, 776, -4499, -8045, -10142, -10233, -8057, -4336, 147, 3677, 5872, 6857, +7307, 6950, 7844, 10745, 13290, 13271, 10893, 6600, 810, -3515, -6756, -8212, -6760, -4347, -1903, 212, +3963, 10125, 16164, 24727, 27241, 5959, -11079, -17745, -15780, -11075, -7971, -6876, -7797, -9720, -12093, -15091, +-18218, -20599, -19947, -16924, -11436, -2696, 6275, 9765, 10900, 13672, 16187, 14928, 9621, 4106, 214, -566, +933, 3008, 3558, 558, -3895, -7168, -9371, -9785, -7810, -4412, 8, 3549, 5849, 6885, 7122, 7242, +8048, 10618, 13208, 13144, 10293, 5905, 582, -3074, -5602, -6872, -5848, -4395, -2881, -1210, 2692, 8769, +14502, 22504, 28747, 10285, -10622, -18379, -17470, -11504, -7873, -7249, -7762, -9721, -12427, -15847, -19265, -21301, +-20220, -16741, -10129, 98, 8107, 10060, 11361, 14124, 16412, 14108, 8125, 2703, -539, -846, 735, 2881, +3847, 934, -3820, -7195, -9553, -9924, -7689, -4244, 225, 4152, 6535, 7446, 7573, 7488, 8097, 10206, +12445, 12226, 9822, 5987, 981, -2595, -5010, -6477, -5977, -4591, -3105, -1334, 2509, 8556, 14176, 21964, +28567, 10656, -10603, -18504, -17561, -11620, -7758, -7172, -7955, -10012, -12790, -16240, -19684, -21477, -20192, -16511, +-9526, 805, 8460, 10270, 11436, 14135, 16361, 13982, 8009, 2638, -559, -846, 728, 2877, 3854, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +360, 821, 1191, 894, 1272, 1400, 1356, 1195, 1393, 1686, 2102, 2901, 2657, 1282, -716, -2563, +-4076, -4493, -4637, -3823, -2180, -48, 1879, 2554, 2433, 1424, 628, 481, 1122, 1541, 2259, 2658, +2739, 2763, 1204, -777, -2774, -4110, -4335, -3631, -2720, -1571, -596, 418, 997, 1667, 2293, 1893, +739, -425, -633, 441, 2098, 3198, 3208, 2122, 536, -1014, -2464, -3589, -4280, -3816, -1790, 616, +1825, 1721, 562, -1069, -778, 1405, 1950, 1452, 252, -877, -580, 766, 1948, 2806, 2483, 678, +-1477, -2723, -3561, -4107, -2515, -425, 1508, 2618, 2135, 1031, -509, -1648, -339, 1472, 1428, 417, +-1090, -2011, -1345, 523, 2167, 2975, 1762, -742, -2460, -3297, -2984, -754, 1019, 2606, 3061, 2195, +1205, -396, -3243, -4462, -471, 2507, 1631, 23, -1967, -2703, -1582, 488, 1832, 2056, 206, -2196, +-2616, -23, 1836, 2300, 2152, 1716, 1691, 1673, 161, -3331, -7343, -3840, 3473, 2963, 2268, -477, +-2671, -3662, -2728, -766, 788, 986, 461, 574, 2222, 3287, 2716, 1564, 655, 602, 372, -711, +-4233, -9852, -4892, 5991, 5255, 4325, -382, -3304, -4715, -4197, -2731, -946, 637, 2540, 3846, 4204, +3918, 2237, 1128, 271, 179, -240, -1300, -5171, -13599, -6651, 9172, 7734, 5383, -826, -2921, -4125, +-4428, -4424, -3421, -936, 3645, 6245, 5747, 5200, 3111, 1581, 75, -910, -1913, -3116, -6644, -13242, +-4153, 10432, 8659, 4549, -1559, -3656, -5030, -5772, -7066, -5065, 861, 7544, 9560, 7418, 5205, 3647, +1553, -864, -2756, -3528, -4229, -6875, -13847, -3167, 10822, 9345, 4585, -1793, -3960, -5369, -6278, -7706, +-5256, 1213, 8127, 10184, 8171, 5784, 3686, 851, -1441, -2922, -3082, -2949, -4855, -12441, -8084, 8441, +8960, 5791, -618, -3353, -5650, -6441, -7303, -5947, 618, 6542, 8907, 7605, 6401, 4737, 2212, -396, +-1998, -2306, -1794, -2207, -10460, -13164, 7348, 6740, 7542, 202, -2080, -6057, -7071, -8273, -6457, -383, +5096, 8120, 7446, 7706, 5710, 3512, 45, -1528, -2279, -834, -736, -4914, -15796, -257, 5070, 7403, +2512, -1453, -6176, -8481, -8715, -6878, -582, 5499, 9060, 7535, 7965, 6110, 3854, 825, -523, -819, +395, 851, -1452, -10693, -14841, 4220, 1614, 7194, -521, -3805, -9037, -10054, -6659, -614, 6354, 9180, +8770, 7165, 6438, 2650, 2309, -249, 645, 306, 740, -1086, -6240, -18030, -1107, 1563, 5420, 1915, +-2610, -7458, -11084, -8008, -458, 6466, 10031, 9549, 6595, 6000, 2143, 1682, 536, 1188, 1349, 1000, +-914, -3020, -15985, -11342, 5118, -342, 5872, -2593, -4633, -11343, -8789, -896, 6399, 10582, 10507, 8174, +4937, 1877, -348, 689, 1205, 2253, 1264, -771, -2673, -12252, -18507, 6864, -2615, 6159, -1502, -3354, +-9767, -9868, -674, 5966, 10761, 10575, 8797, 4318, 2265, -962, 353, 755, 2306, 899, -170, -2511, +-10222, -21385, 6664, -1363, 4207, -27, -3863, -9067, -10152, -221, 6418, 11225, 10644, 9394, 4540, 2650, +-1588, -585, -247, 1843, 1217, 523, -2005, -7150, -23237, 1887, 3425, -427, 2403, -5292, -8776, -8921, +1998, 7622, 10912, 10598, 10044, 4529, 1387, -1742, -2250, -581, 1394, 1622, 888, -1152, -6402, -22659, +48, 5541, -2811, 1616, -5531, -8135, -7768, 2411, 8229, 11227, 10759, 10302, 4815, 328, -2397, -2915, +-978, 822, 1640, 1244, -829, -4031, -20304, -7752, 11044, -5466, -538, -4923, -8426, -6632, 3251, 9244, +11592, 11065, 10608, 5593, -841, -2752, -4316, -1316, 426, 1714, 1242, 125, -2280, -15342, -15580, 12567, +-5650, -3079, -3934, -9442, -5385, 4261, 11349, 11742, 11771, 10384, 5492, -2429, -3521, -4545, -1742, -65, +2034, 1780, 426, -1459, -10805, -20203, 9444, -2507, -4734, -5815, -8794, -3785, 5214, 12516, 12177, 11722, +10217, 5442, -3104, -4208, -5083, -1354, 457, 2040, 1518, 791, -1083, -5673, -22141, -840, 4117, -5066, +-9746, -7055, -2073, 6133, 12241, 12277, 11181, 10206, 6431, -2594, -4235, -4866, -1405, 84, 1510, 1313, +907, -1464, -3647, -17102, -12723, 8242, -4647, -10831, -8711, 1399, 6814, 12123, 12840, 10619, 9926, 6957, +-1455, -5410, -4706, -2201, -132, 657, 1097, 789, -1342, -3355, -13291, -16893, 7883, -2816, -8782, -12374, +3827, 6804, 12112, 12183, 11087, 9828, 6607, -779, -6317, -5027, -2703, 193, 581, 1545, 138, -1107, +-3483, -7164, -21341, 1519, 1986, -6402, -14925, 2197, 8074, 12512, 12870, 11546, 9885, 6670, 524, -6971, +-6510, -3460, 624, -216, 1497, -431, -1074, -3789, -4855, -20083, -6205, 6782, -6368, -11571, -1972, 10400, +11450, 13192, 11973, 10269, 7011, 259, -7082, -7722, -3170, 452, 365, 721, -1115, -1859, -3643, -3030, +-13865, -16863, 8918, -6662, -5540, -6365, 10917, 11761, 13761, 12387, 10702, 6604, -656, -6571, -9562, -3998, +-644, 1870, 376, 264, -1872, -2515, -2647, -9146, -22745, 7612, -5608, -3838, -6743, 7620, 13967, 12906, +13476, 11005, 6611, -461, -5487, -9739, -4430, -1290, 2984, 16, -158, -2501, -2046, -3047, -6086, -24340, +1290, -3190, -3421, -2437, 3127, 16133, 12505, 14974, 10411, 6234, -843, -4798, -9376, -5222, -1803, 2406, +1280, 8, -1924, -2342, -3471, -4967, -22301, -6969, 249, -4171, 2645, 277, 15432, 12757, 14310, 10837, +6591, 1, -4306, -8806, -6017, -2152, 1636, 1889, -406, -1773, -2416, -2883, -4062, -17506, -17930, 3048, +-6045, 6751, 1155, 13314, 15810, 13615, 11662, 4798, -769, -5524, -7374, -6175, -1151, 1533, 3234, -466, +-2201, -3439, -2668, -4183, -14703, -22256, 3224, -5095, 8914, 3332, 9064, 16629, 12917, 12853, 4499, -443, +-5543, -7390, -6526, -886, 1065, 2655, -809, -2180, -3168, -2496, -3830, -12639, -25736, 932, -2489, 9846, +6965, 7311, 16700, 13643, 12033, 3585, -2455, -5909, -6912, -6387, -599, 1114, 3464, -367, -2144, -3944, +-2980, -3524, -8177, -26505, -8089, 3551, 7936, 10999, 7699, 12958, 15159, 10752, 5319, -3057, -5422, -6796, +-6393, -1559, 1091, 2729, -515, -2365, -4170, -2678, -3386, -7227, -26047, -10779, 6388, 7703, 13593, 9265, +10538, 14564, 9107, 4867, -3772, -5599, -5938, -6176, -1380, 1890, 3150, -302, -2762, -4844, -2699, -3612, +-5079, -19416, -25151, 9754, 7378, 16368, 11969, 9231, 10365, 10622, 4858, -1974, -5326, -5481, -4786, -2654, +1671, 1137, 142, -2938, -3545, -4127, -2976, -5585, -19568, -25255, 11511, 7394, 15885, 11838, 10000, 9790, +11021, 3961, -2252, -5982, -4796, -3690, -2787, 2030, 1136, 616, -3450, -3362, -4713, -3145, -5512, -13652, +-30753, 6041, 11315, 15084, 13515, 11561, 6939, 10657, 4721, -1651, -5818, -5343, -2188, -2756, 1558, 473, +286, -3623, -2698, -5002, -3606, -5514, -14111, -30267, 6144, 12515, 15597, 13049, 12184, 7809, 9951, 3743, +-2682, -6787, -5149, -1334, -1718, 2222, 744, 459, -4085, -2952, -5426, -3817, -5898, -10729, -29073, -5798, +18892, 14133, 16297, 11904, 10086, 5654, 5901, -3045, -5733, -5717, -998, -841, 797, 920, -820, -2940, +-3744, -4362, -5090, -5094, -11509, -28859, -4921, 18537, 15427, 15912, 12403, 9899, 5630, 5816, -3654, -5790, +-6961, -765, -1705, 860, 821, -100, -2761, -3595, -4112, -4645, -5607, -10659, -22945, -16307, 21583, 15094, +18744, 12300, 12190, 4130, 2240, -2444, -6236, -6634, -2139, -331, -78, 2259, -89, -1473, -4546, -3675, +-5608, -5167, -10713, -23867, -13961, 20922, 15625, 18261, 12511, 11806, 3870, 1854, -2824, -6127, -6238, -1844, +-6, -198, 2053, -14, -976, -4560, -3888, -5777, -6027, -11361, -17945, -20385, 18793, 18401, 19813, 13544, +11434, 4699, -2978, -2282, -6793, -4856, -2204, 1293, -315, 2421, -197, -184, -4359, -4462, -5902, -6380, +-10795, -19035, -18414, 19207, 17930, 19173, 12274, 12068, 4683, -1815, -2904, -6915, -4710, -2477, 2223, -1294, +1866, -325, 200, -4134, -4336, -5727, -7017, -11725, -14236, -19890, 12878, 22212, 19243, 14591, 10468, 5021, +-3397, -6325, -5061, -4107, -1377, 2317, -760, 1332, -313, -669, -3273, -4922, -5531, -7249, -11258, -16427, +-19500, 16549, 20910, 20893, 12959, 10609, 3522, -3507, -5560, -5264, -3479, -1048, 2726, -1054, 400, -525, +-147, -2899, -4641, -5913, -6752, -12636, -12573, -17941, 5858, 26048, 18670, 16576, 9244, 4012, -2077, -7835, +-4771, -3494, -19, 2421, 222, -1309, -199, -1082, -1997, -5157, -6371, -7281, -11927, -12704, -17649, 8370, +24720, 21196, 15810, 8410, 2835, -3368, -7445, -3802, -3208, 634, 2326, 74, -1524, -1460, -503, -1914, +-4722, -6772, -7167, -12789, -11765, -17734, 8026, 26137, 20627, 16349, 7253, 1727, -3685, -6599, -3846, -1936, +819, 2981, -186, -2667, -2110, -711, -2102, -4116, -7319, -7685, -12415, -11563, -16365, 10268, 23478, 21455, +16324, 7060, 1881, -4532, -6681, -3397, -1701, 419, 2946, -611, -2570, -3258, -828, -1200, -3242, -6991, +-8897, -12964, -9103, -14055, 2282, 27517, 20681, 18749, 6777, 695, -4922, -6296, -6761, 187, 842, 3927, +125, -3906, -3218, -1635, -333, -3373, -6812, -10756, -11834, -8040, -13348, 4889, 26550, 19782, 18914, 5723, +289, -5977, -6471, -6226, 1593, 224, 4303, 63, -3438, -3864, -2359, -255, -2481, -6854, -11700, -12489, +-5830, -10633, 52, 27768, 19549, 19044, 5190, 254, -6154, -5160, -7231, 1349, 947, 3354, 627, -3349, +-4070, -2382, -200, -2503, -6158, -13339, -12562, -5150, -10875, 3531, 27261, 19317, 19199, 4889, -681, -6686, +-5808, -7030, 1792, 2044, 3015, -347, -3212, -4136, -2679, -462, -2515, -6164, -13054, -12670, -4009, -8763, +1097, 27986, 19120, 18813, 4153, -1223, -7314, -4783, -6312, 601, 3298, 2045, -69, -3517, -3644, -3359, +-208, -2464, -5882, -13542, -11969, -3917, -8178, 1314, 28350, 18700, 19073, 3927, -1770, -7111, -5461, -5725, +-787, 4315, 2068, 157, -3954, -3128, -3885, -513, -2708, -5839, -13530, -11317, -3705, -6973, -201, 27147, +18889, 19309, 4581, -2060, -7662, -5402, -4553, -2108, 5408, 1407, -126, -4123, -2536, -4041, -688, -2654, +-6596, -13601, -10330, -3010, -5720, -1033, 27680, 18933, 18830, 4283, -2833, -7601, -5873, -3476, -3186, 5915, +2534, 70, -5651, -3016, -4049, -1034, -2779, -6610, -12586, -8894, -2082, -5268, -3761, 27331, 19112, 18849, +4311, -2854, -7663, -5894, -1784, -3942, 4701, 3479, -594, -5709, -3272, -3289, -1480, -3027, -7260, -12506, +-7967, -2314, -6489, -114, 27288, 19681, 18044, 4221, -3803, -7929, -6278, -2179, -3230, 4203, 4102, -781, +-5791, -3684, -3003, -2012, -3406, -8085, -11526, -6827, -1576, -5971, -1895, 28244, 19688, 18198, 3585, -4713, +-8065, -6079, -1338, -3230, 2433, 6011, -1322, -5214, -4559, -2971, -2218, -3840, -8660, -10811, -5420, -1356, +-7566, 2105, 27404, 19682, 17427, 2666, -5351, -8100, -5744, -1764, -2282, 1617, 6357, -1896, -5077, -5216, +-2617, -2332, -3951, -9515, -9398, -4404, -694, -6518, -955, 27904, 19621, 17660, 2294, -6073, -8162, -5911, +-861, -1400, -170, 7596, -2126, -4816, -5227, -3197, -2282, -4569, -10016, -8921, -3357, 56, -8339, 2019, +28084, 19120, 16904, 2195, -6512, -8843, -5274, -1261, -324, -863, 7568, -1770, -4728, -5503, -3381, -2882, +-5022, -10811, -7462, -2408, 190, -9758, 3854, 27745, 19201, 16180, 1668, -6698, -8992, -4390, -1166, -86, +-2137, 8327, -1546, -4783, -5473, -4065, -3299, -5673, -10853, -6454, -1973, -38, -10275, 7292, 25824, 19269, +15019, 2092, -6447, -9489, -3849, -1822, 558, -2234, 7261, -1709, -4314, -5839, -3873, -3886, -6272, -11225, +-5134, -1089, 631, -9533, 6537, 25565, 19459, 15179, 1525, -7490, -9857, -3784, -1321, 1016, -2682, 6662, +-456, -5300, -5359, -4257, -3882, -7121, -10488, -4330, -487, 160, -9842, 7424, 24437, 19670, 14706, 2405, +-7530, -9790, -4377, -895, 1242, -2435, 5020, -40, -5072, -5078, -4548, -4531, -7891, -10347, -3206, 284, +-801, -10645, 13151, 22262, 20611, 13193, 1413, -8918, -9677, -3991, 151, 1170, -2835, 4524, 203, -4557, +-5384, -4790, -5317, -8640, -9882, -1633, 347, -220, -10310, 12911, 22548, 20183, 12757, 752, -8545, -9718, +-4172, 213, 1219, -2150, 2424, 619, -5023, -4792, -4984, -5412, -9382, -9091, -1262, 1286, -835, -10206, +15160, 20787, 20468, 12015, 809, -9118, -9859, -4538, 667, 1636, -1789, 1439, 904, -4402, -5104, -5517, +-6177, -9828, -8430, -172, 1357, -1744, -10005, 18149, 19698, 20539, 10985, 683, -9125, -9926, -4898, 389, +1400, -1905, 527, 429, -3701, -3858, -5352, -6580, -10278, -7577, -188, 1850, -3259, -9369, 20368, 18409, +20814, 10577, 230, -9793, -9649, -5278, 755, 1531, -2145, -486, 1245, -3443, -4490, -5657, -7119, -10446, +-6557, 516, 2006, -5624, -6210, 23393, 16923, 19814, 8691, 360, -9659, -8795, -5980, 705, 1280, -1820, +-577, 1090, -3414, -3536, -5892, -8137, -10870, -5285, 658, 1663, -7724, -2531, 23292, 16260, 19354, 9216, +-253, -10240, -8125, -6353, 888, 1195, -1410, -1573, 1523, -3360, -3981, -6066, -8434, -10721, -4300, 863, +1864, -9117, 400, 23146, 16279, 17841, 8477, 30, -10296, -7515, -6708, 696, 1373, -1236, -2650, 1491, +-2955, -2944, -6534, -9321, -10865, -3295, 1414, 973, -9781, 3341, 22375, 16455, 17044, 8350, -67, -10375, +-7092, -6985, 602, 1082, -414, -3900, 1214, -2778, -2845, -6975, -9797, -10175, -2956, 1924, 884, -9487, +4907, 22181, 16730, 16319, 7151, -988, -10587, -6208, -6241, 174, 867, -5, -4398, 655, -2822, -2830, +-7319, -10369, -9769, -2600, 2909, 759, -9299, 5921, 21924, 16487, 16083, 6908, -1814, -10949, -6150, -5868, +239, 943, 928, -5263, 187, -1779, -3145, -7458, -11409, -9109, -2638, 3014, -1206, -9742, 12701, 20148, +17608, 14144, 5553, -2166, -10123, -6170, -5732, -232, 340, 290, -5499, 764, -2257, -3032, -7771, -11263, +-8387, -1890, 3059, -2202, -9143, 15108, 19003, 17857, 13226, 5264, -2769, -9902, -6250, -5313, -444, 532, +26, -6100, -3, -1132, -2817, -8235, -11700, -7503, -2034, 2685, -5195, -5964, 20090, 16674, 17835, 11660, +5307, -3994, -9000, -6663, -4684, -915, 380, -1229, -5851, 575, -1241, -3128, -8529, -11514, -6194, -1238, +2584, -5308, -5382, 20174, 15643, 17629, 11373, 5399, -4025, -8746, -7182, -4254, -976, 406, -1236, -6086, +-88, -706, -3395, -8524, -10965, -5515, -1297, 1307, -9271, 120, 22471, 15428, 17249, 10867, 3964, -5831, +-8107, -7303, -3222, -1021, 959, -2497, -6206, 551, -715, -3648, -9023, -10940, -4674, -741, 277, -10150, +3260, 22400, 14998, 16316, 10553, 3028, -5914, -7651, -6936, -3016, -832, 761, -3139, -6285, 550, -32, +-4173, -9406, -10508, -4560, -852, -1212, -11558, 8656, 21709, 16302, 14755, 10320, 2197, -7069, -7103, -6592, +-2484, -976, 686, -4006, -6838, 378, 315, -4512, -9600, -10003, -3514, -605, -2522, -11882, 13162, 20395, +16816, 13547, 10290, 1040, -7267, -6781, -6801, -2537, -1058, 750, -4680, -6549, 310, 720, -5420, -9435, +-9590, -3222, -636, -3420, -11473, 16325, 19406, 17489, 12205, 10100, 243, -8190, -6817, -6281, -2052, -813, +749, -5140, -6738, 252, 694, -5935, -9210, -8873, -2628, -1303, -6864, -8527, 20455, 17346, 17778, 11372, +10258, -1089, -8138, -7040, -6005, -1887, -758, 769, -5387, -6779, 646, -14, -6673, -9504, -8025, -2311, +-1993, -8906, -3797, 21706, 17197, 17388, 10557, 8845, -2075, -8007, -7533, -5019, -1878, -21, 139, -5590, +-7153, 928, -853, -6836, -9274, -6672, -2243, -2395, -10661, -32, 21737, 16543, 16533, 10577, 8737, -2603, +-8133, -7713, -4619, -1409, 401, -608, -5676, -7707, 1288, -1150, -7155, -9350, -5564, -1775, -3400, -13159, +6202, 20120, 17398, 15315, 11269, 7216, -3492, -8007, -7771, -3876, -1995, 785, -1445, -5119, -7776, 2098, +-2379, -7235, -9605, -4811, -2532, -6310, -12282, 13802, 17772, 17903, 13143, 11473, 6921, -4177, -8234, -7955, +-3625, -1776, 992, -2304, -5357, -7051, 2188, -4026, -7581, -8746, -3734, -1793, -6926, -11554, 15609, 16868, +17533, 12597, 11468, 5751, -4521, -8393, -8140, -3311, -1518, 1415, -2753, -4895, -6771, 1387, -4666, -7910, +-7856, -3204, -2217, -10463, -7020, 18421, 15634, 17146, 11994, 11974, 5035, -5675, -9260, -7875, -3210, -1200, +1100, -2665, -5237, -6033, 1035, -4871, -8338, -7347, -2992, -2941, -12037, -2227, 18385, 15868, 16090, 12156, +11470, 4006, -5649, -9634, -7806, -3531, -816, 1027, -2537, -5258, -5455, 518, -5365, -8743, -6153, -2554, +-3932, -14060, 3325, 17597, 15938, 15001, 12329, 11688, 3295, -6830, -10326, -7436, -3147, -450, 567, -1939, +-5514, -5105, -301, -6183, -8868, -5118, -2222, -4694, -13806, 7288, 16442, 16268, 13704, 12482, 11129, 2493, +-6679, -10423, -7468, -3254, -220, 498, -1901, -5135, -5264, -773, -6509, -9053, -4330, -2306, -7629, -12082, +12949, 14108, 16537, 12174, 12909, 10595, 1804, -7097, -10469, -7308, -2850, -508, 173, -1611, -5285, -4774, +-1253, -7227, -8735, -3295, -2438, -9796, -9211, 14804, 13864, 15937, 11724, 13069, 10186, 799, -7026, -10599, +-7265, -2599, -661, 358, -1685, -4525, -5417, -2031, -8308, -8004, -2870, -2598, -11900, -3872, 15443, 13444, +14653, 11326, 12821, 9600, 421, -7899, -10425, -7300, -1896, -708, 230, -1614, -3889, -5497, -2421, -9636, +-7373, -2469, -3061, -13558, 501, 14927, 13984, 13564, 11977, 13398, 9072, -918, -8151, -10336, -7412, -1821, +-992, 307, -1745, -3234, -5978, -3037, -10452, -6618, -2087, -4087, -14289, 6178, 13894, 14653, 12354, 12554, +13271, 7701, -2446, -8703, -10143, -6798, -1438, -998, 360, -1435, -2757, -6385, -3782, -11250, -5721, -2139, +-6335, -13349, 11698, 12787, 15057, 10813, 12700, 13097, 7091, -3637, -8699, -10210, -6568, -1435, -1019, 612, +-1367, -3308, -6673, -4922, -11551, -4832, -2105, -8443, -8979, 14297, 11826, 14577, 10053, 12766, 12418, 6223, +-4427, -8697, -9920, -5872, -1874, -776, 214, -1278, -3971, -6039, -5971, -11078, -3908, -2202, -10573, -5159, +14817, 12059, 13614, 9723, 12714, 11958, 5442, -4946, -8504, -9791, -5400, -2200, -636, 26, -850, -4678, +-5852, -7276, -10422, -3445, -3191, -11934, 1757, 13630, 12419, 11927, 9761, 12415, 11700, 4875, -5825, -8618, +-9798, -4822, -2569, -358, 16, -241, -5677, -5187, -8815, -10086, -3359, -5157, -11133, 8080, 11890, 13248, +10312, 9943, 11950, 11301, 3411, -5891, -9083, -9164, -4573, -2525, -295, -83, -493, -6394, -4648, -10419, +-8812, -3097, -6327, -8989, 11086, 10139, 13022, 9082, 10381, 11808, 11316, 2552, -6860, -9559, -8563, -3952, +-2194, -134, 27, -438, -6778, -5106, -11266, -8271, -2960, -8355, -6114, 13137, 9990, 12457, 8523, 10777, +11860, 10777, 1428, -6560, -9964, -8138, -4309, -1853, 5, 402, -1130, -7394, -5997, -11943, -7190, -3363, +-10254, 165, 12843, 9879, 11142, 8770, 10841, 12218, 10030, 161, -7056, -10282, -7499, -4486, -1353, -156, +658, -1974, -7332, -6497, -12154, -6480, -3964, -9610, 3251, 11907, 10429, 10055, 9141, 10662, 12011, 9057, +-135, -7211, -10522, -7435, -4493, -1051, -134, 1264, -2317, -6760, -7932, -12133, -5937, -5826, -9890, 9166, +10373, 11123, 8275, 9416, 10705, 11996, 8561, -1000, -7854, -10582, -7165, -4678, -256, 221, 1323, -3258, +-6943, -8506, -11721, -5421, -7493, -8083, 11776, 9941, 11063, 7463, 9660, 10597, 12049, 7651, -1144, -8366, +-10528, -7317, -4515, -429, 734, 1490, -3471, -7293, -9464, -11315, -4691, -9724, -3610, 12801, 9198, 10445, +6604, 9695, 10941, 12322, 6882, -1697, -9585, -10210, -7478, -3596, -414, 1421, 1177, -3806, -7952, -10129, +-10845, -5674, -11954, 3415, 11906, 9610, 8751, 6537, 9490, 11360, 12501, 5862, -1620, -10050, -10038, -8147, +-2574, -481, 2225, 313, -4449, -8698, -10405, -10848, -7449, -11018, 10596, 9112, 10452, 6720, 6740, 9175, +11898, 12168, 5843, -2593, -10889, -9999, -7848, -1570, -316, 2527, -711, -4747, -9175, -10618, -10099, -8493, +-9324, 12321, 8398, 10527, 6321, 7288, 8891, 11538, 11238, 5931, -2881, -10235, -9968, -7939, -1898, 324, +2926, -445, -5201, -10725, -11514, -9528, -10415, -4186, 13573, 7733, 9730, 5682, 7641, 8906, 11805, 10928, +6114, -4499, -10163, -10549, -7022, -1884, 1206, 2824, -688, -6146, -11588, -11906, -9433, -12177, 1629, 13107, +7970, 8672, 5837, 7706, 8902, 11469, 10031, 5924, -5250, -9592, -10714, -6155, -2146, 1872, 2096, -839, +-7074, -12550, -12022, -8810, -11204, 5647, 11559, 7972, 7756, 5914, 7708, 8703, 10516, 9775, 6269, -5843, +-9445, -10858, -5740, -2122, 1964, 2043, -734, -7676, -13990, -11762, -9321, -10074, 9842, 10290, 8055, 6661, +6039, 7517, 9052, 10238, 9848, 5411, -6148, -9876, -10830, -5498, -1849, 2628, 1851, -1160, -8728, -14799, +-11310, -9557, -8329, 12588, 9044, 8221, 6025, 6226, 7353, 9412, 9456, 9848, 4397, -6734, -10561, -10261, +-4551, -1269, 2657, 1588, -1335, -10471, -15781, -11571, -11966, -1729, 14872, 8325, 7110, 5186, 5945, 7124, +9431, 9039, 9912, 3112, -6193, -11181, -9432, -4424, -721, 2167, 1287, -2552, -11688, -15185, -11895, -11953, +3771, 14104, 8252, 6073, 4708, 5615, 6648, 9523, 8565, 10161, 2554, -6187, -11570, -8824, -4166, -326, +1824, 1199, -2984, -12952, -15428, -11455, -12051, 8228, 12838, 7985, 4838, 4706, 5486, 6752, 9337, 8867, +10095, 1797, -5550, -11756, -8513, -4261, 306, 1343, 1122, -3724, -14083, -15812, -12980, -9802, 13802, 10850, +8200, 3215, 4635, 5470, 7255, 9133, 9351, 9556, 714, -6595, -11756, -7564, -3523, 760, 1148, 1246, +-5142, -15597, -15318, -13676, -6693, 15734, 9678, 7270, 3129, 4831, 5591, 7551, 8663, 9972, 8470, -292, +-6818, -10990, -7295, -3013, 863, 1136, 507, -5948, -16705, -15312, -14520, -2502, 16644, 9185, 6815, 2807, +4884, 5507, 7182, 7773, 10789, 8210, -468, -8093, -10275, -6832, -2338, 924, 1061, -300, -7028, -17593, +-15478, -14863, 2384, 16475, 8900, 5285, 2827, 4702, 5579, 7253, 7790, 11781, 7602, -1225, -9042, -9691, +-6508, -1601, 789, 1117, -970, -8430, -18346, -15769, -14427, 6961, 15354, 9299, 4200, 3007, 4611, 5655, +7281, 7773, 11560, 7369, -1638, -9736, -8993, -6113, -1172, 631, 1011, -2094, -9622, -19113, -17340, -12024, +12933, 13532, 9140, 2838, 3285, 4280, 5842, 7038, 7900, 11389, 7278, -2551, -10097, -8390, -5771, -871, +436, 979, -3078, -11277, -19250, -16980, -9292, 15145, 12156, 9041, 2308, 2972, 4040, 5846, 6849, 8801, +11112, 7248, -3502, -10816, -8512, -4736, -314, 876, 480, -4390, -12481, -19379, -17848, -5483, 17034, 11136, +8236, 2008, 3042, 3980, 5988, 6848, 9516, 10668, 6771, -4277, -10884, -8147, -4065, -213, 1064, 107, +-5596, -14070, -20744, -17781, 783, 16740, 11070, 7008, 1961, 2673, 3865, 5985, 6898, 9787, 10371, 6263, +-4868, -10447, -7854, -3291, -412, 1145, -512, -6976, -15258, -21221, -16659, 6208, 15812, 10895, 5372, 2146, +2307, 3965, 5706, 7015, 10052, 10532, 5723, -5721, -10283, -7484, -2905, -313, 1293, -1212, -7829, -16553, +-22096, -14355, 9889, 14493, 10626, 4276, 2425, 2312, 3936, 5283, 7694, 10293, 10847, 4730, -6200, -10127, +-7347, -2603, -275, 1320, -1912, -8717, -17382, -23865, -10839, 13546, 13284, 10194, 3148, 2361, 2080, 4174, +4958, 8226, 10024, 10663, 3903, -6252, -9524, -6885, -2614, -239, 1275, -2717, -9307, -18558, -24874, -6604, +15239, 12922, 9094, 2693, 1861, 2213, 3884, 4675, 8380, 9847, 11279, 3304, -6355, -9473, -6592, -2706, +184, 787, -3587, -10309, -19745, -24928, -1182, 15550, 12582, 7781, 2426, 1520, 2131, 3415, 4510, 8885, +10133, 11794, 2483, -6543, -9213, -6159, -2994, 234, 202, -4286, -10999, -20924, -24349, 2404, 15546, 12515, +6730, 2524, 1160, 2220, 3421, 4824, 9072, 10332, 11883, 1797, -7286, -9242, -5660, -3101, 551, -295, +-5201, -11635, -21772, -23515, 6705, 14627, 12691, 6027, 2403, 692, 2186, 3276, 5279, 9327, 10755, 11300, +852, -7164, -8915, -5484, -3211, 668, -822, -6075, -12504, -23787, -21423, 11115, 13653, 13046, 4813, 2700, +18, 2227, 3065, 5814, 9168, 10977, 10890, 474, -7522, -8737, -5151, -3234, 571, -1858, -6658, -14184, +-26505, -15406, 14654, 12663, 12055, 4121, 2270, -221, 2276, 2827, 6180, 8995, 11508, 10040, 367, -7185, +-8238, -5366, -3413, -161, -3060, -7446, -16300, -27948, -7377, 14780, 13015, 10572, 3960, 1789, -421, 1688, +2642, 6702, 8968, 11993, 9620, 227, -7903, -7832, -5306, -2693, -1084, -3824, -8079, -17036, -27606, -2920, +14638, 12553, 9432, 3937, 1630, -347, 1420, 2845, 6917, 8979, 12026, 8873, -316, -7239, -7396, -5588, +-2564, -1768, -4376, -8813, -18975, -25791, 1669, 13489, 12949, 8227, 4473, 1075, -258, 751, 2771, 7189, +9270, 12025, 8566, -642, -7208, -7296, -5537, -2010, -2625, -5047, -9805, -21884, -23186, 6790, 12713, 12737, +7015, 4614, 593, -359, 404, 3082, 7139, 9774, 11936, 7864, -1083, -6941, -7065, -5512, -1934, -3503, +-5496, -10478, -23139, -20018, 8636, 12474, 12325, 6678, 4394, 305, -518, 125, 3324, 6904, 10041, 11702, +8416, -1184, -6637, -7391, -5684, -2393, -3915, -6131, -11597, -24767, -14906, 9893, 12452, 11218, 6182, 4052, +106, -766, 217, 3716, 7027, 10595, 11387, 7916, -1307, -6388, -7649, -5705, -2871, -4473, -6575, -13030, +-25628, -9744, 9963, 13053, 9768, 6185, 3943, 82, -1047, 250, 3741, 7047, 10590, 11288, 8102, -1791, +-6233, -7792, -5745, -3273, -4596, -7176, -14782, -25670, -4897, 10107, 13355, 8759, 6005, 3501, 167, -1443, +309, 3641, 7052, 10682, 11372, 7858, -1477, -5992, -8093, -5996, -4455, -5035, -7546, -16710, -23756, -328, +9236, 13764, 7430, 5797, 3139, 116, -1660, 728, 3537, 7281, 10644, 11648, 7943, -2279, -6356, -8168, +-5787, -5040, -4933, -8131, -18816, -21431, 2874, 9282, 13510, 6616, 5264, 2618, 341, -1803, 958, 3525, +7769, 10615, 12129, 7086, -2600, -6692, -8021, -6060, -5477, -5285, -9465, -21532, -15557, 4895, 8995, 12801, +5998, 5012, 1982, 80, -2177, 1241, 3576, 8583, 10744, 12649, 6335, -3120, -7068, -7916, -6453, -5993, +-5595, -10494, -22397, -11120, 5354, 10016, 11305, 5907, 4177, 1617, -346, -2100, 1643, 3836, 9167, 10958, +12752, 5656, -2973, -7589, -7993, -7229, -6234, -5925, -12379, -22966, -4423, 4453, 10548, 9964, 5768, 3625, +1204, -1014, -1783, 1990, 3983, 9222, 11081, 13749, 5259, -3280, -8343, -7883, -8127, -6385, -6623, -15760, +-20671, 1115, 3243, 11731, 8471, 6119, 2837, 484, -1711, -989, 1909, 4600, 8941, 11197, 13743, 5088, +-3219, -8949, -8010, -8876, -6532, -7139, -17299, -18278, 3171, 3590, 11854, 7646, 6167, 2267, 125, -1989, +-646, 2000, 4916, 8864, 11946, 14096, 4693, -4328, -9330, -8357, -9108, -6655, -8004, -19632, -13297, 4473, +3557, 11054, 7312, 6162, 1913, -353, -2419, -201, 1996, 5360, 8710, 12839, 13962, 4315, -4801, -9638, +-9077, -9640, -6815, -9958, -20563, -7039, 3872, 4866, 9729, 7232, 5896, 1717, -1190, -2582, -70, 2116, +5719, 8789, 13549, 14020, 3933, -5951, -10116, -9910, -9411, -7056, -11419, -20153, -2729, 2929, 5763, 8957, +6959, 5522, 1846, -1667, -2701, 155, 2327, 5972, 8971, 14082, 13465, 3576, -6151, -10343, -10674, -9628, +-7597, -14026, -17506, 770, 2601, 6115, 7859, 6785, 5578, 1713, -2377, -2539, -299, 2487, 6083, 9458, +14596, 13482, 2918, -6679, -10940, -11219, -9544, -8099, -15726, -14179, 2350, 2362, 6050, 7550, 6628, 5410, +1421, -2659, -2739, -383, 3009, 5922, 10171, 14463, 13412, 2682, -6853, -11330, -12082, -9676, -8635, -17239, +-10628, 3253, 3011, 5648, 7449, 6288, 5182, 952, -3021, -2895, -866, 3258, 6222, 10612, 14910, 13763, +1916, -7279, -12145, -12426, -9664, -9531, -18199, -6142, 3485, 3481, 4516, 7314, 6063, 5067, 499, -3244, +-2974, -1073, 3598, 6252, 11310, 15394, 13837, 1265, -7657, -13028, -13152, -10237, -12071, -16755, -1202, 2936, +3984, 3420, 7474, 5592, 5256, -366, -3322, -3287, -748, 3417, 7268, 12531, 15942, 12485, -502, -8467, +-13662, -12748, -10631, -13860, -13060, 922, 2761, 3478, 3540, 7171, 5573, 4544, -1182, -3120, -3505, -423, +3238, 8091, 13538, 16413, 11204, -1045, -9170, -14166, -13131, -10771, -14596, -10990, 1573, 3241, 3334, 3919, +6914, 5550, 3814, -1667, -2955, -3732, -292, 3211, 8917, 13758, 17203, 10781, -1828, -10432, -14546, -13244, +-11396, -16034, -6872, 1871, 4116, 3050, 3830, 6658, 5337, 3153, -2225, -2770, -3646, 215, 3038, 9665, +13982, 17355, 9833, -2214, -10800, -15178, -13474, -13387, -16357, -2097, 1730, 5240, 2021, 4289, 6190, 5087, +2037, -2026, -2858, -3727, 682, 3124, 10768, 14149, 17378, 9286, -2871, -12062, -15523, -14029, -15815, -14024, +1539, 1460, 5509, 1206, 4878, 5632, 5432, 1300, -2223, -3136, -3521, 801, 3694, 11156, 13948, 16885, +8359, -3207, -12766, -15833, -14376, -16846, -10144, 2425, 2177, 4327, 544, 5445, 5498, 5277, 573, -1965, +-3832, -3199, 537, 4253, 11433, 14726, 16845, 8097, -4435, -14098, -16247, -14863, -17460, -6164, 1931, 2805, +3859, 1144, 5762, 5206, 4525, -194, -1681, -4224, -3010, 581, 5210, 11947, 15821, 16756, 6796, -6373, +-15029, -16643, -16511, -17085, -470, 677, 4393, 2511, 1351, 5238, 5359, 3755, -631, -1728, -4624, -2998, +517, 6519, 12593, 16383, 15684, 6329, -7518, -15591, -16713, -17263, -15461, 1334, 146, 4861, 1518, 2019, +5706, 5288, 2949, -718, -2259, -4693, -3155, 903, 7235, 12933, 16565, 15463, 5533, -8534, -16356, -16900, +-19080, -11672, 2477, 114, 4899, 1154, 1865, 5562, 5553, 2116, -600, -2850, -4583, -3263, 1506, 7742, +13530, 16609, 15371, 4465, -9324, -17130, -17537, -20517, -8058, 2195, 852, 4743, 1197, 2130, 5692, 5380, +1512, -371, -3370, -4490, -3499, 2431, 8398, 13640, 15948, 15044, 3486, -10381, -17617, -18541, -20918, -2754, +979, 2214, 3655, 1365, 1693, 5859, 5071, 1038, -144, -3845, -4739, -3575, 3461, 8810, 14229, 15596, +14632, 1980, -11019, -18190, -19972, -19654, 1147, -380, 3297, 3036, 1472, 1948, 6002, 4320, 1094, -520, +-4063, -5212, -3665, 4017, 9336, 14733, 15758, 14693, 646, -12065, -18678, -21703, -17095, 3574, -1253, 3774, +2210, 1568, 2102, 6448, 3494, 1129, -1147, -4215, -5236, -3168, 5091, 9864, 14810, 15236, 14020, -638, +-12960, -18976, -23005, -13357, 3597, -1163, 4116, 2514, 1452, 2228, 6547, 3018, 1232, -1894, -4453, -6038, +-2573, 5585, 11164, 15105, 15794, 12816, -2513, -13912, -19278, -23935, -9887, 3405, -667, 3803, 2722, 1395, +2101, 6485, 2510, 1167, -2278, -4430, -6158, -1788, 6314, 11975, 14921, 16108, 11611, -4208, -14926, -20169, +-24246, -5114, 1917, 526, 3592, 3521, 907, 1973, 6136, 2168, 986, -2840, -4567, -6582, -747, 6918, +12784, 14645, 15977, 10117, -5065, -15079, -20956, -23712, -2077, 585, 1344, 3242, 3885, 635, 2445, 5628, +2268, 822, -3129, -5018, -6596, 171, 7656, 13222, 13940, 15478, 8864, -6052, -15390, -22501, -21269, 1074, +-1028, 2272, 3135, 4586, 300, 2041, 4874, 2391, 381, -3114, -5241, -6355, 549, 8019, 13510, 14081, +15486, 7332, -7582, -15871, -24412, -17504, 2563, -1503, 2700, 3150, 4494, -431, 2367, 4320, 2720, -210, +-3176, -5903, -5459, 1580, 8884, 13357, 13731, 14656, 6214, -8887, -16856, -25521, -12282, 1829, -1255, 2618, +3641, 4291, -1052, 2338, 3983, 3091, -506, -2959, -6439, -4913, 1810, 9477, 13159, 14333, 14158, 4544, +-9773, -17208, -25966, -9434, 1331, -1015, 2927, 3987, 4084, -1312, 2626, 3756, 3131, -1130, -3356, -6477, +-4362, 2707, 10065, 13050, 14561, 13570, 3299, -10928, -18935, -26136, -5632, 80, 167, 3454, 5029, 3690, +-1682, 1437, 3642, 2855, -697, -3401, -6765, -3670, 3210, 10355, 12633, 14812, 12524, 1862, -10903, -20081, +-24401, -2386, -1693, 709, 2999, 5284, 3405, -1736, 980, 3731, 2292, -672, -3918, -6547, -2896, 4288, +10639, 12489, 14415, 11476, 958, -11701, -21754, -22486, -393, -2626, 1376, 3335, 6054, 2986, -1922, 733, +3638, 1878, -855, -4341, -6205, -2487, 5081, 10689, 12299, 14153, 10726, -29, -12259, -23616, -18963, 747, +-3379, 1649, 3807, 6227, 2257, -2397, 793, 3690, 1433, -751, -4715, -5709, -1907, 5766, 10694, 12175, +13436, 10077, -782, -13660, -25166, -14063, -126, -3085, 1803, 4666, 6207, 1680, -2808, 852, 3631, 1215, +-700, -5177, -5583, -1773, 6633, 10493, 12733, 13086, 9762, -2279, -14580, -26024, -10094, -1104, -3062, 1713, +5395, 5945, 1212, -2974, 1293, 3451, 905, -995, -5272, -4959, -1140, 7613, 10179, 13030, 11910, 8735, +-2976, -16509, -26050, -6022, -2815, -1997, 1866, 6260, 5553, 1020, -3363, 1338, 2964, 805, -1255, -5468, +-4280, -73, 8301, 10179, 12786, 10449, 7756, -4361, -19178, -22540, -2268, -4607, -2024, 1757, 6836, 5468, +1169, -3937, 1539, 2459, 773, -1826, -5248, -4333, 324, 8253, 10134, 12958, 10187, 7595, -4610, -20244, +-20678, -2283, -5334, -1742, 2409, 6927, 5043, 400, -3593, 2314, 1725, 718, -2382, -5049, -3864, 1845, +8345, 10435, 12204, 9432, 6435, -5856, -21789, -17287, -1720, -5774, -2122, 3357, 7307, 5063, 300, -3840, +2079, 1687, 296, -2842, -4782, -3516, 2685, 8183, 10553, 11193, 8103, 6142, -5963, -22289, -13842, -3114, +-6003, -1711, 4683, 7585, 4636, -435, -3901, 1448, 1551, 620, -2905, -4467, -3312, 3280, 7774, 10698, +10603, 7761, 5960, -7221, -22827, -10931, -4178, -5881, -1335, 5507, 7523, 4227, -698, -3850, 818, 1353, +264, -2954, -4030, -2248, 4344, 7931, 10608, 9580, 6846, 5053, -9335, -22386, -7171, -5919, -5390, -865, +6286, 7488, 4051, -789, -3898, 256, 1062, -57, -2577, -3719, -1539, 4371, 7701, 10269, 8849, 6981, +4353, -11490, -20624, -4470, -7243, -5456, -242, 6904, 7378, 3449, -1590, -4027, -8, 930, -80, -2042, +-2755, -1203, 4690, 7665, 9705, 8152, 6710, 3708, -12702, -18499, -3961, -8129, -5567, 802, 7524, 7158, +2955, -1501, -4039, 282, 768, -336, -2167, -2589, -573, 4739, 7747, 9193, 7884, 6859, 2744, -14978, +-15212, -3694, -8562, -6048, 1807, 7862, 6923, 2515, -1440, -4280, -62, 813, -498, -1760, -1719, 298, +4460, 7709, 8192, 7096, 6240, 1344, -16068, -9893, -4986, -8539, -6523, 2962, 8049, 6699, 2083, -1351, +-4666, -85, 470, -1070, -1565, -1370, 1401, 4313, 7954, 7294, 6646, 6089, 304, -16755, -6346, -6158, +-8584, -6892, 3962, 8317, 6189, 1633, -1614, -4759, 145, 560, -835, -1574, -1139, 1976, 4364, 7751, +6610, 6621, 6060, -1344, -16566, -3448, -8156, -8595, -6728, 4926, 8352, 5811, 1254, -1389, -4673, 183, +442, -1266, -1267, -835, 2753, 4458, 7441, 5836, 6460, 5866, -2935, -15670, -2123, -9310, -8784, -6017, +5849, 8812, 5507, 1051, -1790, -4961, 132, 483, -1080, -1223, -312, 2643, 4638, 6919, 5841, 6789, +5817, -5169, -13874, -1909, -10212, -9131, -4925, 6863, 8614, 4838, 810, -2111, -4964, 188, 391, -742, +-1191, -5, 2660, 5163, 6434, 5751, 6864, 5724, -6898, -12744, -1990, -10754, -9352, -3728, 7567, 8540, +4604, 653, -2511, -5154, 177, 390, -663, -832, 545, 2566, 5269, 5756, 5645, 6525, 4820, -8465, +-8259, -3796, -10810, -9903, -2374, 8097, 8290, 4279, 428, -2638, -5998, 139, 431, -164, -632, 1273, +2475, 5371, 5371, 5685, 6163, 3997, -9776, -6329, -4530, -10838, -9596, -959, 8486, 7942, 3917, 31, +-3203, -6055, 552, 498, 74, -628, 1700, 2519, 5103, 4695, 5285, 5397, 2133, -9539, -1180, -6823, +-11050, -10282, 495, 8848, 7578, 3625, -350, -3282, -6585, 364, 691, 771, -233, 2215, 2279, 4641, +4087, 5392, 5004, 1429, -8812, -12, -8091, -11421, -9376, 2007, 9000, 7025, 2938, -831, -3897, -6849, +897, 1037, 1192, 104, 2201, 1995, 4258, 4067, 5573, 5282, 878, -9126, 566, -9036, -11958, -8646, +3368, 9048, 6699, 2785, -1136, -4039, -6642, 1175, 1055, 1052, 160, 2188, 2331, 3913, 4048, 5422, +4603, -1430, -5984, 1238, -10045, -12755, -8116, 4348, 9267, 6691, 2530, -1252, -4615, -7003, 440, 1769, +1222, 982, 2130, 2494, 3243, 4164, 5375, 4632, -2265, -4310, 464, -11246, -13352, -6866, 5856, 9230, +6303, 1925, -1499, -5091, -6992, 759, 1835, 1314, 1576, 1976, 2269, 2779, 4340, 5380, 4291, -3462, +-2185, -505, -11279, -13631, -5580, 6574, 8773, 5525, 1347, -1506, -4727, -6558, 290, 2250, 1245, 1982, +1691, 2204, 2381, 4528, 5114, 3034, -4722, 2011, -2215, -11346, -14297, -4025, 6996, 8562, 5406, 1050, +-1731, -4861, -6150, -65, 2603, 1268, 2302, 1474, 2295, 1870, 4530, 4890, 2433, -4433, 3858, -3843, +-11734, -14575, -2749, 7535, 8393, 5275, 793, -2199, -5045, -5691, 265, 2452, 1709, 2794, 1054, 1767, +1619, 4542, 4672, 1277, -3996, 6294, -5843, -12101, -14423, -1278, 7593, 8241, 4911, 632, -2314, -5238, +-5380, 1, 2729, 2354, 3173, 693, 1116, 1104, 4442, 4374, 181, -1875, 7105, -7111, -12852, -14024, +-38, 7812, 8388, 4697, 200, -2942, -4815, -5227, 39, 2460, 2530, 2798, 594, 1111, 1635, 4670, +4585, 51, -1583, 6329, -8304, -13769, -12402, 1432, 7959, 7885, 4250, 54, -3256, -4889, -5019, 296, +2289, 3144, 2603, 457, 802, 1919, 4513, 4809, -395, -637, 5701, -9282, -14414, -11300, 2719, 7726, +7733, 3965, -54, -3382, -4488, -4720, -500, 2785, 3437, 2894, -188, 291, 1834, 4285, 4291, -2351, +3717, 4824, -9891, -15439, -9833, 3620, 7875, 7131, 3533, 25, -3502, -4067, -4920, -611, 2362, 3611, +2488, -4, 212, 2313, 4270, 4114, -2411, 5333, 3756, -10504, -15832, -8370, 4261, 7466, 6659, 3170, +-311, -3614, -3899, -4966, -235, 2478, 4058, 2410, -294, 22, 2317, 3683, 2414, -3176, 11068, 1442, +-11029, -16698, -6928, 4544, 7262, 6370, 2519, -269, -3725, -3212, -5139, -738, 2747, 4522, 2418, -109, +-440, 2596, 3644, 1922, -2878, 11461, 480, -11687, -16616, -5853, 4932, 7398, 5884, 2394, -556, -3682, +-3175, -5163, -289, 3434, 4617, 1995, -643, -672, 2347, 3602, 729, -1408, 13994, -1968, -12843, -16696, +-4185, 5243, 7207, 5469, 1932, -578, -3562, -2495, -5316, -1148, 3874, 4647, 2009, -806, -271, 2396, +3755, -826, 307, 14112, -3379, -13023, -16008, -3185, 5113, 7496, 5119, 1571, -833, -3214, -2412, -5316, +-1327, 4142, 4372, 1905, -772, -268, 2253, 3684, -1919, 2227, 14422, -4321, -14197, -15322, -2086, 5228, +7298, 4519, 1424, -948, -3091, -2254, -4944, -1657, 4638, 3959, 1746, -1231, -26, 1922, 3533, -3180, +4864, 13827, -5199, -14806, -14207, -1165, 5000, 7160, 3998, 1211, -1267, -2623, -2112, -4668, -2013, 4981, +3706, 1556, -1233, -61, 1798, 3109, -4374, 7010, 13505, -5977, -15280, -12768, -801, 4745, 6900, 3534, +1248, -1454, -2455, -2173, -4331, -1616, 5270, 3258, 1229, -1479, -4, 1576, 2376, -4939, 9665, 12111, +-6381, -15509, -11446, -212, 4390, 6449, 3263, 1372, -1779, -2301, -2081, -3938, -1930, 5487, 3005, 1115, +-1977, -195, 1421, 1227, -4577, 14255, 10113, -7722, -16874, -9969, 169, 4568, 6309, 2572, 1435, -1979, +-1776, -2274, -3604, -1724, 5496, 2056, 962, -1980, 118, 1525, 341, -4039, 16062, 8538, -8514, -16777, +-8750, 486, 4609, 6083, 2453, 1204, -2394, -1440, -2455, -3533, -1034, 5606, 1870, 485, -2266, -162, +1472, -903, -2557, 18200, 6696, -9552, -16913, -7356, 929, 4690, 5603, 2238, 1394, -2248, -1566, -2549, +-3401, -1168, 5337, 1664, 612, -1983, 26, 1498, -1323, -1770, 17825, 6557, -9557, -16382, -7608, 551, +4579, 5760, 2404, 1232, -2363, -1414, -2521, -3434, -987, 5496, 1716, 446, -2255, -140, 1468, -1274, +-2111, 18328, 6546, -9637, -16882, -7356, 927, 4678, 5548, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 16, 17, 10, -6, +-25, -38, -38, -32, -14, -2, 5, 17, 39, 41, 26, 6, -19, -46, -50, -34, +-4, 22, 70, 85, 39, -22, -74, -58, -37, -61, -71, -46, -12, 12, 20, 25, +28, 19, 5, 0, 11, 26, 29, 17, 3, -15, -32, -33, -33, 1, -4, 275, +800, 1387, 1719, 735, -295, -1568, -1617, -1029, -1517, -200, -39, 661, 710, 701, 169, -753, +-1220, -645, -679, -1263, -2024, -2396, -2240, -1642, 213, 3145, 6813, 8951, 7581, 2348, -3540, -5950, +-6124, -3494, -160, 897, 710, 358, 655, 1293, 613, -572, -2066, -1559, -1272, -518, 497, 363, +1028, -106, -928, -2380, -3652, -4446, -4036, -1388, 2056, 6075, 10176, 13990, 12320, 418, -7804, -11147, +-8961, -2903, 358, 1565, 719, 1584, 2763, 2322, 94, -2836, -3140, -3452, -1608, -241, 994, 1544, +933, -556, -2057, -3397, -3357, -3590, -3530, -992, 1115, 5821, 10701, 17488, 18520, -237, -12266, -13816, +-9033, -1755, -645, 165, 858, 3388, 3285, 1862, -508, -2670, -3966, -4472, -2715, 120, 2259, 3135, +915, -1229, -2848, -3274, -3627, -4918, -3253, -1309, 1372, 4542, 9277, 18339, 22727, 1528, -18345, -14012, +-8417, -1945, -3361, -26, 1676, 2462, 3526, 2632, 1560, -4499, -5498, -4770, -2141, 1510, 2012, 1593, +-184, -1937, -2477, -2538, -2877, -3366, -2421, -694, 1032, 4343, 7697, 15403, 23917, 8492, -20089, -13769, +-8275, -7442, -6964, -502, 3343, 3149, 4241, 3701, 2140, -3508, -5019, -4314, -2628, -321, 333, 1253, +240, -387, -1724, -2473, -1300, -2239, -1682, -2127, 463, 4383, 7130, 15428, 22490, 15657, -15646, -17064, +-10108, -9062, -7291, -2466, 3407, 2970, 5586, 4202, 1259, -2472, -5253, -4251, -3168, -680, 596, 602, +768, 561, -240, -1105, -805, -1450, -1586, -1021, -1363, 1067, 4556, 8122, 17409, 23018, 11456, -18291, +-16475, -10940, -8503, -5728, -619, 4068, 3606, 4067, 1155, -923, -3352, -3999, -2927, -1229, -628, 220, +693, 1201, 754, 845, 1363, 380, -1172, -2046, -2562, -1646, 636, 2580, 6533, 16348, 22424, 16387, +-16440, -19446, -11102, -8479, -5849, -2198, 3999, 2911, 2690, 615, -750, -3141, -3847, -2807, -746, 587, +912, 1749, 1873, 1536, 1758, 2208, 1401, -715, -2985, -4039, -3262, -1172, 541, 4506, 11499, 20408, +23104, -9078, -26969, -9876, -7895, -7989, -3176, 3615, 475, 1181, 2301, -741, -2515, -2989, -1168, 584, +1713, 1603, 1789, 1861, 1602, 2247, 2536, 2818, 410, -2480, -5219, -5285, -2020, -762, 2790, 6797, +15882, 25346, 5442, -29185, -11479, -6578, -10142, -5495, 1876, -1367, -995, 4272, 484, -1259, -801, 1149, +1290, 2335, 1902, 730, 1635, 1190, 1514, 2625, 3659, 1555, -1582, -4761, -5752, -2741, -1819, 864, +4813, 14145, 23981, 14332, -26977, -14763, -6364, -11468, -6756, 762, -161, -1829, 5094, 2660, -497, 693, +2323, 990, 1476, 2274, 1006, 933, 908, 1070, 2019, 3797, 2782, -2679, -3993, -4398, -1872, -2592, +-383, 4759, 11012, 23139, 18716, -24659, -17160, -6784, -13022, -8013, -387, 1211, -1342, 6119, 5112, 553, +1792, 1822, 321, 1085, 3150, 1579, -29, 781, 992, 1887, 3225, 2932, -2262, -3771, -5539, -3407, +-862, -78, 4400, 10589, 20503, 24033, -16255, -23829, -7413, -12818, -9492, -1307, 3118, -875, 6002, 7301, +1716, 548, 2009, 601, -325, 3541, 1287, -84, 1178, 847, 1892, 2168, 2686, -2265, -3194, -4785, +-3154, -13, -1859, 3150, 8545, 18529, 26127, -6313, -27968, -8078, -11598, -11052, -2130, 4719, 519, 4173, +8160, 1841, 368, 1646, 371, -904, 3416, 2441, -58, 985, 801, 1171, 1343, 2998, -1358, -3141, +-4523, -4724, -389, -1084, 2980, 5522, 16669, 25309, 7625, -28948, -11207, -8989, -11514, -4098, 3377, 1807, +840, 7771, 3256, 255, 1336, 1088, -1335, 2500, 3543, 99, 374, 1058, 941, 1103, 2645, 679, +-3476, -4355, -4827, -1615, -1984, 728, 5540, 13615, 22976, 19126, -22658, -17970, -5870, -12610, -6960, 629, +2183, -74, 7566, 5910, -162, 1387, 1409, -1611, 924, 3461, -334, -408, 1282, 1216, 1150, 2411, +1691, -3136, -4163, -5996, -1450, -1440, -117, 5067, 11086, 20857, 24137, -11216, -24524, -4576, -13970, -8858, +-2182, 2179, 1316, 5718, 7398, -41, 1053, 1754, -1151, -688, 3049, 227, -1463, 1220, 863, 1071, +1542, 2628, -2541, -4156, -4356, -2155, -558, -328, 4406, 8123, 17990, 25529, 1541, -28349, -6422, -13591, +-10787, -3875, 1401, 3338, 2620, 9021, 901, 580, 1755, -896, -1920, 1488, 1378, -1535, 598, 700, +1122, 1477, 2357, -1086, -3909, -3819, -1454, -140, -1692, 3066, 6491, 16995, 24110, 11473, -28190, -10658, +-11726, -13486, -4607, -395, 3973, 1326, 8674, 3316, 615, 2353, -670, -2564, 194, 1343, -1632, -85, +661, 1224, 1326, 2012, 169, -3599, -2274, -1996, 785, -2092, 3249, 4165, 14808, 23431, 16918, -23975, +-15157, -9884, -15101, -5002, -2256, 3946, 1478, 7127, 4850, 74, 2530, -297, -3069, -296, 1119, -1408, +-193, 904, 920, 1312, 2430, 1911, -3111, -2393, -2394, -107, -2299, 1126, 4824, 13492, 21575, 22244, +-16699, -21042, -7761, -17118, -6993, -3748, 2904, 2197, 4967, 6629, 699, 1914, 748, -2840, -1488, 436, +-1489, -41, 1614, 691, 1798, 2042, 2385, -2669, -2531, -3038, -723, -594, 553, 5086, 11006, 19635, +24778, -8198, -25772, -7028, -17849, -9079, -4802, 1052, 3526, 3438, 7282, 786, 1621, 1497, -2225, -2412, +627, -986, -264, 1756, 982, 1849, 1931, 2534, -2444, -2705, -2427, -1763, -397, 1339, 5000, 8990, +17991, 24952, 1248, -28504, -8013, -17401, -11212, -5260, -567, 4278, 2822, 6626, 1120, 1974, 1607, -1588, +-3458, 277, -762, -576, 2472, 1203, 2039, 2072, 2596, -778, -3957, -1652, -1418, -218, -1027, 5404, +7691, 16174, 25471, 4882, -28208, -8917, -17015, -12883, -5255, -1556, 4772, 2806, 6108, 1683, 1537, 1719, +-1288, -3609, -355, -764, -729, 3288, 2150, 1602, 1827, 1583, 736, -3690, -783, -1912, -813, 816, +2928, 7371, 16196, 24899, 6942, -28542, -9317, -17353, -13476, -5045, -2441, 4495, 3105, 5769, 1997, 1304, +1441, -1334, -3349, -172, -785, -267, 3816, 2679, 1364, 912, 2048, 1277, -3305, -1474, -444, 869, +-2821, 2891, 5847, 14523, 24050, 13638, -26346, -14096, -14040, -16263, -4976, -3424, 3645, 3520, 5158, 2629, +1043, 1658, -596, -3029, -446, -680, -906, 3762, 3060, 1447, 1674, 2379, 1938, -3316, -1413, -2428, +-199, -1717, 1409, 5473, 13110, 22532, 19237, -21583, -19217, -11070, -18762, -5706, -4065, 1933, 3866, 4934, +3445, 700, 2000, -356, -2689, -713, 387, -1108, 3209, 3908, 1758, 1552, 1837, 2290, -2448, -2416, +-1907, -761, -3013, 1289, 5612, 11415, 21631, 21487, -18128, -21705, -9720, -19343, -6203, -3843, 981, 3710, +4687, 3169, 766, 2055, 553, -2265, -790, 686, -1669, 2782, 4163, 2349, 2054, 1633, 2432, -2681, +-3026, -2331, -2349, -1025, 527, 4873, 10160, 21065, 22272, -18042, -21640, -8998, -19477, -6332, -3202, 180, +3032, 5388, 3206, 550, 1500, 257, -1443, -582, 1223, -1454, 2074, 4256, 2725, 1944, 1120, 2140, +-1967, -4672, -1276, -860, -1537, -222, 3938, 10615, 20173, 23464, -16423, -23522, -8215, -18634, -6567, -2701, +-544, 2556, 5194, 3351, 753, 1680, 355, -1342, -141, 1361, -2111, 1882, 4604, 2935, 1973, 1021, +1793, -2251, -4316, -2701, -1249, -399, -491, 4550, 11319, 20182, 23540, -16100, -24277, -8040, -17919, -7170, +-1975, -842, 2047, 5286, 3549, 770, 1138, 255, -510, 207, 1373, -1379, 1414, 4467, 2353, 2022, +1053, 1179, -2495, -4110, -2820, -1261, -534, -991, 4232, 11176, 19473, 24494, -13041, -26062, -7142, -17330, +-8754, -1643, -1087, 1425, 5393, 3665, 924, 668, -261, 41, 511, 1762, -1112, 905, 4517, 2302, +2220, 1028, 941, -3237, -4425, -3407, -1986, 719, 69, 4206, 11413, 19874, 24145, -14117, -25835, -7634, +-16424, -8347, -1634, -103, 639, 4927, 3839, 473, 829, -1155, 88, 1046, 1731, -230, 607, 4462, +2428, 1843, 864, 711, -3646, -4027, -2840, -3178, -70, 1960, 3718, 12030, 20002, 23714, -14991, -25543, +-7909, -16372, -7230, -1680, 416, 463, 4243, 3637, 176, 823, -1692, -167, 1847, 1455, -32, 991, +4712, 2107, 981, 1117, 1278, -4031, -4479, -3889, -1971, 250, 1699, 3929, 13100, 20760, 22678, -16040, +-25267, -9075, -15275, -6455, -1220, 1062, 127, 3191, 3530, 570, 835, -2288, -831, 2683, 1654, 70, +1287, 4366, 1455, 782, 1664, 968, -4342, -4320, -3192, -3149, 1561, 1205, 4230, 14695, 20868, 21732, +-18997, -23547, -10455, -14639, -5291, -1257, 1674, -142, 2858, 3672, 581, 895, -2498, -1855, 2806, 1917, +383, 1764, 3534, 1478, 359, 1889, 1379, -4364, -4561, -3913, -2879, 2531, 2258, 4530, 15025, 22368, +18155, -23859, -19661, -12069, -13222, -4038, -1291, 1909, 226, 2746, 2496, 1015, 477, -2592, -2178, 3594, +2802, 67, 2168, 2604, 1440, 5, 1944, 2084, -4804, -4312, -3630, -3395, 2640, 2952, 5800, 15416, +23511, 14190, -27171, -15689, -14230, -12027, -3348, -892, 2147, 251, 2442, 1488, 1469, 268, -2288, -2214, +3878, 3181, 102, 2760, 2047, 1142, 81, 2005, 2185, -5248, -4721, -3540, -2350, 3143, 2443, 7016, +15755, 24018, 12022, -28488, -13861, -14653, -11599, -3084, 181, 2129, -37, 1751, 28, 2417, -396, -1519, +-1378, 3821, 3606, -287, 3248, 1473, 578, -360, 2485, 2906, -4993, -4307, -4254, -3003, 3365, 2945, +6777, 15670, 24453, 9801, -29145, -11407, -15763, -11004, -2457, -505, 2455, -523, 2103, -884, 3200, 618, +-1718, -1138, 2742, 3562, -482, 3422, 1601, 371, 215, 2206, 2790, -4773, -4035, -4203, -2033, 1939, +3040, 8114, 16356, 25241, 5416, -29185, -9161, -16698, -10460, -1968, 20, 2461, -706, 2345, -1207, 3778, +300, -2183, -667, 2670, 3329, -153, 3835, 1452, -179, 393, 1895, 3408, -4173, -4235, -4907, -3202, +2955, 3753, 9371, 17446, 25056, 2464, -29185, -7990, -17054, -9914, -1932, -299, 2792, -402, 2467, -1386, +3862, 666, -2390, -127, 2354, 2165, -110, 4235, 1472, -977, 1023, 2145, 2516, -4041, -3835, -4425, +-2642, 3181, 3178, 9272, 16841, 25412, 1304, -29185, -7467, -17915, -9325, -2348, -178, 3403, -144, 2700, +-1339, 3680, 691, -2416, 414, 2287, 1192, 143, 3991, 1276, -1128, 1671, 2030, 1919, -3815, -3802, +-4696, -2085, 3234, 4277, 10273, 17721, 25564, -2947, -28512, -7400, -18114, -8514, -2183, 368, 3200, 96, +2703, -752, 3596, 363, -2653, 268, 2544, 829, 376, 4513, 1481, -1682, 1359, 2353, 1062, -2794, +-3357, -4843, -3219, 3858, 4301, 10381, 18019, 25278, -5449, -27611, -6569, -18557, -7538, -2020, 674, 3220, +526, 1956, -702, 3044, 148, -2614, 886, 2811, 14, -15, 4700, 1701, -1343, 1940, 2498, 166, +-2123, -3678, -6033, -2137, 4213, 4401, 10237, 18344, 25066, -7430, -26846, -6605, -18494, -6600, -2155, 818, +2882, 837, 1593, 203, 2586, -658, -2360, 1153, 3139, -360, -252, 4683, 1575, -1178, 2206, 2971, +-715, -2851, -3439, -5516, -883, 3784, 4434, 11472, 18463, 24725, -11424, -25225, -7072, -18667, -5080, -2231, +1404, 2362, 1419, 930, 607, 2634, -718, -2215, 840, 3525, -700, -268, 4643, 1537, -1080, 2090, +3145, -844, -2721, -3392, -5544, -891, 3748, 4452, 11530, 18649, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 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, 30, -46, -97, -158, +-141, -70, 72, 231, 332, 332, 220, 49, -120, -240, -282, -235, -118, 26, 150, 214, +203, 130, 41, -34, -98, -145, -145, -106, -34, 38, 104, 167, 207, 203, 159, 87, +22, -37, -102, -130, -162, -180, -154, -66, 37, 115, 143, 112, 57, -1, -40, -57, +-50, -21, 19, 56, 79, 55, 28, 19, 5, -5, -15, -6, 5, 16, 21, 22, +7, 1, -28, 224, 820, 1925, 2325, 846, -6, -1458, -1785, -1707, -1770, -923, -287, 43, +-212, -501, -979, -2251, -2719, -2826, -1671, 1745, 5757, 10070, 11585, 5029, -3232, -7441, -7364, -4683, +-2472, -234, 1163, 1625, 1265, 763, 365, -1030, -1864, -2848, -3692, -3303, -3206, -2151, 354, 4811, +10509, 14819, 12164, 368, -7805, -9091, -8511, -4813, -793, 1500, 1396, 113, 1552, 2702, 1196, -1708, +-4012, -4281, -3333, -2728, -1709, -2683, -801, 2186, 6511, 11693, 16448, 10985, -4249, -10845, -10934, -7032, +-2279, 350, 1079, 1908, 2893, 3093, 1479, -1650, -3016, -5503, -4304, -3605, -2152, -1875, -2641, 720, +2976, 6913, 14293, 23106, 6734, -12323, -13207, -10502, -3524, -2308, 721, 1931, 3405, 3013, 1051, -404, +-2913, -3933, -4632, -3863, -2791, -2485, -2130, -1005, 2194, 4547, 10539, 23400, 17555, -9614, -16199, -11731, +-6574, -4064, -2643, 2329, 2470, 2789, 2157, -910, -2559, -3997, -4713, -2968, -1232, -981, -1920, -1059, +-127, 2327, 5928, 17151, 25173, 5395, -17518, -14377, -11855, -7780, -5098, 1493, 4530, 2860, 3295, 233, +557, -3280, -4743, -2669, -2785, -1418, -1332, -2215, -1696, -220, 2373, 7786, 19404, 24773, -1791, -19728, +-14545, -12331, -8312, -3328, 3135, 2037, 5103, 4379, 774, -1917, -3742, -3289, -3155, -1611, -1415, -1708, +-2882, -1116, 798, 2311, 7594, 20912, 24324, -9312, -21633, -13224, -12975, -8308, -2472, 4728, 3651, 5816, +4323, 561, -1950, -3957, -3651, -2500, -913, -425, -995, -1664, -1790, -261, 1921, 5916, 19048, 26547, +-5745, -24565, -12861, -13316, -7680, -3362, 4962, 3013, 3713, 5083, 1584, -376, -2533, -2230, -935, 19, +665, -1878, -1392, -1023, -1891, -602, 2046, 11579, 25770, 14434, -27461, -16440, -12271, -11851, -7170, 48, +5580, 2436, 6898, 4787, 1986, 203, -887, 322, 47, -111, -2477, -2839, -1610, -1385, -163, 2469, +7848, 18908, 26957, -15824, -24617, -9852, -13123, -9345, -2946, 5838, 3229, 5695, 7747, 3696, 318, -507, +656, 647, -667, -1432, -2890, -2187, -1122, 813, 2270, 6290, 13403, 29212, -1656, -28821, -10684, -14150, +-11053, -5395, 5479, 4603, 4387, 9619, 6502, 969, -693, 1084, -170, -931, -699, -1932, -1937, -2338, +454, 2852, 5769, 10524, 27523, 7779, -29169, -9062, -14732, -14715, -7061, 4607, 6711, 3846, 10539, 7805, +1697, -1100, 1290, 468, -1291, -382, -1758, -1508, -496, 1067, 2327, 4545, 7859, 23661, 17945, -27862, +-12777, -10246, -14005, -8074, 3591, 7144, 2407, 10031, 8044, 1731, -1223, 954, 1275, -204, 765, -203, +-1051, -1060, 169, 660, 1311, 6560, 16418, 27798, -17238, -20837, -4291, -14610, -8583, -233, 6687, 1665, +7037, 10268, 2332, -1263, 780, 2906, 599, 1131, 1344, -1618, -1859, -2177, -838, 98, 3677, 11072, +26444, 9433, -29169, -5841, -9126, -12423, -2829, 1739, 4809, 2010, 9919, 6119, -782, 5, 2842, 4254, +969, 2541, -943, -3323, -4021, -4337, -423, 1037, 7536, 15480, 27800, -11992, -22541, 1177, -13876, -6009, +-4165, 2975, 2127, 4452, 10025, 1432, 511, 2157, 5647, 3654, 1550, 1075, -5033, -5361, -6025, -1984, +497, 5024, 10947, 23798, 14474, -28832, -4022, -7986, -12699, -3973, -1873, 5216, 1268, 9810, 6413, 545, +1351, 3381, 5905, 118, 1606, -3237, -7229, -4057, -3534, 343, 2147, 8686, 16274, 26818, -17102, -16871, +-2256, -17485, -4535, -3933, 4756, 2371, 6259, 9784, 2153, 1152, 1797, 6134, 1572, 450, -1186, -6573, +-4256, -5826, 1073, 1538, 5749, 12736, 27372, 102, -26938, -102, -16841, -8349, -3850, 1295, 4223, 3808, +10805, 4218, 1498, 445, 4634, 2906, -698, 593, -5386, -4328, -4004, -1101, 1862, 3475, 10344, 23263, +16106, -28015, -6182, -11394, -12076, -2591, -1941, 4736, 2381, 9912, 5381, 799, 981, 2930, 4777, -400, +401, -3560, -5378, -2611, -3012, 1051, 2021, 7286, 16093, 27595, -13004, -20684, -3444, -15692, -3466, -4736, +2983, 2743, 6377, 8441, 438, 1143, 1856, 5372, 1098, 59, -1020, -6134, -2009, -4128, -976, 677, +4513, 11263, 24508, 13316, -28855, -5448, -10863, -9594, -3036, -3347, 4704, 2275, 9449, 2712, 1235, 2922, +3003, 5015, -1208, 67, -4917, -5015, -3724, -3861, -13, 2803, 10130, 16559, 27359, -16787, -18020, -2248, +-16557, -1959, -6302, 2057, 1823, 6433, 8687, 941, 2420, 1929, 5699, 74, -1599, -1938, -7158, -3526, +-5184, -1447, 3567, 7894, 13165, 27800, 930, -27945, -1362, -15966, -7492, -4515, -1764, 4029, 4741, 10890, +3415, -33, 1502, 4979, 2006, -2977, -1417, -6401, -4402, -3093, -2684, 2931, 6823, 11205, 24760, 13096, +-28891, -5676, -13326, -12253, -3279, -3660, 4301, 4334, 12018, 5741, -913, 171, 2858, 3359, -3193, -1555, +-3951, -4948, -2310, -4346, 1371, 6748, 11321, 20645, 22618, -23748, -14005, -8959, -15623, -3285, -4865, 3497, +4505, 10923, 7677, -499, -789, 829, 3726, -1346, -1502, -2431, -6591, -2088, -3826, -209, 5149, 9747, +16166, 28015, -10043, -24019, -6215, -18005, -5219, -5366, 1042, 5162, 8206, 10225, 1488, -1216, 1074, 2833, +-349, -2856, -1592, -6278, -3615, -2675, -1930, 4485, 9017, 14434, 27174, 3571, -28900, -6592, -16845, -8761, +-4020, -1258, 5225, 6606, 10398, 3940, -1553, -200, 3158, 748, -3228, -1894, -4493, -4637, -2632, -3431, +2317, 7584, 13898, 23663, 16542, -28105, -10654, -14207, -14859, -3115, -3667, 4923, 5890, 10717, 5922, -89, +-981, 2660, 2166, -2939, -2690, -3168, -5859, -2183, -4664, 374, 6861, 12634, 20122, 24521, -19989, -18643, +-9307, -18697, -4398, -3656, 2613, 4914, 10213, 7869, 390, -359, 2519, 2394, -2005, -4523, -2948, -5431, +-3679, -2849, -389, 3975, 11909, 18704, 27142, -14453, -22324, -8006, -19371, -7721, -3633, 2169, 3963, 9904, +9741, 1797, -778, 1648, 1306, -482, -3567, -3414, -4286, -4104, -1461, -2811, 2418, 11179, 17026, 28640, +-4856, -26550, -8476, -19499, -10168, -5007, 2423, 3251, 8534, 11444, 3480, 249, 1144, 710, -796, -2610, +-3186, -3348, -4752, -1895, -1436, -301, 8272, 15029, 27385, 6942, -29169, -9180, -17888, -11734, -6814, 1370, +4201, 6373, 11575, 4620, 1282, -241, 1165, -865, -1133, -2839, -3457, -4307, -3576, -1005, -214, 4827, +13637, 26187, 13176, -29134, -10124, -15798, -12983, -7106, -181, 4728, 4016, 11231, 5079, 3109, 151, 7, +324, -1447, -1774, -3284, -3096, -6428, -17, -490, 2267, 12405, 23764, 19261, -27603, -11988, -14735, -13892, +-6708, -1981, 5514, 2248, 11134, 4793, 2440, 2329, -873, 1744, -688, -1037, -4466, -2442, -6087, -1617, +875, 186, 11332, 22860, 20701, -26494, -12537, -13230, -14854, -4829, -3091, 5816, 1684, 9089, 5691, 2033, +3351, 316, 553, -142, -469, -3913, -2597, -3687, -3800, 1214, 190, 7242, 21471, 23278, -24261, -13789, +-10767, -14952, -5013, -3002, 4148, 2610, 6997, 5156, 2403, 2466, 2373, 405, 847, 373, -2728, -4154, +-3059, -4447, -1116, 613, 5916, 18930, 26706, -20264, -16877, -9601, -14806, -6440, -2977, 2984, 1990, 6403, +4525, 3353, 2781, 3912, 480, 86, -87, -2253, -2843, -2825, -4515, -1655, 1206, 5514, 18642, 26727, +-20700, -16218, -10616, -13039, -6712, -3277, 2966, 955, 6862, 3333, 4700, 2054, 4392, 1968, -1764, 1584, +-2110, -3147, -2399, -2672, -2087, 1506, 5388, 17747, 27458, -21084, -16007, -10289, -11616, -6725, -4067, 4735, +-97, 7665, 1101, 4572, 2395, 3001, 5132, -3302, 2352, -866, -3681, -1783, -2330, -1840, 1016, 5250, +17593, 27090, -22278, -14667, -9164, -11325, -5379, -4181, 5877, -1427, 7890, 388, 3019, 2733, 1493, 6248, +-2202, 993, 1207, -2138, -3752, -2455, -903, 535, 6550, 19358, 24344, -25195, -12654, -11666, -9511, -2818, +-4531, 8065, -1721, 7658, -963, 1159, 2623, 1275, 5769, -1523, -351, 2304, 98, -3681, -2276, 1184, +-1147, 6181, 20791, 22336, -25715, -13717, -11535, -8835, -1900, -2757, 7865, -496, 6204, -725, -904, 1491, +1850, 5318, -307, -538, 2486, -97, -1950, -3511, 1733, -805, 4835, 23500, 18541, -26882, -12646, -11866, +-7551, -2819, 352, 6766, 1792, 5146, -1482, -1579, -475, 2426, 4240, 795, -983, 1731, 1192, -1605, +-2656, 1792, 801, 3925, 24875, 15577, -28352, -12588, -12339, -4688, -4245, 2506, 6593, 2597, 5084, -1516, +-1621, -2058, 2237, 2636, 1317, -141, 86, 2139, -388, -2856, 1703, 3033, 3605, 26703, 11215, -29169, +-12373, -13670, -2263, -4070, 4167, 5639, 4050, 4919, -2527, -775, -4135, 2261, 2829, 142, 923, -793, +1348, 130, -1618, 1880, 4013, 5964, 28171, 5324, -29169, -12534, -15081, -1460, -3426, 5682, 5532, 5449, +4956, -2904, -915, -5304, 2028, 2416, 341, 1114, -564, 1142, 455, -498, 56, 5387, 8179, 28577, +1654, -29169, -13742, -15377, -1000, -2335, 6080, 6023, 6702, 4074, -2391, -1273, -5769, 906, 2361, -682, +1147, -634, 445, 2599, 505, -178, 5276, 11441, 29212, -6186, -28680, -15370, -14592, -1004, -1639, 7992, +5524, 9612, 2880, -1669, -1784, -7158, -480, 1455, -184, 416, -1024, 1601, 3477, 1171, -169, 4477, +13347, 28759, -9376, -27925, -16138, -14598, -1543, -220, 8619, 5259, 11076, 1669, -2006, -1540, -6816, -1548, +730, -671, 382, -542, 1277, 3747, 1844, -517, 4006, 13122, 28809, -9044, -28083, -16315, -15002, -1277, +-145, 8271, 5510, 11700, 1628, -2899, -1930, -6423, -2030, -373, -1060, 844, -750, 2204, 3695, 2665, +1179, 2935, 15704, 27599, -14765, -25970, -17467, -13056, -1620, 651, 9182, 5807, 12742, 968, -2377, -2595, +-6294, -2377, -1858, -985, 791, 163, 1053, 4740, 2690, 1431, 3709, 17965, 25964, -19795, -23726, -18987, +-12926, -1009, 1636, 8997, 5767, 13203, 1385, -1867, -2601, -6464, -2613, -2944, -924, 462, 858, 63, +6093, 3512, 1917, 4613, 20603, 22545, -25009, -20990, -20836, -11061, -295, 3748, 8132, 5744, 13127, 591, +-991, -3438, -5668, -2715, -3401, -1086, 1033, 1346, -1514, 6482, 3151, 1183, 4980, 20452, 22084, -26068, +-20536, -20234, -10797, -640, 4709, 7332, 5373, 12616, 497, -215, -3900, -5323, -2558, -3248, -2453, 1144, +1507, -2050, 5876, 3809, 1845, 6431, 21296, 20252, -27367, -19897, -20259, -10907, -1150, 5616, 6791, 5751, +12574, 312, 1012, -4785, -4826, -2045, -2672, -3164, 736, 2469, -2251, 4094, 4480, 924, 6409, 20933, +20361, -26908, -20406, -18196, -11372, -2145, 6041, 5299, 5638, 12189, 629, 2349, -4329, -4448, -1982, -2545, +-3683, -218, 3230, -2351, 2287, 4754, 1848, 7118, 21771, 19523, -26764, -20517, -17466, -10811, -2948, 6533, +4893, 4998, 12252, 1343, 2251, -3210, -4826, -2269, -2838, -2678, -755, 2081, -1705, 2192, 3943, 2900, +7845, 23586, 16739, -28169, -19195, -15966, -10102, -3861, 7194, 5047, 4752, 11812, 1424, 1526, -2541, -5037, +-2622, -3190, -2330, -1042, 2391, -597, 2826, 3210, 3792, 8952, 25140, 12764, -29169, -17813, -17377, -8093, +-3995, 7593, 5911, 4417, 11511, 1540, 1500, -2480, -4877, -2842, -3307, -2170, -1043, 2373, -610, 2826, +3210, 3792, 8952, 25140, 12764, -29169, -17813, -17377, -8219, -3980, 7518, 5695, 4521, 11624, 1489, 1513, +-2514, -4975, -2696, -3223, -2295, -1043, 2388, -598, 2826, 3209, 3780, 9013, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7, -13, -3, +-2, -4, -5, -4, -7, -11, -19, -17, -22, -15, -10, -14, -19, -12, -11, -4, +-4, -8, -8, -11, -14, -13, -16, -16, -16, -10, -2, 4, 15, -11, -58, -80, +-68, -19, 55, 69, 11, -34, -52, -49, -52, -35, -1, 84, 193, 95, -108, -234, +-225, -80, 34, 79, 63, 2, -22, -7, -22, -34, -1, 0, -12, 5, 28, 15, +-24, -47, -60, -90, -46, -25, 12, 17, 1496, 4820, 1896, -721, -2035, -1360, -2041, -2735, +-1151, -1937, -340, -2318, -5704, -4452, -156, 5099, 8390, 10832, 8558, 1848, -520, -2462, -7211, -6219, +-4522, -1454, -283, 352, 899, -477, -1647, -4016, -5782, -7138, -3433, 3275, 9537, 15770, 21604, 11599, +-5505, -8097, -14814, -9627, -3435, -2940, 374, -967, 1010, 619, -342, -3628, -7838, -7014, -4393, 2835, +9156, 17283, 21946, 16762, -2358, -9828, -17400, -12432, -3195, -4352, -2445, -2155, 1093, 1069, 132, -2406, +-7197, -6529, -4114, 992, 7114, 13799, 20797, 21272, 6592, -13173, -17747, -13361, -4370, -7044, -6717, -1432, +63, 3590, 1088, -2711, -5123, -7905, -4268, 1250, 6631, 13119, 20052, 22359, 8953, -18794, -20112, -11753, +-4196, -7994, -7647, -988, 1250, 2891, 1039, -3386, -7019, -6857, -3559, 3284, 8812, 17570, 22171, 17893, +-19888, -22950, -14495, -740, -1807, -8640, -1071, -3352, 1147, 337, -2834, -5175, -7146, -2928, 693, 8199, +17208, 22889, 17209, -25292, -19895, -17091, 554, 1892, -6062, 529, -4278, 985, 318, -1513, -4496, -6295, +-4808, -618, 6886, 13652, 22776, 20271, -24312, -19470, -17842, -813, 1563, -6374, 2013, -3955, 3370, 2054, +2666, -2622, -7145, -4837, -4614, 4613, 9464, 17377, 28588, -7258, -26345, -16016, -7022, 4937, -12110, 316, +-373, 2752, 5938, 5524, 3616, -8473, -4495, -7043, -2299, 5523, 14273, 23125, 23553, -18160, -22734, -13368, +4852, -6938, -12295, 3759, 3369, 6318, 4151, 8495, 3032, -7392, -8548, -6773, 142, 5807, 18367, 21796, +24371, -16374, -23935, -9958, 2978, -9016, -9748, 7923, 5523, 1395, 2965, 10773, 3621, -8585, -10308, -3851, +-1633, 8601, 17395, 19520, 26190, -19239, -22647, -9522, 5365, -4550, -5277, 8669, 67, -1771, 3573, 11617, +-263, -10874, -8361, -6119, 1406, 11221, 16905, 22820, 21090, -23846, -20117, -7682, 7569, -2906, -842, 5883, +-3781, -276, 4914, 10418, -4607, -12643, -8949, -5845, 2835, 13385, 18730, 26707, 7034, -28272, -15086, -415, +4309, -4801, 7170, 1064, -3597, 1476, 5297, 4632, -10270, -10870, -9673, -2462, 5055, 18310, 23781, 22667, +-18334, -22700, -8874, 6331, -4029, 1983, 9244, -3968, -556, 1366, 6108, -2518, -9348, -7386, -10818, 542, +7724, 20500, 27045, 8395, -26983, -15400, -2765, 1648, -3823, 8137, 4243, -4628, 1288, 4675, 4892, -4552, +-10924, -10260, -6782, 3416, 14286, 21341, 27556, -8727, -26080, -8972, -189, -2838, -2265, 9497, -410, -2653, +3291, 6378, 1110, -8514, -8738, -7300, -2720, 5900, 18494, 22675, 24171, -18593, -22342, -5388, -1910, -5271, +570, 7957, -3280, -1128, 5045, 8470, -1126, -7802, -8334, -7073, -1262, 9014, 20098, 22845, 21545, -23633, +-18686, -3912, -3540, -5991, 1265, 5970, -4677, 490, 7346, 4764, -3195, -4255, -8382, -3030, 93, 13611, +20206, 24928, 13754, -29084, -13504, -3342, -3347, -4900, 5329, 3353, -6294, 1687, 8961, 1996, -1731, -5143, +-9066, -2843, 1107, 18060, 18961, 27641, 1744, -29192, -9100, -2619, -3615, -2115, 7419, -928, -6075, 3378, +8729, 4562, -2574, -9988, -9591, -976, 5262, 19957, 21624, 25949, -13870, -25315, -5899, -1430, -4660, 2461, +8208, -4508, -3080, 5788, 8371, -129, -5162, -11523, -7405, 310, 8681, 22611, 23816, 16487, -26507, -17152, +-2956, -1593, -3456, 8610, 4897, -6651, 1673, 7092, 4159, -4030, -7536, -9745, -5998, 2230, 14623, 22745, +26482, -5430, -27553, -9469, -2194, -4334, 2728, 11596, -2348, -3841, 4946, 6356, -610, -6069, -8334, -8907, +-2510, 7939, 18443, 24356, 19718, -24014, -18991, -6704, -3319, -2720, 9110, 7010, -6725, 1997, 6362, 1149, +-4181, -6424, -8256, -5603, 2643, 13231, 19459, 28253, -2012, -28262, -10572, -8114, -3544, 2720, 10377, -1755, +-4300, 7744, 5347, -2316, -3683, -8239, -7488, -1786, 3872, 17871, 22941, 23647, -19172, -22186, -7696, -6223, +-1921, 5495, 6451, -7405, 1697, 9476, 2384, -3679, -4981, -7909, -5506, 340, 9101, 20280, 26226, 9460, +-28787, -13358, -6283, -4102, -477, 8766, -13, -6426, 6524, 7114, -250, -6051, -5790, -8051, 267, 1887, +13599, 22967, 25365, -8756, -27395, -7383, -5341, -3138, 2822, 8141, -4990, -2451, 8025, 3532, -2444, -4921, +-7728, -5150, 330, 5035, 18389, 24030, 19101, -24704, -18447, -5579, -3359, -2606, 5895, 4908, -6734, 3164, +7504, -1245, -6330, -5015, -7588, -2940, 1776, 13241, 21928, 26355, -2848, -29087, -8712, -3824, -5704, 1950, +8996, -2479, -2064, 5618, 5497, -6041, -7062, -7885, -4723, 1019, 5310, 18982, 24167, 17994, -25239, -18549, +-5412, -7276, -3413, 8755, 4173, -5350, 4369, 7684, -1327, -9550, -5608, -6079, -2375, 2148, 12883, 21585, +26333, -9251, -26465, -8813, -8709, -7613, 3579, 10780, -4429, -1546, 10335, 3353, -7126, -6858, -4221, -4915, +-627, 5447, 18139, 26321, 11376, -28133, -13999, -9107, -8682, -3103, 8821, 4606, -8219, 6742, 9246, -1766, +-6648, -7603, -4020, -1214, 2139, 12582, 21078, 25824, -17789, -22328, -9612, -9997, -3471, 1167, 9842, -6849, +-167, 9153, 3614, -3388, -8623, -4393, -486, -383, 8200, 16932, 27949, 1618, -29192, -10048, -13926, -4383, +979, 6578, 772, -7198, 9540, 4614, -288, -7150, -6061, -682, -1307, 4667, 14911, 24274, 19204, -26046, +-16598, -12148, -11882, 2437, 4212, 5343, -6983, 4056, 8857, 471, -3521, -9414, -2329, 1430, 1254, 9061, +20170, 27590, -11162, -25201, -9573, -16210, -3160, 5042, 5980, -2311, -2211, 10635, 4847, -2504, -7920, -6197, +-988, 1383, 5033, 14952, 28025, 8105, -28875, -11548, -14567, -12056, 3357, 7826, 2131, -5129, 7645, 7143, +1743, -5544, -10272, -2508, 800, 4087, 11477, 23144, 22505, -23207, -18144, -10591, -15433, -4511, 9263, 7213, +-5700, 3350, 7648, 2045, 286, -10116, -3388, 1315, 1470, 7460, 16874, 29189, -9683, -25348, -8329, -13124, +-10471, 3594, 13150, -3964, -1569, 7979, 2843, 326, -6102, -6127, 1416, 2230, 5258, 10904, 29189, 4110, +-28999, -9151, -12710, -11127, -3168, 12747, 5184, -7161, 8201, 4873, -3099, -6092, -3131, -1546, 4175, 5809, +7995, 25632, 15749, -27903, -12885, -11199, -13259, -6050, 5620, 12518, -3601, 2463, 9353, -2554, -6097, -6550, +-752, 3378, 7165, 7775, 20219, 24260, -23495, -17825, -9584, -14078, -9195, 2533, 10035, 5806, 1159, 7358, +1997, -5283, -10011, -2605, 2580, 5167, 9681, 15319, 29189, -13883, -23708, -8851, -14141, -10269, -1797, 8558, +5207, 7920, 5578, 6001, -3855, -11489, -8265, 862, 5327, 10708, 14402, 28800, -1986, -28082, -9071, -14250, +-9779, -4798, 6237, 3880, 7343, 11683, 3241, 1125, -10940, -10833, -4791, 3531, 10008, 13839, 26686, 10085, +-29192, -11841, -13170, -11376, -4690, 3726, 3469, 2129, 16155, 4810, -245, -7455, -11591, -6340, 633, 10508, +13637, 24750, 17851, -26662, -16392, -10873, -11921, -7114, 4783, 4195, -2833, 14614, 10897, -848, -4918, -12667, +-8710, -1856, 10258, 13454, 21496, 23953, -22170, -19893, -11121, -11463, -7551, 4240, 6630, -4646, 6323, 17291, +2238, -5013, -10507, -12276, -4206, 6386, 14961, 18890, 27223, -15475, -23719, -11805, -12872, -7859, 3683, 8019, +-3331, 945, 14934, 10136, -5902, -7137, -12991, -7362, 3012, 13753, 18949, 27212, -8425, -27072, -11689, -14316, +-9512, 2332, 11367, -3332, 542, 9712, 14111, 871, -10947, -7026, -12212, -1108, 9558, 17998, 28757, -3177, +-27254, -13818, -16374, -10811, -911, 13616, -396, -802, 8746, 12177, 8712, -10225, -10464, -9739, -4456, 7987, +14781, 29189, 395, -28262, -12974, -18361, -11536, -4311, 15303, 2032, -1155, 7597, 9073, 11743, -4364, -10552, +-8239, -6803, 4902, 11999, 28407, 7667, -29192, -11862, -18844, -11849, -7848, 13475, 5846, -2820, 8225, 6072, +10888, 4092, -9729, -8571, -7260, 3646, 9984, 26497, 13370, -29062, -12587, -15282, -13826, -8822, 8499, 9728, +-3617, 8390, 6978, 5320, 6652, -4056, -9103, -5299, 1540, 10262, 23772, 18075, -27662, -15327, -12850, -13598, +-10096, 5412, 10705, -2351, 7780, 9345, 3717, 2283, 383, -7671, -6617, 1717, 9088, 23308, 20996, -24315, +-17836, -12142, -13032, -10704, 2361, 10940, -1482, 6930, 9883, 4738, 385, 60, -2513, -7904, 686, 7578, +22221, 23614, -23002, -18924, -12450, -11616, -11471, 602, 10677, -1781, 5917, 9989, 8055, -1041, -1926, 1598, +-7532, 305, 6267, 19535, 26148, -22643, -18796, -13957, -11387, -10043, -1126, 11793, -2133, 4281, 10620, 7602, +-642, -3486, 2884, -3757, 65, 6337, 16922, 28197, -20556, -20455, -14278, -14172, -8115, -2290, 12589, -1405, +2524, 10742, 6648, 3561, -7022, 1181, -1385, 361, 9234, 15431, 28803, -19976, -20860, -14867, -16281, -6278, +-2792, 14045, -1134, 533, 10754, 7394, 1785, -6830, -1042, 1995, 534, 9066, 16120, 28096, -18102, -22411, +-13542, -19666, -7683, -1826, 12201, 2752, -1268, 11005, 7829, 2508, -5277, -3882, 1436, 2138, 8122, 16961, +28164, -13251, -24532, -12531, -18731, -11620, -1504, 11453, 4349, 88, 7203, 10557, 2268, -6164, -4450, -159, +4096, 8551, 16082, 29189, -11763, -25242, -13231, -17546, -13000, -3817, 11873, 4403, 1560, 7503, 7998, 4424, +-6285, -6384, -708, 4126, 9610, 15334, 29189, -9912, -25910, -14300, -18217, -12584, -7548, 12659, 5652, 1423, +8027, 9697, 3399, -6681, -5455, -4214, 4773, 11571, 13757, 29189, -6594, -26639, -13964, -19665, -12048, -10026, +10687, 6997, 2091, 8682, 9211, 4625, -6706, -6213, -3915, 2351, 12632, 15227, 29189, -4888, -27817, -13618, +-20266, -13252, -9767, 8458, 7447, 3333, 7814, 9977, 6271, -6560, -6775, -5085, 917, 13260, 14936, 29189, +-5919, -27494, -13395, -19747, -12427, -12130, 8428, 4682, 5403, 8128, 10512, 4801, -5165, -6330, -4181, -70, +12210, 14032, 29189, -3777, -28061, -12760, -20783, -10901, -13721, 6706, 4070, 4000, 10320, 11553, 7940, -4687, +-8920, -4522, 162, 11965, 14605, 28861, -2074, -28998, -12080, -21205, -9759, -12444, 3508, 4281, 2343, 10261, +13921, 8188, -3503, -6400, -6221, -723, 10940, 14356, 28437, 3187, -29017, -12621, -20744, -10607, -10304, 831, +4388, 1959, 8448, 14432, 9809, -3191, -7109, -6248, -928, 11074, 14434, 28513, 1991, -29013, -12449, -20912, +-10260, -11277, 2170, 4329, 2183, 9581, 14091, 8660, -3425, -6548, -6227, -756, 10945, 14357, 28437, 3230, +-29061, -12623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 46, 44, 44, 41, 41, 41, 41, 40, 41, 41, 40, 41, 42, +41, 41, 41, 40, 38, 40, 38, 40, 40, 39, 37, 32, 38, 31, 32, 32, +31, 37, 34, 46, 47, 44, 47, 46, 43, 39, 29, 16, 4, 15, 38, 59, +69, 65, 49, 40, 46, 33, 25, 28, 35, 37, 35, 42, 42, 46, 49, 49, +32, 38, 41, 15, 0, 6, 21, 37, 57, 415, 1126, 1104, 741, 165, -579, -1644, +-1853, -2700, -2517, -1206, 442, 3115, 5456, 6967, 4128, -1672, -4508, -4340, -3623, -3023, -3331, -2888, +-1184, 1378, 3768, 7610, 14298, 4120, -3906, -6901, -5769, -3988, -5049, -3619, -3159, -529, 722, 3910, +5009, 17841, 9090, -5666, -5170, -8348, -4778, -6111, -3352, -2565, -1529, 747, 2138, 3874, 10624, 20796, +-3357, -5798, -7587, -7279, -4483, -6030, -951, -3019, 600, 938, 3830, 4395, 19985, 8569, -8058, -4988, +-8702, -4120, -5983, -2583, -1936, -2049, 728, 1623, 3887, 9188, 21775, -2052, -6487, -6668, -7083, -4038, +-6228, -1571, -3227, 282, 666, 3876, 3086, 17543, 15694, -8245, -4840, -8914, -5459, -5658, -4642, -1379, +-2646, 1460, 1020, 4205, 5260, 26664, 4627, -9518, -6062, -11065, -4747, -8010, -2284, -2182, -432, 2070, +3333, 3655, 13467, 25309, -6127, -6945, -10354, -10192, -5963, -7675, -6, -2116, 2565, 1803, 4859, 3123, +22144, 17411, -11710, -6587, -13902, -7600, -7078, -4476, 871, -1260, 3424, 1578, 4971, 4087, 27753, 7451, +-13037, -8010, -14262, -5103, -7558, -1370, -558, -289, 3099, 1754, 4824, 5775, 29239, -477, -13384, -8788, +-13386, -3380, -7087, 28, -1669, 180, 2250, 1464, 4273, 6275, 29239, -3912, -13434, -8976, -12346, -2107, +-6665, 372, -2350, 129, 2019, 992, 4365, 4929, 29239, -2380, -14356, -8481, -11446, -855, -6181, 351, +-2054, -589, 1898, -481, 5276, 759, 27779, 7375, -16523, -7309, -11086, 285, -5415, -1473, -829, -2363, +1957, -1587, 5214, -481, 21700, 17125, -16232, -7213, -10557, 295, -3958, -3844, 390, -3719, 1765, -1840, +3854, 365, 13693, 26026, -12528, -8145, -9669, -1114, -2247, -6503, 1505, -4330, 820, -2165, 3050, 2054, +8481, 28931, -8394, -8832, -8527, -2469, -1691, -7266, 1491, -5092, 55, -1378, 2222, 3119, 6593, 28824, +-6012, -9121, -7739, -3329, -2009, -7275, 762, -4898, -331, -744, 1958, 3600, 6356, 29239, -5904, -9832, +-7444, -4108, -2139, -7023, 543, -5323, -127, -416, 2906, 3539, 7185, 29052, -7425, -9967, -7774, -4367, +-2265, -6405, 407, -5097, 370, -182, 2655, 3084, 7889, 28890, -8601, -10021, -7946, -4626, -1827, -6336, +321, -4921, 869, -88, 2322, 3183, 6212, 29239, -7074, -11172, -8221, -5459, -490, -7173, 368, -4681, +325, 1057, 1410, 4310, 2599, 29239, -1820, -12973, -7399, -7361, 154, -8118, -334, -3072, 143, 2377, +-239, 4909, -517, 27721, 7136, -14714, -6694, -8949, 359, -8037, -1894, -1538, -882, 2886, -706, 4996, +-1248, 20559, 18031, -14478, -7117, -9364, -1378, -7044, -4138, 713, -1618, 3264, -952, 3736, 6, 12433, +26501, -11207, -8347, -9219, -4285, -5007, -5936, 2162, -2350, 2629, -393, 2369, 2028, 6704, 29239, -6128, +-10494, -8406, -6466, -3751, -7024, 2104, -1900, 2115, 670, 1224, 3121, 3066, 29239, -1740, -12717, -7042, +-8034, -3090, -7209, 1926, -1555, 736, 1534, 830, 4431, 1165, 29239, 264, -13646, -6525, -8844, -2409, +-7184, 1423, -1128, 655, 2260, 221, 4312, 793, 28841, 921, -14137, -6677, -9112, -1765, -6622, 1366, +-876, -139, 2095, 309, 4487, 1190, 29239, 236, -14397, -7037, -9130, -1241, -6388, 1363, -1284, -338, +2359, 277, 4709, 1218, 28578, 1029, -15059, -7164, -9222, -505, -5947, 735, -1148, -692, 2202, 417, +5227, 484, 28383, 3242, -15658, -7170, -9271, 351, -6069, 157, -1213, -1394, 2659, -66, 5627, -1364, +25383, 10074, -16611, -6560, -9545, 484, -5704, -1590, -613, -2430, 3203, -743, 5177, -2027, 21228, 17152, +-16256, -6069, -9703, -358, -5312, -3286, 498, -3149, 3323, -910, 3915, -1562, 13877, 25495, -12691, -7235, +-9207, -2113, -3845, -5767, 1087, -3346, 2588, -998, 1987, 471, 8136, 29239, -6903, -9324, -7920, -4389, +-3297, -7558, 1181, -3145, 1205, 234, 253, 2855, 4220, 29239, -1511, -11126, -6718, -6504, -2802, -8355, +791, -2808, 181, 973, -291, 4331, 1703, 29239, 2573, -12815, -6328, -8296, -2696, -8162, 505, -2168, +-461, 1616, -272, 5046, 546, 29239, 5599, -14236, -6456, -9185, -2197, -7567, -16, -1504, -591, 2389, +-292, 4835, 416, 28368, 6275, -15072, -6843, -9309, -1269, -6777, 30, -1065, -967, 2746, -567, 4906, +-346, 26613, 9287, -16218, -6596, -9579, -943, -5999, -528, -291, -1599, 2789, -859, 5462, -886, 24995, +11240, -16794, -6497, -9840, -37, -5585, -1030, -14, -2110, 3395, -1348, 5735, -1621, 22757, 14863, -17412, +-6693, -10050, 296, -4783, -1862, 590, -2242, 3706, -2067, 5375, -1994, 18447, 20481, -16933, -7112, -9912, +200, -4302, -3250, 1536, -3234, 4070, -2101, 4230, -1590, 13048, 25917, -14696, -7762, -9113, -1064, -3225, +-4911, 2027, -3608, 3736, -1623, 2641, -242, 8210, 29239, -11241, -9091, -8223, -2123, -1920, -6594, 2233, +-3498, 2562, -1047, 588, 1865, 3196, 29239, -4634, -11098, -6382, -4505, -952, -8083, 1381, -3033, 498, +121, -629, 3667, 821, 29239, 1671, -13008, -5531, -6005, -715, -8705, 215, -2579, -877, 873, -1266, +4924, 276, 29239, 5687, -13975, -5515, -7588, -640, -8691, -938, -2294, -1302, 2141, -1401, 5424, 221, +28032, 8135, -15205, -5299, -8200, -715, -8205, -1716, -1669, -2125, 2356, -1309, 5602, 496, 26847, 9768, +-15352, -5791, -8642, -593, -7792, -2593, -2113, -1902, 2860, -1199, 6121, 436, 26173, 11170, -15725, -5998, +-9398, -588, -7787, -3073, -1599, -2315, 3475, -952, 6610, 353, 24732, 13533, -16394, -6504, -9591, -715, +-7535, -3490, -1256, -2061, 4166, -1278, 6653, -355, 22506, 16542, -16479, -6675, -10024, -554, -7196, -4193, +-432, -2547, 4611, -1334, 6339, -154, 19337, 20296, -16333, -7200, -10448, -1085, -6221, -5036, 855, -3038, +4475, -728, 5230, 248, 15370, 24493, -14997, -7775, -10042, -2284, -4710, -6275, 1603, -3407, 4077, -268, +4021, 1065, 12800, 26272, -13440, -8132, -9535, -3035, -3766, -6927, 2082, -3503, 3404, 130, 2316, 2009, +9544, 28660, -10357, -9410, -8785, -4449, -2487, -7758, 2125, -3459, 2272, 839, 1300, 2632, 8062, 29239, +-8372, -10007, -8044, -5390, -1708, -7842, 1427, -3267, 1670, 973, 821, 2773, 6482, 29239, -5537, -10923, +-7610, -6050, -1293, -7812, 959, -3137, 349, 1270, 328, 3196, 5871, 29239, -3078, -11542, -7669, -7337, +-1335, -7395, 443, -3449, 258, 1644, 571, 3732, 5061, 29239, -2752, -11929, -7821, -7977, -473, -7165, +148, -3140, -240, 1548, 627, 3926, 5265, 29239, -2462, -11849, -8232, -8271, -435, -7320, 258, -2980, +-189, 1946, 424, 4551, 4535, 29239, -1493, -12683, -8225, -8724, 63, -6934, -105, -2730, -429, 2340, +207, 4958, 3292, 29239, 767, -13641, -7907, -9163, 326, -6934, -387, -2333, -883, 2726, 273, 4943, +2744, 29239, 2440, -14313, -7400, -10027, 532, -6580, -649, -1886, -1355, 3451, 60, 4793, 2008, 28063, +4608, -14756, -7165, -10254, 163, -6085, -809, -1490, -1674, 3442, 223, 4345, 1544, 28345, 5311, -14621, +-6811, -10456, -33, -5679, -1047, -666, -1996, 3150, 426, 3823, 470, 27111, 7652, -14780, -6640, -10472, +-353, -5145, -1299, -715, -1953, 3083, 38, 3705, -84, 26944, 8581, -14210, -6496, -10141, -590, -5015, +-1362, -865, -1564, 2323, -107, 3704, -1065, 25642, 11652, -14245, -5996, -10256, -1186, -4431, -1734, -1029, +-2411, 2452, -280, 3818, -894, 25660, 11235, -14004, -5608, -10625, -1326, -4608, -1383, -1150, -2212, 2284, +-638, 3731, -1055, 25303, 12149, -13973, -5359, -10861, -1691, -4406, -1633, -1116, -2385, 2187, -613, 3741, +-903, 25405, 12337, -14258, -5196, -10795, -1473, -4235, -1730, -1302, -2597, 2010, -1079, 4026, -735, 24824, +12552, -14453, -5094, -10703, -1660, -4166, -1698, -1241, -3046, 2054, -893, 4008, -717, 25145, 12818, -14536, +-4829, -10827, -1913, -4603, -1839, -905, -2780, 1859, -654, 4217, -1328, 24286, 13679, -14459, -4880, -10646, +-2153, -4578, -2047, -753, -2907, 2263, -732, 4505, -1685, 24394, 13427, -14506, -4630, -10829, -2368, -4886, +-1719, -533, -3039, 2526, -845, 4951, -1957, 23266, 15040, -14917, -4304, -11076, -2490, -4901, -1593, -138, +-3009, 2396, -1129, 4997, -2178, 24063, 13604, -14512, -3761, -11215, -2312, -5392, -1332, -506, -3067, 3028, +-1093, 5273, -2029, 24518, 12612, -14825, -3616, -11103, -2054, -5507, -930, -333, -2873, 3047, -1624, 5097, +-2216, 24360, 13572, -14646, -3685, -11012, -2158, -5755, -1348, 72, -3353, 3294, -1655, 4960, -1697, 24718, +13297, -15129, -3530, -10636, -2427, -5832, -1074, 270, -3174, 3221, -1574, 4542, -1547, 25368, 11279, -14760, +-3667, -10589, -2009, -5698, -648, -14, -3262, 2726, -1603, 4543, -1794, 25007, 13020, -15048, -3570, -10619, +-2405, -5842, -1218, 189, -3259, 2703, -1400, 4432, -904, 26418, 10377, -14700, -3985, -10511, -2153, -6021, +-526, -411, -3201, 2553, -1272, 4919, -920, 26514, 10719, -15214, -3763, -10709, -2155, -6121, -894, -228, +-2936, 2626, -970, 5183, -364, 27083, 8373, -14705, -3986, -10222, -2059, -6518, -483, -356, -2995, 2681, +-738, 5138, -11, 27179, 7816, -14797, -4157, -10341, -2333, -6698, -404, 122, -2572, 2901, -244, 5195, +261, 27982, 5394, -14421, -4154, -10020, -1821, -6870, -2, -285, -2186, 2541, -11, 5220, 295, 27841, +4916, -14121, -4137, -9913, -2133, -7088, 15, -134, -2311, 2760, 562, 4612, 1139, 28447, 2652, -13431, +-4484, -9619, -2107, -7065, 206, -712, -1709, 2839, 831, 4392, 1618, 28643, 994, -13213, -4964, -9414, +-1854, -7161, 328, -839, -1126, 2235, 1220, 4273, 2011, 29239, -1071, -12651, -5415, -8975, -1790, -7298, +729, -1284, -325, 2162, 1447, 3689, 3330, 29239, -3513, -11768, -6142, -8239, -1935, -7272, 1123, -1352, +-2, 1663, 1495, 3643, 3903, 29232, -4472, -11580, -6235, -8074, -1853, -7165, 1130, -1461, 120, 1745, +1397, 3401, 5174, 29239, -6211, -10805, -6553, -7679, -1975, -7218, 1214, -1764, 515, 1504, 1905, 3187, +6997, 28642, -8374, -9974, -6956, -7247, -2269, -7053, 1306, -1610, 545, 1514, 2367, 2808, 8067, 28469, +-9532, -9648, -6977, -7037, -2540, -7108, 1443, -1620, 735, 1443, 2862, 2559, 10554, 27450, -12375, -8232, +-7692, -6028, -2908, -6832, 1560, -1861, 1641, 801, 3340, 1910, 12385, 26189, -13550, -7904, -8455, -5294, +-3245, -6634, 1456, -1927, 2574, 497, 3929, 1651, 13179, 24904, -14618, -7135, -8806, -4440, -3686, -6146, +1648, -1920, 2554, 62, 4319, 1128, 15121, 23590, -15343, -6968, -9589, -3545, -4070, -5621, 1232, -1923, +2849, -84, 4664, 878, 16060, 23266, -15676, -6897, -9795, -3551, -4322, -5590, 1394, -1880, 2626, 113, +5148, 333, 19421, 19925, -17021, -5874, -10372, -2744, -5118, -4955, 1207, -1670, 3348, -116, 5324, 46, +21289, 16663, -17220, -5572, -10530, -2002, -5752, -4090, 698, -1344, 3573, -474, 5597, -12, 23308, 13993, +-17629, -5230, -10905, -1687, -6133, -3481, 434, -1038, 3723, -523, 5652, -126, 24134, 13116, -17494, -5245, +-10905, -1687, -6133, -3481, 434, -1038, 3723, -523, 5652, -126, 24134, 13116, -17494, -5245, -10905, -1687, +-6133, -3481, 434, -1038, 3723, -523, 5652, -126, 24134, 13116, -17494, -5245, -10905, -1687, -6133, -3481, +434, -1038, 3723, -523, 5652, -126, 24134, 13116, -17494, -5245, -10987, -1454, -6295, -3224, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, +2, 23, 25, 20, 17, 13, 2, -26, -41, -25, -3, 2, -15, -21, -18, 0, +26, 20, 6, -12, -25, -27, -31, -23, -17, -17, -17, 0, 12, 21, 26, 34, +16, 6, 16, 2, 6, 12, 6, -13, 39, 6, 680, 1222, 670, 640, -606, -1067, +-1006, -1103, 69, -154, -137, -239, 529, 40, -80, -162, 115, 88, -388, -452, -326, -17, +-212, -123, -168, -694, -1317, -2798, -3613, -1922, 2659, 6307, 8386, 6664, 2088, -2245, -5524, -5985, +-4408, -1595, 1161, 3775, 5709, 4318, 2803, -2691, -4864, -4227, -1868, 884, 710, 275, -332, 263, +617, 427, -861, -1161, -884, -544, -199, -7, 548, 512, 228, -1099, -918, -1611, -1813, -2508, +-2163, -2145, -535, 3488, 6569, 10556, 10481, 4698, -3561, -7912, -7433, -4612, 345, 774, 942, 863, +1273, 1209, 335, -1504, -2266, -1756, -1141, -234, 219, 897, 1569, 1059, -245, -1165, -874, -817, +50, -230, -308, -230, -458, -936, -2240, -2280, -3278, -3987, -429, 2618, 4911, 9396, 17567, 19320, +-4030, -16249, -13471, -6828, 464, -18, -558, -514, 1496, 1477, 2431, 772, -821, -1946, -1978, 212, +1132, 816, 267, 61, -463, -1179, -1195, -1738, -1297, -1180, 6, 980, 1188, 948, -239, -1375, +-2269, -3890, -3303, -1844, 335, 3809, 9965, 24404, 15262, -17762, -17577, -12319, -2368, -456, 1755, -742, +-2521, 510, 5554, 7087, -278, -3418, -3336, 273, 442, 910, -971, -224, -500, -110, 16, -414, +-2552, -2251, -850, 44, 1319, 645, -400, -928, -1238, -1422, -1732, -480, -304, 1896, 6237, 20837, +22465, -12718, -19155, -14966, -7399, -1311, 3382, 1229, -1577, 742, 2773, 4630, 724, -728, -907, 1078, +-345, 1298, 747, -947, 149, -772, -543, -2150, -2293, -1562, 81, 54, 209, 733, -440, -560, +-284, -734, -1489, -895, 458, 1593, 5367, 17624, 26323, -6954, -23232, -15654, -11567, -4256, 1157, 4558, +1726, 3420, 2645, 3338, 257, 1111, 64, 147, -997, -85, 147, -816, 642, -1322, -1684, -1529, +-350, 268, 386, -424, 369, 340, -253, -967, -141, 750, -1227, -1918, -430, 270, 3069, 7289, +21143, 24046, -10886, -23220, -15571, -10099, -4846, 1645, 4951, 2860, 3214, 4422, 1537, 1574, 93, -618, +-2145, -434, 1130, 389, 956, -511, -2129, -3353, -1346, -298, 1369, 928, 587, 905, 608, -306, +-340, -338, 536, -1195, -1965, -108, 835, 1993, 7109, 22184, 22203, -18262, -22536, -15286, -8470, -3749, +3455, 4336, 2653, 3615, 2124, 2865, 2795, 1755, -346, -1183, -1019, -603, -188, 1052, -1606, -3115, +-2155, -346, 1295, 1699, 829, 328, 989, 1198, 531, 713, 870, 1445, -166, -1285, -2794, -3067, +-336, 4087, 17017, 28025, -12579, -25772, -11568, -9813, -4521, 894, 5043, 941, 3512, 3812, 3161, 4067, +2206, -899, -2308, -1485, -1850, 30, 1399, 21, -2083, -2043, 259, 1373, 1639, 939, -70, 607, +1687, 1527, 1249, 1813, 1925, 946, -1640, -3215, -4661, -2203, 1198, 6668, 22650, 21903, -23934, -18697, +-11029, -5634, -5466, 1256, 1728, 1150, 7016, 3711, 5180, 2809, 774, -3214, -1325, -2813, -1283, 869, +1663, 367, -1241, -1031, 632, 1340, 1487, 166, 409, 956, 2376, 2314, 2566, 3331, 2407, -1562, +-4756, -4310, -4611, -2077, 3743, 10878, 28494, 4814, -29183, -8769, -10742, -4460, -5256, 2684, -301, 5725, +7368, 3236, 4935, 1610, -1742, -3826, -2012, -4166, 661, 2686, 3266, 1489, -65, -1383, -438, 539, +299, -708, 510, 2601, 3387, 2448, 3474, 2574, -1083, -4292, -4835, -4015, -1847, 365, 8265, 20041, +24739, -23454, -16715, -10936, -8765, -4679, -1185, 3215, 2450, 8886, 2755, 4196, 3186, 282, -3633, -2298, +-3816, -1558, 2523, 3264, 2904, 1334, -681, -1710, -224, 772, -1399, -558, 1921, 2885, 2955, 3124, +3103, 391, -2117, -3109, -4277, -4297, -1930, 4276, 11421, 28481, 4756, -29183, -9566, -14209, -4891, -5398, +4179, 1436, 7545, 7234, 2065, 4550, -23, -1064, -4457, -2019, -4164, 942, 3214, 4712, 3234, 1164, +-1655, -1465, -95, -2063, -2325, 511, 2511, 3684, 2962, 2823, 1752, -388, -1940, -2259, -4689, -3317, +1135, 6309, 18370, 26876, -19367, -20364, -10755, -8535, -4765, -1005, 3602, 3028, 8384, 2444, 3061, 2104, +730, -2209, -2605, -4258, -1814, 2012, 4349, 4407, 3476, -1147, -1906, -2848, -2185, -2933, -618, 3209, +3560, 3416, 2158, 3506, 1232, -1763, -2810, -3148, -2906, -2115, 4308, 12005, 29194, -1971, -28328, -8597, +-13656, -3176, -4801, 3888, 2781, 7654, 4087, 1584, 3715, -803, 1103, -3054, -3332, -4500, 2310, 2219, +4349, 5846, 546, -3176, -3953, -1476, -3104, -822, 2356, 3274, 2187, 2604, 3040, 3065, 118, -2450, +-3040, -4005, -2275, 1532, 8021, 24940, 15183, -28592, -10758, -14368, -5357, -4917, 724, 3447, 3831, 6617, +579, 3905, 636, 1857, -371, -1624, -5189, -569, 1367, 2813, 6745, 1539, -5552, -3080, -2854, -1171, +-485, 1389, 1974, 2096, 2946, 3594, 3365, 1382, -1830, -2780, -3904, -2920, 361, 5081, 19073, 25752, +-20815, -17781, -11859, -10457, -4044, -1964, 4749, 2686, 6504, 2618, 2269, 1755, 269, 365, -976, -4568, +-1999, 1089, 2448, 5764, 3093, -4877, -3442, -3245, -764, -294, 555, 2105, 2635, 3510, 3045, 2213, +2386, -1010, -2095, -4190, -2978, -2556, 2991, 12295, 29194, -4797, -25847, -9823, -13806, -3558, -5324, 4219, +3156, 4230, 4431, 1571, 3307, 985, 1445, -1156, -3106, -3866, 881, 1006, 5646, 3895, -3643, -3541, +-3280, -1378, -718, 71, 1833, 3133, 3336, 2901, 2395, 2148, 245, -2261, -2697, -3297, -1700, -312, +10051, 28234, 5250, -27846, -9621, -15474, -3322, -5801, 1911, 4090, 3137, 4164, 1896, 3226, 393, 2960, +-1233, -1854, -4985, 201, -458, 5353, 4318, -3214, -2110, -3002, -2645, -762, 902, 2453, 3520, 2608, +2560, 2271, 2007, 616, -1790, -1786, -4598, -3133, 652, 6896, 24554, 16790, -28014, -11794, -14778, -6163, +-5051, -220, 3534, 3161, 4587, 2230, 4526, -637, 2479, -648, -2300, -4044, -167, 495, 3191, 6756, +-1752, -3894, -1844, -3507, -2128, 714, 3215, 2939, 3088, 1198, 1477, 1067, 1888, -782, -3002, -2687, +-2832, 195, 7917, 22565, 19645, -27556, -13714, -14155, -7225, -3987, -1209, 2676, 2230, 5294, 3111, 5840, +-1141, 742, 636, -2271, -3613, -1113, 330, 2518, 5766, 1438, -5411, -1345, -3036, -1990, 269, 2752, +3244, 3035, 705, 1057, 656, 1470, -543, -1863, -1422, -3721, -404, 7049, 21283, 22134, -25444, -16288, +-13442, -7814, -3526, -2110, 3483, 570, 5038, 3151, 6518, 253, -384, 602, -2600, -3986, -637, 273, +2414, 5134, 2521, -3807, -2495, -1681, -2221, 12, 834, 2797, 2551, 1246, 636, 890, 1743, 209, +-1595, -2503, -2854, -806, 4906, 18058, 26521, -21193, -19962, -12431, -9449, -2736, -3568, 3326, 905, 4249, +3329, 7249, 2117, -918, 44, -3157, -3986, -93, -188, 2424, 5203, 1491, -1848, -3167, -1960, -1937, +-369, 399, 2608, 2469, 1830, 784, 1422, 2476, -380, -1960, -3292, -1776, -1127, 3851, 16421, 28030, +-16795, -22978, -11830, -10592, -2313, -3998, 3284, 449, 3317, 3300, 7430, 4490, -1277, -133, -3341, -3972, +-772, 181, 1703, 5057, 1130, -663, -1354, -3178, -1330, -864, 440, 1464, 2349, 1353, 1823, 1945, +2512, -1455, -1930, -3419, -1697, -66, 4087, 15011, 28786, -13898, -24437, -12168, -12081, -1758, -3507, 3389, +389, 2802, 3074, 6634, 6332, -540, -503, -3394, -4669, -212, 674, 747, 5127, 1382, -1650, -260, +-3410, -2255, -585, 980, 1552, 2141, 1092, 1646, 2332, 2381, -1491, -1879, -1965, -2770, 507, 2967, +13240, 29194, -10500, -25949, -11916, -12466, -1576, -3633, 3232, -667, 2600, 3367, 6913, 6706, 558, -476, +-3561, -4446, -1888, 1193, -166, 5261, 2057, -1658, 852, -2471, -3390, -884, 57, 1935, 1825, 1298, +1726, 2820, 2151, -697, -3363, -2177, -2755, 641, 3786, 11049, 29194, -4863, -28394, -12568, -13788, -892, +-3618, 3336, -627, 1806, 2730, 6467, 7439, 895, 626, -4384, -4713, -2117, 1369, -424, 5142, 2621, +-1864, 1239, -1132, -3849, -1500, -380, 1406, 1833, 2056, 1116, 2624, 1799, 139, -2982, -3188, -812, +-59, 4936, 11563, 29194, -6623, -28174, -13350, -13719, -687, -3333, 4059, -360, 1450, 2648, 5810, 7669, +611, 1229, -3870, -5655, -1779, 902, 393, 4053, 2991, -2107, 1480, 767, -4364, -2086, -730, 1282, +2264, 2338, 1007, 1974, 2344, -623, -2188, -3709, -2003, 1209, 5998, 14332, 29194, -12241, -25818, -14655, +-12270, -1838, -1908, 4752, -394, 2075, 2269, 6421, 7084, 362, 852, -4060, -5392, -1435, 608, 946, +3646, 1314, -1099, 1775, 2857, -4366, -3006, -1618, 754, 2550, 1704, 1397, 965, 2909, -143, -1806, +-3561, -2988, 3995, 7255, 17968, 26780, -21219, -21794, -16625, -8877, -2033, -463, 4948, -961, 2080, 1809, +6355, 6753, -502, -206, -3413, -4589, -186, 908, 996, 2290, 25, -1075, 1651, 4565, -2711, -4025, +-1718, 225, 2075, 1075, 1976, 856, 2206, -469, -1595, -2798, -1702, 4554, 11093, 24394, 15566, -29183, +-16744, -18014, -4240, -3489, 2831, 4147, 201, 1857, 1144, 6247, 4432, -65, -59, -3420, -3948, 1099, +118, 2659, 362, -2077, -1, 1888, 5473, -909, -4667, -1694, -1427, 1675, 1048, 2536, 1261, 1208, +-233, -600, -4070, -1215, 4971, 14143, 28707, -977, -29183, -14781, -15413, -1006, -2751, 4686, 2672, 437, +1445, 1635, 5403, 3532, -671, -1404, -3017, -2124, 2092, 829, 2550, -1228, -3749, 488, 2240, 5926, +510, -4703, -1916, -1591, 166, 1523, 2707, 2219, 259, -1219, -456, -3033, 1549, 6223, 20035, 25464, +-20051, -22429, -17679, -8605, -972, 331, 4994, 1853, 1552, 41, 1978, 3491, 3164, -521, -1673, -2766, +524, 1365, 2281, 1217, -2876, -3637, 1571, 2328, 5365, 1399, -4838, -1052, -2135, -1205, 1543, 3602, +2434, -288, -1001, -1089, -2426, 4067, 9977, 26309, 11776, -29183, -16446, -18755, -2828, -1762, 4632, 4203, +1836, 1438, -21, 2778, 2301, 2421, -1804, -1707, -2159, 1805, 791, 2536, -225, -3686, -2527, 2192, +3481, 5052, 1542, -4398, -1428, -3240, -1786, 1663, 4472, 3158, -1708, -1086, -2005, 679, 5664, 18490, +27211, -14884, -23706, -17603, -12683, -1031, 1689, 6378, 2065, 1945, 482, 1833, 2439, 1781, 904, -3434, +-1697, 185, 2218, 1229, 1897, -1747, -3886, -715, 2618, 3943, 4199, 1041, -3754, -1384, -3944, -1882, +1399, 4746, 2723, -206, -1802, -2552, 1683, 9383, 26790, 12522, -28063, -16288, -18586, -5858, -2740, 6100, +5023, 1854, 2358, 755, 4043, 1004, 1669, -1149, -4603, -907, 1521, 936, 2550, 328, -2794, -2582, +307, 3237, 4087, 3849, 980, -3394, -2715, -4094, -1248, 1566, 4140, 3728, -456, -2517, -1947, 3738, +15660, 29004, -8551, -26420, -15790, -14407, -3064, -946, 8575, 3202, 2036, 1433, 2853, 2891, 1000, 970, +-2799, -4436, -400, 2007, 983, 2587, -1768, -2314, -1554, 1191, 3741, 3985, 3757, 1446, -3568, -3920, +-3473, -1850, 2635, 3478, 3802, -177, -3210, -1433, 5890, 21315, 23763, -23104, -20301, -16715, -8291, -3653, +2209, 8144, 1479, 1867, 1028, 5115, 2385, 708, -230, -3211, -3685, 579, 952, 2199, 1385, -2746, +-2623, -463, 1867, 4324, 3264, 3652, 2240, -4378, -4014, -3159, -1687, 2611, 3001, 3408, 6, -2973, +1096, 7568, 26055, 13715, -27328, -16945, -16620, -5184, -4193, 4063, 6851, 1959, 1624, 1734, 5156, 2051, +598, -752, -3250, -3633, 835, 550, 2619, 912, -2721, -2552, -308, 1925, 4301, 3274, 3612, 2281, +-4422, -3982, -2974, -1629, 2563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -11, 1, -8, -8, -25, -25, -28, -22, -10, 3, +18, 35, 34, 35, 27, 22, 15, 0, -5, -11, -16, -17, -21, -18, -13, -5, +8, 34, 60, 73, 91, 102, 123, 125, 131, 127, 120, 112, 113, 120, 131, 136, +138, 134, 131, 125, 128, 128, 141, 146, 139, 132, 128, 105, 78, 60, 34, 10, +-7, -36, -47, -65, -88, -183, -575, -1072, -1702, -2208, -2482, -2311, -1758, -946, -61, 674, +1246, 1637, 1865, 1879, 1767, 1435, 1070, 692, 428, 367, 369, 482, 496, 448, 320, 129, +-39, -119, -109, -5, 146, 313, 413, 498, 466, 482, 396, 337, 291, 257, 231, 154, +40, -100, -249, -341, -405, -467, -588, -752, -939, -1101, -1185, -1140, -933, -650, -314, 5, +234, 398, 451, 553, 616, 737, 913, 1094, 1338, 1540, 1811, 1986, 2025, 1853, 1475, 847, +25, -962, -2126, -3396, -4621, -5605, -6173, -6187, -5717, -4662, -3244, -1581, 52, 1403, 2414, 2916, +2970, 2650, 2141, 1698, 1340, 1128, 1010, 832, 617, 298, -118, -463, -788, -846, -636, -254, +283, 812, 1219, 1515, 1653, 1722, 1787, 1779, 1826, 1862, 1873, 1826, 1675, 1388, 1044, 569, +93, -390, -846, -1205, -1498, -1676, -1760, -1758, -1663, -1472, -1244, -956, -655, -377, -134, 32, +139, 207, 241, 270, 246, 199, 168, 209, 317, 456, 572, 569, 505, 388, 287, 258, +217, 278, 309, 346, 320, 366, 381, 463, 496, 525, 517, 498, 488, 473, 414, 265, +-10, -409, -910, -1537, -2222, -2902, -3432, -3754, -3770, -3511, -3023, -2276, -1403, -519, 318, 1031, +1584, 1896, 1959, 1758, 1413, 1009, 624, 170, -309, -720, -948, -928, -681, -328, 6, 297, +566, 894, 1238, 1532, 1809, 2070, 2300, 2469, 2512, 2442, 2183, 1780, 1341, 941, 656, 439, +267, 51, -265, -648, -1019, -1276, -1481, -1636, -1755, -1757, -1618, -1356, -966, -561, -192, 144, +417, 658, 813, 886, 871, 795, 682, 559, 403, 314, 270, 270, 309, 394, 534, 666, +839, 1002, 1112, 1203, 1154, 1052, 818, 559, 377, 149, -35, -320, -657, -1098, -1702, -2456, +-3260, -4130, -5051, -6057, -6885, -7385, -7315, -6110, -4084, -1602, 777, 2562, 3665, 4290, 4513, 4535, +4407, 4049, 3416, 2561, 1674, 949, 428, 136, 44, 12, 15, -41, -36, 39, 226, 492, +818, 1220, 1632, 2036, 2374, 2638, 2676, 2568, 2306, 1996, 1627, 1222, 769, 278, -238, -792, +-1321, -1868, -2426, -3011, -3531, -3951, -4059, -3851, -3287, -2543, -1732, -997, -341, 228, 721, 1175, +1525, 1784, 1912, 1996, 2030, 2070, 2081, 2100, 2090, 2012, 1825, 1618, 1472, 1390, 1387, 1447, +1513, 1602, 1642, 1665, 1610, 1523, 1360, 1075, 789, 404, -49, -667, -1554, -2843, -4586, -6657, +-8757, -10564, -11966, -13462, -14660, -14694, -11921, -6755, -328, 5554, 9556, 11402, 11442, 10284, 8636, 6998, +5325, 3631, 1970, 506, -588, -1427, -1947, -2214, -2247, -1978, -1496, -827, -66, 750, 1655, 2679, +3644, 4482, 5030, 5237, 5132, 4831, 4412, 3935, 3283, 2504, 1626, 657, -359, -1355, -2289, -3143, +-3956, -4656, -5251, -5641, -5859, -5562, -4748, -3375, -1777, -248, 904, 1563, 1836, 1884, 1845, 1709, +1577, 1535, 1625, 1867, 2112, 2313, 2453, 2606, 2655, 2677, 2662, 2461, 2102, 1727, 1430, 1146, +918, 670, 372, 39, -298, -665, -972, -1457, -2386, -3680, -5342, -6997, -8359, -8975, -8573, -7158, +-5022, -2734, -1519, -2043, -4622, -8297, -9335, -6687, -1496, 4038, 7788, 9208, 8884, 7703, 6464, 5660, +5044, 4230, 2934, 1263, -318, -1523, -2271, -2684, -2737, -2304, -1314, -10, 1498, 3026, 4340, 5386, +6094, 6415, 6231, 5586, 4639, 3604, 2590, 1506, 422, -710, -1864, -2887, -3662, -4077, -4109, -3803, +-3369, -2916, -2740, -2829, -3240, -3623, -3523, -2786, -1476, 76, 1532, 2605, 3251, 3517, 3552, 3403, +3041, 2531, 1937, 1419, 1125, 1074, 1181, 1361, 1516, 1743, 1946, 2208, 2431, 2550, 2500, 2243, +1881, 1407, 955, 447, -146, -927, -2276, -3992, -6079, -8223, -10183, -11732, -12406, -11983, -10487, -9056, +-8873, -11427, -14655, -11787, -4998, 4628, 12727, 16789, 16978, 14300, 10314, 7085, 5129, 3860, 2387, 573, +-939, -1872, -2009, -1996, -1771, -1461, -803, -110, 753, 1566, 2398, 3083, 3841, 4710, 5512, 5867, +5668, 4982, 4150, 3246, 2476, 1668, 679, -669, -2146, -3487, -4327, -4625, -4394, -3903, -3430, -3429, +-4016, -5199, -5900, -5616, -4036, -1534, 1026, 2936, 3749, 3798, 3498, 3198, 2970, 2684, 2311, 1874, +1661, 1714, 1922, 2140, 2327, 2421, 2577, 2634, 2605, 2550, 2512, 2558, 2566, 2476, 2090, 1414, +548, -357, -1201, -1818, -2580, -3617, -5057, -6842, -8794, -10642, -11927, -12314, -11597, -10172, -9925, -13637, +-21432, -19255, -11281, 1401, 13120, 19671, 21480, 19167, 14511, 10375, 7981, 6096, 3899, 1070, -1016, -2289, +-2424, -2606, -2828, -3114, -2487, -1368, 0, 1191, 2377, 3397, 4615, 6028, 7429, 8141, 7919, 6749, +5295, 3914, 2875, 1973, 755, -1031, -3128, -4991, -6048, -6351, -5980, -5325, -4414, -3866, -3939, -5160, +-6021, -5650, -3888, -1227, 1227, 3101, 3775, 3725, 3244, 2545, 1957, 1590, 1498, 1491, 1527, 1567, +1690, 1868, 2177, 2516, 2883, 3106, 3171, 3061, 2804, 2635, 2411, 2155, 1660, 1078, 556, 171, +-337, -997, -1855, -3152, -4664, -6484, -8412, -10235, -11694, -12440, -12228, -10585, -8451, -7545, -11582, -16687, +-12828, -5192, 6368, 14815, 18588, 17853, 14519, 10222, 7667, 6324, 5173, 3090, 732, -1060, -2010, -2230, +-2693, -3197, -3285, -2546, -1217, 425, 1989, 3631, 5034, 6380, 7502, 8345, 8244, 7400, 5751, 4147, +2741, 1795, 858, -234, -1642, -3042, -4254, -4911, -5042, -4838, -4467, -4060, -4155, -4984, -6643, -7342, +-6826, -4688, -1752, 836, 2543, 3041, 2974, 3045, 3377, 3789, 3765, 3185, 2104, 1094, 482, 464, +703, 1146, 1584, 2129, 2601, 2950, 3043, 3059, 3245, 3447, 3443, 3075, 2400, 1690, 855, -83, +-1001, -2056, -3452, -5179, -7247, -9494, -11698, -13815, -14970, -14878, -14541, -18026, -23404, -18145, -8609, 5389, +16852, 23091, 23933, 20416, 14603, 9779, 6867, 4965, 2794, -22, -2228, -3556, -3826, -3889, -4015, -3750, +-2800, -1651, -142, 1117, 2414, 3513, 4812, 6249, 7715, 8282, 8093, 7181, 5892, 4553, 3433, 2359, +1133, -471, -1995, -3360, -3947, -4069, -3912, -3826, -3764, -4084, -5202, -7404, -8635, -8340, -6370, -3377, +-75, 2429, 3197, 2730, 1797, 1447, 1697, 1960, 1940, 1586, 1217, 1010, 1174, 1644, 2330, 2860, +3327, 3605, 3600, 3309, 2842, 2402, 2282, 2523, 2673, 2541, 2049, 1293, 481, -361, -1005, -2039, +-3396, -5079, -7030, -9274, -11266, -12935, -13628, -13424, -13299, -21276, -28457, -20283, -9236, 7875, 19020, 25003, +25147, 21214, 15171, 11108, 8659, 6760, 3673, 178, -2539, -3939, -4214, -4734, -5556, -6077, -4838, -3110, +-899, 924, 2761, 4278, 6074, 7909, 9511, 10136, 9720, 8341, 6760, 4972, 3592, 1973, 18, -2425, +-4293, -5085, -4969, -4671, -4504, -4678, -4646, -4674, -5173, -6915, -7530, -7045, -4661, -2111, 565, 2408, +2843, 2718, 2112, 1646, 1584, 1712, 1669, 1443, 1123, 663, 424, 438, 991, 1617, 2461, 2988, +3392, 3264, 3100, 3077, 2946, 2876, 2576, 2284, 2261, 2219, 1855, 759, -724, -2581, -4404, -6143, +-7908, -9620, -11233, -12550, -12968, -12647, -11912, -19047, -26780, -19053, -8135, 8989, 20061, 25088, 23973, 19140, +12750, 8733, 6861, 5602, 3001, -258, -2672, -3782, -3666, -3942, -4759, -5059, -4006, -2647, -614, 1278, +3484, 5495, 7481, 9245, 10575, 10619, 9678, 7700, 5515, 3526, 2151, 892, -778, -3209, -5132, -5364, +-4698, -3799, -3216, -3331, -3507, -4211, -5171, -7442, -8355, -8219, -6283, -3413, -13, 2243, 2919, 2516, +1712, 1455, 1852, 2093, 1855, 1092, 325, -134, -6, 522, 1214, 1802, 2422, 2665, 3021, 3080, +3205, 3462, 3799, 4080, 3886, 3712, 3511, 3174, 2148, 665, -1602, -3885, -6067, -7979, -9751, -11190, +-11984, -12318, -11573, -10753, -14025, -28169, -24957, -14829, 1644, 17340, 24455, 26061, 22411, 15950, 10565, 8224, +6641, 4720, 860, -2017, -4433, -4729, -5267, -5853, -6612, -5383, -3503, -997, 1290, 3180, 4749, 6349, +8127, 10195, 11169, 10778, 9153, 7299, 5137, 3370, 1583, -120, -2529, -4898, -6848, -7175, -6060, -4481, +-3159, -2180, -1762, -2256, -5131, -7606, -8228, -6838, -4004, -1064, 2049, 2955, 2581, 1259, 565, 1111, +1959, 2104, 1401, 347, -706, -983, -612, 255, 1059, 1962, 2652, 3164, 3183, 2911, 2848, 2745, +3248, 3467, 3498, 3306, 2679, 1847, 801, -211, -1806, -3900, -6063, -7903, -9453, -10599, -11228, -11089, +-10991, -9696, -20835, -31375, -20154, -8979, 11898, 22403, 27608, 26037, 20570, 12843, 8617, 6203, 4757, 1750, +-1579, -3997, -4888, -4361, -4680, -5640, -6603, -5233, -3266, -599, 1592, 3560, 5097, 6977, 8864, 10609, +11131, 10519, 8838, 7176, 5076, 3332, 1335, -594, -3168, -5491, -7147, -7133, -5941, -4388, -3129, -2175, +-1772, -2256, -5165, -7559, -8008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -65, -65, -65, -65, -65, -65, -65, -65, -65, -65, +-63, -65, -65, -65, -66, -65, -66, -65, -67, -60, -35, -3, 26, 46, 59, 62, +67, 63, 56, 55, 62, 80, 105, 126, 129, 125, 104, 86, 41, -3, -43, -61, +-63, -52, -29, -10, -15, -16, -29, -42, -57, -66, -63, -96, -161, -237, -301, -371, +-489, -761, -1174, -1536, -1674, -1496, -993, -285, 496, 1238, 1675, 1877, 1870, 1685, 1349, 917, +507, 216, 24, -26, -57, -77, -86, -77, -55, -62, -43, -13, 118, 239, 443, 624, +828, 991, 1156, 1204, 1381, 1644, 1904, 1894, 1282, 153, -1270, -2729, -4011, -4925, -5266, -4920, +-3948, -2544, -1108, 35, 519, 425, -65, -606, -979, -785, -121, 622, 1221, 1757, 2387, 2929, +3018, 2590, 1548, 390, -677, -1290, -1463, -1040, -280, 518, 1034, 1147, 768, 273, -41, -31, +217, 610, 1179, 1678, 2128, 2317, 2278, 1935, 1602, 1391, 1336, 1294, 1061, 701, 246, -280, +-808, -1544, -2329, -3284, -4158, -4952, -5522, -5772, -5580, -4854, -3900, -2888, -1692, -203, 1450, 2865, +3722, 3957, 3514, 2785, 1955, 1431, 1009, 723, 456, 345, 136, -114, -338, -554, -622, -596, +-423, -315, -148, -3, 251, 491, 818, 1159, 1483, 1868, 2131, 2316, 2495, 2599, 2680, 2579, +2278, 1784, 1236, 667, 154, -390, -877, -1245, -1479, -1734, -1819, -1908, -2040, -2332, -2810, -3376, +-4012, -4668, -5416, -6008, -5932, -4848, -2748, -237, 2150, 3829, 4628, 4531, 3769, 2792, 1735, 972, +309, 23, -8, 271, 629, 910, 896, 660, 300, -13, -167, -267, -226, -79, 153, 596, +1091, 1629, 2128, 2434, 2701, 2724, 2577, 2650, 2727, 2682, 2418, 2129, 1940, 1752, 1163, 380, +-716, -1972, -3078, -3955, -4792, -5768, -6841, -8490, -11378, -14412, -13686, -7771, 258, 6752, 10556, 11290, +10191, 7925, 4878, 1807, -761, -1927, -2335, -1894, -1048, 2, 1059, 1696, 1700, 1141, 402, -211, +-625, -1073, -1299, -1201, -729, -26, 700, 1446, 1940, 2509, 3161, 3833, 4351, 4694, 5001, 5081, +4814, 3848, 2249, 267, -1357, -2755, -3972, -4886, -5661, -6273, -7226, -8388, -10033, -13006, -18854, -18136, +-7945, 3352, 12336, 16213, 16665, 14002, 10192, 5806, 1767, -1502, -3502, -4210, -3881, -2693, -1121, 175, +943, 1235, 1242, 1074, 624, 222, -499, -1206, -1627, -1597, -1239, -598, 367, 1351, 2204, 3397, +4802, 5971, 6506, 6255, 5503, 4338, 3111, 1700, 127, -1355, -2750, -3810, -4663, -5303, -6053, -7422, +-9026, -10282, -11682, -16753, -22354, -13913, -710, 11080, 17862, 19713, 17959, 13641, 8757, 3570, -952, -4336, +-5872, -6127, -4810, -3105, -1089, 399, 1574, 2207, 2633, 2703, 2475, 1705, 646, -488, -1363, -1676, +-1291, -734, -126, 664, 1977, 3250, 4510, 5374, 5750, 5159, 3982, 2991, 1721, 309, -785, -1774, +-2578, -3293, -3899, -4461, -5487, -7190, -8100, -8099, -7620, -8000, -10757, -16679, -14945, -3705, 7018, 14967, +17560, 17082, 13440, 8838, 3828, -250, -3037, -4376, -4651, -4175, -2780, -955, 840, 2191, 3215, 3610, +3550, 2807, 1768, 169, -1493, -2558, -2943, -2805, -1973, -866, 609, 2314, 4096, 5681, 6648, 6640, +6080, 5040, 3654, 2146, 1068, -105, -1505, -3310, -4516, -5466, -6092, -7008, -8216, -9320, -9000, -8811, +-9289, -16991, -22639, -8764, 4273, 15740, 19356, 19613, 15984, 10686, 5398, 569, -2815, -5317, -5915, -5562, +-3340, -1509, 863, 2562, 4300, 4932, 4997, 4101, 2596, 453, -1745, -3570, -4351, -4736, -4177, -2874, +-970, 1128, 3497, 5544, 7227, 8101, 8123, 7343, 5917, 4391, 2948, 1190, -1436, -3562, -4970, -5535, +-5764, -6027, -7237, -9486, -9985, -11205, -12495, -27395, -25435, -4352, 9548, 21663, 22923, 23087, 17375, 11620, +4248, -1730, -6192, -8347, -8731, -7383, -4827, -2399, 221, 2286, 4662, 5647, 6036, 4941, 3480, 1159, +-1253, -3375, -4680, -5400, -4818, -3623, -1761, 660, 3555, 6311, 8243, 8958, 8700, 7361, 5814, 4311, +2785, 1104, -1204, -3499, -5370, -6130, -5885, -5666, -7026, -9070, -8929, -9732, -11570, -25156, -24548, -4511, +9950, 21468, 23009, 22484, 17037, 11065, 3745, -2590, -6770, -8792, -8826, -7642, -5098, -2495, 327, 2343, +4659, 6166, 6692, 5891, 3910, 880, -2253, -4987, -6261, -6524, -5552, -4195, -2515, -296, 2790, 5944, +8110, 8825, 8608, 7986, 7304, 6126, 4433, 2021, -487, -3012, -4686, -5336, -5250, -5284, -6763, -8472, +-8648, -8731, -9421, -16007, -29256, -16619, 2192, 16632, 23606, 23673, 20948, 14487, 8190, 530, -4397, -8079, +-8571, -8466, -6181, -3583, -634, 1247, 3667, 5422, 6337, 6091, 4557, 1635, -1749, -4987, -6356, -6441, +-5772, -4604, -2987, -1204, 1009, 3770, 6567, 8755, 9521, 9351, 8454, 7182, 5768, 3720, 1242, -1608, +-3953, -5038, -5395, -5231, -6036, -8224, -9875, -9696, -9815, -9508, -21430, -26583, -8765, 5668, 19376, 22978, +24072, 19399, 12846, 4978, -1502, -5665, -7796, -7696, -6955, -4845, -3203, -592, 1500, 4437, 5702, 5672, +4351, 2340, -184, -2918, -5311, -5850, -6468, -6209, -4905, -2295, 227, 2964, 5926, 8748, 10600, 11114, +10434, 8945, 7157, 5292, 2592, -908, -4119, -6045, -6528, -6075, -5684, -6989, -9456, -10134, -9426, -7488, +-14141, -29256, -15588, 227, 14830, 22300, 23959, 21476, 14552, 6934, -1023, -5057, -8246, -8305, -7845, -5407, +-3503, -1323, 613, 3798, 5834, 6484, 6087, 4623, 1584, -1773, -5058, -6336, -7077, -7071, -5704, -3485, +-1269, 1861, 5118, 7978, 9874, 10762, 10561, 10052, 8877, 6888, 4038, 335, -2929, -5332, -6278, -5993, +-5284, -6010, -8189, -9517, -8732, -8457, -13021, -29256, -19706, -2020, 12391, 22209, 24042, 22578, 15756, 8403, +-202, -5342, -8917, -9352, -8385, -6015, -3980, -1739, -163, 2790, 5501, 6941, 7115, 5767, 2544, -1079, +-4589, -6647, -7038, -6982, -5938, -4547, -2792, 194, 3535, 6481, 8950, 10814, 11541, 11518, 10658, 8342, +4868, 1152, -2262, -4659, -5814, -6008, -5449, -5697, -7354, -9489, -9917, -9636, -8535, -21629, -27190, -7271, +6549, 19719, 22530, 23425, 19063, 12728, 4086, -3583, -7980, -9949, -8718, -7524, -5054, -3340, -1486, 428, +4063, 6255, 7142, 6707, 4721, 1162, -2335, -5548, -6404, -6693, -6408, -5671, -4361, -2549, 655, 4200, +7868, 10501, 11711, 12009, 11715, 10039, 7170, 3488, -693, -3799, -5429, -5826, -5529, -5650, -6883, -9805, +-10942, -10428, -7593, -12524, -28632, -15835, 694, 14804, 22202, 23928, 22042, 15104, 7001, -1847, -6351, -8839, +-8448, -7813, -5957, -4755, -2927, -1377, 2515, 5660, 7124, 7293, 6221, 3118, -756, -4708, -6245, -6791, +-6787, -6096, -4561, -3008, -478, 2970, 6752, 9727, 11387, 12253, 11791, 10785, 8807, 5997, 1490, -2926, +-5797, -7238, -7371, -7359, -7614, -9992, -11456, -10406, -8540, -11378, -27055, -17584, -228, 13064, 21543, 23634, +22737, 16567, 8740, -422, -5473, -8191, -8440, -7583, -5372, -4394, -2892, -1994, 1033, 4662, 7099, 8026, +7236, 4094, -112, -4158, -6403, -6853, -6979, -6744, -5531, -4094, -1069, 2494, 5840, 8998, 11387, 12642, +12452, 11622, 9530, 6236, 1618, -2770, -6355, -8152, -8608, -7893, -7850, -9318, -10826, -9543, -8659, -9309, +-23486, -20916, -2819, 9836, 20324, 22796, 23445, 18436, 11584, 2420, -3985, -7592, -8864, -8247, -6139, -4689, +-3078, -1957, -29, 3581, 6617, 8583, 8132, 5396, 961, -3216, -6399, -7474, -7573, -7102, -5879, -4343, +-1864, 1611, 4468, 7869, 10768, 12251, 12073, 11466, 9761, 6520, 2022, -2196, -5396, -7040, -8192, -7794, +-7824, -8765, -10907, -10938, -9874, -8971, -21572, -22850, -3775, 9382, 20730, 23354, 24504, 19913, 13543, 4312, +-3636, -8177, -9992, -9791, -7815, -5449, -3182, -1428, -92, 3218, 6312, 8797, 8864, 6813, 2550, -1872, +-5721, -7767, -8088, -7441, -6259, -4349, -2492, 473, 3332, 6424, 9287, 10654, 11031, 10726, 9814, 7401, +3484, -1057, -4878, -6637, -7395, -7046, -7493, -8670, -10325, -10722, -9974, -7733, -14771, -24297, -8892, 5070, +17638, 21888, 23333, 20481, 14844, 7042, -1831, -6980, -9352, -9191, -8078, -5358, -3427, -738, 341, 3267, +6223, 8535, 8371, 6989, 3646, -555, -4705, -7160, -8229, -7970, -7007, -5330, -3591, -1064, 1957, 4850, +7559, 9493, 10657, 10910, 10370, 8544, 5555, 725, -4154, -6969, -8007, -8173, -8208, -8693, -9731, -10081, +-10042, -7850, -13251, -23577, -9904, 4000, 16408, 21019, 22111, 20262, 15541, 8838, -8, -5462, -8003, -8018, +-7412, -4692, -3123, -818, -150, 1742, 4486, 6941, 7752, 7084, 4649, 783, -3475, -6519, -8184, -8529, +-7944, -6428, -4541, -1806, 1641, 4408, 6945, 9026, 10214, 10914, 10783, 9255, 6597, 1852, -3448, -7143, +-8545, -8890, -8424, -8838, -9263, -9464, -9250, -7781, -10310, -22004, -13796, 1375, 13458, 20110, 21059, 20565, +16464, 10979, 2633, -3306, -6651, -7399, -7761, -5578, -3737, -1744, -496, 660, 3277, 5721, 7849, 7798, +5578, 1821, -2412, -5953, -8242, -8995, -8395, -6446, -4456, -2054, 909, 3690, 6161, 8644, 9968, 10533, +10462, 9470, 6933, 2400, -2723, -6531, -8053, -8832, -8305, -8517, -8861, -8979, -9079, -8063, -9359, -20675, +-15228, -125, 11964, 19501, 20708, 20599, 16780, 11508, 3233, -2930, -6516, -7469, -7876, -5794, -3838, -1844, +-477, 691, 3288, 5722, 7849, 7806, 5607, 1927, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -13, -2, -17, -21, -31, -34, -36, +-36, -44, -45, -59, -60, -69, -74, -81, -85, -89, -98, -94, -97, -98, -99, -93, +-73, -41, -10, 17, 36, 55, 75, 91, 94, 94, 95, 99, 110, 115, 112, 108, +91, 73, 50, 26, 7, -13, -37, -47, -54, -84, -127, -158, -180, -185, -187, -177, +-166, -151, -136, -122, -122, -118, -131, -141, -153, -151, -146, -136, -98, -205, -453, -919, +-1389, -1697, -1710, -1367, -564, 459, 1457, 2169, 2581, 2537, 2180, 1529, 939, 540, 304, 204, +61, -5, -109, -55, 35, 395, 754, 1167, 1820, 2536, 2421, 1486, 51, -1574, -3142, -4513, +-5405, -5623, -5122, -3951, -2414, -1033, 80, 957, 1325, 1233, 1252, 1345, 1653, 1980, 2051, 1731, +1401, 1029, 714, 530, 380, 162, -84, -251, -297, -301, -219, 35, 307, 729, 1136, 1466, +1503, 1443, 1480, 1554, 1752, 2018, 2175, 1969, 1010, -263, -1826, -3311, -4616, -5612, -5953, -5588, +-4882, -4199, -3084, -1693, -90, 1406, 2522, 3157, 3312, 2972, 2327, 1646, 991, 511, 399, 511, +588, 564, 459, 360, 78, -50, -64, 93, 477, 929, 1287, 1448, 1504, 1519, 1475, 1535, +1761, 1983, 2259, 2207, 1538, 327, -1302, -3064, -4724, -6006, -6686, -6733, -6454, -5623, -4131, -2382, +-333, 1789, 3419, 4389, 4570, 4000, 3174, 2323, 1426, 645, 347, 345, 278, 132, -55, -151, +-88, 302, 748, 937, 972, 1152, 1394, 1456, 1401, 1302, 1259, 1254, 1248, 1160, 1131, 1049, +826, 114, -1005, -2391, -3900, -5166, -6191, -6784, -7221, -7030, -5810, -3928, -1321, 1843, 4476, 6052, +6356, 5673, 4419, 3138, 1775, 597, -234, -458, -642, -747, -691, -428, 107, 558, 904, 990, +1151, 1544, 1988, 2072, 1989, 1751, 1432, 1093, 818, 795, 643, 467, 85, -592, -1545, -2890, +-4542, -6511, -9210, -12033, -13327, -10757, -4283, 3061, 8842, 11812, 12057, 10318, 7602, 4476, 1645, -534, +-1893, -2553, -2673, -2368, -1891, -1259, -845, -642, -646, -594, -209, 575, 1636, 2747, 3559, 3773, +3365, 2994, 2629, 2301, 1994, 1272, 604, -229, -1470, -3221, -5575, -8576, -12621, -16502, -16916, -11884, +-3321, 5211, 11356, 13951, 13593, 11000, 7263, 3282, 383, -1159, -1538, -1181, -592, 46, 317, 196, +-289, -981, -1688, -2076, -2034, -1584, -481, 768, 2002, 2823, 3695, 4660, 4996, 4882, 4431, 3607, +2492, 1111, -897, -3433, -6472, -9862, -13676, -17719, -19485, -16372, -8590, 931, 9111, 13753, 14824, 12965, +9298, 5450, 2488, 753, 137, 195, 566, 865, 762, 376, -234, -921, -1600, -2082, -2227, -2041, +-1360, -188, 1126, 2154, 3075, 4030, 4749, 4999, 4812, 4442, 3872, 2706, 870, -1611, -4720, -8161, +-11883, -15984, -19603, -20467, -15752, -6089, 4418, 12207, 15650, 15273, 12362, 8256, 4452, 1801, 593, 352, +551, 791, 670, 287, -223, -763, -1261, -1748, -2042, -2073, -1688, -864, 340, 1684, 2902, 3748, +4354, 4657, 4452, 4170, 3943, 3114, 1685, -420, -2810, -5420, -8199, -11136, -14611, -18971, -21538, -16967, +-5871, 5893, 14261, 17467, 16477, 12687, 8140, 4378, 1986, 797, 405, 354, 284, -13, -477, -941, +-1440, -2071, -2785, -3302, -3098, -2149, -689, 1025, 2562, 3597, 3961, 3967, 4220, 4220, 4213, 3928, +3129, 1933, 233, -1823, -4644, -8168, -13100, -20007, -24743, -19570, -7476, 4681, 13248, 16622, 15956, 12594, +8058, 3857, 1155, 68, 143, 561, 943, 1059, 921, 589, -146, -1349, -2788, -3896, -4259, -3867, +-2862, -1448, 15, 1595, 2925, 4107, 5022, 5376, 5774, 5931, 5486, 4303, 2405, -398, -3937, -8597, +-15078, -24127, -27681, -18554, -4843, 7403, 14800, 16887, 15182, 11080, 6177, 2304, 323, 75, 771, 1416, +1815, 1829, 1663, 1309, 584, -560, -2029, -3190, -3812, -3959, -3665, -2890, -1534, 312, 1989, 3419, +4622, 5246, 5779, 6109, 5859, 5014, 3167, 240, -3725, -9037, -16319, -25696, -29019, -18833, -4176, 8553, +15832, 17419, 14984, 9972, 4509, 851, -400, 113, 1282, 2285, 2936, 3037, 2700, 2033, 1093, -99, +-1368, -2293, -2924, -3328, -3342, -2817, -1537, 17, 1446, 3007, 4059, 4539, 4699, 5165, 5131, 4644, +3011, 220, -3382, -7914, -13893, -22940, -30566, -22670, -6569, 7735, 16319, 18168, 15554, 9984, 4025, 125, +-1094, -332, 1383, 2945, 3846, 3909, 3462, 2686, 1593, 235, -1217, -2207, -2822, -3292, -3374, -2856, +-1397, 456, 1835, 2798, 3259, 3341, 3491, 4142, 4582, 4364, 3119, 695, -2255, -5505, -9157, -14324, +-25018, -30040, -16556, -36, 12456, 17792, 17248, 12643, 5934, 769, -1154, -624, 1258, 3250, 4422, 4476, +3816, 3003, 2193, 1219, -335, -2104, -3245, -3895, -3924, -3040, -1399, 597, 1886, 2124, 1935, 2033, +2329, 3138, 4167, 4223, 3592, 1728, -763, -3546, -6979, -11952, -22548, -28718, -16819, -948, 11467, 16903, +16593, 12745, 6667, 506, -3086, -3647, -1843, 1165, 3458, 4680, 4824, 4485, 3807, 2737, 820, -1742, +-3552, -4395, -4176, -3091, -1486, 366, 1456, 1390, 1067, 1213, 2048, 3555, 5014, 5180, 4158, 2076, +-685, -3651, -7357, -12796, -23754, -27463, -14124, 1263, 12817, 17393, 16617, 12587, 6404, -78, -3967, -4770, +-2962, 55, 2357, 3639, 3952, 4049, 4142, 3734, 2093, -453, -2420, -3462, -3699, -3326, -2349, -539, +758, 1096, 1412, 1456, 2005, 3139, 4393, 4725, 4092, 2285, -505, -3894, -8808, -15265, -26653, -26991, +-11325, 4181, 15158, 18721, 17291, 12623, 6119, -622, -4383, -5165, -3322, -570, 1446, 2844, 3505, 3797, +3875, 3586, 2542, 871, -633, -1932, -2647, -2720, -2187, -747, 351, 904, 1395, 1577, 1776, 2667, +3728, 3860, 3065, 1258, -1413, -4722, -9349, -15158, -26144, -27444, -11815, 4160, 15418, 19041, 17568, 12941, +6419, -306, -3976, -4754, -3001, -369, 1481, 2634, 3109, 3333, 3341, 3040, 2295, 1384, 549, -779, +-2010, -2402, -1731, -195, 1019, 1586, 1986, 1724, 1137, 1564, 2600, 3105, 2514, 676, -1927, -4777, +-8386, -12373, -21363, -29459, -17436, 93, 13351, 19257, 18571, 14443, 7694, 549, -3772, -4880, -3472, -497, +1849, 2929, 3089, 3050, 2974, 2923, 2639, 1608, 597, -590, -1921, -2245, -1125, 676, 1840, 2003, +1665, 1034, 246, 515, 1829, 2594, 2508, 1052, -1151, -3560, -6804, -10723, -19393, -28616, -18874, -1559, +12035, 18592, 18198, 14477, 8543, 1664, -3501, -5645, -5224, -2158, 827, 2697, 3416, 3419, 3033, 2542, +2151, 1140, -3, -1282, -2266, -1969, -167, 2421, 3183, 2842, 1537, 65, -568, -20, 1721, 2474, +2348, 773, -1159, -3205, -6089, -10098, -20030, -27341, -14562, 569, 12988, 17795, 16627, 13174, 7202, 1054, +-4138, -5799, -5510, -1882, 825, 2803, 3261, 3137, 2933, 2586, 2382, 971, -355, -2029, -2861, -2172, +-138, 2129, 3425, 2872, 1814, 399, -647, 95, 1767, 2770, 2299, 652, -1390, -3313, -6956, -12201, +-23307, -25198, -9855, 4065, 15134, 17461, 15667, 11269, 6324, 584, -4174, -6031, -5764, -2303, 272, 2692, +3458, 3678, 3215, 2915, 2678, 1753, 666, -1164, -2253, -2236, -781, 1015, 2202, 2099, 1771, 844, +47, 359, 1899, 2744, 1897, -59, -2684, -4581, -8047, -13017, -24325, -24632, -8060, 5725, 16586, 18076, +15945, 10931, 5502, -36, -4283, -6057, -5651, -2537, -127, 2029, 2773, 3308, 3086, 3069, 2963, 2784, +2144, 211, -1765, -2692, -1242, 700, 1897, 2232, 2311, 1742, 684, 618, 1926, 2660, 1724, -515, +-3467, -5473, -8350, -11954, -22775, -26630, -9759, 4946, 16690, 18944, 16584, 11553, 5513, 41, -4426, -6198, +-5948, -2832, -348, 1831, 2611, 3203, 3065, 3138, 3166, 2944, 2288, 336, -1690, -2721, -1305, 713, +1915, 2240, 2311, 1737, 671, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -44, -57, -62, -71, -85, -95, -99, -98, -88, +-71, -49, -12, 20, 55, 79, 114, 128, 152, 156, 153, 137, 117, 93, 59, 28, +-10, -31, -60, -86, -107, -117, -128, -129, -125, -124, -114, -120, -112, -103, -88, -46, +-20, 32, 68, 93, 131, 158, 187, 204, 211, 186, 158, 112, 59, 21, -16, -41, +-76, -91, -108, -127, -142, -143, -152, -139, -257, -913, -1559, -2048, -2096, -1479, -442, 568, +1438, 1976, 2184, 2032, 1838, 1432, 1150, 870, 960, 1150, 1700, 2052, 2010, 1413, 370, -640, +-1902, -3111, -4250, -5103, -5602, -5457, -4665, -3027, -771, 1578, 3541, 4676, 5051, 4620, 3699, 2548, +1382, 390, -162, -314, -273, -45, 274, 704, 1170, 1679, 1713, 1375, 451, -834, -2378, -3991, +-5473, -6890, -8193, -8374, -6231, -2128, 2386, 6182, 8447, 8883, 7619, 5588, 3280, 1306, -390, -1329, +-1940, -1988, -1574, -1024, -519, -187, 303, 851, 1499, 1718, 1485, 360, -1108, -2872, -4594, -6324, +-7981, -8895, -7430, -3277, 1816, 6229, 8959, 9639, 8557, 6349, 3844, 1466, -238, -1355, -1985, -2240, +-2008, -1630, -1466, -1533, -1521, -606, 643, 2007, 2629, 2508, 1326, -306, -2293, -4334, -6389, -8212, +-9105, -7825, -3312, 1782, 6482, 9280, 10016, 8727, 6317, 3527, 1091, -789, -1842, -2248, -2235, -1777, +-1525, -1237, -1149, -611, 183, 1258, 2150, 2602, 2107, 912, -786, -2645, -4261, -5609, -6882, -8123, +-8760, -6709, -1770, 3992, 8800, 11188, 10923, 8763, 5581, 2291, -435, -2281, -3069, -2863, -2162, -1505, +-989, -724, -269, 183, 1053, 1833, 2390, 2109, 977, -613, -2410, -3970, -5056, -5940, -6997, -8673, +-9313, -6435, -440, 6416, 11320, 13001, 11862, 8717, 4907, 1219, -1552, -2933, -2965, -2330, -1833, -1268, +-1018, -929, -299, 435, 1361, 2236, 2421, 1892, 228, -1675, -3569, -5072, -6467, -8609, -13056, -16352, +-9779, 1485, 11059, 16669, 17231, 14534, 9637, 4820, 405, -2408, -3345, -2849, -2277, -1873, -1174, -645, +-582, -750, -686, -403, 192, 922, 214, -1006, -2654, -4150, -5464, -7269, -9747, -13322, -11898, -4087, +5610, 13434, 16812, 16491, 13140, 8414, 3464, -495, -2929, -3500, -3237, -2933, -2304, -1239, -375, -606, +-1029, -841, -294, 923, 1199, 532, -1048, -3020, -4809, -6339, -8013, -10626, -14205, -11262, -2133, 7793, +15105, 17672, 16614, 12604, 7577, 2382, -1474, -3871, -4548, -4511, -3888, -2647, -1021, 160, 322, 534, +590, 961, 1389, 1049, -45, -2015, -4193, -6292, -8186, -10165, -13174, -14055, -6882, 2997, 12023, 17166, +17762, 15005, 10374, 5237, 381, -3051, -4439, -4577, -4271, -3214, -1567, 12, 721, 985, 1455, 1549, +1359, 820, -446, -2228, -3847, -5999, -7800, -10069, -12382, -13759, -8763, 249, 8854, 15139, 17245, 16116, +11960, 7102, 1927, -1936, -4131, -4310, -3788, -2877, -1516, -306, 307, 1, 201, 657, 894, 696, +-187, -1644, -2928, -4378, -5922, -8141, -10939, -13799, -11656, -2974, 6372, 14034, 17325, 17293, 13773, 8810, +3434, -1203, -4458, -5777, -5355, -4356, -3011, -1498, -20, 798, 1209, 1712, 2169, 2093, 1383, -156, +-2002, -3866, -5723, -7962, -11477, -16126, -15297, -5780, 5239, 13884, 18015, 17947, 14569, 9435, 4263, -327, +-3760, -5468, -5397, -4712, -3389, -1515, 110, 705, 981, 1553, 2230, 2553, 1779, 153, -1665, -3549, +-5197, -7752, -12180, -18406, -16780, -6530, 5344, 14427, 18619, 18734, 15193, 10127, 4887, 360, -3135, -4807, +-4959, -4797, -3895, -2190, -730, -336, 22, 1018, 2262, 2722, 2106, 560, -1403, -3536, -5396, -7596, +-11823, -19892, -18559, -6235, 6212, 16254, 20265, 20190, 15905, 10003, 4147, -437, -3723, -5057, -5329, -5572, +-4793, -2972, -845, 5, 439, 1418, 2523, 2969, 2275, 507, -1550, -3876, -5680, -7660, -11511, -21248, +-21412, -6837, 6749, 18073, 22217, 22020, 17323, 10784, 4223, -1214, -4713, -5927, -5791, -5691, -4737, -2868, +-582, 118, 283, 640, 1910, 2721, 2533, 947, -915, -3468, -5601, -7924, -11005, -19623, -22776, -9015, +5284, 17078, 22243, 22602, 18697, 12338, 5538, -739, -4969, -6596, -6226, -5754, -4487, -2517, -657, -550, +-827, 6, 1422, 2710, 2637, 1475, -490, -2766, -5222, -7163, -9511, -15675, -24535, -14916, 1617, 14598, +22526, 23694, 21479, 15229, 8354, 1204, -4132, -7216, -7439, -7045, -5408, -2914, -375, -80, -965, -1146, +-137, 1707, 2649, 2460, 739, -1491, -3986, -6090, -8583, -13671, -23525, -19843, -2728, 11593, 21408, 23760, +22334, 16967, 10457, 3522, -2497, -6646, -7890, -7865, -6875, -4273, -1038, 796, -35, -811, -515, 829, +2018, 2212, 1241, -728, -2752, -4747, -7060, -11031, -20778, -24334, -9411, 6162, 18438, 23342, 23181, 19111, +12907, 6474, 409, -4080, -6483, -7220, -7365, -5497, -2429, 167, 2, -844, -907, 380, 1670, 1981, +1238, -579, -2339, -4224, -6836, -11577, -22374, -24935, -9347, 6095, 18166, 22914, 23140, 19301, 13174, 7104, +1427, -2642, -5011, -6205, -7446, -6341, -3578, -541, 262, -820, -1099, -398, 652, 1213, 597, -383, +-2125, -3598, -6368, -11404, -21889, -22992, -9211, 5815, 17529, 22352, 22773, 18964, 12744, 6226, 831, -2722, +-4369, -5189, -6322, -6142, -3942, -1282, -297, -704, -277, 811, 1627, 1199, 196, -1049, -2715, -4326, +-6824, -12636, -24211, -22367, -7034, 7754, 18917, 22764, 22669, 18302, 12068, 5247, -170, -3205, -3938, -4433, +-5571, -5512, -3764, -1477, -970, -1039, -413, 1081, 1746, 1106, -398, -1620, -3146, -4586, -6835, -12895, +-26588, -22364, -5369, 9468, 20873, 23856, 23539, 18228, 11645, 4127, -1692, -4833, -5187, -5188, -5285, -4458, +-2386, -590, -603, -1104, -279, 1360, 2197, 1196, -737, -2053, -3731, -4786, -6915, -12608, -28184, -23069, +-4152, 11083, 22682, 24767, 24268, 18319, 11436, 3484, -2461, -5759, -6161, -6101, -5828, -4554, -2146, -192, +-738, -1582, -961, 963, 2352, 1500, -112, -1237, -2716, -3883, -6258, -11382, -27797, -24907, -5539, 9855, +22320, 24578, 24699, 19196, 12435, 4321, -2323, -6494, -7071, -6812, -6643, -4912, -2189, 31, -910, -1731, +-961, 921, 2315, 1790, 443, -743, -1945, -2784, -5009, -8661, -24274, -30929, -9950, 5984, 21555, 25144, +25619, 20995, 13930, 6223, -1186, -5965, -7777, -7011, -7395, -5401, -2715, 521, -217, -1363, -1417, 85, +1442, 1535, 461, -718, -1990, -2371, -4164, -7404, -20986, -30948, -13455, 3156, 19089, 24912, 25677, 22199, +15508, 8408, 636, -4754, -7524, -7501, -8222, -6547, -3637, 122, -185, -1603, -1539, -182, 1524, 1519, +754, -541, -1857, -2439, -3797, -6993, -19729, -31238, -15217, 1712, 17822, 25021, 26023, 23084, 16009, 8719, +720, -4395, -7063, -6809, -7771, -6712, -4123, -342, 81, -1224, -1287, 357, 1550, 1152, -507, -1654, +-2962, -3023, -4095, -6945, -20485, -28692, -12489, 2586, 17722, 23857, 25005, 21777, 15294, 8408, 956, -3644, +-6050, -5749, -6855, -6682, -4379, -748, -220, -1306, -1469, 274, 1247, 502, -1228, -2042, -3212, -3636, +-4542, -8386, -23304, -24999, -8796, 5355, 18301, 22773, 23820, 20200, 14218, 7400, 705, -3563, -5318, -5190, +-5726, -6003, -3961, -451, 10, -1409, -1203, 540, 1636, 103, -2131, -3111, -4140, -4770, -5500, -10762, +-25335, -19970, -4206, 9474, 19272, 22124, 22355, 18031, 12222, 5790, -54, -4381, -5649, -5416, -4948, -4821, +-2784, -248, -325, -1870, -1208, 734, 2149, 167, -2125, -3235, -4175, -5029, -5800, -12233, -27318, -17093, +-1860, 12160, 19870, 21476, 21288, 16727, 10932, 4196, -1026, -5166, -5801, -5488, -4417, -4048, -1959, -196, +-650, -1906, -675, 1501, 2882, 380, -1967, -3676, -4684, -5515, -6115, -11950, -27652, -17588, -1301, 13389, +21418, 21858, 21623, 16789, 10682, 3355, -2093, -6515, -7109, -6444, -4911, -3507, -1021, 952, -1, -1368, +-502, 1616, 2676, 107, -2442, -4268, -5200, -5279, -5674, -9278, -26081, -20244, -1960, 12309, 22203, 22151, +22111, 17127, 11096, 3593, -2378, -7214, -8191, -7277, -5633, -3497, -734, 1511, 275, -1026, -608, 1481, +2718, 224, -2241, -4347, -5141, -5077, -5352, -7957, -24851, -22432, -3144, 11185, 22662, 23065, 22696, 17754, +11369, 3788, -2600, -7514, -8905, -7841, -6540, -4204, -1254, 1869, 975, -679, -400, 1789, 3031, 498, +-2325, -4395, -5140, -4780, -5103, -7321, -23355, -23804, -4645, 9847, 22192, 23904, 23525, 18430, 11651, 3973, +-2725, -7608, -9123, -7963, -7105, -4843, -1539, 2122, 1341, -611, -383, 1748, 3084, 486, -2497, -4409, +-4887, -4570, -5008, -7373, -22536, -23161, -5019, 9262, 21200, 23826, 23724, 18828, 11887, 4147, -2631, -7022, +-8428, -7449, -6990, -5392, -2531, 1273, 1016, -811, -560, 2029, 3682, 1010, -2315, -4368, -4959, -4953, +-5623, -9535, -23542, -20075, -3455, 10526, 20437, 23064, 23096, 18477, 11777, 3928, -2746, -7047, -7924, -7430, +-6528, -5483, -2459, 991, 986, -732, -325, 2217, 3953, 700, -2508, -4686, -4911, -5337, -5902, -11823, +-24941, -16441, -1249, 12586, 20010, 22056, 21863, 17414, 11004, 3201, -2972, -7031, -7344, -6964, -5803, -5079, +-2441, 511, 645, -529, 200, 2720, 4277, 703, -2921, -5072, -5440, -6063, -6801, -14329, -25078, -12896, +1462, 15156, 20482, 21310, 20677, 16206, 10125, 2308, -3571, -7420, -7495, -7003, -5423, -4427, -1815, 569, +316, -415, 522, 2991, 4277, 361, -3360, -5514, -5789, -6283, -6950, -15699, -25228, -10721, 3342, 17107, +21385, 21310, 20001, 15279, 9257, 1636, -4133, -7793, -8003, -7685, -5882, -3985, -1436, 244, -239, -374, +1012, 3526, 4583, 729, -3258, -5885, -6055, -6486, -7144, -16555, -25733, -10059, 4302, 18518, 22487, 21935, +20264, 15267, 9081, 1319, -4747, -8588, -9031, -8575, -6729, -3956, -762, 699, -85, -371, 948, 3513, +4547, 560, -2988, -5895, -5992, -6317, -7007, -15426, -25699, -10902, 4113, 18101, 22904, 22391, 20742, 15285, +8992, 1309, -4878, -8884, -9215, -8661, -7176, -4250, -825, 230, -835, -690, 992, 3977, 5053, 1217, +-2644, -5570, -5727, -6013, -7104, -14989, -25788, -12038, 3367, 17171, 22853, 23079, 21778, 16094, 9618, 1627, +-4759, -9162, -9322, -8760, -7583, -4618, -786, 676, -758, -1050, 565, 3801, 5174, 1314, -2613, -5502, +-5660, -5960, -6984, -14717, -25881, -13164, 2833, 16591, 23038, 23903, 22392, 16400, 9585, 1516, -4762, -9029, +-9015, -8649, -7990, -5234, -1120, 706, -739, -960, 755, 4215, 5623, 1393, -2721, -5791, -5808, -6205, +-7279, -15799, -26042, -12596, 2949, 16266, 22596, 23966, 22309, 16571, 9779, 1882, -4698, -8551, -8068, -7779, +-7357, -5568, -1363, 863, -291, -766, 781, 3923, 5092, 686, -3512, -6223, -6154, -6740, -7685, -17795, +-25467, -10138, 4594, 17476, 22173, 23590, 21598, 16211, 9429, 1743, -4809, -8494, -8003, -7656, -7213, -5508, +-1319, 850, -291, -766, 781, 3923, 5092, 686, -3512, -6223, -6154, -6740, -7685, -17795, -25467, -10138, +4594, 17476, 22173, 23590, 21598, 16211, 9429, 1743, -4809, -8494, -8003, -7656, -7213, -5508, -1319, 850, +-279, -792, 815, 4026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 132, 60, 5, -137, -226, -360, -485, -565, -642, -671, -663, +-632, -541, -430, -289, -125, 40, 207, 357, 472, 582, 636, 658, 640, 575, 490, 383, +258, 147, 45, -32, -81, -99, -66, 6, 100, 231, 361, 478, 617, 737, 839, 927, +985, 1028, 1045, 1044, 1038, 1007, 978, 955, 910, 878, 835, 782, 740, 684, 621, 566, +497, 442, 393, 351, 336, 330, 335, 356, 380, 411, 457, 491, 529, 550, 554, 560, +545, 522, 495, 449, 403, 367, 325, 273, 229, 181, 137, 89, 44, 8, -22, -55, +-73, -80, -84, -84, -84, -68, -52, -37, -12, -3, 3, 6, -12, -20, -52, -88, +-108, -134, -148, -144, -143, -133, -119, -104, -75, -54, -34, -16, -15, -12, -12, -17, +-32, -49, -74, -91, -119, -142, -148, -168, -180, -182, -187, -182, -172, -147, -103, -46, +26, 103, 173, 234, 278, 302, 320, 327, 336, 350, 348, 348, 347, 336, 323, 316, +321, 348, 374, 405, 437, 462, 491, 521, 548, 572, 588, 599, 611, 626, 642, 672, +697, 723, 752, 776, 795, 818, 849, 869, 883, 886, 884, 866, 852, 840, 821, 820, +805, 784, 759, 721, 692, 669, 653, 652, 652, 651, 648, 640, 634, 634, 629, 641, +656, 672, 689, 692, 691, 689, 661, 624, 572, 480, 370, 239, 88, -55, -210, -362, +-510, -670, -811, -955, -1113, -1287, -1494, -1738, -1995, -2275, -2562, -2841, -3114, -3370, -3575, -3718, +-3806, -3832, -3812, -3759, -3662, -3545, -3413, -3259, -3076, -2877, -2626, -2354, -2073, -1773, -1479, -1190, +-919, -685, -488, -342, -228, -139, -80, -35, 8, 42, 89, 156, 244, 351, 451, 561, +667, 762, 844, 918, 972, 1019, 1046, 1075, 1109, 1138, 1166, 1203, 1242, 1288, 1331, 1365, +1397, 1414, 1417, 1424, 1409, 1387, 1354, 1315, 1276, 1242, 1218, 1201, 1201, 1213, 1227, 1242, +1258, 1268, 1282, 1295, 1305, 1327, 1340, 1331, 1307, 1256, 1196, 1130, 1065, 1028, 999, 990, +1001, 1040, 1116, 1222, 1372, 1568, 1789, 2027, 2253, 2448, 2595, 2703, 2780, 2799, 2746, 2631, +2456, 2281, 2139, 2048, 2020, 1989, 1939, 1877, 1766, 1618, 1472, 1321, 1151, 1001, 820, 585, +342, 20, -379, -841, -1431, -2135, -2950, -3898, -4950, -6145, -7481, -8944, -10521, -12072, -13443, -14492, +-15071, -15200, -14854, -14007, -12765, -11093, -9101, -6971, -4797, -2769, -1002, 446, 1576, 2385, 2924, 3232, +3338, 3285, 3132, 2916, 2686, 2463, 2246, 2070, 1930, 1828, 1786, 1773, 1771, 1760, 1732, 1722, +1737, 1772, 1864, 1985, 2117, 2294, 2493, 2702, 2907, 3067, 3181, 3261, 3290, 3294, 3280, 3227, +3158, 3089, 3030, 2992, 2954, 2914, 2857, 2768, 2654, 2521, 2369, 2197, 2017, 1865, 1747, 1676, +1644, 1627, 1610, 1595, 1582, 1608, 1676, 1755, 1849, 1949, 2073, 2217, 2345, 2463, 2562, 2644, +2722, 2814, 2950, 3162, 3466, 3846, 4273, 4693, 5015, 5199, 5261, 5229, 5098, 4868, 4547, 4140, +3656, 3135, 2621, 2117, 1616, 1150, 692, 217, -259, -769, -1322, -1836, -2327, -2790, -3183, -3565, +-3938, -4300, -4733, -5285, -5965, -6787, -7772, -8884, -10123, -11526, -13022, -14611, -16361, -18165, -19949, -21485, +-22311, -22155, -20786, -18207, -14759, -10831, -6831, -3109, 94, 2610, 4427, 5558, 6019, 5935, 5505, 4913, +4324, 3872, 3603, 3535, 3595, 3739, 3925, 4056, 4054, 3907, 3631, 3268, 2910, 2634, 2474, 2474, +2621, 2929, 3363, 3857, 4342, 4787, 5090, 5258, 5305, 5226, 5062, 4828, 4572, 4351, 4175, 4075, +4051, 4041, 4007, 3929, 3793, 3602, 3343, 3038, 2715, 2382, 2086, 1853, 1692, 1596, 1521, 1445, +1389, 1359, 1387, 1474, 1601, 1790, 2020, 2269, 2526, 2759, 2921, 3012, 3045, 3051, 3032, 2998, +2997, 3033, 3164, 3410, 3757, 4152, 4555, 4904, 5146, 5256, 5234, 5085, 4825, 4465, 4027, 3563, +3075, 2568, 2111, 1718, 1430, 1222, 1058, 956, 815, 618, 393, 66, -323, -813, -1484, -2242, +-3138, -4249, -5420, -6667, -8020, -9354, -10690, -11989, -13143, -14201, -15076, -15682, -16057, -16126, -15844, -15291, +-14443, -13396, -12235, -11020, -9853, -8829, -7956, -7248, -6630, -6011, -5265, -4300, -3132, -1852, -555, 692, +1819, 2727, 3381, 3798, 3990, 3991, 3862, 3639, 3379, 3146, 2984, 2954, 3021, 3157, 3326, 3492, +3660, 3815, 3890, 3871, 3781, 3662, 3552, 3487, 3486, 3546, 3633, 3731, 3859, 3993, 4069, 4080, +4010, 3867, 3694, 3518, 3394, 3294, 3210, 3157, 3127, 3125, 3122, 3069, 2975, 2839, 2673, 2490, +2325, 2183, 2067, 1988, 1962, 1989, 2046, 2121, 2188, 2243, 2288, 2351, 2448, 2581, 2737, 2928, +3133, 3358, 3595, 3808, 4004, 4184, 4347, 4501, 4620, 4705, 4747, 4759, 4754, 4763, 4783, 4819, +4856, 4850, 4780, 4657, 4472, 4239, 3935, 3558, 3174, 2797, 2427, 2063, 1692, 1275, 786, 187, +-491, -1298, -2319, -3459, -4691, -6082, -7492, -8861, -10230, -11409, -12450, -13380, -14106, -14728, -15261, -15620, +-15893, -16052, -16061, -15985, -15838, -15597, -15296, -14917, -14369, -13648, -12759, -11602, -10197, -8495, -6483, -4239, +-1874, 448, 2532, 4279, 5565, 6327, 6610, 6488, 6069, 5490, 4850, 4250, 3770, 3432, 3253, 3226, +3277, 3361, 3444, 3482, 3471, 3426, 3333, 3214, 3115, 3056, 3086, 3224, 3433, 3716, 4001, 4264, +4489, 4621, 4667, 4633, 4507, 4347, 4194, 4061, 3990, 3954, 3954, 3997, 4050, 4097, 4114, 4068, +3953, 3767, 3534, 3290, 3060, 2865, 2725, 2634, 2606, 2637, 2706, 2805, 2917, 3021, 3117, 3214, +3316, 3437, 3547, 3628, 3672, 3678, 3665, 3605, 3497, 3361, 3217, 3103, 3064, 3098, 3198, 3333, +3483, 3662, 3867, 4082, 4308, 4482, 4589, 4647, 4640, 4593, 4496, 4318, 4080, 3794, 3449, 3064, +2648, 2170, 1626, 994, 205, -831, -2037, -3328, -4802, -6355, -7885, -9518, -11165, -12759, -14379, -15936, +-17404, -18857, -20127, -21198, -22077, -22586, -22722, -22455, -21785, -20720, -19330, -17655, -15693, -13467, -10977, -8229, +-5323, -2362, 482, 2980, 5063, 6638, 7588, 8003, 7940, 7483, 6830, 6048, 5265, 4589, 4027, 3660, +3506, 3442, 3457, 3515, 3552, 3593, 3614, 3618, 3615, 3583, 3586, 3695, 3870, 4114, 4433, 4756, +5082, 5358, 5590, 5771, 5822, 5761, 5636, 5447, 5260, 5085, 4926, 4812, 4707, 4631, 4602, 4558, +4466, 4308, 4082, 3793, 3457, 3105, 2765, 2453, 2183, 1983, 1867, 1829, 1836, 1869, 1910, 1935, +1960, 1991, 2025, 2086, 2138, 2203, 2284, 2373, 2479, 2584, 2707, 2849, 3009, 3214, 3471, 3782, +4158, 4563, 5001, 5442, 5856, 6227, 6538, 6789, 6972, 7119, 7202, 7187, 7045, 6738, 6294, 5696, +4935, 4036, 2912, 1608, 161, -1514, -3235, -4962, -6866, -8755, -10681, -12794, -14951, -17207, -19613, -21940, +-24213, -26273, -27863, -28951, -29385, -28971, -27766, -25799, -23212, -20156, -16730, -13200, -9682, -6260, -3104, -238, +2252, 4337, 6046, 7296, 8084, 8486, 8520, 8256, 7785, 7144, 6455, 5765, 5111, 4594, 4201, 3934, +3770, 3689, 3692, 3752, 3846, 3961, 4061, 4140, 4215, 4305, 4429, 4599, 4790, 5027, 5265, 5485, +5694, 5839, 5937, 5963, 5914, 5818, 5673, 5491, 5304, 5098, 4903, 4710, 4516, 4344, 4158, 3954, +3750, 3541, 3340, 3127, 2897, 2681, 2463, 2243, 2061, 1902, 1779, 1681, 1600, 1544, 1511, 1503, +1527, 1574, 1642, 1731, 1839, 1964, 2116, 2279, 2444, 2621, 2807, 3009, 3235, 3467, 3697, 3933, +4187, 4482, 4801, 5119, 5423, 5678, 5917, 6114, 6260, 6368, 6392, 6331, 6174, 5898, 5498, 4991, +4295, 3367, 2310, 1021, -511, -2033, -3680, -5489, -7211, -8974, -10764, -12402, -14066, -15716, -17258, -18869, +-20444, -21922, -23368, -24615, -25562, -26123, -26126, -25549, -24317, -22396, -19877, -16860, -13476, -9953, -6474, -3167, +-211, 2303, 4361, 5876, 6905, 7551, 7814, 7821, 7646, 7320, 6940, 6520, 6098, 5716, 5364, 5040, +4781, 4555, 4371, 4229, 4141, 4095, 4085, 4117, 4172, 4261, 4365, 4467, 4607, 4741, 4877, 5013, +5137, 5237, 5295, 5326, 5326, 5282, 5212, 5124, 5024, 4927, 4825, 4737, 4650, 4544, 4433, 4302, +4152, 4000, 3817, 3626, 3411, 3188, 2967, 2744, 2548, 2379, 2237, 2136, 2073, 2030, 2022, 2032, +2053, 2097, 2167, 2235, 2306, 2396, 2469, 2541, 2621, 2681, 2744, 2820, 2899, 3007, 3124, 3232, +3386, 3556, 3765, 4024, 4286, 4567, 4828, 5077, 5295, 5475, 5636, 5713, 5707, 5654, 5502, 5253, +4913, 4407, 3712, 2825, 1671, 297, -1183, -2771, -4476, -6208, -7948, -9664, -11320, -12890, -14337, -15708, +-17037, -18324, -19618, -20942, -22276, -23578, -24694, -25455, -25774, -25499, -24570, -22949, -20595, -17593, -14156, -10457, +-6710, -3148, 64, 2820, 5072, 6758, 7908, 8567, 8804, 8711, 8364, 7870, 7315, 6738, 6195, 5733, +5345, 5037, 4788, 4594, 4443, 4322, 4206, 4124, 4070, 4032, 4036, 4083, 4166, 4271, 4387, 4534, +4694, 4838, 4957, 5035, 5074, 5066, 5010, 4926, 4820, 4681, 4542, 4424, 4329, 4248, 4189, 4126, +4051, 3941, 3809, 3663, 3489, 3278, 3060, 2851, 2655, 2509, 2421, 2392, 2406, 2454, 2509, 2570, +2637, 2677, 2722, 2766, 2791, 2808, 2825, 2851, 2873, 2894, 2905, 2916, 2931, 2957, 2991, 3033, +3077, 3125, 3196, 3288, 3413, 3578, 3755, 3951, 4195, 4434, 4702, 4977, 5219, 5442, 5595, 5663, +5641, 5488, 5170, 4623, 3841, 2815, 1527, 132, -1360, -3003, -4688, -6386, -8078, -9724, -11290, -12737, +-14112, -15430, -16711, -18016, -19361, -20793, -22314, -23801, -25202, -26325, -26971, -26989, -26220, -24548, -21942, -18513, +-14509, -10220, -5896, -1881, 1630, 4555, 6772, 8325, 9254, 9645, 9640, 9332, 8808, 8212, 7601, 7003, +6472, 5997, 5548, 5160, 4811, 4495, 4227, 4009, 3828, 3720, 3676, 3686, 3762, 3867, 3983, 4124, +4279, 4434, 4584, 4698, 4775, 4812, 4816, 4795, 4763, 4712, 4639, 4565, 4518, 4504, 4509, 4533, +4545, 4533, 4494, 4409, 4276, 4103, 3886, 3647, 3413, 3210, 3054, 2955, 2915, 2911, 2939, 2986, +3036, 3070, 3083, 3055, 3014, 2938, 2844, 2749, 2655, 2586, 2526, 2475, 2442, 2436, 2463, 2521, +2605, 2722, 2875, 3059, 3300, 3581, 3918, 4295, 4676, 5077, 5464, 5812, 6119, 6355, 6494, 6552, +6491, 6313, 6018, 5546, 4870, 3967, 2842, 1474, -60, -1654, -3377, -5178, -6961, -8784, -10626, -12422, +-14249, -16109, -18018, -20069, -22235, -24465, -26755, -28858, -30513, -31494, -31531, -30471, -28291, -25100, -21010, -16371, +-11489, -6638, -2169, 1680, 4865, 7284, 8968, 9984, 10396, 10352, 10008, 9435, 8771, 8108, 7459, 6866, +6336, 5859, 5461, 5098, 4753, 4460, 4208, 4015, 3891, 3812, 3803, 3844, 3922, 4051, 4209, 4361, +4509, 4652, 4792, 4880, 4940, 4959, 4926, 4853, 4741, 4615, 4513, 4397, 4301, 4242, 4198, 4175, +4158, 4119, 4067, 3958, 3786, 3581, 3367, 3130, 2900, 2710, 2577, 2504, 2483, 2521, 2587, 2655, +2702, 2723, 2728, 2701, 2648, 2585, 2517, 2442, 2372, 2304, 2253, 2218, 2198, 2207, 2264, 2361, +2487, 2657, 2847, 3067, 3309, 3592, 3941, 4327, 4720, 5105, 5452, 5767, 6014, 6184, 6300, 6314, +6229, 6035, 5693, 5195, 4502, 3569, 2402, 1029, -474, -2053, -3745, -5480, -7165, -8867, -10548, -12126, +-13711, -15321, -16964, -18746, -20633, -22636, -24749, -26793, -28608, -29987, -30633, -30355, -28946, -26312, -22618, -18137, +-13176, -8178, -3450, 764, 4233, 6962, 8902, 10059, 10590, 10614, 10254, 9710, 9058, 8411, 7822, 7286, +6816, 6423, 6063, 5727, 5410, 5093, 4815, 4560, 4356, 4210, 4118, 4093, 4114, 4209, 4318, 4427, +4547, 4661, 4757, 4834, 4870, 4877, 4841, 4758, 4662, 4555, 4447, 4349, 4269, 4210, 4161, 4111, +4051, 3975, 3866, 3707, 3539, 3326, 3077, 2828, 2579, 2366, 2199, 2092, 2059, 2086, 2158, 2261, +2374, 2480, 2557, 2597, 2602, 2584, 2528, 2459, 2396, 2348, 2311, 2296, 2288, 2308, 2347, 2397, +2466, 2555, 2660, 2788, 2943, 3135, 3367, 3634, 3930, 4235, 4530, 4780, 4982, 5142, 5252, 5310, +5349, 5337, 5250, 5101, 4849, 4465, 3905, 3067, 1967, 690, -744, -2294, -3930, -5638, -7326, -9021, +-10700, -12272, -13831, -15416, -17006, -18693, -20505, -22417, -24429, -26397, -28132, -29437, -30025, -29637, -28086, -25294, +-21407, -16722, -11641, -6559, -1806, 2308, 5668, 8242, 10008, 10991, 11316, 11136, 10643, 9950, 9189, 8457, +7786, 7187, 6667, 6211, 5822, 5417, 5011, 4641, 4284, 3990, 3762, 3607, 3547, 3558, 3641, 3798, +3983, 4161, 4320, 4438, 4511, 4553, 4559, 4547, 4521, 4470, 4416, 4370, 4336, 4313, 4277, 4259, +4216, 4138, 4032, 3884, 3692, 3460, 3190, 2899, 2608, 2329, 2093, 1916, 1805, 1784, 1833, 1949, +2102, 2274, 2420, 2545, 2619, 2664, 2663, 2634, 2591, 2543, 2513, 2511, 2524, 2557, 2601, 2643, +2694, 2749, 2810, 2882, 2975, 3086, 3214, 3384, 3592, 3831, 4084, 4320, 4513, 4662, 4753, 4816, +4858, 4872, 4880, 4833, 4720, 4547, 4286, 3930, 3424, 2662, 1642, 411, -996, -2513, -4084, -5769, +-7461, -9102, -10782, -12382, -13860, -15374, -16874, -18427, -20130, -21893, -23765, -25648, -27340, -28697, -29409, -29222, +-27884, -25284, -21557, -16964, -11907, -6803, -1954, 2253, 5686, 8346, 10127, 11104, 11406, 11176, 10626, 9900, +9082, 8328, 7662, 7065, 6552, 6109, 5692, 5282, 4870, 4466, 4123, 3854, 3663, 3584, 3586, 3667, +3813, 3993, 4177, 4337, 4453, 4523, 4555, 4557, 4542, 4518, 4470, 4407, 4011, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 666, +396, 214, 303, 145, 768, 1517, 949, 1615, 496, 523, 1120, 1018, 929, 783, 610, 306, +482, 31, 159, 81, 319, -251, -124, -216, -398, 214, -541, -660, -1241, -1433, -1559, -2514, +-3075, -4319, -3303, -2590, -2858, -1903, -2267, -1845, -254, -381, 81, 922, 855, 991, 1683, 1701, +1771, 2262, 1969, 2149, 2968, 3201, 3139, 3270, 2598, 2586, 3073, 2912, 2134, 2247, 1890, 1275, +1917, 1575, 703, 1218, 340, -386, 317, -543, -621, -331, -922, -1308, -1346, -1496, -1813, -1634, +-1781, -2258, -2373, -2230, -3128, -2746, -3252, -4265, -3854, -4847, -5141, -5436, -5928, -5822, -6014, -6140, +-6255, -5622, -4100, -833, -206, 835, 257, -58, 1623, 2012, 2865, 3229, 3929, 4664, 4937, 4663, +4801, 5039, 5453, 5663, 5576, 5659, 5718, 4842, 4442, 4267, 4205, 4077, 3498, 3069, 3250, 3048, +2629, 2426, 1208, 417, 184, -996, -147, -1104, -1078, -812, -1537, -1452, -2426, -2140, -2857, -2736, +-2605, -2842, -2448, -2913, -3517, -3145, -3330, -3326, -2863, -4089, -4059, -4618, -5479, -5854, -6864, -7079, +-7253, -7775, -7277, -6595, -4828, -2103, 712, 2260, 1401, 127, 517, 1666, 3799, 4870, 4404, 4457, +4992, 4166, 5361, 6512, 6071, 6615, 6270, 6239, 6310, 6600, 4898, 4269, 4523, 3084, 3445, 3355, +2763, 2047, 1926, 1410, 612, 280, -922, -1526, -816, -933, -1125, 34, -520, -1566, -1921, -2830, +-2719, -2611, -2659, -2836, -3017, -2958, -3716, -3066, -2782, -2430, -2205, -2382, -3240, -3715, -4291, -5320, +-5800, -6574, -8287, -8318, -9140, -9255, -7419, -5159, 221, 6761, 7540, 484, -2057, -34, 4199, 9476, +7733, 6913, 8228, 6030, 3596, 6340, 8699, 9071, 7475, 6878, 5895, 6779, 6580, 3542, 2811, 2024, +652, 2526, 2781, 1112, 1184, 528, -958, -1105, -1917, -3497, -2911, -2894, -3004, -718, -862, -2780, +-3545, -4416, -4639, -3582, -2460, -1728, -1379, -2072, -3288, -2453, -1990, -2544, -3198, -2049, -3753, -4330, +-4846, -7239, -8306, -8364, -9485, -10372, -8407, -7838, -3825, 5953, 12754, 3030, -1947, -1829, -179, 11208, +10755, 5589, 8107, 9682, 3604, 6466, 8874, 6941, 7396, 9398, 6102, 6283, 8485, 3253, 2000, 2987, +368, 1498, 4137, 2512, 1528, 1735, -981, -711, 461, -2895, -5098, -4347, -3683, -1410, 310, -897, +-2232, -3915, -6055, -5176, -4031, -3031, -1170, -1565, -2147, -2947, -4420, -3257, -1611, -1146, -1717, -2470, +-4166, -5506, -6674, -8438, -9241, -9037, -9528, -8091, -4925, 508, 11944, 9957, -2100, -649, -1306, 7062, +12492, 5457, 4963, 9909, 7304, 4456, 7322, 6882, 5313, 8408, 7551, 5174, 8275, 5865, 158, 1441, +382, -1151, 2599, 3312, 787, 1428, -42, -2662, -689, -1470, -4609, -4211, -4393, -3681, -947, -218, +-1335, -2439, -4132, -5263, -5011, -4584, -2984, -2298, -3514, -3647, -4864, -4368, -2873, -1700, -465, 969, +-1165, -3578, -4933, -5923, -5227, -6420, -7748, -7184, -6626, -4818, 317, 13918, 15799, -3798, 296, -3117, +8127, 18998, 3246, 2352, 11352, 6679, 3356, 7179, 5418, 7041, 7530, 5043, 3463, 7013, 5725, -1158, +117, -1436, -2440, 2307, 3074, 676, 103, -746, -4101, 81, -1289, -5060, -2956, -5029, -3951, -355, +-793, -1726, -2958, -4578, -5803, -4385, -4382, -3793, -2844, -4296, -4553, -4250, -3353, -3122, -1373, -1052, +-885, -1407, -6276, -6881, -6877, -6553, -6625, -6946, -6249, -2412, 592, 18924, 9307, -7985, 5429, -2147, +18014, 16519, -1066, 3604, 14093, 5500, 5056, 8100, 8283, 7312, 6399, 5354, 1895, 8563, 4429, -3071, +1532, -3332, -1995, 3609, 1624, -3007, 910, -871, -3592, 1151, -5093, -4342, -1514, -5892, -3394, -1092, +-2613, -2241, -1078, -5984, -4964, -3814, -7169, -2921, -2481, -6703, -4527, -4761, -5689, -4251, -3368, -4099, +-2325, -2446, -6963, -7281, -9096, -7659, -5741, -2422, 4075, 13870, 8402, -4896, -697, 3338, 17127, 17992, +3147, 6024, 10090, 9245, 6371, 7632, 9553, 9591, 8307, 6157, 6199, 8619, 3507, -169, 1596, -1268, +-896, 2877, 547, -2052, -3161, -2858, -305, 561, -3778, -8569, -5090, -5707, -4448, -1349, -3676, -3368, +-2855, -3045, -4369, -4043, -3862, -4457, -3087, -4415, -5633, -6638, -6191, -7648, -6542, -3968, -3933, -5610, +-6157, -5672, -5801, -5782, -8412, -6732, -4146, 11691, 28671, -11234, -672, -4808, 6832, 29260, 4441, -432, +14135, 11921, 4581, 9346, 9510, 11805, 7970, 7583, 4835, 9073, 13767, 118, 1093, 1261, -3264, 2597, +4421, -335, -3191, -819, -5625, -154, -356, -8182, -3601, -7849, -8097, -4099, -2872, -2986, -3173, -3341, +-5436, -3478, -5684, -5184, -2102, -4286, -4440, -5430, -6777, -8362, -7105, -7381, -5008, -3191, -7207, -6050, +-5387, -8979, -5387, -6799, -2551, -2341, 23962, 17711, -18299, 9253, -7729, 24273, 22765, -2412, 1643, 18649, +9905, 3126, 10934, 13320, 8729, 6244, 8968, 3243, 11545, 11281, -3936, 3817, 52, -1972, 4034, 4309, +-4499, -3522, 1951, -5451, 1340, -4321, -10392, -3312, -8774, -7147, -3833, -3745, -7068, -3733, -3352, -7879, +-2469, -6595, -6275, -1786, -6536, -5077, -5936, -4969, -10395, -6175, -6074, -5305, -6191, -7463, -4756, -7559, +-4884, -6472, -2970, -1867, 26652, 18817, -20720, 11835, -9421, 27958, 26812, -6065, 3074, 17561, 7000, 5731, +10976, 14194, 10320, 5708, 9257, 3143, 14927, 10104, -4753, 3787, -601, -996, 6181, 4529, -4286, -2028, +-1196, -4035, 3350, -4028, -7438, -4412, -7655, -7262, -4675, -3337, -6967, -7300, -5913, -5864, -6243, -4538, +-5483, -5650, -6355, -5045, -8721, -5410, -7793, -8457, -6990, -5470, -5828, -9600, -4012, -7934, -8155, -3746, +-1986, 542, 19621, 22639, -21619, 12245, -4349, 22432, 26992, -616, 3605, 15640, 9409, 3750, 11291, 13201, +9251, 6907, 8968, 4668, 12821, 8887, 255, 3155, -2134, 280, 4369, 4779, -922, -4038, -839, -3470, +2200, -3385, -8484, -2884, -8287, -6129, -4100, -2981, -6006, -7078, -7445, -6840, -5854, -5576, -5196, -3700, +-7522, -5277, -8551, -6946, -7926, -8651, -6940, -5104, -7164, -9658, -4532, -7785, -7567, -6445, -1378, 6834, +17744, 15550, -17768, 8373, 3726, 20103, 21572, 972, 6833, 15138, 8334, 4378, 13231, 12552, 8782, 6197, +8080, 5511, 12532, 6971, 1009, 3149, -849, 1821, 4413, 3315, -1951, -3596, -1816, -2026, 1623, -4342, +-7339, -5543, -9018, -4615, -5022, -2568, -4086, -7252, -7541, -5489, -8386, -5961, -3458, -5918, -5914, -5901, +-8116, -6990, -7297, -9531, -7196, -4906, -6240, -8435, -5694, -7598, -7474, -6356, 2375, 9622, 18459, 3968, +-14515, 9646, 7944, 21469, 13012, 4497, 9249, 15713, 2530, 6148, 15346, 12074, 6046, 9029, 7885, 3610, +12516, 3277, 1037, 5708, -2534, 2953, 5868, 2402, -2782, -2357, -2848, -3404, 802, -4442, -6440, -5648, +-8647, -6325, -5381, -2400, -5395, -5733, -7283, -6264, -6363, -5343, -4048, -5760, -6825, -6087, -6888, -8049, +-7684, -7989, -6985, -4868, -7037, -7561, -5461, -7334, -6586, -4718, 5286, 14386, 16360, -5672, -6914, 10210, +10886, 18370, 7706, 5613, 14301, 13356, 235, 10411, 15274, 7510, 5969, 9772, 9323, 6570, 8874, 2360, +1110, 3534, -418, 2101, 6473, 1335, -3872, -823, -2552, -3259, -556, -5824, -5158, -6162, -8612, -5089, +-4495, -3845, -4718, -6730, -7839, -6390, -7907, -3756, -3142, -6560, -5635, -6955, -8527, -7803, -8833, -8652, +-5531, -5348, -8337, -5018, -6070, -8804, -5167, -2049, 9164, 16512, 11717, -10765, 839, 10494, 13130, 16144, +4006, 6203, 15423, 9981, 1176, 13528, 13697, 6381, 6509, 8668, 8336, 7153, 7724, 2153, 2481, 2765, +-605, 2664, 4613, -590, -2515, -415, -3167, -2272, -2491, -6008, -3185, -8046, -6891, -5240, -4465, -3152, +-5451, -6456, -7485, -7959, -7481, -3367, -4235, -5855, -6441, -7633, -7512, -8842, -9822, -9261, -6285, -6624, +-9689, -5203, -7148, -6991, -2437, 3789, 15047, 12473, -349, -8042, 12042, 14358, 10729, 9763, 4105, 11776, +14752, 1260, 7112, 17496, 7963, 4709, 9675, 8307, 8393, 6933, 1605, 2505, 4457, 1430, 2141, 4366, +-173, -2039, -918, -1188, -3054, -2207, -4485, -5185, -2934, -8424, -6258, -4233, -5033, -4140, -5003, -7221, +-6844, -7957, -6507, -3664, -5400, -6794, -6215, -7585, -8237, -8432, -10182, -9546, -5630, -8169, -8640, -4896, +-7719, -4520, 3375, 13002, 10648, 5669, -6088, 863, 22009, 10212, 7861, 8843, 6840, 13601, 10070, 939, +14008, 14496, 4993, 6868, 10181, 8432, 6353, 4909, 857, 3151, 4817, 1113, 4065, 3250, -2503, -1843, +107, -2022, -4565, -2993, -6236, -3384, -2682, -9156, -5867, -5055, -5605, -3777, -4368, -7550, -7619, -7239, +-6674, -3933, -6188, -6899, -7523, -8644, -7586, -9149, -9567, -7942, -6674, -8142, -7035, -5734, -6443, -627, +13977, 12947, 1343, 2982, -7449, 17017, 20592, 1454, 9605, 10247, 8819, 13142, 5326, 5871, 15687, 7866, +5596, 9032, 11666, 6449, 3577, 4501, -216, 4487, 4569, 2296, 3912, 465, -3658, -589, 912, -4936, +-4791, -5455, -6729, -1898, -4588, -7741, -5171, -5833, -6878, -2724, -5737, -8557, -5762, -7219, -5819, -4237, +-8155, -7905, -7609, -9360, -8382, -7916, -9018, -7805, -5791, -7337, -6189, -4362, -4866, 8624, 17319, 2431, +4395, -5042, 6244, 24108, 6322, 5328, 11918, 7664, 11960, 9409, 3854, 13572, 10965, 4457, 7216, 10777, +8288, 2700, 6023, 1947, 1575, 5762, 1626, 3156, 3334, -3274, -3168, 2840, -3240, -5240, -3889, -9185, +-3780, -2986, -6112, -5412, -5000, -7930, -5223, -2354, -8307, -6661, -6359, -7628, -4313, -5988, -8260, -7382, +-9082, -10645, -7771, -7539, -8925, -7300, -6417, -7209, -3748, -3080, 2388, 18123, 5292, 3438, -1829, -102, +22035, 12138, 2784, 10995, 8181, 8657, 11854, 3366, 10846, 13303, 5330, 5026, 10616, 10048, 2367, 4787, +3696, 248, 5795, 4083, 1718, 4823, -416, -5850, 1711, -271, -6005, -2633, -7134, -7271, -2395, -4269, +-6030, -3374, -7341, -7841, -3163, -5504, -7217, -5071, -7290, -6030, -5116, -8284, -7923, -6956, -10129, -8752, +-7457, -8838, -7797, -6191, -6892, -6502, -2239, 392, 16644, 9992, 2397, 354, -2546, 20448, 14120, 3427, +8899, 10406, 7037, 12206, 3255, 9119, 14369, 5390, 3815, 9769, 11610, 3899, 3582, 4731, -547, 4689, +5068, 1014, 4110, 2164, -5258, -20, 1493, -6734, -2780, -4932, -8476, -3760, -3429, -6353, -3033, -4186, +-9757, -4004, -4956, -7849, -4829, -5616, -7045, -5121, -6855, -9229, -7035, -9307, -10512, -7893, -8003, -8401, +-5794, -7142, -6715, -2753, 881, 16063, 11282, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 16, 100, 928, 1201, 967, 1063, 546, 2148, +2073, 1911, 1370, 951, 1407, 1728, 1625, 1088, 1060, 481, -348, -1281, -3104, -4239, -4669, -4923, +-3377, -3017, -1518, -1834, -1264, -307, -195, 1845, 1038, 2231, 2797, 2046, 2093, 1877, 1951, 2727, +2534, 2250, 2359, 1166, 195, -660, -2611, -4451, -5372, -6734, -6391, -5450, -4175, -2347, -669, 1, +-168, 268, -75, 1874, 3681, 3406, 3197, 1930, 1557, 2682, 2863, 3127, 3534, 2332, 2403, 1074, +-223, -1766, -3516, -4579, -5615, -6336, -6133, -4932, -3715, -1976, -239, 230, 1087, 413, 570, 2488, +3333, 5236, 4664, 2184, 1942, 2720, 3651, 4693, 4135, 2890, 3059, 1475, -12, -216, -2290, -2967, +-3642, -4407, -5222, -5452, -6168, -4577, -3237, -977, 1411, 793, -175, -640, 876, 2998, 3658, 3278, +1693, 1494, 2093, 4102, 5032, 3418, 3095, 2228, 1789, 1504, 280, -569, -2319, -3458, -3701, -4155, +-5595, -6981, -7103, -5276, -3201, 1123, 3021, -511, -2165, -2251, 3004, 7296, 4266, 3084, 3130, 3772, +5387, 5284, 4339, 3547, 3720, 2030, 1780, 772, -921, -2102, -4153, -3930, -3508, -6061, -8256, -10215, +-8503, -6260, -3599, -563, 4868, 2524, -2935, -313, 4933, 9744, 7423, 1199, 4673, 8281, 5252, 4603, +4056, 3011, 3723, 1398, -362, 1801, -112, -2614, -3070, -4471, -4565, -6106, -9676, -11441, -9289, -7362, +-2897, 3453, 12576, -6114, -4916, -1834, 8156, 17252, 1271, -448, 8091, 3595, 4150, 4977, 2381, 2895, +4334, -965, 297, 4502, -2983, -1663, -3752, -6128, -1630, -6488, -11553, -9344, -8141, -4358, 8780, 11303, +-8763, -5993, -4880, 10975, 18244, 71, -12, 5931, 1538, 5100, 5189, 2950, 2492, 3811, -701, 607, +2294, -2518, -1107, -4689, -3700, -1671, -4601, -10958, -10109, -9049, -5265, -16, 8688, 4385, -11193, -3855, +204, 17144, 9210, -2495, 1634, 7088, 3207, 5832, 5022, 1956, 3231, 2890, -1824, 2604, 1232, -3686, +-264, -5022, -2613, -201, -8330, -11463, -8624, -8792, -4088, 840, 20695, -9627, -8154, -6644, 5347, 23687, +-2066, -3215, 9934, 2923, 1789, 5271, 4024, 396, 5078, -254, -1348, 6268, -6915, -660, -1067, -7108, +1848, -1360, -13224, -7544, -10162, -5745, -1106, 9430, 19983, -24940, 12, -12323, 23719, 15834, -8470, 1136, +11550, -2534, 3027, 7968, 2998, 648, 8309, -6477, 4050, 3340, -9494, 5281, -6215, -3759, 3860, -7582, +-14880, -3812, -13940, 855, -8194, 22563, 2458, -23578, 316, -9339, 32752, 3181, -9778, 8126, 8906, -2673, +6838, 10663, -744, 4718, 5284, -8787, 12025, -2862, -6314, 5634, -9812, -1955, 3331, -15113, -9497, -6348, +-13793, -2629, 12046, 15001, -23998, -1365, -17868, 27994, 14795, -9749, 5672, 8602, -1010, 6040, 6673, 7349, +-800, 7645, -3998, 4814, 2794, -9376, 2492, -6129, -5037, 1710, -5731, -17207, -3787, -15396, -2827, 2105, +25081, -16357, -7192, -13135, 8262, 28976, -6152, -50, 10463, 585, 3544, 5631, 9889, 1954, 4901, 777, +-800, 6598, -8522, 180, -3132, -6727, 900, -2305, -15358, -9373, -9938, -6303, -3995, 19444, 4671, -20667, +-1849, -14011, 31714, 4106, -6017, 9398, 4931, -820, 5066, 9658, 5508, 3274, 5291, -4553, 8038, -2851, +-6440, 4443, -11419, -585, 1232, -11392, -13322, -6261, -11319, -1588, 4795, 21143, -21865, -826, -17671, 19057, +16058, -4994, 3340, 9382, -1675, 4426, 6268, 11589, -852, 8266, -1758, 1285, 5415, -10236, 3463, -7026, +-7728, 2866, -4665, -16831, -6948, -13222, -1892, -3274, 19359, -1055, -14422, -4146, -4821, 27003, 30, -989, +9028, 3665, 1436, 4056, 12000, 3308, 2158, 6802, -5229, 7331, -4044, -3997, 966, -10428, -1325, 869, +-13080, -12551, -8222, -10626, -642, 4220, 21717, -21888, 835, -14514, 19402, 12750, -2941, 3093, 10706, -1467, +2853, 7451, 9818, -3522, 10065, -2805, 1451, 5459, -10437, 3295, -7572, -6231, 1266, -4757, -17708, -7153, +-11322, -3929, 3066, 22048, -15766, -2282, -10750, 7851, 21262, -4277, 2920, 12102, -2678, 3878, 4424, 10647, +-274, 4840, 2197, -723, 5493, -8954, 837, -4393, -8302, -347, -2160, -14887, -10251, -11452, -5954, -325, +17827, -1944, -11787, -835, -5126, 24320, -1761, 599, 12117, 1555, 817, 5491, 7107, 4911, 500, 4938, +-1028, 5151, -4688, -4277, 316, -11005, -1582, -564, -12149, -10844, -11116, -7470, 142, 12338, 4253, -13307, +2194, -7200, 20450, 1063, -1049, 12434, 5463, -3445, 8418, 3408, 6588, 917, 2574, 1670, 4228, -3471, +-6458, 953, -9745, -5803, 1041, -10262, -10850, -8843, -10507, 1610, 8801, 5880, -11902, 3410, -6324, 16450, +4443, -4250, 12119, 8791, -4728, 6725, 6113, 4132, 3385, 1427, 753, 6203, -2689, -7354, 1225, -6860, +-7979, -362, -5707, -13482, -5945, -12330, -1135, 5079, 9889, -11198, 965, -3337, 6933, 13305, -8135, 8016, +13038, -1734, 1973, 7836, 4035, 3835, 1285, 149, 4882, 2621, -8421, -711, -3307, -9022, -1615, -3542, +-12944, -7012, -9682, -4690, 4116, 11116, -10173, -3187, 1072, 1699, 17356, -7785, 3913, 15294, 490, -666, +7710, 5682, 3704, 852, 1091, 2936, 4432, -7007, -3851, -26, -9254, -3272, -2757, -11383, -9003, -7902, +-6560, 2541, 9584, -3672, -10704, 5168, -1000, 17439, -2485, -1679, 13906, 6142, -2584, 6962, 7189, 3047, +1116, 1431, 1520, 4645, -4185, -6940, 1939, -8499, -5649, -2129, -10005, -10241, -5759, -7371, 1123, 9834, +-1898, -12587, 5379, -1445, 16608, 924, -5436, 13066, 8480, -3568, 6811, 7019, 3512, 205, 1281, 825, +5192, -3216, -7792, 776, -5452, -7466, -2671, -8348, -11096, -4845, -6089, -1138, 9614, 588, -15430, 5771, +-1060, 14533, 4753, -7486, 11477, 9974, -3535, 5175, 7376, 5228, -246, 1829, 381, 4620, -1689, -7609, +-778, -3537, -8135, -3641, -7447, -11403, -5949, -5086, -191, 4660, 5466, -15691, 2542, 2841, 9380, 8236, +-6143, 6697, 12722, -2377, 2047, 8103, 6903, 133, 881, 1132, 2681, 1174, -7754, -3040, -928, -9404, +-3898, -6904, -12070, -6048, -4175, 152, 5093, 3935, -13541, 185, 4053, 8553, 7591, -4623, 5258, 12933, +-1891, 1241, 8357, 6853, 665, 762, 1077, 2774, 1082, -7772, -3040, -928, -9404, -3898, -6904, -12070, +-6048, -4175, 152, 5093, 3935, -13541, 185, 4053, 8553, 7591, -4623, 5258, 12933, -1891, 1241, 8357, +6853, 665, 762, 1077, 2774, 1082, -7772, -2954, -958, -9274, -4316, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1657, 737, -378, 1087, +445, 107, 26, -22, 795, 570, -281, -161, 981, 1275, -240, -461, 707, 307, 322, 1216, +529, -51, 845, 1746, 890, 141, 762, 1101, 98, 76, 2187, 1591, -704, -110, 1147, 1735, +-199, -233, 1452, 378, 451, 856, 537, 378, 3, 605, 1053, 391, 651, 1524, 675, -638, +50, 729, 480, 1000, 1177, 236, -749, -189, 1297, 1505, -246, -1041, 105, 464, 402, 829, +1075, 342, -613, -380, 1166, 2418, 269, -730, 1644, 1733, 637, 1040, 1312, 1057, 521, 670, +750, 143, 574, 1034, -259, -969, 784, 1431, -731, -1491, 477, 1362, 743, -383, -829, -32, +1472, 1517, -606, -450, 877, 854, 616, -3, -218, 782, 1167, 637, 470, 344, 543, 425, +-134, -228, 126, 702, 1306, 866, -975, -686, 1444, 936, 387, 1082, 628, 690, 986, 499, +730, 1609, 893, -626, 19, 666, -263, 49, 956, -299, -972, -184, -199, -79, 34, -264, +-211, -237, -165, 112, 296, 241, 279, 554, 75, -44, 1161, 1983, 1121, -389, 360, 2432, +1928, -162, -514, 506, 1666, 1071, -929, -640, -5, 104, 193, -1269, -298, 1366, 857, 193, +-353, 180, 838, 807, 914, 618, 214, -341, -694, 268, 1059, 203, -482, -203, -367, -557, +-72, 1, 46, 301, -388, -782, -2, 378, 110, 195, 301, 103, 386, 1029, 1305, 1373, +1256, 1092, 1396, 1445, 913, 952, 1175, 477, -400, -737, -511, -75, -170, -1123, -1624, -562, +104, -324, -294, 153, 188, -31, 139, 389, 633, 532, -410, -466, 427, 663, 379, 503, +1198, 848, -387, 132, 1493, 801, -212, 245, 261, -471, -927, -601, 255, 148, -502, -503, +-4, 1250, 1813, 946, 1346, 2277, 1830, 1122, 945, 822, 340, 179, -139, -1126, -1775, -1690, +-1199, -644, -903, -1472, -773, 561, 460, -643, -876, -3, 1053, 355, -943, -418, 1198, 1603, +-199, -327, 2029, 2849, 1632, 776, 1343, 2230, 2173, 1201, -103, -497, -553, -1679, -1682, -851, +-1302, -1624, -1123, -795, -122, 910, 1222, 1357, 1853, 1911, 1262, 728, 854, 481, -373, -942, +-1161, -976, -1038, -1210, -1009, -364, 184, 245, 306, 44, -187, 262, 207, -555, -969, -1037, +-735, -263, -393, 142, 1962, 2564, 1867, 2324, 3384, 3513, 2787, 2268, 1514, 429, -198, -1387, +-2683, -3186, -3028, -2736, -2910, -3002, -2185, -720, 642, 1208, 1028, 1131, 1197, 642, 697, 1584, +782, -1080, -904, 230, -122, -718, 306, 905, 606, 1233, 1736, 1630, 1314, 684, -57, -1075, +-2388, -2929, -2215, -1966, -2009, -1229, -427, -13, 1425, 3080, 3477, 3566, 3516, 3359, 2956, 2029, +802, -681, -2026, -3010, -3865, -3793, -3193, -3442, -3421, -2499, -1362, 129, 1091, 1106, 1465, 1181, +-141, -525, -902, -1113, 97, 460, 50, 952, 2075, 2324, 2348, 2462, 2547, 2767, 2881, 2222, +997, -317, -1816, -3121, -4925, -5031, -3112, -3899, -4182, -1682, -784, -773, 1641, 4199, 2910, 2787, +4242, 2356, 1456, 1339, -340, -1443, -1657, -1709, -2280, -2452, -1736, -1348, -964, -121, 912, 948, +214, 597, 308, -1726, -3397, -3377, -1828, -1046, -152, 1561, 1843, 2425, 3966, 4007, 3568, 3686, +3724, 4109, 3487, 661, -562, -1563, -4394, -5901, -4793, -4347, -5959, -6081, -4076, -2620, -833, 1418, +2075, 2890, 3105, 1546, 1520, 1774, -492, -1327, 1369, 1776, 209, 1483, 2259, 1499, 1569, 1598, +1419, 1798, 1648, 373, -1645, -3049, -4020, -4413, -4498, -4782, -3224, -1547, -2046, -199, 3124, 3314, +3072, 3689, 4666, 5350, 4625, 3478, 1780, -462, -2582, -3726, -3091, -3083, -4082, -4875, -5423, -3929, +-1011, 186, 263, 657, 19, -356, -527, -1918, -2565, -1019, 813, 1615, 2789, 3968, 4916, 4820, +3572, 2891, 2746, 3567, 4230, 2784, 253, -2184, -3161, -4698, -7043, -7026, -5786, -5588, -6257, -5143, +-2413, -804, 850, 3237, 3917, 4009, 3961, 3181, 3008, 1389, 97, 828, 1107, 469, 970, 891, +-899, -700, 486, 218, 543, -175, -3179, -3322, -3548, -6514, -5653, -3412, -3589, -1710, 630, 530, +2536, 5982, 5170, 3245, 4505, 5487, 5274, 5736, 5055, 1047, -1684, -2613, -4526, -4840, -5094, -6194, +-7176, -8333, -6858, -2966, -315, 639, 334, -617, 52, 621, -743, -1067, 1350, 3668, 4339, 5042, +6360, 6739, 5024, 3557, 2739, 2435, 3274, 2803, 374, -3160, -5632, -6711, -7253, -6827, -6626, -6952, +-6951, -5432, -2720, -679, 955, 3209, 4716, 5540, 6042, 5543, 5862, 5835, 3351, 599, -37, 305, +53, -1002, -2711, -3405, -2327, -961, -773, -2697, -5038, -5184, -5054, -6299, -5687, -3782, -2874, -1789, +919, 3892, 6151, 7272, 7330, 7153, 5900, 4912, 5615, 6349, 4897, 2770, 110, -3159, -6034, -6486, +-5953, -8143, -9603, -9382, -8954, -7471, -4694, -869, 888, 112, 270, 1098, 1592, 2563, 4222, 6166, +7053, 7455, 7807, 7190, 6038, 4933, 3441, 2882, 1742, -437, -1243, -6326, -9135, -7824, -9992, -9782, +-7872, -8513, -7742, -4104, -1419, -161, 2805, 5757, 7190, 7586, 6899, 7749, 8706, 7840, 5914, 3449, +1325, -583, -1763, -2779, -4314, -5890, -6634, -5867, -4513, -5508, -8464, -7196, -4962, -6749, -6460, -3781, +-2434, -66, 5404, 9308, 8273, 9498, 11246, 9142, 8177, 7557, 6092, 5462, 4972, 2567, -1844, -5799, +-7267, -8931, -11194, -11358, -11545, -11754, -10868, -8925, -6144, -3403, -350, 867, 1353, 3212, 5247, 7798, +9217, 9580, 10443, 10189, 8656, 7268, 6290, 4589, 3029, 2198, 600, -3351, -9507, -13567, -12761, -11646, +-12820, -11972, -9564, -8308, -7065, -4877, 511, 5452, 6977, 9683, 10936, 10667, 11079, 10757, 9887, 8784, +6927, 4068, 783, -1793, -2734, -5086, -8477, -9363, -9935, -11545, -11701, -10346, -9476, -8686, -6932, -5611, +-5347, -4279, -528, 7371, 13820, 13074, 12469, 14042, 13407, 11892, 10604, 8959, 6921, 6139, 5033, -1240, +-7952, -10269, -11796, -14496, -16262, -15154, -13852, -13110, -11059, -7926, -4703, -2461, 179, 2394, 4398, 8969, +13209, 13937, 14036, 14269, 12274, 9546, 8202, 7068, 5065, 3184, 1602, -367, -5346, -13814, -18512, -16186, +-14935, -15759, -13526, -10907, -8954, -6701, -4383, -1190, 5544, 11554, 11764, 13508, 16335, 15196, 14055, 13082, +10328, 7310, 5181, 3170, -297, -3321, -6106, -9843, -12450, -15354, -18035, -17573, -15613, -12192, -9244, -8400, +-7435, -5496, -3176, 853, 10615, 16754, 15348, 16760, 17946, 16191, 14915, 13497, 10777, 8320, 6474, 2940, +117, -5165, -14062, -17438, -17454, -19574, -19144, -16327, -14064, -10899, -8129, -6358, -3612, -260, 2882, 6176, +11828, 17991, 18280, 17167, 17941, 14751, 10837, 8802, 6257, 4631, 3394, 1276, -2241, -9469, -18651, -22103, +-19104, -18480, -18730, -15404, -11918, -9811, -7763, -4621, 589, 6765, 10996, 14658, 18438, 19106, 18596, 18773, +16604, 12733, 9066, 5698, 3661, 1837, -1533, -7306, -12106, -16535, -21995, -23058, -20045, -17392, -14975, -11009, +-8053, -7779, -6333, -3770, 2492, 11959, 16557, 17989, 20081, 21001, 18980, 17161, 15242, 11644, 8116, 5416, +3612, -993, -7230, -14711, -20032, -20859, -21805, -21445, -19581, -16097, -11548, -8410, -6991, -5163, -1612, 4021, +9865, 15580, 20902, 21636, 20495, 20262, 16895, 12621, 10236, 7184, 4221, 2990, 1635, -4370, -14957, -21890, +-23305, -21323, -22089, -20796, -16540, -13533, -10419, -8309, -5363, -1641, 5393, 13471, 16003, 19928, 22862, 22176, +21938, 18811, 14560, 10659, 6638, 3613, 1726, -738, -5488, -12850, -21989, -25926, -22725, -21672, -21595, -16607, +-11969, -9871, -8152, -6585, -3806, 3397, 13531, 18467, 20046, 22651, 22889, 21007, 18677, 15675, 12367, 8362, +3930, 1746, 244, -6659, -15774, -23121, -24159, -22195, -23840, -23100, -17455, -12676, -10023, -7697, -5513, -1358, +4238, 11858, 18533, 22460, 24205, 23325, 21916, 18789, 14676, 11383, 8072, 5153, 2472, 841, -4327, -15675, +-25555, -26008, -21162, -23991, -24158, -17860, -14396, -11396, -8355, -6069, -1663, 5815, 12463, 17824, 23320, 24496, +24063, 23949, 20316, 15599, 11243, 7097, 4286, 1747, -1519, -5191, -11841, -25150, -29254, -21562, -23401, -24713, +-17216, -12926, -10208, -8055, -6917, -3296, 4307, 15129, 19666, 20893, 24632, 24724, 22408, 19990, 16942, 13044, +8453, 4320, 2505, 432, -7294, -16396, -22431, -25856, -25105, -25093, -24379, -18905, -13540, -10437, -8023, -5626, +-2379, 4190, 13299, 20319, 22941, 24854, 25664, 23104, 19906, 16543, 12468, 9169, 5049, 1927, 957, -5813, +-16825, -24713, -25857, -24184, -25111, -24136, -19876, -15197, -11903, -9577, -6236, -2065, 4081, 13134, 21324, 23853, +24589, 27018, 25580, 20783, 17048, 13011, 8461, 4441, 1680, 633, -4798, -15525, -25346, -28520, -24849, -25246, +-25541, -19110, -14314, -11216, -8166, -6872, -2336, 4834, 12368, 20795, 24112, 23611, 25608, 25798, 21581, 17559, +13741, 9158, 5189, 3271, -334, -6322, -14572, -26045, -28075, -23870, -26563, -26379, -19865, -15089, -11731, -7637, +-5905, -3096, 5046, 13175, 20685, 26130, 25754, 25985, 26013, 21546, 16927, 13351, 9747, 4747, 2864, 1727, +-7578, -16175, -25394, -28391, -23184, -25990, -26137, -20174, -15450, -11969, -8982, -6154, -3476, 2895, 13212, 21498, +24854, 25503, 27498, 26817, 22183, 18113, 13728, 9288, 5467, 2772, 419, -5107, -15700, -27259, -28995, -24858, +-27254, -24605, -20478, -16620, -11153, -8582, -6701, -3567, 3206, 13054, 21542, 25038, 25133, 27578, 27144, 21979, +17944, 13889, 9367, 5360, 2775, 426, -5130, -15416, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -362, -340, -354, -207, 331, -224, 152, +113, -32, 124, 279, 291, 537, 322, 531, 36, 379, 342, 801, 143, 354, 11, 364, +399, 388, 400, 890, -80, 861, 146, 226, 192, -427, -573, -265, -57, -439, 241, 253, +27, -26, -297, 138, -75, -76, 502, 151, -176, 65, -40, -248, -481, -302, -322, -482, +-263, -355, -535, -85, -674, -354, -3, -264, 313, 149, -420, -328, -168, -83, -61, 80, +-230, -3, 168, -39, 745, 186, -39, 554, 114, 871, 325, 1443, 976, 512, 366, 355, +545, -376, 62, 462, 243, -309, 36, 81, 331, -587, 171, -748, -160, -846, -1122, -202, +244, -406, 584, 454, 502, 1068, 876, 763, 15, -975, -379, 1194, 870, 308, -199, -1252, +-289, 137, -1397, -922, 666, -1791, 682, 572, -720, -260, 45, -597, -304, -449, -782, -217, +-165, 986, 211, 185, 937, 341, 1092, 448, -1693, 433, -16, 35, 495, -603, 263, 2211, +-1923, -202, 1150, -1126, -20, -265, -377, 1, 636, 1340, -818, -1331, -754, 5, 759, 626, +840, 17, 1300, 680, -112, 588, -2178, -28, 137, -1000, 1490, 936, 2454, 1251, 999, 1293, +-1431, -1577, 1336, -1370, 350, 370, 10, 614, 182, -496, -919, -1742, 1138, 59, -2824, 2943, +1273, -1941, 22, 118, 584, 2561, 859, -1151, -1576, -1669, -191, 2464, 88, 2202, 573, -2929, +-772, -699, 236, 495, -1052, -3952, 1631, 263, -66, 1087, 2718, -1044, -1275, -1402, -2536, -2090, +-598, -100, 1096, 1926, 1004, -483, 821, 855, -831, 2570, 79, 931, 866, -1907, 234, -1830, +2024, 2871, -409, -748, 793, -3317, 182, 2518, 681, -556, 336, -2067, -2199, -503, -3337, 3517, +-1046, 1224, 2099, 2033, 2081, 3173, -491, 4809, -3135, -3864, -1199, -2596, 842, -2140, -704, 54, +-2052, -71, 1135, 350, 2051, -1225, -2642, 1960, -175, 3135, 2561, 572, 6128, 287, 1790, 3510, +-7219, -2032, -3704, 1574, 754, -6921, -5101, -6826, -2841, 4686, 1789, 7587, 8038, 1207, -884, 3148, +468, -486, -4195, -5471, -4424, -9058, -5586, -424, 1959, 9274, -684, 2410, 8910, 1286, 2119, -1155, +-2476, 1052, -4153, -532, 4234, 3781, 6237, 1807, -7429, 5112, -5112, -7039, -3575, -5299, -13208, 879, +6134, 3753, 6409, 2243, 3203, 9807, 6055, 1487, 1421, -6625, -9284, -2139, -5428, 4235, 3439, -3797, +-5814, 2678, 4742, 3879, 3833, 575, 3823, -457, -1241, 6281, 1116, -3230, -1351, -7810, -4432, 325, +-7306, 2042, 5121, -2359, 1756, 5265, -7662, -1718, -217, -7952, 6295, 5498, 6963, 19283, 2951, -1257, +2872, -526, -3278, -2697, -9979, -10999, -12403, -6070, -1746, 4230, 2803, 5387, 1029, -653, 4950, 7827, +-1806, 1974, -211, -627, -1107, 3467, 3510, -4194, 3547, -1674, -6026, -6555, -4088, 3520, 3686, 4791, +1361, 1751, -413, -6201, -3114, 8096, 3530, 3300, 6535, -7069, -2397, -2285, -5842, -7134, -6171, -2279, +-2285, -7545, 1617, 4244, 9523, 14737, 8745, 7122, 6714, -2373, -1441, 4664, 980, -8606, -2829, -2391, +-8523, -3215, -3891, -3495, -695, -367, -2464, 8312, -5406, -607, 7705, -78, -1610, 1555, -2071, -839, +1258, -294, 9080, -2478, 5672, -768, -5460, -146, -3285, -4315, -3322, 2989, 2964, 13025, 6453, 14601, +311, -7718, -3768, -9600, -8975, -9949, -9092, -5441, -3942, -3309, 627, 910, 3547, 9926, 11499, 9063, +7747, 2909, 3229, -889, 2789, -1500, -5187, 1779, -3401, -6893, -5897, -5265, 948, 3647, 3599, 3709, +619, -4409, -8324, -4104, -4114, 4523, -167, 5320, 9621, 3109, 2444, -1353, -2517, 757, -640, -11519, +-8195, -9499, -5799, 2904, 10336, 12647, 12779, 11114, 7044, 4510, 2386, 2610, -4112, -9590, -8964, -7298, +-8892, -7607, -1947, -2474, -1180, 7418, -153, -6349, -1650, 3817, 5160, 3564, 2576, 2818, -297, -3953, +3389, 10970, 6336, -535, -3370, -9175, -3655, -2493, -864, 4994, 995, -220, -981, -817, 3842, 14781, +3067, 5335, 1886, -7507, -10095, -7311, -12468, -5740, -11111, -5513, -2643, -9863, 874, 7398, 10073, 12466, +14582, 8098, 9954, 2597, 206, 7846, 6635, -3156, -1147, -5896, -10981, -6263, -6972, -4708, 3380, -2053, +-4238, -4749, -4777, 907, 5207, 4211, 4916, 3736, 2071, -1363, -3479, -3362, 380, -1485, -3473, -8530, +-10396, -7772, -2590, 2179, 14145, 8741, 13415, 24564, 12614, 13851, 7417, -2606, -6861, -9873, -8925, -10709, +-14148, -7108, -9042, -7107, -5493, -5392, -1751, 704, 2885, -4964, 11620, 5054, 4233, 5760, 2532, 9456, +10587, 4272, 2068, -6462, -7415, -11005, -7699, -5958, -3723, -230, 4538, 2582, 1203, 4899, 4960, 26046, +23512, -2407, -451, -4908, -9885, -9958, -9691, -13452, -13968, -16278, -13520, -8149, -3220, 2783, 12992, 10914, +22504, 16874, 13104, 16504, 566, 2862, -1684, -3954, -6767, -6783, -6467, -7344, -6047, -5549, -6433, -8753, +-4131, -5165, 656, 2881, 8418, 14095, 8850, 9118, 3621, -4450, 2354, 4785, -5888, -4416, -14017, -13180, +-15023, -11218, -167, 6111, 616, 11101, 13757, 19126, 29148, 20765, 11486, 306, -8882, -7786, -11940, -14736, +-13808, -9807, -9338, -10413, -5275, -4797, -5203, 1433, 1392, 2013, 4736, 7058, 11272, 13876, 9058, 6265, +5611, 1651, -3487, -10374, -7235, -9497, -9986, -2814, -5454, -869, -7902, 3001, 4063, 11136, 19317, 25490, +6223, 8649, 7102, -6608, -7274, -9778, -14203, -13866, -17490, -16320, -13799, -9517, -4021, 2717, 3992, 5354, +18867, 14143, 14056, 21826, 5427, 9862, 2635, -2386, -1421, -1275, -3574, -7137, -6555, -10096, -13098, -9010, +-6625, -5777, -3566, 6502, 7703, 5292, 11830, 10088, 9230, 7793, -1034, -641, -10222, -12295, -9464, -10514, +-8566, -8900, -6150, -10384, 1175, 2734, 14415, 19089, 32505, 22916, 14436, 9865, 161, -7112, -7976, -10377, +-12687, -13294, -10301, -11325, -8311, -8920, -7133, -474, -448, -584, -6286, 6637, 11217, 7015, 23023, 11666, +5035, 4761, -2531, -3793, -7664, -8940, -12256, -6297, -8272, -7192, -2963, -1741, 2111, 8013, 19012, 14754, +21169, 18944, 2851, -3326, -8397, -10830, -9637, -14775, -12778, -13395, -13200, -12413, -10796, -7511, 3089, 5586, +15365, 16043, 14880, 10545, 11865, 9989, 3559, 9007, 93, -2691, 1712, -6313, -6987, -7328, -7053, -7941, +-10170, -10898, -8867, -7282, 2059, 9022, 16732, 9489, 17012, 7539, 4482, -158, -7049, -7737, -8237, -10490, +-14055, -12109, -14213, -6715, 501, 7446, 10144, 16247, 25049, 28144, 19553, 8968, 4061, -1185, -4722, -10471, +-8267, -10885, -8580, -9732, -11983, -11848, -10949, -10837, -10490, -3531, 2523, 1249, 10582, 16853, 16252, 16784, +18238, 5638, -2008, -827, -14684, -10200, -5607, -8626, -7021, -4943, -4418, -1198, 15, 9841, 12148, 19008, +15759, 7982, 4506, -519, -7642, -12109, -11894, -14635, -13419, -9967, -8790, -10880, -7922, -5595, 933, -3516, +2923, 12246, 15134, 14056, 17880, 18732, 11293, 3736, 7587, 3890, -7408, -322, -6123, -13670, -8412, -11480, +-15401, -9594, -9536, -5408, 4862, 8183, 15481, 12712, 11256, 15008, 2424, 7059, -9886, -18364, -10492, -14182, +-13555, -6195, -2285, -1983, 1864, 1057, 7189, 11625, 16900, 12741, 27454, 18673, 8173, 10789, 1421, -9238, +-11232, -12217, -17866, -14106, -13362, -12383, -14465, -9145, -6405, -5149, -3250, 3502, 3191, 11683, 22038, 17381, +26732, 12177, -434, -3563, -2832, -10803, -6632, -7306, -11511, -6532, -7800, -10400, -491, 6014, 10948, 15599, +10577, 16178, 11111, 726, 1732, -4475, -9158, -11080, -13157, -14667, -12935, -18496, -9407, -5750, -8183, -2919, +3219, 11261, 17590, 17782, 16203, 21044, 15798, 4349, 2174, 883, -8452, 1532, -8678, -11054, -8941, -10961, +-8940, -5599, -5708, -5045, -4598, -1562, 10102, 7787, 19149, 9017, 12015, 5493, -5101, -8627, -4263, -11432, +-8853, -6100, -8469, -4434, -6661, -5828, -54, 5166, 22314, 22135, 20342, 11974, 16019, 7252, -486, 282, +-18573, -11431, -9405, -10288, -16273, -8396, -10355, -2951, -4397, -2378, -4723, 1087, -2527, 461, 18113, 14923, +9585, 20551, 4872, 138, 3676, -1465, -11079, -7001, -10440, -9567, -6845, -6727, -6724, 1103, -1320, 11836, +11247, 12717, 18262, 9678, 6933, -2768, -8606, -7127, -11579, -14908, -10472, -13649, -11738, -11993, -9986, -3633, +-2692, 14114, 18242, 12017, 25707, 20545, 9729, 10684, 3273, -2813, 3171, -4074, -10675, -8272, -5814, -8726, +-6617, -6753, -11305, -9463, -6896, -4747, 4000, 9700, 11904, 8813, 13956, 18545, 1103, -4380, -7165, -10825, +-8431, -9034, -11271, -7979, -2367, -1075, -1727, 2497, 10771, 12364, 21622, 19726, 12614, 12794, 7716, -5158, +-7849, -7131, -12449, -13895, -12257, -13581, -10638, -10458, -12870, -4240, -2008, -1063, 2679, 1673, 12141, 8374, +14379, 17389, 13623, 11398, 8966, -3198, -6913, -3432, -4766, -5537, -6763, -7754, -7811, -5582, -5566, -1799, +5518, 15591, 11807, 5387, 7257, 1506, 2915, -4993, -6375, -13777, -16290, -14341, -14737, -14035, -8794, -1723, +-1562, 9443, 14906, 18547, 23297, 19799, 16743, 6670, 59, 4632, -211, -7021, -663, -3420, -5129, -8403, +-5838, -11476, -7810, -11694, -12134, -8098, 767, -3269, 1538, 4859, 14282, 17976, 32, 7941, -41, -5926, +-553, -8145, -3576, -2900, -3870, -2117, -4322, -2066, 3031, 12827, 22159, 26598, 25076, 9540, -4980, -7761, +-9019, -11620, -9671, -15736, -9420, -9275, -14972, -10859, -9920, -9028, -2682, -1447, 1801, 3127, 3719, 8697, +17127, 16743, 21945, 13707, 892, 3241, -2987, -2221, -873, -603, -5077, -5164, -7864, -8978, -6266, -6256, +-1698, 2571, 30, 10874, 9051, 8435, 6759, 3290, -11329, -12487, -14950, -15519, -14453, -14530, -11729, -3661, +7722, 4689, 10640, 16790, 22537, 22800, 16801, 14324, 9465, 2982, -5984, 1334, -973, -8915, -5212, -9138, +-10288, -7170, -7247, -8826, -13290, -13733, -13182, -5484, 2018, 3108, 9593, 12005, 14370, 5614, 5788, 4107, +-1015, -2585, -5977, -1375, -7713, -4500, 2100, -1955, -85, 18939, 14347, 20632, 17131, 1877, 648, 938, +-7245, -6496, -10474, -14329, -13932, -13162, -14804, -11907, -8115, -8544, -4443, -230, 4675, 2560, 3743, 10699, +7918, 15119, 12686, 15226, 20130, 2498, 5504, 5819, -5998, -801, -4417, -9916, -5202, -7258, -9555, -7185, +-8976, -1753, 2579, 4804, 9479, 3251, 9557, 4727, -13278, -12970, -11780, -16298, -7921, -8605, -7691, 879, +-1485, 4407, 9470, 10510, 17056, 23342, 24361, 19886, 13047, 4974, -2793, -6663, -4933, -6138, -6251, -5905, +-8539, -8552, -9182, -11350, -13493, -12858, -8746, -6333, -4728, -951, 1554, 4956, 11238, 8564, 8818, 11343, +5253, 2870, 546, -5211, -2397, -5166, -4466, -4072, 8603, 14324, 1829, 9496, 17485, 10885, 4945, 7032, +1162, -10985, -9308, -10607, -12223, -12657, -10417, -13593, -12419, -13173, -9464, -5823, -1232, 1118, 2671, 10369, +15219, 13098, 13976, 19627, 9794, 5531, 14056, 2419, -2349, 2887, -2494, -5459, -5698, -4578, -8217, -7088, +-7088, -4548, -3855, -2008, 4829, 4530, 6310, -3773, -10437, 1490, -6237, -6911, -5932, -11708, -11656, -2349, +-9208, -4909, 7660, 12992, 10840, 21433, 21064, 20997, 21891, 7699, -66, 437, -1498, -8103, -11403, -8981, +-8382, -6421, -5934, -6634, -10723, -9909, -13946, -12030, -5032, -1296, -3684, 3080, 8319, 9639, 7822, 11164, +8735, 897, 4318, -1964, -2247, -1141, -1383, 3924, 7189, 1669, 3080, 4879, 14679, 15795, 9463, 5491, +-904, -4770, -12916, -10389, -13603, -10437, -9385, -12469, -12183, -12914, -13100, -3500, 331, 825, 5459, 12602, +11403, 7727, 10015, 11331, 12305, 10110, 5708, 4748, 8009, 3735, -1351, -3697, -5840, -816, -4542, -5862, +-5184, -4509, -7574, -5193, -1411, -3643, -3193, 251, 2460, -2755, -3648, -3788, -11894, -11033, -11678, -10408, +-2778, 1753, 1227, 7772, 15924, 17391, 19606, 32330, 15630, 6307, 8602, -3775, -3096, -2514, -12081, -10406, +-2227, -5523, -8629, -8600, -6429, -6968, -12929, -11077, -9683, -6770, -8120, -9950, 2692, 13014, 5759, 12131, +9449, 5948, 8103, 496, 784, 8920, 791, -188, 2042, -1902, 483, 6748, 12393, 16257, 9894, 7863, +747, 112, -6341, -8963, -10854, -13082, -13870, -16630, -15833, -9953, -7558, -6315, -1805, -3678, 6172, 3552, +17700, 8217, 3399, 12018, 5731, 13152, 15948, 7378, 11004, 10527, -398, -1978, -4793, -8680, -2286, -6511, +-5605, -4606, -4495, -4243, -5440, -4031, 4301, -112, -4902, -2581, -3289, -3777, -11786, -14344, -9107, -10828, +-6745, -646, -1607, 5377, 13363, 14757, 23004, 24768, 6850, 15347, 10028, -734, 7214, -6317, -6489, -2880, +-7252, -7409, -3730, -3753, -3686, -8593, -13419, -11484, -18065, -8668, -10621, -8842, 1550, 8314, 12272, 12636, +7161, 5054, 5675, -313, 6386, 1067, -2600, 6875, 939, 2405, 5069, 8455, 19070, 13702, 4891, 2184, +1814, -2572, -4108, -6812, -9201, -11807, -12817, -9880, -10580, -6144, -7383, -9448, -8136, -2784, 1215, 871, +3249, 11771, 8175, 3934, 9154, 8992, 19473, 11282, 6053, 11823, 4361, -443, -1549, -4684, -1773, -4607, +-6155, -5823, -5896, -5228, -3477, -5673, -2838, -3889, -215, -7172, -359, -8121, -10633, -6607, -9371, -7249, +-5408, -1312, -113, 6252, 6513, 11738, 18830, 18524, 13846, 13009, 14176, 6937, 6884, 2663, -11033, -9543, +-6733, -3523, -4466, -4244, -7242, -9271, -13476, -13026, -12052, -11872, -9929, -4635, -2088, 1554, 8561, 8832, +9349, 6395, 3658, 4824, 3497, 3498, 5478, 3273, 2225, 7996, 4950, 19284, 11418, 11127, 9448, 1804, +1528, -5052, -6928, -8038, -7776, -12909, -12492, -11794, -10665, -9397, -8214, -7582, -5936, -5644, -4885, 425, +6082, 7657, 5175, 9270, 12960, 10663, 20616, 13069, 7482, 8960, 5486, -1485, -1505, -4385, -4002, -4518, +-2711, -2401, -5607, -4470, -6646, -8397, -3023, -2679, -3188, -6889, -4573, -5069, -7785, -11398, -7359, -6808, +-3241, -2755, 1029, 3656, 8422, 12523, 11089, 16702, 13345, 6351, 12851, 10332, 6100, 2600, 607, -6702, +2284, -4841, -6953, -5849, -7112, -10622, -11407, -9429, -7914, -12527, -8202, -4908, -5392, -107, 2248, 5357, +8976, 2061, 1858, 7160, 4214, 3603, 3932, 782, 2504, 5459, 6075, 11280, 17769, 12624, 14368, 3947, +2293, -1247, -7306, -6481, -10505, -10136, -10915, -9496, -6753, -7996, -8232, -7039, -10791, -7674, -7928, 623, +3556, 5008, 6375, 10481, 9572, 9753, 11392, 11661, 11314, 3826, 6179, 8028, -171, -2125, 1818, -1716, +-3343, -1753, -3438, -4717, -6711, -3781, -4567, -4490, -6017, -9722, -9167, -9952, -9940, -6792, -3371, -5670, +-243, -2046, 2776, 6168, 5934, 7618, 9894, 8695, 6987, 10529, 11466, 14931, 12167, 6038, 4470, -787, +-5534, -6348, -7934, -6353, -8063, -8472, -9380, -10251, -10694, -6797, -10482, -10142, -2299, -3006, 3492, 2716, +5658, 7754, 3821, 3707, 4540, 3614, 2580, 4780, 3842, 5551, 6753, 8305, 13408, 16213, 6981, 4633, +2013, -1041, -6400, -1398, -3360, -8377, -3583, -7946, -9023, -7616, -9841, -8983, -9463, -10755, -5594, -4533, +-6434, 1212, 5107, 8018, 12421, 8876, 10653, 15126, 9812, 7640, 7172, 2804, 1961, 3634, -492, -2288, +-3054, -1287, 890, -5575, -2068, -7306, -6235, -1412, -972, -2144, -7812, -8986, -10433, -14738, -5542, -6148, +-3561, -3098, -1498, 1165, 514, 5402, 9601, 4174, 9382, 9947, 10146, 14608, 7815, 4839, 9572, -1235, +772, 3889, -4971, -3020, -3740, -11155, -7418, -10978, -11436, -6740, -7684, -6932, -4592, -6501, -1635, 540, +3147, 7965, 2770, 3432, 5755, 1348, 3066, -1184, -235, -728, 8309, 9736, 14746, 13809, 10382, 9249, +7511, 156, 1361, 3197, -8897, -758, -3918, -9756, -4742, -8437, -10299, -9017, -11458, -9463, -5868, -8695, +-966, -1746, -177, 7836, 5537, 11671, 13249, 9987, 8006, 8401, 5023, 1397, 2288, 1756, 287, 805, +-331, -842, 1276, -1151, -5392, 176, -583, 1021, 1668, -5837, -9741, -8689, -11668, -13351, -5774, -9097, +-3440, -3455, -4020, -2894, -3057, 2435, 2953, 6412, 10289, 9295, 13636, 13027, 6195, 9152, 5333, -119, +2944, 820, -1534, -1310, -7347, -6419, -7882, -9048, -5479, -7674, -7623, -8071, -4863, -3700, -3240, -1246, +-2311, 3477, 3646, 3243, 5825, 3314, 613, 1364, -386, 1959, 5357, 4271, 10267, 11830, 12042, 9141, +6419, 6150, 7630, -3506, -84, -1451, -8163, -1201, -6790, -10973, -7373, -10109, -11453, -10018, -6281, -2614, +-2342, -1252, 825, 1503, 6874, 10178, 7580, 12208, 9124, 11006, 5934, 3405, 299, -303, 3477, 2543, +4174, -330, -1882, 47, -3429, -2755, -1874, -3545, -5372, -5759, -4592, -8060, -6874, -6938, -10608, -2469, +-3982, -3396, -5707, -2613, -2610, -2810, 4608, 3225, 4108, 12827, 10631, 9537, 9921, 2400, 3215, 4833, +725, 2657, -517, -3996, -1658, -3746, -4970, -4776, -8063, -7757, -9152, -10616, -4389, -2742, -6536, 577, +-3894, -419, 6254, 5677, 1542, 7820, 2827, 1770, 3531, 1198, 1431, 6053, 2591, 8748, 10954, 3891, +10265, 6368, 2493, 7229, -1372, -3157, -608, -6532, -4295, -4562, -8155, -5818, -7626, -7462, -5476, -6929, +-8738, -5505, -2107, 1709, 6952, 3370, 7753, 9136, 12736, 11498, 7587, 8040, 8345, 2444, 5808, 1435, +-2842, -2356, -4819, -2138, -3554, -3535, -1179, -2856, -3299, -1974, -3836, -4627, -7083, -10193, -5954, -5863, +-6668, -2148, -4518, -6016, -380, -3119, 733, 2509, 4642, 7715, 9813, 8958, 7350, 6691, 9131, 10318, +2455, 6319, -921, -6246, -2153, -4543, -5774, -7806, -6352, -6589, -7297, -6201, -7136, -8212, -3134, -4439, +-1984, 1976, 3435, 2597, 2352, 4177, 2236, 1340, 3525, 1781, 2275, 3711, 8333, 7158, 6790, 7554, +6598, 6656, 7108, 5208, 706, 147, -3789, -6909, -5416, -6513, -6600, -5522, -7476, -6055, -5400, -5644, +-5374, -6313, -6521, 568, 4673, 4762, 6389, 8291, 10175, 7853, 8595, 12464, 8728, 4921, 3920, 927, +1742, -400, -4843, -2134, -2759, -2766, -2449, -2037, -2958, -2344, -4662, -6729, -5261, -5101, -6161, -6371, +-7122, -7345, -4627, -3482, -5450, 214, 936, -443, 4187, 6167, 7138, 5979, 7262, 8238, 10375, 8946, +11838, 4169, 2056, -1558, -3743, -4274, -6730, -7359, -6610, -6063, -6152, -5731, -10650, -5097, -8111, -5198, +-1075, 903, 2831, 4931, 798, 3822, 4103, 384, 1332, -234, 360, 3740, 5659, 5886, 7703, 8929, +8590, 6964, 10585, 6293, 2702, 1694, -3304, -4049, -2613, -5144, -5309, -5464, -6460, -8832, -7848, -7690, +-7335, -8993, -6271, -2856, 2294, 3350, 7863, 9157, 9084, 8552, 8976, 10404, 8670, 6527, 3089, 3724, +-1703, -873, 2560, -1167, -2517, -1335, -2448, -3162, -810, -1921, -3866, -4259, -4610, -3487, -3288, -5052, +-8311, -7483, -9052, -8486, -6722, -6273, -1031, -240, 1529, 3520, 7543, 8514, 9018, 8421, 9395, 10303, +7378, 4780, 1912, 47, 946, -1195, -307, -5936, -6506, -7163, -9409, -9664, -8113, -8771, -4153, -4465, +-3256, -318, 1096, 825, 2376, 3918, 3692, 2369, 1775, 975, 2466, 3726, 4151, 2861, 2803, 5895, +6058, 6779, 10645, 8197, 5347, 4405, -762, 822, -1698, -2638, -2116, -5319, -5995, -6585, -6448, -6108, +-8832, -9084, -7492, -6923, -478, 850, 4019, 8200, 12027, 10745, 11752, 10705, 5241, 5154, 2228, 1535, +46, 1766, -892, -2088, -1504, -1836, -2522, -18, -1709, -3314, -2731, -3453, -1533, -1596, -1518, -4126, +-9033, -7979, -9686, -10127, -7558, -5667, -1824, -1016, -229, 2611, 5488, 5900, 6755, 7366, 6928, 11324, +9891, 6749, 3992, 2527, 616, -3133, -1676, -5553, -6594, -6559, -8852, -8204, -4933, -5703, -286, -3959, +-3932, -3579, -2634, 798, 2788, 3884, 3956, 2218, 522, 2259, 1058, 1005, 239, 384, 2682, 3928, +8769, 7907, 10647, 11394, 7274, 6976, 6702, -975, -1586, -2541, -5008, -6784, -5667, -6709, -7531, -6666, +-7223, -8849, -6767, -3138, 883, -1951, 1641, 3244, 8294, 10173, 10952, 7895, 6890, 3348, 4472, 4610, +4709, 932, -166, -1545, -3178, -1787, -1224, -1422, -713, -1291, -1368, -1562, -1461, -1784, -3741, -5799, +-6496, -7349, -8100, -6022, -6324, -6697, -6012, -5271, -471, -178, 3836, 7477, 8680, 6270, 8538, 5212, +9837, 5829, 3719, 4998, 137, 1198, -522, -4892, -5663, -5949, -5760, -4749, -6072, -5476, -4104, -5585, +-7346, -4345, -1293, -211, 1970, 2734, 1620, 2010, 1411, -457, 669, -233, 6, 1925, 2323, 3670, +6458, 4695, 7380, 9795, 9091, 12044, 8471, 3336, 2618, -991, -3472, -4550, -6617, -7160, -6576, -8106, +-8055, -8567, -6518, -4156, -3329, -3125, 1181, 3758, 7950, 9671, 6845, 7893, 8197, 4463, 7916, 4441, +641, 573, 348, -1418, 1538, -1339, -1509, -1298, -592, -769, -511, -2653, -1385, -3455, -4670, -3016, +-2745, -5480, -5776, -5902, -5263, -7144, -7701, -5464, -3171, -594, 4628, 2236, 6104, 5369, 5397, 7777, +7679, 7667, 5101, 6835, 1742, 548, -2427, -6706, -5305, -4975, -6392, -4141, -5187, -3932, -3923, -5995, +-6133, -1926, 411, -860, 2391, 991, 3163, 1995, 69, -1814, -915, -632, 973, 957, 1896, 2381, +1107, 4089, 6918, 7044, 8737, 11120, 7344, 5678, 3430, 1828, -3109, -4497, -2488, -5136, -3874, -4250, +-6273, -6569, -3201, -6627, -6508, -3622, -4053, 1470, 7000, 4194, 7766, 6445, 7536, 6381, 5692, 4385, +626, 1039, 909, 1903, 2494, 2710, -134, 1150, -1349, -3458, -493, -41, -346, -226, -3580, -2299, +-4313, -6513, -4727, -4953, -5267, -6337, -6075, -5246, -3719, -5644, -3420, 3657, 1746, 2972, 5750, 5851, +8289, 5149, 7325, 6412, 3912, 1744, -377, -834, -2953, -3913, -4767, -5600, -6710, -5839, -5698, -5989, +-1829, -1645, -2415, -2145, -2778, -1960, 595, 665, 113, 771, 990, 244, 2162, 1620, 2429, 3295, +4058, 3903, 3169, 3944, 4545, 5914, 5116, 4097, 6002, 3794, 1448, 1267, 15, -3607, -3670, -4238, +-5053, -3491, -5891, -4206, -3806, -4893, -2044, -617, -133, 4421, 3869, 5771, 9164, 5726, 5383, 2912, +1273, 2378, 2766, 4772, 3065, 50, -50, -104, -1742, -549, 206, -1326, -229, -806, -1179, -1325, +-1601, -2634, -3537, -4734, -5242, -4409, -3802, -5202, -6182, -5726, -2640, -1898, -44, 1287, 825, 4456, +6542, 6624, 7657, 5925, 4284, 830, -226, -2766, -3385, -2348, -1844, -1427, -2818, -6130, -4931, -4026, +-3975, -2078, -1655, -2606, -3127, -1398, 211, 451, 584, 687, 840, 505, 231, -425, 192, 1155, +987, 967, 3085, 4851, 4272, 4203, 4189, 5518, 6045, 3327, 1160, 3187, 1204, 515, -482, -3821, +-3651, -4283, -4975, -3424, -2924, -2804, -1918, -3089, 2731, 2110, 367, 3278, 4082, 8789, 4579, 4048, +3060, 632, 1886, 3312, 1867, 2842, 2616, 386, 1101, -1823, -2014, -626, -283, -796, 356, 7, +-860, -2367, -3506, -4448, -5045, -5096, -4213, -5149, -3753, -2003, -3133, -1388, -1659, -658, 831, 3021, +3847, 4536, 2877, 3774, 5946, 3239, -1283, -634, -603, -1767, -1326, -2037, -2421, -3749, -1054, -1189, +-2170, -1980, -1582, -3521, -4446, -5042, -5542, -1829, -385, -1116, 326, 2770, 30, 606, 951, 492, +687, 2381, 1889, 3618, 5043, 3918, 4797, 6230, 2328, 3477, 2274, 2737, 2054, 946, -249, -326, +-973, -2911, -3309, -3220, -3138, -1437, -1790, -1320, -858, -228, 1048, 986, 2379, 4019, 2509, 3035, +3893, 3579, 3426, 4438, 3816, 4147, 1591, 2058, -132, -2144, -1831, -1367, -578, -655, -1897, -544, +195, -1000, -409, -1215, -711, 86, -4083, -4122, -4141, -4812, -4644, -3394, -2842, -1978, -1343, 57, +1235, 3329, 3312, 2437, 1477, 1983, 1962, 883, -1756, 84, 269, -429, -51, -825, -11, -1127, +-2246, -2551, -3259, -4539, -4437, -4072, -3055, -3258, -1897, 646, 1577, 910, 991, 1223, 1634, 297, +35, 151, 588, 915, 1005, 1377, 4087, 4931, 3531, 4098, 3404, 2935, 2178, 250, 563, 1108, +-1049, -1419, -2397, -1887, -1650, -2526, -2551, -810, 1157, 1581, 757, 3268, 1950, 1278, 1775, 1588, +-204, 2095, 2015, 3113, 2916, 3866, 4002, 4570, 961, 27, 30, -288, -658, -1286, -1592, -2173, +-1154, -362, -420, -1049, 134, -3259, -3502, -2291, -2998, -2240, -1276, -1108, -816, -1084, -2180, -599, +-370, 701, 1393, 1664, 2090, 1719, -230, -1687, -913, -125, -1346, 810, 44, -1025, -364, -356, +-2386, -2550, -2831, -3851, -3457, -3632, -3851, -3071, -1002, -1078, 917, 660, 573, 1324, 1635, 1964, +777, -466, 410, -66, -509, 1612, 1974, 1939, 3798, 3879, 2906, 2728, 1700, 1858, 2320, 589, +1133, -515, -2255, -758, -1223, -1201, 40, 391, 1363, 1520, 1135, 781, -139, 1175, 264, -461, +2601, 3076, 3623, 2977, 2352, 4220, 4397, 2837, 3084, 1873, 464, -1190, -718, 223, -269, -607, +684, -163, -768, -555, -1387, -2044, -2129, -3443, -3004, -2653, -2421, -669, 574, -417, -578, 457, +-370, 399, -1079, -1219, -1397, -1399, -1165, -2052, -3183, -1736, -374, 20, 30, 2293, 1427, 171, +-1758, -3036, -2619, -2939, -2910, -3036, -3361, -2875, -2721, -3724, -1826, 1036, 85, 781, 2138, 2202, +1419, 720, 103, 360, 477, 632, 1511, 1392, 2095, 2324, 2623, 1650, 578, 996, 696, 224, +743, 44, 840, 1448, 1378, 1023, 425, 1716, 2289, 1330, 531, 117, -641, -1601, -980, 1354, +2931, 3913, 2901, 3535, 2851, 4108, 3084, 4872, 4947, 128, 1128, 670, 774, 398, 241, 711, +-1423, -1029, -1629, -1844, -2492, -2575, -1674, -2575, -2088, -1354, -724, 893, 1212, 35, -3, -448, +-968, -336, -1329, -1884, -1338, -2581, -3658, -3358, -2373, -1555, -590, 1102, 2003, 1684, 41, -2008, +-1458, -1317, -2057, -1896, -2474, -3375, -2843, -4703, -4679, -2906, -2284, -1874, 464, -511, 2056, 1437, +951, 1606, 781, 181, 430, 1254, 8, 711, 1426, 831, 966, 740, 822, 1005, 1055, 1096, +1291, 1477, 1450, 1506, 1722, 1359, 1537, 2033, 2125, 1751, 1040, 64, -682, -634, 653, 1916, +1635, 2061, 2741, 1277, 3115, 3337, 4004, 5602, 3505, 4344, 1935, 1225, 2135, -74, 452, -704, +-1417, -1201, -607, -1179, -801, -427, -454, -351, -143, -457, -370, -430, -874, -1266, -1816, -1402, +-965, -1048, -1475, -1636, -2100, -2364, -2483, -2635, -2194, -1112, 131, 805, 723, -540, -1731, -1535, +-1579, -443, -488, -1620, -1252, -1452, -2091, -2885, -3077, -4182, -4114, -3818, -4399, -2335, -1383, -439, +1361, 2030, 2154, 1617, 1282, 758, 122, 578, 563, 248, 137, 839, 569, 854, 1053, 1266, +749, 1023, 1658, 1712, 1887, 3066, 2764, 2574, 2917, 1741, 364, 1, -1344, -559, 989, 1807, +1578, 956, 1059, 1737, 1801, 2124, 3266, 4384, 4165, 4068, 3535, 4266, 975, 1074, 883, 190, +160, -1573, -1733, -881, -79, 1009, 1070, 326, 401, 141, -409, -245, -1089, -1019, -1275, -1516, +-1571, -2363, -2470, -2421, -2638, -2717, -2514, -1797, -871, -381, 556, 734, -161, -1310, -623, -259, +-212, -424, -415, -1039, -1465, -2058, -2653, -2354, -2999, -3566, -3633, -3428, -2761, -2184, -2241, -1097, +-144, 1096, 1529, 535, 374, -972, -1910, -1334, -467, -602, 185, 287, 607, 1716, 1518, 1350, +1766, 1583, 2099, 2243, 2128, 2182, 1921, 1831, 1164, 401, 734, 428, 303, 1329, 818, 410, +1079, 278, 869, 1237, 1000, 1887, 2319, 2494, 3254, 3065, 3059, 2033, 1529, 2644, 2513, 2945, +201, -1023, 241, 296, 953, 1247, 20, -423, 231, -672, 835, 1165, -17, -895, -1746, -2197, +-1610, -1000, -613, -1028, -2028, -2037, -1563, -1004, -894, -1278, -1142, -1128, -2216, -1370, -1298, -1509, +-109, -593, -753, -787, -1873, -1219, -907, -1107, -1019, -1193, -637, -672, -2371, -2623, -2697, -2203, +-105, 122, -1367, -486, -1795, -2316, -1016, -1063, -885, 153, -1189, -875, 451, 631, 960, 1072, +1145, 968, 1152, 1698, 2106, 2575, 2466, 2150, 1072, 1282, 1291, 507, 936, 467, 451, 942, +314, 487, 758, 583, 817, 850, 946, 1504, 1069, 1634, 1510, 1369, 2513, 2101, 1930, 1167, +297, 1059, 1755, 1465, 1126, 1577, 587, 36, 314, 1087, 951, 937, 832, 45, -687, -476, +-580, -840, -1261, -1501, -1898, -1912, -1813, -1829, -1451, -1264, -1155, -1576, -1732, -1572, -1010, -551, +-343, -206, -75, -529, -1043, -976, -971, -1078, -1540, -1115, -1287, -1765, -1669, -1600, -2120, -881, +-482, -1393, -966, -1436, -1175, -2311, -1094, -992, -1088, -837, -953, -1036, -323, 35, 224, 811, +555, 928, 1683, 1622, 1547, 1743, 1493, 1388, 1018, 1232, 1368, 1336, 1397, 898, 789, 294, +178, 8, 15, 480, 677, 951, 915, 719, 740, 1117, 1234, 1684, 1973, 1825, 1520, 1204, +2090, 1906, 1674, 1833, 2374, 1239, 1281, 1217, 291, 396, 482, 829, 1273, 805, 115, -735, +-854, -1363, -1523, -1742, -2222, -1935, -1697, -1545, -1438, -1010, -976, -997, -1002, -972, -888, -365, +-212, -375, -429, -675, -937, -982, -929, -845, -1029, -1137, -1018, -1310, -1207, -1089, -992, -1156, +-1361, -1354, -1571, -2052, -1814, -1698, -1639, -1603, -1387, -880, -760, -1222, -972, -389, -262, 248, +570, 1062, 923, 697, 1092, 1286, 1448, 1499, 1414, 1288, 1268, 997, 1309, 1023, 1058, 958, +472, 127, 442, 715, 592, 556, 481, 219, 577, 981, 937, 929, 1208, 951, 666, 1334, +1457, 1327, 1722, 1797, 1983, 2262, 1800, 1675, 1043, 1227, 1355, 1500, 414, -658, -637, -826, +-1269, -597, -743, -787, -1026, -1304, -1598, -1339, -955, -56, -498, -650, -1199, -1731, -1152, -889, +-439, -394, -452, 52, -192, -611, -942, -871, -1368, -1055, -1160, -1339, -812, -653, -893, -880, +-982, -1369, -1576, -1431, -1768, -1577, -1320, -1198, -792, -1772, -1622, -1175, -961, 76, -245, -132, +278, -115, -415, 79, 210, 1140, 1271, 944, 624, 641, 708, 737, 738, 971, 1339, 869, +816, 496, 608, -216, -225, -7, 352, 322, 560, 485, 482, 971, 846, 532, 952, 924, +1014, 966, 1171, 1418, 1593, 1708, 1578, 1218, 1106, 1083, 1301, 1797, 384, -291, 772, 162, +432, 963, 723, -362, -782, -808, -1120, -1025, -1461, -1021, -1285, -1253, -1451, -1210, -907, -619, +-408, -381, -249, -297, -566, -840, -753, -695, -709, -831, -850, -696, -503, -517, -477, -472, +-695, -1094, -1248, -1223, -1467, -1359, -1359, -1378, -1248, -1681, -2002, -1703, -947, -25, -875, -829, +-829, -875, -769, -255, 316, 682, 949, 691, 924, 772, 798, 691, 858, 835, 805, 793, +565, 466, 593, 379, 267, 361, 268, 328, 607, 580, 564, 577, 255, 307, 167, 375, +516, 491, 795, 951, 1257, 1466, 1298, 1084, 1087, 1256, 1258, 1019, 608, 1049, 1384, 1291, +743, 1106, 704, -7, 166, -869, -1847, -738, -1766, -1627, -1232, -1222, -1079, -721, -763, -628, +-618, -331, -85, -85, 192, 143, -343, -278, -588, -826, -666, -690, -701, -362, -231, -236, +-377, -871, -1079, -1387, -1607, -1421, -1383, -1287, -1630, -1727, -1828, -1144, -739, -1126, -852, -842, +-972, -633, -403, -84, -134, 131, 1028, 588, 1055, 1185, 457, 636, 559, 313, 183, 284, +406, 464, 162, 65, -388, -321, 171, 136, 762, 750, 386, 510, 347, 147, 181, 118, +42, 415, 233, 681, 898, 730, 1117, 1365, 1518, 1535, 1228, 763, 556, 573, 983, 1170, +895, 634, 282, 306, 84, -245, -192, -1094, -997, -675, -575, -371, -752, -328, -370, -912, +-446, -410, -364, 11, -265, -250, -233, -1023, -947, -634, -787, -599, -700, -535, -231, -136, +-350, -399, -496, -854, -878, -1054, -1398, -1411, -1398, -1232, -1062, -1043, -869, -860, -927, -985, +-704, -618, -793, -815, -743, -418, -129, 554, 554, 362, 525, 154, 331, 244, -26, 307, +226, 90, 292, 40, -187, 146, 294, 418, 716, 493, 389, 348, 46, -20, -118, -10, +74, 148, 385, 515, 786, 686, 854, 1023, 957, 903, 898, 410, 720, 692, 745, 1058, +710, 849, 519, 569, 389, 148, -248, -187, -496, -1320, -919, -858, -884, -170, -317, -284, +6, -93, -314, -178, -379, -277, -427, -994, -626, -495, -444, -225, -355, -277, -248, -355, +-730, -520, -779, -986, -640, -888, -975, -453, -910, -1151, -863, -1120, -720, -579, -1093, -908, +-840, -817, -485, -781, -918, -303, -351, -251, 243, 643, 406, 356, 180, -192, -81, -201, +-217, -76, 17, 74, 200, 168, 61, 453, 388, 428, 427, 188, -1, -253, -221, -6, +161, 122, 229, 429, 190, 423, 463, 481, 564, 929, 549, 311, 216, 117, 541, 684, +386, 661, 663, 521, 490, 524, 420, -84, -201, -439, -511, -214, -118, -80, -330, -651, +-686, -786, -544, -394, -464, -211, -260, -273, 85, -22, -94, -118, -317, -274, -350, -651, +-637, -699, -718, -325, -359, -404, -506, -711, -884, -831, -793, -805, -663, -821, -926, -589, +-764, -800, -684, -972, -892, -607, -404, 90, 187, 171, 146, -144, -167, -153, -90, 39, +2, 11, -112, -65, 89, 2, 143, 195, 12, -22, -161, -153, -177, -138, -93, 142, +260, 433, 495, 188, 191, 95, 64, 165, 260, 446, 423, 422, 229, 458, 558, 323, +496, 446, 355, 496, 423, 112, -132, -107, 20, 37, -41, 64, -97, -360, -448, -429, +-359, 25, 123, -149, -224, -346, -485, -341, -357, -394, -255, -370, -370, -360, -502, -543, +-641, -554, -456, -453, -380, -386, -472, -495, -510, -529, -669, -459, -559, -771, -671, -658, +-641, -590, -476, -443, -509, -546, -545, -415, -464, -506, -446, -422, -177, -133, -99, 69, +10, -75, -235, -98, -95, -66, -88, -102, -114, -56, -62, 8, -3, 83, 65, 200, +210, 217, 79, 107, 23, 5, -7, 59, 214, 296, 331, 269, 229, 265, 177, 84, +200, 274, 185, 280, 376, 239, 134, 129, 325, 166, 168, 75, -44, -86, -156, -68, +-214, -365, -446, -463, -574, -389, -394, -365, -279, -205, -394, -637, -240, -102, -161, -54, +-280, -377, -273, -302, -452, -391, -457, -452, -491, -574, -582, -514, -447, -394, -398, -525, +-612, -577, -574, -626, -578, -554, -568, -563, -510, -433, -449, -381, -264, -309, -112, -263, +-302, -80, -112, -85, -86, -12, 8, -25, -113, -81, -31, 166, -85, -149, -71, -192, +-52, 55, -12, -56, -25, -54, -78, -56, -34, 30, 104, 160, 115, 66, 69, 91, +153, 134, 123, 151, 163, 171, 154, 188, 69, 100, 85, 66, 5, -146, -138, -131, +-206, -167, -196, -196, -158, -138, -144, -177, -288, -331, -406, -346, -312, -330, -333, -375, +-497, -457, -404, -364, -364, -371, -408, -410, -414, -410, -390, -343, -332, -354, -418, -415, +-472, -554, -503, -492, -512, -477, -477, -428, -331, -274, -389, -356, -388, -469, -495, -447, +-283, -212, -127, -79, -158, -170, -202, -226, -56, -70, -109, -115, -172, -114, -75, -59, +16, -12, -51, -114, -61, -46, -35, 21, -7, 21, -18, -22, -57, -127, -62, -51, +6, 66, 47, 54, 75, 45, 80, 28, -65, -21, 17, -73, 45, 86, 25, -85, +-138, -173, -320, -311, -302, -251, -185, -243, -245, -224, -224, -309, -235, -286, -381, -317, +-292, -388, -322, -346, -275, -297, -331, -332, -364, -429, -366, -371, -273, -230, -306, -340, +-408, -410, -386, -375, -418, -443, -443, -413, -389, -408, -375, -393, -428, -446, -394, -323, +-297, -259, -207, -180, -199, -225, -235, -230, -221, -215, -195, -144, -141, -123, -93, -105, +-143, -131, -199, -177, -153, -167, -120, -95, -102, -70, -144, -147, -136, -162, -129, -109, +-99, -94, -86, -100, -59, -37, -51, -99, -124, -103, -110, -60, -41, -39, -80, -114, +-152, -187, -196, -186, -167, -221, -243, -137, -137, -210, -284, -312, -341, -376, -360, -321, +-326, -306, -312, -325, -294, -311, -306, -306, -299, -272, -228, -225, -250, -240, -280, -328, +-321, -312, -313, -323, -356, -383, -348, -318, -321, -302, -297, -330, -370, -361, -341, -326, +-292, -277, -302, -316, -297, -254, -265, -258, -257, -248, -207, -199, -195, -187, -196, -211, +-212, -211, -207, -195, -194, -185, -185, -177, -166, -187, -207, -216, -225, -234, -226, -202, +-196, -200, -199, -192, -177, -163, -172, -188, -190, -206, -201, -172, -181, -192, -196, -209, +-206, -187, -187, -197, -228, -211, -221, -229, -214, -248, -279, -273, -277, -253, -246, -248, +-251, -267, -277, -274, -277, -278, -282, -283, -275, -263, -258, -259, -259, -269, -280, -286, +-283, -278, -273, -272, -274, -274, -274, -273, -269, -268, -273, -273, -273, -273, -270, -268, +-267, -267, -268, -268, -264, -263, -264, -262, -265, -259, -254, -255, -255, -259, -259, -259, +-259, -257, -258, -258, -259, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -114, -71, -26, 13, 44, 57, 73, 86, +46, -17, -60, -22, -16, -90, -119, -114, -99, -74, -44, -22, -83, -178, -278, -390, +-541, -766, -1006, -1251, -1432, -1509, -1552, -1602, -1647, -1695, -1668, -1591, -1412, -1019, -779, -573, +-118, 141, 452, 905, 1070, 1225, 1486, 1771, 2041, 2128, 2222, 2264, 2240, 2187, 2004, 1816, +1719, 1545, 1314, 995, 655, 418, 313, 303, 93, -114, -66, 97, 263, 219, -85, -394, +-676, -1000, -1558, -2194, -2731, -3217, -3663, -3903, -3954, -4007, -4050, -4107, -4001, -3571, -3153, -2592, +-1784, -1329, -808, 137, 915, 1661, 2376, 2659, 3008, 3564, 4038, 4336, 4526, 4679, 4355, 3827, +3721, 3793, 3627, 2910, 2256, 2121, 1760, 1201, 797, 430, 201, 302, 448, 466, 393, 253, +70, -536, -1343, -2076, -2609, -3287, -4353, -5280, -5905, -6269, -6390, -6387, -6491, -6419, -5806, -5389, +-5115, -4548, -3307, -2149, -952, 240, 859, 2009, 3622, 4407, 4950, 5229, 5547, 6197, 6848, 6874, +6455, 6192, 5868, 5255, 4528, 4252, 3961, 3260, 2178, 1043, 904, 1285, 713, 393, 788, 569, +422, 652, 137, -506, -1111, -2527, -3644, -4437, -5703, -7321, -8484, -8762, -8781, -8840, -8878, -8937, +-8636, -8184, -7114, -5440, -4277, -3279, -1714, 273, 1736, 2784, 4455, 5720, 5880, 5912, 6719, 7651, +8530, 9489, 8615, 7905, 8031, 7521, 6852, 6675, 5552, 4046, 3801, 3479, 2143, 962, 345, 611, +658, 461, 972, 1065, -78, -1408, -2324, -3017, -3823, -5371, -7050, -8879, -10593, -11165, -11214, -11089, +-11077, -11320, -11457, -10532, -8184, -6454, -5479, -4500, -2728, -66, 2261, 4000, 5306, 5542, 6284, 7529, +8771, 9635, 10118, 10781, 10323, 9823, 10025, 9445, 8460, 7713, 7173, 5925, 5057, 4394, 3345, 1848, +898, 25, 466, 1493, 1217, 715, -10, -1106, -2068, -3128, -4812, -6353, -7398, -9245, -12044, -13497, +-13603, -13658, -13694, -13715, -12822, -11261, -10479, -9764, -6654, -3051, -1446, -307, 1215, 3958, 6247, 6646, +7735, 9031, 10125, 11200, 11697, 12049, 11850, 11944, 11254, 10336, 9901, 8892, 8189, 7488, 6195, 5352, +3566, 2154, 2051, 2078, 2130, 1179, 658, 602, -272, -1001, -1800, -3224, -5633, -7972, -9540, -11354, +-13521, -15334, -16031, -16006, -16022, -15417, -14310, -13327, -12067, -10738, -8742, -5174, -3200, -923, 2008, 3478, +5775, 7591, 8850, 10728, 11154, 12183, 14020, 14268, 14602, 14059, 12585, 11857, 11489, 10748, 9601, 8567, +7361, 5953, 3510, 2541, 3631, 2315, 1224, 2041, 1947, 1135, 878, -118, -1906, -3872, -6348, -8585, +-10593, -13302, -15864, -17808, -18466, -18389, -18523, -17660, -16283, -15670, -14587, -13374, -10607, -5920, -2507, -1044, +1276, 4708, 7810, 9587, 10027, 11591, 13132, 15562, 16638, 15252, 15481, 15313, 13654, 13098, 12339, 11835, +11481, 9657, 6782, 5665, 4268, 2638, 3347, 2723, 1009, 1615, 2163, 1862, 728, -467, -1678, -4103, +-6375, -8465, -11248, -14782, -17929, -19598, -20245, -20776, -20924, -20982, -20379, -18866, -16609, -14887, -12269, -7564, +-3346, -726, 1722, 4961, 8096, 10542, 12185, 13629, 14523, 16349, 17087, 17656, 18267, 15932, 14851, 13933, +13132, 12776, 11200, 9574, 8229, 7076, 4762, 3956, 5083, 4318, 3544, 2746, 2160, 2513, 1208, -946, +-2459, -3943, -6032, -9467, -13017, -15595, -18737, -21234, -21809, -22510, -23352, -23375, -22629, -21174, -19262, -17603, +-15198, -8692, -2411, -734, 1891, 5825, 8956, 12965, 14352, 14688, 17241, 17756, 17942, 19892, 19533, 16669, +15005, 15102, 14434, 13426, 12290, 10730, 9635, 8590, 8127, 5328, 3670, 5599, 4131, 2434, 3201, 1661, +-20, -51, -1966, -5431, -7350, -10418, -14514, -18193, -22245, -24295, -24638, -24215, -24499, -25816, -24671, -21664, +-19783, -17855, -13399, -8018, -3686, -452, 2715, 6947, 10136, 11713, 15445, 18038, 19000, 20485, 20012, 20362, +20411, 18956, 18456, 18001, 15988, 14187, 13159, 12237, 11586, 8634, 6029, 7664, 6226, 3883, 4374, 3030, +2689, 2546, 1030, -527, -1401, -3798, -9066, -13928, -16719, -19391, -22679, -25142, -27182, -28259, -27790, -26455, +-26348, -24985, -21407, -17942, -13683, -7676, -2639, 517, 2681, 6891, 9707, 13031, 17813, 18912, 19673, 19910, +20400, 22313, 23222, 20835, 19172, 18380, 18186, 17347, 14829, 13357, 13115, 10500, 6738, 5733, 6468, 5359, +4443, 4840, 3500, 1939, 1663, 1554, -1476, -7374, -10740, -12739, -17910, -23116, -26957, -28223, -28123, -29804, +-30521, -30789, -28908, -25394, -23671, -19853, -13833, -10467, -5968, 490, 4499, 8396, 12417, 15222, 17990, 19165, +20662, 22112, 24116, 22847, 22573, 22636, 21262, 19926, 18651, 18200, 17420, 14133, 11550, 10776, 11079, 10308, +6647, 4918, 5363, 4912, 4029, 2435, 932, 80, -3415, -6862, -11118, -17461, -21165, -23619, -26039, -28184, +-31046, -31531, -31199, -30995, -29725, -28273, -25426, -17667, -12750, -6996, -2062, -991, 3196, 8488, 11595, 15457, +17890, 17943, 20942, 22291, 22519, 22916, 22117, 23691, 22594, 20343, 18188, 16633, 17170, 15554, 12589, 10842, +10846, 9998, 6106, 5937, 6898, 3280, 2825, 3489, 632, -1165, -3321, -8233, -12320, -17626, -22321, -24840, +-26879, -28522, -30644, -31521, -30776, -29566, -28173, -26323, -22556, -19480, -13210, -6478, -2435, 624, 2427, 6486, +12237, 14899, 16223, 17662, 18654, 21030, 22143, 22788, 22242, 20624, 20531, 18678, 17696, 18175, 16803, 14937, +14626, 14512, 9720, 7173, 7882, 7228, 6362, 4853, 3551, 2217, 1384, -364, -4069, -8718, -13557, -16333, +-19905, -24087, -27504, -29741, -30658, -30791, -31087, -31152, -28230, -23632, -20959, -17800, -12169, -6458, -973, 2225, +2694, 6836, 12989, 16678, 16329, 15777, 18365, 19886, 20929, 21183, 21291, 21776, 20913, 19354, 18243, 18249, +17943, 14661, 12761, 14022, 14289, 11612, 8823, 5871, 3619, 4376, 3904, 2669, -103, -2914, -5082, -9521, +-15159, -18857, -21500, -24676, -27955, -30027, -31322, -30923, -30125, -28991, -26880, -24167, -21123, -17512, -10001, -3511, +-2460, 275, 5581, 9231, 11802, 13986, 16421, 17706, 18603, 18760, 19700, 20943, 20590, 20292, 19736, 19257, +17781, 17277, 18295, 17413, 13559, 12426, 13653, 11472, 7669, 8086, 7110, 3621, 2148, 1732, 25, -3300, +-6756, -11025, -15590, -19734, -22109, -24911, -28165, -30239, -31084, -29808, -27966, -28714, -26806, -21812, -18077, -14022, +-11237, -5993, -139, 2048, 5066, 8236, 11596, 14423, 15493, 15832, 16944, 18543, 20158, 21257, 20645, 20803, +19842, 17735, 17655, 18397, 18421, 16974, 14888, 14051, 13445, 10958, 8168, 5903, 4521, 4564, 3318, 367, +-2386, -4169, -7132, -12650, -17693, -21041, -22602, -24865, -28150, -29692, -30198, -29228, -28951, -28094, -25165, -22524, +-18314, -12608, -6901, -4012, -1057, 2125, 5078, 9244, 13059, 14482, 14715, 14943, 16724, 18966, 18916, 19868, +20975, 20299, 20390, 20049, 18866, 18181, 17627, 18190, 17604, 13980, 11671, 11249, 9164, 6349, 5142, 2964, +1513, 162, -3323, -7024, -9245, -12737, -17034, -20490, -23967, -27032, -29220, -29953, -29466, -28608, -27832, -26882, +-25355, -21467, -16256, -10767, -6855, -2785, -808, 2705, 7144, 10044, 11877, 13219, 15093, 15297, 15819, 17871, +19438, 19717, 20338, 20073, 18650, 18921, 19222, 19305, 19441, 18161, 15126, 13336, 14066, 12349, 7788, 5003, +4067, 3287, 1915, -454, -3652, -7661, -11625, -14670, -17665, -21215, -24764, -28159, -29592, -29157, -29359, -28656, +-27897, -26184, -22355, -17810, -12621, -10850, -7453, -2164, 573, 4465, 6956, 9771, 12814, 13620, 13964, 13946, +15481, 17975, 20216, 20037, 19411, 19547, 19977, 19657, 18166, 18096, 19669, 19752, 17536, 15334, 12878, 9148, +7729, 5774, 3457, 3198, 1989, -1422, -4554, -7686, -11219, -14654, -18338, -22236, -25769, -27347, -28418, -29411, +-28976, -27853, -26598, -24574, -21896, -18241, -13254, -6593, -4355, -3576, 338, 5454, 7496, 8889, 10495, 11330, +12969, 14282, 15847, 16729, 17953, 19522, 19540, 19514, 20249, 19460, 19230, 19585, 20125, 18871, 15888, 14255, +12701, 9513, 6074, 5241, 4656, 2036, -37, -1820, -4916, -8367, -11215, -15762, -19139, -22390, -25706, -28249, +-29353, -29146, -28359, -27670, -26730, -24364, -20452, -15086, -10156, -8319, -6048, -526, 3652, 5388, 7041, 10294, +11046, 10798, 12768, 13248, 15808, 18275, 18687, 20100, 19046, 18687, 19773, 19737, 19770, 19026, 17709, 17032, +15979, 13580, 11848, 8173, 4901, 6052, 5512, 3210, -321, -3860, -6439, -9337, -12420, -15814, -20481, -24737, +-27378, -27757, -27796, -28937, -29119, -26706, -24053, -21406, -16656, -13401, -9420, -5717, -4015, -399, 3544, 6719, +8547, 8510, 10556, 12545, 13838, 14867, 15974, 16583, 18081, 19812, 20433, 19829, 18988, 18440, 18266, 18438, +19165, 19126, 16240, 11763, 8309, 7495, 6798, 5880, 3570, 680, -2135, -5644, -7612, -10069, -13778, -17500, +-22044, -25580, -27182, -28232, -28518, -28389, -27900, -25032, -22072, -19550, -17674, -12917, -8238, -4771, -1833, 1252, +3714, 5169, 6929, 9896, 9982, 10903, 12917, 15029, 16278, 17088, 18998, 19797, 20345, 19703, 17844, 17910, +20337, 20142, 17643, 15935, 14689, 11836, 7622, 6137, 5086, 3219, 1956, 1363, -1253, -6269, -8496, -11126, +-14938, -18517, -22290, -24947, -27076, -28660, -28365, -26908, -26189, -23838, -22209, -19609, -14800, -12311, -7963, -3676, +-1264, 1402, 3886, 6077, 8125, 9265, 9970, 11577, 13515, 14667, 17088, 19561, 20409, 19412, 18622, 19092, +19982, 20444, 20289, 18879, 16578, 15580, 14547, 10354, 5701, 5376, 5005, 2621, 976, -1485, -3675, -5717, +-10080, -14048, -16213, -19173, -22892, -26480, -28287, -28205, -26532, -25188, -25784, -24995, -21942, -18142, -13163, -8460, +-6698, -4356, -637, 2715, 5024, 6903, 9168, 10445, 10219, 10789, 13809, 17301, 17785, 18767, 19606, 19613, +19764, 19601, 20025, 20225, 19659, 17739, 15746, 15013, 12862, 9479, 7386, 4230, 3143, 3515, 1457, -1514, +-5300, -8392, -9983, -12372, -16409, -21000, -24706, -26617, -27698, -27367, -26142, -25474, -25189, -23239, -19548, -15672, +-10968, -7806, -6241, -3303, 1161, 3991, 4227, 6571, 8515, 9170, 10786, 11451, 14151, 16978, 18407, 19686, +19715, 20294, 20433, 20519, 21261, 19243, 17330, 18543, 18074, 13988, 10760, 7189, 4093, 4825, 4284, 1862, +-176, -3623, -6192, -7549, -10546, -14044, -18223, -22565, -24982, -26834, -28209, -27061, -26281, -26423, -23179, -21028, +-19383, -15670, -11957, -6520, -2386, -805, -206, 2044, 5134, 6856, 8675, 9293, 11143, 14065, 14951, 16166, +18799, 20241, 21302, 21886, 20379, 19490, 20025, 20614, 20816, 18451, 15798, 12630, 9332, 6544, 4918, 3740, +2330, 1957, -706, -4548, -6258, -8238, -11990, -15616, -18614, -22522, -25558, -27383, -27390, -26828, -26043, -23648, +-23237, -21238, -16884, -14424, -10473, -6572, -2051, 711, 612, 2992, 5693, 7326, 8882, 10428, 11807, 12745, +15544, 18515, 20023, 20374, 19792, 20284, 20905, 20716, 20715, 19863, 18477, 16772, 15113, 12141, 7992, 4127, +3224, 2837, 1765, -102, -2852, -4398, -6376, -10190, -13949, -16593, -19611, -23372, -26436, -27036, -26564, -25462, +-25061, -25697, -22817, -18184, -15242, -12179, -8799, -4836, -2145, -1779, 1427, 5435, 6974, 7402, 7572, 9295, +11537, 14054, 17434, 18334, 18370, 20290, 20832, 20687, 20555, 20472, 20381, 19131, 16562, 14782, 13757, 11897, +7718, 3815, 3442, 3342, 2029, -291, -3636, -6371, -7544, -10021, -12958, -17199, -21484, -23947, -24475, -25198, +-26011, -25849, -24771, -23110, -20164, -17990, -15465, -11766, -7549, -4278, -2279, 220, 2852, 3975, 6484, 7914, +9284, 10433, 12058, 14860, 17308, 18808, 20488, 20937, 21751, 21862, 20267, 19819, 19959, 19204, 16389, 14380, +11941, 8925, 6790, 4322, 1573, 1678, 1309, -2133, -5091, -6196, -8091, -11435, -15149, -17720, -20341, -23677, +-25823, -26890, -25750, -24856, -23641, -21594, -19918, -18188, -14194, -10307, -6507, -2290, -395, 860, 2846, 5213, +8155, 9047, 9722, 10852, 13243, 15910, 18105, 20260, 22049, 21196, 21165, 20156, 19218, 19686, 20330, 18341, +13964, 12238, 10937, 8053, 5287, 2100, 830, 1592, -128, -2914, -5290, -7427, -9837, -12556, -15281, -18416, +-21513, -23866, -26007, -26138, -24530, -23520, -22636, -21818, -20250, -15699, -11248, -9134, -4234, -1344, -286, 1377, +3624, 6853, 7424, 9084, 10825, 11627, 14953, 17669, 19354, 20667, 19913, 19412, 20018, 20768, 20459, 19429, +19141, 16644, 13856, 12374, 9610, 5473, 3254, 1639, 229, 220, -772, -3808, -7036, -9582, -10934, -12483, +-15142, -18484, -22105, -24768, -26118, -25481, -24208, -23161, -22962, -21183, -19351, -15766, -10244, -5581, -3653, -2429, +83, 2793, 5895, 7774, 7325, 8787, 11170, 12694, 15964, 18375, 19354, 20555, 20318, 20172, 20715, 20670, +19847, 18872, 18065, 14836, 12439, 10302, 7311, 4516, 2376, 1257, 515, -1208, -2721, -4902, -7003, -8329, +-10275, -14301, -17659, -20752, -22573, -23898, -25714, -25886, -24369, -22934, -21927, -19667, -16812, -14296, -10605, -5144, +-2996, -1450, 3007, 4930, 5664, 8052, 9211, 10784, 12096, 13799, 16475, 18997, 21463, 21593, 20364, 19446, +20550, 21549, 19989, 18569, 16478, 13314, 12007, 9238, 5107, 2271, 776, 648, -583, -2516, -4077, -6050, +-7714, -9480, -12173, -14858, -17680, -21228, -24075, -25096, -25467, -25660, -25150, -23476, -19941, -17771, -16285, -13297, +-9072, -3159, 272, 414, 960, 3942, 7940, 9216, 10275, 10699, 11625, 14909, 18057, 20405, 21432, 21322, +21414, 20733, 19659, 19247, 18755, 17172, 14269, 11206, 9690, 9244, 6162, 788, -90, 831, -1343, -1894, +-3209, -6574, -8983, -10258, -12189, -14637, -18183, -21886, -24346, -25467, -24334, -22807, -22791, -22793, -21000, -18382, +-14965, -11295, -6487, -1411, 303, 1660, 3982, 5577, 7727, 9569, 10726, 11784, 14268, 17597, 19053, 19850, +21204, 20658, 20118, 21233, 21600, 19919, 17609, 16605, 15326, 12138, 8387, 4147, 2691, 2471, 59, -1049, +-1321, -3270, -5353, -6828, -9052, -11408, -14073, -16496, -20017, -23559, -25116, -25158, -24632, -24918, -24515, -22177, +-18687, -15905, -12289, -8229, -4361, -973, 26, 1865, 5161, 7408, 8627, 9401, 10866, 13051, 15195, 18151, +20280, 20861, 21201, 21482, 19991, 19494, 20385, 19430, 17488, 16082, 13671, 9455, 5257, 4355, 3227, 1486, +695, -1340, -3870, -5195, -5614, -6570, -8808, -11995, -15570, -18517, -20624, -23019, -25423, -25349, -23840, -23433, +-23253, -21230, -18256, -14742, -11275, -7408, -3090, 922, 2904, 3347, 4877, 7315, 9834, 11555, 12665, 12831, +15491, 18233, 20671, 21525, 21137, 20647, 20212, 19824, 19441, 18669, 17390, 14676, 10909, 7716, 5526, 3744, +1537, 202, -1363, -2387, -3613, -4854, -6308, -7562, -10239, -13516, -17473, -20632, -22465, -23933, -25333, -25932, +-25071, -23755, -21742, -18139, -16446, -16138, -10990, -4719, -1574, 1413, 2875, 3958, 6504, 8680, 9782, 10724, +12677, 14581, 17301, 20338, 21183, 21336, 20818, 19697, 19158, 19231, 18661, 17209, 15571, 13904, 10946, 7306, +4426, 2761, 524, -667, -769, -1713, -3816, -5214, -6376, -9062, -12710, -15069, -17540, -21160, -24129, -24849, +-25052, -25347, -24947, -24100, -21875, -18566, -15396, -13244, -9227, -3085, -76, 1537, 3404, 5880, 7390, 8643, +10954, 12311, 13077, 15985, 18317, 19359, 21007, 21700, 21339, 20532, 20099, 19642, 18238, 15777, 13030, 11335, +9332, 7223, 4967, 1256, 467, -1, -2448, -2982, -3292, -6545, -9139, -10704, -13070, -16329, -19957, -22623, +-23978, -25200, -26336, -25576, -24722, -23362, -20384, -17273, -13956, -10970, -7530, -2398, 1970, 3493, 4297, 6463, +8835, 9629, 11256, 14502, 16089, 16197, 18709, 21400, 21230, 19968, 19901, 19487, 18380, 18302, 17572, 15456, +13159, 11111, 7466, 4817, 3949, 1865, -878, -812, -1141, -4114, -5547, -5858, -8416, -12007, -14669, -16772, +-19585, -22710, -24701, -25335, -24885, -24255, -23624, -21809, -19155, -16818, -13953, -9502, -4864, -418, 1940, 2710, +4353, 7379, 10172, 11572, 12610, 13135, 14809, 18175, 21089, 20839, 20835, 22008, 20057, 18016, 18767, 19212, +17425, 14534, 13086, 10605, 6879, 4913, 2999, 803, -524, -2096, -2949, -3482, -6129, -8117, -9601, -12347, +-15921, -19013, -21371, -24461, -26504, -25997, -24602, -24243, -23423, -21678, -19376, -16257, -11944, -6464, -2774, -578, +2337, 3684, 5096, 8998, 11741, 11652, 12214, 14657, 17526, 19223, 20638, 21520, 20008, 19417, 19875, 19272, +18112, 17837, 16130, 13285, 11865, 10798, 8013, 3738, 768, -624, -1127, -304, -1694, -5251, -6770, -7689, +-10132, -13652, -16664, -19664, -22988, -25326, -26018, -26201, -25682, -23266, -21334, -20862, -19018, -14616, -10311, -6835, +-1179, 3166, 3813, 4964, 7281, 10100, 11748, 11839, 12356, 14781, 18049, 20433, 19984, 18910, 20096, 20263, +19411, 19241, 18800, 17207, 15746, 13964, 11070, 8208, 5251, 2875, 845, 105, -234, -2088, -3356, -4301, +-7626, -10187, -11123, -13961, -17922, -21091, -23289, -25393, -26774, -26108, -25333, -25171, -23226, -19369, -15161, -12896, +-9174, -3684, -1654, 503, 4573, 6297, 7774, 10600, 11558, 11687, 13775, 16294, 17677, 19002, 20870, 20752, +19037, 18944, 19819, 19897, 18918, 16472, 14332, 12601, 10437, 7879, 4186, 1833, 1050, -734, -1291, -1019, +-3303, -6069, -7288, -8687, -11548, -15517, -18727, -21343, -24234, -25810, -25753, -25793, -24727, -21980, -19941, -18891, +-17207, -12779, -7263, -2790, 641, 3014, 4229, 6958, 9440, 10382, 11160, 12010, 14366, 16669, 18428, 20789, +20971, 20328, 20897, 20430, 19671, 19067, 18019, 17454, 15050, 11169, 8013, 5193, 3571, 1122, -845, 205, +-433, -3336, -4491, -5862, -8465, -10607, -13021, -15883, -19690, -23053, -25103, -26004, -25726, -24659, -23681, -22982, +-22004, -18585, -14247, -10501, -4082, 73, -201, 1756, 5334, 7331, 8789, 10215, 11175, 11915, 14465, 18035, +19804, 20473, 22187, 20965, 19494, 19691, 19218, 19058, 18304, 15263, 11343, 10236, 9800, 5378, 240, -335, +1503, 670, -835, -2110, -4481, -6870, -8862, -10851, -13797, -17543, -20413, -23250, -25154, -25050, -25016, -25331, +-24363, -21971, -18708, -15722, -13151, -9536, -3644, 1358, 2131, 2159, 5047, 7691, 8979, 10020, 10296, 12722, +16799, 18110, 19068, 19850, 19440, 20584, 21319, 20093, 18321, 17636, 17052, 14478, 12059, 10684, 7127, 3736, +2613, 898, -34, -137, -2043, -4219, -5944, -7419, -9764, -12378, -15415, -18915, -22291, -24758, -26000, -26029, +-25696, -25049, -23371, -20157, -16724, -14942, -12664, -7762, -2813, 439, 3088, 4669, 5280, 7087, 9168, 11077, +12642, 14185, 16302, 18745, 19886, 19984, 20308, 20144, 19376, 18758, 17749, 17449, 16692, 14361, 10926, 8220, +5775, 3604, 2397, -76, -298, -217, -2621, -4279, -5069, -7216, -10142, -13767, -17306, -19812, -22329, -24867, +-26424, -26299, -24489, -22156, -21208, -20837, -18692, -14873, -11160, -6235, -1041, 941, 2068, 3639, 6404, 8420, +9907, 12406, 13009, 13964, 16850, 19158, 20107, 20512, 20357, 20017, 19193, 18254, 17134, 16619, 15601, 12274, +8929, 8176, 6706, 3414, -3, -655, 190, -604, -2489, -4398, -6400, -8286, -10869, -14053, -17446, -21126, +-23746, -25165, -25927, -25423, -24409, -23673, -22172, -19821, -17302, -15315, -9677, -2645, -395, 1154, 3269, 5153, +7459, 9415, 10536, 11840, 13516, 15389, 17783, 19780, 20961, 20197, 18472, 18554, 19590, 19725, 18321, 15605, +13749, 12650, 10561, 7553, 4667, 2096, 994, 411, 650, 798, -2502, -5793, -6560, -8028, -11651, -15039, +-17294, -20244, -23701, -25467, -25212, -24676, -24289, -22660, -20846, -19938, -17653, -11824, -6176, -2038, -127, 264, +3628, 6641, 8183, 9177, 9834, 11973, 13966, 15992, 19082, 20191, 19211, 19449, 20304, 20202, 19376, 18654, +17672, 15937, 14782, 13103, 9981, 6751, 4887, 2710, 495, 345, 346, -2014, -4301, -5888, -8121, -10284, +-12201, -15008, -18974, -22610, -24326, -24977, -25565, -25243, -23987, -21805, -20849, -18976, -13889, -10525, -6759, -1220, +530, 1511, 4660, 6782, 7919, 9419, 10725, 12059, 14809, 17458, 18058, 19184, 20396, 20293, 19929, 19310, +18999, 18621, 17577, 16193, 14039, 11911, 9477, 6280, 3597, 1639, 1267, 463, -1445, -2038, -3224, -5513, +-7701, -9991, -12902, -16927, -20561, -23226, -25154, -25708, -24649, -23841, -22778, -20870, -19169, -16871, -14171, -10138, +-5434, -1109, 1587, 2924, 3910, 5347, 8624, 9960, 10183, 12344, 14400, 16885, 19061, 20706, 21233, 20060, +20016, 19931, 18871, 19099, 17936, 14831, 13612, 12541, 8632, 5086, 2576, 749, -137, -37, -663, -3033, +-4836, -6193, -8838, -11844, -15071, -18084, -21137, -24045, -25688, -25908, -24903, -23520, -22400, -22178, -21505, -17481, +-11460, -7914, -4171, 153, 1397, 1796, 4938, 7646, 8709, 10626, 11559, 12678, 15648, 17720, 19136, 19984, +20032, 19576, 18966, 18905, 18755, 18174, 17052, 14384, 11343, 9513, 7242, 3850, 1702, 1464, 958, -327, +-1520, -2623, -5033, -7655, -9378, -11559, -14955, -18877, -22329, -24838, -26076, -25444, -24118, -23404, -23273, -22029, +-18663, -14369, -11431, -8368, -2692, 772, 1956, 4543, 6269, 7470, 9152, 9959, 11256, 13763, 16320, 17815, +18597, 19507, 19939, 20122, 20632, 19521, 17759, 17429, 16445, 14045, 11557, 9409, 6607, 4048, 2686, 388, +-170, 577, -1078, -4191, -6328, -7563, -9717, -13545, -17766, -20694, -22663, -24611, -25838, -25619, -24901, -23974, +-22489, -20831, -18023, -15379, -9843, -4181, -2471, -42, 2776, 3930, 6278, 7834, 8780, 9763, 11529, 14245, +16386, 18833, 20686, 19522, 19207, 19889, 19630, 18842, 17963, 16625, 15373, 13811, 10742, 7069, 5538, 5039, +2381, 603, 39, -655, -2374, -3855, -5329, -7723, -10467, -13748, -17459, -20740, -23978, -25557, -25178, -24414, +-23801, -22510, -21191, -19853, -17564, -13520, -8329, -3705, -598, -104, 2160, 5331, 6513, 7841, 8774, 10721, +12654, 14295, 17347, 19697, 19823, 19601, 19654, 19364, 19803, 19483, 17791, 16693, 15633, 12796, 10199, 7795, +4869, 3075, 1122, 583, 282, -1505, -2788, -4278, -6812, -9189, -11579, -14979, -18825, -22117, -25063, -25847, +-24991, -24043, -23917, -23847, -22018, -18456, -15759, -12915, -7185, -2345, -493, 1198, 3447, 5610, 6795, 8139, +9754, 11290, 13151, 15943, 17970, 18921, 19722, 19717, 19392, 19841, 20020, 19881, 18244, 15457, 13104, 12393, +11995, 7757, 3573, 1636, 810, 1142, 483, -1113, -3375, -5779, -7596, -9082, -11950, -16312, -19964, -23138, +-25043, -25226, -24394, -24274, -23899, -21775, -19936, -19041, -17184, -10420, -3736, -1733, -459, 187, 3153, 6697, +7536, 8595, 10382, 12235, 13768, 15369, 17798, 19055, 19347, 19780, 19611, 19842, 20330, 19682, 17478, 14868, +13329, 11870, 8854, 5790, 4582, 2182, -73, 666, 62, -2681, -4039, -5334, -8512, -11383, -13317, -16756, +-21116, -24048, -25184, -25491, -24911, -23309, -22641, -22605, -20733, -16523, -13190, -10253, -4730, -1325, 141, 3051, +4840, 5720, 7054, 9327, 10372, 10771, 14511, 18071, 18249, 18869, 19838, 19831, 20390, 19872, 18823, 18184, +16871, 14164, 11001, 11138, 10577, 5777, 1544, 517, 1494, 871, -942, -1203, -3177, -6862, -8636, -10604, +-14588, -18726, -21680, -23583, -24877, -25004, -24631, -23883, -22454, -21247, -19832, -17514, -11485, -5935, -4030, -525, +1806, 1932, 4032, 7080, 8525, 8693, 10595, 13643, 15140, 16981, 19053, 19319, 19892, 20275, 19616, 20149, +19851, 17855, 15801, 14714, 13222, 9225, 6289, 5526, 4447, 1886, 6, 474, -1257, -4155, -4718, -6634, +-10328, -12914, -15131, -19215, -23321, -25437, -25832, -25147, -24344, -24163, -24213, -21649, -16642, -13409, -10879, -5560, +-1813, -873, 1316, 4043, 5533, 6982, 9416, 10908, 11694, 12187, 16372, 19150, 18538, 19970, 20183, 19760, +19422, 18989, 19299, 18312, 15383, 12216, 10987, 11235, 8401, 3537, 2086, 1952, 787, -613, -1670, -3200, +-5483, -7929, -10628, -14567, -18281, -21293, -23338, -24709, -25890, -25600, -23627, -22353, -21254, -19524, -17801, -13370, +-7742, -3774, -1186, 588, 1679, 3008, 6384, 8595, 9152, 10321, 13004, 14829, 15491, 18619, 20612, 19545, +18873, 19756, 20144, 19294, 18713, 17575, 15791, 13411, 10920, 8908, 7357, 4988, 2044, -228, 341, 792, +-2306, -4547, -6234, -9255, -12834, -15446, -18651, -22242, -25077, -26131, -25759, -24832, -23547, -22899, -21970, -18043, +-14041, -13040, -8315, -1722, -603, -95, 2353, 4565, 5937, 7912, 10248, 11256, 11496, 14514, 17614, 18918, +19245, 19294, 20370, 20527, 19323, 19291, 19320, 17104, 13675, 11831, 12161, 9924, 5413, 2211, 748, 1131, +772, 195, -1864, -5384, -8266, -10016, -13091, -16819, -19809, -22765, -25562, -26322, -24996, -23516, -22877, -22164, +-20713, -19803, -15905, -9165, -5379, -2648, -22, 759, 2018, 5205, 8346, 8098, 9043, 11445, 13408, 14807, +17046, 18787, 19668, 20118, 19982, 20744, 20372, 18932, 17716, 17218, 15562, 12138, 10041, 8329, 6390, 3881, +1179, 931, 372, -2024, -4026, -5930, -8835, -11945, -14839, -17798, -21592, -25343, -26089, -25321, -24824, -24567, +-24264, -22636, -19390, -16194, -14438, -10030, -4200, -1946, -1132, 894, 3937, 5294, 6598, 9091, 9804, 10666, +13043, 16479, 18069, 18915, 18981, 19194, 20188, 20600, 20915, 20202, 17744, 16320, 15644, 13353, 10473, 7305, +4759, 3890, 3109, 1062, -570, -2591, -5039, -6675, -8915, -12216, -15396, -18362, -21935, -24604, -25651, -25336, +-24323, -23599, -23389, -22350, -19705, -15510, -11578, -8571, -4107, -1495, -307, 1353, 4442, 6675, 7357, 8120, +9577, 11802, 13027, 15594, 18902, 19661, 20154, 19955, 20137, 20367, 20757, 20449, 18593, 16087, 13167, 10923, +10996, 9848, 4542, 1138, 2880, 2697, -1196, -3220, -5371, -7701, -9778, -13811, -17059, -19850, -24095, -26160, +-25964, -25570, -24523, -23231, -22701, -21663, -18460, -14044, -11264, -8304, -2768, 535, 292, 1115, 3660, 6409, +8407, 8517, 9351, 12104, 15093, 17191, 17937, 18215, 18669, 19803, 20821, 19962, 19427, 19747, 18375, 15475, +13311, 12269, 10864, 8261, 5034, 1610, 44, 1033, 191, -2946, -6033, -8833, -11613, -15103, -18120, -19914, +-22481, -25559, -26606, -25410, -23891, -22749, -21235, -20822, -18653, -13591, -9560, -4138, -1513, -2285, 153, 3012, +4698, 5910, 7109, 8750, 10008, 12427, 14791, 16833, 18261, 18860, 18690, 19278, 20303, 19829, 19649, 19632, +17432, 14667, 13952, 12143, 9797, 7524, 3885, 1040, 1409, 963, -1973, -4520, -7059, -9885, -12279, -14795, +-18936, -22948, -25126, -26050, -26207, -24893, -23227, -22190, -21017, -19406, -18336, -13726, -7209, -3768, -2566, -1354, +1325, 3036, 4432, 6600, 8173, 9771, 9805, 10830, 15786, 18326, 17762, 17407, 17921, 19860, 21455, 21147, +20109, 18549, 16261, 14433, 13990, 13011, 8420, 4262, 3148, 1707, 1200, 705, -2440, -5276, -8247, -10990, +-12255, -15483, -20574, -24169, -25250, -25407, -25067, -24329, -23280, -22093, -21319, -19590, -15978, -10129, -5688, -4771, +-3502, -582, 2000, 3938, 5005, 6431, 8229, 8924, 10503, 13139, 15968, 17415, 17429, 18624, 19259, 20272, +22228, 22000, 20818, 18675, 16040, 15407, 14199, 10978, 7640, 4355, 2930, 2004, 284, -895, -3495, -6143, +-8394, -11354, -13864, -17281, -21292, -24200, -25992, -26172, -24970, -23838, -22899, -23303, -20617, -17515, -15091, -8990, +-4956, -4819, -1941, 781, 2807, 4579, 5701, 6601, 7082, 8486, 11889, 15064, 15929, 17119, 17909, 19930, +20574, 21126, 22343, 21165, 19167, 17361, 16774, 15491, 13192, 10224, 6586, 4587, 2482, 376, 679, -948, +-4049, -6615, -9202, -11385, -14567, -18261, -21778, -24192, -25266, -24318, -24134, -23535, -22362, -21995, -20170, -16181, +-13803, -9366, -4288, -1631, -551, -125, 2848, 4867, 5786, 6651, 7293, 10183, 12531, 14519, 16848, 17395, +18853, 19262, 20023, 22294, 22605, 21126, 18957, 18073, 16813, 14773, 13158, 10030, 5164, 2584, 2356, 2213, +820, -1852, -4796, -7483, -9880, -12223, -15454, -19146, -22401, -24814, -25422, -25180, -24250, -23114, -22762, -21128, +-18619, -16318, -12720, -8445, -4104, -1330, -942, -296, 2756, 5531, 6341, 6678, 8092, 10228, 12609, 15300, +16770, 17682, 19208, 20047, 21050, 22313, 22044, 21203, 19082, 17312, 16746, 14646, 10926, 9043, 6299, 2444, +2037, 1697, -716, -3197, -6066, -7714, -9381, -13336, -16143, -19051, -22812, -25071, -25667, -24594, -22742, -22674, +-22689, -21358, -18446, -15029, -11664, -5993, -3910, -2973, -1484, 839, 4150, 5623, 5499, 6880, 8479, 10175, +13439, 16610, 17448, 18440, 19540, 20410, 21723, 22240, 22364, 21632, 18975, 17163, 15658, 14563, 11561, 6184, +4499, 3001, 1091, 1368, -1519, -4374, -5799, -7688, -11579, -15308, -17335, -19652, -23046, -25483, -25992, -25376, +-23459, -22179, -23116, -21974, -17438, -13678, -10466, -7083, -4349, -3675, -1694, 2264, 3731, 5386, 6761, 6571, +8619, 11097, 14904, 17201, 17386, 18421, 19504, 21045, 21952, 22581, 21853, 20275, 19174, 17293, 15040, 12568, +10501, 7019, 2814, 1771, 1247, 769, -1555, -5236, -7161, -9078, -11411, -13997, -17744, -21392, -23704, -25331, +-24846, -24092, -23052, -22014, -21833, -20583, -18168, -13379, -8606, -5743, -3924, -1666, 941, 2485, 3980, 5677, +5362, 7236, 10109, 12383, 15663, 16968, 17990, 19036, 19785, 22262, 22861, 22025, 21887, 19485, 17360, 16543, +15975, 13048, 9427, 5381, 2131, 1978, 2110, 873, -1984, -6211, -8527, -9238, -11989, -16241, -19659, -22681, +-24599, -24759, -24829, -23929, -23903, -23702, -22125, -19377, -15233, -13939, -10714, -5120, -2007, -755, 573, 2591, +4043, 4947, 6487, 9128, 10900, 13045, 15233, 16547, 17292, 18927, 20944, 22969, 23283, 21971, 21593, 20185, +17878, 16076, 14308, 11946, 8199, 4501, 2284, 2605, 2216, -744, -3579, -6288, -7655, -9501, -13079, -15965, +-18799, -22243, -25442, -25892, -24037, -23307, -23387, -22657, -21688, -19094, -15184, -12841, -8590, -3336, -2290, -1291, +1629, 3277, 3781, 5819, 7858, 9082, 11423, 13200, 15486, 18246, 18975, 20226, 21472, 21419, 22713, 22313, +20197, 18839, 17839, 15588, 12795, 10913, 7419, 3421, 2044, 1868, 69, -1942, -4245, -6152, -7808, -10690, +-13855, -16845, -19827, -23580, -26554, -26056, -25126, -23510, -22567, -23064, -21636, -19186, -14882, -10216, -7080, -3615, +-2058, -1358, 1490, 4049, 4214, 5468, 7265, 9222, 11317, 13683, 16828, 18663, 18360, 19580, 21790, 22219, +22077, 21103, 19863, 19506, 17582, 14698, 12722, 9513, 5168, 2246, 2228, 2402, 1179, -1513, -4612, -6964, +-8223, -10331, -14015, -17603, -20652, -23612, -25048, -25129, -24352, -22857, -23266, -23532, -19999, -17253, -14596, -9213, +-7040, -4065, -880, -898, 1705, 4152, 4756, 5630, 7388, 9652, 12626, 16251, 16991, 17432, 19254, 20112, +21852, 22863, 22330, 21311, 19177, 17802, 16222, 14114, 12364, 9691, 5408, 2032, 1864, 1985, 139, -3031, +-5596, -6565, -8829, -12037, -15232, -19109, -22560, -24313, -25600, -25649, -23843, -23896, -24077, -22475, -19623, -16331, +-13849, -8779, -4215, -5078, -3065, 1555, 3347, 4472, 5788, 6484, 7645, 10359, 13282, 15556, 16938, 17958, +19586, 21818, 21932, 21748, 21990, 21453, 19771, 18059, 15015, 13254, 11962, 8538, 5299, 1719, 1726, 1886, +-340, -2692, -4996, -8154, -10306, -12789, -16046, -20483, -23173, -24095, -24659, -24103, -24552, -24431, -22484, -20647, +-18319, -16060, -13094, -8297, -3372, -3118, -1138, 1509, 2959, 3546, 6484, 8052, 8590, 10631, 13644, 15253, +17790, 18301, 19901, 22596, 22000, 22296, 21393, 19837, 19625, 17333, 14458, 12924, 11141, 7709, 4221, 2900, +1789, 481, -1447, -3180, -5600, -8872, -11208, -13738, -16131, -19732, -22859, -24967, -25181, -24426, -24114, -22897, +-22611, -21474, -18339, -14812, -10839, -7560, -5251, -3327, -1503, 2359, 3006, 3411, 5604, 7674, 9868, 11687, +14117, 15680, 18457, 20396, 20667, 21676, 21524, 21317, 21790, 19756, 17715, 16950, 16423, 13694, 10049, 6368, +2669, 2192, 2143, 1329, -614, -4371, -6979, -8373, -10936, -14728, -18001, -20328, -23259, -24064, -24701, -24326, +-23182, -23846, -23045, -21176, -18426, -14175, -9778, -6002, -3907, -1370, 478, 1273, 3529, 5014, 6521, 7911, +10647, 12951, 15229, 17376, 18213, 20293, 20781, 21211, 22495, 21354, 20341, 20157, 18282, 15712, 15034, 13154, +9603, 6591, 3245, 1894, 2126, -312, -3002, -5081, -7453, -9686, -12236, -15227, -18506, -21839, -24636, -25556, +-25179, -24232, -23597, -23923, -22958, -19036, -15484, -13476, -8911, -5814, -4133, -1572, 162, 3080, 4441, 5352, +7414, 8832, 11259, 13070, 14688, 16993, 18248, 20449, 20854, 21314, 21840, 20831, 20570, 20124, 18312, 15345, +13426, 12330, 8368, 5155, 1986, 943, 1198, -691, -2356, -4749, -7916, -10244, -12175, -15433, -19440, -21988, +-23835, -24906, -25058, -24214, -22759, -23178, -22096, -18648, -15551, -11597, -8290, -6182, -3996, -1217, 1751, 3016, +4728, 6559, 7830, 9493, 11247, 13937, 15615, 17374, 19412, 20742, 21266, 21606, 21611, 20109, 19514, 19630, +18770, 15801, 11743, 10976, 9244, 4184, 1422, 631, 1126, 1, -3347, -5717, -8001, -10864, -13663, -16546, +-20634, -23954, -25120, -25499, -25011, -23666, -24118, -23967, -21867, -18765, -15071, -11544, -6882, -5270, -4002, -524, +1365, 2804, 5439, 7110, 8481, 10262, 11731, 14249, 16032, 18200, 20299, 20120, 20616, 21203, 21923, 22260, +20493, 18232, 16853, 14644, 11841, 9919, 7640, 3618, 696, 1542, 1208, -1054, -3584, -6580, -8583, -11256, +-14960, -16934, -19546, -23213, -24956, -25181, -23953, -23723, -24179, -23208, -20445, -15295, -13637, -12575, -7331, -3390, +-1453, 912, 2066, 2887, 4884, 7703, 9577, 11634, 12390, 13763, 17447, 18557, 19982, 21773, 21384, 21440, +21220, 19633, 19213, 18913, 17322, 14465, 11721, 9919, 4504, 927, 2710, 2246, -196, -2150, -4491, -6522, +-8605, -11495, -14725, -18370, -21070, -23037, -24437, -24266, -24756, -24339, -22584, -21811, -22131, -18077, -13729, -10534, +-3036, -2316, -3198, 44, 2407, 3792, 6375, 8011, 9133, 11797, 13023, 14689, 16998, 18607, 21140, 21753, +20553, 21490, 22097, 19710, 18578, 18021, 15619, 12977, 10236, 9051, 4975, 2165, 2509, 1731, 127, -2005, +-4335, -6709, -8664, -11447, -15478, -19065, -21818, -23701, -24504, -24885, -24906, -23738, -22696, -21085, -19499, -16249, +-12643, -9143, -4046, -2382, -1495, 1437, 3144, 4383, 6870, 8202, 8658, 11188, 13654, 16518, 18927, 18373, +19522, 21126, 21196, 20823, 21455, 21072, 18632, 16454, 15990, 13983, 10141, 7704, 3948, 685, 1135, 2466, +665, -2352, -5234, -7414, -9657, -12474, -16006, -19752, -23723, -25108, -24860, -25205, -24710, -23923, -23356, -22117, +-19104, -14354, -11389, -8215, -3846, -3306, -1976, 1913, 3622, 4961, 6498, 7903, 9463, 11776, 13838, 16344, +18559, 19347, 20108, 20558, 21686, 21395, 20273, 19485, 18071, 16778, 15193, 11761, 9179, 8023, 4887, 1267, +1877, 1397, -647, -2479, -5629, -8540, -11005, -14001, -16934, -19550, -23226, -25345, -24855, -23464, -23768, -24762, +-23748, -20556, -16910, -13852, -10658, -6741, -4873, -3671, -575, 2106, 4416, 6081, 6654, 8020, 9233, 12539, +14833, 16817, 18094, 18339, 19710, 21835, 21999, 21821, 20164, 19015, 17577, 17836, 15241, 11218, 8532, 5760, +3672, 2003, 2073, 1654, -1151, -3956, -6145, -8723, -11062, -13816, -17102, -20956, -23636, -24565, -24599, -24255, +-24442, -23317, -21572, -20246, -18658, -15154, -10710, -7177, -4196, -2585, -172, 2577, 4206, 5139, 7597, 9587, +9993, 12042, 14705, 17420, 20595, 20491, 19957, 20245, 20294, 21753, 20535, 17325, 17215, 17559, 15635, 12117, +8178, 4179, 2558, 2717, 1944, 1007, -1034, -3701, -5867, -8934, -12202, -14553, -17538, -20805, -22601, -23774, +-24102, -24601, -24958, -23213, -21247, -19664, -17286, -13006, -9296, -7085, -3177, -1243, -850, 2442, 5311, 6489, +7268, 8861, 11568, 13377, 15416, 17451, 19087, 20202, 20531, 21074, 20769, 19916, 20788, 20662, 17753, 14655, +13612, 12747, 8261, 3778, 2831, 2623, 2154, 1094, -1750, -4767, -6714, -8722, -10948, -14011, -18126, -21767, +-23573, -24114, -24437, -24297, -23389, -23696, -22236, -18920, -16564, -13434, -9163, -5736, -3876, -1540, 558, 2836, +5565, 7105, 7703, 9163, 11145, 12849, 14874, 18273, 20008, 20473, 19696, 19323, 20285, 20323, 20544, 19222, +17264, 16252, 13597, 10514, 7242, 3772, 3521, 3608, 1247, 90, -1422, -3996, -6174, -8360, -11490, -14633, +-18367, -22064, -24345, -24482, -24187, -24659, -24174, -22677, -21101, -19177, -16143, -12939, -8926, -4923, -3358, -2081, +1204, 4402, 6394, 7333, 7184, 7839, 10384, 13399, 16207, 18319, 18302, 19085, 21101, 21647, 21368, 20217, +19112, 18631, 17374, 15471, 13190, 10321, 7359, 4048, 2885, 3725, 2085, -248, -2109, -4802, -7059, -9552, +-13004, -15946, -18454, -22004, -24730, -25440, -24529, -23343, -23816, -24627, -22267, -18164, -15086, -13096, -10381, -5648, +-2741, -908, 1456, 3473, 4603, 6503, 8800, 9637, 11898, 14320, 16047, 18202, 18341, 19135, 20614, 21254, +21025, 20201, 19506, 18011, 15927, 14478, 12425, 9603, 6624, 3995, 2485, 2669, 2310, -361, -3067, -4788, +-7420, -9712, -12255, -16084, -19191, -22602, -24782, -24264, -24458, -24775, -23027, -21771, -20972, -18435, -16210, -13235, +-7103, -4896, -3757, -196, 2207, 4279, 5216, 6389, 7594, 9595, 12419, 14398, 16982, 18767, 19678, 19928, +20142, 20726, 21199, 20108, 19097, 18378, 16652, 14817, 12567, 8368, 5219, 3515, 2279, 3219, 1867, -1253, +-3323, -5422, -7671, -10071, -14097, -17168, -18877, -21695, -24806, -24841, -24630, -24118, -22883, -23116, -21154, -17792, +-14851, -11092, -8257, -5355, -1903, 476, 1830, 3144, 5212, 7136, 8312, 10406, 12573, 14608, 17315, 18123, +19396, 21051, 20977, 21114, 20686, 20107, 19015, 17366, 15941, 13998, 10895, 8970, 5999, 3901, 2725, 1908, +1407, -895, -3789, -5731, -7526, -9521, -13203, -17495, -20544, -22857, -23648, -24420, -25047, -23439, -22124, -21350, +-19526, -17713, -15248, -11844, -6990, -3311, -1904, 6, 2904, 4608, 6074, 7495, 9090, 10524, 12880, 15339, +17648, 18947, 20338, 20133, 20226, 20922, 20377, 20255, 19427, 16889, 14151, 13162, 11784, 9570, 6101, 2710, +1382, 1162, 548, -616, -3497, -6803, -9332, -11285, -13876, -17115, -20327, -22871, -24646, -25176, -23492, -23264, +-23874, -22236, -19312, -17304, -13898, -11637, -7790, -2003, -982, -427, 1678, 4132, 7459, 8404, 8785, 9770, +13382, 16735, 18045, 19713, 20025, 19111, 20566, 21378, 20461, 19101, 17990, 16861, 14812, 12663, 10356, 7379, +3481, 2676, 3043, 1685, 483, -1833, -4602, -6775, -8620, -10987, -13891, -17214, -20331, -22480, -24510, -25135, +-23704, -23185, -23738, -23248, -20500, -16668, -12780, -8969, -6149, -4684, -2128, 1728, 3489, 4960, 7179, 7899, +9501, 11926, 14107, 16687, 18488, 19560, 19449, 19531, 20894, 21592, 20283, 17821, 17241, 17207, 15326, 12310, +8220, 5450, 4470, 2657, 2231, 1673, -258, -2330, -4384, -6222, -8525, -10876, -14652, -18797, -22022, -23928, +-24748, -24933, -24678, -24379, -23745, -22163, -19055, -16768, -14307, -9286, -5087, -3245, -670, 2054, 3786, 4872, +6366, 7841, 9831, 13004, 15328, 17328, 18103, 18616, 19700, 20575, 20245, 20204, 20091, 18596, 16955, 16673, +14676, 10752, 8598, 6661, 4615, 3462, 2264, 1068, -424, -3099, -4683, -5935, -8581, -12636, -16189, -18333, +-21082, -24007, -25055, -24701, -24796, -24751, -23483, -20919, -18223, -15474, -11930, -7705, -5022, -2372, 199, 2260, +4331, 5142, 7402, 9724, 10937, 12350, 14007, 16338, 18779, 19977, 20122, 19712, 19400, 19798, 20301, 19068, +17778, 16546, 13353, 11513, 10062, 6589, 3404, 2383, 2286, 1214, 83, -1970, -5692, -8096, -9979, -12958, +-16715, -19944, -22315, -24271, -25087, -25699, -24935, -22930, -22539, -21082, -17873, -16213, -12576, -6512, -3338, -2032, +-42, 1586, 3957, 6903, 7575, 8517, 11017, 13207, 15326, 17371, 19222, 20051, 20167, 19780, 20255, 20799, +20118, 18627, 17205, 15886, 13712, 11427, 7966, 4930, 3878, 2235, 1770, 1794, -875, -3821, -5610, -7974, +-10501, -13444, -16899, -19936, -23506, -25609, -24769, -24080, -23986, -23061, -21285, -19987, -17861, -15591, -12008, -6188, +-2464, -1617, -1010, 1146, 4358, 6588, 8438, 9901, 10846, 13208, 16250, 18483, 19291, 20100, 20488, 20186, +20107, 20216, 19906, 18815, 16664, 14465, 13241, 10626, 7032, 3925, 2623, 2692, 1649, 320, -842, -3970, +-6807, -8420, -10312, -13304, -17718, -21148, -23158, -25033, -25381, -23893, -23554, -24352, -23657, -20650, -17656, -14918, +-11429, -6481, -2791, -1278, 31, 2051, 5187, 6938, 8455, 9797, 11237, 13875, 15600, 18451, 19808, 19606, +19890, 19639, 20171, 20283, 19269, 18259, 15633, 13387, 12174, 9586, 6058, 4547, 3492, 2613, 1605, -675, +-2173, -3327, -5387, -8038, -11000, -14516, -17374, -20753, -23494, -25015, -24879, -23917, -23314, -23185, -22427, -20988, +-17875, -12064, -8561, -7264, -4529, -1285, 1823, 4361, 5544, 6848, 8278, 10299, 12896, 15436, 17081, 17783, +19470, 19916, 20030, 19759, 19863, 19861, 18824, 17999, 16417, 13627, 11162, 9886, 6260, 3404, 3746, 2819, +1528, 502, -2489, -5030, -6604, -7989, -10720, -15378, -18806, -21392, -23036, -24751, -25546, -25530, -24218, -23195, +-22801, -20381, -16179, -13912, -9441, -4757, -2201, -948, 976, 3515, 5153, 6891, 8116, 10569, 12727, 13962, +16382, 18997, 19587, 20555, 20474, 19513, 20290, 20356, 19267, 18202, 15932, 12521, 10503, 9249, 6779, 4203, +3098, 2033, 711, -206, -1889, -3851, -5809, -8634, -11865, -15009, -19049, -22339, -24011, -24890, -24670, -23260, +-22775, -23173, -21208, -18873, -17448, -12532, -6279, -3930, -2164, -556, 1179, 3545, 5620, 7499, 9148, 10488, +11915, 14947, 18311, 19443, 19377, 19600, 20280, 20338, 20127, 19884, 19221, 17362, 15449, 13920, 10646, 7933, +7423, 4261, 845, 1281, 1461, -124, -1907, -4607, -7129, -9858, -13003, -15408, -18287, -22143, -24700, -25313, +-25122, -23807, -22676, -22253, -21688, -19358, -16244, -12435, -6072, -3243, -3439, -1485, 1228, 4337, 6520, 7912, +8718, 9381, 12044, 15714, 18191, 19834, 20061, 18804, 19657, 20479, 20602, 21108, 19199, 15922, 14308, 13832, +11802, 8945, 5837, 3476, 2367, 1794, 428, -616, -2847, -4381, -6864, -9901, -12324, -15455, -19590, -23464, +-25341, -24705, -23287, -23104, -22854, -21494, -20808, -20080, -15704, -11082, -6991, -2877, -2376, -1921, 1857, 5554, +7613, 8173, 8435, 9805, 12880, 15837, 18102, 19267, 19939, 19305, 18900, 20309, 20816, 19577, 18283, 16635, +14444, 12886, 10912, 8524, 6046, 2402, 1227, 2173, 1419, -706, -3346, -5188, -7211, -10500, -13488, -16135, +-19844, -23082, -25349, -25796, -24174, -23705, -23206, -23009, -21108, -17429, -14749, -10550, -5864, -4550, -2451, 510, +2628, 4809, 6145, 8430, 10143, 10720, 13491, 16239, 17322, 18929, 19213, 18881, 19335, 20164, 21029, 20113, +17209, 14833, 14201, 14043, 11474, 6803, 5207, 3006, 1233, 1727, 574, -1539, -2975, -5169, -8163, -10622, +-13356, -16944, -20617, -23498, -24836, -24306, -23739, -23673, -23067, -21777, -21456, -18763, -13479, -8489, -4262, -3759, +-2353, 1014, 3951, 6404, 6409, 6515, 9603, 12106, 14001, 16579, 17161, 17994, 19372, 19837, 19635, 19972, +20978, 20166, 18529, 15596, 12509, 11951, 9982, 6599, 4379, 2090, 1673, 1984, 539, -976, -3534, -6031, +-7733, -10787, -14644, -18358, -21625, -23895, -24909, -24570, -24788, -24240, -22698, -22158, -20495, -17024, -12246, -8068, +-6063, -3414, -541, 1343, 3167, 5331, 6709, 7771, 9498, 11860, 14906, 16234, 17307, 18475, 19339, 20507, +20323, 19616, 19165, 19438, 18278, 14795, 13447, 13003, 9473, 4780, 2814, 2905, 2531, 1872, 263, -1561, +-3356, -5830, -8304, -11366, -14282, -18149, -21979, -23777, -24044, -23812, -23101, -22978, -22866, -22109, -19404, -15364, +-11218, -9254, -6793, -1612, 779, 970, 3217, 4960, 6055, 8063, 10060, 12109, 14670, 16223, 17594, 19910, +20765, 20422, 20333, 20784, 20283, 18643, 16361, 15062, 13634, 12086, 8559, 5451, 3832, 2436, 1525, 411, +-191, -1576, -3613, -5749, -8320, -11698, -15929, -19860, -22000, -22996, -23620, -23901, -23833, -23775, -22691, -21440, +-20222, -16320, -11399, -8224, -5995, -2023, 1113, 1101, 2448, 4639, 7156, 8451, 10088, 12824, 14519, 16743, +18915, 19828, 20574, 20789, 20372, 20752, 20156, 17854, 15469, 14439, 13980, 11301, 6509, 4172, 4407, 2288, +665, 1195, 112, -2382, -3943, -5873, -8723, -11917, -15396, -18416, -20796, -22998, -24071, -23928, -23465, -23883, +-23677, -21272, -17684, -14931, -12248, -8553, -4169, -1156, -160, 1458, 3534, 5537, 7534, 9731, 11491, 12390, +14424, 16809, 18558, 20422, 21327, 21469, 20505, 19494, 18850, 17475, 15319, 13563, 12143, 11025, 8481, 4441, +2633, 3161, 1960, -76, -1005, -1568, -3627, -6210, -9049, -12580, -16366, -19807, -21823, -23370, -24606, -25111, +-24475, -23312, -21285, -20878, -20234, -15895, -11552, -7694, -3799, -1489, -917, 742, 3517, 6720, 7902, 8617, +11593, 13901, 15556, 16973, 18552, 20163, 20374, 20308, 19567, 19163, 18727, 17774, 16938, 15217, 12062, 9606, +6958, 4461, 3351, 1722, 1991, 2067, -613, -2687, -3836, -5987, -9545, -13151, -15992, -18706, -20898, -22867, +-24219, -24617, -24126, -23595, -22756, -21314, -18420, -14627, -10285, -7578, -4507, -1375, -890, 1722, 4576, 6240, +8024, 10073, 11409, 12572, 15542, 18552, 19431, 20066, 21084, 20830, 19643, 18900, 18340, 17480, 15536, 13197, +12172, 11114, 8220, 4765, 2070, 1438, 2114, 1078, -110, -1975, -5112, -7360, -10047, -13405, -16831, -19895, +-22251, -23279, -24536, -25165, -24242, -23213, -22165, -19468, -16929, -15212, -11926, -7419, -3196, -1359, -327, 1724, +4095, 6522, 8918, 9460, 11019, 13529, 15245, 17783, 19627, 19979, 20255, 19897, 19690, 18942, 18494, 17871, +16343, 15176, 12922, 10102, 6719, 3744, 2735, 1528, 1092, 836, -1302, -3311, -4938, -7827, -10487, -13448, +-15786, -18369, -22446, -24473, -24124, -23822, -23782, -23334, -22628, -20419, -17229, -14249, -10551, -5421, -2547, -2342, +-510, 1722, 4300, 7074, 8535, 9668, 10977, 12999, 15878, 19165, 20322, 20122, 20028, 19702, 19558, 18864, +18266, 17722, 15975, 13788, 11812, 9128, 6429, 4518, 2892, 2213, 1542, -16, -1448, -3076, -5546, -8144, +-11218, -14512, -17569, -20611, -23134, -24531, -24589, -24237, -23807, -23670, -22849, -20249, -17554, -14427, -9245, -5761, +-4982, -2135, 776, 2764, 5505, 7027, 8117, 10035, 11413, 13525, 16381, 18636, 19758, 19435, 19255, 19800, +20186, 19603, 18653, 16949, 14962, 14112, 12553, 9210, 5978, 3992, 2715, 2173, 1668, 175, -1742, -4010, +-5853, -7684, -11941, -15711, -17966, -20580, -23409, -24848, -25369, -24861, -23516, -22548, -22324, -20519, -16623, -14101, +-10262, -4662, -2386, -1121, 1244, 2933, 4724, 7404, 9414, 9926, 11561, 14254, 16828, 19150, 20120, 19926, +19456, 19227, 19940, 19999, 18500, 17370, 16057, 13657, 10699, 8825, 7090, 3603, 1983, 2421, 1850, 167, +-2140, -4591, -6610, -8979, -11692, -14780, -18145, -21062, -23499, -24914, -25081, -25234, -24090, -21247, -20995, -20728, +-16710, -11756, -8630, -5756, -2862, -1516, 497, 3374, 7025, 8003, 7756, 9416, 11908, 14873, 17155, 19502, +20798, 19813, 19508, 20081, 21036, 20583, 18029, 16329, 15198, 13139, 11896, 9916, 6853, 3855, 280, -95, +1697, 302, -2398, -5148, -7471, -9061, -11365, -14364, -17874, -21573, -23780, -24776, -24361, -22899, -22401, -22978, +-22461, -18818, -15035, -12644, -7685, -3153, -2459, -1760, 171, 3651, 7003, 7249, 7787, 10687, 12697, 15680, +18700, 19916, 19716, 19141, 20321, 20938, 20061, 18874, 19359, 18983, 16092, 13203, 11445, 7846, 5071, 2997, +883, 1850, 2071, -459, -3007, -5639, -7756, -9383, -11765, -15231, -18881, -21613, -23717, -24567, -24393, -24093, +-23499, -22206, -20648, -19057, -16166, -9630, -6774, -4883, -2347, -1233, 900, 4143, 5900, 6908, 8387, 10701, +12720, 15515, 17696, 19577, 19998, 19577, 20410, 21407, 21607, 20353, 19017, 17027, 14863, 12591, 11046, 8551, +4676, 2880, 2899, 1040, 64, -381, -3027, -4802, -6497, -9988, -13292, -16031, -19186, -22226, -24061, -24417, +-23424, -22578, -23374, -22679, -19724, -17732, -15217, -10711, -5873, -4412, -2766, -278, 2129, 4581, 6116, 7688, +9635, 10146, 12204, 16547, 17948, 19300, 20226, 20653, 21277, 20073, 20585, 21225, 18898, 16497, 13692, 12177, +12747, 8706, 2829, 1721, 2778, 1838, -312, -1650, -2865, -5110, -7806, -10749, -13783, -17333, -20982, -23219, +-24815, -25008, -23726, -22867, -22446, -21767, -21022, -18437, -14860, -10204, -6506, -4796, -1792, 1089, 1038, 3429, +6836, 7970, 8798, 10629, 13813, 16904, 19009, 19324, 19712, 20464, 20677, 20611, 20265, 19402, 17800, 15135, +14350, 13610, 10616, 7533, 3958, 1893, 2407, 1621, 665, -871, -4730, -6628, -8079, -10854, -13564, -17351, +-20874, -23237, -24075, -23804, -23593, -23516, -22868, -21704, -19744, -16572, -12696, -9679, -6298, -3690, -2085, -401, +2471, 4395, 6242, 9060, 8986, 11363, 15263, 17157, 18499, 19119, 19499, 20854, 20810, 20643, 21038, 20177, +16687, 13923, 13568, 12334, 10679, 7870, 3430, 1412, 2308, 1661, 133, -1529, -4703, -7694, -9415, -11183, +-14552, -18479, -21308, -23237, -24085, -23802, -24040, -24344, -23324, -21712, -20026, -16763, -12784, -9703, -7147, -3387, +-1138, -685, 2022, 4848, 6717, 7888, 9438, 12504, 14688, 16696, 18398, 18742, 19550, 20074, 20391, 20909, +20735, 19524, 17092, 16488, 15507, 11833, 9741, 7177, 4119, 2705, 1849, 1970, 468, -1988, -4069, -7017, +-9790, -12291, -14936, -17748, -20831, -23843, -24512, -24015, -23803, -23090, -22216, -21637, -19373, -16231, -12968, -9538, +-6567, -3236, -1710, 228, 3047, 4707, 6284, 8217, 10323, 11898, 14570, 17178, 18204, 19439, 20835, 21225, +21118, 20822, 19749, 18668, 17619, 16588, 14885, 12847, 10291, 6203, 3061, 3144, 2293, 558, -294, -2500, +-4831, -6509, -9755, -12836, -15552, -19196, -21688, -23011, -24148, -23901, -23048, -23069, -22875, -20946, -18911, -17025, +-12586, -9226, -6329, -2760, -1398, 912, 3241, 5148, 7078, 8237, 10758, 12624, 14589, 16696, 19004, 20754, +20667, 20555, 20442, 19974, 20427, 19803, 17476, 15835, 13125, 11088, 9850, 5580, 2837, 3332, 2613, 1327, +-307, -2849, -4626, -6497, -9484, -12658, -15992, -18932, -21398, -23125, -24298, -24112, -23477, -23355, -22861, -21775, +-17991, -14633, -12648, -8306, -4603, -4254, -2755, 1261, 3517, 5446, 7127, 8539, 10148, 12270, 15209, 17344, +18678, 19939, 20944, 20919, 19989, 19877, 19871, 19178, 17507, 14539, 12594, 11647, 9264, 5783, 2718, 2087, +2502, 1348, -695, -2871, -4925, -7640, -10893, -13534, -15518, -18026, -21404, -23888, -24797, -24123, -23706, -23857, +-22526, -20128, -18035, -15546, -12545, -7923, -6279, -3608, -225, 1700, 2862, 4838, 6835, 8825, 10464, 12762, +15334, 17388, 18830, 20001, 20677, 21525, 20822, 20372, 19301, 17462, 16279, 15071, 12524, 10345, 9143, 6934, +3922, 2342, 1750, 408, -521, -2914, -5493, -7970, -10550, -13542, -16037, -19026, -22037, -24347, -24327, -23617, +-22744, -22069, -22367, -21559, -18183, -15615, -12558, -7293, -3299, -2897, -1608, 1048, 3830, 6276, 8035, 9256, +10796, 13162, 15955, 18113, 19411, 20500, 20346, 19717, 19605, 19441, 19731, 19271, 17519, 15777, 13702, 11201, +8063, 4394, 2802, 3120, 3429, 2144, -832, -3910, -5959, -7950, -11000, -13925, -16135, -18568, -21555, -24226, +-25034, -24007, -22881, -22342, -22097, -20812, -17931, -15285, -12892, -7180, -2431, -2630, -2416, 774, 4098, 6116, +7449, 8889, 10658, 12925, 15636, 18047, 19303, 19090, 19484, 20709, 20583, 20076, 19667, 17441, 16292, 14770, +13232, 10582, 8505, 6469, 2235, 1302, 3282, 1823, -1025, -3807, -6176, -7428, -9634, -12669, -15594, -19090, +-22377, -24040, -24263, -23023, -22770, -23217, -22052, -20103, -18784, -15588, -10192, -6259, -4162, -2155, -1006, 1675, +4680, 6299, 7882, 9855, 10579, 12565, 15849, 19154, 20264, 20245, 19061, 18328, 20216, 21268, 19456, 17459, +16288, 15323, 12847, 10381, 7880, 4486, 2227, 1965, 2681, 1448, -1781, -4515, -5731, -7231, -10262, -13730, +-16671, -20353, -23812, -24691, -24562, -23933, -22439, -22508, -23193, -20652, -17216, -14989, -10981, -6870, -4381, -2683, +-619, 2996, 4916, 5877, 7238, 8829, 10876, 12885, 17042, 19076, 18850, 19579, 19485, 19712, 20491, 20149, +18866, 17606, 16707, 14140, 11695, 11234, 7196, 2752, 3100, 2946, 2449, 1448, -1996, -4476, -6216, -8479, +-10161, -13048, -17008, -20650, -22718, -23816, -24412, -23910, -22848, -23172, -22383, -19372, -16003, -14437, -11019, -6244, +-4204, -2328, -65, 1935, 4499, 6903, 7146, 9089, 12223, 13775, 16899, 18234, 18263, 20815, 20740, 19519, +19900, 19754, 19412, 18186, 16344, 13996, 11358, 9385, 7732, 4227, 2528, 3151, 2027, 6, -2282, -4329, +-5775, -7937, -11520, -14999, -17955, -21166, -23368, -24219, -23833, -22996, -23510, -23623, -22053, -18912, -16412, -14547, +-9934, -5823, -3725, -1419, 478, 1786, 4548, 7034, 7991, 9604, 11549, 13939, 17608, 19367, 19366, 20585, +20434, 19727, 19948, 20263, 20767, 18806, 14772, 13173, 12122, 8357, 5940, 5153, 3410, 2653, 1886, 490, +-723, -3482, -6036, -8227, -11395, -14611, -17151, -19981, -22587, -24084, -24737, -23675, -22308, -21870, -20977, -19589, +-17253, -15163, -10017, -4727, -3962, -1534, 1038, 1795, 4762, 7636, 9218, 9938, 12238, 15156, 17452, 19761, +21143, 20653, 20377, 20686, 20633, 20127, 18496, 17049, 15101, 13460, 11989, 9075, 5648, 3245, 2320, 1927, +1587, 627, -1518, -3913, -5871, -8483, -12396, -15165, -17616, -20191, -22778, -24361, -24582, -24363, -23345, -22597, +-21964, -20298, -17943, -13360, -9279, -6355, -3042, -1539, -861, 2946, 6819, 8755, 9294, 9210, 12107, 15496, +17832, 20262, 20963, 20117, 20448, 19855, 19752, 20042, 18677, 15781, 14511, 14414, 11620, 9419, 7207, 3254, +2422, 2629, 1600, 119, -1960, -3750, -5703, -8908, -12289, -15022, -18222, -21518, -23556, -24232, -23946, -24095, +-23833, -23471, -22163, -19085, -16523, -13079, -8499, -6040, -3361, -351, 830, 2208, 5619, 7084, 8237, 11636, +13910, 15867, 16950, 17919, 20171, 21331, 19960, 19247, 20137, 19638, 18631, 17150, 14996, 13375, 11492, 8607, +5465, 3329, 3222, 2886, 1334, -733, -2386, -4689, -7182, -9342, -12716, -16302, -19003, -21448, -23402, -24185, +-24815, -24737, -23811, -23526, -22355, -18118, -15331, -13152, -7767, -4009, -3022, -1131, 1559, 3406, 6687, 8626, +8871, 10744, 13260, 15030, 17439, 19737, 20323, 20648, 20837, 20143, 19325, 19026, 18617, 16979, 14914, 13692, +11180, 7299, 4639, 3253, 1005, -414, -521, -1395, -3472, -5035, -6352, -9152, -12852, -15291, -17756, -21246, +-24116, -24831, -25033, -25323, -24927, -24090, -21875, -18566, -15396, -13244, -9227, -3085, -76, 1510, 3132, 5519, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -430, -561, -403, -308, -210, -219, 6, -6, 26, 99, 262, 380, 509, 593, 519, +468, 394, 248, 70, 131, 88, -2, 90, 195, 153, -15, -165, -298, -253, -287, -350, +-216, -97, 88, -26, 127, -93, -136, -21, -10, 119, 139, 201, 31, 49, 104, 27, +81, 128, 379, 413, 401, 515, 497, 398, 259, 118, 171, 283, 316, 312, 510, 631, +753, 612, 539, 491, 587, 417, 289, 286, 117, 2, -52, -199, -188, -74, -32, -263, +-62, -54, -405, -503, -448, -447, -473, -273, 90, 326, 338, 306, 520, 578, 640, 835, +1025, 894, 971, 1024, 774, 680, 656, 689, 631, 757, 962, 721, 604, 488, 235, -37, +-56, -233, -495, -375, -498, -679, -525, -621, -808, -750, -730, -962, -846, -813, -1136, -1175, +-989, -692, -244, 190, 283, 437, 651, 897, 797, 936, 937, 1198, 1528, 1970, 2039, 1950, +1843, 1406, 1117, 568, 624, 352, 196, 212, -190, -268, -607, -813, -1109, -1406, -1239, -1466, +-1731, -2022, -2018, -1858, -1826, -1751, -1527, -1059, -1136, -832, -440, -11, 265, 524, 830, 1210, +1719, 1790, 1886, 2047, 2475, 3011, 2970, 3071, 3221, 2934, 2393, 1911, 1417, 680, 42, -572, +-996, -1300, -1732, -2172, -2574, -2997, -3162, -3397, -3694, -3622, -3473, -3312, -2973, -2667, -2361, -1744, +-1227, -808, -186, 246, 784, 1397, 2411, 3133, 3592, 4243, 4911, 5310, 5262, 5245, 5217, 4863, +4274, 3704, 2866, 2071, 1137, 220, -710, -1595, -2072, -2886, -3981, -4748, -4805, -5188, -6029, -6362, +-6351, -6288, -6104, -5355, -4710, -3784, -2275, -1120, -176, 830, 1481, 1996, 2955, 4147, 5392, 6338, +7055, 7635, 8348, 8459, 8336, 7706, 6836, 5958, 5144, 4102, 2980, 1709, 385, -1223, -2541, -3933, +-5208, -6443, -7371, -8316, -9206, -9706, -9851, -9909, -9426, -8644, -8358, -7248, -5896, -4572, -2861, -926, +1154, 2842, 4591, 6538, 7630, 8617, 9923, 10631, 11277, 11760, 11896, 12133, 11671, 10803, 9338, 7394, +5725, 3701, 1690, -782, -3226, -5402, -7679, -9238, -10587, -11991, -12895, -13554, -13743, -13648, -13496, -12963, +-12531, -11024, -9272, -7821, -5387, -2760, -84, 2700, 5284, 7873, 10022, 11894, 13365, 14468, 15085, 15417, +15793, 15906, 15357, 14238, 13071, 11447, 9499, 7008, 4010, 725, -2489, -5585, -8435, -10849, -12943, -14819, +-16280, -16927, -17555, -17863, -17756, -17492, -16441, -14875, -13173, -10961, -8246, -5207, -1961, 1786, 5582, 8713, +11674, 14147, 16148, 17776, 18915, 19608, 19815, 19606, 18946, 17943, 16741, 15037, 12804, 9913, 6467, 2818, +-876, -4848, -8621, -11989, -14768, -17059, -18847, -20342, -21285, -21683, -21466, -20980, -20274, -18488, -16546, -14345, +-11389, -7873, -3729, 568, 4714, 8542, 12093, 15320, 17907, 19934, 21261, 22095, 22544, 22747, 22635, 22257, +20959, 18743, 16187, 12856, 9060, 4683, 274, -4230, -8549, -12240, -15746, -18698, -20713, -22563, -23845, -24366, +-24408, -24068, -23270, -21605, -19764, -17335, -13806, -10083, -6019, -1426, 3070, 7471, 11624, 15120, 18121, 20652, +22655, 24085, 25092, 25639, 25471, 24781, 23371, 21331, 18758, 15634, 11859, 7398, 2744, -2037, -6811, -11191, +-15236, -18915, -21686, -23733, -25126, -25883, -26249, -26198, -25418, -24192, -22505, -20016, -17146, -13531, -9203, -4417, +603, 5566, 10401, 14507, 18168, 21358, 23782, 25580, 26564, 27103, 27201, 26709, 25845, 24312, 21898, 18643, +14893, 10285, 5197, 60, -5266, -10205, -14713, -18519, -21686, -24103, -25985, -27424, -28103, -28040, -27214, -25864, +-24244, -22345, -19422, -15782, -11690, -6918, -1940, 3216, 8135, 12843, 17187, 20893, 23959, 26174, 27677, 28717, +28850, 28330, 27468, 25966, 23922, 21308, 17836, 13450, 8382, 2842, -2705, -7982, -12872, -17252, -21034, -24111, +-26635, -28365, -29372, -29821, -29595, -28617, -27007, -24704, -21899, -18511, -14298, -9474, -4308, 1225, 6598, 11733, +16297, 20164, 23474, 26196, 28228, 29400, 29851, 29900, 29290, 27968, 26046, 23389, 19839, 15454, 10393, 4911, +-787, -6295, -11484, -16210, -20313, -23770, -26516, -28431, -29815, -30304, -30196, -29398, -28089, -26319, -23874, -20685, +-16876, -11903, -6507, -1023, 4641, 9833, 14691, 18927, 22575, 25465, 27771, 29284, 30129, 30416, 30037, 28959, +27027, 24686, 21577, 17763, 13079, 7819, 2061, -3658, -9251, -14455, -18811, -22688, -25845, -28205, -29747, -30670, +-30992, -30493, -29429, -27690, -25331, -22258, -18367, -13888, -8893, -3312, 2410, 8060, 13106, 17700, 21794, 24904, +27405, 29106, 30250, 30676, 30520, 29799, 28534, 26606, 23482, 19693, 15207, 9673, 3818, -2072, -7800, -13080, +-17790, -21823, -25044, -27446, -29388, -30705, -31205, -31025, -30295, -28969, -26966, -23983, -20396, -16074, -10760, -5013, +815, 6448, 11699, 16596, 20711, 24123, 26935, 28969, 30319, 31020, 31147, 30713, 29606, 27812, 25208, 21201, +16468, 11160, 5306, -506, -6258, -11751, -16484, -20580, -24129, -26993, -29178, -30653, -31466, -31418, -30769, -29369, +-27360, -25030, -21708, -17423, -12410, -7012, -1132, 4707, 10074, 15129, 19601, 23192, 26203, 28510, 30065, 31117, +31402, 30852, 29768, 28040, 25552, 22048, 17968, 13060, 7356, 1430, -4402, -9785, -14931, -19477, -23190, -26392, +-28654, -30272, -31109, -31307, -30864, -29730, -27798, -25284, -22284, -18506, -14039, -8678, -2861, 2774, 8220, 13345, +17923, 21646, 24633, 27209, 29085, 30270, 30797, 30681, 29950, 28535, 26508, 23479, 19157, 14158, 8698, 2895, +-2822, -8476, -13586, -18086, -21990, -25185, -27570, -29464, -30637, -31166, -31026, -30168, -28472, -26177, -23298, -19645, +-15037, -9841, -4344, 1545, 7126, 12226, 16855, 20779, 24070, 26542, 28430, 29633, 30166, 30138, 29741, 28581, +26690, 23919, 20115, 15696, 10457, 4742, -1028, -6780, -11989, -16716, -20899, -24274, -26856, -28748, -30035, -30621, +-30560, -29882, -28421, -26465, -23930, -20694, -16511, -11552, -6038, -259, 5305, 10614, 15272, 19451, 22968, 25699, +27947, 29313, 29867, 30004, 29683, 28745, 26911, 24187, 20903, 16678, 11742, 6264, 637, -4916, -10201, -14957, +-19238, -22815, -25586, -27822, -29392, -30177, -30176, -29785, -28709, -26926, -24501, -21291, -17453, -12701, -7318, -1834, +3757, 9053, 13818, 18103, 21539, 24370, 26724, 28336, 29230, 29558, 29450, 28515, 26958, 25023, 22012, 18076, +13309, 7860, 2359, -3401, -8852, -13736, -18018, -21661, -24703, -26899, -28602, -29713, -29837, -29565, -28605, -26832, +-24798, -22039, -18343, -14055, -9018, -3505, 1975, 7327, 12295, 16720, 20549, 23699, 26234, 27977, 28981, 29349, +29126, 28286, 26763, 24851, 22367, 18668, 14271, 9298, 3626, -1912, -7345, -12449, -16913, -20549, -23588, -26187, +-28039, -29160, -29645, -29271, -28367, -26739, -24507, -22083, -19162, -15297, -10670, -5373, -32, 5401, 10456, 15077, +19209, 22335, 24995, 27090, 28213, 28917, 28944, 28597, 27771, 25767, 22837, 19303, 14919, 10263, 4990, -579, +-5776, -10704, -15197, -19300, -22626, -25176, -27123, -28277, -28916, -28865, -28205, -27041, -25439, -23124, -20191, -16352, +-11805, -6720, -1326, 4189, 9404, 13993, 17973, 21120, 23753, 25819, 27313, 28076, 28146, 27918, 27330, 26060, +23770, 20742, 16870, 12155, 6962, 1671, -3797, -9077, -13801, -17946, -21337, -23940, -25999, -27327, -28107, -28437, +-28147, -27180, -25499, -23401, -20777, -17648, -13435, -8517, -3366, 1983, 7247, 11893, 16171, 19900, 22742, 25028, +26546, 27383, 27802, 27864, 27512, 26385, 24625, 22105, 18402, 13940, 8842, 3423, -2153, -7437, -12193, -16235, +-19798, -22757, -25062, -26827, -27699, -28118, -28045, -27309, -26160, -24477, -21937, -18837, -14921, -10437, -5287, 212, +5488, 10406, 14935, 18886, 21899, 24228, 26004, 27066, 27587, 27778, 27301, 26450, 25034, 22693, 19663, 15308, +10296, 4940, -607, -5867, -10909, -15359, -19173, -22358, -24838, -26475, -27670, -28317, -28333, -27565, -26445, -24924, +-22527, -19751, -16086, -11511, -6384, -967, 4457, 9416, 13985, 17934, 21143, 23714, 25828, 27337, 28030, 28345, +27892, 26895, 25335, 23042, 19999, 16239, 11581, 6312, 953, -4597, -9799, -14470, -18498, -21749, -24519, -26424, +-27684, -28157, -28190, -27894, -26900, -25272, -23191, -20369, -16714, -12402, -7400, -2306, 3060, 8328, 12863, 17027, +20573, 23149, 25258, 26920, 27671, 27962, 27729, 26934, 25581, 23589, 20768, 16889, 12286, 7233, 1892, -3580, +-8833, -13576, -17662, -21074, -24000, -26062, -27517, -28293, -28393, -28057, -27070, -25420, -23319, -20570, -17005, -12711, +-7820, -2619, 2789, 8033, 12662, 16875, 20458, 23086, 25221, 26891, 27667, 27966, 27729, 26943, 25604, 23331, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 66, 65, 32, 25, 78, 105, 146, 182, 148, -44, -241, -527, -908, -1016, -621, +-296, -274, -360, -414, -446, -806, -1354, -1550, -1385, -1283, -1183, -952, -708, -267, 473, 823, +747, 1053, 1624, 2000, 2494, 2673, 2057, 1867, 1857, 844, -676, -1971, -2906, -2930, -1782, -419, +748, 1055, 446, -347, 185, 2398, 5422, 9163, 11104, 10696, 9994, 8578, 5436, 926, -3879, -6687, +-6721, -5373, -4925, -5662, -6638, -7520, -8257, -8627, -9341, -7865, -5943, -4153, -3012, -3712, -5100, -4005, +-1050, 1208, 2582, 3471, 3134, 2885, 2721, 2059, 1176, 1593, 4074, 5296, 4670, 3304, 2429, 1251, +-1632, -4782, -5761, -6075, -5689, -4293, -2565, 153, 4053, 7670, 7850, 6057, 4782, 3804, 2721, 2513, +1233, -191, 226, -749, -4022, -6482, -8267, -7870, -4106, 784, 4490, 5780, 3987, 694, -1906, -138, +4878, 10721, 15930, 15877, 15267, 16351, 17328, 15479, 8629, 1647, -928, 328, 1819, 1179, -1356, -3981, +-5219, -5184, -6329, -7841, -6410, -4889, -1174, 94, -1809, -1703, 1268, 3841, 3763, 3343, 2129, -1555, +-5621, -7468, -11321, -13142, -9713, -4347, -3769, -4694, -4906, -4107, -5314, -8019, -9498, -8983, -8826, -9005, +-8697, -6092, -2499, 2017, 4675, 4234, 3694, 4893, 6270, 8651, 11361, 11055, 9987, 8804, 3787, -3055, +-7821, -9894, -7880, -3240, 982, 2231, 1416, -1976, -4768, -3351, 4398, 13615, 23474, 30827, 29889, 26402, +23363, 17098, 7951, -3707, -13260, -16591, -14363, -12495, -12405, -14482, -16841, -18042, -18223, -18910, -17798, -14213, +-10679, -8081, -7602, -8863, -8130, -3546, 1668, 4017, 5631, 4698, 2442, 2684, 2288, 1307, 1950, 4984, +7709, 7282, 5567, 4840, 3973, 938, -3318, -6473, -8380, -10326, -10307, -7621, -2387, 4528, 10852, 12711, +10141, 6779, 4656, 3878, 4511, 4027, 1892, 1118, -1350, -7316, -11213, -11259, -9221, -3264, 3191, 5921, +4860, 2005, -2162, -4506, -1654, 6090, 13250, 19216, 20125, 16477, 16517, 18076, 17776, 13458, 4635, -595, +-970, 970, 1229, -107, -3462, -5702, -5510, -5156, -6154, -6264, -5463, -3638, -763, -1521, -1162, 1805, +5335, 5381, 3321, 1700, -1505, -5440, -7501, -10186, -12552, -11380, -7223, -4588, -5517, -5648, -4070, -3836, +-5834, -7734, -8513, -9587, -10966, -11583, -8835, -3206, 2444, 5909, 5345, 3404, 3547, 4696, 7264, 11001, +12682, 12092, 9398, 3084, -4035, -7346, -6995, -4381, 561, 2734, 1327, -1573, -4432, -7483, -5476, 2930, +13689, 22469, 29228, 29953, 26876, 25005, 21111, 13341, 1819, -10080, -16504, -16342, -13818, -12822, -13627, -16172, +-17472, -16814, -17483, -17960, -16576, -13186, -10107, -8475, -7985, -6628, -3468, 1088, 3416, 3983, 3401, 550, +415, 1583, 900, 2008, 3820, 6488, 7206, 6055, 5606, 5654, 3822, 404, -3724, -6944, -10345, -12631, +-10660, -4795, 3090, 10205, 13070, 11203, 7874, 5533, 4826, 5439, 5978, 4067, 1213, -2463, -8913, -12687, +-10430, -6278, -1397, 3534, 4593, 2061, -753, -3479, -5459, -1829, 6342, 14601, 19367, 20367, 16220, 14557, +17585, 18508, 16327, 8165, 144, -1369, 385, 914, -207, -2493, -4783, -4918, -3563, -4293, -5581, -5972, +-5051, -2822, -997, -866, 2929, 6357, 7307, 4161, 1267, -1951, -5428, -7963, -9729, -12001, -12532, -10296, +-6710, -5866, -6328, -4161, -2746, -3414, -5892, -7514, -9720, -12867, -13852, -11107, -4505, 2324, 5886, 5369, +2551, 2177, 3857, 6633, 10776, 13145, 12058, 8713, 2512, -4208, -6104, -3434, -388, 2814, 2939, -1365, +-5526, -7308, -8312, -6439, 1763, 12843, 21528, 26509, 27546, 25892, 25349, 24650, 18481, 7376, -6162, -15154, +-17005, -15027, -14403, -14512, -15577, -16866, -15741, -15824, -17820, -17716, -15689, -12334, -9693, -8044, -5959, -2768, +194, 2131, 1658, 1282, -1, -1335, -61, -114, 88, 2259, 4843, 6705, 6959, 6479, 7592, 6468, +3215, -1475, -5392, -9894, -13797, -13532, -7433, 744, 8668, 12363, 11385, 8677, 7257, 6297, 6463, 7293, +5092, 91, -3855, -9159, -12466, -9507, -3326, 437, 2692, 1804, -1544, -3697, -4151, -4429, -1296, 6850, +14956, 19502, 19313, 16545, 14252, 17311, 19301, 17128, 10622, 1877, -1564, -3, 270, -1201, -2241, -3347, +-3560, -2097, -3323, -4743, -5765, -5531, -4375, -1409, 473, 3796, 7609, 8224, 5194, 483, -2369, -5537, +-7657, -9574, -11675, -13244, -12056, -8501, -5541, -5331, -3898, -1499, -1639, -4107, -7051, -9824, -13804, -14826, +-12820, -6886, 666, 5857, 5854, 3140, 1833, 3918, 6382, 10131, 12453, 10551, 6893, 2615, -2679, -3658, +379, 3507, 3962, 2015, -3550, -8188, -8905, -8021, -6187, 795, 11674, 19974, 24088, 24617, 24763, 26017, +27584, 23478, 12673, -1111, -12138, -16657, -16318, -16622, -16184, -14887, -14676, -14112, -14007, -17340, -18772, -18028, +-14344, -10352, -7848, -4927, -1161, 417, 962, 417, -580, -1208, -2679, -2010, -994, -1651, 299, 3924, +6415, 7782, 7654, 8513, 8658, 5180, 437, -4031, -8857, -12928, -14121, -9974, -2030, 5706, 10650, 10730, +9349, 9036, 8464, 7611, 7807, 4867, -972, -5367, -8404, -10493, -7089, -1063, 1675, 898, -1700, -4819, +-6021, -4429, -3016, -477, 6804, 14654, 18874, 18939, 16118, 14611, 16259, 19643, 17792, 12013, 4058, -1334, +-670, -192, -1965, -2267, -1579, -1412, -723, -1976, -4221, -5586, -6220, -5134, -3071, 437, 3696, 7991, +8985, 6323, 1387, -2400, -5620, -8065, -9659, -12689, -14196, -13143, -9702, -6062, -4312, -3823, -1011, -1301, +-3593, -6661, -9448, -13138, -15150, -13716, -8849, -1644, 4497, 5668, 3351, 2235, 3738, 6377, 8984, 10850, +8039, 4329, 2626, -3, -347, 4001, 6760, 4515, 114, -5202, -10481, -10531, -7970, -5086, 303, 10075, +17892, 21814, 22904, 23017, 25976, 28721, 26658, 17462, 4032, -8297, -15083, -16766, -17824, -17606, -14849, -12372, +-12379, -12670, -15651, -18771, -19081, -16392, -11491, -8009, -5316, -1499, 544, -207, -1135, -1926, -2575, -3243, +-3484, -3021, -3729, -2298, 2623, 6507, 8543, 8959, 9521, 10307, 7073, 1962, -3069, -7294, -11452, -13502, +-12115, -5665, 2201, 8394, 10113, 9657, 10064, 10549, 9449, 8304, 4552, -2276, -6337, -6942, -7320, -4707, +147, 1582, -1103, -4935, -7465, -7961, -4526, -1283, 1486, 6772, 13749, 17292, 18142, 16095, 14979, 16691, +19264, 18408, 13071, 6095, -283, -2309, -1548, -2475, -2354, -115, 842, 632, -444, -4053, -5728, -6373, +-4975, -3219, -468, 3181, 6750, 8965, 6604, 2349, -2464, -5920, -8537, -9991, -13119, -15197, -13506, -9690, +-6183, -3331, -2713, -1117, -408, -3298, -6867, -9916, -12134, -14261, -14254, -11019, -5478, 1249, 5318, 4495, +3193, 4284, 6695, 8253, 8770, 5851, 1915, 2141, 3345, 3520, 6375, 8101, 4046, -2150, -7194, -10889, +-11048, -6823, -2972, 1133, 7848, 14775, 18814, 21120, 21355, 24204, 28829, 29056, 22533, 9989, -3433, -12887, +-16890, -18389, -18922, -15932, -11390, -10080, -11094, -13818, -17716, -19089, -17380, -12980, -8624, -6148, -2837, 201, +-531, -2741, -3057, -3477, -4203, -4869, -5324, -5607, -4243, 737, 6949, 9439, 10380, 10738, 11296, 8743, +3232, -2097, -5440, -8984, -11796, -12658, -9106, -2385, 4858, 9211, 9747, 10638, 12218, 11569, 8704, 4446, +-2562, -6673, -5441, -3362, -1792, 760, 263, -3541, -7802, -9856, -9070, -4838, 503, 3677, 6569, 11723, +15517, 17404, 17187, 15311, 16822, 18879, 18616, 14044, 7298, 1183, -3111, -2825, -2241, -2081, 394, 2635, +1910, 958, -2726, -5623, -5500, -4239, -1874, -932, 1518, 4878, 7065, 6502, 3056, -1183, -5350, -8359, +-10427, -12670, -15437, -14002, -9802, -5873, -3655, -1957, -1379, -346, -2965, -7365, -9879, -10690, -12135, -13332, +-12479, -8552, -2562, 3690, 5441, 4099, 4777, 6641, 7201, 6152, 3371, 186, 1785, 6764, 8622, 8779, +8130, 3003, -3544, -8461, -10419, -10173, -5538, -1293, 1555, 5272, 11147, 16033, 19911, 21470, 22641, 27442, +30207, 26256, 15709, 1602, -9930, -16276, -17737, -18139, -16133, -11555, -8614, -9281, -12110, -16513, -18809, -17854, +-14089, -9396, -7370, -5342, -1641, -532, -2883, -4908, -4888, -5349, -6274, -7015, -7369, -5825, -1259, 6148, +10789, 11394, 11445, 11564, 9921, 4387, -1412, -4041, -6223, -9368, -11782, -11719, -7194, 716, 7742, 10229, +10823, 13052, 12985, 8761, 3884, -2150, -5941, -3626, 195, 1172, 827, -1747, -6348, -9731, -11247, -9570, +-4919, 1775, 5723, 7181, 9441, 13511, 16386, 18151, 16608, 15842, 18128, 18515, 15548, 8563, 1340, -3280, +-3854, -1913, -912, 738, 3448, 4153, 2546, -1077, -5096, -5302, -3719, -1477, -599, -944, 2410, 5034, +5960, 3502, -129, -3894, -8065, -11006, -12785, -15195, -14776, -10259, -5301, -2877, -1705, -897, -743, -2873, +-7621, -9882, -9909, -10359, -12105, -13541, -11820, -6956, 341, 6046, 6143, 5495, 6754, 5725, 3453, 1199, +-733, 1782, 8960, 12642, 10728, 7317, 1635, -4647, -8421, -9483, -7929, -4005, 689, 2124, 2586, 6706, +12739, 18285, 21836, 21705, 24109, 29591, 28767, 20662, 7131, -6299, -14187, -16557, -16658, -15774, -12605, -8902, +-7921, -9996, -14494, -17520, -17459, -14573, -10885, -8477, -7749, -4991, -2019, -2479, -5670, -6220, -6155, -8077, +-8325, -8479, -7584, -2757, 4140, 11355, 13149, 11937, 11670, 10811, 5859, 107, -2679, -3694, -6322, -10430, +-13419, -11258, -4148, 4964, 10216, 11550, 13099, 13265, 8985, 3532, -943, -3721, -1373, 3198, 3376, 88, +-4258, -8622, -10962, -11209, -9220, -4461, 2185, 6187, 5988, 6819, 10961, 15770, 19120, 19046, 15697, 16916, +18877, 16756, 10537, 1600, -3720, -4586, -2235, 78, 1538, 3137, 4912, 4009, 946, -3420, -5126, -3346, +-846, -65, -1634, -1656, 1973, 4256, 4014, 831, -2387, -7521, -11624, -13231, -14374, -15188, -11542, -5231, +-1422, -1228, -1024, -732, -2969, -6865, -9672, -8871, -8571, -10548, -13869, -14733, -10861, -3280, 4865, 7822, +7061, 6585, 4292, 834, -389, -362, 3085, 10405, 14782, 12112, 6111, 231, -5228, -7733, -7841, -5531, +-2049, 1343, 1738, 587, 3358, 10204, 16925, 21689, 21889, 21394, 26192, 29469, 24548, 12865, -1583, -11406, +-14363, -14520, -14569, -13355, -10575, -8170, -8246, -11684, -15551, -16530, -14708, -12008, -10487, -10558, -8950, -4867, +-2760, -4853, -7184, -7669, -9456, -10226, -9362, -8983, -4941, 2432, 10404, 14564, 13084, 11571, 10735, 7240, +2300, -1031, -1988, -4339, -9041, -13644, -13715, -8178, 1860, 9674, 12455, 12298, 11612, 7936, 3541, 1086, +210, 2071, 5626, 4284, -1120, -6360, -10973, -12796, -10573, -7533, -3706, 1805, 5578, 5561, 5480, 9687, +15581, 19771, 20163, 16387, 14550, 17908, 17819, 12335, 2871, -4146, -5068, -2301, 565, 2105, 3595, 5101, +5684, 3938, -580, -3285, -2852, -826, -815, -2480, -5010, -2193, 2162, 3731, 2255, -1341, -5954, -11287, +-13322, -13772, -13962, -11810, -5324, -257, 47, -1326, -1935, -3387, -6523, -8819, -8798, -7841, -10016, -13484, +-16177, -13326, -5955, 3067, 8782, 8251, 4998, 2208, -977, -983, 1548, 5280, 10786, 14341, 10811, 4324, +-1049, -5027, -6011, -4404, -2712, -292, 1508, 779, -800, 1335, 8435, 15651, 20600, 21432, 19642, 22039, +28126, 26847, 17153, 3665, -7553, -11853, -12057, -12750, -13308, -11766, -8973, -7267, -8489, -12886, -14606, -14622, +-13617, -13059, -13082, -11999, -8210, -4153, -3253, -6932, -9621, -10851, -12163, -10508, -9013, -6722, 697, 8663, +14083, 14501, 11622, 10292, 8278, 4380, 1073, -682, -2610, -7400, -12716, -14683, -10634, -1806, 7889, 11918, +10605, 8646, 6963, 4806, 4694, 5219, 5672, 6216, 3166, -3641, -8530, -11215, -12245, -9376, -5032, -2700, +115, 2998, 3702, 4370, 8729, 15313, 19969, 20946, 17563, 14068, 16119, 18360, 13672, 4601, -4169, -6148, +-2000, 941, 2441, 3671, 4790, 5610, 5874, 2364, -1504, -2737, -1668, -885, -3306, -6018, -5727, -364, +3157, 2902, -1079, -5242, -10231, -13219, -13065, -12965, -11082, -6022, -73, 1198, -1288, -3374, -3055, -5223, +-7294, -8406, -7931, -9940, -13653, -16779, -15013, -8161, 852, 7762, 8106, 3307, 369, -1224, -6, 4652, +8168, 10243, 11324, 7946, 2580, -943, -3414, -3670, -1467, 283, 151, 420, -199, -856, 965, 8044, +15050, 19217, 20569, 18465, 18665, 24433, 27429, 20540, 8389, -3054, -8762, -9300, -10754, -12439, -12508, -10129, +-6911, -5725, -9370, -12552, -13933, -14550, -15165, -16324, -15486, -11723, -6457, -3332, -5663, -10190, -11777, -12322, +-11315, -8583, -6593, -1062, 7036, 13186, 14843, 11718, 9667, 9596, 6896, 3536, 274, -2250, -6232, -11111, +-13491, -10742, -3922, 5144, 9909, 8644, 5716, 5602, 7099, 9857, 10803, 8324, 5013, 695, -5800, -10033, +-10675, -10592, -7911, -3501, -1327, -1258, 548, 2495, 4531, 8903, 15537, 18985, 20376, 17812, 14335, 14534, +17675, 15199, 6749, -2194, -6022, -2560, 1474, 2579, 3455, 4520, 5694, 7204, 6042, 1408, -1083, -2407, +-2324, -4358, -7361, -8311, -3901, 1955, 2595, -548, -4961, -8765, -12219, -12577, -12082, -10262, -6841, -1227, +1487, -1162, -4073, -2987, -3187, -5940, -8141, -9567, -10772, -13467, -15271, -14549, -8901, -928, 5033, 5251, +1335, -1640, -885, 2807, 7834, 9730, 8326, 6848, 3864, 468, -248, -158, -76, 1658, 2508, 687, +-826, -960, -1322, 755, 6809, 13453, 17001, 19062, 18141, 17870, 21246, 25404, 22776, 12514, 1815, -5558, +-7463, -8893, -11286, -12345, -10670, -7863, -4817, -6348, -11078, -13696, -15730, -16921, -17972, -17908, -14044, -8745, +-5205, -5832, -9875, -12909, -13180, -11593, -8568, -6284, -2986, 4235, 10860, 13200, 12101, 10200, 11102, 9511, +5189, 512, -2572, -5764, -8848, -11068, -9947, -5216, 1253, 5406, 4660, 3287, 5456, 10248, 14897, 15250, +9579, 2759, -2192, -7132, -10157, -8866, -7373, -6023, -3098, -1742, -3130, -1949, 1552, 4796, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -873, +-432, 88, 325, 968, 992, 1358, 1593, 1966, 1888, 1746, 1640, 1421, 740, 651, -167, -585, +-771, -1568, -1907, -1840, -2388, -2090, -1904, -1925, -1469, -1461, -1092, -506, -396, 360, 393, 1213, +1440, 1576, 2038, 2218, 2335, 2259, 1782, 1637, 1035, 320, -102, -732, -1407, -1709, -2279, -2251, +-2570, -2412, -2445, -2126, -1586, -1316, -1045, -299, 151, 398, 1067, 1106, 2133, 1990, 2240, 2643, +2602, 3011, 2190, 1654, 1001, 537, -371, -921, -1892, -2243, -2432, -2823, -2950, -2780, -2522, -1792, +-1930, -1485, -1111, -343, 181, 537, 1591, 1448, 2385, 3045, 2946, 3433, 3118, 3089, 2441, 1823, +670, 202, -637, -1716, -2203, -3016, -2799, -3379, -2929, -3215, -2581, -2454, -2096, -1430, -1096, -78, +348, 1166, 1644, 2563, 2965, 3210, 3706, 3656, 3971, 3304, 2163, 1712, 587, -134, -1287, -2337, +-2909, -3133, -3710, -3593, -3710, -3439, -3049, -2546, -2053, -1229, -821, -307, 553, 1219, 2221, 2817, +3554, 3816, 4727, 4497, 4274, 3547, 2595, 1218, 306, -1088, -1973, -3065, -3904, -4107, -4012, -4191, +-3831, -3728, -3590, -2497, -2000, -1200, -286, -357, 1038, 1896, 2557, 3506, 4739, 4762, 5573, 5371, +4525, 3769, 2053, 677, -526, -1516, -3128, -3807, -4568, -4495, -4665, -4552, -4397, -4245, -3486, -2989, +-1717, -1248, -202, 374, 1252, 2917, 3158, 4489, 5888, 5770, 6702, 5798, 4259, 3273, 1464, 129, +-1223, -2313, -3675, -4385, -4918, -4970, -4795, -4923, -5083, -4727, -3778, -2577, -1474, -646, -307, 895, +1998, 3278, 5088, 5522, 6819, 7675, 7423, 5369, 3879, 2163, 806, -480, -2275, -3214, -4250, -5120, +-4938, -5067, -5556, -5840, -5674, -4756, -3457, -2013, -1752, -763, 443, 1796, 3394, 4678, 5925, 7563, +8436, 8800, 6363, 4761, 2807, 1276, 103, -1771, -3152, -3971, -4534, -5426, -4868, -5664, -6275, -6492, +-5800, -4543, -2975, -1931, -1763, 233, 980, 2624, 4501, 5473, 7588, 9162, 9942, 7975, 5604, 3593, +1804, 812, -1355, -2901, -3933, -3918, -5217, -5571, -5421, -6942, -6939, -6909, -6009, -3983, -2585, -2440, +-714, 1052, 1838, 4215, 5319, 7436, 10180, 11819, 8842, 6531, 4387, 2180, 1644, -971, -2851, -3812, +-3793, -4330, -5953, -5367, -6671, -7803, -7519, -6977, -5085, -3261, -3304, -1442, -1, 1708, 3263, 5115, +7272, 9821, 13568, 10396, 7385, 5439, 2371, 2237, -31, -2788, -3547, -3615, -3455, -4946, -6149, -6205, +-8412, -8086, -7706, -6157, -3860, -3978, -2499, -440, 978, 3211, 4063, 6937, 9587, 14371, 13006, 7958, +6638, 2500, 2983, 739, -2093, -3828, -3371, -3265, -3934, -6348, -6035, -8321, -9139, -8108, -7709, -4592, +-4599, -3395, -1194, 350, 2625, 3880, 6200, 9506, 14482, 15452, 8597, 7391, 2946, 3077, 1865, -1631, +-3879, -3396, -2618, -3109, -5638, -6769, -7468, -10154, -8343, -8713, -5483, -5150, -4185, -2222, -70, 1829, +3404, 5612, 8242, 14560, 16275, 10577, 7565, 4043, 3164, 2734, -519, -3773, -3743, -2275, -2217, -4660, +-7161, -7224, -10491, -8820, -9169, -6921, -5231, -5347, -2143, -1281, 1697, 2601, 4678, 8144, 13525, 18698, +11739, 8703, 4404, 3529, 3578, 205, -3328, -4233, -1907, -1722, -3409, -7630, -7053, -10156, -9873, -9057, +-8317, -5591, -6370, -3144, -1863, 938, 2406, 3723, 7430, 12532, 19911, 13403, 9081, 5376, 3351, 4234, +1426, -2923, -4524, -2227, -1058, -2187, -7036, -7449, -9493, -10539, -8879, -9230, -6148, -7245, -3842, -2391, +95, 2072, 2698, 6270, 11412, 20105, 16055, 9582, 6181, 3432, 4710, 2431, -2163, -4795, -2500, -482, +-1072, -5983, -8135, -8724, -11448, -8742, -9943, -6624, -7844, -5281, -2828, -921, 1936, 1549, 5910, 9939, +20416, 18590, 9523, 7536, 2954, 5251, 3452, -1237, -4657, -2817, -322, -317, -4577, -8790, -8018, -12013, +-9104, -10057, -7628, -8130, -6564, -2862, -1947, 1838, 1508, 4799, 8850, 19288, 20910, 10191, 8191, 3091, +5232, 4632, -152, -4636, -3255, -185, 273, -2901, -9057, -7941, -11893, -9747, -9906, -8354, -8156, -7719, +-3046, -2697, 1310, 1106, 3496, 8065, 17623, 22781, 10908, 8540, 3525, 4965, 5599, 744, -4064, -3729, +20, 755, -1726, -9046, -8115, -11305, -10614, -9598, -9358, -7870, -8946, -3287, -3180, 341, 1142, 2223, +7335, 15723, 24661, 12030, 9301, 4189, 4460, 6594, 1574, -3370, -4324, 42, 864, -182, -8314, -8694, +-10762, -11702, -8980, -10006, -7607, -10256, -3920, -3356, -337, 1419, 1078, 6128, 14106, 26096, 13665, 9461, +4465, 3978, 7520, 2750, -2532, -4773, -239, 1403, 884, -7277, -9569, -9807, -12450, -8571, -10399, -7704, +-11038, -4904, -3636, -1544, 1632, 454, 5543, 11863, 26666, 15607, 9402, 5864, 2876, 8256, 3341, -1603, +-4946, -403, 1703, 1503, -5682, -10418, -8918, -13235, -8445, -10713, -7693, -11710, -6101, -3370, -2454, 1380, +-176, 4412, 10492, 26421, 17912, 9220, 6591, 2290, 8590, 4385, -982, -4942, -1018, 2284, 1988, -3871, +-11258, -8246, -13564, -9014, -10326, -8278, -11516, -7374, -3326, -3682, 1361, -506, 3721, 8774, 25660, 20463, +8672, 7853, 1601, 8626, 5388, -95, -4608, -1500, 2499, 2546, -2410, -11403, -8193, -13338, -9531, -10224, +-8707, -11296, -8688, -3166, -4005, 854, -582, 2517, 7844, 24074, 22829, 8537, 8718, 1301, 8407, 6294, +629, -3828, -2165, 3006, 2902, -807, -11218, -8401, -12900, -10365, -9741, -9233, -10825, -10137, -3128, -4636, +355, -802, 2002, 6168, 22363, 25039, 8472, 9913, 1028, 7933, 6855, 1408, -3449, -2471, 2988, 3352, +372, -10481, -8625, -12247, -11360, -9642, -9803, -10109, -11271, -3172, -5267, -520, -531, 986, 5703, 20289, +26658, 8692, 10274, 1198, 7175, 7548, 1727, -2362, -2427, 2720, 3938, 1394, -9768, -9192, -11327, -12267, +-9012, -10476, -9749, -12139, -3550, -5358, -1249, -327, 439, 4669, 17866, 28684, 9400, 10772, 1272, 5877, +8483, 2256, -1824, -2240, 2429, 4417, 2533, -8595, -9531, -10623, -13195, -8907, -10680, -9401, -12900, -4117, +-5253, -2412, -337, -178, 4029, 15723, 29412, 9837, 10786, 2201, 4821, 8981, 2419, -1191, -1587, 2411, +4620, 3434, -7681, -9642, -9546, -13733, -8789, -11151, -9075, -13182, -4622, -4889, -3385, -374, -758, 3447, +13486, 30037, 11015, 10527, 3178, 3153, 9817, 3033, -815, -1166, 2265, 4846, 4417, -6355, -10107, -8533, +-14327, -8975, -11426, -9114, -13201, -5388, -4599, -4486, -354, -1094, 3468, 11780, 30221, 12206, 10207, 4439, +1830, 9948, 3221, -487, -825, 2458, 4722, 5234, -5513, -10248, -8076, -14433, -9124, -11423, -9080, -13317, +-5726, -4574, -4605, -453, -1126, 3345, 11532, 30195, 12284, 10200, 4439, 1830, 9948, 3221, -487, -825, +2458, 4722, 5234, -5513, -10248, -8076, -14433, -9124, -11423, -9080, -13317, -5726, -4574, -4605, -453, -1126, +3345, 11532, 30195, 12284, 10200, 4439, 2253, 5759, 4452, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2601, 12274, 10161, 4628, -4457, -5711, +-320, 10162, 2460, -12781, -17278, -22397, -5921, 17771, 18523, 11151, -10871, -25644, -5630, 8218, 12398, 13547, +-8708, -14458, 1782, 8858, 11068, 8886, -7774, -10924, -6609, 7836, 21499, 8750, -11925, -24507, -22410, -3106, +11635, 5565, -9010, -10898, 3900, 10697, 8483, 4744, -8045, -10211, 79, 5909, 9829, 12877, -161, -8572, +-12547, -6042, 10307, 11073, 1311, -5670, -7883, -268, 7918, -8220, -29114, -26071, -704, 22364, 29157, 13284, +-11959, -17579, -5139, 6819, 7578, 4765, -2676, -1419, 4990, 6111, 3162, -4856, -11583, -8915, -1273, 6721, +16426, 6623, -13706, -18911, -16405, -11082, 4480, 11695, 10137, 9567, -1697, -4705, 1738, 2649, 1791, -6478, +-7691, 7235, 14194, 10244, -1041, -14099, -13476, -3531, 9634, 3570, -13197, -7856, 5127, 8698, 9962, -8981, +-21336, -10764, -51, 15680, 20793, 3905, -2264, -6804, -6315, 5019, 787, -2861, 546, -142, 6438, 9249, +1819, -7885, -15713, -13104, -6793, -6717, 10410, 19673, 9430, 2426, -15096, -23274, -5192, 4543, 16523, 15610, +-2061, 2475, 1123, -6006, -3071, -11841, -3644, 10578, 9926, 9096, -612, -10789, -6697, -8037, -5405, -5034, +-13697, 1554, 21563, 13279, 6792, -8423, -24509, -11358, 5488, 21448, 20206, -6360, -10498, -4592, -806, 8467, +-4854, -10910, 110, 6166, 15078, 5470, -7395, -4448, -6271, -12411, -11516, -14114, -1413, 21400, 15231, -1035, +-3608, -5342, 3061, 6027, -5423, -3432, -267, 10742, 16032, -7553, -13608, -14337, -1568, 13076, 7863, 5324, +251, -3773, 2634, -1970, -18404, -18709, -13570, -2536, 21749, 25174, 8761, -4521, -13260, -9953, 2460, 949, +2969, 1200, 2391, 11424, -1028, -9286, -10476, -4911, 7084, 6378, 4759, 3680, 1704, 2482, -8559, -25970, +-18169, -1785, 11665, 18357, 9895, -2225, -2007, -326, -803, -5693, -10542, 1639, 9634, 11666, 9178, -7531, +-15719, -11916, 74, 12692, 9414, 2674, -3711, -6052, 5082, 628, -15428, -19441, -12838, 7289, 23409, 16754, +2204, -9222, -8093, 2479, -871, -6765, 1151, 7883, 10849, 3541, -14034, -12659, -3251, 8108, 7923, -4921, +-2264, 6172, 7792, 4021, -15668, -26992, -12224, 5727, 22144, 17752, -1198, -3045, -4108, 1568, 6633, -6506, +-12891, -1664, 7591, 15330, 10291, -9713, -18212, -13444, 5780, 16221, 4772, -6261, -7293, -51, 7333, -4951, +-17637, -14135, 62, 24700, 20361, -795, -3143, -6174, -1421, 3987, -10876, -10462, 9527, 14269, 7476, -3505, +-12897, -4118, 5451, 3933, -4061, -15408, -9935, 10677, 18666, 4592, -16530, -18597, -6533, 7147, 23510, 11275, +-6387, -2548, -2192, 1079, 3308, -9957, -10483, 6009, 9742, 10443, 7456, -8359, -9178, -1834, -4521, -4925, +-10337, -10840, 13560, 21664, 7594, -10556, -18115, -8396, 1709, 15399, 10987, -2572, 1923, 4205, -3544, -6154, +-15042, -4959, 15389, 13520, 7162, 834, -10546, -6765, 1773, -9339, -12295, -12052, -6171, 23006, 23463, 725, +-10870, -15864, -4558, 6785, 8937, 7763, -4516, -708, 7955, -922, -5749, -15074, -6581, 13294, 12757, 8145, +1826, -11455, -6882, 2208, -11084, -14356, -10294, -7706, 15321, 18207, 4679, 2116, -5043, -302, 2837, -6322, +-2316, 2949, 9285, 13245, -6890, -13503, -15393, -1547, 16226, 3047, -580, 1858, -457, 5137, -425, -22125, +-24085, -11070, 7761, 24626, 17737, 2400, -4064, -6447, -2102, 2500, -5585, -2487, 3760, 6939, 9915, -4859, +-13151, -12596, -3610, 11195, 5626, 4118, 4056, -2165, 118, -9023, -19096, -12170, -3835, 9668, 16416, 8131, +2542, 2086, -1217, 148, -5057, -12615, -3390, 9548, 13798, 5405, -10206, -13341, -6053, 5436, 8733, -2713, +-3782, 119, 3588, 10055, -6382, -21894, -13678, -5813, 12895, 22556, 8180, 1302, -1830, -4715, -1025, -2925, +-9813, -5617, 5699, 13280, 10865, -3678, -11986, -11155, -1731, 5102, 1165, 1208, 2140, 473, 3348, -9102, +-17483, -3255, 2017, 13070, 18649, 1132, -3589, -291, -1442, 151, -5228, -13683, -2735, 10958, 11875, 7984, +-6984, -15022, -5815, 3454, 4476, -1954, -6227, -1127, 7002, 9814, -3270, -16143, -8732, -1275, 13177, 19347, +2065, -4700, -3501, -3416, 3275, -3260, -14836, -2790, 7165, 7210, 9324, -1457, -8425, -4887, -2895, -3797, +-4387, -2825, 7984, 13802, 4670, -9991, -16482, -4543, 2048, 11742, 12711, -2671, 283, 3450, -3505, -3525, +-12953, -13353, 6469, 11545, 6856, 4748, -5465, -10139, -1025, 337, -2778, -4865, -6622, 5759, 13826, 7690, +-6254, -14424, -4434, 944, 11910, 13022, -5466, -4843, 978, -4355, -878, -10660, -10857, 6488, 11036, 6929, +5030, -5485, -11288, -1877, -739, -5224, -4724, -4235, 9562, 13450, 2083, -4095, -7042, 787, 3589, 4094, +4287, -8709, -3331, 7448, -2135, -4896, -13260, -9548, 12601, 17176, 9184, -3702, -15975, -13894, -795, 2507, +-3345, -3580, 3, 9813, 13702, 5662, -2448, -6652, 1021, 2130, -2734, -2107, -3340, 2553, 8729, -6949, +-7783, -3746, 1399, 14727, 5466, -11979, -16527, -7158, -4457, 1452, 7747, 2124, 6827, 8611, -85, -2211, +-2107, 2396, 7540, 473, -4979, -7793, -1626, 3774, 2305, 3973, -2660, -2049, 6734, 1509, -10798, -17909, +-14035, -5300, 10796, 14810, 6241, 4531, 953, -4041, 679, -652, -253, 5779, 2324, 207, 2915, -1964, +-6463, -3644, -1128, 6964, 11440, 5697, -7085, -20865, -19978, -7611, 1786, 10183, 12839, 8723, 5691, -4531, +-8578, 1830, 4799, 8698, 1243, -8679, -634, 6323, 11437, 1591, -12091, -7042, -1469, 9598, 14098, -9053, +-27386, -18921, -6341, 13699, 21810, 5959, -1122, -3234, -5916, 3516, 4293, -1317, 6373, -458, 1902, 8971, +-395, 880, -4085, 171, 7651, 559, -951, -15644, -25251, -8785, 2198, 5974, 11553, 5271, 2954, 3379, +-3539, -3794, 2015, 4489, 2087, -4773, -4462, 14627, 16954, 6176, -7007, -14385, 1223, 9581, 11962, -4302, +-31001, -30861, -10070, 10650, 22550, 17704, -2807, -10941, -5122, 1370, 8951, 11445, -2174, -11549, -7116, 3975, +19220, 17355, 2983, -8794, -6724, 1176, 10438, 3463, -22885, -26950, -16401, 318, 20665, 18208, 422, -10272, +-8423, -1072, 8239, 10524, 5571, -7116, -10726, 835, 13896, 14679, 4775, -2737, -879, 4325, 7385, -2201, +-21967, -21641, -11413, -2521, 15563, 15644, 4021, -4984, -14959, -6864, 8383, 11350, 9783, -4336, -15917, -99, +15289, 12342, 6915, -3335, -337, 4856, 4506, -574, -13985, -20576, -14480, -4647, 12203, 20559, 7965, -7728, +-18016, -12759, 10584, 17224, 8969, -6125, -16378, -3764, 15643, 13327, 5415, -3889, 123, 10584, 9105, -1557, +-24116, -23224, -9469, 6125, 15982, 13649, 5161, -9131, -15024, -12859, 3612, 17524, 15294, -1273, -14301, -13240, +7926, 18986, 8310, -2329, -4618, 4447, 11544, 4800, -15994, -22211, -16502, -5001, 17487, 22570, 15503, -3833, +-23759, -20129, -485, 17899, 18898, 1699, -12839, -7090, 6236, 11916, 2120, -3369, 5546, 7711, 6901, -3792, +-20013, -15262, -8178, 1214, 14747, 12401, 11127, 1554, -16130, -13270, -1824, 7844, 14432, 944, -9986, -3907, +6012, 16186, 9134, -7977, -4475, 1946, 9076, 6265, -17185, -21946, -13702, -1442, 21199, 21596, 11293, -2432, +-20938, -16503, 3624, 14888, 15358, -1038, -16193, -6564, 7379, 13768, 9742, -1166, 1326, 3900, 2271, -6489, +-21777, -15248, -2897, 1079, 13377, 14423, 12912, 4298, -17938, -17157, -874, 13390, 18199, 1680, -13080, -7650, +4904, 10784, 3838, -2550, 3663, 7396, 8577, -5840, -27335, -18871, -9298, 2048, 21581, 17905, 12455, -858, +-21471, -13411, 4826, 12421, 14897, -1761, -13080, -1482, 9668, 8679, 206, -5611, 2621, 9382, 7957, -8404, +-27850, -17999, -6450, 1840, 20869, 12896, 10667, 4573, -19928, -14472, 2206, 12219, 21893, -1346, -17000, -3391, +9852, 12333, 3309, -6978, -1967, 8402, 12750, -6638, -31009, -23836, -9419, 5265, 25252, 15891, 6814, -1093, +-21392, -13105, 8746, 12914, 17176, -2430, -15150, 1933, 13162, 10035, -611, -8451, -1321, 8654, 13889, -6307, +-30084, -21849, -11952, 1777, 23423, 18184, 9756, -2101, -21903, -15324, 7855, 14572, 16424, -1605, -13403, 694, +13667, 11795, 2475, -5306, -3728, 4021, 9960, -6620, -25795, -18204, -12091, 366, 21702, 16348, 9109, -3725, +-20439, -12403, 7971, 15185, 14176, -5781, -13813, 1760, 18020, 15102, 3014, -6276, -5847, 4975, 12275, -8407, +-26968, -19490, -13202, 5064, 25329, 14776, 6237, -8569, -23114, -8636, 9852, 16200, 16051, -7880, -13673, 1361, +13202, 13860, 4748, -789, -1659, 3794, 8005, -12332, -23982, -14402, -13214, 3269, 21596, 15348, 9633, -8096, +-23763, -11191, 7245, 15313, 15203, -6167, -10594, 5415, 12921, 9697, 2190, -2619, -1307, 6443, 10437, -11320, +-24434, -14077, -13680, 6580, 22938, 12755, 5706, -12295, -20589, -2621, 9068, 12611, 8239, -11467, -8912, 8931, +16084, 10264, 2861, -1906, -3933, 3502, 7220, -11390, -20728, -12145, -11642, 7714, 22585, 12716, 4563, -15476, +-22872, -759, 11772, 15232, 8290, -13642, -9285, 8009, 14068, 8950, 2344, 168, -234, 5374, 3248, -15628, +-20129, -11351, -9974, 10359, 21465, 13332, 4518, -17486, -22097, 521, 10729, 14623, 5166, -14421, -4346, 10884, +12978, 7214, -336, -1765, 623, 4785, 1641, -13835, -16693, -10520, -11165, 9827, 21756, 13947, 1939, -20380, +-20645, 4651, 13317, 14827, 390, -18480, -3856, 13607, 15500, 8163, -1190, -3052, -1154, 4661, -645, -15882, +-16465, -10372, -5297, 14626, 20364, 11547, -3392, -22235, -16307, 7454, 13459, 13075, -1402, -16183, -787, 12713, +11411, 5992, 844, -411, 388, 2970, -3835, -16683, -15224, -11598, -5846, 16326, 21281, 15877, -3472, -27821, +-16957, 8833, 16401, 15660, -6198, -18456, 835, 15248, 14504, 5960, -1237, -3566, -289, 3651, -4581, -14399, +-12987, -12475, -5977, 15620, 20492, 16046, -5014, -28222, -13540, 11210, 16298, 14432, -9509, -18008, 4060, 15546, +12454, 4879, 568, -294, 861, 1387, -10284, -16518, -10275, -9742, -1215, 16792, 17470, 13447, -8118, -27826, +-10391, 12163, 16502, 14599, -10409, -17774, 4297, 14655, 12455, 5979, 322, -1605, 160, 1870, -9426, -15203, +-10983, -13454, -73, 19858, 18995, 13414, -12807, -29561, -6342, 14361, 16938, 11831, -13944, -15049, 8290, 15150, +9766, 4288, 260, 383, 1903, -1435, -12804, -14156, -8224, -10440, 1253, 17525, 16790, 12257, -14172, -28939, +-3982, 15314, 18169, 10681, -16324, -14559, 8881, 15193, 10149, 5416, 186, -1175, 1675, -2442, -13162, -12621, +-9596, -11291, 4433, 19250, 18534, 9420, -19794, -28962, -352, 17063, 18164, 7333, -18137, -11127, 10897, 13666, +7856, 4853, 1317, 565, 1673, -5321, -14879, -11070, -8680, -9920, 6365, 17191, 17764, 7812, -21728, -25954, +1868, 16032, 18019, 4179, -18706, -8029, 11761, 12692, 6856, 4225, 1070, 943, 1592, -7211, -14894, -10095, +-9063, -8645, 8926, 17917, 17560, 4324, -25731, -24568, 5651, 17819, 18971, 757, -20624, -5796, 12812, 12280, +6355, 3457, 842, 1390, 1654, -9223, -15483, -8292, -9173, -7250, 10771, 17451, 17771, 1849, -27458, -21901, +7457, 16551, 18185, -1225, -19769, -2328, 13414, 10182, 5268, 3522, 1048, 1416, 574, -11147, -14907, -6865, +-9683, -5337, 13140, 16952, 17216, -2105, -29794, -17912, 10811, 17975, 16827, -6223, -19722, 681, 14547, 9851, +4752, 3101, 1224, 1790, -645, -13023, -14636, -6043, -9168, -3270, 14204, 16371, 16686, -4725, -30226, -14526, +11369, 17282, 16380, -7941, -17468, 3371, 13294, 7956, 4523, 3049, 1256, 2280, -1842, -14302, -13217, -5940, +-9385, -661, 14893, 16448, 14838, -9133, -30472, -10117, 13899, 17156, 13588, -11607, -15859, 6869, 13957, 6987, +4034, 2030, 796, 2173, -3692, -15097, -11225, -5365, -9440, 1883, 15295, 16545, 13319, -13060, -30084, -6373, +14791, 17286, 11341, -13585, -13476, 8751, 12705, 5800, 4761, 2301, 947, 1553, -6648, -15902, -9188, -5383, +-8964, 4543, 15531, 16387, 10677, -17173, -28475, -1886, 15837, 16887, 7356, -16183, -10531, 11002, 12098, 4626, +4089, 1327, 958, 1496, -8820, -16318, -8059, -6273, -8205, 6740, 15222, 16453, 7844, -20655, -26543, 1826, +16184, 16740, 4326, -17122, -7752, 11621, 10137, 4224, 4675, 1225, 1141, -93, -11520, -15823, -6002, -6239, +-7231, 8433, 14999, 16721, 4413, -23716, -23714, 5213, 17176, 16356, 739, -17861, -4332, 13342, 9174, 3454, +3919, 660, 1792, -789, -13559, -15308, -5253, -6889, -4923, 10749, 14827, 15644, 405, -26111, -20112, 8442, +17194, 15432, -2546, -17355, -961, 13638, 7417, 3704, 4612, 100, 1558, -2941, -15620, -13590, -3978, -7555, +-3338, 11757, 14883, 15721, -3484, -27822, -16392, 10918, 17786, 14186, -6166, -16181, 2396, 14307, 6183, 3255, +4293, 79, 2232, -4443, -17367, -12371, -3565, -7103, -558, 12430, 14481, 13938, -7551, -27892, -11714, 12929, +17541, 12086, -9102, -14269, 5277, 14022, 5140, 3555, 4315, 287, 1646, -6996, -18256, -9950, -3003, -7454, +1704, 12788, 14960, 12277, -12175, -28184, -7583, 14641, 17769, 9771, -11819, -12085, 7713, 13210, 4111, 3855, +3981, 647, 1584, -9262, -18983, -8666, -3248, -6968, 4834, 13346, 14616, 9629, -16455, -27022, -3041, 15736, +17168, 6614, -13576, -8878, 10269, 11874, 2790, 4026, 3593, 1144, 1097, -11209, -18668, -7308, -3589, -6652, +5750, 13294, 14884, 8660, -17611, -26428, -2144, 15867, 17205, 6181, -13714, -8699, 10269, 11874, 2790, 4026, +3593, 1144, 1097, -11209, -18668, -7308, -3589, -6652, 5750, 13294, 14884, 8660, -17611, -26428, -2144, 15867, +17205, 6181, -13714, -8699, 10192, 11850, 2774, 4229, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 93, -70, 42, 593, 694, 511, +100, 308, 704, 559, 529, 1109, 1261, 1057, 133, -280, -312, 287, 272, -1719, -2683, -2434, +-1026, -541, -2012, -2681, -1731, 30, 914, 662, 807, 2408, 2726, 1727, 587, 1169, 2877, 3665, +2667, -405, -3745, -4068, -1757, 483, 821, 626, 346, 31, -265, -1167, -1358, -1036, -128, -388, +-1684, -2794, -3445, -3069, -2448, -1818, -708, 298, 1278, 2315, 1726, 878, 404, 404, 521, 1000, +1001, 64, -953, -230, 1557, 2581, 2068, 1534, 1763, 2128, 915, 357, 123, -453, -62, -83, +-907, -1422, -1545, -594, 26, -335, -565, -1293, -932, -958, -1067, -976, -1820, -2030, -1196, -127, +105, 6, 304, 1127, 2051, 2667, 2396, 2633, 2512, 2635, 420, -1384, -2677, -2243, -1687, -729, +-1569, -2928, -2959, -1094, 739, -381, -1936, -2063, -1326, 279, 419, 655, 1921, 2909, 1620, 115, +753, 3575, 5680, 6274, 4083, -449, -2920, -2158, -224, 401, -115, -420, -595, -534, -1067, -1331, +-773, 56, 474, -642, -2028, -2541, -1797, -328, 107, -983, -1557, -537, 1176, 2629, 1896, 526, +-456, -1000, -679, -160, 292, 658, 1967, 3084, 1452, 803, 2167, 2240, 655, -1695, -1746, -995, +-1190, -2923, -5170, -5310, -3232, -1219, -1840, -3767, -3495, -333, 2358, 2519, 1151, 1113, 2503, 2872, +1378, -100, 1200, 4049, 4366, 2516, -471, -1167, 1023, 4213, 4182, 1678, 553, 1083, 2269, 1542, +230, 1, -869, -859, -2049, -4384, -4754, -4009, -3241, -2290, -3266, -2994, -2170, -1727, -1063, -1732, +-1083, -206, 679, 1966, 2529, 1815, 57, -153, 2282, 5088, 6482, 2694, -2494, -1288, 3300, 2556, +-684, -2553, -1377, 1974, 836, -909, 628, 1678, 3598, 2217, -1722, -1162, 1535, 3440, 2631, 6, +-4014, -8399, -7289, -4122, -3907, -2269, -1825, -992, -1106, -1751, -141, 4069, 6208, 4707, -187, -3558, +-3667, -3851, -2498, -1807, -1180, -1537, -1690, -1146, -1417, 817, 3856, 6154, 6569, 5048, 2808, 656, +1700, 1426, -491, -613, 55, 3205, 3833, -129, -1921, -1937, -2780, -2824, -669, 2698, 1868, 57, +254, 269, -493, -811, 307, 2914, 4191, 2305, -677, -2406, -1471, -1504, -760, -282, 141, 1630, +-32, -1869, -725, -703, 95, 1296, 1989, 1922, -503, -811, 2534, 3551, -1048, -5670, -7438, -5848, +-4596, -4647, -4733, -7029, -7802, -3558, -311, 2696, 5649, 6447, 4902, 3085, 2209, 2357, 5497, 7499, +3054, -2495, -5512, -6706, -4021, 2435, 7380, 8198, 7496, 7567, 6022, 3266, 1824, 1106, 820, -372, +-5308, -6406, -7515, -6120, -4712, -4036, -5074, -4389, -1593, 2043, 2683, 1659, -2140, -2631, -173, 303, +840, 1906, 1901, 2493, 3666, 4315, 4079, 4227, 7272, 9288, 6171, 1709, -1742, -6549, -10471, -5432, +-3419, -4505, -5839, -6561, -1029, 4748, 4171, 3488, 3862, 3021, 163, -3221, -4400, -2963, 425, 2721, +389, -6256, -9562, -6041, 2669, 8169, 8200, 4059, 1806, 1927, 49, -803, 182, -1171, -2965, -5732, +-6991, -7082, -4783, -2901, -25, 2873, 3828, 697, -1785, 781, 2049, -2587, -5290, -2226, 1655, 5529, +4461, 1927, 188, 711, 2110, 3432, 2891, 2757, 709, 255, 2505, 1771, 304, 2252, 3910, 4841, +1999, -1314, -22, 3323, 6037, 7307, 6623, 2354, -1655, -4068, -6211, -5844, -4906, -2959, -3947, -7662, +-7796, -3909, -497, 1199, 2527, 1474, -672, 487, 2430, 1126, 453, -2081, -3622, -2436, -2193, -1494, +379, 904, -745, -3413, -3322, -1316, 662, 1965, 2324, 2529, 2579, -866, -4922, -5195, -939, 3450, +5543, 7267, 7315, 5364, 3035, 1910, 197, -1978, -3455, 371, 1859, 1848, -3604, -9104, -7877, -5657, +-2809, 277, 1238, 748, 36, 680, 3982, 6898, 4061, 6035, 8700, 6997, -779, -3244, -3369, -2972, +-313, 4470, 6990, 5277, 3306, 1670, -1496, -3181, -3870, -4421, -3840, -5743, -8170, -4867, -4908, -6261, +-6289, -4080, -2613, -798, 2574, 3394, 3331, 3705, 3370, 5350, 8864, 8985, 6438, 987, 390, 1810, +5212, 7633, 5335, 5051, 2330, -2042, -2996, -4830, -8585, -10262, -9979, -7152, -3086, -1707, 624, 2936, +2483, 98, -2099, -2432, -3317, -1479, -1818, -2790, -5643, -7725, -6764, -4122, -40, 1237, 1146, -1912, +-1886, 1669, 3886, 9756, 13809, 12529, 9871, 7512, 2807, 1244, 3172, 1491, -3071, -81, 2604, 4548, +1947, -2131, -2818, -5587, -5594, -2139, 2029, 738, -1990, -238, -1, -5192, -6275, -3901, -2970, -1991, +-3162, -4138, -4960, -3032, -4083, -3551, -4777, -1933, 5471, 9877, 9855, 3777, 692, 6235, 4707, 1584, +2257, 292, 1530, 3823, -554, -4380, -7155, -3479, 651, 3932, 4524, 3220, 2725, 1275, -864, -2189, +-3462, -745, 2034, 1190, -5728, -9879, -7773, -3685, -2474, -1712, -4607, -7417, -7433, -2449, 1627, 4292, +6870, 5547, 3454, 5452, 7190, 4606, 3811, 4353, 3432, 5205, 2954, 190, 1054, 272, -3883, -8760, +-12833, -8542, -1612, 3079, 1165, -1572, 1534, 5114, 5814, 1019, -894, -1971, -1702, -2143, -4148, -5100, +-1603, 2059, 783, -811, 144, 6580, 10723, 8144, 4002, 5927, 7109, 5953, 2655, 152, -127, 841, +-2163, -9575, -11849, -14647, -8707, 148, 2555, 2130, 75, -1343, 836, 1583, -607, -4185, -6138, -5630, +-3985, -2430, -3905, -8912, -7175, -95, 3173, 1624, -2717, -584, 2528, 1990, 297, 2872, 6210, 10851, +13739, 8441, 7740, 5609, 2232, 4455, 10713, 13632, 11857, 8757, 1048, -6644, -10399, -11743, -9414, -9111, +-11752, -10506, -1642, -3018, -6397, -7466, -4938, -2824, -3064, -4232, -2536, -2968, -4698, -4626, -2712, 2264, +9449, 11988, 6651, 873, -1681, 4628, 11203, 10445, 6794, 3779, 1660, -146, 527, -2419, -3678, -2561, +88, 3748, 6496, 6550, 939, 362, 2755, 3292, 2836, 802, -47, -2230, -4667, -7166, -9123, -9668, +-6865, -1732, 963, -1521, -7024, -12814, -10603, -6174, -7834, -6773, -2781, 3602, 8564, 5488, -2159, -492, +1618, 1644, 4256, 7929, 13091, 12862, 8558, -753, -6704, -7323, -4495, -1562, -2944, -8614, -7070, -1341, +-1058, -1201, -2105, -3308, -5345, -5711, -2305, 1200, -1268, 84, 7616, 13627, 12897, 8312, 9919, 9942, +6089, 7810, 10083, 4370, -2264, -443, 448, -1156, -3554, -4831, -1504, 798, -1151, 5131, 8786, 10113, +6137, 1324, -1663, -3743, -4475, -7234, -8951, -7695, -8231, -9736, -15182, -16677, -11887, -3909, 4077, 1620, +-320, -3854, -5108, -6339, -8801, -7270, -22, 5313, 6266, 5122, 2206, 2291, 5888, 6668, 9618, 13065, +17884, 12198, 10372, 5897, -1077, -7021, -8087, -4801, -2523, -10075, -10510, -2327, -139, -4375, -9313, -11944, +-8388, -6710, -7771, -6162, -5944, -4579, 1809, 11264, 16177, 15282, 12419, 11612, 7738, 5751, 8680, 16021, +14872, 10186, 1528, -3579, -6804, -10422, -4812, -1723, -5402, -2032, 4256, 7045, 6877, 8055, 11697, 6410, +5135, 4737, -675, -4868, -5721, -4128, -5243, -9798, -9891, -8292, -829, -3569, -7194, -8349, -13840, -14709, +-15591, -16285, -12406, -7810, -3362, 80, -766, 844, 395, 4108, 13721, 11887, 15755, 17871, 16100, 10844, +1050, -8043, -7420, -3433, 1876, -4016, -9373, -3040, 303, 30, -900, -4719, -6077, -11727, -13918, -8751, +-6406, -5689, -883, 2071, 5444, 7252, 8139, 13084, 16396, 14722, 14617, 13289, 12427, 14451, 11752, 5405, +3372, -755, 995, 4908, 1118, 1078, 4703, 2300, 5105, 7258, 9049, 4228, 1373, 4678, 3889, -2020, +-11288, -15200, -12820, -15568, -17000, -15140, -10354, -6678, -10362, -10112, -14444, -17304, -16986, -14263, -10836, -5061, +4200, 9924, 5461, -755, -2087, -83, 10541, 12560, 13961, 23093, 18140, 7305, 826, -5630, -5468, -5617, +-5096, -3809, -9364, -10230, -7763, -10491, -6807, 2899, 2711, -3919, -11528, -11840, -4959, -650, 3521, 6013, +10365, 14223, 16691, 15500, 13290, 6200, 6426, 13357, 16203, 13322, 8103, 5874, 7155, 5542, 3525, 3513, +3971, 3741, 5203, 65, -1528, 4516, 9676, 7814, -686, -4146, -3852, -3813, -5691, -8772, -9467, -10890, +-12751, -10370, -6065, -8614, -15910, -12519, -12613, -19569, -21807, -23481, -18952, -10579, 94, 7926, 6528, 6080, +1249, -4547, 3769, 12921, 17568, 30464, 26294, 11729, 4201, -1174, -1222, -1373, -2058, -2552, -7693, -12165, +-13177, -9807, -3515, 1797, -894, -9882, -16145, -17427, -10721, -2832, 2814, 4350, 8813, 12726, 15085, 16987, +16996, 10026, 4565, 11908, 14518, 10580, 12134, 13060, 13118, 6833, 258, 1419, 9315, 11145, 12837, 9916, +5617, 9482, 10007, 7832, 3357, -2775, -4146, -10193, -14345, -18993, -16256, -12057, -17176, -16154, -11610, -14228, +-15882, -14700, -13051, -19727, -25021, -23176, -19571, -15112, -8226, 2217, 8926, 7087, 4012, 2810, 9165, 16168, +20369, 21523, 23244, 15262, 4896, 738, -695, -781, -2814, -832, -3411, -11906, -15756, -11642, -7528, -2240, +-2838, -7739, -9565, -17413, -13003, -4989, -2445, 2693, 8643, 17496, 21256, 17894, 12553, 11298, 10686, 12987, +15447, 13962, 10297, 6887, 10826, 9579, 1838, 2621, 11151, 15204, 12744, 8442, 7842, 13205, 14465, 8517, +1210, -5289, -6753, -7907, -11031, -13511, -12437, -9861, -15478, -18123, -9114, -11644, -16217, -18862, -17643, -20632, +-26818, -21719, -17451, -19260, -15839, -4802, 6269, 12944, 13653, 9067, 10326, 15376, 17311, 14024, 16299, 15399, +7493, 516, -1868, 898, 502, -1101, -2015, -5384, -13886, -15898, -11824, -4288, 1156, -3881, -11573, -15352, +-15737, -6278, -3777, -303, 9255, 20095, 21811, 14781, 11017, 13675, 15170, 12247, 9409, 11194, 10472, 6924, +9722, 15449, 11526, 2390, 6496, 12863, 11558, 7735, 8396, 14893, 17491, 9222, 1356, -2182, -8362, -9307, +-13400, -15420, -13749, -13895, -16716, -20333, -12541, -10039, -15832, -17507, -16116, -20535, -26033, -20260, -16549, -20995, +-21622, -8808, 3154, 6334, 13002, 12686, 13899, 14128, 14224, 11967, 10129, 12163, 9784, 2994, -459, -467, +-1859, -1731, -2921, -4479, -8607, -12905, -10206, -3899, -47, -1849, -9976, -10110, -11693, -6871, -5639, -1588, +7383, 16506, 20430, 14533, 11429, 16591, 19797, 14218, 6021, 8367, 10953, 7378, 10143, 15363, 11484, 6105, +6507, 11893, 11812, 11193, 13401, 14865, 19049, 11424, 1242, -191, -10173, -11416, -11683, -14289, -13745, -15309, +-14824, -18225, -17696, -12575, -14210, -17511, -16920, -15601, -21495, -20904, -19019, -20365, -21165, -12017, -251, 4137, +13011, 15907, 16263, 15607, 12401, 10521, 7638, 7100, 5750, 1078, -782, -1608, -2061, -1185, -566, -3657, +-7652, -11373, -9560, -4962, 20, -2338, -8935, -7143, -10743, -8995, -4912, -2348, 5195, 9048, 13787, 15100, +13847, 17529, 18248, 16154, 8752, 7817, 12441, 11660, 8014, 13285, 13856, 7583, 4050, 8534, 12356, 15110, +18461, 15949, 15451, 10718, 6063, 2778, -9866, -16525, -11960, -11297, -12677, -18591, -15145, -16638, -18736, -15260, +-14956, -15651, -13101, -9295, -13119, -20589, -23590, -21393, -17061, -10991, -5769, -3003, 5368, 13466, 16198, 16409, +15010, 13318, 8175, 4053, 3423, 1563, 3894, 1882, -2926, -3910, -2561, -4579, -5158, -7637, -7599, -6105, +-2735, -2352, -4661, -1776, -6564, -10449, -5126, 161, 716, 3590, 8321, 13129, 14286, 13903, 12775, 14228, +12338, 11009, 17087, 12228, 3802, 10032, 12964, 10568, 3966, 3799, 12318, 14795, 18959, 20956, 18581, 14630, +8378, 3537, -7530, -17030, -14061, -11723, -14834, -16011, -18291, -19582, -22536, -17622, -14540, -12140, -8263, -3791, +-5560, -16823, -21269, -20280, -14083, -13712, -12109, -6431, -490, 10375, 16387, 18762, 20312, 16158, 5474, 2852, +6491, 6569, 5112, -107, -69, -5284, -10438, -6885, -3032, -4548, -8059, -7545, -1645, 1596, -3012, -2901, +-6489, -6292, -5158, -2637, -2178, 972, 9933, 16220, 12760, 10879, 11179, 11921, 11952, 11029, 18188, 17286, +4400, 5667, 12340, 7143, 1126, 2986, 10100, 14281, 17805, 23312, 23770, 18659, 8174, -1353, -8538, -13269, +-12788, -12537, -16899, -17509, -18941, -20482, -22711, -22100, -15252, -8958, -9270, -6240, -6041, -10146, -12780, -14332, +-14931, -13796, -12184, -5105, 864, 7556, 13963, 17181, 19049, 16823, 10115, 2424, 3736, 6191, 2266, -446, +-4903, -9362, -11239, -3069, 1683, -3503, -8257, -7399, 1892, 6581, -575, -3754, -4264, -4448, -7622, -8716, +-3798, 272, 7260, 11201, 9179, 4020, 5660, 11804, 18495, 16618, 18498, 21387, 5848, 904, 4300, 2715, +890, 192, 9741, 16159, 15072, 21455, 26428, 23816, 11327, -2969, -8307, -8050, -11077, -12306, -15896, -15580, +-20021, -21225, -20521, -20302, -14790, -9225, -11172, -9541, -6918, -6686, -10406, -11870, -13406, -10127, -9159, -10062, +-1222, 3918, 12003, 15979, 18024, 19506, 12983, 2768, 907, 5755, 3110, -771, -6704, -10165, -11607, -4155, +2343, 30, -6144, -5081, 2567, 4530, 395, -1892, -1679, -3211, -8998, -9616, -1050, 2112, 1369, 3457, +4257, 137, -1179, 5728, 16604, 21773, 20066, 23978, 15554, 3410, 4766, 4030, 1829, 1920, 5897, 14626, +12469, 15687, 28664, 27472, 14180, -356, -4092, -3649, -7943, -9695, -12910, -16326, -21064, -23284, -20224, -20101, +-19717, -13666, -10976, -8635, -5523, -3104, -2441, -5420, -8384, -8018, -7892, -10681, -8572, -4932, 4317, 11524, +15246, 18746, 13985, 4182, 1581, 4733, 5703, 1658, -2838, -7579, -8888, -5756, -704, -1641, -5767, -6707, +863, 5417, 1351, -1343, -2170, -369, -5696, -7778, -2250, -2868, -1263, -1893, -1482, -270, -4127, 1787, +11437, 19293, 21088, 21720, 18217, 7020, 604, 955, -540, -4306, 6172, 14661, 16900, 13628, 24991, 27873, +18760, 7223, 459, -2344, -7357, -11413, -11249, -18103, -22878, -21611, -16619, -17879, -21054, -18820, -12383, -7255, +-4161, -3009, -468, -2020, -3968, -3231, -2136, -7349, -11494, -8156, 429, 9866, 11428, 15345, 15447, 5798, +2227, 725, 2381, 375, -608, -3101, -4032, -5455, -2522, 2906, -160, -6006, -3312, 6061, 2426, -487, +-2197, -2018, -1280, -4218, -5688, -4734, -3767, -4316, -4666, -351, -632, 1292, 6157, 13367, 18879, 19192, +18481, 9238, -2877, -379, 11, -3329, -293, 7772, 15331, 13133, 20544, 27379, 18568, 14253, 6494, 1305, +-4873, -13168, -11172, -15054, -17162, -17039, -20294, -24150, -21127, -17573, -11724, -8818, -8399, -4376, 1001, 4337, +1755, -1858, -604, -4482, -11640, -10469, -5297, 5063, 13667, 12545, 15694, 7219, 3457, 5701, 5064, 1383, +-2453, -1087, 1830, 511, -1481, -297, -1203, -4766, -7701, 2251, 7751, 2958, -496, -2256, -262, -2591, +-8655, -7349, -3363, -1814, -2592, -2873, -2752, 1377, 7444, 11559, 18220, 18514, 17073, 13997, 3563, 125, +1331, -180, -1955, 2664, 7829, 12282, 15124, 24946, 22131, 15893, 8062, 1191, -1658, -11435, -15285, -15182, +-16000, -12663, -18940, -24728, -20088, -19693, -13171, -10938, -11829, -6725, 743, 6712, 3517, -133, 461, -2213, +-7860, -8462, -2426, 3030, 7631, 11600, 10920, 4923, 1558, 4072, 3410, -1325, -5629, -1033, 5098, 4877, +-4067, -4412, -3986, -4428, -7090, -131, 8363, 9279, 5783, -2396, -2260, -1645, -3420, -5193, -4268, -851, +-2041, -4341, -1952, -1235, 845, 7756, 13806, 15154, 12459, 11802, 10447, 3437, 1145, 2015, -1973, -892, +4918, 13673, 18176, 19145, 22306, 19332, 15551, 6251, -2639, -10878, -16126, -13343, -14822, -13259, -18045, -23525, +-16923, -16832, -17451, -15736, -16725, -6700, -1370, 4814, 5388, -451, -197, 149, -4776, -8785, -7398, 961, +7811, 6979, 6266, 5961, 4005, 5441, 3479, 786, -5365, -1156, 9441, 8900, -2310, -8997, -7053, -4035, +-7868, -2654, 8445, 10177, 7032, 371, -1959, -1961, -5963, -5350, -1724, 1, -2897, -7454, -4383, -275, +-341, 4734, 8455, 11810, 9981, 10913, 16084, 7175, 331, 3289, -1050, -2909, 466, 9535, 15333, 16746, +22900, 23803, 17604, 9919, -1378, -7766, -15774, -14398, -11555, -14806, -17606, -19603, -15743, -13865, -18879, -18752, +-15597, -9931, -1263, 2933, 6599, 3526, 1482, 2131, -1516, -4596, -7379, -1171, 5539, 4369, 895, 5032, +5534, 6370, 2353, -822, -301, -406, 8137, 8640, -2162, -8146, -6201, -7084, -7390, -5408, 4785, 11857, +7015, 2051, -120, -858, -5078, -4073, 1820, 60, -5880, -5125, -3702, -2920, -3284, 1227, 8315, 10565, +11999, 10682, 13038, 11310, 3774, 3198, -566, -4926, -1476, 3166, 11411, 9601, 16911, 30616, 22703, 11952, +4296, -5716, -11453, -8993, -6150, -11238, -15677, -16918, -13363, -12111, -20090, -22022, -12962, -9997, -5887, -4736, +2621, 5532, 4043, 4104, 3701, 11, -4119, -2615, 1870, -2372, -3888, 3236, 6523, 3406, 3094, -197, +4016, 1495, 2185, 4961, -1592, -7859, -8047, -7682, -6360, -3967, 4947, 8712, 5358, 5045, 2319, -1678, +-5253, -3655, 983, -430, -5297, -5161, -5833, -8512, -5168, 1186, 9599, 11718, 10110, 8908, 9682, 13255, +5838, 3177, -737, -3482, -2678, -2392, 6824, 10595, 13975, 27438, 25226, 13403, 9603, -2683, -8354, -8639, +-7388, -10385, -14179, -17441, -11645, -7849, -15677, -22095, -15153, -9619, -10229, -10182, -3104, 6620, 5309, 4305, +2686, 4458, 1180, -2945, 1630, -1268, -4746, -60, 4724, 7020, 8060, 2444, 8335, 7540, -2415, 723, +264, -5234, -6447, -7840, -6138, -6467, -1951, 5625, 7564, 5877, 6051, -35, -1287, -3338, 2203, 3067, +-3347, -5844, -6496, -10206, -8879, -2602, 8408, 13991, 10360, 4074, 6967, 15207, 7207, 978, 652, 331, +-726, -4931, 815, 10028, 11509, 19572, 22300, 16275, 11228, 186, -4749, -6305, -9579, -10474, -12522, -15657, +-11860, -6808, -8275, -18193, -18632, -10744, -13888, -14112, -5635, 4261, 4220, 1999, 2965, 5514, 5263, -1999, +-1554, -532, -3719, -1712, 5557, 8494, 10881, 3226, 7948, 7913, -3111, -1443, 393, -2786, -3954, -7433, +-5577, -3435, -2327, 5577, 6571, 4470, 7529, 2231, 2036, -2570, -2776, 2402, -1194, -7820, -10490, -11001, +-7795, -327, 8106, 15170, 9949, 4887, 6867, 13032, 7515, -849, 889, 1029, -283, -4404, -2822, 8281, +13113, 13728, 19815, 14734, 11654, 8699, 782, -4412, -10743, -12759, -9914, -15076, -11370, -8535, -5819, -8956, +-17110, -15578, -18855, -16777, -8173, -1844, 89, -371, 3400, 6125, 6043, -1171, -5515, -1543, 1277, 626, +3516, 8639, 11384, 6995, 3651, 6080, -85, -2570, 477, 2353, 1183, -4364, -8150, -3313, -3360, 1147, +4442, 1655, 8234, 6887, 1591, -2786, -5308, 228, 2552, -6847, -11843, -10633, -5490, 1800, 8377, 11524, +8966, 5367, 4685, 7559, 2936, -1718, -2105, 2091, 1704, -1738, -2546, 5721, 13478, 14350, 16720, 12555, +8359, 10593, 4661, -1873, -6096, -11257, -6504, -9753, -9916, -6435, -4513, -2807, -11695, -17396, -20656, -22931, +-13137, -8653, -1836, -2034, 1277, 7059, 6143, 1477, -2237, 254, 7538, 7835, 6100, 10278, 7759, 5173, +2909, 2605, 817, -2599, -2721, 3380, 6276, -3861, -7029, -3956, -1675, -1983, 3787, 304, 3322, 8707, +989, -628, -9870, -7042, 3743, -977, -8326, -8609, -4227, 803, 5829, 8433, 8443, 3898, 5223, 6494, +3479, -599, -3149, 3255, 4644, 604, -1765, 3374, 10212, 12115, 8088, 7381, 7163, 11980, 9177, 292, +-2425, -4788, -2495, -4432, -7684, -3251, -593, -2339, -10120, -17254, -20304, -23489, -20302, -13736, -8653, -3933, +672, 7095, 7811, 1455, -1049, 1721, 8428, 8008, 5504, 9100, 7047, 4805, 2285, 3642, 5950, 652, +1620, 4079, 5127, 1610, -4665, -6754, -3265, -4475, -2963, -1403, 21, 8068, 3266, -4439, -6242, -6225, +4189, 7292, 1209, -2439, -94, 3702, 2499, 2257, 5216, 3775, 670, -651, 1053, -1655, -3573, 1367, +6387, 6212, 6031, 7277, 10611, 10125, 487, 793, 2771, 7588, 8312, -469, -858, 118, -5344, -4029, +-10550, -7070, 320, -3607, -6498, -15979, -21340, -20013, -20313, -17155, -10767, -5491, -158, 1154, 4065, 2857, +1014, 4385, 6971, 8503, 6002, 7626, 12673, 9314, 6944, 4530, 5951, 6496, 3397, 2534, 7190, 2231, +-3294, -7512, -6876, -4167, -4239, -728, 2294, 6613, 5718, -2793, -5485, -3736, 372, 6893, 6390, -5034, +-5120, 1291, 1639, -1621, 2284, 4181, 836, -283, 821, 1887, -3122, -642, 1358, 5634, 7580, 8898, +10918, 8351, -1315, -1935, 2156, 7500, 8329, 2597, 6769, 5510, -3193, -7054, -9712, -10481, -4433, -4543, +-7841, -12861, -21423, -19071, -19635, -19599, -14340, -10632, -5122, -5369, 788, 4830, 2645, 3749, 6814, 9804, +7345, 5633, 12630, 14903, 8412, 5096, 8462, 12943, 8646, 1491, 2789, 3846, -3008, -3885, -6344, -4780, +-9548, -6914, 2882, 7095, 4292, -3922, -6429, 1084, 2730, 7768, 8519, 1365, -1707, 5968, 2809, -5009, +-2682, -133, 854, 154, -333, 3018, -2390, -2425, 558, 3947, 9546, 10869, 11210, 6550, -922, -5902, +146, 3867, 4539, 4981, 5403, 7383, 2440, -5794, -11038, -15573, -9298, -5486, -10222, -9530, -16280, -17965, +-16497, -17407, -16806, -15349, -8888, -7143, -3725, 4475, 4269, 1758, 6353, 10742, 9974, 7302, 12236, 15222, +11632, 8268, 6729, 12300, 10050, -585, 480, 2167, -3351, -2397, -5161, -4974, -9269, -8157, 4437, 7905, +3612, -51, -2863, 777, 3278, 4393, 7517, 5081, 2012, 4591, 6235, -1857, -7694, -4370, -642, 4272, +3948, 878, -3505, -2485, 66, -60, 4511, 7837, 11181, 9713, 4793, -1477, 763, 2533, 6166, 8672, +3370, 7810, 6498, -5995, -10602, -17878, -17815, -11894, -10839, -8546, -12768, -15507, -12017, -13400, -13667, -15900, +-16367, -10685, -5180, -59, 1558, -658, 7082, 8927, 11995, 11359, 10207, 15353, 17024, 11334, 6473, 7565, +9679, 491, -4097, 534, -4214, -3571, -3707, -4775, -6739, -8270, -1241, 4610, 4574, 1295, -2237, -1288, +2669, 5571, 8680, 11630, 5964, 4455, 8035, 1292, -11277, -7719, 226, 5129, 6186, 2, -2582, -4510, +1724, 839, -599, 6144, 8160, 12272, 10323, 1259, -874, 1455, 3338, 7496, 2589, 4407, 9084, -4591, +-13704, -15740, -22484, -15175, -9404, -8426, -5945, -12192, -11442, -10676, -13774, -16273, -17213, -12621, -8566, -4480, +1212, 4228, 7675, 10158, 14390, 16305, 12305, 15765, 20422, 15504, 4045, 2357, 5796, 1018, -1989, 1601, +1092, 103, -1361, -2286, -1322, -3626, -5001, 1727, 2610, -2085, -5006, -4191, 1705, 5929, 7531, 11576, +9186, 5882, 9780, 6727, -5033, -5854, 236, 3435, 1809, -1983, -4345, -5010, 1419, -1108, -2780, 2295, +3434, 14986, 13174, 7123, 2217, -902, 30, 3056, 2731, 1760, 7293, -3676, -15531, -19077, -25291, -18564, +-12262, -13429, -5490, -8157, -11799, -11300, -13408, -13374, -14410, -13772, -11669, -10895, -3673, 5891, 8289, 13676, +14762, 18806, 17690, 20580, 22983, 15895, 7105, 1814, 4422, 1373, -3270, -2412, -971, -1513, -3809, -1587, +1544, -434, -3376, -636, 5087, 2387, -1911, -3088, 1898, 6309, 6009, 10316, 10154, 6590, 6411, 5271, +147, -2493, -1252, 2818, 1867, -1732, -806, -259, -216, -2851, -5226, -144, 2270, 9610, 14061, 11070, +7971, -561, -2648, -1075, 1493, 199, 2407, -4879, -13996, -21065, -24928, -22575, -15445, -11159, -4152, -4986, +-9154, -8648, -7664, -8394, -12111, -14441, -16036, -15636, -7151, 2860, 8690, 11766, 14461, 18563, 21248, 22408, +22892, 15382, 8941, 6559, 2223, -304, -4565, -4458, -4075, -5517, -7259, -1499, 345, 947, -2907, -4250, +1516, 2595, -249, -755, 1636, 7972, 7147, 7210, 10243, 9953, 8105, 6411, 4253, -1964, -2054, 408, +2029, 3256, 3520, 486, -3691, -2838, -1326, -481, -1729, 5515, 10605, 12193, 7801, 1818, -1582, 734, +-180, -2070, -3723, -5004, -8534, -15310, -19778, -22250, -19482, -13702, -8348, -3297, -4511, -6947, -4335, -8994, +-11443, -14371, -16208, -15237, -8631, 2057, 7127, 8120, 14006, 17504, 23027, 23457, 22163, 14709, 7700, 5090, +1586, 467, -3920, -8524, -8209, -5335, -4569, -1348, 604, 1685, -1757, -2416, 1477, 2082, 1978, 1442, +600, 4785, 1959, 2485, 9785, 11749, 13239, 15507, 8440, 3540, 865, 597, 4998, 2991, 903, 2226, +-2259, -3346, -71, 1666, -2352, 2907, 5825, 10246, 14164, 8294, -442, 318, -4208, -6984, -10846, -10120, +-10288, -15045, -18718, -22143, -23125, -15481, -6082, -2417, -1447, -7233, -4117, -8117, -13676, -14461, -15672, -13793, +-10409, -4477, 5343, 9610, 13367, 19163, 24947, 27931, 23768, 15367, 6288, 1327, -3300, -3694, -2469, -7160, +-6869, -7054, -5107, -4937, -2823, -1501, -1514, -2610, -1762, 721, 2836, 3661, 3321, 3918, 4238, 3699, +7390, 13544, 16540, 18286, 11888, 4845, 3924, 3779, 4448, 4940, 1078, 1298, 2814, -1566, 42, -1094, +-4864, -795, 5636, 9168, 13817, 11131, 4302, -425, -4909, -8983, -10382, -10500, -9861, -14709, -16205, -15539, +-20580, -20473, -16024, -6135, -313, -5072, -2139, -5053, -11593, -13885, -12088, -12935, -11012, -9078, 2261, 12866, +12931, 14804, 21993, 24980, 25242, 17895, 9411, 1113, -6972, -11618, -4408, -4418, -10796, -10826, -8348, -4340, +-4535, -4102, -905, -2545, 845, 1980, 3127, 4889, 3768, 4292, 7691, 6654, 8168, 12512, 18281, 21228, +15287, 5959, 6676, 3255, 3473, 1334, -5905, -5131, 5473, 2775, -721, -3099, -4505, 2414, 9090, 10951, +17079, 15486, 4615, -2160, -4329, -9604, -9729, -11654, -14633, -16425, -17422, -12849, -12212, -20312, -18674, -9315, +-2983, -1709, -23, -1201, -10744, -15776, -13956, -12250, -11201, -8798, 413, 11078, 11748, 11121, 18951, 22654, +22451, 18200, 8331, -1166, -5901, -12269, -3076, -737, -6509, -9233, -10285, -5703, -3535, -2546, 643, -2275, +-3290, 3460, 4089, 8392, 6348, 3093, 7287, 10978, 10316, 11353, 17535, 22596, 20608, 6521, 6740, 4943, +-395, 1859, -4463, -6933, 2299, 944, 2190, -1283, -3991, -185, 4998, 9579, 12561, 11607, 4068, -2250, +147, -3316, -9172, -14996, -17825, -16286, -12217, -8483, -9385, -18098, -21377, -17534, -8769, -118, 1870, 1577, +-7982, -14516, -13794, -13963, -10686, -5917, 47, 8451, 9648, 9010, 16024, 18086, 18128, 16247, 6954, -443, +-8199, -9760, -4795, -2124, -8212, -10399, -11262, -9245, -4661, -3030, 414, 263, -3566, 4554, 5431, 6104, +8889, 6349, 5130, 10540, 13365, 13773, 17224, 21787, 22513, 14911, 4592, 4695, 308, 1952, -2744, -8631, +-4185, 181, 131, 320, -2351, -1562, 4685, 11286, 12075, 7645, 6168, 1742, 1865, -1207, -6000, -13857, +-17691, -15281, -12793, -8746, -8203, -14971, -16217, -18149, -15056, -2133, 1777, 704, -4948, -12352, -10840, -16081, +-12197, -4193, 2119, 7643, 12112, 12289, 15989, 16261, 12896, 14140, 6701, 1999, -5297, -6836, -8224, -6400, +-7294, -10759, -12663, -11480, -5144, -1820, -724, 22, -4322, -348, 2465, 5486, 11432, 9256, 4797, 8879, +13110, 13881, 12595, 18282, 21088, 15085, 5030, 3263, 2281, 2495, -451, -6613, -8102, -1792, 2412, 3139, +-1574, 403, 3488, 7170, 12546, 8782, 8612, 8457, 1700, -2005, -5551, -8045, -12102, -18762, -16046, -13084, +-9310, -12977, -18159, -19036, -13801, -2766, 1732, -729, -938, -6823, -7921, -11171, -11281, -5890, -1144, 6481, +10425, 8164, 8961, 13174, 13594, 13061, 6584, 3647, 1503, -869, -6268, -9527, -9013, -10398, -11326, -13631, +-8689, -4652, -2967, 994, -938, -1417, 907, 3350, 10068, 10743, 5499, 7795, 10705, 12907, 11974, 13870, +18956, 16167, 8020, 5949, 4543, 829, -2259, -4082, -3878, -246, -80, 915, -1133, 1409, 3815, 6700, +10461, 10249, 9343, 11640, 3607, -1172, 728, 5, -8777, -24575, -23512, -16006, -10345, -8165, -16310, -18358, +-15342, -7751, 20, -1276, -805, -2364, -6415, -5897, -9557, -7594, -759, 8687, 12829, 6705, 619, 9852, +13377, 12871, 9652, 3958, 4684, -307, -6979, -12665, -12057, -8058, -11065, -13368, -11340, -8821, -2348, 585, +-1229, -3298, -1980, 3307, 8816, 10104, 7404, 7525, 9228, 9530, 11830, 11576, 16517, 15513, 10912, 9295, +8101, 1098, -1879, -3421, -3214, -3099, -4313, -3201, 1831, 3896, 3997, 4707, 6959, 8994, 9315, 13002, +6353, 1874, 4385, -1052, -6242, -22688, -26435, -15413, -10211, -6468, -11164, -17538, -14196, -10297, -1985, -1160, +-3062, -2138, -2897, -5173, -8193, -9601, -2517, 4481, 9241, 4126, 22, 6566, 10680, 12795, 10915, 7335, +6741, 1005, -5457, -10594, -15122, -10110, -10118, -13851, -9823, -7161, -1515, 2002, -299, -1181, -3306, 384, +5087, 9919, 10634, 10180, 9046, 5961, 8047, 9131, 10462, 14379, 13802, 12596, 9446, 2967, 457, 1611, +-89, -3473, -7090, -8346, -1272, 5310, 6356, 5421, 3797, 8665, 11601, 11453, 9750, 5474, 7753, -1161, +-10069, -17288, -28118, -16634, -7417, -8430, -4977, -14591, -14598, -7917, -2832, -3207, -7234, -3371, -1933, -7844, +-8504, -5311, -5386, 124, 5698, 8149, 4495, 8457, 15093, 14685, 12163, 8445, 7276, 332, -4942, -8887, +-13759, -12963, -15963, -17123, -10357, -8333, -1733, 5457, 2237, -1607, -5398, -1747, 5146, 6919, 10791, 12034, +8341, 3808, 3831, 7443, 9552, 10463, 12834, 13471, 8539, 6754, 3033, 1703, -321, -4123, -8157, -7924, +-3855, 4286, 6057, 3285, 5008, 7179, 8397, 15959, 15590, 8506, 5355, -820, -9148, -10828, -23147, -17754, +-8758, -9385, -5611, -9579, -14014, -9044, -6460, -5347, -7054, -5242, -515, -6300, -7485, -5966, -8350, -5814, +-1072, 6365, 8853, 7921, 14680, 15044, 11286, 9502, 8743, 3660, -3765, -8268, -13363, -15625, -15917, -17389, +-11452, -8616, -2519, 4282, 613, -2170, -2523, 697, 6504, 7095, 8626, 10346, 6770, 4258, 2615, 3579, +7333, 7999, 10406, 15751, 13501, 11044, 7696, 2252, -2333, -4913, -7530, -4462, -5052, 986, 4350, -1874, +1364, 7230, 9420, 18353, 17495, 7911, 5755, 2172, -4940, -9976, -21301, -20532, -7375, -9725, -8513, -6513, +-9832, -7779, -8537, -6809, -6889, -7597, 672, -2907, -10013, -8047, -11685, -7839, -4800, 5096, 10437, 9960, +13488, 14771, 11165, 11700, 11035, 6100, -411, -6357, -13114, -15342, -14937, -19072, -13823, -9970, -2946, 3841, +-1516, -3275, 801, 4171, 6322, 10268, 9254, 8485, 5784, 1007, 16, 2311, 6069, 6158, 8763, 13416, +17594, 14279, 9220, -826, -2945, -4768, -4838, -1789, -2721, 526, 2839, -4909, 458, 8859, 9472, 19991, +19430, 10341, 3903, 951, -74, -8248, -16722, -20299, -10663, -8626, -13196, -8417, -4644, -8646, -7375, -7379, +-7943, -6692, -3327, -2552, -10390, -10176, -10999, -10570, -7816, 3932, 12478, 13258, 12353, 13346, 11075, 11485, +11366, 6828, 4020, -5265, -13371, -15494, -17155, -16904, -17247, -10815, -6268, -3080, -2347, -1437, 4704, 6452, +7510, 8336, 8624, 7424, 5616, 1626, -996, 1863, 4170, 7512, 6701, 9826, 19581, 16221, 9032, 1840, +-4305, -5950, -2915, 536, 1049, -2431, 637, -1029, -2048, 6119, 11606, 14793, 17904, 13576, 10762, 7076, +238, -5909, -10517, -15601, -12183, -10929, -9703, -7884, -3143, -10131, -10977, -8316, -8978, -7516, -6567, -5129, +-10193, -12169, -12275, -9545, -4278, 4378, 14274, 16882, 13143, 10789, 12017, 12887, 10757, 5494, 2357, -2015, +-9802, -11976, -18060, -18137, -14796, -14936, -8804, -3938, -1811, -1394, 5329, 6086, 5930, 6310, 6469, 5737, +2361, 522, -1321, -826, 1888, 6575, 5410, 6195, 15294, 15073, 8315, 5698, -1069, -3211, -2928, -705, +899, -3273, -433, 1651, 798, 5444, 9480, 11417, 19706, 17825, 14271, 6712, -298, -3655, -8551, -12096, +-13498, -13494, -11167, -8285, -2989, -6948, -11112, -5572, -7883, -10161, -12165, -7432, -9041, -11784, -13535, -12269, +-3158, 3056, 10919, 15944, 16865, 14046, 13028, 11776, 11960, 5340, 1185, -444, -6081, -10248, -18617, -21345, +-15061, -17560, -14122, -3867, 777, 1165, 5611, 6384, 6493, 5034, 4626, 3095, -485, 1428, 3653, 2450, +109, 3453, 8581, 5759, 5709, 12131, 13492, 8566, -318, -5822, -2184, 2445, 1791, -3576, 1224, 3366, +3256, 5650, 5704, 10529, 21481, 21297, 14647, 6381, 642, 400, -3261, -8741, -11913, -12471, -11288, -8884, +-5263, -4451, -8770, -9223, -9827, -11082, -11215, -8194, -7016, -9378, -11807, -9034, 1132, 4674, 9329, 13706, +12610, 14289, 12892, 12178, 11451, 6348, -148, 941, -3372, -5789, -12992, -18595, -12532, -15534, -18326, -5213, +599, 561, -268, 1850, 5093, 3889, 55, -160, -2885, -1048, 4465, 4235, 2911, -153, 2209, 3607, +-195, 6213, 13201, 9936, 3578, -4725, -3214, 1389, 1772, -3142, -627, 4486, 6091, 3967, 2469, 10093, +20049, 21568, 15674, 8810, -999, 143, -268, -6722, -11360, -11283, -9165, -8664, -10953, -1479, -3366, -6292, +-14287, -15102, -13048, -8833, -7117, -9053, -8627, -6281, -515, 5098, 7383, 9062, 11083, 17410, 20319, 13212, +12751, 7811, 1907, 1217, -1874, -3101, -10032, -20248, -17535, -17579, -17637, -8780, 1853, 4633, 970, 2642, +4972, 2899, 2497, 3216, 2303, 1068, 2580, 6018, 2662, -2923, -4458, 3609, 1621, 4660, 11223, 9270, +7865, 3429, 531, 4699, 3069, -1443, -3018, 2574, 6673, 2043, -35, 7773, 13082, 16647, 16182, 12022, +2456, 1702, 3332, -7317, -14065, -14006, -11655, -10006, -13167, -4928, -133, -6761, -14652, -18813, -14534, -8654, +-10583, -11555, -10725, -7263, -3418, 3241, 6610, 7151, 10291, 19100, 22342, 14599, 11831, 7666, 5213, 1576, +-1973, -3326, -5025, -17679, -19765, -18694, -16217, -7265, -826, 3501, -2183, -61, 3647, 582, 1954, 1714, +4397, 4140, 903, 4436, 2705, -2476, -2992, 757, 3749, 500, 6761, 11538, 7419, 5692, 2261, 3917, +3680, 2359, 398, 2018, 7815, 5743, 4138, 5250, 8994, 13211, 16405, 14325, 8254, 2531, 1744, -5144, +-10933, -10537, -10434, -11246, -13162, -7328, 1130, -10222, -13725, -17714, -15662, -6507, -9149, -11133, -10234, -3219, +1359, 4572, 4461, 6319, 10512, 19745, 20047, 15019, 11189, 7921, 6705, 879, -4951, -5392, -3590, -12883, +-19747, -19240, -15605, -10298, -4840, -621, -2718, -893, -2412, -1776, 3050, 5117, 4763, 3011, -880, 2630, +914, -2299, -2217, -1385, 4812, -466, 3452, 9589, 8481, 8093, 2676, 3707, 3421, 1081, 432, 1741, +6753, 5795, 1726, 3833, 9884, 12784, 14751, 12634, 10793, 5668, 42, -3901, -10020, -6130, -7385, -11249, +-12669, -10733, -1933, -5189, -11484, -13148, -18019, -9751, -8835, -11524, -9666, -6271, 963, 3809, 2799, 5697, +11339, 19281, 21200, 16230, 12865, 6777, 5252, 4858, -598, -4277, -3823, -12509, -17992, -19014, -14397, -10333, +-9493, -4821, 563, -317, -4702, -1586, 2461, 5935, 3684, -94, 163, 546, 3967, 2382, -777, -2814, +4022, 4800, 2296, 7211, 9092, 8136, 3206, 2866, 4486, 351, 2860, 1406, 4142, 8094, 3224, 6399, +13421, 13416, 14523, 11186, 8289, 4373, -4936, -3894, -4937, -2366, -5902, -13837, -14756, -10776, -3584, -942, +-7853, -8858, -13080, -14694, -11185, -12247, -9453, -7657, -3581, 724, 2637, 8872, 13317, 18918, 20836, 15222, +12667, 6116, 2494, 5737, -1251, -4759, -8515, -14051, -16298, -19105, -15088, -11506, -8286, -4204, 2335, 4458, +-1136, 37, 3047, 3496, 1791, -2721, 992, 1305, 3216, 4877, -1665, -3080, 2184, 6877, 2692, 3589, +7579, 8021, 6629, 1736, 2574, -1879, 1437, -316, 537, 4928, 5974, 8462, 13275, 11687, 9658, 9075, +7987, 5067, -5410, -4552, -428, 720, -1326, -11718, -18161, -10385, -6334, -3585, -4733, -4948, -9023, -15711, +-12139, -11654, -12243, -11804, -5451, 1773, 5703, 8189, 10876, 16823, 21147, 17233, 10737, 5200, 3266, 9964, +4659, -5945, -9220, -12644, -13618, -20023, -19925, -11629, -9124, -6368, -451, 6100, 5119, -1089, -225, 2324, +-1025, -4305, 859, 2939, 2759, 5977, 241, -1361, 1630, 5155, 5011, 1505, 6079, 10503, 9134, 1974, +-1644, -1593, 2405, -3714, -4284, 4608, 8044, 9051, 10068, 11834, 7874, 8060, 7866, 3288, -4797, -4815, +1665, 3615, 743, -8432, -14739, -8745, -10483, -6784, -577, -3423, -6394, -12941, -11705, -10550, -16984, -12119, +-6223, 695, 4341, 7545, 10850, 15145, 17641, 15305, 9540, 8108, 7317, 8093, 6687, -6113, -9285, -5843, +-14024, -21802, -22837, -13798, -6586, -5507, -311, 7192, 6887, 303, -632, -1447, -1620, -5280, -1062, 4612, +1950, 2043, 3579, 883, 3952, 2751, 1528, 500, 8690, 13367, 6794, 3677, -1286, 3820, 1447, -6111, +-1873, 7936, 10900, 11204, 7264, 9385, 9412, 5379, 5287, 1936, -4298, -6583, -938, 2503, 1558, -5136, +-12203, -6910, -4524, -4831, 2373, -1309, -5713, -5921, -9572, -11805, -20423, -16023, -6817, -1385, 5420, 9586, +11612, 15353, 13653, 12017, 12928, 10729, 7834, 5214, 6337, -2556, -10414, -11150, -14194, -21247, -23796, -19673, +-8289, -1398, 7274, 11622, 10367, 3890, -2417, -869, -1937, -5672, -1271, 4295, 2201, -157, -80, 666, +1792, 1974, 3794, 5620, 10472, 12539, 8331, 5617, -34, -269, -4356, -10846, -2652, 7247, 8960, 8918, +4540, 2888, 6572, 6077, 5066, 1437, -1033, -3684, -2843, -1097, 1825, 1617, -9144, -9754, -3963, -4840, +-1723, 1702, -1120, -3105, -10003, -12708, -16478, -19165, -11600, -4035, 7499, 11928, 10191, 13210, 12739, 10107, +12005, 9586, 7214, 5238, 6114, 2742, -9354, -10842, -10007, -19872, -27564, -21345, -3932, 5591, 8025, 9732, +8925, 5272, -1455, -1573, 136, -5597, -5420, 5369, 2047, -3862, -1118, 4593, 3661, 1931, 5924, 6798, +7869, 8756, 5872, 5640, 1242, -4592, -3059, -9367, -3619, 4252, 5141, 5587, 769, -2419, 4811, 8440, +3387, 79, -2734, -2946, -3316, 806, 2343, 3835, -5126, -8320, -2116, -105, -2712, 938, -152, -2253, +-6104, -9608, -11887, -17367, -15209, -5730, 6622, 13171, 8486, 8782, 9033, 7099, 7415, 4696, 4353, 8958, +10243, 5010, -6837, -10492, -5621, -13500, -24552, -20255, -6390, 5943, 6448, 4486, 7579, 7509, 4051, -468, +1009, -4290, -6420, 1940, 2222, -2174, -1581, 4113, 4985, 3236, 7260, 7385, 2993, 3216, 3081, 7021, +3327, -7209, -3746, -5219, -8518, 474, 444, -1162, -3961, -3520, 4810, 10585, 3527, 2827, 1138, -2052, +-3406, -2100, 3251, 5949, 679, -7102, -1862, 1310, 165, 551, 536, -1097, -4838, -5708, -8709, -18488, +-18448, -8637, 3647, 12587, 6181, 4166, 7953, 5557, 6489, 1631, 4073, 10239, 10152, 6899, -2364, -10343, +-8508, -12310, -21116, -14903, -9839, 2077, 4843, 622, 8803, 11214, 6255, 1796, 2072, -1298, -4058, -1214, +157, 1424, 580, 291, 6938, 5595, 6838, 7185, 1448, 2759, 2579, 2421, 4313, -3850, -6038, -5160, +-8561, -5048, -3290, -7967, -8079, -3377, 3672, 10525, 6293, 2916, 2146, 1324, 1293, -1896, 4715, 10454, +4351, -2471, -873, 5755, 7064, 1566, 497, -3496, -4843, -3867, -10064, -16908, -17433, -7075, -3347, 5160, +5475, 4851, 10429, 8770, 5279, 2817, 6227, 12047, 9935, 7424, 3429, -7490, -9293, -9290, -16942, -16137, +-12342, -3205, 4867, 2041, 5562, 9784, 7308, 4385, 2532, -429, -3813, -2891, 231, -1829, -3918, -900, +5756, 6789, 6196, 2794, 822, 3365, 2203, 1091, 2352, -2276, -7173, -4799, -6439, -9613, -11503, -12044, +-8237, -3997, 556, 6048, 6111, 7136, 5407, 1442, 963, -1931, 4523, 12068, 5029, 1297, 2306, 6251, +9342, 1121, 384, -2284, -6357, -3231, -6585, -9415, -13433, -11586, -9429, -5949, 2992, 5728, 7298, 9939, +3065, 2235, 4199, 7126, 10144, 9029, 5853, -3341, -6129, -7659, -11843, -14969, -11675, -8621, 5703, 3327, +858, 7763, 10508, 11052, 7751, 2445, -871, -2218, 1281, -2028, -6709, -68, 2615, 2948, 1642, 743, +2764, 5944, 6871, 3366, 2705, 517, -4718, -2986, -3234, -12306, -18355, -14696, -11160, -6309, -2421, 503, +5849, 9886, 7360, 3032, 2068, 2638, 5177, 10138, 8173, 3554, 2179, 2290, 5563, 560, -1018, -2025, +-7066, -5755, -2857, -2479, -8178, -14607, -13821, -11096, -2992, 4267, 8020, 11516, 6857, -753, 1172, 6098, +5965, 5946, 7191, 2591, -1029, -5833, -11443, -12253, -13180, -8073, 2414, -97, -2198, 3938, 9656, 9831, +9262, 9425, 4999, 585, 1721, 282, -4877, -957, 1899, 1225, 1046, -1666, 5013, 13525, 9517, 2415, +-2281, -390, 80, -2479, -3432, -14073, -22712, -18993, -12639, -10073, -3537, -813, 6138, 10666, 9439, 6753, +6206, 5515, 6578, 12091, 10965, 3133, 1731, 3146, 6547, 1709, -5257, -3148, -8107, -5716, -136, -413, +-1571, -11569, -16328, -16028, -10471, -2637, 6671, 12012, 7580, -2958, -3757, 6056, 6254, 3715, 4618, 3749, +-65, -5233, -11661, -10477, -8437, -7611, -2857, -1818, -4428, -2425, 8351, 11542, 8808, 13710, 10723, 3055, +3113, 1917, -1317, -3786, -1096, 939, 3090, 873, 2167, 15018, 11262, -564, -5077, 260, 2022, -2381, +-5333, -11787, -23671, -22078, -12619, -7478, -6095, -4268, 4495, 10143, 9149, 9090, 9848, 9458, 7632, 9361, +13712, 9910, 4206, 6051, 6174, 573, -7974, -9252, -6617, -3590, 957, 440, -1133, -5251, -14250, -15071, +-10944, -2657, 7313, 10820, 8130, -2972, -7430, 4189, 3954, 1044, 2667, 3870, -1115, -5344, -9236, -4825, +-2083, -7316, -8223, -3662, -5905, -7657, -93, 10517, 10051, 14329, 14245, 6724, 3992, 1836, -1971, -6653, +-3148, 1222, 288, 338, 3292, 10541, 15893, 2619, -6914, -1407, 1443, -2296, -9014, -14128, -22388, -23957, +-13711, -6425, -5697, -2650, 498, 9837, 10395, 7972, 10442, 8336, 9478, 9756, 10473, 10060, 7907, 9089, +5208, -782, -5544, -10299, -3513, -185, -3492, 1373, -3547, -2120, -8571, -14345, -9009, -3574, 3944, 8020, +9087, 4103, -3832, -655, 1384, -1850, -1058, -3392, -953, -1450, -5767, -3279, -619, -2853, -6498, -3356, +-86, -4472, -1843, 8925, 10738, 13054, 17438, 13975, 9307, 831, -5745, -5358, -618, 1334, 355, 960, +3881, 7709, 10821, 7186, -5126, -4678, -2825, -5577, -12403, -11534, -15100, -19718, -15188, -8782, -7676, -2458, +-2138, 2788, 9831, 8263, 8513, 10298, 7803, 10289, 10296, 13956, 16157, 12558, 2823, -3462, -5359, -7943, +-5159, 1756, -3993, -3662, -3764, -3875, -4836, -13493, -9823, -5955, -4583, 1259, 9021, 7938, -700, -4996, +6, -275, 133, -2279, 665, 5956, -745, -2936, 1238, 975, -5040, -6966, 1195, -1786, -4576, 2012, +7475, 10697, 16171, 15691, 7951, 2139, -612, -1489, -1787, -858, -647, 686, 4583, 8357, 11392, 11306, +478, -7745, -10328, -11242, -15450, -12476, -13978, -20285, -17880, -11853, -6583, 598, 2114, 3326, 4849, 6978, +6920, 5810, 2678, 8202, 12478, 15916, 15946, 13631, 5727, -3103, -6484, -2933, -4962, -650, -4525, -7022, +-1537, -3375, 39, -7042, -9517, -6057, -5895, -832, 6273, 7664, 878, -6899, -4497, -999, -2416, -2170, +3132, 7504, 251, -5357, 2885, 6932, 425, -4703, 1059, 1784, -5047, -995, 5434, 7026, 13203, 13545, +6474, 4164, 2168, 355, 942, 773, -961, -17, 2451, 8295, 12165, 12450, 1951, -12618, -13870, -13675, +-16184, -12293, -10453, -14761, -18698, -14654, -8522, -1859, 2993, 4227, 7284, 7900, 5471, 3685, 428, 5513, +12246, 18145, 16526, 13215, 8499, -1316, -6667, -3308, -1256, 517, -2439, -5979, -5878, -6792, -2156, -983, +-8321, -6644, -4741, -1086, 4709, 8338, 3599, -3338, -1613, 491, -1222, -711, 1062, 1304, -2222, -10017, +-3847, 6074, 2492, -1234, 21, 2951, -2311, -3769, 5863, 8302, 10012, 13510, 8655, 5085, 2979, -417, +-357, 195, -4174, -1053, 4269, 9957, 14088, 13705, 7766, -8181, -12156, -16205, -17192, -14065, -13638, -14150, +-18901, -19220, -9436, -4176, 166, 4644, 4972, 5892, 6942, 2998, -575, 3631, 12061, 17706, 17987, 14615, +11474, 3600, -7132, -6332, -3232, 543, 283, -4883, -8951, -10090, -8952, 544, -3484, -7137, -4897, -2175, +1341, 5019, 3253, 565, 205, 464, 2223, 1973, -110, -404, -2916, -5173, -5791, 2725, 3380, 2049, +3249, 5759, 2912, -4550, 1469, 4457, 4099, 9307, 9182, 7433, 1792, 1947, 2353, 2854, -195, 893, +7393, 11981, 12233, 10318, 7685, -2401, -10086, -16221, -17945, -14077, -11700, -12242, -16491, -20961, -11753, -2199, +1345, 3351, 3072, 2170, -211, 704, -951, 4911, 14238, 15077, 19203, 17718, 11583, 6237, -4494, -6531, +-2764, -4164, -3300, -4937, -8983, -9174, -10107, -2459, -1753, -6457, -4412, -3448, 873, 4756, 5969, 4067, +617, -2562, 352, 2044, -2013, -4652, -3815, -3303, -4195, -132, 3958, 5330, -286, 3914, 6000, -4204, +-1367, 2587, 2410, 9385, 7151, 8728, 4318, -463, 1411, 2741, 84, 4751, 9174, 13273, 11039, 11776, +13607, 697, -8721, -13250, -17326, -14141, -15939, -16821, -17693, -21675, -15049, -2877, 1645, 3013, 3681, 2586, +1989, 2973, 1416, 8878, 18994, 18372, 18009, 20348, 13374, 7312, 1151, -5864, -5557, -6833, -8994, -6163, +-9498, -10879, -6991, -3966, 42, -5576, -6893, -4317, -2891, 4492, 8769, 7042, 2934, 937, 1275, -3483, +-3714, -4243, -3685, -5686, -8016, -510, 5891, 6294, 521, 2376, 8830, -51, -4962, 236, -1375, 3411, +8020, 2703, 3056, -876, 4455, 10268, 4421, 5376, 8494, 8729, 9429, 10142, 12730, 3311, -8452, -11280, +-14848, -13952, -11563, -18791, -17825, -20676, -18498, -4206, 3458, 1166, 931, -2519, -1048, 5058, 3489, 5867, +16260, 17734, 17006, 18008, 12119, 8319, 5517, -2950, -7652, -10099, -11727, -6323, -2648, -5301, -6361, -4907, +-860, -3777, -4098, -3609, -1127, 4402, 8460, 7200, 2027, -986, 2637, -2722, -7849, -4650, -4714, -4456, +-5546, -1564, 8026, 6862, 474, 556, 10186, 4126, -5576, -990, 1717, 590, 4416, 1228, 2169, -1224, +228, 9886, 8534, 4864, 8745, 11269, 8513, 6084, 8312, 2707, -5485, -7339, -10046, -12909, -17042, -21700, +-18844, -18653, -22518, -8501, 2980, 951, -1869, -3907, 1464, 7533, 5213, 5190, 14394, 20127, 15134, 13367, +15519, 12421, 5597, -2487, -9715, -12211, -13449, -7955, 1075, 8, -5507, -8228, -6750, -4077, -5116, -5116, +-1912, 2052, 6153, 8509, 6108, 2860, 3542, -2872, -10264, -6290, -3700, 594, -5014, -5352, 3922, 5645, +277, -1324, 9075, 11233, 623, -2426, 711, 469, 609, 2768, 2400, 952, -2414, 3083, 9407, 6581, +7515, 16143, 11418, 3741, 4040, 1908, 589, -4355, -6341, -8544, -17919, -22606, -20337, -18295, -20270, -10657, +-1246, -729, -1809, -2053, 4560, 10280, 5184, 3662, 12140, 20046, 16031, 9557, 15081, 13264, 6058, 1083, +-9542, -15769, -12747, -5777, 3571, 3605, -5392, -9368, -10868, -4121, -6323, -5508, -1009, 85, 4583, 9094, +6845, 4623, 2323, -2723, -9294, -7900, -4548, -54, -3498, -5687, -4103, 1372, 1178, 1154, 8989, 13101, +7330, -1214, -1078, 730, 4132, 2941, 784, 2574, -1244, -2122, 2390, 6756, 9824, 18911, 16007, 6148, +-1, -575, 1520, -374, -3027, -7565, -17947, -22042, -20236, -16250, -14327, -11739, -3357, -1680, -112, 2445, +2228, 4700, 7036, 7914, 10903, 15412, 14307, 9868, 12820, 14456, 9611, 4996, -6934, -8263, -4560, -3303, +749, 3231, -5481, -10422, -14670, -7166, -7549, -8094, -243, -241, -893, 3946, 6808, 5204, 3515, -2277, +-7311, -7926, -5856, -3728, -4836, -10064, -12461, -1494, 1651, 7588, 8475, 9543, 11183, 2280, -1965, 207, +2446, 4694, 2139, 719, -2461, -4669, 1770, 6492, 10511, 18824, 18627, 11933, 3224, 752, 3809, -507, +-3376, -5001, -14751, -21020, -21526, -18858, -14310, -12007, -8994, -2416, 626, 6081, 6607, 5194, 6903, 9896, +10113, 10400, 13603, 12537, 8040, 9940, 5650, 5442, 1621, -136, -1545, -267, 1893, 5810, -1063, -12750, +-16554, -10008, -7349, -12009, -6784, -3006, -948, 4339, 4507, 3614, 4884, 3268, -1188, -4804, -8249, -6675, +-6801, -12300, -14573, -8403, 566, 7797, 7366, 8160, 6406, 5485, -370, 3830, 6693, 5650, 1592, -3272, +-4049, -5256, -3740, 2708, 7914, 14898, 22949, 16255, 7531, 461, -1795, -536, -2828, -5314, -12585, -19959, +-19919, -18190, -15029, -11529, -9710, -3466, 972, 2148, 4416, 3293, 9199, 11933, 8423, 8834, 13127, 13798, +8965, 8252, 5644, 6753, 4388, 2634, 1687, -133, 1382, 4221, 3128, -8692, -16957, -16394, -9493, -5687, +-6244, -3496, -5175, 194, 3552, 2735, 4581, 6725, 1243, -1098, -6916, -11646, -9836, -13026, -14015, -8920, +851, 5843, 8864, 11286, 7577, 1748, 831, 1465, 6109, 6835, 720, -4788, -4927, -4610, -5218, -3197, +2779, 11321, 22441, 25205, 14016, -66, -3701, -820, -1020, -2194, -10073, -16365, -16600, -17342, -18036, -13661, +-8978, -3775, -1620, -3128, 827, 3026, 8272, 10452, 7815, 7386, 13545, 11239, 6744, 8391, 9081, 7583, +7036, 6197, 4048, 1145, 598, 1515, 5020, -4186, -15330, -18016, -8906, -2129, -6411, -6189, -4935, -6792, +-89, 1845, 5316, 8297, 2030, 1212, -5306, -12466, -13021, -11538, -13506, -7719, 977, 4479, 10342, 13508, +8267, 3472, 858, 797, 4549, 7627, 4055, -1296, -3147, -6483, -10597, -9104, -141, 9669, 21194, 27713, +17888, 2831, -5043, -4462, -2352, -1741, -6486, -13648, -14491, -14894, -15126, -12401, -8840, -3952, -4116, -5783, +-303, 2051, 5837, 8426, 8719, 6133, 8747, 8935, 10611, 12304, 9861, 7787, 7956, 8190, 5664, 3052, +337, -1537, 4806, -117, -13122, -16381, -9279, 711, -4570, -9875, -8619, -8098, -278, 4777, 6166, 4080, +-1079, 904, -3980, -10149, -15882, -16768, -12422, -6041, 1293, 3976, 8096, 15074, 10844, 3243, -1111, -3237, +2189, 8658, 6574, -418, -3687, -7966, -10369, -10323, -1785, 8819, 17267, 25462, 21702, 6391, -3449, -3411, +-3772, -1973, -5446, -12865, -13380, -12068, -12328, -10260, -10668, -8256, -6886, -7205, -1807, 1380, 3657, 7146, +6441, 4257, 4174, 6473, 11829, 16000, 13502, 10728, 7180, 10706, 8770, 6348, 3535, -826, 4429, 2973, +-9419, -13619, -7967, -2284, -1300, -6278, -9623, -8698, -1555, 6901, 5650, 1927, -3442, -3589, -4421, -11262, +-15809, -15120, -9382, -5434, 325, 4734, 9948, 17485, 15887, 6997, 1650, -1775, -2034, 5742, 8358, 4261, +-3055, -9569, -12785, -13793, -7001, 6057, 17773, 23069, 22875, 13757, -1029, -5057, -5858, -6753, -5993, -13047, +-12875, -9555, -13035, -10909, -9560, -9465, -8795, -11080, -4850, 1363, 859, 1974, 3513, 4746, 3177, 6384, +10550, 15815, 16755, 12265, 7473, 6932, 7306, 8683, 6300, 1949, 3041, 4463, -7667, -9879, -7189, -6438, +-1307, -6216, -8997, -5032, -2228, 3792, 4491, 2660, -2088, -8152, -7548, -10113, -15824, -11540, -10915, -6081, +-2228, 4339, 9808, 15340, 16147, 9868, 1355, 879, -32, 914, 9058, 5755, -1768, -6977, -11025, -14274, +-9015, 5800, 18296, 21157, 21786, 18907, 5759, -4083, -6452, -8316, -7352, -9572, -11692, -7316, -13377, -12922, +-7386, -9125, -9308, -10044, -5242, 6847, 6447, 3629, 3002, 2323, 2984, 6153, 11433, 16063, 15161, 12049, +7463, 3649, 2552, 6872, 13998, 12403, 6486, 4243, -4938, -10207, -9533, -5526, -1457, -3337, -5329, -3691, +-2308, 786, 231, 355, -1981, -12038, -14675, -10391, -11726, -8762, -4891, -4253, -430, 5069, 8861, 12333, +14547, 12305, 3319, 2415, 653, -2358, 759, 2542, -1084, -3586, -7511, -13760, -12459, 1933, 16021, 20681, +22037, 22265, 10952, -216, -10847, -9498, -10096, -10239, -14053, -9875, -10970, -12382, -7850, -6357, -10760, -12473, +-7685, 1375, 2096, -617, -4395, -2875, 3564, 5713, 11165, 16584, 16530, 12915, 8117, -117, -2625, 3900, +14835, 19511, 10197, 4069, 2412, -8190, -13689, -5658, -4534, -2465, -1961, -4833, -94, -721, -2115, -1728, +-2245, -11312, -18743, -12213, -6457, -7434, -3964, -4232, -660, 4787, 8358, 12333, 13770, 14487, 8798, 3675, +512, -4700, -2461, 3023, 2694, 1833, -3352, -10563, -11494, -1721, 10817, 17883, 20429, 20393, 13817, 2282, +-10600, -13428, -11496, -13297, -11714, -7189, -6313, -8115, -8992, -7049, -7874, -9522, -5381, -996, -2032, -1844, +-6416, -5110, 3918, 8375, 9233, 17200, 14495, 10763, 7180, 4722, 2444, 5999, 15129, 21499, 13963, 4502, +795, -6410, -13791, -9721, -6142, -2954, -3768, -7432, -2395, -204, -3512, -8194, -7289, -9456, -17182, -9965, +-1193, -2018, -10, -2174, -1228, 4317, 6761, 8845, 13702, 16276, 10405, 4828, 865, -821, 1816, 6683, +7652, 280, -1637, -5384, -10001, -8849, -1179, 7506, 12063, 13046, 12397, 7762, -2354, -8134, -10932, -12817, +-10660, -1550, 424, -723, -7373, -10855, -10653, -9188, -7087, -4179, -3668, -6436, -7635, -8441, -199, 10842, +10621, 20902, 18354, 10919, 3361, 1142, 2076, 3865, 8021, 15606, 16227, 8955, 3793, -2173, -10031, -14622, +-11663, -3879, -587, -6027, -6453, 2665, 2426, -5337, -8393, -6719, -12007, -9793, -2490, -3449, -3592, -3511, +-3269, 1578, 3478, 6623, 12813, 17787, 18932, 8823, 6006, 4770, 2231, 9608, 11176, 1530, -3774, -3671, +-6321, -8156, -9566, -2430, 8707, 10719, 12606, 10030, 4554, -3365, -7352, -11809, -13196, -6958, -5023, -4635, +-11778, -13831, -12209, -10451, -8033, -6411, -4683, -7112, -10054, -8089, -4525, 6727, 9081, 12248, 13832, 14300, +8416, 5290, 6887, 2519, 3701, 10966, 15568, 12676, 5359, 1801, -2885, -14087, -15204, -9259, -10, -1472, +-7952, -1852, 1064, -6598, -8409, -6021, -6662, -7582, -6275, -4142, -3788, -1317, -2895, 766, 2130, 5446, +14012, 18607, 18766, 8044, 5659, 9814, 4709, 9367, 10676, 2892, 651, -600, -9021, -12007, -12367, -6003, +4346, 10255, 11693, 11516, 9804, 3496, -3770, -8062, -10244, -3241, -1765, -6489, -11830, -11935, -10333, -12348, +-12625, -7514, -4453, -7483, -11606, -9439, -5925, 2799, 7928, 6976, 10875, 13377, 14346, 7356, 7156, 1559, +-1220, 5187, 13840, 15022, 11394, 6095, -404, -12424, -17874, -11877, -4053, 1361, -5698, -9724, -380, -190, +-4072, -7161, -7166, -5604, -7070, -9144, -6893, -4651, -1305, 511, 2634, 5502, 12255, 19338, 17438, 9855, +5358, 8474, 6857, 6692, 7383, 6384, 3211, -1732, -10616, -13765, -10414, -8760, 3632, 10779, 10569, 12668, +9657, 4960, -1868, -3807, -6555, -6193, -7139, -9821, -8985, -11005, -11084, -13854, -11597, -5011, -1583, -5658, +-10947, -11907, -6915, -822, 951, 971, 7326, 16483, 17955, 8731, 5410, 1480, 190, 6012, 11026, 15502, +15153, 9392, 749, -8675, -16342, -11911, -4667, 141, -7127, -9797, -309, 3033, -1290, -4633, -6961, -7928, +-8159, -9291, -7162, -3595, -2551, -1587, 1035, 6885, 14210, 19215, 16779, 11699, 4403, 7934, 9320, 6099, +7107, 8717, 3004, -3157, -12293, -16705, -8926, -2771, 2764, 11626, 11053, 12172, 7647, 3883, 852, -1559, +-4084, -8636, -10682, -11699, -9889, -9295, -12275, -14713, -10612, -3268, 311, -4597, -9716, -12407, -8540, -6317, +-5689, -2735, 6813, 16895, 18374, 9036, 3244, 5309, 2858, 6191, 6006, 13370, 17890, 12145, 2485, -6444, +-11608, -10490, -7938, -3544, -6361, -10395, 292, 3958, -841, -3425, -6957, -7563, -7650, -10546, -10313, -5725, +-4258, -797, 3517, 7423, 13219, 16920, 15412, 13225, 4955, 5170, 12252, 7690, 5397, 8369, 2642, -1324, +-11709, -17297, -8220, 251, 1277, 8828, 10414, 9671, 7419, 6477, 3838, 1555, -739, -8575, -9907, -10442, +-12354, -10321, -14020, -15309, -10414, -4935, 847, -3565, -5920, -9894, -10766, -12716, -10691, -3988, 5401, 12934, +15166, 13007, 8457, 4621, 3007, 3129, 5717, 12601, 19381, 12933, 4679, -1243, -4020, -6947, -9702, -5876, +-3769, -7402, -2114, 3120, -1057, -1296, -1699, -3518, -4413, -10435, -15615, -8834, -1346, 1099, 1442, 5751, +9604, 15082, 16540, 13588, 9474, 5368, 9720, 12590, 9652, 7975, 3426, 1505, -5284, -16333, -11400, -1547, +1634, 8229, 10180, 8970, 6920, 9430, 10435, 2458, -2337, -5480, -7462, -8305, -15217, -15523, -15360, -16814, +-12523, -9836, -3884, -3385, -6445, -6454, -10361, -14999, -14980, -4410, 279, 5335, 9183, 12358, 9948, 5856, +1272, 1428, 8753, 11660, 18898, 16630, 8420, 3831, -1343, -6939, -9555, -8949, -60, -4795, -7710, -2221, +-6603, -4942, -1160, -1465, -937, -6804, -13646, -10341, -2527, 4708, 6237, 6930, 10500, 14521, 17854, 16627, +13541, 6789, 7065, 10701, 10220, 7433, 2808, 1979, -921, -10090, -9764, -4286, -868, 4618, 8097, 5502, +7985, 11452, 12749, 3757, -2790, -1658, -3715, -6381, -16851, -21552, -18474, -16653, -11692, -9524, -6780, -1122, +-6887, -5774, -8161, -11159, -9197, -6613, -5876, -2044, 6035, 11498, 9860, 4846, -289, -40, 7907, 8924, +10211, 18275, 14187, 7156, 2085, -7035, -8024, -5620, 965, 1554, -6702, -6807, -7344, -9426, -3042, 995, +-1151, -4533, -13167, -14773, -5543, 2416, 4689, 6271, 12378, 15990, 18552, 18412, 15073, 3277, -141, 7806, +10357, 5678, 978, 1687, -217, -6818, -9301, -5544, -2150, 1518, 7182, 5566, 7945, 13414, 15624, 7181, +-3615, -4200, -3202, -5110, -14461, -19930, -14890, -14002, -12953, -9727, -4921, -5316, -6189, -7386, -7332, -9750, +-11702, -12325, -8610, -3617, 5174, 11001, 8267, 8194, 4717, 3755, 9091, 9385, 6242, 15607, 17037, 8878, +2967, -3440, -7143, -4520, -254, 2623, -1176, -5177, -5529, -5659, -774, 4025, 20, -3394, -8539, -15289, +-10880, -4877, -590, 2371, 9448, 16036, 19613, 19303, 14746, 4040, -3988, 7414, 14356, 10917, 6333, 5871, +4675, -1689, -8258, -6348, 1271, 93, 2465, 4219, 8228, 15367, 15888, 10764, 1140, -4570, -5668, -8611, +-14826, -19795, -14612, -14351, -21424, -15439, -7686, -8821, -9305, -10774, -7013, -9126, -14999, -15231, -12250, -5935, +-1249, 6227, 11152, 7248, 6236, 7405, 7947, 9092, 8723, 11920, 16642, 9252, 3473, 932, -5412, -5456, +-1860, 3168, 858, -7229, -9890, -3899, -2378, 2842, 2250, -1654, -5664, -16255, -14199, -5969, -4326, -277, +8442, 18780, 21050, 20159, 12954, 9319, 1055, 3118, 10395, 10554, 5714, 5314, 8799, 3449, -5791, -6905, +612, 4088, 5043, 6071, 7191, 13883, 14060, 11349, 2053, -3527, -5788, -5896, -9601, -14133, -11932, -10277, +-17540, -13939, -5006, -10294, -12158, -13318, -11504, -10786, -16313, -13099, -10963, -11084, -6171, 2783, 12001, 14962, +11971, 12936, 10609, 9649, 10456, 6084, 14730, 11035, 3381, 74, -5120, -3821, 401, -352, -371, -4174, +-12386, -9421, -7693, 650, 5935, -1809, -8142, -13536, -16147, -6247, -4536, -1442, 7216, 16886, 18277, 15949, +11930, 12067, 7065, 905, 3443, 11020, 7359, 3500, 6249, 8402, 1616, -7122, -749, 4689, 3641, 6244, +5442, 12082, 16677, 11358, 4523, -1220, -9291, -8862, -11011, -15473, -13394, -12266, -18195, -17196, -9114, -9625, +-8969, -11757, -11603, -11631, -11624, -10879, -12844, -16155, -10701, 2532, 8304, 11082, 12975, 13589, 15502, 12824, +12049, 6635, 5189, 7971, 5944, 3355, -646, -4602, -2524, -199, -861, -4972, -11763, -11359, -5814, 64, +3828, 199, -7817, -8241, -13210, -9422, -7248, -4322, 5800, 14465, 18723, 14175, 13474, 15447, 14746, 3507, +-793, 7645, 8191, 4157, 6307, 7471, 2644, -3817, -78, 5027, 3833, 8926, 11651, 12102, 16295, 10086, +5664, 3317, -7819, -6803, -7991, -13084, -14006, -14180, -17097, -20773, -16331, -8673, -11505, -14670, -12009, -8125, +-9053, -7017, -13477, -15253, -10748, 152, 7641, 8301, 12815, 15601, 17782, 14442, 9972, 5895, 1738, 3064, +3595, 4633, 2296, -2075, -2542, 631, 478, -6119, -10172, -10298, -5594, -3879, 1189, -2613, -7657, -5471, +-11374, -11044, -7332, -6344, 1988, 6835, 12189, 14099, 14063, 16129, 15124, 7384, 263, 5290, 9015, 5888, +3211, 7161, 4497, -2136, -3473, 3255, 6918, 12047, 16945, 14133, 13711, 8441, 8976, 6668, -4717, -10750, +-7898, -9899, -12649, -18331, -18326, -21152, -18031, -10196, -12034, -12248, -7665, -1702, -2977, -6979, -14872, -15819, +-9004, -1636, 2494, 1647, 6714, 14271, 17003, 15799, 11356, 8572, 4437, 627, 4882, 6138, 8858, 3735, +-3313, -2154, -892, -7713, -9430, -7301, -4833, -5614, -3038, -929, -3942, -994, -8442, -12116, -6012, -4831, +-3580, 1433, 5447, 11377, 12916, 12240, 12854, 9480, 2116, 6889, 13143, 5179, -1018, 5159, 4228, -957, +-5291, -488, 8924, 13764, 19861, 22264, 17143, 12035, 8348, 8217, -3146, -10929, -8457, -9426, -15185, -19478, +-23196, -22979, -21610, -14088, -10240, -8557, -2766, 3818, 2451, -5853, -11940, -13500, -7841, -7065, -4434, -197, +4097, 12610, 16520, 19153, 16414, 10444, 2687, 3243, 6764, 10745, 9915, 4210, 1624, -8136, -11039, -9246, +-6769, -4288, -5231, -6080, -1913, 1627, -2905, -3498, -7602, -7559, -5859, -7870, -7953, 491, 9735, 13178, +11208, 9958, 11526, 9252, 3920, 5546, 15388, 10098, -1273, -178, 3569, -4671, -8283, -1335, 7461, 13827, +19824, 24483, 23278, 15510, 8112, 1935, -3983, -8270, -6969, -9496, -17263, -20376, -23918, -25359, -23799, -18732, +-8842, -7163, -5247, 487, 3440, -918, -5537, -7900, -8680, -6871, -3952, 1436, 5858, 11394, 15135, 17483, +14948, 12329, 7696, 2533, 4521, 8882, 4670, 3123, -2590, -11641, -12046, -5073, -1426, -2964, -5785, -5387, +2424, 4596, -585, -4770, -4649, -6452, -10478, -13709, -9368, -1810, 6178, 9238, 7264, 3530, 6814, 11610, +13510, 10293, 15496, 15402, -2673, -4775, -4695, -8207, -8043, -3622, 8210, 15222, 17060, 23969, 27117, 21591, +9545, -2109, -4109, -3581, -6491, -9158, -15867, -17703, -23076, -25703, -22547, -16543, -9216, -7136, -8697, -3879, +773, 543, -5460, -5481, -6828, -3784, -2599, -3498, 6066, 9590, 14272, 15762, 17357, 16244, 9615, 1634, +3149, 7594, 4583, 1671, -4123, -11206, -13481, -5630, 1029, 637, -4249, -2110, 2686, 2323, -1060, -1925, +-2131, -5509, -13581, -13554, -6130, -2574, -115, 3421, 4063, -1069, -1852, 6021, 15344, 17607, 15992, 20628, +6908, -2986, -2155, -5680, -6596, -2676, 5018, 13382, 12266, 19909, 31484, 26826, 10546, -1555, -672, 366, +-4969, -7340, -12183, -17341, -22342, -26557, -23580, -18249, -15022, -9751, -8152, -4402, 437, 4833, 2277, -224, +-2225, -2624, -3273, -4858, -2987, 292, 7936, 13418, 16270, 16700, 9451, 2920, 3539, 6760, 7073, 3597, +-185, -7312, -11728, -7458, -1431, -701, -5616, -5643, 1248, 2351, -228, -1692, -2543, -1676, -11484, -12677, +-6866, -7176, -3017, -2180, -936, -1702, -5335, 2625, 11591, 16933, 17487, 16768, 11819, -258, -5495, -5887, +-7708, -8044, 5766, 12915, 15029, 16472, 29381, 28622, 15935, 3629, 818, 241, -5398, -8735, -10569, -19235, +-22439, -21995, -18155, -16614, -18826, -14024, -7409, -4862, -1467, 3065, 6032, 3054, 810, 511, 1354, -4075, +-6789, -2543, 5929, 13365, 12857, 15431, 10238, 4583, 2727, 1903, 2732, 1790, 2379, -2473, -6549, -6678, +-1067, 3922, -255, -6633, -1548, 3836, 153, -902, -3759, -2754, -5408, -9803, -10258, -7786, -6687, -5149, +-3561, -8, -637, 1554, 5901, 12251, 16252, 14512, 13566, 1724, -7384, -3581, -5824, -7987, -2606, 7270, +13362, 13263, 23867, 26833, 18302, 11116, 3784, 2358, -5217, -10994, -9024, -15544, -16129, -17756, -19625, -20897, +-18506, -15262, -8810, -7181, -5402, 817, 7078, 8708, 5043, 1135, 3022, -2844, -8915, -6050, 961, 10648, +15018, 12507, 13308, 5856, 4610, 5170, 3284, 1377, -37, 2228, 506, -789, -602, 921, -1428, -6909, +-7522, 3791, 5992, 1407, -2466, -3859, -2109, -7564, -12153, -8809, -6318, -3043, -1482, -2716, -2076, 2854, +7425, 10981, 15911, 14189, 12688, 8984, 187, -730, -2338, -4743, -4678, 2201, 6126, 10631, 16857, 26099, +21733, 13166, 3387, 968, -2362, -11889, -12843, -14350, -14281, -11070, -17764, -21607, -18210, -18435, -11418, -10061, +-10183, -2044, 6920, 10070, 5107, 2376, 1957, -95, -6101, -4443, 2790, 6789, 10415, 11847, 9364, 3581, +1874, 3358, 1776, -3289, -3545, 2441, 5866, 2736, -4476, -2482, -4158, -6600, -8572, 997, 7841, 8669, +3174, -4195, -3342, -5197, -6657, -7185, -4995, -2004, -2105, -3922, -832, -490, 1889, 8024, 11438, 11794, +9352, 9751, 8110, 949, -345, -399, -4972, -2156, 4312, 12553, 17519, 20045, 21631, 17797, 11724, 2779, +-3970, -12431, -15127, -10767, -12872, -9595, -17737, -21334, -14943, -16171, -16023, -14941, -14336, -3815, 3583, 8557, +6499, 56, 1684, 1210, -3176, -7013, -3430, 5091, 10374, 7607, 6833, 5436, 3429, 4500, 2458, -1170, +-4287, 2145, 11311, 6470, -4116, -7883, -6114, -5777, -10201, -1407, 8688, 8808, 5541, -1222, -2221, -4592, +-8639, -6489, -2379, -1244, -3484, -7245, -2803, 589, 1141, 5166, 7069, 9169, 7347, 10894, 14250, 3949, +-156, 2250, -4935, -3808, -161, 9157, 13977, 16862, 23399, 22248, 14117, 4825, -3665, -9508, -15629, -10251, +-9813, -12076, -16653, -17894, -13904, -13564, -19066, -16491, -12784, -7218, 1156, 5785, 8321, 4166, 2512, 2189, +-1256, -3190, -5594, 3387, 8060, 4441, 1888, 5510, 5000, 5271, 594, -607, -507, 1455, 10351, 6768, +-4578, -6775, -5208, -8540, -9633, -5785, 6696, 11035, 5505, 1230, -158, -2754, -7836, -4489, 1831, -2052, +-6035, -4211, -2933, -2567, -2497, 3186, 8222, 9285, 10607, 9391, 12285, 8401, 3205, 2625, -3311, -6725, +-2081, 2645, 10762, 8499, 19650, 29852, 18328, 7756, 800, -7507, -10418, -5093, -4336, -9890, -14984, -15310, +-11868, -12279, -20724, -19347, -9765, -8236, -5179, -2170, 5468, 6566, 4569, 4077, 3580, 543, -3492, -70, +3547, -2381, -2429, 4655, 5570, 2784, 1927, 482, 3860, 917, 3561, 5151, -3763, -7937, -7779, -8443, +-7364, -4495, 5924, 8166, 4742, 4625, 1524, -3018, -6792, -3796, 1194, -1404, -6193, -4506, -6077, -7740, +-3513, 3488, 10762, 10561, 8785, 7628, 9879, 10931, 4894, 2439, -2117, -5184, -3884, -2969, 8035, 9026, +15300, 27606, 20953, 10127, 6028, -4317, -7757, -6212, -6206, -9051, -14400, -15624, -9135, -7938, -16963, -20739, +-11908, -8300, -10424, -8680, 769, 7928, 5743, 3391, 3215, 5079, 314, -1902, 3696, -1859, -3909, 1269, +5198, 7143, 6711, 2747, 9309, 5217, -2076, 2130, -1306, -5856, -6532, -8363, -6622, -7604, -1151, 6517, +6932, 5604, 5107, -539, -2687, -3365, 3186, 2343, -4475, -5668, -6851, -9839, -7093, -371, 10502, 13540, +8341, 3062, 8185, 13760, 5228, 1215, 30, 89, -3156, -5566, 2303, 9962, 10898, 20172, 19949, 13808, +8163, -1932, -4496, -5973, -9102, -9119, -12844, -14267, -10171, -5665, -8963, -18776, -16416, -9582, -14557, -12494, +-2356, 5852, 3941, 2034, 3158, 6343, 3914, -2820, 352, -476, -3615, -346, 6637, 8801, 9550, 2820, +8944, 5565, -3694, -437, -107, -3615, -3959, -8466, -4271, -4412, -1843, 6391, 5876, 4540, 7121, 1872, +1140, -3428, -1584, 2700, -2734, -8202, -10876, -9970, -6333, 1944, 9763, 15421, 8118, 4238, 7856, 12403, +5105, -634, 994, 905, -1742, -5489, -1795, 10062, 12043, 14073, 19430, 12587, 10589, 6741, -451, -5077, +-11592, -10897, -10622, -14281, -10120, -8024, -4820, -10230, -17468, -14894, -19320, -14962, -6099, -613, 143, 330, +4064, 6566, 5058, -2986, -4592, -343, 1577, 636, 4659, 9315, 10889, 5726, 4067, 5393, -1268, -2295, +1112, 2203, 711, -6033, -7453, -2713, -3946, 2453, 4014, 2003, 9023, 5789, 568, -3690, -4709, 1805, +982, -8053, -12223, -9383, -4410, 3734, 9228, 11753, 7965, 4773, 5163, 6908, 1442, -2266, -773, 2289, +521, -2631, 49, 9412, 13939, 15176, 15209, 9954, 9250, 7684, 720, -4356, -9498, -8202, -8451, -10059, +-7380, -5064, -3154, -9251, -16556, -19878, -22662, -14754, -9081, -2590, -1961, 1026, 6823, 6176, 1477, -1704, +-320, 2115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 512, 694, 823, 928, 521, 236, -122, 175, 2, 595, 370, -396, -446, +165, -185, -1011, -1034, -1024, -973, -640, -754, -851, -525, 89, 137, -509, -170, 119, 640, +953, 577, 773, 1001, 719, 767, 1086, 1252, 1141, 758, 238, 103, 50, 94, -1, 299, +154, -73, -254, -156, -515, -637, -918, -1574, -1312, -1031, -1348, -965, -849, -337, -477, -180, +-231, -463, -79, 505, 594, 500, 973, 875, 641, 658, 701, 885, 1086, 502, 715, 206, +336, -52, 331, 128, -286, -708, -444, -190, -822, -1383, -1816, -1109, -957, -1455, -1174, -976, +-383, -293, -634, -448, -234, 369, 88, 651, 1373, 1491, 1092, 1083, 1636, 1309, 1178, 1467, +1183, 802, 284, 575, 480, 424, -433, -134, -364, 21, -599, -825, -1181, -1644, -1879, -1185, +-1487, -1325, -844, -481, -550, -451, -661, -607, 600, 797, 878, 851, 1991, 1040, 890, 669, +1205, 1755, 1241, 1093, 1271, 1127, 802, 735, 1155, 900, -517, -403, 102, -845, -1917, -2266, +-2546, -1891, -1820, -2361, -1758, -1111, -1097, -1354, -655, -960, -663, 342, 1234, 1747, 2038, 1401, +963, 1630, 1690, 1465, 1811, 2078, 1368, 1026, 1135, 1438, 946, 81, -730, 74, 491, -705, +-2301, -1794, -2013, -1893, -1159, -1474, -2946, -1000, -692, -1868, 265, -1755, -1563, 1020, 1123, -423, +1785, 1776, -168, 283, 2197, 2664, 1464, 1239, 1199, 1229, 1287, 1436, 1256, 1331, 210, -1122, +-384, 263, -1709, -2493, -2397, -2169, -634, -1771, -2144, -856, -691, -1074, -852, -451, -246, -507, +279, 265, 304, 772, 331, 899, 1247, 1738, 1849, 2508, 1974, 802, 1661, 2560, 2740, 1188, +-393, -684, 928, 453, -1535, -3079, -3075, -3886, -2825, -1939, -1359, -952, -2425, -1605, -485, -3298, +-435, -21, -1014, 3275, 2037, 1957, 1225, 1001, 1528, 2015, 623, 356, 2252, 3749, 3096, 1435, +1762, 1332, -160, -1341, -13, -134, -1465, -3098, -3701, -2168, -221, -2017, -1826, -1165, -2251, 6, +-131, -909, -1030, -1349, -335, 1736, 1503, 1477, 745, 1162, 609, -1501, 681, 1563, -317, 2213, +4132, 3372, 3460, 2225, 1227, 434, -637, -1012, -177, -2213, -2542, -3002, -2541, -2322, -3768, -3163, +-249, -495, -2681, -1855, -299, 549, 908, -705, 836, 2231, 703, 1612, 2660, 2351, 2465, 1419, +1046, 2115, 2711, 3017, 4324, 2722, -40, 330, 813, -750, -936, -4448, -2305, -5076, -3856, -2395, +-4956, -759, -469, -4553, -2306, 390, 225, -404, -1156, 2227, 1018, -742, -1482, 2332, 4588, 2818, +-1151, 1355, 3573, 2217, 1330, 3753, 6143, 3178, 588, -452, 2267, 2528, -3234, -3949, -1630, -2338, +-2802, -5170, -2217, -3744, -3110, 623, -2109, -1112, 574, -1853, -2102, -132, -517, 1128, -1081, -253, +694, 3202, 2216, 1496, 1489, 1801, 3758, 4720, 4622, 3986, 3217, 1598, 918, -73, -883, -2531, +-3130, -2427, -2401, -3419, -2812, -3619, -3531, -2201, -84, -4195, -3425, 1209, -1427, -196, 2461, 609, +-981, -447, -1579, -102, 1122, 3809, 3240, 1937, 1402, 5141, 5508, 6285, 2606, 2009, 3775, 2159, +-3410, -3575, -779, -3500, -2761, -3358, -2524, -2624, -3139, -343, -3673, -2077, -1120, -26, 95, 1026, +2972, -486, -2197, 670, 669, -1319, -1753, -32, 3164, 1911, -1390, 976, 4288, 4146, 3432, 679, +2000, 5712, 975, -2615, -1555, 251, -1569, -2616, -3023, -5129, -2301, 792, -2053, -643, 1527, -3358, +-472, 802, 39, -695, 549, 1186, -818, -3152, -461, -1936, 2589, 2209, 163, 1354, 1384, 2730, +5277, 5168, 3862, 4429, 2674, -505, -3408, -3918, -3379, -611, -1451, -4553, -5022, 1074, 204, -4535, +1860, -1810, -1426, 2834, -815, -606, 424, -772, -3037, -2925, -498, -684, -236, 4112, 3948, -309, +-83, 2159, 5660, 5192, 3899, 2877, 800, -1138, -2188, -3462, -3345, -1435, -886, -4549, -3328, 2196, +2150, -2174, 874, 2696, -4633, 1443, 5056, -689, -2439, -1472, -481, -2121, -4164, -4874, -3871, 2669, +2759, 311, 1262, 1833, 4024, 4369, 5081, 4589, 210, -1802, 1894, -1508, -577, -360, -243, -759, +-4505, -1965, 4093, -2056, -4628, 1374, -2494, -104, 3183, -205, -2091, -2715, -2193, -2703, -1431, -1694, +-1132, 3375, 3721, 742, 2618, 2114, 1043, 3682, 5450, 5581, -318, -2849, -2102, -1865, -681, -375, +405, -1511, -2298, 401, 5483, 640, -2954, 2335, -4709, -4599, 192, -803, -2392, -2980, -2065, 1801, +763, -2086, -2818, -1, 5163, 1230, 1435, -178, -309, 1941, 4916, 7609, 2655, -2667, -719, -413, +-718, -1296, -3496, -1799, -666, 753, 3415, 3875, -1742, 2286, -1529, -3666, 1244, -869, -2785, -250, +-2488, -2227, -2888, -4674, -6274, -4065, 3370, 2403, 2492, 1121, -619, 4153, 6499, 7641, 4810, -262, +-1430, -241, -1091, -148, -3652, -1291, 78, -666, 3205, 3369, -3156, 3893, 2227, -4581, -449, -1116, +-2143, -2373, -1582, -1753, -1718, -3692, -4605, -4416, 3752, 2313, -3254, -4216, -2013, 1183, 7645, 7430, +6308, 2359, 235, -343, 3642, 3702, -1520, 1684, 132, -1698, 5959, 4346, -3600, -2529, 1443, -8157, +-5048, -1104, -2939, -3552, -2319, -1092, -2865, -1195, -2838, -3460, 2246, 4780, 1327, 417, -4403, 2358, +6017, 7628, 7157, -981, -2197, 30, 1739, -178, -4652, -2791, -908, -2475, 2975, 8986, 2527, -498, +4243, -2388, -2846, 292, -1961, -2597, 669, 18, -4422, -2982, -2919, -5326, -2844, 20, -3159, -1903, +-3845, -968, 5791, 7582, 9900, 4519, -3489, -568, 3386, 1298, -4297, -2196, -3232, -2112, 194, 5403, +6375, 589, 5388, 2226, -1474, 2987, -1070, -7391, -2218, -2121, -4981, -1727, -679, -1341, -544, 2056, +-364, -2330, -6065, -1996, 1078, 4288, 9381, 5110, -2158, -1917, 3787, 1543, -2749, -6216, -689, 123, +-1476, 5251, 7885, 3230, 7339, -689, -4722, 696, -228, -6525, -4996, -1605, -1275, -6990, -881, 1969, +-835, 122, 652, 1406, -2623, -5903, -3832, 743, 6725, 4795, -752, -575, 3416, 2276, 1959, 1025, +-2101, -2436, -1744, 4962, 6772, 3254, 7163, 2737, -1063, 948, 3537, -4822, -7175, -2708, -6572, -6008, +-2192, -1495, 1189, 1821, -149, -946, -3358, -2929, -1622, 1521, 3240, 7488, 553, -2870, 2609, 2557, +-194, -1646, -812, -2958, -2805, -66, 4403, 3579, 6777, 5038, 398, 3442, 2933, -1121, -3414, -5440, +-9774, -9983, -1482, 1077, -1558, 1195, -841, -1782, -2226, -3376, -2857, -579, 3526, 4830, 3217, 1273, +5410, 316, 1631, 2121, 2096, -217, -4636, -1462, 5849, 4892, 5994, 3055, -2088, 2687, 4742, 1286, +-3593, -1052, -5499, -7322, 592, 829, 870, 2099, -3273, -1818, -696, -6459, -7928, -7021, 2075, 6736, +1995, -2539, 498, 3298, 3565, 2383, 1025, -962, -5626, -1160, 4119, 1770, 2793, 6260, -1742, 4903, +8973, -3243, -7123, -1728, -6641, -7092, -4104, -4820, 1262, -972, -1583, 1668, -1668, -531, -3845, -1471, +5932, 7059, 4167, -4602, 800, 2412, 4327, -839, 767, 690, -2721, 1092, 9474, 9904, 2119, 5764, +-2846, -3762, 7515, 3067, -5779, -2007, -7982, -5400, 949, -1028, -1809, -1048, -1083, -2483, -1849, -1096, +-3851, -4166, 999, 6172, 1547, -8067, -2896, 2109, 105, -471, 1019, 2900, -3071, -1176, 6447, 9022, +991, -783, -2348, -2412, 6843, 5132, -2476, 498, -2361, -2959, 138, -1719, -1407, -3988, 3046, -535, +-7711, -3151, -7118, -260, 4495, 6603, 3443, 1644, -5547, 744, -1973, -4306, 1647, -3094, 818, 1810, +6801, 11149, 6050, 7627, 81, -6841, 3702, 7412, 845, -1370, -7012, -6792, -376, 674, -2025, -6431, +-2524, -1796, -1358, -3779, -4404, -240, 5474, 5538, 4531, 173, 1595, -3466, -5281, -1087, -881, -212, +-5324, -771, 6029, 9204, 2216, 6637, -541, -9187, 1634, 5843, 487, -1426, -3884, -4713, -65, 2325, +5427, -1681, -2251, -5795, -5624, 937, -3356, -2722, -1579, 4733, 6313, 754, -823, -2271, -5304, 250, +-1543, -2369, -3435, 125, 9130, 13273, 6506, 4117, 1738, -7326, -4067, 7331, 5289, 2495, -3718, -3573, +2068, -1865, -1132, -2441, 417, -1852, -6544, -2139, -3302, -978, 3226, 966, 4885, -3508, -558, -2169, +-6913, -7184, -4991, -4148, -3452, -1409, 4693, 14584, 7318, 7444, 4612, -5523, -7404, 6252, 6593, 2153, +-3841, -2586, 7720, 7543, -676, -5271, -2469, -3009, -4538, -3294, -2785, -2017, 2421, 5198, 2671, 1659, +-7027, -2630, -3171, -2403, -5446, -5340, -3962, -636, 3487, 9352, 7931, 399, 9324, -1622, -7132, 2951, +5669, 7714, 2752, -6899, 3458, 4627, 1734, -2608, -4738, -4039, -3608, -4371, -941, -1471, 721, 3370, +3333, 4031, -5988, -7962, -4059, -1932, -3706, -7635, -4373, -4128, 3324, 12718, 11935, 1878, 6792, 4747, +-9774, -2857, 3691, 6833, 2634, -7968, 2044, 6615, 5966, -3414, -7438, -2749, -3694, -4410, -2774, -4763, +1505, 1878, 4022, 697, -3313, -6691, -2552, -2691, -982, -3111, -5085, -3298, 1178, 14092, 14670, 3109, +74, 8205, -5534, -1446, -2495, 5732, 8039, -2406, 6, 6297, 8397, 1273, -7410, -3752, -2207, -3004, +-3212, -5115, -1514, 2920, 2783, 109, -4162, -9070, -8976, -4101, -1325, -7388, -2896, -2513, -2825, 6940, +16444, 10697, 157, 5949, -647, -3357, -3735, 3018, 7284, 948, -563, 2882, 7350, 3828, -4826, -4000, +-2581, -108, -1296, -6164, -422, 1099, 3942, 2051, -2915, -8971, -11169, -5428, -160, -4597, -6664, 259, +13, 2665, 13865, 11548, -1372, 2206, 1421, -4519, -3786, 1698, 7044, 4897, 3787, 3658, 7021, 3791, +-2494, -3597, -530, -1464, 946, -4780, -1373, 2628, 3410, 4190, -1280, -8876, -13066, -11044, -4797, -4465, +-9656, -2378, 1739, 865, 10549, 15360, 1256, -2455, 2053, -6145, -6598, -3566, 3502, 5813, 11374, 4193, +4912, 2545, -982, -3964, -289, 2833, 3726, -938, 1244, 5281, 1983, 5578, 1062, -7732, -11353, -12091, +-8660, -2025, -10550, -4957, 1888, 1222, 7720, 14631, 6002, -3866, 1446, -1591, -10117, -2521, 4793, 5287, +12736, 6492, 1714, 4108, -138, -5015, -3684, 609, 2720, -1445, 21, 4549, 4085, 78, 622, -3280, +-9144, -11338, -12673, -4916, -6090, -6095, -992, 257, 4243, 11220, 10200, -4128, -5740, 3471, -8333, -4417, +1010, 4719, 12672, 13254, 5781, 2915, 841, -2571, -3372, 3032, 5148, -1906, 1661, 6797, 6225, 239, +-3406, -5263, -10167, -10156, -12825, -10100, -5342, -6465, -143, 973, 2946, 6583, 11086, 729, -7137, 2241, +-5541, -5102, 3498, 7249, 14969, 14385, 9634, 2863, 526, -2804, -4686, -39, 3452, -1104, -677, 6288, +5650, 1087, -6696, -3222, -11306, -8309, -15391, -8735, -6544, -5033, -497, 734, 3076, 3426, 7583, 1842, +-6473, -4082, -892, -10081, 1135, 4518, 14946, 15670, 14535, 4980, 1787, 236, -2731, -413, 6564, -289, +-754, 7603, 8319, 3447, -5617, -6492, -10598, -9817, -12897, -10391, -12218, -3309, -2545, 611, 4388, 309, +5112, 6007, -3135, -7659, -1365, -11737, -624, 5520, 11676, 15130, 14586, 7977, 517, 191, -2571, -323, +7720, 4889, -425, 4815, 10253, 4450, -3264, -9911, -10898, -10570, -11913, -12707, -13192, -3736, -317, 1941, +3127, -1223, 1023, 7539, 995, -8779, -3351, -5966, -7826, 7651, 9764, 16249, 16290, 10219, -466, 1355, +-1452, -2749, 6265, 6454, 2066, 4203, 10244, 4547, -177, -7105, -12776, -14054, -12218, -11014, -11901, -9862, +1494, 3198, 4050, 301, -2162, 5038, 7220, -7144, -7660, -2785, -12873, 3983, 12619, 12711, 15095, 11865, +1195, 955, -1326, -2514, 4993, 8780, 6042, 2490, 9192, 6513, -1606, -5226, -14893, -12909, -11910, -9236, +-10849, -12585, 1, 3828, 4708, -57, -3255, 1446, 8816, -2100, -10369, -2621, -7420, -4180, 15416, 12571, +12809, 13326, 2243, 3260, -194, -3695, 1741, 7562, 7428, 4933, 7121, 10668, -1884, -5543, -15517, -15693, +-12790, -9795, -9999, -11306, -2450, 4477, 7176, -1248, -3120, -2489, 8857, 2269, -12085, -5131, -2749, -7389, +10832, 14191, 9164, 12575, 6002, 2890, 2725, -2870, -325, 6418, 9121, 7905, 7437, 12902, 1351, -6947, +-13051, -16934, -14869, -10510, -9461, -10784, -5827, 5815, 7079, 1293, -5924, -4422, 3395, 7457, -10355, -8920, +-2196, -7636, 7061, 15442, 9221, 10647, 9091, 2497, 4017, -1093, -2768, 4563, 9357, 9232, 8340, 10226, +5738, -5543, -10721, -15746, -18263, -10175, -9000, -10028, -5907, 3869, 6972, 6203, -5955, -6635, -942, 6433, +-4889, -10640, -4054, -4235, 3001, 14599, 11114, 6540, 8697, 5360, 4107, 1184, -4788, 2668, 9210, 10158, +10095, 11028, 7623, -1616, -12093, -12783, -18912, -14276, -8077, -11075, -5786, 1106, 7942, 7291, -3571, -8887, +-1525, 3437, -1766, -7821, -6803, -1869, -509, 10655, 13449, 6870, 6477, 7488, 4452, 2367, -3106, -1824, +9013, 9492, 11965, 10786, 8848, 2498, -10414, -10938, -18469, -18505, -8411, -10943, -7531, -899, 5635, 7603, +952, -9284, -3079, 1401, -148, -5145, -6774, -3065, 230, 7419, 13593, 7837, 4887, 8409, 5256, 3254, +-936, -4030, 5178, 10999, 10298, 12057, 9091, 5219, -5639, -10385, -15759, -21213, -10152, -10243, -8581, -2789, +2415, 7980, 3396, -6981, -5752, -1440, -1635, -3312, -5517, -6227, 2388, 3285, 12499, 8229, 4684, 7499, +8505, 5018, -162, -2184, 467, 10895, 10008, 13244, 11552, 6580, -1673, -10410, -13915, -21915, -14186, -9139, +-7704, -4097, -565, 6623, 5921, -3361, -7745, -3285, -2785, -2512, -4782, -6337, 464, 3689, 6998, 11205, +6061, 6566, 10148, 4897, 224, 1814, -4152, 8323, 9366, 12030, 14040, 9125, 724, -8712, -11761, -20240, +-17419, -11311, -6749, -5848, -1598, 4398, 6274, 733, -5820, -3319, -6061, -3088, -2592, -5624, -3306, 5406, +4199, 11019, 8971, 4812, 9231, 7050, 1285, 492, -1792, 1959, 9666, 9823, 15023, 10588, 4544, -4514, +-12667, -19010, -17572, -13314, -7034, -6366, -3386, 1912, 7238, 2810, -2209, -5178, -6958, -6026, -1847, -4030, +-5431, 2574, 2310, 7551, 13603, 6159, 8260, 8956, 3675, 1466, 1280, -5011, 8019, 8920, 15239, 13232, +7303, -127, -10481, -17887, -17281, -13726, -10464, -4792, -6258, -1064, 6370, 4603, 1543, -3784, -8280, -7937, +-2512, -1164, -6322, -1966, 2858, 3336, 14802, 9581, 5709, 9271, 5291, 2744, 1181, -5243, 2790, 9654, +13052, 14636, 9960, 3981, -6860, -17725, -18510, -11729, -13038, -5107, -9162, -2332, 3526, 5961, 2973, -1766, +-9005, -9241, -4714, -646, -4761, -5218, 2223, 3167, 11863, 14288, 5754, 9226, 7837, 4645, 1612, -3162, +-3793, 8829, 11350, 15287, 12634, 6995, -3594, -15859, -18286, -12353, -14065, -9183, -7097, -4681, 2219, 5558, +4833, 2376, -9536, -9819, -8038, -1099, -3120, -7071, -650, 3803, 8650, 16382, 9417, 7646, 9433, 5813, +3191, -2829, -7303, 4324, 11128, 14164, 15011, 10987, 13, -13007, -15924, -14685, -13551, -13403, -7011, -7370, +488, 3081, 5480, 5595, -5400, -11465, -9906, -3273, -2154, -6910, -3418, 1891, 6259, 14898, 14216, 7194, +10031, 7541, 5350, -3269, -7045, -1224, 10728, 13333, 15815, 16033, 3657, -10248, -14267, -13929, -12582, -16017, +-10347, -8872, -754, 1833, 4644, 8566, -1645, -11794, -11911, -5840, -1412, -5599, -7070, -648, 5931, 12563, +16851, 8964, 8586, 10476, 7599, -1350, -7708, -5174, 6492, 13599, 13971, 18476, 6613, -5444, -12178, -12019, +-12956, -15617, -13159, -7323, -5087, 738, 1826, 8670, 3418, -9809, -13376, -8021, -1237, -3986, -7186, -5217, +4407, 10655, 17051, 12194, 6943, 12076, 9794, 2983, -8254, -5098, 642, 12352, 13254, 17574, 11495, -2771, +-10865, -10316, -11641, -15033, -16368, -8451, -5783, -1859, 545, 6285, 7000, -6656, -13696, -11201, -1422, -3146, +-6155, -7505, 13, 10999, 16061, 15874, 7053, 11418, 12314, 6642, -8088, -5867, -2599, 7879, 10653, 16254, +14293, 2172, -9976, -9627, -7854, -13595, -16467, -14727, -3467, -4671, -884, 3736, 7475, -3067, -11535, -13546, +-3891, -500, -5852, -6957, -4569, 7495, 16763, 15762, 11117, 8597, 14860, 8509, -1601, -9233, -2209, 3229, +10534, 14485, 16063, 8290, -7956, -9478, -5974, -10766, -15640, -18476, -5074, -3736, -3036, 2372, 6753, 1209, +-8294, -14630, -8365, -527, -4806, -7283, -6520, 1978, 15117, 16410, 14633, 7890, 14632, 11636, 2436, -7899, +-4887, -1021, 7214, 13841, 16192, 13050, -5599, -8447, -5200, -7447, -13508, -20103, -10445, -1833, -5707, 233, +5446, 2585, -4598, -13038, -10346, -2014, -3545, -7306, -7446, -3457, 12221, 18670, 13714, 9668, 11728, 14984, +4919, -4646, -8102, -3003, 2502, 12196, 16303, 15547, 152, -9590, -3012, -4930, -10782, -20007, -17163, -3404, +-3360, -4961, 4875, 3530, -1703, -10476, -11886, -4002, -2065, -7150, -8008, -5891, 7619, 19019, 14952, 12122, +12115, 15494, 8234, -835, -8535, -5227, -1935, 7716, 15452, 16551, 6366, -8325, -3818, -2881, -6681, -17887, +-20726, -8321, -573, -5818, 1650, 3781, -781, -5261, -11519, -6440, -3374, -6104, -9075, -5197, 99, 18344, +16017, 13217, 13279, 15974, 11234, 2051, -6566, -8232, -4254, 2920, 15374, 15819, 10909, -4463, -5815, 482, +-4035, -14802, -20653, -15542, -2088, -4277, -3300, 5869, -758, -2664, -10197, -6880, -4985, -5542, -9759, -6832, +-2372, 12819, 17797, 12411, 14476, 15061, 13472, 4264, -3408, -10095, -6331, -129, 10879, 16076, 13062, 3043, +-6869, 437, -296, -10760, -19516, -18936, -9256, -147, -5331, 4344, 1902, -2427, -5452, -6968, -5347, -7919, +-6090, -9621, -3948, 6338, 18770, 14026, 15606, 15930, 13895, 9005, -2076, -7961, -9357, -3411, 6223, 16048, +13842, 8091, -4659, -1364, 2739, -7524, -17734, -19564, -14292, -2459, -1941, -2689, 5591, -2885, -2553, -6440, +-5856, -9184, -5977, -9764, -5843, 2647, 13357, 18669, 14237, 17002, 13523, 11649, 394, -6599, -11361, -6493, +1773, 13208, 14349, 9356, 1571, -2989, 3731, -3842, -14484, -18901, -16251, -9751, 1136, -4011, 4216, 1665, +-3884, -3511, -5830, -8042, -8997, -6767, -8367, -241, 9160, 16871, 16076, 17989, 14683, 12279, 4106, -4833, +-11840, -8829, -1533, 9130, 14027, 10463, 4040, 311, 1494, 1588, -13420, -16130, -16431, -14952, -669, 249, +-483, 3177, -3458, -2362, -4370, -7559, -11113, -6961, -8428, -3221, 6014, 14704, 17773, 17553, 16290, 12828, +7413, -2938, -9594, -12925, -2941, 4674, 14410, 8886, 6918, 3324, 262, 3750, -9468, -15767, -14795, -15924, +-6795, 3101, -1048, 949, -107, -3248, -1957, -7724, -11215, -8210, -7785, -4710, 3634, 10740, 16836, 18849, +15050, 14667, 10850, -1390, -9523, -14111, -3753, 593, 12212, 8867, 8345, 5946, 3100, 2992, -5179, -14375, +-15927, -14297, -11864, 1367, 1088, -464, 1534, -2197, -763, -6162, -11530, -11441, -8164, -3250, 188, 7534, +15233, 19552, 16376, 15620, 11498, 1724, -8398, -13246, -7495, 651, 6969, 10512, 7263, 7447, 5660, 2667, +-981, -13180, -14635, -14068, -12188, -5275, 4111, -2237, -304, -90, -589, -2687, -10758, -12198, -8908, -4126, +-85, 5577, 10401, 18393, 19114, 15775, 11830, 4330, -6003, -12686, -9576, 306, 3692, 10507, 7696, 8791, +7065, 6314, 55, -9162, -14738, -13575, -9682, -8799, 1070, -1802, -565, 35, 27, -1804, -9106, -14238, +-8469, -5211, -2120, 5324, 8193, 13997, 18989, 17151, 14107, 5631, -4814, -12804, -10055, -1191, 907, 6319, +9608, 7452, 7242, 7287, 3101, -7638, -12660, -13648, -8549, -9829, -2773, -805, -975, -793, 564, -604, +-7652, -12638, -9352, -4257, -1921, 3874, 5280, 12275, 16158, 18013, 15580, 6686, -3351, -12008, -8433, -3099, +35, 1916, 9970, 8936, 6328, 8072, 5573, -3561, -12654, -14519, -6508, -6646, -5736, -4059, -1014, 677, +424, 157, -7887, -10747, -9729, -4119, -2878, 3565, 5354, 8139, 13910, 16659, 17288, 7540, -2189, -9139, +-9372, -2483, -2660, -154, 8103, 9378, 6328, 6843, 7873, 777, -10565, -13871, -6258, -3925, -7621, -5205, +-3677, 2605, -922, -374, -6193, -10377, -10108, -4531, -1009, 966, 8257, 3763, 10908, 15495, 19266, 8791, +-2954, -5309, -8675, -2611, -4374, -2385, 6200, 11927, 6057, 4206, 7456, 5126, -6567, -14215, -6124, -3658, +-5020, -6045, -6453, 435, 2887, -2347, -5586, -10285, -9216, -4851, -84, -2076, 6211, 5387, 6396, 12778, +16324, 11784, -1338, -5686, -6225, -3981, -2825, -5267, 3328, 9787, 9267, 2977, 6554, 6428, -1212, -12023, +-6168, -3146, -5609, -4245, -6428, -3317, 4732, -1797, -6382, -7480, -8780, -3496, -2143, 50, 4174, 7807, +2437, 9395, 12728, 14584, 1606, -5917, -4143, -4325, -3697, -5494, 697, 7025, 9535, 4800, 3952, 6837, +2507, -8035, -6019, -2706, -5490, -3730, -4945, -4925, 2455, -810, -7016, -6468, -7509, -4087, -1000, -1442, +2987, 9027, 2521, 3566, 11359, 11572, 5533, -4019, -5335, -2865, -3988, -3626, -2984, 4872, 7693, 8266, +3245, 4759, 4591, -1716, -4637, -2299, -6704, -2623, -2022, -5616, -1705, 1791, -7422, -8813, -5357, -6094, +-548, -355, 1613, 7065, 5195, -183, 7976, 9586, 7433, -708, -6648, -788, -3038, -3545, -3677, 1118, +6433, 9579, 5066, 835, 5617, 2823, -2876, -3728, -6065, -3001, 648, -3565, -4597, 1301, -3400, -9236, +-6628, -4742, -1767, 79, 314, 6493, 6028, 1006, 1786, 8868, 8567, 2786, -5980, -2664, -3085, -3823, +-3639, -1417, 2417, 10372, 9106, -1096, 3507, 7472, 6, -3510, -5781, -4399, 2385, 70, -6293, -1629, +-318, -6973, -8803, -4616, -2003, 161, -1899, 4863, 5149, 2552, -3151, 6921, 8519, 6038, -3500, -5897, +-1666, -3623, -4317, -2671, -2730, 8287, 13157, 1584, 384, 8171, 2216, -1557, -8283, -4959, 2322, 2386, +-5997, -3895, 1784, -3114, -9545, -6200, -297, -154, -1767, 2945, 5600, 1902, -2189, 2511, 9404, 7674, +-204, -7108, -4097, -815, -5117, -2766, -5062, 3788, 15061, 4923, -606, 6401, 5250, 399, -6957, -7036, +2723, 4617, -4287, -5155, 515, 1480, -7224, -8852, -1406, 37, -869, -962, 5749, 1899, -2046, 478, +7293, 8476, 2289, -7384, -5447, -1595, -4678, -4836, -5520, -671, 15689, 9567, 2068, 4850, 6202, 483, +-4662, -8082, 3255, 4845, -1634, -5142, 50, 1834, -2494, -10285, -3153, -1002, -2377, -2362, 3525, 2606, +-4002, 464, 5106, 10574, 3400, -3925, -6226, -2388, -4127, -5435, -5189, -4611, 10954, 13836, 5292, 2604, +3884, 873, -2159, -9489, 238, 4883, 526, -2702, -637, 2091, 1106, -6221, -6356, -569, -2960, -2038, +1951, 3095, -4538, 44, 3733, 8501, 4621, -2159, -4457, -5439, -5207, -7887, -3721, -6595, 5799, 15624, +10346, 3927, 2107, 779, -60, -7540, -1118, 4848, 826, 303, 1427, 1538, 985, -759, -7756, -3017, +-3629, -3622, 1452, 2126, -3550, -1327, 4465, 6700, 5916, -1723, -1646, -5857, -7114, -9527, -3202, -6822, +505, 14578, 15649, 4884, -674, -1201, -384, -4875, -3976, 3051, 2339, 936, 4155, 3783, 845, 716, +-3375, -6404, -2726, -6933, 758, 1990, -1441, -4552, 3798, 7122, 5216, 2353, -3008, -4475, -8796, -9860, +-5635, -5945, -4385, 12529, 18782, 9332, -519, -2824, -1266, -1601, -4685, 895, 2324, 1041, 5440, 5387, +2353, 680, 348, -8925, -4845, -6441, -86, 1592, -2451, -3268, 1515, 7650, 4501, 3749, -980, -2274, +-10335, -12301, -6212, -5242, -5105, 7723, 18573, 13745, 1877, -5597, -2948, -230, -1577, -1183, -260, 2789, +6518, 5280, 6685, 61, 859, -6445, -7107, -4421, -2020, 1962, -1563, -4077, 1857, 4180, 4896, 3350, +1998, -1208, -10886, -13337, -8014, -5392, -5777, 3777, 15304, 18227, 4237, -5282, -5228, -2466, 613, -1237, +-2362, 1704, 7235, 7032, 7388, 2353, 595, -3018, -9707, -3799, -2445, 1162, 525, -3516, 1393, 2887, +4378, 922, 3210, 498, -8800, -14747, -11451, -5222, -5169, 2933, 10686, 18742, 8388, -4007, -6215, -3409, +379, 578, -2852, 762, 6828, 7659, 8343, 5801, 142, -2259, -11033, -5290, -572, -1000, 1162, -379, +1043, 1307, 2803, 477, 3152, 2754, -7022, -15505, -12842, -5541, -5497, 3135, 8740, 15243, 11854, -1753, +-6443, -5754, 79, -26, -1685, -1525, 8704, 7364, 9102, 8446, 1344, -2334, -8470, -7538, -161, -1246, +899, 1577, 1984, 566, 715, 614, 1256, 4521, -5557, -14781, -14739, -8168, -5126, 1579, 8755, 12658, +11659, 1194, -5683, -6642, -2177, -1086, -219, -2852, 7548, 8925, 7239, 9502, 4161, -2604, -6620, -10346, +-195, -579, -240, 4050, 2566, 1671, -658, -865, -611, 4375, -1908, -13302, -16528, -10670, -5223, 3430, +7802, 10415, 10185, 3724, -2928, -7471, -4714, -1214, -837, -958, 5353, 10185, 7725, 10240, 6948, -1185, +-5780, -11275, -1034, 1359, -1316, 4466, 4240, 3500, -689, -2760, -1065, 3682, 476, -11636, -16060, -13754, +-8014, 3801, 8954, 9627, 9116, 2924, -1787, -4244, -7880, -3450, -1612, -1029, 4097, 9513, 8195, 9052, +10089, -69, -4199, -9502, -6356, 2509, -1804, 3739, 6890, 5372, -637, -3220, -2122, 1810, 2008, -9199, +-15168, -15328, -12833, 2475, 9033, 11780, 7710, 4429, -1305, -2556, -6795, -6239, -1731, -611, 2999, 7711, +9664, 8731, 9870, 2978, -4019, -7540, -9551, -95, 125, 2934, 8127, 7233, 1545, -2784, -2401, -381, +3920, -6234, -14276, -16003, -14815, -2397, 10125, 11598, 8137, 5418, -1625, -3123, -6261, -7713, -1562, -2190, +1493, 5219, 12358, 8166, 10549, 3905, -1320, -6799, -9794, -5051, 1797, 1571, 6370, 8530, 4318, -187, +-3185, -2091, 4539, -3477, -13421, -15954, -17451, -6879, 7635, 12628, 10173, 5452, 1145, -3536, -4607, -8672, +-3584, -1699, 1059, 2686, 11040, 11435, 11199, 5646, 651, -4518, -9666, -7327, 316, 845, 6309, 8824, +4589, 2945, -2561, -2296, 1394, 1422, -12447, -15798, -17543, -10718, 4122, 10168, 11183, 8433, 4936, -3880, +-4775, -8871, -7228, 89, -332, -122, 7019, 14032, 11728, 7197, 942, -3067, -7810, -10493, -2973, 3049, +2586, 9921, 5651, 4437, 359, -1285, -1016, 3445, -6954, -16989, -14819, -14074, 747, 6184, 9872, 9856, +7364, -2125, -5384, -8585, -9159, -1680, 112, -730, 3454, 12761, 13880, 9667, 2551, -2206, -4518, -9998, +-6879, 3125, 1379, 5199, 9847, 6528, 376, -938, 1194, 2589, -2648, -15111, -16605, -13812, -3298, 4036, +6841, 10375, 11227, 983, -5924, -7835, -9753, -5059, 313, 102, 65, 9173, 13838, 13203, 4155, -898, +-4825, -7276, -9199, -1461, 4409, 598, 9654, 8123, 2184, -1563, 2494, 2315, 565, -11210, -16438, -14177, +-6775, 2542, 2532, 10418, 12770, 3336, -5131, -5910, -9706, -8175, -976, 1214, 113, 5078, 11692, 14902, +8522, -258, -5624, -6091, -7842, -5905, 5173, 481, 5168, 11460, 4936, -1266, 1293, 4518, 2343, -7403, +-16043, -13329, -9742, -2351, 749, 7570, 13738, 5809, -4589, -4683, -6953, -10365, -4475, 1865, 1654, 1867, +7404, 15629, 13124, 1514, -4909, -6612, -4754, -7989, 578, 1079, 2168, 10403, 7753, -299, 1636, 5059, +3453, -3206, -13357, -13896, -9318, -5251, -1203, 5931, 13134, 8140, -3083, -4375, -4623, -9255, -8399, 337, +2882, 2228, 4753, 11080, 16193, 5049, -3799, -7142, -5704, -5114, -4330, 2028, 167, 7229, 10899, 2812, +199, 4475, 5754, 1225, -10599, -14638, -9381, -7863, -3459, 2643, 10350, 7979, -743, -4284, -4011, -5570, +-9362, -1903, 1712, 4190, 2043, 7496, 16240, 8190, -2251, -6295, -7056, -4274, -4176, -1045, -957, 5439, +10033, 5314, -102, 1897, 8569, 3249, -5281, -14075, -9286, -5988, -4092, 12, 7307, 8605, 1527, -4318, +-4229, -3663, -9009, -4649, 287, 3899, 1561, 5115, 14471, 9416, -628, -4703, -6581, -4825, -3774, -2197, +-1269, 4174, 9974, 4395, 2340, 1508, 6065, 6415, -365, -12508, -10614, -4855, -2715, -2255, 6095, 5543, +1676, -1813, -3910, -5300, -6218, -5287, 314, 3059, 2117, 2809, 11605, 11960, 566, -4597, -5977, -7089, +-4238, -2614, -568, 1127, 9295, 5901, 49, 4363, 3745, 7034, 892, -7247, -11709, -4426, -2188, -1397, +3919, 6183, 199, -1291, -2440, -4821, -8067, -5663, 108, 3391, 3077, 1079, 9712, 11519, 1983, -3127, +-6344, -9451, -5861, -2514, -757, 985, 5263, 9026, 2550, 2473, 4136, 8849, 1443, -4569, -9501, -6676, +-1356, 84, 1014, 6392, -330, -1966, -1380, -3648, -7102, -8476, -2214, 4979, 4151, 835, 6396, 11298, +4935, -2240, -5114, -9684, -10033, -229, -2463, 1590, 3598, 7923, 5825, 671, 4550, 8566, 4896, -4738, +-7654, -6191, -1276, 376, 948, 5765, 2196, -3617, -1094, -4102, -4758, -7837, -4969, 2814, 5725, 3273, +3818, 10360, 5755, -1624, -3328, -8585, -14594, -4053, 550, 818, 3098, 4613, 6997, 3486, 704, 6986, +8044, -4601, -7997, -3012, -2755, 929, 2043, 1927, 5025, -4095, -83, -3997, -5146, -6226, -5818, -549, +4470, 3721, 5082, 8703, 6113, -1091, -2827, -6610, -15363, -9469, 1521, 84, 3928, 3822, 7137, 5704, +1678, 4625, 8341, -580, -9722, -2412, 62, 102, 3181, 942, 6396, -2479, -996, -2844, -6071, -6639, +-5131, -2754, 1154, 4683, 5367, 8548, 6092, 962, -3652, -4166, -12020, -14121, -2408, 755, 4552, 4598, +6411, 7409, 4998, 3166, 6123, 1927, -7509, -6144, 1128, -168, 2974, 2611, 2634, 1253, -1835, 840, +-6618, -7201, -5693, -2555, -468, 4070, 3639, 8283, 6549, 3881, -2814, -6236, -9024, -15373, -7355, -944, +2786, 5825, 7453, 4930, 6541, 3975, 4814, 2896, -4344, -9487, 1292, 2246, 2716, 2634, 448, 2373, +-1130, 2077, -4584, -7019, -6302, -2780, -1610, 1606, 4635, 6877, 6003, 4182, 74, -6278, -7393, -14273, +-11980, -3583, 2977, 4409, 8210, 5605, 5892, 6841, 4472, 1349, -2807, -6603, -3734, 3510, 1138, 6594, +393, 967, -129, 1417, 1012, -7354, -9078, -3181, 448, -937, 3976, 6881, 5735, 2980, 2517, -3172, +-7656, -12708, -12221, -9152, 2260, 3938, 7511, 8310, 6002, 8010, 4239, 2686, -3298, -4143, -5772, 1836, +1450, 6252, 4027, -1453, -541, 1050, 4422, -3023, -9896, -5964, -286, 1630, 529, 6866, 4258, 1639, +1084, -265, -6177, -12309, -12974, -13867, -1223, 4399, 6823, 7748, 7129, 6899, 7287, 2357, -2778, -3542, +-3203, -3132, 2621, 5828, 6082, -652, -4313, 3360, 4160, 1605, -8157, -11300, -80, 3124, -1884, 5645, +5532, 1238, -452, 532, -2397, -10069, -12154, -13574, -8486, 5318, 8215, 6517, 8884, 6096, 8908, 4136, +-1581, -3458, -3316, -1390, -2265, 6387, 5488, 2315, -6289, 732, 4838, 4203, -2988, -12313, -2616, 3748, +2342, 1029, 6018, 401, 68, -566, -515, -7714, -11175, -13168, -14403, 1685, 8779, 7596, 4882, 8821, +7069, 6153, -1183, -3477, -3077, 749, -3103, 2851, 8026, 3808, -4261, -5326, 5769, 5233, 306, -7396, +-9049, 2128, 4141, 2135, 3294, -1485, -1617, 224, -1005, -5931, -10492, -11765, -12755, -5018, 6889, 10895, +5146, 8678, 7461, 5709, 884, -2420, -2660, -687, -1147, -173, 8997, 3888, -1960, -6162, 354, 8281, +2213, -4140, -9730, -2703, 4885, 5043, 3105, -1644, -3016, 337, -918, -5885, -7902, -10996, -10679, -9625, +2671, 12322, 8147, 5645, 9313, 4111, 3671, -2735, -1903, -1574, 1412, -1571, 6523, 6885, -2653, -3104, +-2819, 5587, 4079, -631, -6258, -6315, 3290, 5490, 6085, -2187, -4710, -3340, 195, -3912, -8157, -10093, +-12342, -7710, -2194, 9673, 11309, 3925, 10692, 7160, 410, -719, -3231, 176, 658, -354, 549, 10850, +-3613, -2611, -4097, 461, 5402, 1480, -1761, -6799, -2095, 5945, 10652, -604, -5334, -6433, -166, -844, +-5582, -9125, -13423, -7974, -3358, 5302, 11077, 7092, 6129, 12391, -2184, 1023, -3144, -505, 1268, -323, +-191, 6842, 2635, -5434, -2572, -3498, 3541, 4017, 2316, -4809, -7056, 3535, 12872, 3655, -6343, -7742, +-4878, 1809, -3813, -7255, -12102, -9459, -3046, 2260, 9600, 10675, 5846, 10490, 3631, -2412, 471, -2153, +1926, -123, 2216, 1726, 5274, -4717, -2073, -5161, -960, 5294, 2778, 565, -7652, -1069, 12126, 9841, +-4872, -8843, -8581, -710, -2022, -5069, -10977, -10464, -5233, -936, 9335, 9938, 8750, 6841, 6765, -3045, +-195, 468, 65, 1436, 1243, 1724, 3306, -15, -5145, -4426, -5066, 1807, 5693, 2978, -5315, -5127, +9081, 14902, -2030, -7643, -10337, -4011, -642, -3568, -8218, -11537, -6171, -1418, 5187, 9843, 10094, 8157, +6457, -883, -1465, 2004, 555, -172, 3022, 2488, 701, 590, -1705, -6609, -5490, -2301, 4635, 5669, +-3077, -6481, 3671, 15626, 4616, -6331, -12029, -5591, -2067, -1528, -5015, -11319, -7312, -1989, 2521, 9112, +10132, 9712, 6178, 420, -1694, 1062, 1128, -1755, 3439, 4680, 171, -2693, -336, -4938, -5194, -5562, +1160, 7360, 972, -6062, -575, 14063, 10791, -5519, -10027, -9531, -2667, -1499, -3520, -10374, -7981, -3554, +2626, 8394, 8886, 9289, 10468, 2436, -3206, 1569, 350, -80, 474, 7366, -341, -2788, -1489, -1212, +-6110, -7024, -1709, 4031, 4903, -4331, -2944, 9265, 14027, -701, -8522, -10054, -4680, -2775, -889, -8130, +-10054, -5662, 759, 5662, 8804, 6381, 13016, 5740, -3386, 900, 361, -168, -1034, 6765, 2944, -3280, +-3277, -2033, -2503, -7709, -5114, 1976, 4960, -22, -3828, 5473, 12531, 5630, -8324, -9167, -6948, -3221, +-1082, -3657, -8779, -7757, 278, 4103, 9406, 6600, 9684, 10157, -257, -1751, 3510, -690, -1269, 3464, +6798, -3260, -4346, -2720, -3149, -4143, -8234, -897, 3450, 2734, -3162, 2010, 11353, 7520, -2871, -10794, +-6770, -6183, -527, -855, -5541, -9561, -3292, 4431, 8397, 6385, 6373, 10989, 4050, -1571, 3002, 728, +-2357, 1435, 5755, 1046, -4877, -3850, -5415, -1285, -7642, -5556, 2308, 2921, -123, -757, 10026, 8037, +1322, -9711, -7045, -8126, -3061, 590, -3449, -8194, -6153, 2747, 6443, 7971, 5263, 10056, 5914, 1975, +-148, 4408, -1781, -724, 4370, 3329, -2476, -5560, -4993, -2677, -3520, -8191, -356, 730, 2141, -386, +5691, 9519, 2663, -5994, -7902, -6494, -6775, 1674, -1019, -4350, -7446, -456, 5236, 6795, 5156, 8055, +7299, 4603, -915, 4686, 2406, -4247, 4118, 3484, -230, -6702, -4184, -5107, -304, -7679, -4728, 1709, +352, 1668, 1955, 10487, 4145, -3340, -8901, -5205, -8079, -1438, 577, -1933, -5621, -2474, 4021, 5520, +5384, 7865, 7239, 5405, 1262, 1583, 7749, -4780, 2066, 3260, 1232, -5675, -6833, -4060, -2516, -2373, +-7875, -122, 122, 2411, 1360, 8702, 5767, -1976, -8212, -6598, -7270, -5076, 456, -1310, -1828, -3890, +1779, 5106, 4472, 5624, 6567, 6441, 3901, 476, 7223, -981, -1012, 6322, 15, -4788, -7129, -5689, +-3186, -1209, -6351, -4067, -351, 1500, 2072, 5720, 7943, -1295, -7160, -5425, -6438, -6751, -755, 320, +820, -2209, -279, 4879, 4951, 5038, 4560, 6384, 4868, 1908, 4332, 2934, 973, 4763, 992, -3040, +-8145, -6745, -1878, -3502, -4092, -3297, -697, 46, 1791, 5790, 7545, 1600, -7656, -7201, -5892, -7434, +-3941, 1440, 93, 1728, -2768, 3264, 7575, 3018, 4640, 4263, 7097, 3454, 4952, 1845, 4077, 1423, +3957, -1836, -9231, -8328, -3190, -4201, -4824, -2329, -1640, -1503, 259, 3495, 8420, 4048, -5874, -9697, +-6409, -5924, -4772, 781, 1054, 2630, -822, 1836, 6923, 3789, 2938, 3341, 6464, 4171, 4201, 3537, +2688, 3336, 2586, 1572, -6717, -10235, -3993, -3367, -3934, -2256, 612, -1944, -7, 2057, 6567, 6704, +-4070, -9620, -8735, -6806, -5037, -978, 1306, 2450, 1020, 522, 6174, 5824, 1521, 3898, 4279, 6139, +3872, 6700, 1077, 4310, 2179, 1251, -1862, -10103, -9315, -1500, -5125, -1836, 2204, -2383, -381, 2096, +4616, 5585, -846, -7947, -10735, -8399, -6092, -1036, 1669, 2517, 2553, 584, 3944, 6973, 1723, 3783, +5035, 4514, 2829, 9055, 3730, 1185, 3740, -68, 1049, -6299, -12553, -5688, -2456, -4414, 4424, -1617, +-3369, 2458, 1737, 5563, 1014, -6627, -10239, -10379, -7069, -1704, 3085, 847, 1453, 3122, 1592, 4951, +2280, 3192, 6211, 3801, 805, 8506, 9078, -1311, 2615, 667, 2537, -1692, -12149, -9561, -2440, -2454, +2548, 1799, -4468, 1675, 2004, 1572, 4568, -5226, -10221, -13389, -6882, -3337, 3105, 1099, 1743, 4190, +3942, 2216, 4655, 2912, 7171, 6735, 1292, 4288, 12492, 514, -748, 1368, -157, 3786, -9274, -13372, +-5500, 162, 1577, 2154, -3377, 200, 1130, -410, 4038, -1680, -10080, -12585, -9921, -3280, 1898, 2348, +-1424, 3783, 5265, 2416, 1790, 3137, 7621, 8043, 3530, 1993, 10910, 5277, -3976, -212, 764, 2833, +-2372, -14244, -7186, -937, 3646, 3205, -1325, -1510, 1951, -2885, 807, 3953, -10128, -12711, -12010, -4204, +696, 1981, -3515, 1494, 5148, 3608, -405, 2352, 8249, 10012, 7298, 3673, 7083, 7733, -1327, -3769, +288, 4075, 2208, -12663, -9489, -2322, 3976, 4759, -617, -2459, 691, -3660, -3166, 3821, -4543, -13193, +-12203, -6009, 1046, 2760, -1847, -588, 4754, 3269, 1758, -8, 5680, 12818, 9407, 5619, 4094, 6142, +1031, -3917, -1213, 1355, 5194, -7097, -11629, -3447, 3290, 8286, -956, -2429, -958, -3817, -3781, 526, +-1757, -10377, -12972, -8995, -1292, 3162, -1278, -4284, 1666, 2686, 4494, 325, 3372, 12367, 13366, 10968, +3541, 3685, 2625, -3085, -3542, -188, 3686, -968, -12308, -4718, 595, 8277, 3241, -3636, -566, -6236, +-4639, 429, -1390, -7323, -11692, -10519, -2110, 2338, 1259, -5653, -30, 890, 4256, 1915, 1038, 10028, +14979, 15677, 5073, 1607, 304, 246, -6378, -313, 3265, 1271, -7337, -6019, -690, 7793, 7526, -2856, +-2165, -8408, -6691, -2256, -62, -6331, -8287, -11058, -5355, 474, 818, -1719, -5058, -2373, 1815, 4572, +2296, 7496, 16290, 17461, 11848, 1524, -1755, 690, -3844, -2516, -733, 3561, -4322, -3922, -3152, 7088, +9642, -280, -2286, -7446, -9159, -4625, -1684, -3249, -5863, -9419, -7325, -1988, 1384, -585, -5856, -6362, +-1979, 4442, 5503, 4460, 16749, 18450, 16504, 4354, -2405, -1285, -1872, -5052, -2590, 1501, -1804, -1065, +-6297, 4457, 12139, 1681, -4065, -6027, -12025, -5568, -5015, -1684, -2749, -7156, -6751, -4428, 545, 2319, +-4224, -9882, -7155, 2483, 4802, 4281, 14066, 19926, 18504, 8088, -763, -2159, -548, -2761, -5727, 496, +873, 1102, -3555, 1404, 11263, 6841, -2030, -5447, -10934, -9249, -5843, -2979, 57, -7370, -8285, -4461, +-613, 1242, -3624, -8374, -10507, -2489, 4370, 5808, 13689, 22333, 17568, 12139, 1838, -1296, -1621, -2246, +-6976, -2087, 1307, 568, -2546, 555, 8693, 7897, 280, -6193, -9396, -10537, -8637, -2885, 3057, -1920, +-9367, -6099, 453, 498, -1389, -8243, -12435, -9033, 1971, 6060, 11758, 20928, 19128, 12285, 5365, 32, +-1035, -2015, -6063, -5844, 3614, 1321, 1428, -894, 8573, 8069, 2172, -4334, -9058, -11170, -12867, -6486, +2600, 2639, -7841, -10483, -541, 1558, -2351, -8181, -12883, -12279, -2012, 3827, 12201, 20820, 22417, 13527, +6790, 3686, 1178, -3124, -5271, -8820, 1669, 4880, 704, -1518, 5810, 9608, 2056, -623, -9982, -9535, +-13982, -8557, 2385, 5134, -2068, -10461, -3065, 1844, -797, -6591, -10617, -15411, -7622, 1054, 12047, 18462, +21597, 16033, 7759, 5774, 2993, -3336, -4429, -6739, -3397, 5830, 4143, 1319, 3966, 7942, 4287, -1374, +-7584, -10550, -13852, -11921, 1477, 5047, -25, -7908, -4986, -584, -1773, -4919, -9514, -15531, -13571, -1757, +9018, 17356, 20677, 16123, 9973, 8621, 4477, -2255, -5408, -5585, -5413, 3798, 6870, 3555, 4496, 7114, +3190, 287, -4048, -13531, -12783, -14267, -2139, 7856, 173, -4862, -4591, -1655, -2652, -4530, -8504, -12179, +-16298, -8031, 7287, 16527, 19974, 16765, 11372, 9474, 8302, -1912, -8135, -4601, -5313, -107, 7516, 4428, +8005, 7448, 2524, 2373, -1117, -13467, -13032, -13981, -6164, 9242, 2570, -3575, -3139, -981, -1248, -7404, +-7573, -9349, -16028, -14019, 2420, 14883, 17957, 17283, 13743, 9068, 12742, 1786, -9235, -5701, -1311, -3622, +8340, 4923, 6944, 11039, 2502, 2111, -2747, -9882, -17030, -13728, -10585, 4605, 6177, -2430, -626, -1892, +-520, -5658, -9276, -9105, -14405, -15630, -2386, 12008, 17637, 14389, 16159, 10060, 13171, 4888, -6254, -11443, +-2391, -2507, 4964, 8995, 5353, 12652, 5541, 2373, -1083, -8480, -16827, -13510, -13396, 779, 7492, 176, +52, -2548, -632, -2886, -10299, -10370, -10604, -18837, -5940, 6729, 15808, 15470, 14019, 12780, 13085, 10047, +-2737, -12172, -5796, -408, 3142, 10923, 5134, 11215, 9475, 5177, 732, -6656, -16884, -14896, -11854, -7139, +5658, 2218, 2430, -1099, -3447, -1719, -8432, -10340, -10633, -18753, -11612, 3988, 13289, 15464, 12098, 14961, +13072, 13235, 88, -8552, -11185, -1418, 1562, 10636, 7860, 9241, 11850, 6040, 4901, -5644, -14775, -18174, +-10588, -10735, 1107, 4864, 2923, 1504, -4485, -917, -5701, -10103, -10032, -16504, -15491, -686, 9367, 14512, +12446, 13410, 12184, 12265, 5328, -4127, -13161, -6365, 1542, 8664, 12043, 8843, 10579, 7337, 6729, -102, +-12473, -19245, -11364, -10613, -3396, 3826, 1674, 1973, -2397, -2316, -5461, -8522, -8756, -14205, -16676, -5888, +6070, 11670, 15447, 12975, 13028, 11428, 8779, -595, -9066, -10095, 46, 4862, 13294, 9853, 9347, 9514, +6094, 3452, -8917, -16566, -15199, -9312, -8611, 3307, 4250, 728, -1062, -2894, -3694, -7075, -8312, -9851, +-16294, -10880, 1642, 9383, 13607, 13525, 12125, 9991, 9725, 2480, -4777, -13409, -1534, 3661, 10337, 12354, +9007, 12179, 5067, 4892, -2905, -13820, -16315, -9775, -9594, 496, 5549, 749, -3146, -3883, -2881, -6745, +-7850, -9056, -14512, -14226, -2953, 6915, 12804, 12653, 10548, 10404, 10259, 3770, -1849, -9640, -5888, 4995, +7509, 12219, 10263, 12880, 7555, 4926, 173, -10365, -14544, -11341, -8362, -4747, 5735, 1624, -3361, -7591, +-3760, -5400, -7800, -7360, -11753, -14007, -8852, 5538, 11375, 12752, 8981, 9920, 11741, 5088, -907, -5282, +-7603, 2354, 7451, 8995, 10398, 11419, 12381, 2805, 2736, -9052, -11264, -11840, -7132, -6189, 4927, 4375, +-1734, -7759, -7127, -5387, -5009, -6850, -9565, -12786, -12504, 895, 10398, 11749, 7927, 7628, 10663, 5691, +1181, -3312, -5649, -1149, 7330, 8724, 11959, 6594, 14133, 5182, 4451, -6683, -12101, -8753, -7735, -4892, +574, 6956, -2849, -6720, -9028, -7430, -8165, -5364, -7884, -10427, -11314, -5818, 8354, 14473, 10080, 5944, +8742, 6315, 2718, -1766, -3967, -4030, 5820, 9138, 10655, 6496, 12035, 11248, 3555, -2795, -11849, -8602, +-5174, -2616, -2062, 6158, 326, -5568, -10017, -8664, -10871, -7747, -7035, -7699, -11756, -8820, 4710, 12117, +11969, 6046, 7724, 4800, 3253, 757, -665, -3411, 3075, 8821, 10236, 9610, 6431, 13196, 5846, 234, +-11618, -10517, -4783, -803, -723, 4007, 2057, -3966, -10010, -9792, -12756, -11291, -7774, -8004, -9047, -8276, +879, 9286, 11518, 9523, 8047, 3933, -960, 1990, 2133, -2536, 907, 9375, 8913, 11203, 5578, 10641, +9603, 1264, -6546, -14049, -6324, 1998, 2461, 1830, 3197, -1486, -8432, -9208, -11240, -15263, -10682, -8554, +-8920, -6856, -1937, 7738, 9826, 11456, 9303, 6042, -2802, -883, 2858, -288, -1603, 9143, 8435, 10183, +7611, 7643, 11106, 2978, -3091, -11616, -9673, -725, 6481, 3284, 3028, -2986, -6853, -7835, -7627, -17133, +-16993, -10351, -8585, -8044, -3173, 5825, 10181, 9895, 11460, 8404, -792, -1479, 1521, 1688, -1257, 4641, +13540, 7880, 6144, 8721, 8976, 5174, -2115, -8416, -12083, -2051, 5063, 7238, 4620, -1684, -6954, -8110, +-4630, -13476, -20694, -15056, -10270, -8183, -3807, 2104, 7665, 9913, 13114, 9212, 385, -2492, 1899, 2198, +-636, 326, 13634, 11881, 4956, 9412, 8939, 6619, -283, -6100, -11991, -5053, 4127, 8639, 6251, 713, +-8309, -8813, -4724, -10044, -19725, -19128, -14250, -8649, -3918, -1487, 7836, 9816, 13094, 10516, 6266, -4070, +549, 3396, 1779, -1786, 7402, 13525, 10110, 5412, 10405, 6797, 230, -4457, -8393, -7756, 1179, 10055, +8357, 3920, -6993, -8693, -5674, -5211, -18384, -20003, -17215, -12890, -5314, -3163, 2095, 8995, 12456, 11723, +7215, -1178, 89, 2308, 2934, -986, 5384, 8869, 12658, 7603, 9488, 8168, 2784, -5911, -3605, -7729, +-4138, 9433, 10803, 4775, -4088, -8311, -8059, -5270, -13072, -20204, -19080, -14748, -8156, -2722, -1097, 7388, +9283, 13526, 7961, 1695, -260, 1198, 3435, 2126, 4665, 5466, 9275, 9897, 12054, 7975, 5005, -2379, +-5915, -4766, -3385, 4384, 12116, 7132, -1768, -8033, -8276, -7026, -11156, -16080, -21612, -18348, -9591, -3862, +-2051, 3624, 8503, 12232, 11257, 3132, -1377, 2722, 2204, 3471, 3434, 5200, 5961, 8441, 11566, 12025, +4374, 742, -4056, -6092, -3506, 3282, 12337, 8556, -669, -4953, -7181, -7209, -11237, -15449, -20248, -19543, +-13409, -6252, -4113, 2043, 6721, 8569, 12788, 6075, 146, 1123, 4569, 3626, 4640, 3062, 4912, 8127, +10798, 11567, 8329, 1500, 64, -5612, -4434, 62, 12647, 9836, 1141, -4312, -5141, -4824, -10575, -16184, +-18307, -18863, -16147, -8286, -5475, 496, 6444, 5282, 10139, 8485, 3101, -292, 3017, 5213, 5966, 4295, +1431, 4457, 11949, 10613, 7758, 4577, 2024, -1021, -5895, -2650, 9640, 14334, 2416, -4759, -6249, -4388, +-8401, -16891, -19047, -18690, -17209, -9046, -7871, -1390, 4423, 6387, 5291, 9217, 5047, 151, 1135, 5426, +8456, 6328, 3458, -354, 10400, 13397, 8675, 3491, 4002, 1724, -3786, -726, 3028, 12861, 9153, -3573, +-7056, -5882, -5112, -14785, -19157, -20046, -19269, -10306, -5407, -4214, 2109, 6468, 5664, 6302, 7079, 1605, +-481, 3103, 9747, 7544, 3526, -1020, 3335, 14844, 10991, 3070, 3652, 4554, -1212, -554, 2649, 9186, +11428, 711, -7418, -5596, -5226, -11675, -18576, -20713, -20968, -12678, -5847, -3844, -1334, 3539, 6525, 4256, +7404, 3180, 1073, 507, 7938, 10481, 6098, -453, -366, 13137, 14715, 5077, 2377, 5389, 2247, -122, +4345, 6576, 9535, 4863, -5423, -8078, -6057, -9319, -17895, -20953, -22982, -15649, -7871, -2391, -1174, 1975, +4486, 3788, 6284, 4943, 2276, -395, 4271, 10555, 10413, 2267, -3332, 7516, 15935, 8425, 1693, 6150, +4187, 1830, 2388, 9944, 5406, 7124, -2126, -9241, -5299, -8321, -16559, -21083, -21765, -18617, -10740, -4165, +1074, 2102, 3714, 2216, 4859, 6963, 2746, 1238, 1151, 8118, 10311, 7400, -2361, 2463, 13792, 12736, +2707, 4101, 7811, 3922, 2766, 9658, 6161, 5454, 2085, -7835, -7396, -6404, -15027, -19591, -22321, -21930, +-13594, -7826, 2730, 522, 2846, 1329, 1225, 7451, 4530, 3605, -411, 6371, 7559, 7662, 2551, -1203, +8290, 12992, 7456, 2849, 6795, 6727, 4730, 6319, 7745, 4999, 3181, -6157, -6998, -6193, -13460, -19606, +-19788, -24147, -15531, -10299, 1089, 3377, 1821, 972, -206, 4850, 7391, 5119, 1179, 5120, 8490, 7734, +5024, 501, 3319, 11492, 8842, 5880, 4802, 7109, 7792, 7200, 7735, 5243, 3496, -3457, -8475, -5890, +-11176, -19635, -20439, -22644, -17774, -12053, -3304, 3416, 1971, 2313, -403, 2466, 4950, 8272, 1482, 4613, +8202, 7142, 4826, 1770, 2165, 8826, 7897, 6168, 6240, 5881, 7517, 10006, 7274, 5723, 4256, -1973, +-7495, -6668, -7837, -17026, -21831, -24069, -18808, -12870, -5507, 560, 2901, 2416, 1077, 1150, 3473, 4461, +4748, 4214, 7727, 7584, 6385, 4290, -118, 7361, 9536, 6619, 8088, 5412, 6686, 10949, 9970, 7695, +4126, 561, -7333, -6314, -6355, -12218, -23814, -24247, -21196, -14547, -4965, -3898, 1937, 2009, 2207, 995, +2726, 3185, 4313, 4712, 6751, 8401, 5617, 5382, 558, 4749, 8789, 7572, 7950, 7034, 4146, 9982, +11787, 10415, 5043, 566, -5061, -6939, -6869, -10102, -19424, -26949, -22698, -16525, -6818, -4233, -154, 1911, +786, 1509, 3949, 2397, 2489, 5783, 4239, 9478, 7318, 6085, 1423, 3088, 7167, 9610, 6440, 9244, +4097, 6666, 13322, 10876, 6614, 1960, -2203, -8414, -6206, -8816, -14719, -25672, -25782, -19138, -10637, -2182, +-2713, 1577, -1937, 1777, 4075, 2558, 2063, 2739, 6174, 8176, 10172, 3820, 3823, 3230, 4882, 9274, +7026, 9788, 6865, 3026, 12320, 11049, 9721, 4290, -2585, -6281, -6629, -8520, -12853, -20340, -28419, -22836, +-13705, -3217, -3289, 206, -1805, -1462, 6210, 2397, 3670, -1084, 7267, 7031, 11816, 3442, 5974, 3876, +5935, 6594, 10153, 7042, 9761, 3894, 6885, 14549, 9207, 7568, -1088, -1518, -7299, -5741, -15003, -17089, +-25386, -25313, -16440, -7521, -3146, -162, -1002, -4089, 3614, 4979, 3232, 820, 2649, 4904, 14170, 5818, +2561, 5663, 5538, 6706, 8537, 8731, 6459, 8107, 3719, 11937, 10041, 7078, 2187, -1625, -5231, -6390, +-9996, -18101, -21893, -26527, -18539, -10039, -6481, -341, 69, -3309, -818, 6705, 3522, 2523, 1193, 5045, +9252, 12001, 438, 5294, 6793, 7899, 10037, 8740, 7259, 7627, 5207, 7245, 13392, 5856, 4216, -308, +-3124, -6809, -4009, -18231, -21169, -25607, -21188, -13031, -8796, -2411, 1057, -2763, -2470, 4084, 5263, 3724, +1361, 4479, 5328, 13211, 4116, 3226, 5704, 6899, 10716, 9855, 8814, 4741, 9043, 3302, 13119, 9225, +1198, 1440, -1530, -5658, -3394, -12931, -23032, -23963, -23890, -14800, -10419, -6720, -1070, -2107, -2650, -115, +6148, 4002, 4239, 3283, 5732, 10840, 6278, 4681, 5406, 6414, 10192, 12165, 9396, 3435, 9473, 6221, +7761, 11484, 1550, 1694, -870, -4184, -5529, -7577, -19896, -24368, -25228, -17495, -11511, -8748, -2936, -2029, +-2644, -69, 3472, 3380, 5192, 5912, 2920, 7907, 8355, 5372, 6370, 4623, 8833, 12182, 12051, 4397, +5992, 10744, 6497, 9876, 4562, 1538, 1728, -4238, -3387, -5961, -13249, -22345, -24911, -20636, -13932, -9914, +-5853, -1651, -2962, 93, 1911, 1174, 5302, 8184, 3255, 4775, 7888, 8218, 5943, 3867, 8460, 13061, +12038, 7803, 4141, 8976, 9843, 5693, 6018, 1681, 2436, -2316, -4000, -5299, -8756, -18704, -24436, -22352, +-17647, -12985, -6940, -3013, -2635, -2403, 2066, -166, 3498, 9400, 4297, 4036, 4820, 9375, 8728, 2145, +7575, 12344, 11995, 10025, 5198, 6075, 11946, 6288, 4835, 2637, 265, 492, -3331, -6639, -6386, -14926, +-21557, -21433, -21728, -17352, -8751, -3704, -2574, -2679, -1160, 1171, 1741, 10430, 7097, 4347, 3595, 6614, +10574, 5142, 4501, 12030, 12368, 11262, 8088, 3414, 11338, 8949, 3975, 3985, -115, -674, 137, -5221, +-8040, -11563, -15052, -21972, -21210, -22621, -13203, -3619, -1887, -1986, -2628, -1533, 1550, 10631, 8792, 3719, +3254, 4957, 10730, 9368, 2591, 8762, 12122, 12115, 10909, 4049, 7819, 12277, 4083, 3668, 4035, -4127, +446, -2988, -7053, -10760, -11235, -19562, -23217, -22988, -18329, -6954, -3890, -478, -3203, -4108, 225, 8031, +12894, 5920, 3889, 1403, 9338, 12141, 6327, 4504, 9931, 14058, 12809, 7612, 5349, 9497, 7767, 2775, +7514, -4221, -2403, 124, -5640, -10443, -10695, -15626, -23402, -24351, -22271, -11712, -5866, -1814, -755, -6033, +-2310, 4468, 13872, 7827, 5239, 1186, 4854, 14632, 10356, 4659, 6390, 12856, 15872, 10655, 4533, 6832, +8326, 4550, 6013, 1201, -4177, -865, -3153, -8043, -9335, -10786, -21775, -26711, -23229, -14415, -8048, -4387, +-618, -4533, -5941, 5101, 8466, 11282, 6594, 2553, 1185, 11936, 13894, 8708, 4394, 10196, 16349, 14192, +7323, 4613, 6419, 7250, 4998, 3336, -1002, -2945, -2117, -6569, -5854, -8770, -19152, -29327, -24998, -16458, +-9341, -7855, -3260, -2860, -5638, 1622, 5846, 9493, 8096, 4749, -1535, 7454, 15176, 10452, 4447, 8015, +14560, 16240, 11102, 3071, 5737, 6074, 7250, 3258, 1043, -1402, -2173, -6012, -5282, -5766, -16741, -27813, +-28251, -19424, -10643, -6963, -6515, -4506, -2366, 602, 4398, 6799, 9401, 6662, 682, 4762, 12669, 13133, +6426, 7889, 13101, 14344, 13397, 3744, 6850, 3556, 7700, 5725, 2004, 1382, -810, -4209, -4025, -4198, +-14268, -24916, -31690, -22650, -12877, -6996, -7040, -7491, -2923, 404, 5040, 2873, 9172, 5091, 4492, 884, +11680, 12722, 9989, 7609, 12405, 14775, 12194, 8477, 5193, 4242, 4232, 8971, 2979, 2159, 383, -1431, +-3366, -3779, -11868, -22441, -30648, -27056, -14349, -9599, -6712, -8166, -6799, 781, 3817, 2111, 7089, 5824, +2863, 2083, 9671, 11576, 11176, 10265, 10700, 15504, 12441, 7771, 6144, 5468, 1045, 10207, 5126, 3077, +1428, -1135, 1356, -4869, -11314, -19831, -26937, -31259, -19814, -10078, -7611, -7139, -7076, -2829, 3530, 2624, +4390, 4245, 1702, 4095, 8533, 10752, 11547, 11930, 11839, 14651, 14273, 8149, 6899, 6719, -1768, 8079, +9710, 4809, 4095, -496, 4562, -3081, -10600, -17441, -25273, -30448, -24932, -12447, -8127, -6032, -6763, -4960, +2722, 1568, 1807, 3885, 754, 1145, 8294, 10980, 10880, 12158, 14821, 14538, 15360, 8866, 6667, 6522, +-1806, 2614, 12649, 6019, 4793, 2343, 3545, 2548, -9396, -17225, -22512, -28724, -29243, -18343, -7739, -6399, +-6862, -7452, 849, 2324, -364, 1787, -897, 922, 5248, 10917, 9899, 13527, 14164, 15144, 15941, 10844, +6753, 8261, -1423, -1067, 11177, 9299, 7247, 4994, 4467, 4514, -6273, -15229, -19981, -26926, -31075, -22534, +-10100, -5687, -5814, -6967, -1225, 2391, -2092, -718, -163, 900, 2261, 8888, 11598, 13130, 14020, 16491, +17696, 13255, 8118, 7926, 1704, -4717, 6937, 11957, 7412, 6491, 5546, 3759, -1807, -13467, -18758, -22182, +-31099, -27220, -15376, -3928, -5286, -7854, -2463, 1810, -2252, -3198, -561, -575, 2723, 5592, 10825, 13714, +14301, 16850, 17068, 15795, 9569, 7516, 4114, -4490, 1355, 12916, 7642, 9193, 7059, 5067, -177, -10490, +-16755, -19363, -30461, -30124, -20191, -7195, -4736, -5740, -3758, -138, -1112, -5688, -1521, -892, 1044, 1795, +10464, 13154, 13463, 16045, 17531, 16454, 13067, 8053, 5983, -2775, -2933, 10294, 9736, 9809, 7907, 7695, +1683, -8157, -15798, -15079, -27216, -31723, -24675, -10631, -4368, -6014, -3463, -1160, -251, -6908, -5096, 183, +913, -692, 9076, 13647, 11957, 15130, 19036, 17370, 16188, 7633, 6867, 1524, -4732, 5086, 9478, 11526, +8735, 8679, 3541, -3786, -12338, -13094, -24118, -30003, -28549, -16703, -4170, -5039, -6147, -1597, 816, -6516, +-6995, -2415, 1138, -2162, 6483, 12342, 10529, 14816, 17844, 18572, 18137, 11911, 6139, 4225, -3219, 942, +6181, 12329, 8510, 8084, 5275, -433, -10333, -12348, -20120, -27349, -30770, -22248, -6953, -4942, -5383, -2517, +476, -5610, -5972, -4282, -826, -2972, 4631, 10900, 11358, 12251, 17419, 18998, 20182, 14228, 9409, 3893, +-744, -8, 1621, 9750, 10036, 8959, 8084, 1431, -6110, -10749, -16193, -24496, -29912, -26110, -13362, -5594, +-4986, -3865, 2018, -6264, -5625, -6109, -480, -4434, 1935, 9274, 11901, 9375, 14753, 19897, 21780, 17056, +11099, 5732, 1123, 46, -1654, 6935, 10668, 7522, 8030, 2600, -1831, -8077, -13759, -21045, -27595, -27134, +-18645, -9712, -4725, -3759, 902, -3318, -5939, -5387, -2713, -2665, -2255, 7294, 11814, 9042, 9897, 19319, +22887, 20641, 12745, 8833, 2066, 1607, -1075, 3123, 9062, 6542, 8147, 5953, -430, -4628, -11654, -18362, +-24307, -27102, -22747, -13134, -6632, -3207, -1616, -473, -6932, -4848, -5500, -2340, -3221, 3860, 10754, 9784, +7100, 16693, 24636, 21989, 16715, 8743, 3537, 1868, 361, 172, 6598, 6705, 5785, 8369, 947, -2626, +-8493, -15557, -21927, -25418, -24031, -16546, -11721, -3013, -1310, -248, -4097, -5682, -5786, -3929, -2652, 748, +8752, 9763, 5006, 13294, 23405, 24099, 20676, 11117, 4554, 2508, 2901, -1829, 4271, 4788, 3933, 7446, +5368, -3401, -3623, -12678, -19148, -23738, -22461, -18617, -16436, -6210, 1141, -1813, -1998, -6765, -7134, -2897, +-2857, -1687, 6532, 8721, 4975, 9875, 20792, 26496, 23905, 14441, 6460, 2293, 5064, 97, 831, 1952, +3018, 7360, 5888, -1564, -3605, -8038, -17039, -22720, -23520, -18142, -17446, -10881, -701, -568, -1942, -4419, +-8490, -4637, -3784, -2589, 5321, 7989, 4577, 7563, 16474, 24947, 26604, 17054, 8409, 3718, 3833, 2749, +-477, 1967, -813, 6680, 5490, 1285, -3127, -4656, -12861, -19653, -23609, -18750, -16627, -15001, -3517, 1636, +-1242, -4399, -5153, -5772, -4253, -4298, 1364, 7284, 6891, 5508, 12793, 21941, 28549, 21515, 11046, 3464, +3540, 4089, -251, 2075, -3134, 3662, 5308, 3794, -2633, -1617, -8680, -17992, -21986, -19117, -15580, -16273, +-9222, 541, -960, -4715, -5452, -4654, -5081, -4669, -1316, 4911, 7699, 5720, 9979, 17273, 27791, 25740, +15420, 4514, 3293, 5246, 1892, 1398, -1577, -1161, 5558, 4898, -8, -1792, -4402, -15759, -19329, -19770, +-15183, -14807, -11829, -3129, -171, -3489, -6440, -3014, -5679, -6319, -5001, 4098, 6831, 5159, 9208, 12900, +22916, 26784, 19250, 7761, 2100, 4131, 958, 1936, -229, -4103, 2285, 5048, 1591, -1315, -2024, -10556, +-18619, -16648, -15664, -12495, -13944, -5738, -652, -2488, -7026, -2674, -4582, -8024, -4869, 1335, 7868, 5872, +7950, 9618, 19317, 24307, 21947, 12595, 1548, 2837, 1150, 4398, 2459, -4429, -2585, 4578, 4043, -335, +-1946, -7332, -14475, -17463, -15449, -9546, -12665, -8587, -4176, -1708, -5195, -3968, -2858, -9933, -4961, -1178, +7951, 5828, 7444, 9700, 14266, 21271, 22599, 16211, 3134, 1618, 2081, 2338, 5935, -4839, -5809, 2619, +3656, 1447, -1994, -5035, -9939, -16266, -15125, -7709, -9819, -11533, -5735, -3918, -1724, -5858, -3138, -9271, +-7161, -3302, 6144, 8460, 5344, 12025, 8767, 17967, 21331, 20051, 5873, -966, 3322, 2309, 7575, -2730, +-7923, 677, 5226, 1899, -1815, -5115, -7437, -11024, -15243, -7613, -8491, -9973, -7250, -6918, -2592, -1947, +-6046, -8357, -10115, -3783, 4281, 9147, 2669, 9426, 10289, 13406, 17129, 20132, 10172, -687, 2460, 4024, +6871, 2500, -9896, -1684, 4075, 3663, -1198, -3910, -5997, -8013, -13134, -6790, -7050, -9783, -6793, -7352, +-4787, 556, -5801, -9134, -8420, -5871, 4365, 7594, 5222, 6783, 11910, 8576, 14185, 15571, 14472, 1203, +-579, 4752, 5752, 3777, -7213, -4970, 2255, 3847, 424, -3438, -6195, -5634, -9396, -6087, -5364, -9240, +-6779, -6197, -6042, -320, -4678, -10425, -7907, -7386, 2030, 7863, 4914, 5154, 11796, 7845, 9535, 13346, +12882, 4999, 32, 2935, 6439, 5258, -2982, -7103, 755, 2761, 2954, -2049, -6542, -4912, -4744, -5437, +-3870, -9254, -6094, -4060, -6355, -3876, -1222, -10467, -10372, -6435, -1913, 7814, 6630, 4148, 10231, 9484, +5382, 10544, 11317, 7192, 1534, 317, 7247, 6128, -565, -6725, -3476, 3389, 3510, 229, -7747, -4825, +-1978, -3724, -3870, -8606, -5999, -2416, -3231, -6457, -2119, -6601, -10735, -7879, -3903, 4996, 7623, 3326, +9177, 9839, 5686, 5698, 9804, 8979, 3220, -104, 4148, 6105, 1634, -5407, -5780, 259, 5262, 3032, +-6693, -6562, 1412, -1950, -3190, -7895, -6831, -908, -404, -7005, -4705, -3448, -9459, -9324, -5529, 2683, +7378, 1979, 7260, 9789, 6415, 962, 7732, 9346, 6664, 128, 671, 5830, 2899, -3575, -5998, -4893, +5028, 6425, -2417, -7937, 845, -352, -1685, -8557, -7740, -660, 1618, -5546, -6709, -1135, -5925, -10529, +-6789, 1465, 6234, 2236, 5423, 9511, 6579, 672, 4370, 9278, 8242, 2174, -1747, 3050, 5285, -2516, +-4882, -7231, 1567, 8645, 1083, -6259, -1314, 1847, -114, -7036, -8325, -1069, 2944, -3493, -7051, -2686, +-1297, -9404, -8581, -506, 4433, 3088, 1141, 9508, 6395, 1191, 1946, 7146, 8525, 4417, -3505, 779, +4077, -531, -5703, -7082, -2436, 10628, 4539, -1458, -2270, 2037, -301, -4870, -8659, -197, 2727, -1065, +-5968, -2823, -514, -5019, -10723, -2426, 2013, 1302, -553, 6726, 6668, 148, 1632, 5267, 9753, 4831, +-841, -1132, 3484, -987, -4438, -6212, -5727, 7393, 8582, 2503, -2366, -1093, -195, -2022, -9955, -2168, +2362, 253, -2624, -2935, -478, -897, -7751, -5508, 1417, 602, -753, 3765, 7039, -120, 1292, 4244, +7660, 5082, 437, -796, 437, -2241, -5673, -4563, -7223, 3603, 11421, 6149, 715, -1860, -1060, 65, +-7467, -3448, 2546, 569, -669, -395, -594, -958, -2776, -7286, -1354, -743, -2184, 2096, 5023, 676, +777, 4962, 6279, 5232, 292, 821, -645, -3453, -8006, -3106, -7095, -1012, 11547, 11358, 1994, -3386, +-3149, -714, -4424, -5232, 637, 1825, 505, 2305, 2112, -614, -1026, -3927, -4899, -710, -5053, 1081, +3621, 1726, -1447, 4248, 6973, 4232, 3250, -946, -672, -4601, -8689, -5120, -6067, -5082, 10206, 15348, +6050, -2391, -4451, -1419, -1592, -5158, -789, 1165, 603, 4152, 3793, 1094, -600, -876, -7506, -2973, +-4761, 379, 2415, -70, -919, 2653, 7689, 4031, 3425, 680, 204, -6690, -10551, -5970, -4956, -5629, +6144, 16150, 10731, 226, -6615, -3268, -125, -1700, -2354, -1093, 2335, 5245, 4259, 5359, -1099, -120, +-5966, -5494, -3098, -1485, 2441, 55, -2420, 2901, 4654, 4878, 2832, 2727, 471, -8227, -11198, -7866, +-5105, -6063, 2613, 13782, 15830, 2377, -5772, -5718, -2345, 694, -1797, -3049, 1330, 6279, 6126, 6415, +1402, -151, -3103, -8611, -2660, -1896, 1608, 1227, -2300, 2227, 3476, 4292, 685, 3476, 1574, -7196, +-13037, -10900, -5199, -5095, 2124, 9798, 17331, 6818, -4534, -6336, -3361, 456, 357, -3221, 526, 6305, +6924, 7777, 5115, -414, -2453, -10515, -4565, -170, -680, 1446, 410, 1430, 1731, 2881, 482, 2973, +3245, -6124, -14436, -12275, -5587, -5397, 2775, 8185, 14616, 10932, -2266, -6366, -5779, 136, -41, -1797, +-1646, 8455, 6952, 8825, 8097, 1064, -2431, -8336, -7190, 2, -1077, 1044, 1801, 2140, 773, 813, +589, 1214, 4617, -5337, -14510, -14524, -8139, -5114, 1529, 8622, 12546, 11523, 1087, -5682, -6641, -2170, +-1087, -220, -2854, 7539, 8893, 7202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 47, 55, 103, 166, 288, -88, 79, 123, -488, +196, 55, -102, -733, 588, 946, 695, 346, -1210, 627, 762, -328, 569, -782, 192, -1137, +-2754, -277, 284, -822, -399, -708, 1179, 694, -327, 1261, 574, -365, 585, 259, -411, 559, +-768, 520, -102, -758, -497, -792, -464, 18, 514, 428, 1902, 254, -108, -570, -1436, 307, +-970, 113, 330, -253, -30, -214, -744, 440, -70, 11, 104, -802, -546, -245, -437, 18, +1286, 1121, 987, 462, 1033, 396, 39, 1286, 294, -1290, -966, -1504, -772, -413, -370, 1490, +175, -325, -946, -942, -165, 614, -423, 535, 338, -1041, 340, -1824, 462, 1219, -753, -381, +287, 1230, 657, 235, -583, -1819, 427, 995, 1810, -534, 1020, 468, -2577, -444, 987, 390, +1286, -22, -1089, 1393, -20, 715, 1136, -900, -343, 3, 435, 1075, 629, -617, 1141, -372, +-1935, -1164, 512, -173, 1034, 1530, -321, -583, -1867, -16, 110, -1238, -79, -753, -1741, 757, +141, -1212, -1724, 2706, -638, 435, 742, -1869, 1578, -13, -147, 328, -1276, 975, 2936, -1409, +1784, 52, -773, 690, -699, 578, 181, 365, -631, 293, -805, 1460, -371, 800, 293, -2276, +895, -1427, 1055, -125, 131, 912, 199, -1973, 512, 69, -389, 931, -1637, -258, 1581, -1864, +134, -1324, -733, 2616, -1873, -1086, 1257, -99, -1996, 351, -646, 1714, 390, 821, 2009, -471, +1475, 2019, 317, 17, 483, -2318, 845, -949, -1229, -23, -2386, -900, 248, -215, 2872, 1670, +336, -307, -797, 466, -267, 1223, 1083, 825, -684, -893, -1469, -1166, 268, -80, 401, -1026, +-1123, 773, -105, 1436, 546, 1626, 1069, -243, -1945, -360, 98, -107, 510, -1936, -3181, -3253, +-1045, 2169, 1160, 1739, 2221, 320, -1024, 2289, 1311, 2388, 134, -69, -1228, -2901, -886, 220, +2343, 1411, 335, -842, -881, -863, 1273, 1097, -3898, -2388, 696, -689, -1401, -946, 859, 1514, +-409, 2017, 2140, -1854, 509, -98, -749, 1380, -1779, 966, 314, -2338, 1329, -773, -1555, 1287, +-1063, -1792, -1916, -1474, 3178, 1529, 45, -1005, 294, 2812, 3744, 2425, -136, 394, -684, -170, +1127, 369, -621, -1482, -1385, -1203, -3031, -1137, 738, 15, 119, -1269, -2208, 1251, 3176, -1456, +-383, -512, 570, -1205, -915, 1383, 1710, 1978, 2270, 2759, -229, 322, -607, 283, -1133, -791, +-1344, -2829, -850, -700, 1015, 2183, 537, -2173, 1538, -766, 2965, 390, -766, 2168, -287, -1959, +1099, 79, 1039, 2265, -1108, -2669, -1751, -1261, 269, -594, -593, 210, -1338, 2083, 5192, 855, +-672, -2523, 626, 1227, -1887, 734, -22, -2266, -1074, -1014, -720, 3028, -815, 892, -365, -1978, +1543, 244, 2507, 1436, -1654, 11, -1593, 427, 1548, -1087, -2219, -573, 723, -2861, -1406, -84, +-74, 815, 997, 171, -65, 1277, 493, 45, -1918, -2248, 2042, 3236, 346, 1121, 2784, 734, +584, -2324, -3762, 743, -304, -705, -30, -2458, -893, 564, -1608, -238, -1403, -2250, 1704, 348, +-467, 411, 738, 1897, 530, 1842, 2589, 714, 11, -3384, 943, 1688, 113, 383, -413, -2028, +-2494, -3328, 409, 2264, -886, 4162, 965, -1146, -1373, -40, 3735, 5140, -383, -553, 1989, 1349, +-1184, -5177, -1795, 2794, 401, -3827, 2114, -1215, 1001, 1974, -1998, -658, -4940, -961, 1219, -1282, +-1263, -267, 656, 2613, 1878, -27, 2163, 870, 793, -5483, -1896, 288, 1613, 1300, 2395, 608, +1533, 1388, 1562, 1957, -2070, -3849, -1805, -1385, -878, 65, 1147, 2373, 486, -1849, 1595, -30, +1456, -1034, -2993, 351, 1975, -1552, -180, 370, 127, 141, -1358, 3964, -2683, -2367, 1718, -331, +-393, 1452, -905, 1566, 254, -5004, 206, 1692, -1576, -5381, -2519, 2281, 7214, -1985, -699, -996, +905, 1844, 752, 3665, 428, -1627, 3200, 386, -1814, 457, 1533, 3154, 772, -6702, -3990, 548, +-2372, -1116, -3455, -297, 5688, 2005, 1247, 598, 3484, 2207, -515, 2412, 181, -2797, -1365, 839, +-2915, 1332, 2678, 777, -249, -3592, -85, -1675, -2109, -2909, -3971, -360, 6031, -1058, -5090, 767, +6011, -418, -5909, 4979, 3091, -1171, -1000, 4242, -399, 1842, 1654, 5154, -733, -4482, 1220, 4022, +-1409, -5107, -4554, 603, 3535, -638, -3302, -4257, -656, 1897, 1476, 714, -1819, -2212, 1247, -361, +-3350, 1899, 2688, 4790, 2179, 1889, -1098, -3134, 3903, -1018, -7097, -2546, 6225, 2140, 1441, -4045, +-1482, 1961, 690, 2066, -2797, -3239, 1553, 211, -3196, 2691, 1383, 6371, 302, -2270, -255, -3816, +-1259, -1785, -246, -1171, 3811, -109, -2508, -5827, 1889, 3934, -2771, -876, 1495, 1671, -2779, -3300, +-343, 5260, 2362, 8236, 762, -5471, 1640, -327, -3941, -5250, -2243, 4361, 4805, -968, 1004, -2085, +-704, 3862, -2076, -1281, -3724, -1269, 2494, -1843, -1156, 2750, 5124, 9479, -225, -6438, 2910, 1024, +380, -7671, 269, 4336, -132, -3037, 6472, -2751, -5842, 776, 1520, -2192, -8076, -269, 4781, 171, +-1068, 3356, 5426, 5777, -1481, -2508, 3363, -2204, 55, -5817, -1441, 6376, -2823, -5680, 3975, -1603, +-854, 1205, 137, 1029, -5910, -2325, 2008, -340, 609, 3937, 3962, 6352, -23, -1505, 3733, 288, +56, -9565, -3458, 5106, 526, -4092, -890, -1214, 1121, 477, -2485, 1737, -5398, 788, 554, -1747, +52, 6400, 7015, 5833, -5566, -3615, 2760, -1678, -3346, -7614, -3816, 3653, 123, -2659, -327, -108, +3821, 3617, -2085, 1485, -3980, 2412, 2339, -2984, -4268, 4185, 10616, 4238, -3891, -3192, 5780, -1215, +-4000, -7093, 2886, 3483, 584, -821, 902, -621, 3759, -897, -3534, -385, -5175, 1179, 7, -2929, +-980, 6378, 7265, 2115, -9576, -568, 3075, -4615, -5161, -4194, 3922, 5029, -1629, 2211, 32, 1339, +6440, 2710, -4918, -3799, -4185, 4678, 1534, -4387, -1198, 7308, 11916, 2674, -5892, -4762, 1407, -2296, +-6784, -7719, -1559, 3147, -4577, 2649, 1057, 1472, 8663, 4907, -279, -2880, -4504, 5422, 1797, -5835, +-776, 5662, 8140, 2095, -6036, -4349, -2116, -1713, -5886, -6526, 243, 1398, -2933, 881, 0, 3319, +8984, 6222, -1872, -1815, -4780, 2745, 2106, -4484, 457, 4999, 10102, 584, -5963, -7432, -1548, -549, +-6166, -5442, -1214, 1695, -3526, 452, 2357, 4884, 12502, 5480, -3137, -4441, -3748, 3825, 456, -3292, +-3400, 8243, 9537, -1188, -6070, -2474, -351, -1204, -8803, -4158, 1141, -3269, -5547, 2756, 3932, 1961, +8703, 5561, -1573, -3724, -2100, 3009, 1171, -4567, 274, 9943, 8428, -2437, -5302, -2288, -3047, -3321, +-5999, -995, 2842, -5019, -3963, 622, 5218, 3329, 8940, 4462, -495, -4933, -4853, 2726, -35, -4302, +62, 9973, 8804, 420, -4953, -1341, -3042, -3662, -9750, -2007, 1086, -5333, -6193, -1499, 2002, 5692, +9754, 6939, 1312, -5393, -4253, 1442, 1344, -4169, 246, 10021, 9855, -2017, -6130, 1760, -408, -5867, +-5401, 592, 1524, -7689, -2051, -2076, 4487, 6206, 10406, 2606, -1615, -5129, -3714, 304, -3779, -3719, +1888, 10093, 4752, -3871, -3730, -913, -1666, -6486, -2754, 2558, -905, -7312, -4422, -714, 3122, 8122, +9846, 2316, -781, -2100, 870, 782, -3426, -4630, 3483, 10534, 3129, -2987, -836, 36, -37, -7141, +-2298, 2164, -1010, -8350, -1857, -3957, 210, 7433, 12120, 6261, -874, -4674, -1341, -2342, -6036, -1918, +4136, 8645, 3908, -2226, -870, -4177, -1174, -4673, 977, 4080, -1847, -7037, -2075, -2819, -1122, 8329, +8922, 3450, 1281, -3372, 188, -3268, -5401, -994, 2998, 9226, 1646, -3962, 1666, 451, -5677, -8798, +989, 4833, -1533, -9580, 503, 1547, -2349, 7706, 9763, 2760, -493, -1018, 3656, -593, -9419, -2392, +7772, 7588, 535, -3894, 3871, -2139, -4894, -8893, 1807, 3559, -4264, -7924, -1239, -13, -726, 7752, +6836, 5379, 264, -3264, 1107, -2134, -9891, 234, 6726, 5037, -2175, -4898, 224, -890, -5999, -8537, +6987, 9587, -4298, -9013, -1225, 4519, -1190, 7669, 5731, 4307, -679, 2509, 2978, -2827, -8911, 278, +8718, 3476, -4104, -5014, 2585, -3682, -9143, -9398, 5183, 6948, -4126, -8176, -2693, 3909, 2293, 8404, +6746, 4858, 1990, 530, 1087, -6671, -9361, 1315, 9206, 3166, -3214, -5097, 1742, 113, -7042, -8821, +3018, 7696, -6016, -10365, -676, 4088, 3675, 6738, 3197, 6546, 1737, 3948, 3056, -5784, -8597, 1300, +9390, 462, -5725, -4531, 2572, 40, -9719, -8606, 8065, 5474, -6192, -7346, -257, 3495, 4829, 5367, +4067, 3811, 1407, 5018, 4078, -8756, -4534, 3910, 9174, -611, -8973, -4490, 3655, 1358, -10912, -7982, +3031, 4040, -7514, -8389, 2483, 4119, 7922, 7249, 4417, 2858, 1860, 5852, 2601, -7855, -4698, 3152, +9953, -1877, -11525, -7008, -255, 4032, -7989, -7967, 3545, 2968, -9022, -7138, 1458, 5179, 10728, 6758, +4078, 1828, 3391, 4621, 2110, -8020, -2434, 4356, 8496, -1713, -11343, -3142, 1818, 534, -8091, -3346, +2841, 5134, -9259, -7851, -4577, -840, 8805, 6366, 3224, 3896, 6472, 4242, 3629, -7272, -2609, 6075, +9356, -821, -13731, -6254, -297, 840, -6094, -2488, 3685, 3434, -8447, -5239, -2543, -2134, 7637, 6067, +4388, 4114, 5707, 2504, 767, -6261, 3026, 4938, 5915, -244, -12550, -3768, -273, -1310, -5107, 1800, +3699, 1854, -10656, -507, -1276, -5067, 5607, 3564, 2766, 5224, 6365, 1389, -1155, -6700, 1200, 8912, +4912, -1839, -16037, -5155, 1806, -254, -5221, 2117, 4925, -1064, -13322, -684, 1920, -1191, 4702, 1726, +2455, 4893, 6003, 5425, 1855, -4244, 2750, 7751, 1471, -3888, -13647, -6709, 264, -4229, -2376, 4679, +10817, 1937, -13090, -3396, 236, 802, 4365, 3369, -3598, 5770, 4177, 2643, 2051, -982, 2660, 7574, +1693, -3904, -14618, -7267, -671, -4582, -4640, 5590, 6462, -224, -9799, -3374, 884, 1442, 1319, 2954, +-478, 8086, 8024, 2784, 1451, -962, 6375, 4194, 1874, -1959, -13529, -7897, -1082, -2018, -3396, 3746, +6780, -4300, -9942, -2590, 3637, 3724, 107, -103, -2000, 5851, 8615, 4472, 1360, -501, 2382, 5638, +2206, -5401, -14213, -5212, 1015, -293, -3646, 3447, 6971, -3047, -7899, -3695, 327, 4327, 560, -1198, +680, 3930, 5590, 5119, 3709, 5706, 6109, 320, -986, -4287, -13780, -7525, -749, 1390, -2613, 3369, +7340, -6715, -5950, 156, 100, 3370, -464, -3336, -129, 3760, 6065, 9000, 2464, 4802, 3462, 1427, +-2857, -8785, -14796, -7383, -3120, 398, 31, 5252, 5781, -9938, -5939, 1332, 3206, 6265, 4257, -2284, +3146, 6109, 1596, 7294, 4428, 9226, 3254, 680, -1292, -8436, -14685, -5857, -4447, 459, -2, 1869, +1012, -12090, -7194, -656, -812, 6532, 297, -4591, 7010, 5129, 1117, 12718, 6294, 11103, 4834, 3060, +-3893, -15153, -12437, -6664, -5265, 1267, 4429, 5682, -102, -13462, -7158, -55, 1407, 4641, -1557, -4048, +4521, 5486, 3709, 8976, 6700, 12955, 4856, 3075, -2980, -11819, -5032, -2769, -5585, 3227, 2335, 5043, +-1316, -14466, -10095, -1533, -1450, 1091, -3660, -3935, 6399, 4557, 3042, 10186, 9046, 14751, 7580, 4012, +-5067, -17248, -6424, -4502, -3110, -3980, 5378, 9102, -2953, -15462, -6871, 1656, 306, 522, -3796, -6593, +4335, 2872, 5678, 6344, 8916, 12238, 5620, 4777, -4461, -16162, -1458, -181, -2313, 796, 7136, 12532, +-2034, -18736, -10487, -340, -1082, -1374, -5975, -5926, 4812, 4136, 6067, 9401, 10434, 10786, 7481, 2760, +-6739, -17003, -3913, -4169, -3314, -1642, 5004, 12274, -1330, -14066, -8449, -2528, 2207, 166, -10025, -4700, +-221, 4238, 6027, 8089, 9701, 12880, 8607, 4118, -6333, -14878, -2232, -191, 719, -2504, 7200, 12219, +-3293, -14043, -11615, -6052, -1494, 2319, -6042, -7272, 268, 6700, 5641, 8054, 11644, 13316, 9440, 2512, +-9240, -12450, -1765, -886, -2158, -2553, 5781, 11862, -3224, -11325, -7981, -6974, 1271, 1365, -12765, -6893, +1868, 4481, 3385, 7984, 12740, 11724, 8799, 1210, -10866, -11093, -4557, 2707, -221, -2396, 8431, 9179, +-4780, -10860, -7356, -7670, 4727, -125, -10682, -4254, 414, 7698, 4671, 6496, 13580, 13026, 7432, 2860, +-14890, -8459, -3336, 2865, -152, -2997, 7980, 6227, -4414, -11120, -4710, -9657, 1249, -3027, -11375, -6838, +1060, 9015, 2255, 6504, 10723, 14063, 8054, 2295, -13547, -6234, -3351, 2435, 2688, -902, 11025, 7205, +-6612, -7892, -3584, -12208, -1433, -1359, -13687, -7880, -1166, 9145, 4723, 6150, 11392, 15871, 6522, -377, +-12293, -3724, 662, 1440, 2951, 1151, 11169, 4378, -8208, -6492, -6067, -9307, 401, -2180, -11789, -8210, +-1965, 6744, 2348, 5712, 12180, 14334, 4767, -3793, -10744, -3496, 3825, 3477, 2973, 2066, 9557, 6688, +-7364, -3758, -9593, -10714, -1651, -3939, -11709, -10239, -196, 7716, 4399, 7999, 10926, 11508, 4208, -2891, +-11520, -2400, 3851, 5716, 995, 5537, 11009, 4243, -7103, 2800, -5580, -8745, -3680, -4763, -11529, -13109, +-1435, 3201, 663, 3934, 11545, 11879, 2818, -6452, -8464, -1203, 4078, 6638, 459, 6750, 8333, 1099, +-4602, 4404, -6576, -8338, -2008, -3935, -10108, -12969, 1036, 5247, 3671, 2860, 10152, 11634, 369, -10410, +-8447, -1474, 5817, 5733, -41, 10415, 7579, -2550, -4007, 6876, -8483, -9880, -1898, -3656, -10098, -13869, +404, 3875, 7035, 2537, 12424, 12453, -3488, -12107, -5299, -1505, 3842, 3793, 2396, 11096, 6249, -5499, +-83, 7730, -7066, -7805, -2289, -5245, -8057, -13096, -2168, 3648, 7696, 1824, 14538, 9359, -1985, -13180, +-2752, -1195, 4849, 2601, 2832, 12319, 5745, -8378, -258, 7580, -5473, -6101, -2454, -4189, -8102, -13968, +-1164, 1339, 7835, 2984, 14877, 9071, -3108, -13735, -2980, 1838, 3144, 548, 7000, 14084, 3975, -14616, +1756, 3687, -3782, -3694, -3161, -5939, -7982, -9986, -3590, 2281, 6995, 2984, 14792, 7679, -3472, -14192, +-3369, 2997, 3096, -1571, 8262, 13610, 3111, -13220, 1103, 4941, -3113, -1641, -3249, -6462, -9207, -8105, +-5299, 1311, 7243, 5518, 14654, 8072, -5702, -10737, -2960, 6376, 1309, -3161, 10372, 12248, 1297, -13581, +1732, 2107, -3554, -1310, -6874, -7491, -5939, -4633, -5013, 512, 5562, 7439, 13835, 6717, -4389, -9114, +-4292, 6159, 104, -1785, 10507, 12643, -1761, -11276, 1923, 3419, -3898, -1973, -6094, -7913, -6479, -4977, +-6492, -621, 5983, 8561, 13251, 6569, -4193, -7190, -1103, 9994, 584, -3123, 12182, 12665, -3935, -10188, +-413, 1368, -5255, -2334, -5917, -8575, -4570, -2779, -6336, -457, 3411, 10088, 9819, 5009, -4311, -5830, +-2072, 7880, -1635, -132, 12783, 11380, -5830, -6389, 592, 3760, -5357, -4390, -8428, -9082, -2949, -2628, +-5888, -1461, 1422, 11717, 8976, 4916, -2808, -5722, 1910, 7548, -2187, -84, 12636, 8789, -5538, -5903, +516, 4404, -6045, -4181, -7623, -9517, -2580, -3031, -4155, -1954, -132, 11898, 5112, 2406, -299, -4455, +2267, 7318, -3075, 3028, 10801, 5988, -2691, -6120, 544, 6153, -5567, -6860, -7851, -8650, -2485, -2958, +-2763, -439, -1160, 12470, 3953, 191, 1380, -2634, 6317, 5155, -3905, 2575, 11150, 3872, -350, -5990, +816, 6390, -6475, -9147, -7196, -8792, -3648, -3424, 177, -1573, -1741, 11543, 2912, -660, 1940, 220, +7883, 4572, -3656, 4471, 9535, 1435, 2800, -4438, 384, 7010, -6871, -10301, -5347, -9679, -4451, -4355, +961, -1055, -2009, 9754, 990, -2441, 2386, 4620, 9037, 1562, -1097, 4891, 5808, -88, 5344, -3510, +-1218, 6891, -4448, -13263, -4247, -9822, -6090, -3830, 2499, 40, -3372, 6171, -6, -2153, 76, 8605, +9175, 1207, 246, 5600, 3690, 545, 7485, -2182, -1301, 6424, -3182, -15408, -3837, -9873, -9057, -3731, +3657, -278, 3, 4001, -1222, -1683, -942, 10767, 10992, 723, 1155, 4976, -2362, 1341, 7919, -951, +-1988, 3615, 802, -15476, -2941, -9850, -11088, -2061, 5809, 878, -1644, 1330, -3346, 1060, -1627, 13604, +13006, -255, 3033, 4942, -6360, 4422, 6875, 1496, -1519, -333, 2309, -13744, -6162, -11075, -14274, -2536, +8110, 965, -1649, -648, -4127, 4534, -1292, 13942, 12541, 1470, 4863, 3803, -8028, 4514, 6358, 1907, +2790, -2338, 3032, -9713, -9231, -9968, -15451, -2899, 7696, 1442, -4229, -1482, -6410, 5197, 2225, 12924, +11973, 3336, 4793, 2329, -10010, 5653, 5460, 656, 4088, -2056, 177, -5609, -10025, -10093, -14664, -4007, +9206, 2493, -5707, -2936, -5570, 6113, 5037, 12219, 10563, 5280, 5692, 244, -9872, 4186, 5371, -854, +5481, -2109, -2526, -1955, -12177, -11372, -13336, -5513, 8072, 5297, -6491, -4998, -5822, 4248, 8335, 12458, +7711, 7989, 6157, -1121, -8595, 4347, 5112, -1552, 5146, 704, -2799, -1675, -12267, -13390, -9889, -6840, +6550, 6163, -6081, -8084, -2781, 4143, 9763, 13995, 5677, 10370, 6812, -3277, -6200, 3023, 3323, -1239, +2871, 2838, -2335, -2076, -11689, -16385, -9298, -6123, 4248, 5570, -6124, -10456, 483, 3285, 10766, 16103, +3719, 11461, 8461, -2600, -4397, 2725, 2396, -167, 1424, 3643, 292, -4162, -11048, -17002, -9587, -3975, +2886, 2431, -5285, -11578, 462, 5909, 8761, 15784, 2975, 9940, 8813, -1912, -2929, 2145, -262, -312, +1204, 3123, 5371, -7108, -11857, -15446, -10313, -1311, 2912, -1335, -5183, -9467, 548, 8157, 7466, 15125, +4046, 7226, 9192, 1147, -2440, 1688, -2686, 166, 986, 1111, 9527, -7104, -14061, -14129, -10962, -175, +2393, -5591, -6734, -7767, 2246, 9373, 7109, 12476, 6806, 5665, 7214, 5360, -1770, 1315, -4622, -1016, +1503, 187, 9880, -3782, -17527, -14356, -9958, 1858, 3079, -9177, -8286, -4155, 4383, 9343, 8629, 8014, +9920, 4678, 8420, 7796, -716, 83, -6811, -675, 292, 1668, 5876, -2041, -16989, -15906, -7617, 2644, +2407, -11904, -11375, -730, 7399, 8920, 10801, 5780, 9201, 4277, 8443, 10900, 1645, -151, -7548, -868, +-2076, 4334, 1010, -1647, -14872, -19077, -7459, 3333, 1462, -12366, -15716, -852, 11193, 8918, 10042, 5464, +7499, 4014, 11312, 10908, 4636, -1116, -6470, -1176, -3460, 6625, -2284, -3139, -10283, -20844, -7054, 4332, +-549, -12286, -16498, -1567, 13554, 10530, 8161, 5921, 4761, 2837, 15573, 9659, 6962, -1688, -8023, -855, +-4353, 5556, -2270, -6425, -6707, -20385, -8163, 7723, -5014, -11474, -15943, -3356, 14775, 11911, 7730, 7071, +2920, 1297, 18700, 9834, 6492, -942, -7417, -878, -4792, 5120, -2110, -10107, -6200, -17146, -10045, 8193, +-4070, -13780, -13963, -2769, 13677, 14840, 7116, 7708, 1692, 652, 20862, 12581, 5112, -645, -6588, -2577, +-4203, 2527, -2325, -11602, -7404, -12577, -10794, 6973, -3704, -15426, -11589, -3263, 13009, 15659, 7640, 7572, +825, 769, 21098, 15140, 4182, 162, -5886, -1297, -4554, 2314, -2765, -12723, -11776, -8252, -7903, 1920, +-3055, -16819, -9997, -2943, 10718, 14054, 9560, 5003, 103, 2431, 18435, 16864, 4412, -1659, -2507, -739, +-4058, 2167, -3366, -12109, -15219, -6070, -2763, -1847, -2267, -16812, -9425, -269, 8576, 12665, 10917, 3196, +-1460, 5871, 14573, 17151, 5365, -3226, -2178, -6, -5592, 2420, -3554, -12184, -16835, -5359, 1702, -3762, +-4955, -15037, -9125, 903, 9206, 9152, 12837, 1960, -1683, 7089, 13869, 15782, 6696, -4657, -737, 385, +-5857, 2207, -4155, -12138, -17026, -7633, 7073, -3792, -6995, -12653, -10001, 4098, 8577, 7646, 11538, 2265, +-2188, 9511, 13682, 13030, 8935, -4087, -2257, 2163, -6016, 1542, -3973, -13466, -16617, -9802, 8656, -1164, +-11079, -12178, -7897, 4151, 9727, 6007, 8639, 2198, 113, 10852, 13736, 10633, 8068, -1806, -2110, 3260, +-5949, 1225, -2833, -13860, -14845, -11349, 7587, 1666, -14066, -10970, -5548, 1460, 11074, 5859, 6205, 2117, +-1097, 10937, 14232, 10462, 7396, 936, -3161, 1494, -4410, 210, -2807, -13437, -14930, -11262, 5880, 4801, +-15600, -11631, -3821, 2934, 10165, 6774, 2439, 2295, -1870, 10920, 16223, 9095, 5265, 4737, -2686, -1087, +-1456, -1597, -2061, -12028, -16627, -11392, 4490, 7156, -16389, -13977, -512, 4296, 8786, 7975, 172, 326, +-336, 10142, 18466, 7714, 2382, 7075, 138, -4331, -498, -2518, -917, -9905, -17505, -11460, 2551, 7305, +-14473, -15478, 2411, 5445, 5859, 10729, -1401, -922, -1369, 9058, 19404, 8301, -660, 9397, 2421, -6777, +680, -2406, -2187, -7446, -18050, -11343, 2241, 3894, -12158, -15674, 3384, 6704, 5624, 8404, 65, -2430, +-556, 9114, 19208, 9904, -1574, 9725, 5852, -9409, 462, -1387, -3530, -5575, -17464, -12895, 1440, 1510, +-10430, -15268, 3060, 9454, 5119, 6589, 1761, -5398, -997, 7001, 18031, 9380, -1945, 9891, 8083, -9159, +-1164, 423, -3294, -3027, -15708, -12707, -343, -341, -9179, -12967, -343, 11702, 6366, 2469, 3953, -6501, +-812, 7373, 17592, 10346, -2797, 8454, 9469, -5222, -3491, 690, -5034, -3912, -13483, -12421, -1848, -1777, +-11072, -7689, -1407, 13274, 6700, -1359, 4916, -6261, -2120, 6346, 14514, 9947, -1538, 8863, 10065, -4053, +-3899, 754, -3240, -3108, -12189, -11309, -3928, -4720, -9449, -4736, -1064, 11311, 9788, -3922, 6346, -5927, +-2463, 6948, 10338, 9703, 11, 7582, 9919, -2265, -4119, -1990, -3322, -1974, -11229, -9976, -3728, -7897, +-9251, -3106, 180, 9807, 12028, -4844, 3896, -2164, -4233, 8215, 8699, 10951, 1151, 5804, 10534, 214, +-2691, -2802, -3714, -3925, -9473, -9535, -5203, -11697, -7438, -2056, 2165, 7533, 13360, -4329, -139, -2867, +-3639, 7087, 5590, 11479, 3411, 4717, 9933, 1984, -1268, -3447, -4268, -784, -10415, -7368, -6223, -12012, +-9354, -1329, 5314, 4809, 13336, -1271, -3792, -1382, -3156, 6236, 3850, 10438, 4897, 5847, 10210, 2672, +-239, -3821, -5609, -1358, -9264, -6780, -7655, -13992, -8905, 404, 6191, 3990, 12330, 701, -5842, -1109, +-2959, 6813, 971, 9759, 7844, 5124, 8559, 3443, 590, -3139, -6483, -2286, -6903, -6678, -9724, -13307, +-10422, 855, 8621, 2860, 12129, 1475, -6952, -3506, -2175, 6508, -439, 7659, 9346, 6460, 7897, 5432, +1077, -3379, -6157, -1416, -5018, -6036, -9965, -14124, -10002, 744, 10132, 3443, 10428, 4112, -7839, -5953, +-1679, 6652, 422, 4296, 10384, 8300, 7946, 5890, 714, -2657, -7486, -2594, -2550, -7403, -12337, -13219, +-7778, -497, 10059, 2827, 8540, 6833, -7199, -8723, -1111, 5471, 1456, 2873, 10584, 10180, 6638, 7832, +947, -2284, -7684, -2304, -1870, -6196, -13850, -14079, -5367, -2150, 10791, 2580, 5650, 8226, -7259, -10880, +-892, 5207, 812, 1083, 9508, 12791, 7985, 7546, 1257, -3501, -6688, -2027, -597, -6517, -14610, -14612, +-733, -3486, 10314, 4742, 3525, 9857, -6600, -10832, -2313, 3595, 1426, 1679, 6416, 14249, 8621, 7215, +1465, -4171, -7103, -1353, -1340, -4919, -15814, -16182, 2221, -3066, 8501, 4753, 1031, 9361, -4621, -11062, +-3830, 2546, 1899, 1923, 5526, 14937, 11121, 6557, 2547, -2823, -8418, 544, -2276, -3759, -15452, -18420, +4446, 192, 5456, 4497, 1107, 9308, -3612, -12187, -4787, 1307, 1370, 1712, 5585, 14024, 13714, 4967, +3460, -1598, -11248, 1710, -1200, -3186, -16630, -19850, 5983, 2697, 2570, 4196, 1024, 8472, -2437, -9897, +-4667, -1232, 942, 1524, 6557, 12630, 15706, 5405, 2464, 851, -14528, 2260, 612, -3188, -17619, -19194, +5726, 4661, 2038, 2440, 2595, 5353, -2977, -8299, -3754, -4438, 2023, 1218, 7664, 11831, 17894, 5306, +3439, 680, -14519, 1063, 2131, -2849, -17827, -19427, 3665, 7873, 1829, 1864, 2196, 3924, -3721, -7061, +-2827, -8305, 1181, -487, 8593, 11872, 16608, 6986, 4378, 1547, -13768, -1383, 4232, -520, -18227, -18142, +191, 10030, 2279, 878, 2165, 2882, -5355, -5241, -883, -9684, -825, -283, 8120, 13515, 13988, 8208, +3962, 1946, -13956, -2784, 5003, 514, -19545, -16023, -493, 8675, 4797, 782, 2585, 2395, -5837, -4335, +-69, -10422, -1891, -113, 8111, 16177, 12456, 10138, 4418, 1514, -11810, -7194, 7228, 1695, -19136, -13845, +-2989, 5442, 7083, 1736, 3028, 7, -7282, -3929, 706, -8979, -5982, 939, 6045, 16439, 10653, 11432, +4989, -36, -8013, -10161, 8397, 2841, -16862, -13827, -4034, 2881, 9919, 3391, 3479, -898, -8389, -3592, +2277, -8029, -8896, 1547, 4272, 18168, 10080, 12774, 4344, -708, -6065, -12915, 7893, 2917, -13452, -13554, +-5624, -624, 11350, 4298, 4621, -2946, -8753, -3612, 2497, -7000, -10020, 404, 5518, 16891, 11748, 12177, +4439, 907, -4460, -13130, 7024, 3415, -11663, -12523, -7006, -3254, 7946, 7424, 6338, -3957, -10217, -6491, +2396, -6171, -11345, -786, 6589, 14312, 13079, 11029, 4521, 540, -1765, -13055, 6276, 4916, -8685, -11731, +-7443, -4916, 6504, 10219, 7177, -1986, -10044, -9459, 4088, -5319, -11767, -3244, 8373, 11562, 14002, 9235, +3506, 433, -1475, -10590, 1364, 6512, -7316, -8271, -9976, -5445, 3148, 13341, 8252, -908, -10239, -12805, +4999, -4257, -10563, -5034, 10110, 10264, 15539, 7588, 4417, 1587, -55, -7095, -1845, 9140, -7711, -7152, +-10317, -5924, -1242, 14534, 9342, 2141, -10309, -14495, 4484, -3055, -11150, -5205, 10052, 10937, 13825, 5120, +4969, 1094, 709, -5216, -4378, 9861, -8246, -5442, -9773, -6967, -4127, 13952, 10415, 4094, -11223, -16511, +4211, -4594, -8508, -5432, 8895, 11097, 12241, 5760, 4402, 3860, 1722, -4359, -5417, 9106, -7606, -4531, +-9128, -6494, -6491, 12012, 11882, 5563, -10065, -16108, 1884, -4955, -7218, -4529, 5614, 12117, 9095, 4208, +3415, 6770, 2415, -3454, -4552, 8091, -5876, -4717, -7395, -6641, -6448, 7037, 14065, 5973, -8917, -14003, +-340, -7087, -6673, -3445, 4757, 13095, 6452, 3047, 2580, 7224, 4414, -3386, -3003, 5650, -2793, -4080, +-5624, -5950, -5037, 3400, 15878, 7049, -9155, -10403, -4147, -7601, -5347, -2799, 5532, 11809, 4208, 2247, +2473, 10161, 6133, -3466, -1625, 1726, -2945, -3988, -5444, -6400, -4807, -525, 15851, 7646, -7349, -6525, +-7599, -9254, -4662, -2120, 6971, 8325, 2677, 65, 2451, 12207, 6798, -2212, 172, -2014, -934, -922, +-6220, -4840, -4252, -2967, 14519, 6744, -5629, -3778, -10943, -11246, -3680, -1925, 8175, 4645, 1057, -70, +-478, 15801, 6744, 418, 93, -4213, -505, -1227, -7053, -3259, -2000, -4147, 12063, 5250, -1334, -973, +-11709, -13008, -2943, -1062, 9230, 1921, 11, -536, 293, 16716, 6608, 4891, -1729, -6074, -1503, 978, +-8091, -2313, -515, -5263, 6670, 4578, 1121, 384, -11767, -14066, -3394, 148, 9232, -2533, -607, 1, +1118, 17652, 7952, 8501, -1858, -8375, -1540, 2415, -6475, -443, 926, -5032, 3331, 5256, 3990, 2080, +-11897, -15451, -3232, 3865, 6075, -5159, -2067, -1863, 3278, 16584, 7020, 11311, -2741, -7292, -3486, 2946, +-4586, -748, 1957, -4615, -904, 4116, 6710, 2441, -10888, -16197, -3633, 4912, 3880, -6318, -4708, -2482, +5062, 17035, 8378, 13224, -4766, -8794, -3835, 3779, -3660, -1044, 2938, -3898, -4038, 5347, 8755, 1052, +-9238, -15814, -3095, 6297, 274, -7361, -6239, -3522, 7488, 15071, 10270, 13225, -4450, -8706, -3348, 2121, +-1976, -1847, 3845, -3787, -7791, 3351, 10723, 1752, -9586, -14736, -3109, 7422, -1703, -7323, -7621, -4584, +9090, 14611, 12996, 11732, -3970, -9420, -3346, 2189, 502, 1146, 3340, -2803, -7221, 1933, 11634, 1611, +-9686, -13215, -4039, 7858, -5615, -7402, -9184, -4507, 10534, 14164, 13677, 10020, -1301, -10634, -3919, 512, +1257, 3008, 1288, -2410, -6074, -239, 12705, 3832, -11102, -9821, -2342, 5595, -6517, -7941, -9266, -5294, +11121, 14053, 15577, 8901, 512, -11262, -3164, 1049, 1414, 4725, -304, -2820, -5956, -1257, 10250, 3613, +-13014, -8030, -1505, 1876, -6811, -9758, -9152, -4584, 11901, 14801, 13740, 10520, 966, -10222, -3764, 2421, +2571, 6443, -795, -1901, -4787, -2116, 9969, 5170, -13263, -5730, 202, -2153, -6651, -11744, -10894, -4725, +10886, 15364, 12120, 11414, 1019, -10393, -4451, 3413, 2081, 6748, -1204, -1665, -5381, -2878, 8733, 4441, +-10912, -6212, 3043, -5915, -5630, -13185, -10721, -2703, 9507, 15600, 10372, 13421, -132, -9309, -4594, 6021, +3627, 7505, -1136, -11, -4894, -3089, 7664, 4088, -10335, -5171, 3733, -6903, -8030, -14408, -9833, -3769, +9503, 15294, 8683, 14273, -272, -10033, -4022, 6111, 5847, 5058, -719, 1624, -5314, -3090, 7011, 2706, +-7916, -5417, 4657, -7588, -10299, -11508, -11154, -3416, 8808, 14364, 9790, 14654, -233, -9666, -3055, 6085, +8770, 4553, 585, 2093, -7677, -2849, 6378, 1413, -5648, -6145, 3128, -6852, -13440, -9942, -11062, -4172, +8837, 11877, 12185, 12216, 39, -10209, -2245, 7045, 9973, 4811, -37, 4378, -8590, -1595, 5747, -221, +-5032, -5319, 1498, -4995, -17890, -8087, -11321, -4805, 9492, 9532, 15614, 9632, 690, -10406, -607, 4918, +12532, 4335, -115, 4744, -9228, -268, 2823, 16, -3646, -4397, -665, -2102, -22159, -5493, -12056, -4981, +9288, 8202, 16417, 8343, 1083, -9164, 928, 5939, 12310, 5771, 619, 5365, -9593, -2099, 1465, -511, +-1557, -5684, -786, -2323, -22683, -4985, -10579, -5701, 5873, 7868, 18561, 6826, 748, -10044, 2388, 5434, +13353, 8078, 1469, 5798, -9140, -2560, 923, -724, -2839, -4201, -2028, -2225, -23193, -5189, -9109, -6212, +5110, 9420, 17388, 7924, 83, -8100, 1835, 7500, 12424, 9310, 3171, 5100, -6855, -3738, 1606, -2842, +-1062, -6278, -1707, -4257, -21411, -7284, -9490, -6197, 1884, 10679, 15639, 8573, -2529, -5420, 936, 7500, +12768, 9785, 3966, 3371, -4383, -4843, 1524, -3564, -1064, -6924, -1761, -6958, -16221, -9419, -6789, -6375, +638, 11852, 14068, 9894, -2633, -2633, -810, 9346, 13395, 8823, 5247, 2707, -2194, -5019, -485, -4523, +-1746, -7210, -2144, -9005, -14746, -9938, -6591, -7373, -361, 12648, 10905, 10913, -3687, 253, -2926, 10028, +14487, 7965, 6831, 1664, 714, -3667, -1345, -5024, -3438, -8522, -2891, -10262, -11652, -9183, -7058, -7849, +-1116, 11970, 11083, 11834, -3346, 588, -1908, 10186, 16866, 7430, 6070, 1024, 3043, -2209, -3004, -4742, +-6569, -8044, -2482, -11180, -9816, -11314, -6067, -5994, -1882, 11656, 9703, 9318, -1513, 549, -669, 8853, +16134, 6092, 7418, 701, 5262, -1189, -4393, -3455, -9590, -9177, -4966, -9208, -9312, -10199, -7491, -5643, +-1698, 9618, 9603, 11244, 1189, -1310, 1790, 8467, 18073, 6758, 8615, 267, 6375, 454, -4184, -3632, +-13318, -11023, -3612, -6583, -10777, -8907, -9679, -4572, -1908, 6901, 9657, 8976, 2383, -2007, 2807, 7987, +16924, 7308, 8700, 2667, 7040, 3244, -5804, -3326, -14504, -14273, -3622, -5139, -10692, -8474, -10878, -2907, +-995, 5733, 9031, 7694, 4153, -4233, 4995, 7359, 14533, 6968, 9618, 3230, 5639, 3227, -3996, -5229, +-14049, -17206, -4332, -2414, -10866, -6971, -10871, -3304, 1471, 4555, 7952, 9435, 2882, -2086, 7016, 8946, +10949, 7844, 11015, 5272, 4597, 4870, -3140, -8986, -14671, -20978, -5069, -858, -9635, -7228, -12150, -4320, +3888, 2706, 6334, 11039, 1566, -234, 8222, 10292, 7822, 9414, 12168, 7349, 2311, 5988, -1673, -10245, +-15056, -24712, -6745, -435, -7128, -6436, -12451, -5677, 5319, 2630, 7718, 10554, -321, 1234, 8281, 12018, +4894, 11104, 14548, 9003, 2692, 7044, -331, -11380, -16187, -25668, -7172, -636, -4727, -7579, -14132, -8088, +6148, 3285, 6901, 8378, -1825, 2269, 8515, 12460, 1021, 12129, 15706, 11431, 2823, 7672, 806, -13106, +-16053, -27274, -7485, -2458, 200, -8578, -13869, -8767, 5204, 3743, 7622, 8984, -2645, 3962, 7577, 12907, +-1198, 12138, 17868, 10355, 4164, 6817, 1020, -12779, -19154, -27123, -9208, -4652, 3263, -7497, -15435, -9337, +4481, 6309, 7071, 7112, -2184, 6071, 7047, 13176, -2156, 12037, 19931, 10946, 5247, 5770, 1818, -13946, +-19320, -26705, -9753, -6428, 4897, -6353, -15838, -10621, 2551, 8551, 7485, 5425, -2162, 7047, 6235, 12929, +-784, 9875, 20347, 12063, 8184, 5150, 709, -13935, -20966, -25108, -11198, -8186, 6065, -4335, -14766, -11649, +1408, 11238, 6783, 3757, -1307, 10025, 3709, 12012, 913, 9867, 20579, 14283, 8932, 4749, 260, -15165, +-20177, -23520, -12703, -9668, 6372, -2565, -16402, -12951, 1721, 12702, 6069, 2061, 55, 9972, 4751, 10403, +3511, 7870, 18905, 17403, 9731, 4243, -791, -15500, -20817, -21191, -15515, -8787, 6057, -1528, -13990, -15680, +302, 12670, 6978, 1971, 1191, 6997, 5522, 9395, 4935, 8649, 16051, 21015, 10468, 4436, -2415, -16499, +-21426, -19519, -17761, -6763, 5337, -1751, -12377, -14964, -1321, 13399, 5997, 1009, 1930, 6404, 7359, 7020, +5067, 8601, 13843, 22897, 11238, 3855, -1235, -18577, -21661, -17839, -19082, -5377, 2818, -1154, -11372, -15878, +-2202, 14114, 5420, 248, 3377, 4725, 9395, 7390, 5436, 8001, 13334, 23379, 12701, 2807, -1050, -18654, +-21477, -16251, -19485, -6470, 2577, -918, -10461, -14308, -4563, 15072, 4799, 446, 4306, 3306, 10534, 7908, +5134, 8100, 12473, 24316, 15614, 2868, -2348, -18106, -21671, -15586, -18693, -7200, 1334, -2475, -8921, -14182, +-5323, 15464, 2951, 915, 4665, 2173, 12070, 9085, 4409, 6889, 11762, 22271, 17522, 3186, -2144, -16703, +-22238, -16630, -16489, -7800, 2217, -3105, -9232, -14644, -4509, 13893, 3928, -297, 3971, 2649, 12420, 10714, +2905, 6048, 11193, 19718, 20699, 2828, -3807, -16226, -20395, -16646, -14712, -8853, 1768, -6072, -7388, -13883, +-6237, 12974, 2852, 404, 1612, 4699, 12265, 12950, 1636, 5529, 11627, 17909, 21613, 4627, -3642, -14830, +-20762, -17027, -13284, -8575, 889, -5441, -8737, -13985, -5338, 11636, 3804, 730, -997, 7279, 12672, 14218, +312, 5347, 11758, 14671, 21844, 6877, -4233, -14877, -18174, -18614, -10820, -7625, 667, -5586, -9296, -11659, +-7399, 10728, 4533, -35, -2233, 9343, 14276, 15546, 544, 3748, 10042, 12633, 20366, 10309, -2972, -17316, +-16599, -19286, -10071, -4828, -1437, -7097, -10228, -12322, -5571, 10273, 3201, -898, -3883, 11964, 14316, 16031, +1005, 2784, 10167, 10631, 19855, 13865, -2993, -18808, -13770, -18067, -10010, -3966, -2774, -8590, -11833, -11451, +-4623, 8896, 1118, -381, -3740, 12473, 14723, 15454, 3535, 168, 8403, 8944, 17895, 15731, -2665, -20512, +-13203, -15306, -10398, -2987, -1999, -9727, -12146, -11193, -2190, 7792, 187, -91, -4195, 12773, 15515, 13491, +7146, -743, 7379, 8804, 14955, 19121, -2444, -20144, -12967, -13188, -12396, -1435, -1505, -12088, -14554, -11921, +-507, 6540, -433, 156, -4131, 12169, 17123, 11330, 10554, -1540, 6702, 7840, 12194, 20881, -328, -19876, +-12196, -10466, -11235, -2376, -782, -11615, -17168, -11132, 981, 5194, -1490, 147, -1707, 11766, 17584, 10456, +11690, -1010, 3303, 8568, 8789, 19775, 1998, -19918, -13334, -7592, -11300, -3076, 2883, -13271, -17391, -12348, +2930, 5067, -2431, -1525, -79, 9915, 18394, 10619, 12958, 1490, -931, 8498, 9594, 17492, 4529, -18343, +-14104, -5626, -9857, -5092, 2488, -12938, -19358, -12468, 3086, 4786, -3734, -2911, 4340, 8285, 16632, 9851, +12182, 5067, -5721, 8503, 9244, 14859, 5987, -16365, -14919, -3280, -6255, -8044, 2309, -10505, -20607, -11552, +3047, 4884, -5950, -4875, 8897, 7156, 14375, 10671, 13006, 7974, -9309, 7228, 10631, 12207, 6111, -12841, +-15626, -2595, -3178, -9843, 64, -10580, -19204, -11113, 1758, 4657, -6583, -5483, 10592, 7849, 9778, 13021, +13153, 9684, -10427, 4491, 11668, 11125, 4986, -9843, -14424, -3731, 97, -9043, -3158, -8750, -17092, -11171, +1874, 3297, -6596, -7475, 11959, 10582, 4586, 13783, 15174, 9550, -9852, 970, 12760, 10157, 2936, -6124, +-12725, -3823, 1510, -10002, -6457, -7894, -14069, -11545, 45, 2165, -5580, -7716, 10650, 12644, 1650, 12933, +17604, 8823, -7790, -4484, 12987, 11063, 1654, -5258, -10485, -3881, 2183, -5842, -11059, -8060, -10734, -11275, +1281, -1296, -3598, -9191, 8997, 14593, -57, 11639, 20459, 7113, -6431, -5139, 11901, 10936, 1510, -5355, +-6443, -3593, 879, -2827, -16118, -6608, -7790, -9290, 735, -4688, -3959, -7815, 7745, 13957, 1078, 8246, +21222, 4841, -5035, -6079, 9739, 10851, 626, -4763, -3772, -3792, -311, -1552, -15183, -9000, -5374, -6630, +-61, -5693, -3721, -6098, 5503, 14543, 3492, 5814, 23828, 6105, -5111, -5328, 8134, 10088, 1157, -5179, +-2873, -1988, -3075, -1048, -15187, -10953, -3578, -3891, 229, -8285, -6377, -3901, 3259, 13563, 4334, 3773, +20500, 7723, -5698, -3372, 5803, 10022, 1335, -5318, -1137, 27, -3652, -3226, -10542, -12247, -4111, -750, +433, -7456, -8573, -2116, 2003, 11680, 6331, 3919, 18024, 8397, -5575, -1801, 5422, 7611, 2052, -3578, +-1351, 1262, -4573, -5239, -8838, -11714, -4394, 918, 1903, -7727, -11901, -2376, 2023, 11200, 6299, 5514, +13518, 8906, -4099, -3486, 5400, 4938, 2552, -3272, -846, 2994, -3908, -6653, -7100, -8937, -6438, 2862, +4083, -7740, -12813, -3283, 3033, 8275, 6333, 7883, 9809, 9780, -3380, -3496, 6376, 2528, 2784, -1748, +-4044, 3769, -3370, -7083, -6663, -7189, -6794, 3269, 6754, -5823, -14080, -5964, 3525, 7999, 6909, 8045, +9119, 6666, -1610, -3049, 6220, 2024, 3313, -714, -3867, 3841, -3406, -8684, -6227, -4558, -7831, 2973, +6043, -4069, -16121, -6711, 3501, 7166, 4633, 9609, 9790, 3336, -401, -3419, 5061, 2104, 3268, -1467, +-4713, 3109, -1527, -6387, -7902, -2194, -4402, 284, 8761, -1029, -16457, -9416, 3294, 8858, 4597, 9766, +7965, 2096, -88, 422, 2042, 3109, 2774, -507, -5081, 1135, -1373, -5302, -7703, -815, -2761, -1632, +7802, 885, -15832, -11424, 1869, 8164, 3448, 8680, 8409, 336, -219, 1126, 432, 3849, 3437, 167, +-4193, -3119, -30, -3670, -7453, -447, 1263, -3300, 7003, 2025, -14101, -10098, 258, 9022, 3695, 7861, +6712, 272, -50, 540, -471, 3992, 3060, 1930, -4713, -6813, 212, -1659, -5775, -719, 1864, -966, +6738, 1529, -12565, -10600, -797, 8533, 3811, 8161, 4354, 263, -1040, 477, -532, 1907, 4819, 2639, +-5698, -9324, 608, 40, -5701, -269, 1984, 1121, 5302, 1041, -10948, -8954, -2071, 5703, 6370, 6375, +3327, -685, -660, 162, -287, 926, 6642, 3571, -6506, -10632, 835, 522, -4109, 488, 1908, 4114, +5911, 196, -10658, -8194, -934, 3342, 9158, 5377, 928, -1419, -437, 37, -1106, -1820, 6942, 4565, +-5134, -13411, -565, 1199, -3001, 730, 2343, 5805, 6473, -1853, -10319, -5195, -1787, 1608, 10054, 5057, +-201, -1954, 420, 204, -1280, -241, 8120, 5689, -5650, -14569, -1945, 1872, -2110, 1378, 2765, 5931, +6920, -1232, -10626, -2020, -2945, 584, 9368, 6396, -2415, -3306, 509, -573, -3583, 1540, 7029, 6817, +-5432, -14598, -2677, 1892, -1795, 792, 4310, 5009, 8135, -2644, -10640, -869, -1965, -379, 8267, 8697, +-3769, -5762, 1490, -139, -4696, -297, 6753, 7255, -5639, -12901, -3628, 1273, -307, 3043, 4902, 5437, +7129, -888, -10393, -641, -946, -2611, 6375, 8789, -3523, -8450, 917, 2841, -7873, -990, 7219, 7051, +-3226, -11836, -5236, 650, 1393, 2708, 6467, 3764, 7277, -173, -9398, -2062, 1800, -4000, 5043, 8328, +-2081, -9624, 999, 4659, -9337, -2594, 6580, 6400, -2601, -9504, -6678, -502, 2834, 2522, 8789, 5387, +5430, 1363, -7170, -1896, 4267, -4235, 3579, 7175, -1642, -10400, -1152, 5547, -9422, -6056, 7021, 7044, +-4326, -7787, -7452, -1470, 2954, 3190, 9911, 5819, 2236, 3207, -4971, -3069, 3350, -2953, 3787, 6670, +-1765, -11936, -2188, 7582, -8394, -8033, 6511, 7332, -4766, -5024, -5823, -4596, 4288, 3376, 12091, 7147, +80, 2173, -1877, -3547, 3576, -1661, 763, 5771, -2734, -11448, -3913, 7224, -6739, -10506, 3369, 8226, +-6048, -3481, -5093, -4516, 3681, 4024, 12056, 9516, -623, 248, 2512, -4045, 1862, 341, 1367, 4170, +-4407, -9037, -5221, 6686, -3542, -12416, 802, 8369, -6491, -2286, -4783, -5886, 4038, 5125, 12421, 11833, +-2905, -2119, 6642, -1849, 119, 2013, 738, 2337, -4359, -7316, -6504, 5074, -1408, -11453, -2325, 6987, +-5246, -1587, -3648, -5732, 3360, 4918, 13129, 11526, -3963, -3411, 9778, 394, -1928, 3449, 1253, 1780, +-6124, -5770, -5200, 1981, -694, -10608, -5473, 4927, -3127, -1707, -3181, -4489, 2620, 6532, 13156, 11266, +-3778, -5519, 10619, 2473, -1785, 1660, 2109, -333, -7593, -3730, -3089, -98, -636, -10325, -7417, 3062, +-607, -1557, -4007, -1980, 190, 8334, 13021, 11340, -3604, -5609, 9742, 6598, -3130, 1364, 3054, -2914, +-8835, -3026, -1112, -1833, -1790, -8154, -9570, -2228, 2425, -1562, -4785, 196, -1144, 10051, 13631, 11296, +-4514, -4635, 7013, 11001, -2225, 1476, 4336, -6012, -10199, -914, 1961, -4229, -3830, -7330, -9262, -5786, +4616, -1140, -4868, 219, -234, 10873, 14770, 9771, -5134, -3663, 4054, 13838, 836, -17, 3622, -6779, +-11419, 83, 3487, -4056, -8100, -7764, -7452, -9485, 4883, 1160, -7301, 530, 2397, 9929, 16550, 8025, +-5144, -2430, 749, 13889, 5153, 540, 2674, -6768, -13243, 546, 5379, -2348, -9887, -8224, -4998, -12379, +3518, 1654, -7122, 1263, 3261, 10599, 17367, 6826, -6067, -142, -500, 12730, 6753, 2989, 510, -7298, +-14943, 2225, 7112, -2925, -12608, -10170, -1990, -12773, -88, 3545, -7045, 1183, 4853, 10612, 17788, 5777, +-6862, 598, -1034, 9601, 10840, 4530, -272, -10279, -14788, 2551, 9332, -2415, -12825, -12156, -1751, -12174, +-2279, 5251, -6244, 826, 2989, 12077, 18912, 5410, -6499, 590, -473, 6648, 13661, 6880, -1647, -11993, +-13998, 2138, 9356, -3496, -12236, -14473, -1266, -10519, -6128, 3605, -2048, -559, 5460, 14072, 17971, 4844, +-7968, 365, 386, 4661, 15464, 9463, -818, -13570, -12106, 3076, 9599, -4147, -11665, -15239, -2566, -8030, +-7875, -501, -219, -2052, 5805, 15515, 17240, 5771, -7496, -1465, 1161, 5416, 14026, 12561, -2783, -13493, +-10860, 4025, 8687, -4068, -9944, -14510, -3186, -6220, -8838, -4635, 4419, -3987, 6290, 14611, 17438, 4538, +-8204, -3561, 2905, 4926, 12435, 15095, -3174, -13014, -12216, 5617, 6215, -5405, -10245, -13225, -5047, -4400, +-7139, -8391, 5115, -3872, 9797, 15678, 18137, 4142, -8214, -4259, 2255, 4712, 10332, 15880, -2298, -12946, +-11761, 5227, 5348, -7002, -9362, -12049, -8460, -3632, -6144, -11038, 5331, -3370, 8334, 18137, 18144, 4810, +-7517, -6658, 2962, 5779, 9756, 15987, 663, -12861, -10474, 6809, 3240, -7974, -8394, -8462, -9414, -4225, +-6327, -11225, 1668, -728, 8586, 18343, 16533, 4446, -8518, -8040, 3283, 7781, 8023, 13167, 3691, -12980, +-7786, 5891, 2483, -9938, -8348, -5435, -7524, -7134, -5289, -11687, -797, 2883, 8946, 19439, 16060, 3523, +-8648, -8578, 3139, 6826, 8454, 11121, 6458, -12131, -6572, 3419, 656, -10193, -7670, -3438, -6927, -10239, +-4875, -9624, -4237, 3261, 8791, 20925, 17407, 3343, -11681, -5851, 2083, 8804, 7409, 9475, 8900, -11028, +-3211, 1734, -912, -10536, -9296, 312, -4770, -13305, -5633, -8963, -8025, 3849, 9348, 19807, 18359, -476, +-12878, -3707, 653, 8675, 6009, 9649, 9747, -9101, -2750, 2330, -2621, -8942, -9375, 2408, -1641, -16187, +-4470, -7186, -9640, 3985, 9640, 19390, 20453, -3380, -13855, -2618, -142, 9055, 4737, 9645, 8742, -6048, +-2997, 2073, -4209, -10449, -8837, 4553, 175, -18915, -3743, -7715, -11516, 1921, 12090, 19551, 21434, -6743, +-14444, -347, -296, 9861, 3575, 9856, 6152, -56, -2086, 462, -5775, -8929, -8951, 6450, 913, -17630, +-5013, -6530, -10904, -133, 10868, 20323, 20473, -7742, -14883, 374, 74, 7679, 4819, 10219, 3516, 1839, +-1872, -2080, -3878, -9099, -7337, 5610, 1307, -17173, -5720, -6908, -9521, -2043, 11736, 21879, 18348, -7996, +-15777, -156, 2237, 5027, 7277, 9066, 2537, 4705, -886, -4349, -3157, -9099, -6077, 6069, 1103, -11218, +-8348, -7945, -7861, -4912, 12699, 22054, 16829, -7774, -16453, -2091, 5255, 3513, 7758, 7239, 1695, 4345, +374, -6391, -1721, -10362, -4203, 5590, -634, -6991, -9296, -9845, -5106, -7025, 12660, 20081, 14350, -6205, +-15476, -1820, 7533, 749, 12337, 5956, 2629, 5382, 917, -7903, -1882, -8947, -3103, 3473, -2609, -3045, +-11177, -10338, -4718, -6918, 11348, 17810, 14119, -5543, -16213, -3435, 8717, 811, 11913, 5987, 3816, 5203, +522, -6158, -1799, -6879, -784, 2178, -1583, -269, -10975, -10975, -2609, -7322, 7044, 16697, 12648, -4370, +-16503, -4797, 6831, 2374, 10041, 6457, 3099, 3172, -801, -3816, -3583, -3759, -430, 1113, -1736, 1567, +-10049, -11581, -2277, -4534, 3395, 15174, 11516, -1772, -17206, -4680, 4945, 5799, 8067, 8823, 4238, 355, +-709, -2354, -6162, -2637, -491, 859, 327, 401, -8252, -11212, -2854, -1214, 1456, 10319, 13365, -2493, +-15381, -5028, 346, 10244, 6060, 10308, 4688, -505, -529, -1859, -4678, -1574, 270, 55, 1383, -1239, +-7126, -12154, -5039, 3104, -3458, 6971, 13423, -1123, -13683, -5256, -1178, 10374, 5552, 10656, 6690, -3140, +-1402, -1850, -3622, -147, -345, 1432, 3142, -3254, -2929, -10618, -4193, 3585, -5471, 3779, 13032, -1461, +-10502, -7013, -1441, 9170, 5542, 11222, 8417, -5134, -1208, -2117, -4492, 220, -1053, 2894, 2924, -5790, +-2362, -9330, -4393, 4347, -7087, 1762, 11794, 60, -7699, -8986, -1315, 5780, 7201, 11964, 9590, -5260, +-1598, -740, -3051, -49, -1222, 5468, 2551, -5890, -802, -8402, -3515, 2285, -7476, -405, 10803, 883, +-4531, -11361, 40, 422, 10027, 12720, 8503, -5507, -2333, -16, -2604, -273, -2575, 7835, 2071, -4570, +-1557, -6610, -3809, 797, -4560, -1062, 6656, 2547, -3438, -8711, -1335, -4035, 11458, 13370, 9052, -4452, +-2905, -119, -1912, -1038, -2267, 9114, -607, -652, -3667, -4947, -3327, -2871, -2468, -658, 3134, 4177, +-2842, -8580, -2625, -6089, 11222, 15405, 7924, -4194, -4244, 2577, -2594, -2658, -1535, 8273, -301, 642, +-4423, -3953, -3335, -5161, 883, -2007, 598, 3521, -715, -5611, -5241, -7238, 9488, 17100, 7514, -2400, +-3991, 2857, -949, -4742, 1606, 5313, 2149, 2154, -5096, -3196, -4792, -6501, 2115, -866, -1975, 1967, +-384, -4182, -7316, -6758, 7439, 17495, 8566, -3617, -2570, 2348, 50, -4850, 1664, 4771, 1916, 4044, +-4111, -3408, -6879, -6302, 3750, -1457, -2342, 2643, -229, -4344, -7554, -6421, 4553, 17281, 8721, -454, +-2914, 1307, 1622, -5660, 1431, 3309, 3764, 3917, -1811, -3031, -9526, -6605, 4891, -1897, -2052, 1718, +-1002, -3687, -6968, -6236, 1970, 16129, 10390, 1215, -4448, 3355, 718, -5038, -257, 4951, 3866, 3559, +1194, -4481, -11918, -6029, 3467, -354, -1814, 1036, -1499, -4080, -6080, -6370, -679, 14831, 10791, 3319, +-2875, 5023, -374, -4796, -2866, 4187, 5039, 3021, 3306, -4812, -14867, -4446, 3064, 2459, -1077, -1215, +15, -6738, -2747, -6292, -3478, 13167, 10951, 3883, -2112, 5692, 1043, -5193, -4636, 4558, 6331, 1407, +6755, -5857, -15914, -3895, 1254, 4084, -771, -273, -2000, -8631, -437, -5489, -6155, 11043, 12005, 6043, +-760, 6041, 2121, -7218, -6002, 4422, 8789, 606, 6784, -5198, -16110, -5629, -22, 7820, 1029, -685, +-2817, -8863, 322, -5357, -5639, 8064, 12875, 5887, 404, 7641, 3928, -8804, -6967, 2333, 10270, 418, +6419, -5590, -15640, -6625, -1395, 8766, 4689, -1695, -2473, -9996, 380, -4961, -6862, 7147, 13012, 4828, +3169, 9308, 3047, -8924, -9839, 3041, 8096, 3996, 4067, -5881, -14462, -8042, -3132, 9232, 7444, -1608, +-3513, -9580, -757, -6053, -6473, 6799, 12158, 6106, 3904, 12182, 3152, -7719, -11324, 4190, 5767, 8460, +474, -5978, -14135, -9773, -2936, 6995, 9664, 772, -4022, -9794, -2883, -5964, -6009, 5784, 8517, 7265, +3910, 12726, 4752, -8276, -12402, 4565, 2231, 12052, -85, -6154, -14598, -10102, -1864, 5198, 10430, 4020, +-5514, -7945, -3639, -7565, -4766, 6129, 7758, 8214, 5100, 13025, 7686, -10243, -9645, 3236, 773, 10288, +2726, -8357, -14041, -11140, -127, 2348, 10968, 6697, -6353, -4786, -6586, -9562, -5028, 5934, 6962, 8189, +6420, 11445, 10262, -12107, -5606, -74, 582, 10112, 4809, -9753, -15179, -11413, 1330, 1394, 11452, 10022, +-5100, -3187, -8194, -9642, -5678, 5187, 7258, 8486, 5972, 9729, 10594, -10753, -4889, -1887, -253, 8217, +6259, -10003, -17913, -10393, 1989, 663, 11777, 10859, -3440, -2967, -8580, -11658, -5857, 4118, 9110, 8072, +7383, 8228, 9881, -7651, -4875, -658, -2027, 6096, 6976, -9010, -21079, -9396, 2337, -1112, 12163, 12342, +-897, -2139, -10362, -11102, -6603, 2739, 11206, 8697, 5832, 7379, 10768, -4510, -5493, 826, -4964, 5000, +6371, -7262, -24016, -10355, 2351, 777, 11436, 11350, 427, -175, -9737, -9896, -6234, -1314, 13859, 10839, +5562, 5607, 8905, -2298, -4557, 1656, -5159, 1576, 4887, -6453, -23920, -9931, 739, 1065, 12532, 10564, +1787, 687, -10539, -8312, -8911, -4194, 15440, 11199, 3090, 5430, 9727, 994, -3404, 1322, -5813, 640, +4310, -5978, -22271, -10646, -1397, 4800, 12982, 10941, 1165, 816, -8785, -7718, -9674, -5257, 15478, 11477, +4655, 3469, 11326, 394, -2280, 1403, -6014, -16, 1922, -7992, -21780, -9666, -2831, 5420, 12076, 12083, +1087, 1591, -5290, -7391, -10750, -7815, 14402, 11301, 4250, 609, 12117, 748, -1062, 2454, -7126, -209, +-429, -7829, -19671, -10306, -5585, 7864, 11179, 13774, 1908, -580, -1843, -7408, -9904, -8236, 13288, 11912, +6252, 316, 12329, 1927, -1679, 4228, -9686, -105, -2044, -10321, -17645, -11048, -6971, 8185, 11035, 15604, +680, -1653, 1171, -5998, -11062, -8184, 10844, 10340, 8537, -1344, 13797, 2019, -1161, 5931, -8824, -647, +-4247, -12277, -16404, -11183, -6641, 8457, 11147, 15638, 1727, -1966, 4484, -3831, -10894, -7764, 7339, 9338, +7980, 588, 12296, 4715, -2280, 5396, -7657, -2078, -4421, -13581, -15698, -12313, -6439, 7761, 12337, 12972, +4303, -4045, 4923, -1375, -8871, -7745, 3774, 8147, 8324, 2848, 10503, 7603, -1707, 4388, -6581, -3544, +-4489, -15943, -14456, -14111, -4612, 7195, 10676, 12609, 5907, -4119, 5551, 718, -7627, -8388, -11, 6048, +8426, 5318, 9991, 7825, -1411, 2183, -3134, -7394, -2240, -15697, -15418, -14793, -2759, 6644, 10102, 12141, +7151, -3540, 4549, 4477, -5449, -8722, -2473, 4300, 7970, 6303, 7399, 10147, -451, -699, -1238, -9797, +-2628, -15688, -15446, -15141, -2209, 5740, 9557, 11165, 8820, -1597, 4703, 5168, -2465, -8937, -4097, 3421, +6928, 7882, 7144, 12732, -892, -2723, -20, -10107, -2929, -15101, -18067, -14336, -3230, 7456, 7856, 10632, +8233, -834, 6259, 5495, 459, -9227, -5854, 2201, 5788, 7168, 7287, 15546, -91, -3913, -214, -9761, +-3198, -13420, -19110, -12570, -4228, 7612, 6831, 9370, 8414, -706, 6939, 6678, 3361, -11191, -6538, 1015, +3825, 5808, 7010, 15946, 1060, -5397, -248, -8747, -5596, -11537, -21336, -9072, -4964, 8353, 4715, 9213, +7269, 1272, 8179, 7185, 5769, -10642, -6745, 1374, 3421, 3605, 10035, 14931, 1489, -6056, -1489, -6981, +-6542, -11687, -23314, -8430, -6179, 8645, 2825, 8169, 6720, 2025, 7946, 9824, 8273, -10427, -7361, 1966, +1049, 2148, 10355, 15147, 4084, -6186, -1375, -6373, -7753, -10866, -22353, -7766, -4945, 5775, 3207, 7002, +6943, 2817, 7674, 10800, 8485, -8556, -7173, 1133, -1477, 1598, 10182, 13042, 5081, -5325, -4034, -3721, +-8733, -11498, -20423, -9220, -1748, 1281, 5174, 5091, 6787, 3241, 8990, 12663, 9739, -8733, -6251, 545, +-4216, 191, 10200, 12392, 6002, -4298, -2939, -3420, -9215, -11776, -18847, -9562, 399, -1814, 6149, 3020, +5279, 3453, 10195, 13759, 10965, -5916, -4877, -156, -7228, 1103, 8431, 9338, 7980, -3279, -5299, -4117, +-10185, -12196, -15914, -8809, 1380, -4484, 4725, 2435, 6775, 4135, 8537, 16062, 10755, -2663, -4957, -509, +-10410, 1964, 6802, 9031, 9078, -2509, -5178, -4389, -9477, -13940, -14564, -9672, 2692, -5488, 2207, 1083, +7371, 4097, 7898, 19818, 11600, 681, -2078, -2424, -11615, 1339, 6222, 7355, 9509, 70, -5372, -5614, +-7979, -14172, -14987, -7655, 1029, -5636, -399, 2328, 4466, 4407, 6572, 22539, 10937, 4878, -1399, -5500, +-11523, 718, 5174, 6014, 9196, 3434, -4816, -9235, -6743, -13346, -14656, -7238, 1339, -5062, -2885, 90, +5382, 3613, 5272, 23311, 11300, 7864, 1271, -9043, -10728, -1329, 3808, 3980, 9119, 6297, -3392, -11523, +-5775, -10983, -15189, -6032, 1768, -4476, -7422, 248, 6986, 2589, 4733, 22056, 14941, 8702, 4097, -12280, +-10010, -2238, 3124, 3215, 8694, 6420, -2533, -11707, -6240, -7216, -16664, -6988, 1797, -4114, -8030, 524, +7536, 1974, 4327, 22706, 19227, 9715, 5835, -14213, -10382, -3656, 1694, 2231, 7191, 8542, -2454, -12761, +-7950, -4878, -14444, -9482, 2272, -3434, -9807, -956, 7655, 994, 4336, 21084, 25568, 11363, 5354, -13438, +-10900, -4281, 899, 806, 6511, 8898, -2775, -11293, -9524, -3806, -12950, -13396, 1339, -1053, -9879, -1833, +7105, 39, 3056, 20204, 27758, 14232, 4074, -10646, -11561, -5108, -815, -584, 5428, 10863, -2795, -11656, +-9887, -2149, -8780, -17545, -115, -1772, -9732, -2523, 6792, 637, 1806, 17858, 29616, 18404, 1684, -8988, +-11208, -6493, -2184, 428, 4500, 10544, -1637, -9139, -10737, -955, -5471, -19197, -2138, -863, -10219, -1629, +5983, 2794, -529, 17790, 29936, 22628, -359, -7114, -9866, -9317, -2890, -1150, 2677, 8445, -348, -8262, +-9637, -1000, -3807, -19160, -5649, -2536, -8207, -7, 4647, 3841, -2832, 17317, 31487, 25593, 1272, -7903, +-7070, -10661, -2274, -1000, 1680, 2994, 2359, -7366, -8534, -2902, -2775, -19461, -9366, -2154, -6331, 11, +3347, 3563, -2531, 17170, 31748, 24525, 4177, -8542, -4399, -11492, -3573, -1020, 1387, 1049, 3899, -5503, +-8951, -99, -3687, -18963, -11437, -4273, -5824, 604, 3573, 3268, -3413, 15559, 30773, 24036, 7505, -8372, +-4766, -10584, -5786, -522, 1360, -2609, 3144, -2590, -7669, 578, -3074, -20508, -12134, -5808, -6309, 3171, +5071, 1510, -1727, 12866, 30117, 22638, 10983, -5531, -7034, -8188, -6240, -505, -170, -4393, 1165, 2202, +-6966, 2199, -4240, -20105, -12328, -6790, -8210, 4476, 7236, -894, -675, 12129, 27720, 22056, 12054, -2741, +-8843, -6711, -7543, -1094, -457, -5626, -2652, 6182, -3486, 855, -2238, -21744, -12563, -7716, -9231, 5995, +8123, -449, 98, 11460, 26273, 19943, 13670, 1034, -9118, -7817, -6246, -3096, -1185, -6305, -5693, 6726, +404, 103, -2839, -21534, -14025, -5751, -9647, 5134, 9356, 1155, -918, 12209, 22626, 18471, 15617, 4058, +-6910, -9443, -3686, -4240, -3164, -6135, -7036, 6867, 4235, -1300, -3922, -20081, -17003, -4465, -11030, 3428, +10917, 1960, -647, 11314, 20033, 16653, 15624, 5009, -5766, -10685, -3060, -4888, -3602, -6299, -5248, 3709, +7577, 973, -5968, -18156, -18598, -4872, -10439, 2487, 11545, 3397, -777, 11345, 18319, 15533, 16086, 5935, +-2696, -10044, -2058, -4578, -6159, -6906, -4505, 1568, 7782, 4360, -8525, -16415, -19208, -6378, -7293, 686, +9879, 6596, -241, 9386, 15764, 16099, 14785, 5903, -1864, -8769, -3641, -2075, -10015, -7083, -796, 879, +6242, 7327, -10095, -14131, -18064, -10386, -2078, -1887, 8445, 9196, 1465, 8315, 13397, 15296, 14969, 5963, +-1401, -5171, -4359, -1894, -12871, -7525, 1023, 578, 2485, 8963, -10253, -15723, -15083, -12503, 180, -2773, +6856, 9186, 3980, 7870, 11162, 15242, 15746, 5935, -1392, -2963, -3399, -2861, -13699, -8081, 3163, -211, +-204, 9821, -8108, -17500, -13353, -13636, 981, -997, 3890, 10196, 3241, 8273, 8454, 12624, 16348, 6419, +-2614, -614, -1824, -3370, -14169, -9191, 4739, 1172, -1417, 7656, -4758, -19272, -11991, -12124, -737, 1199, +1437, 8881, 5500, 7997, 7714, 10574, 16598, 6205, -1699, -2056, 2662, -6192, -13205, -10745, 4499, 3719, +-1552, 2852, -2106, -17621, -13243, -8891, -2197, 4617, -2068, 7625, 6075, 10233, 6576, 7970, 16220, 7273, +-3749, -1306, 5136, -7299, -12851, -11140, 4524, 4703, -1741, -299, -1918, -15273, -13387, -6612, -3198, 6114, +-1210, 4320, 6464, 11237, 7076, 6720, 14215, 8249, -3809, -2597, 6376, -5451, -12851, -10611, 4032, 4565, +502, -3277, -2580, -12196, -15076, -3995, -3037, 6163, 62, 1840, 5961, 10828, 7468, 7800, 12487, 9763, +-4921, -3510, 7612, -4366, -14313, -8413, 1742, 4346, 2533, -4247, -5900, -11263, -14244, -3312, 224, 3695, +2338, -74, 4879, 9679, 7866, 7299, 11074, 9590, -4548, -4390, 7604, -2581, -14846, -6278, 520, 4050, +3898, -5124, -8640, -9645, -12638, -3909, 3303, 1336, 3273, -1922, 5365, 8926, 8669, 7065, 8881, 8296, +-3452, -6299, 6920, -1024, -12083, -5920, 491, 3245, 3986, -3016, -12202, -9949, -8900, -3510, 5290, 849, +2625, -856, 3322, 9334, 6707, 7383, 9967, 6402, -3016, -7933, 4509, 314, -10522, -6298, 614, 1626, +3682, -1555, -12984, -10553, -6268, -2207, 6159, 987, 2614, 642, 2449, 10226, 3767, 8120, 10864, 4558, +-2711, -8745, 2592, 2269, -6360, -7482, 2613, -491, 1247, 263, -14741, -13741, -4335, -409, 6289, 1868, +322, 2230, 511, 9695, 3651, 7963, 11835, 4095, -4407, -8718, 2121, 2953, -4092, -5693, 3484, -806, +360, 317, -13581, -16139, -3598, 2857, 5447, 2329, -860, 1734, 1806, 7734, 2794, 5434, 12046, 4529, +-6625, -9702, 987, 2134, -1555, -4307, 3745, -1178, -1458, -675, -10209, -16720, -4131, 6637, 6982, 2119, +-784, 1578, 4481, 5653, 2972, 4572, 11882, 6138, -10188, -9879, 501, 2534, 7, -1098, 2295, -805, +-2236, -2388, -8159, -16702, -6719, 10839, 7591, 394, -942, 1007, 5851, 3541, 4242, 2110, 10695, 7501, +-11949, -11605, 588, 1485, 1917, 1625, 864, 503, -3279, -3491, -6220, -17297, -7511, 12465, 9575, -611, +-286, 641, 8044, 1654, 4965, 1325, 9335, 7800, -12796, -14034, 202, 787, 3084, 2702, 496, 1331, +-5042, -3202, -8023, -13680, -9938, 14727, 12776, -399, -1316, 786, 8626, 1331, 4810, 2248, 8479, 7061, +-10637, -16082, -1654, 2692, 3313, 3056, 1278, 414, -5585, -4714, -9388, -10839, -11334, 13603, 15651, -530, +-2570, 2797, 8283, 466, 4152, 1613, 7453, 4601, -8008, -17381, -2739, 3046, 5547, 4679, 2610, 834, +-6234, -5995, -11335, -8556, -7889, 9448, 17127, 1310, -4936, 4828, 7165, 1165, 2251, 389, 7908, 3254, +-8597, -15616, -6250, 4375, 6583, 4290, 3152, 1606, -6920, -5754, -12615, -8186, -6066, 7218, 17742, 5192, +-6373, 5645, 7095, 1024, 2192, -94, 8601, 1131, -10129, -14287, -7848, 3719, 6686, 3493, 5941, 486, +-6700, -5924, -12915, -9947, -2288, 6809, 16915, 8009, -6627, 4562, 10366, -1281, 1412, -645, 9751, -2677, +-9553, -12909, -8169, 2248, 7088, 3381, 6308, 1681, -6649, -6367, -12078, -11451, -411, 5896, 15713, 10773, +-6748, 4010, 11572, -2439, 1239, -335, 8034, -2144, -10951, -10553, -8067, 1195, 6414, 3697, 7123, 1923, +-7482, -6158, -10374, -12007, -593, 7281, 13464, 13269, -4283, 2620, 10584, -549, -905, 550, 8048, -3287, +-11132, -11944, -6028, -1050, 5566, 2769, 8595, 503, -5934, -6021, -9747, -11395, -2216, 10555, 12294, 14379, +-1494, 2453, 9042, 1144, -1894, -156, 5418, -3482, -10685, -11978, -4158, -1256, 3530, 1674, 10418, 1053, +-4734, -6056, -9923, -11894, -3409, 9909, 13612, 12938, 1514, 3449, 5139, 4450, -3527, -1126, 3317, -3452, +-11275, -10787, -4977, -515, 1099, 646, 9949, 839, -3071, -5034, -8566, -11238, -4946, 9114, 15536, 12489, +4279, 4276, 2379, 5551, -395, -4315, 2022, -4632, -9518, -9618, -6026, -389, -2479, -26, 10439, -84, +-2635, -2692, -8218, -11462, -6386, 8065, 17742, 12628, 6138, 6283, 433, 4952, 3617, -7381, -526, -5052, +-8532, -7897, -6144, 915, -4389, -1006, 9188, 1708, -1287, -1540, -8025, -12151, -7865, 5896, 19690, 12095, +5866, 8772, -580, 3298, 8852, -10330, -2425, -4742, -6386, -6804, -7777, 503, -5783, -3321, 8988, 849, +514, 651, -5410, -14800, -8203, 5616, 19884, 14577, 6259, 10278, -1290, 1554, 11964, -11028, -5018, -6515, +-3971, -5927, -6133, -1843, -5992, -6011, 7611, 2634, 709, 2230, -6134, -15077, -7727, 4630, 18775, 15580, +5905, 10786, 104, 899, 9973, -9225, -9679, -5243, -4181, -2414, -8334, -3166, -6155, -7139, 7465, 2153, +114, 5217, -4259, -16334, -10125, 5452, 19094, 14887, 8407, 9567, 2293, 2328, 8365, -6284, -11460, -6125, +-2407, 566, -9460, -5726, -5211, -8203, 5337, 4244, 522, 6763, -3195, -18580, -10645, 7078, 18304, 14460, +8750, 7682, 4119, 2624, 5983, -4933, -13442, -7786, -1365, 3492, -8766, -8750, -5770, -7972, 3397, 6623, +-109, 8387, -1548, -18249, -12413, 8842, 17364, 14334, 10554, 7926, 5999, 4732, 2667, -5469, -11106, -10341, +-133, 4335, -7223, -11660, -7713, -7390, 1548, 7447, 701, 9472, 270, -18929, -14029, 8891, 15625, 16116, +9627, 6588, 6063, 5654, 1392, -6583, -8231, -12136, 1494, 3678, -3893, -15525, -10105, -7709, 1747, 6002, +2207, 7488, 3496, -19406, -13318, 9208, 13864, 17367, 9947, 7779, 5435, 7985, 249, -8132, -7984, -10970, +1402, 3100, -1884, -17750, -12034, -8351, 3856, 4781, 4256, 4607, 5251, -19312, -12447, 8164, 11135, 19094, +8762, 8563, 4807, 8423, 1159, -8858, -7573, -8815, 2609, 2437, -2126, -18392, -14113, -8483, 3971, 4150, +5514, 3676, 6334, -17611, -12092, 7386, 9332, 18511, 11411, 7221, 4463, 6945, 1844, -8706, -8627, -5079, +1659, 3555, -4240, -15834, -17138, -8413, 4583, 4422, 6276, 3986, 5479, -15591, -10511, 4708, 9779, 18256, +14935, 8228, 2211, 4290, 2543, -7937, -10553, -2076, 537, 3360, -6607, -12010, -22298, -8889, 1734, 7655, +7213, 3541, 2500, -12875, -8592, 2396, 11261, 14218, 20101, 8140, 2994, 3250, 2721, -5837, -10874, 532, +3425, 1766, -8183, -9887, -24654, -9838, 849, 10017, 5617, 4020, -243, -9652, -8655, -856, 10825, 11574, +22561, 10512, 42, -699, 2775, -4228, -9856, 2125, 5358, -660, -7020, -8688, -25134, -13031, 598, 11309, +7977, 2902, -2739, -6355, -8060, -3127, 12105, 10379, 22665, 12281, -1714, -1286, 578, -2663, -8296, 907, +7350, -3817, -5372, -10112, -22686, -13641, -1121, 12252, 10230, 3457, -3738, -4438, -7504, -3302, 9264, 11917, +22347, 13084, -2300, -2991, -1562, 855, -5493, 1149, 8411, -5619, -3636, -13622, -20481, -17037, -1271, 12555, +12523, 1276, -2446, -3845, -7456, -1768, 6956, 13088, 18183, 15212, -2300, -6145, -2459, 672, -1705, 520, +6880, -4908, -2965, -12829, -20217, -16404, -3768, 12223, 14258, 1261, -2415, -4349, -7131, -1699, 7393, 15033, +17962, 13578, 50, -6609, -3380, 1283, 1950, 706, 3254, -4843, -3326, -12863, -19596, -16060, -7182, 11334, +14499, 1127, -1247, -6658, -6845, -1555, 5442, 15106, 16428, 11213, 2524, -7398, -3881, 1495, 4696, 3360, +-1805, -517, -5100, -10834, -18973, -15100, -9225, 11065, 13563, 4148, 526, -8344, -5912, -1223, 6884, 12941, +16745, 7696, 4311, -6419, -4441, 787, 7398, 4064, -6254, 2349, -5741, -9341, -18456, -14121, -10692, 9540, +12138, 6991, 1075, -11494, -5898, -41, 7650, 11630, 15374, 7089, 4130, -5003, -3590, -961, 8301, 6085, +-9092, 4193, -6746, -9741, -16561, -13444, -10122, 7781, 10989, 11534, 13, -11429, -5164, 192, 8072, 10473, +12744, 7388, 2558, -3278, -2124, -2820, 11820, 5595, -9145, 1897, -5459, -9458, -16271, -14083, -9244, 4364, +10096, 14278, 864, -12267, -7231, 598, 10178, 8731, 12633, 7337, 1436, -2339, -942, -2820, 12316, 5571, +-7709, -2391, -2284, -9264, -14393, -15460, -8903, 1254, 9148, 16967, -354, -11833, -8634, 2920, 11237, 7511, +9901, 7414, 1664, -2018, 1831, -3253, 10478, 6288, -6271, -5015, -1082, -6486, -13670, -15531, -6308, -1888, +8795, 16594, 983, -11841, -10731, 3054, 11035, 5851, 8872, 8886, -583, -1741, 3211, 414, 6385, 6163, +-5106, -8377, 278, -4826, -14142, -15732, -8040, -2914, 10966, 14041, 2259, -12097, -9929, 3880, 9569, 3758, +7774, 8160, -20, 971, 3172, 4891, 1305, 9870, -4618, -7254, -1031, -23, -15791, -14021, -7514, -2754, +9633, 11360, 4356, -11709, -9795, 3632, 7788, 2517, 7593, 6574, 274, 1688, 2293, 7711, -2601, 10032, +-4858, -8408, -1809, 3133, -15995, -14840, -9017, -2349, 10636, 9284, 7796, -12739, -8770, 2128, 5832, 2672, +7501, 4743, 1659, 2764, 3937, 8842, -4654, 10561, -2427, -9915, -1501, 5490, -14788, -15023, -8241, -684, +8629, 7345, 8854, -9814, -8777, -661, 3492, 2241, 8058, 2989, 2271, 3071, 3511, 7564, -3287, 9036, +-579, -11154, -279, 5479, -13687, -17490, -6818, 1083, 7693, 6773, 8052, -7356, -7197, -876, 1053, 2725, +6087, 855, 4626, 3380, 4961, 6208, -1416, 6962, 1179, -12294, -122, 5880, -9737, -18490, -5415, 2175, +4061, 7580, 8021, -5577, -6760, -4502, -652, 2828, 5248, 1732, 4729, 3910, 5294, 5514, 257, 4193, +2494, -13203, -658, 5227, -6716, -20570, -6361, 3521, 1669, 9463, 6394, -1698, -5455, -5599, -2036, 1469, +2357, 2575, 5539, 4399, 4491, 5572, 1359, 3964, 3217, -11222, -2851, 4607, -3424, -20219, -7938, 3311, +-355, 9300, 7640, -927, -3598, -8808, -1351, 532, 1656, 3007, 6006, 5216, 4631, 6278, 1839, 1582, +2156, -7197, -3177, 2114, -729, -19044, -8869, 3797, 258, 5803, 8377, 370, -2047, -10708, -2110, -3243, +-147, 4282, 7690, 6562, 2849, 8387, 3326, 936, 2175, -3558, -4605, 966, 885, -16822, -12568, 3615, +472, 4257, 10216, 1213, -2062, -11223, -2138, -5117, -802, 3595, 6949, 6433, -171, 9535, 4473, -1160, +2340, -2560, -951, 777, 1506, -12796, -13877, 1291, 3172, 2017, 11435, 3503, -3724, -11380, -2570, -6879, +-2717, 3623, 6402, 7796, -713, 10574, 5726, -2786, 921, -351, -1422, -185, -98, -9727, -14776, 229, +5284, -787, 11023, 7708, -4326, -10120, -5034, -7696, -2139, 4182, 5682, 8287, -1761, 11243, 6169, -2338, +388, -1009, -733, 3619, -2713, -8727, -14094, -1194, 6688, -1753, 9404, 9158, -4215, -10103, -6697, -7360, +-4421, 3866, 6895, 7932, 253, 9776, 8939, -1925, -443, -500, -660, 5686, -4553, -6390, -15663, -4926, +6317, 214, 6586, 11455, -4291, -9905, -8520, -7507, -5100, 3651, 5087, 6890, 2488, 7734, 10414, -435, +-394, -471, 874, 7868, -4179, -6351, -12807, -4785, 5605, 881, 4753, 11807, -4728, -9758, -10813, -6207, +-6831, 1626, 6530, 5218, 4941, 4773, 13268, -696, -1225, -108, 2464, 7442, -5417, -7005, -12997, -4994, +5154, 2768, 3736, 11421, -71, -9372, -13298, -5806, -6806, -403, 5856, 3227, 5997, 3020, 12668, 2046, +-1235, -968, 3691, 8861, -2763, -8232, -13298, -4271, 2652, 1882, 3433, 10384, -275, -7514, -14526, -3879, +-6559, -246, 7376, 2087, 5732, 3860, 11659, 4725, -1669, -1097, 4636, 7553, -3442, -9317, -12192, -4274, +1378, 1818, 4351, 8503, 1151, -9371, -14524, -4952, -6677, -1378, 6038, 2333, 5082, 5767, 9406, 7953, +-1845, 1015, 5639, 7535, -2270, -9019, -11520, -4123, 158, 806, 5364, 7512, 433, -8716, -13268, -6423, +-5630, -2362, 5337, 2002, 2667, 7477, 8236, 8098, -1214, 4026, 6739, 6494, -784, -8702, -8617, -5105, +-890, 318, 4374, 8976, -177, -8330, -11496, -7756, -5469, -3787, 3425, 2430, 1486, 8077, 7170, 5450, +-88, 7155, 7866, 5611, -1018, -8573, -7364, -5279, -1343, -183, 2900, 9406, -2618, -8774, -9957, -8907, +-4240, -1939, 2435, 3455, -960, 8568, 8228, 4777, -1287, 10568, 8072, 4999, -1775, -6777, -4708, -7045, +-2634, 1233, 1527, 11128, -4155, -8968, -8375, -10779, -4739, -3028, 320, 1508, -1077, 8231, 9779, 1753, +-631, 13957, 9304, 4238, -2989, -5809, -3901, -6987, -2878, -874, 782, 10883, -3609, -7528, -7235, -11017, +-2866, -2041, 1039, 401, -2154, 9616, 8983, -474, 188, 15885, 10333, 2493, -2711, -3210, -1952, -6899, +-5386, -811, 99, 8349, -3691, -6094, -7817, -10771, -3889, -792, 268, -2431, -420, 10059, 6932, -1561, +496, 18703, 10254, 1186, -1744, -1372, -2051, -6106, -5154, -2352, -152, 7699, -3205, -6046, -7593, -10806, +-3752, -536, 168, -3748, 246, 7922, 7839, -966, 676, 18724, 11330, 662, -1573, 738, -1426, -4528, +-6412, -4189, -379, 5859, -1563, -4598, -6763, -12605, -2162, -1441, -656, -4673, 1480, 7384, 6957, -1647, +1600, 17776, 11835, 393, 806, 960, -2851, -4237, -6748, -5946, 152, 3540, -771, -4437, -5840, -11627, +-2024, -655, -1118, -5900, 3050, 4547, 6652, -2158, 2784, 17779, 10794, 1514, 1664, 1588, -1860, -1738, +-9656, -6006, -1373, 2624, 817, -4594, -5718, -10772, -3201, 16, -2054, -4472, 2153, 4279, 6021, -956, +3830, 17113, 9940, 2783, 3171, 1267, -713, -1591, -8693, -7279, -3464, 971, -922, -4049, -4850, -7234, +-4974, -801, -2130, -3584, 2566, 3018, 6245, -287, 4572, 15672, 8355, 4322, 5177, 640, -1538, -183, +-8382, -7553, -5258, 551, -161, -2570, -5949, -4809, -7766, -505, -2497, -2659, 2190, 2017, 5418, 1339, +6932, 15433, 8380, 5156, 8838, -545, -1237, -1258, -8777, -8401, -7268, -1467, -1040, -2700, -4412, -1975, +-8495, -2989, -4557, -839, 569, 1505, 3467, 2227, 6736, 12848, 8758, 6900, 9346, 652, -890, -767, +-7030, -6191, -9802, -978, -4206, -2645, -2441, -44, -7619, -5939, -5073, 773, 442, 1005, 2664, 2000, +9322, 10830, 8226, 6449, 9512, 1947, -345, -1927, -6802, -6535, -10473, -408, -5623, -1427, -1317, 769, +-5954, -7544, -6183, 1083, -1140, 506, 3351, 3018, 9371, 11118, 6648, 8571, 8363, 2740, 672, -3694, +-5459, -6491, -11692, -2523, -6318, -2260, 704, 1009, -2873, -8494, -6302, 2033, -1029, -1094, 3838, 3617, +11950, 9974, 5386, 10102, 7362, 3111, 2411, -4203, -4838, -7163, -12376, -3250, -8380, -3711, 1523, 643, +-12, -10132, -7606, 1107, -209, -767, 3894, 4235, 13614, 9543, 5629, 11944, 5843, 3600, 3215, -3346, +-4116, -6155, -12621, -6315, -7399, -5076, 3047, 322, -109, -9965, -9009, -403, -420, -2604, 3100, 6542, +13812, 10302, 5791, 12073, 4702, 2910, 5743, -3011, -3977, -5783, -11639, -7764, -6589, -6705, 3176, 1320, +509, -8524, -11188, -3435, -231, -3074, 2643, 8677, 13464, 11418, 6019, 11506, 4727, 2663, 6061, -1559, +-4092, -6412, -11578, -10910, -5623, -7466, 1967, 1739, 2965, -7533, -10234, -4974, -1170, -1559, 1169, 9904, +13600, 12371, 7267, 9745, 2387, 1957, 6081, 503, -3928, -7553, -8965, -12997, -4640, -8753, 365, 3458, +4473, -6482, -11469, -9157, -2694, 566, 204, 11877, 15008, 12480, 8815, 9092, 1005, 3122, 5009, 3453, +-3602, -9419, -8030, -13711, -5688, -9782, -1553, 3559, 5856, -5497, -12086, -11116, -2211, 2164, 293, 11999, +14819, 13633, 10864, 7495, 294, 3009, 3299, 3830, 858, -10249, -7698, -12936, -8357, -8392, -2092, 3735, +6135, -4752, -12683, -12870, -4193, 1975, 2420, 11896, 15347, 14230, 12053, 5067, -41, 4030, 1917, 3086, +2207, -8515, -10548, -10382, -10275, -7412, -2308, 2779, 5939, -2100, -13769, -14329, -3957, 2397, 4662, 11748, +14669, 15714, 12846, 3172, 758, 2812, 1275, 219, 4984, -7735, -12973, -7913, -12684, -7589, -840, 2275, +4311, 396, -13581, -14998, -4995, 813, 6770, 10776, 12604, 17352, 12286, 2784, 2023, 4728, 515, -1402, +4390, -3452, -13570, -6880, -14764, -9169, 1309, 1834, 2255, 1831, -12539, -16675, -3815, 1645, 6245, 13224, +10394, 19776, 10663, 2203, 3046, 4505, -656, -2599, 2780, -1277, -11421, -7839, -13185, -12573, 1572, 1828, +612, 767, -11269, -16869, -3486, 1055, 6569, 15662, 8363, 20692, 11285, 2731, 4519, 5260, -553, -2279, +1262, -314, -7936, -9157, -12853, -13901, 841, 3292, 598, -2314, -9163, -16463, -4790, 3729, 4256, 15032, +7516, 18771, 11749, 2212, 5033, 4815, -1979, -2871, -125, -1286, -1535, -12891, -12150, -13059, -866, 6027, +656, -5302, -8231, -12985, -5309, 4786, 3845, 14633, 8433, 14801, 12969, 3951, 5372, 4928, -3114, -2586, +-976, -2807, 2427, -12516, -13171, -12682, -4097, 6488, -55, -8409, -9681, -9317, -4312, 4855, 4621, 12250, +10316, 12585, 12144, 7584, 5382, 4645, -3288, -4095, -1194, -3964, 3811, -9761, -15886, -12286, -4131, 7413, +1029, -11713, -10796, -4810, -2803, 4199, 6161, 7991, 12523, 10292, 13248, 10167, 4403, 4621, -4379, -3358, +-2250, -3206, 181, -6171, -15383, -13350, -3488, 6730, 966, -13329, -12623, -1359, 929, 3052, 8625, 6365, +11915, 8746, 12894, 13392, 5508, 4054, -4389, -3293, -4816, -1038, -3754, -4257, -13444, -16315, -3942, 4945, +608, -13103, -16067, -1700, 5160, 3326, 7720, 6041, 10215, 8431, 14652, 14450, 8249, 2924, -2586, -3018, +-6210, 905, -7359, -4836, -8467, -18695, -3986, 4591, -866, -12070, -16067, -2854, 8498, 4557, 6357, 5386, +7679, 6671, 17427, 13207, 10055, 1950, -4292, -1847, -7257, 836, -7446, -7657, -5154, -17948, -5759, 6526, +-5546, -10803, -15213, -4824, 9891, 6463, 5607, 6111, 6205, 5194, 20011, 13312, 10643, 2298, -3609, -1453, +-7244, 990, -7349, -11219, -3762, -14896, -8703, 7550, -6360, -11450, -13304, -3628, 8586, 10246, 4135, 6628, +4162, 4416, 20837, 15272, 9739, 2367, -3369, -2507, -6220, -1339, -6871, -13188, -4489, -10306, -10393, 6943, +-7142, -13128, -10041, -4017, 8202, 11946, 4262, 6530, 2739, 5057, 20270, 16806, 9192, 3539, -3845, -768, +-6128, -1268, -6664, -14137, -8556, -6389, -8558, 2225, -6031, -15001, -7243, -4664, 7618, 10841, 6021, 4446, +1550, 6637, 17143, 18150, 9400, 2038, -1830, 124, -4909, -1655, -6736, -13762, -12266, -4126, -4466, -1208, +-5323, -16332, -6056, -1990, 6501, 9509, 7791, 3105, 3, 9175, 14147, 18060, 10018, 646, -1610, 212, +-5862, -1147, -6599, -14140, -13959, -3472, 199, -4335, -6979, -15175, -5954, -94, 7635, 6009, 9414, 1873, +-207, 9701, 13890, 16017, 11552, -525, -522, 946, -5924, -338, -7011, -13445, -14569, -6486, 5645, -4845, +-8921, -13541, -7029, 3827, 7790, 4288, 8369, 2114, -917, 11864, 13658, 12846, 13253, -961, -1315, 1742, +-5469, -749, -6988, -14022, -14880, -8650, 8004, -2854, -12749, -12478, -6528, 5635, 9138, 3615, 5600, 1993, +1671, 12739, 13678, 10524, 12179, 989, -934, 2639, -5195, -1388, -5625, -14394, -13363, -11217, 7546, 16, +-16012, -11707, -4966, 4026, 10871, 3849, 2599, 2594, 172, 12856, 14255, 10418, 10680, 3442, -1840, 757, +-3394, -2177, -5291, -14355, -13201, -11791, 6352, 3261, -17798, -12587, -3474, 5183, 10897, 4887, -1014, 2634, +-539, 12766, 15764, 8981, 8184, 7235, -1422, -1198, -962, -2945, -4573, -13006, -14499, -12377, 4720, 5788, +-18142, -15213, -583, 5650, 10384, 6347, -2707, 307, 1160, 11981, 17728, 7594, 4757, 9489, 710, -3438, +-394, -3575, -3312, -11273, -15273, -12240, 2551, 6336, -15882, -17148, 2271, 5789, 8533, 9267, -3918, -1212, +-12, 11046, 18963, 7785, 1613, 11426, 2824, -5602, 564, -2989, -4428, -8976, -16184, -11561, 1705, 3455, +-13714, -17247, 3229, 6846, 8181, 7666, -2120, -2791, 374, 10831, 19220, 9141, -54, 11393, 6436, -8199, +684, -2110, -5326, -7103, -16066, -12366, 594, 1309, -11881, -16535, 2565, 9482, 6966, 6830, -258, -5752, +-147, 8557, 18443, 8776, -641, 11031, 8912, -8037, -782, -331, -4930, -4814, -14764, -11862, -1339, -604, +-10453, -14072, -784, 11576, 7564, 3395, 2437, -6835, -228, 8407, 18188, 9868, -1935, 9459, 10312, -4402, +-2916, 52, -6469, -5164, -13012, -11461, -2532, -2252, -11875, -8787, -2194, 13064, 7317, -283, 4072, -6671, +-1605, 7191, 14959, 10001, -1108, 9467, 10893, -3234, -3484, 165, -4502, -4141, -12086, -10577, -4218, -5067, +-10044, -5611, -1727, 11193, 10016, -2997, 6089, -6404, -2100, 7437, 10865, 10027, 104, 8023, 10613, -1481, +-3753, -2332, -4291, -2815, -11322, -9459, -3759, -8251, -9792, -3697, -405, 9684, 11999, -4215, 4080, -2631, +-4063, 8610, 8984, 11203, 1233, 6140, 10879, 871, -2431, -3074, -4342, -4552, -9558, -9285, -5154, -11760, +-7924, -2441, 1732, 7410, 13243, -3937, 211, -3001, -3677, 7355, 5825, 11688, 3471, 4902, 10137, 2420, +-1082, -3661, -4589, -1188, -10471, -7264, -6196, -12020, -9621, -1611, 5106, 4695, 13239, -1160, -3574, -1348, +-3232, 6346, 3996, 10526, 4935, 5917, 10299, 2832, -162, -3885, -5716, -1482, -9303, -6763, -7661, -13969, +-8944, 342, 6171, 3971, 12323, 704, -5842, -1106, -2965, 6808, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10439, -7700, -4775, -6378, -1023, +7488, 4696, 3523, 4024, 9924, 9823, 3695, 8883, 5966, 7349, 9065, 9294, 1280, -6835, -8942, -12221, +-11160, -9976, -9364, -9320, -5389, -5313, -6213, 3017, 7674, 3380, 2851, 6003, 11936, 6866, 2693, 7989, +5300, 9078, 9425, 7420, -536, -8202, -11087, -12536, -9710, -9204, -8947, -7254, -4683, -7229, -4426, 6735, +6564, 3066, 4050, 8305, 12310, 2831, 3678, 6479, 5388, 9378, 8460, 6043, -1695, -10609, -13240, -12175, +-9285, -9021, -6649, -4953, -5701, -7871, 195, 8374, 5098, 4126, 5200, 10525, 9217, 172, 4085, 6140, +6651, 9448, 7614, 5160, -3920, -13235, -13918, -11143, -9524, -7738, -4345, -5097, -7526, -7268, 4297, 7239, +4937, 3948, 7976, 10666, 6455, -1315, 5105, 5633, 7584, 9407, 5916, 3608, -6680, -14490, -13338, -9659, +-9254, -4941, -3560, -5342, -9177, -3316, 6693, 6140, 4457, 5794, 9381, 8873, 3105, -1193, 5349, 5523, +9440, 8872, 4505, 1989, -10236, -14860, -12259, -9647, -8057, -2078, -4111, -7402, -8520, 1208, 7623, 5714, +4350, 7722, 9005, 7383, 64, -142, 5049, 6246, 10256, 7470, 3064, -585, -12018, -15097, -11206, -9787, +-4947, -1632, -6008, -8262, -5549, 4864, 7158, 4751, 5863, 9023, 7269, 5788, -2189, 1208, 4742, 7695, +10516, 5154, 1516, -2805, -14060, -14516, -10377, -8984, -1750, -2797, -7184, -7722, -2337, 6512, 6113, 4892, +7979, 8199, 6177, 4530, -3177, 2814, 4475, 9745, 9779, 3129, 61, -5379, -15795, -13096, -9852, -6433, +-186, -4615, -7730, -7268, 1776, 7035, 5670, 6477, 8387, 6099, 6719, 1159, -3074, 3644, 4744, 11232, +8082, 849, -1223, -7851, -16342, -11850, -9240, -3306, -52, -5931, -7192, -5205, 4364, 6706, 6434, 7087, +7907, 4947, 6749, -2408, -735, 3104, 6047, 12164, 5183, -944, -2596, -10956, -15500, -10449, -7878, -921, +-1052, -6145, -7593, -2896, 6018, 6687, 6436, 7356, 7012, 6197, 5049, -3871, 1334, 1957, 8858, 11540, +1921, -2022, -5503, -11818, -14044, -9199, -5930, 574, -1781, -6266, -7478, 729, 7181, 6299, 5669, 6950, +6280, 6396, 2240, -3900, 1990, 2179, 11902, 8204, 236, -3922, -7798, -12020, -13093, -8100, -4119, 1857, +-2637, -7774, -5245, 4657, 7509, 5314, 5119, 7526, 5936, 6675, -711, -1864, 1064, 4732, 12378, 4288, +-1068, -7133, -7727, -12035, -12092, -6258, -1676, 2868, -4193, -8355, -1537, 6772, 6473, 3788, 5866, 7403, +5864, 5320, -2820, -871, 720, 8431, 10607, 2237, -3423, -9415, -6544, -13581, -9866, -5151, -107, 2184, +-6121, -6998, 2334, 7418, 4719, 2581, 6862, 7502, 6255, 3127, -3387, -514, 2463, 10793, 7490, 446, +-7173, -8666, -6858, -14133, -8025, -3738, 1533, 1199, -8566, -3676, 4768, 7008, 1800, 3458, 8551, 6842, +6255, 575, -2975, 94, 4914, 10845, 4365, -2744, -8770, -6801, -8203, -12126, -5388, -2756, 3103, -1431, +-8168, 488, 6517, 4641, -122, 5347, 8677, 5541, 5573, -1338, -2037, 1470, 7109, 8940, 490, -5961, +-9391, -6333, -8913, -9915, -3626, -1430, 4200, -4171, -4912, 3254, 6770, 1224, 243, 7927, 7396, 5552, +4234, -2694, -424, 2798, 7312, 6028, -2967, -7695, -8889, -5872, -8861, -7444, -2862, 240, 3003, -4463, +-1587, 4865, 5193, -1799, 2967, 9029, 6057, 6139, 2469, -1939, 757, 3845, 6991, 2876, -5723, -8767, +-8537, -5250, -8351, -5061, -1605, 1796, 1913, -2665, -263, 5427, 1595, -2284, 5848, 8218, 5464, 6270, +786, -1275, 1416, 3719, 6289, -921, -8092, -9087, -7236, -5610, -6966, -3290, -611, 1930, 2867, -2087, +1201, 4428, -2073, -817, 8208, 6294, 6076, 5421, -359, -541, 980, 4477, 5142, -4655, -9257, -7544, +-5985, -5392, -5452, -2248, -1107, 3437, 3869, -2602, 2678, 1217, -4085, 2829, 8166, 5749, 7738, 3961, +-546, -893, 878, 5189, 2650, -8055, -8666, -6161, -5818, -4513, -3542, -1925, -612, 6764, 3022, -2198, +2039, -2755, -3188, 5400, 6992, 6872, 7816, 2508, -1062, -1629, 967, 6111, -1702, -10117, -6114, -5121, +-6084, -2681, -3059, -2505, 2531, 8296, 1193, -1312, 117, -4914, -795, 6164, 6401, 7841, 6405, 831, +-2545, -2214, 2422, 5251, -6067, -9308, -3986, -6162, -4589, -1626, -3541, -885, 6654, 7554, 753, -1503, +-2088, -5978, 1728, 6439, 7283, 8009, 5378, -1084, -3656, -2320, 4410, 2853, -9372, -6143, -3586, -7000, +-2075, -1668, -4405, 2791, 7471, 5994, 27, -2305, -4707, -4854, 3836, 7141, 7688, 8116, 3298, -4099, +-4495, -808, 5393, -2115, -9032, -3248, -5248, -5258, -211, -3332, -2130, 6789, 6040, 5819, -1378, -3259, +-6499, -2812, 5291, 7691, 8373, 7032, 65, -6178, -4363, 1360, 4484, -5873, -5842, -2720, -5604, -2780, +482, -3980, 2512, 6562, 5171, 4581, -3166, -5218, -7541, 613, 6646, 8034, 8149, 5430, -4227, -7041, +-3066, 3395, 1710, -6116, -3290, -3944, -4724, -700, -146, -2162, 6014, 4589, 5636, 2631, -4324, -7573, +-5343, 3007, 7627, 7501, 8577, 1149, -7764, -6003, -1297, 3846, -188, -4027, -3062, -4102, -4257, 860, +-1117, 2155, 5394, 4394, 4730, 858, -6478, -7922, -2576, 5411, 7824, 7695, 7776, -5160, -8136, -5040, +309, 2760, -303, -3541, -2917, -5035, -2276, 1081, 642, 4215, 4097, 4597, 3206, 20, -8199, -6095, +-157, 6948, 7147, 8210, 3531, -9761, -7030, -4211, 1310, 3492, -267, -2933, -3867, -5132, -420, 2170, +3101, 3508, 4577, 3275, 2131, -1159, -8398, -3495, 2131, 7056, 6285, 9017, -4111, -10820, -6106, -3794, +2227, 3838, -921, -3027, -5265, -3313, 560, 4491, 2895, 2979, 4287, 1269, 1802, -1940, -6901, -1515, +3686, 6087, 7083, 5420, -10197, -8345, -6552, -2494, 4758, 3831, -915, -3975, -5253, -1353, 3298, 5455, +1587, 4017, 2014, 124, 2476, -2592, -4611, -160, 4360, 4878, 7657, -1416, -11510, -7136, -7163, 1108, +5471, 3069, -1373, -5473, -3385, 563, 6043, 3991, 1525, 2756, -802, 161, 2105, -1334, -2694, 516, +4640, 5207, 5523, -7071, -9526, -8861, -4664, 5148, 4481, 2933, -2783, -5546, -1717, 3188, 7602, 1746, +2798, -118, -1674, 1273, 1915, -527, -2470, 953, 2989, 4631, 1012, -10307, -9145, -9436, 415, 6116, +4407, 2416, -4787, -3405, -546, 7239, 6384, 1683, 1524, -2361, 146, 1624, 2494, 1603, -2902, 1044, +2299, 4694, -4005, -11099, -10274, -7192, 4511, 4941, 5330, 240, -4235, -2252, 2182, 8965, 4581, 1208, +-1235, -2337, 1781, 1170, 4205, 1869, -3791, 461, 1306, 2833, -9019, -10803, -10492, -2663, 6066, 4953, +5290, -917, -2599, -2046, 6089, 8427, 3027, -822, -3442, -1067, 1974, 1558, 6182, 758, -3815, -607, +1830, -858, -11593, -10836, -9004, 2019, 6278, 4854, 4748, -461, -3298, 680, 8858, 6657, 1208, -2907, +-3644, 293, 1525, 2586, 7374, -869, -4015, -781, 2274, -6271, -12837, -10967, -5502, 4927, 6207, 4438, +5436, -861, -3277, 5528, 8732, 5019, -1135, -4146, -3307, 934, 807, 4375, 5965, -2499, -4056, 97, +376, -11049, -12232, -9540, -1865, 6858, 5338, 4902, 5867, -3786, -577, 8664, 6667, 3400, -2648, -5091, +-1869, 1204, 1345, 6237, 3546, -2581, -3593, 1689, -4985, -13351, -11312, -7457, 1675, 8204, 3746, 7147, +3817, -4925, 4982, 8252, 5654, 1893, -3883, -4957, -384, 555, 3254, 5447, 1447, -2372, -2677, -498, +-9822, -13392, -10018, -4712, 5464, 7554, 4050, 8420, -307, -2339, 8951, 6037, 5529, 31, -5173, -4048, +-422, 376, 4979, 2809, 811, -928, -2584, -3534, -12125, -12353, -8243, -1461, 7671, 5982, 4184, 7284, +-3624, 3144, 8320, 5387, 5659, -2417, -4884, -3099, -634, 2400, 4771, 574, 2169, -1561, -3987, -6741, +-14224, -11538, -5794, 1567, 8772, 3905, 5421, 4646, -2353, 8042, 5776, 7774, 3478, -4177, -4164, -3828, +-200, 3988, 2993, 66, 3038, -2875, -5628, -9782, -15127, -8641, -3980, 5315, 8149, 2091, 5980, 1879, +1582, 8494, 5068, 9590, 204, -4200, -4531, -4041, 1675, 4219, 1001, 482, 2853, -4056, -7516, -12980, +-13266, -6885, -1474, 8654, 5402, 1917, 6028, 1840, 5194, 6544, 7116, 8690, -2318, -4016, -6521, -1859, +3350, 2642, 326, 1486, 1474, -4788, -9862, -14952, -10605, -5161, 2813, 8422, 2513, 2203, 5940, 3376, +6095, 6027, 9681, 5776, -3581, -5594, -6433, 730, 3445, 1252, 795, 390, 1021, -7262, -13292, -14211, +-8522, -2870, 6477, 6342, 433, 3613, 6614, 4472, 5795, 7444, 10312, 2387, -4324, -7402, -4358, 2586, +3008, 1054, 277, -187, -369, -10592, -14899, -12558, -6286, 1365, 7556, 3080, 163, 5363, 6808, 5213, +6255, 9196, 9488, -112, -6657, -7501, -1704, 2756, 3109, 776, -1741, 474, -2847, -13762, -14229, -10124, +-2923, 4744, 6070, 410, 1675, 6599, 7015, 5556, 7733, 10340, 7641, -3558, -8154, -5838, -284, 3841, +3054, -1249, -1893, 739, -7743, -14593, -13269, -7628, 909, 6158, 2794, -205, 3389, 6924, 7161, 6730, +8582, 10554, 4418, -7029, -8157, -3847, 1074, 4617, 1644, -3226, -501, -1912, -10943, -14336, -11540, -3323, +3815, 4675, 740, 788, 3919, 7396, 7979, 7912, 9800, 10546, -44, -9211, -6210, -2847, 3025, 4669, +-628, -4174, 1009, -7352, -12203, -13764, -8420, 1020, 4399, 2497, 207, 2134, 3638, 8477, 8050, 8363, +10714, 8784, -5173, -8610, -5061, -868, 5038, 3610, -3744, -1833, -1568, -12204, -11593, -13023, -3738, 3428, +3423, 1011, 1382, 2304, 4835, 10182, 7972, 9307, 11383, 4145, -8666, -7065, -4242, 1967, 5583, 623, +-4834, 102, -6803, -13692, -11254, -10406, 788, 3426, 2107, 462, 1552, 2548, 7185, 10515, 8440, 10545, +10714, -1632, -9378, -6382, -2251, 3565, 4685, -2073, -3050, -863, -12189, -13874, -10248, -6129, 3647, 2494, +1550, 249, 1940, 3294, 9420, 9938, 9658, 11710, 7744, -6499, -8409, -5195, 293, 4631, 2269, -3240, +-1172, -4620, -15684, -12991, -7724, -2265, 4113, 2318, 1261, 85, 2124, 5155, 10283, 9252, 11097, 11611, +2480, -9160, -7076, -3602, 2575, 4392, 66, -2511, -812, -9367, -17407, -11044, -4686, -440, 3774, 1477, +40, 239, 2794, 7102, 10369, 10162, 12250, 10137, -2812, -8777, -5745, -1353, 2909, 3836, -2576, -503, +-3176, -13321, -17827, -6852, -2415, 1086, 4079, 294, -543, 1190, 4132, 8853, 10526, 10971, 12825, 5745, +-6555, -7953, -3952, 273, 3510, 1729, -2665, 830, -7603, -15592, -16615, -2613, -1831, 3329, 2677, -723, +284, 2057, 5354, 10648, 10307, 12264, 11684, 196, -7905, -6562, -1945, 735, 4259, -1123, -769, -700, +-11461, -17464, -12752, -1019, -737, 4307, -335, -390, 912, 2392, 7428, 11104, 10107, 14191, 7776, -3501, +-7238, -4627, -1235, 1985, 3013, -2689, 1646, -5165, -13928, -17252, -8675, -370, 1831, 3085, -1625, 1083, +1271, 3749, 9765, 10788, 11411, 13312, 2974, -5514, -6094, -2812, -703, 3086, 593, -1640, 1446, -8932, +-15529, -15701, -5964, 672, 2576, 206, -734, 1727, 2179, 5218, 11271, 9935, 13235, 9530, -570, -6116, +-4279, -2199, 396, 3433, -2235, 640, -1131, -11938, -15570, -12309, -3961, 1936, 1239, -771, 398, 1946, +2911, 7184, 11109, 10929, 13089, 5136, -2145, -5775, -2812, -1571, 2276, 687, -1881, 1681, -5355, -13597, +-14298, -9504, -2134, 2124, -1185, 293, 878, 2270, 4554, 8803, 10607, 12594, 10186, 2377, -3353, -4906, +-1527, -165, 2455, -1933, 560, -671, -9063, -14341, -11220, -8220, 134, 210, -1857, 1689, 573, 3428, +6564, 9444, 11063, 12575, 5960, 1414, -5265, -2940, -823, 1035, 1063, -1685, 2281, -4782, -11379, -13382, +-8980, -6785, 1404, -2484, -223, 2333, 779, 4862, 8120, 9576, 12319, 10153, 4050, -97, -5770, -606, +-566, 1952, -1040, 469, 779, -8549, -12552, -10936, -7997, -4805, 536, -3198, 1510, 2213, 1975, 6604, +8585, 9920, 12679, 6389, 4205, -2810, -4106, 521, -423, 759, -1695, 1734, -2907, -11663, -11568, -8934, +-7555, -3707, -1937, -2023, 2570, 2327, 3668, 7322, 7885, 11252, 10435, 4243, 3817, -4187, -1367, 658, +122, -2, -317, 2046, -7509, -12299, -9080, -7878, -6226, -3525, -3576, 22, 2391, 3046, 5149, 7546, +8189, 11936, 7293, 4112, 3012, -3943, 589, 346, 400, -522, 2102, -1358, -11287, -11049, -7710, -7704, +-5096, -4831, -2972, 1297, 2285, 4195, 6182, 7693, 7913, 11537, 4627, 4307, 1831, -2991, 1209, 283, +-241, -46, 2642, -5917, -12430, -9063, -6462, -7861, -4519, -5772, -1666, 1989, 3103, 5325, 7219, 7521, +7190, 9758, 2930, 5407, 246, -1162, 1582, -214, -720, 2087, 211, -9939, -11461, -7289, -6635, -6765, +-4381, -6324, 94, 1680, 4374, 6527, 8464, 6365, 6302, 8019, 3172, 5823, -225, 759, 1220, -781, +283, 2910, -4256, -11545, -9698, -6436, -6683, -6048, -4578, -5602, 1219, 1549, 5688, 7254, 9407, 3405, +5192, 6342, 3696, 5287, -660, 2316, 331, -956, 2218, 1398, -8508, -10631, -8402, -5585, -6520, -6172, +-3690, -4077, 616, 2136, 6920, 8178, 9308, 549, 5591, 5345, 5606, 4841, 149, 3570, -955, 279, +3584, -2259, -11049, -9373, -7703, -5465, -7596, -5452, -2343, -3476, 201, 4121, 7783, 9963, 6163, -1023, +5809, 4712, 7270, 3066, 1887, 2705, -1899, 1917, 2986, -7220, -10842, -7908, -6554, -5461, -8372, -3709, +-847, -3913, 182, 5087, 9170, 10125, 1418, -957, 5105, 5003, 8489, 2938, 3172, 1079, -519, 3434, +197, -10095, -9372, -7242, -5188, -6772, -8387, -942, -386, -4945, -64, 6624, 10922, 7249, -1050, -897, +4189, 7123, 8839, 3449, 3454, 251, 1147, 3486, -3699, -11075, -7597, -6120, -4507, -8895, -6109, 1233, +-1343, -5211, 158, 9097, 11015, 3341, -2514, -1334, 5011, 7913, 9304, 4341, 2329, 501, 3335, 1506, +-7808, -9601, -6740, -4964, -5228, -10417, -3045, 1432, -1766, -5869, 584, 12388, 8465, 444, -3185, -600, +6580, 9400, 9929, 3626, 1160, 1838, 3725, -1618, -9831, -8220, -5880, -4281, -6798, -10094, -83, 948, +-1370, -7425, 2727, 14181, 3833, -1288, -3914, 946, 7669, 11773, 9839, 2589, 1790, 3592, 2440, -4463, +-10328, -6414, -5207, -4158, -8780, -8118, 1833, 501, -2151, -7961, 6720, 12201, -332, -2099, -4359, 2500, +9634, 13002, 8489, 1869, 3046, 3355, 618, -7207, -9410, -5615, -4487, -4748, -9829, -5499, 2969, 90, +-3891, -6410, 10045, 7026, -2057, -3031, -3547, 4358, 11913, 13724, 6276, 2226, 4288, 2416, -855, -8877, +-8053, -4589, -4329, -5544, -9674, -2414, 3210, -1141, -5885, -1828, 8820, 1855, -2660, -3232, -1983, 6389, +14093, 13014, 4507, 3516, 3639, 1767, -2848, -10357, -5940, -3961, -5011, -6166, -8057, 375, 2493, -2686, +-5481, 3205, 3273, -949, -3031, -2478, -614, 8467, 16043, 12018, 3384, 4853, 3124, 1261, -5662, -9639, +-4257, -4988, -4649, -6334, -6103, 2093, 729, -4703, -1939, 4395, -2791, -1261, -3083, -1401, 612, 10317, +16342, 9372, 3428, 5459, 1729, 861, -8116, -7977, -3765, -5179, -4582, -6289, -2946, 2547, -1453, -4699, +2504, 1021, -6974, -1241, -2915, 385, 2518, 12349, 16632, 7568, 4665, 4494, 1647, -825, -9979, -6244, +-4177, -5581, -4727, -5570, -11, 1298, -3586, -2354, 4644, -4557, -7871, -1944, -1164, 2330, 3801, 14441, +15993, 6289, 5330, 3023, 2044, -3463, -10031, -5067, -4568, -5553, -4749, -3511, 1263, -1398, -4329, 1630, +2062, -8079, -7814, -2454, 1204, 2967, 5639, 16128, 14593, 6292, 5379, 1831, 2309, -6261, -8789, -4148, +-5088, -5082, -4078, -1214, 409, -3967, -2815, 3778, -2970, -8695, -8286, -1183, 3303, 3841, 7660, 16560, +13181, 6459, 4509, 1826, 1486, -8932, -6441, -4429, -5316, -4089, -2434, 84, -1733, -5204, 405, 2085, +-7129, -8307, -9237, 490, 4389, 4770, 9722, 16521, 12270, 6953, 2797, 3064, -1804, -8864, -4652, -5457, +-4770, -3065, -966, -506, -3777, -4146, 2741, -2663, -7979, -8848, -8772, 2162, 5106, 5949, 11007, 15987, +11763, 6090, 2708, 2986, -5486, -6193, -4908, -5951, -3495, -1947, -107, -2414, -4918, -1487, 1671, -6663, +-6714, -9367, -6882, 3910, 6768, 6536, 12424, 15653, 11195, 4505, 3691, 262, -6171, -4074, -6704, -4809, +-2253, -1382, -439, -3796, -4473, 865, -2466, -7628, -7344, -9579, -5297, 5795, 6801, 7050, 13666, 15343, +10405, 4399, 4082, -3059, -4919, -3993, -7564, -3035, -2053, -1297, -1159, -6004, -2175, -141, -5660, -7466, +-7879, -8365, -3282, 6867, 6497, 8517, 13660, 15030, 9735, 4262, 2387, -4615, -3534, -5040, -6394, -1117, +-2340, 250, -3261, -5596, -97, -3874, -6774, -7793, -8237, -7095, -1486, 7083, 6454, 9663, 13613, 15736, +8643, 4121, 732, -5006, -2930, -5675, -4313, -852, -1865, 729, -6094, -2608, -1659, -6906, -6126, -8775, +-7544, -5266, -250, 6706, 7068, 9736, 14960, 15828, 6953, 3899, -1062, -5441, -2568, -5393, -2820, -1799, +18, -1290, -7306, -32, -5878, -6667, -6869, -8763, -5835, -3510, -553, 7196, 6991, 9556, 17170, 14699, +5640, 3831, -2786, -4854, -1375, -5142, -2063, -1644, 1976, -5546, -4366, -2222, -7918, -5966, -8506, -7764, +-3889, -2800, -380, 8412, 5673, 12451, 18692, 13390, 4762, 3409, -5006, -3035, -1372, -4805, -2250, 268, +284, -7575, -2046, -6207, -6604, -7383, -8323, -6337, -2281, -4273, 822, 7738, 5066, 16126, 18305, 11646, +4252, 1744, -6081, -123, -2731, -4171, -1527, 2300, -2723, -6147, -3399, -7430, -5751, -8801, -7218, -4728, +-2817, -5239, 2203, 5382, 7466, 19125, 18112, 10036, 4397, -606, -4410, 1350, -4809, -3434, -12, 2285, +-5320, -5195, -6853, -6278, -6651, -8353, -5795, -3569, -3251, -4937, 2398, 4397, 11544, 20580, 16353, 8078, +3576, -2203, -2051, 233, -6065, -2013, 1844, 701, -6954, -6090, -8185, -5326, -7806, -7161, -5124, -3452, +-4873, -4547, 2175, 5374, 16164, 20995, 14404, 7138, 2917, -2652, 350, -2665, -5890, -404, 2960, -1819, +-8128, -8094, -6615, -5832, -7424, -5956, -4557, -4513, -5051, -4529, 2015, 8048, 20190, 19182, 12456, 6463, +2007, -1292, 488, -4848, -4455, 1673, 3300, -4718, -9993, -8670, -5551, -6283, -6174, -5766, -4933, -5027, +-6211, -4583, 3350, 12324, 22305, 16407, 11576, 6173, 2141, -849, -764, -6166, -2414, 4031, 1727, -7688, +-11305, -8241, -4647, -5907, -5612, -6047, -5144, -6546, -7226, -3335, 5463, 17395, 21713, 13704, 11718, 6420, +1750, -1120, -2533, -7259, 318, 5465, -2051, -10107, -12316, -6549, -4005, -4909, -5436, -5943, -5988, -8442, +-6916, -2343, 8758, 20656, 18620, 12421, 12808, 6943, 1181, -1423, -4473, -5812, 3959, 4651, -4838, -12635, +-11829, -4317, -4279, -5004, -5698, -7195, -7723, -8990, -6028, -235, 14287, 21460, 15113, 13491, 13579, 6371, +202, -2752, -7129, -2322, 5614, 2052, -7987, -14215, -9366, -2030, -4686, -4961, -6909, -8501, -9919, -9105, +-4325, 3047, 18445, 18746, 13653, 14660, 14206, 5066, -514, -5016, -6628, 1766, 5004, -529, -11005, -15010, +-5766, -1967, -5329, -5253, -8781, -10875, -10947, -7359, -2752, 8086, 20516, 15910, 14632, 15805, 13730, 3477, +-1487, -7478, -4036, 4200, 2678, -2953, -14263, -12241, -2519, -2678, -5101, -6429, -10883, -11737, -11069, -5248, +-469, 11991, 19044, 14995, 15261, 15736, 13340, 2162, -3670, -7071, -411, 3541, 860, -5959, -15982, -7291, +-2303, -3917, -5040, -8949, -12654, -12296, -10236, -2602, 1799, 14544, 17588, 16157, 14903, 15905, 13052, -34, +-5315, -4679, 1166, 1771, -422, -10153, -14359, -3471, -3740, -4271, -5941, -11928, -13255, -12303, -7882, -30, +4248, 16017, 17407, 16686, 13331, 16608, 12134, -3687, -4209, -2272, 1175, 716, -2117, -12819, -9603, -2143, +-5144, -4480, -7786, -14650, -12909, -12466, -4320, 650, 6556, 17356, 17842, 16067, 12523, 18475, 9610, -5476, +-2004, -1203, -362, -820, -4562, -13574, -5919, -3337, -6232, -4999, -10721, -15667, -13450, -10385, -955, 493, +9344, 18568, 17952, 14271, 12718, 19027, 6426, -5239, 337, -1925, -1474, -1608, -6174, -12269, -3177, -5536, +-6811, -6452, -13508, -15975, -13280, -7160, 444, 784, 12935, 19449, 17288, 12852, 13608, 19256, 3556, -2968, +228, -2369, -3111, -1054, -7905, -9846, -3279, -7276, -7902, -9070, -15257, -15733, -12643, -3250, 239, 2764, +16554, 19522, 15930, 11487, 14962, 18103, 2032, -1367, -803, -3523, -3694, -292, -9485, -7485, -4371, -9514, +-8370, -11152, -15961, -15718, -9727, -863, -540, 7030, 18020, 18823, 14247, 10675, 16094, 17073, 1639, -1399, +-1907, -4447, -2042, -370, -10123, -5817, -7870, -10474, -9771, -13222, -16390, -14455, -6293, -464, 1009, 11504, +18396, 18428, 12487, 11125, 17475, 16167, 768, -1960, -3049, -5079, 978, -2676, -9518, -5750, -10885, -11303, +-10667, -14754, -16050, -12466, -3413, -762, 3827, 13626, 18605, 16566, 10433, 12556, 18790, 14499, 46, -2900, +-4140, -3331, 2838, -5182, -7871, -8320, -13680, -11443, -12199, -15885, -15706, -9517, -1501, -127, 6405, 15397, +18126, 14093, 10298, 14700, 19535, 13052, -1332, -3648, -5004, 99, 2599, -6680, -7834, -12277, -15260, -11872, +-13849, -16095, -14254, -6242, -200, 773, 9272, 17194, 16406, 12275, 11416, 16465, 19405, 10104, -2694, -5095, +-4002, 3477, 840, -6990, -9575, -15389, -15548, -12408, -14855, -16062, -12053, -3419, 46, 2125, 11810, 16386, +14620, 11658, 13185, 18294, 18304, 7046, -3699, -6138, -800, 5388, -1355, -7509, -13561, -17087, -15277, -14234, +-15643, -14579, -9179, -1157, 2015, 4393, 13561, 15462, 13076, 11697, 15410, 19024, 15858, 4947, -4931, -5239, +3168, 5291, -2825, -10390, -16508, -17565, -16111, -16065, -15170, -13263, -6132, 724, 3210, 6793, 14291, 14366, +12658, 13243, 16943, 19188, 12775, 2813, -5989, -3054, 6111, 3880, -4845, -13913, -18343, -18374, -17438, -16831, +-14598, -10394, -3442, 2334, 4964, 8510, 13453, 13646, 12393, 15076, 17916, 17922, 9895, 905, -6110, -36, +7811, 1626, -7894, -16927, -19087, -18866, -18893, -16744, -13169, -7339, -1350, 4761, 5937, 9558, 12804, 12532, +13084, 16153, 18144, 15591, 7614, -410, -4296, 3008, 7869, -1291, -11332, -19886, -18777, -20647, -20124, -15544, +-11050, -5087, 1781, 6338, 6314, 11141, 12252, 11611, 14626, 17195, 17194, 12994, 5764, -514, -3347, 6309, +5599, -4332, -14748, -21389, -18838, -22591, -19536, -14268, -8564, -3529, 5950, 5935, 7273, 11587, 11893, 11465, +16483, 17420, 16430, 10472, 5732, -792, -1595, 8588, 1869, -7195, -18549, -21508, -21011, -23114, -18417, -11741, +-7410, 1360, 7767, 5300, 9398, 11030, 11630, 11717, 17486, 17049, 15141, 8122, 6309, -1412, 1272, 8735, +-1962, -9766, -20803, -21635, -22871, -22749, -16683, -10420, -5886, 6401, 6386, 6416, 10422, 10695, 11240, 13256, +17378, 16632, 13235, 7229, 6837, -2251, 3803, 6890, -5989, -12406, -22649, -22578, -23750, -21550, -13951, -9771, +-1038, 8426, 4864, 8508, 9887, 10810, 11978, 14570, 16080, 16773, 11093, 7885, 5963, -2159, 6179, 2987, +-9222, -15268, -24326, -23224, -23959, -19701, -11605, -8146, 5081, 7337, 5788, 9120, 10005, 11137, 12489, 14698, +15401, 16613, 8986, 9008, 3817, -1118, 7921, -2104, -11792, -16962, -26139, -24015, -23888, -16780, -11834, -2630, +7336, 5766, 7800, 8929, 11020, 11186, 12988, 14863, 15876, 15342, 7849, 9896, 1117, 1055, 6880, -7346, +-12926, -18823, -27307, -23685, -21773, -15237, -8828, 3182, 5911, 6515, 8512, 8650, 11509, 11096, 12619, 14317, +16744, 12566, 8320, 9218, -1130, 3961, 3355, -11975, -14030, -21668, -27592, -23035, -19635, -13815, -3069, 5082, +5023, 7927, 7966, 9455, 12395, 11309, 11882, 15554, 17049, 9358, 9032, 7482, -1340, 4815, -978, -14666, +-15427, -23731, -26798, -22338, -17487, -9684, 1485, 4602, 5984, 8246, 7332, 11174, 12539, 10118, 11703, 17779, +14415, 7593, 9561, 4734, -274, 3844, -6177, -15912, -17524, -24546, -25834, -20856, -14676, -4443, 2324, 4307, +7359, 7355, 8001, 12740, 12039, 8577, 14266, 19400, 10842, 7943, 8450, 3967, 20, 1243, -10249, -17467, +-19514, -24788, -24894, -19357, -9459, -511, 1810, 5266, 8421, 6441, 9552, 13574, 10403, 7958, 18063, 16978, +8481, 7864, 6895, 3529, -913, -1726, -13568, -18428, -21345, -23595, -24108, -15781, -3414, 560, 1510, 6982, +8450, 6003, 11606, 13192, 8186, 10677, 20215, 12828, 7550, 7134, 6390, 2088, -1985, -4995, -16289, -20172, +-21374, -22974, -23725, -8830, -1040, -74, 1781, 9382, 6934, 7619, 12580, 11034, 7820, 14129, 18605, 9870, +6848, 6109, 5839, -257, -3387, -8571, -17820, -21799, -19269, -23730, -18824, -2631, -796, -428, 4070, 10976, +5617, 10075, 12755, 9411, 10021, 15469, 16080, 7432, 6022, 5655, 4545, -2674, -5539, -11513, -20051, -21903, +-18553, -22586, -11055, -1509, -682, -365, 7776, 9324, 5948, 12124, 10966, 9037, 12086, 15281, 13036, 5968, +5668, 4859, 2769, -5000, -7757, -13759, -21744, -20699, -19153, -16857, -6328, -1302, -497, 1816, 10005, 6666, +8443, 11922, 10215, 10139, 12576, 14875, 10031, 4825, 5116, 4022, 1097, -7632, -9301, -15805, -22591, -20332, +-17342, -9981, -5733, -354, -871, 5964, 9226, 6319, 10133, 11359, 10090, 10758, 12296, 13788, 6720, 4089, +3987, 3263, -1554, -10148, -10291, -18684, -21976, -20187, -11418, -6590, -4922, -742, 669, 9027, 7103, 7249, +10718, 11579, 10425, 10453, 12333, 11889, 3637, 4171, 2499, 2163, -4577, -11894, -11535, -20100, -21102, -17962, +-5208, -5810, -3930, -1653, 4627, 8639, 5987, 8692, 11500, 11555, 10527, 10039, 12304, 9181, 1825, 3813, +886, 1413, -8719, -12470, -13597, -20389, -20603, -12548, -1878, -5057, -3778, -388, 8052, 6884, 6430, 9902, +11979, 11572, 10594, 9441, 12183, 5449, 1365, 2653, 375, -406, -11532, -12917, -15634, -20965, -17429, -7008, +-1578, -3500, -4351, 3375, 8969, 5591, 7226, 10903, 11800, 10837, 9771, 9255, 10589, 1297, 1705, 336, +385, -3605, -13783, -13009, -16725, -20555, -11593, -4705, -1133, -2628, -3447, 7163, 7654, 6144, 8141, 12356, +10886, 10917, 8901, 10342, 6801, -1009, 1394, -943, -136, -7536, -14652, -12943, -18128, -17467, -6646, -4588, +944, -3365, -660, 8954, 6430, 6774, 9493, 12546, 9928, 9963, 8655, 10304, 1994, -1238, 355, -1593, +-2251, -10611, -15001, -13549, -19017, -12018, -4715, -4078, 1695, -3655, 3158, 9270, 6486, 8053, 11029, 11683, +9764, 8527, 9991, 6959, -1220, -1266, -1107, -2340, -4124, -13815, -14850, -14409, -16925, -7201, -4712, -2120, +1767, -1802, 6130, 8690, 7027, 8844, 11868, 10779, 8650, 8397, 10254, 2664, -2252, -1393, -2318, -2250, +-6678, -15299, -13808, -14450, -12974, -5052, -4696, -375, 1966, 141, 7621, 8577, 6812, 10185, 12119, 9433, +8009, 9682, 8065, -983, -2837, -2836, -3324, -2621, -9696, -16193, -12970, -13554, -9027, -5221, -3151, 996, +2420, 1869, 9352, 7972, 7341, 11474, 10938, 8249, 8029, 10127, 4247, -3244, -3479, -3614, -4002, -3403, +-12975, -16087, -12316, -10440, -7810, -4875, -1367, 1869, 2621, 4292, 10859, 7221, 8984, 11518, 9746, 7504, +8698, 9493, -301, -4198, -4112, -4278, -4332, -4523, -15810, -15199, -9899, -8202, -7980, -3016, 128, 2608, +2831, 7830, 10433, 7288, 10317, 11267, 8523, 6486, 9953, 6176, -3823, -4587, -4946, -4799, -4179, -7031, +-17716, -12958, -7666, -8593, -6410, -1693, 837, 2337, 4484, 10612, 9575, 8646, 10183, 10880, 7142, 6896, +10860, 1356, -5444, -5672, -4647, -5379, -4182, -10293, -17793, -10255, -6544, -9015, -4138, -1324, 1661, 1946, +8194, 11271, 9542, 9056, 9953, 10536, 5318, 9008, 9197, -3471, -6402, -5851, -5368, -5638, -4513, -13571, +-15859, -7344, -8020, -7545, -2289, -983, 1438, 3400, 12133, 10457, 10653, 7825, 10805, 9255, 5507, 11327, +4704, -6596, -6323, -6080, -5718, -4452, -6433, -15106, -12640, -7470, -9465, -4632, -2024, -1096, 1041, 6560, +13400, 10745, 10322, 7337, 11514, 6756, 7645, 11083, -1408, -7580, -6358, -6271, -5927, -3736, -9543, -14791, +-10937, -7980, -8729, -1896, -2264, -928, 2047, 10330, 13919, 11679, 9177, 8375, 10507, 6318, 10564, 6366, +-5427, -7037, -6334, -6321, -4783, -4351, -11034, -14094, -10430, -8615, -7210, -268, -3416, -175, 3502, 13396, +14587, 11107, 8110, 9169, 9057, 7845, 11043, 196, -6407, -7299, -6341, -6096, -4497, -5313, -11945, -14187, +-9327, -8844, -4371, -700, -3684, 817, 5301, 16746, 14177, 9760, 8136, 9173, 8751, 9999, 7700, -4675, +-6218, -7898, -5229, -5916, -4239, -5874, -13687, -14347, -8161, -9445, -1600, -2070, -2193, 1282, 8549, 19148, +12164, 10031, 7952, 9640, 9409, 11152, 1644, -5777, -7394, -7098, -4273, -5742, -3389, -7051, -16438, -11828, +-8881, -7627, -235, -2797, -840, 1859, 12009, 19143, 10319, 9711, 8071, 10125, 11116, 8596, -3237, -6632, +-8974, -5349, -4570, -5348, -2286, -10080, -17389, -8882, -10314, -5187, 220, -3374, 21, 3173, 15422, 17607, +9260, 9324, 8855, 10976, 11326, 3629, -5421, -7410, -8603, -3416, -4838, -3712, -2841, -14443, -15096, -8334, +-10700, -1746, -752, -2367, 1229, 4909, 18524, 16110, 8359, 10026, 9904, 11640, 10248, -1524, -5990, -9555, +-6324, -3544, -4699, -2626, -5639, -17774, -11277, -9930, -9252, 488, -1926, -1029, 1801, 7501, 20585, 13560, +8315, 11146, 10342, 12383, 5455, -4689, -7267, -9708, -4321, -3752, -3733, -2121, -10250, -17444, -9354, -11778, +-5844, -2, -1452, -454, 2090, 11107, 21170, 10027, 10220, 11632, 10537, 11597, -15, -5241, -9138, -7591, +-3277, -3483, -3118, -3070, -15125, -14203, -9697, -10750, -2769, -201, -740, 453, 3129, 14914, 19594, 8939, +13143, 10563, 11879, 8485, -4078, -6401, -9427, -5984, -2740, -3613, -3002, -5749, -17026, -12209, -10103, -8323, +-1174, -575, -277, 955, 5541, 17672, 16545, 10404, 13516, 10104, 12144, 3316, -6235, -7104, -8457, -4529, +-2504, -4423, -2679, -9779, -17418, -10420, -9934, -5442, -956, 119, -311, 2165, 8931, 17676, 15295, 12524, +12941, 10593, 10512, -1947, -6779, -7868, -7061, -3872, -3311, -4002, -3420, -13396, -16280, -8889, -8680, -3870, +-415, 535, -815, 4611, 10947, 17423, 15635, 13743, 11079, 11944, 5978, -5219, -6913, -7531, -5806, -3421, +-4423, -4268, -5159, -16584, -14043, -7420, -7184, -2621, 255, -15, 175, 6599, 11908, 17459, 16657, 12731, +10769, 11495, 642, -6167, -7146, -6029, -4538, -4380, -5190, -3637, -8039, -18912, -10587, -6772, -5767, -1203, +146, -852, 1576, 8005, 12660, 18984, 16596, 10942, 13060, 7995, -3151, -6947, -6453, -4426, -4473, -5452, +-5098, -3532, -12528, -18617, -7161, -6560, -3971, -244, -346, -563, 3253, 9266, 13437, 20500, 13930, 11824, +13529, 3273, -5079, -7186, -4250, -3447, -5810, -6343, -4437, -4810, -16556, -15709, -4321, -6552, -2043, -415, +-320, -777, 5434, 10361, 14746, 20607, 11159, 14419, 10753, -270, -7008, -5368, -1596, -4796, -7368, -5961, +-4476, -7521, -19083, -11131, -4686, -4670, -1052, -677, -372, -245, 7616, 10506, 17601, 18455, 10860, 15455, +5990, -3416, -7764, -2114, -1049, -7333, -7641, -6321, -3941, -11860, -18185, -7307, -4349, -2804, -27, -627, +-936, 1872, 9522, 10648, 19580, 15473, 12577, 13337, 2232, -6246, -6173, 992, -3014, -9194, -7536, -5760, +-4669, -15282, -15794, -5297, -4145, -1120, -554, -1319, -1052, 4053, 10269, 11979, 19759, 13559, 14491, 10037, +-921, -7244, -1957, 1917, -5919, -9872, -7745, -4605, -7509, -17512, -12286, -4703, -3154, 502, -496, -1784, +217, 6095, 10817, 13715, 17995, 13114, 14330, 6234, -4278, -5693, 1428, 185, -8751, -9790, -7471, -3765, +-10912, -16939, -8932, -4991, -1212, 1437, -1610, -1854, 1694, 7603, 12264, 14707, 15688, 14064, 12492, 2247, +-5124, -2019, 3138, -2256, -10008, -9822, -5605, -5010, -14341, -14282, -7800, -4088, 619, 1049, -2655, -883, +3300, 9123, 13876, 14080, 14248, 14461, 8858, -876, -4534, 1329, 2281, -5376, -11800, -8787, -4694, -8215, +-15117, -11598, -7722, -2185, 1979, 7, -2416, 509, 4685, 11078, 15155, 12241, 14570, 13245, 5533, -2580, +-1710, 3023, 776, -8645, -11431, -7042, -4771, -12343, -12417, -10677, -7667, 308, 1757, -1082, -1590, 1806, +5759, 13623, 14351, 10265, 14602, 10356, 2411, -2324, 994, 4273, -2202, -10709, -10346, -5848, -7008, -13004, +-9565, -11889, -4975, 1616, 1273, -965, -74, 2828, 7955, 15869, 12396, 9834, 13229, 6247, 527, -1241, +3274, 3416, -5810, -11503, -8821, -5667, -9994, -11175, -8597, -12644, -1653, 1616, 1378, -875, 1125, 3214, +11164, 15764, 11130, 9485, 9809, 3531, 161, 1262, 5131, 912, -8401, -10498, -7483, -6828, -10992, -8315, +-10883, -11023, 696, 1718, 1107, 502, 1707, 4846, 14005, 14277, 11518, 7627, 5804, 2077, 854, 3550, +4999, -2613, -10060, -8818, -7187, -8339, -9979, -7310, -12836, -8758, 2117, 1825, 634, 2272, 1039, 7652, +14359, 13563, 11635, 3787, 2936, 1703, 2329, 5199, 3773, -6339, -9746, -7753, -7502, -8704, -7530, -8679, +-13346, -6273, 3483, 1006, 2652, 2058, 2111, 10899, 13575, 14662, 10070, -1360, 1201, 2783, 3686, 6567, +424, -8058, -8776, -6879, -8449, -7128, -6740, -10093, -13264, -3288, 3687, 1171, 4848, 619, 5011, 11334, +13618, 15908, 5616, -5434, 700, 3754, 5420, 6094, -3345, -8624, -8314, -6515, -8064, -4675, -7700, -10794, +-12701, -743, 2938, 3106, 4434, 878, 8362, 10190, 15874, 14565, -12, -8181, 1670, 4811, 7016, 4001, +-5858, -8795, -6964, -6693, -6528, -3408, -9862, -10970, -11172, 1369, 2546, 5538, 2343, 3633, 8732, 10235, +18154, 10632, -5263, -8232, 2343, 6793, 7436, 273, -6947, -8367, -5813, -6237, -3922, -4466, -10622, -11128, +-8874, 2174, 3789, 5795, 2188, 6651, 8163, 11860, 18965, 4337, -8430, -7636, 2949, 8561, 5670, -2322, +-7714, -6967, -5197, -5586, -1290, -6837, -10866, -10752, -6898, 1409, 5712, 4468, 4379, 7680, 7434, 14591, +16977, -1705, -9060, -7318, 4851, 9279, 2817, -3851, -7415, -5588, -5044, -2943, -1674, -8500, -10962, -9382, +-6218, 3331, 6148, 4941, 6625, 7134, 8451, 16910, 12101, -6200, -9041, -6397, 6336, 7989, 11, -4928, +-6881, -4993, -4187, -258, -3111, -9305, -10619, -8500, -5258, 5013, 5256, 7283, 7893, 6736, 10936, 16755, +5747, -8089, -8839, -4306, 6633, 5485, -1113, -5353, -5914, -4559, -1198, -127, -3975, -10302, -9475, -8065, +-3513, 4621, 5538, 9826, 6889, 7604, 13206, 13952, 192, -8241, -8348, -1921, 4632, 3684, -3371, -5140, +-5951, -3075, 371, -729, -4756, -10706, -8539, -7507, -2240, 4337, 8088, 10529, 6670, 9333, 14157, 9899, +-3878, -8811, -6116, -524, 2230, 1912, -4296, -4170, -5602, -153, 948, -405, -6497, -10011, -8057, -6324, +-1576, 5112, 9887, 9663, 6832, 11020, 13672, 3961, -5604, -8876, -3993, 37, -352, -314, -3928, -4254, +-4506, 2386, 352, -209, -7694, -9490, -7567, -5135, -1164, 7352, 11296, 9168, 8249, 12362, 11191, -354, +-6756, -7247, -3035, -1241, -2459, -1630, -3754, -4979, -1276, 2713, 976, -621, -8370, -9121, -6562, -4698, +-424, 9615, 11136, 9018, 8921, 12888, 7270, -3682, -5738, -5434, -1645, -3447, -3980, -2104, -3731, -4966, +1568, 1823, 2427, -2259, -8128, -8534, -5723, -5301, 2041, 11004, 11736, 9032, 10217, 11882, 2330, -5432, +-4564, -3986, -2164, -4379, -6864, -1350, -4490, -2982, 2576, 1967, 2843, -3377, -8443, -7482, -5554, -5255, +5063, 11834, 11186, 9543, 11558, 9314, -2639, -5082, -3473, -3361, -3878, -5276, -8286, -1757, -4221, -320, +2831, 2255, 3405, -4964, -7937, -6864, -5565, -3025, 7318, 11825, 11078, 10420, 12260, 5363, -5074, -3636, +-1765, -3900, -4722, -6840, -7796, -3192, -3644, 1743, 1500, 3190, 2949, -6607, -7244, -6174, -4862, -283, +9773, 11344, 11287, 11257, 11758, 251, -6459, -1608, -1951, -5358, -5137, -7528, -7982, -3265, -1834, 1889, +2162, 4342, 1904, -7517, -6846, -6047, -3608, 1840, 11223, 11278, 11065, 12546, 9249, -4316, -4554, 51, +-3003, -6124, -5927, -7940, -8704, -3207, 76, 519, 2933, 5582, -258, -7966, -6276, -4859, -2211, 4330, +11781, 10878, 11458, 13105, 4538, -7036, -1568, -28, -3796, -6914, -6373, -7819, -9417, -1084, 612, 827, +3919, 6375, -2475, -7887, -5900, -3294, -434, 5916, 11484, 10729, 12223, 11947, -932, -6852, 34, -858, +-4951, -7596, -6441, -8377, -9571, 672, -223, 1951, 4708, 5311, -3975, -8024, -5116, -1135, 685, 7316, +11467, 10548, 13377, 8771, -5459, -4640, 719, -1770, -5999, -7676, -5614, -10269, -7676, 912, -123, 3505, +5606, 4321, -5586, -7444, -3474, 554, 1573, 8814, 10793, 11160, 13237, 3952, -7021, -2783, 769, -2986, +-6648, -6773, -5914, -10850, -5922, -214, 1369, 4606, 5284, 3203, -6967, -6389, -1175, 1784, 2250, 10098, +10617, 12165, 11268, -716, -6567, -1527, -201, -4387, -6916, -6251, -7468, -9496, -5292, -1136, 3869, 4331, +5257, 1597, -7927, -4670, 1025, 1555, 3556, 10777, 10357, 13021, 7574, -3342, -5227, -995, -1229, -5543, +-6309, -6452, -8118, -7603, -6566, 941, 5461, 4050, 4946, -356, -7147, -1768, 2116, 898, 5260, 10831, +10976, 11975, 3758, -4329, -4421, -1024, -2497, -6072, -5783, -7515, -6928, -7882, -7580, 3846, 5038, 3680, +4001, -2051, -5085, 274, 2075, 1111, 6808, 10918, 11539, 9285, 1567, -4573, -3964, -821, -4419, -5917, +-5950, -7972, -4788, -9879, -5888, 6181, 4528, 3473, 2741, -2575, -2655, 1205, 1710, 1862, 8377, 11505, +10975, 6358, -307, -5405, -2910, -2260, -5270, -6085, -7365, -5944, -4635, -11767, -2162, 6299, 4543, 2948, +1775, -1028, -1019, 1286, 1292, 2944, 10037, 11946, 9521, 4859, -2552, -5061, -1768, -3988, -5227, -7068, +-7443, -3692, -6643, -11930, 1170, 5883, 4264, 1419, 2474, -131, -446, 1707, 733, 4678, 11732, 11278, +7956, 3454, -5178, -4461, -1922, -4936, -6226, -7997, -5934, -3054, -9055, -9542, 2657, 5973, 3389, 1131, +4005, 313, 423, 1607, 572, 6808, 12793, 10433, 7488, 1060, -6447, -3011, -2732, -5442, -6874, -7734, +-4111, -3779, -10370, -7928, 3357, 5784, 1721, 2247, 4593, -3, 1467, 628, 1537, 9938, 12498, 9537, +6706, -2059, -6511, -1936, -4381, -6344, -7465, -7129, -3101, -5510, -10900, -6419, 4970, 4833, 1368, 4088, +4383, 223, 1922, -160, 4032, 11359, 11579, 9383, 4518, -4305, -5969, -2219, -5736, -6610, -7556, -5943, +-2851, -7447, -10532, -4524, 5770, 4035, 2611, 4113, 5150, 204, 1437, 160, 6775, 11584, 11306, 8679, +2848, -5001, -5076, -3115, -6819, -6567, -7897, -4998, -3657, -8958, -10440, -2751, 5615, 3943, 3583, 4558, +6119, 42, 366, 1248, 9546, 11563, 10534, 7705, 1026, -6667, -4232, -5706, -7006, -5777, -8244, -3214, +-4824, -9802, -9751, -823, 5459, 5032, 3153, 6400, 5827, -778, 275, 3077, 11610, 10870, 9053, 7373, +-724, -7214, -4403, -7405, -5699, -6464, -7803, -2088, -7632, -10443, -9186, 621, 5827, 5131, 2988, 8246, +4953, -1130, 1159, 6065, 12332, 10241, 8228, 7448, -2910, -7205, -6775, -8142, -4738, -7826, -5714, -2737, +-9584, -10241, -7923, 3128, 6072, 4862, 3711, 8955, 2963, -1244, 2236, 8635, 11252, 8834, 8323, 6934, +-4975, -7349, -7940, -7053, -5058, -8582, -3711, -5296, -10953, -10934, -6293, 4950, 5809, 4854, 6014, 8690, +3009, -874, 4751, 11157, 9984, 7747, 9576, 4810, -7430, -7848, -9344, -6443, -5641, -8563, -2991, -8292, +-11656, -10485, -3507, 5713, 5660, 6158, 6819, 8674, 2658, 254, 8073, 10590, 8479, 7999, 10285, 2465, +-8849, -8700, -9147, -6014, -7514, -7192, -3875, -11285, -10944, -9876, -957, 6178, 6294, 6900, 7374, 8456, +1734, 2468, 9909, 9530, 8150, 9298, 9315, -844, -8903, -9678, -9484, -6142, -8617, -5901, -6395, -12702, +-9630, -8689, 977, 6375, 6598, 7680, 7778, 8766, 996, 6161, 10107, 8529, 8615, 9595, 7626, -3130, +-10183, -9968, -8884, -6763, -8719, -5740, -9536, -12461, -9078, -7504, 2509, 6788, 6489, 8627, 8131, 7829, +2358, 8859, 9021, 8137, 9780, 8713, 5741, -5024, -10394, -10139, -8569, -7740, -8816, -6603, -11999, -10493, +-9141, -6055, 4577, 7044, 7142, 8413, 9136, 6628, 5086, 9997, 9361, 8888, 9901, 7180, 4019, -7384, +-11550, -10834, -8136, -8470, -9640, -8278, -12694, -8743, -10040, -3214, 5901, 6494, 7607, 9637, 9112, 5838, +7686, 9953, 9124, 9141, 8509, 6174, 3221, -9719, -10569, -10313, -7383, -10468, -9502, -10779, -11652, -8548, +-10088, 957, 6750, 7172, 7647, 10376, 7296, 8106, 9212, 10219, 10015, 9077, 7307, 5161, 1101, -11002, +-11141, -10197, -8394, -12316, -10124, -12686, -9373, -9824, -7509, 3684, 6043, 6804, 8849, 10730, 6132, 11252, +10216, 10942, 8922, 9226, 5348, 4331, -1744, -11714, -11179, -9502, -9639, -13482, -11044, -12746, -8895, -10483, +-3353, 4519, 6950, 7332, 10448, 9454, 6831, 14087, 10419, 11348, 8383, 8341, 3288, 4964, -5120, -11917, +-11597, -9479, -11773, -14140, -11708, -11962, -9213, -9788, -346, 4777, 6765, 7986, 11887, 6223, 10243, 15619, +10947, 11175, 9029, 6739, 2411, 4588, -7905, -12649, -11763, -9330, -14519, -12755, -12348, -12117, -8951, -6428, +2238, 4433, 6671, 9742, 11102, 5883, 14447, 15893, 10812, 9669, 8931, 4720, 2187, 3750, -9730, -13507, +-11724, -11760, -15810, -12726, -14015, -11193, -8467, -3220, 3415, 4172, 7110, 11766, 8176, 7454, 17597, 16520, +10646, 9288, 7715, 2926, 2902, 2630, -11841, -13413, -11778, -14240, -14675, -12524, -14530, -9970, -6722, -1653, +3408, 4623, 9110, 11180, 7418, 11940, 17979, 15890, 9988, 7927, 6105, 1583, 4350, -427, -14332, -12886, +-13939, -15144, -13804, -13406, -13852, -8549, -4516, 681, 2791, 5194, 10617, 9508, 8684, 14127, 18450, 15815, +8454, 7153, 4248, 1242, 4728, -3928, -15934, -13428, -14434, -15522, -13074, -13428, -13096, -6014, -2104, 898, +1966, 7094, 9847, 8800, 11946, 14641, 20078, 14565, 6230, 5606, 2810, 2008, 3905, -7815, -16101, -14177, +-15217, -15057, -12335, -13065, -10915, -4320, 216, 874, 2689, 8048, 8393, 10967, 12803, 15383, 21070, 11285, +5019, 4568, 2203, 2972, 2162, -11067, -16222, -15403, -15320, -14598, -11704, -12736, -9254, -2783, 585, -26, +4360, 7284, 8780, 13767, 12576, 17805, 19618, 8843, 4520, 3836, 2329, 3801, -866, -12723, -17128, -15931, +-15703, -14121, -11007, -11879, -7267, -1031, 469, -23, 5297, 5625, 12202, 14279, 12677, 19100, 16943, 6832, +4038, 3643, 3526, 3420, -4161, -13642, -17666, -15921, -15548, -12689, -10500, -10666, -5740, -168, -280, 1120, +4418, 7488, 15664, 12340, 15338, 18679, 13881, 5377, 3517, 3273, 4152, 1128, -7465, -14439, -18125, -16036, +-15219, -10995, -10483, -10093, -4010, 262, -1235, 2862, 3084, 12482, 15745, 12390, 17457, 16013, 12616, 4602, +3421, 3860, 4056, -1922, -10417, -15672, -18457, -16203, -13739, -9846, -9853, -9540, -1970, 55, -311, 2017, +6643, 17084, 13259, 14652, 16077, 13584, 11039, 3020, 3964, 4058, 2623, -5229, -12236, -16290, -18752, -15032, +-12519, -8895, -9802, -8779, -136, -863, 287, 1724, 12318, 16537, 13477, 16279, 13586, 12922, 9604, 1949, +5092, 3197, 944, -8692, -13289, -16367, -18951, -13954, -11561, -7749, -10721, -6172, 965, -1375, -660, 5489, +16012, 14529, 15483, 14945, 11516, 12726, 8267, 2130, 4986, 1852, -1359, -12495, -13314, -17371, -17991, -12426, +-10554, -7831, -10827, -2493, 776, -1433, 68, 11457, 15435, 15310, 15093, 12949, 10090, 12345, 6836, 2575, +3736, 1030, -4795, -15625, -12595, -17807, -16488, -11145, -9502, -8646, -8527, -108, -39, -2545, 5014, 14439, +14640, 16431, 13110, 11489, 9242, 12783, 4917, 2894, 2328, -655, -9043, -15978, -12698, -17754, -14591, -10724, +-9361, -8690, -5260, 548, -1359, -663, 11267, 13513, 16158, 14782, 11938, 9174, 9460, 11954, 3415, 2833, +361, -2951, -12839, -15397, -13367, -16392, -12741, -10675, -9684, -6334, -2648, -66, -2041, 5735, 12517, 13701, +16240, 12900, 10710, 7941, 10467, 10380, 2860, 1660, -1141, -6150, -15572, -15120, -13658, -14611, -11957, -11369, +-8830, -3176, -1689, -1209, 1335, 10253, 12465, 15205, 14271, 11980, 8920, 7751, 10869, 8431, 2020, 23, +-2523, -9867, -16409, -15237, -13036, -12345, -11869, -11936, -5536, -1065, -2358, -564, 6682, 11461, 13305, 14317, +13162, 10285, 7316, 8666, 10210, 6900, 545, -1558, -5093, -13641, -16629, -15890, -11162, -10464, -13205, -10800, +-1146, -1338, -2022, 3550, 9304, 12219, 13503, 13295, 12207, 8314, 7511, 9192, 9504, 5770, -1322, -2836, +-8524, -16518, -16192, -16027, -8603, -10633, -13764, -7499, 2002, -2628, 692, 7428, 10515, 13163, 12366, 12857, +10132, 6940, 7803, 8450, 8760, 3169, -2846, -4957, -12896, -16619, -16851, -14516, -6487, -11773, -12984, -2688, +2621, -3101, 5959, 8407, 12013, 12269, 11931, 12149, 8339, 7070, 8140, 8256, 8241, 348, -4581, -8530, +-15833, -16227, -17918, -11640, -6166, -12357, -11083, 2437, 760, 356, 9595, 8790, 13091, 11206, 11795, 9715, +7294, 7554, 7691, 8323, 6847, -2805, -6795, -12207, -16948, -16829, -17310, -8561, -6356, -11899, -6925, 5248, +-506, 6378, 9679, 10553, 12348, 10442, 10663, 7947, 7305, 7177, 7738, 8223, 4186, -5781, -9464, -15755, +-16399, -18367, -15176, -6785, -6072, -11644, -1634, 4901, 1747, 9997, 8547, 12020, 11428, 10093, 9372, 8052, +6764, 7068, 7957, 7352, 1126, -9351, -12033, -17161, -16404, -18888, -12188, -5762, -5919, -9097, 2938, 4316, +6024, 9649, 9647, 12051, 10175, 9172, 8678, 7892, 5848, 7501, 7118, 5762, -2798, -12224, -14238, -17534, +-17097, -18406, -9290, -4984, -5866, -4725, 4859, 5605, 8302, 9945, 10899, 11535, 8903, 8835, 8965, 6743, +5456, 8063, 5318, 4164, -7958, -13721, -16140, -17704, -18161, -15602, -7100, -4513, -4225, -1180, 6023, 7633, +9215, 10646, 11315, 10137, 7863, 9120, 8485, 4825, 6110, 7098, 4068, 1394, -12479, -14293, -17853, -18110, +-17999, -12558, -5655, -3859, -1364, 1286, 8930, 8900, 10191, 10740, 11278, 8485, 8101, 9958, 6444, 3883, +6861, 5468, 3521, -3043, -15330, -14700, -19417, -18259, -16639, -9613, -4817, -2475, 1175, 3818, 11088, 8751, +10695, 10800, 10512, 7079, 9483, 9288, 3971, 3783, 6499, 4054, 1510, -8060, -15748, -16416, -20093, -17112, +-14586, -7413, -3615, -243, 3432, 7467, 11921, 8378, 10953, 10971, 8549, 7604, 10754, 6667, 2542, 3812, +5330, 2474, -1642, -11996, -15485, -18588, -19429, -15866, -12505, -4964, -2858, 1733, 5940, 11214, 11174, 9024, +11383, 10735, 7665, 9527, 9600, 3710, 1853, 3594, 4112, 314, -5696, -13706, -15839, -20199, -17567, -14791, +-9589, -2841, -2883, 4138, 9396, 13471, 9826, 9524, 11679, 9672, 7966, 10777, 6536, 1319, 1809, 3086, +2691, -2383, -9184, -14031, -17273, -20384, -15799, -13138, -6024, -2318, -2144, 7762, 13072, 13290, 8740, 10158, +11975, 8826, 9624, 9750, 2904, 177, 1171, 2808, 822, -6071, -10406, -14153, -19446, -19067, -14192, -10730, +-3164, -3220, 196, 12248, 15011, 11487, 7989, 11815, 11569, 8698, 10653, 6464, -133, -481, 657, 2639, +-2713, -8336, -9987, -15604, -20977, -17173, -12660, -7766, -1925, -3702, 4342, 16734, 15018, 9288, 9120, 13215, +10768, 9657, 9814, 2034, -2172, -782, 532, 710, -6329, -8147, -9873, -18035, -21195, -14941, -10380, -5248, +-2051, -3169, 9850, 18988, 13134, 8282, 11365, 13259, 10506, 10420, 6483, -1781, -2744, -1248, 667, -2114, +-8437, -6271, -11031, -20908, -19808, -12077, -8597, -3304, -3120, -280, 15470, 19419, 10748, 9139, 12677, 12892, +10516, 9014, 1877, -4250, -3306, -889, -662, -4982, -8049, -4402, -14732, -22529, -16858, -10068, -6596, -2511, +-3047, 4596, 19741, 18178, 9202, 10308, 13937, 12871, 10098, 5531, -1830, -5596, -3261, -1235, -2277, -7172, +-5310, -4671, -19880, -21578, -13404, -8879, -4868, -2579, -1670, 10061, 22153, 15762, 8947, 11684, 14651, 11973, +7971, 1382, -4797, -6609, -2812, -2402, -4515, -7269, -1574, -8994, -23231, -17846, -11969, -7000, -3822, -2241, +1367, 15833, 22475, 14555, 9002, 13501, 14363, 10750, 4516, -1920, -7236, -6541, -2475, -3977, -5781, -5056, +31, -16108, -22323, -15277, -10152, -5725, -3306, -1094, 5092, 19261, 22522, 12460, 10337, 14964, 13002, 8252, +1064, -4964, -8871, -5614, -3148, -5136, -5552, -1046, -3062, -21659, -18528, -14113, -7676, -5464, -1605, -39, +9308, 22198, 22178, 11035, 12248, 14640, 10865, 5238, -2048, -7947, -9164, -4730, -4176, -5187, -3689, 1572, +-10506, -22316, -16281, -12173, -6436, -4308, 177, 1295, 13208, 24717, 20759, 10379, 13705, 13085, 8732, 1999, +-5396, -9648, -8626, -4288, -4725, -4219, -869, 341, -17312, -19878, -15120, -10149, -6154, -2429, 1147, 2808, +18196, 26709, 18571, 10201, 13580, 11252, 5917, -1404, -7890, -10566, -7607, -3899, -3871, -2631, 1796, -4806, +-20953, -16632, -14205, -8564, -5520, 366, 301, 5955, 23523, 27040, 15498, 10594, 12076, 8901, 3502, -4805, +-10003, -10454, -6661, -3245, -3232, -1164, 1859, -12202, -20166, -14991, -13246, -7116, -3523, 1844, -666, 11717, +28268, 25536, 12668, 10263, 10220, 6867, 46, -7947, -10377, -10188, -4862, -1920, -2392, 817, -869, -17679, +-17109, -14512, -11732, -5644, -558, 908, 65, 19512, 30256, 22337, 10384, 9202, 8465, 4500, -4084, -9496, +-10949, -9157, -2379, -1631, -2214, 2528, -7123, -18864, -14756, -14785, -9514, -3375, 774, -1081, 4925, 25919, +29934, 18208, 8309, 8320, 7467, 589, -6443, -9782, -11311, -6179, 400, -2711, -251, 1344, -12834, -17233, +-14485, -13687, -7051, -874, 211, -1582, 12170, 29945, 26415, 13753, 6554, 7116, 4576, -2946, -7918, -10730, +-10107, -2694, 288, -3023, 2256, -3295, -14637, -16082, -14587, -11316, -4132, 521, -1312, 2162, 19191, 31046, +22295, 10685, 4951, 6756, 1224, -4925, -8896, -10977, -7114, 37, -1204, -1480, 2078, -8154, -14587, -16603, +-12921, -9244, -1217, -767, -587, 6744, 24863, 28191, 18409, 6833, 4573, 4500, -2259, -6329, -9758, -8981, +-4133, 1038, -2009, 1229, -1426, -9184, -16111, -15221, -11122, -6230, -425, -1256, 1377, 12182, 27609, 24009, +14548, 4031, 4907, 1204, -3990, -7093, -9017, -6561, -1524, 755, -1637, 1446, -4778, -11404, -17788, -12304, +-9976, -3478, -541, -41, 3628, 18396, 25708, 20862, 10298, 2746, 4666, -1978, -5253, -8127, -7286, -4646, +386, 653, -73, -98, -6637, -14365, -16491, -9891, -8304, -1608, 167, 1064, 7389, 22120, 21345, 18049, +5415, 3424, 2534, -4215, -6182, -7328, -5200, -3813, 2170, 520, 795, -3109, -8771, -17488, -12526, -9538, +-5990, 341, 1149, 2145, 13090, 20941, 18275, 14940, 2581, 4738, -260, -5609, -6492, -4955, -4718, -1191, +2872, 1083, -611, -5486, -12189, -16683, -9359, -9450, -2865, 1441, 1918, 4092, 17056, 16463, 16693, 10273, +2101, 4041, -3455, -6501, -4998, -4056, -3891, 1713, 3352, 2002, -3476, -7664, -14924, -12722, -8678, -7792, +95, 1927, 2770, 7380, 17044, 12454, 15333, 5897, 3609, 2051, -5268, -5337, -3174, -3508, -1954, 3724, +4097, -131, -7163, -9882, -15747, -9489, -9049, -4244, 1464, 2906, 4135, 9989, 14727, 10233, 12771, 3872, +3510, -1275, -5308, -4308, -2800, -2802, 600, 5331, 4444, -4416, -8494, -11878, -13153, -8394, -7097, -1121, +2272, 4321, 5197, 10588, 11589, 9051, 10108, 3584, 1946, -2862, -4421, -3363, -1791, -1653, 3009, 7419, +826, -8528, -9542, -13061, -10752, -7419, -3985, 703, 3405, 5373, 5441, 9196, 9496, 7584, 8115, 2751, +541, -3366, -3895, -1865, -1338, -491, 6817, 7231, -4368, -9983, -10007, -12606, -9060, -5562, -1816, 2190, +4588, 5290, 4848, 8069, 7370, 6864, 6905, 1482, -333, -3149, -3574, -419, -1012, 2339, 9304, 3317, +-9061, -9957, -9907, -12093, -6968, -3458, -66, 3550, 5034, 5241, 3476, 6644, 6507, 6551, 4570, 845, +-374, -3872, -1658, 492, -369, 6195, 9498, -2778, -11263, -8995, -10418, -10840, -4269, -2019, 1582, 4830, +4767, 4598, 1427, 6479, 6410, 4782, 2446, 603, -1078, -3379, 171, 758, 2193, 9388, 5828, -8202, +-10942, -8031, -10691, -7887, -2419, -710, 3429, 4301, 4651, 2742, -729, 7714, 6186, 1184, 1922, 1016, +-2023, -1530, 2097, 1612, 5537, 9755, -168, -11492, -9314, -7980, -10114, -4434, -1353, 917, 4216, 3720, +4645, -1259, -176, 9498, 3689, -1241, 2790, -157, -2041, 921, 2503, 3646, 8141, 7069, -6372, -11748, +-7864, -8184, -7947, -1985, -1223, 2814, 3584, 3792, 2494, -4317, 1901, 10141, 1019, -2494, 2542, 1734, +148, 839, 2784, 4966, 8540, 4293, -8866, -11923, -6504, -7947, -6613, -961, 201, 5534, 4250, 2351, +-1692, -4914, 4647, 9954, -2938, -2385, 3706, 1288, 881, 1716, 4801, 7720, 7711, -1613, -11481, -10149, +-5405, -7612, -3762, -732, 2503, 5392, 2781, -78, -4313, -3430, 7976, 6803, -5497, -1159, 3365, 1567, +1680, 2936, 7529, 8772, 4782, -6489, -11797, -7727, -4020, -6447, -1779, 375, 3648, 4038, 960, -3174, +-5164, -594, 9193, 2416, -5655, -438, 3313, 2155, 2237, 5712, 9517, 7924, 648, -10299, -10821, -4321, +-3520, -5211, 202, 1109, 4010, 2527, -1684, -5284, -3731, 1296, 8228, -1084, -4429, -640, 3342, 2124, +3390, 8602, 9716, 6552, -4279, -11368, -8603, -1117, -3961, -3031, 1411, 2178, 3370, 704, -4620, -5049, +-2419, 3314, 5013, -2441, -3307, -1178, 3386, 2665, 6023, 9726, 9614, 4127, -8416, -11077, -5032, 646, +-5006, -609, 2106, 1925, 2156, -2209, -6656, -3738, -1179, 4148, 1665, -2086, -2740, -1873, 3487, 4499, +7900, 9593, 9136, -458, -11154, -9055, -1249, 632, -4489, 1721, 2111, 1350, 1126, -5498, -5817, -3345, +1214, 3418, -1311, -469, -2673, -2776, 4656, 6876, 8680, 10256, 7898, -5930, -10802, -5900, 1951, -160, +-3379, 2920, 1205, 807, -1527, -7873, -4274, -2924, 3488, -359, -1579, 250, -3308, -2853, 5877, 8238, +8771, 11545, 3095, -9042, -8929, -2941, 4160, -1198, -1702, 3673, -234, 97, -4696, -6952, -3563, -1135, +4589, -4090, 410, 205, -3941, -2386, 7233, 7598, 10457, 10254, -2480, -9109, -6885, 408, 5294, -2517, +410, 3022, -1760, -690, -7068, -5460, -3985, 2328, 1717, -5474, 2426, -1283, -3573, -750, 7242, 8562, +12087, 6501, -6011, -7660, -4765, 4006, 4940, -2823, 2436, 322, -2109, -2872, -7230, -4734, -2849, 4859, +-1881, -4788, 3341, -2526, -2664, 312, 6402, 10273, 10724, 1898, -7499, -6057, -1685, 7085, 3195, -1940, +2604, -2936, -2061, -5261, -6275, -5137, 463, 4339, -5509, -2529, 3105, -3745, 26, 860, 6866, 11233, +8514, -1886, -7204, -4119, 1927, 8355, 1524, 383, -356, -3946, -2590, -6323, -5817, -3416, 3103, 1419, +-6443, -1038, 1819, -3341, 2338, 555, 7815, 10264, 5393, -4462, -6491, -1510, 5756, 7942, 999, 936, +-4157, -3358, -4720, -5886, -5554, -471, 3307, -1178, -6105, -162, 84, -821, 3396, 709, 8108, 8790, +2487, -6099, -5305, 1899, 8514, 6813, 1923, -1554, -5646, -4136, -6387, -4814, -4565, 2129, 2508, -2809, +-5142, -333, -195, 1878, 3056, 1597, 6404, 7311, -462, -6259, -3503, 5387, 9480, 6342, 1486, -4521, +-5568, -6153, -5192, -4339, -2430, 3522, 817, -3825, -4189, -878, 1326, 3803, 2615, 1910, 4365, 6251, +-3762, -4923, -723, 7859, 9450, 6712, -1372, -6554, -5830, -8246, -3477, -4198, -379, 3391, -952, -4460, +-4484, -1001, 4582, 3710, 3227, 563, 3641, 4059, -5187, -2897, 2277, 8818, 10296, 6139, -5255, -5995, +-8047, -7286, -2391, -3243, 1899, 3003, -2410, -4428, -5468, 1543, 6827, 3433, 3613, -1401, 3685, 195, +-5161, -747, 4455, 9291, 11772, 2819, -7380, -5919, -9969, -5226, -2809, -1016, 2728, 2344, -3655, -5410, +-5381, 5091, 6430, 3812, 2163, -1779, 3011, -3020, -3151, 1193, 6572, 9950, 11684, -844, -7361, -7751, +-9998, -4448, -2392, 1004, 2757, 757, -4588, -6171, -3495, 8049, 5843, 3551, 395, -1164, 338, -3789, +-822, 2689, 7869, 10788, 9782, -4387, -6704, -9989, -9201, -3668, -805, 1855, 3014, -752, -5565, -6465, +257, 8974, 5518, 3221, -1498, -403, -2967, -3387, 1365, 4765, 8766, 11397, 6481, -5638, -6628, -11675, +-7553, -2916, 789, 2553, 2920, -3049, -6135, -5604, 3720, 8582, 5751, 1287, -2139, -600, -6031, -1411, +3023, 6540, 9124, 10414, 3139, -5616, -8294, -12660, -5903, -1481, 1785, 2730, 2255, -5078, -5669, -3962, +6300, 8548, 5410, -1306, -483, -3232, -8026, 1790, 4206, 7977, 9110, 9314, 1010, -5329, -10167, -11936, +-3908, 267, 1882, 2988, 511, -5921, -5416, -2044, 8058, 7714, 3778, -2563, 496, -7156, -6521, 4746, +5684, 8572, 8092, 8484, -909, -5977, -12064, -10265, -1816, 743, 1367, 3180, -1849, -6008, -4513, 860, +9357, 6764, 1438, -2473, 81, -10773, -3171, 6164, 7088, 7549, 7083, 7215, -2946, -7342, -12291, -7529, +-212, 1035, 1922, 2024, -3321, -4792, -4114, 3973, 9590, 4862, -428, -1103, -2435, -12391, 1035, 7380, +7878, 6344, 7766, 4928, -4141, -8454, -11933, -4628, 797, 842, 1498, 332, -3613, -4330, -3036, 6982, +8315, 3187, -1081, -566, -5919, -10521, 4480, 7989, 7088, 5743, 7240, 3235, -5893, -10289, -9637, -1896, +364, 1097, 600, -1078, -2998, -4136, -1283, 8998, 5969, 1996, -1999, -652, -8236, -7855, 7409, 8189, +6279, 5720, 7244, 1999, -7751, -10657, -6319, -1256, 287, 949, -766, -927, -2934, -5019, 1322, 8357, +4862, 1041, -2391, -922, -9446, -5028, 9494, 6682, 5048, 5708, 7568, 128, -9508, -8510, -3636, -956, +1358, 221, -1349, 699, -3806, -4158, 3365, 6310, 2905, -1601, -2037, -411, -9776, -1138, 9919, 5105, +3986, 4961, 6192, -3026, -9386, -5226, -1864, -758, 2396, -1790, -341, 1966, -5006, -2449, 3512, 3867, +-37, -3922, 88, -330, -9741, 2862, 8383, 3390, 5056, 5397, 4912, -5263, -7134, -1859, -1813, 449, +2715, -4061, 2112, 784, -4751, -466, 2088, 1651, -3017, -4355, 3206, -2327, -7942, 5497, 5150, 2024, +4164, 5397, 4153, -4269, -3997, -769, -1324, 2502, -807, -5285, 2546, -556, -1421, 136, -248, -456, +-4734, -3030, 5532, -4762, -3595, 6130, 1820, 810, 3117, 5231, 3788, -2352, -1176, -860, -1081, 4303, +-3513, -5470, 2242, 456, 637, -686, -500, -1629, -5029, -545, 4065, -6014, 1296, 4045, -578, 76, +3225, 5451, 4253, -1487, -516, -2464, 750, 3182, -7068, -4636, 1007, 2169, 1436, -671, -655, -1705, +-3639, 1028, 1149, -4238, 4181, 817, -2101, -327, 3338, 6132, 4525, -739, -182, -3232, 2833, 153, +-8479, -4519, 1166, 4290, 773, -572, -1108, -1204, -1661, 539, -2139, -706, 4308, -1144, -2225, 500, +4690, 6657, 3506, 175, -971, -2899, 3355, -2485, -8341, -4227, 2702, 4387, 162, -1306, -1813, -627, +-108, -1961, -3966, 2146, 2640, -1622, -1833, 2174, 5673, 6152, 3482, -61, -2061, -1486, 2820, -4935, +-8102, -3641, 4583, 4208, -616, -1727, -1818, 1031, 304, -5449, -3426, 3642, 968, -1441, -866, 4436, +6245, 6769, 2949, -1417, -2537, -108, 1233, -6545, -7441, -3363, 6657, 2570, -1295, -2327, -864, 2431, +-398, -8732, -965, 3614, -56, -1116, 250, 5968, 6241, 7894, 1523, -2771, -2151, 1009, -1710, -6389, +-7871, -1154, 7206, 899, -1291, -2791, 700, 3473, -2584, -10280, 1535, 2324, -206, -703, 1978, 6430, +7346, 8677, -1440, -3447, -1748, 1179, -3762, -6167, -8243, 2041, 5877, 182, -1591, -2728, 2610, 3449, +-5896, -10064, 2385, 897, 841, -393, 3692, 7186, 9734, 7578, -3726, -3523, -1125, 94, -5365, -6183, +-6987, 3845, 4040, 631, -1902, -1970, 5306, 2255, -8852, -8049, 1379, 647, 1127, 325, 5042, 7807, +11096, 4970, -5139, -3641, -50, -1634, -5609, -6429, -5536, 4534, 2822, 1040, -3190, 244, 7171, -1178, +-9857, -6782, -109, 1338, 1784, 2148, 6022, 8728, 11780, 1920, -6710, -2909, -85, -4229, -5044, -6590, +-3684, 4744, 2988, 584, -3022, 3956, 7161, -4375, -9087, -7347, -1290, 2296, 2160, 3450, 6801, 9735, +11034, -1137, -7073, -1424, -2033, -4416, -4736, -6397, -2189, 4868, 2916, -577, -1160, 6871, 5271, -6300, +-8583, -8542, -1513, 2876, 2989, 4806, 7195, 10432, 9308, -3610, -5864, -1634, -4199, -3362, -5607, -5760, +-1101, 5116, 2213, -926, 1946, 7534, 2484, -7544, -8100, -9524, -1287, 4113, 4520, 5106, 7551, 10735, +6642, -5365, -4014, -3903, -4279, -2773, -6556, -3904, -495, 5261, 1407, 803, 3838, 7763, -170, -8331, +-7905, -10560, -1052, 6161, 4893, 5428, 9162, 10102, 4636, -5195, -3240, -6467, -2804, -4550, -5714, -3277, +192, 4686, 2208, 2320, 4772, 7315, -3513, -7725, -8767, -11111, 435, 7842, 3982, 6133, 9187, 8952, +2799, -4020, -4594, -6910, -2337, -6237, -4199, -2498, 347, 5861, 3549, 3285, 6365, 5667, -6236, -6893, +-11220, -10314, 2313, 7636, 2822, 7584, 7793, 8349, 1747, -3180, -6128, -6384, -2808, -6643, -1500, -3072, +1634, 7228, 4849, 3384, 7981, 1765, -6618, -7326, -12354, -7632, 3507, 6787, 3653, 7905, 6891, 8038, +987, -3712, -8364, -5937, -4486, -4979, -831, -3813, 3919, 9033, 5214, 4292, 7613, -1435, -5756, -9514, +-11874, -5423, 3178, 5279, 3962, 7384, 7176, 7879, 854, -5691, -9193, -5452, -5190, -2728, -1227, -4336, +6953, 9633, 5291, 5558, 5321, -3115, -5481, -11552, -9470, -3159, 2144, 4520, 4593, 7409, 7302, 8145, +-304, -8668, -8669, -5754, -4611, -695, -2657, -2407, 9750, 10035, 5693, 5599, 2214, -3706, -6995, -11554, +-6896, -3013, 1054, 3697, 4330, 8008, 7684, 9097, -3447, -10055, -7851, -5251, -2824, -672, -3432, 104, +12359, 9776, 5817, 4665, 369, -4734, -7740, -10448, -5311, -3335, -91, 1719, 6051, 8102, 8838, 9048, +-8358, -9771, -7699, -4124, -2688, -636, -3532, 3201, 14190, 8751, 5295, 3804, -1343, -4877, -7903, -8774, +-4248, -3297, -2674, 951, 8001, 6773, 11523, 4912, -11508, -8736, -6418, -3105, -1899, -47, -2933, 7690, +14387, 7924, 5683, 1863, -2048, -5083, -8814, -7520, -3779, -5295, -5221, 2911, 8418, 8386, 13468, -1539, +-11428, -7417, -5507, -2871, -815, -879, -1298, 11523, 12269, 7724, 5232, 181, -1636, -5119, -8968, -5708, +-4106, -8215, -6885, 5577, 8247, 10850, 10128, -6520, -9727, -6722, -4709, -1748, 622, -1189, 2470, 12955, +10367, 8239, 2964, -1190, -1172, -6537, -8346, -4131, -6467, -12282, -4990, 7456, 9270, 13224, 4579, -7507, +-7950, -6532, -4061, 215, 886, -1238, 6057, 12639, 9493, 8024, 495, 481, -1484, -7238, -6042, -4507, +-9397, -13653, -2512, 8402, 11694, 9919, -54, -6342, -7900, -6341, -1710, 1529, 691, 923, 8026, 11251, +9803, 5795, 47, 2120, -4161, -6569, -4828, -6981, -12160, -13174, 70, 10183, 12306, 4410, -51, -5817, +-8397, -5114, 602, 1626, 1117, 2533, 7694, 10715, 8926, 2778, 2387, 1301, -5820, -4490, -5073, -9524, +-13261, -11109, 2749, 12912, 8958, 1317, 1591, -7090, -8529, -2750, 2028, 1078, 3030, 2402, 8673, 10337, +7088, 2160, 5211, -1618, -5116, -2948, -7141, -11819, -13041, -9422, 6000, 12546, 4152, 2483, 1815, -8743, +-7415, 278, 2010, 1954, 3122, 2576, 8189, 9004, 4723, 3541, 4937, -3687, -2935, -3701, -9580, -12606, +-12677, -6341, 9333, 9174, 2208, 4738, 361, -10076, -4984, 1933, 2216, 3071, 2697, 2916, 8093, 7744, +3904, 5446, 3358, -4340, -1865, -6249, -11393, -12790, -11805, -3049, 9876, 5039, 3083, 5549, -1760, -9795, +-1697, 3382, 2694, 4005, 1873, 4239, 6911, 7190, 3607, 6384, 1137, -3353, -3290, -9402, -11511, -13067, +-10258, 379, 8043, 2853, 5219, 4690, -3662, -8525, 1486, 3492, 3706, 3748, 1534, 4514, 6075, 7349, +3578, 7274, -511, -2763, -5363, -10822, -11613, -12883, -7373, 1548, 5112, 3071, 5155, 3525, -4846, -6436, +3604, 3639, 4606, 2047, 2029, 4072, 6842, 6361, 4591, 6390, -1959, -2542, -8540, -10311, -11566, -11354, +-4620, 1374, 4315, 3846, 4815, 2745, -5452, -3052, 4646, 3787, 4393, 1101, 1722, 4259, 7800, 4472, +6100, 5203, -3105, -4024, -10211, -9210, -12023, -9107, -3143, 325, 4082, 3547, 4664, 600, -4552, 521, +4574, 4259, 3738, -139, 1980, 5350, 7894, 3613, 8136, 2363, -4153, -6457, -9784, -9269, -12344, -6195, +-3006, -362, 4158, 3647, 3512, -708, -1338, 2414, 4263, 4922, 2206, -438, 2558, 7273, 6321, 4376, +8387, -951, -5485, -8077, -8414, -10042, -11324, -3356, -4312, 162, 4491, 3915, 1521, -393, 1751, 2480, +4127, 4141, 783, -490, 3774, 8081, 4952, 6315, 6778, -3759, -6801, -7342, -7163, -11246, -8467, -2480, +-5825, 1859, 4098, 3308, 2, 2004, 3658, 2597, 3910, 3129, 245, -25, 5434, 7733, 4738, 6924, +2790, -6195, -7806, -6739, -7058, -11491, -5105, -3298, -4426, 3056, 3652, 2246, -829, 4592, 3937, 2280, +3496, 2591, -335, 715, 7060, 7985, 5010, 5853, -172, -8060, -8065, -5674, -8249, -10217, -2814, -5200, +-2226, 3106, 3174, 929, 760, 6551, 3306, 2407, 2929, 2356, -739, 1829, 8699, 7562, 4365, 3992, +-3340, -9490, -7016, -5481, -9684, -6741, -3270, -5229, 342, 2381, 2309, 147, 3376, 6846, 2904, 1967, +2605, 1486, -500, 3665, 10443, 6375, 3434, 1743, -5930, -9073, -6189, -6406, -9170, -4191, -4479, -3210, +1005, 1751, 1073, 745, 5330, 6396, 2196, 1961, 2329, 1543, 112, 6326, 10748, 4693, 1498, -357, +-7403, -9294, -6079, -7672, -7551, -3404, -4659, -1253, 986, 1520, 710, 2172, 6871, 5752, 1554, 2024, +1840, 1360, 1045, 9396, 9710, 2804, -469, -2044, -8294, -9179, -6012, -8262, -5211, -4300, -3109, -989, +124, 1258, 594, 3134, 7579, 5014, 1859, 2009, 2299, 1427, 3977, 11572, 7844, 95, -1779, -3482, +-9674, -8248, -6484, -7837, -3935, -4324, -2286, -1610, 238, 985, 956, 4104, 7340, 4685, 2222, 1164, +3104, 2964, 6517, 12207, 5174, -2511, -1707, -5229, -10246, -7061, -7654, -6678, -3797, -3628, -2345, -1338, +657, 962, 1670, 4752, 6625, 4985, 2179, 1287, 5127, 3784, 9005, 11048, 865, -3366, -2561, -7080, +-9623, -6617, -8554, -5027, -4353, -3503, -2470, -758, 65, 1613, 2390, 4510, 6556, 6226, 1149, 2751, +7333, 4558, 11506, 7472, -2585, -4216, -2849, -8965, -8496, -7056, -8668, -4172, -4904, -2747, -2209, -393, +-388, 3003, 2790, 4664, 7273, 5756, -262, 7084, 7540, 6205, 12192, 1893, -4615, -3890, -4175, -10275, +-6363, -8233, -7790, -4182, -4948, -2613, -1115, -795, 1069, 3935, 2266, 5432, 7607, 4422, 1729, 10806, +6787, 9135, 8819, -2784, -5279, -3963, -5941, -9465, -5880, -9230, -6916, -5761, -4667, -1804, -926, -1634, +3662, 3818, 1944, 6496, 7099, 2721, 6281, 11811, 6969, 10852, 4213, -5810, -5389, -4431, -7798, -8719, +-6804, -9078, -7423, -6632, -3827, -898, -771, -482, 6439, 2319, 3191, 7763, 5174, 4181, 11311, 10525, +8097, 9210, -713, -7570, -5297, -5164, -8423, -8321, -6337, -8386, -8646, -6363, -2364, -144, -1389, 2039, +6538, 946, 5387, 6830, 3665, 8785, 12528, 10220, 9652, 5654, -4351, -7662, -5403, -5858, -9303, -7630, +-6871, -10006, -10243, -5262, -1067, 99, -550, 5347, 4683, 1446, 7375, 4326, 6096, 13963, 11426, 11126, +7962, 1903, -7163, -8290, -5384, -6961, -8697, -7224, -7273, -11404, -11152, -3578, 39, -229, 1792, 6396, +3809, 3638, 7583, 3345, 11424, 13411, 10036, 10647, 4572, -1637, -9092, -6817, -5333, -7549, -8069, -7103, +-8976, -12823, -10364, -1450, 667, 1160, 3641, 5721, 3410, 5801, 6493, 5120, 15903, 11010, 10846, 9091, +1446, -5548, -9480, -5800, -5725, -8026, -6893, -8028, -10706, -12791, -8171, -27, 3030, 2604, 3164, 4271, +3298, 6788, 4680, 10196, 15496, 10142, 10632, 6459, -1353, -7035, -8525, -4470, -6391, -8126, -5833, -10891, +-12454, -12878, -6436, 1380, 5625, 3109, 3783, 3684, 5282, 6478, 6840, 13654, 13064, 9914, 8503, 3542, +-4140, -7788, -7635, -3709, -7323, -6547, -7192, -13607, -12416, -11694, -4720, 4486, 6720, 3357, 3051, 4025, +6315, 6183, 9775, 13710, 12533, 8949, 6992, 1539, -5711, -8019, -6045, -4712, -8370, -4417, -11850, -14756, +-12228, -10239, -2576, 7417, 6619, 2469, 1555, 5480, 6132, 8935, 11336, 12398, 11819, 6686, 5465, 509, +-6541, -8249, -4821, -6763, -6596, -5592, -15922, -12071, -12408, -7796, 1698, 8848, 5718, 1388, 2329, 6725, +7444, 10680, 9776, 12459, 8627, 4984, 4431, -1214, -6392, -6818, -4334, -7819, -4702, -9695, -16600, -11282, +-12068, -3716, 3804, 8913, 4287, 521, 4039, 7617, 10249, 9595, 9124, 10965, 4569, 3691, 3201, -1539, +-6166, -5570, -4811, -6571, -4599, -13876, -13956, -12063, -9112, 876, 5271, 8556, 1830, 989, 5355, 9305, +12585, 7970, 10152, 7394, 2306, 3522, 2075, -3110, -6590, -4754, -6717, -6662, -7049, -15609, -13120, -12130, +-3573, 2691, 6346, 7220, 640, 3027, 5108, 13203, 11437, 7025, 8280, 3600, 2824, 3375, 1338, -1207, +-5759, -5174, -7373, -5200, -10462, -15956, -13261, -9081, 1293, 3705, 7646, 4002, 694, 3477, 7816, 14921, +9540, 6881, 4790, 1965, 3115, 1962, 1287, -745, -6827, -6840, -7718, -6110, -14150, -14673, -12287, -4525, +3410, 4531, 6940, 2944, 2357, 3254, 12643, 14264, 7459, 4077, 2043, 1893, 2407, 487, 3003, -878, +-7459, -7075, -6977, -8404, -15609, -14205, -9468, 144, 4868, 6111, 6116, 3177, 1645, 5878, 14841, 11772, +5436, 1261, 515, 1936, 1563, 337, 4849, -2779, -7869, -7082, -6492, -11676, -16271, -13521, -5903, 2789, +5864, 5222, 6386, 2949, 1089, 10758, 14534, 9817, 3146, -97, -519, 1838, 188, 1108, 3919, -4439, +-7990, -6687, -6693, -14870, -15411, -10395, -1991, 5644, 5863, 5257, 6972, 369, 3846, 13690, 12059, 7157, +498, -1475, -32, 1458, -500, 3618, 1666, -5079, -7850, -5379, -10628, -16368, -13670, -7690, 1309, 7934, +4612, 7103, 5635, -900, 8979, 13488, 11023, 4932, -1441, -2259, 750, -30, 720, 3652, -327, -5098, +-7270, -6281, -13770, -15735, -11486, -4733, 4688, 7899, 4656, 8485, 1772, 1723, 12536, 10588, 9686, 2266, +-3127, -2114, 195, -1152, 2512, 1343, -944, -4048, -7019, -8077, -14879, -14203, -8895, -1107, 7376, 6720, +4358, 7443, -1167, 6289, 11579, 9609, 8675, -682, -3037, -1700, -921, 423, 2862, -781, 246, -4324, +-7855, -9880, -15965, -12905, -5628, 1867, 8577, 4680, 5674, 5108, -28, 10585, 9008, 11026, 5654, -2635, +-2809, -3080, -1385, 2096, 1384, -1275, 826, -5456, -8787, -11899, -16157, -9662, -3317, 5615, 8445, 2662, +6263, 2615, 3487, 10680, 7976, 11712, 2029, -2936, -3397, -3924, 194, 2736, -268, -948, 762, -6162, +-9959, -14153, -14010, -7303, -730, 8573, 5761, 2279, 6483, 2581, 6745, 8697, 9241, 9949, -616, -2949, +-5696, -2442, 2066, 1534, -802, -128, -291, -6710, -11602, -15529, -11206, -5010, 3366, 8409, 2930, 2426, +6407, 3987, 7612, 7743, 10909, 6666, -2070, -4689, -6046, 22, 2476, 417, -278, -962, -338, -8700, +-14267, -14473, -8821, -2500, 6716, 6525, 705, 3909, 7114, 4986, 7032, 8546, 10977, 3100, -3151, -6867, +-4480, 1931, 2182, 332, -556, -1178, -1404, -11479, -15291, -12762, -6378, 1699, 7623, 3347, 395, 5692, +7129, 5669, 7175, 9787, 9819, 572, -5738, -7320, -1921, 2274, 2435, 209, -2366, -173, -3563, -14170, +-14366, -10250, -2905, 4951, 6187, 612, 1821, 6943, 7221, 5871, 8213, 10525, 7817, -3083, -7672, -5873, +-480, 3454, 2658, -1561, -2235, 400, -8034, -14700, -13297, -7682, 931, 6245, 2861, -114, 3459, 7094, +7230, 6876, 8728, 10600, 4518, -6837, -8030, -3888, 1007, 4489, 1548, -3297, -565, -1967, -10972, -14337, +-11540, -3324, 3815, 4853, 1006, 1196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 40, 389, 653, 679, 425, 532, 787, 776, 796, +801, 1005, 1137, 914, 1039, 1419, 1656, 1620, 1627, 1450, 880, 534, 264, -7, -442, -439, +-64, 396, 462, 446, 516, 548, 448, 59, -17, -34, 110, 217, 229, 167, 93, -64, +-267, -302, -115, -35, 69, 177, 401, 530, 617, -27, 1230, 715, 306, -2100, 3268, 1316, +-970, 2814, 1471, 2407, 2177, 1336, 2174, -1018, -430, 1064, 314, -1107, 4412, 4865, -4500, -4846, +-1154, -163, -2892, -4674, -1030, -4544, -5362, -7437, -7556, -6305, -4480, -4132, -3298, 1348, 1474, 1903, +214, 372, -687, -292, 1404, 1235, -553, 68, 2594, 4221, 4926, 4611, 6567, 7686, 4491, 3502, +2281, 614, 1346, 3718, 4515, 4085, 6094, 7349, 6764, 5485, 5495, 5051, 5880, 6739, 5633, 5148, +5852, 5357, 3226, 2676, 3369, 2223, 1848, 1195, 1092, -682, -3212, -2334, -2271, -4262, -5848, -5616, +-6065, -6142, -6736, -6109, -6195, -4094, -10517, -4528, -3438, -3592, -1776, -366, -1653, -1380, -899, -2766, +-1506, -5749, -1327, 1484, 1993, 2231, 6344, -146, -10031, -4497, -3507, -5174, -5326, -4647, -2295, -5577, +-6610, -6474, -10073, -6328, -6865, -6656, -3306, 903, 821, -206, 2374, 2536, 1893, 3347, 7166, 5533, +5920, 7144, 10255, 11283, 9178, 8973, 10259, 8433, 6028, 3900, 2880, -806, 1653, 4196, 3462, 2702, +4610, 8285, 3975, 5554, 7194, 3910, 3101, 4513, 5334, 3066, 2017, 4286, 1755, 1828, 3723, 2293, +3624, 2274, 5686, 2180, -9261, -1384, 6032, 1697, -8316, -11247, -4935, -723, -10026, -13298, -8263, 165, +-7098, -16324, -6210, 3636, -5159, -10898, -8637, -1156, -5421, -9654, -6531, -5091, -2689, -2174, 1146, 5693, +3731, -633, 3464, 5828, 336, -5179, -2446, 2328, 3030, 551, -890, 3103, 6709, 6041, 1165, -195, +-1227, -3115, -2444, -139, 114, 1829, 6324, 7856, 8359, 9060, 10469, 3109, 6739, 5975, 4381, 3333, +1892, 4024, 2518, 1048, -2969, -2718, -3001, 112, -4479, -5749, -1208, 5859, -3336, -12628, 201, 4041, +-2823, -9346, -10183, -4422, -7405, -13256, -11263, -8867, -806, -1300, -4245, -307, 2768, 2140, 1322, 1257, +2054, -229, 1254, 2479, 2261, 1456, 6196, 7709, 7328, 6052, 6891, 4061, 2439, 4980, 50, 474, +185, 7738, 9066, 4953, 8055, 15145, 11518, 291, 3424, 6488, 4560, 3759, 1751, 1588, -2568, -1578, +-3789, -8803, -4664, -3697, -5294, -6055, -3077, 217, -1331, -5543, -10061, -11112, -7099, -5005, -10696, -10609, +-3049, 1695, 6, -1684, 417, -1593, -4990, -1694, 459, -2581, -6847, -5723, -1786, -808, 244, 279, +5717, 3174, 10752, 7031, 4432, 3772, 3682, 5749, 4621, 9351, 10493, 12669, 5931, 6220, 10321, 8636, +5153, 9325, 3511, -5762, -2262, 5706, 5066, -8837, -14395, -2119, 3696, -8804, -13842, -5702, 1873, -7471, +-13507, -2769, 7785, -212, -9391, -10114, -6809, -7100, -9366, -11504, -5095, 2587, 4826, 6033, 6768, 3631, +1335, 1990, 1437, -2605, -4812, 556, 10849, 8076, -2930, 2881, 7604, 2914, 850, -6351, -3371, -8745, +-8203, -7575, -5956, 76, 1147, 2788, 8354, 14936, 12712, 15204, 14912, 9378, 5182, 5946, 6787, 3413, +3462, 4525, 6630, 4453, 2324, 1283, 3466, 1055, 1170, 46, -3453, -6808, -2468, 742, -1681, -6915, +-1944, -108, -4000, -16, -2497, -4064, -2014, 2252, 2052, 1280, 11, 34, -621, 753, 3838, 5730, +459, -2865, 1130, -4022, -6006, -3365, -7289, -16173, -19409, -16484, -16121, -19329, -18678, -17248, -12896, -3297, +-5597, -4077, 1062, 7831, 2700, -2769, -2141, 4132, 2322, 2648, 6959, 13101, 16065, 13690, 15921, 12844, +9170, 7495, 5921, 3181, 1569, 5275, 10526, 10972, 5141, 2721, 4756, 8588, 3624, -735, -870, 2944, +3985, 3949, 1181, 965, 1913, 2856, 1870, 2082, 7055, 4662, 6661, 9325, 8578, -1737, -2368, 1152, +7095, -1833, -13012, -7167, -2279, -9266, -15896, -12392, -4693, -1306, -11446, -14152, -3098, 869, -8703, -18936, +-13704, -7572, -12839, -15364, -6768, -2551, -1785, -3825, -1882, -236, -4301, 211, 4111, 4781, 254, 1437, +8889, 9826, 5169, 1241, 3333, 7727, 10461, 6149, 3558, 5137, 3022, 2628, 4669, 5423, 2706, 5840, +10604, 14307, 13076, 15974, 15135, 12350, 7951, 6944, 6084, 6755, 4583, 3821, 4375, -4026, -3430, 157, +480, -4487, -457, 1209, 2969, -1224, -4221, -4069, -6969, -8874, -11878, -10571, -10151, -1888, -8679, -15886, +-9425, -4758, -7606, -11605, -17432, -13850, -14226, -12965, -12524, -15226, -9307, -11135, -9519, -4132, 413, 1542, +5144, 3841, -708, -4463, -4098, -2910, -5267, -1253, 3712, 12681, 16807, 18784, 19484, 19721, 16278, 13415, +9978, 6822, 6996, 12745, 13203, 9705, 11089, 13518, 13557, 7911, 7368, 5628, 8743, 12172, 9667, 4788, +6164, 6887, 1421, -60, -885, 3089, 6329, 4237, -660, -720, -541, -5321, -10420, -11537, -8294, -10117, +-14427, -9470, -5114, -16385, -17517, -10272, -11432, -16691, -18152, -12606, -12604, -17902, -18612, -15464, -14970, -16326, +-18170, -13666, -2761, 66, 6237, 7987, 8398, 5171, 1545, 637, 2188, 3125, 4979, 10074, 16111, 19693, +15868, 15280, 12746, 8950, 10711, 8805, 3777, 1275, 2662, 965, 2397, 4579, 6491, 8220, 14413, 17913, +14531, 14657, 14616, 11845, 8906, 12163, 6477, 8916, 9499, 9272, 6659, 5126, -691, -703, -2746, -7792, +-7636, -12761, -8796, -8450, -7938, -12783, -11088, -17982, -23460, -20992, -17830, -17575, -19041, -19381, -14613, -16659, +-16618, -13850, -14126, -13122, -13374, -6172, 2014, 5997, 9349, 14277, 13486, 8438, 6857, 2647, 318, -2214, +3622, 6739, 10573, 11031, 11165, 11370, 11621, 9860, 9784, 7206, 2852, -263, 2082, 2502, 2989, 7635, +12831, 18248, 21249, 24276, 19509, 17458, 18126, 14133, 8862, 10182, 7274, 7640, 7699, 4200, 1266, 1726, +-3084, -8895, -13050, -13609, -14935, -15653, -14529, -11033, -12846, -14234, -10805, -12606, -23425, -23595, -16601, -15963, +-19846, -21213, -14736, -14180, -16693, -16782, -13437, -9950, -11017, -8821, -1884, 5534, 6370, 13629, 15393, 11481, +5120, 3272, 3045, 907, -255, 1727, 5595, 7912, 10730, 12368, 15538, 14293, 13164, 14728, 11523, 6756, +5338, 5852, 7388, 11766, 15368, 18199, 20447, 25906, 24714, 19821, 18179, 14951, 9133, 6225, 5554, -1291, +-879, -1179, -2764, -5895, -7677, -12188, -11873, -10904, -13571, -13062, -14632, -9082, -6932, -10161, -9686, -7457, +-16939, -20156, -16109, -16060, -20788, -23549, -17202, -17350, -22258, -20815, -15150, -12415, -14748, -16361, -8509, 2824, +4495, 7908, 14407, 17098, 11801, 7686, 5314, 4565, 1087, 1063, 3791, 10264, 13376, 14408, 17743, 19969, +17776, 17194, 15391, 9895, 4398, 4026, 5135, 6704, 11262, 14418, 17572, 20616, 22881, 16913, 13913, 12533, +9002, 3883, 5776, 3544, 3551, 4252, 2808, -245, -788, -3745, -5694, -7625, -10388, -12359, -12532, -11869, +-10074, -10486, -13333, -10904, -12521, -25728, -25835, -20643, -20962, -26651, -26448, -18117, -19376, -22518, -19410, -14987, +-13666, -15605, -12494, -4812, 4050, 6111, 13458, 16523, 15746, 11726, 6840, 4815, 4133, 4264, 5165, 8983, +13196, 17642, 16831, 18225, 17848, 15915, 14694, 10462, 4277, 1931, 2475, 3049, 5646, 10326, 15417, 18178, +23128, 23312, 19221, 17258, 15144, 11770, 8389, 9620, 4175, 7287, 5735, 4579, 1761, 163, -6996, -8093, +-9080, -15764, -16191, -16870, -11332, -12556, -14308, -14252, -11513, -22814, -29909, -24133, -20723, -25788, -30006, -23059, +-18166, -22801, -23062, -17659, -12044, -12558, -15131, -8118, 3644, 7133, 11679, 18660, 20651, 15927, 11011, 8467, +7439, 3762, 3360, 5517, 11372, 14573, 15733, 16675, 18408, 17341, 15504, 12820, 7533, 1770, 2500, 3287, +3736, 8552, 13550, 19261, 21985, 26172, 22611, 19736, 17332, 13355, 8809, 7638, 3954, 1744, 3750, 3307, +545, -813, -4810, -8693, -9308, -12655, -18028, -18437, -14974, -11126, -12837, -14123, -10102, -11093, -24850, -25530, +-18992, -19322, -26388, -27352, -21581, -21040, -23656, -21978, -17909, -16229, -16535, -14312, -5624, 4443, 6517, 16377, +19523, 18669, 13884, 10637, 7617, 5363, 3523, 5466, 8302, 11312, 15862, 16257, 18319, 18029, 16919, 16348, +12492, 5843, 2692, 3744, 3037, 4118, 9693, 16446, 19855, 23546, 23661, 19758, 17798, 15418, 10298, 5882, +7659, 976, 4098, 2255, 1994, -947, -1351, -6822, -7288, -9044, -14301, -15418, -14708, -9890, -11023, -13026, +-11128, -10260, -22902, -26283, -20204, -19463, -26255, -27934, -22229, -21174, -23782, -22158, -18006, -16234, -16531, -14312, +-5624, 3870, 6236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -17825, -5464, -10852, -10183, -6546, -6516, -5809, -391, 4254, -3913, 1220, 14529, +13733, 986, -3551, -1732, 6281, -1519, -2773, 2126, 9719, 10870, 13580, 16761, 7255, 13589, 11918, 13573, +7415, 5722, 14244, 11108, 9329, 15163, 24210, 17027, 8871, 5801, 7136, 2757, 1716, -3786, -11064, -14912, +-7403, -7177, -11243, -11246, -14342, -14190, -12046, -7143, -5397, -2804, -2043, -8548, -7413, -3884, -1465, -8262, +-12392, -10289, 176, 3875, 1830, 146, -2590, -1884, -1457, -8598, -10672, -4470, 2255, 6536, 11601, 10559, +18871, 19472, 11403, 7156, 10738, 15941, 4647, -335, 4235, 7543, 4224, 2133, 8256, 9075, 440, -798, +6056, 7829, -6405, -9448, -4407, -4563, -7447, -12526, -13555, -12442, -11962, -13408, -13769, -5619, -3143, -4991, +-10903, -8089, -2022, -5169, -9978, -13231, -3907, -555, 4891, -1268, -1699, 5614, 5554, 1283, -437, -5587, +-6855, -1372, -6508, 4254, 3210, 5163, -4501, 2141, 5204, 2081, -1915, 1612, 13038, 6468, -2634, -1132, +12768, 16402, 2631, 697, 9364, 13004, 8044, 4263, 1550, 4187, 1499, -2425, 2718, 6412, 4393, -583, +3425, -171, -2645, -8048, -2853, 1855, -5662, -2649, 1462, 2756, 816, -2989, 2393, -1527, -2373, -342, +265, 2264, -1830, 7854, 4856, 2710, -7162, 4279, 10486, 6324, -6589, -1965, 2596, -2396, -4301, -3947, +-6168, -14689, -14208, -14946, -10296, -16085, -19749, -12369, -9257, -7374, -5939, 2613, 5016, -1220, -8815, 6014, +8924, 739, -3895, 3156, 14273, 12356, 6981, 14612, 13457, 3660, 6193, 5686, -3530, -6745, 35, 2963, +7798, 10056, 13823, 4737, 2077, 3169, -2451, -6210, -2087, 5134, -9061, -6307, 2994, 7963, -4402, -6580, +-2992, -10549, -14801, -19015, -17380, -16440, -12829, -13420, -5848, 3932, 4800, -955, -3457, 919, -8272, -7514, +-4990, -3239, -3846, 4418, 9071, 8514, 2683, 6639, 7230, 1723, 4150, 3437, 11944, 6205, 15154, 16263, +17396, 15791, 8806, 7305, 10006, 17331, 3319, -4048, 3909, 14918, 8319, 676, -3289, -895, -5222, -7669, +-12041, -9507, -11723, -9794, -5819, -3666, 3983, 3881, 674, -5062, -7449, -11611, -11692, -10199, -14209, -11293, +-4972, 4119, 2720, -1031, 1933, 3042, 4788, 2769, -6496, -7007, -5885, 8898, 5078, 7875, 9819, 12078, +9816, 1239, -2154, 1681, 9252, 456, -4318, 2037, 9521, 8956, 2873, -5635, -9896, -8997, -9110, -16981, +-18378, -19706, -17685, -6779, -348, 628, -1544, -3326, -6242, -9154, -7992, -9149, -2561, 1419, -89, 7899, +18078, 15241, 7012, 8955, 7037, 3813, 3597, 3644, 3186, 3949, 13849, 21675, 13445, 5413, 1445, 509, +514, 1561, -1697, 2138, 10051, 8289, 762, 5937, 5166, -11146, -18588, -10495, -6266, -10627, -12560, -8746, +-2778, -597, 3306, 7235, 7095, 842, -10555, -9186, -3341, 661, -8563, -5696, 4279, 7143, 2725, 10420, +11821, -372, 3518, 4085, 2086, -6310, 357, 7170, 12145, 16270, 15483, 8660, 8762, 12773, -2169, -13372, +637, 8029, -2183, -8367, 4479, 6076, -6779, -15059, -13169, -9091, -12658, -21319, -21093, -13482, -5005, -4346, +-4268, -1398, -7457, -16314, -13773, -11514, -16396, -15800, -6822, -709, -1419, 4611, 16425, 19028, 8039, 2470, +4214, -2620, 2536, 868, 5019, 13983, 23060, 22591, 23153, 21656, 5154, -8659, -5862, 7744, 5951, 156, +-34, 4184, 5149, 782, -6105, -1407, -3919, -12270, -11441, -7199, -2606, -1297, 303, -2223, -5180, -3231, +-2552, -6809, -9351, -11045, -9285, -2962, 2707, -4849, 5903, 10423, 4645, 6891, -2054, -3773, -5620, 3360, +137, 4673, 10153, 27860, 31366, 16991, 5450, 6046, 6348, -2267, -2851, -4346, -6406, -4846, -2185, -7893, +-7811, -4334, -10517, -16628, -13817, -7516, -6759, -5510, -3767, -6100, -1904, 3941, 6682, 579, -303, -3419, +-209, 3027, -9005, -4040, 7666, 11510, -2276, -3386, -2531, -953, -7749, -5760, -1615, -2965, 10836, 22348, +20924, 131, 1220, 12184, 4278, -12831, -10023, -6406, -8563, -10977, -14025, -10240, -2163, -6284, -15834, -7694, +287, -3095, -3609, -1540, -613, -6921, -1901, 4579, 7754, 3662, 2156, 4945, 3913, 1888, -5761, 5518, +4815, 1860, 265, 5130, 3021, -4147, -2111, 3317, 13648, 8509, 17529, 24647, 21408, 8102, 9882, 13580, +15005, 12776, 7433, 37, 85, -265, -10284, -11275, -6173, -7462, -7864, -5684, -1196, 314, -3352, -9572, +-18902, -16119, -10096, -7163, -4573, 275, -3260, 451, 10671, -5112, -5858, 1120, 749, -4620, -1325, -4957, +-4355, -3628, -2775, 6014, 1785, 10705, 20531, 20468, 559, -2953, 5520, 6831, -277, 209, -5039, -6784, +-3423, -12722, -19608, -14307, -10419, -16046, -9708, -1355, -68, 1732, 965, -6356, -12403, -3884, -677, -2077, +3818, 6533, 8023, 16187, 10042, 3474, 6812, 7693, -270, -720, -6870, -1949, -10288, -6806, 2028, 524, +5786, 19846, 27825, 8553, -1704, 5592, 11443, 1967, 2853, -36, -3626, 949, -2067, -13473, -11790, -9038, +-17975, -14137, -3438, -435, 3778, 4793, 2989, -7654, -5130, 354, 956, 3064, 5292, 5969, 10704, 15019, +7866, 10182, 7546, 2271, 1550, -4467, -6261, -10884, -5609, 383, 5927, 4649, 17903, 29687, 20423, -391, +820, 8724, 2146, -55, -109, -5561, -5523, -2165, -10871, -15633, -15911, -20152, -19895, -12597, -6972, -5749, +-1426, 1624, -9024, -11839, -7104, -2759, -1747, 1229, -2769, 1710, 11326, 1700, 2647, 3426, 2979, -2519, +-1941, -7422, -7974, -10236, -5679, 2299, 2710, 13308, 24390, 25510, 5331, 2009, 6727, 5956, -1404, 2963, +-1673, -5297, 257, -4029, -10875, -10292, -11045, -17771, -8412, -3137, -4450, -1273, 2940, -3846, -11253, -5325, +-418, -1092, 2831, 4324, 4423, 11196, 6600, 4928, 6499, 4633, -352, 4901, -2437, -269, -8345, -2116, +6164, 5951, 9063, 21796, 30278, 14773, 4637, 6213, 8433, -500, 3335, 220, -7632, -3065, -2104, -12003, +-13128, -13733, -21737, -13285, -6125, -6179, -3870, 805, -3793, -14060, -7882, -1990, -1671, 2711, 4950, 4773, +11979, 7255, 5005, 6921, 4734, -362, 4850, -2469, -297, -8369, -2125, 6164, 5961, 9048, 21330, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-143, -251, -143, -180, -206, -231, -293, -228, -312, -303, -291, -326, -297, -332, -366, -369, +-342, -415, -399, -434, -325, -440, -404, -323, -430, -323, -423, -464, -327, -410, -370, -331, +-337, -280, -278, -260, -197, -219, -197, -152, -156, -75, -170, -93, -133, -13, -45, 25, +-3, 35, 59, 88, 122, 151, 180, 230, 299, 278, 418, 312, 448, 432, 531, 381, +564, 599, 713, 647, 820, 517, 342, 764, 1353, 1797, 2309, 1729, 691, -361, -81, 199, +-452, -1852, -1374, 205, -452, -1249, -593, 306, 510, 486, 1479, -556, -3609, -2713, 1833, 1952, +661, 2178, 4056, 612, -2174, -1527, 440, 343, 1674, 4119, 4460, 2987, 4589, 6963, 7642, 7299, +8145, 7172, 5358, 5051, 6056, 4758, 3331, 4657, 6327, 5689, 4075, 3778, 2818, 1543, 2586, 5961, +6977, 5672, 5450, 5823, 4204, 2134, 1645, 1072, -1213, -2745, -2605, -3117, -5634, -7495, -7691, -8403, +-9470, -8700, -6496, -5308, -6178, -6547, -6399, -6458, -6909, -5916, -4919, -5570, -7545, -7898, -7568, -8446, +-9112, -8316, -7970, -8716, -9015, -7870, -7109, -6983, -5650, -3817, -3759, -4542, -4528, -4913, -6472, -7068, +-5602, -3695, -2882, -1785, -516, -517, -1288, -735, 822, 1656, 1447, 1586, 1854, 1402, 870, 1118, +1474, 777, 604, 1358, 1777, 1951, 2975, 4999, 6304, 6695, 7357, 7098, 5711, 5358, 6944, 8272, +9060, 9649, 10476, 10256, 9262, 8889, 8713, 8716, 8330, 8596, 9542, 9189, 8675, 8729, 8942, 8291, +7704, 7250, 5925, 4216, 3026, 2144, 297, -1513, -1448, 302, -152, -2261, -2751, -3369, -4712, -5539, +-3085, -2794, -4261, -3942, -176, -464, -3845, -3609, -1020, -2917, -4961, -3287, -1804, -1296, 168, 1761, +1602, 2464, 5606, 8324, 8786, 9608, 9787, 8392, 5779, 5565, 5030, 4148, 3304, 3752, 3105, 1865, +871, -755, -2471, -3007, -650, 2791, 4245, 3495, 2933, 2809, 1634, -351, -1693, -4106, -6914, -8684, +-7802, -7710, -9964, -11622, -11961, -14060, -16808, -16783, -14039, -12319, -11553, -10694, -10066, -9589, -8853, -7845, +-6434, -6494, -7534, -8596, -8693, -9149, -9754, -8534, -8049, -8406, -8367, -7027, -6300, -5869, -4395, -2327, +-1908, -2111, -1784, -2059, -3617, -4550, -3811, -2653, -1951, -1222, -721, -936, -1399, -850, 181, 949, +1485, 2696, 3520, 3379, 2574, 1960, 972, 55, -706, -202, 190, 660, 2245, 4993, 7402, 8760, +10532, 11663, 11141, 10600, 11839, 11986, 12636, 13900, 15386, 16026, 15805, 14737, 12985, 10472, 9866, 10695, +10960, 10382, 11708, 14014, 14181, 12600, 11641, 11598, 11809, 10985, 11680, 9473, 6562, 6043, 9635, 10453, +9686, 10965, 12057, 7525, 2323, -580, -103, 1842, 4691, 6667, 7276, 6522, 5592, 4093, 3531, 5537, +7568, 8165, 8081, 8108, 6807, 5005, 4315, 5497, 8270, 10582, 11324, 10105, 7735, 5840, 5151, 5512, +6067, 5563, 3403, 1694, -127, -2359, -4308, -5572, -7589, -9159, -9130, -8198, -9454, -11925, -13426, -15265, +-17311, -18118, -18031, -19041, -21805, -23838, -24397, -23593, -23183, -22068, -20227, -19332, -20713, -22143, -21480, -20719, +-20353, -18417, -16309, -15437, -15898, -16142, -16106, -16400, -15105, -12693, -10665, -9900, -9052, -8863, -9391, -9663, +-8343, -5999, -3447, -1450, 326, 1145, 908, 602, 1474, 2769, 3696, 3682, 3414, 3394, 2755, 2058, +1906, 2296, 3006, 4480, 5761, 6103, 5531, 6061, 6724, 7897, 8503, 9242, 8624, 8766, 8636, 8834, +10478, 12125, 15333, 17587, 17815, 17682, 17040, 18469, 19417, 19027, 17604, 17351, 18966, 17554, 15980, 15953, +15592, 15305, 12820, 13379, 8093, 2710, 2104, 5234, 4930, 4548, 7204, 8986, 3709, -716, -2440, -2221, +-3110, -131, 3268, 5028, 7127, 9955, 10425, 9076, 9284, 9885, 7905, 6954, 8483, 10417, 8548, 6423, +7470, 9162, 9974, 10359, 10389, 7916, 4935, 4730, 6517, 6884, 5847, 5940, 7165, 5612, 3319, 2189, +278, -3691, -6641, -6822, -7055, -9485, -12270, -14211, -17260, -20609, -20346, -18286, -17913, -19873, -21388, -22550, +-22090, -20331, -17951, -15635, -14703, -15610, -17279, -17653, -18001, -19095, -19301, -20413, -21467, -21165, -19305, -17854, +-16716, -14165, -11712, -11384, -11447, -10511, -10165, -10966, -10672, -8713, -6688, -5726, -3881, -2508, -2970, -3525, +-2891, -1345, -934, -784, -413, 207, 789, 1433, 2458, 2926, 1399, 376, 962, 1618, 2024, 3385, +5474, 6890, 7482, 8523, 8724, 6963, 7374, 9332, 11256, 11843, 14788, 15964, 16677, 17327, 16324, 15568, +14960, 15760, 16554, 16011, 14654, 15384, 15546, 13405, 12673, 11955, 11112, 10922, 11617, 9981, 5597, 1893, +5794, 9155, 8089, 8737, 10830, 7161, 2702, 745, -114, 301, 2455, 5625, 5751, 6565, 8876, 10856, +11555, 14240, 15971, 13831, 11445, 13405, 14122, 13193, 10343, 10477, 11877, 12841, 13289, 11406, 9976, 7355, +5635, 6499, 8736, 8566, 6993, 6517, 5956, 4050, 3180, 2799, 355, -4589, -5847, -4654, -6201, -11050, +-14355, -16545, -20579, -23318, -22308, -21016, -22539, -23967, -24016, -23338, -21819, -20584, -18983, -18829, -21302, -23835, +-24331, -23050, -24051, -25214, -26023, -28224, -29346, -27575, -25402, -24026, -21602, -18096, -16002, -14593, -11639, -9021, +-8936, -9487, -7900, -5436, -2983, -1436, 355, 1413, 1985, 3367, 5934, 8137, 8832, 8217, 6925, 6080, +5769, 5909, 6871, 6440, 4593, 3045, 2144, 663, -572, 44, 2407, 4093, 6213, 7574, 6560, 4788, +5775, 7728, 9370, 12382, 14752, 17958, 18319, 17810, 16382, 14073, 14893, 15857, 16191, 15692, 16698, 18811, +18251, 18099, 18165, 18479, 19283, 18889, 19262, 14826, 9666, 9967, 13609, 14855, 14129, 14762, 13403, 7672, +2697, 236, -691, 264, 3581, 6322, 6019, 5895, 5940, 5754, 6367, 6285, 5706, 3440, 4070, 6787, +7012, 4674, 3551, 5765, 8998, 9608, 8765, 7947, 6520, 4239, 4766, 6653, 7778, 6580, 5852, 4816, +2813, 386, -595, -2848, -7947, -11189, -10721, -10433, -14281, -17627, -19657, -23206, -26463, -25953, -23884, -24548, +-27058, -27656, -27468, -25340, -23580, -22216, -22161, -24383, -27666, -29615, -28820, -28238, -29211, -29432, -30860, -31293, +-29678, -26336, -24259, -21434, -17714, -14839, -13500, -11576, -8180, -6677, -6218, -4392, -1404, 1693, 3379, 5556, +7296, 7960, 8887, 10304, 12136, 13008, 13028, 12733, 11581, 10828, 10178, 10709, 9915, 8202, 7277, 7733, +7570, 7191, 7139, 7727, 8984, 10519, 11624, 10663, 9096, 8350, 10365, 12241, 14568, 16741, 18872, 19193, +18305, 16362, 15557, 16613, 16954, 16484, 16772, 16657, 16211, 14680, 14796, 14616, 13617, 13389, 13792, 12460, +8083, 4602, 6298, 7366, 7276, 8559, 10902, 8074, 3641, 1363, -627, -2304, -1285, 1955, 4482, 6585, +9590, 10250, 9488, 9871, 11264, 9451, 6957, 7796, 9080, 8564, 5231, 2921, 3472, 6047, 7520, 7055, +5720, 4511, 3312, 4128, 5728, 5975, 5439, 6832, 7587, 6523, 4237, 2208, -1816, -7904, -12090, -12728, +-13602, -16768, -19279, -21559, -24562, -26294, -24845, -22248, -21931, -23534, -24316, -23991, -21676, -19278, -17699, -17414, +-19404, -21437, -22863, -22929, -23534, -24467, -25599, -27985, -29667, -28680, -25813, -23917, -20951, -16852, -14025, -12340, +-10066, -7918, -8165, -9036, -8137, -5302, -2217, -259, 2036, 3404, 4171, 5474, 7179, 9138, 9889, 10112, +9719, 9419, 9254, 9363, 9751, 9071, 6850, 5289, 4227, 4374, 4253, 5682, 7139, 9926, 12994, 14598, +14525, 13158, 13500, 15484, 17797, 20028, 22212, 23820, 22934, 21132, 18774, 17384, 16944, 15620, 15465, 16756, +18219, 16535, 15563, 16003, 15373, 14867, 14955, 15238, 12198, 8315, 9269, 12325, 12197, 13014, 15451, 15782, +11317, 7709, 4165, 3093, 1705, 3550, 5537, 7641, 10025, 13128, 12914, 11549, 9773, 8627, 6618, 5756, +5558, 6171, 4248, 1791, 516, 808, 2188, 2219, 2139, 1743, 1910, 3342, 4825, 5494, 4468, 3763, +3947, 1753, -380, -3244, -6181, -10826, -15391, -17568, -18213, -18954, -21322, -23381, -24591, -26548, -26722, -25559, +-24172, -25285, -27191, -27559, -26294, -24693, -22568, -21975, -23835, -26897, -28052, -27340, -27587, -27464, -27840, -29087, +-31184, -31969, -30418, -28054, -26362, -23656, -20438, -17803, -15319, -12802, -10486, -9726, -8844, -6028, -1692, 2437, +5209, 7020, 7735, 8713, 10837, 13980, 15937, 15907, 15209, 14724, 13565, 12712, 12925, 12851, 11763, 10512, +10037, 10146, 9999, 10434, 11385, 12925, 15061, 17207, 16680, 15895, 14360, 14238, 15386, 16633, 18181, 20188, +21470, 20860, 18902, 17068, 17196, 15198, 13908, 14800, 17119, 17008, 15388, 15941, 14689, 13486, 13425, 14360, +10994, 6341, 4647, 7739, 8901, 8963, 10934, 13780, 10720, 7796, 5119, 2703, 835, 2429, 4094, 5126, +5316, 8394, 10994, 10687, 8704, 7669, 5260, 3731, 4112, 3832, 1923, 599, 142, 1152, 2311, 3038, +3134, 2878, 2507, 2899, 5761, 7626, 7129, 5533, 6195, 4885, 2672, -89, -1962, -5475, -10820, -13840, +-15678, -17383, -19601, -21563, -23574, -26079, -27435, -26338, -25624, -25971, -27997, -29517, -28445, -26394, -23313, -20956, +-20895, -23389, -26090, -26599, -26484, -26159, -25976, -26711, -29276, -31577, -31070, -29062, -27058, -24426, -21167, -18365, +-15696, -11996, -9702, -8784, -8118, -6431, -2495, 1026, 4690, 6266, 6458, 5949, 6462, 8992, 11113, 11916, +11903, 11736, 10966, 10042, 10078, 10463, 9604, 8493, 8644, 9492, 9740, 10107, 11083, 12168, 14412, 16971, +17608, 17548, 16659, 17264, 17720, 18731, 20535, 22067, 24735, 24874, 23768, 21348, 20196, 19090, 16535, 15662, +16521, 17176, 16172, 16037, 15379, 14392, 14219, 14192, 12366, 8170, 4547, 6690, 8980, 9645, 10796, 13394, +12655, 8946, 5752, 2852, 1159, 1879, 3603, 4952, 6090, 9051, 11799, 12015, 11409, 9819, 8414, 6344, +6646, 6486, 5526, 3865, 2204, 2348, 3864, 5267, 4778, 4259, 3909, 3828, 5877, 8137, 8389, 6624, +6779, 6130, 3876, 973, -1424, -4414, -10088, -14141, -16493, -17976, -20050, -22228, -24366, -26783, -28474, -27565, +-26400, -26074, -27916, -29681, -28950, -27000, -24015, -21443, -20851, -22841, -25665, -26565, -26588, -26275, -26021, -26629, +-28961, -31370, -31116, -29094, -27032, -24499, -21384, -18576, -15940, -12295, -9897, -8900, -8265, -6711, -2895, 666, +4351, 6027, 6334, 5912, 6399, 8855, 11024, 11882, 11892, 11728, 10971, 10042, 10079, 10462, 9895, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +3829, 5166, 3193, 3108, 8209, 5639, 7005, 5031, -363, 5373, 5779, 4917, 1079, 766, -830, -10646, +-9272, -2446, -4019, -6065, -4492, 907, 2399, -2870, -1378, 745, 746, 3811, 1907, -1706, -3552, -933, +2634, 1284, 2279, 3906, 4531, 8051, 8895, 8462, 9391, 5815, 3126, 28, -1773, -1303, -684, 1441, +-937, -869, 813, -579, 393, 1480, 302, -2780, -3959, -1902, 1230, 5260, 7485, 7588, 6993, 3611, +2764, 3809, 2088, -537, -2706, -5666, -5584, -4188, -4306, -4205, -2511, -1217, -4214, -3593, -1178, -1824, +-1565, -2177, -3377, -4552, -2879, 1368, 4802, 6263, 6172, 7018, 7660, 7280, 9817, 10465, 6225, 3063, +1400, 1077, 2582, 3023, 1875, -183, -920, 596, 2129, -395, -2747, -1032, -216, -4853, -3904, -2419, +-8169, -6230, -101, 5054, 6414, 4614, 4736, 11473, 9596, 11596, 6481, 914, 7523, 4521, 2432, -2496, +-2985, -7809, -20068, -13386, -5827, -10695, -11200, -6979, 14, -1411, -6689, -1100, 354, 2159, 7131, 3992, +-1189, -3476, 2019, 5543, 2607, 4801, 7447, 7854, 13173, 15848, 14144, 13613, 8912, 2351, -2790, -2979, +-821, -2114, -1899, -3576, -4754, -3763, -3138, -507, 1053, -463, -3157, -3801, -2180, 2433, 9241, 10528, +9526, 6416, -347, 1475, 3420, -2773, -6370, -6935, -14225, -15099, -6912, -4611, -7005, -1264, -1627, -2718, +-847, -540, -5436, -5323, 2176, -1774, -4388, -961, 4245, 5291, 2989, 7899, 12276, 6235, 3650, 12490, +14037, 6764, 2750, 510, -2032, 5330, 5958, -4026, -3626, -2653, -4623, -521, -274, -1578, 5612, 159, +-2998, -1854, 3402, 7573, 6010, 3413, 8579, 2504, -692, 3133, -971, 5900, 3358, 1866, 5325, -4118, +-10445, -14636, -17753, -15822, -14481, -12883, -8895, -2582, 2003, 1296, -1869, 1513, 4034, 6512, 2962, -586, +234, 862, 772, 1203, 1247, 937, 5233, 8893, 10706, 11976, 10872, 8488, 6406, 1402, -2545, -394, +-1291, -1934, 128, 2452, 2228, 1206, 4733, 7186, 2578, 394, -1439, -6303, -1452, 9998, 6865, 1639, +10665, 1818, -7196, -2039, -3266, -7277, -2251, -4334, -9328, -12658, -4529, -634, -8527, -1409, 121, -3975, +-3621, -1179, 2531, -8746, -21928, -15943, -14280, -10390, -2225, 4321, 7516, 5260, 14126, 15467, 12921, 17346, +12485, 6277, -810, -6662, -2402, 4154, 2860, -359, 2903, 5225, 3616, 8775, 18462, 14983, 8121, 5081, +1325, -1783, 2319, 2074, -1475, 2941, 4176, 1409, -2389, -4078, -3262, -9782, -15266, -8605, -8968, -14935, +-8213, 461, 3303, -896, -2440, -5270, -4606, -2077, -11684, -16705, -18694, -18793, -9551, -2071, -9271, 4174, +10422, 719, 4471, 12504, 14785, 13347, 7141, 6168, 2474, -2957, 6628, 8339, 13878, 19607, 13628, 14157, +13915, 15482, 7560, -7984, -8844, -9362, -9886, -9138, -4125, 7215, 3584, -1054, 3415, 4560, 7681, -101, +-7762, -7017, -12567, -13088, -14076, -18609, -15437, -11674, -7270, -1193, 7085, 11709, 4910, 3056, 6395, -1664, +-7919, -9680, -3000, 5419, 2473, 5764, 8135, 3539, -2310, -6267, -2569, -2620, -6315, -147, 2426, 3993, +5272, 10101, 9094, 10728, 19216, 10863, -3402, -4567, -2643, -3954, 1361, -7001, -15817, -10063, -462, 12487, +15938, 13287, 15510, 9948, 2883, 4231, -8422, -7403, -1931, -4389, -2644, -6195, -5171, -6385, -14061, -4828, +-285, -8684, -13279, -3126, 6667, -373, -6897, -4334, -3633, -629, 4027, 6023, -5638, -19589, -11951, -141, +-2480, -6134, -1672, -3969, -3866, 3883, 16997, 17236, 8779, 6827, 11920, 11063, 14587, 11834, 7749, 17850, +22263, 18541, 9393, 5030, 584, -14365, -17674, -10882, -12321, -12519, -5556, 4129, 4171, -7871, -6955, -5136, +-1187, 3722, -11340, -18398, -20232, -19066, -11559, -11722, -17814, -8957, -2484, 3340, 16598, 16024, 13282, 18497, +8065, 2848, 1378, -3545, 9070, 17200, 12033, 5929, 4651, -868, -12962, -10947, -2825, -8495, -16929, -12638, +3525, 17123, 14417, 15643, 14700, 9441, 15335, 8579, -994, -12191, -20476, -16148, -17776, -18567, -14983, -12338, +-1166, 16961, 19844, 13960, 11636, 13229, -1015, -3344, -5685, -14458, -3597, -1022, 3391, 12710, 7567, 3644, +-7582, -12358, -3099, -5496, -10900, -10639, -3008, 9967, 9919, 6563, 4244, 5815, 3938, -5018, -5880, -18388, +-25889, -10585, -10855, -19568, -11819, -6296, 7611, 25362, 26596, 29447, 23774, 11876, 9671, -4296, -8925, 3611, +10821, 11624, 4400, 10433, 8687, -3420, -2066, -3645, -12658, -19380, -14440, -4763, -6537, 554, 5299, -1779, +-490, 899, 709, 6298, -8407, -14823, -5496, -16738, -19327, -13033, -15213, -3413, 11066, 11155, 21896, 21095, +10827, 356, -7005, 2230, 650, 459, 5365, 1791, -828, -7625, -3295, 4464, -7015, -6447, -1817, 1023, +14308, 9834, 9763, 21829, 14216, 11183, 7541, -3542, -2582, -9159, -7778, -4878, -19392, -22200, -12435, -12341, +-2565, -2942, 6185, 22652, 17941, 7280, -7561, -4212, 3173, -2218, 814, -367, -2117, -13470, -22149, -3652, +2061, -5648, 339, -3170, 5639, 8684, 5045, 17174, 15158, 4553, 2068, -3043, -14550, -18349, -5502, -8226, +-20989, -16531, -5489, 1595, 13430, 13519, 19350, 25205, 22335, 20211, 11358, 17717, 18045, -2368, -5743, -6226, +-2491, -9124, -20073, -7997, -8408, -22467, -11592, 1353, 7062, 943, -7985, -4829, 1520, 4074, 4574, 623, +-9434, -20600, -12334, -7571, -11592, -1827, 4048, -989, 10233, 17472, 20163, 22504, 13386, 5089, -9856, -6826, +12577, 1450, -4634, -2555, -3616, -11449, -13720, -796, -1380, -14922, -13733, -5048, 11835, 15878, 14035, 19053, +11316, 7155, 11131, 4054, 7358, -4748, -7626, -9439, -25826, -13232, -2254, -4857, 4224, 2289, 7534, 16657, +13324, 7544, -8939, -12798, -1569, -8260, -9404, -2358, 6065, 3017, -12740, -3473, -681, -18178, -12476, -1906, +5365, 9096, 4992, 9352, 18323, 11501, 9947, 4528, -5101, -5939, -6006, -8855, -19466, -15906, -3948, -5922, +-2085, 4330, 7128, 20654, 30040, 26203, 8695, -2959, 8963, 4852, -1380, -1080, -3801, -3508, -8647, -67, +7433, -15172, -19218, -12337, -83, 7263, 519, 4862, 8051, 2981, 1203, -6710, -7085, -14532, -10740, -4542, +-22495, -16778, -6395, -4596, 8111, 7141, 6491, 14931, 19900, 22338, 10586, 231, 12286, 7802, -3604, -103, +-3889, -10791, -17961, -1902, 13487, -4099, -14269, -8154, 4765, 13639, 10081, 10532, 12256, 7387, 6293, -991, +-9110, -11262, -11456, -6725, -17250, -14969, 28, -842, 1719, 6543, 4533, 13944, 21053, 17298, 2538, -7090, +329, -183, -7283, -6223, -6556, -11463, -19190, -6130, 11022, 2645, -7713, -5331, 9972, 14704, 7959, 10764, +11428, 9534, 1121, -4002, -8980, -20319, -10122, -8947, -19654, -10646, -1227, 2556, 2865, 4074, 3740, 10810, +23262, 24117, 7727, -6358, -1286, 4132, 295, 4456, 4443, -7621, -15071, -5173, 10923, 5096, -11433, -6167, +5569, 12010, 9780, 11391, 17360, 13639, -123, -10564, -20067, -28268, -16031, -7102, -14323, -15837, -4540, 465, +1132, 9646, 3269, 6044, 13225, 13836, 6502, -178, 5950, 3521, -4876, -1343, 1320, -7438, -13326, 1473, +12000, 1100, -14935, -12105, 4002, 13822, 13012, 18319, 18763, 17876, 13712, 111, -8049, -22488, -16476, -12757, +-21039, -9691, -1064, 828, 1630, 4727, 4458, 6980, 12890, 15131, 4084, -1866, 5487, 3821, -4118, -6240, +-3494, -10480, -22191, -7179, 7533, 2720, -12334, -10573, 1763, 8786, 10853, 14375, 24597, 23597, 11104, -1135, +-9465, -17919, -12138, -12624, -26485, -19002, -1080, 5183, 7034, 10588, 4996, 6844, 14479, 17680, 6315, -661, +6017, 3877, -5034, -5563, -3606, -13798, -21869, -7392, 6506, 2975, -11080, -6888, 10487, 10429, 8247, 14928, +16942, 25956, 16776, 813, -8376, -23929, -11548, -8174, -22484, -18421, -6785, 830, -69, 5637, 4615, 2942, +8113, 11469, 1586, -714, 6379, 6194, -1886, -5717, -3965, -15155, -22084, -9128, 7356, 5801, -9325, -4229, +9311, 10969, 14395, 18053, 16111, 24431, 16940, 6509, -6119, -19056, -9923, -13256, -19367, -18888, -179, 6962, +171, 5970, 528, 5014, 5554, 7444, 1992, -3439, 4362, 3321, -2033, -6443, -6041, -10111, -23471, -13697, +5487, 3466, -8512, -2723, 4183, 6634, 8596, 14911, 18241, 26157, 24533, 6252, -11336, -20644, -7430, -10288, +-21009, -20921, -3099, 5904, 1516, 10846, 4611, 4920, 5522, 7488, -555, -4376, 7014, 5595, 441, -1378, +-3027, -12249, -23269, -9128, 3973, 2309, -9649, -8432, 5542, 10961, 8282, 15766, 19578, 21371, 23970, 12477, +-2575, -22590, -13583, -14420, -29401, -22402, -3948, 8874, 4256, 3296, 366, 1001, 3770, 6277, 3773, 1886, +7268, 5060, -1968, -1974, -872, -11993, -22328, -10661, 2791, 2873, -6100, -1021, 7737, 8216, 9345, 12411, +16046, 21183, 26954, 15826, -4597, -23513, -17506, -14573, -25768, -23368, -3166, 8913, 2498, 6648, 4447, 7850, +8884, 2264, -6536, -5183, 8719, 9869, 7085, 7332, -701, -15448, -26963, -12287, 3323, 681, -9036, -8360, +1312, 8026, 9896, 13973, 16739, 16304, 19786, 13945, -782, -19069, -12454, -12625, -30419, -27312, -5970, 10076, +10848, 8438, 5284, 8406, 7861, 3354, -2937, -1663, 8473, 6642, -77, 647, 2050, -12196, -27371, -14016, +786, -2887, -8620, -1084, 10726, 14030, 9886, 10779, 12944, 16435, 21396, 15826, -140, -19069, -12000, -9691, +-24523, -27671, -9002, 3720, 2339, 3579, 1135, 8626, 12056, 1600, -9817, -4980, 9499, 9141, 4863, 8171, +4515, -15284, -28561, -12992, 4238, -3177, -11283, 2231, 9714, 11266, 15495, 14436, 13328, 16126, 18781, 9845, +-3893, -21917, -18101, -15386, -24114, -24605, -6443, 7386, 5629, 6131, 1906, 10042, 15298, 3361, -13830, -9065, +9808, 10581, 6518, 12263, 11317, -8941, -24683, -13859, 2633, -2501, -12951, -2071, 6011, 5355, 7703, 9456, +9393, 12531, 15847, 9977, 1644, -14358, -10622, -15563, -26618, -24797, -10118, 5423, 4975, 6554, 2756, 7691, +15163, 6452, -10650, -11176, 9117, 13583, 5470, 9050, 10954, -7257, -25557, -15682, 1715, -5809, -18298, -499, +10934, 8237, 10875, 10985, 13219, 13253, 19117, 8350, -1479, -10779, -8565, -11098, -25055, -25164, -8127, 2903, +3944, 6957, -2020, 5793, 14775, 5663, -14721, -19237, 5484, 9759, 5603, 11920, 11763, -4905, -24720, -16052, +-173, -6629, -17592, -1521, 10050, 8855, 11890, 12273, 12534, 14595, 21986, 9514, -1408, -6564, -7594, -12152, +-27185, -25878, -9756, -363, 3360, 5564, -2138, 4869, 13475, 11090, -7800, -19203, -1192, 4977, 5651, 11925, +10753, -3149, -22314, -15010, 1883, -4051, -15386, -2381, 11855, 12293, 12186, 12317, 13275, 12996, 16021, 5390, +-6450, -8046, -2114, -8396, -27098, -29047, -11515, 964, 4065, 6424, -618, 3583, 11309, 7725, -8531, -18019, +-3166, 2551, 4763, 12423, 12648, -1524, -20309, -16294, -591, -2440, -11801, -1117, 12879, 14382, 9223, 7276, +10920, 12900, 16198, 4994, -9254, -10371, 1644, 476, -17652, -24683, -9578, 511, 772, 3026, 90, 5581, +8759, 4279, -8363, -20790, -9451, 2050, 7360, 13245, 12112, -1227, -17285, -14518, -2330, -5564, -16761, -7713, +8372, 16556, 13488, 8079, 11022, 14586, 18130, 8899, -7861, -13082, 1906, 994, -16519, -25565, -9480, 2982, +265, 154, -3426, 3761, 8827, 4248, -4515, -12388, -10343, -4313, 7263, 15486, 14645, 294, -17545, -15824, +-3338, -3613, -16410, -9724, 5518, 17094, 17036, 8434, 10723, 14536, 15744, 6390, -9094, -17923, -906, 3228, +-13972, -27755, -13990, 2497, 1008, 944, -3853, 4549, 9531, 3818, -4173, -9687, -6619, -5738, 3473, 12717, +13081, 1026, -16761, -14450, -4067, -4929, -14188, -7408, 3951, 15936, 17999, 8630, 12044, 16584, 21272, 9453, +-14372, -26584, -8613, 2759, -11503, -23363, -12309, 4047, 3560, 3002, -207, 7107, 7056, -1913, -7778, -7763, +-5876, -10144, 3467, 15250, 13712, 1630, -15588, -8587, -977, -5594, -18934, -12436, 2149, 13944, 19644, 7236, +6075, 12283, 16434, 8900, -9329, -24239, -12822, 876, -7065, -18026, -12674, 4477, 2208, -100, 257, 9118, +10128, -1005, -7417, -3739, -1978, -12478, -2378, 14703, 15551, 3536, -13654, -7505, 3869, 991, -13583, -12323, +-2134, 9052, 17148, 9108, 5999, 10945, 15409, 6172, -13031, -26384, -15819, 2, -6287, -16845, -12488, 2910, +1784, -2886, -1701, 9639, 7431, -7713, -12863, -4671, 2132, -8842, -4693, 13176, 15860, 6243, -8666, -2760, +8215, 784, -15465, -12975, -1610, 9526, 18189, 10216, 7175, 14392, 19168, 7466, -14870, -31696, -20921, -2190, +-7721, -18442, -13606, 2542, 1121, -3627, -2071, 9690, 7594, -7741, -12920, -4672, 2132, -8834, -5320, 11292, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 1200, -854, -1879, 1406, 1205, 3062, 2337, 1791, 3313, 2444, 3794, 2419, 335, 1584, 3140, +2151, 921, 356, -2658, -3615, -4839, -3128, -2121, -4184, -3091, -47, 299, 254, 112, 1789, 1331, +999, 3801, 1702, -643, -1113, 17, 1458, 170, 1569, 3702, 3726, 3948, 4389, 3813, 5289, 3489, +1079, -1358, -3428, -2010, -430, -79, -129, -225, -90, -1215, -531, 928, 298, 69, -1658, -1743, +-50, 1981, 3343, 4253, 2644, 2823, 3526, 2183, 1687, -25, -1464, -3793, -4214, -3100, -3575, -2746, +-2740, -2266, -725, -1713, -289, 146, 253, 2246, 1847, 675, -124, 142, 1532, 2484, 2214, 3907, +5127, 4812, 4424, 4038, 3934, 2626, 1561, 1296, 655, 443, -564, -655, -1573, -3767, 568, 767, +-2639, -3455, -832, 2015, -3585, -2931, -841, -1515, 1994, 1981, 3290, 5727, 5057, 4422, 2756, 858, +3130, 5771, 2545, 1935, -1579, -7151, -8102, -8542, -4930, -5994, -8779, -4714, 263, -47, -131, 689, +2004, 554, 2444, 5112, 1553, -1035, -80, 2665, 2728, 2104, 4768, 6128, 5789, 7034, 7008, 7166, +7162, 3146, 677, -3726, -4695, -2391, -1397, -953, -975, -1500, -1763, -3132, -1436, -336, -1059, -2599, +-3651, -1504, 1442, 3384, 5166, 4605, 2133, 3970, 4599, 3642, 1465, -1932, -3411, -5777, -5614, -7270, +-6920, -2291, -4098, -7242, -2892, -2251, -1370, -924, -2494, 5730, 1922, -946, 3581, -1571, 6213, 7395, +5727, 11470, 7412, 8709, 7669, 6052, 6441, 4234, -1883, -2388, -175, -3435, -2764, -4980, -4980, -3646, +-2904, -1123, -2644, -4725, -292, -797, -1332, -3619, -5000, -1582, 97, 1961, 2684, 4460, 5750, 4547, +3510, 3686, 3329, 3621, 4894, 1476, -874, -6177, -5421, -5193, -5654, -701, -5289, -5621, -1710, -3957, +-3006, -4180, 104, 2333, 2655, 4225, 5316, 6337, 7611, 9737, 7647, 6250, 3672, 6318, 5345, 1942, +1007, -2912, -7244, -10563, -6192, -2945, -8912, -8249, -4659, -2406, -885, -2065, 2177, 634, -2461, 2512, +1014, -3329, -662, 4075, 5522, 4475, 4267, 7488, 7691, 8433, 9451, 9118, 7224, 1370, -1651, -5029, +-7844, -7228, -7756, -3579, -1842, -7874, -6992, -5435, -4318, -3495, -4205, -1394, -2366, -2296, 1054, 3440, +8572, 14048, 12843, 10226, 8845, 7711, 9174, 6177, 2362, -2909, -10404, -12083, -12794, -8648, -8553, -10739, +-8746, -4384, -1431, -1530, -153, 1178, -725, -1587, -1738, -1048, -1048, 1322, 7109, 7283, 6727, 9144, +10847, 12545, 10083, 9159, 7622, 5863, 5292, 2032, -3217, -5177, -6556, -5863, -4128, -2991, -2260, -5286, +-9492, -6533, -7049, -12393, -9105, -7976, -4797, 1547, 4130, 12575, 13062, 10442, 14480, 8612, 5749, 7924, +6651, 2448, -7090, -11927, -12330, -13827, -11917, -6265, -8082, -8963, -6222, -1074, 2237, 1785, 1761, -781, +-3425, -4756, -3197, 2626, 2509, 8004, 13996, 8926, 12077, 14292, 15970, 17667, 10884, 8776, 8025, 4989, +2368, 1611, -7913, -13145, -13248, -9298, -5073, -10798, -12550, -9905, -10346, -8970, -8314, -8741, -7703, -5556, +1736, 5675, 5873, 7248, 8486, 7638, 5631, 9650, 9877, 4874, 5160, 2498, -2659, 108, -813, -2829, +-3816, -9696, -4084, -2238, -5013, 1498, 394, -2856, -3919, -6200, -6556, -8708, -4657, 1768, 2967, 104, +7393, 15100, 14831, 16234, 15214, 11840, 7202, 6326, 5156, 738, -4867, -7293, -4069, -8251, -7893, -3282, +-6334, -6996, -9896, -10681, -8650, -10721, -10226, -6014, -7306, -4407, 4024, 5401, 10561, 10735, 10442, 11481, +4938, 8034, 9892, 7783, 3638, -1631, -2933, -3686, -3502, 3621, 2652, -6460, -6082, -3149, -4795, -13496, +-8931, -2881, -7940, -1491, -525, -7012, 704, 1579, 5095, 7667, 112, 8843, 10587, 3547, 14002, 10895, +4785, 7376, 5651, 11637, 2008, -12493, -3302, -1983, -4176, 26, -3103, -8183, -10342, -12005, -9289, -12070, +-12435, -4583, -5556, -5871, -142, 6176, 12430, 10748, 8838, 12464, 12571, 9521, 885, -414, -2528, -1422, +5812, -685, 1779, 725, -3162, -2693, -8548, -6701, -2163, -3837, -4685, -7391, -10079, -8123, -7860, -685, +8670, 3624, 1922, 2401, 4601, 6612, 4628, 6605, 4135, 4704, 6386, 2810, 10900, 6552, 6212, 7779, +-2926, 3726, 4828, -2909, -1248, -10593, -13066, -8792, -9779, -4298, -3381, -15203, -11393, -7087, -3331, 1472, +-380, 4279, 7173, 4660, 5258, 1792, 8867, 5886, -1752, 3743, 1293, 4948, 9116, 2188, 3380, 2574, +1734, 1427, -4288, -5485, -1959, -3807, -3745, -627, -3536, -6755, -11297, -8719, -1884, -2015, 1395, 287, +1470, 2259, -1738, 1889, 4724, 10158, 10623, 4797, 8578, 7928, 10362, 13389, 5538, 2843, -1777, -5709, +-5112, -8074, -6396, -170, 1373, -4288, -8837, -13027, -10302, -8834, -6344, -2623, -6735, -7807, -2915, 5696, +3328, -2745, 1000, 7181, 6807, 2829, 6402, 9875, 2237, 5698, 6361, 4981, 12739, 7874, 3516, 422, +-7405, -1844, 4283, -1198, -3037, -7412, -17238, -16286, -12391, -2610, 1555, -2539, -1617, 5161, 4017, 879, +1642, 8656, 7617, 1351, 5993, 8004, 4783, 5581, 5762, 6096, 5461, 7019, 5713, -2017, -5236, -3381, +-1543, -1467, -6260, -9702, -16395, -20290, -16008, -7063, -3550, -4863, -5329, 602, 4800, 2201, 240, 4209, +8009, 3471, 156, 5042, 7582, 12010, 14938, 12447, 14434, 13500, 9761, 8127, 2527, -1243, -4278, -3871, +-7327, -10233, -13522, -19827, -19124, -11064, -6852, -5004, -5839, -1326, 5781, 226, -4354, -2586, 6497, 8591, +4249, 10127, 10131, 9797, 13256, 8970, 9470, 14946, 9077, 1710, -3390, -5851, -1729, -771, -5678, -10254, +-16857, -20735, -17394, -12431, -4269, -2759, -5761, -2091, 4387, 966, -5335, -6566, 3781, 8100, 4292, 8620, +11753, 13062, 17999, 16338, 16862, 19571, 15108, 6691, -1699, -6857, -6435, -5221, -7010, -11199, -13746, -18263, +-21204, -16405, -8927, -6469, -6159, -5509, 2923, 779, -5208, -4078, 3275, 9760, 7439, 8513, 12727, 10546, +13828, 14484, 11491, 15248, 18224, 11315, 1586, -5573, -7374, -4303, -3731, -9261, -13410, -18382, -21571, -18907, +-9936, -7510, -7749, -6920, -1102, 2349, -2301, -5600, 1986, 9858, 8319, 11652, 14817, 12161, 16736, 15718, +11990, 15126, 16270, 9131, 858, -5246, -5698, -652, -1545, -8477, -13080, -18234, -18867, -16940, -12576, -9099, +-10609, -11311, -1263, 3831, -153, -4135, -2188, 6344, 5686, 6685, 13077, 10750, 14059, 15208, 11491, 13550, +17061, 15034, 8181, -1175, -6065, -6572, -4581, -6415, -11131, -16817, -18886, -18358, -12295, -8655, -8950, -6627, +296, 5428, 621, -4646, -1750, 5241, 6546, 8476, 13770, 12135, 11868, 13190, 11225, 14831, 19352, 13953, +3459, -4031, -6289, -6482, -3482, -5956, -13341, -20864, -22934, -21093, -11912, -6948, -9697, -7355, -1287, 3823, +3442, -512, 1196, 7177, 5701, 5512, 12686, 12024, 14622, 18401, 12967, 14380, 17902, 14773, 8091, -308, +-6624, -8929, -7350, -9817, -14743, -20374, -22481, -19410, -13275, -7805, -8717, -10119, -1514, 6707, 4245, -1762, +-2002, 4684, 5042, 5515, 14773, 14379, 15596, 18316, 14307, 17012, 20187, 17641, 10444, -1108, -5972, -9978, +-10689, -9032, -14015, -20006, -23079, -24040, -16138, -8045, -9301, -10085, -2659, 3395, 2665, -3166, -4926, 2204, +3896, 5491, 13807, 15296, 16808, 21298, 18917, 19485, 22541, 19899, 11052, 1154, -4695, -5956, -5963, -7772, +-14903, -25435, -27865, -25417, -16943, -7957, -9761, -13098, -6730, 2445, 4660, 2163, -971, 2500, 3120, 4147, +13948, 17783, 16978, 23578, 20491, 17357, 21025, 19376, 10294, 486, -6754, -11154, -10817, -10172, -12582, -19312, +-27080, -26012, -18765, -9596, -7351, -12808, -10085, -593, -85, -822, -1732, 2746, 6071, 8260, 16892, 21640, +20563, 25507, 22483, 18491, 22689, 21094, 10992, 3426, -4835, -9768, -10128, -10977, -14032, -22095, -30042, -28790, +-22354, -14281, -11635, -13285, -8698, 1365, 956, -1687, -2320, 3777, 7992, 8265, 16009, 21490, 19907, 25979, +23522, 20513, 21521, 19634, 11268, 1364, -5057, -9682, -10181, -8399, -13305, -21899, -29094, -28862, -21582, -12408, +-11903, -15685, -14712, -4965, -481, -1269, 850, 7116, 9601, 10026, 17897, 25442, 24007, 26449, 22410, 17918, +20130, 19528, 10027, 1656, -5083, -9499, -8752, -7579, -11019, -19060, -30098, -31252, -25707, -14739, -10241, -15321, +-14806, -5382, -2204, -3149, -948, 4988, 10167, 10963, 17471, 23120, 21930, 26997, 25570, 18224, 19178, 20545, +11542, 1268, -5711, -11317, -12154, -6972, -9333, -17080, -28338, -31761, -25958, -15693, -10503, -13416, -12624, -3498, +166, -2065, -537, 6804, 10726, 12037, 17584, 22159, 19557, 23691, 23987, 18810, 20152, 20839, 13210, 2571, +-3836, -9382, -12480, -10758, -13568, -19726, -28040, -30500, -27486, -17601, -11946, -13574, -11990, -3357, 1033, -425, +-2039, 5286, 10479, 10703, 16678, 20573, 18597, 24010, 23877, 18427, 21569, 22299, 15219, 2818, -5430, -9435, +-12038, -7943, -10035, -18370, -28092, -30461, -26991, -17340, -9590, -11593, -11766, -2657, 1797, 216, -1138, 4719, +9611, 8244, 13290, 19204, 16799, 21500, 24418, 19246, 20312, 23937, 17093, 2455, -6116, -12269, -15665, -11180, +-12963, -18500, -27098, -30505, -26264, -16879, -8517, -7177, -8149, 448, 4424, 318, -2199, 3433, 8432, 7015, +10492, 17676, 17526, 21848, 24819, 18577, 18939, 22150, 17322, 4422, -5519, -11477, -16853, -12411, -12620, -16947, +-22856, -27601, -25639, -17939, -9887, -7201, -6967, 612, 5515, 1514, -4138, 104, 6174, 6434, 11776, 17525, +17114, 20802, 24311, 19905, 18679, 20311, 16076, 2414, -6595, -12163, -17512, -12318, -10482, -15518, -22111, -25935, +-22770, -14977, -6866, -6647, -9526, -2235, 2230, -337, -3880, -1945, 5037, 5907, 10667, 19973, 18800, 19386, +24197, 19060, 18688, 20105, 14225, 704, -6449, -11114, -14674, -9939, -9102, -12411, -18606, -22989, -20767, -13811, +-5873, -6104, -10976, -4611, 1766, -729, -4749, -3697, 2930, 3623, 5999, 15719, 17742, 18377, 23977, 17875, +15142, 17792, 15446, 3216, -4776, -10870, -16673, -10991, -7376, -9145, -13663, -18876, -17468, -12510, -6140, -4901, +-9013, -3381, 2314, -2025, -6493, -4353, 3180, 3930, 5886, 13428, 15054, 15872, 21154, 16124, 13857, 15847, +14725, 1789, -5591, -6876, -11709, -8006, -4307, -8359, -13186, -17275, -17230, -14109, -6967, -5683, -10462, -4693, +1785, -1156, -6067, -5909, 2458, 2799, 3920, 11112, 13028, 13646, 19850, 16082, 13599, 15820, 16414, 4840, +-3991, -5151, -10423, -5919, -1251, -5950, -10627, -17220, -17685, -12788, -6695, -4593, -10632, -6680, 1821, -938, +-4995, -7112, -1655, 59, 1151, 8796, 11438, 10488, 16619, 14490, 12779, 16114, 17419, 6870, -1683, -2693, +-8044, -5693, 137, -2722, -7918, -15532, -17785, -13406, -6183, -3525, -9571, -7609, 522, -1765, -7656, -9169, +-2102, -1349, -917, 6593, 10021, 9388, 17121, 16230, 13760, 15452, 15902, 8021, -1694, -2189, -5964, -6091, +793, -1738, -6721, -11752, -15275, -12728, -5887, -3376, -9086, -8665, -787, -2198, -7573, -11796, -4221, -1776, +-995, 6292, 9048, 8123, 15340, 16565, 15069, 17520, 17475, 10141, -1722, -3520, -5998, -6822, -154, -2381, +-7530, -13026, -15794, -12813, -6251, -3376, -9225, -9776, 337, -1868, -8270, -12802, -5840, -1931, -1757, 6038, +10881, 9501, 15379, 17467, 15440, 19298, 19818, 11501, -1975, -4555, -4927, -5520, 1450, 351, -4654, -11350, +-15961, -13051, -7720, -4549, -10577, -13530, -4243, -4637, -9024, -13410, -8384, -4511, -3385, 5064, 11021, 10308, +15837, 19819, 15134, 17361, 17870, 13047, 1649, -2638, -2319, -4933, 1288, 2691, -2892, -8907, -15203, -15038, +-9194, -5689, -10362, -13680, -4326, -3617, -8315, -14292, -10497, -4708, -4190, 5074, 11419, 9455, 13153, 19319, +16012, 18626, 19082, 13895, 1729, -3959, -2203, -4368, 1555, 4550, -1680, -7766, -14654, -14427, -9522, -7207, +-10293, -15469, -6685, -4635, -9910, -14722, -12177, -6018, -5713, 4044, 12601, 11389, 12335, 18834, 15844, 18108, +19067, 14689, 3690, -3371, -1828, -3130, 1842, 5229, -463, -6375, -13099, -12989, -8955, -6362, -9357, -16570, +-7951, -4322, -8766, -14226, -14501, -8527, -8059, 2342, 12684, 12769, 12121, 19197, 16874, 17051, 18442, 16206, +6741, -2671, -3085, -4785, -1574, 4601, 821, -5722, -12751, -13869, -9406, -7351, -9644, -16754, -8253, -3886, +-8490, -13246, -14878, -8083, -8228, 526, 12116, 11998, 9310, 17527, 16585, 17103, 19071, 16137, 8430, -1965, +-2926, -2688, -299, 5218, 1555, -5451, -12398, -13651, -9128, -6866, -9078, -16295, -8367, -3869, -8374, -13061, +-14878, -8136, -8228, 526, 12116, 11998, 9310, 17527, 16585, 17103, 19071, 16137, 8430, -1965, -2926, -2688, +-299, 5218, 1555, -5451, -12398, -13651, -9128, -6866, -9078, -16295, -8367, -3869, -8374, -13061, -14878, -8136, +-8228, -188, 12997, 9480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 2697, 4777, 231, 1529, 5592, 2595, 1670, 5597, 7197, 4558, -2125, +-2323, 990, 2621, -1603, -10672, -8261, -3239, -1828, 1181, -5329, -2616, 7577, 2252, -2159, 1784, 4345, +11760, 4554, -5617, -8820, -10440, -1474, -638, -3836, 1120, -527, 291, 3923, 6149, 8273, 5677, 4308, +1760, -2750, -3825, -1424, 141, -3138, 802, 6628, 5726, 3138, 2613, 6211, 2897, -3154, -3464, -3735, +-5359, -888, -1482, -568, 8018, 2241, 2431, 6057, 35, 1928, 1784, -585, -4908, -4670, -466, -3663, +-1850, 4084, 5708, 995, -2565, 645, 748, -485, -8493, -12484, -4854, -3226, 62, -2095, -9225, 380, +9527, 3566, -181, 2581, 7206, 11879, 4376, -3657, -8467, -5917, -1233, -2813, -1718, 3183, 3002, 889, +5121, 12248, 5296, 3733, 2571, -1612, 434, -7231, -2844, 4757, 3649, 6692, 8314, 9154, 3523, 2824, +9347, 384, -7346, -11092, -8922, -5849, -5148, -5286, -5203, -534, 80, 248, 6226, 914, -5740, 4259, +1521, -9514, -6091, -3575, 4667, 2910, -4360, -8154, -10411, 477, 1142, -667, 2130, -866, 1398, 2088, +6759, 7173, -1123, 2222, 4931, 4477, -439, -2470, 6593, 4279, 4699, 6236, 4802, 3918, 1378, 2871, +-3712, -2662, -4281, -7194, 2488, 1310, 4203, 7175, 1340, 4979, -2692, -1123, 15052, 46, -7076, -3483, +-7656, -4324, -7534, -6628, 3949, 165, -8084, -4907, -5195, -689, -1566, -7221, -9236, -6768, -1729, 5983, +1014, -2722, 1569, -2563, 2083, 3476, -895, 11184, 9863, -1115, -3376, -3105, 4487, 4370, 2936, 9988, +7815, 792, 3648, 11892, 15145, 8525, -6738, -8821, -8249, -10354, 1693, -1336, -5267, 6439, 3462, 4500, +6977, 3889, 10915, 6826, -4754, -15373, -21200, -6773, 1251, -8261, -6104, -1326, -1300, 1314, -563, 2167, +869, -4713, -3328, -4103, -6305, -6567, -297, -3804, -2081, 5211, 6973, 11592, 8345, 1908, -2967, -5271, +-35, -1482, 321, 7006, 2784, -1967, -1125, 4286, 6502, 10769, 12863, 3458, 2635, 645, -6641, -957, +-1018, -2048, 1325, 2786, 2261, -3117, -235, 10847, 7691, -908, -3738, -3167, -892, -3661, -4570, -7908, +-14292, -4355, 2784, -2718, -10429, -3754, 4896, -4083, -1006, -215, 4124, 5772, -7495, -13748, -12156, 700, +4549, -2526, 2005, 8607, 1910, -4381, 957, 3394, 3091, 12030, 7996, -3140, -3119, 3978, 9782, 8204, +2744, 10695, 17424, 7218, -3302, -7457, -1603, -17, -10535, -12573, -6911, 71, 2281, -31, 180, -1486, +4354, 11485, 10909, -7660, -15415, -788, -6963, -9784, -3429, 3185, 9398, -3117, -4728, 40, 1772, 1714, +-8064, -8418, -4452, -12775, -14012, -2038, -1330, 3531, 9945, 8475, 7362, -1346, 5575, 6392, -2065, -1576, +7144, 13186, 3051, -3646, -1809, 4699, 6730, -318, 1156, 6089, 4235, -2800, -6578, -1684, -2653, 2402, +4834, 955, -4671, -3823, 4928, 1084, 122, 6903, 14019, 5820, -8013, -11379, -10336, -4930, -5019, -10018, +-6058, -2033, -7326, -6264, -2626, -1665, 5994, 4669, 905, -2591, -6649, 6474, -1840, -8979, 68, 8902, +13859, 2436, -2274, 1315, -2329, -2282, -2395, -949, 4892, 1452, -516, 2881, 1680, 6313, 7797, 7549, +7811, -2124, 2819, -676, -6836, 850, 11709, 15197, -1800, -8703, -6599, -5389, -4617, -4051, -4221, -3235, +-849, -1884, -1087, -452, -2169, 2067, -2934, -5451, -4854, -2868, 1870, -5440, -5334, 4455, 16788, 9007, +-1878, -2623, -6811, -11156, -12456, -7580, -2335, -457, -2658, -23, 4148, 1830, 9996, 9753, 6651, 3547, +-3449, 5633, -4637, -5165, 7883, 18988, 18975, 152, -2664, 132, -6017, -5743, -8247, -5421, -903, -1151, +-1341, 1521, -2189, 1835, 4686, 249, -163, -4107, 5738, 128, -11776, -4804, 9647, 18494, 1956, -7966, +-5261, -7996, -10134, -10495, -6314, -583, -2705, -5546, -5073, -6053, 1218, 6569, 2800, 1647, -2018, 6043, +7621, -8290, -5256, 8761, 22877, 13666, -3182, -103, 564, -6135, -7073, -5630, -1039, 1800, 175, 1870, +634, 1408, 6336, 3938, -3, -2604, 4093, 11331, -2763, -9105, -512, 16586, 14050, -6497, -7972, -5353, +-11910, -15827, -11543, -1923, 3985, -488, 1790, -1886, -5586, 875, -1232, -3907, -4610, -289, 11886, 1824, +-6758, 652, 14089, 15839, -2671, -6346, 873, -4282, -14461, -12518, -2471, 5251, 2351, 5144, 6554, 4553, +5281, -1819, -3522, -4113, -849, 14104, 7015, -4762, 787, 14070, 23012, 3356, -6874, -1530, -7137, -17121, +-17792, -7591, 2487, -1944, -1942, 4649, 6173, 6281, -2256, -8514, -10875, -7003, 7674, 7210, -2266, -1334, +10609, 17708, 2400, -5520, 999, -797, -14603, -20857, -10788, -2592, -5238, -2744, 2992, 7087, 7390, -56, +-2320, -3951, 0, 13367, 13111, 928, -1521, 7931, 16123, 7791, -1375, 3608, 1965, -14622, -18082, -9187, +-173, -1651, -4320, 7050, 13835, 8383, -3246, -9055, -11169, -7461, 5900, 10719, 3332, -1450, 6547, 14713, +694, -7467, -3632, -2906, -14928, -19376, -8106, -1264, -3749, -3445, 4718, 13912, 8493, -3322, -9511, -9771, +-9433, 406, 9440, 8309, 7129, 10527, 17844, 8208, -3045, 2664, 3924, -10153, -21127, -13804, -1981, -4175, +-3731, 5313, 16008, 12542, 656, -5823, -8567, -10183, 70, 9823, 8947, 6851, 10500, 17178, 5955, -7787, +-4274, -1349, -10028, -20837, -16852, -4423, -9527, -7790, 1811, 13235, 16302, -1073, -6822, -9317, -13886, -3052, +3243, 6346, 12049, 16043, 20105, 6790, -9540, -6188, 1296, -7844, -16785, -14901, -6061, -6702, -6572, 2099, +16610, 21532, 5015, -3847, -10427, -14373, -2124, 3290, 9133, 13909, 16114, 23447, 11005, -3991, -4268, -734, +-9511, -19464, -15612, -7815, -10541, -10700, 221, 12237, 19077, 8316, -5256, -8692, -14408, -10202, -3501, -915, +9222, 19233, 23428, 10924, -7151, -9662, 386, -4639, -17432, -13876, -6997, -8084, -10742, -2507, 14279, 21945, +9043, -2856, -9097, -14133, -5131, 1719, -1470, 11108, 22362, 25888, 13639, -8597, -6506, 3835, -5304, -16784, +-15471, -2862, -4501, -10846, -7538, 9552, 19595, 9527, -320, -8389, -15151, -6565, -3104, -2853, 6654, 21651, +30054, 15538, -4854, -9493, -5208, -10093, -20758, -17587, -5648, -7405, -9472, -3293, 10797, 21777, 10473, -2852, +-8578, -15052, -9504, -2793, -3144, 6322, 23966, 31377, 17745, -4245, -6362, 2034, -8598, -22291, -14970, -3709, +-5328, -8447, -3917, 9338, 19086, 9790, 2037, -2495, -9708, -4443, -2527, -7168, 2919, 18631, 30327, 20725, +-2468, -5504, -487, -12424, -24448, -19106, -4053, -4655, -11194, -6067, 9212, 18259, 7931, -946, -7090, -12655, +-8093, -5009, -5881, 3123, 18132, 30898, 23681, -59, -5271, -141, -10666, -26028, -19867, -2207, 584, -5313, +-1542, 12732, 16729, 5926, -1064, -5452, -9857, -4942, -3530, -6721, 932, 17659, 31989, 26769, 3966, -3735, +476, -9489, -25698, -23421, -9163, -4605, -7546, -1156, 13064, 16443, 6716, 864, -4615, -10852, -7689, -4714, +-8346, -855, 12969, 25601, 24506, 5737, -1490, 1809, -11088, -28569, -23520, -6923, -4266, -7112, -1936, 14298, +19085, 4817, -175, -2703, -9535, -3886, -884, -4395, -356, 11910, 28917, 24906, 3859, 1334, 4384, -8813, +-26086, -26014, -9086, -3964, -6080, 362, 15401, 19899, 4741, -2633, -4327, -8929, -4423, -1271, -7264, -2581, +11466, 22533, 20531, 5708, -1617, 6322, -6362, -28719, -24376, -11514, -6795, -4093, -989, 15068, 21951, 4012, +-4216, -6453, -9683, -5528, -4695, -3272, 249, 8775, 25411, 22744, 6736, 2385, 8048, -6076, -24405, -24719, +-12837, -6777, -7163, -206, 19637, 26895, 7090, -6619, -8590, -11535, -6666, -3363, -3684, 196, 9943, 26227, +23219, 6755, 2364, 8077, -6076, -24405, -24719, -12837, -6777, -7163, -206, 19637, 26895, 7090, -6619, -8590, +-11535, -6666, -3363, -3684, 196, 9943, 26227, 23219, 6755, 2364, 8077, -6076, -25159, -28110, -17643, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +941, 2965, 308, -1737, -157, 3521, 3746, -870, 2727, 4495, 1821, 2516, 865, -941, -1855, -4647, +-1892, -640, -2997, -976, -3143, -875, 3462, -254, -320, -211, -1369, 1692, 1365, 47, -2086, -3842, +-3118, -3820, -1431, 409, 1772, 1615, 1950, 2545, 1811, 2831, 2256, -549, 471, -2504, -1469, 1830, +801, 1616, 1658, -784, -561, 926, 613, 1062, 108, -3028, -647, 1733, 2156, 5599, 2415, 3898, +3859, 767, 2705, -15, -2916, -2701, -2642, -2039, -1130, -1183, -2739, 584, -956, -1287, 636, -433, +-384, -2208, -2817, -316, -1183, -3831, -2107, -810, -821, 4124, 418, -2222, 2401, 4572, 5086, 1172, +3901, 6397, 2041, 1978, 1414, -1455, -2343, -4461, -912, -385, -1939, -1689, -4268, -258, 2410, -28, +960, -672, -1424, 854, 1860, 2464, -365, -3260, -2765, -3516, -926, 1322, 943, 2436, 3153, 2446, +3443, 2393, -579, -1049, -2442, -4662, -4021, -2289, -88, 1631, -1277, -3195, -885, -559, 2106, 2570, +-3025, -5229, 1309, 9324, 6477, 5350, 8234, 8829, 4744, 2214, 3511, -1746, -6202, -8794, -4815, -3660, +-3362, -1902, -5071, 1461, 2245, -3542, 139, -1094, 3363, 4005, -1795, -3870, -8150, -5946, -4859, -5926, +-3442, 1149, 2984, 4845, 7757, 3450, 3113, 5580, 6402, 2771, -2190, 36, 2130, 1329, 1683, 602, +-888, -4694, -5919, -703, -2049, -3329, -3981, -7395, 2503, 5045, 3413, 4909, 3992, 10028, 7098, 2065, +-1921, -5746, -4043, -4877, -6575, -2077, -578, 960, 4000, 2112, -2333, -2770, 4293, 4822, -783, 2505, +-414, -2, 1684, -2054, -408, -2906, -9085, -3603, -540, -1568, 2315, -2059, -1403, 5726, 3113, 3827, +2005, 1002, 6454, 4238, -284, -4516, -5397, -5495, -7335, -4991, -1952, -1204, 1363, 3248, 2255, -46, +2372, 8287, 3517, 5675, 7831, 3788, 5846, 4530, -1283, -4213, -5182, -6567, 1503, 438, -1752, -3581, +-8379, 1980, 4477, -787, 6430, 2134, 2057, 4552, 3258, 5552, -3525, -7754, -10912, -14732, -6617, -3408, +1593, 815, 737, 1889, -879, 4224, 2994, 628, 2689, 326, 4719, 3201, 4239, 4094, -996, -3566, +-3774, -3266, 1176, 2891, -2308, -298, -1495, -2182, 4485, 9484, 9967, 7488, 4882, 3387, 3804, 4371, +2499, -138, -7501, -7137, -6324, -6918, -5150, -1175, -2657, -5595, 1618, 429, 2219, 10351, 4578, 5606, +-758, -1728, 1033, -4170, -4296, -5524, -3146, -2128, -5754, -5289, 1435, 2998, 511, 59, -342, 3961, +5124, 6793, 4446, 1518, 7248, 5049, 849, -914, -7491, -3043, -2678, -4015, -2575, -4001, -4564, 893, +2492, 6739, 7860, 3080, 7402, 5451, 1503, 6848, 10973, 4605, -2756, -7094, -10080, -8945, -5068, -4734, +313, -4622, -3723, 1908, 6709, 11077, 5063, 3030, 5910, -4941, -2188, 10313, 3020, -1028, -5651, -12405, +-8062, -5520, -4828, -1422, -4180, -2929, -1613, 999, 7521, 7625, 6628, 8900, -196, -152, 11756, 3365, +-1576, -5328, -9061, -5078, -4027, -2338, 511, -3130, -3147, -1373, 3673, 10204, 11589, 9787, 8047, 782, +1443, 14073, 6307, -830, -6659, -11102, -7374, -9370, -6851, -1741, -2882, -750, -3968, -1985, 7194, 9031, +10233, 6817, -3052, -1936, 8659, 2928, -2412, -7771, -11305, -7918, -8364, -6115, -2043, -4628, -1058, 123, +1104, 10151, 9013, 9140, 8493, 1322, 3905, 11640, 5410, -1092, -5714, -5444, -3488, -5920, -4568, 103, +-4371, -1360, -1335, 348, 12319, 10692, 9667, 5714, -1272, 5766, 9468, 1469, -6152, -11849, -11203, -6198, +-7373, -4728, -1214, -6948, -2285, -1942, 3278, 12133, 7478, 9051, 2304, -4649, 8480, 12701, 4713, -2188, +-8848, -11290, -8542, -7079, -4277, 385, -6696, -5299, -7404, -472, 15101, 11893, 12954, 6556, -5054, 7104, +10361, 3920, -2038, -7696, -8568, -7444, -6828, -1034, 1671, -4006, 86, -3639, 2831, 14025, 10629, 12625, +2163, -2527, 11979, 7593, 1770, -3900, -10752, -8842, -5239, -5871, -1845, -2282, -8758, -5531, -5195, 6148, +14544, 10138, 9524, -6396, -7625, 12679, 9936, 2124, -5285, -12532, -11849, -7945, -3401, 2288, -1001, -5658, +-5749, -9427, 7270, 17079, 12223, 12831, -3395, -5037, 11412, 9492, 4801, -5557, -10624, -8637, -7864, -4572, +2870, -907, -4718, -3734, -6680, 9092, 14607, 13064, 11505, -4901, 1057, 10532, 3355, 2765, -5585, -9220, +-7583, -8300, -4584, 646, -4565, -6289, -6070, -2516, 12703, 12071, 11729, 6830, -9734, 1351, 12550, 1403, +-3692, -9949, -10457, -7703, -7917, -2248, 2463, -4962, -7378, -8769, -4427, 16419, 15954, 12369, 5640, -10065, +2488, 13985, 6724, 1234, -7515, -8644, -7073, -7345, -153, 5027, -4389, -7924, -9255, -3220, 16794, 16887, +15304, 3823, -9131, 2819, 7774, 768, -2849, -8791, -9749, -8512, -8891, -2067, 1500, -5024, -6916, -10996, +186, 17252, 13318, 13169, -496, -8998, 7497, 8955, 1794, -1986, -10171, -11041, -7477, -6324, 2318, 1986, +-6261, -7777, -12914, 2032, 19489, 15402, 14612, -3860, -12720, 5056, 7848, 3210, -258, -7832, -9630, -8170, +-5609, 4394, 4616, -4993, -9158, -13334, 3134, 18208, 16455, 15801, -3187, -7672, 9334, 6060, -338, -4645, +-10677, -9105, -8105, -6711, 815, -2211, -7024, -7747, -9897, 9186, 19765, 14667, 10107, -9391, -6062, 12665, +6268, -505, -7562, -14936, -9524, -6368, -2794, 4848, -1991, -7724, -11521, -12052, 12106, 21140, 15711, 7778, +-14966, -7903, 12076, 6263, 2461, -5105, -13079, -7699, -5754, -1794, 6140, -936, -7438, -11690, -10791, 15116, +22124, 17824, 10697, -13113, -5030, 12807, 4849, 869, -6654, -13421, -9843, -9318, -3055, 4702, -3547, -8862, +-14140, -9089, 17497, 20338, 15479, 3697, -15067, -1641, 11954, 4509, 985, -8936, -13685, -8205, -7699, 454, +6118, -3531, -10030, -16472, -7378, 20086, 22146, 18573, 3372, -16507, 351, 12020, 2541, -501, -10326, -15029, +-9412, -7132, 1554, 6474, -2846, -8374, -14351, -5261, 21108, 20949, 18215, 1805, -16084, 2109, 12592, 3421, +54, -9031, -11804, -8551, -8387, 1712, 1857, -9119, -12139, -16363, -832, 23552, 20730, 18159, -1012, -14470, +5457, 10873, 1470, -2446, -15042, -13665, -7704, -6148, 5526, 3512, -7560, -14456, -18605, 2692, 25539, 21627, +18706, -4938, -16051, 8262, 11583, 3164, -1438, -14917, -13783, -11019, -6920, 5051, 2383, -6661, -11771, -16637, +4953, 27535, 23481, 21155, -5296, -15561, 9010, 8500, 1102, -1792, -14175, -12775, -11026, -6046, 6084, -277, +-11321, -13590, -15498, 8556, 26842, 20747, 15334, -10021, -12012, 12231, 9693, 2878, -2096, -14718, -13869, -12653, +-6453, 5294, 808, -10811, -17801, -16876, 13980, 29794, 23682, 18384, -11481, -11571, 11983, 6824, 3279, -3957, +-17313, -13207, -12856, -5015, 7019, -156, -9667, -15684, -13636, 18268, 30371, 22237, 16526, -12982, -10176, 13707, +5183, 1561, -5267, -16305, -12129, -11528, -2144, 7619, -2596, -13491, -17211, -12070, 19474, 29101, 20338, 11159, +-15559, -7529, 16074, 8013, 3254, -7097, -17432, -13627, -12682, -2703, 6554, -4380, -15459, -18926, -8171, 24926, +30313, 21157, 9787, -16755, -5392, 16698, 7097, 3416, -8006, -17738, -13186, -11698, -550, 6969, -4855, -15155, +-19005, -6731, 28144, 30307, 21469, 7814, -18397, -2093, 16929, 5020, 1780, -8741, -17117, -13372, -10994, 612, +5867, -4977, -13896, -17636, -5096, 27928, 26802, 19440, 5945, -18942, -1075, 17318, 7010, 2466, -9959, -17945, +-13429, -9574, 1779, 4559, -7832, -18246, -18296, -1675, 32749, 30253, 21329, 5247, -21089, -681, 19954, 8544, +2436, -11440, -19591, -14461, -9934, 1838, 4625, -7864, -18246, -18296, -1675, 32749, 30253, 21329, 5247, -21089, +-681, 19954, 8544, 2436, -11440, -19591, -14461, -9934, 1838, 4625, -7864, -18246, -18755, -1775, 32607, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +1084, -420, -158, 4676, -4703, -3021, 4875, -4272, 449, -1217, -2087, 7156, -47, 4214, 3821, -846, +9049, 1175, -5006, -1709, -5658, -1893, 2789, -2398, -1704, 2575, 64, 3033, -4678, -3797, 7439, -429, +1234, 3660, -1154, 1167, -2144, 992, 1996, -5966, -1596, -908, -955, 570, -2608, -1283, 565, 5331, +10386, 5892, -488, -1528, -2075, -2066, -245, -826, -2532, -3823, -1625, 3764, 4788, 2926, 2448, 3760, +2919, -386, -4016, -5291, -1985, -1151, -757, 258, -1467, 1336, 5314, 5531, 3967, -2659, -4462, -2102, +-2330, 132, -855, -1805, 1272, -2007, 5709, 3358, -5678, 7402, -1617, -4806, 3057, -5381, 4780, 2203, +-3507, 5428, -3264, 4611, 10827, -3473, -472, -3841, -6938, 985, -1954, -4596, 2357, -2746, 55, 2373, +-3280, 11469, 8634, -584, 1762, -3047, 514, -284, -2179, 3993, -5236, -6779, -2013, -1702, 2334, -1576, +-2655, 2529, -3270, 6091, 13279, -2029, -2303, -5576, -8183, 2097, 978, 6420, 2980, -3788, 8136, 4002, +-1214, 2172, -307, 2773, 3157, -5029, -9952, -2732, 692, 2075, -4441, -5583, 5141, 4166, 6761, 9090, +-1146, -5368, -7247, -2576, -1874, -9921, 79, 634, -949, 1351, -2475, 5735, 7626, 7250, 10420, 4793, +4010, 173, -4749, -4873, -8659, -6508, -6210, -2621, 3458, 3552, 5068, 4975, -2936, -2814, 2683, -188, +-3938, -7168, -95, 6481, 5754, 10405, 6583, -6473, -5073, -1204, 1632, -3308, -4995, -4239, -3677, 137, +2476, 3652, 2230, 4392, 3062, -2197, 4337, 795, -4296, -2629, -5615, -2383, -4472, -398, 1933, 5699, +7368, -3881, 726, -7332, -631, 14419, -619, -1065, -3386, -6150, 3794, -1462, 9104, 3265, -6035, 4142, +777, 1773, -3202, -6702, 420, 2802, 4158, -5493, -2681, 2373, -3224, -2928, -6449, 2577, 4793, 1150, +4491, 2145, 4479, 6135, 694, 2604, -5680, -12163, -4087, -2412, -6357, -3919, -2599, 108, 5011, 5733, +11503, 13647, 9739, 6147, -10890, -10422, -8897, -12246, 2586, -1172, -6797, 2857, -705, 10180, 6032, -1702, +6260, -4090, -851, 9244, 873, 1029, -1941, -8029, -933, -3671, -10933, 5499, 1525, -2638, 705, -10577, +4542, 9598, 8544, 16009, -3260, -2635, 2180, -5076, 4041, -4408, -11975, -6625, -2129, -2421, 2875, 3728, +-2353, 4948, 1383, 4851, 6271, -8641, 726, -1205, -4017, 4145, -5064, -725, 834, -537, 2421, 3855, +3733, -1112, -1878, -7186, -5471, -3908, 1995, 12393, 4306, 4941, 3723, -7332, 2464, -2164, -2722, -2757, +-10117, -3256, -2057, 6375, 8105, 3872, 3017, -5392, -1470, 1359, 1338, 565, -7299, -2119, 210, 776, +9907, 2820, -197, -802, -4622, -4844, -5703, -4262, 2984, 9509, 9007, 1739, -9821, -6996, 1561, -4845, +-1214, -253, -3667, 6348, 3730, 8582, 4810, -9130, 156, 4104, 5010, 2807, -6154, -3333, -5076, -2846, +2085, -5328, -10831, -4558, 7613, 11320, 8009, 5612, -622, -7245, -393, 2512, -1615, -3027, -2252, 1137, +-859, -2315, -389, -263, 1388, 3377, 6126, 3394, -7970, 1018, 3649, -3488, -1399, -3609, -4032, -3055, +-5073, 5255, 5098, -2726, -1887, -594, 5248, 2246, 3222, 10435, -812, -4363, -279, -5141, -6516, -4300, +-1965, 326, -4632, 3787, 12073, 7793, 4898, 4070, 3706, -10037, -13193, -4030, -6235, -7805, -8077, 57, +10783, 5916, 3556, 4001, 5531, 11557, 5538, 4518, -8234, -16508, 2143, -549, -6069, -4969, -5334, -69, +-1006, 84, 5534, 8290, 12228, 13118, 13796, -3626, -20137, -12914, -6255, -3212, -9690, -5514, 1901, -1311, +2877, 5825, 9429, 10889, 2196, 9477, 6933, -13379, -5604, -3333, -6721, -7591, -7040, 1710, 2484, -2072, +4742, 9322, 9036, 6205, 8510, 7594, -14264, -12241, -7332, -7797, -7596, -5112, 5082, 1743, -1144, 4296, +9112, 15805, 11296, 9061, 7860, -17180, -16617, -5662, -4819, -5218, -10065, -2997, 949, 326, 4953, 10275, +11138, 7173, 7415, 13381, -6648, -13051, -5761, -8446, -9082, -10157, -2398, 1908, -1577, 4267, 9572, 13818, +14907, 8486, 10573, -9385, -19634, -8296, -9523, -6806, -6622, -2093, 4479, 958, 289, 4486, 8782, 11462, +6552, 10910, -2741, -14948, -3328, -2608, -3496, -7312, -5696, 1329, 149, 860, 5330, 7549, 11920, 6352, +11214, 1239, -19150, -9662, -8504, -4659, -3227, -3817, 4193, 1079, -1000, 4930, 6671, 12221, 8040, 8816, +3009, -19591, -9232, -4586, -6692, -5721, -3608, 5765, 3009, -1301, 2351, 6067, 13028, 10235, 9846, 8236, +-16749, -12745, -7695, -8650, -5732, -7030, 965, 1621, -2630, 2172, 7871, 14443, 14850, 11093, 9256, -15015, +-13695, -3835, -7866, -7069, -5848, -112, 839, -847, 2567, 7126, 13360, 13051, 9131, 10806, -14770, -13996, +-4725, -10429, -9022, -10490, 11, 3318, -541, 5059, 7904, 13067, 16484, 9157, 9763, -14931, -18005, -6686, +-10075, -7216, -7641, 1946, 4657, 841, 3518, 7396, 14356, 15169, 9082, 12435, -11206, -16138, -5374, -10883, +-10050, -12699, -2009, 2359, -2600, 1000, 5869, 14369, 19358, 14598, 16838, -7003, -18445, -5687, -10690, -11896, +-12267, -3609, 2936, -545, 1329, 5179, 11472, 18208, 14123, 15056, -6188, -19788, -5674, -7147, -9958, -11048, +-4249, 2416, -376, 1586, 4724, 7885, 13817, 13342, 17381, -2567, -19125, -5948, -7473, -9593, -10216, -3221, +3518, -721, 684, 4693, 9015, 13376, 12301, 16542, -1708, -21804, -6670, -6447, -9794, -9652, -4061, 3791, +-144, 1503, 5670, 9245, 15018, 12974, 15193, 462, -21771, -9034, -7167, -11621, -11403, -5350, 4204, 1687, +3174, 6324, 9082, 14381, 13612, 15490, 1171, -22920, -10201, -5246, -9633, -11873, -5790, 3421, 1990, 3114, +6043, 7482, 10629, 12480, 14815, 3952, -20962, -11870, -4728, -8808, -12663, -7082, 2757, 2196, 3854, 6283, +7560, 12395, 14788, 17259, 9632, -20021, -13129, -4665, -10773, -13619, -9527, 825, 376, 1865, 7113, 10049, +12201, 14148, 15122, 8878, -20663, -14880, -4737, -11000, -14827, -11334, 2070, 2655, 4337, 7961, 9143, 11026, +14519, 18528, 14036, -18084, -17624, -6069, -10793, -13610, -9584, 1858, 501, 1491, 5650, 7640, 10851, 14486, +16861, 13527, -17614, -17016, -4069, -7926, -11359, -11138, -1344, -1564, -302, 6026, 8083, 10345, 14812, 16827, +17803, -12386, -17897, -3585, -9387, -14056, -11724, -1664, 422, 2054, 5255, 8321, 10103, 13556, 16927, 15282, +-14948, -21882, -6391, -7134, -10650, -9080, 801, 1480, 734, 6305, 9911, 8821, 13712, 14368, 14283, -10991, +-22624, -5192, -5381, -13191, -12928, -2698, 890, 3235, 6996, 8709, 8999, 11262, 14267, 19159, -7161, -22954, +-7462, -7806, -12247, -12955, -2269, 1818, 195, 7040, 9933, 9868, 15202, 15903, 19039, -4346, -26404, -9936, +-7021, -13297, -13237, -4822, -1316, 550, 6470, 12127, 12972, 13982, 15489, 17829, -1830, -23642, -10788, -7798, +-13871, -15751, -4119, 2135, 1469, 4966, 9124, 9856, 12679, 16183, 18044, 1307, -26158, -13172, -5895, -10855, +-10865, -2654, 604, -769, 859, 7047, 10322, 12766, 17632, 18751, 3957, -24064, -13343, -3399, -8635, -13939, +-7196, -1933, -1387, 4497, 10275, 12054, 12322, 14932, 16021, 6666, -23336, -16921, -7655, -11593, -13734, -6893, +944, 1028, 4119, 8307, 12061, 13176, 16769, 18471, 10747, -19647, -16928, -7982, -11170, -15641, -9668, -1252, +-2624, 2717, 7376, 12078, 14933, 16390, 15461, 11491, -19306, -18663, -5397, -10880, -16530, -10273, -84, 1503, +5604, 6578, 10701, 11278, 15638, 16840, 14352, -13905, -19488, -7118, -9261, -14310, -10839, -500, -617, 2537, +5552, 9623, 11661, 16061, 16668, 15883, -15146, -25307, -9895, -10526, -13889, -10544, 621, 1015, 4738, 7064, +11801, 12463, 15163, 15575, 16115, -10965, -24530, -9861, -9719, -12542, -10355, 1220, 519, 1931, 4743, 9053, +11699, 15015, 13874, 15310, -8170, -26497, -10219, -7554, -12184, -12004, -147, 1304, 1787, 5722, 9809, 13334, +16144, 15035, 15964, -5243, -26562, -12771, -8868, -12739, -13963, -1234, 3139, 3691, 7688, 10136, 12202, 13565, +13741, 15359, -2555, -27742, -14906, -8241, -12853, -13948, -2179, 3299, 2756, 6575, 10569, 13171, 15095, 15466, +16104, 1275, -26450, -17027, -8576, -14232, -16764, -4002, 3799, 3773, 7662, 9240, 12900, 14772, 15813, 16218, +4345, -25040, -18611, -8237, -13731, -18159, -6682, 2343, 1965, 5422, 8283, 13886, 15000, 19507, 20268, 8404, +-24024, -23019, -9033, -13287, -18960, -8343, 1979, 2144, 6962, 9736, 15878, 16063, 18348, 18477, 9164, -23701, +-25794, -9813, -12285, -17370, -8771, 1453, 1496, 5663, 7686, 12953, 12621, 16976, 19014, 12950, -17965, -24882, +-6983, -9954, -17836, -11854, -747, -214, 4281, 8003, 14101, 14318, 18359, 20246, 15301, -15509, -28419, -9397, +-11355, -20079, -14059, -1414, 2516, 6578, 8273, 14326, 12402, 16591, 19978, 15874, -11505, -30256, -10226, -8826, +-19119, -13181, -801, 1641, 5434, 7264, 13182, 12824, 15520, 20805, 16998, -8471, -31946, -13574, -9201, -19294, +-14863, -1878, 2596, 6336, 8785, 13188, 12248, 14225, 20870, 17375, -5645, -31439, -13510, -6232, -15818, -14009, +-2358, 1309, 3741, 6153, 9319, 9938, 12172, 21549, 19057, -1414, -30413, -15537, -5646, -16517, -15604, -2964, +1521, 3614, 8520, 10289, 11435, 13011, 22170, 18794, 829, -30670, -18684, -6365, -16003, -14689, -4109, 2015, +3818, 8399, 10665, 9905, 9267, 21001, 18471, 4368, -28373, -21213, -4922, -15345, -16009, -5556, 1188, 3304, +9387, 11883, 11932, 10593, 21155, 19159, 7117, -27059, -24676, -6664, -15515, -17128, -7221, 1910, 4182, 9853, +10129, 8706, 8658, 21126, 19824, 8333, -24011, -26129, -6203, -12733, -16138, -7894, 1639, 3376, 9165, 10874, +9562, 8404, 20341, 21353, 11839, -19401, -28920, -8942, -12774, -16989, -9696, -37, 1676, 9972, 11889, 8993, +9271, 18733, 20822, 12338, -17449, -30279, -10928, -12891, -16904, -10073, 737, 2487, 9484, 13270, 8976, 8719, +18675, 22664, 13391, -13130, -30566, -13416, -10889, -17131, -12985, -1336, 1676, 8699, 13925, 8669, 9508, 18404, +21680, 14003, -9974, -30398, -14693, -10947, -16148, -13115, -3357, 2705, 9824, 14146, 6213, 6864, 16077, 22766, +16081, -5110, -28130, -17544, -9807, -14476, -13928, -4113, 627, 6144, 12422, 5131, 8086, 17409, 23614, 15644, +-2459, -26633, -20059, -9390, -13125, -13285, -5711, 1024, 7700, 13730, 5360, 6886, 14882, 23130, 16081, 618, +-24310, -23486, -10052, -13466, -14092, -6526, 1109, 7022, 12450, 4288, 6416, 14438, 22770, 16934, 3032, -21288, +-26269, -9124, -8871, -12577, -7378, -369, 6053, 12984, 3739, 4770, 13518, 21830, 16989, 4174, -16375, -26968, +-10874, -7885, -13642, -9629, -1138, 5798, 12076, 2471, 3232, 12077, 21070, 18975, 7158, -11422, -27684, -12521, +-6614, -11970, -9900, -1734, 5897, 11235, 2298, 2721, 12866, 20830, 18307, 8072, -8147, -30015, -15315, -6769, +-12770, -11074, -3154, 5531, 11877, 3670, 2383, 11901, 19562, 19572, 8971, -4519, -30321, -17957, -4302, -10262, +-11262, -3336, 6484, 11191, 2991, 1120, 10253, 17191, 19295, 9973, -521, -29092, -20604, -3273, -8907, -11636, +-4647, 4896, 10411, 2570, -385, 10042, 15805, 19450, 11393, 3421, -26552, -23987, -3753, -8068, -12721, -5475, +5127, 10188, 4036, 480, 10178, 15398, 18477, 11913, 6377, -24577, -27461, -5333, -7234, -13115, -6749, 5430, +10559, 3943, 226, 9043, 13801, 18014, 12723, 8503, -21327, -30151, -6304, -6275, -13622, -7931, 5160, 10910, +4164, 346, 8134, 13983, 18596, 14613, 10626, -23663, -30745, -7326, -6687, -14902, -9450, 6028, 11461, 3947, +389, 9672, 15151, 19419, 13666, 9242, -22008, -30510, -6401, -6347, -13652, -7938, 5160, 10910, 4164, 346, +8134, 13983, 18596, 14613, 10626, -23663, -30745, -7326, -6687, -14902, -9450, 6028, 11461, 3947, 389, 9672, +15151, 19419, 13666, 9242, -22008, -30510, -6401, -6347, -13652, -7938, 5160, 11191, 4223, -168, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3322, +-941, 589, -2568, -2500, 1980, 19242, 22687, 2626, 10616, 15171, 6788, 6449, 6022, -10983, -13731, -9585, +-7507, -8485, -13715, -7155, -8227, -2863, 6357, -1118, 1363, -4607, -16085, -9657, 361, -4758, -15479, -4410, +-5343, 4681, 13920, 6899, 6060, 8595, 11773, 7645, 8750, 4384, -5953, -5297, -1204, -2070, -9467, -5867, +-2175, -1445, 8866, 13479, 9120, 8782, 5846, -6033, 3056, 14718, -2921, 1456, -3132, -1870, 10425, 5057, +6069, 837, 3256, 3246, 6449, -446, -12096, -15791, -18539, -12233, -14961, -20738, -13947, -10753, -8215, -1031, +1669, 3197, 7536, -1697, -611, 11157, 7782, 6362, 4806, 10422, 13327, 12396, 9814, 2878, 3964, 565, +8412, 6641, -1926, -9077, -13067, -5108, -7065, -14356, -14380, -6657, -10776, -5896, 1466, -2345, 6441, 2402, +-3636, 15325, 19055, 15011, 16507, 20226, 18498, 13666, 15999, 7608, 4743, -5247, -495, 4492, -7693, -14146, +-21308, -21069, -19584, -26445, -28877, -18905, -18422, -17215, -9422, -16339, -5982, 6462, -4751, 453, 13084, 13551, +19325, 24604, 22177, 23520, 25204, 24037, 22057, 16691, 18423, 18980, 9194, -7396, -8695, -13333, -15208, -18425, +-32382, -17260, -20051, -25960, -13227, -22847, -12702, -241, -9915, -9186, 514, 9372, 13653, 18227, 21089, 19221, +22221, 23947, 18552, 22788, 18009, 14073, 15910, -166, -1981, -1689, -8155, -8625, -26506, -21606, -16089, -28170, +-18946, -21501, -25387, -12356, -13604, -18331, -11086, 2686, 5960, 10299, 15921, 13821, 15285, 20362, 18654, 19802, +20049, 19453, 20306, 10217, 6788, 6242, 868, 1578, -14017, -19164, -8855, -17211, -12271, -11908, -17466, -10304, +-7517, -14247, -14011, 3497, 5804, 4248, 13787, 9604, 5340, 14933, 11961, 10734, 14708, 14373, 17558, 5504, +-2989, 1350, -1974, -4630, -13458, -21034, -14122, -17080, -16908, -10894, -14349, -13571, -7764, -12518, -14397, 772, +7443, 4444, 12585, 13508, 7945, 18985, 19691, 18930, 22652, 22505, 24089, 11955, 5623, 6651, -903, -2248, +-5105, -16528, -17415, -20308, -16789, -9003, -15689, -19528, -16034, -17131, -21385, -11489, 1753, -1863, 1750, 6474, +3395, 12379, 14431, 17263, 18598, 25452, 31371, 18843, 14704, 11079, 5410, 2800, -1002, -7463, -15849, -17733, +-15714, -10251, -10687, -15784, -17641, -20445, -22167, -18840, -6200, -2505, -7640, -5769, -1571, 4918, 15925, 19459, +18108, 27008, 27813, 23178, 21458, 19576, 15153, 6658, 6848, 1422, -6216, -6719, -8941, -4611, -6460, -12296, +-15342, -21722, -20624, -23822, -18336, -10454, -18834, -16949, -12114, -7950, 4815, 10153, 12590, 16111, 18324, 21819, +22165, 22754, 17117, 10831, 11281, 6528, 2476, 1341, -1629, 2020, -532, -7631, -10168, -12733, -14187, -20370, +-19662, -11894, -17218, -16927, -12068, -10425, -2623, 4045, 8562, 9048, 11039, 17704, 19836, 21762, 20706, 14341, +14507, 8283, 2272, 5308, 4079, 4795, 3793, -3714, -8094, -11763, -15062, -15951, -21012, -18228, -18251, -22150, +-14883, -11697, -10193, 1261, 6231, 5062, 8295, 16081, 21128, 18905, 20695, 18178, 13302, 11078, 3715, 2794, +5266, 4759, 4971, -2007, -8700, -12165, -14673, -12693, -15461, -18538, -17194, -20507, -17098, -10028, -8425, -609, +5358, 3236, 3919, 12815, 23804, 24659, 25147, 24557, 19635, 16732, 8344, 6135, 7467, 1112, 1784, -3715, +-9821, -12703, -18665, -17187, -17255, -22445, -21404, -22635, -20569, -15406, -14413, -6041, 2532, 2311, 2096, 8239, +19507, 23244, 24783, 26853, 20351, 18446, 15127, 12493, 13636, 7927, 5284, 839, -6310, -8227, -12035, -14486, +-14943, -21610, -25150, -24652, -22390, -16659, -13738, -7480, 1247, 3147, 934, 4530, 16050, 18724, 22068, 24883, +18653, 17074, 14214, 14366, 13680, 11092, 9667, 4279, -1950, -7454, -10740, -14324, -16880, -18135, -23384, -23828, +-22710, -23619, -15848, -13259, -8084, -107, -1561, 147, 8665, 11417, 15740, 20710, 20045, 18380, 15551, 16231, +16409, 18663, 15537, 6331, 4389, -262, -3369, -6682, -11836, -10291, -11918, -14734, -19100, -21461, -14515, -11698, +-10306, -3721, -1773, -1537, 3623, 3874, 7391, 10850, 11663, 12848, 8714, 9653, 11480, 16163, 15030, 4148, +-681, -4432, -7538, -7559, -11435, -8727, -8558, -10817, -13205, -17250, -12376, -8765, -9296, -4399, 4398, 3870, +2941, 5740, 7292, 9899, 11893, 13690, 11607, 11979, 14127, 15835, 17565, 8910, -422, -2901, -6680, -9461, +-10050, -9141, -8724, -9800, -11607, -13096, -9915, -8398, -11867, -8076, 2059, 3386, 992, 632, 1917, 5645, +6537, 10035, 12071, 11330, 11455, 12645, 14708, 8111, 1581, -2298, -7219, -11372, -13164, -9548, -9872, -7711, +-8147, -11253, -8535, -7100, -12015, -8637, 3321, 5383, 3764, 4505, 1644, 3404, 7360, 11121, 15319, 16202, +14495, 17492, 17880, 11528, 7606, 2018, -2810, -9782, -13411, -9487, -10131, -8156, -8769, -15859, -15011, -12765, +-16566, -15217, -4195, 1290, 806, 1709, -1826, -2257, 2589, 6249, 11041, 15806, 14679, 17922, 19235, 14379, +10510, 6201, 2629, -4793, -9734, -6150, -6089, -4695, -4211, -9553, -11317, -9866, -14989, -14959, -4322, 2140, +2432, 3507, -899, -5183, -1130, 3938, 8021, 13332, 13500, 14089, 16309, 13208, 10297, 7874, 1761, -7110, +-10857, -6651, -5410, -5812, -5587, -9833, -13998, -13419, -15722, -16171, -7441, -670, 852, 4029, 3062, -4528, +-2759, 2372, 5319, 11707, 13217, 15359, 18848, 16318, 16029, 15097, 8655, -929, -5985, -4356, -3734, -3682, +-3295, -8084, -15212, -16591, -18005, -16630, -8993, -1372, 1668, 2692, 934, -6101, -6304, -2167, 1086, 9958, +12444, 11422, 14937, 14550, 13389, 15247, 12136, 2917, -4770, -4998, -4394, -3237, -2046, -5712, -10508, -16584, +-20062, -18113, -11945, -2988, -670, 1515, 2579, -4135, -5079, -3266, -545, 8803, 14432, 13678, 14553, 14931, +12449, 14533, 16023, 7016, -1411, -1898, -3174, -2897, -2531, -4074, -7272, -15675, -21418, -19396, -14596, -5713, +279, 1447, 1249, -2407, -4909, -4075, -2833, 3641, 13482, 14588, 13001, 15117, 12240, 11650, 15358, 9102, +747, -1383, -3263, -4032, -3981, -5730, -8154, -14277, -21670, -22708, -17434, -9043, -1988, 99, -448, -1278, +-3437, -3765, -3206, 953, 11698, 15476, 15683, 18590, 14878, 13599, 19269, 15961, 9648, 5806, 2576, 791, +-1368, -4067, -5460, -9600, -18057, -22538, -20148, -14534, -7132, -4158, -5163, -6280, -8113, -9640, -8241, -6072, +2017, 8305, 10049, 13772, 12461, 10451, 15442, 15761, 11597, 9136, 5934, 4412, 2658, -296, -1539, -4211, +-11676, -16382, -14705, -10440, -5016, -1174, -1374, -3075, -4777, -6567, -6261, -5620, -1554, 3914, 6862, 10510, +10726, 8364, 11811, 12623, 10963, 8814, 3924, 1756, 1505, 439, -1295, -3358, -9474, -15922, -15869, -12344, +-7504, -3498, -3689, -4565, -5311, -6434, -5722, -4851, -1836, 2453, 5286, 9935, 11528, 9052, 11015, 12882, +12105, 10190, 7136, 5270, 5025, 3453, 330, -1305, -6137, -12951, -15386, -14657, -11114, -6412, -5421, -5689, +-6079, -7163, -5840, -3615, -1553, 692, 3912, 8529, 9524, 8842, 10413, 11472, 12887, 12009, 9391, 7186, +6657, 5344, 1198, 259, -3237, -10735, -13755, -14689, -13177, -8341, -6993, -7114, -5794, -6512, -6491, -5051, +-3536, -3966, -1426, 4263, 6111, 6013, 7501, 9107, 11452, 10972, 9400, 8774, 8518, 7030, 2647, 1699, +478, -6220, -10031, -11141, -10231, -5575, -4190, -5045, -4097, -2555, -2986, -2056, -653, -2359, -1597, 3442, +5815, 6520, 7409, 7965, 8873, 7414, 7040, 6968, 5667, 3460, -1251, -3529, -3937, -9753, -12958, -12597, +-12330, -8454, -5829, -6648, -6940, -4228, -2765, -943, 2368, 1330, -1011, 1261, 5623, 8985, 10868, 9954, +9944, 8598, 8379, 10534, 10306, 7234, 2511, 231, -749, -5660, -9902, -11660, -12839, -10303, -6948, -6525, +-6494, -4476, -3801, -2086, 2149, 1728, -1242, -519, 1041, 5813, 9120, 8913, 8489, 5200, 5156, 9217, +10256, 7292, 2618, -1307, -1615, -5153, -8656, -9010, -12475, -12993, -10718, -10163, -9358, -6629, -4339, -2691, +2425, 3129, 497, 554, 158, 4447, 9344, 9371, 9075, 5660, 4364, 9182, 11669, 10696, 7593, 3721, +2750, -110, -2883, -3248, -6932, -9896, -9227, -8718, -8037, -5432, -4819, -3725, 1150, 2279, 233, -1235, +-4082, -2058, 3172, 3482, 4172, 2870, -451, 2726, 6082, 6504, 5958, 1326, 244, -640, -3641, -1784, +-3192, -6905, -8299, -8039, -6595, -4085, -2885, -3001, 971, 4030, 2513, 1757, -505, -1227, 3434, 4869, +5604, 6090, 2664, 3328, 5930, 7150, 8378, 5063, 1973, -194, -2568, -1256, -888, -3883, -6968, -7807, +-7029, -4804, -3629, -3743, -180, 2482, 1201, 811, -1595, -3779, -1002, 550, 1961, 3686, 521, -234, +1372, 3110, 6016, 4710, 2193, -776, -2589, -1527, -1374, -2522, -5372, -6756, -7144, -6171, -4153, -3263, +388, 4470, 4342, 3685, 1935, -1103, -249, 1527, 3104, 5319, 4354, 3093, 3657, 4531, 6423, 7191, +5216, 1379, -1219, -1395, -975, -1375, -3521, -6234, -7844, -8037, -7092, -5772, -3174, 603, 1558, 621, +-566, -2099, -1939, -999, -114, 1876, 3104, 2345, 2460, 3584, 4754, 6465, 5290, 1632, -316, -1513, +-1227, -939, -2209, -4097, -5030, -4780, -5457, -4999, -1858, 1961, 3434, 1741, -122, -1605, -1794, -846, +-240, 1860, 4371, 4072, 2650, 3546, 4680, 5925, 5969, 3447, 1547, 726, 449, -440, -1626, -3450, +-4717, -4894, -6809, -7480, -4796, -1213, 772, 216, -1455, -3090, -4232, -4024, -2780, -1275, 2095, 3560, +2313, 3153, 4253, 5882, 6734, 5194, 4103, 3397, 2644, 1246, -886, -2114, -2642, -3020, -4155, -5725, +-4479, -1702, 807, 1457, -684, -2005, -3059, -4797, -4244, -3156, -186, 2319, 1515, 2328, 3752, 4778, +6635, 6133, 4651, 3637, 2697, 2065, 323, -1334, -2182, -1815, -2329, -4109, -3484, -2453, -1057, 725, +-636, -2164, -3879, -5917, -6193, -5998, -3352, -410, -718, -165, 1016, 2000, 5184, 6142, 5833, 5129, +4039, 4424, 3114, 1361, -204, -684, -388, -1939, -1601, -398, 50, 1656, 488, -946, -2065, -4475, +-5779, -6334, -5403, -2434, -1006, -757, -54, 477, 2279, 3845, 4577, 4793, 3450, 3046, 2490, 777, +-728, -1298, -921, -1573, -1198, -64, -5, 1635, 1792, 97, -910, -2715, -4436, -5405, -5510, -3565, +-1590, -811, -505, 220, 2633, 4444, 5145, 5578, 4061, 3066, 2542, 1688, 556, -903, -1091, -1516, +-1734, -912, -336, 1049, 1239, -149, -1146, -2713, -4489, -5794, -6375, -4746, -2105, -1485, -1732, -592, +1314, 3529, 4805, 5190, 4767, 3424, 2445, 1794, 1161, 647, 304, -230, -672, -705, 257, 1695, +1636, 277, -883, -1763, -3098, -4434, -5552, -5192, -2422, -1285, -1101, -188, 855, 2805, 3864, 4486, +4622, 3268, 1990, 1184, 293, 51, -89, -342, -1084, -2184, -1464, 287, 755, 0, -1183, -1717, +-2820, -3568, -4122, -4505, -2284, -968, -960, 45, 1031, 2896, 4511, 5234, 5134, 3973, 2595, 1238, +613, 424, -94, -462, -1335, -2495, -2436, -784, 582, -97, -1102, -1873, -2710, -2558, -3365, -4043, +-2755, -2093, -1571, -729, 827, 2872, 4513, 5474, 5383, 4513, 3042, 1547, 873, 464, -69, -490, +-1324, -2474, -2512, -913, 488, -109, -1125, -1920, -2741, -2576, -3363, -4034, -2757, -2093, -1571, -729, +821, 2837, 4533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -243, -80, -138, -102, -132, -120, -113, -124, -119, -122, -110, -107, +-102, -80, -71, -71, -71, -73, -73, -89, -98, -108, -117, -119, -133, -142, -149, -166, +-171, -163, -161, -153, -137, -133, -127, -120, -117, -122, -127, -128, -134, -139, -151, -161, +-163, -166, -176, -177, -185, -187, -181, -183, -180, -186, -183, -172, -177, -190, -190, -195, +-214, -214, -205, -195, -240, -151, -190, -299, -325, -190, -287, -495, -186, 294, 294, 377, +910, 1006, 689, 715, 272, -679, -931, -454, -74, -367, -614, -362, -347, -30, -299, -876, +-1172, -1659, -1394, -1773, -2899, -3047, -2808, -2691, -3420, -4830, -4303, -2798, -2328, -2931, -4266, -5450, +-4841, -2732, -573, 2363, 4274, 5087, 5640, 4477, 2986, 2056, 1675, 2093, 3065, 4917, 6823, 6764, +6178, 6537, 7075, 8427, 9446, 9674, 9619, 9802, 11159, 12127, 11936, 11509, 10163, 8456, 7223, 6092, +5202, 3874, 2022, 967, 408, -913, -2417, -3469, -3920, -4361, -5403, -6811, -9061, -11448, -12722, -14419, +-15644, -15039, -13744, -12241, -11495, -12740, -15328, -18253, -20191, -21622, -22541, -21689, -19925, -18089, -16164, -14860, +-13850, -12721, -11518, -9797, -8045, -6384, -4686, -3872, -3403, -2435, -1428, -543, -45, 577, 2262, 4269, +6392, 8389, 9920, 11257, 12250, 12482, 12101, 10992, 9884, 9587, 9812, 10340, 10430, 9453, 8111, 7118, +7210, 8552, 10579, 12587, 13639, 13401, 11923, 9371, 7041, 5546, 4743, 4699, 4729, 4203, 2745, 424, +-1651, -3329, -4500, -4605, -3997, -3214, -2128, -577, 1458, 3631, 5825, 8072, 9897, 11189, 12109, 12316, +12090, 11658, 10933, 10032, 8833, 7356, 6051, 5400, 5561, 6382, 7956, 9963, 11433, 12216, 12586, 12464, +12246, 12335, 12634, 12576, 11858, 10410, 7958, 4796, 1708, -864, -2751, -3804, -4063, -3804, -3343, -3248, +-3859, -4908, -6066, -7020, -7900, -9225, -10787, -11927, -12606, -12935, -13090, -13544, -14626, -16270, -18023, -19301, +-19884, -19686, -18854, -18062, -17691, -17989, -18985, -20477, -22145, -23276, -23497, -22762, -21280, -19501, -17923, -16793, +-16153, -16208, -16420, -16192, -15687, -14693, -12955, -10448, -7567, -4932, -2894, -2096, -2499, -3736, -5481, -7240, +-8716, -9606, -10076, -10323, -10425, -10550, -10527, -9782, -7786, -4468, -505, 3059, 5239, 5936, 5837, 5727, +6163, 7070, 8089, 8986, 9576, 9871, 10076, 10284, 10595, 11113, 11807, 12633, 13298, 13661, 13977, 14607, +15833, 17573, 19305, 20685, 21466, 21707, 21665, 21301, 20738, 20147, 19587, 18926, 17937, 16575, 15222, 14405, +14403, 15168, 16526, 18311, 20220, 21683, 22744, 23534, 24225, 25095, 26244, 27551, 28585, 28736, 27747, 25735, +23345, 21135, 19165, 17345, 15973, 15086, 14441, 13782, 12582, 10817, 8650, 6133, 3376, 330, -2886, -6018, +-8887, -11287, -13343, -15397, -17729, -20241, -22504, -24228, -25300, -25558, -25266, -25188, -25557, -26381, -27755, -29393, +-31103, -32144, -32450, -32136, -31234, -30178, -29138, -28154, -27191, -26528, -26342, -26231, -25879, -25030, -23532, -21233, +-18335, -15271, -12551, -10575, -9364, -8704, -8528, -8781, -9301, -10105, -11288, -12686, -13963, -14898, -15374, -15182, +-14027, -11864, -9080, -6411, -4421, -3255, -2849, -2844, -3130, -3699, -4321, -4656, -4642, -4410, -3772, -2686, +-1477, -294, 953, 2228, 3209, 4063, 5056, 6283, 7966, 10095, 12456, 14544, 16194, 17482, 18345, 19101, +19960, 20704, 21218, 21399, 21335, 21077, 20728, 20687, 21160, 22279, 23879, 25602, 27228, 28563, 29390, 29773, +29886, 30021, 30288, 30424, 30224, 29432, 27892, 25764, 23229, 20474, 17704, 15020, 12698, 10923, 9673, 8742, +7806, 6628, 5179, 3496, 1597, -448, -2597, -4698, -6555, -8222, -9829, -11469, -13071, -14567, -15935, -16763, +-17060, -16885, -16084, -15362, -14898, -14827, -15267, -16043, -16879, -17660, -18292, -18522, -18319, -17607, -16537, -15599, +-14933, -14757, -14937, -15119, -15067, -14654, -14080, -13275, -12204, -11023, -9725, -8491, -7573, -6846, -6353, -6288, +-6765, -7985, -9740, -11786, -13932, -15595, -16538, -16549, -15523, -13658, -11382, -9027, -7040, -5556, -4542, -4021, +-3770, -3706, -3759, -3763, -3626, -3162, -2416, -1553, -550, 517, 1498, 2315, 2967, 3580, 4399, 5430, +6638, 7785, 8750, 9546, 10220, 10753, 11165, 11510, 11737, 11806, 11639, 11248, 10685, 10129, 9776, 9724, +10139, 11183, 12683, 14378, 16071, 17544, 18693, 19430, 19875, 20182, 20443, 20736, 20918, 20687, 19924, 18530, +16578, 14220, 11705, 9346, 7365, 5931, 5197, 5056, 5267, 5527, 5509, 5139, 4492, 3628, 2576, 1341, +-55, -1486, -2852, -3997, -4962, -5815, -6376, -6630, -6615, -6370, -6134, -6016, -6121, -6617, -7504, -8748, +-10193, -11598, -12805, -13677, -14070, -14041, -13689, -13256, -12870, -12524, -12285, -11983, -11530, -10883, -10036, -9136, +-8350, -7682, -7117, -6623, -6109, -5495, -4848, -4470, -4698, -5745, -7643, -10084, -12653, -15016, -16812, -17835, +-18050, -17527, -16431, -15063, -13618, -12279, -11272, -10624, -10255, -10031, -9843, -9669, -9375, -8882, -8199, -7263, +-6193, -5112, -4022, -3023, -2214, -1450, -594, 309, 1227, 2081, 2875, 3687, 4569, 5543, 6516, 7473, +8440, 9261, 9855, 10226, 10462, 10731, 11224, 11999, 13023, 14228, 15620, 17035, 18357, 19609, 20670, 21588, +22372, 23071, 23806, 24521, 25090, 25408, 25271, 24598, 23278, 21368, 19091, 16671, 14403, 12487, 11002, 9934, +9222, 8723, 8267, 7787, 7142, 6327, 5347, 4249, 3030, 1663, 284, -963, -2065, -2883, -3382, -3610, +-3605, -3362, -2959, -2587, -2400, -2419, -2751, -3369, -4206, -5211, -6290, -7308, -8203, -8922, -9493, -9994, +-10415, -10690, -10786, -10752, -10565, -10249, -9906, -9620, -9310, -8964, -8598, -8139, -7583, -6976, -6412, -6139, +-6362, -7274, -8850, -10886, -13158, -15376, -17291, -18834, -19962, -20641, -20953, -20905, -20650, -20279, -19884, -19623, +-19456, -19401, -19416, -19371, -19162, -18726, -18047, -17182, -16159, -14996, -13740, -12403, -10956, -9404, -7875, -6387, +-4972, -3696, -2542, -1523, -566, 468, 1681, 3040, 4441, 5774, 6910, 7786, 8446, 9043, 9676, 10486, +11606, 12930, 14407, 15914, 17284, 18513, 19598, 20569, 21460, 22284, 23072, 23867, 24655, 25278, 25646, 25639, +25150, 24180, 22788, 21165, 19464, 17806, 16347, 15170, 14345, 13803, 13477, 13356, 13340, 13308, 13119, 12673, +11923, 10856, 9587, 8270, 7041, 6037, 5359, 5001, 4830, 4705, 4552, 4258, 3778, 3132, 2368, 1524, +667, -202, -1083, -2015, -3081, -4292, -5517, -6711, -7744, -8553, -9140, -9485, -9627, -9591, -9410, -9169, +-8924, -8640, -8278, -7798, -7215, -6627, -6113, -5742, -5630, -5912, -6630, -7863, -9509, -11380, -13314, -15059, +-16528, -17672, -18413, -18747, -18771, -18661, -18559, -18578, -18722, -18976, -19299, -19599, -19773, -19798, -19707, -19508, +-19230, -18897, -18470, -17894, -17138, -16159, -15034, -13894, -12795, -11771, -10798, -9882, -8992, -8078, -7076, -5984, +-4845, -3734, -2739, -1860, -1074, -314, 590, 1719, 3030, 4534, 6198, 7900, 9624, 11341, 13022, 14705, +16389, 18067, 19730, 21300, 22752, 23956, 24839, 25391, 25580, 25372, 24844, 24087, 23046, 21780, 20395, 18984, +17666, 16516, 15600, 14909, 14442, 14153, 13865, 13450, 12813, 11865, 10589, 9104, 7598, 6283, 5321, 4709, +4395, 4283, 4186, 4001, 3675, 3207, 2589, 1868, 1176, 531, -44, -527, -1007, -1505, -2028, -2566, +-3054, -3437, -3639, -3621, -3426, -3081, -2610, -2058, -1419, -720, -22, 645, 1259, 1785, 2121, 2221, +2046, 1534, 638, -640, -2279, -4210, -6307, -8466, -10568, -12513, -14254, -15769, -16981, -17899, -18592, -19189, +-19842, -20564, -21331, -22080, -22745, -23302, -23704, -23947, -24040, -23891, -23498, -22871, -22033, -21059, -19996, -18883, +-17700, -16520, -15364, -14235, -13091, -11857, -10551, -9240, -7963, -6721, -5542, -4482, -3478, -2468, -1367, -125, +1272, 2779, 4349, 5983, 7619, 9260, 10919, 12596, 14261, 15896, 17481, 19013, 20478, 21783, 22864, 23685, +24199, 24433, 24340, 23933, 23288, 22415, 21334, 20055, 18698, 17355, 16124, 15081, 14269, 13675, 13208, 12745, +12177, 11462, 10560, 9504, 8393, 7351, 6508, 5978, 5738, 5735, 5854, 5975, 6007, 5878, 5616, 5199, +4632, 4010, 3374, 2727, 2133, 1550, 982, 393, -239, -890, -1520, -2061, -2426, -2616, -2629, -2448, +-2093, -1608, -1052, -458, 113, 626, 1039, 1322, 1441, 1309, 917, 250, -713, -1956, -3455, -5142, +-6882, -8619, -10298, -11869, -13319, -14616, -15747, -16749, -17643, -18476, -19284, -20099, -20900, -21646, -22345, -22949, +-23400, -23663, -23687, -23457, -22982, -22349, -21635, -20881, -20122, -19329, -18499, -17630, -16721, -15762, -14773, -13784, +-12858, -12044, -11267, -10464, -9621, -8670, -7579, -6367, -5042, -3700, -2352, -955, 478, 1976, 3556, 5216, +6953, 8758, 10593, 12406, 14146, 15799, 17323, 18693, 19860, 20769, 21383, 21693, 21733, 21492, 21019, 20337, +19460, 18504, 17563, 16701, 15987, 15411, 14946, 14610, 14349, 14068, 13680, 13142, 12469, 11762, 11103, 10551, +10215, 10127, 10251, 10477, 10690, 10774, 10695, 10453, 10051, 9522, 8886, 8232, 7611, 6988, 6377, 5732, +5043, 4297, 3496, 2657, 1835, 1106, 541, 153, -45, -57, 34, 196, 425, 670, 904, 1094, +1210, 1201, 1020, 640, 80, -652, -1555, -2613, -3788, -5047, -6386, -7769, -9178, -10531, -11807, -12977, +-13998, -14899, -15730, -16522, -17351, -18199, -19018, -19798, -20458, -20938, -21201, -21229, -21068, -20762, -20364, -19897, +-19368, -18771, -18098, -17317, -16493, -15663, -14874, -14166, -13503, -12890, -12339, -11823, -11290, -10662, -9935, -9133, +-8282, -7403, -6513, -5605, -4641, -3621, -2545, -1375, -129, 1200, 2637, 4158, 5749, 7361, 8965, 10516, +11932, 13193, 14250, 15044, 15557, 15814, 15872, 15730, 15402, 14909, 14310, 13676, 13051, 12493, 12057, 11744, +11518, 11353, 11184, 10971, 10692, 10351, 10005, 9676, 9450, 9398, 9537, 9837, 10230, 10642, 10952, 11127, +11137, 10956, 10613, 10123, 9547, 8929, 8296, 7647, 6976, 6259, 5469, 4582, 3631, 2688, 1802, 1079, +575, 308, 246, 379, 662, 1035, 1452, 1840, 2173, 2437, 2602, 2625, 2489, 2232, 1869, 1418, +890, 249, -537, -1545, -2679, -3898, -5153, -6392, -7599, -8758, -9852, -10920, -12004, -13094, -14220, -15338, +-16381, -17332, -18150, -18816, -19310, -19640, -19818, -19852, -19775, -19606, -19329, -18945, -18472, -17922, -17373, -16860, +-16392, -16004, -15662, -15342, -15047, -14713, -14296, -13745, -13057, -12261, -11385, -10464, -9512, -8533, -7480, -6339, +-5091, -3692, -2160, -497, 1315, 3248, 5267, 7322, 9376, 11350, 13172, 14810, 16201, 17297, 18073, 18443, +18573, 18455, 18108, 17568, 16881, 16150, 15418, 14756, 14214, 13788, 13460, 13201, 12934, 12613, 12219, 11767, +11320, 10909, 10619, 10516, 10609, 10870, 11217, 11576, 11823, 11922, 11853, 11587, 11165, 10598, 9953, 9266, +8575, 7871, 7148, 6382, 5548, 4622, 3638, 2672, 1772, 1040, 536, 270, 216, 357, 647, 1026, +1447, 1839, 2173, 2437, 2604, 2625, 2489, 2233, 1869, 1418, 890, 249, -530, -1514, -2097, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +206, 182, 117, 91, 84, 3, 5, -11, -64, -44, -10, -10, -54, -175, -194, -81, +-39, 35, 73, 80, 52, 3, 71, 200, 312, 459, 564, 749, 909, 1160, 1450, 1707, +2129, 2655, 3303, 3458, -869, -16174, -21128, -4185, 2029, -5400, -1532, 1073, 1009, -5020, -26009, -24578, +-7031, -8741, -11692, -4266, -7802, -10415, 2324, 11986, 7987, 6016, 6492, 4539, 4303, 5140, 12638, 10889, +-572, 12562, 29104, 25396, 21353, 19836, 17538, 16770, 17989, 18684, 17750, 14570, 12214, 11218, 11481, 9754, +7365, 7110, 5372, 6594, 5984, 2376, 1862, 1106, -1843, -3434, -2445, -3429, -5297, -5252, -5334, -7007, +-6377, -6469, -8493, -9333, -11645, -11875, -11877, -13660, -12807, -11760, -12072, -11983, -10084, -9923, -11579, -12426, +-13093, -13832, -13607, -13311, -12794, -11358, -12133, -11770, -9758, -9199, -8459, -7785, -8335, -8380, -7594, -8377, +-7514, -6376, -4975, -2769, -5140, -3699, 152, -3256, -3371, 2102, 942, -1259, 1164, 5481, 2464, -6028, +-335, 9318, 6478, 1579, 3133, -160, -4921, 6386, 16971, 13782, 12245, 11911, 13837, 17146, 13628, 13304, +9066, -244, 10308, 22885, 20464, 17548, 15090, 17192, 22931, 23803, 22591, 22536, 14160, 3151, 6179, 7195, +-3968, -2954, 8446, 11681, 9293, 3544, -84, -6048, -15028, -14894, -19368, -28574, -21137, -7012, -6181, -14820, +-18493, -20047, -25141, -22131, -13720, -17336, -26939, -27603, -18607, -9062, -6423, -6006, -4550, -260, 6007, 10147, +10105, 4848, 723, 2247, 7921, 15708, 20152, 18927, 19866, 23297, 24998, 26110, 26367, 26265, 24586, 23124, +23258, 22160, 19589, 17574, 16646, 14815, 14841, 16318, 15878, 13778, 11650, 9789, 7817, 5300, 3065, 3322, +2115, -70, 357, 958, -701, -1950, -3491, -6394, -6605, -8139, -10435, -9455, -12597, -13248, -11040, -13174, +-13009, -10645, -14229, -16362, -14751, -15213, -17965, -18583, -16357, -17263, -18805, -18149, -13963, -16068, -20594, -13678, +-12444, -20914, -17380, -11801, -13689, -16322, -16543, -11797, -11157, -14153, -10365, -11955, -16801, -11040, -3874, -5386, +-10633, -12256, -13224, -9701, -3550, -1204, -1549, -8859, -14356, -5134, 1361, -3280, -4224, -757, 4792, 9986, +13864, 16322, 9783, 2776, 7396, 14284, 13113, 11092, 14203, 15591, 15347, 20555, 24332, 22665, 24894, 29723, +27766, 17674, 10066, 10720, 10735, 8219, 6919, 8585, 10870, 12614, 15932, 12676, -1198, -13959, -17478, -12130, +-4543, -6035, -12631, -14044, -12177, -8299, -4953, -8442, -16693, -21399, -20616, -16843, -14198, -16595, -16988, -11709, +-3934, 4375, 10255, 9904, 7008, 4962, 4034, 6021, 9381, 11491, 14458, 17412, 18064, 22308, 26196, 24766, +26729, 28422, 27558, 28094, 25752, 24284, 24181, 20986, 18664, 19759, 19146, 17742, 18335, 17078, 13714, 13210, +12136, 8790, 7205, 5000, 4040, 2440, 689, 4239, 1330, -4460, -759, -687, -6208, -6797, -5946, -8198, +-12343, -12201, -8610, -11652, -15775, -12058, -9099, -13942, -15862, -12589, -15594, -18772, -17762, -18879, -18896, -17776, +-16537, -14807, -18343, -21060, -16410, -14607, -17903, -19867, -18844, -17596, -17827, -14638, -12047, -17653, -23758, -18923, +-8654, -7010, -11744, -13820, -15896, -16881, -10647, -4562, -7465, -12713, -9776, -3748, -3221, -4862, -7664, -10705, +-9553, -2991, 5411, 7747, 6555, 9261, 11641, 10190, 8683, 8363, 10074, 12430, 12164, 11385, 11532, 12722, +17118, 24037, 26944, 24468, 22092, 21688, 23392, 21062, 11635, 3799, 2987, 7011, 14854, 20657, 16240, 7088, +1035, -1382, -55, -1467, -9453, -13506, -13237, -12188, -6517, -4709, -9623, -11935, -11847, -12877, -14025, -16486, +-20719, -22395, -22570, -19446, -8920, -1636, -897, 3022, 5009, 3193, 3982, 3549, 4559, 6693, 7650, 11494, +13059, 14216, 19470, 21669, 21596, 25203, 28186, 26732, 25301, 26659, 24708, 19764, 19834, 23053, 21980, 17555, +18970, 22134, 17462, 15591, 18190, 14451, 9487, 9100, 10228, 9004, 4862, 4185, 5515, 3138, 1640, 2088, +1151, -1351, -3246, -3123, -5100, -9128, -9634, -7662, -9278, -13357, -11741, -7863, -9982, -13305, -13232, -15175, +-19309, -19102, -14424, -15745, -21664, -21030, -16480, -15040, -16404, -18803, -22030, -23710, -18947, -11620, -12484, -19802, +-24174, -23052, -18835, -13912, -12276, -14720, -16958, -15427, -11419, -9393, -13127, -16114, -13052, -8528, -5536, -4340, +-5318, -7267, -9349, -11256, -9968, -6937, -5078, -90, 6851, 7568, 5006, 4822, 7201, 11595, 12362, 8522, +6730, 7240, 8498, 12556, 15615, 14199, 14994, 21186, 27434, 31240, 28903, 19445, 12178, 9790, 11751, 16947, +16052, 12362, 14206, 16407, 16097, 13195, 7956, 2750, -2785, -6072, -4506, -3912, -7022, -7777, -6089, -6266, +-4686, -2746, -7762, -14167, -16950, -20070, -23256, -23240, -16903, -10679, -9540, -4390, 1462, -1267, -2794, 1419, +2459, -385, 278, 5319, 6503, 5643, 9257, 13345, 15318, 17916, 22149, 24598, 22935, 21747, 22973, 23195, +20631, 18688, 19884, 19541, 18060, 19773, 20360, 17302, 15090, 15748, 16213, 12188, 9057, 11125, 10177, 5426, +4815, 6351, 4429, 2271, 3353, 3025, -991, -2979, -1489, -2294, -7107, -9988, -9615, -9084, -7708, -6722, +-9187, -12894, -13617, -11114, -9930, -14216, -20105, -21296, -18343, -14230, -11627, -14327, -20423, -23114, -20016, -13638, +-11222, -15559, -18617, -17527, -16646, -16469, -16480, -16968, -16581, -14313, -11041, -8772, -10056, -13904, -14079, -11412, +-11408, -10699, -7432, -4200, -1991, -4642, -9968, -12395, -12809, -9678, -4874, -4388, -5416, -3874, -258, 4058, +6765, 5833, 3416, 3253, 5793, 9402, 8724, 2262, 90, 5421, 12116, 19482, 25142, 25592, 24095, 23259, +22613, 20159, 15922, 14030, 13876, 14557, 17937, 21698, 20821, 16840, 15769, 13948, 7698, 3894, 2285, -2638, +-6905, -6614, -5134, -5069, -4291, -2037, -1364, -4815, -12384, -18702, -21758, -25741, -27500, -23969, -18385, -13321, +-9042, -3515, -2, -2221, -2173, 2358, 2672, 318, 2420, 5963, 5892, 8461, 15509, 19131, 20585, 25575, +31720, 29984, 28385, 30023, 29111, 29509, 29364, 27491, 28102, 26579, 26091, 27636, 26605, 23110, 20918, 21375, +20621, 15915, 12427, 13167, 11673, 8233, 7094, 6561, 3763, 2342, 4325, 4088, -1535, -5529, -5072, -5463, +-8974, -11088, -12251, -13730, -12264, -9327, -9930, -14061, -17700, -16858, -15137, -17774, -22078, -23229, -21661, -18687, +-16222, -17530, -22280, -25011, -22487, -15917, -13069, -16959, -19938, -19087, -18166, -17690, -17468, -17691, -17039, -14662, +-11258, -9070, -10603, -14387, -14369, -11573, -11389, -10623, -7442, -4308, -2087, -4680, -9962, -12403, -12820, -9679, +-4878, -4383, -5423, -3830, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 62, 79, 99, 115, 134, 153, 167, 182, 197, 211, +225, 245, 253, 259, 274, 288, 298, 303, 318, 323, 330, 338, 345, 341, 342, 347, +342, 342, 346, 364, 359, 356, 351, 356, 359, 360, 385, 438, 473, 510, 549, 578, +595, 604, 604, 604, 587, 607, 655, 671, 730, 784, 854, 873, 904, 943, 961, 997, +1040, 1087, 1159, 1208, 1277, 1364, 1418, 1452, 1498, 1562, 1621, 1663, 1721, 1727, 1753, 1757, +1772, 1755, 1722, 1689, 1639, 1578, 1538, 1505, 1441, 1392, 1293, 1228, 1137, 1063, 933, 719, +405, -49, -669, -1430, -2301, -3193, -4146, -5120, -6036, -6969, -7953, -9071, -10254, -11456, -12705, -13978, +-15241, -16520, -17845, -19061, -20104, -21091, -21996, -22846, -23589, -24371, -25047, -25543, -25737, -25556, -24972, -23933, +-22424, -20549, -18467, -16339, -14196, -12180, -10361, -8666, -7083, -5531, -3951, -2429, -1025, 148, 1015, 1574, +1824, 1850, 1723, 1562, 1402, 1256, 1172, 1167, 1263, 1382, 1510, 1659, 1763, 1858, 1906, 1964, +2013, 2057, 2145, 2184, 2214, 2265, 2265, 2279, 2327, 2356, 2353, 2358, 2363, 2372, 2378, 2392, +2411, 2459, 2523, 2584, 2693, 2798, 2815, 2693, 2458, 2083, 1596, 1064, 536, 45, -325, -633, +-856, -989, -1069, -1115, -1144, -1185, -1242, -1316, -1484, -1729, -2023, -2299, -2543, -2702, -2683, -2502, +-2160, -1732, -1217, -656, -138, 293, 699, 1016, 1244, 1427, 1529, 1615, 1659, 1680, 1729, 1826, +2000, 2223, 2551, 2963, 3517, 4161, 4879, 5610, 6260, 6822, 7323, 7845, 8341, 8912, 9530, 10258, +11091, 12005, 13099, 14211, 15315, 16426, 17470, 18409, 19315, 20246, 21229, 22221, 23381, 24620, 25993, 27405, +28752, 29851, 30427, 30481, 30386, 30195, 29480, 28396, 27094, 25490, 23602, 21428, 18913, 16062, 13152, 10157, +7248, 4531, 2105, -55, -1902, -3559, -5040, -6392, -7722, -9087, -10420, -11776, -13098, -14388, -15693, -17099, +-18567, -20109, -21564, -23016, -24224, -25073, -25398, -25205, -24477, -23336, -21869, -20254, -18595, -16790, -14975, -13085, +-11068, -9018, -6961, -4964, -3135, -1567, -278, 660, 1295, 1651, 1789, 1767, 1680, 1537, 1419, 1338, +1283, 1271, 1311, 1403, 1456, 1505, 1558, 1586, 1613, 1611, 1592, 1534, 1472, 1414, 1361, 1306, +1272, 1266, 1246, 1229, 1209, 1228, 1191, 1127, 1052, 1014, 953, 865, 764, 679, 633, 599, +550, 536, 501, 503, 477, 507, 505, 471, 434, 396, 376, 357, 357, 458, 580, 735, +919, 1088, 1200, 1243, 1248, 1229, 1137, 1010, 822, 652, 485, 336, 255, 147, 50, 21, +25, 75, 162, 205, 173, 128, 32, -70, -165, -199, -195, -120, -10, 172, 404, 692, +1016, 1385, 1772, 2138, 2542, 2958, 3444, 3988, 4626, 5353, 6176, 7116, 8068, 9037, 9925, 10771, +11540, 12271, 13031, 13889, 14854, 15941, 17104, 18304, 19551, 20511, 21297, 21879, 22290, 22473, 22512, 22265, +21780, 21094, 20113, 18804, 17066, 15140, 12951, 10559, 8112, 5635, 3226, 929, -1256, -3295, -5268, -7124, +-8895, -10575, -12073, -13382, -14550, -15643, -16720, -17953, -19348, -20929, -22703, -24616, -26420, -28000, -29212, -29969, +-30230, -30007, -29416, -28474, -27278, -25829, -24179, -22338, -20352, -18247, -16014, -13774, -11603, -9593, -7801, -6231, +-4982, -4019, -3321, -2831, -2503, -2316, -2277, -2253, -2277, -2288, -2303, -2298, -2237, -2159, -2044, -1911, +-1776, -1681, -1593, -1518, -1451, -1397, -1336, -1320, -1305, -1304, -1287, -1271, -1235, -1198, -1162, -1115, +-1086, -1045, -975, -902, -837, -758, -726, -687, -666, -613, -537, -462, -393, -336, -297, -243, +-205, -175, -163, -163, -146, -122, -71, -16, 47, 94, 91, 55, 30, 15, -17, -21, +-55, -94, -172, -235, -337, -362, -357, -303, -228, -115, -11, 88, 183, 225, 221, 214, +192, 201, 224, 340, 497, 696, 943, 1282, 1644, 2005, 2352, 2688, 3036, 3355, 3715, 4174, +4756, 5434, 6231, 7084, 7898, 8664, 9349, 9981, 10550, 11140, 11794, 12508, 13289, 14186, 15149, 16134, +17137, 18077, 19008, 19918, 20719, 21404, 21962, 22391, 22683, 22740, 22521, 22028, 21188, 20050, 18586, 16874, +15141, 13299, 11413, 9512, 7524, 5523, 3489, 1418, -606, -2511, -4253, -5796, -7110, -8312, -9426, -10580, +-11858, -13365, -15122, -17066, -19120, -21135, -23110, -24861, -26294, -27361, -27980, -28205, -28024, -27430, -26523, -25297, +-23759, -21976, -19916, -17790, -15473, -13172, -10905, -8821, -6967, -5325, -3975, -2895, -2034, -1408, -985, -681, +-482, -417, -394, -406, -451, -473, -448, -399, -291, -129, 46, 265, 483, 689, 915, 1144, +1361, 1550, 1699, 1750, 1819, 1873, 1981, 2085, 2214, 2359, 2518, 2697, 2882, 3059, 3217, 3324, +3448, 3558, 3642, 3677, 3701, 3697, 3594, 3467, 3342, 3216, 3100, 3009, 2907, 2788, 2649, 2488, +2267, 2075, 1928, 1767, 1637, 1592, 1545, 1521, 1504, 1457, 1392, 1340, 1292, 1238, 1210, 1175, +1161, 1106, 1048, 992, 909, 813, 669, 492, 322, 175, 28, -55, -64, 1, 143, 309, +443, 550, 623, 606, 631, 687, 849, 1150, 1527, 2051, 2673, 3312, 3966, 4601, 5203, 5779, +6352, 6977, 7623, 8339, 9115, 9981, 10917, 11870, 12866, 13837, 14825, 15800, 16755, 17694, 18591, 19542, +20283, 20840, 21171, 21261, 21048, 20607, 19906, 19008, 17849, 16638, 15350, 13893, 12293, 10549, 8621, 6578, +4481, 2414, 442, -1389, -3001, -4431, -5717, -6937, -8176, -9485, -10958, -12640, -14581, -16692, -18920, -21145, +-23268, -25280, -27016, -28422, -29396, -29936, -30054, -29737, -29018, -27883, -26430, -24656, -22620, -20356, -18044, -15624, +-13261, -11067, -9060, -7337, -5887, -4678, -3711, -3003, -2463, -2037, -1710, -1464, -1285, -1130, -1012, -938, +-921, -869, -795, -711, -589, -456, -291, -125, 47, 194, 342, 438, 462, 458, 457, 443, +427, 405, 398, 396, 419, 444, 545, 662, 800, 913, 977, 1011, 1000, 978, 928, 874, +866, 892, 951, 1025, 1083, 1146, 1212, 1234, 1232, 1230, 1219, 1180, 1199, 1183, 1149, 1128, +1135, 1106, 1092, 1089, 1075, 1097, 1116, 1161, 1224, 1314, 1419, 1493, 1548, 1586, 1539, 1466, +1387, 1322, 1272, 1326, 1446, 1639, 1849, 2032, 2202, 2344, 2429, 2492, 2591, 2722, 2962, 3269, +3648, 4122, 4598, 5119, 5625, 6110, 6580, 7021, 7477, 7952, 8454, 8983, 9579, 10211, 10898, 11571, +12281, 12958, 13689, 14412, 15144, 15937, 16739, 17570, 18314, 19153, 19734, 20136, 20348, 20448, 20346, 20065, +19678, 19124, 18368, 17335, 16222, 14937, 13433, 11782, 10021, 8197, 6372, 4591, 2964, 1453, 85, -1176, +-2363, -3547, -4771, -6114, -7575, -9301, -11237, -13430, -15805, -18236, -20660, -22882, -24961, -26724, -28127, -29117, +-29649, -29720, -29309, -28490, -27307, -25785, -23951, -21830, -19567, -17172, -14770, -12478, -10337, -8465, -6823, -5476, +-4380, -3547, -2902, -2463, -2144, -1920, -1768, -1663, -1597, -1528, -1418, -1297, -1135, -951, -755, -624, +-500, -396, -337, -352, -371, -422, -510, -607, -734, -834, -934, -983, -1004, -978, -949, -829, +-732, -669, -599, -549, -548, -543, -549, -572, -558, -555, -525, -536, -534, -539, -530, -561, +-582, -621, -662, -721, -742, -789, -791, -786, -755, -732, -696, -740, -737, -720, -689, -640, +-541, -438, -346, -287, -273, -325, -403, -488, -549, -599, -534, -390, -190, 35, 250, 458, +611, 696, 784, 836, 897, 1011, 1207, 1458, 1777, 2174, 2587, 3060, 3481, 3907, 4282, 4635, +4984, 5363, 5800, 6221, 6740, 7273, 7840, 8422, 9002, 9618, 10245, 10928, 11621, 12391, 13154, 13951, +14698, 15436, 16109, 16700, 17200, 17604, 17948, 18185, 18320, 18306, 18150, 17796, 17287, 16546, 15590, 14432, +13152, 11704, 10162, 8561, 6986, 5457, 4010, 2686, 1466, 293, -789, -1921, -3119, -4436, -5896, -7556, +-9494, -11664, -14095, -16652, -19246, -21699, -24108, -26230, -28033, -29425, -30357, -30773, -30724, -30221, -29294, -27948, +-26220, -24186, -21893, -19504, -17084, -14608, -12261, -10117, -8181, -6549, -5205, -4124, -3253, -2608, -2090, -1680, +-1334, -1029, -758, -491, -210, 59, 273, 492, 662, 836, 938, 1011, 1015, 992, 913, 764, +553, 356, 167, 23, -99, -154, -181, -170, -182, -185, -170, -158, -160, -165, -151, -152, +-162, -160, -170, -199, -187, -211, -265, -318, -399, -501, -587, -655, -682, -676, -645, -628, +-617, -653, -719, -766, -818, -849, -815, -742, -667, -578, -509, -510, -587, -704, -852, -1014, +-1126, -1179, -1161, -1121, -983, -813, -637, -506, -361, -286, -217, -153, -52, 62, 255, 495, +812, 1150, 1518, 1835, 2187, 2479, 2818, 3132, 3473, 3859, 4300, 4765, 5268, 5800, 6360, 6928, +7506, 8068, 8653, 9284, 9916, 10559, 11228, 11888, 12547, 13200, 13792, 14385, 14953, 15503, 15993, 16438, +16851, 17123, 17355, 17447, 17394, 17157, 16785, 16166, 15383, 14455, 13392, 12230, 10956, 9649, 8320, 7006, +5760, 4572, 3481, 2445, 1462, 414, -617, -1776, -3072, -4559, -6307, -8291, -10549, -13016, -15641, -18288, +-20854, -23255, -25427, -27255, -28650, -29600, -30051, -29969, -29420, -28432, -27025, -25238, -23193, -20866, -18495, -15994, +-13598, -11356, -9335, -7614, -6208, -5103, -4250, -3570, -3064, -2665, -2349, -2076, -1838, -1590, -1367, -1141, +-886, -628, -438, -228, -122, -60, -49, -107, -151, -246, -303, -379, -481, -531, -594, -665, +-713, -719, -697, -667, -621, -585, -529, -439, -354, -275, -196, -117, -66, -64, -103, -182, +-270, -357, -411, -444, -442, -438, -417, -422, -467, -532, -611, -677, -719, -663, -565, -429, +-291, -137, -12, 52, 62, 10, -68, -142, -216, -233, -186, -89, 62, 230, 404, 565, +686, 792, 859, 938, 1058, 1208, 1432, 1647, 1888, 2180, 2470, 2702, 2959, 3197, 3423, 3670, +3924, 4196, 4521, 4869, 5234, 5634, 6050, 6482, 6938, 7439, 7950, 8496, 9092, 9687, 10291, 10903, +11519, 12129, 12766, 13352, 13928, 14491, 15035, 15605, 16144, 16610, 17027, 17401, 17645, 17745, 17749, 17616, +17287, 16821, 16205, 15420, 14519, 13518, 12441, 11332, 10175, 8999, 7839, 6743, 5707, 4728, 3777, 2776, +1772, 679, -525, -1928, -3534, -5418, -7570, -10016, -12660, -15423, -18202, -20875, -23333, -25514, -27293, -28648, +-29528, -29837, -29663, -28983, -27850, -26286, -24361, -22158, -19775, -17356, -14933, -12589, -10453, -8556, -6911, -5580, +-4515, -3691, -3030, -2532, -2086, -1726, -1373, -1048, -749, -449, -171, 51, 192, 347, 439, 510, +558, 551, 490, 388, 297, 188, 66, -45, -160, -279, -361, -438, -501, -514, -461, -379, +-241, -74, 75, 209, 292, 294, 280, 239, 180, 99, 66, 56, 42, -21, -74, -138, +-245, -393, -517, -628, -671, -657, -566, -437, -291, -120, 34, 120, 162, 152, 122, 50, +11, -21, -6, 23, 97, 177, 238, 293, 356, 405, 495, 611, 757, 933, 1161, 1424, +1707, 1980, 2232, 2427, 2648, 2786, 2941, 3104, 3270, 3452, 3632, 3860, 4123, 4437, 4762, 5092, +5474, 5892, 6313, 6793, 7296, 7842, 8367, 8921, 9494, 10073, 10614, 11169, 11742, 12298, 12843, 13363, +13879, 14384, 14846, 15294, 15685, 16002, 16254, 16397, 16419, 16343, 16119, 15750, 15284, 14664, 13904, 13081, +12154, 11180, 10171, 9158, 8096, 7094, 6134, 5195, 4318, 3479, 2630, 1739, 721, -437, -1829, -3516, +-5512, -7735, -10234, -12955, -15808, -18660, -21314, -23765, -25902, -27638, -28872, -29555, -29700, -29369, -28548, -27249, +-25591, -23639, -21422, -19097, -16715, -14354, -12109, -10042, -8263, -6751, -5499, -4489, -3697, -3033, -2551, -2086, +-1693, -1365, -1046, -768, -526, -307, -124, 27, 120, 172, 152, 157, 132, 94, 35, -64, +-178, -318, -464, -609, -720, -798, -783, -687, -563, -424, -299, -178, -112, -61, -47, -35, +-45, -16, -8, -6, -12, -50, -93, -217, -369, -530, -724, -913, -1024, -1077, -1082, -1011, +-944, -858, -759, -706, -691, -655, -650, -621, -566, -509, -440, -333, -248, -180, -93, -50, +22, 102, 204, 340, 540, 749, 983, 1248, 1494, 1799, 2032, 2245, 2469, 2678, 2867, 3032, +3211, 3381, 3556, 3730, 3943, 4117, 4307, 4539, 4778, 5068, 5389, 5735, 6134, 6533, 6983, 7492, +7991, 8506, 9051, 9570, 10108, 10667, 11215, 11760, 12324, 12852, 13375, 13862, 14354, 14815, 15238, 15580, +15863, 16105, 16213, 16227, 16109, 15892, 15499, 15023, 14419, 13712, 12885, 12004, 11097, 10168, 9216, 8301, +7423, 6623, 5843, 5119, 4388, 3628, 2722, 1678, 434, -1094, -2919, -5106, -7553, -10328, -13285, -16320, +-19274, -22030, -24535, -26711, -28412, -29595, -30219, -30301, -29887, -28952, -27559, -25805, -23745, -21472, -19124, -16703, +-14332, -12122, -10098, -8354, -6852, -5612, -4593, -3796, -3127, -2584, -2056, -1626, -1237, -907, -572, -288, +-44, 154, 313, 473, 613, 703, 730, 657, 577, 394, 216, 42, -133, -233, -309, -346, +-321, -257, -205, -142, -93, -20, 59, 128, 211, 318, 424, 553, 645, 715, 705, 614, +478, 306, 117, -52, -175, -267, -291, -286, -270, -223, -170, -163, -143, -120, -108, -64, +6, 94, 175, 258, 313, 347, 403, 409, 418, 423, 446, 514, 638, 783, 960, 1185, +1409, 1655, 1869, 2096, 2290, 2513, 2710, 2928, 3104, 3298, 3500, 3677, 3852, 4032, 4177, 4363, +4536, 4719, 4959, 5207, 5509, 5839, 6217, 6622, 7056, 7528, 8020, 8524, 9026, 9552, 10064, 10555, +11035, 11532, 12033, 12521, 13036, 13510, 13957, 14393, 14786, 15115, 15374, 15557, 15663, 15694, 15602, 15435, +15151, 14752, 14240, 13642, 12949, 12182, 11406, 10554, 9759, 8950, 8178, 7481, 6830, 6212, 5640, 5024, +4344, 3511, 2474, 1193, -415, -2316, -4587, -7161, -9964, -12946, -16003, -18970, -21741, -24197, -26298, -27905, +-29013, -29560, -29580, -29054, -28063, -26638, -24836, -22761, -20481, -18181, -15815, -13555, -11460, -9582, -7907, -6475, +-5292, -4308, -3471, -2773, -2222, -1763, -1355, -1012, -679, -359, -70, 225, 462, 622, 748, 807, +763, 680, 599, 467, 333, 201, 119, 52, -1, -49, -97, -93, -129, -117, -105, -64, +66, 219, 385, 529, 657, 760, 808, 771, 671, 560, 395, 228, 54, -68, -163, -250, +-327, -403, -442, -520, -565, -600, -618, -593, -540, -483, -388, -306, -233, -180, -151, -141, +-115, -110, -103, -34, 28, 138, 288, 490, 681, 898, 1123, 1340, 1602, 1852, 2082, 2289, +2537, 2747, 2920, 3095, 3261, 3396, 3513, 3646, 3757, 3854, 3998, 4182, 4345, 4591, 4850, 5148, +5494, 5877, 6276, 6696, 7108, 7584, 8008, 8451, 8882, 9332, 9789, 10273, 10737, 11208, 11694, 12188, +12624, 13037, 13421, 13767, 14095, 14352, 14512, 14642, 14664, 14553, 14388, 14085, 13710, 13192, 12591, 11927, +11222, 10478, 9750, 9053, 8391, 7792, 7248, 6736, 6278, 5805, 5279, 4650, 3841, 2775, 1437, -238, +-2313, -4694, -7391, -10343, -13481, -16630, -19741, -22494, -25044, -27172, -28806, -29857, -30330, -30230, -29619, -28504, +-27011, -25175, -23135, -20912, -18631, -16392, -14167, -12048, -10199, -8540, -7126, -5992, -5051, -4269, -3634, -3075, +-2589, -2117, -1708, -1283, -883, -563, -307, -124, -1, 26, 35, 2, -46, -117, -162, -210, +-272, -372, -493, -624, -730, -846, -905, -921, -852, -747, -609, -434, -238, -80, 28, 104, +154, 153, 97, 26, -35, -120, -206, -301, -391, -530, -645, -755, -864, -921, -931, -924, +-899, -858, -792, -708, -626, -569, -498, -457, -422, -388, -341, -318, -260, -168, -79, 34, +162, 332, 512, 700, 926, 1200, 1417, 1660, 1927, 2148, 2397, 2625, 2823, 2994, 3177, 3337, +3463, 3590, 3701, 3832, 3932, 4072, 4247, 4447, 4693, 4977, 5309, 5649, 6022, 6409, 6827, 7262, +7713, 8155, 8601, 9073, 9556, 10001, 10467, 10899, 11331, 11772, 12188, 12575, 12938, 13258, 13529, 13768, +13968, 14043, 14066, 13976, 13774, 13487, 13123, 12677, 12139, 11550, 10915, 10254, 9608, 9000, 8404, 7889, +7432, 7025, 6648, 6317, 5953, 5515, 4923, 4124, 3067, 1675, -56, -2162, -4598, -7340, -10335, -13484, +-16639, -19734, -22494, -25044, -27153, -28739, -29599, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -2794, -2998, -3085, -2960, -2865, -2194, -2334, -1964, +-1933, -1710, -1758, -1796, -919, -1723, -545, -807, -806, 679, -915, 648, 1006, 566, 2978, 3284, +3081, 4979, 5956, 6365, 6680, 8774, 8651, 8726, 11409, 10923, 12042, 13355, 12808, 14902, 9979, 22885, +7522, 16552, 20376, 9488, 22304, 11177, 15008, 18534, 10787, 16097, 13573, 11927, 13532, 11562, 7037, 13469, +5669, 7768, 5767, 1403, 4734, -2114, 1676, -3500, -5450, -1786, -11840, -5975, -10994, -11505, -11135, -12682, +-16571, -10776, -16809, -18277, -12025, -22871, -13705, -20151, -18063, -18625, -19264, -18894, -19783, -19255, -19897, -19807, +-19944, -20172, -19875, -20909, -19106, -21581, -19236, -19265, -21974, -18280, -19300, -17641, -19155, -14543, -18118, -15280, +-8309, -19930, -4641, -12663, -10327, 2468, -18190, 8423, -5185, -9799, 22804, -27073, 26215, 4394, -12235, 30643, +-17533, 22082, 12087, -2669, 31817, 5034, 14321, 21738, 11209, 22543, 16299, 17928, 19406, 20327, 18127, 21486, +19070, 20968, 20550, 20401, 21036, 20546, 20894, 21515, 20806, 20822, 21572, 17929, 20395, 21148, 20090, 21996, +19427, 21106, 16773, 13239, 20924, 18246, 15349, 17878, 17868, 16171, 9133, 14972, 8874, 7104, 15815, 5929, +2070, 8693, 5064, 2602, 1824, -1975, -1355, -7694, -2396, -1031, -12837, 210, -3765, -12245, -4381, -12405, +-15009, -7734, -12251, -9629, -6662, -10763, -14101, -11970, -12838, -19235, -11287, -12203, -17485, -11814, -7495, -10059, +-20084, -13895, -14901, -19235, -11206, -13177, -14467, -12507, -6047, -10696, -14802, -9571, -18193, -13825, -10041, -5885, +-7514, -8590, -9753, -4103, -9906, -8867, -2076, -16486, -2436, -6435, -8641, 1094, -9700, 1860, -2871, -13903, +5686, -6639, -2988, 4030, -15284, 6590, -5020, -6532, 9087, -11446, 9196, -6590, -4472, 8459, -17500, 10086, +-15626, 2503, -6837, -9009, 14846, -19988, 5544, -2696, -10763, 7752, -18994, 684, -6675, -11161, 3615, -7810, +-2237, -956, -6023, -2766, -6323, -1482, -9625, -3594, -5441, -6492, 3649, -10036, -5634, -3012, -5847, 3117, +-9251, 2705, -2618, -6830, 7351, -6954, 3529, -1530, 3096, 3976, 875, 10497, 2361, 8307, 5227, 6425, +12447, -1515, 15279, 10879, 3362, 19206, 6384, 10422, 16012, 10350, 18052, 9648, 12765, 15033, 9173, 14307, +10298, 11413, 10910, 11998, 13164, 7855, 14029, 3319, 11344, 5451, 5457, 8188, 3581, 8682, 6269, 5583, +6055, 2760, 7021, 1673, 3827, 5392, 1054, 4797, 2201, 2780, 4868, 537, 3401, 478, 2662, 2095, +1935, 4879, 2511, 512, 5331, 1443, 2522, 8509, 1684, 5097, 8718, 4012, 5407, -472, 6305, 1277, +-3951, 6768, -588, 3817, 4148, 62, 90, -1384, 47, -792, 1029, 1059, -366, -2291, -9116, -4666, +-3382, -13337, -3323, -12846, -14582, -5154, -18612, -16588, -10813, -20878, -9033, -23007, -14413, -16187, -19411, -12669, +-18208, -15238, -17292, -13665, -18470, -18053, -11413, -20141, -12640, -16051, -14485, -14203, -18460, -12076, -15223, -12766, +-9935, -10453, -9658, -9949, -3162, -7390, -4254, -3186, -7485, 4518, -7422, 6798, 5316, -850, 14563, -1670, +9533, 3857, 4891, 13100, 2070, 13794, 11936, 11879, 14153, 8197, 13214, 9062, 11137, 16658, 13261, 17162, +14994, 15156, 15728, 12386, 16240, 13043, 13115, 15667, 15155, 17851, 13939, 15645, 11475, 9669, 14017, 10743, +14928, 13903, 13115, 13573, 8771, 11561, 6386, 7871, 7887, 5185, 9266, 7384, 10260, 7129, 5149, 5591, +1920, 2575, 944, 1524, 2681, -32, 2058, 1263, -1379, 905, -4041, -3680, -1915, -3966, -4098, -5222, +-6624, -4383, -6521, -6285, -4785, -8218, -5731, -7695, -11010, -7128, -9711, -9199, -8436, -8824, -5906, -8307, +-8466, -7967, -10124, -9155, -9362, -9953, -8763, -7921, -9638, -6843, -6066, -5393, -4308, -8494, -7948, -7499, +-7235, -5001, -4660, -4597, -1578, -1782, -3148, -2550, -2502, -2301, -3229, -5509, -3455, -4321, -3885, -1770, +-5280, -2097, -2340, -3575, -2479, -4179, -3763, -2988, -3556, -2615, -304, -1060, -1926, -1151, -3143, -1757, +-1223, -2852, -3329, -3302, -3486, -2431, -2087, -4004, -1064, -4447, -4673, -2357, -4104, -689, -1767, -2177, +-782, -1442, 960, 125, 701, 1671, 1217, 4009, 3060, 4438, 3385, 3316, 5006, 1584, 2631, 2960, +1824, 5638, 3954, 5422, 5607, 5270, 7168, 6052, 7686, 4930, 7122, 6601, 5340, 9464, 5814, 7482, +6474, 4147, 6804, 2854, 4785, 5717, 4079, 5696, 1563, 2575, 1316, 2066, 3327, 561, 2351, 1332, +855, -359, -1219, 44, -1074, 396, 320, -879, 429, -1529, -1161, 497, 810, -816, -1894, -177, +1247, 2396, 2994, 2592, 1325, 3588, 4176, 2760, 6019, 8031, 9334, 10704, 8089, 4825, 5231, 6217, +7419, 9276, 9693, 7536, 5817, 6251, 7205, 8684, 10611, 9564, 9785, 10924, 10250, 8830, 7075, 6276, +4414, 587, -534, -650, -1009, -903, -1713, -3832, -6263, -9109, -11650, -13346, -14839, -14330, -14200, -14292, +-13293, -13900, -14523, -15737, -16516, -16294, -17587, -17885, -18094, -19136, -17224, -15844, -17338, -17568, -17129, -17897, +-16386, -14253, -14398, -13654, -13305, -12298, -11450, -11120, -9703, -8673, -7960, -4821, -3972, -3588, -1858, -2917, +-2151, -1111, -990, 532, 1183, 2824, 5064, 5302, 5921, 5873, 5481, 7112, 7030, 8150, 9532, 8951, +12933, 13207, 11852, 12735, 10304, 11269, 11607, 11392, 13004, 12749, 13780, 13633, 14200, 14845, 13018, 14324, +13959, 13217, 13299, 11969, 11739, 12386, 14177, 13459, 12529, 11961, 11937, 11545, 10182, 10760, 9586, 8375, +8102, 6973, 7753, 6387, 6567, 6687, 4733, 5878, 2316, 660, 1624, -515, 973, 39, -245, 294, +-197, -772, -2339, -3802, -5073, -5425, -5384, -4988, -5141, -4685, -4186, -4911, -4947, -6124, -7589, -8937, +-10556, -9148, -8474, -9028, -8063, -8970, -8598, -9301, -10830, -10035, -10253, -9577, -10370, -10612, -10888, -10423, +-8722, -8495, -6982, -6788, -6624, -6658, -7020, -5617, -6155, -5510, -4734, -4826, -3687, -4627, -4780, -4215, +-4728, -3104, -3196, -4138, -3711, -3231, -1566, -439, 146, 370, -105, 408, 868, 154, -332, 73, +-435, 357, 672, 54, -594, -1020, -1116, -822, 156, 54, -278, -686, -1016, -1500, -1540, -1091, +-561, 100, 265, 197, 331, 1414, 2807, 2672, 2870, 2145, 1385, 2739, 2621, 2410, 2731, 2948, +3361, 3177, 3506, 3794, 4143, 4775, 3598, 2361, 2184, 2071, 3117, 5465, 6234, 5678, 4558, 3273, +3757, 3255, 3234, 3569, 2791, 3498, 3130, 1973, 1622, 1836, 2687, 2720, 2581, 2270, 1261, 262, +54, 204, -646, -793, -1647, -2009, -1537, -1888, -1230, -1886, -1995, -1839, -3163, -3178, -3564, -3285, +-2196, -2378, -2144, -2077, -2228, -1869, -1635, -1116, 486, 1765, 3278, 5629, 6527, 7102, 6409, 5431, +4892, 4169, 5531, 6613, 7381, 9814, 11198, 11372, 10821, 10255, 9947, 9789, 11073, 11650, 12558, 13697, +13954, 13545, 12167, 10861, 9412, 8370, 7892, 6983, 4906, 2589, 418, -2286, -3537, -4642, -6415, -6874, +-8037, -8190, -9044, -11096, -12347, -14613, -15227, -15856, -16424, -15845, -16691, -16177, -16533, -17456, -17761, -18992, +-18876, -18941, -18954, -18038, -17641, -17263, -16517, -16288, -16520, -15475, -14970, -13738, -12274, -11438, -9633, -8881, +-7200, -5945, -5568, -5528, -5282, -4286, -3244, -2279, -1525, -125, 1053, 2090, 3384, 3891, 5037, 5480, +5617, 6148, 6459, 7047, 7555, 9111, 10209, 11787, 12727, 12471, 13323, 12881, 12916, 12849, 12318, 13035, +13163, 13628, 13978, 14607, 15854, 15931, 16118, 15158, 13961, 13004, 11902, 12606, 12698, 13753, 14307, 14331, +14467, 13526, 13147, 10973, 9934, 9249, 7812, 8059, 6866, 6559, 6504, 5985, 5718, 4153, 3458, 2007, +530, 78, -1018, -1319, -1074, -1593, -1341, -1285, -2048, -2541, -3202, -3409, -3593, -4671, -4793, -5155, +-4977, -4431, -4511, -4635, -5318, -5712, -6380, -6842, -6911, -7315, -7113, -7410, -7826, -8238, -9206, -9555, +-9509, -9198, -8692, -8839, -8765, -8639, -8246, -7288, -7068, -7042, -7080, -7253, -6667, -6089, -6234, -6336, +-6192, -6767, -7100, -7252, -7549, -6893, -6821, -6423, -5878, -5590, -4848, -4820, -5189, -4613, -4948, -3942, +-3394, -3830, -3163, -3854, -3437, -2468, -2146, -1253, -2065, -2876, -2873, -3890, -3534, -3512, -3855, -2999, +-2512, -1626, -1074, -505, -220, 93, 115, 47, -170, 565, 1813, 2500, 3295, 4135, 4027, 4911, +5245, 5287, 5728, 4814, 5000, 5073, 5239, 5878, 5872, 6134, 6421, 6862, 7239, 7121, 7412, 7432, +7419, 6683, 6581, 6404, 5993, 6579, 5767, 5958, 5838, 4793, 5208, 4403, 4296, 3789, 2727, 2843, +2479, 1967, 1957, 573, 335, -303, -749, -773, -1421, -1107, -1234, -1561, -1816, -2823, -3705, -4689, +-5548, -5761, -5974, -5628, -5019, -4302, -3719, -3241, -3319, -3580, -2973, -1947, -1430, -73, -284, 989, +1372, 2426, 3495, 4078, 4946, 5693, 6351, 6705, 6959, 6879, 6817, 6993, 7410, 8091, 9478, 11041, +12954, 14060, 14733, 15129, 14387, 14443, 13526, 13164, 12668, 12238, 11222, 10287, 8462, 6208, 4448, 2519, +1419, 40, -1055, -2415, -4061, -4991, -6861, -8587, -9891, -11335, -11752, -13009, -13749, -14742, -15953, -16293, +-16991, -16954, -17539, -18029, -18436, -19654, -19555, -19745, -19821, -19474, -18966, -17937, -16686, -15669, -14899, -14014, +-13665, -13665, -13316, -12584, -11298, -9740, -8001, -6360, -5411, -3949, -3045, -3158, -2906, -2726, -2786, -2029, +-309, 1298, 2461, 3782, 4989, 5514, 6351, 6756, 6632, 6841, 6862, 7751, 8266, 9186, 9999, 10788, +12110, 12450, 13202, 13181, 12847, 12756, 11959, 12214, 11595, 11608, 12432, 13022, 13706, 13973, 13604, 13031, +12320, 12160, 11937, 11771, 12146, 12230, 12170, 12174, 11904, 11181, 10967, 10292, 9662, 8927, 7815, 7512, +6486, 6167, 5427, 4274, 3720, 2689, 2036, 2088, 1404, 1304, 1006, 424, -66, -788, -1453, -1668, +-1853, -1645, -1494, -1790, -1876, -2023, -2301, -2691, -3013, -3501, -3855, -4233, -4631, -4771, -5357, -5659, +-6318, -7425, -7573, -8509, -8401, -7715, -8489, -7531, -8042, -8126, -7535, -7670, -7253, -7559, -7990, -7679, +-7845, -7522, -7884, -8096, -7850, -7747, -7303, -7202, -7302, -7608, -8053, -8460, -8665, -8702, -8495, -7957, +-7709, -6898, -6027, -5709, -5018, -4674, -4846, -4916, -5386, -5268, -5212, -4664, -4389, -4394, -3934, -3929, +-3859, -3643, -3919, -3569, -3818, -3487, -3037, -2876, -2093, -1762, -1050, -394, 389, 1258, 1426, 2054, +2150, 2446, 2951, 3531, 4414, 5299, 6077, 6454, 6153, 6452, 5780, 6235, 6833, 7082, 8164, 8435, +8965, 9047, 8510, 8698, 7936, 8343, 8436, 8950, 9271, 9276, 9300, 8937, 8055, 7504, 6455, 5817, +5460, 4552, 4109, 3426, 2873, 2797, 2682, 2711, 2523, 2209, 1535, 830, 162, -782, -1970, -2899, +-3424, -4101, -4268, -4030, -4462, -4418, -4622, -5537, -5978, -6686, -6957, -6824, -6720, -6081, -5674, -5053, +-3798, -3260, -2362, -1930, -1355, -631, -388, 354, 515, 750, 1495, 1700, 2422, 2842, 3379, 4539, +4902, 6198, 7153, 8358, 9782, 11028, 12417, 13302, 13864, 14226, 14145, 13928, 13405, 12868, 11937, 11584, +11280, 10212, 9449, 7790, 6081, 4495, 2531, 1350, 294, -912, -1864, -3067, -4316, -5231, -6412, -7558, +-8970, -10512, -12180, -13545, -14524, -15020, -15261, -15703, -16003, -16593, -16673, -16996, -17767, -17864, -18472, -18695, +-18108, -17672, -16314, -15377, -14322, -12993, -12193, -11296, -10927, -10505, -10178, -10094, -9013, -8023, -6940, -5509, +-4227, -2848, -2172, -1409, -1011, -913, -388, -30, 647, 1382, 2469, 3481, 4455, 5413, 5893, 6440, +6940, 7529, 8379, 8627, 9294, 9737, 10114, 10725, 11079, 11320, 11571, 11567, 11668, 11650, 11613, 11812, +11843, 11674, 11819, 11624, 11678, 12022, 12194, 12596, 12682, 12492, 12645, 12270, 12146, 12024, 11588, 11384, +11111, 10478, 10046, 9274, 8535, 7825, 6998, 6617, 5921, 5234, 4909, 4109, 3419, 2700, 1973, 1762, +1268, 1035, 749, 228, 175, -141, -180, -243, -603, -404, -689, -797, -908, -1621, -1990, -2799, +-3604, -3924, -4617, -5032, -5218, -5430, -5468, -5599, -5955, -6455, -7051, -7583, -7958, -8443, -8491, -8481, +-8596, -8335, -8183, -8106, -7860, -8147, -8354, -8761, -9343, -9488, -9944, -10025, -10259, -10304, -9992, -10084, +-9604, -9398, -9479, -9318, -9532, -9407, -9236, -8949, -8388, -7817, -7079, -6736, -6452, -6304, -6348, -6237, +-6225, -6063, -5975, -5723, -5257, -5069, -4620, -4229, -4252, -4001, -3826, -3568, -3119, -2649, -1949, -1258, +-458, 233, 579, 1040, 1438, 1954, 2602, 3263, 4031, 4710, 5459, 5985, 6384, 6729, 6852, 7070, +7259, 7480, 7729, 7924, 8418, 8805, 9259, 9881, 10346, 10806, 11208, 11418, 11427, 11096, 10633, 10028, +9381, 8823, 8282, 7992, 7863, 7861, 7708, 7257, 6886, 6189, 5383, 4708, 3860, 3075, 2516, 2173, +1771, 1511, 1112, 260, -631, -1621, -2465, -3371, -4224, -4660, -5350, -5866, -6307, -6895, -7155, -7317, +-7176, -6890, -6653, -6197, -5815, -5436, -4996, -4644, -4317, -3794, -3277, -2944, -2480, -2261, -2054, -1688, +-1351, -636, 325, 1401, 2679, 3817, 4734, 5732, 6557, 7477, 8607, 9686, 10837, 12303, 13634, 14754, +15311, 14715, 13852, 12703, 11828, 11372, 10912, 10597, 9935, 8876, 7899, 6741, 5358, 4040, 2298, 831, +-478, -1699, -2591, -3728, -4742, -5771, -6952, -7987, -9227, -10511, -11747, -13239, -14563, -15610, -16448, -16777, +-16880, -16930, -16918, -17055, -17107, -17108, -17103, -16925, -16628, -16332, -15599, -14923, -13928, -13027, -12227, -11232, +-10451, -9575, -8632, -8010, -7181, -6556, -6095, -5330, -4713, -3927, -2996, -2063, -1130, -401, 350, 926, +1406, 1876, 2480, 2943, 3757, 4736, 5517, 6389, 6993, 7263, 7651, 7883, 8281, 8796, 9094, 9695, +10031, 10204, 10500, 10456, 10532, 10671, 10643, 10813, 10936, 11009, 11324, 11359, 11356, 11440, 11316, 11485, +11673, 11834, 12048, 11908, 11684, 11542, 11117, 10830, 10559, 10178, 10037, 9720, 9210, 8760, 7837, 7109, +6225, 5279, 4971, 4303, 3949, 3846, 3341, 3076, 2526, 2073, 1791, 1351, 1172, 793, 486, 332, +-37, -128, -369, -613, -592, -846, -1050, -1389, -2071, -2631, -3345, -4016, -4481, -4975, -5296, -5426, +-5565, -5609, -5789, -6182, -6591, -7160, -7496, -7806, -8130, -8140, -8207, -8328, -8282, -8353, -8494, -8509, +-8848, -9081, -9406, -9677, -9807, -9988, -10054, -10251, -10181, -10128, -10039, -9687, -9566, -9425, -9309, -9323, +-9144, -8985, -8699, -8369, -7861, -7355, -7092, -6838, -6777, -6736, -6633, -6487, -6302, -6149, -5791, -5411, +-5160, -4696, -4441, -4291, -3970, -3690, -3235, -2707, -2080, -1311, -594, 238, 846, 1247, 1700, 2043, +2580, 3106, 3757, 4442, 5148, 5900, 6465, 6935, 7278, 7488, 7764, 7933, 8248, 8412, 8690, 9144, +9480, 9998, 10514, 10914, 11331, 11574, 11695, 11569, 11159, 10680, 9996, 9421, 8849, 8349, 8108, 7940, +7928, 7619, 7139, 6741, 5905, 5213, 4479, 3643, 2878, 2356, 1951, 1464, 1157, 500, -388, -1296, +-2257, -3023, -3987, -4573, -5103, -5770, -6179, -6758, -7124, -7302, -7284, -6987, -6750, -6328, -5917, -5534, +-5088, -4719, -4380, -3854, -3331, -2973, -2509, -2291, -1971, -1865, 73, -110, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -135, -110, +75, 76, 41, 97, -49, -60, -986, 1015, 3637, 5872, 9189, 10751, 15154, 20589, 25915, 29060, +29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 1340, -11730, -22073, +-27946, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, +-27585, -13345, -5213, 2233, 6804, 8869, 11325, 21533, 21927, 18941, 18831, 14324, 17491, 16753, 12560, 1807, +-13494, -25375, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -26948, -26050, -21865, -13860, -2993, +10745, 16908, 20232, 26330, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, 29060, +29060, 29060, 29060, 29060, 29060, 29060, 29060, 27044, 24468, 18831, 13463, 7438, 2536, 1639, -3355, -8072, +-11204, -9061, -14937, -14522, -15377, -16685, -10823, -15580, -14736, -17474, -9290, -10747, -15035, -11218, -3665, -10335, +-6785, -7253, -1386, 207, -6231, -4578, 1916, 6415, -686, -1427, 3472, 7011, -1565, -4741, 702, 3756, +-289, -5608, -1990, 2544, -2634, -2466, -3734, 1932, 4673, -445, 1492, 8193, 8998, 5932, 6102, 9891, +11216, 9813, 10356, 10347, 12083, 11112, 7201, 7569, 8762, 8225, 8308, 6393, 4906, 5292, 5132, 5956, +1633, -3964, -7029, -10388, -14161, -17019, -19884, -23626, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -29321, +-29321, -29321, -27760, -25407, -24659, -18632, -14555, -6336, -2452, -2388, 1469, 6561, 13429, 13138, 13869, 14537, +17453, 17729, 17597, 19754, 15746, 14991, 7810, 4221, 4364, -1161, -6439, -8886, -9516, -15039, -14655, -18951, +-24276, -22619, -21235, -28299, -24369, -23016, -23540, -24943, -21114, -18035, -15817, -15098, -17821, -8016, -3251, -4848, +-4891, 1942, 7825, 3408, 3907, 10347, 13663, 15459, 8838, 14269, 20046, 12568, 13540, 12041, 13803, 13996, +8617, 12192, 11224, 12487, 10629, 7529, 16144, 15141, 12913, 14271, 15319, 20054, 19200, 19947, 19388, 17783, +19117, 20462, 19170, 18705, 16551, 14524, 14856, 15163, 11725, 12984, 12595, 10148, 8052, 9656, 11062, 9399, +10749, 4871, 4259, -2076, -5526, -7793, -8876, -12494, -22354, -23599, -24328, -25650, -28559, -29321, -29321, -29321, +-29321, -28374, -25548, -23659, -24449, -21603, -15168, -6099, -6333, -1123, 1122, 8101, 12312, 15634, 17079, 20251, +20539, 19010, 21619, 25727, 22183, 19141, 18779, 10521, 11234, 5666, 1147, -5062, -4861, -9587, -17418, -17568, +-19785, -22855, -26824, -28814, -27492, -24879, -28362, -28629, -22974, -18579, -20581, -19425, -15157, -9501, -7594, -11240, +-1190, 3735, 1724, 2090, 5111, 11379, 10837, 9873, 13702, 12098, 18738, 15944, 11697, 16634, 13919, 11358, +13971, 13324, 15768, 12240, 10634, 12238, 13369, 15481, 13642, 11350, 13345, 15050, 12516, 15389, 10840, 9929, +9032, 10232, 9414, 7256, 7867, 5880, 4370, 3449, 4879, 5887, 6834, 5067, 5046, 5556, 8418, 6603, +10786, 11048, 8883, 3372, 1540, 840, 1514, -6976, -10124, -15040, -16477, -16790, -21927, -23522, -28696, -29321, +-29321, -28060, -26080, -25616, -28027, -23265, -20845, -12531, -12427, -8129, -1489, -79, 4969, 10821, 15904, 15732, +17765, 19183, 19208, 23195, 25623, 20356, 21488, 19860, 16256, 11065, 7026, 5612, 188, -3761, -11904, -10574, +-12110, -21120, -23527, -25330, -24224, -25539, -29321, -27313, -24371, -24893, -26331, -23265, -14750, -17845, -18088, -11253, +-9536, -3909, -3480, -5492, 1561, 3960, 4494, 4534, 7899, 9892, 10808, 10467, 15495, 13302, 12994, 12366, +13141, 17968, 19122, 15736, 15572, 18545, 20199, 21939, 21225, 21114, 19644, 21529, 23060, 22002, 18861, 17532, +12467, 13510, 13006, 10418, 8474, 4848, 921, 227, 767, -774, 314, -1266, 478, -93, -1513, 1342, +5429, 6005, 7574, 2448, 5369, 4476, 3246, 505, -3680, -5750, -12441, -12390, -12174, -16460, -21774, -28757, +-29321, -26815, -27467, -28503, -28953, -25502, -24757, -22662, -15706, -13834, -10198, -6261, -2449, 2778, 9502, 13036, +12579, 15254, 18851, 19169, 22253, 19437, 22337, 24096, 17914, 15284, 10677, 7790, 3360, -4809, -6913, -9965, +-15989, -23316, -26746, -23213, -29321, -29321, -29321, -29321, -29321, -29321, -29321, -25830, -21258, -19728, -16669, -12465, +-5840, -3558, -1996, 2862, 6116, 7766, 10910, 11963, 13545, 15566, 15323, 17716, 20646, 20462, 17206, 15485, +17547, 20086, 18187, 18522, 15696, 15466, 18310, 18616, 18795, 17835, 16070, 17020, 19126, 18592, 17528, 15868, +11814, 12559, 10467, 11534, 10103, 5061, 3772, 1346, 258, -1499, -1693, 53, -362, -2494, -3734, -2297, +3054, 2641, 3302, 5157, 3647, 4455, 4127, 4484, 2119, -2363, -7849, -9540, -5022, -9311, -17501, -21171, +-24259, -26644, -26351, -26322, -28052, -27834, -26387, -26739, -21650, -18506, -16648, -13430, -11676, -4657, 1479, 3261, +7025, 9502, 14274, 15100, 15543, 18404, 21222, 22605, 20457, 18411, 20512, 15291, 6300, 7071, 4157, -2459, +-8811, -13809, -15671, -18822, -23848, -28845, -29321, -29321, -29321, -29321, -29321, -27451, -26231, -24374, -20439, -17476, +-12893, -9602, -6271, -2068, 564, 3897, 5236, 9870, 11067, 9549, 12074, 15481, 17039, 18687, 16762, 14865, +16350, 17156, 18721, 18799, 15504, 16236, 17108, 18570, 19810, 18043, 18026, 18785, 19219, 20846, 20820, 20198, +16541, 14550, 15432, 14066, 12799, 10455, 8560, 6605, 1650, -617, -153, 1812, -1406, -2336, -3204, -3587, +-1254, -116, 1232, 4364, 3147, 1665, 5007, 9584, 5844, -479, -1172, -4263, -3209, -4076, -9694, -13366, +-18945, -22298, -23925, -25842, -26008, -28318, -29321, -29243, -26141, -22923, -22130, -21034, -16656, -12342, -7440, -3497, +-291, 7038, 9779, 9541, 13444, 18859, 18538, 19369, 21996, 25298, 22376, 19347, 16772, 13717, 12771, 6603, +-919, -4322, -5548, -12055, -16732, -20966, -23870, -27887, -29321, -29321, -29321, -29321, -28127, -28002, -25032, -20910, +-20329, -16042, -10662, -9080, -5634, -2515, 798, 5640, 5776, 6484, 7806, 9587, 14252, 15336, 14821, 13752, +13118, 15275, 16480, 16476, 15492, 13753, 16342, 15800, 17931, 18233, 17815, 16828, 17886, 20279, 21304, 20602, +18029, 17784, 17629, 14089, 13201, 14371, 11808, 9544, 3984, 1932, 1096, 1761, -459, -2357, -859, -4117, +-5821, -611, 1708, 1914, 1212, 1829, 6605, 9718, 9768, 7155, 3922, 2838, 2597, 2036, -34, -4498, +-8447, -15035, -18312, -19025, -21836, -25783, -28395, -29321, -28047, -26105, -28335, -26475, -22734, -19923, -19713, -13983, +-7339, -4193, -2221, 3314, 6502, 9058, 11440, 12442, 16383, 20531, 20417, 17497, 17988, 18678, 15442, 10176, +7169, 2645, -1403, -4634, -10178, -15043, -17224, -24100, -27992, -28713, -29321, -29321, -29321, -29321, -29321, -29016, +-26645, -22401, -19554, -15056, -13820, -9097, -5358, -268, 3029, 3349, 4798, 7253, 11191, 15095, 15809, 14643, +15475, 16920, 18209, 18080, 19278, 17088, 17875, 16883, 19584, 21105, 18691, 17582, 19133, 21072, 21140, 20857, +22128, 21062, 19979, 17555, 14711, 18294, 17266, 12377, 10765, 8508, 4820, 2903, 2580, 3487, -13, -3511, +-4197, -1758, 658, -250, -670, -380, 2767, 6743, 9045, 7548, 7998, 4965, 3968, 4668, 4576, 2303, +-1445, -7327, -11207, -11982, -14719, -20565, -24773, -23627, -26026, -28309, -26997, -24971, -26042, -24781, -22768, -19400, +-15264, -11597, -8751, -4009, 1416, 3573, 3844, 7885, 12615, 13900, 16830, 16958, 17219, 19848, 18169, 14073, +13073, 8594, 5019, 498, -2687, -6452, -12664, -16725, -21806, -25502, -29289, -29321, -29321, -29321, -29321, -29321, +-29321, -28917, -25902, -22775, -21405, -17615, -13295, -8095, -2563, -2206, -773, 2178, 6221, 10407, 12175, 13287, +14682, 14894, 16377, 18505, 20321, 17979, 16732, 19133, 20089, 20457, 20538, 18926, 20612, 21576, 20060, 21736, +24642, 24572, 21280, 20086, 20440, 19668, 18224, 17827, 16457, 13247, 7558, 5931, 6830, 5440, 3128, -1316, +-3398, -1777, -523, -1589, -1968, -2620, -712, 1579, 5314, 7309, 7343, 6441, 4230, 3907, 7115, 7187, +850, -2394, -2839, -7299, -11408, -14093, -17423, -20988, -24359, -25544, -26281, -25454, -25382, -27729, -25205, -21361, +-21177, -17982, -13655, -9830, -4267, -2149, -96, 3549, 7767, 10811, 12020, 14764, 17720, 18251, 19852, 19101, +18234, 15206, 11525, 9356, 5601, 1912, -3195, -6736, -12304, -16356, -21460, -26911, -27821, -29321, -29321, -29321, +-29321, -29321, -28348, -26180, -25325, -24322, -19641, -13853, -9444, -6967, -5604, -1900, 631, 3093, 8375, 10946, +10457, 12012, 14160, 17162, 18731, 17167, 16230, 18398, 19471, 18185, 18001, 20137, 19137, 17054, 16830, 19158, +20949, 20033, 19289, 20116, 17909, 16198, 16313, 16816, 17167, 13698, 9458, 7078, 7641, 7374, 4058, 1263, +-937, -1872, -1124, -230, -2031, -2441, -1501, -1477, 1125, 7179, 8147, 5920, 5317, 7404, 8127, 7020, +7042, 4410, 1046, -243, -5108, -8252, -9343, -15739, -20152, -22165, -23664, -24728, -26534, -27204, -26936, -25696, +-24154, -24386, -20295, -15930, -11828, -9089, -5928, -1493, 1872, 5240, 8008, 11307, 13357, 15794, 18819, 19252, +19786, 19018, 15574, 14698, 11886, 7632, 4260, -14, -3262, -8537, -13732, -19826, -23934, -25259, -27654, -29321, +-29321, -29321, -29321, -28628, -29321, -28555, -24699, -21667, -17047, -12321, -9681, -7697, -5859, -2138, 2865, 6703, +6816, 7551, 11495, 14867, 14925, 15554, 16814, 18454, 17084, 17072, 19925, 20794, 19681, 18481, 19122, 19211, +19976, 20978, 22310, 22730, 21638, 18275, 18526, 20482, 20918, 18093, 15405, 12600, 10577, 11621, 9298, 5113, +2773, 1343, -780, -991, 67, -455, -5436, -4424, -1180, 758, 4360, 4522, 3720, 6173, 6632, 6989, +7728, 8099, 5788, 2395, 1432, -1152, -3429, -7705, -12745, -16192, -18092, -20859, -23888, -25087, -25026, -25362, +-26284, -26863, -24150, -21573, -19391, -14933, -12840, -8912, -5035, -1873, 1702, 4903, 7121, 10052, 12962, 16493, +17876, 18334, 18597, 16849, 16381, 13507, 9370, 6983, 4489, 508, -4387, -12058, -16052, -17508, -21772, -27768, +-29321, -29321, -29321, -29321, -29321, -29321, -29321, -28540, -25200, -18779, -15320, -14381, -13133, -8173, -2742, -234, +735, 4580, 7811, 9481, 10854, 14314, 16163, 15417, 15651, 16513, 18238, 18505, 18769, 18070, 18643, 17963, +16425, 18074, 21350, 21308, 20673, 19279, 17922, 19242, 21029, 21476, 17494, 15469, 16174, 13508, 12588, 12974, +8333, 5020, 3396, 3238, 3582, 2671, -846, -3292, -1873, 206, 1453, 3332, 4422, 4478, 5112, 6249, +7451, 8574, 8089, 5026, 4391, 3401, 2000, -1676, -6886, -8713, -11684, -16645, -19371, -21163, -22661, -23260, +-25490, -26046, -25999, -24464, -22817, -20731, -17354, -14530, -11822, -7604, -4401, -1073, 1756, 3704, 7464, 11145, +13353, 15614, 16528, 17372, 18610, 16441, 12994, 11381, 11893, 8768, 3072, -1830, -5751, -8762, -13006, -18836, +-22966, -26166, -28598, -29321, -28982, -28970, -29321, -29321, -29202, -23425, -21185, -20777, -17521, -13290, -10233, -7735, +-3691, -65, 1615, 3798, 6747, 9617, 13023, 12870, 13258, 15608, 15973, 16200, 17634, 19005, 19027, 17142, +17133, 16677, 17893, 22211, 21558, 18538, 18805, 19810, 20238, 20793, 20797, 18381, 16230, 15386, 14610, 14414, +12395, 7408, 3825, 3890, 3696, 1813, 55, -3294, -4475, -4328, -3696, -1641, 38, 534, 1441, 1590, +4694, 7354, 6382, 5961, 6177, 6472, 5153, 2827, 754, -1911, -5048, -8878, -13863, -15967, -17674, -20525, +-21912, -23937, -25466, -25386, -25461, -23905, -21650, -20366, -17386, -14059, -10436, -6826, -3763, -1691, 1361, 6152, +9050, 10647, 13760, 17387, 19068, 17872, 16330, 16155, 16525, 15242, 10594, 7441, 4122, 191, -4136, -8444, +-12565, -18887, -24587, -25018, -24235, -26383, -29321, -29321, -29321, -28491, -26530, -23908, -21560, -18480, -16136, -13611, +-8705, -5648, -3667, -1730, 1963, 5703, 6647, 9628, 12015, 11901, 13077, 14440, 14231, 16088, 18762, 17962, +14973, 14951, 16523, 18117, 19281, 19068, 17575, 17644, 18519, 18833, 20506, 19904, 16606, 15245, 15556, 15872, +14990, 10547, 7491, 5164, 4394, 3920, 1702, -611, -2335, -4996, -5743, -3928, -1731, -1341, -2094, 309, +2870, 4721, 6329, 6775, 7784, 9647, 8303, 7757, 7370, 5853, 3683, -268, -4125, -7487, -10835, -13816, +-15718, -18135, -21310, -23193, -24075, -24649, -23507, -22954, -22095, -19604, -15579, -12285, -10281, -7141, -3372, 495, +3118, 5406, 9532, 14122, 16800, 17745, 17111, 18916, 19239, 17822, 16630, 14844, 11122, 5998, 2972, 2481, +-3658, -12527, -17417, -20198, -21130, -24891, -28779, -29321, -29321, -29321, -29321, -29321, -26517, -26203, -24519, -19764, +-16414, -13828, -10228, -7170, -5207, -1122, 2284, 4260, 7005, 10836, 11307, 10748, 12387, 14786, 16810, 18118, +15901, 14929, 15617, 16174, 17615, 18324, 18051, 16969, 16195, 17948, 20135, 19659, 18491, 16190, 15923, 17191, +17139, 14917, 11827, 9693, 8224, 5846, 5767, 5439, 1416, -1449, -3261, -3109, -1752, -2072, -2462, -1087, +671, 2226, 3452, 5153, 7004, 8175, 8030, 7977, 8934, 8118, 7303, 5466, 2365, -1363, -4446, -7522, +-10377, -12423, -15182, -19045, -20408, -21273, -21639, -22737, -23468, -21120, -18481, -16455, -14234, -11734, -7627, -4098, +-2755, -14, 3798, 8679, 11490, 13123, 16734, 17476, 16826, 18074, 19632, 19079, 14239, 10726, 10949, 8868, +4848, -2217, -8704, -12060, -15478, -20266, -22755, -25261, -29321, -29321, -29321, -29321, -29321, -29321, -28408, -26942, +-22894, -19353, -18000, -14385, -10638, -8096, -5175, -2578, 1168, 5551, 7213, 7593, 8134, 10873, 14338, 15431, +16018, 15866, 14533, 14797, 16338, 17476, 17987, 16333, 15314, 15777, 17734, 19610, 17547, 15613, 16251, 16016, +15871, 16057, 14589, 12236, 8921, 7102, 7107, 7014, 4260, 703, -1708, -2601, -2976, -4004, -4163, -3238, +-2487, -1846, -354, 2161, 3850, 5370, 7147, 7249, 8182, 9320, 9205, 9096, 7760, 5100, 1849, -1706, +-3447, -5760, -9794, -12996, -15808, -16766, -18649, -21314, -22426, -22308, -20502, -19522, -19208, -15401, -11960, -9877, +-7813, -4827, -766, 1524, 4994, 10233, 13491, 13945, 15452, 17797, 20627, 21274, 17824, 15557, 16464, 15276, +11541, 8061, 3293, -3291, -8081, -10510, -15209, -19224, -22548, -27679, -29321, -29321, -29321, -29321, -29321, -29321, +-26945, -25036, -22738, -19659, -16075, -12652, -11193, -8884, -3875, 127, 3073, 4460, 5355, 7179, 9295, 12468, +14636, 14412, 14267, 13468, 13532, 16370, 17305, 15689, 14130, 14862, 16324, 17546, 17428, 17126, 16540, 15736, +15911, 16953, 17366, 15783, 12227, 10038, 9904, 9758, 7697, 4620, 3073, 875, -1421, -2220, -3044, -3550, +-3191, -3294, -2422, -961, 1010, 3041, 4146, 6121, 7329, 7647, 8933, 10054, 10888, 9538, 6267, 4777, +2494, 432, -3289, -7688, -9740, -11222, -14465, -17992, -19839, -20099, -21109, -22614, -21021, -18661, -17408, -15291, +-11857, -9493, -7357, -5394, -1661, 3864, 7891, 8603, 10301, 15223, 18163, 18393, 19508, 18636, 16842, 18019, +17357, 14624, 11689, 6761, 1284, -2888, -6333, -9926, -15191, -20100, -23610, -26440, -28240, -29321, -29321, -29321, +-29321, -29071, -27844, -25087, -20741, -18958, -17272, -14663, -11597, -7146, -2791, -635, 1132, 2945, 4146, 6790, +10755, 13075, 12534, 11149, 12121, 14687, 15347, 15075, 14036, 13782, 14321, 14919, 16235, 17010, 16460, 15008, +14174, 16174, 18037, 16320, 14429, 12740, 11493, 10749, 9489, 8179, 6093, 3586, 1669, -987, -1892, -2660, +-3731, -4046, -4197, -3126, -1871, -629, 1748, 3852, 4957, 5996, 7015, 9392, 11556, 11500, 9790, 8807, +8576, 6860, 2365, -825, -2013, -5176, -9072, -11532, -13539, -16502, -18897, -20258, -20681, -20251, -19870, -19076, +-15104, -12153, -12917, -10869, -6028, -2592, 862, 4072, 6172, 9591, 13642, 16661, 17970, 18254, 18729, 18545, +18703, 19344, 17240, 13967, 9132, 4781, 1991, -2318, -7270, -12753, -17133, -19953, -24591, -29073, -29321, -29321, +-29321, -29321, -29321, -29321, -26948, -24533, -23052, -21173, -18506, -14793, -11170, -6738, -3140, -2402, -1757, 1188, +5583, 8855, 9383, 9409, 10099, 11601, 13404, 13624, 13937, 14026, 12464, 12775, 14951, 16698, 16321, 14449, +14518, 15451, 16579, 17325, 16361, 15248, 14100, 12870, 11973, 11119, 10033, 8152, 5319, 3246, 1664, -220, +-1845, -2880, -3568, -3809, -4131, -3303, -1339, 893, 2418, 2611, 3762, 7313, 9682, 9619, 10032, 11554, +11537, 9591, 8099, 6111, 3333, 960, -2538, -4989, -6351, -10791, -14579, -14806, -16739, -19925, -20520, -19115, +-17250, -15948, -15126, -13994, -12078, -7961, -4801, -2415, 501, 3435, 7399, 11110, 13934, 16290, 16823, 17247, +18298, 19526, 20421, 18649, 14735, 12088, 10292, 5754, 876, -3432, -7514, -11285, -16443, -21625, -25009, -26951, +-28714, -29321, -29321, -29321, -29321, -28346, -26237, -24211, -23040, -22026, -17859, -12415, -8922, -6896, -6365, -4054, +482, 3495, 5702, 7231, 8565, 9242, 10152, 12730, 14723, 13714, 12537, 12526, 14065, 16031, 16494, 15768, +15167, 15324, 16311, 16956, 17249, 17270, 15974, 14520, 13536, 12958, 12223, 10515, 8428, 6607, 4356, 2276, +330, -1451, -2173, -3204, -5150, -5924, -3480, -1389, -1653, -1037, 1478, 3188, 5139, 6676, 7810, 10187, +11114, 9795, 10437, 10379, 7148, 4148, 2903, 1197, -2808, -5915, -8003, -10713, -13240, -16594, -19289, -19691, +-18913, -17794, -17399, -16983, -15411, -13035, -10485, -7521, -4888, -2390, 1113, 4434, 8437, 12404, 14067, 14816, +16396, 18356, 19740, 19699, 19068, 17664, 15293, 12629, 8898, 4663, 1239, -2929, -7834, -12767, -17259, -20870, +-24922, -27463, -29078, -29321, -29321, -29321, -29022, -27474, -26543, -25707, -23659, -20472, -16223, -12623, -9971, -7568, +-6103, -3507, 668, 3661, 5517, 6488, 7898, 9480, 10964, 12798, 13664, 12801, 12464, 13000, 14316, 15750, +15957, 15452, 15055, 15375, 16467, 17119, 17162, 17002, 15861, 14626, 13802, 13164, 12179, 10613, 8730, 6562, +4217, 2509, 642, -1357, -2301, -3385, -4956, -5516, -3465, -1542, -1564, -877, 1447, 3201, 5240, 6705, +7822, 10196, 11130, 9837, 10434, 10365, 7148, 4165, 2906, 1300, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2856, -2929, -2999, -3059, -3130, +-3219, -3275, -3347, -3415, -3496, -3561, -3623, -3696, -3759, -3831, -3896, -3970, -4034, -4097, -4167, -4232, +-4297, -4359, -4432, -4499, -4567, -4628, -4698, -4761, -4822, -4888, -4950, -5020, -5085, -5150, -5213, -5287, +-5355, -5413, -5474, -5537, -5597, -5664, -5725, -5788, -5848, -5917, -5980, -6038, -6099, -6155, -6237, -6290, +-6348, -6412, -6483, -6538, -6604, -6654, -6717, -6779, -6838, -6899, -6959, -7013, -7098, -7158, -7216, -7274, +-7328, -7391, -7447, -7504, -7558, -7619, -7677, -7723, -7787, -7839, -7900, -7955, -8021, -8072, -8128, -8176, +-8234, -8295, -8344, -8401, -8452, -8509, -8563, -8612, -8669, -8723, -8787, -8834, -8879, -8945, -9003, -9053, +-9111, -9155, -9215, -9274, -9325, -9377, -9427, -9480, -9538, -9585, -9637, -9693, -9756, -9805, -9850, -9906, +-9963, -10020, -10068, -10109, -10168, -10217, -10265, -10322, -10369, -10417, -10473, -10522, -10579, -10618, -10667, -10721, +-10764, -10818, -10866, -10910, -10958, -11014, -11060, -11098, -11142, -11190, -11244, -11288, -11331, -11382, -11422, -11472, +-11515, -11557, -11603, -11649, -11700, -11742, -11787, -11831, -11875, -11922, -11957, -12005, -12052, -12092, -12133, -12175, +-12224, -12262, -12306, -12349, -12400, -12441, -12482, -12531, -12568, -12619, -12657, -12693, -12744, -12795, -12838, -12878, +-12921, -12944, -12992, -13022, -13076, -13109, -13145, -13200, -13246, -13293, -13279, -13466, -12689, -13239, -9858, 7113, +23695, 31150, 29981, 24638, 19730, 17596, 17995, 19451, 20617, 21004, 20665, 20071, 19536, 19130, 18877, 18785, +18741, 18639, 18474, 18266, 18043, 17850, 17660, 17499, 17336, 17173, 17003, 16841, 16671, 16509, 16347, 16196, +16032, 15877, 15731, 15575, 15412, 15273, 15130, 14977, 14843, 14693, 14565, 14413, 14281, 14151, 14010, 13870, +13734, 13604, 13477, 13350, 13224, 13095, 12969, 12851, 12723, 12605, 12478, 12350, 12235, 12110, 12004, 11878, +11763, 11642, 11530, 11411, 11301, 11185, 11073, 10963, 10842, 10739, 10616, 10517, 10399, 10291, 10177, 10066, +9964, 9861, 9745, 9634, 9533, 9430, 9328, 9221, 9110, 9004, 8893, 8796, 8693, 8600, 8491, 8391, +8294, 8189, 8091, 7986, 7894, 7788, 7694, 7598, 7506, 7414, 7317, 7213, 7118, 7021, 6919, 6823, +6721, 6633, 6536, 6440, 6343, 6255, 6164, 6066, 5980, 5888, 5796, 5693, 5607, 5497, 5405, 5310, +5223, 5131, 5033, 4947, 4850, 4767, 4670, 4583, 4491, 4404, 4321, 4233, 4132, 4031, 3958, 3865, +3781, 3695, 3619, 3540, 3450, 3362, 3284, 3200, 3124, 3047, 2978, 2905, 2817, 2737, 2659, 2581, +2504, 2427, 2359, 2279, 2199, 2130, 2065, 1979, 1901, 1828, 1752, 1681, 1602, 1528, 1452, 1374, +1297, 1227, 1146, 1069, 990, 919, 846, 759, 672, 598, 521, 447, 361, 282, 201, 119, +39, -37, -124, -207, -293, -381, -461, -540, -623, -708, -788, -870, -953, -1033, -1118, -1188, +-1269, -1348, -1432, -1503, -1574, -1653, -1726, -1801, -1876, -1950, -2015, -2082, -2172, -2243, -2301, -2378, +-2442, -2504, -2575, -2637, -2705, -2776, -2842, -2912, -2986, -3049, -3123, -3214, -3275, -3342, -3403, -3578, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 27772, 27772, 27772, 22685, 18225, 17486, 16651, 11465, 3019, -1607, -2279, -7950, -17857, -25613, -30320, +-30609, -30609, -30609, -29196, -25718, -21455, -16413, -13518, -12015, -10187, -7345, -5185, -3870, -945, 1964, 1401, +-112, 802, 3050, 2779, -23, -1007, 1286, 3113, 1881, -1060, -1443, 2598, 6661, 6096, 1392, -945, +3111, 8071, 5862, -818, -4180, 205, 4943, 827, -9620, -15044, -10207, -3430, -4296, -12032, -16970, -13104, +-5831, -5171, -9733, -11553, -7551, -2450, -2204, -6784, -8987, -4340, 3166, 5477, 924, -4003, -5108, -1760, +3080, 4303, 822, -3059, -6762, -10241, -11780, -10308, -6506, -2614, -490, -1262, -4497, -7102, -7139, -5537, +-3808, -3589, -4577, -4625, -3385, -129, 5326, 10717, 13571, 14058, 13487, 14221, 17417, 22670, 27772, 27772, +27772, 27772, 27772, 25270, 19306, 17180, 16651, 11416, 3716, 388, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 1005, 2190, -2713, -3418, +-817, 2313, 6358, -11052, -1967, 11408, -22629, 4733, 24019, -15805, 20390, 27948, -11918, 18556, 15164, -17153, +11354, 2212, -23426, 7912, -5975, -17501, 11516, -11331, -18196, -1403, -4063, -5294, -5897, -713, -10682, -5053, +-8209, -4051, 15285, 999, 14492, 25590, 7845, 10471, 13012, 2174, 7968, 3977, -4392, 2163, 3951, -2560, +8024, -2631, -13804, -3729, 3986, -544, -18229, 2750, -12585, -23705, -8128, -742, -6069, 2980, 20818, 13293, +17210, 15517, 10026, 9027, 16778, -3287, -8207, 1093, -10582, -7068, 7467, -13348, -16807, -3612, -5447, -7415, +-16299, -9858, -25698, -20914, -13879, -2909, -149, 2876, 22328, 20444, 16448, 19041, 15440, 14150, 26550, 4839, +6351, 20886, 2440, 12556, 26412, -4293, -4171, 3243, -1921, -8185, -11247, -14327, -31567, -27225, -25874, -18237, +-16242, -9671, 3376, 6012, 4148, 8635, 6341, 9338, 18357, -645, 4312, 14762, 248, 11838, 19522, -5615, +-4903, 3138, -143, -6630, -2401, -7031, -15820, -16465, -9793, -2093, -2677, 6395, 15016, 14860, 10001, 12531, +6205, 9484, 10978, -8357, -485, 2857, -10495, 10434, 6880, -10409, -6433, -3549, -6095, -13348, -9081, -15268, +-18913, -21012, -13181, -5961, -4001, 6565, 13188, 8500, 10312, 10600, 3028, 14822, 14016, -480, 13832, 16144, +3666, 28470, 19402, 805, 2817, 5950, -7603, -12485, -9970, -19431, -20149, -26532, -13667, -11491, -8767, 5014, +10417, 5606, 10123, 6882, -873, 14475, 4482, -5857, 13995, 4447, 3511, 29000, 9502, 1850, 1898, 1931, +-8037, -14321, -14359, -19964, -24029, -27531, -12602, -14012, -10803, 3869, 6971, 4152, 10394, 4765, 1574, 15435, +4274, -2225, 15706, 4917, 12198, 31636, 17808, 12503, 12900, 12265, -225, -3337, -10359, -17381, -25179, -28315, +-15355, -19204, -15883, 226, -1430, -4839, 4570, -4301, -5547, 13910, -5045, -6231, 18446, -4417, 15450, 30730, +12773, 14434, 16950, 12384, 4284, 4534, -5595, -7849, -17667, -16391, -7893, -14395, -6997, 4652, -737, 894, +1203, -8529, -4232, 6298, -11060, -8015, 8377, -7719, 14158, 22388, 11063, 10321, 14892, 12242, 5775, 6323, +-3335, -6983, -18098, -16599, -14216, -20226, -11608, -4137, -8743, -3603, -5561, -15071, -3869, 4369, -17434, 512, +5371, -5856, 24499, 21762, 14752, 17270, 18212, 14012, 13542, 9182, 3937, 1592, -13309, -8226, -7199, -16145, +-3432, -606, -6545, -587, -6619, -14433, -2359, -151, -21612, -577, -6933, -11223, 16870, 10628, 8476, 11108, +11204, 8568, 9882, 3467, 5432, 260, -12449, -2977, -4184, -9419, 5650, 4366, 16, 7220, -2957, -12009, +5844, -2631, -18554, 3972, -11555, -8983, 13924, 6420, 3760, 9753, 6137, 3665, 6109, -1829, 2977, -5483, +-15325, -5221, -7706, -9097, 4864, 1723, 3599, 9038, -2083, -6966, 10433, -5267, -10539, 6058, -12888, -2361, +13321, 5313, 3928, 9236, 1741, 4622, 2159, -2895, 4025, -11847, -17041, -5935, -13004, -10243, 3941, -2151, +5106, 10821, -2516, -423, 12619, -6722, -1277, 4679, -11215, 3103, 14434, 9068, 10631, 15970, 5483, 12027, +5371, 2422, 7148, -11246, -14819, -7107, -17216, -13633, -2085, -11685, -2216, 2847, -14097, -2955, 4870, -12867, +869, -201, -11002, 5688, 13690, 6545, 14080, 14622, 7601, 15888, 3767, 8640, 9532, -11345, -7307, -2849, +-15659, -5185, -35, -10963, 3089, 2338, -17247, 1898, -419, -15428, 1073, -7099, -14291, 3004, 9182, -1130, +11424, 7267, 5062, 12340, 774, 10583, 7788, -10422, -4131, -1663, -12969, 10, 2082, -6245, 9260, 2558, +-12667, 7757, -2778, -9163, 2936, -9398, -10296, 5252, 7420, -263, 12446, 4185, 7686, 9477, -54, 12296, +4146, -11331, -2601, -5649, -13889, 1112, -912, -6527, 12232, -1849, -10565, 9848, -6155, -6011, 1461, -11423, +-10825, 6546, 4114, -531, 11554, 1493, 8014, 5319, -1039, 10888, -255, -11996, -1910, -9131, -12104, 4012, +-2085, -2880, 17172, -5239, -3707, 13232, -7351, 1257, 2476, -11918, -6933, 8884, -485, 3594, 9081, -1485, +10205, 100, -2419, 9749, -6237, -12967, -3806, -15321, -13426, 2381, -8251, -1130, 16276, -10175, 3062, 11368, +-6864, 5824, 1587, -10437, -3108, 11272, 1969, 9551, 9358, 4161, 15242, 22, 2844, 10508, -9819, -9060, +-5139, -17985, -10907, 1629, -11855, 3463, 13539, -12943, 7694, 7214, -6531, 6885, -1025, -13759, -665, 8417, +-981, 9967, 4182, 4574, 14758, -1351, 5006, 9434, -11911, -8721, -7167, -20427, -10907, 486, -14875, 7990, +8639, -13746, 11558, 2582, -4119, 6995, -4161, -14279, 1731, 7273, 1680, 11574, 3443, 9436, 14346, -500, +11618, 8121, -9931, -3067, -8260, -20917, -7655, -4290, -15859, 11149, 914, -11893, 11697, -763, -1737, 6763, +-6244, -13593, 2949, 4878, 3458, 9926, 1830, 11718, 10206, -1989, 12510, 2800, -10287, -2901, -10691, -21955, +-4215, -8270, -12473, 16188, -3731, -4654, 14485, 186, 4234, 11561, -5948, -8351, 7138, 3831, 7533, 9392, +2190, 14670, 7992, -609, 13566, -985, -11039, -4615, -17158, -25557, -6139, -18791, -12611, 11254, -13529, -3277, +7880, -4439, 4744, 9623, -8801, -4801, 8204, 5064, 12774, 8333, 6716, 19596, 7030, 6024, 16143, 2, +-6977, -1645, -18887, -22325, -5027, -23017, -8277, 7056, -16363, -1611, 3885, -6627, 6089, 7240, -11264, -2315, +7122, 6274, 14870, 6624, 10516, 20702, 4489, 10622, 16075, -293, -3435, -631, -21901, -16625, -6241, -25333, +-3047, 1548, -16368, -1021, 462, -7303, 6880, 2742, -12817, -970, 3886, 8408, 14510, 5911, 16382, 19501, +5523, 14941, 16396, 112, -255, -553, -24329, -11346, -10467, -26003, 516, -5435, -17449, -1295, -3765, -8553, +7764, -2217, -14485, 284, 212, 9260, 12828, 3943, 20240, 15691, 6293, 17022, 14118, -810, 3787, -2579, +-23478, -5145, -13431, -20965, 4165, -7499, -14764, 873, -6252, -6509, 8533, -7075, -12035, -1763, -2209, 11789, +7540, 3773, 21783, 11436, 7670, 18178, 13022, -1625, 8048, -6045, -20587, -899, -16709, -13449, 4902, -7481, +-10365, 2998, -6024, -3001, 9852, -10403, -9329, -3163, -2857, 12788, 2207, 5126, 20274, 7499, 8213, 18334, +8299, -1771, 9590, -13099, -18435, -2237, -21979, -11025, 2579, -11569, -8808, 2615, -7999, 1755, 9623, -11075, +-5373, -5421, 574, 14184, -835, 10486, 19034, 7593, 11482, 20556, 5718, 2797, 9308, -17587, -11833, -6871, +-22790, -7989, -1319, -12985, -7924, -1059, -9524, 3522, 5906, -10657, -4662, -7751, 4247, 11850, -1957, 13624, +15667, 6643, 13671, 21768, 3958, 8823, 9272, -18346, -4831, -8561, -22339, -5227, -3123, -15053, -5560, -2737, +-10427, 6992, 2595, -9002, -2860, -9555, 8854, 9582, -1159, 16802, 15044, 5620, 17022, 20137, 2285, 13406, +3389, -17890, -2099, -13323, -20981, -3355, -7175, -14938, -4385, -6721, -9663, 7079, -1819, -7992, -6043, -11792, +9433, 2634, -1277, 15940, 11928, 3631, 19372, 16947, 2514, 17500, -595, -13003, -303, -14835, -15659, -713, +-7783, -10939, -1828, -7127, -4828, 7921, -2070, -3051, -7395, -7871, 12786, -645, 2364, 18208, 8499, 4305, +21960, 11162, 3726, 17049, -7013, -11608, -3437, -19099, -15277, -3248, -11458, -11571, -2803, -10650, -3275, 5984, +-3775, -1739, -11009, -3219, 11528, -1721, 6579, 19608, 7568, 9477, 25176, 9256, 11074, 17336, -7467, -5289, +-4581, -19073, -10259, -4536, -11145, -7759, -3105, -10716, -228, 2750, -4620, -2503, -17107, -1873, 6433, -6765, +6140, 16638, 2145, 10863, 22788, 4403, 13938, 13154, -9581, -3117, -6344, -19325, -8449, -5509, -12101, -5165, +-3937, -9805, 3716, 2290, -476, -1654, -14783, 3860, 6614, -5421, 10690, 16562, 268, 16290, 20781, 4121, +19201, 9818, -8503, 469, -9884, -18036, -6331, -8118, -12051, -3987, -7858, -8209, 4019, -2255, 2231, -7233, +-15990, 4523, 476, -8341, 11775, 11152, -2015, 19460, 14649, 4816, 21261, 5664, -6143, 2586, -12245, -15107, +-2860, -8333, -9105, -875, -7771, -2993, 5728, -204, 6617, -8163, -11259, 7573, -385, -6759, 14078, 6290, +-2046, 20384, 8033, 5813, 18716, -347, -5285, -1349, -17551, -15267, -5547, -12715, -7729, -3371, -10679, 798, +2115, 2241, 8217, -10539, -6193, 10806, -1513, -2589, 17829, 2497, 2324, 22177, 4723, 10280, 19044, -2199, +-947, -1535, -17175, -12553, -5817, -13285, -5519, -4106, -10947, 3113, -995, 5047, 5837, -13045, -4171, 9575, +-4923, -565, 17446, -2366, 5759, 19361, 1567, 12415, 15037, -4879, 343, -4611, -18849, -10453, -8013, -13329, +-2802, -6331, -7989, 4693, -1631, 9746, 4911, -12175, 1084, 11150, -5103, 6759, 18440, -3815, 12916, 17228, +812, 17108, 10703, -5825, 1816, -8981, -21125, -10049, -14021, -15751, -3595, -13937, -7328, 514, -4135, 11068, +36, -13735, 4097, 7825, -7191, 12660, 14655, -2778, 18288, 14892, 4730, 21668, 9114, -994, 5222, -9118, +-16987, -7885, -14022, -11397, -2933, -14785, -3013, -2531, -1944, 11582, -3647, -13009, 5683, 3849, -8161, 16773, +8632, -1865, 20520, 9058, 6239, 21222, 4101, -156, 5474, -12997, -16115, -7439, -17753, -9330, -5347, -16903, +-677, -5667, -841, 12309, -6504, -11171, 9327, 26, -5479, 20481, 4424, 2385, 22154, 6712, 11230, 21156, +3743, 3828, 6007, -13843, -13167, -6974, -18863, -6341, -8903, -15234, -946, -8033, 981, 9375, -9897, -10457, +9066, -5659, -3089, 19604, -1019, 5623, 20679, 2831, 14520, 18918, 1557, 6906, 3958, -15263, -10181, -9034, +-19547, -3699, -13415, -11951, 480, -8335, 6835, 10748, -10280, -3775, 11557, -6957, 4863, 18912, -1925, 11332, +18033, 3243, 17462, 15664, 836, 8193, 309, -16987, -9684, -14035, -19432, -5843, -18709, -11826, -4205, -10367, +7825, 6899, -13013, -115, 8306, -9075, 10308, 15882, -2073, 16312, 15085, 5765, 22599, 14182, 4172, 13205, +-160, -14347, -5311, -16877, -15527, -6809, -21171, -9819, -7647, -11201, 8878, 3395, -15381, 3589, 3229, -10871, +13032, 10434, -2151, 17257, 11092, 7434, 23682, 11592, 6909, 14495, -1891, -11275, -4402, -18360, -10849, -8547, +-20197, -6861, -10083, -9278, 11218, -357, -14485, 7110, -1829, -9395, 15534, 5357, 236, 17966, 7553, 10298, +23794, 8895, 9497, 15316, -3875, -7065, -5161, -18253, -7215, -11424, -18598, -5822, -12857, -7756, 11993, -6535, +-12347, 7948, -7957, -7063, 14888, 44, 2044, 16586, 4088, 12562, 21755, 6995, 11179, 14410, -5111, -3621, +-6579, -15877, -4191, -12442, -14352, -3957, -12499, -2815, 13958, -9613, -6961, 8276, -11526, -2189, 12838, -3559, +4877, 13530, 1009, 14686, 18054, 4308, 12299, 10084, -7541, -3021, -10479, -14785, -4927, -14953, -11913, -4324, +-13658, 1917, 13202, -11491, -861, 7672, -12353, 3546, 12188, -2891, 9739, 12769, 2742, 18401, 17029, 5470, +15876, 7128, -6687, -3006, -13755, -13784, -7727, -17076, -12505, -8059, -16725, 4026, 7883, -13813, 2663, 2854, +-12781, 7117, 8795, -2071, 12940, 10040, 5135, 20860, 15334, 7907, 18813, 4995, -2925, -2797, -14547, -10491, +-9797, -16746, -10425, -9943, -16583, 7594, 3254, -14206, 5596, -2686, -12209, 8217, 4370, -1499, 12882, 6715, +6535, 21458, 12483, 10713, 19464, 3443, 1104, -3001, -13579, -7519, -10501, -15645, -7824, -12267, -14147, 10588, +-1552, -11983, 7563, -7563, -10139, 8276, -241, -381, 11009, 3273, 7413, 20519, 9507, 13496, 17856, 3337, +3879, -4883, -10658, -5915, -11055, -13565, -5825, -14025, -9540, 12958, -5169, -7279, 8208, -10617, -6541, 7786, +-3020, 1084, 8483, 52, 7448, 17257, 5425, 13794, 13549, 2054, 3559, -7591, -8563, -5386, -11495, -10262, +-4301, -15373, -3313, 14524, -7139, -325, 8024, -11188, -1195, 6672, -3045, 3894, 6866, -786, 9400, 13754, +4584, 14097, 9032, 2387, 482, -10445, -8661, -8380, -13323, -8816, -7229, -16675, 1195, 12062, -7239, 4547, +6371, -9380, 3188, 5436, -665, 6763, 5954, 207, 12217, 11146, 5969, 14778, 6338, 4124, -1406, -11389, +-8205, -9569, -15003, -6643, -9425, -18319, 5966, 7975, -7923, 8217, 2784, -8787, 5582, 3369, 68, 8316, +4117, 1354, 13617, 9010, 8816, 13821, 5514, 6041, -4383, -11012, -7473, -13019, -14890, -6035, -14192, -17777, +8242, 2824, -6605, 9798, -937, -6118, 6998, 2619, 3148, 10690, 3130, 5494, 15095, 8060, 12745, 13433, +6468, 6978, -4885, -10297, -7015, -14836, -14017, -6630, -19031, -16242, 7693, -2153, -5200, 8575, -4665, -4848, +5320, 352, 3546, 9478, 1291, 7676, 13763, 8552, 14980, 12149, 9711, 7951, -4916, -6797, -5441, -15203, +-9991, -5643, -21617, -11839, 7727, -4799, -2091, 7118, -6326, -2652, 3783, -728, 5285, 7045, 91, 9092, +10788, 8350, 14679, 9998, 9871, 6733, -6942, -5714, -6967, -16697, -7480, -7761, -23532, -7647, 6502, -5973, +1660, 5915, -6302, -357, 3283, -893, 8257, 5105, 1145, 10986, 8785, 11074, 13598, 9541, 11424, 5295, +-7984, -3719, -8465, -17539, -3943, -11303, -24690, -3497, 3062, -6622, 4268, 3448, -5141, 1175, 1792, 398, +9139, 2602, 2969, 10672, 7056, 12715, 11863, 9320, 12381, 2891, -8123, -2979, -11697, -17317, -2667, -15629, +-23545, -811, 458, -5023, 6259, 2902, -3355, 3454, 1026, 3109, 10200, 1632, 6542, 9834, 7995, 14332, +10714, 9974, 12915, 248, -7701, -2599, -16051, -17076, -2863, -21529, -23147, -869, -4605, -4276, 5014, 204, +-2523, 3287, -537, 6100, 9524, 1408, 10036, 8152, 10506, 16812, 10894, 13065, 15446, 366, -3525, -599, +-17478, -12602, -2807, -25063, -20327, -2027, -8152, -3765, 2775, -3040, -3030, 740, -3319, 6709, 6236, 1189, +9868, 5697, 12190, 16181, 10199, 15759, 15697, 163, 690, -79, -17982, -6953, -3527, -26671, -15641, -3275, +-8641, -1975, 1684, -4185, -1335, -1503, -4339, 7796, 2231, 2528, 8456, 3590, 13181, 14370, 8680, 17146, +14204, -704, 3971, -1393, -17515, -2047, -5415, -26265, -11390, -4413, -7123, -655, 981, -4243, -704, -4058, +-3793, 7066, -1149, 4030, 5180, 2677, 14032, 11155, 7900, 18074, 11006, -1475, 6692, -4331, -16507, 2442, +-8421, -24559, -7577, -5428, -5231, 2177, 753, -2299, 1864, -5203, -156, 7248, -2051, 6260, 3426, 2337, +14642, 8319, 7428, 17776, 6698, -2479, 6293, -9679, -16489, 3240, -13610, -22562, -7191, -6670, -3653, 2967, +352, -183, 2387, -5907, 3569, 5714, -1, 8571, 2319, 5170, 16280, 6880, 10175, 18707, 4074, 254, +6675, -13443, -14233, 2775, -18611, -21271, -8423, -9305, -3991, 1897, -1669, 1301, 860, -6731, 5911, 3358, +1438, 9191, 1136, 7457, 16494, 6124, 13174, 19007, 2716, 3862, 6583, -15903, -9650, 1435, -20871, -18781, +-9353, -9727, -2809, 730, -2519, 3076, -2631, -6099, 6212, 246, 2912, 8092, -1023, 9814, 15248, 4432, +16368, 18122, 1563, 8636, 5824, -16779, -2939, -129, -21189, -15793, -9884, -10201, -1654, -1048, -3239, 4138, +-6945, -4631, 4684, -2697, 3787, 5218, -2623, 10842, 12340, 3668, 18234, 15306, 1539, 11782, 3209, -15571, +1625, -1838, -19291, -13157, -9329, -8270, 296, -1338, -233, 4938, -8210, -1499, 3042, -3581, 4863, 1471, +-4015, 10788, 7785, 2371, 18174, 10298, 564, 13234, -2274, -14066, 4161, -4470, -17645, -10811, -9271, -6043, +2818, -1773, 4321, 4758, -7034, 2844, 2430, -1634, 7316, -238, -2663, 11990, 4161, 2974, 17602, 5326, +937, 12149, -8869, -13021, 2630, -8445, -17716, -11372, -11067, -5085, 2833, -2909, 7549, 3079, -5363, 5726, +2007, 1699, 9885, -815, 951, 14150, 2739, 6676, 18440, 2586, 4455, 11438, -12681, -10595, 1026, -11836, +-17590, -12531, -13549, -3827, -129, -3615, 8697, -827, -4213, 5649, 125, 3580, 9546, -2353, 3832, 14277, +1102, 10536, 18324, 430, 9498, 9745, -13513, -7218, -157, -12742, -16821, -13109, -14665, -2285, -2822, -2059, +8871, -3437, -2187, 5081, -831, 5988, 8732, -2788, 7472, 12934, 1098, 14547, 16331, -456, 13525, 6501, +-13973, -4730, -1791, -14043, -15835, -15219, -15577, -1581, -6659, -587, 7134, -6109, -733, 3062, -1668, 7384, +6580, -3371, 10018, 10811, 1384, 18130, 13472, 1748, 16858, 4036, -11475, -2560, -1881, -12768, -13886, -16037, +-12650, -1120, -7929, 2865, 5566, -6932, 744, 537, -2201, 7829, 2964, -3709, 10546, 6845, 1098, 19406, +8316, 3120, 17560, 551, -10269, -1563, -3023, -12861, -12723, -17551, -9977, -2275, -7971, 5752, 4137, -5917, +3151, 44, -265, 10162, 923, -1363, 12634, 4376, 3927, 20520, 4509, 6080, 16906, -2585, -9377, -1573, +-5265, -12881, -13377, -18979, -7783, -5071, -7317, 7181, 1059, -4869, 3134, -1705, 1690, 9991, -1297, 710, +12681, 1523, 7878, 19600, 2314, 10076, 15605, -3786, -7763, -994, -6877, -11757, -14955, -19275, -6279, -7677, +-5386, 7854, -902, -3065, 3099, -2281, 4457, 9589, -1927, 3928, 12706, 112, 12226, 17556, 1471, 13368, +13392, -4831, -6807, -1620, -8649, -11321, -17822, -19055, -6997, -11217, -3869, 6385, -3421, -1925, 1618, -3395, +6671, 7951, -2645, 7390, 10900, 306, 16879, 15309, 3507, 17186, 12402, -3779, -3593, -1263, -7425, -9429, +-19490, -16411, -7511, -13235, -1847, 3807, -5612, -1651, -1411, -4835, 6811, 4966, -4141, 9068, 7383, 595, +18748, 11680, 4883, 18510, 11200, -3639, -1419, -1511, -6047, -8845, -19611, -13749, -8294, -12413, 482, 2629, +-5158, -15, -3331, -3627, 7597, 1922, -3193, 10199, 3229, 2600, 18916, 7962, 6709, 18548, 9130, -3142, +-37, -2563, -3922, -9579, -19480, -11206, -9970, -11025, 1834, 870, -4863, 372, -5141, -2887, 7570, -1225, +-2037, 9652, -112, 4843, 17144, 5946, 8193, 17907, 7442, -2449, 279, -2492, -1799, -10687, -17509, -8585, +-10865, -7727, 3913, 262, -1791, 1298, -5914, -219, 7819, -3949, 965, 8217, -3568, 7234, 14350, 3153, +8469, 16066, 3594, -2759, -1713, -4061, -2203, -13823, -16743, -8897, -12397, -5519, 4321, -83, 1083, 1737, +-4993, 3444, 7890, -3719, 5439, 7336, -2637, 10883, 13399, 4112, 10506, 15974, 2721, -1579, -3135, -3981, +-3079, -16663, -15927, -11151, -14621, -5465, 1908, -1995, 802, -572, -6193, 5169, 5058, -4243, 8324, 4437, +-1403, 13229, 12303, 4829, 13158, 15958, 3201, 733, -2931, -1519, -3143, -16851, -13323, -12141, -14387, -3432, +456, -1765, 1537, -2353, -5885, 6376, 1713, -3729, 8718, 749, -75, 12848, 10254, 4917, 13937, 14118, +3623, 657, -3447, 700, -4982, -16126, -11710, -13838, -13290, -2125, -1215, -1001, 2116, -4848, -4549, 7258, +-2217, -1489, 8475, -2471, 1718, 12436, 8530, 5591, 15166, 12667, 4717, 544, -2667, 3222, -6275, -13687, +-10149, -14649, -10651, -1329, -1533, 420, 2320, -6321, -2114, 6808, -5097, 1121, 6123, -4504, 2466, 10730, +5620, 4776, 14070, 9794, 3928, -1651, -2823, 3099, -8575, -12001, -9650, -15265, -7733, -307, -423, 3491, +3434, -5740, 2566, 6668, -4885, 5432, 4608, -3901, 4462, 10403, 4156, 5561, 13079, 7911, 3348, -4453, +-2492, 1111, -11529, -11709, -12033, -16964, -7601, -1891, -1430, 4070, 2164, -6051, 5649, 4966, -3647, 8610, +3392, -2240, 6919, 10577, 4650, 7785, 13142, 8336, 3478, -5475, -617, -549, -12755, -10341, -14553, -17393, +-6971, -3684, -1721, 4989, -551, -5233, 7816, 1534, -1373, 9623, 1592, -830, 8251, 9678, 5221, 9430, +12478, 9566, 2775, -5599, 1693, -2509, -12687, -9271, -17113, -17134, -7235, -5623, -1947, 4631, -3735, -4242, +7985, -1703, 1019, 8926, 251, 758, 9240, 9269, 6705, 10879, 12682, 11877, 2125, -3723, 3822, -4116, +-10577, -8561, -18339, -15893, -6993, -7116, -1005, 4287, -7005, -2361, 6488, -4515, 2446, 7176, -1595, 859, +8680, 7703, 6623, 10481, 12126, 12364, 356, -2125, 5010, -5638, -7958, -8101, -18315, -14017, -6377, -7165, +1301, 3977, -7924, 1330, 4757, -4597, 4305, 5925, -1998, 1952, 8305, 6783, 7012, 9017, 12600, 11424, +-1893, -351, 3563, -7753, -6483, -9993, -19295, -12888, -7467, -7934, 3254, 2075, -8481, 4455, 2833, -3845, +6143, 5197, -1625, 3529, 9022, 7134, 8295, 8945, 14117, 10495, -2860, 2140, 2017, -8135, -5271, -11587, +-19783, -11927, -9227, -8125, 5009, -1595, -7693, 5736, -122, -2683, 6701, 3056, -1484, 3964, 7815, 7700, +8135, 8809, 15973, 8829, -2793, 4626, 163, -7528, -4015, -12762, -19235, -10493, -10968, -7061, 6614, -4712, +-5428, 6205, -1621, -1669, 7359, 2432, -1377, 5241, 7103, 8499, 7505, 9450, 17219, 6197, -1859, 5609, +-2070, -6749, -3885, -14573, -18748, -10251, -13450, -5468, 6042, -8152, -2948, 5237, -3500, 142, 6988, 933, +-401, 5796, 6307, 9868, 7008, 10855, 18966, 4830, 1102, 7036, -2847, -4515, -2899, -15711, -16763, -9891, +-15539, -2277, 4137, -10081, -1159, 3202, -5124, 362, 5749, -1195, -657, 4573, 5626, 9477, 5013, 11955, +18126, 2629, 3473, 6545, -3161, -2449, -2793, -15820, -14485, -10033, -15761, 1471, 1945, -9269, 1710, 1563, +-4567, 2422, 5306, -1879, 764, 3361, 6018, 9308, 3148, 13614, 16150, 572, 5197, 4951, -4235, -1227, +-4039, -16654, -12163, -11933, -15568, 4046, -834, -8443, 3245, -89, -4437, 3226, 4364, -2383, 958, 2735, +6879, 8139, 2786, 15774, 13450, 773, 6726, 3501, -3660, 118, -4839, -16004, -9661, -14114, -12789, 5523, +-3153, -5961, 4078, -1365, -3292, 4544, 2681, -1859, 1084, 1244, 7819, 6260, 2082, 17104, 9998, 428, +6909, 1084, -4243, 26, -7341, -16017, -8703, -17265, -10068, 5704, -5114, -3442, 4448, -1341, -1621, 6158, +2701, -147, 1428, 2092, 9821, 4438, 4295, 18435, 7604, 2010, 7522, -262, -3767, 488, -9769, -14805, +-9697, -19785, -7601, 3859, -7231, -2285, 3144, -2841, -831, 5650, 1393, 530, 537, 2456, 10788, 2344, +6972, 18616, 6105, 4104, 7829, -895, -2565, 1322, -11579, -12025, -10868, -20541, -4389, 2329, -7475, -739, +2752, -3503, 404, 5238, 856, 991, -463, 3439, 10098, 302, 9372, 17122, 4611, 5838, 7248, -1569, +-881, 760, -12543, -9577, -13225, -20269, -2197, -187, -7383, 270, 1520, -4031, 1251, 4107, 444, 894, +-1794, 4796, 8494, -501, 11384, 15556, 4204, 7131, 7124, -1705, 1684, -233, -11535, -7058, -14972, -18047, +-11, -1487, -6331, 1975, 606, -3539, 2295, 2868, 710, 425, -3115, 6205, 5479, -1144, 12534, 12429, +3128, 6875, 4969, -3166, 2630, -3275, -10865, -6797, -17269, -15397, 468, -2240, -4644, 3395, 787, -1217, +3818, 3627, 2923, 182, -1593, 8309, 3308, 462, 13898, 10486, 3434, 7544, 2854, -3123, 3080, -6612, +-10265, -8039, -20527, -14673, -733, -4875, -4941, 3022, -971, -691, 4359, 3222, 4244, -320, 428, 9760, +2178, 3096, 15238, 10055, 4690, 8960, 1561, -1109, 3103, -7981, -7681, -9404, -21584, -12625, -1577, -6389, +-4001, 2068, -2243, -211, 3467, 2862, 4315, -2083, 2490, 9270, 554, 5371, 14918, 8940, 5518, 9507, +80, 894, 2285, -8791, -5709, -11407, -21703, -11263, -2609, -7437, -3333, 1325, -2823, 333, 2868, 3505, +3716, -2594, 4670, 8006, 347, 7626, 14856, 8493, 7635, 9317, 125, 3678, 842, -7819, -4031, -13879, +-21191, -9867, -4419, -8287, -2819, -451, -3387, 410, 1074, 4060, 1703, -3365, 6038, 5387, 71, 8436, +13876, 7305, 9164, 7714, 275, 5450, -583, -5505, -2989, -14471, -19085, -7763, -4334, -7233, -1479, -553, +-2379, 1006, 1111, 4959, -13, -2885, 6903, 3148, 202, 8823, 12430, 6280, 9770, 5224, 270, 5251, +-3428, -4455, -4085, -16681, -18461, -7281, -5937, -7051, -823, -1654, -1178, 1176, 2037, 6150, -941, -514, +7690, 2528, 1802, 10486, 11877, 7577, 10934, 4015, 2595, 4952, -4485, -2536, -5495, -17945, -17628, -7839, +-7301, -7525, -1637, -2929, -1041, -207, 2658, 5602, -2938, 1345, 6624, 1387, 2432, 10951, 10845, 8653, +10796, 3351, 4816, 3812, -3757, -687, -6285, -17855, -15939, -7599, -7645, -6641, -2022, -3117, -1025, -941, +3634, 4258, -3718, 3089, 5463, 657, 3505, 11227, 9879, 10141, 10212, 3070, 6827, 2324, -3074, 582, +-7531, -17897, -15047, -8115, -8307, -6126, -3221, -2865, -1372, -1971, 4999, 2327, -4199, 3978, 3919, -626, +4442, 10428, 8727, 11251, 8678, 4019, 8231, 1199, -1392, 1680, -8091, -16843, -13449, -7711, -7953, -5145, +-3272, -1989, -1887, -1426, 6313, 466, -3025, 4583, 2817, -1233, 5149, 9047, 7704, 11136, 5920, 4594, +7376, -718, -687, 1373, -9330, -16528, -12561, -8339, -7572, -4919, -3408, -1101, -2676, -85, 7379, -783, +-1159, 5602, 2235, -231, 6562, 8411, 8732, 11300, 4581, 6429, 6123, -1751, 434, 390, -10113, -16139, +-12197, -8826, -7218, -5299, -3147, -989, -4147, 1823, 6654, -2071, -99, 5190, 743, 146, 6759, 6879, +9644, 10176, 3845, 7883, 4665, -1791, 1680, -243, -10191, -15161, -11811, -8758, -6370, -5503, -2264, -793, +-5114, 4135, 5983, -2533, 1665, 5330, -301, 1465, 7094, 5803, 10942, 8334, 3566, 8612, 2929, -2211, +1779, -1385, -11172, -14733, -12196, -8719, -6715, -6006, -915, -2241, -5019, 6018, 4268, -2487, 3211, 4639, +-801, 3263, 6560, 6270, 12466, 6720, 5156, 9514, 1847, -1135, 2314, -1901, -11423, -14143, -12489, -8519, +-7117, -6549, -238, -4273, -4287, 6541, 2541, -2662, 3764, 3342, -1757, 4258, 4979, 6735, 12534, 5296, +6739, 9624, 1214, -13, 3035, -2237, -11213, -13627, -12201, -7664, -7706, -5693, 773, -6069, -2241, 7308, +1169, -1634, 4796, 2091, -1359, 5272, 3187, 8014, 11354, 3631, 7811, 8098, 255, 260, 2902, -3180, +-10978, -13749, -12207, -7119, -8942, -4475, 386, -7409, -595, 7080, 251, -670, 5558, 760, -282, 5712, +2374, 10234, 10472, 3549, 9832, 7396, 362, 1359, 3114, -3705, -10571, -13803, -11795, -7184, -10273, -2711, +-926, -8459, 1257, 6143, -994, 468, 5405, -989, 1074, 4554, 1758, 11334, 8200, 3589, 10185, 5837, +139, 1840, 2476, -4205, -10177, -14153, -10522, -7231, -10539, -577, -2063, -7808, 3488, 5945, -807, 2596, +5793, -1135, 3444, 3458, 2735, 12586, 6202, 4336, 10008, 4321, -535, 1874, 1132, -5265, -10879, -15217, +-9867, -9291, -10835, -39, -4450, -7563, 4257, 4717, -1382, 4108, 5091, -855, 5268, 2474, 4907, 13692, +5547, 6678, 10729, 4223, 666, 2960, 855, -4805, -11019, -15268, -8543, -11271, -10157, 272, -6807, -7235, +4581, 2915, -2051, 5096, 2909, -447, 5368, 706, 6691, 12844, 4679, 7724, 10611, 3642, 1305, 3542, +452, -4227, -11506, -14199, -7659, -12895, -8283, 68, -8485, -6027, 4684, 1298, -1799, 6056, 1141, 771, +5204, -385, 8911, 11656, 4656, 9120, 10268, 3508, 2551, 3964, 522, -3399, -12305, -12483, -7529, -14158, +-6387, -655, -9923, -4856, 4618, -912, -915, 5547, -943, 1810, 3356, -1077, 10002, 9834, 4308, 9668, +9412, 3014, 3283, 3835, 650, -3285, -12834, -10217, -8089, -14137, -3909, -1324, -9606, -2557, 5139, -1547, +1448, 5217, -1169, 3608, 1493, -225, 10614, 7982, 4387, 9944, 7849, 2419, 3492, 2511, 724, -4507, +-13995, -8992, -10071, -14641, -3074, -3337, -10396, -1382, 4315, -2347, 3162, 4346, -495, 5160, 468, 2009, +11684, 7570, 5852, 11142, 7546, 3191, 4509, 2401, 1955, -5851, -13651, -7659, -12207, -14011, -2351, -5445, +-10967, -10, 2262, -3001, 4203, 2057, 122, 4707, -1397, 3191, 11016, 6536, 6685, 11465, 6630, 3729, +4785, 2382, 3032, -7163, -12327, -6793, -13647, -12264, -1889, -6741, -10323, 1170, 703, -2230, 4853, 592, +1874, 3964, -1989, 4762, 10437, 5844, 7648, 11588, 5898, 4733, 4457, 2906, 3221, -8461, -10715, -7093, +-14533, -11191, -2007, -7945, -9931, 1380, -554, -1828, 4376, 16, 2096, 3064, -1961, 4647, 9953, 5635, +7477, 11243, 5775, 4746, 4324, 3220, 3229, -8065, -10502, -6802, -13975, -10865, -1576, -7422, -9444, 1601, +-64, -1557, 4559, 289, 2203, 3338, -2024, 4878, 10115, 5672, 7682, 11447, 5828, 4738, 4457, 2953, +3138, -9251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 5268, 6076, 12935, 10716, 4862, 4940, 2833, 9996, 8100, 6884, -386, -2548, -6562, +-1176, -6105, -1530, -2162, -3059, 4229, 4056, -1504, -12159, -13877, -13986, -10597, -12054, -7991, -12056, -1539, +3570, 3987, 3803, 3849, 11297, 7700, 6223, 4161, 11768, 10384, 16000, 16517, 17666, 11429, 7556, 8173, +-4069, -1280, -6731, -8173, -10428, -3188, -4137, -10801, -20742, -21597, -23785, -22223, -19769, -20841, -13077, -3474, +5420, 6982, 9353, 17083, 20673, 20742, 17754, 16168, 15280, 18855, 16111, 20886, 15737, 12962, 6906, -3977, +-7380, -9531, -17490, -21204, -15590, -11828, -10551, -17853, -17398, -20710, -16312, -9104, -12469, -7967, -3492, 5667, +5794, 5475, 10284, 18359, 17205, 17069, 11595, 12529, 14753, 11457, 17759, 14315, 16371, 10500, 4290, -2863, +-3040, -9659, -15815, -18785, -13956, -10842, -14398, -15595, -23644, -22532, -16899, -14690, -15541, -12174, -1320, 4027, +5701, 9220, 18315, 19048, 22320, 18374, 21379, 19504, 20042, 22781, 18824, 18622, 16851, 7514, -2795, -6327, +-11390, -18217, -25819, -23687, -17960, -19918, -16783, -23370, -23802, -24093, -15125, -14087, -12817, -4181, 5891, 10325, +10970, 18823, 21804, 27575, 21368, 22450, 18147, 16675, 16916, 16149, 14092, 17178, 13968, 2664, -986, -6527, +-9575, -23375, -25971, -22484, -19711, -16327, -17331, -20671, -24938, -17868, -15069, -14083, -14066, -777, 4639, 8593, +11086, 19896, 24773, 24060, 25158, 23213, 20042, 16470, 15626, 10933, 11812, 13375, 6921, 2, -5829, -4054, +-13158, -20534, -24483, -18418, -16833, -13549, -15154, -20275, -17908, -15532, -12561, -14766, -9128, -3124, 5226, 4891, +12369, 20335, 22951, 25667, 24158, 22760, 18111, 17292, 11503, 11033, 11864, 11749, 2945, -2895, -3269, -7243, +-14112, -25163, -21442, -22498, -15522, -13991, -17578, -21224, -16036, -13483, -12076, -12518, -7035, 2276, 4463, 9073, +16798, 22841, 25856, 26275, 26550, 23964, 21348, 15232, 12484, 7916, 11722, 6270, -681, -7716, -7815, -10778, +-20245, -24307, -25559, -20798, -14421, -13221, -17483, -16080, -14020, -10497, -11582, -11617, -1975, 962, 5819, 9102, +17497, 21738, 26511, 24526, 25408, 23600, 19231, 14846, 8568, 11660, 10181, 7133, -3781, -3736, -7249, -11928, +-19354, -24685, -25038, -18538, -13166, -15255, -15242, -15959, -11917, -9992, -12676, -7888, -3554, 1026, 3346, 9037, +15796, 23278, 23329, 25523, 23784, 23377, 16046, 10810, 7907, 8709, 10709, 2715, -1257, -2689, -5906, -10360, +-17665, -23801, -20607, -13295, -12456, -12871, -16028, -11087, -11518, -10098, -10849, -6366, -4552, -865, 54, 4777, +12822, 16919, 21553, 19647, 25153, 21082, 16252, 9439, 10517, 13099, 10434, 4515, 2684, -495, -3927, -6925, +-17805, -19429, -17301, -12209, -11775, -16617, -15950, -14191, -14325, -15241, -11723, -10375, -4645, -4669, 161, 5168, +12395, 17110, 19523, 22206, 24972, 23181, 15324, 12071, 14164, 15538, 10291, 7144, 3277, -856, -754, -9730, +-17451, -21204, -16131, -12670, -13221, -16433, -13423, -14448, -15766, -14194, -13309, -9077, -8038, -3424, -2820, 4679, +10229, 15868, 17578, 21824, 25969, 22347, 14317, 12615, 15559, 13278, 12161, 8003, 5223, 3405, 593, -6841, +-16595, -18905, -15541, -11734, -15885, -15965, -15982, -16336, -18280, -17340, -14381, -11870, -7971, -5383, -1126, 4693, +12300, 16838, 19649, 25277, 29324, 22538, 15554, 16150, 14390, 14536, 10690, 6499, 3156, 1305, -2222, -10801, +-19798, -20371, -15163, -15474, -15843, -16449, -14787, -17235, -16545, -15374, -12270, -9906, -6843, -3807, 141, 6795, +13466, 17357, 20752, 29123, 29028, 21331, 17213, 15575, 15468, 13266, 9472, 5483, 3206, 259, -2708, -13995, +-20710, -20517, -17090, -17381, -18794, -16899, -17029, -17742, -17729, -14986, -11857, -9125, -5328, -2140, 2857, 9715, +15022, 17288, 24951, 29644, 27972, 21617, 17211, 15927, 14802, 12558, 7766, 4394, 1545, 1620, -5088, -14310, +-20418, -19274, -17441, -17379, -17080, -15832, -15595, -16662, -16412, -14072, -12098, -9599, -6567, -4046, 1616, 8404, +11191, 16603, 23171, 28800, 26724, 21026, 17216, 16831, 15433, 13512, 9235, 5330, 4521, 3146, -3258, -13591, +-18592, -18981, -18222, -18479, -18677, -17018, -17274, -17657, -17013, -14000, -12405, -9003, -7350, -2939, 3746, 7763, +11874, 17710, 25145, 29207, 27114, 20776, 18443, 16405, 16157, 12185, 6842, 4151, 3769, 1925, -6237, -14627, +-19101, -19574, -19133, -19177, -18358, -16758, -16690, -16604, -14826, -13164, -9827, -8770, -6052, -729, 4833, 7585, +12247, 18505, 26194, 28951, 25539, 20938, 17526, 17059, 15407, 10206, 4723, 3555, 3743, 103, -7919, -15446, +-18984, -19837, -19303, -19710, -17630, -16841, -15880, -15635, -14024, -10532, -8964, -8176, -4248, 2008, 5319, 8198, +12251, 19890, 25638, 27439, 23717, 18428, 15823, 15764, 13681, 7505, 3458, 3554, 3460, -621, -7917, -14234, +-17817, -18684, -18835, -17711, -16906, -15362, -14780, -14577, -12017, -8513, -8459, -7176, -2817, 2553, 5067, 6627, +11957, 18650, 23949, 25248, 21016, 15859, 13993, 14170, 10923, 4991, 2701, 3900, 3413, -235, -6822, -12071, +-15606, -16666, -16181, -15692, -14676, -13491, -13860, -13757, -10215, -8857, -8805, -7626, -2663, 1762, 3042, 5418, +11021, 17642, 23236, 24114, 19468, 14865, 13770, 13731, 9362, 4117, 3350, 4335, 4036, -474, -5804, -11217, +-14850, -15939, -15817, -15653, -14056, -13704, -14567, -13006, -10095, -8969, -9551, -6996, -1915, 1205, 2354, 5368, +11432, 18399, 24185, 23954, 19416, 15723, 15546, 13466, 8144, 3549, 3290, 4104, 2687, -1252, -6361, -11378, +-14528, -15223, -15814, -14650, -13898, -14315, -14752, -12461, -9750, -9953, -9700, -6225, -1543, 602, 1772, 5187, +11441, 18769, 23995, 22663, 17984, 15917, 15343, 12809, 6988, 4093, 4448, 5092, 3387, -265, -5193, -10023, +-12894, -14674, -14560, -13948, -13913, -15218, -15190, -12605, -11086, -11229, -10152, -6220, -2373, -544, 316, 4132, +10471, 18687, 23337, 21863, 18664, 17233, 16610, 12875, 7591, 4887, 5271, 5342, 3690, -524, -5304, -9804, +-13098, -14485, -14224, -13418, -14301, -15416, -14659, -12436, -11693, -11678, -9814, -5862, -2169, -881, 199, 3515, +10570, 18452, 22272, 20604, 18336, 17653, 16410, 12357, 7539, 5786, 6028, 6399, 3918, -123, -4865, -9585, +-13214, -14626, -13777, -13915, -15032, -15663, -14141, -12618, -12246, -11894, -9499, -5688, -2461, -1447, -776, 3429, +11191, 18976, 21486, 20211, 18879, 18351, 16385, 12025, 7763, 6305, 7112, 6884, 4366, 229, -4283, -9363, +-13331, -14113, -13591, -14764, -16402, -16288, -14787, -13672, -13580, -12275, -9565, -5498, -2353, -1941, -942, 4227, +12883, 19773, 21635, 20823, 20186, 19058, 16598, 11574, 7477, 6439, 6886, 6239, 3268, -235, -4936, -10346, +-13662, -13638, -13904, -15529, -16673, -15866, -14330, -13715, -13075, -11666, -8630, -4389, -1663, -1975, -732, 5164, +13610, 19364, 20987, 20939, 20148, 19128, 15878, 10830, 6908, 5890, 6244, 4984, 2450, -607, -5552, -10947, +-13210, -13105, -13740, -15725, -16162, -15020, -13938, -13336, -12654, -11160, -7947, -3545, -1694, -2416, -711, 6000, +13872, 19112, 20834, 21019, 20677, 19228, 15597, 10501, 6995, 6191, 6077, 4397, 2417, -1021, -6448, -11412, +-13143, -13168, -14764, -16551, -16546, -15323, -14410, -13694, -13033, -11107, -7134, -2774, -1865, -2621, 443, 7410, +15016, 19584, 21345, 21835, 21529, 19701, 15433, 10158, 7074, 6245, 5168, 3830, 1896, -1966, -7735, -12018, +-13077, -13539, -15531, -16857, -16380, -15295, -14229, -13704, -12862, -10540, -5872, -2232, -2300, -2576, 1141, 8341, +15343, 19483, 21520, 22373, 21946, 19727, 14642, 9713, 7020, 5699, 4593, 3628, 1663, -2905, -8576, -12110, +-12873, -14129, -16187, -17126, -16506, -15236, -14157, -13678, -12717, -9344, -4322, -1432, -2034, -1888, 2177, 9188, +15452, 19290, 21438, 22408, 22214, 19141, 14025, 9570, 6702, 4864, 3801, 3001, 621, -4293, -9453, -12056, +-12982, -14444, -16237, -16811, -16004, -14436, -13459, -13312, -11843, -7806, -3061, -1159, -2070, -1572, 2857, 9421, +15171, 18704, 21000, 22522, 21877, 18168, 13294, 9153, 5970, 4141, 3564, 3020, 152, -4805, -9104, -11283, +-12517, -14364, -16115, -16675, -15586, -14026, -13731, -13748, -11543, -6943, -2503, -1341, -2305, -1208, 3251, 9705, +14814, 18168, 21030, 22742, 21519, 17588, 13088, 8842, 5479, 3757, 3728, 2873, -553, -5245, -8887, -10827, +-12276, -14111, -15950, -16208, -14725, -13539, -13958, -13764, -10918, -6036, -2245, -1777, -2611, -1315, 3576, 9713, +14192, 17754, 21220, 22667, 20972, 17240, 12959, 8445, 4835, 3624, 3770, 2395, -1317, -5459, -8595, -10457, +-11907, -14079, -16037, -15866, -14174, -13549, -14250, -13622, -9984, -5125, -1883, -1795, -2609, -793, 4361, 9719, +13710, 17771, 21353, 22427, 20488, 17095, 12768, 7899, 4460, 3755, 3786, 1704, -2044, -5838, -8735, -10337, +-11858, -14417, -16046, -15469, -13918, -13937, -14868, -13483, -9400, -4511, -1699, -1960, -2498, 32, 5053, 9722, +13784, 18291, 21761, 22321, 20463, 17221, 12591, 7388, 4380, 4009, 3469, 936, -2732, -6394, -8877, -10188, +-12190, -14814, -16052, -14953, -13725, -14379, -15142, -13198, -8758, -3816, -1498, -2087, -2004, 915, 5423, 9490, +13885, 18627, 21723, 22039, 20338, 17092, 11888, 6768, 4413, 4102, 3074, 395, -3401, -6743, -8821, -10236, +-12585, -15183, -15762, -14365, -13591, -14691, -15081, -12640, -7621, -2833, -1316, -2022, -1441, 1528, 5316, 9262, +14010, 18756, 21480, 21831, 20427, 16845, 11196, 6418, 4371, 3879, 2657, -419, -4074, -7047, -8698, -10255, +-12969, -15315, -15285, -13956, -13796, -15068, -15280, -12262, -6841, -2371, -1355, -1723, -613, 2102, 5397, 9378, +14334, 18800, 21302, 21943, 20692, 16567, 10927, 6389, 4421, 3856, 2196, -1112, -4698, -7278, -8731, -10603, +-13453, -15233, -14906, -13704, -13779, -15257, -15232, -11795, -6241, -2377, -1481, -1330, -94, 2130, 5108, 9237, +14224, 18375, 21046, 22179, 20752, 16522, 10965, 6612, 4771, 4021, 2012, -1441, -4899, -7084, -8581, -10985, +-13821, -15297, -14805, -13734, -14213, -15851, -15451, -11327, -5804, -2377, -1304, -594, 634, 2504, 5425, 9804, +14467, 18331, 21225, 22285, 20527, 15980, 10361, 6278, 4636, 3680, 1243, -2469, -5529, -7277, -8998, -11589, +-14171, -15149, -14312, -13274, -14191, -15856, -14722, -10055, -4898, -1981, -778, 141, 1132, 2648, 5783, 10057, +14279, 18170, 21157, 22107, 19998, 15136, 9593, 5794, 4326, 3171, 202, -3415, -5827, -7331, -9154, -11795, +-14068, -14673, -13535, -12833, -14414, -15944, -14056, -9155, -4424, -1719, -216, 729, 1300, 2870, 6095, 10054, +14093, 18016, 21118, 21947, 19529, 14510, 9118, 5711, 4553, 2920, -410, -3731, -5804, -7325, -9385, -12100, +-14213, -14413, -13103, -12973, -15064, -16131, -13571, -8620, -4316, -1493, 345, 1054, 1539, 3317, 6457, 10114, +14007, 18054, 21247, 21840, 19146, 13937, 8661, 5754, 4550, 2353, -1180, -4097, -5864, -7360, -9522, -12260, +-14066, -13699, -12378, -12973, -15353, -15943, -12900, -8271, -4185, -1068, 726, 1196, 1718, 3547, 6435, 9783, +13612, 17788, 20932, 21446, 18452, 13135, 8357, 6000, 4644, 1978, -1441, -4065, -5696, -7197, -9580, -12405, +-13773, -12941, -11877, -13182, -15554, -15490, -12391, -8073, -3941, -726, 846, 1214, 1849, 3723, 6438, 9598, +13479, 17722, 20956, 21220, 17796, 12449, 8178, 6072, 4288, 1345, -1949, -4330, -5736, -7253, -9909, -12592, +-13322, -12068, -11499, -13362, -15360, -14902, -11923, -7704, -3468, -330, 1078, 1412, 2188, 3929, 6349, 9364, +13258, 17669, 20944, 20859, 17078, 11973, 8228, 6150, 4007, 888, -2343, -4480, -5702, -7487, -10411, -12847, +-12905, -11568, -11675, -13758, -15338, -14657, -11712, -7413, -3056, 35, 1262, 1722, 2587, 4213, 6438, 9295, +13250, 17888, 21083, 20474, 16450, 11762, 8431, 6234, 3821, 477, -2650, -4490, -5610, -7711, -10919, -12833, +-12328, -11267, -11945, -13967, -15319, -14582, -11616, -7151, -2775, 94, 1360, 1959, 2912, 4452, 6447, 9162, +13240, 18102, 20997, 19829, 15808, 11548, 8422, 6186, 3469, 15, -2905, -4390, -5484, -8063, -11237, -12427, +-11573, -10913, -11930, -13913, -15098, -14373, -11273, -6682, -2412, 330, 1596, 2284, 3180, 4540, 6181, 8718, +13066, 18038, 20429, 18922, 15121, 11224, 8357, 6070, 3139, -374, -2929, -3977, -5320, -8358, -11191, -11800, +-10927, -10642, -11853, -13768, -15010, -14277, -11079, -6537, -2445, 195, 1545, 2371, 3384, 4628, 5972, 8643, +13428, 18312, 20226, 18467, 14858, 11232, 8501, 6050, 2778, -789, -2888, -3739, -5587, -8855, -11223, -11388, +-10612, -10636, -11921, -13865, -15161, -14291, -10912, -6372, -2374, 233, 1612, 2542, 3633, 4513, 5602, 8590, +13681, 18389, 19911, 18107, 14778, 11491, 8992, 6360, 2665, -768, -2476, -3511, -5960, -9299, -11166, -11097, +-10524, -10745, -12140, -14233, -15527, -14478, -10977, -6453, -2459, 151, 1644, 2899, 3970, 4523, 5604, 8986, +14254, 18607, 19711, 17813, 14570, 11579, 9216, 6142, 2144, -944, -2322, -3687, -6575, -9711, -11143, -10965, +-10434, -10691, -12183, -14305, -15440, -14121, -10491, -5940, -2091, 371, 2027, 3433, 4213, 4356, 5489, 9160, +14398, 18392, 19203, 17197, 14177, 11603, 9172, 5662, 1644, -1001, -2277, -4093, -7207, -10026, -11145, -10866, +-10345, -10627, -12243, -14392, -15355, -13849, -10057, -5513, -1844, 645, 2619, 4092, 4504, 4387, 5741, 9652, +14771, 18441, 18867, 16710, 13968, 11625, 8920, 4982, 1132, -1101, -2430, -4617, -7762, -10268, -11113, -10719, +-10166, -10622, -12425, -14587, -15437, -13716, -9740, -5236, -1709, 938, 3210, 4597, 4564, 4351, 5927, 9960, +15032, 18362, 18413, 16329, 13995, 11855, 8752, 4576, 1065, -947, -2547, -5071, -8203, -10481, -11143, -10608, +-10025, -10580, -12475, -14675, -15432, -13501, -9468, -5198, -1797, 1135, 3656, 4822, 4538, 4371, 6130, 10306, +15268, 18200, 17943, 16046, 14177, 11981, 8417, 4220, 1035, -880, -2747, -5465, -8540, -10671, -11146, -10473, +-9953, -10632, -12653, -14887, -15469, -13271, -9217, -5182, -1679, 1678, 4330, 5260, 4795, 4639, 6555, 10847, +15612, 17958, 17375, 15767, 14169, 11729, 7814, 3715, 803, -1170, -3260, -6100, -9114, -11036, -11253, -10428, +-9875, -10597, -12684, -14880, -15178, -12686, -8758, -4970, -1267, 2378, 4957, 5650, 5016, 4867, 6937, 11354, +15771, 17512, 16828, 15586, 14089, 11305, 7207, 3318, 575, -1461, -3700, -6633, -9566, -11232, -11215, -10226, +-9638, -10444, -12706, -14877, -14810, -12168, -8533, -4839, -921, 2860, 5344, 5783, 4951, 4780, 7075, 11583, +15517, 16770, 16265, 15449, 14003, 10999, 6956, 3311, 703, -1364, -3753, -6792, -9672, -11167, -10963, -9909, +-9342, -10350, -12867, -14896, -14505, -11951, -8581, -4849, -690, 3185, 5551, 5800, 4819, 4759, 7420, 11892, +15273, 16229, 15950, 15383, 13792, 10593, 6617, 3140, 582, -1564, -4075, -7168, -9957, -11235, -10850, -9618, +-8979, -10268, -12892, -14610, -14019, -11640, -8464, -4650, -283, 3665, 5927, 5880, 4685, 4838, 7761, 11983, +14791, 15619, 15678, 15268, 13603, 10354, 6499, 3230, 740, -1518, -4244, -7487, -10212, -11393, -10842, -9420, +-8963, -10614, -13234, -14664, -13958, -11729, -8596, -4617, -60, 4058, 6259, 5979, 4828, 5426, 8607, 12454, +14751, 15520, 15742, 15302, 13445, 10100, 6333, 3106, 594, -1802, -4767, -8033, -10679, -11731, -10865, -9260, +-9042, -10894, -13305, -14375, -13617, -11481, -8364, -4292, 413, 4572, 6496, 5864, 4809, 5803, 8979, 12348, +14284, 15108, 15489, 15061, 13100, 9792, 6179, 3140, 684, -1844, -4884, -8186, -10861, -11763, -10579, -8984, +-9077, -11077, -13253, -14152, -13420, -11383, -8296, -4117, 820, 5047, 6651, 5774, 4985, 6317, 9363, 12281, +13949, 14787, 15199, 14666, 12576, 9249, 5766, 2901, 403, -2193, -5228, -8542, -11149, -11625, -10061, -8535, +-8929, -10908, -12876, -13690, -13011, -11092, -8084, -3797, 1343, 5408, 6532, 5529, 5081, 6601, 9459, 12000, +13526, 14438, 14908, 14344, 12209, 8960, 5701, 2930, 370, -2270, -5405, -8892, -11402, -11509, -9729, -8408, +-9017, -10922, -12757, -13505, -12858, -11077, -8112, -3556, 1828, 5643, 6402, 5464, 5337, 7013, 9619, 11850, +13277, 14218, 14713, 14069, 11894, 8818, 5774, 3035, 497, -2153, -5486, -9167, -11505, -11234, -9410, -8368, +-9121, -10996, -12761, -13449, -12890, -11309, -8301, -3400, 2068, 5547, 6069, 5372, 5621, 7379, 9803, 11823, +13215, 14249, 14772, 14010, 11786, 8829, 5869, 3086, 573, -2182, -5854, -9684, -11752, -11184, -9410, -8547, +-9322, -11084, -12663, -13224, -12791, -11360, -8115, -2860, 2582, 5717, 6069, 5607, 6069, 7785, 9942, 11727, +13025, 14080, 14487, 13583, 11395, 8577, 5629, 2924, 510, -2387, -6317, -10136, -11833, -11048, -9314, -8552, +-9352, -11029, -12369, -12857, -12639, -11277, -7772, -2290, 2974, 5725, 6009, 5759, 6392, 8065, 10039, 11626, +12941, 13995, 14250, 13239, 11116, 8349, 5426, 2878, 525, -2606, -6840, -10546, -11949, -11034, -9362, -8699, +-9551, -11063, -12172, -12699, -12658, -11198, -7286, -1597, 3419, 5880, 6166, 6079, 6824, 8417, 10094, 11523, +12831, 13786, 13884, 12833, 10763, 7974, 5149, 2822, 482, -2938, -7288, -10760, -11862, -10781, -9154, -8643, +-9522, -10831, -11844, -12561, -12750, -11169, -6961, -1241, 3506, 5749, 6089, 6193, 7079, 8542, 10039, 11431, +12744, 13609, 13641, 12642, 10587, 7808, 5185, 3065, 589, -3171, -7609, -10934, -11857, -10665, -9153, -8814, +-9652, -10725, -11656, -12619, -12911, -11075, -6584, -855, 3686, 5776, 6206, 6567, 7529, 8808, 10138, 11499, +12689, 13367, 13334, 12290, 10136, 7379, 5005, 3011, 313, -3682, -8118, -11228, -11839, -10511, -9080, -8819, +-9468, -10268, -11229, -12422, -12742, -10660, -5990, -394, 3828, 5731, 6273, 6824, 7763, 8878, 10108, 11402, +12449, 13019, 12980, 11884, 9621, 7034, 4972, 3040, 181, -3988, -8438, -11356, -11756, -10447, -9251, -9063, +-9468, -10057, -11116, -12466, -12669, -10303, -5465, 49, 4041, 5851, 6572, 7269, 8152, 9163, 10351, 11504, +12354, 12861, 12775, 11498, 9126, 6714, 4807, 2834, -258, -4616, -9027, -11668, -11743, -10404, -9337, -9056, +-9163, -9645, -10868, -12328, -12420, -9836, -4911, 374, 4043, 5780, 6652, 7417, 8227, 9196, 10317, 11339, +12100, 12654, 12488, 11068, 8781, 6635, 4975, 2977, -299, -4834, -9226, -11606, -11533, -10313, -9422, -9046, +-8960, -9470, -10891, -12425, -12362, -9503, -4470, 612, 4063, 5825, 6818, 7593, 8374, 9324, 10317, 11138, +11841, 12359, 12025, 10442, 8243, 6385, 4933, 2934, -526, -5190, -9425, -11458, -11227, -10142, -9286, -8726, +-8470, -9070, -10691, -12337, -12126, -9065, -4084, 703, 3939, 5733, 6789, 7565, 8384, 9335, 10176, 10926, +11690, 12185, 11709, 10078, 8028, 6428, 5129, 3054, -701, -5541, -9623, -11414, -11190, -10288, -9449, -8699, +-8335, -9002, -10788, -12412, -11956, -8674, -3750, 821, 3985, 5858, 6971, 7801, 8694, 9564, 10222, 10897, +11666, 12052, 11382, 9677, 7777, 6400, 5252, 3076, -938, -5843, -9658, -11262, -11137, -10384, -9512, -8607, +-8181, -8993, -10997, -12597, -11907, -8493, -3706, 723, 3901, 5832, 7019, 8010, 8986, 9794, 10394, 11073, +11853, 12064, 11181, 9375, 7596, 6452, 5406, 3011, -1291, -6208, -9821, -11329, -11315, -10641, -9629, -8510, +-7997, -8935, -11053, -12500, -11514, -7995, -3332, 968, 4040, 5916, 7153, 8232, 9204, 9847, 10351, 11019, +11710, 11726, 10611, 8758, 7144, 6302, 5350, 2752, -1693, -6463, -9800, -11205, -11276, -10621, -9458, -8145, +-7645, -8779, -10989, -12290, -11087, -7601, -3070, 1092, 4063, 5903, 7205, 8375, 9278, 9823, 10308, 11006, +11634, 11482, 10172, 8295, 6915, 6357, 5392, 2538, -2022, -6646, -9813, -11212, -11370, -10706, -9386, -7912, +-7459, -8787, -11028, -12104, -10772, -7294, -2842, 1204, 4041, 5864, 7274, 8499, 9325, 9782, 10278, 10994, +11583, 11277, 9799, 7957, 6911, 6588, 5513, 2445, -2180, -6663, -9731, -11189, -11469, -10788, -9274, -7685, +-7376, -8873, -11083, -12003, -10600, -7137, -2774, 1117, 3869, 5754, 7308, 8575, 9347, 9792, 10337, 11125, +11646, 11123, 9427, 7670, 6905, 6740, 5551, 2291, -2310, -6652, -9637, -11183, -11588, -10859, -9148, -7520, +-7355, -8981, -11092, -11883, -10390, -6894, -2605, 1167, 3854, 5814, 7480, 8731, 9449, 9875, 10451, 11259, +11675, 10870, 9003, 7366, 6843, 6735, 5371, 1960, -2628, -6828, -9755, -11390, -11862, -10986, -9071, -7408, +-7355, -8995, -10997, -11640, -10030, -6473, -2267, 1334, 3973, 6050, 7779, 8994, 9629, 9970, 10558, 11361, +11595, 10490, 8500, 7054, 6801, 6753, 5218, 1713, -2770, -6877, -9810, -11596, -12090, -11060, -9004, -7413, +-7496, -9150, -11034, -11571, -9824, -6250, -2154, 1315, 3990, 6173, 7984, 9254, 9861, 10222, 10917, 11721, +11683, 10217, 8130, 6867, 6777, 6672, 4979, 1382, -3028, -6973, -9954, -11838, -12271, -11034, -8876, -7323, +-7458, -9095, -10913, -11286, -9430, -5868, -1941, 1387, 4029, 6213, 8048, 9269, 9800, 10207, 11000, 11777, +11470, 9741, 7664, 6604, 6680, 6538, 4713, 1128, -3099, -6910, -9953, -11903, -12231, -10821, -8629, -7141, +-7366, -9039, -10782, -11028, -9096, -5600, -1816, 1421, 4063, 6332, 8215, 9356, 9829, 10280, 11167, 11852, +11229, 9241, 7202, 6346, 6525, 6309, 4375, 822, -3239, -6982, -10095, -12058, -12235, -10687, -8456, -7013, +-7287, -8983, -10634, -10709, -8698, -5287, -1649, 1469, 4108, 6450, 8334, 9393, 9845, 10440, 11424, 11957, +11040, 8900, 6942, 6279, 6530, 6195, 4136, 652, -3335, -7139, -10345, -12340, -12429, -10787, -8501, -7064, +-7350, -9010, -10502, -10376, -8290, -4943, -1448, 1586, 4237, 6644, 8470, 9415, 9892, 10634, 11681, 12022, +10810, 8518, 6648, 6171, 6452, 5987, 3895, 507, -3385, -7252, -10544, -12492, -12474, -10733, -8418, -7015, +-7383, -8997, -10322, -10045, -7878, -4602, -1256, 1656, 4345, 6759, 8501, 9351, 9866, 10800, 11859, 11996, +10488, 8087, 6338, 6006, 6249, 5659, 3565, 311, -3545, -7434, -10738, -12599, -12430, -10574, -8203, -6817, +-7229, -8794, -9958, -9531, -7359, -4193, -1034, 1823, 4518, 6911, 8496, 9215, 9793, 10820, 11852, 11721, +9940, 7505, 5930, 5737, 5953, 5328, 3355, 249, -3539, -7453, -10750, -12558, -12309, -10348, -7968, -6705, +-7187, -8699, -9726, -9170, -6963, -3942, -926, 1893, 4618, 6966, 8394, 9070, 9810, 11007, 11976, 11606, +9616, 7179, 5759, 5616, 5760, 5097, 3211, 187, -3568, -7514, -10820, -12576, -12216, -10156, -7812, -6639, +-7191, -8678, -9598, -8942, -6746, -3880, -990, 1848, 4630, 6894, 8215, 8927, 9855, 11240, 12182, 11571, +9441, 7076, 5775, 5638, 5708, 5048, 3210, 235, -3555, -7575, -10933, -12662, -12232, -10136, -7831, -6769, +-7366, -8780, -9532, -8718, -6526, -3765, -908, 2012, 4841, 7007, 8214, 8947, 10042, 11498, 12257, 11361, +9085, 6799, 5586, 5410, 5422, 4763, 3027, 117, -3656, -7686, -11010, -12639, -12051, -9861, -7588, -6600, +-7244, -8568, -9197, -8340, -6279, -3691, -904, 2048, 4856, 6884, 8018, 8862, 10151, 11687, 12282, 11137, +8782, 6599, 5447, 5233, 5200, 4572, 2892, 34, -3729, -7800, -11145, -12703, -12019, -9779, -7549, -6618, +-7259, -8445, -8849, -7878, -5877, -3411, -636, 2320, 4999, 6858, 7875, 8794, 10250, 11800, 12193, 10846, +8455, 6317, 5204, 4986, 4945, 4351, 2754, -36, -3784, -7864, -11191, -12658, -11865, -9587, -7394, -6594, +-7243, -8295, -8539, -7573, -5697, -3331, -558, 2419, 5001, 6685, 7661, 8751, 10410, 11933, 12164, 10686, +8309, 6252, 5127, 4867, 4819, 4278, 2713, -51, -3838, -7982, -11305, -12688, -11796, -9497, -7399, -6675, +-7316, -8204, -8283, -7277, -5493, -3173, -408, 2551, 5037, 6528, 7456, 8721, 10541, 12008, 12049, 10461, +8098, 6098, 5027, 4729, 4680, 4175, 2694, -27, -3818, -7975, -11283, -12568, -11597, -9289, -7323, -6714, +-7336, -8083, -8058, -7090, -5420, -3143, -317, 2610, 4943, 6305, 7292, 8751, 10684, 12061, 11926, 10270, +7924, 5963, 4903, 4610, 4547, 4106, 2696, -22, -3865, -8040, -11306, -12524, -11477, -9202, -7344, -6835, +-7360, -7922, -7766, -6818, -5238, -2978, -133, 2735, 4859, 6094, 7185, 8850, 10861, 12138, 11891, 10170, +7837, 5907, 4845, 4529, 4460, 4035, 2628, -119, -4022, -8247, -11486, -12589, -11460, -9236, -7486, -7042, +-7461, -7830, -7580, -6644, -5105, -2819, 100, 2911, 4914, 6113, 7333, 9175, 11201, 12368, 11941, 10120, +7744, 5772, 4649, 4272, 4177, 3784, 2424, -299, -4219, -8457, -11611, -12581, -11339, -9141, -7510, -7080, +-7375, -7583, -7277, -6420, -4933, -2592, 337, 3021, 4821, 5959, 7306, 9296, 11350, 12422, 11864, 9962, +7565, 5572, 4407, 3986, 3924, 3602, 2313, -393, -4332, -8544, -11637, -12460, -11136, -8995, -7490, -7080, +-7252, -7303, -6954, -6176, -4684, -2298, 602, 3113, 4722, 5828, 7269, 9358, 11395, 12361, 11700, 9749, +7351, 5367, 4177, 3740, 3702, 3444, 2207, -492, -4452, -8670, -11641, -12328, -10970, -8942, -7549, -7165, +-7215, -7128, -6767, -6008, -4466, -2014, 818, 3216, 4736, 5859, 7369, 9460, 11456, 12379, 11717, 9780, +7385, 5403, 4224, 3812, 3787, 3515, 2256, -440, -4389, -8593, -11637, -12425, -11106, -8997, -7506, -7088, +-7248, -7303, -6948, -6166, -4667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -107, -60, -39, -5, 1, -12, -18, -47, -88, +-85, -71, -65, -21, 7, -3, -7, -12, -12, -17, -37, -32, -11, -8, -23, -16, +10, -6, -1, 10, -3, 34, 57, 18, 31, 35, 27, 22, 25, 46, 7, -26, +-2, 3, 1, 37, 78, 115, 125, 144, 132, 173, -3, -240, 679, 813, -312, 68, +566, 517, -405, 588, 2455, 815, -6119, -9542, -4385, 602, 918, 624, 1598, -876, -3929, -3729, +-5463, -5066, -10414, -3967, 18368, 25151, -7669, -22624, -3799, 4880, 5086, 10823, 4588, -3135, -2246, 778, +-298, -1931, 1976, 253, -4737, -3521, 1220, -617, -1311, 7948, 11763, 7940, -4283, -12130, -6066, 5689, +9115, 6673, 1242, -2558, -6333, -5168, -1660, 909, -7779, 966, 30248, 27279, -13468, -25456, -3923, 3817, +4625, 11874, 9593, 5451, 10, -4041, -5859, -4965, 3174, 4540, 4208, 5833, 4984, -3787, -5274, 253, +3663, 2100, -4380, -7473, -4107, 5900, 9594, 5609, -982, -4160, -9111, -9828, -2955, 932, -4560, 1024, +27252, 21612, -14257, -21960, -1045, 1078, -1806, 6329, 5408, 3627, 1437, 496, -4172, -4002, 3510, 5214, +4429, 4243, 1555, -7696, -5766, -1399, 2997, 1821, -2385, -3360, 39, 5095, 2611, -1178, -4496, -4654, +-9741, -11194, -5008, 384, -5823, 262, 25470, 17162, -15759, -21549, -1973, -3728, -5566, 1814, 4773, 4856, +1224, -3090, -8369, -3807, 2654, 4870, 4276, 4875, 1618, -5829, -6176, -2354, 2421, -1370, -2979, -2456, +2802, 4599, 2444, -1353, -6570, -9199, -12487, -12155, -6438, -2430, -11258, 1525, 27524, 16420, -14486, -14302, +3547, -138, -592, 7727, 10120, 8120, 4056, -3544, -10342, -5150, 634, 1263, 1917, 8956, 4288, -2655, +-3964, 440, 2604, -3381, -6744, -4790, 5786, 9663, 9066, 3202, -1123, -2784, -4410, -5873, -2851, -3944, +-13861, 2288, 23657, 9906, -17769, -12043, 5451, 798, -798, 7340, 8447, 4492, 3736, -2047, -7427, 156, +6207, 4974, 5833, 12892, 6053, -2090, -3752, 2014, 2781, -2785, -4681, -2810, 4048, 8253, 8709, 1813, +-4049, -5737, -7051, -7568, -1383, -3338, -12435, 5558, 25004, 9580, -16060, -7929, 6232, 1766, 1906, 8757, +6135, 1262, 1395, -2412, -5509, -1102, 1932, 202, 5058, 11114, 4807, -3030, -4940, 246, 1118, -2834, +-4793, -3740, 2002, 7248, 7967, 982, -4812, -6847, -7785, -9031, -5333, -10593, -15194, 6402, 22592, 4026, +-19989, -10272, 3314, 132, -200, 6099, 4102, -131, -359, -3086, -3895, 1530, 4999, 2153, 5830, 11225, +7036, -1521, -4416, -1989, -2725, -4111, -4179, -4157, 1582, 8257, 8045, -403, -5320, -5810, -7087, -8344, +-5238, -12610, -15062, 7569, 21957, 1913, -17012, -5829, 4349, -409, 2075, 8391, 4191, -129, -1239, -3977, +-3409, 3028, 4419, 1387, 6208, 10406, 5665, -839, -2160, -338, -2991, -4187, -4399, -3248, 2194, 8777, +8955, 1052, -3201, -2557, -4433, -6372, -3207, -11524, -12757, 9475, 20485, -1045, -16881, -4291, 3129, -2783, +354, 8231, 6341, 2444, 2141, -873, -1262, 3399, 4199, 1195, 5457, 9614, 4345, 522, 2373, 4872, +217, -1542, -3128, -4371, -1462, 4481, 4135, -2490, -3746, -1966, -4378, -5691, -4511, -14147, -11784, 9320, +17545, -1678, -13749, -1853, 3518, -1698, 2293, 8480, 4249, 333, -616, -2592, -1776, 4167, 3448, 3236, +8324, 9595, 3191, -1700, -883, -536, -3176, -3907, -5023, -4947, -889, 6462, 6385, 1282, -1178, -113, +-2528, -4373, -6565, -15775, -9960, 10517, 17205, -2789, -12631, -1404, 3071, -1642, 2800, 6956, 2631, 1154, +798, -1007, 568, 5978, 3336, 2994, 9317, 9417, 2586, -2144, -648, -364, -1394, -909, -3913, -5373, +-575, 5400, 3488, -1394, -1796, -1259, -3444, -4029, -8506, -16227, -8123, 12659, 15388, -4365, -10886, 192, +3260, -356, 5232, 8062, 3833, 144, -178, -1172, 1290, 5801, 3774, 2759, 7976, 8988, 2359, -1971, +246, -842, -3390, -3287, -4782, -5466, 677, 6562, 3158, -2397, -1844, -158, -2182, -2663, -9019, -17158, +-8805, 10483, 11276, -7472, -10972, 490, 1888, -836, 5901, 8355, 3314, -425, -202, -2052, 74, 4070, +1849, 2929, 8214, 7654, 1069, -2095, -346, -1537, -4038, -5968, -8021, -6706, 93, 5755, 2460, -3080, +-3086, -1843, -2344, -2849, -10579, -18044, -7331, 11438, 11127, -6129, -8515, 2073, 2274, 388, 5556, 7158, +3730, 1555, 1658, -784, 148, 2854, 1928, 5272, 9862, 9576, 2237, -1404, -701, -2577, -5245, -5709, +-6551, -5771, 52, 5480, 3057, -163, 231, -1271, -2174, -3211, -11767, -17442, -4932, 12505, 8913, -7376, +-6937, 3268, 1430, 401, 5597, 6779, 4587, 3182, 2286, 134, 2218, 3619, 641, 4649, 9998, 9344, +2265, -520, -374, -3123, -4568, -4941, -6322, -5557, 73, 4424, 1651, 124, 948, -944, -2015, -4400, +-12584, -15653, -1991, 13443, 7851, -8578, -6788, 2860, 585, 1157, 6576, 6623, 2475, 997, 1039, -448, +2125, 2891, -248, 2970, 9220, 8853, 2110, 0, 354, -3289, -5615, -6458, -8510, -7361, 46, 4477, +231, -1370, -332, -1789, -2940, -5922, -14428, -16509, -1998, 12300, 6576, -7312, -4026, 2124, -1127, 612, +6687, 7165, 2885, 105, 545, -516, 2314, 1956, -182, 2505, 7962, 7667, 2131, 1094, 517, -3014, +-5252, -6436, -8010, -6269, 1926, 5478, 1988, 430, -905, -2179, -2684, -5182, -13449, -14176, -982, 12017, +5920, -6329, -2232, 2448, -878, 839, 6314, 6570, 3445, 1540, 1224, -485, 2385, 1083, 26, 4559, +9784, 7366, 1608, 474, -245, -3289, -4355, -6169, -8814, -6808, 1831, 4908, 1617, 1180, -1210, -2053, +-1077, -3712, -12334, -12145, 1538, 11658, 4223, -4695, 401, 3316, -66, 2295, 5436, 5815, 3139, 1285, +309, -343, 2267, 921, 1031, 5292, 9979, 7729, 2235, 405, -1506, -4548, -4463, -5228, -8683, -7322, +1179, 3428, 1128, 892, -1448, -1932, -2070, -6971, -15310, -12694, 1563, 10943, 2571, -4919, 309, 2865, +178, 3035, 5902, 5839, 2877, 2070, 1031, 309, 2339, 713, -88, 4250, 9235, 6595, 1344, -163, +-2022, -4409, -3653, -5234, -8505, -6110, 2538, 3699, 1364, 773, -446, 782, -890, -8049, -15583, -10844, +2857, 11212, 3755, -2280, 1326, 2237, 197, 3222, 5786, 5728, 1996, 1118, 714, 1593, 3387, 1690, +1848, 5344, 9291, 6625, 2077, 212, -1326, -3028, -3062, -5059, -8122, -5277, 3149, 3655, 1645, 287, +-527, 1021, -662, -8033, -14888, -9706, 2691, 8867, 2256, -1404, 1991, 2592, 2095, 4957, 6867, 6576, +3186, 992, -323, 427, 2136, 492, 1586, 5153, 7873, 5418, 2172, 995, -1751, -3477, -3248, -6120, +-9576, -5878, 2392, 2970, 2078, -230, -1573, 521, -1540, -9387, -15113, -9654, 1618, 6522, 1162, -1729, +1718, 1737, 1196, 3634, 5297, 4671, 1926, 628, -922, 105, 1877, 515, 1676, 5174, 7385, 4322, +1348, -166, -2863, -4029, -3316, -6554, -10357, -5853, 2600, 3857, 2437, -108, -530, 1322, -2388, -10961, +-15707, -8833, 2458, 6297, 1089, -720, 2248, 1893, 1796, 4448, 5950, 5010, 2066, 886, 246, 1461, +1656, -153, 1235, 5387, 8020, 5258, 2597, 640, -1971, -3144, -2902, -6506, -9589, -4826, 2093, 2973, +1853, -584, 526, 2823, -2068, -10934, -14122, -6692, 2950, 6690, 2264, 226, 1520, 1568, 1697, 4894, +6797, 5471, 1394, 249, 129, 1321, 1324, -187, 1249, 5526, 8030, 5630, 3501, 1144, -2212, -3450, +-3871, -7934, -9765, -3715, 2778, 2751, 1545, -684, 1564, 3731, -2482, -12290, -15306, -7213, 1290, 4700, +1424, 68, 1067, 1176, 2106, 4799, 6018, 4965, 1188, -473, -512, 900, 420, -1031, 827, 4606, +6596, 5519, 3830, 1077, -2471, -3749, -4693, -8733, -9899, -3712, 2571, 2602, 834, -1302, 1630, 3230, +-3317, -12606, -14135, -6198, 1637, 4224, 1789, 1178, 1954, 1123, 1144, 3918, 5205, 4574, 1009, -522, +-671, 456, 299, -638, 1670, 5211, 6484, 4960, 3468, 1164, -2019, -2716, -4016, -8447, -9478, -3076, +2686, 3026, 1438, -677, 3028, 3760, -3651, -12936, -12619, -5135, 1484, 3682, 1710, 438, 1748, 2068, +2803, 5258, 6478, 5188, 1191, 88, -122, -10, -1024, -1044, 2067, 5740, 7134, 6173, 3854, 584, +-2197, -2553, -4650, -8912, -9392, -3406, 2015, 2836, 1301, 215, 4602, 3891, -4972, -13783, -12287, -4620, +1446, 3409, 2372, 1156, 2014, 1273, 2463, 4657, 6053, 4702, 335, -778, -428, 262, -1301, -1089, +2315, 5353, 6406, 5874, 3466, -609, -2916, -2611, -4734, -8568, -8576, -2873, 1474, 1986, 74, -234, +4501, 3618, -5655, -13807, -11369, -3723, 1147, 2997, 1887, 88, 624, 396, 2581, 5316, 7333, 5568, +1247, 175, -207, -55, -1786, -1266, 2198, 4891, 5820, 5691, 3866, 76, -2417, -2441, -4879, -8496, +-8348, -2279, 2243, 2257, -234, 69, 4853, 3331, -6004, -13347, -10308, -2962, 1181, 3061, 1795, 929, +1602, 1292, 3605, 5704, 7492, 5660, 1305, 144, -191, -267, -1898, -158, 3493, 5339, 6434, 6279, +3655, -138, -1792, -1763, -4748, -8422, -8660, -2629, 2207, 2270, -420, 660, 5785, 3511, -6266, -12885, +-9469, -3128, 390, 2948, 1543, 474, 1191, 1201, 3444, 5866, 8011, 4923, 666, 84, -182, -473, +-2343, -579, 3041, 5204, 6513, 6362, 3537, -250, -1568, -1646, -4729, -8486, -8334, -2615, 1772, 1213, +-1189, 773, 6032, 2778, -7545, -13439, -8926, -3323, -139, 2768, 1094, 141, 703, 1316, 3324, 5125, +6605, 3360, -51, -69, 46, -922, -3089, -384, 3125, 4738, 6280, 6275, 3140, -564, -1555, -2052, +-4894, -8186, -7598, -2159, 1857, 682, -1784, 1195, 6750, 2419, -7974, -12891, -7443, -2631, 180, 2616, +881, -153, -62, 996, 3585, 6125, 7614, 4214, 1288, 982, 443, -1359, -3663, -603, 2766, 4645, +6807, 7132, 4247, 352, -965, -1753, -4705, -7990, -7415, -1854, 1591, 217, -1698, 2382, 7722, 2616, +-8136, -12348, -6513, -2860, -115, 2499, 902, 10, 345, 1571, 3862, 6454, 7548, 3493, 933, 638, +55, -2033, -3556, -88, 2788, 4470, 6925, 6904, 3551, 65, -1096, -2272, -5045, -7664, -7027, -1520, +1493, -881, -3129, 2107, 7322, 1627, -9044, -11912, -5917, -2732, -105, 1889, 131, -417, 34, 1132, +3333, 6241, 7175, 3195, 1083, 905, 257, -2631, -4044, -478, 1981, 3710, 6474, 6164, 2601, -322, +-1128, -2223, -4889, -7521, -7055, -1752, 881, -1456, -3215, 2872, 7659, 1215, -9561, -10948, -4942, -2749, +-637, 1006, -603, -791, 449, 2009, 3859, 6661, 6876, 2703, 868, 1057, 220, -2865, -3617, -110, +2000, 4179, 7186, 6570, 2993, 119, -910, -2209, -4646, -7201, -6419, -1099, 779, -1969, -2824, 4177, +8185, 897, -9700, -10042, -4427, -2431, -206, 1278, -413, -813, 98, 1894, 3923, 6474, 6140, 2492, +1375, 1849, 890, -2567, -2954, 536, 2105, 4046, 7242, 6506, 2946, 125, -793, -2558, -4773, -7468, +-6324, -721, 852, -2455, -2880, 4482, 7677, -212, -10075, -9433, -4533, -2708, -107, 1632, -133, -509, +430, 1876, 3666, 6183, 5396, 1829, 1127, 1763, 377, -2873, -2658, 128, 1184, 3661, 6935, 5839, +2456, -259, -933, -2527, -4516, -7688, -5997, -394, 419, -3544, -3113, 4785, 7565, -982, -10165, -8617, +-4245, -2849, -313, 1196, -677, -913, 187, 1664, 3828, 6366, 5405, 1956, 1622, 2314, 652, -2800, +-2316, 330, 1431, 4306, 7531, 5995, 2374, -12, -800, -2489, -4470, -7549, -5548, -30, 147, -4142, +-2630, 5848, 7961, -1481, -9712, -7554, -3757, -2538, 154, 1587, -127, -148, 868, 2310, 4564, 6756, +5290, 1833, 1705, 2319, 535, -2694, -1862, 512, 1600, 4884, 7992, 6381, 2645, 317, -696, -1886, +-4079, -7452, -5146, 326, -124, -4228, -2015, 6338, 7453, -2344, -9484, -7064, -3745, -2950, -279, 1094, +-511, -464, 411, 2005, 4282, 6319, 4574, 1489, 1947, 2732, 622, -2489, -1618, 125, 932, 4369, +7162, 5552, 1983, -177, -1219, -1940, -4220, -7708, -5158, -28, -1428, -5319, -1886, 7104, 7075, -3135, +-9314, -6963, -4291, -3389, -437, 682, -676, -386, 352, 2066, 4279, 5897, 3670, 963, 1549, 2134, +-100, -2604, -1411, 49, 914, 4587, 7410, 5713, 2356, 166, -1091, -1811, -4342, -7734, -4630, 251, +-1908, -5580, -1257, 7873, 6673, -3578, -8719, -6043, -3690, -2962, -120, 624, -888, -495, 362, 2199, +4627, 6517, 4147, 1549, 2335, 2677, -7, -2162, -881, 44, 1133, 4921, 7425, 5533, 2635, 347, +-878, -1637, -4518, -7665, -3692, 735, -2071, -5454, -466, 8404, 6021, -4181, -8690, -5812, -3691, -2967, +-56, 429, -789, -367, 446, 2153, 4581, 6104, 3546, 1281, 2219, 2310, -599, -2526, -1138, 18, +1440, 5106, 7206, 5184, 2313, 113, -854, -1790, -5096, -8089, -3707, 35, -2899, -5898, -37, 8351, +4858, -4985, -8672, -5786, -3943, -3094, -178, -70, -1237, -898, 301, 2180, 4448, 5388, 2769, 1058, +2377, 2217, -871, -2371, -1063, -192, 1113, 4882, 6773, 4996, 2169, -23, -749, -1501, -5229, -7934, +-3017, -21, -3411, -5903, 927, 8660, 4278, -5248, -8297, -5326, -3536, -2572, 286, 71, -970, -564, +691, 2735, 5100, 5789, 2823, 1414, 2765, 2262, -711, -1692, -637, -81, 1348, 5268, 6977, 5379, +2527, 492, -264, -1331, -5572, -7580, -2218, 205, -3641, -5878, 1976, 9042, 3636, -5621, -8103, -5149, +-3593, -2262, 403, 51, -869, -506, 588, 2574, 4913, 5247, 2311, 1358, 2849, 2072, -912, -1607, +-686, -216, 1188, 5006, 6482, 4966, 2179, 379, -330, -1737, -6269, -7505, -2154, -420, -4584, -5911, +2631, 8650, 2672, -5994, -8040, -5276, -4171, -2867, -298, -299, -983, -653, 569, 2654, 4859, 4908, +1870, 1099, 2638, 1535, -1356, -1794, -782, -338, 1430, 5059, 6368, 4812, 2000, 444, -15, -1773, +-6585, -6973, -1717, -755, -5209, -5630, 3395, 8446, 2185, -5921, -7492, -4751, -3692, -2228, -158, -505, +-1141, -637, 980, 3253, 5247, 4809, 1975, 1792, 3152, 1543, -1064, -1319, -478, -61, 1879, 5286, +6639, 5044, 2131, 682, 336, -1818, -6579, -6211, -1112, -860, -5588, -5117, 4296, 8387, 1792, -5838, +-6992, -4482, -3382, -1768, 1, -632, -1239, -786, 1064, 3655, 5770, 4957, 2054, 2201, 3269, 1375, +-980, -1174, -729, -391, 1928, 5359, 6704, 5045, 2199, 983, 638, -2184, -7026, -6055, -960, -1290, +-6178, -4702, 4928, 8053, 1244, -6022, -6869, -4741, -3677, -1860, 5, -574, -1276, -949, 886, 3517, +5446, 4349, 1509, 2042, 2946, 1016, -1103, -1219, -947, -597, 1666, 4922, 6273, 4572, 2033, 1288, +914, -2582, -7148, -5599, -905, -2015, -6923, -4409, 5166, 7563, 704, -5984, -6504, -4690, -3760, -2036, +-367, -749, -1339, -914, 1138, 3904, 5634, 4334, 1758, 2539, 2983, 955, -937, -977, -784, -223, +1925, 4914, 6283, 4554, 2153, 1705, 1151, -2819, -7069, -5067, -626, -2325, -6983, -3502, 5680, 7235, +459, -5488, -5878, -4194, -3337, -1642, -264, -696, -1442, -1021, 1338, 4074, 5644, 3922, 1767, 2868, +3037, 938, -870, -1082, -1031, -102, 2160, 5045, 6261, 4389, 2024, 1865, 1147, -3098, -7031, -4599, +-521, -2875, -7196, -2824, 5970, 6663, -298, -5886, -6153, -4461, -3502, -1710, -456, -929, -1641, -1096, +1494, 4198, 5631, 3563, 1802, 2828, 2592, 507, -946, -1288, -1348, -381, 1947, 4907, 6033, 3996, +1784, 1865, 792, -3696, -7185, -4291, -588, -3610, -7553, -2403, 6101, 6079, -904, -6016, -5945, -4235, +-3229, -1564, -456, -932, -1824, -1351, 1242, 3993, 5353, 3168, 1823, 2877, 2546, 578, -686, -1235, +-1312, -221, 2000, 4787, 5839, 3755, 1947, 2393, 996, -3791, -6827, -3613, -590, -4287, -7594, -1792, +6218, 5665, -1045, -5743, -5567, -4030, -3091, -1448, -391, -932, -1970, -1135, 1679, 4390, 5389, 3139, +2296, 3290, 2605, 611, -612, -1330, -1228, -21, 2119, 4904, 5941, 3682, 2136, 2703, 951, -3910, +-6467, -3055, -715, -4854, -7419, -1025, 6356, 5213, -1203, -5556, -5342, -3884, -2939, -1384, -444, -978, +-2126, -1097, 1665, 4361, 4984, 2764, 2333, 3159, 2310, 669, -474, -1428, -1331, -181, 1836, 4655, +5616, 3263, 2072, 2708, 608, -4310, -6371, -2649, -982, -5514, -7428, -671, 6067, 4530, -1661, -5737, +-5461, -4044, -3023, -1506, -614, -1239, -2310, -1111, 1674, 4341, 4569, 2421, 2401, 3169, 2231, 771, +-473, -1477, -1307, -167, 1766, 4633, 5463, 3142, 2388, 3057, 602, -4322, -5895, -2052, -1319, -6192, +-7369, -73, 6157, 4302, -1757, -5486, -4967, -3603, -2630, -1326, -473, -1247, -2265, -976, 1853, 4458, +4463, 2608, 2837, 3375, 2393, 1005, -405, -1422, -1079, -3, 1840, 4777, 5330, 2962, 2652, 3324, +473, -4434, -5364, -1447, -1528, -6508, -6890, 580, 6152, 4026, -1908, -5388, -4838, -3518, -2542, -1278, +-491, -1514, -2410, -850, 2168, 4573, 4204, 2497, 2964, 3294, 2293, 975, -594, -1610, -1099, 8, +1867, 4912, 5238, 2870, 2941, 3392, 65, -4930, -5137, -1233, -1994, -6933, -6502, 970, 5833, 3479, +-2194, -5369, -4778, -3503, -2563, -1254, -502, -1678, -2495, -813, 2290, 4531, 3932, 2547, 3129, 3219, +2342, 1167, -602, -1683, -1200, -254, 1805, 5020, 5058, 2820, 3212, 3443, -147, -4976, -4612, -943, +-2385, -7196, -5959, 1510, 5728, 3134, -2260, -5135, -4555, -3304, -2373, -1147, -626, -1843, -2493, -646, +2475, 4534, 3754, 2736, 3355, 3188, 2373, 1233, -541, -1462, -934, -131, 1974, 5144, 4855, 2820, +3518, 3578, -376, -4986, -3949, -662, -2866, -7458, -5480, 1843, 5534, 2760, -2490, -5038, -4277, -3028, +-2143, -903, -619, -1891, -2434, -406, 2746, 4593, 3649, 2791, 3309, 3080, 2471, 1293, -617, -1404, +-852, -62, 2204, 5216, 4471, 2643, 3619, 3466, -768, -4918, -3246, -360, -3227, -7553, -5001, 2086, +5260, 2284, -2752, -5171, -4346, -3134, -2143, -825, -729, -2169, -2635, -357, 2770, 4298, 3264, 2731, +3188, 2878, 2369, 1172, -776, -1380, -953, -388, 2038, 5043, 4069, 2498, 3655, 3181, -1438, -5066, +-2877, -632, -4123, -7907, -4694, 2167, 4952, 1952, -2883, -5136, -4213, -3098, -2063, -812, -897, -2431, +-2757, -307, 2813, 4085, 3056, 2751, 3070, 2761, 2446, 1242, -679, -1190, -921, -410, 2180, 4908, +3678, 2557, 3954, 3193, -1646, -4848, -2253, -506, -4414, -7763, -4118, 2415, 4715, 1660, -2994, -5048, +-4084, -3011, -1884, -721, -905, -2441, -2645, -35, 3103, 4080, 3089, 2924, 3004, 2731, 2606, 1306, +-532, -885, -807, -348, 2417, 4831, 3444, 2674, 4153, 2939, -2014, -4543, -1666, -629, -4860, -7676, +-3763, 2460, 4399, 1390, -3079, -4911, -3961, -2957, -1742, -626, -895, -2509, -2616, 104, 3061, 3801, +3017, 3023, 2983, 2717, 2545, 1036, -686, -915, -881, -269, 2599, 4633, 3125, 2713, 4303, 2731, +-2361, -4336, -1317, -1009, -5401, -7584, -3372, 2538, 4158, 1116, -3337, -4998, -4036, -3061, -1863, -832, +-1213, -2847, -2741, 246, 3086, 3556, 2912, 3006, 2875, 2785, 2700, 981, -732, -971, -1125, -414, +2623, 4423, 2896, 2902, 4479, 2461, -2591, -3903, -846, -1257, -5752, -7380, -2861, 2722, 4038, 1002, +-3335, -4782, -3830, -2804, -1532, -512, -963, -2737, -2587, 501, 3100, 3362, 2863, 3003, 2745, 2823, +2813, 1144, -362, -667, -1036, -223, 2819, 4313, 2833, 3198, 4671, 2167, -2867, -3464, -447, -1508, +-5950, -7046, -2304, 2948, 4009, 841, -3450, -4748, -3874, -2861, -1564, -608, -1142, -2887, -2398, 870, +3202, 3309, 2994, 3086, 2677, 2802, 2655, 895, -439, -748, -1151, -60, 2989, 4036, 2581, 3362, +4712, 1794, -3072, -3096, -357, -2046, -6367, -6927, -2034, 2921, 3781, 536, -3632, -4775, -3947, -2819, +-1450, -600, -1307, -3231, -2498, 908, 3021, 3060, 2930, 2878, 2390, 2726, 2586, 806, -362, -762, +-1208, 68, 3070, 3794, 2424, 3503, 4583, 1278, -3192, -2461, 11, -2212, -6455, -6586, -1660, 2959, +3662, 356, -3594, -4544, -3757, -2664, -1320, -459, -1251, -3163, -2104, 1278, 3113, 3132, 3132, 2943, +2446, 2901, 2691, 953, -86, -643, -1130, 292, 3209, 3639, 2415, 3736, 4542, 963, -3062, -1768, +255, -2480, -6603, -6268, -1316, 3016, 3558, 160, -3622, -4451, -3705, -2562, -1200, -351, -1295, -3231, +-1869, 1480, 3045, 3052, 3172, 2793, 2252, 2786, 2570, 944, 69, -585, -1065, 501, 3217, 3306, +2295, 3896, 4422, 550, -3043, -1365, 178, -2943, -6880, -6115, -1145, 2979, 3345, -69, -3634, -4423, +-3781, -2625, -1321, -488, -1596, -3484, -1829, 1419, 2839, 3042, 3241, 2649, 2117, 2689, 2359, 898, +119, -648, -1065, 585, 3012, 2852, 2255, 4137, 4298, 154, -2904, -861, 212, -3245, -6869, -5725, +-913, 2919, 3033, -420, -3721, -4361, -3704, -2484, -1137, -365, -1728, -3466, -1564, 1433, 2568, 2935, +3264, 2611, 2199, 2785, 2281, 874, 138, -747, -1053, 813, 3072, 2696, 2371, 4346, 4058, -278, +-2761, -486, 88, -3605, -6901, -5405, -632, 3031, 2970, -509, -3715, -4433, -3779, -2459, -1029, -313, +-1932, -3501, -1314, 1500, 2524, 3066, 3340, 2511, 2163, 2784, 2213, 905, 160, -757, -900, 1062, +3012, 2444, 2455, 4554, 3845, -623, -2542, -105, -34, -3953, -6944, -5193, -506, 2984, 2786, -624, +-3603, -4303, -3702, -2407, -968, -362, -2163, -3525, -1149, 1456, 2455, 3176, 3346, 2368, 2131, 2730, +2116, 905, 117, -849, -850, 1191, 2909, 2272, 2574, 4639, 3469, -953, -2252, 220, -244, -4365, +-7007, -4989, -357, 2904, 2513, -825, -3672, -4393, -3752, -2412, -913, -430, -2398, -3508, -987, 1363, +2354, 3212, 3251, 2151, 2029, 2630, 2009, 939, 129, -881, -739, 1338, 2723, 1999, 2678, 4776, +3149, -1207, -1907, 592, -299, -4509, -6886, -4700, -119, 2955, 2421, -854, -3639, -4380, -3731, -2325, +-714, -376, -2484, -3290, -776, 1248, 2313, 3363, 3316, 2182, 2093, 2572, 1941, 983, 138, -852, +-485, 1557, 2618, 1860, 2854, 4822, 2759, -1428, -1605, 783, -607, -4802, -6765, -4344, 124, 2987, +2369, -832, -3607, -4423, -3802, -2293, -648, -530, -2744, -3181, -570, 1281, 2371, 3413, 3148, 2038, +2116, 2563, 1912, 1015, 74, -917, -374, 1632, 2455, 1792, 3158, 4872, 2369, -1523, -1162, 1077, +-776, -5068, -6869, -4346, 75, 2839, 2243, -873, -3626, -4438, -3764, -2163, -527, -632, -2862, -2996, +-517, 1118, 2345, 3478, 3047, 1925, 2027, 2432, 1868, 1058, 22, -895, -158, 1750, 2265, 1661, +3353, 4809, 1975, -1603, -752, 1301, -892, -5068, -6541, -3891, 335, 2818, 2117, -943, -3641, -4477, +-3822, -2106, -415, -694, -2899, -2732, -395, 1104, 2482, 3564, 2992, 1994, 2189, 2466, 1873, 1116, +55, -750, 98, 1819, 2022, 1637, 3691, 4795, 1588, -1674, -432, 1327, -1213, -5255, -6435, -3644, +483, 2793, 2093, -890, -3518, -4355, -3662, -1862, -255, -827, -2958, -2502, -318, 1039, 2494, 3536, +2921, 2041, 2223, 2407, 1870, 1089, -138, -837, 236, 1933, 1917, 1717, 3961, 4675, 1252, -1595, +1, 1443, -1408, -5367, -6338, -3518, 405, 2604, 1949, -1006, -3576, -4455, -3764, -1868, -302, -1063, +-3036, -2361, -410, 878, 2484, 3439, 2745, 1962, 2214, 2400, 1910, 1035, -294, -816, 383, 1857, +1540, 1637, 4067, 4388, 835, -1540, 377, 1481, -1722, -5583, -6302, -3329, 521, 2590, 1839, -1128, +-3608, -4438, -3687, -1741, -331, -1304, -3037, -2117, -308, 1016, 2705, 3508, 2682, 1884, 2071, 2218, +1882, 1044, -296, -703, 595, 1902, 1482, 1952, 4398, 4175, 462, -1438, 725, 1511, -1844, -5529, +-6038, -3067, 588, 2586, 1830, -1098, -3561, -4418, -3600, -1558, -299, -1515, -3080, -2046, -414, 955, +2718, 3442, 2647, 1962, 2112, 2227, 1937, 987, -396, -657, 682, 1710, 1200, 2100, 4632, 4012, +190, -1317, 968, 1372, -2136, -5675, -5989, -2977, 545, 2505, 1704, -1196, -3598, -4490, -3632, -1521, +-403, -1684, -2950, -1878, -459, 943, 2711, 3319, 2521, 1904, 2047, 2154, 1904, 847, -510, -532, +871, 1600, 1010, 2267, 4700, 3624, -120, -1103, 1262, 1288, -2366, -5732, -5785, -2744, 609, 2483, +1622, -1244, -3613, -4549, -3629, -1472, -530, -1898, -2897, -1775, -468, 1034, 2800, 3292, 2471, 1847, +1928, 2148, 1978, 823, -510, -350, 1050, 1480, 921, 2531, 4812, 3303, -396, -953, 1430, 1132, +-2592, -5785, -5644, -2648, 583, 2410, 1534, -1251, -3559, -4513, -3488, -1360, -662, -2053, -2721, -1607, +-430, 1099, 2818, 3216, 2424, 1835, 1907, 2199, 1981, 650, -623, -202, 1201, 1346, 915, 2892, +4966, 3061, -501, -626, 1717, 1094, -2691, -5723, -5379, -2412, 687, 2415, 1431, -1339, -3621, -4554, +-3377, -1213, -747, -2111, -2567, -1578, -478, 1159, 2873, 3197, 2436, 1847, 1883, 2208, 1947, 535, +-652, -120, 1094, 978, 783, 3118, 4947, 2721, -646, -446, 1727, 806, -2980, -5757, -5203, -2281, +695, 2342, 1298, -1393, -3682, -4625, -3312, -1218, -967, -2274, -2519, -1586, -521, 1135, 2750, 2996, +2274, 1670, 1737, 2190, 1920, 440, -578, 154, 1218, 842, 818, 3333, 4817, 2311, -786, -192, +1903, 760, -3023, -5639, -4970, -2135, 748, 2309, 1199, -1378, -3615, -4475, -3033, -1089, -1108, -2316, +-2364, -1462, -376, 1363, 2914, 3098, 2422, 1811, 1921, 2397, 1969, 372, -495, 429, 1326, 784, +1063, 3779, 4880, 2116, -691, 207, 2170, 764, -3120, -5626, -4855, -2077, 740, 2247, 1157, -1341, +-3613, -4419, -2803, -949, -1201, -2363, -2359, -1572, -439, 1399, 2902, 3033, 2339, 1692, 1835, 2329, +1809, 171, -502, 466, 1054, 352, 973, 3866, 4662, 1714, -823, 309, 2107, 488, -3321, -5597, +-4730, -2043, 703, 2134, 1052, -1416, -3755, -4472, -2722, -1094, -1530, -2509, -2330, -1578, -438, 1455, +2926, 3028, 2282, 1601, 1834, 2411, 1796, 100, -371, 669, 1034, 273, 1215, 4140, 4544, 1480, +-733, 578, 2167, 313, -3482, -5544, -4525, -1862, 841, 2182, 1052, -1408, -3792, -4363, -2483, -1040, +-1572, -2393, -2174, -1523, -362, 1566, 2926, 3001, 2251, 1574, 1874, 2427, 1669, 18, -219, 818, +905, 156, 1482, 4428, 4432, 1273, -617, 876, 2277, 194, -3580, -5460, -4370, -1770, 866, 2131, +1016, -1419, -3837, -4244, -2298, -1094, -1751, -2469, -2232, -1642, -424, 1545, 2910, 3069, 2329, 1629, +1922, 2415, 1496, -138, -158, 858, 684, -15, 1626, 4507, 4156, 994, -619, 978, 2196, -41, +-3724, -5392, -4233, -1690, 832, 1956, 798, -1660, -4051, -4191, -2187, -1235, -1942, -2482, -2178, -1612, +-335, 1602, 2873, 2960, 2126, 1481, 1922, 2411, 1344, -246, -57, 909, 520, -70, 1896, 4669, +3932, 732, -628, 1099, 2151, -243, -3822, -5294, -4060, -1569, 886, 1979, 878, -1618, -4067, -4041, +-2068, -1300, -2003, -2441, -2164, -1637, -287, 1659, 2917, 3017, 2162, 1538, 2047, 2474, 1273, -178, +231, 1043, 384, -119, 2088, 4689, 3705, 655, -357, 1457, 2223, -411, -3912, -5194, -3928, -1519, +889, 1937, 830, -1747, -4112, -3750, -1811, -1314, -2087, -2444, -2194, -1661, -231, 1697, 2917, 2968, +2017, 1419, 2030, 2397, 1043, -327, 226, 907, 105, -162, 2291, 4625, 3335, 395, -287, 1632, +2204, -603, -4036, -5207, -3910, -1524, 821, 1821, 732, -1906, -4172, -3624, -1840, -1527, -2225, -2461, +-2281, -1751, -207, 1757, 2994, 3004, 1996, 1472, 2180, 2466, 1004, -199, 512, 997, 30, -34, +2631, 4689, 3120, 280, -119, 1860, 2214, -696, -3992, -5003, -3687, -1368, 905, 1901, 805, -1939, +-4113, -3411, -1753, -1567, -2173, -2310, -2168, -1624, -88, 1789, 3004, 3002, 1966, 1495, 2237, 2401, +834, -194, 609, 852, -234, 6, 2868, 4691, 2941, 243, 102, 2078, 2126, -924, -4106, -4970, +-3639, -1373, 863, 1867, 735, -2120, -4121, -3243, -1743, -1708, -2284, -2434, -2358, -1756, -144, 1773, +3016, 2943, 1847, 1481, 2319, 2354, 669, -168, 706, 729, -458, 35, 3051, 4649, 2723, 137, +201, 2163, 2023, -1053, -4107, -4884, -3561, -1322, 883, 1901, 703, -2228, -3992, -2969, -1647, -1721, +-2211, -2310, -2262, -1637, -32, 1844, 3081, 2982, 1904, 1649, 2512, 2324, 514, -109, 858, 715, +-474, 294, 3328, 4583, 2482, 81, 435, 2359, 1971, -1161, -4072, -4719, -3387, -1229, 903, 1922, +608, -2398, -3964, -2848, -1670, -1807, -2238, -2366, -2369, -1708, -76, 1821, 3071, 2873, 1746, 1607, +2542, 2217, 370, -57, 914, 566, -595, 458, 3493, 4443, 2204, 1, 580, 2427, 1820, -1316, +-4095, -4690, -3382, -1263, 878, 1887, 464, -2516, -3833, -2697, -1729, -1932, -2299, -2427, -2420, -1694, +-44, 1870, 3129, 2847, 1712, 1676, 2613, 2102, 265, 68, 978, 335, -781, 595, 3663, 4365, +2030, -10, 779, 2546, 1731, -1404, -4080, -4576, -3270, -1229, 897, 1932, 428, -2519, -3646, -2539, +-1747, -1971, -2309, -2448, -2398, -1622, 7, 1897, 3109, 2745, 1660, 1815, 2765, 2034, 225, 245, +1086, 244, -797, 803, 3772, 4194, 1811, 10, 1002, 2658, 1632, -1510, -4075, -4501, -3173, -1138, +1041, 2023, 282, -2660, -3556, -2425, -1729, -1966, -2279, -2431, -2373, -1593, 16, 1935, 3135, 2645, +1539, 1823, 2735, 1825, 84, 307, 1026, 0, -895, 967, 3875, 4035, 1573, -60, 1065, 2597, +1408, -1716, -4190, -4528, -3209, -1215, 996, 1899, 49, -2778, -3460, -2386, -1857, -2107, -2407, -2577, +-2499, -1666, -2, 1967, 3117, 2529, 1528, 2012, 2863, 1733, 64, 434, 980, -231, -938, 1179, +3980, 3910, 1421, 2, 1302, 2731, 1453, -1622, -4045, -4365, -3115, -1181, 1088, 1928, -54, -2774, +-3285, -2252, -1787, -2017, -2320, -2524, -2419, -1601, 42, 2029, 3117, 2427, 1494, 2119, 2875, 1593, +91, 631, 968, -408, -908, 1409, 4060, 3729, 1229, 27, 1412, 2689, 1322, -1681, -3996, -4254, +-3052, -1138, 1189, 1923, -190, -2793, -3163, -2241, -1876, -2101, -2395, -2596, -2476, -1666, 8, 2062, +3080, 2280, 1433, 2196, 2829, 1403, 97, 768, 874, -628, -932, 1523, 4030, 3523, 1094, 107, +1538, 2611, 1094, -1908, -4123, -4268, -3105, -1208, 1152, 1784, -372, -2785, -2999, -2151, -1860, -2107, +-2426, -2613, -2436, -1582, 141, 2207, 3110, 2214, 1521, 2422, 2901, 1329, 192, 917, 788, -750, +-784, 1858, 4208, 3479, 1074, 309, 1821, 2766, 1171, -1811, -3948, -4063, -3008, -1093, 1300, 1786, +-469, -2728, -2819, -2041, -1820, -2080, -2432, -2621, -2454, -1634, 123, 2228, 3043, 2099, 1576, 2580, +2892, 1234, 303, 1043, 650, -943, -767, 1966, 4121, 3198, 866, 293, 1821, 2625, 951, -2012, +-4034, -4084, -3043, -1040, 1370, 1678, -661, -2747, -2742, -2034, -1869, -2155, -2521, -2683, -2487, -1615, +211, 2293, 2909, 1887, 1527, 2618, 2759, 1069, 380, 1109, 468, -1118, -696, 2156, 4172, 3117, +866, 472, 1996, 2635, 899, -2023, -3929, -3971, -3008, -970, 1428, 1592, -759, -2668, -2604, -1966, +-1821, -2148, -2582, -2740, -2512, -1586, 323, 2408, 2886, 1831, 1642, 2756, 2712, 1024, 551, 1207, +354, -1162, -483, 2411, 4199, 2984, 829, 600, 2086, 2576, 792, -2090, -3870, -3888, -2977, -860, +1538, 1537, -840, -2606, -2504, -1925, -1802, -2131, -2538, -2692, -2504, -1591, 394, 2475, 2812, 1753, +1731, 2848, 2600, 947, 667, 1225, 172, -1302, -442, 2442, 4041, 2749, 750, 706, 2204, 2587, +725, -2136, -3822, -3855, -2950, -758, 1548, 1351, -1028, -2620, -2461, -1927, -1835, -2196, -2619, -2749, +-2566, -1612, 447, 2458, 2619, 1592, 1763, 2868, 2480, 952, 899, 1326, 64, -1355, -303, 2606, +4015, 2606, 697, 792, 2248, 2507, 564, -2236, -3789, -3872, -2987, -648, 1642, 1311, -1036, -2517, +-2391, -1918, -1850, -2243, -2650, -2756, -2565, -1545, 590, 2519, 2521, 1540, 1855, 2887, 2316, 910, +1018, 1277, -166, -1487, -246, 2657, 3908, 2458, 703, 953, 2372, 2524, 517, -2219, -3701, -3837, +-2941, -527, 1655, 1156, -1107, -2391, -2223, -1799, -1794, -2223, -2640, -2773, -2620, -1559, 645, 2513, +2406, 1523, 2007, 2931, 2199, 934, 1169, 1261, -316, -1534, -117, 2737, 3791, 2282, 684, 1035, +2391, 2405, 298, -2374, -3764, -3919, -2957, -461, 1562, 894, -1314, -2456, -2264, -1848, -1840, -2303, +-2728, -2863, -2707, -1574, 695, 2455, 2226, 1471, 2099, 2894, 2034, 929, 1282, 1201, -488, -1574, +25, 2858, 3745, 2199, 734, 1181, 2502, 2415, 270, -2301, -3637, -3842, -2828, -253, 1668, 905, +-1215, -2248, -2095, -1751, -1825, -2347, -2728, -2858, -2722, -1513, 811, 2471, 2167, 1539, 2248, 2886, +1928, 970, 1372, 1122, -629, -1555, 197, 2933, 3610, 2007, 686, 1261, 2563, 2368, 166, -2344, +-3681, -3952, -2838, -175, 1613, 726, -1307, -2232, -2052, -1692, -1776, -2308, -2706, -2887, -2751, -1433, +961, 2490, 2062, 1550, 2347, 2852, 1867, 1113, 1564, 1131, -721, -1549, 320, 2997, 3522, 1923, +735, 1403, 2665, 2345, 113, -2303, -3617, -3915, -2698, -35, 1564, 595, -1307, -2129, -1966, -1651, +-1797, -2337, -2696, -2888, -2742, -1339, 1070, 2444, 1935, 1559, 2401, 2760, 1768, 1210, 1649, 1009, +-905, -1564, 446, 3014, 3365, 1805, 783, 1521, 2693, 2214, -45, -2373, -3668, -3956, -2591, 97, +1543, 483, -1374, -2170, -2034, -1752, -1913, -2407, -2713, -2926, -2805, -1348, 1049, 2277, 1753, 1567, +2436, 2631, 1655, 1272, 1704, 878, -1087, -1596, 520, 3011, 3244, 1729, 850, 1679, 2800, 2219, +-61, -2376, -3714, -3983, -2475, 209, 1516, 439, -1298, -2025, -1881, -1611, -1831, -2351, -2665, -2953, +-2829, -1261, 1150, 2256, 1755, 1736, 2582, 2619, 1660, 1458, 1865, 878, -1108, -1486, 701, 3043, +3117, 1622, 858, 1748, 2800, 2133, -90, -2300, -3690, -3981, -2400, 221, 1394, 312, -1326, -2005, +-1839, -1587, -1867, -2398, -2713, -3026, -2885, -1203, 1191, 2136, 1640, 1770, 2566, 2455, 1545, 1458, +1791, 652, -1288, -1453, 845, 3057, 3007, 1539, 898, 1855, 2828, 2061, -144, -2315, -3720, -3947, +-2252, 318, 1348, 245, -1312, -1947, -1766, -1543, -1863, -2358, -2664, -3047, -2860, -1063, 1316, 2112, +1656, 1922, 2659, 2436, 1602, 1656, 1931, 658, -1272, -1309, 994, 3043, 2873, 1476, 987, 1996, +2857, 1971, -212, -2349, -3777, -3925, -2116, 366, 1264, 163, -1346, -1949, -1752, -1558, -1908, -2385, +-2705, -3140, -2896, -987, 1302, 1908, 1495, 1894, 2567, 2257, 1544, 1736, 1882, 429, -1484, -1343, +1007, 2901, 2652, 1364, 1039, 2136, 2930, 1959, -214, -2356, -3821, -3896, -2015, 379, 1178, 88, +-1326, -1858, -1656, -1525, -1927, -2381, -2696, -3188, -2902, -888, 1320, 1802, 1489, 1990, 2577, 2206, +1624, 1912, 1928, 343, -1482, -1141, 1224, 2951, 2590, 1307, 1054, 2170, 2900, 1910, -210, -2369, +-3876, -3869, -1899, 446, 1157, 66, -1331, -1852, -1632, -1530, -1935, -2335, -2679, -3216, -2844, -778, +1297, 1660, 1479, 2081, 2550, 2107, 1622, 1979, 1882, 153, -1634, -1147, 1217, 2833, 2436, 1247, +1140, 2282, 2880, 1824, -282, -2441, -3915, -3792, -1784, 458, 1070, -21, -1382, -1850, -1605, -1542, +-1964, -2348, -2742, -3323, -2839, -681, 1247, 1508, 1447, 2112, 2512, 2048, 1717, 2144, 1904, 66, +-1650, -1023, 1322, 2805, 2379, 1273, 1281, 2437, 2919, 1809, -260, -2445, -3934, -3734, -1708, 453, +1026, -28, -1326, -1738, -1501, -1511, -1942, -2277, -2716, -3343, -2756, -522, 1278, 1472, 1540, 2217, +2466, 1976, 1768, 2219, 1850, -52, -1651, -881, 1409, 2728, 2209, 1151, 1290, 2461, 2883, 1777, +-275, -2465, -3923, -3615, -1592, 456, 963, -89, -1327, -1698, -1487, -1559, -1988, -2306, -2819, -3462, +-2737, -449, 1207, 1364, 1569, 2242, 2356, 1879, 1819, 2309, 1810, -153, -1588, -660, 1578, 2755, +2165, 1146, 1385, 2545, 2886, 1782, -257, -2461, -3886, -3512, -1511, 449, 909, -119, -1297, -1606, +-1385, -1504, -1918, -2217, -2814, -3478, -2625, -346, 1123, 1268, 1603, 2256, 2284, 1855, 1922, 2383, +1699, -357, -1698, -687, 1481, 2566, 1976, 1070, 1433, 2572, 2841, 1736, -301, -2545, -3915, -3454, +-1491, 365, 755, -279, -1382, -1610, -1430, -1608, -1980, -2242, -2883, -3513, -2536, -293, 996, 1145, +1610, 2243, 2216, 1874, 2085, 2542, 1710, -385, -1587, -500, 1593, 2558, 1922, 1103, 1582, 2696, +2885, 1743, -351, -2611, -3888, -3280, -1307, 471, 787, -287, -1356, -1543, -1385, -1581, -1918, -2188, +-2926, -3530, -2407, -200, 939, 1118, 1685, 2253, 2128, 1855, 2183, 2599, 1621, -512, -1600, -433, +1603, 2497, 1849, 1142, 1705, 2735, 2837, 1692, -404, -2669, -3879, -3222, -1283, 406, 672, -376, +-1365, -1482, -1331, -1550, -1854, -2170, -3042, -3603, -2359, -221, 782, 1033, 1703, 2214, 2038, 1844, +2282, 2621, 1474, -658, -1606, -364, 1605, 2369, 1679, 1060, 1700, 2683, 2770, 1663, -443, -2725, +-3876, -3154, -1253, 383, 606, -422, -1338, -1441, -1343, -1578, -1839, -2177, -3118, -3604, -2209, -144, +721, 1041, 1767, 2175, 1956, 1855, 2377, 2640, 1372, -730, -1539, -245, 1644, 2318, 1630, 1132, +1831, 2742, 2773, 1647, -474, -2740, -3807, -3040, -1184, 395, 566, -467, -1322, -1404, -1384, -1629, +-1829, -2206, -3222, -3605, -2105, -134, 643, 1041, 1773, 2057, 1802, 1824, 2471, 2702, 1339, -734, +-1460, -165, 1635, 2206, 1511, 1144, 1907, 2754, 2749, 1603, -570, -2822, -3779, -2944, -1117, 398, +512, -488, -1273, -1336, -1339, -1598, -1773, -2225, -3295, -3552, -1947, -98, 602, 1083, 1833, 2029, +1757, 1865, 2557, 2698, 1239, -798, -1419, -98, 1640, 2126, 1445, 1174, 1959, 2773, 2785, 1644, +-594, -2847, -3726, -2858, -1055, 388, 427, -584, -1297, -1326, -1336, -1559, -1704, -2242, -3384, -3545, +-1907, -204, 444, 1046, 1826, 1967, 1699, 1899, 2660, 2705, 1152, -825, -1330, 20, 1664, 2039, +1369, 1218, 1999, 2736, 2737, 1590, -653, -2837, -3609, -2710, -968, 401, 390, -597, -1239, -1266, +-1312, -1499, -1613, -2245, -3421, -3435, -1761, -195, 417, 1108, 1870, 1921, 1671, 1971, 2746, 2655, +1007, -899, -1306, 59, 1626, 1910, 1287, 1253, 2030, 2722, 2732, 1544, -753, -2902, -3575, -2647, +-939, 367, 292, -681, -1267, -1283, -1350, -1514, -1620, -2356, -3532, -3391, -1675, -229, 366, 1131, +1852, 1833, 1617, 2052, 2865, 2671, 963, -900, -1215, 166, 1637, 1829, 1242, 1283, 2085, 2764, +2773, 1530, -839, -2940, -3532, -2596, -900, 377, 251, -691, -1237, -1263, -1339, -1435, -1530, -2371, +-3555, -3283, -1583, -257, 355, 1196, 1877, 1768, 1563, 2090, 2921, 2640, 894, -903, -1144, 228, +1593, 1684, 1159, 1305, 2088, 2768, 2803, 1511, -881, -2924, -3425, -2442, -755, 419, 202, -747, +-1244, -1263, -1340, -1385, -1490, -2437, -3609, -3220, -1545, -323, 323, 1222, 1831, 1651, 1505, 2158, +3008, 2623, 812, -932, -1072, 343, 1637, 1670, 1204, 1402, 2128, 2766, 2781, 1419, -1016, -2979, +-3408, -2422, -763, 367, 132, -769, -1227, -1280, -1377, -1360, -1472, -2504, -3608, -3089, -1477, -375, +291, 1256, 1842, 1629, 1535, 2272, 3075, 2567, 732, -937, -1002, 386, 1562, 1535, 1146, 1411, +2145, 2819, 2849, 1427, -1021, -2916, -3282, -2289, -653, 388, 81, -796, -1212, -1280, -1375, -1310, +-1476, -2601, -3639, -2997, -1443, -446, 267, 1275, 1782, 1506, 1476, 2323, 3125, 2528, 682, -914, +-910, 447, 1504, 1438, 1107, 1409, 2144, 2820, 2842, 1375, -1078, -2931, -3270, -2279, -658, 367, +54, -807, -1209, -1281, -1370, -1293, -1474, -2613, -3639, -2993, -1445, -446, 267, 1278, 1709, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-73, -216, -225, -158, 15, 71, 46, 44, 45, 110, 217, 312, 228, 91, -95, -133, +-190, -177, -320, -233, -272, -187, -86, -41, -7, 131, 259, 337, 296, 85, 64, -73, +-79, -254, -249, -125, 180, 306, 589, 558, 446, 311, 264, 57, -182, -374, -448, -585, +-700, -442, -390, -274, -257, -89, 12, 102, 158, 262, 200, 258, 117, 233, 385, 650, +875, 936, 1777, 1564, 1305, -703, -5378, -8653, -9193, -9934, -8238, -5407, -2169, 405, 3947, 5776, +10425, 12529, 15699, 18578, 16286, 10784, 7318, 532, -4048, -9386, -12008, -12435, -9630, -7026, -2779, -453, +1062, 1220, 88, -1108, -5116, -8082, -10617, -6412, -5839, -224, 2414, 6294, 6174, 7221, 5507, 3287, +651, 618, 854, 1230, 108, -691, -1595, -1435, -932, -4846, -4936, -7636, -3079, 4135, 12295, 13372, +18098, 13944, 7684, -2572, -7617, -12463, -12338, -14534, -11513, -12638, -11586, -7628, -1092, 2253, 7781, 15964, +18781, 19155, 14834, 11301, 1937, -4339, -14104, -12238, -14433, -6567, -2820, 6208, 10520, 16092, 13660, 9726, +2377, -8292, -13797, -15757, -15004, -10594, -4130, 1922, 3988, 1936, 3314, 260, 613, -2290, -1668, -1209, +1094, 886, 3347, 3169, 267, -3599, -4661, -8323, -6919, 2673, 10575, 16685, 20582, 19788, 11847, 4605, +-7083, -12053, -20350, -21337, -21537, -18176, -18426, -7030, -1603, 6290, 9416, 17323, 23725, 27084, 24618, 18049, +12460, -1727, -9744, -18665, -18363, -16429, -6831, -1481, 7330, 12854, 13803, 10847, 5733, -5247, -12945, -17773, +-14277, -12516, -6457, 1474, 5810, 7706, 7254, 5830, 3250, 1058, -2543, 23, 514, 1200, 512, 2174, +-5478, -6483, -9537, -11295, -13770, -4942, 35, 9572, 13299, 18489, 15873, 13615, 8237, 1833, -7247, -14744, +-13615, -18573, -16094, -16615, -7677, -5408, 2700, 4878, 17714, 24623, 29028, 26406, 19924, 7680, -3491, -12852, +-20200, -20760, -13637, -7497, 2340, 10328, 15318, 15405, 12623, 5154, -5859, -11969, -14262, -14388, -12737, -4845, +-467, 4737, 3460, 3874, 151, -309, -5148, -1508, 418, 1301, 3062, 4943, 611, -3852, -2820, -7189, +-7514, -8446, -1079, 1059, 8369, 9663, 13988, 8719, 9160, 5624, -2852, -8850, -10820, -13002, -15828, -15088, +-15321, -9871, -7063, -2567, 7024, 18142, 26236, 30530, 30078, 19726, 9902, 517, -11778, -16550, -17608, -12789, +-7094, 3091, 7850, 12173, 13435, 10975, 1251, -5832, -9609, -13246, -11975, -8219, -2430, 1180, 4093, 1069, +2882, -3405, -6336, -6769, -1666, -4292, 405, 2797, 2972, 488, 286, -1057, -5247, -5803, -6236, -544, +511, 10015, 10729, 10230, 9315, 10018, 1765, -1860, -6449, -9625, -10429, -14485, -17259, -15268, -13864, -10215, +-3871, 7376, 13695, 25592, 27995, 25979, 20637, 11726, 1886, -7480, -12231, -15270, -10364, -4547, 3230, 5696, +11870, 11722, 8488, 800, -2671, -8131, -9892, -9463, -5437, 62, 88, 1424, 1702, 415, -5842, -4414, +-5597, -5339, -5706, -1238, -760, 434, 160, 505, -3282, -6759, -5457, -6289, -2499, 5153, 9349, 9727, +12975, 11965, 7345, 4616, -2728, -5033, -6848, -9328, -13990, -13717, -13380, -13559, -6772, -3859, 4072, 13101, +20347, 22447, 21418, 16722, 8688, 248, -7089, -11746, -13983, -8130, -3743, 1428, 6360, 13158, 11763, 10149, +4995, 1261, -4284, -7080, -5922, -1912, -861, -1561, 2077, 167, -2508, -5068, -3656, -7897, -5523, -5871, +-2324, -3380, -107, 332, -2101, -4053, -4747, -7850, -7572, -41, 2803, 6744, 11616, 11453, 11564, 7213, +2281, -4121, -4238, -7753, -10662, -10079, -13584, -12934, -11700, -7806, -4292, 5062, 13807, 21583, 25309, 25837, +20395, 11656, 3544, -6725, -13590, -14215, -11077, -10182, -3328, 3340, 9038, 9483, 8549, 5463, 1215, -5072, +-5552, -2424, -1295, -646, 2759, 3968, 1144, 580, -2049, -3555, -6502, -4491, -4131, -4155, -1988, -204, +-2385, -3918, -2608, -9450, -8925, -6439, -2890, 1595, 7012, 10348, 10997, 11717, 4448, 25, -734, -4441, +-4888, -6217, -7517, -11112, -10847, -12466, -12116, -8988, -345, 7578, 17332, 23740, 24587, 20141, 14970, 5691, +-5237, -8503, -10316, -9272, -7268, 989, 6423, 11327, 9839, 10992, 5110, -842, -6988, -4477, -5630, -3580, +-647, 1558, 987, -1365, -2062, -6135, -8137, -7967, -5643, -5902, -2128, 1708, -318, 2907, 1857, -1855, +-4204, -5184, -4282, -1990, 4484, 3951, 9191, 9565, 5030, 262, -2387, -5170, -6496, -5226, -6769, -7199, +-8397, -8055, -11521, -10152, -6884, 537, 8262, 19407, 23425, 23953, 21601, 14161, 2571, -4651, -8771, -11647, +-12464, -8357, -976, 4126, 7979, 9882, 11369, 4196, 146, -2240, -2169, -2643, -20, 3206, 3142, 2686, +948, -1747, -7428, -7549, -8428, -9198, -4770, -5154, -3681, -2053, -453, -2644, -4049, -4547, -7491, -1993, +656, 4400, 8472, 13796, 10733, 8100, 3699, -18, -3701, -4278, -5625, -8078, -8276, -8525, -10793, -13423, +-10728, -9678, -2058, 7108, 15163, 17732, 22363, 18629, 12262, 3801, 1, -6053, -8679, -9724, -5042, 330, +3009, 7366, 10401, 8626, 4627, 2167, 240, -1784, -661, 558, 2683, 1234, 2534, -709, -4573, -5295, +-9482, -7913, -7443, -4428, -5544, -1145, 166, -691, 191, -3513, -6929, -6249, -3174, -3081, 2301, 7282, +9278, 8112, 6794, 2374, -1044, -2062, -2998, -5780, -5862, -5072, -7618, -8998, -9153, -10301, -7422, 710, +7316, 13105, 19078, 21718, 16617, 10574, 3883, -1567, -7211, -11751, -10123, -7454, -3546, 558, 6658, 8079, +7918, 6162, 4305, 2815, 26, 3253, 2048, 4011, 4736, 3064, 1600, -1962, -5098, -9653, -7320, -8606, +-8358, -5735, -3942, -3255, 60, -1190, -5737, -5581, -5324, -4645, -1813, 4526, 7160, 9906, 9307, 7172, +1605, 836, -1297, -4859, -5882, -4434, -6792, -7269, -8257, -11675, -12534, -7021, -1321, 4360, 13416, 19542, +20938, 17412, 11390, 6676, -685, -7035, -9992, -7974, -7559, -2715, 1736, 6237, 7875, 6520, 7176, 2015, +1210, -370, 405, 1779, 3588, 4176, 2629, 3248, -2582, -5529, -6517, -7376, -8578, -5757, -5344, -3980, +909, 1141, -1771, -3769, -4466, -7155, -5780, -2905, 1374, 4122, 8722, 7868, 4208, 2876, 1606, -3122, +-3812, -3453, -4782, -4966, -4718, -8828, -12170, -9759, -7376, -1471, 4805, 14099, 20147, 20884, 16768, 12833, +6853, -2770, -7347, -11312, -10521, -9303, -4838, 1936, 4165, 8186, 7454, 7192, 3277, 1991, 395, 1164, +3764, 3358, 4923, 4977, 2082, -2763, -3411, -8050, -8669, -8026, -7938, -8407, -2668, -41, -5, -734, +-1655, -4683, -5848, -3806, -2019, 856, 7163, 8965, 6324, 5846, 3998, -385, -2454, -2819, -5137, -4374, +-2920, -6397, -9580, -12052, -11058, -8389, -3988, 2487, 11841, 17144, 17104, 18168, 13362, 8212, -471, -5420, +-8305, -10734, -7636, -4153, 1779, 3759, 8291, 7614, 6551, 3821, 837, 440, 1870, 2241, 3371, 6625, +3754, 2174, -128, -4015, -7580, -6037, -8723, -9372, -6958, -2407, -1413, 163, -54, -2841, -5617, -4400, +-5231, -3704, 2740, 6423, 6497, 6360, 5615, 561, -697, -2581, -4889, -4171, -2390, -2397, -5228, -7672, +-9706, -8185, -7662, -4097, 4836, 10448, 16915, 16638, 18083, 13067, 6309, -881, -6029, -10153, -12419, -8626, +-5780, -85, 3875, 7539, 7807, 7913, 3137, 2412, 2304, 1365, 2608, 5941, 4824, 4577, 3986, -411, +-3856, -4185, -6355, -9135, -8858, -5714, -4477, -2172, -606, -2895, -5010, -4495, -6043, -6125, -966, 4006, +5629, 8433, 7708, 3860, 2402, -308, -2744, -4313, -2072, -2235, -1258, -6138, -7796, -9026, -10926, -8826, +-5528, 3767, 9524, 15185, 17507, 18333, 13110, 6278, 866, -6142, -10144, -11156, -9260, -6074, -372, 2528, +7051, 8170, 5691, 4085, 3844, 1038, 2424, 4526, 4465, 5165, 6033, 2631, -1157, -2576, -3948, -7316, +-8044, -6677, -6115, -2925, 46, -1115, -2775, -2590, -4807, -7961, -4540, -2368, 1030, 4691, 6192, 4327, +2972, 1683, -2083, -2334, -4523, -516, -395, -1513, -3963, -6720, -8050, -10574, -9002, -4223, 3973, 8971, +15321, 19388, 17861, 13500, 8452, 999, -5828, -9488, -12149, -10083, -6686, -3569, 2081, 5819, 5379, 5340, +4829, 1239, 1805, 2768, 3555, 4594, 7504, 5937, 2895, 879, -960, -5197, -6604, -7743, -8646, -6449, +-2230, -1538, -2122, 385, -2518, -4510, -5518, -3755, -2761, 2416, 4718, 5221, 5468, 2628, 1784, -2405, +-4112, -3392, -1479, -157, -2038, -2973, -5378, -7627, -11738, -8888, -4263, 847, 7221, 14738, 16669, 16576, +14301, 8157, 2193, -3825, -9152, -10050, -9208, -7848, -1888, 2757, 4664, 6578, 6221, 2883, 1576, 1401, +1039, 2214, 5698, 6890, 4883, 4434, 1850, -1151, -4130, -5334, -9286, -8690, -5058, -4016, -2252, -243, +384, -2969, -3345, -5859, -4907, -1474, 1149, 5238, 4893, 5756, 3786, 1291, -2939, -4864, -3840, -1815, +-1198, -2890, -1688, -4690, -8747, -10040, -6763, -5114, 1227, 8488, 13266, 16925, 17351, 13734, 8952, 2311, +-5421, -8155, -11084, -11257, -7229, -2073, 1298, 5840, 7187, 5455, 3152, 2596, 621, 531, 3580, 5308, +5497, 5096, 4843, 1004, -141, -2300, -6575, -8364, -6846, -5223, -4542, -742, -1074, -990, -2773, -5940, +-6046, -6241, -1891, 818, 4651, 5108, 6583, 4484, 1884, -2802, -3709, -1695, -1108, -2058, -336, -1031, +-5935, -8116, -8698, -9095, -5252, 800, 6400, 13195, 16207, 16280, 14822, 8864, 1126, -3686, -9073, -12391, +-10951, -7633, -3615, 1298, 5747, 5757, 5486, 4850, 2775, 1320, 2303, 4966, 4602, 6622, 5732, 3642, +1562, 134, -4000, -7768, -6641, -7914, -4776, -3288, -686, 274, -510, -2502, -5426, -6266, -5829, -2269, +20, 3090, 3631, 5156, 3827, -439, -3755, -2086, -1768, -2727, 229, 957, -2126, -4426, -6991, -9664, +-8067, -5198, -210, 7688, 12921, 16431, 18699, 15588, 9388, 3666, -3084, -8884, -11722, -11001, -9431, -4472, +117, 3051, 4245, 4815, 3893, 507, 1219, 1573, 3510, 4904, 7202, 5435, 4928, 4885, -214, -2856, +-6520, -6987, -7307, -5027, -3492, -723, 5, -303, -2633, -4843, -5858, -5005, -2253, 459, 1681, 4204, +5937, 2436, -2306, -1834, -2718, -3838, -1285, 856, 254, -27, -3395, -6943, -8136, -8877, -6497, -61, +5478, 11210, 16395, 17166, 14607, 9862, 4446, -3012, -6972, -11025, -10763, -9158, -3653, -123, 2671, 5441, +5136, 3288, 858, 1372, -25, 2940, 5218, 4383, 5662, 5250, 3954, -91, -2964, -6207, -6697, -6779, +-5006, -2682, -332, 1190, 47, -1496, -4500, -5418, -4414, -1568, -1224, 1767, 6115, 4883, 829, -361, +-2490, -4996, -3382, -2519, -585, 559, -1189, -4417, -6021, -9436, -8820, -5657, -369, 5163, 12369, 16545, +17419, 16050, 10903, 5174, -1965, -6556, -11238, -11634, -8674, -4839, -1101, 2528, 6012, 3905, 3729, 1685, +-131, 1446, 3342, 3948, 4218, 5323, 4980, 3615, 132, -2863, -5291, -6411, -6319, -5136, -2434, -554, +951, 244, -1717, -5483, -5122, -3677, -3807, -2187, 3749, 4787, 3570, 2427, -293, -2648, -2807, -3197, +-1364, 1378, 304, -482, -3346, -6400, -9847, -8437, -7002, -1964, 4315, 10855, 15413, 16707, 15993, 11201, +5725, -357, -6612, -10965, -11421, -7985, -6772, -662, 2038, 4172, 4723, 4043, 1358, 1436, 2671, 3156, +4022, 3954, 5538, 4856, 3555, -374, -2663, -5309, -6488, -6720, -4811, -2505, -269, 1949, 1377, -2626, +-4284, -2896, -5025, -4538, -526, 2442, 3035, 3473, 446, -823, -2471, -4108, -3225, -759, 309, 464, +488, -3009, -6202, -8248, -8431, -6589, -2531, 4623, 9858, 15175, 16852, 16309, 11752, 7276, 852, -7031, +-9276, -10777, -9433, -6070, -1939, 364, 3801, 4004, 2461, 1078, 987, 2130, 2642, 3272, 4079, 5907, +5704, 3866, 784, -1845, -4875, -6562, -6405, -4820, -3463, 390, 2764, -623, -2426, -2154, -3933, -5373, +-2960, -1099, 2450, 3420, 2460, 1251, -322, -3265, -4381, -2431, -1726, 362, 1246, 822, -2368, -5659, +-7134, -9189, -6745, -3298, 3788, 8300, 14981, 16278, 15136, 13074, 7535, 95, -5189, -9057, -11019, -8568, +-6218, -2614, 936, 3642, 3709, 2196, 840, 851, 1675, 1710, 2422, 4169, 5769, 5502, 3610, 892, +-2004, -5304, -5896, -5475, -5649, -1669, 2673, 1816, 105, 21, -2368, -3585, -4737, -3592, -545, 2286, +2207, 2276, 1836, -1802, -3449, -4501, -3313, -2759, 60, 1144, -239, -2552, -5533, -7701, -9784, -6739, +-3386, 2400, 9737, 14211, 15907, 16971, 13957, 7893, 2088, -4559, -8726, -10020, -8892, -6585, -2978, 871, +3316, 3481, 1555, 881, 977, 1307, 1285, 2673, 4225, 6008, 4686, 3872, 671, -3105, -4753, -5274, +-7652, -5169, -318, 1046, 1733, 865, 173, -1739, -3183, -5228, -2706, -70, 886, 2653, 2642, 1503, +-2140, -2654, -4205, -3589, -1801, 909, 1380, -44, -1277, -5431, -8446, -8755, -8194, -4829, 2299, 7829, +11884, 16060, 15954, 13809, 8815, 3046, -3531, -7447, -9383, -8668, -6711, -3274, 839, 2945, 2475, 1474, +1336, 1005, 1413, 793, 2919, 4098, 5037, 5359, 4347, -716, -1830, -3885, -7249, -7578, -4416, -1180, +938, 2111, 1309, 1697, -885, -3832, -3749, -2232, -561, 606, 3232, 2020, 320, -1699, -3192, -4642, +-4273, -1063, -211, 938, 1054, -1678, -5497, -6765, -9343, -8461, -3729, 1361, 6735, 11879, 15639, 15951, +14196, 9386, 3605, -3072, -6866, -8973, -8509, -7361, -2749, 398, 2289, 2129, 1532, 1569, 1137, 154, +1186, 2701, 2703, 6091, 5902, 2925, 923, -505, -4558, -7536, -7011, -5219, -926, 173, 1474, 2427, +1516, -1707, -3701, -2710, -2967, -894, 1122, 2798, 1726, 726, -566, -3677, -4476, -3025, -1802, -333, +2392, 371, -1338, -3928, -7366, -9818, -8199, -4636, 28, 5796, 11363, 15378, 16119, 14520, 9834, 3745, +-2798, -5964, -9015, -9057, -7045, -3018, 199, 1862, 1285, 2386, 1671, -44, 918, 904, 859, 3786, +6048, 4497, 3051, 2115, -1511, -4332, -8010, -6850, -4068, -1034, 262, 2895, 3980, 1275, -628, -2298, +-2659, -2946, -584, 1121, 1534, 1361, 1164, -2053, -3827, -3752, -4399, -2271, 352, 983, 308, -535, +-4214, -7976, -9755, -8432, -5625, -665, 5102, 11137, 14951, 16560, 15602, 10468, 4598, -936, -5441, -8435, +-8740, -7121, -2606, -112, 473, 2662, 2020, 777, 627, 759, -908, 1768, 4390, 4922, 4993, 3367, +2368, -1278, -5200, -8532, -6575, -4762, -2853, 539, 3309, 3421, 1637, 345, -1408, -2638, -2004, 22, +214, 1622, 2327, -254, -1613, -3178, -4703, -4271, -1418, -196, 978, 1424, -62, -4258, -7475, -9300, +-8791, -6506, -1864, 4131, 9274, 14204, 16555, 14989, 10949, 5980, 110, -3985, -7893, -9033, -5575, -3205, +-907, 1346, 2669, 640, 1865, 337, -960, -578, 1487, 3643, 4460, 4670, 4045, 3358, -1377, -6129, +-7444, -7065, -6056, -3275, 692, 3186, 3391, 2671, 1422, -1417, -1573, -897, -860, 1089, 2382, 1499, +167, -1180, -4171, -4990, -3841, -2156, -1088, 1338, 1467, -267, -4224, -6978, -8944, -9257, -6690, -2414, +2459, 8330, 13880, 15401, 15345, 10960, 6498, 1668, -4087, -8212, -7467, -5567, -4065, 314, 1348, 1772, +2148, 1899, -12, -1191, -520, 1331, 3551, 3652, 4559, 5599, 3067, -1664, -5408, -7076, -7976, -6706, +-3744, 681, 1893, 3811, 2595, 459, -847, -949, -1763, -95, 1543, 1801, 1844, 1135, -1626, -4253, +-4038, -3851, -2335, -613, 2036, 1833, -303, -3352, -6304, -9112, -8940, -6921, -4045, 1873, 7327, 13004, +15631, 14541, 10939, 8030, 1641, -4654, -6546, -7701, -6426, -3124, -454, 651, 1763, 2458, 1446, 49, +-1577, -129, 1747, 2388, 3210, 5662, 5600, 2841, -1549, -4936, -7070, -8770, -6411, -3385, -65, 2899, +4269, 2306, 1692, -3, -1142, -1188, 760, 763, 1928, 2213, 321, -2437, -3929, -4164, -4138, -2765, +-211, 1843, 1327, 99, -3057, -6842, -8514, -9528, -7926, -4412, 623, 6504, 13110, 14526, 13804, 13130, +7963, 2065, -2978, -6056, -7596, -5562, -3143, -1167, 616, 1642, 2820, 1514, -691, -1331, 721, 686, +2061, 3641, 6549, 5864, 2672, -789, -4553, -8257, -8583, -7204, -4694, -190, 2702, 3303, 3004, 2460, +-42, -405, -68, 66, 926, 2231, 1936, -273, -2327, -3581, -4291, -4642, -2397, -260, 1401, 2259, +175, -2674, -5798, -8268, -9697, -7685, -6007, -687, 6882, 11006, 13421, 14504, 12979, 8195, 3483, -1892, +-5497, -6460, -5126, -3028, -1316, 64, 2225, 2804, 136, -1012, -1094, 84, -109, 1089, 4345, 6502, +5258, 3590, -511, -5043, -7890, -8869, -8460, -4730, -510, 1721, 3731, 4027, 2314, 1219, 623, 248, +192, 1864, 2613, 2170, -337, -1290, -3720, -4709, -4447, -3085, -869, 1398, 1748, -84, -1605, -6055, +-7914, -8616, -9115, -6628, -438, 5146, 9295, 13050, 13975, 12529, 8876, 3962, -1474, -4805, -5998, -4136, +-2837, -1727, 1054, 2791, 2387, 83, -965, -293, -621, -1014, 1862, 4627, 5941, 6111, 3786, -549, +-4350, -7477, -9960, -8170, -5294, -1887, 1304, 3510, 3098, 2193, 1446, 544, 175, 487, 2769, 2562, +2105, 497, -1111, -3454, -4074, -4572, -3071, -39, 822, 1782, 1021, -2541, -5174, -6754, -9044, -9673, +-6018, -1563, 3564, 8471, 12218, 13290, 12602, 8984, 4441, -1280, -4736, -4778, -4273, -3420, -1578, 1285, +3035, 1634, -254, 243, -589, -1518, -589, 1697, 3841, 6263, 6145, 3182, 521, -4176, -7979, -9635, +-8053, -6100, -1731, 1253, 3316, 3031, 2658, 2150, 540, 309, 1332, 2740, 2519, 2391, 414, -1287, +-2672, -4879, -4039, -2260, -939, 1064, 2259, -1, -2405, -3886, -7128, -9639, -9271, -6436, -2659, 2862, +7362, 11548, 12538, 12500, 9750, 4342, -996, -3516, -4368, -4292, -3966, -1464, 2044, 2138, 1222, 937, +637, -1087, -845, -705, 1252, 4773, 6533, 6090, 4568, 1059, -4350, -7710, -9788, -9018, -6774, -2528, +893, 2345, 3089, 3186, 1986, 443, 939, 1523, 2419, 3072, 1267, 917, -1039, -3405, -4448, -3348, +-3293, -564, 1844, 1703, -12, -772, -3638, -7134, -9033, -9274, -6981, -3623, 1763, 6759, 10206, 12325, +12946, 9669, 4828, -157, -2085, -3350, -4708, -3748, -352, 1532, 1217, 1883, 718, -279, -1055, -1848, +-1583, 1530, 4353, 5949, 6876, 4999, 1233, -3967, -7635, -9886, -9954, -7065, -3004, 97, 1727, 3975, +3118, 2351, 1544, 1212, 2448, 3127, 2513, 2373, 1611, -1592, -2861, -3836, -4436, -3569, 36, 679, +1026, 752, -379, -3395, -6628, -8679, -8820, -7748, -3826, 971, 5169, 9051, 11630, 12403, 9281, 4271, +797, -981, -3641, -4782, -2066, -250, 1159, 1974, 1765, 786, 278, -1537, -2687, -1160, 1091, 4239, +6212, 7490, 5488, 1516, -3143, -7095, -10045, -10326, -6828, -4531, -980, 1548, 2986, 2926, 2156, 779, +2046, 2726, 2616, 3350, 3307, 1038, -643, -1655, -4254, -4390, -2436, -650, 292, 938, 1000, -364, +-3507, -5997, -8100, -8897, -7312, -4143, 104, 3998, 8102, 11418, 12003, 8268, 4460, 2371, -1407, -3701, +-3755, -1932, -453, 1751, 1642, 2004, 1621, 20, -1775, -2619, -1229, 572, 3629, 6040, 7427, 5148, +1864, -2135, -7501, -9892, -9526, -7763, -4671, -1253, 963, 3295, 2804, 1518, 1705, 2372, 1807, 3077, +4045, 2550, 1613, 517, -2221, -3836, -3622, -2008, -861, 161, 1174, 1055, -691, -2825, -5881, -7850, +-8965, -7351, -4744, -788, 2518, 7696, 11292, 10352, 7971, 5582, 2193, -1683, -3153, -3970, -1985, -259, +946, 1665, 2381, 2008, 84, -1344, -2014, -948, 461, 3988, 7020, 7007, 6174, 3080, -2417, -6957, +-9473, -10240, -8040, -5606, -2442, 1220, 2783, 1736, 1980, 2270, 1248, 2505, 3489, 3045, 2597, 2068, +73, -2281, -3684, -2933, -2319, -982, 422, 1379, 1304, -117, -2169, -5420, -7303, -8916, -7116, -5324, +-2601, 1946, 7874, 9809, 9779, 8719, 5900, 2626, -783, -2900, -2982, -1505, -225, 551, 1960, 2397, +1806, -631, -1486, -2233, -2110, 643, 4165, 6177, 7545, 6824, 2959, -1752, -6733, -9571, -9974, -8547, +-6545, -2245, 912, 1694, 2090, 2256, 1893, 1896, 2996, 3391, 3300, 2924, 2320, -47, -2155, -3551, +-2935, -2451, -1087, 345, 1280, 1350, -44, -1946, -5209, -7257, -8568, -7003, -5585, -2705, 1984, 7550, +9606, 9664, 8614, 5902, 2624, -792, -2892, -2910, -1547, -191, 537, 2170, 2671, 1385, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, +-67, -65, -235, -448, -398, -497, -581, -349, -276, -84, 143, 253, 407, 532, 409, 404, +422, 177, -8, -68, -217, -262, -72, 115, 205, 262, 205, 29, -173, -456, -665, -673, +-673, -701, -448, -225, -92, 81, 414, 582, 581, 855, 771, 530, 507, 283, -69, -50, +2, -415, -60, -204, -301, 25, 90, -8, 139, 29, -250, -222, -392, -115, 196, 1320, +2619, 2395, -3028, -8496, -8729, -10410, -8976, -5657, -4741, 845, 8700, 11671, 13876, 14737, 10271, 11290, +17206, 8358, 3735, 1276, -6139, -11125, -14823, -14819, -11062, -8923, -7949, 3358, 3900, 8145, 11381, 5401, +-2263, -12348, -17013, -14482, -11143, -3632, 11135, 21218, 18159, 17884, 11385, -160, -4563, -4330, -17412, -21184, +-13620, -12578, -4680, -1982, -6506, 1781, 4718, 15531, 18355, 23472, 21093, 19529, 8494, -3203, -8018, -13800, +-19427, -21575, -9845, -7966, 12892, 29020, 26386, 21320, 2028, -11727, -19184, -23666, -18318, -6351, 47, 317, +6851, 1051, 1756, 5377, 4356, -7172, -8927, -5081, -3392, 2565, -5108, -7566, 1313, 423, 9132, 11465, +17286, 15091, 18823, 5589, -4478, -11759, -15037, -20668, -24808, -18696, -13717, 9205, 23587, 25044, 24826, 8455, +1095, -3894, -6282, -4061, 1978, 1188, -2472, 894, -3473, 3578, 4727, -2201, -14305, -11317, -5598, -4631, +1015, -14995, -12699, -3838, -517, 7835, 14741, 22060, 23708, 29181, 13462, 5003, -3035, -7545, -19422, -22818, +-21856, -19337, 1012, 8696, 9998, 12380, -928, -1117, -3320, -3301, 1298, 5412, -121, -6092, -2642, -3271, +5883, 8530, -154, -10812, -8325, 70, 450, 2408, -13808, -5937, -4101, -426, 6023, 9156, 12176, 12890, +15966, 2678, 1341, -4853, -4685, -9779, -8049, -5539, -1432, 11823, 11710, 13110, 12124, -1272, -1964, -6397, +-5614, -1712, 4166, -2610, -10164, -10203, -9075, -611, 3124, -5117, -10881, -3756, 2194, 726, 1703, -11381, +77, 2051, 9390, 13012, 14643, 13463, 10760, 7481, -7560, -7820, -11671, -11188, -15285, -7375, -5523, -2746, +10146, 6647, 9781, 5727, -3328, 89, -2296, 363, 9378, 14563, 4022, -297, -2244, -3796, 1408, 342, +-10588, -13275, -7863, -8749, -8166, -8696, -17686, -739, 5876, 13534, 19916, 25740, 23439, 20536, 11703, -4926, +-7836, -14064, -15037, -15706, -6032, -7439, -1415, 12275, 4595, 8211, 1569, -6111, -3857, -5984, -2842, 4692, +5906, -5394, -6791, -8424, -7771, 1093, 2179, -2830, -1700, 6078, 4087, 3077, -7735, -15346, -4176, -1791, +6170, 12454, 16809, 14417, 14554, 6267, -4087, -7023, -11666, -9249, -7550, 321, -3039, 2551, 11899, 3817, +8419, -500, -6473, -3166, -3065, 3142, 12327, 11233, -94, -3806, -7284, -6995, -1155, -6430, -13714, -10841, +70, 57, 2711, -9131, -10930, -2533, 1679, 11866, 17007, 16867, 14416, 14063, 3427, -5200, -10635, -14499, +-12451, -9034, -1590, -6998, 841, 9026, 3435, 8454, 490, -3011, -374, 1207, 7137, 16062, 12003, -1394, +-6733, -10062, -8972, -1370, -6718, -13669, -8239, 1528, -566, 4412, -9257, -8145, 1031, 6602, 13454, 18592, +15971, 10758, 10430, -1983, -8485, -12449, -12909, -9097, -3773, 2360, -1701, 9904, 9990, 3328, 5815, -5798, +-8545, -5720, -4156, 1945, 12394, 9046, -415, -4002, -5786, -2655, 2121, -6363, -12895, -8505, -2930, -3670, +-652, -14042, -6761, 1139, 6913, 14261, 19990, 18109, 13652, 11682, -1917, -7831, -13210, -10108, -7389, -3258, +1230, -3476, 6726, 2986, 106, 1276, -6798, -1597, 3567, 6071, 11978, 16062, 7357, -3799, -8602, -8931, +-4679, -1861, -9314, -15769, -9731, -5528, -5146, -3239, -12115, -1541, 6100, 13861, 20513, 23983, 19887, 13766, +7529, -9171, -15639, -19083, -11575, -6667, 1079, 5003, 1178, 10427, 2352, -734, -3551, -12257, -7262, -2345, +1112, 10023, 14356, 4599, -4373, -5190, -2733, 3682, 5436, -2205, -8820, -3032, -4059, -5068, -10410, -19445, +-8923, -387, 9541, 17322, 21997, 18793, 15323, 7786, -8800, -14719, -15219, -5213, -713, 8626, 8852, 2862, +9749, -173, -1096, -4346, -11187, -6831, -1556, 2052, 11035, 13225, 1799, -9499, -11327, -8905, -1712, -651, +-5566, -10094, -1150, -1554, 1067, -6522, -11924, -1693, 6587, 15802, 20224, 22032, 16906, 12167, 886, -15329, +-22264, -23015, -13094, -7313, 5036, 5707, 4956, 13298, 3700, 4424, 176, -4840, -839, 2257, 4618, 14761, +15945, 5123, -6143, -9094, -9490, -3640, -4435, -9876, -14688, -5535, -7247, -1864, -10069, -11114, -445, 7447, +16281, 20955, 21237, 15811, 14331, 3071, -10479, -15734, -16964, -9158, -5449, 5630, 3506, 4233, 8893, -1774, +-1105, -7032, -9915, -5737, -2043, 2149, 13307, 15906, 8508, 905, 294, -759, 2294, -1559, -9591, -16370, +-8150, -10961, -5863, -13721, -11440, -2090, 6653, 14300, 16990, 19321, 15984, 14705, 3293, -9216, -13898, -13796, +-7668, -5561, 5585, 3100, 8536, 13341, 4066, 4330, -4637, -8865, -5849, -4481, -1249, 7339, 8612, 2353, +-2487, -2249, -2103, 880, -2991, -11075, -13892, -4951, -5552, 551, -7014, -2646, 5066, 10170, 13102, 12520, +11761, 8648, 7702, -3601, -13125, -15505, -12848, -6432, -4458, 4545, 1121, 9107, 12041, 6459, 7890, -1459, +-4934, -2599, -3651, 372, 7225, 7818, 1595, -2259, -2301, -286, 33, -5501, -16035, -17569, -10142, -7557, +-1525, -6738, 124, 8712, 15476, 17772, 16330, 14801, 11810, 10841, -294, -9957, -13229, -11716, -8889, -7988, +-593, -5189, 3151, 3635, 1297, 5237, -2386, -4639, -1256, -1919, 4428, 11269, 11754, 3349, 1155, 432, +4080, 2024, -5129, -18248, -18718, -14766, -10481, -5537, -9136, -1250, 8120, 14644, 15034, 13019, 11737, 9183, +7982, -630, -6782, -8327, -5865, -4067, -2986, 3206, -1705, 6018, 4156, 3138, 5650, -2403, -4694, -3271, +-5203, 903, 5259, 6405, -1623, -1218, -258, 6318, 3311, -2047, -14806, -13404, -11569, -6180, -3756, -6183, +590, 7554, 11904, 10866, 8843, 8099, 5512, 3530, -3747, -8266, -9136, -5378, -3669, -1717, 3579, 78, +7607, 3897, 3740, 5267, -1988, -2620, -1002, -1664, 4563, 6932, 6483, -2778, -1868, -1670, 4191, -866, +-5355, -17392, -15021, -13671, -6266, -4144, -3379, 4502, 11279, 14459, 13350, 12143, 11680, 8035, 4571, -4174, +-9935, -11304, -8512, -8172, -4210, 631, -1568, 6454, 3516, 4917, 6003, -1718, -1921, -218, 1425, 7886, +9712, 7080, -2892, -1566, -2011, 2036, -3451, -7607, -18160, -14242, -11960, -5180, -4654, -3961, 2295, 7849, +9536, 9515, 9805, 11110, 9769, 8260, -392, -5767, -7682, -6124, -5567, -1028, 1042, -1222, 5180, 1910, +4342, 3587, -5790, -5051, -3893, 294, 7361, 10089, 6800, -949, 230, 478, 3723, -1976, -7380, -16321, +-12541, -8998, -2708, -2581, -1975, 2542, 6386, 6721, 6220, 5237, 7294, 6951, 6836, -1048, -5688, -7444, +-6122, -5700, -651, 129, -939, 5314, 3027, 6299, 5116, -4350, -3109, -3448, 2024, 7499, 10629, 5391, +-1562, -2133, -1758, -837, -4943, -10645, -17158, -13277, -7485, -1341, 608, 1991, 6457, 10016, 9311, 7720, +6193, 7958, 6380, 6490, -1963, -6669, -8205, -7601, -7532, -2281, -2393, -1553, 4550, 3535, 7527, 5367, +-4527, -2266, -4085, 1908, 6442, 10873, 4680, 363, -629, 665, 171, -2888, -10315, -15660, -13718, -8062, +-3726, -1106, 15, 4483, 7536, 6545, 4956, 3743, 6809, 6549, 7713, -440, -3834, -5113, -5005, -4926, +-1470, -3207, -1031, 3906, 3000, 6562, 3393, -4924, -773, -2773, 4434, 7438, 11131, 3513, 413, -2124, +-125, -1372, -3678, -10941, -14527, -13354, -7181, -4081, -1106, -34, 5361, 8074, 7897, 5785, 4442, 7816, +6867, 7073, -2158, -5459, -6466, -5825, -5427, -2482, -3478, 170, 4309, 3461, 6226, 1589, -5115, 63, +-952, 6826, 8454, 10776, 1065, -1843, -4217, -1281, -2512, -4263, -10742, -12948, -10949, -4320, -2533, -154, +-573, 4994, 6777, 6598, 4585, 4266, 7043, 6458, 6271, -3462, -5354, -5457, -4361, -2340, 451, -775, +2765, 4769, 2049, 3374, -3039, -7772, -1684, -335, 8505, 10589, 11726, 938, -2331, -4003, -685, -1187, +-3566, -9655, -12507, -10274, -4595, -3440, -1705, -3319, 2666, 4505, 6219, 5015, 6692, 9040, 8490, 6666, +-4352, -6502, -7311, -5943, -3425, -1238, -1345, 2853, 4649, 1992, 3625, -3526, -5440, 48, 2799, 10904, +12746, 11539, -259, -5258, -6648, -3954, -3246, -5555, -9329, -11903, -7468, -1551, 385, 1633, -603, 4903, +4861, 6299, 4004, 6821, 7771, 6941, 3634, -7267, -8191, -8384, -5953, -2600, -364, 447, 4347, 5123, +1285, 2150, -6164, -6236, -2234, 2434, 10109, 13133, 11272, 1082, -3750, -3626, -1785, -874, -4642, -8287, +-12986, -8474, -4734, -2472, -1398, -2958, 2591, 1951, 4705, 3541, 9195, 10474, 11169, 6949, -3795, -4524, +-6038, -4226, -2422, -2008, -955, 2865, 3095, -490, 838, -7565, -5180, -1801, 4408, 10767, 13894, 9887, +218, -5019, -4270, -2751, -1467, -5404, -7766, -12490, -6221, -3413, -99, 597, -261, 4529, 2633, 3883, +655, 5910, 6121, 7528, 1758, -7918, -7157, -7373, -3321, -362, 776, 2707, 6683, 6423, 2688, 2736, +-6371, -3489, -2152, 4466, 9296, 12047, 6244, -2668, -6338, -4260, -2030, -728, -5030, -7902, -12344, -5185, +-4119, -355, -455, -16, 4733, 3505, 4434, 1166, 7247, 7311, 9611, 2906, -5794, -5387, -6431, -2801, +-1765, -1515, -263, 2766, 1692, -894, -280, -7181, -2074, 260, 8155, 12852, 14961, 7587, -2083, -5296, +-3759, -1592, -1894, -6642, -10728, -14450, -6988, -6688, -1433, -1559, 987, 6008, 5831, 6341, 3164, 8086, +6567, 8807, 765, -6284, -5088, -5550, -1217, -756, 143, 1419, 4087, 1337, -783, -1474, -7313, -2531, +-583, 6519, 10799, 11717, 4534, -4231, -4965, -2417, 2165, 920, -2741, -8091, -11014, -4580, -5602, -924, +-2897, -187, 2865, 3014, 2732, 483, 5796, 4534, 7040, -1022, -5249, -3573, -3450, 720, -260, 1262, +2336, 4669, 931, -423, -2665, -6759, -2316, 414, 7157, 11142, 10442, 3499, -5672, -4607, -2296, 2671, +-685, -3277, -9791, -10735, -4958, -5620, 70, -1195, 3264, 5386, 5856, 4336, 2888, 7273, 5085, 6093, +-3545, -6793, -5974, -5873, -2216, -3766, -1307, 730, 4649, 1293, 1426, -1674, -4278, -539, 3259, 9165, +12431, 9700, 2458, -6878, -4360, -2183, 2874, -2378, -4181, -11318, -10267, -5745, -5668, -488, -2458, 2321, +3222, 4056, 2240, 2986, 7869, 7197, 8306, -1392, -3011, -3195, -2906, -298, -2904, -647, 770, 3828, +-131, 83, -4560, -6199, -3100, 1676, 7810, 11697, 8630, 1773, -6256, -2225, 510, 5076, -1383, -3346, +-11622, -8834, -5596, -4670, -272, -2448, 1852, 1612, 2188, -390, 1878, 6359, 6745, 7656, -1817, -2150, +-3363, -2589, -865, -3004, -600, 1324, 4558, 1181, 1726, -2938, -4001, -1908, 2478, 7911, 10600, 7142, +-433, -7088, -2697, 729, 4022, -2290, -4295, -12515, -7713, -5382, -2710, 1290, -291, 3612, 2171, 2049, +-1165, 2057, 5327, 6147, 6272, -2610, -1709, -3793, -2269, -2033, -3869, -1461, 1333, 3983, 1559, 2255, +-2023, -2538, -434, 2857, 7822, 9254, 6066, -2275, -6278, -2356, 1942, 3427, -2480, -5428, -13365, -7802, +-6662, -2378, 1216, 935, 4233, 2094, 1553, -1774, 2534, 5529, 7453, 6781, -750, 741, -2500, -654, +-2742, -4838, -3126, -13, 1523, 208, 603, -2695, -2703, 129, 2932, 8308, 8513, 6594, -2094, -3581, +-291, 4827, 3809, -1531, -5904, -13287, -7758, -7971, -3000, -168, 635, 3405, 1289, 303, -2866, 2136, +4463, 7300, 5890, -405, 1093, -2620, -30, -3285, -4434, -2760, 1185, 2088, 1908, 1419, -1474, -2041, +611, 1990, 7300, 5852, 4334, -4731, -3568, -275, 5905, 3358, -509, -5751, -10965, -5304, -6194, -970, +580, 1712, 3496, 1172, -781, -3897, 1277, 3112, 6694, 4477, -489, 471, -3432, -271, -4175, -4013, +-2200, 1795, 1697, 1670, 326, -1693, -1959, 1560, 3029, 8610, 6195, 4554, -5136, -2946, -405, 5902, +1756, -1226, -7398, -10656, -5583, -6515, -1272, -457, 1167, 2684, 1125, -523, -2443, 3044, 4801, 8777, +5464, 1334, 903, -3478, -941, -5467, -4313, -1969, 1950, 1618, 1471, -514, -2041, -1999, 1557, 3644, +8934, 6039, 3870, -5505, -3031, -514, 5332, 316, -1661, -8411, -9475, -4938, -5492, -642, -373, 891, +1630, 353, -1344, -2143, 3184, 4752, 8894, 4912, 2021, 525, -3041, -1248, -5587, -3511, -514, 2874, +2326, 1189, -1409, -3390, -2910, 325, 3461, 7822, 5706, 2932, -5058, -2020, 1536, 6385, 1086, -425, +-7660, -7283, -4273, -4521, -502, -802, -145, -214, -1639, -3333, -2760, 2755, 5003, 9163, 4747, 3218, +280, -2572, -2123, -6431, -4240, -291, 3001, 3466, 1948, -377, -3086, -2026, 425, 4662, 7515, 5810, +1502, -5213, -2906, 1192, 4373, -816, -2045, -8528, -6415, -4190, -3165, 550, 491, 863, 364, -1372, +-3335, -2059, 3137, 5781, 9479, 4690, 3702, -781, -2366, -2976, -6889, -4878, -525, 2270, 3775, 1581, +-122, -3461, -1566, 269, 6039, 7234, 6236, 789, -4455, -2644, 2432, 3836, -561, -2066, -8217, -5305, +-4384, -3013, 33, -76, -159, -627, -2560, -4612, -2413, 2670, 6048, 9513, 4842, 4278, -1170, -1547, +-2943, -6026, -4192, 248, 2267, 3880, 594, -673, -4706, -1881, -390, 6670, 7005, 6913, 387, -3580, +-2113, 3530, 3825, 685, -1504, -7018, -4159, -4636, -3314, -893, -1023, -1027, -1112, -2642, -4232, -1607, +3129, 6898, 9241, 4646, 3893, -2377, -1699, -3496, -5821, -3844, 316, 1657, 3233, -313, -853, -4457, +-735, 735, 7957, 7011, 6491, -1149, -4661, -3640, 2166, 2093, 768, -1577, -5526, -2611, -3613, -2242, +-118, -434, -691, -988, -2885, -4419, -1651, 2553, 6477, 7728, 3848, 3122, -2550, -729, -2517, -4173, +-1603, 1959, 2668, 3117, -1119, -2141, -5047, -1086, 622, 7466, 6399, 5668, -1783, -4662, -3322, 2157, +1528, 1349, -1630, -4607, -2865, -4783, -3951, -1784, -1855, -1375, -964, -2266, -2830, 572, 4718, 8652, +8386, 4740, 2710, -2858, -1390, -3764, -5263, -2087, 736, 1935, 1630, -2153, -3184, -4611, -525, 2378, +8492, 7412, 5780, -1533, -4543, -2719, 2023, 978, 1485, -1570, -2875, -1852, -3745, -3181, -1295, -1913, +-1328, -1652, -3553, -3852, -538, 3601, 8071, 7102, 4291, 1458, -3100, -1563, -3471, -4319, -20, 2107, +3872, 2009, -1685, -4057, -4798, -1413, 2508, 7583, 6968, 4351, -2342, -5028, -2060, 2039, 1221, 2002, +-1287, -1434, -1468, -3504, -3411, -1727, -2837, -2027, -2686, -4433, -4080, -389, 4204, 9071, 7780, 6029, +2064, -2111, -1488, -3672, -4510, 202, 1438, 3704, 518, -2261, -4992, -4223, -1261, 3991, 8228, 8012, +4503, -2033, -5132, -1563, 1272, 398, 966, -2517, -1976, -2517, -3929, -3221, -884, -2109, -945, -1944, +-3631, -3035, 178, 4054, 7969, 6115, 4881, 276, -2929, -2546, -4156, -4142, 1189, 2093, 4905, 767, +-1294, -4635, -3302, -1165, 4183, 7176, 6877, 2606, -3187, -5343, -448, 2257, 2608, 2721, -838, -590, +-2690, -4386, -3615, -1446, -3087, -1966, -3573, -4751, -3448, 22, 4554, 8363, 6880, 6373, 1293, -1390, +-1455, -3949, -4356, 140, 417, 3187, -1394, -2693, -5484, -3110, -587, 5514, 7909, 7028, 2169, -3583, +-5272, 59, 1894, 2880, 2509, -771, -988, -3513, -4857, -3207, -393, -1694, -607, -2918, -4164, -3046, +-165, 4108, 7175, 6014, 5474, 627, -1139, -1079, -3549, -3221, 582, 1129, 3803, -750, -1889, -4615, +-2688, -205, 5409, 7155, 5377, 415, -5144, -5849, -8, 1657, 3644, 2733, -75, -1085, -4279, -5712, +-3434, -743, -1856, -648, -3237, -3952, -2586, 299, 5064, 7561, 6931, 5734, 565, -949, -693, -3654, +-2688, 124, 977, 2780, -1324, -2911, -5180, -3422, -47, 5367, 7354, 5183, 611, -5027, -4877, 807, +2176, 4740, 3148, 914, -842, -4238, -5780, -2894, -741, -1903, -1049, -3991, -4400, -3075, -94, 5064, +7080, 6973, 4814, -263, -1538, -1075, -4181, -2204, -356, 1363, 2314, -1075, -2828, -4236, -2753, 1340, +6129, 7959, 4994, 479, -5468, -4615, 205, 1375, 4347, 2352, 978, -1188, -4538, -5855, -2216, -844, +-1994, -1395, -4456, -4486, -3170, 132, 5585, 7299, 7667, 4696, -226, -1326, -594, -3656, -755, 227, +2553, 2166, -1042, -3625, -4641, -3401, 1132, 5448, 7281, 4027, 242, -5423, -3558, 575, 1850, 4552, +2150, 1103, -1785, -5030, -6101, -1976, -1162, -1917, -1735, -4603, -4334, -3369, 325, 5872, 7386, 8019, +4541, -261, -1359, -998, -4166, -877, -373, 2885, 1885, -1000, -3800, -4366, -3138, 1601, 5369, 6637, +3216, -30, -5191, -2077, 1289, 2775, 4941, 2219, 1362, -1884, -4952, -5651, -1284, -1253, -1757, -2228, +-5072, -4492, -3704, 552, 5956, 7503, 8093, 4325, -405, -1470, -1765, -4773, -1388, -768, 3185, 1993, +-892, -3652, -4190, -2554, 2037, 5457, 5909, 2260, -1096, -5878, -1761, 878, 2895, 4462, 1878, 1137, +-1957, -4449, -4412, 299, -305, -822, -2210, -5233, -4787, -4417, 489, 5418, 7485, 8073, 4477, -15, +-608, -1687, -4408, -1525, -625, 3439, 2032, -1330, -4084, -5073, -2666, 1807, 5590, 5745, 2542, -909, +-4983, -179, 1523, 3884, 4171, 1256, -72, -3614, -6194, -5498, -854, -1806, -1533, -2791, -4875, -3588, +-2989, 2644, 6708, 8518, 8099, 4272, -446, -509, -2332, -4307, -1836, -95, 3634, 2173, -1612, -3933, +-5295, -2284, 1561, 5448, 4706, 1633, -2304, -5766, -444, 1176, 4727, 4852, 2714, 1302, -2045, -4589, +-3516, 426, -1556, -1852, -4046, -5975, -4624, -3834, 2182, 5354, 7524, 6822, 3569, -736, 98, -2228, +-3092, -1454, 854, 3780, 1821, -2597, -4182, -5661, -1626, 2105, 6382, 5043, 2373, -2314, -5274, -346, +625, 4671, 4149, 2301, 625, -2813, -5457, -3746, -206, -2207, -2169, -4444, -5373, -3567, -2288, 3911, +6112, 7832, 6170, 2907, -1320, 39, -2819, -2773, -1598, 1818, 4119, 2012, -2686, -3931, -5413, -850, +2360, 6827, 4742, 2325, -2910, -5002, -690, 111, 4290, 3220, 1967, 306, -3102, -5770, -3596, -593, +-2500, -2408, -5064, -5233, -3394, -1410, 4870, 6532, 8069, 5906, 2680, -1253, 374, -2937, -2182, -1398, +2290, 3940, 1331, -3662, -4928, -6330, -1626, 1634, 6437, 4195, 2562, -2840, -3595, 223, 1156, 5366, +4048, 3142, 1422, -1982, -5076, -2940, -998, -3407, -3633, -6541, -5978, -4202, -1215, 4844, 6692, 8280, +5798, 2222, -1444, -133, -3431, -2032, -1177, 2778, 4142, 1005, -3424, -4870, -5849, -1312, 1881, 6470, +3916, 2278, -3882, -3690, -890, 370, 4275, 3009, 2853, 1580, -1325, -3898, -1305, -92, -2436, -2974, +-6253, -5012, -3947, -498, 4581, 6328, 7449, 5048, 1165, -1840, -845, -3583, -1726, -390, 3366, 4334, +291, -3549, -5369, -5434, -909, 2734, 6946, 4223, 2746, -3683, -2485, -676, 882, 3954, 2425, 2171, +667, -2586, -5245, -2549, -1847, -3752, -3882, -6515, -3911, -2839, 1436, 5559, 7392, 7891, 5708, 1278, +-1142, -988, -3240, -1627, 157, 3479, 4110, -841, -3962, -6318, -5340, -1071, 2894, 6257, 3341, 1702, +-4669, -2253, -818, 1722, 4447, 3484, 3591, 2060, -1461, -4166, -1925, -2233, -4396, -4954, -7234, -3964, +-3427, 1360, 4430, 6601, 6986, 5570, 1165, -31, -600, -2285, -1316, 512, 3047, 3470, -2159, -4425, +-6960, -4633, -400, 4306, 6657, 3591, 1359, -5003, -2003, -1262, 1735, 3720, 2899, 3138, 1756, -1817, +-3993, -1574, -2312, -4105, -4617, -6363, -2865, -2808, 1957, 3715, 5737, 5442, 4351, -77, -170, -1101, +-1683, -811, 1847, 4321, 4586, -1540, -3609, -6869, -3779, -150, 4874, 6237, 3324, 301, -5535, -2128, +-1748, 1864, 3387, 2870, 3059, 1452, -2598, -4534, -2358, -3571, -4946, -5458, -6057, -2011, -1630, 3445, +4623, 6768, 6112, 5071, 294, 593, -1142, -1651, -1541, 1053, 3119, 2898, -3286, -5013, -8079, -3917, +-102, 5863, 6610, 4414, 735, -4456, -1280, -1244, 2531, 3604, 3503, 3678, 1976, -2215, -3876, -2179, +-4104, -5356, -6247, -6003, -2357, -1666, 3291, 4057, 6156, 5274, 4093, -377, 523, -1187, -1048, -792, +1986, 4150, 3097, -3036, -5037, -8178, -3734, -233, 5750, 5523, 3796, -811, -5000, -2168, -1953, 2371, +3613, 4147, 4699, 2944, -1510, -2815, -1505, -3958, -4964, -6461, -5511, -2500, -1471, 2961, 3578, 5508, +4837, 3524, -410, 679, -801, -676, -400, 2028, 4166, 2058, -3585, -5750, -8090, -3123, 524, 6703, +5763, 4725, -466, -3597, -1707, -1671, 2128, 2736, 3115, 3328, 1158, -3377, -4148, -2642, -4893, -4955, +-6162, -3981, -1554, 200, 3951, 4542, 5986, 5196, 3045, -352, 228, -1101, -1070, -359, 2008, 4646, +1632, -3231, -5669, -7180, -2421, 817, 6273, 4438, 3597, -2097, -3757, -2329, -1623, 2417, 3293, 4121, +4634, 2140, -2629, -3371, -2487, -5099, -5065, -6831, -4230, -2883, -622, 2686, 4062, 5780, 6009, 3762, +1278, 1361, 80, -629, -49, 1562, 3990, -122, -4408, -7233, -7540, -2636, 1122, 6355, 4380, 4081, +-1702, -2266, -1578, -829, 2482, 3046, 3687, 4111, 1480, -3025, -3447, -2703, -5022, -4615, -6131, -2974, +-2581, -93, 2143, 3579, 4853, 5132, 2278, 516, 150, -356, -700, 699, 2717, 5429, 487, -3145, +-6424, -5962, -1591, 2082, 6096, 3810, 3261, -2822, -2604, -2461, -1181, 1997, 2687, 3328, 3780, 982, +-3279, -3514, -3293, -5468, -4974, -6098, -2425, -2326, 599, 2287, 4154, 5401, 5942, 2748, 1317, 330, +-181, -793, 599, 2408, 4536, -1161, -4551, -8025, -6221, -1821, 2607, 6100, 4312, 3628, -2226, -1545, +-1928, -280, 2490, 3224, 3917, 4274, 1069, -3097, -3385, -3853, -5828, -5647, -6261, -2445, -2470, 729, +1963, 3882, 5101, 5563, 2363, 1400, 233, -298, -743, 721, 2913, 4458, -1636, -4893, -8283, -5622, +-1524, 3348, 5720, 4230, 2898, -2615, -1748, -2422, -358, 2250, 3177, 3993, 4416, 1105, -2623, -2527, +-3515, -5177, -5388, -5546, -2237, -2347, 704, 1547, 3371, 4607, 4676, 1849, 1212, 358, -76, -127, +1133, 3742, 4389, -1753, -5116, -8517, -5320, -1516, 3737, 5348, 4516, 2641, -2167, -1388, -2166, 129, +2293, 2906, 3424, 3498, 124, -3379, -3147, -4425, -5484, -5936, -5143, -2193, -1861, 1316, 2353, 4101, +5581, 4914, 2210, 1172, 340, -413, -124, 871, 4072, 3921, -1783, -5137, -8235, -4860, -1380, 3940, +4774, 4613, 2106, -2128, -1647, -2526, -19, 2095, 2780, 3552, 3637, 187, -2954, -2555, -4314, -5154, +-6287, -5080, -2763, -1951, 1074, 2512, 4322, 6091, 4881, 2637, 1268, 762, -264, 231, 860, 4249, +2865, -2560, -6268, -8820, -5101, -1632, 3809, 4343, 4956, 2094, -1363, -1372, -2274, 262, 2116, 2788, +3713, 3608, 161, -2588, -2177, -4110, -4710, -6243, -4534, -3104, -2008, 731, 2210, 3826, 5532, 3528, +1758, 446, 435, -166, 1058, 1752, 5457, 3168, -1985, -5963, -7951, -4456, -1010, 4062, 4201, 5140, +1780, -1102, -1473, -2280, 132, 1774, 2391, 3392, 2965, -848, -3401, -3173, -5086, -5337, -6569, -4220, +-2970, -1157, 1548, 3247, 4874, 6234, 3724, 1997, 391, 538, -38, 1009, 1606, 4976, 1746, -2966, +-7031, -7932, -4121, -158, 4358, 4380, 5210, 1514, -825, -1611, -2166, 399, 2024, 2845, 4096, 3466, +-500, -2712, -2978, -4902, -5354, -6582, -4254, -3514, -1584, 987, 2544, 4447, 5672, 3319, 1765, 464, +766, 584, 1544, 2299, 5175, 1119, -3552, -7785, -7884, -4148, 233, 4031, 4245, 5012, 1266, -668, +-1577, -1891, 542, 1990, 2908, 4178, 3447, -631, -2537, -3130, -4792, -5446, -6154, -3742, -3056, -996, +1480, 2522, 4532, 4969, 2719, 1033, 198, 551, 902, 1592, 2848, 5294, 778, -3810, -8051, -7490, +-3773, 1002, 4107, 4547, 4865, 1140, -461, -1550, -1754, 416, 1518, 2483, 3702, 2834, -1152, -2607, +-3691, -5110, -6083, -6218, -3828, -2792, -486, 2239, 2972, 5340, 4893, 2910, 778, 297, 388, 1208, +1544, 3401, 5198, 425, -4300, -8450, -7331, -3642, 1515, 4058, 4850, 4668, 948, -654, -1926, -1912, +345, 1543, 2719, 3940, 2957, -986, -2137, -3772, -5259, -6770, -6430, -4249, -2670, -159, 2582, 3013, +5803, 4618, 3188, 903, 976, 970, 2051, 1770, 3899, 4671, -463, -5457, -9370, -7866, -3930, 1459, +3746, 5017, 4459, 1016, -554, -1911, -1639, 644, 1735, 3007, 4096, 2890, -716, -1619, -3473, -4806, +-6752, -6092, -4148, -2339, 135, 2585, 2406, 5037, 3104, 2002, -152, 686, 869, 2366, 2048, 4649, +4835, -163, -5254, -8589, -6843, -2728, 2476, 4230, 5376, 4301, 992, -712, -2177, -1738, 490, 1572, +2723, 3429, 1761, -1685, -2514, -4230, -5488, -7331, -6129, -4101, -1836, 1039, 3170, 3117, 5530, 3072, +2194, 126, 1288, 1438, 2546, 1786, 4446, 3811, -1073, -6085, -8709, -6777, -2191, 2604, 4219, 5391, +4017, 946, -681, -2115, -1239, 1047, 2142, 3229, 3851, 1815, -1293, -2322, -4080, -5652, -7560, -6383, +-4408, -2287, 830, 2599, 3092, 5219, 2886, 2097, 426, 1802, 2111, 2911, 1919, 4325, 2934, -1870, +-6876, -8777, -6815, -1863, 2516, 4190, 5301, 3958, 1141, -608, -2079, -977, 1066, 2219, 3166, 3697, +1426, -1150, -2253, -3705, -5496, -7077, -5842, -3719, -1855, 1307, 2265, 3054, 4503, 2238, 1368, 115, +1611, 2275, 3010, 2221, 4624, 2983, -1849, -6867, -8566, -6614, -1587, 2446, 4151, 5171, 3851, 1078, +-645, -2138, -945, 1051, 2229, 3164, 3699, 1414, -1302, -1256, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, -64, -93, -89, -57, +42, 243, 125, 79, 147, -69, -217, -50, 112, -103, 133, 496, -183, -379, 113, 61, +-205, 95, -36, 94, 55, 79, -54, -54, -26, -438, 84, 162, -177, 323, 486, 95, +55, 62, -171, -476, 94, 355, -13, 284, 163, -288, 110, -204, -482, 337, 139, -321, +-39, 262, -245, -326, -79, 104, 201, 783, 1152, 1999, 2828, 3464, 5880, 10133, 10166, 1714, +-1321, 2781, -302, -9962, -11106, -8680, -7727, -5801, -8034, -2600, -4281, -7790, -6036, -893, -3191, -3549, +-6, -4355, -8438, -4026, -474, -5713, -6555, 3600, 11875, 4484, 8354, 16717, 21602, 20399, 15985, 12766, +19674, 14379, 9982, 9110, 5567, -2003, -7318, -11077, -15344, -13254, -8474, -7619, -14680, -5234, -10960, -13537, +-12984, -8529, -9625, -8292, -13025, -17320, -14268, -8287, -6292, -10655, 370, 11164, 11341, 7705, 16546, 25609, +30461, 28215, 20967, 19225, 22274, 11049, 9257, 5255, 1790, -3584, -5188, -16766, -15675, -12715, -6881, -12647, +-10430, -4029, -10337, -10364, -10769, -10170, -11492, -9397, -16817, -16939, -12894, -4456, -5072, -6765, 3109, 11280, +9309, 9298, 20163, 28466, 28559, 26649, 18416, 18244, 10991, 6729, 8118, 4136, -2361, -3753, -8265, -17890, +-13959, -10095, -5915, -11863, -4496, -3428, -7776, -9300, -6950, -7975, -7839, -11230, -16162, -14156, -9507, -1109, +-5227, -1203, 8571, 10716, 3998, 8513, 20248, 25153, 24798, 21800, 15426, 14645, 1801, 2897, 3932, 384, +-7325, -2596, -10319, -13231, -11310, -4538, -5624, -6996, -721, -1232, -4902, -6198, -5384, -6608, -8226, -14097, +-14276, -11469, -5328, -1329, -6852, 1622, 10250, 6662, 2149, 11361, 23072, 23411, 22972, 16698, 15304, 6130, +-3894, 157, 1695, -3481, -6046, -1660, -11099, -10989, -8673, -2629, -8499, -3617, -1169, -181, -5018, -5270, +-7433, -7413, -12531, -17454, -14097, -10886, -2371, -3036, -4610, 5993, 12033, 4390, 4286, 15405, 24940, 22581, +22179, 16176, 18105, 1933, -869, 913, 2924, -6818, -832, -2245, -8291, -8280, -2972, -3418, -7236, -2576, +-2665, -1821, -6990, -7802, -9383, -10134, -17909, -19233, -14249, -9998, -1344, -6365, -3020, 8068, 10531, 1486, +6942, 18677, 24356, 22954, 18472, 17267, 14728, -2425, 1364, 1966, 1884, -7742, 2614, -4826, -5803, -6981, +2539, -5643, -3603, -3149, -2829, -4211, -7572, -9427, -8137, -11883, -19862, -18194, -12987, -7545, -1179, -8018, +-449, 10689, 7092, 1116, 10340, 20852, 22466, 22334, 13620, 19004, 7428, -3477, 1049, 2696, -2390, -5743, +1897, -6935, -4937, -4302, 4436, -6206, 637, -3272, 152, -4447, -5629, -8164, -5386, -12870, -18801, -15008, +-10560, -2734, -1532, -6559, 3363, 12686, 2637, 1605, 12126, 20136, 20290, 18997, 10030, 18837, -2101, -3712, +-2484, 1743, -8993, -2814, -2652, -6310, -6696, -922, 1457, -5692, 900, -3472, 1390, -4806, -4554, -7042, +-4817, -14259, -17802, -11172, -7359, 2605, -2494, -3302, 7781, 13120, 118, 4917, 15309, 19797, 20714, 15214, +11419, 16423, -7403, -1300, -3001, 1592, -12618, 1635, -7359, -3864, -8775, 3191, -4387, -3699, -2390, -2933, +-822, -5610, -6370, -6962, -7805, -16226, -17579, -9468, -5675, 4446, -5417, -331, 10729, 10881, -1132, 7870, +17808, 19634, 21818, 11717, 17323, 12080, -6394, 1239, -364, 5, -10333, 4180, -9047, -1475, -8522, 6394, +-8600, -458, -6075, -1086, -4739, -6268, -9621, -7288, -11886, -18724, -18045, -9514, -4267, 2803, -7743, 1335, +12420, 6089, -1616, 9977, 18533, 18605, 21710, 9388, 22941, 5197, -2596, 903, 3426, -4261, -3690, 2226, +-5771, -1452, -4145, 6256, -9305, 1073, -7308, 519, -7430, -5563, -10437, -6675, -13879, -19483, -15450, -9211, +-539, -34, -7108, 3748, 13820, 1213, 36, 12028, 17863, 18658, 18837, 8700, 24303, -2757, 845, -1254, +5286, -9970, 2648, -3468, -1635, -5226, 937, 1390, -7601, -958, -6361, -200, -7883, -5813, -9407, -7165, +-14138, -19532, -10797, -8105, 4364, -2851, -4264, 6438, 13831, -1903, 3152, 13928, 16918, 19488, 13943, 11280, +20714, -7723, 3079, -2933, 4689, -13336, 6433, -8931, 2096, -9652, 6346, -5200, -3825, -4284, -3569, -2580, +-6348, -7163, -7354, -8629, -13804, -18753, -6900, -7047, 7506, -5819, -1281, 9327, 11848, -3381, 6438, 15628, +15430, 20968, 8809, 16794, 13849, -7670, 2910, -1348, 1247, -11445, 6701, -10171, 3161, -10403, 9589, -9972, +-219, -7262, -665, -5682, -4829, -8966, -5810, -11025, -14572, -17738, -6143, -5590, 6990, -7917, 1004, 11756, +7516, -3186, 8592, 15679, 14924, 20880, 5024, 22885, 5179, -3718, 689, 2130, -4253, -5421, 3234, -6158, +1312, -6438, 9271, -10738, 1899, -8141, 1203, -7225, -3820, -9391, -5609, -11928, -16453, -14364, -7175, -1773, +3600, -8057, 2353, 13163, 2121, -1719, 9876, 14766, 14924, 18561, 4059, 25376, -3418, 550, -2526, 5868, +-10221, 2156, -2619, -548, -3298, 268, 4630, -8359, 910, -6894, 1227, -6998, -4020, -7708, -6342, -11116, +-18009, -9130, -8787, 3787, -658, -5658, 3956, 13694, -2007, 927, 10926, 13595, 16193, 13982, 6157, 23561, +-9289, 3413, -5086, 6807, -14710, 7176, -8814, 4194, -8774, 6419, -2196, -4417, -2495, -4538, -1016, -6094, +-5481, -5367, -8072, -9438, -18794, -4499, -9475, 8842, -4606, -2197, 6531, 13274, -3767, 3930, 12528, 12955, +18443, 9315, 11466, 18103, -10376, 3859, -4930, 4994, -14877, 9066, -11644, 6239, -11833, 10372, -8256, -961, +-6734, -1882, -4611, -5115, -7587, -4155, -10031, -9701, -18475, -2706, -8517, 10356, -7279, 593, 9085, 10846, +-4126, 6259, 13526, 12216, 20017, 5096, 18105, 10859, -7301, 2352, -1472, 1070, -10217, 7792, -9657, 5772, +-10314, 11495, -11414, 1567, -9238, 89, -7497, -4670, -8573, -4598, -10999, -11859, -16263, -3849, -5664, 8504, +-8470, 1407, 10991, 6052, -3565, 7134, 13745, 11416, 20042, 1854, 23285, 2396, -2381, -845, 3584, -4606, +-2745, 3268, -4346, 2357, -5425, 9574, -11064, 2143, -9548, 1199, -8731, -4301, -7621, -5746, -9730, -14741, +-11830, -6412, -336, 4264, -7160, 1777, 12560, 1458, -1844, 7810, 13365, 11346, 18500, 787, 25510, -5023, +2396, -4969, 7996, -11004, 4635, -3182, 1457, -3154, 778, 4558, -8743, 429, -8016, 370, -8553, -4811, +-5891, -7737, -7405, -17631, -6329, -9125, 5832, -580, -4248, 2511, 13658, -2189, 410, 8823, 12849, 12755, +15562, 2158, 25023, -9611, 5145, -7388, 10059, -15668, 10468, -9181, 6363, -8675, 6521, -1747, -5237, -3011, +-5664, -2190, -7732, -5890, -4194, -9579, -5586, -19669, -1596, -10563, 10534, -4523, -1276, 3947, 13660, -4006, +2590, 10515, 11811, 15093, 11375, 6420, 21305, -10737, 5948, -7201, 9075, -16617, 12702, -12451, 8995, -12306, +10779, -7414, -2017, -6632, -3031, -5218, -6649, -6882, -3386, -10345, -5372, -19488, 480, -10199, 12705, -7039, +616, 5770, 11797, -4644, 3836, 12119, 10028, 17866, 6358, 11744, 15100, -8736, 3633, -4121, 5108, -13685, +11491, -12140, 8637, -12683, 12653, -10846, 805, -9199, -346, -7530, -5440, -6598, -3438, -9237, -6871, -16649, +200, -7223, 11789, -7587, 1152, 8261, 8287, -4205, 4063, 13154, 8039, 19339, 1540, 16826, 7218, -5040, +-685, 301, -1324, -7957, 7005, -8767, 5679, -10123, 11882, -11785, 2159, -9734, 1567, -8735, -4347, -5160, +-4264, -6754, -9560, -11746, -2002, -2352, 8741, -6363, 839, 10726, 4243, -2843, 4007, 13796, 6676, 20136, +-2124, 21087, -220, -631, -5437, 5454, -8304, -894, 1103, -3343, 1157, -5515, 9057, -10832, 1937, -9136, +1951, -9298, -3920, -3806, -6286, -4334, -13355, -6753, -5712, 2862, 4261, -4616, 238, 12521, 398, -1421, +4562, 13983, 6683, 19722, -3552, 23935, -5982, 3491, -8995, 10057, -14300, 6271, -4829, 2676, -4193, 194, +4974, -8480, 288, -7415, 1020, -9435, -4093, -2933, -8504, -2509, -16709, -2361, -8901, 7361, -128, -2857, +107, 13113, -2226, -296, 5852, 13254, 8083, 17916, -2856, 24746, -9755, 6313, -10849, 12608, -17963, 11650, +-9632, 7845, -9031, 5829, 160, -5469, -2101, -4979, -926, -8857, -4475, -2642, -9979, -1781, -18810, 714, +-10718, 10633, -3335, -1758, 1117, 12442, -3535, 56, 8285, 11344, 10642, 14268, -57, 22563, -10835, 6564, +-10479, 12503, -18905, 14495, -12238, 11130, -12550, 10535, -4516, -2243, -5032, -2034, -3497, -7948, -4690, -2906, +-10413, -2119, -18598, 2251, -10442, 12169, -4960, -1078, 3245, 10711, -3569, 60, 11106, 8634, 13971, 9295, +4419, 17766, -9383, 4223, -7497, 9424, -16885, 13924, -12213, 11409, -14165, 13346, -8328, 414, -7742, 456, +-6518, -6822, -5004, -3719, -9661, -3564, -16468, 1955, -8169, 11940, -5306, -995, 5961, 8305, -2568, -54, +13903, 5799, 17565, 4085, 9950, 11467, -5858, 162, -2643, 4015, -12276, 10578, -9667, 9241, -13471, 13971, +-10897, 2015, -9691, 2130, -9177, -5837, -4913, -5134, -7873, -6060, -13025, 238, -4759, 10370, -4579, -1228, +8610, 5645, -1640, 13, 16006, 3453, 20457, -704, 15659, 4429, -1169, -4761, 3210, -2584, -5929, 5430, +-5227, 4955, -10388, 12466, -11571, 2345, -10238, 2948, -10871, -5029, -4562, -6899, -5566, -9066, -8609, -2305, +-543, 7840, -3573, -1530, 10413, 3229, -1096, 986, 16707, 2348, 21950, -4201, 19979, -1882, 3295, -9461, +9032, -9147, 879, -280, 221, -350, -5752, 9284, -10313, 1627, -9255, 2754, -11127, -4533, -3636, -8639, +-2892, -12082, -4133, -5029, 3598, 5088, -2870, -1407, 11258, 1291, -1499, 2655, 15415, 2455, 21057, -5798, +22140, -6671, 6183, -12733, 13028, -14578, 6692, -5323, 5416, -5672, -185, 5291, -7868, -78, -7117, 1598, +-10432, -4586, -2631, -10161, -640, -14554, -122, -7240, 7020, 2551, -2363, -769, 10903, 244, -2432, 5313, +13055, 4374, 18511, -5062, 21867, -9169, 7306, -13908, 14907, -17538, 10687, -8886, 9366, -10045, 4758, 1052, +-4969, -2422, -4525, -453, -9482, -4793, -2163, -11152, 486, -16013, 2493, -8669, 9531, 530, -2511, 600, +9816, -258, -3750, 8641, 9696, 7519, 14766, -2211, 19429, -9082, 6247, -12407, 14438, -17989, 12602, -10495, +11577, -12979, 8988, -2900, -1998, -4805, -1750, -2715, -8149, -4892, -2247, -11009, 410, -15822, 3797, -8803, +10982, -749, -2977, 2337, 8097, -254, -4859, 11911, 6033, 11344, 9955, 1981, 15178, -7109, 3391, -9033, +11602, -16104, 12032, -10011, 11503, -14481, 11651, -6281, 491, -6966, 730, -4807, -7026, -4641, -3214, -9780, +-914, -14102, 3487, -7526, 11253, -1422, -3629, 4194, 6492, -331, -5377, 14788, 2668, 15376, 4786, 7005, +9792, -3576, -845, -3884, 6891, -12453, 9688, -7900, 9623, -14133, 12899, -8619, 2323, -8561, 2590, -6545, +-6371, -4147, -4883, -7684, -3714, -11300, 1780, -5484, 10517, -1991, -4247, 5943, 4809, -517, -4980, 16726, +263, 18834, 177, 12146, 3893, 631, -5563, 1772, 1184, -7344, 5915, -4491, 6310, -12272, 12624, -9683, +3365, -9148, 3775, -7840, -6038, -3293, -6884, -4932, -6813, -7466, -856, -2347, 9211, -2308, -4088, 7369, +3836, -1069, -3558, 17504, -1053, 21016, -3603, 16457, -1698, 4399, -10318, 7190, -5100, -2049, 1293, -666, +1787, -9298, 10933, -9722, 3224, -9063, 4068, -8549, -6045, -2259, -8804, -2173, -9911, -3205, -3418, 1222, +7917, -2290, -3292, 8334, 3530, -1959, -1053, 16913, -888, 21728, -5936, 19299, -6181, 7520, -14156, 11743, +-10830, 3086, -3239, 3525, -3030, -5071, 8219, -8454, 2294, -8067, 3615, -8830, -5985, -1441, -10318, -69, +-12446, 336, -5989, 4563, 6450, -2688, -2177, 8445, 3201, -3656, 1971, 14581, 628, 20312, -6560, 20004, +-9002, 8847, -16300, 14635, -14918, 7490, -7037, 7522, -7669, -219, 4652, -6100, 549, -6128, 2602, -8576, +-5820, -1113, -11199, 1082, -13957, 2820, -7703, 7422, 4999, -3154, -677, 7897, 3418, -5675, 5761, 11273, +3765, 17069, -4785, 18538, -9425, 8271, -16002, 15551, -16871, 10583, -9461, 10613, -11621, 4447, 676, -3115, +-1901, -3787, 1045, -8433, -5464, -1641, -11127, 994, -14226, 3900, -8525, 9390, 3492, -3855, 868, 7034, +3442, -7650, 9640, 7223, 7802, 12429, -1312, 15047, -7553, 5591, -13169, 14136, -16457, 11781, -10313, 12358, +-14312, 8494, -3069, -35, -4451, -1252, -655, -8222, -4800, -2846, -9891, -432, -13013, 3550, -7987, 10496, +2351, -4439, 2377, 6041, 3157, -9196, 13396, 3064, 12410, 7010, 3682, 9909, -3758, 1219, -8562, 10665, +-13811, 10836, -9278, 12082, -15548, 11411, -6150, 2604, -6790, 1044, -2396, -8217, -3735, -4727, -7858, -2712, +-10616, 2104, -6511, 10811, 1341, -4965, 3724, 5316, 2272, -9545, 16147, -623, 16764, 1380, 8829, 4175, +854, -4209, -2536, 5388, -9317, 7955, -6607, 9957, -15085, 12584, -8101, 4324, -8552, 2901, -3963, -8316, +-2531, -6958, -5498, -5580, -7619, -163, -3987, 10452, 502, -4906, 4859, 5170, 842, -8619, 17637, -2696, +19923, -2929, 13699, -968, 5459, -9298, 3799, -462, -3850, 4001, -2633, 6366, -12904, 12143, -8789, 4730, +-9358, 4044, -5347, -8421, -1475, -9201, -3106, -8428, -4562, -2541, -1327, 9750, -408, -4528, 5420, 5299, +-1349, -6126, 17340, -3162, 21297, -5886, 16934, -4962, 8789, -13361, 9070, -6026, 1602, -734, 1742, 1611, +-9584, 10129, -8268, 3947, -9225, 4544, -6351, -8168, -694, -10641, -1041, -10549, -1610, -4455, 1630, 9145, +-1258, -3449, 5668, 5813, -4063, -2505, 15485, -1839, 20700, -6709, 18155, -7303, 10332, -15944, 12616, -10419, +5980, -4914, 5932, -3547, -5340, 6991, -6719, 2218, -8081, 4479, -7117, -7447, -345, -11145, 330, -11726, +627, -5791, 4191, 8576, -2526, -2284, 5454, 6110, -6995, 1736, 12051, 861, 18078, -5885, 17236, -7878, +9755, -16520, 14185, -13174, 9014, -8290, 9419, -8431, -633, 3357, -4233, -59, -5910, 3900, -7501, -6347, +-561, -10812, 675, -11809, 1816, -6418, 6339, 7805, -3644, -800, 5027, 6294, -9717, 6251, 7960, 4778, +14098, -3210, 14678, -6358, 7495, -14993, 13815, -13956, 10408, -10214, 11910, -12565, 4015, -448, -1305, -2725, +-3202, 2765, -7657, -5076, -1377, -9783, 132, -11307, 2078, -6528, 7937, 6690, -4700, 514, 4637, 5919, +-11802, 10362, 3729, 9284, 9235, 633, 10827, -3520, 3770, -11737, 11592, -12839, 10195, -10482, 12938, -15297, +7883, -4022, 1490, -5146, -274, 1290, -7465, -3840, -2633, -8459, -1077, -10319, 1587, -6126, 9235, 5280, +-5221, 1428, 4686, 4752, -12585, 13510, 209, 13497, 4311, 4999, 6409, 60, -795, -7274, 8023, -10012, +8384, -8939, 12392, -16322, 10709, -6494, 3850, -7056, 2347, -230, -7244, -2783, -4124, -6924, -2774, -9041, +680, -5605, 10316, 3390, -5309, 1859, 5023, 2734, -12114, 15285, -2270, 16766, -149, 9062, 2004, 3697, +-5431, -2295, 3783, -6157, 5522, -5892, 10248, -15389, 11949, -7812, 5081, -8076, 4182, -1593, -7322, -1780, +-5769, -5357, -4635, -7656, -355, -4661, 11167, 1395, -4543, 1978, 6018, 225, -10243, 15789, -3357, 18950, +-3340, 12382, -1577, 6959, -9577, 2503, -549, -1930, 1859, -2010, 6676, -13072, 11310, -8057, 4830, -8287, +4831, -2858, -7674, -1020, -7677, -3904, -6619, -6096, -1409, -3447, 11935, -704, -3455, 1877, 7192, -2574, +-7136, 15147, -3035, 19756, -5310, 14615, -4044, 9182, -12553, 6559, -4408, 2126, -1974, 2163, 2212, -9564, +9257, -7039, 3415, -7461, 4664, -3571, -8057, -83, -9338, -2425, -8338, -4335, -2600, -1750, 12325, -2434, +-2028, 1703, 8384, -5684, -3473, 13287, -1399, 19012, -5866, 15321, -5189, 10001, -14361, 9380, -7471, 5291, +-5463, 6080, -2468, -5551, 6195, -5260, 1200, -5868, 3758, -3845, -8246, 737, -10568, -936, -9802, -2479, +-3807, 592, 12066, -3646, -665, 1707, 9225, -8625, 623, 10472, 1186, 16877, -4959, 14565, -5039, 9218, +-14688, 10821, -9396, 7558, -8001, 9260, -6688, -1481, 2992, -3065, -1138, -3900, 2730, -4089, -8016, 1097, +-11228, 143, -10992, -646, -5155, 3043, 11015, -4271, 156, 1860, 9454, -11258, 4616, 7017, 4497, 13467, +-3023, 12570, -3798, 7281, -13686, 10873, -9968, 8428, -9436, 11338, -10015, 2129, 74, -942, -3157, -1986, +1834, -4339, -7180, 949, -11130, 801, -11611, 936, -6283, 5794, 9424, -4298, 600, 2393, 8950, -13234, +8246, 3547, 8081, 9465, -278, 9764, -1843, 4433, -11717, 9851, -9488, 8150, -9719, 12216, -12339, 4889, +-2412, 593, -4809, -549, 1179, -5083, -5905, -36, -10403, 726, -11635, 2088, -7296, 8344, 7544, -3787, +670, 3226, 7980, -14000, 10341, 1355, 10381, 6832, 1620, 7951, -488, 2711, -10301, 8952, -8785, 7622, +-9294, 12097, -12638, 5383, -2732, 729, -4862, -481, 1309, -5387, -5483, -383, -10096, 506, -11429, 1881, +-7099, 8338, 7384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 91, 78, 64, 76, 84, 76, 100, 156, 224, 433, -312, -957, +-234, 287, -1053, 257, -404, 79, -564, 148, 3151, 2386, 1989, 3027, 4097, 5945, 4465, 1728, +1267, 2650, 774, -1058, -2553, -2030, 488, -2682, -3303, -2484, -338, -2080, -3947, -5998, -7878, -5634, +-3235, -5575, -8287, -8014, -11043, -6932, -4883, -4925, -4466, -8335, -7427, -7090, -5047, -5330, -4000, -5796, +-2086, 771, -3185, -529, 404, 3823, 3694, 3608, 3633, 4652, 5551, 3748, 5532, 7950, 10734, 10794, +10249, 9193, 9856, 7779, 9183, 8983, 9281, 9818, 6120, 6018, 6501, 6869, 6084, 4617, 3176, 7306, +9965, 6763, 7701, 4124, 12095, 12306, 12807, 14389, 17262, 18814, 16320, 13091, 11269, 14676, 15095, 16226, +6458, 4589, 7000, 8035, 6472, 2022, 2345, 899, -2048, -1249, -3590, -5830, -3216, -4011, -9562, -10723, +-16904, -18194, -16646, -16071, -16693, -23139, -23124, -22907, -22265, -22115, -20209, -22314, -21041, -18173, -21291, -24806, +-22849, -20226, -19611, -14845, -14654, -15685, -13744, -14666, -15173, -14950, -13448, -8780, -10832, -8973, -6939, -10847, +-8369, -8125, -8527, -5190, -6371, -9109, -11344, -9459, -8378, -7652, -7299, -4458, -2314, 829, 3326, -515, +4921, 10093, 12594, 13710, 18551, 22008, 23540, 24931, 22046, 22190, 24379, 29838, 25929, 20442, 20466, 23183, +24982, 21277, 21857, 17898, 18695, 17504, 16793, 11862, 12476, 15229, 10398, 13018, 5358, 1818, -1068, 1620, +1331, -1524, -3971, -7854, -6864, -8251, -4461, -5365, -4301, -2093, -798, -4506, -6608, -6956, -8876, -4339, +-5189, -4946, -4718, -5010, -6121, -7226, -7528, -4811, -4506, -5765, -5000, -7866, -7003, -8052, -7599, -6769, +-6108, -6695, -10810, -10541, -12735, -8818, -11474, -8847, -9628, -5830, -1550, -3886, -3226, 1098, 6249, 6547, +13196, 15090, 19918, 20411, 21114, 19257, 17839, 25391, 26818, 22557, 17585, 17121, 18900, 18626, 17975, 15612, +15023, 12450, 15213, 9411, 7912, 8895, 7491, 9165, 4966, 1547, -3322, -2660, -3166, -2304, -6179, -9861, +-10679, -12248, -10245, -8733, -9475, -8546, -5566, -6356, -8241, -9527, -10742, -9800, -8183, -9101, -9521, -10477, +-11558, -12856, -15502, -14390, -13192, -13525, -13298, -14307, -15499, -16625, -15776, -16103, -14494, -14969, -16354, -19289, +-21663, -19223, -20336, -18792, -18702, -18682, -13162, -11676, -12867, -11360, -7146, -4632, 105, 3006, 8857, 11295, +13884, 16365, 10064, 14615, 18791, 21359, 15034, 12198, 12343, 13843, 13631, 13081, 12726, 7297, 13176, 9021, +8382, 7102, 7075, 9110, 8316, 8198, 2349, 723, -380, 2410, 289, -1438, -3632, -5290, -4631, -2359, +-745, -2440, 1896, 2924, 3725, 3744, 1205, 433, 2774, 3021, 3322, 3307, 1683, 2247, -1811, -1882, +-1989, -2580, -1224, -2592, -2139, -3832, -3174, -4865, -2406, -3263, -1165, -3885, -7302, -7136, -8474, -5877, +-7375, -7448, -6148, -767, -2396, -1300, -588, 1591, 5243, 6355, 12463, 13860, 17826, 21350, 19204, 16675, +19243, 25091, 23440, 19274, 14722, 16339, 14145, 15326, 14838, 8842, 10811, 9593, 8675, 5276, 4657, 3948, +5164, 6128, 3821, -749, -4296, -3545, -3363, -4528, -7049, -8925, -12005, -10519, -8630, -10599, -8901, -6382, +-5551, -3474, -5266, -7534, -6963, -6908, -5169, -5849, -6425, -5183, -8317, -9434, -10798, -11232, -10956, -10364, +-10962, -11353, -12141, -13419, -12308, -13123, -10248, -10020, -12381, -13532, -15873, -13895, -13192, -13948, -14482, -9996, +-8030, -7442, -6385, -5871, -1548, -1222, 4838, 6404, 10369, 14625, 17097, 14816, 12276, 17667, 20871, 21138, +14248, 14961, 11377, 12425, 14077, 9957, 8902, 7548, 8732, 4865, 3899, 1286, 1674, 3111, 3988, 2547, +-3293, -4868, -3985, -4102, -5228, -6043, -10364, -11437, -9380, -9855, -10047, -8329, -7131, -4515, -3511, -5454, +-6715, -7556, -5611, -5217, -5973, -4306, -5830, -6478, -8902, -8675, -10197, -8189, -8372, -8370, -8229, -9729, +-8810, -10477, -7616, -6454, -5455, -6988, -8340, -10180, -6851, -6581, -8490, -5144, -2972, 815, 783, 2338, +4360, 5087, 9839, 12613, 15880, 18947, 24943, 24933, 22853, 21932, 26589, 29366, 27171, 26647, 21770, 21720, +22662, 22330, 19716, 17553, 17646, 16339, 14651, 11718, 10230, 9771, 11005, 12117, 8745, 3558, 2484, 2393, +1203, 1470, -1379, -5650, -5625, -5937, -6595, -6710, -6551, -4977, -2900, -3443, -4444, -8019, -7734, -7432, +-7942, -7986, -7578, -8839, -10912, -12063, -14581, -14205, -14292, -13733, -14366, -15296, -15044, -17018, -16804, -15173, +-13915, -13765, -14402, -18203, -17898, -14961, -17676, -16164, -15662, -10647, -9934, -8514, -5972, -5964, -2905, 561, +4049, 5263, 12173, 14714, 16845, 12461, 14180, 20275, 20076, 21051, 16853, 14753, 14466, 16090, 14790, 13149, +12003, 11645, 11557, 9310, 7868, 5750, 6014, 8178, 9304, 5221, 1431, 1068, -540, 108, -138, -4228, +-6198, -6962, -7470, -7165, -8464, -7270, -5256, -4490, -3108, -6498, -7414, -7979, -7490, -8244, -7370, -7559, +-8590, -9585, -12308, -12300, -14261, -11994, -12771, -12978, -12658, -13607, -15056, -14249, -12551, -11833, -9640, -13576, +-15147, -14080, -13646, -14035, -15502, -11402, -9737, -7665, -6012, -3904, -3970, -220, 3709, 4737, 9414, 13466, +20216, 17294, 16273, 19275, 22344, 24870, 24005, 21041, 18571, 19897, 20185, 19518, 18241, 17144, 17645, 16967, +15499, 13663, 11398, 12172, 15468, 15000, 11336, 9283, 7031, 6751, 7534, 5678, 2585, 948, -923, -30, +-2260, -2357, -1591, -138, 1887, 1281, -607, -2415, -2154, -3206, -2895, -3001, -2904, -3859, -6157, -7228, +-9635, -9632, -8900, -9677, -9603, -9348, -11327, -12202, -11479, -11679, -7946, -9977, -11949, -14384, -13457, -13119, +-16171, -15018, -13642, -11038, -10834, -7459, -8533, -6715, -3712, -1224, 876, 2929, 11469, 13224, 11723, 11378, +13675, 17078, 19071, 18254, 14255, 13348, 13672, 13884, 12922, 11350, 10912, 10992, 10209, 9288, 6396, 3833, +6251, 8626, 7097, 5292, 2192, 156, 996, 619, -1190, -3642, -6135, -5882, -7244, -8175, -8862, -7752, +-6022, -4137, -4371, -6418, -6664, -8068, -7306, -8018, -6894, -7099, -8242, -9259, -11190, -12507, -12521, -11852, +-12870, -10978, -12400, -13206, -13418, -14694, -10922, -10322, -10323, -13571, -14223, -13090, -14090, -15689, -14638, -12243, +-11858, -8276, -8450, -6653, -6143, -2295, 691, 69, 6842, 13019, 14589, 13322, 13993, 16174, 20073, 22586, +20576, 18185, 16903, 17950, 17832, 16724, 15798, 15566, 15508, 15549, 14792, 10025, 9593, 12073, 12922, 12694, +11067, 6921, 6559, 6066, 6201, 4257, 1126, 351, -992, -1538, -3261, -3546, -2948, -347, 685, 241, +-734, -2270, -2343, -3391, -2763, -2391, -2728, -3220, -4970, -6767, -7854, -7645, -8934, -7225, -8281, -8062, +-9090, -11172, -10065, -8365, -6099, -8624, -10306, -11200, -10094, -12928, -13115, -12294, -11823, -8843, -8547, -6237, +-7244, -4955, -850, -1364, 589, 7403, 12579, 13211, 12852, 12631, 15491, 19306, 20714, 18878, 16203, 15636, +16329, 15503, 14625, 14010, 12894, 13059, 14097, 11036, 7054, 7689, 8740, 9726, 10193, 6614, 4264, 2674, +3072, 2631, -60, -2022, -3739, -4485, -6002, -7139, -8576, -6572, -4977, -4006, -4308, -5703, -6266, -7737, +-7757, -7724, -7147, -7452, -7779, -10100, -11432, -11805, -13786, -11911, -13079, -11911, -12282, -13841, -15222, -14853, +-11179, -11353, -12626, -15016, -13545, -15544, -16188, -16823, -16993, -14504, -13763, -10641, -11099, -10482, -6649, -4543, +-5095, -1693, 5192, 9410, 10759, 10068, 10682, 13935, 17747, 19038, 17264, 15124, 15241, 15906, 14652, 15106, +13843, 13003, 14505, 15257, 10956, 9430, 9070, 10430, 12327, 11651, 9550, 6187, 5970, 5849, 5465, 2551, +1358, -297, -1156, -1882, -4394, -4170, -2891, -622, 141, -166, -716, -1932, -2761, -3096, -2333, -2875, +-1272, -3536, -4661, -5198, -7588, -6967, -7587, -6924, -6734, -6431, -8893, -10074, -8942, -5702, -6208, -8649, +-8063, -9697, -9907, -11564, -12490, -11925, -11569, -8426, -7257, -8299, -6080, -2624, -2285, -2425, 1823, 7662, +11928, 12722, 11841, 12725, 15880, 19507, 20270, 18196, 16431, 17001, 16206, 15862, 16076, 13505, 13823, 15941, +14174, 11660, 9002, 8785, 10313, 11368, 11330, 7912, 5391, 4594, 4834, 3086, 1140, -844, -2338, -2765, +-4878, -6565, -7136, -5087, -3516, -2894, -2895, -3495, -4771, -5692, -5348, -6556, -4409, -5551, -6554, -7472, +-9387, -10192, -11152, -10869, -11382, -9687, -10873, -12479, -14660, -11607, -9496, -11664, -11275, -12958, -12848, -14349, +-15510, -15789, -17012, -14820, -11978, -12335, -12555, -8886, -6894, -6881, -6212, -2028, 4191, 7922, 8857, 7921, +9404, 12676, 16748, 16671, 15182, 14184, 14218, 13198, 14295, 12716, 10854, 12728, 13142, 12783, 9370, 7540, +7214, 8941, 10246, 10012, 6709, 4480, 4519, 3813, 2980, 497, -1016, -1986, -2768, -4509, -6778, -6215, +-4553, -2553, -2396, -1171, -2469, -3128, -3133, -4591, -3041, -2949, -2570, -3817, -4690, -6235, -7195, -7688, +-8212, -7480, -6739, -6867, -10514, -10400, -7553, -7270, -7446, -8456, -8452, -9293, -10772, -10778, -12694, -13360, +-10071, -8208, -9609, -7991, -4776, -3443, -3610, -2618, 1809, 7790, 11492, 11859, 11373, 12679, 16841, 20042, +19564, 18745, 17991, 16667, 17582, 17294, 14981, 14589, 15271, 16373, 15025, 12150, 9774, 9836, 11031, 12631, +11617, 8183, 6911, 5824, 6002, 4093, 1878, 501, -512, -1364, -3953, -5948, -5934, -3518, -3421, -1375, +-2046, -2512, -2519, -4511, -4044, -4262, -3182, -3711, -4252, -6119, -6920, -8523, -9333, -9722, -9586, -7171, +-10379, -12296, -12012, -10340, -9363, -10747, -10404, -11006, -12413, -12867, -13559, -16475, -15718, -12332, -12395, -13050, +-10956, -8067, -7404, -7623, -6875, -1860, 3564, 7218, 7386, 6802, 8678, 13437, 15183, 15325, 15546, 13004, +13871, 13977, 13327, 11266, 10970, 12127, 12857, 11649, 8501, 6802, 6278, 8532, 9598, 8389, 5837, 4088, +4063, 3379, 2022, -307, -958, -1969, -2614, -5474, -7248, -6162, -5765, -3256, -3100, -2557, -2665, -3622, +-4484, -4514, -4126, -3396, -2940, -4509, -4892, -6550, -7400, -8414, -9564, -6807, -7024, -9178, -10699, -10491, +-8089, -8518, -8743, -8212, -9421, -10253, -9826, -12014, -14352, -12274, -9972, -10335, -10583, -7859, -5478, -5000, +-5426, -4153, 685, 6113, 9690, 9519, 8731, 12279, 15706, 17197, 18745, 17115, 15971, 16673, 16923, 15537, +13820, 13668, 14952, 15549, 13828, 11397, 8661, 9272, 10788, 11857, 10641, 8205, 7165, 6579, 6468, 3985, +2906, 1253, 1426, -456, -3203, -4009, -4781, -2475, -1868, -801, -579, -550, -1825, -2429, -2718, -2710, +-1368, -2130, -2408, -4153, -4610, -5935, -8268, -7395, -5995, -6290, -8440, -10228, -9259, -7874, -8489, -7908, +-8164, -9765, -9181, -9858, -12802, -14361, -12066, -10854, -11494, -11329, -8548, -6580, -6652, -7230, -5832, -1393, +4136, 7642, 5746, 6962, 9690, 12454, 14921, 15599, 13847, 13069, 14025, 13599, 12183, 10044, 10558, 11574, +11767, 10612, 6997, 5105, 5401, 7146, 7689, 6576, 4371, 3419, 3162, 2231, 876, -1640, -1179, -2267, +-3920, -5804, -7839, -7262, -5774, -4659, -3870, -2885, -3467, -3860, -4839, -5130, -4302, -4053, -3306, -5042, +-5393, -5566, -8256, -9153, -8556, -6848, -7425, -9760, -10530, -9325, -8905, -8436, -7580, -8896, -9111, -8222, +-9678, -12621, -12982, -11142, -10204, -11038, -10088, -7141, -5440, -5772, -5771, -4782, 5, 6545, 7752, 7607, +8736, 11147, 14305, 16874, 17211, 15478, 15536, 16194, 16100, 13675, 12431, 12679, 13526, 14282, 12350, 9343, +7109, 8120, 9085, 10110, 8340, 6918, 5909, 5460, 5309, 1990, 1756, 873, 246, -1243, -3681, -5408, +-4856, -3491, -2934, -1345, -1427, -839, -2146, -2770, -2683, -3013, -1136, -1952, -3047, -2599, -3996, -6215, +-7321, -6358, -4700, -6096, -8057, -7941, -8057, -7371, -6244, -6314, -7660, -6787, -6493, -8556, -11203, -11125, +-9606, -9373, -9978, -8845, -5687, -5171, -4586, -5804, -4657, 1316, 6179, 7512, 7599, 8622, 10723, 14308, +16423, 16391, 14953, 14980, 16160, 14788, 12907, 11343, 11535, 12475, 13043, 11050, 7422, 6043, 6108, 7917, +7540, 6677, 4771, 3720, 4242, 2109, 257, -749, -1278, -2080, -3575, -6474, -7863, -7442, -6772, -5337, +-4925, -3670, -4108, -4966, -5202, -6389, -5110, -4315, -5203, -5411, -5285, -6889, -8973, -10148, -8319, -7402, +-9380, -9934, -10517, -10813, -9479, -8329, -9284, -9615, -8324, -8406, -10849, -12662, -12390, -11005, -11219, -11680, +-9422, -7568, -5749, -5921, -7602, -5066, 525, 4781, 6341, 7003, 7476, 10501, 13774, 16109, 15848, 14572, +15657, 15939, 15155, 12940, 11891, 11865, 13502, 13744, 11692, 8476, 6774, 8105, 8394, 9354, 7733, 6161, +6109, 5565, 3913, 2073, 1282, 689, 558, -1874, -4056, -5639, -5561, -4262, -3914, -2318, -1877, -2144, +-2266, -3719, -3707, -2701, -2505, -2779, -2813, -2736, -4276, -7094, -7194, -5340, -5620, -6856, -7047, -8413, +-8329, -6629, -6385, -7436, -7214, -5648, -6600, -8833, -10522, -9701, -9286, -9914, -9300, -8171, -5526, -3822, +-5154, -6269, -3236, 1693, 5488, 7485, 7436, 8459, 11180, 14749, 16537, 15843, 15371, 16068, 16491, 15122, +13437, 11634, 12453, 13498, 13944, 11542, 7936, 7472, 7252, 8767, 8609, 6972, 6069, 5611, 4961, 3188, +1480, 260, 560, -835, -2533, -5132, -6927, -6259, -6351, -4782, -4049, -3667, -3178, -4361, -5318, -5013, +-4635, -4240, -4577, -4359, -3937, -6595, -8877, -8301, -7186, -7861, -8159, -8921, -10454, -9800, -8174, -8577, +-9587, -8401, -7418, -8267, -11113, -11552, -11160, -11582, -11317, -11535, -9871, -6841, -5674, -7631, -7727, -4898, +-380, 3670, 5180, 5646, 6237, 9816, 12983, 14541, 13840, 13872, 14691, 14809, 14133, 11508, 10764, 10942, +12858, 12900, 10052, 7636, 6314, 6969, 8110, 7715, 6312, 5993, 5280, 4850, 3146, 1082, 1016, 409, +-284, -2309, -4970, -5880, -6464, -5485, -4271, -3811, -2635, -2522, -3879, -4113, -4088, -3613, -3375, -3705, +-2397, -2705, -5752, -7045, -6309, -5977, -6071, -6181, -7350, -8741, -7272, -6341, -7017, -7545, -6189, -4773, +-6858, -8617, -8772, -9278, -9184, -9247, -9639, -7345, -4092, -4152, -5484, -5586, -2793, 1606, 5221, 7195, +6836, 8236, 11577, 14868, 15638, 15591, 15508, 16215, 16818, 15165, 13426, 11515, 12800, 14284, 13677, 11460, +8493, 7567, 8217, 9097, 8010, 7516, 6511, 6297, 5665, 3229, 2178, 1117, 1181, -16, -2299, -4210, +-6129, -6450, -5363, -4965, -3995, -2831, -3382, -4194, -4732, -4446, -4175, -4530, -4112, -2489, -3983, -6613, +-7328, -7242, -6993, -6836, -6884, -8872, -9320, -8188, -7514, -8534, -8879, -6612, -6481, -8372, -9439, -10090, +-10634, -10296, -11200, -11358, -8217, -5975, -5985, -7526, -7156, -4694, -415, 3343, 4845, 4644, 6138, 10031, +12309, 13743, 13283, 13629, 14625, 14759, 13894, 10994, 10028, 11321, 12436, 12188, 9797, 6845, 6202, 7001, +7082, 6734, 5740, 5316, 5348, 3915, 2425, 583, 429, 251, -1349, -2760, -5251, -7080, -6901, -6511, +-5839, -4495, -3691, -3953, -4931, -5068, -4536, -4863, -5091, -3525, -2580, -4301, -6281, -6777, -7105, -6579, +-5934, -6775, -8190, -8477, -7119, -6821, -8330, -7244, -5420, -5714, -7039, -7934, -8925, -8823, -9022, -10341, +-9448, -6571, -4228, -4872, -5813, -5664, -3060, 1086, 4918, 6104, 5779, 8355, 11288, 14176, 14998, 15062, +15573, 16274, 17235, 15444, 12837, 12134, 13405, 14298, 14321, 11364, 8736, 8477, 8512, 9109, 7865, 7403, +7218, 6578, 5696, 3463, 2073, 2115, 1268, 211, -1433, -4300, -5571, -5950, -5760, -4888, -3784, -2928, +-3370, -4534, -3970, -3909, -4943, -4408, -2692, -2304, -4301, -5387, -6569, -6943, -5954, -5900, -6658, -8403, +-7974, -6798, -7676, -8481, -7068, -5916, -6218, -7112, -8726, -8915, -9177, -9987, -11261, -10124, -7010, -5493, +-5837, -7030, -6676, -4466, 86, 3312, 4059, 4555, 6569, 10103, 12221, 13340, 13541, 13808, 15281, 15772, +13806, 11346, 10903, 11681, 13243, 12591, 9663, 7737, 6693, 7549, 7039, 6182, 6019, 5444, 5412, 3908, +1732, 928, 430, -191, -902, -3162, -5423, -6807, -7519, -7153, -6391, -5100, -4164, -5219, -5614, -4741, +-5466, -6356, -5203, -3380, -3712, -4865, -6070, -7555, -7341, -6526, -6166, -7611, -8746, -7684, -7231, -8480, +-8343, -7128, -6201, -5924, -7465, -8369, -8528, -8723, -10137, -11096, -9482, -6641, -5072, -5738, -6339, -6641, +-3583, 540, 3468, 4465, 4751, 7656, 10469, 12907, 14038, 14135, 14777, 16606, 16754, 14733, 12765, 11849, +13438, 14456, 13714, 11212, 8833, 8634, 8847, 8173, 7666, 7157, 7160, 6866, 4994, 3527, 2323, 1923, +1615, 410, -1640, -3695, -5402, -6077, -5919, -5231, -3440, -3313, -4253, -4054, -3321, -4766, -5287, -3566, +-2595, -2567, -3598, -5014, -6452, -6279, -5097, -5313, -7156, -7396, -6280, -6949, -7540, -7422, -6527, -5223, +-5391, -6894, -7733, -7472, -8349, -9913, -10835, -8902, -6313, -5155, -5296, -6787, -6491, -3615, 260, 3038, +3537, 4557, 7092, 9890, 12298, 13244, 13145, 14525, 16075, 15935, 14403, 11621, 11588, 12670, 13654, 13036, +9981, 8324, 7868, 7713, 7136, 6240, 6061, 6276, 5339, 3919, 2284, 948, 913, 357, -1001, -2745, +-4965, -6502, -7448, -7622, -6256, -4855, -5004, -5781, -4810, -4849, -6532, -6183, -5042, -3840, -3854, -4671, +-6205, -7835, -7070, -5871, -6884, -8408, -7706, -7574, -7975, -8558, -8426, -7345, -6051, -6254, -7994, -8015, +-8039, -8935, -11025, -11217, -9324, -7047, -5402, -6177, -7226, -6972, -3826, -69, 2221, 3022, 4303, 6759, +9683, 12275, 12585, 13279, 14684, 16133, 16520, 14226, 12246, 12046, 13134, 14516, 13151, 10684, 9235, 8561, +8687, 7588, 6823, 7190, 7008, 6240, 4979, 3033, 2130, 2119, 1329, 298, -1688, -3505, -5183, -6551, +-6481, -4879, -3774, -4417, -4245, -3316, -4104, -5236, -4926, -3828, -2739, -2595, -3309, -5125, -6651, -5154, +-4635, -6254, -6706, -6380, -6264, -6893, -7278, -7405, -6022, -4824, -5537, -6833, -6768, -6501, -8363, -10083, +-10214, -8624, -5994, -4906, -5469, -6910, -6338, -3147, 134, 2201, 3214, 4477, 6764, 10212, 11855, 12609, +13295, 14700, 16581, 16297, 14282, 12211, 11925, 13409, 14203, 12786, 10667, 8915, 8689, 8286, 6894, 6608, +6730, 6528, 5953, 4292, 2493, 1776, 1489, 915, -425, -2188, -3844, -5822, -7457, -7134, -5299, -5242, +-5417, -4838, -4339, -5151, -6188, -5815, -4838, -3763, -3424, -4004, -6681, -7059, -5692, -6000, -7219, -7456, +-7064, -7306, -7621, -8513, -8203, -6795, -5706, -6686, -7835, -6940, -7529, -9250, -10987, -11159, -9381, -6909, +-5706, -6604, -8047, -7066, -3850, -1200, 1169, 2061, 3162, 6266, 9018, 10841, 11583, 12241, 14289, 15732, +15673, 13658, 11413, 11719, 12919, 13539, 12344, 10131, 8801, 8619, 7732, 6608, 6421, 6399, 6605, 5707, +4224, 2555, 1818, 1742, 985, -272, -1791, -3186, -5643, -7351, -6216, -5154, -5165, -4916, -4210, -3860, +-4739, -5491, -5081, -4316, -3028, -2105, -3658, -5752, -5565, -4563, -5188, -6104, -6099, -5974, -5856, -6610, +-7359, -6983, -5289, -4562, -5919, -6089, -5561, -6139, -8018, -9774, -9915, -8210, -5600, -4555, -5750, -7122, +-5542, -3093, -202, 1940, 2451, 4271, 6950, 9828, 11489, 11925, 13203, 15027, 16532, 16551, 13997, 12347, +12568, 13594, 14240, 12750, 10711, 9790, 9123, 8132, 7116, 6623, 6957, 6884, 6002, 4427, 2707, 2183, +1945, 1186, -346, -1264, -3012, -6061, -7180, -6135, -5694, -5660, -5098, -4543, -4232, -5357, -5668, -5702, +-5096, -3060, -2718, -4466, -6149, -5588, -5227, -5827, -6544, -6738, -6274, -6458, -7151, -8236, -7336, -5759, +-5697, -6608, -6627, -6029, -6836, -8761, -10524, -10745, -9024, -6281, -5497, -7137, -7730, -6571, -4070, -1167, +318, 1298, 2951, 5887, 8746, 9933, 10776, 12034, 13958, 15748, 15296, 12951, 11581, 11637, 12887, 13224, +11552, 10152, 9049, 8338, 7351, 6114, 5897, 6254, 6193, 5302, 3711, 2138, 1676, 1581, 380, -604, +-1191, -3551, -6416, -7114, -6409, -6223, -6017, -5384, -4528, -4804, -5266, -5619, -6187, -4906, -2824, -2779, +-4649, -5464, -5250, -4885, -5461, -6153, -6111, -5736, -5588, -6964, -7526, -6321, -5208, -5159, -5934, -5556, +-5132, -5906, -7922, -9532, -10108, -7888, -5173, -5097, -6133, -6981, -5680, -3066, -658, 982, 1785, 3610, +6879, 9197, 10527, 11326, 12616, 14969, 16533, 15943, 13838, 12371, 12669, 13932, 13675, 12447, 11091, 9981, +9335, 8004, 6850, 6533, 7027, 6828, 5994, 4296, 2693, 2679, 1993, 789, 318, -486, -3246, -5743, +-6440, -5992, -6092, -5822, -4788, -4584, -4557, -4848, -5606, -6278, -4451, -2556, -3118, -4410, -5246, -4950, +-4872, -5384, -6085, -6119, -5290, -5762, -7200, -7362, -6202, -5377, -5510, -6022, -5547, -5166, -6139, -7869, +-10127, -10415, -7839, -5853, -5514, -6784, -7515, -6017, -3791, -1285, -26, 719, 3046, 5963, 8297, 9542, +10114, 11841, 14215, 15619, 15163, 12848, 11598, 12198, 12964, 12749, 11629, 10380, 9431, 8591, 7189, 5886, +5805, 6125, 6081, 5221, 3227, 2208, 2013, 953, 102, -2, -1319, -3879, -6313, -6745, -6677, -7089, +-6157, -5528, -5324, -5042, -5171, -6523, -6734, -4521, -3187, -3605, -4810, -5242, -5182, -4995, -5499, -6455, +-5827, -5150, -5927, -7312, -7022, -6048, -5324, -5551, -5732, -5086, -4970, -5425, -7672, -10030, -9716, -7473, +-5446, -5231, -6593, -6957, -5682, -3244, -994, -85, 1091, 3380, 6297, 8669, 9545, 10319, 12356, 14529, +16244, 15495, 13237, 12468, 12880, 13585, 13220, 12253, 11094, 10272, 9330, 7742, 6656, 6348, 6828, 6843, +5614, 3792, 3221, 2489, 1368, 991, 729, -599, -3430, -5382, -5882, -6424, -6498, -5537, -5184, -4940, +-4179, -4877, -6338, -6045, -3952, -2803, -3411, -4117, -4786, -4599, -4381, -5372, -5970, -5144, -4651, -5779, +-6872, -6521, -5541, -5222, -5377, -5219, -5062, -4293, -5033, -7665, -9687, -9512, -7191, -5371, -5392, -6532, +-7090, -5629, -3161, -1484, -497, 689, 2958, 6070, 8121, 8842, 9894, 11790, 14268, 15872, 14772, 12920, +12172, 12592, 13040, 12633, 11717, 10753, 10002, 8717, 7313, 5999, 5731, 6409, 6211, 4669, 3421, 2728, +1624, 695, 463, 369, -1504, -3977, -5687, -6518, -7323, -7068, -6240, -6337, -5378, -4862, -5818, -7196, +-6521, -4485, -3764, -3953, -4778, -5265, -4892, -4907, -6096, -6286, -5338, -5151, -6280, -7312, -6547, -5988, +-5749, -5526, -5774, -5154, -4180, -5308, -7796, -9934, -9503, -7249, -5668, -5473, -6841, -7248, -5514, -3377, +-1805, -821, 264, 2929, 5921, 7733, 8653, 9551, 11797, 14444, 15810, 14736, 13069, 12570, 12876, 13297, +12717, 12014, 11276, 10374, 9194, 7740, 6191, 6222, 7056, 6280, 5092, 4073, 3222, 2008, 1121, 1383, +856, -1059, -3181, -4732, -6071, -6720, -6229, -6031, -5776, -4647, -4254, -5547, -6632, -5629, -4038, -3191, +-3379, -4185, -4409, -3970, -4421, -5488, -5405, -4513, -4392, -5930, -6351, -5766, -5542, -4965, -5106, -5257, +-4274, -3473, -4584, -7316, -9318, -8746, -6870, -5130, -5148, -6683, -6729, -5098, -3159, -1655, -1044, 297, +3065, 5784, 7739, 8302, 9325, 11789, 14456, 15609, 14514, 13128, 12571, 13040, 13096, 12504, 11984, 11248, +10325, 9293, 7437, 5829, 6358, 6633, 5898, 4759, 4000, 2895, 1422, 1005, 1268, 423, -1505, -3091, +-5061, -6546, -6911, -6778, -6775, -6310, -4863, -4984, -6322, -6986, -6162, -4611, -3765, -4054, -4766, -4578, +-4416, -5020, -6031, -5725, -4670, -5159, -6356, -6526, -6357, -5796, -5489, -5759, -5670, -4587, -3653, -5072, +-7801, -9555, -9177, -7239, -5486, -5864, -7179, -7107, -5552, -3531, -2441, -1775, -229, 2395, 5284, 7031, +7467, 8682, 11377, 14000, 15018, 14066, 12776, 12444, 12848, 12669, 12243, 11862, 11007, 10469, 9237, 7029, +5885, 6326, 6470, 5582, 4854, 4160, 2715, 1332, 1295, 1519, 191, -1062, -2731, -4936, -6200, -6566, +-6644, -6882, -5765, -4553, -4921, -6094, -6599, -5817, -4233, -3459, -3924, -4151, -3976, -3817, -4684, -5580, +-4762, -4182, -4717, -5567, -5910, -5561, -5013, -4937, -5165, -5038, -3561, -2781, -4390, -6923, -8785, -8414, +-6334, -4907, -5347, -6493, -6469, -4708, -3041, -2136, -1409, 61, 2812, 5651, 7210, 7436, 8999, 11705, +14247, 15239, 14240, 13138, 12985, 13180, 12851, 12655, 11925, 11489, 10944, 9327, 7187, 6162, 6635, 6343, +5597, 5135, 4308, 2487, 1361, 1636, 1248, 167, -908, -2721, -5028, -6074, -6516, -7181, -7141, -5766, +-4865, -5396, -6349, -6977, -6053, -4501, -4058, -4330, -4476, -4072, -4102, -5416, -5663, -4937, -4660, -4960, +-5953, -6196, -5803, -5377, -5342, -5771, -5315, -3636, -3174, -4630, -7207, -9168, -8509, -6662, -5400, -5808, +-7102, -6739, -5051, -3578, -2731, -2117, -583, 2272, 5124, 6284, 6668, 8380, 11111, 13682, 14565, 13571, +12838, 12686, 12647, 12595, 12064, 11553, 11369, 10742, 8956, 6823, 6189, 6342, 5937, 5304, 5223, 3985, +2070, 1490, 1533, 1048, 148, -694, -2843, -4931, -5702, -6610, -7427, -7059, -5620, -4988, -5377, -6424, +-6905, -5813, -4507, -4020, -4403, -4160, -3545, -4176, -5222, -5180, -4699, -4281, -4698, -5587, -5783, -5348, +-4856, -5173, -5566, -4742, -3162, -2663, -4032, -6836, -8529, -7943, -6169, -4938, -5609, -6667, -6205, -4592, +-3239, -2502, -2058, -375, 2643, 5260, 6250, 6721, 8532, 11309, 13991, 14505, 13874, 13293, 12982, 13166, +12865, 12281, 11915, 11995, 11142, 9192, 7277, 6716, 6661, 5929, 5852, 5633, 4009, 2420, 1926, 1762, +1155, 648, -401, -2725, -4378, -5214, -6574, -7399, -6764, -5557, -4882, -5411, -6501, -6788, -5834, -4422, +-4315, -4611, -3787, -3568, -4378, -5178, -5142, -4676, -4340, -4780, -5609, -5868, -5224, -4947, -5565, -5687, +-4809, -3237, -2630, -4223, -6943, -8577, -8021, -6250, -5286, -5994, -6933, -6365, -4865, -3535, -3043, -2721, +-805, 2178, 4598, 5522, 6019, 7860, 10924, 13260, 13831, 13445, 12791, 12715, 12808, 12412, 11651, 11650, +11794, 10755, 8718, 7058, 6613, 5993, 5546, 5696, 5227, 3500, 2221, 1746, 1292, 980, 606, -747, +-2963, -4131, -5348, -6900, -7562, -7001, -5654, -5112, -5698, -6652, -7007, -5765, -4587, -4853, -4530, -3648, +-3617, -4388, -5105, -4914, -4549, -4203, -4576, -5552, -5542, -4743, -4887, -5412, -5517, -4597, -2818, -2377, +-3907, -6605, -8208, -7568, -5900, -5166, -5896, -6652, -6129, -4560, -3355, -3147, -2775, -650, 2158, 4548, +5352, 5742, 7943, 10865, 13114, 13762, 13450, 12878, 12904, 13031, 12319, 11697, 11910, 12100, 10813, 8813, +7558, 6748, 5963, 5771, 6045, 5197, 3604, 2602, 1825, 1388, 1361, 897, -737, -2500, -3599, -5127, +-6651, -7425, -6700, -5401, -5015, -5473, -6667, -6700, -5310, -4702, -4843, -4186, -3335, -3386, -4223, -4704, +-4573, -4248, -3768, -4384, -5319, -4972, -4398, -4633, -5216, -5353, -4151, -2474, -2005, -3558, -6321, -7815, +-7095, -5651, -5081, -5750, -6504, -5901, -4326, -3318, -3400, -2791, -776, 2065, 4380, 4812, 5517, 7714, +10598, 12741, 13482, 13159, 12696, 12915, 12805, 12018, 11358, 11950, 11950, 10396, 8752, 7549, 6406, 5537, +5665, 5733, 4698, 3403, 2383, 1314, 1097, 1246, 394, -1125, -2568, -3768, -5333, -7122, -7805, -7056, +-5896, -5338, -6104, -7250, -6821, -5721, -5388, -5350, -4472, -3614, -3821, -4559, -4912, -4928, -4349, -3959, +-4806, -5401, -5004, -4466, -4825, -5517, -5500, -4216, -2507, -1995, -3583, -6375, -7626, -6913, -5667, -5170, +-5828, -6580, -5765, -4193, -3512, -3510, -2946, -856, 2092, 4083, 4507, 5364, 7659, 10438, 12636, 13377, +13091, 12880, 13158, 12968, 11881, 11566, 12335, 12018, 10492, 9169, 7903, 6397, 5783, 6008, 5825, 4826, +3831, 2527, 1367, 1574, 1476, 539, -821, -2158, -3244, -5096, -6891, -7553, -6957, -5572, -5170, -6259, +-7031, -6498, -5641, -5493, -5308, -4196, -3535, -3728, -4301, -4826, -4684, -3973, -3896, -4659, -5178, -4645, +-4185, -4714, -5411, -5349, -4020, -2246, -1683, -3460, -6144, -7215, -6579, -5509, -5001, -5852, -6460, -5426, +-4145, -3469, -3661, -3064, -835, 2027, 3782, 4169, 5252, 7415, 10282, 12413, 13158, 12977, 12930, 13384, +12844, 11712, 11738, 12490, 11858, 10549, 9512, 7934, 6346, 5968, 6106, 5641, 4952, 4001, 2333, 1470, +1719, 1436, 516, -864, -1864, -3091, -5061, -6765, -7705, -6944, -5473, -5435, -6526, -7019, -6444, -5851, +-5868, -5376, -4301, -3741, -3699, -4453, -4957, -4589, -4019, -4032, -4800, -5166, -4538, -4238, -4888, -5552, +-5528, -4116, -2196, -1737, -3624, -6124, -7085, -6629, -5503, -5228, -6167, -6462, -5554, -4235, -3770, -4099, +-3386, -1048, 1678, 3205, 3738, 4780, 7020, 9848, 11980, 12694, 12551, 12904, 13259, 12453, 11426, 11805, +12319, 11566, 10626, 9605, 7740, 6281, 6103, 5900, 5532, 5114, 3881, 2252, 1534, 1786, 1484, 396, +-675, -1581, -2949, -4766, -6709, -7699, -6647, -5337, -5534, -6542, -6780, -6205, -5939, -5869, -5182, -4287, +-3497, -3506, -4359, -4674, -4228, -3702, -3857, -4591, -4759, -4088, -3957, -4569, -5325, -5328, -3754, -1751, +-1482, -3351, -5625, -6704, -6130, -5173, -5121, -5977, -6222, -5241, -3996, -3711, -4206, -3288, -963, 1557, +3021, 3530, 4635, 6821, 9710, 11756, 12349, 12425, 13084, 13224, 12161, 11463, 11926, 12124, 11450, 10835, +9634, 7577, 6457, 6085, 5694, 5595, 5076, 3796, 2110, 1534, 1859, 1269, 302, -563, -1564, -2784, +-4676, -6852, -7704, -6560, -5430, -5825, -6706, -6604, -6313, -6157, -5939, -5369, -4359, -3469, -3603, -4438, +-4613, -4114, -3677, -3980, -4625, -4597, -3987, -3886, -4518, -5413, -5420, -3570, -1647, -1519, -3207, -5528, +-6453, -5888, -5130, -5197, -6043, -6167, -5145, -3925, -3975, -4399, -3356, -1136, 1288, 2620, 3210, 4244, +6503, 9436, 11338, 11844, 12293, 13133, 12900, 11869, 11467, 11852, 11784, 11400, 10943, 9395, 7553, 6525, +5854, 5575, 5519, 5005, 3632, 1912, 1641, 1734, 1058, 283, -637, -1496, -2638, -4698, -6977, -7689, +-6470, -5563, -6192, -6686, -6580, -6479, -6237, -6118, -5509, -4383, -3471, -3700, -4463, -4519, -3905, -3627, +-4015, -4496, -4403, -3820, -3686, -4359, -5503, -5239, -3302, -1530, -1281, -3046, -5233, -6031, -5497, -4892, +-5068, -5900, -5911, -4723, -3730, -3937, -4288, -3181, -1038, 1251, 2570, 3147, 4165, 6542, 9483, 11096, +11671, 12596, 13352, 12858, 12001, 11825, 11904, 11799, 11789, 11112, 9540, 7914, 6724, 5997, 5677, 5740, +5198, 3578, 2128, 1920, 1765, 1181, 389, -521, -1175, -2368, -4560, -6950, -7466, -6235, -5760, -6283, +-6581, -6609, -6478, -6334, -6286, -5604, -4408, -3516, -3812, -4558, -4385, -3807, -3704, -4065, -4451, -4356, +-3748, -3516, -4519, -5648, -5212, -3323, -1498, -1325, -3071, -5170, -5810, -5388, -4892, -5222, -6065, -5818, +-4666, -3857, -4238, -4477, -3324, -1267, 944, 2211, 2705, 3719, 6341, 9070, 10430, 11292, 12536, 13085, +12434, 11944, 11712, 11508, 11729, 11708, 10928, 9497, 7892, 6705, 5774, 5594, 5762, 4967, 3389, 2158, +1839, 1659, 1116, 253, -515, -1053, -2209, -4632, -7000, -7224, -6280, -5982, -6384, -6628, -6675, -6528, +-6511, -6462, -5726, -4452, -3576, -3997, -4582, -4274, -3746, -3783, -4036, -4428, -4356, -3506, -3447, -4586, +-5660, -5168, -3235, -1414, -1266, -3038, -4960, -5556, -5135, -4767, -5324, -6043, -5633, -4486, -3879, -4341, +-4452, -3337, -1348, 832, 2008, 2371, 3594, 6351, 8736, 9978, 11219, 12657, 12862, 12419, 12161, 11629, +11528, 11863, 11791, 11044, 9638, 8202, 6841, 5793, 5881, 5905, 4971, 3564, 2367, 2018, 1828, 1230, +388, -298, -595, -1877, -4544, -6637, -6824, -6157, -5900, -6245, -6450, -6438, -6363, -6435, -6400, -5609, +-4250, -3505, -3966, -4392, -3944, -3627, -3610, -3837, -4376, -4054, -3200, -3268, -4499, -5566, -5035, -3070, +-1252, -1214, -2910, -4759, -5243, -4839, -4693, -5415, -6002, -5450, -4398, -3958, -4475, -4518, -3486, -1504, +656, 1606, 1912, 3416, 6143, 8147, 9424, 11096, 12364, 12466, 12339, 11946, 11353, 11339, 11704, 11644, +10798, 9606, 8184, 6570, 5677, 5872, 5663, 4790, 3433, 2280, 1932, 1666, 1092, 127, -278, -442, +-1994, -4635, -6504, -6785, -6265, -6089, -6405, -6503, -6520, -6444, -6639, -6586, -5678, -4293, -3681, -4140, +-4267, -3905, -3594, -3508, -3871, -4337, -3850, -2978, -3172, -4436, -5522, -4918, -2907, -1162, -1092, -2793, +-4509, -4862, -4499, -4582, -5413, -5848, -5211, -4233, -3954, -4457, -4500, -3551, -1456, 549, 1262, 1651, +3447, 5973, 7612, 9218, 11021, 12097, 12391, 12329, 11888, 11251, 11291, 11731, 11533, 10783, 9792, 8217, +6511, 5818, 5919, 5629, 4746, 3464, 2357, 1954, 1741, 989, 52, -2, -238, -1983, -4491, -6250, +-6608, -6221, -6144, -6376, -6453, -6414, -6429, -6729, -6671, -5617, -4268, -3851, -4085, -4155, -3816, -3437, +-3406, -3865, -4232, -3581, -2778, -3012, -4380, -5452, -4768, -2750, -1024, -982, -2676, -4229, -4446, -4176, +-4485, -5383, -5645, -4966, -4108, -3907, -4398, -4520, -3516, -1353, 428, 890, 1527, 3549, 5601, 7238, +9090, 10817, 11937, 12314, 12337, 11824, 11164, 11369, 11727, 11402, 10923, 9935, 8190, 6556, 5915, 5969, +5536, 4710, 3457, 2316, 2022, 1727, 749, 25, 191, -220, -2020, -4451, -6099, -6551, -6318, -6303, +-6517, -6546, -6477, -6551, -7037, -6847, -5677, -4547, -4099, -4235, -4283, -3872, -3450, -3540, -4065, -4288, +-3564, -2730, -3051, -4509, -5529, -4816, -2781, -1077, -1092, -2761, -4107, -4214, -4068, -4583, -5520, -5590, +-4931, -4138, -3968, -4539, -4709, -3599, -1356, 42, 413, 1475, 3335, 5116, 6861, 8755, 10510, 11658, +12174, 12248, 11606, 11088, 11388, 11535, 11344, 11045, 9973, 8217, 6588, 6057, 5977, 5519, 4772, 3429, +2417, 2235, 1693, 636, 206, 437, -51, -1911, -4184, -5777, -6323, -6171, -6234, -6391, -6389, -6191, +-6492, -7035, -6639, -5561, -4504, -4019, -4101, -4130, -3602, -3200, -3394, -3919, -4051, -3207, -2386, -2803, +-4315, -5329, -4576, -2536, -845, -951, -2575, -3724, -3736, -3715, -4466, -5335, -5328, -4715, -3928, -3838, +-4505, -4761, -3367, -1264, -317, 268, 1487, 3154, 4820, 6593, 8517, 10253, 11463, 12133, 12105, 11432, +11135, 11290, 11350, 11297, 11065, 9960, 8145, 6638, 6098, 5890, 5497, 4690, 3273, 2523, 2264, 1481, +471, 233, 510, -108, -1930, -4089, -5646, -6280, -6230, -6346, -6557, -6342, -6201, -6717, -7172, -6701, +-5721, -4713, -4172, -4283, -4195, -3581, -3230, -3484, -4040, -4061, -3128, -2322, -2817, -4355, -5371, -4587, +-2499, -871, -1053, -2606, -3529, -3453, -3626, -4501, -5328, -5279, -4690, -3869, -3830, -4767, -4862, -3215, +-1504, -706, 80, 1339, 2872, 4461, 6275, 8189, 9892, 11286, 11998, 11855, 11334, 11059, 11143, 11180, +11248, 11070, 9892, 8128, 6685, 6071, 5871, 5503, 4559, 3258, 2623, 2252, 1363, 405, 294, 544, +-98, -1907, -3975, -5556, -6211, -6191, -6409, -6545, -6265, -6202, -6773, -7172, -6697, -5746, -4728, -4200, +-4298, -4164, -3529, -3191, -3472, -4034, -4010, -3055, -2265, -2775, -4325, -5348, -4545, -2459, -844, -1044, +-2579, -3459, -3392, -3588, -4481, -5301, -5258, -4674, -3842, -3826, -4772, -4853, -3210, -1506, -706, 79, +1338, 2838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 157, 139, 182, 241, 280, 298, 321, 360, 399, 406, 425, 449, 482, +507, 482, 483, 501, 501, 485, 476, 488, 466, 449, 430, 399, 374, 357, 354, 306, +259, 211, 191, 158, 124, 69, 45, 6, 1, -51, -61, -112, -167, -194, -212, -244, +-262, -280, -298, -331, -360, -356, -340, -365, -362, -395, -418, -425, -423, -427, -452, -442, +-453, -429, -440, -440, -444, -401, -424, -529, -754, -1040, -3564, 1650, 2002, -105, 2204, 760, +-409, 158, -1683, 1200, -73, -5074, -2943, -4734, -4174, -3825, -6027, -6654, -6048, -1128, -2046, 2493, +-2288, 115, -122, 3270, 5359, 501, 7710, 1646, 3350, -590, 3699, 5815, 4104, 8272, 8246, 8512, +6661, 9991, 7412, 9417, 10262, 8314, 9899, 3483, 8857, 1850, 6578, 8323, 10230, 9128, 6281, 6731, +3598, 7598, -332, 366, -1681, -2342, 478, -10845, -7583, -8602, -8096, -10051, -10565, -5534, -1083, 577, +-5723, -5539, -3600, 803, -6533, -16425, -12470, -7134, -8171, -15837, -20759, -21801, -16293, -21088, -31160, -26308, +-17839, -9676, -19314, -22563, -25926, -19049, -19107, -21474, -21790, -17327, -10737, -17144, -21908, -19130, -16053, -12189, +-12422, -10326, -4080, -1957, -202, -2151, 2250, 4569, 8485, 7974, 7560, 12154, 15300, 14757, 17389, 20254, +27236, 26639, 24524, 26102, 29735, 27066, 25968, 19600, 27275, 31474, 26614, 25163, 21194, 27553, 22793, 26407, +21087, 26155, 23515, 23109, 22194, 21167, 20603, 19604, 19129, 18199, 17802, 16953, 16480, 15806, 5078, 10478, +3687, 1086, -8767, 597, 6290, 8677, 4525, -3522, -2928, -5280, -939, -10676, -8678, -6617, -4442, -13400, +-22048, -18500, -20411, -15302, -18602, -18091, -14259, -17060, -14718, -19600, -17118, -17705, -12798, -17501, -13195, -15667, +-14473, -11452, -13779, -4287, -8374, -5732, -5290, -6552, -1385, -5265, -7521, -5208, -3799, -2543, -4040, -4429, +-5541, -2555, -3329, -4019, -5725, -25, 6755, 3229, 5049, 10565, 13080, 4714, 5455, -2088, 4504, 6292, +2484, -4379, -7773, -4660, -11360, -15698, -17651, -9524, -1482, 963, -2902, -9332, -8311, -4274, -6071, -8204, +-5504, 725, -2693, -5578, -13660, -10491, -6924, -6411, -5386, -5359, -4691, 401, -2737, -5028, -2029, -2494, +2512, 1141, -410, 2862, 798, 4763, 7627, 5392, 9343, 5795, 10076, 11233, 9565, 9191, 8170, 9346, +8365, 10015, 8252, 7994, 6144, 7321, 5984, -1065, 3968, 6132, 8529, 4586, 14287, 11460, 12560, 8403, +3532, 5338, 8607, 9262, 1873, -614, -3716, -6368, -13057, -17603, -16208, -12790, -4416, -4310, -10482, -11889, +-11598, -8479, -12926, -8543, -10598, -2226, -8098, -14069, -16782, -16454, -12800, -9207, -10539, -10729, -2900, -3760, +-2468, -4901, -4256, 1653, 823, 2897, 1680, -1126, 7035, 5670, 10894, 7962, 10526, 14355, 16246, 16935, +15216, 18582, 16546, 17457, 16196, 20576, 18048, 18755, 17968, 17604, 12998, 11563, 16319, 12513, 17971, 19444, +21073, 22944, 19533, 16324, 13011, 17427, 19260, 17897, 12980, 11240, 8311, 541, -855, -9411, -6610, -1074, +4765, 359, -5393, -5469, -7051, -5033, -9242, -10002, -4972, -2726, -8495, -12863, -19065, -14557, -8586, -13158, +-12764, -11297, -6125, -5236, -11932, -9745, -9232, -7166, -4036, -9380, -9518, -8260, -4714, -3523, -3169, -3395, +-1126, 2178, 12, 1781, 1310, 4138, -1, 1878, 3656, 5401, 2785, 4476, 2484, -1462, -757, -2970, +-4324, -1188, 1232, 2805, 5526, 5602, 4126, -2184, 608, 3522, 5388, 1878, 3212, -2104, -4155, -9298, +-14245, -20343, -14976, -6843, -6697, -10042, -12599, -15591, -10977, -16578, -16992, -14190, -11126, -7143, -13704, -19749, +-19198, -11945, -12558, -9916, -16353, -3249, -4354, -5209, -4165, -8292, -170, -839, 2039, -3108, -1501, 1569, +4734, 7950, 4870, 9691, 11248, 15064, 11618, 16118, 16275, 15542, 14781, 16266, 18283, 14725, 21117, 14722, +13148, 13043, 11252, 8893, 6401, 11612, 10306, 15171, 15388, 14843, 9600, 7517, 13030, 10459, 13826, 10899, +12420, 6375, 5262, -1009, -9286, -8947, -4850, -317, -1264, -5541, -8345, -8001, -11915, -12407, -14504, -13350, +-6027, -9242, -14889, -18597, -19163, -9701, -14908, -15010, -13460, -9254, -7019, -8654, -10429, -11220, -5011, -4788, +-5379, -9780, -7599, -3919, 1292, -860, 598, 4858, 7686, 8891, 8314, 12765, 12785, 12218, 14783, 12842, +13288, 19628, 16327, 12398, 12080, 12906, 9483, 7317, 6682, 9594, 10560, 17000, 15664, 12424, 10036, 13084, +12891, 14714, 15054, 16610, 14039, 13174, 8776, -555, -1865, -5066, 3066, 2581, 1957, -769, -2323, -6467, +-4899, -9824, -10725, -4898, -5863, -3090, -14989, -14810, -10161, -10793, -9022, -12909, -8154, -6981, -3158, -8702, +-9916, -8995, -6036, -4588, -9729, -13056, -10318, -5509, -5878, -5873, -5764, 69, 312, -543, 4061, 151, +3684, 5234, 912, 866, 4637, 7602, 953, 90, -1611, -570, -5949, -5949, -8543, -5697, -318, 2395, +-303, -2475, -1717, 158, -818, 3347, 2514, 3531, 6062, -217, -2514, -11411, -13139, -10594, -6680, -8346, +-4017, -11756, -9712, -12228, -15270, -14174, -17360, -9034, -8174, -12490, -16255, -15788, -12324, -9600, -9935, -11106, +-5538, -1940, -1498, -3971, -5542, -1235, 2022, 2110, -3681, -2716, 255, 5106, 3883, 4055, 9396, 9364, +13704, 15447, 13109, 15658, 20033, 16333, 14084, 15900, 19976, 18539, 14486, 13047, 11966, 10802, 7979, 3849, +1772, 8180, 11949, 12085, 8084, 10051, 7558, 9930, 11195, 9450, 12015, 13104, 12809, 9198, 1103, -4790, +-3337, -5268, -1312, -1089, -3922, -3450, -9378, -8218, -13139, -14699, -11395, -9162, -9159, -13295, -16517, -16120, +-13138, -10878, -13895, -11913, -7971, -5049, -5184, -9741, -8792, -4250, -2439, -4817, -9223, -8004, -1564, -3387, +472, 311, 1404, 7404, 11083, 7884, 10758, 14429, 16567, 11393, 12189, 14264, 17961, 14213, 13915, 8746, +9999, 10677, 3641, 1205, 44, 11613, 7854, 11033, 7618, 7332, 8805, 10642, 9242, 10535, 11920, 13990, +15640, 4749, 1816, -2951, -4525, -600, -3410, 766, -4046, -3670, -6896, -10250, -12896, -12863, -9140, -10408, +-8103, -14744, -15832, -15214, -11870, -12834, -13876, -12107, -7967, -5033, -9804, -10657, -10275, -5352, -4927, -12615, +-10662, -11170, -8540, -5738, -5633, -7853, -1239, 2184, 3163, 1135, 5887, 9361, 6891, 4942, 6246, 7652, +10495, 8369, 4099, 1912, 4428, 2814, -7607, -6609, -3021, 1001, 3285, 2795, -1235, 3111, 1627, 4725, +4119, 1984, 10313, 10389, 7695, 1842, -4802, -5946, -6418, -6276, -3101, -5556, -4395, -5650, -9659, -13105, +-13313, -11341, -10815, -7861, -10167, -13541, -13473, -12785, -9407, -10934, -11437, -6688, -3668, -2057, -6772, -6482, +-2279, 477, -4273, -2550, -7233, -4049, -851, 1060, -2192, 745, 7230, 7875, 9212, 8674, 16197, 12849, +15106, 12203, 13240, 15790, 18194, 15314, 8038, 13308, 11980, 5306, 1592, -260, 4482, 8680, 9211, 7075, +7186, 5422, 12092, 7816, 7573, 11393, 13395, 18253, 9882, 5713, -343, -1501, -1132, -602, -829, -1487, +1529, -2980, -7633, -9058, -9315, -7662, -5951, -6237, -8903, -9550, -12340, -7696, -9957, -9329, -8776, -5180, +-646, -4407, -7579, -1926, -3307, -1256, -2072, -5493, -7166, -3289, -938, -2494, -3095, 1191, 5592, 4016, +8393, 8059, 11990, 10748, 12589, 8484, 10205, 14953, 14360, 8053, 9362, 9342, 6479, 2364, -4550, -2164, +1554, 4180, 6619, 496, 1873, 5184, 3986, 4243, 2019, 6709, 11796, 11087, 5260, -545, -5757, -5179, +-5074, -6179, -7221, -2320, -4505, -8008, -11990, -14946, -11544, -11946, -9824, -11390, -13331, -14465, -13454, -14254, +-12106, -15645, -11268, -5037, -8668, -8228, -8503, -5907, -6366, -2591, -6673, -8930, -7657, -4082, -3930, -6930, +-1149, -1174, 2740, 4021, 6806, 8437, 9158, 12925, 8184, 7626, 12615, 13139, 10965, 9921, 7797, 10036, +5639, -1263, -2149, -4623, 3607, 5701, 1879, 2306, 1640, 5192, 3883, 1496, 2911, 7752, 12057, 9929, +4616, -2800, -3874, -3716, -5670, -6852, -4019, -2580, -2873, -8853, -12136, -12492, -10396, -10274, -8341, -12692, +-9845, -14108, -12080, -11060, -15583, -10919, -7604, -4860, -8096, -4645, -7317, -3689, -2912, -1075, -6643, -5790, +-2592, -2870, -2747, -1443, 928, 2624, 4835, 9832, 8364, 12640, 15273, 13619, 11841, 14999, 15150, 17681, +15435, 12911, 16508, 11243, 11777, 3230, 651, 4679, 8656, 9536, 6803, 6619, 8712, 9344, 7982, 5756, +8765, 13613, 16977, 14720, 5920, 2531, 2235, -621, -1059, -2626, 732, 3401, -818, -5009, -8350, -9327, +-4487, -7459, -6483, -8034, -9620, -8499, -9068, -12781, -11959, -7124, -7029, -4786, -6554, -5095, -6433, -2803, +-1738, -5348, -6696, -4228, -5232, -4986, -4620, -1750, -3025, -102, 4988, 2883, 7773, 10330, 8804, 9732, +8963, 9652, 12392, 10283, 11237, 9323, 8305, 9028, 2866, -3586, -3545, -796, 4136, 1493, 1479, 870, +4268, 2849, 1408, 1254, 1834, 12323, 10468, 7831, -144, -923, -3851, -4135, -8567, -6295, -1688, -3647, +-2624, -14012, -10713, -11801, -9858, -9387, -11956, -12517, -10778, -10536, -15587, -15001, -12950, -9659, -8582, -7982, +-7010, -10005, -3852, -4593, -4292, -7664, -5159, -4704, -8209, -4171, -3759, -4021, -2246, 2136, 430, 7582, +7727, 9309, 10501, 7942, 12246, 9673, 11200, 12881, 9567, 10609, 9763, 8305, 1424, -3120, -2527, 1316, +2794, 1592, 1479, 3127, 3245, 4490, 763, 550, 7021, 12390, 10899, 7472, 211, 1246, -2587, -4909, +-5372, -5568, 863, -1130, -5153, -10508, -9862, -9998, -5204, -9629, -11157, -8445, -7179, -10469, -13128, -12397, +-9052, -7902, -4248, -5677, -6959, -4011, -556, -1283, -4662, -1695, -1419, -4351, -1716, -1075, -2209, 2594, +918, 4383, 6278, 10936, 12842, 12600, 12504, 16096, 13397, 15420, 15641, 15644, 14948, 14444, 15653, 9440, +5599, 62, 3862, 4970, 4959, 5964, 4356, 6697, 7283, 5906, 1251, 6377, 9242, 16052, 11917, 6886, +5493, -42, 909, -4696, -5255, -1087, 899, -800, -5043, -10929, -10052, -5445, -7565, -10762, -10529, -6785, +-8008, -12888, -12330, -13658, -9803, -7143, -6105, -9270, -8539, -2915, -3313, -6465, -4434, -3912, -6688, -3670, +-6213, -4909, -2305, -2967, -428, -648, 4631, 9178, 7273, 9829, 10161, 11636, 11471, 11597, 12717, 10705, +13798, 11031, 12861, 4520, 975, -515, 478, 1234, 2698, 1241, 2213, 5902, 1859, 2896, -1986, 4713, +9213, 10302, 9507, 4366, 1136, -245, -4917, -7499, -6420, -3789, -2065, -2276, -11529, -12616, -10908, -7414, +-11870, -14059, -9837, -10609, -10388, -14563, -15760, -15339, -10537, -7737, -10081, -13700, -5386, -6690, -6578, -5925, +-7728, -6153, -5973, -7667, -6570, -6779, -3164, -2974, -4739, 791, 4570, 7031, 7344, 8558, 10154, 11015, +12247, 10182, 11884, 11286, 13001, 13323, 9496, 3870, 2073, -835, 981, 2844, 433, 3797, 3735, 6129, +3759, 265, 2414, 6990, 9884, 14053, 8637, 7293, 4140, 914, -3120, -3573, -4422, 627, 2643, -2343, +-8801, -8315, -4414, -6638, -8702, -8620, -6578, -5808, -7274, -10406, -13221, -9955, -2892, -7059, -7693, -5675, +-3169, -2576, -880, -4342, -1297, -2815, -1828, -2577, -5314, 1490, -1452, 825, -803, 6063, 7802, 10188, +11659, 9884, 14804, 13627, 14558, 12859, 13168, 13943, 17171, 13047, 10361, 6275, 839, 3880, 667, 3012, +2213, 2872, 7850, 3694, 2542, 695, 2795, 6304, 11888, 9690, 9047, 7064, 1131, 357, -5309, -5280, +-5108, 1065, 403, -7152, -9082, -7739, -7327, -8199, -10396, -9887, -8456, -7291, -8280, -16347, -13808, -7722, +-9009, -8436, -9557, -8426, -4361, -4754, -4190, -5650, -4942, -2536, -5074, -5873, -4644, -1212, -3491, -1967, +-910, 3202, 7478, 8636, 8256, 9782, 12227, 12751, 12974, 8500, 13311, 13313, 14472, 12222, 7264, 3192, +2230, -434, 1947, -1889, 1123, 4509, 3871, 2339, 129, -1302, 2634, 5999, 7996, 8731, 7281, 3883, +-142, -2677, -7749, -8503, -4056, -364, -5973, -8009, -11753, -8435, -11086, -9613, -12755, -13498, -8437, -8197, +-15771, -17291, -12984, -12914, -8663, -13370, -10598, -10255, -7150, -4732, -8873, -6019, -6208, -3705, -7905, -6069, +-4438, -4151, -2797, -3862, -801, 3454, 7400, 7636, 8918, 8583, 14428, 13376, 10091, 12116, 11940, 16294, +15377, 11354, 8925, 3539, 4293, 2505, 975, 216, 5129, 5636, 6857, 3600, 963, 3656, 5025, 9037, +10521, 12450, 9742, 6982, 4387, -847, -5592, -1645, 500, 2235, -3031, -3619, -5988, -6465, -4138, -6578, +-11460, -5476, -3312, -8178, -10381, -13133, -8088, -8348, -6268, -8603, -8186, -5263, -2863, -2854, -5634, -2162, +-2592, -3086, -3749, -3471, -2597, -647, -2281, -1413, 1835, 4656, 10138, 8311, 7803, 14296, 13007, 14714, +10618, 11325, 15151, 16004, 15383, 11954, 6186, 5718, 4807, 312, 889, -268, 4853, 5670, 4446, 652, +890, 1781, 4530, 6612, 10641, 8920, 8252, 6755, 686, -4329, -6024, -1973, -754, -2469, -3173, -6266, +-9790, -4626, -7627, -12489, -8951, -8060, -5771, -11646, -13137, -13191, -11631, -8975, -9426, -10970, -10042, -5941, +-5407, -6290, -5229, -4781, -4936, -3826, -6610, -3838, -4259, -3401, -2780, -3452, -477, 6604, 5111, 7264, +7428, 11248, 13767, 10289, 9431, 10519, 12861, 15536, 13104, 7380, 5921, 4048, 1957, -812, -2541, -1111, +4321, 2751, 2256, -2833, 1053, -1773, 4201, 5830, 6697, 8175, 6992, 5471, -3608, -6487, -4896, -2998, +-4549, -869, -7182, -8965, -6360, -8632, -9601, -13706, -8466, -8248, -9187, -11823, -14504, -13023, -12155, -8506, +-11974, -10768, -9123, -6707, -6111, -5236, -5612, -5161, -3241, -6166, -2931, -5392, -3125, -963, -5039, -194, +1457, 6557, 7299, 7356, 9652, 14321, 13080, 12799, 10210, 11436, 17327, 16187, 13437, 9445, 7492, 6351, +3909, -254, -663, 2717, 6871, 4305, 2936, 1065, 759, 3284, 6339, 7524, 8926, 11200, 11568, 4627, +-2861, -477, -3595, -670, 876, -2054, -4342, -4397, -4116, -6615, -9208, -7863, -6310, -5920, -6886, -9904, +-11315, -11098, -6692, -9080, -8248, -7596, -7187, -4048, -3014, -4463, -1927, -4292, -1913, -1957, -4544, -1322, +-1498, -1863, -1375, -626, 4443, 7543, 6652, 9726, 10451, 14948, 14385, 11912, 9198, 15698, 15874, 17350, +11818, 9630, 8470, 6062, 3627, -2897, 1388, 3018, 5199, 4225, 1443, -498, 482, 3072, 5234, 4927, +7914, 13739, 6210, 2096, -1660, -5085, -2640, -1944, -1455, -5776, -4918, -5663, -6971, -10432, -10522, -9411, +-9245, -8008, -9766, -13898, -13280, -11722, -11432, -10989, -10205, -11966, -7044, -8413, -5110, -5736, -7243, -4244, +-5150, -5704, -4759, -4844, -3594, -4203, -5146, -474, 1266, 4799, 5275, 6809, 9179, 14515, 10291, 9342, +8728, 13899, 15025, 14230, 10243, 7235, 8820, 3840, 70, -2770, 90, 2150, 4768, 2236, 114, -2359, +787, 4397, 245, 6079, 10716, 9590, 7436, 369, -2597, -4482, -1215, -1331, -3998, -4441, -3631, -4933, +-8510, -9309, -9333, -9186, -7817, -6686, -12301, -11147, -12276, -12097, -9021, -11743, -9077, -9763, -8358, -4991, +-5125, -6223, -3861, -5150, -3642, -4339, -4511, -2182, -3917, -3857, -2027, -583, 3090, 6338, 4747, 8834, +12154, 14300, 11078, 9473, 11591, 14901, 17059, 13552, 10417, 11127, 8661, 4516, 754, -1055, 1857, 3687, +6343, 3381, -1747, 2090, 3549, 1401, 3856, 8568, 11327, 11755, 7473, 1661, -2746, -102, 55, -532, +-3707, -1046, -1761, -4923, -6126, -7333, -8753, -5305, -5624, -7357, -8299, -10963, -9286, -8815, -9868, -7032, +-8971, -7888, -3995, -5662, -1991, -4897, -1825, -3198, -2235, -3280, -487, -2725, -2285, -1578, -2241, 2872, +3341, 6574, 5357, 10918, 13303, 13032, 11552, 9004, 13172, 15969, 15677, 12025, 12373, 9993, 8062, 3127, +-335, -49, -1523, 7141, 3313, -511, 18, 826, 507, -39, 3575, 6494, 10199, 10006, 4709, -2323, +-3177, -1340, -2188, -4796, -4833, -2391, -6410, -5182, -10459, -10874, -8539, -9382, -7220, -10806, -12107, -11789, +-12344, -12388, -10262, -12387, -9936, -9741, -7850, -6722, -5940, -6116, -4108, -6789, -4123, -3920, -4022, -4148, +-4681, -4205, -2723, 608, 1741, 3062, 5886, 9445, 11595, 12187, 7708, 10017, 12851, 14467, 13969, 11670, +12222, 9623, 5770, 4234, -1705, -2624, 3525, 4605, 1563, -10, 793, -195, -178, 922, 2831, 7298, +11516, 9319, 2916, -2700, -299, -858, -3469, -3027, -4025, -2784, -2910, -7436, -9333, -8375, -9469, -4582, +-9769, -8830, -10178, -11790, -9813, -11104, -10117, -10093, -8723, -8590, -5452, -6867, -3386, -3964, -5076, -3495, +-3367, -1700, -3028, -2595, -4040, -2294, -176, 936, 2866, 4853, 7580, 11424, 13841, 10443, 10953, 11573, +15040, 15683, 13881, 16150, 11815, 10627, 9848, 2736, -869, 1767, 5601, 4170, 3318, 2281, 1576, 961, +1869, 1305, 4657, 9754, 13933, 9141, 1586, 2376, -294, 677, -1437, -3696, -1271, -510, -3983, -4727, +-10207, -6103, -6392, -6172, -7409, -8601, -10078, -9086, -10161, -10228, -9038, -10123, -6896, -7976, -6501, -4196, +-3639, -3963, -4788, -3132, -2611, -1901, -2271, -4419, -3115, -1739, -1046, 550, 2577, 3221, 9402, 9900, +12411, 9303, 9552, 12989, 11938, 14340, 14995, 12163, 10885, 11509, 6051, -170, -1007, 1631, 2752, 2402, +2293, -418, 274, -597, -162, -1461, 3432, 11176, 9727, 5549, 1743, -1098, -154, -1244, -5590, -3089, +-4196, -1716, -5484, -9882, -9320, -8504, -8181, -7611, -10124, -10556, -10762, -11641, -10918, -12286, -11515, -9682, +-9528, -9727, -7016, -5615, -4984, -6128, -5212, -5177, -2568, -2967, -4680, -4700, -3668, -2931, -1006, -1103, +1149, 4579, 7865, 11287, 8965, 9591, 11176, 9871, 13172, 14919, 12906, 11786, 12755, 10880, 3057, 890, +-15, 1278, 3091, 2315, 2407, -709, 834, 579, -2662, -766, 7851, 8699, 11257, 4501, 1375, 2037, +-1007, -537, -4659, -3164, -1412, -1441, -6598, -7601, -8883, -7080, -5840, -8639, -7374, -10637, -9085, -9362, +-10914, -10580, -9732, -7711, -9431, -7090, -5863, -3855, -4165, -3964, -5302, -1724, -1283, -2589, -2111, -4531, +-1075, -1058, -464, 905, 1542, 7739, 10062, 10380, 10768, 12570, 9872, 13064, 15382, 14901, 13308, 15072, +14972, 9144, 5459, 1474, 2707, 1947, 4719, 4152, 1286, 2421, 3176, -2075, -425, 1901, 7947, 11990, +8649, 5796, 3405, 1460, 1996, -2277, -3479, -1011, -1033, -1544, -5932, -7904, -7282, -6232, -6711, -6641, +-9533, -8990, -8990, -9409, -11561, -9978, -9279, -9233, -8660, -7398, -6511, -3348, -5151, -5378, -4153, -3178, +-1447, -2917, -4428, -3462, -2657, -1006, -1241, -2650, 3865, 6454, 7948, 9848, 10587, 9538, 9285, 13953, +12851, 12253, 13822, 14743, 12663, 7191, 3744, 1598, -241, 2450, 3910, -740, 3450, 742, -195, -2899, +-3192, 2689, 7177, 8929, 7483, 4009, 1606, 2235, -1545, -3338, -3617, -2991, -795, -4375, -7371, -8546, +-8844, -7002, -7355, -9099, -10624, -9574, -10033, -11709, -11821, -11089, -11089, -9332, -10357, -8829, -5669, -6163, +-5239, -6833, -4893, -3055, -2934, -3586, -5257, -4850, -1118, -2379, -4093, -825, 3269, 5376, 7516, 10685, +8063, 8979, 11505, 12615, 11532, 12566, 14622, 15513, 10311, 8170, 4075, -532, 3692, 1710, 1853, 2504, +2373, 2330, -1312, -3861, -361, 3226, 7845, 9881, 6198, 5596, 3415, 1644, 219, -3282, -1710, -1191, +-190, -3744, -5839, -8108, -6368, -5441, -6483, -8590, -8299, -7921, -9921, -8750, -11343, -9684, -8428, -9439, +-7861, -7045, -4538, -3811, -4975, -4586, -2882, -2078, -40, -3527, -4481, -304, -829, -1766, -2735, 2419, +2665, 7593, 10149, 9421, 9295, 11320, 12939, 12999, 11195, 15750, 16211, 14303, 13525, 7298, 3443, 3982, +2448, 3066, 2266, 3328, 4719, 889, -1581, -2541, -153, 4518, 8854, 7671, 7861, 4927, 3932, 2008, +-955, -2214, -1739, -532, -740, -3668, -6988, -8025, -5090, -6261, -7865, -7851, -9342, -8421, -9430, -10983, +-10919, -10125, -9986, -9048, -9944, -6381, -5509, -5585, -4912, -6542, -3195, -1505, -2504, -5725, -3190, -1034, +-3288, -2828, -2282, -572, 2965, 7900, 7233, 8524, 7528, 12494, 10764, 9320, 13777, 12742, 15193, 14767, +10089, 5907, 3564, 2065, 2749, 180, 1709, 4225, 1404, 561, -3980, -3874, 161, 3633, 7194, 6644, +6207, 4124, 3520, 118, -1572, -3197, -2164, -805, -1500, -5612, -8573, -6142, -7218, -6803, -8426, -9485, +-8675, -9639, -10459, -11243, -11596, -10594, -10250, -11246, -8011, -8191, -5520, -5549, -6996, -5864, -2572, -1995, +-5137, -4065, -2114, -3443, -1894, -3163, -3081, -115, 3827, 8249, 6289, 7156, 11452, 9955, 10469, 11773, +11372, 14843, 15940, 14273, 10293, 5536, 4693, 3987, 885, 2004, 2906, 4365, 3282, -511, -3712, -1912, +934, 5577, 6978, 7389, 7129, 5372, 4234, 526, -125, -2624, -44, 1340, -2314, -4589, -6140, -5606, +-5115, -6346, -7603, -7146, -8374, -7885, -9455, -10582, -8970, -10779, -8813, -9271, -7548, -6344, -3837, -5742, +-6137, -2992, -1314, -3403, -2388, -2261, -2829, -703, -1799, -2037, -3212, 1384, 7427, 5626, 7042, 10307, +9546, 11858, 10947, 11021, 12954, 15441, 16840, 14478, 8307, 7850, 5134, 3369, 1653, 1920, 3990, 5325, +2446, -1269, -3482, -1550, 2039, 5159, 6528, 7016, 7453, 4898, 3827, 915, -2128, -1152, 663, -430, +-2353, -5597, -6091, -4943, -6763, -6261, -8166, -7905, -7903, -9799, -9488, -10571, -10607, -10865, -9618, -10217, +-8408, -5708, -5786, -8348, -4351, -4101, -4237, -2672, -4349, -2715, -4315, -1317, -1971, -6423, -2574, 2488, +3192, 5179, 6783, 7288, 10311, 9188, 9968, 9589, 11293, 16273, 14853, 11767, 8113, 6620, 3915, 2533, +-451, 1707, 3822, 3907, 1271, -3883, -3618, -2626, 2434, 3013, 5752, 6706, 5242, 5932, 1974, -832, +-1947, -772, -294, -556, -4434, -5016, -6008, -6174, -5858, -8021, -7166, -7985, -8950, -9201, -9649, -10536, +-11257, -9558, -10909, -9862, -6250, -6657, -7218, -5655, -4730, -4244, -3371, -3017, -2067, -5607, -593, -600, +-5011, -3827, -1189, 1775, 4802, 4907, 7296, 8551, 10161, 10823, 9116, 9579, 14374, 16106, 15125, 11781, +8941, 7674, 4771, 2228, 391, 3449, 4804, 4738, 559, -3512, -2487, -628, 1804, 4693, 6133, 6297, +7955, 5221, 2267, 257, -1525, 1588, -254, -286, -3270, -4657, -4751, -4880, -6177, -6023, -6785, -7282, +-7936, -8015, -9097, -10674, -7980, -11240, -9828, -6908, -6898, -5800, -6474, -4365, -3886, -4662, -1010, -2029, +-4707, -1256, 341, -2712, -2844, -4054, 478, 2371, 4439, 6013, 6869, 9459, 11398, 9624, 8537, 11824, +14284, 17049, 14065, 12073, 9596, 7923, 4588, 1411, 1790, 3347, 6125, 3852, -929, -2393, -2953, -695, +2674, 3660, 5204, 7512, 6622, 5358, 779, -312, -196, 146, 235, -1761, -3920, -4545, -5165, -5808, +-6634, -6279, -7696, -8198, -7306, -10299, -9659, -9082, -11664, -11036, -9910, -7827, -7499, -8256, -5432, -5524, +-6958, -2131, -3396, -5112, -2951, -2529, -1014, -4035, -4482, -3753, -1186, 1549, 3779, 3721, 6431, 9688, +8970, 8218, 7637, 11424, 14029, 15499, 12799, 10883, 9759, 6096, 3934, -28, 1144, 4305, 4990, 1777, +-803, -4300, -3192, 26, 627, 3352, 4506, 7161, 6920, 2708, 1138, -808, -32, 321, -638, -2199, +-4020, -4138, -5771, -5902, -5583, -7767, -7068, -6586, -9998, -8253, -9271, -9814, -11238, -11287, -7786, -8389, +-8577, -5049, -6646, -6601, -3274, -3232, -3915, -3885, -2473, -894, -1928, -3493, -3478, -3991, 434, 2345, +2897, 4549, 8171, 9851, 9002, 7942, 8886, 12517, 15348, 14631, 13811, 11916, 9856, 7699, 2829, 791, +3850, 4232, 6108, 2162, -1304, -3062, -1800, 488, 1678, 2973, 6443, 8226, 6246, 4128, 735, 1115, +855, 1569, -437, -1610, -1957, -4889, -3680, -4533, -6833, -5035, -5901, -7274, -8063, -7695, -7715, -9604, +-12014, -6837, -9668, -7531, -5342, -6702, -5914, -4785, -2322, -3531, -3725, -3014, -509, -1830, -1191, -2917, +-4487, -1773, 439, 2150, 2356, 5839, 8309, 9572, 8451, 7114, 10240, 12340, 14843, 14497, 13211, 11631, +10501, 5563, 2310, 1732, 2247, 5751, 4296, 1408, -2537, -3806, -1067, -837, 267, 2809, 5972, 7398, +5180, 2484, 79, 536, 1268, -1046, -472, -2044, -4657, -3454, -5350, -6624, -6119, -6377, -6522, -9005, +-8814, -6412, -10923, -10803, -9955, -10357, -9528, -7026, -7370, -7546, -6591, -4196, -3516, -5533, -3507, -2955, +-2076, -1540, -2217, -4249, -4576, -1533, -492, 902, 2382, 5349, 8557, 8454, 6675, 8039, 9186, 12628, +14618, 12858, 13639, 11867, 8986, 5568, 1501, 1567, 3280, 5291, 4579, -250, -2897, -2453, -1626, -1207, +-59, 3274, 6525, 6867, 5394, 604, 1879, 900, 6, 658, -921, -3055, -2349, -4489, -5029, -6279, +-5974, -4359, -9141, -7419, -6414, -8998, -9547, -9611, -10663, -9924, -8137, -6744, -7497, -7781, -4637, -3624, +-4729, -4024, -3287, -2406, -1339, -561, -2967, -3558, -3211, -1253, 178, 772, 2914, 7197, 8299, 8141, +7660, 7507, 11059, 13260, 13620, 14455, 13794, 12313, 9782, 4576, 2822, 1646, 5032, 6430, 3406, 186, +-2225, -1036, -1744, -1138, 1128, 3167, 8619, 6536, 4065, 2868, 1947, 817, 2260, -371, -253, -1950, +-2468, -2683, -6822, -3889, -4453, -6767, -7031, -5722, -7787, -7747, -8624, -9758, -10240, -9613, -6234, -7575, +-8074, -5877, -4476, -3783, -4690, -3317, -4036, -1269, -808, -1538, -2672, -3808, -2579, -929, -921, 432, +4267, 6104, 8816, 7035, 6392, 8915, 10206, 12861, 13202, 13880, 13869, 11746, 8578, 4190, 1155, 2561, +5117, 5340, 1946, -766, -1562, -2844, -1760, -2284, -432, 5253, 6284, 5184, 4287, 966, 1839, 847, +774, -158, -2424, -1157, -2668, -6191, -4675, -4499, -6846, -6384, -6969, -7079, -8398, -7884, -8954, -11209, +-10956, -8302, -7535, -9043, -7652, -6213, -5006, -4409, -4678, -5184, -3089, -1709, -1380, -1874, -4177, -3081, +-2388, -2356, -1104, 452, 3623, 7362, 6910, 6239, 7059, 7991, 11096, 11480, 13287, 14210, 12978, 12636, +6896, 4014, 691, 3968, 5325, 3827, 2173, -936, -2162, -1596, -3219, -3113, 2120, 3449, 7094, 4831, +3258, 2129, 890, 2485, 480, -1634, -26, -1125, -4555, -4030, -4065, -5791, -5441, -6488, -5777, -8328, +-6697, -7093, -9684, -11049, -9390, -7420, -8539, -7772, -7226, -5749, -3789, -4278, -4933, -4002, -2655, -469, +-813, -2825, -2189, -2377, -2240, -1288, -1617, 1801, 5198, 7070, 7214, 6508, 7751, 9165, 10692, 12692, +13370, 14977, 14055, 12741, 7118, 3106, 3122, 4940, 5039, 5456, 1157, -81, 88, -3283, -2018, -2212, +2109, 5431, 6138, 5853, 3227, 1498, 3992, 1747, -446, 936, 250, -2140, -3022, -3337, -4191, -5549, +-4589, -5601, -6909, -7037, -5537, -7645, -10502, -9614, -8787, -8079, -7953, -7952, -7357, -4477, -4621, -4256, +-5200, -4613, -1015, -1186, -1964, -1994, -2909, -2111, -2165, -3049, -810, 1471, 5340, 6409, 5840, 6871, +6668, 9114, 10031, 12017, 12993, 14118, 14766, 10917, 5175, 3741, 2202, 4840, 5510, 2253, 1724, -284, +-1870, -2965, -4383, -1642, 1501, 3977, 6698, 3357, 1461, 3518, 2044, -113, 332, 269, -1157, -2863, +-3140, -3985, -5920, -4918, -5265, -7022, -7747, -5965, -6646, -9630, -9750, -10433, -9024, -8442, -9181, -8127, +-7263, -5384, -4225, -5644, -6166, -3163, -2238, -1464, -2112, -3178, -1587, -3156, -2214, -3750, -718, 2111, +4777, 6137, 5611, 6600, 6749, 9085, 10132, 11596, 12324, 16406, 13440, 10255, 5954, 2015, 4942, 4717, +4412, 3253, 1181, 851, -2122, -3741, -3036, -1831, 1407, 6565, 4408, 3157, 3546, 3366, 1574, 560, +1687, -207, -820, -2010, -2187, -4819, -4443, -3781, -5776, -6880, -5751, -5539, -7152, -8156, -9968, -9038, +-8354, -8776, -7603, -8433, -6239, -3842, -4754, -5457, -4707, -3222, -529, -1976, -1516, -2206, -1157, -1855, +-3169, -2451, -168, 2946, 5446, 5777, 6474, 6265, 7443, 10381, 8893, 11881, 14491, 15454, 14569, 9509, +4720, 4791, 4423, 5600, 4123, 3066, 2955, -52, -2276, -2342, -4327, -1248, 3687, 4898, 4022, 3862, +4171, 2415, 1752, 1806, 1091, -410, -398, -1167, -3469, -4626, -2824, -5110, -6028, -5890, -5975, -5374, +-7254, -8876, -9092, -9286, -8805, -7625, -9513, -7584, -5599, -4718, -4565, -6578, -4140, -2931, -1039, -2164, +-2329, -1403, -1322, -2644, -3526, -2766, 176, 2862, 4525, 6307, 4419, 6648, 8387, 7499, 9802, 11030, +14203, 16348, 12359, 8517, 4676, 4264, 5175, 3898, 3506, 4095, 934, -216, -1795, -4783, -4400, -297, +2906, 3289, 3723, 3919, 2749, 1772, 1961, 1458, -599, -141, -32, -3081, -4002, -3532, -4381, -5481, +-6346, -6494, -5456, -6420, -8147, -8205, -10787, -8491, -9046, -9121, -9150, -8068, -5151, -5302, -5631, -6483, +-4414, -2424, -1786, -3064, -1738, -1607, -1179, -3469, -4021, -1733, -858, 3787, 4908, 3917, 6269, 6387, +7933, 8011, 8766, 11830, 15679, 15265, 12796, 7301, 5490, 5989, 3662, 4990, 4350, 3261, 1806, 861, +-2809, -4899, -2780, 531, 2299, 3603, 4766, 3639, 2692, 2848, 3168, 177, 682, 1577, -1271, -2028, +-3100, -2984, -3736, -5352, -5873, -4690, -5944, -5234, -7399, -8787, -8572, -8544, -8064, -9150, -8553, -6440, +-4898, -4606, -5760, -5842, -2907, -2267, -1660, -2624, -1041, -90, -1981, -2982, -2771, -3159, 2184, 3171, +4230, 5331, 5526, 7681, 7632, 7245, 9419, 12503, 16084, 15722, 10766, 8194, 6530, 4578, 4875, 5229, +3561, 3464, 2860, 152, -4065, -4010, -2299, 226, 1663, 4279, 4318, 2131, 3695, 3311, 1285, 496, +1746, 85, -923, -2820, -2894, -2488, -5605, -4540, -6346, -5081, -5393, -6198, -7730, -9018, -8417, -8530, +-8969, -9565, -8256, -6639, -4608, -6079, -5951, -5447, -3460, -1771, -3773, -1460, -951, -1501, -1036, -4108, +-3828, -1433, 1111, 3031, 4054, 4074, 6727, 6638, 6968, 7124, 8314, 14060, 15842, 13791, 10802, 8345, +5246, 5233, 5188, 3968, 3266, 4374, 2577, -1437, -4146, -3656, -2090, -1217, 2786, 3861, 2241, 3268, +3777, 1780, 1418, 699, 1351, 105, -2516, -1807, -3067, -3760, -4878, -5798, -5835, -5276, -5713, -6474, +-8549, -8459, -8635, -8868, -9458, -9931, -8040, -6159, -5911, -5653, -7302, -4325, -3512, -3733, -2185, -2500, +-1241, -245, -2802, -4073, -3515, -1794, 2102, 1869, 3799, 4729, 6098, 7223, 6186, 5800, 10220, 14433, +14772, 13952, 11038, 7448, 5969, 6207, 4578, 3671, 4482, 5035, 2135, -2257, -2488, -3502, -2814, 578, +3280, 2266, 3857, 3578, 3658, 2459, 982, 2744, 992, -56, -952, -1930, -2070, -3361, -4513, -4984, +-5330, -4073, -5290, -6294, -7585, -7722, -7612, -8349, -9724, -8215, -7779, -4836, -5475, -6589, -4548, -4676, +-3183, -2248, -2849, -1324, 192, -684, -1999, -4290, -2659, -186, 1268, 2783, 3809, 4709, 7742, 6299, +5204, 6942, 11338, 13702, 15252, 14209, 9867, 7850, 6785, 6154, 3796, 3825, 5893, 4418, 835, -1034, +-2934, -4899, -1030, 46, 2238, 2339, 3212, 4189, 2267, 1859, 1874, 1821, 551, -235, -1687, -1612, +-2814, -3576, -5103, -5704, -4563, -5253, -5185, -7415, -7865, -7088, -8913, -8631, -10325, -9032, -6486, -6358, +-6746, -5355, -6367, -4284, -3426, -3842, -2251, -2078, 425, -1230, -3440, -4009, -2684, -869, 1486, 1811, +2832, 6140, 6604, 4923, 4879, 7665, 10123, 14291, 15097, 12789, 9388, 7892, 7480, 4685, 3127, 5334, +5384, 3033, 2048, -2106, -4092, -3324, -1967, 652, 798, 2514, 4070, 2441, 2493, 1779, 2116, 1458, +417, -569, -1304, -1918, -2339, -4497, -4873, -5364, -4896, -4282, -6830, -6576, -7627, -7646, -7875, -10134, +-10033, -7511, -7740, -6149, -6271, -6305, -5345, -4540, -3651, -3335, -3156, -556, 158, -1955, -2891, -4254, +-2374, 229, 788, 1058, 4293, 6544, 5295, 5349, 5027, 7451, 11015, 14903, 14927, 11875, 9676, 9745, +6516, 4020, 5483, 4817, 5575, 4322, 1370, -1821, -3746, -2518, -787, -621, 1881, 3357, 3619, 2805, +2653, 2602, 2566, 1406, 1210, -735, -249, -1436, -2476, -3350, -5416, -3939, -4229, -4932, -5350, -7097, +-6630, -6163, -9328, -8968, -9076, -7759, -6549, -6304, -5946, -5539, -5379, -3464, -3833, -3687, -1670, -362, +127, -1412, -3467, -3988, -825, -114, -399, 2352, 4800, 5834, 5363, 4950, 4703, 7448, 11668, 15397, +13188, 11258, 11781, 7806, 6191, 4872, 4547, 5243, 5500, 4124, 928, -3144, -2909, -2368, -2269, -365, +1467, 3302, 2630, 2212, 2862, 1787, 2687, 773, 568, -338, -1116, -1296, -2783, -4800, -4422, -4829, +-4490, -4471, -7487, -5916, -6642, -7538, -9051, -9700, -9048, -7691, -7184, -6373, -6310, -6322, -4355, -4657, +-4376, -3401, -1933, -347, 178, -2378, -4553, -2216, -1448, -1321, 36, 2480, 4670, 5430, 5068, 4456, +3792, 7981, 13418, 12944, 12964, 12765, 10060, 8408, 5683, 5192, 4413, 5362, 6105, 3874, -452, -2214, +-2626, -2798, -2256, -569, 2351, 2130, 2847, 2146, 2431, 2827, 1529, 1516, 444, -842, 105, -2128, +-2794, -4082, -5367, -3600, -4305, -5885, -6067, -6207, -6392, -7385, -9570, -9115, -9024, -7655, -6620, -7020, +-6399, -5391, -4570, -5204, -3764, -3935, -1504, 757, -850, -3232, -3139, -1904, -2170, -1107, -41, 3329, +4022, 5897, 5349, 2267, 5051, 9739, 11559, 13415, 13264, 12551, 10280, 7957, 6513, 4849, 4291, 6866, +5819, 3469, -537, -1511, -2214, -3377, -1499, -333, 2267, 2484, 2410, 2582, 3037, 2085, 2996, 753, +711, 357, -840, -655, -3124, -4613, -3618, -3718, -4405, -5400, -5970, -5271, -6148, -7701, -8665, -9497, +-8079, -6944, -6952, -6997, -5352, -5103, -4884, -4160, -4722, -3182, 12, 302, -1636, -2349, -2518, -1755, +-2556, -914, 1142, 1850, 5742, 6042, 2960, 3292, 5869, 9181, 11679, 13104, 13604, 12053, 9793, 8842, +5538, 4521, 5146, 6905, 5737, 2107, 163, -1728, -2837, -2949, -2345, 55, 1985, 1384, 2931, 1510, +2842, 2649, 1387, 1351, 84, -347, 129, -1936, -3952, -4145, -4116, -3799, -5241, -5922, -5621, -5910, +-6475, -8063, -9570, -9623, -7650, -7923, -7863, -6429, -6315, -5224, -4802, -5643, -5127, -2251, -500, -726, +-2146, -2354, -1996, -3826, -1472, -1254, -680, 3602, 5489, 4286, 2649, 3333, 6050, 8699, 11301, 13660, +12368, 12071, 10170, 8205, 5175, 4220, 6483, 6557, 4938, 2653, -395, -1191, -2989, -3324, -1427, -304, +1777, 2201, 1534, 2653, 2763, 2201, 2586, 469, 405, 915, -322, -1724, -3888, -3453, -3421, -3928, +-5092, -5184, -5437, -5274, -5873, -8530, -9145, -8297, -7715, -8024, -6637, -7100, -5207, -4356, -5576, -5403, +-4434, -1156, -423, -1647, -691, -1784, -3239, -1765, -1666, -2351, 1213, 4021, 5514, 3547, 2838, 4329, +5396, 9459, 11705, 13219, 12463, 12470, 10590, 7700, 4622, 5930, 6147, 6903, 4908, 2029, 1010, -2193, +-2464, -2828, -2151, 720, 1389, 1632, 2247, 2190, 2725, 3217, 1315, 909, 744, 1045, -191, -2509, +-3190, -3260, -3307, -4421, -4476, -5809, -4796, -4690, -6818, -8411, -8436, -8546, -7743, -7282, -7918, -6055, +-4870, -4724, -5709, -6363, -2378, -1768, -1511, -240, -1107, -2790, -1634, -2231, -2534, -2027, 1773, 4772, +3890, 3871, 2790, 3668, 5900, 9322, 11766, 12232, 12706, 13061, 9477, 7148, 5079, 5625, 6976, 5766, +4768, 2565, -367, -1414, -3100, -3457, -1322, -330, 1196, 1581, 1157, 2275, 2846, 2301, 1055, 390, +1196, 729, -1050, -2760, -3049, -3647, -3667, -4230, -5752, -5421, -4385, -5817, -7056, -8189, -9475, -7875, +-8142, -8180, -7802, -6392, -4048, -6124, -7011, -4608, -3251, -2774, -374, -1249, -1776, -2252, -1624, -2665, +-3777, -919, 2236, 3760, 4151, 3171, 2689, 3347, 6254, 9832, 10354, 12621, 13406, 12122, 9809, 6132, +5849, 6496, 6004, 6700, 4499, 2237, 602, -2105, -2737, -2780, -1690, 302, 1259, 1190, 1458, 2804, +2975, 2354, 791, 1369, 1642, 532, -963, -2019, -3173, -2958, -2967, -5098, -4907, -4359, -4985, -4792, +-7051, -8254, -8345, -7850, -7524, -8489, -7825, -3998, -5292, -6559, -5245, -5103, -2994, -1849, -277, -1524, +-1666, -944, -1654, -3757, -2759, -443, 2453, 3876, 3899, 3338, 1659, 4468, 6700, 8672, 11044, 12393, +13953, 12004, 8539, 7007, 6197, 5939, 7049, 5895, 4714, 2778, -420, -1272, -3065, -2640, -1639, 560, +771, 967, 1569, 2923, 3049, 1359, 1365, 1640, 1233, 543, -674, -2833, -2470, -2422, -4359, -4068, +-5258, -4332, -4347, -5377, -6833, -8515, -8120, -6877, -8905, -8907, -5541, -5459, -5331, -6169, -5639, -5027, +-2996, -986, -1325, -1983, -401, -1084, -2430, -3891, -2490, 56, 2037, 4327, 3686, 1826, 2963, 4015, +6675, 8543, 10195, 13837, 13214, 11172, 8979, 6550, 6387, 6338, 6348, 6343, 4593, 2158, -59, -1615, +-3120, -2822, -1408, 258, 384, 400, 1947, 2858, 2022, 1393, 1588, 825, 1673, 434, -1964, -1876, +-2696, -3159, -3935, -4993, -4907, -4376, -4771, -4902, -8321, -8154, -6814, -8952, -8979, -8062, -6033, -5660, +-5665, -6062, -6468, -5063, -1921, -2039, -2057, -1326, -307, -1235, -3610, -3314, -2601, -386, 3132, 3520, +2848, 2056, 2416, 4765, 5887, 7671, 11635, 13021, 13114, 10982, 8323, 7155, 6271, 6241, 6769, 6353, +4380, 2264, 148, -1697, -2964, -2660, -854, 119, -182, 927, 2536, 1922, 2686, 1523, 962, 2275, +1369, 65, -1111, -1973, -2178, -2805, -4303, -3983, -5321, -3503, -3709, -6467, -7260, -6661, -7672, -8609, +-8611, -7146, -6184, -5195, -4870, -6887, -6046, -3590, -2101, -2038, -2276, 221, -316, -1821, -2523, -3876, +-2121, 773, 2911, 3813, 2373, 1927, 3899, 3749, 5945, 8311, 11510, 13512, 12706, 10725, 8606, 7278, +6150, 6812, 6835, 6218, 4447, 2261, 374, -1951, -3021, -2155, -507, -1126, 449, 1023, 1596, 3027, +1687, 1222, 1782, 1883, 1248, 69, -1632, -1068, -2788, -2793, -3809, -5572, -3845, -3168, -5208, -6152, +-6666, -6625, -8504, -8529, -8159, -7816, -5824, -4715, -6089, -7059, -5770, -3057, -2891, -3072, -820, -666, +-371, -1602, -3614, -3552, -2261, 939, 3447, 2369, 2222, 2558, 2993, 3781, 5520, 8217, 11925, 12991, +12407, 10508, 8433, 6962, 6416, 6865, 6605, 6168, 4200, 2539, 94, -2858, -2048, -2117, -1598, -438, +-231, 708, 2464, 1809, 1591, 1341, 1535, 2364, 333, 69, -1018, -2115, -1940, -2982, -5311, -4407, +-3463, -4026, -5520, -5925, -5847, -8093, -7943, -8503, -8824, -7375, -5620, -4796, -7126, -7095, -4625, -3973, +-3395, -2280, -1718, -13, -666, -2114, -3397, -4586, -1242, 1397, 2591, 2100, 2296, 2485, 2892, 3457, +5126, 8931, 11571, 12983, 12130, 10366, 8175, 7219, 6643, 6876, 6910, 5565, 5373, 2102, -681, -1498, +-2204, -2209, -817, -1220, 176, 1375, 1889, 2349, 1044, 1976, 2369, 1322, 1462, 13, -1339, -820, +-1758, -3768, -4617, -3459, -3149, -4812, -4516, -5059, -6564, -6954, -7960, -8108, -8886, -6465, -4492, -5936, +-6851, -5694, -5107, -3300, -3294, -2351, -679, -296, 168, -2070, -4242, -3443, -517, 1607, 2377, 2208, +2441, 2984, 2437, 3409, 5490, 9169, 11540, 13157, 11906, 10062, 8569, 6784, 7613, 6421, 6439, 6879, +4601, 1573, 71, -2092, -1889, -1882, -1864, -773, -245, 1407, 2034, 832, 1971, 1708, 1533, 2065, +767, -695, -703, -716, -2587, -4520, -3837, -3314, -4574, -4070, -4891, -5251, -6740, -7100, -7751, -9610, +-8195, -5717, -5980, -5915, -7008, -5995, -4814, -4201, -3236, -2556, -1276, 414, -343, -3125, -4428, -3117, +-429, 1383, 1709, 2032, 2677, 2344, 2010, 3304, 5310, 9023, 11723, 12430, 11965, 9524, 7996, 7946, +6613, 6096, 7591, 5964, 4743, 1598, -537, -1262, -2134, -1933, -1690, -1612, 766, 1203, 922, 1903, +1331, 1634, 2159, 1838, 367, -691, 578, -1384, -3246, -3573, -3552, -3741, -4128, -4065, -4381, -5805, +-5953, -6468, -9313, -8384, -7676, -5863, -5651, -6537, -6234, -5988, -4863, -3812, -3350, -2846, -228, 577, +-677, -3489, -4237, -2335, -225, 1285, 1348, 2814, 2319, 2201, 2201, 2745, 6028, 8810, 11658, 13002, +10980, 9332, 9169, 7080, 6712, 6864, 6954, 6949, 3944, 1685, -136, -1569, -1331, -2272, -2397, -374, +316, 705, 1603, 1222, 1423, 1699, 2851, 943, 0, 844, -34, -1739, -2941, -3387, -3338, -4204, +-3523, -3823, -5403, -4492, -5776, -7501, -8703, -8532, -6814, -6116, -5961, -6114, -6293, -5984, -4273, -4020, +-3835, -2189, 180, 739, -1353, -3594, -3973, -1486, -588, 1195, 1918, 2456, 2692, 2029, 1765, 3580, +5383, 9178, 12536, 11791, 11030, 10109, 8335, 7892, 6328, 7121, 7725, 6196, 4567, 1320, -254, -328, +-1973, -2604, -1591, -737, 304, 767, 1656, 563, 1496, 2814, 1697, 590, 821, 773, -134, -2214, +-2432, -3272, -4239, -3049, -3912, -4723, -4342, -4588, -5858, -7962, -8862, -7691, -7109, -6392, -5741, -6465, +-6511, -5561, -4535, -4560, -4108, -1714, 196, 636, -2426, -3662, -3309, -2204, -336, 875, 1509, 2901, +1685, 1844, 2024, 2199, 5806, 9623, 11340, 11778, 10584, 9702, 8742, 6738, 6808, 7022, 7187, 6920, +3186, 1256, 477, -995, -2247, -2697, -1533, -1286, 301, 1103, 328, 516, 2439, 1838, 1475, 313, +1477, 611, -1094, -1091, -3135, -3624, -3361, -3358, -4322, -4492, -4036, -4204, -6409, -8292, -8008, -7967, +-6857, -6189, -5902, -6629, -6139, -5063, -4959, -4560, -4147, -923, 782, -367, -2146, -3430, -3209, -1579, +-514, 875, 2592, 1790, 2558, 2041, 946, 3169, 5949, 9712, 11520, 11177, 11097, 9852, 8175, 7675, +6281, 7563, 8082, 6000, 3423, 1736, 858, -1252, -1980, -2102, -2260, -651, 955, 78, 406, 1118, +2579, 1697, 807, 1741, 968, 381, 18, -1692, -3083, -3137, -3021, -3469, -4538, -4138, -3083, -4705, +-6506, -7911, -7895, -7740, -6511, -6038, -6414, -6174, -5863, -5003, -4896, -5515, -2924, -556, 351, -171, +-2577, -3100, -2571, -2272, 107, 1344, 1569, 2849, 2281, 1414, 1292, 2786, 6648, 9624, 10794, 11894, +10414, 9993, 8553, 6832, 6807, 8112, 7774, 5596, 3466, 2366, -25, -718, -1781, -3190, -1660, -435, +478, -486, 59, 2159, 1433, 1248, 1503, 963, 830, 739, -414, -2065, -3205, -2975, -2917, -4494, +-4446, -3709, -3300, -5179, -6607, -8096, -8214, -7364, -6779, -6518, -6545, -6520, -5360, -5324, -6207, -4851, +-3077, -587, 442, -1500, -2095, -3110, -3607, -1348, -372, 672, 2192, 2222, 2315, 783, 662, 3670, +5935, 9511, 10832, 11104, 10583, 10065, 7821, 6790, 7244, 8362, 6969, 5776, 3925, 1394, 1000, -845, +-2221, -3099, -1382, 234, -747, -428, 1094, 1397, 1387, 1815, 1092, 1154, 1186, 1009, -332, -2484, +-2320, -2592, -3133, -4576, -3764, -3159, -3466, -4523, -6928, -7752, -7621, -7104, -6334, -6591, -6704, -5213, +-5389, -5757, -5578, -5213, -1739, -401, -209, -524, -2217, -3401, -2422, -1634, -61, 1016, 2053, 3251, +1320, 846, 1229, 3280, 6576, 9333, 10563, 11132, 10962, 9724, 7272, 7380, 7846, 7437, 7758, 5466, +3478, 1960, 934, -590, -3298, -2408, -629, -1023, -817, -3, 579, 1170, 1549, 1398, 967, 922, +1622, 826, -1046, -2207, -2081, -2618, -3983, -3995, -3976, -3080, -3191, -5171, -6806, -7894, -7604, -6467, +-6982, -7179, -5741, -5741, -5134, -6109, -6513, -3823, -2180, -759, 420, -1417, -2134, -3266, -2529, -1278, +-660, 1241, 2776, 2330, 1424, 626, 1081, 3633, 6546, 9104, 10075, 11784, 10758, 8693, 8094, 7407, +7603, 8004, 7458, 5519, 3146, 2668, 1364, -1826, -2702, -1452, -1555, -813, -830, 21, 405, 1213, +1707, 1035, 817, 1327, 1889, 354, -1276, -1450, -2209, -2964, -3691, -4432, -3496, -2888, -3544, -4765, +-7555, -7710, -6711, -7185, -7093, -6978, -6096, -4778, -5969, -6988, -5374, -4642, -1773, -666, -144, -1233, +-2741, -2923, -2248, -2136, -316, 1550, 2387, 2412, 818, 541, 823, 4108, 6154, 8197, 11137, 11131, +10211, 8840, 7885, 7540, 7403, 8462, 7196, 4732, 3909, 3246, 28, -1428, -2277, -1709, -1590, -1033, +-590, -483, 574, 1266, 1542, 559, 958, 2038, 1346, 124, -730, -1544, -2051, -2862, -4182, -3652, +-3705, -2547, -2890, -5815, -7046, -7054, -6903, -6613, -7573, -6977, -4568, -5718, -5818, -6649, -5668, -3750, +-1976, -110, -205, -1684, -2136, -2536, -2600, -1750, -78, 1945, 2476, 2417, 672, 114, 2097, 3541, +5916, 8869, 10948, 11136, 9935, 9071, 7967, 7301, 8219, 8466, 6487, 5363, 4360, 2780, 231, -1367, +-1894, -1975, -1359, -1020, -745, -452, 599, 1510, 1083, 614, 1312, 1845, 1327, 183, -798, -1272, +-2194, -2934, -3964, -3930, -3438, -2382, -3212, -5672, -7121, -6982, -6706, -6909, -7536, -6782, -4710, -5646, +-5935, -6647, -5641, -3809, -1884, -148, -260, -1659, -2145, -2533, -2615, -1743, -80, 1944, 2495, 2379, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 131, 36, 158, 134, 18, 45, 80, 81, 120, 182, 178, 81, 18, 71, 151, +56, 7, -80, -321, -488, -304, 95, 430, 606, 447, 78, -304, -496, -482, -167, 209, +385, 404, 444, 438, 223, 110, 56, -2, 23, 120, 115, 13, -47, -86, -104, -188, +-265, -286, -304, -428, -478, -425, -600, -837, -807, -621, -418, -316, -278, -313, -531, -847, +-1039, -1041, -921, -623, -229, 75, 304, 362, 144, -74, -196, -199, 0, 215, 282, 404, +469, 299, 196, 320, 585, 703, 531, 95, -367, -669, -735, -323, 322, 551, 258, -220, +-685, -986, -977, -856, -934, -1220, -1813, -2693, -1990, 11161, 28470, 23990, 13023, 11765, 1219, -12425, +-4350, 6024, 4916, 5015, 1524, -4284, -4347, -4521, -5903, -2175, -2023, -5093, -4501, -5640, -7468, -3788, +-2042, -3975, -3285, -3652, -4979, -4175, -4882, -5939, -4263, -4704, -5131, -2616, 10, -569, -2091, -1995, +-1209, -2344, -3643, -1597, -269, -480, -1288, -619, 381, 657, 258, -99, 958, 1394, 1558, 666, +1879, 2687, 1543, -304, 104, 47, -1642, 3505, 2705, -13232, -21902, -18800, -22825, -18611, 156, 8625, +7156, -2674, -16289, -4204, 20080, 20808, 22997, 30619, 13234, -4017, -732, 3086, 8786, 16698, 11751, 5955, +6353, 1111, -1718, 2173, 506, 304, 2635, -982, -1290, 4538, 4678, 2141, 762, -2183, -1639, -1661, +-2878, -663, 1302, -2280, -4302, -2691, -918, 616, -372, -674, 205, 330, -2209, -2397, -107, 124, +-791, -1550, -124, 769, 1217, 609, 1544, 3268, 4544, 4389, 3638, 5582, 4070, 1189, 1698, -2189, +-5358, 5411, 7349, -5946, -10141, -14428, -25537, -23395, -12364, -1131, 12528, 4043, -17403, -10549, 4463, 6240, +19435, 31273, 19352, 6411, -655, -4681, 4063, 12235, 8578, 7608, 5243, -1610, -1650, -1053, -3410, 246, +1527, -4584, -4501, -1121, 1044, 2369, 110, -3731, -2834, -3702, -6755, -3980, -1690, -3406, -6862, -7209, +-5415, -2667, -2458, -3396, -2097, -2197, -3205, -4917, -3598, -2177, -1407, -2386, -2424, -1059, -928, -915, +-1726, -56, 2184, 1993, 2345, 4215, 459, 1278, 4293, -5679, -8761, 3308, 4238, -1768, -2237, -12038, +-21329, -23719, -26535, -12824, 10221, 5686, -10074, -8616, -7379, -4308, 12424, 25581, 26179, 20729, 6356, -2347, +2662, 7437, 10070, 12383, 7952, 3146, 3627, -175, -1770, 1806, 3469, 360, -1980, -1978, 1820, 5331, +2630, 798, 672, -375, -3590, -2901, -182, 343, -2665, -5628, -4235, -2686, -1558, -1661, -526, -545, +-540, -1436, -2509, -1397, -318, 42, -564, -248, 1230, 1676, -270, 2073, 2600, 1771, 6990, 6075, +217, 6978, 9618, -3061, -5052, 474, 1219, 5088, 4011, -5830, -9188, -18533, -32485, -21364, -590, 2112, +-1322, -3731, -11931, -10830, 740, 13463, 25819, 27684, 15195, 4640, 1044, 835, 8222, 11898, 9155, 7316, +5762, 735, -1688, -856, 811, 2073, -1901, -4256, -1331, 2301, 1581, 1470, 1576, -177, -2363, -4193, +-2623, -718, -1983, -5476, -5401, -4650, -4036, -2563, -1510, -1286, -1530, -1884, -2820, -3246, -2813, -919, +-2309, -2088, 365, -1259, -812, 2416, -1713, -997, 7662, 3006, -1637, 7156, 7914, 269, -1293, -4810, +-2577, 6052, 2601, -871, 1006, -13188, -30888, -26664, -14948, -5510, 1746, -258, -8557, -12969, -11809, -253, +17995, 25363, 23312, 15023, 3862, -401, 4935, 8752, 9773, 10279, 7313, 4031, 109, -2185, -415, 2441, +13, -2683, -1572, 249, 1457, 2014, 2335, 960, -1248, -3636, -3166, -1239, -1078, -2929, -4256, -4647, +-4399, -3386, -2028, -701, -1828, -1501, -1547, -3209, -2183, -1152, -2747, 386, 1338, -2539, 2090, 3660, +-3815, -347, 6792, 1222, 1103, 6605, 6295, 7133, 3216, -6269, -3052, 3420, -855, 3559, 9271, -3686, +-19780, -25417, -24604, -14189, -2514, -134, -1112, -8761, -16525, -10258, 5383, 17560, 26300, 24375, 11896, 4472, +3348, 5127, 8833, 10878, 9489, 8000, 3744, -669, 131, 1970, 997, -711, -1490, -1298, 381, 1577, +2766, 3166, 861, -2402, -2761, -2085, -1529, -1418, -3137, -4063, -5233, -5629, -3712, -2301, -2388, -778, +-2012, -2558, -139, -3234, -3977, 1516, -1137, -4167, 3463, 1932, -4039, 1147, 3316, 541, 3022, 2747, +3891, 11036, 5417, -3744, -551, -496, -5093, 2639, 10351, 4632, -6856, -20353, -26896, -21887, -13162, -4945, +1665, -3607, -14135, -15791, -8842, 4953, 19863, 25537, 19828, 11128, 4587, 3341, 6003, 8427, 10327, 10661, +6310, 1370, 577, 1210, 976, 153, -921, -1768, -1378, -880, 1704, 4085, 2529, -304, -2124, -2437, +-2188, -2068, -2237, -2490, -5077, -5243, -4375, -4829, -1739, -388, -3777, -1416, 858, -5282, -3302, 1210, +-4109, -3217, 3324, -274, -2209, 1466, 149, 1687, 3074, -1267, 2914, 11111, 5803, 1001, 3411, -1205, +-6080, -1428, 6733, 10534, 4500, -10403, -20603, -23811, -21918, -11765, -1112, -91, -6355, -14132, -17026, -7603, +8297, 20303, 23895, 18679, 10176, 5882, 4569, 5454, 9839, 12693, 9790, 4936, 2770, 1967, 1779, 634, +-93, -139, -1453, -2324, -80, 3117, 3884, 2041, -963, -1026, -1785, -2601, -992, -1936, -4308, -3413, +-5279, -6852, -1348, -1782, -4652, 107, -415, -5171, -682, -255, -5543, -1753, 1281, -1045, 88, -375, +-1413, 3854, 2062, -3808, 2300, 8472, 5354, 4581, 5859, 1457, -4296, -6557, -97, 10226, 10346, 419, +-10405, -20682, -25447, -19397, -9347, -1831, -680, -8094, -17313, -16662, -5683, 9625, 20576, 21860, 16793, 11213, +6048, 3328, 7032, 11685, 11946, 8137, 4587, 3481, 3003, 1023, 352, 873, -739, -2223, -2359, 721, +3806, 2897, 917, 308, -1932, -1928, -377, -2916, -2459, -1688, -6368, -6246, -2013, -4778, -3746, 946, +-3191, -4366, 652, -1743, -4737, -1882, -1823, -172, 1618, -3091, -1980, 4975, 1346, -4102, 587, 4830, +4778, 5232, 6579, 6149, 384, -7599, -5534, 4521, 10245, 8883, 650, -12503, -22344, -23588, -18259, -8161, +-871, -2480, -11314, -18955, -16782, -3522, 11170, 18315, 20119, 17269, 10502, 4625, 4486, 8569, 12265, 10828, +6806, 5425, 4346, 2614, 1341, 1282, 992, -1039, -3328, -1083, 1651, 2267, 3495, 1200, -1693, 151, +-521, -3474, -59, -1215, -6288, -3691, -3453, -7453, -2868, 462, -4215, -3028, -59, -1864, -2053, -3128, +-4606, 978, 2192, -4099, -2212, 3889, 1913, -2313, -1407, 1847, 4249, 3872, 5902, 9473, 5330, -3803, +-7046, -2574, 5383, 11879, 9305, -1234, -13503, -21947, -23118, -16115, -6498, -1074, -3883, -14238, -20491, -14410, +-1331, 9809, 17666, 20181, 16236, 9021, 4264, 5922, 10226, 11718, 9872, 7560, 5937, 4862, 2390, 1830, +2557, -221, -2093, -1296, -1529, 1041, 4868, 1380, -55, 1925, -1579, -2417, 1524, -1826, -4593, -1242, +-4407, -7682, -3298, -1826, -3508, -2221, -2613, -1404, 652, -4093, -5951, 514, 1612, -3258, -2507, 1300, +2405, -393, -2577, 12, 2478, 1519, 4123, 9833, 8789, 2400, -4283, -6806, -1627, 8093, 12400, 8430, +-2092, -14783, -22101, -21630, -14477, -4767, -424, -7258, -17068, -19517, -12900, -1591, 9455, 17661, 19790, 14450, +7403, 5592, 7305, 10361, 11194, 9164, 7928, 6246, 3379, 3508, 3314, 212, 243, -1186, -3658, 153, +3212, 1016, 2585, 2406, -2296, -510, 1433, -2532, -2309, -364, -4412, -5818, -4535, -4567, -2421, -2196, +-4690, -1363, 1658, -3677, -5728, -1267, 391, -2028, -3071, -632, 2204, 582, -2070, -275, 629, -558, +1658, 7229, 9920, 7948, 1167, -5868, -6406, 471, 9305, 12945, 8025, -3881, -15321, -22241, -21010, -11663, +-2693, -2582, -10168, -17729, -18736, -12390, -2078, 10075, 18063, 17874, 12648, 7587, 6433, 8733, 9994, 10521, +10781, 7129, 5063, 5827, 3586, 1928, 2878, -1007, -3186, 124, -124, 411, 4564, 2308, -1605, 1243, +667, -2140, -332, -493, -3109, -3430, -5309, -5833, -2155, -3088, -5463, -1702, 1068, -2288, -4710, -2849, +-440, -1440, -3609, -1496, 1435, 241, -1147, 372, -78, -1719, -878, 2993, 8222, 10710, 6857, -895, +-6251, -5828, 2170, 11079, 12953, 7031, -4169, -16648, -22667, -18272, -8752, -2582, -4801, -11791, -17648, -18838, +-12954, -939, 10618, 17187, 16309, 10868, 8445, 7800, 7376, 10464, 12093, 8253, 7284, 6976, 3832, 4462, +4457, -474, -1133, 270, -2771, -464, 4155, 1894, 282, 1903, 100, -942, 175, -866, -1159, -1889, +-5325, -5344, -2563, -4166, -5701, -2755, 13, -1145, -3901, -3453, -742, -1532, -4124, -1917, 595, -411, +-869, 595, 481, -1324, -2563, -1275, 4235, 9669, 10253, 5441, -2151, -7452, -4603, 4027, 11302, 13283, +7061, -6174, -18397, -21621, -15449, -7087, -4027, -6244, -12344, -18684, -19225, -12437, -302, 11470, 15397, 13691, +12204, 8281, 6351, 9697, 10983, 9875, 10078, 7292, 4719, 7070, 5368, 1225, 1608, 400, -3135, -767, +1936, 1301, 2138, 1893, 330, 537, -151, -926, 847, -739, -4577, -4247, -2620, -4303, -6193, -4385, +-840, -564, -3725, -3552, -750, -1610, -4180, -2771, -406, -624, -1063, -125, 1208, 389, -2434, -3718, +-312, 5541, 10491, 10313, 3813, -3852, -6893, -3415, 4833, 12752, 14237, 6168, -8602, -19013, -19090, -13079, +-6925, -4169, -7008, -13313, -19202, -20278, -11060, 1697, 9247, 13734, 14695, 9929, 7800, 8912, 8189, 10529, +12102, 7732, 6043, 8331, 5781, 3763, 4118, 735, -1867, -658, -333, 473, 2566, 1679, 1311, 1656, +-491, -740, 1939, 619, -3255, -3595, -2073, -3004, -6312, -6183, -1791, -383, -3512, -3612, -948, -1247, +-3420, -3486, -1709, -720, -1120, -1372, 817, 1845, -650, -3682, -3912, -83, 7089, 11545, 8897, 2189, +-4407, -6828, -3071, 5980, 14631, 14708, 3459, -10372, -17908, -17438, -11539, -6585, -4749, -6869, -14665, -21480, +-18348, -9672, -162, 9841, 13589, 11529, 10800, 8978, 6455, 10080, 12135, 8873, 8073, 8330, 6152, 6167, +6052, 2218, 115, -430, -1201, -216, 1111, 1058, 2246, 2293, -409, -855, 1500, 1819, -1416, -3527, +-1991, -1297, -5090, -7279, -3901, -1161, -2585, -3699, -2121, -997, -1956, -3585, -3117, -1359, -1016, -1655, +-661, 1447, 1705, -936, -4332, -4240, 822, 8113, 11435, 8350, 1748, -4534, -7155, -2839, 7341, 15407, +14083, 2621, -10749, -17507, -16546, -11469, -6397, -4278, -7551, -15290, -21094, -18447, -9808, 238, 9517, 13192, +11733, 10651, 8752, 6743, 10086, 11954, 8968, 8087, 8262, 6207, 6195, 6027, 2226, 112, -430, -1196, +-217, 1109, 1058, 2242, 2301, -684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1160, -442, -474, -419, -845, -1195, -1549, -1826, -1724, +-1515, -1191, -1146, -990, -1004, -757, -654, -567, -720, -734, -550, -4, 620, 1233, 1635, 1870, +1949, 1832, 1529, 1131, 713, 393, 85, -330, -871, -1416, -1615, -1241, -519, 47, 243, 89, +-150, -266, -244, -89, 248, 700, 1175, 1529, 1622, 1501, 1242, 970, 710, 429, 112, -187, +-580, -1122, -1769, -2390, -2553, -2058, -1314, -842, -894, -1399, -1836, -1779, -1441, -1373, -1815, -2749, +-3925, -4695, -4954, -5203, -6001, -7329, -9671, -13239, -19434, -30167, -24442, -4719, 14564, 26122, 27085, 21564, +18126, 15934, 14196, 12997, 10837, 8857, 7071, 5609, 3748, 2683, 1601, 515, -587, -1166, -1600, -2069, +-2167, -1603, -1635, -1549, -888, -195, 618, 682, 526, 286, -484, -994, 37, 532, 34, -567, +-1082, -2382, -1547, 184, 78, 5033, 6678, 6686, 6285, 2922, 1785, 6586, 8690, 7840, 379, -10834, +-17880, -20840, -22050, -21004, -18297, -17846, -18802, -19359, -16935, -12349, -4992, 4333, 12058, 14807, 14531, 13391, +12092, 11136, 10611, 9416, 8904, 7801, 6858, 6166, 5176, 4263, 3698, 2612, 1626, 1160, 392, -86, +-702, -502, -835, -259, 197, 1057, 922, 458, 146, -56, -709, 321, 413, -613, -195, -1010, +-1868, -1007, -567, 1266, 4257, 4916, 3735, 2488, 3052, 5175, 7319, 7307, 5155, 1798, -2625, -8477, +-14386, -18270, -19050, -19119, -19747, -19635, -18163, -15606, -12300, -7514, -693, 5732, 9603, 11150, 11028, 10263, +9492, 8806, 8014, 7456, 6886, 6438, 5955, 5569, 5153, 4620, 4101, 3510, 2964, 2109, 1556, 921, +167, 266, 622, 515, 1045, 1013, 137, 334, -25, -263, -83, -406, -542, -512, -1044, -1579, +-1163, 252, 1891, 2517, 1964, 1267, 1938, 3389, 4521, 4957, 4403, 3280, 2239, 752, -2134, -6404, +-10617, -13527, -15445, -17420, -19529, -20015, -17979, -14664, -10636, -5458, 689, 5858, 8734, 9574, 9242, 8392, +7655, 6815, 6025, 5390, 4994, 4773, 4489, 4494, 4526, 4113, 4144, 4021, 3336, 3082, 2666, 2079, +1966, 1895, 1587, 1366, 941, 472, 224, -130, -512, -696, -757, -1004, -1344, -1784, -1628, -413, +842, 1274, 1242, 1256, 1578, 2435, 3380, 3748, 3516, 3193, 2763, 2096, 1274, -13, -2123, -4835, +-7563, -10062, -12597, -15764, -18955, -20393, -18982, -15446, -10700, -5036, 901, 5783, 8361, 8904, 8352, 7304, +6515, 5882, 5060, 4612, 4441, 4076, 4001, 4039, 4005, 3978, 3961, 3810, 3565, 3393, 3232, 3103, +2889, 2659, 2376, 2071, 1768, 1356, 772, 331, -52, -488, -1338, -2024, -2069, -1642, -1119, -576, +-316, -151, 366, 1199, 1949, 2496, 2813, 2831, 2690, 2471, 2188, 1563, 638, -492, -1854, -3451, +-5185, -7172, -9770, -13411, -17313, -19765, -19365, -16092, -11233, -5558, 267, 5052, 7683, 8173, 7232, 6104, +5173, 4411, 3800, 3394, 3205, 3179, 3223, 3389, 3598, 3717, 3759, 3772, 3814, 3802, 3772, 3697, +3553, 3411, 3243, 2877, 2466, 2185, 1833, 1222, 505, -279, -907, -1143, -1048, -939, -948, -863, +-566, -120, 484, 1177, 1609, 1921, 2130, 2223, 2191, 1976, 1643, 1116, 390, -494, -1413, -2519, +-3730, -5301, -7686, -11113, -15237, -18515, -19144, -16757, -12298, -6793, -1191, 3577, 6456, 7252, 6479, 5306, +4231, 3488, 2988, 2700, 2618, 2762, 2877, 3038, 3271, 3465, 3645, 3828, 3947, 3940, 4005, 4049, +3966, 3759, 3582, 3335, 3068, 2686, 2158, 1372, 651, 174, -277, -620, -857, -949, -972, -799, +-426, -35, 371, 771, 1133, 1334, 1492, 1601, 1564, 1386, 1112, 728, 204, -324, -891, -1638, +-2529, -3769, -5712, -8647, -12386, -15897, -17327, -15954, -12317, -7527, -2478, 1938, 4772, 5647, 5127, 4066, +3035, 2280, 1909, 1749, 1824, 2082, 2342, 2621, 2988, 3357, 3601, 3827, 4055, 4193, 4217, 4261, +4213, 4145, 4059, 3915, 3557, 3079, 2564, 1994, 1346, 808, 291, -214, -607, -702, -723, -590, +-337, -106, 194, 440, 744, 928, 1027, 1120, 1038, 864, 639, 386, 7, -341, -744, -1297, +-2093, -3143, -4789, -7122, -10229, -13418, -15210, -14605, -11782, -7754, -3433, 378, 3065, 4063, 3768, 2888, +1974, 1256, 880, 786, 934, 1249, 1687, 2158, 2625, 3087, 3524, 3843, 4108, 4267, 4298, 4346, +4364, 4321, 4196, 3988, 3671, 3270, 2792, 2328, 1776, 1201, 702, 320, -13, -170, -173, -120, +-37, 142, 291, 446, 594, 717, 711, 702, 648, 489, 290, 109, -93, -341, -645, -1010, +-1666, -2634, -4049, -5992, -8498, -11110, -12821, -12725, -10745, -7534, -3922, -724, 1636, 2728, 2698, 2041, +1216, 456, 20, -120, -41, 260, 758, 1307, 1899, 2493, 3045, 3499, 3882, 4209, 4451, 4612, +4712, 4691, 4561, 4369, 4066, 3678, 3220, 2705, 2131, 1550, 1035, 670, 369, 180, 109, 140, +144, 242, 378, 430, 513, 564, 567, 480, 386, 284, 130, -31, -173, -327, -583, -877, +-1392, -2247, -3466, -5114, -7136, -9190, -10668, -10900, -9634, -7204, -4345, -1702, 293, 1366, 1533, 1057, +348, -316, -785, -941, -886, -600, -144, 453, 1061, 1689, 2325, 2864, 3380, 3854, 4230, 4517, +4709, 4808, 4793, 4675, 4461, 4138, 3707, 3208, 2666, 2116, 1607, 1177, 887, 656, 519, 464, +448, 456, 495, 553, 559, 573, 556, 460, 337, 211, 50, -103, -275, -420, -648, -970, +-1433, -2206, -3264, -4650, -6245, -7801, -8931, -9201, -8371, -6607, -4352, -2161, -464, 523, 765, 424, +-190, -830, -1352, -1587, -1598, -1362, -949, -405, 239, 891, 1576, 2232, 2838, 3384, 3862, 4251, +4554, 4753, 4848, 4808, 4681, 4431, 4091, 3654, 3168, 2655, 2126, 1636, 1221, 924, 689, 549, +481, 454, 456, 497, 516, 454, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -460, -407, -424, -482, -436, -423, -315, -338, +-262, -246, -291, -282, -330, -268, -280, -244, -205, -149, -133, -102, -24, 6, 47, 150, +177, 257, 346, 519, 572, 667, 710, 1024, -97, -1447, -1657, -2718, -3017, -3056, -2256, -1875, +-1725, -1033, -451, -24, 563, 1130, 1681, 2216, -607, -977, -1918, -2463, -2256, -1941, -87, -573, +502, 1079, 2395, 2570, -1106, -1866, -2555, -2341, -2825, -1419, 940, 534, 1643, 3506, 1388, -1907, +-1609, -2453, -2602, -2069, 689, 2632, 881, -2032, -830, -1450, -808, -994, 1472, 4628, -2169, -1848, +-628, 880, 253, 2567, 3415, -4108, -2648, -928, -283, 2320, -2790, -1972, -653, 1571, -363, -1944, +12148, -2907, 8830, 3900, 28804, -19886, -29577, -17549, -29577, -25544, -29577, 16507, 11718, -6520, 28804, 28804, +24361, 27391, 26004, 11729, 21117, 11890, 13389, 6051, 12780, -1065, 4738, 2430, 281, -827, -1434, -2104, +-5702, -463, -5461, -3041, -5379, -4025, -6925, -2322, -5015, -5766, -3300, -5226, -4077, -3682, -2229, -4991, +-2425, -2764, -6241, -2389, -3554, -2537, -2764, -2191, 3442, 2175, 130, 6559, 7907, 5218, 9999, 6566, +-1426, 1414, -6211, -11242, -17741, -20537, -17523, -22516, -16384, -4978, -3530, -17785, 8914, 19826, 3779, 23445, +20577, 21428, 14298, 22921, 26137, -1412, -3626, -4477, -14458, -29148, -29577, -19848, -29577, -23074, 4243, -6395, +-4721, 13433, 9046, 10417, 16397, 14456, 11566, 11617, 13374, 8722, 5936, 4178, 2854, 1875, -905, -4319, +-2549, -4193, -3861, -2251, -2892, -2103, 425, -427, -386, 1306, 1146, 328, 1430, -133, -1386, -3258, +-1832, -5264, -6795, -6215, -8526, -7758, -10658, -3284, -4116, -9407, -37, 4879, 4077, 5456, 10783, 10158, +8541, 14887, 10827, 7557, -1816, -930, -5437, -16158, -15593, -15568, -21627, -19461, -768, -8015, -8037, 3786, +5442, 7286, 9003, 14579, 12641, 11517, 16941, 18460, 9987, 3619, 2780, -1389, -13183, -15024, -10868, -22899, +-16275, -3990, -8850, -4677, 2173, 4439, 6542, 9989, 11004, 9486, 8430, 8746, 7746, 3906, 1309, -835, +-2004, -6387, -1212, 1361, 3069, 6890, 7560, 3911, 1370, -849, -2004, -6855, -2223, 353, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 485, +485, 910, 1692, 2736, 7260, 11873, 13067, 13161, 10739, 9811, 4367, 3275, 4184, 2538, -1210, 575, +3805, 602, 743, 4672, 12027, 13047, 12740, 6137, 2965, 582, 1367, 2552, 677, -2972, -6298, -543, +603, -9130, -10131, -5918, -9616, -11486, -7744, -7404, -5782, -4000, -2315, 2507, 758, -5146, -3198, 2549, +3822, 2860, -73, -1047, -4798, -8538, -11165, -8339, -7952, -9162, -4589, -9772, -18312, -18168, -14205, -6847, +-7964, -1851, 7458, 9927, 11951, 12948, 25486, 30739, 25809, 20531, 16698, 14603, 6120, 4376, 5447, 3139, +-1629, 595, 4352, 618, 769, 4924, 12364, 13048, 12740, 6137, 2965, 582, 1367, 2552, 677, -2972, +-6298, -543, 603, -9130, -10131, -5918, -9616, -11486, -7744, -7404, -5782, -4000, -2315, 2507, 758, -5146, +-3198, 2549, 3822, 2860, -73, -1047, -4798, -8538, -11165, -8339, -7952, -9162, -4589, -9772, -18312, -18168, +-14205, -6847, -7964, -1851, 7458, 9927, 11466, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -270, -99, -141, -325, -122, 27, 51, 192, +369, 456, 419, 361, 413, 156, -39, -47, -21, 143, 177, 279, 400, 258, 195, 95, +12, -20, -16, 172, -110, -21, 442, 291, 23, -279, -210, 167, 342, 269, 221, 410, +611, 512, 520, 429, 231, 321, 544, 308, 244, 219, -55, 23, -191, 13, 46, -95, +519, 602, -91, -818, -477, -59, -127, -403, -953, 36, 123, -463, 89, -539, 89, 650, +-600, -700, -496, 173, 1097, 1475, 1606, 2314, 2658, 2851, 2968, 3390, 2669, 2024, 3106, 3671, +3030, 4531, 4482, 4749, 6719, 6343, 6161, 5168, 3002, 2912, 2361, 626, 792, -748, -1293, -1054, +-2208, -2192, -2737, -3837, -3883, -5105, -6009, -6482, -7743, -7430, -8236, -8634, -8157, -7560, -7457, -6974, +-6387, -5876, -6842, -6169, -4029, -6074, -6467, -4831, -5452, -5393, -4176, -4970, -5344, -4892, -4244, -4060, +-4889, -5468, -5267, -6610, -6988, -6610, -6735, -6945, -6632, -5518, -5251, -5401, -3448, -3274, -4024, -2170, +-3028, -3575, -2759, -3838, -2359, -902, -822, 1344, 1854, 3200, 5062, 5538, 7892, 8966, 9918, 12196, +12309, 12691, 13986, 15784, 18117, 19136, 20410, 21311, 21697, 22504, 22862, 21787, 21715, 21291, 20253, 20999, +19582, 18547, 19739, 19669, 19196, 18876, 17984, 16429, 14512, 13056, 11543, 9018, 7497, 6419, 4009, 2264, +1223, 420, 177, -1300, -2311, -3651, -5888, -7016, -8149, -9235, -9823, -10235, -10356, -11692, -12812, -11678, +-12718, -14578, -14176, -14940, -15313, -15200, -16579, -16672, -16659, -17262, -17173, -18048, -17821, -17060, -17475, -17635, +-18149, -19116, -19625, -19996, -20130, -20805, -21720, -20251, -19887, -20240, -18569, -17671, -16351, -13927, -12892, -12049, +-11469, -10636, -9406, -9153, -7573, -4739, -2998, -1246, 51, 709, 2444, 3923, 5648, 8086, 9221, 11106, +12466, 13258, 14596, 15745, 17514, 18969, 18960, 19855, 20204, 19657, 20170, 19489, 19252, 20021, 19837, 19809, +19690, 19581, 20210, 19348, 19773, 19983, 18089, 16976, 16079, 14334, 13132, 11524, 9482, 7941, 5837, 4199, +2967, 1902, 1121, -181, -1407, -2752, -4243, -5139, -6745, -8527, -8847, -10021, -11800, -12135, -12725, -12909, +-12594, -13360, -13607, -13289, -13876, -14224, -14729, -14861, -14953, -15943, -16320, -16097, -16082, -14824, -14458, -14228, +-13883, -14800, -13937, -13701, -14613, -13545, -12780, -12127, -10766, -10030, -8939, -7674, -6176, -4031, -3060, -2286, +-846, -578, -249, 700, 1984, 4395, 6242, 7488, 9041, 10069, 11450, 12950, 14069, 15829, 17453, 18461, +19587, 20367, 21705, 23125, 24030, 25367, 25886, 26149, 26779, 26513, 26068, 25704, 25432, 25214, 24208, 23472, +23193, 22081, 21469, 21123, 19936, 18823, 17147, 15050, 13035, 10608, 8263, 5883, 3462, 1033, -1559, -3684, +-5731, -7661, -8952, -10786, -12987, -14132, -15675, -17806, -19051, -20318, -21710, -22650, -23940, -24791, -24548, -24675, +-25132, -25323, -25222, -25037, -25432, -25246, -24793, -24865, -24618, -24904, -25203, -24732, -24206, -22848, -21365, -20852, +-19979, -18981, -18488, -17945, -17519, -17068, -16420, -15373, -14190, -13489, -12212, -10113, -8372, -6658, -4995, -3486, +-1980, -1183, -476, 1113, 3264, 5825, 8110, 9819, 11626, 13190, 14541, 15990, 17464, 19298, 20920, 21981, +23084, 24114, 25323, 26929, 27939, 28751, 29512, 30090, 30248, 29570, 29051, 28801, 28045, 27478, 27037, 26067, +25323, 24628, 23709, 22926, 21892, 20589, 18868, 17221, 15462, 13497, 11532, 9434, 7013, 4752, 2415, -241, +-1751, -3248, -5122, -6487, -7761, -9267, -10733, -12369, -13777, -14759, -16050, -17443, -18414, -18949, -19180, -19755, +-20110, -19989, -20130, -20044, -20137, -20144, -19693, -19687, -19921, -20051, -20590, -20492, -19499, -18736, -17842, -17013, +-16391, -15612, -15139, -14387, -14112, -13619, -12444, -11411, -10731, -9464, -8411, -6411, -4511, -3152, -1048, 519, +1576, 2425, 2871, 4083, 5538, 7211, 8925, 10178, 11584, 12629, 13195, 14271, 15470, 16720, 17744, 18333, +18776, 19541, 20408, 21455, 22110, 22503, 23411, 23353, 22837, 22231, 21417, 20786, 19904, 19039, 18072, 17084, +16153, 15294, 14426, 13530, 12483, 11162, 9716, 7900, 6061, 4320, 2169, 80, -1881, -4388, -6716, -8543, +-10345, -11879, -13237, -14350, -15331, -16512, -17734, -18842, -19695, -20396, -21511, -22489, -22771, -22924, -23169, -23138, +-22920, -22422, -22044, -21718, -21010, -20483, -19810, -19042, -18736, -18648, -18341, -17614, -16496, -15324, -13927, -12707, +-11673, -10464, -9556, -8979, -8437, -7660, -6622, -5600, -4865, -3752, -2329, -768, 892, 2442, 4268, 5726, +6546, 7073, 7693, 8829, 10243, 11734, 13321, 14858, 16046, 16918, 17720, 18711, 20041, 21314, 22201, 22739, +23193, 24054, 24856, 25447, 26202, 26924, 27458, 27461, 27006, 26266, 25386, 24521, 23559, 22555, 21434, 20308, +19356, 18451, 17444, 16399, 15350, 13886, 12183, 10534, 8611, 6569, 4675, 2673, 375, -1990, -4229, -6337, +-8276, -9933, -11254, -12369, -13494, -14834, -16133, -16997, -17897, -19023, -20045, -20803, -21181, -21571, -21908, -21796, +-21584, -21361, -21007, -20621, -20240, -19708, -18975, -18501, -18454, -18420, -18248, -17904, -17136, -16142, -15255, -14349, +-13352, -12453, -11932, -11640, -11181, -10477, -9758, -9163, -8446, -7495, -6405, -5202, -3872, -2284, -687, 530, +1247, 1690, 2353, 3190, 4233, 5532, 6880, 8202, 9170, 9851, 10532, 11355, 12591, 13639, 14126, 14681, +15347, 15992, 16716, 17391, 18265, 19107, 19591, 19758, 19451, 18901, 18232, 17538, 16860, 16038, 15210, 14547, +13883, 13263, 12814, 12257, 11489, 10621, 9499, 8100, 6693, 5281, 3828, 2207, 432, -1414, -3198, -4916, +-6535, -7747, -8566, -9361, -10307, -11219, -11923, -12490, -13149, -13953, -14562, -14967, -15387, -15624, -15737, -15674, +-15425, -15105, -14777, -14549, -14005, -13260, -12645, -12179, -11928, -11794, -11553, -11101, -10366, -9496, -8631, -7638, +-6590, -5815, -5367, -4947, -4418, -3898, -3454, -3011, -2444, -1757, -1040, -133, 914, 2209, 3561, 4456, +5006, 5357, 5736, 6249, 6982, 8010, 9123, 10185, 10975, 11366, 11828, 12628, 13516, 14208, 14739, 15271, +15735, 16189, 16709, 17299, 18011, 18763, 19272, 19416, 19172, 18655, 18048, 17304, 16444, 15549, 14644, 13787, +13040, 12401, 11787, 11126, 10380, 9485, 8316, 6908, 5490, 4080, 2585, 937, -860, -2663, -4504, -6419, +-8096, -9383, -10354, -11351, -12427, -13333, -14073, -14814, -15643, -16411, -17064, -17643, -18072, -18413, -18619, -18574, +-18330, -18068, -17904, -17584, -17024, -16358, -15719, -15289, -15042, -14957, -14858, -14534, -14063, -13510, -12739, -11830, +-10981, -10420, -10016, -9652, -9346, -9041, -8772, -8464, -7985, -7471, -6913, -6100, -4959, -3568, -2270, -1252, +-477, 56, 584, 1233, 2052, 3217, 4592, 5794, 6657, 7355, 8234, 9280, 10301, 11257, 12119, 12936, +13687, 14399, 15193, 16129, 17205, 18321, 19209, 19713, 19846, 19744, 19466, 19000, 18477, 17885, 17197, 16613, +16167, 15760, 15376, 15057, 14655, 14029, 13118, 12019, 10933, 9753, 8412, 6986, 5488, 3908, 2158, 409, +-1029, -2163, -3181, -4193, -5144, -5953, -6691, -7475, -8242, -9023, -9713, -10264, -10828, -11329, -11598, -11635, +-11611, -11635, -11629, -11506, -11188, -10779, -10400, -10258, -10384, -10540, -10645, -10667, -10564, -10287, -9758, -9152, +-8668, -8334, -8163, -8008, -7926, -7955, -7907, -7771, -7603, -7442, -7186, -6607, -5722, -4623, -3555, -2764, +-2208, -1847, -1588, -1269, -641, 360, 1516, 2463, 3138, 3787, 4553, 5422, 6312, 7165, 7980, 8728, +9410, 10086, 10800, 11714, 12842, 13937, 14829, 15402, 15668, 15662, 15442, 15113, 14655, 14053, 13438, 12946, +12526, 12167, 11920, 11722, 11440, 10912, 10132, 9222, 8236, 7089, 5784, 4492, 3135, 1543, -190, -1847, +-3229, -4432, -5546, -6559, -7485, -8292, -9055, -9856, -10670, -11435, -12104, -12749, -13394, -13869, -14095, -14179, +-14185, -14192, -14174, -14003, -13643, -13169, -12749, -12555, -12541, -12551, -12579, -12582, -12439, -12064, -11448, -10786, +-10250, -9783, -9388, -9130, -9007, -8900, -8717, -8515, -8326, -8088, -7675, -6948, -5886, -4620, -3396, -2382, +-1537, -918, -531, -21, 874, 2062, 3312, 4384, 5314, 6242, 7185, 8222, 9312, 10355, 11397, 12347, +13158, 13924, 14780, 15866, 17110, 18351, 19441, 20220, 20662, 20818, 20765, 20516, 20083, 19541, 19010, 18517, +18052, 17710, 17499, 17296, 16979, 16453, 15733, 14838, 13736, 12479, 11147, 9800, 8266, 6479, 4647, 2935, +1373, -27, -1325, -2551, -3652, -4640, -5667, -6695, -7686, -8629, -9536, -10462, -11300, -12005, -12537, -12909, +-13241, -13550, -13809, -13927, -13791, -13608, -13517, -13557, -13791, -14045, -14373, -14680, -14780, -14638, -14301, -13930, +-13591, -13285, -13070, -13018, -13048, -13066, -13002, -12938, -12904, -12834, -12577, -11936, -10975, -9841, -8651, -7544, +-6671, -6110, -5697, -5119, -4162, -2987, -1833, -718, 321, 1309, 2363, 3458, 4622, 5784, 6940, 7997, +8876, 9783, 10786, 11940, 13287, 14667, 15920, 16864, 17495, 17917, 18083, 18020, 17728, 17338, 16880, 16457, +16068, 15837, 15795, 15692, 15470, 15153, 14647, 13898, 12888, 11816, 10691, 9436, 7990, 6341, 4664, 3075, +1631, 267, -967, -2090, -3084, -3987, -4956, -5915, -6806, -7671, -8542, -9420, -10170, -10782, -11246, -11520, +-11780, -12056, -12222, -12192, -11964, -11731, -11553, -11438, -11489, -11645, -11878, -12080, -12075, -11853, -11492, -11063, +-10593, -10197, -9935, -9809, -9758, -9669, -9564, -9508, -9514, -9482, -9201, -8556, -7638, -6525, -5258, -4097, +-3217, -2671, -2188, -1504, -604, 491, 1626, 2692, 3701, 4684, 5709, 6736, 7829, 9031, 10105, 11039, +11867, 12659, 13544, 14631, 15866, 17156, 18296, 19201, 19841, 20186, 20287, 20141, 19799, 19312, 18684, 18065, +17516, 17167, 16918, 16617, 16290, 15856, 15207, 14349, 13243, 12058, 10783, 9317, 7651, 5866, 4029, 2246, +607, -956, -2391, -3641, -4800, -5931, -7066, -8164, -9217, -10240, -11286, -12311, -13207, -13946, -14460, -14902, +-15315, -15688, -15916, -15910, -15849, -15728, -15578, -15551, -15604, -15885, -16210, -16415, -16484, -16276, -16013, -15578, +-15063, -14660, -14303, -14111, -13981, -13787, -13595, -13516, -13471, -13367, -12997, -12363, -11400, -10134, -8750, -7473, +-6521, -5791, -5095, -4278, -3224, -1993, -802, 414, 1591, 2722, 3823, 5003, 6286, 7580, 8785, 9866, +10807, 11721, 12749, 13956, 15320, 16692, 17962, 19055, 19884, 20493, 20823, 20888, 20779, 20432, 19949, 19435, +19055, 18808, 18607, 18460, 18296, 18008, 17526, 16812, 15911, 14899, 13783, 12483, 10960, 9310, 7640, 5999, +4398, 2902, 1581, 413, -699, -1795, -2880, -3942, -4951, -5985, -7059, -8088, -8997, -9734, -10298, -10823, +-11314, -11687, -11926, -11980, -11964, -11910, -11778, -11739, -11878, -12203, -12608, -12901, -13069, -13080, -12885, -12571, +-12169, -11829, -11636, -11515, -11427, -11317, -11246, -11315, -11445, -11486, -11336, -10902, -10127, -9022, -7802, -6711, +-5905, -5315, -4718, -4019, -3168, -2178, -1125, -73, 953, 1940, 2915, 3933, 5069, 6244, 7313, 8256, +9066, 9834, 10725, 11776, 12962, 14213, 15396, 16440, 17255, 17825, 18110, 18180, 18054, 17638, 17055, 16491, +16011, 15619, 15324, 15149, 14964, 14620, 14129, 13428, 12570, 11600, 10486, 9148, 7597, 5939, 4252, 2557, +913, -588, -1912, -3083, -4199, -5291, -6285, -7277, -8229, -9184, -10229, -11191, -12028, -12670, -13168, -13654, +-14087, -14376, -14500, -14470, -14385, -14158, -13923, -13793, -13774, -13987, -14247, -14417, -14496, -14384, -14121, -13661, +-13162, -12728, -12429, -12148, -11889, -11655, -11518, -11489, -11484, -11474, -11271, -10786, -9929, -8690, -7368, -6128, +-5219, -4431, -3673, -2891, -1935, -835, 316, 1476, 2609, 3711, 4772, 5906, 7165, 8437, 9637, 10665, +11576, 12431, 13399, 14530, 15748, 17034, 18288, 19451, 20342, 21007, 21453, 21697, 21592, 21230, 20701, 20146, +19638, 19216, 18897, 18711, 18509, 18151, 17682, 17037, 16289, 15388, 14282, 12931, 11417, 9759, 8043, 6312, +4589, 3040, 1592, 351, -835, -2018, -3066, -4136, -5166, -6258, -7417, -8501, -9440, -10236, -10909, -11574, +-12138, -12599, -12872, -13025, -13111, -13033, -12980, -13002, -13162, -13511, -13910, -14310, -14596, -14704, -14615, -14301, +-13990, -13739, -13547, -13403, -13258, -13195, -13195, -13298, -13487, -13667, -13702, -13421, -12715, -11659, -10492, -9410, +-8558, -7824, -7156, -6429, -5568, -4613, -3578, -2485, -1455, -471, 516, 1625, 2822, 4021, 5183, 6196, +7059, 7890, 8818, 9877, 11072, 12373, 13685, 14856, 15845, 16680, 17284, 17653, 17711, 17499, 17137, 16682, +16279, 15945, 15735, 15645, 15549, 15355, 15047, 14621, 14082, 13387, 12476, 11341, 10039, 8580, 7007, 5428, +3908, 2482, 1199, 54, -1005, -1984, -2895, -3757, -4657, -5633, -6643, -7606, -8420, -9086, -9682, -10195, +-10650, -10970, -11141, -11203, -11096, -10928, -10730, -10632, -10718, -10895, -11233, -11607, -11833, -11928, -11790, -11491, +-11184, -10881, -10624, -10398, -10214, -10102, -10059, -10109, -10274, -10485, -10598, -10371, -9700, -8726, -7616, -6565, +-5698, -5001, -4330, -3589, -2769, -1864, -866, 176, 1179, 2131, 3135, 4221, 5374, 6569, 7681, 8654, +9513, 10306, 11169, 12149, 13268, 14484, 15684, 16787, 17777, 18608, 19225, 19558, 19628, 19430, 18998, 18495, +17945, 17488, 17178, 16937, 16693, 16372, 15966, 15512, 14926, 14129, 13158, 11956, 10575, 9047, 7379, 5658, +4006, 2488, 1072, -231, -1404, -2492, -3510, -4475, -5502, -6619, -7727, -8774, -9720, -10580, -11353, -12005, +-12589, -13086, -13421, -13591, -13602, -13520, -13442, -13423, -13557, -13840, -14252, -14738, -15111, -15284, -15272, -15112, +-14902, -14661, -14422, -14234, -14066, -13967, -13946, -14009, -14216, -14489, -14633, -14450, -13808, -12836, -11756, -10686, +-9729, -8910, -8142, -7347, -6477, -5488, -4404, -3282, -2192, -1123, -17, 1183, 2503, 3841, 5087, 6240, +7282, 8242, 9233, 10348, 11602, 12940, 14274, 15551, 16744, 17785, 18635, 19225, 19527, 19567, 19368, 19013, +18636, 18357, 18205, 18093, 17976, 17820, 17601, 17333, 16949, 16367, 15596, 14630, 13458, 12080, 10554, 8980, +7413, 5964, 4633, 3386, 2251, 1261, 345, -563, -1543, -2604, -3639, -4644, -5609, -6479, -7269, -7971, +-8600, -9148, -9532, -9747, -9797, -9745, -9706, -9710, -9818, -10102, -10553, -11086, -11544, -11834, -11940, -11910, +-11814, -11650, -11484, -11373, -11302, -11267, -11314, -11479, -11828, -12237, -12545, -12550, -12109, -11346, -10419, -9487, +-8634, -7914, -7276, -6604, -5847, -5003, -4090, -3152, -2226, -1300, -337, 753, 1926, 3104, 4252, 5275, +6189, 7036, 7931, 8959, 10075, 11253, 12444, 13623, 14754, 15740, 16535, 17113, 17407, 17422, 17184, 16758, +16312, 15966, 15713, 15481, 15255, 15042, 14770, 14448, 14059, 13515, 12749, 11804, 10675, 9305, 7785, 6207, +4630, 3104, 1712, 430, -733, -1722, -2650, -3583, -4538, -5551, -6569, -7558, -8495, -9328, -10107, -10822, +-11414, -11930, -12298, -12451, -12454, -12367, -12233, -12116, -12116, -12316, -12670, -13104, -13500, -13723, -13787, -13711, +-13503, -13251, -12987, -12766, -12577, -12384, -12287, -12345, -12595, -12933, -13115, -13059, -12599, -11786, -10802, -9768, +-8799, -7911, -7095, -6298, -5401, -4414, -3370, -2314, -1271, -229, 874, 2078, 3360, 4681, 5969, 7129, +8161, 9124, 10119, 11213, 12408, 13646, 14887, 16143, 17359, 18451, 19372, 20085, 20529, 20663, 20550, 20226, +19839, 19536, 19288, 19075, 18842, 18614, 18362, 18038, 17665, 17150, 16453, 15559, 14439, 13100, 11591, 10003, +8421, 6874, 5353, 3954, 2707, 1608, 619, -379, -1424, -2488, -3570, -4644, -5686, -6676, -7594, -8474, +-9267, -9943, -10478, -10839, -11009, -11055, -11052, -11054, -11170, -11496, -11994, -12568, -13120, -13526, -13767, -13896, +-13922, -13862, -13765, -13680, -13589, -13503, -13516, -13709, -14101, -14578, -14940, -15054, -14800, -14189, -13374, -12468, +-11589, -10800, -10069, -9328, -8532, -7648, -6698, -5764, -4841, -3872, -2842, -1721, -490, 801, 2049, 3180, +4200, 5146, 6132, 7219, 8377, 9584, 10823, 12090, 13332, 14476, 15471, 16297, 16880, 17142, 17127, 16937, +16695, 16467, 16299, 16157, 15997, 15833, 15677, 15478, 15198, 14827, 14303, 13588, 12663, 11509, 10175, 8753, +7307, 5847, 4417, 3134, 1995, 997, 113, -766, -1664, -2570, -3520, -4446, -5349, -6220, -7020, -7783, +-8500, -9085, -9521, -9774, -9861, -9809, -9662, -9516, -9472, -9642, -9981, -10385, -10840, -11183, -11368, -11447, +-11382, -11257, -11112, -10907, -10692, -10498, -10413, -10544, -10854, -11303, -11663, -11762, -11566, -10997, -10249, -9385, +-8517, -7710, -6948, -6195, -5386, -4499, -3592, -2701, -1815, -869, 114, 1188, 2386, 3622, 4820, 5920, +6900, 7829, 8761, 9751, 10813, 11910, 13025, 14186, 15308, 16375, 17342, 18126, 18663, 18877, 18810, 18574, +18256, 17916, 17619, 17325, 17031, 16748, 16472, 16123, 15730, 15296, 14691, 13899, 12899, 11679, 10306, 8806, +7263, 5663, 4121, 2694, 1421, 287, -753, -1737, -2749, -3767, -4791, -5814, -6801, -7767, -8673, -9574, +-10408, -11104, -11673, -12082, -12284, -12294, -12206, -12127, -12130, -12305, -12688, -13149, -13639, -14066, -14336, -14470, +-14484, -14424, -14336, -14172, -13954, -13755, -13665, -13775, -14077, -14499, -14851, -14991, -14839, -14339, -13610, -12744, +-11847, -11007, -10188, -9362, -8484, -7556, -6588, -5612, -4671, -3709, -2643, -1479, -211, 1115, 2401, 3581, +4670, 5726, 6768, 7848, 9002, 10229, 11465, 12683, 13903, 15112, 16227, 17168, 17897, 18304, 18423, 18367, +18229, 18048, 17893, 17757, 17613, 17439, 17279, 17115, 16880, 16603, 16188, 15562, 14776, 13762, 12584, 11280, +9868, 8426, 7016, 5696, 4507, 3462, 2517, 1622, 724, -194, -1122, -2046, -2943, -3820, -4708, -5546, +-6341, -7044, -7621, -8081, -8326, -8378, -8294, -8210, -8203, -8348, -8695, -9157, -9671, -10141, -10506, -10735, +-10863, -10938, -10965, -10875, -10740, -10616, -10598, -10810, -11230, -11766, -12257, -12591, -12611, -12348, -11838, -11183, +-10496, -9819, -9167, -8475, -7733, -6954, -6162, -5371, -4602, -3802, -2905, -1908, -806, 337, 1475, 2537, +3486, 4394, 5306, 6245, 7255, 8314, 9404, 10479, 11581, 12684, 13726, 14596, 15273, 15662, 15775, 15711, +15544, 15318, 15088, 14909, 14705, 14499, 14306, 14070, 13821, 13525, 13128, 12541, 11748, 10802, 9711, 8440, +7093, 5677, 4272, 2968, 1776, 735, -217, -1083, -1957, -2827, -3694, -4550, -5383, -6213, -7044, -7829, +-8580, -9249, -9795, -10224, -10430, -10433, -10304, -10139, -10021, -10083, -10304, -10650, -11073, -11440, -11721, -11891, +-11988, -12035, -11984, -11823, -11586, -11363, -11276, -11370, -11693, -12138, -12536, -12802, -12800, -12505, -11976, -11288, +-10546, -9784, -9003, -8198, -7357, -6474, -5600, -4719, -3872, -3004, -2047, -980, 216, 1458, 2688, 3855, +4921, 5934, 6933, 7963, 9051, 10192, 11350, 12499, 13648, 14812, 15937, 16901, 17659, 18164, 18397, 18441, +18359, 18205, 18044, 17897, 17750, 17580, 17373, 17184, 16962, 16682, 16312, 15754, 15003, 14104, 13050, 11838, +10492, 9089, 7689, 6334, 5101, 3964, 2925, 1994, 1059, 119, -816, -1732, -2639, -3549, -4446, -5337, +-6196, -6992, -7696, -8260, -8634, -8806, -8835, -8829, -8853, -9000, -9338, -9810, -10345, -10863, -11329, -11693, +-11981, -12230, -12347, -12337, -12245, -12179, -12212, -12447, -12872, -13423, -14002, -14426, -14596, -14521, -14211, -13712, +-13125, -12505, -11847, -11165, -10414, -9647, -8853, -8034, -7286, -6491, -5633, -4656, -3559, -2373, -1181, -75, +966, 1970, 2943, 3951, 5033, 6157, 7306, 8467, 9656, 10850, 12042, 13086, 13917, 14539, 14904, 15085, +15121, 15078, 15042, 15005, 14950, 14894, 14798, 14717, 14667, 14541, 14291, 13883, 13331, 12616, 11744, 10718, +9567, 8325, 7075, 5882, 4766, 3759, 2844, 2028, 1217, 406, -391, -1157, -1923, -2701, -3449, -4213, +-4960, -5668, -6312, -6788, -7092, -7210, -7170, -7054, -6967, -7008, -7223, -7579, -8013, -8423, -8801, -9136, +-9422, -9623, -9734, -9702, -9594, -9472, -9472, -9658, -10039, -10560, -11135, -11581, -11797, -11748, -11505, -11111, +-10585, -10021, -9393, -8706, -7975, -7199, -6448, -5726, -5011, -4291, -3482, -2551, -1505, -381, 728, 1809, +2814, 3759, 4746, 5711, 6719, 7782, 8833, 9909, 11028, 12172, 13295, 14308, 15090, 15657, 16002, 16137, +16133, 16071, 15969, 15867, 15751, 15607, 15464, 15326, 15190, 14979, 14638, 14186, 13579, 12817, 11910, 10834, +9657, 8358, 7034, 5756, 4553, 3454, 2425, 1490, 592, -293, -1155, -2004, -2843, -3687, -4538, -5353, +-6182, -6998, -7727, -8320, -8747, -8986, -9055, -9044, -9041, -9144, -9395, -9792, -10264, -10710, -11123, -11547, +-11916, -12201, -12372, -12415, -12335, -12230, -12240, -12439, -12818, -13332, -13890, -14380, -14646, -14670, -14472, -14121, +-13663, -13099, -12449, -11727, -10933, -10112, -9291, -8514, -7733, -6927, -6074, -5072, -3973, -2771, -1557, -393, +720, 1794, 2852, 3957, 5091, 6240, 7420, 8615, 9856, 11143, 12405, 13566, 14544, 15286, 15825, 16145, +16313, 16423, 16472, 16516, 16530, 16533, 16533, 16525, 16508, 16457, 16273, 15956, 15505, 14917, 14153, 13239, +12198, 11039, 9850, 8683, 7592, 6551, 5590, 4674, 3811, 2998, 2169, 1359, 561, -224, -1034, -1839, +-2650, -3473, -4227, -4862, -5344, -5653, -5770, -5810, -5861, -5992, -6268, -6702, -7199, -7705, -8188, -8687, +-9168, -9567, -9879, -10021, -10049, -10062, -10165, -10454, -10926, -11544, -12240, -12831, -13243, -13418, -13374, -13180, +-12870, -12492, -12018, -11416, -10738, -10052, -9368, -8706, -8071, -7408, -6672, -5824, -4825, -3724, -2629, -1563, +-553, 409, 1403, 2432, 3467, 4525, 5612, 6720, 7887, 9090, 10277, 11393, 12349, 13088, 13612, 13917, +14083, 14184, 14223, 14230, 14233, 14218, 14209, 14221, 14210, 14148, 13986, 13692, 13258, 12681, 11966, 11094, +10083, 8965, 7795, 6658, 5583, 4574, 3626, 2703, 1847, 1045, 239, -539, -1300, -2066, -2824, -3588, +-4363, -5129, -5847, -6450, -6916, -7218, -7335, -7320, -7289, -7361, -7567, -7882, -8277, -8716, -9135, -9555, +-9986, -10362, -10626, -10728, -10682, -10600, -10604, -10792, -11177, -11702, -12277, -12812, -13173, -13311, -13246, -13030, +-12710, -12280, -11755, -11099, -10330, -9550, -8789, -8042, -7297, -6541, -5738, -4834, -3789, -2648, -1467, -321, +772, 1839, 2920, 4015, 5096, 6196, 7317, 8479, 9691, 10941, 12189, 13343, 14373, 15189, 15777, 16176, +16406, 16552, 16637, 16661, 16664, 16654, 16644, 16657, 16651, 16606, 16441, 16147, 15719, 15134, 14433, 13583, +12575, 11450, 10277, 9089, 7968, 6928, 5906, 4935, 4005, 3124, 2242, 1389, 570, -253, -1072, -1916, +-2790, -3642, -4462, -5209, -5798, -6216, -6462, -6571, -6672, -6864, -7160, -7563, -8023, -8532, -9051, -9579, +-10127, -10611, -11000, -11239, -11324, -11373, -11479, -11734, -12209, -12820, -13482, -14116, -14586, -14861, -14947, -14868, +-14667, -14359, -13923, -13368, -12710, -11980, -11288, -10595, -9926, -9249, -8480, -7655, -6681, -5571, -4439, -3324, +-2240, -1178, -107, 961, 2042, 3148, 4266, 5446, 6686, 7956, 9216, 10437, 11564, 12479, 13154, 13641, +13978, 14180, 14352, 14450, 14521, 14610, 14688, 14793, 14883, 14945, 14933, 14763, 14465, 14043, 13476, 12754, +11874, 10884, 9850, 8795, 7781, 6836, 5920, 5047, 4219, 3433, 2683, 1939, 1194, 480, -229, -961, +-1693, -2430, -3167, -3845, -4376, -4743, -4943, -5022, -5074, -5202, -5430, -5731, -6108, -6547, -7010, -7485, +-7979, -8446, -8816, -9041, -9094, -9095, -9157, -9382, -9846, -10448, -11101, -11732, -12235, -12557, -12705, -12705, +-12585, -12356, -11964, -11433, -10800, -10107, -9440, -8795, -8179, -7555, -6862, -6065, -5155, -4141, -3069, -2010, +-966, 57, 1053, 2072, 3117, 4158, 5217, 6337, 7495, 8689, 9902, 11070, 12144, 13033, 13702, 14162, +14470, 14694, 14795, 14841, 14870, 14880, 14901, 14942, 14995, 14996, 14927, 14753, 14426, 13948, 13336, 12589, +11698, 10682, 9603, 8532, 7468, 6453, 5498, 4569, 3687, 2832, 1988, 1171, 379, -386, -1154, -1931, +-2732, -3544, -4321, -5039, -5644, -6094, -6367, -6518, -6613, -6763, -7005, -7327, -7713, -8154, -8661, -9170, +-9693, -10181, -10578, -10828, -10922, -10960, -11030, -11229, -11649, -12233, -12872, -13483, -13992, -14347, -14541, -14572, +-14484, -14255, -13879, -13363, -12725, -12004, -11277, -10611, -9947, -9294, -8582, -7739, -6793, -5736, -4618, -3501, +-2392, -1298, -215, 885, 1998, 3114, 4257, 5422, 6618, 7878, 9191, 10457, 11650, 12660, 13453, 14048, +14477, 14778, 14981, 15135, 15248, 15352, 15473, 15600, 15736, 15851, 15890, 15827, 15604, 15260, 14756, 14088, +13308, 12408, 11423, 10414, 9410, 8464, 7563, 6688, 5853, 5033, 4245, 3481, 2732, 1990, 1246, 498, +-263, -1072, -1850, -2585, -3198, -3642, -3953, -4135, -4267, -4439, -4679, -5023, -5431, -5893, -6409, -6962, +-7538, -8086, -8519, -8850, -9036, -9119, -9262, -9533, -10001, -10629, -11349, -12049, -12654, -13140, -13447, -13613, +-13663, -13568, -13289, -12885, -12366, -11771, -11138, -10556, -10007, -9448, -8823, -8112, -7291, -6355, -5360, -4339, +-3304, -2286, -1276, -277, 733, 1796, 2852, 3918, 5040, 6225, 7449, 8661, 9793, 10796, 11601, 12209, +12640, 12924, 13128, 13244, 13313, 13399, 13477, 13598, 13757, 13877, 13923, 13904, 13752, 13429, 12978, 12381, +11616, 10749, 9813, 8844, 7883, 6969, 6111, 5270, 4470, 3684, 2924, 2208, 1503, 844, 142, -563, +-1256, -2015, -2759, -3448, -4034, -4455, -4715, -4878, -4989, -5107, -5285, -5548, -5883, -6271, -6733, -7245, +-7747, -8258, -8687, -8966, -9129, -9184, -9228, -9427, -9805, -10400, -11097, -11773, -12367, -12827, -13137, -13319, +-13363, -13278, -13007, -12594, -12068, -11424, -10786, -10170, -9594, -9041, -8420, -7672, -6860, -5910, -4921, -3879, +-2808, -1755, -690, 348, 1361, 2429, 3505, 4555, 5696, 6918, 8164, 9382, 10544, 11626, 12485, 13171, +13658, 14012, 14257, 14402, 14497, 14597, 14691, 14839, 14998, 15134, 15223, 15250, 15139, 14882, 14486, 13893, +13180, 12356, 11436, 10476, 9550, 8607, 7733, 6923, 6081, 5286, 4538, 3793, 3064, 2358, 1645, 913, +172, -611, -1403, -2163, -2823, -3332, -3671, -3893, -4082, -4272, -4507, -4840, -5255, -5720, -6235, -6802, +-7404, -8005, -8493, -8877, -9112, -9267, -9412, -9659, -10103, -10728, -11485, -12226, -12899, -13462, -13910, -14252, +-14450, -14477, -14336, -14019, -13554, -13004, -12401, -11841, -11329, -10808, -10239, -9556, -8779, -7937, -6988, -5979, +-4955, -3925, -2882, -1848, -820, 215, 1277, 2366, 3491, 4698, 5950, 7196, 8401, 9502, 10457, 11223, +11799, 12230, 12547, 12764, 12929, 13084, 13248, 13448, 13675, 13893, 14054, 14160, 14166, 14009, 13694, 13234, +12635, 11910, 11097, 10253, 9400, 8539, 7742, 7016, 6276, 5549, 4869, 4206, 3568, 2923, 2277, 1612, +928, 210, -546, -1246, -1839, -2308, -2623, -2827, -2984, -3140, -3332, -3603, -3954, -4364, -4859, -5431, +-6028, -6603, -7102, -7475, -7709, -7853, -7972, -8210, -8627, -9226, -9982, -10752, -11450, -12048, -12531, -12915, +-13164, -13261, -13195, -12917, -12500, -11988, -11442, -10914, -10406, -9905, -9380, -8729, -7992, -7194, -6295, -5348, +-4355, -3360, -2338, -1296, -294, 700, 1694, 2716, 3772, 4919, 6125, 7335, 8498, 9594, 10563, 11345, +11969, 12412, 12725, 12950, 13090, 13200, 13336, 13497, 13678, 13885, 14058, 14166, 14213, 14108, 13842, 13434, +12871, 12182, 11394, 10551, 9682, 8825, 8004, 7220, 6483, 5752, 5040, 4361, 3702, 3070, 2439, 1784, +1097, 389, -352, -1089, -1744, -2290, -2698, -2974, -3171, -3340, -3510, -3723, -4025, -4392, -4829, -5362, +-5940, -6525, -7073, -7525, -7849, -8050, -8180, -8326, -8601, -9057, -9676, -10417, -11160, -11821, -12390, -12851, +-13203, -13418, -13481, -13374, -13066, -12625, -12101, -11547, -11017, -10505, -9992, -9448, -8781, -8037, -7228, -6321, +-5362, -4368, -3367, -2342, -1298, -293, 676, 1601, 2427, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 225, 440, 136, 108, 180, +536, 158, -165, -17, -139, 47, 409, 388, 45, 60, 27, 296, 364, 69, -119, -74, +-5, 230, 440, 303, 201, -13, 146, -28, -287, -250, -251, 22, -115, 40, -364, -303, +-28, -105, 39, -444, -446, -293, -41, -360, -388, -161, -749, -52, -144, -446, -884, -1157, +-308, -435, -524, -507, -532, -636, -903, -74, -607, -748, -725, -487, -730, -748, -545, 321, +-233, -541, 12, -343, -609, -859, -844, 313, -259, -2061, 873, -1379, 710, 1876, 2201, 4738, +3626, 5052, 6904, 4514, 7941, 10342, 7657, 10825, 9532, 10570, 10395, 9217, 9153, 9095, 7514, 6191, +6693, 4455, 4277, 1403, 2196, -298, -2967, -2490, -6835, -6964, -7284, -5863, -5969, -8260, -8176, -10028, +-6137, -9915, -5605, -6794, -7679, -6052, -7651, -8011, -12791, -12068, -12250, -17134, -16323, -16759, -19529, -22771, +-21169, -20985, -19718, -21976, -23954, -21835, -23429, -21804, -19382, -16785, -17776, -16338, -12151, -9078, -5906, 671, +5804, 6797, 10806, 14137, 15536, 16169, 20051, 23555, 25072, 25890, 26800, 25638, 23917, 23181, 24793, 25970, +22445, 22533, 24791, 24611, 24734, 27073, 26945, 24531, 23879, 24693, 23826, 24525, 22720, 24499, 21988, 20582, +19582, 18518, 15561, 17209, 19844, 15513, 9749, 6435, 4917, -2866, -6741, -7670, -12432, -16921, -21120, -20871, +-23293, -26433, -25995, -26283, -28200, -29925, -29723, -26824, -26748, -25190, -19453, -18781, -21125, -15405, -13151, -11697, +-11854, -10597, -11297, -10490, -8868, -6721, -5869, -5871, -4465, -3250, -4067, -5304, -2150, 1815, 549, 2213, +5982, 6159, 5508, 8868, 10798, 11755, 11802, 10972, 14540, 12625, 15687, 19194, 18818, 18480, 18535, 19083, +15484, 14699, 17136, 16354, 8777, 6014, 4184, -2875, -6211, -8116, -8664, -14831, -17674, -17115, -18354, -20637, +-19703, -18740, -20428, -22481, -22626, -20148, -21174, -21860, -14767, -16478, -17337, -15702, -12875, -12859, -10243, -9193, +-8805, -10667, -9887, -7415, -6865, -5290, -4737, -3341, -5003, -8186, -5512, -2405, -2686, -1422, 1911, 3369, +3387, 6133, 8057, 10260, 9221, 9388, 11688, 11222, 13019, 16578, 18062, 17449, 18029, 19494, 16973, 14577, +19237, 21269, 16606, 15422, 13777, 11422, 5205, 4001, 4728, 913, -3481, -2381, -2381, -4082, -3149, -551, +364, -3152, -4058, -224, -4122, -3696, 1002, 1994, -684, 976, 2939, 3496, 4846, 6676, 8746, 6594, +6584, 8442, 9771, 10166, 11397, 14199, 12129, 7234, 7577, 9052, 7292, 7694, 9717, 9136, 9090, 7829, +8721, 9919, 8213, 8247, 7447, 5843, 4419, 5033, 4684, 2343, 1790, 2972, -1109, -5964, -3094, -1591, +-2683, -5000, -4853, -7016, -13466, -15818, -14313, -17507, -21370, -21611, -22934, -23585, -25478, -22959, -19892, -24145, +-24060, -21262, -23333, -23968, -19590, -16669, -16659, -15275, -12959, -11402, -10864, -6542, -3621, -3185, -3361, -1777, +2078, 2454, 5625, 11243, 12731, 8956, 9044, 10516, 9313, 10534, 11776, 13560, 13575, 11399, 13016, 13841, +13661, 14145, 14150, 12316, 10891, 11169, 12837, 10527, 10633, 13018, 9608, 5168, 4883, 7563, 7131, 4690, +5620, 4558, -1673, -6499, -5775, -8779, -10800, -13804, -13906, -16027, -20994, -18984, -15685, -18445, -19352, -17225, +-19305, -20849, -17391, -14104, -12576, -12383, -9058, -6990, -6409, -2461, 755, 3516, 2437, 4340, 6914, 6363, +6993, 12798, 16292, 13728, 13804, 13319, 13162, 12715, 13400, 16801, 16937, 15825, 16246, 17213, 16911, 17928, +18461, 18742, 16473, 17461, 18997, 16324, 16914, 20229, 19512, 15397, 12369, 14615, 14911, 13108, 13891, 15005, +8621, 4657, 1398, -177, -3706, -8575, -8811, -11088, -16780, -16687, -14627, -17052, -17980, -16033, -17529, -21033, +-21858, -19149, -17977, -17567, -15145, -14452, -13816, -13048, -9072, -6683, -7931, -8039, -5596, -6673, -8363, -3482, +-449, -447, -1077, -1515, -1189, -3372, -3728, -1678, -546, -1465, -807, -937, -534, -878, 1457, 2054, +-279, 1271, 2722, 1012, 944, 4198, 7059, 4617, 2034, 3799, 5238, 3037, 6118, 8116, 6612, 2999, +-641, -840, -3932, -7837, -6641, -7577, -12528, -12875, -10939, -12246, -12151, -10440, -9420, -12008, -13139, -11078, +-10149, -8462, -6777, -4350, -3782, -4034, -1064, 2557, 2289, 2304, 5872, 5051, 3479, 6007, 9378, 11964, +11356, 11634, 12014, 9472, 7660, 8983, 9618, 10025, 9325, 10095, 9712, 8527, 11348, 12247, 9827, 10379, +11766, 10472, 8614, 10520, 14584, 12780, 9154, 10666, 9954, 7888, 8518, 10250, 11311, 7674, 4005, 3094, +-428, -5001, -4305, -4693, -9537, -10822, -10690, -11422, -12892, -10973, -9286, -11171, -12497, -12631, -11687, -11059, +-9327, -6629, -5457, -6663, -4872, -1011, -1519, -642, 2119, 2469, 1068, 1120, 4331, 7257, 7739, 8542, +9818, 7754, 5747, 4712, 5810, 6077, 5592, 7229, 5711, 4463, 6155, 7609, 5998, 5914, 7364, 6852, +3036, 2640, 7335, 6686, 4117, 4538, 3287, 1533, -311, 1330, 3632, 1012, -2454, -3067, -6991, -12694, +-12576, -13259, -16395, -19572, -19521, -21029, -23542, -21957, -20660, -20836, -22257, -22827, -22473, -22174, -21316, -17929, +-15279, -16774, -14393, -10878, -10120, -8537, -5536, -2828, -2707, -3453, -422, 2924, 4460, 6958, 8959, 9552, +7952, 6337, 7874, 7616, 8355, 10575, 10676, 9144, 10937, 12633, 12810, 11931, 14031, 15764, 11792, 10793, +14739, 15481, 14759, 14518, 14785, 13627, 10600, 11242, 14611, 13421, 11069, 11790, 8224, 3077, 718, 551, +-2382, -5788, -6188, -8391, -11217, -11956, -10550, -10231, -11450, -12568, -12626, -13358, -14575, -10836, -8637, -9353, +-8082, -5474, -4812, -4043, -2046, 1460, 1979, 672, 2182, 4148, 6012, 7860, 9931, 12115, 10354, 8879, +8700, 7795, 7424, 9669, 9955, 8852, 9046, 10646, 10835, 8479, 10619, 13303, 9739, 7539, 8655, 10032, +9768, 8925, 9836, 9532, 5285, 4161, 7180, 6155, 4807, 5261, 3721, -1555, -4969, -5267, -8263, -11395, +-12261, -13786, -16920, -18998, -18544, -17701, -18223, -19756, -18902, -20553, -22480, -19884, -17191, -17283, -16246, -14027, +-12196, -12463, -11073, -7059, -5880, -5922, -5340, -3822, -1847, -656, 2315, 5478, 5523, 4844, 4786, 3038, +2731, 4317, 5757, 5367, 4509, 7102, 7714, 5057, 7044, 10006, 8956, 6423, 6289, 7714, 8398, 7555, +9606, 11126, 7224, 5702, 7289, 7727, 6527, 7941, 8362, 4054, 638, -563, -3047, -6053, -6943, -7839, +-10272, -13287, -14272, -12771, -13683, -14092, -12727, -13923, -16377, -14892, -12429, -11272, -10679, -8591, -5837, -6263, +-5170, -2005, 444, 1219, 1576, 3135, 4844, 5281, 7694, 11353, 12796, 13491, 13744, 12197, 10656, 10595, +12609, 12625, 10976, 13316, 14189, 12114, 12066, 14525, 15437, 13951, 12164, 13001, 13570, 12028, 13540, 15605, +13809, 11167, 11239, 11339, 9708, 10529, 11894, 9580, 6114, 3943, 899, -2490, -4862, -6161, -7548, -11389, +-14053, -14232, -15313, -16292, -15146, -15786, -18189, -19343, -18097, -16653, -17049, -15318, -12900, -12507, -12526, -10773, +-8120, -6638, -6550, -5085, -3450, -3489, -1872, 1001, 2992, 4703, 5766, 5595, 3272, 1766, 3802, 3912, +2527, 4145, 5716, 4093, 3196, 4826, 7107, 6523, 4473, 5345, 5770, 4398, 5140, 8015, 8118, 5706, +5741, 5614, 3891, 4219, 6434, 5711, 3624, 1891, -451, -3274, -6504, -7585, -8076, -11017, -13762, -14153, +-15633, -16538, -15568, -14834, -15767, -17832, -16857, -15636, -15853, -14266, -11370, -9692, -9333, -8467, -5633, -3487, +-2701, -743, 1127, 1249, 2241, 4402, 7059, 9169, 11101, 12621, 10537, 8476, 9973, 10007, 8396, 9657, +11898, 11576, 9875, 10080, 12885, 13096, 11514, 12063, 12546, 10617, 9959, 12726, 13660, 12077, 11857, 11610, +9213, 8653, 10133, 10607, 9218, 7332, 5740, 2846, -1223, -3100, -3299, -6079, -8518, -9794, -11670, -13316, +-13597, -12049, -12863, -14899, -14889, -14271, -14632, -14030, -11726, -9285, -8774, -8717, -6288, -4276, -3565, -1695, +-146, 788, 1018, 2202, 4442, 5749, 8266, 11286, 10157, 7840, 8300, 7994, 6458, 6467, 8481, 9556, +7402, 6716, 8857, 9795, 8506, 8320, 9126, 7138, 5484, 7190, 8519, 7132, 7399, 7349, 5086, 3442, +3634, 4502, 4111, 2814, 2122, -25, -4550, -6930, -7738, -10033, -12182, -13880, -15384, -18067, -19313, -17958, +-18036, -19736, -20080, -19810, -20149, -20609, -19109, -16163, -15016, -14761, -12744, -10965, -9624, -7856, -5790, -4001, +-3767, -2458, -399, 580, 3237, 7568, 8287, 7034, 7321, 7713, 6531, 5342, 7233, 9647, 8814, 7621, +9188, 10883, 10132, 10332, 12168, 11111, 8703, 9906, 11441, 11239, 11858, 12555, 11427, 9615, 9236, 10404, +10721, 9698, 10348, 9387, 5812, 2951, 1276, -442, -2880, -4334, -5518, -8533, -11112, -10564, -10488, -11710, +-12610, -12600, -12991, -14342, -14093, -11660, -10493, -9769, -8483, -6984, -5832, -5134, -3297, -1443, -1230, -109, +1555, 1262, 3060, 7131, 9129, 8920, 8760, 9168, 7738, 5468, 5999, 8617, 8640, 6958, 7468, 9066, +8276, 7937, 10022, 9541, 7226, 7170, 7919, 7811, 8353, 9557, 9556, 7821, 6264, 7147, 7202, 6420, +7312, 7443, 5130, 1979, -70, -1879, -4757, -6360, -6923, -9630, -12779, -13609, -13489, -14409, -15592, -15335, +-15226, -17218, -17853, -16319, -14817, -13791, -12870, -11251, -10120, -9773, -7800, -5851, -5605, -3972, -2146, -2463, +-1845, 1482, 4597, 5364, 5833, 7058, 6498, 3487, 2411, 4437, 5600, 4073, 4051, 5796, 5096, 4642, +6610, 7040, 5538, 5052, 5266, 5323, 5552, 6659, 8152, 7007, 5565, 5954, 5689, 4955, 5573, 6739, +6070, 3332, 1359, -505, -3513, -5239, -5483, -7354, -10415, -12127, -12164, -12647, -14127, -13798, -13290, -14389, +-15309, -14795, -13253, -12130, -11026, -8619, -7007, -6830, -4754, -2650, -2043, 2, 2246, 2580, 2252, 4752, +8369, 10021, 10783, 12533, 13371, 11083, 8654, 9701, 11422, 10216, 10142, 11862, 11150, 10296, 11762, 12731, +11855, 11067, 10728, 10584, 9822, 10510, 12219, 11481, 10083, 9750, 9076, 7871, 7321, 8484, 8581, 6419, +4553, 2613, -902, -3535, -4486, -5859, -8799, -11765, -12464, -13529, -15459, -15898, -15570, -16126, -17473, -18306, +-17448, -16860, -16320, -13933, -12151, -11915, -10362, -8772, -8191, -6714, -3896, -2836, -3559, -2492, 840, 3099, +4223, 6361, 8741, 7929, 4812, 4908, 6494, 5713, 5756, 7647, 7528, 6556, 7427, 8640, 8779, 8088, +8091, 7839, 6511, 6928, 8709, 9002, 8191, 7888, 7861, 6574, 5568, 6528, 7247, 6143, 5232, 4073, +1111, -2003, -3723, -4381, -6729, -9616, -10905, -12192, -14119, -15214, -15045, -14864, -16116, -17419, -16843, -16769, +-16787, -14683, -12919, -12188, -10850, -9101, -8603, -7849, -5166, -3060, -3269, -3009, -574, 1981, 3100, 4855, +8558, 9543, 6842, 6041, 7075, 6240, 5988, 7655, 8227, 7589, 7732, 9129, 9884, 9426, 9919, 10074, +8552, 8238, 9686, 10624, 10364, 10375, 10956, 9962, 8414, 8838, 9643, 9366, 9124, 8780, 6860, 3492, +1375, 783, -1048, -3612, -5088, -6565, -8391, -10129, -10737, -10250, -11266, -12660, -12605, -12982, -13471, -12224, +-10517, -9695, -8357, -6622, -6229, -6322, -4195, -1721, -1271, -1598, -413, 2173, 2868, 3739, 7515, 10003, +8164, 6869, 7066, 5919, 4974, 5741, 6649, 6172, 5614, 6657, 7078, 6402, 6770, 7127, 5893, 4620, +4965, 6006, 5804, 5771, 6711, 6027, 4233, 3944, 4364, 4335, 4080, 4640, 4094, 1120, -1302, -2353, +-4045, -6395, -8142, -9382, -10861, -13304, -14594, -14286, -14936, -15712, -15612, -15987, -16795, -16189, -14583, -13483, +-11976, -9587, -8568, -8672, -7196, -4450, -2759, -2955, -2101, 600, 1587, 1743, 5316, 9076, 9245, 8685, +8736, 7911, 6594, 6648, 8033, 7956, 7224, 8024, 8530, 8069, 8411, 9206, 8611, 7007, 6729, 7645, +7369, 7219, 8431, 8634, 7264, 6264, 6377, 6196, 5585, 6390, 6840, 4563, 1877, 283, -1365, -3341, +-5565, -6780, -7975, -10609, -12450, -12688, -13488, -14400, -14308, -14583, -15571, -15611, -14560, -13906, -12642, -9942, +-8290, -8137, -7693, -5360, -2930, -2665, -2196, 588, 1931, 1595, 4223, 8247, 10006, 10307, 10776, 10536, +8918, 8198, 9347, 9674, 9269, 9909, 10550, 10240, 10139, 11038, 11317, 9793, 9032, 9507, 9153, 8704, +9600, 10443, 9698, 8420, 8283, 7671, 6453, 6838, 7830, 6753, 4570, 2476, 908, -1256, -4044, -5400, +-6496, -9031, -11480, -12566, -13774, -15011, -15156, -15289, -16581, -17321, -17005, -17102, -16562, -14279, -11961, -11380, +-11753, -10168, -7393, -6886, -6709, -4021, -2437, -2997, -1664, 1756, 4555, 5803, 6894, 7529, 6119, 4855, +5338, 5658, 5449, 5936, 6879, 6933, 6673, 7763, 8719, 7868, 7114, 7419, 7220, 6560, 6982, 8350, +8465, 7646, 7787, 7436, 6080, 6099, 7103, 7448, 6201, 4410, 3273, 1427, -1397, -3040, -3778, -5818, +-8141, -9603, -10968, -12674, -13057, -12943, -14059, -14838, -14723, -15037, -15213, -13833, -11120, -9475, -9958, -9167, +-6394, -5662, -5720, -3377, -1217, -1251, -1096, 1435, 4301, 6003, 7883, 9433, 8668, 7176, 6898, 7041, +6759, 6981, 8018, 8232, 7601, 8270, 9308, 8907, 8146, 8108, 8072, 7117, 6866, 8193, 8626, 8198, +8598, 8355, 7124, 6303, 6802, 7798, 7399, 6011, 5212, 3812, 1055, -1044, -1994, -3580, -5849, -7395, +-8896, -11050, -11998, -12019, -12798, -13536, -13585, -13954, -14795, -14761, -12277, -9690, -9789, -9532, -7060, -6022, +-6211, -4596, -2025, -1370, -1718, -178, 2358, 4061, 6288, 8732, 9223, 8170, 7499, 7255, 6453, 6159, +7114, 7531, 6889, 7119, 8077, 8152, 7379, 7223, 7448, 6274, 5381, 6162, 6507, 6420, 6861, 7150, +6245, 4878, 4514, 5400, 5522, 4588, 4142, 3193, 829, -1665, -2902, -4232, -6285, -7693, -9288, -11627, +-13164, -13697, -14415, -15179, -15422, -15384, -16247, -17417, -15762, -12736, -12174, -11904, -9758, -8145, -8210, -7369, +-4608, -2955, -2962, -1933, 234, 1801, 3879, 6861, 8794, 8706, 8348, 8222, 7262, 6604, 7473, 8338, +8021, 7951, 8858, 9524, 8958, 8925, 9514, 8605, 7559, 7904, 8140, 8045, 8436, 9143, 9042, 7524, +6523, 7011, 7268, 6768, 6528, 6375, 4649, 2125, 551, -1058, -3079, -4369, -5832, -8181, -10163, -11421, +-12386, -13371, -13942, -13512, -14169, -16336, -16090, -13568, -12411, -12133, -10390, -8426, -8319, -8244, -5968, -3879, +-3496, -2778, -1217, 120, 1693, 4547, 7373, 8297, 8484, 8731, 7856, 6620, 6803, 7762, 7878, 7526, +8375, 9305, 8680, 8609, 9310, 8842, 7782, 7587, 7722, 7492, 7510, 8522, 9354, 8377, 7124, 7015, +7176, 6705, 6589, 6972, 5970, 3884, 2257, 404, -1680, -3016, -4335, -6347, -8524, -10282, -11532, -12989, +-14099, -13511, -13671, -15905, -16957, -15415, -14027, -13777, -12510, -10209, -9600, -9986, -8510, -6400, -5449, -4713, +-3329, -2173, -1269, 1016, 4010, 5775, 6779, 7641, 7263, 5823, 5158, 5878, 6236, 5760, 6531, 7554, +7132, 6944, 7613, 7601, 6925, 6464, 6526, 6271, 5813, 6520, 7825, 7810, 6662, 6275, 6400, 5823, +5572, 6377, 6183, 4849, 3595, 1848, -277, -1789, -2928, -4350, -6375, -8320, -9521, -11336, -13069, -12638, +-12004, -13689, -15503, -14979, -13723, -13542, -12497, -9939, -8699, -8905, -8127, -6283, -5010, -4122, -2609, -1421, +-869, 715, 3487, 5655, 7316, 8815, 9445, 8379, 7041, 7364, 7632, 7007, 7465, 8620, 8571, 8271, +8664, 8949, 8466, 7849, 7866, 7548, 6676, 6670, 7905, 8612, 7841, 7332, 7350, 6526, 5906, 6435, +6668, 6027, 5246, 3738, 1620, -263, -1591, -2722, -4712, -6657, -7820, -9800, -12286, -12807, -11949, -12722, +-14868, -15271, -14366, -14418, -14002, -11688, -9818, -9585, -9218, -7792, -6566, -5749, -4158, -2781, -2274, -1176, +903, 3109, 5010, 7021, 8833, 8590, 7161, 7008, 7059, 6373, 6509, 7536, 7953, 7660, 7802, 8276, +7989, 7364, 7312, 7214, 6245, 5484, 6236, 7351, 7133, 6788, 6860, 6017, 5056, 5174, 5400, 5308, +5043, 4109, 2444, 171, -1445, -2429, -4211, -6166, -7204, -8884, -11886, -13604, -12977, -12972, -14879, -15869, +-15491, -15738, -16029, -14324, -11966, -11089, -10748, -9519, -8417, -7655, -6105, -4501, -3730, -2980, -1370, 726, +2493, 4689, 7481, 8440, 7655, 7407, 7307, 6536, 6298, 7172, 7996, 8019, 8190, 8722, 8702, 8218, +8145, 8364, 7695, 6482, 6607, 7589, 7771, 7868, 8296, 7782, 6819, 6411, 6361, 6477, 6507, 6347, +5410, 3284, 1499, 473, -1166, -3144, -4077, -5202, -8121, -10937, -11159, -10929, -12328, -13623, -13668, -14048, +-15015, -14379, -12196, -10831, -10291, -9191, -8258, -7734, -6450, -4782, -3673, -3054, -1848, 62, 1388, 3221, +6288, 8231, 8344, 8261, 8183, 7380, 6564, 6908, 7723, 7967, 8102, 8619, 8823, 8271, 7928, 8416, +8150, 6770, 6293, 6823, 6934, 7225, 7865, 7822, 7064, 6324, 5891, 5762, 5737, 6028, 5890, 4190, +2280, 1063, -495, -2667, -3813, -4292, -6672, -10091, -11453, -11406, -12387, -13773, -14101, -14444, -15743, -16092, +-14514, -13006, -12106, -10992, -10078, -9538, -8796, -7298, -5877, -5247, -4194, -2379, -1285, -3, 2789, 5437, +6583, 7078, 7505, 6948, 5760, 5479, 6082, 6506, 6741, 7287, 7844, 7449, 6893, 7418, 7642, 6575, +5824, 5880, 5828, 6033, 6758, 7292, 7126, 6441, 5937, 5502, 5106, 5522, 6063, 5207, 3614, 2489, +1208, -1055, -2517, -2566, -3918, -7210, -9535, -10091, -10937, -12379, -12836, -12897, -14181, -15217, -14544, -13321, +-12174, -10868, -9644, -8968, -8525, -7228, -5653, -4998, -3930, -2105, -1038, -253, 1921, 4797, 6696, 7841, +8872, 8966, 7943, 7110, 7205, 7593, 7752, 8309, 9235, 9112, 8278, 8542, 8985, 8345, 7546, 7235, +6880, 6729, 7165, 7934, 8188, 7801, 7449, 6775, 5935, 6003, 6727, 6569, 5348, 4443, 3406, 1102, +-1029, -1339, -1848, -4528, -7402, -8779, -9759, -11414, -12190, -12223, -13270, -14596, -14919, -14336, -13425, -12245, +-10791, -9860, -9600, -8659, -7247, -6625, -5793, -4034, -2793, -2299, -892, 1645, 3811, 5431, 7036, 7912, +7418, 6382, 6002, 6132, 6047, 6438, 7601, 7897, 7134, 7082, 7430, 7150, 6511, 6042, 5620, 5037, +4970, 5708, 6317, 6376, 6336, 5839, 4825, 4254, 4839, 5207, 4471, 3870, 3424, 1500, -1058, -1964, +-1930, -3554, -6409, -8160, -9435, -11382, -12521, -12597, -13123, -14375, -15250, -15290, -14843, -13983, -12334, -10965, +-10506, -9674, -8334, -7662, -7015, -5295, -3671, -2964, -2013, 42, 2208, 4103, 6152, 7999, 8544, 7776, +7144, 7074, 6773, 6838, 8039, 8901, 8508, 8290, 8602, 8640, 8222, 7898, 7596, 6918, 6444, 6755, +7326, 7665, 8033, 8053, 7080, 5926, 6067, 6567, 6119, 5799, 5961, 4725, 2067, 406, 424, -432, +-2833, -4724, -6319, -8427, -10137, -10703, -11074, -12110, -13333, -13883, -14104, -13866, -12449, -10912, -10282, -9564, +-8280, -7558, -7262, -5988, -4223, -3333, -2645, -1092, 869, 2614, 4577, 6894, 8408, 8328, 7783, 7583, +6880, 6376, 7205, 8273, 8437, 8233, 8310, 8324, 7966, 7631, 7393, 6695, 5895, 5721, 5964, 6191, +6758, 7375, 6862, 5459, 5042, 5308, 4888, 4511, 5023, 4844, 2599, 275, -221, -773, -2609, -4388, +-5992, -8159, -10355, -11629, -12076, -12929, -14051, -14727, -15388, -15830, -15033, -13605, -12796, -12024, -10618, -9711, +-9598, -8745, -7053, -5848, -5052, -3850, -2140, -520, 1210, 3651, 6003, 6899, 6978, 7016, 6371, 5468, +5692, 6792, 7471, 7544, 7724, 7873, 7648, 7420, 7376, 7007, 6221, 5779, 5786, 5815, 6274, 7398, +7703, 6656, 5966, 6032, 5673, 5066, 5643, 6489, 5127, 2742, 1737, 1253, -40, -1491, -2827, -4640, +-7031, -8936, -9724, -10490, -11491, -12159, -12997, -13973, -13866, -12664, -11778, -11059, -9620, -8425, -8186, -7737, +-6409, -5115, -4248, -3190, -1632, -147, 1102, 3258, 5877, 7504, 8320, 8849, 8514, 7424, 6952, 7578, +8305, 8582, 8852, 9014, 8757, 8474, 8442, 8222, 7488, 6841, 6599, 6153, 6108, 7161, 7977, 7415, +6559, 6375, 5968, 4846, 4868, 6101, 5761, 3804, 2361, 1625, 515, -883, -2012, -3460, -5830, -8145, +-9474, -10583, -11733, -12437, -13227, -14523, -15098, -14462, -13851, -13391, -12092, -10574, -10015, -9783, -8891, -7642, +-6692, -5798, -4310, -2872, -1930, -251, 2265, 4305, 5754, 6962, 7325, 6419, 5450, 5469, 6046, 6526, +7050, 7490, 7434, 7141, 7083, 7061, 6545, 6002, 5725, 5028, 4424, 5088, 6258, 6391, 5777, 5716, +5522, 4135, 3571, 4713, 5277, 4184, 2819, 1984, 961, -354, -1300, -2228, -4116, -6428, -8149, -9552, +-10849, -11555, -12143, -13431, -14437, -14255, -13877, -13648, -12600, -10982, -9920, -9506, -8864, -7698, -6774, -5983, +-4500, -2946, -1989, -665, 1500, 3729, 5560, 7419, 8779, 8687, 7759, 7323, 7499, 7879, 8503, 9207, +9470, 9187, 9094, 9140, 8735, 8299, 8173, 7563, 6554, 6472, 7563, 8194, 7880, 7994, 8126, 6821, +5510, 5924, 6816, 6537, 5405, 4451, 3472, 2037, 981, 303, -1109, -3270, -5241, -7034, -8826, -9850, +-10466, -11727, -13077, -13477, -13525, -13768, -13377, -12053, -10731, -10177, -9730, -8800, -8081, -7565, -6336, -4737, +-3710, -2786, -1082, 855, 2633, 4661, 6691, 7486, 6982, 6260, 5927, 5920, 6302, 7131, 7704, 7563, +7473, 7526, 7143, 6691, 6618, 6329, 5177, 4381, 5085, 5873, 5712, 6018, 6603, 5766, 4194, 3803, +4530, 4802, 4209, 3608, 2861, 1521, 360, -235, -1213, -2904, -4679, -6559, -8678, -10108, -10766, -11859, +-13294, -13975, -14169, -14594, -14746, -13854, -12406, -11506, -10927, -9968, -9177, -8792, -7860, -6259, -4990, -4070, +-2639, -854, 753, 2698, 5127, 6867, 7330, 7000, 6580, 6254, 6255, 6996, 7829, 8079, 8226, 8387, +8166, 7688, 7685, 7814, 6914, 5704, 5822, 6472, 6407, 6727, 7738, 7761, 6395, 5377, 5649, 6099, +5973, 5759, 5376, 4282, 3011, 2275, 1554, 273, -1133, -2827, -5136, -7000, -7926, -8983, -10404, -11388, +-11776, -12322, -12972, -12699, -11461, -10491, -9818, -8849, -7989, -7690, -7189, -5905, -4649, -3774, -2602, -1063, +268, 1821, 4068, 6382, 7694, 7971, 7762, 7170, 6623, 6930, 7671, 8100, 8345, 8602, 8464, 7768, +7520, 7836, 7220, 5770, 5347, 5624, 5400, 5319, 6263, 6977, 6124, 4732, 4281, 4424, 4331, 4302, +4242, 3497, 2212, 1349, 623, -486, -1569, -2919, -5108, -7306, -8650, -9797, -11290, -12582, -13156, -13694, +-14622, -15052, -14365, -13429, -12684, -11680, -10627, -10170, -9865, -8843, -7589, -6598, -5415, -3908, -2575, -1275, +672, 3191, 5208, 6380, 6875, 6566, 5842, 5684, 6207, 6803, 7259, 7801, 8118, 7533, 7083, 7587, +7509, 6344, 5602, 5712, 5406, 4993, 5720, 6986, 7044, 5973, 5217, 4961, 4816, 4815, 5134, 4815, +3841, 3067, 2343, 1301, 452, -404, -2124, -4308, -5972, -7171, -8713, -10306, -11092, -11538, -12478, -13260, +-13132, -12527, -11908, -10915, -9606, -8869, -8616, -7955, -6920, -5979, -4892, -3423, -2058, -943, 496, 2692, +4918, 6720, 8015, 8362, 7831, 7318, 7456, 7912, 8294, 8998, 9719, 9325, 8639, 8932, 9121, 8194, +7268, 7078, 6729, 5931, 5995, 7200, 7878, 7317, 6538, 6022, 5464, 5160, 5446, 5463, 4796, 4137, +3405, 2316, 1382, 721, -546, -2631, -4569, -5980, -7572, -9461, -10718, -11363, -12349, -13489, -13912, -13777, +-13573, -12943, -11681, -10737, -10380, -9929, -9208, -8447, -7583, -6258, -4843, -3880, -2809, -1091, 960, 3028, +4962, 6099, 6119, 5495, 5319, 5542, 5679, 6355, 7405, 7476, 6843, 6870, 7243, 6729, 5815, 5561, +5306, 4368, 3870, 4635, 5714, 5886, 5457, 5063, 4400, 3879, 4034, 4283, 4039, 3677, 3210, 2261, +1348, 886, 148, -1438, -3282, -4667, -6171, -8115, -9679, -10440, -11232, -12328, -13009, -13169, -13333, -13099, +-12017, -10786, -10059, -9501, -8792, -8134, -7495, -6284, -4748, -3539, -2489, -1063, 653, 2643, 4831, 6769, +7665, 7409, 7167, 7127, 6918, 7292, 8562, 9201, 8766, 8625, 9066, 8867, 8033, 7642, 7529, 6710, +5702, 5766, 6744, 7296, 7315, 7194, 6574, 5752, 5498, 5557, 5432, 5300, 5074, 4350, 3300, 2711, +2228, 1035, -680, -2061, -3462, -5485, -7499, -8700, -9625, -10763, -11655, -12114, -12626, -12909, -12343, -11233, +-10395, -9822, -9178, -8653, -8306, -7475, -6118, -4882, -3850, -2711, -1315, 254, 2270, 4582, 6221, 6607, +6662, 6594, 6050, 5862, 6867, 7849, 7783, 7486, 7810, 7855, 7088, 6545, 6467, 5890, 4667, 4088, +4605, 5185, 5556, 5789, 5408, 4565, 4001, 3791, 3612, 3513, 3532, 3140, 2218, 1547, 1262, 418, +-1099, -2439, -3636, -5430, -7535, -9089, -10170, -11375, -12344, -12926, -13521, -14107, -14099, -13287, -12348, -11581, +-10708, -10021, -9745, -9191, -8033, -6696, -5536, -4359, -3033, -1688, -41, 2387, 4650, 5847, 6526, 6961, +6604, 6053, 6623, 7806, 8199, 8150, 8508, 8796, 8351, 7723, 7747, 7618, 6589, 5670, 5630, 5941, +6429, 7005, 7122, 6604, 6063, 5702, 5316, 5072, 5228, 5217, 4514, 3831, 3559, 3061, 1843, 577, +-331, -1723, -3770, -5614, -7005, -8418, -9693, -10461, -11101, -11962, -12522, -12240, -11561, -10900, -9976, -9118, +-8727, -8447, -7696, -6566, -5420, -4256, -2948, -1882, -783, 1184, 3585, 5242, 6384, 7310, 7258, 6419, +6352, 7296, 7945, 8048, 8378, 8891, 8631, 7856, 7679, 7677, 6876, 5761, 5183, 5029, 5232, 5871, +6308, 6103, 5616, 5189, 4616, 4088, 4102, 4223, 3788, 3090, 2769, 2478, 1506, 278, -643, -1708, +-3511, -5440, -7085, -8702, -10175, -11104, -11802, -12727, -13632, -13854, -13568, -13062, -12207, -11269, -10679, -10432, +-10005, -9121, -8106, -7007, -5635, -4480, -3570, -2013, 221, 2208, 3775, 5342, 6086, 5529, 5042, 5605, +6353, 6656, 6984, 7723, 7934, 7354, 7087, 7191, 6767, 5898, 5183, 4660, 4558, 5087, 5780, 5959, +5789, 5577, 5083, 4413, 4216, 4461, 4302, 3778, 3502, 3511, 2928, 1844, 1052, 282, -1040, -2727, +-4379, -6037, -7705, -8973, -9711, -10555, -11503, -12035, -12183, -12041, -11423, -10423, -9555, -9104, -8721, -8078, +-7359, -6416, -4982, -3613, -2781, -1668, 206, 2095, 3828, 5838, 7407, 7514, 6903, 6930, 7529, 7841, +8140, 8985, 9562, 9186, 8726, 8732, 8519, 7811, 7041, 6271, 5610, 5607, 6152, 6501, 6521, 6536, +6197, 5340, 4699, 4729, 4702, 4160, 3764, 3833, 3484, 2531, 1665, 1004, -64, -1587, -3127, -4828, +-6780, -8435, -9468, -10440, -11485, -12320, -12885, -13176, -13032, -12298, -11356, -10762, -10355, -9855, -9352, -8719, +-7482, -6055, -5135, -4238, -2706, -1045, 496, 2538, 4689, 5694, 5484, 5316, 5708, 5936, 6055, 6813, +7723, 7830, 7483, 7385, 7296, 6853, 6245, 5524, 4684, 4257, 4509, 4868, 5066, 5321, 5347, 4816, +4070, 3855, 3879, 3408, 2973, 3099, 3118, 2508, 1714, 1126, 360, -789, -2025, -3513, -5420, -7273, +-8614, -9640, -10619, -11504, -12151, -12705, -12951, -12580, -11687, -10905, -10319, -9698, -9261, -8983, -8013, -6532, +-5417, -4510, -3156, -1660, -348, 1494, 3985, 5924, 6472, 6458, 6807, 7059, 7020, 7596, 8590, 9104, +9017, 8935, 8934, 8663, 8258, 7675, 6794, 6032, 5916, 6106, 6275, 6601, 6940, 6734, 6035, 5587, +5514, 5091, 4487, 4443, 4664, 4413, 3716, 3093, 2377, 1364, 312, -834, -2555, -4574, -6292, -7645, +-8772, -9766, -10599, -11418, -12148, -12316, -11826, -11206, -10618, -9897, -9407, -9312, -8837, -7617, -6567, -5712, +-4506, -3123, -2049, -748, 1476, 3879, 5111, 5469, 5885, 6090, 5893, 6070, 6876, 7611, 7821, 7902, +7868, 7657, 7370, 6937, 6089, 5200, 4724, 4633, 4568, 4742, 5250, 5396, 4829, 4311, 4172, 3789, +3070, 2745, 3009, 3064, 2653, 2206, 1640, 792, -64, -927, -2256, -4121, -5953, -7545, -8873, -10013, +-10847, -11646, -12560, -13157, -13035, -12589, -12093, -11261, -10491, -10306, -10025, -9081, -7994, -7165, -6038, -4553, +-3419, -2459, -637, 1858, 3763, 4778, 5610, 6110, 6031, 5997, 6601, 7437, 7953, 8292, 8441, 8326, +8179, 8005, 7375, 6523, 5906, 5663, 5412, 5342, 5858, 6319, 6191, 5789, 5638, 5358, 4639, 4058, +4106, 4272, 4171, 3942, 3544, 2814, 2047, 1373, 434, -990, -2808, -4558, -6163, -7558, -8567, -9317, +-10277, -11240, -11566, -11508, -11275, -10563, -9635, -9299, -9237, -8690, -7800, -7029, -6084, -4656, -3382, -2674, +-1472, 710, 2838, 4335, 5523, 6409, 6567, 6373, 6608, 7278, 7859, 8377, 8712, 8663, 8552, 8443, +7953, 7060, 6220, 5746, 5284, 4863, 5087, 5639, 5732, 5431, 5247, 5116, 4476, 3681, 3346, 3295, +3240, 3149, 2954, 2385, 1611, 910, 243, -863, -2414, -4142, -5934, -7650, -8940, -9798, -10743, -11815, +-12497, -12809, -12945, -12536, -11647, -11082, -10897, -10531, -9755, -9129, -8467, -7116, -5623, -4793, -3977, -2247, +-122, 1591, 3163, 4592, 5281, 5299, 5365, 5793, 6371, 7041, 7626, 7854, 7866, 7957, 7839, 7180, +6362, 5886, 5418, 4824, 4705, 5164, 5485, 5372, 5335, 5450, 5052, 4233, 3661, 3458, 3381, 3439, +3559, 3336, 2731, 2149, 1591, 854, -259, -1678, -3350, -5217, -6811, -7860, -8820, -9902, -10703, -11240, +-11765, -11781, -11122, -10390, -10039, -9676, -9007, -8470, -8060, -7000, -5465, -4414, -3762, -2522, -681, 1083, +2818, 4557, 5794, 6183, 6290, 6523, 6937, 7538, 8241, 8702, 8824, 9015, 9104, 8668, 7875, 7264, +6704, 5980, 5473, 5600, 5925, 5857, 5799, 6032, 5902, 5257, 4514, 3973, 3639, 3608, 3752, 3740, +3327, 2734, 2173, 1534, 695, -442, -1863, -3746, -5640, -6991, -8155, -9351, -10262, -11001, -11828, -12358, +-12160, -11505, -11128, -10844, -10230, -9739, -9538, -8905, -7504, -6254, -5586, -4654, -3169, -1571, 61, 1916, +3632, 4611, 4995, 5183, 5392, 5843, 6542, 7127, 7437, 7722, 8038, 7864, 7172, 6556, 6077, 5368, +4607, 4427, 4695, 4686, 4608, 4903, 5129, 4872, 4232, 3632, 3067, 2745, 2866, 3055, 2935, 2550, +2100, 1601, 937, 134, -854, -2444, -4327, -5885, -7161, -8425, -9409, -10103, -10960, -11833, -12041, -11581, +-11157, -10849, -10235, -9647, -9506, -9196, -8081, -6724, -5803, -4938, -3671, -2280, -793, 1007, 2983, 4524, +5421, 5877, 6085, 6349, 6982, 7720, 8155, 8537, 9026, 9226, 8818, 8219, 7714, 7058, 6192, 5708, +5789, 5812, 5702, 5840, 6138, 6187, 5808, 5173, 4429, 3845, 3676, 3828, 3909, 3729, 3331, 2916, +2293, 1689, 1043, -176, -1954, -3651, -5161, -6658, -7916, -8745, -9579, -10692, -11403, -11370, -11170, -11069, +-10616, -9919, -9713, -9632, -8949, -7751, -6803, -6003, -4925, -3719, -2497, -967, 923, 2696, 4074, 4972, +5309, 5398, 5867, 6521, 6986, 7405, 8015, 8501, 8353, 7840, 7405, 6828, 5867, 5141, 4969, 4897, +4640, 4611, 4875, 5107, 5059, 4684, 3996, 3166, 2672, 2683, 2857, 2823, 2662, 2377, 1785, 1218, +810, 16, -1436, -3057, -4602, -6265, -7757, -8718, -9472, -10593, -11629, -11944, -11930, -11983, -11675, -10897, +-10417, -10432, -10061, -9087, -8146, -7297, -6259, -5081, -3966, -2649, -922, 903, 2580, 3996, 4819, 5173, +5554, 6192, 6715, 7133, 7806, 8600, 8829, 8517, 8188, 7795, 6972, 6132, 5796, 5634, 5362, 5203, +5309, 5602, 5817, 5818, 5410, 4650, 3859, 3503, 3530, 3615, 3685, 3617, 3162, 2624, 2328, 1852, +827, -549, -2017, -3670, -5410, -6724, -7589, -8629, -9808, -10514, -10773, -11048, -11098, -10508, -9856, -9768, +-9638, -9012, -8139, -7379, -6414, -5323, -4324, -3282, -1882, -224, 1486, 3196, 4460, 5061, 5464, 6012, +6498, 6808, 7355, 8202, 8770, 8732, 8556, 8334, 7637, 6705, 6065, 5745, 5396, 5074, 4937, 5062, +5300, 5484, 5402, 4805, 3908, 3210, 2902, 2861, 2949, 3050, 2808, 2294, 1933, 1651, 971, -94, +-1324, -2832, -4669, -6235, -7252, -8324, -9599, -10554, -11084, -11608, -12047, -11797, -11157, -10863, -10771, -10374, +-9705, -9047, -8232, -7156, -6089, -5068, -3888, -2507, -874, 936, 2605, 3642, 4237, 4849, 5445, 5760, +6166, 7002, 7861, 8236, 8314, 8329, 7936, 7064, 6264, 5823, 5493, 5130, 4849, 4782, 4907, 5183, +5474, 5268, 4519, 3758, 3240, 2926, 2901, 3162, 3216, 2895, 2547, 2353, 1971, 1213, 322, -847, +-2551, -4281, -5551, -6641, -7941, -9034, -9677, -10309, -11012, -11165, -10697, -10263, -10149, -9876, -9393, -8861, +-8188, -7211, -6177, -5132, -4072, -2885, -1542, 134, 1978, 3477, 4376, 5145, 5871, 6235, 6400, 7049, +7975, 8616, 8916, 9157, 9012, 8320, 7458, 6824, 6395, 5977, 5552, 5272, 5170, 5258, 5658, 5818, +5403, 4664, 3914, 3246, 2943, 3133, 3341, 3177, 2857, 2668, 2372, 1776, 1077, 234, -1201, -3052, +-4559, -5780, -7146, -8408, -9204, -9905, -10826, -11406, -11351, -11023, -10863, -10655, -10308, -9909, -9398, -8649, +-7732, -6811, -5764, -4720, -3600, -2202, -398, 1358, 2572, 3563, 4538, 5117, 5282, 5673, 6486, 7219, +7724, 8197, 8455, 8123, 7311, 6527, 6011, 5585, 5188, 4834, 4543, 4446, 4763, 5165, 5140, 4679, +4020, 3210, 2513, 2444, 2720, 2768, 2600, 2488, 2320, 1886, 1379, 890, -118, -1736, -3294, -4552, +-5979, -7369, -8335, -9047, -9965, -10822, -11143, -10990, -10855, -10697, -10399, -10091, -9712, -9096, -8295, -7398, +-6375, -5282, -4263, -3083, -1417, 362, 1792, 2980, 4215, 5198, 5571, 5854, 6522, 7268, 7922, 8566, +9143, 9246, 8690, 7887, 7244, 6720, 6308, 5939, 5527, 5211, 5266, 5648, 5881, 5799, 5359, 4602, +3643, 3149, 3214, 3304, 3221, 3185, 3162, 2823, 2357, 2052, 1408, 115, -1403, -2715, -4193, -5794, +-6998, -7811, -8728, -9782, -10468, -10666, -10715, -10641, -10395, -10158, -9858, -9406, -8834, -8123, -7233, -6183, +-5207, -4281, -3006, -1329, 201, 1474, 2888, 4162, 4802, 5132, 5614, 6241, 6880, 7548, 8287, 8791, +8664, 8023, 7268, 6574, 6065, 5682, 5271, 4734, 4473, 4628, 4916, 5115, 5057, 4563, 3632, 2784, +2507, 2560, 2513, 2563, 2616, 2442, 2018, 1804, 1521, 661, -674, -1967, -3331, -4964, -6416, -7393, +-8265, -9361, -10243, -10744, -11031, -11122, -11000, -10792, -10559, -10219, -9732, -9154, -8393, -7347, -6310, -5451, +-4339, -2837, -1283, 6, 1422, 2988, 4044, 4631, 5106, 5674, 6264, 6905, 7749, 8573, 8925, 8689, +8105, 7368, 6778, 6392, 6013, 5445, 5016, 4917, 5057, 5350, 5615, 5489, 4793, 3831, 3222, 3030, +2929, 2925, 3084, 3077, 2737, 2497, 2429, 1955, 895, -220, -1387, -2915, -4583, -5735, -6676, -7732, +-8760, -9532, -10049, -10379, -10433, -10331, -10224, -9996, -9587, -9172, -8646, -7774, -6799, -5980, -5093, -3730, +-2243, -967, 365, 1984, 3375, 4271, 4883, 5403, 5857, 6333, 7122, 8067, 8814, 9033, 8736, 8003, +7235, 6750, 6384, 5815, 5222, 4894, 4796, 4869, 5170, 5421, 5102, 4219, 3419, 2950, 2628, 2494, +2696, 2819, 2615, 2359, 2267, 2047, 1369, 451, -524, -1917, -3634, -5071, -6164, -7245, -8309, -9262, +-9999, -10579, -10863, -10900, -10876, -10730, -10417, -10079, -9736, -9075, -8081, -7210, -6448, -5321, -3927, -2691, +-1471, 42, 1636, 2892, 3739, 4427, 4994, 5456, 6084, 6942, 7913, 8573, 8767, 8354, 7621, 7025, +6632, 6144, 5563, 5108, 4814, 4642, 4800, 5252, 5387, 4846, 4041, 3396, 2837, 2479, 2553, 2798, +2788, 2597, 2596, 2538, 2077, 1406, 671, -422, -1930, -3488, -4742, -5907, -7024, -8023, -8891, -9604, +-10083, -10361, -10520, -10511, -10239, -9891, -9644, -9191, -8372, -7567, -6884, -5905, -4589, -3347, -2231, -904, +700, 2196, 3369, 4351, 5101, 5561, 5950, 6652, 7589, 8500, 9097, 9148, 8571, 7855, 7342, 6938, +6365, 5833, 5400, 5005, 4868, 5255, 5696, 5560, 4960, 4258, 3569, 2907, 2653, 2815, 2857, 2703, +2686, 2746, 2459, 1936, 1421, 657, -573, -2111, -3544, -4786, -5978, -7069, -8081, -8971, -9653, -10157, +-10527, -10696, -10592, -10351, -10201, -9928, -9283, -8512, -7887, -7119, -5992, -4746, -3676, -2533, -1121, 419, +1797, 2951, 3942, 4597, 5006, 5485, 6246, 7223, 8194, 8751, 8591, 8020, 7482, 7002, 6464, 5958, +5518, 4974, 4540, 4586, 5020, 5209, 4950, 4443, 3781, 2946, 2347, 2308, 2440, 2357, 2411, 2571, +2449, 2091, 1722, 1292, 432, -856, -2274, -3604, -4882, -6032, -7083, -8105, -8934, -9538, -10025, -10466, +-10574, -10440, -10312, -10185, -9707, -9015, -8449, -7832, -6808, -5595, -4468, -3389, -2144, -747, 674, 2043, +3236, 4199, 4771, 5217, 5762, 6590, 7650, 8614, 9017, 8747, 8238, 7727, 7132, 6591, 6197, 5669, +5062, 4772, 5016, 5342, 5357, 5169, 4710, 3896, 3028, 2659, 2687, 2633, 2624, 2789, 2833, 2579, +2295, 2047, 1472, 433, -831, -2175, -3539, -4806, -5943, -6986, -7950, -8677, -9298, -9889, -10253, -10293, +-10258, -10273, -10015, -9411, -8858, -8397, -7632, -6506, -5434, -4417, -3319, -2067, -737, 632, 2077, 3290, +4161, 4673, 5091, 5649, 6670, 7821, 8644, 8852, 8593, 8096, 7477, 6879, 6501, 6070, 5343, 4720, +4649, 4891, 5120, 5146, 4965, 4320, 3370, 2696, 2440, 2319, 2241, 2386, 2542, 2435, 2182, 1956, +1632, 962, -40, -1268, -2566, -3842, -5014, -6143, -7274, -8135, -8805, -9506, -10138, -10359, -10433, -10561, +-10476, -9981, -9431, -9032, -8543, -7651, -6569, -5541, -4463, -3331, -2158, -835, 656, 2124, 3139, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-2484, -676, -1873, -6285, -11650, -14657, -14230, -12131, -11121, -12264, -14657, -17049, -18101, -16617, -12752, -7841, +-3469, -665, 1075, 3968, 10255, 19465, 27410, 29294, 24515, 18291, 15228, 15635, 16580, 15271, 10980, 4991, +-721, -4409, -4623, -2296, -608, -1922, -6312, -11612, -14641, -14174, -12237, -11229, -12174, -14651, -17122, -18092, +-16661, -12804, -7807, -3476, -701, 1152, 4107, 10340, 19605, 27420, 29204, 24723, 18392, 15228, 15651, 16595, +15256, 11050, 5008, -849, -4410, -4637, -2437, -629, -1954, -6455, -11612, -14628, -14279, -12198, -11263, -12344, +-14722, -17157, -18108, -16555, -12708, -7810, -3420, -662, 1089, 4084, 10366, 19489, 27545, 29358, 24680, 18382, +15231, 15651, 16610, 15263, 10987, 5073, -716, -4477, -4673, -2395, -629, -1881, -6315, -11664, -14651, -14230, +-12126, -11121, -12979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -10113, -6557, -2595, -1549, -5536, -11584, -13927, -11721, -9364, -9925, -11978, -13031, +-12905, -12584, -12098, -11096, -9850, -8723, -7541, -5833, -3375, 1146, 10486, 19747, 20172, 12272, 5964, 7612, +13082, 15330, 13256, 10529, 9862, 10587, 10782, 9194, 5548, 743, -2645, -2066, 2899, 9610, 13584, 12279, +7016, 520, -5410, -9659, -10661, -7677, -3578, -1767, -2342, -4463, -8488, -13266, -14631, -10605, -4877, -2429, +-3361, -3109, 1495, 7642, 11252, 11193, 9386, 7924, 6913, 4543, -47, -4437, -4747, 341, 6798, 8867, +4646, -3405, -11509, -15371, -12977, -7545, -4174, -3963, -3272, 259, 3066, 1275, -3293, -5587, -4499, -3615, +-5679, -9055, -9823, -6132, 1025, 8905, 13975, 13937, 9994, 4979, -367, -5182, -6019, -1087, 5347, 7502, +5586, 4462, 5896, 6414, 3719, -637, -5203, -9203, -10929, -8852, -3598, 3114, 9535, 13341, 12303, 7441, +2756, 486, -1811, -6765, -11485, -11065, -6135, -2148, -2097, -4480, -7024, -9033, -10417, -10813, -10143, -8934, +-7601, -6187, -4344, -185, 6835, 13004, 13498, 8504, 3240, 1683, 3365, 5964, 8186, 10356, 12030, 9856, +1683, -6637, -7698, -2475, 1766, 1036, -2551, -5941, -8546, -10307, -10456, -9643, -9097, -9203, -9735, -10095, +-10015, -9458, -8271, -6313, -3937, -1736, 141, 1616, 2126, 1863, 3212, 8108, 15347, 20093, 18726, 13288, +8872, 7902, 8814, 9589, 10178, 10626, 7883, -331, -8113, -8475, -3167, 607, -137, -3079, -5669, -7606, +-9013, -9267, -8441, -7133, -4872, 1727, 11012, 14044, 8088, 379, -1033, 4707, 11868, 15730, 16362, 15173, +12827, 9916, 5517, -742, -6207, -7371, -4521, -2401, -4461, -9455, -13626, -14793, -13375, -10936, -8634, -7481, +-7979, -8937, -8498, -6235, -3419, 287, 7213, 15357, 17727, 12536, 6018, 3546, 2944, 1632, 3686, 11217, +18042, 17427, 10624, 1697, -7747, -13079, -9891, -1504, 3270, 839, -4828, -9121, -11416, -12439, -11595, -9125, +-7219, -7213, -5517, 3127, 11050, 10134, 4466, 3700, 8840, 14092, 16128, 16370, 15745, 12609, 3957, -7219, +-10382, -3641, 3982, 4363, -1427, -7907, -12499, -14967, -14308, -10831, -7723, -6565, -6727, -7709, -9186, -9272, +-6933, -3501, -183, 4665, 13118, 18884, 16332, 8790, 4976, 7718, 12528, 14858, 14962, 10999, -1089, -11223, +-10309, -2335, 1693, -544, -3694, -4446, -1920, 5646, 10932, 8033, 921, -1794, 1882, 7152, 8241, 1039, +-9850, -13258, -7175, 123, 1902, -493, -3071, -4446, -4189, 2146, 11649, 13744, 7210, -752, -8351, -15939, +-17395, -10825, -2791, -697, -4770, -9172, -10229, -9637, -10017, -8280, -384, 13096, 19776, 15444, 7248, 3842, +6024, 10348, 13181, 9817, -2177, -11631, -10861, -4903, -2100, -1935, 3920, 13212, 14468, 3671, -13431, -23101, +-18033, -6349, 4098, 15081, 19682, 12224, -1845, -15659, -23004, -19703, -8100, 2193, 3133, -2720, -7647, -8992, +-8729, -6667, -1029, 10083, 21268, 21504, 10012, -2933, -6394, -1627, -1351, -8202, -9319, -2551, 1690, -1505, +-7681, -10674, -6247, 8241, 21080, 21833, 12473, 3811, -3408, -13171, -17502, -10275, 5658, 20236, 20860, 7001, +-14547, -30631, -29197, -13167, 1959, 6666, 2983, -3527, -8910, -12183, -12282, -7831, 3311, 17141, 20168, 10410, +-1791, -6249, -5529, -8861, -10891, -4577, 5916, 8532, 2051, -5823, -9155, -8561, -1101, 13554, 21976, 17104, +6440, 638, -3697, -13384, -18459, -11015, 2786, 14070, 16814, 7751, -12177, -27734, -24249, -6125, 8198, 10062, +4345, -1773, -7529, -12419, -13167, -7225, 6617, 18636, 16958, 5194, -4573, -7869, -11471, -14536, -8755, 4271, +13050, 10728, 1857, -5373, -7645, -6803, -330, 13468, 21686, 16433, 4914, -1533, -6327, -15339, -18447, -9125, +4898, 15153, 17880, 10520, -7509, -22959, -20797, -4407, 8540, 9640, 3632, -3251, -9895, -14770, -15397, -10633, +142, 13672, 17504, 9890, -711, -7167, -12175, -13375, -5539, 7064, 14204, 10816, 1493, -6481, -9516, -8886, +-3231, 10209, 19968, 16294, 4383, -2825, -5557, -12557, -16695, -8901, 5547, 16462, 21104, 16216, -868, -19687, +-21671, -6540, 7662, 10060, 4660, -2043, -9027, -14715, -15911, -11641, -3937, 8364, 17679, 15954, 5810, -3639, +-10456, -12773, -6293, 5793, 14230, 12434, 3243, -5825, -10171, -10249, -6605, 5120, 18065, 19650, 9798, 550, +-3031, -8751, -13971, -8716, 5776, 19876, 25318, 18099, -1049, -20411, -22983, -8917, 5238, 8496, 3941, -2730, +-9782, -15451, -16499, -12550, -5005, 8016, 18477, 17301, 7277, -1287, -4615, -8025, -8600, -1681, 9061, 12852, +6426, -4092, -10742, -12209, -10211, -612, 14073, 19998, 12712, 2296, -2294, -7531, -14409, -12071, 1892, 18716, +25732, 17472, -3190, -22214, -24635, -11353, 2858, 7243, 3736, -2231, -8515, -13683, -14601, -10825, -4049, 7747, +18654, 18698, 8888, -306, -2257, -1673, -5387, -6167, 1058, 9134, 7642, -1763, -9659, -11571, -10093, -4267, +9522, 20012, 17468, 6719, -694, -5900, -13439, -14239, -109, 22034, 29790, 18432, 651, -14478, -21947, -17417, +-3807, 7488, 8504, 874, -7757, -13277, -14703, -12384, -6561, 4972, 16535, 16628, 6824, -2121, -3898, -3956, +-8389, -8461, -269, 7878, 6647, -1130, -8430, -11035, -10251, -6098, 6058, 18806, 19832, 9754, 379, -4953, +-12751, -16071, -2393, 21242, 28884, 15834, -4709, -20643, -23695, -14681, -827, 7107, 5939, -665, -7708, -13041, +-15067, -12805, -6874, 5396, 17192, 16760, 5752, -2843, -2905, -337, -4358, -7737, -2799, 5493, 7284, 1653, +-5963, -9564, -9279, -6271, 3692, 16802, 19532, 9998, -524, -5435, -11785, -15939, -3840, 19256, 27996, 14616, +-8692, -23405, -21409, -9787, 1479, 6424, 4592, -1161, -7785, -12771, -14066, -11731, -6511, 4863, 16286, 15653, +4442, -3779, -2885, 1030, -1805, -6787, -4375, 3278, 6736, 2752, -4219, -7797, -8015, -6735, -457, 12442, +18718, 12208, 1305, -3375, -4729, -6255, 2071, 15861, 20970, 12692, -1266, -14521, -18093, -11309, -399, 6052, +4568, -1397, -7708, -12487, -14509, -13190, -9367, -961, 10846, 14444, 6698, -2284, -3453, 482, 267, -5301, +-6241, -161, 5633, 4428, -1877, -6203, -6738, -6271, -3030, 8339, 17669, 14506, 3622, -2469, -1518, 1698, +6215, 11494, 14019, 11518, 2803, -9979, -15677, -10096, -459, 3982, 1990, -2271, -6425, -10571, -13041, -12214, +-9667, -4542, 6430, 14162, 10590, 1336, -2425, 937, 5033, 1184, -5377, -4685, 1994, 5135, 1476, -3565, +-5621, -6071, -4647, 3975, 14916, 15488, 5956, -2172, -2475, 1285, 5310, 9449, 12730, 12408, 4622, -8883, +-15635, -10399, -1209, 2630, 934, -2264, -5755, -9629, -12104, -11641, -9734, -6457, 2534, 12276, 12212, 3917, +-1719, 380, 5421, 3046, -4601, -5529, 1407, 5932, 3205, -1843, -4106, -5076, -4947, 1489, 13723, 17556, +9504, -224, -2363, 1023, 5285, 9531, 13229, 13876, 7022, -6615, -14707, -10742, -1637, 2759, 1592, -1249, +-4549, -8580, -11617, -11550, -9884, -7887, -2633, 8126, 13525, 8484, 795, -307, 4001, 3855, -3413, -5955, +414, 6303, 4662, -671, -3763, -4862, -5086, -83, 12167, 18152, 11596, 782, -2979, 47, 4524, 8803, +13168, 15013, 9376, -4335, -14059, -11865, -3197, 1989, 1660, -947, -3971, -7613, -10759, -11283, -9993, -8353, +-4457, 5711, 13244, 10199, 1955, -983, 3032, 6758, 1302, -5657, -3878, 2896, 5016, 1364, -2771, -4763, +-5381, -2761, 7499, 16644, 14334, 4067, -2499, -1276, 3284, 7791, 12235, 14966, 11574, -1109, -12779, -13048, +-4655, 1480, 1781, -657, -3353, -6895, -10285, -11127, -9871, -8413, -5979, 2266, 11640, 11520, 3835, -1001, +1781, 7224, 5466, -3125, -6221, -1024, 3917, 3140, -663, -3507, -4981, -4218, 3123, 14172, 16300, 8009, +-633, -1955, 1902, 6584, 11053, 14292, 13389, 3876, -9571, -14552, -8479, -582, 1747, -228, -2759, -5809, +-9323, -11145, -10195, -8491, -6813, -1989, 8050, 12759, 7945, 1088, 760, 5898, 8732, 2183, -5519, -4461, +1568, 4158, 1618, -2039, -4325, -4930, -1233, 9494, 16482, 12143, 2256, -2676, -563, 4325, 8922, 12579, +13686, 8649, -4171, -14189, -13013, -4572, 938, 685, -1814, -4453, -7879, -10861, -11005, -9330, -7771, -5159, +3249, 11625, 10666, 3440, -313, 2896, 7822, 4902, -3927, -6295, -830, 3763, 2674, -1174, -3932, -5237, +-4027, 4240, 14744, 15546, 6632, -1590, -2265, 2238, 7216, 11290, 13700, 11969, 1697, -11355, -15219, -8260, +-432, 1417, -675, -3041, -6205, -9881, -11445, -10235, -8581, -6927, -1213, 8779, 12030, 6198, -143, 519, +5650, 5766, -2288, -6847, -2373, 3420, 3559, -194, -3269, -4893, -4757, 1697, 13433, 17241, 9613, -117, +-2713, 976, 5776, 9896, 13144, 12929, 3594, -10233, -15397, -9081, -1109, 889, -1117, -2967, -5376, -8958, +-11154, -10340, -8821, -7727, -4209, 5670, 12358, 9095, 1752, -103, 4068, 8333, 6916, 1616, -2737, -3069, +-446, 1557, 621, -2153, -4331, -2502, 6079, 14680, 14158, 5640, -1620, -2063, 2057, 6522, 10236, 12780, +11240, 1401, -11059, -14903, -8488, -975, 842, -1117, -3055, -5585, -9237, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1065, -680, -692, -574, +-589, -753, -975, -1149, -1096, -1045, -987, -1038, -982, -829, -539, -320, -141, -22, 146, 211, +183, 55, 55, 209, 521, 758, 823, 677, 478, 357, 408, 451, 478, 564, 768, 942, +992, 914, 773, 589, 466, 496, 544, 393, 55, -257, -385, -350, -214, -75, 12, -45, +-201, -372, -458, -461, -453, -566, -778, -967, -1005, -965, -977, -1060, -1116, -1063, -881, -632, +-325, 7, 345, 599, 657, 420, -37, -498, -768, -834, -826, -876, -1096, -1562, -2184, -2698, +-2872, -2585, -1756, -458, 788, 1247, 788, 136, 52, 561, 1254, 1806, 2184, 2454, 2625, 2744, +2771, 2602, 2315, 2013, 1753, 1562, 1461, 1448, 1343, 957, 380, -80, -299, -458, -773, -1065, +-1005, -531, -57, 50, -153, -350, -415, -521, -705, -801, -682, -428, -211, -211, -516, -892, +-894, -418, -37, -347, -1249, -2222, -2832, -3013, -3003, -3227, -3983, -5153, -6223, -6508, -5301, -2323, +1983, 6448, 9550, 10117, 8328, 6163, 5379, 5745, 5682, 4392, 2620, 1320, 471, -488, -1552, -2265, +-2471, -2469, -2648, -3195, -3855, -3961, -3096, -1824, -1149, -1373, -1988, -2623, -3502, -4616, -5316, -4926, +-3608, -2313, -1721, -1776, -2182, -2774, -3369, -3701, -3719, -3648, -3802, -4061, -3379, -289, 5672, 12253, +15207, 12868, 8620, 6576, 7080, 7680, 6909, 5581, 4785, 4356, 3585, 2051, -292, -3074, -5543, -7206, +-8365, -9587, -10827, -11422, -10956, -9625, -7756, -5679, -4056, -3532, -4298, -5689, -6349, -5364, -2771, 1355, +7519, 15252, 20816, 19905, 14379, 10331, 10651, 12757, 13014, 10296, 5989, 2088, -196, -914, -1300, -2439, +-4261, -5657, -5853, -4923, -3563, -2356, -1277, -30, 1433, 2459, 1842, -982, -5342, -9585, -11170, -8519, +-3928, -1421, -2091, -4097, -5846, -7007, -7471, -7179, -6591, -5984, -2373, 8844, 19391, 17590, 7879, 3225, +6745, 10079, 6874, -171, -4838, -4283, 115, 3804, 3724, 554, -2751, -4616, -4709, -3935, -5357, -9897, +-13108, -11687, -7874, -5626, -6029, -6798, -4581, 4447, 16851, 22047, 17029, 10230, 9260, 11437, 11316, 9514, +8837, 8360, 6559, 4228, 2237, -98, -2408, -3628, -4414, -5984, -7836, -8312, -7025, -3439, 3918, 12629, +15340, 9887, 3341, 2277, 5677, 9036, 9502, 5548, -2489, -9623, -9303, -3180, 730, -1383, -5964, -9071, +-10769, -12122, -12291, -11062, -10482, -11382, -12558, -13231, -13934, -14315, -12669, -4928, 9260, 18319, 15809, 9721, +10175, 16396, 21274, 19503, 9089, -2892, -5238, 1358, 5510, 1423, -5677, -9492, -10643, -11311, -10376, -7572, +-6440, -9235, -12851, -12611, -8648, -4210, -272, 5125, 12536, 18179, 17689, 13161, 10986, 12871, 11835, 3772, +-3930, -3421, 2416, 7337, 9550, 7032, -1988, -12619, -15925, -11412, -6372, -6035, -8900, -9106, -52, 11450, +13173, 6959, 3265, 5669, 9504, 11888, 13786, 15227, 12453, 3268, -5871, -5722, 483, 2439, -2907, -10003, +-14698, -17601, -18722, -17283, -15086, -14068, -13851, -13123, -10127, -5475, -1554, 1229, 4563, 8789, 12289, 14143, +15171, 16089, 17137, 18389, 18999, 17890, 11732, -2595, -15668, -15880, -7378, -3477, -7488, -12485, -14468, -15708, +-17370, -17895, -16804, -15023, -13617, -12397, -10129, -5198, 829, 3908, 2429, 201, 2300, 9330, 16918, 20773, +20647, 18310, 15194, 11870, 6954, -637, -6780, -6392, -3018, -3472, -7849, -8197, 2547, 13355, 10485, -670, +-5586, -1012, 2895, -3653, -13438, -12599, -3389, 2509, 2681, 7050, 16792, 19813, 11583, 2371, -143, -2761, +-11974, -17480, -11936, -4412, -4633, -10215, -14123, -14955, -14728, -10119, 1859, 11966, 11041, 4250, 1741, 3384, +-120, -9071, -11571, -2328, 13534, 23736, 19163, 6967, 481, 3701, 10066, 13004, 11429, 3054, -12988, -24518, +-21804, -10989, -4757, -6778, -11588, -15068, -17757, -19919, -19440, -15658, -11041, -8053, -6385, -6299, -7703, -7410, +-3555, -2093, -4266, -4165, 2, 3265, 2572, 148, -1572, 1721, 14718, 25479, 21810, 10636, 5430, 8549, +13760, 17376, 20093, 22020, 21085, 13108, -2038, -12125, -9013, 871, 5382, 1597, -3139, -1269, 5137, 6642, +-3812, -18629, -20939, -11523, -4056, -5432, -10767, -13957, -13780, -12402, -11019, -9021, -7206, -7070, -8055, -7952, +-6470, -3658, 0, 2066, 423, -2993, -4722, 609, 15035, 23469, 18583, 9482, 8063, 13241, 17045, 17757, +17103, 7940, -10691, -18238, -8963, 2149, 2096, -4225, -9668, -13471, -16100, -15416, -11379, -7617, -6246, -6324, +-7010, -8660, -8915, -3993, 10706, 24573, 23448, 12644, 6982, 10167, 15527, 18445, 17369, 8436, -3240, -4195, +8073, 21227, 22129, 14766, 8131, 4729, 3815, 5911, 9451, 9928, 6566, 3837, 3746, 3505, 3054, 3895, +3565, -6491, -22382, -25614, -11729, 9152, 13541, -8416, -29472, -29444, -17404, -10419, -10293, -11878, -14161, -17507, +-15597, -5032, -393, 5087, 12813, 14869, 7383, 997, 2532, 8622, 13735, 16342, 18384, 17864, 11223, -6314, +-17099, -11626, -572, 1862, -4157, -11349, -15184, -16032, -14947, -13183, -12516, -11145, -9787, -9031, -1610, 13493, +19296, 12606, 5924, 7562, 13803, 18058, 18964, 17777, 17215, 16482, 11646, -524, -8930, -5503, 3164, 3867, +-5097, -14224, -17041, -15436, -13912, -13168, -12820, -13584, -15353, -14990, -12528, -10129, -7398, -3699, -1340, -1028, +-115, 1955, 3026, 2504, 1980, 4187, 10059, 7640, -1083, -4873, -844, 1743, -1469, -4623, -3762, -2290, +-3321, -4175, -4457, -403, 13392, 24901, 21988, 12092, 9172, 13544, 17422, 18460, 19647, 21107, 18830, 7345, +-9527, -14438, -6559, 2078, 1375, -5722, -11492, -13952, -15139, -14705, -12899, -11278, -10918, -11626, -12425, -9749, +2827, 15277, 15633, 8368, 6483, 12274, 17472, 17288, 16114, 16895, 16580, 14158, 4981, -9237, -14952, -8763, +-3741, -9000, -17505, -20904, -20351, -19619, -18556, -17326, -16856, -16575, -15401, -13481, -11737, -9671, -6836, -3988, +-1723, 337, 1920, 2419, 1330, 405, 2965, 6360, 4598, 1879, 2381, 4510, 3822, 735, -927, -201, +1325, 2426, 2703, 2308, 7194, 19752, 26317, 20700, 12994, 13408, 18727, 21737, 21741, 21867, 22377, 20889, +12773, -3290, -11737, -6423, 2804, 2784, -4994, -11558, -14365, -16152, -16672, -14972, -12825, -11770, -12072, -12145, +-7282, 6216, 15990, 14264, 8176, 8408, 14226, 18349, 18210, 17268, 17076, 16149, 14599, 7932, -6430, -15290, +-10764, -4061, -6821, -14773, -18835, -18334, -17659, -17349, -16410, -16071, -16061, -15182, -13493, -12319, -10961, -8592, +-5909, -3946, -2315, -821, -27, -551, -1597, -1448, 194, 2051, 3263, 3391, 2522, 846, -1073, -2197, +-1723, -229, 1131, 1630, 2091, 8471, 21726, 27660, 21902, 14694, 15368, 20579, 23537, 23784, 23789, 23448, +21841, 17102, 2882, -10500, -9603, 418, 3590, -3454, -11450, -14607, -15371, -15877, -14909, -13113, -12332, -13269, +-13944, -11074, 657, 12888, 14433, 8469, 5914, 9671, 14257, 15494, 14859, 14884, 14635, 12536, 3615, -9696, +-14254, -7652, -2209, -6566, -14912, -19034, -18887, -18247, -16744, -13531, -10565, -8186, -5528, -3656, -2950, -2920, +-2933, -3358, -7274, -9653, -5105, 1282, 2048, -2010, -5528, -6072, -4805, -3502, -3338, -4502, -6254, -8134, +-9026, -8217, -6261, -4205, -2917, -2917, -1572, 9618, 23395, 24875, 16479, 12662, 17323, 22502, 23836, 24119, +24413, 22934, 19432, 7950, -8474, -13125, -3998, 3749, 118, -8491, -14005, -16137, -16502, -15308, -13397, -11891, +-11840, -13125, -11752, -730, 12989, 15912, 10175, 6846, 10013, 14748, 16877, 16468, 15827, 15428, 14806, 10094, +-2250, -12856, -11697, -4543, -4351, -12299, -19400, -20791, -19065, -15892, -11498, -7249, -3762, -3341, -7420, -12576, +-11213, -4492, -3144, -7284, -6861, -1189, 1559, -1524, -5515, -6861, -6687, -5989, -4969, -5165, -6758, -8209, +-8917, -9351, -9172, -7652, -5150, -3411, -3706, -4243, 3489, 19359, 26203, 20136, 13521, 14798, 19677, 22046, +22109, 22265, 22202, 20869, 14693, -1272, -13045, -9774, 559, 2517, -4621, -11767, -14529, -15350, -15675, -14315, +-12009, -10611, -11457, -11404, -3681, 10331, 16147, 11555, 6544, 8585, 14491, 18203, 18450, 17510, 16905, 15378, +8101, -5009, -11452, -7015, -1010, -3789, -13047, -20084, -21668, -20099, -16459, -8801, 370, 2955, -3832, -9499, +-4089, 6586, 9033, -2613, -14423, -11734, -73, 5712, 2053, -3240, -3117, 970, -3013, -10873, -13249, -8932, +-5337, -6697, -10316, -11366, -9419, -7428, -5977, -5422, -5669, -1053, 14201, 24034, 19687, 11886, 12664, 18838, +22015, 21955, 22507, 22597, 19889, 15014, 2121, -11739, -11588, -156, 4981, -1411, -9880, -14176, -16018, -16473, +-14267, -10999, -8968, -9845, -11807, -9202, 4044, 17414, 18929, 12689, 10061, 13644, 17570, 18614, 18200, 18344, +18246, 14887, 3028, -9230, -10525, -3731, -1151, -7486, -15935, -19527, -15728, -4616, 6589, 6763, -3336, -9746, +-4117, 4981, 7922, 3134, -3164, -3618, -4671, -6022, -3845, -617, -1557, -5614, -9502, -11205, -10704, -9560, +-9099, -9761, -10747, -12359, -13279, -12770, -10583, -8040, -6576, -6352, -1882, 12372, 23416, 21121, 12760, 11372, +16870, 20908, 21574, 22282, 22298, 19551, 15063, 3177, -11782, -14403, -4026, 3127, -1330, -10109, -15290, -16908, +-16467, -14113, -10802, -8698, -9330, -10825, -7463, 5586, 17081, 17011, 11044, 9925, 14564, 18966, 20147, 19342, +18651, 15998, 5478, -7751, -8952, -965, 3111, -2414, -11800, -18425, -20277, -14788, -1128, 6239, -1831, -9126, +-3721, 4696, 6057, 4019, 6276, 10530, 2650, -12576, -13954, -2408, 4565, 1133, -4684, -9056, -12059, -12745, +-11490, -10991, -11654, -12495, -13171, -13919, -13748, -11283, -8421, -7055, -7136, -3439, 11309, 24083, 21650, 12110, +10618, 15834, 19495, 21194, 23253, 23133, 19619, 15426, 5178, -11069, -16326, -6400, 3275, 781, -8922, -15859, +-17442, -16497, -14526, -11505, -9267, -9812, -12329, -9756, 3878, 16389, 16769, 11225, 9991, 13954, 18049, 19571, +19008, 17976, 12374, -1867, -10807, -5276, 3479, 2678, -5508, -13410, -18480, -19527, -13287, -5669, -4923, -2202, +4921, 6040, -2048, -5354, 3830, 14063, 10510, -6302, -14783, -7085, 3101, 3684, -685, -4308, -7756, -10333, +-10240, -9489, -10878, -11896, -11936, -12354, -13196, -11601, -8512, -6571, -6478, -7282, -4185, 10419, 23947, 23011, +14453, 11780, 15255, 18871, 21022, 22411, 22304, 20231, 16918, 7368, -9235, -16540, -8504, 1716, 829, -8018, +-15076, -17253, -17171, -15950, -12820, -9920, -10069, -12395, -9754, 2524, 14703, 16630, 12180, 10154, 13282, 17527, +19438, 19012, 15532, 2892, -9640, -7826, 3248, 6838, -244, -8680, -14017, -18523, -21186, -18805, -11729, 1121, +12286, 10059, -3288, -9320, 95, 12105, 15245, 6022, -7899, -11555, -3943, 3893, 4903, 1186, -2809, -5926, +-8121, -9119, -9719, -10457, -10926, -10989, -10764, -9986, -8726, -7325, -6203, -6244, -7347, -4858, 8789, 23462, +25147, 17507, 12594, 14050, 18220, 21121, 22508, 23127, 20971, 16149, 7781, -6937, -16396, -11215, 178, 2124, +-6607, -15313, -18301, -18266, -17041, -13644, -10389, -10301, -12851, -13292, -6546, 9028, 19732, 17696, 10477, 9449, +14224, 18069, 17659, 9061, -5238, -9461, -740, 7660, 5079, -3638, -9645, -13193, -16993, -18606, -14080, -624, +12589, 12342, 2005, -4815, -1159, 7529, 14242, 15252, 5523, -9182, -13051, -4868, 4369, 5546, 975, -3515, +-6937, -10782, -12810, -11903, -11057, -11727, -11634, -10306, -10109, -10442, -8796, -6619, -6584, -6924, -3797, 8476, +22880, 25920, 18485, 12054, 13445, 18797, 21947, 23048, 23220, 19826, 14337, 7199, -6493, -16252, -11079, 650, +1814, -7783, -16158, -18654, -18357, -16489, -12725, -9981, -10535, -13007, -10870, 1539, 14690, 16200, 10054, 7846, +12097, 17099, 19027, 14667, 395, -10313, -6019, 4976, 8234, 1945, -5410, -10013, -14126, -17855, -16835, -5926, +9628, 13128, 4432, -3426, -2552, 3870, 10888, 15340, 15602, 7652, -7242, -14791, -8199, 2857, 5800, 912, +-4538, -8857, -13236, -14995, -13589, -12936, -13110, -11896, -10641, -11417, -11613, -9981, -8711, -7912, -6407, -3434, +7771, 23028, 26392, 17530, 10142, 12022, 18183, 22287, 23797, 22739, 18247, 13140, 7791, -4480, -15265, -11553, +-211, 1947, -6947, -16280, -19369, -18251, -15948, -13030, -10764, -11107, -13337, -8829, 6125, 15638, 12422, 6891, +8582, 14174, 17921, 18654, 11568, -4142, -11717, -4233, 5765, 6281, -549, -6705, -10971, -15169, -18387, -15523, +-2056, 10628, 8398, -226, -2151, 1799, 6186, 10459, 13947, 14196, 6649, -6914, -13682, -7360, 2676, 5095, +173, -5329, -9829, -13662, -14602, -13327, -13188, -13178, -11697, -10762, -11470, -11195, -9923, -9300, -8108, -6040, +-3658, 5898, 21637, 26674, 18422, 10182, 11377, 17878, 22696, 24167, 22629, 18470, 13846, 9247, -1703, -13161, +-11765, -1577, 1847, -5649, -15033, -18576, -17540, -15537, -13183, -10878, -10759, -12679, -8340, 6528, 15885, 12556, +6992, 8595, 14179, 18105, 17774, 7695, -7055, -10318, -1108, 6317, 4565, -1748, -6722, -10686, -14710, -17059, +-12841, -1073, 6231, 4848, 2895, 3444, 3885, 4901, 9308, 13884, 15282, 12150, 1146, -11510, -12037, -1620, +5858, 3429, -3079, -8784, -12672, -14519, -14529, -13917, -13017, -11908, -11150, -10981, -11195, -11054, -10147, -8590, +-6853, -5082, -720, 10580, 23075, 24815, 16804, 10411, 12236, 18359, 22812, 24124, 22648, 18301, 13564, 8263, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -4776, -4705, -3061, -1009, -333, -1520, -3415, -4240, -2591, 1596, 6169, 7934, 5761, 1986, -66, +435, 1729, 2311, 2551, 3369, 4676, 5610, 5519, 4397, 2781, 1457, 1280, 2570, 4078, 3658, 992, +-1654, -2277, -1380, -783, -1238, -2252, -3292, -4077, -3932, -2214, 396, 1976, 1298, -783, -2555, -3069, +-2163, -5, 2430, 3820, 3719, 2584, 885, -963, -2444, -3282, -3652, -3852, -4118, -4529, -4696, -3826, +-1647, 675, 1833, 1916, 1777, 1472, 679, -81, -74, 572, 1392, 2737, 4889, 6770, 6920, 5440, +3794, 2921, 2503, 1918, 837, -1054, -3723, -5929, -6203, -4990, -4480, -5714, -7448, -8282, -8161, -7370, +-5788, -3735, -2514, -3129, -4720, -5349, -4046, -1387, 1651, 4156, 5420, 5728, 6081, 6746, 7079, 6472, +4565, 1777, -355, -580, 714, 2187, 2621, 1335, -929, -2256, -1727, -595, 15, 963, 3644, 6968, +7943, 5427, 1380, -1613, -2277, -502, 2734, 5464, 6075, 5120, 4650, 5394, 6348, 6659, 5980, 3689, +-153, -4109, -6439, -6915, -6405, -5561, -4759, -4953, -6866, -9196, -9496, -7150, -3859, -1084, 815, 1750, +1947, 2563, 4470, 6785, 7613, 5877, 1878, -2471, -4257, -2128, 1734, 3804, 3077, 1252, -529, -2601, +-4845, -5805, -4660, -2781, -2325, -3599, -5217, -6031, -6125, -6298, -7080, -7778, -6229, -766, 6802, 11743, +11350, 8191, 6788, 8591, 11283, 11816, 8974, 3719, -1853, -5852, -7247, -6033, -2711, 2068, 6711, 8592, +6462, 2374, 15, 905, 3341, 4379, 2470, -1637, -5531, -6646, -4365, -679, 1797, 1826, -783, -5568, +-10628, -13109, -11903, -8921, -6719, -6009, -5975, -5565, -4290, -3285, -4419, -7303, -8845, -6765, -1794, 3962, +9332, 13595, 15115, 13239, 10386, 9692, 11611, 13924, 14388, 12558, 9509, 6764, 5500, 5624, 5864, 5103, +3348, 825, -2881, -7767, -11848, -12072, -7233, 391, 6266, 7264, 3871, -919, -4373, -5567, -4854, -2625, +338, 2734, 3542, 2349, -296, -3282, -6023, -8397, -9901, -9902, -9101, -9289, -10917, -12261, -11238, -7684, +-3549, -735, 535, 1369, 2764, 4410, 5311, 5408, 6486, 10536, 16212, 19033, 16256, 9356, 1695, -3282, +-2174, 6201, 17327, 21804, 15373, 3823, -5016, -9383, -11431, -12599, -12562, -11360, -10744, -12049, -13644, -10947, +-1933, 7883, 11001, 6444, -1172, -7591, -11152, -11305, -7457, -1050, 5398, 10885, 14524, 13910, 8136, 745, +-3132, -1513, 3932, 9969, 13008, 11215, 6270, 1835, -550, -2180, -4276, -6840, -9433, -11755, -13269, -13323, +-11733, -9252, -7126, -5982, -5146, -3405, -682, 2485, 5667, 8021, 9019, 9358, 9819, 10458, 10913, 10834, +9713, 6478, 298, -6939, -11024, -9329, -4504, -1743, -3095, -6479, -9387, -11021, -11500, -11261, -10958, -11094, +-11297, -8935, -153, 11508, 16353, 12368, 7786, 8821, 13357, 16711, 17548, 16242, 11955, 4061, -4642, -8435, +-5330, -849, -1213, -6483, -12359, -15693, -15839, -12973, -9319, -9131, -12109, -14273, -13981, -12412, -9950, -2555, +12243, 23128, 19881, 9826, 5786, 8008, 8840, 7521, 7699, 7308, 3174, -966, -1311, -345, -1836, -4977, +-7306, -7961, -7090, -6362, -8004, -11225, -12977, -11392, -6119, 488, 2558, -2941, -10899, -12925, -7063, 1553, +9174, 17066, 23646, 21582, 8081, -7076, -11655, -4320, 5064, 7719, 3168, -3695, -8582, -9839, -8068, -5148, +-2571, 207, 8810, 19460, 19561, 10187, 5257, 10927, 19808, 23448, 16520, -275, -11535, -7997, 1923, 5353, +1448, -2843, -4991, -6103, 127, 12441, 15504, 4106, -14728, -26385, -20976, -6677, 1598, -251, -6464, -10214, +-8965, -5951, -2405, -1535, -3861, -5654, -4642, -859, 2493, 1627, -588, -1021, -1470, -3531, -5714, -6013, +-5342, -369, 12926, 22025, 17837, 9610, 8848, 13967, 17928, 18315, 14380, 1374, -11021, -8351, 4128, 10326, +4974, -4203, -9673, -10500, -3338, 12247, 20695, 13648, 1545, -1297, 4543, 8842, 3978, -8481, -15712, -12075, +-4172, -1689, -5378, -9353, -9682, -8828, -9165, -8852, -7021, -5247, -4436, -4026, -4587, -5262, -5151, -5568, +-6731, -7194, -6041, -5137, -5960, -5761, 1115, 16431, 27337, 24703, 14942, 9732, 12261, 15476, 7274, -6954, +-9259, 223, 6601, 3294, -3183, -6925, -7945, -8091, -7907, -6215, 3171, 16411, 19188, 10037, 2385, 4282, +10037, 11927, 3636, -12008, -18249, -9526, 975, 3007, 600, -719, -1747, -3910, -5858, -7080, -7516, -7482, +-8144, -9309, -8209, 220, 9368, 4252, -14659, -26070, -18956, -4893, 745, 651, 9026, 23706, 26662, 16744, +9174, 10660, 14378, 7296, -8694, -15483, -8202, 648, 550, -5342, -10012, -11999, -12953, -13151, -12606, -11251, +-4513, 11030, 21611, 16898, 7136, 5600, 10333, 12649, 5980, -8868, -16366, -9508, 1894, 5612, 1950, -2014, +-3148, -4670, -7361, -8393, -7457, -7053, -8602, -10340, -9882, -4237, 6368, 9150, -7917, -26739, -25833, -10117, +391, 1306, 7642, 23355, 29682, 20836, 11184, 10656, 14054, 7245, -7858, -13681, -6869, -129, -1607, -7059, +-11083, -13332, -13682, -12647, -12251, -11802, -6857, 7899, 22381, 22408, 12495, 7351, 10391, 13914, 10822, -2347, +-14520, -13453, -2480, 5116, 3835, -1380, -4229, -5825, -8437, -9686, -8328, -6629, -7337, -9299, -9542, -2482, +10270, 9625, -11315, -28600, -23918, -7709, 1049, 49, 1722, 14951, 27783, 26690, 17087, 11824, 13866, 13670, +744, -12973, -12654, -2944, 1525, -2722, -8912, -12259, -13303, -13617, -12943, -11392, -8984, -386, 16667, 26115, +19647, 10022, 8956, 12601, 13236, 6077, -7550, -14191, -8107, 1435, 3852, 224, -3282, -5151, -7410, -9188, +-8955, -8130, -8018, -8859, -9362, -6808, 655, 9943, 11545, -3663, -23379, -25586, -10196, 3498, 6423, 11326, +24990, 30313, 20691, 10836, 11636, 16900, 11767, -4922, -14778, -10507, -2586, -1737, -6492, -10697, -12783, -13560, +-13377, -13054, -12275, -6876, 8369, 23091, 22938, 13206, 8796, 12316, 15549, 12004, -842, -13043, -13127, -3406, +4463, 4045, -1450, -5354, -7284, -9372, -9957, -8054, -6014, -6862, -9366, -9923, -4266, 9492, 18210, 7395, +-17482, -28900, -17282, 97, 6482, 9051, 20899, 30374, 24767, 13256, 10560, 15896, 17805, 5242, -10554, -13609, +-6357, -1724, -4089, -8524, -11615, -13317, -14214, -14388, -14191, -11825, -2047, 15650, 25520, 20201, 11021, 9421, +13249, 14583, 7796, -6569, -14211, -8543, 2041, 5784, 1485, -4113, -6755, -8445, -9866, -8988, -6939, -6566, +-8766, -10346, -5741, 8203, 18268, 10302, -13425, -28843, -21990, -4696, 4596, 6144, 15081, 27824, 27400, 15877, +9836, 13634, 19314, 14530, -2644, -15302, -13520, -4743, -1626, -5330, -10071, -12809, -14695, -16013, -15907, -14190, +-8178, 7216, 23128, 24369, 14358, 7834, 9682, 13440, 11935, 696, -11615, -12323, -3192, 3879, 2873, -2645, +-6425, -7945, -9245, -9322, -7934, -7225, -8790, -10868, -8213, 4616, 17855, 15733, -4887, -26228, -27491, -11588, +2624, 6062, 10369, 23028, 28491, 19357, 9673, 10453, 17215, 19445, 7773, -10684, -18199, -11152, -2601, -2561, +-7802, -11955, -14208, -16081, -16782, -15630, -11848, -909, 16933, 26072, 19727, 9628, 7373, 11010, 13176, 8268, +-4539, -12751, -9099, -167, 3518, -42, -5224, -7514, -8475, -9522, -9109, -7971, -8490, -10847, -10061, 936, +15655, 17918, 3080, -19324, -29293, -19556, -2677, 5651, 7733, 17220, 27254, 23371, 11718, 8213, 14058, 19983, +15328, -2392, -17127, -16338, -6332, -1796, -5057, -9901, -13201, -16013, -17769, -17375, -14868, -7879, 7618, 23469, +25158, 14993, 7136, 7737, 11828, 12196, 3294, -8922, -11684, -4549, 2555, 2517, -2555, -6275, -7288, -8188, +-8661, -7914, -7714, -9652, -10621, -2523, 12935, 19480, 9802, -10704, -26903, -24996, -9439, 3629, 6986, 12328, +24152, 26921, 16648, 8484, 11136, 18335, 20191, 9034, -10269, -19765, -13251, -3327, -1850, -6649, -11423, -14846, +-17555, -18530, -17069, -12035, 629, 18596, 26391, 18921, 8214, 5600, 9468, 13026, 12611, 4870, -7854, -13686, +-7613, 1349, 2426, -2844, -6475, -7540, -9004, -9923, -9249, -9290, -11001, -9610, 2303, 16793, 16671, -2931, +-25596, -29212, -14495, 658, 5537, 7893, 18671, 26806, 20904, 10336, 9286, 16467, 22197, 18655, 1568, -16357, +-18951, -8445, -1036, -2912, -8131, -11902, -15771, -19333, -19094, -14975, -6336, 10076, 24951, 24689, 13030, 5144, +6571, 11627, 13453, 6788, -5698, -11504, -6726, 408, 1626, -2337, -5664, -6707, -7743, -8695, -8501, -8498, +-10006, -10536, -2553, 13234, 20032, 7385, -17142, -29919, -21451, -4414, 5001, 6280, 12945, 24457, 25189, 14798, +9041, 13366, 20304, 21849, 12485, -7326, -20379, -15746, -3963, -251, -5083, -10764, -14662, -18249, -20035, -17815, +-12014, -1676, 15042, 26523, 22507, 10330, 4219, 7143, 12449, 12543, 3052, -8543, -10899, -4230, 1700, 1026, +-3318, -5742, -6389, -7709, -8755, -8838, -9609, -11031, -7055, 7660, 20047, 14622, -8611, -28290, -26740, -10584, +2264, 4984, 6680, 17719, 26743, 21680, 11719, 10516, 16877, 21582, 18781, 3369, -15227, -19427, -8912, -251, +-1810, -7927, -12382, -16032, -19324, -19107, -14786, -6885, 7793, 23663, 26165, 15222, 5272, 4786, 10134, 13526, +8731, -3466, -10973, -8057, -972, 1588, -1199, -4530, -5742, -6784, -8344, -8911, -9196, -10433, -8955, 3164, +18072, 18797, 1269, -21857, -29837, -18813, -2819, 4788, 5059, 11136, 23066, 24970, 15469, 9547, 13439, 19915, +21327, 13036, -6265, -20390, -16761, -4494, 367, -4056, -10371, -14942, -18673, -20331, -17648, -11210, -532, 15965, +26876, 22184, 9472, 3154, 6428, 12208, 11555, 606, -9498, -9198, -2364, 1409, -279, -3768, -5300, -5738, +-6937, -7840, -8174, -9409, -10380, -3333, 12779, 21209, 10056, -14762, -29603, -23237, -7069, 2902, 3552, 4904, +16479, 26007, 21579, 12231, 11024, 16784, 20992, 18747, 4513, -14531, -20133, -9976, -255, -972, -7787, -13570, +-17555, -20094, -19125, -14221, -5218, 10725, 24908, 24428, 12647, 4007, 4723, 10409, 12261, 3203, -8810, -10708, +-4356, -31, -900, -3763, -5568, -6164, -7017, -8039, -8446, -8902, -9324, -2296, 12992, 20574, 12111, -6903, +-24029, -26291, -14541, -459, 4891, 2764, 7855, 21398, 25389, 16740, 10074, 12725, 18262, 19705, 12725, -4601, +-18800, -17142, -5790, 245, -3428, -10655, -15639, -18649, -20035, -17706, -11550, -972, 14938, 25630, 21820, 10212, +3739, 5950, 11043, 10389, 433, -9375, -9484, -3503, -144, -1340, -4015, -5628, -6236, -7102, -8067, -8467, +-8912, -9324, -1937, 13350, 19933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -325, 1374, 2574, 2630, 2801, 2530, 1550, 589, -513, -1420, +-1413, -793, -43, 635, 905, 809, 399, -458, -1107, -929, 92, 1678, 3192, 4024, 3947, 3370, +2557, 1459, 79, -1201, -2307, -3347, -4083, -4240, -3627, -2205, -236, 1640, 2688, 2745, 2051, 1007, +317, 409, 1128, 2124, 2967, 3299, 2868, 1832, 447, -1229, -3001, -4672, -5819, -6258, -5753, -4085, +-1641, 858, 2644, 3184, 2526, 1380, 38, -1466, -2736, -3430, -3665, -3226, -1926, -135, 1653, 2838, +2947, 1946, 595, -344, -763, -1061, -1460, -1887, -2138, -2167, -1962, -1632, -1315, -920, -56, 1154, +2375, 3221, 3317, 2627, 1585, 672, 224, 552, 1674, 2890, 2945, 748, -3377, -7555, -9565, -8456, +-5212, -1358, 2504, 5828, 6770, 4518, -202, -5382, -8114, -6870, -3380, 1142, 7573, 13304, 12809, 7502, +4122, 3757, 3042, 1871, 1984, 2199, 1196, -2128, -10340, -19345, -18719, -10118, -4941, -2217, 6694, 15975, +15088, 6363, -2421, -8741, -10137, -6638, -3284, -946, 5176, 13553, 14376, 7111, -888, -8478, -15574, -15154, +-8463, -4632, -2962, 3433, 11548, 11749, 3425, -5638, -8970, -7195, -4160, -1482, 3103, 9636, 13037, 10774, +6514, 4426, 4064, 3849, 3431, 2977, 1606, -3130, -11699, -17619, -14324, -7068, -2833, 2273, 10898, 15594, +12161, 5738, 49, -5444, -8961, -7704, -4190, -1753, 1396, 6229, 7794, 3671, -1988, -5290, -6544, -6542, +-4772, -627, 4871, 9181, 10089, 7848, 4481, 1620, 558, 1730, 3969, 4975, 3846, 2420, 1649, 804, +-1497, -6888, -12773, -11339, -743, 9191, 10249, 5616, 399, -7952, -15648, -13374, -5131, -1994, -560, 6636, +13448, 11423, 2389, -7058, -11874, -10487, -6610, -4731, -3481, 1077, 8054, 10507, 4797, -4349, -9962, -9211, +-5683, -3434, -960, 5197, 11837, 12330, 6254, -1706, -7940, -10279, -7724, -1953, 4724, 10308, 11600, 8428, +4546, 1942, 442, 1362, 4573, 6036, 4268, 1683, -952, -3315, -1976, 3592, 6776, 4949, 2748, 2599, +1005, -7172, -18018, -19347, -10689, -5375, -4367, 4288, 16929, 17968, 8527, 2457, -4257, -15646, -17903, -8557, +-2785, 469, 10451, 16654, 10081, 2320, 1160, -1316, -6737, -7574, -3979, -4200, -9167, -11242, -7839, -4558, +-3958, -1936, 3896, 10421, 13618, 12522, 8308, 2103, -5713, -11905, -12069, -7861, -4569, -1287, 4372, 7992, +5333, -116, -3930, -5793, -5292, -1344, 5266, 11660, 14229, 11445, 6749, 2580, -3018, -7975, -6410, -90, +3657, 2534, 396, 674, 3513, 5463, 3944, -1032, -8936, -15456, -13875, -7224, -4207, -3046, 3781, 13525, +15921, 10266, 4436, 1134, -2241, -4174, -1976, 2389, 5184, 4776, 2226, -748, -3755, -5749, -3395, 3148, +5852, -2791, -15277, -16813, -8196, -3619, -4358, -1986, 5924, 14861, 17563, 10250, -3621, -14381, -14255, -7380, +-4234, -2655, 6299, 16217, 14237, 5298, 2040, -766, -9469, -13608, -5571, 3868, 7235, 8316, 8253, 5215, +-725, -8954, -14237, -9747, 3155, 14319, 14510, 7775, 4533, 4820, -1421, -15479, -22062, -13373, -3786, 1326, +10831, 17481, 10664, -424, -8062, -13088, -11249, -1800, 7599, 11284, 7450, -2052, -10422, -13009, -10558, -6001, +2079, 13556, 17741, 10143, 3930, 1742, -8648, -21240, -17272, -6035, -704, 7602, 18253, 15366, 4850, 3130, +5737, 4687, 3303, 4064, 4924, 3401, 1671, -190, -11320, -27368, -24786, -9119, -5565, -10179, -6901, -1662, +-1829, -2882, 5302, 23746, 29630, 14868, 5013, 9036, 8439, 1489, -372, 916, -795, -3523, -4247, -3174, +-2392, -2701, -1322, -4354, -19169, -26888, -13333, -1139, -4188, -5944, -845, 2860, 12947, 25225, 21207, 7063, +-1642, -12059, -16323, -883, 14029, 9694, 808, 570, 2119, 615, -597, 967, 2335, 3068, 42, -13067, +-25259, -16981, -3621, -4068, -7742, -4126, 4767, 18233, 23381, 7592, -14026, -18612, -8976, -3440, -5851, -2448, +12939, 23486, 14747, 3854, 5524, 8545, 4697, 444, 414, 2643, -6021, -23237, -22279, -6040, -2605, -8219, +-5532, 483, 5368, 12541, 10315, -2819, -8070, -1872, 1291, -1304, -1997, 4166, 17423, 24954, 14949, 4853, +6002, 7724, 3259, -8422, -16877, -7072, -755, -14698, -17369, -1963, 1510, -4420, -2383, 4694, 15279, 23852, +14377, -5519, -11563, -4258, -988, -3409, -4084, 3534, 18029, 22965, 11573, 3750, 6794, 8084, 1107, -13884, +-23593, -14514, -2843, -5137, -7417, -2213, 197, -1685, -1314, 7877, 24133, 27228, 11427, -5897, -13814, -12992, +-7228, -4973, -5986, 2693, 18700, 20986, 7851, 2609, 7180, 7769, -365, -15795, -23636, -13488, -3466, -6326, +-7883, -3341, -1897, -3987, -1927, 11433, 27079, 22465, 6689, -3557, -13020, -19141, -12129, -4970, -6117, 1881, +18671, 19616, 5353, 1014, 6231, 6671, -2465, -18211, -24553, -13239, -4417, -7951, -8786, -4008, -2922, -5251, +-1877, 13365, 27216, 19264, 4702, -1132, -11333, -22434, -15927, -5404, -4335, 3863, 18568, 16112, 2413, 721, +5710, 5154, -3537, -18972, -24892, -13057, -4555, -8386, -8832, -4268, -3488, -5459, -878, 15633, 27835, 17395, +3935, 669, -10136, -23816, -17558, -5585, -4919, 2789, 18853, 17461, 2974, 665, 6139, 5854, -3207, -18703, +-24093, -11946, -3870, -7910, -8214, -3597, -2974, -5004, -176, 16220, 28234, 18018, 4870, 1556, -9491, -23178, +-16595, -4510, -3821, 4277, 20265, 18263, 3762, 1738, 7189, 6897, -2496, -18217, -23091, -10726, -2973, -6933, +-7019, -2509, -1926, -3849, 633, 16874, 29323, 19483, 6254, 2596, -8584, -22102, -15408, -3472, -3029, 5162, +21239, 19211, 4712, 2867, 8299, 7714, -1851, -17460, -22153, -9569, -1973, -5978, -5800, -1299, -1028, -3071, +1500, 17484, 29899, 20414, 7194, 3432, -7720, -21223, -14661, -3007, -2488, 6111, 22068, 19329, 4752, 3445, +8848, 8099, -1107, -16437, -21881, -9849, -1945, -5707, -5777, -1337, -630, -2380, 1589, 17023, 29974, 21258, +7664, 3782, -7017, -21524, -15910, -3183, -721, 8390, 22012, 17062, 3816, 3897, 8301, 6941, -1375, -16331, +-22296, -10596, -2304, -5792, -6176, -1880, -994, -2799, 722, 15911, 29237, 21015, 7245, 2902, -7832, -21815, +-16156, -3898, -1626, 7628, 21444, 16477, 2886, 2897, 7458, 6092, -2255, -17061, -22866, -11242, -3070, -6439, +-6777, -2693, -2034, -3609, -710, 13257, 27666, 21792, 7387, 420, -10428, -21725, -15023, -4416, -2633, 7788, +21315, 15093, 1857, 2781, 7104, 5230, -2998, -17562, -23434, -12125, -3952, -7058, -7277, -3280, -2696, -4172, +-1755, 11429, 26439, 22262, 7476, -1555, -12370, -21224, -13878, -4940, -2668, 9134, 21236, 13010, 704, 2758, +6587, 4145, -4020, -18116, -23741, -12627, -4610, -7208, -7357, -3497, -2597, -3892, -1855, 10812, 25877, 22111, +7152, -3155, -13801, -20391, -12393, -4860, -2100, 10849, 21163, 11313, 241, 3222, 6340, 3631, -3754, -17270, +-23582, -13321, -4767, -6670, -7044, -3414, -2384, -3641, -1872, 10375, 25455, 22446, 6801, -5767, -15435, -18000, +-9757, -4855, -1116, 13537, 21644, 9681, 154, 4499, 6803, 3531, -3730, -16994, -22804, -12524, -4462, -6636, +-7116, -3522, -2167, -2966, -1179, 10589, 25723, 23520, 6802, -8233, -16733, -15563, -7598, -4971, -147, 15842, +22085, 8921, 714, 5695, 7359, 3616, -3607, -16501, -22157, -12286, -4485, -6192, -6417, -3106, -1700, -2376, +-806, 10894, 26090, 24143, 6532, -9850, -16863, -13149, -5830, -4789, 1366, 18010, 22086, 7973, 1079, 6273, +6851, 2828, -3653, -16061, -22072, -12423, -4193, -5615, -6115, -2967, -1510, -2228, -732, 10820, 26266, 24660, +5579, -12053, -16887, -10702, -4614, -4714, 3342, 20068, 21303, 6528, 1568, 6916, 6306, 2360, -3151, -15138, +-22086, -13142, -4336, -5311, -6255, -3360, -1620, -2289, -738, 11116, 26397, 24377, 4817, -12935, -16817, -10104, +-4978, -5247, 4115, 20886, 20529, 5416, 1463, 7001, 5824, 1768, -3670, -15809, -22653, -13385, -4301, -5299, +-6446, -3465, -1560, -2335, -895, 10709, 26002, 23856, 3455, -14621, -16760, -8720, -4680, -5347, 5214, 21588, +19514, 4263, 1461, 7025, 5109, 1291, -3383, -15466, -22783, -13482, -4232, -5389, -6708, -3670, -1884, -2765, +-1331, 10394, 25766, 23856, 2868, -15545, -16419, -7512, -4360, -5487, 6023, 22081, 18657, 3614, 1599, 7068, +4913, 1141, -3678, -16019, -23115, -13425, -4156, -5377, -6556, -3549, -1527, -2398, -1167, 10495, 25996, 23712, +1813, -16339, -16110, -7157, -4902, -5900, 6625, 22624, 18191, 3095, 1974, 7492, 4959, 1214, -3734, -16218, +-23143, -13146, -3905, -5339, -6427, -3045, -1222, -2169, -648, 10898, 25874, 23027, 154, -17494, -14995, -5456, +-4506, -5367, 8372, 23506, 17085, 2302, 2634, 7954, 4832, 1300, -3898, -16892, -22997, -12209, -3210, -5080, +-6259, -2896, -963, -2058, -667, 11110, 26091, 22787, -109, -17346, -14035, -4703, -4878, -4784, 10649, 23913, +14953, 1483, 3519, 8135, 4479, 1492, -3803, -17309, -23180, -12053, -3381, -5319, -6181, -2493, -528, -1688, +-190, 11952, 26561, 21873, -2117, -18398, -13284, -3915, -4772, -3385, 13585, 24549, 12903, 427, 4166, 8172, +3736, 1212, -4087, -17996, -23187, -11556, -3352, -5291, -5730, -2267, -675, -1906, -466, 11780, 26664, 21028, +-4107, -18814, -11572, -2716, -4996, -2408, 15515, 24047, 10623, -45, 4936, 7856, 2879, 694, -4675, -18674, +-23250, -11091, -3209, -5826, -6048, -1869, -657, -2220, -129, 12836, 27074, 19995, -5801, -19321, -10957, -3345, +-6188, -1545, 17111, 23338, 9224, 93, 5352, 7273, 2153, 682, -4854, -19210, -23173, -10541, -3222, -6023, +-5763, -1706, -593, -2091, 99, 13142, 26923, 18330, -8267, -19988, -9714, -2557, -6121, -22, 18786, 22435, +7195, -221, 5753, 6931, 1885, 602, -5619, -20455, -23562, -10235, -3058, -6087, -5772, -1644, -836, -2402, +-20, 13106, 26311, 16797, -9457, -19245, -8185, -2197, -6041, 931, 19662, 21721, 5934, -494, 5726, 6200, +1180, 245, -6571, -21094, -22735, -9388, -3184, -6355, -5712, -1593, -944, -2291, 287, 13280, 26286, 16339, +-10112, -18872, -7280, -2299, -6279, 2261, 20704, 20928, 5060, -178, 6201, 6155, 1205, 224, -7296, -21727, +-22011, -8519, -3357, -6556, -5385, -1355, -641, -1834, 585, 13554, 25960, 15020, -11003, -18592, -6825, -2337, +-6019, 3191, 21390, 20621, 4512, -27, 6417, 5826, 1138, 234, -7943, -21852, -21006, -7645, -3364, -6578, +-4978, -1076, -747, -2020, 712, 13880, 25968, 14607, -11246, -18134, -5956, -1958, -5503, 5037, 22565, 19419, +3410, 503, 6920, 5615, 1102, 327, -8409, -22176, -20378, -6819, -3032, -6551, -4882, -969, -873, -2153, +1026, 14426, 26027, 14003, -11658, -17828, -5794, -2213, -5171, 5954, 22817, 18569, 2993, 1230, 7401, 5428, +940, 79, -9298, -22763, -19818, -6420, -3445, -6810, -4626, -757, -837, -1826, 1539, 14965, 25808, 12743, +-12451, -17736, -5402, -2018, -4829, 7064, 23602, 18018, 2261, 1018, 7024, 4641, 758, 63, -9815, -22710, +-18703, -5540, -3405, -6863, -4607, -855, -997, -2136, 1468, 15240, 25780, 12374, -12581, -17314, -5128, -2114, +-4202, 8413, 24004, 17038, 1595, 1404, 7254, 4633, 960, -275, -10934, -23130, -18179, -5365, -3482, -6549, +-4086, -634, -1027, -2156, 1859, 15621, 25477, 11461, -13221, -17284, -4948, -2140, -3407, 9991, 23838, 14969, +575, 1861, 7234, 3841, 534, -436, -11434, -23359, -17904, -5380, -4178, -7081, -4134, -685, -1119, -1786, +2307, 15869, 25082, 10181, -14211, -17078, -4677, -2566, -2866, 11871, 24286, 13767, 120, 2410, 7158, 3411, +854, -313, -12207, -23607, -17055, -4912, -4420, -7178, -3942, -620, -1083, -1650, 2460, 16160, 25143, 9794, +-14456, -16850, -4477, -2583, -2720, 12174, 24300, 13517, 67, 2534, 7197, 3316, 865, -384, -12396, -23647, +-16842, -4808, -4525, -7086, -3886, -636, -1032, -1658, 2589, 16345, 25063, 9436, -14583, -16744, -4375, -2632, +-2617, 12445, 24289, 13176, -19, 2658, 7103, 3284, 880, -515, -12633, -23653, -16631, -4711, -4537, -7129, +-3813, -603, -1110, -1628, 2716, 16571, 25024, 8928, -14837, -16515, -4250, -2726, -2463, 12701, 24228, 12953, +-99, 2755, 7115, 3192, 873, -566, -12888, -23640, -16408, -4656, -4576, -7069, -3756, -597, -1081, -1637, +2870, 16753, 24946, 8561, -15023, -16334, -4150, -2763, -2298, 12951, 24215, 12725, -142, 2831, 7072, 3125, +893, -679, -13099, -23655, -16192, -4557, -4621, -7079, -3644, -572, -1132, -1593, 3023, 17017, 24843, 8235, +-15222, -16200, -3999, -2835, -2191, 13268, 24137, 12469, -168, 2919, 7054, 3053, 894, -749, -13331, -23630, +-15953, -4486, -4678, -7032, -3581, -585, -1135, -1580, 3154, 17142, 24799, 7856, -15394, -16041, -3901, -2902, +-2074, 13339, 24030, 12501, -55, 2823, 6979, 3200, 892, -654, -12804, -23565, -16619, -4814, -4508, -7110, +-3896, -644, -1080, -1656, 2429, 16249, 25128, 9402, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 711, 808, 894, 933, 981, 968, +978, 946, 903, 933, 928, 937, 858, 797, 754, 657, 509, 491, 497, 367, 309, 297, +244, 124, -17, -97, -190, -313, -459, -554, -662, -784, -921, -1052, -1194, -1341, -1457, -1605, +-1695, -1718, -1668, -1562, -1417, -1264, -1063, -863, -681, -512, -377, -257, -161, -78, -49, -45, +-62, -78, -108, -117, -119, -93, -35, 71, 225, 383, 573, 798, 1004, 1224, 1422, 1573, +1670, 1721, 1742, 1727, 1678, 1582, 1461, 1353, 1259, 1162, 1015, 947, 855, 801, 744, 564, +482, 534, 471, 270, 99, -25, -93, -223, -435, -598, -769, -1029, -1383, -1738, -2128, -2497, +-2841, -3182, -3355, -3282, -3025, -2597, -2048, -1489, -973, -519, -240, -62, 25, 60, 125, 204, +274, 335, 338, 244, 17, -308, -719, -1104, -1319, -1269, -946, -386, 291, 992, 1607, 2061, +2367, 2568, 2654, 2678, 2679, 2659, 2584, 2480, 2324, 2139, 1960, 1723, 1461, 1214, 1050, 919, +841, 777, 758, 730, 671, 519, 419, 376, 312, 183, 16, -178, -490, -892, -1426, -2184, +-3176, -4283, -5300, -5885, -5932, -5358, -4284, -2963, -1703, -745, -165, 57, 42, -86, -163, -75, +214, 599, 967, 1184, 1132, 796, 192, -560, -1383, -2196, -2798, -2890, -2414, -1411, -118, 1212, +2314, 2986, 3245, 3258, 3191, 3138, 3148, 3209, 3283, 3356, 3429, 3362, 3232, 2962, 2567, 2072, +1582, 1193, 837, 507, 391, 423, 541, 680, 763, 904, 943, 791, 563, 287, -5, -380, +-1107, -2402, -4300, -6255, -7812, -8694, -8544, -7284, -5250, -3163, -1443, -359, 161, 183, -22, -284, +-313, 18, 613, 1341, 1896, 2143, 1898, 1191, 98, -1193, -2361, -3182, -3718, -3878, -3394, -2218, +-612, 1044, 2435, 3362, 3789, 3734, 3483, 3384, 3495, 3682, 3870, 4040, 4247, 4426, 4433, 4179, +3657, 3023, 2329, 1572, 922, 419, 236, 298, 408, 686, 977, 1140, 1174, 1122, 1069, 1057, +978, 839, 79, -2104, -5252, -8249, -10668, -11882, -11487, -9317, -6234, -3248, -1122, 41, 452, 250, +-255, -670, -614, -11, 1049, 2114, 2896, 3168, 2805, 1800, 183, -1744, -3551, -4684, -5045, -4893, +-4290, -2880, -863, 1183, 2818, 3808, 4268, 4224, 3852, 3526, 3617, 3953, 4366, 4709, 5009, 5281, +5451, 5324, 4754, 3925, 2951, 1999, 1225, 646, 216, 44, 206, 632, 1014, 1213, 1331, 1532, +1679, 1728, 2004, 2469, 1583, -1653, -5951, -9904, -13051, -14783, -14048, -10943, -6764, -3103, -679, 548, +700, 73, -773, -1247, -958, 133, 1699, 3113, 4065, 4282, 3628, 2219, 105, -2313, -4559, -6013, +-6310, -5767, -5013, -3561, -1204, 1252, 3129, 4161, 4492, 4439, 4098, 3716, 3728, 4199, 4791, 5245, +5625, 5954, 6308, 6309, 5794, 4896, 3677, 2453, 1523, 817, 287, 42, 97, 490, 929, 1251, +1482, 1746, 1984, 2269, 2963, 3972, 2778, -1514, -6591, -11398, -15428, -17546, -16265, -12217, -7119, -2946, +-326, 923, 836, -204, -1349, -1807, -1304, 316, 2378, 4085, 5101, 5130, 4184, 2353, -259, -3135, +-5582, -7163, -7357, -6418, -5484, -4055, -1466, 1238, 3278, 4379, 4651, 4534, 4287, 3869, 3788, 4297, +4975, 5520, 5935, 6266, 6604, 6821, 6499, 5523, 4261, 2899, 1854, 1020, 257, -123, 32, 536, +1107, 1424, 1615, 1969, 2347, 2815, 4213, 5847, 3838, -1654, -7632, -13512, -18190, -20260, -17968, -12650, +-6670, -2211, 396, 1287, 573, -943, -2274, -2543, -1554, 766, 3318, 5311, 6284, 6003, 4594, 2165, +-1054, -4355, -6952, -8388, -8188, -6765, -5601, -4123, -1358, 1457, 3466, 4547, 4734, 4656, 4544, 4179, +4069, 4588, 5262, 5742, 6171, 6572, 6967, 7293, 7000, 6016, 4660, 3221, 2009, 1045, 328, 3, +166, 672, 1243, 1673, 1771, 1994, 2492, 3448, 5936, 7699, 4283, -2259, -8857, -15668, -20710, -22340, +-18845, -12305, -5812, -1435, 1096, 1562, 302, -1597, -2960, -3038, -1453, 1516, 4405, 6502, 7273, 6595, +4767, 1789, -1901, -5502, -8157, -9353, -8629, -6930, -5759, -4145, -1121, 1781, 3816, 4782, 4851, 4820, +4788, 4460, 4397, 5000, 5576, 5911, 6245, 6693, 7282, 7805, 7516, 6376, 4862, 3394, 2256, 1321, +524, 192, 385, 686, 1190, 1771, 1993, 2213, 2756, 4330, 8052, 8994, 3755, -3467, -10884, -18437, +-23566, -23831, -18634, -10904, -4331, -335, 1756, 1553, -415, -2628, -3817, -3426, -915, 2647, 5762, 7839, +8117, 6889, 4461, 791, -3332, -7017, -9519, -10168, -8688, -6818, -5686, -3859, -598, 2159, 4083, 4809, +4804, 4925, 4981, 4645, 4728, 5396, 5791, 6019, 6328, 6785, 7383, 7960, 7594, 6428, 4872, 3405, +2276, 1214, 304, -91, 183, 633, 1416, 2057, 2293, 2614, 3167, 5890, 10186, 8950, 2066, -5417, +-13541, -21050, -25478, -23831, -16944, -8829, -2978, 362, 1721, 721, -1688, -3758, -4419, -3202, 251, 4054, +7118, 8741, 8367, 6600, 3495, -671, -4981, -8514, -10556, -10357, -8316, -6578, -5620, -3405, -49, 2560, +4208, 4662, 4709, 5058, 5199, 4880, 5174, 5812, 6028, 6066, 6347, 6841, 7641, 8261, 7659, 6208, +4542, 3177, 2174, 1189, 497, 335, 612, 1184, 1762, 1921, 2122, 2487, 3781, 8582, 12345, 8315, +221, -8044, -17142, -24472, -27269, -23052, -14410, -6324, -1384, 1495, 1910, -79, -2807, -4690, -4833, -2531, +1689, 5614, 8641, 9647, 8605, 6197, 2262, -2444, -6867, -10143, -11554, -10193, -7723, -6274, -5234, -2402, +829, 3125, 4315, 4486, 4757, 5368, 5391, 5131, 5669, 6104, 6115, 6110, 6390, 6959, 7947, 8306, +7447, 5842, 4229, 3173, 2232, 1194, 549, 520, 953, 1592, 2023, 1901, 1930, 2305, 5087, 11710, +12985, 6143, -2230, -11498, -20933, -27535, -27535, -20565, -11005, -3844, 79, 2136, 1521, -1241, -4067, -5402, +-4742, -1157, 3439, 7318, 9845, 9958, 8291, 5024, 330, -4683, -8868, -11631, -11872, -9464, -7021, -6095, +-4602, -1272, 1626, 3560, 4204, 4321, 5037, 5731, 5533, 5570, 6217, 6337, 6071, 5956, 6186, 7005, +8186, 8294, 7200, 5450, 3982, 3003, 1956, 897, 454, 718, 1230, 2010, 2246, 1974, 1960, 2791, +8278, 14228, 11141, 2638, -5877, -15951, -24840, -29198, -25745, -16470, -7307, -1985, 1195, 2092, 257, -2820, +-5059, -5640, -3602, 899, 5193, 8765, 10245, 9438, 7157, 3193, -1901, -6833, -10580, -12524, -11295, -8404, +-6639, -5987, -3518, 55, 2597, 3944, 4044, 4365, 5427, 5867, 5582, 6096, 6605, 6356, 5968, 5921, +6346, 7476, 8358, 7961, 6594, 4851, 3627, 2687, 1607, 803, 760, 1058, 1631, 2351, 2240, 1802, +1582, 4683, 12744, 14901, 7743, -708, -10202, -20492, -28393, -29251, -22304, -12037, -4490, -422, 1974, 1700, +-1039, -4079, -5567, -5248, -1729, 2993, 7117, 10016, 10372, 8975, 5834, 977, -4486, -9092, -12323, -12815, +-10215, -7481, -6649, -5265, -1683, 1543, 3473, 3943, 4020, 4982, 5983, 5887, 6008, 6673, 6623, 6098, +5823, 6008, 6909, 8071, 8203, 7202, 5552, 4101, 3129, 2056, 1028, 757, 1048, 1568, 2291, 2293, +1773, 1426, 3566, 11356, 15335, 9192, 443, -9034, -19577, -27942, -29440, -22854, -12510, -4722, -536, 1928, +1723, -999, -4054, -5565, -5257, -1744, 2983, 7113, 10016, 10372, 8975, 5838, 990, -4843, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, +527, 645, 677, 829, 842, 926, 986, 1050, 1043, 1128, 1097, 1111, 1128, 1058, 1057, 994, +991, 987, 871, 776, 618, 516, 366, 265, 123, 13, -113, -223, -307, -464, -613, -803, +-962, -1108, -1189, -1193, -1193, -1096, -960, -798, -666, -588, -498, -452, -348, -280, -108, 57, +246, 405, 603, 750, 918, 1029, 1156, 1233, 1346, 1464, 1617, 1721, 1797, 1886, 1892, 1918, +1883, 1786, 1770, 1646, 1563, 1414, 1277, 1077, 903, 686, 493, 274, 65, -165, -454, -778, +-1150, -1548, -2056, -2489, -2819, -3002, -2928, -2587, -2086, -1489, -952, -543, -263, -157, -211, -296, +-424, -485, -469, -337, -99, 230, 477, 734, 917, 1062, 1247, 1452, 1751, 2066, 2490, 2883, +3191, 3469, 3563, 3521, 3346, 2983, 2610, 2251, 1864, 1601, 1417, 1280, 1073, 952, 675, 399, +35, -464, -1169, -2309, -3752, -5066, -5980, -6232, -5693, -4605, -3101, -1591, -430, 217, 323, -94, +-715, -1183, -1252, -866, -83, 648, 892, 480, -277, -1159, -1697, -1833, -1460, -556, 691, 2049, +3447, 4626, 5352, 5660, 5582, 5353, 5058, 4665, 4249, 3885, 3491, 2983, 2614, 2075, 1705, 1465, +1185, 913, 879, 589, 93, -1631, -4510, -7093, -9419, -10386, -9790, -7902, -5111, -2112, 136, 1384, +1464, 328, -1351, -2663, -3143, -2566, -1010, 989, 2747, 3507, 2182, -507, -3229, -5329, -5769, -4819, +-2946, -277, 2475, 4930, 7099, 8300, 8388, 7713, 6722, 5861, 5460, 5268, 5156, 5082, 4652, 4151, +3314, 2629, 1984, 1574, 1319, 1412, 1967, 1322, -2116, -6357, -10519, -14003, -14752, -13526, -10183, -5427, +-1172, 1820, 3428, 2761, 263, -2560, -4540, -5129, -3919, -1227, 2027, 4620, 5626, 4258, -143, -4840, +-8369, -9625, -7947, -5209, -1813, 2354, 5910, 8755, 10827, 11055, 9929, 8249, 6806, 6260, 6252, 6114, +6143, 5877, 5064, 4302, 3607, 2833, 2422, 2052, 2420, 4067, 2868, -2513, -7868, -14132, -18331, -19051, +-17055, -12062, -5470, -199, 3691, 5474, 3725, -94, -3972, -6497, -7060, -5148, -1350, 3220, 6459, 7344, +5988, 531, -6441, -10934, -13051, -10830, -6935, -3151, 1876, 6707, 9977, 12584, 13249, 11645, 9421, 7548, +6750, 6952, 7019, 6864, 6714, 6029, 4937, 4302, 3551, 3031, 2975, 3812, 7053, 5212, -1771, -8517, +-17182, -22102, -23106, -20639, -13915, -5726, 633, 5551, 7534, 4757, -314, -5205, -8297, -8636, -6013, -1282, +4271, 7932, 8711, 7167, 1141, -7732, -13065, -15578, -13119, -8300, -4332, 1201, 6958, 10797, 13917, 15112, +13210, 10541, 8324, 7259, 7632, 7594, 7236, 7121, 6397, 5300, 4632, 4024, 3551, 3534, 5571, 10338, +7191, -549, -8786, -19614, -24859, -26435, -23494, -15068, -5935, 1278, 7218, 9265, 5451, -739, -6373, -9923, +-9871, -6493, -701, 5629, 9346, 9837, 7845, 977, -9186, -14974, -17321, -14325, -9061, -4946, 1010, 7405, +11528, 14974, 16193, 13949, 11169, 9042, 7950, 8257, 8047, 7409, 7546, 6646, 5587, 5016, 4282, 3845, +4022, 8168, 13613, 7997, 75, -10609, -22475, -27315, -28952, -24664, -14502, -5174, 2385, 8891, 10028, 4969, +-1980, -7824, -11243, -10302, -5849, 1157, 7708, 10703, 10440, 7613, -874, -11489, -16963, -18446, -14322, -8833, +-4816, 1813, 8271, 12238, 15760, 16638, 13959, 11185, 9261, 8678, 9039, 8544, 7941, 7758, 6638, 5280, +4603, 4084, 3546, 4460, 11612, 15621, 7486, -64, -13704, -24796, -28990, -30420, -24044, -12834, -4153, 3849, +10380, 9890, 3859, -3391, -9110, -12042, -10205, -4899, 3040, 9134, 11189, 10311, 6572, -3721, -13788, -18387, +-18601, -13188, -8344, -4203, 3070, 9181, 13011, 16716, 16646, 13603, 11142, 9281, 9124, 9579, 8615, 7995, +7667, 6143, 5042, 4444, 3983, 3434, 6420, 16586, 15843, 6792, -2308, -18816, -27575, -31495, -31320, -21663, +-10495, -2322, 6520, 11718, 8656, 1582, -5833, -11120, -12761, -9533, -2581, 6032, 10991, 11596, 9909, 3917, +-8214, -16683, -20033, -18102, -11475, -7394, -1950, 5878, 11005, 14833, 17345, 15281, 12231, 10231, 9324, 9731, +9362, 8338, 7898, 6824, 5223, 4505, 4072, 3399, 5384, 14809, 17202, 8403, -376, -16380, -26842, -31116, +-31659, -22885, -11431, -2935, 5837, 11564, 8935, 1888, -5570, -10952, -12813, -9614, -2727, 5911, 10960, 11616, +9887, 3962, -8210, -16683, -20032, -18097, -12421, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 637, 841, 1083, 1277, 1418, 1539, 1625, 1666, +1602, 1486, 1351, 1147, 892, 609, 287, -71, -417, -781, -1144, -1467, -1734, -1935, -2034, -2030, +-1891, -1640, -1311, -884, -453, 20, 487, 873, 1258, 1581, 1876, 2134, 2246, 2320, 2337, 2198, +2085, 1951, 1707, 1457, 1113, 667, 178, -437, -1157, -1893, -2599, -3076, -3231, -3105, -2815, -2455, +-2097, -1741, -1283, -701, -6, 713, 1433, 2080, 2644, 3066, 3300, 3396, 3272, 3100, 2887, 2654, +2503, 2242, 1980, 1647, 1117, 231, -1372, -3153, -4665, -5568, -5365, -4461, -3129, -1862, -1622, -2099, +-2586, -2692, -1962, -774, 604, 2122, 3326, 4160, 4644, 4654, 4355, 3978, 3547, 3285, 3392, 3603, +3822, 3929, 3750, 1973, -1217, -4359, -7325, -8717, -8147, -6503, -3673, -1394, -506, -1141, -3302, -4621, +-4492, -3251, -909, 1354, 3438, 5174, 5848, 5806, 5231, 4313, 3607, 3265, 3425, 4204, 5170, 6415, +7514, 5134, 526, -4462, -9628, -11933, -11641, -9449, -4936, -1367, 255, 330, -2369, -5810, -6695, -5939, +-3379, 320, 2881, 5509, 7210, 6923, 6279, 4985, 3720, 3355, 3389, 4308, 5983, 8321, 11326, 9668, +3987, -2715, -10467, -14490, -14955, -12887, -6875, -1683, 991, 1738, -936, -5518, -8506, -8544, -6191, -1805, +1966, 4875, 7603, 7948, 7040, 5772, 3827, 2950, 3069, 3680, 5679, 8718, 13671, 14196, 8194, 566, +-9443, -16234, -17659, -16488, -9931, -2746, 1064, 2980, 691, -4296, -8913, -10778, -8796, -4269, 577, 4340, +7636, 9094, 8186, 6666, 4592, 2934, 2774, 3168, 4819, 8063, 14753, 18312, 13023, 5056, -6680, -16609, +-19579, -20081, -13871, -4728, 346, 3700, 2494, -2829, -8278, -12398, -11712, -7044, -1646, 3225, 7147, 9531, +9299, 7491, 5311, 3105, 2407, 2668, 3958, 6414, 13614, 20876, 17142, 9706, -2172, -15427, -20007, -22208, +-17918, -7242, -957, 3530, 4194, -1214, -6882, -12446, -14068, -9516, -3861, 1640, 6470, 9473, 10298, 8653, +6250, 3871, 2519, 2407, 3292, 5081, 11542, 22004, 20928, 13866, 3002, -13048, -20032, -23219, -21741, -10447, +-2581, 2417, 5148, 338, -5752, -11801, -15926, -12378, -6179, -437, 5316, 9000, 10731, 9716, 7059, 4662, +2929, 2519, 3038, 4099, 9029, 21577, 23796, 17216, 8081, -9357, -19121, -22930, -24351, -13646, -4268, 962, +5465, 1824, -4596, -10574, -16717, -14810, -8218, -2442, 4041, 8432, 10734, 10733, 7981, 5416, 3346, 2565, +2902, 3773, 6790, 19920, 26042, 19778, 12327, -5030, -17967, -22009, -25833, -16892, -5914, -661, 4994, 3036, +-3736, -9429, -16784, -17225, -10461, -4479, 2344, 7655, 10322, 11335, 8868, 6106, 4002, 2906, 3041, 3952, +5377, 17545, 27546, 22120, 15712, -307, -16276, -20794, -26086, -19752, -7393, -1884, 4353, 4298, -2694, -8321, +-16145, -19007, -12591, -6258, 608, 6798, 9822, 11631, 9658, 6644, 4433, 2989, 2993, 3951, 4429, 14819, +28122, 24407, 18382, 4329, -14180, -19804, -25843, -22489, -9236, -3067, 3337, 5190, -1676, -7457, -15219, -20408, +-14849, -8113, -1355, 5731, 9091, 11603, 10505, 7229, 5077, 3371, 3096, 4075, 3929, 12096, 27880, 26562, +20540, 8722, -11550, -18883, -25092, -24767, -11200, -4109, 2121, 5839, -539, -6670, -14012, -21248, -17085, -9843, +-3338, 4434, 8360, 11273, 11228, 7796, 5549, 3730, 3072, 4098, 3909, 9676, 26964, 28518, 22252, 12543, +-8724, -18117, -23977, -26482, -13280, -4896, 836, 6092, 521, -6176, -12925, -21637, -19186, -11559, -5263, 3067, +7635, 10752, 11884, 8496, 6104, 4284, 3215, 4090, 4045, 7555, 25289, 30025, 23646, 15931, -5436, -17113, +-22581, -27645, -15445, -5717, -457, 6121, 1688, -5526, -11637, -21529, -21108, -13211, -7110, 1540, 6818, 10002, +12207, 9071, 6493, 4753, 3397, 4046, 4114, 5829, 23244, 31177, 25127, 19029, -1779, -15809, -21111, -28209, +-17582, -6615, -1693, 5926, 2860, -4770, -10382, -20908, -22610, -14793, -8780, 41, 6138, 9312, 12522, 9890, +7046, 5344, 3705, 4114, 4429, 4559, 20753, 31680, 26119, 21330, 1903, -14346, -19436, -28009, -19594, -7459, +-2838, 5280, 3841, -4030, -9303, -19988, -23825, -16363, -10289, -1505, 5422, 8470, 12354, 10430, 7333, 5727, +3929, 4082, 4742, 3817, 18380, 31950, 27185, 23128, 5363, -12877, -18018, -27412, -21287, -8181, -3687, 4530, +4700, -3384, -8503, -18947, -24840, -17952, -11577, -2984, 4743, 7783, 12178, 11059, 7641, 6129, 4124, 3896, +4883, 3249, 15867, 31668, 27928, 24433, 8700, -11230, -16672, -26520, -23032, -9189, -4525, 3595, 5451, -2579, +-7728, -17773, -25474, -19473, -12950, -4691, 3772, 6890, 11664, 11548, 7950, 6493, 4421, 3958, 5142, 3071, +13787, 31330, 28915, 25609, 11765, -9553, -15546, -25427, -24394, -10125, -5169, 2547, 5872, -1886, -7094, -16591, +-25912, -20875, -14153, -6234, 2993, 6275, 11175, 12004, 8184, 6619, 4438, 3614, 5006, 2907, 11927, 30930, +29873, 26511, 14363, -8079, -14829, -24507, -25612, -11113, -5639, 1748, 6343, -1155, -6687, -15630, -26192, -22240, +-15295, -7718, 2082, 5678, 10611, 12405, 8591, 6971, 4878, 3633, 5039, 2929, 10079, 30107, 30653, 27233, +17160, -6063, -13891, -23183, -26581, -12259, -6029, 807, 6659, -272, -6123, -14480, -26097, -23371, -16271, -9165, +1059, 5042, 9904, 12688, 8958, 7133, 5131, 3627, 4933, 2982, 8505, 29148, 31457, 27790, 19301, -4166, +-13145, -21947, -27268, -13396, -6462, -183, 6648, 395, -5728, -13385, -25829, -24346, -17073, -10406, 158, 4584, +9236, 12858, 9305, 7374, 5597, 3886, 5124, 3352, 7170, 27903, 31867, 28049, 21151, -2128, -12178, -20400, +-27371, -14268, -6717, -1088, 6431, 905, -5450, -12352, -25363, -25174, -17783, -11477, -784, 3992, 8316, 12697, +9527, 7559, 5940, 4007, 5116, 3550, 5951, 26542, 32262, 28234, 22713, -154, -11428, -19033, -27357, -15257, +-7001, -1908, 6158, 1458, -5171, -11469, -24893, -26027, -18635, -12636, -1826, 3492, 7517, 12527, 9787, 7684, +6216, 4170, 5105, 3822, 5314, 25668, 32596, 28412, 23522, 929, -11098, -18437, -27347, -15688, -7063, -2178, +6060, 1679, -5115, -11269, -24744, -26196, -18717, -12732, -1942, 3488, 7487, 12513, 9770, 9251, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10187, +19507, -18619, 13932, 540, -11953, 20282, -14066, 2865, 12519, -13967, 5059, 14790, -22912, 19551, -1122, -7180, +734, 19559, -24868, 14717, 5949, -6615, -5803, 13190, 6739, -24343, 25592, -4949, 620, -9317, 7786, 20580, +-30652, 13850, 9030, -3860, 2580, -15003, 13083, 21064, -29147, 5692, 12321, -1793, 5900, -6962, -12871, 17243, +20540, -26244, -4462, 14577, -2060, 8213, 3062, -10614, -12148, 12063, 26561, -11115, -20585, 6671, 7899, -3361, +12559, 4787, -5245, -17196, -3622, 14869, 25917, -5001, -21863, -2840, 5718, 4365, -4288, 16399, 8520, -1637, +-12432, -18819, 324, 11594, 25965, 14501, -16894, -15328, -6729, 2368, 7758, -5301, 5441, 15326, 15387, -1104, +-4194, -24111, -15089, -4940, 8318, 21419, 28401, 13773, -7032, -21470, -15403, -9787, -289, 10778, 47, -1377, +8868, 11009, 19533, 16129, -4673, -2239, -24915, -25385, -16177, -8168, 5717, 17176, 25805, 31171, 26098, 3018, +277, -25449, -27952, -20902, -14774, -1862, 7495, 17292, 16087, -777, 2953, 1966, 3769, 7415, 11708, 14397, +18667, 1987, -10008, -4423, -23742, -28594, -20834, -16409, -6113, 2699, 11034, 17099, 20877, 22366, 21953, 20139, +17552, 13274, -8482, -10405, -10259, -7991, -15431, -25423, -15539, -11984, -4740, 1609, 6763, 10351, 12140, 12505, +11820, 10426, 7599, -10729, -14040, -11719, -10672, -4935, 165, 5616, 9902, 12978, 14661, 15179, 14915, 14122, +13108, 12234, 11495, 10000, -1131, -12810, -13044, -12410, -10208, -17869, -23040, -17477, -15179, -10626, -6619, -3222, +-644, 937, 1758, 2069, 2176, 2317, 2585, 3141, 3951, 4956, 6089, 7245, 8348, 9271, 10043, 10661, +11104, 11389, 11565, 11600, 11593, 11578, 11456, 11431, 10133, 3543, -4271, -7812, -7148, -5674, -3027, -68, +2476, 4367, 5368, 5622, 5204, 4443, 1868, -2836, -8312, -13588, -17171, -18291, -16436, -13141, -9666, -6357, +-3819, -2196, -1459, -1430, -1832, -2402, -2873, -3123, -3082, -2755, -2193, -1484, -701, 47, 736, 1316, +1786, 2176, 2485, 2763, 3012, 3269, 3536, 3823, 4115, 4406, 4685, 4952, 5198, 5399, 5576, 5727, +5866, 5340, 3628, 1137, -1797, -4590, -6696, -7645, -7131, -5311, -3176, -1177, 506, 1622, 2219, 2340, +2182, 1926, 1654, 1500, 1538, 1732, 2102, 2580, 3109, 3645, 4132, 4589, 4974, 5305, 5595, 5853, +6088, 6335, 6593, 6847, 7114, 7379, 7640, 7874, 8095, 8299, 8478, 8634, 8756, 8859, 8928, 8997, +9045, 9080, 9100, 9102, 9067, 9033, 8942, 8854, 8735, 8587, 8422, 8237, 8017, 7733, 7454, 7189, +6878, 6584, 6255, 5921, 5548, 5172, 4769, 4351, 3895, 3447, 2976, 2513, 2009, 1527, 714, -829, +-2893, -5320, -7923, -10340, -12264, -13690, -14567, -14806, -14571, -14439, -14565, -15053, -15833, -16879, -18025, -19178, +-20150, -20892, -21355, -21536, -21415, -21053, -20550, -19782, -18901, -17876, -16849, -15927, -15075, -14364, -13746, -13132, +-12526, -11853, -11141, -10338, -9496, -8567, -7639, -6691, -5735, -4795, -3872, -2947, 909, 909, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, -1, 0, 0, -5, +2, -6, 0, 6, -45, 71, -99, 134, -181, 154, -47, -84, 152, -187, 217, -215, +141, -47, -12, 50, -147, 197, -214, 170, -91, -21, 128, -207, 230, -206, 167, -79, +-50, 190, -216, 187, -137, 78, 10, -152, 228, -233, 192, -183, 125, -30, -113, 205, +-241, 233, -194, 142, -37, -108, 224, -253, 240, -200, 104, 35, -200, 327, -526, 327, +621, -831, 671, -1899, 2819, -2018, 967, -1640, 2710, -1999, 823, -337, 603, -726, 859, -881, +921, -1072, 1115, -762, 343, -425, 91, 380, -244, -49, -286, 860, -570, -142, 438, 284, +-962, 439, -372, 1036, -1676, 1440, -832, 981, -1314, 1107, -507, 569, -1286, 1203, -480, 773, +-1739, 1877, -1421, 1673, -2471, 2247, -1291, 1121, -1697, 1945, -1128, 832, -1634, 2383, -2017, 1339, +-1840, 2687, -2092, 897, -401, 386, 78, -1247, 1576, -1282, 1266, -1908, 2382, -2114, 2354, -3420, +4016, -3774, 3697, -4608, 5120, -4531, 4067, -4576, 5009, -4421, 3627, -3622, 4072, -4073, 3665, -3452, +3920, -4067, 3316, -2551, 2577, -2439, 1356, -204, -158, 204, -629, 1243, -1300, 1087, -1344, 1858, +-2213, 2314, -2562, 3051, -3442, 3516, -3595, 3988, -4215, 3964, -3701, 3414, -3140, 2571, -1941, 1751, +-1864, 1828, -1388, 1086, -1083, 829, -103, -704, 987, -1207, 1810, -2424, 2589, -2325, 2193, -2492, +2615, -2301, 2204, -2697, 3183, -2891, 2503, -2571, 2432, -1564, 697, -432, 244, 380, -1140, 1428, +-1520, 1712, -2083, 2067, -1787, 1810, -2185, 2348, -1927, 1532, -1608, 1477, -962, 457, -332, 309, +146, -830, 1219, -1243, 1258, -1464, 1577, -1191, 827, -724, 827, -813, 617, -661, 879, -967, +642, -221, 147, -360, 269, -120, 55, -224, 424, -374, 260, -388, 661, -650, 385, -221, +318, -393, 313, -263, 539, -797, 816, -730, 690, -660, 561, -390, 321, -219, 57, 68, +-239, 481, -714, 676, -439, 308, -259, 94, 95, -143, -45, 178, -143, 168, -338, 482, +-403, 328, -313, 190, 210, -634, 803, -729, 735, -823, 773, -522, 337, -372, 459, -354, +219, -293, 539, -563, 337, -99, 65, 8, -370, 648, -524, 181, -52, 68, 60, -366, +541, -299, -95, 287, -322, 485, -710, 864, -842, 793, -752, 579, -223, -204, 374, -338, +438, -550, 432, -83, -117, 134, -167, 144, 8, -269, 447, -509, 623, -1282, 2180, -2013, +1369, -1002, 70, 1092, -1532, 1849, -3544, 4884, -4749, 4073, -3426, 3284, -3733, 4428, -3186, 883, +944, -1903, 3295, -4959, 5053, -4442, 4432, -5226, 5125, -4330, 3482, -3061, 2198, -100, -1540, 1931, +-2223, 2870, -3374, 2857, -2082, 1557, -1569, 1671, -1558, 1501, -1573, 1477, -905, -8, 885, -1302, +1747, -2619, 2546, -1794, 1395, -1842, 2117, -1642, 1631, -2293, 3355, -3977, 4117, -3880, 3502, -2662, +1795, -1338, 1170, -960, 453, 141, -740, 1374, -2432, 3411, -4038, 4471, -4898, 5229, -5329, 5223, +-5412, 5898, -6144, 5563, -4671, 3675, -2533, 902, 532, -1462, 1845, -2093, 2372, -2478, 2739, -3197, +3731, -4453, 5195, -5491, 5838, -6027, 5699, -5008, 4642, -4395, 4116, -3362, 2424, -1765, 1067, 42, +-992, 1582, -2105, 2731, -2890, 2494, -2406, 2917, -3397, 3405, -3544, 3755, -3706, 3358, -3370, 3371, +-2745, 2174, -2319, 2446, -2107, 2052, -2574, 2474, -1763, 1208, -1048, 302, 676, -724, 211, -66, +396, -156, -636, 757, 162, -381, 2, -572, 2306, -3253, 3532, -4518, 5925, -6014, 5214, -5376, +6006, -5970, 5415, -5703, 6060, -5274, 4153, -3901, 3830, -2997, 1874, -1150, 488, 628, -1777, 2378, +-3047, 4160, -5020, 5137, -5368, 6145, -6397, 6056, -6024, 6462, -6536, 6197, -6024, 5915, -5033, 3556, +-2437, 1678, -786, -260, 844, -1178, 1688, -2364, 2647, -2742, 2910, -3154, 3335, -3337, 3370, -3495, +3667, -3637, 3523, -3343, 3117, -2728, 2158, -1532, 1160, -927, 634, -341, 187, -1, -611, 1220, +-1416, 1450, -1779, 2052, -1991, 1975, -2339, 2633, -2421, 2062, -1917, 1794, -1304, 894, -961, 1020, +-837, 898, -1314, 1608, -2047, 1891, 127, -1838, 1762, -2194, 2383, -440, -2599, 2940, 123, -2691, +3942, -6603, 8076, -4746, 551, 309, 1340, -1668, 2915, -5463, 5097, -2683, 229, 2288, -3764, 3406, +-347, -3958, 4990, -2517, -425, 2595, -4335, 4221, -1979, -192, 417, 1064, -2488, 2461, -2309, 2173, +-2049, 293, 1695, -1014, 93, -607, -490, 3060, -3246, 564, 1586, -1848, 2073, -1654, -422, 2309, +-1293, -1528, 3076, -2584, 1698, 100, -1956, 1985, -813, -573, 1345, -182, -1549, 1726, -1044, 551, +634, -1432, 66, 1306, -617, -997, 1203, -1564, 1962, -1159, -151, -42, 1218, -1975, 1406, -177, +-856, 1598, -1651, 721, 400, -627, -245, 2439, -4056, 3096, -1687, 1360, -335, -11, -1847, 3062, +-1659, 621, -318, -229, 338, -514, 987, -2018, 3773, -4181, 2407, -917, 618, -781, 2252, -4497, +4587, -2940, 1222, 715, -1305, -143, 1534, -1748, 1164, 417, -2280, 2311, -1710, 1583, -1132, 842, +-1455, 1685, -1258, 602, -119, 991, -2407, 1864, -476, -424, 2213, -3158, 1991, -1889, 4010, -5188, +5682, -5769, 3338, 878, -5022, 8333, -7947, 3628, -519, -139, 270, 26, -498, -354, 1169, -928, +868, 272, -2992, 5276, -5968, 5764, -5163, 4664, -3830, 2369, -7, -4796, 9852, -10602, 8620, -8113, +7097, -4584, 3980, -3227, -903, 5732, -7883, 8063, -7491, 5184, -1307, -3026, 5852, -7019, 7592, -7606, +5820, -3956, 1739, 1879, -5961, 9090, -10287, 9008, -7233, 7131, -5754, 1106, 3481, -6812, 9740, -9564, +6465, -3832, 2442, 0, -2635, 4177, -4999, 5723, -6385, 5812, -2291, -2349, 6229, -8747, 8944, -7589, +5872, -4334, 2473, -163, -3639, 6860, -7444, 7414, -7396, 4509, -1181, 919, -480, -2684, 4907, -5141, +5389, -4921, 1932, 1700, -3479, 3881, -4181, 3561, -1498, 36, -199, -451, 3123, -5310, 6789, -7643, +6135, -3594, 2856, -1708, -1912, 4621, -5738, 7008, -6973, 4891, -2744, 622, 1847, -2895, 2392, -2230, +3001, -3424, 2099, 420, -2723, 5049, -6702, 5786, -3677, 2339, -769, -2019, 4017, -6211, 9832, -12453, +11340, -8388, 4441, -422, -2173, 4907, -7306, 7623, -7274, 6396, -3285, 531, 1373, -3508, 4466, -3425, +2397, -951, -918, 2291, -3575, 5217, -6671, 7429, -6434, 4872, -2931, -600, 3158, -5131, 7522, -8639, +8039, -7200, 5906, -4090, 1970, 425, -1664, 2334, -3792, 3696, -2923, 3072, -2049, -720, 3566, -5654, +5202, -2779, 691, 1700, -3331, 3623, -4024, 5881, -7806, 8648, -7016, 3977, -1276, -1574, 4088, -5697, +6858, -8140, 8649, -7686, 4730, -1052, -1809, 3724, -3564, 2422, -2519, 3230, -3177, 2013, 1338, -5343, +6344, -5673, 3973, -1154, -1185, 2948, -5629, 7933, -8606, 8257, -7161, 6100, -4224, 1117, 1830, -4123, +6642, -8270, 7859, -6402, 4676, -2266, -913, 2416, -1637, 1401, 219, -5175, 8406, -7276, 4400, -1634, +255, -1693, 4640, -6608, 5774, -2251, -2920, 7447, -9343, 8043, -5537, 4305, -4106, 4157, -2451, -2029, +5475, -4487, 2042, 572, -2747, 1836, 1549, -3405, 2169, -201, -1394, 2063, -1534, 61, 1519, -2145, +3589, -7080, 9012, -8077, 6261, -2867, -3959, 9833, -10553, 9460, -8961, 4259, 1127, -937, -1239, 2280, +-4316, 5005, -1431, -3379, 7337, -8636, 6355, -2594, -1864, 6217, -7802, 6785, -4622, -176, 7190, -12221, +13478, -10958, 4872, 1889, -3953, 2022, 810, -3225, 3580, 473, -5985, 9119, -11320, 11891, -8539, 1960, +4006, -8651, 11183, -9446, 2667, 4596, -7941, 8108, -5925, 1542, 1642, -2672, 2760, -1450, 114, -485, +122, -1160, 6171, -10293, 11637, -11213, 5839, 3106, -8486, 11490, -12230, 7762, -3086, 2381, -1261, -627, +648, -1282, 1794, 83, -900, -1164, 2415, -2130, 1322, 2567, -6932, 7960, -7380, 5383, 200, -5602, +8845, -12725, 13867, -10220, 6305, -2345, -2087, 2596, -768, 875, -1782, 3725, -6795, 7030, -4408, 1910, +923, -3367, 4321, -4476, 4334, -3404, -40, 5398, -9128, 9768, -8030, 3830, 689, -1718, 656, -202, +197, -1702, 5641, -7621, 6736, -5590, 3677, -626, -658, 2034, -5111, 5929, -3579, 1717, 852, -4130, +4400, -3322, 2818, -569, -633, -1113, 1610, -1563, 1309, 2495, -5105, 3207, -2144, 1160, 3253, -7860, +11063, -14424, 14101, -9970, 9349, -11724, 11159, -10389, 9100, -3627, 2310, -6416, 6016, -2521, 1685, -1106, +2497, -8906, 13860, -13712, 12556, -10871, 6764, -2453, 451, -60, 929, -1636, 44, 1886, -836, -2305, +4547, -4616, 3492, -3697, 5131, -7803, 10075, -8037, 2892, -165, -1698, 3634, -2058, -1494, 4335, -7606, +8186, -5470, 4353, -5583, 6954, -8073, 7961, -6099, 4863, -3798, 539, 3621, -5256, 4491, -3099, 994, +1156, -3901, 8199, -10220, 7821, -2979, -2853, 4814, 444, -4957, 4960, -4301, 2405, 909, -1136, 44, +782, -4384, 8965, -10491, 10119, -10497, 8886, -3372, -2023, 6667, -11690, 9155, 13, -4767, 4349, -1543, +-4347, 7763, -6032, 2781, 1072, -6312, 10256, -9853, 4670, 2136, -6189, 6804, -3675, -157, 1995, -5309, +11000, -13717, 12658, -8968, 3314, 429, 148, -4620, 10918, -13721, 10246, -4421, -1310, 6525, -6774, 3171, +-325, -4061, 8253, -7200, 4145, -1631, -2872, 5064, -3236, 2115, -1867, -241, 2769, -4269, 3506, 976, +-8369, 11466, -5127, -3681, 8868, -12619, 12784, -7764, 3439, -1200, -1213, 996, 661, -214, 633, -395, +-2672, 2982, -917, 1964, -4948, 5357, -841, -3464, 4581, -2028, -5463, 11072, -10800, 8888, -4725, -820, +4467, -8299, 8508, -2392, -3222, 3284, -506, -1842, 3419, -3453, 2677, -4389, 5643, -1789, -4484, 8089, +-7131, 2791, 1421, -3106, 2398, -1262, -1404, 6082, -8755, 7627, -4106, -981, 5673, -3689, -3909, 7873, +-6629, 3505, 1254, -3104, 3947, -8461, 9249, -4733, 345, 3914, -6972, 7307, -5413, 1186, 3123, -5791, +5473, -293, -5997, 9056, -6106, -2851, 8639, -6630, 3300, -892, -2489, 4943, -6578, 8150, -7239, 4185, +-1298, -991, 1122, 133, 1039, -768, -2047, 923, 3835, -7530, 9240, -7952, 5160, -4699, 6734, -11050, +16116, -20374, 20666, -18596, 17704, -11382, 141, 8377, -13253, 12764, -11654, 15538, -17916, 18829, -19002, 17667, +-23193, 30288, -26545, 14337, -2112, -5015, 8704, -10743, 8336, -2547, -1647, 244, 5008, -6657, 4623, -6547, +9707, -7153, 2802, -1048, -3340, 8048, -9299, 9653, -6871, 4664, -8532, 10051, -8297, 9591, -11141, 8575, +-2539, -3472, 5876, -4209, 1616, -3350, 5112, -3113, 2949, -4475, 7551, -9620, 4131, 3319, -6058, 7223, +-9611, 11520, -8597, 729, 4833, -6012, 5692, -1653, -7029, 13949, -13792, 7181, 2928, -7288, 6982, -11487, +11584, -4499, 1361, -519, 20, -1913, 2078, -3544, 7485, -6472, -1416, 12018, -16363, 14461, -12692, 10873, +-6991, 1690, 2315, -725, -2906, 2550, 1334, -4301, 4893, -7187, 10037, -9875, 7215, -1200, -2722, 903, +1281, -5193, 10236, -7911, 616, 2478, -721, -1945, 1448, 2996, -5183, -2774, 14064, -14252, 4742, 4109, +-6527, 6743, -9741, 10997, -6802, 360, 4909, -2631, -1858, 2448, -7918, 15531, -15323, 10680, -4502, -2463, +6916, -10852, 11889, -6982, 2271, -2460, 5523, -5653, 273, 2518, 1690, -4850, 2989, 5, -3158, 3178, +-4300, 12916, -17774, 15218, -14510, 11267, -4316, -2756, 11137, -13967, 9092, -3880, -660, 6594, -9891, 4956, +5013, -14311, 20907, -22282, 20990, -17419, 6184, 7226, -13167, 10992, -6207, 3312, 1108, -6384, 5471, 1892, +-13394, 22390, -23612, 21494, -16802, 5769, 8081, -15741, 13701, -8929, 6730, -4626, 868, 2344, 1074, -8624, +11103, -8440, 5851, -5131, 2872, 2807, -4127, -225, 2591, -1685, -1491, 5578, -7953, 10813, -12558, 10003, +-5754, 4496, -6191, 6309, -4297, -52, 4245, -1965, 1225, -8922, 13622, -10243, 4417, -1278, 2706, -2485, +-3484, 8064, -4263, -240, -3515, 7346, -6572, 7462, -9601, 8685, -3740, -898, 5, 3283, -3406, 573, +-1622, 9341, -9615, -1889, 11099, -14034, 14667, -15234, 16730, -12451, -437, 12471, -15270, 9798, -3821, 230, +1695, -420, -3820, 10778, -17787, 20918, -18816, 11913, -1937, -11023, 20448, -17929, 11683, -7398, 1225, 4491, +-8547, 6372, 5897, -15460, 14514, -8136, 2042, 926, -4194, 7512, -8540, 6749, -2537, 1632, -5694, 9407, +-11906, 14253, -15633, 14017, -9385, 3809, 323, -1708, 4048, -6072, 3389, -3397, 9687, -14602, 12644, -6682, +2955, -2931, 662, 8086, -14252, 9931, -5246, 7022, -4719, -3458, 7482, -8247, 6103, -666, -2488, 4019, +-3604, 4104, -7242, 5688, -6409, 10597, -7968, 4078, -2665, -919, 6300, -7274, 3695, -94, -6297, 10099, +-2664, -8004, 9848, -5137, 7036, -9842, 2010, 6707, -9291, 9376, -8960, 7894, -1991, -4678, 3672, 1544, +-7254, 16387, -18612, 12563, -8893, 2206, 7333, -8625, 4988, -5001, 7897, -5204, 995, 254, -1920, -370, +4060, -2274, -1692, 3452, -2817, 6317, -10973, 7071, -697, -1651, 658, -2304, 4957, 1398, -9465, 8315, +-3134, 1259, -3486, 4966, -6227, 5384, -1766, 2606, -2038, -5484, 12507, -15513, 13118, -6882, 2226, 2311, +-7543, 10122, -11494, 8058, -1543, 2730, -6147, 7594, -12066, 14063, -9055, 1949, -2184, 6748, -3622, -4397, +7345, -3801, 3362, -7475, 7277, -7452, 8166, -4724, 1503, 1668, -4943, 10018, -11797, 4825, -1521, 609, +2458, 3278, -13744, 20542, -26565, 30094, -23409, 8110, 3429, -10789, 18501, -18743, 7643, 2972, -5108, 5518, +-7957, 3655, 10660, -20797, 18916, -14582, 8127, 2876, -9419, 9175, -8515, 7201, -506, -2245, -3497, 6614, +-8222, 14638, -21839, 22042, -17011, 16423, -10013, -3735, 9039, -8872, 7127, -5005, 4975, -6043, 12027, -14200, +8800, -8232, 8353, -1990, -4576, 4835, -3913, 7871, -11910, 12701, -13682, 15083, -13938, 12194, -12057, 8123, +-2667, 4458, -7578, 3478, 246, 2907, -3986, -486, 2892, -2710, 5572, -8893, 7734, -6045, 3513, 2497, +-5686, 8306, -11627, 12881, -13947, 11496, -9356, 8130, -1644, -1801, -1118, 4249, -3035, -147, -2671, 8260, +-12815, 16565, -13072, 5221, -1681, -866, 8824, -12684, 4849, 3139, -6174, 7982, -6575, 2509, 633, -1927, +3468, -4611, -161, 9574, -15959, 20923, -24674, 19974, -11535, 6046, -1083, -5634, 12251, -10379, 2645, 1641, +-5211, 5594, -1331, -1344, 1855, -3867, 8625, -5867, -4049, 4311, 194, 3332, -7403, 3512, -754, 7229, +-12492, 13292, -16245, 16187, -9359, 1821, 1241, -2242, 1806, 2950, -4476, -1538, 5175, -3908, 4208, -6880, +5974, 510, -5271, 6673, -10747, 9606, -982, -983, 1518, -8121, 8377, 554, -6445, 2984, -1513, 6851, +-7236, 4819, -7205, 11778, -14041, 13361, -13411, 11530, -6667, 1637, 4308, -6879, 5439, -4781, 7832, -12203, +9889, -7608, 10810, -9299, 2823, 4715, -11910, 15426, -16275, 13696, -6411, -1212, 8479, -11910, 5184, 6280, +-12934, 15800, -18450, 15205, -3163, -6483, 9236, -11365, 10186, -5325, -396, 8013, -11122, 5401, 3370, -7131, +7080, -8479, 6720, -1581, -2499, 4030, -2572, 3217, -2379, -3774, 5475, -3352, 1956, 1166, -4526, 4133, +-2177, 7274, -12064, 5959, -2677, 8052, -9587, 4365, 1407, -3542, 4209, -7331, 9766, -10323, 9354, -5328, +3609, -5606, 2998, 2800, -3520, 2451, -9343, 15922, -10385, 3185, -2914, 2148, 2579, -5009, 2206, -1562, +1184, 2925, -1931, -2466, 2541, 287, 551, -6759, 5391, 2877, -2905, 2043, -7659, 8907, -4043, 757, +1529, -3959, 2519, 459, -2485, 7645, -12596, 8209, 2300, -7307, 4376, -2919, 6620, -4659, -5242, 8997, +-3706, -1430, 3234, -5640, 7379, -3279, -133, 1684, -6531, 6347, -647, -1955, 3167, -6002, 7727, -3306, +-2723, 5324, -8149, 11413, -14360, 13377, -6780, 943, 2309, -1962, -351, -1537, 3437, -2083, 5045, -13203, +17662, -16338, 12218, -6283, 1795, 638, -2037, 1088, 685, -375, -2949, 7565, -9435, 7790, -7942, 7350, +961, -7793, 5515, 165, -4320, 4291, -2568, 462, 2682, -3312, 5781, -7368, 555, 4450, -2461, 269, +1739, -7214, 13208, -13667, 8703, -2888, 80, 2511, -7263, 6974, -2250, -2322, 8554, -11268, 6930, -3264, +793, 8489, -19163, 18974, -9596, 1607, 4586, -11974, 12111, -3234, -2333, 3017, -3531, 1188, 6783, -14089, +15566, -16925, 15590, -5817, -4170, 6765, -3042, 1684, -3731, 577, 3401, -2901, 1196, -39, 1373, -5470, +8852, -8331, 6871, -6546, 3967, 1281, -4213, 1984, -2090, 6086, -1983, -5310, 2930, 912, 859, -3531, +5921, -7732, 7885, -9881, 12701, -13777, 13056, -7131, 149, 1931, -999, -2298, 4336, -5672, 6530, -2854, +-1688, 3065, -806, -2285, 2608, -3064, 4828, -4550, 284, 905, 4371, -6614, 6508, -9065, 11503, -11893, +7636, -1622, -1558, 684, 2138, -1781, 1241, -3453, 4534, -2677, -643, 1518, -1058, 1936, -540, -3426, +6011, -9048, 14428, -15548, 12314, -9507, 5014, 859, -5851, 6765, -3714, 2584, 1973, -11641, 13591, -5999, +94, 103, -1023, 2459, -1530, 1707, -1956, -1548, 6312, -4710, 955, -3399, 1976, 2621, -234, -4258, +7686, -11713, 15145, -15470, 12208, -9671, 8486, -5595, 1538, -216, 138, 2222, -2007, 924, -5794, 11348, +-8508, 1476, -1273, 2925, -202, -440, -665, 438, 960, -3655, 7412, -11752, 13103, -11840, 10506, -7722, +4912, -6312, 11086, -13212, 12373, -9293, 2160, 5822, -12236, 13831, -10432, 6612, -507, -3681, 1970, -371, +-619, 3686, -6313, 5398, 0, -8610, 14409, -13870, 11553, -5871, -1973, 5972, -6053, -79, 7100, -8755, +11508, -14539, 10153, 153, -6678, 7677, -8610, 6210, 530, -5081, 5359, -3510, -837, 9126, -12788, 8301, +-1319, -6211, 12395, -16368, 16299, -10985, 4776, 1224, -5832, 5447, 332, -5141, 4031, -1287, -4195, 11747, +-11569, 6218, -6203, 6179, 3507, -11931, 9561, -4956, 1925, -361, -273, -1610, 7834, -11132, 13114, -16425, +12956, -5108, 191, 1108, -2282, 3442, -2396, 2259, -3535, 3323, -976, 2184, -8398, 9390, -5975, 2057, +3525, -5100, 3531, -5115, 9497, -10235, 4830, -3592, 8907, -9575, 4204, -2099, 1967, 1567, -2070, -939, +2707, -5034, 7418, -9310, 8625, -4849, 802, 2894, -4048, 2842, -1945, 3171, -4930, 1564, 2125, -1296, +-667, 3067, -3759, 1606, 786, -1045, 2529, -8721, 11747, -9135, 7190, -5895, 1394, 4795, -4628, -336, +3297, -5270, 5340, -4240, 4331, -2740, -924, 1994, 464, -1145, -1208, 2686, -1214, 434, -2865, 2099, +360, 1098, -1952, 1446, -939, 653, -1012, 165, -430, 370, 3460, -5423, 1108, 894, 4680, -5911, +1338, -1499, 4099, -5639, 7186, -8494, 7788, -4366, 822, 4601, -10525, 10568, -7495, 5960, -3337, -1054, +2048, 2615, -6841, 4836, 231, -1810, 4103, -9647, 9863, -4646, -202, 4513, -6651, 981, 8648, -10724, +8707, -8323, 3037, 7819, -15253, 12799, -5979, 362, 7216, -13326, 12886, -6351, -2662, 10274, -15359, 14363, +-9449, 3598, 5707, -12161, 10410, -4931, 1194, 1477, -7361, 10674, -6027, -1063, 6145, -9017, 8588, -3569, +-2736, 6055, -7545, 7795, -3196, -4097, 4349, 1111, -4072, 7112, -9800, 7705, -3176, -1524, 6232, -7005, +3008, -822, -829, 5083, -4819, -1756, 8750, -9831, 5342, -2455, -1015, 6848, -11141, 12265, -9254, 6235, +-4179, 1717, -2274, 3196, -2461, 3438, -4518, 1258, 3529, -4655, 6421, -8855, 6269, -2461, 961, -26, +-1350, 1930, 241, -2395, 3424, -4885, 2435, 4606, -7293, 3319, -225, 326, 166, -878, -2464, 8393, +-11213, 11916, -10880, 6075, -18, -4487, 6952, -9135, 8324, -2570, -764, 860, -2529, 1452, 5441, -11859, +11043, -8826, 9708, -6557, -551, 5484, -8653, 11320, -9177, 2421, 918, -1364, 2058, 1072, -7035, 11728, +-13429, 11878, -9711, 4460, 4336, -8712, 8840, -9644, 8228, -5645, 5415, -5491, 3672, -530, -763, 1322, +-3933, 2587, 2411, -3236, 1886, -2393, 1276, 1870, -2463, 2846, -6011, 7259, -5762, 2653, 732, -2222, +2075, 1319, -4816, 3811, -2160, 1520, -666, -2183, 6842, -8968, 8050, -5857, 2382, -134, -477, 1684, +-1944, -354, 2189, -1205, -655, 2419, -5373, 5034, 1147, -3589, 369, 706, -1257, 3298, -4499, 4198, +-1712, -3338, 10461, -14349, 10161, -1430, -4995, 6360, -5022, 1747, 1668, -3387, 7141, -8466, 2136, 7041, +-14016, 15121, -13258, 9638, 629, -9719, 12298, -14098, 11881, -2969, -4570, 4825, -1225, 109, 151, -3042, +4371, -3304, 3211, -180, -6447, 8517, -3745, -772, 1869, -2027, 326, 2946, -4715, 4981, -4011, 1950, +2425, -6259, 2998, 3599, -7554, 9775, -11009, 7607, 2751, -10327, 11422, -12926, 8898, 1412, -7157, 7410, +-5624, 2009, 3779, -7694, 5624, -3529, 1935, 4851, -10544, 9850, -5935, 951, 2107, -2511, 663, 4266, +-8664, 9097, -7582, 5071, -454, -3083, 3542, -6145, 7505, -1926, -2460, 3178, -3512, 2197, 1409, -6875, +8513, -6036, 3196, 3064, -7298, 5844, -4180, 2013, 626, -3153, 4262, -2133, -641, 4477, -8401, 8722, +-6962, 4330, -2007, 1618, -1956, 1356, 851, -1519, -2366, 4436, -76, -4555, 5355, -5541, 6952, -6905, +3692, 246, -3523, 5406, -5233, 3335, -1344, 1567, -158, -1117, -3546, 5314, -4752, 7894, -5881, -318, +3384, -1529, -3095, 3791, -2635, 1193, 2495, -3486, 2240, -2664, 3453, -653, -4714, 5369, -2063, 1355, +-3345, 2395, 1176, 93, -2449, 1101, -3002, 5386, -2645, 918, -905, -1642, 3230, -1707, 1023, -2328, +1023, 3820, -3866, -1534, 3057, 371, -3613, 4292, -5107, 5389, -1922, -1155, 4426, -8597, 6996, -981, +-5892, 10602, -12120, 12595, -6349, -4423, 9193, -9179, 7705, -3229, -3434, 6695, -4450, 132, 4521, -7347, +6836, -4419, 2110, -825, -3284, 7306, -5159, 2716, -3469, 3613, -4400, 4450, -2836, 4198, -4082, 132, +1708, -2325, 1115, 1440, -1642, 2925, -4656, 2347, 2597, -6435, 7609, -8488, 7420, -2839, -3357, 9031, +-9153, 4329, 1233, -4272, 3920, -4296, 875, 9231, -15226, 14320, -10633, 4553, 3064, -8301, 7846, -3622, +-2206, 8626, -11039, 7451, -2700, -527, 5450, -9643, 7228, -1246, -1038, 1122, -2925, 2934, -883, -628, +1195, 253, -2065, 6464, -10374, 6294, -3120, 3607, 675, -4951, 1816, 3816, -3835, 3991, -7748, 6914, +-1200, -5735, 9661, -8314, 5130, 389, -5480, 9303, -13709, 12537, -5301, -2092, 5213, -4221, 3953, -1529, +-4752, 7046, -5353, 6659, -6953, 1460, 3168, -3762, 2984, -1353, -699, 1519, -773, 1916, -5028, 4865, +-660, -1348, -2265, 4215, -2828, 3153, -3439, 4318, -5044, 3377, -2158, 1935, -3244, 3293, -1750, 1891, +-728, -7, -1287, 2207, -3358, 2213, -1385, 3815, -4785, 2379, 1242, -2628, 434, 3488, -4792, 1312, +-491, 3161, -1743, -1359, 922, 871, -2998, 6745, -8428, 6968, -6976, 6648, -2693, -133, -599, 214, +-235, 3938, -6420, 5001, -884, -1564, -578, 476, 1331, 293, -2664, 3796, -4718, 4891, 211, -6467, +5045, -2575, 2318, 1981, -7942, 9167, -5410, 1993, 791, -4278, 4288, -418, -4703, 9246, -12851, 12565, +-5619, 44, 851, -2972, 3571, 1687, -7123, 5814, -907, -1537, 3526, -7583, 8435, -4048, 1281, -555, +-1533, 1809, 767, -3854, 3930, -2221, -360, 8525, -14662, 12014, -9041, 8321, -4892, 268, 1253, -1911, +1826, 2411, -5832, 5403, -2585, -1130, 3783, -8055, 10844, -7689, 2357, 2111, -4022, 3859, -913, -3987, +4724, -2257, 109, 2833, -6424, 8924, -9639, 7157, -78, -4690, 1621, 4113, -7528, 8034, -7350, 4797, +-114, -4341, 8990, -10517, 6929, -2642, -226, 1610, -2306, 982, 2194, -3336, 3560, -3788, 1501, 3395, +-6223, 5465, -6289, 7213, -6421, 5117, -1649, -1896, 3655, -1247, -4718, 4838, 37, -2163, 3545, -7194, +8889, -6564, 5024, -4153, 1109, -98, 2587, -1377, -4068, 4320, -2696, 6715, -8934, 5785, -3149, 3001, +-2088, -371, -1005, 4998, -4383, 443, 1283, -2819, 6173, -6459, 5616, -7627, 6506, -902, -2173, -230, +577, 3376, -1349, -3370, 2266, -309, 143, 1714, -5654, 7669, -7160, 8178, -7762, 2237, 1757, 429, +-2615, 2605, -4334, 4121, 648, -5295, 6365, -4347, 2114, -1146, 1285, -2352, 3479, -4504, 6108, -7361, +4762, 309, -2676, 4397, -8863, 11183, -6493, 1480, -1823, 1477, 6, 679, -2497, 5895, -8582, 7468, +-3298, -892, 4022, -8898, 11593, -8639, 4577, -685, -2683, 2917, -532, -2135, 4070, -4562, 3195, -685, +-3744, 6244, -4150, 3154, -1046, -4974, 5614, 182, -4301, 4187, -2362, 574, 1010, -1584, 915, -1010, +265, 4434, -6198, 711, 1945, -738, 3083, -6993, 7207, -4010, 2122, -438, -3749, 4004, 1034, -3959, +4429, -6317, 5508, -1131, 91, 886, -6033, 8215, -2532, -5381, 5900, -1602, 1341, -975, -3813, 6367, +-3474, 646, 2217, -7680, 7534, -1485, -921, 1674, -3896, 2330, 3820, -7868, 7540, -6806, 5048, 886, +-7207, 7157, -2091, -2429, 6072, -8302, 7617, -5764, 4136, -714, -6607, 10681, -4738, -1135, 742, -3609, +8552, -6795, 3128, -1310, -1034, 1238, -5, -1291, 4436, -7085, 7627, -5993, 3774, -3879, 2630, 2836, +-5664, 2156, 519, 588, -1186, 272, 1746, -3521, 3883, -4267, 4368, -4451, 4310, -2371, 1620, -3176, +4427, -5825, 8035, -9131, 7551, -4182, 919, 1290, -2567, 2923, -3632, 3793, 215, -4962, 3360, 537, +822, -1742, -2737, 4237, -1246, -1096, 4194, -6730, 6983, -6803, 5859, -4485, 3358, -2925, 3890, -4201, +2253, -2086, 6150, -5510, -774, 1301, 2126, -2190, 629, -182, -500, 2902, -3929, 4403, -7623, 6559, +944, -4855, 3894, -4956, 5726, -2036, -931, -1166, 3837, -2716, 3342, -9455, 12634, -9472, 5509, -1297, +-3512, 4390, -2919, 4602, -4707, -582, 5005, -4068, -234, 1586, -863, 2861, -3041, 757, -55, -1959, +5694, -6210, 3583, -3551, 4025, -1242, 1504, -4303, 2391, 1393, -973, -2081, 1606, 1792, -991, -4421, +7693, -5212, 354, 2703, -4006, 4412, -3072, -10, 3991, -7918, 8397, -5365, 2203, 1219, -4491, 4722, +-2478, 851, 1404, -5309, 6245, -5126, 3569, 1140, -4647, 3932, -1070, -1470, 769, -1290, 4568, -4519, +1188, 2188, -4254, 3181, 496, -2907, 3621, -5997, 6685, -1669, -3156, 2669, -274, -725, 2676, -6973, +8267, -3511, -2059, 5497, -8336, 8582, -4795, -546, 4170, -6342, 6733, -1049, -4204, 2087, -1131, 2345, +713, -5747, 6836, -5047, 5640, -4410, 79, 1383, -2322, 2236, 859, -3806, 4572, -1625, -84, -1760, +294, 3656, -3084, -878, 2015, -2451, 4960, -4128, 982, -132, -550, 1403, 279, -4150, 5556, -2779, +742, 186, -3712, 4787, -350, -2920, 3626, -4038, 5583, -6601, 3217, 99, -1072, 413, 4186, -6103, +3400, -2075, 2516, -2241, -769, 1990, -153, -112, -148, 51, 1485, -2323, 860, -1598, 910, 2080, +-2230, 972, 546, -1435, 983, 537, -1282, -1181, 1884, -338, 1814, -3973, 6240, -8906, 7039, -1243, +-2623, 2288, -452, 1038, -861, -3161, 5008, -2887, -365, 3146, -3844, 5038, -5539, 4063, -3355, 650, +2915, -4053, 4407, -3736, 1332, 292, 2542, -3724, -1045, 1820, 2216, -4655, 4258, -2576, 2669, -1072, +-924, -304, -2160, 6483, -6159, 4045, -3300, 2757, 1292, -6370, 6954, -5463, 3666, 589, -4155, 3578, +-1241, -934, 3694, -7327, 8144, -4780, 1277, 3667, -9461, 8711, -2269, -1776, 946, -1634, 3327, -56, +-2790, 3245, -4775, 5256, -2495, -1975, 3035, -3265, 5115, -2798, -194, 86, 1433, -2437, 863, -2371, +5345, -3001, -162, 1455, -3226, 4743, -4989, 4344, -3428, 1361, -6, 2804, -7360, 8912, -9150, 7970, +-1765, -4530, 6191, -6286, 6258, -4097, -812, 4198, -3970, 1043, 4376, -9513, 11300, -7341, 2092, 185, +-4521, 9299, -12061, 11904, -6688, 3264, -2910, 2473, -2149, 691, -2545, 5457, -3860, 1659, -221, -1923, +4736, -4531, 926, -1664, 5693, -5195, 1331, -64, 956, -448, -234, 1965, -5851, 6188, -1446, -1899, +1904, -1680, 844, 1271, -4036, 6759, -7812, 6667, -1413, -4271, 4355, -2505, 2090, -1291, -2070, 3728, +-15, -509, 142, -5158, 6862, -2513, -2371, 2552, -617, 2425, -2339, 713, -1203, -462, 2091, 541, +-4477, 4237, -1242, 1293, -1493, -970, 2373, -1306, 1031, -2168, 359, 1702, 299, -1219, 623, -2140, +1796, 851, -2046, 2683, -3862, 6449, -6147, -337, 2537, 201, 250, -21, -2092, 2248, 59, -1588, +1406, -3744, 4768, -2623, 1760, -684, -1147, 3207, -3163, 1456, -2527, 2658, -1577, 1069, 294, 175, +-897, 163, 778, -2194, 711, 1840, -444, -1198, -850, 2221, 710, -2518, 1276, -2122, 3440, -1501, +-1350, 3920, -4977, 3406, -2424, 1049, 1658, -3731, 5372, -2068, -3306, 2944, -1926, 1650, 968, -3854, +4767, -3627, 3225, -934, -3004, 2630, -66, -1039, -104, -103, 1684, 1166, -2789, 1510, -2881, 3840, +-3016, -8, 2736, -1606, 249, 2216, -5251, 3808, -2948, 5517, -2644, -5784, 8495, -6108, 6591, -7079, +2718, 1978, -3064, 2592, -1813, -178, 2563, -1243, -3765, 5760, -7019, 9521, -7551, 4278, -3744, 3687, +-1699, -359, -2722, 4287, 95, -3239, 4515, -5248, 4816, -3226, 2642, -3875, 1120, 1586, 1506, -3209, +743, 1962, -1978, 1700, -4955, 6709, -6135, 7559, -7019, 2678, -133, 760, -1646, 2246, -3220, 3111, +-1067, -153, 209, -3207, 8228, -8757, 3115, 1244, -1855, 3602, -3382, 782, 1252, -5638, 7429, -3017, +-2265, 5126, -5369, 6560, -6719, 3249, -2046, 2602, -1874, 1335, -2208, 4198, -3161, -713, 3808, -5238, +4126, -2364, 1676, -1195, 157, 2058, -1852, -1466, 2883, -2978, 2322, 1555, -5270, 6532, -7817, 8598, +-5720, -180, 2164, -628, 2444, -3311, -141, 3190, -2306, -423, -885, 1276, 2645, -3289, 2241, -1137, +-1254, 1207, 369, -1127, -725, 3542, -3725, 4547, -5862, 3813, 234, -1122, -981, -937, 3370, -151, +-2349, 2131, -2414, 1757, 917, -2739, 515, 337, 3394, -2197, -3237, 2921, -389, 201, -235, -388, +1789, -2027, 1996, -1865, -1538, 4098, -2885, 498, 782, -858, 1171, 1387, -3306, -200, 123, 4094, +-4423, 220, 4361, -4490, 2476, -725, -933, -34, 565, 1588, -2490, -604, 4067, -1916, -1210, 903, +-1172, 1301, -681, 331, 590, -1011, 2847, -5101, 2427, 1901, -4490, 4699, -1262, 158, -2232, 1075, +1828, -3500, 1794, 3237, -6251, 6270, -5009, 2513, -88, -1171, 3023, -5615, 3599, 316, -28, -398, +306, -1132, 994, -929, -22, 802, -636, 1665, -1697, 1654, -2618, 1465, -1848, 6745, -10243, 7430, +-1879, -171, 880, -4594, 6812, -4234, 1151, 97, -2277, 5587, -4539, 454, 965, -3231, 5518, -3011, +124, 589, -1966, 5321, -7011, 3783, -909, 516, 674, -1290, -1062, 3486, -3403, 4836, -5926, 994, +3043, -2151, 831, -299, -485, 2330, -1338, -3076, 3103, -511, 1869, -2707, -554, 4479, -6508, 5178, +-2110, -537, 1813, 676, -2623, 1102, -2974, 6959, -6401, 2834, -410, -1074, 2589, -2314, 1458, -1021, +-187, 1102, -2067, 1461, 812, -1903, 2734, -879, -3094, 4326, -4350, 5245, -7740, 8621, -4558, 583, +357, 367, -1590, 1243, 341, -1334, 937, -348, 657, 15, -1959, 2770, -2184, 367, 2630, -3483, +1786, -8, -2543, 5776, -8083, 7354, -4952, 4137, -1215, -3691, 3709, 599, -3511, 3379, -3723, 4513, +-3565, 1779, 1530, -4126, 4194, -2921, 1084, -1571, 631, 3387, -3006, 259, -354, 1054, -259, -55, +-2697, 4142, -1538, 1074, -2339, 253, 894, 1655, -2731, 2421, -3962, 4559, -909, -3860, 4361, -2311, +2440, -3009, 784, 1086, -65, 223, -694, -634, -509, 2293, -1402, 383, -2073, 4904, -3394, 1690, +-3949, 3294, 490, -2204, 1469, -1821, 3466, -2201, 6, 463, -565, -540, 2606, -3030, 468, 1908, +-1999, 3186, -4708, 3065, 18, -1135, 477, 642, -2233, 3244, -3578, 2565, -102, -1615, 2631, -2096, +39, 461, -316, 1590, -1984, -1144, 3794, -3701, 3221, -821, -996, 764, -2667, 4567, -3929, 997, +1327, -1562, 2697, -2461, -652, 2987, -3652, 3224, -2434, 1077, 579, -2502, 3972, -2721, -240, 2755, +-1642, -1782, 1068, -269, 3841, -5164, 1319, 2104, -2400, 2192, -589, -2446, 3316, -1477, -1144, 1956, +-3080, 4678, -2667, 691, -298, -2799, 7006, -6130, 793, 458, 743, 1346, -3259, 3072, -2128, 638, +1896, -2740, -878, 2479, 632, -1287, -2294, 3618, -438, -913, -226, -1452, 3416, -1917, 1301, -4497, +5010, -1372, -1000, 2739, -3822, 1825, -307, 2419, -2165, -3401, 5621, -1350, -4074, 6381, -5819, 6468, +-5209, 592, 2419, -4785, 6247, -4298, 629, 1074, -127, 41, 590, -2731, 3180, -2794, 3124, -3474, +869, 3658, -4605, 2524, 27, -1230, -322, 1246, 224, -1170, -978, 3651, -2831, 385, -108, 671, +348, -632, 65, -550, 1199, -2682, 4877, -6002, 5408, -4980, 5297, -1824, -2649, 3001, -1167, -458, +-123, -326, 2775, -1491, -1647, 3985, -5775, 5400, -2133, -1057, 1203, -3159, 6225, -4642, 3517, -5120, +4759, -340, -3117, -128, 3215, -2460, 3363, -4576, 3755, -3180, 2369, 1351, -5253, 4928, -2701, 3311, +-4603, 892, 2867, -1452, 1039, -2750, 2407, -1646, 3418, -4689, 2455, -975, 1469, -1978, 3229, -5121, +5479, -2091, 1610, -5202, 1538, 5403, -5139, 767, 1254, -703, 1641, -2041, 852, -485, -1317, 3621, +-4170, 2187, 750, -1427, 3594, -6986, 6265, -4563, 4752, -3405, 328, -763, 4953, -7408, 5893, -3787, +2620, -666, -249, 1038, -4407, 4123, 990, -3564, 2102, -333, -432, 1125, -1603, 1717, 466, -4248, +5325, -5248, 3379, -886, 1981, -1786, 1616, -5333, 7176, -6171, 4674, -3812, 2436, 1162, -2969, 1018, +1721, -3119, 2813, -1132, -100, -1029, 963, 1862, -1637, -1898, 2759, -1072, 1261, -2395, 1306, 582, +-178, -1117, 1081, -2886, 4313, -1821, 902, -2190, 1813, -800, 2279, -5382, 4981, -3328, 3768, -3369, +335, 3948, -3793, 1542, -1510, -1967, 4250, -1792, 1600, -1203, -2078, 3647, -914, -2296, 1195, -379, +3329, -3963, 675, 694, 331, -390, 1106, -2973, 3104, -2422, 2843, -2658, 539, 913, 1349, -3778, +1432, -667, 4094, -2347, -976, 81, -714, 2436, -2842, 827, 2125, -2136, 2419, -1828, -428, -74, +487, 1120, -2537, 35, 4523, -4312, 3282, -3506, 2327, -2228, 2328, -1941, 1448, -1320, 2424, -612, +-2692, 2565, -1191, 609, -93, -704, 579, 936, -878, -792, 1092, -292, 73, -1893, 4748, -4941, +2823, -217, 351, -3071, 578, 2810, -936, 427, -259, -1122, 1086, -1228, 672, -616, -125, 3302, +-3937, 2169, -39, -1847, 2629, -2480, 88, 827, 385, 427, -1251, 74, 3303, -6085, 5654, -4620, +1608, 1002, 919, -410, -3197, 3017, -357, -1030, 253, -74, 919, 1428, -3323, 1615, -1356, 1984, +-696, -1553, 1935, -404, 715, 64, -1618, -1641, 4945, -5082, 4584, -5320, 6329, -2785, -1557, 2354, +-2426, 663, 2454, -3890, 2261, 535, -1595, 4276, -6736, 4157, -1579, 509, 2274, -5355, 4713, -657, +-454, -886, -230, 244, 1171, -1069, 1579, -2164, 2042, -921, -754, -1588, 4220, -2888, 1946, -1332, +379, 526, -1661, 1828, -2334, 1330, 859, -1263, 1731, -456, -2478, 3627, -2536, 219, -856, 1154, +2579, -4049, 2482, 25, -2345, 2614, -2211, 162, 1918, -2114, 3549, -3609, 981, 599, -2140, 2547, +-137, -2257, 2814, -1031, -876, 1399, -2390, 2358, -1719, 1462, -57, -1692, 3628, -2139, -2812, 2962, +-1006, 1414, -1506, 800, 449, -277, 156, -17, -2605, 1947, 703, -981, 1910, -2591, 2712, -2034, +1101, -1951, 188, 2645, -1796, -173, 892, 796, -2165, 1678, -2511, 1902, -638, 2177, -1424, -1795, +2518, -365, -2063, 1805, -1675, 2206, 16, -1779, 1757, -1432, 863, -61, -2528, 2905, -1242, 1810, +-205, -1516, 376, -124, 487, -724, -1567, 4170, -2732, 1916, -1655, 667, -503, -898, 2066, -2674, +2163, 1281, -2815, 2785, -4452, 4400, -1227, -1627, 929, 474, 21, 1624, -3593, 2805, -2390, 1065, +424, 530, -1233, 1331, -1276, 2061, -2851, 325, 1317, -1118, 1166, -414, 844, 251, -1762, 264, +-418, -37, 1606, -1097, 1060, -424, -1336, 4457, -7400, 6305, -4621, 3033, -558, -514, 1471, -1777, +385, 2167, -3813, 1910, -320, -216, 3623, -6299, 4565, -744, -1503, 1331, -2212, 2369, 1121, -2605, +1273, -154, -1956, 2882, -2812, 3209, -3188, 3114, -931, -462, -1591, 2403, -1605, 288, -400, 420, +2149, -1903, 1015, -1892, -316, 2216, -1228, -372, 258, 422, 2024, -2877, 322, 786, -1351, 3054, +-4591, 2620, 1138, -1296, 142, -13, -546, 1062, -2407, 4002, -3951, 2115, 1916, -3455, 404, -354, +1453, 626, -971, -110, 1208, -2162, 1316, 377, -3998, 6259, -4307, 2602, -1504, -410, 1899, -1018, +136, -1785, -36, 3497, -2705, -254, 3634, -3541, 1440, -2022, 1762, -764, -366, 2455, -1826, -177, +424, 236, -1055, 1635, -2626, 3336, -2529, 2250, -2140, 180, 1141, -254, -1422, 1795, -1336, 1409, +1675, -4618, 3144, -3595, 4788, -3367, 544, 3323, -3791, 1743, 201, -2122, 1666, -1198, 1043, 779, +-3202, 3731, -1373, 2356, -4225, 1273, -144, 1412, -2303, 1874, -25, 1721, -2633, -143, 70, -365, +3250, -3115, 1554, -2170, 3133, -1872, -952, 1659, -863, 1533, -695, -1073, -408, 2749, -2665, 2091, +-2949, 1976, -837, 2376, -999, -1243, 191, 2580, -4914, 1679, 985, 1048, 144, -1865, 1374, -800, +386, 343, -3009, 2066, 1170, -590, 706, -1918, 2036, -783, -1256, 2067, -4801, 5924, -1169, -2281, +2669, -2464, 1331, -600, -380, 2645, -4757, 5630, -3185, -1166, 1635, 211, 292, -885, -749, 1306, +617, -636, 275, -1829, 1070, 1000, -2722, 2036, 1372, -1621, 1985, -2454, -704, 1346, -1878, 4278, +-4486, 3182, 249, -3313, 4256, -3387, -108, 1607, -1407, 3117, -4778, 3437, 119, -1033, 754, -2286, +1495, 831, -1343, 614, 39, 521, -448, -1059, 411, 781, -563, 1814, -1978, -347, 720, 570, +-535, -663, -968, 3118, -1484, 1721, -2264, -1230, 3655, -3117, 264, 952, -1023, 3797, -2925, -1041, +2126, -2182, 2860, -3628, 700, 3597, -3763, 3473, -3682, 1707, 598, -565, -56, -1228, -44, 3333, +-2305, -85, -15, -456, 2324, -2868, 1482, -1161, 2829, -1893, -560, -921, 1674, 362, -715, 845, +-1954, 2963, -1103, -1870, 619, -216, 1996, -1170, -1511, 4158, -4271, 4301, -4191, 225, 2149, -2529, +3786, -3539, 1190, 1535, -1188, 3, -37, -2337, 4001, -3093, 2454, -2025, 1219, 374, -1336, 1484, +-2358, 1981, -779, 1717, -2775, 1922, -810, 820, -2353, 2431, -868, 1621, -1814, 621, -196, -1305, +1858, -996, 653, -1154, 2240, -1743, 2533, -3846, 1553, 478, -904, 1033, -2262, 3483, -1067, 36, +-482, -846, -352, 2614, -2813, 1810, -1649, 2991, -1612, -789, 365, 88, -54, 607, -1131, 1193, +-860, 1137, 66, -3525, 3943, -1896, 2052, -1663, -1246, 2769, -139, -1722, -1199, 1087, 2081, -148, +-3255, 4064, -3246, 1906, -264, -1874, 893, 973, -725, 1947, -3671, 3348, 288, -3603, 2667, -2665, +2213, 1351, -2500, 1433, -578, 21, 1185, -3203, 2517, -621, -152, 2958, -5804, 3961, -467, 292, +-1617, 2, 2211, -811, -1196, 1140, -1054, 1023, -507, -75, -282, 317, 527, 1065, -1894, 89, +216, -723, 1348, -1710, 1920, 912, -2977, 2552, -2277, 1552, -965, -161, 1365, -1450, -297, 4439, +-5696, 3259, -2029, 902, 1678, -3551, 2581, -595, 384, -510, 304, -167, -356, -545, 2063, -584, +-1941, 1852, -496, -49, -444, 267, 519, 422, -1804, 2968, -4526, 4428, -1903, -929, 648, -343, +2769, -2243, -57, 22, 248, 535, -1554, -1219, 5271, -4206, 1843, -1150, 374, 216, -1426, 3387, +-3374, -400, 3384, -1261, -1340, 585, -497, 3203, -4009, 1513, -697, 1209, 453, -1238, -560, 1125, +176, -1661, 1742, -845, 1487, -1264, 953, -3895, 3520, 545, -874, -1588, 2199, 279, -2101, 1477, +-1175, 973, -1505, 2880, -2512, 918, -225, 697, 390, -2430, 1465, 404, -793, 1096, -1849, 2070, +449, -3759, 3501, -2144, 2179, -1631, 448, 946, -2488, 2524, -531, -1431, 851, 146, 875, -1252, +269, 1322, -1920, 847, -1277, 1368, 391, -2009, 3361, -1259, -1131, -380, 530, 642, -206, -728, +1407, -760, -379, 786, -676, 264, 474, -1458, 1947, -2678, 2231, 1014, -2831, 2518, -2575, 1445, +1233, -3876, 4239, -1409, -545, 915, -1742, 377, 840, -21, 2542, -5421, 3089, 1161, -2529, 1130, +-1884, 3254, -861, -1554, 1338, -370, 730, -540, -1567, 1437, -188, -336, 1857, -2289, 1616, -1154, +1162, -676, -2058, 2523, 1146, -3021, 1384, -254, 811, -45, -1172, 905, -1607, 1786, 594, -1969, +786, 609, -718, 563, -1888, 1666, 1578, -2623, 1779, -1785, 648, 361, -1219, 1596, 611, -1852, +1258, -650, -419, 447, -32, 1091, -1801, -869, 3912, -3196, 1605, -430, -937, 1596, -2640, 2345, +-79, -2002, 3200, -2373, 1257, -1068, -618, 2043, -1222, 138, 918, -2304, 2775, -2600, 1481, 544, +-1993, 2180, -946, 10, -264, -446, 2151, -3220, 1317, 759, 457, -917, 791, -1922, 1957, -1573, +989, -379, -551, 1610, -35, -1899, 1553, -1038, 1844, -1678, -986, 1403, -181, 1601, -2216, 663, +760, -1741, 2112, -2087, 1041, -299, 1481, -874, -1670, 486, 2221, -1993, 1581, -2445, 3026, -953, +-2009, 1184, -559, 1737, -223, -2167, 2387, -1564, 1930, -791, -1746, 365, 665, 488, 313, -1676, +2256, -981, 0, -372, -789, 411, 1217, -1201, 921, -1290, 2673, -1947, -134, -303, 6, 1300, +-316, -1959, 2778, -1207, 463, -1301, 458, 723, -241, -429, 2213, -4046, 3132, -1583, 487, 331, +-1038, 1917, -589, -1327, 2342, -3608, 3166, -699, -2197, 2673, -1372, 936, 1136, -1869, 876, -2022, +1739, -695, -112, 684, 1573, -2970, 2998, -2851, 1363, -861, 1218, -1238, 137, 709, 1302, -2076, +301, 224, -396, 1603, -2070, 776, -175, 1408, -371, -2524, 2218, -1141, 1208, 391, -1220, -236, +1728, -1287, -274, -1618, 3769, -1965, 278, -257, 941, -878, 1586, -2652, 0, 1156, -201, 1732, +-2329, 1269, 670, -1485, 621, -1322, -653, 4249, -2774, -109, 388, -773, 3201, -4147, 2518, -2080, +1084, 1933, -2595, -535, 3132, -2333, 1293, -2414, 1826, 879, -1417, 1335, -1933, 983, -7, -672, +347, 413, -99, 1771, -1744, -813, 59, -120, 2825, -3833, 1702, 309, 705, -476, -282, -808, +1084, -1664, 1616, -1295, 713, 2096, -2664, 1605, -1591, 27, 1452, -1246, 152, 511, -197, 592, +-1222, 1097, -1096, 268, 1561, -1757, 462, -720, 2261, -2039, -137, -10, 1094, 31, 68, -787, +767, -716, 71, -314, -1331, 3169, -2061, 2587, -1821, -902, 424, 1431, -1804, -377, 1335, 182, +-306, -279, 1334, -1341, 325, -390, -483, -865, 3352, -1932, 1670, -3032, 1655, 658, -1576, 1373, +-2688, 3857, -1068, -585, -949, 89, 1150, -18, -1179, 2383, -3284, 3297, -715, -3027, 2834, -1631, +2532, -3200, 1186, 2082, -1286, 75, -56, -2827, 3353, -1835, 1617, -719, -575, 2097, -384, -1854, +-409, 1238, -593, 2432, -4709, 4244, -568, -273, -759, -1088, 1673, -671, 113, 1232, -1694, 327, +2042, -2979, 1481, -2119, 3332, -803, -870, 473, -328, 291, -789, -28, 637, 64, 448, 437, +-2511, 3154, -2437, 1857, -2504, 371, 1131, 796, 50, -789, 173, 34, -934, -551, 1590, -1319, +1227, 1227, -1259, -647, 97, -136, 1300, -2309, 1198, 2145, -3258, 2281, -1698, 1161, -37, -1117, +1093, -400, -733, 2602, -2711, 1864, -2333, 749, 2100, -2668, 1689, -527, 1069, -633, -1475, 399, +279, 451, 192, -18, -476, 1169, -832, 590, -2854, 1679, 946, -461, -476, 1194, -399, 651, +-2323, 1273, -701, 61, 2092, -2093, 932, -280, 104, 685, -2509, 1639, 791, -697, 253, -1302, +677, 2115, -2760, 1081, -1390, 2168, -1545, 1763, -938, -821, 240, 1164, -1932, 1, 1516, 1264, +-1713, -42, -199, 163, -638, 422, -47, 468, 924, -937, -327, -131, 246, 279, -1156, 1692, +-2448, 2878, -362, -949, -762, 1581, -1573, 1534, -2183, 2925, -2388, 1903, -183, -2267, 1351, 396, +-225, -88, -401, 1884, -1879, 370, 32, -846, 1399, -1417, 1269, 449, -836, 1036, -2237, 1569, +-1135, -585, 2446, -255, -1732, 2240, -2417, 2637, -3217, 1543, -91, -45, 699, 57, -1438, 2225, +-1935, 446, 675, -1979, 2112, -803, 153, 1104, -1670, 485, 391, -2063, 3151, -2349, 1493, 1067, +-3261, 2645, -2750, 2892, -1860, 322, 897, 234, -827, 1128, -2856, 2528, -1542, 787, -207, 265, +1229, -1373, 661, -1064, -214, 647, 303, -787, 530, 739, -302, -60, -737, 318, -338, -66, +900, -782, 274, 2076, -3566, 2909, -3280, 2890, -1293, -11, 1506, -1877, 1549, 81, -2989, 2117, +265, -286, 1254, -2172, 1451, -515, -357, 847, -1807, 1867, -662, -303, 953, 401, -1043, 68, +-939, 1070, -1033, 1088, 729, -745, -244, 711, -1029, 202, -99, -537, 1692, -1097, 1084, -1443, +821, 454, -2117, 2290, -1579, 949, -196, 76, 318, -173, -1239, 1404, -1888, 2783, -1160, -764, +2112, -2765, 2030, -2402, 1453, 1592, -2488, 1498, -257, -430, 1072, -1676, 1146, -869, -176, 788, +-380, 2052, -2403, 1424, -1480, 700, -1927, 3236, -1681, 1133, -1249, 692, 178, -1307, 890, -314, +648, -200, -65, -660, 629, -467, 1607, -2460, 1538, -221, -961, 2335, -2713, 2582, -1738, -438, +76, 574, 721, 638, -2334, 3345, -4820, 3232, -1011, -86, 755, -946, 2182, -1869, 123, 459, +-435, -66, -250, -313, 1772, -1659, 1743, -556, -1571, 1868, -2511, 2398, -719, -713, 2041, -1273, +-813, 895, -947, 2349, -3211, 2449, -51, -1683, 1014, 265, -791, 966, -1624, 999, 1065, -2009, +2460, -1385, -32, -284, -1651, 2304, -341, 401, 730, -1222, -456, 633, -1215, 1653, -1849, 2048, +6, -1862, 1962, -808, -307, 183, -248, 556, -1716, 1988, 1, -308, -23, -708, 389, 343, +-1748, 1678, 1020, -624, -1612, 890, 32, 435, -2067, 3166, -1346, -537, 1540, -1957, 1307, -1550, +839, 1055, -2246, 2305, -42, -1467, 2310, -3144, 553, 1555, -1999, 2293, -1165, 787, -76, -1035, +907, -1030, -372, 2936, -3639, 1534, 1059, -318, -646, -403, 629, 211, -1809, 1865, 279, -1581, +2427, -2769, 2154, -2556, 1743, 170, 35, 365, -1108, 115, 716, -1728, 869, 1637, -1806, 1436, +-1278, 1312, -1611, 279, 1293, -1883, 50, 2505, -2267, 1802, -1479, 419, 1288, -3615, 3171, -1940, +1377, 20, -275, 444, -79, -1744, 2145, -1726, 1020, -510, 580, 987, -2610, 2049, -1137, 558, +-280, 692, -905, 897, -805, 1002, -2432, 2289, -750, 478, 13, -802, 1456, -912, -942, 488, +738, -888, 1132, -1961, 3757, -3673, 1327, 1322, -2775, 1452, -1766, 3214, -1417, -677, 1194, -191, +-777, 716, -1999, 2385, -1049, 580, -582, 629, 148, -1258, 316, 816, -927, 1346, -536, -1140, +1375, -1295, 1461, -1796, 1414, 573, -1857, 1645, 214, -1883, 467, 391, 188, 352, -2159, 3831, +-2392, 52, 1011, -1965, 1757, -889, -1482, 3214, -1676, 1012, -467, -825, 1222, -2100, 1096, 1101, +-1555, 1152, 302, -1152, 377, -493, 941, -316, -1118, 2853, -3292, 2141, -771, -98, -180, -157, +1443, -842, -408, 553, -391, 573, -584, -967, 1290, -103, -561, 1776, -1543, 1261, -1728, -10, +985, -1398, 1404, 869, -2401, 2862, -2351, 1561, -1154, -989, 1907, -830, -687, 3227, -3714, 1947, +-614, -607, 2437, -3847, 2475, 143, -356, -539, 93, 611, -50, -1417, 1426, 689, -1768, 1518, +-1620, 1249, -525, -527, 774, 385, -1346, 2518, -3052, 2965, -2412, 240, 732, -1550, 2736, -2129, +1988, -1164, 163, -451, -287, -1007, 4007, -4364, 2386, -262, -23, 251, -2288, 3745, -2479, -559, +1816, -773, -307, 910, -1994, 3440, -2853, 631, 142, -257, 1164, -1356, 498, 585, -1254, -452, +1993, -1183, 1724, -2754, 3304, -4237, 2513, 98, -1079, 619, 478, 446, -1792, 1389, -323, -10, +-1341, 2332, -2420, 2110, -1204, 490, 963, -1947, 1039, -342, -119, 701, -1089, 905, 1128, -3696, +3726, -2248, 1723, -1661, 933, 743, -2059, 1353, 197, -1249, 820, 356, -440, 73, -351, 1802, +-1939, 449, -699, 7, 1719, -2354, 2723, -428, -1028, -803, 888, -289, 895, -1684, 2058, -1002, +-684, 1258, -429, -56, 299, -1469, 2281, -2582, 1372, 1307, -2543, 2912, -2557, 333, 1627, -2765, +3008, -1160, -172, 74, -343, -768, 1312, -758, 3135, -4460, 2029, 697, -1763, 647, -706, 1850, +-859, -953, 1302, 202, -578, 314, -1432, 1403, -1142, -7, 2122, -1671, 1198, -1729, 1433, -149, +-1819, 1194, 1748, -3120, 2219, -1237, 1476, -1031, -54, 701, -1690, 1375, 440, -1219, 480, 890, +-1634, 1515, -2082, 1403, 1275, -1983, 1766, -1558, -23, 141, -626, 1613, 585, -2416, 2025, -1099, +338, -769, 917, 386, -1264, -1063, 3612, -2979, 1862, -377, -879, 1070, -2315, 2044, -294, -789, +1806, -1399, 953, -1083, -716, 2058, -1048, -340, 1550, -2514, 2630, -2808, 2328, -275, -1658, 1961, +-578, -622, 689, -1341, 2819, -3508, 1350, 798, -474, 476, 90, -1460, 1917, -2131, 1006, 225, +-783, 1280, -317, -835, 1118, -1426, 2542, -2625, 28, 900, -333, 1104, -1160, 657, 371, -2017, +2426, -1937, 728, -250, 1367, -580, -1389, -8, 2097, -1809, 1622, -2085, 2311, -493, -2260, 1334, +154, 449, 113, -1758, 2446, -1912, 1476, -54, -1378, -160, 855, -433, 1127, -1698, 1998, -624, +-333, 122, -1089, 204, 1286, -1258, 1437, -1921, 2697, -1656, -84, -215, -231, 1147, -125, -2042, +2999, -1524, 584, -1351, 866, 340, -309, -493, 2348, -3633, 2524, -1324, 502, 277, -1087, 1668, +35, -1849, 2333, -2894, 2406, -560, -1862, 2177, -937, 212, 1907, -2196, 1120, -1881, 1229, -420, +-386, 915, 1408, -2739, 2851, -2812, 1680, -1367, 1219, -895, 190, 458, 807, -1302, 327, -269, +64, 1107, -1785, 832, -154, 1152, -492, -1896, 2034, -1462, 1230, 296, -893, -236, 1583, -1257, +-199, -1433, 3139, -1671, 231, -124, 1141, -1223, 1665, -2672, 406, 962, -876, 1961, -1670, 1014, +367, -1416, 919, -1402, -675, 3934, -2626, -27, 443, -627, 2665, -3696, 2395, -1898, 880, 1573, +-2054, -480, 2876, -2316, 1164, -2047, 1699, 419, -957, 1149, -1501, 684, 22, -902, 444, 619, +-420, 1824, -1698, -286, -337, -293, 2955, -3891, 1743, 335, 482, -148, -570, -357, 960, -2043, +1962, -1566, 955, 1884, -2713, 1911, -1627, -3, 1305, -1237, 401, 144, -45, 735, -1411, 1268, +-1122, 209, 1338, -1566, 622, -704, 1874, -1665, -221, -23, 1010, -157, 293, -747, 807, -604, +-270, -50, -1394, 2999, -1840, 2128, -1335, -864, 200, 1554, -1917, -127, 1091, 56, -171, -336, +1471, -1282, 153, -269, -534, -715, 3045, -1961, 1781, -2756, 1511, 444, -1411, 1331, -2552, 3677, +-1102, -464, -973, 273, 885, -57, -1077, 2398, -3153, 2988, -575, -2837, 2728, -1645, 2284, -2963, +1256, 1849, -1203, 100, 78, -2844, 3198, -1727, 1374, -478, -559, 1918, -369, -1697, -350, 1146, +-677, 2387, -4589, 4239, -643, -259, -750, -944, 1598, -827, 240, 1165, -1597, 331, 1883, -2832, +1431, -2034, 3159, -808, -667, 371, -356, 361, -879, 23, 611, 105, 327, 495, -2427, 3109, +-2422, 1800, -2440, 370, 1070, 779, 7, -642, 141, -11, -885, -607, 1627, -1355, 1229, 1233, +-1302, -549, 49, -141, 1278, -2252, 1152, 2136, -3236, 2262, -1675, 1162, -71, -1098, 1084, -386, +-738, 2582, -2689, 1853, -2304, 718, 2083, -2649, 1690, -520, 1055, -628, -1474, 401, 274, 448, +192, -18, -476, 1169, -836, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 34, -51, -186, 2877, 2496, -2716, 1217, -3229, -1375, +9495, -7091, -8192, 8784, -1024, -13204, -337, 15130, -4912, -26166, -9711, 17453, 16868, -1440, -15337, -22725, +-11211, 948, -17381, -29201, -12249, 12609, 5916, -21318, -28701, -21067, -16683, -12929, 906, 6854, -7415, -16095, +-10975, -12854, -11269, 5503, 15650, -2658, -25988, -24032, -11036, -3333, -218, 4881, 12266, 5909, -13736, -18473, +-2795, 7676, 1514, -3378, -26, -2133, -6282, -3080, 3727, 9791, 11463, 3100, -3918, 636, 7214, 8600, +7660, 10750, 14604, 10470, 2990, 7749, 12116, 13244, 12521, 10781, 11364, 13550, 13652, 13208, 13026, 13265, +14432, 15460, 14637, 13303, 14333, 15974, 16799, 15856, 14178, 14144, 16243, 15744, 13824, 14504, 15545, 15517, +15576, 14884, 13754, 14811, 16922, 16040, 12102, 12159, 14358, 14877, 13841, 13176, 13142, 12734, 12329, 13882, +15333, 12612, 9343, 9076, 11189, 13331, 12803, 11178, 11185, 11395, 10716, 9647, 10243, 10356, 9320, 8226, +7342, 7212, 8285, 9441, 8803, 6083, 2997, 4595, 9301, 8992, 3585, -1480, 49, 3338, 3555, 3017, +2357, 1965, 1643, -1170, -2224, 217, 315, -2386, -4461, -4198, -3754, -4745, -6931, -9541, -10844, -10476, +-8532, -6532, -6398, -7870, -9743, -11606, -12629, -13123, -12589, -12122, -13590, -16201, -17541, -17238, -15874, -14650, +-15099, -16567, -17017, -16584, -16878, -18029, -18603, -18042, -17507, -17760, -17915, -17994, -18108, -18065, -17907, -18032, +-18142, -18067, -18046, -17948, -17987, -17956, -17932, -18024, -18063, -17745, -17468, -17430, -17503, -17552, -17404, -17468, +-17259, -16925, -16871, -17109, -17167, -17082, -16595, -16091, -16112, -16137, -16078, -16156, -16257, -15903, -15365, -15009, +-14935, -15038, -14952, -14513, -14224, -14094, -13677, -13288, -13172, -13045, -12769, -12315, -11834, -11886, -12214, -11870, +-11076, -10665, -10011, -9541, -10037, -10418, -9997, -9158, -8697, -8615, -8483, -8240, -8319, -8030, -7180, -6722, +-6812, -6651, -6222, -5706, -5107, -4141, -3657, -4828, -5908, -4981, -3099, -1947, -1934, -3035, -3252, -2027, +-847, -68, 803, 1058, 620, 158, 443, 1517, 2591, 2748, 2211, 2609, 4505, 5826, 5743, 5488, +5479, 5171, 5232, 5794, 6510, 7558, 8195, 8066, 8177, 8900, 9838, 10641, 11099, 10929, 10638, 10859, +11788, 13095, 13362, 12605, 12159, 12637, 13777, 14770, 14717, 14219, 14301, 14972, 15546, 15664, 15451, 14895, +14564, 14743, 15399, 15948, 16195, 16458, 16614, 16700, 16719, 16661, 16463, 16421, 16394, 16216, 16408, 16827, +16905, 16824, 16750, 16725, 16841, 16828, 16791, 16833, 16846, 16665, 16551, 16573, 16535, 16686, 16868, 16870, +16617, 16463, 16421, 16391, 16189, 16003, 16103, 16540, 16763, 16425, 16139, 16075, 15824, 15607, 15570, 15731, +15942, 15844, 15592, 15443, 15387, 15215, 15075, 14872, 14707, 14521, 14615, 14708, 14525, 14206, 13884, 13755, +13734, 13435, 13004, 12858, 12788, 12669, 12495, 12248, 12059, 12064, 12013, 11566, 11068, 10925, 10793, 10251, +9664, 9770, 10162, 9923, 9388, 9130, 8909, 8390, 7549, 6902, 6967, 7142, 6931, 6735, 6547, 6243, +5709, 4780, 3662, 3161, 3269, 3408, 3124, 2881, 2910, 2605, 1788, 822, 160, -87, -320, -582, +-1292, -2190, -2408, -2106, -1966, -2279, -2915, -3491, -3830, -4536, -5592, -6283, -6584, -6841, -6858, -6183, +-6167, -7352, -8316, -8695, -8902, -9293, -9801, -10082, -10081, -10268, -10700, -10734, -10671, -11297, -11947, -12023, +-11970, -12084, -12131, -12096, -12403, -12817, -12882, -12634, -12501, -12510, -12815, -13430, -13830, -13925, -13709, -13389, +-13482, -13825, -13995, -14190, -14413, -14483, -14679, -15060, -15013, -14546, -14467, -14586, -14593, -14537, -14421, -14621, +-15161, -15261, -15155, -15170, -15246, -14813, -14466, -14740, -15176, -15401, -15398, -15330, -15422, -15392, -14913, -14906, +-15121, -15433, -15501, -15381, -15234, -15287, -15471, -15520, -15304, -14975, -14985, -14954, -14788, -14788, -14715, -14597, +-14971, -15636, -15615, -14976, -14395, -14301, -14383, -14329, -14430, -14576, -14657, -14747, -15002, -14979, -14397, -13685, +-13226, -13369, -13904, -14339, -14226, -13907, -13663, -13370, -12894, -12777, -12889, -12652, -12395, -12703, -13266, -13192, +-12536, -12097, -11689, -11204, -11125, -11621, -11852, -11478, -10829, -10360, -10233, -10298, -10151, -9767, -9452, -9341, +-9261, -9198, -9102, -8776, -8395, -8219, -8139, -8020, -7616, -6946, -6524, -6517, -6386, -5950, -5660, -5585, +-5381, -4935, -4442, -4395, -4334, -3813, -2847, -2270, -2439, -2725, -2499, -2154, -1845, -1167, -642, -554, +-620, -231, 191, 405, 803, 1139, 1627, 2409, 2607, 2461, 2782, 3292, 3700, 3810, 3915, 4302, +4651, 4697, 5024, 5745, 6093, 6081, 6154, 6537, 7002, 7443, 7542, 7528, 7829, 8367, 8463, 8251, +8454, 9130, 9736, 9855, 9646, 9587, 9841, 10251, 10642, 10751, 10889, 11165, 11215, 11207, 11445, 11541, +11594, 11787, 11909, 12230, 12475, 12539, 12594, 12978, 13147, 12782, 12494, 12901, 13668, 14069, 13680, 13108, +12842, 13117, 13762, 13725, 13343, 13651, 14452, 14317, 13740, 13498, 13876, 14108, 13763, 13297, 13494, 14286, +14594, 13907, 13095, 13175, 13615, 13787, 13530, 13503, 13828, 13861, 13431, 13094, 13121, 13388, 13452, 13006, +12771, 13041, 13451, 13354, 12978, 12992, 13077, 12774, 12349, 12227, 12489, 12669, 12595, 12515, 12340, 12062, +11999, 12246, 12167, 11778, 11507, 11621, 11835, 11721, 11580, 11594, 11572, 11378, 11162, 11279, 11368, 11126, +10880, 10841, 10644, 10317, 10219, 10378, 10464, 10539, 10651, 10466, 9886, 9562, 9805, 10170, 10100, 9863, +9692, 9672, 9418, 9200, 9405, 9604, 9448, 9147, 9002, 8714, 8655, 8979, 8870, 8308, 8212, 8407, +8393, 8346, 8283, 8145, 7771, 7621, 7781, 7858, 7908, 7942, 7703, 7476, 7294, 7173, 7192, 7188, +7193, 7169, 7157, 7083, 6821, 6704, 6634, 6557, 6619, 6672, 6618, 6548, 6470, 6235, 6185, 6317, +6179, 5949, 6020, 6146, 6259, 6017, 5563, 5546, 5663, 5662, 5716, 5692, 5475, 5526, 5729, 5678, +5373, 5158, 5002, 5048, 5203, 4972, 4659, 4554, 4596, 4904, 5019, 4638, 4194, 4267, 4483, 4349, +4020, 3936, 3859, 3800, 3633, 3490, 3458, 3329, 3281, 3445, 3178, 2709, 2957, 3242, 2813, 2309, +2292, 2322, 2184, 2163, 2179, 1778, 1483, 1657, 1526, 1278, 1337, 1312, 995, 634, 580, 727, +691, 339, -56, -331, -607, -598, -449, -479, -764, -1038, -1188, -1245, -1350, -1559, -1811, -1892, +-1854, -2109, -2329, -2330, -2254, -2493, -3024, -3489, -3462, -3160, -3037, -3361, -3847, -3905, -3699, -3880, +-4415, -4533, -4419, -4679, -4697, -4649, -4990, -5161, -5221, -5381, -5476, -5481, -5611, -5973, -6221, -6313, +-6375, -6468, -6629, -6861, -7086, -7101, -6890, -6997, -7409, -7723, -7851, -7834, -7952, -8166, -8189, -8429, +-8886, -8861, -8387, -8673, -9513, -9807, -9515, -9153, -9153, -9618, -10124, -10151, -10141, -10325, -10500, -10492, +-10531, -10726, -11010, -11256, -11174, -11000, -11223, -11545, -11582, -11678, -11923, -11926, -12012, -12268, -12289, -12044, +-12270, -12862, -12929, -12503, -12503, -13025, -13474, -13463, -13032, -12922, -13202, -13358, -13291, -13372, -13602, -13787, +-13693, -13366, -13409, -13759, -14006, -13946, -13763, -13606, -13658, -13732, -13792, -13830, -13866, -13737, -13644, -13519, +-13540, -13714, -13668, -13467, -13188, -13080, -13283, -13579, -13417, -12901, -12687, -12957, -13121, -12771, -12506, -12545, +-12527, -12318, -12123, -12212, -12308, -12107, -11650, -11431, -11514, -11547, -11491, -11220, -10879, -10703, -10749, -10755, +-10526, -10250, -10209, -10224, -9990, -9724, -9534, -9348, -9271, -9330, -9370, -9265, -8952, -8554, -8305, -8240, +-8335, -8280, -7997, -7753, -7638, -7453, -7215, -7198, -7247, -7064, -6735, -6503, -6552, -6512, -6218, -5878, +-5775, -5768, -5639, -5489, -5443, -5366, -5081, -4780, -4642, -4637, -4581, -4388, -4161, -3934, -3810, -3750, +-3730, -3605, -3422, -3190, -2876, -2647, -2702, -2837, -2764, -2433, -2111, -1965, -1888, -1772, -1612, -1473, +-1298, -1161, -1089, -935, -718, -689, -773, -566, -121, 178, 189, 127, 159, 273, 434, 691, +1010, 1181, 1149, 1071, 1245, 1585, 1785, 1805, 1848, 1981, 2129, 2280, 2525, 2797, 2844, 2753, +2782, 3056, 3400, 3524, 3418, 3389, 3619, 3890, 3993, 3998, 4118, 4447, 4770, 4821, 4662, 4586, +4806, 5171, 5425, 5442, 5410, 5403, 5608, 5725, 5747, 5851, 6092, 6312, 6405, 6413, 6461, 6603, +6710, 6729, 6707, 6858, 7193, 7481, 7465, 7333, 7293, 7369, 7512, 7588, 7656, 7782, 7894, 7930, +7925, 7905, 7917, 7967, 8188, 8349, 8305, 8260, 8382, 8358, 8326, 8479, 8625, 8529, 8418, 8460, +8546, 8538, 8411, 8399, 8477, 8616, 8743, 8665, 8481, 8385, 8370, 8390, 8444, 8464, 8487, 8462, +8264, 8004, 7925, 8128, 8336, 8282, 8088, 7996, 7911, 7781, 7759, 7750, 7670, 7541, 7511, 7569, +7475, 7281, 7228, 7222, 7085, 7000, 7026, 6996, 6827, 6708, 6672, 6592, 6457, 6410, 6389, 6275, +6202, 6120, 5984, 5850, 5757, 5763, 5769, 5677, 5519, 5378, 5288, 5185, 5059, 5070, 5141, 5087, +4920, 4782, 4656, 4563, 4520, 4523, 4433, 4251, 4086, 4075, 4040, 3915, 3829, 3786, 3694, 3595, +3551, 3455, 3324, 3205, 3091, 3022, 3002, 3053, 3035, 2916, 2713, 2496, 2389, 2386, 2414, 2362, +2233, 2168, 2171, 2095, 1940, 1801, 1792, 1795, 1667, 1494, 1408, 1419, 1446, 1353, 1197, 1114, +1148, 1189, 1089, 861, 678, 707, 884, 911, 621, 337, 330, 434, 379, 333, 419, 392, +126, -129, -117, 34, 82, -27, -190, -205, -191, -290, -435, -459, -387, -409, -509, -603, +-621, -612, -647, -762, -878, -895, -810, -779, -915, -1056, -1085, -1099, -1133, -1162, -1190, -1206, +-1172, -1175, -1290, -1337, -1325, -1366, -1524, -1602, -1563, -1521, -1498, -1479, -1571, -1707, -1729, -1652, +-1674, -1768, -1800, -1750, -1700, -1771, -1870, -1878, -1830, -1820, -1831, -1871, -1923, -1916, -1822, -1806, +-1905, -1912, -1859, -1858, -1850, -1797, -1817, -1904, -1940, -1877, -1802, -1799, -1888, -1950, -1907, -1831, +-1770, -1724, -1715, -1818, -1927, -1920, -1780, -1625, -1596, -1691, -1720, -1714, -1749, -1757, -1661, -1574, +-1599, -1647, -1601, -1540, -1592, -1687, -1653, -1558, -1539, -1544, -1527, -1464, -1416, -1440, -1482, -1448, +-1363, -1364, -1425, -1440, -1384, -1340, -1345, -1364, -1349, -1298, -1285, -1300, -1316, -1285, -1244, -1226, +-1249, -1238, -1221, -1243, -1263, -1214, -1156, -1162, -1206, -1218, -1186, -1178, -1186, -1180, -1152, -1163, +-1177, -1151, -1118, -1130, -1169, -1153, -1107, -1132, -1215, -1204, -1135, -1132, -1184, -1225, -1244, -1222, +-1174, -1154, -1170, -1213, -1231, -1219, -1208, -1224, -1251, -1251, -1250, -1286, -1341, -1335, -1301, -1296, +-1308, -1318, -1323, -1329, -1342, -1381, -1410, -1405, -1390, -1407, -1430, -1414, -1378, -1385, -1468, -1525, +-1503, -1433, -1404, -1434, -1462, -1481, -1513, -1535, -1513, -1462, -1441, -1472, -1516, -1530, -1503, -1459, +-1453, -1486, -1508, -1496, -1464, -1469, -1504, -1509, -1471, -1428, -1428, -1453, -1447, -1425, -1416, -1427, +-1431, -1414, -1366, -1341, -1324, -1282, -1235, -1207, -1184, -1140, -1104, -1073, -1045, -1002, -969, -946, +-917, -880, -848, -825, -797, -762, -723, -691, -671, -649, -620, -586, -558, -538, -514, -487, +-460, -436, -413, -389, -367, -344, -321, -299, -277, -255, -234, -213, -191, -171, -150, -130, +-109, -89, -69, -50, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 27, -68, -27, -162, -151, -85, -124, -352, -284, +-320, -249, -11595, -1702, 20747, 12828, 6237, 5180, 1883, -360, -6784, 2807, -4330, -3631, -4278, -5326, +-5011, -6061, -5330, -7613, -9715, -10645, -10291, -10028, -8035, -6348, -3100, -2669, -2146, 4208, 5954, 8392, +10566, 11461, 13062, 13212, 14834, 14670, 14719, 13811, 13484, 12247, 11732, 10454, 9611, 8260, 7453, 4505, +3855, 2571, 1998, 875, 469, 195, 1034, 2702, 5597, 7701, 11528, 9097, 2600, -3817, -9863, -14509, +-18354, -21518, -23840, -25740, -26842, -27617, -27800, -27666, -27026, -26162, -24860, -23331, -21615, -19953, -18052, -16331, +-14387, -12531, -10539, -8654, -6740, -4872, -3049, -1263, 428, 2022, 3626, 5044, 6460, 7735, 8940, 10016, +11026, 11865, 12684, 13390, 13881, 14358, 14761, 15066, 15314, 15461, 15595, 15563, 15464, 15166, 14820, 14398, +13890, 13261, 12663, 12104, 11606, 11107, 10598, 10110, 9673, 9192, 8771, 8372, 7946, 7603, 7226, 6853, +6470, 6116, 5702, 5310, 4887, 4495, 4277, 4103, 3730, 3117, 2424, 1697, 1074, 393, -204, -669, +-1174, -1698, -2259, -2871, -3428, -4079, -4736, -5452, -6058, -6612, -7035, -7315, -7554, -7714, -7871, -7931, +-7961, -7934, -7914, -7806, -7738, -7698, -7570, -7533, -7436, -7393, -7327, -7267, -7236, -7207, -7131, -7097, +-7071, -6996, -6979, -6887, -6870, -6784, -6710, -6639, -6567, -6525, -6445, -6381, -6302, -6229, -6161, -6069, +-5995, -5834, -5777, -5641, -5470, -5381, -5212, -5092, -4917, -4710, -4524, -4271, -4032, -3849, -3512, -3207, +-2754, -2363, -1802, -1172, -603, 10, 158, 278, 217, 138, -86, -296, -531, -718, -836, -957, +-936, -1025, -861, -724, -389, -160, 192, 228, 497, 583, 917, 1067, 1293, 1572, 1787, 2116, +2269, 2591, 2693, 3143, 3303, 3716, 3740, 3924, 4126, 4358, 4354, 4776, 4859, 4767, 5169, 4617, +6391, 4951, 5497, 5339, 4611, 5838, 4702, 4331, 5518, 4094, 3977, 4458, 4407, 3799, 5053, 4781, +5432, 2482, 1825, 4167, 4480, 2500, 1579, 4835, -1508, 6956, 607, 5315, -810, 2663, 294, -110, +-1870, -2960, -2541, -6155, -3274, -2264, -3282, -1346, 1650, -2880, 1019, 2143, 2993, 768, 1147, -5064, +-4771, -7727, -6227, -9244, -7207, -9713, -8670, -7415, -7676, -3346, -1442, -4841, -5069, -7407, -3941, -3615, +-1671, -3049, 1965, 1413, -1726, -1645, 2815, 2305, -2807, -5629, -8674, 2686, -4169, 3414, -4491, -12170, +-14898, -9187, -15708, -3337, -10949, -12494, -1307, -5723, -5906, 6384, 10144, 12963, 5251, 4438, 84, 6056, +-7933, -13297, 13363, -7284, 7312, 1818, 1140, 487, 5930, 1645, 2128, 91, -1910, -8524, -2023, -8621, +-6516, -1256, -16462, 9550, -694, 9380, 14390, -9621, 26769, 4146, 18620, 11627, 7496, 11514, 3274, 3633, +-23, 3237, -17425, 21559, -6407, 438, 3140, 8465, 9183, 1674, 2490, -3011, -14407, 17291, -15452, -3811, +7737, -12579, 1969, -2111, 11960, 10844, 22784, 7575, 11159, -65, -6071, 11702, -16578, 14630, -22243, -5623, +10423, -9272, 18789, -13663, 1054, 15630, -10375, 11616, -6768, 3579, 4334, -5067, 5537, -225, -3932, -2256, +-7228, -1401, -14942, -10687, -5343, 8349, -15147, 14412, -7035, 6216, -2419, 162, -2910, 1485, 7142, -1447, +7953, -5010, 5896, -16523, 13019, -9412, 3946, -12009, 7439, -4822, -3723, -4567, -8050, -2521, -7126, 3716, +-7783, 836, 3696, 483, 482, 1906, 830, -1610, -711, -4559, -1397, -9700, 1287, -1876, -2637, -4073, +-1692, -3001, 1515, -679, -2532, 1088, -1516, -660, -1009, 391, -539, -350, -259, -603, -1015, -957, +-1198, -942, -1377, -2277, -167, -6843, 5882, -8452, 5159, -5636, -5680, 6434, 3894, -6006, 7955, -6021, +4113, 10931, 5418, 3686, -4403, 192, 9367, 3041, 3797, 3565, 1207, 1524, -3985, -806, -447, -9632, +6886, -1176, -4278, -5539, -14986, 2377, -6365, -697, 9378, 16778, 8784, 14679, 6554, 8209, 3225, 2165, +-4652, 4229, -6549, -2643, -9679, -10258, 6986, 16610, 1786, 8973, 12052, 5526, 8053, 3169, 3140, 825, +482, -1983, -11057, -14191, -19892, -5665, -1010, -2030, 5121, 4193, 32253, 13270, 13239, 8334, 2958, 4741, +1427, 13, -10236, -18714, -5998, -15553, -8789, -5045, -3642, 259, 915, 6578, 14373, 19941, 12106, 11868, +1872, 5791, 1935, 4073, -2609, -11431, -12770, 695, -5924, 1404, -4215, -4909, -5930, -7281, -6806, -8164, +-7294, -8459, -8442, -10369, -2298, -18433, -15350, -14032, -7577, -320, -2032, -3397, 414, 1825, 6473, 5092, +4673, 11640, 12677, 17055, 8302, 10118, 11237, -4409, 7738, -6378, -3219, 4453, -17331, 774, -11949, 6658, +-11351, 240, -5154, 1878, 1039, 720, 7458, -7463, -8218, 1207, -4880, -1668, 4186, -4418, -2182, -2561, +6041, 8959, -288, 4388, 6961, 2857, 3167, -577, 3251, 2624, -3200, -19555, -7476, -8430, -8950, -3111, +-2231, -4313, -6334, 2371, -1702, 293, 2250, -802, -968, -6377, 122, -6518, -5420, 704, -2172, 5512, +5195, 11646, 2842, 11453, 7402, 2489, 11780, 162, 1755, 6799, 6536, 3769, -5199, 2304, 2104, -1165, +7597, 417, -4714, -477, -4262, -7139, 3560, -11389, -3930, -4946, -2012, 3541, 10142, 2316, 6731, 12863, +8145, 19860, 9280, 4569, 10025, 75, -1857, 3816, -4093, -8207, 149, -17226, -1251, -9744, -7113, -2030, +1340, -2381, 1344, 4747, 2567, 1654, 6769, 10321, 337, 10079, 735, 10137, 8620, 869, 7171, 11894, +-8824, 2941, -6465, 2104, -4988, -5383, -2642, -8409, -2652, -647, -4640, 4665, -3361, -15431, -3752, -16480, +-2002, -2212, -9232, -3220, 7347, -4138, 4021, -1286, 947, 2072, -621, 9934, -1446, 7157, 9362, -2594, +7171, 4583, 1899, 8937, -6176, -7645, -5051, -8098, -4239, 369, -2728, -789, 1824, -7681, 8348, 11863, +-521, 6507, -8887, 875, -318, -4409, -4928, -10240, -10366, -13610, -13256, -8892, -8674, -4358, -10437, -3156, +2327, 684, 6818, 7708, 1417, 9508, 11184, 3326, 8663, 5592, 8456, -1379, -4765, 3356, -2662, 8971, +2415, -7045, -447, -1697, 3949, -3709, -400, 80, -7811, 1495, -3883, -1925, 12019, -13998, -2376, -1102, +11920, 11456, -8627, 2614, 15789, -16363, 11068, -4479, 1261, -1805, -7614, 7779, -6076, 171, 22396, -8871, +-4863, -15696, 206, 5788, 1899, -343, 2117, 12469, -19712, 18403, -28825, 11075, -6250, 165, 12883, -2773, +7957, 1176, 16895, -24370, 10646, -4019, 9662, 13710, -9693, -1852, 13038, 20704, 951, 6923, -20991, 5644, +-1660, -8008, -16961, -7068, -4923, 10672, -10282, 5732, -9558, -3374, 1716, -9614, 4864, -103, 976, 9061, +-8450, 13494, -13954, 8408, 1190, 7689, 9502, 9769, 8411, 6523, 4793, 2401, 1181, -4358, -1739, -7781, +-3767, -12332, -13670, -12667, -21355, -9939, -13309, 182, -8052, 9921, -3312, 14897, 3042, 11915, 10605, -3516, +14380, -4070, 9744, -5961, -21, -6423, 837, -7199, 4252, -13182, -1009, 5061, 370, 11282, 894, 7087, +6121, 9424, 1859, 10001, 10607, -1547, 8340, -5698, 1030, -1028, -5691, 1239, -6617, 710, -5142, -4234, +-2841, -1340, -1101, -3820, 5131, -3925, -93, -2523, 3318, -2528, -2293, -1149, -5629, 2295, -7864, 3036, +-4053, 1054, -1881, 3358, 8483, 4288, 2431, 11149, -3901, 4645, 6910, 2193, 3760, -154, 3049, -1262, +-4578, 2052, 3084, -291, 1180, 1750, 432, -7676, -85, -1716, -2014, -2256, 3265, -3408, -4485, -280, +-2560, -2977, 448, -3723, 2395, 1399, -1165, 1751, 2306, -1190, 7089, -304, 4232, -897, -619, -2431, +-7521, -2747, -5387, -5993, -6250, -3270, -6113, -3311, -4607, -687, -870, -3942, 3054, -2519, -1824, -4899, +3065, -6677, 8874, -2465, 674, 6119, 283, -488, 5422, -2568, 3284, 259, 1150, -3568, 599, -379, +1142, -2679, 2543, 793, 1252, 27, -3248, 1671, 1838, 986, 3621, 371, -2106, 7662, -3521, -3975, +8442, -11426, 2798, -8438, -2679, -2301, -6210, 2179, -8233, -289, -656, -694, 6372, 3825, 3153, 1365, +5018, 476, -375, 1440, 3716, 1821, 3090, 3671, 2453, 2831, 6641, 4995, 3738, 8900, 1789, 5735, +1421, 2036, -3521, -3820, -7968, -1935, -9208, -2223, -6394, 1821, -2679, 2351, 1975, 7383, 5847, 8586, +9902, 3872, 3798, 2798, -1886, -655, -1246, -4713, -3838, -6191, -4597, -5246, 102, -4084, 1990, -1237, +4998, -1792, 1951, 1878, -643, 4311, 595, 40, 3350, -79, 375, 1159, -1818, -1209, -1141, -3079, +-599, -391, -2688, -5824, 1000, -4135, 4001, -873, 714, 5689, -1626, 6974, -172, 5801, 3046, 3907, +826, 6478, -653, -903, 161, -541, -1113, 614, -3946, -2030, -798, -2182, -1053, -2424, -2574, -5294, +3529, -5917, -3413, 2700, 958, -9920, 6273, -7564, -786, -4467, -2041, 495, -384, -1826, 787, 1564, +-127, 3340, -720, 1592, 1936, 689, -2584, -1009, -808, -4562, -1625, 482, -6021, 3333, -6329, 2936, +-386, -2383, 2165, 3323, 196, 2894, 2043, 3351, 2671, 1287, 1162, 409, -671, -1766, -1062, -952, +-1432, -1516, -837, -2991, -1591, 1023, -4724, 395, -491, -1069, -1295, -936, -1707, -1014, 1195, -2788, +-621, -374, 343, 1223, 3245, 1781, 2712, 3161, 1519, 4179, 3386, 2897, 108, 3971, -1925, -370, +1383, -4392, 1372, -1651, -3489, 583, -733, -2419, -1881, 424, -709, 94, 2322, 5096, 3188, 1920, +3502, 3133, 2117, 1181, 1547, 578, -2169, -3452, -948, -2082, -2716, -3765, -2048, 443, -1442, 3353, +74, -753, 3056, -217, -638, 760, -338, -3489, 1824, -5447, -744, -1466, -2429, 485, -456, 2033, +50, 260, 5071, 4025, 316, 3796, 1196, 2628, 719, 826, 929, -682, 462, -3964, -1072, 2499, +-3830, 2015, 47, -1440, 4252, 1157, -539, -2697, 7037, -1571, 849, -4421, -613, -5812, -2128, 579, +-5486, 720, -7083, 5049, -482, 4699, 2330, 5512, 4381, 2286, 7105, 2149, 1096, 2338, 1111, 2951, +-4868, 762, -2099, -534, -3639, 2269, -2450, 1820, -241, -3719, 1630, -4313, 3424, -2067, -3125, -2883, +1359, -1577, -1689, -6749, 7386, -9488, 4661, -6945, 2495, -4519, -1824, 1558, -8708, 6987, -9600, 1742, +6294, -9252, 9401, -8471, 8306, 2823, -1363, 10655, -2476, 9274, -1597, 2003, 7443, -2086, 9115, -1679, +4568, -9790, 2643, 2655, -9977, 10726, -13826, 7596, -8091, -2014, -1645, 3056, -2051, 2687, -4376, 1036, +-4463, 3110, 1978, -2291, 4494, -8089, 6430, -7167, 3187, 2450, -1723, 866, 5951, -3014, 2920, 6308, +-7226, 5164, 1242, -409, -2257, -1688, -4172, 1544, -2812, 1070, -2376, 73, -747, -1639, 4994, -1625, +-3473, 3045, -1571, -1558, 3667, -6928, 7817, -8457, 9531, -13027, 7564, 11751, -22109, 9988, 4243, -6491, +102, 8819, -4376, -3812, 9066, -8753, 5839, -822, -3387, 5667, -2943, -1528, 823, -4684, 4315, -2328, +-3757, 720, -1470, 676, -617, -1372, 255, 1836, -365, 5296, 3091, -9506, 7019, 4499, -5205, 1855, +5177, -2599, -946, 3473, -4941, -330, 2537, -1741, -6258, 3139, 1956, -4022, 1821, 1994, -4004, 4409, +-994, 2920, -1057, 2980, -2343, 3472, -1055, -1471, 1286, 123, 2296, -2865, 585, -3248, 2979, 161, +124, -2099, -348, 2410, -432, -2067, 1557, -2032, 507, 1540, -4772, 3559, 172, 973, 264, 196, +-83, -1713, 2406, -904, 623, -286, -526, -1077, 549, 157, 1645, 1591, -897, -369, 1763, 608, +2295, -204, 79, -747, -457, -1159, 1873, -361, -666, -69, -362, 225, -2361, 1419, 209, -720, +588, -4119, 2803, -1998, -541, 970, -422, 546, -1237, 1229, -2969, 2231, -1726, -774, 2162, -2689, +3607, 3697, -3755, 1712, 4736, -3440, 4979, -2446, 2126, 1358, -2100, -520, -755, 291, -23, -1339, +-476, -1319, -1276, 123, -3390, 3352, -3350, 1723, -679, 1650, 288, 613, -62, 942, 3369, -190, +1157, -1238, 4489, -5171, 1679, 739, -1412, -507, -2217, -23, -5772, 2615, -6135, 201, 866, -2233, +-161, 1104, 176, -2480, 4227, 98, -2221, 4834, 1718, 1084, 826, 1016, 497, 7791, -4419, 2954, +589, -1025, 3043, -3003, 2786, -1407, -808, 283, -2818, 1408, 396, -3967, 2156, -2841, 1195, -951, +-1508, 1571, 13, -854, 282, -632, 2508, -4012, 183, 1341, -3224, 2371, -835, -47, -456, 3288, +-3118, -143, -570, 1781, -2335, 3865, 1923, -5124, 4484, -1295, -433, 5983, -2478, 1382, -671, 2083, +3901, -2613, 655, -1632, 71, 231, 1030, -3260, 2815, -3172, -3534, 2091, -1029, -321, 815, -2601, +1331, 2281, -487, 55, -1984, 2252, 1787, -1661, 37, -1668, -2679, 674, -1227, -1414, -1782, -2352, +977, -4376, 3789, -1709, -1344, 4324, 608, -1892, 1942, 978, 3389, 1155, 2196, 3, 1166, 4214, +-1770, 2125, -740, 496, 404, -104, -565, 2067, -595, -1676, -408, -3406, -265, 682, -587, -878, +-2933, -1325, -2421, 1453, -965, 1287, -781, 763, -3623, 3676, -202, -2082, 5087, -2498, 1161, -900, +-23, -3656, 2568, 374, -1060, -2343, 406, -650, -1413, 1655, -1973, 2805, 233, 1036, -277, 4312, +2124, -2476, 792, 3420, -1058, -2237, 6744, -3255, -692, 2242, -4011, 1518, 924, -859, 1655, 1223, +-3568, 1947, -768, 1273, 700, -569, 521, -1081, 621, -826, 2406, -903, -660, 2828, -3326, 1398, +-537, 1103, -352, -1511, -636, 1183, 364, 2256, -1475, -2111, 1616, 2489, -534, 28, -1212, 65, +-42, -2238, 667, -587, 1098, -1690, -847, -149, -1535, -1789, 2863, -2458, -689, 1912, -2528, 2135, +-922, 2323, 1668, -2257, 1849, -1005, 1823, -2318, -212, 527, -118, 1009, -4118, 2265, -2294, 410, +-64, 4481, -2019, 1451, -1576, 3066, -2551, 6206, -365, -3414, 4782, -1645, 892, 1293, 2305, -4554, +3786, -1975, 3581, -1086, -4102, 1387, -2817, -990, 2844, -2177, -2448, 3694, -7481, 5940, -1098, -1025, +2372, -1683, -1322, 1252, -558, -2280, 2393, -855, 769, -3269, 2156, -2119, 2992, -917, 35, -667, +1882, -1984, -2521, 2106, -4965, 1049, 2135, 483, -2453, -259, 1516, 249, 3933, -1703, 3905, -1716, +216, 2101, -1057, 2766, 987, 847, -1326, 1171, -229, 1969, -1460, -849, -546, 1306, -1681, -708, +80, 375, -2623, -1285, 384, -2151, 812, -671, 279, -1777, 2509, 3174, -1498, -409, 1550, 637, +787, -1196, 2378, -907, 1617, -1317, -336, 1074, -1377, 1254, 661, -1251, -309, 27, -1557, -687, +1596, -3256, 2566, 359, -2440, 1075, 2488, -2405, 47, -1382, 3182, -4591, 3522, -1335, -1513, 200, +609, 650, 2653, -973, -2539, -220, 2063, 1198, -2679, 3788, -1259, 1009, -2075, 1364, 211, 2654, +4085, -3409, 312, 1205, 884, 3146, -142, -570, 3300, -2163, -2093, 3615, -6006, 2431, 2241, -3173, +-690, 1235, -2669, 821, -3844, 3022, -907, -3752, 1786, -2668, -574, 1586, -1232, -1618, 1455, -2107, +-892, -468, -498, 3216, -3292, 2437, 2431, -980, 309, -926, 840, 1350, 13, 1161, 1418, 617, +-1427, 1281, -2101, 1499, -1005, 1928, -446, -4752, 4196, 28, -3190, 1941, -3183, 3192, 1115, -2124, +1059, -2732, 1369, -2556, 4102, 641, -1276, -955, -143, -1038, 6114, -2899, 1780, -1277, -413, -323, +1001, 2624, -2092, 414, -241, 27, -51, 921, -999, 85, 2003, -3440, 4093, -2383, 2289, -2608, +-456, -401, -937, -858, -593, -1595, -2870, 1421, -3071, 2196, 2256, -1581, 3052, -1048, 4059, -568, +1380, 1518, -411, -403, 1804, 2148, -3632, 6197, -3001, 1595, 1666, -2223, -2841, 4293, -5903, 2943, +190, 26, -1005, -5747, 2110, -3571, -413, 638, 318, 1064, -4713, 1630, 852, -420, 211, 3876, +-4233, 3100, -107, 283, 4295, -2075, 2241, -219, 263, -68, 3244, -4539, 6192, -4695, 3707, -210, +-4714, 2338, 93, 768, 282, -837, -2044, 2240, -4131, 1092, -2139, 5218, -3789, 1142, -2325, -1642, +3964, -1097, 1249, 433, 1533, 404, -432, 2490, -5736, 3899, -191, 370, 744, -509, -870, 2828, +-418, -482, 1616, -5784, 4305, -2385, 1151, 2004, -3277, 2202, -946, 1959, -1024, 3779, -2168, -3894, +3367, -1645, -1191, -4014, 623, -2936, 1378, 3132, -3502, 2290, -6042, 149, 3347, -1595, 2673, 234, +153, -558, 3061, -2899, 1631, -47, 70, -1999, 4045, -2560, 158, -548, -1377, 976, -2437, 2303, +-1314, 942, -645, -1301, 2209, 544, 1479, 171, 263, -35, 797, 923, -1690, 398, 3197, -1435, +-1135, -1697, -161, 1650, 660, -2658, 987, -119, 464, 2009, -918, -408, 4737, 924, -2894, -1970, +806, -1904, 3646, -3438, -154, 2591, -1515, -3389, 2256, -2502, -1217, 3425, -2921, 757, 517, 108, +209, 307, 657, 2033, 91, 4181, -971, 2305, 1995, -2385, 3668, -1461, -2888, 1577, -587, 1015, +23, -2608, 3075, -1287, -732, 1427, -2216, 1156, -1106, -1775, 1436, 15, -2435, 3500, -3545, 1850, +2169, -1561, 938, -225, -715, -952, 2134, -3484, 1738, -1744, 1857, -2479, 807, -1011, -1524, 1271, +1033, -1752, -1018, 269, -1193, 1268, -2366, 68, -439, 2100, -3030, 1331, -3110, 1663, -413, 2993, +-1295, 1850, -2, 1780, 2372, -1494, 991, 1288, 56, 2561, 2682, -1246, 865, 1433, -1058, -1300, +927, -908, 1233, -4012, 2057, -2255, -417, 471, -1224, 156, 235, -3055, -156, -1780, -985, 2209, +434, -2274, 100, -39, -2739, 2430, -973, 889, -171, -127, -2523, 1186, 277, 471, 1465, 1538, +443, 477, 170, -194, 2261, 899, 3140, -1703, -582, -405, 1340, -233, 1980, -2579, 3775, -2162, +346, 1718, 512, -401, -1631, 37, -3040, 1907, -1285, -129, 2455, -2385, 666, 312, -568, 3442, +-3392, -5090, 1746, -1660, 2218, 3463, -2228, 78, 351, -1266, 73, -482, -102, 658, 1973, -677, +25, 1990, -718, 2824, -869, -257, 1533, -1322, -381, 545, -1796, 2206, -3544, 618, -725, -2891, +801, 1237, -2819, 4657, -1256, -306, 1079, -709, 144, -1882, -928, 918, -1167, 671, -405, 811, +1087, 2474, 2531, 844, 669, 340, 1504, 153, -162, -1622, 1092, -422, 1624, -713, -212, -1081, +-165, -205, -1269, 2789, -1385, -973, -1261, -768, -1921, 1246, -2030, -681, 2043, -3114, -240, 119, +-1528, 1564, 180, -2223, 2929, -1455, 430, 1023, -1678, 354, 2505, -561, 617, 1568, 568, 888, +-371, 206, -1917, -627, 1755, -897, 245, -400, 107, -183, -152, -1109, 1678, -2482, 292, -1568, +1689, -1127, 1592, -748, 444, 1222, -267, 235, 995, 2658, -2950, 786, 459, 1432, -68, 1046, +-868, -1911, 3142, 1524, -3419, 2379, -481, -415, 860, -1295, -3, -1064, -1199, -2022, -280, 802, +1476, -2905, 4155, -747, -560, 1554, -666, 875, 759, 148, -2117, 1422, -1474, 2275, 434, 154, +-565, 831, 700, 180, -419, 2242, -1462, 236, -937, -1005, 821, -1640, 1925, -1203, 1361, -1605, +-641, -1068, -100, -1839, 404, 487, 1757, 1312, 1136, -292, 1332, -1155, -1205, -776, -650, 491, +380, -1821, -259, 1372, -1397, 1787, -501, 293, -253, 1286, -2020, 2555, -2805, 1204, -1088, -1519, +-855, -3, 866, 1104, 1713, -73, 1422, 2397, -1446, 351, -267, -1933, 961, 186, -1275, 1553, +-1883, 2183, -577, 293, -2332, 1908, -165, -1993, 520, -1249, 1329, -1527, -25, 30, 686, 1183, +2131, -253, 15, -366, 1185, -2780, 3004, -1087, 1183, 485, -3108, -1569, 2167, 1450, -490, 128, +133, 1004, 480, 1102, 308, -999, -30, -1049, -1218, 81, -841, 278, -996, 2682, -720, 1645, +-471, -284, 628, 255, -1096, -883, -1223, -1721, -1930, 210, 47, -822, 482, 1752, -1273, 2037, +704, -738, 2237, 62, 148, -1324, -39, 806, -1951, 951, 287, -427, 3409, -220, -757, 2348, +-524, 311, -119, -55, 738, 157, -414, 1945, 147, 1445, -3042, -714, 1238, -1118, 333, -543, +1282, -415, -277, 1331, -403, -851, 473, -2042, 346, 377, -776, 283, 133, 623, 41, -1297, +1688, -182, -2448, -17, -1002, -1361, 233, 201, 1495, -697, 404, 2537, -1387, 1107, -1057, -1547, +-821, 490, -1555, -864, 3210, 817, -953, 1174, -296, 1641, -1582, -377, 806, -2473, 1191, -1304, +104, 1336, 904, -2228, 1757, 1016, 477, -1597, 1040, 251, -199, 268, 773, -975, -73, -1367, +427, -1, 1549, 1300, 279, 103, 418, 1572, -1154, 1195, -849, 1348, -703, 183, -458, 74, +1739, -2143, 348, 230, 57, -551, -1338, 263, -747, 559, -744, -885, 459, 127, 430, -543, +367, -505, 886, 871, -66, 1048, 870, -298, -476, -582, 1178, -1184, 760, -1222, -78, 1133, +-230, 2148, 1, 5, -330, -1087, -1899, 926, -1857, 972, -322, -171, -456, 689, -1469, -752, +1786, -1520, -2926, -355, 364, -1217, 972, -437, 602, 26, 978, 852, -301, 602, 965, 430, +1350, 529, 485, 427, 573, 1314, 1456, -1046, 115, 912, -1568, 643, -816, 1621, 1069, 1515, +-1776, -663, -28, 699, -868, -699, -1276, -1142, 958, -1723, 638, 1700, -39, -318, -1103, -390, +1859, -3186, 2190, -1912, -209, 3900, -1096, -1857, 842, -747, -953, 1118, -267, 729, 1554, -1343, +1345, 2422, -810, -1023, -958, 2566, -4020, 943, -298, 94, 1083, -2367, 1341, 1452, -1372, -584, +4646, -5386, -1343, 4443, -962, -2949, 1869, -1360, 2266, -3432, -2972, 2950, 273, 1563, -1598, 864, +-1823, 1550, 3893, -2368, 1084, -1091, 1025, 1719, -1739, 3146, -1888, 1530, -2082, 284, 133, 81, +-2051, 3658, -2002, 1079, 1093, -1205, 64, -573, -2182, 123, 2190, -1296, 2422, -1857, 1225, 2219, +-3657, 2938, -655, -2590, 1842, -1646, 3468, -2015, -307, 393, -2468, 1209, 830, 971, -789, -1883, +4108, -1087, 188, -51, -1707, 210, -1319, -546, 652, -910, 1069, 812, -534, 932, 2541, -878, +-734, -439, 419, 1878, -2745, 108, 989, 1277, -507, -367, 637, 105, 803, 415, 400, -1891, +1136, -958, -267, -20, -71, -987, 80, 1739, 230, -947, -500, -1331, 210, 734, -1288, -343, +-1665, 598, -47, 1766, -1000, -764, 2768, 409, -1821, 7, 2228, -1814, 1931, -341, -2277, 369, +-860, 3149, -1590, 375, 1964, -350, -787, -50, 146, -1684, 385, 826, -757, 710, 2829, -897, +-2276, 3104, -444, -2411, 1380, 1389, -1140, -1729, 1718, 1883, -1506, -2387, -267, 1011, 279, -1437, +3671, 3108, -1981, 492, -2217, -827, 1379, -1301, -1756, 152, 500, 226, 2102, 146, -1421, 1154, +-1925, -1280, 657, 119, 143, 17, 729, -817, 2020, -661, 711, 1193, 316, -1326, 1790, -2989, +-572, 1174, -323, -316, 694, -238, -228, 1025, 1495, 985, -910, 393, -1194, -188, -604, 1380, +-617, 317, 44, -497, -205, 1266, -669, -216, 1521, -1298, 1185, -59, -433, -1634, 894, 120, +-587, 1053, -1508, 565, 3464, -3545, -1494, 4894, -2340, -1886, 194, 190, 2517, -5966, 987, -695, +2242, 1524, 742, 30, 841, 332, -3593, -795, 1467, 510, 1030, 1887, -921, 1986, -1716, -1014, +422, -2309, -69, 5337, -3450, -4460, 1557, 5614, -1734, -26, -4344, 2182, -1050, -2342, 2881, 1107, +472, 2002, 588, -437, -537, 839, 1427, -1234, -1451, -4405, 2280, -466, -1678, 2027, -1048, 600, +-611, -235, 3192, -627, -143, 2202, -1702, 2950, 449, -2219, 1600, -424, -28, 613, -3637, 3629, +-1296, -503, 409, 3343, -1489, -781, -36, -3124, 1295, 1281, 869, -2398, 1854, -15, -931, 1889, +-941, -1121, 1591, -831, -2847, 356, 1408, -1053, 1123, 1021, -1777, 1485, -922, -503, 801, -1280, +-243, -488, 1582, -994, 598, 898, 391, -961, 1015, 228, -1383, 1457, 380, -427, 2269, -521, +-931, -147, 2048, -76, -1785, -112, -120, 439, 1731, -947, 337, 120, -796, -1568, 1050, -564, +830, -1315, -463, 2368, -983, -427, -186, -1081, 279, 1155, -580, -1358, -60, 288, 459, 677, +60, -288, 278, 985, 209, -313, 526, 1146, 73, 217, -537, -138, -401, -735, 251, -965, +182, 1441, -1140, 674, 1863, -253, -405, 555, -640, -632, -68, -655, 320, -1441, 1617, -777, +-2754, 405, 878, 691, -575, 221, 443, 375, 1552, 228, -1293, 309, 565, -448, -798, 474, +967, 1059, -784, 889, -837, 531, -462, -51, 2891, -1152, 8, -100, -438, 419, 889, -2182, +1979, -327, -485, -582, -317, -144, 1296, -383, 190, -1416, 869, -1024, 269, 914, -188, -1293, +-1019, 1350, -1981, 2401, 592, 8, -493, 1258, 279, -2425, 1057, 1007, -3579, 3158, 1689, -806, +293, -1233, 1658, 2097, -4342, 2595, -1345, 1338, -2177, -4785, 4074, -464, -640, 141, 2223, 840, +496, -595, 80, -4048, 924, 1146, -1755, 2043, -893, 230, 59, 1272, 61, -429, 1233, -1464, +-662, -270, 957, -417, -2372, 535, 1883, -810, 1694, 1680, 260, -855, 294, -47, -1495, -409, +881, 793, 1577, 312, -311, -44, -225, -1149, 335, 1088, -448, 27, -120, -471, 987, -1413, +949, -246, 413, 10, -1364, 1292, -404, -1528, 404, 157, -687, 1052, 165, 1059, -543, -112, +-655, 500, 2111, -888, 540, -1194, -506, -869, 1327, 1428, -834, 922, -991, -881, -1671, 861, +-182, 633, 1002, -1201, 1137, -695, -64, 2526, 812, -888, -706, -1244, 419, 311, -380, 752, +875, -3014, 960, -1256, 80, 1928, 1529, 700, -2058, 1253, -1261, 1325, 783, 298, -821, -762, +-1358, -115, -551, -1149, 1290, 2264, -980, -769, -65, -20, 462, -1332, -1111, 1156, -966, -342, +2508, -851, -65, 802, 1144, 888, 2192, 953, -739, -151, -1230, -2135, -4124, 1097, 1067, -400, +1355, 813, -1053, 2931, 1731, -492, -1849, -1238, 1157, -2458, 393, -1988, 524, 822, 1222, 2155, +379, -700, 1917, -122, -223, 283, -1634, 205, -360, -1268, 418, 535, -986, 2671, 78, -607, +593, -924, -820, -160, 332, 716, -733, 1102, -437, -847, 127, 1064, -1397, 1675, -197, -1162, +90, -1584, -728, 2082, 375, 582, 3618, 506, -1838, 516, -1010, -922, 332, -1448, 264, -370, +810, 1098, 889, -248, 278, -1026, -217, -1101, -49, -718, -1756, 260, -35, 446, 1583, -325, +442, 61, -128, -163, -447, 56, 264, 221, -539, -325, -473, 952, 81, 695, 226, -1571, +-529, -66, 1773, -40, -520, -117, 1340, 669, 220, 1007, -2708, 855, -114, -151, -634, -694, +317, 2314, 1, -1403, 2154, 36, -1137, 390, 1618, -448, 699, -214, 681, 1123, -829, -350, +657, -148, -835, -354, 1044, -1862, 1355, -432, -771, 177, 109, 259, -32, 191, -931, 637, +-51, 27, 1161, -1485, -219, -597, -50, 157, -645, 398, 608, 245, -309, -686, 90, 952, +-926, -957, -1285, -311, 1175, 793, -418, 98, -42, 560, -851, -194, 1031, 918, -503, -120, +1252, 146, -438, -282, -350, 181, -548, -415, -831, 1062, 2668, 897, -640, 448, 812, 527, +-398, -706, -1041, 114, -284, 810, -85, 452, -132, -849, 816, 214, -117, -330, -1180, 495, +1515, 236, -1241, 377, 393, -768, 603, -442, -118, 729, -621, 306, -1377, 490, 505, 336, +51, -893, -321, -486, -422, 249, 1304, -1001, 1335, 435, -1016, 763, -175, -196, 278, 311, +-404, -42, -602, 133, 211, -583, -156, -177, -143, 714, -35, 671, 1064, -788, 231, 102, +-471, 236, 1082, 540, -510, 75, -406, -737, 380, -2, 506, -1038, 1446, -461, 153, 1477, +-432, -1472, 1136, -1040, 535, 805, -1142, 758, 366, -784, 1219, -427, -1350, -136, 108, 206, +-546, 603, 943, 535, -1474, 6, -417, -757, -20, 527, -1332, 1104, 1300, -1241, 697, 966, +-694, 313, 464, -720, -830, 551, -713, -308, 435, 724, 52, -244, 1629, -1566, -810, 534, +-919, 176, 210, 763, -282, 1033, 1781, 830, 728, -317, -1549, -84, 512, 874, -1048, -753, +316, 64, 997, -71, -391, 947, -112, -1458, 802, 206, 138, -78, 259, -793, 391, 104, +-938, -1503, 1344, 293, -389, 404, -427, -921, 191, 1432, -23, -372, 519, 545, 288, -573, +710, -994, -1086, -10, 3, -376, 734, 742, -680, -529, 245, 502, -73, 186, -415, 613, +134, 332, 802, -250, -49, 1210, -301, 170, -737, -713, -437, -1014, -47, 348, -438, -684, +784, 422, 1961, -103, 233, -39, -788, -448, -201, -146, -511, 758, 84, 487, -631, 549, +-71, 1048, 1036, 99, 1160, -710, -1005, -265, -675, -572, -938, -177, 196, 565, 637, 778, +-446, 783, 13, -694, 133, 422, -432, 186, 21, -917, -167, 400, 495, -57, -253, 711, +1316, -7, 355, -750, -1154, -577, 36, -730, -78, 633, -713, 195, 792, 318, 228, 716, +501, 204, -789, 28, 194, 225, 885, 375, 299, -534, 986, -506, -458, 321, -825, -348, +-17, -517, 240, 303, -278, 65, 112, 312, 7, 196, 1011, 592, -317, -735, -759, 651, +-282, -201, -162, -175, -834, -388, 182, -139, 695, 612, -999, 365, 656, 157, -636, -301, +466, -558, -183, 589, 594, 102, 361, 783, 375, 93, 70, -534, 20, 313, -880, -763, +491, -257, -263, 393, -30, 724, 805, -12, 626, -245, -556, 497, -250, -456, 194, -859, +-737, 307, 84, -333, 132, -340, 228, 230, 245, -231, 792, 41, -156, 225, -71, 532, +366, -107, -224, 210, 78, -137, 296, 241, -234, 70, -393, 521, 123, -10, -202, -427, +288, -113, 288, -326, 18, 251, 434, 80, -754, -309, -219, 207, -282, -248, 44, -124, +234, 262, 414, 498, 75, 1046, 522, -84, 73, -316, -340, -578, -665, -681, 202, -44, +-280, -25, 464, 463, 303, 371, 41, 313, -328, 91, -461, 129, 123, 139, -39, 318, +-170, -224, -91, 93, 211, 223, -21, 509, 120, 365, 279, -267, -153, 0, 230, -442, +435, -66, 245, -123, -185, -760, 401, -721, -318, 36, 41, 636, 579, 642, 7, -28, +-122, -62, -49, 297, 143, 94, -355, -122, 423, -640, -1179, -120, 394, -36, -219, 273, +264, 372, -83, 269, 44, -170, 703, -258, -405, 139, 692, 143, -559, 628, 127, -917, +35, 187, 23, -143, 476, -47, 188, -185, -170, 429, -900, -188, 725, -13, -611, 774, +182, 325, -263, 3, 90, 157, -5, 443, 531, 448, -180, -360, 216, -47, -370, -320, +-22, -432, 3, -3, -190, 138, 317, 205, 210, -83, -46, 16, 177, -293, -162, 161, +133, 27, 420, -144, 18, 144, -359, 18, 709, -214, -347, 234, -667, 268, 272, -502, +-272, 385, 176, 245, 759, 345, -361, 167, -161, -39, 458, -658, 99, 337, 56, -65, +409, -539, -183, 138, -105, -367, 195, -401, -112, 294, 254, 262, -98, 122, 262, 340, +-451, 258, -11, 394, -76, -461, 90, 136, 245, -125, -8, -60, 89, -79, 293, -1, +-187, 327, -212, 64, -314, -328, 317, -162, -224, 308, 177, 81, 367, 447, 147, 264, +141, -44, -241, -55, -448, -389, -119, -112, 26, 142, -51, -254, 316, 234, -84, -55, +612, 75, -175, 332, -278, 294, 495, -269, -12, -163, 371, -117, -102, 52, -249, 138, +16, -456, 23, 219, -84, 472, 257, -115, 143, 109, -117, 75, -120, 66, -389, -76, +177, 3, -128, 511, 50, 236, 286, -162, -246, 70, 154, -49, 137, -36, 90, -206, +-102, 351, -18, -217, 269, -88, -99, 284, 224, -209, -278, -291, 62, 286, 136, -146, +-255, 478, 393, -146, 20, -107, -151, -149, 161, 301, 2, 110, 338, -137, -60, 390, +-345, -345, 80, -195, -15, 157, -65, -62, 225, 438, 401, 70, 139, -117, -2, 27, +22, -206, -49, -146, -21, 389, -118, 66, 318, -194, -195, 120, -161, 85, -35, -210, +279, 110, -312, 177, -149, -219, 129, 323, 157, -177, 195, 31, 293, 515, -280, -307, +-69, -141, -107, 125, -233, -186, 224, 165, 330, 172, -439, -97, 245, 274, -84, -303, +8, 221, 75, -27, 370, -40, 81, 89, 158, 109, 223, 50, -45, -26, 35, 94, +125, 124, -236, -11, -1, 50, -546, 51, -122, -175, -47, 197, 50, 45, 370, 195, +187, 396, 143, 91, -23, -379, -225, -207, -114, -228, -99, 235, 393, 240, 279, 36, +-228, 76, -16, 146, -114, -158, 148, 103, 26, 176, 166, -190, -39, 28, -265, -83, +175, -44, 280, 18, 75, -325, 314, 42, -61, -20, 22, -17, 83, 191, -20, 240, +-18, 41, -28, -259, -162, -100, 51, -95, 216, 154, -61, 167, 110, 54, 153, -47, +-84, -50, 50, 196, -151, -94, 175, 120, 148, 375, 171, -181, 127, 2, -170, -17, +-124, -166, -64, 84, -93, 282, -90, -199, 221, 593, -127, 139, 224, -216, 56, 93, +-519, -131, 172, 36, 31, 404, 94, -23, -46, -85, -158, -10, -78, -192, 167, 163, +153, 94, 95, 240, 98, -56, -35, 119, -144, -7, 277, -35, -45, 27, 3, -10, +-8, -40, -55, 216, 153, -1, 110, 65, 8, 5, 197, -88, -18, 13, -165, -98, +-17, -157, -37, -21, -17, 51, 99, 133, 220, 103, 114, -17, -78, 102, -120, -122, +-37, -34, -90, -42, 56, 308, 114, 11, 303, 78, -8, -25, 186, -204, -44, 100, +0, 187, 154, 105, -180, 36, -59, 244, -57, 95, -165, -31, -30, 109, -32, -115, +27, 65, 99, 23, -1, 165, -27, -157, 191, 11, -11, 114, -59, -52, 173, 93, +100, -79, -66, 162, 262, 18, 172, 97, 70, 173, 76, -109, 45, -148, -183, -205, +37, -95, 75, -78, -32, 191, 182, -122, 49, 104, 18, 79, -6, -40, -7, 251, +95, -15, -42, 114, 55, 186, -122, -149, -25, 8, -166, -27, 56, -136, 154, -13, +34, 173, -23, -172, 297, 137, 2, 110, -68, 8, 144, 39, -74, 119, -30, -127, +27, 251, -35, -119, 76, -49, -28, 197, 118, -1, 61, 100, 31, 196, -182, -94, +6, -84, 59, 45, 51, -36, 125, 97, 113, 15, 103, 73, 18, 99, -13, -15, +3, -49, -7, -3, -21, 84, 64, 1, 99, 18, 27, 36, 120, 10, 70, 110, +-35, -32, 70, -10, 34, -30, -54, 8, -15, 36, -15, 27, -25, 85, 41, -74, +-2, 71, 93, 131, 71, 8, -59, 133, -49, -99, 23, -20, -12, -54, 94, -21, +185, 46, 1, 79, 3, 46, -16, -81, 119, 112, 131, 8, 27, 109, -20, 90, +30, -11, -25, -69, 17, 40, 51, 26, 56, 90, 70, -6, 10, 64, 25, 18, +-25, -79, 88, 50, -5, 49, 105, 66, 124, 46, -112, -94, 27, 52, -69, 40, +68, -34, 137, 90, 27, 59, 51, 3, 20, 119, -78, -8, -15, -26, -20, 41, +-20, -5, 61, 52, 89, 112, -55, 54, 42, 90, 5, -59, -83, 16, 41, 88, +-74, -20, 93, 113, 104, -3, -3, 62, 65, -15, 57, -8, 41, -1, 51, 31, +26, 35, 110, 61, 68, -1, 20, 27, 0, -20, -12, 46, 15, 16, 55, 25, +-23, 46, 85, 39, -46, 35, 86, 27, -22, 56, 83, 46, -18, 60, 85, -42, +-60, -1, -45, -37, 36, 99, -21, 6, 113, 138, 27, 90, 45, -5, 27, 23, +-44, -5, 44, -46, 42, 51, 71, 51, -1, 60, 70, 46, -41, -1, -18, -31, +31, 34, 28, 61, 23, -20, 84, 10, 8, 11, 78, 59, -21, -1, 88, 46, +22, -28, 113, 34, 13, 32, 1, 47, 23, 1, 20, 27, 15, 47, 31, 35, +10, 36, 45, -40, 46, 35, 17, 32, 26, 3, 46, 13, 35, 55, -7, 13, +46, 47, 42, 65, 31, 21, 25, 27, -6, 16, 7, 36, 31, 15, 13, 76, +64, -6, 10, 46, 36, 20, 30, 13, 23, 65, 20, 25, 23, 12, 13, -15, +37, 70, 31, 10, 47, 69, 36, 28, 45, -7, -2, 16, 17, 8, 31, -11, +15, 55, 23, 42, 22, 18, 50, 55, -5, 34, 55, 0, 32, 36, 8, -1, +37, 21, 32, 49, 36, 21, 36, 45, 27, 7, 27, 27, 35, 34, 18, 23, +27, 36, -7, 51, 47, 6, 5, 66, 3, 0, 73, 2, 12, 42, 12, 27, +28, 36, 35, 23, 16, 41, 8, 22, 32, 18, 28, 57, 27, 20, 44, 34, +13, 34, 26, 13, 36, 5, 7, 55, 28, 12, 23, 27, 26, 34, 28, 27, +26, 36, 41, 16, 20, 30, 18, 26, 31, 23, 27, 26, 28, 26, 30, 27, +27, 31, 25, 21, 32, 31, 23, 27, 27, 28, 23, 26, 28, 26, 27, 27, +28, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 59, 79, -95, 46, 116, -96, +65, 33, -96, -21, 50, 206, -253, 106, 313, -220, 79, 262, -56, -76, 263, 21, +-31, 202, -25, -49, 235, -56, 103, -802, -65, 166, -876, 71, 95, -542, 307, 94, +-1206, 230, 500, -1120, 505, 258, -1038, 747, -682, -785, 713, -773, 1104, -3262, 4361, -499, +-6547, 7316, 732, 5016, -11306, -18579, 29233, -14964, -29148, 9889, 29233, -20050, 29233, -10777, -29148, 29233, +-29148, -29148, 29233, 29233, -29148, 29233, 22603, -29148, 29233, 18526, 677, -18346, 29233, -29148, 5209, 22012, +-29148, 29233, 29233, -7655, -29148, 29233, -24267, -5892, 27370, 12465, -22158, 13611, -11974, -21308, -266, 2970, +17247, -21054, -20921, -6101, -12371, 10272, 1104, -7389, 29233, -21639, -2660, -3523, -19086, 18354, -18285, -13466, +8885, 8847, -6670, 15712, 18354, -18853, -12089, 21327, -9402, -22418, 23850, -8821, -29148, 29233, 18695, -17455, +-11253, 4155, 18318, -25759, -12731, 28341, -2396, -3643, -3683, 4992, -9920, -10272, 15443, -5853, 3974, 19085, +13876, -29148, -876, 29233, -21297, -14646, 26092, -22942, -28132, 29233, -4866, -29148, 28252, 3526, -18778, 24975, +-1862, -29148, 10364, 10879, -14184, 13811, -10940, -12084, 29233, -11499, -11749, 20863, 7850, -13203, 2195, 13637, +-6458, 3812, 835, -790, 8413, -28934, 5460, 18568, -6248, 12720, -4035, -6732, 11321, -2646, -21952, 17922, +10979, -20627, 12997, -2821, -18382, 7561, -2701, -8824, 16402, 19104, -11899, -13761, 21049, 14700, -13305, -2480, +13476, -2023, 2072, 10741, -15599, -8282, 17689, 2728, -2650, 7908, 9079, -1126, -14549, 2434, -5193, -7001, +-3998, -5807, 1410, 594, -2013, -15110, 2445, 6199, 1523, -11067, -7432, 13551, 101, -17053, 8557, 6244, +-13836, 13633, -1114, -10433, 1760, 12873, -14361, 5689, 18333, -4223, 8422, -9257, -4948, 12190, 2523, -3487, +-995, -2461, 17872, 1630, -5295, 3888, 2114, -2760, -4148, 4523, -4928, -144, -6258, 3599, 1020, 5621, +-3901, -5207, 14394, -13861, 4578, 3851, -12040, -12772, 10515, -3719, -16331, 20439, 1222, -11470, 7499, 8312, +-17227, 15286, 3920, -19829, 6039, 1577, -15242, 444, 7185, -8709, 10854, 3194, -14214, 8483, 4549, -10001, +1215, 7441, 1215, -1071, 1216, 1830, 15, 1268, -6982, -3075, 10631, -863, 6640, 3858, -4346, -8493, +7676, 4200, -12561, 6666, 2908, 2136, 230, 8577, 1619, -9858, 4319, 3055, -4000, -181, -4133, -4259, +-500, 267, 2296, 6690, 8148, -7720, 2257, 9700, -12322, 2723, 5886, -14828, 2693, 13741, -12057, -1609, +10617, -13086, -7603, 15435, -8168, -12098, 11276, -8825, -6791, 5781, 5122, -4682, -5803, 3905, 970, -470, +538, 473, 1995, -2138, -7529, 11380, 11791, -21308, -29148, 29233, 22568, -18781, 29233, -29148, 4950, 17754, +-27294, -8463, 29233, 2125, -29148, 29233, -15769, -29148, 29233, 6155, -20833, 15087, -9802, -9238, 14779, -14958, +4403, 15169, 5141, -12075, 2489, 3051, -16295, 6821, 8187, -592, -1657, 2134, -11819, 297, -3082, 8008, +5874, -14543, -4743, 1848, 1263, 1497, -1601, 5635, 5830, -5803, 2260, -11774, 4374, 3001, -11516, 1134, +4203, -793, 3963, 10985, 0, -15768, 5804, 11195, -17894, 3371, 11166, -12290, -9016, 19673, -6191, -5899, +4937, -1715, 6307, -14888, -138, 9638, 2626, -12062, 262, 12181, -17525, 5412, 4251, -4953, 7835, 5171, +-5108, -13680, 7070, 12749, -9745, -6686, 11317, -13389, -3742, 17500, -10172, -9727, 13633, -2996, -6622, 10310, +-5090, -13885, 4916, 15294, -10940, -3292, 2037, -85, -1738, 2166, 3802, 1335, 2717, -5282, 7499, 30, +-1286, 8322, -2064, -2232, 8613, -15004, 3928, 15923, -10622, -16725, 18890, 14362, -9009, 13852, -22744, 5892, +9338, -15820, -6000, 9776, -133, -15484, 10754, -3115, -6496, 20602, 4082, -10471, 16390, -1554, -15428, 9528, +1710, -9613, 10691, 10224, -15192, 2397, 7306, -6091, 6940, 1628, 3745, -1204, -8782, 2835, 171, -7459, +1031, 3008, -5897, 668, -4890, -5993, 8195, -1701, 1619, 955, -4037, 3970, -4654, 2113, 136, -16448, +5902, 10837, -5265, 3916, -1046, 2055, -3264, 445, 6428, -2547, -621, -1816, -2219, 1874, -15, 4714, +3808, -5788, 8459, -56, -8178, 3762, 959, 791, -500, -295, 1022, -8212, 917, 2885, -5641, -888, +10591, 2792, -8242, 3591, 902, -4118, -2333, -1782, -5451, -2986, 7707, -4278, -1866, 1929, -1071, 10127, +213, 405, -1416, -2821, -947, 5770, -4080, -9968, 10234, -956, 2908, 4470, -9539, 10287, 2175, -6252, +2141, 7759, -4132, -3230, 11303, -10410, -6900, 4843, -2858, -1500, 2498, 2176, 2110, -590, -3818, -2547, +1738, 709, -6559, 4066, -1832, -6926, 4805, 3998, -3850, 2784, 7759, -3405, -4035, -277, 1823, -1511, +136, 4511, -17, -2322, 5844, -2668, 383, 5187, -3452, 1790, 208, -3389, 1248, 4852, -3487, 3283, +-470, -8212, 3283, 521, 422, 2184, -1368, -4996, -386, 4700, -1563, -5211, 3708, 6023, -3805, -2153, +3449, -547, -2162, 2657, 79, -807, 1575, 996, -1810, -847, 2686, 727, -2593, -4522, 5346, -465, +-2454, 2049, 1032, 1422, 1112, 2522, -5647, -169, 4243, -5824, 3112, 158, -8963, 3301, 4588, -1615, +1157, 2351, 1827, -3818, -1406, -771, -3210, 4071, -1980, -2781, 1379, 4195, -4585, -730, 2202, -581, +1768, 23, 1693, -1019, -1204, 340, 1492, -3561, 1662, 2715, -2894, -1156, 1509, -712, -1626, 3627, +2989, -2916, 154, 5572, -3845, -3187, 5452, -4187, -755, 4650, -6540, -4831, 10081, 1226, -5601, 7501, +-6427, -1061, 6020, -6612, -1478, 7028, -1168, -6238, 5117, 477, -4188, 5720, 4386, -5561, 1491, 3285, +-6448, -2815, 5739, 2574, -6515, 6243, 2366, -6652, 3581, 1354, 1946, 524, -1626, -2186, 2934, -2143, +-3801, 1932, 3038, -162, -1226, 2130, -2810, -1361, 2589, 1552, -1977, 4116, -3603, -1366, 3312, -1738, +-574, 2498, 716, -2962, 4036, 744, -1925, 2830, 1944, -4788, 243, 3163, -2272, -3780, 2647, -596, +-2646, 4616, -5337, 335, 4265, -3956, -858, 4878, -2909, -4598, 2609, -1183, -814, 1776, 932, -2446, +2789, 1001, -3607, 2123, -1202, -1746, 1988, 552, -1926, -591, 1826, -1885, 927, 2276, -1748, 547, +2010, -2207, 74, 86, -1630, 3578, -521, -1337, 2797, -1605, -2394, 2146, 1764, -777, 367, 1985, +-1994, -1942, 2538, -886, -2050, 1678, 622, -1336, 223, 178, -304, 1432, 685, -2343, -600, 1522, +-479, -899, 1312, -1488, 1472, -350, -667, 3820, -2909, -588, 1159, 548, -388, -1779, 2330, 1874, +-465, -560, 17, 761, 313, -250, -1005, -418, 1020, 1068, -1009, 22, 897, -844, -323, -241, +-360, 1241, -1974, -163, 2568, -2119, -2422, 2256, 525, -2033, 5093, -663, -3236, 3102, -1364, -1947, +4045, 319, -3339, 3725, 76, -5453, 3972, 2888, -2954, 2886, 2113, -3291, 469, 62, -1960, 1417, +1001, -1277, -821, 545, -1491, 499, 1059, -217, 492, 2118, -761, -2815, 715, -163, 839, 884, +-2284, 1065, 2038, -1621, 42, 1978, -116, -1555, 2412, -1605, -3340, 2260, -200, -1731, 2287, 1119, +-2556, 143, 2793, -323, -1584, 1328, -1968, -1132, 2029, -1632, -505, 2653, -363, -86, 2168, -1620, +-762, 2041, -847, -657, 633, -409, -346, 257, 534, -1216, 417, 491, 423, 206, -268, -114, +-1012, 1354, -241, -1284, 906, -354, -1168, 1438, 295, -2379, 1575, 76, -518, 1570, -337, -1, +-708, 695, -913, 161, 873, -877, 580, 410, -102, -309, 642, -648, 1043, -47, -886, 553, +618, -1152, 757, 741, -1957, 887, 1820, -1156, -634, 976, -752, 406, 267, 93, 443, 590, +634, -1107, 319, 208, -865, 911, -65, -342, 902, 57, -1101, 844, 1165, -1403, 961, 1386, +-2377, -60, 967, -1385, 139, 784, -103, 356, 596, -684, -1071, 572, 437, -991, 202, 1378, +-867, -4, 253, -499, -81, 957, 4, -444, 841, -259, -376, 500, 488, -699, 71, 723, +-391, -81, 685, -661, 37, 972, -422, -301, 746, -131, -230, 721, -497, 34, 558, -663, +149, 607, -154, -140, 134, -194, -60, 279, -112, 262, 507, 303, -367, -663, 292, 40, +223, 382, -34, 197, 279, -306, -330, 113, -107, -297, 791, -48, -598, 368, -203, 71, +-111, -277, 456, -181, -397, -268, -340, -130, 616, 324, -258, 23, 160, -267, -173, 356, +-90, 442, 65, -277, 113, 42, 55, 370, 312, -313, 149, 248, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22929, 27062, 16925, +21417, 21589, 15226, 22726, 3777, 29273, -18979, -22688, 17194, -6330, -9173, -17793, 1758, -29108, -21925, 6365, +-29108, -922, -29108, -14113, -26882, -21145, -15559, -25109, -5781, -29108, -3329, -16076, -8312, -19659, 8564, -7962, +-4648, 7518, 10445, 3187, 14023, -7420, 14876, 5212, 27844, 14014, -4883, 24040, 13122, 17717, 19397, 12055, +6760, 16275, 21552, 17323, -8758, 28202, 16368, -4639, 14851, 14013, -5734, -753, -1293, -4944, 15941, -8040, +-4037, 12995, 6372, 6586, 8372, 20027, 8191, -9223, 19867, 12773, -13531, 24833, -808, -7590, 20790, -26854, +3057, 5818, 8312, 9901, -10342, -16586, 22479, -6940, -6663, 7108, -13445, -8261, -7766, -24720, -10167, -15382, +-29108, -10567, -13929, -23730, -22197, -29061, -16396, -28323, -21040, -10931, -19172, -16327, -21501, -5415, -15214, -14839, +-10989, -9924, -10785, -7649, -8144, -12442, -790, 942, 8361, 1947, 13797, 10280, 8299, 8027, 13457, 26380, +3077, 12846, 16330, 17634, 11272, 10170, 15808, 17393, 9933, 15679, 11895, -661, 20058, -3586, 12598, 6330, +6655, 1710, 10667, 9254, 1999, 5401, 8095, 9448, 5659, 14523, -2661, 9515, 16028, 1537, -5688, 5400, +6587, 949, 4287, -7826, 341, -4359, -9968, 1938, -11681, -2094, -1545, -8567, -12268, -3888, -9966, 583, +-9644, -10852, -9035, -11609, -8007, -12811, -16074, -9705, -12443, -19220, -18636, 5165, -29108, -7735, -7056, -14448, +-5649, -17564, -15385, -8348, -3232, -16174, -6795, -11845, -9092, -4817, -2305, -16079, -10855, 5553, -6886, 2912, +10221, -4049, 7547, 3330, 7054, 16567, 10245, 13928, 12523, 17204, 9537, 13019, 23015, 8766, 17968, 13816, +15840, 7230, 11969, 12549, 4270, 12111, 14156, 3450, 8398, 12885, -3949, 11249, 1803, 5682, 1233, 15359, +-1361, 3271, 12797, 9379, 7190, 2828, 5584, 3184, 2901, 1942, -1100, 2265, 3374, -5235, -7066, 7340, +-8867, -8165, -552, -7717, -12175, -1536, -10634, -12104, -8233, -14240, -7904, -14265, -10676, -6057, -15061, -9024, +-4899, -9545, -19623, -5818, -5785, -20396, -1454, -18038, -9378, -6139, -16265, -567, -11926, -12850, -7089, -6871, +-13669, -8948, -8125, -15978, -9375, -123, -6267, -8492, -7429, -1836, 4675, -1927, -2831, 4598, 6484, 2886, +14313, 5746, 10075, 9672, 19881, 14525, 11541, 23774, 12284, 18428, 15961, 17181, 16182, 12289, 18264, 9914, +16369, 9572, 13455, 11871, 10905, 12230, 13999, 8127, 794, 8015, 6391, -198, 14580, -4477, 6707, 4811, +-9969, 9030, 5209, 1032, -3643, 6533, -4548, -2329, 452, -8361, -2680, -3845, -6830, -9014, -3183, -6612, +-17404, -5726, -7289, -11821, -12120, -9354, -9510, -16296, -11048, -14995, -8539, -12196, -7391, -15746, -12094, -2879, +-21161, -7572, -7618, -10048, -20786, -7567, -5501, -17039, -4797, -5277, -11309, -8179, -3946, -428, -8516, -2425, +-7629, -15355, 14811, -7559, -8578, 5164, -1298, -3533, 2756, 8652, 781, 12510, 5996, 1446, 11789, 10007, +7943, 12196, 18613, 7229, 14854, 18024, 13017, 15125, 17521, 23417, 14546, 9311, 19752, 20614, 11628, 9357, +16594, 11643, 10246, 19540, 4252, 10246, 9685, 9795, 6101, 3234, 10526, 420, 564, 4586, 502, -3883, +1514, -2616, -5098, -922, -7088, -4868, -3502, -5474, -5017, -4660, -9164, -13633, -6740, -10271, -4204, -13571, +-9906, -6428, -10835, -8078, -10044, -8246, -12106, -9855, -10766, -9454, -16256, -13086, -15072, -11193, -13588, -16907, +-8948, -20937, -16480, -11139, -12884, -6414, -16507, -13825, -2225, -14788, -9779, 8, -11475, -4743, -3359, -1499, +-2582, 6720, 1028, -570, 8840, 4633, 5924, 7378, 6007, 7593, 9006, 9941, 8833, 13411, 17925, 14884, +13052, 12517, 17254, 13032, 18659, 18337, 11471, 16026, 12630, 11831, 16860, 22740, 9180, 9913, 18043, 9989, +8097, 17821, 12497, 4508, 12575, 10548, 2183, 8783, 5033, -624, 2040, 5458, -2219, -2763, 5627, -7383, +-519, -2079, -11212, -7372, -1509, -8073, -9182, -5606, -10868, -7427, -5201, -7279, -8582, -8228, -6502, -8375, +-7884, -5065, -11163, -11312, -6460, -6973, -9312, -6773, -9709, -14676, -7990, -12223, -11419, -9866, -10802, -16599, +-11747, -15789, -14364, -12698, -17147, -10227, -12109, -19101, -11855, -11932, -10177, -5202, -5643, -8117, -9563, 4275, +-4071, 946, 191, 1214, 12194, 5913, 6133, 11739, 8217, 7034, 14406, 17047, 10694, 16576, 16787, 14389, +19120, 16645, 19055, 18304, 16803, 15378, 14819, 13503, 15392, 13858, 9320, 11644, 12871, 7175, 9338, 2345, +10730, 7548, 1760, 4709, 7306, 6965, -468, 8153, 3757, 6063, 3707, -278, 3901, 1084, 1110, -4541, +-2534, 1497, 3533, -4576, -2955, -1306, -867, -6322, -3677, -2679, -5725, -5201, -5589, -5899, -6486, -7630, +-7473, -8901, -6713, -7166, -10153, -8911, -6130, -11620, -9208, -4972, -10109, -10672, -11685, -10408, -10279, -11622, +-10118, -9394, -9680, -11182, -13416, -12287, -10592, -8771, -14347, -12150, -12655, -13673, -12673, -9856, -8794, -9346, +-8106, -3962, -3820, -3032, -297, -663, 6131, -1733, 4499, 14724, 4254, 8027, 9839, 13045, 12165, 13888, +13308, 17225, 18584, 13436, 20949, 14444, 15287, 18214, 15431, 14003, 12606, 12415, 10966, 13439, 12426, 13503, +10328, 9737, 10497, 5109, 4945, 5068, 3005, 4474, 4508, -92, 4829, -473, 1930, 4007, 1428, 8406, +6183, -1513, 2161, 3526, 583, 1854, 2124, 352, 1745, -3816, -2342, -796, -1919, -5057, -1186, -1009, +-5174, -5229, -3361, -6008, -9140, -6949, -9416, -7722, -10823, -11497, -9133, -10955, -9900, -12660, -9763, -10197, +-10448, -15642, -14607, -14240, -14908, -10978, -17156, -14347, -12506, -15403, -14013, -7262, -11126, -12816, -5375, -4071, +-6523, -2827, -7083, -5123, -3770, -2507, -1158, -4123, 86, -71, 899, 2741, 3696, 5594, 5302, 12399, +8047, 5618, 11350, 11123, 11689, 13736, 12724, 15208, 18116, 14055, 16565, 16067, 13604, 13133, 18074, 14906, +11949, 12467, 13463, 10881, 11231, 12549, 10946, 9790, 10030, 8229, 4268, 5669, 6253, 1669, 3056, 3462, +-141, 3209, 787, 1386, 967, -1553, -4845, -374, 888, -1698, -2494, -3997, -5277, 42, -4135, -3634, +-1798, -3297, -3432, -2253, -1583, -2570, -161, -2459, -3681, -3781, -6931, -9460, -5676, -6582, -8665, -8153, +-7320, -10329, -10971, -8406, -8535, -10936, -10420, -10922, -10741, -12477, -13267, -12093, -12443, -12820, -10390, -9589, +-10537, -7802, -12071, -10297, -5416, -7365, -6521, -5940, -1276, -6674, -4609, -4120, -2554, 3505, 1373, 599, +3892, 4145, 4101, 6790, 12582, 7568, 4540, 9806, 10235, 7757, 7748, 8716, 8481, 12039, 8331, 7959, +8311, 10673, 8530, 9614, 10907, 9216, 8043, 11361, 12678, 9969, 10838, 9930, 9554, 12159, 10737, 8989, +8693, 8172, 8778, 7382, 5131, 8144, 3921, 7213, 4935, 3429, 5588, 3502, 3275, 2907, 2901, 1230, +-1563, -884, 2967, -3795, -3425, -2519, -2531, -706, -4022, -3296, -1504, -1988, -5893, -5743, -6374, -3586, +-5297, -10007, -5792, -4765, -8871, -6826, -4773, -7114, -5058, -5378, -8377, -6787, -8612, -10876, -10753, -8592, +-11284, -12384, -11300, -14268, -12872, -10958, -10956, -11570, -12502, -12308, -9210, -9994, -12663, -7559, -8430, -7097, +-6977, -6762, -6208, -3934, 106, -4384, -758, 4346, 1496, 2632, 5657, 6515, 2616, 5204, 8338, 7810, +8156, 10419, 9654, 9146, 10782, 9397, 10716, 11544, 11139, 10913, 12802, 9567, 8150, 9949, 11106, 10142, +9408, 5329, 6986, 10946, 8114, 5020, 8702, 9250, 6452, 5956, 7932, 10242, 10010, 7536, 6863, 9090, +7887, 10383, 8610, 8572, 8273, 6218, 4336, 4085, 6678, 3589, 317, -744, 1087, -178, -262, -1574, +-702, -3975, -6496, -3949, -5089, -6098, -6574, -6721, -9318, -9058, -8392, -10948, -9492, -7075, -9414, -8721, +-9446, -8594, -8720, -8783, -10573, -10573, -7918, -10341, -9828, -10470, -10340, -8902, -8623, -10122, -12675, -6901, +-6954, -8802, -9125, -10882, -8872, -7578, -7115, -9559, -7831, -8349, -8522, -4756, -4822, -5085, -2253, -2265, +-1799, -258, 1149, 598, 3219, 5076, 3301, 4139, 6420, 6098, 6147, 10190, 10527, 10585, 11376, 10478, +12410, 11367, 12128, 11716, 11771, 12018, 11261, 11333, 9678, 11078, 7637, 7653, 9123, 10441, 8988, 5368, +7829, 9531, 7988, 7721, 8200, 9448, 7215, 6466, 9520, 7894, 5248, 5586, 5807, 7932, 3223, 4422, +7358, 5763, 4439, 4765, 3816, 4648, 4713, 3142, 514, 986, 557, 63, -1111, -3020, -3165, -6079, +-5638, -6194, -6085, -6466, -5826, -7464, -9840, -10496, -9114, -10940, -11177, -12299, -9907, -11635, -13982, -11260, +-11591, -10657, -10675, -10269, -10616, -10599, -10020, -12120, -10299, -10954, -11523, -10208, -11276, -9804, -6497, -11960, +-11789, -8759, -7797, -7236, -6598, -6430, -6188, -5063, -2929, -2748, -1696, -2015, -807, 225, 1400, 1697, +881, 4339, 3827, 5409, 5521, 6716, 7210, 8126, 8310, 9610, 10493, 11205, 11979, 12250, 14946, 13347, +13191, 12280, 14370, 15246, 13709, 13305, 13692, 14835, 11495, 12885, 11890, 12121, 10773, 10631, 10551, 9512, +9406, 8217, 8504, 8907, 6999, 5665, 4963, 4495, 4649, 4683, 3956, 3542, 4774, 1261, 1042, 1240, +932, 3087, 1451, -958, -799, -1761, -2638, -1568, -2821, -3688, -3960, -4020, -6474, -5145, -6509, -8513, +-6136, -6037, -8425, -8605, -8666, -9933, -9103, -12091, -13666, -13714, -12071, -13052, -15112, -13704, -14755, -14012, +-12436, -12166, -14075, -13463, -11134, -13047, -13550, -11720, -10558, -10858, -8886, -9476, -9689, -6634, -6770, -6431, +-4807, -5524, -6142, -1770, -1155, -1841, -425, 1861, 759, 1132, 3101, 3123, 3114, 4829, 5264, 5486, +8824, 8913, 8797, 8834, 11923, 10878, 8991, 11284, 13224, 10875, 10987, 13412, 14212, 12474, 12121, 12770, +13870, 16126, 14513, 14946, 16328, 14936, 13696, 13507, 12379, 12578, 12208, 11629, 11284, 9797, 9607, 8685, +8736, 8201, 7462, 6823, 2500, 3561, 3746, 2269, 2555, 1676, 389, -585, -1051, -4055, -4130, -3038, +-3651, -3314, -4273, -5365, -6155, -6981, -6277, -5678, -6596, -7358, -7505, -7780, -8508, -8656, -10700, -9412, +-7396, -9653, -8263, -9360, -10543, -9529, -9986, -11431, -11427, -10421, -13505, -13807, -12219, -13391, -13535, -13984, +-12829, -14260, -14000, -12478, -11840, -12863, -12421, -10589, -10145, -9125, -7878, -8551, -7077, -5522, -5365, -4001, +-3669, -3029, 145, -156, 2437, 4270, 3994, 5717, 4440, 5044, 7591, 7272, 7476, 9922, 10471, 11074, +12147, 12774, 13286, 13569, 12155, 12295, 12659, 12298, 12962, 13286, 13550, 13709, 12369, 12899, 13550, 13492, +13766, 14604, 12885, 12714, 13814, 12944, 12038, 12696, 13231, 12258, 10812, 10574, 10052, 9119, 6356, 7169, +7630, 6869, 5825, 5173, 4414, 2597, 575, -723, 441, -398, -2223, -3087, -4679, -4683, -5618, -6100, +-6516, -4836, -6725, -9067, -8668, -9337, -8705, -9964, -10039, -10300, -10937, -10063, -11972, -13515, -12447, -12051, +-11918, -12598, -12633, -11707, -11787, -12654, -12729, -12642, -12312, -12764, -12439, -13418, -12188, -12488, -12451, -11198, +-10784, -10545, -11232, -9770, -9564, -9290, -8890, -7245, -7080, -5908, -4347, -3543, -3572, -4057, -1727, -970, +342, -47, 2174, 4274, 5833, 6666, 6588, 7839, 8516, 9360, 8880, 9866, 10630, 12555, 13166, 14067, +14533, 14781, 15649, 15446, 15668, 15964, 15464, 14931, 14184, 15209, 15519, 13573, 12284, 12917, 12233, 10630, +10278, 11470, 10086, 9351, 10501, 8364, 6973, 7921, 8367, 7309, 6617, 6127, 4685, 4988, 5166, 3938, +3778, 3032, 3616, 3610, 2765, 1598, 767, -99, -950, -2637, -3383, -3430, -4420, -4974, -6536, -6545, +-5026, -5814, -8301, -8940, -8154, -9627, -10223, -10467, -11107, -11246, -12306, -13716, -13826, -13659, -13116, -12473, +-13378, -13661, -12687, -13368, -12581, -12288, -12867, -13283, -12849, -12526, -12886, -11964, -11040, -11612, -11312, -10487, +-8544, -8181, -8054, -7046, -8160, -6359, -5880, -4309, -3496, -2544, -1247, -629, -613, -80, 1650, 2166, +1819, 3302, 5051, 5601, 6375, 7721, 8920, 9501, 9548, 9912, 11080, 12454, 12531, 11875, 12476, 13247, +14350, 14634, 14471, 15006, 14545, 15130, 15233, 15534, 15425, 14855, 15100, 14239, 12908, 12568, 12024, 11628, +10613, 10082, 8424, 8696, 9614, 7772, 6790, 6267, 6537, 5736, 4029, 2966, 2607, 1562, 515, 471, +84, -931, -977, -1667, -1575, -1672, -1557, -1437, -3025, -1890, -1138, -3159, -4108, -4605, -4916, -5404, +-5083, -6219, -7586, -8142, -8370, -8737, -9672, -10274, -9769, -10652, -12021, -12231, -13468, -13701, -13615, -14378, +-14040, -14282, -14130, -14716, -14480, -13975, -13816, -13138, -13539, -13404, -11801, -10910, -11469, -12001, -10638, -9564, +-8391, -8023, -7655, -6177, -4404, -4013, -3971, -3656, -864, 644, 1082, 1678, 1100, 2098, 3546, 4154, +3911, 6122, 6969, 7492, 8537, 9579, 9904, 9699, 10961, 11579, 11704, 11841, 12083, 12171, 12339, 13552, +14332, 14601, 14958, 14982, 14223, 14549, 14072, 13335, 13875, 14761, 14111, 12045, 11766, 12294, 12262, 12247, +11555, 10104, 9280, 9399, 7188, 6483, 8140, 7157, 4965, 4362, 3164, 2375, 2139, 523, 481, -138, +-309, -957, -1653, -2682, -2760, -2472, -3413, -3572, -4298, -4350, -4495, -6458, -6069, -5663, -6161, -6963, +-6824, -7548, -8229, -8592, -9526, -9580, -9488, -9387, -9751, -9804, -10089, -10562, -10971, -11735, -12305, -12982, +-12520, -13170, -13880, -13436, -13498, -13953, -14520, -14434, -14007, -12147, -12801, -12249, -11643, -11121, -9902, -9208, +-8935, -8798, -7540, -6791, -5950, -4807, -3589, -1901, -1362, -489, 1476, 1768, 2188, 4351, 5154, 5337, +5614, 6550, 7087, 7694, 9197, 9703, 10757, 11465, 12263, 12350, 12712, 13054, 12951, 13296, 13577, 13198, +13469, 13668, 13178, 13938, 14009, 12469, 12350, 13065, 12928, 12771, 12917, 11495, 11939, 12554, 11935, 11181, +11198, 10221, 9675, 9231, 9245, 9144, 8148, 6938, 6257, 5511, 4884, 4828, 3839, 3355, 2347, 1865, +756, -55, -297, -1111, -2143, -2907, -4012, -4939, -5076, -5608, -6743, -7300, -7420, -8345, -8673, -9363, +-9517, -8967, -9235, -10080, -11245, -10906, -11000, -11701, -12102, -12808, -13111, -12717, -12930, -13076, -12958, -12444, +-12839, -13169, -13030, -12378, -12215, -12473, -12835, -13083, -12542, -12092, -11673, -11739, -11039, -10356, -8857, -8422, +-8144, -7245, -7097, -5745, -4937, -4791, -3782, -2427, -1289, -377, 639, 1471, 2604, 3488, 4477, 5419, +6513, 7112, 7647, 8548, 9816, 10298, 10910, 11316, 11814, 12336, 12691, 12734, 13295, 14440, 14413, 13759, +13568, 13747, 14183, 14151, 13891, 13408, 13168, 13986, 13262, 12654, 11574, 11115, 11649, 10984, 9534, 9117, +8835, 8145, 7877, 7879, 7804, 7578, 7116, 5964, 5412, 5321, 5128, 4833, 4386, 3889, 3220, 2091, +1376, 1470, 1371, 781, 31, -401, -1554, -2269, -3461, -4064, -4355, -4886, -5589, -6604, -7784, -8647, +-9401, -9731, -10214, -11432, -11578, -12013, -12571, -13065, -13729, -14149, -13883, -14493, -15031, -15099, -15227, -15090, +-15189, -14643, -14271, -13904, -13734, -12684, -12266, -12959, -12202, -11597, -11158, -10322, -10186, -9786, -9232, -8280, +-7476, -6522, -5138, -4646, -4362, -3544, -2952, -2683, -1953, -886, 360, 1464, 2518, 2725, 3936, 5300, +5825, 6887, 7906, 8640, 9020, 9547, 9896, 10730, 11288, 11753, 12123, 12424, 13148, 13779, 13821, 13476, +14279, 14191, 14366, 15029, 14861, 14067, 13879, 13407, 12896, 13203, 13340, 12802, 11445, 10774, 10302, 10166, +10190, 9421, 8221, 7628, 7270, 6913, 6667, 6611, 5896, 5116, 4429, 4063, 3835, 2497, 1528, 1222, +1016, 901, 294, -901, -1463, -2018, -2376, -2628, -3074, -3163, -3450, -3546, -4709, -5800, -6410, -6859, +-7292, -7934, -8931, -9889, -10437, -10741, -11103, -11395, -11932, -12788, -12926, -13399, -14291, -15128, -15354, -15012, +-15539, -15661, -15337, -15318, -14814, -14687, -14144, -13818, -13338, -12694, -12480, -12106, -11713, -11134, -10456, -9480, +-8339, -7097, -6228, -5351, -4076, -3396, -2543, -1646, -550, 542, 1442, 1639, 1940, 2864, 3643, 4495, +5258, 6421, 7143, 7873, 8192, 8869, 9793, 10731, 11447, 11423, 11918, 11704, 11762, 12408, 12652, 13298, +14028, 14239, 14439, 14366, 14042, 14279, 14635, 14976, 14517, 14077, 13460, 13436, 13380, 12532, 11978, 11313, +10721, 10457, 10270, 9448, 7983, 7645, 7564, 7108, 6183, 4590, 3534, 3426, 3191, 2798, 1846, 1322, +345, -707, -1418, -1687, -1899, -1975, -2403, -2910, -3544, -4622, -4881, -5073, -5128, -5448, -5944, -6777, +-7086, -7611, -8684, -9376, -9675, -9667, -9706, -10483, -11394, -11535, -11920, -12298, -12538, -12483, -12524, -13116, +-13535, -13920, -14429, -14670, -14789, -14658, -14109, -14154, -13919, -13458, -12647, -12068, -11829, -11535, -11097, -10644, +-9878, -9170, -8209, -7487, -6611, -5314, -3953, -2753, -2015, -1394, -1089, 190, 1396, 2296, 3532, 4164, +4211, 5162, 6122, 7051, 8333, 8884, 9481, 10102, 10718, 11143, 11344, 12093, 12590, 12692, 12500, 12617, +12703, 12678, 12899, 13054, 12972, 13012, 13361, 13238, 12803, 12300, 12137, 12106, 12392, 12698, 12293, 11732, +11537, 11749, 11880, 11865, 11347, 10592, 9735, 8980, 8472, 8321, 7730, 6704, 6012, 4965, 3968, 3582, +2857, 2437, 1920, 1104, 104, -940, -1325, -2110, -3019, -3908, -4389, -4860, -5612, -6198, -7445, -8369, +-9154, -10057, -10382, -10487, -10865, -11221, -11765, -11740, -11354, -11721, -11913, -12147, -12089, -12505, -12638, -12685, +-12710, -12802, -13326, -13775, -13778, -13362, -13271, -13283, -13059, -12718, -12452, -12305, -12229, -11730, -10916, -10318, +-9710, -9351, -8729, -7973, -7151, -6368, -5657, -4806, -3720, -2730, -2049, -1355, -874, -209, 730, 1845, +2893, 3627, 4038, 4769, 5214, 6108, 7025, 8074, 8682, 9439, 10240, 10382, 10762, 11313, 11520, 11947, +12424, 12770, 13105, 13466, 13738, 13678, 13619, 13532, 13570, 13761, 13595, 13433, 12950, 12876, 13044, 13114, +12747, 12038, 11097, 10835, 10489, 10217, 9722, 9085, 8750, 7651, 6913, 6624, 6358, 5883, 5720, 5570, +5199, 4692, 3511, 2427, 2139, 1913, 1389, 910, 255, -246, -830, -1859, -2792, -3864, -4560, -5257, +-6138, -7109, -7817, -8906, -9821, -10496, -10936, -11691, -12149, -12119, -12064, -12399, -12896, -13476, -13673, -13972, +-14331, -14683, -15072, -15020, -14925, -14818, -14649, -14600, -14434, -13788, -13061, -12540, -11924, -11747, -11657, -10805, +-10460, -10035, -9090, -8340, -7686, -7080, -6580, -5735, -5149, -4392, -3508, -2954, -2369, -1820, -1156, -371, +530, 1378, 1923, 2543, 3271, 4137, 4939, 5678, 6506, 7334, 8331, 9338, 9841, 10383, 10876, 11438, +12147, 12734, 13024, 13161, 13321, 13549, 13562, 13865, 14150, 14448, 14534, 14396, 14249, 14197, 13856, 13508, +13092, 12483, 12106, 11596, 11262, 10742, 10278, 9567, 8789, 8062, 7784, 7652, 7334, 6655, 5873, 5154, +4845, 4683, 4539, 4288, 3314, 2267, 1633, 899, 563, 145, -478, -1015, -1453, -1914, -2522, -3049, +-3168, -3814, -4483, -5201, -6030, -6760, -7677, -8154, -8853, -9324, -9976, -10748, -11556, -12390, -13167, -13833, +-13965, -14013, -14161, -14652, -14957, -15233, -15331, -15496, -15176, -14883, -14679, -14234, -14035, -13606, -13042, -12500, +-12096, -11143, -10759, -10176, -9481, -8911, -8379, -7847, -7245, -6592, -5818, -5219, -4615, -3892, -3068, -2070, +-1168, -385, 471, 1133, 1788, 2618, 3377, 4018, 4779, 5724, 6528, 7029, 7641, 8196, 8936, 9791, +10250, 10586, 10983, 11546, 11900, 12064, 12517, 12822, 13455, 14190, 14470, 14564, 14856, 14957, 15064, 15079, +14931, 14415, 14133, 13779, 13220, 12679, 11979, 11418, 11176, 11102, 10886, 10179, 9418, 8986, 8491, 7651, +6761, 5957, 5134, 4327, 3718, 2938, 2340, 1935, 1436, 908, 295, -603, -1440, -2017, -2395, -2818, +-3359, -3768, -4100, -4527, -5134, -5815, -6496, -6869, -7373, -8021, -8586, -9100, -9733, -10082, -10402, -10675, +-10911, -11427, -11891, -12370, -12957, -13020, -13320, -13607, -13764, -14027, -14232, -14329, -14375, -14080, -13874, -13695, +-13680, -13668, -13196, -12545, -11933, -11560, -11154, -10828, -10335, -9465, -8765, -7906, -7105, -6321, -5581, -4644, +-3699, -2760, -2014, -1046, -6, 743, 1350, 1835, 2625, 3338, 4113, 4762, 5431, 6436, 7238, 7715, +8529, 9238, 10057, 11021, 11745, 12148, 12427, 12532, 12684, 13055, 13473, 13851, 13952, 14012, 14126, 14028, +13885, 13991, 13924, 13720, 13585, 13119, 12659, 12314, 11972, 11787, 11560, 11327, 11235, 10940, 10670, 10171, +9572, 8913, 8440, 8102, 7548, 7020, 6133, 5126, 4452, 3871, 3160, 2652, 2002, 1231, 158, -532, +-1160, -1898, -2606, -3608, -4447, -5306, -5965, -6566, -7132, -7615, -8243, -8911, -9532, -10274, -10949, -11319, +-11779, -11959, -12042, -11948, -11979, -12098, -12369, -12456, -12460, -12369, -12187, -12313, -12602, -12866, -12980, -13161, +-13051, -12849, -12673, -12765, -12629, -12446, -12254, -11979, -11680, -11443, -11068, -10649, -10450, -9846, -9012, -8032, +-7209, -6556, -5654, -4846, -3802, -2917, -2177, -1300, -443, 460, 1436, 2442, 3554, 4541, 5487, 6456, +7270, 8025, 8830, 9595, 10087, 10450, 10890, 11304, 12077, 12544, 12674, 12760, 12862, 12916, 12932, 13003, +13102, 13183, 13372, 13321, 13096, 12881, 12727, 12678, 12605, 12498, 12210, 11927, 11792, 11658, 11493, 11305, +11035, 10716, 10390, 9959, 9385, 8774, 8118, 7595, 7080, 6477, 5942, 5263, 4452, 3908, 3472, 2900, +2378, 1771, 878, 196, -492, -1215, -1836, -2458, -3311, -4250, -5292, -6096, -6946, -7632, -8297, -9069, +-9668, -10271, -10826, -11294, -11702, -12146, -12591, -12981, -13307, -13620, -13987, -14275, -14406, -14522, -14568, -14399, +-14289, -14053, -13816, -13451, -13123, -12904, -12734, -12780, -12656, -12339, -12217, -11967, -11323, -10683, -9799, -9238, +-8596, -7917, -7246, -6548, -5906, -5365, -4791, -4135, -3486, -2625, -1874, -1248, -573, 307, 1139, 2134, +3017, 3848, 4863, 5707, 6658, 7309, 8031, 8921, 9568, 10035, 10632, 11185, 11777, 12500, 12972, 13308, +13781, 14241, 14396, 14511, 14514, 14283, 14042, 13944, 13801, 13594, 13397, 13375, 13211, 12954, 12693, 12270, +11781, 11407, 10962, 10461, 9884, 9453, 9089, 8740, 8336, 7827, 7294, 6705, 6217, 5780, 5138, 4654, +4107, 3461, 2952, 2262, 1536, 1002, 371, -252, -814, -1522, -2230, -2782, -3209, -3802, -4455, -5283, +-6066, -6795, -7355, -7818, -8380, -8906, -9444, -10139, -10832, -11337, -11784, -12144, -12489, -12877, -13358, -13895, +-14277, -14659, -14826, -14897, -14847, -14792, -14728, -14576, -14459, -14422, -14040, -13576, -13166, -12692, -12384, -12070, +-11571, -10974, -10301, -9446, -8660, -8025, -7338, -6583, -5908, -5199, -4503, -3798, -2994, -2448, -1907, -1391, +-567, 437, 1373, 2340, 3179, 4102, 4879, 5575, 6206, 6937, 7649, 8659, 9415, 10004, 10340, 10631, +10949, 11444, 12148, 12716, 13281, 13830, 14311, 14541, 14731, 14884, 14953, 15111, 15231, 15075, 14728, 14338, +13814, 13516, 13339, 13152, 12876, 12440, 11969, 11525, 10984, 10489, 9933, 9306, 8679, 7933, 7098, 6358, +5708, 5075, 4557, 4058, 3442, 2716, 2029, 1378, 746, 57, -469, -1126, -1748, -2213, -2885, -3541, +-4081, -4595, -5083, -5568, -6146, -6769, -7286, -7649, -8070, -8548, -9000, -9513, -9904, -10581, -11181, -11792, +-12388, -12828, -13093, -13459, -13675, -13867, -14091, -14228, -14438, -14551, -14579, -14526, -14438, -14205, -14068, -13849, +-13636, -13345, -12824, -12313, -11822, -11185, -10521, -9920, -9146, -8483, -7691, -6798, -6053, -5311, -4572, -3754, +-2998, -2220, -1488, -762, -48, 636, 1440, 2311, 3169, 4061, 4814, 5453, 6197, 6879, 7521, 8105, +8778, 9347, 9785, 10281, 10658, 10994, 11327, 11827, 12275, 12793, 13269, 13728, 13972, 14119, 14215, 14255, +14459, 14560, 14536, 14489, 14448, 14361, 14220, 13882, 13469, 13013, 12541, 12009, 11552, 11116, 10604, 10093, +9594, 9105, 8463, 7679, 6982, 6291, 5630, 5082, 4527, 3933, 3219, 2496, 1710, 882, 223, -441, +-1220, -2036, -2714, -3422, -4013, -4507, -5042, -5863, -6727, -7615, -8508, -9079, -9672, -10239, -10645, -10950, +-11213, -11399, -11694, -11935, -12172, -12549, -12896, -13192, -13505, -13751, -13920, -14111, -14122, -14163, -14118, -13880, +-13670, -13426, -13255, -13175, -13070, -12862, -12579, -12270, -12089, -11768, -11336, -10728, -10047, -9282, -8612, -7931, +-7196, -6438, -5736, -4957, -4190, -3393, -2421, -1583, -679, 214, 1125, 2206, 3270, 4270, 5211, 6134, +6938, 7688, 8228, 8603, 8984, 9538, 10024, 10522, 10967, 11345, 11813, 12223, 12673, 13009, 13262, 13348, +13354, 13308, 13330, 13347, 13316, 13405, 13460, 13451, 13430, 13316, 13166, 13052, 12801, 12392, 12085, 11646, +11346, 11023, 10683, 10370, 10077, 9767, 9320, 8787, 8216, 7670, 7101, 6429, 5737, 4956, 4111, 3265, +2616, 1912, 1303, 644, -30, -581, -1236, -1904, -2692, -3527, -4352, -5176, -5970, -6643, -7343, -8138, +-8839, -9490, -10124, -10620, -11078, -11541, -11930, -12418, -12921, -13251, -13526, -13755, -14056, -14301, -14554, -14723, +-14847, -14903, -14901, -14833, -14713, -14459, -14213, -13864, -13522, -13173, -12766, -12291, -11899, -11518, -11017, -10459, +-9784, -9161, -8496, -7816, -7133, -6357, -5644, -5093, -4588, -4044, -3504, -2698, -1829, -978, 40, 945, +1912, 2818, 3592, 4301, 5138, 5901, 6761, 7560, 8307, 9076, 9801, 10441, 11046, 11621, 12077, 12643, +13125, 13434, 13755, 14060, 14328, 14681, 14867, 14911, 14759, 14507, 14317, 13973, 13704, 13436, 13130, 12793, +12546, 12220, 11796, 11475, 11102, 10674, 10294, 9858, 9366, 8974, 8627, 8305, 7885, 7353, 6805, 6286, +5612, 4836, 4126, 3407, 2796, 2251, 1626, 1058, 511, -95, -567, -1123, -1764, -2435, -3154, -3844, +-4558, -5253, -5944, -6613, -7229, -7821, -8493, -9098, -9731, -10421, -11085, -11683, -12176, -12650, -13067, -13371, +-13727, -13995, -14260, -14518, -14664, -14723, -14672, -14579, -14458, -14274, -14076, -13990, -13761, -13443, -13217, -12936, +-12510, -12137, -11670, -11108, -10583, -9993, -9444, -8991, -8422, -7789, -6990, -6108, -5356, -4563, -3909, -3302, +-2569, -1885, -1061, -194, 657, 1551, 2534, 3415, 4230, 5042, 5799, 6498, 7185, 7794, 8453, 9081, +9680, 10320, 10955, 11574, 12330, 12930, 13396, 13821, 14119, 14300, 14435, 14608, 14600, 14625, 14630, 14605, +14543, 14509, 14468, 14375, 14258, 14038, 13692, 13192, 12781, 12340, 11776, 11176, 10575, 9921, 9307, 8718, +8021, 7378, 6731, 6120, 5572, 5000, 4370, 3741, 2935, 2271, 1641, 1041, 593, 118, -385, -963, +-1662, -2365, -3027, -3650, -4356, -5089, -5801, -6597, -7276, -7881, -8403, -8905, -9334, -9720, -10068, -10455, +-10778, -11136, -11575, -11960, -12412, -12874, -13302, -13622, -13932, -14137, -14241, -14339, -14313, -14282, -14123, -13925, +-13886, -13787, -13714, -13628, -13354, -12923, -12551, -12002, -11371, -10767, -10041, -9328, -8686, -8019, -7302, -6687, +-6020, -5317, -4603, -3837, -3103, -2310, -1556, -765, 79, 878, 1698, 2479, 3237, 4011, 4760, 5441, +6045, 6541, 7092, 7643, 8283, 8951, 9647, 10352, 10979, 11637, 12167, 12566, 12892, 13200, 13439, 13675, +13872, 13937, 14042, 14231, 14323, 14441, 14534, 14508, 14504, 14435, 14194, 13941, 13524, 13072, 12664, 12162, +11658, 11123, 10547, 10063, 9608, 9137, 8628, 8061, 7381, 6676, 5951, 5182, 4485, 3762, 2966, 2215, +1424, 764, 147, -418, -952, -1500, -2156, -2828, -3533, -4395, -5228, -5954, -6679, -7295, -7830, -8406, +-8970, -9547, -10058, -10473, -10900, -11316, -11711, -12202, -12551, -12811, -13047, -13252, -13469, -13730, -13952, -14133, +-14260, -14310, -14338, -14209, -14072, -13861, -13628, -13386, -13129, -12879, -12559, -12270, -11866, -11409, -10879, -10218, +-9540, -8953, -8319, -7719, -7213, -6652, -6000, -5357, -4611, -3775, -2903, -1955, -978, -41, 816, 1699, +2556, 3371, 4085, 4798, 5514, 6151, 6823, 7576, 8312, 9029, 9709, 10283, 10799, 11223, 11608, 11939, +12198, 12449, 12667, 12767, 12822, 12920, 12907, 13040, 13191, 13292, 13416, 13541, 13516, 13526, 13444, 13233, +13054, 12775, 12471, 12238, 11902, 11564, 11147, 10738, 10264, 9830, 9314, 8761, 8252, 7643, 7116, 6610, +6145, 5661, 5207, 4608, 3912, 3164, 2363, 1601, 873, 117, -553, -1348, -2088, -2784, -3591, -4327, +-5022, -5813, -6483, -7154, -7873, -8580, -9270, -9868, -10359, -10819, -11246, -11693, -12189, -12642, -13063, -13471, +-13773, -13921, -14040, -14139, -14160, -14275, -14304, -14254, -14190, -14091, -13937, -13772, -13564, -13267, -12992, -12667, +-12354, -11992, -11636, -11246, -10914, -10487, -10032, -9519, -8759, -7998, -7121, -6281, -5583, -4809, -4020, -3222, +-2415, -1583, -746, 83, 783, 1596, 2412, 3278, 4111, 4970, 5699, 6330, 7032, 7606, 8252, 8952, +9567, 10201, 10803, 11361, 11882, 12371, 12811, 13290, 13662, 13963, 14167, 14197, 14218, 14220, 14120, 14039, +13938, 13745, 13589, 13384, 13119, 12799, 12499, 12157, 11787, 11397, 11009, 10644, 10295, 9915, 9495, 9022, +8481, 7973, 7449, 6904, 6373, 5773, 5131, 4571, 3985, 3424, 2936, 2368, 1825, 1269, 718, 121, +-487, -1177, -1898, -2596, -3329, -4003, -4687, -5374, -6044, -6718, -7418, -8021, -8651, -9253, -9774, -10267, +-10698, -11121, -11524, -11964, -12419, -12852, -13268, -13596, -13849, -14048, -14233, -14398, -14476, -14548, -14558, -14351, +-14212, -13973, -13664, -13393, -13020, -12625, -12212, -11739, -11249, -10732, -10219, -9736, -9237, -8670, -8199, -7680, +-7095, -6587, -5933, -5175, -4382, -3539, -2648, -1837, -1004, -206, 523, 1286, 2068, 2872, 3659, 4401, +5084, 5860, 6561, 7330, 8135, 8890, 9647, 10352, 10957, 11463, 11957, 12294, 12638, 12974, 13295, 13581, +13821, 14034, 14159, 14187, 14184, 14146, 14193, 14215, 14241, 14085, 13915, 13681, 13365, 12937, 12587, 12123, +11633, 11214, 10704, 10205, 9720, 9181, 8665, 8148, 7547, 6952, 6273, 5569, 4957, 4307, 3619, 3002, +2297, 1605, 942, 290, -304, -858, -1526, -2170, -2797, -3442, -4047, -4657, -5228, -5715, -6234, -6795, +-7304, -7866, -8440, -8922, -9493, -9960, -10368, -10823, -11260, -11653, -12092, -12458, -12754, -13051, -13251, -13462, +-13656, -13746, -13867, -13952, -13999, -14011, -14010, -13812, -13588, -13306, -12930, -12559, -12161, -11794, -11400, -10973, +-10456, -9907, -9289, -8694, -8073, -7410, -6712, -5940, -5166, -4479, -3791, -3059, -2351, -1602, -838, -117, +579, 1315, 2084, 2828, 3604, 4307, 5030, 5714, 6313, 6907, 7485, 8100, 8703, 9290, 9763, 10269, +10714, 11120, 11570, 11988, 12418, 12899, 13336, 13721, 14113, 14340, 14495, 14606, 14578, 14530, 14376, 14155, +14049, 13886, 13705, 13486, 13110, 12735, 12316, 11808, 11270, 10726, 10124, 9491, 8809, 8131, 7478, 6917, +6367, 5862, 5275, 4689, 4044, 3358, 2634, 1912, 1165, 414, -230, -816, -1464, -2055, -2675, -3317, +-3915, -4505, -5117, -5716, -6414, -7095, -7740, -8366, -8938, -9464, -9977, -10439, -10909, -11279, -11646, -11988, +-12293, -12564, -12830, -13061, -13266, -13455, -13526, -13624, -13641, -13631, -13571, -13500, -13363, -13224, -13046, -12793, +-12463, -12116, -11712, -11362, -11044, -10656, -10258, -9792, -9257, -8713, -8177, -7577, -7007, -6380, -5678, -4954, +-4119, -3329, -2521, -1766, -1065, -388, 295, 891, 1638, 2402, 3163, 3938, 4718, 5437, 6145, 6864, +7560, 8293, 8986, 9599, 10218, 10756, 11249, 11744, 12141, 12496, 12838, 13054, 13252, 13435, 13485, 13562, +13615, 13580, 13577, 13484, 13357, 13226, 13027, 12822, 12592, 12362, 12076, 11773, 11440, 11102, 10778, 10426, +10057, 9681, 9236, 8769, 8288, 7761, 7211, 6639, 6026, 5440, 4879, 4277, 3649, 2968, 2241, 1538, +846, 118, -473, -1250, -1992, -2671, -3379, -4043, -4721, -5405, -6122, -6823, -7557, -8245, -8899, -9509, +-10010, -10439, -10869, -11237, -11592, -11995, -12313, -12634, -12896, -13099, -13215, -13354, -13450, -13534, -13638, -13586, +-13541, -13422, -13271, -13151, -12983, -12837, -12654, -12353, -12047, -11724, -11368, -11012, -10621, -10137, -9604, -9006, +-8297, -7632, -6979, -6357, -5766, -5101, -4455, -3777, -3084, -2363, -1610, -817, -39, 627, 1415, 2167, +2902, 3692, 4446, 5211, 5991, 6727, 7450, 8146, 8769, 9389, 9953, 10494, 10985, 11381, 11745, 12098, +12390, 12700, 12954, 13161, 13313, 13445, 13480, 13515, 13528, 13472, 13446, 13360, 13233, 13082, 12868, 12598, +12304, 11981, 11583, 11213, 10841, 10402, 9984, 9503, 8967, 8438, 7887, 7335, 6814, 6241, 5704, 5170, +4633, 4059, 3535, 2923, 2378, 1753, 1133, 544, -97, -636, -1339, -2000, -2682, -3372, -4034, -4722, +-5330, -5955, -6580, -7205, -7810, -8404, -8989, -9532, -10042, -10529, -10995, -11400, -11819, -12227, -12569, -12902, +-13197, -13417, -13565, -13708, -13747, -13816, -13825, -13735, -13613, -13376, -13069, -12785, -12463, -12203, -11938, -11616, +-11239, -10832, -10361, -9878, -9415, -8898, -8380, -7887, -7343, -6777, -6162, -5519, -4911, -4261, -3633, -2957, +-2252, -1514, -792, 19, 737, 1523, 2327, 3038, 3754, 4456, 5165, 5855, 6550, 7242, 7907, 8546, +9186, 9785, 10314, 10855, 11362, 11858, 12269, 12621, 12927, 13156, 13413, 13615, 13718, 13818, 13839, 13779, +13705, 13545, 13326, 13166, 12944, 12737, 12535, 12177, 11842, 11426, 10938, 10501, 10035, 9543, 9098, 8612, +8049, 7488, 6871, 6262, 5753, 5264, 4797, 4357, 3907, 3394, 2872, 2315, 1684, 1003, 277, -396, +-1107, -1930, -2661, -3357, -4062, -4644, -5220, -5814, -6358, -6892, -7438, -7887, -8358, -8798, -9225, -9651, +-10067, -10498, -10886, -11277, -11665, -12019, -12336, -12635, -12871, -13024, -13182, -13271, -13327, -13365, -13396, -13390, +-13316, -13231, -13017, -12743, -12434, -12093, -11777, -11417, -11012, -10611, -10104, -9532, -9014, -8400, -7788, -7178, +-6514, -5845, -5154, -4471, -3736, -3020, -2298, -1587, -878, -151, 545, 1276, 2052, 2767, 3487, 4208, +4857, 5553, 6158, 6798, 7426, 7995, 8525, 9005, 9475, 9883, 10305, 10681, 11093, 11464, 11776, 12156, +12447, 12714, 12972, 13173, 13286, 13407, 13413, 13324, 13266, 13109, 12969, 12785, 12549, 12324, 12058, 11799, +11533, 11175, 10829, 10404, 9989, 9526, 9057, 8575, 7983, 7412, 6721, 5997, 5281, 4573, 3896, 3316, +2802, 2293, 1772, 1220, 603, -22, -624, -1340, -1997, -2687, -3315, -3935, -4535, -5067, -5603, -6151, +-6720, -7323, -7896, -8492, -9061, -9605, -10120, -10565, -10970, -11312, -11626, -11899, -12129, -12291, -12415, -12527, +-12553, -12617, -12678, -12736, -12783, -12745, -12781, -12748, -12657, -12578, -12386, -12178, -11896, -11588, -11258, -10852, +-10417, -9981, -9484, -8958, -8421, -7878, -7286, -6681, -6032, -5335, -4671, -3907, -3216, -2494, -1715, -984, +-170, 553, 1267, 2029, 2752, 3454, 4172, 4872, 5575, 6274, 6963, 7603, 8285, 8864, 9409, 9944, +10372, 10740, 11084, 11337, 11612, 11856, 12071, 12290, 12488, 12630, 12777, 12844, 12861, 12866, 12830, 12799, +12744, 12625, 12445, 12247, 11981, 11688, 11363, 11007, 10638, 10307, 9889, 9444, 9031, 8555, 8088, 7651, +7184, 6725, 6217, 5652, 5077, 4475, 3805, 3200, 2582, 1991, 1401, 833, 169, -404, -1110, -1831, +-2537, -3249, -3942, -4576, -5202, -5763, -6331, -6876, -7394, -7896, -8380, -8865, -9329, -9772, -10172, -10555, +-10939, -11246, -11550, -11811, -12005, -12159, -12287, -12336, -12435, -12473, -12498, -12559, -12556, -12555, -12540, -12472, +-12363, -12234, -12004, -11741, -11401, -11029, -10620, -10210, -9732, -9299, -8821, -8310, -7794, -7206, -6626, -6030, +-5413, -4789, -4164, -3491, -2848, -2174, -1487, -780, -47, 627, 1421, 2188, 2983, 3710, 4476, 5210, +5897, 6634, 7306, 8001, 8617, 9195, 9755, 10273, 10755, 11174, 11537, 11889, 12147, 12378, 12601, 12749, +12863, 12938, 12960, 12912, 12864, 12736, 12610, 12479, 12318, 12184, 12034, 11837, 11636, 11365, 11072, 10732, +10328, 9922, 9452, 8996, 8537, 8044, 7554, 7069, 6560, 6051, 5494, 4917, 4305, 3702, 3071, 2403, +1754, 1117, 486, -134, -640, -1250, -1793, -2357, -2936, -3528, -4132, -4679, -5296, -5832, -6376, -6928, +-7462, -7971, -8444, -8889, -9304, -9717, -10099, -10514, -10901, -11248, -11649, -11957, -12223, -12491, -12667, -12774, +-12872, -12854, -12809, -12740, -12593, -12408, -12199, -11968, -11716, -11460, -11145, -10815, -10470, -10056, -9614, -9178, +-8703, -8280, -7860, -7414, -6954, -6475, -5944, -5397, -4802, -4130, -3526, -2833, -2186, -1572, -900, -255, +364, 991, 1722, 2407, 3149, 3815, 4497, 5173, 5821, 6446, 7073, 7630, 8174, 8713, 9185, 9706, +10184, 10653, 11119, 11516, 11886, 12266, 12535, 12808, 13031, 13154, 13242, 13296, 13233, 13152, 13035, 12846, +12630, 12394, 12074, 11746, 11416, 11093, 10739, 10381, 9941, 9493, 8990, 8466, 7998, 7503, 7025, 6515, +6008, 5487, 4954, 4398, 3826, 3269, 2613, 2027, 1408, 821, 233, -275, -828, -1421, -1964, -2589, +-3198, -3857, -4503, -5163, -5792, -6372, -6977, -7521, -8058, -8549, -8998, -9410, -9696, -10004, -10300, -10517, +-10786, -11057, -11268, -11497, -11722, -11964, -12164, -12313, -12419, -12444, -12392, -12348, -12226, -12085, -11958, -11763, +-11564, -11350, -11095, -10821, -10517, -10158, -9735, -9278, -8728, -8157, -7549, -6936, -6363, -5752, -5170, -4630, +-4062, -3487, -2910, -2234, -1560, -847, -117, 546, 1224, 1899, 2556, 3170, 3810, 4414, 4992, 5604, +6138, 6681, 7209, 7701, 8232, 8734, 9217, 9709, 10162, 10562, 10920, 11233, 11480, 11707, 11873, 12054, +12192, 12316, 12454, 12524, 12560, 12540, 12500, 12398, 12249, 12062, 11807, 11461, 11151, 10772, 10361, 10020, +9582, 9167, 8743, 8220, 7769, 7309, 6826, 6347, 5830, 5318, 4768, 4205, 3621, 3042, 2409, 1786, +1183, 570, -35, -514, -1105, -1638, -2124, -2697, -3266, -3861, -4507, -5132, -5704, -6268, -6777, -7279, +-7765, -8225, -8668, -9090, -9477, -9883, -10221, -10525, -10867, -11151, -11419, -11709, -11918, -12144, -12326, -12446, +-12565, -12572, -12524, -12482, -12322, -12131, -11937, -11651, -11380, -11041, -10727, -10344, -10002, -9631, -9225, -8859, +-8419, -7970, -7442, -6883, -6272, -5676, -5037, -4442, -3814, -3193, -2587, -1938, -1261, -565, 125, 770, +1491, 2188, 2861, 3481, 4148, 4793, 5432, 6038, 6678, 7256, 7793, 8324, 8796, 9257, 9706, 10115, +10488, 10826, 11093, 11370, 11569, 11729, 11902, 11995, 12049, 12100, 12077, 12048, 12011, 11901, 11823, 11667, +11508, 11361, 11147, 10973, 10730, 10419, 10115, 9772, 9384, 8981, 8585, 8090, 7634, 7088, 6564, 6015, +5476, 4981, 4483, 4016, 3502, 2992, 2440, 1816, 1178, 503, -165, -758, -1419, -2010, -2558, -3105, +-3604, -4149, -4661, -5209, -5755, -6307, -6844, -7374, -7890, -8361, -8816, -9234, -9640, -10039, -10374, -10698, +-11003, -11204, -11420, -11591, -11737, -11860, -11954, -12018, -12051, -12064, -12065, -12001, -11937, -11817, -11630, -11452, +-11208, -10938, -10685, -10388, -10094, -9794, -9488, -9174, -8809, -8439, -7990, -7502, -6932, -6341, -5725, -5042, +-4362, -3634, -2926, -2201, -1418, -672, 114, 820, 1601, 2354, 3073, 3797, 4448, 5121, 5760, 6397, +7016, 7572, 8148, 8701, 9183, 9706, 10173, 10619, 11041, 11391, 11679, 11955, 12138, 12278, 12390, 12445, +12479, 12488, 12436, 12386, 12309, 12185, 12095, 11938, 11766, 11553, 11332, 11076, 10764, 10454, 10139, 9752, +9412, 9039, 8589, 8196, 7716, 7209, 6658, 6087, 5501, 4911, 4306, 3732, 3190, 2642, 2130, 1555, +956, 321, -299, -960, -1678, -2338, -2950, -3543, -4132, -4681, -5202, -5720, -6203, -6688, -7166, -7611, +-8072, -8512, -8949, -9332, -9692, -10031, -10374, -10687, -10975, -11252, -11491, -11692, -11885, -11994, -12106, -12176, +-12222, -12240, -12259, -12195, -12162, -12037, -11875, -11691, -11468, -11190, -10865, -10485, -10076, -9623, -9140, -8702, +-8207, -7730, -7255, -6712, -6156, -5596, -5008, -4393, -3762, -3172, -2541, -1950, -1295, -710, -116, 445, +997, 1625, 2262, 2913, 3625, 4352, 5068, 5818, 6511, 7189, 7847, 8446, 8987, 9530, 10008, 10419, +10863, 11209, 11542, 11849, 12128, 12392, 12593, 12786, 12947, 13020, 13100, 13088, 13038, 12972, 12825, 12675, +12423, 12188, 11903, 11551, 11223, 10851, 10441, 9981, 9516, 9021, 8501, 8027, 7581, 7132, 6671, 6225, +5739, 5176, 4617, 4022, 3383, 2794, 2194, 1548, 954, 334, -261, -845, -1524, -2179, -2835, -3467, +-4108, -4694, -5281, -5842, -6345, -6885, -7358, -7857, -8398, -8894, -9381, -9860, -10271, -10650, -11034, -11337, +-11614, -11874, -12047, -12208, -12326, -12375, -12455, -12480, -12499, -12447, -12364, -12257, -12091, -11921, -11711, -11533, +-11294, -11041, -10763, -10457, -10089, -9718, -9312, -8901, -8459, -8000, -7459, -6877, -6286, -5627, -4998, -4384, +-3734, -3126, -2441, -1793, -1105, -388, 283, 929, 1657, 2332, 3021, 3706, 4377, 5062, 5694, 6309, +6879, 7408, 7902, 8347, 8792, 9198, 9555, 9934, 10281, 10641, 10952, 11266, 11572, 11810, 12074, 12314, +12486, 12667, 12756, 12812, 12864, 12801, 12763, 12682, 12526, 12352, 12110, 11819, 11488, 11127, 10717, 10333, +9862, 9408, 8934, 8398, 7899, 7390, 6887, 6374, 5907, 5419, 4880, 4342, 3778, 3160, 2532, 1838, +1162, 471, -206, -789, -1442, -2059, -2668, -3270, -3863, -4437, -5020, -5614, -6191, -6747, -7221, -7755, +-8215, -8668, -9156, -9603, -10063, -10520, -10914, -11259, -11630, -11924, -12184, -12417, -12611, -12736, -12847, -12907, +-12971, -12974, -12963, -12909, -12831, -12706, -12531, -12334, -12079, -11795, -11451, -11074, -10672, -10261, -9783, -9317, +-8817, -8257, -7703, -7054, -6404, -5718, -5033, -4321, -3617, -2917, -2208, -1518, -805, -116, 509, 1158, +1863, 2500, 3146, 3753, 4387, 5005, 5616, 6222, 6822, 7402, 7963, 8490, 9007, 9480, 9979, 10432, +10854, 11271, 11611, 11937, 12190, 12423, 12583, 12727, 12780, 12835, 12835, 12755, 12665, 12532, 12407, 12265, +12128, 11972, 11767, 11538, 11287, 10973, 10665, 10309, 9940, 9555, 9089, 8614, 8054, 7456, 6851, 6218, +5634, 5068, 4514, 3964, 3415, 2863, 2308, 1734, 1143, 500, -85, -639, -1307, -1886, -2446, -3001, +-3516, -4003, -4490, -5020, -5516, -6087, -6620, -7183, -7729, -8308, -8811, -9357, -9869, -10356, -10812, -11216, +-11557, -11869, -12159, -12375, -12582, -12698, -12789, -12848, -12844, -12859, -12868, -12806, -12794, -12706, -12555, -12399, +-12167, -11894, -11598, -11258, -10875, -10496, -10019, -9589, -9098, -8614, -8119, -7577, -7041, -6454, -5859, -5235, +-4532, -3837, -3147, -2382, -1667, -935, -215, 474, 1146, 1909, 2635, 3395, 4089, 4837, 5521, 6249, +6943, 7587, 8237, 8791, 9338, 9812, 10253, 10670, 11084, 11466, 11837, 12207, 12494, 12776, 13022, 13152, +13260, 13283, 13277, 13216, 13131, 13048, 12855, 12726, 12550, 12298, 12086, 11785, 11493, 11143, 10774, 10387, +9983, 9574, 9140, 8700, 8226, 7722, 7200, 6643, 6074, 5483, 4845, 4245, 3587, 2962, 2323, 1694, +1097, 497, -62, -598, -1203, -1873, -2455, -3073, -3661, -4233, -4776, -5328, -5895, -6465, -7029, -7587, +-8133, -8618, -9073, -9515, -9904, -10262, -10620, -10903, -11191, -11454, -11679, -11873, -12076, -12239, -12385, -12520, +-12626, -12683, -12693, -12693, -12646, -12527, -12451, -12251, -12060, -11850, -11589, -11275, -10982, -10588, -10172, -9728, +-9200, -8683, -8127, -7570, -7042, -6470, -5944, -5366, -4780, -4169, -3580, -2935, -2235, -1552, -838, -116, +556, 1251, 2004, 2723, 3435, 4112, 4754, 5443, 6089, 6772, 7428, 8068, 8736, 9323, 9909, 10443, +10936, 11396, 11808, 12160, 12488, 12790, 13028, 13257, 13395, 13531, 13574, 13556, 13546, 13473, 13376, 13260, +13085, 12882, 12675, 12391, 12102, 11743, 11354, 10912, 10426, 9939, 9444, 8908, 8402, 7872, 7340, 6834, +6281, 5766, 5190, 4606, 4007, 3406, 2802, 2188, 1573, 973, 369, -205, -720, -1380, -1958, -2576, +-3204, -3838, -4446, -5068, -5695, -6353, -6935, -7558, -8146, -8723, -9241, -9735, -10201, -10581, -10952, -11270, +-11578, -11855, -12100, -12309, -12462, -12637, -12717, -12821, -12885, -12885, -12868, -12812, -12742, -12656, -12487, -12325, +-12065, -11848, -11548, -11221, -10882, -10499, -10142, -9723, -9297, -8824, -8369, -7802, -7239, -6644, -6043, -5418, +-4836, -4231, -3627, -3051, -2420, -1773, -1147, -437, 251, 887, 1653, 2418, 3129, 3912, 4633, 5336, +6054, 6721, 7323, 7932, 8516, 9016, 9504, 9990, 10393, 10864, 11202, 11585, 11965, 12210, 12525, 12774, +12973, 13154, 13269, 13320, 13316, 13284, 13221, 13136, 12981, 12893, 12692, 12470, 12267, 11996, 11662, 11309, +10911, 10479, 10031, 9556, 9046, 8518, 7973, 7423, 6826, 6244, 5671, 5077, 4495, 3920, 3334, 2769, +2210, 1628, 1027, 432, -184, -780, -1470, -2183, -2863, -3534, -4173, -4842, -5427, -6069, -6676, -7264, +-7835, -8366, -8925, -9393, -9866, -10274, -10646, -11007, -11297, -11605, -11851, -12123, -12349, -12532, -12670, -12832, +-12938, -13008, -13095, -13112, -13119, -13109, -13045, -12956, -12793, -12572, -12291, -11952, -11566, -11153, -10698, -10209, +-9761, -9272, -8795, -8293, -7749, -7212, -6614, -6003, -5358, -4669, -4018, -3305, -2622, -1950, -1259, -557, +140, 737, 1509, 2215, 2915, 3631, 4332, 5013, 5690, 6367, 6986, 7650, 8259, 8848, 9389, 9929, +10419, 10854, 11223, 11620, 11957, 12241, 12523, 12755, 12981, 13140, 13292, 13398, 13430, 13458, 13377, 13285, +13142, 12974, 12720, 12462, 12196, 11864, 11515, 11143, 10800, 10397, 10040, 9629, 9205, 8780, 8315, 7838, +7328, 6795, 6227, 5651, 5037, 4364, 3744, 3051, 2403, 1783, 1171, 562, -24, -539, -1222, -1837, +-2450, -3106, -3707, -4298, -4895, -5468, -6034, -6561, -7106, -7656, -8156, -8673, -9177, -9655, -10094, -10531, +-10919, -11322, -11693, -12028, -12348, -12593, -12831, -13003, -13109, -13166, -13194, -13164, -13111, -13045, -12949, -12812, +-12653, -12485, -12259, -12015, -11756, -11407, -11031, -10625, -10136, -9646, -9164, -8670, -8166, -7667, -7130, -6602, +-6051, -5447, -4810, -4185, -3491, -2824, -2150, -1436, -745, 3, 600, 1399, 2167, 2907, 3689, 4394, +5120, 5828, 6492, 7156, 7810, 8436, 9037, 9657, 10175, 10677, 11169, 11564, 11938, 12239, 12525, 12760, +12932, 13056, 13200, 13248, 13283, 13313, 13292, 13283, 13231, 13110, 12974, 12820, 12630, 12395, 12106, 11836, +11461, 11088, 10701, 10255, 9858, 9370, 8915, 8436, 7955, 7396, 6862, 6284, 5677, 5055, 4391, 3757, +3054, 2396, 1700, 1038, 393, -248, -787, -1464, -2127, -2754, -3435, -4072, -4737, -5340, -5993, -6639, +-7196, -7802, -8324, -8857, -9308, -9727, -10109, -10483, -10820, -11138, -11429, -11731, -11976, -12199, -12408, -12549, +-12688, -12754, -12816, -12866, -12818, -12806, -12783, -12650, -12589, -12469, -12270, -12091, -11887, -11608, -11347, -11049, +-10667, -10302, -9841, -9364, -8856, -8297, -7706, -7097, -6454, -5768, -5089, -4424, -3738, -3032, -2347, -1657, +-970, -307, 352, 976, 1687, 2411, 3092, 3796, 4466, 5150, 5782, 6449, 7037, 7643, 8170, 8701, +9238, 9711, 10188, 10648, 11070, 11468, 11844, 12215, 12495, 12773, 12937, 13120, 13237, 13302, 13390, 13429, +13405, 13358, 13313, 13157, 13035, 12853, 12610, 12344, 12030, 11664, 11235, 10762, 10286, 9755, 9224, 8714, +8161, 7649, 7151, 6616, 6082, 5557, 5003, 4469, 3898, 3297, 2697, 2105, 1425, 785, 93, -455, +-1114, -1822, -2455, -3154, -3818, -4520, -5198, -5881, -6565, -7197, -7848, -8404, -8958, -9455, -9903, -10262, +-10625, -10952, -11285, -11561, -11857, -12153, -12359, -12610, -12840, -13018, -13222, -13362, -13463, -13558, -13568, -13496, +-13414, -13232, -13035, -12762, -12406, -12085, -11663, -11261, -10827, -10351, -9909, -9431, -8927, -8431, -7926, -7377, +-6851, -6287, -5650, -5049, -4362, -3662, -2963, -2257, -1532, -822, -120, 512, 1175, 1903, 2595, 3271, +3981, 4668, 5372, 6046, 6708, 7339, 7972, 8547, 9073, 9566, 10056, 10484, 10936, 11285, 11646, 11965, +12250, 12450, 12688, 12812, 12946, 13040, 13083, 13092, 13064, 13026, 12958, 12850, 12727, 12554, 12385, 12170, +11909, 11644, 11339, 11026, 10629, 10180, 9757, 9206, 8686, 8169, 7594, 7066, 6549, 6010, 5458, 4923, +4353, 3799, 3202, 2636, 2017, 1375, 765, 70, -454, -1158, -1825, -2412, -3090, -3655, -4303, -4868, +-5477, -6026, -6601, -7128, -7637, -8177, -8704, -9209, -9731, -10196, -10631, -11032, -11413, -11743, -12070, -12369, +-12610, -12857, -13017, -13216, -13353, -13423, -13487, -13537, -13461, -13385, -13283, -13121, -12902, -12654, -12376, -12038, +-11673, -11269, -10876, -10460, -10027, -9550, -9079, -8571, -8021, -7414, -6821, -6173, -5483, -4787, -4070, -3308, +-2543, -1733, -951, -154, 553, 1231, 2019, 2707, 3412, 4163, 4834, 5544, 6237, 6913, 7556, 8148, +8748, 9305, 9797, 10276, 10709, 11147, 11505, 11885, 12226, 12511, 12811, 13027, 13242, 13395, 13461, 13489, +13565, 13480, 13430, 13344, 13210, 13032, 12834, 12562, 12315, 11949, 11616, 11197, 10782, 10371, 9904, 9456, +8939, 8465, 7899, 7402, 6831, 6262, 5687, 5119, 4525, 3960, 3347, 2785, 2178, 1568, 956, 343, +-257, -781, -1408, -2035, -2616, -3212, -3755, -4347, -4898, -5442, -5955, -6474, -6982, -7467, -7941, -8432, +-8911, -9382, -9829, -10304, -10702, -11104, -11481, -11823, -12082, -12332, -12538, -12710, -12844, -12894, -12995, -13033, +-13027, -12992, -12929, -12831, -12690, -12532, -12313, -12056, -11775, -11468, -11093, -10747, -10335, -9886, -9452, -8978, +-8481, -7972, -7442, -6905, -6359, -5768, -5196, -4575, -3949, -3236, -2526, -1799, -1045, -304, 428, 1110, +1883, 2623, 3342, 4086, 4810, 5512, 6239, 6950, 7624, 8306, 8960, 9568, 10154, 10681, 11218, 11663, +12069, 12455, 12781, 13101, 13330, 13549, 13688, 13790, 13849, 13827, 13830, 13705, 13615, 13505, 13332, 13157, +12920, 12641, 12325, 11979, 11596, 11191, 10780, 10357, 9887, 9418, 8922, 8417, 7897, 7378, 6795, 6227, +5626, 5017, 4394, 3705, 3092, 2413, 1753, 1070, 385, -272, -859, -1593, -2266, -2935, -3618, -4256, +-4853, -5447, -6018, -6548, -7071, -7612, -8056, -8555, -8997, -9420, -9860, -10253, -10590, -10962, -11289, -11594, +-11873, -12111, -12289, -12447, -12559, -12612, -12645, -12671, -12685, -12623, -12586, -12492, -12376, -12211, -12042, -11844, +-11597, -11362, -11042, -10776, -10406, -10076, -9701, -9289, -8851, -8425, -7917, -7412, -6889, -6281, -5679, -5047, +-4415, -3688, -3025, -2333, -1621, -948, -244, 423, 985, 1753, 2377, 3096, 3769, 4403, 5098, 5737, +6394, 7035, 7657, 8239, 8807, 9366, 9896, 10393, 10873, 11291, 11681, 12051, 12388, 12678, 12916, 13154, +13315, 13471, 13589, 13598, 13640, 13556, 13499, 13347, 13186, 13026, 12753, 12487, 12201, 11867, 11490, 11138, +10738, 10311, 9874, 9397, 8880, 8347, 7786, 7222, 6629, 6061, 5453, 4857, 4277, 3679, 3054, 2453, +1756, 1147, 461, -190, -762, -1519, -2183, -2894, -3557, -4252, -4879, -5488, -6124, -6690, -7288, -7900, +-8444, -8986, -9571, -10080, -10588, -11076, -11488, -11880, -12190, -12454, -12682, -12831, -12949, -13069, -13104, -13137, +-13155, -13155, -13118, -13073, -12972, -12850, -12711, -12553, -12323, -12054, -11780, -11424, -11060, -10634, -10199, -9701, +-9234, -8669, -8155, -7577, -7027, -6433, -5846, -5249, -4643, -4047, -3415, -2787, -2161, -1510, -859, -222, +385, 963, 1689, 2347, 3001, 3696, 4406, 5080, 5781, 6460, 7073, 7749, 8299, 8874, 9403, 9883, +10324, 10736, 11105, 11489, 11796, 12073, 12354, 12556, 12729, 12850, 12984, 13026, 13048, 13054, 13000, 12937, +12816, 12679, 12492, 12298, 12039, 11771, 11499, 11171, 10817, 10492, 10122, 9765, 9350, 8883, 8455, 7955, +7436, 6889, 6295, 5717, 5102, 4524, 3925, 3347, 2746, 2143, 1572, 968, 346, -235, -793, -1492, +-2142, -2835, -3504, -4191, -4793, -5486, -6103, -6683, -7247, -7787, -8294, -8796, -9314, -9791, -10267, -10714, +-11139, -11505, -11927, -12206, -12463, -12632, -12766, -12898, -12956, -13044, -13065, -13099, -13072, -13035, -12959, -12870, +-12706, -12513, -12271, -11982, -11657, -11297, -10882, -10483, -10038, -9586, -9136, -8637, -8151, -7586, -7010, -6392, +-5781, -5126, -4511, -3866, -3223, -2601, -1944, -1259, -563, 125, 785, 1540, 2197, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, -31, +255, -191, -15, 1310, 2754, -6478, 12856, -3380, -1024, 3617, 4914, 8843, 1365, 5096, -410, 1941, +7307, -5194, 5664, 6921, -9126, 10486, -4410, 5888, 3045, 7699, 3380, 3573, -9742, 11092, 3817, -3721, +11082, -10195, 3643, 2912, -12439, 21390, -13357, 12028, -8576, 3726, 5325, -3726, 14477, -8353, 4676, 3526, +-2537, 6407, 103, -9396, 16386, -17463, 10260, 1985, 4049, 1757, -6788, 5290, -5937, 6230, 6722, -14361, +10094, -5854, -532, 3127, -2843, 13900, -5098, 429, -6178, 1694, -7005, 10915, -14967, 19817, -28015, 16478, +-3510, -1296, 5435, -16635, 16746, -24160, 23271, -30447, 22446, -19960, 5397, -10797, 2063, 5827, -10944, 8838, +-14497, 4467, -17840, 22941, -20977, 7448, -6537, -2455, 5956, -9580, 9192, -5216, -4378, -8454, 9089, -8627, +3517, -628, -404, 477, 6274, -12752, 6545, 3847, -19566, 3987, -4123, -3067, 3680, -15908, 7182, 1025, +-259, -612, 1491, 3919, -8544, -7442, -1329, -112, 9265, -7370, 10428, -11338, -2962, 5306, -10703, 11487, +-15617, -8127, -10924, -7723, 6971, 11812, -14792, 5431, -13493, 7287, -2269, 15050, -8998, 2713, -18795, 3923, +11114, -8228, 3560, -14538, 6313, -11526, -805, -3675, 3105, 10976, -2177, -4613, -118, -9332, -3943, 9576, +-1295, -6455, -14875, 9599, 9569, 13500, 5339, -8231, -10849, -2705, -1300, -1165, -11627, -6279, 10965, -7955, +22843, 5275, 9460, -8076, -13940, 233, -1767, 7139, 1178, -786, 12720, -11915, 14937, 5985, -6133, 1946, +-19972, 5503, 8540, 5810, 12513, -14172, 8978, 172, 932, 1006, -464, -10909, -3253, -830, 12985, -462, +-9070, -10347, -2710, 11834, 4310, 15397, -5287, -6036, -2579, 1518, -4093, -14673, -10050, 2164, 14355, 4642, +-677, -1354, -1780, -10028, 3196, -14966, 541, 8834, -6467, 19438, -5646, 14417, -22490, 3317, -11385, -9493, +7476, -1518, 5239, -7858, 350, -7936, 128, -3390, 3332, -2901, -5051, -1023, 3027, 4123, 6264, -11130, +-6634, 4389, 1125, 642, -10401, 5615, -4894, 11246, -12547, -1387, -10437, 17137, 7082, 1857, -14831, -11627, +14185, 8271, 7950, -19945, 2984, -5087, 17781, -1170, 2471, -13484, 13056, 6003, 5898, -2294, -7172, -1603, +-1801, 4206, 884, 206, 11777, 1340, 14496, -10593, -7622, -7766, 14930, 11543, 157, -8154, 4087, 1815, +10561, -14725, -10073, -4162, -4106, 25903, 4649, -1786, -7509, 7708, -1513, 7276, -7739, -8814, 5150, 11485, +3051, -8588, -287, 3831, 4661, -6736, -11198, 1892, 11262, 3332, -1257, -9055, -379, 8630, 3947, -7065, +-9052, -6580, 893, 14194, 5954, 3716, -8209, -12733, -2969, -8658, 13647, -3379, 55, 6140, 6218, -3074, +-10267, -8466, -2507, 5449, 4815, -7718, -1634, 11395, 16288, 7380, -23355, -11451, -14940, 10228, 14529, -3764, +-13536, -1389, 14601, 15582, -1181, -16513, -7819, -1887, 14289, 716, -7751, -9605, 7458, 11996, 3302, -8146, +-14305, -1697, 4310, 10759, -2705, -2053, 2528, 14317, 8539, -3714, -13069, -5604, -163, 6887, -3872, -4004, +5818, 7371, 5601, -574, -8581, 1684, -1068, 2072, -4069, -2923, 3517, 4683, 7379, 5281, 2713, -1784, +-7069, -4354, 2250, 13803, -4444, -1059, -2878, 2657, 7887, 1936, -7083, -6943, 5673, 12522, -583, -791, +3025, 4671, 2944, -231, 260, -3079, 1884, 8842, -2211, -1503, -3163, 273, -7698, -1044, -1741, 522, +-3072, 2320, -4573, 3584, 13801, 13856, 2440, -23636, -609, 336, 15547, -7187, -11726, -15936, 3692, 15725, +7423, -18467, -10951, -5964, 18498, 13875, -14378, -5759, -1178, 14069, 10534, -14228, -13712, -5565, 10548, 11388, +-3153, -17163, -466, 19329, 9493, -12784, -6106, -7623, 3031, 9524, 793, -9018, -602, 11690, 8645, -3878, +826, -3595, 928, -1170, -679, -3740, 5101, 9993, -2892, -6767, 2619, -2390, -5226, 2162, 128, 3226, +-4345, 8112, 9972, 6250, -6472, -6445, -2789, -1766, 456, 2267, -7477, 12316, 3069, -1077, -3821, -6554, +-2969, 5794, -361, -1661, 2586, 19061, 10913, -4699, -14516, -8441, 1160, 5204, -9203, -14061, 16303, 8246, +7962, -6173, -3826, -7229, -9308, -5520, 6818, 9392, 2225, -716, 6053, -3311, 51, -5793, -15525, -7019, +211, 14863, -2838, -3855, 4659, 8824, -671, -15638, -12991, -3299, 22119, -866, -19026, -359, 12528, 13003, +-9528, -10834, -5011, 492, 16241, 2538, -7502, -12843, 4240, 11380, 3718, -11363, 1899, 1859, 9188, 7705, +-10362, 647, -4113, 10355, -897, 2048, -8191, 1127, 15806, 1437, -4444, -6433, 5425, 6226, -1746, -9564, +3521, 8889, -12114, 2791, 2983, 2012, 3573, 11612, 311, -7677, 2657, -7609, 317, 1523, -5251, -11833, +4267, 16215, -1096, 3387, 7738, -7175, -9269, -1072, -4049, 14795, 4599, -11029, -6254, 12701, 14747, -24941, +-8872, -2077, 16874, 11023, -3460, -21266, 5872, 20430, -6811, -17785, -2715, 3830, 2824, 11223, 663, -3066, +-2687, 6957, -1152, 11398, -8025, -9973, -1223, 8378, -8340, -13314, 10196, 7505, 7824, -1911, 14856, -10217, +-4473, -2663, -4664, -11603, -153, 12808, 10482, 12610, -8, -17268, -1455, 6733, -15079, 191, 9207, 11785, +-4111, -239, -5635, 6736, 5444, -5667, 2005, 15066, -4683, -4056, 5368, -1787, -15340, -9570, 13736, 8276, +4700, -7769, 3008, 16865, -11558, -19768, 11203, 19136, -6074, -19776, 39, 10464, -3426, -12119, 13610, 9818, +3371, -16644, 1146, 14793, -14892, -7060, -5177, 14112, 3700, -3987, 6444, -6430, -3976, 2046, -147, 2794, +-812, 2518, 4562, -3371, -9075, -6984, 7970, 9788, -5543, 2459, 425, -2962, 4253, -3904, -7031, -1088, +3379, 11577, 5799, -17505, 647, 8150, -1985, -1752, 2760, -401, -5620, -674, 8140, -6908, -3565, 10553, +11624, -4195, -8112, -674, 4111, -918, -12786, 675, 11495, -359, -10382, 10503, 7190, -17044, -4505, 16074, +9274, -9483, -8241, 8775, -6008, -9102, -5151, 11397, -5256, 9256, 1427, 395, 5620, -23045, 9856, 5682, +-16764, 797, 12998, 107, -1728, -12245, 6618, 4557, 8673, -1907, -8546, -11629, 7205, -569, -3808, -5756, +11557, 14775, 3060, -14928, -10086, -10800, -114, 21503, -5828, 5316, 5405, 492, -15765, 162, 269, 11096, +7335, -175, -8585, -8847, -4599, 5538, 4563, 2708, -634, 16891, 723, -21457, -8569, 5992, 10917, 4423, +5334, -14012, -8767, -3750, 3206, 2187, 3153, 8222, 7415, -16284, -5505, -9314, 2319, 14040, -5216, -3016, +6758, -4812, 5936, -12388, -5234, 6958, 1498, 7835, -12505, 4223, -284, -1729, -3326, -6404, -6940, 14325, +-1099, -1157, -2110, -4496, 5846, -11307, -3027, 3270, 2144, -856, 4180, -13556, 5305, 4602, -1111, 530, +-19010, 9037, 10573, 6850, -8257, -7252, -802, 7242, -4342, 4514, -8999, 1617, 15726, -8913, 9002, -9330, +7541, 2122, 1262, -14584, -1579, 2324, 11465, 6861, -11421, 6148, 4041, 2833, -5863, -8428, 1892, 434, +3259, -5305, 7355, 752, 11521, 2550, -13876, -6736, -2946, 18343, -6836, 5765, -11322, -3874, 6575, -3128, +-8872, 6663, 1699, 9023, -7423, -10025, 14520, -14491, 17121, -15311, -8128, 11426, -11, -658, -2046, -9017, +7470, 8394, 7980, -13311, -1804, 8937, -9987, -7553, -5232, 14198, 5237, -123, -2148, 4762, -632, -6627, +6734, -4608, -1092, -4143, 5784, 2823, -4853, 10789, 3069, -7352, -4950, -292, -4795, 15722, -19881, 13287, +15815, -8984, -6008, -6263, 2102, 2204, -5617, -15, 8489, 4859, 4993, -11189, -3699, -934, 3062, -11098, +9669, -7041, 13806, 6193, 11688, -18971, -4038, -1230, -5022, -2550, -8323, 8873, 15304, -8203, 6938, -9734, +8130, -4227, -17585, -107, 12357, 6618, 2262, -7834, -3437, 3197, 1170, -7711, -2623, 14158, 577, 2290, +-8615, 1970, -803, 8708, -20166, 10326, -11921, 25183, -2691, -10697, 8769, -7608, 2862, 4097, -5566, 4848, +3497, 366, -1387, 2295, 734, -4712, -3796, 11059, 2933, 5969, -9262, 13430, -6761, 9524, -12138, -5804, +9798, -1227, 182, 13997, -2497, 3172, -5616, -9991, 10243, -8118, 9776, -1312, 8231, 2267, -4989, -17037, +8790, 15304, -12445, 65, 682, 16278, 6760, -19979, -4408, -2051, 15588, -3098, -12007, 8016, 10999, -637, +-80, -11936, 9896, 4369, -9010, -4673, 2048, 13826, -8645, 4293, -1267, 11000, -1248, -13051, 2299, -133, +8916, -5260, 4801, 3763, 4930, -14957, 2149, 1220, 9204, -6870, 6835, 7567, 5289, -14031, 3278, -14143, +1951, 10467, -2755, 13758, -13343, 14204, -19446, 5263, -1904, -965, 1393, 6758, 6778, -2454, 3224, -13763, +2533, -13351, 6690, 9012, 9308, -8299, -1842, 3387, 1870, -14025, -8287, 12708, 12522, 1829, -8946, 89, +4878, -11458, -8763, 10228, 12956, -12226, 5886, 348, 7966, -12056, -15197, 4128, 13125, 8900, -15736, 8442, +6402, -12190, -6588, -4261, 10794, 9473, -4118, -3447, 7108, -9828, -2541, -4070, 9485, 4584, -6547, 5736, +-4399, 3840, -16942, 5733, 424, 9556, -2197, 4534, 3072, -8854, -6098, -8443, 8441, 5977, -2757, 5809, +-587, -8160, -4510, 3691, -2470, 5644, -879, 2910, 4891, -16486, 5688, 4636, -8872, 521, 4215, 7137, +-7921, -6819, 10079, -3549, -4329, -4189, 13517, 4422, -16777, 1126, 6268, -1705, -2178, -13518, 23830, 1684, +-16916, -4942, 20645, -9072, -9943, -4846, 16130, -3347, 3910, -10666, 12286, -5308, -11235, 4576, 2721, 3511, +-173, 3900, 2479, -7029, -9632, 7258, 117, -1947, 7734, -3316, 1956, 3702, -13214, -3421, 1477, 9782, +4113, 1141, -11495, 6847, -2710, -8283, -2628, 18047, -1290, 420, -13, -13852, -2327, -1001, 1813, 14369, +-2356, 4054, -3026, -9129, -13273, 4186, 7395, 9464, -8850, 15478, -15014, -4486, -12442, 15469, -2574, 5287, +3366, -1379, -4964, -14199, 7282, 5420, -163, 8825, -3355, -282, -14171, -6218, 11322, 1372, 5673, -3472, +7781, -16092, 6012, -15887, 17616, 143, -2652, -36, -5199, 4816, 428, -4257, 6353, -6990, 1485, 805, +7012, -936, 3105, -8251, -7317, -3604, 6472, 240, 9708, 978, -4830, 4501, -18595, 13749, -7403, 8305, +-1540, 380, -1557, 448, -12078, 8979, -3263, 8092, -774, -754, -5791, -3453, -522, 1083, 5736, -1692, +1684, -2202, -8282, 9255, -4174, 2799, -4127, 2678, 5250, -11528, 7995, -1753, -5538, 6289, -8582, 9293, +5549, -11097, 6843, -723, -14563, 13311, -9460, 12983, 2492, -14113, 10248, -9118, 3604, 6428, -3520, 9118, +-22043, 13971, -5605, -2894, 16545, -8816, 2274, -8398, 2004, 3690, 8762, -12035, 3049, -2022, -4799, 7046, +3236, 1814, -7035, -3410, 51, 5180, 1373, -2448, 6378, -7268, -10102, 12785, -4228, 3498, -1033, -374, +-4271, 9226, -11705, 8553, -3453, -5473, 233, 4491, 4443, -5355, 2226, -283, -1611, -5009, 624, 10260, +-12550, 7365, -5197, -3554, 12513, -15085, 5214, 9963, -10143, -395, 7515, -11455, 2906, -1978, 2737, 3230, +-5241, 2348, 5489, -3244, -7597, 4874, -1970, 7424, 836, -7573, 5863, -8590, 3860, 7054, -3016, -7448, +18916, -14427, 1508, -1587, 4113, -7085, 3328, 4729, 1509, 5885, -15016, 12609, -977, -5454, 14209, -20173, +17561, -13719, -5023, 13203, -3001, -4288, 9527, -11671, 5401, 3575, -7177, 1044, 8023, -3088, 12086, -9397, +-1319, -7099, 4002, 1743, -1024, 10724, -529, 2935, -16097, 11443, -7497, 5013, 3007, -13460, 16520, -10338, +8137, -8157, -1262, 4020, -5966, 783, 13750, -6026, -10915, 16929, -18157, 8814, 2577, -13067, 16239, -10987, +99, 8513, -11907, 11931, -15684, 20611, -24245, 11737, 389, 4034, -1297, -8343, 9411, -8779, 5948, -7478, +12183, -9187, 7772, -4804, -4208, -1605, 10733, -7871, 4370, -4094, 1438, 1141, 3236, -5478, 6856, 822, +-18021, 18765, -10837, 11487, -6966, 1506, 5382, -7209, 3744, 7745, -17350, 17817, -17065, 5250, 11632, -6297, +-6226, 1621, 6858, -8609, 14194, -9067, 3032, -5573, 1828, 1035, 9982, -4133, 574, 10162, -20832, 8452, +-7824, 14422, -642, -8520, 9066, 6604, -16009, 6735, 989, -5848, 2513, 6773, -4089, 8349, -7827, 4854, +530, -9007, -2951, 9363, -9581, 2329, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -115, 301, -195, -364, 860, -821, 171, 749, +-1006, 65, 1115, -1002, -355, 1385, -959, -301, 915, -168, -1066, 1212, -136, -896, 842, -153, +-108, -148, 624, -1588, 2196, -1281, -607, 1557, 892, -5755, 8069, -3269, -4559, 7398, -1973, -4036, +1399, 10024, -18304, 11625, 7150, -19261, 11618, 5750, -9933, -6641, 27168, -26281, 24, 29189, -29192, 8961, +17867, -20822, 991, 17648, -16066, -872, 14359, -12736, 1034, 7917, -7885, 3970, -2487, 3791, -3809, 408, +6089, -10606, 8888, -704, -6784, 5000, 5383, -10648, 672, 17288, -22545, 4886, 20699, -27688, 8610, 14623, +-15412, -4245, 18540, -9887, -11410, 20875, -9502, -5854, 6790, 5741, -12378, 1335, 15307, -16997, 3524, 7939, +-6830, 477, 211, 2762, 344, -7833, 7401, 5443, -16953, 10747, 8361, -17200, 3489, 17238, -19384, -1818, +24119, -22785, 165, 18688, -15059, -3415, 12669, -847, -17294, 19099, -1101, -18614, 21448, -7560, -6996, 8172, +1828, -8590, 2440, 9500, -12618, 1872, 11906, -15316, 6320, 3559, -2944, -3450, 1380, 12616, -23871, 16933, +2837, -15411, 11197, -2103, 3068, -11823, 12801, 1364, -18491, 21540, -9790, -2257, 3618, -34, 3105, -12938, +17888, -10391, -4210, 13691, -12434, 5348, 278, -1803, 1105, -2514, 7010, -9989, 5393, 5828, -15313, 13948, +-2103, -9885, 10969, -2130, -4370, -592, 9797, -9337, -3805, 16381, -15130, 1758, 8902, -7421, -1223, 3630, +4743, -13480, 9656, 4338, -14039, 8760, 4668, -10384, 1789, 9942, -10556, -795, 10580, -8110, -1942, 6308, +-695, -6152, 3871, 4602, -8269, 3928, -53, 3028, -6553, 966, 11463, -17359, 8565, 5663, -9877, 2390, +2922, 2698, -11033, 8401, 5192, -14809, 9483, 2114, -3964, -4190, 6064, 8101, -23740, 19758, 2365, -18551, +12056, 5155, -8490, -7674, 21955, -13519, -10002, 21473, -9400, -9114, 10845, 3300, -11680, 1367, 14960, -16556, +240, 15107, -12752, -2185, 9873, -2202, -8694, 7340, 4561, -11810, 5117, 7317, -11919, 5529, 1379, -613, +-3588, 1751, 5987, -10269, 4860, 3711, -5161, -1986, 7876, -3845, -5996, 9268, -1477, -8630, 8765, 2370, +-13335, 12384, -1048, -8855, 8351, -1289, -2258, -2314, 9528, -9610, -1278, 15019, -19081, 9308, 4503, -8797, +2046, 3056, 3659, -15815, 16463, -213, -16266, 13361, 4721, -14026, 1098, 18450, -18897, -2952, 21988, -14772, +-10754, 23549, -8233, -16612, 21851, -3417, -13568, 7788, 11058, -17033, 1302, 17472, -16927, -658, 12773, -6128, +-7551, 9481, 2379, -11184, 4451, 9814, -14312, 4286, 7279, -7099, -1009, 2597, 6837, -15501, 11087, 2514, +-10644, 6753, 952, -1848, -5249, 11799, -10635, 2234, 6117, -8126, 3490, 2416, -4298, 658, 4714, -6117, +1381, 4264, -3817, -3885, 11811, -11552, 1782, 9236, -11044, 1080, 10109, -8586, -6421, 18612, -12843, -6012, +15798, -3720, -15671, 16785, 4355, -23219, 16757, 6587, -18201, 5010, 13879, -12297, -9237, 24536, -15087, -8499, +20504, -11598, -2846, 4276, 6266, -11976, 2408, 13663, -19559, 10487, 1756, -5166, 1765, -1746, 8047, -12144, +5834, 5821, -10251, 2985, 5763, -3709, -6862, 10602, -161, -12573, 11134, 3319, -12800, 5504, 8677, -11951, +1097, 8755, -4853, -6465, 8337, 3415, -14500, 10372, 4633, -12261, 3404, 9502, -9719, -2494, 10585, -3974, +-7557, 7064, 6451, -16551, 10019, 5369, -11232, 3173, 4140, 1881, -13562, 13644, 249, -12097, 9180, 1569, +-4334, -4628, 12235, -6598, -6757, 12129, -4103, -6953, 8844, -2146, -3543, 2904, 59, 96, -2314, 1922, +986, -2208, 150, 1679, -300, -1423, -1909, 9173, -11938, 4934, 6410, -11532, 7421, -1343, 1156, -5920, +7455, -784, -9261, 13295, -7820, -831, 4167, -1340, -649, -3221, 9456, -10674, 4645, 3278, -6846, 6060, +-4639, 4286, -4030, 2853, -886, -1836, 5267, -7882, 7444, -3638, -929, 3243, -3615, 4385, -5491, 4110, +874, -5966, 5952, -798, -2954, 217, 5017, -4260, -3876, 10865, -8516, -855, 6932, -3763, -2908, 2964, +4655, -10410, 6643, 2947, -9003, 7708, -4096, 3889, -5327, 2927, 4263, -10445, 10258, -5883, 3337, -3618, +1928, 5238, -13435, 14839, -7803, -924, 4369, -3291, 4008, -8675, 12082, -8271, -1520, 9504, -9674, 4231, +-819, 2506, -3494, -2232, 12032, -15210, 6225, 6798, -10736, 3541, 3115, 1226, -11956, 14859, -4322, -9398, +12786, -5256, -2052, 1578, 2641, -2798, -1491, 3750, -500, -3096, 1388, 2452, -1041, -5823, 9972, -4351, +-7092, 12671, -6852, -3007, 5585, 787, -6339, 2514, 6904, -10980, 5158, 3792, -6879, 3621, -597, 1822, +-4062, 2143, 3379, -6805, 4768, -250, -1660, 1, 1227, 1305, -4988, 4400, 1156, -6033, 4868, 437, +-3649, 1992, 1055, -708, -2945, 5081, -2721, -2330, 6212, -6354, 3242, 508, -3009, 3763, -2758, 1311, +-1332, 2507, -2113, -1633, 5970, -5419, -235, 4328, -2162, -2949, 3793, 1431, -6796, 5708, 1074, -5916, +3922, 969, -2333, -682, 3126, -1299, -2461, 3470, -1078, -1245, 853, 841, -679, -2020, 4340, -2693, +-2255, 5842, -4923, 1112, 1261, -356, -1071, -388, 4705, -8179, 7179, -1950, -3192, 4512, -2793, 1678, +-2930, 4589, -3595, -61, 3481, -3897, 1177, 1986, -2597, 636, 1187, -443, -2118, 3064, 152, -5595, +7927, -4314, -1568, 3798, -985, -2479, 1789, 2329, -4892, 3326, -301, -214, -1719, 2077, 787, -3067, +1171, 2458, -2118, -2867, 6155, -2802, -3465, 4902, -200, -4045, 2377, 2304, -3429, 86, 2417, -511, +-2388, 1355, 2386, -3123, -697, 4137, -2573, -1700, 2537, 1055, -3411, 427, 4663, -5584, 1789, 1334, +-268, -1895, 515, 3743, -5541, 2518, 1496, -1880, -290, 75, 3551, -5208, 1041, 5450, -7742, 4463, +-666, 908, -2551, -71, 7356, -12401, 9312, -802, -4893, 4249, -1813, 3702, -8861, 9813, -1815, -9320, +13122, -6456, -2363, 3680, 1518, -3092, -3934, 12427, -11347, 428, 8896, -7886, 1269, 163, 5614, -8978, +2547, 8150, -11443, 4649, 3094, -2747, -3330, 4911, 2246, -10415, 9774, -756, -6677, 5581, 283, -2432, +-1489, 5821, -4712, -583, 4213, -3359, 860, -390, 1678, -1728, -691, 3610, -4652, 3289, -324, -2718, +4569, -4927, 4283, -2876, 680, 2203, -4928, 6461, -6318, 4799, -2378, -967, 5419, -9286, 9898, -5898, +-447, 4847, -5237, 4135, -4836, 6763, -5703, -472, 8223, -11013, 6699, -44, -2644, 990, -90, 3233, +-7478, 7595, -2414, -3897, 6630, -5192, 2554, -1111, 369, 1060, -2601, 2802, -1737, 766, -454, -37, +1403, -2738, 2585, -839, -1084, 1651, -646, -251, -747, 2999, -3636, 707, 4001, -5968, 2803, 2585, +-4566, 1053, 3252, -2504, -2590, 5585, -2220, -4131, 6259, -2269, -2244, 1903, 1717, -2729, -958, 4547, +-3106, -1395, 2792, 1015, -4785, 2775, 2886, -4772, 367, 4195, -2281, -3826, 5767, -692, -4392, 2060, +4872, -6160, -1570, 9146, -6698, -2846, 7361, -1487, -6235, 4769, 4790, -10177, 3907, 6986, -9795, 2149, +5291, -3082, -4776, 6827, 1065, -10075, 9786, -1140, -5935, 4851, 818, -3256, 39, 4359, -4722, 746, +3146, -3236, 663, 1007, -479, -655, 223, 1725, -2703, 1258, 1471, -3375, 3300, -1568, -744, 2606, +-2852, 943, 1653, -2107, -518, 3366, -2757, -1366, 5099, -4588, 379, 3200, -2737, -591, 2653, -1108, +-2055, 3274, -1693, -592, 1807, -1947, 1707, -1300, 525, 831, -2536, 3810, -3769, 2386, -639, -565, +1500, -2798, 4204, -4387, 2564, 331, -2608, 3535, -3268, 1733, 1110, -3410, 2633, 361, -1520, -1095, +4059, -2423, -3191, 6601, -3632, -2330, 3993, 543, -4854, 2760, 3284, -5428, 768, 4878, -4697, -618, +4516, -2936, -1131, 2036, 1403, -4737, 4071, -607, -1689, 1480, -985, 2174, -3898, 3921, -1918, -286, +1159, -1272, 1858, -2311, 1076, 1661, -3175, 1454, 1881, -3161, 1259, 930, -173, -3010, 4549, -1670, +-3434, 6140, -4413, 703, 1468, -1302, 571, -681, 1305, -1483, 874, 333, -1692, 2342, -1602, 96, +758, -664, 736, -1607, 2061, -835, -1046, 1426, 58, -1247, 317, 1600, -1917, 257, 906, 203, +-1963, 1465, 1327, -3129, 1751, 917, -1557, -58, 943, 762, -2872, 2204, 1108, -3705, 3267, -1157, +337, -1141, 924, 1708, -4703, 5045, -2287, -725, 1522, -1010, 1615, -3508, 4322, -2182, -1404, 3312, +-2736, 1854, -2487, 3406, -1993, -1684, 4599, -4595, 2769, -1168, 322, 856, -2728, 3888, -3041, 670, +1513, -2122, 1749, -1986, 2948, -2620, -475, 4593, -6052, 3638, 32, -1542, 741, -475, 2433, -4677, +4142, -570, -2910, 3357, -1299, -272, -103, 947, -370, -1278, 1954, -664, -1291, 1880, -811, -86, +-234, 787, -104, -1554, 2200, -899, -717, 676, 845, -1802, 657, 1588, -2243, 83, 2818, -3105, +33, 3598, -4486, 2395, -78, 47, -1827, 2281, 631, -4870, 6316, -3295, -1412, 3443, -1514, -1423, +1593, 1377, -3769, 2049, 3086, -7001, 5686, -56, -5016, 5670, -2715, 682, -2381, 5204, -4089, -1903, +7775, -7807, 2369, 2585, -2646, -541, 1877, 758, -3980, 3375, 991, -4745, 4484, -1416, -823, 800, +-350, 1617, -3700, 3465, 200, -3990, 3956, -539, -1936, 663, 2046, -2038, -1339, 4714, -4703, 1774, +706, -946, 649, -1784, 3575, -3768, 1991, -251, -177, 354, -1573, 3267, -3597, 1848, 400, -875, +-777, 2075, -690, -2015, 2551, -140, -2014, 736, 2998, -5010, 3095, 240, -1180, -472, 1108, 1792, +-5805, 6231, -2114, -2427, 3195, -715, -799, -1070, 4288, -5040, 1964, 2420, -4712, 3830, -1220, -859, +1297, -497, -51, -966, 2870, -3269, 823, 2874, -4698, 3255, -523, -492, -708, 1620, -10, -2950, +4110, -2070, -1157, 2385, -813, -1114, 574, 2119, -3543, 1263, 3119, -5551, 3889, -13, -2284, 1186, +1492, -2342, -125, 3687, -4625, 1886, 1582, -2116, -518, 2915, -2077, -1023, 2512, -337, -2848, 2559, +1872, -5942, 5196, -691, -2247, 717, 2497, -2787, -613, 4090, -4294, 1905, -264, 819, -1563, 415, +1633, -2027, 289, 1295, -629, -1537, 2571, -1320, -599, 1006, 179, -1019, 96, 1692, -2430, 1367, +598, -2017, 2164, -1509, 995, -867, 512, 542, -1974, 2743, -2305, 1391, -992, 1005, -268, -1696, +3642, -3960, 2675, -1271, 355, 990, -2912, 3557, -1515, -1260, 1240, 1702, -3559, 1233, 3181, -4529, +1030, 3431, -4199, 1287, 1449, -1438, 80, -58, 1522, -2405, 1605, -290, -165, -3, -242, 1095, +-1635, 972, 880, -2687, 2762, -611, -2142, 3141, -1729, -1, -299, 2095, -2453, -60, 3137, -3357, +837, 1019, -113, -1658, 1354, 767, -1671, -65, 2136, -1563, -1296, 2893, -1180, -1546, 1681, 1208, +-3902, 3314, 49, -2758, 2378, 102, -1822, 1038, 1344, -2897, 1972, 602, -2180, 895, 2162, -3817, +2150, 1184, -2753, 1121, 1487, -1693, -1073, 3750, -3190, 77, 1789, -248, -2371, 2112, 1366, -4004, +2428, 1478, -2855, 149, 2834, -1960, -1785, 3322, -92, -4264, 4415, -116, -3515, 2430, 1306, -2267, +-1378, 5460, -4898, 78, 3753, -2856, -830, 2204, 774, -4591, 4585, -810, -2211, 1204, 1911, -2619, +-356, 3626, -3595, 840, 973, 304, -2725, 2761, 273, -3390, 3410, -649, -1709, 1297, 917, -1857, +15, 2665, -2877, -99, 3344, -3541, 762, 1644, -1240, -768, 1499, -67, -1637, 1626, -292, -410, +-308, 1147, -750, -385, 674, 142, -486, -750, 2393, -2285, 213, 1505, -831, -1350, 1946, 427, +-3301, 3253, -325, -2040, 1354, 1117, -2257, 965, 762, -819, -273, 601, 179, -606, -37, 590, +13, -983, 939, -154, 171, -1495, 2512, -1501, -825, 2059, -1010, -735, 720, 1189, -2552, 1537, +748, -1624, 322, 1000, -389, -1231, 1379, 442, -1858, 950, 930, -1011, -981, 2156, -151, -3350, +4257, -1117, -2788, 3284, -306, -2146, 972, 2314, -3535, 975, 2549, -3101, 313, 2388, -2124, -233, +1624, -527, -1415, 1682, 268, -2709, 3491, -2142, 41, 1220, -1218, 562, -123, 266, -695, 868, +-468, -246, 694, -453, -561, 1757, -2083, 1031, 598, -1431, 979, -251, 484, -1459, 1740, -692, +-611, 572, 871, -1908, 993, 1144, -2442, 2006, -1113, 1098, -1440, 820, 740, -1848, 1651, -894, +435, 88, -1271, 2467, -2151, -29, 2394, -2983, 1837, -674, 685, -1160, 609, 1058, -2341, 2059, +-757, -30, -317, 808, -315, -812, 1128, -29, -1239, 915, 877, -2130, 1354, 526, -1358, 415, +826, -959, 232, 167, 140, -350, -181, 917, -1014, 563, -335, 605, -697, -41, 1151, -1523, +776, 314, -804, 600, -344, 280, -63, -651, 1570, -1909, 1346, -257, -817, 1496, -1680, 1596, +-1421, 1014, -242, -809, 1698, -1892, 1350, -523, -44, 240, -562, 1268, -1743, 1233, 56, -1148, +1305, -840, 607, -838, 940, -276, -936, 1632, -1207, 204, 252, 353, -1144, 808, 516, -1413, +896, 300, -557, -570, 1644, -1153, -509, 1441, -611, -752, 764, 675, -1883, 1438, 258, -1556, +1376, -242, -635, 544, 171, -656, 508, 103, -638, 605, -233, 127, -343, 335, 172, -676, +432, 248, -233, -811, 1837, -1555, -35, 1478, -1496, 542, -147, 1011, -2107, 1937, -425, -1084, +1531, -1160, 1030, -1531, 1844, -1071, -418, 1351, -1071, 367, -425, 1114, -1235, 28, 1832, -2691, +1682, 249, -1431, 1261, -668, 831, -1762, 2281, -1460, -332, 1790, -1918, 1047, -340, 416, -958, +1184, -674, -177, 637, -173, -920, 1395, -300, -1680, 2686, -1687, -267, 1103, -60, -1382, 1353, +98, -1174, 624, 628, -880, -148, 1245, -1425, 1037, -926, 1043, -631, -442, 1195, -776, -42, +-208, 1470, -1983, 706, 1115, -1350, -358, 1913, -1332, -663, 1612, -615, -438, -534, 2714, -3200, +943, 1744, -2093, 250, 1019, 88, -2340, 2964, -1031, -1559, 2314, -887, -747, 775, 374, -749, +-497, 1890, -1426, -752, 2298, -1493, -557, 1373, -178, -1269, 1132, 23, -331, -590, 1197, -344, +-1023, 1216, -268, -85, -1116, 2365, -1523, -1073, 2659, -1376, -1369, 2533, -823, -2026, 3137, -1487, +-1187, 2196, -656, -1730, 2605, -1225, -1047, 2148, -1251, -539, 1363, -315, -1684, 2732, -1836, -96, +1185, -602, -456, 77, 1889, -3339, 2316, 599, -2839, 2645, -863, -298, -95, 786, -116, -1779, +3111, -2450, 313, 1488, -1859, 1168, -501, 483, -818, 762, -60, -822, 1159, -526, -671, 1250, +-474, -954, 1480, -459, -805, 482, 1229, -2207, 1123, 853, -1620, 748, 198, -3, -777, 918, +-410, 249, -692, 672, 460, -1653, 1423, -5, -919, 445, 379, -143, -1006, 1535, -509, -1263, +2230, -1863, 1021, -590, 497, -69, -917, 1863, -2021, 1368, -656, 461, -527, 203, 620, -1279, +1103, -327, -113, -259, 809, -646, -99, 377, 433, -1456, 1196, 497, -2082, 1993, -497, -607, +186, 1013, -1480, 653, 615, -1267, 1070, -415, -294, 673, -340, -648, 1419, -975, -420, 1211, +-377, -1210, 1701, -536, -906, 1148, -325, -239, -232, 1166, -1562, 1198, -537, -148, 827, -1281, +1185, -672, 360, -621, 893, -437, -617, 1368, -1138, 244, 313, -129, -235, 70, 567, -1037, +819, -78, -644, 918, -635, 114, 72, 261, -642, 342, 649, -1382, 1038, -6, -600, 249, +358, -152, -858, 1477, -836, -428, 911, -289, -333, -37, 871, -903, -17, 640, -39, -981, +885, 443, -1502, 1117, 5, -263, -668, 1342, -486, -1304, 2208, -1395, -96, 709, -160, -397, +-143, 1290, -1483, 295, 924, -764, -484, 1131, -297, -972, 1073, 89, -1000, 374, 1168, -1899, +1034, 395, -906, 305, 330, -182, -399, 667, -532, 490, -631, 338, 547, -1141, 563, 739, +-1253, 233, 1076, -845, -957, 2187, -1040, -1573, 2966, -1913, 2, 481, 628, -1323, -55, 2647, +-4062, 3037, -576, -1342, 1845, -1507, 1300, -1468, 1463, -785, -385, 1367, -1650, 1178, -249, -639, +992, -681, 52, 342, -374, 424, -787, 1138, -784, -355, 1453, -1651, 973, -226, -63, 204, +-695, 1333, -1382, 547, 529, -985, 693, -297, 304, -527, 418, 149, -706, 814, -672, 653, +-704, 443, 204, -919, 1299, -1244, 1045, -951, 698, 80, -1244, 2063, -1891, 908, 61, -516, +637, -911, 1380, -1455, 598, 848, -1864, 1841, -1153, 526, -131, -389, 1221, -1937, 1795, -657, +-684, 1244, -846, 240, -222, 712, -820, -115, 1621, -2350, 1488, 200, -1207, 942, -314, 457, +-1376, 1944, -1217, -438, 1768, -1883, 1016, -139, -151, 75, -217, 820, -1378, 1158, -85, -1123, +1626, -1312, 784, -587, 527, -52, -977, 1903, -1953, 1171, -393, 107, 188, -1186, 2435, -2437, +585, 1608, -2047, 570, 738, -160, -1434, 1699, 148, -2325, 2527, -635, -1251, 1382, -258, -303, +-583, 1872, -1803, 19, 1984, -2450, 1194, 209, -307, -537, 710, 506, -1908, 1719, 83, -1639, +1406, -1, -704, -50, 956, -532, -895, 1733, -1112, -142, 721, -466, 140, -96, -43, 523, +-796, 258, 658, -938, 347, 191, 162, -959, 918, 239, -1355, 1224, -99, -662, 280, 557, +-732, 81, 517, -372, -175, 371, -102, -216, 281, -214, 222, -218, 108, -84, 280, -418, +115, 444, -602, 150, 249, -1, -506, 325, 633, -1248, 537, 892, -1440, 505, 710, -638, +-591, 1197, -125, -1581, 1984, -639, -940, 1262, -533, -12, -151, 415, -181, -234, 335, -249, +343, -434, -52, 974, -1222, 173, 1242, -1511, 407, 657, -479, -415, 555, 443, -1460, 1306, +-108, -1019, 1275, -820, 268, -3, -29, 40, -156, 373, -517, 337, 108, -418, 244, 266, +-622, 509, -168, -20, -11, 75, 37, -337, 625, -701, 451, 12, -372, 331, 16, -254, +70, 297, -314, -135, 456, -116, -597, 810, -198, -518, 399, 436, -902, 292, 754, -1048, +272, 658, -716, -83, 738, -509, -260, 680, -271, -618, 1119, -719, -217, 836, -634, 28, +97, 498, -1098, 791, 399, -1395, 1229, -181, -593, 369, 428, -794, 347, 360, -626, 282, +189, -258, -141, 608, -777, 628, -414, 170, 296, -961, 1348, -1032, 228, 280, -173, -7, +-397, 1172, -1339, 416, 823, -1166, 401, 464, -505, -83, 338, 140, -662, 443, 362, -929, +801, -415, 296, -319, 58, 500, -885, 767, -472, 434, -552, 336, 318, -900, 865, -404, +98, -138, 172, 67, -347, 286, -14, -34, -202, 323, -1, -509, 575, -39, -606, 762, +-346, -212, 460, -328, 90, -67, 295, -488, 314, 152, -548, 585, -404, 363, -519, 466, +28, -717, 1030, -738, 252, -177, 499, -509, -289, 1364, -1565, 584, 525, -644, -65, 369, +404, -1369, 1159, 273, -1531, 1351, -151, -619, 287, 382, -344, -470, 1161, -984, 124, 648, +-853, 507, 3, -307, 258, 3, -169, -13, 396, -516, 96, 616, -1038, 831, -252, -220, +390, -424, 500, -548, 382, -99, -22, -57, -1, 469, -967, 774, 175, -1036, 932, -66, +-525, 214, 425, -414, -393, 1142, -1016, 139, 638, -746, 345, 1, 28, -312, 425, -133, +-397, 672, -372, -197, 393, 16, -585, 642, -125, -354, 335, -48, 55, -515, 952, -833, +168, 490, -748, 667, -565, 525, -336, -76, 445, -507, 352, -331, 481, -432, -69, 729, +-906, 361, 343, -501, 76, 288, -157, -218, 272, 92, -425, 343, -3, -224, 255, -308, +460, -508, 252, 142, -393, 445, -518, 691, -757, 486, 12, -425, 560, -532, 542, -607, +518, -190, -185, 350, -301, 222, -215, 179, -46, -120, 175, -86, -70, 243, -380, 425, +-341, 149, 58, -263, 475, -704, 860, -812, 506, -70, -324, 590, -717, 726, -630, 452, +-268, 107, 23, -157, 270, -330, 299, -212, 135, -135, 194, -177, -6, 226, -196, -139, +440, -304, -175, 478, -283, -112, 115, 420, -896, 642, 186, -793, 617, -17, -249, -58, +422, -267, -304, 613, -254, -427, 753, -514, 147, -144, 342, -165, -525, 1138, -1074, 453, +-1, 50, -177, -92, 616, -796, 405, 35, -8, -343, 408, 15, -457, 342, 176, -380, +-62, 668, -712, 162, 277, -159, -199, 214, 162, -414, 204, 97, 37, -552, 816, -397, +-398, 810, -519, 10, 20, 500, -885, 480, 437, -986, 652, 78, -333, -85, 472, -251, +-267, 335, 153, -453, 32, 590, -554, -178, 684, -234, -652, 800, 99, -1064, 927, 186, +-1024, 693, 296, -743, 158, 672, -686, -160, 883, -651, -268, 810, -380, -493, 831, -317, +-401, 542, -103, -275, 84, 503, -883, 666, -83, -377, 491, -415, 401, -491, 500, -297, +-63, 353, -395, 235, -71, 71, -237, 361, -272, 8, 207, -217, 113, -143, 350, -509, +393, -86, -98, 24, 90, 11, -405, 763, -677, 118, 488, -626, 132, 527, -673, 93, +670, -781, 5, 871, -855, -130, 1085, -941, -115, 828, -380, -622, 805, 228, -1307, 1056, +322, -1273, 706, 616, -983, -151, 1470, -1360, -132, 1339, -991, -275, 818, -37, -993, 923, +135, -874, 460, 457, -644, -172, 911, -583, -488, 1064, -474, -592, 903, -202, -591, 497, +382, -974, 554, 378, -859, 526, 17, -39, -426, 672, -249, -553, 1013, -756, 145, 158, +58, -419, 344, 243, -784, 676, 8, -596, 438, 252, -701, 473, 16, -74, -402, 722, +-306, -564, 1065, -768, 142, 35, 317, -574, 196, 581, -981, 606, 57, -315, 41, 252, +-83, -362, 488, -90, -428, 537, -191, -138, 93, 115, -61, -364, 777, -716, 207, 264, +-356, 150, -19, 178, -474, 572, -343, -76, 382, -337, 13, 235, -126, -215, 335, -15, +-422, 431, 56, -519, 462, -57, -99, -207, 529, -361, -197, 572, -466, 179, -134, 317, +-346, 23, 370, -447, 214, -8, 40, -175, 157, 41, -224, 170, 77, -280, 195, 115, +-364, 280, 24, -190, 0, 342, -387, -4, 460, -532, 189, 153, -190, 11, 49, 114, +-333, 360, -180, -42, 171, -232, 269, -321, 358, -327, 188, 28, -270, 387, -341, 254, +-267, 337, -272, -49, 437, -567, 347, -17, -105, 3, 72, 11, -167, 218, -149, 59, +-2, -83, 195, -212, 85, 58, -103, 53, -13, 21, -76, 150, -205, 148, 29, -234, +286, -181, 105, -178, 266, -165, -133, 374, -337, 149, -113, 278, -358, 123, 249, -380, +167, 76, -34, -252, 387, -168, -173, 245, 24, -298, 200, 203, -500, 387, -5, -279, +244, -28, -86, -38, 249, -245, -86, 497, -610, 305, 114, -271, 124, -13, 203, -554, +640, -270, -251, 493, -363, 142, -144, 337, -415, 188, 200, -447, 369, -150, 80, -225, +338, -165, -255, 554, -468, 175, -52, 158, -206, -42, 434, -621, 481, -215, 42, 2, +-53, 147, -231, 272, -295, 243, -74, -140, 170, 58, -289, 189, 168, -380, 186, 145, +-170, -152, 369, -138, -289, 362, 5, -361, 255, 162, -380, 139, 236, -306, 31, 227, +-195, -29, 107, 96, -385, 441, -194, -168, 407, -435, 352, -332, 417, -452, 240, 165, +-542, 656, -537, 372, -254, 141, -2, -159, 289, -341, 277, -108, -56, 58, 127, -324, +250, 50, -276, 203, -4, -13, -228, 462, -420, 136, 139, -242, 172, -76, 46, -77, +123, -135, 98, -63, 61, -87, 83, -17, -43, 35, -22, 75, -181, 207, -104, -1, +-46, 200, -242, 51, 236, -387, 303, -138, 63, -98, 97, 53, -305, 443, -356, 124, +50, -103, 154, -307, 452, -395, 94, 194, -242, 111, -84, 281, -474, 326, 115, -466, +404, -78, -102, -43, 244, -156, -188, 387, -214, -105, 158, 99, -312, 184, 130, -257, +77, 118, -57, -223, 399, -287, 51, 41, -1, 0, -161, 364, -431, 315, -160, 90, +-103, 48, 162, -433, 562, -478, 305, -227, 223, -115, -159, 445, -517, 362, -239, 270, +-307, 147, 138, -270, 107, 122, -136, -69, 254, -239, 102, -58, 175, -346, 387, -221, +-72, 314, -335, 168, -39, 116, -313, 338, -116, -118, 117, 52, -99, -151, 469, -507, +208, 103, -158, 2, 53, 103, -317, 335, -125, -133, 257, -132, -233, 584, -534, 10, +534, -510, -44, 374, 69, -894, 1138, -501, -316, 554, -288, 138, -389, 745, -850, 740, +-553, 140, 546, -1093, 998, -417, 77, -415, 841, -533, -441, 1194, -1024, 205, 327, -168, +-178, 55, 510, -940, 756, -80, -608, 904, -661, 148, 74, 209, -574, 318, 590, -1272, +956, -4, -557, 240, 319, -169, -686, 1205, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 191, -411, 931, -566, -1754, 3869, +-2067, -2585, 8033, -9717, 25280, -12334, -29197, 29184, -18456, -7014, 29184, 2828, -27639, -9754, 29184, -15722, +3792, 19092, -11856, 6164, -21346, 1171, 11028, -29197, -27071, 6524, 977, -29197, -7335, -9873, 26593, -20529, +-13462, 29184, 3723, 2314, 28955, -14414, -9416, 29184, -3892, 29184, 15433, -3286, 29184, 3118, 14129, 7733, +-10124, 29184, -29197, -18838, 4783, -29197, -7027, -17895, -16487, -4660, -23199, -29197, 12417, -11731, -29197, 13939, +-29197, -16819, 18929, -29197, 29184, 18646, -29197, 29184, 6925, 4270, 29184, -6168, 29144, 24377, -4184, 29184, +12253, 6087, 21884, -6916, 7288, 13152, -29197, -21682, 7826, -29197, -17303, -7143, -29197, -2504, -25505, -20880, +1911, -29197, -9004, 12462, -29197, -24171, 26212, -452, 20381, 6357, -7971, 29184, 6349, 3515, 29184, 914, +19091, 24146, 4242, 29184, -1820, 15276, 27021, -29197, -4098, 4457, -29197, -7619, -17404, -26101, -3701, -29197, +-12156, -13424, -20585, -10725, -7391, -16801, -6119, -11674, -10008, 23366, -5397, -8919, 29184, 17589, 6844, 25908, +12505, 14647, 21979, 9958, 24283, 8556, -7449, 24102, 1928, 4061, 593, -16858, 14044, -19338, -26191, -4597, +-18656, -22738, -13966, -19429, -14094, -19776, -506, -6803, -17405, -7199, -3545, 4426, 3379, 11830, 5529, 12460, +29184, 4272, 23138, 19941, 7955, 26256, 9964, 118, 13013, 7412, 11161, -3276, -8987, 5671, -2821, 1331, +-11520, -12973, -18253, -10480, -10644, -26432, -11508, -17961, -20913, 1708, -15985, -13814, 11234, -6925, 10672, -1236, +-1472, 28283, 12586, 13466, 16827, 4933, 22188, 20339, 1377, 14953, 58, 4452, 12657, -5523, 1867, 4139, +-8846, 6562, -7783, -11988, 4213, -9801, -11703, -16314, -16570, -14094, -11901, -11413, -16560, -8079, -2836, 4100, +995, -3780, 16786, -993, 10964, 22279, -4123, 19813, 15508, 1119, 12531, 661, 12564, 11657, -4750, 7478, +-6372, -1890, 11600, -6606, -1683, -4107, -4345, 451, -5657, -6560, -13625, -3839, -12224, -17775, -5121, -10826, +-2361, 118, -3839, -1559, -639, 10836, 11345, 3360, 7670, 1015, 8542, 14054, 2920, 1692, 6127, 6878, +3001, 4829, 114, 3627, 654, -2839, 381, -6050, -68, 8482, -7712, -6552, -3927, -5009, 2442, -8885, +-6775, -9194, -5990, -5192, 0, -1295, -6895, 5534, 3445, 952, 850, 1061, 14755, -216, -3368, 5809, +2404, 11203, 3865, -2540, 7175, 2312, 2864, 5883, -3852, -1357, 562, 7, 1249, -6351, -1563, 5292, +-8, -5724, -5445, -480, 252, -4197, -10022, -6261, -97, -4008, -1148, 968, -8778, -2626, 6290, 731, +2934, -2208, 3341, 8681, -734, 4019, 3911, 7669, 11190, -3178, 3277, 6971, -2197, 4226, 1160, -5379, +-1584, 2773, 6442, 1809, -2763, -3242, -1175, 1776, -6394, -6367, -4816, -5374, -3651, -14610, -1834, -5696, +-9376, 6649, -4319, -5555, 6492, 4340, 5667, 2992, -3673, 10234, 12107, 6777, 6286, 4394, 5473, 5424, +-2688, 3966, 4541, -3534, 7722, -949, -4662, 4018, 2238, -186, -3179, -9727, -5476, -726, -7138, -11411, +-10507, -9909, -4026, -7600, -6593, 2049, -3793, 4554, 5956, -7274, 8660, 9916, 6890, 9228, 300, 9704, +14127, 5413, 5190, 2234, 1995, 5473, 3326, 924, -1739, -1066, -496, 2321, -3671, -7151, -282, -5538, +-7152, -9250, -12751, -5335, -3985, -10184, -6958, -9314, -890, 3120, -1000, 5341, -1491, 4378, 12296, 5759, +4825, 7760, 8224, 11617, 5803, 5535, 7934, 6579, 4850, -2293, -765, 1112, 110, -1596, -2775, -7164, +-5324, -1660, -4448, -8573, -7671, -8582, -4059, -3873, -10243, -6362, -2155, -3869, -1152, -3287, 3362, 7611, +4375, 4599, 3008, 4626, 11913, 11395, 6431, 6219, 4476, 9467, 8540, -78, 1687, 478, -1095, -622, +-5185, -5356, -2664, -3197, -5759, -8244, -6918, -3520, 590, -6157, -8649, -6134, -4379, 785, -2945, -4934, +-694, 985, 4908, 2696, 778, 5980, 6903, 7891, 6454, 3936, 9929, 9849, 5276, 3865, -26, 4873, +4049, 69, -2882, -7946, -3789, -2198, -4490, -4861, -6958, -4899, -233, -4696, -5775, -2242, -2495, -2702, +-2473, -5225, -1541, 1349, 767, 649, -279, 689, 5745, 8647, 4083, 3302, 4548, 8157, 8098, 2362, +4474, 4916, 2408, 2325, -2449, -2327, 1020, -5221, -3067, -5702, -6688, -1350, -1951, -2051, -5333, -6188, +839, 1171, -2350, -4419, -2856, 466, 88, -2217, -899, 2067, 1940, 2755, 1664, 1304, 4506, 7771, +5712, 2257, 1159, 4993, 7820, 4107, -1339, -996, 575, 2066, -2100, -4439, -2703, -4374, -1895, -3541, +-4882, -1901, -1528, 75, -2132, -5268, -1788, 1133, 391, -2170, -3803, -605, 2995, 1947, 95, 271, +392, 4135, 4045, 2744, 3586, 2648, 5758, 2773, 252, 4020, 3184, 3337, 736, -3257, -1218, -600, +-292, -3055, -5100, -4009, -2367, 647, -2500, -4006, -1277, -1804, 180, -2031, -3113, 1559, 149, -408, +-388, -2530, 2217, 3568, 1491, 447, -1163, 3374, 6674, 2577, 1068, 2512, 3403, 5309, 2648, 30, +2736, -178, -26, -446, -4616, -2457, -1144, -2122, -3573, -5897, -2876, 1260, -42, -2008, -4892, -1302, +2271, -149, -1464, -1267, 425, 715, 1066, -2, -79, 1586, 3068, 2591, 636, 2092, 5037, 5569, +3331, -53, 2098, 4951, 2688, 868, -1754, -1749, -1589, -1945, -3292, -4356, -3465, -2843, -1050, -2946, +-3471, -772, -227, -445, -2461, -2593, 1858, 2115, -646, -794, -885, 876, 2956, 2078, 1345, 1387, +2700, 5115, 2989, 1482, 4186, 3862, 3577, 1877, -790, 1794, 1720, -2174, -2191, -4806, -3617, -1343, +-2708, -3239, -5195, -3397, -35, -727, -2645, -2357, -165, 1314, 288, -1927, 243, 2442, 1388, 1241, +303, 887, 4169, 3789, 2155, 1638, 1131, 4513, 6034, 1509, 433, 2131, 1216, 1676, -1450, -2515, +-812, -3067, -2791, -4386, -4805, -2420, -2573, -2078, -3480, -3237, -108, 1025, -298, -1425, -193, 1753, +2906, 708, 1305, 2430, 1343, 2689, 2407, 1087, 2847, 2571, 2864, 2453, -186, 2275, 3814, 1405, +-450, -1322, -309, 252, -2037, -4188, -3256, -3697, -3145, -1811, -3970, -3310, -1445, -1458, -83, -1240, +-464, 2571, 2470, 620, 343, 1555, 3591, 3423, 589, 1239, 1612, 2481, 2758, 842, 429, 1565, +1467, 2519, 900, -630, 1049, 541, -956, -2526, -2734, -1048, -1400, -3662, -4007, -3808, -1642, -997, +-2038, -1755, -1126, 928, 1959, 1322, 497, 1265, 2428, 2765, 1526, 823, 2431, 2681, 1302, -223, +60, 1298, 2189, 1359, -398, 400, 809, 816, 1733, -1377, -1848, -237, -948, -1689, -2641, -2572, +-1935, -2246, -2535, -2170, -1765, 635, 486, -471, 177, 722, 2752, 2425, 1012, 1220, 1295, 2602, +2188, 583, 388, 592, 919, 1091, -194, -140, 1275, 1268, 157, -690, -389, 1320, 269, -972, +-2032, -2399, -336, -1207, -1878, -2507, -2865, -648, -342, -832, -616, -541, 1838, 1756, 103, 827, +1986, 2416, 1920, 255, 499, 1985, 1727, 1116, -361, -893, 543, 1507, 551, -230, -416, 214, +1358, -307, -1021, -350, -581, -280, -1806, -2478, -784, -1014, -1544, -1325, -2413, -1013, 1023, 420, +313, -80, 340, 2377, 1720, 803, 1336, 1407, 1920, 1165, 184, 882, 827, 382, 220, -906, +-107, 974, 862, 133, -993, -480, 719, 631, -743, -1234, -1147, -722, -785, -1848, -1789, -1214, +-957, -471, -871, -1023, 811, 1440, 927, 120, 326, 2120, 2707, 1259, 654, 567, 1159, 1449, +391, -134, -359, 275, 451, 94, -635, -114, 993, 179, -271, -1092, -93, 937, -887, -1213, +-1857, -1840, 76, -1088, -1584, -1299, -1028, 352, 703, -147, 97, 1434, 1582, 1502, 746, 869, +2504, 1389, 278, 427, -43, 884, 1002, -636, -624, -396, 13, 1111, -129, -941, 163, 69, +272, -665, -1563, -28, -361, -1827, -1240, -1532, -660, 86, -1046, -688, -369, 373, 1893, 930, +336, 968, 1526, 2331, 1041, 318, 1211, 1101, 637, -234, -62, 32, 101, 200, -1028, -615, +-28, 429, 596, -923, -1221, -172, 253, -299, -1361, -1269, -691, -415, -859, -774, -860, -162, +680, -39, 188, 722, 1348, 2105, 862, 294, 1419, 1654, 1643, 558, -251, 216, 313, 110, +-266, -915, -766, 74, -92, -722, -574, -269, 282, -167, -1325, -761, 28, -38, -602, -1483, +-819, -83, 160, -227, -465, -12, 537, 1437, 876, 462, 1289, 1450, 1758, 622, 272, 1455, +985, 323, -536, -836, -83, -85, -434, -924, -1349, -333, 262, -130, -740, -841, 31, 230, +-536, -901, -289, 53, -291, -463, -764, -136, 636, 500, 383, -11, 606, 1689, 1518, 860, +417, 914, 1548, 853, 143, -25, -8, -94, -461, -1047, -982, -315, -609, -343, -973, -838, +304, 272, 10, -747, -672, 486, 368, -436, -516, -244, -48, 303, -16, -223, 460, 784, +930, 609, 364, 1122, 1493, 950, 235, 55, 566, 821, -145, -679, -868, -707, -170, -676, +-1076, -825, -268, 141, -350, -640, 69, 322, 393, -304, -507, 149, 546, 270, -501, -313, +-101, 644, 750, -47, 114, 654, 1128, 922, 287, 471, 728, 822, 340, -499, -169, 121, +-151, -814, -1184, -873, -264, -139, -480, -700, -582, 397, 417, -2, -208, -134, 647, 362, +-250, -74, 175, 422, 79, -199, 23, 365, 772, 521, 102, 124, 728, 1076, 511, 94, +-125, 248, 445, -352, -715, -427, -516, -521, -713, -928, -337, -49, -3, -212, -343, 67, +825, 490, -195, -121, 226, 713, 282, -272, -141, 81, 372, 193, -55, 90, 542, 748, +228, -4, 369, 580, 734, -79, -514, -181, 76, 13, -721, -1055, -708, -106, -152, -523, +-438, -61, 296, 360, -26, -5, 471, 766, 171, -178, -97, 315, 541, -42, -441, -156, +235, 571, 261, -177, 225, 428, 647, 378, -126, 191, 417, 42, -401, -609, -286, -85, +-490, -717, -725, -202, 104, 131, -255, -143, 287, 534, 533, -53, 34, 398, 305, 2, +-144, -7, 157, 136, -69, -280, 98, 443, 484, 186, -156, 222, 612, 434, -74, -262, +-125, 39, -108, -550, -588, -359, -207, -206, -488, -255, 165, 388, 209, -203, 99, 533, +551, 176, -225, -25, 258, 278, -65, -257, -163, 144, 236, -41, -14, 106, 451, 398, +-102, -48, 282, 309, 78, -431, -427, -130, -95, -173, -575, -505, -134, 75, 29, -113, +-41, 345, 429, 92, 53, 224, 364, 308, -99, -195, 96, 118, 102, -110, -316, 10, +291, 191, 93, -104, 123, 390, 97, -80, -87, 4, 6, -249, -441, -315, -122, -156, +-181, -345, -224, 291, 226, 166, 44, 3, 478, 414, 42, 53, 86, 191, 93, -156, +-148, 3, 14, 41, -139, -212, 197, 285, 94, -22, -150, 118, 303, -62, -252, -246, +-108, -34, -275, -340, -203, -23, 41, -48, -49, 118, 318, 325, 115, -23, 193, 399, +188, -67, -160, -12, 126, -55, -178, -145, -57, 108, 62, -151, 24, 143, 153, 37, +-149, -17, 103, 23, -141, -307, -252, 20, -5, -207, -194, -40, 179, 173, -8, 111, +193, 226, 234, -5, 24, 160, 69, -11, -162, -184, -1, 70, -65, -179, -104, 55, +202, 5, -78, 47, 63, 136, -51, -145, -16, -43, -43, -161, -241, -74, 41, 28, +-104, -52, 76, 255, 206, -11, 43, 112, 223, 93, -116, -8, 6, -23, -40, -161, +-130, 31, 39, -39, -86, -17, 148, 162, -41, -76, 5, 77, 68, -133, -173, -53, +-42, -50, -105, -133, 11, 93, 43, -8, 23, 144, 198, 80, -29, 20, 85, 114, +-26, -151, -72, -17, -2, -44, -139, -39, 70, 19, 2, -20, 13, 129, 26, -58, +-58, -23, 31, -34, -154, -139, -29, 5, 2, -56, -47, 84, 122, 83, 19, 41, +117, 87, 13, -40, -8, 15, 1, -72, -135, -58, 6, 11, -49, -88, 3, 69, +65, -22, -52, 30, 32, -5, -69, -78, -25, -12, -44, -92, -53, 16, 63, 31, +-34, 22, 106, 111, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 4107, -2004, 2, 1627, -1925, 6599, -7767, 456, 5082, -9459, +4113, 3196, -1028, -633, 104, -2986, 4017, -8430, 7224, 1049, -5398, 7608, -8360, 6006, -7541, 4230, +-792, 2240, -1077, -3493, 8571, -13271, 8462, -2611, 1360, 151, -2131, 2948, -4671, 1030, 971, 650, +-694, 789, -1751, -60, -1519, 104, 1665, 1112, -2221, 2793, -2923, -2075, 1205, 627, -782, 1266, +898, -1341, -1065, -197, -982, 376, 917, -640, 1964, -2839, 1147, -747, -520, -604, 1151, 123, +-468, -817, 225, 167, -1751, 2757, -1554, 815, -2764, 1903, -1484, 27, 154, 1882, -89, -2398, +1786, -2446, -760, 1320, 640, 907, -3055, 5901, -5963, -1145, 3392, -4249, 4709, -3811, 4176, 59, +-4690, 3763, -5874, 7700, -9567, 6668, 8780, -19780, 15415, -7119, -2284, 3760, -4112, 11470, -9627, 1220, +4523, -7742, -1504, 7094, 15, -5998, 9072, -4157, -2196, -2150, 865, 2177, -1055, 2233, 1567, -1101, +-3992, -1258, 4339, -7320, 5310, 9256, -14633, 15502, -18285, 15149, -19329, 17444, -5620, 1339, 898, -1131, +2710, -8805, 5097, 2421, -5982, 4817, 291, 3700, -16542, 19482, -10243, 681, 1138, -3109, 11251, -17031, +11364, -1712, -1290, 1855, -1912, 1596, -3135, 3025, -4925, 7602, -5371, 3190, -1293, 1001, -2589, 90, +1957, -4450, 5989, -5085, 8326, -8590, 2663, 2133, -2478, -3236, 6891, -5868, 4723, -2906, 3685, -7270, +9294, -5227, -2512, 5970, -5430, 3900, -4903, 6549, -1490, -6079, 10844, -7700, -2332, 4209, 710, -4293, +2390, 4844, -5862, 2471, -1954, 1627, -2093, -1230, 5059, -5463, 6081, -3182, 1383, -2950, 2177, -99, +-4306, 4888, -1014, 390, -957, 1859, -1220, -1957, 1205, -283, 462, -893, 1719, 955, -3621, 3516, +-2490, 1074, -2255, 2493, -773, -133, 228, 1109, -522, -2890, 3545, -2471, -277, 944, 1999, 331, +-3998, 5602, -5697, 704, -690, 2789, -1586, 3923, -3589, 773, 2066, -4947, 215, 4999, -7652, 12945, +-15916, 12367, -5056, -871, 3278, -2309, 5203, -9049, 10733, -16453, 18059, -18617, 19254, -6322, -4306, 6555, +-7281, 8916, -19009, 19878, -6605, -2500, 7662, -8065, 9231, -15379, 12796, -4741, -723, 4228, 180, 437, +-9627, 13377, -11807, 1916, 5878, -4554, 9492, -16643, 19367, -14221, 2288, -1642, 5005, -5878, 5964, -4001, +9154, -10268, 2987, 3522, -9475, 5653, -750, 1966, -541, 4485, -5439, 2920, -3694, -1074, 2352, -2196, +4021, 947, -846, 1801, -2042, -4652, 2256, -1836, 1617, 3440, 268, -1150, 2732, -7094, 5116, -4218, +758, 640, 5037, -5103, 3723, -1193, 190, -2580, 376, 1844, -2744, 1542, 2129, 167, -1440, 2522, +-4620, 2406, -2014, 888, 1533, -1369, 4310, -3458, 802, 17, -1481, -1417, 2814, 817, -2849, 4544, +-2179, 418, -1719, 380, 1554, -3244, 3815, 62, -1377, -715, 2996, -2846, -80, 976, 157, 370, +-1912, 2910, -1084, -1281, 1684, 679, -2049, 474, 326, 420, -880, 917, 739, 1044, -3998, 4554, +-3100, -801, 2348, -2288, 2586, -1030, 888, 1074, -2265, -544, 1995, -1939, -1423, 5983, -3484, -544, +3338, -4547, 2517, -3272, 2519, 1377, 608, -2916, 4403, -4220, -1912, 2551, -2198, 5925, -1082, -1484, +8373, -20148, 19540, -20900, 16440, -5182, -239, 10665, -6497, -5745, 6511, -8992, 3328, 3326, 2720, -665, +-1811, -172, -149, -343, -9402, 22723, -18525, 5360, 1999, 6741, -20044, 13808, 1717, -6601, 1063, 898, +9958, -16399, 11392, 205, -8498, 3345, 1669, 1228, -3506, 34, 8557, -6142, -3185, 1932, 3608, -7148, +2522, 5471, 579, -7065, 5891, 154, -3862, -6297, 11116, -5112, 1025, -235, 7192, -6758, -4462, 9945, +-6506, -2769, 4164, 5389, -5703, -617, 6138, -5376, -1293, 154, 4834, -3103, -3833, 9012, -4344, -2453, +2739, 157, 151, -4155, 5630, -3395, 3021, -3767, 6017, -3452, -1792, 2783, -3154, 1907, -1277, 1093, +1684, -677, -1620, 2847, -156, -6392, 6060, 81, -3966, 4017, 602, -1204, -830, 836, 34, -2856, +1458, 1928, -941, -365, 2233, -861, -1642, 531, 90, 1312, -2589, 2732, 1443, -3925, 2820, -871, +-669, -331, 1025, 697, -2250, 2133, -343, 1015, -2037, 1713, 564, -3182, 2500, -1358, 1891, -1046, +2214, -2503, 3255, -2827, -2487, 4034, -3382, 2333, -2115, 7704, -6355, 2087, -371, -1535, -1141, -1865, +9589, -10729, 10011, -2211, -3424, 4053, -9992, 9929, -7643, 8222, -4068, 5678, -4960, -1204, 7941, -22960, +22034, -5221, -302, 6967, -6758, 78, -2446, -2503, 3298, 1199, 10103, -14843, 15022, -11748, -1799, 6008, +-15412, 30476, -30225, 26933, -18529, 6691, 4809, -22148, 27407, -23265, 24793, -22056, 16678, -10195, 3109, 220, +-3151, 7592, -12156, 18913, -20078, 15386, -12034, 8983, -4475, -2453, 12012, -17554, 16831, -12135, 10319, -12776, +8976, 3579, -14421, 16618, -10073, 4771, -6605, 10196, -12303, 9837, -5427, 3681, -343, -4773, 10316, -11989, +5941, -147, -168, 1801, -3554, 2212, 593, -880, -5246, 8370, -4542, 2202, -2401, 4913, -4554, -1385, +2998, -1592, 1446, -2519, 6676, -6932, 4568, -3754, 385, 1679, -3253, 6459, -5812, 3133, -1811, 566, +-105, -1433, 3031, -1496, 328, -614, 574, -20, -2189, 3789, -3215, 2517, -2351, 706, 336, 259, +-1101, 1103, -178, -684, 574, -1325, 2361, -1820, 516, 624, -93, -534, 234, -890, 1036, -757, +1809, -869, -2866, 7272, -8665, 4608, 744, -3106, 4865, -4998, 6672, -8360, 4199, -2100, 643, 1180, +-1910, 6647, -7767, 890, 4214, -7477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 310, -573, 872, -2479, -25275, -2210, -6638, -3486, 15626, +25939, 19965, -5558, 29194, -5511, -21078, 9761, -16676, -7879, -7264, -18322, 3636, -292, -21887, 10148, -721, +-7618, 4963, -4661, 2755, 7240, 19831, 5694, 121, 15872, -9194, -18779, 24810, -7851, -19379, 22509, 2846, +-23987, -3994, -27550, -11968, 12461, -21047, 6373, 29194, 3502, 5054, 103, 7252, 16878, 2939, 9078, 7949, +-1925, 14082, -24379, -14541, 13817, -29187, -18953, 8333, -7879, 1404, -94, -8440, 29194, -7381, -20799, 18080, +2482, 14562, 6197, -2258, 8677, -6712, -1032, 8346, -17603, -11837, 8943, -12176, 196, -14517, -9094, 11161, +-17721, -1871, 15539, -10116, 29194, 25151, -18718, 26562, 14439, -18160, 2277, -6812, -7991, 8484, -15930, 2148, +11921, -29187, -7962, 7772, -14961, -4263, 5679, 9644, 5038, 3341, 3484, -4981, 5034, 4725, 5634, 11442, +-850, -575, 7804, -9383, -11982, -1615, -11818, -9749, -3671, -14392, 3456, 11433, -780, 2416, 3302, 9909, +6447, 4144, 12443, 9541, 3385, 1389, -4831, -10001, -752, -11318, -6961, 4348, -1637, -4371, 1252, -6649, +-2864, -7536, -3734, 269, 12850, 5788, -1528, 12975, 12605, -2274, -3933, -459, 4419, 5440, -4151, -10924, +1705, -7827, -13893, -6932, -8658, -8342, 9775, 7569, 5461, 11665, 4466, 5178, 3814, -868, -576, 2307, +5643, 5891, -5457, -1818, 749, -4312, -5152, -8109, -2342, -6784, -7240, 11261, 2297, -7595, 3878, 1394, +-1755, 16, 599, 12698, 13090, 1835, 4007, -1773, -6834, 367, -4274, -15155, -2986, -869, -3958, -4815, +-3433, -1171, 2871, 2992, 3054, 4889, 7688, 5954, 1089, 5291, 1927, -1761, 2009, 1368, -185, 854, +-4532, -1202, -2087, -6592, -5557, -5861, -1747, -261, -949, 2690, 2220, 3372, 5425, 2196, 4494, 6528, +5441, 2586, -703, -2298, -3615, -4535, -8375, -10114, -1342, -1259, -4533, 434, 3444, 4538, 1249, -3843, +1350, 4468, 2948, 3741, 11259, 5129, -2965, 1580, -4416, -711, 244, -4627, 3168, 1036, -6713, -5548, +-2404, -3348, -4082, -4689, 334, 3903, 4039, 9443, 4967, 2378, 5413, 3239, -2120, -1041, -3737, -360, +2280, -2166, -7169, -4998, -3184, -3567, -1701, -4365, 3499, 6759, 1442, 2957, 3054, -115, -799, 1999, +2847, 645, 3118, 3901, 2164, 40, -3617, -5388, -2217, -4073, -4837, -2766, -3619, 371, 4886, -1427, +-3797, 3000, 4879, 3887, 7274, 4585, 2331, 5598, -875, -6164, -3726, -2801, -2607, 382, -3449, -4620, +-409, -946, 267, 370, -2039, -702, 2065, 670, 3333, 3251, 1307, 3218, 3756, -781, 1007, 3158, +893, -102, -2478, -4451, -2268, -5901, -4314, -2262, -3337, 918, 3869, 893, 2202, 3387, 3326, 3374, +2301, 3586, 1298, 645, 1160, -2489, -4677, -2085, -4260, -3410, 910, -978, -1286, 1307, -747, -1229, +-1216, -2170, 1122, 1273, 1217, 7043, 6410, 1997, 1483, -7, -2259, -1212, -848, 848, -1614, -1972, +-2048, -5936, -3121, -2246, -2380, 2249, 2422, 1424, 5152, 6926, 4353, 1166, -1947, -1858, -1646, -1528, +-2388, 992, 1768, 530, -940, -2339, -5043, -3839, -349, -2413, -607, 2682, 2348, 3962, 1511, 89, +1019, 1898, 2597, 5271, 2283, -257, 1621, -992, -4343, -4681, -6313, -2123, -1445, -3374, -1022, -76, +2198, 4410, 2088, 1183, 1415, 1781, 2105, 2717, 233, -431, 606, -426, -3186, -1410, -497, -1533, +-681, -1415, -3005, -1859, -514, -970, 710, 323, 808, 3213, 4269, 3778, 1342, 2256, 1951, 1021, +216, -781, -534, -1557, -3852, -4973, -3313, -4131, -1986, 1813, 1342, 725, 2799, 1627, 1169, 1434, +-1203, 947, 2212, 943, 1779, 2325, -127, -756, -2421, -1968, -2026, -1637, -562, -1447, -276, -1010, +-2408, -723, 243, 472, 2253, 2996, 2321, 5770, 4954, 922, 1636, 78, -5787, -2940, -1548, -3229, +-200, -1102, -1557, -401, -2292, -1360, 1501, 327, 1635, 2348, 1639, 2439, 1874, 946, -672, -1419, +172, 617, 747, 1850, -447, -591, -1158, -4059, -4114, -2927, -2611, 1169, 840, 227, 2844, 2662, +1482, 2793, 1880, 618, 2216, 1057, 272, 386, -2977, -2571, -1587, -2750, -3131, -1260, 286, 1053, +505, 444, 840, 368, 965, 245, -578, 57, 2809, 2448, 2119, 2296, -1165, -1325, -557, -2097, +-1217, -1597, -2660, -837, -2325, -2741, 75, 469, 2293, 2180, 1095, 3091, 2112, 1198, 2146, 1009, +-432, -812, -816, 431, -1601, -2551, -643, -1015, -2542, -821, 285, 322, 1196, -149, 61, -108, +-1451, 1041, 1271, 1130, 2381, 1839, 1010, 1691, -782, -1070, -1609, -3121, -1501, -2105, -1225, 675, +-350, -565, 768, 205, 160, 1895, 2604, 1398, 2980, 2607, 395, 888, -2292, -2773, -1997, -2682, +-182, 1544, 356, 423, -185, -1434, -2222, -1436, -709, 85, 949, 1495, 1357, 1377, 1436, 858, +1569, 244, -1669, -48, 631, -945, -908, -1169, -2407, -2412, -1858, -1321, 1163, 1056, 1465, 3182, +2292, 826, 1126, 896, -117, -512, -209, -702, 370, -118, -613, -628, -831, -638, -1013, -646, +-178, -642, -737, 490, -530, -1257, 832, 2076, 1428, 1328, 743, 1837, 1265, -612, -413, -1223, +-2322, -1067, -803, -903, -996, -1519, -810, 636, 1148, 1523, 2324, 1557, 917, -61, -685, 81, +230, -326, 217, -169, -257, 23, 304, -389, -1039, -493, -1302, -2045, -776, 261, 319, 892, +1129, 280, 332, 747, 1483, 2179, 842, 1208, 730, -1334, -1656, -1878, -2294, -2358, -1308, -223, +1028, 1405, 499, 727, 578, -499, -222, 672, 81, 816, 996, 98, 629, 269, -737, -134, +116, -108, -666, 198, 413, -1289, -1770, -1092, -1647, -1051, 353, 1416, 2087, 1407, 1717, 2240, +910, -51, 154, -698, -1921, -1520, -582, -20, -517, -255, -1143, -1460, -244, 243, 599, 828, +1151, 569, 345, -270, -681, 6, 643, 754, 1149, 643, 299, 276, -10, -328, -538, -1903, +-1760, -649, -841, -752, 267, 658, 1227, 825, 1199, 1795, 756, 553, 99, -727, -638, -521, +-808, -656, -1040, -555, -97, 158, 159, -114, -560, 324, 8, -69, 954, -612, -420, 791, +-72, 523, 1177, 613, 1434, 762, -603, 217, -491, -1522, -1352, -1597, -1679, -679, 415, 926, +1511, 921, 468, 308, -79, 97, 560, 607, 328, -150, -152, -823, -1076, -680, -212, -133, +108, -21, 492, 482, -159, -232, -353, -413, -637, -241, 831, 1004, 1022, 1616, 763, 379, +103, -1227, -646, -951, -1835, -279, -260, -871, -48, -7, -435, 103, 1474, 1386, 880, 863, +132, -92, 70, -993, -460, 318, -666, 81, 267, -213, 393, 220, -630, -543, -569, -625, +-28, -193, -240, 202, 298, 533, 1303, 1194, 743, 828, 288, -574, -602, -937, -1273, -1085, +-832, -758, -660, 356, 606, 682, 655, 402, 268, 364, 360, 353, 434, 41, 71, 16, +-400, -508, 104, 251, 230, -20, -372, -286, -807, -949, -822, -952, -452, 536, 1143, 970, +839, 640, 816, 459, 376, 365, -241, -509, -593, -841, -763, -637, -573, -368, -405, 295, +856, 941, 838, 321, -244, -475, -230, -63, -106, 266, 897, 267, 395, 246, -451, -408, +-349, -587, -419, -679, -701, -20, -730, 32, 553, -92, 336, 1337, 1005, 1387, 957, -2, +-55, -954, -1010, -849, -935, -300, 21, 132, 617, 116, -112, 129, -356, -89, 322, 112, +589, -116, -496, 215, 167, 129, 313, 362, 377, -67, 33, -198, -466, -754, -940, -744, +-396, -253, -33, 975, 1443, 327, 344, 646, 541, 318, -204, -305, -193, -732, -681, -220, +-552, -85, 89, -7, 451, 231, -112, 165, -75, -500, -612, -50, 556, 428, 372, 775, +517, 115, 97, -144, -63, -39, -495, -211, -728, -994, -404, -158, -108, 207, 392, 701, +1344, 913, 134, 206, -24, -823, -590, -122, -249, -301, -29, 35, -6, 185, -77, -234, +-685, -234, 255, -150, 63, 271, -223, 4, 236, 300, 681, 837, 574, 474, 39, -303, +-480, -895, -808, -461, -644, -127, 228, 76, 427, 750, 337, 306, 168, 126, 349, -272, +-33, -136, -841, -78, 28, 39, 306, -142, 132, 33, -376, -48, -487, -474, -232, -281, +94, 407, 539, 713, 395, 258, 398, 72, 314, 440, -483, -480, -426, -886, -711, -573, +-207, 186, 487, 370, 574, 857, 253, -67, -169, -561, -269, 120, 347, 423, -32, -135, +230, -69, -264, 33, -77, -324, -25, -491, -506, -7, -322, -95, 353, 318, 619, 740, +527, 786, 124, -286, -408, -685, -455, -679, -388, 28, -214, -37, 176, 267, 414, 30, +68, 285, 117, 159, 117, 34, -230, -535, 1, 745, 298, 353, 383, -181, -333, -353, +-741, -544, -431, -524, 118, 154, 194, 472, 415, 358, 526, -53, 346, 453, -258, -172, +-554, -532, -317, -428, -56, 367, 170, 89, 469, -28, 55, 172, -95, -136, -254, -194, +189, 193, 446, 341, 81, 103, 92, -43, 111, 8, -547, -466, -763, -444, 113, -190, +-25, 387, 460, 287, 585, 483, 13, 30, -359, -391, 65, -139, -125, 49, -205, -211, +97, 245, 241, 290, 56, 20, -110, -346, -423, -283, 112, -55, 187, 664, 490, 451, +341, -80, -495, -473, -514, -301, -133, -326, -55, 89, -53, 206, 138, 168, 498, 118, +215, 288, 189, 117, -263, -473, -334, -401, -232, 544, 342, 87, 351, 248, -297, -275, +-326, -431, -287, -72, 81, 314, 409, 345, 356, 95, 52, 161, -96, -166, -22, -396, +-575, -209, -200, -253, 21, 211, 245, 178, 211, 662, 341, -23, 150, -289, -385, -220, +-251, 113, 349, -77, 134, 237, 75, 149, -262, -301, -225, -528, -300, 43, 42, 189, +341, 596, 460, 150, 209, 69, -65, -29, -313, -251, -266, -340, -170, -347, -365, 21, +150, 445, 625, 134, 190, 90, -261, -111, -207, -196, -80, -23, 250, 468, 234, 213, +24, -312, -225, -374, -360, -85, -228, -149, 176, 89, 196, 226, 258, 382, 411, 392, +124, -75, 56, -290, -503, -425, -599, -118, 113, 77, 475, 113, -143, 72, -24, 5, +-7, -177, -51, 3, -24, 316, 248, 12, 147, 51, -26, 264, -66, -222, -196, -369, +-344, -260, -106, 138, 204, 397, 625, 335, 206, 185, 58, -116, -159, -361, -248, -340, +-94, 56, -152, -22, 123, -7, 103, 269, 17, -147, 16, -56, -78, -48, -86, -107, +187, 241, 181, 303, 346, -3, -249, -223, -305, -173, -260, -364, -161, 7, -35, 374, +608, 323, 455, 314, -244, -50, -59, -309, -225, -94, -94, -103, 11, 69, 32, -19, +0, 16, 53, 83, -28, -56, -10, -143, -85, -8, -34, 319, 258, 294, 418, 107, +-115, -199, -402, -590, -429, -261, -48, 269, 386, 223, 203, 189, 97, 29, 66, -111, +-35, 175, -230, -35, -1, -397, 76, -49, -214, 331, 285, 245, 356, -148, -360, -202, +-379, -259, 89, 89, 373, 267, 347, 428, -114, -15, -10, -424, -471, -289, -196, 33, +-21, 14, 132, 21, 178, 233, 66, 212, 236, 43, -6, -202, -254, -178, -131, -49, +-97, 197, 308, 24, 147, 163, 81, -95, -301, -198, -151, -323, -4, 285, 185, 318, +252, 113, 129, -141, -122, -75, -295, -138, -163, -288, -3, 11, 106, 275, 132, 78, +158, 51, 160, 144, -169, -117, -251, -141, -83, 4, 60, 107, 239, 276, 103, -139, +-13, -115, -262, -163, -103, -50, 56, 236, 133, 121, 258, 76, 7, -22, -70, -31, +-102, -263, -191, -158, -136, 32, 142, 133, 260, 221, 172, 172, -77, -215, -115, -41, +-194, -154, -69, 87, 108, 105, 157, 129, 60, -85, -59, 72, -187, -233, 10, -86, +-98, 115, 72, 232, 157, 60, 327, 102, -185, -59, -195, -202, -124, -300, -16, 108, +65, 268, 287, 49, 34, -24, -176, 96, -113, -209, -3, -159, 4, 56, 75, 190, +-57, 51, 419, -43, -105, 47, -176, -74, -130, -239, -102, 60, 58, 234, 336, 142, +124, 159, -117, -232, -202, -171, -222, -24, 44, 12, 231, 198, -12, 38, 68, -57, +12, -135, -173, 136, -112, -85, 101, -63, -143, 187, 98, 170, 341, 25, -81, -55, +-150, -263, -235, -143, 8, 63, 226, 343, 180, 150, 85, -21, -202, -193, -57, -136, +-176, 42, 97, -39, 65, 72, 14, -42, 33, 90, 14, -21, 20, -66, -214, -50, +-12, -37, 129, 250, 172, 98, 115, 127, -132, -177, -120, -282, -177, 3, 16, 47, +159, 216, 170, 90, -12, 69, -86, -120, -65, -76, -150, -129, 57, 70, 20, 98, +-21, 31, 187, -25, -17, 24, -97, -185, -142, -52, 46, 104, 80, 114, 140, 138, +106, 16, -83, -75, -179, -171, -75, -103, -22, 85, 123, 143, 250, 14, 47, -88, +-106, -15, -140, 7, -23, -114, 0, -39, 33, 237, 5, 85, 175, -80, -76, -42, +-88, -68, -136, -21, -4, -86, 172, 127, 72, 203, 42, -63, 47, -159, -170, 41, +-120, -150, 62, 3, 111, 165, 12, 150, 89, -33, -6, -23, -129, -166, -165, 4, +48, 25, 176, 131, 38, 11, 4, 70, -6, -189, -26, -62, -80, -13, -141, 57, +104, 4, 204, 236, -55, 7, 83, -171, -129, -116, -151, -50, 1, -24, 131, 241, +156, 160, 142, -71, -118, -77, -169, -68, -21, -33, 39, 42, -3, 21, 56, 89, +77, -39, -5, -150, -121, 34, -145, -46, 142, -42, -7, 80, 122, 196, 103, -34, +35, -148, -209, -34, -103, -52, 51, -19, 139, 194, 94, 107, 34, -19, -29, -85, +-85, -72, -136, -57, 135, 24, 12, 126, 56, 68, -6, -70, 39, -83, -196, -44, +-17, -125, -17, 56, 39, 48, 154, 168, 140, 48, -55, -133, -97, -120, -93, -1, +4, 89, 168, 114, -16, 86, 140, -105, -24, -89, -206, -14, -72, -20, 92, 108, +47, 112, 33, -42, 34, 121, -12, -76, -94, -213, -140, 42, -22, -22, 135, 63, +135, 145, -47, 97, 4, -142, -71, -103, -72, -12, 38, 12, 132, 187, 24, 6, +20, -13, -52, -48, -63, -38, -59, -40, 61, 37, 48, 68, 94, 33, -12, -3, +47, -127, -97, 1, -103, -85, 26, -23, 80, 202, -19, 162, 93, -179, 60, 56, +-161, -56, -115, -85, 69, -25, 87, 232, 65, -5, 12, -61, -21, -30, -78, -69, +-60, 10, 37, 107, 95, 43, 70, 61, 56, -35, -60, -41, -62, -134, -113, 1, +-17, -33, 63, 77, 120, 129, 32, 25, -29, -102, -86, -61, -111, 30, 12, -7, +187, 77, -11, 8, -43, 34, -107, -111, 92, -29, -95, 60, 69, -24, 19, 58, +111, 150, 1, -59, -52, -89, -83, -86, -86, -23, -50, -90, 107, 180, 124, 142, +56, -63, -107, -47, -47, -103, -53, 42, -20, 11, 79, 75, 35, 35, 28, -7, +-1, -166, -92, -14, -72, 92, 67, -13, 114, 69, 2, 96, 69, -41, -38, -53, +-99, -122, -102, -46, 16, 31, 80, 88, 76, 80, 35, -107, 7, 46, -118, -86, +-39, -20, 123, 46, 2, 40, 38, 81, -1, -33, -68, -97, -69, -24, -12, -15, +4, 13, 35, 42, 138, 124, 33, -7, -94, -142, -63, -24, -57, -50, 21, 72, +83, -7, -6, 89, 70, -2, -2, -51, -87, -92, -21, 21, 21, 32, 124, 39, +-21, 103, 37, -41, -55, -143, -42, -21, -84, 3, 65, 51, 79, 63, 7, 12, +42, 13, -11, -15, -34, -57, -60, -80, -42, 92, 30, 63, 132, -43, 75, 63, +-124, -19, -89, -120, 11, 30, 31, 94, 55, 90, 96, -77, -55, 75, -55, -71, +-34, -21, -46, -30, 57, 23, 52, 32, 29, 28, -8, 40, 57, -76, -60, -43, +-163, -7, 120, -59, 56, 145, 50, 43, 16, -60, -52, -85, -66, -24, -19, 1, +25, 74, 38, 69, 51, 1, 1, -34, -59, -42, 21, -4, -89, 12, 38, -52, +34, 115, 92, 26, 1, -12, 58, -85, -185, -37, 7, -38, -2, 98, 77, 43, +29, 16, -7, -21, -94, -35, 4, -102, -33, 77, 57, 30, 74, 34, 69, 60, +-102, -25, -23, -34, 33, -21, -125, -72, 33, 77, 42, 74, 89, 24, -16, -39, +-24, -29, -34, -55, 15, -12, -24, 75, 1, 7, 75, 1, -12, 30, -107, -108, +4, -34, 56, 56, -61, 29, 74, 76, 63, 29, 22, -29, -80, -115, -21, 39, +-95, -14, 110, 37, -22, 21, 57, 56, 42, -80, -80, 41, -46, -72, 16, 35, +-34, 12, 79, 8, 77, 12, -21, 62, -126, -138, 42, 1, -102, 25, 77, 75, +84, 4, 8, 43, -28, -24, -46, -29, -55, -7, 38, -16, 4, 24, 12, 33, +38, -32, 2, 102, -24, -75, -38, -90, 4, 25, -49, 81, 94, 5, 30, 38, +-23, -26, -13, -136, -12, 22, -35, 47, 52, -30, 103, 69, -47, 22, -3, -52, +-24, -69, -4, 23, -41, 7, 15, 39, 12, -8, 68, 61, 49, -1, -32, -72, +-51, -55, -24, 118, 5, -41, 42, 96, 55, -37, -28, 25, -67, -95, -1, -16, +11, 69, 4, 51, 80, -29, 48, -4, -79, 26, 6, -14, -37, -48, -46, -16, +56, 28, 38, 44, 6, 38, -2, -44, -1, -28, -28, 12, -19, 21, 68, 5, +38, 32, 7, 77, -68, -88, -15, -10, -39, -25, 1, 28, 63, -4, 31, 15, +4, 51, -31, 6, 22, -96, -61, 33, -10, 29, 42, -10, 5, 10, 6, 16, +-3, -28, -13, -29, -33, -17, -1, 15, 31, 102, 30, 1, 3, -7, 5, -24, +-43, 1, -39, -30, -22, 11, 19, 60, 86, -29, 16, 21, -33, -40, -24, -3, +-3, 33, -15, -37, 70, 52, -8, 46, 4, -42, 38, -74, -42, 63, -67, -51, +51, -20, -2, 74, 14, -2, 74, 19, -13, -15, -67, -28, -34, -29, 52, 29, +-3, 71, 24, -21, 0, 1, -31, -17, 13, -6, -19, 25, 7, -17, 57, 17, +-13, 39, 7, 7, -6, -46, -49, -24, -33, -12, 32, -6, 4, 52, 37, 33, +4, 1, 30, -12, -84, -49, 25, 3, -21, 4, 28, 40, 15, -2, 21, -16, +-7, -7, -22, -15, -3, 30, 19, -7, 26, 71, -17, 4, 25, -51, 12, 17, +-33, -24, -59, -49, 39, -11, 15, 84, 46, 24, 16, -30, -15, 16, -47, -38, +-7, 10, 41, 20, 4, 7, 25, 1, -37, -13, 2, 1, -13, 8, 4, 1, +-4, 4, 4, 47, 41, 21, 23, -3, 1, -21, -55, -41, -57, 4, 60, 14, +50, 1, -5, 39, 3, -3, -6, 12, -44, -40, 32, -5, -24, 25, 14, 21, +14, -11, 37, 2, -72, 1, 21, -12, -3, -17, 6, 24, 58, 22, 7, 16, +-4, -22, -21, -12, -21, -33, -5, 11, -21, 21, 8, 26, 57, -7, -3, 19, +-38, -16, -3, -38, 25, 12, -7, -8, -2, 33, 32, -13, -5, 16, -2, -37, +-33, 6, 17, 1, -1, 46, 55, 22, -3, -6, 12, -10, -24, 2, -12, -10, +-3, -12, 8, 5, 6, 17, 1, 33, 24, -29, 19, 4, -31, -48, 21, 32, +-44, 25, 48, 17, 21, 11, -17, -33, -26, -1, -24, -15, 21, 13, 19, 42, +4, -15, 22, 33, 32, -12, -12, 33, -8, -47, -13, 4, -1, 4, 4, 19, +42, 2, 5, -11, -31, 4, -29, -11, 20, -6, 11, 59, 40, -10, 5, -3, +-3, -3, -42, 14, 4, -13, 24, -13, -16, 22, 7, -6, 48, 25, -24, 21, +4, -1, 1, -37, -12, 4, 46, 21, -14, 35, 32, -12, 6, -20, 7, -32, +-66, 22, 17, 0, 33, 33, 22, -16, -11, 38, -8, -24, 33, 7, 3, -7, +-38, 0, 4, 3, 53, 13, 0, 31, 17, -11, -7, -14, 1, -16, -25, 20, +12, 33, 16, 42, 42, -35, 4, -16, -49, 38, 5, -12, 25, -19, -10, 31, +-7, 17, 16, -13, 29, -3, -34, 16, -5, -6, -10, -21, 38, 13, -13, 55, +28, -13, 17, 7, -38, -19, 12, -2, -1, -5, 19, 8, 7, 16, 0, -7, +12, 2, -12, 4, -12, -7, 21, -15, -2, 30, 8, 42, 0, 0, 17, -17, +-2, -12, -12, -15, 4, 5, 7, -8, 5, 38, 16, -3, -10, 8, -7, -21, +16, 4, 8, 32, -38, -17, 47, -4, 3, 35, -7, -29, 1, -19, 16, -33, +-44, 52, 8, -6, 25, 25, 32, -7, -5, 16, -23, -14, 14, -40, 17, 31, +-20, 12, 11, -8, 25, -14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -166, 337, -587, 1045, -3670, -10103, 2561, -7856, +-6203, -9424, -5835, 8060, -9523, -7352, -942, -11220, 1810, -4051, 2587, 5266, 8, 10677, 7693, 6749, +15566, 10313, 15625, 19102, 15170, 20481, 21282, 17506, 18275, 17955, 10371, 11331, 8191, 1826, 3593, 246, +-3667, -5781, -12972, -13038, -17522, -22319, -19649, -26226, -26036, -21351, -31345, -28644, -27505, -30138, -24037, -24395, +-23056, -16300, -15631, -11461, -6630, -2825, 2814, 5847, 12218, 15765, 17802, 23585, 24626, 26319, 29516, 28196, +27478, 28236, 26585, 26334, 22766, 20923, 18435, 15258, 13671, 9005, 4462, 2633, -2081, -4783, -6773, -9124, +-8150, -9735, -11768, -12276, -12363, -12083, -12518, -12134, -11688, -11734, -10726, -11690, -12076, -11166, -9732, -8089, +-7306, -7502, -5571, -7265, -6813, -7816, -8506, -5916, -5856, -4723, -4422, -1445, 30, 318, 3404, 3880, +5682, 6448, 7015, 10033, 12228, 14044, 15877, 16939, 18222, 19110, 18697, 17866, 17189, 15959, 16128, 15277, +13057, 11429, 10299, 7485, 5349, 1162, -2067, -5308, -10818, -13770, -17030, -20861, -22969, -24607, -26377, -27608, +-26673, -28239, -27564, -24855, -24807, -21951, -19284, -17671, -12839, -8510, -5224, 495, 5733, 9349, 13657, 16722, +19042, 22340, 24277, 25030, 26840, 26497, 27401, 26623, 24817, 24359, 21538, 17805, 15416, 11390, 7602, 4520, +1578, -1297, -2744, -5505, -7734, -9414, -12270, -13629, -14885, -17002, -16193, -17240, -17263, -15924, -16203, -14996, +-12887, -11632, -9800, -8289, -7301, -4618, -3675, -3095, -822, -506, 948, 2305, 2968, 5457, 5243, 5670, +5885, 4815, 5478, 4927, 4119, 4468, 4070, 4564, 4673, 4329, 4156, 4281, 4190, 4123, 4324, 4647, +5265, 5883, 5804, 7184, 7414, 5998, 6619, 5352, 3728, 3409, 1432, 480, -147, -1665, -2652, -4184, +-6305, -6972, -8486, -9005, -9657, -11561, -9876, -11332, -11650, -9584, -10550, -8331, -6986, -6898, -4055, -2907, +-1857, -109, 1452, 2497, 3724, 5145, 5478, 6673, 7742, 8084, 9803, 9231, 9307, 9590, 8736, 8699, +8039, 6304, 6052, 5302, 3861, 2450, 1776, 236, -755, -2027, -4051, -4759, -5464, -7128, -7848, -7516, +-8031, -7689, -7355, -7070, -6433, -6132, -5529, -3908, -3883, -3064, -1674, -1613, 375, 859, 1780, 4349, +3442, 4242, 5010, 3555, 4355, 3689, 2794, 3807, 3414, 3231, 4297, 3904, 3746, 3948, 3369, 3773, +2897, 2000, 2545, 1535, 1731, 1605, 1199, 907, 236, -428, -1904, -1951, -2813, -3518, -3627, -4592, +-4563, -4267, -5183, -4232, -4245, -5085, -4048, -4460, -4831, -4182, -4171, -3700, -2613, -2214, -1269, 70, +264, 1132, 1889, 1518, 2497, 2300, 1617, 3171, 3088, 2958, 4167, 4332, 5271, 5363, 4685, 5171, +4463, 3876, 3961, 3006, 3125, 2634, 1932, 1865, 937, 195, -697, -1579, -2338, -3341, -3226, -3895, +-4025, -3871, -3878, -2659, -3518, -2972, -2025, -2917, -1899, -2487, -2886, -1334, -2314, -1401, -826, -1072, +396, 41, 366, 583, 258, 89, -316, 161, -88, 478, 1239, 725, 2334, 2516, 2503, 3275, +2524, 2718, 3289, 2432, 2746, 3081, 2779, 3250, 3012, 2722, 2696, 2281, 1475, 602, 328, -385, +-1038, -1019, -1681, -1600, -1973, -2466, -2539, -3426, -3341, -3870, -4491, -4576, -4742, -4526, -4922, -4756, +-4056, -3975, -3676, -3124, -2513, -1814, -1621, -660, 374, 858, 2135, 2872, 3604, 4786, 5155, 6196, +6837, 7071, 7097, 6612, 6404, 5896, 5027, 4463, 4234, 3113, 2410, 1809, 740, -36, -1241, -1928, +-2421, -3758, -4458, -4311, -5284, -5274, -4948, -5270, -4526, -4581, -4329, -3585, -4282, -3467, -3355, -3180, +-2289, -2456, -1334, -648, -849, 553, 536, 677, 1626, 1019, 2213, 2587, 2225, 3550, 3609, 3701, +4793, 4147, 4067, 3993, 2929, 3379, 2969, 1617, 2878, 1513, 1537, 3272, 1035, 1491, 1578, -340, +405, -501, -1490, -873, -1746, -1983, -1423, -1829, -1807, -1852, -2114, -2841, -3067, -3460, -3636, -3680, +-4027, -3665, -3759, -3432, -3120, -3428, -2941, -2614, -2572, -2070, -1687, -536, 83, 536, 1813, 2502, +3463, 4311, 4724, 5324, 5331, 5649, 5242, 4880, 5208, 4324, 3961, 3803, 3052, 2915, 1910, 1155, +938, -312, -965, -1040, -2085, -2327, -2804, -3459, -3450, -4073, -4237, -4020, -4646, -4628, -4326, -4738, +-4182, -3791, -3573, -2563, -2329, -1773, -818, -495, 423, 929, 1247, 2208, 2528, 2977, 3668, 3934, +4189, 4633, 4659, 4751, 4564, 4378, 3745, 3086, 2951, 1918, 1689, 1171, 337, 307, -230, -900, +-1116, -1857, -2259, -2271, -3106, -2857, -2739, -3468, -2836, -3025, -2998, -2456, -2920, -2552, -2480, -2536, +-1996, -2044, -1655, -753, -728, -41, 371, 869, 1314, 1802, 2106, 2479, 3104, 2891, 3055, 3574, +3054, 3347, 3231, 2705, 2880, 2243, 1650, 1617, 730, 395, 183, -516, -594, -987, -1235, -1344, +-1741, -2032, -2121, -2333, -2567, -2720, -2735, -2868, -2637, -2576, -2489, -1899, -1911, -1731, -1243, -1103, +-766, -471, -257, -27, 361, 816, 1083, 1515, 1795, 2134, 2435, 2528, 2630, 2817, 2630, 2629, +2368, 2226, 2174, 1583, 1338, 1138, 674, 357, -89, -544, -823, -1040, -1474, -1356, -1418, -1309, +-1096, -1335, -978, -1041, -1348, -944, -1306, -1339, -817, -1117, -937, -343, -420, -123, 133, -95, +143, 279, 39, 318, 451, 350, 599, 704, 587, 778, 759, 560, 647, 244, 303, 309, +-71, 201, -35, -108, 36, -243, -141, -207, -422, -400, -663, -493, -238, -354, 114, 182, +488, 710, 652, 866, 713, 512, 369, 263, 240, 30, 35, -28, -243, -230, -217, -535, +-364, -461, -638, -383, -486, -446, -28, -147, 64, 206, 104, 396, 280, 76, 244, 177, +131, 0, -5, 136, -59, -187, -93, -195, -260, -323, -437, -398, -454, -556, -360, -269, +-398, -303, -238, -307, -341, -314, -326, -417, -354, -248, -255, -104, 3, 94, 327, 346, +467, 786, 931, 1087, 1348, 1413, 1520, 1607, 1521, 1612, 1631, 1225, 1258, 1011, 633, 511, +-13, -326, -524, -975, -1242, -1571, -1673, -1756, -1831, -1760, -1736, -1690, -1398, -1167, -1144, -1074, +-927, -663, -577, -505, -217, -59, -60, 165, 269, 371, 642, 618, 660, 870, 893, 943, +1024, 949, 1070, 1120, 905, 975, 928, 667, 710, 524, 273, 337, 215, 192, 27, -85, +-55, -136, -480, -473, -467, -742, -561, -521, -409, -156, -27, 90, 216, 235, 253, 129, +109, -15, -170, -277, -411, -471, -713, -902, -1078, -1293, -1377, -1544, -1549, -1535, -1464, -1133, +-879, -689, -322, 34, 277, 497, 692, 846, 1229, 1361, 1479, 1899, 1980, 2257, 2359, 2125, +2345, 2067, 1702, 1608, 1175, 972, 826, 419, 274, 212, -90, -294, -500, -859, -1196, -1496, +-1807, -1928, -1994, -2279, -2235, -2211, -2281, -2196, -2187, -2160, -1879, -1831, -1630, -1304, -931, -507, +-49, 340, 754, 1277, 1378, 1700, 1842, 1767, 2048, 1877, 1821, 1956, 1699, 1708, 1602, 1335, +1160, 1029, 685, 448, 255, 44, 35, -100, -12, -17, -107, 0, -83, -197, -204, -273, +-406, -507, -529, -629, -713, -766, -745, -792, -897, -967, -1041, -1130, -1286, -1195, -1126, -1201, +-975, -821, -715, -594, -498, -257, -226, -109, 56, 102, 345, 448, 536, 692, 797, 967, +972, 1024, 1038, 1088, 1122, 1094, 1191, 1268, 1229, 1315, 1204, 1115, 1086, 739, 573, 408, +-25, -225, -577, -856, -1001, -1327, -1421, -1534, -1626, -1673, -1722, -1719, -1615, -1447, -1358, -1144, +-762, -587, -316, 13, 204, 546, 710, 817, 1232, 1301, 1324, 1569, 1455, 1542, 1573, 1367, +1464, 1310, 1060, 1089, 760, 650, 544, 228, 206, 25, -248, -258, -435, -655, -695, -874, +-1136, -1205, -1452, -1605, -1645, -1801, -1723, -1656, -1704, -1505, -1321, -1222, -992, -788, -566, -403, +-151, 66, 207, 424, 599, 793, 928, 1033, 1184, 1167, 1331, 1311, 1222, 1285, 1162, 1220, +1205, 1079, 1159, 1049, 1007, 961, 744, 713, 622, 491, 454, 278, 183, 104, -112, -197, +-417, -577, -705, -944, -1074, -1179, -1417, -1408, -1516, -1600, -1445, -1510, -1304, -1195, -1157, -842, +-787, -669, -372, -301, -30, 69, 191, 490, 456, 606, 781, 796, 854, 817, 905, 1030, +931, 1025, 1031, 1078, 1162, 967, 1062, 943, 798, 695, 492, 486, 190, 153, 56, -245, +-283, -474, -592, -714, -965, -975, -1044, -1117, -1038, -1093, -1004, -811, -837, -754, -559, -524, +-423, -468, -308, -122, -137, 78, 108, 265, 411, 340, 487, 485, 411, 531, 369, 377, +464, 399, 531, 463, 564, 674, 578, 652, 608, 574, 583, 359, 376, 359, 231, 165, +84, 7, -154, -230, -318, -457, -502, -529, -616, -564, -541, -520, -517, -493, -464, -422, +-520, -551, -440, -549, -539, -476, -483, -354, -299, -280, -89, -40, 1, 65, 144, 196, +255, 395, 454, 485, 671, 738, 841, 923, 875, 972, 956, 844, 840, 747, 662, 587, +395, 362, 225, 37, -44, -220, -283, -451, -619, -555, -650, -665, -606, -672, -598, -546, +-634, -614, -612, -633, -577, -543, -585, -443, -348, -312, -196, -131, -54, 41, 22, 45, +132, 156, 294, 330, 351, 458, 496, 459, 391, 374, 331, 221, 236, 154, 165, 178, +26, 153, 153, 102, 151, 35, 36, 95, -16, 65, 157, 188, 249, 331, 309, 303, +293, 238, 190, 108, 32, -36, -139, -204, -277, -311, -377, -483, -491, -541, -663, -653, +-656, -662, -517, -480, -414, -234, -245, -146, -57, -91, 54, 52, 41, 220, 202, 235, +405, 347, 473, 600, 497, 680, 603, 600, 677, 515, 599, 517, 390, 458, 273, 214, +122, -47, -37, -249, -354, -357, -485, -509, -536, -577, -555, -574, -590, -577, -584, -440, +-432, -437, -243, -236, -56, -5, -7, 187, 113, 127, 239, 157, 187, 221, 154, 196, +170, 133, 243, 212, 209, 313, 291, 280, 362, 351, 395, 398, 279, 332, 318, 147, +128, 66, -2, -46, -165, -160, -228, -284, -314, -348, -388, -369, -346, -341, -354, -338, +-272, -262, -291, -274, -197, -154, -152, -68, -12, -35, 56, 70, 94, 214, 148, 202, +267, 255, 307, 332, 390, 492, 527, 476, 599, 501, 430, 535, 306, 347, 308, 75, +128, -8, -162, -149, -263, -428, -476, -560, -604, -624, -651, -621, -530, -510, -503, -350, +-343, -283, -225, -233, -165, -175, -137, -60, -50, -20, 46, 75, 163, 220, 172, 211, +274, 216, 352, 371, 343, 511, 493, 488, 580, 511, 477, 497, 375, 377, 304, 173, +162, 74, 95, 60, -81, -71, -199, -272, -311, -471, -369, -352, -434, -343, -325, -370, +-316, -301, -306, -293, -311, -306, -291, -314, -306, -257, -251, -238, -151, -117, -127, -17, +-10, 36, 171, 236, 318, 424, 516, 593, 628, 594, 629, 618, 515, 485, 376, 284, +287, 199, 113, 127, 52, -49, -41, -170, -224, -248, -351, -327, -313, -297, -312, -297, +-298, -306, -313, -360, -308, -306, -314, -262, -249, -200, -165, -149, -97, -78, -65, -21, +7, 23, 97, 175, 241, 323, 366, 404, 477, 442, 422, 456, 348, 312, 289, 133, +114, 119, 70, 61, -15, 16, 23, -78, -68, -112, -122, -75, -141, -131, -46, -113, +-157, -112, -236, -267, -278, -379, -336, -308, -386, -335, -338, -359, -267, -277, -231, -188, +-170, -59, -59, 13, 125, 182, 279, 326, 379, 461, 469, 469, 482, 539, 495, 398, +405, 399, 332, 277, 253, 240, 221, 153, 69, 99, 28, -39, -10, -107, -88, -134, +-191, -180, -279, -312, -354, -471, -474, -493, -511, -463, -496, -464, -364, -366, -306, -217, +-206, -90, -54, -28, 56, 109, 146, 162, 225, 243, 239, 264, 240, 250, 250, 224, +225, 221, 206, 216, 196, 188, 204, 199, 187, 182, 192, 157, 131, 154, 97, 117, +110, 68, 74, -17, -44, -110, -197, -200, -286, -355, -331, -381, -371, -340, -351, -325, +-277, -235, -194, -188, -136, -89, -57, -16, 10, 76, 104, 102, 180, 183, 196, 214, +185, 280, 286, 255, 335, 299, 342, 376, 311, 328, 264, 206, 188, 95, 10, -34, +-93, -119, -223, -287, -291, -377, -422, -417, -471, -469, -514, -517, -396, -419, -359, -214, +-194, -90, 23, 20, 120, 187, 196, 317, 332, 314, 408, 384, 379, 424, 337, 360, +348, 265, 299, 277, 233, 225, 223, 212, 178, 129, 47, 45, 22, -55, -107, -176, +-207, -238, -317, -312, -365, -367, -326, -375, -333, -327, -348, -291, -275, -249, -160, -134, +-123, -74, -51, -31, -16, -6, 20, 28, 50, 46, 75, 76, 99, 115, 112, 144, +152, 154, 199, 175, 219, 234, 217, 264, 289, 297, 270, 267, 249, 192, 149, 81, +22, -16, -65, -125, -143, -166, -199, -182, -202, -248, -215, -228, -230, -183, -166, -141, +-94, -62, -50, -27, -17, -31, -21, 6, -13, -31, 16, 32, 73, 75, 118, 176, +122, 182, 192, 124, 172, 141, 104, 137, 66, 59, 90, 25, 3, 1, -68, -124, +-142, -197, -210, -175, -202, -196, -151, -115, -136, -94, -65, -39, -20, 1, 23, 61, +91, 108, 141, 157, 131, 125, 103, 62, 36, -15, -27, -16, -62, -8, -20, -52, +17, -13, -3, 22, -11, 23, 27, 3, 3, 3, 12, 1, -25, -27, -45, -68, +-39, -89, -83, -10, -66, -10, 32, -21, 71, 70, 34, 99, 32, 47, 51, 12, +46, 26, 34, 54, 18, -5, 6, -25, -84, -59, -64, -91, -44, -71, -28, 50, +0, 56, 95, 74, 115, 86, 76, 125, 66, 61, 68, 35, 12, -36, -62, -62, +-120, -152, -143, -183, -160, -160, -168, -75, -66, -62, 13, 1, -5, 44, 18, 15, +36, 3, 32, 66, 22, 61, 61, 30, 80, 54, 61, 75, 70, 93, 70, 83, +99, 113, 117, 109, 103, 91, 28, 26, 10, -34, -36, -91, -103, -83, -175, -149, +-152, -216, -132, -153, -187, -115, -139, -95, -26, -23, 46, 78, 78, 124, 90, 95, +122, 60, 71, 83, 31, 45, 54, -6, 41, 15, -21, 61, 21, 3, 80, 56, +71, 103, 90, 95, 100, 50, 41, 12, -30, -28, -49, -78, -88, -114, -107, -107, +-131, -112, -131, -125, -99, -122, -89, -60, -49, 10, 7, 22, 52, 81, 84, 46, +59, 49, 41, 61, 27, 36, 50, 25, 45, 37, 36, 79, 68, 37, 80, 89, +76, 124, 94, 78, 98, 57, 51, -10, -54, -62, -146, -162, -176, -204, -199, -214, +-204, -162, -141, -125, -113, -83, -57, -36, 0, 15, 52, 66, 95, 100, 112, 162, +122, 95, 109, 85, 93, 78, 60, 90, 56, 66, 79, 70, 61, 56, 49, 46, +39, 31, 27, 13, 25, 3, -26, -35, -56, -81, -102, -151, -172, -136, -173, -153, +-114, -136, -66, -62, -55, 0, 0, 17, 36, 46, 74, 76, 80, 76, 76, 61, +44, 41, 7, 25, 8, -12, 13, 0, 17, 51, 21, 59, 60, 54, 73, 51, +16, 37, 27, 22, 3, 0, 6, -20, -52, -79, -86, -112, -131, -129, -152, -131, +-115, -108, -68, -80, -50, -37, -40, 12, 3, 13, 28, 41, 52, 75, 91, 60, +100, 76, 12, 71, 47, 16, 71, 15, 60, 102, 47, 105, 95, 73, 103, 42, +36, 41, -11, -1, -46, -78, -44, -88, -107, -120, -149, -141, -160, -173, -114, -129, +-123, -73, -71, -40, -27, -1, 18, 3, 42, 42, 18, 57, 49, 71, 75, 44, +71, 66, 32, 40, 25, 22, 34, 13, 36, 39, 23, 51, 73, 46, 64, 56, +31, 47, 10, -5, 15, -7, -10, -35, -32, -49, -71, -59, -55, -68, -75, -40, +-41, -46, -12, 7, -7, 0, 0, -12, 6, -25, -42, -16, -59, -49, -40, -49, +-34, -31, -22, -30, -34, -1, -5, 0, 17, 20, 44, 55, 54, 70, 64, 59, +52, 55, 54, 26, 16, 3, -1, -6, -20, -28, -34, -34, -46, -39, -51, -59, +-40, -34, -16, -17, -10, 13, 22, 8, 10, 27, 20, 3, 12, 3, 0, 7, +5, 3, 32, 39, 46, 44, 64, 74, 49, 65, 68, 57, 81, 31, 22, 54, +-7, 5, -6, -54, -26, -78, -95, -71, -83, -59, -73, -84, -28, -49, -35, -25, +-39, 7, 0, -2, 12, 3, 23, 27, 31, 25, 32, 39, 5, 3, 8, -6, +6, 5, -2, 10, 0, 7, 17, 7, 27, 22, 28, 51, 31, 31, 16, 7, +17, 0, -10, -22, -39, -39, -60, -49, -42, -45, -10, -10, -1, 5, 3, 17, +12, 22, 17, 16, 45, 7, -2, 13, 0, 2, -8, -22, -5, -26, -44, -7, +-32, -17, 7, -15, 7, 7, 3, 21, 13, 0, 27, 8, -3, 23, 0, 0, +0, -22, -18, -45, -45, -44, -69, -62, -50, -40, -21, -10, -3, 20, 17, 23, +47, 54, 46, 35, 41, 39, 18, 27, 18, -1, 5, -15, -36, 0, -28, -31, +-3, -34, -10, 0, 1, 7, 7, 16, 10, 3, 3, 0, -8, -7, -23, -31, +-20, -44, -64, -44, -37, -49, -40, -12, -23, -20, 7, 3, 22, 49, 22, 41, +61, 41, 62, 46, 13, 34, 17, 3, 0, -16, -10, -36, -44, -34, -59, -40, +-35, -42, -25, -30, 1, 11, -5, 6, 8, 1, 3, -7, -13, -23, -28, -30, +-44, -36, -46, -49, -16, -25, -11, 11, -1, 46, 42, 54, 98, 95, 85, 105, +113, 110, 99, 75, 70, 64, 54, 28, 18, 11, -1, -3, -20, -27, -34, -46, +-51, -62, -51, -54, -45, -26, -51, -44, -40, -73, -62, -54, -73, -78, -97, -76, +-73, -90, -68, -64, -45, -28, -22, 8, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -5, 29, -42, 86, -121, 230, +-415, 863, -2501, -1350, -5477, 664, -3570, -6605, 730, -2747, -2075, -2252, 1779, 2570, -2441, 7616, +2482, 7694, 11133, 4880, 12552, 10338, 7893, -5608, -4325, -314, -12728, -16656, -10794, -21874, -21705, -10663, +-9949, 4970, 11945, -16222, 19805, 23441, 12874, 29194, 19256, 15907, 29194, -11497, -14372, 25729, -29187, -12715, +-16157, -29187, -703, -25233, -11361, -5487, -18061, -16158, 29194, 3330, 20280, 22352, 17644, 29194, 16335, 24961, +7034, -434, 4339, -28192, -15111, -26654, -29187, -12748, -9455, -29187, -1324, 4153, -923, 21518, 15167, 14333, +29194, 18504, 18455, 8608, 351, 3545, -11765, -14683, -1332, -19763, -7117, -1557, -18385, -2404, -3448, -8073, +5061, -7486, -5429, 3663, -8702, -5823, -3958, -4539, 1097, -656, 1703, 2833, -1621, 3787, 10610, 864, +4416, 3280, -1300, -1343, -8074, 993, -2619, -8013, -709, -2150, -3074, -1748, -3537, -4791, 455, -942, +563, 2874, 6811, 6070, 6720, 4552, 5941, 8076, 4322, 2845, -781, -4478, 2357, -4705, -7134, 3814, +-8177, -2577, 2776, -5314, 908, 3239, -2307, 5099, -509, 1316, 6105, 140, 422, 3518, 3378, 4063, +3540, -1321, 507, -2137, -744, -1600, -4576, -2879, -3035, -4277, -140, -2009, 181, 2643, 1002, 4239, +1821, 3401, 4382, 2602, 1476, 1803, 168, -893, -1782, -4735, -4434, -5447, -4997, -6718, -336, -482, +1366, 4093, 3881, 7560, 8031, 4327, 3100, 904, -423, -3527, -3066, -3738, -4928, -4756, -4518, -2634, +-1015, -1788, -283, 3661, 1774, 5335, 4476, 2826, 3626, 2058, 1359, 883, -1593, -3367, -2095, -2562, +-1438, -2354, -2570, -354, 810, 349, 1959, 1868, 1336, 3536, 103, 1687, 2944, 672, 1187, 204, +-1931, -1852, -251, -1477, -2039, -676, 148, -288, 3080, 285, 576, 1830, 3967, 286, -180, 3335, +-1416, 1030, -919, -477, -447, -2890, -140, -1468, -2902, -1459, -1485, -1251, 2354, -1350, 1243, 2843, +138, 2074, 1037, 318, 1244, -3352, 943, -327, -2386, -153, -1596, -2095, -116, -776, 124, 101, +101, 937, 961, 3449, 532, 1945, 1697, 264, 1799, -301, 55, 611, -2024, -735, -465, -2741, +-271, -1955, -628, -608, -534, 883, 694, 672, 2513, 2680, 1023, 809, 1666, 929, 1323, -1600, +-228, -422, -755, -1332, -1051, -793, 282, -1179, 753, -206, 936, 1435, 1333, 958, 1325, 1981, +553, -789, -957, -1349, -1201, -3110, -3830, -979, -3306, -1272, 336, -1267, 3832, -487, 2939, 2932, +3078, 2757, 1383, 2042, 565, -1194, 236, -1907, -1966, -1532, -3151, -1023, -1910, -1040, 535, 448, +1536, 143, 2963, 2158, 2188, 1062, 483, 3056, -21, -1387, -13, -1495, -592, -541, -2242, -529, +-1623, -1336, -336, -2495, 653, -603, -353, 1045, -737, 615, 1739, 888, 694, 2301, 1801, 1633, +1502, 868, 61, -1280, -1509, -2560, -3031, -1407, -2948, -3221, 1027, -236, 1027, 2370, 865, 3108, +2750, 1553, 1578, 550, -326, 1537, -1064, -684, -141, -1179, -180, -612, -246, 572, -649, 1134, +872, 1143, 481, -235, 1705, -414, 358, 182, -230, 4, -1122, 552, -204, -763, 629, -118, +237, 74, 20, 1753, 753, -1027, 1290, -301, 289, 377, -1108, -798, 7, -1339, -63, 52, +-1840, -647, -840, -670, -516, -707, 262, 429, 527, 881, 1031, 1122, 958, 475, 607, 236, +-2296, -113, -2369, -2119, -909, -1235, -828, 729, 820, 1610, 2158, 1458, 1394, 1276, 206, -643, +-592, -853, -2065, -613, 276, -672, 216, 547, 116, 1076, 727, 478, 706, 148, 510, -104, +-493, 118, -406, -892, -741, 338, -529, 233, -700, 846, 48, -608, 876, -803, -335, -440, +-1318, -845, -928, -529, -830, 358, 745, 235, 310, 32, 1368, 281, -222, 422, -1278, -1229, +-1128, -2213, -1835, -2413, -1139, -1506, -1257, 353, 966, 1236, 2287, 1788, 1308, 1710, -87, 444, +208, -1563, -157, -1666, -1083, -908, -1391, -445, -1627, -506, -416, -465, 16, 722, 392, 872, +1266, 1353, 1780, 239, 764, 796, 223, 413, -416, -447, 291, -609, -758, -1, -730, -370, +-191, -8, -388, 547, -564, 626, 776, 517, 1065, 667, 1701, 731, 1325, 1235, 418, 149, +-161, -798, -1132, -746, -1248, -1202, -1098, -611, -484, -86, -245, 83, 720, 336, 703, 319, +985, 923, 512, 392, 820, -212, -780, -423, -685, -1506, -453, -1030, -1354, -322, -685, -290, +408, 369, 725, 984, 828, 643, 746, 181, -309, 333, -655, -1221, 168, -886, -426, -257, +-156, 427, -266, 428, 351, -387, 803, -729, -145, 176, -670, 161, -156, 89, 126, -218, +163, -319, 77, 299, -19, 388, 846, 655, 161, 152, 212, -343, -454, -1286, -646, -588, +-1160, -188, 152, 243, 958, 404, 906, 619, 461, 759, 391, 51, -2, 306, -638, -271, +-56, 445, 418, -431, -260, 413, -236, -241, -306, -936, -823, -187, -554, -81, -374, 701, +407, 1142, 1048, 647, 1533, 457, 168, 207, -1123, -799, -542, -1761, -1092, -1810, -1024, -963, +-1019, 392, -26, 319, 1069, 995, 865, 1120, 820, 646, -8, 175, -936, -1250, -715, -1608, +-750, -860, 0, -194, -52, 1225, -111, 1069, 692, 4, 747, -267, 144, 19, -871, 419, +-1053, -303, 150, -631, 165, -245, -145, 683, 215, 758, 800, 231, 1282, 158, 154, 640, +-392, -57, -556, -812, -680, -845, -258, -720, -484, 305, 139, 1160, 469, 796, 1359, 380, +1005, 144, -321, -40, -550, -745, -583, -859, -1056, -365, -268, -664, 188, 275, 420, -300, +331, 518, -337, 694, 81, 17, -236, -526, -93, -166, -365, -223, -187, -310, 81, 561, +236, 161, 781, 71, 10, -61, -46, -434, -660, -492, -349, 90, -168, 426, 627, 455, +787, 585, 392, 517, 198, -44, -245, -316, 162, -593, 56, -7, -103, 204, 239, 242, +317, 655, 352, 198, 422, 408, 6, -257, -323, -218, -72, -630, 277, -315, 206, 552, +642, 911, 571, 578, 802, 349, -80, 409, -570, -912, -1032, -762, -699, -680, -171, -277, +347, 731, 660, 938, 1073, 125, 312, 33, -585, -79, -662, -460, -1092, -682, -141, -308, +-249, 631, 89, -50, 498, -85, 171, 292, -324, -196, 352, -361, -40, -470, 114, 341, +-452, 170, -7, 56, -31, -186, -103, 321, 50, -98, 1, -154, 145, 129, -255, 317, +-43, 411, 301, -223, 580, 289, -463, 105, -505, -235, -569, -673, -175, -556, -70, 189, +124, 297, 141, 427, 563, 162, 198, 408, -154, -420, -336, -405, -937, -170, -805, -738, +-143, -523, -208, 25, -151, 262, 358, 47, 370, 310, 296, 37, 268, -51, -521, -340, +-692, -748, -607, -778, -283, -570, -90, 232, 44, 444, 290, 216, 642, -3, -88, 129, +-159, -414, -356, -498, -294, -537, -391, 86, 59, -76, 218, 310, 461, 480, 215, 509, +314, 150, 259, -585, -225, -397, -587, -142, -745, -182, 39, -318, 418, 501, 601, 579, +582, 217, 682, 267, 24, 94, -206, -120, -556, -391, -472, -401, -153, -249, -271, 59, +127, 172, 318, 145, 409, 656, 134, 4, 417, 40, -132, 163, -385, 116, -271, -230, +-55, -253, -22, -277, -356, 24, 4, -40, 70, 71, 154, 178, 307, 324, 83, 190, +204, 268, -280, -83, 104, -344, -569, -358, -489, -379, -308, 98, 133, 267, 405, 509, +594, 370, 379, 270, -216, -7, -200, -358, -307, -407, -518, 47, -34, -94, 530, 431, +176, 526, 276, 694, 149, 202, 565, -298, -185, -37, -370, -391, -397, -31, -161, -325, +390, -4, 176, 496, 145, 414, 487, 121, 297, 133, 147, 261, -267, -65, 53, -355, +-144, -258, -71, 67, -261, 46, -94, -223, 388, -217, 285, 46, -142, 640, 130, 94, +304, -55, 108, 144, -105, -306, -255, -424, -292, -273, -426, -24, -34, -136, 70, -203, +187, 250, -245, 337, -130, 20, 215, -188, 124, 26, -120, 86, -437, -267, -158, -555, +-148, -179, -268, 154, -25, 113, -33, 306, 190, 171, 260, 103, 92, -21, -143, 80, +-334, -327, -92, -165, -111, -72, -195, 398, -29, 208, 473, -26, 336, 211, -25, 39, +-267, -81, -129, -457, -160, -181, -53, -202, 74, -65, 227, 141, 140, 227, 21, 32, +-67, -77, -185, -156, -267, -263, -294, -249, -59, -59, -85, 23, -24, -39, 42, -25, +12, 3, 21, 86, 105, 313, -65, -80, -2, -184, -173, -213, -248, -131, -263, -51, +129, -30, 86, 23, 157, 86, 258, 194, 95, 283, 282, 131, 140, 129, -31, 136, +-71, -179, -117, -227, -37, -31, 28, 138, 258, 301, 490, 361, 424, 505, 483, 206, +316, 235, -186, -266, 1, -462, -215, -55, -428, 251, -76, 162, 561, 172, 364, 340, +278, 367, 21, 31, 270, -249, -152, -255, -264, -166, -393, -40, 11, -76, 136, 254, +189, 381, 213, 312, -41, 81, -71, -271, -189, -422, -90, -426, 21, -278, -225, 189, +-202, 217, 200, 310, 205, -2, 248, 162, -85, 126, -59, -87, -150, -236, -104, -465, +-214, -327, -47, -85, 55, 224, 159, 301, 270, 419, 69, 268, 51, 94, 15, -131, +21, -260, 107, -81, -273, 25, -42, -1, 35, -106, 81, 179, 7, 76, 318, 12, +169, 276, -56, 241, -49, -16, 67, -44, -85, -132, -246, -12, -341, -131, 8, -199, +-29, 14, -83, 207, -5, 20, 267, -106, 218, 80, -22, 102, -138, -301, -275, -343, +-181, -305, -466, -154, -145, -12, 76, 60, 152, 118, 276, 97, -25, -22, -272, -76, +-209, -347, -84, -306, -133, -80, -220, 22, 47, -144, 226, -43, -24, 272, -203, 33, +77, -22, 98, -141, -40, -150, -102, 46, -365, 80, 52, 22, 170, 7, 185, -7, +154, 110, 87, 175, 52, 276, -85, 35, 117, -120, -123, 85, -68, 31, -25, -153, +213, 108, 16, 352, 4, 68, 162, -8, 220, -12, 78, 53, -206, -29, -163, -262, +-243, -124, -61, 131, -71, 156, 124, 165, 198, 158, 57, 117, 33, -24, 13, -89, +-29, -239, -248, -184, -250, -220, 21, -89, 258, 260, 149, 462, 330, 298, 298, 61, +112, -94, -171, -161, -232, -244, -148, -207, 162, -61, 50, 222, 117, 223, 427, 150, +292, 102, 241, 151, -84, 132, -8, -12, 177, -81, -122, 107, -59, -22, 84, -63, +303, 140, 79, 379, 147, 186, 215, 41, 71, 139, -39, 67, -180, 94, 75, -179, +7, 4, 81, 177, -53, 182, 94, 7, 50, 72, -30, 12, -94, -63, 39, -84, +-16, -26, -167, 26, -17, -133, 204, -160, -47, 79, -145, 52, -171, -103, -129, -72, +98, -186, 58, -63, -16, 186, -26, -7, -42, -107, -199, -160, -136, -136, -150, -129, +21, -52, 75, -67, 254, 41, -89, 107, -17, -30, 22, -121, 55, -71, -129, 135, +-66, -106, -63, 25, 42, -83, 49, -3, -97, 17, -21, 48, 135, -42, -24, 145, +-6, -52, 120, 8, -61, 15, -28, 46, -47, 6, -6, -171, -185, -88, -113, -108, +-11, -269, 114, -5, 70, -7, 28, 134, -35, 28, 52, -26, 4, -84, -133, -124, +-139, -159, -171, -84, -151, -55, -33, -110, 124, -122, 74, 228, 75, 98, 186, 30, +129, 71, -197, -31, -72, -144, -166, -87, -121, 17, -51, 85, 178, 80, 182, 104, +116, 59, 51, 70, 12, 108, 26, -68, 5, 25, -98, -123, -70, 31, -29, 208, +46, -3, 286, 87, 188, 40, 44, 168, 5, -19, -40, -75, 43, -33, -32, 72, +12, -28, 166, 144, 56, 98, 62, -1, 28, 4, -4, -23, -51, 12, -2, -68, +103, 21, -48, 222, 7, 12, 170, -59, 30, 33, -101, 32, -14, -40, 8, 17, +-38, 5, 5, 12, 103, 68, 77, 118, 140, 4, 5, 90, -117, 8, -84, -112, +52, -44, 24, 30, 188, 63, 37, 170, 42, 51, 12, 101, 84, -38, 0, 10, +-26, -30, 26, -37, -70, 4, 56, 44, -117, 25, 135, 52, 98, 104, 44, 138, +31, 102, -4, -120, -1, -99, -25, -203, 47, -42, -193, 40, -53, 94, 50, -24, +17, 49, 71, 133, -93, -20, -21, -25, -43, -132, -66, 30, -176, -51, -68, -150, +12, 4, -133, -12, 56, -40, 23, 43, -59, -7, -1, -29, -107, -79, -28, -28, +-55, -168, 47, 10, -181, 1, -88, 32, 39, -39, 111, -33, -17, 142, 42, -93, +51, -33, -136, -20, -116, -78, -51, -22, -40, 71, -38, 138, 56, -85, 197, -30, +-23, 124, -44, 12, -16, 63, -4, -124, 65, -42, -69, 5, -53, 48, 28, -16, +15, 4, -10, 61, 2, -1, 13, 34, 25, -7, 13, 47, -5, 15, -55, 12, +35, -38, 1, -51, 7, 34, -22, -38, -136, -7, 32, -48, 16, -10, 56, -16, +21, 8, -6, 11, 5, 3, 50, 68, 12, 2, 49, -24, -105, -16, 34, -113, +-35, 4, 32, 80, 22, 30, 213, 70, 129, 98, 30, 85, 93, 22, -3, -3, +57, -21, 40, 103, 2, 138, 84, 81, 129, 1, 163, 38, 8, 81, 30, 104, +5, 16, 173, -42, 65, 129, -81, 113, 81, 34, 48, -7, 120, 30, -2, 60, +16, 13, 30, 42, 3, 15, -7, -106, 2, 16, -13, 2, -19, 28, 8, -16, +26, -11, 7, 1, 5, 24, -31, 37, -33, 35, -60, -42, -47, -65, -89, -47, +6, -29, -23, -3, 76, -47, 31, 51, -59, 42, -35, -7, 10, -59, 6, 75, +-103, 1, -26, -55, 20, -15, -28, 37, 10, -7, 34, -16, -28, -14, 4, -21, +-13, 50, -6, -35, -34, 16, 3, 46, 12, -33, 39, -24, 23, -69, -86, -33, +-110, -1, -21, -77, 16, 2, 1, -2, 23, 43, -66, 12, -23, -52, 63, -67, +-35, -95, -80, 16, -111, -32, -5, -98, 67, -49, -33, 41, -72, -17, 23, -133, +13, -26, -53, 8, -89, 1, 33, -78, -15, 0, -59, 55, -26, -37, -1, -46, +-10, -94, -88, -67, 33, -59, -59, 42, 37, 60, 28, 6, 68, -49, 56, 1, +-49, -20, -7, -46, 23, -43, -58, 68, -58, 14, 30, -3, 34, 42, 89, 25, +77, 12, 41, 30, -21, 3, 42, -30, -3, -34, 25, 37, -53, 83, -19, 94, +102, -111, 162, -4, -42, 74, -49, 11, 20, -34, 87, 21, -41, 88, -8, -16, +98, -16, 6, 37, -47, 124, -39, -37, 87, -53, -5, 14, 4, 40, -38, 83, +-5, -12, 68, -29, 37, 38, -13, 77, 25, -8, 38, -34, -6, 19, -44, 6, +-3, 47, 46, 37, 69, 41, 32, 96, -28, 4, 10, 24, 84, -42, 32, 63, +-35, 20, -7, 8, 7, -8, 89, 28, 29, 166, 8, 46, 33, 2, 86, -15, +-48, 62, -57, 19, 32, -34, 51, 6, -13, 71, -29, 25, 68, 15, 48, -41, +41, 1, -37, 39, -22, -26, -1, -14, -4, 28, -61, -53, 14, -30, -24, 8, +-8, 5, 13, -33, 21, 4, -86, 22, -78, -12, -21, -80, -7, -3, -28, -74, +-31, 17, -51, -22, -28, -33, -13, -32, -37, 49, -49, 5, -15, -17, -1, -87, +-35, -24, -85, -103, 65, -33, -41, 26, -26, 77, -38, -7, 41, -31, 26, -5, +-72, 25, -97, 4, 38, -180, 24, -56, -31, 32, -58, 20, 51, -33, 34, 103, +-47, 42, 1, -63, 23, -90, -37, -32, -74, -65, -37, -22, -1, 1, 3, 14, +7, -1, 38, 19, -1, 10, -43, -2, -46, -30, -4, -56, 3, -15, -67, 38, +-40, 15, 14, -15, 14, 17, 4, 23, -4, 38, 2, -47, 19, 1, 8, 8, +-21, 44, -21, 21, 60, -12, 1, -22, 15, 30, 20, -47, 21, 37, 55, 35, +29, 65, 60, 5, 69, 13, -31, 59, -16, -13, 3, 4, 46, 1, 16, 42, +60, 56, 11, 48, 85, 20, 66, 55, 34, -12, 26, 7, -7, -1, -4, 11, +-34, 23, 68, 16, 47, 85, 31, 51, 12, 29, 42, 32, 19, -16, 19, -2, +-4, 5, -28, 21, 1, -29, 50, 15, 20, 21, -16, 38, 30, 42, 2, 14, +38, -8, 17, 17, -24, 1, -52, 15, -47, 8, 41, -16, -3, 15, 16, 48, +8, -3, 33, 10, 29, -8, 7, 12, -7, 12, -17, -2, 4, -40, -44, -12, +-33, 12, -1, 4, 25, 22, 57, -13, 7, 33, -24, -24, -4, -90, -23, -58, +-89, 25, -47, -29, 19, -48, 34, -3, -32, 49, -12, -13, 10, 1, -7, -46, +-49, -52, -75, -55, -76, -105, -26, -53, -24, -21, 13, -1, -3, -20, 28, -7, +2, -2, -57, 1, -81, -32, -38, -88, -47, -47, -68, -50, -46, -16, -8, -50, +37, 1, 7, 4, 4, 4, 3, 4, -17, -21, -23, -50, -65, -51, -38, -47, +-14, -22, 11, 2, 10, 1, 34, 10, 56, 3, -2, 49, -15, 21, 15, -32, +-8, -13, -41, -23, -22, -3, 11, 13, 30, 42, 13, 67, 77, -17, 53, 17, +-13, 51, -30, 12, -24, -32, 35, -49, -19, 39, 6, 12, -5, 67, 29, 17, +35, 42, 17, 43, -12, 10, 21, -67, 3, -16, -38, 13, -19, 16, 7, 19, +19, 63, 33, 40, 19, 44, 21, 4, 31, -12, -17, 26, -8, -10, 16, 35, +4, 1, 52, 15, 16, 38, 59, 29, 21, 52, 34, 31, 34, 41, 22, 25, +-3, 21, 1, 1, 14, 21, 56, 26, 14, 94, 33, 16, 42, 33, 26, 47, +39, 33, 16, 51, 8, 12, 30, -21, 24, -6, 2, 12, -5, 8, 2, 7, +51, 12, 20, 24, 22, 35, 5, 6, 7, -59, -10, -12, -44, -4, -62, 4, +-16, -7, 2, 1, -3, -8, 4, 15, -5, 12, -7, 3, 16, -68, -4, -38, +-32, -47, -69, -32, -46, -16, -4, -12, 11, 5, 4, 15, 8, 0, 12, -31, +12, -2, -59, -39, -31, -63, 19, -33, -39, 4, 1, -7, 7, 7, 1, 25, +31, 5, -5, 44, 2, -8, -15, -52, 12, -62, -40, 12, -25, 16, -3, -21, +21, -22, 5, 1, -2, 11, -4, 8, -6, -19, 6, -29, -24, -17, -48, -42, +-41, -40, -38, -48, -26, -43, 21, 7, -21, 15, -3, 12, -2, -12, -32, -48, +-38, -43, -68, -26, -51, -40, -29, -10, 5, -12, 3, 7, 1, 11, 17, 12, +7, 2, -4, -37, -3, -22, -41, -23, -32, 1, -1, 5, 4, 4, 4, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 2, -16, 55, -134, 279, -1965, 1994, -4443, -535, -5056, -6492, 3840, -13689, 549, -1571, +-11668, 7854, -15291, 1791, -11658, -4058, 4814, -8160, 8455, -5876, 11280, 9616, 65, 12469, 6218, 13923, +13583, 13937, 18724, 15728, 19706, 19018, 18432, 18961, 16014, 15187, 10830, 6627, 4461, -2233, -5396, -10262, +-13064, -18344, -24068, -25202, -31251, -30379, -29400, -30522, -28660, -29212, -23692, -20773, -15737, -10638, -6627, 1655, +6822, 12127, 16113, 20341, 24206, 25735, 26950, 27434, 25296, 23447, 21957, 17713, 13313, 8891, 4243, 1088, +-2390, -5536, -8698, -11385, -12063, -12839, -13428, -13906, -13699, -13111, -13036, -12425, -12570, -10452, -8116, -6276, +-4040, -2653, 1281, 5096, 7424, 9681, 11620, 13139, 13815, 14860, 14746, 14519, 13740, 13462, 12577, 10178, +7816, 4126, 497, -3163, -6560, -10796, -13387, -16938, -19329, -20233, -21902, -20652, -19679, -17365, -13779, -10238, +-6738, -1973, 1722, 5388, 10125, 13271, 18067, 20115, 21807, 21538, 19695, 18787, 16651, 15575, 12657, 10592, +7190, 3518, 675, -3855, -6402, -9574, -11839, -14387, -16612, -17971, -19793, -19337, -18884, -16890, -14553, -13297, +-10537, -9313, -7515, -4994, -2967, 328, 2781, 5915, 8775, 10902, 13641, 15965, 18011, 19645, 20923, 21880, +21510, 20301, 17680, 13951, 10871, 7447, 3665, -575, -5214, -9269, -13922, -17196, -19973, -23105, -23416, -24380, +-23943, -22233, -21264, -18446, -15003, -11498, -7461, -3996, -506, 3230, 6758, 10187, 13275, 16976, 18736, 20269, +21075, 20430, 20067, 18213, 16651, 15290, 13188, 10888, 8523, 5803, 2973, 346, -2376, -4635, -7167, -9401, +-11874, -14608, -16235, -18086, -19233, -20061, -20141, -18973, -17680, -15231, -12863, -9911, -6284, -2411, 1481, 5633, +8684, 11789, 14618, 15951, 17373, 17433, 18065, 17236, 15937, 14667, 12241, 10027, 6716, 3736, 323, -2965, +-5651, -8281, -10159, -11699, -12951, -13452, -13069, -12541, -10792, -9332, -6880, -4598, -2740, -206, 1081, 2454, +3613, 4240, 4966, 5595, 5742, 5977, 6421, 6569, 7278, 7022, 6983, 6366, 5590, 4882, 3386, 2527, +1075, -617, -2241, -4140, -5747, -7354, -9152, -9977, -11128, -11209, -10563, -10633, -9404, -8674, -7133, -4781, +-2458, 733, 3079, 6133, 9009, 11540, 13993, 16045, 17240, 17817, 18372, 16992, 15076, 12521, 9254, 5916, +2727, -595, -3941, -7039, -10042, -12573, -15087, -16222, -17310, -17722, -17714, -17364, -16323, -15547, -13652, -11857, +-9557, -6977, -3842, -835, 2092, 5195, 7146, 10209, 11632, 13287, 15457, 15730, 17635, 17750, 17782, 17945, +16869, 16380, 14185, 12259, 9576, 6305, 3182, -611, -3752, -7298, -10177, -13026, -15518, -17657, -19513, -20580, +-20639, -20110, -18886, -16949, -14215, -11169, -7713, -4070, -684, 2595, 5612, 8336, 10912, 13074, 14465, 15546, +16223, 16056, 15717, 14729, 13119, 11421, 9128, 7144, 4830, 2473, 732, -1780, -3589, -4822, -6239, -7211, +-8076, -8794, -9251, -9668, -9615, -9775, -9722, -9532, -9039, -7968, -6707, -5245, -3371, -1426, 234, 2178, +4078, 5774, 7204, 8338, 9314, 9991, 10246, 9755, 9245, 7853, 6463, 4926, 2854, 1039, -1398, -3244, +-5100, -6916, -7714, -8670, -9060, -8784, -8672, -7848, -6502, -5205, -3404, -1426, 554, 2831, 5061, 6598, +7724, 8506, 8728, 8765, 8518, 8025, 7226, 6051, 4950, 3613, 2164, 1020, -768, -1894, -3467, -4589, +-5722, -6831, -7177, -8052, -8474, -8828, -8963, -8861, -8832, -8517, -7719, -6448, -5187, -3803, -2376, -409, +1264, 3022, 5023, 6513, 8338, 9739, 10931, 12221, 12760, 13062, 13123, 12669, 11797, 10568, 8674, 6430, +3768, 779, -2033, -4926, -7589, -10001, -12223, -13958, -15044, -15752, -15628, -15113, -14145, -12507, -10995, -8617, +-6770, -4456, -1917, -149, 2633, 4462, 6545, 8387, 9712, 10954, 11634, 12348, 12449, 12469, 12245, 11474, +10733, 9605, 8136, 6528, 4699, 2771, 868, -902, -2529, -4242, -5934, -7180, -8501, -9547, -10424, -11141, +-11637, -11818, -11456, -10748, -9518, -8135, -6264, -4016, -1748, 738, 2744, 4669, 6418, 7550, 8554, 9173, +9409, 9202, 8693, 7976, 7010, 5983, 4669, 3471, 1955, 506, -618, -1951, -3001, -4074, -4869, -5359, +-5542, -5397, -5204, -4795, -4254, -3348, -2764, -1501, -658, -230, 735, 1131, 1629, 2101, 2393, 2668, +2964, 2977, 3096, 3137, 2979, 2673, 2368, 2115, 1545, 1033, 210, -563, -1364, -2449, -3302, -4499, +-5166, -5785, -6242, -6192, -6157, -5571, -4776, -3782, -2614, -1297, 47, 1446, 3105, 4554, 6060, 7395, +8605, 9567, 10086, 10161, 9870, 9168, 8295, 7025, 5512, 3847, 1860, 149, -1901, -3647, -5391, -6947, +-8105, -9264, -9572, -10037, -10015, -9774, -9619, -8624, -7967, -6913, -5766, -4494, -3032, -1664, -30, 1238, +2701, 4099, 5354, 6664, 7737, 8643, 9262, 9552, 9855, 9810, 9609, 9015, 8043, 7108, 5789, 4247, +2757, 730, -1053, -2739, -4688, -6070, -7541, -8901, -9807, -10422, -10709, -10715, -10172, -9358, -8330, -6879, +-5368, -3731, -1942, -35, 1642, 3166, 4705, 5905, 6987, 7795, 8367, 8543, 8348, 8025, 7526, 6663, +5876, 4945, 3729, 2856, 1683, 685, -428, -1629, -2565, -3571, -4089, -4519, -4796, -4873, -4911, -4938, +-4637, -4452, -4113, -3750, -3428, -2662, -2067, -1257, -333, 535, 1495, 2343, 3017, 3671, 3943, 3996, +4014, 3684, 3487, 2814, 2122, 1409, 369, -417, -1493, -2376, -2991, -3677, -3949, -4195, -4200, -4022, +-3681, -3173, -2363, -1540, -700, 330, 1320, 2323, 3290, 4133, 4776, 5417, 5882, 6011, 5895, 5551, +4982, 4340, 3467, 2424, 1344, 173, -917, -1862, -2825, -3646, -4353, -4853, -5328, -5631, -5973, -6132, +-6147, -6159, -5949, -5612, -5054, -4306, -3341, -2267, -975, 241, 1559, 2854, 3961, 5085, 6158, 7044, +7730, 8087, 8380, 8508, 8152, 7635, 6775, 5832, 4747, 3336, 2088, 446, -971, -2567, -4170, -5470, +-6881, -7834, -8745, -9319, -9609, -9458, -8966, -8168, -7173, -6043, -4659, -3273, -1853, -511, 841, 2119, +3327, 4359, 5281, 5985, 6625, 7042, 7287, 7461, 7274, 7102, 6678, 5995, 5232, 4354, 3312, 2318, +1184, -45, -1040, -2351, -3232, -4070, -4917, -5294, -5840, -6147, -6210, -6247, -6079, -5687, -5081, -4292, +-3405, -2411, -1258, -442, 604, 1630, 2444, 3350, 3915, 4456, 4757, 4713, 4746, 4282, 3769, 3157, +2343, 1712, 748, 107, -539, -1199, -1630, -2182, -2420, -2710, -2745, -2676, -2555, -2088, -1842, -1241, +-719, -249, 298, 681, 1151, 1430, 1802, 1911, 2073, 2293, 2082, 2129, 1883, 1688, 1465, 1015, +598, 21, -512, -1167, -1674, -2322, -2866, -3197, -3689, -3895, -4060, -4204, -4078, -3929, -3530, -3023, +-2439, -1671, -942, -30, 927, 1886, 2862, 3806, 4817, 5461, 6063, 6544, 6705, 6804, 6555, 6096, +5513, 4626, 3647, 2527, 1406, 69, -1300, -2454, -3792, -4777, -5668, -6429, -6866, -7180, -7146, -7107, +-6773, -6326, -5750, -5022, -4286, -3395, -2377, -1297, -248, 846, 2032, 3093, 4050, 4897, 5626, 6213, +6521, 6833, 6858, 6681, 6527, 5999, 5457, 4703, 3813, 2885, 1732, 694, -457, -1491, -2489, -3503, +-4423, -5245, -5949, -6459, -6683, -6894, -6769, -6371, -5829, -5028, -4133, -3084, -1955, -786, 303, 1373, +2289, 3129, 3820, 4238, 4605, 4674, 4822, 4628, 4381, 4078, 3627, 3124, 2592, 2144, 1450, 879, +215, -280, -820, -1288, -1630, -2025, -2163, -2352, -2320, -2167, -1993, -1753, -1586, -1232, -991, -782, +-400, -215, 123, 400, 565, 776, 883, 1082, 1200, 1282, 1295, 1218, 1091, 844, 515, 102, +-379, -835, -1451, -1852, -2289, -2595, -2730, -2815, -2579, -2476, -2022, -1612, -1053, -409, 152, 883, +1515, 2196, 2839, 3414, 3781, 4177, 4267, 4399, 4247, 3947, 3729, 3130, 2672, 1805, 1050, 191, +-818, -1535, -2483, -3210, -3905, -4513, -4865, -5173, -5253, -5174, -5058, -4703, -4341, -3881, -3312, -2706, +-1964, -1301, -364, 403, 1276, 2217, 2934, 3904, 4490, 5231, 5795, 6189, 6439, 6361, 6268, 5818, +5326, 4616, 3825, 2832, 1751, 645, -526, -1640, -2786, -3821, -4778, -5575, -6167, -6567, -6767, -6807, +-6561, -6218, -5638, -4974, -4170, -3158, -2260, -1194, -262, 720, 1674, 2539, 3381, 4032, 4482, 4822, +5044, 5019, 4988, 4741, 4398, 4041, 3534, 3055, 2534, 1882, 1237, 555, -84, -662, -1295, -1865, +-2359, -2823, -3185, -3438, -3622, -3692, -3658, -3508, -3225, -2917, -2383, -1858, -1254, -583, 15, 651, +1184, 1665, 2081, 2356, 2574, 2634, 2580, 2374, 2139, 1821, 1373, 976, 525, 91, -287, -710, +-1005, -1242, -1479, -1542, -1586, -1456, -1271, -1015, -554, -241, 143, 588, 943, 1283, 1519, 1761, +1823, 1840, 1771, 1602, 1464, 1131, 937, 559, 192, -78, -548, -752, -1115, -1424, -1644, -1956, +-2199, -2468, -2654, -2813, -2982, -2988, -2954, -2834, -2561, -2216, -1776, -1251, -612, 44, 774, 1532, +2248, 2979, 3604, 4114, 4511, 4875, 5013, 5035, 4946, 4544, 4216, 3588, 2900, 2150, 1195, 280, +-697, -1581, -2563, -3365, -4101, -4761, -5144, -5522, -5544, -5543, -5286, -4834, -4431, -3694, -3083, -2342, +-1504, -852, -2, 658, 1355, 2102, 2625, 3234, 3729, 4146, 4563, 4749, 4941, 4948, 4792, 4584, +4164, 3714, 3067, 2387, 1664, 805, 90, -757, -1545, -2267, -2998, -3549, -4107, -4470, -4710, -4902, +-4805, -4685, -4383, -3935, -3396, -2692, -2022, -1239, -446, 293, 1058, 1678, 2250, 2650, 2958, 3182, +3190, 3119, 2900, 2625, 2280, 1877, 1552, 1147, 800, 514, 215, 50, -196, -374, -490, -701, +-720, -850, -859, -889, -881, -801, -810, -672, -650, -488, -361, -244, -45, 45, 211, 352, +497, 569, 658, 660, 626, 579, 447, 272, 16, -215, -527, -801, -1106, -1348, -1598, -1795, +-1878, -1933, -1892, -1751, -1493, -1179, -758, -216, 250, 861, 1424, 1907, 2449, 2808, 3113, 3366, +3399, 3366, 3241, 2929, 2624, 2160, 1649, 1102, 469, -84, -713, -1280, -1814, -2319, -2691, -3067, +-3307, -3496, -3608, -3603, -3564, -3420, -3205, -2940, -2560, -2158, -1702, -1161, -599, 17, 594, 1237, +1865, 2436, 3002, 3488, 3942, 4232, 4481, 4576, 4567, 4504, 4179, 3817, 3297, 2659, 1988, 1159, +320, -503, -1343, -2138, -2866, -3486, -3967, -4315, -4560, -4611, -4513, -4313, -3932, -3457, -2867, -2259, +-1626, -932, -389, 263, 781, 1208, 1702, 1965, 2277, 2519, 2638, 2749, 2718, 2742, 2715, 2582, +2449, 2212, 1931, 1674, 1334, 951, 580, 152, -249, -670, -1068, -1423, -1719, -1991, -2231, -2308, +-2390, -2342, -2269, -2062, -1820, -1552, -1152, -826, -390, 21, 346, 729, 973, 1190, 1315, 1382, +1343, 1244, 1087, 768, 554, 216, -35, -288, -559, -699, -845, -791, -787, -697, -531, -338, +-80, 146, 380, 588, 844, 952, 1144, 1267, 1300, 1365, 1314, 1281, 1175, 1024, 883, 661, +444, 181, -62, -317, -602, -795, -1031, -1229, -1430, -1607, -1746, -1902, -1995, -2112, -2158, -2169, +-2153, -2039, -1922, -1723, -1484, -1141, -704, -245, 309, 875, 1466, 2043, 2548, 3033, 3420, 3711, +3840, 3888, 3786, 3530, 3220, 2730, 2144, 1519, 869, 200, -447, -1113, -1723, -2246, -2673, -3069, +-3299, -3486, -3558, -3515, -3433, -3183, -2954, -2594, -2241, -1857, -1398, -976, -520, -98, 355, 760, +1237, 1582, 1998, 2348, 2596, 2919, 3043, 3191, 3249, 3263, 3144, 2951, 2673, 2319, 1901, 1368, +859, 249, -307, -892, -1466, -1930, -2378, -2672, -2907, -3050, -3038, -2969, -2798, -2541, -2202, -1863, +-1397, -951, -548, -37, 302, 655, 898, 1087, 1281, 1310, 1378, 1321, 1257, 1199, 1068, 980, +850, 730, 617, 537, 438, 359, 299, 220, 185, 157, 108, 65, 26, 8, -79, -137, +-171, -236, -264, -299, -336, -341, -273, -238, -170, -57, -20, 94, 133, 181, 201, 115, +84, -18, -160, -347, -560, -776, -1043, -1184, -1377, -1480, -1515, -1530, -1370, -1244, -932, -611, +-263, 212, 613, 1068, 1475, 1806, 2110, 2328, 2442, 2526, 2456, 2376, 2201, 1973, 1669, 1277, +927, 463, 89, -292, -699, -1006, -1383, -1637, -1869, -2082, -2207, -2382, -2378, -2426, -2397, -2325, +-2270, -2056, -1970, -1676, -1452, -1185, -774, -462, 21, 434, 908, 1402, 1844, 2303, 2658, 2963, +3186, 3322, 3336, 3236, 3076, 2775, 2420, 1941, 1441, 893, 284, -236, -822, -1332, -1746, -2149, +-2436, -2669, -2814, -2841, -2803, -2671, -2454, -2192, -1932, -1590, -1233, -873, -491, -171, 161, 423, +676, 892, 1034, 1224, 1315, 1427, 1530, 1572, 1640, 1654, 1655, 1611, 1567, 1514, 1378, 1223, +1000, 763, 502, 176, -122, -434, -760, -1007, -1217, -1416, -1493, -1540, -1533, -1421, -1307, -1104, +-886, -651, -420, -209, 46, 190, 364, 440, 490, 464, 376, 336, 137, 62, -97, -231, +-312, -433, -437, -469, -423, -321, -209, -39, 147, 355, 536, 714, 907, 1036, 1150, 1201, +1224, 1196, 1128, 1067, 922, 811, 663, 510, 398, 223, 120, -6, -113, -217, -352, -467, +-647, -778, -949, -1111, -1285, -1419, -1545, -1678, -1724, -1800, -1767, -1731, -1627, -1433, -1252, -908, +-588, -195, 234, 686, 1126, 1515, 1945, 2230, 2488, 2667, 2727, 2735, 2630, 2455, 2223, 1872, +1500, 1108, 632, 186, -264, -680, -1073, -1413, -1689, -1910, -2062, -2184, -2198, -2235, -2158, -2070, +-1961, -1785, -1687, -1469, -1290, -1058, -816, -603, -308, -42, 239, 526, 837, 1141, 1438, 1698, +1946, 2143, 2260, 2377, 2343, 2304, 2154, 1911, 1673, 1298, 939, 521, 84, -284, -705, -1034, +-1349, -1574, -1724, -1836, -1824, -1790, -1693, -1552, -1358, -1150, -912, -653, -476, -251, -114, 40, +146, 181, 249, 257, 254, 272, 254, 245, 294, 277, 352, 408, 434, 534, 551, 636, +672, 674, 697, 646, 627, 525, 433, 313, 205, 128, 8, -32, -123, -142, -186, -185, +-156, -142, -88, -80, -23, -34, 1, -21, -91, -146, -267, -369, -526, -686, -823, -981, +-1086, -1196, -1243, -1237, -1203, -1079, -944, -733, -474, -186, 152, 451, 801, 1109, 1377, 1636, +1795, 1911, 1978, 1946, 1876, 1739, 1544, 1334, 1087, 841, 579, 326, 61, -156, -376, -607, +-762, -957, -1098, -1249, -1372, -1489, -1601, -1645, -1724, -1733, -1732, -1683, -1620, -1499, -1336, -1147, +-890, -624, -250, 79, 452, 847, 1194, 1582, 1845, 2117, 2294, 2393, 2436, 2357, 2241, 2023, +1761, 1432, 1087, 694, 296, -81, -443, -744, -1046, -1247, -1417, -1542, -1581, -1601, -1555, -1514, +-1436, -1329, -1228, -1092, -971, -826, -703, -564, -418, -288, -122, 3, 144, 336, 452, 632, +787, 902, 1063, 1150, 1235, 1310, 1296, 1305, 1244, 1147, 1024, 836, 655, 438, 212, -11, +-210, -408, -565, -687, -777, -802, -813, -768, -690, -602, -505, -389, -282, -209, -123, -71, +-68, -83, -127, -195, -278, -365, -456, -530, -594, -619, -611, -593, -514, -438, -307, -168, +-16, 166, 330, 520, 640, 800, 913, 966, 1038, 1024, 1019, 962, 888, 807, 701, 606, +497, 406, 314, 229, 152, 71, 2, -84, -171, -296, -413, -549, -699, -836, -1024, -1176, +-1314, -1431, -1505, -1564, -1538, -1494, -1380, -1203, -985, -703, -404, -70, 254, 617, 932, 1230, +1489, 1683, 1863, 1922, 1969, 1928, 1830, 1690, 1509, 1271, 1023, 772, 476, 239, -31, -255, +-480, -672, -820, -995, -1081, -1209, -1280, -1311, -1385, -1383, -1402, -1367, -1321, -1283, -1184, -1093, +-960, -813, -627, -408, -158, 103, 356, 643, 894, 1149, 1348, 1520, 1640, 1694, 1736, 1665, +1579, 1427, 1223, 1018, 748, 515, 229, -15, -233, -476, -616, -784, -859, -897, -934, -897, +-874, -806, -743, -651, -582, -505, -434, -403, -335, -320, -298, -279, -283, -248, -240, -195, +-153, -114, -31, 27, 147, 249, 350, 477, 543, 632, 686, 695, 709, 671, 631, 553, +495, 385, 286, 216, 123, 84, 39, 12, 21, 27, 26, 60, 75, 84, 84, 39, +11, -71, -181, -296, -442, -570, -726, -860, -970, -1068, -1130, -1147, -1133, -1083, -971, -849, +-671, -467, -244, -15, 219, 487, 684, 909, 1078, 1198, 1316, 1338, 1354, 1330, 1259, 1179, +1063, 918, 777, 632, 490, 335, 206, 68, -45, -186, -312, -452, -622, -728, -900, -1015, +-1126, -1251, -1331, -1421, -1451, -1448, -1407, -1311, -1180, -1004, -787, -544, -279, -8, 269, 553, +822, 1052, 1263, 1424, 1533, 1608, 1611, 1579, 1491, 1368, 1191, 992, 781, 540, 326, 88, +-98, -287, -466, -568, -699, -753, -822, -864, -859, -883, -864, -855, -850, -842, -820, -806, +-777, -720, -663, -587, -501, -383, -255, -102, 55, 215, 399, 546, 692, 806, 897, 968, +986, 982, 956, 889, 803, 692, 560, 434, 287, 180, 62, -40, -120, -182, -223, -244, +-231, -225, -183, -157, -127, -112, -105, -107, -142, -165, -233, -293, -367, -462, -532, -613, +-670, -705, -720, -690, -633, -568, -449, -331, -190, -31, 79, 244, 372, 472, 583, 653, +703, 739, 748, 754, 743, 720, 682, 657, 617, 569, 540, 491, 433, 384, 326, 244, +157, 65, -44, -165, -296, -447, -603, -757, -888, -1023, -1130, -1208, -1247, -1269, -1234, -1155, +-1058, -890, -721, -493, -263, -20, 235, 466, 706, 897, 1082, 1210, 1291, 1354, 1353, 1326, +1262, 1157, 1043, 897, 758, 611, 452, 317, 161, 35, -90, -229, -340, -476, -574, -675, +-784, -864, -951, -1011, -1073, -1112, -1120, -1125, -1078, -1026, -924, -786, -655, -459, -288, -80, +122, 313, 525, 680, 855, 972, 1053, 1113, 1125, 1107, 1041, 952, 840, 709, 559, 404, +254, 110, -5, -100, -195, -254, -294, -333, -331, -350, -347, -342, -361, -355, -386, -404, +-440, -464, -486, -522, -531, -546, -525, -510, -451, -396, -335, -234, -141, -26, 55, 165, +248, 336, 409, 453, 496, 506, 521, 503, 497, 467, 417, 399, 354, 320, 302, 274, +265, 251, 253, 244, 233, 221, 202, 166, 108, 44, -30, -142, -244, -365, -507, -612, +-744, -835, -915, -966, -985, -986, -931, -864, -747, -623, -462, -306, -124, 46, 202, 384, +506, 648, 747, 827, 893, 909, 942, 937, 908, 881, 816, 769, 699, 607, 537, 427, +360, 250, 142, 42, -81, -196, -337, -459, -603, -729, -840, -955, -1038, -1104, -1135, -1131, +-1102, -1038, -942, -806, -640, -461, -253, -42, 153, 366, 545, 716, 859, 961, 1036, 1073, +1073, 1048, 986, 904, 820, 699, 604, 482, 370, 275, 156, 74, -16, -97, -176, -243, +-318, -384, -449, -507, -565, -629, -663, -720, -737, -753, -748, -728, -690, -622, -564, -444, +-346, -230, -89, 26, 152, 262, 370, 459, 525, 580, 607, 622, 607, 587, 544, 491, +437, 374, 313, 251, 210, 167, 134, 117, 102, 95, 90, 81, 66, 55, 26, -6, +-44, -99, -175, -244, -323, -410, -463, -544, -598, -629, -661, -643, -642, -598, -539, -469, +-370, -278, -163, -57, 31, 144, 226, 309, 381, 438, 487, 517, 553, 564, 575, 566, +570, 550, 540, 527, 503, 481, 438, 409, 355, 275, 206, 114, 3, -100, -238, -375, +-511, -652, -762, -880, -955, -1010, -1043, -1020, -996, -904, -815, -685, -530, -375, -192, -31, +128, 291, 425, 553, 650, 733, 801, 831, 845, 847, 825, 801, 764, 706, 651, 575, +509, 420, 335, 248, 142, 59, -44, -146, -258, -364, -456, -565, -647, -721, -792, -829, +-863, -865, -849, -807, -737, -651, -544, -424, -287, -136, -5, 136, 270, 375, 486, 570, +631, 674, 680, 686, 650, 622, 578, 510, 467, 390, 340, 283, 219, 178, 124, 79, +46, 11, -23, -55, -105, -134, -177, -236, -268, -326, -366, -405, -454, -476, -511, -510, +-507, -497, -461, -428, -350, -293, -217, -119, -52, 28, 104, 176, 234, 292, 326, 348, +367, 366, 364, 351, 359, 346, 354, 355, 361, 369, 375, 386, 375, 385, 356, 323, +286, 214, 139, 54, -35, -146, -260, -369, -471, -566, -641, -709, -755, -772, -777, -753, +-708, -647, -561, -466, -367, -250, -142, -27, 73, 176, 269, 357, 432, 496, 558, 585, +633, 633, 646, 647, 634, 622, 588, 564, 503, 458, 389, 312, 230, 119, 26, -80, +-206, -312, -438, -554, -643, -735, -788, -835, -859, -847, -829, -768, -709, -618, -505, -393, +-263, -137, -1, 105, 235, 342, 427, 517, 569, 612, 646, 643, 652, 624, 588, 559, +495, 452, 384, 333, 273, 205, 162, 89, 36, -13, -71, -137, -202, -260, -340, -393, +-454, -514, -550, -593, -607, -616, -597, -556, -515, -440, -365, -273, -186, -93, -1, 65, +153, 206, 267, 306, 320, 350, 350, 347, 347, 326, 327, 314, 309, 297, 291, 294, +280, 292, 265, 270, 245, 212, 195, 131, 103, 30, -16, -73, -170, -219, -297, -361, +-413, -473, -507, -535, -539, -526, -510, -478, -423, -374, -304, -229, -163, -86, -10, 3, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -2920, -3421, -1651, -4909, -3546, -3872, -7293, -9890, -2998, -9837, -6988, -7525, -10995, -4157, -8728, +-5212, -2730, -2638, 2988, -383, 2231, 2172, 2701, 4418, 5014, 5277, 6111, 7282, 6565, 9484, 8785, +10347, 10723, 11446, 12293, 13012, 13719, 14494, 14928, 15445, 15320, 15255, 15281, 14990, 14986, 14994, 14531, +14253, 13646, 13027, 12223, 11348, 10086, 8535, 7361, 5660, 4205, 2033, -8, -1920, -4087, -6488, -8997, +-11801, -14284, -17210, -20071, -22804, -25023, -26955, -28751, -30685, -30599, -29862, -29875, -29221, -28978, -28534, -28256, +-27791, -27521, -27114, -26775, -24523, -22391, -20268, -17512, -15491, -12819, -10627, -7725, -5093, -2469, 517, 3224, +5862, 8368, 11044, 13425, 15691, 17948, 19752, 21563, 23562, 24819, 26290, 27414, 28630, 29924, 29597, 29153, +28932, 28445, 28113, 27755, 27429, 27022, 26711, 26380, 26004, 25698, 25135, 22578, 20453, 17671, 15073, 12449, +8985, 6599, 2783, 142, -3081, -6023, -8494, -10946, -13506, -15413, -17321, -19213, -20409, -22398, -23448, -24579, +-25617, -26189, -27006, -27061, -27274, -27224, -26949, -26701, -26317, -25916, -25310, -24521, -24044, -22939, -22148, -21117, +-20086, -19189, -17733, -16710, -15067, -13080, -11177, -8920, -6290, -3527, -490, 2572, 5556, 8543, 11581, 14505, +17302, 19913, 22384, 24649, 26687, 28271, 29819, 30190, 29523, 29382, 28881, 28547, 28171, 27839, 27442, 27119, +26775, 26448, 25559, 23266, 21360, 19033, 16720, 14269, 11867, 9375, 6915, 4713, 2170, 95, -2197, -4064, +-6140, -8243, -10041, -11888, -13880, -15669, -17716, -19385, -21251, -23070, -24257, -25593, -26945, -27806, -28485, -29104, +-29136, -28573, -28319, -27932, -27527, -27229, -26836, -25601, -24049, -22355, -20256, -18110, -15480, -12925, -9943, -7061, +-4123, -815, 2231, 4960, 7948, 10293, 12901, 15043, 16808, 18805, 20162, 21432, 22751, 23450, 24045, 24786, +25192, 25406, 25512, 25512, 25543, 25227, 24971, 24514, 23783, 23206, 22203, 21234, 20195, 18692, 17501, 15887, +14297, 12838, 10902, 9265, 7361, 5281, 3484, 1302, -931, -3042, -5357, -7635, -9780, -11947, -13967, -15994, +-17652, -19356, -20825, -21936, -23190, -24046, -24748, -25476, -25779, -25922, -26160, -25780, -25412, -24688, -24065, -22896, +-21936, -20482, -19158, -17414, -15640, -14082, -11923, -9918, -8001, -5917, -3919, -1881, 356, 2320, 4482, 6564, +8484, 10789, 12514, 14341, 16176, 17791, 19231, 20571, 21894, 22678, 23807, 24475, 25033, 25470, 25678, 25764, +25644, 25459, 24936, 24472, 23646, 22653, 21567, 20385, 18930, 17240, 15517, 13574, 11509, 9333, 6940, 4762, +2228, -223, -2556, -5160, -7407, -9775, -11917, -14050, -16036, -17884, -19497, -21087, -22418, -23605, -24529, -25277, +-25929, -25958, -26095, -25717, -25120, -24489, -23345, -22298, -20893, -19425, -17927, -16168, -14383, -12550, -10745, -8815, +-6910, -4995, -3125, -1233, 566, 2403, 4148, 5717, 7359, 8839, 10183, 11399, 12589, 13536, 14603, 15428, +16181, 17026, 17682, 18186, 18792, 19397, 19637, 20091, 20212, 20331, 20409, 20201, 20104, 19564, 18974, 18155, +17197, 16104, 14739, 13322, 11726, 9993, 8236, 6428, 4346, 2562, 595, -1368, -3329, -5364, -7030, -8970, +-10589, -12161, -13597, -14974, -16159, -17231, -18098, -18886, -19589, -19896, -20453, -20587, -20613, -20734, -20537, -20479, +-20248, -19875, -19614, -19091, -18447, -17792, -16876, -15888, -14699, -13347, -11927, -10301, -8631, -6759, -4800, -2813, +-585, 1545, 3838, 6091, 8292, 10488, 12528, 14575, 16446, 18165, 19707, 21048, 22117, 23002, 23646, 23996, +24098, 23939, 23511, 22953, 22024, 21161, 19894, 18537, 17129, 15489, 13973, 12150, 10482, 8694, 6952, 5233, +3515, 1848, 215, -1301, -2817, -4316, -5718, -7011, -8300, -9421, -10647, -11598, -12630, -13536, -14318, -15115, +-15761, -16318, -16876, -17245, -17525, -17787, -17914, -17866, -17729, -17496, -17060, -16459, -15903, -14972, -14021, -12996, +-11777, -10502, -9203, -7733, -6286, -4765, -3161, -1600, 62, 1639, 3211, 4674, 6091, 7434, 8682, 9851, +10805, 11751, 12550, 13128, 13803, 14225, 14620, 14971, 15207, 15416, 15475, 15610, 15597, 15591, 15335, 15166, +14807, 14354, 13813, 13196, 12493, 11652, 10691, 9755, 8684, 7417, 6264, 4948, 3481, 2042, 598, -1024, +-2558, -4094, -5713, -7235, -8747, -10192, -11532, -12876, -14026, -15074, -16043, -16866, -17516, -17951, -18281, -18508, +-18360, -18247, -17887, -17380, -16774, -15953, -15053, -14079, -12912, -11752, -10502, -9062, -7661, -6162, -4563, -3028, +-1346, 328, 1744, 3518, 4957, 6496, 7897, 9225, 10410, 11457, 12475, 13250, 14030, 14567, 15033, 15378, +15539, 15594, 15527, 15295, 14976, 14520, 13966, 13340, 12602, 11748, 10903, 10036, 9024, 8093, 7017, 6018, +4966, 3875, 2838, 1717, 690, -408, -1461, -2539, -3496, -4538, -5450, -6308, -7206, -7985, -8684, -9368, +-9947, -10570, -11029, -11394, -11810, -12053, -12208, -12260, -12313, -12168, -12059, -11751, -11428, -11046, -10468, -9954, +-9313, -8564, -7932, -7089, -6217, -5392, -4475, -3550, -2671, -1707, -802, 86, 1031, 1886, 2825, 3699, +4572, 5450, 6261, 7129, 7890, 8750, 9430, 10098, 10738, 11341, 11829, 12236, 12542, 12815, 12977, 13042, +13030, 12900, 12649, 12300, 11868, 11268, 10570, 9705, 8790, 7696, 6523, 5274, 3934, 2556, 1138, -254, +-1684, -3086, -4427, -5707, -6939, -8039, -9114, -10003, -10794, -11481, -11970, -12382, -12655, -12750, -12739, -12610, +-12398, -12058, -11612, -11127, -10539, -9928, -9238, -8490, -7800, -6982, -6221, -5374, -4554, -3765, -2906, -2052, +-1220, -425, 413, 1242, 2041, 2832, 3621, 4409, 5134, 5925, 6620, 7282, 7913, 8442, 8955, 9363, +9695, 9959, 10119, 10231, 10220, 10134, 9983, 9744, 9421, 9014, 8534, 8020, 7384, 6750, 6043, 5311, +4543, 3760, 2988, 2188, 1428, 684, -40, -735, -1438, -2043, -2684, -3299, -3842, -4433, -4930, -5471, +-5941, -6420, -6856, -7264, -7652, -8035, -8312, -8554, -8857, -9007, -9164, -9223, -9237, -9175, -9089, -8871, +-8539, -8205, -7797, -7224, -6687, -6004, -5345, -4521, -3731, -2906, -1974, -1133, -124, 759, 1716, 2660, +3561, 4423, 5243, 6035, 6726, 7381, 7922, 8418, 8845, 9179, 9391, 9580, 9669, 9697, 9662, 9526, +9296, 9121, 8747, 8348, 7888, 7399, 6823, 6155, 5490, 4753, 4020, 3207, 2437, 1579, 749, -70, +-931, -1746, -2595, -3406, -4089, -4889, -5500, -6147, -6743, -7206, -7657, -8045, -8350, -8587, -8763, -8869, +-8906, -8814, -8677, -8500, -8195, -7900, -7465, -7007, -6494, -5931, -5359, -4703, -4065, -3367, -2701, -1962, +-1254, -575, 128, 810, 1481, 2174, 2795, 3404, 3990, 4516, 4995, 5473, 5822, 6193, 6506, 6712, +6943, 7085, 7156, 7247, 7242, 7187, 7046, 6923, 6714, 6416, 6130, 5780, 5417, 4985, 4579, 4138, +3673, 3176, 2698, 2185, 1695, 1165, 650, 149, -413, -897, -1430, -1945, -2478, -2945, -3453, -3939, +-4393, -4835, -5237, -5645, -6006, -6357, -6646, -6918, -7114, -7284, -7434, -7462, -7467, -7407, -7242, -7075, +-6755, -6420, -6047, -5558, -5032, -4428, -3826, -3120, -2398, -1661, -859, -108, 687, 1427, 2175, 2895, +3555, 4193, 4753, 5265, 5747, 6135, 6508, 6830, 7050, 7223, 7333, 7415, 7429, 7360, 7259, 7074, +6910, 6586, 6298, 5951, 5529, 5105, 4655, 4176, 3627, 3077, 2466, 1881, 1278, 626, -27, -657, +-1319, -1985, -2644, -3256, -3822, -4414, -4894, -5416, -5839, -6159, -6562, -6828, -7022, -7195, -7252, -7259, +-7225, -7085, -6881, -6664, -6347, -5999, -5582, -5129, -4686, -4160, -3632, -3065, -2518, -1957, -1397, -845, +-299, 225, 719, 1215, 1669, 2122, 2519, 2900, 3292, 3610, 3895, 4209, 4487, 4718, 4966, 5132, +5330, 5476, 5567, 5688, 5708, 5728, 5694, 5602, 5518, 5355, 5174, 4956, 4690, 4383, 4032, 3644, +3236, 2798, 2282, 1772, 1254, 737, 139, -410, -895, -1472, -1989, -2468, -2999, -3419, -3842, -4235, +-4550, -4927, -5158, -5412, -5588, -5708, -5846, -5901, -5901, -5892, -5830, -5741, -5592, -5398, -5200, -4952, +-4664, -4341, -3996, -3600, -3143, -2711, -2204, -1675, -1149, -564, -13, 573, 1137, 1726, 2293, 2870, +3400, 3930, 4408, 4909, 5350, 5722, 6070, 6352, 6605, 6790, 6900, 6940, 6952, 6861, 6717, 6557, +6241, 5949, 5592, 5141, 4713, 4177, 3621, 3055, 2463, 1800, 1181, 520, -99, -759, -1394, -1995, +-2587, -3147, -3675, -4170, -4615, -5027, -5386, -5722, -5963, -6177, -6356, -6450, -6483, -6468, -6405, -6264, +-6119, -5873, -5630, -5315, -4967, -4618, -4196, -3763, -3328, -2857, -2398, -1903, -1411, -934, -469, 3, +449, 899, 1321, 1716, 2120, 2485, 2831, 3186, 3496, 3784, 4077, 4337, 4542, 4765, 4967, 5103, +5233, 5316, 5393, 5481, 5445, 5413, 5360, 5266, 5158, 4970, 4773, 4531, 4237, 3930, 3581, 3159, +2752, 2295, 1802, 1293, 771, 241, -293, -829, -1368, -1922, -2436, -2955, -3438, -3908, -4344, -4734, +-5139, -5466, -5766, -6031, -6245, -6425, -6550, -6629, -6656, -6653, -6566, -6472, -6313, -6077, -5849, -5522, +-5165, -4766, -4312, -3813, -3265, -2688, -2049, -1443, -753, -90, 600, 1306, 1989, 2682, 3324, 3982, +4587, 5146, 5667, 6113, 6537, 6900, 7139, 7360, 7502, 7567, 7564, 7486, 7356, 7148, 6874, 6571, +6171, 5731, 5270, 4746, 4211, 3634, 3046, 2466, 1852, 1252, 662, 105, -462, -1020, -1524, -2044, +-2512, -2951, -3390, -3775, -4143, -4496, -4807, -5081, -5323, -5527, -5708, -5859, -5950, -6023, -6067, -6047, +-6013, -5940, -5842, -5674, -5485, -5253, -5008, -4679, -4344, -3997, -3558, -3129, -2669, -2189, -1685, -1166, +-623, -105, 435, 955, 1501, 2009, 2475, 2968, 3405, 3847, 4237, 4593, 4940, 5229, 5502, 5731, +5936, 6080, 6193, 6285, 6329, 6337, 6288, 6222, 6116, 5949, 5754, 5519, 5239, 4943, 4569, 4179, +3745, 3272, 2780, 2231, 1666, 1065, 462, -163, -822, -1467, -2112, -2752, -3363, -3961, -4536, -5064, +-5572, -6024, -6445, -6799, -7109, -7374, -7539, -7685, -7747, -7729, -7686, -7530, -7322, -7070, -6744, -6343, +-5901, -5417, -4863, -4307, -3687, -3042, -2408, -1709, -1033, -347, 328, 1009, 1666, 2301, 2926, 3508, +4064, 4569, 5033, 5461, 5847, 6158, 6420, 6647, 6819, 6920, 6976, 6978, 6913, 6821, 6666, 6469, +6208, 5936, 5602, 5233, 4856, 4419, 3978, 3518, 3013, 2514, 2010, 1489, 956, 446, -83, -604, +-1099, -1617, -2092, -2558, -3028, -3425, -3842, -4211, -4565, -4887, -5168, -5422, -5646, -5832, -5979, -6087, +-6155, -6182, -6183, -6116, -6017, -5895, -5723, -5503, -5251, -4986, -4651, -4297, -3907, -3466, -3032, -2551, +-2033, -1534, -980, -444, 110, 658, 1225, 1763, 2301, 2849, 3353, 3852, 4306, 4773, 5180, 5581, +5922, 6250, 6521, 6750, 6935, 7061, 7150, 7157, 7129, 7054, 6857, 6677, 6405, 6080, 5722, 5279, +4809, 4283, 3715, 3125, 2479, 1828, 1141, 442, -236, -942, -1630, -2289, -2941, -3547, -4143, -4666, +-5158, -5605, -5994, -6338, -6609, -6819, -6987, -7087, -7117, -7107, -7022, -6914, -6729, -6503, -6249, -5917, +-5578, -5197, -4778, -4332, -3866, -3379, -2873, -2337, -1823, -1272, -734, -194, 362, 884, 1418, 1936, +2426, 2954, 3401, 3837, 4277, 4660, 5015, 5353, 5616, 5852, 6057, 6208, 6294, 6337, 6382, 6313, +6237, 6116, 5927, 5713, 5471, 5182, 4850, 4482, 4094, 3672, 3220, 2749, 2269, 1761, 1262, 739, +209, -279, -798, -1293, -1779, -2264, -2715, -3168, -3575, -3978, -4351, -4696, -5047, -5325, -5563, -5830, +-6004, -6153, -6288, -6327, -6391, -6355, -6307, -6207, -6040, -5871, -5606, -5334, -5003, -4612, -4215, -3736, +-3266, -2735, -2184, -1612, -1021, -417, 191, 788, 1426, 2010, 2602, 3156, 3695, 4206, 4661, 5092, +5489, 5809, 6115, 6357, 6550, 6706, 6782, 6835, 6814, 6755, 6652, 6486, 6260, 6026, 5733, 5357, +4991, 4582, 4119, 3642, 3144, 2602, 2070, 1505, 934, 355, -205, -781, -1365, -1904, -2480, -2978, +-3484, -3957, -4399, -4812, -5150, -5485, -5767, -5998, -6179, -6318, -6410, -6441, -6425, -6373, -6260, -6106, +-5912, -5668, -5398, -5076, -4709, -4325, -3890, -3445, -2974, -2476, -1973, -1443, -918, -383, 147, 658, +1194, 1685, 2175, 2645, 3081, 3496, 3885, 4245, 4577, 4854, 5122, 5349, 5524, 5687, 5774, 5877, +5893, 5888, 5851, 5757, 5648, 5490, 5308, 5079, 4816, 4531, 4211, 3867, 3492, 3089, 2669, 2208, +1753, 1266, 772, 268, -236, -740, -1249, -1763, -2250, -2734, -3193, -3617, -4059, -4429, -4799, -5135, +-5425, -5682, -5912, -6076, -6205, -6294, -6322, -6314, -6246, -6139, -5963, -5756, -5513, -5198, -4872, -4495, +-4077, -3639, -3157, -2671, -2148, -1610, -1074, -506, 36, 583, 1144, 1663, 2197, 2688, 3173, 3615, +4035, 4436, 4762, 5101, 5367, 5596, 5791, 5934, 6041, 6091, 6106, 6074, 5985, 5869, 5707, 5485, +5239, 4946, 4620, 4253, 3861, 3437, 2977, 2503, 2014, 1486, 985, 446, -81, -580, -1128, -1617, +-2112, -2590, -3020, -3454, -3825, -4187, -4507, -4776, -5030, -5213, -5381, -5490, -5556, -5591, -5573, -5518, +-5431, -5296, -5137, -4946, -4695, -4456, -4167, -3844, -3526, -3157, -2785, -2401, -1979, -1566, -1140, -704, +-260, 163, 594, 1033, 1453, 1860, 2265, 2643, 3011, 3369, 3695, 3992, 4288, 4535, 4752, 4948, +5105, 5234, 5296, 5364, 5355, 5320, 5266, 5135, 4991, 4807, 4586, 4332, 4049, 3721, 3375, 3011, +2616, 2214, 1772, 1335, 889, 415, -30, -498, -944, -1404, -1849, -2261, -2682, -3065, -3432, -3787, +-4084, -4379, -4627, -4854, -5039, -5178, -5310, -5372, -5411, -5406, -5368, -5280, -5145, -4993, -4783, -4539, +-4256, -3951, -3585, -3211, -2813, -2382, -1918, -1462, -968, -486, 5, 506, 990, 1481, 1950, 2402, +2831, 3237, 3619, 3951, 4261, 4531, 4756, 4941, 5086, 5174, 5236, 5251, 5223, 5156, 5043, 4902, +4719, 4510, 4259, 3980, 3675, 3346, 3003, 2624, 2236, 1848, 1423, 1028, 606, 190, -195, -612, +-1002, -1385, -1751, -2099, -2434, -2741, -3032, -3307, -3544, -3768, -3970, -4132, -4273, -4379, -4460, -4516, +-4524, -4516, -4487, -4404, -4301, -4180, -4021, -3847, -3629, -3416, -3161, -2880, -2600, -2277, -1971, -1617, +-1268, -910, -541, -162, 211, 573, 958, 1332, 1685, 2041, 2379, 2698, 3001, 3285, 3547, 3783, +4005, 4177, 4342, 4473, 4562, 4621, 4652, 4644, 4598, 4521, 4413, 4256, 4085, 3867, 3632, 3353, +3055, 2747, 2382, 2030, 1635, 1249, 834, 401, -7, -435, -866, -1278, -1695, -2090, -2463, -2829, +-3148, -3468, -3741, -3987, -4187, -4374, -4514, -4611, -4674, -4705, -4694, -4644, -4547, -4429, -4266, -4068, +-3845, -3575, -3295, -2974, -2635, -2280, -1898, -1516, -1117, -716, -306, 83, 473, 864, 1230, 1590, +1927, 2246, 2543, 2819, 3071, 3299, 3486, 3663, 3796, 3915, 3997, 4046, 4072, 4067, 4041, 3973, +3899, 3777, 3649, 3488, 3309, 3119, 2900, 2668, 2419, 2156, 1877, 1590, 1298, 980, 669, 359, +28, -270, -598, -918, -1213, -1520, -1796, -2087, -2347, -2584, -2827, -3033, -3222, -3401, -3546, -3668, +-3765, -3836, -3886, -3889, -3889, -3847, -3774, -3682, -3565, -3411, -3245, -3055, -2841, -2604, -2354, -2085, +-1790, -1496, -1172, -847, -516, -170, 168, 509, 859, 1196, 1525, 1850, 2156, 2451, 2720, 2980, +3207, 3414, 3595, 3746, 3872, 3967, 4026, 4068, 4049, 4022, 3954, 3847, 3715, 3551, 3360, 3128, +2883, 2597, 2299, 1976, 1644, 1287, 929, 566, 190, -160, -524, -885, -1225, -1557, -1869, -2170, +-2444, -2696, -2931, -3125, -3309, -3458, -3580, -3661, -3728, -3759, -3758, -3739, -3676, -3602, -3484, -3357, +-3206, -3032, -2832, -2611, -2388, -2125, -1877, -1597, -1314, -1025, -730, -438, -134, 139, 437, 723, +1000, 1263, 1518, 1766, 1988, 2204, 2398, 2576, 2745, 2877, 3003, 3096, 3178, 3241, 3263, 3279, +3265, 3229, 3180, 3093, 2996, 2894, 2745, 2601, 2436, 2252, 2059, 1836, 1630, 1385, 1141, 889, +629, 366, 89, -167, -443, -713, -986, -1248, -1499, -1747, -1974, -2199, -2398, -2585, -2755, -2897, +-3035, -3133, -3217, -3280, -3314, -3321, -3308, -3265, -3193, -3104, -2984, -2837, -2672, -2476, -2267, -2034, +-1779, -1521, -1238, -952, -651, -346, -39, 251, 563, 860, 1155, 1443, 1698, 1967, 2185, 2417, +2615, 2781, 2939, 3064, 3167, 3244, 3285, 3304, 3302, 3268, 3210, 3123, 3016, 2886, 2726, 2552, +2354, 2139, 1911, 1665, 1407, 1146, 866, 595, 316, 44, -212, -493, -745, -1004, -1239, -1469, +-1690, -1889, -2073, -2237, -2396, -2524, -2640, -2732, -2803, -2867, -2891, -2907, -2895, -2863, -2817, -2740, +-2657, -2553, -2427, -2286, -2136, -1971, -1792, -1602, -1399, -1199, -973, -755, -527, -289, -54, 168, +403, 633, 860, 1078, 1283, 1490, 1670, 1849, 2005, 2151, 2277, 2395, 2487, 2563, 2626, 2660, +2686, 2689, 2669, 2635, 2579, 2508, 2417, 2303, 2188, 2039, 1882, 1714, 1534, 1331, 1128, 915, +687, 463, 223, -3, -236, -483, -704, -948, -1165, -1379, -1584, -1770, -1954, -2116, -2262, -2391, +-2505, -2594, -2672, -2713, -2747, -2750, -2734, -2703, -2635, -2558, -2456, -2330, -2189, -2034, -1847, -1656, +-1447, -1234, -992, -759, -521, -260, -26, 207, 458, 691, 924, 1152, 1356, 1559, 1748, 1922, +2083, 2223, 2348, 2456, 2548, 2611, 2660, 2691, 2684, 2672, 2640, 2574, 2498, 2402, 2282, 2155, +2009, 1848, 1671, 1487, 1295, 1086, 875, 658, 430, 211, -10, -224, -454, -658, -880, -1074, +-1263, -1452, -1608, -1768, -1903, -2025, -2134, -2221, -2294, -2345, -2388, -2411, -2405, -2390, -2359, -2305, +-2238, -2165, -2058, -1957, -1831, -1695, -1563, -1394, -1232, -1062, -880, -695, -500, -314, -110, 69, +264, 464, 645, 836, 1014, 1181, 1348, 1501, 1642, 1770, 1884, 1989, 2073, 2151, 2209, 2251, +2277, 2291, 2281, 2264, 2218, 2165, 2097, 2005, 1901, 1786, 1651, 1498, 1341, 1169, 980, 793, +592, 385, 180, -28, -231, -453, -648, -859, -1048, -1243, -1423, -1588, -1752, -1902, -2029, -2146, +-2256, -2334, -2398, -2450, -2471, -2480, -2465, -2432, -2377, -2306, -2218, -2102, -1981, -1843, -1685, -1515, +-1336, -1147, -946, -742, -527, -309, -91, 115, 336, 550, 754, 963, 1155, 1339, 1508, 1675, +1814, 1951, 2058, 2164, 2238, 2303, 2349, 2369, 2378, 2367, 2332, 2282, 2219, 2134, 2038, 1920, +1795, 1651, 1506, 1339, 1172, 997, 812, 623, 434, 231, 42, -139, -335, -517, -706, -876, +-1040, -1205, -1346, -1482, -1603, -1714, -1811, -1884, -1957, -2010, -2048, -2068, -2078, -2073, -2051, -2023, +-1975, -1917, -1845, -1765, -1669, -1559, -1443, -1314, -1172, -1030, -868, -711, -536, -370, -192, -13, +143, 333, 498, 674, 847, 1006, 1157, 1312, 1455, 1582, 1710, 1809, 1916, 1994, 2066, 2126, +2156, 2184, 2188, 2175, 2151, 2104, 2039, 1967, 1872, 1768, 1644, 1511, 1367, 1198, 1038, 859, +672, 483, 287, 86, -99, -299, -502, -695, -888, -1067, -1249, -1414, -1572, -1717, -1845, -1962, +-2063, -2149, -2216, -2264, -2301, -2310, -2303, -2281, -2233, -2173, -2096, -1998, -1886, -1763, -1617, -1469, +-1306, -1127, -949, -755, -564, -365, -165, 30, 223, 419, 612, 795, 973, 1138, 1296, 1435, +1568, 1681, 1781, 1867, 1931, 1983, 2022, 2038, 2047, 2033, 2005, 1967, 1913, 1848, 1767, 1678, +1579, 1462, 1348, 1210, 1078, 932, 782, 634, 466, 311, 147, -12, -158, -325, -477, -627, +-774, -913, -1045, -1172, -1292, -1399, -1505, -1595, -1670, -1743, -1806, -1845, -1884, -1904, -1911, -1903, +-1889, -1852, -1811, -1755, -1678, -1603, -1501, -1392, -1277, -1147, -1009, -861, -708, -548, -379, -206, +-36, 128, 306, 483, 652, 821, 986, 1142, 1295, 1435, 1564, 1687, 1790, 1891, 1970, 2034, +2085, 2120, 2139, 2133, 2119, 2082, 2030, 1961, 1873, 1785, 1660, 1540, 1394, 1242, 1091, 910, +739, 554, 370, 173, -13, -201, -398, -580, -769, -948, -1108, -1273, -1414, -1549, -1669, -1772, +-1862, -1932, -1990, -2029, -2049, -2057, -2046, -2024, -1975, -1922, -1849, -1758, -1666, -1553, -1432, -1306, +-1160, -1011, -858, -696, -530, -362, -194, -27, 125, 294, 452, 606, 755, 892, 1029, 1150, +1262, 1370, 1457, 1545, 1616, 1678, 1727, 1762, 1790, 1800, 1802, 1786, 1768, 1729, 1684, 1630, +1555, 1476, 1385, 1288, 1179, 1064, 936, 808, 663, 525, 377, 221, 71, -74, -226, -383, +-536, -684, -832, -972, -1102, -1235, -1355, -1462, -1564, -1660, -1736, -1804, -1864, -1902, -1932, -1945, +-1940, -1927, -1891, -1849, -1791, -1716, -1632, -1533, -1419, -1300, -1166, -1024, -878, -718, -555, -386, +-210, -34, 131, 311, 487, 658, 831, 995, 1146, 1293, 1431, 1550, 1659, 1758, 1842, 1907, +1955, 1994, 2010, 2012, 2000, 1967, 1927, 1864, 1789, 1702, 1601, 1485, 1356, 1222, 1072, 921, +760, 592, 422, 246, 76, -84, -255, -423, -580, -740, -885, -1028, -1151, -1276, -1380, -1481, +-1566, -1634, -1697, -1737, -1777, -1796, -1800, -1796, -1776, -1747, -1704, -1644, -1578, -1508, -1414, -1317, +-1215, -1094, -977, -844, -711, -570, -429, -283, -133, 7, 149, 296, 444, 583, 716, 850, +972, 1093, 1201, 1302, 1399, 1482, 1562, 1622, 1679, 1722, 1755, 1768, 1773, 1763, 1743, 1714, +1665, 1606, 1540, 1458, 1372, 1268, 1159, 1045, 915, 786, 643, 503, 352, 200, 47, -95, +-260, -411, -569, -724, -866, -1009, -1137, -1268, -1375, -1484, -1578, -1663, -1728, -1786, -1826, -1854, +-1865, -1865, -1850, -1821, -1782, -1718, -1653, -1568, -1475, -1364, -1246, -1117, -976, -836, -682, -519, +-367, -197, -32, 117, 286, 444, 606, 745, 898, 1031, 1150, 1277, 1372, 1466, 1545, 1618, +1669, 1714, 1741, 1753, 1760, 1739, 1716, 1678, 1627, 1564, 1493, 1408, 1314, 1204, 1094, 968, +842, 706, 570, 427, 279, 134, -10, -144, -294, -433, -564, -701, -823, -943, -1053, -1161, +-1249, -1339, -1419, -1484, -1544, -1586, -1627, -1642, -1660, -1653, -1640, -1611, -1577, -1530, -1464, -1401, +-1316, -1230, -1132, -1028, -914, -798, -671, -546, -414, -277, -139, -1, 120, 270, 399, 543, +669, 795, 921, 1026, 1138, 1230, 1327, 1399, 1472, 1533, 1578, 1617, 1641, 1650, 1659, 1640, +1620, 1584, 1535, 1482, 1412, 1338, 1244, 1152, 1038, 933, 805, 675, 546, 401, 267, 113, +-22, -162, -312, -451, -592, -730, -852, -977, -1092, -1191, -1288, -1370, -1443, -1509, -1558, -1593, +-1620, -1634, -1631, -1620, -1595, -1557, -1506, -1445, -1378, -1287, -1201, -1099, -989, -869, -742, -609, +-473, -340, -190, -52, 78, 225, 359, 495, 623, 745, 866, 972, 1082, 1175, 1259, 1338, +1406, 1462, 1508, 1545, 1561, 1573, 1568, 1552, 1525, 1486, 1437, 1375, 1305, 1220, 1137, 1038, +937, 822, 713, 585, 468, 333, 207, 80, -41, -166, -304, -422, -551, -662, -778, -883, +-980, -1073, -1156, -1234, -1297, -1354, -1399, -1440, -1462, -1485, -1485, -1482, -1472, -1442, -1409, -1363, +-1307, -1248, -1178, -1099, -1011, -918, -817, -711, -607, -485, -367, -245, -118, 3, 117, 248, +372, 491, 612, 720, 834, 931, 1024, 1113, 1189, 1259, 1319, 1367, 1411, 1438, 1460, 1469, +1460, 1451, 1424, 1385, 1343, 1288, 1220, 1146, 1062, 965, 861, 757, 637, 517, 393, 265, +134, 6, -110, -245, -371, -497, -614, -730, -841, -941, -1040, -1126, -1207, -1278, -1336, -1385, +-1424, -1455, -1466, -1475, -1462, -1438, -1414, -1364, -1312, -1249, -1175, -1094, -1005, -908, -798, -691, +-578, -456, -336, -207, -81, 37, 154, 282, 401, 515, 634, 735, 836, 933, 1016, 1094, +1164, 1225, 1273, 1320, 1344, 1368, 1380, 1373, 1373, 1351, 1319, 1280, 1235, 1179, 1113, 1049, +967, 883, 798, 701, 604, 501, 401, 288, 182, 71, -28, -137, -250, -354, -461, -560, +-657, -749, -835, -914, -987, -1052, -1115, -1156, -1205, -1239, -1261, -1285, -1286, -1287, -1273, -1259, +-1230, -1191, -1154, -1096, -1033, -963, -885, -801, -713, -609, -510, -403, -294, -180, -66, 32, +146, 259, 369, 474, 585, 681, 779, 870, 949, 1031, 1096, 1160, 1209, 1251, 1288, 1302, +1319, 1317, 1309, 1286, 1256, 1215, 1164, 1106, 1035, 961, 875, 782, 685, 578, 476, 357, +244, 125, 8, -91, -217, -325, -444, -546, -651, -749, -837, -927, -997, -1074, -1128, -1181, +-1224, -1258, -1278, -1286, -1297, -1280, -1261, -1234, -1191, -1149, -1094, -1026, -963, -884, -805, -716, +-627, -535, -435, -333, -234, -134, -25, 59, 168, 268, 364, 457, 546, 634, 708, 786, +851, 915, 963, 1014, 1050, 1084, 1107, 1123, 1135, 1137, 1128, 1118, 1096, 1068, 1034, 991, +944, 886, 826, 757, 682, 606, 525, 435, 351, 251, 163, 68, -21, -110, -210, -299, +-396, -483, -570, -647, -725, -800, -863, -924, -978, -1021, -1065, -1093, -1116, -1131, -1135, -1133, +-1117, -1098, -1065, -1030, -982, -927, -870, -796, -720, -640, -551, -457, -362, -260, -160, -52, +36, 144, 244, 346, 443, 537, 629, 713, 798, 866, 938, 997, 1046, 1089, 1125, 1152, +1165, 1167, 1170, 1150, 1128, 1101, 1054, 1009, 951, 886, 822, 742, 662, 578, 493, 400, +306, 207, 112, 16, -74, -171, -267, -357, -444, -531, -606, -684, -750, -810, -866, -914, +-951, -987, -1012, -1028, -1044, -1041, -1045, -1026, -1011, -987, -951, -917, -871, -822, -768, -706, +-643, -574, -501, -428, -347, -264, -185, -100, -17, 52, 138, 219, 294, 377, 448, 522, +589, 650, 713, 762, 812, 852, 886, 922, 939, 960, 968, 973, 965, 955, 933, 908, +878, 837, 795, 740, 687, 617, 550, 477, 398, 317, 231, 147, 61, -18, -99, -195, +-275, -357, -443, -519, -595, -666, -735, -793, -845, -899, -939, -971, -997, -1015, -1026, -1023, +-1015, -1002, -976, -943, -904, -856, -803, -744, -682, -609, -535, -458, -370, -289, -202, -109, +-23, 55, 149, 236, 321, 409, 485, 563, 629, 696, 755, 803, 852, 890, 923, 946, +965, 973, 976, 968, 958, 936, 908, 881, 837, 797, 740, 685, 629, 563, 496, 425, +350, 275, 201, 120, 42, -22, -98, -177, -249, -325, -391, -458, -521, -575, -631, -677, +-721, -760, -792, -813, -837, -851, -856, -865, -856, -847, -836, -808, -784, -754, -713, -665, +-619, -566, -510, -449, -381, -313, -241, -171, -98, -21, 37, 114, 187, 257, 331, 395, +463, 522, 585, 633, 687, 728, 769, 807, 834, 855, 869, 878, 875, 871, 852, 840, +808, 774, 740, 690, 648, 584, 530, 467, 400, 328, 253, 185, 100, 23, -45, -127, +-207, -279, -359, -430, -496, -563, -624, -674, -724, -773, -807, -840, -866, -879, -895, -895, +-895, -885, -865, -845, -811, -781, -737, -689, -640, -584, -520, -459, -389, -318, -250, -175, +-98, -25, 36, 115, 186, 257, 330, 389, 454, 515, 563, 614, 658, 695, 726, 754, +776, 789, 800, 808, 798, 795, 779, 759, 733, 705, 671, 629, 585, 532, 482, 425, +366, 304, 239, 176, 107, 40, -13, -80, -146, -207, -273, -331, -386, -443, -496, -541, +-587, -627, -663, -692, -721, -733, -753, -755, -762, -758, -748, -738, -711, -687, -657, -619, +-583, -539, -488, -438, -381, -321, -260, -197, -131, -64, 1, 54, 123, 183, 240, 302, +350, 399, 437, 478, 511, 539, 561, 583, 595, 600, 606, 599, 595, 582, 569, 546, +517, 495, 461, 429, 394, 355, 321, 280, 241, 200, 161, 122, 84, 47, 11, -13, +-47, -76, -100, -129, -148, -167, -182, -195, -204, -210, -212, -214, -209, -207, -197, -191, +-182, -168, -158, -142, -129, -115, -100, -85, -71, -59, -44, -34, -22, -13, -5, 0, +5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -51, -15, 423, -754, 555, -207, 81, -44, 11, -11, 0, 76, +-347, 774, -995, 832, -510, 255, -248, 343, -71, -623, 1019, -661, 220, -676, 1554, -1533, +674, -112, 298, -861, 1128, -661, -264, 885, -1038, 1012, -696, 248, -374, 1298, -2318, 2500, +-1490, 98, 233, 663, -944, -418, 1995, -2257, 1395, -629, 808, -1501, 1416, -293, -458, 0, +919, -1380, 728, 1224, -3104, 3152, -1587, -160, 992, -686, 89, 86, -202, 509, -267, -873, +2005, -1886, 66, 1980, -2808, 2169, -413, -995, 433, 682, -21, -1535, 2199, -1717, 340, 573, +71, -962, 84, 2371, -3808, 2202, 934, -2265, 1067, -76, 821, -1941, 2665, -3021, 2216, -340, +-1220, 1563, -999, 517, -854, 1944, -2809, 2078, -168, -527, -1170, 3387, -3406, 1142, 1181, -1700, +168, 1402, -236, -3110, 4904, -3614, 1138, 131, 556, -1683, 1571, -230, -1602, 2917, -3149, 2377, +-1256, 570, 546, -2611, 3595, -1656, -1244, 1688, 131, -1277, 545, 1170, -1912, 933, 79, 488, +-1529, 1990, -1848, 718, 311, 370, -1111, 46, 1555, -1960, 1983, -2119, 1138, 607, -696, -1414, +3706, -3856, 1253, 2162, -3086, 1233, 185, 919, -3289, 4287, -2920, 1020, -233, 449, -410, -2170, +6559, -7947, 5282, -2397, 1561, -1743, 1133, 1194, -4611, 6035, -2939, -1368, 1036, 4347, -9411, 9507, +-4651, -999, 2315, 609, -1683, -2698, 9138, -12160, 9439, -3774, 251, -1050, 4419, -7259, 5706, 1493, +-9582, 12891, -11258, 8503, -7347, 6530, -3859, -226, 2761, -2357, 2591, -7509, 15053, -18941, 14205, -3128, +-5159, 5398, -2480, 3445, -9349, 15344, -15553, 9036, -895, -3837, 4946, -6784, 11845, -15926, 13401, -4588, +-3621, 5212, -2038, -246, -1530, 7318, -12285, 10202, -2640, -2233, 602, 4378, -7584, 5107, 2344, -8391, +6614, 1807, -7157, 3100, 6869, -15921, 18141, -10594, -1360, 7608, -5809, 1957, -196, 2085, -8098, 13478, +-12228, 6041, -2207, 1877, 345, -5878, 11101, -13648, 12870, -8941, 4407, -801, -2470, 4685, -3409, -989, +4670, -6504, 6241, -1413, -5389, 7422, -4009, 2047, -5236, 8757, -7220, 2519, -60, 1365, -4133, 3377, +2528, -6842, 3649, 4409, -10908, 10977, -4772, -2584, 6023, -4417, 1297, -1588, 6341, -10420, 7972, -1292, +-265, -5612, 10621, -7147, -3498, 12566, -10859, -986, 11174, -9320, -2760, 11272, -4065, -13008, 20986, -10878, +-7628, 18402, -12590, -608, 2512, 11317, -27045, 27224, -9298, -10777, 17464, -8980, -3062, 5291, 3460, -11869, +8537, 2989, -8519, 2148, 9790, -15156, 7408, 4913, -8443, -536, 14079, -16160, -681, 22647, -30826, 16642, +9934, -26092, 16940, 4598, -15587, 10794, -1398, -2968, 1639, 338, 2439, -9596, 14072, -10055, 3443, -4227, +10326, -12960, 10517, -5925, -1515, 10069, -14079, 15403, -18939, 20542, -15591, 9387, -9215, 12116, -8819, -3459, +17535, -23444, 16966, -5057, -1724, 1487, 2219, -5824, 4528, 2586, -8433, 5858, 273, -1988, 2691, -6334, +8505, -6968, 4539, -2065, -1472, 5239, -8941, 12551, -12531, 7061, 201, -3432, 452, 3706, -4925, 4113, +-2412, 1079, -1533, 236, 5678, -9422, 6411, -4586, 10569, -18317, 19267, -12625, 1204, 9473, -12296, 7206, +-1981, 1763, -3200, 934, 3312, -4596, 953, 6341, -12556, 13957, -11937, 9804, -9401, 9756, -7483, 3365, +-1035, 1273, -3268, 3292, 2058, -9550, 14084, -13788, 10507, -7197, 6712, -10176, 14175, -15058, 12306, -8350, +4919, 322, -7880, 14661, -17055, 13031, -5820, 1729, -3400, 7185, -8113, 5340, -2100, 570, 163, -1234, +2342, -2261, 1540, -3890, 11307, -17844, 15005, -5087, -1680, 2247, -2261, 4770, -7745, 10224, -10944, 7829, +-4451, 3681, -1746, -1331, 2657, -3508, 5076, -5708, 3799, -288, -1917, 1873, -1853, 3610, -4089, 299, +2391, 2301, -9901, 12361, -9290, 4235, 1469, -5985, 7390, -7020, 7265, -6981, 5203, -4759, 6697, -9212, +11456, -11103, 8165, -6390, 6036, -4211, -1370, 9469, -15500, 14147, -6402, 2585, -7123, 10085, -3614, -6768, +10924, -4985, -6118, 14578, -14504, 5335, 4715, -6988, 4472, -2887, 1553, -469, 132, 1901, -4403, 1356, +4211, -2092, -6522, 10631, -6425, -1034, 6710, -7739, 2085, 6765, -8709, 434, 8888, -13095, 15064, -15714, +12126, -3888, -4402, 8423, -8634, 8437, -9983, 11865, -12519, 11761, -6003, -5353, 16280, -21054, 17859, -9611, +631, 5577, -4351, -1349, 2212, 3779, -10074, 9974, -4300, -343, 1038, 1098, -4074, 4703, -1188, -3704, +5354, -2616, -1743, 5781, -8431, 7030, -826, -8122, 15853, -17047, 11011, -2613, -3352, 4891, -3256, 3331, +-8223, 12896, -12227, 6018, 3389, -9339, 6367, 2852, -11025, 11761, -3827, -6842, 12810, -11389, 5881, -2737, +2480, -687, -1807, 637, 5684, -13381, 16334, -11515, 1271, 7892, -12172, 12982, -13236, 13692, -11429, 5615, +-592, -1719, 2999, -4035, 4589, -5299, 6924, -6943, 1986, 3488, -4138, 2546, -1957, 2694, -3317, 2286, +-328, -452, -2500, 6886, -4838, -4631, 13255, -13940, 7979, -1457, -769, -2827, 8248, -8781, 4409, -1976, +3469, -3498, -303, 6913, -16197, 22521, -18092, 4603, 6222, -6031, 163, 137, 7870, -16289, 16100, -8292, +1845, -1829, 4463, -3149, -2929, 8828, -9978, 7182, -4466, 3847, -3593, 573, 3182, -1561, -5243, 11435, +-11229, 5515, -1723, 3593, -9164, 13371, -9467, -2309, 13114, -14873, 8498, -1927, 209, -3040, 7017, -6091, +-2, 3174, 2196, -11480, 13745, -4676, -7493, 12996, -9012, 311, 4942, -4296, 1758, -2175, 6249, -8947, +7753, -5447, 3002, 652, -4421, 6145, -7201, 9834, -10667, 6091, 817, -4007, -45, 8721, -14006, 11142, +-2589, -3910, 2499, 2075, -614, -7749, 15901, -15969, 7582, 351, -701, -5597, 12412, -12523, 4274, 5958, +-11805, 12260, -11196, 12460, -14087, 11394, -3861, -4128, 7480, -5885, 3369, -4659, 8530, -8512, 2362, 6992, +-13387, 11989, -5757, 21, 3537, -7207, 11728, -13056, 10684, -7102, 2567, 728, -1060, 1850, -5203, 8146, +-7539, 4991, -2844, 681, 120, 2926, -7612, 7705, -905, -7481, 12223, -12339, 9104, -5182, 2725, 110, +-7089, 14780, -14477, 3912, 8319, -12702, 8566, -51, -7860, 11004, -10768, 9984, -9454, 6411, 1767, -9430, +10588, -6932, 2619, -563, 1642, -5141, 8178, -7637, 5207, -3396, 774, 2643, -4036, 3287, -1980, 343, +1659, -2989, 1209, 3508, -6047, 3973, -1024, 755, -1809, 1244, 810, -3331, 4945, -3718, -469, 5048, +-6780, 5672, -5420, 7050, -7044, 3086, 2025, -5121, 4994, -1941, -815, -1538, 7439, -9017, 3221, 2718, +-1443, -5405, 11436, -11116, 2039, 9780, -13419, 6428, 1588, -1956, -4189, 9886, -6743, -6469, 19052, -20390, +11810, -2642, -951, 1622, -5490, 13758, -20054, 17177, -5270, -6789, 8968, -1070, -5863, 3769, 2710, -4623, +0, 5571, -5567, 660, 2344, 442, -4670, 3139, 2827, -4492, -949, 6734, -7439, 4906, -2169, -1360, +6743, -11366, 11698, -7778, 1138, 5466, -7041, 2067, 4433, -7729, 8050, -7696, 7870, -7342, 3947, 2117, +-7259, 8414, -6300, 3142, -1933, 4913, -8927, 9339, -6663, 4171, -3426, 4707, -6051, 1680, 8069, -13551, +10143, -3835, 1957, -5907, 10647, -10521, 4295, 4540, -9715, 8607, -5489, 5815, -8326, 7076, -1050, -6401, +11973, -12146, 5747, 2674, -5177, 395, 3653, -1967, -3508, 10015, -13769, 10458, -1597, -6439, 10306, -9983, +5958, -990, -822, -1327, 4083, -3992, 1676, 937, -3117, 5319, -7380, 7577, -5112, 1986, -503, 1230, +-2039, 823, 1361, -3288, 5641, -8053, 9614, -10159, 8726, -4118, -1983, 5061, -2469, -1724, 1181, 3817, +-7754, 7376, -3598, -148, 735, 1244, -3264, 4407, -4948, 5888, -6809, 5088, -987, -2713, 4276, -3759, +4324, -8287, 11346, -7950, 692, 3062, -313, -5059, 6264, -1238, -3530, 1403, 3941, -3760, -2610, 9052, +-11181, 8037, -1025, -4720, 4307, -370, -350, -3380, 6430, -5195, 16, 7347, -11481, 7612, -1220, 444, +-2904, 2946, -2255, 2529, -1417, -1857, 5638, -8401, 10469, -11229, 8286, -2744, -1658, 3573, -4200, 4384, +-3988, 4094, -6454, 8835, -7778, 4521, -1932, -102, 2621, -5208, 5985, -4395, 1787, 527, -1203, -1853, +8136, -12479, 9958, -1860, -5805, 9358, -8539, 4359, -178, -894, 15, 298, -652, 3318, -7132, 8171, +-4211, -2703, 8349, -10074, 7981, -5003, 4767, -6736, 5112, 2391, -8973, 7690, -1543, -1777, -636, 5868, +-8908, 5977, 667, -3508, -1026, 7379, -7364, -244, 8310, -10302, 6613, -2610, 2521, -4505, 3515, 2066, +-7439, 6474, -12, -5364, 5703, -2653, 685, -1595, 2919, -2034, -1213, 4879, -6566, 5620, -2944, 651, +-99, 440, -1198, 2511, -2609, 313, 2784, -4267, 3682, -1305, -2237, 4872, -5095, 3127, 314, -2600, +1734, 212, -78, -3545, 8291, -9080, 5272, -1251, -515, 1191, -3047, 6664, -9659, 9472, -6161, 1618, +1554, -1904, 1301, -2571, 4379, -3874, 2587, -2799, 2916, -1515, -66, 401, -56, 235, -369, -348, +1138, -2111, 3396, -2587, -1387, 5369, -6086, 3668, -578, -362, -1501, 3294, -1613, -2383, 4276, -2504, +13, 403, 1581, -4046, 4198, -1665, -861, 2073, -3258, 4948, -5643, 3871, -209, -2155, 1059, 1498, +-1727, -1230, 4012, -3008, -851, 3768, -3037, -680, 3214, -1779, -1375, 2606, -361, -3445, 4872, -2936, +444, -69, 1510, -1894, -158, 2485, -2723, 1083, 469, -496, -585, 1133, -175, -834, -274, 2827, +-3867, 1933, 1479, -3576, 3038, -1007, -40, -1162, 2449, -830, -2523, 3789, -2228, 257, 254, 614, +-2158, 3137, -1975, -1050, 3367, -3471, 2653, -2734, 3527, -3735, 2880, -1321, -389, 1421, -1629, 2053, +-3256, 4035, -3080, 1127, -231, 1104, -2504, 2653, -1007, -1176, 2109, -1266, 249, -1133, 3258, -3915, +2315, -667, 973, -2890, 4388, -3934, 1729, 525, -1419, 1617, -2875, 5331, -7150, 6673, -4239, 1610, +-434, 910, -1326, 414, 1026, -1750, 1647, -1506, 1954, -2592, 2799, -2589, 2192, -1674, 1111, -520, +-171, 923, -1521, 1801, -2005, 2242, -1957, 1040, -1, -590, 346, 357, -338, -825, 2160, -2282, +1286, -413, 280, -435, 338, 8, -160, 128, -158, 493, -1176, 1642, -1268, 360, 45, 517, +-1075, 550, 910, -2410, 2931, -1893, 233, 395, 166, -539, -202, 1511, -2086, 1312, 255, -1326, +973, 279, -1063, 641, 485, -1160, 721, 463, -1514, 1653, -1084, 550, -61, -323, 86, 570, +-773, 345, 279, -1140, 2062, -2085, 1135, -386, 548, -1074, 933, 80, -1403, 2291, -2133, 1142, +-399, 544, -1009, 929, -178, -960, 1889, -1873, 987, -197, 197, -675, 733, -46, -750, 897, +-498, 200, -255, 206, 161, -383, 127, 240, -144, -433, 864, -684, 100, 224, 49, -464, +167, 987, -2019, 1876, -640, -480, 495, 245, -675, 274, 624, -1219, 1049, -510, 241, -520, +1072, -1277, 878, -217, -311, 517, -614, 910, -1190, 1133, -880, 677, -529, 241, 171, -531, +774, -883, 821, -662, 452, -196, 22, -41, 64, 158, -468, 493, -303, 231, -490, 854, +-856, 415, 83, -301, 257, -132, 91, -163, 225, -212, 209, -278, 446, -687, 842, -701, +333, 8, -231, 357, -345, 268, -259, 277, -217, 109, -21, -16, 86, -168, 65, 273, +-616, 616, -204, -217, 314, -112, -156, 187, 120, -372, 171, 302, -514, 236, 215, -362, +129, 165, -156, -273, 759, -760, 255, 197, -160, -171, 338, -107, -451, 879, -692, 89, +194, 183, -570, 225, 631, -1133, 821, -74, -447, 438, 27, -391, 127, 525, -850, 468, +243, -558, 253, 262, -469, 180, 343, -637, 437, 76, -430, 355, -105, 41, -148, 172, +-26, -129, 187, -98, -73, 107, 57, -250, 257, -81, -18, -91, 278, -280, 66, 114, +-160, 209, -306, 355, -272, 112, -8, 13, -27, -65, 268, -406, 299, 0, -221, 182, +-13, -18, -86, 129, -65, 22, 0, -105, 185, -45, -238, 444, -419, 178, 25, -13, +-27, -26, 154, -292, 434, -637, 852, -841, 517, -55, -220, 153, 3, 120, -540, 978, +-1025, 572, -20, -151, -40, 246, -165, -147, 389, -322, 142, -134, 221, -190, 62, 57, +-128, 151, -95, -61, 265, -309, 100, 221, -357, 186, 81, -178, 28, 154, -2, -529, +983, -871, 251, 333, -496, 365, -340, 607, -944, 991, -674, 267, -51, 37, 18, -286, +549, -566, 365, -221, 325, -478, 380, -47, -226, 199, 74, -462, 669, -420, -37, 202, +7, -304, 396, -197, -177, 505, -585, 396, -217, 291, -559, 719, -530, 90, 231, -221, +-32, 192, 2, -410, 631, -517, 231, -13, -28, -59, 113, 30, -293, 372, -151, -156, +302, -231, 52, 7, 187, -410, 288, 149, -507, 459, -134, -88, 46, 98, -144, 44, +71, -71, -56, 231, -396, 433, -246, -27, 195, -228, 217, -377, 631, -617, 254, 76, +-95, -74, 94, 129, -385, 408, -182, -52, 56, 129, -275, 185, 97, -360, 391, -183, +-71, 97, 55, -32, -283, 609, -676, 447, -138, -5, -32, 28, 250, -676, 842, -695, +432, -177, -25, 151, -173, 162, -187, 188, -154, 139, -177, 235, -302, 299, -148, -34, +86, -25, 37, -185, 298, -287, 212, -123, 34, 12, -8, 31, -143, 254, -219, 81, +2, 30, -139, 251, -269, 124, 95, -215, 165, -31, -12, -94, 209, -160, 37, -97, +396, -694, 684, -294, -59, 0, 258, -143, -490, 1118, -1185, 716, -163, -90, 95, -124, +327, -600, 692, -486, 206, -100, 144, -123, -37, 221, -258, 202, -259, 454, -607, 561, +-323, 50, 94, -71, 42, -149, 283, -273, 153, -64, 80, -195, 301, -221, 15, 97, +-31, -86, 109, -8, -68, 66, -31, 18, -55, 161, -254, 241, -136, 71, -110, 167, +-125, 0, 156, -236, 178, -71, 55, -83, 46, 34, -28, -89, 274, -367, 255, -23, +-98, 62, -13, 85, -182, 219, -207, 191, -160, 108, -15, -83, 118, -61, 27, -127, +291, -320, 127, 137, -212, 73, 56, 5, -172, 215, -59, -178, 280, -137, -102, 205, +-114, -13, 28, 52, -144, 154, -68, -27, 47, -10, -18, -2, 62, -93, 57, -7, +-11, 3, 18, -73, 105, -71, 13, 21, -52, 49, -7, -40, 18, 56, -119, 112, +-62, 41, -103, 143, -81, -27, 86, -68, 41, -104, 196, -217, 151, -73, 21, -5, +-3, 37, -91, 103, -76, 47, -51, 54, -12, -90, 161, -154, 61, 39, -97, 89, +-57, 26, -15, 7, -7, 1, 0, 1, -11, 2, 23, -64, 71, -32, -39, 91, +-76, 8, 26, -8, -68, 110, -73, 8, 12, -13, 11, -30, 44, -15, -44, 23, +97, -177, 98, 18, -52, -8, 66, -32, -84, 144, -86, -30, 79, -28, -47, 73, +-31, -47, 109, -109, 32, 59, -97, 44, 35, -49, -28, 118, -131, 62, 23, -57, +25, -3, 39, -76, 65, -8, -62, 91, -42, -7, -16, 103, -125, 36, 110, -200, +177, -98, 45, -61, 115, -109, 23, 83, -139, 115, -69, 57, -74, 100, -115, 108, +-57, -10, 85, -109, 84, -55, 40, -10, -44, 80, -55, 2, 79, -163, 171, -74, +-13, 28, 8, -27, -10, 98, -142, 81, 13, -25, -47, 120, -79, -35, 108, -65, +-27, 55, 22, -123, 149, -73, -30, 62, -7, -49, 34, 64, -168, 204, -136, 3, +79, -47, -28, 54, 21, -163, 270, -245, 112, 18, -34, -47, 103, -37, -105, 200, +-147, 23, 39, 16, -144, 212, -141, 0, 71, -13, -73, 52, 62, -124, 62, 39, +-57, -16, 88, -57, -23, 49, 6, -108, 173, -134, 27, 41, -18, -18, 13, 31, +-80, 107, -97, 71, -45, 31, -15, 2, 7, -13, 13, -22, 18, 3, -13, -3, +32, -52, 64, -41, -2, 5, 75, -144, 84, 78, -182, 123, 0, -31, -62, 154, +-117, -42, 178, -161, 30, 62, -51, -23, 76, -42, -44, 90, -49, -10, 13, 23, +-57, 31, 37, -73, 37, 8, -11, -18, 28, -15, 5, -1, -2, 6, -8, 13, +-17, 8, 11, -26, 7, 37, -61, 18, 65, -120, 86, -3, -52, 51, -22, 7, +-37, 71, -62, 15, 18, -8, -27, 32, -6, -18, 2, 26, -18, -42, 110, -115, +45, 0, 39, -86, 59, 3, -17, -45, 76, -25, -73, 139, -128, 78, -61, 84, +-97, 66, -13, -20, 32, -57, 90, -119, 118, -75, 25, 1, 7, -49, 69, -23, +-52, 94, -64, 30, -30, 41, -32, -10, 47, -28, -35, 81, -66, 25, -10, 26, +-50, 64, -28, -50, 103, -81, 37, -32, 76, -120, 90, 18, -143, 168, -68, -40, +46, 40, -98, 54, 52, -112, 69, 3, -18, -17, 54, -52, 10, 42, -51, -2, +56, -34, -20, 47, -26, -11, 22, 0, -26, 32, -10, 0, -5, 8, -2, -13, +32, -49, 57, -31, -1, 32, -36, 13, 2, -1, -31, 75, -60, -13, 93, -83, +-8, 100, -90, -3, 86, -69, -22, 102, -88, 13, 44, -35, -27, 64, 0, -151, +246, -175, 10, 83, -40, -47, 61, 37, -142, 137, -34, -41, 28, 44, -94, 70, +-3, -37, 28, 3, -8, -7, 25, -18, 3, -5, 3, 6, -20, 17, 0, -8, +8, -3, 3, -13, 40, -42, 13, 10, -13, 7, 0, -8, 0, 23, -23, 3, +8, -5, -2, 18, -20, 3, 7, 0, -10, 5, 20, -54, 57, -18, -26, 23, +20, -41, 0, 57, -76, 44, -8, 6, -27, 40, -16, -54, 94, -49, -31, 61, +-20, -32, 37, 0, -26, 0, 51, -76, 42, 13, -37, 18, 8, -1, -42, 64, +-35, -20, 41, -5, -57, 73, -22, -44, 56, -12, -32, 27, 27, -81, 70, -18, +-3, -15, 44, -37, 1, 36, -70, 65, -28, 0, -8, 39, -44, 8, 37, -47, +8, 31, -23, -3, 6, 30, -49, 20, 26, -46, 23, 3, -12, -8, 50, -65, +32, 15, -37, 8, 25, -23, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 454, -190, -159, 143, -5, -216, -300, 1323, +-1577, 1003, -338, -90, 199, -354, 1216, -2449, 2744, -1854, 144, 1841, -2746, 1846, -41, -1055, +347, 1343, -2139, 1326, 180, -1303, 1583, -1170, 716, -1172, 2689, -4025, 3880, -2159, 331, 452, +-554, 267, -536, 2036, -3851, 4903, -4173, 1605, 859, -1630, 878, 519, -1980, 2836, -2770, 2119, +-1520, 1186, -674, -790, 2738, -3552, 2953, -2078, 1610, -1624, 1308, 42, -1644, 2294, -2047, 1317, +-478, -69, 233, 19, -950, 1933, -1784, 505, 1076, -2542, 3773, -4588, 4415, -3884, 3892, -2981, +-462, 5218, -8389, 7295, -2271, -2336, 2365, 1967, -6849, 8125, -4776, -310, 3433, -3549, 2794, -4030, +7200, -9169, 7245, -2221, -2763, 6270, -6588, 2817, 840, -1748, 233, 1502, -674, -1371, 1336, 1893, +-6289, 8250, -5106, -1699, 6947, -9369, 10276, -10001, 8591, -4505, -2499, 8953, -11050, 7753, -3631, 3350, +-6119, 8253, -6354, 1091, 5161, -10782, 11677, -8212, 5937, -6767, 7401, -3479, -3300, 6876, -5440, 773, +3016, -1939, -4237, 10888, -11502, 5585, 228, -1110, -1580, 4089, -4076, 1121, 2589, -5290, 7989, -10580, +11610, -10830, 7035, -695, -5413, 7646, -4148, -803, 2173, 1407, -7685, 9586, -3695, -4886, 8444, -3087, +-6194, 9217, -3178, -4527, 7225, -5816, 3988, -4169, 6464, -7218, 2829, 4627, -9213, 7427, -3150, 3738, +-9344, 12343, -8947, 2989, 292, 49, 1467, -6467, 9741, -9681, 6290, -1285, -334, -3108, 8098, -9265, +4970, 926, -937, -5471, 9410, -8944, 6243, -1083, -3225, 3940, -1541, -3040, 7380, -7983, 3084, 4052, +-5996, -209, 9011, -15392, 17435, -11411, -3634, 21655, -29192, 26148, -11307, -303, 1107, 7710, -18705, 24222, +-22304, 15422, -7155, 1436, 1165, -4310, 8765, -13739, 19596, -23143, 20292, -12372, 3663, 2386, -4417, 535, +8107, -13248, 8214, 4277, -16679, 21138, -13381, -597, 8470, -2839, -13006, 26883, -25940, 9002, 10063, -13343, +-950, 12794, -7345, -7708, 17005, -12428, -2459, 14816, -10515, -9469, 23488, -15451, -4955, 19529, -24619, 26314, +-24719, 17383, -7639, 177, 5466, -11351, 14152, -10636, 6567, -7061, 9103, -9850, 9761, -9079, 5028, 2953, +-7298, 4107, 4586, -18201, 29189, -29192, 18862, -1407, -2788, -4650, 9539, -4557, -7759, 21433, -28481, 24559, +-13335, -790, 15599, -26101, 28303, -19710, 3724, 7620, -9750, 9754, -13079, 17588, -18370, 15412, -9048, -363, +7747, -10751, 12499, -11889, 2619, 15157, -29192, 29189, -13018, -6333, 14608, -8963, 241, -2690, 14494, -21847, +17620, -5862, -3277, 2261, 5497, -9375, 5216, 312, 1220, -7366, 9123, -746, -14751, 25056, -22447, 12706, +-6345, 9367, -17618, 20430, -11526, -3825, 15141, -17939, 14083, -7002, 1699, -1540, 4350, -4588, 1229, 1409, +-254, -2748, 3700, -1339, -1603, 2488, -1507, 2303, -6265, 9433, -8794, 5268, -2241, 1589, -1037, -1921, +6799, -10919, 12189, -11090, 9519, -8212, 5552, -1175, -2164, 2130, -49, -1953, 2105, 35, -1498, 106, +1734, -617, -2341, 3194, -1835, 1383, -2150, 2011, 370, -4107, 6052, -3239, -3528, 8746, -7453, 1153, +2902, -822, -2708, 1839, 2936, -7527, 7820, -2096, -4906, 5009, 2421, -7997, 4249, 5225, -11442, 9371, +-818, -6237, 3709, 5832, -11031, 6118, 2238, -6170, 5849, -4098, 2863, -4266, 7410, -8174, 4489, 1433, +-6905, 9366, -5986, -3050, 10003, -6516, -3872, 9442, -5544, -2338, 6069, -976, -10080, 17261, -13185, 1299, +7990, -7643, 204, 5331, -2975, -4793, 10038, -8289, 2503, 689, 1248, -3614, 1981, 1927, -4957, 5684, +-4692, 3953, -4938, 6761, -7212, 5081, -313, -5586, 8136, -4508, -2031, 5483, -2073, -6291, 11563, -7894, +-848, 4701, 364, -8146, 9907, -4125, -3083, 4745, -710, -3128, 1660, 4130, -7121, 2589, 4608, -5982, +56, 6842, -8278, 3708, 1341, -1921, -1163, 3500, -2446, -1143, 3774, -2591, -1192, 3619, -2638, 46, +818, 349, -2049, 3383, -3287, 1449, 360, -1107, 1479, -1508, 389, 1284, -804, -3066, 6482, -5015, +-77, 3110, -848, -4806, 8884, -7698, 2285, 2305, -2005, -1395, 2479, 1004, -6225, 8229, -5128, 15, +2305, 254, -4672, 5801, -1982, -3068, 4173, -734, -3157, 2830, 2111, -7070, 7667, -5391, 4407, -5254, +5495, -3958, 1268, 1664, -4050, 5245, -5203, 4547, -4277, 4736, -4710, 2739, 397, -2435, 2032, -307, +-605, -34, 666, 382, -2677, 3366, -976, -2791, 5369, -5946, 4582, -1075, -2827, 3798, -1395, -1577, +2295, -695, -1210, 1605, -271, -945, 447, 1386, -2836, 2368, -845, 203, -1193, 2240, -1326, -984, +1951, -686, -605, 453, 166, -447, 242, 379, -700, -48, 776, -129, -978, 1016, 102, -1464, +1907, -1610, 1333, -86, -2569, 3955, -2327, -6, 373, 1634, -4579, 5618, -3319, -135, 1794, -1144, +-585, 1687, -1315, 84, 1038, -1689, 1623, -1034, 534, -385, 237, 55, 268, -2059, 4144, -4026, +1288, 1870, -3324, 1963, 1483, -4013, 3240, -644, -627, -565, 3219, -4772, 3284, -519, -292, -1262, +2220, -616, -2056, 3821, -3714, 1931, -279, 184, -862, 294, 1548, -2985, 2900, -1296, -537, 1307, +-1215, 802, -460, 581, -630, -396, 1505, -772, -825, 913, 283, -1194, 1124, -611, 232, 351, +-1702, 3028, -2854, 1289, 300, -626, -792, 2964, -4380, 4261, -2857, 498, 1980, -3166, 2514, -871, +-342, 3, 1405, -2565, 2834, -2367, 1799, -1472, 774, 684, -1752, 685, 2119, -3597, 1627, 2398, +-5361, 5485, -3494, 1233, -371, 901, -901, -903, 2999, -3003, 1001, 202, 1277, -4341, 6190, -5030, +1437, 1889, -2367, -144, 2666, -2052, -1419, 4355, -3714, -26, 3221, -2664, -1332, 5144, -5376, 1884, +1925, -2683, 720, 917, -825, -460, 1792, -2113, 1333, -154, -702, 1146, -1863, 2744, -2610, 1073, +492, -520, -653, 878, 587, -2241, 2277, -1024, 187, -647, 1942, -2872, 1987, 578, -2657, 2308, +-130, -1793, 1895, -20, -2129, 2565, -1006, -1053, 1408, 123, -1224, 656, -15, 685, -1910, 2242, +-1572, 480, 309, 83, -1487, 2390, -1445, -1009, 2810, -2180, -353, 2023, -1149, -1486, 3774, -3752, +1784, -562, 1414, -2798, 2816, -1193, -777, 1426, -605, -567, 516, 1223, -2428, 1178, 1108, -2056, +991, 707, -1410, 857, 145, -629, -60, 1606, -2224, 393, 2483, -3429, 1275, 1990, -3709, 3271, +-1839, 770, -817, 1593, -1724, 654, 51, 525, -1252, 1009, 216, -1825, 2586, -1451, -783, 1829, +-484, -1886, 3036, -2489, 1556, -1653, 2226, -1809, 535, 291, -385, 546, -963, 1206, -1205, 432, +864, -709, -1390, 3110, -2644, 525, 1583, -1861, -213, 2747, -2811, -193, 3403, -3558, 501, 2773, +-3095, 47, 3528, -4145, 1216, 2435, -3743, 2101, 260, -995, -208, 1958, -2585, 2046, -1468, 1070, +-626, -12, 776, -1251, 1345, -1331, 1180, -738, 65, 464, -583, 236, 305, -368, 328, -1023, +1352, -506, -47, -498, 576, 497, -1447, 1655, -1590, 1397, -1110, 954, -746, -310, 2242, -3596, +3114, -1376, 305, -929, 2459, -3310, 2657, -1028, -924, 2697, -3323, 2627, -1710, 942, -135, 113, +-1591, 2865, -1811, -1097, 2949, -1921, -454, 1436, -12, -2311, 3279, -2246, 415, 666, -566, 61, +-538, 2268, -3525, 2945, -1638, 1303, -2206, 3268, -3045, 689, 2618, -4020, 2560, -630, 523, -2036, +3307, -2976, 1262, 398, -605, -349, 975, -211, -1610, 2530, -1394, -656, 1672, -831, -1354, 3442, +-3276, 342, 2855, -3371, 955, 2015, -2985, 1590, 717, -2582, 2554, -236, -2169, 1932, 1077, -4388, +5100, -2320, -1886, 3919, -2317, -277, 493, 1846, -4173, 3646, -290, -2873, 3604, -1827, -747, 1419, +469, -2898, 3664, -2632, 1673, -1751, 1984, -1587, 558, 863, -2077, 2271, -1692, 1386, -1795, 2211, +-1790, 452, 914, -1421, 648, 740, -1179, 517, -83, 178, -544, 1025, -1337, 1042, 215, -1935, +3197, -3276, 1798, 675, -2817, 2963, -647, -2011, 2543, -1180, -139, 80, 810, -1244, 965, -156, +-1091, 2265, -2671, 2366, -2241, 2590, -2155, -33, 2477, -2477, -389, 3396, -3714, 963, 2519, -3513, +1458, 904, -1028, -895, 2530, -2210, 583, 143, 1142, -2867, 2897, -1226, -66, 88, -597, 2528, +-3613, 1811, 1529, -3809, 3271, 324, -4199, 4346, -388, -3753, 4493, -1345, -3076, 4539, -1664, -2397, +3025, 645, -4193, 3816, -1079, -484, 209, 637, -1348, 2092, -2540, 1376, 1645, -3651, 2061, 1816, +-4910, 4352, 203, -4795, 4738, -176, -3502, 1669, 3901, -7664, 6268, -413, -4918, 5099, -1688, -1047, +943, 1380, -3674, 4130, -2766, 786, -104, 2150, -4973, 3935, 1785, -7270, 7647, -3350, -273, -599, +3653, -4231, 1522, 1252, -767, -3009, 6347, -5350, 459, 3768, -4188, 2336, -1112, 1259, -2214, 3090, +-2042, -1710, 5054, -4110, -102, 3220, -3619, 1656, 1720, -3576, 1817, 1446, -2391, 248, 2506, -3306, +1235, 2406, -4731, 3701, -1188, 343, -1428, 2660, -2619, 811, 2335, -5535, 6843, -5168, 1859, -203, +1551, -3251, 2195, 1198, -3763, 4301, -3810, 2577, -913, 377, -1706, 3443, -4098, 3714, -3160, 2616, +-1320, -364, 1073, -890, 425, -479, 1514, -2709, 3372, -3857, 4201, -4259, 3972, -2324, -347, 1674, +-877, -99, -1176, 4140, -5385, 3167, 185, -1006, -1160, 2442, -7, -4197, 6124, -4036, -175, 3127, +-2440, -1119, 4239, -4383, 1544, 1947, -3558, 2101, 557, -1120, -1020, 3791, -5232, 4903, -2638, -761, +3230, -3505, 1584, 1679, -4059, 3429, -972, -344, -536, 2040, -1610, -1988, 5625, -5606, 2978, -694, +-46, -890, 2950, -3700, 355, 4614, -5595, 1215, 4175, -4843, 455, 3820, -4460, 1852, 1873, -3212, +637, 3316, -5260, 3255, 986, -4340, 5123, -3216, 162, 1617, -401, -2492, 3339, -776, -2472, 3408, +-2100, 630, -1337, 3928, -4542, 679, 4639, -5984, 1881, 2977, -3238, -289, 2521, -1030, -1616, 1548, +1908, -5264, 4999, -1363, -2241, 2953, -1168, -52, -1563, 4118, -4412, 3071, -2353, 2186, -2008, 1370, +686, -3887, 6273, -6255, 3606, 255, -2635, 2073, 503, -3051, 3341, -801, -2647, 3897, -2151, 346, +-1331, 4900, -7924, 7121, -2334, -3041, 4992, -2151, -3305, 7040, -5061, -2235, 8889, -9640, 4714, 1270, +-3579, 1104, 3444, -5754, 2840, 3503, -7087, 5012, -327, -3583, 5200, -3856, 886, 913, -735, -74, +470, -401, -651, 2320, -2428, -200, 4596, -8301, 8495, -4696, -223, 2322, -1192, 228, -1719, 4174, +-4932, 3054, 205, -1960, 162, 3370, -4958, 3590, -871, -1355, 1861, 12, -2515, 1908, 2023, -5622, +6713, -5830, 3413, -620, 13, -1859, 2848, -203, -4481, 6958, -5214, 1040, 1561, 503, -5522, 8217, +-5525, -350, 3416, -949, -3197, 3779, 822, -6443, 7404, -3741, -47, 759, 1120, -3030, 2995, -1525, +781, -1528, 2232, -1773, 566, 920, -2785, 4717, -4703, 1618, 1474, -1225, -1497, 3443, -2565, -850, +4062, -4431, 2164, 392, -1326, 154, 2439, -3999, 2322, 1620, -4017, 2321, 1245, -2719, 602, 2994, +-4507, 3164, -1134, 489, -1942, 3491, -2305, -1339, 4425, -4429, 1280, 2359, -3182, 289, 3860, -5665, +4021, -665, -1725, 1116, 1608, -3115, 672, 4336, -6374, 2472, 3644, -6395, 3541, 2279, -5049, 1172, +5398, -7216, 1762, 5726, -7970, 3185, 3857, -6647, 2546, 5011, -9131, 6355, -436, -2753, 1368, 1552, +-2332, 336, 1863, -1830, -47, 1691, -1717, 46, 1933, -2496, 1261, 486, -963, -365, 1556, -548, +-1690, 2595, -1129, -1572, 3360, -2833, 560, 1268, -1128, -503, 1984, -2317, 1043, 1863, -4659, 4498, +-872, -3379, 4337, -864, -3866, 4937, -1004, -3976, 5383, -2563, -1187, 2610, -1169, -1547, 3423, -2706, +-756, 4277, -4461, 901, 3087, -4055, 1522, 1553, -1798, -1074, 3930, -3560, 473, 1840, -1361, -454, +1087, -125, -1106, 1772, -1974, 1821, -1566, 1427, -1245, 1004, -704, -99, 1443, -2155, 1288, 336, +-1434, 1418, -574, -345, 576, -143, -270, 66, 473, -277, -195, -300, 866, -31, -1727, 2602, +-1627, -523, 2161, -1955, 352, 562, 723, -3372, 4166, -1605, -1960, 3350, -2018, -60, 801, -228, +-165, -301, 590, 270, -1696, 2444, -1841, 167, 901, -281, -1156, 1544, -43, -2289, 3353, -1938, +-1071, 3216, -2647, 134, 1587, -1114, -581, 1556, -888, -431, 822, -44, -1106, 1568, -534, -1766, +3422, -2785, 591, 866, -629, -408, 1024, -805, 259, -354, 1366, -2229, 1666, -133, -863, 691, +127, -688, 263, 1013, -2110, 1837, -471, -814, 1236, -426, -1144, 2116, -1790, 756, -290, 801, +-1528, 1469, -71, -1980, 2620, -811, -1948, 3213, -1957, -433, 1315, 199, -2250, 2463, -761, -1157, +1731, -1202, 990, -1108, 406, 909, -1348, 453, 845, -1635, 1483, -1015, 892, -1038, 1362, -1697, +1220, 58, -991, 945, -359, -125, -90, 704, -985, 802, -583, 854, -1330, 1100, -341, -19, +-254, 477, -391, 118, 465, -1098, 923, -48, -398, -131, 913, -955, 451, -592, 1529, -2195, +1636, -233, -920, 1189, -637, -113, 153, 554, -1006, 365, 1009, -2133, 2293, -1245, -435, 1412, +-1201, 933, -1706, 3022, -3557, 2516, -184, -2344, 3422, -2202, -225, 1743, -1318, -248, 1258, -639, +-894, 1372, -87, -1650, 2196, -1419, 270, 436, -379, -20, -17, 698, -1563, 1505, -181, -930, +509, 465, -525, -78, 289, 49, -225, -175, 527, -160, -499, 548, -41, -350, 328, -157, +185, -431, 635, -427, -570, 1694, -1735, 460, 1000, -1577, 1206, -533, 76, -199, 766, -997, +475, 4, 225, -506, 202, 234, -228, -22, -158, 895, -1597, 1638, -1022, 356, -465, 1500, +-2418, 1771, 78, -1184, 643, 493, -728, -368, 1849, -2189, 712, 1083, -1082, -523, 1698, -1370, +-43, 1177, -914, -427, 1332, -926, -176, 922, -661, -373, 1013, -314, -1075, 1388, -182, -1079, +1149, -416, -271, 462, -97, -557, 1129, -1224, 621, 257, -664, -78, 1678, -2515, 1425, 544, +-1638, 1199, 363, -1773, 1608, 97, -1954, 2444, -1383, 37, 221, 558, -1235, 849, 356, -1185, +853, 184, -950, 915, -337, -156, 168, 158, -405, 328, -261, 308, -168, -148, 187, 184, +-483, 381, -74, -303, 667, -873, 883, -803, 501, -74, -30, -144, 156, 25, -232, 380, +-529, 796, -1088, 1019, -514, 106, -292, 698, -691, 154, 456, -729, 597, -205, -95, 34, +397, -1156, 1644, -1175, 43, 740, -630, -62, 509, -237, -387, 663, -242, -408, 330, 381, +-649, 230, 123, 11, -380, 481, -95, -553, 772, -200, -759, 1194, -630, -344, 792, -492, +-144, 637, -543, -145, 876, -1071, 590, 50, 50, -1039, 1765, -1433, 432, 404, -553, 66, +336, 10, -853, 1260, -865, 261, -127, 418, -638, 661, -917, 1345, -1140, -92, 1468, -1681, +455, 1079, -1304, -211, 2061, -2387, 621, 1514, -1794, 59, 1615, -1324, -571, 2072, -1633, -289, +1663, -1212, -322, 1263, -739, -698, 1583, -1077, -147, 868, -506, -592, 1500, -1359, 71, 1391, +-1783, 740, 765, -1381, 624, 693, -1452, 967, 438, -1528, 1186, 346, -1637, 1514, -240, -813, +532, 694, -1578, 1032, 697, -2065, 1742, -124, -1221, 1107, 175, -1317, 1198, -125, -717, 738, +-305, -108, 171, 326, -1151, 1499, -777, -686, 1811, -1724, 515, 590, -462, -656, 1591, -1501, +306, 1121, -1582, 685, 646, -1215, 600, 667, -1756, 1823, -546, -1055, 1214, 108, -1230, 1116, +-151, -876, 1240, -717, -22, 148, 271, -603, 573, -432, 106, 460, -629, -89, 984, -1005, +140, 736, -1006, 616, -37, -86, -190, 322, -207, 6, 173, -176, -47, 186, -40, -85, +-56, 319, -609, 721, -523, 234, -1, -319, 510, -246, -243, 343, 184, -862, 842, -72, +-554, 305, 361, -556, 35, 740, -1020, 222, 988, -1354, 526, 670, -1153, 536, 340, -561, +175, 261, -514, 486, -102, -424, 579, -214, -286, 408, -158, -195, 461, -399, -126, 645, +-514, -202, 780, -734, 140, 479, -588, 142, 280, -195, -227, 502, -445, -31, 663, -725, +38, 693, -840, 368, 230, -388, -87, 713, -715, -177, 1212, -1354, 542, 275, -273, -372, +756, -431, -126, 272, 87, -590, 655, -90, -708, 997, -462, -204, 98, 602, -1222, 1256, +-547, -406, 781, -324, -419, 707, -296, -396, 800, -765, 464, -228, 223, -308, 270, -96, +-184, 488, -717, 663, -215, -372, 629, -334, -296, 654, -303, -479, 781, -186, -862, 1440, +-954, -207, 924, -581, -294, 552, 154, -882, 661, 240, -803, 396, 558, -1036, 546, 226, +-371, -104, 392, -132, -207, 115, 203, -234, -195, 675, -684, 153, 466, -518, -305, 1253, +-1211, 176, 674, -626, 41, 395, -385, 65, 233, -326, 300, -280, 196, 42, -328, 228, +376, -900, 762, -216, -161, 84, 326, -700, 638, -151, -199, 19, 244, -23, -613, 1082, +-940, 413, -35, -110, -13, 408, -596, 270, 333, -878, 1023, -671, 149, 150, -144, -42, +176, -95, -56, 39, 86, -110, -50, 291, -488, 420, -50, -185, -214, 857, -872, 216, +350, -519, 493, -416, 295, -227, 268, -288, 104, 178, -285, 200, -111, -43, 343, -462, +76, 537, -874, 702, -177, -235, 193, 143, -436, 330, 218, -762, 848, -530, 96, 200, +-248, 66, 165, -139, -310, 744, -743, 287, 356, -754, 451, 415, -1074, 983, -316, -506, +948, -638, -47, 340, -25, -580, 1012, -821, 60, 600, -636, 212, 38, 93, -167, -151, +515, -593, 425, -67, -365, 510, -187, -318, 455, -160, -63, -56, 197, -41, -330, 555, +-370, -124, 433, -251, -104, 245, -158, -52, 220, -172, -44, 239, -287, 163, 58, -194, +42, 240, -371, 310, -240, 193, -78, -172, 409, -434, 196, 39, -19, -171, 204, -13, +-242, 356, -262, 44, 166, -337, 377, -257, 35, 122, -157, 113, -178, 434, -655, 566, +-172, -341, 570, -286, -254, 470, -142, -380, 611, -361, -171, 521, -368, -207, 719, -689, +179, 331, -514, 228, 261, -424, 88, 354, -450, 159, 51, 21, -176, 140, 50, -190, +160, -47, -1, -159, 440, -613, 585, -369, -26, 399, -537, 337, 5, -125, -30, 130, +-1, -251, 376, -264, -74, 434, -495, 282, -120, 138, -335, 525, -503, 181, 296, -592, +422, 22, -327, 161, 424, -899, 745, -81, -509, 459, 158, -667, 434, 322, -784, 469, +200, -592, 413, 99, -495, 525, -241, -120, 300, -318, 209, -52, -83, 214, -319, 354, +-337, 224, -83, 3, 1, -92, 333, -489, 332, -47, -24, -186, 322, -142, -198, 331, +-111, -254, 413, -242, -33, 75, 88, -141, -170, 649, -864, 518, 175, -548, 172, 417, +-466, -59, 551, -516, -30, 581, -570, -16, 503, -407, -44, 378, -442, 264, 83, -518, +683, -349, -203, 457, -363, 193, -50, 31, -230, 423, -353, 56, 165, -223, 223, -198, +122, -8, -74, 52, 58, -288, 548, -648, 490, -105, -248, 162, 261, -377, -66, 649, +-845, 451, 227, -631, 385, 207, -553, 404, 12, -345, 328, 5, -371, 389, -11, -401, +457, -195, -88, 136, 62, -295, 298, -97, -97, 216, -316, 282, -67, -127, 95, 142, +-402, 464, -338, 168, -134, 305, -445, 304, 41, -356, 387, -156, -69, 84, 84, -251, +220, -31, -42, -139, 347, -380, 226, -12, -139, 172, -74, -104, 149, -44, -56, 42, +67, -220, 282, -166, -147, 422, -343, -99, 517, -505, 92, 322, -463, 313, -65, -84, +37, 81, -78, -17, 8, 80, -94, 34, -25, 76, -159, 220, -213, 122, -48, -1, +166, -324, 133, 170, -108, -244, 451, -308, 4, 175, -165, 26, 111, -141, -8, 249, +-345, 244, -107, 46, -95, 175, -215, 160, -7, -196, 365, -544, 628, -417, 24, 127, +80, -336, 291, 0, -266, 244, -32, -168, 292, -269, 24, 205, -207, 123, -133, 179, +-185, 130, -108, 198, -322, 233, 56, -221, 5, 374, -514, 244, 190, -411, 241, 65, +-226, 172, 37, -287, 410, -359, 196, -28, -98, 102, 3, -136, 145, 21, -212, 230, +-131, 8, 24, 118, -330, 287, 25, -303, 264, -8, -165, 67, 198, -381, 338, -86, +-208, 246, -32, -139, 184, -246, 188, 53, -226, 127, 56, -87, -67, 240, -251, 71, +187, -347, 223, 125, -416, 370, -5, -350, 287, 139, -498, 435, -68, -228, 244, -102, +38, -160, 259, -180, -8, 136, -113, -17, 88, -17, -94, 59, 123, -243, 108, 123, +-209, 115, 24, -113, 33, 144, -237, 126, 104, -324, 364, -149, -218, 347, -79, -257, +269, -4, -194, 124, 89, -290, 258, 67, -438, 411, -21, -262, 184, 51, -259, 252, +-38, -139, 61, 214, -392, 231, 79, -280, 223, -12, -117, 16, 204, -341, 193, 133, +-264, 83, 118, -162, 72, 31, -83, 61, 5, -154, 226, -110, -93, 190, -131, -20, +205, -315, 202, 80, -328, 281, -3, -208, 118, 144, -298, 184, 76, -287, 322, -193, +4, 96, -87, -16, 102, -30, -198, 301, -116, -169, 244, -79, -125, 207, -133, -55, +173, -115, -83, 270, -328, 242, -83, -83, 133, -95, 50, -3, -121, 228, -179, -25, +184, -145, 8, 30, 3, -74, 178, -271, 205, -17, -102, 20, 145, -209, 62, 199, +-382, 301, -35, -173, 131, 55, -116, -68, 301, -343, 176, 12, -105, 42, 68, -75, +-35, 140, -205, 189, -28, -231, 335, -190, -107, 352, -385, 147, 139, -181, -30, 199, +-160, -103, 358, -361, 132, 130, -257, 118, 96, -121, -39, 136, -101, 30, 41, -142, +132, -32, -84, 166, -148, 74, -33, -13, 85, -145, 90, 32, -140, 140, -52, -31, +35, 16, -92, 66, 62, -197, 275, -266, 113, 84, -196, 197, -149, 26, 39, 58, +-209, 248, -193, 62, 59, -101, 56, -34, 71, -171, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17709, 2179, 14924, -3559, 14223, +-2939, -15221, 3379, -13815, 5542, 16363, -2498, 10291, -8396, -14669, 1911, -8819, 11680, 12670, 386, 4567, +-14024, -9713, -3114, 194, 15413, 8188, 3694, -5483, -14810, -4811, -6992, 10161, 14657, 4790, 6153, -15653, +-11116, -4297, -6938, 18649, 11598, 4931, 1744, -20365, -7187, -6259, 776, 19506, 9414, 4451, -7442, -14733, +-7544, -7080, 11131, 15074, 7732, 3045, -14969, -9196, -8369, -2537, 16743, 10382, 6614, -3100, -15788, -6167, +-8200, 5848, 15777, 7126, 5556, -11588, -10938, -7032, -5595, 15091, 10636, 7205, 496, -17265, -5435, -8955, +1925, 17447, 6869, 8198, -8078, -15203, -5129, -9032, 10764, 15382, 7170, 4674, -15194, -10195, -7713, -3536, +16121, 10206, 8549, -1214, -16357, -6958, -10522, 4272, 16570, 7831, 9084, -9943, -13549, -5822, -10191, 12410, +13838, 6860, 5859, -15853, -8539, -7778, -5672, 18225, 8557, 8270, -69, -18934, -3845, -9577, 1300, 19172, +5449, 9249, -7753, -16898, -2911, -11390, 11131, 16726, 3701, 8704, -15548, -10816, -5470, -9348, 18980, 9519, +6908, 5381, -21276, -4102, -8585, -4970, 21627, 5294, 8843, -1217, -18874, -1605, -12442, 3726, 18273, 2507, +11828, -9821, -12735, -798, -13985, 11143, 10854, 3500, 12212, -15582, -6453, -2909, -13001, 17699, 3554, 4883, +10288, -19663, 1436, -5565, -11107, 19857, -1786, 7291, 7856, -21408, 5616, -7621, -7258, 20498, -5906, 8900, +3381, -19989, 10260, -10874, -3907, 19907, -9837, 12167, -806, -18048, 12851, -14669, 2669, 16315, -13001, 16077, +-6424, -13681, 15532, -19222, 7877, 11510, -13340, 18505, -11683, -7544, 15150, -21217, 12369, 5480, -13396, 21472, +-15430, -2645, 14919, -23057, 14016, 762, -9803, 20708, -16710, 2332, 10054, -20187, 14138, -4418, -5174, 18610, +-16380, 6722, 5051, -17845, 14271, -8412, -1021, 16378, -15412, 9558, 963, -16719, 14839, -10924, 1554, 16876, +-15633, 10888, -1315, -18900, 15173, -9638, 4470, 16884, -16380, 10267, -5502, -15616, 13600, -8644, 9426, 12543, +-14582, 9347, -11170, -11000, 13591, -7399, 14014, 6171, -13314, 7361, -15532, -2482, 11063, -5149, 16315, -1264, +-9125, 2819, -16675, 4869, 7679, 793, 13660, -8239, -4186, -4486, -11636, 11247, 3783, 5754, 6207, -10298, +-1112, -11227, -1503, 12206, 2701, 7355, -2482, -7507, -5484, -8557, 7729, 9438, 4576, 2558, -8160, -4642, +-9594, 686, 10744, 6283, 6477, -6421, -6356, -7303, -7971, 12062, 7047, 6648, 3166, -14387, -2619, -9773, +875, 16217, 2756, 7625, -5790, -13249, -4300, -7137, 11658, 11621, 4887, 3476, -14708, -7128, -10069, 1800, +19359, 4298, 8314, -6460, -16259, -4761, -9993, 12096, 17976, 4281, 3869, -14414, -12844, -7493, -606, 17279, +13912, 4717, -5863, -14216, -12861, -6373, 11145, 16220, 11114, 1300, -13401, -11526, -13806, 1379, 16774, 12280, +10410, -6851, -13835, -11520, -11894, 11949, 15266, 11847, 5998, -15624, -10250, -14058, -3429, 19198, 11244, 11807, +-3018, -18328, -8737, -12943, 8504, 18907, 8345, 9115, -13605, -13998, -9925, -6749, 17238, 15113, 8637, -1653, +-16968, -9659, -10313, 4620, 18099, 11802, 5972, -10680, -14176, -12222, -4300, 13975, 15405, 11988, -2789, -15323, +-10660, -13840, 6515, 15931, 12390, 11521, -13869, -11868, -11385, -12063, 17740, 11533, 12421, 8672, -21930, -8194, +-12793, -6195, 22323, 9870, 13782, -1789, -21397, -6489, -15221, 5013, 20332, 9463, 13634, -12386, -16880, -7176, +-14567, 14506, 17224, 9831, 8965, -18549, -11766, -10361, -7839, 19455, 12848, 10970, 1257, -19831, -7276, -13346, +146, 20546, 8707, 12701, -5897, -18951, -5678, -13551, 7034, 18590, 7611, 11558, -11990, -14145, -5692, -13733, +13346, 13408, 7218, 12246, -17497, -9286, -5171, -14470, 18364, 7092, 7825, 13168, -20820, -4088, -5892, -15194, +19964, 4237, 6300, 14243, -21114, -1641, -3793, -16482, 19766, 1486, 3226, 17326, -20301, -2202, 1615, -18164, +16172, 3424, -2789, 18751, -15309, -4079, 7007, -21028, 12150, 5825, -9931, 23322, -11043, -7578, 13366, -21983, +5650, 7945, -15573, 25199, -4031, -11800, 19180, -21728, -2441, 10999, -19065, 23022, 5614, -14654, 19139, -16777, +-11634, 10735, -14558, 17381, 12933, -13172, 12642, -11595, -15788, 8625, -9009, 11991, 17585, -9755, 5337, -6812, +-19977, 7582, -4390, 8656, 22377, -10813, 2595, -6113, -22521, 9256, -2479, 8108, 24136, -11659, 259, -5944, +-23649, 10099, -355, 10172, 22731, -13563, -396, -8426, -21646, 12367, 700, 12201, 19048, -14889, -79, -12185, +-16884, 13117, 534, 17170, 11935, -15624, 1922, -18222, -9741, 15374, -1264, 20403, 5231, -16572, 3006, -21383, +-1857, 14279, 44, 22534, -4274, -14073, 1413, -23052, 7633, 12628, 766, 21452, -12459, -9159, -2563, -21264, +16872, 9067, 3212, 16367, -19322, -3547, -8057, -12565, 21109, 4344, 8164, 4887, -18572, -2114, -11940, 454, +19146, 3486, 8648, -6972, -12090, -6696, -8610, 11734, 12930, 6824, 1499, -12199, -8232, -11399, 3865, 13419, +8144, 10419, -10539, -9041, -9464, -10970, 15413, 9999, 9511, 4948, -16200, -6531, -13701, 210, 18160, 7500, +10735, -6729, -13198, -8248, -11693, 11903, 12636, 9344, 6725, -14660, -7713, -14101, -2218, 17526, 7882, 12212, +-3681, -14955, -7869, -12222, 8580, 14434, 8590, 7601, -12490, -8726, -11770, -4364, 14675, 9468, 11567, -3332, +-13390, -7092, -13110, 8557, 13462, 8173, 8685, -13661, -8607, -10107, -5140, 15166, 9479, 10117, -2202, -14917, +-6467, -11683, 7152, 15302, 7441, 7296, -12708, -9484, -10366, -3466, 15049, 8852, 11103, -3397, -15241, -4543, +-14781, 9540, 14610, 5139, 13516, -17036, -9416, -5762, -12015, 18711, 9955, 7502, 5457, -20549, -5056, -10100, +-1251, 19687, 5919, 11360, -7128, -16614, -3468, -12411, 9700, 15668, 5972, 9380, -15548, -10856, -5377, -8616, +16217, 10560, 7511, 2890, -17693, -5174, -9150, -1598, 17108, 6918, 9414, -5381, -15059, -2298, -12471, 7890, +13929, 3651, 11389, -13212, -10149, -1151, -13099, 14250, 9126, 3002, 10206, -17757, -3622, -2479, -10827, 16772, +2725, 5339, 6643, -18258, 2977, -4840, -9218, 17279, -3573, 7587, 6439, -18411, 8088, -6658, -9778, 17764, +-7960, 7234, 8464, -17234, 10696, -6774, -11436, 17410, -11868, 6498, 13770, -18413, 12636, -4165, -16654, 16777, +-12086, 3065, 18569, -16068, 10359, 2369, -21688, 11343, -7719, -3786, 23568, -10675, 5313, 8699, -23202, 3673, +-2495, -10331, 24911, -1078, -1232, 11884, -20003, -7054, 3054, -11615, 19769, 11188, -7569, 11782, -12236, -18801, +5432, -8019, 11205, 22236, -8546, 5935, -5479, -23173, 3599, -4347, 5337, 27250, -5654, -194, 598, -26186, +878, -83, -128, 30376, -1926, -5592, 3964, -26293, -3274, 3554, -171, 29459, 317, -7685, 2909, -25470, +-4800, 5893, 1164, 28223, 1155, -9359, 1936, -26174, -4472, 8775, 2895, 26848, -348, -10598, 32, -25365, +-1327, 9468, 5585, 24478, -4297, -9473, -2813, -24814, 3463, 10726, 8266, 20394, -9314, -6299, -9487, -20172, +12101, 6632, 12093, 14186, -14544, -1496, -16798, -10273, 16669, 1399, 17628, 3735, -14864, -680, -21773, 4162, +14432, 2507, 18225, -10827, -7365, -6358, -18283, 16115, 9067, 6620, 10059, -16382, -3011, -13939, -5522, 20044, +6425, 10206, -4410, -13828, -5881, -12960, 9782, 15795, 7171, 5353, -13006, -8302, -12686, -2896, 17565, 9485, +11537, -5338, -15650, -7310, -13823, 12076, 15159, 8472, 8552, -15989, -9359, -13172, -4195, 19280, 9677, 12253, +-3670, -16682, -8203, -15251, 11669, 16276, 8311, 11390, -16569, -11068, -12013, -8512, 20759, 12303, 11261, -278, +-19070, -8076, -16320, 6846, 19930, 10031, 11878, -14001, -12595, -13237, -11099, 18346, 13453, 15518, 2078, -20430, +-6944, -19508, 2556, 20864, 9553, 17774, -11161, -16445, -9232, -17627, 14135, 16545, 12543, 11431, -18029, -11099, +-15905, -7860, 20638, 11049, 15575, 466, -19004, -6772, -17980, 2437, 19090, 9567, 14573, -8911, -13942, -9523, +-15735, 13408, 13100, 11626, 10393, -17248, -6455, -13726, -9293, 18963, 6153, 14975, 3794, -19460, -2155, -16705, +-1553, 18957, 4494, 15597, -5135, -15381, -2523, -16646, 6614, 14087, 7118, 12608, -12363, -7442, -8139, -13835, +14670, 7098, 10563, 8779, -17446, -1183, -10813, -9788, 16576, 2451, 13541, 3469, -15129, 1235, -16661, -1625, +14211, -147, 17124, -3838, -10284, 2561, -20648, 5743, 8952, -982, 19492, -8566, -5204, 1271, -20933, 8622, +4271, 1670, 18511, -10762, -878, -792, -20178, 9742, 1054, 2886, 17399, -10273, 1834, -2988, -18706, 10110, +-1714, 4301, 16397, -10216, 3837, -4611, -17403, 10592, -4885, 6153, 16259, -10980, 6795, -6890, -16937, 10558, +-7006, 8695, 15029, -10598, 9322, -9318, -16589, 10444, -9672, 11578, 14424, -10588, 11526, -10542, -16462, 8787, +-11336, 13414, 15490, -10409, 12466, -10680, -19007, 10396, -12533, 10277, 22038, -12463, 10792, -5502, -24460, 10017, +-9173, 5180, 27126, -11854, 6498, -1155, -28084, 8986, -4660, 2974, 27682, -9977, 3390, -1737, -27526, 8338, +-2189, 3905, 26721, -9512, 471, -3768, -24070, 9015, -1709, 6632, 23115, -10520, -423, -6251, -20263, 10119, +500, 8270, 18813, -12024, -2096, -8200, -15285, 12138, 1673, 10485, 11080, -12933, -162, -13028, -6726, 12495, +627, 14853, 1447, -12720, 754, -16657, 3627, 12022, -430, 15583, -8078, -9230, -464, -14901, 11264, 8852, +1198, 10776, -13319, -4320, -5290, -6869, 15247, 4122, 4742, 706, -13065, -1446, -7942, 4340, 13292, 943, +5415, -9096, -7589, -3274, -3541, 12070, 6515, 2853, -569, -12377, -3923, -4486, 5183, 12407, 2381, 3579, +-9918, -8319, -2988, -1960, 12012, 7638, 2295, -1348, -13340, -4172, -3671, 5718, 13589, 1697, 2878, -9252, +-10273, -3463, -153, 12987, 8679, 904, -2595, -13008, -5401, -3372, 6756, 14786, 3147, 1122, -9707, -11288, +-4397, -57, 13705, 10899, 1533, -3211, -12985, -8280, -3833, 6804, 14856, 7330, 440, -8748, -12522, -8494, +938, 12096, 13018, 5565, -4427, -10236, -12505, -6401, 7584, 10789, 13117, 3083, -10539, -7310, -14301, -2243, +12939, 7713, 14138, -2616, -12322, -4902, -16561, 5231, 12964, 5876, 14565, -9388, -9768, -4466, -16012, 10687, +9400, 7047, 12780, -14494, -4859, -6455, -14044, 16149, 4012, 7058, 11487, -17257, -622, -7233, -12095, 18519, +-889, 7305, 11642, -20144, 3272, -6531, -11690, 19180, -3604, 6457, 9913, -18128, 5207, -4849, -10728, 14935, +-3445, 4242, 8900, -13172, 4592, -2891, -8627, 8798, -2198, 1125, 7800, -5422, 1718, -1694, -5227, 432, +55, 1155, 3908, 4039, -2173, -1496, -314, -9164, 1605, 3246, -622, 12280, -2196, -5406, 3246, -13888, +-178, 6651, -3838, 17054, 1072, -10520, 5594, -16473, -4408, 11341, -4911, 18185, 5455, -13769, 3879, -14985, +-9068, 12992, -467, 15609, 8130, -13815, -714, -13006, -10714, 12705, 4699, 13216, 8741, -13200, -4359, -13110, +-9836, 13340, 7669, 13202, 5958, -12983, -6590, -13506, -5892, 12712, 9965, 13007, 1091, -11447, -8373, -14431, +-716, 13337, 11564, 10519, -3111, -10372, -12233, -10811, 6071, 11233, 12896, 6532, -8064, -8092, -14985, -4463, +10520, 8577, 14036, 157, -9897, -8364, -15546, 5115, 10633, 9015, 11802, -8898, -7074, -11175, -10550, 12466, +9100, 9847, 4326, -11747, -6594, -13787, -37, 14494, 8918, 9553, -6399, -10508, -9490, -9725, 10960, 12487, +8631, 3322, -11756, -8837, -11922, -264, 15496, 9833, 9352, -6031, -13549, -9089, -9891, 11991, 13202, 9327, +4646, -14233, -9564, -12383, -430, 17359, 9344, 10417, -5090, -15653, -8898, -11283, 11776, 15165, 8351, 7613, +-14875, -12090, -10868, -4156, 18304, 12596, 9490, -2557, -17087, -9628, -12629, 8210, 17871, 10498, 8498, -13229, +-12779, -12858, -7017, 16974, 13419, 13791, -405, -18300, -8610, -16467, 4601, 18825, 10399, 14400, -11288, -15534, +-10061, -13801, 14016, 15806, 12127, 8314, -16889, -11465, -14864, -4999, 19523, 11151, 13940, -1109, -17970, -7612, +-15871, 3806, 18210, 9765, 12608, -9320, -13701, -9600, -13605, 13334, 13035, 11298, 8643, -16535, -6969, -13350, +-7607, 18149, 6693, 14415, 2493, -18422, -2963, -16173, -308, 17869, 5153, 15139, -5997, -14358, -3309, -16173, +7302, 13139, 7811, 12209, -12756, -6706, -8814, -13384, 14827, 6518, 11174, 8374, -17441, -832, -11288, -9416, +16468, 2288, 13832, 3212, -14946, 1320, -16727, -1655, 13998, -337, 17181, -3361, -10302, 2529, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, +-183, 1537, -3074, 4157, -4161, 784, 5606, -9489, 6801, 1050, -8141, 6234, 5989, -16908, 13935, 2553, +-19672, 22698, -8224, -11159, 19168, -11500, -3517, 13982, -13298, 4749, 6130, -17953, 24933, -16501, -5295, 24320, +-27412, 11442, 14746, -30594, 21655, 3185, -22542, 25541, -15381, -177, 13823, -20578, 18209, -5832, -12644, 24483, +-18540, -61, 15959, -18684, 8580, 4403, -9610, 5529, 3278, -11998, 14621, -8805, 645, 5665, -10080, 8364, +-580, -4171, 3250, -2199, 1475, -211, 829, -1036, -1030, 2980, -5396, 7361, -3546, -4080, 5558, 2805, +-14442, 19323, -12003, -2793, 15024, -15484, 3041, 10652, -13788, 6314, 4332, -10953, 11379, -9634, 7219, -115, +-7297, 6336, 1325, -8267, 7393, 2650, -13772, 17002, -10647, -1057, 8065, 414, -14898, 15281, -2737, -7916, +9251, -1503, -9829, 14535, -7529, -5430, 15357, -15941, 8311, 1262, -8540, 8689, -158, -8242, 7936, -1937, +-4162, 9489, -10381, 4651, 2102, -3681, -328, 4608, -4329, -123, 4317, -4825, 1874, 2042, -3549, 1637, +1712, -3420, 619, 4365, -7811, 10342, -9688, 1448, 9639, -12865, 5863, 5154, -12736, 9015, 6215, -20826, +22207, -9727, -5227, 11025, -5078, -5994, 10899, -4633, -5001, 7238, -1709, -3893, 3875, 2111, -8178, 7216, +784, -8791, 9386, -1755, -6562, 6632, -233, -3710, 4719, -6263, 6159, -3309, 2105, -4263, 2543, 5338, +-9015, 2032, 9942, -18026, 15990, -734, -19382, 25416, -9924, -12150, 19235, -6972, -9535, 15368, -8504, -3309, +9465, -4267, -5898, 10156, -4686, -6772, 14237, -7923, -8596, 20178, -18440, 7846, 4268, -10143, 5405, 4108, +-10759, 10990, -4297, -3706, 6769, -4175, -3651, 11762, -9044, -6818, 22214, -20069, 12, 18398, -18631, 3256, +14478, -21671, 12715, 3613, -10259, 380, 13215, -13356, -875, 15571, -16683, 3927, 9352, -10875, 627, 10700, +-11888, -907, 19382, -24787, 7885, 15523, -22059, 8980, 7211, -13468, 9745, -2017, -5386, 9926, -7550, -4476, +18023, -17128, 167, 15693, -16944, 6691, 5313, -12722, 10784, 776, -13284, 15291, -3157, -16041, 28785, -22430, +-1186, 23846, -27681, 12111, 8050, -17491, 10105, 6028, -17836, 18461, -5650, -13667, 21882, -8782, -11714, 18465, +-10260, -994, 8242, -8772, 900, 10468, -15940, 11718, -1261, -7427, 7042, 1256, -6384, 1917, 4962, -8496, +9420, -7022, 2921, -2425, 5722, -7916, 6913, -4402, 2085, 415, -4119, 6661, -2926, -5800, 8030, 1403, +-10386, 9537, -4274, -871, 4378, 997, -14853, 20805, -8625, -9991, 17065, -9062, -3142, 8597, -5228, -520, +2368, -2436, 3676, -4805, 6702, -9589, 9439, -3563, -4534, 7042, -1058, -5117, 3440, 2673, -7274, 7302, +-2533, -1180, -781, 5316, -7778, 6990, -3105, -1412, 2338, -2880, 6743, -7282, 1845, 4016, -8214, 9034, +-1632, -9978, 12164, -2343, -7640, 8117, 1181, -12072, 12057, 2873, -18126, 17971, -5388, -7839, 14547, -12369, +1293, 13755, -21700, 14153, 3285, -12752, 6279, 3663, -6714, 5548, 333, -13856, 24103, -15737, -4235, 14455, +-11377, 6668, -3701, -2770, 11043, -13898, 11356, -4717, -8324, 20885, -18474, 953, 13995, -13765, 1330, 12182, +-14161, 1659, 11901, -11214, -1406, 10752, -7715, -5582, 17260, -15203, 2984, 6332, -6266, -280, 6211, -4894, +-2799, 8418, -7940, 4526, -2029, 2097, -3575, 2652, 2841, -7974, 6143, 511, -2892, -317, 1908, -1167, +2417, -3496, 323, 3823, -3777, 885, 858, -1232, 1870, -1761, 244, -279, 1094, 1471, -5224, 5602, +-2943, -1225, 5692, -6013, -2, 6748, -6944, -1504, 10541, -8912, -884, 6579, -4437, -214, 4460, -7376, +5858, 250, -5951, 7030, -2924, -2630, 5127, -4034, 885, 3532, -6925, 4480, 4107, -11035, 8903, 982, +-9967, 10497, -2800, -6310, 9862, -5771, -1836, 6914, -6731, 2414, 2778, -5486, 3401, 2057, -6120, 5629, +-1889, -2285, 5587, -6749, 4067, 1651, -5897, 4572, 1340, -6381, 6276, -2230, -1941, 3222, -381, -4093, +5520, -2814, -1404, 4761, -5207, 2130, 1568, -2253, -98, 2907, -3879, 2466, 170, -2189, 2276, -621, +-1055, 958, 721, -2227, 2087, -258, -1516, 1787, -444, -1717, 3066, -1888, -949, 2613, -2175, 306, +1989, -2929, 1167, 2237, -4436, 3799, -1903, 621, 682, -2572, 2410, 1002, -3595, 2546, 85, -1784, +2361, -2072, 385, 1651, -2005, 259, 1820, -2296, 1568, -808, -163, 1865, -3120, 2497, -248, -2687, +5035, -4509, 541, 3634, -4235, 1361, 2120, -4072, 3767, -1460, -2163, 5243, -4822, 818, 3144, -4015, +2068, 1122, -3833, 3801, -582, -3178, 3934, -1019, -2577, 3559, -1608, -1462, 3400, -2639, -206, 2315, +-1800, -260, 2155, -2843, 1700, 415, -1760, 1792, -818, -791, 1892, -1518, 263, 735, -968, 369, +692, -1057, 449, 251, -219, -577, 1185, -194, -2088, 3355, -2112, -268, 1681, -1553, 223, 1351, +-1592, -110, 2253, -2797, 1578, -32, -939, 1734, -2083, 865, 1374, -2427, 1230, 1002, -2672, 2485, +-400, -1806, 2092, -142, -2460, 3476, -1824, -1151, 3202, -3149, 1210, 1421, -2795, 1791, 629, -2323, +2237, -1014, -390, 1346, -1207, -231, 1656, -1325, -268, 1298, -937, 110, 139, 110, -560, 919, +-755, 488, -749, 1009, -726, 197, 294, -646, 483, 85, -444, 381, -52, -88, -309, 797, +-532, -444, 1014, -602, -154, 371, 120, -638, 391, 414, -870, 595, 147, -637, 274, 574, +-866, 341, 219, -28, -653, 855, -28, -1058, 1297, -609, -226, 600, -238, -658, 1246, -740, +-284, 757, -293, -495, 682, -148, -597, 812, -199, -701, 1055, -501, -124, -28, 289, -176, +168, -498, 726, -348, -595, 1394, -1150, 23, 900, -1127, 709, -12, -580, 918, -844, 297, +352, -525, 251, 265, -922, 978, -110, -835, 1155, -743, 2, 619, -651, -284, 1500, -1564, +181, 1312, -1618, 866, 265, -934, 476, 629, -1334, 1191, -577, 100, 85, -298, 546, -289, +-720, 1535, -1169, -103, 1015, -782, 166, -129, 506, -469, -313, 1132, -1091, -40, 1462, -1883, +903, 725, -1816, 1559, -142, -1436, 1865, -738, -899, 1702, -1101, -156, 1072, -1200, 579, 263, +-743, 637, -32, -703, 919, -199, -749, 1023, -585, -134, 536, -178, -568, 944, -729, 332, +-196, 413, -646, 464, -258, 394, -492, 217, 47, 23, -149, 109, 167, -692, 789, -7, +-953, 1035, -32, -1224, 1693, -904, -579, 1573, -1276, 28, 865, -561, -311, 783, -524, -27, +389, -296, -122, 340, -274, 236, -61, -236, 149, 304, -384, 102, 5, -49, 236, -433, +279, 282, -590, 224, 354, -502, 161, 148, -113, -221, 551, -527, 124, 274, -389, 280, +13, -490, 706, -314, -311, 612, -491, 175, 180, -488, 563, -221, -303, 478, -275, 119, +-5, -195, 304, -156, -86, 346, -444, 201, 134, -110, -226, 626, -792, 459, 100, -413, +354, -7, -464, 676, -298, -394, 813, -750, 317, 196, -428, 250, 173, -646, 852, -509, +-234, 798, -781, 357, 144, -474, 502, -284, -55, 340, -376, 255, -132, -32, 194, -76, +-236, 289, -55, -81, 57, -42, 91, -64, -69, 201, -147, -31, 221, -449, 565, -178, +-507, 755, -306, -357, 637, -321, -341, 740, -500, -168, 648, -469, -144, 497, -212, -336, +495, -149, -294, 527, -440, 66, 202, -125, -98, 221, -220, 134, 11, -100, 46, 162, +-444, 417, 91, -531, 409, 83, -430, 337, 107, -517, 598, -314, -187, 549, -417, 27, +146, -56, -68, 157, -163, 120, -168, 229, -165, 23, 129, -275, 251, 23, -284, 161, +205, -471, 452, -185, -54, 47, -23, 148, -151, -114, 357, -262, -128, 535, -595, 187, +357, -627, 468, -15, -342, 313, 18, -346, 422, -272, 100, 13, -52, 22, 23, 3, +-71, 65, -40, 74, -83, 3, 97, -138, 110, 41, -335, 464, -226, -168, 323, -74, +-360, 590, -372, -102, 446, -486, 226, 146, -316, 95, 224, -284, 163, -129, 168, -153, +113, -152, 151, 40, -294, 318, -36, -270, 298, -61, -207, 318, -176, -97, 303, -259, +16, 258, -333, 100, 321, -561, 379, 47, -354, 260, 202, -619, 575, -52, -501, 585, +-160, -357, 511, -236, -206, 519, -525, 245, 167, -535, 609, -223, -343, 584, -328, -133, +464, -515, 317, 18, -294, 307, -30, -260, 217, 93, -336, 389, -235, -86, 369, -246, +-251, 627, -507, 86, 270, -345, 161, 85, -158, 69, 12, -12, -40, 105, -95, 31, +25, -113, 186, -125, -40, 199, -212, 28, 274, -493, 469, -197, -219, 498, -337, -103, +394, -308, 5, 240, -259, 74, 142, -221, 105, 125, -226, 57, 212, -308, 175, -12, +0, -100, 158, -61, -88, 144, -41, -157, 312, -265, 50, 177, -265, 156, 105, -298, +180, 158, -396, 343, -46, -246, 226, 115, -389, 272, 70, -277, 196, 51, -249, 288, +-195, 1, 201, -265, 137, 80, -270, 337, -186, -171, 467, -390, 5, 345, -362, 60, +307, -477, 346, -18, -241, 205, 40, -211, 166, -34, -13, 5, 31, -65, 57, -20, +-28, 49, -10, -20, -57, 175, -139, -31, 188, -207, 74, 117, -202, 102, 50, -100, +28, 42, -23, -100, 225, -226, 100, 30, -79, 37, 46, -54, -45, 83, 3, -114, +97, 85, -323, 396, -219, -23, 125, -18, -195, 312, -216, 23, 153, -284, 308, -202, +54, 57, -73, 0, 69, -75, 45, -27, 54, -128, 154, -55, -104, 194, -211, 157, +-37, -73, 84, 28, -183, 255, -161, -20, 143, -115, 7, 40, -5, -74, 138, -107, +1, 55, 36, -230, 359, -274, 51, 129, -201, 139, 15, -131, 131, -75, 34, 1, +-70, 202, -280, 156, 79, -212, 143, 80, -289, 280, -80, -78, 95, -42, -27, 84, +-76, 13, 5, 22, -10, -84, 156, -114, 18, -3, 98, -129, 0, 154, -137, -79, +320, -289, -42, 362, -359, 110, 114, -187, 102, 49, -102, 20, 91, -112, 13, 81, +-62, -42, 162, -221, 152, 68, -275, 277, -105, -84, 205, -158, -3, 161, -183, 84, +39, -100, 57, 76, -170, 103, 66, -146, 47, 95, -142, 76, 66, -207, 236, -119, +-18, 55, -27, 3, 50, -139, 165, -91, -18, 86, -65, 45, -42, 5, 52, -62, +15, 36, -68, 73, -31, -20, 39, -13, -54, 143, -158, 37, 166, -259, 128, 123, +-302, 272, -37, -223, 279, -98, -122, 176, -61, -86, 156, -105, -8, 105, -64, -98, +202, -129, -46, 175, -187, 110, 0, -91, 88, -3, -59, 47, -5, 0, -42, 74, +-37, -57, 122, -129, 95, -25, -46, 100, -76, -47, 178, -211, 183, -104, -57, 214, +-194, 41, 79, -105, 70, 3, -95, 166, -160, 81, -13, -7, 13, -13, -1, 18, +-45, 57, -31, -32, 91, -84, 21, 28, -34, -3, 51, -37, -27, 49, -12, -10, +-13, 51, -79, 69, -13, -22, -1, 75, -91, -28, 230, -249, 13, 246, -284, 93, +151, -258, 187, -15, -123, 119, 0, -83, 47, 7, -7, -46, 76, -21, -76, 120, +-68, -50, 153, -139, 2, 158, -192, 66, 64, -68, -27, 85, -40, -46, 78, -13, +-78, 109, -57, -40, 109, -79, 3, 47, -41, 10, -6, 11, 20, -52, 47, -12, +-18, 50, -31, -16, 54, -56, 18, 37, -50, 7, 49, -70, 18, 120, -197, 91, +110, -215, 125, 100, -293, 280, -59, -212, 308, -134, -134, 246, -137, -39, 141, -129, +79, -28, -18, 46, -31, -13, 80, -91, 23, 50, -65, 27, 42, -78, 40, 31, +-60, 71, -65, 21, 16, -23, 16, 15, -46, 25, 6, 3, -57, 71, 0, -104, +131, -60, -30, 76, -42, -27, 95, -114, 40, 66, -104, 28, 64, -78, 13, 86, +-137, 66, 69, -115, 16, 109, -119, 13, 88, -102, 23, 57, -78, 22, 70, -138, +133, -50, -56, 125, -104, 13, 95, -152, 119, -11, -120, 221, -212, 66, 97, -154, +89, 32, -125, 107, 3, -105, 109, -34, -41, 91, -83, 13, 52, -73, 36, 20, +-61, 55, -23, -12, 23, 15, -95, 107, -13, -100, 131, -71, -6, 51, -55, 27, +20, -66, 54, -3, -28, 20, 1, -8, 3, -3, 0, 40, -64, 13, 80, -110, +28, 93, -133, 66, 39, -103, 65, 27, -86, 60, 21, -86, 80, -41, 1, 20, +-11, -74, 166, -139, 13, 83, -86, 18, 66, -84, 3, 103, -142, 71, 23, -62, +40, -1, -50, 112, -115, 54, 23, -65, 52, -7, -18, 23, -8, -8, 15, -13, +28, -42, 36, -11, -13, 15, 3, -15, 7, 5, -18, 18, -6, -7, 3, 18, +-30, 31, -36, 12, 50, -93, 50, 27, -51, 3, 59, -89, 65, -13, -22, 49, +-49, 8, 27, -25, -13, 47, -37, 8, 12, -18, 2, 31, -42, 7, 42, -57, +34, -3, 0, -2, 36, -94, 89, 5, -98, 78, 23, -112, 91, 1, -91, 131, +-104, 11, 71, -71, 10, 34, -57, 74, -46, 0, 32, -23, 0, 18, -32, 46, +-45, 11, 42, -62, 23, 50, -81, 13, 81, -117, 57, 37, -76, 40, 20, -54, +36, 7, -42, 34, -2, -39, 50, -8, -47, 62, -6, -86, 129, -70, -20, 59, +-34, -11, 39, -28, 0, 21, -25, 13, 0, -8, 3, 6, -25, 34, -34, 18, +7, -23, 5, 25, -23, -21, 60, -47, 10, 25, -47, 30, 31, -104, 104, -20, +-74, 95, -40, -31, 57, -31, -13, 66, -70, 20, 30, -39, 0, 46, -49, 0, +64, -78, 22, 55, -66, 5, 61, -76, 25, 42, -62, 11, 56, -84, 37, 56, +-110, 68, 7, -57, 55, -18, -23, 39, -49, 36, -3, -25, 34, -13, -10, 27, +-15, -13, 41, -37, 7, 15, -23, 18, -3, -8, 13, -3, -13, 37, -40, 15, +23, -49, 30, 11, -42, 31, 11, -56, 50, -1, -39, 32, 0, -21, 30, -16, +-11, 25, -13, 0, 12, -8, 0, 11, -10, 2, -3, 3, -1, 1, 0, 10, +-31, 28, -3, -10, 11, -3, -5, 7, 0, -23, 21, 3, -16, -7, 39, -32, +5, 18, -25, 13, 11, -49, 47, -10, -25, 47, -47, 18, 15, -34, 31, -20, +1, 5, -7, 3, 1, -3, 0, 5, -3, -18, 28, -13, -30, 50, -28, 0, +18, -11, 0, -5, 13, -7, -3, 15, -10, 1, 7, -6, 0, 3, -6, 22, +-32, 18, 18, -28, 13, 5, -12, 6, 6, -15, 10, 3, -11, 7, 0, -3, +3, 0, -3, 3, 0, 0, 0, 10, -23, 15, 2, -10, 0, 20, -27, 13, +0, -7, 2, 3, -5, 3, 0, -2, 0, 0, 3, -6, 3, 0, -3, -2, +25, -31, 11, 18, -27, 15, -3, 0, 0, 1, -3, 8, -18, 20, -8, -2, +5, -2, -1, 0, 2, -5, 3, 2, -3, 0, 13, -10, 2, 2, -3, 2, +10, -18, 10, 2, -12, 10, 0, -3, 3, 0, -3, 10, -5, -5, 12, -6, +0, 6, -3, -6, 21, -15, -12, 47, -55, 23, 13, -28, 13, 3, -13, 7, +0, 0, 0, 0, 0, 0, 6, -15, 12, -5, 3, -3, 0, 0, 0, -3, +3, 0, 0, 0, 0, 1, -10, 13, -7, 3, 0, -3, 3, 0, 0, 0, +0, -1, 0, -2, 11, -12, 5, 0, -5, 7, -2, -5, 11, -5, 0, 3, +-1, 0, 2, -1, 0, 3, -8, 3, 0, -1, 0, 0, 0, 3, -2, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 11, -3, -6, 18, -11, 0, +5, -3, 0, 3, -2, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, +0, -2, 8, -7, 2, 0, -2, 7, -3, -2, 8, -3, 0, 3, -5, 2, +0, -2, 0, 0, 0, 3, -3, 0, 2, 0, -2, 3, -1, 0, 3, -6, +3, 3, -7, 3, 3, -13, 12, -3, -2, 3, 0, -2, 3, -2, 0, 0, +0, 0, 0, 0, 0, 1, 3, -10, 8, -1, -1, 5, -5, 3, 0, -3, +3, 0, -3, 6, -3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, +-1, -5, 12, -6, -1, 6, 3, -23, 20, 12, -47, 42, -11, -18, 22, -3, +-15, 25, -12, -2, 10, -5, -2, 8, -5, 0, 2, -2, 0, 1, 0, 0, +0, 0, 0, 0, 0, 0, 7, -23, 20, -6, -10, 16, -8, 0, 8, -6, +0, 3, -5, 1, 1, -3, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-2, 3, -1, 0, 0, 0, 0, 0, -3, 3, -1, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 5, +-2, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -5899, 4539, 11011, 20394, 28451, 28688, 28549, 22214, 16636, 11822, 8106, 5506, +-327, -6705, -11681, -13968, -12639, -11946, -13952, -19727, -25577, -26798, -23630, -17860, -13801, -12541, -13767, -12334, +-6479, 1589, 10227, 14614, 16017, 16672, 19778, 25883, 29135, 29135, 25435, 20154, 18310, 21012, 22717, 18695, +9232, -392, -6776, -7792, -7062, -9431, -16056, -24028, -29246, -29246, -29246, -27844, -26333, -26242, -24411, -20830, +-14472, -5800, 1801, 5778, 7583, 11588, 18565, 26694, 29135, 29135, 25706, 21860, 22910, 27336, 29135, 28280, +21612, 12849, 6174, 3187, 1162, -3368, -11307, -19215, -24394, -26861, -27258, -28531, -29246, -29246, -29246, -27759, +-16890, -9554, -3623, -2715, -1662, 1012, 6018, 14482, 19028, 19897, 19004, 19623, 24060, 28623, 29135, 27310, +21727, 18468, 17973, 17802, 14124, 6234, -2892, -10289, -14992, -17222, -19241, -23245, -28200, -29246, -29199, -24369, +-17905, -12128, -9502, -8501, -6295, -2799, 1835, 5856, 6403, 5283, 5385, 8037, 13343, 17439, 18129, 16778, +16743, 18522, 21405, 24159, 23002, 17384, 10062, 4090, -152, -3746, -7689, -14461, -22995, -27667, -27327, -23509, +-19360, -17080, -15061, -11955, -6776, -212, 4425, 5707, 3993, 1697, -50, 87, 3416, 6887, 8004, 7458, +8826, 13078, 18174, 21455, 20130, 15070, 10790, 9865, 10140, 7607, 515, -8784, -16548, -20897, -21647, -18619, +-14851, -13349, -12399, -9500, -5367, 310, 6479, 8878, 7285, 4200, 1580, 772, 282, -3232, -8335, -11160, +-8114, 44, 8419, 12738, 12105, 10274, 10730, 12442, 14848, 16365, 14091, 7936, 175, -6757, -11570, -14670, +-16568, -16452, -13742, -9011, -3193, 1509, 2200, 401, 138, 1922, 4768, 6213, 5002, 749, -4994, -10362, +-13477, -11853, -6426, 310, 5789, 8242, 9398, 12057, 14197, 13952, 12396, 10258, 9186, 8502, 4336, -3976, +-13966, -21230, -22648, -17459, -7913, 537, 4336, 2907, 517, 322, 2547, 7868, 10546, 7983, 3716, -1241, +-4490, -7257, -11825, -14761, -12951, -4587, 6247, 14331, 15909, 10080, 4678, 3383, 5410, 10408, 12224, 8804, +59, -10379, -17428, -21328, -19241, -12330, -4544, 1509, 3885, 7023, 9446, 8114, 7198, 6063, 5665, 6569, +7362, 5940, -2114, -12329, -19509, -19191, -10302, 1230, 11887, 14539, 8516, 3301, 1611, 4013, 8264, 9189, +6106, 891, -4261, -9279, -15600, -22157, -23491, -15911, -3662, 6921, 14919, 16720, 10434, 4678, 2041, 4884, +11802, 13220, 9424, 839, -8945, -14502, -16477, -13429, -7243, 1371, 9930, 13140, 14206, 10235, 2629, -429, +-474, 2752, 5631, 4075, -2075, -13451, -23119, -28610, -25888, -12565, 1066, 10351, 12831, 10646, 8214, 4248, +5244, 10263, 10892, 9506, 6892, 4278, -508, -8716, -14756, -14560, -5427, 7246, 17690, 22657, 17056, 6593, +-3288, -7407, -955, 5026, 2687, -4641, -14002, -20194, -24741, -28070, -23816, -12900, -780, 7090, 13407, 17880, +13471, 7715, 4808, 5249, 9647, 12807, 14042, 8106, -2862, -11129, -16579, -10507, 3059, 13101, 17035, 13510, +10080, 6247, -1083, -2335, 110, 212, -2568, -6872, -9882, -15439, -24493, -29246, -25836, -11140, 1408, 10326, +15736, 13220, 7747, 1256, -418, 8253, 14370, 13109, 7653, 429, -2780, -7005, -10051, -5198, 5116, 14260, +16938, 18038, 17204, 9200, -1617, -7998, -5280, 690, 65, -5812, -13494, -20741, -28687, -29246, -22382, -7799, +2318, 7710, 8847, 10451, 8532, 3705, 4997, 10393, 13711, 11644, 8233, 6349, 2585, -4773, -11598, -7138, +8275, 18075, 18926, 14979, 10778, 4248, -7574, -9995, -2711, -709, -5732, -13660, -17936, -19168, -25052, -27443, +-18920, -4241, 5529, 9197, 13200, 14744, 12260, 5863, 1077, 7509, 15734, 15632, 9619, 2879, 22, -6991, +-10490, -675, 11720, 15892, 11530, 6640, 6895, 2293, -7070, -11061, -7650, -4440, -8382, -13440, -14599, -16146, +-23030, -26625, -15852, 1009, 10283, 14275, 14065, 15290, 13437, 4380, 4261, 13326, 17255, 10592, -530, -2527, +-307, -5079, -9712, -4151, 9169, 13272, 9500, 6482, 6247, 2160, -9355, -14240, -5888, -197, -5260, -13490, +-16466, -15626, -20813, -20811, -7780, 5908, 10923, 10304, 9768, 13973, 13830, 6435, 3269, 9935, 13886, 7170, +-44, -1340, -98, -6850, -12156, -1079, 13531, 15117, 8544, 2406, 3424, -33, -8527, -9590, -3249, -1476, +-10207, -19291, -18508, -14495, -18228, -19429, -7220, 8575, 13375, 12908, 13073, 16984, 16127, 4703, 902, 11644, +16636, 8462, -4293, -6928, -2480, -6417, -7217, 2112, 11441, 9865, 1866, -1520, 2127, 1284, -7890, -11839, +-4377, -1100, -7673, -14692, -15290, -11754, -16281, -16752, -1345, 13516, 15156, 10914, 7769, 13162, 12818, 3500, +2782, 10244, 10900, 435, -8238, -5893, -601, -4256, -6867, 3467, 14582, 13279, 6081, 299, 2330, 214, +-9653, -10060, -1713, -562, -10464, -20861, -19229, -12119, -13527, -12483, -452, 10643, 10923, 6573, 6278, 13324, +13661, 3571, 1431, 10535, 13321, 6137, -3597, -4946, -981, -4163, -1461, 10646, 16438, 11655, 1263, -4247, +593, 1504, -6858, -10320, -5294, -6561, -16140, -22298, -19429, -12684, -14353, -13641, 31, 12219, 13881, 8897, +5856, 11921, 11724, 3736, 6647, 14953, 14339, 3399, -6422, -3869, 2678, 2941, 4375, 10682, 13672, 8214, +-542, -4386, -426, -992, -11389, -13230, -6244, -5402, -14255, -24152, -22560, -15009, -14367, -9296, 3603, 12546, +12676, 6041, 4700, 12959, 15511, 10057, 9653, 12729, 10159, 2437, -2754, -1807, 2242, 1079, 2842, 10782, +14435, 9995, -1541, -8733, -5775, -4267, -9290, -9593, -6191, -8553, -18333, -24109, -19834, -10215, -7407, -4499, +3377, 9016, 9721, 6426, 5156, 10360, 10603, 4531, 7189, 13279, 13992, 5897, -2946, -2977, 3515, 7064, +10360, 13451, 13024, 5080, -6521, -10591, -4358, -862, -8479, -12128, -10747, -12984, -18707, -23180, -20262, -11151, +-8750, -3945, 5054, 12373, 13935, 8154, 3835, 7551, 10380, 10570, 13522, 15029, 10626, 1669, -3042, 56, +8968, 10801, 8707, 7665, 6533, 1269, -7008, -11700, -8830, -7981, -11652, -10384, -7206, -9701, -16872, -21529, +-18887, -9254, -2864, 3198, 8425, 11381, 9690, 4983, 3331, 9975, 14017, 11002, 8597, 8411, 7271, 2932, +-2106, -1684, 4924, 7056, 7760, 9455, 10187, 3660, -7282, -13471, -9684, -5155, -5786, -6612, -9126, -14929, +-19026, -20510, -15258, -4499, 709, 2585, 4502, 7585, 8802, 6204, 3320, 5832, 7263, 8052, 10914, 12529, +9469, 2763, -3953, -2819, 7322, 12671, 11486, 8657, 4468, -2112, -8804, -10883, -5849, -3984, -6861, -9288, +-11138, -14160, -17045, -17866, -13912, -6638, -511, 4468, 8369, 10682, 9161, 3705, -525, 3238, 9401, 11596, +10094, 6210, 2941, 732, -1478, 2582, 10929, 13386, 10246, 6470, 4155, -752, -7970, -11449, -10014, -7647, +-6510, -5721, -8289, -13652, -16079, -17041, -12976, -3357, 4663, 8123, 7276, 5922, 5082, 2370, 2061, 6115, +9067, 8072, 5356, 4118, 3255, 1221, -1736, -913, 6005, 11757, 11839, 9327, 4972, -1889, -9081, -12040, +-8041, -3826, -3458, -5984, -11374, -14257, -14871, -12962, -6932, 178, 5871, 6711, 5510, 5964, 4912, 1405, +-1937, -1263, 3623, 6686, 6417, 3424, 1965, 486, -1637, 2194, 10665, 15040, 13185, 7673, 2570, -2318, +-6513, -6917, -5223, -3775, -4785, -7998, -11808, -15011, -15710, -14027, -11015, -3659, 4239, 7520, 7503, 6479, +4140, 401, -1009, 2655, 7574, 8318, 4961, 1634, 1278, 1753, 3295, 6576, 11076, 13717, 11429, 6802, +2302, -4258, -9115, -11666, -10515, -6267, -5280, -7628, -11875, -14008, -14147, -12645, -7226, 1643, 7913, 8264, +6052, 5268, 3377, 2158, 1971, 2765, 5393, 6078, 4663, 2918, 1592, 1479, 1827, 3459, 9310, 13437, +11949, 7382, 1351, -5508, -9992, -11084, -8855, -6351, -7200, -10849, -13598, -14435, -12580, -7805, -2952, 3260, +7842, 7924, 7475, 6388, 3111, 333, -1713, 314, 5048, 7220, 6405, 4700, 2556, 1951, 4194, 7656, +11729, 12023, 7682, 2505, -2151, -7494, -10436, -11864, -11510, -9325, -9067, -9788, -11002, -12362, -10455, -7661, +-3540, 5002, 10615, 11344, 10244, 7155, 2593, 621, 1663, 3402, 4142, 3608, 3506, 3575, 2090, 3258, +5914, 6827, 8945, 9596, 7019, 3642, -2949, -10017, -13674, -15355, -13032, -9980, -9130, -8929, -9833, -10704, +-8346, -3820, 2197, 8640, 10665, 9627, 9531, 8329, 5320, 3563, 2078, 2002, 2644, 2916, 4389, 4226, +910, -55, 837, 3042, 7334, 7829, 5144, 1083, -4866, -10031, -12074, -12059, -11064, -10447, -10377, -8705, +-7073, -6521, -2994, 789, 4142, 8897, 11035, 12238, 12660, 8026, 1239, -2544, -2440, 61, 491, -166, +1256, 1645, -55, 1354, 3552, 5382, 7014, 5441, 3342, 1846, -2395, -7178, -10008, -11386, -9972, -8951, +-8238, -5449, -4751, -5944, -4903, -2669, 2330, 8406, 11028, 10787, 9367, 5517, 995, -480, -681, -871, +-2361, -3091, 279, 3357, 3312, 4196, 4041, 4714, 7124, 6960, 5775, 3161, -3080, -9206, -13041, -12919, +-10209, -9389, -8730, -6346, -4176, -3173, -1360, 1304, 5783, 8824, 8165, 7936, 9630, 7416, 1799, -2604, +-4211, -2916, -2592, -1987, 1345, 2808, 1516, 1509, 1719, 4683, 7710, 6323, 3990, 2743, -471, -5370, +-9686, -10806, -9967, -10421, -10133, -6426, -2417, -901, -424, 214, 3727, 7472, 8606, 9401, 9749, 5104, +-1606, -5170, -4403, -2032, -2064, -2629, 152, 3433, 4740, 5076, 4708, 6148, 6388, 3407, 2169, 3071, +593, -5226, -11287, -12682, -10557, -9842, -8756, -5283, -2570, -2304, -2940, -1249, 4386, 8943, 8406, 6881, +7978, 6578, 2030, -2162, -3193, -2581, -3628, -3218, 1433, 5526, 6375, 4944, 3308, 5125, 6915, 4935, +2653, 2123, -1071, -8023, -13890, -13814, -11480, -11033, -10377, -6569, -1844, 432, 432, 1889, 5586, 7535, +6293, 6736, 9891, 8861, 2659, -3173, -3659, -1340, -582, -141, 2259, 5132, 5597, 3402, 2237, 4443, +5345, 1187, -1926, -825, -1654, -7440, -13466, -14393, -12891, -12178, -10120, -4567, 1561, 3954, 2729, 3100, +6799, 10561, 10399, 8742, 8618, 6321, 658, -4053, -4584, -2751, -2473, -2952, 184, 5475, 7944, 5597, +2947, 3141, 2912, -296, -2335, -1006, -1634, -8077, -14497, -14596, -11502, -9135, -7378, -3433, 1639, 3448, +2528, 3640, 7311, 10252, 8513, 6304, 7399, 7570, 2992, -2879, -4920, -3876, -2955, -1753, 1985, 7211, +8660, 4855, 1810, 2333, 3465, -95, -3984, -3750, -4805, -10484, -15453, -15351, -12388, -10201, -8077, -3045, +3939, 8004, 7313, 6435, 7755, 10173, 9656, 8162, 8569, 7472, 1875, -3610, -4935, -2830, -1057, -1628, +-72, 4572, 6552, 3623, 308, -59, 249, -2901, -5212, -4016, -3789, -8495, -13854, -14670, -11791, -8363, +-5395, -670, 5473, 8513, 7730, 6949, 8668, 11834, 10570, 6867, 5616, 5006, 1034, -3993, -6041, -4304, +-2613, -2174, 495, 6089, 8761, 4924, -132, -1354, -191, -2601, -5737, -5384, -5432, -9567, -13725, -13833, +-9955, -5947, -3735, -474, 5020, 9333, 9288, 7412, 7464, 9330, 8320, 5577, 5246, 5249, 997, -4818, +-7271, -4782, -1289, -486, 777, 5158, 7792, 5328, 1275, 191, 961, -2134, -5871, -6262, -6171, -9268, +-13448, -14463, -11259, -6804, -3342, 347, 6111, 10340, 9415, 6335, 5927, 8573, 8408, 5207, 3600, 3243, +474, -3534, -5260, -2587, 273, 147, 1027, 5277, 8434, 5795, 240, -2118, -1606, -3264, -6111, -6623, +-6377, -9282, -13461, -14311, -10455, -4918, -1371, 859, 4810, 9090, 10001, 8131, 7481, 9113, 8106, 4131, +2542, 3218, 1181, -3735, -6824, -4918, -936, 1006, 2064, 5333, 7888, 5244, 48, -1826, -723, -2341, +-5996, -7483, -7276, -8629, -11225, -11904, -8988, -4565, -1980, -392, 4049, 8988, 9245, 5886, 4041, 5931, +6855, 4814, 3303, 2958, 1162, -2598, -4671, -1920, 2568, 3589, 2918, 4850, 7523, 6316, 1538, -1829, +-2341, -4064, -7706, -9613, -9214, -9859, -12880, -14642, -11834, -5746, -966, 1522, 4932, 8725, 9359, 6921, +5886, 8674, 9636, 5888, 2503, 2356, 2888, 780, -1773, -768, 2313, 3407, 2998, 4745, 7036, 4762, +-1492, -5693, -5407, -5501, -8317, -10844, -11301, -11477, -13021, -13434, -9768, -3424, 588, 1742, 4417, 9254, +12001, 10269, 7747, 8493, 8629, 5724, 3195, 3150, 3448, 299, -3238, -1926, 3023, 5549, 4254, 3668, +4703, 3136, -1866, -5534, -5752, -6686, -10492, -13782, -13649, -11530, -11089, -11675, -9084, -3238, 1427, 3787, +6776, 10987, 12431, 9217, 6459, 8283, 10080, 7775, 3368, 1403, 1996, 597, -1679, -273, 3444, 4237, +1775, 924, 3063, 3204, -1518, -6536, -7645, -7916, -10291, -12947, -12999, -11151, -11285, -12040, -8541, -1345, +4226, 5715, 6522, 9760, 12034, 10213, 8037, 9191, 9857, 6470, 1875, 1006, 3255, 2666, -808, -1153, +2084, 3798, 2045, 619, 1719, 822, -4470, -8793, -8877, -8190, -10062, -13338, -13903, -11350, -9550, -8754, +-5190, 986, 5345, 6057, 6946, 11002, 14348, 12314, 8419, 7795, 8406, 6487, 2318, 260, 1088, 0, +-2802, -2101, 1846, 3660, 859, -1874, -842, -138, -3334, -7109, -8060, -8060, -10085, -12806, -12470, -8968, +-6575, -6344, -3953, 1527, 6346, 7436, 7322, 9732, 11670, 9208, 5964, 6033, 7334, 5469, 495, -1902, +-56, 1278, 76, 322, 2949, 3902, 1215, -1133, 113, 1046, -2497, -7150, -8648, -8462, -9573, -12184, +-12766, -10144, -7952, -7033, -3993, 1773, 6304, 6400, 5452, 7676, 10691, 10122, 7336, 6437, 6765, 4966, +1210, -395, 1637, 2961, 1354, 908, 3059, 4321, 1821, -1377, -1390, -1105, -4021, -7788, -9044, -8523, +-9630, -12424, -12951, -9842, -6236, -4637, -2556, 1572, 5125, 5480, 4879, 7096, 10287, 9664, 6448, 5266, +6388, 6256, 2853, 217, 1445, 3232, 2711, 2395, 3894, 4276, 856, -2751, -2856, -1733, -3316, -7090, +-9219, -9401, -10099, -11822, -12034, -9039, -5568, -4208, -2527, 1309, 5130, 5625, 4397, 5523, 8221, 8737, +6889, 5998, 6675, 6027, 2802, 670, 2466, 5067, 4548, 3091, 3249, 3136, 376, -2881, -3433, -2596, +-4072, -7628, -9686, -9460, -9477, -11242, -12054, -9431, -5348, -3082, -1399, 1589, 4352, 4613, 3792, 5020, +8216, 9457, 7509, 5931, 6199, 6386, 4347, 2149, 3111, 5345, 5190, 3843, 3595, 3130, 44, -3823, +-5242, -4612, -5317, -8434, -10857, -11346, -11493, -12193, -11994, -8787, -4058, -1518, -98, 2460, 5441, 6547, +5877, 6377, 8778, 9907, 8402, 6912, 6881, 6705, 4103, 1337, 2160, 4963, 5186, 3083, 1580, 249, +-2564, -5525, -6445, -5384, -5648, -8490, -10730, -10883, -9986, -9848, -9802, -7209, -2703, 450, 2197, 4129, +5962, 6275, 5150, 5054, 7458, 9211, 7862, 5670, 4721, 4641, 3394, 1580, 2293, 4802, 5091, 3096, +1462, 285, -1939, -5065, -6875, -6278, -5922, -7582, -9401, -9975, -9489, -9420, -9333, -6699, -1761, 1522, +2327, 2961, 4160, 5195, 5212, 5294, 7101, 8434, 7382, 5727, 5201, 5651, 4490, 1849, 1574, 4001, +5034, 3283, 908, -1060, -3430, -6179, -7604, -6569, -5721, -7386, -9655, -10393, -9223, -7792, -6956, -4630, +-506, 2363, 3357, 3902, 4985, 5975, 5342, 4332, 5484, 7302, 7161, 5393, 3982, 3824, 2847, 1077, +1552, 4196, 4903, 2486, -443, -2488, -3958, -5665, -6974, -6476, -5817, -6757, -8255, -8716, -7449, -6179, +-5791, -4032, 13, 3640, 4978, 4632, 4352, 4548, 4090, 3671, 5132, 6844, 6061, 3500, 1968, 2477, +2735, 1574, 1295, 2961, 3863, 2508, 254, -1578, -3195, -5546, -7407, -6850, -5313, -5257, -6753, -7845, +-6991, -5495, -4451, -2363, 1304, 4010, 4123, 2947, 2443, 3130, 3353, 2672, 3009, 4420, 4765, 3707, +2949, 3603, 3662, 2093, 1606, 3439, 4853, 3679, 684, -2233, -4236, -5832, -6858, -6329, -5207, -5653, +-7500, -8439, -7064, -4747, -3328, -2069, 322, 2746, 3742, 3331, 2834, 2918, 2460, 1710, 2593, 4935, +6128, 4963, 3424, 3459, 3943, 3515, 3221, 3951, 4084, 2164, -1034, -3848, -5277, -6208, -7325, -7381, +-6074, -5272, -5737, -6210, -5125, -3396, -2604, -1651, 732, 3340, 4196, 2916, 1210, 809, 1272, 1660, +2564, 4196, 4887, 3979, 2964, 3489, 4689, 4438, 3314, 3288, 3829, 3136, 670, -2432, -4785, -6476, +-7641, -7345, -5721, -4747, -5486, -6547, -5950, -3922, -2216, -958, 740, 2335, 2653, 1680, 625, 833, +1611, 1639, 1940, 3589, 5458, 5970, 5214, 4926, 5192, 4624, 3660, 3612, 3897, 2811, -359, -4202, +-6515, -7260, -7755, -7820, -6915, -6148, -6329, -6716, -5625, -3173, -1431, -573, 820, 2825, 4205, 3807, +2246, 1481, 1786, 2158, 2763, 4293, 5856, 6005, 4816, 4103, 4602, 4751, 3710, 2703, 2121, 785, +-2064, -5560, -7616, -8216, -8700, -8696, -7457, -5661, -4641, -4691, -4118, -2296, -508, 774, 2285, 4044, +4963, 4038, 2069, 1397, 2361, 3204, 3459, 4098, 5218, 5633, 4686, 3696, 3634, 3215, 1807, 642, +325, -182, -2454, -6003, -8393, -8835, -8535, -7933, -6615, -4793, -3469, -3193, -2613, -735, 1326, 2475, +3096, 3919, 4565, 3872, 1942, 783, 1207, 1954, 2333, 3102, 4695, 5789, 5000, 3478, 2856, 2605, +1674, 387, -381, -1062, -3076, -6253, -8221, -8105, -7446, -7087, -6273, -4539, -2903, -2378, -2047, -655, +1083, 2237, 2975, 3943, 4924, 4395, 2183, 720, 1261, 2415, 2797, 2977, 3852, 4697, 4146, 2785, +2231, 2203, 1321, -338, -1422, -1872, -3484, -6592, -8724, -8575, -7440, -6504, -5348, -3266, -1125, -361, +-310, 647, 2412, 3645, 3820, 3880, 4298, 3693, 1498, -158, 130, 1247, 1600, 1623, 2559, 3775, +3484, 1917, 1046, 1258, 1128, -44, -990, -1172, -2332, -5223, -7486, -7345, -5961, -5125, -4556, -2968, +-842, 172, 217, 899, 2293, 3046, 2706, 2534, 3059, 2627, 282, -1749, -1396, 415, 1674, 2158, +3190, 4740, 4875, 3396, 2449, 2641, 2183, 22, -1991, -2516, -3232, -5596, -7755, -7723, -6351, -5382, +-4595, -2776, -448, 457, -50, 81, 1487, 2873, 2998, 2573, 2672, 2268, 441, -952, -141, 1784, +2729, 2627, 3331, 5102, 5685, 4237, 2698, 2253, 1600, -471, -2556, -3348, -4310, -6886, -9225, -9067, +-7103, -5384, -4329, -2598, -220, 956, 726, 1060, 2618, 3705, 3014, 1937, 2067, 2398, 1284, -152, +130, 1911, 3312, 3713, 4488, 5860, 5769, 3577, 1569, 1241, 1046, -992, -3631, -4731, -5356, -7217, +-9011, -8674, -6765, -5384, -4621, -2845, -33, 1883, 2019, 2008, 3023, 4010, 3713, 2851, 2670, 2446, +791, -871, -400, 1861, 3679, 3820, 3928, 5104, 5599, 4131, 2279, 1587, 746, -1917, -4762, -5775, +-5927, -7220, -8996, -8971, -7112, -5235, -3902, -2095, 373, 1844, 1507, 1349, 2741, 4443, 4412, 2932, +2186, 2265, 1784, 1009, 1405, 3018, 4053, 3727, 3636, 4861, 5648, 4008, 1345, -3, -689, -2788, +-5571, -6977, -7481, -8810, -10218, -9582, -6917, -4306, -2797, -1193, 1267, 3337, 3843, 3891, 4717, 5387, +4494, 2769, 2110, 2499, 2197, 1015, 783, 2293, 3874, 3995, 3526, 3891, 3956, 2039, -448, -1476, +-1885, -3809, -6595, -7857, -7701, -7896, -8402, -7579, -5240, -3091, -1880, -511, 1914, 4310, 4797, 4120, +4194, 4870, 4596, 3091, 2011, 1818, 1210, 251, 455, 2290, 4019, 3846, 2929, 3258, 3976, 2858, +342, -1401, -2592, -4801, -7423, -8476, -7944, -7704, -8142, -7503, -5101, -2372, -720, 350, 2149, 3984, +4307, 3854, 4217, 5085, 4695, 2845, 1587, 1838, 2253, 1838, 1617, 2562, 3552, 3161, 2208, 2508, +3295, 2123, -525, -2326, -3110, -4666, -7109, -8467, -8317, -8128, -8221, -7248, -4615, -1792, -335, 446, +2205, 4632, 5780, 5368, 4924, 4844, 4103, 2409, 1306, 1606, 1957, 1386, 1094, 2225, 3783, 3775, +2531, 2121, 2287, 1142, -1172, -2903, -3806, -5354, -7587, -8713, -8091, -6982, -6445, -5588, -3517, -1137, +314, 1144, 2817, 5104, 5973, 5156, 4408, 4386, 3911, 2177, 627, 463, 789, 655, 649, 1691, +3040, 3083, 2140, 2067, 2806, 2251, -48, -2242, -3668, -5365, -7526, -8654, -7933, -6638, -5905, -5019, +-2989, -387, 1137, 1583, 2545, 4196, 4915, 4194, 3312, 2992, 2378, 930, -87, 446, 1697, 2149, +2104, 2780, 3908, 4027, 3012, 2540, 2817, 2095, -98, -2367, -3942, -5672, -7944, -9387, -9005, -7652, +-6550, -5480, -3545, -1037, 715, 1561, 2836, 4850, 5925, 5150, 3897, 3266, 2681, 1362, 180, 461, +1628, 2387, 2653, 3314, 4401, 4457, 3230, 2339, 2220, 1459, -772, -3385, -5212, -6759, -8521, -9554, +-8835, -7002, -5537, -4556, -3028, -811, 915, 1660, 2570, 4233, 5350, 4972, 3973, 3331, 2709, 1476, +390, 715, 2069, 3012, 3088, 3325, 4191, 4556, 3761, 2907, 2689, 1892, -441, -3353, -5659, -7511, +-9387, -10535, -9926, -7944, -5996, -4584, -2952, -772, 997, 1821, 2661, 4228, 5391, 4955, 3660, 2830, +2503, 1942, 1391, 1883, 3308, 4380, 4488, 4479, 4884, 4661, 3232, 1753, 1153, 478, -1524, -4406, +-6855, -8646, -10144, -10937, -10079, -7829, -5665, -4338, -2961, -774, 1453, 2839, 3852, 5244, 6204, 5763, +4457, 3487, 2972, 2095, 1157, 1477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -800, -1268, 1887, -3120, 3283, -4618, 6057, -8780, 10662, +-14099, 16959, -16934, 12235, -8028, 4938, -2523, -999, 3444, -4986, 4298, -4719, 5956, -7218, 4995, -2764, +758, 760, -3696, 4448, -3643, 1128, 346, -1591, 1140, -1068, -555, 4686, -10250, 10893, -7053, 2536, +-953, -759, 2788, -4494, 4342, -4782, 4588, -5597, 5888, -5577, 4506, -5309, 4728, -3854, 4569, -7230, +7841, -7463, 7201, -6623, 4514, -2243, -881, 2943, -3626, 3748, -4248, 2950, -1365, 577, -1112, 728, +-939, 1249, -1923, 787, 1494, -4845, 7039, -8622, 8518, -6397, 3546, -1781, 456, 878, -2455, 3794, +-5087, 4977, -4320, 3221, -2046, 272, 1025, -2332, 1872, -2929, 5901, -9797, 15063, -23620, 29824, -26921, +17133, -9043, 4388, -112, -8262, 20506, -28934, 28489, -28102, 31504, -31038, 26108, -23536, 20762, -15853, 10564, +-6525, 4170, -4562, 2931, 2349, -5211, 3752, -4359, 6731, -7274, 7723, -7506, 5649, -4245, 3841, -2805, +2383, -4031, 4797, -3336, 2284, -3023, 2899, -1479, -700, 1568, -2194, 4031, -5998, 6638, -5760, 3258, +-3020, 4870, -7776, 15384, -26168, 31516, -27317, 20623, -14667, 7078, -1014, -1450, 4592, -7729, 7022, -8006, +11167, -9915, 5806, -5008, 4346, -2761, 3711, -4826, 3405, -3508, 5292, -4770, 4935, -6332, 6270, -4429, +2482, 428, -2848, 4245, -5488, 5834, -4228, 3226, -4360, 4991, -5253, 5474, -4196, 2070, -408, -905, +1787, -3836, 6121, -8028, 12009, -15663, 15950, -10797, 6278, -4378, 2005, 2550, -7681, 9600, -6159, 2926, +-7332, 13016, -11052, 5257, -2165, 1169, 32, -2232, 4422, -4956, 5290, -6138, 7088, -6155, 3826, -1684, +1144, -962, -228, 1842, -1360, 606, -1524, 1348, 362, -2812, 4945, -5040, 3728, -3386, 2839, 105, +-2873, 3918, -4288, 3860, -2092, 1854, -789, -1232, -75, 2025, -156, -2587, 3738, -7405, 13153, -14797, +13037, -11287, 8743, -6438, 5868, -4298, 1296, 214, -299, 1484, -3384, 4041, -3061, 2332, -1644, 600, +-127, 696, -1278, 2272, -3720, 3731, -2703, 2548, -3077, 2584, -2856, 4083, -3735, 2781, -2488, 1947, +-1346, 1868, -1738, 560, 584, -1331, 2936, -3944, 4060, -4133, 3384, -1954, 1384, -928, 108, -23, +298, -183, -109, 264, -846, 1132, -812, 694, -604, 108, 454, -934, 1520, -1249, 637, -273, +498, -325, -694, 1883, -2488, 2805, -3105, 2781, -1888, 1322, -900, 234, 69, 212, -435, 980, +-1084, 624, -1419, 3469, -3677, 3090, -3660, 3512, -500, -1518, 826, -585, 1059, -1340, 2614, -3798, +2737, -2432, 4004, -4266, 2305, -2682, 5132, -5892, 5150, -3166, 1109, -684, 1484, 108, -2823, 3374, +-3066, 3894, -5035, 4875, -3986, 3277, -2734, 2277, -1700, 944, -1157, 1942, -1756, 1146, -892, 660, +228, -922, 1264, -1278, 1508, -1569, 2130, -2134, 1899, -1732, 1850, -1428, 1021, -1048, 1424, -1112, +694, -262, -301, 498, -425, 836, -922, 459, 289, -962, 1288, -701, -289, 652, -2002, 4337, +-5655, 6045, -7428, 8355, -7364, 5968, -4558, 2974, -1888, 1351, 582, -2524, 1910, -1514, 2450, -2954, +2644, -2222, 2560, -3583, 3826, -3002, 1836, -1336, 1433, -676, -472, 1099, -750, 144, -938, 1521, +-912, 823, -718, 490, -1239, 1542, -1314, 1162, -1674, 1506, -1074, 1898, -2308, 1332, -1414, 1418, +-1210, 958, -263, -91, -97, -288, 852, -1545, 1424, -1457, 1442, -1002, 908, -530, -93, -745, +1233, -314, -370, 452, -23, -696, 1268, -1634, 1471, -1758, 1644, -876, 798, -490, -123, 448, +-1144, 1516, -1084, 960, -662, 619, -715, 448, -1, -408, 658, -1104, 1458, -986, 696, -766, +228, -105, 260, 20, -55, -30, 110, 194, -175, -22, -215, 425, -59, 41, 57, -34, +-221, -17, 302, -483, 534, -510, 540, 0, -452, 275, -672, 26, 1608, -3493, 5960, -9009, +11030, -8776, 5476, -3846, 3474, -3677, 5011, -5504, 3716, -3100, 2752, -1372, 1190, -1600, 125, 2322, +-3134, 3062, -3861, 4438, -4419, 4354, -2734, 1790, -2349, 2596, -2096, 1993, -1520, 1248, -602, 215, +-23, 18, -136, 64, -209, 650, -347, 34, 364, -914, 690, -700, 1273, -1160, 932, -380, +410, -551, 255, 114, -313, 215, -122, -309, 1186, -485, -289, -502, 446, 318, 223, -672, +30, 254, -834, 2036, -3406, 3755, -4399, 3668, 642, -4234, 5413, -5398, 5430, -5257, 5275, -5182, +4428, -4174, 4384, -2950, 958, 472, -1406, 1736, -2078, 1988, -1918, 1899, -1784, 2311, -2272, 2096, +-1588, 846, -622, 921, -1058, 1814, -1815, 1486, -1452, 1128, -904, 694, -885, 983, -1212, 1552, +-1282, 545, -430, -262, 1113, -1002, 1052, -803, 524, -194, 52, -31, 160, -139, 100, 182, +-330, 810, -1155, 967, -1176, 1176, -825, 800, -512, -20, 544, -866, 1169, -1341, 1132, -414, +151, 532, -301, -434, 738, -997, 1474, -1190, 724, -524, 758, -1120, 1462, -1741, 1128, -498, +197, 609, -907, 808, -758, 716, -619, 788, -660, 580, -157, 197, -151, -156, 250, -430, +442, -291, 240, -117, -215, 132, -239, 125, -377, 536, -492, 740, -902, 856, -894, 776, +-527, 362, -245, 330, -187, 100, -750, 1006, -626, -59, 97, -524, 1282, -1171, 401, -293, +160, -327, 826, -572, -575, 655, 658, -1593, 2688, -5073, 7666, -7418, 5621, -4078, 4412, -5964, +7371, -8369, 7820, -6984, 5022, -1894, 463, -806, 1141, -488, -802, 1458, -1534, 1954, -2071, 2451, +-2092, 1722, -2145, 2655, -2602, 2790, -2634, 2814, -2332, 852, -78, 154, -958, 1406, -1296, 1709, +-1602, 912, -396, 156, -81, 540, -348, 188, -209, 881, -648, -257, 352, -55, 371, -452, +446, -377, 36, -55, -35, -93, -75, 502, -286, -86, -185, -229, 1113, -1487, -117, 1656, +-2300, 2744, -1436, -1612, 3484, -3518, 3138, -1316, -1722, 2870, -2858, 2951, -2580, 1739, -1860, 2560, +-2454, 1878, -2020, 1130, -15, -371, 856, -682, 512, -406, 888, -1600, 2025, -1995, 1950, -1272, +852, -435, -396, 328, 13, -390, 104, 108, -217, 738, -1152, 778, -754, 700, -185, 183, +66, -129, 228, 3, -127, -22, -114, 432, -391, 517, -432, 325, -618, 550, -348, 188, +142, -345, 714, -626, 738, -854, 878, -750, 666, -114, 190, -1651, 2294, -982, -361, 588, +-2992, 8522, -10976, 10745, -9635, 7865, -5682, 3356, -2328, 306, 1695, -3146, 5882, -7752, 8369, -8713, +9082, -8891, 7659, -6123, 4630, -2757, 1685, -999, -442, 1603, -2784, 3740, -3493, 3028, -2470, 2144, +-2441, 2155, -1631, 884, 32, -354, 866, -881, 970, -1385, 903, -616, 823, 8, -510, 480, +-321, 386, -789, 588, -288, 332, -273, 124, 230, -314, 384, -1004, 1336, -1399, 2057, -2034, +1338, -614, 466, -317, -343, 580, -173, 10, 304, -1060, 522, 442, -2868, 6928, -10487, 10459, +-6140, 1996, 1293, -2529, 1494, 2532, -5509, 4846, -3489, 2910, -1622, 1498, -1595, 1644, -1681, 1336, +-1154, -390, 1586, -1776, 1797, -710, 384, -1443, 2305, -3581, 4200, -3876, 4006, -3226, 2269, -1276, +320, -331, 386, -682, 880, -243, -173, 938, -1792, 1651, -1986, 1911, -1254, 1084, -243, -215, +492, -782, 1058, -1406, 1613, -952, 399, 566, -598, 595, -1264, 1205, -810, 648, -217, -143, +560, -628, 860, -1925, 2479, -2266, 1739, -638, -170, 1164, -1398, 1106, -1498, 1928, -1137, 197, +-398, 1228, -1503, 2800, -5137, 6382, -5114, 3536, -2294, 2696, -4055, 4828, -5590, 5019, -4054, 2886, +-598, 414, -1398, 1651, -815, -640, 1797, -2708, 3671, -3634, 3270, -2349, 1092, -1380, 1486, -1579, +1939, -1794, 1729, -881, -837, 1368, -1166, 575, 41, -335, 938, -898, 760, -676, -229, 66, +312, 30, -267, 86, 56, -91, -548, 322, -323, 786, -958, 1150, -1120, 985, -846, 618, +-840, 478, 364, 406, -488, -464, 694, -653, 808, -3014, 3832, -1833, -2358, 7628, -14753, 21897, +-26299, 27372, -25261, 22203, -16872, 12770, -10628, 5566, -2070, 556, 3779, -8699, 11253, -11950, 12941, -14189, +12468, -11925, 11235, -8208, 6585, -4542, 2311, -754, -1452, 1782, -1167, 1048, 711, -832, 366, 0, +-1088, 802, -380, -531, 1777, -1705, 2102, -1567, -181, 236, -970, 1806, -1181, 1092, -279, -375, +629, -1016, 548, -214, -105, 980, -623, 1181, -1210, 275, -293, -175, 1006, -960, 846, -243, +163, -288, 459, -1166, 1218, -1007, 1668, -1144, -827, 1732, -99, -2873, 5781, -9216, 13032, -12654, +11616, -10125, 8971, -8450, 7475, -6693, 3592, -1358, 456, 1892, -4097, 4932, -5673, 6702, -7238, 7240, +-6881, 6300, -5161, 4128, -2744, 648, -61, -59, 286, 348, 102, -759, 1128, -2198, 2212, -2354, +1819, -1098, 810, -199, -249, 234, -73, -768, 594, -103, 646, -506, 578, -684, 178, -5, +-207, 570, -414, -355, 1086, -1044, 776, -684, -47, -297, 590, 163, -109, -347, -830, 1278, +-536, -561, 1804, -5512, 11726, -16595, 19212, -18631, 16226, -11208, 7124, -4953, 2140, 309, -1766, 4269, +-7361, 8757, -9372, 10613, -11487, 10228, -8883, 8141, -6256, 5505, -4472, 3216, -1006, -1428, 2983, -3710, +4075, -3061, 2362, -1675, 1156, -1300, 1075, -808, 192, 220, -420, 719, -718, 371, -354, -267, +1164, -1152, 1590, -992, 458, -614, 1147, -1566, 1736, -966, -31, 908, -618, 342, -868, 973, +-1011, 1392, -1314, 1116, -708, 514, 13, -694, 1310, -1246, 992, 217, -604, 710, -394, 76, +346, -648, 846, -277, -355, 476, -175, -335, 554, -788, 792, -618, 541, -469, 612, -960, +1178, -2480, 2834, -51, -2784, 4476, -6760, 10096, -9348, 7410, -7024, 6716, -4719, 2624, -1942, -1007, +3578, -4991, 7117, -7826, 7053, -6430, 6414, -6042, 4743, -3866, 3261, -1280, 160, 1443, -3618, 4510, +-4467, 4128, -3440, 3172, -2852, 2968, -3241, 2556, -2417, 1826, -1184, 530, 100, -398, 690, -1011, +861, -1312, 1552, -847, 711, -151, 228, -238, 64, -669, 1088, -666, 197, 81, -277, 987, +-1732, 1432, -1532, 1348, -836, 958, -881, 57, 537, -197, -2349, 4980, -7739, 10985, -13342, 14203, +-12161, 9537, -6318, 3206, -1595, 78, 758, -1198, 2542, -4179, 5720, -6714, 6938, -7734, 7373, -6870, +6702, -5468, 4501, -2880, 1196, 274, -1354, 1630, -1698, 2216, -1960, 2262, -2426, 2180, -2354, 1712, +-1155, 406, 391, -994, 1205, -834, 388, -478, -7, 356, -245, 708, -602, 214, 142, -365, +340, -619, 779, -598, 507, -175, -180, 41, -51, -309, 468, -296, -54, 512, -464, 296, +-129, -146, 370, -480, 852, -628, 428, 41, -243, 286, -608, 970, -758, 572, -566, 498, +-139, -197, 52, -211, 476, -375, 483, -374, 160, 122, -380, -381, 1315, -1276, 823, 183, +-2000, 5052, -6164, 5282, -3866, 2910, -2270, 1787, -3849, 5466, -6029, 6168, -4899, 2552, -584, -488, +990, -1646, 2100, -2456, 3248, -3220, 2968, -3153, 3248, -3086, 2529, -1490, 1293, -1414, 2076, -2618, +2148, -1582, 811, -348, 386, -307, 214, 112, -577, 745, -1079, 1654, -1797, 2383, -2372, 1998, +-1422, 740, -510, 376, 71, -297, -224, 609, -248, -878, 1046, -2962, 4548, -3098, -1961, 8083, +-13285, 16310, -16247, 15242, -12601, 9706, -8838, 6295, -3084, 2070, -868, -1406, 3704, -5532, 7216, -9256, +9339, -9877, 10629, -8771, 6772, -5383, 4156, -2964, 512, 1746, -3318, 4555, -3332, 2080, -1649, 1130, +-1273, 1006, -842, 420, -119, 323, 472, -1922, 2335, -2897, 2134, -391, -377, 1283, -1658, 2276, +-2818, 2562, -1896, 1228, -139, -93, 646, -541, 696, -1443, 1079, -595, 640, -317, 265, -340, +304, 309, -1084, 744, 16, -123, -618, -105, 3309, -5379, 3856, -3260, 2151, 3188, -5499, 5594, +-5984, 8580, -9736, 7058, -7582, 9106, -9965, 10672, -11477, 12778, -12012, 9009, -6074, 2924, 454, -2812, +4341, -4742, 5100, -5645, 6130, -6177, 5344, -3643, 3295, -3193, 3752, -4500, 4312, -4138, 3173, -2086, +772, 338, -289, -260, 952, -2255, 2246, -792, -646, 2538, -3454, 4763, -4807, 3745, -3064, 2502, +-733, 182, -656, 558, -103, 410, -769, -544, -742, 2310, -516, -2886, 4535, -6392, 9644, -11369, +10633, -7630, 4664, 884, -5432, 5357, -6072, 7534, -7918, 9014, -9298, 9458, -9564, 8418, -7834, 5072, +-3207, 2430, -469, -762, 2894, -5311, 6254, -7157, 5839, -3767, 4254, -3503, 3486, -3886, 3845, -5052, +5372, -5253, 4174, -1694, 158, 793, -1364, 856, -2140, 1776, -1054, 1829, -1188, 1315, -2354, 2587, +-2376, 1201, 224, -488, 1348, -1382, 2059, -2412, 1616, -1365, 312, 776, -458, 762, -880, 622, +-963, 496, -235, 57, 128, 670, -2863, 3532, 386, -5164, 3734, -3554, 9754, -10170, 7986, -7433, +5815, -390, -2592, -530, -570, 4196, -4350, 4468, -4094, 2890, -4841, 5457, -2754, 1218, -1896, 4288, +-2795, 690, 1317, -5888, 7816, -6152, 5374, -3980, 4296, -3391, 1742, -2288, 2212, -3258, 3348, -1528, +590, 609, -1374, 628, -1038, 874, -1136, 2570, -1426, 875, 206, -425, 62, -1160, 1694, -1089, +1108, 238, -992, 22, 976, -2068, 1166, -914, 1283, -464, 183, -1218, 420, 2014, -4926, 5518, +-4398, 1854, 3172, -5878, 8569, -11833, 17050, -19962, 18472, -17990, 17409, -15825, 14666, -12894, 10016, -7010, +3728, -1272, -3898, 8035, -10214, 12800, -13071, 13118, -13380, 13512, -12679, 9053, -4660, 3120, -1392, 987, +-715, -633, 507, -534, -243, 110, 1152, -1848, 1544, -818, -759, 846, -1307, 774, 871, -103, +1398, -3861, 4422, -3958, 3954, -2068, 570, 196, 362, 1824, -3673, 2274, -3416, 4080, -2882, 2320, +-2311, 1620, -758, -123, 768, -1372, 1055, 332, 864, -1326, 880, -594, -165, 949, -1122, 2054, +-2121, 2548, -3057, 2732, -2960, 1810, -1423, 1068, -15, -949, 1743, -2328, 2228, -2655, 2674, -2490, +3115, -2168, 1627, -885, 151, 86, -618, 1223, -1162, 832, -768, 742, -618, -1, -982, 734, +-359, 384, -568, 871, -987, 1112, -1456, 1525, -1181, 1694, -1031, -812, 701, 1782, -4623, 5595, +-6680, 3962, 1776, -3696, 6814, -11984, 18291, -24122, 24645, -25571, 23760, -21790, 20618, -16919, 13987, -9949, +5828, -1584, -4392, 9761, -13042, 16841, -18116, 18112, -17831, 17807, -17950, 13806, -9027, 6484, -3721, 1826, +-764, -1050, 2155, -4796, 5828, -5673, 5032, -4787, 4521, -381, -1773, 2736, -5631, 8217, -6077, 4119, +-4928, 3435, 26, -1942, 1506, -2319, 3091, -3798, 4150, -5161, 5756, -6378, 6309, -5450, 4122, -868, +-1738, 3454, -3987, 6033, -7129, 6566, -6271, 6618, -6516, 5226, -3452, 3618, -5607, 4793, -2880, 2328, +-1346, -1272, 2780, -3512, 4834, -5239, 4850, -4524, 5311, -4214, 4050, -4596, 4782, -3532, 2412, -2368, +2272, -778, -871, 1317, -2059, 3006, -3464, 3356, -3479, 3459, -2700, 2668, -2446, 1974, -1155, 1220, +-852, -178, 1470, -1249, 884, -939, 1378, -779, 20, -249, 274, -117, 220, -720, 415, -800, +900, -377, 637, -904, 478, -61, -1674, 3653, -2703, -365, 1116, -1967, 4820, -6594, 6474, -3874, +1178, 3418, -8868, 10627, -12597, 12897, -13248, 13710, -12087, 12172, -13397, 11300, -8340, 6338, -6281, 4565, +506, -2163, 6218, -11268, 12198, -11549, 9756, -9288, 10133, -9228, 6736, -4729, 3970, -3482, 2461, -2839, +1535, 3576, -5726, 5032, -5944, 7098, -6394, 4912, -3578, 2804, -430, 81, -541, -705, 226, 265, +980, -2092, 1568, -742, 1755, -1300, 163, -516, 2, 2014, -2406, 2008, -2416, 2277, -1438, 629, +215, 514, -1041, 1436, -575, 163, -401, -905, 2070, -1659, 1748, -2018, 2230, -2116, 1200, -1068, +870, -672, 449, 41, 384, -348, 212, -892, 422, 483, 47, -151, -317, 1104, -834, 236, +-907, 643, 398, -380, -894, 1302, -711, 388, -710, -95, 697, -406, 530, -541, 590, -1432, +-288, 2912, 84, -6226, 5059, -325, 1882, -2794, 194, -2232, 5136, -3052, -2154, 2584, -1208, 3954, +-6795, 10563, -15693, 17812, -19154, 17777, -15877, 15595, -13807, 12256, -8457, 3788, -604, -3784, 7400, -10370, +14336, -14851, 13845, -12955, 12747, -12652, 8917, -5626, 4848, -2688, 1525, 36, -2392, 3180, -3425, 3391, +-3774, 4085, -2611, 2936, -2698, 1266, -864, 226, -217, 1002, 212, -510, -714, 1194, -864, -170, +-235, 255, 507, 364, -697, 582, -584, -23, -112, 466, 212, -86, 652, -725, -137, 1052, +-1326, -79, 806, 100, 114, -524, 626, -1014, 1092, -1702, 1496, -357, 449, -612, 764, -750, +466, -375, -65, 432, -207, 1150, -1487, 1099, -759, 246, -406, 265, 498, -490, 307, -25, +118, -388, -263, 503, -105, 129, -11, 622, -296, -153, -388, 653, -275, 537, -320, 507, +-165, -187, 389, -623, 163, 194, -112, 376, -313, 37, -178, -123, -1, -718, 1398, -301, +-864, -636, 2020, -889, 1498, -1780, 284, 811, 1593, -3290, 1852, -2552, 3884, -3115, 1810, -1462, +902, -711, 802, -1145, -641, 1584, -452, 1777, -2601, 2182, -2117, 2689, -3319, 2516, -2440, 1872, +-396, 490, -355, -860, 1235, -1288, 1198, -1474, 1499, -1593, 2018, -1752, 1244, -986, -65, 532, +-385, 926, -1006, 1002, -1164, 1152, -1157, 884, -694, 316, -57, 590, -288, -459, 352, -394, +774, -803, 760, -403, 880, -711, 309, -371, 432, -103, 348, -434, 788, -286, 146, 66, +-408, 537, -1676, 2734, -394, -2102, -878, 4688, -4363, 3414, -3124, 1108, 1581, 1230, -2965, -377, +5306, -7923, 9322, -12562, 13174, -11505, 11651, -11086, 9657, -8689, 6876, -3656, 658, 362, -1908, 5427, +-7422, 8500, -9174, 9278, -9595, 9090, -7303, 6300, -5654, 4548, -2396, 448, 46, -623, 939, -1466, +2054, -2135, 2323, -2858, 2780, -2498, 1656, -608, 3, 829, -1035, 776, -352, -115, -27, -286, +1062, -1136, 806, -730, 914, -1058, 234, -229, 551, 74, -823, 1000, -808, 1065, -924, 260, +-588, 1196, -44, -980, 1254, -1016, 1049, -994, 483, 36, -115, 532, -1020, 1258, -1272, 1186, +-1218, 1055, -1010, 1251, -1186, 796, -293, 71, -370, 554, -214, 214, -209, 168, 47, -11, +-211, -86, 537, -730, 550, -377, 572, -1026, 458, -248, 608, -830, -1510, 2912, -1218, -260, +-1932, 3551, -1838, 3401, -4353, 1304, 1593, -68, -1239, -1086, 146, 2986, -3230, 1746, -1354, 1036, +-1620, 1700, -968, 507, 178, -1058, 2482, -2737, 1395, -2096, 2252, -1464, 1752, -1680, 1343, -495, +325, -1212, -88, 788, -86, -215, 357, -561, 716, -1264, 618, -531, 449, -272, 996, -842, +990, -1356, 666, -365, -86, 674, -233, 732, -1457, 1602, -1072, 320, -948, 847, 228, 342, +-564, -163, 637, -478, 336, -836, 530, 440, 214, -574, -115, 604, -394, -224, 20, 642, +-41, -585, 676, -694, 594, -864, 472, -160, 154, 188, -725, 1002, -377, -377, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +-13014, -6693, 24907, -16732, 12045, -2855, -8467, -9857, 14697, 26984, -29531, 16546, -14359, 15965, -19156, 6494, +3454, -6510, 15027, 207, -9397, -14317, 1623, 21201, 4393, -15600, 3432, -6724, 9966, -20869, 17006, 3164, +-4831, 12234, 4259, -24255, -6024, 14839, 5007, -6326, -6970, 15548, -7238, -1010, 10475, -1574, -8890, -2831, +11667, -1351, -15691, 207, 2576, 15724, -6369, -1662, -9599, 3691, 10601, -5231, 3083, -19149, 23048, -6885, +6308, 8241, -28293, 3258, 5412, 10255, -6813, 2775, 450, -24527, 28850, -10794, -9342, 18249, -8591, -6616, +5212, 653, -7793, 3192, 13690, 3929, -26679, 3181, 7040, 10336, -26476, 18295, 7304, -23672, 28262, -1482, +-19390, -3807, 8401, 15266, -7896, -4606, 16883, -26017, -1004, 9824, 8901, -11859, -7817, 14346, 7831, -27309, +19722, 6369, -8259, 6807, -5657, 1755, -17772, 28850, -9659, -16025, 10112, 7152, -12208, 22447, -29531, 14411, +527, -4662, 22488, -24058, 15912, -16208, 17323, -12104, -5427, 18279, -6980, -8632, -3765, 12396, -3392, 1254, +-10621, 17449, -14515, 17704, 648, -19072, 14762, -895, 894, -10247, 12249, -10763, 10502, -18046, 14207, -3218, +-16762, 24654, -9562, 4990, -7962, -3121, 20329, -19874, 10286, -3224, -2920, 7490, -8043, 1806, -1532, -2527, +1997, 13391, -6180, -9622, 5262, 12202, 3048, -22953, -785, 19511, -14674, 10934, 165, -7695, -7824, 11295, +15816, -20394, -4486, -4886, 23991, -6915, -2958, -4955, -11735, 10941, 7765, 8397, -15424, -12886, 21991, -2590, +-5808, 6336, -11309, 11149, -4788, 10777, -6582, -10534, 11250, 4520, -2642, -8058, -5093, 12364, 273, -689, +-2738, -4486, -10838, 13583, 8704, -268, -23672, 13627, 7069, 847, -9702, 682, 4468, -5594, 16044, -10993, +-13864, 786, 16995, 10830, -10867, -7656, 9362, -15581, 15241, -4621, 3974, -9924, 8563, 6408, -18337, -4249, +12231, 8963, -365, -7648, -4479, -7529, -3770, 28850, 2307, -18712, -8507, -2238, 17290, -1887, -3249, 3296, +-4820, 11679, -1105, -206, -19915, 10914, 6528, 1487, -1376, -8177, 8394, -4003, 1810, -1114, -9043, 10383, +-2686, 6346, -19415, -6243, 21551, -2595, 8364, -9204, 1544, -5659, 9305, -2298, -2554, -3554, 4140, 7321, +-2559, -3617, -13979, 10506, 8776, 5305, -5146, -5559, -4498, 5519, 3143, -7825, 3855, 2131, -6291, 3305, +-10502, 11193, -12925, 18152, 3381, -4191, -10316, -3616, 1921, -1038, 10039, -2462, 12363, -18398, 4718, 392, +-5589, 1392, 12903, -1873, 1112, -18637, 10895, 2576, -12680, 22547, -6139, -440, -12208, 8199, -1785, -12516, +17949, 9183, -15214, -7367, 3936, 1790, -3484, -356, 8919, -1048, 246, -1199, 257, -379, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11, +-7, -11, -7, -11, 4, -41, 79, -111, 269, -619, 3873, 17931, 20411, 25179, 22922, 21561, +16418, 12563, 7620, 7676, -12610, -21960, -24561, -27175, -29202, -26020, -23682, -20931, -15791, -17696, -12653, -10387, +1297, 10792, 16049, 15842, 19544, 18899, 22466, 17473, 29179, 29179, 9181, -3659, -6608, -6163, -6584, -4282, +-4407, -8954, -12891, -14743, -18527, -29202, -28962, -29202, -29202, -29202, -29202, -28685, -16300, -4628, 2629, 24037, +29179, 29179, 29179, 29179, 29179, 29179, 29179, 29179, 29179, 26020, 25578, 17259, 7439, 3930, -4515, 1529, +-6797, -16001, -18907, -21864, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -16218, -8200, +-1067, 10667, 15669, 23815, 21877, 28127, 26542, 29179, 29179, 29179, 20350, 7052, 4886, 9282, 7495, 7655, +-1468, -6057, -12462, -7341, -11917, -8182, -7224, -6663, 661, 4887, 3879, 10349, 11131, 9324, 8913, -5879, +-23203, -20630, -10084, 4877, 14578, 20058, 21424, 21692, 16332, 9491, 2779, 9864, -3995, -6687, -11947, -8923, +-1111, 4712, -1963, -19009, -25319, -24049, -25906, -19484, -21157, -9483, -4714, -3874, -3102, 4165, 4177, 16094, +19443, 15771, 11099, 13123, 10683, 2837, -59, -5144, 39, -3159, -313, 1413, 4278, 5883, 11103, 4496, +4607, -3731, -8365, -8564, -4951, -10588, -10957, -17440, -13479, -10406, 2620, 4272, 12286, 20929, 20896, 19088, +19782, 21903, 29179, 27781, 19508, 6492, -6509, -11669, -14009, -12314, -19813, -15269, -9777, -7726, 1497, 6108, +-3238, -7499, -7041, -23353, -25082, -20162, -15850, -9547, 75, 7435, 5126, -715, 202, -4327, -237, 4893, +10383, 6598, 15584, 12545, 11087, 3412, 1217, -5544, -14085, -24698, -22170, -19475, -29202, -22578, -15621, -12737, +-3928, -2321, 3433, 15782, 16867, 19177, 18606, 14887, 23852, 25421, 26104, 17555, 19318, 16495, 22544, 25755, +19099, 17759, 17219, 17013, 11276, 778, -7916, -13020, -19994, -19871, -16047, -21453, -23232, -28724, -29202, -29202, +-29202, -29202, -29202, -29202, -28165, -16723, -7816, -3981, 5603, 4514, 1586, 1542, 8356, 10846, 19168, 23922, +26156, 20196, 19878, 13481, 15229, 16790, 10677, 13595, 17131, 19440, 18715, 25094, 22941, 18976, 11273, 6767, +-4829, -5541, -12923, -9818, -6062, -909, -1875, 2993, 6952, 8783, 8877, 4874, 5474, 4703, 3788, 785, +-3913, -3384, -16695, -20796, -28514, -29202, -29202, -29202, -29202, -24910, -16017, -18081, -22785, -18565, -9321, -9425, +-3064, -1288, -2389, 459, 1413, 3228, -1064, 2781, 3745, 11684, 13945, 19362, 26540, 29179, 29179, 29179, +29179, 29179, 29179, 28100, 19619, 16219, 16031, 7115, 1662, -774, 2138, 5744, 326, -14, -5999, -4881, +-6326, -3957, -878, -2036, -2857, -14260, -26499, -29202, -29202, -29202, -29202, -29202, -29202, -26058, -18356, -14474, +-17552, -13398, -13899, -11683, -13845, -10661, -1369, 8352, 12724, 10322, 13862, 13326, 14958, 14859, 14285, 18917, +23115, 27498, 29179, 29179, 29179, 29179, 29179, 27943, 27641, 20736, 13351, 12724, 11288, 8965, -5315, -6329, +-7359, -13550, -12157, -13851, -8163, -9091, -5574, -9008, -13303, -13647, -15415, -23268, -27676, -29202, -29202, -29202, +-29202, -29202, -25530, -22970, -20750, -18038, -14280, -4203, 6768, -20, 4532, 6634, 10494, 5684, 2711, 3991, +-152, 721, -122, 1633, 6291, 8740, 15304, 26000, 25868, 25263, 23425, 22968, 26303, 29179, 29179, 29179, +29023, 27538, 23128, 14297, 10286, 6955, 2403, -487, 2352, 4144, 1364, -3499, -3424, -4356, -12653, -24777, +-27587, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -28981, -21547, -13072, -2334, 2998, +5332, 8148, 12428, 13890, 15560, 16843, 19732, 21743, 22692, 22835, 21749, 23845, 27307, 29179, 29179, 29179, +29179, 29179, 29179, 27534, 19967, 9724, 10040, 12717, 7505, 3554, -5714, -8898, -13411, -14627, -14615, -21704, +-24962, -20691, -13435, -17516, -15965, -19438, -21123, -20720, -25795, -27697, -27663, -27762, -28661, -28889, -29202, -27131, +-18895, -1991, 6120, 10115, 8995, 9054, 8022, 4625, -567, -3261, 2609, 2466, 4159, 7575, 9172, 9911, +8141, 12834, 17152, 22667, 24638, 26165, 28224, 27195, 27730, 29179, 28392, 26867, 24892, 20926, 17637, 10507, +7325, 4938, 2949, 3356, 4391, 7622, 2477, 968, -2885, -13230, -24466, -27996, -29202, -29202, -29202, -29202, +-29202, -29202, -29202, -29202, -29202, -29202, -23892, -15745, -13517, -10168, -9220, -8949, -5858, 588, 6587, 13911, +23042, 25022, 25211, 20258, 19140, 20073, 29179, 29179, 29179, 29179, 29179, 29179, 29179, 25706, 19372, 14154, +13408, 6853, 5396, 2279, -2879, -709, -7242, -9312, -9063, -19895, -20911, -20158, -20278, -15782, -9146, -7592, +-6992, -8245, -13699, -15937, -14307, -12105, -14242, -25633, -25474, -25379, -23183, -22750, -17166, -7323, -6234, -951, +-3901, -3787, -2613, -1280, -1545, 16, -4239, -3367, -111, -1705, 1358, 8786, 13536, 19630, 21301, 19826, +23249, 29179, 29179, 29179, 29179, 29179, 28472, 22690, 14752, 12446, 10723, 7264, 4639, 7751, 4411, 6706, +7560, 6440, 3994, -322, -812, -8053, -14212, -23511, -28928, -29202, -26429, -29202, -29202, -29202, -29161, -29202, +-29202, -29202, -28472, -18545, -15871, -15859, -13835, -6522, -1910, -3170, -1214, 7027, 6106, 4437, 6125, 3239, +10869, 17907, 29179, 29179, 29179, 29179, 29179, 29179, 29179, 29179, 19976, 15906, 10409, 7678, 3636, 3774, +6184, 7363, 6192, 5558, 912, -6309, -9321, -9785, -13553, -16052, -13517, -13489, -13137, -13446, -20296, -19447, +-19138, -19813, -20500, -23543, -28202, -20306, -12483, -5064, -7726, -11830, -8979, -7009, -9903, -7930, -4202, -1220, +-1400, -5644, -5515, -1675, -606, 515, 6714, 11639, 13817, 12104, 11232, 14665, 19354, 20971, 22689, 28565, +29179, 26576, 25862, 23087, 16949, 15227, 16452, 13512, 16593, 17206, 11606, 14799, 16521, 14453, 11674, 1713, +-4287, -8470, -15474, -21607, -27177, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -29202, -21900, +-14332, -13948, -14967, -8911, -5900, -2168, 3699, 2592, 340, 3727, 11746, 14616, 19496, 21561, 26579, 28728, +29179, 29179, 29179, 29179, 29179, 29179, 27364, 15534, 11587, 6635, 4333, 6798, 7230, 5121, 2653, -1064, +-5963, -6228, -6597, 686, 2367, -1332, -9163, -13702, -15050, -15946, -21832, -25422, -23983, -21149, -22620, -21121, +-16905, -14389, -13592, -12676, -10107, -13204, -15847, -10891, -3951, -2113, -3534, -2530, 2462, -3001, -7995, -7282, +-5846, -2043, 2665, 6519, 12295, 13235, 13937, 19159, 25838, 29179, 29179, 29179, 25625, 19237, 16718, 13449, +13792, 13567, 14145, 15496, 17601, 18025, 15311, 14377, 12624, 12757, 5882, 730, -7078, -10830, -13315, -16267, +-21968, -26169, -27401, -29202, -29202, -29202, -29202, -29202, -27586, -22405, -19205, -19340, -20424, -19837, -16789, -14647, +-11546, -6076, -121, 1744, 2580, 5321, 9603, 10595, 18139, 22306, 19186, 21109, 29179, 29179, 29179, 29179, +29179, 29179, 21418, 14700, 13774, 12949, 10930, 11259, 7856, 2879, -1624, -4554, -4554, -2937, -2907, -1003, +-4631, -6919, -8476, -13690, -18792, -17319, -16585, -18258, -18787, -18592, -12819, -10286, -10445, -14065, -18038, -15978, +-11447, -12545, -11676, -8830, -9348, -7153, -3403, -4522, -2426, -2026, -2509, -4897, -3735, -1110, 3136, 3350, +3732, 7778, 12450, 15584, 16345, 20892, 25364, 24993, 21603, 19043, 20794, 24402, 25809, 21077, 12853, 8797, +8710, 8336, 5665, 8861, 11202, 10524, 6987, 4319, 1438, 1438, -4395, -9847, -15433, -25474, -29202, -29202, +-29202, -29202, -27255, -23304, -20063, -22618, -21813, -21912, -21051, -20158, -16038, -12446, -10939, -9980, -6240, -3876, +2164, 5405, 7815, 12287, 16729, 17394, 18981, 21722, 24361, 26659, 24870, 24210, 24443, 26507, 29179, 28532, +22831, 17102, 9665, 4417, 886, -955, -53, 2391, 4379, 8377, 6408, -2113, -6503, -7520, -11567, -14194, +-14743, -15432, -20585, -20014, -16147, -17166, -14594, -5662, -3543, -5709, -5771, -7873, -11591, -16181, -18289, -14234, +-10699, -5440, -1831, -5571, -8752, -6105, -4886, -4219, -2134, 120, 4695, 9046, 7201, 5720, 6983, 9528, +9750, 10631, 11631, 12578, 16991, 19587, 21084, 24207, 24581, 22978, 16581, 11461, 13433, 17725, 17946, 14358, +7052, 2706, -355, -3616, -2602, 2766, 675, -4238, -7792, -12848, -17969, -27720, -29202, -27945, -28263, -27926, +-25279, -20314, -17897, -18054, -20121, -20607, -18938, -16876, -16764, -14900, -10960, -6212, 736, 5597, 10938, 12870, +11046, 12089, 16167, 15795, 18487, 21230, 22539, 23434, 25572, 28422, 27329, 21802, 14990, 9804, 7838, 7894, +9448, 8406, 8082, 5762, 2811, 1128, 381, -1437, -5950, -7208, -6180, -2797, -4872, -10466, -13963, -18462, +-20525, -15754, -12433, -11150, -8556, -5630, -5052, -9398, -11394, -9015, -8078, -8201, -8990, -7649, -8935, -13314, +-17584, -16348, -13365, -9180, -1973, 709, 4455, 10195, 11617, 12508, 11099, 9847, 9231, 8352, 6395, 6815, +9418, 15552, 20325, 19373, 16843, 19565, 23882, 25065, 20648, 15735, 14164, 10945, 4366, 1148, 5421, 10163, +8443, 3678, -1025, -3184, -7973, -17459, -22828, -23547, -22255, -20215, -18344, -16636, -16848, -16331, -18040, -21721, +-25422, -27253, -26939, -22883, -16917, -12604, -8841, -6649, -2302, 598, 2738, 5682, 11341, 15861, 17987, 18066, +21485, 22160, 19531, 15477, 15861, 17736, 19348, 22270, 21735, 18049, 15884, 13235, 10252, 9216, 9029, 5359, +2103, 2807, 1939, 1381, 1187, -1322, -5295, -8592, -9860, -11559, -11706, -13079, -11436, -9182, -8982, -10429, +-13467, -15465, -15383, -15150, -13114, -8470, -4220, -3357, -6156, -10267, -10736, -8495, -10456, -12863, -12550, -9195, +-6112, -4945, -2964, 1199, 6828, 8424, 6952, 7961, 9363, 12010, 13883, 11405, 10079, 11207, 13365, 15274, +16672, 17981, 17451, 18718, 20119, 18807, 15732, 13696, 14872, 12938, 8010, 5357, 4236, 1370, -3929, -5605, +-5285, -6763, -11556, -18530, -23156, -24519, -24057, -22865, -21340, -21569, -21311, -19914, -16832, -13185, -13343, -15177, +-15055, -14329, -14087, -12765, -11318, -8124, -3163, 1564, 5792, 12909, 19635, 20071, 17720, 19273, 21712, 20243, +18225, 16758, 16587, 17424, 16405, 12510, 10217, 10984, 14392, 17044, 16180, 13677, 10371, 7311, 3106, -1696, +-4823, -5804, -7668, -8982, -7032, -6219, -6008, -7986, -11932, -15832, -17996, -16526, -12722, -10387, -6799, -3595, +-4787, -9173, -12692, -11297, -9213, -6724, -5882, -5422, -6705, -10647, -13161, -12701, -9091, -4649, -838, 710, +2048, 5506, 7964, 6443, 4055, 4791, 9207, 13268, 14207, 13090, 12545, 15532, 19191, 18945, 15632, 15350, +18321, 19455, 18293, 16900, 12440, 6547, 4510, 3256, 1881, 1911, 2160, 1170, -2113, -6958, -11101, -13056, +-14386, -17133, -19135, -19557, -18436, -19642, -22241, -22726, -21044, -18411, -15434, -13295, -9832, -8562, -9152, -9219, +-10034, -9846, -8085, -4224, -1115, 1896, 5595, 10611, 15365, 17774, 19120, 22468, 25327, 23726, 20279, 17724, +15539, 14114, 16285, 16331, 13052, 9644, 6837, 3577, 1331, 2255, 3906, 5373, 3957, 1140, -2648, -5368, +-6023, -7468, -10132, -11470, -11198, -11138, -10002, -8264, -7180, -6229, -7804, -10271, -12818, -13361, -12722, -10887, +-7226, -5315, -5632, -7787, -9164, -9504, -9076, -6349, -4569, -5198, -6694, -7376, -5184, -2046, 1927, 6321, +10627, 12776, 13907, 14728, 14660, 12618, 9775, 6933, 6244, 8722, 13222, 18629, 21617, 21555, 20931, 19135, +13426, 6977, 3222, 1553, 501, 1632, 2003, 379, 104, -462, -3986, -7128, -8311, -8860, -11084, -14695, +-16305, -19107, -22442, -24323, -24665, -22431, -18724, -15469, -12917, -11312, -12084, -12477, -11321, -7610, -2703, 263, +2535, 5295, 6918, 7542, 10306, 13521, 14668, 13024, 12909, 15281, 17313, 18109, 18668, 20522, 21044, 17530, +12743, 9274, 6160, 4621, 4770, 5074, 3918, 3005, 2766, 1914, 880, -361, -3147, -4640, -6307, -8783, +-10502, -9246, -7528, -6748, -7009, -8288, -10192, -11276, -11316, -11719, -11634, -10830, -11621, -12491, -11683, -9485, +-7027, -2963, 150, -519, -4288, -6729, -6553, -6405, -5968, -2952, 2054, 6689, 8265, 7502, 6121, 5065, +7238, 9993, 9620, 9722, 11159, 12242, 13460, 13549, 13187, 14410, 15325, 14755, 15563, 15717, 14641, 13387, +10519, 6579, 2898, -1104, -4463, -5917, -6272, -8276, -10185, -10323, -9695, -11402, -15395, -17956, -17580, -16606, +-16730, -16945, -16140, -17092, -19430, -19563, -17270, -13020, -7767, -4760, -3385, -1428, 1969, 4722, 5783, 6758, +8092, 7869, 7830, 9004, 9025, 9956, 13485, 16809, 18769, 18877, 17195, 14872, 11839, 10671, 12513, 13498, +11819, 9236, 8357, 7787, 6415, 3237, -257, -1629, -4918, -9704, -12680, -12573, -9447, -7519, -7584, -7077, +-5236, -4855, -5717, -7284, -8471, -9549, -10933, -11703, -12667, -12239, -11354, -9449, -7110, -5247, -2230, -838, +-2168, -4462, -5947, -5204, -3403, -1845, 508, 679, -985, 74, 2385, 4534, 7009, 9723, 10895, 11039, +9967, 9819, 11552, 13458, 15404, 18175, 20608, 20506, 16986, 11851, 8144, 6486, 5540, 4800, 4248, 2964, +876, -297, -2010, -5266, -8844, -12643, -15890, -15972, -13729, -11107, -9522, -8670, -9031, -11897, -15755, -18101, +-17623, -16700, -15841, -14754, -12502, -10938, -10725, -9490, -6329, -1967, 2816, 6275, 7880, 8086, 9126, 10522, +11021, 11819, 13902, 14926, 15584, 17448, 18292, 17283, 14372, 11026, 9724, 8906, 7930, 8831, 10285, 9268, +7072, 6437, 4129, 224, -2286, -4494, -8166, -11938, -12850, -12528, -12377, -11776, -9983, -7503, -4730, -2005, +-930, -1395, -2416, -4769, -7312, -8981, -10013, -11187, -12985, -14148, -12490, -9760, -8623, -7537, -5436, -3632, +-599, 2800, 3891, 2020, 2329, 4628, 4753, 4215, 5929, 7293, 6184, 5933, 7220, 9280, 13238, 17329, +17588, 13212, 8984, 8300, 9150, 10470, 12061, 12538, 11936, 11355, 9320, 5174, 342, -2714, -4233, -4874, +-5028, -4951, -5977, -7925, -9040, -9279, -9797, -11683, -14035, -16770, -18417, -17491, -15484, -13854, -13131, -14527, +-15771, -14724, -11666, -7400, -4472, -3351, -1599, 1756, 5652, 9046, 10731, 10498, 9902, 9902, 11231, 13351, +13950, 15191, 16833, 16754, 15838, 13620, 10016, 6812, 5981, 7328, 7897, 7380, 7312, 6672, 3606, 442, +-1559, -2739, -2296, -994, -860, -2770, -5452, -8202, -11831, -15354, -15556, -12751, -8686, -5166, -2756, -3035, +-3928, -5277, -8145, -10645, -10535, -9063, -8835, -9121, -8251, -6371, -5907, -6310, -3786, 14, 2160, 3330, +4996, 6904, 6985, 5594, 3947, 3286, 3350, 4676, 6079, 5684, 5787, 6164, 6676, 8498, 10237, 11442, +13549, 16672, 18196, 16010, 12101, 8965, 6859, 4950, 3626, 3051, 2847, 2574, 571, -3847, -9449, -13307, +-13866, -13720, -13824, -13000, -11853, -11391, -11475, -11376, -12382, -14375, -15425, -14408, -13363, -12959, -11679, -9477, +-7323, -5721, -4257, -758, 3821, 7927, 10252, 9600, 7845, 6747, 6293, 7240, 10121, 12985, 14020, 13602, +12501, 12168, 12700, 13248, 13417, 12175, 10087, 9064, 7343, 4073, 2488, 3307, 3717, 2714, 1443, -294, +-2930, -6514, -10223, -12321, -12515, -11630, -10551, -9672, -8384, -7425, -6832, -6615, -6845, -7505, -7569, -6081, +-4630, -4361, -3268, -1519, -1392, -3317, -5690, -6675, -6204, -5620, -4554, -2498, -1240, -1079, -127, 1115, +2605, 4442, 6378, 8386, 9445, 8678, 7495, 7018, 6875, 8153, 10850, 13393, 13956, 12444, 10826, 10641, +11069, 10140, 8605, 7307, 5852, 4099, 2608, 1358, -786, -3198, -4960, -6768, -7807, -7825, -8844, -11129, +-14352, -16086, -15202, -13118, -11061, -9873, -9449, -8677, -8086, -8979, -10964, -13298, -13870, -12294, -9529, -5425, +-885, 2669, 5139, 6241, 6322, 5497, 5212, 7578, 10765, 12643, 13965, 14960, 15062, 14773, 14557, 14317, +13801, 12855, 11830, 10738, 8381, 5606, 3295, 1619, 424, -502, -2010, -4723, -6717, -6950, -6229, -6381, +-7348, -8151, -8494, -7737, -6121, -5101, -4233, -3640, -4832, -6799, -8184, -8276, -7206, -6647, -6882, -7260, +-7175, -5834, -4038, -4139, -4759, -3619, -1789, -462, -330, -587, 349, 1531, 1875, 2538, 3757, 4645, +4777, 4615, 5126, 6525, 8253, 10601, 13266, 14168, 12526, 10771, 10544, 10801, 8697, 5597, 4049, 3228, +2212, 2033, 3544, 4978, 4223, 3283, 3544, 2011, -1843, -5101, -6368, -7455, -10639, -14210, -15394, -14273, +-12830, -12612, -13093, -13314, -12931, -13020, -14155, -14456, -12863, -9715, -5447, -1491, 863, 1132, 354, -39, +450, 2941, 7322, 11453, 13724, 14364, 14543, 14543, 13918, 12938, 11991, 10522, 9237, 8934, 8621, 8253, +7806, 7471, 7086, 6181, 4214, 1982, 618, -677, -1611, -2707, -4334, -5574, -6669, -8111, -9106, -8549, +-6560, -4379, -3607, -4657, -6717, -9403, -11286, -11239, -9058, -6046, -4324, -4257, -4917, -5335, -4933, -4337, +-3724, -3245, -2295, -60, 2271, 3423, 3356, 2773, 2391, 2343, 2012, 1138, 1194, 1282, 736, 1138, +3301, 5369, 5946, 6624, 8611, 11543, 14841, 17467, 17055, 13563, 8846, 4679, 2654, 2342, 2349, 2596, +3356, 2717, 475, -1288, -1784, -1544, -1711, -2322, -3202, -5648, -10593, -14821, -16544, -17360, -18084, -18185, +-17710, -16115, -12862, -9417, -7212, -6246, -5093, -2941, -866, 263, 712, 1404, 2726, 4773, 6221, 5537, +4275, 3948, 5282, 7821, 10487, 12410, 13003, 12968, 13437, 14196, 14012, 12456, 10309, 8651, 7867, 6532, +4444, 3201, 2599, 1257, -24, -1156, -3477, -6625, -8923, -9910, -9903, -9350, -8358, -7540, -7109, -7226, +-7728, -7359, -5818, -4557, -3983, -4018, -4355, -4549, -4842, -5440, -5283, -3958, -1716, -176, -584, -1893, +-1679, 19, 851, -49, -1213, -975, 418, 1254, 1344, 1652, 2967, 3994, 3135, 2114, 2440, 4241, +7171, 10575, 13188, 14427, 13730, 12592, 12061, 11110, 9664, 8792, 7821, 5461, 1780, -2201, -5049, -5775, +-5382, -4282, -2792, -2214, -3188, -4634, -5685, -6780, -7623, -7726, -8470, -10499, -13489, -16280, -17092, -15788, +-13217, -11021, -9712, -8361, -6565, -4203, -2216, -702, 1452, 3957, 5390, 5537, 5256, 5457, 6650, 8746, +11396, 13179, 12828, 11850, 11709, 12277, 13184, 13558, 12506, 10434, 8710, 7756, 6857, 5126, 2590, -347, +-3129, -4783, -5552, -6137, -6660, -7425, -7277, -6212, -5744, -6565, -7898, -8401, -7163, -4966, -3111, -2325, +-2673, -4062, -6066, -7484, -7078, -5178, -3245, -1807, -1266, -1861, -2883, -4142, -4670, -3528, -1355, 777, +2036, 1201, -517, -689, 808, 2288, 3234, 3781, 4293, 4965, 5109, 5191, 5983, 6781, 6750, 7210, +8632, 9994, 10589, 10553, 9779, 8247, 6125, 3412, 1170, 791, 1719, 3183, 4059, 3042, 571, -2132, +-4305, -5492, -6078, -6871, -7266, -7381, -8461, -10565, -13204, -15633, -16207, -14786, -12696, -10912, -10595, -11779, +-12528, -10960, -7023, -3029, 746, 4698, 7073, 7963, 8110, 8052, 7949, 8089, 8987, 10371, 11560, 11984, +11772, 11836, 12459, 12394, 10268, 7311, 5057, 3760, 3850, 5029, 5650, 4826, 2919, 519, -1285, -2222, +-2791, -4146, -6366, -8413, -9791, -10041, -9309, -7510, -4954, -3120, -2600, -3122, -4643, -6436, -6851, -6225, +-6198, -6619, -5785, -3878, -2597, -1977, -1152, -331, 406, 919, 1249, 1316, 965, -59, -1245, -1271, +385, 2690, 3594, 2188, 149, -370, 450, 1469, 2097, 2981, 4716, 7190, 9537, 10657, 10450, 10084, +9656, 8499, 7323, 6927, 6983, 6965, 6586, 5856, 4600, 2574, -172, -2712, -4373, -4652, -4151, -4452, +-6369, -9070, -11920, -14083, -15458, -15540, -13927, -11570, -9590, -8853, -9632, -10401, -9692, -7962, -5276, -2221, +251, 1243, 588, 61, 1097, 2727, 4345, 6252, 8183, 9951, 11715, 13335, 14334, 14406, 13326, 11683, +9522, 7458, 6312, 5924, 6140, 6175, 4896, 2908, 1352, 534, -114, -683, -538, -425, -2028, -4911, +-7630, -9118, -9272, -8994, -9130, -9718, -10032, -9229, -7476, -5834, -4328, -2564, -695, 118, -240, -1082, +-686, 536, 358, -1307, -2100, -1656, -1300, -1298, -975, -547, -546, -727, -331, -105, -805, -1724, +-2307, -2247, -1272, 1102, 4135, 6125, 6675, 6592, 6665, 7806, 9854, 11805, 12317, 11231, 9002, 6909, +5241, 4332, 4368, 4040, 2741, 1222, 393, 254, 31, -994, -2265, -3147, -4341, -6651, -9295, -10690, +-10658, -10492, -10789, -11292, -11785, -12227, -12942, -13197, -12060, -9797, -6596, -2899, -446, 351, 639, 657, +459, 405, 886, 2268, 4074, 5981, 8481, 11356, 13767, 15052, 15282, 15045, 14579, 13573, 12435, 11129, +9145, 6285, 2755, -756, -3494, -4879, -4300, -2156, -505, -878, -2371, -3928, -5733, -7354, -7277, -6120, +-5313, -5054, -4765, -4732, -5620, -6750, -7308, -7244, -6401, -4489, -1715, 778, 2272, 2480, 1673, 725, +-170, -1216, -2070, -2393, -2462, -2836, -3477, -3571, -2852, -1562, -112, 1053, 1765, 2514, 2939, 2963, +3074, 3028, 2048, 1144, 2256, 5269, 8098, 9682, 9836, 8472, 6561, 5501, 5515, 6052, 7078, 7976, +7646, 5723, 3112, 655, -909, -985, -477, -765, -1881, -3127, -4255, -6170, -8903, -11507, -13461, -14294, +-13993, -13008, -12109, -11810, -11731, -11391, -10360, -8600, -6328, -3460, -459, 1375, 1816, 2329, 3699, 5205, +6096, 7136, 8592, 9775, 10897, 11524, 11328, 10732, 10645, 11039, 11496, 11690, 11313, 9923, 7024, 2984, +-842, -3353, -4214, -3606, -2681, -2286, -2968, -4728, -6017, -5584, -4407, -3652, -2950, -2148, -2286, -3981, +-6120, -7433, -7610, -6919, -5922, -5238, -4501, -3207, -1839, -900, -744, -1207, -1172, 58, 1822, 3289, +4184, 4122, 2443, -663, -3780, -4823, -3672, -2512, -2359, -2047, -1266, -777, -175, 917, 2004, 2957, +3861, 4892, 6249, 7066, 6468, 5896, 6897, 8284, 8806, 9375, 10170, 9488, 7024, 4822, 3784, 2941, +2274, 2294, 2298, 1455, -261, -2944, -6125, -9014, -11038, -11837, -11410, -10309, -9952, -11067, -12549, -13543, +-13751, -12481, -10062, -7904, -5973, -3744, -1643, -61, 1313, 2684, 3744, 3701, 3130, 3411, 5200, 7751, +9717, 10589, 11057, 11072, 10263, 9418, 9500, 10329, 10655, 9846, 7817, 4864, 2224, 1417, 1802, 1546, +263, -1045, -1919, -3261, -5240, -7217, -8384, -8489, -7866, -7192, -6578, -5533, -4294, -3674, -3488, -3387, +-3143, -2836, -2719, -2472, -1905, -977, -20, 454, 260, 275, 973, 1656, 1467, 333, -903, -1563, +-1699, -1883, -2160, -2195, -2040, -2013, -2249, -2204, -1375, -896, -1245, -1203, -240, 1394, 3764, 6715, +9207, 10597, 10692, 9980, 9059, 8416, 8089, 7788, 6942, 5212, 3569, 3228, 3755, 3734, 2697, 1015, +-1047, -3303, -5335, -6442, -6452, -6143, -6294, -7372, -9538, -12248, -14258, -14621, -13349, -11180, -8844, -7144, +-6422, -6675, -6778, -5657, -3239, -554, 1546, 2917, 3985, 5001, 5735, 6331, 7052, 7878, 8615, 9443, +10973, 12868, 14200, 14245, 12644, 9923, 7153, 4865, 3085, 1780, 448, -715, -1343, -2000, -3090, -3846, +-4026, -4355, -5162, -5803, -6053, -6427, -7034, -7083, -6429, -5586, -4511, -3308, -2444, -1654, -336, 1108, +1964, 1780, 1220, 648, -343, -1711, -2688, -2408, -1113, 75, 1, -1240, -2313, -2579, -2803, -3242, +-3007, -1599, 132, 1299, 1510, 795, 4, -420, -1047, -1233, -39, 2178, 4205, 5732, 6876, 7488, +7838, 8498, 9254, 9673, 9515, 9151, 8495, 6949, 4560, 2453, 1467, 1211, 557, -1068, -2714, -3284, +-3154, -3938, -5425, -6998, -8776, -10740, -11966, -12061, -12025, -12635, -13234, -13295, -12676, -11144, -8473, -4975, +-1453, 998, 2249, 2816, 3292, 3861, 4850, 6206, 7273, 7758, 8438, 9673, 10829, 11551, 11910, 11460, +10207, 8893, 7523, 6042, 4686, 3319, 1840, 704, 126, -777, -2615, -4459, -5292, -5300, -4935, -4066, +-3357, -3646, -4393, -4856, -5131, -5376, -5055, -4012, -3329, -3490, -3812, -3465, -2152, -325, 1051, 1747, +1982, 1948, 1828, 1693, 1363, 736, -377, -2247, -4318, -5532, -4948, -2719, -592, -195, -930, -1348, +-1197, -1282, -1502, -1418, -738, 399, 1665, 2513, 2846, 3002, 3140, 3407, 4159, 5531, 7292, 9107, +10525, 11374, 11190, 10033, 8957, 8238, 7143, 5442, 3012, 56, -3166, -6001, -7440, -7174, -6583, -6889, +-7928, -9222, -10450, -11207, -10821, -9784, -9595, -10778, -11829, -11440, -9912, -7778, -5173, -2697, -1073, 68, +1621, 3812, 6207, 7835, 8260, 7872, 7244, 6720, 7141, 8737, 10135, 10170, 9546, 9164, 8734, 7659, +6309, 5200, 4400, 3558, 2157, 118, -2029, -3399, -3965, -3905, -3516, -3317, -3892, -5002, -6012, -6726, +-6885, -6362, -5607, -4853, -3786, -2325, -1100, -601, -352, 239, 853, 902, 820, 1077, 1531, 1580, +1205, 686, 509, 588, 454, -486, -2095, -3641, -4666, -5464, -6064, -5995, -4721, -2448, -465, 205, +-140, -483, -297, 452, 1926, 3888, 5766, 6841, 7031, 6582, 6218, 6394, 6833, 7307, 7879, 8418, +8804, 8888, 8333, 6953, 4782, 2263, 381, -420, -976, -2249, -4400, -6903, -9601, -12176, -13751, -13344, +-11341, -9100, -7804, -7750, -8464, -9229, -9537, -9045, -7506, -5438, -3534, -1863, -331, 1175, 2367, 2987, +3567, 5061, 7237, 9021, 10346, 11287, 11541, 11055, 9981, 8641, 7448, 7027, 7201, 6934, 5652, 3790, +1775, -288, -2132, -3205, -3628, -3750, -3782, -3791, -4006, -4586, -5253, -5636, -5624, -5166, -4449, -3715, +-3261, -3152, -3028, -2311, -1119, 52, 1185, 2303, 3298, 3592, 2906, 1847, 902, 80, -728, -1551, +-2412, -2885, -3012, -3366, -3901, -3879, -3017, -2059, -1937, -2322, -2578, -2735, -2976, -3225, -2700, -991, +1455, 3903, 5720, 6369, 5983, 5528, 5534, 5938, 6689, 7951, 9339, 9819, 8913, 7384, 5854, 4746, +4043, 3702, 3313, 2877, 2487, 1811, 244, -2889, -7032, -10408, -11913, -11566, -10188, -9302, -9889, -11589, +-13247, -13943, -13021, -10525, -7261, -4255, -1864, -252, 442, 626, 902, 1692, 3036, 4603, 6237, 7912, +9064, 9306, 9087, 8952, 8959, 8925, 8896, 8929, 8866, 8519, 7530, 5323, 1735, -1791, -3679, -3920, +-3736, -3569, -3014, -2216, -2040, -2706, -3586, -4358, -5055, -5416, -4970, -3893, -2691, -1911, -1854, -2168, +-2195, -1605, -555, 589, 1431, 1717, 1655, 1658, 1996, 2358, 2437, 1772, 172, -1684, -2950, -3658, +-4245, -4911, -5285, -5046, -4306, -3454, -2570, -1578, -946, -1051, -1526, -1620, -1171, -389, 393, 1168, +2323, 4295, 6741, 8746, 9708, 9807, 9384, 8840, 8456, 8050, 7350, 6574, 5920, 5112, 4102, 3036, +2130, 1205, -121, -2040, -4468, -7037, -9082, -10020, -9742, -9045, -8953, -9992, -11829, -13601, -13910, -12197, +-9335, -6591, -4760, -3841, -3040, -1461, 886, 3537, 5607, 6612, 6707, 6788, 7157, 7396, 7298, 6972, +6611, 6519, 6938, 7708, 8228, 8233, 7730, 6818, 5296, 3268, 1235, -269, -1477, -2640, -3646, -4374, +-5015, -5589, -5904, -5606, -4679, -3786, -3152, -2527, -1632, -863, -859, -1574, -2345, -2651, -2042, -561, +853, 1652, 2041, 2462, 2760, 2835, 2586, 1850, 847, -181, -1556, -3181, -4074, -3944, -3731, -4328, +-5110, -5165, -4634, -4190, -3944, -3580, -2900, -1935, -946, 14, 1227, 2638, 3852, 4660, 5127, 5522, +6111, 6786, 7389, 8098, 9515, 11268, 11881, 10489, 7734, 4694, 2617, 1877, 1918, 1781, 820, -995, +-3041, -4755, -6308, -7761, -8768, -8952, -8771, -8857, -9504, -10634, -11603, -11718, -10730, -8927, -7057, -5672, +-4416, -3025, -1632, -364, 952, 2367, 3925, 5597, 7509, 9717, 11442, 11529, 9869, 7655, 6106, 5583, +5851, 6468, 6721, 6182, 4737, 2718, 606, -893, -1220, -371, 491, 399, -924, -2973, -5338, -7288, +-8120, -7527, -5739, -3430, -1733, -1258, -1592, -1583, -660, 600, 1381, 1480, 1500, 1610, 1473, 949, +674, 977, 1295, 965, 409, 68, -281, -899, -1733, -2935, -4114, -4634, -4628, -4896, -5328, -5425, +-4935, -4078, -3126, -2490, -2065, -1357, -157, 1047, 2102, 3011, 3879, 4722, 5908, 7472, 9017, 9999, +10237, 9583, 8070, 6353, 5152, 4819, 5324, 6325, 6617, 5588, 3250, 234, -2808, -5018, -5999, -6045, +-5877, -6201, -7647, -9946, -12105, -12968, -12454, -11047, -9380, -7878, -6716, -6036, -5565, -4939, -3807, -2001, +102, 2018, 3568, 4914, 6125, 7115, 7787, 8003, 7930, 7801, 7801, 8010, 8467, 9023, 9114, 7891, +4992, 1443, -1232, -2261, -1907, -975, -140, -200, -1390, -3117, -4355, -4573, -3938, -3088, -2454, -2280, +-2645, -3260, -3702, -3902, -3700, -2677, -842, 1024, 2365, 3170, 3702, 3903, 3682, 3069, 2196, 1029, +-237, -1460, -2402, -2879, -2999, -2950, -3005, -3273, -3621, -3889, -4102, -4447, -4673, -4258, -3282, -2457, +-2260, -2356, -2143, -1515, -483, 735, 2069, 3325, 4452, 5657, 7225, 9197, 10672, 10855, 10117, 9320, +8721, 8153, 7483, 6579, 4837, 2418, 208, -1298, -2013, -2031, -1752, -1949, -3139, -5068, -7354, -9648, +-11424, -12135, -11603, -10304, -8978, -8175, -7891, -7834, -7520, -6521, -4548, -2061, 38, 1368, 2156, 2769, +3460, 4496, 5955, 7359, 8089, 8101, 7856, 7721, 7839, 8056, 8013, 7427, 6147, 4375, 2614, 1398, +624, -2, -1074, -2588, -4164, -5093, -4965, -3855, -2480, -1837, -2253, -3182, -3671, -2986, -1534, -281, +221, -139, -1028, -1697, -1437, -416, 682, 1643, 2459, 2941, 3031, 2925, 2645, 1996, 1170, 223, +-829, -2128, -3383, -4957, -6632, -7749, -7530, -6170, -4444, -2973, -2131, -1984, -2277, -2433, -2081, -1199, +-151, 804, 1395, 1775, 2388, 3690, 5511, 7219, 8265, 8740, 9069, 9400, 9500, 9400, 9099, 8393, +6965, 5022, 2912, 998, -370, -1003, -1463, -2640, -4680, -6918, -8370, -8591, -7795, -7048, -7116, -8060, +-9337, -10310, -10508, -9888, -8746, -7391, -5794, -3927, -2083, -404, 1278, 2851, 4192, 5212, 5823, 6098, +6231, 6192, 5993, 6179, 7018, 8160, 8663, 8187, 6848, 5104, 3459, 2323, 1509, 764, -59, -1225, +-2579, -3815, -4212, -3864, -3348, -3326, -3771, -4078, -3603, -2472, -1214, -251, 135, -75, -792, -1256, +-873, 203, 1628, 2931, 3617, 3240, 2160, 832, -103, -463, -127, 347, 510, 26, -978, -2304, +-3642, -5034, -6276, -6778, -6366, -5507, -4851, -4404, -3902, -3117, -2035, -869, 25, 602, 1224, 2151, +3170, 3879, 4356, 4785, 5259, 5817, 6525, 7784, 9317, 10282, 10176, 9326, 8162, 6805, 5220, 3550, +2138, 949, -324, -1840, -3451, -5198, -6999, -8673, -9687, -9943, -9693, -9234, -8706, -8021, -7279, -6639, +-6189, -5861, -5699, -5456, -4721, -3384, -1736, -35, 1664, 3228, 4403, 5028, 5373, 5901, 6678, 7331, +7666, 7838, 7821, 7343, 6275, 4837, 3624, 3048, 3056, 2998, 2115, 376, -1745, -3552, -4498, -4432, +-3722, -3302, -3460, -3872, -3766, -2864, -1545, -616, -429, -637, -599, -190, 405, 929, 1295, 1455, +1478, 1553, 1866, 2201, 2276, 2121, 1591, 773, -87, -948, -2013, -3163, -3876, -4053, -4190, -4792, +-5645, -5956, -5245, -4059, -3181, -2907, -3175, -3628, -3735, -2982, -1339, 782, 3106, 5138, 6249, 6355, +6166, 6348, 6840, 7417, 7980, 8441, 8569, 8119, 7066, 5717, 4424, 3575, 3361, 3350, 2778, 1398, +-519, -2668, -4835, -6703, -8042, -8723, -8945, -8769, -8482, -8434, -8674, -8990, -8967, -8494, -7382, -5650, +-3352, -954, 901, 1692, 1445, 981, 977, 1580, 2671, 4003, 5474, 6794, 7641, 7575, 6788, 6024, +5890, 6160, 6285, 6007, 5144, 3652, 1768, -182, -1882, -2944, -3262, -3077, -2874, -2950, -3412, -4108, +-4503, -3983, -2582, -873, 303, 479, -93, -700, -592, 232, 1077, 1428, 1511, 1850, 2633, 3416, +3572, 2775, 1366, 80, -674, -1031, -1207, -1478, -2134, -3376, -4884, -6161, -6937, -6961, -6094, -4527, +-3036, -2249, -2188, -2481, -2560, -1875, -409, 1170, 2076, 2104, 1811, 1831, 2385, 3416, 5022, 7088, +9201, 10822, 11300, 10459, 8575, 6275, 4287, 3115, 2779, 2978, 3071, 2571, 1095, -1159, -3546, -5318, +-6253, -6578, -6656, -6867, -7418, -8252, -9122, -9739, -9791, -9197, -8102, -6602, -4790, -2962, -1653, -1007, +-607, 130, 1424, 3203, 5157, 6635, 7078, 6374, 5120, 4000, 3605, 3882, 4394, 4883, 5523, 5946, +5610, 4453, 3265, 2495, 1866, 842, -662, -2311, -3633, -4641, -5273, -5421, -4998, -3974, -2515, -967, +134, 592, 443, -11, -294, 77, 1144, 2290, 2848, 2547, 1674, 739, 143, -11, 204, 791, +1333, 1495, 1177, 337, -1097, -2890, -4484, -5532, -5993, -5832, -5103, -4346, -4050, -4108, -4276, -4300, +-3897, -2726, -1149, 244, 1257, 1801, 1903, 1927, 2452, 3598, 4862, 6058, 7103, 7904, 8228, 8205, +8118, 8050, 7904, 7453, 6502, 4955, 3196, 1595, 102, -1426, -2877, -4154, -5288, -6131, -6491, -6405, +-6284, -6350, -6779, -7572, -8398, -8747, -8238, -7059, -5864, -4942, -4104, -3158, -2205, -1124, 345, 2140, +3667, 4691, 5460, 6042, 6206, 5896, 5625, 5572, 5332, 4621, 3617, 2925, 2574, 2352, 2018, 1745, +1603, 1639, 1527, 1077, 312, -640, -1614, -2460, -3275, -3982, -4365, -4249, -3658, -2874, -2100, -1241, +-291, 538, 1132, 1644, 2231, 2703, 2775, 2572, 2351, 2182, 1877, 1279, 527, 2, -206, -428, +-905, -1696, -2622, -3677, -4628, -5222, -5470, -5513, -5477, -5452, -5358, -5015, -4044, -2620, -1138, 57, +956, 1406, 1499, 1580, 1931, 2633, 3667, 5028, 6275, 7082, 7500, 7795, 7986, 7940, 7440, 6542, +5546, 4657, 3912, 3174, 2427, 1577, 253, -1678, -3747, -5440, -6512, -6937, -6692, -6335, -6439, -6982, +-7439, -7548, -7297, -6651, -5629, -4470, -3590, -3138, -2958, -2752, -2402, -1691, -434, 1428, 3581, 5448, +6767, 7216, 6787, 5744, 4731, 4248, 4388, 4699, 4850, 4685, 4037, 2691, 917, -598, -1324, -1225, +-780, -390, -334, -739, -1395, -2052, -2597, -2864, -2697, -2100, -1588, -1531, -1776, -1766, -1138, -53, +1096, 2178, 3031, 3587, 3685, 3344, 2708, 1945, 1313, 817, 303, -299, -1094, -2026, -3159, -4208, +-4954, -5245, -5198, -4921, -4557, -4202, -4012, -4008, -4017, -3628, -2703, -1392, -135, 688, 995, 1080, +1357, 1845, 2553, 3515, 4633, 5718, 6632, 7280, 7587, 7377, 6867, 6417, 6162, 6099, 5885, 5156, +3818, 2011, 75, -1761, -3159, -3803, -3816, -3552, -3668, -4522, -5916, -7334, -8320, -8606, -8042, -7077, +-6271, -5711, -5045, -4324, -3563, -2797, -1843, -832, 156, 1087, 2036, 3014, 3830, 4277, 4636, 5186, +5821, 6194, 6194, 5898, 5230, 4204, 2987, 1964, 1218, 593, -121, -717, -1024, -1104, -1263, -1697, +-2204, -2466, -2197, -1417, -423, 297, 501, 186, -434, -1064, -1225, -873, -200, 283, 441, 383, +415, 755, 1293, 2000, 2583, 2842, 2555, 1822, 847, -117, -985, -1949, -3058, -4157, -4917, -5442, +-5814, -5995, -5905, -5644, -5154, -4227, -2770, -1117, 254, 956, 938, 546, 437, 965, 2004, 3091, +3814, 4144, 4384, 4862, 5650, 6634, 7481, 7876, 7732, 7270, 6623, 5852, 4746, 3313, 1607, 62, +-1236, -2257, -3154, -3949, -4743, -5550, -6258, -6763, -6998, -6860, -6309, -5580, -5141, -5230, -5557, -5727, +-5287, -4227, -2778, -1332, -157, 706, 1422, 2133, 2932, 3734, 4361, 4637, 4566, 4417, 4235, 3880, +3322, 2910, 2954, 3316, 3570, 3512, 3104, 2097, 588, -793, -1601, -1803, -1748, -1519, -1244, -1244, +-1625, -2094, -2399, -2238, -1552, -416, 657, 1305, 1404, 1235, 810, 271, 10, 295, 1047, 1577, +1499, 986, 497, 235, 198, 303, 571, 605, 93, -923, -2225, -3465, -4586, -5459, -6163, -6541, +-6487, -5956, -5092, -4082, -2982, -1928, -823, 333, 1555, 2610, 3539, 4400, 4917, 4852, 4393, 4064, +4208, 4773, 5519, 6170, 6532, 6516, 6236, 5773, 5060, 4110, 3001, 1838, 703, -368, -1416, -2481, +-3610, -4571, -5158, -5507, -5711, -5917, -6066, -6217, -6222, -5870, -5178, -4379, -3689, -3174, -2852, -2831, +-2931, -2800, -2048, -692, 972, 2574, 3807, 4645, 5013, 4901, 4637, 4525, 4558, 4423, 4172, 3854, +3306, 2453, 1445, 755, 487, 437, 254, -17, -252, -391, -855, -1673, -2480, -2882, -2728, -2125, +-1263, -446, 120, 374, 405, 178, 22, 301, 1257, 2386, 3204, 3306, 2706, 1406, -115, -1285, +-1623, -1227, -759, -606, -829, -1225, -1793, -2454, -2950, -3182, -3357, -3646, -3962, -4275, -4604, -4824, +-4710, -4221, -3488, -2330, -765, 935, 2321, 3155, 3628, 4062, 4510, 5035, 5577, 6005, 6236, 6052, +5460, 4667, 4026, 3806, 3828, 3922, 3839, 3442, 2678, 1646, 564, -429, -1233, -1942, -2808, -3949, +-5071, -5897, -6310, -6432, -6356, -6204, -6055, -5781, -5308, -4755, -4281, -3866, -3321, -2442, -1197, 186, +1419, 2248, 2752, 3086, 3350, 3542, 3662, 3870, 4076, 4250, 4223, 3935, 3499, 3062, 2535, 1689, +758, 143, -44, -172, -482, -853, -967, -763, -455, -441, -762, -1137, -1293, -1247, -1138, -912, +-561, -114, 202, 539, 938, 1464, 1868, 1955, 1710, 1254, 826, 589, 433, 141, -367, -942, +-1545, -2174, -2571, -2643, -2673, -2903, -3145, -3071, -2763, -2540, -2439, -2359, -2359, -2730, -3253, -3642, +-3540, -2881, -1552, -20, 1193, 1903, 2311, 3000, 4055, 5437, 6780, 7906, 8379, 8033, 6964, 5618, +4471, 3631, 3011, 2336, 1671, 990, 390, -218, -823, -1480, -2221, -2952, -3482, -3798, -4102, -4548, +-5140, -5657, -5961, -6034, -5864, -5419, -4558, -3595, -2852, -2521, -2321, -1839, -912, 193, 1223, 2082, +2889, 3649, 4330, 4545, 4166, 3334, 2623, 2285, 2418, 2725, 2910, 2745, 2189, 1361, 571, 260, +510, 954, 1011, 448, -432, -1271, -1883, -2120, -1891, -1064, 2, 697, 532, -407, -1460, -1901, +-1435, -352, 791, 1789, 2361, 2492, 2169, 1543, 765, 28, -519, -709, -556, -236, -96, -554, +-1626, -2984, -4157, -4790, -4591, -3744, -2789, -2395, -2625, -3066, -3279, -3072, -2512, -1617, -542, 525, +1254, 1413, 1057, 624, 746, 1815, 3769, 5878, 7446, 8059, 7878, 7121, 6175, 5364, 4807, 4232, +3404, 2248, 920, -423, -1827, -2968, -3578, -3528, -3120, -2601, -2341, -2485, -3108, -3889, -4413, -4498, +-4305, -4041, -3970, -4221, -4707, -5066, -4929, -4315, -3239, -1867, -185, 1495, 2691, 3121, 3012, 2752, +2788, 3190, 3925, 4667, 5088, 4752, 3605, 2127, 931, 368, 297, 560, 932, 1267, 1352, 1039, +278, -710, -1461, -1596, -1124, -500, -261, -546, -1232, -1922, -2174, -1675, -463, 923, 1991, 2347, +2096, 1541, 1007, 698, 600, 652, 735, 721, 354, -328, -1124, -1832, -2515, -3029, -3296, -3236, +-2985, -2698, -2481, -2522, -2882, -3296, -3590, -3344, -2560, -1449, -451, 193, 576, 722, 826, 956, +1368, 2096, 3036, 3852, 4287, 4347, 4241, 4345, 4779, 5424, 5898, 6016, 5730, 5058, 4025, 2711, +1467, 397, -686, -1898, -3117, -4017, -4458, -4623, -4708, -4733, -4780, -4651, -4290, -3693, -3072, -2754, +-2725, -2986, -3403, -3755, -3797, -3550, -3029, -2158, -914, 501, 1780, 2652, 3186, 3738, 4412, 5065, +5303, 4905, 3980, 2856, 1957, 1480, 1364, 1318, 1117, 640, 6, -585, -984, -1155, -1073, -640, +148, 1032, 1441, 945, -105, -1192, -1720, -1592, -987, -310, 110, 80, -87, -55, 468, 1260, +1828, 1755, 1097, 344, -206, -585, -988, -1390, -1697, -1823, -1827, -1827, -1857, -1919, -2051, -2343, +-2679, -3058, -3346, -3415, -3111, -2432, -1560, -822, -507, -558, -634, -276, 487, 1511, 2415, 3091, +3472, 3788, 4165, 4697, 5229, 5613, 5647, 5216, 4441, 3704, 3323, 3237, 3104, 2596, 1706, 607, +-615, -1832, -2865, -3621, -4197, -4726, -5288, -5818, -6146, -6142, -5620, -4630, -3463, -2510, -1936, -1660, +-1590, -1452, -1167, -774, -569, -516, -446, -170, 244, 625, 1080, 1738, 2671, 3661, 4470, 4889, +4771, 4142, 3238, 2495, 2048, 1762, 1339, 721, -3, -619, -960, -996, -844, -550, -236, -35, +-61, -331, -578, -573, -360, -249, -380, -636, -717, -464, -5, 398, 566, 480, 312, 295, +479, 947, 1388, 1262, 301, -1067, -2204, -2681, -2593, -2134, -1706, -1515, -1691, -2180, -2904, -3486, +-3592, -3225, -2661, -2111, -1651, -1197, -653, -139, 440, 1102, 1859, 2653, 3322, 3874, 4295, 4474, +4485, 4369, 4220, 4047, 3953, 3973, 4016, 3917, 3508, 2775, 1804, 859, 116, -360, -749, -1195, +-1883, -2663, -3479, -4212, -4829, -5203, -5294, -5153, -4853, -4607, -4360, -4172, -3928, -3369, -2334, -1015, +143, 807, 922, 771, 734, 924, 1203, 1287, 1253, 1295, 1609, 2041, 2492, 2982, 3517, 4009, +4277, 4296, 3973, 3295, 2345, 1201, 44, -939, -1608, -1910, -2003, -1898, -1663, -1276, -928, -740, +-739, -727, -460, -62, 317, 744, 1068, 1139, 851, 333, 86, 113, 253, 226, 31, -299, +-770, -1204, -1574, -1573, -1202, -738, -606, -955, -1739, -2726, -3507, -3693, -3193, -2350, -1552, -1129, +-1206, -1587, -1919, -1776, -1101, -130, 822, 1591, 2142, 2635, 3094, 3569, 3900, 4083, 4080, 4059, +4056, 4062, 3976, 3733, 3344, 2902, 2416, 1966, 1564, 1249, 926, 428, -279, -1284, -2399, -3475, +-4257, -4659, -4780, -4805, -4898, -5171, -5504, -5544, -5006, -4082, -3111, -2467, -2027, -1608, -946, -87, +1027, 2105, 2917, 3313, 3239, 2820, 2226, 1719, 1583, 1777, 2030, 2263, 2384, 2376, 2182, 1951, +1933, 2226, 2617, 2811, 2555, 1758, 583, -799, -2035, -2736, -2810, -2418, -1825, -1238, -859, -628, +-495, -310, 14, 493, 1075, 1492, 1577, 1279, 871, 405, -66, -648, -1172, -1452, -1493, -1405, +-1322, -1287, -1227, -1106, -933, -774, -657, -644, -800, -1240, -1871, -2618, -3269, -3572, -3375, -2681, +-1702, -625, 141, 636, 856, 1252, 1969, 2928, 3825, 4366, 4497, 4338, 4154, 4037, 3994, 3916, +3775, 3577, 3390, 3086, 2614, 1822, 959, 189, -382, -857, -1375, -1935, -2579, -3282, -3962, -4576, +-5127, -5447, -5373, -4916, -4294, -3825, -3652, -3670, -3702, -3399, -2558, -1122, 468, 1683, 2183, 2091, +1760, 1620, 1887, 2457, 3009, 3302, 3201, 2854, 2426, 1985, 1694, 1498, 1377, 1394, 1598, 1914, +2030, 1758, 1227, 765, 552, 491, 376, 40, -567, -1413, -2389, -3253, -3713, -3606, -2895, -1721, +-455, 648, 1464, 1848, 1775, 1419, 1112, 1003, 998, 871, 497, -23, -707, -1465, -2198, -2682, +-2724, -2315, -1711, -1171, -930, -1007, -1368, -1736, -1889, -1782, -1547, -1378, -1425, -1706, -2119, -2302, +-1873, -756, 794, 2372, 3592, 4318, 4532, 4452, 4366, 4357, 4332, 4142, 3793, 3392, 2946, 2492, +2104, 1816, 1682, 1546, 1272, 712, -20, -866, -1760, -2636, -3443, -4038, -4374, -4494, -4475, -4393, +-4273, -4246, -4342, -4484, -4428, -3975, -3174, -2193, -1227, -474, 87, 489, 801, 1291, 2003, 2790, +3433, 3795, 3915, 3769, 3465, 3002, 2574, 2318, 2248, 2271, 2278, 2077, 1646, 1060, 442, -84, +-486, -580, -416, -225, -222, -361, -538, -665, -904, -1345, -1811, -2104, -2095, -1825, -1345, -717, +-132, 390, 822, 1185, 1573, 1841, 1889, 1541, 853, 25, -690, -1186, -1500, -1791, -2162, -2405, +-2471, -2356, -2212, -2040, -1861, -1717, -1569, -1352, -1018, -698, -451, -349, -359, -390, -373, -231, +134, 692, 1473, 2349, 3243, 3971, 4532, 4875, 4926, 4700, 4300, 3952, 3549, 2998, 2354, 1802, +1323, 886, 431, -41, -662, -1344, -2088, -2808, -3507, -4085, -4422, -4580, -4635, -4774, -4909, -4988, +-4933, -4614, -3931, -2976, -2052, -1371, -960, -555, 2, 819, 1655, 2377, 2865, 3140, 3325, 3594, +3891, 4086, 3893, 3384, 2747, 2213, 1938, 1784, 1616, 1242, 637, -29, -584, -839, -775, -429, +52, 290, 160, -409, -1115, -1675, -1953, -1818, -1295, -544, -30, -7, -440, -1076, -1480, -1441, +-930, -185, 512, 1106, 1443, 1561, 1407, 1093, 717, 295, -115, -592, -1064, -1618, -2242, -2839, +-3248, -3436, -3340, -2986, -2371, -1614, -872, -398, -304, -440, -489, -240, 370, 1253, 2067, 2609, +2733, 2578, 2324, 2220, 2388, 2952, 3795, 4642, 5235, 5349, 4919, 4040, 3005, 2133, 1548, 986, +230, -844, -2085, -3287, -4219, -4744, -4807, -4498, -4085, -3782, -3792, -4059, -4395, -4536, -4348, -3715, +-2821, -1913, -1282, -972, -796, -519, -7, 709, 1528, 2391, 3128, 3636, 3815, 3770, 3619, 3423, +3238, 3170, 3268, 3404, 3304, 2756, 1749, 510, -463, -936, -853, -562, -350, -468, -799, -1263, +-1696, -1923, -1843, -1461, -924, -492, -325, -427, -700, -984, -1021, -640, 2, 637, 932, 790, +418, 19, -227, -347, -191, 125, 698, 1260, 1586, 1318, 436, -813, -2161, -3209, -3766, -3834, +-3636, -3371, -3029, -2726, -2448, -2070, -1463, -547, 612, 1827, 2732, 3174, 3201, 2976, 2715, 2568, +2665, 2949, 3311, 3532, 3459, 3128, 2747, 2580, 2769, 3195, 3594, 3606, 2990, 1795, 290, -1221, +-2521, -3461, -4114, -4641, -5054, -5346, -5484, -5412, -5122, -4607, -3898, -3158, -2540, -2111, -1931, -1852, +-1745, -1508, -1085, -444, 362, 1327, 2226, 2971, 3508, 3800, 3824, 3775, 3893, 4232, 4603, 4667, +4181, 3206, 1895, 588, -382, -825, -715, -404, -225, -434, -973, -1602, -2074, -2235, -2052, -1688, +-1252, -921, -774, -766, -747, -631, -343, -23, 232, 415, 479, 533, 529, 563, 618, 637, +454, 162, -144, -350, -371, -158, 31, 25, -286, -781, -1215, -1612, -1944, -2235, -2485, -2826, +-3220, -3522, -3447, -2998, -2074, -885, 413, 1650, 2590, 3227, 3581, 3819, 3979, 4021, 3887, 3537, +3051, 2672, 2553, 2724, 2971, 3135, 3117, 2881, 2407, 1870, 1375, 929, 354, -477, -1547, -2709, +-3876, -4898, -5639, -6027, -6107, -6045, -5851, -5421, -4781, -3956, -3095, -2191, -1203, -239, 529, 956, +1089, 1102, 1170, 1396, 1797, 2365, 2932, 3429, 3757, 4001, 4196, 4314, 4276, 3884, 3240, 2531, +1866, 1233, 515, -176, -899, -1483, -1949, -2265, -2334, -2167, -1811, -1468, -1268, -1240, -1265, -1214, +-1038, -857, -637, -334, 40, 409, 746, 968, 1119, 1078, 853, 413, 15, -226, -217, 70, +472, 777, 739, 312, -367, -1148, -1709, -1922, -1766, -1560, -1508, -1663, -1940, -2307, -2724, -3083, +-3201, -2888, -2137, -1064, 14, 952, 1710, 2388, 3049, 3744, 4369, 4863, 5152, 5208, 5028, 4598, +3928, 3135, 2361, 1789, 1490, 1375, 1303, 1139, 700, -110, -1204, -2338, -3156, -3586, -3827, -4035, +-4233, -4470, -4763, -5123, -5360, -5283, -4848, -4219, -3469, -2627, -1742, -873, -49, 807, 1710, 2608, +3307, 3590, 3515, 3350, 3283, 3374, 3478, 3524, 3421, 3265, 3086, 2889, 2549, 2069, 1541, 945, +324, -324, -921, -1425, -1867, -2225, -2472, -2542, -2499, -2377, -2216, -1956, -1592, -1193, -804, -477, +-178, 122, 524, 932, 1302, 1504, 1473, 1243, 932, 692, 648, 708, 835, 758, 337, -319, +-1055, -1478, -1508, -1210, -865, -832, -1213, -1936, -2712, -3266, -3402, -3123, -2600, -1976, -1431, -978, +-590, -167, 356, 1004, 1729, 2471, 3137, 3622, 3943, 4184, 4364, 4545, 4694, 4706, 4540, 4190, +3679, 2996, 2204, 1284, 351, -564, -1382, -2090, -2736, -3293, -3644, -3878, -4103, -4373, -4588, -4618, +-4470, -4264, -4095, -3902, -3658, -3372, -3117, -2755, -2031, -1060, -35, 871, 1633, 2389, 3155, 3943, +4678, 5273, 5553, 5346, 4655, 3738, 2854, 2234, 1940, 1747, 1422, 917, 321, -110, -489, -774, +-1088, -1357, -1618, -1827, -1997, -2186, -2450, -2739, -2881, -2681, -2134, -1371, -546, 105, 654, 1093, +1482, 1775, 1891, 1857, 1680, 1419, 1205, 1047, 938, 684, 245, -257, -740, -1018, -1176, -1279, +-1465, -1655, -1760, -1821, -1894, -1953, -2029, -2102, -2205, -2362, -2467, -2467, -2162, -1489, -567, 336, +1233, 1933, 2500, 2927, 3332, 3727, 4092, 4368, 4484, 4437, 4272, 4094, 3960, 3812, 3567, 3170, +2586, 1835, 830, -416, -1898, -3351, -4604, -5393, -5639, -5416, -5021, -4707, -4484, -4260, -4018, -3829, +-3613, -3205, -2581, -1885, -1325, -1027, -948, -923, -740, -152, 993, 2514, 3979, 4990, 5411, 5382, +5181, 4983, 4859, 4642, 4232, 3514, 2441, 1115, -269, -1465, -2179, -2345, -2158, -1789, -1416, -1074, +-969, -1156, -1538, -1912, -2174, -2200, -2019, -1651, -1313, -1101, -994, -770, -273, 422, 1177, 1792, +2255, 2583, 2756, 2678, 2281, 1641, 919, 222, -306, -750, -1024, -1258, -1487, -1772, -2019, -2171, +-2152, -2035, -2029, -2210, -2545, -2834, -2857, -2490, -1834, -1076, -373, 86, 376, 532, 748, 1297, +2251, 3395, 4420, 5011, 5083, 4749, 4283, 3891, 3672, 3609, 3599, 3545, 3240, 2656, 1806, 783, +-354, -1508, -2512, -3253, -3832, -4380, -4993, -5666, -6236, -6503, -6298, -5620, -4579, -3477, -2425, -1513, +-738, -319, -270, -416, -404, -19, 704, 1634, 2530, 3250, 3579, 3650, 3690, 3939, 4478, 5039, +5321, 5083, 4338, 3249, 1987, 740, -304, -1149, -1770, -2210, -2541, -2767, -2879, -2917, -2889, -2743, +-2403, -1873, -1249, -744, -486, -422, -464, -468, -371, -182, 89, 545, 1102, 1680, 2158, 2385, +2422, 2258, 2018, 1760, 1436, 1032, 456, -304, -1227, -2120, -2803, -3220, -3375, -3259, -2925, -2496, +-2127, -1965, -2010, -2153, -2195, -2013, -1606, -1021, -386, 221, 874, 1529, 2176, 2752, 3246, 3594, +3784, 3850, 3952, 4141, 4398, 4488, 4375, 4068, 3667, 3137, 2507, 1671, 645, -468, -1605, -2532, +-3236, -3764, -4297, -4856, -5369, -5702, -5870, -5742, -5358, -4752, -4061, -3372, -2726, -2096, -1417, -763, +-97, 607, 1443, 2280, 2856, 3080, 3066, 3110, 3307, 3697, 4111, 4517, 4649, 4547, 4092, 3496, +2762, 1973, 1082, 122, -766, -1435, -1807, -1995, -2113, -2326, -2644, -3040, -3415, -3646, -3546, -2938, +-1923, -795, 40, 503, 674, 713, 802, 1055, 1437, 1845, 2104, 2115, 1887, 1504, 1144, 943, +892, 894, 858, 716, 448, 40, -555, -1343, -2127, -2828, -3312, -3572, -3559, -3421, -3302, -3259, +-3093, -2668, -1916, -982, -80, 637, 1097, 1357, 1591, 1945, 2466, 3023, 3597, 4053, 4405, 4565, +4422, 4059, 3572, 3174, 3045, 3122, 3219, 3060, 2479, 1450, 144, -1253, -2432, -3205, -3659, -4085, +-4703, -5479, -6199, -6585, -6503, -5913, -4946, -3806, -2800, -2101, -1716, -1493, -1220, -713, 61, 1114, +2229, 3173, 3695, 3818, 3777, 3837, 4043, 4254, 4325, 4247, 4043, 3687, 3082, 2233, 1217, 287, +-441, -891, -1098, -1192, -1397, -1755, -2295, -2787, -3081, -3092, -2879, -2591, -2241, -1925, -1678, -1523, +-1395, -1074, -416, 553, 1710, 2729, 3377, 3525, 3271, 2743, 2153, 1590, 1134, 809, 480, 125, +-285, -778, -1229, -1725, -2066, -2240, -2211, -2096, -2136, -2379, -2891, -3469, -3876, -3905, -3497, -2846, +-2111, -1389, -685, 139, 1139, 2202, 3218, 3982, 4432, 4461, 4241, 3934, 3680, 3511, 3406, 3393, +3448, 3507, 3429, 3096, 2453, 1577, 668, -88, -684, -1179, -1765, -2530, -3484, -4455, -5256, -5680, +-5641, -5241, -4672, -4100, -3618, -3148, -2653, -2122, -1447, -615, 343, 1276, 1945, 2306, 2407, 2402, +2387, 2507, 2816, 3291, 3854, 4228, 4201, 3696, 2803, 1758, 792, 58, -420, -773, -1082, -1458, +-1877, -2324, -2666, -2858, -2848, -2617, -2234, -1776, -1405, -1176, -1057, -909, -651, -199, 419, 1087, +1742, 2285, 2697, 2994, 3229, 3422, 3537, 3531, 3297, 2824, 2124, 1261, 354, -503, -1277, -1927, +-2489, -2945, -3238, -3344, -3340, -3279, -3249, -3213, -3193, -3164, -3091, -2950, -2712, -2440, -2152, -1786, +-1176, -352, 665, 1675, 2576, 3369, 4080, 4698, 5174, 5425, 5340, 4891, 4119, 3270, 2488, 1953, +1616, 1383, 1101, 738, 291, -187, -757, -1392, -2082, -2700, -3177, -3498, -3706, -3903, -4110, -4264, +-4276, -3990, -3393, -2540, -1556, -657, 114, 752, 1302, 1744, 2075, 2322, 2492, 2596, 2648, 2625, +2562, 2406, 2165, 1857, 1469, 1076, 670, 266, -186, -601, -977, -1339, -1703, -2061, -2394, -2647, +-2808, -2876, -2791, -2541, -2069, -1418, -732, -196, 246, 575, 905, 1280, 1753, 2292, 2842, 3295, +3575, 3679, 3628, 3522, 3399, 3269, 3080, 2790, 2339, 1702, 792, -338, -1653, -2886, -3913, -4561, +-4797, -4669, -4402, -4190, -4039, -3885, -3663, -3387, -3030, -2554, -1975, -1386, -908, -567, -349, -129, +194, 762, 1683, 2862, 4020, 4880, 5271, 5282, 5077, 4846, 4633, 4369, 3937, 3234, 2200, 923, +-399, -1537, -2230, -2444, -2347, -2131, -1948, -1856, -1931, -2204, -2553, -2844, -2991, -2932, -2696, -2295, +-1881, -1536, -1271, -936, -376, 372, 1226, 1964, 2536, 2917, 3127, 3105, 2836, 2382, 1878, 1387, +985, 553, 144, -300, -744, -1183, -1531, -1767, -1848, -1867, -1967, -2212, -2558, -2843, -2903, -2641, +-2127, -1492, -864, -391, -56, 159, 400, 912, 1758, 2778, 3701, 4270, 4397, 4172, 3819, 3512, +3353, 3341, 3367, 3349, 3085, 2538, 1710, 702, -395, -1487, -2396, -3050, -3549, -4039, -4607, -5239, +-5775, -6029, -5849, -5229, -4285, -3275, -2325, -1499, -778, -313, -131, -89, 51, 471, 1140, 1965, +2755, 3403, 3717, 3784, 3793, 3944, 4322, 4737, 4933, 4707, 4043, 3071, 1913, 739, -279, -1146, +-1823, -2339, -2751, -3035, -3181, -3214, -3168, -3016, -2701, -2216, -1641, -1142, -844, -708, -654, -574, +-420, -204, 92, 557, 1126, 1711, 2206, 2479, 2591, 2538, 2393, 2188, 1876, 1452, 859, 93, +-805, -1676, -2371, -2840, -3084, -3087, -2882, -2558, -2250, -2100, -2119, -2221, -2226, -2023, -1620, -1068, +-482, 71, 670, 1282, 1901, 2478, 2990, 3379, 3613, 3717, 3835, 4022, 4263, 4349, 4241, 3948, +3559, 3040, 2417, 1598, 602, -470, -1568, -2466, -3156, -3679, -4203, -4747, -5239, -5551, -5702, -5577, +-5217, -4646, -3986, -3317, -2674, -2036, -1348, -684, -19, 677, 1489, 2308, 2889, 3139, 3160, 3216, +3399, 3742, 4103, 4457, 4565, 4452, 4008, 3422, 2700, 1918, 1042, 96, -783, -1453, -1835, -2036, +-2166, -2385, -2705, -3102, -3481, -3722, -3630, -3029, -2017, -882, -23, 459, 648, 700, 791, 1040, +1422, 1834, 2105, 2136, 1926, 1556, 1208, 1014, 967, 973, 939, 803, 539, 130, -474, -1273, +-2072, -2787, -3283, -3551, -3545, -3413, -3301, -3264, -3104, -2686, -1939, -1007, -110, 609, 1071, 1334, +1569, 1920, 2435, 2989, 3557, 4012, 4365, 4530, 4394, 4040, 3562, 3169, 3041, 3119, 3210, 3049, +2467, 1440, 139, -1253, -2428, -3201, -3655, -4081, -4694, -5465, -6180, -6565, -6485, -5899, -4937, -3800, +-2796, -2098, -1711, -1490, -1215, -710, 63, 1115, 2230, 3175, 3697, 3820, 3779, 3839, 4043, 4254, +4323, 4246, 4043, 3685, 3080, 2230, 1215, 286, -442, -892, -1098, -1193, -1398, -1755, -2296, -2787, +-3081, -3093, -2880, -2592, -2242, -1926, -1679, -1524, -1395, -1075, -416, 553, 1822, 1299, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, +1674, -3760, 7805, -27532, 28396, 3732, -18636, 29194, -29185, 29194, -29185, -6304, 6307, 7053, -7044, 18408, +29194, -17219, 5546, 3395, -29185, -22144, 13074, -13924, 19250, -6623, 29194, -4861, 20609, -29185, -3344, -7066, +-29185, -7425, 13906, 19535, 4557, 23208, 17072, -15626, -8534, -4696, -29185, -8246, -1919, 23595, 7487, 16703, +7208, 9437, -8413, -18586, -13675, -10400, -7940, 419, 21501, 14866, 8752, -5278, 10139, -18920, -14768, -369, +-15808, 5329, -520, 28426, -1371, 5718, -3975, -5594, -2012, -23265, 5106, -4341, 10565, 2348, 6413, 11029, +-8749, -1870, -5288, -7199, -5947, -1305, 12941, -3008, 5852, 6556, -1875, -4209, -11786, 3286, -4585, 679, +4530, 5736, 5157, -1155, -1669, -4542, -3841, -8073, -2636, 13665, -4957, 9858, 9824, -6828, -4321, -7048, +4538, -18789, 8010, 336, 8156, 10860, 3962, -395, -5006, -4175, -15505, -198, -3534, 5200, 6668, 12195, +6805, -1116, 618, -5351, -18205, -1691, -5433, 5248, 1884, 13498, 9537, -635, 6679, -14386, -268, -13308, +-4433, 2305, 597, 10519, 8555, 2846, 3810, -6283, -5155, -6053, -5356, -5413, 5795, 12616, -4955, 10645, +2797, -7715, 656, -8695, -2518, -6775, 9197, 401, 3625, 11267, -8315, 5904, -8480, -4, -7917, 3379, +-1421, -191, 8719, 2289, 2036, -3621, -257, -5431, -1069, -1239, 304, 2114, 3974, 1993, 917, 406, +-4458, -1469, -1569, -2421, 1520, 3525, 2363, 1052, 903, -745, -957, -4444, 251, -2771, 3316, 94, +4370, 267, -114, 1382, -4217, 1097, -5540, 2664, -443, 2561, 1749, 518, 3907, -6078, 1502, -2837, +-736, -198, -287, 4131, -1349, 6710, -4893, 2524, -5282, -74, -959, -1517, 4008, -2719, 7414, -3132, +3494, -3322, -291, -2365, -2810, 1165, 665, 2785, 63, 3944, -1785, -222, -1919, -1002, -3026, 1777, +-1187, 2743, 2540, -930, 3513, -3965, 1692, -5474, 2745, -2598, 826, 2387, -180, 4202, -4135, 4135, +-4973, 1211, -3234, 2184, -826, 885, 2360, -490, 3014, -4478, 2021, -3571, 328, -480, 1584, 610, +1441, 437, 1092, -1661, -1198, -890, -2091, 1893, -1858, 4984, -1469, 2257, -1244, 555, -1203, -3362, +2654, -3705, 3304, -407, 2784, -1068, 1617, -658, -2748, 1918, -3405, 950, 322, 937, 70, 1808, +243, -668, -567, -289, -1535, -79, 409, -228, 2105, -810, 1886, -541, -972, 386, -2183, 1317, +-2066, 1733, -392, 1763, 215, -644, 2155, -3583, 1733, -2194, 821, -1177, 2591, -1527, 1663, 215, +-920, 970, -1820, 1038, -2100, 2011, -1345, 1822, -875, 1225, -1086, 152, -304, -161, -32, 79, +397, -168, 831, -563, 177, -1041, 1179, -2224, 2251, -1180, 958, -465, 1140, -1048, 409, -565, +-268, 404, -1123, 1474, -1020, 1266, -793, 1671, -2046, 1780, -1556, -528, 1029, -738, 26, 422, +913, -1527, 2284, -1412, -23, -352, 263, -741, 528, 209, -395, 1293, -1401, 1061, -874, 631, +-765, 57, -93, 915, -547, -28, 1307, -2631, 2212, -1203, -218, 828, -1107, 1699, -1509, 1760, +-2203, 1784, -1021, -523, 1300, -695, 609, -419, 721, -715, 78, -663, 336, -808, 1092, -369, +1150, -887, 543, -610, 981, -2075, 588, 401, -1094, 2189, -1336, 1414, -1266, 1080, -1371, -104, +607, -1898, 2362, -1027, 710, 142, 367, -248, -1476, 1198, -1315, -80, 931, -558, 1234, 33, +-101, -95, -459, -150, -1248, 785, -175, -214, 1647, -413, 518, -519, 440, -1114, -938, 1059, +-1551, 1801, -389, 1006, -2, 188, -820, -553, 108, -996, 661, 342, 591, 216, 516, -677, +-20, -1009, 6, -11, -581, 1574, -749, 1892, -1263, 661, -857, -1007, 943, -2143, 2567, -1349, +1578, 270, -237, 385, -1445, 704, -1768, 185, 735, -132, 828, 406, 673, -1132, 470, -683, +-1000, 482, -371, 315, 473, 689, -13, -326, 738, -1581, 67, 616, -1082, 692, 88, 1002, +-1047, 997, -486, -863, 680, -780, 188, 377, 285, -434, 634, 319, -945, 218, -204, -268, +94, 603, -346, 104, 521, -438, 212, -520, 368, -840, 901, -373, -20, 910, -878, 172, +30, -129, -387, 674, -558, 591, -38, 195, -338, 12, -474, -79, 437, -756, 1441, -784, +1244, -1278, 961, -654, -823, 544, -1160, 1383, -771, 1560, -896, 1002, -373, -551, 142, -1038, +567, -960, 1444, -699, 1166, -295, 181, -395, -184, -107, -541, 252, -158, 704, 4, 473, +-628, 528, -993, 492, -914, 619, -59, 398, 363, -111, 480, -1205, 616, -1308, 473, -152, +518, 391, 276, 594, -613, 222, -1314, 234, -838, 527, 179, 573, 764, -171, 634, -1124, +243, -1299, 42, -261, 418, 473, 712, 194, 337, -127, -629, -287, -853, 99, -462, 1022, +-134, 1104, -205, 506, -477, -410, -371, -663, 13, -53, 807, 31, 783, -220, 491, -917, +5, -446, -535, 233, 234, 473, -118, 1216, -883, 300, -387, -507, -97, -261, 475, -589, +1378, -378, 462, -213, -28, -589, 55, -390, -15, 246, 243, 359, -313, 1144, -1358, 873, +-1011, 388, -471, 200, 242, -228, 734, -369, 616, -972, 901, -1175, 661, -487, 230, 215, +-120, 591, -533, 649, -581, -98, -76, 67, -301, 461, 99, -50, 90, 125, -223, -204, +213, -300, 108, 133, 33, 273, -286, 328, -565, 273, 63, -280, 65, 410, -97, -469, +1002, -945, 101, 197, -25, -204, 461, 5, -202, 318, -489, 267, -408, 113, 12, 289, +101, 156, -241, 350, -419, -248, 70, -101, 63, 42, 716, -529, 661, -377, -295, 165, +-693, 528, -474, 707, 15, 83, 605, -932, 553, -926, 345, -599, 424, 373, 85, 358, +145, -319, -132, -234, -447, 52, -20, 459, 110, 576, -486, 719, -969, 10, -116, -383, +254, 149, 361, 131, 322, -235, -186, -149, -295, -170, 65, 295, -68, 492, 318, -368, +83, -346, -50, -533, 495, -277, 443, 94, 259, -41, -191, 117, -629, 303, -307, 298, +-138, 491, -70, -131, 315, -389, -159, 124, 5, -20, 117, 212, -214, 67, 85, -571, +491, -353, 371, 69, 133, -135, 10, -32, -435, 106, -158, 264, 33, 594, -144, 143, +-177, -158, -502, -49, -32, -98, 649, 70, 558, -209, 209, -663, -184, -195, -455, 386, +48, 756, -7, 609, -465, -58, -373, -601, 26, -280, 583, 218, 583, 51, 249, -301, +-407, -486, -268, -68, 222, 404, 343, 680, -218, 67, -622, -107, -757, 125, 92, -10, +931, 122, 475, -335, 70, -857, -98, -282, -352, 673, 242, 437, 297, 294, -359, -551, +-234, -413, -232, 393, 382, 395, 425, 194, -268, -317, -546, -353, -147, 246, 231, 512, +500, 106, -79, -322, -404, -407, -352, 285, 145, 281, 730, 22, 81, -331, -127, -656, +-53, -106, 79, 537, 249, 345, -162, 242, -699, -131, -149, -246, 255, 133, 567, -159, +386, -205, -235, -350, 69, -292, 165, 316, -101, 489, -65, 10, -277, 85, -537, 158, +139, -43, 230, 151, 61, -50, 5, -389, 195, -275, 127, 90, 113, 156, -182, 273, +-310, 76, -195, 172, -71, -98, 359, -209, 140, -204, 234, -234, 140, -52, 13, 87, +-102, 97, -156, 94, -162, 179, -20, 49, 30, 124, -106, -53, -106, 52, -198, 52, +230, -61, 177, 99, -135, 26, -123, -264, 92, 6, -71, 385, 43, -28, 200, -200, +-122, -262, 8, -141, 249, 46, 234, 236, 4, -158, -92, -283, -186, 4, 2, 422, +-129, 550, -125, -15, -107, -413, -15, -179, 140, 60, 489, -89, 227, 21, -305, -173, +-271, 15, -29, 259, 165, 401, -116, 115, -223, -369, -38, -365, 225, 156, 325, 85, +377, -140, -268, -28, 152, -189, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -1005, -2300, -2929, 7553, -7480, -535, 5485, 394, +1252, -1787, 7575, -11217, 18010, -28015, 25068, -17321, -3890, 19862, -20204, 12023, 1186, 7912, -9221, 5920, +-17419, 16322, -3273, -17239, 26002, -26512, 10931, 9254, -10575, 22369, -13285, 7243, -6511, -10279, -1620, 5212, +-3724, -8995, 24621, -26657, 26144, -4858, -9638, 13831, -19808, 9773, -6052, -9143, 7341, 5000, -7449, 7972, +14123, -21259, 15845, -4548, -12567, 17207, -27349, 20498, -14253, -79, 17767, -5445, 3506, 3278, 1383, -18398, +10640, -8974, -2693, 10253, -13384, 22967, -13610, 4534, 15963, -22515, 9514, -883, -6163, -2207, -3261, 6121, +-7553, 15982, -10891, 19159, -17890, 5866, 7795, -24437, 16508, -8765, 472, 1960, 2372, 8675, -3665, 2745, +-1309, -2907, -7189, 1637, 7563, -19018, 21744, -8971, 2398, 9101, -10975, 16201, -20692, 11960, -5049, -5769, +-602, 1505, 5920, -9816, 22929, -14894, 8702, -3903, -8792, 10088, -20699, 14792, -83, -10157, 18220, -7029, +8076, -7044, 8014, -13006, 3680, -1379, -8150, 15809, -24531, 29334, -12056, -26, 17315, -18397, 11858, -12996, +5321, -9640, 2740, -35, 80, 11918, -13716, 25825, -18831, 1213, 10563, -24700, 19924, -17875, 12013, -3782, +2189, 8384, -4160, 9395, -15515, 20055, -27309, 12837, -325, -17236, 22581, -17304, 15982, -113, -1121, 7749, +-10165, 3360, -10776, 8398, -17487, 13474, 3036, -12405, 26421, -22332, 18530, -8372, -6273, 7082, -15621, 11198, +-9637, 10502, -11965, 19579, -7121, -563, 15045, -24555, 17606, -14339, -1309, 5760, -11703, 13730, -2349, 3491, +2812, 3746, -6012, -3569, 6040, -21203, 18236, -12381, 6358, 7049, -9923, 19150, -12744, 5238, -2488, -3353, +-4562, 1091, 1170, -7482, 11983, -4618, 7131, 3430, -6773, 10109, -15612, 2775, 16, -9330, 7603, -1217, +6220, -1734, 7684, -2162, -1014, -1602, -7875, 5916, -13798, 10335, 54, -5252, 13143, -4085, 5359, -1983, +-2716, 1170, -10893, 5011, -4422, 2701, -3850, 10191, 2843, -6237, 16622, -17817, 9317, -12775, 716, 2735, +-11608, 15470, -4407, 4513, 932, 6557, -5522, -4542, 6159, -15489, 8936, -7829, 3963, 6992, -13720, 24872, +-12608, 4679, 1089, -6992, -634, -8261, 10653, -15558, 16515, -9993, 14255, -297, -10144, 21709, -25961, 9652, +-4646, -4986, 3695, -2702, 9405, -7391, 12449, -7180, 9526, -8389, -8616, 16623, -27299, 18913, -6172, -2716, +9918, -4776, 12454, -9755, 7419, -10010, 4426, -10713, 1196, 10351, -19712, 23976, -8076, 1436, 9274, -11112, +8829, -14540, 4781, -2338, -1615, 352, 2177, 8852, -14560, 24764, -16270, 2916, 2028, -14512, 12895, -16416, +12534, -3035, 640, 3937, 6276, -1203, -8580, 13040, -19587, 6492, -884, -6773, 12576, -11244, 13791, -530, +-4209, 7946, -7060, -2289, -6147, 8588, -11906, 8096, 136, -1761, 11490, -10800, 14936, -10367, -4548, 5108, +-9545, 1758, 346, 2984, -1310, 5101, 3763, -1845, 2672, -9812, 7349, -10400, -1487, 9589, -11931, 11286, +-1898, 3891, 1578, -1904, 3110, -8813, 1041, -5398, 6733, -7975, 4414, 7729, -9138, 15113, -7544, 943, +-1175, -8169, 7679, -11679, 6688, -909, 3139, -507, 5142, 3707, -9994, 10816, -14248, 4775, -3056, -3952, +10694, -12218, 12361, -767, 272, 2178, -1712, -1699, -7220, 7272, -10684, 7934, -3142, 641, 11014, -11823, +14998, -8781, -3710, 4543, -9216, 5067, -6069, 7466, -6312, 9691, -3173, 3302, 4175, -13539, 14589, -16911, +4349, 3197, -8067, 8815, -3695, 6538, -1577, 4104, -3922, -772, -1242, -8096, 12122, -16079, 11048, 1869, +-6571, 14247, -8590, 5368, -5112, -633, -2047, -1378, -1207, -322, 7093, -9823, 14651, -3807, -4467, 11072, +-14554, 6401, -5944, -1038, 3899, -4956, 5217, 2180, 3095, -5081, 10292, -11317, -1707, 7213, -14015, 10452, +-7010, 4102, 5333, -5344, 8629, -2090, -3581, -549, 2052, -9562, 3569, 3030, -7032, 10268, -4424, 5561, +2716, -8897, 10044, -10980, -1382, 3726, -3637, -1310, 4228, 3142, -2541, 7277, -5347, 3018, -4024, -5801, +9169, -13337, 5664, 4553, -5086, 6256, 837, 2424, -4143, 1571, -3733, -650, -3671, -525, 7853, -10981, +11659, 1865, -5718, 7659, -6292, 2043, -7032, 1723, 330, -2744, 1281, 3098, 5119, -7781, 11620, -5473, +-5669, 5945, -9192, 5585, -7681, 5827, 2739, -4162, 7020, 335, 622, -7337, 8411, -10297, -539, 4131, +-5793, 8106, -7021, 10054, 21, -5600, 7347, -5943, -2376, -2924, 5328, -7364, 3433, 3610, -2051, 7577, +-7691, 10265, -7820, -4975, 7429, -9613, 2173, 553, 3520, -2429, 4601, 2058, -1069, 724, -7409, 7890, +-11812, 2324, 6411, -8820, 7681, 422, 2473, -16, -464, -103, -3404, -2896, -1131, 5174, -9383, 8522, +3149, -5621, 9639, -4177, 204, -2290, -4281, 2822, -4223, -648, 4514, 1372, -3401, 9648, -2116, -4729, +5543, -8799, 2363, -3362, -1266, 5774, -4932, 4164, 5828, -2951, 476, 2863, -6838, -1910, 2167, -5765, +4991, -3026, 3263, 6184, -5256, 6337, -525, -7364, 2866, -3108, -2812, 1046, 1141, -497, 5218, -1012, +3661, 1509, -7893, 5640, -6579, -3099, 4407, -4104, 2217, 2710, 1574, 2793, 1015, -2747, -117, -2565, +-5619, 6324, -7220, 2663, 5208, -3409, 7427, -1127, -438, -532, -3704, -1269, -768, -1809, -917, 6026, +-4829, 7970, 1460, -4068, 5430, -7728, 471, -1814, -3083, 2655, -1264, 2267, 2858, 3739, -3096, 5062, +-5911, -3375, 3865, -8680, 5556, -3206, 1680, 5248, -1629, 5086, -1401, -1703, -2694, 1287, -6581, 1676, +1947, -4822, 9089, -3293, 5646, 447, -4152, 3482, -6758, -1004, 354, -900, -1773, 4802, 2008, -560, +6725, -6178, 3486, -6079, -1824, 3506, -7936, 4442, 1621, 108, 2890, 4214, -1878, -1525, 296, -5246, +2253, -6344, 3294, 2752, -4959, 9866, -234, -1152, 2056, -2134, -3477, -1950, -448, -1160, 1731, -2586, +8457, -3, -2340, 7950, -7325, -2124, 795, -3704, -434, -783, 2062, 3479, 270, 1979, 5306, -6404, +-1830, 3648, -8931, 1427, 783, -1247, 3564, 665, 4529, 1925, -4824, 2887, -1930, -7236, 1811, 1743, +-5683, 5416, 2296, 1364, 3347, -2242, 2527, -3976, -5597, 4661, -4922, -2717, 6017, 640, 160, 4977, +792, -2028, -486, -4688, 2834, -6447, -647, 6724, -5382, 4572, 5658, -1770, 231, -303, -1969, -3336, +-1494, -1475, 3700, -4767, 5541, 6346, -6411, 7098, -2115, -3712, -977, -2860, 728, -2919, 1690, 2890, +3526, -2708, 6903, -1219, -7132, 5126, -6547, -623, -514, -568, 4793, -2243, 5250, 2419, -1388, -2565, +2236, -5006, -4443, 5107, -5829, 4810, 201, 3060, 4421, -4542, 4589, -3220, -4238, -1113, 602, -3392, +1088, 5022, -2177, 6521, -1892, 2207, -908, -6846, 4165, -5822, -1225, 2683, 490, 1339, 3386, 2629, +-1843, 2296, -5585, 1338, -4059, -3486, 5813, -4913, 4436, 3802, -439, 2654, -377, -1804, -2455, -1780, +-3254, 2548, -2614, 2362, 5396, -3020, 6090, -623, -3527, 1327, -4994, -772, -767, -1147, 2247, 2820, +69, 4228, 816, -3612, 2916, -5639, -2219, 1383, -4000, 3639, 1222, 636, 4902, -803, 641, -171, +-3770, -2531, 680, -3871, 2158, 2582, -1548, 6283, -122, -85, 1738, -5481, 595, -2987, -2403, 2044, +355, 507, 4499, 1452, -1262, 3609, -4329, -1746, -714, -4907, 4029, -2921, 2386, 4724, -1713, 3545, +923, -1821, -3444, 641, -4742, 850, 205, -588, 5992, -3353, 6065, 1086, -4664, 2538, -4131, -2008, +-1858, 1548, -748, 2463, 1790, 1911, 3260, -4898, 4815, -5022, -4605, 3391, -4606, 2495, 94, 3321, +1486, 797, 1598, -448, -2138, -5137, 3992, -5975, 619, 4807, -3234, 5602, -553, 3230, -1010, -3458, +938, -3399, -2046, -762, 4737, -4306, 4993, 3444, -2602, 4193, -4353, 1494, -4495, -2896, 3419, -2906, +874, 3565, 2519, -2024, 4365, -719, -4301, 766, -4772, 2818, -3728, 1033, 5712, -3657, 4176, 2832, +-1552, -2600, 573, -2890, -2662, 1077, -986, 4155, -2802, 4655, 3956, -5526, 3937, -2148, -3967, -1062, +117, -287, 34, 2003, 2396, 2225, -2256, 3719, -1514, -7003, 4135, -3719, -1077, 1942, 399, 2862, +-74, 2454, 1621, -2672, -2973, 1874, -3878, -2754, 5301, -2946, 2194, 3031, 68, 3089, -3808, 1052, +-1276, -4734, 883, 1465, -2325, 1710, 4582, -1843, 2847, 371, -2135, 340, -5849, 3139, -1722, -2523, +4943, -196, 762, 2679, 1418, -2807, -93, -2053, -1744, 422, -3337, 5645, -2303, 1136, 5712, -3083, +1436, -1109, -1519, -2400, -566, -177, 292, 1001, 79, 5423, -2886, 1853, 1765, -6189, 2134, -3297, +321, -219, 18, 2686, 652, 1727, 473, 1679, -4940, 1223, -1220, -4130, 4189, -3450, 3512, 724, +788, 3290, -2255, 435, -1889, -759, -3211, 2125, -1320, -288, 4788, -2813, 5212, -1508, -593, 769, +-4757, 1520, -2163, 21, 388, 2022, 30, 2221, 2461, -3678, 3244, -4737, -236, 181, -3484, 4102, +-2440, 2604, 2325, 127, 255, 372, -1388, -3326, 2202, -4171, 2126, 34, -233, 4945, -3037, 3935, +-399, -3096, 510, -1533, -1606, -530, 1876, -1213, 3020, 419, 1194, 2097, -4911, 3462, -3706, -2367, +2470, -2056, 732, 1491, 2003, 462, 976, -782, 3, -1693, -3438, 3629, -4259, 782, 3881, -1747, +2746, 669, 495, -1053, -1858, -521, -531, -2270, 598, 3288, -2817, 3220, 3171, -3030, 1989, -2023, +-719, -1470, -2095, 2397, -1111, -156, 3592, 1590, -2198, 2509, -62, -4320, 1489, -2696, 918, -1136, +234, 4603, -2185, 1634, 2790, -2226, -2193, 921, -1598, -2684, 2115, -669, 2255, -498, 1823, 3763, +-5153, 2270, -417, -3860, 31, 396, -25, -663, 2997, 952, 1267, -1373, 1254, 269, -6333, 3985, +-2415, -1547, 2444, 502, 2059, -908, 2851, -400, -1713, -1811, 733, -1494, -3469, 5750, -2794, 1446, +2763, -85, 1576, -3478, 2047, -2378, -2432, 593, 1053, -973, 176, 5479, -3016, 2114, 304, -1802, +7, -4490, 3648, -2912, -286, 3293, 462, 215, 1091, 2692, -4451, 1107, -1986, -883, -81, -2134, +5275, -3084, 2216, 3492, -1874, -50, -762, -306, -3502, 1149, -787, 919, 449, 486, 4943, -4167, +2769, 139, -4177, 682, -1694, 472, -1174, 1916, 1054, 1432, 229, 922, 1301, -5499, 2594, -2173, +-2414, 2594, -1276, 2221, 289, 1911, 1228, -1024, -1285, -217, -1379, -3148, 3332, -2018, 490, 3569, +-1057, 2921, -1162, -200, -355, -3269, 108, -83, -952, 386, 3294, -1125, 2288, 1673, -2652, 1330, +-3516, -167, -181, -2279, 2775, -90, 646, 2687, 830, -1244, 457, -1543, -2668, 1131, -2625, 1736, +400, -118, 4232, -1336, 1204, 563, -3006, -546, -1000, -1004, -570, 1722, -307, 2590, 908, 148, +2092, -4398, 1348, -2051, -2391, 1771, -1043, 1204, 1043, 2314, 371, 564, -850, -1430, -532, -3628, +2825, -2328, 172, 3753, -1045, 2974, -383, 603, -1853, -1787, -292, -1447, -132, -841, 4050, -1872, +2750, 2653, -2992, 1651, -3292, 322, -2407, -796, 1967, -1015, 1675, 1664, 2865, -2815, 1928, -1117, +-3908, 1538, -3108, 2260, -1906, 1742, 3743, -1656, 2328, 118, -1136, -3285, 1199, -1882, -1898, 2401, +-970, 3835, -1529, 3156, 1379, -4605, 2076, -2381, -1750, -1172, 1765, -447, 482, 3261, 217, 1995, +-3312, 2076, -2243, -4353, 3547, -2788, 304, 1390, 2454, 768, 263, 1288, -1460, -1363, -2924, 2206, +-3108, -1106, 5072, -2097, 2464, 1768, 240, -629, -2435, 414, -2149, -1611, 153, 2727, -1961, 2387, +4340, -3187, 1776, -1199, -1716, -1175, -2466, 2279, -1606, 241, 3564, 1533, -1302, 1991, 234, -4431, +968, -2042, -599, -177, -192, 4426, -1486, 1658, 2988, -2712, -1312, -173, -1441, -2837, 1675, -160, +1232, 1164, 1340, 3331, -3961, 1258, -287, -4342, 519, -458, -13, -75, 2769, 1558, 556, 160, +-192, -75, -4860, 1872, -1349, -2475, 3472, -18, 2159, 422, 1593, 64, -2416, -723, -1203, -928, +-2537, 3724, -821, 535, 4284, -1472, 1785, -2349, -160, -1341, -3103, 1291, -559, 512, 818, 3908, +-1151, 897, 1151, -3563, 740, -3680, 1002, -812, -963, 4060, -467, 1689, 1082, 572, -2424, -584, +-971, -2797, 1509, -1946, 3356, -79, 976, 3782, -2938, 1212, -1571, -1734, -1625, -316, 125, -186, +2673, -60, 3317, -1446, 452, 427, -4723, 1590, -2522, -350, 1059, 733, 1801, 866, 1571, -670, +253, -2953, -190, -1117, -2784, 3554, -1790, 2156, 2291, -209, 1574, -1412, -483, -1989, -1164, -1390, +1098, -434, 766, 3889, -1825, 2624, 39, -2574, 381, -3069, 157, -975, 21, 1847, 1227, 467, +1864, 961, -3162, 1214, -2372, -2280, 1160, -1736, 2561, -62, 1383, 2836, -1419, 322, -317, -2051, +-2575, 1316, -1515, 201, 2401, -137, 3125, -1193, 1159, 163, -4165, 844, -1383, -1394, 457, 1989, +229, 1243, 2066, -647, 579, -3060, 511, -1555, -3144, 3471, -1213, 847, 2203, 1214, 346, -650, +277, -2383, -1068, -1891, 1872, -1140, -219, 4849, -1916, 2005, 646, -1109, -1193, -2322, 703, -1858, +44, 985, 2470, -801, 1616, 2870, -3903, 1102, -1693, -1611, -593, -1128, 2929, -1218, 1494, 2469, +433, -1383, 482, -394, -4393, 1765, -1368, 419, 564, 566, 3831, -2261, 1805, 511, -2793, -1392, +123, -786, -1870, 2944, -183, 1729, 467, 874, 1508, -4484, 1574, -1365, -2824, 1204, 636, 386, +336, 2708, 142, 190, -1200, -282, -973, -3797, 3307, -1581, -624, 3249, 166, 1288, -226, 666, +-1356, -1926, -831, 322, -1127, -713, 4155, -1520, 1253, 2534, -1862, 257, -2197, -70, -1210, -1485, +1708, 758, -341, 1727, 2621, -2290, 621, -199, -2980, 435, -1809, 1453, -307, -181, 3646, -485, +98, 893, -704, -2825, 348, -704, -1436, 1579, -534, 2838, -322, 482, 2469, -3318, -40, -461, +-1765, -658, 876, 362, 326, 1959, 161, 1743, -1986, -331, 400, -4034, 1869, -760, -496, 1661, +772, 1448, -30, 599, -1106, -384, -2378, 424, -107, -2173, 3734, -1029, 1356, 1744, -852, 656, +-2024, -223, -1218, -572, -467, 1442, 115, 244, 3458, -2138, 1271, -566, -2219, 584, -2386, 1170, +-525, 355, 1699, 1007, 123, 335, 691, -3239, 1102, -1688, -1033, 1368, -1369, 2900, -451, 1147, +1417, -1482, -347, -670, -879, -1887, 1702, -1178, 970, 1731, -365, 2552, -2078, 742, -520, -2706, +825, -842, -341, 487, 1853, -108, 1280, 573, -1010, 419, -2905, 1165, -1345, -1482, 2702, -878, +1160, 1359, 580, -566, -355, -631, -1223, -482, -1377, 2112, -1190, 769, 3147, -1742, 1286, -103, +-1209, -852, -1155, 167, -505, 6, 1065, 1952, -1069, 1442, 1133, -3230, 1015, -1295, -1074, 99, +-595, 2029, -286, 796, 1794, -335, -1576, 793, -898, -2785, 1717, -1084, 539, 961, 317, 2504, +-1771, 724, 498, -2640, -613, 510, -968, -623, 2339, -158, 1157, 495, -30, 852, -3478, 1298, +-670, -2460, 1748, 371, 314, 641, 1886, -472, -195, -674, -554, -468, -2870, 2883, -1073, -481, +3133, -404, 718, -240, 393, -1451, -1327, -217, 30, -381, -550, 3621, -1432, 778, 2209, -2279, +253, -1577, 158, -1149, -797, 1642, 437, 188, 967, 2250, -2628, 690, 73, -2842, 745, -1403, +1579, -468, 404, 2730, -691, 78, 434, -377, -2876, 931, -549, -1193, 1631, -355, 2533, -777, +792, 1490, -2911, 117, -346, -1214, -898, 1466, 204, 351, 1727, -56, 1368, -2252, 433, -274, +-3172, 1704, -414, -109, 1035, 1388, 568, 64, 260, -900, -539, -2255, 1184, -648, -1305, 3094, +-476, 952, 1171, -330, -210, -1486, -395, -661, -795, -233, 1903, -287, 554, 2726, -1707, 603, +-570, -1651, -30, -1649, 980, 105, -3, 1723, 1237, -515, 480, 200, -2696, 519, -1165, -595, +933, -704, 2488, 109, 331, 1511, -1437, -908, -308, -985, -1327, 1178, -336, 913, 1530, -200, +2085, -1732, -194, -16, -2677, 584, -351, -137, 640, 1572, 428, 839, 388, -1281, 365, -2717, +632, -461, -1508, 2533, -287, 1165, 1174, 278, -491, -782, -708, -1314, 36, -1392, 1969, -195, +362, 3108, -1567, 971, -568, -1321, -700, -1138, 289, -361, 772, 619, 2236, -672, 660, 922, +-3265, 914, -1566, -623, 268, -238, 2009, 70, 1208, 813, -86, -1800, 171, -769, -2437, 1829, +-1036, 1098, 1115, 580, 1993, -1651, 462, -559, -1830, -869, 510, -543, -287, 2697, -258, 1521, +18, -238, 69, -2988, 973, -1029, -1194, 1254, 1069, 404, 933, 1655, -1131, -141, -1330, -442, +-724, -1873, 2459, -679, 476, 2599, 23, -44, -263, -327, -1626, -860, -497, 469, -209, 425, +3181, -1116, 774, 1184, -2203, -447, -1147, -243, -694, -76, 1553, 1068, 118, 1272, 1109, -2659, +273, -413, -2295, 527, -472, 1233, 452, 730, 2282, -826, -674, 312, -1149, -2334, 774, -254, +-646, 1961, 433, 1790, -396, -5, 839, -3041, -219, -39, -1209, -143, 1751, 667, 437, 1676, +-453, 260, -2100, -239, -52, -2827, 1810, 362, 44, 1676, 1178, 156, -709, 25, -1383, -696, +-1744, 1015, 278, -962, 3539, -306, 383, 811, -932, -733, -1756, 8, -708, -64, 299, 2160, +274, 44, 2464, -2427, -80, -724, -1446, -85, -1122, 1690, 322, 769, 1374, 902, -1072, -437, +273, -2992, 514, -603, 40, 1271, -16, 2570, -462, 161, 365, -1431, -1421, -399, -56, -1320, +1940, 226, 1259, 1063, -389, 1234, -2400, -264, -429, -1705, 257, 617, 735, 534, 1886, -163, +375, -661, -1219, -2, -2521, 1034, 50, -311, 2134, 530, 700, 297, -103, -1165, -845, -1084, +-388, 302, -675, 2463, 144, 492, 1814, -1421, -81, -1010, -1081, -594, -449, 452, 939, 745, +729, 1693, -1149, -7, -66, -2517, 308, -841, 55, 941, 317, 1722, 443, 69, 258, -694, +-1872, -45, -492, -1219, 1767, -13, 1183, 1184, -137, 1086, -1687, -568, -403, -1491, -283, 927, +243, 409, 2159, -311, 645, -370, -1174, -16, -2376, 737, 74, -543, 1770, 958, 377, 383, +632, -1538, -535, -1034, -617, 351, -1098, 2522, 56, 212, 2073, -835, -419, -845, -472, -1408, +-98, 205, 676, 787, 133, 2597, -1430, -25, 500, -2395, -163, -709, 380, -123, 759, 1402, +632, 133, -3, 623, -2832, 192, -80, -1681, 1384, 15, 1464, 228, 690, 1030, -1244, -815, +-410, -452, -1889, 1627, 177, -210, 2076, -8, 1154, -1145, -186, -110, -2247, 181, 302, -177, +60, 2207, 70, 148, 922, -1087, -144, -2004, 366, -80, -1358, 1984, 572, 156, 961, 912, +-946, -815, -288, -1081, -172, -874, 1670, 86, -163, 2619, -608, -322, 40, -792, -1113, -703, +317, 10, 297, 619, 1896, -544, -21, 1198, -2276, -414, -249, -675, 142, 31, 1393, 491, +204, 952, 162, -1705, -269, 133, -1991, 817, 236, 210, 1099, 196, 1520, -772, -680, 298, +-1316, -1108, 519, 142, -544, 1732, 418, 485, 467, -759, 516, -2056, -318, 520, -1292, 738, +980, 414, 365, 1117, -459, -480, -645, -970, 438, -1707, 1198, 704, -589, 2012, 105, 6, +-341, -306, -903, -662, -306, -5, 783, -585, 2180, 32, -408, 1315, -1625, -243, -791, -350, +-51, -127, 772, 695, 709, -91, 1269, -1447, -568, 388, -1923, 764, -525, 564, 791, 195, +1271, -168, -201, -517, -35, -1629, 254, 205, -851, 1809, -254, 1162, 318, -433, 507, -1480, +-291, -325, -275, -367, 1125, 325, 200, 1564, -855, 481, -878, -705, 172, -1491, 844, 122, +144, 971, 874, -138, -55, 241, -1440, 118, -996, 123, 370, -529, 1932, -94, 225, 829, +-603, -705, -381, -338, -753, 394, -47, 1006, 365, 144, 1506, -1373, -62, 98, -1441, -52, +-104, 181, 317, 634, 767, 521, -448, 6, 143, -1960, 446, -76, -918, 1159, 215, 840, +297, 113, 461, -944, -782, 113, -529, -990, 1373, 117, -22, 1494, -216, 418, -742, -424, +119, -1653, 333, 525, -330, 456, 1486, -122, -137, 647, -1082, -127, -1183, 178, 268, -1116, +1829, 396, -158, 803, 333, -879, -621, 35, -987, 100, -447, 1251, 301, -433, 2202, -898, +-430, 238, -818, -750, -401, 529, -172, 540, 434, 1344, -505, -400, 1252, -2241, -26, 5, +-647, 292, 128, 1307, -7, 357, 393, 118, -1452, -196, 418, -2003, 1198, 167, 200, 830, +152, 1161, -1038, -234, -50, -874, -957, 670, 291, -753, 1892, 61, 355, 139, -529, 316, +-1848, 190, 131, -734, 476, 1154, 263, -54, 1247, -797, -268, -738, -505, 162, -1322, 1397, +346, -210, 1330, 437, -381, -394, -55, -1052, -299, -374, 418, 380, -274, 1998, -229, -265, +753, -1063, -593, -505, -161, -161, 142, 611, 965, 153, 99, 1007, -1470, -403, 62, -1276, +336, -50, 549, 646, 269, 966, 69, -763, -194, -251, -1388, 313, 161, -393, 1261, 244, +836, 241, -582, 365, -1220, -667, 112, -419, -93, 1033, 469, 265, 1074, -568, 137, -831, +-910, 362, -1278, 626, 565, 16, 1034, 687, -54, -251, -137, -1174, -25, -787, -3, 759, +-529, 1780, 235, -76, 695, -886, -530, -603, -365, -483, 444, 103, 927, 766, -233, 1346, +-1326, -360, -54, -1422, 257, -249, 423, 448, 810, 573, 417, -341, -641, 192, -1853, 410, +-94, -612, 1373, 152, 1021, 173, 55, -113, -847, -733, -320, -61, -880, 1520, 171, 292, +1426, -549, 327, -1015, -428, -335, -1010, 272, 446, 298, 380, 1645, -471, -27, 154, -1327, +-51, -1155, 355, 85, -230, 1558, 522, 57, 354, 148, -1359, -327, -337, -782, 357, -200, +1446, 254, 166, 1384, -948, -607, -132, -769, -854, 158, 309, 327, 767, 548, 1107, -864, +-235, 287, -1867, -104, 66, -332, 415, 801, 947, 306, 0, 115, -379, -1530, 44, -52, +-1208, 1156, 619, 345, 878, 190, 341, -971, -665, -30, -995, -579, 985, 308, -18, 1681, +128, -136, -64, -811, -137, -1467, 98, 544, -560, 1002, 1288, 49, 15, 554, -987, -697, +-537, -509, 265, -728, 1520, 806, -360, 1374, -173, -762, -539, -314, -908, -288, 223, 578, +777, -71, 1747, -481, -810, 569, -1457, -550, -322, 158, 153, 462, 1026, 687, 56, -423, +573, -1708, -574, 342, -1181, 724, 348, 956, 546, 136, 577, -546, -874, -582, -12, -1363, +690, 739, -200, 1475, 54, 617, -464, -758, -25, -1249, -410, 241, 314, -84, 1499, 428, +-94, 595, -1043, -55, -1203, -473, 346, -706, 942, 874, 336, 375, 563, -657, -604, -396, +-1083, 214, -626, 779, 850, -149, 1423, -39, -379, -195, -733, -831, -348, -78, 74, 821, +177, 1230, 152, -428, 491, -1340, -522, -279, -624, 283, 414, 613, 745, 424, 34, 172, +-976, -636, -137, -1171, 530, 313, 153, 1144, 258, 443, -26, -656, -423, -700, -753, 196, +162, -30, 1354, 288, 204, 626, -868, -205, -836, -677, 100, -432, 564, 879, 260, 496, +719, -694, -394, -278, -1204, 99, -438, 428, 772, -78, 1320, 163, -389, 21, -554, -1075, +-221, -11, -308, 850, 165, 1084, 309, -399, 773, -1319, -631, -66, -657, -91, 514, 627, +346, 758, 17, 383, -944, -681, 272, -1596, 487, 417, -40, 821, 553, 564, -248, -200, +-525, -432, -1094, 212, 462, -801, 1587, 340, 152, 514, -394, -127, -1130, -312, -125, -269, +-84, 1166, 381, -182, 1398, -685, -360, -394, -763, -50, -864, 682, 501, -12, 749, 898, +-440, -417, 287, -1334, -264, -255, 31, 471, -235, 1455, 220, -318, 516, -414, -1073, -345, +51, -682, 435, 330, 749, 394, -122, 1006, -1024, -718, 188, -892, -379, 352, 404, 188, +629, 478, 348, -582, -451, 188, -1465, -6, 511, -503, 656, 631, 487, 162, -166, -21, +-589, -963, 66, 83, -750, 982, 623, -100, 844, -98, -102, -602, -682, 122, -735, -132, +844, 128, 123, 1078, -8, -418, 75, -821, -196, -642, -59, 704, -486, 883, 826, -254, +161, 27, -739, -559, -113, -433, 308, -158, 750, 800, -493, 971, -338, -781, -35, -558, +-338, -93, 298, 306, 588, 90, 711, -103, -883, 501, -1127, -312, 239, -321, 554, 233, +622, 361, -3, -283, -26, -772, -548, 481, -892, 687, 437, 103, 879, -269, 263, -384, +-578, -258, -239, -418, 299, 579, -230, 1142, -59, -46, 234, -977, 103, -680, -201, 280, +-46, 396, 680, 254, -103, 472, -895, -166, -192, -778, 510, -400, 607, 569, -6, 634, +-66, -411, -239, -195, -852, 268, -64, 23, 837, -119, 840, -109, -355, 243, -888, -341, +41, -231, -12, 680, 209, 391, 357, -325, 236, -883, -244, 117, -893, 498, 375, 51, +580, 365, -34, -108, -361, -350, -215, -742, 478, 212, -293, 1111, 139, -75, 278, -403, +-292, -544, -278, 144, -190, 105, 958, 47, -52, 776, -661, -369, -110, -588, 25, -394, +480, 554, -157, 634, 452, -599, -185, 112, -980, -99, 18, -31, 505, -120, 978, 103, +-521, 531, -554, -791, -8, -18, -417, 430, 377, 383, 335, -258, 676, -889, -599, 446, +-951, -30, 398, 254, 191, 452, 314, -3, -383, -430, 241, -1234, 173, 574, -602, 811, +381, 273, 0, -136, -54, -598, -572, 34, 197, -667, 1015, 471, -323, 851, -321, -93, +-572, -400, 75, -614, 113, 632, 216, -85, 1057, -267, -462, 226, -840, -45, -589, 188, +486, -316, 801, 561, -230, -60, 228, -888, -370, 7, -414, 408, -183, 840, 438, -355, +750, -381, -696, -117, -239, -511, 161, 263, 289, 537, -26, 721, -411, -627, 332, -947, +-272, 224, -49, 293, 438, 420, 306, -113, -302, 39, -938, -243, 323, -606, 564, 476, +196, 539, -74, 6, -320, -685, -132, -147, -478, 512, 435, -25, 847, 11, -115, -21, +-753, -54, -503, -297, 476, 2, 303, 758, 78, -40, 154, -710, -270, -287, -510, 437, +-215, 452, 740, -118, 482, -88, -537, -219, -364, -497, 133, 0, 181, 791, -78, 599, +-1, -590, 158, -816, -294, 23, -181, 263, 506, 269, 350, 270, -468, 70, -719, -414, +188, -661, 532, 321, 166, 623, 123, -88, -230, -366, -498, -64, -515, 312, 409, -152, +1044, -32, -54, 113, -580, -278, -457, -176, 31, 171, 142, 796, 134, -123, 540, -852, +-239, -224, -507, 132, -156, 490, 439, 166, 328, 240, -621, -264, 0, -897, 168, -26, +134, 561, 71, 704, -98, -340, 59, -472, -665, 57, 26, -225, 676, 246, 411, 165, +-236, 219, -827, -348, 110, -482, 31, 546, 264, 228, 472, -65, -84, -501, -313, -2, +-766, 307, 415, -109, 626, 423, -42, -89, -214, -311, -396, -433, 196, 152, -160, 879, +291, -171, 380, -316, -380, -375, -287, 30, -197, 210, 699, 100, 100, 541, -423, -428, +-11, -541, -124, -136, 240, 497, -34, 583, 304, -442, -71, -94, -656, -215, 94, -79, +367, 190, 549, 239, -372, 333, -452, -612, 20, -181, -146, 277, 410, 264, 306, -25, +176, -423, -548, 210, -616, -59, 404, 91, 365, 307, 231, -56, -244, -302, -103, -560, +-79, 443, -269, 573, 403, 16, 210, -254, -108, -401, -375, -21, 49, -100, 500, 452, +-138, 506, -212, -260, -168, -495, 50, -270, 94, 440, 177, 191, 404, -89, -314, 35, +-553, -132, -114, -89, 471, -21, 440, 331, -158, 34, -156, -428, -250, -35, -206, 307, +134, 287, 433, -180, 244, -245, -423, -64, -309, -107, 149, 172, 226, 390, 17, 132, +-88, -430, 1, -435, -120, 182, -49, 367, 278, 110, 170, -57, -280, -142, -327, -201, +131, -113, 355, 280, 39, 379, -133, -183, -103, -367, -156, -44, -27, 239, 236, 132, +362, -84, -141, 26, -474, -139, -42, -139, 244, 133, 249, 270, -35, 44, -70, -413, +-138, -39, -269, 239, 157, 132, 340, -5, 161, -160, -321, -20, -264, -190, 186, 107, +62, 384, 94, 46, -8, -274, -2, -389, -117, 199, -138, 229, 321, 81, 68, 93, +-175, -181, -223, -157, 108, -211, 299, 287, -79, 336, 26, -151, -152, -152, -154, -113, +-18, 173, 205, -39, 430, 2, -217, 123, -297, -162, -120, 2, 105, 36, 206, 268, +6, -81, 171, -347, -219, 69, -214, 99, 45, 219, 194, -21, 187, -22, -273, -115, +20, -298, 61, 171, 2, 246, 49, 200, -61, -216, 64, -230, -207, 98, 64, -44, +257, 153, 37, 62, -123, 18, -277, -146, 146, -170, 76, 250, 61, 73, 123, -37, +-112, -147, -110, 20, -190, 124, 217, -76, 233, 120, -85, -35, -107, -95, -118, -78, +98, 79, -17, 267, 90, -113, 110, -132, -152, -60, -86, 56, -20, 84, 216, 8, +22, 113, -146, -151, 11, -144, -11, 31, 45, 178, -6, 128, 75, -170, -16, -51, +-161, -17, 45, -3, 122, 73, 89, 80, -127, 41, -98, -178, 59, -60, 5, 105, +73, 80, 65, -22, -7, -73, -156, 55, -105, -10, 142, -16, 134, 61, 0, 6, +-81, -75, -30, -73, -25, 108, -28, 123, 99, -46, 89, -98, -55, -30, -102, 13, +12, 17, 85, 86, -7, 81, -54, -84, 21, -144, 22, 2, -13, 109, 27, 64, +40, -26, -40, -10, -108, -13, 21, -65, 122, 22, 41, 75, -40, 21, -60, -65, +-7, -30, -28, 78, 34, 8, 112, -27, 5, -20, -75, 10, -80, 7, 46, -7, +57, 79, -6, -1, 17, -73, -13, -45, -12, 31, -30, 88, 46, -17, 52, -1, +-55, -18, -21, -35, 6, 2, 54, 31, -2, 80, -25, -44, 21, -51, -31, 2, +2, 23, 20, 35, 46, -21, -11, 25, -69, -21, 20, -31, 22, 25, 31, 27, +-7, 25, -6, -51, 2, 2, -41, 26, 30, 2, 35, 10, 16, -11, -30, 16, +-32, -21, 28, 2, 2, 36, 16, -1, 6, -11, 1, -26, -10, 22, -20, 16, +31, 1, 8, 10, -2, -11, -7, -5, 2, -10, 15, 20, -7, 21, 6, -6, +2, -3, -1, -5, 2, 6, 5, 2, 13, 3, -3, 7, -2, -1, 2, 2, +2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, -507, -599, 341, -227, 2789, 499, -1401, 1481, +4238, 60, -452, -1279, -3279, 2644, -1727, -48, -1661, -715, 2964, -1552, 5003, 315, 2692, 3036, +-784, -153, -913, 1018, -2234, -249, -937, -1953, 3595, -2166, -917, 4355, -5955, 2526, -3995, 1078, +809, -4847, 4065, 224, -2599, -2532, 330, 53, 2150, -1861, -1129, -469, 501, 2054, -1189, 4918, +-1273, 1392, 2081, -2780, 21, -618, 5186, -235, 2735, -605, -3145, -478, -6395, 7053, -3901, 3827, +6656, 2003, 3717, -1404, -3092, -3333, -5780, -9502, -3477, -5764, 172, 2963, 2060, 8230, 6195, 4819, +7483, -1993, 908, -2481, 390, -6962, -1545, -4294, -6734, -4756, -6007, -1082, 1214, -62, 8108, 4392, +2551, 6417, 5433, 5886, 2535, 6710, 581, 3597, 4566, 4279, -3246, -1470, -508, -913, -9914, -12643, +-8132, -12582, -13738, -5794, -8443, -3948, -3445, 6824, 7063, 3139, 3722, 12020, 3636, 8501, 8589, 7730, +9271, 3708, 1103, 9278, -3276, -6803, -35, -7098, -4884, -7563, -5843, 104, -12451, -1467, 5165, -4331, +-5645, 3890, 649, -1491, 6818, 1899, 2164, -3103, 2316, 10299, 4550, 15485, 5453, 4827, 1969, 1186, +-4614, -2987, -9506, -16284, -2606, -10987, -4654, -9125, -4496, -2389, -7763, -529, 5885, -6558, 7468, 8532, +7432, 16989, 7015, 12162, 3788, 5642, 5267, -2851, -9732, 1066, -5511, -9489, -2656, -3101, -5082, -1535, +-8228, 4948, -226, -5027, 644, -866, 2168, 4983, 4543, -7226, 4906, -2908, 648, 4314, -1498, 72, +10786, -7645, 2435, -2421, -1781, -4137, -11523, 1399, 486, -1124, -3583, 5497, 2479, 7077, 11505, 9765, +5763, 4544, 2589, 1817, -7156, -2, 1210, -1731, -11268, -775, -4816, -10117, -3674, -13809, -2725, -11180, +-4870, 441, -3161, 8642, 2721, 8996, 4292, 4714, 12586, 1188, 12164, 4552, 7615, 1186, -7312, 4530, +-3751, 7394, -7253, -7425, -3112, -9204, -3682, -5902, -12684, -1578, -5194, -7932, 2513, 3571, -1068, 6433, +786, 8915, 15237, 9191, 14796, -1426, 8109, 4049, 1522, -306, -418, 7798, -10594, -8135, -9440, -6358, +-9128, -16274, -7753, -5438, -14412, -3647, -6634, 5031, 4070, -1991, 16817, -2918, 8984, 13912, 9739, 8666, +3689, 147, -2017, -2801, -1252, -1746, 8870, -4982, 5168, -4472, 12782, -4376, -9329, 7751, -5667, -3056, +-7045, -3017, -10435, -1856, 1093, 812, -5071, 1731, -4169, 1956, -12984, 16180, -5002, 4184, -3507, 2999, +7194, -5529, 6926, -3663, 6757, -8319, 1524, 3183, -5699, 4478, 3594, -3543, 9270, -7237, 14738, -3985, +1775, 10774, -10659, 6313, -1907, 1382, 3292, -8855, 6239, -8880, 75, -12664, -6668, -2446, -5547, 2949, +-4860, 3297, -2275, -1190, 14653, 2307, 8764, 1058, 4474, 2307, -7367, 5277, 963, -9204, 3453, -4640, +1773, -11655, 2921, -88, -5530, 8165, -1052, 9875, -6507, 7958, -8450, 7565, -1822, -13148, 17605, -13623, +8684, -2336, -6567, 6451, -9687, 3618, 7267, -7610, 4233, 364, 6274, -2577, 2651, 5500, -13348, 4144, +-2380, 5462, -13894, 4342, 6649, -15310, 8897, -1987, 9110, -7830, -3685, 11663, -6605, 7111, -5290, -2326, +5782, -8775, 10114, -12245, 6547, -3993, 3465, 930, -8183, 18273, -9299, 1339, 9095, -5823, 8766, -8704, +1685, 2004, -1856, -9988, 1862, -6237, 4879, 4461, 5053, -3312, -315, -13353, 19273, -19292, 1247, 6448, +-4786, 3535, -965, 5798, -1214, -5404, 4699, 473, 484, -4545, 4218, 10975, -11685, 15034, -9647, -121, +1224, -4400, 7737, -8184, 4979, -7849, 8824, -6758, 355, -437, 2302, -3185, -5762, 12210, -1575, 12597, +-22568, 22805, -12011, -5850, 10434, -7574, -5330, 2742, -1440, -3592, 948, -6909, 14729, -23723, 13562, -6971, +6041, -654, -2519, 10030, 8119, 5445, -6052, 11791, -2180, 4180, 5634, -6026, 4869, -5283, -10534, 22565, +-28411, 4438, -2001, -16973, -4383, -6026, 3018, -3936, 2090, -1196, 23871, -11633, 5605, 11198, -1664, -1280, +8131, -6172, 6954, -2130, 642, 4312, -6809, -1757, 13336, -18478, 3347, 2262, 10827, -6688, 216, 2003, +-9320, -5070, -2812, -4514, -537, 5260, -16026, 13680, -3700, 3853, 10169, -3491, 5504, -5727, 5052, -2040, +6363, -9022, 10518, 8724, -20406, 6254, 2880, -5047, 2959, -1148, 1031, 7753, -13682, 9861, -4594, -1768, +1142, 427, -3919, -7933, 884, 6373, 315, -5486, 8765, 2060, -6082, -6078, 8114, -399, -2670, -1997, +8627, -3808, -4371, 14422, -8832, 1231, 5193, 9720, -9084, 7710, 344, -3362, 7147, -13820, 9513, -6540, +-8780, 1518, -5778, 8360, -8434, -3013, -693, -4305, -2757, -2487, 4151, 6254, -17684, 17881, 2090, -3267, +19289, -6281, 21258, -11270, 3193, 10753, -3688, -5134, 4206, 2490, -16944, -249, -10082, 502, -6679, -12633, +20289, -8457, -5309, 1883, 8085, -10991, 2880, 1146, 10324, -1777, -4481, 12268, 1194, -6987, 10349, 3322, +3953, -3892, 343, 10191, -6064, -2029, 2421, -4377, -1082, -7567, -6319, -2634, -15598, 6805, 5264, 2558, +-12581, 13240, -6075, 4120, -2164, 2189, 15671, -11315, 5238, -53, -8759, 4919, -2711, -160, 1931, 1982, +5925, 514, -1655, 9697, 5084, -4517, 4667, 7389, -13880, 20018, -23207, 4508, 3195, -8635, -4990, -4909, +-6919, -3016, -3387, -3513, -2571, -6439, 4269, -4582, -811, 14465, 5229, 2138, 2005, 7785, 3660, 8771, +-404, 8729, -3720, 6800, -98, -1181, -12333, 3269, -1748, -21978, 20498, -21627, 6961, -7624, -6710, 11345, +-2589, -2729, -7666, 7707, -1107, -38, 9526, -8893, 12864, -5355, 374, 6697, 2738, -8715, 15499, -15352, +11377, -4091, 1438, 2403, -9501, 9568, 3985, -12919, 12441, -15337, 15338, -18915, 5258, -5764, 6109, -6002, +7306, -16821, 5777, 4740, -6142, 4387, 4091, 3286, 1378, -4142, -5469, 7860, 2141, -4168, 4681, 835, +-9033, 15554, -18640, 12113, 1811, -2813, 9586, -14109, 11902, -958, -7601, -8624, 15905, -6501, -1004, -9592, +1318, -2852, -1712, -1309, 13586, -13129, 12159, 2758, -3664, -1779, 12891, -12146, 1132, -5072, -1840, 7774, +-7499, -4700, 15034, -605, -6621, 426, 10885, -762, -7950, 2679, 6384, -13047, 43, -974, -4523, -1703, +13935, -3477, -1418, 6633, -5048, 8252, -12561, 2669, 2488, -8493, 4107, -2545, 12779, -9311, 3906, -11704, +17304, -7786, 8225, -16109, 16022, -7861, -3660, 7346, 501, -2160, -12392, 11697, -9479, -11930, 13503, -13854, +23166, -21313, 18711, -735, -9660, 3502, 12476, -2393, 2853, -8115, 12364, -6807, -2748, 7572, -12427, 13107, +-21397, 18825, -13617, 1798, -1975, 10267, -12359, 17310, -16619, 10277, -4805, -4480, 6540, 121, -5544, -2012, +-3893, 3911, -6464, 1436, 630, 3535, -3366, 8640, 8537, -4760, 3806, 3039, -7520, 5980, -4270, -1809, +1083, -7187, 4675, -2360, 2121, -3168, -4282, -2476, 14449, -22748, 22403, -13712, 277, 2726, -4905, 4745, +1323, 7660, -8422, 13820, -6256, 2185, 4410, -13770, 9837, -5312, -3384, 16806, -24130, 10361, -2105, -12528, +15964, -398, -8729, 3298, 1058, -2992, 1351, -4942, 10680, -2608, -8109, 2312, 9616, -13534, 7202, 290, +-2339, 2138, 2742, -855, -7778, 1087, 5537, 5982, -14063, 23031, -24498, 23208, -10765, 5181, 3581, 5677, +-16006, -1294, 11395, -14025, -1352, -4144, 5351, -7684, 2590, 911, -6137, 3642, 13657, -9479, 5049, -11171, +15972, -8012, 9975, -3136, 9645, -6492, -4385, -5849, 7532, -12444, 6891, -12376, 16387, -3343, -4006, 13825, +-16225, 7115, 4021, -4551, 4352, -2464, 211, -1229, -2757, -7015, 4988, 730, -3167, -1543, 9467, -18405, +22873, -7500, -719, 5230, -3206, -628, 662, -12862, 13704, -1344, -11470, 20153, -9508, 4012, -1409, -534, +7425, 1608, -5409, 5969, -5801, -13441, -919, 3736, 673, -9944, 8013, -5202, 14376, -19959, 12844, 7591, +-16868, 22152, -6894, -1942, 8113, -14075, 16355, -7593, -4562, 4013, 7463, -20070, -3410, 20362, -17467, 13782, +-15561, 7648, 6803, -11032, 13274, -3578, 4945, -1749, -7793, 12849, -15093, 7064, 9797, -12792, -469, 5363, +7876, -17473, 7372, -4585, 16246, -9937, -5943, 16161, -13494, -988, 7691, -19445, 21583, -24418, 15334, -7931, +1919, 4570, 9929, -14063, 5927, 6365, -7433, 732, 1597, 6292, -10373, 7410, 904, -9219, 18206, -15371, +8632, -18914, 8207, 89, 228, -1298, -2903, -2069, 12895, -7482, -2683, 12910, -6048, 3967, -3040, 11594, +-5680, 4689, -8197, 6772, -6365, 6320, -9123, -646, -13958, 13058, 2143, -12166, 9640, -17042, 6650, 3552, +-14567, 20200, -4059, 4408, -5375, 16998, -2928, 7576, -6968, 3203, 4493, -726, 2737, 3293, -11663, -4136, +13851, -24295, 4895, -6880, -5199, 7587, -5560, -8427, 14491, -6005, -1185, 6248, 11483, 2586, -2525, -4844, +16905, -15094, 14178, -567, -14854, 7713, -6278, -3619, -2791, -7576, 7169, 8654, -19981, 24660, -23907, 22582, +-11065, -6277, 14564, -1971, 3727, -4222, 1771, 272, -8897, 16450, -8770, 4239, 2461, -6914, 11683, -24796, +23738, -6795, -7120, 3817, -7728, 9127, -8210, -12705, 9353, 14798, -26749, 28808, -15080, 6577, 8791, -16675, +14202, -3111, 1195, -396, 6505, -12797, 11627, 1045, -12921, 14310, -15324, 15324, -4787, -11057, 19758, -5077, +-3655, -5761, -913, 3765, -5538, -8558, 8085, -8941, 5906, -4626, 10602, -10737, 4195, 21595, -17331, 8104, +1710, 11997, -12755, 8306, 2727, 4624, -9648, -2999, -4717, -11954, 21563, -17769, -14588, 12674, -10985, 744, +-4675, 747, 5067, 13056, -7970, 7141, 6470, 7591, -4961, 5110, 1263, 7188, 5109, -10960, -649, -1120, +3656, 5937, -9035, -4545, 4194, -5676, -4683, -4666, 996, 12531, -23691, 5812, -1314, 4607, -7471, -6236, +-5088, 22416, -3525, -3645, -162, 7820, 10022, -10756, 4960, 7174, -4104, 5163, -5495, -4345, 730, 11857, +-21749, 14020, -12446, 19971, -4428, -12995, 7792, 16124, -13634, 3768, -4893, 7295, 2725, -24219, 523, 9712, +1364, -8116, 7807, -17054, 13750, 10216, -7275, 3187, -436, -6126, 9448, -23445, 27223, -21004, 17146, -16864, +11451, -3476, 14295, -16423, -5314, 15878, 8682, 590, -6863, 564, -5356, 19537, -26477, 16944, -6064, -19618, +29191, -29190, 27010, -7393, -5088, 3949, 3375, 3701, 3837, -2311, -16399, 6366, 6670, 16537, -21951, 12889, +-9548, 13785, -17906, 7474, 2779, -5574, 4136, -1868, -10234, 15976, -4374, -8282, -2013, 4183, 6041, -1808, +-15439, 1094, 9687, -3007, 6054, -11305, 15524, -1151, -1885, -3221, 14867, -7380, 12540, -9866, 160, -537, +-804, -8430, 4240, -5019, 11419, -8960, 761, -10141, 9283, -6030, 7735, -10405, 4994, 5324, -579, -22793, +16698, 1486, 1307, 972, 2533, 7061, -6740, 5502, 3022, -6358, 7701, -8301, -5665, 6138, -4200, 8848, +-8272, -6514, 23024, -4250, -3357, -4320, -4920, 2223, 10547, -27588, 19503, -9829, -3375, 14651, -17676, 21831, +-13785, 11442, -16726, 7435, 4697, 2440, -3471, -4924, 6320, 6108, -14491, 5776, 13084, -25239, 27472, -19402, +13595, -20179, 23041, -19664, 12577, -14920, 15916, -6311, -20634, 20989, 390, 5178, -18392, 13460, -1691, 972, +2636, -2544, 5892, 8427, -12192, 9528, -17826, 19338, -6410, -13031, 4743, 2201, 8006, -17202, 1495, 4733, +-817, 9566, -9232, -1654, 6105, 6619, -13454, -9925, 22972, -12006, -2984, 4884, -15988, 19829, -7604, -13076, +24814, -7106, 6742, -4814, -9498, 13063, 2412, -1652, -1509, -7135, 11416, 1624, -14723, -2427, 10850, 4137, +-5319, -6981, 7143, 2129, -10397, 8458, -12388, 16184, -12213, 9376, -18927, 8962, 1949, -11306, 181, 3599, +15976, -2377, -14939, 13848, -3113, -2421, 11523, -6501, -4426, 12348, -19184, 16312, -17146, 7459, 6857, -6756, +-20309, 27107, -8293, -6853, 10958, -3060, 13611, -6032, 639, 1188, 7286, -13155, 7474, -16109, 9994, -3631, +2535, -14701, 10161, 2067, -2710, 448, 2412, -10370, 19418, -12966, 5546, -13800, 29191, -17349, -10780, 11447, +2060, 8196, -17365, 9246, -4031, 4695, 5799, -14641, 9956, -8320, 2012, -8641, -7027, 13499, 2764, -19312, +16938, -2700, 10256, 1160, -16287, 6934, 12828, 2562, -13578, 789, 2884, 7878, -12598, 5945, -9414, 15222, +-21401, 14356, -13514, 8036, 6332, -8448, -9156, 9984, 6409, -7501, -5219, -2586, 18422, -746, -11298, 7484, +1395, 13423, -18225, 407, 9307, 736, 2457, -9634, 420, 3793, -1516, -16743, 8251, -3811, -279, 7367, +-20768, 17229, 4457, -7458, 5977, -10875, 13516, -1117, -10755, -7017, 10555, 9620, -8931, 7857, -6648, 9301, +-4715, -7680, 16590, -8502, 1883, 4348, -13311, 4352, 9529, -5639, -4353, -14074, 8747, 10166, -17072, -3891, +5255, 11708, 4061, -14658, 19163, -5624, -291, -14442, 19719, -2260, 4663, 5268, -17698, 11318, -3432, 8700, +-3009, -16312, 4090, 17918, -15488, -7643, 5634, 553, -2097, -4230, 9810, -9576, 20906, -29190, 29191, -16506, +15429, -3267, -15121, 14702, 22, 2409, -3942, 3197, -10967, 12388, -4351, 1581, -11756, 4227, -453, -3305, +-15070, 27764, -5596, -12158, 4683, 1170, 9025, -8746, 17748, -12381, 11525, -22948, 29191, -29190, 15924, 8152, +-10847, -1920, 6527, 648, -6968, -1343, -3266, 214, 13498, -10344, -13578, 11652, -4582, 11570, -19543, 16822, +-681, -3221, 5999, -917, -6452, 16336, -9182, -326, -4930, 10052, 6287, -14597, -5479, 8033, 12717, -19246, +9876, -13375, -1944, 16729, -16235, 6160, -1570, 15808, -26586, 12553, -5864, 12699, -6009, 1524, -9510, 6313, +13412, -665, -8310, 4343, 12633, -12633, 8646, -13213, 17437, -1892, -20068, 11047, 2489, 3019, -17189, -5847, +5242, 8590, -257, -8009, 7740, -7904, 8067, -6423, -5569, 259, -4333, 13521, -7202, -1297, 25799, -15156, +5378, -6756, 16764, -12707, 8785, -10615, -5795, 19099, -16377, 518, 14016, -29190, 29191, -27897, 26841, -12015, +2842, -3644, -243, -5895, 7222, 11921, -24519, 14109, -10397, 19389, -23491, 17552, 4723, -15147, 18203, -19380, +20179, -16245, 129, -1795, 6401, -3504, -1760, 261, -611, 3596, 459, 4633, -5960, 6225, -10207, 12663, +-11086, 3549, 10796, -9299, 1988, -14347, 18108, -13643, 3234, -1941, 6821, 3521, -13918, 12846, 3440, -13495, +8123, 2362, -2706, -5946, 18501, -6421, -15350, 11542, 76, 14277, -29190, 26616, -16873, 9925, -7310, -2283, +5519, -5113, 4883, -5374, 3348, 8549, -13829, 10571, -12260, 8711, 10525, -21190, 21785, -29190, 24376, -5840, +-2446, -2567, 12675, -7979, -1305, -4580, 4515, 4237, -3206, -6956, 12788, -3223, 6157, -15345, 3542, 7586, +-6491, -433, 7086, -11752, 2892, 15037, -11103, -3150, 4214, 7511, -12899, -4062, 5079, 17857, -22982, 9919, +-4404, 10362, -8593, -1738, 3929, -3698, 14771, -14071, 371, 60, 1844, 11804, -22098, 3580, 17180, -20158, +11952, -12445, 1442, 18393, -12248, 3842, -4506, 1818, 7120, -17231, 6796, -4220, 12636, -19373, 12357, -1560, +9741, 697, -3935, 8023, -6300, 11887, -11350, -51, -2098, 7561, -1450, -4820, -13643, 17360, -6512, -9800, +-1051, 16201, -4355, -10245, 3732, 6230, 9232, -21945, 13308, -3013, -2974, 3442, 8531, -7877, -1587, 18613, +-1994, -23727, 16614, 3982, -4833, -11034, 3621, 6198, -2331, -11528, 11356, -17274, 29191, -28688, 20515, -19919, +29191, -21175, -1655, 9767, -5107, 3280, -3135, -4741, -6073, 18087, -8841, 3531, -10942, 7657, 13921, -21346, +2652, 16124, -4345, -1779, -8051, 12458, -4015, -6157, 745, -11029, 8263, 8119, -12399, -7289, 16841, -14339, +6404, 230, -7004, 16661, -5977, 2203, 682, -8364, 29191, -23712, 3539, 4920, 9942, -9335, -799, -1548, +-5247, 7389, -1776, -5652, -2623, -1225, 5822, -6486, -5516, 12362, 1079, -6788, -10214, 13113, 6368, -10720, +3825, -5331, 7854, 1119, 3233, -11277, 9241, 1056, 2052, -12477, 8925, -5184, 5883, -12468, -1362, 19941, +-14627, 6631, -1349, -5914, 3979, -4193, 6968, -12179, 2219, 8517, -7153, -8045, 24009, -12963, 12470, -21699, +21711, -5905, 5070, -12077, 9161, -7455, 9336, -3607, -3438, -11451, 9201, 4963, -12418, -1780, 8282, 6256, +-13099, 6110, 652, 10160, -17117, 4560, -2809, -1862, 8987, -1751, 4738, -16039, 29191, -26474, 16851, -6575, +1982, 2183, -7555, -6008, 15971, -6592, -11808, 6676, -5138, 7274, -6510, 5255, -11918, 17325, -18513, 26499, +-27886, 15515, 2211, -7185, -2013, 2889, 6921, -7563, 2137, -2585, 7922, -11614, 29191, -29190, 16759, -1029, +2711, -17460, 19254, -4649, -4176, -317, 113, 13009, -21782, 10307, 4909, -11530, -3819, 18913, -14364, -7051, +9359, -654, -2357, 2538, -2714, -1608, 3633, 946, -1409, 5030, 251, -2344, -587, 6805, -8553, 12268, +-9810, -415, -2977, 6173, 3814, -13411, -3014, 18823, -5018, -18389, 12644, 7533, -8473, 1005, 3929, -3486, +8532, -6012, -1487, -3099, 5680, -1446, 2054, -17475, 17738, -3520, -16184, 11112, 677, -5746, 7756, -3755, +1348, 5796, 3302, -9463, 3765, 7023, -4599, 8852, -18033, 14696, -5058, -4076, 2597, -3214, 3319, -1963, +-4622, 2872, -4565, 18671, -19204, 6513, -4474, 14639, -7394, -6466, 894, -3541, 10189, -7532, -1424, 9016, +-3394, -6531, 8153, -416, -2396, 2668, -5073, 3277, 2382, 1284, 6677, -12113, 977, 11979, -10306, -1592, +-8338, 16587, -16633, 5507, 3720, 190, -5543, 492, 5049, -13820, 16826, -3940, -6751, 287, -3961, 15884, +-2491, -8642, -1240, 11011, 787, -5528, 704, 8745, -572, -10563, 4448, -3368, 7456, -7170, 316, -3714, +5109, 4036, -9173, -56, 227, 6493, -5612, -3925, -3815, 14445, -14239, 3186, -1912, 3909, 15771, -22606, +13079, -4126, 11281, 2223, -15794, 16836, -8594, -2633, 9480, -15181, 8218, -9521, 8201, -4151, -11313, 21234, +-20016, 14635, -19361, 23577, -6164, -4530, 4400, -2989, 7108, -5783, 4486, -6725, 3494, -10258, 18089, -10400, +4517, -1473, 7362, -4497, -5033, 3705, 5642, -7576, -11691, 18751, -14682, 13805, -22477, 15177, -340, -3672, +4910, -2412, -1163, 2388, 8403, -5441, -7304, 12392, -3163, -2623, 1951, -13962, 21791, -9807, -12426, 17855, +-11728, 14731, -21597, 11762, 7276, -1229, -12183, 11753, -7088, 17467, -23010, 13494, 5722, -15029, 19345, -13143, +-5049, 1065, 2542, -7343, -63, -1966, 13825, -9680, -9075, 8593, 5125, 713, -15286, 6427, 13748, -13124, +10821, -7187, 10610, -11119, 8099, 7725, -8085, -718, 3007, -6356, 6002, -18111, 24352, -12196, -10546, 648, +4223, 1042, -8924, 3742, 14222, -5447, 414, -2507, 7618, -4411, -572, 1856, 8132, -12991, 17027, -13967, +1259, -2852, 8373, 4158, -16566, 2224, 11218, -5671, -6695, -3228, 14128, 2958, -21842, 15955, -5222, 5044, +-11464, 5640, 6089, -11373, 6283, 6486, -12377, 5576, 6788, -2585, 2690, -4108, 2955, 2255, -8659, 9517, +-5555, 4547, 3545, -21615, 18759, -4778, -4027, 3948, -529, 8063, -10704, 3517, 4939, -10150, 4327, 6788, +-16194, -1309, 6575, 9097, -15734, -3172, 15146, -4324, 1141, -4382, 3976, 9169, -12832, 10648, -2195, -1119, +7710, -8721, 4355, -1244, 2643, -2640, -5185, -1297, 9846, -4078, -5312, -4801, 2974, 17619, -29190, 21138, +-13283, 11370, -3636, -8810, 1648, 15713, -4407, -10315, 4595, 5998, 13177, -17283, -2471, 7985, 11396, -18436, +9131, -3709, -4006, 11546, -14141, -4383, 8912, 4012, -13785, 616, -2623, 19383, -10040, -8413, 8572, 14173, +-2703, -13271, 5648, 5282, -4303, -280, -628, -1336, 3362, -7535, 6730, -3975, -7205, 13131, -19310, 6727, +-4747, 17646, -10224, 31, -8339, 12593, 7346, -13241, 2351, 3363, 4823, -5862, 3386, -2351, 5965, 5055, +-20079, 16442, -4235, -582, 4668, -9575, -1300, 12701, 211, -8305, -10356, 17897, -10336, -4301, -4952, -1167, +21599, -23312, 7398, 6528, 5245, -9281, 14670, -9532, 5488, -8646, 20051, -26508, 7174, 3550, 10957, -19036, +-5245, 14406, -1509, -9686, -4248, 10648, 6659, -2260, -3652, -7001, 20281, -12313, 2107, -9741, 15235, -9988, +9894, -11653, 2589, 4231, -2545, 2954, -12826, 7875, 10150, -2707, -22991, 26103, 1405, -10860, -8326, 9914, +1119, -4212, 3157, -1602, 3343, -646, 1773, -6611, 101, 6479, -1713, 5814, -18624, 8109, 7666, -6527, +-4730, -1257, 11700, 1947, -15556, 3159, 14719, 4336, -15495, 4989, 5739, -8563, 6748, -5944, 1029, -4403, +-152, 14837, -26523, 11126, 9941, -8919, -7870, -4032, 18536, 498, -17071, 4703, 11317, -1786, -4938, -6919, +18052, -3651, -6293, 7725, 818, -5890, 12078, -2978, -6000, -7086, 18561, -1642, -21826, 741, 5152, 5748, +-20860, 8813, 4373, -1271, -4471, -7048, 17243, -7277, 3616, -6211, 11359, -4600, 23907, -19420, 9572, -10746, +10187, 5007, -12517, -4160, 4110, 838, -7594, -468, 3898, 5121, -13453, -7196, 17204, -1555, -2295, -14393, +14034, -1781, -495, 10725, -10974, -3659, 6058, 4792, 4659, -15787, 22076, -9121, -4597, 5644, -6331, 24042, +-27210, 263, 14475, -7843, 2772, -9834, 8083, -9641, 7537, -11874, 17980, -29190, 12660, 15019, -15798, 3249, +1308, 10445, -13606, -188, 11570, 250, 3251, -3751, 7980, -1179, -11441, 16729, -17580, 2699, 10070, -11821, +4028, -5012, 2112, -2561, 1016, -1212, -5922, 15249, 582, -25232, 26236, -5082, 3672, -7172, 6018, -4620, +6748, -11397, 4160, 3975, -9320, 8317, -1797, -3760, 539, -1184, 6469, -17869, 15856, -6323, 10904, -8395, +-1626, 18182, -7677, -6028, 6441, 4824, -10072, -2921, 6216, 2874, -2598, -9785, 9508, -544, -16659, 11542, +-5292, -1670, 2019, 4394, 8234, -11350, 13051, -9096, -933, 670, 4261, -1419, -4881, -3836, 5722, 3855, +-913, 2116, 3960, -4444, -7658, 8067, -4611, 11820, -20163, 12428, -984, 1248, -9641, 5809, -1712, -4733, +900, 8393, -1803, 1368, 2060, 7087, -5862, -1147, 5152, -3986, -6147, -5689, 15252, 906, -21501, 14867, +-10632, 6514, -6281, 1016, 9069, -9763, -457, 7178, 7083, -4087, -4089, 13105, -17863, 11866, -4765, 13129, +-15406, -2468, 10905, -3521, 5297, -12339, 9555, -7762, -784, 5274, -6949, 11379, -13551, 8092, -4138, 4901, +857, -8160, 7609, -10518, 7075, 10747, -10832, -995, -5017, 10347, 809, -23510, 27974, -12087, 6612, -12599, +7084, 9599, -10089, 6394, 8725, -8364, -1458, 9337, -11468, 6197, 964, -1325, 2193, -15681, 13437, -8284, +-3838, -105, 4989, 1731, -4855, 3237, 3283, -14103, 20126, -20126, 16633, -12919, 6799, 1885, -4370, 11886, +-3576, -2369, 7559, -6423, 1890, -1392, 6313, 2571, -17692, 12809, 3512, -5711, -8530, -61, -6824, 5999, +-10824, 6959, 5869, -14194, 14246, -3025, 292, 8426, 2159, 3310, -10576, 18986, -4827, -7982, 6568, -2857, +6998, -14221, 7229, -13946, 8847, -2258, -8392, 3185, 3541, -5686, 2799, -13607, 19945, -7662, 2573, -1306, +5237, -1859, 3204, -902, -3118, 7267, 2769, 4637, -11151, -1340, 21909, -24641, 11625, -12097, 10912, -5181, +-3636, -5136, 6555, -1582, -4731, 2063, 1834, -7684, 8042, 71, -8454, 15407, -14340, 24111, -28375, 14526, +8281, -6592, 1644, -1781, 7172, -991, -5458, 2596, -5247, 17220, -22693, 14245, -19754, 9488, 5535, -12360, +297, -871, 9653, 605, -5489, 6770, 3157, -6612, 523, 1140, -441, 8610, -7728, -3555, 812, 12945, +-14784, -1189, 1409, 1836, 1385, -5485, 3251, 427, 3768, 2491, -335, -12509, 19061, -4911, -15146, 14654, +314, 4795, -12810, 3667, 9919, -9144, 10679, -17446, 4424, 2975, -6365, 11645, -13210, 6639, -171, -12343, +3994, -914, 161, -3223, 2257, 1186, 6052, 10153, -11248, 13054, -11846, 17393, -1708, -17254, 23888, -27635, +28954, -23896, 12170, -10463, -29, -7551, 2932, 3597, -7270, 13999, -20591, 18619, -9143, 20960, -14781, -4028, +4727, 11205, -6639, -7639, 10063, -13394, 9579, -4054, -1290, -4633, 11585, -17346, 8517, -4272, 5479, 5631, +-15844, 15407, -2096, 7587, -5265, -1595, 5548, 1957, -5419, -5321, 637, -1758, 16586, -29190, 24885, -9874, +9704, -11977, 8490, -2019, 4950, -4118, -5217, 14158, -15524, 25156, -20814, -1588, 12990, -8390, 8144, -18164, +15804, -4412, 4357, -12575, 7464, 1988, -3224, -3088, 5937, -5706, -1174, 1367, -1910, -6244, 19035, -13239, +3847, -8556, 4101, 14867, -15770, 3821, 3372, 2881, 557, -4919, 14434, -13702, 9748, 1491, -8383, 5333, +-6953, 6991, -13757, 4644, 10294, -2580, -12337, 1410, -3777, 9033, -7280, 1229, -970, -5119, 18515, -14507, +2863, 8127, -3728, -2340, 1591, 2858, 895, -2615, -2389, 11433, -8748, 6674, 808, -14225, 9849, -3716, +9136, -15199, 7785, -235, -569, -4761, 2427, 6649, -14147, -558, 10265, -5525, 1416, 8685, -12109, 7284, +-6202, 14267, -4993, -6073, 569, 5865, -7471, 5357, -3346, 5678, -4282, -282, -3271, 7202, -16191, 14362, +-7226, 528, 7323, -4623, 1272, -3183, 2326, 5975, 5327, -10332, -1468, 4420, -8472, 9219, -4599, 179, +9867, -15832, 9926, -6033, -1832, 3520, -4151, 304, 12267, -6548, -565, -983, -2812, 4188, 2164, -12619, +13567, -4447, 808, 6831, -13192, 16750, -11282, 2849, -3276, 877, 1806, -1818, -4383, 2060, 8099, -16920, +12936, -8081, 821, -1834, 8465, -7641, 4007, -3023, 10500, -11857, -2, 18477, -20726, 15433, -13944, 9966, +-909, -10417, 6749, 3964, 1206, -2797, 13124, -23605, 19114, -11731, 5416, 4552, -19358, 10676, 3092, -18081, +14254, -3678, 4572, 2038, -11665, 11135, -5057, -4740, -1630, 9621, 1857, -1493, -2476, 1437, 2556, -8336, +9782, -4251, 4269, 3375, 1968, -7161, 8265, -8085, 5095, -3232, -17640, 23617, -18958, 600, 6922, -4288, +3435, -4086, -6977, 13242, -5420, 6817, -2816, -1496, 13697, -8888, 3414, 3269, -5227, -443, 786, 3333, +-7978, 2981, -2718, 315, -7162, 1499, 11472, -17520, 5666, 1320, 4420, -11849, 12786, -11144, 13439, -9751, +4848, 12390, -9928, -235, 2498, 3986, -11209, 14243, -12981, 13239, -17559, 6828, 10027, -13457, 5853, -8485, +6917, -7908, 1820, 3193, -3064, 5073, -1445, 1771, 31, -1635, -5421, 10061, -13853, 21350, -13084, 10255, +-7045, -3401, 10566, -13123, 7625, -8881, 2472, 1904, -1691, -3782, 1757, 10640, -13963, 7089, -271, 3440, +-4256, -427, 9694, -3018, 1056, 5656, -3401, -9464, 7612, 4443, -12854, 3012, 173, 4469, -19831, 5099, +6567, -6704, 2060, -2176, 6667, 502, -664, 2336, -3873, 5764, -28, 6265, 707, -12926, 12085, -2669, +-4916, 4393, -3247, 5752, -5670, -46, 3614, 3973, -8700, 1071, -118, -290, 2133, -22188, 18955, -9438, +12744, -9959, 5473, 2921, -4303, 7224, -4285, 2468, -680, 5125, -497, -8648, 2911, 14045, -12187, -13137, +23211, -16381, 8028, -16326, 15569, -860, -7306, 59, 1715, -5621, 14566, -15433, 7299, 5104, -11955, 21865, +-19307, 6192, 2084, 6525, -9895, -300, 4202, 4236, 207, -16385, 18520, -4168, 4796, -14943, 10569, -5928, +7073, -5847, 2341, -1727, -5594, 2851, -1197, -1617, 4882, -169, -2469, -5861, 6386, 7863, -6779, -11134, +12166, 69, 730, -4023, -167, 5302, -7035, 5789, -1720, 4877, -3879, 5572, -5968, 6365, 1042, -2350, +50, -6717, 14051, -5902, -2220, -2390, -3699, 5322, -1520, -6989, 4138, -10966, 10879, -5412, -12404, 24934, +-11704, 776, -3110, 18060, -13707, 17061, -10537, -187, 5233, -1516, -84, -4254, -4159, 15075, -9612, -2100, +-7347, 15602, -18669, 1106, -1651, 8374, 259, -5328, 3276, -1134, 6217, 1278, -11154, 19841, -17768, 13921, +-3227, -2074, 5306, 924, 2774, -6842, -2268, 6808, -10466, -3761, 3461, 1460, 354, -12488, 10043, -11154, +8144, 10603, -19090, 15675, -4699, 5714, -2164, -1020, 4290, -123, -3943, 6411, -7904, 8972, -4182, 3430, +-10366, 12421, -2865, -4911, -5982, 1066, 9897, -10143, -11838, 29191, -29190, 27972, -21560, 16586, -13877, 17539, +-8062, 6674, -11107, 10402, -1110, -9882, 4166, 2462, 4193, -14484, 6338, -239, 455, 4416, -17433, 28366, +-20808, 12879, -6482, -2533, 414, 6108, -4844, 1625, -7075, 12212, -9621, -13078, 28106, -18482, 17935, -13945, +-3737, 12516, -911, -591, -1278, 3722, 5869, 30, -15954, 7888, -1988, -4648, 4871, -4078, 12712, -17368, +3057, -503, 1415, -2152, 10087, -15796, 7302, -4242, 18832, -29190, 29191, -20301, 16445, -11290, 2650, 11443, +-20189, 27314, -18205, 12575, -3589, -285, -1047, -3253, 4951, -535, -3958, -6518, 20192, -29190, 29191, -29190, +25120, -13429, 5640, 2288, -4811, 4857, -2880, 6851, -15196, 26116, -24008, 20592, -9519, 4881, -596, 2246, +5367, -15540, 23499, -19818, 11013, -8721, 708, -3751, -3080, 6220, -3078, -7285, 8086, 273, -15483, 24191, +-17238, 19085, -15914, 15237, -7746, 2185, 1853, 3176, -7710, 4974, 404, -8124, 9681, -11849, 5541, -859, +-131, -726, -2591, 2793, -747, 2425, -3836, 4345, -5404, 1598, -6108, 9799, -3025, 505, 2325, -1492, +-1885, -236, 10126, -17671, 15126, -4492, -2981, 639, -3344, 12204, -19355, 15438, -6075, 1361, -1203, 6617, +-5947, 6479, -4160, 3386, 1506, -5981, 7155, -3287, -3284, 2645, 510, -1540, -7744, -95, 5019, -2067, +-8554, 10510, -8281, 7591, -3661, 7750, -2961, 1931, 1339, -93, 885, -1502, -3815, 10794, -20873, 20530, +-14713, 2238, 7911, -9930, 8978, -5849, -519, 3213, 2686, -7628, 10419, -6396, 5048, 482, -11166, 14928, +-13136, 6436, -527, 398, -2620, -6316, 6532, 561, 527, -3564, 2881, -4804, -1376, 8519, -2738, -2127, +6164, -4985, 3083, -4385, 2336, 148, -367, -2341, 1024, 3466, -6332, 259, 5112, -2092, 12715, -16353, +11871, -7316, 3857, 3275, -2420, -2203, 1831, -4654, -3146, -3298, 4560, 756, -5926, 6970, -4848, 7311, +-8889, 8049, -7110, 5928, 4266, -5956, 3239, -6551, 13442, -11911, -732, 6623, -704, -489, -1312, -2021, +2422, 3679, -3351, -2662, 1023, 3705, -9769, 2697, -5343, 13995, -14571, 13638, -10966, 8097, -1263, 2784, +-7816, 10621, -2562, 3001, -8617, 6787, -8259, 13822, -15996, 13629, -4428, 7922, -19461, 18104, -24477, 20553, +-6886, -4503, 1667, 286, 667, -2268, 693, -1648, 7172, -2442, -3686, 1437, 1121, 1515, -2973, 10419, +-2610, 1023, -8569, 4383, -3812, 7854, -5199, 1975, -3316, 4860, -5960, 1597, -2534, -2606, 18058, -21613, +14816, -4950, 3461, -840, -2283, 1097, 5702, -12623, 218, 10664, -24571, 25908, -24645, 18436, -5158, -2533, +4007, 1719, -15266, 22695, -9128, 2885, -4898, 9796, -4323, -1910, 882, 3630, -3344, -2472, 9537, -11007, +11657, -8956, 1386, -719, 4149, -214, -3898, -3193, -6561, 10190, -11119, 11583, -12502, 10520, -4504, 6184, +-5221, 10201, -6578, -516, -827, 5094, -7447, 10022, -14671, 4824, 5465, -5149, -3140, 12901, -23742, 24968, +-11825, 7069, 2112, -5821, 810, -6734, 11092, -11026, 13400, -21102, 16347, -11975, 16608, -11828, 13573, -10548, +8990, 2012, -10268, 10066, -5629, 701, 1225, 205, -11263, 9152, -17456, 17148, -22500, 24998, -17675, 1326, +3774, -1994, 5881, -5576, 12013, -8997, 8030, -5363, 5367, 667, 5539, -5283, 7240, -8266, 6459, -4092, +-4241, 5519, -4250, -2065, 415, -2901, 656, -4722, 3564, -9754, 11211, -4799, -2336, 4899, -4373, 9426, +-9458, 13437, -10185, 8030, -783, 5322, -2967, -2585, 14289, -28026, 18629, -4765, -1020, 2145, -8704, 7721, +-4323, 424, 1771, -6160, 4523, -910, -3469, 2944, -2913, 5815, -2079, 8500, -14394, 21358, -17182, 5629, +-6034, 5519, 5052, -6115, -664, -1357, 3316, -4337, 5221, -1244, -6742, 11397, -12811, 7120, -7377, 15294, +-11603, 7190, -14605, 19669, -18291, 9554, -2417, -1398, 10002, -6439, -1034, -995, 6396, 185, -12410, 12138, +-10673, 8924, -10116, 11149, -1772, -2130, 5977, -3331, -3472, 7093, -216, -6319, 5373, -9678, 10506, -5860, +-6786, -672, 10239, -17057, 6972, -3158, 4327, 3670, -263, -1181, 9556, -3026, -3898, 12999, -9461, 10480, +-1245, -1451, -8379, 5373, -6041, 8632, -22944, 16607, -7604, 5720, -15423, 14989, -12184, 11745, -10555, 7659, +-179, -878, 7959, -9713, 4090, 9772, -4687, 2838, -3192, 699, 7700, -7121, 1404, -4114, 965, 1053, +-4604, -380, 2019, -1380, -9039, 2918, 4462, -2105, 4571, -16126, 23424, -17234, 9680, 463, -2259, 150, +11767, -7725, -900, 2479, -1392, 4142, -4065, 880, -484, -1428, -10157, 5010, 8801, -12469, 15800, -18477, +13285, -3017, -4696, 6377, 6189, -8711, 4319, 3477, -6655, 3654, -6613, 7024, -3506, -9054, 7485, -2532, +-7053, 3386, 6052, -7563, 5503, 3765, 1277, -5341, 8321, -8418, 11611, -9098, 6523, 253, 6153, -14951, +8904, -2679, -5253, 5748, -7348, 10142, -7271, 4685, -3568, 1039, -11301, 18251, -19889, 10342, -7400, 8338, +-7152, 5942, 5005, -3891, 7009, -2624, -8776, 11603, -8344, 8539, -15258, 11836, -481, -8237, 6318, -3544, +2638, -2499, 13792, -14719, 7301, -2930, 2738, -6964, 8976, -4951, 5478, -11123, -175, 5803, -1616, -1012, +3805, 986, -4666, 6823, -7442, 1699, 1684, 4689, -3093, 4568, -12853, 9339, -986, -6875, 2289, 6021, +-6663, 1322, 1276, -309, 5138, -8540, 6417, -1587, -2741, 1120, 5036, -9951, -1694, 8947, -4009, 1446, +-3042, 7035, -5745, 1053, -1557, 6384, -1573, 790, -2271, 12000, -14597, 8800, -10728, 12733, -5933, 1138, +2744, -9062, 5274, 704, -3506, 1496, -3505, -153, -5181, 4896, -10391, 15226, -7686, 1111, 2377, -1749, +10636, -12511, 7499, 582, 9079, -7282, 3754, 4597, -12403, 8333, -6316, 7367, -12799, 14639, -22132, 17138, +-18921, 13977, -6304, 3036, -5338, 1624, 3610, -5094, 1652, 3371, 4470, -6725, 868, 9776, -6846, 1128, +4971, 5137, -8275, 5109, 1071, -590, -3799, 1946, -334, -5954, -4843, 2643, -114, -2000, -2000, 4689, +-3220, -5455, 13700, -11981, 13468, -13078, 6274, 1870, -6284, 9999, 2103, -3523, 2316, 1202, 4437, -8370, +8223, -8135, 4809, -8107, 268, -810, 2, 132, -1523, -5605, 11447, -7833, -1351, 290, 9154, -5381, +5225, 514, -7731, 10423, -8716, 10072, -11229, 8080, 2375, -7337, -151, 2637, 1052, -3988, -649, 525, +2771, -3911, -424, -3214, 7948, -5393, 2712, -2394, 1652, -153, 1974, -2753, -787, 14441, -12978, 8887, +-6548, 5201, 6157, -8828, 4224, -3980, -2321, -1295, -2260, -5365, 5925, -8750, 1533, -8470, 10320, -111, +4044, -1388, 5610, 363, 2746, -1195, 1606, 307, 5604, -12777, 9312, -6741, 9194, -13359, 5720, -2329, +-2325, 1451, -693, -1736, 5390, -3580, 988, -2005, -5245, 13895, -5457, -5841, 9324, -10137, 3002, -5099, +6250, -3922, 14141, -17827, 9417, -5011, 6855, -10603, 16716, -11427, 3135, 6843, -8968, 10368, -4635, -4371, +14073, -17105, 5145, 2915, -10132, 6587, -7604, 4704, -5273, 4760, -6795, 4382, -3311, 2535, 1316, 4732, +-5411, 11538, -8345, 7290, -2270, 4633, -4286, 5340, -9238, 6510, -7191, 8190, -14307, 6848, 786, -8857, +6647, -5870, 1511, -2384, 4642, 1721, -4844, 1992, 8418, -7370, 3453, -1004, 4296, -5324, 95, 6341, +-5483, 7651, -11211, 1705, 3594, -4452, 6070, -1419, -597, -2103, -116, 365, 8640, -20446, 25818, -17843, +2871, -1004, 349, -3829, 3530, -7144, 15569, -10689, -1574, 7814, -2090, -2611, 8917, -5759, 2471, -911, +239, 5402, -7684, -1230, 2764, -3013, -7492, 9424, -10721, 7284, -5453, 7057, -5093, 3489, 6538, -10058, +9755, 295, -1914, -1315, 1701, -1159, 1214, -2251, 1333, -2122, 1240, 3625, -1297, 1702, -7815, 4516, +-1829, -6388, 8382, -5495, -2283, 6928, -9079, 8731, -255, -8856, 14068, -12948, 17188, -9834, 551, -388, +599, 278, 392, -1428, -6275, 4873, -6362, 2304, 5009, -463, -1055, 1799, 648, -1004, -5601, 10536, +-10598, 4728, 6557, -5998, 2388, -2848, 4625, -4162, 501, 5838, -8764, 5575, -5575, 3063, 4296, -11229, +6706, -4434, 4331, -4438, 4621, -7835, 5225, -2487, 501, 7803, -10852, 6688, 3872, -6030, -947, 6112, +-4689, 5563, -3910, 4742, -3202, -41, -1050, 1403, 2595, -226, 613, -5542, -3685, 8440, -8475, 5329, +-4769, 190, -575, 433, -3488, 5666, 1597, 1003, -7632, 11651, -12385, 14889, -16648, 18235, -13195, 9495, +-854, -9701, 5153, -1134, 756, -814, -2229, 6317, -422, -7229, 5359, 2681, -4864, 7867, -9925, 4862, +-3013, -2782, 3777, -5877, 3784, -2038, -252, 1946, -1835, 7528, -6993, -1181, 5760, 1470, -404, -1406, +377, 2671, -1920, 4827, -12086, 8649, 1800, -6896, 1973, 855, 5769, -9034, -466, 3104, -3829, 3496, +-6634, 1971, -3737, 6253, 4431, -9677, 2017, -1231, 12746, -10231, 3756, 10201, -5731, -3313, -2897, 4756, +3680, -8647, 7634, -4726, 605, -38, -973, -5618, 4927, 480, -2853, 4221, -11108, 7786, 4062, -16026, +21361, -12995, 7658, -1190, -7348, 9852, -42, -3347, 4825, -6472, -360, 5713, -8287, 7368, -4246, -4809, +6835, -3711, -3616, 5150, -2967, 1976, 3524, -1645, 4864, -1656, -1296, 1748, 17, 5112, -10811, 2353, +-1743, -1513, -3240, 5449, -4008, -2098, 1244, 3580, -499, 1304, 3753, -3005, 2435, -66, 5136, 752, +-6203, 2842, -118, 1322, -1380, -6349, 7587, -6145, -2268, 246, 1324, -8944, 9541, -6220, 4514, -2313, +3817, -3276, -987, -26, 7843, -1643, -2139, -1034, 3276, 3160, -4053, 2475, 708, -1133, -4989, 1827, +2973, 661, -8746, 12808, -7831, 6914, -5001, 2573, -2738, -1518, 1023, 3981, -12261, 11284, -12029, 5168, +-1097, -331, -4525, 5690, -6125, 8464, -2403, 2301, 5532, -8510, 9360, -1121, -6142, 7435, -1902, -1587, +-3337, 9906, -5926, 1550, -1281, 2276, -1708, -5250, 4232, -6298, 3159, -4458, 1712, 3708, -8223, 2082, +3812, -4324, 3652, -2776, 9154, -4850, 74, 6869, -2903, 493, -3835, 10873, -12439, -638, 7179, -5385, +2307, -5956, 8729, -11844, 14100, -14131, 7485, 967, -8751, 5248, -3212, -3185, 13334, -16817, 19819, -18264, +12752, -4382, 1793, 1425, 1147, 6451, -3800, -77, 1348, -6671, 13238, -15820, 6503, -3106, 2714, -7481, +4127, -5218, 4086, -4462, -154, 2407, -5144, 4607, 1935, 2509, -7693, 11853, -2687, -3047, 885, 956, +4836, -7900, 6790, -5801, 4948, -1243, 849, -3880, 3296, -5201, 3454, -4731, -19, 5395, -3394, -857, +645, 4618, -33, -4668, 3720, 2936, -4639, 1867, -4960, 3561, 560, -5686, 12176, -10103, -1419, 5233, +-4132, 228, 2302, 267, -1779, 1067, -8300, 14306, -8657, 351, 5187, -3646, 5159, -3142, 823, 848, +3674, -4993, 5060, -7164, 1381, -1925, 3818, -3973, -1496, 2201, -2308, 63, -3517, 10549, -5818, 6721, +-10206, 7057, -736, 2058, -5237, 5792, -2363, 1452, 699, -8993, 12300, -6782, 4202, -4268, 2929, -5496, +7880, -5954, -1551, 3128, -757, -619, -4233, -1715, 10488, -4843, -5496, 7427, -4458, 1944, 4823, -4884, +8254, -5974, 5842, -3135, -3626, 1049, 4410, -2964, 737, -5429, 7923, -11292, -34, 5971, -4235, 3494, +-4938, 1875, 5652, -8984, 7410, 147, -4008, 6702, -3477, 2590, -2550, -1895, 6698, -6388, 2758, 3962, +-12051, 12262, 178, -5173, -611, 1991, -2801, 483, -3795, 4875, -4455, -721, -3591, 6840, 663, -648, +4011, -4761, 1074, 6118, -6769, 2725, 2183, 1408, 1410, -525, -6287, 6702, -7949, 1273, 304, 2765, +-9341, 1712, -4394, 6625, 2716, -5016, 2898, -4618, 5889, -1972, 1647, -1342, 10260, -8005, 7857, -5465, +3082, 3084, -13746, 14032, -8281, 822, -3083, -2690, 190, -378, 277, 2193, -3301, -591, 1322, 6464, +-8133, 9106, -1423, 2483, -1103, 4878, -1680, -2040, -5856, 7578, -6081, -4385, 3901, 3966, -10728, 8843, +-4206, 4049, -679, -6532, 7254, -5074, 5864, -5036, 5966, -8905, 9385, -4127, 2923, -4076, -5067, 7405, +-5286, 2617, 5237, 839, 118, -4878, 212, 8340, -5853, 1468, -2964, 5369, -5621, 1098, -1427, 16, +1999, -6576, 6418, -9599, 6215, -6501, 7380, -2536, 2921, 2171, -4946, -906, -99, -231, 7584, -5346, +1151, 4755, -8729, 6139, 3427, -3142, -2334, 1628, 2807, -4279, 5406, -7950, 10964, -9917, 4792, 2466, +-4192, 6717, -14353, 12000, -7978, 3251, -7173, 7805, -10123, 8633, -3375, 3762, -7542, 7227, -952, 1390, +-1687, 2125, 1066, -5154, 4772, -1424, 712, 1563, -1995, -786, 3249, -3798, 3178, -3375, -4641, 12641, +-11212, 1537, 1037, -1441, 1930, -115, -665, 3416, -2619, 2483, 1261, 1140, -4345, 15540, -26677, 25309, +-21523, 13965, -4013, -6314, 3163, 368, -1068, -5398, 1754, 610, 4341, -7612, 9364, -7548, 8379, -2498, +2399, 1317, -140, -4494, 7535, -5863, 1921, 2711, -4035, -1, -5383, 4480, 83, -5743, 4628, -6951, +5397, -3181, 149, 932, 2598, 2047, 79, -1911, 3761, -2061, 5936, -4112, 7173, -5919, 8, -1899, +-1287, -2597, 6429, -9864, 2576, -1249, 4286, -1247, -2463, 2703, -463, -1855, 1926, 3942, -3788, -1065, +4671, -1907, -1450, -2691, 1215, 2828, -5925, 5979, 3801, -9543, 8281, -4906, 5182, 565, -862, -838, +2348, -3261, -134, -89, 35, -1997, -1390, 3317, -2148, -3121, 670, 2403, -2318, 7646, -9662, 9210, +-7256, 268, 823, 3679, -7480, 3869, -4167, 3192, -2288, 5055, 3183, -6487, 10026, -8247, 10223, -6340, +691, 7478, -7830, -177, -179, -2143, 6125, -8681, 997, 6931, -11067, 7013, -5607, 863, 2547, 761, +-4055, 4340, -5294, 8489, -4558, -4877, 7880, -3638, 2475, -4859, 3577, 6241, -3197, -4383, 5502, -4214, +-3274, 3614, -582, -2956, 2741, 59, -2469, 1036, 3912, -541, 2478, -3949, 1580, 5339, -7185, 6364, +-3630, 2625, -821, -1500, -4567, 5094, -5533, 673, 1858, 2605, -5698, 6693, -10658, 9229, -7258, 5477, +30, -5902, 4081, -3130, 1155, -865, 3685, -2373, 6042, -8265, 11583, -2926, -2271, 4933, -2783, 1088, +-5267, 4960, -1281, -603, -2442, -681, 753, -3608, 1062, 4286, -12806, 16158, -7035, 2045, 1882, -3867, +3068, -71, -1527, -671, 2617, -8365, 4446, 3230, -3211, 4408, -8216, 3184, 961, -3814, 8661, -6871, +4892, -5581, 475, 8952, -3948, -2517, 4998, -2645, -4368, 7290, -2339, -2748, 6097, -3232, 4990, -84, +-12006, 15048, -18157, 10469, -2838, 3586, -8105, -1381, 5079, -9828, 9855, -8889, 4185, 2238, -2162, 1023, +11279, -9801, 10652, -1803, 473, 4307, -1253, -3261, 101, -3044, 3087, -2463, -3845, -3696, -1764, 4022, +-5320, -1872, 4557, -4320, 2708, -1496, 1498, 4822, -254, -2342, 7155, -4527, 7576, -5120, 130, 2579, +4142, -5753, 3297, -3491, 7566, -9840, -738, -1195, -903, 7198, -13405, 7991, 1053, -9292, 7301, -2280, +3265, 4256, -4878, 7445, -8481, 3943, -2947, 7180, -13123, 15338, -7930, 3687, -9087, 7233, -1253, -4064, +1663, 1990, -1518, -7028, 4090, 2984, -1563, -836, 1518, 2137, -2345, 5232, -2150, 1700, -3150, 4530, +-3867, 2633, -1994, 2898, -572, -1964, -1737, 6781, -6959, 1299, -37, 2385, -3983, 2538, -4478, 3108, +-859, -4256, 1615, -1198, 786, 1940, -2421, 2746, 1146, 1235, -677, 2654, -4274, 4296, -1406, -716, +151, -1642, 2959, -6035, 2344, 589, 2186, -3772, -3865, 6947, -2265, -2945, 6010, 2643, -5492, 6286, +-3909, -1238, 1067, -2110, 10492, -9592, 5900, -2898, 1705, -5098, 984, -4039, 3782, -8131, 4637, -7075, +7048, -58, -3891, 3102, -933, 1216, 4378, -2310, 1391, 10132, -5287, 1139, 932, 2212, -1391, -1768, +-432, -2688, -2754, -4421, 4260, -6299, 6055, -4083, -1731, -2210, 2068, 5330, -5758, 6731, -2574, 1735, +4417, -1119, 450, 2496, -3812, 5790, -6650, -80, 7521, -10813, 4224, 4400, -7483, 7539, -13500, 10054, +-3203, -949, 547, 708, -5575, 432, 4611, 1996, -4604, -1011, 4857, -601, -1462, -2353, 10517, -14317, +8170, 3606, -755, -1020, -2205, 4246, -1311, -3789, 8210, -4799, 562, -5237, 8113, 440, -7535, 4594, +-5450, 3504, -4734, 6089, -2765, -3050, 2665, -2517, -2427, 3096, 762, -2047, -170, -918, 1808, -1139, +-3210, 2977, 3307, 1012, 3541, -8746, 14710, -4558, 819, -649, 4414, -2118, -2310, 272, 1027, -7045, +5497, -5824, 820, -9502, 9957, -5531, -2014, 4215, -2689, 937, -4148, 10498, -9489, 18539, -18567, 11042, +31, -2550, 5097, -1434, -160, -44, -2151, 178, 4966, -10133, 6512, -3780, 3320, -8676, 10296, -7239, +-244, -2179, 3688, 2204, -6896, 5248, -919, 2247, -4205, 7172, 1161, -1611, -3222, 9295, -2707, -240, +-1935, 732, 2321, -7932, 876, 727, -3384, -5434, 8910, -12083, 4264, -575, 5896, -9264, 9594, 786, +4801, -5225, 2041, 5092, 1666, -5058, 6488, 419, -5072, 1974, -4637, 4677, -6657, 1745, -5428, 2247, +-3908, 7829, -6045, 1249, 1977, -3724, 1333, 2593, -795, 4503, -6120, 1297, -1855, 1680, 3667, -4942, +4307, -1465, 784, 2558, -2636, 2654, 3157, -313, -796, -227, -2974, 3817, -8293, 8415, -4502, -248, +-2197, -2070, -782, 2335, 415, -3882, -1117, 374, 656, 1969, -1345, 3762, 2379, -3567, 3746, 450, +-1199, 3901, -1730, 929, 1908, -710, -3426, 1339, -1776, 670, 1355, -2122, 2290, -2270, -3889, 3126, +3697, -12434, 13032, -4485, 1883, -5195, 1187, 2716, -5434, 4086, -516, -5231, 8967, -5103, 1980, -216, +-3112, 1214, -3319, 1328, 3342, 1643, -1861, 1746, 1678, 4039, 161, -2886, 6852, -4668, 2151, -2001, +-255, -2349, 224, -2781, 1042, -2922, -5006, -2230, 2238, -2842, 3925, 5125, -11371, 9974, -6078, 10705, +-4455, 2116, 198, 115, 1104, 3201, 4724, -5468, -2417, 3063, -9544, 13908, -15383, 8566, -5968, -3175, +5321, -610, -6475, 5989, 754, 130, 1551, -1653, 6061, -6285, 2270, 780, -885, 1465, -3607, 3480, +-6914, 12041, -12596, 3578, -1790, 1606, -4620, 6850, -3361, 1839, 1378, -8062, 9601, -2848, -2624, 6011, +-2177, 389, -866, 1288, 1641, -503, -489, 3066, -1332, -6303, 10624, -9748, 1397, 435, 389, -634, +-2343, -3287, 3599, -10158, 10302, -1612, 703, 1477, -4485, 6071, -1711, 341, 4058, -1401, -4589, 4209, +-364, 452, 1562, -5446, 7095, -6999, 3929, -3504, 5632, -5586, 6061, -5572, 1336, -814, -2278, 1232, +13, 2989, -3036, 4330, -10106, 6940, -2525, 1387, -618, -3416, 1745, 3179, -6669, 10744, -5068, 1060, +-1380, 1783, 3037, 2631, -6545, 8161, -3282, -5048, 7002, -7601, -523, 2830, -4312, 159, -2809, -3193, +8429, -8633, 7118, -4508, 6991, -2619, 2195, 552, 4556, -2894, 2555, -3237, 3504, 681, -5278, -3731, +2769, -2644, 2587, -8032, 1354, 4549, -1761, -1184, 991, 288, 5308, -2812, -1353, 5770, 5676, -2148, +-9692, 14882, -11475, 5758, -5598, -2944, 4615, -5551, -3534, -1720, -1596, 3073, 2096, -5084, -1172, 10849, +-5770, 7548, -3917, 7191, 1110, -902, -2824, 1300, 681, -516, -1380, -1412, -2844, 1913, -7541, 7925, +-7128, 8846, -11927, 3567, -2877, 2993, 5622, -5478, 3007, -1642, 2096, 7083, -10331, 11445, -3513, -295, +2004, -4595, 3096, -805, -6993, 2837, -1638, 1243, -6777, 3816, -1370, -2028, 5309, 4415, -10237, 12198, +-7135, 13599, -10125, 8768, -6972, 5165, -6397, 1386, 2478, -4130, -561, 465, -7831, 7715, -5378, 1421, +-2023, -3543, 7224, -902, -2627, -1281, 3062, 4302, -5522, 6044, -3828, 4507, 1334, -9472, 14339, -3440, +-2066, -395, -322, -28, 218, -1133, -1578, -1268, -1797, 5927, -6570, -833, 4380, -5184, 5596, -8125, +5451, 1830, -1134, -1103, 2102, -3481, 4551, -2714, 3289, 77, -3395, 1890, 377, -1, -1893, 8171, +-8345, 5144, -5855, 4119, -3498, -212, 2407, 3876, -3659, -1678, -2817, 4934, 85, 1603, 3467, 200, +-4609, -287, -790, 2266, -5772, 3616, -1820, -358, -8553, 5365, -1142, -5309, 7896, -1315, 1774, -3381, +4123, -1322, 4575, -2235, 4504, 2675, -6217, 624, 1716, -1733, -2295, 3084, -186, 2400, -4385, 2822, +2458, -1303, -4756, 4681, 2341, -7108, -1731, 6351, -8284, 2604, -2809, 795, 4065, -5378, 234, 6500, +-5055, 636, 6234, -4559, 3985, -3426, 6145, -4761, -7409, 8336, 3065, -5923, -31, 7190, -6357, 5269, +-4889, 7657, -2061, -4052, 3458, 3748, -7542, -1620, 548, -1760, 2958, -9073, 7163, -6842, 514, -282, +7015, 126, -5763, 4600, 1502, 3981, -4140, 4483, 5320, -7934, -58, 9025, -9416, 5147, -5443, 5507, +-74, -7618, 457, 4896, -10497, 2425, 627, 3083, -2870, -1371, 3080, 3004, -7192, 6209, 6841, -9152, +2561, 1793, 5113, -8023, 4602, -2271, -495, -2556, 4200, 4319, -7939, -896, 4275, -4041, 4477, -4873, +3329, -1556, -4242, -153, 5550, -3372, 579, 1517, 4709, -1734, 5445, -9156, 9664, -8398, 4470, 616, +-4007, -3715, 6008, -5645, 4100, -4039, 3609, 3812, -11590, 8742, 956, -521, -1029, -3165, 6925, -8376, +1038, 1813, 1360, -5223, 3271, 1681, -791, 593, 3752, -1818, 2215, 1822, -2728, 8245, -10539, -856, +6287, -4600, -1861, 1247, -4983, -649, 7103, -7127, 9996, -7858, 3374, 3158, -1103, 431, 2526, -1748, +823, -4855, 317, 5177, -9528, 4715, -802, -3262, 5414, -4746, 3223, 2787, 408, -1317, 1802, -5754, +5990, -3725, 423, -896, -585, 2440, -2114, -2139, 5373, 5959, -4844, 1829, 1566, -2934, 3109, -1612, +-2714, 3824, -2234, -6274, -204, -3491, 7977, -4275, 617, -3136, 10393, -10529, 6278, -3408, 7151, -909, +319, -2636, 1782, -2708, 2510, -1419, -1736, 4166, -737, -2757, -4805, 7943, 1939, -7247, 8041, 510, +1115, -4551, -1458, 503, 1609, -2024, 352, -3360, -1693, 3095, -1106, -429, -4387, 5504, -801, -2193, +5217, 877, -5961, 6075, -181, 3101, 169, -2834, 2708, -3445, 2317, 774, -2011, -2441, 6752, -6167, +1764, -443, -209, -622, 1445, -1196, 4035, -2049, -7698, 7008, -6098, 6115, -1782, -900, -4476, 758, +389, -924, 2635, 6200, -3049, -1302, 374, 4584, -5365, 5099, -2552, 1116, 1019, 564, -5754, 3605, +-1781, 59, 3834, -2505, 1387, -1171, 147, -516, 536, 202, -2721, -4370, 3104, 1137, -6255, 9546, +-7222, 5954, -2490, 4186, 231, 599, -3427, 3990, 868, -6110, 5173, -1858, 204, -4120, 1114, -4053, +6502, -7242, 2696, 4328, -6870, 5204, 492, -1790, 2776, 605, -2996, 5033, -702, -2210, 3514, -2571, +-2454, 10601, -6828, -1717, -1058, -1863, 6484, -3948, 2123, -4463, 848, -2354, -1181, 1755, -607, -520, +-1785, 4814, -2797, 3156, -762, 5139, -4395, 7812, -3141, 1010, -1320, -5948, 9030, -7174, -1462, 1747, +-1760, -1312, -2341, 1908, 4581, -1699, -5542, 11995, -6405, -2760, 15003, -13150, 2984, 584, 2696, -2015, +-1423, 3027, -6026, -1084, -2857, 10010, -11378, 6240, -2395, 2193, -4415, 4467, -1248, 4953, -7768, 2705, +8885, -9623, 3970, 323, 3010, 588, -1707, 1582, -2948, -1736, 2133, 2954, -6310, 1693, -1009, -7931, +6729, -5758, 3479, 3722, -5663, 4068, 2847, -2356, 32, 10922, -9651, 10934, -8189, 684, 1710, -4424, +-4989, 8091, -5760, 1865, -4646, 3297, -4334, 263, 4671, 2469, -4536, 233, 2122, -1562, 2470, -3050, +911, 1128, -2875, 1913, 576, 963, -2052, 4551, -3379, 5553, -5937, 5134, 1248, -4580, 2232, 242, +-1792, -6034, 7000, -3292, -1726, -960, -271, -2226, 3109, -2198, 6241, -2976, -2094, 7433, -4585, 3940, +-4027, 5989, -2915, -5861, 882, 4584, -4635, -1647, 8357, -7587, 4485, -9465, 8244, -1709, 3909, -3802, +5065, -5612, 4301, 118, 289, -4049, 5503, -698, -1233, -4541, 3040, -770, -1578, -3922, 8652, -10053, +2656, 1305, 552, -294, 3755, -3146, 6422, -3700, 796, 662, 2138, -6451, 8516, -9536, 4957, -1892, +1765, -4380, 4939, -4116, -2408, 3752, -533, 26, -2455, 6524, -2838, -2528, 3537, 2124, -4484, 1850, +1339, 534, -6485, 5053, -2843, 3791, -6898, 7292, -6621, -255, 1515, 2457, -5907, 7041, -6787, 9958, +-6896, 2662, 4184, -805, -397, 3403, -2586, 1002, 142, -6177, 9216, -4538, -6382, 35, 1257, -3953, +5007, -2153, -1129, 2956, -6174, 8450, -6119, 1795, 1041, -1062, 1477, 711, -634, 1876, 1815, 3688, +-4323, 5251, -1139, -1857, 2515, -2714, 1276, -3481, -4598, 5896, -8034, 655, 6201, -10205, 5168, -431, +-1453, 3600, 798, -487, 13167, -10826, 2907, 1728, -811, -193, -4009, 3977, -2176, -5271, 1779, 4067, +-8958, 875, 2288, -2821, -426, 1981, 2041, -4513, 3127, 177, 6551, -6944, 2638, 4854, -2604, 6571, +-5106, 218, 5152, -3105, 2628, 151, -343, -833, 139, -12965, 7414, -4933, 92, -1341, -3407, 207, +6447, -10075, 6244, 2046, -321, 6146, -5002, 5104, 3960, -4486, 3498, -2765, 6765, -5723, -1395, -892, +4886, -4765, 1470, 1673, -6038, -1481, 2805, -647, -2712, -1341, 1546, 2730, -6001, 842, 8159, -6634, +624, 1693, 5727, -2570, 1713, -932, 7288, -4921, 354, 4736, -9493, -2888, 8816, -8903, -1547, -2433, +3955, 1930, 1361, -3719, 6058, -3517, -1188, 2867, -480, 7679, -8380, 3197, 2382, -4722, -2627, 1390, +3485, -3146, -2830, 9764, -8861, 389, 3246, 1944, -2010, -353, -29, 4120, -7164, 6025, -6613, 7841, +-3865, -3646, 6100, -7101, 1581, 4137, -6596, 5220, -1951, -38, 1900, -1427, -3123, 10325, -4331, -2900, +1561, 2748, -3194, 1095, 1626, 2284, -3072, 804, 3627, -4852, 1421, -2098, 5842, -5593, -4404, 3913, +1059, -5736, -2075, 5094, 1794, -2911, 2329, 1898, 1534, -5296, 6924, -5963, 3445, -3239, 6789, -8829, +1256, 3128, -2707, -3770, 5274, 560, 4902, -7266, -1265, 8235, -1954, -2333, 6813, -1315, -1929, 2789, +-5507, 548, 1514, -4514, 5245, -9860, 335, 2945, -133, -2214, -3737, 6265, -1206, -1366, 1912, -4208, +13189, -9787, 8633, -3612, 5805, -6498, 4071, -2376, 5981, 735, -5283, -154, -5172, 4937, -2707, -1635, +-4351, 3856, -318, 711, -7308, 6512, 1501, -4172, 462, 4447, 1601, -5983, 2083, 2742, 597, -2031, +8263, -9481, 3303, -1662, 4835, -3099, -4328, 3517, 591, 431, -1882, -1161, 8047, -9234, 4929, -2978, +3472, -50, -282, -7216, 4446, -1506, -2342, -1113, -3314, 3507, -2717, 307, 2485, -2682, 7574, 1706, +-7392, 6896, 8117, -11850, 6221, -4800, 7869, -766, -4608, -3533, 9255, -5883, -1734, 8246, -7481, 165, +-3132, -872, 3179, -3253, 4593, -5745, 981, -822, -1450, 3718, -5873, 4292, -3802, 9114, -3642, 205, +2903, 618, 142, 1020, -646, 63, -986, -6880, 8751, -3247, 1149, 1103, -8420, 7146, -863, 1152, +-1615, -5786, 3108, 2167, -4121, 1119, 2323, -3258, -1327, 3251, 2255, 2015, -2619, -1825, 4614, 634, +-13, -1922, 1747, -4799, 3214, 761, 2504, -7848, 2041, -4062, 5030, -6305, 2798, -2442, -1470, -236, +5100, 1473, -2901, 2271, 2075, 2773, 825, 4375, -5429, 4380, -2686, -3972, 6693, -10535, 3644, 2178, +-5809, 2940, -4951, -24, 1052, -3539, 1442, 5271, -4871, -1633, 5213, -4195, 7099, -9347, 13718, -5173, +1141, -4547, 5952, 4352, -8535, 2663, 1597, -1488, -808, 684, -2965, 5044, -9589, 5052, -3652, 4302, +-7647, 5616, -2092, -1555, 1921, -1460, 4415, -4639, 5356, -3075, 2964, -1236, -1, 5717, -7092, 4853, +-208, -60, -6720, 10618, -8308, 5273, -5430, 4093, -3249, -5542, 5558, -2932, 1330, -2682, 1495, -212, +-2026, 1434, 1459, 2155, -1928, 1451, 244, 161, 1483, -5079, 7962, -3693, 8340, -10170, 5103, -5650, +4625, -3857, 2726, 1464, -3512, -602, -2026, -538, 1955, -4973, 3247, -3181, 5182, -341, -1235, -1755, +3746, 618, 490, -6091, 7733, -4035, 2385, 1928, -919, -1871, -491, -1739, 1385, -2405, 3668, -4793, +333, -37, -1207, 3030, -753, -4609, 4197, 1211, 1023, -1383, 2715, 1930, -1501, -69, 135, 1580, +-443, 786, -5226, 5605, -3717, -227, -968, 1407, 225, 2459, -7298, 1698, 841, -1980, -621, 4406, +-5258, 5434, -3893, -2336, -42, 1166, -408, -1665, 2857, 1120, -649, 1985, -1344, 3999, 893, 2211, +2174, -5111, 2094, -1110, -3439, 1720, -3990, 144, 4958, -5672, -1320, 3378, -399, 1198, -3482, 4468, +2389, 257, -6385, 3137, -133, -413, -6313, 2652, -3818, 6303, -2554, -2137, -5, 4859, -2688, 951, +984, -901, 2525, -3178, -5, 7533, -658, -3511, 3045, 1818, -4025, 4443, 794, -3307, 1308, 2547, +-4889, -3050, 1065, -1637, -171, -4572, 405, -97, -4242, 1504, 1094, 138, 4628, 624, -1395, -180, +2983, 5844, -5455, 5060, -785, 2764, -5816, 3140, -1084, 1367, -8910, 7182, -3093, 938, -3952, -67, +-1776, -450, 228, 1901, -1972, -151, 1717, 445, 1225, -2019, 10650, -8271, 3581, 2522, 2019, -4035, +3710, -8578, 3550, 2336, -6473, 215, 1779, -4043, 791, 1057, 1196, -3169, 716, 2314, 1234, -1571, +2579, 943, 1721, -4058, 3071, 2643, -4490, 1799, -1084, 283, 2077, -8106, 5507, -628, -3528, -3021, +8687, -5965, 1252, -4487, 3957, 153, 203, 5296, -3486, -233, 1027, 1603, -2351, 2142, 2283, -2541, +-6617, 7180, 198, -3768, 1304, 1786, -1339, 5164, -6392, 4556, -423, 910, -6238, 6283, -1780, -2861, +-2087, -136, 2027, -3815, 5235, -3262, -744, -2018, 9812, -6280, 1737, 1355, -56, -3784, 4650, -1311, +2726, -3019, 1609, 1205, 153, 253, 613, -5858, 7038, -2936, 145, 3683, -9502, 3714, -2753, -871, +1541, -345, -978, -1278, 2066, -1565, 6703, -3678, -827, 2086, 4685, 1232, -7239, 2524, 2077, -297, +-2556, -1061, 6356, -3237, -6472, 6548, -3047, 191, 1309, 1151, -2097, 1894, 1443, -4203, -218, -1009, +3590, -766, 123, -2567, 7848, -8349, 5925, -1216, -637, 4404, -3835, -8123, 11433, -6200, -391, 2871, +-4649, 2870, -827, 2324, -748, 92, 448, 3619, -4645, -1874, 5667, -706, -4863, -2385, 3800, 5018, +-8838, 2058, 2000, 3433, -3451, 3321, 1206, 593, -1626, 1904, -2279, 1279, -1922, 2773, -3411, -154, +910, 868, -4926, -1564, 1386, 4480, -3953, -3641, 8626, -1128, -4309, 3921, -2950, 4181, -5328, 7751, +-5204, 3243, -4232, 9118, -4946, -5559, 9754, -1398, -347, -7655, 7271, 2195, -5913, -3618, 7256, -5528, +1974, -6419, 3045, 3333, -805, -2577, 1053, 3494, -3690, 4358, 539, -6014, 7055, -648, -2459, -1337, +2853, 5581, -6666, -3322, 7162, -2406, -2848, 2971, -4076, 5144, -631, -2543, 3875, -2550, 3181, -1984, +-2342, 600, 2400, -6366, 7185, -6786, 43, 2244, -1587, -4860, 4137, 4102, -2580, -2082, 2229, 4575, +-3094, 3442, -555, 4944, -4881, 4764, -3114, 2192, -3094, 1037, -1574, -2522, 221, -2478, 1324, -7061, +8243, -1776, 1215, -1980, -1000, 4277, -1103, -2143, 3638, 61, -4209, 1472, -701, 2261, -3673, 5428, +-2023, 1110, 1806, -2242, 1041, 5434, -7272, 445, 6790, -4128, -7554, 6553, 2570, -5391, -3, 2799, +787, -7077, 6054, -1398, 4310, -6624, 3239, -2335, 1268, -1069, 4076, -3462, 838, -2894, 5287, -2716, +677, -1905, 6430, -4951, 2024, 1797, -1927, 739, -5094, 3168, 452, -5937, 4841, -6272, 4604, -2653, +3869, 1680, -5391, 2559, 5157, -1953, 988, 629, -544, 454, -2345, 4121, -1427, 2020, -5860, 3293, +-268, -1158, -2699, 2592, -6723, 4714, -404, -4209, 2457, -4438, 3305, -1233, 2370, -1949, 6438, -4142, +996, 2445, 5034, -3106, 1330, 521, 2880, -1616, -784, 6659, -7931, -1360, 2695, -662, -6207, 1938, +-4303, 3048, -6506, 3436, 579, -4263, 321, 1743, -97, -1257, 4921, -2549, 1455, 7367, -4681, 2634, +1626, -1437, 1271, 4349, -1273, -3624, 4527, -3745, -52, -1978, 3688, -4156, -424, -3967, 4040, -4682, +2863, -1844, 1982, -2295, -2338, 3577, -3512, -1220, 4799, -3167, 2003, -1033, 4545, -636, 523, -2066, +6643, -2708, 2035, -1903, 708, -515, 1451, -774, -1735, 1607, -1756, -418, -2697, 831, 3948, -10822, +5013, 215, -1535, -441, 97, -1474, 2159, -960, 7633, -5458, 5154, 2689, -2666, -1795, 5172, -381, +-8397, 10350, -8021, 1105, -2238, -425, -1646, -2482, -1239, 4804, -1261, -3301, 4369, -3566, 2068, 1887, +-1337, 2858, 2678, -6435, 5863, 2338, -986, 240, -1312, 419, 1617, -1176, 2835, -6327, 3896, -895, +-196, -9096, 6713, -4985, -2164, -2626, -970, 6411, -6773, 2068, -923, 8095, 156, 644, 609, -224, +9562, -10218, 9039, -4817, 3718, -3939, -2563, 4494, -3784, 782, -3017, -1492, -4911, 9674, -3572, -4245, +-602, 1939, 1669, -930, -3664, 7673, -3081, -5183, 5421, -1144, 1590, -1463, 1421, -431, 3159, 619, +1006, -9242, 3230, 11319, -8982, -2475, 4054, -1491, -871, -2098, -1453, 4292, -792, -6519, 8716, -300, +-661, -736, 410, 90, 919, 1273, -3288, 790, -2653, 4274, -3038, -4035, 2094, 1692, -3789, 1014, +-4008, 7995, -8119, 4871, 767, -1178, 6257, -1073, 1060, -6332, 5907, -121, 1518, -3248, 3933, 1523, +-4709, -226, -1067, 1526, -258, -3403, 911, -2943, 2645, -1939, -3517, -1095, 3653, -493, -1509, 282, +5137, -2601, 4383, -1163, 4369, -3115, 4682, -6227, -902, 7026, -4389, -2120, -1711, 3315, 43, -4929, +5043, -3588, 2307, -1524, 3637, -3023, -3426, 3341, -2301, -1098, -1446, 10048, -7575, -2467, 2301, -1372, +4332, 2646, -7714, 8917, -602, -972, -4431, 5847, -5979, -474, 5118, -4838, 6117, -7302, 2367, -2487, +754, 4831, -1100, -2808, 3150, 1077, -2107, 2633, -2504, -2666, 3897, -4333, 1135, 2659, -6778, 7436, +-7139, 3681, -1369, 2601, -2949, 4090, -273, -3058, 5027, -2544, -798, 195, -478, 3344, -866, -6346, +3665, -180, -3438, 3101, -2917, 6234, -2797, -6294, 7293, -98, -3927, 5477, -2013, -3542, 7279, 362, +-2590, -170, 823, -116, 1013, -5177, 4113, -2732, 744, 377, -6283, 5402, -4644, 313, 1339, -511, +8601, -7688, 2394, -3851, 8195, -6046, 6265, -6683, 6455, -840, -1832, 78, -1507, 734, 166, -3789, +-108, 817, 1392, -7286, 7439, -7256, 7896, 451, -7983, 7689, -251, -2296, 2894, 537, -3293, 6600, +-1617, 1373, 1321, -2272, 3963, -4972, -5067, 10335, -5223, -3983, -1282, 3457, -2817, -1151, -2217, 134, +-1108, -16, 2540, -2217, -5038, 11515, -5843, 2492, 2702, 1131, 1986, -1377, -3210, 8283, 22, -1288, +-2219, 2349, 883, 1514, -8940, 3165, 2535, -11226, 2468, -922, -593, -327, 1727, -3236, 158, 1391, +3994, -407, -3819, 9920, 767, -633, -1845, 3048, 978, -424, -5132, 4543, -1754, -170, -5706, 272, +3326, -3066, -231, 736, -4072, 2421, 2737, -6074, -1441, 2446, 3408, -1893, -2171, 6128, 5629, -5951, +-2495, 9828, -3329, -1764, 337, 739, 2022, -16, -3747, 1330, -44, -2908, 4655, -6167, -88, 4951, +-2100, -4241, -3148, 3498, 2006, -1925, -8517, 9902, -894, -5281, 4373, 56, 2750, 524, 644, 2463, +686, -547, -462, -1014, -712, 3518, 2498, -6027, 539, -1546, 4346, -7282, 233, -1042, 4871, -5797, +4182, -1887, 2633, -1504, -4017, 1963, 1603, 3132, -4084, 4233, -3206, 4657, 4406, -9561, 7274, -5605, +5531, -6546, 1872, -4031, -565, -2870, 1424, 807, 3576, -885, 639, -2005, 3118, 1480, 3195, -4627, +3324, -1820, 3615, 360, -3643, -850, 3362, -690, -2606, 1945, -1540, 1844, -8586, 7026, 2023, -4826, +-1547, -1084, -2118, 2607, 261, -6717, 5984, -3759, 6241, -1518, 1720, 2116, 1305, -1618, -693, 6301, +-3120, 5538, -4689, 729, 976, 4590, -7303, -640, 2750, -4991, 492, -2813, 2454, -3698, -3572, 3695, +-2936, 489, -291, 1421, -3569, 3429, 3825, -693, 5981, -5046, 2381, 6717, -738, -3980, 5850, -5456, +-2255, 429, 1201, -2849, 2450, -7555, 5553, -2516, -3331, 6826, -5703, -1911, 3947, 4122, -5970, 3816, +-4700, 4636, -2178, -684, 5265, -4441, 3241, -2425, 4586, -4575, 7130, -3074, -4351, 3405, -2692, 5926, +-4156, -4764, 3091, 757, 1332, -287, 1057, -1371, 3580, -7008, 6726, -3801, 2257, -2171, -114, 296, +160, -3612, 1907, -4357, 1968, 3395, 738, -7043, 5853, 2013, -2743, 4367, -5783, 8257, -2944, -7069, +8080, -5285, 5565, -6070, 1012, 1700, -5505, 10488, -7132, 4164, -3894, 8328, -8487, 7198, -6509, 3295, +1811, -2990, -2313, 5732, -4446, 61, -6596, 5153, 4725, -5462, 2288, -3365, 5983, -7871, 6749, -5844, +3627, 2323, -3967, 4446, -4584, 3571, -845, -2047, -2066, 7400, 280, -8495, 7416, -9265, 7766, 4019, +-8563, 2952, 3756, -2417, 579, -2561, 4437, 567, -3368, 2277, 574, -2785, 988, -4415, -607, -3190, +10597, -9737, 1738, -1975, 7174, -695, -1213, 1332, 5724, -3632, -748, 2141, -1912, 1468, -1589, -3897, +-525, 700, -3076, -429, -3064, -81, 6861, -3946, -688, -327, 10996, -2687, -3246, 5960, 58, 3683, +-3899, 1366, 3821, -3214, 57, 260, -3357, 913, -1586, -3770, -6090, 993, 4249, -7027, -529, -610, +6626, -4402, 2275, -1304, 6796, 942, -2917, 3300, 95, 4877, -5374, 3205, -2748, 4737, -901, -8100, +6492, -7506, 7962, -2926, -2663, 2399, -1285, 6771, -10487, 1803, 5207, -5098, 1235, -3378, 4791, 2092, +-7740, 5534, -3605, 1446, 2518, -1083, -1779, 787, 1088, 1711, -3852, -481, 3766, 1115, -8059, 5057, +5021, -1821, -3128, -387, 4579, -1234, 3062, -8102, 4879, -207, -3555, 3676, -8334, 6360, -1565, 1417, +-1352, -574, 4631, 1230, -8431, 4025, 1515, 1745, -3771, -2124, 2335, 3731, -8159, 3955, -2590, 1883, +352, -1028, 1438, 5001, -1965, 872, -1367, 4483, -1032, -1027, -391, -2253, -786, 2442, -3047, -4091, +2332, 3812, -3224, -7688, 4506, 4741, -6650, -511, 3416, 2719, -1629, -236, 3195, 545, -3202, 5843, +-972, -1092, 3763, 1421, -3356, 501, 1444, 1684, -6402, -1514, 2293, -5312, 5689, -6814, 1491, 2660, +-5358, 5918, -3702, 6620, -6974, 3115, 1083, -406, -2382, 2358, -2785, -627, 4337, -359, 4470, -11030, +6593, 3385, -2428, 2238, 1082, 4173, -6824, 3947, 964, -2835, -2787, -1194, -1019, -3563, 3812, -5881, +6559, -10163, 4560, 5271, 679, -4131, 4049, -1225, 4050, -3408, 4402, 4132, -8228, 2469, 3384, 1628, +-8202, 7265, -6456, 1982, -4095, 2552, 1075, -4324, -4251, 6465, 3012, -10500, 7044, -3358, 4053, -3392, +6102, -2747, 6118, -9442, 4687, 1508, -2927, 4110, 527, -3007, -3612, 4433, 1382, -4779, 974, 1658, +542, -1175, 1626, -937, 120, -930, -1699, 5324, -3760, 3020, -4552, 1777, -3655, 4083, 340, -2718, +-4186, 3731, 3114, -3405, -816, 177, 3227, -4855, 2353, 2446, 600, -2489, 1482, 867, 12, 6504, +-6424, 2431, -2136, 3716, 931, -4914, 2663, -2542, 2613, -542, -3004, 967, -2950, 1809, -4728, -1426, +9393, -795, -6760, 1179, 7783, -3169, 2480, -6820, 2257, -896, -585, 1712, -838, -1183, 5745, -5181, +-1600, 616, 7803, -4176, -6134, 5015, 2564, 8334, -12900, 1556, 5942, 969, -3148, -3286, 3770, -574, +-1735, -2103, 5813, -3792, 4148, -4657, -4709, 4882, -677, -1152, -5154, -2907, 9621, -670, -4036, -289, +5700, -74, -1005, -291, 4872, 262, -1436, -1453, 2370, 4425, -970, -5485, 2107, -5094, 6081, 252, +-5926, -4411, 7095, -3491, -188, -6888, 9046, -729, -6002, -1294, 9198, -2839, 1314, -5656, 8919, 2000, +1344, -854, -1456, -1926, 3567, -756, -2152, -3411, 2515, 1234, -7248, 5743, -5137, 6250, -9737, 1853, +6060, -2398, -1645, 554, -1291, 5402, 1223, -3884, 3459, -5189, 7319, -836, -7658, 12629, -7859, 6057, +-3543, -3476, 8919, -4458, 354, -6099, 6028, 93, -510, -4848, -200, 1672, -1590, -267, -4553, 7634, +-7521, 3478, -3833, 5757, -848, 1884, -4011, 5045, 2198, -4322, 151, 2206, -2101, 6131, -2653, 1043, +674, -2204, 3625, -5415, 4531, -642, 1382, -5555, 2276, -67, 520, -1294, -1490, -482, -2703, 1337, +-6850, 4480, -6143, 8421, -2212, 251, 1682, 1688, -1560, 3825, -1552, 993, 5246, -1993, 273, 508, +3902, -1137, -2881, 2728, -2148, -4186, 69, 419, -2624, -2463, 3805, -2487, -1898, 3863, -3929, -2815, +1986, 1147, 4184, -4199, 2471, 1378, 3720, -3892, 5993, -878, -3357, 4428, -3038, 5152, -7394, 3484, +-556, -721, -2706, -679, 3442, -2313, -4691, 1041, 4469, -5579, 4178, -2435, 3610, -4331, 3027, -2488, +5645, -7941, 6438, -2947, 1423, -551, 2170, -2010, -809, 3091, -3081, 6034, -3756, 1868, 1058, -215, +2015, -800, -2895, 1460, -1106, 233, -1644, 929, -3922, 2120, -3770, 3266, 3342, -5991, 3480, -1783, +-1566, 6118, -3443, -1635, 1491, 819, 2010, -2693, 85, 3038, -3771, -2303, 6002, -4113, 3456, -619, +-4165, 7179, -3924, 8004, -9024, 6134, -4652, 3945, -2223, -133, -2532, 224, 1553, -3880, 4111, -4676, +4206, -5511, 3652, -4562, 9998, -6363, 1306, 3215, 270, 4401, -3105, -5943, 763, 6758, -7480, 5895, +-6842, 5795, -3958, 1117, -3689, 4460, 1417, -3893, -1370, 233, 9002, -7178, -2514, 4094, -684, 2450, +-4969, 3567, -3865, 2633, -1029, -2386, 1211, 3439, 2280, -4570, -1650, 6156, -120, -1089, -3239, 6887, +-2192, 511, -2794, -317, -492, 952, -3578, -1267, -48, 6452, -6194, -2194, 4074, 4403, 798, -9165, +6565, 723, 4323, -6510, 490, 4996, -3059, -1519, -123, -1624, 6265, -8028, 2370, -3201, 4197, 2393, +-4003, -5832, 5348, 4572, -3803, -647, 1479, 4785, -5207, 1307, 1679, 2513, -590, -4880, 4672, -3616, +3198, 124, -3522, -6959, 7481, 1352, -2035, -4886, 505, 2278, -748, -1085, 2064, 2110, -52, -505, +-2849, 9182, -7420, 4859, -5981, 5277, 3131, -2051, -3202, -5469, 6961, -722, 361, -3732, 2495, 237, +-3196, 2782, -1178, 3063, 2824, -10127, 1507, 10022, -3411, -3756, 956, -1845, 4815, -4416, 5497, -9325, +6186, -6293, 10386, -10966, 6235, 1904, -1193, -5959, 5577, 2953, 1802, -7834, -2477, 13459, -13155, 12927, +-9646, 831, 3994, -2306, -478, -964, -845, -141, -312, -8822, 12314, -3612, -1711, -5199, 3927, 9195, +-1276, -4951, 5721, 1117, -2384, 2219, -1555, -918, 2165, -2284, -4113, 6207, -5879, 1907, -1694, -6859, +11737, -6536, 252, 3477, -7629, 5782, 283, 2976, -2613, -615, -1719, 4109, -5905, 7557, 633, -3062, +-226, 4118, -2233, 3173, -1059, -4793, 5387, -1716, -85, 86, -5137, 121, 2830, -4371, 471, -790, +-3196, 2483, -8879, 12855, -4890, -918, 3285, 518, 4979, -2000, 3715, -1950, 3723, -5617, 8663, -514, +-4009, -711, 4860, -7771, 3598, -3625, 1731, -2900, -5309, 5922, -4982, 2448, -2335, 4935, -8768, 3582, +5132, -5827, 3832, -7567, 14028, -1725, -5253, 8056, 441, -2130, -1882, 3990, 1076, -3301, -3524, -755, +2702, -2256, 1158, -4144, -1407, -648, 3826, -1129, 88, 292, -865, 6661, -1804, -1357, 3845, 624, +-1060, -2041, 475, 5716, -9454, -3206, 3407, 1751, -1032, -1717, -2229, 1572, -1336, 3534, -189, -1820, +-948, 7685, -4964, -306, 7786, -2369, 463, -7643, 11920, -512, -4046, -7031, 8479, -3725, -866, -1388, +-878, -1921, -2641, 1909, 72, -3194, 3477, 1001, 1337, -3621, 10839, -2654, -2496, 187, -745, 7853, +-4744, -1492, -2131, -732, 523, 574, -3346, 2872, 4771, -5280, -455, 2495, 4421, -1914, -4769, 6727, +661, -2156, -1259, -7264, 3063, 475, 3665, -12361, 6540, 4193, -1172, -6768, 2803, 4113, 2012, -7538, +4502, 3541, -81, 1404, -2143, 246, 3683, -1740, 721, -2844, 704, 1234, 1753, -6905, 4314, 2334, +-2338, -1974, -2485, 4181, 342, -7761, -373, 5310, -1488, 49, -2051, -266, 2073, 2009, -1128, -1056, +730, 9015, -7040, 1359, 1206, 7246, -5845, -1560, -2962, 4962, 497, -9121, 2893, 2647, -4380, 2719, +-4413, 213, 7522, -5136, -1853, 8721, -8967, 7213, -1776, -6131, 9816, -6960, 4521, -226, -6088, 6573, +622, -3395, 1141, -631, 2265, 90, -2049, 16, 3050, -3780, -6223, 6374, -9315, 10262, -1194, -6826, +6037, 1282, 2325, -4312, 182, 3540, 7280, -11034, 4129, 34, 5441, -9848, 2376, 172, 4173, -6624, +-1101, 3993, -4439, 5694, -358, -3168, 4976, -3422, 2614, -4561, 1893, -1238, -22, -6256, 6794, -1025, +3384, -1004, -2673, 7405, -4312, 752, 3266, -1657, -3792, 5510, -2386, -2902, 1609, -1189, -3053, 2690, +-5801, 6836, -58, -8297, 8137, -717, -418, 5030, -754, -2574, 7256, -6778, 4759, -3876, 307, -472, +-2351, -43, 5246, -7447, -3733, 5596, -6878, 4890, -1514, -2482, 6054, -4425, 2739, -1919, 4681, -3282, +3017, -904, 5119, 1019, 118, -253, -195, 4209, 408, -4717, 1217, 2714, -10381, 4732, -5217, 5850, +-7377, -4292, 2527, 3257, -1785, -5332, 8491, -7251, 2816, 2902, -1142, 4374, -3983, 6494, -3833, 3379, +-4428, 7318, -3451, 570, 570, 4212, -3573, -707, 1153, 418, -492, 859, -2947, -2900, 1966, -5460, +3047, -5586, 2306, -326, -2530, 557, -53, 7483, -4918, 1580, -1829, 9215, -1220, -2927, 4494, 1827, +-2362, -1514, 509, 2305, -2977, -2947, 1367, 2038, -3637, 83, -58, -7252, 3622, 1370, -2169, 373, +-3238, 5524, -4153, 8569, -4571, 3204, 380, -1232, 1120, 2635, -858, -2371, 2006, -3018, 3087, 3545, +-3765, -3469, 123, 2388, -2442, -4613, 3532, -2821, 4477, -4045, 316, 3975, 1734, -8245, 5068, 4148, +272, -672, -2005, -4488, 9746, -4798, 2237, -2023, -2481, 5663, -8371, 3092, 3550, -2407, -1369, -1029, +1129, 5002, -4860, -1337, -2101, 1335, -1169, 2509, -2855, 829, 4550, -2805, 245, 6020, -1350, 138, +2417, -2762, 6805, 854, -7678, 1592, -6342, 5082, -2999, -5503, -3241, 820, -2192, 4258, -6357, 6620, +2923, -1945, -178, 6616, 5192, -5232, -2536, -911, 8871, -5398, 259, 1053, 976, -1023, -831, 1939, +-5166, 4722, -6470, 2824, -2719, 3426, -5629, 323, -7123, 7196, 1231, 1460, -5029, 3865, 545, 2146, +-1190, 7767, -9145, 8791, -41, -5525, 2853, -2835, -1222, 1783, -7523, 1333, 7063, -7774, -305, 2142, +400, 7276, -8577, 1551, 7458, -7083, 8118, -7005, 3389, -2152, 331, -3784, 2703, 656, -3638, 1825, +-4467, 37, 12985, -12107, 4672, -1527, 7374, -8587, 6873, -6500, 9781, -10737, 7797, -4432, -397, 5049, +-2906, -2241, 3552, -5979, 5391, -1755, -6460, 5372, 3053, -5036, 2556, -4296, 1149, 2672, -1344, 1202, +-153, 4350, -10450, 7651, -5694, 9247, -8870, 5998, -3863, 1497, 1968, -1262, -5286, 9196, -4943, 1416, +712, 285, 1832, -4070, -1579, 5571, -5304, 4932, -6631, 5119, -1908, -1095, 5416, -4703, 4780, -8355, +7707, -1236, -1495, -1552, -2770, 2260, -196, -3212, 4380, -4808, 2308, -1406, 2631, -2893, 3078, 1843, +-2870, 341, 8285, -6255, -104, 546, 2043, -1954, 1766, 147, -2564, -532, 4218, -78, -2434, -2842, +1412, 1709, -6394, 8210, -2368, -257, -4969, 3398, -22, 1990, -167, -2659, -738, 1426, 2535, -4938, +3920, -3046, 4580, -2925, -1980, 855, 3325, -2709, -1259, 4424, 2157, -2299, -111, -2779, 6019, -7221, +4614, -6276, -253, -235, -1812, 6404, -2828, 4851, -5446, 6307, -563, 596, 2683, -909, -4512, 8615, +-8386, 2482, 2101, -8868, 1821, 569, -5123, 3929, -4021, -757, 2197, 1222, 3118, -908, 4755, -3057, +-1963, 4196, -136, 1322, -517, -1654, 1178, 2433, 2471, -7197, 4282, -2576, -1980, -782, 1462, -5863, +3402, -9003, 5008, 3383, -3119, -308, 2516, 579, 3341, -1224, 276, 5368, -745, 2947, 1591, -1771, +3887, -8919, 2327, -3587, 1311, -5042, 2672, -6458, 2760, 2408, -2285, 2232, -5019, 2755, 1141, -814, +-845, 3903, -1389, 757, -4196, 7130, -1285, -1664, 1862, 3133, -6945, 7289, -4404, -354, 5259, 1220, +-5466, 3156, -2855, 3150, 2517, -14695, 10666, 1454, -6557, 13, 1102, 323, -1688, -3900, 6070, -6270, +3023, -1033, 1313, -757, 6316, -223, -3517, 1637, -270, 10068, -6812, -1051, 7074, -5572, -182, -1524, +3101, -5607, 218, 1926, -4709, 1987, -1504, -5180, 2042, 2293, 457, 2288, 2537, -4614, -1518, 9888, +-6078, 3564, -1729, 1958, 1956, -2451, -62, 1854, -5438, 2866, -7785, 6465, -2219, 909, -2416, 698, +-2037, 6907, -1304, -4466, 2647, 2187, -372, 2635, 28, -2644, 5769, -4611, 2681, -2870, 3101, -11065, +6988, -5080, 972, 497, -1675, -3541, 3782, 1987, 158, 505, -2151, -1208, 7081, -2203, 1066, 5404, +-603, -1006, -2342, 1595, 5441, -3698, -3801, 593, 1478, -2469, -6005, 4862, -9139, 7041, -3363, -832, +292, -4307, 2638, 833, -223, 6347, -1123, 891, -2815, 7086, -2984, 5447, -3405, -1286, 4377, -4003, +866, 2206, -3903, -2042, 3753, -2349, 1608, -3389, -1417, 2064, -2005, 438, 1706, -2968, 5238, -12797, +9451, 3359, -4290, -4113, 7659, -6053, 7707, -1593, -490, 1858, -2678, 491, 777, -2854, -3401, 8199, +-9984, 4345, 322, 5110, -6492, 1993, 985, 1528, 1603, -1217, -570, -1582, 1818, 2195, -5796, 4901, +-3193, 3398, -3410, 1607, -2985, 4970, -4672, -1669, 3714, 2463, -4795, 634, -2274, 2854, -295, -378, +-1366, 1028, 924, -2391, -865, 6915, -5733, -405, 5602, -8633, 6662, 1201, -5926, 5170, -1413, -1531, +3652, -3178, -698, 5156, -4403, 1561, 2733, -2593, 3377, -4440, 3008, 480, -2818, -652, -459, -1747, +2316, -1650, -2580, 5466, -9195, 4897, 1603, 49, -3302, 5514, -2244, -1882, 4356, -402, 4278, -2766, +-5017, 6773, -663, -2510, -2457, 1736, 200, -2001, 310, 800, -5642, -844, 3878, -708, 3274, -1492, +639, 777, 3638, -1684, 4413, -1177, -1376, -5642, 10428, -11524, 3276, -422, 517, -1177, -1876, 1131, +-2714, 444, -3406, 8704, -4487, 1632, 2324, -2563, 1456, -177, 4855, -2725, -6683, 6119, 1749, -3504, +596, 1435, -4838, 7366, -11617, 11117, -3671, -2797, -799, 2334, -2271, 3247, -3760, 7074, -7377, 4492, +4726, -8276, 7451, -3168, 6012, -5935, 1774, -1248, 2013, -5025, -1676, 1606, 432, -3156, 1522, -611, +2921, -249, 550, 1362, -1743, -1051, 2497, 2643, -3411, 649, 2467, -848, -2415, -5696, 8749, 681, +-10014, 5790, -186, -313, -3090, 1904, -4378, 7583, -8537, 9007, -6835, 2233, -1588, 4306, -1280, -2902, +10489, -5803, -1037, 3503, 1468, 3017, -3836, -3476, 3078, 4375, -7908, 5184, -6842, 1688, -2217, -1672, +2308, -3919, 4603, 1791, -3631, -2656, 5896, -1820, 268, -7056, 5908, 1947, -3413, -5386, 5508, 5491, +-1409, -3543, 5575, -1194, 3029, -4631, 4401, 937, 1214, -1669, -1700, 1037, -3695, 2437, -2783, -6466, +3432, -2295, -951, -7219, 7877, 4306, -5425, 3071, 2003, 4270, -205, -1116, -1245, 9272, -8747, 4067, +1792, -7319, 2798, -4282, 4725, -6470, -3511, 7393, -7973, -1034, 5523, -2899, 7660, -7767, 4435, 3268, +642, -2779, 3743, -3981, 3658, 1766, 1235, -6316, 4066, -1114, -3454, 2528, -3408, 1801, -4434, -1122, +6220, -5379, 7334, -2460, -2323, 3355, 1474, -3485, 2866, -4581, 1647, 7323, -6750, 2999, -3763, 924, +-4419, 6459, -7990, 9511, -8465, 2826, -1509, 108, 7982, -4681, -670, 99, 2052, -1391, 887, -3240, +6555, -525, -3101, 5690, -5771, 3188, -4707, 4761, -5070, 6414, -5218, -4989, 2336, -635, 3202, -5248, +7158, -6919, 5838, -5502, 7723, -4167, 4429, -4136, 5757, -1065, -99, -2239, 2638, -6211, 3756, 2127, +-2761, -757, 2476, -7902, 4738, 682, -743, -460, -4056, 2367, 6571, -9472, 9510, -2425, -1388, 1625, +1001, 1123, -2498, -1147, 3019, 1270, -3944, 4923, -1966, -3668, -108, 4038, -2599, -1464, 1121, -8430, +10255, -9429, 7160, 298, -2280, 777, 211, 2111, -2550, 2286, 929, 1364, -4502, 9867, -5601, -4027, +4664, -3172, 6579, 282, -9177, 4176, -1357, -4217, 2631, 652, -3396, 1708, -3277, 1982, -1698, 2718, +738, -2292, 5900, -525, -538, 3964, -1992, -177, 1414, -2204, 3036, -6899, 933, 2444, -2849, 1281, +-393, 1220, -1176, -5313, 6442, -1107, 43, -1776, 3458, -3111, 4494, -1299, 379, 367, -443, -1291, +-2431, 5403, -5049, 2644, -3411, 203, 4698, 2781, -9146, 4862, -369, -2152, 1935, -747, 4139, -4502, +2959, -2608, 3239, -1929, -4671, 98, 325, 1852, -791, 1161, -7317, 11016, -4579, 4646, 1717, 1678, +-2550, -581, 2562, -3150, 2241, 811, -4141, -5574, 7634, -2688, -4532, -5335, 5685, -1143, 2000, -1207, +1249, 4697, -8171, 8527, 720, -3445, 4099, -3262, 3644, -7559, 11710, -2789, -6518, 335, 5944, -88, +-3979, -2883, 10100, -10361, 2321, -569, 601, 3908, -6229, -1529, 5557, -5905, 6827, -5717, -539, 428, +6207, -8095, 3624, -3690, 7604, -7038, 418, 4847, -3526, 5547, -7790, 10707, -6405, 9004, -9623, 6270, +-3525, -943, 5436, -2871, -1376, -124, 1140, -5357, 4712, -1113, -1522, 5117, -5832, -1004, 4142, -2253, +-2043, 1933, -2477, 5068, -2015, -5257, 3295, 498, -3294, 3850, 4064, -801, 3, 1192, 948, -849, +600, -688, -2472, -1518, 1091, 886, -2510, -1220, -225, 5601, -6383, 6053, -2982, 1545, -3123, 1055, +2747, -557, -1472, 3573, -160, -5156, 4504, -3228, 75, 566, -1245, -144, 3249, -3879, -328, 8282, +-9007, 2943, -96, 1061, -5266, 4394, -6355, 7533, -909, -2107, 1788, -704, -451, -478, -510, 4985, +-4891, 2060, -38, -3778, 8366, -2986, -1115, -209, 4135, -6959, 11127, -10906, 7148, -1341, 2482, -5264, +3961, -1774, -5093, -4594, 5000, 406, -3348, -510, 2175, -2040, -2360, 4465, -1380, -2562, 2811, 4843, +-1592, 4187, -5484, 10082, -4572, -1742, 6498, 3260, -9217, 897, 1065, -790, -178, -5331, 1874, -3155, +3295, -6660, 2453, -2336, -917, 4190, 13, -2672, 3049, 4595, -6848, 7048, -2559, 7240, -5070, -1423, +1391, 5488, -4499, -1555, 1095, 4525, -7686, 1559, -1095, 524, 328, -2698, 3247, 264, -6403, 5656, +-5516, 5498, -2061, -2047, 5684, -9572, 3066, 3543, -140, -2052, 5734, -2811, 10295, -11903, 6054, 1816, +-4875, -83, 3223, 168, -6711, 1727, -481, -1605, -2060, 4010, -982, 11, -2817, 6349, -8192, 5617, +-800, -1812, 5741, -7038, 6222, 314, 262, -7216, 7825, 748, -2155, -249, 4283, -6259, 4582, -4673, +621, 3048, -6283, -115, -1159, 1666, 2283, -2334, 3102, -4267, 5614, 410, -588, 3014, -2779, 3001, +252, -3019, 2152, -1180, -3624, 644, -4328, 7506, -5125, -5832, 6497, -974, 4724, -3387, 5070, -2267, +-2143, 5594, -6839, 6053, -8532, 10450, -8145, 2241, -2166, 10971, -12926, 2349, -3938, 11631, -11069, 2884, +-2036, 5574, -3614, 2017, -2412, 1453, -114, 2889, -2678, 554, 9726, -6678, -1751, 1823, 1957, 2311, +-3320, -3091, 4545, -6148, -1958, 3131, -6936, 5813, -1256, -3943, -1734, 7463, -5660, 6309, -5786, 5079, +1198, 3618, -4160, 4533, -3789, 2798, 2918, -4113, -657, 4029, -4098, -4659, 6254, -6588, 6222, -11451, +4589, 3571, -2248, 3690, 361, -6441, 5524, 2233, 369, 1593, -5396, 4137, 415, -4013, 2732, -495, +-4480, -2109, 4099, -502, 2536, -3589, -1932, 2623, 572, 2292, -2727, -420, -1586, 1918, 2513, 233, +144, -1518, 4595, -3711, 4369, -520, 1464, -5477, 385, -1074, 5033, -2654, -7004, 2118, -1590, 2409, +-5879, 3445, -298, 1277, -1846, 10480, -7391, 11077, -4109, -3951, 4265, 1007, -722, -334, -5093, 1525, +2897, -6160, 591, 1460, -5772, 5406, -5714, 3045, 745, -2596, -1616, 4521, 648, 3601, 2491, -6790, +6351, -2342, -3184, 8843, -3357, -2742, 6897, -6721, 2042, 1959, -5805, 2464, -4169, 136, 496, -2372, +-1968, 2373, -2269, 315, 4481, -3503, 7289, -7456, 4470, 726, 3765, -906, 5470, -8535, 7995, -600, +-2806, 652, -1966, -1720, 359, -3424, -41, -205, -3756, 605, -1774, 2699, 38, 3325, -9308, 9171, +-432, 4322, -3145, 4137, 3053, -2695, 2118, 477, 818, -3298, -1405, -1245, -1336, -2299, 1045, -4533, +2265, -1566, 4724, -1436, -2143, 2421, -2125, 4570, -3174, 6291, -1142, -3605, 2271, -2627, 1813, 38, +-1091, -3085, 5746, -2014, 86, 1678, -2839, 4091, 612, -1734, -177, 992, -3087, 2220, -1611, 3110, +-1526, -355, -5210, 816, 4923, -5365, -805, -1138, 1152, 4357, -3525, 2796, 829, 1480, 406, 2736, +-7412, 10805, -7050, -975, 4389, -4469, 5423, -5678, -2354, 254, 2323, -6666, 4176, -3738, 4795, -2619, +5035, -2600, 1172, 2889, 553, 1441, -1840, 4353, -2146, -2092, 457, 3572, -5482, 7517, -12261, 4681, +1977, -11216, 2767, -1612, -1383, 4387, 993, -2732, 3541, -1552, 4384, 477, -1744, 4910, -1399, -224, +-1325, 5130, -2550, -841, -2976, 5617, -2927, -5222, -227, -438, -754, 1399, 774, 424, -404, -1540, +3601, 546, -2597, 3026, -1561, 794, -1250, 5143, -556, -6115, 3719, -5324, 7293, -8968, 4153, -4716, +2927, 776, 1159, -2040, 5089, -3842, 3644, -2435, -2127, 2513, 395, -793, 2194, -7430, 12973, -8972, +2984, -5995, 12894, -12499, 3576, -796, 2714, -2656, 1634, -1478, 1481, -200, -3944, 2090, -1247, -1308, +5008, -771, 20, -2835, 3442, 3155, -5741, 2845, 2972, -3253, -4302, 6002, -4828, 4888, -4193, -757, +1079, 48, -3181, 3702, -7023, 7512, -3141, 1326, 5108, -7935, 5704, -20, -4036, 4712, -1217, -2208, +-1396, 857, -1432, 8364, -9612, 6409, -2774, 2307, -5862, 9828, -6302, 6606, -6273, 3011, 2505, -3279, +3167, -3788, 2026, -2947, 75, -5092, 1687, -2716, 393, 2215, -5092, 4994, -2706, 890, -1134, 4132, +-3806, 5898, -3791, 4700, 1920, -5612, 7676, -4870, 3844, -2334, -1968, -1388, 8670, -10983, 5038, -2495, +-5062, 8694, -7986, 6795, -5318, -1129, 1041, 2398, -2239, 5259, -1311, -1717, -1720, 5687, 1520, -6253, +-1315, 829, 1655, -713, -4277, 1614, 1688, -473, -3269, 6410, -3581, 1222, -1969, -987, 5935, 2755, +2292, -9942, 7322, -2082, 847, -1550, -2627, 478, -1816, -2191, -1226, 2683, -2481, 3369, -7197, 5730, +3934, -4070, 2113, -2387, 6145, 1908, 95, -2812, -226, -2208, 1019, -968, 786, -5253, 1957, -3962, +2543, 1403, 694, -6843, 4416, -1198, 3209, 4877, -4183, 967, 212, 3407, -399, 43, 160, -1025, +-71, -2426, 978, -1367, 1830, -6463, 4733, -2748, 1928, -4022, 1874, -3503, 2164, 3023, 481, -1277, +1279, 415, 2681, -5544, 7256, -5893, 3670, -5650, 4301, 1239, 1865, -3695, 1243, -957, 431, 653, +-2165, -1683, -1781, 2610, 846, -745, -2040, 1307, 1919, -6412, 3122, 4806, -4679, 2643, -6545, 11076, +-2324, 1067, -1900, -2009, 3491, -4518, 3744, -3022, -300, -2096, 4733, -1336, -2791, 6135, -6652, 3094, +-4820, 5996, 2420, -6276, 2412, -1760, 978, -58, 708, 720, 431, -5727, 5488, -986, -1268, 353, +2398, -5129, 6603, -4395, -1570, 1783, -5093, 6099, 4210, -3802, 1513, -5373, 9223, -4896, 4992, -31, +1360, -5707, 3621, -4746, 4340, -7235, 2092, -2257, -661, -3303, 1291, -3164, -1129, 8062, -4985, 6659, +-4166, 4193, 2112, -3461, 4764, -1410, 5173, -6333, 574, -319, 2614, -2561, -1932, 3317, 647, -2996, +2820, -2476, 2394, -2133, -435, 2412, -5550, 299, 1748, -5812, 2617, 1515, -581, 5276, -6003, 4361, +3139, -2536, -3486, 8508, -9125, 8056, -8388, 4633, -4497, -3018, 3614, 1637, -1962, 3690, 125, -3716, +4191, 1281, 2217, -2709, 536, 3554, 2202, -7524, 3118, -3300, -1060, 3812, -9807, 7136, -6965, 6160, +-7642, 8019, 740, -2954, -801, -172, 8674, -6432, 2358, 656, 3885, -7698, 8851, -9601, 10760, -10126, +6779, -768, -7972, 2333, 3215, -7442, 2241, -1080, 4710, -2779, -486, 200, 7281, -5796, 393, 10115, +-8280, 5292, -5959, 8395, -7765, 6585, -8289, 5292, -5214, 1908, 3102, -5861, 3307, -3907, 4566, -207, +-3555, 3401, 1257, -3239, -908, 3105, -893, -21, -1096, 2339, 2552, 1687, -8826, 9545, -4998, 2601, +-1436, -158, -558, 2370, -2393, 1703, -3145, 1056, 3902, -8449, 5001, -1954, 3088, -3581, -2550, 6321, +-3413, -83, -939, 3728, -960, 134, -35, 2449, 686, -244, 246, 2831, -1963, -2882, 7697, -6329, +-4424, 3255, 1577, -2423, -5184, 3277, -1313, 7503, -11631, 13784, -8081, 2842, 3438, -1223, 2115, -3790, +2478, 990, -6816, 2976, 3366, -8379, 2754, 255, -323, 3729, -7473, 6688, 3870, -1425, -2299, 3127, +-4156, 4953, -584, -2983, 2164, -4010, 1605, -1927, -864, 2321, 6952, -6782, 1406, 3488, -3534, 3554, +-4100, -478, 2593, 950, -7117, -777, -2063, 7696, -5528, 2625, -1628, 7078, -7730, 2486, 3392, 1972, +2764, -2457, 232, -871, -1663, 3042, -2891, -2230, 3220, 2149, -6431, -2274, 5310, 1853, -6220, 6923, +2296, 285, -4769, -4561, 5642, 833, -3387, 4176, -5614, 2079, -3176, 4274, -2776, -5935, 8226, -3518, +1353, 548, 587, -3591, 5131, -2311, 5924, 139, -1253, -390, -2285, 4594, -1889, -195, 478, 2461, +-5404, 2864, -3599, 3649, -2058, -689, -255, 5801, -6950, -538, 5337, -7797, 6999, -630, -3469, 1161, +-5653, 3646, -928, -1657, 9181, -2148, -3581, -2491, 8262, -2690, -902, 3287, -688, 4125, -5440, 1243, +587, -598, -3252, 5250, -2533, 1693, -1487, -124, -3291, 1252, 6275, -6759, -658, -1458, 4844, -3638, +248, 1811, 2189, -955, 39, 1234, -712, -4420, 5432, -5283, -1966, 4663, 1316, -2464, -3433, 3631, +-1535, 5904, -6510, 3200, 6705, -9211, 7548, -343, -720, 1346, 913, -6859, 5180, 453, -4683, -3204, +3624, -3624, 8823, -7102, -2468, 3261, -2444, 4560, -1587, 2197, -5543, 3496, -1804, -2545, 4526, -835, +-2146, -2378, 8235, -2784, -47, -140, 6128, -3067, 5319, -1082, 1270, -3359, -4508, 6488, -5154, -6333, +6503, -6472, 2466, -4300, 2024, 3647, -723, -6458, 12676, -4958, -5551, 15196, -12675, 4875, -1131, 5679, +-2620, -651, -33, -1388, -1699, -1331, 7384, -8013, 4003, -488, 1562, -4203, 4126, -1126, 427, -5948, +3752, 7353, -11325, 5945, -2675, 4043, 874, -4424, 1573, -1600, -1461, -776, 5264, -8379, 6582, -5414, +-6062, 9314, -3681, 1982, 3139, -4286, 5914, 3723, -1898, 1333, 6616, -3819, 4183, -3922, 26, -1351, +-2970, -5318, 4628, -4632, 2463, -7341, -216, -2800, 2393, 643, 1282, -98, 156, 2249, 261, 5720, +-4206, 1673, 3434, 57, -135, 345, 1573, -3575, 8, 1187, 3404, -5849, 321, 3342, -4664, 858, +4334, -4965, -4028, 5283, -1827, -347, -1296, -2585, 1476, 1954, -2956, 3348, 427, -1564, 1461, 941, +4600, -4853, 4193, -1850, -6529, 5020, 2785, -4878, -825, 5760, -4228, 2277, -8430, 7176, 1969, -1417, +-2830, 4750, -3700, 2895, 935, -3528, 609, 6615, -3583, -326, -4866, 3781, -1903, -3313, 2012, 2413, +-6391, 858, 2175, 2565, -3249, 7166, -7150, 5541, -899, 1848, -1324, 728, -4700, 9869, -12469, 6944, +-3762, 3445, -7583, 5722, -263, -4875, 5587, -3253, 677, -2439, 10782, -8181, 6777, -10316, 12280, -7212, +2661, -1175, 2103, -4580, 1407, 17, 2647, -6986, 5415, -5083, -373, 4122, 259, -4559, 4180, -6405, +10478, -3646, -208, 3927, -1217, 662, 2579, -759, -821, 471, -5063, 4515, -2418, -4096, -1060, -1152, +-1725, 5611, -2261, -2066, 4688, -6364, 8591, -6527, 6249, -4121, 1830, 809, 673, -1144, 701, 2542, +2371, -4277, 2980, 2794, -3915, -305, -1042, 3295, -7043, -4430, 10608, -11580, 3925, -747, 150, 1002, +259, -1614, 7969, -6290, 1646, 14109, -11315, 3438, -627, 5266, -7527, 979, 4193, -2978, -4506, -1711, +5950, -6163, -3534, 911, -818, 277, -2830, 6941, -6936, 2873, -796, 7304, -3270, 618, 5377, -2586, +5988, -5754, 1150, 7073, -6428, 3752, -464, 2237, -1116, -2762, -6294, 5013, -4874, 1581, 1155, -8343, +4320, 645, -6941, 4642, -212, -1268, 4773, -4366, 2030, 6675, -3361, 316, -1413, 10886, -4328, -1717, +-2082, 4625, -2425, 630, -501, 88, -4026, 509, 1894, -3339, -974, 2098, 5413, -11264, 3713, 4910, +-2628, -4227, 43, 9749, -3212, -335, -2689, 9227, -5926, 381, 3257, -4177, -1367, 1841, -6171, -446, +-3141, 4322, 2693, -1501, -3534, 7311, -2849, -1101, 129, 4266, 7084, -7389, 251, 7034, -5925, -4527, +1571, 2876, 1753, -7132, 7526, -7777, 1133, 938, 2755, -2488, -120, -114, 2789, -2844, 1351, -5269, +8958, -4696, -4713, 7225, -4424, 532, 1131, -3702, 9564, -5428, -184, 5122, -1963, -3632, 8026, -1673, +-3909, 214, 1742, -1003, -4333, 1467, 2426, -1980, -1178, 1138, 307, 1880, -6643, 9206, -2280, -6125, +6443, 556, -3651, -3018, 5320, 2289, -2125, -1415, 3250, 427, -8102, 6045, -2519, 820, -1662, 436, +-3229, 1564, 1866, -3059, -347, 3469, 2249, 5213, -8586, 3672, 3988, -455, -1698, 6610, -5844, 4361, +-4700, -1838, -429, 3838, -8218, 3387, -6981, 2716, 1690, -1561, -740, -2735, 6075, -1834, -698, 4616, +-6825, 11546, -7056, 6275, -2891, 4191, -6074, 2292, -1555, 7442, -1388, -7511, 2523, -6290, 10135, -8684, +2756, -3462, 2599, 31, 3179, -4432, 1458, 2326, -2641, 1075, 1379, 3048, -7125, 15, 3027, 2427, +-1247, 111, -1763, -179, 440, 2252, -2070, -3819, 4737, 125, 1806, -1092, -2460, 9426, -9122, 4685, +-821, 1733, -352, -923, -8878, 8930, -3210, -3651, -1600, -1480, 518, -2982, 2971, -1463, -560, 6653, +-2420, -553, 3990, 8911, -11600, 7083, -4158, 7453, -1816, -1932, -6012, 12025, -8493, 1616, 3303, -4626, +633, -6951, 1771, 2230, -2036, 4205, -9486, 7463, -3988, -846, 3983, -4773, 1300, 2086, 3104, 1186, +-2848, 3750, -1029, 1653, 588, -1516, 181, -4200, -5952, 8511, -3146, -711, 1029, -4322, 5119, -960, +3017, -205, -6176, 5001, 2552, -2857, 1226, 2052, -4715, 1523, 1, 2994, 1066, -5016, -3291, 5771, +-1175, -831, -741, 1854, -4548, 4156, 21, 4011, -8392, 3329, -3753, 4090, -5852, 2038, -120, -4417, +1853, 5580, 1400, -6121, 4857, 688, 3416, -1478, 4663, -3763, 1718, -147, -4901, 7827, -10365, 4988, +828, -4716, 3384, -4705, 161, -569, -3897, 4375, 1441, -4871, 594, 1969, -2688, 3881, -8173, 13818, +-2556, -2379, 236, 1214, 6866, -7123, 658, 2819, -818, -1721, 734, -2783, 2138, -5081, 1980, -2077, +6345, -7799, 5642, -3468, -1993, 5993, -3779, 1956, -2923, 4405, -5015, 3753, -2985, 385, 6207, -9388, +6773, 167, 116, -6342, 10847, -8679, 7613, -3541, 1577, -3147, -3216, 4966, -2344, 246, -833, -640, +-1441, -2848, 5301, -2999, 3196, -4596, 3651, -1116, 790, 1573, -5516, 8415, -5434, 11745, -12406, 7742, +-7040, 4957, -4764, 6374, -1348, -3691, 2198, -4790, 1534, 811, -5462, 3413, -1920, 5369, -1705, 713, +-3833, 4824, -1972, 3178, -6488, 10604, -7625, 3502, 1007, -58, -1419, -2545, -1263, 2489, -5347, 4202, +-4634, 116, 46, -171, 920, 1421, -4898, 4719, 1114, -150, 187, 5028, 102, -2972, 4035, -2927, +2669, -3017, 1507, -2289, 1589, -4100, 1614, -3158, 2543, -959, 2540, -5777, 2249, 1593, -3193, 1642, +2412, -291, 1516, -2472, -1554, -1919, 2112, -2661, -792, 3784, -1781, -1123, 3646, -3664, 5998, -2458, +6402, -1684, -120, -1772, 3075, -6246, 3027, -3452, 471, 4733, -5220, -537, 2534, -3998, 6012, -5551, +5531, 541, -715, -5072, 2161, -2079, 1177, -3757, -244, -2070, 5943, -718, -5081, 2550, 4166, -2347, +-244, 3435, -1602, -51, -1004, 4, 6456, -1595, -4307, 4245, 1878, -4901, 4279, 2711, -5969, 1408, +4172, -5138, -3240, 1904, -1696, -490, -3080, 1456, 886, -5180, -8, 4182, -1464, 4889, -2634, 3989, +-4700, 3561, 4071, -3038, 3622, -3361, 4919, -7925, 6952, -2259, 855, -6992, 7587, -4340, 2005, -2957, +-2437, 41, -811, -1694, 3118, -3551, 1920, -2106, 2365, 242, 1300, 2748, -2023, 1890, 4318, 987, +-3355, 5296, -7261, 1425, 5173, -6965, 364, 904, -3370, 94, 1060, 495, -3554, -270, -39, 3158, +-1181, 527, 35, 2671, -2157, 1697, 3005, -1367, 1110, -1905, 1706, 2244, -6501, 4576, -450, -2228, +-4787, 8658, -6386, 1291, -6046, 5830, -1098, -1162, 6861, -5871, 2255, -400, 3614, -3726, 3662, 241, +-2459, -6504, 9802, -3025, -3232, 2568, -1215, 1592, 4457, -6301, 4116, -1881, 3046, -5162, 5495, -2201, +-1894, -289, -2884, 4506, -3527, 4952, -4805, 134, -2589, 9987, -7080, 1201, -1030, 2257, -5856, 4970, +-1203, 1612, -1172, 661, 3879, -1293, 1893, 1138, -6303, 7630, -731, -1791, 3710, -8353, 2068, -3259, +2403, -3558, 952, -1391, -1853, 3316, -2304, 5438, -2737, -435, 3192, 4862, 290, -5466, 1028, 894, +355, -841, -654, 4187, -3936, -5432, 7601, -6237, 4197, -2744, 3653, -2351, 2033, 63, -1635, -2695, +1344, 1355, 752, 2051, -3897, 7093, -9502, 6917, -699, -1465, 2797, -2453, -7546, 9418, -5286, -1085, +3912, -3558, 2506, -1077, 3288, 1110, -457, -1140, 5565, -2664, -1461, 1260, -415, -4785, -922, 643, +5123, -7923, 1511, 825, 3337, -2654, 4552, -1270, 1779, -2669, 3467, -2177, 2643, -5604, 5044, -2459, +-683, 483, 1088, -4177, -2772, 2171, 4547, -2522, -4516, 8343, -307, -4650, 4434, -3366, 4602, -6454, +8725, -5704, 3324, -5036, 9604, -5596, -5615, 10195, -1537, -270, -8254, 7913, 2189, -6194, -3902, 7797, +-5874, 2206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, -10103, 13067, 2766, -11208, -1523, 14172, -6660, -1734, 2119, -12645, 24273, -16006, 8692, +-13497, 4458, 10114, -7788, 6624, -17207, 22465, -21622, 23721, -22314, 16364, -15287, 19019, -22205, 25071, -29187, +29194, -29187, 28472, -29187, 29194, -29187, 29194, -29187, 23210, -21408, 22181, -20198, 22527, -27194, 28531, -29187, +29194, -29187, 28417, -22150, 12786, -6045, -1235, 6520, -7035, 7870, -7132, 4023, -3641, 2448, 363, 3846, +-10849, 14026, -22101, 29194, -29187, 29194, -29187, 29194, -29187, 29194, -29187, 23476, -21102, 24821, -25388, 24121, +-29187, 29194, -29187, 29194, -29187, 29194, -26377, 26598, -26560, 16130, -13152, 19690, -16230, 8914, -13323, 16212, +-8035, 6350, -12175, 6359, 3126, 1400, -4539, -3961, 3110, 6292, -1899, -4837, -3220, 6674, 3022, -3350, +-3604, -3143, 10932, -2827, -1387, -6996, 4813, 5634, -1589, -3178, -7595, 10415, 1204, -474, -7227, -195, +5890, 4102, -6365, -3231, 743, 8475, -3860, -802, -8363, 10178, 757, 767, -9570, 2597, 3736, 5310, +-5181, -6234, 3480, 3673, 3572, -7020, -1923, 2288, 5093, -1571, -4215, -1868, 5634, 1377, -1250, -6583, +3475, 1971, 3709, -4148, -4891, 3462, 3451, 1178, -4375, -2848, 3240, 2799, 1430, -7906, 3837, -1233, +6287, -5413, -895, -603, 4129, 710, -3274, -1969, 1762, 2560, 1792, -6890, 3142, -2160, 7422, -6247, +1309, -3389, 4938, 592, -2718, -749, -277, 2983, 996, -4119, 873, -1005, 5621, -5299, 2614, -4507, +5378, -990, -837, -1516, 690, 1618, 226, -2013, 96, -195, 3351, -3677, 2056, -2709, 3279, -1204, +-352, -315, 211, 912, -762, 503, -1546, 1221, 1078, -1883, 970, -923, 829, 438, -600, -315, +-333, 1358, -1043, 1217, -1831, 435, 1587, -1763, 1165, -1223, 1367, -1481, 1817, -2143, 2239, -1760, +818, -832, 1560, -1363, 1155, -1990, 2024, -1468, 2399, -3606, 3082, -2655, 3872, -4245, 2994, -2995, +3596, -2102, 914, -2270, 2642, -1343, 2260, -3869, 2092, -655, 2555, -2995, 704, -527, 1694, -202, +-1311, -232, 1085, 776, -1615, 464, -523, 738, 1019, -1994, 597, -111, 1032, -581, -478, 78, +-255, 1945, -2169, 904, -1122, 1856, -1174, 784, -1372, 963, 150, -796, 1307, -1985, 1454, -451, +1162, -2381, 2123, -1728, 1786, -941, -588, 998, -711, 1027, -1052, 305, -368, 677, 385, -1216, +74, 657, 95, 300, -1715, 864, 690, 405, -1391, -215, 802, 58, 902, -2023, 414, 830, +149, -141, -1174, 753, 61, 942, -1113, -638, 726, 562, -92, -868, -209, 1152, -533, 517, +-1043, 298, 33, 798, -516, -809, 863, -301, 685, -831, -262, 902, -508, 435, -990, 1092, +-1110, 1501, -1676, 1501, -1835, 2178, -1462, 349, -417, 1238, -728, -392, 52, 93, 716, -41, +-1451, 544, 945, -517, 502, -1893, 1988, -1225, 1935, -3013, 2043, -390, 380, -590, -426, 349, +771, -413, -286, -895, 1853, -1458, 1583, -1841, 435, 825, -330, 47, -793, 512, 185, 405, +-460, -1441, 2375, -1431, 914, -470, -1181, 1700, -666, 737, -1713, 1222, -228, 116, 175, -1251, +1444, -447, -227, 346, -931, 1169, -662, 877, -1806, 1612, -931, 917, -862, 156, 55, 493, +-666, 340, -711, 1204, -816, 590, -1168, 1119, -611, 706, -874, 363, -140, 406, -321, -237, +622, -830, 1003, -949, 469, -144, 211, -147, -193, 103, -35, 422, -327, -411, 448, 129, +-378, 194, -237, 592, -564, 330, -755, 1034, -575, 314, -388, -220, 900, -618, 189, -487, +507, 38, -98, -179, -103, 527, -349, -49, 129, -297, 607, -419, 156, -506, 662, -193, +-4, -166, -92, 411, 2, -503, 507, -552, 609, -214, -94, -347, 706, -361, 385, -849, +395, 202, 425, -862, 24, 296, 257, -96, -222, -276, 267, 285, -72, -318, -15, 132, +231, 4, -460, 180, -31, 508, -417, -276, 344, -72, 279, -337, -267, 617, -373, 470, +-813, 597, -319, 508, -672, 483, -321, 257, -43, -188, 111, 285, -578, 466, -379, 405, +-207, 107, -354, 344, 6, -193, 202, -417, 702, -826, 720, -608, 647, -605, 382, -266, +13, 548, -662, 306, -245, 168, 242, -315, 106, -417, 672, -253, 25, -215, -154, 748, +-482, 13, -294, 332, 206, -232, -157, -1, 105, 397, -556, 257, -388, 532, -151, -31, +-123, -193, 627, -232, -185, -260, 450, 78, -81, -365, 156, 50, 622, -1019, 454, -243, +570, -304, 44, -631, 781, -75, 0, -401, 38, 228, 324, -309, -331, 212, 305, -193, +52, -289, 47, 541, -407, 153, -683, 1010, -613, 681, -1105, 689, -207, 569, -700, 362, +-532, 764, -470, 399, -666, 675, -533, 599, -489, 115, -29, 242, -145, -72, -41, 67, +286, -245, 29, -344, 609, -447, 681, -1028, 740, -465, 738, -745, 416, -444, 662, -479, +401, -750, 863, -521, 569, -672, 211, 98, 120, 96, -376, -195, 782, -603, 675, -970, +612, -203, 503, -464, -255, 569, -347, 477, -575, 175, 29, 206, 0, -543, 502, -258, +535, -535, 0, 116, 120, 318, -830, 655, -571, 840, -600, 237, -429, 613, -262, 236, +-700, 792, -672, 1015, -1175, 704, -353, 453, -223, -193, 84, 124, 96, 16, -493, 477, +-209, 308, -289, 63, -72, 159, 47, -131, -151, 308, -102, 129, -232, -115, 400, -185, +221, -512, 462, -283, 351, -305, 129, -111, 211, -141, 112, -193, 197, -133, 254, -315, +198, -176, 206, 95, -283, -31, 300, -253, 574, -947, 638, -202, 259, -161, -239, 279, +-75, 271, -396, 107, 10, 168, 55, -314, 57, 95, 235, -154, -245, 163, 93, 96, +-154, -111, 160, -20, 236, -386, 140, 25, 159, -106, -35, -135, 269, 78, -223, 93, +-159, 237, 67, -117, -135, 120, 47, 177, -227, -62, 63, 271, -141, -111, -29, 111, +166, -10, -470, 453, -166, 387, -465, 145, -92, 276, 24, -251, 61, 38, 120, 0, +-120, -16, 112, 136, -185, 30, -97, 340, -163, 4, -169, 241, -46, 163, -294, 153, +-55, 257, -222, 61, -63, 206, -97, -24, 67, -154, 395, -330, 198, -197, 231, -65, +0, 88, -236, 298, -161, 172, -176, 48, 126, -179, 372, -532, 512, -396, 377, -227, +33, 106, -245, 440, -344, 145, -72, 71, 149, -222, 177, -299, 462, -272, 153, -147, +-12, 305, -237, 163, -299, 382, -232, 257, -266, 13, 290, -241, 232, -301, 170, 74, +-24, 6, -168, 212, -20, 13, -21, -179, 346, -141, 78, -236, 202, -7, 101, -96, +-147, 248, -94, 130, -227, 204, -163, 276, -154, -81, 84, 24, 81, -169, 136, -145, +189, -20, -107, 86, -68, 129, -65, 21, -58, 103, 23, -86, 33, -21, 86, 38, +-141, 74, -12, 107, -59, -20, -52, 182, -48, -4, -123, 156, 33, -24, 10, -212, +372, -147, 57, -199, 212, -65, 153, -113, -144, 170, 96, -92, 4, -96, 156, 8, +23, -161, 90, 67, 16, -46, -65, 98, 29, 30, -59, -115, 242, -81, 74, -188, +132, 4, 72, -81, -48, 132, -69, 193, -333, 214, 4, 8, 0, -102, 120, -7, +88, -145, 68, 19, -1, 129, -222, 168, -55, 62, -24, -49, 68, 23, 38, -121, +111, -14, 4, 81, -154, 163, -103, 163, -150, 105, -48, 47, 38, -117, 178, -180, +246, -203, 136, -39, -39, 202, -294, 336, -243, 187, -103, -48, 252, -283, 380, -461, +385, -189, 120, -16, -125, 204, -103, 77, -72, 4, 163, -168, 216, -297, 271, -127, +107, -35, -117, 193, -113, 160, -178, 84, 21, 16, 38, -141, 149, -62, 124, -154, +88, -39, 120, -38, -135, 218, -195, 314, -331, 204, -130, 202, -77, -38, -20, 101, +-24, 62, -168, 185, -113, 187, -227, 134, -24, 86, -72, 14, -49, 98, 71, -159, +77, -46, 120, -29, -58, 16, 30, 78, -121, 55, -21, 52, 24, -62, 14, 4, +84, -77, 48, -63, 63, 44, -29, -29, 4, 33, 62, -62, 0, -5, 90, -33, +-7, 21, -49, 150, -127, 81, -107, 129, 10, -41, -12, -38, 189, -111, 63, -113, +81, 55, 4, -75, 8, 33, 105, -96, -21, 10, 112, -5, -65, -1, 16, 140, +-84, -65, 78, -20, 134, -141, 44, -33, 136, -46, -12, -39, 57, 47, -15, -33, +8, 25, 68, -84, 48, -33, 67, 33, -86, 58, -24, 95, -49, 10, 0, -12, +86, -49, 48, -69, 84, -41, 67, -29, 6, 10, -1, 33, -5, -29, 44, 2, +14, -10, -1, 44, -16, 33, -39, 29, 44, -29, 44, -87, 74, 33, -15, 16, +-65, 96, -49, 107, -121, 63, 14, -15, 81, -117, 107, -48, 63, -29, -35, 55, +6, 23, -21, -48, 120, -58, 78, -98, 68, -20, 58, -21, -39, 67, -29, 58, +-46, 4, 38, 16, -10, -15, 8, 38, -4, 13, -46, 38, 8, 6, 2, 8, +-21, 38, -15, 33, -52, 68, -52, 40, -14, 4, 4, 4, 21, -20, 6, 40, +-55, 84, -59, 29, -5, 42, -31, 47, -53, 63, -62, 96, -81, 74, -58, 63, +-15, 0, 6, 0, 44, -20, -1, 8, 4, 30, 4, -41, 52, -20, 33, -21, +-4, 42, -5, 6, -15, 14, 33, -21, 38, -72, 111, -59, 40, -15, 14, 4, +6, 4, 4, -10, 62, -68, 98, -111, 103, -52, 61, -29, -1, 30, 4, 33, +-46, 29, -4, 38, 13, -62, 38, 8, 24, -4, -16, 23, -5, 74, -79, 30, +4, 55, -24, 8, -52, 96, -4, 4, -43, 47, -7, 72, -77, 24, 4, 78, +-68, 48, -69, 120, -52, 33, -58, 55, 8, 13, -12, -24, 50, 16, 4, -31, +2, 77, -10, -33, 24, -12, 72, -39, 10, -10, 33, 16, -14, -10, 13, 30, +10, -62, 47, -5, 50, -41, 2, 4, 44, -5, 4, -24, 33, 4, 30, -29, +2, 13, 21, 0, -14, 8, 21, -1, 8, -21, 10, 30, 10, -15, -29, 47, +19, -4, 2, -39, 68, -21, 48, -94, 61, -21, 68, -55, 8, 4, 55, -39, +29, -48, 81, -39, 44, -89, 61, -14, 33, -7, -68, 68, -10, 33, -53, 25, +-14, 57, -29, -15, 4, 48, -24, 24, -72, 81, -29, 33, -65, 50, -24, 44, +-29, 16, -1, 16, -10, 13, -12, 24, -5, 6, -7, 21, 2, 4, -29, 24, +6, 4, 4, -7, 29, -14, 40, -53, 40, -20, 30, -14, 0, 4, 30, -7, +2, -16, 48, -20, 40, -75, 52, -4, 29, -33, 4, 8, 4, 33, -65, 40, +4, 10, 4, -48, 30, 10, 38, -52, 4, 23, 2, 58, -111, 72, -24, 67, +-33, -5, -5, 38, 33, -43, 4, 4, 33, 8, -38, 8, 13, 38, -29, 0, +-1, 48, 2, -12, -12, 14, 19, 13, -31, 8, 14, 21, -20, 16, -20, 57, +-24, 4, -5, 16, 0, 4, -16, 14, 0, 10, -14, 13, 2, 8, 4, -7, +13, 10, -4, 6, -4, 13, 4, 4, -7, 8, 8, 4, -4, 4, 4, 6, +4, 2, -7, 33, -15, 14, -14, 13, 8, -5, 10, -14, 30, -24, 38, -41, +33, -12, 16, -4, 2, 4, 13, 0, 6, -29, 38, -15, 16, -10, 0, 13, +4, -4, 4, -7, 25, -7, 13, -33, 33, -14, 14, -24, 33, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3726, 1034, +-1650, -2737, 529, -178, 10, 5674, 2002, -7940, 2610, 2896, 763, 4749, -2873, -4736, 753, 1424, +2923, -1241, -8882, 802, 4933, 4950, -3466, -3627, 3101, -2298, -3874, 8796, 10458, -10695, -4009, 5987, +-884, -1527, 6496, -6205, -93, 3125, 9169, -2512, -8026, 520, -875, -690, 5699, 1921, -3910, -4729, +-1899, -3638, 8055, 5371, -1533, -2730, -6305, 3345, 2129, -1738, 5633, -112, -9097, -1108, 8908, 1113, +-2872, 4017, 410, -3254, 5599, -2784, -335, 8106, 1104, -12183, -1989, 5704, -284, 3949, 931, -2419, +2063, -350, -5284, -2654, 4874, -1360, -2798, -893, -841, 1718, 2017, 932, 3748, 8840, -10588, -1403, +2242, -5673, -322, 8433, 1475, -8563, 2759, 5033, 844, -563, 3239, -7762, 1786, 6092, 1212, -8413, +-740, 4560, 74, -4854, 3482, -541, -1038, -777, -768, 1026, 3849, 3440, -1127, 1005, 3710, 602, +-7627, 1436, 512, -4989, -1843, 3111, 5987, 1453, 3855, -1931, -8955, 7371, -2548, 3243, 3750, -1230, +-5265, 4785, 1756, -5465, 4510, -6152, -825, 420, -4075, 4041, 3998, -10193, -327, 12339, 1818, -6709, +396, -1374, 482, 9708, -1840, -11057, -62, 9890, 694, -10364, 10119, 5660, -8610, 8382, 3426, -7975, +282, 3571, -2304, -5606, 2015, 2853, 6033, -2122, -2285, 2345, 3828, -6604, -16772, 9433, 11526, -13609, +-5470, 12306, 16702, 11002, -21256, -3549, -1306, -3011, 1353, 5869, 8380, -7738, -2645, 532, 11346, 14942, +-9402, -2435, -515, -2130, 12359, -2078, -23041, -14102, 5590, 14160, 8506, -2765, -691, 4815, -12240, -5697, +16853, 12381, -16823, -1534, 8587, -5101, -176, 5129, 480, 7013, -4816, -8178, -4111, -6108, 3183, 12834, +-1538, -8282, 14447, -8964, -3062, 10662, -348, -10273, 9055, 1850, -9406, 16549, -965, -9537, -12480, 9290, +720, -2023, 6493, -3023, -2993, -7924, 29129, -5808, -20748, 10643, 1377, 7247, -3001, 869, 1117, -3953, +-4773, 4870, 1550, -12075, -17050, 11920, 18629, -1345, -10440, 202, 13997, -2924, -10200, -190, 6276, 5966, +4506, 12, 4607, -8910, -9245, 6447, 7066, -11921, -5216, 12046, 2325, -8210, 6404, 8700, -8116, -11789, +5644, 23701, -24252, -10868, -3225, 19668, 14389, -11165, 2925, 2126, 2444, -8234, -3889, -10904, -13888, 27011, +19272, 823, -5978, -9999, 2275, -1228, -2303, 9242, -5159, -15906, 13255, 8557, -21831, 3474, 6833, -3614, +-8378, -6416, -17684, 28636, 15028, -6426, -15348, 11422, 9116, -14781, 16687, -4727, -8992, 11710, 1034, -8348, +-84, 3563, -19109, -16487, 8535, 16986, 22911, 840, -23178, -5924, 10847, -7608, 7871, 2951, -3080, 4693, +-634, -11399, -9286, 18789, 4266, -6381, -12820, 5379, 6125, -5721, -13817, 11276, 14574, 9304, -4224, -13334, +-2227, 2899, -14541, -5644, 5912, 6693, 7977, 11787, -202, -15096, -8387, 7114, 5639, 1728, -3792, -7916, +4996, -952, -10427, 8746, 5275, -5451, 6784, 9427, -9875, -14507, -4719, 16619, -860, -16130, 239, 18369, +5217, -12473, -2442, -2087, 1411, 2007, 1286, -7729, 2791, 3581, 10211, -7153, -2649, 5142, 12989, -2857, +-22849, -8239, 4032, -1184, -2334, 13225, 6714, 4662, -5063, -875, 2101, -2590, -11010, -3895, 4690, 8787, +-6952, -6981, 11106, 2041, -275, -2711, -3457, 10015, -2038, -10873, -3643, 11687, -14117, 8093, -2770, -6670, +277, 7528, 4329, -5149, -2984, 4336, -1450, 18, -110, -5315, 5161, -6779, -4539, 8101, -182, -3570, +1109, 6239, -2267, -11059, 1304, 8563, -9468, -5189, 10777, -7118, 7742, 3663, -9260, 6745, 9911, -12256, +-30, -5846, 3898, 3529, -4719, -1096, 4598, -8057, -8640, 902, 15859, 5016, -15950, -7307, 11419, 5898, +-3043, -1617, -4281, -836, -1331, 1785, 7512, 443, -3867, -3825, -171, -1491, 3237, -177, 2041, -6879, +-7708, 9887, 1582, -9580, -3570, 6037, 5764, -5817, -2173, 3182, 8122, -293, -6294, 463, 2223, 1458, +815, -1669, -2158, -3794, 623, 3758, -5508, -5570, 6239, 9349, -9590, -9459, 11768, 447, -8053, -1460, +1975, -1479, -3497, 10095, 390, -5266, -2499, 9065, -2529, -5388, -976, 4336, 385, -5175, 1466, 296, +555, -4326, -3031, 9063, -3531, -3997, -2534, -93, 2644, -4598, 2086, 8480, 5837, -7519, -4814, 3590, +-71, -3265, -6081, 383, 4639, -1471, -2271, 5126, 323, -5588, 3626, -1587, -1443, -604, 4539, 3227, +-3765, -6584, 5400, 12087, -6584, -5674, -3071, -5628, 2790, 7517, 8644, -8194, -10127, -6808, 6387, 6885, +-3912, -1641, 24913, -14888, -15867, 18270, -6561, -6871, 11419, -2579, 212, 2266, -3342, -6635, 2625, 5733, +5625, -14679, 5493, 10857, -6152, -3042, 2436, 737, -39, -9015, -1990, 17579, -904, -3071, -657, -7170, +-6022, 7233, 6927, -93, -4375, -6139, -5853, 7, 14665, 12652, -8389, -14374, 12146, 3850, -4451, 4201, +-2144, -7797, -5955, 1865, 7725, 2953, -1849, -9972, -5539, 10837, 16096, -4502, -7507, -8456, 7244, 8814, +-7099, -3604, 2742, 4736, 5318, -6406, -13923, 7680, 9087, -8874, 1094, 6790, -2732, -8661, 855, 6430, +653, 272, 1223, 2138, -4035, 6489, 207, -2997, 3639, -1401, -10395, -532, -3263, 658, 11903, 612, +-3185, 4220, 2847, -5921, -4050, -3628, 5295, 9165, -4191, 580, 6614, -3279, -603, -5003, 3236, -3822, +-476, 6218, 386, -2665, 1246, 868, 250, -8421, 1144, 5020, -350, -3554, 989, 351, 505, 4623, +-5038, -919, 2964, 6014, -1380, 2542, -3056, 5282, 558, -9371, -3536, 2020, 3101, -277, 1256, 2820, +-6824, 4114, 4778, -2192, -2373, -4387, -46, 5544, -54, -3352, 5328, 3769, 442, -5833, -4116, 464, +-5228, -784, 2030, 4902, -245, 1424, 5, -5111, 1558, 6460, -3799, 3860, 3826, -2416, -5694, -6148, +6264, 10803, 3140, -9236, -3341, 869, -3492, -1246, 3372, -735, -3560, -1714, -388, 3883, 7126, 3923, +4143, -1514, -929, 2728, -6121, -249, -3885, 2320, 8937, -12025, 4477, -2708, -4470, 7042, -1600, 2385, +3387, -6223, 5774, 3425, -7102, 6469, 2847, -1320, -5596, -1849, 4807, 1477, -10474, 2975, 640, -2101, +-1374, -2274, 6252, 2998, 3466, 383, -476, -10419, 3934, 1813, -9299, 10947, 2444, 1678, -1946, -3522, +2311, 3796, 2891, -5851, -4321, -5368, 21447, -5624, -5725, -6842, 1453, -721, 7568, -2652, -1171, 721, +5056, 684, -9571, 4237, -3098, 7512, 3980, -4370, 7439, -14805, 10287, -2043, 263, 501, 812, 5274, +-7478, -667, -7059, 3214, -2149, -2639, 4169, 1058, 2406, -633, -3764, 5202, -5650, 7709, 10541, -12766, +4625, -1358, -4409, 3214, -4404, 915, 6390, 3220, -2028, -3236, -7379, 6641, -1241, 4090, -4690, 3474, +621, -7250, 10311, -1606, -3135, 869, -1864, 5930, -9034, 5707, -6938, -463, 4288, 4725, -240, -5130, +393, 2794, 2613, 6767, -4428, -7814, -2668, 4055, 1999, -10389, 6774, 2728, -2376, 575, 740, 2521, +6179, -177, -2547, -5687, 2499, -2107, 3508, 2140, 4063, -7268, -2300, -1772, 2596, -6317, 5074, 4307, +3725, -8606, 3755, 9501, -9742, -15607, 325, 13119, 7753, -5982, -10967, 1789, 3166, 3552, -1320, -3759, +-1760, 5712, 8663, 2883, -3889, -6213, 15106, -9572, -2954, -16318, 12482, 12143, -8374, -9735, 5428, 6710, +5363, -221, 2750, -9130, 1024, -1457, 2041, -796, 563, 312, 3634, -2345, -754, -1331, 818, -1103, +-347, -2024, -3832, 3280, 4560, -1766, 5101, 1829, -12784, 1109, 3702, -2024, 3147, -3681, 6493, 744, +1991, -1500, -9246, 1416, -1804, 5699, 13258, -6792, -8994, -3781, -4087, 5966, 11875, -2799, 113, -1514, +-5974, 1229, 944, 1067, 926, -10016, 902, -4181, 607, 8147, -948, -11631, 12847, 9892, -11668, -2362, +12493, -4300, -10042, 14342, -3337, -2054, 6304, -10127, -1530, -2329, 7318, 3049, -6929, 7107, -9707, 3026, +9450, -8840, 5910, 2623, -13346, 1461, 5714, -4384, 1178, -487, -5446, 1721, -8413, 245, 2812, 6579, +1902, -1384, 9877, -20236, 9293, -2619, 3920, 6092, 5523, 558, -9808, -1971, 8979, -3135, -4427, -1689, +-1596, -704, -7221, 20832, -4908, -7408, -1319, 15524, 2090, -5796, 7017, -8393, -4535, -6806, 9284, 3345, +456, -6051, -995, -7056, -249, 9506, 826, -5742, -10573, 3937, 5442, -3338, -2614, 7317, 4899, -2416, +7735, 7430, -10811, -10371, 409, 3135, 2807, 5388, 3658, -255, 1242, -5820, -4641, -2184, -2107, 5644, +432, -806, 4887, -7365, -318, -1374, -8878, 1162, 5083, 609, 2991, -1889, -5400, 2180, 840, 6695, +1584, -8368, -1355, 3264, 3151, 5982, -1150, 866, -2189, 3098, 2901, -7696, 4453, -2527, -7070, -4684, +10577, 753, -4576, 4199, -1136, -9206, -3827, 2955, 5219, 8020, -2322, 2282, -6570, 459, -1854, -5054, +7144, 9858, 13357, -18101, -7465, 1372, 6258, 512, -9343, -7913, 8869, -1088, -2461, 6644, -11650, -152, +2190, 10076, -1394, -2182, 2953, 7499, -11881, -3240, 6171, -955, 11300, 1447, -6523, -6218, -1534, -10559, +-1962, 10469, 6252, -6627, 818, 1282, -3105, 7752, 3236, -3554, -141, -8331, -1606, -2681, 5691, 3227, +-4496, 5694, 1012, 331, 5033, -3904, -6498, 4883, 1072, -11572, 1753, 13149, -7025, -1040, 1932, -3532, +-4781, -3556, 9829, -5324, 784, 8223, -6113, -3666, 9768, 734, -2357, -6338, -1094, -5155, 4133, 3174, +3014, 2575, 2556, -5633, -4234, 1993, 2077, -985, 3934, -10309, 4612, -1174, -2284, 1975, 258, -1257, +-793, 4605, -54, 6691, -7346, -8713, 5139, 1767, 559, 1771, -4811, -2237, -1946, 11322, -1229, -4045, +3605, 4704, -2081, 2140, -7578, -5028, -958, 6144, 1959, -84, 1312, -2170, 151, -245, -3051, 4039, +3128, 1155, -369, -6498, -6537, 7434, 1230, -7195, -5124, 7536, -1752, -10083, 10879, 19460, -1582, -1995, +-5381, -5862, -934, 3875, -2702, -5305, -776, 6698, -366, 3439, 1737, 2955, -1693, -12972, -2193, 1883, +2155, 1821, -9676, 13527, 3083, -14635, 10865, 1712, -12236, 732, -327, 3028, 4612, -4158, -1345, 3269, +-13060, 8568, 4055, 2085, -2474, 4922, -4166, -681, 6096, 1539, -7108, 2817, -6091, 2182, -1587, 921, +-3483, 6469, 994, 597, -362, 4121, -5426, -7462, 5452, -25, 793, 1834, -1030, -3516, 807, 1083, +-3879, -2476, 8752, 4272, -4757, -7152, 4388, 2755, -7110, 5742, 5315, 1986, -6, -3574, -2756, -3074, +2618, -5144, -5146, 2683, 5682, 4477, -4996, 710, 9585, -3444, -1806, 1374, -10842, 9890, -3600, -7016, +-2914, 380, 8622, 5995, -5368, -6343, 7158, 1534, 427, 4198, -3360, -16676, 8360, 15130, -7769, -11678, +3920, -1045, 12857, 4964, -19904, -5272, 12085, -2416, -2368, 8479, -7714, -12972, 13731, 14046, -12599, -10934, +9857, 9252, -7092, -662, 1544, 1005, -7274, 893, 6939, 3496, -6023, 2920, 4874, -811, -10148, 1876, +185, 10430, -5491, -14208, 6114, 7206, -8491, 7457, 5609, -23405, 3958, 16475, -7971, -1584, 5983, 1258, +-7002, -628, -2100, 2664, 2852, -5465, 2504, 3547, -942, 20, 6207, 3394, -8265, -7850, 370, 4933, +-550, 428, -1283, 4817, 2483, -294, -2140, -1946, 3031, 4991, 2742, -7989, -7166, -457, 6298, 3725, +-9532, 813, 2071, -3530, 456, 1036, 1140, 1482, 3763, 2629, 1018, 859, 1215, -10175, -2799, 9661, +-5400, -555, -1151, 1994, 4850, -2809, -2305, -860, 4948, 2332, -49, 2653, -5607, -7008, -709, 1239, +-3987, 1339, 9319, 2143, -6011, -1412, 5829, -6358, -8348, -7216, -1249, -7362, 6453, 12420, 9026, 2450, +-1995, -9865, -5916, 12796, 13716, -4479, -4007, -9315, -892, 9444, 3004, -2565, -8427, 10414, 2669, -7874, +-12037, 5272, 10728, 2358, -1304, -14465, -5612, -2363, 2955, 9647, 2120, 4959, 2255, -4699, -3859, -14132, +-3284, 24456, 13535, -13066, -11194, 9947, 5953, -14660, -13580, 3736, 6317, 2742, 11724, -820, -19269, 11012, +13947, 989, -3797, 1472, 7270, 456, -21049, -3919, 12694, 6775, -6976, -8680, 7706, 18132, 115, -22901, +-4405, -5092, -603, 19878, -3695, -7622, 9192, 9698, 2828, -17158, -7732, 19586, 19419, -11259, -14796, 8855, +-6561, -20878, 9328, 20605, -14587, -11618, 1479, -3608, 9795, 15241, 405, 3071, -4703, -5784, 1220, 6344, +-1843, -4801, 9744, 5806, -5217, -5581, -201, -8275, -4097, 1789, 4228, 5233, -2088, 10642, 3975, -15382, +-5625, 1760, 10461, -3046, -8786, 3736, -22, 5617, 10603, -461, -3995, -3405, 708, -700, -5785, -10125, +359, 6382, -76, -55, 6652, 17414, 815, -14286, -10239, 4400, 8825, -2703, -6475, 3279, 594, -927, +572, 3120, 2637, -11839, -1703, 14952, 597, -8146, 555, -4089, -2727, -3420, 1791, 10483, -6370, 1264, +7150, -865, 928, -5272, 6691, 524, 2148, 83, -6492, -6604, 8920, 1891, -16759, 7099, 11995, 9695, +336, -5247, -15349, -7845, 12000, 10120, 3821, -10753, -12655, -1033, 3666, 1763, 12387, 7706, 1356, 3159, +-6952, 766, 1751, -7559, -8668, -2009, 7430, 1813, 4565, -2419, -3154, 7404, -773, -7568, -6841, 2117, +8661, 1975, -5663, 269, 11319, 2347, -7873, -2605, 921, -1767, 3512, 4723, -1786, -9134, 5110, 5864, +-4060, 320, 801, -16002, -17517, 10381, 25265, 6584, -15433, -1001, 11427, -312, 7422, 13909, -11612, -12265, +-14730, -8205, 11049, 11131, 17486, 9031, -19541, 3536, 4279, -4172, -4554, -7459, 810, 7604, 4067, 302, +-3565, -2831, 2597, 958, -225, -4594, -5032, -3151, -2676, 5218, 8452, 5329, -3958, -4130, -6124, 931, +9194, 4306, -14598, -1490, 11244, -555, -609, -3603, 917, 9984, 7362, -5324, -5832, -4734, 2502, 5515, +760, -4947, -5426, 7958, -6813, -5389, 14524, -5083, -7181, 9441, 10696, -12230, -15423, 5946, 10612, 1407, +1680, -3065, -1253, -6008, 2459, 8533, -5582, 1831, 2424, -5775, 2566, 9068, -2518, -2581, -3424, -3854, +-3008, 4814, 4909, -6470, 3331, 9887, -3589, -8602, 6063, 3500, -10587, -4349, -3, 3382, 1983, -8316, +4588, 13190, -5486, -4545, -1862, -2499, 13619, 1069, -5519, -7759, -2505, 10318, 2773, -9702, -11574, 20264, +-2252, -12508, 9810, -7274, 4160, 6867, -4965, 1836, -8, 14254, -15650, -6691, 626, 2556, -503, 1118, +4001, -4651, 5486, 6187, -342, -10573, 314, -367, 8314, -3885, -7675, 270, -497, 921, 8729, 10704, +-25406, -8257, 16910, 14674, -5069, -9719, -2592, -1927, -4918, 5122, 2305, 5441, -4911, 1178, -3049, 6795, +3623, -8495, -1942, 1990, -5573, -51, 7752, -2838, -549, -1113, 4298, 6501, -6677, -9324, 3506, 20575, +-20217, -6280, 11656, 760, -7903, 4678, 5315, -11402, -8421, 9422, 6555, -5108, 645, 11644, 2828, -9643, +923, 2167, -9029, -4681, 4633, -161, -2154, 8060, 102, -5607, -255, -2852, 7119, 2712, -4123, 2601, +-7118, 12238, 5780, -12712, -6062, 2259, -1166, 9300, -5449, -13909, -5107, 2217, 24283, 1704, 3403, -9265, +-11126, -1336, 2674, -1416, 4360, 1784, 561, 4436, 6755, -9334, -1689, -3536, 4393, 8687, 1659, -18887, +-12407, 12557, 8455, -11854, -3018, 1860, 3316, -2395, 3482, -704, -5043, 10188, 11208, -7507, -15714, 10909, +17275, -4966, -6836, 4161, 3487, -3738, -4507, -5576, -473, -3487, -3454, 2591, -7254, 5664, 13270, 4495, +-11466, -573, -2458, 4536, -2935, -5871, 4925, 10088, -1249, -7459, -5693, 5932, 6358, -8697, -3115, 7650, +-3151, -1779, 4804, 13140, -1931, -9280, -2744, -427, -2187, 6014, -2717, -4786, 9373, -9449, -8024, 5649, +2524, 4169, -4612, 1791, 44, 2440, 6593, -3867, 51, -12673, 7997, 6371, -5253, -7573, -7123, 9352, +16479, -3586, -12407, 5326, -599, -3224, 356, 7898, -9895, -16754, 11462, 10588, 6439, -3237, -7197, 6177, +10592, -8378, 1007, -514, -13375, 2434, 2618, -1990, 10115, 2002, -13036, -960, 7277, -4998, -5686, 7357, +10995, 2453, -10068, -1234, 3699, -1519, -439, -5519, 1794, 720, 4090, -8683, -5883, -1248, 8399, 7546, +-5010, -2311, 6114, 270, -9858, 658, 3765, 238, 4279, -1465, -1873, 1109, 3831, 437, 1385, -4276, +-8907, 514, 8700, -7299, -5678, 4885, -1082, 1421, 3744, 2663, 4347, -3090, -4233, 3258, 1447, 1094, +-1277, -5755, -4477, -9487, -250, 5898, 5810, 6770, -4385, -1125, 6984, -5718, -1622, 5153, -2630, 1918, +-3561, -6714, 9334, -5454, -6527, 14901, -5112, -10159, 9125, 3828, -554, -12464, 4499, 8246, -3371, 3219, +-4802, 3279, -299, -1253, 1598, -5401, 8113, -1960, -4312, -2358, 8438, 1624, -13792, -346, -178, 5544, +-3522, 6567, 2550, 2080, -3232, -1500, -4074, 5906, 2372, -1179, -2586, -2509, 4796, 2517, -7097, -303, +1656, 1690, -7121, -4772, 6898, -1689, -2694, 12143, 5738, -3119, -7420, -2492, 2337, -6952, -4300, 2174, +8488, 564, -1936, 488, -2534, -55, 1836, -2053, -2649, -2798, 9392, 4321, -11049, -4220, 2996, 6232, +7201, -5412, -6343, 1582, -390, 4804, -133, 791, 259, -2790, -12974, 113, 4045, -240, 3363, 9238, +-985, -6881, -3651, 3793, 5636, -3428, 1133, 1692, 309, -1322, -3265, 190, 7922, -1108, -3895, -2979, +493, 636, 5651, -3758, -9194, -381, 2099, 1482, 439, 2928, -3966, -1084, 543, 7806, 175, -971, +-3878, -7413, 2140, 5660, 532, -2170, 1464, -2628, -2213, 3363, -1562, -3104, 6142, -832, -1925, 715, +15, -1062, 5982, -3584, -3143, 2970, 599, -1674, -9009, 4009, 4321, 83, 2453, -141, -7302, -5678, +870, 4652, -6263, 782, 7528, -1190, -1966, 466, -2170, 3049, -1490, 7118, 1631, 1237, -992, -5111, +1340, 2158, -473, -919, -815, -3711, -376, 1178, 377, -4050, -230, 5969, 156, 783, 1739, -6957, +1791, 7049, -846, -2824, -4228, -1041, 4553, -11368, -1718, 6898, -4724, -1970, 5347, 2766, 1540, -464, +-3421, 1228, -206, 6250, -4710, -9451, 3720, 1755, -1399, -2328, 2436, 7832, 3690, -2784, 1263, -4606, +-2810, 5253, 5486, -6525, -5047, 15008, -6144, -11913, 9065, -209, 679, 4982, -4316, -12794, 1093, 9538, +3547, -4359, 2771, -7262, -9858, 5437, 14292, 1669, -3003, -2517, -1830, 764, -3232, -3357, 1915, 4169, +1001, 2194, -3924, -5781, 793, -1399, -3444, 10365, -8105, -7829, 4773, 19198, 5415, -18402, -4451, -408, +7328, 5522, -8421, 1675, 6133, 715, -7848, -606, 2198, 7734, -5451, 5437, 4891, -2436, -136, -942, +-1452, -10783, 5718, 6063, -4132, 502, -687, -9162, 810, 15251, -6188, -6522, 3071, 4581, 3329, 2450, +-2121, -2519, -7047, -3311, 4637, -1566, 3210, -6498, 3299, 6484, -442, -7567, 697, -355, 11568, 6833, +-9517, -444, -6096, 4875, 13570, -10905, -3575, -1117, -3111, 4080, -5828, -10548, 8157, 7606, -3541, 5771, +6488, -5108, -2, 12028, -13380, -4777, 5311, -8815, 7598, 1886, -2203, -7635, 12565, -7606, -9438, 9433, +12170, -11383, -6323, 4180, -50, 1171, 4220, -299, -695, 1878, 143, -4589, 1115, 8241, -423, -3381, +-6286, 5374, 6323, -6862, -11172, 2374, 10168, 769, -195, 4135, 223, -6767, -6556, 6322, -1535, -142, +13787, -584, -7694, 692, -9386, 1869, 16270, -11159, -12962, 13927, 1239, 4448, -7477, -9183, 9353, -4990, +593, -919, 8370, 2099, -4157, 1007, -13840, -646, 13033, 10396, -8283, -11130, 313, -275, -7151, 25165, +-1125, -17701, 14031, -7137, -5800, 6366, 1755, -3823, -8475, 10027, 13263, -14645, -5499, -1189, 6531, 10801, +-3558, -9987, 6628, 4287, -16523, 5961, 10619, -6702, 6331, -1403, -2605, -3129, -6608, 16546, -10682, -695, +2875, -7175, 6321, 6659, -5105, -4762, -2497, 2752, 1775, 1209, 5953, 1632, -14771, -3143, 14000, 582, +-5468, -3724, -1857, 2459, 10763, -3673, 56, 4313, -2162, -4710, 8161, -2230, -7060, 2136, 1945, -2611, +-11113, 3036, 6657, 3930, -3066, -2048, 2717, 1028, -3316, 839, -2693, 1304, 4607, -7289, -5354, 11685, +14452, -13802, -11227, 11052, 2140, -4484, 7942, 4799, -8073, -6348, 5040, 374, 331, -8716, 6678, 10350, +-19191, 4717, 7105, -7179, 12654, -793, -9015, 4080, 4318, -1460, 1525, 12182, -2162, -11445, 621, 744, +-9401, 2537, -943, 1610, -5146, 2340, 10503, -3076, -7488, 5016, -3492, 474, 10280, -2562, -6486, -3197, +7844, 4806, -2862, -5590, 182, 8879, -3440, -5803, 4439, -7373, -1160, 9787, -1208, -629, 4495, -8048, +2398, -858, -2665, 11736, -899, -6662, -3629, 8350, -9851, -2324, 8242, 1882, -7269, 9633, -7716, -2673, +-1998, 9346, 1634, -3865, -3061, 1605, 7282, -10148, -2349, 6087, 7264, -5828, -4627, 5502, 9887, -5735, +-501, 5376, -4911, -398, -4316, -2852, 7032, -6182, -346, 5277, -4627, -2119, 9833, -12915, 4412, 6804, +-4177, 6809, -7549, 3321, 2453, 8622, -2168, -1472, -612, -7002, -6590, 7912, 1178, -3482, -1632, 1424, +2841, -1035, 8559, -544, -10611, 6153, -3130, 6276, -1966, -3447, -550, 3390, 4715, -7916, 142, -4268, +11000, 10385, -13604, -1646, 4198, 3282, -8763, -3560, 5229, 396, -5838, 15698, 3369, -19955, 7357, 6304, +-6836, 8549, -5359, 2318, -6483, -4273, 3369, -11983, 15425, 16027, -23106, 7948, 12555, -17873, -1370, 4747, +559, -2662, -9929, 3791, 6995, -136, 12358, -2957, -11849, 9123, 8128, -14245, 70, 4296, -391, 3214, +-1989, -4297, -2265, 3525, -1695, -2420, 5384, 624, -5770, 167, 5114, 2383, 7541, -12037, -3967, 11595, +-6124, -12920, 8658, 9344, -965, 2061, 3014, -10879, -6259, 13832, 1525, -13460, -7979, 3180, 4203, -8238, +4482, 12473, -8417, 514, 10749, -3221, 5145, 5675, -9191, 1048, 5329, -4919, -7986, -3633, 9504, 4038, +-13101, 6884, 3496, 5090, -3660, -742, 3413, -9972, -2340, 651, 971, -2022, 713, -6029, 9116, 4306, +6118, 372, -6201, -3027, 5001, 851, -1854, -5416, -2107, 1332, 2259, 2458, -5588, -1088, 7844, -5494, +-1901, -1127, 451, -306, 4504, 6799, 4409, -1843, 1983, -2616, -5876, 3709, -2027, -8073, -3306, 10919, +3660, -245, -3192, -3098, 2005, 3425, -6280, -2253, 9131, 5412, -7698, -7299, 7390, 5226, -1505, -3211, +-10144, 4521, 10949, -530, -4540, -1254, 7274, -260, -7908, -142, 9552, 4725, -4885, -8412, 2759, 3685, +-4264, -9517, 4901, 7103, 248, -5777, -4069, 4107, 6092, 6453, -5466, -3379, 3448, -4393, -1887, 7116, +5131, -11649, -8097, 2529, -1233, 5517, 10551, 1913, -5271, -9338, -6617, 9487, 3948, -2053, 3387, -4307, +-10840, -2846, 3956, 27677, 11028, -14248, -8198, -4404, -2401, -1246, 7787, -1951, -13060, -1108, 4555, 6247, +-129, -8031, 11000, 7546, -12926, 2946, 13768, -4035, -6763, 1072, 5568, -6851, -9895, -1941, 9396, 5614, +-1673, -1443, 2818, -946, 4034, 3615, -7700, 548, -3095, -5721, 1882, -1881, -6808, 6460, 3536, 3599, +-3353, -1117, -234, 2734, 8058, 709, -4879, -1033, 2063, 2434, -4955, -8142, 1018, 2145, -3733, -10529, +7696, 14460, 1537, -4491, 1821, 1709, -6983, -9729, 1591, -4441, 4560, 10449, 5200, -4092, -629, 4412, +-4708, -6595, -5178, -146, -1346, -192, 4368, 6998, 5560, -3820, -1576, 3147, 3655, -6395, 2120, -5872, +-3303, 3901, 1193, 3408, -1356, -10071, -2223, 451, 2813, 2647, -4007, -6402, 8157, 7074, -5499, -4783, +4174, 7357, -5970, -11413, 11441, 6469, -5197, -4103, -1011, 7965, -5224, -10410, 7342, 10244, -1476, -18615, +14298, 1955, -5966, -10075, 583, 7294, -1516, -4400, -5756, 3483, 1086, 8655, -464, -2223, 4417, -7574, +-5843, 3880, -2911, 2986, 1978, -10817, -931, 3629, 4172, 413, 2613, -3221, 8360, 2383, -9401, -5687, +4718, 1699, 2686, -8687, 280, 7895, -783, -3343, 7107, 5604, -10219, -5552, 2920, 1248, -1438, -8272, +-3733, 10041, -514, -1122, -1858, 3998, -2230, -4103, 4988, 1993, -4880, 10006, 6380, -5270, 1821, -1573, +2306, -1717, -9732, -5846, 4851, -4186, 753, 3796, 1067, -4612, 4880, 3801, -5664, 561, 2717, 4560, +-8421, 10052, -802, -7313, -123, 10747, 2991, -14137, -6828, -4211, 1996, 2842, 1164, -4361, 510, 8995, +-4495, 5193, -1912, 2512, 8665, -3219, -4665, -4311, 1091, -1442, -11048, -927, 769, 2516, 2032, -4710, +3845, 2558, -1743, 910, 5372, 815, -2139, -3881, 1947, 3093, -2657, -2247, 5389, -1243, -3662, 272, +5163, -2492, -3735, 6188, -5125, -8132, 4298, 7968, -6402, -9707, 8098, 2198, 3056, -449, 7317, -11845, +-4398, 6817, 2190, 1151, 503, -3476, -1990, -544, 2285, 7499, -273, -10554, 8145, -4026, -4429, 2070, +-2092, 1198, 3219, -4831, -3793, -13522, 3188, 18574, 3326, -6740, 1081, 9475, -211, -4292, 2261, -8912, +2509, 3453, 398, 7172, -2911, -6074, -4788, -2713, -2427, -3735, -301, 6074, 4966, 4828, 810, -6686, +-2059, -249, 10634, -1141, -10125, 5573, 5033, 2475, -8479, -6074, 5456, -8, 3990, 9455, -10399, -10618, +-3391, 10861, -7465, -5345, 3857, -2392, 4227, 6445, 2798, 2512, -9469, -3392, -301, 6071, 1728, -2683, +1251, 1194, -3541, 5990, 1272, -1635, -7250, -4777, 5880, 2946, -551, -725, 1532, -3270, -2681, 8204, +951, -5063, 216, 2967, 3880, 78, 240, -7743, 3493, 3925, -2010, -3318, -4826, 7242, -2789, -2920, +-6375, 5531, 1350, -6675, 5093, 8646, -1920, -4084, 970, 1564, 3072, 1359, -8776, -5948, 6215, 3757, +-667, -7278, -3098, 4891, 949, 2275, -381, -2416, 12382, 4468, -12582, -4851, 3600, 1081, 7517, -1321, +-8741, -3738, -2208, -2102, 13922, -4249, -4588, 7376, -1975, -3250, 3125, -3183, -2555, -1185, -2727, 2658, +3972, -5985, 7187, 2785, -3265, 4347, -3554, -176, 8986, -5640, -8910, 4596, -56, -612, 973, 602, +422, 272, -2381, 1555, -4014, 5245, 3767, -569, 2072, -3336, -8378, 2548, 1162, -662, 3833, -5804, +2029, 2237, 3809, 6450, 3437, -4208, -5480, -365, 521, 4896, -2232, -3655, 3272, -3846, -11257, -7934, +9904, 9550, 1039, -4051, -4079, 14770, -2639, -12039, 2445, 2502, 1499, -2812, -2373, -5713, 9335, 6357, +-2437, -4627, -7497, 5623, 12303, 3055, -8980, -7045, 12897, 8137, -9584, -5246, 2412, -4509, -7084, 1571, +6452, -1835, 2393, 5798, 1191, -752, 1466, -5354, -6769, 3592, 1937, 890, -1130, -2534, -123, 2640, +-817, 1664, 1636, -8362, -471, 13241, 1718, -5777, -4214, 3534, 14247, -6855, -10850, -7160, 9944, 1629, +5733, -2460, -3817, 3502, 5150, -8354, 3243, 3336, -4797, -5279, 5597, 7563, -6378, -56, -539, -4495, +616, -4678, 6126, 1178, -4807, 5561, 4828, -7240, -2252, -55, -1811, 9116, 3886, -3279, -6181, -846, +-2067, 12339, 3821, -11704, -2531, 1401, 6344, 5001, -4205, -8343, 8207, -449, -8146, 4017, -3434, -275, +9102, -1160, -720, -933, -2274, 297, 6860, -128, -6227, 509, -5354, 10611, 10226, -19441, -7270, 8979, +2054, 4768, 2902, -13326, 7706, 7560, -3362, 7502, -11142, 3202, -4559, -2184, 11075, -6750, 2280, -4044, +16716, -5905, 3536, -2038, -9565, 10803, -1823, 8108, 4496, -11319, 875, -14918, 3379, 2958, -5927, 11868, +7909, 4810, -16698, -3284, 18855, 1655, 495, -15081, -3856, -7032, -3497, 7943, 17478, 13312, -7767, -4016, +17375, -3689, -29129, -12644, 17075, 28053, -1970, -13663, 3661, -4505, -3719, 3133, 9979, 739, -2078, -10438, +-3362, 7861, 3539, 3685, -512, -13148, -17774, 10643, 21317, 1678, -13418, -21514, 13346, 25935, 1144, -14050, +947, 13151, -7118, -2831, -3963, 5514, -3914, -8985, 2791, 6864, -1112, -4878, 6607, 3917, -4971, -3725, +-6974, -2154, 10282, 10173, -5308, -5059, 5743, 11471, -6454, -5251, 7103, -11936, -5222, 19930, -14242, -5397, +21581, 5917, -11429, -10429, -8746, 13066, 13654, -7616, -13216, -6651, 11661, 14671, -13754, 2706, 10987, -8803, +-2432, 17771, -3317, -5895, 6488, 10425, -13321, -18677, 1540, 13322, -1127, -2781, -6830, 4631, -95, -9353, +4088, 16286, 1166, -13522, 4215, 8014, -7758, -12419, 17362, 9868, -3384, 2145, -8345, -15287, 18300, 868, +-9475, 3920, -10137, 12436, 6531, -13249, 2831, 666, -2194, -2663, 4874, -6100, 3894, 16760, -12712, -5624, +12111, 597, -18823, 7013, 2309, 793, 10863, -10904, -12480, 15908, 8806, 5108, -12534, 2553, -3452, -6667, +6452, -128, -681, -14732, 7812, 10050, -2140, -7207, 729, 5295, 9387, -4378, -15566, 7622, 11000, -76, +-7666, -16564, 4637, 9871, -10561, -4427, 5847, -4859, 3483, 8641, 5767, -5455, -1491, -3355, 1138, 7160, +-11075, 7638, 2818, -7419, -546, 12505, 2689, -7574, -11417, 3964, -4046, -3187, 7220, 793, 5698, -4491, +-1069, 2618, 7019, -4295, -3109, 5872, -2916, -531, 9080, -5058, -8021, 2921, -6299, 3602, 642, -2327, +6512, -6281, -515, 2217, 5983, 5275, -16423, -5562, -187, 14051, 354, -269, -648, 655, -1222, -1603, +-837, -4373, 8706, 3757, 847, -965, -8840, -5900, -298, 13183, -827, -8086, 2012, -3841, 7734, -1079, +651, -3604, -5010, -4757, 4242, 2705, -5992, 4433, 6866, -3176, 2133, 1813, -2770, -6159, 3258, -2242, +-2596, 823, -4932, 1588, 11031, 3890, -14418, 233, 14492, -11569, 5295, -6072, -622, 8533, -2059, 109, +-7470, 8355, -3178, -10113, 4398, 8186, 5840, -7141, -4486, 4853, 2293, -12522, -2158, 7754, 4417, -13418, +-5039, 12510, 6290, 7866, -20792, 3869, 2237, -9202, 2532, -2366, -5112, 10435, 9227, -2527, -6367, 10687, +4931, -19599, -4492, 14293, 356, -311, -5473, 2209, -122, -2444, 5756, -9222, -5513, 10704, -2154, -5503, +7369, 1301, -1384, -2522, -667, -6459, 2921, -2173, 6041, -849, -6935, 3059, 2485, -3740, 2511, -314, +2948, -7124, -1680, 2844, 417, 4398, 2944, 3098, -735, -13017, 5566, 839, -3255, -1006, 2945, 404, +6132, 4856, -11845, -6468, 8409, 246, -2640, -7567, 2039, -428, -405, 4198, 4029, -2896, -9298, -2004, +10159, 9711, -20655, -12851, 7723, 11879, 9947, -579, -6052, 1431, 629, -6158, 8137, 9170, -5539, -8348, +-5546, 951, -5043, 6517, 6925, -619, -9410, -6202, 8736, 7560, -49, -6697, 2201, 4802, -1849, -3481, +2144, -2522, -7786, 11970, 7982, -20096, 7112, 13409, -25567, -1498, 15302, -1374, 4067, 11495, -17501, 2623, +9115, -2359, -18, -3721, -1896, -7087, 3488, 1637, 12866, 1618, -15129, 6407, 1117, 2504, -6221, 2310, +112, -7335, -284, 9112, 3299, -16840, -7671, -7894, 2334, 3298, 19322, 175, -16578, 7626, 10667, -2529, +-2954, 9931, 559, -7636, -9275, 117, 9734, 158, 3210, 348, -4564, -5528, 2902, 2618, -5854, 4263, +-701, -3619, 8901, 2334, -8175, 1485, -7713, -6328, 12555, 3408, -4627, 680, -8045, 1188, 3917, 7311, +4765, -3008, -11529, 4031, -6040, -9438, 10073, 6085, -3260, 1713, 955, -3329, -4297, -1009, 6431, 5431, +-5229, -1412, 10, 7395, -1157, -5570, -2276, 1697, -8917, -7254, 7960, 1409, 1636, -1950, 805, 1813, +-2442, -723, 8360, -457, -2681, 2712, -1571, -5136, 7512, 1902, -1970, -2041, -8409, -1131, 10085, 7195, +-4562, -11272, 294, 3920, 2242, -3462, 1031, -5777, 1739, 6958, -8238, -2793, 15144, 6795, -13972, -4696, +6812, -1069, -7682, 1539, 15834, 4320, -8876, -2774, -7898, -1028, 4610, 2563, 2144, 5747, -4602, -4245, +3821, -1936, 2591, 3064, -2128, 3484, 1636, -10535, -4597, -1283, 9463, 6736, -550, -9856, -8940, -6651, +11222, 11007, 2480, 10779, -275, -14810, -6017, 6545, -2003, -1936, 2047, 9004, -46, 739, -628, -13540, +-264, 10122, -2620, 4160, -157, -5019, 9703, -15499, 2563, 5576, 1164, 6452, -5722, -2829, -9774, -2208, +3037, 6799, 3080, 978, -429, 509, 5401, -7860, -6735, 2172, -6780, -1734, -584, 5387, 2936, 5696, +-3837, 926, 1077, 451, 2783, -6081, 800, 4717, -4368, 10369, 2563, -7958, -1576, -7414, -1384, 6425, +-9296, 4182, -703, 4148, 7179, 4424, -225, -1392, -3297, -10845, 10039, -2095, 93, 3677, -12842, 3836, +9173, -2718, 7118, 286, -9603, -142, -2130, 3521, -2999, 5180, 894, -2833, -957, -1639, -1050, -5247, +-4659, 10033, 13055, -2250, 1296, -4050, -2542, -9875, 634, 7918, 2334, 299, -5612, -655, 1398, -3148, +4456, -1786, -568, 509, -3185, 10125, 9246, 15, 2464, -11772, -6386, 6509, -4195, -7667, 3177, 3358, +2155, 4407, -5340, -8418, 12722, 5223, -6138, -634, 5687, -2970, -7424, 1178, -5552, -233, 3455, 7082, +2740, -7690, -4286, 5856, -2401, 1001, -388, -4874, 2112, 5175, -827, -260, 3425, 2596, 1845, -2243, +-5612, 175, 2148, -2487, 4088, 434, -6242, -6905, -3967, 4647, 5266, -461, -2605, -5286, 1104, 451, +6464, -343, -2992, 2086, 8888, 2464, -5800, -776, -4011, 4565, 2694, -7116, -260, 4191, -917, -1101, +8336, -11741, -7234, 14409, 2248, 1751, 5309, -19536, -6977, 8549, 14070, -898, -5237, 8976, -4137, -19446, +3844, 19959, -5775, -3159, 5960, -6462, 4487, 7911, -8980, -7021, 4227, -7175, -7556, 1361, 1685, -2489, +10168, 10280, -6053, -2791, 170, 7197, 2306, -12634, -14141, 4773, 17622, 1928, -9924, 5990, -2015, -14515, +10338, 5645, -4330, 359, -783, 2167, 2139, -3962, 2209, 2601, -6633, 609, 9168, 2836, 3304, -643, +-12296, -10550, -2589, 6464, 7874, -4674, -2892, 4507, 88, -4075, -863, -2212, -2419, 3425, 2498, 11021, +13589, -6749, -11806, -1718, 125, 11743, 343, -14137, -9740, 3849, 9571, -5243, -1776, 6769, 5707, -8519, +2202, 5733, -1617, 1639, -6858, 2005, 1923, -3849, -2824, -822, 7184, 847, -9669, 3261, -449, -565, +3496, -1976, -6709, 4802, 4999, 3340, -1292, -3439, 2204, -3385, -17470, 2620, 18297, -1704, -9202, 3621, +543, 1321, 4836, 5536, -4651, -4247, 350, 3783, 626, -6377, -1956, 2408, 2586, -3787, -7531, 7380, +634, -10755, 7393, 686, -265, 5114, -9008, -1285, 7807, -6410, -2073, 9404, 2117, -3093, -1465, -2954, +-2322, 6342, -4709, -2097, 6552, -4297, -3568, 1329, -4370, -3478, -3506, 2756, 7085, 1894, -1193, 534, +1954, -2494, -5565, -3341, 5156, -1519, 3295, -7598, -1528, 8675, 8546, 3523, -5485, -7792, -303, 5728, +-5843, 443, 6428, 2156, -239, -8893, -1489, -1259, 483, 4010, 826, -2911, -5722, -1719, 3558, 11058, +1477, -1568, -6740, -3008, -2436, -3182, 5522, 944, -2150, -723, -3768, -22, 4268, -4094, -3076, 3612, +4599, -4308, 3272, 5272, 3151, 495, -457, -6205, 2563, 1625, -7562, -3124, -282, -6381, 2172, 4380, +1713, 6509, 2347, 1180, -2286, -6270, -530, 2980, -958, -3997, 5901, -2401, -9041, -749, 973, -2173, +2873, 3760, 5888, 2604, -6119, -168, -3832, 1618, 3617, -3600, -4845, -5504, 5512, 4748, 524, -7795, +3901, 543, -3095, -4787, 4891, 5790, -131, -4021, 1256, 3404, -4998, 3855, -8684, 897, 4308, -1427, +551, 1055, -3062, 3823, 180, -1165, -3784, 2518, 1113, 604, -1165, 2112, -4940, -5378, 7211, -338, +-2553, -822, 4123, 9095, 83, -5338, 394, 2420, -4607, -10061, 1353, 86, 8603, 1852, -13327, -4282, +14844, 4993, 1147, 8986, -18690, -7573, 23556, -2311, -16968, -4344, 2296, -1656, 12862, 5287, -12275, 3232, +4101, -6639, 2353, 5183, -1753, -1130, 6475, -457, -9308, -1395, -4050, -3221, 5106, 944, -2692, -2461, +3626, 134, 6793, 1171, -1516, 2979, -4239, -3584, -1257, 3694, 5282, 5372, -13002, -10939, 11679, 3298, +-4216, 4858, -1931, -4399, 548, 8868, -8170, -917, 6659, -3270, 713, 1021, -3022, 2337, 637, 340, +4237, -2470, -2867, -4399, 8637, 8093, -7337, -10178, 7284, 3618, -6077, -3773, 8132, -1365, 2301, 6009, +-2965, -2388, 3935, -2836, -3513, 1167, 2757, -2358, 2969, -2203, -1176, -2034, 2017, 1039, -5871, 1151, +6672, 4822, -570, -9213, 3812, 2115, -6745, -4533, 3818, 3925, -3774, 8042, -376, -12093, 2112, 5583, +-903, 6130, 7844, -8820, -3147, 837, -4112, -2008, -1670, 4812, 3648, 2923, 2431, -5305, -1606, 6764, +-303, -7293, 5645, 6607, -5359, -2538, 1925, -1401, 4909, -1087, -3484, -2347, 2140, -1217, -4030, 1458, +1772, -3922, 3734, 4456, 875, 320, -820, 4931, -1597, -5121, 491, 2875, -2262, -1257, 1542, 5998, +-4472, -2442, 3340, 769, 2253, -2756, -2640, 961, -453, 1910, -1762, 1280, 13531, -4147, -9115, -1271, +-4501, 7912, 11495, 3552, -12542, 39, -5105, -246, 10835, 2410, -4250, -1204, 12555, -7481, -10064, 747, +6000, 3185, -15473, -7268, 20657, 8403, -14834, 7138, 9774, -8961, 3972, -3584, 370, 4199, -10010, 6237, +709, -3109, 4817, -15594, -6109, 19124, 12668, -13972, -2272, 9885, 1852, -5466, -7475, 3744, 1424, 3243, +5229, -8029, -2014, 507, -5650, 5180, 6412, -9894, 10537, -10083, 4945, 2383, -1142, -851, -2852, 6263, +-1974, -2465, 5803, -13400, 4206, 14865, -5905, -8567, 10403, -4539, 1645, 1962, 690, 3026, -1219, 2642, +3988, 66, -5621, -7127, -461, -5184, 839, 7098, 8714, 1700, 3934, -18702, -7727, 19872, 10052, -23687, +6110, 28702, -7713, -20676, -1523, 14274, 15791, -8994, -4457, -3211, -8721, 8055, -7651, 7133, 7977, -5982, +-15617, -7399, 11277, 19900, -16676, 5428, 3418, 1767, 5117, -5878, -1273, 11554, -2804, 864, -2865, -1802, +6421, -14481, 2101, -3299, 3767, 7923, -6021, 1044, 2980, -7632, -7398, 7666, 6979, -15112, 4656, 18508, +-7458, -3275, 4058, -8702, 69, 931, 3536, -1103, 3352, 2395, -11789, 2248, 9194, -1716, -4308, 1185, +2425, -2208, -22, 7936, -4467, -5455, 8747, -6646, 3770, 3012, 3944, -1733, -8010, -7824, 5169, 1544, +-5107, -6521, 17817, 7247, -6948, -10391, -873, -6967, 4804, 8311, 10311, 4771, -8001, -5643, 7405, 2212, +-5156, 7260, -2751, -9944, -4336, 6085, 10309, -2339, -1985, -2406, -8844, 4747, 12776, 904, -4252, -1019, +-2860, -568, 3972, -4651, -934, 6053, -2149, -2625, -841, -2552, -146, 4739, -4605, 3513, -1950, -3603, +-1709, 2256, 4347, 8226, -5382, -3638, -275, 575, -3546, 3828, -2609, 520, -6562, 1435, 5936, 4518, +3363, -10812, 5620, 139, -1870, 3875, -4001, 2017, -5343, -3560, 6644, -6116, -13505, 16751, 9501, -13607, +-854, 9150, -69, 1928, 951, 2067, 13261, -10251, 332, -4075, -4495, 40, 14625, -6497, -11338, -419, +1395, 4817, -5062, -1630, 1683, 4922, 1029, -2585, -2019, 1891, 4272, -1525, -1150, -3526, 3104, 3939, +-7196, -4680, 13114, 831, -9779, -4186, 1839, 12528, -2843, -7068, 2475, 3687, -9155, 1894, 10893, -5539, +-2909, 2880, 69, 3623, 5909, -20027, -5935, 7307, 9841, -4974, -2211, 6937, 3500, -3880, -2308, -7132, +-1852, 16081, 1213, -10957, -3497, -2628, 5893, -4325, -1249, 3272, -1363, -6270, -342, 13450, 1579, -1734, +-6969, 6474, 6709, 1220, -3610, -9004, -7722, 10696, -8111, 23224, -10580, -1453, -10584, -4375, 19973, -2324, +-7465, -550, -4884, 8292, 4082, 7430, 2245, -15801, -4573, -5234, 15000, 6188, -22241, 10817, -9564, 11398, +11858, -5100, 59, 617, -8994, 4534, 1804, -6506, 5518, 8845, -2165, -1069, -4078, 40, -419, -2824, +-8275, 4492, -1002, 1050, 3665, 6972, -1073, -5533, 679, -165, -2928, 9165, 3283, -1508, -4462, -13217, +2847, -3523, -2199, 21025, -1908, -10994, 16304, -822, -4514, -2293, -15233, 16995, -1300, -3976, 4655, -5576, +-4092, -687, 1356, -390, 1028, -4249, 7187, 5282, -10991, -588, -2538, -3579, 3629, 1247, 6223, 9792, +-3981, 5158, -12372, 666, 9038, -7074, -6575, 1571, 4879, 1259, -4176, -3867, -10099, 1288, 4448, 13914, +6653, -4210, -4587, -3830, -11996, 182, 2958, 7133, 14659, 8823, -14031, -2702, -13403, -679, 16290, 6795, +-14025, -8713, 4771, 12197, 6506, -14543, -13584, 13733, 2658, -3856, 4026, -6281, -15944, 21966, 9144, -10337, +-4363, 110, -1576, -1627, 9244, 6914, -3844, -10049, -10759, 5755, 16835, -4935, -16720, -187, 25900, 1789, +-18388, -8461, 18076, 2860, -11668, -183, 8374, 2075, -433, -11883, -6761, 6080, -8, -579, 10069, 364, +-3689, -6884, 6183, -595, -6969, 148, 2671, 6463, 3801, -15242, 686, 13752, 2773, -5582, -5315, -6401, +4909, -4502, 8034, 16590, -6273, -4757, 955, -2492, 2217, -1340, -1896, -8364, 10481, 3575, -11280, -2541, +6133, 231, -11569, 12645, -1020, 5490, -4981, -5100, -314, 7661, -9328, 331, 2407, -8, 4022, 2296, +-1874, -6556, -3434, 5095, 7173, -989, -1273, -7269, 8755, 667, -1668, -1828, -3011, 2077, -6971, -3542, +10173, 13689, -3093, -10568, -9318, 3580, 9936, -5262, -166, 1277, 2071, -3429, 2323, -3525, 4194, -6527, +15071, -6977, -5331, -371, -393, 10684, 592, -15331, 820, -435, 3062, 4834, -2482, -9853, 5074, 3055, +-1365, -352, 4525, 6132, -7732, -1903, 7415, -4014, -34, -1243, -3405, -758, 703, -3329, 655, 124, +-3366, 3111, 1962, -2206, 1766, 7723, -8881, -6332, 6707, 4671, -662, -4809, -1242, 2212, 3666, 7507, +-8351, -3874, 4203, -3667, 6396, -1573, -3483, 474, -789, -822, -1878, -3246, 864, 8414, -4384, 7785, +6453, -10105, -4592, 8055, 1004, -11194, -6113, 1298, 11341, -177, 913, -6716, 4045, 14201, -5989, -2017, +1486, -4186, 3409, -3138, -9130, -119, 6501, 6315, -2083, -4276, -7456, 461, 8488, -2600, 2169, 4610, +325, -2189, -8113, 73, -173, 2681, -6643, 196, 7141, -226, -327, 2036, -2270, 459, -1006, 6877, +-1253, -4451, -515, 1375, 2567, 521, 286, -1223, -6919, -2473, 4753, -3488, 6687, 1456, -4903, -6197, +7472, 4045, -4927, 2280, 5634, -4559, -4092, 4282, -1276, -3114, 2015, -6303, 986, 1794, 94, 6696, +2125, -8191, -2243, 3052, 4017, 3345, -2722, -2100, 3207, -5015, 142, -1819, -5670, 2219, 2736, -1049, +2982, 5776, 1799, -1772, -5638, -6372, -520, 11419, 3550, -5817, -2682, -2359, 6237, 9139, -7359, -2717, +2120, 383, -2547, -1939, 2574, 399, 1985, 1904, -3098, -2649, -4262, 8265, 3833, -1700, -4908, -1703, +-603, 531, -301, -2165, 1007, 175, 2005, 2269, -4200, -2295, 9566, -3636, -5325, -6027, -1590, 11004, +5507, -8891, -5371, 10933, -521, -1916, -3076, -2982, 8486, 1923, -8491, 2953, 1363, -5446, -1204, 2482, +469, -1709, 93, 776, 1572, 1078, 380, -15204, -8144, 8631, 13905, -1446, -12130, 16089, 10997, -8121, +-2432, 2417, -2377, -1384, 3352, -1521, -4408, -2347, -5456, 742, 2621, 4529, -5316, 383, 4748, 3253, +-80, -5582, -6638, -1843, 8282, 9577, -5937, -3711, 5752, 5872, -560, -7478, 2093, -2029, -11074, -1339, +4991, 9087, 1131, -7554, 6399, 117, -4365, -5420, 5195, 14490, -16145, -2487, 9061, -4165, 4431, -2949, +-560, 3534, -6077, -1839, -1408, 3340, 2655, -692, -3416, 1952, 10474, 2182, -574, -3249, -6823, -331, +2509, 325, 886, -1254, -10128, -3409, 10461, 6220, -1984, 5401, 3521, -3046, -13850, -7894, 5825, 9165, +640, -317, 4169, 4061, -3502, -9803, 2065, 7990, -3851, -1939, 2385, 1923, -5749, 1277, 4298, -2363, +6279, -1508, -7762, 1921, 4379, 3080, -2465, -4632, 4883, 2412, -10007, -496, 4809, 1658, 1902, 1033, +90, -4380, 4841, 2734, -14117, 4491, 9496, -1562, -5313, -4916, 6977, 7226, -5534, -996, -3862, -2815, +8866, 2631, -2735, -4117, 5534, -9993, -3351, 12703, 2412, -6761, 4602, 7768, -6376, -6498, 4400, -1571, +3566, 2960, -6084, 2434, 8506, -2592, -2065, 4945, -5827, -7349, 6906, -6241, -2602, 4119, 4574, -2066, +-9875, 6069, 8087, 1198, 772, -6889, -10486, -6081, 10482, 15543, 3583, -14452, -12087, 16876, 5295, -7506, +-4073, -1292, -793, -4491, 8176, 14190, -2111, -6114, -1428, 2158, -778, -2182, -2156, 1644, 1865, 1893, +3123, -8979, -6109, 3122, 1501, 183, 1777, 2786, 3385, 3328, -6884, -4167, 5247, 14082, 519, -12223, +-8467, 7754, -2359, -3200, 5720, 971, 4475, -936, -839, 505, -1077, 4526, -2151, -10123, -8218, 3453, +6208, 12330, -7787, -1911, 12993, -12284, -4026, 7604, -9159, 4002, 9339, -7042, 1487, 2660, -5173, 2063, +4376, -5883, 7539, -1823, 3920, -14171, 632, 5145, 1301, 566, 1263, -6079, -1587, -1498, 3510, -6237, +-1830, -2768, 16154, 1596, -7171, 3180, -3360, 3128, 13190, -2222, -10590, -5755, 7238, -1956, -6681, 805, +687, -4594, 3796, 5195, 3479, -2645, -2335, 1826, 4395, -1217, -6817, 4466, 4104, 2591, -7375, -10120, +-2461, 2125, 5245, 2773, 517, -7662, -3724, 3311, 7811, 183, 228, 1656, 2052, -10653, -3884, 3925, +7933, 1550, 2498, -3060, -10243, -2133, 5558, 1698, -9938, 13654, 2539, -8761, 4161, -23055, -8425, 13334, +12550, 10308, -1403, -15611, 6355, 6501, -4539, 12717, 1755, -18939, 5556, 16968, -11191, -14553, 4191, 15827, +-3488, -8019, -6405, 2637, 11608, -8142, -8281, -579, 2659, 1377, 19522, -5228, -12980, 2029, 2117, -8131, +3807, 7141, -2999, -1515, -3037, -2322, 850, -2930, 3428, 1201, -623, 136, -4063, 4660, -2657, 2936, +-4739, -3336, 7268, -2633, -4678, 13666, 769, -3889, -2408, -3586, -7745, 4515, 6987, -782, 2267, -1673, +1178, -614, -12048, -172, 7202, -4990, 5987, -2362, 3180, 3263, -5984, 6895, 463, -5479, 248, -7133, +-3237, 8457, 514, -15171, 398, 11089, 9511, -5517, -14921, 6822, 6506, 2179, -11057, -4854, 13780, 1285, +-9884, 54, 3210, 3566, -2242, 12339, 1999, -28518, 2271, 12271, -686, 8798, -4539, -6426, -934, -84, +-589, -1505, -293, 5577, -2867, -10836, 12519, -1195, 5917, -7481, -211, 23, 3590, 1315, -4851, 1246, +2618, -3992, -11887, 2831, 14554, -2739, -7399, 4606, 6168, -6041, 1540, 10847, -7157, -11031, -5116, 3285, +3115, 7458, -960, -14219, -676, 6768, 1883, -506, 6557, -3270, -230, -2718, 4434, -1186, -5594, 4739, +3225, -1292, -6896, -2296, -296, 6733, 383, 1350, -9662, 7069, -1006, -9546, 12863, -10505, -3478, 6009, +-4880, 340, 5360, 4787, -15061, 7211, 3806, -12492, 2070, 13140, 5117, -5708, -9939, 3350, 11361, -127, +-7292, -5932, 2542, 6441, -2775, -2133, -3103, 234, 7880, -13283, 5728, 11869, -18263, -2156, 14392, -2487, +-1595, -617, -1500, -3260, 5456, 375, -546, 526, 6337, 6111, -7593, -7129, -647, 3769, 0, -3360, +9315, -6806, -13211, 17323, -6957, -2366, -386, 1023, 4545, 18, 3680, -3060, -2046, 4964, 4216, -8107, +-801, -953, -1967, -2047, -9052, 8712, 3387, -3570, 1327, 8195, 4252, -9787, -1519, 5833, -7521, -6390, +5325, 3796, 5320, -6511, -4708, 4437, 4374, -3008, -6298, 6397, -4840, 6418, -4011, -11183, 19376, -7956, +-7399, 14547, -6334, -187, 2936, -10413, 1026, 4140, 8504, -3134, 876, 429, -3934, -1590, 1545, -4205, +-5193, -5339, 10515, 12785, 1041, -8998, -9270, 2739, 11844, -16420, 2725, 3685, -2358, 11354, -7197, -3909, +6696, 3594, -4447, 1055, -6635, 5995, 1728, -6389, 640, 323, 2347, -388, -2625, -5494, 8496, 4917, +-3505, 2852, -11675, -773, 11811, -4598, -5692, 2907, 5422, -11959, 4744, 11471, -459, -3127, -2130, 1419, +-3151, -1755, -509, 2023, -1248, -8175, 7796, 6712, -4040, 3930, -6072, -5350, 5214, -15587, -3816, 8547, +9368, 3474, 12681, -7132, -20084, 7790, 19998, -5994, -7722, -3143, 7909, 2318, -4598, -3560, 3510, 2250, +-8685, -10967, 14681, 15344, -8423, -12134, 7730, -2092, -6079, 9519, 12078, -6372, -15611, -22, 12482, 4221, +-5449, -4051, -9813, 17205, 4104, -19555, 9746, -438, -9659, 5556, 2075, 10260, -537, 4298, -870, -4287, +-7273, -5350, 3340, 9719, 1876, -8131, 1036, 629, -10332, 7742, 8299, -6145, -5558, 5042, 8900, -5746, +-8443, 1159, 3581, 7704, -6840, -2225, -6662, 2672, 13768, -5262, -1762, -3763, -9488, 14157, 12151, -7378, +-2390, -618, -7511, 7499, 9693, 6982, -11771, -5515, 2063, -2043, 1052, -879, -3908, 448, 2398, 2259, +8111, -9870, -1927, 1891, -1699, -4993, -3702, 15076, 5410, -11397, -2189, 3219, 3718, -4337, -7186, 7860, +-9459, 669, 25227, 5930, -16163, -9648, -5392, 6077, 3474, 2923, 1372, -100, 370, -8040, -2970, 1393, +10839, -4045, 5199, -6797, 75, -2189, 6531, -3678, -11708, 12781, 7247, -3377, -4112, 2934, 4345, 2644, +-8015, -468, -3754, -11437, 11530, 16944, 7289, -13237, -7850, -4080, 5698, 12243, 7206, -15663, -13157, 7860, +5241, 7221, 8971, 3272, -14190, -3808, 3077, -3109, -7326, 1831, 5742, 4269, 1193, 411, -815, -12493, +1329, 5531, -2267, -6716, -2843, 13440, 1898, -1949, -301, -3684, 3828, 5339, -2241, -3476, 6341, 383, +-6518, -6594, -8062, -3025, 16730, 11307, -16167, -268, 8547, 2245, 3725, -5485, -8257, -3348, -2095, 6523, +10268, 3779, -10165, 12366, -4049, -2576, -4887, -7000, 8577, 7511, -11017, -260, 5874, 185, -4031, -8034, +-5500, 5136, 11821, -5130, 1988, -2180, 4031, -2047, 1136, -3618, 5292, 4083, -6939, 1790, 3283, 2983, +-2479, -1172, -211, 2150, 2358, 5228, -1854, -3158, -461, -6003, 299, -8513, -2271, -2511, -1436, 655, +12109, 15083, -6620, -4097, -1341, 369, 1728, -7386, -5824, 14620, 9596, -3435, -8459, -9362, -1217, 18931, +4090, -10212, -5682, 4227, 2728, -2888, -965, 7276, -9503, -16748, 4882, 19983, -12237, -2494, 12138, 1509, +372, -9028, -2509, 18253, 531, -14452, 4502, 14124, -6232, -7608, 1567, -2538, -6575, -646, -2892, 10081, +2634, -337, -4809, -2262, 623, 4371, 3833, -787, 621, -850, -5867, 4329, 5818, 478, -4985, -6072, +5295, -2665, -6934, 6607, 1491, -284, -5241, 3379, 3947, -2192, 4610, 791, -7929, -733, 7350, 1290, +-1023, -4136, -919, 7526, -11904, -2885, 5712, 8157, 3025, -2659, -6226, -6280, 4279, 3472, 5365, -5485, +-2687, 1921, 8528, 7238, -14269, -8631, 1975, 4674, 11865, -2974, -6686, -22, 539, 9514, 201, -15929, +-10054, -2144, 7296, 15032, 13270, -8404, -7234, -4719, -2799, -3384, 8845, 13983, -17, 4109, -7670, -1833, +-5798, -8092, -3653, 3317, 13520, 7374, -4455, -6389, -4947, 1569, 11242, -5664, -4573, 8414, -612, 6177, +-8320, -20573, 16741, 21159, -12955, -11834, -4181, 3983, 9397, -6654, -5213, -8, 1291, 8868, -7507, -4278, +15519, 8438, -22349, -5583, 17938, -323, -5029, 8212, 3952, -3551, -1665, -13804, -1233, 11028, -3763, 9279, +8525, -5808, -5373, 2931, 4056, -9322, -10080, 1624, 10847, 469, -9870, 999, -1995, 8480, -3520, 9387, +-12230, 823, -4355, 6649, 364, -6086, 1205, 6036, -812, -68, 347, 6555, 1064, -15008, -8845, 11239, +3930, 3991, -8475, 6201, -6339, 6493, 5263, -15752, -11248, 27437, 13011, -18577, -12956, 13374, 4623, -12010, +3763, -2619, -502, 1853, 2296, 4523, -4410, -11780, 8743, 8333, -7436, 2442, 380, -6969, 3080, -5532, +2637, 3712, -2765, -4543, 783, -989, 5491, -7375, 3956, 2107, 5823, -6804, -611, 8122, 220, -7002, +763, -7854, 2466, 8884, -5345, -11812, 8011, 2592, -1596, 6249, -2873, 5980, -4751, -4599, -3962, -8289, +6468, 11399, -4422, -395, -3224, 574, 6126, -2897, 4574, -374, -1970, 134, 5315, -749, -7016, 73, +-3830, 4455, -2713, 245, 789, -4642, 3786, -154, -3958, 3802, 4015, 514, -7386, -4868, 4868, 17473, +-3662, -8552, -5163, 2198, 1169, 4893, -136, -6813, -34, 7657, 2885, -13198, -2896, 10837, -5635, 1659, +-947, -1571, -10099, 3660, 9611, 577, 4584, -7593, -244, 2786, 4315, -3011, 690, -7184, -6555, 1205, +6225, 3207, -3971, -2590, -5578, -806, 8277, 4325, 4199, 7153, 1293, -3284, -4397, -5596, -5832, 6644, +2688, -10005, 5153, 4717, -4911, -2881, 3523, 2448, 2429, 6858, -9959, -614, -5276, 937, 6928, 170, +-4617, -981, 3760, -1427, -4215, 5412, 1235, -6200, 3694, -3535, 4856, -3134, -2017, 5568, 2013, -6226, +8900, 11931, -1927, -9279, -2770, 3607, -2170, -7860, -2658, 4460, -2334, 3930, 5783, -1264, -341, -4904, +-2231, 4891, -579, -2151, 1600, 8578, -4545, -6169, -2776, 9347, -1021, 2110, -4698, -3750, 6709, 2209, +-2104, 3260, -6407, 1329, 4452, 5835, 364, 2466, 3856, -13458, -4354, -5631, -2034, 6836, 9157, -16131, +-6108, 9987, -3390, -5824, 11015, 3115, 1523, 1647, 1130, 3493, -1467, -3778, 6690, -5725, -3124, 8082, +-6492, -6764, 7422, -2053, -2358, 3333, 422, -1217, 4972, -3017, 5004, 4218, -1993, -3738, -726, -5003, +413, 3779, -1906, -1743, 2209, -3251, -2363, 4039, -2722, 1218, 4041, 2025, 2912, 543, -6457, -657, +-1147, -3128, 8641, 2964, -2907, 2818, -2193, -10335, 4131, 3323, -6855, 4829, -801, 1302, 4666, -9672, +1109, 11341, 4964, -6617, 3062, 7657, -8645, -11664, 902, 9223, 4252, -10696, 1033, 2847, -9034, 8973, +456, 1132, 2684, -7868, -2366, 8517, -2122, -4007, -4030, -1658, 6906, 7402, -2383, -7465, -5246, 8980, +5449, -6270, 5893, -5716, -7414, 13910, 5095, -13500, 9804, 4363, -11791, 13360, -11418, -9551, 10690, 21, +9911, 3867, -17550, -10476, 11409, 7277, -4479, 11150, -4448, -13403, 3151, 19089, -13944, -6860, 9952, -8432, +4728, 5880, -16594, 5977, 5387, -2790, 1424, 12871, -13975, 4164, 20835, -15455, -7593, 3869, -4442, -6667, +10265, 5762, -11408, -6430, 7088, 7163, -6266, 5025, -138, -9548, 9455, -4321, 258, -966, 3367, 7747, +-9540, -4281, 7011, 536, 160, 5001, 3072, -10025, -4172, -1838, 330, -1714, -313, 1750, 5328, 4284, +-4305, -7696, 2877, 7660, 4010, -4268, -4830, 5010, -119, -6037, -6334, -2201, 6950, 7654, 6058, -11033, +-6430, 5150, 1659, 2637, -8782, -2605, 12784, 1558, -12202, -3511, 5737, 4342, -4696, -7863, 8995, 1801, +-14696, 2813, 13019, -8432, 1435, 6382, -6171, 1974, -3489, -4617, 3090, 4759, 2512, 807, -5867, 2339, +-3362, -3201, 406, 8101, -8094, 2143, 5107, 3047, 2941, 1205, -11418, -223, 4734, -3239, -3995, -1767, +-1006, 2521, -1869, 3637, -497, -1571, 3564, 3623, -303, -3629, -3168, 4433, 3360, -588, 386, -5345, +307, 1836, -7608, 3206, 4112, 1583, 2763, 4972, -1727, -7273, -3827, 4680, -187, -4930, 1636, -4263, +8670, 7831, -11838, -2737, 5704, -5751, 2750, 296, -1767, -1979, -1529, 14622, -3603, -16120, 7403, 7907, +-9591, 7703, 9703, -14232, 876, 842, -914, 9868, -6853, -6595, 2356, 7903, -4336, -2843, -1484, -569, +7834, -3452, -5265, 7972, 588, -4681, 1147, 3001, -11317, 5241, 11296, -546, -12710, 3707, 7306, -10830, +170, 17958, -7677, -2882, 1432, -5315, 1744, 182, -1403, -2397, -2712, 921, -1665, 7071, -7734, 3707, +2185, -1854, 5945, 1464, -6221, -1908, 2052, 422, -4651, -5586, 2448, 1799, 2705, 3491, -11508, -4632, +13336, -2921, -5444, 2866, 759, 70, 8864, -5, 377, 2421, 844, -6334, -8602, 1651, -1074, -46, +5471, 309, -4743, 9454, -8141, -2662, 2545, -4373, 7603, 2993, -7835, -2974, 2167, 6541, 928, -10224, +8103, 5709, -12558, 1486, 9150, -6821, 102, -990, -539, 4436, 537, -4719, -5517, 4961, 3106, -3539, +-1801, 3623, 7325, -3211, 2344, -2441, -1500, -1520, 3736, 3139, -1698, -4951, 1115, 6801, -6968, -5571, +-260, 1312, 2991, 3891, -341, -241, 2542, -551, 1417, -2146, -3187, -298, 166, -1435, -5051, 4374, +2120, -2284, -1356, -2077, 2058, -1006, -166, 6116, 1235, -876, 740, -1757, 3045, 802, -3709, 2747, +-2833, -1350, 815, -2581, -2916, 4882, -1292, -2330, 953, -660, 4150, 680, -992, -2786, 3729, 2410, +-6375, 2453, 3609, -9168, -3651, -2232, -2414, -2143, 1852, 7231, 7453, -1436, -8794, -206, 7478, -1568, +1786, -3958, 829, -192, 1910, 2015, -3287, 3206, -138, -3203, 291, 437, 1904, -4816, -4124, -875, +-2500, 4306, 9121, 1932, -6806, -551, 7662, 4479, -2851, -5402, -3638, 4930, 3579, -8902, -4732, -2857, +-3775, 3857, -258, -759, 7783, 5266, -955, 1091, 859, -355, -3997, -2671, -815, 5156, 1974, -2522, +-1525, -4993, 1409, 4203, 3753, -2320, -2300, 5859, 5090, -18740, -4971, 17526, 14524, -4465, -5253, -6940, +1364, 1039, -1335, 1818, 13665, -4521, -9794, 383, 1437, -1157, -536, -4486, 393, 8108, 1286, -6018, +-1661, 2710, -2882, 3787, -2610, -2005, 5400, 70, -6837, 1232, 7184, -2111, -4119, 6179, -3544, 446, +6879, 146, -2177, -3304, -8472, 4482, 2907, 4416, 555, -9988, 2591, 4321, -4524, 204, -2909, -4005, +692, 7704, 5675, 458, -4538, -4172, -2649, 4239, 7795, -2749, -2276, -6905, -2015, -190, 5895, 14739, +8693, -13409, -14253, -8905, 14263, 10244, -4887, 1256, -2901, -7409, 4077, 7568, 985, -7488, 12222, 3363, +-15034, -12179, 10046, 5365, -7443, 4095, 6557, -3549, -4535, 251, 2091, 3714, 1361, 388, -2914, -624, +6163, 15297, -18916, -19216, 10754, 29424, -29378, 4153, 9955, -4152, -3105, -563, 1993, 1198, 5258, -4240, +-3495, 7706, -12907, -7078, 23226, 2812, -14258, -6232, 3277, -2231, 6682, 1075, 10763, -8741, -7981, -2470, +-10274, 7982, 9654, -10579, -3762, 14404, 10554, -11526, -5582, 9165, 621, 529, 8887, -1576, -16550, 6018, +4287, -2052, -6367, -3108, 4072, -3633, -442, 75, 5274, 850, -1103, -6591, -744, 4937, -4030, 428, +2689, -2798, -68, -4809, 12193, 5406, -4492, -1039, 2309, -8307, -6449, 3500, 4607, -1747, 7477, -7316, +-5494, 8719, 7511, -11980, -5150, 9085, -3874, -6604, 6329, 342, -822, 4977, -4455, -606, 4717, 800, +-991, -1549, 5920, -13201, 3159, 14781, -3859, -16239, -5222, 7690, 4589, -10134, 1445, 1566, 6633, -3055, +-676, 4112, -173, 3513, 876, -9687, -10832, 11583, 8907, -2518, -6959, -627, -5524, -6542, 5709, 15025, +2067, -19938, 8411, 7306, -8607, 4227, 4148, 1705, -5989, -5892, 6326, 958, 1726, -8359, 286, -8850, +-7311, 2090, 17903, 4615, -14219, -3216, 15534, 826, -6847, 874, -2609, 653, -3652, 8355, 4758, -9799, +3850, 6312, -13129, -4065, 9634, 2442, -763, 932, -9480, -7783, 14419, -3995, -7157, 6271, -1685, 5568, +5646, -1554, 177, -6586, -7118, 3466, 1278, 6739, -1379, -2673, 2511, -1268, -4807, 6830, -312, 2225, +-3386, 874, -1573, 655, 2090, -110, -1946, -6575, 3306, 3959, -5659, 4206, -5644, -3584, 10430, 1018, +-7703, -6011, 10758, 1395, 2524, -5222, 8792, -4473, -5682, 14913, -2424, -13981, -10045, 8084, 9658, 1380, +-1766, -1438, 10003, 1786, -12820, 8771, -1826, -5233, 629, -1204, -820, -453, 1687, 3090, 13251, -4597, +-15820, -6339, 5804, 6523, 161, 611, -708, -5194, 5514, 2833, 4279, 3085, -1493, -5839, -1573, -3563, +4947, 3680, -3689, -3922, 5377, 312, -4339, -3079, -365, -1384, -584, -1584, 5636, 3463, -6879, 3610, +1094, 1910, 3750, -3177, 3139, -239, -12020, -4838, 5476, 1878, 2334, 8375, -2969, -7322, 415, 989, +-105, 1067, -4325, -3657, 3723, 1033, -1651, -2737, 526, -181, 22, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2356, -4010, -871, 10434, +-6949, -11180, 10403, -2676, 2451, 2004, -18127, 28087, -18190, 13425, -1330, 250, 4170, -14203, 18824, -9552, +19498, -26193, 16761, -12870, 22711, -11566, -16876, 20522, 265, -5127, -7530, 10085, 6067, -14147, 7265, -16290, +12173, -13675, -8364, 21505, -17401, 12212, -18655, 20345, -7197, -4962, -8343, 16260, 6223, -20918, 10380, -7893, +18799, -11201, -720, 7396, -171, 10071, -24315, 27768, -11011, 2054, -7447, 17512, -2626, -11807, 14400, -12871, +21388, -8112, -8868, 692, 20011, -16882, 5849, -8296, 14748, -1493, -17622, 14768, -5204, -348, -12295, 9637, +10040, -14709, 5776, -7495, 13295, -15517, -2469, 8699, -2214, 7651, -19187, 16947, -11718, 19081, -25924, -2374, +11938, -4797, 740, -12715, 23949, -15108, 13961, -12595, 9058, 5111, -7092, 197, 2587, 10600, -11353, 260, +657, 15349, -13425, -8693, 16872, -318, 183, -19620, 15864, 4408, -8402, -18, -12721, 26715, -20774, 11108, +-8772, 4670, 22, -7299, 5301, -6095, 9712, -13953, 1717, 15247, -7716, -13682, 3507, 24691, -25900, 18296, +-23578, 25028, -7667, -5993, -120, 7778, 5161, -11627, 359, 9320, 4193, -8590, -5494, 18010, -12894, 4907, +-9710, 16160, -6848, -7060, -1867, 11029, 8530, -23838, 3122, 3769, 21752, -31954, 10201, -4162, 9459, -7046, +-7492, 6479, 2421, -2077, -10333, 10516, 5617, -10773, -6607, 6648, 21994, -26255, 2601, 6681, 11006, -5990, +-15825, 12358, 9188, -1529, -17921, 6904, 17342, -10764, 1072, -14487, 24220, -13959, 4477, -2169, 6086, 302, +-10937, 11526, -3221, 2674, -11607, -1918, 19180, -12270, -1374, -10345, 21016, -17879, 5761, -7347, 3041, 6483, +-11072, 3658, -446, 12523, -24321, 20708, -9138, 3905, -3101, -259, 10291, -2490, -8262, -1918, 18451, -5287, +-13547, 5187, 8713, 7764, -16453, 6045, -4748, 12504, -4344, -10713, 5291, 10074, -11229, -3309, 13463, -4945, +-7298, -2251, 3704, 8243, -14337, 5107, -5190, 13963, -6362, -12352, 10967, 3498, -1980, -14064, 17328, -8539, +11540, -15537, 5300, 2899, -5917, 10472, -16638, 12376, -972, -4068, 4793, 1123, -1596, -6164, 10180, -2121, +1024, -1278, -7468, 13832, -6785, 10040, -23148, 14302, 2125, -991, -11349, 11593, -5059, -570, 6780, -12368, +14019, -13463, 6894, -223, 1926, -3270, -1574, 5272, 2120, -8118, 343, 5958, 995, -5842, -5790, 11463, +1355, -4394, -4752, 1908, 7168, -4074, -3638, 5392, 404, -4128, 125, 4021, 119, -6168, -1162, -1966, +11883, -6677, -6006, 2301, 7927, -3862, -4569, -469, 2735, 10100, -15969, 3910, 8195, 963, -859, -11411, +14383, -4583, 3867, -7913, 14917, -11540, 1597, 1826, 3500, -137, -10012, 398, 11196, 110, -7637, -10222, +19194, -3939, -5248, -2895, 4152, -3270, 5902, -10812, 682, 16565, -22841, 6164, -1593, 13595, -17409, 2592, +6731, 648, -2858, -7718, 9474, 5847, -5102, -9943, 8559, 13288, -8672, -8646, 3143, 14329, -7187, -2809, +-3321, 11364, -5631, 1969, -1421, 3905, 293, -7012, 3209, 9656, -4201, -8074, -3153, 19116, -11174, -7674, +705, 7754, 569, -13468, 5154, -3958, 14611, -20994, 7837, -2130, 6221, -4496, -6958, 11649, -7865, 2664, +-1375, 7868, -4141, -5067, 4331, 7102, 343, -5426, -4355, 9269, 7029, -11465, -427, 10085, -2518, 3086, +-8966, 8970, 1732, -8568, 2993, 2445, 5616, -12420, 4318, -2155, 11224, -16242, -1762, 10201, -1437, -6540, +-7189, 11902, 4295, -12029, -5224, 8010, -2175, 8557, -13046, 1850, 4394, 2187, -4161, -2938, 8252, -5520, +-2812, 7054, 4460, -4853, -4161, 4776, 5815, 590, -6273, -572, 8795, 1809, -5654, 3093, -699, 7773, +-17126, 11631, -1058, 279, -3898, 1102, 1820, -3229, 4291, -7058, 4123, -4295, 3850, -7234, 11063, -4873, +-5849, -2659, 10501, -3782, -4564, -4065, 5038, 2693, 2836, -8495, 2563, -13, 5378, -9320, 10631, -3299, +-919, -251, 7376, 2014, -8306, 3893, -400, 5447, -1666, -6961, 6537, 4015, -2163, -6914, 2359, 9575, +-7342, -4776, 1508, 9067, -3375, -6463, 5457, -2514, -182, -737, -5551, 11237, -6816, -8258, 4020, 8572, +-1345, -15160, 2863, 11694, -6794, 735, -8547, 10539, 1989, -4258, -5534, 6812, 6351, -6801, -7375, 13702, +2280, -4297, -7609, 11233, 131, -4757, -1882, 9373, -4261, 609, -8866, 15774, -493, -5743, -9644, 6162, +13958, -10282, -8659, 4565, 8941, -8389, 354, -2824, 3697, -3419, -4913, 5625, 1960, -2788, -7851, 162, +13447, -8461, -8624, 6486, 4336, -2522, -3234, -587, 11120, -7351, -1025, -7262, 20045, -12078, 616, -2198, +10095, 147, -8237, 6017, 3464, -2300, -5425, 7253, 4099, -1070, -11942, 8435, 4286, 2579, -9982, -8312, +17621, -1254, -12852, 76, 7531, 1734, -15581, 9666, -5611, 9480, -12455, 1172, 3647, 1752, -3337, -8378, +8857, 6632, -15935, 2660, 9640, -107, -9192, -721, 7333, 6198, -8220, -1151, -1128, 13425, -3484, -7065, +5706, 2068, 4002, -10967, 14267, -4602, 583, -4778, 4344, 8083, -10667, 1307, -2616, 7952, -1203, -10398, +5609, -512, 4239, -14118, 10628, -3069, 2975, -9237, 3095, -2485, 3894, -2657, -4693, -449, 3631, -3236, +1634, -749, 1695, -13098, 17320, -7517, 8096, -13362, 11184, 35, 3193, 863, -7399, 9979, -4516, 5137, +-2424, 5805, -3272, -2063, 4981, -154, 1659, -6813, 3167, 3074, -1094, 566, -3719, 3612, -1196, -1229, +-8386, 8418, 124, -2347, -14318, 14868, -2257, -6478, -1947, -3132, 4707, -120, -5669, 5018, -6368, 12406, +-15857, 10176, 1543, -1695, -7724, 9247, 4802, -1340, -5549, 4887, 1800, 3234, -3609, -2065, 8532, 1487, +-1966, -5490, 10511, 1796, -6663, -1171, 4384, 517, -299, -2687, 2837, -2272, -2606, -1437, -2620, 7384, +-14525, 1440, 3647, 3866, -8316, -5171, 6698, -5295, 6880, -11746, 7403, -3765, 5422, -4596, -1321, 10039, +-8504, -3265, 5824, 7298, -7841, 672, 6653, 2025, -1926, -1639, 4995, 4087, -3832, -4482, 6586, 8590, +-2905, -11218, 2592, 14530, -9776, -4738, 6, 6149, -3850, -5849, 8660, -9615, 6289, -11896, 4821, 4257, +-3453, -6634, -3956, 13728, -3706, -11961, 4157, 1714, 2405, -6527, 749, 5912, 383, -4161, 1690, -443, +12172, -11385, 1275, 8742, 1007, -2362, -1358, 11384, -5184, -3964, 3803, 1872, 7642, -13803, 5568, -3066, +12347, -9644, -8742, 7637, 2507, -4542, -6596, 7328, 5, -7390, -703, 3328, -1727, -2921, -1917, -2672, +9879, -7066, -3770, 2672, 8690, -10918, -616, 7461, 70, 420, -7868, 9605, -1079, 5859, -6023, 0, +2836, 7865, -8808, 7245, -1542, 2120, -7244, 9931, -132, -3749, -3471, 5757, -408, -932, 223, -6276, +5054, 766, -4164, -2007, 1712, 1894, -9373, 4340, 2696, -5917, -1844, 5016, -7409, 6628, -6875, 6693, +-5815, 691, 1984, -5040, 11132, -3241, -7696, 5505, 4654, 4953, -11505, 3430, 7493, -3004, 4354, -5043, +3021, 1967, -1358, -1931, 3425, 3408, -7297, 318, 3083, 5514, -9310, -881, 2348, 2300, -3598, 638, +-6154, 8504, 1344, -13791, 6118, 2950, -1052, -8796, 3401, 5611, -3968, 1419, -4790, 881, 3120, 983, +-6438, 3109, 6993, -9823, 7669, -2945, 7434, -10782, 2590, 5481, -1198, -1159, 1622, -1186, 3988, 1311, +-5746, 1435, 3362, 1472, -5010, 1923, 7213, -6775, 1264, 323, 0, -3855, 4364, -1273, -3088, 1640, +-2514, 2315, 2839, -8811, 691, -4584, 15780, -12779, 113, 3513, -640, -600, 337, -1923, 2916, -5040, +3690, 1104, 3237, -2509, -8267, 8712, 4829, -7326, -1183, 188, 11141, -5689, -4797, 7597, 1593, -1162, +-7040, 2435, 6976, 3854, -12184, 755, 9713, -1587, -5460, -2673, 7051, -2424, -4220, 4757, -176, 535, +-2327, -6846, 10813, 318, -9755, -1428, 5781, 6290, -8660, -2354, 1162, 4502, -5949, 583, -1212, 5057, +-2257, -2247, 1272, 4321, -663, -5430, 4579, 3099, -2088, -5015, 11185, -4227, -2209, 2728, -3500, 8286, +-7291, 3531, -5411, 9444, -3062, -1748, -1772, 3022, -175, -4351, 5122, 2479, -10977, 7497, -1121, 2298, +-6074, 1092, 464, 1848, -5131, 1186, -3323, 12605, -11981, -1094, 5339, -377, 2358, -9135, 7742, 255, +-250, -517, -2495, 3774, 866, -6221, 4937, 3333, -2395, -6454, 5045, 5762, -549, -8603, 3830, 215, +5062, -1873, -6736, 4351, 5000, -3174, -5596, 5822, -1036, -1237, -3023, 3205, 1196, -4599, 3351, -6178, +7982, -3012, 272, -5245, 7070, -2322, -2600, 2964, 2518, -4070, -2939, 4868, 2361, -4704, 2831, -4004, +2595, 2837, -859, -4165, 3765, -2067, 5034, -4165, 1653, 430, -6516, 10865, -4355, -34, -2262, 280, +4070, -3925, 2717, -5306, 3825, -139, 217, -3723, 3424, 1991, -5575, 2861, 2277, -4361, 3241, -1661, +302, 2516, -4012, 1718, -1942, 5532, -5078, -3356, 7608, 1280, -6445, 73, 2693, 2813, -4525, 278, +1113, 1926, 1002, -3844, 1218, 2115, 4189, -13871, 10631, -1739, 190, -3508, 3919, 1118, -4889, 156, +2587, -1858, 2072, -4098, -1829, 11622, -5727, -3161, -4496, 12345, -7429, 1152, -2702, 5951, -5759, 5980, +-3733, 4034, -5330, 1853, -4533, 9022, -1084, -5008, -2107, 9556, -890, -6629, -2657, 11372, -8103, 2897, +-2344, 2136, 3922, -6898, 229, 1635, 3716, -3241, -6851, 7713, 2063, -3546, -2684, 5292, -3600, -1879, +812, 2778, 1385, -2557, -2112, 3217, 1806, -165, -7909, 3774, 6898, -6794, 1215, 1742, -623, 114, +-532, -31, 3134, -6819, 4768, -1005, 5794, -6018, 90, -544, 7866, -9233, -696, 3341, 4326, -4453, +-3910, 5989, -2143, -2613, 4238, -9024, 9485, -2846, -3881, 47, 9949, -9419, 265, -1006, 9564, -10597, +1550, 2272, 2731, 316, -5437, 2523, 2357, 1154, -3180, -3741, 8814, 1307, -8432, 1790, 4676, 1681, +-7282, 3636, -410, -194, 1611, -4182, 2320, 2723, -5989, 1501, -2250, 9741, -13169, 2694, 2073, 3580, +-3096, -4720, 1653, 2803, 1698, -5231, 1443, -2130, 7279, -8752, 6033, -1480, 144, -3129, 5373, -2075, +2128, -1646, 657, 3365, -2063, 2170, -2599, 2846, 1787, -4563, 4378, 194, -1344, 774, -4536, 5934, +-2674, -3336, 2774, -3146, 448, 1462, -753, -2776, 352, -711, -2184, 4732, -4291, -2493, 952, 4164, +-3100, -3094, 2211, 652, -1152, 2173, -4387, 4094, 1710, -1688, 83, 2494, 2537, -2890, -1086, 9358, +-6154, 1748, -1933, 6828, -2119, -701, -4702, 6567, 875, -632, -10711, 7189, 2684, -1050, -9076, 6266, +1927, -3497, -2379, -960, 2655, 633, -8533, 4675, -3072, 9096, -13308, 1385, 6788, -3074, -3644, 710, +662, 4782, -4375, -813, 4194, 2643, -2198, -4642, 7305, 1848, 415, -4143, 3932, 401, 3799, -4627, +2075, -1859, 4354, -3740, 5268, -7507, 7551, -10215, 10085, -6719, 1887, -5257, 5350, -1782, -1451, -3516, +4542, -6082, 68, -1947, 4654, -5136, 660, 563, -370, 3442, -6714, -1634, 7482, -589, -3651, -1368, +8975, 549, -7113, 1475, 4879, -8, 153, -8403, 11922, -623, 437, -5721, 1591, 10274, -9154, -2309, +3149, 5583, -3586, -3563, 2290, 4845, -7311, 362, -4928, 9279, -3808, -4749, -2490, 9143, -3193, -6648, +217, 3004, 543, -820, -5510, 5839, -2349, 4104, -7419, 4067, 1218, -2645, -776, 6429, -2222, -1355, +-1181, 6453, -3326, -1690, 4238, -3515, 6954, -3711, 3415, -3386, 5296, -5469, 298, 6096, -5374, 1457, +-3128, 4647, -554, -5013, 1190, 1388, -2750, -1946, 2580, -2727, 5253, -7709, 3332, -692, 3901, -5552, +-5188, 9776, -3469, 410, -2337, 2335, -2582, 3328, -1077, -2642, 5069, -3884, -948, 5912, -3374, 5779, +-11460, 13142, -5184, 3789, -8005, 7716, -1590, 1285, -1093, -16, 136, 1152, 413, -6416, 9488, -6900, +2027, -3081, 4485, -2965, -1117, 1791, -1637, 1407, -3740, 66, 1772, -2320, 3585, -7269, 3668, 1399, +-5179, 2875, -1680, 4587, -5696, 2917, -336, -1165, 4613, -4477, 2024, 1030, 4259, -6421, 5794, -1773, +1009, 800, 1586, -875, 573, -2630, 4933, -1091, 1630, -3326, -1230, 2008, 3615, -6736, 2870, -3163, +7016, -7684, 2945, -333, -5136, 4039, -1165, -2028, 2204, -4291, 2241, -2829, 5262, -5321, -328, 1082, +212, -1630, -340, 4597, -4705, 1807, 1452, 91, 1842, -1234, -452, 3249, -860, 1293, -580, 1133, +3399, -4652, 4298, 2188, -3195, 709, -4095, 8198, -1598, -4821, 1307, 1099, 2807, -4376, -2052, -772, +5275, -5743, -2473, 5417, -3251, -229, -5917, 6089, -1340, -5547, 3227, -3842, 8575, -4583, -5068, 5161, +3782, -3521, -2747, 2009, 4381, 957, -7099, 8810, -3867, 7725, -11559, 9547, -4029, 7686, -8015, 5257, +910, 1397, -5252, 1350, 2804, 847, -5233, 5970, -4419, 4254, -4334, -1307, 2480, -1159, -3967, 1361, +-831, 1554, 655, -7056, 7501, -6727, 2023, 677, -3151, 1876, -755, 4463, -3469, 1002, -5950, 6749, +-1378, 3114, -4487, 396, 9727, -8965, 5762, -1683, 1708, 880, -2938, 2315, 5956, -5650, 2662, -1824, +5093, -739, -6547, 1750, 2623, 3, 299, -7132, 9206, -6200, 246, -4225, 6837, -2390, -550, -4194, +2003, 3418, -2677, -4045, 3012, -1108, 4244, -7769, 5158, -2347, 1810, 1928, -5267, 4242, 1683, -6046, +5107, 1147, 1709, -1428, 34, -1164, 4763, -1309, -62, -1961, 5149, -225, -4089, 886, 917, 3069, +-3988, 842, -3004, 7948, -7875, 3288, -1251, -614, 4919, -8459, 3308, -827, 229, -1358, -1116, 3469, +-3080, -2313, 1339, 953, -525, 396, -2485, -287, 6125, -6649, 5869, -3256, 4051, -1722, 1007, -936, +2102, -1806, 2531, 670, -3559, 8581, -9208, 6841, -4099, 994, 4148, -4027, 1995, -2165, 143, 5549, +-6828, 3372, -3915, 3628, -4888, 4281, -3447, 1781, -3807, 795, 2022, -2655, -1175, -965, -740, 6201, +-5161, -1753, 3825, 1278, -5655, 7981, -7380, 9160, -9222, 6274, -1995, 2890, 1586, -8188, 9007, 1016, +-3004, 485, 924, 4303, -4059, 323, 34, 6092, -6845, 257, 1732, 1976, 1256, -9189, 4108, 2158, +-890, -4831, -156, 2422, 289, -5372, 1675, 2285, -3471, 1414, -2880, 3841, -879, -3285, 2068, -2344, +6649, -7016, 2715, 197, 5141, -7185, 3489, 2427, -2567, 4303, 322, -2870, 6216, -7459, 9993, -6919, +3927, -4082, 3365, 1734, -260, -5645, 6294, -2233, 1183, -5376, 1336, 2867, -4359, -667, 3628, -934, +803, -7040, 226, 6212, -3028, -3772, -2008, 7107, -3610, -1070, -2849, 5165, -404, -5237, 3716, -394, +8251, -9536, -60, 6342, 2786, -2928, -6284, 4216, 7016, -3695, 343, -1574, 2203, 613, -2012, -2635, +5755, -2095, -1554, -559, 4065, -1573, -3180, -1641, 2436, 3442, -5214, 1126, -4593, 7292, -4451, -292, +-1194, -2744, 5766, -5568, 280, 3607, -194, -1558, -1165, 719, -2337, 6492, -7589, 4070, -323, 4332, +-4959, 2197, -2020, 2349, 458, -473, -2130, 3345, -226, -2407, 3680, -2446, 982, 2217, -6843, 8404, +-6556, 5035, -4113, 2354, -813, -162, -2919, 1608, 350, 1651, -1651, -3995, 3988, -260, -1302, -427, +-2536, 4570, -1819, 181, -4776, 5300, -3899, 4186, -3338, 1947, -347, -2921, 3585, -1252, 2020, -991, +-3901, 4496, -417, 110, -1443, 1094, 685, -1797, 2002, -2722, 3977, -5602, 5369, -4579, 7196, -6522, +760, -549, 3593, -396, -759, -1142, -171, 148, -2175, 4458, -2728, -2722, 1557, -1537, 7744, -9860, +1487, 201, 1272, 2793, -6017, 1189, 1363, 1123, -1779, 1277, 682, -2592, 284, -1155, 6623, -4254, +-211, -2059, 5757, -3282, 200, -1025, 2039, -90, 1402, -1393, 972, -219, -735, -2988, 7851, -7197, +2354, -3143, 4332, -3241, -367, 2093, -1543, -3459, 2502, 892, -658, -1205, -2945, 5049, 104, -3047, +-1597, 1428, 4534, -2786, -3154, 1229, 4507, -2484, -3677, 2245, 4444, -590, -5354, 4778, 1581, -314, +-1719, -2781, 9371, -1898, -6866, 1244, 3328, 5421, -10153, 1448, 1831, 3746, -4070, -2049, -326, 4568, +-1937, -5808, 5480, 341, -3070, -1060, -239, 5582, -4899, -890, -3067, 4570, -197, -856, -2044, 2387, +-1031, 1424, -2015, 2386, 163, 1251, -2347, 8035, -7511, 7359, -7187, 4557, -3881, 9099, -7654, 661, +-88, 2088, 2359, -3595, -414, -2408, 5216, -2720, -1217, 1899, 798, -2921, 561, -118, -214, -62, +-3898, 4085, -714, 598, -2693, -4659, 5417, -895, -2005, 1166, 346, 1775, -366, -2266, 3457, 1005, +-3143, 1869, -529, 182, 4136, -4935, 3409, -2546, 5267, -6491, 2111, 7, 1469, -1685, 5922, -7345, +4334, -1093, -1785, 469, 1926, -246, 163, -3210, 3801, -4010, 3067, -3646, 320, 1631, -1341, -3646, +3609, 236, 1242, -2769, -1191, 3529, 365, -3914, 1910, 980, 682, 100, -3001, 1576, 1012, -2965, +3143, 347, 1736, -4708, -485, 5175, -2686, 1748, -1760, -448, 2095, 390, -3324, 2363, 735, -1469, +134, -689, 2308, -2299, -3028, 6515, -3385, 2034, -2895, 696, -522, 1569, 1796, -1734, -1237, -1397, +2718, -2865, 4768, -5707, 1816, 915, -1500, 1433, -1896, -210, 3377, -4301, 5320, -309, -5514, 996, +3023, -142, 1591, -5224, 861, 4889, -3535, 885, -3203, 5068, -2345, -3550, 1942, 4305, -3665, 2395, +-4300, 6821, -1075, -6561, 2766, 3474, -1374, -491, -3560, 7234, -4768, -1209, -168, 2408, 1728, -2296, +-4749, 6222, 1752, -4714, -153, 3041, -1498, 4070, -10965, 11146, -4732, 3447, -5386, 1002, 4143, -2463, +-3101, 2649, 1060, 144, -1084, -2441, 6106, -3918, -1448, 2214, 909, 1836, -4830, 1341, -1138, 3476, +-432, -4279, 2140, 495, 1876, -2856, 1487, -1676, 21, 3639, -3837, 2500, -1893, 646, -54, 157, +875, 172, -238, -4206, 7265, -5184, 6857, -9469, 6649, -2282, 2349, -1176, -827, 1946, 2944, -6867, +5122, -1353, 157, -3109, 2905, -2601, 7677, -7992, 2318, -2474, 3188, 730, -3658, 2505, -1304, 2866, +747, -5500, 3153, 1704, -3789, -147, 2075, -354, 1345, -5088, 6740, -4505, 5226, -6794, 531, 2558, +5354, -6394, 2621, 1273, 1380, -786, -4278, 2919, 4882, -5374, 1807, -2291, 4075, 1026, -7225, 3486, +110, 5636, -7516, 527, 3823, 2494, -4043, -1487, 2053, 762, -759, -1695, -606, 6670, -4555, -20, +-3828, 6220, -3746, -655, 454, 4370, -2691, 2000, -4790, 3649, 2340, -2367, -2140, 4765, -4094, 7433, +-7548, 4043, -3371, 4327, -2080, -385, -3380, 5714, -1125, 1326, -1280, 1154, 1060, -4759, 1936, 3904, +-2766, 2188, -3033, -1227, 7194, -3248, -4667, 3715, 851, 1923, -3396, -235, 3673, -4187, 3670, -825, +-293, 3523, -7158, 3445, 614, 3978, -5714, -389, 1854, -323, 2260, -4485, 6132, -7922, 8166, -4754, +2128, -129, -2236, 2335, 1446, -621, -342, -2925, -100, 5524, -6401, 3682, -129, -2237, 2359, -3207, +6644, -4549, 846, 221, 1116, 2063, -1787, -1734, 3134, 3706, -7297, 3778, -396, 1024, -1145, -1300, +1763, -521, 1185, -3934, 1779, 2260, -636, -541, -206, 638, -603, -275, -1640, 781, 4171, -7487, +6065, -5558, 3956, -2296, 1195, -4767, 5854, -4791, 5324, -3408, 444, 2339, -1234, 1024, -2295, 1591, +3055, -5164, 1450, 3541, -779, -2289, 298, -3489, 8135, -4922, 825, -3237, 3149, 5340, -7637, 2271, +2500, -3109, 3457, -4010, 1399, 1632, -1291, -3206, 2621, 764, 1235, -4782, -1680, 6673, -3666, 852, +-6035, 6241, -1936, 2277, -3261, 938, -2385, 7408, -9785, 3101, 1758, 1310, -5306, 1041, 2053, 3806, +-3816, -4839, 2664, 6622, -3304, -2101, -1700, 6203, -957, -2616, -3037, 5437, -2047, 2349, -7885, 10243, +-3726, -1183, -4812, 4791, 3503, -1142, -7627, 4666, 3111, 898, -5667, -2356, 7104, -2764, -1462, -2815, +5032, 802, -2833, -3888, 3396, 8, -1624, -3840, 3574, 3026, 631, -4679, 789, -758, 2308, -1819, +-4106, 5756, -905, -931, 802, -2126, 3197, -1428, -952, -2347, 2846, 2461, -1462, -1729, 4375, -892, +-541, -3057, 56, 4904, -347, -4870, 2459, 2209, 711, -5854, -1457, 2494, 3962, -4307, -776, -719, +2912, -987, -3272, 2257, -726, 1162, -3832, 283, 5571, -3652, -1597, -2247, 4904, -2182, 1705, -5397, +5355, 1067, 123, -4119, 1898, -5, 854, -2926, 5161, -2027, 1288, -689, -2696, 3701, 2218, -7718, +5529, -5091, 7761, -5914, 3588, -4020, 2574, 5, -913, -1660, 633, -900, 1040, -1433, 995, -1842, +1269, -3825, 2548, 1455, -3016, 1282, -2402, 3615, -551, -81, -3018, 5137, -1204, -464, -2784, 3013, +2198, -5759, 4387, 944, -2570, 3521, -4242, 2209, 598, -739, -1428, 1704, -1203, 4479, -7522, 7567, +-5701, 4458, -4606, 337, -633, 3881, -7845, 6756, -5519, 4875, -3992, 129, -312, 2547, -2604, 1470, +-987, 1650, -336, -1712, 83, 1130, 2235, -1552, -2449, 3818, -1936, 1120, -1566, 1967, -795, 928, +-737, 192, 3211, -2761, -863, 1603, 1583, -927, -2812, 2570, -134, 692, -944, -1849, -1002, 1147, +-367, -3222, 5211, -4088, 2286, -4521, 2495, 2790, -3598, -3440, 4729, -1147, 1368, -4065, 1868, 1084, +-1118, 1448, -1930, 2304, -355, -4337, 4835, 670, 270, -3193, 2347, 1962, -696, 1588, -2582, 653, +1380, -476, -1031, 1024, 1718, -4193, 5324, -3510, 1833, -3309, -357, 1907, 1108, -2051, 2461, -2800, +684, -1330, 842, -1970, -231, 541, -1045, 2620, -3212, 670, -738, 735, -2533, -78, 1332, 781, +-856, 119, 1680, -1175, -370, -672, 926, 1322, 655, -1554, 2237, 230, 1506, -6798, 6153, -1683, +3600, -3551, 3249, -627, 2252, -3588, -1087, 4670, -4171, 626, -852, 3574, -1062, -1717, -2774, 1208, +739, -2742, -3253, 3464, 907, 1007, -2824, -1742, 929, 124, -3415, 1075, 4306, -3889, 1305, -845, +1850, -299, -2063, -2073, 2422, 2996, -205, -1327, -1462, 8280, -6666, 6576, -10051, 9969, -4611, 2975, +-1327, 2916, 892, -3419, 396, -604, 2628, 430, -6670, 5901, -1345, 1534, -5316, 1999, -1964, 3037, +-2630, -755, -788, 2034, -3248, -517, 1225, -370, -2198, -172, -1096, 4371, -1104, -2266, 716, 944, +1763, -992, -890, 1655, 2207, -909, 3134, -4263, 4058, 1190, -3283, 3149, 23, 1060, -251, -3231, +5265, -2538, 2710, -5345, 4331, -1453, 1103, -4315, 3300, -1802, 2916, -4492, -52, 682, 75, -2931, +-471, -254, 3946, -6705, 4733, -3629, 5567, -3991, -1044, 1741, 640, 1191, -3919, 3452, 2561, -95, +-1598, 881, 1807, -2162, 2611, 255, 1476, -1350, 2169, -1094, 2812, -461, -1752, -221, 3324, -1307, +1593, -3038, 944, 1172, -2671, 1373, -1758, -1312, 575, -446, 986, 1065, -5452, 3255, -2013, 2931, +-3323, 2231, -385, -1864, 2511, -551, 1829, -4567, 4476, -1351, 4283, -4060, 2533, -1504, 3178, -893, +1104, 1998, -1734, 914, 1658, 1065, 1081, -855, -4753, 6251, 347, -2039, -2257, 2120, 986, -1506, +-1912, 788, 185, 1213, -3699, 1297, 3933, -5742, -933, -772, 4482, -216, -6217, 3134, 388, 2672, +-4780, -815, 2080, 2517, -3159, 1451, 1201, 4720, -4707, 1228, -1341, 6619, -3343, -377, 498, 7252, +-3075, -90, -3532, 6188, -4434, 3249, -5183, 6405, -701, 700, -3065, 1591, -1145, 492, -3644, 994, +1857, 395, -1980, -646, 556, -1367, -1763, -2941, 1282, 4229, -3283, 231, -1830, 3214, -1336, -1327, +-874, 7, 4901, -1155, -356, 697, 3515, -4896, 2310, -1421, 2644, 1167, -660, -71, 6484, -1985, +-699, -4762, 5985, -474, 1327, -1654, 1596, -1154, 5330, -9729, 6821, -5546, 2311, -2986, 653, 2194, +564, -5697, -18, -629, 4359, -7981, 2421, -1845, 4083, -224, -1651, -3062, 3038, -2085, -773, 897, +1558, -268, 1469, -2597, 4560, 275, -740, -1379, 2143, 3345, -372, -657, 231, 3639, -2505, 2386, +-4516, 4703, -4000, 4109, -2372, 279, 521, -1553, -1597, 544, 304, 890, -7141, 7480, -6125, 4148, +-4933, 681, 293, -725, -2296, -359, -776, 1504, -1428, -968, 2256, -1012, -561, 1610, -662, 2653, +-2979, 3459, -1630, 2322, 1523, -2436, 109, 2577, 1558, -4419, 2944, -585, 2416, -1191, -244, 1275, +-2374, 1729, -3275, 1717, 2533, -4761, 1243, -1553, 3571, -4790, -1104, -1453, 463, 879, -1520, -2969, +1564, 1590, -1244, -3937, 3396, -235, -2028, 835, 1956, 1728, -2741, -858, 64, 3308, -926, 593, +-4434, 6696, 477, -1120, -2911, 4969, -3495, 4400, -6285, 5023, 226, -805, -2572, 2194, -296, 2078, +-9009, 4535, -49, 2086, -4123, -2907, 3566, -1292, -2058, 2403, -2368, 434, 1317, -3415, 1122, 1917, +-1777, -3084, 2126, 1402, 409, -2746, 714, -206, 3279, -1981, 13, -637, 4625, -2381, 1099, -1146, +2691, -3290, 3280, -3691, 5413, -5696, 8399, -11258, 7084, -3794, 1300, -3065, 2378, -1549, 3915, -5199, +4883, -7226, 7758, -7269, 2975, -4060, 6041, -2643, -1165, 1176, -2532, 1311, -2450, -1195, 1346, 2088, +23, -1487, 2989, 8, -1588, -3387, 3362, 2575, -425, -153, -2150, 5045, -949, 0, -5446, 3981, +-2392, 4699, -4994, 6372, -2967, 1543, -4806, 4729, -3033, 2437, -6392, 8544, -4645, 6493, -7815, -806, +1339, -289, -2151, 657, 1267, -62, -2335, 3298, -1201, -1108, -3384, 1787, -304, 5488, -4993, 2356, +-1327, 3343, -3065, -3230, 4147, -1986, 1065, -231, 5823, -3503, -842, -895, 2277, 2078, -3319, 1113, +645, 3996, -755, -4131, 3667, -2498, 816, -2426, 1052, 1343, 675, -2611, 2003, -1161, 2099, -5877, +1705, 2861, -2196, 905, -2979, 2514, 487, -3081, 338, -1451, 2214, -1632, -578, 2300, -3643, 5217, +-4196, 3895, -4358, 5840, -4060, 4259, -2716, 2959, 807, -2087, -711, 2993, -326, -362, -2146, 1874, +0, 3051, -4074, -1950, 6144, -3270, 1120, -2645, 1171, 2106, -1075, -4684, 7399, -4456, 1456, -7400, +6121, 764, -2847, -3079, 1399, 3426, 595, -5132, 1078, 1113, 2194, -4564, 4000, -1094, 4141, -4593, +1041, 1324, 2669, -5500, 1004, -1118, 7428, -5117, 1644, -3459, 4821, -478, -2421, -1277, 4286, -4887, +4254, -1655, 692, 2042, -5721, 2487, -1826, 1836, -403, -929, -1198, 953, 3279, -3739, -735, -52, +2524, 558, -3372, 4272, -5078, 5912, -3306, -960, 2010, 1732, -5304, 3937, -1708, 3673, -2172, -831, +-1647, 4623, -996, -1355, -2774, 6135, -1195, -3163, -2715, 5413, -2727, 2766, -8509, 9154, -3231, -773, +-1870, -391, 3585, 856, -6633, 5124, 2308, -3962, 949, -3352, 8517, -3768, -2057, -1155, 2860, 3759, +-4264, -4247, 6399, -250, -4185, 3327, 810, 951, 1419, -6945, 4539, 2834, -5944, 3071, -5534, 11277, +-4306, -3990, 323, -1539, 3474, -3569, -592, 2917, -1542, -1204, 3130, -1986, 2233, -4393, -1951, 3883, +1456, -767, 95, -774, 3937, -3275, -709, -960, -1242, 1510, 5378, -2010, -2189, 4098, -5243, 4030, +-2528, 1802, -1224, 1485, 54, -1286, 3837, -1162, -2194, -5543, 9250, -4584, 889, -2196, 3028, 4223, +-6763, 1050, -1171, -338, 3420, -5558, 5522, 1976, -1670, -6493, 5548, -1375, 2022, -6390, 4545, 1562, +-99, 1409, -6145, 4361, 3692, -7703, 2063, 25, 3997, -1602, -401, -1326, 5214, -6590, 874, -452, +1530, 3434, -5369, 4610, 600, -2029, 2288, -5422, 6511, -2577, -144, 1292, -1055, 1826, 1317, -2747, +-377, 561, -1298, 2130, -3507, 4263, -1365, -647, 1796, -3275, 2986, 105, -1840, -923, 961, 3537, +-2897, -396, -1616, 4293, -3935, 2329, -3769, 1217, 3594, -3866, 2248, 1626, -588, -1722, 749, 3362, +-69, -2010, -939, 5358, -4302, 7167, -7381, 2476, -847, 2904, -3328, 815, 670, 1336, -2359, 1364, +435, -1101, -1671, 283, 823, 4059, -5045, 1041, -1185, 2372, -1814, -115, -1692, 2664, -4325, 2962, +4669, -6081, 3013, -2468, 752, 4359, -5660, 4714, -2577, 6222, -2541, -1493, 1513, 1133, -3370, 4196, +-910, 1199, 1377, -6518, 6750, 110, -2822, -949, -888, 2526, 1806, -7236, 5740, -1375, 1360, -4312, +-1142, 1896, 1262, -4504, 4967, -4681, 5513, -4160, -2574, 3621, 3865, -5625, 2726, -1850, 3828, -367, +-2970, 1902, 2756, 700, -1392, -1771, 3912, -890, -137, 1603, -1259, 1545, 220, -3137, 5628, -1858, +-532, -1258, -69, -1767, 4506, -4560, 1162, -2786, 4702, -4176, -1582, -1491, -231, 2586, 381, -2400, +-1519, 4334, -3777, -629, 2100, -301, 1693, -2480, -435, 6263, -2335, -2392, 425, 805, 3716, -3624, +52, 3750, 370, 1567, -4065, -239, 5049, -3808, 587, 1423, 2955, 136, -3653, -2453, 4230, -3003, +-1826, 645, -2596, 7255, -6780, 221, 15, -239, -951, -4770, 3934, 501, -173, -517, -190, 1121, +551, -3507, -2957, 5611, -944, 1961, -2881, 3130, 856, -1950, -3680, 4860, -3018, 4775, -4141, 3968, +-432, 4844, -8026, 5973, -5658, 6904, -5486, 3565, -2223, 4054, -1564, -3390, 1372, 1654, -3668, -599, +-459, 4341, -2812, 485, -5305, 4759, -1799, -3173, 1164, -139, 2771, -2401, -850, 265, 1957, -3739, +555, -1025, 2878, -277, -2189, 1572, 391, 1194, 12, -5013, 5788, -2526, 2852, -4487, 6542, -2265, +899, -3731, 5034, -1660, 1043, -1438, -563, 2592, 4307, -6870, 1351, -1326, 5073, -6142, 1617, -2639, +3841, -2448, -124, -3404, 7691, -7137, 66, -1964, 3898, -1762, -1591, -1719, 4901, -61, -3978, 967, +-2115, 4103, -3105, 506, -2383, 5641, -1413, -1891, -1433, 5955, -2844, -812, -328, 4079, 807, 320, +-3676, 4927, -62, 115, -4952, 3255, 881, 129, -604, -2834, 2849, -1363, -1130, -3404, 2086, -638, +1125, -2063, 350, 866, -1976, -1545, 563, 1428, 171, -3120, 807, 270, 3871, -3953, -1276, -2512, +7565, -2461, -1995, 167, 4690, -1825, 3929, -7957, 5410, 1597, -2474, -410, 4481, 1259, -3331, -929, +690, 3057, -869, -3603, -1088, 5174, -1195, -3847, 540, 856, -23, 45, -5475, 6109, -3481, 137, +-4514, 7331, -3828, 1045, -6603, 6057, -386, 2165, -3554, -2168, 4264, 1598, -5364, 6077, -4422, 6526, +-6006, 4839, -3997, 4206, -6250, 7878, -3609, 5819, -5911, 2533, -478, 750, -807, 992, -2547, 3151, +-2970, 3382, -2414, 132, -2241, 13, -158, -2272, 1205, -875, 2853, -4015, 2756, -3818, 2725, -4680, +4463, -1224, 3900, -2953, 1106, -1244, 656, -1162, 1716, -4877, 8297, -6996, 7448, -5858, 3883, -4276, +3290, -1843, 3180, -4424, 4193, 52, 3949, -3544, 23, -2149, 3488, -4693, 4233, -2681, 4736, -5473, +3377, -3813, 1829, -3762, -283, 1756, 2528, 284, -4932, 2378, 2022, -2742, 662, -3794, 2288, 2010, +-1688, 942, -927, 4324, -7157, 345, 2553, 2960, -7403, 5554, -4184, 9352, -5156, -1886, -345, 955, +3279, -2761, 1719, -1600, 2450, -745, -2382, 3888, -2385, 183, -1573, 4109, -485, 359, -2419, -71, +3954, -760, -3123, -2206, 3904, 447, -1133, -517, -631, -1440, 2788, -1800, -1050, 320, 1923, -3720, +2575, -1044, 2197, -3786, 71, 1399, 634, -490, -3720, 1360, 1746, 970, -1002, -2732, 2437, 1854, +-968, -1965, 3735, 1155, -336, 1562, -2587, 5673, -4077, -255, -3655, 9901, -5806, -1307, -2356, 6866, +-2320, -541, -4962, 3023, 1796, -970, -3943, 4991, 721, -1816, -2618, 2895, -1802, 1927, -7887, 7889, +-2329, 3137, -7209, -270, 3463, 676, -5626, 3487, -1019, 5747, -3879, -560, 4329, -802, -2977, 3799, +-2105, 2786, -1176, -1184, 3638, -1338, 2012, -6295, 3593, -645, 1469, -4499, 10245, -9935, 5728, -3832, +1251, -163, 369, -1971, 4030, -3377, 3409, -6043, 3922, -2424, 677, -922, 2379, -5568, 4489, -2955, +4926, -1096, -3526, 3231, -908, -396, 1625, -1547, 2982, -1986, 716, -2930, 5675, -5503, 3871, -2393, +5340, -3594, -3085, 2659, 921, 1194, -1859, -204, 1104, 1283, -4366, 209, 3939, -1023, -682, -3375, +5074, 628, -6382, 5829, -2999, 4015, -3099, -507, 244, 5314, -4166, 899, -1254, 69, 968, -6593, +7243, -662, -1679, 2063, -5494, 7745, -6477, 886, 2024, 634, 2950, -1561, -3457, 2693, 1504, -3971, +3884, -3883, 152, 3293, -2194, 2662, -3783, 2936, -2730, -691, 953, 1781, -1515, 4717, -2476, 2711, +691, -6692, 3913, -798, 1813, 977, -3493, 4203, -3391, 1824, -2499, -864, 2311, 697, -4130, 3319, +1518, -95, -1954, -607, -425, 5153, -8815, 4395, -396, 5124, -4550, -972, 435, 1621, -2529, 418, +1016, 2453, 1508, -5820, 6436, -1344, -685, -284, -1122, 4685, -1026, -672, -4058, 6404, 808, -6087, +1055, 966, 3016, -3579, 381, 253, 231, 2878, -7195, 4402, -2029, 580, -1534, -85, 2303, 16, +-3251, -845, 4641, -2854, 2571, -5775, 5708, -139, 505, -1537, 351, 4181, 422, -5645, 5253, -393, +-1504, -61, 1794, -2145, 7438, -9033, 5645, -3348, 4186, -1710, -2043, 2858, -23, 1388, 223, -4714, +2516, 160, -2044, -1741, 1161, -1800, 2668, -6023, 6687, -4746, 2567, -5800, 1729, 1130, 5078, -6022, +3416, -624, 4472, -1989, -4181, 1840, 5310, -4650, 3765, -3381, 4113, 666, -4539, 1858, 633, 5576, +-6027, -254, 4817, 3627, -3881, -2630, 2441, -395, 1288, -3072, -1848, 6785, -2087, -3270, -2983, 4965, +-2931, -2562, -1683, 7158, -3690, 2594, -7235, 4194, 2712, -2232, -4612, 5507, -2356, 5868, -8238, 4806, +-927, 1872, -3748, 3001, -4131, 7104, -3962, 2979, 326, 1744, -458, -3637, 1244, 5949, -5221, 3162, +-859, -2560, 6547, -3680, -2892, 3125, -1190, 5376, -6540, 976, 1981, -3012, 3135, -1414, -671, 1799, +-3832, 2, 253, 3004, -2732, -2539, -866, 3379, 982, -4385, 3400, -4667, 7553, -4235, -434, -340, +3500, -691, 108, -125, 2299, -3874, -3416, 7083, -2725, 1973, -981, -2286, 3563, 18, 525, -3657, +3183, 1103, 375, -1224, 3023, -3086, 374, 4116, -6125, 2563, -1374, -1538, 2626, 337, -2316, -813, +-74, -1292, 18, 491, 2216, -1223, -1152, 1862, -812, -763, -2819, -91, 5985, -6944, 5456, -4809, +2495, 592, -400, -5604, 7528, -5553, 4544, -2190, 1810, 4211, -4841, 1748, -2202, 2183, 2891, -6583, +3391, 2723, 715, -5502, 2589, -4720, 7191, -5982, 1752, -905, 1167, 2243, -3483, -137, 2586, -3229, +13, -1306, 1847, 229, -548, -3581, 3949, -1809, 1702, -4230, -158, 5398, -2881, 448, -4660, 7219, +-3871, 3076, -3430, 2275, -2425, 5597, -6378, 1902, 2208, 1012, -6210, 3292, 1383, 2340, -3962, -1329, +-580, 7946, -6317, 1292, -3556, 5701, -1906, -2824, -1816, 3905, -4048, 3614, -6106, 6876, -1994, -2009, +-4347, 4775, 2184, 1489, -9649, 4743, 5418, -2002, -1242, -5912, 8035, -1950, -915, -3074, 4971, 2227, +-2979, -3471, 2907, 3164, -5319, -2110, 2991, 5093, 1568, -7955, 3161, -2271, 4544, -5524, -2916, 5679, +-612, -2368, 60, 1117, 253, -1369, -3963, 1482, 2398, 971, -2888, 866, 3968, -1002, -2109, -2340, +-225, 4787, -871, -2645, 2834, 1608, -1264, -2448, -1743, 1840, 3459, -3110, -102, 1098, 1670, -535, +-2218, 1393, -1273, 3435, -6241, 2485, 2834, 584, -4190, -2529, 5640, -2846, 1571, -5204, 4259, 2776, +170, -7061, 3925, -529, 2315, -6590, 4879, 1731, -558, -3057, 32, 1942, 5051, -11775, 6785, -4165, +9736, -9038, 3752, -3250, 7114, -5914, 929, 410, 583, -2037, 1156, -1446, 4509, -5219, 2986, -6081, +7560, -454, -4727, 2068, 944, -434, 1724, -1060, -1908, 5166, -3138, 742, -2096, 2571, -772, -3161, +3299, 2335, -4288, 3910, -3978, 1229, 408, -51, -2904, 3835, -4264, 8625, -9900, 8166, -6327, 4332, +-4783, 1537, -2133, 5040, -6767, 5667, -5195, 6326, -4952, 1157, -3802, 6812, -3188, 2358, -2005, 2553, +-651, -739, -1799, 1882, 2461, -1016, -2344, 1845, 3319, -2512, -2955, 3647, -1802, 2645, -2635, 452, +3259, -1842, -85, -1227, 2047, -577, -1505, -2358, 5188, -965, -1031, -1927, -1533, 1049, 1613, -5328, +5504, -4256, 6444, -7351, 1433, 5158, -3744, -4848, 6632, -3342, 4220, -3546, -604, 3146, -1199, 2492, +-3813, 1368, 1985, -3665, 2723, 1661, -134, -1925, 509, 2112, -488, 1659, -2984, 953, -139, 2829, +-4397, 1940, 1748, -3702, 2979, -16, -755, -1583, -2114, 3529, 1204, -2275, 1836, -2048, 931, -1123, +105, -512, -493, 888, -2184, 4327, -2022, 41, -2800, 1647, 816, -3644, 1962, 952, -143, 578, +309, -2388, 2945, -3077, 593, -214, 4418, -2659, 158, -332, 5344, -9550, 6043, -2827, 5168, -3246, +3026, -2253, 4662, -3964, -1380, 1637, -739, 1801, -3570, 3619, 2043, -3062, -1498, -1244, 3754, -4664, +-1996, 2957, 1099, 2269, -3440, -2692, 1889, 1263, -6676, 2458, 4374, -2888, -724, -157, 3316, -2000, +-2732, -2470, 3033, 4998, -3560, -197, -852, 9769, -10342, 7977, -9895, 11785, -8457, 3811, 1199, 2911, +-549, -4267, 2138, 590, 832, -599, -5630, 9072, -4554, 2036, -4748, 3724, -4360, 2794, -1618, 570, +-1651, 915, -2760, 910, 789, -1787, -1980, 1219, -2037, 3740, -1742, 750, -1392, 119, 3115, -1002, +-478, -856, 3663, -876, 3385, -4199, 2989, 2391, -3691, 2926, -76, 2255, -1254, -4206, 5946, -1709, +2827, -6974, 6275, -2495, 1432, -4742, 3440, -2170, 4867, -6833, 1142, 1688, -781, -3652, -829, 1678, +2824, -6629, 4476, -2862, 5531, -4101, -1792, 2594, 551, -231, -3198, 4107, 3229, -729, -2274, 2177, +1086, -2805, 3413, -760, 2732, -971, 1167, -1162, 3038, -401, -3187, 869, 2839, -621, 962, -2500, +-177, 2684, -3643, 687, -1700, -1007, 251, 103, 1437, 1170, -5504, 2073, -1081, 2072, -2424, 1637, +-154, -1709, 3546, -1545, 1771, -4349, 4332, -1448, 4908, -3968, 2563, -2374, 4589, -1336, 912, 1981, +-2623, 1855, 1246, 1268, 1790, -1903, -4248, 4710, 1059, -2038, -1510, -641, 3574, -2604, -1569, 85, +275, 1404, -3736, 903, 4674, -6484, -259, -1620, 4457, 1183, -7235, 2621, 362, 3384, -4087, -2122, +2770, 2306, -3450, 1964, 435, 5568, -4002, -503, -909, 7700, -3809, -890, 517, 7839, -3312, -301, +-4220, 7122, -5573, 4390, -7369, 8791, -1577, 522, -4080, 2865, -1021, -491, -4073, 1965, 1477, -172, +-1471, 672, -1520, -282, -3416, -1823, 1433, 3854, -4301, 1870, -2231, 2553, -2141, 337, -1985, -493, +5061, -120, -548, 229, 3025, -4208, 2873, -2923, 2732, 1235, 270, -575, 6164, -939, -241, -6981, +6615, -178, 2340, -2929, 1748, -1104, 6057, -10451, 6966, -6523, 3852, -4198, 268, 3120, 1229, -7366, +517, -880, 5231, -9475, 2984, -2795, 5093, 328, -2566, -3492, 4055, -3523, -881, 953, 2852, -1438, +1320, -2739, 5699, -124, -1176, -1127, 1966, 3697, -624, -231, 3, 4266, -3342, 2824, -4195, 4577, +-5626, 5858, -2663, 304, 463, -1458, -2087, 561, 692, 546, -7104, 7477, -6493, 4375, -4388, 423, +-677, 453, -3348, -80, -1631, 2126, -1234, -1839, 2878, -549, -1723, 2769, -1757, 2770, -2184, 3023, +-1406, 1904, 2448, -3083, 61, 3450, 1044, -5020, 3391, -95, 1792, -730, 274, 231, -1999, 1390, +-2965, 1254, 3144, -4977, 1036, -953, 3569, -5825, -114, -2378, 469, 1481, -1756, -2949, 1344, 1506, +-783, -4297, 3500, -826, -2129, 1634, 1981, 1586, -2665, -897, -624, 3831, -1000, 1162, -5257, 7029, +1393, -1351, -3159, 5232, -4957, 6552, -7725, 5457, 297, -350, -2984, 2020, -76, 2727, -10342, 4363, +448, 2565, -4295, -3086, 3149, -600, -2556, 2761, -3014, 1093, 1419, -4181, 1320, 3448, -3534, -3051, +2407, 1427, 762, -3275, 1180, -275, 3091, -1272, -786, 50, 4607, -3278, 2211, -1176, 3008, -4506, +4689, -4569, 6095, -6554, 9395, -11724, 7017, -3883, 1481, -2868, 2454, -2587, 4908, -5072, 4904, -7918, +8568, -7500, 3096, -4921, 7270, -3384, -972, 958, -2825, 2163, -2800, -1829, 1358, 2823, 47, -2293, +3513, 263, -1765, -3941, 3629, 2933, -134, -448, -2815, 6378, -1072, -391, -5423, 3929, -1981, 4725, +-5446, 7437, -3304, 1645, -5272, 5450, -3202, 2406, -6817, 9057, -4734, 7148, -8519, -895, 1558, -829, +-1825, 820, 1167, -351, -1955, 3151, -929, -1510, -3667, 1887, -704, 6226, -5470, 2575, -1186, 2734, +-2553, -3481, 4395, -2446, 1007, 320, 6355, -4107, -139, -1571, 2880, 2058, -3154, 1099, 943, 3891, +-391, -4351, 4124, -2907, 634, -2327, 1185, 1464, 851, -2955, 2067, -694, 1714, -6018, 1559, 3018, +-2361, 764, -2694, 2408, 182, -2829, -472, -810, 1879, -1627, -927, 2945, -4277, 5868, -4623, 4416, +-4936, 6416, -4441, 5003, -3182, 3658, 253, -1698, -408, 2669, -214, -297, -2255, 2105, -328, 4079, +-4758, -2143, 6741, -3671, 1573, -3110, 1111, 2315, -908, -5044, 7740, -4836, 1815, -8199, 6431, 956, +-2974, -3556, 1568, 3454, 1152, -5677, 762, 1361, 2349, -4790, 4288, -1510, 5141, -5527, 1451, 1346, +2965, -5964, 1074, -1375, 8586, -5732, 1816, -3634, 5059, -226, -2839, -1205, 4623, -5362, 4569, -1624, +899, 1946, -6169, 2568, -1642, 1530, -221, -818, -1544, 1252, 3185, -3845, -606, -388, 2537, 822, +-3345, 4460, -5897, 6921, -3798, -1075, 2092, 1887, -5582, 4307, -2175, 4254, -2093, -915, -2208, 5194, +-956, -1309, -3307, 6711, -990, -3652, -2628, 5388, -2679, 3093, -9474, 10001, -3493, -537, -2223, -657, +4174, 796, -7085, 5410, 2543, -4354, 1252, -3774, 9237, -4118, -2180, -1346, 3086, 4041, -4497, -4655, +7002, -444, -4422, 3613, 842, 955, 1554, -7451, 5064, 2871, -6395, 3384, -5926, 12096, -4748, -4075, +360, -1699, 3676, -3746, -517, 3065, -1826, -1247, 3505, -2136, 2266, -4611, -2086, 4166, 1486, -808, +125, -802, 4090, -3429, -754, -894, -1579, 1723, 5708, -2088, -2339, 4312, -5645, 4432, -2798, 1996, +-1419, 1685, -13, -1365, 4133, -1249, -2328, -5953, 9906, -4913, 980, -2327, 3182, 4535, -7214, 1144, +-1263, -376, 3663, -5941, 5902, 2109, -1801, -6896, 5900, -1462, 2151, -6807, 4844, 1664, -105, 1500, +-6545, 4644, 3932, -8202, 2197, 27, 4256, -1705, -428, -1411, 5548, -7013, 929, -481, 1629, 3653, +-5713, 4904, 638, -2159, 2434, -5766, 6925, -2742, -153, 1374, -1123, 1942, 1401, -2921, -401, 597, +-1380, 2265, -3726, 4530, -1452, -687, 1908, -3479, 3173, 113, -1956, -980, 1021, 3758, -3076, -420, +-1716, 4559, -4180, 2473, -4002, 1292, 3817, -4104, 2388, 1727, -624, -1828, 795, 3569, -73, -2133, +-996, 5686, -4564, 7603, -7832, 2628, -900, 3081, -3530, 864, 711, 1419, -2502, 1447, 462, -1167, +-1772, 299, 873, 4303, -5349, 1104, -1256, 2514, -1923, -123, -1792, 2823, -4583, 3138, 4946, -6443, +3193, -2614, 797, 4617, -5995, 4993, -2730, 6589, -2691, -1581, 1602, 1199, -3566, 4442, -963, 1268, +1457, -6899, 7143, 118, -3017, -759, -1258, 2358, 2010, -5491, 1746, 2732, -1679, -1189, -5265, 4986, +977, -3491, -1602, 537, 3901, 386, -5524, 1307, 1518, 975, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8260, -9484, 1957, -1887, -5184, +325, -2169, 12905, -17931, -800, 12882, 3481, -4297, -14778, -2678, -7198, -15939, -4073, -3681, -5722, -4558, +-3081, -692, 6491, -1927, -7133, 12022, 240, 1672, 600, 1391, 1413, 2853, -6760, -9121, 6736, 3924, +-8528, 7015, 5506, -7849, 6052, -5879, -5139, -3426, -4065, 7262, -7326, 5072, 6858, 923, 2863, 3585, +-1885, -2956, -6173, -10560, -7787, -1469, 6858, -9543, 507, 5661, 11702, -4035, 3468, 8813, 2293, 14962, +-6340, -4, -147, -4703, -392, -3927, -12325, 4538, -9372, 4508, 3190, 5822, 16932, -4341, 19504, -5324, +5863, -4203, -7999, -11493, 4332, -12891, 5065, 2168, 5877, 12038, 1460, 3468, -12586, -1230, -3279, -12296, +5983, 10598, 2330, 17606, 2993, -10153, 7539, -11052, -10427, -7821, -13902, 7889, -4378, 14946, 3023, 9897, +9571, -6639, -11039, 7048, -10359, 931, -571, -8869, 11019, 1424, 10115, -9126, 5687, -15552, -875, 43, +6533, 3355, 468, 7031, -4914, 7801, 1788, -5853, -5617, 2055, -5074, 11763, -8547, 4725, -1881, 4111, +12001, -11598, 9297, -8823, 7455, -629, -300, -2771, 912, 2098, 3875, -4003, 169, 6063, -13510, 2479, +-9023, -185, 7274, -3305, 1610, 8114, 200, 8481, 8371, -1517, -7693, -12795, -16248, -6302, -2306, -118, +6652, 15178, 6339, 19177, 3687, 6650, -14145, -13716, -2222, -25277, 5807, -6456, 6062, 4551, 15997, 5488, +4646, 1904, -15206, 1593, -14837, 6032, -10102, -3081, 98, -780, 10199, 3931, 12536, -3283, -4120, -3440, +-12162, -726, -4083, -5986, 2320, 5599, 5815, 4359, 4257, 2124, -4877, 12828, -2705, 378, -9589, -12623, +575, 11972, -17800, 3679, -4707, 2788, 20408, 1299, 2270, 5625, -2817, -4341, -16321, -1480, -9182, -461, +8843, -11496, 7653, 2852, 3050, 7329, -3542, -4588, 8432, -5633, -2732, -2224, -3591, 1639, -434, -2886, +-4461, 6607, 12989, -9087, 9986, -242, 1014, 1248, -6244, 583, -7814, -278, 1992, 9861, -1630, 18347, +-6003, 10060, -7629, -6588, -23058, -2406, 2193, -22235, 11135, 4413, 23258, 8838, 16137, 2224, -3495, -9346, +-11235, -21866, -8831, -6319, 122, 160, 6266, 10896, 6502, 11184, 10653, 8982, -935, -2494, -16344, 1525, +-2893, -13801, -3625, -6354, 1963, 8019, 10748, 12233, 7449, -997, -1873, 157, 8496, -22775, 198, -3618, +-1755, 16272, -8329, 1650, 837, 6598, 4111, 2488, -2631, 5005, -17438, 15327, -25038, 17843, -14137, 12765, +4118, 9016, -5099, 15470, -11725, -4238, -7160, -14051, 18715, -14524, 8388, -16647, 8558, -3243, 12664, -12126, +7871, -701, 3855, -1495, 10949, -10328, -12373, 11235, -22408, 2423, -14262, 6161, -11152, 29196, -102, 15373, +-6017, 462, -15676, -2307, -1748, -5610, 18200, -9536, 3688, 441, 1848, 433, 6136, -10959, 7893, -13280, +13416, -5313, 12486, -814, 2560, 945, -8034, 5127, 1341, 4707, -2952, 15726, -13277, 19672, -13785, -14011, +475, -3662, -15754, 17390, -5788, 22557, 11562, 19051, -3500, -3035, -13661, -18967, -16493, -12082, -6760, -703, +23366, 259, 21349, 1499, 11227, 1461, -12752, -21888, -17321, -9201, 6742, 6278, 16174, -8540, 13547, -8942, +-3332, -963, -5516, 6278, -17557, 13457, -6816, 11003, 3439, 6978, -11195, -415, -7420, 5089, -3001, 10363, +-5205, -438, 18412, -10945, -1171, -16526, -5447, -6018, 2920, 3485, 10181, 2432, 25981, 10042, -4558, -12236, +-19037, -9257, -12675, -3432, -6833, 20082, -3564, 15467, 1616, 22977, -1105, 6866, -9191, -8713, 69, -8601, +-13413, 3407, -4734, 4529, 6193, 3921, 2917, 1591, 10251, -6148, 12454, -10501, -8853, -5466, 5733, -15954, +18805, -8225, 10992, -3368, -11734, 6575, -6130, 19095, -10698, 5891, -11535, 3056, -8583, 5301, -17766, 8587, +9205, 14605, 3407, 9622, 4303, -14082, -5882, -13276, 3454, -25682, 16696, -7154, 11383, 6048, 6210, 856, +12607, 836, -5947, 5161, -14601, -1269, -22534, 16231, -8650, 25164, -8624, 4347, -9327, 8141, -7303, 6232, +-3340, -4705, 6495, -8729, -1755, 4695, 7666, 9341, -3055, 829, -1093, -14303, -530, -5553, 1298, 6745, +2047, -7323, 7349, -18064, 15459, 5651, 17849, -16942, 7154, 6974, -5257, 9061, -29185, 14330, -22532, 8362, +-8603, 2271, -8886, 14627, 17760, 18010, 12371, 749, 613, -16972, -7292, -27853, -4879, 30, -8216, 7527, +15983, 7193, 19356, 5457, 1071, 4719, -4560, -24377, 4895, -5484, -319, -7097, -7945, 22101, -5965, 19053, +-8072, 5324, -15274, 7767, -15853, 4145, 6777, -7060, -6617, 11464, -4971, 5649, -3016, -440, 18110, -21924, +1993, -8826, -3766, 173, 856, -3663, 709, 25, 5532, -5081, 21951, 5035, -11611, 6650, -2794, 420, +-16589, -5759, -6712, -8666, 6507, 7092, 744, 9996, 8756, 5, 5459, 16174, -12546, 12550, -16905, -19226, +-20128, -923, -6463, 11689, 16501, 17634, 12527, 9439, -2646, -12313, -6307, -24840, 2830, 3546, -1819, 14361, +15036, 5265, -1880, -4488, -13532, 2546, -4415, -9812, -9108, 15488, -830, 4212, 10791, 9591, 615, -4540, +-5563, -16194, -3820, -6565, 14458, -5849, 11068, -13431, -2432, -4808, 17085, 3827, 5469, -4872, -6202, 2367, +-189, 17477, -26444, 11310, -9893, -5539, -2716, 3183, -6358, 7263, -551, 20169, 7319, 5902, -5254, -668, +-12220, -13078, -5232, -4238, 4407, -417, 14641, -8205, 22226, 3203, 367, 673, -7238, -18694, 3310, -11108, +6144, -278, 17145, -7330, 5338, 9770, -11308, 4534, -3001, -1788, 4132, -8528, -6864, 3131, -1426, 8688, +-9355, 2094, -6928, 5561, 7812, 8310, 4081, -7573, -3262, -6493, -5993, -5603, 5626, -9599, -7303, 12645, +13404, 21224, -1311, -14888, -231, 6365, -27266, -151, -13140, 2571, 7971, 12469, 10977, 12867, 5601, -12997, +7356, -12439, -4951, -3939, -12196, -7932, 13290, 12492, -3744, 960, 16754, 3867, 1385, 15822, -18982, -7237, +340, -8161, -10830, 979, 17153, 7849, 5604, 12706, -11251, 1871, -12524, -414, -4424, -2792, 17102, -13164, +13336, -11229, 5540, 2512, -6786, 3259, -22408, -983, 9537, 556, 11686, 1724, -6985, -2295, -15359, -3514, +-13252, 8685, 12013, 3026, -3469, 13733, 19088, -23857, -13919, 1300, -13024, -719, 7271, -12962, 2460, 24188, +-1210, -7144, 7068, 8908, -3090, 2201, 7879, -5989, -8638, -16817, -4524, -1222, 17207, 1395, 6555, -3435, +18825, -1105, -13950, 11922, -9827, -2077, 4549, -5457, -761, 5708, -5187, 910, 7425, 16019, -9381, -2545, +7742, -2064, 280, -21510, -5369, -5113, 518, 18303, 7850, 958, 16589, -9666, -12633, 11032, -8030, -18429, +-5039, 2923, -1925, 12596, -12036, 1779, 6421, 6060, 20, -11014, 14759, 4733, -19385, -5287, -3683, 5098, +-14014, 4278, -4338, 13228, 14737, -10253, -3880, 7985, -2743, -11825, -2145, 2907, 2001, -98, 7548, -13902, +13201, 3041, 4750, -14882, 3738, 4167, 2974, 1492, -6936, 5517, -8565, 4318, 6593, -13171, 7151, 9131, +-63, 8281, 5581, -10262, -6466, -565, 4644, -2519, -8980, -946, -10261, 13023, -5745, 15415, 7266, 18856, +-6182, -7494, -4645, 3920, -16146, -14961, 9054, 2289, -2246, 3646, 3231, -4462, 19659, -1326, -9538, 11113, +-5910, -24779, 2776, 11706, 9388, -3444, -10673, 6637, 15104, -8629, -4233, -19076, -918, 2005, -4050, 459, +-3075, 19261, -671, 9361, 14192, -1451, -2378, 1644, -24865, 13544, -16241, -10984, -3253, 3222, 16771, 8614, +2289, 1762, 2258, 7019, -7899, 5195, 1250, -8926, 12789, -10845, -158, 2995, -13128, -6796, 11055, -12769, +-4139, -548, 18657, 465, 7960, 4875, 13835, -7050, 3757, -18029, -12600, 1698, -11191, 4094, -6651, 3827, +1279, 12812, 5821, 7943, -27097, 14310, -5400, 5657, 419, -452, 8120, -13414, 2663, -1986, 18565, -29185, +-1993, -7588, 3477, 3071, 9437, -4845, 9745, 10618, 2701, -2475, 8755, -5800, -13654, 11474, -22516, 15498, +-11195, -1894, 736, 16216, -483, 3834, -20616, 12120, -1988, 24226, 4361, -5797, 188, -4777, -2092, -22506, +11600, -11086, 3149, 1561, 15740, -2353, 20191, -29185, 3424, -6285, 13830, -18059, 9205, -337, 10790, 14835, +-6127, 1404, -19114, -1331, -26479, 1452, -5154, 4049, 2629, 20066, 6663, 12981, -16074, 2481, -2908, -16823, +2159, -10833, 8976, -3504, -1408, 432, 6255, -778, 4377, -5006, 2538, -10059, 5751, -5799, 5795, 1337, +4338, 3260, 9545, 7513, -5823, -16812, -7645, -2550, 5385, 16659, -6026, 639, -10967, 24167, -477, -8394, +2534, 2971, -2417, -993, 985, 8862, 2656, -2477, -7859, 6400, 11691, -17981, -6734, -17096, 23268, -10068, +13552, -8299, 19553, 2091, 12993, -4819, -10924, 506, -21483, -9493, -5210, 6981, -10520, 8126, 7936, 17346, +-2130, 7011, -26833, 3225, -2998, -1669, -5813, -1963, 7252, 10448, 4141, 3001, 2574, -15490, -10875, -8309, +5986, -203, -6903, -454, 8510, 24500, 5920, -11319, 5310, -5143, 8966, -13975, 6254, -4018, -6787, 2005, +2480, -14835, 1015, 74, -11166, 11569, 19030, 7934, 6804, 18278, -13112, -9843, -9554, -6543, -19675, 6358, +4758, -1508, 2129, 8244, 15048, 1930, 8630, -10560, -4550, -5116, -570, -7998, -4742, 4320, 15584, 4476, +14740, -7614, -10446, -353, -87, -20116, -10635, 12670, -3631, 8221, 7471, 11269, -5723, 13191, -4690, 5345, +-9972, -1123, -14445, -8431, 14747, 4607, -11382, -539, -5330, -5107, -5205, 25127, 4808, -8404, 23782, 11011, +-7796, -12736, -12439, -23583, -1736, 10907, -300, -4083, 12735, 9275, -10498, 22290, -6405, -3974, -3502, 15422, +-3862, -14013, -8979, -2789, 7719, -7154, 23373, -7904, 6261, -12755, 1150, -4240, 8739, 1009, -16973, -3237, +26292, -8600, 4151, 4615, -20156, 22499, -351, 2586, -19805, 523, -8100, -1874, 9124, -842, 3352, 2452, +8934, -4686, -444, 10839, -2031, -1062, -1660, -1758, -2974, -4779, -3470, -4235, -15883, 12432, -6674, 12501, +21016, -6941, 8043, -2839, 5349, -21885, -14240, -9119, -3575, 4642, 6767, 10962, 15790, -4035, 13296, -5356, +-7418, -6502, -22119, -15300, 2372, 20802, 2256, 15852, 3484, 4131, 15466, -777, -25249, -5093, -14914, -649, +935, 3564, 520, 13662, 18594, -4013, 10930, -8110, -17270, -8201, -10241, 18403, 3049, 8720, -6550, -6405, +9928, -5987, -2432, -5693, -6963, 11033, 3363, 2807, 16504, -14072, -16782, -5281, 8994, -3549, -4449, -7145, +4424, 17569, 4331, 8292, -17215, 14772, -10447, -3543, -13375, -9510, 4181, -9493, -3530, 15571, 13459, 9834, +2100, 13147, -7995, -14509, 1847, -20649, -6117, 12957, -7678, 1617, 68, 19970, 5, 3690, -5651, -1975, +7362, -1357, -663, -10322, 10472, -1180, -6410, -6263, 8227, 509, 1418, -2984, -3206, 15580, 1378, -6061, +-5874, 12596, -2999, -846, -16140, 2402, 8326, 23322, -1477, -12664, -7252, 9362, -8673, -11804, -9790, 6162, +10389, 2915, 2473, 15746, -7849, -4215, 7043, -12788, 7072, 150, -16437, -17736, 10456, -13379, 2938, 9224, +24794, 1552, 4254, -10084, -5902, -14008, -735, 2411, 1357, 592, 12621, -3561, -9855, 14829, -20119, 20394, +-13537, 4777, -3009, 10554, -14343, 3845, 1988, 2868, 4796, -6174, 5264, -16707, 23428, -8943, 8613, -7757, +12260, -18009, 1421, -6585, 17881, -14917, 3049, 2384, -1438, 7116, -4865, 23651, -10038, 25989, -20442, -573, +-21245, 5748, -18105, -1259, 1343, 15118, 9612, 5157, 29196, -2618, -10214, -11665, -13169, -16606, 22190, -24561, +5766, 13330, 20803, -11518, 87, -8116, 11325, 6037, -3041, -685, -13257, -12762, -8510, 22557, -14925, 24030, +2657, 3723, -10124, 5662, -22103, 19279, 2159, -13069, -4126, -1765, -9879, 5420, 2400, 1095, 10445, -2665, +-6976, 5056, 8702, 5519, -18310, 6521, -6029, -9678, 5695, -4081, 19181, -29185, 14821, -6429, 2324, 14302, +8200, -7308, -8590, 11169, -10209, -10340, 3653, 7946, -2157, 9797, 2289, -3979, -8654, 14588, -17149, -7899, +-4678, 11460, -1409, -655, 12258, 5514, 7062, -3196, 7957, 198, -21152, -5691, -10349, -1120, 14566, -8950, +11424, -6766, 2735, 12142, 5681, -8415, 10747, -13631, -2054, -8131, 15541, -12674, 11165, 9284, -19179, 11944, +-14020, 5193, -16882, -3493, 11413, 15845, 1276, 1189, 15516, 2173, -15687, -9174, -3206, -14848, -280, 4137, +3051, 6985, 28224, -2745, -9247, -2083, -16088, -25520, 6840, 17497, -2466, 7148, 11872, 3304, 6249, 9721, +-6989, -15020, -16510, -13802, 548, -11578, 2042, 3740, 23021, 14606, 12462, -5448, -8144, 4279, -15727, -525, +-12431, -71, -11543, 4906, 8443, 3155, -11562, 17247, -3417, 16308, -6016, -1077, -5618, -10573, 17890, -17330, +10419, 4002, 1471, -1162, 6076, -25395, -3737, 15109, 3103, -6549, 13257, -2551, 6931, 5282, 618, -2533, +-5081, 15070, -10425, -1394, -9243, 2725, -6134, 13455, -15, -2030, 4608, 8725, -10426, -4302, -2158, 13448, +5614, -12351, 13851, -17080, 2626, 2725, -2090, -17271, 17406, -8565, -8406, -8782, 26703, -6363, -7917, 11825, +-7896, 8235, -13446, -1621, -11949, 18111, -2920, 4829, -14169, 10955, 12, 98, -17615, 8640, -501, 13315, +-7046, 6044, -10693, 7843, 165, -10668, 6292, -2174, 11473, -5144, 13505, -7217, 278, 1523, -6875, -10727, +12126, -2592, -2952, 9776, 12845, -1522, 3246, 3857, 1235, -20150, -1940, 5611, -12498, 7224, 1756, 10306, +2883, 11328, -10096, -3064, 1095, -5300, -11214, 12494, -9644, 9713, -6794, 4631, 10555, -7389, 4195, 4535, +-3688, -9965, -8979, -10126, 765, 22379, -4437, -11424, 19688, -813, -13761, 7943, -15, -17221, 8817, -8366, +-982, -3443, 22882, 2770, -20706, 15976, -7410, -3875, -15324, 10480, -20234, 13880, 7957, 9039, -8081, 22468, +2531, -21212, -8762, 12509, 3377, -5888, 4728, -20701, 4552, 4434, 12194, -10913, 13820, 2098, -1077, -9539, +4877, 12639, -11839, 1294, 10989, -14604, -1339, -1167, -1360, -6474, 5244, -1009, -11435, 19120, -6734, -5822, +2045, 13950, 8161, 10863, -18738, -1820, -19247, 4396, -18963, 5155, 161, 13766, 15709, -9037, 7723, -11709, +1360, -2019, 248, -11726, 2226, 63, 4090, 7098, 4347, 2010, 6456, -16993, -5391, -16019, 635, 9216, +15285, -11134, 21173, -3193, 2622, -7655, -1537, -5806, -5879, 27303, -20063, 19052, -7451, 3027, -18023, 17519, +-13347, 205, 13295, -6854, 4405, -777, -6225, 16165, 8106, -6626, 7166, -6968, 6184, -29185, 3590, 3042, +5993, 1633, 13484, 4810, 7435, -9834, -6543, -12611, -9524, 9862, -8494, 4529, 3248, 21512, -4992, 11973, +-5350, -8133, -24194, -463, -5430, -9041, -2480, 27221, 13510, 8502, -2751, -4820, -13751, 792, -6760, -25101, +4383, 13297, 8140, 6174, 7939, 3329, -14166, -1770, -5615, -10959, 9071, 7665, -5194, 2000, 3736, 3473, +-2903, 5754, 1664, -4227, 590, 10031, -11685, 4737, -3734, -3076, -1586, 20984, -14173, -10478, 16927, 6442, +-10195, 3209, -8246, 2423, 15150, 653, 3825, -3892, 22866, -11693, -23189, -18108, -2208, -153, 1933, 15003, +9544, 11355, 14154, -13314, 4434, -10049, -12045, 2492, -19984, 3757, 7465, 3049, -6534, 6195, 548, 11588, +-11289, -7276, -335, 5017, 545, -4895, 8250, 376, 11961, 5002, -18750, 5009, -1202, -21493, -8502, -4357, +6345, 13675, 11317, 11459, -11463, 10658, -943, -22044, 12549, -749, -1078, -8380, 12590, -8328, 3632, 6864, +-16161, -4591, -9143, 8403, -1172, 14993, 16726, 7239, 281, -8241, -956, -12212, 1799, -15806, -2387, 6795, +8001, 9383, 2426, -15295, 13602, 2679, -14922, -7567, 6871, 26120, -12165, 163, -2954, 4345, -2892, 1493, +-8388, -8415, -4351, -11233, 7812, 6289, 14236, 3459, -1582, -1341, 4755, 5264, -10107, -4252, -13679, 7087, +2675, 865, 1325, 1472, 2741, -10212, -5125, 7298, 2800, -12740, 12464, -7787, 22825, -2284, 4486, -3971, +-14148, -5410, -17959, 2762, 7074, -2454, 10937, 16029, -8150, -4307, -6238, 8170, -2445, 7425, -9407, -9142, +6765, 1914, -5449, -12334, 14994, -14194, 9194, 8034, 7610, 1150, -2248, 1658, -10563, -668, -18135, 7880, +-6916, 11276, -6550, 15817, 5815, 28661, -21022, -22435, -4952, -596, 9880, -14576, 10429, 1134, 5984, 5514, +2975, -3854, 7656, -9851, 4365, -2271, 11456, -5983, -12196, 2856, -965, 7375, 9366, -7495, 7680, -7220, +-1345, 251, -14245, 24104, 6360, -3793, -9220, 3414, -9337, -9576, -4411, 14791, 3966, 13155, -11450, -8338, +7270, -4607, -2598, -9941, 3706, -4764, 3342, 4709, 4948, 1840, 6341, 5166, -11060, 2472, -13077, -7391, +-15108, 7719, 1789, 14359, 8589, -1958, -97, -1094, 736, -14883, 3562, 10702, 8646, -9947, 4163, -12749, +-20241, 15031, 6485, -7359, 4815, 9752, 2082, 4502, -53, -4641, 11810, 2743, -19875, -13150, -5880, 17996, +1355, 4219, 11111, -3146, -5331, 12531, -6341, -17772, 13330, 4625, -6378, 76, -1424, -500, 9874, 5267, +3715, -4369, 5860, -624, -2770, -29185, -6216, 5593, -3232, 25210, 9392, 5830, 7414, 865, -15321, -13853, +15233, -11607, -11903, 19447, -8495, -17985, 5711, 7821, -11426, 14686, -294, -3323, 15822, 190, -6035, 11066, +-7775, 9605, -13725, -12770, -15083, -3308, 294, 6391, 11093, 3744, 16051, 8565, -2945, -4837, 21223, -19459, +-18725, -3193, -9170, -5372, 15195, 221, 5639, 21709, 3436, -23147, 6996, 6045, -9000, -5393, -10654, 4642, +6231, 4607, 20918, 2940, -10551, -2760, -10244, 4037, -193, -1256, -17823, -7975, -519, 15279, 2105, 12700, +5453, -9565, -3670, 6589, -6813, 1282, -1523, -8668, -5477, -2228, 208, -27660, 22403, -6585, 9152, 5046, +12734, 3452, 3815, -4288, -1016, -18978, -5548, -4860, -12531, 18079, -1660, 4385, 963, 19125, 3604, -12149, +17235, -6410, -14453, -4460, 1000, -7203, 5549, 20901, -16671, 15590, -5636, 8280, -8224, 7487, -3995, -7658, +5705, 2145, -4492, -11515, 16328, -29, 2596, 21919, -10081, -22767, 11190, -2682, -1639, 2712, 1115, -12071, +5434, -23, -3273, 13095, -4435, -546, -1328, -7098, -4365, 16358, -2141, -3979, -4833, -10200, -1458, -1543, +-21407, -1672, 11482, 14408, 7702, 20139, 15186, -29185, -2615, -9202, -24379, -10428, -3181, 7137, 17320, 21387, +3470, -926, 16826, -15448, 532, -6026, -15827, 1218, -12710, 7494, -7138, 5715, 19014, 16901, 1625, 8428, +-7645, 2107, -25364, 17970, -12062, -19770, 5208, 26207, 84, 807, 14971, -10667, 15602, -14342, 8224, -14094, +15339, -7421, -15654, 526, 9168, 7151, -9126, -3124, 7031, 8301, 13244, -7178, -15533, 14626, -11909, -18132, +-4903, 6318, -10022, 5067, 12590, 1836, 6671, 12523, -19740, -4777, -5327, -523, -13833, 2061, 57, 9051, +6378, 2357, 5199, -15603, 7221, 2186, 1056, -13681, 21848, -3875, -17184, 2509, 10222, -29185, 20109, 9274, +-11121, 11250, 13940, 10467, -16306, 7367, -6073, -18924, 5468, -5449, -2237, 8179, 5216, 11639, -2882, 20968, +-20685, -5896, 5413, 17331, -6983, -1634, -12433, -7824, 66, 8562, 10791, -10764, 13344, 5235, -11594, -23, +4029, -13051, -1435, 484, 3248, -6253, 11497, -1132, -13018, 22838, 1119, -2698, -5302, -2019, -23719, -6606, +18400, -6394, 46, -2344, 14038, 7590, -520, 2133, -9275, -6714, 4937, 1445, -7593, 1939, -20491, 11524, +9764, -7801, -9241, 8979, 1581, 10882, -3130, 15805, 12617, -15772, -6371, -15432, 12217, -24369, -6710, 6460, +-3239, 14056, 14055, 21138, 16436, -578, -12831, -25255, -5126, -4572, -21772, 9290, 10723, -10934, 29196, 4657, +-2051, 7154, 277, -29185, 1761, 6577, -27628, 8367, 10251, 12635, 5130, 11154, -22752, 3477, -11086, -3315, +9245, -9744, 8661, -2088, 480, -4358, 6067, -14242, 3000, 8419, 12453, -9656, 10998, -7380, 2082, -818, +-7552, -1241, -18465, 11266, -5641, 1252, 15361, 10444, 2690, -8053, 12172, -1410, 3652, -684, -17756, -8572, +8276, -4416, -1633, 11850, 1964, -1825, 13352, 17291, -21799, 17690, -12155, -10716, -3377, 5682, -17053, 4379, +16801, -7363, 10387, -15111, 13799, -7187, -10356, 9519, 13628, -16488, -6355, 5691, -2779, -4966, 2801, 3545, +-3386, 13794, -6115, -12101, -5584, 12229, -8695, -15172, -376, -5415, 8196, 9937, 16190, 1258, 6953, -3, +-9722, -4654, -21967, 3415, -9493, 735, 11455, 8707, -11196, -2849, 3060, 15469, 4616, 2959, -1464, 20842, +-5259, -15405, -2033, -19598, 6849, -11505, 10777, 6890, 8858, 5480, 6166, 26, 7630, -5385, -1194, 4927, +-7664, 3845, -9934, -5473, 8072, -31, -2680, 10135, -9964, 22738, -14447, 2802, -4628, -4182, 6027, -6021, +-9874, 9575, -11016, 11926, 10082, 1875, -4751, -17151, 15421, -14726, -675, 1049, -10016, 4517, -395, -8364, +7847, -2889, 19906, -1240, 223, -5918, 2965, -355, -13002, -24275, 6353, 636, 5333, 13303, 2678, 13176, +-6265, -4563, 3731, -2124, -10019, -4378, 1492, 29196, -13921, 4437, -13101, -786, 2027, -5654, 335, 9700, +13659, -7861, 9842, -401, -1743, -1912, 3521, -16155, 5291, 8566, -10881, -8642, 20197, 6161, -12725, -13915, +18739, 6813, -6718, -218, -10597, -3003, 3177, -12062, -4084, 8778, 29196, -8474, 1508, -12442, -15844, 4316, +-10167, 7120, 1560, 5797, -3580, -7256, 10095, 10923, -21611, 2385, 4552, 4686, -3885, -7655, -7100, 61, +3042, 1736, 11391, 7777, -8640, 1874, -5104, 5705, -7429, -19235, -759, 14085, 12083, 774, 21373, -13715, +6660, -10447, -10098, -14763, 14609, 15544, -14215, 593, 17199, -6101, -1838, -633, -14579, 12341, -4130, 10597, +-4713, 15568, -1711, -1652, 1916, -5495, -17521, -4582, -1427, -316, 6027, -8628, 24125, -15126, 26425, 5397, +-8264, -4628, -19450, -4496, 4383, -19957, 10813, -10805, 17359, -414, -4742, 10286, 1611, 10610, -22788, 9654, +-3504, -552, -3632, 10210, -26937, 14720, -9135, 6555, -7866, 7423, 6450, -11074, 11198, 7155, 4264, -9191, +3439, -4790, 13910, -11397, 4237, -14303, 4405, -2222, 17673, 278, -9247, 3589, 17965, -5577, -1401, -11191, +-5121, 22588, -7576, 8719, -4272, -4394, 5080, 6483, -4135, 3394, -22647, 8499, -1039, 7924, -10971, 7031, +6028, 6853, -4686, 1107, -8247, -2808, -9263, 3670, -4435, -6851, 25113, -19914, 5282, -11243, 8752, -13617, +3781, -11335, 17806, -12430, 17238, -11501, 8235, 19228, -23030, 11835, -27454, -1813, -9948, 572, 1803, 22493, +-1548, 6663, -7137, 19408, 1810, -807, -8032, -11553, 13420, -8513, -8454, 4887, 5675, -428, 8614, -13363, +11508, -10896, 17901, -68, 7504, 4633, -2909, -3154, 15251, -3673, -23259, -4914, 14211, -2959, -6914, 13001, +-6704, 11927, 7542, -11251, 2782, 5594, 5631, -10012, -2321, 9816, -11408, -15111, 18286, -2977, 3365, -6470, +-11794, 5035, 6647, -1682, -167, -6155, 5458, 1599, -9437, 8541, -2769, -8118, -13353, -4431, 20732, -6090, +17707, -14259, 398, 6477, -15426, 3826, -15128, 11367, 3269, 720, 2592, 5581, -1738, 17467, -23207, 6399, +4210, -16626, -6014, 7353, 20132, -17721, 5097, 13422, -9901, 895, 12396, -22348, 10580, -2188, 12972, 4132, +-928, 6614, -28651, 2746, 4892, -11060, 10049, -3678, -3184, 19187, -17201, 15333, -9852, 3690, 7997, -8917, +5008, -12740, 8606, 1170, -8804, -7586, -7355, -10604, 16269, -8851, 6854, 7483, 10161, 1067, -1207, 6094, +-9833, -11028, -8582, -9701, 7267, 6482, -11048, 9837, 8329, 10173, -10482, 4461, 10212, -24273, 3123, 10571, +-16911, 9933, -8694, 13534, 17800, -12827, 7961, -21017, 12527, 1877, -10088, -3234, -7249, 12025, 10311, 2589, +13595, -26556, -12304, 12703, 10929, 6240, -1847, -11092, 8207, -486, 3020, -11064, -3972, 6712, -7385, 6917, +-8906, -6418, 16953, 8300, -8508, 10217, -3166, 314, -748, -2938, -14218, -1259, 10583, -29185, 13014, 7252, +-1930, -118, 10054, 8151, 9558, -13953, 2788, -11538, 3717, -4764, -13687, 18657, 5804, -7469, 5859, -2505, +-12488, 4440, -8440, -3887, 7720, 13058, 2596, 13413, 8826, -20048, -2973, 11574, -18740, -10, -18536, 7043, +4562, -607, 12078, 8637, 9312, 621, -117, -4984, -11896, 4612, 8826, -12901, 518, -10728, 5413, 6712, +14733, -7559, -6411, 9372, 10484, -13046, -7207, 8091, -21560, 6494, 8408, 281, 4523, -2692, 6897, -8276, +11860, -2203, -12871, 10040, -12455, -13888, -1953, -8077, 10213, 4944, 5106, 14875, 3994, 3797, -4352, 11748, +-19601, -7209, -387, -15993, -6101, 9696, -5678, 18764, 5487, 1427, 1926, 5687, -791, -21998, 9942, 10626, +-20039, 17050, -1306, -5561, 7155, -8284, -4065, -9538, 2866, 2250, 2640, 23256, 8165, -17707, 12975, -5074, +11367, -19824, -6351, -4494, -11383, 23403, -4426, -9087, 19407, -1040, 5390, -3081, -15374, 6328, -10289, 18959, +-3305, 6845, -2127, -2455, 9566, -18420, 3701, -7843, -17527, 10357, 12588, -10270, 4056, 9803, 8142, 5098, +3308, -2321, -17542, 7007, -18027, -24452, 13387, -154, 5740, 16543, 4008, 8309, -8989, -7326, 2870, -12088, +1910, -20414, 19465, -2424, 4104, 10933, -17174, 7218, 7304, -6738, -8309, 9446, 1571, -5391, 2950, -6788, +5479, 8481, -3769, -15336, 15945, -8357, 967, 14459, -1436, -12584, 3040, 13701, -12000, -4686, 17431, -18159, +-15668, 20720, -12568, -7471, 14491, 14626, 7632, -1559, 4953, -22204, -4083, 4760, -21968, -10045, 5483, 24867, +13559, -6807, 10456, 4725, -11251, -9887, -396, -6337, -1469, 2155, -6639, 1038, 7558, -1502, 9495, -4533, +7536, -4752, 1273, 3599, 660, -2036, -8297, -3756, -775, 9323, -4431, -2406, 1474, -625, -3072, 18568, +-4801, 3896, 3102, 4504, 1817, -15035, 4642, -12152, 11834, -11876, -5459, -23, 16929, -7004, 15535, -8694, +5269, 7767, -20685, -9115, 3744, 18172, -14761, 14008, -608, -9181, -954, 12331, -22508, 793, -8493, -2966, +4767, 13185, 6287, 5012, -7286, 7221, -8608, 5782, -16341, 5570, 8173, -16594, 26169, -27158, 2900, -1895, +16806, -8184, 8428, 158, 1303, 906, 4544, -19577, -4747, 18096, -12391, -1893, 10854, 7274, -3764, 7064, +-8146, -2743, -10425, 6978, -785, 2921, 39, 1893, 10264, -9527, -831, -555, -387, 4989, -5877, 14542, +-11226, 4129, 8749, -13138, 8657, -11217, -725, -11634, 7723, 17, -2757, 17123, 10129, 6015, -1413, -12508, +-8155, 5865, -23336, 14090, -10262, 5764, 1116, 17573, 2168, -11566, 8035, -6056, -11859, 8300, 6512, -16101, +14119, -3145, -618, -6597, 10634, -8716, 1669, 3772, 5321, -10491, 7936, -4325, -14, -4975, -14385, 9828, +1664, 23464, -20581, 19401, -7153, 9546, 828, -10895, -14102, 12201, -15860, 12914, -3751, -3835, -2316, 14241, +-7781, -7226, 24350, 1146, 14589, -2055, -11420, -20199, 8829, -5067, -4755, 8292, -10206, 6492, 5038, -3156, +-2640, 924, 7769, -978, 2620, -7112, 10097, 18778, -14407, -1311, -6914, -18469, 8551, 1592, -13094, -9877, +10847, -1716, 17864, 12143, -4734, -2674, 7454, 4440, -15438, 3426, -17050, 1103, -11298, 6314, 1469, 2207, +-5909, -63, 1992, 17238, -2049, -9536, 6175, -2472, 14475, -14646, 4162, 6617, -1398, -13946, -14169, -2653, +-3830, -4220, 15755, 4362, -1798, 19516, -2954, 6203, -4697, 4650, -12934, 469, -11364, -15430, 11766, -1825, +13594, -30, 11585, -13198, 9198, -6106, -5164, -5778, 6149, 5203, 4792, 6779, 4806, -11626, 7923, -8828, +-16632, 11255, -15965, 1701, 15978, -8701, 7667, 19939, -1621, 62, -15371, 818, -14091, 9524, -6448, -16595, +29196, -3012, 12048, 7301, -10650, -24076, 1624, 985, -4820, -2644, 21453, -8462, 7462, 19732, -16789, 19187, +-12578, -13788, 6947, -7550, -7873, -349, 2710, 9149, 7459, 5535, -6248, 9819, 4218, -27177, 11862, -8718, +5519, 3165, -1981, 10373, -5978, 475, -9493, -10066, 10640, -2707, 15686, -5386, -1102, 9295, -7123, 587, +3426, -23687, 38, 4807, -4626, 11140, -6496, 7045, 13079, -5372, -4191, 8107, -17382, -8693, -3328, 9454, +-10221, 19024, -7267, -4714, 16605, -13845, 5024, 17213, -1837, -6899, -3480, -20741, -1452, 5225, 17536, -502, +11847, -5208, -7178, 10517, 130, -12054, -2168, 3803, 1153, 15698, -8381, 6823, 5, 246, -6933, -2180, +3907, -5504, 2890, -323, -8377, 6037, 6134, -926, 11015, -7570, 3195, -8639, 3809, 12866, -19792, -2156, +-6394, 5961, 358, -1495, 1272, 2349, 994, 7621, -11992, 12089, -699, 2402, -6725, 1313, -3907, 1770, +-8452, -3884, -12964, 2430, 12508, -3209, 25541, -5467, -909, 4245, -3182, -15637, -13049, 3035, 2953, 821, +17209, -18823, 6420, 10598, -6118, 21713, -14535, -9803, 24537, -14303, -6079, -12223, 3430, -4448, 17509, -196, +-4808, -2437, 10897, -651, 6045, 11679, -10153, 8933, -24001, -1318, -15022, 12156, 12075, -9990, -4988, 16556, +-8794, 23023, -8730, 3209, -14234, -6551, 4833, -19072, 9231, -5189, 1149, 4859, -3595, 8839, 22309, -16824, +-1336, -12717, -4301, -8081, 6124, 2967, -5271, 14535, -6941, -9779, 21769, -5475, -11276, 11685, -5108, 1138, +7029, -11501, -5427, -1245, 15862, -16898, 9391, 9706, -22088, 28430, 6990, -6587, 11297, -18684, -10989, 8402, +-4126, 4902, -21048, 29196, -19670, 13321, 7227, -6851, 10393, 644, -7835, 1275, -3641, -2927, -1720, 13675, +7202, -29185, 15527, 7069, -5418, -8262, -6421, 10181, 7577, 3048, 6854, 134, 2918, 3101, -29185, 8581, +-3279, 1194, 10949, 198, 4654, -8539, -8289, 3333, -9665, 144, -3876, 11840, 2873, 3398, 22940, -3082, +-1868, -5849, -19234, -9417, 1724, -11781, 3314, 4534, 10572, 1016, 4178, 22584, 6167, -12801, 3224, -5557, +-2697, -7031, -12809, 74, -6263, 13891, 7487, 5368, 156, 3863, 2778, -2422, -8311, 1857, -9381, 22614, +-9995, 312, 10402, -1396, 7233, -13008, -13536, 7808, -3050, 7284, 5022, 3936, 3003, -10845, -3955, 2087, +-5283, 7695, -1291, -4542, 18781, 79, -1169, -6399, 15941, -22398, -13852, 981, -22341, 6529, 12838, -16452, +6542, 14652, 10416, 13704, -6873, 1968, -10762, 2641, -10524, -11665, 1597, -8287, -7857, 11761, -14808, 6697, +15646, 1988, 6135, 14457, -482, 1514, 7710, 8757, -21656, -7887, -19580, -12077, 15752, -7043, 14012, 9051, +18459, 7994, -9080, 4405, -6879, -10189, 21977, -11186, -13170, 15300, -6397, 1562, 10895, 4472, -19755, -1158, +4398, -12252, 7102, 14698, -22999, 19578, 7176, -16340, 15731, -4515, -583, -3571, -2500, -16376, -158, -2512, +6846, -3348, 10885, -20511, 4918, 4314, -5633, 7009, -3278, 5955, -3641, 52, -9352, 15955, 1093, 5763, +-29185, 6011, -8479, 2251, 5201, -7217, 9409, 4998, -711, -5386, 14654, 8780, -11021, 6905, 9619, -19025, +9004, -9984, -6050, -4411, 3316, 5421, -1765, 13932, -8779, -6743, 24409, 363, 4753, 4233, -2187, -9933, +3852, 525, -1797, 196, -15701, 466, 3126, 10476, -7350, -2017, 4652, 2351, 6066, -5290, 4323, 11812, +-6006, 11538, -17217, -1849, -8471, -11083, -13047, -3527, 2471, 20420, -6882, 3230, 18365, 6468, 3023, -6637, +-15892, -23911, 3009, 15, 8978, -5594, 6940, -4196, 11221, -2744, 10510, 5129, -23896, 2031, -7838, -5634, +8088, -7065, 11454, 23921, 5126, -10452, -7009, 11669, -14412, 9481, -7109, -9699, 10132, -3237, -9924, 8425, +6564, 1161, 6270, 4793, -3897, -8647, 21958, 929, -1172, -2137, -11177, -8619, 1678, -10484, 1059, -2361, +-2547, 11927, 9114, 13633, -839, 2918, -4305, -4806, 6815, -19658, -5946, -8031, 811, 976, -5213, 13032, +-3080, -6323, 16172, -12498, 9448, 9037, -6741, -1825, 1281, -3069, -7148, 9683, -18568, -740, 3532, 2316, +-5998, 6464, 3370, -8801, 17926, -14398, 1462, 12311, -1060, -1042, 2634, 8242, 1680, -2787, -643, -11163, +2971, -11490, -13964, 18875, 4618, 10948, 3834, -10915, 15329, 15989, -3115, -8696, -1140, -5711, -7317, -7414, +2059, -68, 21548, 594, -4713, -5574, -7266, -2701, 3744, 838, 597, -2615, 19239, 839, 7822, 3993, +-20546, -6528, -3884, -11127, -4682, -1009, 11551, -4265, 8602, 5355, -8104, 4485, 7987, -4698, -2659, -4826, +5727, -5141, -548, -8958, -1652, 10801, -10292, -1676, -10223, -10749, 20144, 2646, -11078, 29196, 16768, 4136, +-7252, -1644, -17650, -10285, -12771, -17059, 9168, 12726, 17953, 5998, 11278, -4268, 14728, -11482, -135, 5413, +-16880, 3871, -3228, -2295, -709, 10749, -5953, -8674, 8994, 7877, 2857, 5195, -6560, 1999, -7614, 497, +529, 323, -5819, 4698, -10253, -9759, 14262, -8945, 8871, 902, 2006, 3435, -11968, 1490, 791, -8869, +-5658, 1957, -2076, -6303, 12669, -5019, -10305, 21650, -4049, -8388, -4571, 6113, -13102, 2751, 1878, -5575, +2142, 11409, -9783, 3899, -463, 7277, -7020, -670, -7127, -4531, 10610, 7660, 11656, -9827, 1683, -1077, +5232, -12792, 7875, -6099, 3585, 547, 4206, 343, 17494, 2060, -6172, -3310, -4545, 2119, 3316, 7679, +-4158, 3441, -9068, 13179, -19288, 6252, -9029, 13766, 4096, -1302, -2440, -3479, 2894, -13581, 7865, 3121, +-2400, -7517, 14312, -11362, 8398, -1006, -8455, -12515, 6419, -20171, 12462, 4401, 5006, -2624, 5358, 3435, +-3833, 7217, -20376, 7950, -6583, 17423, -17969, 9247, -10182, -3157, -1183, -3597, 7495, 6956, 9836, -6007, +4902, 11102, -2796, -9566, 2039, -6089, 6255, 9103, -13950, -9915, -809, 7052, -2909, 5086, 202, -2228, +29196, 6843, -8072, 5530, -4021, -13881, -12025, -9830, -6949, 21003, -7335, 2032, 6112, 5979, 5225, 11567, +-14778, -7222, -1177, -6490, 1077, 14734, -10185, -8197, 6745, -1398, 1867, 52, -9243, -6399, 16421, -2943, +-3266, -5879, 4219, 2371, 9539, 2061, -218, -7980, -15679, 8567, -5241, 13843, 4817, -1128, 7540, -460, +-5381, -3031, -6555, -2537, -4433, 4941, 10433, 7325, 7160, -6422, 11140, -5201, -11039, 7583, -6289, -4292, +10066, -7472, 6393, 4127, 4442, -10616, 534, 9040, -13090, 4973, 4716, -7449, 17769, -4704, -3854, 2033, +-1034, -469, 2103, 6237, -15836, -9215, 7401, -8874, -5579, 13490, 5108, 996, -1221, 8520, -4813, -7978, +4181, -4614, -5896, 1700, -1993, -7035, -5944, -2388, 10842, -11135, 3567, 11784, -679, -3119, 6973, -255, +-13155, 6268, 13827, -21240, 8101, -6347, -12194, 4349, 10243, -6931, 7196, 6404, -5999, -1430, 2776, 244, +-1153, 7098, -5801, -1195, 22530, -8530, 4352, 1262, -7044, -17589, -1914, 5381, 7108, -2822, 189, -11518, +21966, 1388, -2397, 9382, 1268, 6119, 6594, -19049, -4010, -1874, -10445, -1465, -8169, 10445, -18313, 3121, +12509, 6262, 12708, 1058, 1540, -5556, 1671, 1618, -8715, -11273, -2734, -10619, -1639, -14408, 13075, 8725, +-5063, 10766, 13977, -11059, 382, 10145, -6454, -11700, 5247, 2146, -17444, 18163, -4974, -8913, 11011, 3231, +-3457, -1947, -1334, -3938, 7911, 3012, -4070, 2348, 15655, 3436, 15160, -18441, -10711, 9275, -8624, -9796, +10832, -3166, -7541, 10201, 290, 1624, 3610, 2866, 8155, -1958, 17014, -18780, -1051, 8312, -19593, 3658, +-8919, 17068, -19389, 15614, -17010, 3176, 11370, 6348, -1358, 16382, -13255, -3375, 3003, -18731, 7341, -2444, +-8654, -6135, 19822, 2531, -2900, -3138, 78, -18964, 15514, -15227, -4186, 18007, 2096, 2395, 8115, 2965, +-11176, 393, -7144, -12095, -5680, 2626, -3988, 17895, -6328, 2831, 5926, 6813, -6234, 12752, 10846, -5042, +-18501, 4176, -1795, 3120, -4621, -13941, 8241, 1864, 1831, -9144, 18611, 1482, 14264, 6734, 1974, -7541, +-5140, -7859, -15767, 3921, -4420, 1768, 792, 20116, -9425, 2194, 3252, 15637, -20222, 3761, -88, 1102, +7792, -18322, 9297, -18142, 110, 7889, 7915, -11153, 18207, -1763, 1664, -6820, -1414, -10833, -2781, 12156, +-371, -9050, -4346, 15847, -8006, 8805, -1383, 11473, -9561, 2554, -8383, -5145, -23, 796, 3957, -3919, +-4468, 16401, 2599, 10336, 7004, -11644, -4329, -5891, -9938, 6935, -500, 588, 5997, -618, 8733, -445, +11772, -25802, 3482, 8250, -901, -1287, -3693, 268, -3540, 7928, -667, -12029, 1630, 12644, -3606, -4613, +447, -4769, -3998, 1890, -3064, 4525, -1630, -723, -127, 11461, -756, -2378, 4268, -21861, 1831, -11546, +7216, 4224, -1562, -4753, 8915, 6607, 9137, 2194, -4624, -18347, -4429, 4921, -4570, 4199, -6721, 5644, +955, 8366, -5394, -4576, 14811, -2523, 2082, -1641, 3912, -9506, -7804, -2248, 5584, -7601, 11130, -932, +11887, -766, 16587, -16071, -1995, -954, -6675, -848, 942, 2189, -2252, 8255, -7385, 12269, 4331, 3557, +17476, -18331, -15279, 1895, -5336, -7740, 7017, -9834, 3262, 16540, -1703, -4697, 21914, -12896, 4290, 681, +-9729, -6863, -713, 5507, -16868, 5213, 1775, -11966, 881, 12231, -6111, 6174, 13077, 766, -450, 10010, +-3686, -11365, -18431, -7945, -4777, 9545, 12820, -3264, -878, -1479, 20956, -1598, 474, 37, -18539, 12734, +-3062, 1222, 2803, -12132, 16237, -7893, -4146, 8930, -6419, 10554, -506, -4146, -5748, 4472, 10155, -10209, +2101, 8457, 5960, 3051, -4404, -15974, 10397, -4123, -4284, -13262, 2060, 7913, -3934, 22369, -920, 1043, +-2737, -8445, 4785, 5149, -15233, -7321, -2561, 8798, 1208, -8363, -3231, -4000, 17020, -9646, 97, 17475, +-12913, 1687, 1204, 4855, -6096, -3636, -8641, -8486, 4941, 8079, -6445, 6468, 8779, -1001, -4863, -6949, +-429, 9971, 11136, -4510, -8481, 4695, 7559, -7465, 1951, -12042, 4457, 16406, -10369, -4117, -5893, -2528, +6578, 11473, 3324, 2333, 2718, 618, 5850, 712, -14104, 483, 3609, -6261, -4078, -9375, -8876, 1313, +10547, 9637, 3163, 12556, 14164, -1760, 2095, 3094, -29185, 3295, -17931, -12442, 1014, 2949, -1221, 9888, +7307, 11022, 19100, 1692, -8707, -1552, -9676, -13767, 2458, -3065, -4402, 3769, -6505, 5515, 8723, 3663, +-6012, -3050, 8459, 2552, -1550, 13422, -5045, -7282, 10584, -16354, -698, -7057, 97, -1932, 11407, 8287, +-7209, 9940, 4392, -5102, -3618, -5837, -12645, 7427, 6327, 3045, 3757, 2981, 3496, -9164, 8079, -4278, +-11701, 4798, -27758, 1642, 9240, -17, 17021, 1831, 3213, -456, 4801, -2356, -12398, -5890, -7641, -10534, +14786, -12375, 354, 12242, -1497, -2390, 7307, -5552, -3214, 6349, 9984, -18176, 2815, 3560, -7563, 6697, +-7557, -3031, 5725, -1373, 2967, -9238, -3020, 14640, 2202, 16474, -21781, -1751, 8812, -9211, 10635, -900, +-2533, 5354, 2173, 3624, -8219, -1785, -313, -13861, 12799, 1291, 7686, -2101, -611, 11616, 6365, -13883, +3075, -9501, 6318, 177, -2033, 2023, -11572, 5401, 8360, -6698, 3530, -4963, 6979, 7629, -8633, 9147, +-11152, 718, 782, -19233, 2379, 8050, 12091, -7627, -12496, 16977, 4694, -7638, 2623, -16251, 3532, -8131, +8627, -4114, -5801, 15864, -3054, 1786, 5984, -472, -2483, 5254, -3930, 3597, -20379, 1718, -9809, 3658, +5442, 2516, 7086, 11491, 6088, 3921, -8356, 2434, 3288, -9763, -1070, -12714, 2448, 1435, -4801, 5675, +4915, 1364, 5826, -4508, 16668, -1936, 4941, 1158, -14303, -3818, -1312, -13849, -5920, 6155, 11391, 622, +-3340, 11434, 3122, 9515, -7380, -11573, -4607, -1710, -1179, 13315, -8162, 4540, -1235, -2944, -817, -8093, +19187, -16135, 79, 814, -9105, 8602, 6058, 6303, -5739, 2706, 11136, -2780, -2706, -345, -29185, 10307, +-6284, 7872, -1582, -1, 13736, 4965, 5320, -2583, -8444, 6428, 3601, 4345, -1582, -9182, -1132, 4974, +-9717, -2449, -4943, 8191, 3310, 2430, 16752, -7123, 13941, -5918, -16030, 11715, -10380, -6248, 9974, -15010, +19602, -10784, 12879, -5294, -17704, 15915, -13243, -4596, 1208, 2907, -5652, 9037, 2063, 117, 5504, 12373, +-8764, -399, -4125, -14970, 1339, -14744, -14243, 9738, -5343, 12707, 10050, 4188, 22847, -4030, 2515, -3866, +-17429, -528, -9174, 4140, -18646, 2729, 12268, -11161, 12791, 3215, 9655, 7053, -3756, 2800, -6400, 8025, +3791, -10104, 3683, -15607, -11575, 10686, 1675, 5587, -4341, 5997, 20863, 1689, -5427, -3583, -13689, 1350, +-1363, -7922, -215, 6858, 16042, -1056, 4639, -9757, -7524, 10479, -18824, -6702, 5273, 631, 290, -4947, +1394, 5221, 2982, 16880, -13280, -860, -1858, -5167, -5633, -12059, -8632, 4554, 11608, 14342, -7317, -1443, +-3927, 4523, 4750, -6589, -2402, -2683, 6121, 3279, 10349, -11081, 4979, -14047, 7678, -9662, 3045, 13235, +-6591, -75, 15604, -557, -986, -1660, 2008, 2666, -6539, 10457, -21575, 9708, 7666, 2153, -3982, -3820, +-4612, 4065, -1165, -3054, 5430, 2919, 8379, -2533, 7074, -15457, 5605, 11906, -5442, -17446, -8413, -3957, +15447, -3167, -787, -9695, 7952, 13261, 1944, 5483, -11179, -3426, 4708, -9043, -7282, 3870, -17944, 13915, +-9162, 7136, 4613, 6756, 3105, 242, -5951, -3554, 808, 225, -2183, -9972, 7925, -7966, 13702, -9281, +13322, -2770, 5651, 14888, -16172, -6332, 8168, -10042, 3259, 2404, -6814, 6447, -4045, 10598, 4004, -1043, +13020, -4696, 1260, -2480, -2706, -8738, -5835, 1089, -2143, 6767, 4680, -1334, 4192, 4067, -86, 8576, +-24534, 16079, -5159, -6812, 14551, -20482, 3726, -5394, 7072, -3595, 3430, 3578, 566, 235, 4314, -10149, +-3858, 11168, -3980, -308, -8446, 7501, -8785, 3320, -3979, -7355, 5541, 11690, -3563, 5005, 7418, -8876, +7020, -25133, 15174, -14028, -243, 10411, 707, 2734, 12747, 3191, -9099, -8254, 6180, -4224, -2332, 14603, +-10723, 2262, 3002, 8961, -10357, 2280, -2926, -6202, 7202, 10732, -13284, 8254, -2277, -1146, 12925, -8914, +-10684, 6162, 7142, -4006, -14838, 5144, 8503, -7184, 13081, -12481, 11643, -9994, -5357, -1868, -4633, 10294, +-5149, -7135, 11461, -2362, 3638, -12313, 812, 14018, -12341, 2167, -7064, 5237, -1261, 4260, -101, -8739, +-920, 11087, -21006, 3145, 3760, -1076, 6129, 9177, 1720, -581, 8394, -5010, -1161, -12881, -2428, -10001, +5458, 1373, 13087, 515, 5441, 11052, 279, -2897, 4043, -9951, -3285, -8706, 12167, -1945, -6857, 18295, +-18357, -9932, 16595, 11287, -1755, 7022, -7882, 5726, 1967, 2785, -18429, -722, -7212, -3279, -9864, 8765, +5449, 4719, 4740, -3422, 18089, -4527, 1719, -18324, -3854, -12560, -4970, -3380, -6427, 14072, 13921, -6333, +15419, -8527, -11710, 7735, -7944, 1542, -9372, 4793, -3798, 6083, 6127, -414, -4764, -1328, 215, -1664, +-1907, 9842, 3515, -8942, 2941, 4666, 4902, 172, -2707, -4570, 195, -2636, 11449, -5650, 10472, 8934, +-9234, 7785, -9825, -2721, 1395, -5106, 2305, 1689, 5977, 16478, -11846, 4851, -7831, 2168, -7217, 5075, +-4612, -1783, 1084, 1114, -2382, 8054, -20996, 1291, 19427, -3267, 10838, -5079, -13142, -7990, 10610, -13617, +-8666, 6738, 8896, -11298, 16584, 906, -9524, 5978, -10777, -3913, 4703, -4122, 1314, 4956, 4103, 13356, +-13115, 3685, -11025, 10808, -1128, -8357, 3062, -10391, -1541, 6531, 9473, 3245, 7849, 14072, 4020, -13884, +10120, -14385, -8008, -3752, -10824, 7695, 3063, 3458, 9940, 4478, 10389, 5781, -12385, 13317, -7671, -2230, +-3534, -6770, 1062, -8259, 1382, -2782, -988, 15199, -2251, 3057, -4731, 10792, 5303, -22666, 17778, -11529, +-12432, 7604, -11507, -5189, 9975, -2179, 6167, 1138, 8236, -1424, -818, 142, -7838, -15659, -6038, 3367, +-3480, 8887, 14631, 8430, -1609, 8114, -7847, 3909, -9989, -7600, 3378, -11351, -2606, 1887, -3113, 21575, +5590, -7905, 8880, 5141, 9571, -9227, -1846, -5730, -17250, 121, 10311, -10547, 9421, 1559, -9576, 332, +13469, 222, -3270, 15535, -8534, 206, -392, -8878, -9526, 4148, -1531, -368, -1453, -4799, 12311, -6588, +6487, -2063, -9213, 777, -6798, 4107, 3114, 4159, 5241, -19710, 11480, 1913, 2000, -5208, -9040, -2680, +1174, -2082, -8699, -4251, 20878, -451, 6058, 10621, -7985, -3650, 350, -20, -9197, 5147, -6983, 3795, +1839, 13893, -13147, 5833, 11837, -19213, 3194, 6813, 3783, 3209, 3494, 2569, -692, -10666, 7099, -8365, +15605, -12428, -720, -715, -2865, 14938, 984, -2110, -6557, -7112, 8654, -7789, -718, 1540, 3057, 12936, +-2543, 3779, 1165, -3883, -13541, -11330, -17029, 2055, -1923, 15718, 9939, 3879, 10549, -1256, -3906, 5685, +6365, -14210, -8333, -13692, -4943, -8732, -726, -5438, 12941, 11276, 4605, 17894, -883, 12829, -5146, -24378, +-649, 3259, -6201, -5342, -14969, 14275, 507, 7034, -543, 1737, 10057, 1664, -2204, 7242, -8734, -3323, +1724, -6258, 12046, -262, -795, -15026, 16906, 7315, -10333, 6685, 2835, -8701, 2522, -12745, 5440, -1345, +668, 18466, -11104, 6793, 5420, -7431, 251, -621, -2119, -7209, -12824, 2802, -399, 5047, 5420, 3124, +12, -2061, 4114, -2864, 3447, 143, 1698, -11985, 1331, -9421, -2810, 10139, 1633, 990, 508, -869, +2765, -4577, 13527, -11917, 4918, 3729, -4687, 5143, -10392, 8701, -5172, 967, 2986, -9774, 14276, -1962, +-2512, 13568, -5538, -1337, -14225, -32, 14619, 8958, 2527, -3314, 1042, -5470, 9104, 3471, -15508, -14347, +8731, -12551, 8899, 6472, 9086, 10954, 3545, 6375, -3179, -10096, -2330, -18263, -6415, 492, -10968, 6731, +5750, 8091, 2242, 6145, 1258, 1763, -6414, -9552, -10407, 4190, -3407, 151, -2654, 1223, 521, 7703, +-5841, -1625, 5251, -4247, 6885, -10463, 10602, -8796, -4274, 478, -1762, 825, 179, -990, 14729, -4749, +5614, 4085, -2012, 8070, -13302, -3286, -4034, -997, -474, -2299, 5407, 2322, 8023, 15540, -3165, 9712, +-21143, 117, -1794, -628, 4461, -16960, 6062, -1648, 2986, 3447, -6725, 6313, 9094, 4632, -8801, 4223, +-2938, -13176, 5679, -642, -9436, -7999, 5726, 87, 2464, 2301, 5838, 1876, -918, 1554, -4062, -6906, +856, -5970, -2701, 6246, -2490, 4633, 644, 4639, 3515, -9149, 652, 4792, -11211, -2524, 8123, -2165, +14468, 4048, -5918, -2567, 10645, -1418, -8701, 1431, -7433, -1543, 7678, 532, -1785, 10076, 893, 2360, +-3060, 10950, -5322, 4264, 3088, -16786, -8898, 2611, 3293, 12963, -1179, -1843, -5337, 5153, 2616, -7707, +56, -2796, 5929, 738, -2330, -6648, 2928, -7191, -1692, 3977, 1957, -2707, 5963, 591, 6456, -5412, +-5571, -13261, -4507, 8224, -10595, 2279, 7240, 7977, 1222, 8036, -56, -7467, 4378, -9740, -12009, 1015, +-8030, 10472, 7655, -461, 3123, 3096, 2128, 5065, 7717, -8674, 2048, -8687, -1423, -8090, -7364, 9484, +11830, 597, 1797, -2210, 6274, -291, 11405, -7348, -17338, 15050, -6828, 7783, -11080, 7377, -195, -7795, +7898, -12146, 3001, 12168, 6270, -1075, -3401, 1506, 648, -9227, 3087, -11624, -2334, 340, 5082, 7142, +3403, 342, 2134, -5016, -7327, 5679, -12535, -1602, 7695, 10060, -6497, -5411, 9910, -8245, 5113, 4385, +-8958, 2378, -14736, 5186, 6949, 2552, 5886, -8197, 7117, -805, 847, 1312, -105, 2350, -7167, -8053, +-2, 8710, 1082, 970, 4361, 11618, 941, -10499, -4177, -4333, -1925, 5466, -4800, 10933, -5326, 3251, +10305, -7176, 5090, -10436, -8521, -2169, -7, 14857, -17343, 5471, 12433, -9737, 8392, -2865, 6333, 4511, +2440, -12377, -16143, 6866, 4098, -3471, 514, -5049, 255, 737, 4171, -2275, 4275, 5464, 3011, 10191, +-3371, -12714, -1553, 5101, -8993, -18820, -2390, -663, 11178, 10355, 661, 11125, -17094, 13542, -2011, -9419, +3697, -2096, 2825, -8731, -1230, -9764, 4563, 10792, 2064, -5000, -1373, 5348, 1853, -1782, 1975, 1573, +1874, 2708, 2471, -7041, -1358, -9692, 4577, -4903, -3207, 13716, -8085, 15562, 7924, -3443, -5899, -7903, +-4217, 2178, -1087, 9977, -12972, 2466, 2919, -4147, 2234, 2553, 5449, -4336, 4541, -7835, -10122, 8670, +4071, -13264, 6355, -7211, 702, 10525, 4746, 324, -8143, -6514, 11188, -1629, -10918, 3425, -2844, 10884, +-5221, 914, -4223, 1591, -1497, 5240, 4798, 4815, -910, 5235, -5819, 35, -1844, -12369, 17744, -15232, +1141, 2446, 7436, 13624, -4077, -2687, -1673, -3640, 18089, -18025, 3982, -5603, 5359, 12625, -308, -11492, +-2098, 2323, -4756, 536, 3944, -6053, -2005, 21436, -16799, 7742, 566, -9622, 912, -3576, -7975, 6259, +-4154, 2982, -4357, 2922, 10894, -11663, 12996, -12043, -1048, -6569, -6798, -79, 3766, -905, 3766, 7056, +14778, 1018, -14954, -8086, -5324, 15681, -1837, -4305, -1706, 3691, -1297, 3913, 3417, -2289, -8059, 13393, +3768, 990, 6495, -2058, -3625, 3964, -2004, -12070, 1116, 3017, 6075, -12344, 16995, -723, -2257, 7472, +-1856, 4204, -3530, 6494, -9081, -4450, -1406, 5321, 42, 4336, -6134, -6058, -7542, 10700, 211, -1456, +2464, 4269, 2928, 10857, -5376, -11502, -2582, -14576, -6134, -9428, 3439, 12709, 12066, 11264, 6184, -8978, +1125, -18020, 4584, -9630, 2435, 7541, -7476, -679, -2000, 7585, 6108, -6668, 12091, -2543, -7796, 17332, +-10420, 3205, -10190, -686, 2169, -973, 8421, -7427, 1268, 4923, -608, 10173, 7428, -13148, 6180, -5449, +-6151, 359, -13880, 3845, -70, -754, 18592, -4212, 7746, -3404, 2499, 2148, -15424, -634, -9834, -1665, +6591, -11896, 15879, 5333, -11978, 10421, -13975, 8856, -5062, 9984, 864, -9800, -5392, 3559, -6503, -10758, +-1340, 309, 15101, 3536, 5409, -7099, 7136, 273, -7130, 7189, -17533, -1763, 6061, -2990, 7475, -6551, +2874, 14430, -7404, 12327, -15318, 6232, 985, -7126, 1840, 87, 4632, 6083, -1960, -2963, -2019, -5274, +6941, -3993, 8829, -7647, -628, 2086, 1866, 4361, -2527, 1020, 5015, 1465, 1041, -17001, -1309, 6646, +-6129, 713, 175, -3638, 8831, 7881, -977, 3322, -2217, 8088, -26480, 5961, -5812, -6019, -179, 4456, +7913, 6622, -1831, 9370, -9008, 2923, 312, -19303, 8047, 1706, 2237, -14273, 13486, -8051, 3683, 5196, +-8595, -2640, 13413, -312, -3443, 5718, -5003, 4146, 9181, -11706, -6739, -7435, -2203, 7209, -6520, 16438, +948, 5173, 9956, 663, -3866, -7111, -8308, 1795, -3678, -4631, -7224, 10563, 4444, 14799, 5306, -3357, +-4838, 12388, -14582, -5033, 420, -10924, 2064, 8022, -2075, -519, 2729, 14126, -9372, 5108, 7038, -11395, +10627, -11386, -13818, -3347, 3955, 5147, -1236, 2221, 7588, -905, 11798, 3679, 1097, -12795, -7801, 2573, +-10448, -1418, -5060, 3679, 14763, 14, 2894, -3616, 782, 2772, -14947, 3078, 5951, -9254, 11275, 11952, +-10921, -3067, -794, -3349, -11717, 7329, -1634, 2079, 15061, 5482, -12729, 13649, -613, 6584, -9036, -4892, +-7046, -12579, 17299, -4604, 8502, 9300, -4425, -4544, 9719, -9374, 2881, -8989, 11854, -240, 2724, -2083, +-5914, 10679, -5220, -1977, -9134, -8348, 140, 7121, 2824, 4770, 4879, 4551, -8823, 1551, 1172, -10372, +-79, -3436, -14234, 8630, -4545, 1177, 8264, 5630, 10964, -6830, -2256, 4842, -10292, -9733, -2982, -2140, +-1664, 5009, 7833, -7322, 6687, 7155, -627, -2696, -3511, 2330, 2001, 1929, -9259, -5190, -1975, -5594, +-2739, 15206, 7884, 6507, 5186, 1504, -10400, -8455, 5139, 319, -10334, 9419, -8513, -10141, 16521, -2390, +-4747, 14041, 6353, 1937, -2010, 546, -11395, 5226, -6047, -20424, -1166, 2806, 13279, 6003, 3348, 6713, +-3348, -4661, -4735, -5321, 1598, 836, -4654, 1135, -4460, 1360, 4755, 4691, -3621, 2073, 663, -3346, +9811, -3816, 1921, -3251, -241, 2688, 2552, -6120, -5627, 4009, 2008, -551, 2164, 2339, 9904, 8809, +-2257, 498, -16405, -3375, -6558, 12122, 1642, -2473, -2599, 5438, -4001, 4506, -1086, -4506, 11153, -8945, +-3997, -37, 9364, -9289, 6006, -2748, -3198, -323, 3828, -9745, -502, -8922, -3023, 3239, 15245, 4515, +-739, 2153, 3727, -10296, 429, -16752, -658, 9787, -541, 14074, -14108, 5319, -8385, 11585, 1939, -4338, +-4098, 3512, 3757, 4351, -8324, -3413, 6791, -10007, -5286, 6438, 4295, 6555, 5863, 4286, -1511, -10145, +-3860, -1114, 1071, -593, 6996, 4565, -8413, 7371, -1781, 534, -437, -2945, 9257, -13072, 4393, 8138, +-2827, 2857, -3513, -5639, -5918, 4873, -905, -5201, 18637, -9498, 10270, 9444, -11244, -3728, -3188, -17805, +11896, -5732, -2075, 2258, 13864, 6793, -8041, 9342, -12422, 2322, -572, 9002, -14719, 11798, -14898, -3809, +-434, 9868, 1878, 1581, 5538, 4268, -3243, 884, -1610, -2066, -1474, -14346, 1205, 3520, 17818, -18304, +8749, -4884, 10646, 9564, -699, -17133, 11224, -3258, 4197, -12181, -11652, -175, 12005, -4562, -2174, 23590, +-477, 4437, -4524, -162, -13379, 3390, -6756, -1399, 5631, 4392, 335, 344, -4667, -3031, -3955, 11033, +-5063, 1887, -451, -250, 15785, -6412, 3968, -10494, -7429, 3615, 3494, -4848, -12330, 1049, -260, 5746, +7353, 7069, 221, -191, -2294, -7436, 2806, -3008, -1095, -10575, 5168, 5301, 865, -4195, -7913, 2921, +12352, 298, -11371, 6216, 2293, 1711, -5057, 5076, 350, -5537, -2416, -11160, -17, 5317, -2424, 4801, +-392, -684, 3705, 4196, 4929, -1542, -1376, -5470, 492, -6466, -5998, -1176, -5033, 12671, 5963, 5083, +-483, 6823, -8180, -4467, -2865, -2625, 4378, -5416, -262, 13026, 90, 4128, -5931, -6371, 12526, -14020, +6318, 9586, -11254, -2837, 10217, -3361, 2196, -9686, 3828, -1426, 4625, -1500, -12351, 12385, 371, 13864, +-7303, -3371, -11056, -3759, 2737, 4073, -3108, 6718, -12287, 2555, 13585, -9411, 20151, -1088, -14744, 5587, +-5384, -7210, 4382, 3979, -1001, 1495, 8529, -10204, 4836, 8358, -10896, 6257, -1007, 3499, -1367, -6319, +8388, -6098, 6265, -8372, -9815, 15274, -2243, 11642, -4395, 356, 2671, -7125, -3948, 1431, -8215, -1251, +1660, -3522, 5055, 149, 9379, 3962, -6089, 674, 1930, -16112, -4607, 3936, 3705, -6010, 12397, -10650, +-2347, 12570, -17155, 6486, 10260, 2531, 85, -781, -12908, -5097, 3302, 10129, -3404, 2390, -2301, -3892, +15263, -1997, -8657, -3145, 1895, 2871, 12598, -6720, -649, 6153, 3122, 77, -1984, -1070, -6776, -2880, +4154, -5585, 7950, 7196, -20, 2764, -5993, 10615, -9076, 6382, 4513, -13799, 4340, 541, -8913, 4582, +484, 295, 2353, 3674, -2320, -5462, 11493, -1699, 4094, -8707, -381, -3029, 5131, -13077, -874, 314, +-373, 2367, 892, 15359, -1828, -1547, 2653, -4168, -5767, -12029, 1020, 666, -4488, 9940, -9582, 6438, +12949, 4117, 13647, -9967, -11408, 6341, -14779, 756, -12011, 8713, -1267, 14787, -726, -858, -6714, 1908, +755, 3056, 11551, -5067, 7173, -15224, 2267, -8599, 3489, 1685, -14273, -7787, 18429, -231, 15907, -5274, +4790, -9451, -11161, 12733, -14241, 1527, 1540, -4080, 1739, -6513, 8235, 12916, -7627, 2066, -7051, -2294, +-5750, 5110, 7227, -11108, 5944, -5541, -7092, 15540, 3150, -10670, 2950, -4087, 4238, 8036, -10461, -2100, +-1641, 11881, -11429, 2587, 6411, -13453, 19390, 6577, -9913, 8468, -12868, -3872, 2271, 3612, 6154, -18712, +20455, -11914, 9262, -2286, 1134, 207, -1362, -190, 7674, -6557, 5181, -7107, 5566, 8597, -25769, 6131, +5216, -3551, -5465, 1460, 664, 6391, 691, 3682, 842, 8101, 2000, -26385, 5156, 2183, -2842, 8589, +-6367, 6944, -4205, -9902, 589, 600, 3431, -6660, 9150, 8116, 1323, 15806, -2852, -8878, 887, -18443, +-5345, -505, 812, 3282, 340, 2778, 7552, -2251, 16439, 8713, -15451, -3206, 2816, 2961, -6091, -12377, +-2225, -1768, 6967, 8344, -547, 626, -1958, 5670, -2821, -6083, 12405, -2984, 13024, -8331, -7359, 2020, +-7593, 4401, -4489, -3257, 7060, 2572, 4316, 5211, -301, 4166, -6794, -9777, -1, -4614, 7673, -389, +2288, 8330, -5171, 7671, -5540, 7328, -12982, -11009, 6250, -15093, 7412, 3894, -15896, 8030, 10430, 7692, +8052, -7552, 2627, -3401, 241, -4625, -5395, 1030, -6138, -8707, 10835, -14333, 5111, 7738, 1528, 9068, +9914, 68, -3719, 13088, 7810, -20090, -11790, -8714, -11062, 8006, -502, 11101, 4621, 12427, 6504, -3260, +3824, -1252, -14215, 13707, -6886, -14018, 11240, -2757, 7084, 8908, -3796, -14745, 97, 4221, -1351, 3876, +11711, -17597, 13365, 2308, -9883, 13911, -4900, -3179, -2966, -6830, -6487, -5456, 2058, 10475, 2375, 12142, +-12660, -1725, 2180, -11965, 4160, -3247, -1265, 149, -2794, 4970, 11083, 5913, 176, -28210, 349, 2173, +-1540, 488, -5140, 10653, 4623, -5202, 31, 3472, 6351, -10254, 5998, 3372, -9348, 9374, 1108, -4877, +-1938, -454, -1483, -4138, 5813, -5101, -9312, 22441, 2250, 3256, 7130, -401, -8813, 5700, -1070, -3568, +1395, -15692, -106, 1786, 10230, -7261, -1664, 8010, -1914, 10019, -5891, -2224, 7288, 3045, 12224, -15197, +-2578, -4440, -15176, -7151, -1172, -1217, 15673, -5577, 1690, 18741, 9543, 5432, -7869, -17158, -19580, -4879, +-5015, 8584, 1504, 7216, 975, 17112, -1643, 7503, -3775, -23285, 5473, -9757, -8715, 6935, -4512, 13297, +19920, 1113, -2057, -8919, 4589, -5900, 7460, -3523, -7850, 9116, -8619, -2545, 3825, 2712, 342, 2819, +3714, -1383, -723, 15135, 3137, -3300, 2556, -13255, -9847, 1511, -6378, -87, 1665, -87, 7465, 3286, +10243, -701, 5631, -2092, -8876, 3798, -9259, -10857, -7869, 1502, 4981, -2580, 12720, -389, -5036, 12780, +-13640, 716, 2881, -2877, -4856, 7643, 2656, 2056, 4267, -15691, -2335, 1326, -5357, -4579, 7185, 6126, +-1849, 17053, -16592, -5451, 16603, -2524, -691, -304, 10899, -3740, -1986, 7235, -12757, -2500, -8935, -11683, +14883, 9462, 8420, 1859, -2009, 12206, 8811, -8677, -11600, -2367, -2371, -1797, -4022, 750, -2147, 12854, +11854, -1580, -2377, -1564, -4675, -1664, -4382, -3659, -7602, 15654, 4181, 4156, 11698, -8673, -7702, 5035, +-12141, -5115, -4206, 6558, -5685, 4932, 6519, -9000, 2627, 11927, -4958, -5387, 2826, 8110, -5694, -1077, +-8560, -6524, 9261, -8902, -1316, -5406, -10402, 13497, 9599, -12635, 21703, 13335, 6090, -8124, 2416, -15433, +-12482, -10506, -12788, 2047, 10839, 17951, 4543, 9905, -156, 16002, -14122, 6234, 773, -18060, -607, -7812, +521, 1528, 7588, -5622, -2110, 7084, 12321, 8369, 1438, -5505, 1371, -12036, 585, -3560, 1877, -4603, +2682, -3604, -9444, 15899, -4987, 9216, 2470, 1040, 2242, -16015, -2363, 2561, -6979, 459, 984, 964, +-5441, 11149, -1042, -10576, 5924, -818, -11450, 475, 5245, -5730, 2963, 2751, -271, -4874, 2289, -3340, +-2847, 1408, 12806, -13123, -1506, -6323, -3475, 8597, 11528, 5796, -8976, 396, -350, 5143, -7044, 6358, +-9964, 4598, -2159, 4219, -555, 12082, 1161, -3348, -848, -1286, 2206, 4277, 4172, -1626, 3389, -17717, +12620, -15813, 2775, 533, 12391, 5622, 437, -3228, -2634, -2013, -6199, 3762, -1491, -745, -7373, 14255, +-7848, 9027, 1654, -8513, -5521, 3020, -12045, 6868, 276, 2531, -6986, 3439, 3357, -4142, 12579, -13492, +5742, -1363, 17632, -15386, 1296, -11319, -2646, -7196, -1469, 2652, -149, 12627, 1782, 5255, 12221, 2656, +-9632, -3026, -3551, 1662, 2605, -8729, -14988, -975, 10094, 3330, -1643, 4521, 3249, 26725, 4539, -7263, +-3396, -5031, -7721, -10741, -4055, -7356, 15630, -4394, 5438, 7526, 4085, 782, 5132, -8417, -3020, -3284, +-6492, 541, 9579, -5598, -2673, 943, -3080, 7615, 1464, -12195, -3163, 17164, -8241, -2453, -4127, -202, +4361, 6901, 683, 2712, -5863, -10096, -1222, 1192, 13607, -1230, -1025, 7508, -1078, -727, -2799, -7692, +-3377, -2654, 3360, 5506, 12204, 7848, -7546, 7437, -6207, -7779, 1079, -5556, 1321, 11855, -3553, 4146, +501, 8499, -8369, -1373, 963, -11618, 4671, 1196, -2882, 20768, -5067, 601, 2992, -2315, 279, -2325, +2268, -12821, -3715, 3610, -8259, -5919, 9593, 7163, 4937, 1642, 6919, -7111, -5940, 781, -2922, -5814, +-1617, -3201, -7824, -3634, 4064, 12881, -11078, 4027, 8424, 722, -4402, -1883, 2489, -11407, 4388, 11910, +-20250, 9819, -3397, -9158, 3619, 11006, -1185, 359, 6845, -9814, -134, -1015, -2106, -871, 3636, -863, +2721, 21340, -6562, -527, 1771, -1229, -17441, -2440, 3351, 1243, 876, 2846, -18869, 17178, 6289, -3644, +9202, 8612, 5391, 7739, -15650, -6698, -6130, -12421, -2243, -6408, 9154, -11159, 2155, 9108, 11404, 12671, +-551, -1731, -4320, 771, 1911, -8859, -10901, -5115, -5997, -1289, -8655, 11966, 6411, -323, 7805, 12376, +-12230, -204, 947, -1253, -9519, 6193, -1024, -13450, 13693, 1826, -4127, 7756, 1826, -6698, -6494, 3447, +-5794, 1995, 9088, -3137, 7458, 8853, 2938, 13796, -15658, -7441, 2788, -10586, -7930, 7848, -1018, -2001, +10295, 1261, -1496, 2386, 5149, 7008, -5294, 17561, -16250, -5262, 4428, -15534, 1689, -6976, 18905, -17145, +15519, -9152, 601, 11349, 3820, 470, 8757, -15378, -5911, 2065, -12616, 6677, -3240, -4804, -3782, 19496, +7895, -4906, -5685, -496, -18237, 11094, -13949, -4441, 15359, 4595, 3168, 7396, 3305, -10488, 2432, -7808, +-11504, -2971, -1596, -1872, 12277, -5629, 6302, 6080, 7600, -2741, 7981, 11211, -6690, -18405, 3012, -2110, +2136, -6472, -13052, 10279, 4791, 5446, -8253, 16799, 1867, 13550, 6629, -521, -8480, -7517, -10354, -16502, +1607, 2738, 6053, -611, 21355, -6390, 1326, 4058, 10631, -18087, 3663, -4934, 1617, 6821, -17678, 6078, +-11837, 2042, 4915, 6081, -9005, 18183, 2540, 590, -9062, -5450, -10021, -712, 7035, 2874, -10363, -1857, +20014, -11168, 5998, -2528, 10997, -5920, 894, -9391, -3505, 809, 2203, 2022, -1486, -4681, 13746, 4630, +6064, 8953, -10415, -4566, -6669, -7240, 3710, -1615, 1831, 6372, 565, 8594, 1602, 8043, -17715, 1773, +8328, -1391, -3875, -8931, -1266, -261, 8896, 582, -9002, 868, 13765, -1967, -7109, -386, -6319, -3792, +282, -1953, 4240, 228, 605, -523, 13178, 441, -4476, 52, -23991, 1955, -10108, 6585, 4236, 481, +-3740, 9378, 6970, 9602, 1598, -9782, -15790, -1783, 571, -4013, 1467, -5440, 8067, 933, 5528, -7352, +2742, 13093, -2290, 2946, -939, 2526, -6562, -9328, -5267, 3131, -5771, 9068, -71, 15352, -2060, 18430, +-12234, -3915, -58, -7875, -1783, -19, 1097, -2486, 6488, -5217, 12322, 4383, 5644, 18062, -17147, -13825, +776, -6697, -10746, 5033, -8292, 1308, 17476, 712, -1776, 19168, -13139, 7147, 1166, -13290, -6115, -4915, +5159, -15426, 4906, 3401, -11466, 2794, 11553, -5213, 6631, 11655, -2915, 1359, 9958, -2877, -13817, -19092, +-6583, -4075, 11685, 12895, -4378, 1084, -4247, 21594, -1485, -1816, -148, -17142, 14707, -1730, 1597, 914, +-15329, 18014, -6549, -4078, 8364, -8117, 14887, -915, -6252, -3845, 2133, 7401, -6174, 323, 8232, 8617, +4590, -6963, -15556, 13019, -7749, -6378, -13541, 2316, 7462, -4429, 24102, 112, -299, 405, -9052, 2197, +3824, -16161, -5095, -2404, 10822, -1103, -11369, -1913, -4273, 14197, -4778, 1672, 18117, -10301, -1225, -2882, +2931, -2645, -5801, -5814, -7539, 5177, 11204, -6405, 4680, 9373, -526, -7532, -9283, 864, 10683, 9263, +-2826, -5349, 4569, 8170, -8237, 1729, -9981, 3732, 19534, -13479, -7440, -3097, -4403, 6928, 9745, 3550, +1909, 2118, 4643, 6862, 888, -12057, -2200, 3927, -8239, -3456, -12050, -9342, 5336, 8338, 8210, 4502, +11387, 14267, -215, 1508, 3032, -26871, 986, -18379, -13307, 5977, 1913, -2129, 6064, 5579, 13125, 20130, +97, -7400, -1234, -9669, -13803, 2517, -4825, -4672, 6360, -5204, 5044, 6762, 1033, -1819, -2270, 7769, +1822, -5084, 13368, -2790, -6822, 10728, -15409, -3407, -5277, 177, 167, 11106, 6322, -4753, 7546, 5292, +-7309, -2471, -5671, -11189, 8769, 4131, 4426, 4625, 1904, 4974, -11203, 6340, -3021, -14240, 5775, -27118, +4463, 11055, 1084, 16677, -1060, 39, -694, 3718, 391, -15425, -6175, -5374, -10414, 16843, -10269, -1609, +11464, -2299, -400, 5430, -4594, -5605, 5177, 11567, -18439, 1715, 1671, -4077, 7307, -6564, -4646, 8768, +-2606, 2595, -10206, -3850, 15404, 933, 15582, -21964, -105, 9382, -8098, 7795, 1755, -3621, 5667, 3438, +4742, -10543, -2589, -848, -13825, 13578, 5, 9306, -1275, 1317, 12058, 6514, -15797, 865, -10115, 6039, +1909, -3376, 948, -10517, 6850, 10622, -6463, 2571, -4746, 5127, 9430, -10041, 9801, -13989, 537, -132, +-20541, 4345, 8984, 11326, -6341, -12699, 17808, 5991, -5781, 200, -17135, 4501, -10632, 9090, -5266, -5498, +14928, -1692, 1768, 8934, -1435, -2307, 5566, -3293, 2604, -20337, 1658, -9484, 5803, 4284, 2120, 6377, +12931, 5375, 2662, -9097, 1563, 3940, -7063, -2200, -11070, 6308, 676, -6450, 3161, 2945, 2753, 5612, +-5563, 16666, -1155, 5540, 1829, -13987, -4578, -1029, -15927, -5375, 5641, 13369, 227, -2375, 9320, 5268, +7734, -7593, -12691, -6661, 1352, -2427, 15050, -10126, 6953, -4383, -795, -1697, -10372, 20226, -15642, -404, +2941, -9085, 8211, 4339, 5607, -5422, 1053, 13666, -4545, -1190, -860, -29185, 9562, -4942, 9105, -3085, +148, 14965, 5567, 4793, -2858, -8364, 6188, 4724, 3476, -1278, -9684, 567, 4573, -9604, -1633, -4997, +8939, 2923, 4626, 17501, -7998, 14399, -6785, -19149, 11340, -11572, -5272, 10008, -13943, 20088, -8707, 14934, +-5881, -19393, 14388, -13367, -5900, 1289, 1658, -6656, 10870, 3138, -127, 3910, 14704, -9913, -1151, -2982, +-16017, 1542, -13491, -15431, 9685, -6793, 13594, 9522, 1259, 26540, -6198, 3222, -2459, -17705, -118, -8556, +3434, -17905, 1340, 12914, -12144, 11849, 1743, 10637, 7458, -3650, 4906, -5430, 10357, 4169, -11353, 1311, +-16365, -14023, 11025, 205, 8193, -4652, 7527, 23899, 3307, -7338, -3072, -14609, -120, -1776, -9145, -1084, +7231, 18079, -796, 3700, -10516, -6663, 10610, -17742, -7157, 4199, -236, 2503, -5128, -132, 5640, 2730, +16539, -13044, -2260, -1954, -4807, -5792, -10281, -9673, 5813, 11712, 14604, -7541, -2251, -4718, 5244, 4590, +-6313, -3312, -3027, 8510, 2404, 11749, -12184, 5441, -14656, 7735, -10667, 2589, 15148, -6860, -536, 17294, +-1184, -1071, -1234, 1507, 2400, -6915, 11116, -23881, 9220, 9695, 3066, -4937, -2618, -5186, 4010, -1020, +-3637, 5311, 3472, 7807, -3082, 6117, -14018, 5843, 11473, -4646, -17758, -7651, -4265, 16340, -4725, -677, +-11493, 8752, 13769, 1546, 4314, -8703, -2821, 4793, -8742, -9690, 4478, -19910, 14313, -9842, 7462, 4400, +7515, 4613, 1648, -6843, -3108, 327, -1058, -1417, -11117, 6652, -6395, 15169, -11628, 13633, -2214, 6579, +14799, -15148, -6846, 10545, -10163, 2702, 1047, -8073, 6192, -4333, 9547, 5592, -474, 13682, -3035, 736, +-790, -4246, -8444, -7790, 915, -3573, 7502, 3187, 99, 5268, 4348, -89, 8847, -25193, 17244, -4614, +-8629, 15488, -22020, 2734, -6338, 8575, -4142, 4770, 2604, 2136, -635, 5144, -9133, -4458, 10877, -4291, +-1747, -8630, 7466, -8214, 2098, -4035, -6194, 5356, 13139, -4177, 6521, 6440, -8551, 6523, -26282, 13822, +-13925, -745, 12847, 208, 3439, 13350, 2945, -8016, -8517, 5457, -5577, -2723, 15110, -9691, 1451, 3103, +9429, -8956, 1518, -2526, -6566, 7683, 10987, -14700, 8416, -1672, -657, 11637, -7943, -11198, 7268, 7945, +-4883, -15857, 5952, 8278, -8941, 13734, -12809, 12333, -9034, -6367, -2524, -3233, 10402, -6181, -7687, 12600, +-2295, 3603, -13611, -157, 14433, -11175, 1392, -7652, 6877, -1094, 4640, -16, -8380, -1980, 10777, -22615, +3413, 4190, -929, 4928, 10665, 1859, 113, 9298, -5471, -289, -14378, -1916, -11677, 5337, 1366, 13535, +48, 6435, 11800, 419, -2963, 4391, -10571, -3304, -9099, 12514, -2256, -7542, 19210, -19061, -10657, 17234, +12743, -2049, 7150, -7807, 6072, 2083, 2687, -19498, -1041, -8191, -3047, -11259, 9674, 6988, 4206, 5696, +-3612, 18297, -4232, 1624, -18766, -4356, -14541, -5070, -4164, -6038, 14108, 15018, -6460, 16879, -8062, -11942, +7880, -8330, 817, -10850, 5445, -4624, 7136, 5562, 461, -4787, -1313, 985, -2096, -1751, 11227, 3019, +-9337, 2091, 5119, 5717, -778, -2519, -5111, 822, -2262, 11584, -6194, 11426, 9970, -9660, 7698, -10232, +-3055, 1005, -5439, 2331, 1451, 6611, 17670, -12306, 5011, -8021, 1904, -8085, 6328, -6026, -1598, 911, +1015, -2170, 8736, -22024, 1469, 20507, -3432, 11482, -6024, -13903, -9244, 11823, -14920, -8683, 7587, 9042, +-11571, 17879, 915, -9799, 5927, -11789, -4138, 5060, -4109, 341, 6144, 4229, 13970, -13607, 4214, -11364, +11244, -990, -8793, 2604, -10593, -1764, 6302, 10683, 3185, 8334, 15255, 4586, -14471, 10448, -15155, -8565, +-4632, -10884, 7307, 3955, 3423, 10491, 4750, 11253, 6458, -13314, 14083, -7831, -2665, -3750, -7261, 570, +-8487, 938, -2635, -1308, 16314, -2048, 3323, -5500, 11996, 5532, -23993, 18788, -12502, -13303, 7647, -11918, +-5833, 10703, -1832, 6568, 1331, 8692, -1345, -636, -195, -8556, -16725, -6457, 3873, -3789, 9315, 15767, +8688, -1454, 8684, -8322, 4331, -10705, -7728, 3394, -12097, -2861, 1575, -3295, 22977, 5898, -8255, 9405, +6076, 10288, -9919, -2074, -6366, -18423, -246, 10838, -11224, 10217, 2059, -10295, 212, 14835, 125, -3526, +16308, -9179, 259, -671, -9169, -10426, 4415, -1491, -378, -1481, -4886, 13136, -7237, 6714, -1953, -9998, +838, -7220, 4301, 3397, 4548, 5560, -20986, 12295, 2051, 2043, -5649, -9534, -2980, 1239, -2056, -9290, +-4475, 22295, -491, 6512, 10985, -8191, -4094, 319, 286, -9737, 5302, -7332, 4004, 1839, 14792, -14128, +6262, 12439, -20131, 3259, 7531, 3952, 3459, 3692, 2532, -694, -11361, 7357, -8800, 16660, -13359, -686, +-867, -2957, 15882, 1262, -2366, -7109, -7512, 9254, -8373, -759, 1407, 3368, 13684, -2634, 4218, 1193, +-3983, -14558, -12172, -18151, 2186, -2137, 16766, 10592, 4129, 11270, -1119, -4295, 6118, 6870, -15166, -8988, +-14575, -5341, -9343, -783, -5758, 13802, 11956, 5039, 19078, -871, 13700, -5467, -26079, -680, 3477, -6589, +-5831, -15862, 15186, 514, 7541, -589, 1905, 10739, 1802, -2391, 7695, -9284, -3560, 1782, -6642, 12818, +-248, -880, -16044, 18070, 7765, -10961, 7120, 3025, -9283, 2647, -13592, 5799, -1470, 723, 19653, -11836, +7226, 5806, -7897, 255, -654, -2250, -7688, -13670, 2985, -448, 5372, 5733, 3351, 2, -2189, 4432, +-3058, 3679, 153, 1815, -12799, 1422, -10021, -3033, 10809, 1757, 1049, 562, -932, 2949, -4877, 14426, +-12712, 5238, 3940, -4994, 5492, -11066, 9266, -5504, 1037, 3175, -10400, 15209, -2102, -2674, 14448, -5905, +-1426, -15163, -22, 15557, 9554, 2683, -3527, 1114, -5827, 9694, 3702, -16522, -15275, 9300, -13362, 9477, +6878, 9669, 11654, 3772, 6784, -3383, -10739, -2476, -19434, -6826, 521, -11670, 7156, 6115, 8608, 2382, +6538, 1335, 1875, -6824, -10162, -11068, 4453, -3622, 160, -2821, 1300, 553, 8188, -6212, -1726, 5580, +-4514, 7317, -11121, 11270, -9351, -4538, 502, -1867, 876, 236, -1140, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 1131, 1979, 2721, +3341, 3734, 3991, 4029, 3957, 3700, 3299, 2779, 2202, 1567, 1034, 543, 73, -263, -362, -430, +-444, -393, -458, -481, -685, -802, -1096, -1955, -2805, -3632, -4369, -4892, -5401, -5692, -5568, -5178, +-4431, -3507, -2420, -1138, 335, 1903, 3420, 4766, 5677, 6236, 6547, 6570, 6372, 6021, 5479, 4719, +3743, 2784, 1789, 815, 205, -185, -556, -823, -991, -1092, -1246, -1601, -1723, -2236, -3353, -4356, +-5533, -6504, -7042, -7361, -7465, -7170, -6371, -5197, -3786, -2203, -428, 1665, 3585, 5384, 6867, 7495, +7569, 7436, 7078, 6472, 5864, 5149, 4187, 3055, 1926, 1001, 377, 69, 71, 176, 357, 514, +558, 442, -176, -578, -1298, -3196, -5182, -7054, -8655, -9715, -10267, -10361, -9853, -8664, -6942, -4856, +-2536, -52, 2876, 5600, 7883, 9608, 10173, 9952, 9501, 8842, 7800, 6867, 5852, 4359, 2592, 956, +-413, -1304, -1561, -1398, -1009, -656, -154, 90, 220, -69, -825, -1189, -2876, -5192, -6920, -8630, +-9619, -9924, -9730, -9070, -8145, -6576, -4548, -2359, 239, 2939, 5542, 7562, 9196, 9851, 9411, 8852, +8324, 7448, 6303, 5394, 4099, 2400, 858, 89, -404, -40, 617, 1045, 1509, 1655, 1767, 1133, +410, -1098, -4054, -6580, -9111, -11663, -13054, -13578, -13387, -12379, -10675, -8365, -5728, -2725, 614, 4727, +8488, 11254, 13004, 13486, 13033, 11883, 10579, 9106, 7550, 5557, 3439, 1190, -947, -2710, -3676, -3195, +-2097, -1101, -93, 641, 1218, 1814, 1316, 1028, -680, -4051, -6879, -9852, -11855, -12804, -13077, -12614, +-11612, -9756, -7383, -4673, -1302, 2579, 6627, 9894, 12337, 13433, 12928, 12022, 11137, 10094, 8522, 7215, +5440, 2970, 384, -1485, -2484, -2217, -1146, -163, 923, 1198, 1842, 2067, 1828, 556, -2842, -6110, +-9599, -13305, -16072, -17098, -16605, -15480, -13578, -11011, -8079, -4637, -336, 4971, 10125, 14011, 16217, 16916, +16405, 15247, 13875, 12187, 10658, 8484, 5577, 2226, -1195, -4054, -5761, -5456, -4053, -2601, -1401, -481, +214, 1220, 1504, 1645, -113, -4073, -7923, -11705, -14410, -15406, -15204, -14332, -12962, -11002, -8547, -5581, +-1595, 3133, 8052, 12017, 14732, 15675, 14718, 13525, 12831, 12027, 10238, 8588, 6734, 3468, -122, -2643, +-3691, -3122, -1521, -234, 952, 1331, 1775, 2052, 1984, 660, -2957, -6871, -11036, -15537, -18617, -19312, +-18273, -16318, -14095, -11426, -8488, -4702, 471, 6638, 12303, 16234, 18243, 18673, 17703, 16261, 14717, 13004, +11366, 8905, 5466, 1325, -2657, -5838, -7274, -6288, -4114, -2387, -1258, -323, 448, 1741, 2134, 2353, +165, -4198, -8906, -13362, -16056, -16559, -15896, -14751, -13202, -11455, -8910, -5693, -1147, 4597, 10057, 14070, +16474, 17102, 15718, 14383, 13791, 12914, 10962, 9193, 6677, 2712, -1331, -4024, -4848, -3612, -1527, 55, +1093, 1078, 1519, 1894, 2295, 740, -3196, -7436, -12318, -17260, -20457, -20830, -19139, -16785, -14581, -11973, +-8939, -4766, 1271, 8302, 14368, 18470, 20199, 20066, 18988, 17407, 15799, 13850, 12141, 9414, 5459, 726, +-3695, -6928, -8047, -6443, -4007, -2158, -1136, -565, 338, 1514, 2081, 2270, -672, -5504, -10640, -15382, +-18155, -18296, -17036, -15466, -13797, -11898, -9299, -5611, -175, 6475, 12202, 16123, 18357, 18462, 16714, 15465, +15050, 13983, 11893, 9914, 6843, 2294, -2163, -4679, -5132, -3463, -1327, 325, 990, 1001, 1416, 1681, +2007, -264, -4356, -9022, -14557, -19742, -22699, -22321, -20130, -17549, -14839, -12269, -9162, -4276, 2778, 10395, +16661, 20556, 21773, 21300, 19938, 18477, 16906, 15037, 13181, 9894, 5272, 15, -4592, -7897, -8396, -6327, +-3763, -2174, -1457, -963, 78, 1038, 1908, 1510, -2324, -7396, -13096, -17758, -19812, -19139, -17512, -15665, +-13738, -11605, -8853, -4727, 1431, 8601, 14296, 17863, 19616, 18803, 16858, 15885, 15583, 14339, 12379, 10253, +6307, 1199, -3067, -5110, -4833, -2633, -501, 922, 923, 881, 1120, 1496, 995, -2439, -6779, -11911, +-17934, -22781, -24403, -23077, -19906, -16744, -13975, -11183, -7672, -1815, 6148, 13706, 19598, 22668, 22922, 21799, +20148, 18442, 16586, 14969, 12696, 8740, 3555, -2052, -6603, -9037, -8243, -5461, -2954, -1669, -1137, -803, +468, 1257, 2096, 294, -4562, -9986, -15916, -19991, -20885, -19556, -17495, -15178, -13205, -10936, -7625, -2631, +4416, 11678, 16904, 19953, 20764, 18973, 17073, 16381, 15838, 14039, 12167, 9472, 4646, -622, -4301, -5416, +-4061, -1581, 453, 1498, 1000, 1087, 1039, 1246, -160, -4504, -9436, -15284, -21495, -25403, -25641, -23263, +-19722, -16421, -13327, -10134, -5552, 1676, 10149, 17560, 22681, 24738, 24185, 22527, 20359, 18562, 16486, 14676, +11668, 6924, 1087, -4536, -8363, -9744, -7526, -4312, -2198, -1160, -1135, -105, 808, 1666, 1964, -1917, +-7236, -13321, -19320, -22124, -21776, -19930, -17565, -15228, -12899, -10185, -6193, 46, 8132, 15139, 19502, 21950, +21634, 19157, 17632, 17160, 15989, 13850, 11800, 7908, 2241, -2732, -5486, -5568, -3113, -477, 1423, 1621, +1295, 1165, 1363, 1152, -2498, -7283, -12852, -19654, -25445, -27793, -26691, -23242, -19337, -15937, -12684, -8838, +-2624, 6161, 14736, 21651, 25685, 26611, 25310, 23198, 21048, 18763, 16853, 14505, 10369, 4446, -2014, -7218, +-10338, -9771, -6545, -3636, -1834, -1297, -1014, 409, 1441, 2624, 675, -4499, -10374, -17315, -22366, -23565, +-22209, -19921, -17218, -14787, -12140, -8806, -3447, 4414, 12484, 18483, 22228, 23374, 21471, 19276, 18367, 17648, +15822, 13964, 10990, 5500, -535, -4761, -6234, -4599, -1806, 777, 1758, 1327, 1430, 1393, 1940, -176, +-4931, -10330, -17018, -24064, -28758, -29169, -26674, -22578, -18661, -15185, -11836, -7282, 767, 10488, 19112, 25360, +28021, 27536, 25806, 23802, 21698, 19488, 17369, 13925, 8712, 1879, -4525, -9157, -10400, -8149, -4921, -2334, +-1339, -1332, -331, 500, 1640, 753, -3998, -9446, -16236, -22801, -25774, -25163, -22848, -19708, -16475, -13578, +-10815, -6234, 1275, 10303, 17830, 23021, 25627, 24606, 21970, 20236, 19409, 17868, 15779, 13425, 8644, 1814, +-3588, -6361, -5771, -3138, -394, 1472, 1339, 1447, 1276, 1406, -5, -4316, -9333, -15771, -23158, -29194, +-31073, -29238, -25278, -20457, -16263, -12694, -8559, -1300, 8456, 17354, 24710, 28840, 29179, 27493, 25081, 22786, +20508, 18552, 15486, 10771, 3982, -2980, -8432, -10874, -9207, -5890, -2818, -1156, -1097, -220, 491, 1678, +1375, -3066, -8537, -15481, -22868, -27113, -27122, -25053, -21641, -17718, -14150, -11034, -6710, 107, 8879, 16934, +22805, 25901, 25654, 23251, 21145, 19858, 18431, 16252, 13940, 9702, 2822, -3108, -6620, -6777, -4355, -1414, +944, 1184, 1234, 1117, 1325, 408, -3234, -7880, -13720, -20773, -27022, -29715, -28558, -25103, -20685, -16099, +-12522, -9012, -3229, 5595, 14415, 21804, 26397, 27439, 26199, 24260, 22185, 19913, 17795, 14956, 11019, 5120, +-1282, -6546, -9582, -8654, -5677, -2609, -826, -669, 71, 327, 990, 666, -3146, -7536, -13299, -19736, +-24205, -25102, -23576, -20566, -16794, -13431, -10558, -7005, -1073, 6879, 14257, 20091, 23357, 23639, 21744, 19774, +18384, 16906, 14994, 12759, 9427, 3541, -1923, -5382, -5960, -4136, -1794, 495, 944, 1161, 1021, 961, +110, -3118, -6995, -11663, -17428, -22902, -25688, -25413, -22450, -18506, -14494, -10977, -7681, -2643, 4752, 12100, +18460, 22613, 23814, 22849, 21012, 19177, 17177, 15504, 13125, 9751, 4756, -905, -5430, -7883, -7270, -5004, +-2386, -816, -415, 325, 535, 1025, 251, -2810, -6498, -11465, -16950, -20787, -21613, -20442, -17924, -14625, +-11494, -8724, -5723, -739, 6013, 12227, 17257, 19935, 20091, 18755, 17210, 16009, 14775, 13264, 11088, 7979, +2984, -1698, -4761, -5364, -3952, -1877, 75, 506, 779, 669, 682, -258, -2982, -6071, -10177, -14945, +-19401, -21553, -21293, -18923, -15557, -12161, -9170, -6371, -2090, 4073, 10137, 15566, 18989, 19969, 19245, 17777, +16356, 14705, 13185, 11147, 8389, 4122, -543, -4383, -6290, -5638, -3845, -1722, -598, -219, 283, 66, +190, -917, -3622, -6729, -10745, -14952, -17801, -18367, -17194, -14836, -11957, -9104, -6666, -3849, 708, 6134, +11164, 15042, 16992, 16861, 15543, 14295, 13191, 12077, 10614, 8718, 5925, 1744, -1792, -4064, -4228, -2997, +-1106, 264, 629, 968, 617, 404, -1034, -3479, -6091, -9492, -13426, -16702, -18076, -17510, -15431, -12576, +-9608, -7011, -4268, -84, 4988, 9836, 13901, 16103, 16486, 15786, 14598, 13277, 12001, 10696, 8704, 6085, +2345, -1302, -4117, -5246, -4514, -2921, -1251, -617, -102, 128, -40, -89, -1518, -3687, -6258, -9538, +-12744, -14604, -14660, -13484, -11441, -9090, -6866, -4725, -2020, 1907, 6147, 9962, 12673, 13678, 13234, 12175, +11292, 10403, 9469, 8149, 6511, 3903, 617, -1858, -3225, -3017, -1912, -351, 497, 948, 909, 477, +-103, -1887, -3831, -6070, -8847, -11812, -14046, -14529, -13704, -11761, -9301, -7056, -4907, -2362, 1460, 5486, +9215, 12042, 13235, 13167, 12427, 11474, 10327, 9348, 8014, 6241, 3806, 817, -1777, -3702, -4083, -3297, +-1801, -648, -196, 311, 117, -6, -787, -2429, -3993, -6172, -8689, -10827, -11700, -11452, -10285, -8508, +-6570, -4754, -2897, -196, 3157, 6363, 9070, 10655, 10927, 10299, 9492, 8760, 8057, 7226, 5992, 4383, +1935, -268, -1921, -2483, -2100, -1135, -94, 394, 796, 502, 89, -1043, -2628, -4078, -5930, -7994, +-9986, -11023, -10972, -9934, -8209, -6380, -4630, -2810, -152, 3035, 5844, 8294, 9788, 10163, 9754, 9049, +8256, 7443, 6710, 5461, 3875, 1704, -383, -2102, -2984, -2800, -1964, -879, -370, 157, 269, 40, +-240, -1418, -2654, -4095, -5848, -7533, -8645, -8760, -8246, -7098, -5698, -4282, -2844, -1025, 1404, 3874, +6067, 7611, 8163, 7888, 7278, 6733, 6184, 5657, 4877, 3867, 2246, 385, -995, -1787, -1785, -1300, +-388, 137, 540, 565, 309, -152, -1373, -2517, -3789, -5265, -6758, -7832, -8127, -7672, -6647, -5348, +-4063, -2797, -1166, 1138, 3397, 5396, 6869, 7444, 7289, 6784, 6251, 5636, 5144, 4409, 3419, 2013, +389, -944, -1912, -2100, -1693, -831, -243, 89, 360, 246, 85, -604, -1632, -2595, -3788, -5067, +-6089, -6453, -6279, -5609, -4616, -3621, -2618, -1485, 167, 2110, 3844, 5242, 5944, 5949, 5518, 5064, +4631, 4209, 3743, 3089, 2154, 818, -289, -1083, -1326, -1144, -573, 2, 312, 525, 410, 172, +-564, -1475, -2340, -3342, -4394, -5309, -5754, -5648, -5057, -4164, -3254, -2398, -1441, 59, 1756, 3239, +4485, 5156, 5251, 4936, 4511, 4045, 3653, 3261, 2662, 1838, 710, -287, -1082, -1412, -1327, -869, +-326, -41, 251, 279, 172, -156, -869, -1538, -2293, -3169, -3922, -4354, -4354, -4038, -3416, -2720, +-2042, -1336, -350, 943, 2149, 3209, 3883, 4048, 3845, 3497, 3181, 2867, 2599, 2198, 1681, 846, +20, -572, -880, -846, -603, -165, 86, 299, 352, 241, -62, -658, -1238, -1876, -2580, -3200, +-3613, -3663, -3419, -2940, -2344, -1807, -1256, -458, 617, 1654, 2558, 3171, 3361, 3234, 2978, 2706, +2429, 2207, 1859, 1417, 768, 75, -477, -818, -859, -675, -322, -74, 74, 205, 166, 46, +-282, -762, -1227, -1751, -2265, -2620, -2722, -2597, -2284, -1872, -1466, -1065, -568, 183, 986, 1703, +2257, 2469, 2424, 2204, 2007, 1800, 1629, 1427, 1165, 762, 210, -205, -483, -526, -432, -197, +8, 108, 211, 190, 93, -166, -532, -895, -1310, -1707, -2013, -2135, -2047, -1807, -1486, -1152, +-860, -496, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -18325, 17516, -6917, 17674, 1663, -18436, 17771, 3283, -15871, 6024, 16214, -29347, +5597, 22171, -22734, -8729, 28268, -13904, -13116, 24266, 1254, -19733, 22011, 4169, -15946, 3833, 21333, -25763, +-1376, 12313, -6834, -17881, 13568, 6170, -29347, 20488, 4652, -8384, -1281, 29034, -25109, 4026, 20522, -11867, +-10634, 20420, -6294, -21845, 22344, -5648, -27809, 8435, 16507, -29347, 10703, 22322, -7927, -10920, 29034, -10858, +-11088, 18771, 4439, -18282, 6661, 7320, -24763, 149, 9438, -5885, -21712, 24273, -10400, -9305, 14828, 13946, +-16734, 13265, 14899, -16034, 8672, 11695, -13096, -11350, 16590, -18209, -10864, 12791, -2496, -23451, 16959, 5849, +-15933, 9079, 22214, -13922, -469, 21945, -5510, -8601, 13137, -2214, -20790, 9033, -666, -14826, -3445, 11829, +-18825, 1639, 14905, -2534, -5419, 19535, 1491, -10915, 17869, 4527, -12834, 2737, 6126, -21676, 2241, 5228, +-13721, -7577, 12336, -10391, -4394, 16135, 3630, -7103, 12137, 9866, -7833, 5081, 10939, -7633, -10296, 6808, +-7905, -10261, 1918, 876, -14435, 4622, 4273, -4292, 5263, 12135, -2508, 1527, 13028, -525, -1476, 5304, +-432, -13012, 1891, -2041, -9339, -3233, 2228, -8311, -1836, 7844, 1115, 616, 9985, 4882, -2919, 9435, +7078, -5420, -1408, 5248, -10127, -7024, 3487, -4087, -11771, 3604, -691, -5516, 6152, 7714, -2023, 4259, +10405, -1739, 3738, 8107, -1976, -7385, 3832, -4019, -8834, 194, -665, -10239, 218, 4171, -3885, 2959, +9123, -1121, 1342, 10884, 1504, -1552, 6359, 40, -8800, 1291, -60, -7814, -4030, 2677, -6880, -2399, +6139, 864, 92, 6359, 4212, -1028, 6482, 4385, -2344, 4, 1185, -6360, -2902, 1211, -4753, -4650, +1840, -2136, -1727, 4593, 4252, -277, 4459, 5130, -38, 2947, 3608, -1626, -5037, 1545, -4259, -4982, +-828, -23, -6686, 486, 4597, -1300, 3417, 5883, 2668, 162, 6124, 1963, -642, 235, -706, -5700, +-2597, -1984, -4297, -3221, -22, -2359, -1370, 5171, 3687, 2455, 4698, 4169, 478, 3845, 2669, -1222, +-3083, -723, -6128, -4351, -1637, -2662, -4889, -173, 1447, -170, 3807, 5835, 3140, 1578, 6445, 1637, +621, 1777, -515, -5757, -2440, -3951, -4808, -3685, -867, -3463, -1143, 2904, 1959, 3729, 5174, 4046, +1186, 4960, 2363, 34, -826, -1407, -5429, -4272, -2920, -4374, -3681, -829, -1683, -2424, 4805, 4431, +1693, 6741, 4201, 197, 3821, 3344, -2992, -2625, -557, -7127, -4361, -2212, -3881, -4410, 281, -537, +-386, 5034, 3897, 2645, 5759, 3716, 470, 2934, -81, -1170, -4470, -2860, -5135, -4332, -3280, -2917, +-3149, -1013, 2010, 1688, 3655, 4604, 4202, 1375, 4874, 1996, -443, -846, -1124, -5682, -5007, -2926, +-3998, -4810, -2514, 126, -908, 2991, 3809, 3478, 2330, 4226, 2650, 1916, 2097, -720, -3067, -2845, +-4171, -5306, -2980, -3067, -4443, -1758, 996, 197, 3168, 4570, 2811, 2255, 4910, 1626, 2079, 1142, +-2339, -3946, -3251, -3540, -5139, -3133, -3514, -2400, -1767, 2040, 1921, 3871, 3781, 3224, 3816, 3583, +1873, 111, 488, -3899, -4112, -2970, -4385, -4882, -2834, -2049, -2599, 683, 3086, 1847, 3807, 4314, +3239, 2568, 3277, 1300, -685, -1598, -2388, -3920, -4487, -2952, -3938, -3603, -1648, 134, 734, 3038, +3616, 3350, 3619, 3426, 2830, 1971, 159, -896, -3195, -2996, -3414, -4000, -3323, -2736, -2340, -1658, +1978, 1820, 2527, 3590, 4089, 1471, 4043, 2982, -448, -315, -1085, -3491, -4425, -1418, -4010, -3616, +-1578, -830, -1108, 2698, 4147, 1419, 3041, 4431, 2011, 1630, 3028, -804, -2266, -928, -3687, -4055, +-2237, -2755, -3664, -583, 610, -712, 3938, 3957, 2063, 3084, 4311, 1083, 1747, 1460, -2014, -2055, +-2619, -3207, -3843, -1972, -3005, -1378, -582, 1093, 2644, 2327, 3790, 3484, 2223, 2527, 3099, 56, +-840, -580, -3202, -3737, -2148, -3511, -2781, -1122, -893, -509, 2829, 3094, 1968, 3997, 4122, 1616, +1645, 3054, -993, -2043, -1256, -2501, -4797, -2082, -2153, -3289, -801, 835, 1000, 1682, 4650, 2593, +2195, 4518, 2217, 98, 1536, -59, -3760, -2237, -1681, -4460, -2791, -759, -2336, -1212, 2184, 1428, +1932, 4373, 3732, 1573, 3270, 2796, -674, -327, 80, -3569, -3635, -1589, -3196, -3655, -774, -690, +-692, 2620, 2857, 2035, 3716, 4062, 1069, 2266, 2138, -328, -1743, -1066, -3432, -3844, -1753, -2683, +-2803, -534, 553, -19, 3073, 3276, 2278, 3194, 3624, 1003, 1207, 1458, -1433, -2001, -1858, -3288, +-3232, -1716, -2219, -1718, 352, 337, 1885, 3227, 2787, 2446, 3194, 2361, 682, 1281, -158, -1639, +-2524, -2150, -3624, -2712, -1568, -1444, -891, 968, 1531, 1832, 3410, 3073, 2347, 2488, 2192, 85, +-10, -752, -2063, -3120, -2491, -2836, -1853, -1600, -712, 249, 1124, 1834, 3009, 3323, 2559, 2799, +1761, 1198, -141, -951, -1595, -2433, -3046, -2589, -2129, -1918, -984, 304, 543, 1891, 3005, 2727, +2780, 3164, 1633, 1441, 749, -1041, -1523, -1497, -3083, -2758, -1681, -2895, -844, -122, 303, 1469, +3076, 2501, 2918, 3102, 1749, 1619, 873, -370, -763, -2112, -2748, -2073, -3008, -2472, -785, -463, +142, 1487, 2045, 2999, 2757, 2794, 2169, 1965, 437, 426, -787, -1892, -2193, -2506, -2407, -2186, +-1075, -1208, 450, 952, 1307, 2532, 3073, 1925, 2357, 2072, 409, 79, -17, -2093, -2026, -1624, +-2620, -2327, -1051, -926, -749, 1354, 1335, 1483, 2348, 2448, 1243, 1955, 784, 106, -139, -1334, +-1674, -2009, -1964, -2306, -1075, -1248, -466, 195, 1057, 1544, 1790, 1964, 1883, 1096, 1091, 350, +-759, -718, -1509, -1942, -2084, -1584, -1685, -1066, -609, 125, 445, 1327, 1667, 1595, 1547, 1364, +619, 596, -301, -906, -949, -1929, -1639, -1779, -1418, -1299, -351, -363, 503, 966, 1151, 1202, +1499, 948, 633, 730, -92, -694, -1128, -1032, -1872, -1421, -1082, -1126, -1143, 1, -63, 651, +1070, 864, 886, 1259, 746, 136, 314, -335, -1022, -1250, -763, -1619, -1328, -703, -582, -946, +71, 575, 361, 775, 1000, 660, 611, 505, 41, -306, -466, -747, -1186, -1071, -951, -795, +-864, -336, -245, 15, 376, 752, 491, 525, 642, 277, 7, 39, -323, -808, -691, -994, +-886, -639, -537, -643, -106, -22, 171, 356, 629, 335, 305, 383, 20, -115, -257, -397, +-755, -654, -606, -535, -686, -212, -374, -84, 47, 290, 236, 288, 301, 103, 160, -184, +-86, -395, -453, -426, -441, -620, -289, -382, -364, -99, -1, 2, 244, 127, 24, 181, +-5, -118, -104, -180, -440, -313, -315, -358, -387, -159, -312, -220, 2, -55, -72, 46, +1, -147, -5, -85, -178, -182, -153, -269, -237, -189, -222, -204, -166, -158, -163, -131, +-133, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, -18325, 17516, -6917, 17674, 1663, -18436, 17771, 3283, -15871, 6024, 16214, +-29347, 5597, 22171, -22734, -8729, 28268, -13904, -13116, 24266, 1254, -19733, 22011, 4169, -15946, 3833, 21333, +-25763, -1376, 12313, -6834, -17881, 13568, 6170, -29347, 20488, 4652, -8384, -1281, 29034, -25109, 4026, 20522, +-11867, -10634, 20420, -6294, -21845, 22344, -5648, -27809, 8435, 16507, -29347, 10703, 22322, -7927, -10920, 29034, +-10858, -11088, 18771, 4439, -18282, 6661, 7320, -24763, 149, 9438, -5885, -21712, 24273, -10400, -9305, 14828, +13946, -16734, 13265, 14899, -16034, 8672, 11695, -13096, -11350, 16590, -18209, -10864, 12791, -2496, -23451, 16959, +5849, -15933, 9079, 22214, -13922, -469, 21945, -5510, -8601, 13137, -2214, -20790, 9033, -666, -14826, -3445, +11829, -18825, 1639, 14905, -2534, -5419, 19535, 1491, -10915, 17869, 4527, -12834, 2737, 6126, -21676, 2241, +5228, -13721, -7577, 12336, -10391, -4394, 16135, 3630, -7103, 12137, 9866, -7833, 5081, 10939, -7633, -10296, +6808, -7905, -10261, 1918, 876, -14435, 4622, 4273, -4292, 5263, 12135, -2508, 1527, 13028, -525, -1476, +5304, -432, -13012, 1891, -2041, -9339, -3233, 2228, -8311, -1836, 7844, 1115, 616, 9985, 4882, -2919, +9435, 7078, -5420, -1408, 5248, -10127, -7024, 3487, -4087, -11771, 3604, -691, -5516, 6152, 7714, -2023, +4259, 10405, -1739, 3738, 8107, -1976, -7385, 3832, -4019, -8834, 194, -665, -10239, 218, 4171, -3885, +2959, 9123, -1121, 1342, 10884, 1504, -1552, 6359, 40, -8800, 1291, -60, -7814, -4030, 2677, -6880, +-2399, 6139, 864, 92, 6359, 4212, -1028, 6482, 4385, -2344, 4, 1185, -6360, -2902, 1211, -4753, +-4650, 1840, -2136, -1727, 4593, 4252, -277, 4459, 5130, -38, 2947, 3608, -1626, -5037, 1545, -4259, +-4982, -828, -23, -6686, 486, 4597, -1300, 3417, 5883, 2668, 162, 6124, 1963, -642, 235, -706, +-5700, -2597, -1984, -4297, -3221, -22, -2359, -1370, 5171, 3687, 2455, 4698, 4169, 478, 3845, 2669, +-1222, -3083, -723, -6128, -4351, -1637, -2662, -4889, -173, 1447, -170, 3807, 5835, 3140, 1578, 6445, +1637, 621, 1777, -515, -5757, -2440, -3951, -4808, -3685, -867, -3463, -1143, 2904, 1959, 3729, 5174, +4046, 1186, 4960, 2363, 34, -826, -1407, -5429, -4272, -2920, -4374, -3681, -829, -1683, -2424, 4805, +4431, 1693, 6741, 4201, 197, 3821, 3344, -2992, -2625, -557, -7127, -4361, -2212, -3881, -4410, 281, +-537, -386, 5034, 3897, 2645, 5759, 3716, 470, 2934, -81, -1170, -4470, -2860, -5135, -4332, -3280, +-2917, -3149, -1013, 2010, 1688, 3655, 4604, 4202, 1375, 4874, 1996, -443, -846, -1124, -5682, -5007, +-2926, -3998, -4810, -2514, 126, -908, 2991, 3809, 3478, 2330, 4226, 2650, 1916, 2097, -720, -3067, +-2845, -4171, -5306, -2980, -3067, -4443, -1758, 996, 197, 3168, 4570, 2811, 2255, 4910, 1626, 2079, +1142, -2339, -3946, -3251, -3540, -5139, -3133, -3514, -2400, -1767, 2040, 1921, 3871, 3781, 3224, 3816, +3583, 1873, 111, 488, -3899, -4112, -2970, -4385, -4882, -2834, -2049, -2599, 683, 3086, 1847, 3807, +4314, 3239, 2568, 3277, 1300, -685, -1598, -2388, -3920, -4487, -2952, -3938, -3603, -1648, 134, 734, +3038, 3616, 3350, 3619, 3426, 2830, 1971, 159, -896, -3195, -2996, -3414, -4000, -3323, -2736, -2340, +-1658, 1978, 1820, 2527, 3590, 4089, 1471, 4043, 2982, -448, -315, -1085, -3491, -4425, -1418, -4010, +-3616, -1578, -830, -1108, 2698, 4147, 1419, 3041, 4431, 2011, 1630, 3028, -804, -2266, -928, -3687, +-4055, -2237, -2755, -3664, -583, 610, -712, 3938, 3957, 2063, 3084, 4311, 1083, 1747, 1460, -2014, +-2055, -2619, -3207, -3843, -1972, -3005, -1378, -582, 1093, 2644, 2327, 3790, 3484, 2223, 2527, 3099, +56, -840, -580, -3202, -3737, -2148, -3511, -2781, -1122, -893, -509, 2829, 3094, 1968, 3997, 4122, +1616, 1645, 3054, -993, -2043, -1256, -2501, -4797, -2082, -2153, -3289, -801, 835, 1000, 1682, 4650, +2593, 2195, 4518, 2217, 98, 1536, -59, -3760, -2237, -1681, -4460, -2791, -759, -2336, -1212, 2184, +1428, 1932, 4373, 3732, 1573, 3270, 2796, -674, -327, 80, -3569, -3635, -1589, -3196, -3655, -774, +-690, -692, 2620, 2857, 2035, 3716, 4062, 1069, 2266, 2138, -328, -1743, -1066, -3432, -3844, -1753, +-2683, -2803, -534, 553, -19, 3073, 3276, 2278, 3194, 3624, 1003, 1207, 1458, -1433, -2001, -1858, +-3288, -3232, -1716, -2219, -1718, 352, 337, 1885, 3227, 2787, 2446, 3194, 2361, 682, 1281, -158, +-1639, -2524, -2150, -3624, -2712, -1568, -1444, -891, 968, 1531, 1832, 3410, 3073, 2347, 2488, 2192, +85, -10, -752, -2063, -3120, -2491, -2836, -1853, -1600, -712, 249, 1124, 1834, 3009, 3323, 2559, +2799, 1761, 1198, -141, -951, -1595, -2433, -3046, -2589, -2129, -1918, -984, 304, 543, 1891, 3005, +2727, 2780, 3164, 1633, 1441, 749, -1041, -1523, -1497, -3083, -2758, -1681, -2895, -844, -122, 303, +1469, 3076, 2501, 2918, 3102, 1749, 1619, 873, -370, -763, -2112, -2748, -2073, -3008, -2472, -785, +-463, 142, 1487, 2045, 2999, 2757, 2794, 2169, 1965, 437, 426, -787, -1892, -2193, -2506, -2407, +-2186, -1075, -1208, 450, 952, 1307, 2532, 3073, 1925, 2357, 2072, 409, 79, -17, -2093, -2026, +-1624, -2620, -2327, -1051, -926, -749, 1354, 1335, 1483, 2348, 2448, 1243, 1955, 784, 106, -139, +-1334, -1674, -2009, -1964, -2306, -1075, -1248, -466, 195, 1057, 1544, 1790, 1964, 1883, 1096, 1091, +350, -759, -718, -1509, -1942, -2084, -1584, -1685, -1066, -609, 125, 445, 1327, 1667, 1595, 1547, +1364, 619, 596, -301, -906, -949, -1929, -1639, -1779, -1418, -1299, -351, -363, 503, 966, 1151, +1202, 1499, 948, 633, 730, -92, -694, -1128, -1032, -1872, -1421, -1082, -1126, -1143, 1, -63, +651, 1070, 864, 886, 1259, 746, 136, 314, -335, -1022, -1250, -763, -1619, -1328, -703, -582, +-946, 71, 575, 361, 775, 1000, 660, 611, 505, 41, -306, -466, -747, -1186, -1071, -951, +-795, -864, -336, -245, 15, 376, 752, 491, 525, 642, 277, 7, 39, -323, -808, -691, +-994, -886, -639, -537, -643, -106, -22, 171, 356, 629, 335, 305, 383, 20, -115, -257, +-397, -755, -654, -606, -535, -686, -212, -374, -84, 47, 290, 236, 288, 301, 103, 160, +-184, -86, -395, -453, -426, -441, -620, -289, -382, -364, -99, -1, 2, 244, 127, 24, +181, -5, -118, -104, -180, -440, -313, -315, -358, -387, -159, -312, -220, 2, -55, -72, +46, 1, -147, -5, -85, -178, -182, -153, -269, -237, -189, -222, -204, -166, -158, -163, +-131, -133, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 45, 62, 88, 110, 132, 134, 123, 128, 129, 127, +127, 125, 127, 125, 125, 127, 127, 127, 125, 141, 146, 138, 187, 219, 226, 228, +204, 274, 113, 468, -74, 2526, 313, 672, 13864, 26536, 30280, 18365, 5299, -2374, -10272, -18653, +-16730, -11394, -16375, -25020, -25593, -15188, -1693, 10710, 15703, 5586, -9066, -19615, -11610, 577, 8469, 12688, +6961, -2014, -10985, -10951, -5578, 4935, 17898, 17073, 7926, -1921, -6812, -6352, -1050, 10040, 14292, 7359, +-5891, -17250, -16821, -4667, 10483, 13826, 12658, 9186, 3348, 1422, 3299, 13697, 18826, 15319, 6062, -5338, +-7888, -4891, 1152, 5522, 9167, 5556, -7711, -14906, -13333, -2582, 6504, 9482, 8900, 166, -3497, -6407, +-8396, -3391, 5192, 9278, 1493, -5004, -10157, -12774, -11770, -8848, -3806, -4418, -4403, -7272, -10942, -4327, +2343, 4067, 3285, 4888, 4961, -1519, -6420, -7165, -535, 3768, 4218, -602, -7608, -4839, -3447, -2808, +1945, 6326, 5440, -767, -1955, 1309, 5470, 7819, 8365, 8912, 6274, 4969, -1999, -5728, 1600, 5665, +4907, 284, -253, 1544, 3128, 7013, 9410, 13237, 13867, 12689, 7757, 5960, 9771, 4819, 1737, 3274, +4451, 2999, -3684, -6765, -6531, -2378, 600, -1145, -1723, -869, 365, -5203, -6322, -2054, -719, 1321, +-881, -2144, -4184, -6687, -7240, -6528, -1191, -216, -5673, -12900, -12911, -8285, -8224, -5591, -4253, -3531, +-4179, -8746, -10375, -10331, -2668, 2558, 1787, -346, -3860, -6957, -10282, -5381, 1518, 6395, 7074, 1487, +-805, 221, 3437, 5103, 5425, 12498, 13928, 8065, 2076, -367, 1390, 4347, 8275, 6370, 4894, 2275, +-539, 898, 5769, 14603, 14029, 9560, 9148, 8016, 7911, 7900, 9608, 11606, 12778, 8564, -500, -3035, +-1661, 2327, 2041, -487, -782, -6904, -9863, -9812, -6797, -1912, -31, -895, -3905, -3589, -4597, -6019, +-5274, -1162, 4560, 188, -7093, -12087, -15020, -10791, -8353, -6827, -6759, -8489, -12739, -17488, -15571, -10166, +-3066, -1986, -1233, -1157, -5989, -7613, -7549, -1482, 6864, 7754, 2071, -5330, -7500, -5566, -1269, 3250, +7175, 10258, 7007, 3956, 1484, 3241, 9779, 11899, 14287, 13458, 9147, 2647, -1368, 2109, 9133, 14739, +12075, 6981, 4303, 5074, 8823, 9784, 14594, 18942, 16329, 11605, 5531, 4743, 5546, 8178, 9763, 7737, +4010, -3350, -7870, -9193, -3075, 1511, -1194, -4024, -7210, -7592, -7630, -6867, -2881, 17, 1927, -2221, +-9313, -12877, -11380, -6962, -5272, -2585, -5915, -12755, -18311, -20284, -14317, -9643, -6251, -7713, -10277, -9853, +-10869, -11603, -9100, -1368, 3004, 1026, -3602, -9062, -8620, -5650, -812, 4252, 4759, 4623, 86, -2240, +786, 6157, 10603, 12329, 13760, 11679, 8994, 4704, 4631, 10731, 15137, 16780, 10952, 3835, 2677, 3982, +8711, 13557, 16221, 14400, 9561, 5489, 4048, 8456, 11259, 14206, 13946, 9963, 5930, -973, -1712, 1967, +6580, 8281, 2759, -5290, -9303, -7835, -6433, -3913, -1048, -1727, -3484, -8436, -10520, -9669, -8008, -3404, +-3249, -4732, -7771, -13158, -18081, -15939, -8900, -7272, -8430, -13016, -15895, -15990, -15728, -12301, -9129, -4131, +-525, -4250, -8580, -9257, -6337, -2994, 1447, 4363, 2579, -823, -5790, -4917, -510, 4882, 8154, 5604, +4906, 4479, 3060, 2505, 6302, 13263, 16908, 15663, 10112, 5876, 5455, 8039, 13397, 16111, 18055, 14589, +6966, 5182, 7715, 13255, 15136, 15680, 14444, 10621, 7194, 3992, 5276, 9469, 15622, 14392, 5628, -272, +-4974, -5607, -3671, -1072, 453, -2702, -6720, -11048, -11518, -7875, -4785, -2648, -2444, -2526, -8257, -13623, +-14539, -11208, -4402, -3943, -8485, -15338, -19276, -18168, -16840, -13952, -10380, -8843, -11097, -13835, -13489, -12163, +-7294, -3661, -495, 2002, -556, -3909, -7858, -4742, 2703, 6255, 5272, 2247, 190, -1577, 320, 2726, +6767, 12746, 13831, 11538, 7584, 6614, 9270, 11411, 17005, 21021, 18179, 11073, 6370, 6095, 9363, 15856, +15906, 13248, 10422, 8311, 7539, 6220, 10466, 15163, 15861, 13491, 8537, 3734, 1983, 4009, 5371, 6536, +5357, -1684, -7500, -10704, -8024, -4705, -4918, -4468, -6637, -8958, -11180, -12153, -11563, -7894, -3568, -5417, +-9650, -15250, -17933, -17342, -15504, -10473, -9731, -12891, -16680, -19896, -18940, -15992, -12030, -9502, -6100, -4325, +-7029, -9834, -10915, -5401, 341, 3279, 3036, -1204, -3332, -3972, -2580, 941, 5054, 7137, 5517, 4455, +4385, 5742, 8115, 11358, 16911, 19194, 18288, 13077, 9134, 12093, 16533, 20275, 19023, 15777, 11549, 8277, +8387, 10102, 13913, 16009, 15798, 12067, 8136, 7625, 6411, 8025, 11773, 13628, 10917, 2739, -2803, -4969, +-3415, -957, -1277, -3959, -7419, -9202, -13075, -13500, -10291, -7710, -5485, -6615, -8892, -12795, -16003, -15151, +-12885, -9914, -9217, -12987, -19860, -22085, -19165, -18160, -15740, -14267, -13142, -12638, -14519, -14543, -13787, -8998, +-2853, -351, -1238, -2818, -4448, -6158, -2652, 2198, 4996, 5319, 2223, 1256, 1744, 3453, 6814, 8960, +12325, 14489, 13326, 10605, 11200, 15137, 18994, 21702, 19404, 16452, 14638, 14340, 16338, 16766, 16774, 14840, +11624, 10277, 10832, 12689, 13712, 14104, 12524, 10714, 9485, 6976, 7357, 9692, 11327, 9164, 2727, -1908, +-4315, -3746, -2319, -2660, -4772, -7413, -9265, -12740, -12997, -10388, -8188, -6305, -7171, -9134, -12818, -15813, +-15135, -13026, -10210, -9667, -13408, -19844, -21799, -19115, -18135, -15779, -14296, -13139, -12670, -14465, -14475, -13670, +-8902, -2837, -370, -1247, -2819, -4451, -6147, -2644, 2198, 4998, 5297, 2260, 1256, 1744, 3453, 6769, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -93, -125, -105, -117, -112, -112, -115, -110, -117, -109, -115, -109, -117, -109, -115, +-110, -115, -112, -115, -113, -114, -113, -114, -113, -114, -112, -114, -114, -114, -113, -114, +-113, -114, -113, -114, -113, -114, -110, -125, -56, -102, 1661, 199, 2291, 1661, 1995, 947, +262, 211, 1896, 3059, 937, -143, -238, 3651, 10817, 10607, 11627, 11748, 7917, 8900, 7987, 3867, +-881, -1433, 120, 1947, -5970, -11172, -12374, -14536, -13308, -5010, -4118, -4821, -3925, -1704, -2175, -563, +-4007, -5636, -1681, -7834, 221, 1690, -122, 2594, 5441, 7228, 7778, 5631, 9589, 11775, 8746, 13959, +20360, 13294, 5541, 590, -2338, -5750, -12818, -12179, -13729, -13046, -4444, -5835, -12154, -15179, -12096, -6678, +-10432, -14598, -16119, -15383, -12770, -11626, -8949, -8800, -7730, -5738, -2551, 1437, 1674, 5691, 6252, 14046, +15546, 13352, 12636, 9150, 13801, 17250, 13973, 15073, 12645, 13610, 16173, 12620, 14786, 10108, 7267, 8208, +4841, 4017, 716, -5827, -3444, 3758, 2148, 929, -4948, -5183, -6612, -9832, -9949, -10574, -14286, -12259, +-7940, -10781, -6159, -7594, -6662, -8517, -14219, -10755, -15769, -12940, -6355, -7767, -3753, -1872, -335, 6765, +10943, 13206, 10146, 12260, 8314, 7374, 12785, 11229, 13536, 10641, 7545, 3335, -2778, -1026, -1304, -5155, +-3500, -1103, -1588, -5722, -3376, -136, 2119, 1028, -1224, 3697, 2999, 2430, 3862, 6973, 7662, 1647, +291, 7436, 7235, 5101, 4718, 5999, 1538, -1727, -7328, -9570, -6712, -3638, 3314, 5497, 3820, 8369, +9375, 14550, 14708, 9487, 9357, 5772, 3949, 8205, -1467, -5422, -5178, -6803, -7952, -9121, -7797, -7114, +-365, -10333, -14002, -18418, -17399, -12901, -14877, -9615, -11280, -12432, -2291, -4860, 1670, 2141, 4744, 8297, +4121, 7211, 6258, 11423, 8191, 4897, 7123, 3106, 7991, 5053, -3338, -870, -4408, -2476, -626, -5302, +-4996, -1821, 5505, 2683, 2546, 2637, 3817, 12857, 6906, 7902, -991, -6328, -3763, -4254, 1921, 510, +-4053, 1753, -2940, -1913, -6391, -10889, -6448, -490, 8215, 5001, 9976, 11976, 11807, 20652, 16279, 13654, +13554, 16599, 24506, 16756, 13672, 6756, 5268, 1755, -10148, -10079, -16501, -14652, -6760, -9986, -3076, -7191, +-7853, -6298, -10114, -4181, -9944, -9750, -7622, -10010, -4699, -17669, -7026, -1719, -6583, -6333, -12595, -2900, +-701, 100, 983, 532, 2747, 1390, -1364, -6506, -5484, -1043, 68, 6591, 3604, 5248, 18897, 14482, +13154, 7929, 1869, 8268, 3350, 5628, -5725, -14020, -9313, -10292, -4758, -12227, -16279, -5558, -9177, -2940, +-4387, -4520, -4976, -8180, 2945, 3290, 3081, 3988, 3736, 14113, 14418, 16067, 17273, 15397, 23550, 16263, +14746, 15325, 11472, 16595, 14035, 17201, 14131, 8889, 7347, 3469, 7118, 5853, 1394, -6493, -15780, -14883, +-16362, -14376, -17806, -19871, -16090, -14826, -11305, -8873, -8791, -10147, -13069, -8872, -11379, -15508, -15541, -18675, +-14655, -15421, -19684, -18853, -15848, -10768, -9808, -3691, 2928, -2509, -289, 449, 2359, 15452, 12771, 20471, +22127, 23434, 31045, 22989, 19736, 15738, 7228, 13284, 5854, 9989, 6081, 3174, 7013, 73, 9409, 808, +1928, 3460, 4376, 12967, 7976, 11836, 6173, 4131, 708, -4622, 3586, -5670, 4097, 4914, -56, 6988, +-4661, 71, -585, 3686, 5747, -2299, 5340, -3425, 6535, 7695, -889, 4720, -6748, -209, -15049, -11130, +-7041, -18489, -4690, -17136, -13110, -9421, -16727, -10393, -19404, -10316, -12703, -9076, -6392, -18718, -7917, -17728, +-7918, -7485, 333, 4598, -443, 4642, -1387, -419, -2484, -403, 8869, 410, 439, -4423, 1020, 7497, +4780, 13091, 1427, 12387, 12808, 18185, 22276, 14055, 20026, 15960, 19320, 10333, 15940, 16855, 11607, 12716, +4511, 7095, 9315, 1768, 5909, -4191, -822, -3822, 6528, 7602, -1467, 6928, -3323, 3037, -9479, -5815, +-3696, -9632, 71, -12038, -7670, -6569, -7625, -14732, -25799, -21116, -26852, -13206, -18940, -18585, -8420, -14405, +-1944, -13668, 2351, -873, -11910, -419, -13007, 5727, -6430, -5022, -6389, -15985, -2858, -13597, 1952, 684, +9053, 10933, -1661, 9761, -3619, 8151, 11338, 4056, 15035, 327, 14966, 8769, 22643, 21380, 9503, 21549, +7705, 18588, 15752, 16741, 17754, 14148, 15330, 1012, 6828, 2185, -5203, 7054, 953, 16600, 6470, 3419, +-1758, -8979, 750, -12151, 1162, -4839, -483, -1802, -3300, 5861, -14119, -3997, -12000, -14206, -9116, -14156, +-12097, -23094, -10081, -15245, -21528, -13526, -26235, -13433, -17835, -11949, -14792, -12880, -1603, -17414, -2727, -14157, +-3701, -4622, 3546, 12474, -3231, 15022, 3500, -1549, 2798, -250, 15537, 9460, 11656, 6967, 3656, 14268, +-448, 10573, -1748, 5509, 2775, 5364, 18593, 8238, 19474, 4980, 6690, 5185, 5313, 17487, 9809, 21128, +19896, 15979, 18713, 5085, 9380, 4191, 10250, 1298, 7994, 7320, 2133, 11398, -2349, 680, -7423, -1733, +-762, -4928, -1617, -13541, -2162, 245, -3730, -6090, -13437, -7210, -21017, -7196, -12095, -10652, -8014, -22789, +-18809, -26097, -16061, -22309, -25837, -11161, -19531, -5654, -6861, -8620, -9256, -7577, 5616, -9625, 8902, -5897, +3886, 3748, 5289, 2427, -9347, 10527, -1384, 10884, 15197, 3997, 20870, 12732, 20125, 4849, 16672, 13923, +9401, 32523, 16644, 32523, 19566, 22412, 17956, 10703, 26642, 2316, 17690, 4441, 774, 12757, -609, 10444, +-15253, 3564, -13419, -11098, 1335, -14457, 3304, -9624, -2694, -20786, -13075, -7616, -14729, 5970, -8999, -4782, +-3604, -2615, -667, -12106, -1446, -23006, -9546, -17417, -19517, -20331, -21904, -14894, -31620, -16450, -29047, -10109, +-1287, 5, 5547, 1384, 18098, 1591, 1241, -4080, -8551, 11269, -1138, 4058, -5490, 5659, 10511, 2475, +16889, -3266, 10301, 5888, 8382, 5769, 6222, 16813, 7124, 14748, 3903, 11881, 13906, 18195, 16061, 12611, +22550, 11181, 16008, 1606, 3460, 7439, 12121, 17262, -4639, 13469, 7079, 12212, 10, -6018, -241, -2075, +13862, -3721, 14264, 9184, 2691, 6092, -9475, 5359, -18712, -4224, -20583, -25394, -4902, -20803, -4090, -32679, +-12985, -14657, -11098, -1931, -24569, -2989, -22725, -12048, -27238, -24727, -17408, -20105, 4767, -14520, 1414, -4770, +4264, -1591, -7962, 10032, -10629, 10946, -139, 14955, 16074, 7264, 29945, 47, 26332, 1586, 12046, 20049, +5979, 22480, 1807, 30335, 11874, 13692, 16612, 1775, 22736, 8674, 19944, 6871, 10951, 15747, -1, 2825, +-10690, 5153, -3508, -325, -2959, -6207, -840, -13376, -1326, -15456, -9201, -12843, -13183, -7509, -19619, -3474, +-16370, -1636, -10766, -14399, -2786, -6018, 3374, -15382, 539, -2313, 1935, -3546, -15541, -13303, -12510, 2150, +-9370, -5369, -3905, -11884, -3335, -15330, -8355, -7031, 6218, 1101, -12407, 2464, -4486, 9470, -1939, -7189, +-6063, -634, 2253, -12697, 2521, 3532, 13057, 8368, 4744, 12771, 17410, 25097, 5417, 6633, 9747, 18015, +16780, 8402, 11847, 14016, 25242, 10178, 16503, 24094, 16038, 15815, -4012, 6824, 7020, 9179, 3531, -11413, +1671, -4557, 3590, -2901, 1472, 3878, 6443, 11246, -9720, -8494, -2960, -661, -11650, -19842, -25891, -20046, +-6460, -19106, -17599, -17661, 250, -7185, -17743, -16050, -30263, -1787, -18852, -16701, -10679, -14888, 3792, -25465, +-6822, -13004, 1372, 6843, -10740, 4683, -2730, 7176, -4194, 262, 76, -3003, 12224, -2129, 2206, -1834, +4572, 10912, 813, 11521, -1591, 24856, 10506, 16014, 12693, 17710, 25011, 377, 27594, 3680, 19644, 14169, +7182, 7688, -272, 20066, 154, 4979, 2286, 1132, 16813, 1092, 1246, -11462, 3135, -5068, -11679, 4287, +-12768, 3430, -10983, 1081, -15848, -9107, -2514, -18195, -1067, -25493, -8803, -9596, -7475, -11505, -10768, 6188, +-14346, -6858, -15150, -11121, -10129, -3794, -5655, -17195, -2568, -7971, 1738, -2167, -5441, -3091, -5, 11519, +-11752, 5541, -3231, -7423, -1902, -13928, -1035, -15474, 11728, -1186, 7029, 16709, 11748, 18401, -1262, 13318, +767, 20967, 14473, 4363, 19347, 7839, 27511, 6179, 15437, 9746, 12620, 28984, -3071, 18324, -5252, 18960, +4248, -1830, 9739, -5788, 21240, -7932, 6634, -3392, -671, 8004, -5954, 11627, -14384, 9448, 149, -3665, +-1487, -16148, -2051, -30660, -9564, -24233, -20016, -8019, -26423, -7904, -24201, 572, -10943, -6578, -7475, -22371, +-301, -18811, -6009, -20215, -2876, -7611, -15161, 6019, -11103, 10825, -8761, -905, -5882, -7181, 2618, -13505, +3397, -4925, 13859, 12167, 11980, 19470, 12190, 29081, 7240, 17070, 7306, 8321, 17433, 3605, 18025, 3501, +25455, 10772, 18656, 17650, 2957, 16624, -634, 19576, 3592, 13565, 7289, -6090, 5822, -8339, 10464, -7225, +4102, -590, -7753, 1928, -11578, 886, -11185, 2364, -10366, -10148, 2567, -15336, -1045, -23086, -13906, -24472, +-20850, -11172, -26976, -1908, -19633, 1537, -10728, -5541, 102, -11461, 8785, -15727, 5537, -8839, -2197, 2860, +-8135, 12567, -10112, 13453, 1196, 6959, 5864, -13822, 2650, -18479, -62, -12736, -4049, -297, -9939, 10699, +-4840, 17579, 3833, 13347, 12470, 1193, 23339, 4651, 25084, 5529, 16564, 11959, 6828, 19590, -1647, 19963, +2595, 13100, 6675, 1044, 13316, -167, 18668, -3823, 6526, 10917, 10025, 17651, -2531, 20588, 5536, 13125, +604, -14277, 874, -9804, 1234, -18071, -10228, -8232, -11624, -9524, -28469, -15723, -19783, -11212, -17641, -23191, +-15119, -15539, -10372, -17579, -11576, -10701, -6686, -7255, -13385, -11089, -12804, -2301, -6459, -8920, -7390, 3857, +8510, -2408, -2282, -1719, 8134, 6144, -160, 73, 6837, 18527, 8476, 9965, 13691, 21200, 24838, 16846, +15122, 13135, 21186, 14771, 7121, 2703, 10057, 8653, 2538, 5403, 2561, 8723, 9037, 1588, 1920, 595, +9235, -2475, -6487, -2489, -1873, 10013, -3306, -2256, -4583, 2576, 377, -5271, -6425, -8512, -8197, -9634, +-6595, -8163, -4473, -2444, -6509, -8403, -9707, -6733, -5789, -6939, -6578, -8929, -10440, -11775, -3564, -1382, +-8359, -2983, -1816, 1356, -577, -5355, -2688, -5669, 5, -4962, -6895, -1302, -3558, -6871, -2498, -6601, +-5581, 3345, 296, -662, -3798, 7316, 9039, 7163, 14394, 4276, 9324, 13292, 15795, 12189, 3472, 16348, +7744, 14041, 12473, 15066, 23128, 13980, 13919, 3400, 8714, 8782, 3099, 9266, 422, 246, -3001, -146, +3586, 2112, 6819, -2618, 2694, -1831, 4208, -927, -4283, -2628, -7885, -2155, -16644, -9396, -11403, -14560, +-15272, -14089, -10123, -17396, -9776, -10825, -10810, -11458, -18731, -13624, -16808, -6254, -19372, -4898, 3898, -5728, +3080, -6648, 5097, -8529, 5238, 705, -3246, 7841, -5659, 7255, -3376, 5015, -211, -1026, 11834, -820, +10779, 5250, 12199, 16297, 12223, 11506, 7459, 20265, 12095, 12664, 11360, 13362, 16726, 8082, 11816, -125, +11893, -2371, 411, 4734, -1840, 9134, -5277, 9344, -4937, 7399, 4133, -9085, 7398, -8815, 10686, -3154, +4065, 909, -9547, 3876, -18654, -1181, -16804, -12920, -6164, -17585, -5022, -22339, -5969, -11699, -8543, -9615, +-15522, 3501, -15229, -3621, -14635, -5833, -4325, -7759, 2783, -9147, 5205, 532, 2848, -3202, -5839, 5222, +-2203, 7433, -9610, -1388, 3346, 2621, 9512, -419, 14549, -619, 14002, 7822, 4077, 12018, 1338, 12140, +-4724, 9724, 11928, 8096, 8117, -4602, 16071, 10622, 12500, 8199, 5951, 11263, -2442, 11380, 5428, 11913, +9134, 7584, 7428, -2106, 3220, -546, 4982, -8078, -6263, -3459, 4967, 4884, -5599, -1868, -9627, -4652, +-7444, -12214, -9527, -10656, -4264, -16308, -15853, -8855, -11030, -6517, -20873, -11219, -10783, -7056, -10458, -16308, +-8602, -19808, -12833, -13579, -7302, -6963, -7184, 3056, -3608, -968, 3041, 997, 3570, 5929, -665, 1021, +4520, 5505, 5023, 142, 3652, 6424, 11005, 13255, 7688, 15703, 13787, 11462, 11616, 16509, 18986, 11514, +9204, 129, 11310, 11930, 10815, 8527, 4385, 6950, 5006, 6314, 709, 3716, 8714, 5208, 2160, 2225, +3915, 1414, -3634, -4462, -3345, -428, 103, -3444, -6179, -9101, -8518, -6395, -10890, -9972, -9839, -4928, +-1190, -9348, -7521, -5965, -307, -2778, -11361, -14415, -14693, -2368, 1346, -5333, -6949, -4548, -2674, -4531, +-4147, -2296, 3871, -3706, -8241, -5389, -2140, 1903, -5348, 182, -651, 9329, 9348, 1960, -1482, -1340, +4060, -1687, 323, -212, 1649, 5694, -3075, 3070, 5043, 9512, 11944, 10239, 12237, 4700, 13161, 11796, +8742, 7386, 7318, 9189, 4069, 7308, 3787, 6997, 9445, 5016, 430, -730, 6046, 3489, 837, -7141, +-6310, 1268, -2978, -7758, -13149, -7894, -5668, -4795, -5921, -10716, -1509, -7938, -6483, -10382, -9484, -4234, +-12077, -9896, -22532, -13198, -14239, -10390, -7375, -11355, -6962, -10861, -4257, -8520, -4473, 1765, 3411, 5348, +-2931, -2039, 5420, 9827, 7907, 2773, 9392, 14579, 18960, 10003, 5664, 5131, 5558, 6804, -2567, 8713, +5616, 14553, 9615, 4555, 10445, 7428, 13860, -2499, 661, 7861, 8045, 13714, 2303, 2300, 3695, 5629, +2972, -4757, 6108, 6848, 10236, 2162, -6726, -2793, -1154, -1229, -12551, -13452, -8184, -1559, -2582, -3576, +-5177, -2994, 802, -5520, -6682, -5985, -4150, -6544, -7774, -10885, -8581, -3447, -9063, -12000, -13928, -8501, +-977, -5975, -5049, -9577, -1524, -1499, -8631, -9120, -5562, 3710, -207, 469, -1978, -802, 3813, 3801, +2810, 2769, 9412, 7569, 8242, 4783, 8132, 4863, 7003, 2124, -2676, 5591, 4242, 5657, 5790, 6435, +7238, 9595, 13613, 5112, 6882, 13011, 11028, 13156, 3326, 4331, 5868, 8810, 5386, -690, 9232, 7282, +7168, 4366, -328, -4365, -4998, -5946, -10554, -7405, -7359, -11120, -14404, -14403, -16298, -8974, -7617, -13113, +-8073, -8068, -5771, -7391, -6871, -8341, -14680, -3391, -9317, -11099, -6386, -9528, -1108, -9996, -5528, -5054, +-2722, -2014, -13082, -434, -788, 5077, 2823, 4685, 8573, 2427, 6382, -894, 4019, 6164, 15261, 14549, +9731, 7831, 8145, 10008, 5854, 5276, 3052, 3796, 7119, 6993, 10760, 4678, 8406, 7604, 4884, 7521, +-2393, 11863, 1079, 7682, 2448, 3426, 5067, -7042, 2771, -5004, 8785, 6627, 5551, 9662, 919, 7788, +-2626, -7933, -10914, -9960, -5155, -15286, -9913, -8619, -2876, 183, -2408, -6828, -7002, -2332, -9136, -5771, +-5703, -4768, -2760, -3052, -6706, -11899, -466, -5154, -3479, -5289, -4342, 93, -2910, -1930, -10913, -5833, +826, 1081, 7182, -556, 2634, 7059, 3080, 459, -2211, 4158, 4466, 9272, 5057, 8113, 12941, 12044, +7276, 4487, 8529, 8063, 9509, 6304, 3488, 2291, 6216, 2164, -202, 1986, 1724, 4380, 1700, 1040, +294, 732, 691, -3031, -149, 658, 5279, 4473, 3617, 1359, -3135, -1611, -8141, -8673, -10492, -8932, +-9028, -14087, -7607, -5885, -3531, -7820, -9639, -6391, -4748, -4106, -9668, -4004, -8518, -3148, -800, -7846, +-2853, -11912, -4404, -8828, -5686, 609, -8218, 314, -8809, -4499, -5934, -3696, 2151, 890, 11254, -1562, +8485, 12364, 12613, 13905, 8809, 13748, 4573, 8101, 6040, 8561, 12721, 10948, 11840, 7685, 10919, 5974, +8627, 7449, 2141, 8365, 2008, 6455, -1680, 1185, 2284, 1816, 8417, 3125, 8232, 337, 3670, 275, +641, 2020, -1424, 2912, -5874, -5306, -6176, -2261, -3363, -9220, -2264, -4651, -3821, -6338, -8772, -6634, +-7436, -2526, -9644, -5350, -6047, -2010, -1821, -6149, -6002, -7545, -85, -8071, -8194, -7759, -5629, -2708, +-2347, -1373, -6246, -1341, -4738, -4622, -1332, -1529, 2736, -1395, -1147, -2071, 5032, 10624, 4693, 8842, +5256, 5197, 1086, 3143, 1734, 618, 4955, 830, 7095, 4874, 7995, 8486, 11762, 11821, 4531, 12585, +5403, 2682, -1884, -2765, 2630, -3110, 3621, -1889, 1237, 2311, 758, 3469, -4846, 4126, 1564, 1049, +-4290, -6973, 553, -1593, -968, -11237, -10234, -10919, -13230, -11991, -14282, -12479, -12633, -5897, -11561, -10575, +-7577, -6680, -3667, -6578, -1350, -1590, 3046, -1445, -4840, 2880, 1293, 4414, -1035, 507, -2125, 1286, +9004, -905, 7584, 3866, 8100, 4644, 692, 2895, 3193, 13249, 4218, 6217, 4290, 3520, 5585, 4441, +7647, 3676, 10904, 7841, 3832, 3106, 3303, 6795, -602, 4509, -2068, 2144, -2456, -7940, -3323, -4858, +4153, -2907, 4254, 2119, 2083, 10408, 3182, 8329, -73, 5517, 3061, -4218, 3077, -3347, 3599, -477, +-1169, -4072, -7467, -4181, -10159, -5504, -7675, -4981, -1087, -2775, -5455, -9627, -3585, -7006, -4172, -4702, +-488, -1040, -3792, -3518, -9654, -2493, -6861, -4724, -7083, -7996, -2242, -1490, 7709, 286, 5326, 4681, +25, 3958, 1170, 7739, 2429, 5428, 3920, 572, 3433, -1879, 2373, 403, 5995, 8248, 7260, 10016, +4354, 8796, 6770, 6084, 4216, 6176, 7414, 1171, 128, -2730, -2107, -3425, -438, -2489, -1975, 694, +-3022, -534, -2736, 2020, -4210, -4311, -8382, -12281, -582, -6182, -4801, -7196, -9301, -6055, -9812, -6682, +-11155, -8074, -3942, -6071, -1951, -8766, -11461, -10070, -7690, -7147, -3497, -1327, 2039, 3492, 2356, 4938, +554, 3633, -1249, 1499, 1467, -1472, 5061, 1, 4809, 1007, 3195, 2521, 64, 4709, 4261, 8879, +7888, 8646, 11418, 4652, 3959, 4865, 7323, 7239, 4705, 8549, 10211, 13942, 8554, 4618, 1010, 3157, +1015, 1569, 3255, 452, 5788, 2482, -379, -6590, -2275, -2851, -3932, -874, -1137, 2844, -2233, 2551, +2163, 447, 1317, -1353, 3939, 692, 612, -1503, -5013, -3449, -10250, -5847, -5736, -6813, -4141, -6479, +-3532, -7660, -5263, -5750, -8979, -5102, -6179, -2866, -1147, 818, 1650, 937, -254, -1030, -1375, -2257, +-4130, -4021, 774, -535, -565, -1224, 39, 2420, -212, 768, 2067, 4637, 6187, 3595, 3670, -859, +-879, 3566, 1617, 3483, 5759, 10697, 10589, 9824, 9411, 4621, 905, -268, 589, 42, 1402, 1316, +192, -260, -6159, -5558, -2764, -1491, -3201, -4012, 52, 556, -830, -2184, -6866, -5799, -4490, -5328, +-1210, -2076, 1632, 233, -3521, -7201, -9600, -6307, -6891, -10070, -5665, -6176, -2402, -3718, -4615, -2940, +-4491, -2969, -7335, -2417, 418, 4936, 7006, 4288, 4229, 1661, 4416, 3588, 2482, 5386, 5806, 5514, +3318, 3088, 3008, 5297, 5300, 3507, 6115, 6687, 9376, 9833, 4515, 1287, -320, 4224, 1009, 13, +4084, 7496, 8635, 5767, 3668, 2407, 6032, -1355, -2146, -4513, -1978, 1048, -6506, -4276, -8742, -1181, +-2199, -8383, -1527, -4205, 1595, 42, 335, 3366, 458, 3930, -895, 2429, 531, 1130, 5165, 3008, +5629, -3649, -2429, -4001, -3119, -3012, -6173, -4765, -4921, -3575, -6217, -6370, -6919, -6824, -4273, -6096, +1498, 1543, 2602, 2426, -2320, 1025, -3879, 173, -2505, -307, 594, 1053, 6120, 3995, 2507, -1001, +-1203, 2810, 2468, 6826, 5626, 9740, 6869, 257, -250, -4174, 2691, 1864, 2173, 3586, 4099, 8020, +1678, 1602, 4397, 3852, 3137, -2843, -207, 955, 1843, -996, -6382, -4602, -4917, -3893, -6720, -8403, +-4068, -2532, -1161, -5583, -7451, -3935, -4644, -8835, -7589, -5941, -2416, -2475, -4345, -6842, -4814, -2905, +-1552, -5672, -6089, -1792, -980, -701, -6402, -2781, -3778, -1891, -3090, -360, 5035, 7659, 9570, 5542, +5873, 4448, 4659, 721, -1514, 2233, 7008, 10013, 5946, 4392, 6229, 5394, 4650, 1994, 3018, 6145, +7148, 4542, -146, -802, 648, 4051, 3064, 314, 3307, 5455, 3240, -49, -4026, -39, 2053, -730, +-2426, -2245, 4365, 5751, 850, -226, -2412, -501, -257, -4354, -1472, -2343, 5691, 1258, -619, 46, +685, 2614, -1234, 1842, 1583, 2476, 1351, -4281, -6360, -4976, -4717, -4964, -7642, -4513, -2411, -1227, +-2320, -5726, -3861, -3270, -2445, -4496, -3469, -2916, -78, 1305, -903, 76, -2779, -758, -2233, -2354, +-2178, -1310, 823, 893, 1550, 1842, 1432, 2253, 2342, 1089, 653, 3736, 5465, 3689, 1264, 1824, +5461, 5680, 8456, 3725, 5471, 5926, 1973, 1438, -1553, -718, -3031, -1140, -1479, -1775, 1262, 1242, +28, -4084, -7126, -7980, -9358, -3918, -4317, -4743, -4293, -3823, -5461, -5757, -3963, -6323, -3243, -5583, +-6352, -3662, -2832, -2354, -9270, -7022, -7715, -4628, -2751, -4171, 914, 934, 3857, -1553, 383, 2401, +1928, 5958, 1632, 3552, 8258, 6760, 4654, 726, 2106, 2842, 4148, 5276, 4024, 7376, 7538, 9526, +1641, 2613, 3032, 2809, 5902, 550, 4211, 7613, 7786, 2359, -2320, 616, -424, 2629, 1377, -708, +3634, 3741, 2983, -2114, -1716, 456, -1780, -3453, -3115, -2120, 912, -766, -3182, -3856, -1408, -618, +-870, 1815, 2129, 6082, 4771, 2043, -502, 2977, -837, -1501, -2353, -1183, 1564, 1742, 4053, 212, +-622, -3115, -5209, -4960, -5286, -7783, -4960, -4582, -5040, -6499, -4364, -5064, -2930, 129, -1050, 1070, +514, 2182, -695, -1516, -367, -1113, 899, 435, -241, 3532, 2049, -997, -3724, -3250, -2318, 1007, +4765, 5280, 6963, 7205, 7265, 6197, 5410, 2124, 2155, 1687, 1850, 1879, 3040, 3067, 487, 1130, +-3178, -4104, -5260, -3869, -4385, -4545, -1467, -3721, -2124, -1519, -3471, 459, -757, -3448, -5076, -3539, +-3100, -5548, -5062, -9562, -7715, -4075, -2958, -3086, -3469, 595, 1014, 1247, -661, -4249, -3709, -2775, +-3967, -2994, 78, 1713, 769, -163, -1700, 1052, 5296, 4269, 2562, 2388, 4828, 5224, 3696, 2873, +2629, 3139, 4858, 3241, 5261, 7601, 7497, 8174, 6462, 4715, 1660, 3207, 3624, 1639, 4311, 3138, +3662, 3554, 3925, 881, -754, -1127, -527, -705, 303, -233, -1626, -1528, -5348, -3235, 154, -981, +-1443, -1490, 956, -60, 6, 749, -308, 2340, -194, 1281, 2265, 2135, 2545, 1154, -439, -2338, +-1876, -691, -2576, -1069, 442, 632, 570, -706, -869, -3173, -3594, -6386, -4791, -4670, -3569, -783, +1203, -2565, -6247, -3341, 330, 2194, 335, 1620, -262, -52, -241, -1961, -2594, -2558, -1581, 763, +2128, 2878, 2566, 5052, 2870, 1743, 1295, -611, -483, -3062, 1049, 1178, 2469, 2570, 1360, 1761, +-1368, 1961, 2172, 1491, -532, -1186, 1855, -2225, -2420, -5171, -2259, -656, -2003, -2483, -5348, -4723, +-2571, 199, 593, -943, -628, 1620, 309, -1447, -2339, -2427, -3569, -5989, -5457, -4854, -6968, -4486, +-4210, -2924, -2101, -1335, 687, -2488, -1801, -3806, -1498, -1088, -4316, -2206, -2251, -1103, -2668, -177, +2783, 3356, 7706, 6872, 6397, 3584, 5602, 6720, 7738, 6911, 5578, 7979, 3508, 4882, 5170, 5101, +3347, 865, 3168, -248, 1031, 1784, 2204, 1836, 46, 3120, 724, 1089, 1389, 822, 2645, -657, +-1912, -2526, -1931, -2081, -5300, -2066, -3483, -2470, 629, 342, 604, -972, 1486, 1876, 4067, 2963, +3049, 3760, 1186, 1012, 1915, 4089, 2185, 1879, 2044, -1186, -2086, -730, 933, -1985, -1655, -95, +-313, 430, -2136, -858, 377, -2587, -1102, -3239, -1983, -2189, -2087, -1297, -5052, -2323, -2143, -5426, +-7044, -7550, -4909, -5446, -5106, -2708, -172, 2574, -1835, -661, 902, 3293, 4630, 3394, 5587, 3930, +4617, 4014, -245, -1035, -142, 1469, 1210, 212, 1372, 440, 1151, -393, -129, -168, -191, 835, +199, 268, -1579, 1162, 787, -758, -2764, -3018, -2379, -4462, -5393, -4662, -3244, -5988, -4734, -6380, +-5571, -2970, -2357, -183, -2562, -1903, -346, -1848, -3488, -2982, -572, -1193, -701, -2378, -2315, -917, +-3542, -279, -2077, -937, -149, -1203, 1881, 307, 4951, 5968, 4972, 5596, 4646, 6589, 6974, 4288, +5018, 5548, 7407, 6438, 5285, 361, 524, 2230, 2340, 93, -1932, 2363, -85, -594, -3862, -2216, +-1151, 946, 2054, 463, 2156, 1904, 2039, 1610, -599, 2397, 651, 744, -764, -2834, 537, -335, +-1033, -1727, -2062, -594, 202, 1367, 2288, 1438, 2728, 3736, 2318, 75, 1853, 1806, 4214, 1503, +1131, 3474, 4232, 2703, -142, -763, -963, -4010, -4991, -6265, -8887, -5741, -7526, -7383, -7763, -2892, +-3539, -3701, -5553, -5867, -1639, -3450, -3246, -2212, -367, 600, -2158, -2134, -2419, -1388, 1661, 1036, +1867, 2294, 2602, 1377, 3972, 2752, 5039, 4863, 4157, 3973, 4324, 5316, 3164, 3952, 3123, 491, +-3120, -1495, -2197, -3352, -628, 986, 1984, 708, -1612, -2295, -2683, -1050, -3196, -2442, -2698, -1855, +-1442, -2197, -2024, -3978, -2789, -6554, -8772, -7366, -7433, -4579, -5202, -934, -2353, -1503, 662, 697, +4911, 2567, 4564, 2691, 3628, 1446, -677, 611, -3706, 740, 1081, 3282, 3551, 62, 2892, -1554, +2366, 3290, 2838, 4710, 4153, 5585, 2730, 4792, 3729, 4788, 3760, 409, 1516, -474, 803, -2039, +-2301, -943, -958, -540, -1433, -1151, -808, 963, 1508, 1244, 849, 1335, 2555, 1089, 578, 125, +3366, 2945, 2524, 1477, -1092, 858, 602, 1567, -515, -1319, 1121, 1590, 1991, -1985, 471, -1889, +-1355, -2378, -1568, 1597, -381, 1254, -1167, 1863, 1332, 4079, 3376, -609, 2264, 1380, 4448, 417, +-298, 1035, -3435, -3181, -10149, -5617, -2141, 491, 1430, -3345, 205, -3091, 1750, -1489, -2946, -487, +-2460, 1147, -3633, -633, -443, -443, 656, -3765, 32, -2880, 254, 551, -52, 2030, 732, 5242, +439, 1228, 1653, 5040, 7403, 3072, 4402, 3014, 4177, 852, -2780, -1884, -3822, -827, -3846, -3259, +-2957, -3477, -695, -3144, -909, -3520, -696, -2519, -4845, -2759, -4858, -5136, -6687, -4913, -5354, -5873, +-4942, -6488, -5076, -4765, -2019, 1180, 956, 1728, 1787, 5507, 3033, 1373, 1254, 2318, 1945, -180, +-617, -2519, 912, 2492, 2238, 1624, 3387, 4419, 3904, 2815, 1587, 3269, 4059, 3371, 1869, 3105, +3700, 2721, 3947, 2734, 2960, 3656, 3816, 2624, 1768, 1939, -255, 686, -953, -2310, -497, 823, +1603, -429, 337, -1640, -2189, -1409, -1383, 60, 1275, 3880, 648, 1388, 1067, 936, 1094, -1602, +71, -221, 624, -1068, -2388, 1201, 662, 36, -2105, -1644, -304, -503, 1785, -575, 1089, 2030, +2595, 2592, 1952, 2078, -330, -1059, -537, -946, -1036, -2836, -2492, -2004, -3340, -4413, -4829, -2718, +-2785, -2923, -2757, -1986, -1256, -1716, -2800, -1698, -474, 2376, 1287, 1505, 2465, 2800, 4060, -278, +-1200, -1639, -796, 2156, 1752, 2652, 3435, 2478, 3052, 1915, 51, -660, -2, 177, 1430, 572, +-94, -1009, -1780, -1981, -4765, -2838, -3624, -2330, -3463, -5180, -3409, -5644, -2982, -5764, -4206, -2925, +-4884, -2313, -4772, -3338, -4444, -3057, -3103, -5029, -1305, -2828, 103, 1758, 2708, 3416, 280, 2306, +-527, 1227, -1098, -1801, 1385, 214, 2286, 1213, 5712, 6098, 4656, 6242, 4652, 6293, 4191, 3004, +1220, 2773, 3508, 617, 996, -665, 1301, -302, 716, -299, -1135, 1508, -1921, 548, -352, 1850, +2124, 1616, 3219, -846, 2221, 1104, -681, -640, -2652, -348, -2986, -1377, -4947, -5475, -3338, -3455, +-1385, -1031, 2385, 2495, 3452, 2000, 1457, 3855, 3607, 2376, 669, 2091, 663, 1438, 60, -1852, +391, -2642, -2175, -3014, -885, 1627, 1629, 4463, 181, 1230, -200, 124, 1262, -449, 216, -2285, +-618, -3169, -5092, -3641, -2875, -1593, -2697, -1591, 321, 1535, 1535, -2586, -1276, -776, -845, -321, +-1048, 978, 2042, 5078, 3831, 3658, 1855, 2700, 677, -42, -1726, -1703, 1506, 2280, 3120, -13, +406, 762, 2803, 3377, -157, 604, -54, -1477, -2673, -3986, -1653, -3918, -3230, -3109, -3677, -2337, +-2320, -1964, -3124, -1215, -5383, -5663, -5990, -5600, -3589, -2584, -28, -2819, -962, -3313, -1688, -269, +369, 1776, 915, 2676, 1224, 411, -206, -2136, 613, -748, 1820, 1128, 723, 1868, -1646, 3083, +687, 3784, 2526, 3343, 4447, 4479, 6000, 1670, 4804, 1631, 2232, 1292, -1102, 771, -759, 1343, +926, 239, -228, -192, 1500, 915, 577, -966, -167, -168, -1572, -1086, -1853, 1964, 3399, 4349, +2323, 102, 892, -1607, -1964, -5117, -4099, -3235, -3414, -2842, -4326, -1144, -432, -272, 895, 614, +1847, 1304, 1849, 1365, -197, 1863, 1107, 1283, 701, 564, 1687, 3062, 2451, 3020, 1738, 1883, +669, -1399, -1048, -2480, -399, 115, 1504, 99, -1232, -1491, -2456, -1451, -1813, -102, 912, 577, +2448, 225, 1593, -215, 223, 95, -2325, -1330, -1891, 737, -1685, -65, 1523, 1986, 3125, 1014, +2751, 2545, 3178, 3555, 2148, 2599, 1784, 3561, 2012, 3033, 2873, 2991, 3300, -854, -1199, -4413, +-3619, -6084, -6523, -5033, -7743, -4966, -6361, -3757, -2285, -1256, -803, -3298, -3197, -7058, -5179, -5562, +-5914, -4705, -4482, -2419, -6314, -2493, -2658, -1112, 1034, -1130, 3343, 1184, 3639, 1403, 2190, 3813, +1679, 5736, 1988, 4133, 3400, 3872, 4337, 1654, 4923, 2875, 3547, 3621, 3125, 4870, 2511, 3401, +929, 987, -2363, -2121, -1539, -3590, -1394, -2797, 1583, -156, 663, 131, -1733, 1089, -1403, 459, +-1020, 221, 970, 551, 2379, -501, 2570, 1482, -91, -376, -3336, -2572, -4104, -2218, -3275, -4680, +-3260, -2609, -333, 682, 2378, 3608, 4835, 3380, 1752, 1336, 517, 1494, 773, 1145, 1519, 2616, +3876, 2945, 1338, 1058, 2039, 160, 2238, 855, 530, -316, -2929, -2717, -3083, -514, -311, -1462, +-1312, -1767, 161, 748, -845, -1733, -962, 260, -1106, -333, -752, -91, 381, -1632, -1195, 359, +2327, -2, 480, 1501, 2511, 1581, 1515, 119, -903, 3006, 1511, 2834, 2424, 2431, 3918, 1983, +2786, -97, -245, 372, -2315, -1393, -5330, -5368, -4734, -4462, -4739, -8275, -5874, -6299, -4518, -4848, +-5291, -2000, -2262, -2393, -4976, -3013, -1001, -1869, -2163, -2121, -757, 2431, 1758, 505, 582, 834, +1607, 1356, 1894, 2323, 3668, 3098, 2694, 340, 1637, 894, 1498, 2420, 2489, 4054, 4235, 5373, +3016, 4526, 3069, 2227, 2080, -797, -2, 1254, 628, -832, -2974, -671, -1180, -1799, -1630, -3415, +-495, -1062, -818, -1744, -298, 588, -585, -672, -7, 2207, 2691, 2010, 430, 549, 1277, 760, +-245, -320, -781, 858, -730, -2681, -3011, -2294, -1569, -1539, -2027, -2692, -585, 2111, 3353, 769, +1617, 1083, 1971, 801, -1401, 384, 294, 1825, -216, 178, 991, 834, 1325, -454, -143, 879, +1208, 1353, -1694, -1161, -468, -1113, -885, -2925, 215, 1208, 1568, 1467, 401, 2402, 2597, 1964, +1149, 284, 181, 1954, 1165, 137, -238, 525, 142, -1272, -241, -537, 488, 228, -223, -51, +335, 733, -696, 343, 580, 874, 1951, 734, 443, 721, 1167, 435, -1573, -1481, -2671, -2766, +-3861, -5658, -6045, -5635, -3818, -4171, -3816, -3487, -2053, -1800, -1980, -1845, -2218, -934, -1552, -1852, +-718, -41, 293, 388, 127, -779, 50, 478, 28, 708, 451, 1786, 1947, 3119, 2686, 1776, +3920, 4235, 5529, 4106, 2810, 1775, 3227, 2770, 784, 1070, -117, 871, -536, -793, -779, -1010, +758, -1135, -1496, -1571, -2493, -1233, -2774, -2623, -2917, -1625, -2063, -2984, -2402, -1801, -224, -425, +199, -284, 1331, 1690, 1122, 723, -336, 142, 628, 269, -427, 767, 2609, 1530, 1600, 243, +478, -550, -652, -376, -1539, 791, -156, 1361, -147, 57, 311, 619, 640, -1632, 612, 199, +-73, -1295, -1547, 367, 75, 2243, 724, 536, 1103, 128, 1048, -942, -1302, -1469, -444, -501, +-524, 905, 715, 1825, 665, 1385, 949, 640, 1375, -94, 681, 163, 1359, 1887, 1587, 1496, +366, 1650, 337, 1281, 1280, 627, 1584, -91, 1172, -541, 73, 447, -720, 868, -231, -107, +-507, -1112, -1490, -2257, -2557, -3100, -2837, -2112, -2660, -3167, -4307, -4777, -4786, -4768, -4215, -4300, +-2669, -1355, -1244, -537, -797, -997, -648, -78, 1199, 1244, 2188, 1559, 1193, 994, 447, 1430, +1244, 2585, 1996, 2769, 3106, 1768, 2587, 1567, 1198, 558, 917, 1884, 1317, 1899, 795, 992, +438, 289, -22, -971, -1219, -2450, -2058, -3177, -2471, -1910, -2262, -1669, -2781, -1278, -1562, -1399, +-1574, -2362, -1668, -2881, -1210, -1209, -398, -17, 427, 2487, 1164, 2169, 1780, 1687, 2013, 498, +1603, 396, 1169, 674, 240, 898, -299, 908, 99, 728, 682, 389, 1157, 267, 1191, -46, +-243, -692, -299, 855, 874, 886, -59, 312, -856, -812, -690, -802, 47, -1007, 35, 68, +803, 1316, 25, 1196, -201, 168, -97, -254, 313, -91, 454, -165, 1407, 1550, 1505, 1598, +1698, 2117, 1297, 1155, 430, 990, 2320, 1361, 786, 1230, 2039, 825, -321, -1098, -2378, -1099, +-912, -112, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, -2853, 7218, 6060, -23515, 9734, 3943, -855, 18024, -21563, -14712, 17097, 19800, +-18450, -15326, -16995, -4331, 25096, 5137, 12907, -5097, -14324, -8198, 11456, 27779, 490, -12844, -12333, -1430, +10870, 9378, 623, -7844, -8648, -11427, 2439, 14376, -4414, -3803, -22799, -667, 13910, -8912, 23957, -2111, +-2793, -3962, -14119, 19349, 8600, 15116, 917, -20685, 2683, 4312, 11257, 10784, -20477, -12896, -12453, 4558, +16885, -6725, -5022, -25935, -3842, 14848, 1437, 19667, -12434, -7223, 10192, 1479, 29705, -2081, -5711, 2832, +-17167, 13864, 6040, 2652, 3361, -26606, -5347, -6133, 3240, 7708, -23196, -2041, -8176, 7090, 22327, -8024, +-2172, -12892, 3240, 24022, 10003, 16101, -9599, -12945, 6823, 595, 15229, -2053, -13293, -6123, -12566, 8876, +-564, -8446, -5342, -17661, 7172, 5696, 5134, 8814, -12602, 3074, 4738, 13032, 17832, -4287, 2648, -4501, +2246, 13429, -3117, 1983, -9954, -12392, 931, -5321, 4662, -5837, -14321, -4877, -7378, 9616, 6236, -1566, +3083, -6853, 8893, 10399, 6841, 10400, -6648, 1475, 1632, 3624, 14717, -6197, -5426, -13876, -10723, 6032, +-8094, -545, -11679, -14581, 3115, -2294, 10997, 2512, -8528, 3796, -579, 18242, 17194, 3169, 4788, -9804, +6571, 8963, 2878, 4164, -16354, -7795, -7636, -6410, 4636, -11865, -9989, -11091, -8242, 10680, 1770, 3385, +-2663, -4657, 15168, 9997, 16094, 7509, -4873, 4894, -1259, 10970, 6736, -6973, -4940, -17724, -4487, 1679, +-5529, -2120, -17787, -8305, 211, 1091, 12253, -3391, 52, 2225, 4400, 21429, 9800, 6735, -2095, -7336, +9953, 5233, 6042, -5733, -17223, -6116, -8699, 1276, -1494, -12628, -7739, -13042, 822, 9009, 3109, 5844, +-5418, 3919, 13700, 12296, 15693, -1298, -1379, 968, 1918, 11884, -1215, -4642, -11566, -15682, -1446, -3356, +-1067, -8035, -16192, -3394, -933, 8416, 7735, -1723, 4360, 2135, 12240, 16358, 6860, 5929, -5765, -786, +6378, 3353, 3554, -12800, -13302, -8929, -6411, 3221, -7215, -9134, -8256, -7932, 6866, 5440, 6123, 4313, +-2289, 10876, 11910, 15776, 12035, -3350, 1175, -1494, 5548, 6641, -6429, -6948, -16022, -10042, -2590, -5243, +-2728, -12831, -10747, -1724, 2735, 11287, 2785, 69, 4239, 6586, 17641, 12975, 6818, 2286, -4058, 3259, +3009, 2885, -2110, -12887, -10560, -10177, -2793, -641, -9964, -9838, -11688, -2907, 6591, 4451, 6295, 753, +2560, 11015, 10875, 16242, 8014, 879, 660, -724, 8273, -81, -6463, -10452, -15931, -5905, -6004, -5711, +-7102, -14219, -8107, -4972, 4295, 10229, 2075, 3101, 3536, 10851, 16531, 9872, 7880, -435, 173, 5733, +2138, 2701, -8267, -12964, -9664, -9472, -1957, -6367, -10409, -9594, -8974, 665, 3094, 3370, 3500, 107, +7790, 12479, 14555, 12332, 2566, 2634, 1093, 3059, 6177, -2300, -5056, -10972, -10997, -4138, -6727, -5827, +-10322, -11402, -4892, -1980, 4283, 3894, 1356, 3789, 5906, 12553, 14985, 10757, 7546, 2304, 3943, 6085, +1902, -1412, -7030, -7854, -7168, -8077, -5600, -7783, -10173, -9367, -6355, 206, 2333, 1766, 2124, 3469, +8882, 13173, 12887, 10059, 6644, 5214, 4249, 4826, 3152, -1850, -5761, -8553, -7725, -6406, -7092, -9010, +-11011, -9547, -4434, -360, 1573, 2214, 2542, 5151, 7927, 11724, 11940, 9823, 6560, 3978, 5068, 4015, +2105, -2310, -6644, -6802, -9021, -8197, -8101, -9713, -8154, -9252, -5398, -1424, 13, 2919, 1305, 4044, +8918, 10681, 12255, 8183, 6027, 5746, 4375, 4209, 28, -2734, -5155, -7991, -7763, -8887, -8445, -8600, +-9818, -7781, -5158, -1845, 211, 529, 2770, 4882, 8359, 10579, 9490, 9009, 6053, 4932, 4797, 3335, +1588, -2876, -5576, -6533, -7160, -6697, -8125, -9189, -7996, -7276, -4896, -1654, 420, 1718, 2156, 4216, +8698, 11073, 10735, 7786, 5121, 5049, 4637, 3797, 747, -2794, -4282, -6322, -6317, -6777, -7976, -7875, +-9319, -7020, -3328, -1170, 1180, 1058, 2245, 5296, 7905, 10283, 10234, 7782, 6232, 4948, 4306, 3438, +912, -2115, -5391, -6129, -6651, -6523, -6983, -8074, -7349, -6000, -3521, -1751, 258, 1515, 2838, 5310, +7961, 9940, 9203, 7535, 5718, 4969, 4043, 2591, -234, -3122, -4662, -5985, -6472, -7782, -7674, -7559, +-7499, -5849, -4312, -892, 1180, 1959, 3643, 5316, 8557, 9658, 8882, 7923, 5834, 5236, 3803, 1593, +-10, -3545, -4720, -5979, -7807, -7059, -8030, -7810, -6598, -5846, -2647, -1755, 302, 2684, 3677, 7236, +7728, 8990, 9359, 7146, 6575, 4368, 3411, 2114, -1004, -2669, -5441, -6498, -6840, -8641, -7657, -7563, +-6630, -4371, -4046, -997, 1214, 2752, 4821, 5989, 8801, 9441, 8902, 7795, 5440, 4744, 3060, 1273, +-509, -3363, -5098, -7264, -8314, -7965, -8069, -7152, -6981, -5678, -3266, -1166, 1402, 2668, 4359, 6681, +8481, 9697, 9162, 7361, 5720, 3928, 2638, 985, -879, -2813, -5856, -7497, -8224, -8436, -7748, -7740, +-6845, -5329, -3627, -488, 1268, 3101, 4737, 5754, 8580, 10212, 9548, 7236, 4820, 3943, 2487, 1244, +-733, -3857, -5475, -7695, -8464, -8110, -8646, -7376, -7117, -5369, -2576, -1277, 1579, 2442, 4329, 7161, +8354, 9831, 8316, 6971, 5483, 3856, 3449, 316, -1743, -3586, -5817, -6641, -8040, -7965, -8301, -7788, +-5897, -4810, -2534, -540, 1063, 3332, 5342, 7040, 8503, 8760, 8702, 7516, 5772, 4631, 2638, 1126, +-1527, -3774, -4896, -6652, -7514, -8241, -7720, -7008, -6355, -4681, -3151, -801, 1679, 3463, 5185, 6905, +8726, 9187, 8256, 7207, 5846, 4782, 3289, 1365, -864, -3438, -5066, -6886, -7806, -7419, -7470, -6838, +-5882, -4502, -2560, -850, 1636, 3394, 5027, 7325, 8544, 9066, 8243, 6847, 5553, 4477, 3287, 1063, +-1130, -3369, -5151, -6575, -7661, -7473, -7355, -6722, -5741, -4457, -2518, -829, 1618, 3394, 4991, 7230, +8489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, -802, -6428, -977, 12912, -21132, 6323, 4384, -12350, 10359, -18466, 19977, -5124, -3135, -3983, +-6696, 8617, -14366, -2759, 14586, -21538, 14787, -6574, 3574, -8031, 4505, -14374, 7171, 4145, -10341, -6797, +1520, 6948, -16354, 2894, -361, -4612, 9276, -8291, -3237, 5672, -21103, 17287, -13195, -632, -11228, 14376, +-2343, -747, -10134, -1659, 4482, -2072, -8944, -6615, 17674, -7255, -5948, 4699, -8902, -4635, -3705, -51, +-2804, -5829, 11442, -4986, 4410, -9233, -243, -6431, 54, -2935, -8175, 7006, -978, 2316, -14268, 5895, +2741, -14995, -1421, 8020, 1562, -4678, -419, 4765, -10680, 4912, -14123, -645, 3118, 792, 97, -4067, +11325, -13934, 4365, -3550, -3224, -6850, 1767, 14971, -18014, 3541, -4194, 5906, -10656, -5334, 1697, 318, +10434, -7097, -2223, 5494, -5578, 2065, -17384, 10714, -7999, 5308, -3280, 4059, -856, -12230, 14928, -12741, +2702, -6750, 11154, 1893, -7819, 2608, -5759, 2424, -3460, -9361, 6575, -2032, 14558, -20176, 15422, -5148, +-1838, -5383, -5324, 15331, -19592, 18344, -13284, 12604, -15233, 4305, -738, -9177, 4591, 646, 5445, 1301, +-4259, 4383, -9693, 11630, -24649, 5301, 4578, 3948, -4570, -6440, 20049, -15969, 6334, -13115, 9307, -8179, +7800, 884, -6488, 5189, -543, -11025, 6988, -12505, 5527, -8426, 20313, -11825, -2005, 6693, -3389, 3463, +-22131, 17150, -11964, 10772, -12471, 7024, -1, -5993, 1005, -6220, 1632, 3356, -7040, 8185, -6738, 9537, +-19278, 7202, -1925, -10042, 2620, -3196, 13685, -21057, 17579, -8828, 1519, -7336, -4642, 5204, -2705, -2435, +-4250, -262, 8782, -18320, 5766, -15517, 18441, -11582, -2351, 6615, -4821, 7045, -19621, 17981, -23702, 5713, +-924, -1264, 1107, -9793, 9483, -8877, 4977, -9299, -7729, 13871, -8698, 6502, -18071, 17424, -9129, -11409, +1923, -6171, 8126, -19444, 20752, -8619, 1694, -1253, -7172, 4959, -13925, 6468, -10262, 4800, 5471, -13861, +12710, -12049, 7142, -19649, 11877, 134, -9275, 6953, -6783, 18392, -22057, 2591, -3224, -3859, 4113, -13644, +13273, -12737, 18373, -10898, -6124, 9831, -11850, 4465, -7821, 12095, -16239, 5832, 8234, -12868, 2376, -10725, +13236, -6399, -1639, 3037, -3518, 16482, -20332, 8683, -9569, 5491, -791, -12529, 15144, -9315, 11676, -14962, +10236, 835, -13972, 12911, -6802, 9015, -12810, 11732, 917, 12178, -10118, -18278, 16635, 4012, 2870, -22716, +16057, 18712, -12068, -7853, -7477, 23753, -16716, -1629, 881, 8178, 5721, -11973, 12260, -9566, 3429, -5827, +5155, 8272, -15363, 11004, 2419, 11123, -22664, -4816, 20826, -4258, -5255, -14423, 30813, -170, -10309, -6798, +3726, 15016, -19357, 2450, 672, 13181, -2315, -10303, 13626, -10099, 3644, -9204, 14298, -2677, -10836, 17315, +1175, 2964, -25599, 14666, 8780, -8695, -7350, -880, 28331, -10251, -7458, -4843, 12247, 6584, -24264, 10185, +3340, 13525, -14715, 2584, 10248, -12798, 4229, -6290, 15086, -13871, 4578, 13809, -1610, -3254, -16157, 19715, +-1597, -8879, -7058, 8997, 24642, -21903, -1401, 52, 18908, -12919, -15413, 17289, 1739, 7060, -15592, 13156, +-931, -7572, 2673, -4620, 11238, -13560, 11904, 7409, -1338, -6023, -9953, 24838, -13998, -6163, -5280, 23200, +5683, -23910, 7879, 4888, 11683, -22716, 559, 14863, 1104, 2450, -12620, 16991, -6239, -4232, -1586, -131, +9066, -15985, 20273, -340, 129, -12422, 6634, 16063, -21732, -607, 3797, 22788, -11261, -13928, 13143, 3275, +3904, -25110, 12184, 11746, 514, -3845, -5578, 22115, -16671, 1067, -4543, 7758, -3573, -6404, 21373, -7134, +-588, -8156, 14369, 1663, -20481, 7791, 5999, 18552, -21040, -1642, 13765, 2469, -6778, -22378, 25683, 1389, +-1007, -8016, 10076, 11931, -18239, 5402, -4143, 6812, -7699, 2464, 15721, -11515, 3797, -7369, 17987, -11426, +-12512, 10793, 9371, 9638, -26735, 14896, 9542, -1458, -17674, -5166, 25619, -8848, -1305, -3915, 15359, 2070, +-15883, 8731, -6169, 10152, -13560, 11620, 6851, -9071, 1904, -2773, 16819, -23242, -379, 12153, 10234, -5426, +-16671, 24165, 710, -7572, -16227, 7371, 19270, -16360, 3332, -3001, 21308, -11877, -8582, 7104, -1877, 5098, +-13376, 20254, -3020, -5636, 1784, 3542, 5105, -24772, 11625, 9391, 4602, -10671, -4513, 26737, -11122, -6220, +-15979, 21486, 4000, -15693, 4324, 5688, 16210, -21852, 1683, 5301, -1477, -1178, -5794, 20636, -11070, 1180, +1854, 3904, -3718, -20468, 19841, 313, 4177, -16683, 12679, 18006, -16087, -8258, -4829, 24800, -11910, -10734, +9740, 8508, 5727, -23255, 11582, -734, -638, -4931, 622, 17785, -15420, 8959, -3077, 8470, -15452, -7648, +18927, -3350, -2524, -11705, 23448, 4286, -20004, -2308, 4006, 19022, -23154, 1848, 9974, 9346, -5121, -18620, +17632, -7185, 1262, -10372, 12502, 7302, -12576, 10147, -1217, 3937, -19027, 4710, 15086, -10734, -1586, -4442, +27061, -13387, -13249, 768, 10241, 7745, -25756, 13956, 8407, 8761, -17427, -4659, 15779, -11419, -1692, -6271, +16870, -2468, -7718, 13206, -5083, 2070, -19630, 16940, 2235, -8506, -1750, 5383, 21474, -24234, -4486, 3098, +13778, -9147, -17851, 22318, 5924, 850, -17897, 7745, 9753, -16252, 1326, -4848, 19314, -13159, 3156, 6958, +-2524, -3712, -13274, 21118, -7769, -5839, -93, 14698, 8050, -27172, 5771, 5707, 7384, -18951, -4271, 25512, +-3108, -918, -16543, 20122, -3675, -11471, -1198, 3403, 13860, -17071, 9981, 3473, -2727, -8887, -2957, 19010, +-16557, 565, 4533, 16521, -6441, -21351, 15320, 389, 2780, -24341, 13613, 16903, -5413, -7337, -5731, 21823, +-13865, -8632, 2285, 8717, 4793, -15827, 17766, -4112, -2931, -9890, 5644, 9880, -18830, 10045, 3854, 16826, +-19274, -6632, 14597, -747, -7725, -18118, 24795, 7860, -10880, -5153, 4775, 16889, -24068, 1555, 2838, 10902, +-4473, -6798, 18559, -10055, 167, -11661, 13250, -2980, -12614, 11511, 8197, 8787, -22728, 6260, 14223, -8785, +-11122, -7197, 30736, -9128, -6372, -2600, 13193, 3783, -23667, 8717, 2013, 11568, -12836, 4793, 13714, -9896, +-2347, -6418, 14655, -12538, -6556, 16521, 4952, 800, -20621, 21600, 1123, -9661, -11540, 7695, 23118, -16963, +-1363, 551, 17352, -10614, -17667, 13174, 4006, 4660, -13617, 15257, 7631, -13019, 971, -2608, 12274, -21402, +8775, 10762, 3613, -7667, -8887, 22527, -8296, -9147, -8428, 18883, 11974, -20729, 4660, 7161, 12247, -22818, +-6195, 16801, -1973, 902, -9642, 23670, -6360, -5388, -1146, 2799, 3091, -17370, 14641, 6667, 1524, -11293, +1568, 20159, -17846, -7832, -537, 24597, -4964, -16727, 15416, 6177, 3637, -27161, 9809, 7607, -1870, -4645, +-23, 20883, -10721, -2943, -346, 5752, -3743, -14308, 21378, 526, -1610, -11463, 14877, 7987, -24132, 472, +5466, 20325, -18881, -1058, 15067, 5949, -6974, -20335, 16293, 3505, -5617, -5909, 8121, 17822, -19052, 3759, +608, 6450, -13775, -1083, 21156, -7699, -1121, -5572, 19899, -9000, -17109, 4526, 9880, 9644, -20721, 8242, +16147, 616, -13852, -12334, 24940, -8639, -5509, -3299, 18514, 2151, -17197, 9822, -1826, 2266, -14608, 10914, +11397, -7604, 199, 376, 16527, -17192, -12175, 9696, 10006, -257, -21510, 23924, 8247, -5299, -18588, 6292, +17105, -16188, -1014, 2991, 17912, -8233, -8868, 8514, -3306, -670, -13280, 15784, 6032, -8563, 2419, 6139, +12800, -28653, 1765, 10273, 6799, -14588, -5547, 27118, -2499, -9706, -11928, 14286, 5891, -16843, 3167, 6318, +16406, -15490, -2631, 9677, -4524, -6105, -9960, 23677, -7515, -4143, 5072, 13244, -4024, -22779, 12813, 6837, +-2284, -13896, 6406, 22591, -10931, -8760, -7344, 20166, -5509, -16378, 8813, 11492, 8539, -21947, 11555, 4045, +-7229, -10099, 3663, 15320, -13503, 2818, 8552, 6686, -10149, -14506, 17695, -473, -3235, -13852, 18622, 14490, +-17870, -8100, 2991, 19130, -21947, -5197, 14279, 11353, -4906, -11724, 15740, -3147, -8874, -5083, 5861, 9936, +-14341, 9696, 4539, 6901, -18474, -3953, 18349, -5211, -8772, -4816, 29283, -2435, -18824, 205, 10768, 3352, +-23618, 5880, 14223, 4704, -6017, -6583, 18140, -9737, -5318, -7642, 14349, 217, -12169, 13060, 6667, -1718, +-20938, 11181, 11492, -14347, -6086, 9250, 22890, -14308, -10703, 7543, 7168, -3826, -23059, 15466, 9149, 3701, +-14448, 6488, 15130, -14468, -6671, 1840, 13993, -11052, -3597, 17873, -880, -8409, -11350, 16470, -1527, -14582, +2228, 11752, 16851, -21636, -582, 7783, 9556, -18081, -13293, 22184, 5702, -8010, -8823, 16673, 3948, -19198, +2387, 4094, 7480, -12359, 7689, 12495, -5869, -6283, -7383, 17638, -11528, -9363, 3148, 20641, 2673, -22487, +8761, 13283, -3953, -22150, 2577, 23962, -8290, -5255, -1184, 16952, -7947, -13274, 4006, 2907, 5771, -13115, +14482, 7708, -4937, -11452, 3626, 12692, -19744, -6709, 15016, 14768, -10779, -14608, 21937, 996, -10214, -16900, +14647, 12705, -10144, -2639, 2838, 16527, -15706, -9852, 4786, 7118, -4822, -8530, 20686, 2602, -11991, -2391, +9746, 1535, -24575, 9828, 11436, 6254, -16163, 357, 17517, -4874, -12340, -11109, 21257, 5003, -13401, -582, +13302, 8038, -23299, -1026, 10317, -2397, -7845, 1219, 21099, -11693, -2823, 889, 8819, -9598, -13357, 12374, +8508, 376, -16334, 8336, 15549, -12931, -16023, 1479, 24394, -9483, -12430, 12228, 11625, -4245, -21051, 11384, +134, -2894, -6823, 8539, 10947, -9712, -1198, 1942, 6292, -13090, -9433, 18571, 5473, -7832, -12042, 21219, +4267, -23167, -6163, 10850, 14165, -19967, 3225, 11848, 8121, -11089, -11687, 9784, -442, -5445, -5972, 12007, +8984, -15001, 3275, 5061, 1656, -21026, 5029, 19347, -6562, -8290, 1663, 21956, -13203, -15712, 313, 12209, +2305, -16576, 6933, 14133, 3689, -15020, -6823, 17302, -8340, -7274, -899, 18838, -5445, -11268, 11511, 856, +-7567, -14239, 16375, 6260, -8525, -2454, 8564, 13739, -16658, -11852, 6202, 12025, -5457, -18690, 20248, 10248, +-5185, -18170, 10477, 9523, -15198, -1058, 6845, 11752, -11052, -105, 8044, -4670, -7471, -7356, 15309, 1892, +-8925, 1326, 12654, 10026, -26938, -170, 11892, 7104, -19662, -1586, 24515, -1540, -10468, -7661, 13028, -937, +-11699, 3872, 6266, 9968, -10677, 2780, 7010, -6017, -9458, -4480, 21048, -10740, -5704, 7835, 18357, -9191, +-21191, 12934, 8558, -6011, -14138, 10191, 18057, -8449, -6848, -5216, 14693, -6785, -11966, 6145, 10380, 5612, +-15718, 14635, 2019, -9858, -9984, 9663, 9187, -16982, 3981, 14020, 6342, -14220, -9782, 16826, -1070, -5662, +-12233, 18077, 12762, -12994, -7845, 3390, 15531, -21172, -4048, 11504, 8552, -6811, -3667, 16628, -7686, -8981, +-245, 7175, 902, -13959, 12609, 6158, 4342, -18411, -766, 16521, -5313, -11254, -4689, 28775, -2429, -16188, +697, 11631, -264, -21243, 7434, 9207, 565, -3115, 103, 12851, -12487, -886, -4182, 10755, -4982, -9401, +14946, 6977, -4043, -21014, 14223, 10139, -16373, -8480, 11466, 21537, -15344, -6588, 7714, 5124, -5242, -17922, +12920, 2464, 4812, -9921, 7066, 9493, -13617, -2886, 1904, 10064, -15096, 408, 20400, -2259, -11528, -8144, +19606, -6715, -16366, 2513, 11771, 13593, -19421, 3467, 4825, 8838, -15547, -11749, 16947, 2038, -4087, -7166, +16496, -753, -16620, 6348, 2356, 724, -14143, 14882, 10869, -9668, -4613, -2182, 16482, -16576, -7604, 971, +18559, 1694, -20214, 9677, 10718, -1273, -21686, 3174, 18413, -10322, -1521, 205, 14133, -12449, -5858, 6450, +-4043, 1130, -9591, 18115, 743, -4499, -7814, 6158, 11334, -22601, -5027, 11625, 15314, -13992, -12791, 22439, +-1229, -8226, -16341, 15073, 5308, -8607, 2673, 167, 12387, -15319, -835, -372, 1460, -5166, -5585, 20699, +-3901, -8963, -1534, 13720, -2385, -27401, 12293, 9759, 4913, -19357, 5421, 15372, -7877, -8131, -12175, 18236, +-970, -6163, -905, 9162, 7879, -20240, 4102, 2489, -4187, -8639, 4831, 18902, -17788, 1568, 3707, 10889, +-17205, -11419, 15493, 3352, 540, -16930, 13258, 10342, -9750, -14049, -2589, 22192, -12633, -6360, 7580, 11511, +-3807, -16353, 15117, -8651, -2366, -6163, 12698, 2755, -12430, 7618, 1656, 5714, -18728, -2626, 15524, 2387, +-6583, -13280, 25307, 628, -17560, -8530, 10152, 12458, -22741, 8407, 5796, 8806, -10633, -3769, 8107, -9014, +1460, -5680, 12623, -1108, -9172, 7745, 2673, 1848, -24748, 11804, 14451, -6283, -10303, 3054, 26686, -18569, +-9528, -2473, 13473, -2487, -14354, 10469, 4933, 8152, -13503, -778, 8585, -8785, -734, -3738, 18522, -12487, +-2322, 11860, 52, -9965, -16525, 24160, -2245, -7807, -4467, 14470, 12679, -19973, -3521, 134, 13544, -9821, +-13153, 15917, 5232, 2818, -19497, 13962, 483, -11114, 686, 4229, 10210, -17128, 12813, 4597, -5331, -11490, +-2988, 17892, -10291, -4074, -1445, 18044, 5155, -23731, 3256, 5378, 11942, -25204, 2450, 17708, -505, -6271, +-9102, 16755, -11852, -3210, 1961, 3866, 3899, -9312, 14336, -3216, -3108, -11147, 2222, 15752, -17293, -816, +2678, 24732, -15908, -16157, 12374, 6705, -2988, -21510, 17684, 8190, -3675, -5927, -3762, 12343, -13604, 768, +-2797, 8476, 996, -8499, 17289, -7229, -3077, -13973, 17219, 768, -19204, 6457, 11931, 11441, -24640, 299, +12577, -886, -7496, -13604, 22229, 1708, -2004, -10156, 4292, 11023, -19718, 3237, -1591, 12318, -11845, 5270, +13918, -12531, -3718, -2721, 15828, -14284, -9021, 13904, 6908, 3505, -23363, 11104, 6329, -1033, -14797, -4250, +27664, -7458, -4106, -7686, 17657, -5313, -16303, 8121, -543, 4883, -9307, 13283, 2450, -12010, 3891, -2468, +11409, -18963, 3225, 9943, 8355, -5990, -20094, 21511, 408, -7591, -18151, 15886, 18096, -16474, 173, 1345, +13809, -13838, -6499, 7568, -3775, 8107, -10563, 15847, -6150, -3203, -703, 2170, 7150, -21490, 12997, 10477, +5270, -18113, -2240, 23677, -12752, -10519, -6702, 22305, 2907, -14195, 6780, 540, 14031, -20456, 1416, 2933, +4171, -194, -7097, 18787, -11521, -1127, -238, 7181, -6525, -14620, 23918, 2888, -2721, -13515, 12280, 12566, +-20100, -2975, -3743, 25454, -10303, -7147, 4838, 10166, 4660, -24283, 10793, 3459, 1713, -5604, 4514, 13283, +-17293, 7879, -951, 2222, -12131, -321, 21607, -8037, 1485, -11147, 21492, -1300, -16232, -4397, 7791, 20611, +-22386, 78, 11631, 8997, -9623, -16106, 19671, -6163, 3118, -4702, 9358, 3689, -11344, 11593, -9191, 5245, +-14608, 10152, 11574, -6632, -2537, -3159, 24958, -14728, -15071, 4952, 14800, 5232, -25707, 16775, 6425, 3618, +-15559, -3724, 15301, -8428, 6895, -9052, 16343, -3172, -4620, 5155, -5140, 1980, -14830, 18470, 4069, -10926, +262, 7472, 17543, -29223, 894, 7892, 12521, -8747, -13820, 21576, -54, 2591, -21287, 7168, 10152, -7782, +376, -2867, 19918, -11749, 313, 5969, -6995, -1775, -8302, 23811, -13738, -2372, 4102, 12057, 781, -25229, +11480, 4476, 10634, -17750, -1496, 22305, -1973, -6176, -18646, 19829, 52, -11553, 2895, 3137, 14559, -17565, +13390, -4950, -3489, -2854, 908, 13728, -16886, 7066, 1975, 12134, -10036, -18328, 16628, 4012, 2863, -22716, +16045, 18724, -12609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 31487, 31334, 30908, 30200, 29232, 27980, 26478, 24743, 22791, 20619, 18257, 15754, +13088, 10298, 7418, 4497, 1509, -1493, -4480, -7402, -10281, -13072, -15717, -18244, -20604, -22780, -24729, -26471, +-27973, -29221, -30199, -30906, -31338, -31483, -31336, -30912, -30202, -29234, -27983, -26479, -24745, -22794, -20621, -18260, +-15756, -13092, -10300, -7420, -4501, -1513, 1490, 4478, 7400, 10279, 13068, 15715, 18242, 20602, 22775, 24727, +26469, 27971, 29219, 30197, 30904, 31336, 31487, 31334, 30908, 30200, 29232, 27980, 26478, 24743, 22791, 20619, +18257, 15754, 13088, 10298, 7418, 4497, 1509, -1493, -4480, -7402, -10281, -13072, -15717, -18244, -20604, -22780, +-24729, -26471, -27973, -29221, -30199, -30906, -31338, -31483, -31336, -30912, -30202, -29234, -27983, -26479, -24745, -22794, +-20621, -18260, -15756, -13092, -10300, -7420, -4501, -1513, 1490, 4478, 7400, 10279, 13068, 15715, 18242, 20602, +22775, 24727, 26469, 27971, 29219, 30197, 30904, 31336, 31487, 31334, 30908, 30200, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, -6338, -4247, +498, 2065, 1627, -317, -369, 560, 393, 810, 451, -733, -2696, -5309, -5464, -4763, -539, -5218, +-12928, -2044, -4106, -3943, -3438, -1311, 524, 168, -944, -525, 2983, 7796, 12665, 15314, 16940, 11917, +-6193, -8011, -6236, -1537, 1369, 2039, 655, -628, 461, 1014, 1024, 1115, -132, -1761, -4210, -5737, +-4670, -3236, 78, -12841, -8509, -1590, -4644, -3215, -2440, -81, 725, -68, -616, 1204, 5338, 10328, +14472, 15643, 16191, -497, -8282, -6785, -3923, 695, 2049, 1562, -245, 79, 1441, 1606, 1658, 621, +-1081, -2921, -5072, -5100, -4320, -383, -5434, -16430, -2977, -3350, -3443, -2848, -1020, 829, 674, -183, +176, 3196, 7791, 13138, 14630, 17167, 7179, -7556, -6525, -5717, -860, 1698, 2343, 730, -125, 1287, +2197, 2129, 1423, -380, -2121, -3889, -5367, -4616, -3220, 65, -15151, -11990, -1275, -4165, -2692, -2025, +283, 907, 467, 240, 1622, 5237, 10637, 14073, 15924, 13769, -4011, -6692, -5985, -2960, 977, 2634, +1891, 81, 847, 2398, 2943, 2361, 613, -1288, -2681, -4560, -4718, -4061, -471, -6274, -19427, -5102, +-2633, -3210, -2323, -936, 929, 815, 544, 1038, 3452, 7637, 12987, 14151, 16748, 2455, -7294, -5343, +-4675, -277, 2174, 2576, 769, 474, 2088, 3455, 3517, 1791, -613, -2228, -3434, -4815, -4092, -2858, +-713, -16077, -15193, -1881, -3338, -2208, -1629, 338, 997, 728, 992, 2479, 5435, 10774, 13352, 16105, +9847, -6111, -5064, -5107, -1825, 1329, 2828, 1847, 434, 1324, 3062, 4118, 3147, 711, -1790, -2823, +-4102, -4349, -3847, -975, -7606, -20768, -8557, -2158, -2909, -1786, -869, 789, 657, 844, 1979, 4109, +7630, 12187, 13912, 14327, -1954, -5888, -4523, -3347, 182, 2524, 2790, 1031, 836, 2356, 4287, 4690, +2206, -776, -2536, -3326, -4336, -3904, -2356, -2097, -16480, -17584, -4118, -2373, -1964, -1184, 88, 878, +768, 1597, 3774, 5864, 10210, 12492, 15536, 4347, -6668, -3774, -3956, -885, 1718, 3207, 2059, 767, +1651, 3699, 5268, 4054, 551, -2051, -3041, -3987, -3820, -3560, -738, -9308, -20234, -12591, -2030, -1933, +-997, -536, 713, 733, 1006, 3227, 5402, 8154, 11350, 14305, 10883, -4763, -4224, -3578, -1693, 874, +3139, 3161, 1603, 1447, 2950, 5180, 5912, 3133, -583, -2429, -3598, -3534, -3764, -1141, -3957, -16900, +-19148, -9009, -1067, -1630, -273, 128, 802, 565, 1913, 4931, 6973, 10143, 12293, 14462, 225, -5862, +-3135, -2668, 212, 2351, 3536, 2290, 1243, 1976, 4011, 6106, 5320, 1223, -1678, -3042, -3861, -3012, +-2871, -298, -12555, -18858, -17514, -4962, -713, -545, 246, 690, 594, 763, 3764, 6598, 9388, 11004, +14525, 6930, -6285, -3280, -2911, -364, 1743, 3667, 3303, 1747, 1816, 3251, 5377, 6469, 3891, -369, +-2148, -3697, -3090, -3241, -260, -6328, -17900, -18679, -15090, -1382, -585, 565, 404, 677, 173, 1780, +5323, 8261, 10681, 12747, 12361, -3714, -5287, -2883, -1482, 1210, 2999, 4092, 2815, 1884, 2679, 4538, +6361, 5897, 2124, -1233, -2802, -3489, -2732, -2002, -1036, -15228, -17565, -19868, -10336, 555, 323, 1178, +570, 510, 509, 3772, 6943, 10478, 11818, 14656, 2594, -7268, -3243, -2574, 680, 2700, 4141, 3918, +2482, 2493, 3757, 5994, 6804, 4555, 491, -1768, -3394, -2899, -2925, 36, -9645, -18675, -17376, -20168, +-5789, 1524, 1102, 1103, 435, 73, 1776, 5363, 9046, 11751, 14342, 9848, -6245, -4948, -2814, -463, +2377, 4056, 4592, 3425, 2645, 3358, 5222, 7151, 6365, 2994, -235, -2401, -3040, -2865, -783, -4346, +-17497, -17079, -19271, -17793, -1790, 2310, 1641, 1181, 376, 636, 3700, 7040, 11097, 13410, 14683, -613, +-7138, -3319, -1544, 1584, 3875, 5059, 4496, 3273, 3469, 4559, 6770, 7558, 5095, 1578, -1151, -2915, +-2652, -1884, -953, -13657, -18011, -17337, -20437, -14200, 1722, 2437, 2067, 1036, 393, 2077, 5292, 9173, +12271, 16019, 7239, -7071, -4797, -2730, 424, 3149, 5037, 5139, 4182, 3734, 4443, 6111, 8168, 7061, +3385, 425, -1991, -2645, -2681, -69, -8976, -17971, -17384, -18479, -20483, -9484, 3952, 2236, 2253, 773, +1135, 3609, 7063, 10803, 14554, 13890, -2945, -6230, -3885, -982, 2105, 4563, 5596, 4976, 4301, 4681, +5713, 7753, 8451, 5738, 1945, -579, -2145, -2827, -572, -4271, -16857, -16818, -18598, -18775, -19756, -4240, +4662, 2705, 2151, 724, 2552, 5251, 9042, 12284, 16923, 5344, -6406, -4542, -2839, 1190, 3584, 5597, +5649, 5144, 4940, 5493, 7029, 8820, 7559, 3924, 805, -1392, -2437, -1573, -1501, -14359, -17070, -17483, +-18926, -19354, -16769, 481, 4602, 2978, 1603, 1537, 4027, 7136, 10657, 15343, 13705, -2969, -4891, -3797, +-509, 2828, 5271, 6236, 5755, 5571, 5777, 6716, 8532, 9017, 6116, 2422, -394, -1738, -2217, -11, +-10607, -17283, -16434, -18687, -18630, -19169, -12411, 3826, 4511, 2933, 1457, 3046, 5546, 9370, 12662, 17103, +4678, -5393, -3634, -2526, 1642, 4101, 6211, 6080, 5871, 6148, 6348, 8005, 9422, 8050, 4573, 1016, +-999, -2315, 25, -6717, -16833, -16043, -17899, -19038, -18277, -18050, -7757, 5931, 4150, 2658, 2323, 4651, +7589, 11075, 15689, 12991, -3091, -3551, -2960, -55, 3101, 5484, 6630, 6109, 6469, 6624, 7452, 9367, +9483, 6704, 2827, 10, -2158, -622, -3205, -15577, -15675, -17170, -18475, -19546, -17296, -16784, -3122, 6540, +3395, 2674, 3718, 6142, 9469, 12920, 17066, 3583, -4753, -2243, -1651, 2106, 4456, 6429, 6600, 6441, +7019, 7139, 9003, 10183, 8500, 5049, 1606, -1142, -1844, -525, -13040, -15939, -15784, -17878, -18883, -18442, +-16169, -14533, 1322, 6285, 3094, 3678, 5316, 7943, 10931, 15982, 11907, -3627, -2587, -1891, 597, 3478, +5519, 6782, 6696, 7330, 7354, 8146, 10279, 9760, 7191, 3443, 614, -2193, 199, -9102, -16357, -14395, +-17002, -18451, -19315, -17016, -15891, -11217, 4902, 5289, 3735, 5160, 6809, 9906, 13258, 16802, 2475, -4457, +-1421, -789, 2629, 4660, 6313, 6944, 7345, 7827, 7729, 9676, 10665, 8895, 5357, 2170, -1440, -147, +-5771, -16328, -14043, -15602, -17433, -19017, -18152, -15379, -15568, -5910, 6864, 4229, 5232, 6493, 8871, 11704, +16643, 11635, -3845, -2033, -928, 1545, 4152, 5614, 6788, 7337, 8003, 7999, 8826, 10874, 10201, 7129, +4049, 267, -593, -3045, -15708, -14240, -14492, -16081, -18583, -18500, -17070, -14705, -14455, -579, 6831, 4733, +6783, 7734, 10919, 14118, 17047, 2516, -4098, -669, 501, 3672, 5274, 6342, 7292, 8135, 8353, 8496, +10195, 11010, 8795, 5673, 2280, -793, -1179, -14226, -15442, -13663, -15185, -17318, -18858, -17496, -15703, -14661, +-11828, 3711, 6223, 6503, 7942, 9697, 12537, 16821, 11518, -3632, -1844, -335, 2679, 4936, 6144, 6743, +7786, 8374, 8596, 9632, 11208, 10473, 7257, 4473, 141, 68, -11463, -16812, -12967, -14370, -15672, -18436, +-17874, -16778, -14741, -14962, -7423, 6404, 6339, 8139, 8898, 11991, 14736, 17068, 2732, -3697, -689, 1384, +4647, 6178, 6725, 7218, 8432, 8659, 9270, 10827, 11596, 8936, 6181, 1898, 808, -7979, -17834, -13384, +-13687, -14421, -17042, -18174, -16997, -16231, -14376, -14472, -1484, 7574, 7413, 9162, 10890, 13728, 17294, 11938, +-2997, -1432, 149, 3918, 5955, 6865, 6696, 7814, 8726, 9104, 10474, 11933, 10597, 7768, 4073, 1956, +-4921, -17703, -14579, -13214, -13637, -15774, -17535, -17380, -16489, -15391, -14667, -11374, 4283, 7933, 8866, 10089, +13066, 15311, 17659, 4045, -2988, -245, 1931, 5633, 6925, 6979, 7063, 8420, 8871, 9935, 11592, 11529, +9172, 5614, 3002, -1910, -16528, -16057, -13532, -12955, -14530, -16705, -17437, -16630, -16332, -14710, -15111, -5772, +7936, 8272, 9976, 12092, 14742, 17525, 13580, -1692, -879, 432, 4443, 6733, 7616, 7047, 7801, 8687, +9393, 11253, 12178, 10573, 7500, 4237, 1125, -14293, -17021, -13891, -12847, -13280, -15561, -16836, -16872, -16275, +-15998, -14465, -13913, 1145, 9207, 9293, 11494, 14337, 15984, 18493, 5777, -2420, 168, 2193, 6254, 7582, +7582, 7168, 8168, 8685, 10401, 12417, 11485, 9182, 5156, 3535, -11191, -18010, -14399, -13347, -12395, -14361, +-16187, -16693, -16307, -16244, -15093, -14941, -9421, 7055, 9497, 11062, 13549, 15839, 17984, 15174, -424, -510, +1122, 5049, 7488, 8194, 7303, 7516, 8166, 9356, 12111, 12304, 10706, 6637, 5132, -7694, -18160, -14786, +-13956, -12406, -13241, -15531, -16496, -16290, -15931, -16225, -14607, -14738, -1320, 9997, 10228, 12799, 15529, 16549, +19060, 8325, -1784, 1020, 3217, 7243, 8238, 8102, 7165, 7654, 8474, 10885, 12705, 11773, 8069, 6280, +-4451, -17439, -15263, -14089, -12676, -12473, -14162, -15905, -15784, -15726, -16143, -15454, -14893, -10811, 6475, 10532, +12403, 15066, 17000, 17953, 17255, 1917, -265, 2434, 5733, 8217, 8464, 7543, 7173, 7740, 9608, 12290, +12500, 9329, 7395, -1554, -16128, -15602, -14424, -12900, -12450, -13253, -15372, -15640, -15640, -15746, -16294, -14713, +-15018, -3173, 10253, 11360, 14437, 16818, 17461, 19472, 11617, -1030, 2105, 4225, 7720, 8672, 8401, 7366, +7192, 8677, 11406, 13154, 10656, 8581, 1539, -14433, -15345, -14655, -12991, -12408, -12377, -14336, -15394, -15147, +-15349, -15780, -15669, -14670, -12066, 5183, 11535, 13586, 16181, 18252, 18094, 18949, 4368, -249, 3541, 6218, +8438, 8136, 7551, 6628, 7485, 9964, 12528, 11704, 9194, 4364, -12648, -15294, -14592, -13235, -12552, -12369, +-13627, -15266, -15282, -15113, -15308, -16070, -14601, -14964, -4932, 10579, 12872, 15989, 18092, 18351, 19715, 14833, +68, 2987, 5149, 8228, 8490, 7996, 7118, 6832, 8954, 11569, 12589, 9920, 7381, -9021, -15456, -14007, +-13304, -12322, -12217, -12751, -14528, -15108, -14894, -14996, -15464, -15510, -14305, -12973, 3840, 12629, 14841, 17414, +19096, 18060, 20429, 7777, 161, 4791, 6293, 8218, 7554, 7273, 6501, 7737, 10107, 12096, 10133, 8766, +-5217, -15447, -13850, -13741, -12275, -12282, -12109, -13316, -14274, -14266, -14090, -14646, -15243, -13850, -14292, -5779, +11059, 14109, 17090, 18650, 18966, 19377, 18168, 2547, 3125, 5801, 7446, 7480, 7152, 6886, 7250, 8988, +11088, 10241, 9509, -1276, -14994, -13947, -14016, -12465, -12456, -12150, -12747, -13692, -14129, -13949, -14219, -14826, +-14633, -13545, -12267, 4622, 13716, 15727, 18151, 19357, 18630, 20983, 12382, 1349, 5261, 6134, 7420, 6725, +6823, 6923, 7971, 10010, 9868, 9650, 2582, -13428, -13963, -13953, -12536, -12253, -12267, -12201, -12891, -13435, +-13487, -13712, -14247, -14625, -13408, -13843, -4475, 11983, 14594, 17650, 18706, 19566, 19249, 20385, 6564, 2900, +5998, 6682, 6927, 6532, 6919, 7179, 8629, 9309, 9049, 5761, -11116, -14414, -13912, -12994, -12005, -12192, +-12022, -12304, -12775, -13080, -13259, -13923, -14099, -13890, -12970, -11281, 5882, 14410, 16260, 18655, 19456, 19150, +20522, 16892, 2926, 4796, 6119, 6914, 6342, 6898, 7175, 7637, 8924, 8333, 8054, -7816, -14659, -13554, +-13497, -11940, -12048, -11989, -11857, -12024, -12451, -12634, -13289, -13474, -13831, -12775, -13145, -3274, 12962, 14967, +18270, 18876, 19973, 19055, 21542, 11075, 2288, 6103, 6363, 6624, 6452, 7231, 6976, 8270, 7604, 9038, +-3481, -14560, -13212, -13852, -12075, -11868, -11951, -11845, -11641, -12025, -12386, -13025, -13419, -13450, -13274, -12435, +-9640, 8053, 14657, 16908, 18949, 19361, 19632, 19921, 20020, 5061, 4148, 6386, 6305, 6172, 6664, 6642, +7263, 6977, 8471, 1038, -13694, -13302, -13794, -12353, -11656, -11786, -11903, -11552, -11598, -12143, -12741, -13375, +-13158, -13689, -12228, -12388, 772, 14007, 15544, 18682, 18811, 20073, 18805, 21909, 14565, 2701, 6174, 5834, +6241, 6114, 6591, 6414, 6518, 7279, 4501, -11559, -13736, -13438, -12725, -11524, -11574, -11617, -11372, -10949, +-11528, -12405, -13067, -13089, -13523, -12718, -12340, -6274, 11029, 14884, 17446, 18684, 19523, 19521, 19482, 21874, +8107, 3914, 6323, 5779, 6022, 6314, 6080, 6290, 6168, 6564, -7903, -14196, -12925, -12999, -11508, -11547, +-11583, -11394, -10825, -11200, -12007, -12886, -13201, -13185, -13426, -11731, -10876, 4957, 14642, 16091, 18462, 19256, +19538, 18758, 21776, 18425, 4031, 5542, 5654, 5669, 6047, 5843, 5922, 5342, 6967, -3856, -14145, -12687, +-13251, -11743, -11661, -11463, -11324, -10692, -11001, -11801, -12596, -13289, -13071, -13733, -11860, -12066, -2135, 13319, +15202, 17948, 19293, 19341, 19082, 19523, 23452, 11433, 3164, 5917, 5064, 5919, 5442, 5561, 4811, 6150, +403, -13222, -12678, -13036, -11891, -11690, -11550, -11254, -10621, -10684, -11484, -12377, -13183, -13269, -13666, -12678, +-12001, -7836, 9879, 14793, 16927, 18882, 19177, 18582, 19286, 22296, 20597, 4979, 4791, 5144, 5437, 5418, +5140, 4776, 4976, 3639, -10692, -13128, -12432, -12146, -11884, -11839, -11125, -10584, -10531, -11199, -12104, -12991, +-13488, -13672, -13340, -11738, -11121, 4383, 14494, 16056, 18499, 18985, 18282, 19557, 20825, 24163, 12987, 2712, +5345, 4690, 5426, 4783, 4623, 3695, 4991, -6667, -13600, -11921, -12435, -11816, -12189, -11307, -10784, -10813, +-11269, -12182, -12989, -13734, -13927, -13813, -12185, -12212, -2000, 13114, 15333, 18025, 18522, 18533, 19184, 20900, +22605, 21568, 5379, 4194, 4974, 5093, 4825, 4370, 3380, 4833, -2105, -13348, -11534, -12178, -11632, -12224, +-11181, -10566, -10716, -11001, -12034, -12936, -13823, -14244, -13934, -12725, -11741, -7533, 9682, 14993, 17092, 18207, +18632, 18983, 21044, 21382, 23974, 13720, 2363, 5040, 4450, 4991, 3995, 3235, 3613, 1685, -11475, -12010, +-12048, -11872, -12313, -11557, -10636, -10985, -11419, -12352, -13133, -13910, -14579, -14264, -13494, -11446, -10409, 5402, +14518, 15847, 17679, 18253, 19610, 20676, 21886, 22156, 21327, 5566, 3457, 4851, 4694, 3951, 3191, 2406, +3935, -7433, -12842, -11462, -11920, -11855, -11697, -10744, -11099, -11766, -12749, -13379, -14032, -14786, -14757, -14211, +-11487, -11896, 690, 13686, 14524, 17041, 17899, 19952, 20439, 21996, 20786, 22833, 13806, 1990, 4903, 4175, +3893, 2784, 1773, 3748, -2473, -13022, -11452, -12066, -11678, -12010, -11246, -11233, -12129, -13019, -13668, -14195, +-14764, -15204, -14667, -12003, -12306, -3880, 12130, 13773, 16354, 17991, 20161, 20929, 21474, 21123, 20713, 21072, +5766, 3516, 4710, 3744, 2550, 1668, 2495, 1936, -10784, -11967, -11577, -11610, -11973, -11812, -11436, -12479, +-13550, -14041, -14533, -14874, -15835, -15241, -12928, -12267, -7718, 9518, 13360, 15149, 17876, 20059, 21287, 21169, +21048, 19587, 22453, 14476, 2595, 4661, 3390, 2262, 1630, 1421, 4170, -6410, -12819, -11060, -11833, -11778, +-12575, -11744, -12647, -14021, -14455, -15024, -15001, -16057, -15515, -13685, -11926, -10221, 5895, 13214, 13952, 17738, +19976, 21306, 21203, 20419, 19913, 20288, 21615, 6682, 3064, 3973, 1713, 1627, 1101, 4221, -1048, -12440, +-10831, -11622, -11826, -13152, -12435, -12896, -14601, -15300, -15707, -15532, -16493, -16173, -14739, -12227, -11815, 1296, +12644, 12916, 17220, 19703, 21135, 21084, 19996, 19744, 19102, 22713, 15568, 2445, 4016, 1653, 1548, 1568, +3303, 3309, -9780, -11523, -10997, -12057, -13225, -13033, -13071, -14785, -15872, -16081, -15914, -16578, -16338, -15431, +-12742, -12306, -3113, 11455, 12393, 16583, 19490, 21050, 20679, 19784, 18944, 19361, 20655, 22361, 7113, 2204, +2184, 752, 1897, 2257, 5195, -4679, -12534, -10574, -12624, -13545, -14026, -13734, -14894, -16372, -16633, -16392, +-16765, -16561, -16173, -13595, -12451, -6193, 9831, 12337, 15989, 18970, 20527, 20211, 19495, 18771, 19577, 19925, +23219, 15234, 1380, 2347, 812, 1986, 2514, 4791, 1547, -11465, -10975, -12682, -13774, -14306, -14263, -14960, +-16756, -17301, -17030, -16921, -16632, -16576, -14448, -12536, -8913, 7597, 12319, 15266, 18517, 19873, 19739, 18787, +18606, 19052, 20182, 21249, 21692, 5079, 864, 1553, 1471, 3138, 3512, 5131, -7447, -12243, -12609, -14577, +-14766, -15066, -15208, -17143, -17991, -17729, -17192, -16804, -16775, -15142, -12624, -11010, 4867, 12509, 14613, 18081, +19209, 19338, 18406, 18437, 18874, 20270, 19989, 23143, 12674, -123, 2095, 1503, 3472, 3304, 5702, -1353, +-12863, -13056, -15059, -15257, -15824, -15835, -17546, -18703, -18702, -17657, -17032, -16804, -15726, -12999, -12610, 1484, +12364, 14050, 17543, 18525, 18823, 17941, 18029, 18981, 19804, 20078, 21343, 19821, 3149, 1104, 2322, 2992, +3896, 4366, 3603, -10578, -14235, -14883, -15706, -16134, -16530, -17856, -19276, -19623, -18127, -17215, -16731, -15927, +-13443, -13406, -1077, 12169, 13774, 16908, 17826, 18131, 17473, 17451, 18692, 19228, 20096, 19799, 22046, 10762, +26, 2923, 2451, 4414, 3185, 5426, -4667, -15959, -15047, -16591, -16629, -17505, -18518, -19882, -20568, -18767, +-17602, -16775, -15963, -13925, -14164, -3317, 11694, 13563, 16297, 17176, 17499, 17002, 17100, 18275, 19044, 19627, +19610, 20736, 18580, 2461, 2343, 3190, 4097, 3627, 4249, 1475, -14250, -16124, -16599, -17090, -18087, -19193, +-20386, -21286, -19382, -18162, -16819, -16008, -14423, -14787, -5441, 11001, 13135, 15444, 16320, 16824, 16559, 16758, +17693, 18828, 19039, 19460, 19055, 22253, 9383, 1011, 4064, 3423, 3976, 2694, 3561, -8689, -17798, -16720, +-18043, -18600, -19988, -21012, -21773, -20124, -18748, -16943, -15929, -14764, -15182, -7438, 10176, 12754, 14599, 15546, +16304, 16281, 16518, 17482, 18322, 18835, 18965, 18697, 21930, 17849, 2264, 3748, 3559, 3510, 2595, 2130, +-2291, -16726, -17759, -18351, -19339, -20589, -21860, -22252, -20958, -19488, -17005, -15849, -15091, -15587, -9448, 9044, +12199, 13628, 14757, 15561, 15795, 16019, 16937, 17554, 18660, 18231, 19107, 20542, 23080, 8145, 2202, 4229, +2756, 2877, 156, 797, -11046, -19613, -18452, -20129, -20949, -22750, -22536, -21462, -20054, -17134, -15862, -15173, +-15828, -10200, 8401, 11692, 12872, 13968, 14770, 15323, 15678, 16487, 16882, 18125, 17829, 19146, 20248, 23876, +15824, 2178, 4058, 2599, 2245, -446, -287, -3710, -18724, -19817, -20496, -21746, -23482, -23026, -22136, -20556, +-17616, -16226, -15522, -16177, -10768, 7616, 11036, 12054, 13123, 13961, 14746, 15316, 15839, 16275, 17273, 17531, +18716, 20531, 22440, 22022, 5587, 2539, 3021, 1078, -298, -1881, -512, -12565, -21719, -20180, -22446, -23768, +-23474, -22524, -20893, -18074, -16556, -15751, -16298, -11271, 6727, 10420, 11223, 12114, 13154, 14291, 15059, 15374, +15764, 16383, 17234, 18428, 20616, 21343, 24448, 12248, 1165, 3009, 259, -1014, -2362, -2009, -5421, -20561, +-21421, -22785, -24476, -23973, -23061, -21174, -18728, -17015, -16125, -16370, -11726, 5662, 9693, 10467, 11228, 12337, +13850, 14753, 14981, 15413, 15649, 16774, 18610, 20438, 21477, 24074, 19606, 2555, 2053, -97, -1941, -2377, +-3913, -2650, -14281, -23246, -22639, -25025, -24196, -23458, -21380, -19260, -17496, -16642, -16334, -12238, 4534, 8945, +9691, 10309, 11443, 13313, 14242, 14463, 14680, 14664, 16230, 18585, 19963, 21862, 22805, 23854, 7579, 297, +-275, -2659, -2994, -4433, -4174, -7258, -21957, -23928, -24732, -24834, -23430, -21586, -19737, -18025, -17173, -16152, +-12604, 3565, 8227, 9004, 9537, 10566, 12662, 13935, 14404, 14223, 13879, 15747, 18475, 19945, 21896, 22382, +24473, 14800, -330, -1015, -3083, -3735, -4683, -5824, -4756, -15680, -25553, -24315, -25611, -23493, -22107, -20384, +-18733, -17932, -16187, -13159, 2475, 7433, 8011, 8542, 9782, 12046, 13619, 14376, 13646, 13178, 15299, 18081, +20078, 21663, 22713, 23012, 20666, 2361, -2582, -3168, -4311, -5268, -6094, -6223, -8569, -23153, -25222, -25161, +-23580, -22058, -20870, -19352, -18456, -16273, -13381, 1854, 6564, 7002, 7597, 8975, 11232, 12956, 14126, 13147, +12510, 14640, 17621, 20143, 21503, 22786, 21823, 22962, 7987, -3925, -3177, -5083, -5639, -6465, -7584, -6964, +-15253, -26014, -24781, -24002, -22252, -21423, -20185, -19066, -16610, -13743, 1377, 5721, 5940, 6733, 8261, 10360, +12279, 13828, 12754, 12116, 14000, 17070, 20007, 21632, 22445, 21586, 22412, 14451, -3225, -3813, -5505, -5820, +-7352, -7735, -9014, -8855, -21884, -25799, -23561, -22871, -21733, -21329, -19745, -17268, -14287, 1043, 4974, 4856, +5767, 7294, 9385, 11515, 13234, 12476, 11752, 13386, 16513, 19682, 21647, 21850, 21607, 20684, 18791, 548, +-5335, -5382, -6401, -7597, -8495, -9968, -8375, -13195, -25237, -23303, -23032, -21831, -22134, -20367, -17745, -14812, +883, 4463, 3976, 4882, 6556, 8605, 10866, 12572, 12252, 11670, 12861, 15874, 19314, 21597, 21554, 21374, +19499, 19863, 6895, -6310, -5326, -7131, -7714, -9750, -10117, -10537, -7892, -18874, -24781, -22697, -22776, -22834, +-21550, -18525, -15896, -11, 3947, 2849, 3914, 5566, 7740, 10056, 11771, 11991, 11632, 12324, 15260, 18871, +21278, 21657, 20890, 19162, 18781, 12964, -4810, -5950, -7060, -8176, -10246, -10914, -10827, -8226, -8897, -22684, +-23096, -22788, -23308, -22121, -19046, -17016, -1567, 3881, 1949, 3017, 4696, 7194, 9373, 10962, 11573, 11408, +11815, 14487, 18309, 20773, 21637, 20114, 18774, 17213, 16443, -437, -7281, -6911, -9158, -10731, -12259, -11145, +-9799, -5198, -14053, -24618, -22897, -24252, -22691, -19901, -18199, -3532, 3665, 1116, 1994, 3789, 6671, 8690, +10264, 11172, 11390, 11753, 14192, 17769, 20416, 21700, 20027, 18430, 16531, 17274, 5911, -7483, -6663, -9252, +-11041, -12526, -11835, -9254, -6370, -5623, -20294, -24577, -23910, -23634, -20512, -19441, -5549, 3438, 462, 982, +2765, 6017, 7846, 9488, 10522, 10967, 11511, 13591, 16806, 19708, 21159, 19632, 17446, 16105, 15733, 11399, +-5643, -7796, -9494, -11802, -13143, -12604, -9504, -7051, -4287, -10704, -24947, -24186, -24172, -21045, -20255, -7681, +3178, 31, 131, 1951, 5524, 7394, 8994, 10104, 10721, 11542, 13449, 16250, 19225, 20981, 19745, 16944, +16056, 14351, 14700, -617, -8819, -9168, -12203, -13530, -12950, -10081, -6549, -5595, -4573, -17779, -26196, -24029, +-22311, -20875, -11321, 2288, -325, -941, 936, 4611, 6618, 8348, 9468, 10114, 11295, 12987, 15460, 18338, +20438, 19492, 16591, 15499, 13445, 15056, 4869, -9022, -9269, -12408, -13797, -13598, -10346, -7092, -5074, -5149, +-7855, -22853, -25237, -22410, -21417, -14289, 758, -83, -1687, 301, 3750, 6063, 8011, 9052, 9645, 11251, +12762, 14705, 17650, 19872, 19138, 16479, 14754, 12980, 13909, 9906, -7495, -10006, -12306, -14141, -14135, -11097, +-7662, -5202, -5505, -6069, -12813, -25727, -23206, -21956, -17146, -1424, -99, -2437, -530, 2576, 5222, 7355, +8617, 9112, 10800, 12386, 14050, 16981, 19351, 18882, 16525, 14247, 12875, 12619, 13416, -3594, -10878, -11883, +-14526, -14192, -11970, -7958, -5788, -4801, -7113, -7279, -17730, -25527, -21480, -19741, -3881, -181, -3001, -1247, +1472, 4516, 6950, 8113, 8593, 10253, 12027, 13410, 16130, 18514, 18389, 16428, 13780, 12391, 11494, 14518, +1535, -11534, -11710, -14833, -14521, -12809, -8878, -6115, -5369, -6063, -8311, -8934, -22063, -23091, -20841, -7585, +57, -3579, -1782, 551, 3612, 6372, 7850, 8476, 9865, 11795, 13158, 15633, 17999, 18205, 16513, 13885, +11995, 11170, 14172, 6958, -10444, -11784, -14594, -14540, -13103, -9473, -6349, -5662, -5571, -8328, -8014, -12888, +-23745, -21787, -12227, -660, -3801, -2674, -446, 2795, 5747, 7388, 8173, 9407, 11138, 12568, 14820, 17147, +17700, 16273, 13749, 11413, 10866, 12735, 10840, -7698, -12373, -14132, -14896, -13457, -10226, -7108, -5779, -5878, +-7235, -9533, -7556, -17098, -23701, -15622, -2642, -3095, -3404, -1111, 2042, 5272, 7229, 8097, 9128, 10700, +12318, 14313, 16554, 17286, 16261, 14015, 11322, 10852, 11620, 13046, -3001, -12720, -13361, -15067, -13770, -11063, +-7704, -6237, -5789, -6961, -9002, -8707, -8847, -21073, -19935, -5056, -2728, -4153, -2199, 937, 4308, 6613, +7708, 8738, 9894, 11554, 13529, 15663, 16676, 16108, 14204, 11321, 10592, 10849, 13397, 2259, -12300, -12749, +-14981, -14095, -11947, -8480, -6662, -5840, -6727, -8393, -9537, -7200, -11777, -22822, -8658, -2517, -4463, -3171, +-151, 3529, 6065, 7540, 8573, 9364, 10967, 12914, 14889, 16221, 15940, 14301, 11694, 10313, 10447, 12345, +7199, -10515, -12781, -14596, -14594, -12662, -9485, -7050, -6288, -6487, -8423, -9026, -9172, -5565, -17836, -14756, +-2105, -5044, -3807, -1448, 2577, 5607, 7345, 8427, 8985, 10251, 12270, 14070, 15743, 15808, 14305, 12156, +10042, 10230, 11016, 10540, -6853, -13086, -13700, -14836, -13089, -10560, -7598, -6567, -6608, -7893, -9066, -9233, +-6352, -8408, -17230, -4021, -4558, -4819, -2446, 1475, 5009, 7020, 8155, 8627, 9695, 11612, 13240, 15058, +15528, 14151, 12534, 10124, 9958, 9890, 11862, -1819, -13157, -12953, -14941, -13512, -11571, -8425, -6862, -7003, +-7637, -9381, -8808, -8212, -4746, -12560, -8612, -3230, -5832, -3148, 122, 4374, 6695, 7892, 8520, 9255, +10941, 12522, 14300, 15352, 14229, 12822, 10691, 9758, 9406, 11692, 2768, -12359, -12264, -14581, -13959, -12374, +-9354, -7122, -7027, -7661, -9062, -9075, -8005, -5972, -6914, -9826, -4199, -5651, -4325, -1059, 3154, 6321, +7604, 8289, 8983, 10313, 11728, 13493, 15050, 14316, 12939, 11273, 9582, 9120, 10834, 6569, -10532, -12238, +-13889, -14298, -13006, -10322, -7724, -7053, -7544, -8806, -9183, -7854, -6758, -5827, -6197, -5413, -5263, -5185, +-2008, 1893, 5629, 7378, 8087, 8830, 9970, 11174, 12815, 14647, 14456, 13191, 11829, 9593, 9034, 9799, +9304, -7582, -12430, -13046, -14484, -13420, -11218, -8326, -7118, -7449, -8769, -9237, -8180, -6725, -6772, -4515, +-2678, -5965, -5337, -3234, 928, 4696, 7102, 7903, 8606, 9571, 10643, 12086, 14058, 14405, 13386, 12172, +9833, 9052, 8942, 10899, -3646, -12723, -12204, -14465, -13682, -11918, -9095, -7383, -7361, -8590, -9450, -8035, +-7255, -6275, -6887, 909, -4204, -6419, -3700, -308, 3775, 6503, 7651, 8310, 9259, 10369, 11591, 13492, +14307, 13498, 12502, 10272, 9128, 8485, 11267, 555, -12415, -11668, -14190, -13886, -12507, -9862, -7724, -7240, +-8127, -9494, -8140, -7461, -5954, -8059, -1800, 1390, -7447, -3988, -1499, 2802, 5704, 7313, 7937, 8866, +10052, 11035, 12945, 14262, 13696, 12822, 10767, 9164, 8394, 10938, 4501, -11370, -11412, -13653, -14012, -12882, +-10587, -8314, -7292, -7824, -9152, -8436, -6982, -6664, -6744, -7008, 4797, -4429, -5793, -1893, 1491, 5121, +6816, 7710, 8480, 9848, 10825, 12427, 14053, 13775, 13027, 11375, 9323, 8500, 10238, 7747, -9276, -11568, +-12915, -14024, -13211, -11067, -8903, -7646, -7694, -8863, -8769, -6836, -6982, -5898, -9178, 1292, 3064, -7541, +-2222, 124, 4295, 6076, 7473, 8030, 9401, 10590, 11913, 13899, 14066, 13100, 11920, 9569, 8484, 9225, +9921, -6473, -11988, -12170, -14156, -13526, -11729, -9536, -8102, -7630, -8457, -8752, -7137, -6509, -6508, -7909, +-5689, 7913, -4198, -4216, -182, 3161, 5720, 6961, 7822, 8892, 10555, 11573, 13549, 14374, 13197, 12212, +10091, 8694, 8431, 11041, -2703, -12224, -11660, -14185, -14050, -12396, -10057, -8726, -7962, -8372, -8598, -7514, +-6152, -6895, -6541, -9599, 3647, 3731, -6207, -289, 1899, 5392, 6332, 7569, 8383, 10240, 11492, 13285, +14797, 13802, 12619, 10759, 9188, 8108, 11393, 2298, -11611, -11149, -13754, -14184, -12931, -10459, -9129, -8277, +-8277, -8578, -7522, -6216, -6358, -6721, -8911, -4962, 8420, -3599, -2225, 1707, 4477, 5984, 6831, 7870, +9692, 11360, 12800, 14675, 14196, 12784, 11219, 9448, 8020, 10530, 6874, -9868, -11416, -13333, -14516, -13642, +-11209, -9502, -8664, -8469, -8695, -7836, -6641, -5897, -6940, -7408, -9993, 4453, 3759, -4529, 1722, 3507, +5793, 6174, 7389, 9101, 11107, 12649, 14671, 14843, 13277, 11741, 9926, 8597, 9392, 10156, -6366, -11732, +-12629, -14543, -13968, -11790, -9845, -8757, -8454, -8606, -7962, -6666, -5818, -6376, -7240, -9708, -4384, 8717, +-2466, -56, 3559, 5168, 5800, 6562, 8479, 10595, 12353, 14313, 15210, 13750, 12257, 10341, 9143, 8566, +11625, -1763, -11908, -11969, -14679, -14418, -12584, -10272, -9028, -8372, -8692, -8268, -6681, -5939, -5536, -7242, +-8086, -9884, 5393, 4311, -2513, 3915, 4675, 5871, 6035, 7858, 10066, 12072, 14068, 15496, 14499, 12778, +10939, 9657, 8465, 11639, 3496, -11116, -11285, -14330, -14752, -13360, -10757, -9327, -8408, -8748, -8729, -7292, +-6132, -5388, -6598, -7761, -10485, -3435, 8262, -2226, 2354, 4805, 5648, 5596, 6916, 9237, 11489, 13593, +15502, 15125, 13219, 11515, 9779, 8659, 10685, 8083, -8779, -11301, -13515, -14962, -14014, -11411, -9697, -8402, +-8300, -8763, -7748, -5956, -5324, -5470, -7536, -8479, -9983, 6028, 2277, -321, 5481, 5459, 5776, 6142, +8537, 10895, 13147, 15399, 15873, 13958, 12193, 10283, 9196, 9717, 11171, -4840, -11534, -12519, -15127, -14484, +-12241, -10172, -8724, -8140, -8849, -8548, -6431, -5295, -4885, -6971, -7695, -11233, -2797, 6908, -1796, 4732, +5673, 6007, 5670, 7608, 10119, 12485, 14921, 16283, 14830, 12929, 11065, 9904, 9254, 12460, 408, -11390, +-11394, -14783, -14909, -13235, -10831, -9312, -8122, -8539, -8834, -7112, -5200, -4525, -5514, -7646, -8804, -10327, +5127, 1157, 1695, 6356, 6154, 6084, 6768, 9368, 11843, 14204, 16223, 15704, 13704, 11863, 10435, 9315, +12146, 5817, -10299, -11102, -14058, -15027, -14014, -11616, -9959, -8334, -8290, -9071, -7970, -5586, -4423, -4635, +-7112, -7622, -11440, -3016, 4811, -672, 5795, 6260, 6711, 6641, 8760, 11120, 13542, 15901, 16318, 14727, +12817, 10966, 10002, 11351, 10199, -7088, -11057, -12871, -14758, -14359, -12276, -10526, -8779, -8047, -8877, -8659, +-6459, -4651, -4268, -5862, -7625, -9242, -9882, 3323, 404, 3045, 6425, 6761, 6895, 8063, 10427, 12608, +15171, 16531, 15503, 13779, 11419, 10532, 10530, 12766, -2528, -11377, -11875, -14607, -14555, -13026, -10914, -9313, +-7899, -8591, -8975, -7179, -4945, -3864, -4686, -6893, -7572, -10781, -3090, 2664, 893, 5998, 6743, 7553, +8001, 10015, 12072, 14387, 16509, 16312, 14974, 12519, 11117, 10507, 13589, 3724, -10805, -10996, -14247, -14443, +-13622, -11567, -10141, -8314, -8353, -9218, -8039, -5730, -4059, -4122, -5838, -7454, -9048, -8714, -1334, 457, +4020, 6182, 7349, 8111, 9490, 11359, 13328, 15737, 16503, 15520, 13757, 11601, 10942, 12822, 9774, -8014, +-10943, -13295, -14506, -13954, -12116, -10574, -8858, -7951, -8840, -8423, -6264, -4272, -3666, -4805, -6449, -8128, +-8660, -6493, -2164, 2917, 5251, 6914, 8267, 9664, 11117, 12752, 14845, 16310, 16099, 14975, 12532, 11647, +11979, 13506, -2619, -11317, -12175, -14582, -14026, -12626, -10983, -9560, -7974, -8451, -8826, -6959, -4892, -3691, +-4253, -5819, -7352, -8324, -7042, -7924, 590, 4426, 5903, 7926, 9732, 11132, 12362, 14012, 15780, 16196, +15803, 13763, 12446, 11767, 14575, 4146, -10508, -11264, -14138, -13990, -12921, -11181, -10159, -8436, -7961, -8649, +-7459, -5360, -3818, -3706, -5207, -6245, -8317, -5830, -9521, -6620, 4380, 4313, 7239, 9318, 11553, 12571, +13705, 15095, 15886, 15940, 14691, 13067, 12440, 13943, 10107, -7650, -10933, -13418, -14085, -13341, -11714, -10686, +-9339, -8218, -8653, -8050, -6051, -4302, -3707, -4545, -5830, -7015, -6862, -5783, -14662, -459, 4602, 5600, +8706, 11436, 13118, 13754, 14806, 15592, 15750, 15423, 13735, 13529, 13510, 14145, -2023, -10469, -11820, -14015, +-13177, -11947, -10772, -9901, -8426, -8431, -8243, -6545, -4709, -3849, -3968, -5400, -6082, -7453, -3660, -13260, +-12495, 4240, 4090, 7641, 10417, 13367, 14095, 14665, 15311, 15354, 15363, 14199, 14055, 13748, 15500, 4778, +-9652, -10508, -13704, -13143, -12218, -10847, -10239, -9010, -8305, -8329, -6774, -5019, -3901, -3964, -4825, -5955, +-6756, -4601, -6750, -18945, -4612, 4768, 5668, 9581, 12726, 14912, 15250, 15381, 15180, 15301, 14717, 14298, +14787, 15528, 11133, -6799, -9929, -12446, -13319, -12110, -11009, -10285, -9492, -8493, -8488, -7116, -5098, -3981, +-4141, -4757, -5934, -6477, -5229, -3579, -15306, -15799, 488, 5202, 7887, 11835, 14785, 16076, 15838, 15340, +15049, 14912, 14121, 15460, 15389, 15179, -1418, -10307, -10807, -13338, -12182, -11012, -10297, -9924, -8790, -8672, +-7505, -5087, -3613, -3782, -4518, -5576, -6115, -5674, -2218, -10175, -18149, -10525, 3324, 6726, 10696, 14066, +16559, 16787, 15728, 15091, 15010, 14135, 15387, 15838, 16831, 6119, -9702, -9826, -12602, -12310, -11012, -10113, +-10081, -9235, -8935, -8372, -5708, -3450, -3294, -4432, -5609, -6161, -6188, -2304, -6625, -16255, -16026, -7630, +6327, 8781, 13254, 15949, 17529, 16503, 15379, 15048, 14206, 14742, 16522, 16852, 13347, -5365, -10185, -11117, +-12155, -10857, -9850, -9788, -9430, -8838, -8684, -6276, -3343, -2313, -3624, -5267, -6367, -6048, -3447, -2721, +-14914, -14753, -15872, -2547, 9044, 11406, 15541, 17417, 17511, 15712, 15153, 14349, 14045, 16441, 16522, 16850, +2154, -10546, -10168, -12164, -10953, -9962, -9551, -9569, -9071, -8898, -7146, -3932, -1927, -2658, -4539, -6371, +-6105, -4458, -1169, -11258, -15580, -14335, -14268, 3443, 11273, 14060, 17374, 18058, 16761, 15566, 14809, 13973, +15951, 17103, 17407, 10389, -8121, -9940, -11509, -11033, -9792, -9275, -9227, -9090, -9029, -7688, -4747, -1916, +-1687, -3569, -6036, -6526, -5372, -1070, -7362, -15825, -13355, -15571, -9499, 8460, 13214, 16496, 18234, 17341, +15953, 15107, 14069, 14859, 17371, 16880, 15775, -1780, -10588, -10434, -11314, -9502, -9096, -8770, -8927, -9334, +-8268, -5532, -2415, -986, -2374, -5014, -6654, -5950, -1978, -3739, -14594, -13637, -13605, -14172, -3655, 12650, +15250, 18275, 17882, 16638, 15585, 14466, 14439, 16937, 17146, 17325, 6666, -9523, -9587, -11149, -9448, -8763, +-8626, -8399, -9184, -8809, -6221, -3156, -1094, -1516, -3900, -6400, -6231, -3685, -1249, -12718, -14205, -13583, +-12931, -11721, 2674, 15572, 16850, 18580, 16773, 16070, 14683, 14375, 16099, 17640, 16809, 13452, -5090, -9843, +-10211, -9771, -8362, -8388, -8089, -8830, -9015, -6719, -3516, -1296, -932, -2682, -5625, -5898, -4840, -543, +-9550, -15131, -12824, -13370, -10863, -8639, 8654, 17456, 17851, 17732, 16120, 15292, 14626, 15415, 17819, 16627, +16550, 2408, -9868, -9169, -10060, -8173, -8015, -7618, -8152, -9138, -7356, -3919, -1533, -860, -1699, -4739, +-5348, -5096, -1172, -6823, -15719, -12943, -13059, -10708, -9090, -4288, 13530, 18147, 17887, 16624, 15352, 15078, +15153, 17214, 17218, 16831, 10279, -7374, -8830, -9683, -8319, -7574, -7296, -7529, -8585, -7832, -4533, -1780, +-908, -1157, -3618, -4942, -4570, -2030, -4452, -15552, -13745, -12836, -10958, -8411, -7137, 733, 17005, 18045, +17417, 15496, 15267, 15378, 16424, 17813, 16090, 15122, -1403, -9172, -8621, -8736, -7351, -7027, -6959, -7985, +-7787, -5156, -1962, -947, -861, -2752, -4642, -3835, -2398, -2227, -14574, -14875, -12998, -10836, -8939, -6130, +-5025, 5449, 18566, 17298, 16045, 15132, 15885, 16203, 17766, 16351, 16583, 6532, -8280, -7732, -8669, -7446, +-6903, -6643, -7632, -7694, -5771, -2196, -540, -592, -1942, -4371, -3433, -2430, -430, -12324, -16460, -13133, +-11547, -8607, -7039, -3804, -3130, 9991, 18818, 15863, 15402, 15624, 16491, 17228, 17141, 15941, 13117, -4326, +-7761, -7682, -7739, -6847, -6470, -7383, -7630, -6144, -2875, -451, -314, -1462, -4189, -3522, -2230, 800, +-10049, -17642, -13983, -12165, -9150, -7226, -4492, -2499, -600, 14525, 17322, 15016, 15667, 16376, 16908, 17412, +15520, 16041, 3924, -7756, -6163, -7737, -6920, -6492, -6858, -7201, -6012, -3181, -529, 102, -895, -3928, +-3963, -2514, 1647, -6872, -17870, -15048, -13082, -9693, -7637, -5052, -2156, -2054, 3385, 16774, 15415, 15430, +16075, 17068, 17160, 16191, 15577, 12043, -4515, -6200, -6647, -7287, -6579, -6593, -6625, -5561, -3363, -841, +262, -147, -3033, -4080, -2987, 1789, -3284, -17161, -15785, -14250, -10627, -8465, -5418, -3043, -669, -1629, +7158, 16430, 14439, 15557, 16716, 17218, 17081, 15042, 15615, 3191, -6940, -5314, -7272, -6661, -6593, -6150, +-5153, -3319, -1151, 265, 347, -2030, -3898, -3331, 975, -264, -15452, -16410, -14989, -11911, -8955, -6269, +-3185, -1227, 280, -1175, 10049, 15594, 14141, 16535, 17427, 17375, 15834, 15248, 11440, -4602, -5290, -6202, +-6885, -6634, -5998, -4776, -3061, -1470, -81, 512, -789, -3240, -3411, -176, 1618, -12761, -16382, -15251, +-13143, -10039, -7012, -3991, -1716, 493, -665, -26, 13265, 14006, 15397, 17720, 17438, 16959, 14340, 15622, +2713, -6489, -4748, -6775, -6793, -6161, -4455, -2644, -1470, -509, 328, 23, -2222, -3308, -1343, 2504, +-10041, -15640, -14933, -13917, -11121, -7918, -4888, -1999, 118, 1329, -3251, 3773, 14389, 13854, 17269, 17693, +17437, 15344, 15536, 11581, -4644, -4844, -5679, -7107, -6536, -4680, -2322, -1300, -1048, 45, 351, -1266, +-2781, -2104, 2613, -7779, -14990, -14109, -14452, -12253, -9309, -5770, -2868, 119, 1214, -919, -4059, 8079, +14122, 15359, 18146, 17527, 16659, 14636, 16222, 2514, -5966, -4177, -6903, -6527, -4967, -2188, -806, -1078, +-348, 296, -543, -1760, -2194, 2347, -5500, -14603, -12999, -14210, -12984, -10729, -7026, -3883, -658, 1137, +161, -3922, -2356, 11491, 14143, 17475, 18115, 16995, 15417, 16159, 11355, -4421, -4457, -6038, -6696, -5299, +-2590, -520, -875, -709, 134, -146, -772, -1768, 1960, -3537, -14492, -12275, -13323, -13303, -11710, -8357, +-4703, -1532, 1091, 427, -1528, -6412, 1939, 13759, 15638, 18787, 17107, 16782, 15444, 16336, 2739, -5638, +-4743, -6624, -5416, -3128, -473, -598, -965, -36, -110, -188, -929, 1500, -1714, -14151, -12483, -12170, +-12897, -12413, -9576, -5896, -2338, 34, 645, -817, -4104, -6418, 7492, 15333, 17680, 17994, 16950, 16360, +16525, 11693, -4113, -4862, -5835, -5427, -3433, -874, -151, -914, -202, 85, 8, 223, 1758, 113, +-13534, -13329, -11520, -11969, -12478, -10632, -7097, -3481, -983, 5, -278, -2322, -6686, -3488, 12514, 16527, +18156, 17202, 17627, 15852, 16954, 3157, -6126, -4641, -5479, -3380, -1359, -235, -716, -646, 291, 113, +779, 1937, 1950, -12000, -14235, -11233, -11030, -11731, -11404, -8436, -4746, -1819, -1029, -243, -1557, -4311, +-8377, 3555, 15987, 16987, 18131, 17890, 16915, 17121, 12519, -4438, -4772, -4630, -3219, -1530, -718, -575, +-1099, 83, 304, 1147, 2216, 3668, -9131, -15321, -11400, -10686, -10539, -11316, -9497, -5956, -2824, -1881, +-1170, -1089, -3306, -7205, -5925, 11052, 16341, 17766, 18285, 17989, 16305, 17529, 3376, -6250, -3615, -3394, +-1433, -1137, -704, -1351, -561, 483, 1368, 2305, 4679, -5573, -16017, -11893, -10923, -9965, -10497, -10095, +-7294, -3764, -2679, -2391, -1320, -2513, -5114, -8767, 861, 15266, 16959, 19099, 18409, 17269, 17436, 12996, +-3912, -3948, -2846, -1421, -1242, -1246, -1455, -1330, 394, 1755, 2756, 4991, -1616, -15476, -12794, -11340, +-9731, -9416, -9805, -8295, -4844, -3660, -3391, -2513, -1969, -4181, -6842, -7389, 8543, 16874, 18481, 18787, +18030, 16591, 17666, 4413, -5354, -2078, -1616, -1002, -1830, -1876, -1874, -226, 1935, 3333, 4727, 1548, +-13920, -13958, -11879, -10127, -8651, -8842, -8740, -5997, -4591, -4470, -3571, -2379, -3260, -5164, -8643, -1644, +14969, 17819, 19203, 18372, 17475, 17366, 14093, -2485, -2618, -917, -932, -1826, -2400, -2300, -883, 1634, +4307, 4458, 4150, -10594, -14962, -12241, -11060, -8632, -8146, -8489, -7092, -5735, -5620, -4616, -3385, -2844, +-4533, -6855, -8338, 7994, 17675, 18525, 18771, 18107, 16469, 17819, 6927, -3901, -284, -1201, -1491, -3027, +-3125, -1713, 943, 4894, 4836, 5531, -6249, -15270, -12526, -11872, -8770, -7593, -7724, -7467, -6799, -6489, +-5499, -4303, -3300, -3821, -5476, -9196, -1486, 15924, 18162, 19485, 18417, 17389, 16729, 16157, 674, -1205, +-291, -1440, -3013, -4199, -2639, 15, 4814, 5678, 5805, -2259, -14814, -13052, -12633, -9621, -7839, -7121, +-7276, -7785, -7520, -6617, -5222, -4418, -3670, -5135, -7449, -8130, 8906, 18120, 18682, 18927, 17753, 16260, +18234, 11035, -1495, 293, -1558, -2752, -4896, -3535, -612, 4132, 6605, 6032, 1530, -12839, -13434, -12789, +-10372, -7924, -6571, -6221, -7931, -8581, -7574, -6023, -5171, -4205, -4610, -6119, -8887, -706, 16144, 18115, +19332, 17842, 17385, 16774, 18859, 4932, -1054, -623, -2757, -4742, -4645, -1413, 3180, 7020, 6222, 4427, +-9621, -14555, -12741, -11387, -8503, -6754, -5766, -7933, -9624, -8727, -7103, -5936, -5227, -4623, -5665, -7318, +-6544, 10728, 17921, 18621, 18374, 17451, 16682, 19261, 15834, 41, -856, -2804, -4797, -5473, -2485, 2245, +6812, 6581, 6017, -4232, -15014, -12524, -11794, -9217, -7257, -5425, -7410, -10118, -9887, -8443, -6811, -5954, +-5081, -5416, -5783, -8403, 3047, 16895, 17422, 18742, 17373, 17470, 17623, 21636, 8514, -2442, -2175, -5069, +-5510, -3614, 1227, 5757, 6828, 6115, 1098, -13604, -13326, -11834, -10123, -7955, -5662, -7152, -10316, -10927, +-9871, -7917, -6675, -6079, -5376, -5171, -7544, -3915, 13390, 17090, 18217, 18088, 17385, 17882, 20684, 19055, +972, -2895, -4569, -5659, -4257, -26, 4230, 6783, 5727, 4972, -9519, -14403, -11508, -10696, -8557, -6191, +-6972, -10046, -11164, -10864, -9206, -7262, -6774, -5760, -5355, -5914, -7776, 6948, 16661, 16962, 18391, 17275, +18102, 19278, 22285, 11218, -3564, -4063, -5738, -4398, -1113, 2764, 6125, 5348, 6380, -3764, -14956, -11700, +-11118, -9206, -7168, -7299, -9872, -11093, -11492, -10546, -8258, -7385, -6410, -5601, -5040, -7968, -44, 15098, +16486, 18265, 17848, 17861, 19664, 20697, 20227, 2099, -5552, -4845, -4602, -1485, 1320, 4582, 5321, 5988, +2266, -12994, -12532, -10917, -9688, -7940, -8060, -10159, -11194, -11722, -11568, -9589, -7999, -6962, -5905, -5300, +-6748, -5149, 11268, 16135, 17424, 18025, 18099, 19678, 19941, 21205, 13017, -5446, -4943, -4463, -1949, 438, +2693, 4875, 4906, 5849, -7923, -13657, -10691, -10100, -8408, -9121, -10449, -11249, -11824, -12204, -10972, -8893, +-7517, -6266, -5939, -5547, -7467, 5751, 15764, 16543, 18058, 18699, 19469, 20294, 19773, 19815, 2837, -6512, +-3253, -2408, 46, 967, 3662, 4455, 6468, -1437, -13522, -11118, -10536, -8961, -9993, -10908, -11503, -12109, +-12470, -12289, -10129, -8039, -6882, -6663, -5576, -7733, -622, 14045, 15447, 17415, 18602, 19855, 19724, 19715, +19387, 13694, -4171, -3842, -2083, -566, 54, 1804, 4364, 5445, 4130, -10230, -11960, -10327, -9381, -10306, +-11596, -11741, -12505, -12697, -12881, -11366, -8635, -7310, -6938, -6159, -6681, -5396, 10559, 15101, 16585, 18708, +20204, 19283, 19655, 18115, 18215, 5989, -5059, -1341, -1506, -452, -93, 3745, 4533, 6400, -4468, -12828, +-10488, -10099, -10844, -12532, -12322, -13094, -13161, -13263, -12677, -9744, -7907, -7347, -6996, -5993, -7666, 5961, +14612, 15262, 18600, 20004, 19721, 18626, 18344, 16903, 15423, -699, -2562, -965, -1246, -895, 2482, 4390, +6159, 2397, -11276, -10920, -10289, -11150, -12876, -12963, -13518, -13663, -13379, -13478, -10923, -8551, -7742, -7554, +-5970, -8299, 1135, 13687, 14074, 18052, 19780, 20010, 18122, 17945, 15987, 17803, 9771, -3069, -801, -2013, +-1503, 709, 4121, 4851, 6521, -6469, -11907, -10360, -11854, -13086, -13823, -14148, -14296, -13833, -13857, -12109, +-9501, -8151, -7785, -6481, -7958, -3197, 11862, 13573, 17007, 19831, 19986, 18442, 16901, 16491, 16196, 17942, +3229, -2511, -1564, -2407, -286, 3086, 4229, 7242, 178, -11618, -10503, -12267, -13061, -14083, -14704, -14846, +-14403, -13957, -13016, -10739, -8852, -7873, -7055, -7410, -6729, 8523, 13400, 15677, 19527, 19855, 18524, 16354, +15817, 15782, 18736, 13933, -1554, -1791, -2842, -1115, 1779, 3924, 6019, 5648, -8524, -11379, -12255, -13584, +-14358, -15468, -15580, -14989, -14214, -13463, -11867, -9841, -7892, -7447, -7112, -8703, 4095, 13350, 14631, 18945, +19930, 18774, 16376, 14757, 16126, 17196, 20256, 6327, -3551, -2505, -2217, 755, 3298, 4733, 7929, -2568, +-12179, -12201, -14245, -14632, -16048, -16421, -15964, -14772, -13796, -12837, -11039, -8312, -7709, -7313, -9359, -952, +12625, 14204, 18097, 19664, 18792, 16299, 14315, 15302, 17214, 19931, 16719, -1367, -3472, -2547, -191, 2460, +4329, 7539, 3951, -10580, -12368, -14403, -15208, -16303, -17177, -16909, -15479, -14215, -13618, -12377, -9333, -7730, +-7611, -9147, -5098, 10723, 13963, 16793, 18952, 18790, 16381, 14262, 14215, 17228, 18457, 20999, 7844, -5023, +-2700, -1581, 1392, 3874, 5882, 8037, -5752, -13512, -14079, -16128, -16254, -17253, -17457, -16261, -14880, -14301, +-13491, -10516, -7827, -7710, -8412, -7608, 8155, 14102, 15999, 18567, 18858, 16944, 14098, 13913, 16513, 18862, +20248, 16997, -1753, -4085, -1776, 414, 3486, 5190, 8258, 1495, -13196, -14298, -16754, -16741, -17371, -18011, +-17173, -15819, -15179, -14248, -11645, -8296, -7864, -7950, -9333, 4627, 13729, 15137, 17934, 18344, 17221, 13988, +13739, 15791, 18795, 19191, 20551, 7242, -5524, -2117, -713, 2654, 5079, 6581, 6583, -8733, -15412, -16608, +-17550, -17083, -18278, -18161, -16919, -15951, -14918, -12636, -9131, -8088, -7699, -9988, 910, 13283, 14591, 17356, +17860, 17327, 14253, 13139, 15237, 17834, 19404, 19630, 16123, -2238, -3904, -1046, 1408, 4897, 5634, 7068, +-1564, -15699, -16890, -18394, -17216, -18418, -18966, -18232, -16988, -15670, -13588, -10359, -8501, -7572, -10090, -2696, +12044, 14148, 16750, 17170, 16884, 14476, 12592, 14568, 16782, 19070, 18670, 19310, 6561, -5256, -1374, 474, +4361, 5703, 5310, 4141, -11801, -18147, -18268, -17696, -18097, -19400, -19479, -18375, -16443, -14226, -11188, -8751, +-7530, -9914, -5150, 10273, 13594, 16259, 16777, 16506, 14530, 12281, 13717, 16113, 18018, 19073, 18548, 15003, +-1867, -3303, 137, 3389, 5794, 4102, 4999, -3864, -18913, -18624, -18433, -18028, -19793, -20492, -19619, -17359, +-14955, -12058, -9552, -7834, -9605, -6847, 8771, 13128, 15514, 16361, 15845, 14267, 12209, 12994, 15531, 17114, +19117, 18088, 18091, 6576, -4686, -409, 2794, 5557, 4486, 3202, 2356, -14223, -20374, -18275, -18302, -19596, +-21373, -20832, -18406, -15851, -13115, -10341, -8256, -9072, -8174, 7131, 12395, 14511, 15926, 15280, 13687, 12004, +12344, 14442, 16406, 18171, 18464, 17320, 14423, -1644, -2674, 2320, 5052, 4739, 2198, 2654, -6111, -20710, +-18738, -18457, -19325, -21733, -21970, -19882, -16964, -14179, -11317, -8959, -8573, -9136, 5494, 12083, 13581, 15624, +14967, 13299, 11897, 12131, 13628, 15393, 17249, 18545, 16734, 17310, 6475, -4473, 1558, 4480, 4627, 2493, +686, -815, -15514, -20660, -17929, -19294, -21441, -22901, -21277, -18199, -15096, -12188, -9788, -8336, -9663, 3997, +11882, 12521, 15001, 14705, 12805, 11317, 11777, 13028, 14426, 16646, 17657, 17233, 16252, 13883, -1731, -791, +4162, 4269, 2353, -69, -1359, -7242, -20464, -19032, -19298, -21248, -23416, -22640, -19591, -16322, -13217, -10738, +-8402, -9753, 3254, 11801, 11661, 14505, 14530, 12667, 10999, 11607, 12774, 13922, 16028, 16978, 17514, 15675, +16695, 5441, -3030, 3413, 4002, 2260, 147, -2989, -3040, -13716, -21315, -18966, -21205, -23152, -23823, -21063, +-17793, -14327, -11795, -8986, -10028, 2187, 11781, 10985, 13527, 14045, 12270, 10356, 10900, 12061, 13324, 15003, +16459, 16921, 16162, 15982, 12808, -2023, 1267, 3781, 2170, -326, -3031, -4472, -5808, -19366, -20536, -20536, +-22891, -24166, -22372, -19022, -15402, -12665, -9487, -9998, 1380, 11695, 10840, 13145, 13847, 12567, 10186, 10239, +11417, 12750, 14174, 16060, 16163, 16520, 14901, 16617, 4012, -1671, 3643, 2149, -314, -2824, -5486, -4025, +-11529, -22378, -20604, -22732, -24026, -23706, -20602, -16933, -14031, -10517, -10550, 359, 11422, 10506, 12681, 13637, +12631, 10070, 9523, 10700, 12148, 13507, 15253, 15832, 16014, 14908, 16120, 11524, -2173, 1955, 2032, -95, +-3294, -5035, -5953, -5130, -18685, -22533, -21937, -23992, -24012, -22047, -18475, -15702, -11649, -11204, -818, 11096, +10256, 12403, 13510, 12735, 10114, 8979, 9887, 11726, 13270, 14688, 15726, 15369, 15421, 14596, 16333, 2347, +-963, 2327, -321, -3164, -5116, -6502, -5148, -10379, -23096, -22261, -23716, -23880, -22711, -19713, -17090, -13123, +-12070, -2070, 10655, 9852, 11937, 13270, 12667, 9982, 8431, 8757, 10852, 12752, 14068, 15106, 14704, 15054, +14103, 16677, 9930, -2379, 1654, -404, -2766, -5305, -5900, -6881, -5616, -17011, -24127, -23096, -24177, -22853, +-20449, -18229, -14661, -13110, -3435, 9999, 9606, 11377, 12784, 12944, 10401, 8441, 8144, 9921, 12330, 13705, +14473, 14606, 14249, 14484, 14943, 15436, 621, -813, -117, -3416, -5170, -6390, -7158, -6769, -8677, -22628, +-24511, -24277, -23545, -20915, -19286, -16014, -14482, -4228, 9308, 9019, 10938, 12243, 12928, 10728, 8486, 7748, +9009, 11440, 13208, 13780, 14228, 13735, 14365, 13827, 16695, 6731, -2698, -258, -3813, -4898, -6638, -6879, +-7845, -6323, -14053, -26038, -24516, -24341, -21065, -19863, -17012, -15601, -5214, 8630, 8237, 10366, 11607, 12500, +11141, 8747, 7521, 8273, 10473, 12608, 13358, 13758, 13586, 13724, 13623, 14993, 12531, -1941, -1842, -3815, +-5470, -6358, -7606, -7407, -8105, -7396, -20912, -26726, -24380, -22071, -19847, -17763, -16659, -6470, 7733, 7604, +9904, 11015, 11986, 11384, 9246, 7603, 7675, 9600, 11971, 13090, 13376, 13739, 13283, 13682, 13234, 15204, +2579, -3975, -3623, -6241, -6309, -7810, -7831, -8173, -7705, -11482, -26080, -25760, -22856, -20182, -17980, -17384, +-7449, 6914, 6733, 9042, 10250, 11390, 11232, 9524, 7682, 7069, 8624, 10845, 12441, 12972, 13305, 13154, +13195, 12465, 14502, 8821, -4232, -3855, -6535, -6817, -7751, -8474, -7729, -8998, -7711, -17810, -28151, -23522, +-21213, -17953, -17749, -8763, 5914, 5970, 8241, 9717, 10912, 11393, 10031, 8146, 7155, 8019, 10022, 11889, +12672, 12765, 12969, 12600, 12325, 12597, 12926, -1506, -5197, -6279, -7711, -7942, -8520, -8267, -8268, -9425, +-9673, -23801, -26581, -21708, -18965, -17716, -10628, 4645, 5125, 6986, 8881, 10110, 11132, 10522, 8598, 7407, +7521, 9222, 11239, 12242, 12305, 12379, 12168, 12088, 11033, 13604, 3641, -6455, -6105, -8519, -8305, -8619, +-8159, -8125, -9278, -9417, -13968, -26769, -23469, -19744, -17730, -11766, 3375, 4439, 5699, 7827, 9201, 10578, +10937, 8978, 7529, 7181, 8330, 10341, 11887, 12174, 12007, 12008, 11652, 10437, 11937, 8945, -5780, -6899, +-8791, -9071, -8930, -7991, -8164, -8767, -10468, -10379, -18513, -26237, -20352, -18561, -12683, 2335, 3987, 4337, +6530, 8339, 9700, 11107, 9577, 7680, 7002, 7676, 9455, 11368, 12125, 11795, 11800, 11324, 10624, 9960, +12172, -1810, -8523, -8617, -9845, -9154, -8460, -7730, -8998, -9538, -11796, -11509, -21791, -23338, -18552, -14317, +1865, 3818, 3404, 5256, 7388, 8743, 10796, 10246, 7894, 6881, 7168, 8593, 10554, 11860, 11461, 11183, +10880, 10409, 8767, 12133, 4121, -9245, -8855, -10241, -9530, -8922, -7617, -8677, -9613, -11654, -12153, -13279, +-23400, -19916, -15915, 109, 4419, 2649, 4046, 6205, 8089, 10193, 10794, 8510, 7083, 6864, 7961, 9872, +11563, 11380, 10573, 10488, 9958, 8591, 10393, 9162, -7402, -10065, -10355, -10172, -9211, -7647, -8092, -9613, +-10762, -13386, -10593, -16431, -22192, -17355, -2633, 5110, 2033, 3023, 4936, 7254, 9415, 10934, 9152, 7221, +6704, 7567, 9315, 11152, 11554, 10253, 10089, 9450, 8553, 8564, 11629, -2820, -11780, -10725, -11084, -9822, +-8083, -7972, -9387, -10893, -12488, -12388, -9925, -18694, -20395, -4962, 5258, 2587, 2396, 3731, 6261, 8408, +10535, 9773, 7757, 6680, 6977, 8459, 10393, 11262, 10005, 9526, 8960, 8215, 7710, 11315, 3146, -11949, +-11344, -11718, -10454, -8512, -7802, -9220, -10401, -12105, -12852, -10449, -10408, -21370, -8314, 5226, 2944, 2044, +2640, 5062, 7321, 9778, 10200, 8417, 6971, 6647, 7606, 9812, 11038, 9979, 8879, 8514, 7441, 7473, +9690, 8315, -9308, -12552, -12315, -11325, -9183, -7744, -9042, -9984, -12042, -12478, -12717, -7243, -14987, -13779, +4662, 3207, 2111, 1761, 3934, 6252, 9055, 10342, 9230, 7573, 6644, 7263, 9299, 10840, 10196, 8568, +8123, 6768, 7157, 8188, 10816, -4029, -13603, -12470, -12187, -9635, -7718, -8477, -9661, -11036, -12463, -12584, +-9582, -7429, -15212, 1387, 4657, 2182, 1766, 2763, 5014, 7865, 10154, 9881, 8207, 6755, 6637, 8656, +10438, 10259, 8499, 7786, 6491, 6584, 7238, 10797, 2068, -13361, -13201, -13280, -10643, -8495, -8229, -9593, +-10165, -12329, -12347, -11802, -5674, -10256, -3583, 5667, 2257, 2116, 1820, 3961, 6555, 9497, 10141, 8920, +7276, 6337, 7984, 10049, 10015, 8282, 7243, 6347, 6007, 7036, 9387, 7369, -10672, -14145, -13933, -11823, +-9241, -8207, -9362, -9735, -11489, -12749, -12096, -8082, -4965, -4073, 4247, 3217, 2182, 1639, 2803, 5301, +8498, 10007, 9465, 7782, 6349, 7318, 9551, 9794, 8223, 6794, 5950, 5246, 6947, 7889, 10386, -5393, +-15047, -14104, -13178, -10267, -8607, -9131, -9533, -10699, -12800, -12420, -9674, -5241, -7, 2980, 3706, 2475, +1795, 2077, 4001, 7443, 9623, 9771, 8504, 6721, 6920, 9115, 9635, 8161, 6460, 5546, 4559, 6385, +7021, 10365, 989, -14717, -14486, -14242, -11176, -9237, -8950, -9097, -10030, -12271, -13229, -10185, -7681, 1520, +6327, 2749, 3474, 1765, 1864, 2694, 5911, 8785, 9608, 8845, 6974, 6695, 8501, 9440, 7990, 6047, +5137, 4203, 5449, 6819, 8900, 6521, -12177, -15260, -14841, -12672, -10033, -9299, -9077, -9499, -11930, -13161, +-11128, -8093, -2063, 11988, 4147, 3379, 2415, 1857, 2099, 4559, 8112, 9291, 9071, 7734, 7005, 8252, +9286, 7966, 5725, 4696, 4007, 4584, 6777, 7495, 9621, -7049, -15998, -14645, -14054, -10818, -9905, -9561, +-8935, -11518, -13080, -12542, -8190, -6444, 10934, 10519, 2048, 3452, 1582, 2029, 2950, 6889, 8816, 8808, +8181, 7195, 7889, 8772, 7970, 5439, 4155, 3889, 3893, 6278, 6725, 9984, -1466, -15801, -14554, -14993, +-11999, -10388, -9873, -8495, -10342, -12642, -12863, -9227, -7596, 4359, 17464, 3860, 3217, 2122, 2134, 2308, +5667, 8571, 8605, 8455, 7720, 8115, 8816, 8220, 5910, 3893, 3852, 3802, 5512, 6401, 9046, 3723, +-14214, -14899, -15182, -13426, -11161, -10422, -8791, -9398, -12272, -12848, -10710, -7328, -2199, 18209, 11099, 2059, +2972, 1784, 2135, 4050, 7744, 8139, 8015, 7903, 8100, 8695, 8091, 6116, 3570, 3173, 3627, 4632, +6196, 7536, 7386, -10668, -15490, -14456, -14332, -11875, -10914, -9402, -8552, -11427, -12581, -11586, -7714, -5466, +12509, 19453, 3862, 2844, 2204, 2163, 3284, 6811, 7961, 7589, 7923, 8291, 8869, 8194, 6324, 3741, +2444, 3404, 4208, 5903, 6441, 8958, -5732, -16104, -13896, -14834, -12946, -11523, -10065, -8556, -10692, -12458, +-11901, -8697, -6546, 5081, 22388, 10807, 1782, 2887, 1907, 3099, 5798, 7816, 7376, 7621, 8476, 9049, +8467, 6497, 4000, 1916, 2759, 3939, 5606, 5903, 8960, -405, -15543, -13721, -14424, -13668, -12209, -10618, +-8809, -9860, -12197, -11879, -9614, -6978, -1156, 18312, 18545, 3030, 2597, 2102, 2608, 5037, 7342, 7341, +7239, 8246, 9212, 8936, 6942, 4501, 1864, 2017, 3716, 5131, 5779, 8003, 4102, -13571, -14060, -13631, +-13899, -12895, -11161, -9449, -9179, -11644, -11959, -10309, -7360, -4424, 11305, 22926, 8766, 1671, 2948, 2231, +4593, 6769, 7102, 6811, 7531, 8955, 9254, 7564, 5028, 2081, 1314, 3331, 4919, 5785, 6748, 7133, +-10094, -14987, -13197, -13971, -13525, -12014, -10083, -9126, -10920, -11925, -10690, -7766, -5750, 4620, 21644, 16557, +2626, 3081, 2608, 4079, 6376, 6950, 6613, 6921, 8421, 9300, 7934, 5408, 2226, 706, 2591, 4553, +5846, 5960, 8607, -5505, -15431, -12725, -13670, -13615, -12910, -10927, -9615, -10357, -11911, -11116, -8480, -6021, +-488, 16622, 21836, 7490, 2041, 3464, 3449, 6140, 6950, 6580, 6541, 7732, 9204, 8422, 6070, 2820, +398, 1651, 4058, 5829, 5678, 8646, -440, -15287, -12754, -13353, -13435, -13377, -11589, -10254, -10151, -11529, +-11544, -9487, -6002, -3821, 9405, 22526, 13975, 2262, 3653, 3449, 5818, 7029, 6755, 6609, 7316, 8975, +8981, 6928, 3788, 694, 1083, 3438, 5654, 5847, 7931, 3326, -13977, -13282, -12873, -13219, -13362, -12192, +-10745, -10292, -11112, -11629, -10047, -6492, -4318, 2539, 18963, 19527, 5037, 2831, 4000, 5130, 6837, 6619, +6381, 6698, 8311, 9128, 7635, 4676, 1149, 483, 2678, 5019, 6092, 7020, 6280, -11640, -14424, -12587, +-13324, -13299, -12579, -11385, -10830, -11010, -11693, -10548, -7471, -3978, -1529, 12410, 22327, 10512, 2386, 4727, +5146, 7047, 6856, 6572, 6468, 7808, 9091, 8459, 5814, 2154, 284, 2153, 4489, 6564, 6716, 8233, +-7777, -15108, -12246, -13159, -13043, -12507, -11704, -11249, -11140, -11721, -11212, -8532, -4290, -2565, 5187, 20686, +16758, 3649, 4293, 5497, 6984, 7002, 6508, 6366, 7187, 8611, 8829, 6770, 3122, 161, 1277, 3624, +6342, 6405, 8916, -3629, -15276, -12250, -13086, -12764, -12121, -11573, -11465, -11230, -11786, -11549, -9141, -5238, +-1999, 357, 15014, 21306, 7798, 3507, 6119, 7118, 7485, 6716, 6426, 6748, 8213, 8992, 7774, 4205, +815, 845, 3183, 5897, 6603, 8830, 454, -14773, -12697, -13045, -12919, -12271, -11340, -11781, -11702, -11975, +-12047, -9982, -6357, -2134, -1196, 7628, 21579, 13760, 3624, 6103, 7443, 7967, 6925, 6409, 6319, 7501, +8747, 8575, 5405, 1626, 593, 2686, 5076, 6630, 8354, 4067, -13183, -13377, -12905, -13012, -12364, -11063, +-11673, -12073, -12282, -12697, -10802, -7118, -3110, -792, 1756, 17031, 19435, 6024, 5268, 8112, 8490, 7483, +6496, 5927, 6632, 8088, 8805, 6593, 2791, 597, 2034, 4301, 6372, 7516, 6867, -10234, -13874, -12670, +-13197, -12425, -11195, -11015, -12233, -12620, -13062, -11693, -7924, -4262, -505, -771, 8190, 21594, 10767, 4538, +8494, 9005, 8237, 6763, 5862, 6125, 7463, 8975, 7942, 4261, 1092, 1597, 3449, 6013, 7027, 8857, +-5951, -14244, -12267, -13411, -12514, -11501, -10574, -11831, -12657, -13314, -12421, -8918, -5010, -1598, -73, 760, +17153, 17259, 4787, 8252, 9512, 9097, 7359, 6008, 5964, 7093, 8837, 8950, 5854, 1825, 1171, 2885, +5497, 6727, 9712, -924, -13875, -11815, -13536, -12846, -11635, -10056, -10889, -12421, -13268, -13090, -9997, -5699, +-2518, 292, -1019, 7637, 21199, 8203, 6971, 10044, 9693, 8226, 6326, 5959, 6852, 8616, 9483, 7187, +2856, 1023, 2500, 4712, 6522, 9386, 3549, -12664, -12030, -13248, -13227, -11708, -9925, -10008, -11908, -13483, +-13754, -11067, -6763, -3013, -749, 268, 244, 17473, 14633, 5697, 10226, 9691, 9225, 6682, 6055, 6589, +8003, 9526, 8081, 4011, 1343, 2803, 4324, 6221, 8437, 7000, -10233, -12715, -12936, -13773, -12199, -10340, +-9785, -11358, -13526, -14350, -12390, -7953, -3682, -1597, 359, -1154, 7676, 19164, 6885, 9474, 10210, 10128, +7531, 6303, 6667, 7599, 9310, 8906, 5324, 2051, 2829, 4124, 5953, 7496, 9189, -6079, -13299, -12115, +-13797, -12611, -10699, -9516, -10403, -12992, -14835, -13492, -9238, -4576, -1641, -812, 711, 389, 15107, 11029, +7706, 11075, 10521, 8852, 6605, 6971, 7389, 8829, 9295, 6586, 3191, 2924, 4166, 5820, 6837, 9798, +-903, -13095, -11608, -13531, -13035, -11467, -9533, -9744, -12058, -14707, -14292, -10681, -5726, -2151, -1379, 820, +-134, 6235, 13128, 7388, 10936, 11091, 10222, 7533, 7592, 7768, 8639, 9642, 7713, 4538, 3662, 4476, +5871, 6746, 9085, 3823, -11658, -11839, -13061, -13174, -11985, -9940, -9531, -11157, -14153, -14861, -12034, -7134, +-2851, -1419, -297, 1025, 1511, 8714, 8601, 9517, 11385, 10815, 8525, 7914, 8043, 8431, 9498, 8495, +5507, 4325, 4841, 5772, 6842, 7937, 7267, -8669, -12392, -12276, -12956, -12289, -10754, -9509, -10589, -13259, +-14908, -12841, -8321, -3603, -1704, -660, 888, 1857, 3580, 6761, 9624, 11140, 11646, 9429, 8736, 8711, +8567, 9443, 9087, 6610, 5425, 5560, 5914, 7327, 7303, 9004, -4090, -12741, -11374, -12852, -12340, -11641, +-10075, -10406, -12550, -14636, -13739, -9649, -4868, -2129, -1329, 273, 1804, 3447, -540, 7793, 11011, 11610, +10231, 9338, 9392, 8902, 9341, 9286, 7569, 6158, 6079, 5934, 7315, 7240, 9278, 1388, -11925, -10977, +-12160, -11990, -12155, -10886, -10366, -11845, -13532, -13894, -10724, -6269, -2954, -1937, 50, 976, 5402, -2363, +-1089, 11874, 10878, 11332, 9773, 10457, 9807, 9745, 9599, 8441, 7153, 6701, 6338, 7173, 7583, 8372, +5905, -9719, -11317, -11510, -12027, -12256, -11760, -10647, -11458, -12669, -13523, -11918, -7637, -4165, -2343, -733, +981, 4509, 2592, -9585, 6230, 11872, 11059, 10627, 10962, 11073, 10375, 10128, 8975, 7981, 7556, 6986, +7168, 8287, 7971, 9099, -5495, -12076, -10705, -11820, -11840, -12170, -11050, -11067, -12054, -12766, -12386, -8826, +-5427, -3099, -1472, 755, 3445, 6133, -8548, -5675, 10778, 10822, 11135, 11345, 12068, 11305, 10503, 9440, +8635, 8324, 7720, 7456, 8887, 8125, 10123, -149, -12319, -10461, -11602, -11540, -12390, -11841, -11414, -12034, +-12135, -12286, -10120, -6754, -4315, -2233, 210, 2739, 7037, -3243, -12184, 1102, 11418, 10595, 11910, 12485, +12589, 11368, 9892, 9169, 8884, 8243, 7870, 9225, 8917, 9939, 5743, -10604, -10844, -10982, -11151, -12005, +-12207, -11680, -11806, -11629, -11568, -10633, -7888, -5212, -3261, -398, 1751, 7344, 185, -10670, -8784, 4117, +11828, 11554, 13333, 13589, 12960, 10771, 9691, 9504, 9008, 8413, 9169, 9886, 9147, 9934, -5948, -11839, +-10226, -11017, -11393, -12432, -12127, -12042, -11540, -10854, -10502, -9046, -6376, -4271, -1573, 1242, 6326, 4099, +-9388, -9294, -7842, 7923, 12306, 13258, 14538, 14399, 12329, 10551, 10342, 9656, 9259, 9590, 10685, 9207, +11452, 858, -12266, -10076, -10977, -10805, -12276, -12319, -12299, -11613, -10452, -9899, -9417, -7531, -4991, -2926, +534, 4897, 6595, -7064, -8877, -10559, -4867, 11377, 13219, 15018, 15522, 14045, 11445, 10782, 10294, 9702, +10012, 11045, 10362, 10895, 7187, -10379, -10826, -10400, -10409, -11738, -12619, -12702, -12149, -10797, -9555, -9356, +-8616, -5954, -3958, -656, 3647, 7740, -3392, -9431, -8723, -11942, 714, 14417, 14733, 16554, 15359, 12844, +11375, 11059, 10195, 10825, 11472, 11665, 10273, 10991, -5182, -12135, -9402, -10026, -10709, -12393, -12839, -12623, +-11332, -9455, -8784, -9004, -7016, -4688, -1939, 2143, 7946, -560, -8505, -8675, -10807, -9850, 7185, 16164, +16273, 16640, 14228, 12182, 11807, 10868, 11031, 11810, 12534, 10522, 11710, 1666, -12474, -9235, -9594, -10033, +-11857, -12829, -13003, -11925, -9769, -8171, -8721, -8091, -5628, -2734, 488, 7029, 2294, -7730, -7690, -10706, +-10985, -5578, 12776, 17092, 16993, 15757, 13370, 12799, 11962, 11467, 12539, 13115, 11959, 11038, 7608, -10033, +-10279, -8838, -9516, -11082, -12708, -13232, -12233, -10347, -7866, -7769, -8326, -6581, -3539, -805, 5397, 4380, +-6690, -6642, -10071, -10865, -9603, -510, 16319, 17463, 17017, 14921, 13623, 12970, 11870, 13026, 13626, 13391, +10831, 11052, -4099, -11629, -7908, -8936, -10030, -12063, -13057, -12537, -10897, -8160, -6778, -7858, -7410, -4673, +-1690, 3541, 5434, -5567, -5939, -8200, -11256, -9494, -7162, 4410, 18803, 17512, 16649, 14650, 14326, 12994, +13203, 14141, 14480, 11829, 11606, 3122, -11418, -7894, -8171, -9145, -11140, -12745, -12882, -11388, -8981, -6509, +-7026, -7812, -6067, -2747, 1335, 5601, -4606, -5813, -6906, -10241, -11041, -7110, -4627, 9260, 19615, 16981, +16245, 15054, 14414, 13757, 14554, 14980, 13610, 11350, 8862, -8098, -9158, -7059, -8717, -10217, -12109, -12839, +-11534, -9416, -6625, -5854, -7320, -7163, -3878, -85, 5439, -3387, -6155, -5229, -9241, -10754, -9245, -4539, +-1810, 13355, 19435, 16730, 16472, 15519, 14850, 15166, 15533, 15168, 11816, 11625, -1698, -10657, -6381, -8028, +-9246, -11346, -12362, -11952, -10196, -7589, -5539, -6486, -7685, -5252, -1889, 4325, -2311, -7161, -4536, -7865, +-10211, -10438, -6438, -2760, 1235, 16443, 18422, 16901, 16717, 15774, 15825, 15873, 16050, 13380, 11932, 5305, +-10080, -7024, -6977, -8329, -10235, -11466, -11862, -10650, -8404, -5728, -5338, -7153, -6241, -3578, 2978, -965, +-8174, -4421, -6483, -8973, -10670, -8580, -3621, -1455, 5058, 18666, 17759, 17504, 16649, 16293, 16697, 16424, +15454, 12070, 10609, -5381, -9144, -5827, -7774, -9052, -10747, -11305, -10908, -9148, -6695, -4849, -6203, -6789, +-5154, 849, 268, -8800, -4931, -5451, -7349, -10020, -9601, -6053, -960, -154, 9304, 19346, 17380, 17973, +16823, 17593, 17166, 16709, 13307, 12368, 2277, -10146, -5670, -6685, -7883, -9863, -10565, -10803, -9697, -7628, +-5114, -5228, -6506, -6079, -1805, 936, -8960, -6251, -4892, -6509, -8605, -10054, -7433, -2902, 1001, 855, +12756, 18975, 17781, 18155, 17811, 18275, 17144, 15433, 12507, 9034, -7490, -7380, -5430, -7083, -8622, -9774, +-10391, -10078, -8437, -5827, -4495, -5731, -6074, -3991, 554, -8427, -8010, -4728, -5810, -7381, -9116, -8614, +-4589, -226, 1378, 2398, 15680, 18805, 18830, 18677, 19036, 17943, 16709, 13048, 12429, -922, -9490, -4807, +-6318, -7512, -9245, -9787, -10033, -9010, -6903, -4502, -4936, -5563, -5494, -560, -7703, -10054, -5369, -5546, +-6331, -8030, -8888, -6565, -2044, 1578, 675, 5697, 18401, 19036, 19610, 19400, 19233, 17580, 14854, 12982, +7132, -8595, -6100, -5281, -6482, -8278, -9227, -9809, -9261, -7864, -5345, -4306, -4649, -5786, -2054, -6678, +-12217, -6590, -5810, -5573, -7097, -8001, -7942, -3847, 120, 2308, 204, 10389, 20130, 19724, 20387, 20060, +18549, 16546, 13304, 12434, -2620, -8569, -4524, -5582, -6904, -8713, -9104, -9256, -8384, -6343, -4284, -3935, +-5267, -3443, -5365, -13891, -8267, -6348, -5476, -6245, -7189, -7716, -5759, -1213, 1661, 1865, 1440, 15704, +20895, 20686, 20986, 19618, 17744, 14557, 13817, 5876, -9078, -5571, -5056, -5770, -7725, -8654, -9150, -8666, +-7172, -4986, -3855, -4291, -4080, -4097, -14661, -11091, -6948, -5853, -5517, -6474, -6977, -6545, -2979, 685, +2861, 656, 5062, 20037, 21229, 21884, 21016, 18797, 16579, 13987, 12475, -3939, -7763, -4485, -5062, -6249, +-8082, -8694, -8664, -7744, -6029, -4157, -3673, -4322, -2871, -13701, -14480, -8094, -6795, -5428, -5892, -6537, +-6319, -4616, -336, 1956, 2739, -333, 11031, 22407, 21956, 22801, 20059, 17913, 14627, 14761, 4482, -8639, +-5034, -4906, -4865, -6893, -8101, -8496, -7885, -6559, -4974, -3435, -4392, -2227, -11045, -17119, -10096, -7655, +-6017, -5430, -5958, -5885, -5033, -1980, 1451, 2658, 1645, 1247, 17137, 22951, 23012, 22167, 19087, 16280, +14433, 12038, -4956, -6927, -4899, -4691, -5454, -7632, -8399, -8064, -6996, -5969, -3934, -4353, -2521, -7820, +-18176, -13159, -9207, -7064, -6066, -5562, -5667, -4941, -3241, 311, 2401, 2994, 161, 5772, 21629, 23445, +24070, 20679, 18024, 14593, 15168, 2948, -8173, -4678, -4878, -4119, -6048, -7854, -8058, -7076, -6300, -4875, +-4030, -3287, -4728, -17031, -15474, -11297, -8004, -6847, -5808, -5674, -4743, -3597, -1132, 1978, 2809, 2448, +91, 13526, 24090, 24111, 23289, 19104, 16171, 14582, 11503, -5318, -6290, -4654, -4087, -4373, -6634, -7802, +-7162, -6198, -5747, -4216, -4247, -3057, -14249, -17045, -12999, -9782, -7485, -6467, -5485, -4849, -3633, -1865, +922, 2906, 3152, 1137, 4049, 20715, 24667, 25102, 21731, 18222, 14680, 14967, 3178, -7714, -4182, -4370, +-3651, -5233, -7383, -7719, -6338, -5950, -4724, -4858, -2892, -11181, -18195, -13919, -11811, -8408, -7403, -6036, +-5352, -4040, -2505, -120, 2444, 2934, 2660, 132, 11004, 24220, 24889, 24465, 19727, 16455, 14588, 11402, +-4699, -5665, -3914, -3825, -4107, -6023, -7709, -6690, -5754, -5093, -4938, -3575, -8093, -18630, -14732, -12718, +-9724, -8088, -6969, -5905, -4447, -2833, -726, 1655, 3313, 2996, 1557, 2616, 19031, 25185, 25376, 22534, +18331, 14935, 14908, 3154, -7076, -3775, -3912, -3576, -4899, -6777, -7224, -5711, -5127, -4985, -4591, -5643, +-18190, -17056, -13343, -10987, -8760, -7827, -6942, -5546, -3542, -1576, 830, 2822, 3377, 2996, 661, 9576, +24313, 25118, 24872, 20498, 16685, 14770, 11533, -4433, -5256, -3521, -3520, -4174, -5828, -7167, -6046, -4941, +-4569, -5394, -3941, -14912, -19628, -14287, -11989, -9038, -8272, -7659, -6799, -4661, -2628, 129, 2311, 3552, +3283, 2115, 2673, 18698, 25660, 25384, 22930, 18808, 14989, 14990, 3486, -7097, -3541, -3750, -3743, -5111, +-6635, -6584, -5160, -4326, -5455, -4271, -10670, -21426, -16411, -13474, -9708, -8316, -7924, -7641, -6153, -3448, +-1024, 1722, 3401, 3537, 3227, 1060, 9730, 24633, 25515, 25001, 20988, 17260, 14840, 11881, -4092, -5418, +-3392, -3692, -4409, -5795, -6756, -5641, -4174, -4535, -4874, -6630, -20381, -19330, -15115, -11437, -8243, -7802, +-7672, -7432, -4864, -2059, 737, 2996, 4053, 3477, 2565, 3182, 18973, 26086, 25730, 23174, 19466, 15302, +15053, 4317, -6899, -3478, -3588, -3941, -5280, -6441, -6236, -4599, -3623, -5015, -4292, -16511, -22194, -16715, +-13964, -9338, -7535, -7516, -7735, -6758, -3515, -621, 2155, 3870, 3733, 3617, 1806, 10277, 25066, 26144, +25345, 20991, 17572, 14861, 12230, -3608, -5606, -3473, -3941, -4894, -6053, -6593, -5507, -3459, -4502, -3758, +-10677, -23206, -19116, -16066, -11709, -8150, -7305, -7389, -7597, -5527, -2056, 879, 3159, 4049, 3592, 3014, +4456, 20508, 26444, 26163, 23237, 19207, 15525, 15045, 5604, -6772, -3671, -3958, -4431, -5956, -6654, -6537, +-4618, -3328, -4053, -5449, -20279, -22019, -17623, -14597, -9871, -7250, -7056, -7327, -7201, -4054, -438, 2013, +3856, 3646, 4085, 2400, 13001, 25861, 26008, 25370, 20725, 17612, 14370, 13455, -1766, -5970, -3342, -4394, +-5310, -6787, -6769, -5837, -3397, -3904, -3075, -13998, -23997, -19382, -16855, -12381, -8358, -6957, -6880, -7215, +-5943, -2284, 972, 3270, 4019, 4026, 3400, 6411, 22594, 26234, 26358, 23077, 19131, 15329, 14688, 8243, +-6163, -3782, -4068, -4804, -6439, -6934, -6382, -4499, -3313, -2790, -7160, -22575, -21732, -18504, -14810, -10406, +-7520, -7021, -6876, -6904, -4457, -631, 1849, 3878, 3542, 4264, 3297, 15654, 26339, 26008, 25415, 20725, +17614, 13733, 14431, 498, -6197, -3162, -4907, -5801, -7332, -6686, -5655, -3560, -3201, -2727, -16987, -23789, +-19759, -17244, -12673, -8893, -7316, -6876, -6638, -5704, -2579, 520, 2875, 3734, 4020, 3327, 9048, 24244, +26027, 26436, 22988, 19106, 15105, 13793, 10563, -5255, -4135, -4225, -5463, -7272, -7693, -6484, -4737, -3875, +-2063, -9007, -23531, -21393, -19173, -15447, -11072, -8037, -7434, -6966, -6171, -4345, -987, 1504, 3323, 3623, +3773, 4882, 19684, 26270, 26273, 25068, 20663, 17543, 13009, 14341, 3568, -6352, -3191, -5275, -6322, -8030, +-7107, -5610, -4156, -3348, -3046, -18486, -23372, -19938, -18004, -13639, -9648, -8049, -7558, -6601, -5285, -2790, +75, 2193, 3148, 4051, 3243, 13701, 25389, 25859, 26087, 22723, 19070, 15120, 12865, 12371, -3055, -4491, +-3898, -5919, -7864, -8268, -6802, -4776, -4402, -1796, -10217, -23525, -20759, -19444, -15944, -11651, -8757, -8025, +-7499, -6036, -4243, -1334, 1074, 2343, 3647, 3254, 8088, 22880, 25504, 26378, 24433, 20634, 17070, 12740, +14087, 6670, -5790, -3193, -5165, -6799, -8714, -7569, -5804, -4586, -3555, -3890, -19547, -22383, -19715, -17987, +-13794, -9860, -8326, -8043, -6944, -4961, -2741, 40, 1533, 2624, 3729, 4214, 18425, 25250, 25892, 25670, +22321, 18728, 14981, 12353, 13607, -383, -4946, -3600, -6124, -8179, -8592, -7155, -5135, -5010, -2509, -12058, +-23057, -20103, -19286, -15992, -11734, -9121, -8379, -7888, -6040, -3759, -1151, 1059, 1607, 3556, 2949, 12419, +24625, 24831, 26241, 23663, 20493, 16750, 12740, 13313, 9027, -4796, -3599, -5165, -7292, -9106, -7975, -6283, +-5337, -4201, -5788, -20342, -21189, -19388, -17876, -14068, -10434, -8940, -8393, -7520, -5173, -2513, 197, 1283, +2282, 2832, 6620, 22069, 24691, 25822, 25066, 22169, 18423, 14819, 11773, 13692, 2563, -5205, -3549, -6474, +-8538, -8879, -7465, -5944, -5823, -3471, -14078, -22512, -19453, -18993, -15859, -12037, -9731, -8664, -8227, -6802, +-3840, -922, 1204, 1537, 2537, 3445, 17808, 24782, 24754, 25890, 23276, 20051, 16142, 12746, 12245, 11486, +-2688, -4284, -5032, -7849, -9206, -8387, -7103, -6565, -4982, -7220, -20982, -20595, -19269, -17367, -13793, -10665, +-9279, -8539, -7800, -5528, -2194, 619, 1179, 1960, 1499, 12466, 24318, 24103, 25913, 24357, 21515, 17761, +14478, 11494, 13482, 6610, -5150, -4026, -7107, -8844, -9013, -8037, -7013, -6890, -4448, -14912, -22342, -19245, +-18776, -15493, -12172, -10074, -8922, -8140, -7047, -4190, -532, 1064, 1676, 750, 7007, 22295, 23712, 25122, +24901, 22555, 19089, 15398, 12786, 11406, 13425, 365, -5297, -5263, -8746, -9184, -8774, -7864, -7709, -5989, +-8249, -21237, -20507, -19305, -16923, -13637, -10927, -9593, -8571, -7674, -6147, -2345, 559, 1557, 1171, 2599, +18440, 23605, 24169, 25329, 23565, 20472, 16894, 13905, 11472, 12950, 10490, -4230, -4795, -7495, -9223, -9073, +-8727, -8008, -7965, -5580, -15708, -22378, -19368, -18309, -14936, -12173, -10220, -9344, -8150, -7409, -4753, -616, +971, 1752, 128, 13401, 22948, 22810, 25234, 24143, 21530, 17997, 14654, 12417, 10806, 14442, 4137, -6060, +-5664, -9339, -9196, -9192, -8687, -8562, -7054, -8727, -21339, -20530, -18839, -16255, -13265, -11017, -9884, -8748, +-7797, -6436, -2182, 308, 2039, -340, 8562, 21753, 21593, 24487, 24588, 22594, 19138, 15730, 13028, 11208, +12577, 12668, -3009, -5983, -8280, -9913, -9197, -9320, -8839, -9120, -6389, -15161, -22547, -19116, -17825, -14400, +-12231, -10638, -9472, -8073, -7553, -4214, -577, 1600, 380, 4448, 19592, 20832, 22781, 24633, 23363, 20134, +16651, 13646, 12072, 11044, 14947, 6217, -6564, -6578, -9860, -9147, -9318, -9445, -9419, -8239, -8598, -20837, +-20726, -18122, -15476, -12885, -11404, -10187, -8616, -7984, -6063, -2173, 670, 1084, 1647, 16506, 20343, 20999, +23909, 23751, 21033, 17496, 14392, 12230, 11489, 12616, 13930, -1660, -7483, -8683, -9981, -9259, -9950, -9604, +-9997, -7180, -14559, -22929, -18795, -16930, -13759, -12064, -10960, -9444, -8295, -7268, -3830, -734, 1393, 464, +13122, 19994, 19574, 22702, 24009, 22010, 18572, 15372, 12824, 11971, 11660, 14748, 8310, -6879, -7808, -10051, +-9424, -9688, -10022, -10095, -9332, -8522, -20454, -21036, -17424, -15096, -12469, -11680, -10483, -8950, -8430, -5727, +-2431, 657, -677, 10250, 19191, 18065, 20957, 22990, 22411, 19115, 15809, 13117, 11666, 12043, 12679, 14334, +-665, -9208, -9312, -10579, -9645, -10365, -10275, -10556, -8043, -12764, -22590, -18141, -15924, -13108, -12051, -11233, +-9552, -8896, -6595, -3891, -30, -865, 7782, 18988, 17302, 19647, 21886, 22664, 19910, 16609, 13648, 11857, +12041, 12553, 14331, 9034, -7747, -9198, -10487, -10173, -10105, -10716, -10389, -10254, -8005, -18189, -21196, -16342, +-14530, -12345, -12224, -10656, -9905, -7989, -5478, -1931, -1685, 4670, 18000, 16858, 18123, 20262, 21723, 19992, +16753, 13691, 12035, 11414, 12670, 12567, 14215, -59, -9969, -9092, -10400, -9479, -10491, -10321, -10216, -8551, +-10112, -21020, -17744, -15210, -13080, -12473, -11504, -10345, -8984, -6507, -3468, -2289, 1926, 16604, 17157, 17235, +18927, 20469, 19894, 17121, 13901, 11896, 11206, 11981, 12420, 13351, 9322, -7873, -9341, -10166, -10035, -10047, +-10890, -10071, -10330, -7243, -14846, -20797, -15834, -14455, -12658, -12247, -11017, -10065, -7589, -5168, -3322, -467, +14471, 17187, 16436, 17662, 19144, 19217, 17415, 14528, 12063, 11375, 11327, 12863, 11971, 13513, 593, -10296, +-8907, -10325, -9809, -10682, -10464, -10177, -9167, -7948, -19130, -18200, -15074, -13602, -12620, -11814, -10884, -8726, +-6501, -4317, -2487, 12072, 17194, 15960, 16603, 17588, 18170, 17223, 14985, 12231, 11064, 10989, 12075, 12407, +12488, 9779, -7277, -9352, -9669, -10100, -10400, -10787, -10026, -10277, -7151, -11773, -20243, -15926, -14547, -13019, +-12638, -11775, -9877, -7863, -5476, -4383, 9368, 16954, 15712, 16217, 16399, 17315, 16788, 15460, 12623, 10928, +10885, 11214, 12705, 11395, 13064, 1738, -10134, -8645, -10149, -10089, -10553, -10474, -9977, -9506, -6453, -16062, +-18897, -14827, -14093, -12949, -12621, -11117, -9154, -6681, -5995, 7625, 16581, 15156, 15885, 15397, 16215, 15940, +15558, 13227, 11046, 10573, 10815, 11965, 11932, 11700, 9715, -6893, -9472, -9625, -10577, -10674, -10697, -10372, +-9828, -7735, -7699, -18780, -16498, -14597, -13710, -13235, -12232, -10501, -7832, -7394, 5771, 16126, 14414, 15218, +14586, 14927, 14870, 14851, 13529, 11184, 10248, 10593, 11261, 12406, 10752, 12442, 1207, -10414, -9002, -10869, +-10825, -10895, -10968, -10016, -9624, -5854, -10987, -18955, -14945, -14710, -13588, -13240, -11760, -8901, -8566, 3763, +15456, 14003, 14628, 14152, 13946, 13802, 13985, 13384, 11424, 10095, 10238, 10913, 11979, 11397, 11408, 9362, +-7041, -9514, -10275, -11088, -11136, -11125, -10912, -9438, -8483, -5008, -14719, -17694, -14831, -14554, -13692, -13265, +-10079, -9615, 1732, 14632, 13631, 14101, 13741, 13444, 12975, 13205, 12972, 11766, 10187, 9955, 10661, 11397, +11806, 10245, 12260, 991, -10627, -9433, -11542, -11285, -11538, -11349, -10109, -9247, -6726, -6203, -17385, -16150, +-14926, -14388, -14365, -11377, -10401, 235, 13539, 13008, 13489, 13203, 13067, 12136, 12294, 12206, 11552, 10371, +9719, 10071, 10975, 11242, 10627, 11108, 8952, -8063, -10346, -11138, -11839, -11867, -11864, -10978, -9284, -8811, +-4089, -9395, -18045, -14875, -15015, -15033, -12803, -11504, -553, 12449, 11990, 12940, 12584, 12504, 11530, 11305, +11285, 10995, 10401, 9727, 9720, 10734, 10721, 10902, 9907, 12172, -592, -11465, -10507, -12358, -12015, -12605, +-11518, -10512, -9080, -7022, -3110, -13491, -17235, -14877, -16222, -13689, -12736, -1007, 11795, 11154, 12266, 12025, +11996, 11194, 10515, 10597, 10253, 10051, 9882, 9619, 10313, 10314, 10279, 10119, 11351, 7511, -9555, -11002, +-12180, -12492, -13055, -12325, -11161, -9862, -8102, -4501, -4360, -16610, -15955, -16518, -14552, -13534, -1760, 11038, +10064, 11331, 11351, 11412, 10852, 9868, 9516, 9438, 9494, 9901, 9623, 9754, 10186, 9532, 10256, 9764, +11217, -3071, -12674, -11742, -13356, -13340, -13343, -11949, -10868, -8592, -6969, -1899, -8266, -17851, -16293, -15413, +-14230, -2663, 10128, 9301, 10706, 10794, 10972, 10466, 9516, 8876, 8771, 8900, 9576, 9876, 9683, 10040, +9414, 10037, 9973, 10876, 5357, -11500, -12237, -13531, -13857, -13838, -12754, -11053, -9768, -7500, -4621, -1612, +-13392, -18011, -15096, -15270, -3837, 8866, 8309, 9637, 9981, 10417, 10085, 9295, 8273, 7977, 8271, 9153, +9870, 9475, 9581, 9313, 9332, 10312, 9364, 9409, -6997, -13812, -13201, -14558, -14213, -13661, -11550, -10297, +-8397, -5900, -2223, -4862, -17856, -15135, -15420, -5151, 7885, 7335, 8844, 9289, 10122, 9839, 9119, 7950, +7308, 7691, 8540, 9732, 9569, 9556, 9528, 9245, 10239, 8887, 9972, -238, -14442, -13348, -14942, -14764, +-14446, -12264, -10796, -9564, -6328, -4909, -1028, -10714, -16663, -14870, -6898, 7027, 6101, 7836, 8392, 9526, +9410, 8743, 7535, 6625, 6925, 7779, 9222, 9438, 9338, 9383, 9155, 9368, 9169, 8499, 5583, -11736, +-14654, -14564, -15456, -14953, -12984, -11532, -10064, -7501, -5480, -2891, -2207, -13506, -15677, -7646, 5979, 5314, +6685, 7808, 9154, 9206, 8617, 7233, 6166, 6286, 7321, 8887, 9483, 9397, 9395, 9184, 8661, 9223, +7264, 7700, -5747, -16155, -14331, -16342, -15620, -13901, -12325, -10563, -8461, -6202, -4717, -574, -4562, -16149, +-8446, 4853, 4801, 5651, 7074, 8656, 8707, 8170, 6797, 5790, 5785, 6966, 8401, 9295, 9416, 9238, +9125, 8076, 8619, 7272, 6797, 956, -15557, -15092, -16356, -16229, -14484, -12813, -11053, -8878, -7403, -5131, +-2574, 1892, -10408, -11035, 4669, 3992, 4874, 6095, 7992, 8275, 7913, 6387, 5463, 5497, 6707, 8014, +9094, 9605, 9342, 8921, 7662, 7562, 7447, 5066, 4662, -11462, -17095, -16280, -17292, -15391, -13745, -11746, +-9774, -8281, -6303, -3295, 1380, -1101, -11130, 3203, 3715, 3861, 5305, 7218, 7947, 7626, 6138, 5339, +5470, 6644, 7774, 8897, 9593, 9469, 8782, 7459, 6956, 7262, 4550, 5053, -4654, -17864, -16368, -17496, +-16012, -14468, -12209, -10516, -8882, -7371, -3304, -284, 3086, -5597, -113, 4151, 2774, 4980, 6275, 7526, +7215, 5741, 4962, 5218, 6415, 7487, 8582, 9317, 9459, 8380, 6908, 6302, 6232, 4916, 3522, 1062, +-15376, -17655, -17152, -17032, -15130, -12863, -11039, -9619, -7743, -3978, -652, 1865, 918, 483, 3391, 2965, +4545, 5649, 6904, 6794, 5585, 4998, 5229, 6528, 7439, 8475, 9188, 9406, 8128, 6605, 6177, 5538, +5233, 2349, 3200, -9565, -19087, -16635, -17791, -15660, -13614, -11606, -10346, -8275, -4727, -1058, 621, 2061, +6234, 2233, 3014, 3896, 5051, 6114, 6235, 5358, 4906, 5202, 6415, 7318, 8054, 8727, 9192, 7671, +5987, 5538, 4953, 4796, 2225, 2202, -3027, -18363, -17163, -17865, -16254, -14160, -12301, -10855, -8834, -5035, +-2122, 716, -355, 11001, 6260, 1545, 4307, 4053, 5536, 5301, 5192, 4878, 5416, 6424, 7408, 7853, +8396, 8766, 7035, 5538, 4858, 4491, 3901, 2397, 383, 681, -14075, -18746, -17278, -16976, -14616, -13205, +-11455, -9436, -5517, -2862, 210, -1548, 8864, 13874, 1263, 4312, 3525, 4998, 4708, 5087, 5076, 5587, +6459, 7446, 7704, 7961, 8299, 6691, 5343, 4599, 4200, 3370, 2221, -369, 897, -7984, -19276, -16955, +-17070, -14960, -13715, -11860, -9472, -5920, -3182, -909, -1363, 3963, 18533, 5580, 2679, 3890, 4150, 4316, +4867, 5311, 5684, 6460, 7534, 7562, 7558, 7543, 5946, 4843, 4060, 3589, 2862, 1476, -385, -685, +-2637, -17570, -17631, -16572, -15468, -14239, -12504, -9564, -6318, -3604, -1818, -1321, 541, 17713, 13589, 1951, +4002, 3552, 3997, 4772, 5712, 6046, 6754, 7695, 7611, 7443, 6971, 5509, 4582, 3796, 3266, 2533, +811, -283, -2231, 332, -13151, -18780, -15936, -16075, -14664, -13143, -9725, -6802, -4457, -2730, -1821, -1135, +13673, 19818, 5605, 2752, 3489, 3273, 4676, 5805, 6343, 6932, 7681, 7383, 7092, 6101, 4763, 4136, +3283, 2635, 1967, 342, -691, -2754, 432, -7225, -18941, -15721, -16212, -15054, -13589, -9870, -7216, -5221, +-3663, -2112, -2267, 9931, 21285, 12925, 2271, 3358, 2831, 4621, 6022, 6661, 7197, 7665, 7221, 6880, +5421, 4075, 3734, 2901, 2208, 1338, 70, -1469, -2663, -1065, -2276, -16470, -16313, -15857, -15684, -14053, +-10269, -7711, -6027, -4591, -2502, -3309, 5590, 19443, 18391, 5538, 2097, 3355, 4542, 6385, 6925, 7433, +7701, 7248, 6664, 4883, 3552, 3336, 2534, 1747, 923, -65, -2126, -2300, -2146, 341, -11654, -17196, +-15147, -16019, -14158, -10637, -8000, -6604, -5302, -3345, -3260, 1676, 16857, 20317, 11734, 1341, 3799, 4543, +6633, 7211, 7704, 7816, 7254, 6438, 4371, 3153, 2941, 2114, 1200, 422, -439, -2602, -2348, -2754, +544, -5842, -17517, -15155, -16242, -14223, -11077, -8519, -7250, -5890, -4536, -2919, -1532, 13636, 19655, 17422, +3626, 2963, 5018, 6295, 7486, 7885, 7768, 7267, 6089, 4072, 3031, 2565, 1806, 846, 282, -607, +-2681, -2556, -2493, -495, -666, -15520, -15912, -15867, -14421, -11416, -9131, -7839, -6651, -5651, -2852, -3154, +9571, 18819, 19581, 9590, 1884, 5560, 5882, 7685, 7893, 7669, 7160, 5722, 3617, 2604, 1935, 1293, +383, -94, -1084, -2896, -3025, -2233, -1498, 2061, -11083, -17163, -15325, -14601, -11812, -9914, -8324, -7370, +-6405, -3469, -3203, 4748, 18292, 18897, 16220, 3537, 5349, 6237, 7787, 8312, 7682, 7197, 5308, 3207, +2354, 1384, 769, -22, -448, -1404, -2923, -3177, -2167, -1654, 2373, -5302, -17627, -15175, -14570, -12359, +-10684, -8847, -8147, -7045, -4479, -2897, 364, 16344, 17640, 19497, 8999, 4092, 6971, 7519, 8546, 7493, +7056, 4927, 2881, 2062, 909, 195, -492, -1041, -1887, -2870, -3232, -2289, -1007, 1317, -151, -15900, +-15780, -13975, -12917, -11271, -9378, -8762, -7611, -5488, -2640, -2037, 12688, 17706, 19063, 16329, 4674, 7127, +7607, 8603, 7549, 6779, 4559, 2649, 1795, 575, -214, -881, -1562, -2274, -2838, -3290, -2532, -546, +98, 2528, -12193, -16851, -13375, -13598, -11784, -10114, -9496, -8223, -6063, -2807, -2726, 6260, 17761, 17718, +21041, 8591, 6562, 8422, 8285, 7806, 6522, 4337, 2560, 1624, 497, -458, -1098, -1920, -2595, -2629, +-2980, -2194, 17, -91, 3249, -7475, -17079, -12996, -13849, -12228, -10854, -10041, -8867, -6376, -3760, -2184, +621, 15286, 17596, 22063, 15253, 6402, 8990, 7981, 7984, 6338, 4176, 2591, 1372, 429, -643, -1431, +-2385, -2916, -2459, -2747, -1927, -12, 127, 2513, -2822, -16186, -13366, -13697, -12742, -11632, -10645, -9356, +-6739, -4691, -1635, -2480, 10054, 18545, 20658, 21547, 8766, 8703, 8304, 7790, 6332, 4099, 2663, 1262, +456, -789, -1789, -2866, -3336, -2596, -2382, -1537, -226, 617, 1113, 540, -13685, -14521, -13244, -13230, +-12301, -11437, -9916, -7446, -5260, -2049, -3057, 3735, 18294, 19569, 24678, 14252, 7846, 8762, 7238, 6264, +3869, 2613, 1196, 497, -748, -2110, -3343, -3615, -2635, -1760, -766, -196, 1259, 272, 2245, -9314, +-15573, -12686, -13471, -12676, -12190, -10210, -8037, -5418, -2933, -2354, -1379, 14909, 20107, 24404, 20888, 8459, +8864, 7007, 6052, 3922, 2610, 1304, 505, -701, -2392, -3781, -4056, -2928, -1272, -233, -224, 1238, +-230, 2099, -5063, -15993, -12657, -13605, -13299, -12984, -10777, -8688, -5775, -3809, -1966, -3395, 7807, 20768, +23093, 25573, 11605, 8430, 7263, 5651, 4182, 2606, 1632, 697, -472, -2528, -4055, -4266, -2878, -534, +665, 410, 1320, 76, 1451, -759, -14805, -12985, -13244, -13725, -13590, -11441, -8882, -6167, -4166, -2635, +-2775, 745, 18411, 22841, 27194, 17056, 7710, 7337, 5129, 4278, 2546, 1844, 670, -621, -2793, -4599, +-4822, -3195, -314, 1144, 803, 784, 167, 410, 2034, -12154, -13963, -12807, -14257, -14187, -12281, -9007, +-6613, -4361, -3380, -1736, -2599, 12449, 23715, 26572, 23332, 8790, 7306, 5142, 4426, 2751, 2218, 1172, +-265, -2533, -4563, -4793, -3052, 104, 1729, 1481, 681, 486, -171, 3277, -8364, -14771, -12441, -14615, +-14676, -13207, -9391, -7013, -4926, -3755, -2130, -2585, 4787, 22407, 25519, 27215, 12025, 6154, 5289, 3773, +2757, 2193, 1267, -510, -2629, -4724, -5076, -3158, 60, 2025, 2092, 758, 514, -183, 3321, -3894, +-14771, -12260, -14564, -15044, -13821, -9720, -6930, -5231, -3544, -2793, -1063, -265, 16365, 25961, 28482, 17385, +5805, 5863, 3634, 3153, 2597, 1930, -168, -2310, -4495, -5010, -3025, 188, 2408, 2804, 1128, 428, +-49, 2436, -403, -13919, -12796, -14374, -15672, -14529, -10479, -7347, -5528, -3811, -3206, -1097, -645, 7517, +24244, 28593, 22274, 6583, 5721, 3574, 3094, 2854, 2351, 104, -2093, -4284, -4965, -2986, 277, 2710, +3408, 1959, 584, 541, 1753, 2488, -11659, -13387, -13739, -15945, -14791, -11026, -7751, -5382, -3958, -3098, +-1663, 880, 1956, 17966, 28711, 25785, 9385, 4967, 3793, 2728, 3108, 2638, 427, -1867, -4046, -4923, +-3167, 97, 2713, 3672, 2613, 629, 715, 1002, 3836, -8514, -14218, -13317, -16285, -15175, -11879, -8451, +-5675, -4040, -3227, -1970, 941, 1247, 9575, 26474, 28504, 13696, 4516, 4230, 2563, 3539, 3095, 973, +-1446, -3750, -4685, -3143, -44, 2838, 3896, 3336, 1089, 942, 777, 4230, -4688, -14506, -13072, -16304, +-15461, -12615, -9060, -5795, -3971, -3489, -1975, 278, 2237, 4058, 18850, 29207, 17884, 5022, 4116, 2504, +3636, 3410, 1461, -1029, -3347, -4471, -3348, -348, 2701, 3963, 3961, 2049, 1043, 939, 3789, -849, +-13789, -12977, -15888, -15697, -13129, -9790, -6269, -3934, -3119, -2051, 275, 2225, 3971, 9569, 27189, 22655, +6315, 4363, 2658, 3937, 3954, 2252, -187, -2750, -3876, -3153, -442, 2842, 4142, 4379, 3085, 1200, +1128, 2824, 2165, -12038, -13542, -15391, -16070, -13879, -10561, -6754, -4176, -2989, -2180, 46, 1519, 4358, +5426, 17606, 26514, 8215, 4284, 2716, 3704, 4243, 2728, 600, -2097, -3478, -3051, -680, 2539, 4198, +4618, 3933, 1670, 1552, 2149, 4245, -9174, -14102, -14552, -16012, -14186, -11169, -7152, -4180, -2742, -1825, +-323, 1823, 3633, 6331, 8598, 24201, 12940, 3827, 3609, 3471, 4739, 3270, 1571, -1227, -2833, -2818, +-859, 2305, 4284, 4778, 4633, 2383, 1897, 1668, 4972, -5512, -14543, -14007, -16061, -14705, -11949, -7919, +-4599, -2878, -1670, -691, 1421, 2945, 6467, 5844, 15572, 16903, 3922, 4172, 3236, 5010, 3738, 2377, +-204, -2104, -2517, -1028, 1901, 4267, 5052, 5098, 3216, 2290, 1666, 4979, -1618, -14399, -13782, -15757, +-15081, -12648, -8520, -4961, -2844, -1458, -537, 899, 3084, 5363, 6962, 8611, 14903, 6275, 3962, 3594, +4674, 4273, 3026, 692, -1374, -2261, -1166, 1490, 4069, 5261, 5284, 3985, 2579, 1998, 4298, 1873, +-13246, -14098, -15297, -15486, -13263, -9305, -5334, -2715, -1310, -345, 608, 2832, 4791, 7010, 7521, 8809, +6977, 4422, 3686, 4506, 4656, 3720, 1702, -383, -1607, -1018, 1133, 3764, 5440, 5522, 4754, 3128, +2609, 3684, 4659, -10674, -14486, -14681, -15786, -13852, -10055, -5795, -2805, -1210, -330, 606, 2489, 4507, +6187, 8202, 5779, 900, 5712, 3700, 4499, 4718, 4476, 2805, 680, -860, -847, 798, 3270, 5435, +5659, 5275, 3552, 3212, 3158, 6235, -6559, -15027, -13913, -15820, -14360, -11029, -6475, -2962, -1212, -172, +566, 2348, 3866, 6101, 7146, 8252, -5178, 1344, 5552, 3821, 5155, 4759, 3991, 1801, 157, -575, +565, 2793, 5309, 6002, 5678, 4121, 3676, 3435, 6566, -1906, -15020, -13764, -15615, -14825, -12022, -7486, +-3395, -1220, -181, 565, 2247, 3394, 5640, 6564, 9279, -3307, -8675, 5441, 3787, 5234, 5001, 4821, +2905, 1097, -69, 427, 2405, 4930, 6184, 6125, 4875, 3988, 4093, 6207, 2451, -13525, -14011, -15063, +-15069, -12726, -8477, -4069, -1285, -125, 670, 2178, 3435, 5082, 6651, 8790, 1518, -13385, -2471, 5124, +4630, 5544, 5243, 4099, 2072, 627, 520, 2159, 4591, 6396, 6463, 5547, 4148, 4736, 5620, 5771, +-10449, -14811, -14322, -15275, -13295, -9377, -4796, -1469, -47, 764, 2030, 3331, 4799, 6278, 8694, 3944, +-10947, -11894, 796, 5699, 5408, 6065, 4908, 3294, 1520, 835, 2143, 4276, 6362, 6865, 6226, 4534, +5347, 5445, 7643, -5509, -15440, -13760, -15355, -13672, -10274, -5726, -1957, -93, 742, 1944, 3303, 4710, +6132, 8306, 5822, -9005, -12846, -10005, 4291, 5912, 6411, 5784, 4327, 2567, 1248, 2136, 3987, 6213, +7209, 6910, 5204, 5558, 5848, 8035, 327, -14831, -13741, -14970, -14060, -10996, -6696, -2689, -269, 633, +1680, 3234, 4361, 6094, 7814, 7758, -7584, -11336, -14269, -5965, 6996, 6376, 6804, 5119, 3710, 1878, +2238, 3889, 5891, 7379, 7423, 6061, 5747, 6743, 7603, 5286, -12168, -14421, -14409, -14395, -11630, -7647, +-3392, -569, 612, 1500, 3176, 4368, 6004, 7577, 8704, -5054, -11702, -11984, -14631, 55, 8108, 6817, +6304, 4437, 2943, 2407, 3927, 5806, 7278, 7716, 6797, 5886, 7418, 7321, 8377, -7240, -15204, -13764, +-14700, -12140, -8567, -4295, -1201, 516, 1361, 2838, 4303, 5868, 7297, 9833, -2628, -11399, -11269, -14423, +-11389, 4775, 8060, 6615, 5478, 3649, 2825, 3833, 5636, 7157, 7913, 7585, 6405, 7792, 7701, 9429, +-1188, -15033, -13517, -14704, -12465, -9303, -5090, -1621, 297, 1392, 2555, 4295, 6011, 6882, 10539, 682, +-10966, -10738, -13303, -14075, -7756, 7715, 7389, 6143, 4370, 3096, 3730, 5534, 6972, 7800, 7854, 7022, +7795, 8486, 9225, 4882, -12710, -13891, -14298, -13128, -9795, -5958, -2212, -80, 1215, 2305, 3952, 6070, +6895, 10546, 4630, -9837, -9950, -12943, -12820, -13173, -3095, 9139, 6542, 5599, 3522, 3991, 5594, 7001, +7814, 8096, 7643, 7836, 9431, 8927, 9015, -7776, -14817, -13540, -13913, -10328, -6700, -2798, -472, 806, +1937, 3539, 5901, 6967, 9850, 7628, -7905, -10064, -11647, -13617, -11921, -11458, 846, 8650, 5441, 4395, +3677, 5592, 6925, 7926, 8112, 8042, 7827, 9579, 9105, 10643, -1018, -14924, -13178, -14291, -11151, -7359, +-3347, -822, 467, 1596, 3202, 5493, 7306, 9349, 10083, -5087, -9735, -10738, -12781, -12570, -10521, -9591, +3641, 7415, 4513, 4235, 5456, 7216, 8111, 8518, 8442, 8317, 9571, 10022, 10684, 5494, -12517, -13644, +-14034, -12203, -7999, -3849, -1039, 132, 1074, 2771, 4927, 7366, 8694, 11549, -1626, -9533, -9630, -12293, +-12493, -10823, -9882, -7830, 5400, 5699, 4109, 5217, 7194, 8291, 8905, 8719, 8631, 9385, 10870, 10418, +10265, -7118, -14388, -13198, -13317, -9170, -4617, -1131, 46, 803, 2329, 4300, 7090, 8343, 12091, 3333, +-8852, -8664, -11465, -12042, -11480, -9022, -10211, -5576, 6299, 4344, 4932, 6853, 8401, 9201, 8983, 8714, +8994, 10811, 10549, 12004, 656, -14307, -13117, -14129, -10767, -6105, -1717, 112, 468, 1573, 3467, 6275, +8037, 11440, 7786, -7143, -8348, -10406, -12063, -11402, -9955, -8432, -11170, -3065, 6089, 4155, 6748, 8140, +9478, 9730, 9192, 9120, 10539, 11544, 11967, 8052, -10540, -13484, -13917, -12110, -7569, -2495, 304, 662, +1123, 2882, 5389, 7879, 10396, 11198, -3743, -8242, -9157, -11307, -11576, -9812, -8939, -9067, -11690, -573, +5606, 5546, 8242, 9173, 10316, 9579, 9109, 9784, 11999, 11714, 12236, -3913, -13990, -13444, -13392, -9066, +-4098, 161, 1006, 949, 2248, 4419, 7428, 9304, 12779, 590, -8000, -8089, -10472, -11108, -10050, -8690, +-8883, -10555, -11364, 1860, 5910, 7340, 9097, 10228, 10333, 9405, 9590, 11762, 12298, 13544, 4243, -12398, +-12928, -13919, -10343, -5814, -734, 1377, 1385, 1956, 3653, 6807, 8540, 12713, 5134, -7095, -7247, -9681, +-10594, -10215, -8544, -8742, -9619, -12657, -9860, 4506, 7002, 8672, 10051, 10868, 9833, 9453, 11057, 12911, +13249, 10663, -7845, -13042, -13449, -11903, -7344, -2347, 1188, 1867, 2167, 3423, 6042, 8093, 11766, 9165, +-5087, -6550, -8666, -10049, -9843, -8568, -7994, -9461, -10590, -14098, -6365, 7379, 7999, 10016, 10946, 10684, +9682, 10327, 12800, 12968, 13903, -458, -12823, -12553, -12948, -8737, -4243, 131, 1946, 2396, 3260, 5217, +7664, 10197, 11834, -1988, -6322, -7486, -9700, -9778, -8447, -7861, -8659, -10705, -12153, -14286, -788, 9145, +9036, 11319, 11094, 10195, 10071, 12242, 13391, 14528, 7788, -10055, -11872, -12660, -9880, -5742, -1267, 1569, +2694, 3503, 4778, 7371, 8879, 12891, 2619, -5966, -5950, -9007, -9470, -8451, -7355, -8132, -9886, -11848, +-13770, -11398, 5305, 9309, 10335, 11487, 10331, 10044, 11243, 13501, 13686, 13251, -4044, -12259, -11868, -11261, +-7273, -3031, 337, 2077, 3390, 4466, 6701, 7952, 11881, 7037, -5376, -5289, -8000, -9215, -8620, -7161, +-7519, -9115, -11622, -12727, -14436, -5732, 9111, 9702, 11707, 10934, 10423, 11000, 13363, 13663, 14948, 4587, +-11218, -11002, -11437, -8270, -4513, -793, 1317, 3027, 4709, 6355, 7909, 10306, 10371, -3159, -5165, -6551, +-8660, -8554, -7177, -6772, -8588, -10766, -13054, -13117, -13128, 1007, 10602, 10711, 11839, 10382, 11011, 12591, +14014, 14247, 11437, -7001, -11272, -10710, -9135, -5650, -2227, 302, 2184, 4567, 6186, 7977, 8954, 11834, +335, -5659, -5161, -7849, -8219, -7359, -6380, -7593, -10079, -12367, -13245, -12904, -9329, 6780, 11023, 11680, +11146, 11070, 12259, 14237, 13821, 14660, 680, -11438, -9804, -9479, -6382, -3489, -871, 973, 3710, 6101, +8194, 8699, 11702, 4916, -5939, -4707, -7066, -7695, -7413, -6458, -6842, -9148, -11640, -13477, -12532, -12688, +-3122, 10429, 10826, 11403, 10687, 11908, 13516, 14050, 14376, 9150, -8664, -9940, -9241, -7136, -4466, -2068, +-176, 2294, 5454, 8079, 9089, 10666, 9285, -4350, -5376, -6071, -7299, -6934, -6371, -6474, -7888, -10578, +-12678, -13187, -11660, -10641, 4075, 11532, 10989, 11004, 11646, 13006, 14414, 13443, 13904, -1659, -10898, -8476, +-7714, -4844, -2987, -1282, 757, 4116, 7249, 9516, 9775, 11597, -427, -6830, -5619, -7255, -6608, -6168, +-6367, -7333, -9514, -12054, -13319, -11836, -11611, -5917, 9450, 11123, 10980, 11524, 12917, 14324, 13676, 14145, +6966, -9807, -8561, -7565, -5022, -3256, -2083, -498, 2592, 6053, 9439, 10079, 12127, 4838, -7064, -5616, +-7011, -6313, -5698, -5892, -7064, -8577, -11127, -12820, -12648, -10540, -11127, 990, 11761, 10443, 11412, 12827, +14211, 14358, 12841, 12362, -4451, -9988, -6865, -5575, -3149, -2464, -1549, 952, 4729, 8306, 10585, 11693, +9725, -4922, -6649, -6769, -6697, -5321, -5440, -6808, -8325, -10240, -12347, -12863, -11118, -10611, -7942, 8050, +11111, 10588, 12796, 14302, 15132, 12902, 13536, 4164, -10133, -6806, -5716, -3119, -2369, -2072, -691, 3279, +6826, 10351, 11356, 12610, 483, -7858, -6486, -7419, -5388, -4928, -6133, -8077, -9713, -11678, -12717, -11978, +-9819, -11183, -613, 11327, 9647, 11870, 14077, 15313, 13973, 12109, 10623, -6103, -8658, -5400, -3665, -2003, +-2245, -1773, 1476, 5335, 9005, 11111, 12783, 6971, -7088, -7020, -7859, -6050, -4598, -5334, -7376, -9254, +-11019, -12343, -11974, -10326, -10120, -8528, 7333, 10560, 10690, 13976, 15646, 15551, 12077, 12369, 1898, -9749, +-5324, -3982, -1737, -1969, -2065, -62, 4012, 7422, 10763, 11892, 11436, -3085, -8210, -7859, -7235, -4922, +-4977, -6756, -8853, -10715, -12236, -12214, -11107, -9501, -11164, -1532, 10699, 9810, 13059, 15490, 16189, 13692, +11477, 8915, -6663, -7137, -3833, -1960, -1440, -2019, -953, 2629, 5977, 9814, 11354, 12883, 3458, -8341, +-7742, -8082, -5305, -4695, -5992, -8217, -10180, -11772, -12453, -11170, -10001, -10030, -8814, 6232, 10487, 11625, +15137, 16428, 15363, 11390, 11220, 592, -8973, -4118, -2585, -1039, -1771, -1421, 1261, 4680, 8101, 11035, +11962, 9255, -5659, -8605, -8539, -6711, -4799, -5662, -7470, -9662, -11461, -12555, -11480, -10419, -9363, -10791, +-1516, 10094, 10493, 14079, 16338, 16268, 13212, 10519, 8202, -6304, -6241, -2616, -1215, -1026, -1418, 423, +3536, 6363, 9919, 10791, 11470, 802, -8779, -7898, -7677, -5199, -5340, -6735, -7980, -10406, -13003, -11147, +-9409, -8911, -8918, -6981, 5527, 8902, 10573, 13130, 14019, 13442, 11077, 11276, 4757, -6137, -4126, -2814, +-1872, -330, 1393, 913, 2144, 6047, 8320, 9048, 6041, -4816, -6576, -6607, -5450, -5229, -5920, -6426, +-6903, -13502, -13143, -7373, -7548, -6591, -7133, -317, 6570, 7093, 9216, 10424, 11208, 11685, 11384, 12316, +1437, -5872, -3502, -3249, -1418, 432, 2318, 3124, 3689, 5484, 6463, 7054, 666, -4278, -4819, -4955, +-4772, -5353, -5643, -4442, -9407, -17425, -9347, -5169, -5349, -4765, -3300, 2991, 4366, 5339, 6644, 7875, +9624, 11456, 13197, 10844, -3864, -4955, -3975, -2682, 46, 2334, 3022, 2260, 2725, 4063, 5678, 4593, +-297, -2485, -3694, -3919, -4743, -4599, -3399, -3621, -16173, -16470, -4727, -3350, -2788, -2255, 146, 1916, +1893, 2836, 4753, 6527, 10381, 12410, 15292, 3448, -6596, -3749, -3831, -863, 1922, 2330, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29775, +29468, 29164, 28862, 28551, 28249, 27941, 27635, 27325, 27023, 26717, 26414, 26106, 25796, 25490, 25183, 24878, +24568, 24269, 23961, 23652, 23319, 21975, 23290, 1515, -23106, -21951, -23358, -23720, -24030, -24337, -24641, -24951, +-25252, -25557, -25863, -26172, -26483, -26788, -27094, -27393, -27701, -28009, -28316, -28625, -28934, -29236, -29541, -29832, +-29780, -28932, -25800, 10913, 28930, 29188, 29744, 29474, 29172, 28864, 28557, 28248, 27941, 27636, 27331, 27029, +26717, 26414, 26104, 25796, 25493, 25188, 24885, 24577, 24268, 23958, 23652, 23202, 22069, 21373, -798, -20666, +-22218, -23336, -23720, -24026, -24336, -24640, -24943, -25252, -25557, -25863, -26172, -26470, -26783, -27086, -27394, -27699, +-28010, -28317, -28622, -28926, -29230, -29537, -29844, -29848, -28787, -28616, 6968, 28058, 28877, 29754, 29477, 29170, +28867, 28559, 28251, 27944, 27638, 27335, 27025, 26722, 26415, 26108, 25799, 25494, 25190, 24882, 24581, 24271, +23963, 23657, 23051, 22693, 18106, 3486, -17306, -22009, -23119, -23720, -24022, -24332, -24635, -24940, -25247, -25553, +-25864, -26171, -26478, -26782, -27084, -27389, -27699, -28007, -28309, -28621, -28923, -29227, -29533, -29842, -29522, -29667, +-22848, 4925, 29225, 28421, 29794, 29475, 29177, 28864, 28556, 28251, 27950, 27643, 27340, 27030, 26721, 26416, +26106, 25808, 25499, 25189, 24887, 24577, 24269, 23962, 23662, 22955, 23045, 16829, 5330, -10990, -21724, -22778, +-23661, -24021, -24329, -24631, -24941, -25247, -25554, -25858, -26168, -26470, -26777, -27083, -27391, -27700, -28000, -28310, +-28615, -28920, -29226, -29536, -29843, -29149, -30347, -17225, 7735, 24175, 29537, 29380, 29484, 29178, 28867, 28561, +28256, 27950, 27638, 27342, 27034, 26724, 26417, 26111, 25808, 25503, 25197, 24889, 24582, 24272, 23967, 23663, +23085, 22510, 18988, 2851, -4506, -18270, -23287, -23337, -24022, -24321, -24630, -24937, -25246, -25552, -25861, -26165, +-26464, -26773, -27080, -27389, -27699, -28002, -28309, -28611, -28915, -29225, -29533, -29929, -28674, -30770, -10915, 9314, +19259, 30784, 29065, 29485, 29174, 28867, 28564, 28261, 27955, 27650, 27340, 27030, 26724, 26423, 26118, 25808, +25504, 25195, 24888, 24582, 24276, 23974, 23666, 23319, 21518, 22822, -1424, -1, -13270, -24169, -23074, -24015, +-24322, -24628, -24937, -25244, -25551, -25854, -26158, -26467, -26774, -27083, -27384, -27695, -27999, -28301, -28610, -28918, +-29226, -29535, -29761, -28770, -29038, -7792, 7554, 15431, 30321, 29095, 29437, 29178, 28871, 28566, 28263, 27960, +27652, 27341, 27034, 26727, 26424, 26114, 25811, 25507, 25197, 24890, 24587, 24281, 23974, 23668, 23084, 21976, +18433, -2303, 1863, -11418, -23447, -23161, -23988, -24317, -24628, -24936, -25243, -25548, -25852, -26155, -26464, -26772, +-27079, -27385, -27690, -27996, -28299, -28606, -28916, -29221, -29532, -29570, -29373, -25746, -10579, 4839, 12256, 24969, +29114, 29255, 29172, 28877, 28573, 28265, 27958, 27650, 27340, 27034, 26734, 26430, 26124, 25814, 25504, 25198, +24892, 24591, 24277, 23978, 23663, 22779, 22213, 12427, -1627, 1091, -8900, -21941, -23103, -23963, -24320, -24628, +-24926, -25237, -25543, -25848, -26154, -26465, -26774, -27076, -27381, -27684, -27991, -28300, -28610, -28912, -29220, -29522, +-29532, -29381, -24694, -11431, 3726, 9672, 19332, 29051, 28891, 29177, 28878, 28569, 28270, 27960, 27652, 27345, +27041, 26734, 26430, 26123, 25814, 25508, 25202, 24898, 24592, 24284, 23981, 23619, 22667, 21450, 7070, -598, +-338, -4179, -22533, -22594, -23988, -24317, -24623, -24932, -25237, -25539, -25843, -26154, -26464, -26764, -27074, -27380, +-27681, -27986, -28297, -28606, -28915, -29217, -29517, -29610, -29522, -25165, -12087, 2916, 8821, 10511, 30386, 28127, +29201, 28886, 28576, 28266, 27960, 27651, 27351, 27045, 26734, 26433, 26121, 25814, 25507, 25208, 24903, 24598, +24287, 23976, 23506, 22888, 19362, 3391, 443, -1660, 662, -22596, -22264, -23904, -24315, -24621, -24927, -25231, +-25538, -25847, -26154, -26454, -26764, -27070, -27374, -27681, -27991, -28301, -28603, -28910, -29212, -29518, -29443, -30269, +-22481, -10973, 4169, 8591, 7814, 27362, 28656, 28960, 28887, 28578, 28270, 27962, 27658, 27354, 27047, 26737, +26433, 26128, 25818, 25513, 25210, 24902, 24594, 24288, 23981, 23384, 23302, 17792, 3589, 574, -907, -1120, +-13288, -22265, -23613, -24203, -24621, -24921, -25227, -25536, -25844, -26153, -26458, -26761, -27069, -27370, -27680, -27987, +-28286, -28602, -28905, -29211, -29514, -29082, -31267, -17010, -9979, 6342, 7680, 8959, 22174, 29842, 28607, 28884, +28574, 28270, 27963, 27664, 27355, 27050, 26740, 26431, 26126, 25820, 25520, 25212, 24906, 24596, 24291, 23977, +23346, 23171, 18198, 3183, 482, -469, -1361, -6833, -19460, -23930, -24011, -24612, -24921, -25228, -25538, -25839, +-26149, -26453, -26756, -27064, -27372, -27682, -27986, -28291, -28596, -28900, -29206, -29429, -28989, -30432, -11884, -10190, +8198, 7230, 8183, 18940, 30413, 28522, 28886, 28578, 28273, 27970, 27658, 27357, 27051, 26743, 26438, 26130, +25827, 25523, 25212, 24906, 24601, 24293, 23966, 23394, 22591, 19012, 2230, 840, -317, -1230, -1264, -15842, +-24147, -23899, -24608, -24914, -25227, -25533, -25842, -26145, -26451, -26755, -27061, -27371, -27677, -27986, -28288, -28595, +-28896, -29207, -29206, -29372, -27063, -8877, -9782, 9367, 7302, 6876, 17613, 28939, 28687, 28847, 28579, 28280, +27976, 27669, 27359, 27049, 26743, 26436, 26138, 25823, 25524, 25217, 24906, 24601, 24296, 23990, 23168, 23259, +16943, 932, 989, -302, -1355, -83, -11510, -22890, -23740, -24581, -24919, -25228, -25532, -25835, -26139, -26446, +-26754, -27065, -27367, -27675, -27979, -28283, -28592, -28897, -29207, -29017, -29823, -24019, -10445, -8243, 6352, 7821, +7366, 12877, 25386, 28525, 28671, 28585, 28282, 27976, 27670, 27360, 27054, 26748, 26443, 26137, 25830, 25522, +25217, 24908, 24604, 24301, 23990, 22781, 23883, 11402, 600, 758, -314, -1072, -1174, -6751, -23469, -23246, +-24601, -24917, -25223, -25529, -25833, -26142, -26441, -26753, -27064, -27367, -27671, -27976, -28283, -28587, -28898, -29199, +-28999, -29687, -23508, -11181, -7395, 3129, 8231, 7875, 8859, 19710, 29005, 28193, 28602, 28280, 27977, 27667, +27361, 27051, 26749, 26448, 26143, 25834, 25522, 25217, 24911, 24607, 24301, 24011, 22417, 24073, 5621, 1006, +419, -311, -653, -2482, -876, -25232, -22653, -24627, -24908, -25218, -25523, -25829, -26137, -26444, -26755, -27058, +-27360, -27666, -27973, -28280, -28591, -28898, -29207, -29145, -29073, -24990, -9037, -8238, 1854, 8301, 7674, 8111, +12803, 28490, 28018, 28459, 28286, 27979, 27671, 27362, 27058, 26756, 26448, 26140, 25833, 25528, 25219, 24916, +24612, 24305, 23990, 22216, 23302, 413, 1653, 11, -303, -624, -2041, -1874, -20050, -23793, -24215, -24912, +-25217, -25524, -25825, -26134, -26443, -26745, -27055, -27360, -27666, -27967, -28278, -28588, -28896, -29198, -29414, -28616, +-27601, -4971, -10857, 2067, 8048, 7420, 8072, 8892, 23450, 28947, 28136, 28288, 27979, 27671, 27366, 27066, +26754, 26450, 26142, 25834, 25528, 25222, 24919, 24616, 24307, 23813, 22710, 19735, 1301, 1188, 167, -301, +-640, -1446, -2415, -13423, -23760, -24094, -24841, -25212, -25519, -25829, -26138, -26440, -26745, -27047, -27356, -27661, +-27971, -28281, -28583, -28888, -29182, -29086, -28971, -21277, -5636, -10813, 4538, 7473, 7574, 7866, 8031, 20293, +29458, 28058, 28287, 27982, 27676, 27371, 27068, 26756, 26448, 26147, 25837, 25534, 25227, 24917, 24615, 24296, +23680, 22933, 16797, 3707, 565, 248, -301, -613, -1232, -1515, -7793, -21752, -24224, -24752, -25208, -25515, +-25824, -26133, -26439, -26744, -27047, -27356, -27660, -27970, -28271, -28583, -28887, -29125, -28965, -28243, -15754, -6358, +-10561, 6658, 7031, 7608, 8130, 5877, 19095, 28656, 28139, 28270, 27982, 27679, 27371, 27070, 26760, 26453, +26144, 25839, 25537, 25232, 24926, 24616, 24283, 23695, 22861, 16395, 3861, 541, 207, -296, -603, -1101, +-1608, -3702, -17073, -23804, -24550, -25199, -25518, -25822, -26130, -26433, -26736, -27045, -27355, -27661, -27972, -28273, +-28577, -28883, -28984, -29191, -26028, -11685, -6899, -10015, 8301, 6773, 7664, 8050, 6454, 15907, 27759, 27942, +28265, 27989, 27679, 27376, 27066, 26763, 26457, 26149, 25844, 25537, 25232, 24924, 24620, 24297, 23595, 23623, +15912, 2542, 776, 110, -291, -599, -936, -1786, -1857, -10285, -24229, -23987, -25208, -25517, -25823, -26126, +-26430, -26737, -27041, -27351, -27656, -27966, -28270, -28576, -28883, -28761, -29764, -22689, -9742, -7289, -8994, 8326, +6880, 7611, 7681, 7637, 10578, 27665, 27526, 28215, 27995, 27687, 27379, 27066, 26763, 26457, 26152, 25844, +25543, 25234, 24923, 24618, 24313, 23220, 24825, 11598, 1437, 782, 37, -291, -599, -889, -1387, -2779, +-3672, -25900, -23382, -25226, -25514, -25818, -26121, -26428, -26735, -27045, -27351, -27657, -27961, -28265, -28571, -28878, +-28634, -29962, -21879, -10010, -7764, -7737, 4567, 7766, 7331, 7359, 8126, 6716, 21935, 28021, 27795, 27968, +27684, 27379, 27073, 26764, 26462, 26158, 25851, 25543, 25231, 24930, 24622, 24320, 22735, 25867, 5392, 1504, +505, 17, -288, -595, -902, -1238, -2672, -2914, -22534, -24118, -24930, -25510, -25814, -26120, -26428, -26735, +-27044, -27350, -27652, -27957, -28266, -28572, -28857, -28719, -29097, -23469, -8607, -8406, -7260, 1660, 8430, 7204, +7375, 7488, 7530, 14433, 26002, 27984, 27781, 27687, 27379, 27073, 26768, 26467, 26163, 25852, 25543, 25234, +24931, 24625, 24131, 23021, 22934, 2216, 1836, 361, 16, -287, -590, -898, -1271, -2135, -3619, -17734, +-25153, -24698, -25505, -25811, -26115, -26426, -26735, -27040, -27346, -27646, -27955, -28261, -28572, -28844, -28787, -28540, +-23835, -7543, -8670, -8062, 545, 8553, 7220, 7376, 7221, 7331, 9464, 22450, 28435, 27623, 27690, 27384, +27078, 26772, 26464, 26160, 25848, 25546, 25241, 24936, 24631, 23835, 23641, 18086, 982, 1767, 323, 20, +-284, -592, -898, -1252, -2056, -2198, -15146, -25481, -24656, -25504, -25809, -26115, -26425, -26724, -27036, -27341, +-27646, -27955, -28257, -28568, -28887, -28470, -29304, -20386, -7230, -8283, -9300, 1882, 8117, 7362, 7371, 7065, +7689, 4856, 20745, 28193, 27631, 27687, 27384, 27083, 26777, 26470, 26162, 25853, 25546, 25241, 24937, 24654, +23712, 23880, 15508, 3466, 1157, 526, 22, -280, -588, -894, -1201, -2051, -1336, -10052, -22216, -24612, +-25373, -25806, -26118, -26428, -26726, -27031, -27336, -27642, -27952, -28262, -28562, -28877, -28156, -29327, -14670, -7708, +-7665, -9808, 4370, 7534, 7520, 7375, 7070, 7602, 5518, 17429, 27369, 27413, 27681, 27390, 27083, 26777, +26469, 26160, 25856, 25551, 25248, 24936, 24635, 23762, 23537, 15111, 3259, 1069, 536, 23, -280, -588, +-890, -1198, -1797, -2065, -5665, -17660, -24681, -25034, -25808, -26111, -26420, -26725, -27031, -27336, -27645, -27950, +-28256, -28562, -28837, -28048, -28307, -9635, -8349, -7110, -9999, 6527, 7079, 7622, 7378, 7074, 7289, 6763, +12285, 28287, 26894, 27703, 27386, 27089, 26777, 26469, 26164, 25859, 25553, 25252, 24945, 24628, 23980, 23195, +16691, 1194, 1399, 435, 28, -277, -584, -890, -1196, -1553, -2240, -3386, -10010, -25964, -24384, -25854, +-26114, -26415, -26719, -27027, -27335, -27643, -27951, -28258, -28558, -28722, -28296, -25771, -5919, -8855, -6733, -9780, +8213, 6806, 7680, 7380, 7073, 6814, 7995, 6469, 30064, 26361, 27737, 27395, 27086, 26777, 26475, 26168, +25864, 25553, 25251, 24942, 24627, 23966, 23788, 15707, -629, 1571, 335, 27, -275, -579, -886, -1193, +-1500, -1860, -3263, -4145, -24858, -24472, -25643, -26109, -26411, -26719, -27027, -27331, -27636, -27947, -28251, -28543, +-28524, -28596, -21937, -8010, -8229, -6993, -8697, 6139, 7269, 7475, 7385, 7076, 6802, 7306, 7381, 21904, +27153, 27340, 27351, 27088, 26779, 26474, 26172, 25863, 25562, 25252, 24943, 24572, 23809, 23166, 9992, 453, +1160, 337, 32, -273, -579, -886, -1191, -1498, -1904, -2701, -4879, -20060, -25476, -25410, -26100, -26409, +-26715, -27025, -27335, -27642, -27943, -28246, -28508, -28514, -28179, -20708, -9513, -7971, -7399, -7646, 2537, 8150, +7219, 7385, 7075, 6808, 6832, 7221, 14790, 25616, 27413, 27243, 27086, 26785, 26482, 26176, 25871, 25561, +25248, 24945, 24432, 24012, 20994, 5775, 1190, 884, 338, 36, -270, -577, -883, -1189, -1496, -1889, +-2639, -3414, -17538, -25756, -25369, -26101, -26409, -26716, -27022, -27331, -27635, -27938, -28246, -28484, -28500, -28102, +-20207, -9034, -8084, -7606, -7447, 283, 8694, 7137, 7388, 7079, 6780, 6673, 6717, 8717, 23793, 27328, +27204, 27092, 26784, 26482, 26178, 25872, 25561, 25255, 24947, 24170, 24603, 17187, 3221, 1505, 733, 342, +36, -272, -574, -879, -1186, -1493, -1800, -3021, -928, -16569, -24976, -25410, -26086, -26407, -26716, -27016, +-27327, -27628, -27936, -28242, -28552, -28082, -30022, -18873, -8336, -8205, -7541, -8648, -953, 8818, 7157, 7386, +7085, 6777, 6470, 7170, 4578, 19067, 26828, 26915, 27092, 26793, 26482, 26177, 25871, 25561, 25260, 24953, +23896, 25204, 13627, 3040, 1494, 723, 347, 39, -265, -572, -879, -1186, -1493, -1795, -2781, -1952, +-11419, -23434, -25136, -25998, -26406, -26710, -27017, -27322, -27628, -27932, -28242, -28549, -27624, -30835, -12936, -8286, +-7952, -7302, -9267, 1695, 8185, 7369, 7390, 7084, 6778, 6470, 6837, 5891, 13877, 27742, 26409, 27107, +26795, 26488, 26182, 25871, 25565, 25260, 24955, 23840, 25028, 13288, 2557, 1598, 703, 346, 40, -262, +-568, -875, -1183, -1489, -1796, -2357, -2980, -5874, -19683, -25427, -25649, -26412, -26714, -27011, -27318, -27624, +-27932, -28243, -28632, -27216, -31012, -7059, -8884, -7619, -7056, -9761, 4203, 7591, 7530, 7394, 7089, 6780, +6473, 6357, 7102, 8178, 29390, 25921, 27166, 26797, 26487, 26179, 25872, 25572, 25267, 24933, 24112, 23494, +15532, 943, 1980, 646, 351, 44, -262, -568, -875, -1178, -1486, -1792, -2101, -2983, -3450, -12684, +-26082, -25284, -26357, -26706, -27011, -27318, -27627, -27932, -28242, -28251, -27864, -25924, -6108, -8703, -7599, -6819, +-9979, 6390, 7128, 7635, 7394, 7090, 6787, 6478, 6236, 6856, 7560, 25955, 26682, 26865, 26799, 26489, +26184, 25877, 25573, 25265, 24940, 24156, 23331, 15857, 267, 2053, 657, 354, 46, -258, -564, -873, +-1178, -1485, -1792, -2099, -2594, -3285, -7236, -22402, -25829, -26133, -26698, -27007, -27316, -27622, -27929, -28243, +-27931, -28349, -20396, -6581, -8276, -7672, -6712, -9708, 7567, 6914, 7656, 7399, 7094, 6785, 6478, 6270, +6386, 7776, 21238, 27415, 26691, 26787, 26488, 26186, 25883, 25570, 25270, 24953, 23893, 23574, 11055, 755, +1716, 661, 354, 46, -258, -564, -868, -1172, -1481, -1789, -2095, -2537, -3174, -4838, -19729, -26086, +-26065, -26701, -27007, -27317, -27618, -27927, -28227, -27905, -28173, -18491, -8729, -7705, -7759, -7027, -8486, 3929, +7656, 7336, 7400, 7097, 6788, 6482, 6217, 6328, 5975, 15227, 26105, 26651, 26737, 26493, 26188, 25883, +25580, 25273, 24898, 23850, 22430, 6057, 1475, 1359, 663, 357, 51, -253, -561, -868, -1175, -1479, +-1784, -2090, -2398, -3793, -1101, -19507, -25586, -26119, -26696, -27006, -27316, -27622, -27927, -28204, -28050, -27777, +-18702, -8408, -7710, -7718, -7390, -7623, 469, 8540, 7102, 7403, 7095, 6788, 6487, 6178, 6234, 5718, +9575, 23161, 26375, 26574, 26499, 26196, 25890, 25580, 25270, 24762, 24179, 19750, 2426, 1956, 1115, 663, +357, 51, -250, -558, -864, -1171, -1477, -1784, -2090, -2395, -3613, -2034, -15547, -25302, -25785, -26696, +-27005, -27308, -27616, -27918, -28194, -28077, -28321, -18480, -6974, -7866, -7628, -7597, -7672, -1558, 9044, 7045, +7405, 7099, 6793, 6486, 6179, 5964, 6206, 6443, 17274, 26957, 26076, 26508, 26191, 25890, 25581, 25275, +24506, 24977, 15328, 471, 2058, 982, 669, 361, 55, -251, -556, -864, -1166, -1474, -1781, -2087, +-2395, -3254, -3382, -10110, -26467, -25260, -26709, -26996, -27309, -27613, -27916, -28191, -27825, -29393, -15314, -6696, +-7740, -7597, -7519, -8578, -1142, 8884, 7158, 7405, 7099, 6797, 6489, 6182, 5874, 5901, 6255, 9913, +28627, 25490, 26504, 26198, 25887, 25581, 25224, 24489, 24219, 13406, 2575, 1728, 1025, 669, 361, 59, +-246, -553, -860, -1166, -1474, -1780, -2083, -2390, -2745, -4126, -4424, -23018, -25747, -26362, -27000, -27303, +-27608, -27916, -28047, -27973, -27254, -11057, -7442, -7485, -7597, -7301, -9204, 1506, 8254, 7371, 7409, 7103, +6797, 6488, 6186, 5880, 5674, 6197, 7792, 26899, 25879, 26365, 26199, 25892, 25585, 25163, 24608, 23132, +13182, 2773, 1802, 1011, 672, 365, 59, -246, -549, -858, -1162, -1470, -1777, -2083, -2390, -2730, +-3529, -4588, -15499, -25030, -26320, -26895, -27303, -27603, -27916, -27783, -28494, -23469, -8523, -7735, -7349, -7594, +-7056, -9711, 4032, 7652, 7535, 7414, 7107, 6802, 6494, 6187, 5880, 5722, 5721, 8083, 22601, 26707, +26189, 26199, 25892, 25587, 25173, 24485, 23486, 12935, 2304, 1932, 985, 676, 370, 61, -243, -549, +-856, -1162, -1465, -1773, -2080, -2386, -2715, -3265, -4007, -9254, -22780, -26420, -26798, -27301, -27607, -27917, +-27410, -29246, -18340, -7495, -7664, -7296, -7594, -6817, -9954, 6252, 7177, 7646, 7413, 7104, 6799, 6493, +6186, 5877, 5713, 5743, 6858, 21519, 26714, 26197, 26193, 25887, 25580, 25207, 24172, 24364, 11194, 2168, +1888, 970, 667, 360, 52, -250, -558, -865, -1171, -1475, -1782, -2088, -2395, -2726, -3266, -4070, +-8850, -22988, -26333, -26827, -27307, -27613, -27923, -27383, -29249, -17973, -7453, -7667, -7299, -7599, -6806, -9945, +6348, 7160, 7646, 7413, 3274, 1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 338, -640, 1287, -2818, 18922, 831, -23193, -309, 963, +-5263, 19609, -22221, 13003, 11510, -14984, 4361, 2063, -4409, 4935, -12676, 17367, -13231, -6079, 25824, -15005, +-5645, 9479, -7424, 12173, -14694, 18397, -3266, -20487, 23307, -6809, -14397, 11777, -6348, 17123, -19773, 7172, +12348, -25256, 15958, 10976, -18820, 10245, -8283, 15675, -13152, -10003, 23246, -21429, 1904, 17182, -14170, 8170, +-10578, 15242, -2873, -21815, 29179, -10648, -6174, 15369, -8840, 1172, -11993, 7991, 13279, -29832, 23483, 1443, +-11811, 9455, -5052, 4594, -7725, -1726, 26853, -29144, 9401, 7548, -12201, 2788, -4123, 6715, -711, -14335, +31486, -21058, -4307, 12991, -7243, 3041, -3997, 6104, 7783, -25324, 25624, -9708, -15495, 14255, -1876, 4869, +-5849, 76, 16866, -27662, 16740, 5459, -17071, 11806, -1826, 6997, -8486, -8471, 21422, -22497, 2870, 18483, +-16857, 8481, -3796, 8532, -3516, -16092, 23285, -8363, -10404, 22377, -16242, 4024, -8305, 6895, 5107, -21077, +17990, 7209, -19794, 20023, -13266, 6252, -7345, 2314, 14559, -19812, 4666, 17863, -26624, 14563, -8467, 6120, +-3750, -4554, 20687, -13192, -8804, 24468, -21688, 8344, -4492, 5498, 3856, -15246, 17977, -4273, -21525, 24539, +-11346, 4128, -1412, 66, 12784, -20565, 11048, 8489, -25605, 19759, -2488, -175, -1218, -9179, 19076, -21314, +1256, 18796, -20032, 10607, 6147, -4530, 2684, -18175, 23937, -11252, -9131, 21562, -13352, -2833, 8037, -8168, +9875, -23726, 24422, 1956, -16417, 17743, -4273, -10211, 9449, -9591, 18440, -24131, 12440, 12916, -21717, 6727, +3798, -11268, 12057, -11526, 22917, -17878, -2029, 19634, -17762, -2193, 9406, -10386, 13367, -15470, 18625, -8597, +-17598, 22659, -7123, -7456, 12023, -6749, 14534, -17084, 8233, 5171, -24389, 19215, 2417, -8756, 7638, -9039, +12556, -13013, -3593, 21240, -23474, 13496, 8965, -8775, 2245, -10496, 9982, -902, -16012, 28128, -19091, 2616, +7888, -7783, 626, -8506, 7544, 14339, -24773, 25993, -11650, -6646, 6516, -4621, 3506, -5398, -1842, 23937, +-29856, 15484, -2577, -9807, 7902, -694, 6091, 122, -13914, 28658, -26861, 2943, 8025, -9265, 8260, -1579, +3251, 3119, -23494, 26599, -12199, -6024, 14820, -6601, 7458, -4723, -1971, 8619, -26273, 20777, 3954, -15673, +14693, -8772, 5823, -5840, -5915, 17030, -20579, 9735, 18495, -20636, 10002, -10284, 5281, -2193, -9460, 19729, +-10404, -7418, 23856, -22401, 6614, -8353, 8253, 7206, -13392, 15571, 859, -22325, 23666, -16354, 5190, -6373, +5607, 13345, -16100, 2659, 11356, -26991, 22149, -6478, 6062, -3479, -3147, 15767, -14325, -10217, 20104, -22846, +15286, 23, 1588, -973, -14167, 16765, -3678, -17094, 25295, -13712, 6899, 2574, -4772, 3347, -20118, 14433, +8902, -20971, 19688, -5573, -3176, 4719, -10643, 14263, -17446, 8254, 19973, -20713, 6584, 628, -9566, 9145, +-14501, 19388, -11398, -3975, 21739, -15955, -5906, 8343, -9114, 16547, -16055, 17516, -4610, -15252, 17714, -7031, +-13603, 12858, -9450, 20220, -17865, 7879, 4540, -19842, 12649, 6734, -14244, 13793, -10789, 18514, -15577, -5888, +13355, -17556, 6056, 15588, -14109, 9720, -13527, 15022, -5527, -14589, 20680, -8375, -2271, 16144, -13710, 4492, +-14777, 8862, 9338, -21040, 19104, -732, -9691, 12281, -10394, 3677, -8183, 1785, 23051, -23656, 8355, 3964, +-13536, 7157, -6120, 5110, -607, -9359, 28722, -20988, -3443, 8718, -8903, 6958, -1167, 2986, 7371, -22910, +25566, -12716, -12426, 11361, -2502, 6623, -260, -4617, 14433, -27740, 18357, 3501, -14594, 10112, 732, 3690, +-1292, -15427, 19407, -22732, 7071, 16916, -14014, 4536, -648, 1791, 3289, -20250, 21718, -8918, -4884, 20791, +-13333, -2207, -4671, 284, 11234, -19885, 16152, 5122, -15621, 18025, -9654, -2934, -2209, -603, 19033, -16543, +1588, 13895, -22489, 11593, -4114, -759, 1103, -3784, 20639, -9994, -13556, 19169, -18122, 8427, 1495, 1046, +3190, -12121, 14089, -1184, -23958, 20168, -8287, 5488, 3532, -1510, 5556, -16307, 6974, 12649, -25116, 16376, +514, 326, 1176, -9319, 8234, -13381, -978, 24156, -19039, 5968, 5030, -2921, 2516, -13337, 12450, -3741, +-9131, 24814, -11865, -7724, 4277, -4282, 8105, -13842, 12163, 6939, -16032, 17446, -2310, -14486, 5420, -3282, +15441, -13932, 2945, 12358, -19454, 5020, 6853, -12964, 6540, -3733, 19475, -10336, -9683, 15217, -12684, -3421, +14160, -8922, 6182, -9799, 14617, -3132, -20333, 14570, 265, -7058, 14956, -5544, 5471, -13808, 7559, 8934, +-21448, 9446, 9867, -9029, 7754, -7171, 4293, -11606, -1152, 21496, -15614, 548, 13488, -7977, 1244, -7342, +5074, -1724, -10582, 24741, -9347, -10991, 8219, -3699, 572, -5665, 4937, 10409, -16827, 18966, -1479, -15882, +3113, 2003, 4233, -3091, -3484, 16741, -21128, 7448, 6070, -12480, 491, 6745, 7715, 483, -14174, 17967, +-15847, -2345, 11617, -4965, -1981, 1976, 5427, 4073, -22906, 15112, -2613, -6256, 13205, 783, -3652, -3927, +744, 10448, -22353, 7986, 9810, -9094, 7245, -803, -2920, -6557, -3109, 18450, -12775, -1981, 16429, -8806, +821, -3794, 351, -2587, -6298, 18845, -2568, -14952, 13702, -6172, -267, -3895, 4550, 4970, -7827, 11467, +6714, -22771, 8383, -1710, 4233, -4725, 2577, 7875, -10162, -1029, 13668, -20118, 5258, 3125, 9663, -3724, +-4856, 7199, -6435, -10613, 18035, -12364, 1183, 1996, 8678, -2398, -12117, 5122, 3627, -12628, 18562, -2829, +-2385, -2256, 3520, 3197, -14801, 1910, 12819, -11275, 10192, 1142, -6232, -4815, -40, 12101, -8990, -3089, +16930, -8137, -697, 2266, -6831, -1634, -4676, 16837, -3215, -11321, 11230, -2426, -7021, 4347, -2834, 6052, +-8408, 14884, 1780, -16446, 1993, 5054, -7036, 5146, -2999, 10206, -11795, 5917, 6657, -13420, -3675, 12822, +-2049, 5617, -7233, 9774, -11319, -3285, 9984, -5209, -8179, 12925, 226, 4031, -13379, 7841, -3188, -6625, +12602, 3505, -9877, 6192, -1073, 4097, -15596, 3600, 6851, -7103, 7807, 6172, -10607, -695, -1528, 9115, +-8731, -1207, 13822, -6843, -37, 3871, -8297, -3791, -1285, 12150, -1125, -9871, 13707, -5268, -4264, 2528, +-977, -509, -362, 9750, 5188, -18102, 7369, -1718, -3474, 1377, 3081, 2054, -2911, 1874, 10217, -18966, +3352, 4870, 2009, 546, 1460, 855, -4497, -7500, 13894, -13498, -537, 7049, 4666, -1447, -3345, -54, +-76, -9911, 16378, -3778, -3852, 3905, 3105, -2799, -7560, -1356, 7192, -9577, 13313, 2660, -7734, -750, +1651, 3018, -5943, -1248, 12566, -8107, 4012, 3775, -10209, -3392, -60, 9187, -2047, -5533, 12101, -5413, +-4116, 5809, -6276, 143, -1500, 11520, 1079, -12276, 4821, -1104, -8190, 7327, -2444, 4147, -4133, 7128, +4419, -14040, -5, 7419, -6029, 8277, -2286, 4004, -7820, -1138, 7453, -10220, -3576, 12887, -3143, 5796, +-5054, 3051, -5434, -5107, 11878, -1590, -7831, 11077, -3329, 1099, -8353, 551, 1887, -6532, 11515, 5141, +-11350, 5549, -2261, 1903, -5558, -915, 9464, -7331, 4704, 6012, -13586, -396, -458, 4810, 425, -4763, +12344, -6264, -2836, 7675, -9409, -873, 2272, 5606, 4872, -12248, 7800, -3866, -7840, 8291, -2063, -47, +2814, 2130, 8346, -15558, 3091, 3434, -6586, 7666, 1579, -2396, -347, -5523, 9881, -12774, -1598, 10869, +-3830, 5219, 1384, -4283, 217, -9101, 12269, -4012, -6509, 11679, -3571, -1055, -957, -5871, 4025, -7654, +11665, 5243, -11060, 7816, -1821, -2730, 333, -4771, 8609, -6096, 4080, 9351, -15441, 1453, 641, -623, +4339, -4196, 9802, -3021, -4993, 11190, -12852, -1455, 4351, 1218, 5847, -8028, 4031, -268, -12347, 12294, +-5078, -1907, 6506, 432, 6336, -9804, -1787, 6091, -12140, 10962, 1461, -5020, 3656, -4356, 5410, -7370, +-5820, 13696, -7591, 6855, 5403, -7807, 1649, -6670, 6715, -194, -9333, 14263, -4450, -2299, 5291, -9574, +2498, -4429, 7108, 8452, -12007, 9070, -411, -8200, 5838, -7342, 4957, -2562, 2099, 10385, -14394, 361, +4268, -8117, 8654, -3856, 6125, 102, -5384, 10757, -11058, -5677, 9644, -5885, 8079, -4228, 1521, 1501, +-11353, 10065, -1698, -7889, 12901, -3143, 5955, -4547, -4644, 5732, -11388, 7442, 6396, -10469, 8523, -3842, +1688, -2165, -7943, 11423, -6212, 3478, 10803, -11554, 2546, -3311, -425, 3576, -10285, 12218, -2480, -4637, +9498, -10381, -622, 594, -25, 10990, -10859, 8183, 1394, -10259, 7430, -5881, -1792, 4451, -3157, 12621, +-11947, -163, 5480, -10125, 7459, 1406, -2003, 7260, -7611, 10808, -9451, -7027, 9388, -6715, 4549, 4355, +-5864, 5844, -10885, 8098, -1049, -9199, 12299, -1664, 628, 4146, -9382, 5053, -10183, 4669, 7179, -11039, +8660, 47, -4403, 3746, -8847, 7326, -3313, 1040, 12930, -11821, 2070, 1031, -6236, 4758, -7012, 6761, +1797, -6506, 12843, -10549, -2949, 4623, -3098, 7807, -3977, 2456, 5588, -13269, 10133, -6251, -5583, 6227, +-1550, 6721, -3505, -4865, 8703, -13682, 8355, 2323, -4956, 6402, -2135, 3202, -2374, -11276, 11389, -10095, +4567, 6923, -6236, 3181, -3314, 759, 3332, -11954, 13982, -2764, -983, 7294, -7642, -306, -3493, -820, +9152, -11694, 9726, 2054, -7017, 5953, -6053, 1000, 879, -1559, 13006, -10469, 778, 4681, -10531, 4884, +-3686, 1487, 3487, -4859, 11190, -7195, -6778, 8629, -7250, 6362, -364, 469, 4283, -9576, 6161, -1544, +-11733, 10985, -3828, 5331, -15, -3161, 5226, -9139, 2589, 7885, -11055, 10493, -1814, 1534, -1227, -7509, +5536, -5214, -1571, 13464, -10211, 5437, -1409, -740, 1443, -7471, 7302, 1884, -6157, 12945, -9861, -1501, +-904, -2631, 5616, -6527, 4913, 6482, -10805, 9605, -5602, -3518, 3154, -1736, 9135, -5631, -1562, 7312, +-12989, 4584, 337, -3918, 5960, -3026, 8677, -4045, -7225, 9557, -8083, 1954, 6407, -4177, 5295, -6959, +4734, -1476, -11055, 9611, -939, -1913, 8253, -5699, 4390, -7700, 2499, 5517, -9891, 7063, 4324, -6826, +5261, -8190, 3411, -5655, -105, 10996, -7447, 961, 7114, -8239, 4116, -6153, 5248, -105, -4182, 11408, +-5337, -7502, 6652, -7019, 4310, -3603, 4792, 4994, -8431, 7953, -359, -9945, 6886, -2179, 5087, -2427, +-771, 6536, -11899, 1904, 5014, -8610, 5728, 832, 4569, -1254, -6833, 8936, -8229, -1724, 9508, -5178, +1685, -968, 747, 399, -11688, 9527, -866, -4468, 10073, -2054, -1215, -1964, -1293, 6634, -11214, 7205, +5229, -7468, 4278, -1626, -3123, -1322, -2934, 12251, -7785, 1637, 8287, -7530, 259, 347, -926, 1927, +-5437, 12020, -4897, -7254, 6934, -5276, -1590, 2088, 1282, 5775, -8307, 8195, 483, -11370, 6070, -74, +-781, 1529, -1009, 5861, -10629, 893, 6486, -10212, 4632, 4281, 657, 958, -4487, 6560, -6862, -4307, +11555, -6420, 415, 3173, -870, -501, -7738, 6256, 783, -7083, 12711, -1658, -3347, 674, -845, 2149, +-7463, 4247, 6978, -10534, 6797, -83, -5523, -1426, -312, 6909, -4481, 83, 10682, -10274, 454, 2682, +-3290, -706, -1515, 8233, -2538, -7885, 9551, -6646, -3806, 5161, 1126, 2154, -3896, 6619, 1967, -12465, +7027, 354, -4785, 3968, 1525, 2557, -7991, 990, 6929, -11089, 3745, 7337, -3047, 1456, -732, 4102, +-7616, -4064, 11146, -6129, -2538, 7325, -2626, -1897, -4690, 5909, -1780, -6755, 12276, 835, -6886, 4060, +-1249, -537, -6607, 5519, 4864, -9926, 6208, 4351, -8950, 212, 648, 4863, -4615, 2478, 9886, -9455, +-1559, 6603, -5670, -1901, 100, 7414, -2962, -5568, 9319, -5861, -6502, 7773, 713, -414, -1985, 6557, +1222, -11582, 6428, 362, -7768, 5314, 3115, -20, -6302, 1225, 6567, -11412, 3663, 7393, -4719, 1590, +2696, 1210, -6741, -4621, 11000, -6896, -1811, 8141, -2795, -3149, -240, 3507, -1779, -7207, 13089, -20, +-6087, 4993, -692, -4046, -3023, 4012, 4078, -10419, 8113, 4130, -9106, 607, 1991, 443, -2255, 2568, +9155, -10631, -117, 6949, -7492, -2678, 2228, 3830, -2150, -3384, 9551, -7512, -6363, 9485, -963, -1767, +602, 5480, -139, -9318, 7156, -1012, -10061, 8111, 3357, -1542, -4126, 2731, 4118, -10186, 4242, 8107, +-8664, 4011, 4320, -35, -7545, -2232, 8335, -7061, -2114, 11569, -6697, -2049, 2065, 3031, -4725, -5224, +11699, 143, -8157, 9198, -3426, -5553, -1464, 4884, 725, -9019, 8195, 6056, -11739, 3964, 1516, -2487, +-1716, 5010, 7262, -10551, -56, 9511, -10517, -1447, 3515, 1511, -1981, -774, 10005, -8227, -7499, 11889, +-2601, -3077, 3240, 3733, -818, -8241, 8111, -2175, -11964, 9227, 4151, -4127, -971, 1732, 3535, -10805, +5577, 6987, -10333, 3982, 7059, -3734, -4996, -3289, 8055, -8398, -288, 11466, -7046, -3094, 6336, -289, +-3120, -6137, 11976, -1315, -6266, 9637, -3410, -8321, 2847, 2304, 1355, -9106, 9119, 5097, -10442, 4908, +1920, -6630, 1622, 3793, 6652, -10546, 667, 8748, -10995, -1088, 4996, -2870, 15, 800, 8753, -8101, +-7127, 12086, -4594, -3263, 5874, 272, -928, -5015, 6817, -2648, -12987, 11484, 2708, -4762, 2596, 1121, +832, -6871, 4427, 6915, -13071, 6818, 7444, -5512, -3159, -1457, 3496, -5616, -500, 13269, -10571, -1009, +8576, -2251, -4346, -2804, 7330, 37, -7153, 12948, -6615, -9227, 5727, 1593, -2020, -5189, 6506, 6430, +-12034, 8499, 805, -10197, 3743, 5363, 2553, -7536, -348, 10288, -13013, 575, 6874, -7015, 1113, 4836, +6055, -6625, -7800, 13413, -5580, -4887, 9472, -2739, -1933, -999, 5651, -2873, -13908, 11889, 4162, -8107, +6789, -30, -1470, -4507, 4320, 5649, -14253, 5595, 10797, -9358, -196, -1310, 575, -4669, 603, 12252, +-9953, -3324, 13285, -5718, -3287, -1737, 4451, -132, -5096, 12001, -4849, -12446, 10288, -585, -2655, -3003, +5262, 5737, -9038, 7303, 2713, -14433, 6653, 5004, 194, -5214, -490, 8519, -10336, -795, 8611, -10961, +2300, 7376, 3153, -5062, -7167, 10805, -4504, -6154, 11238, -5834, -2858, 3706, 2684, -2640, -12613, 9904, +4597, -8505, 9159, -556, -5004, 851, 2446, 3836, -12989, 5037, 11108, -9871, 1674, 989, -5064, -367, +1044, 10224, -9395, -2552, 14252, -6649, -4067, 2238, -1681, 1208, -2763, 10794, -5539, -12275, 11675, -541, +-6362, 2183, 1230, 4718, -5767, 7274, 1457, -16113, 7448, 6736, -5148, -788, -1132, 6133, -8011, 278, +8238, -13374, 2488, 11624, -1167, -2930, -5015, 7646, -3818, -5847, 12179, -7507, -4565, 9251, 587, -3908, +-9349, 7502, 4928, -8912, 11170, -558, -8567, 4761, 2610, -158, -10855, 3361, 11904, -10885, 3055, 2587, +-9216, 977, 3798, 5946, -7630, -3594, 15689, -7438, -4709, 4365, -5304, -131, 1782, 7648, -4151, -12723, +13061, -524, -8035, 4710, 81, 2117, -854, 5711, 1726, -16903, 7400, 7757, -7468, 1241, 216, 2490, +-3928, -21, 7608, -13910, 1588, 14095, -3526, -2199, -2471, 3266, -2235, -5286, 10647, -7810, -6080, 12740, +-982, -4777, -6260, 4142, 4573, -6818, 9947, 22, -10981, 8287, 2004, -3357, -7773, 1747, 10118, -7608, +2871, 4136, -12372, 3675, 5417, 2048, -5543, -2310, 13225, -5108, -4868, 6109, -9332, 131, 5543, 4666, +-3961, -9690, 10995, 512, -9070, 7105, -2618, -342, 4109, 4428, -742, -14615, 6051, 7585, -9587, 3672, +453, -1525, 563, 1227, 4034, -13221, 1698, 14822, -5639, -1046, 645, -1688, -449, -2587, 7666, -8369, +-5549, 15294, -1426, -6198, -1298, 211, 3487, -3600, 9513, -1341, -11312, 10452, 3033, -7708, -3966, 207, +7812, -5282, 4345, 3642, -13983, 4171, 8506, -3313, -3565, -1436, 10779, -4303, -3754, 6004, -11379, -1750, +10131, 957, -3838, -6905, 9776, 521, -8622, 7506, -3552, -3367, 8912, 3377, -2609, -12310, 5198, 7404, +-9979, 4301, 1811, -4690, 4324, 2945, 890, -11693, 677, 15064, -5927, -986, 2700, -4768, 28, 385, +4064, -7846, -5937, 16284, -1467, -6382, 789, -2159, 1505, 78, 6360, -1046, -11766, 11519, 3043, -9342, +-2381, -435, 4259, -572, 3241, 3634, -13908, 5378, 8680, -5527, -2757, 312, 6697, -433, -3180, 5155, +-12466, -1117, 11683, -839, -3860, -2920, 6246, 2260, -7105, 6567, -5311, -4342, 11823, 2522, -4897, -8289, +2614, 6226, -8499, 4486, 832, -6739, 7888, 3967, -2997, -9247, 292, 12310, -5194, -291, 3813, -8227, +2146, 2993, -90, -7577, -3624, 14593, -446, -6240, 4050, -5590, 869, 3754, 3957, -3309, -8427, 11170, +3748, -11239, 962, -2334, 1534, 3139, 4315, 570, -11748, 5397, 10002, -9236, -1117, 721, 3035, 1258, +-88, 2062, -12440, -2017, 14079, -3985, -3770, 56, 3946, 1577, -3808, 4492, -6615, -5951, 14577, 1367, +-6653, -4717, 1794, 3966, -6191, 3997, 718, -8159, 10631, 5708, -6278, -7041, 548, 9634, -4171, 234, +4165, -9285, 2760, 6239, -3852, -7239, -2358, 13414, -93, -5030, 4515, -6590, -1269, 7308, 665, -4341, +-7216, 10989, 3493, -10443, 802, -2401, -2091, 7066, 3420, -682, -10330, 6042, 8931, -9397, -1734, 1792, +-753, 4584, 958, 541, -11862, -837, 13027, -4171, -4038, 3146, 910, 3361, -1498, 2174, -7608, -5174, +14293, 1401, -7824, -1094, -228, 2853, -3348, 2555, -1115, -7487, 11883, 6200, -8500, -4822, -245, 6060, +-2065, 268, 2732, -9996, 4659, 7648, -6963, -6736, -411, 9633, 1674, -3413, 4499, -8335, -753, 9143, +-1785, -6263, -3095, 8786, 3802, -8834, 2378, -4655, -3017, 9630, 3622, -3908, -6096, 5546, 7984, -9964, +-278, 511, -3180, 6405, 3925, -3492, -9857, -62, 12270, -5974, -2986, 4080, -1302, 3341, 2498, -1336, +-8688, -4754, 14607, -314, -7786, 1511, -1224, 996, 435, 1063, -3129, -6814, 13472, 6411, -10028, -2381, +-115, 2405, -13, 1164, 1108, -9455, 6089, 9469, -9290, -5762, 990, 6998, 2053, -907, 3672, -8733, +-1169, 11224, -4633, -7182, -1133, 7757, 3103, -6290, 1777, -4991, -5025, 12082, 2304, -5628, -4264, 6137, +6105, -8582, -1234, 182, -5851, 9032, 4686, -5074, -8509, 1490, 10283, -5243, -3335, 5158, -3386, 5086, +4790, -3363, -9212, -3210, 12760, -7, -7427, 3660, -2395, 835, 3229, -337, -4932, -5263, 13091, 6268, +-10064, -713, -1088, -154, 2093, 559, -1002, -8281, 7302, 9497, -10231, -4907, 1569, 3201, 3895, 313, +1843, -8765, 304, 11145, -6499, -7884, 1413, 4914, 4161, -3507, 1470, -6420, -3983, 12907, 1184, -7419, +-333, 4674, 5284, -6591, -837, -2184, -6329, 10501, 6002, -7888, -5064, 1980, 8013, -4878, -2104, 3656, +-4884, 5994, 7472, -6809, -8748, -1879, 10485, -1118, -6099, 4491, -3651, 493, 6886, -3009, -6889, -3269, +12364, 5179, -9691, 1147, -1661, -2713, 4868, 224, -4032, -5999, 8650, 9684, -10926, -3272, 2048, 34, +4966, 2555, -697, -7953, 1280, 11913, -8530, -7882, 2894, 2842, 3802, 316, -47, -6755, -4228, 13888, +-487, -8912, 1464, 4290, 3095, -3706, -1825, -3384, -7612, 11894, 5803, -9220, -3101, 3308, 5365, -3429, +-2618, 2999, -6220, 7284, 8930, -8656, -8154, 125, 7672, -559, -5328, 4925, -3860, 1220, 9240, -4569, +-8149, -1423, 10650, 4810, -8421, 1695, -2197, -3846, 6947, -789, -6187, -4104, 8692, 9081, -9722, -2984, +1826, -2935, 6479, 2741, -3263, -6735, 2504, 10492, -8401, -8189, 3880, -151, 5137, 2626, -1472, -6649, +-2311, 12552, -1418, -9827, 4093, 2177, 3061, -609, -2749, -5015, -5941, 11579, 5941, -10463, 264, 3317, +3377, -1176, -2408, -60, -5750, 7892, 9988, -10721, -6416, 1224, 4570, 34, -3734, 3215, -4198, 2082, +11554, -6973, -9029, 757, 7528, 3901, -6365, 1644, -2825, -4371, 9217, -1893, -8929, -788, 8260, 7997, +-8045, -1586, 1203, -4884, 7666, 3697, -6704, -4020, 3886, 9571, -8490, -7153, 4278, -1971, 5182, 6339, +-4293, -5777, -669, 11713, -2773, -10100, 4710, 1398, 1343, 3556, -4307, -6351, -5098, 11649, 4970, -11057, +1753, 4165, 493, 1724, -2994, -2442, -5779, 8229, 10296, -11424, -5509, 3595, 1214, 1145, -2422, 1593, +-3594, 3030, 12740, -7618, -9702, 3043, 4869, 3147, -4106, 1036, -2439, -4051, 10687, -2476, -10855, 1514, +7711, 6497, -5233, -2172, 1031, -6091, 8136, 3815, -9540, -2727, 5349, 7229, -6261, -7427, 3798, -3692, +5738, 7938, -6169, -5431, 1807, 8920, -2309, -10462, 4901, -138, 1433, 6462, -5028, -7578, -1918, 9397, +4811, -10595, 3163, 4054, -677, 4185, -2891, -5762, -3508, 7510, 9672, -11171, -3828, 4457, -1152, 2364, +-846, -1899, -2502, 4054, 12548, -8151, -9947, 4491, 1675, 2187, -1146, -1445, -2739, -2160, 10905, -2958, +-12543, 3758, 6158, 4526, -1826, -2203, -796, -5384, 8189, 3726, -12279, -94, 6188, 4889, -3866, -5631, +1838, -3802, 5523, 10008, -8622, -4228, 4393, 6223, -2708, -8607, 3166, -546, 481, 9682, -6266, -8527, +747, 8093, 2642, -9010, 2718, 4112, -2579, 6847, -3074, -9178, -2119, 7526, 7472, -9855, -3444, 5857, +-3365, 3420, 924, -5389, -1907, 5742, 11314, -7499, -9771, 5683, -449, 1030, 1881, -3193, -2720, 32, +10835, -2723, -13119, 4998, 5548, 2012, 1651, -2572, -1981, -4303, 7711, 3313, -13460, 265, 7820, 1986, +-1178, -4767, 95, -3787, 5417, 9736, -9485, -4641, 7041, 3217, -2058, -7648, 1198, -1101, 894, 10565, +-5929, -9648, 4201, 5783, 1685, -7172, 1797, 3658, -2015, 7682, -2141, -11766, 273, 6685, 5475, -7453, +-2566, 5547, -3246, 4004, 2348, -8433, -889, 6801, 8918, -6089, -8835, 5229, -1818, 207, 4054, -5552, +-3106, 3113, 8979, -2539, -12395, 4902, 4126, 201, 4230, -3173, -4229, -1252, 6659, 2102, -13706, 1264, +7859, 182, 1491, -2795, -3152, -1831, 5331, 8852, -10146, -3624, 8643, 1084, -1795, -4306, -2208, -1026, +1855, 11088, -6158, -9378, 6454, 4413, -527, -3962, -70, 2280, -1569, 8746, -2265, -13497, 1746, 6603, +1843, -4771, -2114, 4568, -3143, 4669, 3249, -11194, -774, 8571, 5556, -4979, -6993, 4351, -2420, -320, +5847, -7211, -3678, 6469, 7734, -2757, -10442, 4327, 3532, -1578, 6555, -3241, -6101, 1327, 6496, 514, +-12388, 755, 8320, -1552, 3454, -965, -5582, -1175, 5998, 6508, -9587, -4187, 9595, -786, -1389, -2135, +-4423, -1928, 3245, 9630, -5270, -9401, 8228, 3101, -1996, -1736, -1476, 511, 371, 8037, -1596, -13759, +3016, 6356, -443, -2456, -1201, 3013, -1233, 4979, 3458, -12117, -551, 9255, 2921, -3484, -5040, 2470, +-1965, 50, 6070, -8000, -4385, 8816, 5795, -2584, -7900, 2531, 2043, -1636, 6646, -3408, -7878, 3930, +5517, -1108, -10333, 583, 6506, -1598, 4579, 466, -7845, 813, 6013, 3658, -8692, -3026, 8568, -1118, +-858, 517, -6923, -1612, 5108, 7684, -5153, -7121, 8271, 2450, -2989, 798, -3372, -1385, 2385, 7642, +-2432, -12548, 3588, 5804, -2794, -59, -869, 221, 435, 5783, 2339, -12460, -641, 9222, -71, -2541, +-2442, 46, -1815, 1252, 5663, -8823, -4190, 10272, 4185, -2989, -4358, 1125, 653, -1443, 7049, -3891, +-8258, 6055, 5567, -3173, -7207, 388, 5151, -1634, 5766, 1137, -8837, 1622, 7131, 502, -7618, -2485, +7442, -1848, 202, 1935, -8107, -2329, 6866, 5376, -4870, -5898, 8049, 1494, -3225, 2202, -4409, -3644, +4219, 6605, -2662, -10703, 4021, 5095, -3808, 1402, -80, -1661, 2053, 6217, 1535, -11416, -417, 8677, +-1824, -1474, -469, -1332, -1020, 2511, 4581, -8275, -4103, 10825, 2744, -2791, -2057, -220, -603, -303, +5707, -4128, -8533, 7177, 4768, -3736, -5088, 94, 2837, -619, 5572, 1258, -9451, 2839, 6585, -1518, +-6298, -1698, 4892, -1078, 996, 3035, -8724, -1521, 7520, 3191, -4256, -3302, 6448, 1101, -2596, 3266, +-5524, -4253, 5561, 5227, -3157, -7802, 3996, 3970, -4002, 2819, -507, -3483, 3759, 6004, -216, -9935, +-59, 6971, -3263, -572, 769, -3614, 105, 3904, 3008, -8263, -2970, 9972, 1132, -2543, 697, -2214, +-1298, 859, 4882, -4962, -7332, 7879, 4138, -4596, -1414, -404, 929, 289, 6079, 569, -8816, 3629, +6657, -4027, -4238, -861, 2877, -1258, 2461, 3177, -8714, -1157, 8548, 502, -3876, -1637, 5016, 90, +-1906, 3672, -6211, -5442, 6939, 3542, -3846, -5256, 3856, 2968, -3895, 3653, -606, -5058, 4897, 5897, +-1552, -7991, 254, 5755, -4225, 529, 1944, -4610, 977, 5150, 1630, -6792, -2459, 9290, -196, -2023, +2299, -2986, -2081, 2223, 3047, -4584, -6599, 7929, 2992, -4399, 327, -503, -846, 1404, 4625, 172, +-8457, 4088, 5563, -5092, -2989, -391, 347, 51, 2381, 3051, -8035, -199, 8141, -1207, -3157, 75, +2650, 398, -973, 3501, -6322, -4891, 7245, 1931, -3541, -2233, 2788, 2252, -2688, 3798, -928, -5689, +5803, 4622, -2883, -5266, 165, 3546, -3826, 856, 2163, -5775, 2266, 5339, -320, -5368, -1176, 6731, +-1070, -1790, 3444, -4762, -1640, 3353, 1031, -4747, -4311, 6784, 2313, -4306, 3037, -1476, -1906, 2979, +3677, -1262, -6203, 3980, 4864, -6111, -540, -42, -1678, 1118, 3389, 1833, -6523, 507, 7981, -3235, +-2046, 1564, 158, -46, 328, 2500, -5936, -4703, 7664, 12, -3925, 648, 1637, 1002, -1412, 3520, +-1356, -6086, 6198, 3614, -4553, -2518, 361, 1896, -3395, 1401, 2368, -5943, 3016, 6286, -2359, -3255, +-86, 4901, -1481, -1247, 3938, -4836, -2020, 5064, -797, -3978, -2560, 5786, 1491, -3492, 3886, -1159, +-3317, 4317, 2000, -1939, -4815, 3411, 3498, -5999, 264, 846, -3768, 2272, 2938, 721, -4717, 904, +6721, -3835, -1923, 2863, -1971, 214, 1126, 1166, -4702, -3449, 6901, -743, -3716, 2986, 629, 545, +337, 2310, -1159, -5223, 5791, 2640, -5314, -136, 367, -50, -1419, 1010, 1942, -5302, 3342, 5772, +-3624, -1708, 1012, 1751, -999, -1193, 3266, -5090, -1537, 5252, -2444, -3450, 132, 3101, 1123, -2597, +4232, -1418, -3439, 5000, 561, -3395, -1516, 2180, 2150, -5117, 1424, 1006, -4283, 3351, 3143, -1364, +-1906, 1559, 4966, -4069, -1012, 3365, -3589, 317, 2509, -1128, -3454, -1743, 5606, -1534, -3384, 4543, +-631, -726, 2281, 855, -1945, -3750, 4696, 1237, -6038, 1859, 385, -2056, 118, 1179, 773, -3860, +3287, 5276, -5034, 66, 2362, -749, -951, -128, 2005, -3976, -1249, 5791, -3716, -2710, 2610, 1767, +100, -961, 3472, -937, -3598, 5500, -670, -4313, 435, 1666, 245, -3750, 1302, 1504, -4830, 3842, +2931, -3071, -411, 2075, 2566, -3542, -1091, 3518, -4456, -62, 3069, -2577, -2368, 40, 3827, -1624, +-2780, 5243, -844, -1464, 3409, -462, -1893, -1756, 3369, 299, -5573, 2754, 1054, -3207, 1693, 783, +-60, -1748, 3047, 3782, -4952, 442, 3174, -2674, -318, -15, 307, -3006, -449, 4477, -3927, -2340, +4305, -258, -105, 136, 1899, -1029, -2485, 4427, -1474, -4884, 2649, 486, -1207, -1834, 1266, 1040, +-3331, 3755, 2422, -4044, 1862, 2416, 122, -2507, -333, 2638, -3888, 217, 3277, -4133, -947, 2328, +1592, -1597, -1408, 4778, -1084, -1644, 3944, -2022, -2665, 825, 1833, -1244, -4637, 3146, 599, -3653, +2770, 633, -1849, 546, 2815, 1821, -4938, 1326, 3229, -3993, -64, 1174, -1805, -1421, 739, 3249, +-4170, -1073, 5543, -1023, -960, 2054, 471, -934, -1138, 3711, -2565, -4523, 4107, 490, -2900, -132, +966, 575, -2032, 3809, 1501, -4821, 2727, 3026, -2310, -2039, -32, 1472, -3323, 439, 2771, -5048, +-398, 3919, 47, -1865, -286, 3932, -1041, -1620, 3864, -3009, -2791, 2594, 900, -2293, -3043, 3040, +996, -3525, 3342, 422, -2265, 2265, 2953, -139, -3964, 1369, 3147, -4345, 269, 1084, -2667, -323, +1952, 1266, -3867, -534, 5868, -1645, -1015, 2204, -1059, -1155, 405, 1815, -3203, -4085, 4762, -39, +-3307, 855, 367, -211, 90, 3243, 326, -4599, 3696, 2718, -3576, -1160, 255, 190, -1781, 1097, +1888, -5074, 866, 4908, -1470, -1446, 1043, 2665, -815, -671, 2866, -4027, -2640, 4229, -343, -3130, +-1498, 2730, 264, -2440, 3221, -511, -3067, 4204, 2424, -2167, -3455, 1661, 1903, -4026, 544, 1040, +-4114, 1403, 3026, -414, -3822, 890, 5274, -1729, -795, 2911, -2563, -844, 1996, 787, -4208, -2563, +5195, -86, -3426, 2299, -234, -835, 1789, 3153, -1142, -4022, 4245, 2563, -4888, -643, 338, -1170, +-603, 1945, 593, -5306, 1702, 5389, -2650, -1634, 1801, 1375, -685, 124, 1901, -5175, -2256, 5277, +-889, -3802, 3, 2290, 361, -1399, 3293, -1368, -3002, 5290, 2616, -3532, -2329, 1555, 1361, -3518, +1188, 535, -4156, 2454, 4153, -1805, -3273, 1276, 4771, -1877, -303, 2461, -3467, -903, 3144, -880, +-4612, -1845, 5180, -320, -2894, 2362, -973, -1293, 3274, 2246, -2354, -3502, 4554, 1944, -5023, -257, +-84, -1957, 1155, 2434, -424, -4676, 2679, 5478, -3133, -1081, 2044, 119, 183, 1312, 655, -5510, +-1596, 5761, -1592, -3377, 1128, 1588, 162, 226, 2586, -2471, -3041, 6273, 1679, -4327, -1555, 1128, +-1, -2402, 1234, -262, -4646, 4116, 4310, -3099, -2802, 1911, 3308, -1418, 172, 2025, -4713, 221, +4167, -2131, -4891, -312, 4742, -68, -1935, 3188, -2097, -1200, 4892, 1587, -3576, -2398, 4567, 1569, +-4932, 592, -781, -2992, 2663, 3171, -1661, -4166, 3338, 5029, -3871, -735, 1980, -1595, 657, 2245, +-609, -6183, -1029, 5999, -2295, -3439, 2385, 599, 273, 1509, 2019, -3552, -2802, 6819, 1395, -5205, +-298, 721, -453, -1273, 1625, -1087, -4398, 5198, 5131, -4055, -1945, 1879, 2327, -1094, 730, 1297, +-5229, 422, 5236, -3313, -4810, 134, 4020, 100, -949, 2953, -2822, -1744, 5820, 443, -4441, -1899, +3983, 1092, -4395, 674, -1358, -3638, 4128, 3081, -2524, -3110, 3574, 4642, -3748, -554, 1646, -2706, +1748, 3086, -1845, -5585, -316, 5848, -2255, -2773, 2871, -231, 850, 3207, 781, -4166, -2621, 6711, +866, -5158, 439, -138, -1315, 559, 1122, -2013, -4242, 5851, 5006, -4530, -1230, 1562, 289, -39, +886, 186, -5629, 1354, 5606, -4214, -4325, 1261, 2572, 841, 294, 2771, -3423, -1213, 6806, -637, +-5170, -350, 3149, 1016, -3038, 1048, -1961, -3935, 5655, 3293, -3719, -1719, 3745, 3818, -3263, -370, +893, -4245, 2572, 4118, -3269, -5268, 288, 5068, -2172, -2416, 3342, -1578, 971, 4834, -380, -5034, +-2033, 5983, 568, -5263, 1511, -657, -1811, 2318, 1102, -2955, -3263, 6140, 5311, -4875, -228, 1607, +-1063, 841, 1327, -1060, -5110, 1773, 6445, -4622, -4027, 1978, 1319, 1286, 1631, 1781, -3608, -1384, +7171, -1374, -6071, 170, 2112, 661, -1511, 679, -2483, -4238, 6286, 3348, -4642, -708, 3390, 2870, +-2214, -617, 105, -4835, 2941, 4937, -4262, -4119, 1128, 4109, -1364, -1787, 3113, -1814, 1230, 6212, +-1476, -5081, -1288, 4839, 467, -4581, 1596, -791, -2099, 4140, 503, -3951, -2320, 5711, 4918, -4311, +-272, 1166, -2708, 1853, 1344, -2800, -4622, 2238, 6113, -4230, -3678, 2293, -308, 1946, 2917, 454, +-3618, -725, 6806, -1712, -6309, 1159, 894, 501, 754, 320, -2720, -3367, 6517, 3280, -5204, 559, +3266, 1553, -663, -629, -1162, -5103, 3272, 5335, -5086, -3347, 2048, 2552, -565, -1252, 2107, -2541, +1360, 7124, -2589, -5905, -279, 3093, 188, -3692, 1372, -1310, -2091, 5615, 438, -5296, -1015, 5098, +4300, -3529, 84, 783, -3604, 2628, 1947, -4443, -3498, 2747, 5806, -3433, -3009, 2616, -1368, 1935, +4359, -947, -3571, -60, 6123, -1903, -6576, 1330, 105, -97, 2611, -102, -3363, -2686, 6202, 3051, +-5883, 807, 2974, 264, 590, -818, -2678, -4788, 3125, 5623, -5355, -2737, 2936, 1493, 338, -313, +734, -2427, 1480, 7643, -2842, -5914, 570, 1952, 50, -2237, 777, -1031, -1703, 6594, 585, -5916, +-158, 4339, 3250, -2111, -362, 323, -4088, 2873, 2058, -5762, -2931, 3255, 4757, -2173, -2708, 2083, +-2067, 1996, 4898, -2374, -3641, 924, 4882, -1661, -6211, 1036, -463, -52, 4365, -496, -3709, -1005, +5588, 2692, -5378, 841, 2596, -497, 2178, -546, -4088, -3958, 3193, 5136, -4809, -2024, 3493, 323, +1232, 572, -1036, -2691, 1763, 7076, -2993, -6091, 1254, 343, -420, -769, -186, -1621, -669, 6787, +459, -6649, 657, 3458, 1869, -910, -411, -747, -3631, 3253, 2198, -6884, -1957, 3904, 3730, -875, +-1610, 1336, -2267, 2013, 5561, -3584, -3746, 2102, 3789, -1578, -5163, 422, -1088, -291, 5735, -559, +-4403, 125, 4908, 1741, -5034, 419, 1825, -1481, 3001, -238, -5635, -3347, 3088, 4220, -4368, -1579, +3758, -332, 1514, 1461, -2716, -2770, 2180, 6304, -2986, -5615, 1743, -168, -694, 691, -941, -1671, +467, 7016, 613, -6591, 915, 2906, 633, 404, -697, -1590, -3021, 3411, 2102, -7134, -1901, 4177, +2615, 331, -866, 160, -2600, 1872, 5072, -4334, -4030, 2676, 2504, -1320, -4085, -462, -1501, -7, +6144, -641, -4472, 1548, 4054, 890, -4036, -146, 1125, -1332, 3706, -1, -6208, -2122, 3284, 3125, +-3270, -938, 3536, -386, 2337, 1927, -4229, -2867, 2626, 4980, -2592, -4932, 1606, -941, -640, 1787, +-1916, -2398, 1775, 6426, 380, -6119, 766, 1555, -433, 1317, -885, -2798, -1850, 3515, 1559, -6983, +-1067, 4026, 1576, 1511, 273, -1002, -2085, 2111, 4325, -4909, -3508, 3464, 1641, -958, -2309, -1238, +-1761, 754, 6391, -937, -4258, 2665, 3387, -62, -3065, -885, -153, -1248, 4395, 95, -6884, -1271, +3173, 1797, -2320, -500, 2689, -561, 2789, 2232, -5529, -3021, 2839, 3561, -2353, -3607, 1529, -1244, +-342, 2736, -2548, -2325, 2986, 5936, 235, -4986, 908, 856, -1252, 2198, -1035, -3255, -464, 3849, +1079, -6283, -769, 3860, 846, 2458, 859, -1976, -1894, 2246, 3198, -5321, -3527, 3539, 805, -301, +-1144, -2190, -2111, 1230, 5946, -1040, -4041, 3290, 2508, -651, -2057, -1692, -1138, -685, 4544, 275, +-6307, -131, 2986, 871, -1146, -62, 2136, -69, 3293, 2190, -6018, -2599, 2866, 2024, -1593, -2511, +1282, -1036, 173, 2987, -3255, -2490, 3872, 4880, 168, -4048, 234, -262, -1549, 2357, -1655, -3869, +866, 3652, 661, -5360, -681, 2897, 365, 3285, 1193, -3038, -961, 2198, 1869, -5058, -2931, 3332, +370, 634, 435, -2824, -1739, 1922, 5064, -1109, -3050, 3774, 1704, -927, -910, -2606, -1965, 10, +4443, 201, -5667, 907, 2620, -312, -185, -182, 827, 443, 3522, 1719, -6633, -2504, 2594, 488, +-1104, -1394, 599, -715, 924, 3143, -4014, -2440, 4486, 3767, 176, -2546, -238, -829, -1695, 2737, +-1925, -3914, 2367, 3710, 313, -3745, -512, 2238, -168, 3649, 1486, -3468, -316, 2189, 509, -4775, +-2785, 3080, -1, 1126, 1422, -3229, -1524, 2154, 3541, -1324, -2929, 3741, 1302, -1461, -409, -3338, +-2511, 612, 3712, 448, -4602, 1611, 2784, -961, 215, -480, 282, 1123, 3074, 1626, -5927, -2223, +2606, -589, -537, -522, 726, 578, 1072, 2778, -3513, -2665, 4419, 2504, -22, -1700, -561, -572, +-1955, 1607, -1763, -3716, 3248, 3389, 190, -2664, -902, 1926, -515, 2279, 1355, -3571, 624, 2015, +-643, -4012, -2784, 2857, 714, 997, 2240, -2708, -622, 2401, 1892, -1285, -2567, 3415, 1747, -1617, +88, -3232, -2364, 1263, 2631, 812, -3187, 2004, 3253, -1631, 26, -733, -716, 1569, 2184, 1137, +-4950, -2179, 2614, -1441, -942, 175, 512, 1692, 1159, 2007, -3237, -2917, 4093, 1462, -885, -716, +-715, 220, -1618, 666, -1426, -3369, 3910, 3832, -255, -1288, -834, 1680, -574, 958, 1204, -3249, +1050, 2692, -1401, -3327, -2534, 2553, 1084, 550, 2763, -2036, -597, 2679, 249, -1853, -2577, 2677, +2116, -2065, 236, -2538, -2650, 1738, 1738, 372, -2038, 2184, 3910, -2025, -686, -706, -1407, 1756, +1728, 607, -3564, -1721, 3318, -1557, -1563, 865, 621, 2528, 1758, 1234, -2483, -3290, 3699, 1049, +-1933, -132, -255, 657, -805, -183, -1091, -3358, 3847, 4131, -808, -745, -531, 1053, -677, -666, +837, -3098, 1089, 3483, -1842, -2975, -1758, 2015, 1540, -133, 2684, -1036, -422, 3163, -696, -2765, +-2222, 2183, 2672, -1965, 352, -1285, -2414, 2339, 1292, -414, -1191, 2257, 4496, -1942, -1658, -469, +-2300, 1474, 1637, -158, -2594, -1157, 3588, -1293, -2653, 1138, 340, 2366, 2136, 502, -2315, -3327, +2899, 701, -3324, 297, 328, 981, 168, -640, -997, -2897, 3336, 4530, -1671, -452, 338, 729, +-564, -1713, 18, -2509, 1057, 4559, -1767, -2841, -803, 1703, 1540, -694, 1991, -398, -660, 3629, +-1189, -4075, -2119, 1506, 2625, -1744, 146, -144, -2366, 2412, 1183, -1802, -924, 2193, 4341, -1766, +-2362, -244, -2683, 876, 1777, -978, -1637, -76, 4099, -760, -3416, 1249, 446, 1829, 2755, -217, +-2076, -2732, 2518, 621, -4346, 122, 1374, 1101, 1380, -647, -1312, -2678, 2813, 4356, -2441, -944, +1141, 197, -430, -2242, -1010, -2432, 941, 5197, -1465, -2975, 458, 1247, 1117, -1024, 980, -102, +-609, 3890, -1075, -5035, -1559, 1401, 2227, -1252, 220, 970, -1649, 2768, 1304, -3226, -960, 2436, +3941, -1407, -2800, 79, -2710, 379, 2125, -1862, -1573, 1290, 4339, -294, -3997, 842, 16, 832, +2955, -694, -2650, -1907, 2272, 430, -5146, 18, 1925, 910, 2363, -60, -1840, -2117, 2270, 3880, +-3275, -1298, 2158, 76, -274, -1750, -1848, -2092, 1170, 5635, -1155, -2878, 1763, 1346, 400, -1204, +-210, -348, -541, 4302, -781, -5922, -1059, 1509, 1431, -835, 85, 1364, -1102, 2944, 1525, -4765, +-1593, 2495, 3022, -1269, -2589, 269, -2446, 124, 2541, -2577, -1523, 2575, 4533, 98, -3811, 670, +-115, -267, 3154, -1007, -2867, -555, 2647, 367, -5195, -239, 2619, 725, 3129, 556, -2275, -1710, +2097, 2914, -4117, -2073, 2790, -39, 119, -1147, -2679, -2151, 1380, 5471, -990, -3096, 2755, 1282, +-303, -1175, -1475, -1070, -240, 4373, -260, -5888, -230, 1835, 719, -340, 149, 1561, -209, 3297, +1742, -5619, -1857, 2572, 1864, -907, -2091, 606, -1627, 273, 2771, -3232, -1904, 3701, 4264, 264, +-3498, 75, -652, -1089, 2770, -1611, -3545, 798, 2974, 307, -4953, -546, 2403, 404, 3597, 1034, +-3086, -888, 2007, 1741, -4570, -2420, 3032, 86, 769, 286, -3080, -1750, 1907, 4902, -996, -2694, +3580, 1326, -784, -692, -2575, -1868, 156, 4375, 76, -5534, 825, 2262, -325, 37, -131, 772, +458, 3507, 1617, -6523, -2357, 2511, 469, -953, -1341, 488, -805, 910, 3083, -4006, -2359, 4465, +3714, 199, -2514, -257, -847, -1680, 2744, -1925, -3914, 2364, 3687, 338, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7941, -6342, -2936, +1111, 4708, 7292, 8933, 10190, 11600, 13269, 14706, 15213, 14129, 11429, 7702, 4196, 1893, 1476, 2551, +4275, 5478, 5466, 3990, 1526, -1166, -3523, -5665, -8114, -11454, -15928, -21122, -26056, -29452, -30357, -28623, +-24910, -20345, -16099, -12614, -9874, -7368, -4612, -1430, 1726, 3992, 4818, 4056, 2424, 975, 840, 2470, +5722, 9508, 12817, 14688, 15085, 14466, 13503, 12598, 11846, 10672, 8432, 4801, 310, -4110, -7172, -7941, +-6342, -2936, 1111, 4708, 7292, 8933, 10190, 11600, 13269, 14706, 15213, 14129, 11429, 7702, 4196, 1893, +1476, 2551, 4275, 5478, 5466, 3990, 1526, -1166, -3523, -5665, -8114, -11454, -15928, -21122, -26056, -29452, +-30357, -28623, -24910, -20345, -16099, -12614, -9874, -7368, -4612, -1430, 1726, 3992, 4818, 4056, 2424, 975, +840, 2470, 5722, 9508, 12817, 14688, 15085, 14466, 13503, 12598, 11846, 10672, 8432, 4801, 310, -4110, +-7172, -7941, -6342, -2936, 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 544, 918, 188, -1261, -519, 1256, 2, -4039, -3893, 2199, +3180, 994, -415, 89, 5694, 7899, 6329, 789, -1127, 4592, -2940, -9106, -3697, -7578, -9017, -5684, +-9246, -8704, -2410, 3258, 7017, 4016, 7714, 13566, 11321, 13309, 8291, 1555, 1392, -6361, -7195, -501, +-3353, -5634, -3802, -2058, -7737, -11162, -298, 6538, 2051, 2281, 4029, 831, -5085, -9424, -7046, -9038, +-6085, 4586, 5828, 6974, 9700, 5068, 233, 590, 8370, 16583, 15931, 16361, 18315, 10811, -8301, -24499, +-27917, -27328, -24856, -16915, -5053, 4119, 102, -11114, -17488, -17534, -7491, 4914, 15076, 25873, 32103, 29270, +17155, 3540, -944, -2513, -7034, -3408, 9244, 19387, 16753, 4408, -7520, -18493, -22333, -15086, -4828, 1072, +8879, 15483, 6526, -6594, -13122, -13890, -9464, -6761, -1372, 7478, 10726, 8983, 1557, -7893, -10041, -6370, +1261, 10086, 13859, 16921, 13685, -235, -11127, -13240, -10449, -6391, 422, 8071, 9509, 4103, -5788, -14185, +-16921, -15199, -8911, -788, 10074, 17022, 11923, 3522, -1806, -1219, 1653, 1961, 5367, 9907, 6239, 335, +-6046, -14123, -15224, -11855, -4777, 6018, 14647, 20439, 18346, 6538, -3265, -11385, -16914, -12902, -6564, 244, +6731, 6540, 1200, -6817, -12445, -10962, -4557, 5290, 15078, 18665, 13885, 3718, -7559, -15892, -16874, -9086, +1755, 10386, 15709, 14860, 7554, -3227, -11991, -13012, -9130, -1264, 6799, 10454, 9934, 3804, -3450, -8116, +-8717, -4068, 2769, 8506, 10069, 6007, -496, -8369, -15529, -16872, -10704, -386, 9172, 14437, 14064, 8190, +-1985, -10856, -14318, -11646, -4951, 2007, 6084, 6331, 3460, -2941, -9294, -10981, -6837, 1753, 10786, 16498, +17834, 14455, 6688, -2508, -8816, -7745, -565, 7415, 13106, 14162, 10973, 4240, -5447, -13013, -14846, -10763, +-2940, 5148, 10369, 11151, 7315, -375, -8533, -13214, -11073, -4190, 2231, 5182, 4461, 234, -9062, -19819, +-25331, -22148, -12192, 220, 11262, 17143, 15767, 8130, -2712, -10626, -11019, -5030, 2004, 7483, 11215, 10844, +5108, -3105, -8630, -8096, -1891, 6566, 14418, 19519, 19896, 13363, 1605, -8679, -12920, -9600, -759, 8440, +15030, 16404, 10086, -1515, -12133, -17277, -15171, -7545, 1828, 10269, 13695, 10157, 1511, -8775, -14880, -14272, +-9372, -3428, 287, 244, -3337, -10823, -19252, -23212, -19487, -9188, 2618, 12324, 18127, 17623, 10127, -1646, +-10782, -12668, -7980, -7, 7587, 13382, 15178, 10125, 1280, -5257, -6460, -2091, 5056, 12077, 16901, 17481, +11902, 1102, -8737, -11849, -7898, 531, 9682, 16507, 18398, 12781, 1401, -10273, -16332, -14604, -8252, -619, +6724, 10953, 9022, 1503, -7362, -12768, -12737, -8524, -2847, 1460, 1850, -1956, -8984, -17553, -22219, -19291, +-11409, -1025, 8723, 14628, 15028, 8433, -1655, -9713, -13046, -10745, -4383, 2369, 7962, 10464, 7490, 921, +-4210, -4345, 93, 6583, 12892, 17496, 18655, 14655, 6174, -2027, -5509, -3225, 2446, 9087, 14150, 15369, +11826, 3366, -6047, -11155, -10834, -6445, -502, 5189, 9080, 7945, 1894, -5682, -11369, -12676, -10350, -6809, +-3584, -2586, -5048, -10855, -17689, -20793, -18058, -10913, -1842, 6754, 12403, 12906, 7521, -1457, -9071, -12164, +-10787, -6011, 7, 5411, 9055, 8170, 3421, -474, -912, 2366, 7538, 12141, 15723, 16848, 13370, 6227, +-1271, -5163, -3662, 1014, 7017, 12529, 14947, 12794, 5239, -4132, -9959, -10865, -8084, -3282, 2487, 7124, +7638, 3401, -3100, -8525, -11576, -12212, -10482, -7567, -5276, -4972, -8092, -13119, -16128, -15271, -10045, -2417, +5965, 13484, 16174, 12689, 4807, -3600, -9072, -10681, -7929, -1723, 5195, 10357, 10566, 5931, 661, -2403, +-2198, 745, 4947, 9658, 12527, 10711, 4496, -2717, -7143, -7447, -3760, 2225, 8535, 12871, 12160, 5660, +-3216, -9923, -11967, -9668, -4419, 2917, 9577, 11768, 8675, 2288, -4010, -7810, -9099, -8197, -5737, -3224, +-2532, -5229, -10209, -13682, -13750, -10057, -3134, 5051, 12509, 15580, 12478, 5122, -2991, -9065, -11548, -9782, +-4762, 1768, 7150, 8275, 5117, 918, -2037, -2642, -482, 3511, 8210, 11807, 11277, 6698, 427, -4286, +-5539, -3590, 1219, 7100, 11443, 11833, 7124, -667, -7846, -11772, -11111, -6484, 594, 7924, 11739, 10090, +4496, -2145, -7046, -9352, -9037, -6435, -3395, -2179, -4375, -9155, -13603, -14843, -12145, -6222, 1884, 9959, +14274, 12374, 5387, -2839, -9158, -12202, -10679, -5013, 2575, 9450, 11784, 9023, 4651, 889, -735, 566, +4344, 9926, 14213, 13968, 9325, 2274, -3841, -6353, -4967, -70, 6502, 11443, 11979, 7210, -681, -7931, +-12474, -12818, -8668, -1441, 6116, 10260, 8927, 3308, -3856, -9924, -12973, -12502, -9104, -4993, -2741, -4030, +-8529, -13028, -14985, -13206, -7400, 1049, 9905, 15261, 14339, 7985, -413, -7761, -12072, -11469, -6182, 1884, +9496, 12655, 10474, 5601, 889, -1705, -991, 3101, 9519, 15078, 16071, 12141, 5434, -1316, -5446, -5271, +-840, 6075, 11981, 13351, 9037, 618, -8135, -14083, -15374, -11016, -2964, 5224, 10016, 9110, 3197, -4974, +-12141, -15955, -15435, -11288, -6009, -2576, -3216, -7627, -12928, -16128, -14916, -8697, 743, 10540, 16662, 16286, +10070, 931, -7242, -11435, -10282, -4205, 4332, 12025, 15092, 12066, 5970, 186, -2951, -1896, 3096, 10357, +16434, 17342, 12653, 4791, -2870, -6777, -5882, -701, 6681, 12592, 13741, 8833, 59, -8670, -14422, -15232, +-10498, -2226, 6079, 10437, 8621, 1790, -6899, -13715, -16523, -15004, -9970, -4547, -1854, -3313, -8271, -13721, +-16829, -15304, -8761, 786, 10701, 16390, 15512, 9393, 419, -7393, -11034, -9210, -2471, 5999, 12953, 15057, +11235, 4776, -903, -3472, -1641, 3828, 11060, 16498, 16788, 11873, 3770, -3759, -7525, -6226, -137, 7414, +13012, 13653, 7956, -1314, -10220, -15411, -14923, -9260, -383, 7845, 11399, 8975, 1717, -6972, -13458, -15804, +-13464, -7950, -2552, -299, -2958, -8926, -14981, -18004, -15474, -8184, 1886, 11773, 16852, 15267, 8004, -1593, +-9367, -12863, -10571, -3360, 5536, 12514, 14132, 10088, 3232, -2736, -5001, -2476, 4026, 11836, 17349, 17524, +11996, 3369, -4547, -8428, -6850, -689, 7439, 13309, 13840, 8636, -506, -9627, -14868, -14315, -8159, 1077, +9343, 12876, 9984, 2104, -6959, -13437, -15290, -12382, -6303, -573, 1401, -1398, -7942, -14909, -18343, -16220, +-8758, 1804, 11697, 16673, 14519, 6513, -3472, -11324, -14046, -10687, -2797, 6321, 12785, 13600, 8557, 1039, +-4927, -6656, -3187, 4286, 12779, 18387, 18120, 11868, 2555, -5578, -8949, -6542, 622, 9434, 15331, 15339, +9009, -1194, -10700, -15765, -14737, -7883, 2085, 10658, 13977, 10687, 2402, -7231, -14164, -15927, -12596, -6087, +-151, 1755, -1251, -7928, -14882, -18296, -16080, -8450, 2277, 12284, 17133, 14964, 7109, -2939, -10894, -13861, +-10873, -3144, 5885, 12150, 12936, 7992, 501, -5272, -6772, -3269, 4050, 12246, 17538, 16988, 10681, 1595, +-6237, -9469, -6967, 40, 8213, 13453, 13114, 6861, -2838, -11601, -15771, -13763, -6407, 3248, 11015, 13357, +9415, 1213, -7675, -13565, -14413, -10375, -3832, 1501, 2763, -801, -7625, -14311, -17192, -14230, -6128, 4347, +13636, 17617, 14540, 6111, -3784, -10866, -12833, -8950, -793, 7829, 13280, 13162, 7599, -41, -5808, -6990, +-3040, 4311, 12133, 16741, 15597, 8849, -545, -8246, -11010, -7921, -453, 7971, 13316, 12761, 6270, -3331, +-11956, -15896, -13536, -5886, 4006, 11904, 14288, 10112, 1223, -8135, -13982, -14598, -10239, -3318, 2379, 3655, +-422, -7777, -14917, -18059, -15054, -6759, 4077, 13649, 17836, 14926, 6368, -3767, -11043, -12955, -8862, -676, +8142, 13607, 12984, 7139, -700, -6540, -7662, -3565, 4282, 12453, 17055, 15854, 9012, -348, -8142, -11169, +-8013, -550, 7763, 12926, 11947, 5340, -4106, -12546, -16031, -13313, -5547, 4227, 11593, 13556, 9189, 599, +-8345, -14191, -14592, -10096, -3444, 2172, 3534, -244, -7335, -14315, -17214, -14177, -5963, 4689, 13899, 17984, +15170, 6958, -2677, -9789, -11595, -7648, 186, 8617, 13657, 13109, 7336, -578, -6202, -7156, -2841, 4988, +12890, 17412, 15980, 9000, -217, -7911, -10796, -7777, -681, 7373, 12158, 11125, 4615, -4806, -12982, -16434, +-13788, -6067, 3426, 10703, 12509, 8062, -253, -8955, -14640, -15074, -10760, -4012, 1441, 2629, -822, -7524, +-13952, -16700, -13786, -5707, 4654, 13673, 17434, 14560, 6790, -2560, -9271, -10662, -6622, 1200, 9381, 14147, +13637, 8035, 409, -5126, -6085, -1840, 5586, 13119, 17374, 15954, 9305, 303, -7060, -9787, -6914, -190, +7020, 11330, 10229, 3891, -4990, -12838, -16207, -13769, -6623, 2463, 9461, 11176, 7006, -1067, -9571, -14975, +-15342, -11113, -4742, 458, 1671, -1816, -8107, -14054, -16493, -13357, -5365, 4770, 13351, 16761, 13933, 6321, +-2507, -8649, -9747, -5470, 2214, 9994, 14481, 13714, 8265, 1070, -4287, -5236, -1292, 5788, 12985, 16921, +15756, 9635, 1125, -6014, -8917, -6473, -312, 6452, 10463, 9356, 3387, -5119, -12606, -15752, -13387, -6541, +2100, 8790, 10570, 6701, -1122, -9419, -14752, -15213, -11306, -5251, -173, 1130, -1932, -7803, -13506, -15662, +-12644, -5137, 4293, 12180, 15528, 13033, 6013, -2169, -7909, -8838, -4820, 2332, 9761, 13939, 13072, 7820, +878, -4058, -4770, -899, 5974, 12759, 16460, 15340, 9503, 1566, -5035, -7560, -5166, 478, 6607, 9913, +8420, 2463, -5769, -12736, -15436, -12827, -5959, 2371, 8447, 9657, 5469, -2174, -10084, -15015, -15171, -11199, +-5251, -544, 549, -2368, -7842, -12895, -14636, -11563, -4326, 4565, 11923, 14928, 12446, 5764, -1893, -7108, +-7724, -3744, 3186, 10147, 13996, 13085, 7705, 898, -3734, -4196, -182, 6423, 12795, 16187, 14928, 9208, +1564, -4509, -6630, -4221, 1101, 6619, 9330, 7528, 1666, -6065, -12350, -14560, -11868, -5299, 2460, 7919, +8698, 4402, -3114, -10505, -14937, -15054, -11214, -5626, -1469, -859, -4045, -9318, -13803, -14926, -11364, -3956, +4707, 11465, 13779, 10912, 4335, -2789, -7313, -7301, -2808, 4227, 10834, 14103, 12814, 7554, 1125, -3022, +-3061, 1220, 7841, 13813, 16693, 15195, 9633, 2479, -3177, -5082, -2683, 2330, 7260, 9348, 7191, 1195, +-6308, -12276, -14189, -11272, -4872, 2386, 7244, 7636, 3209, -4296, -11673, -16055, -16067, -12416, -7252, -3342, +-2687, -5580, -10396, -14434, -15227, -11388, -3980, 4429, 10913, 13046, 10386, 4215, -2344, -6216, -5703, -1000, +5790, 11988, 14994, 13541, 8358, 2269, -1568, -1428, 2698, 8874, 14312, 16721, 14846, 9210, 2242, -3095, +-4713, -2282, 2463, 6840, 8326, 5714, -376, -7625, -13119, -14558, -11336, -4884, 2154, 6635, 6586, 2023, +-5227, -12207, -16216, -15930, -12038, -6832, -3066, -2505, -5252, -9770, -13438, -13876, -9939, -2676, 5376, 11417, +13191, 10359, 4336, -2015, -5701, -5139, -574, 5944, 11777, 14507, 13019, 8016, 2065, -1689, -1524, 2402, +8209, 13305, 15485, 13823, 8763, 2298, -2672, -4273, -2256, 1879, 5659, 6801, 4358, -1106, -7578, -12364, +-13457, -10361, -4395, 2036, 6210, 6258, 2128, -4467, -10924, -14710, -14604, -11307, -6779, -3469, -2969, -5373, +-9246, -12362, -12508, -8679, -1996, 5334, 10660, 12116, 9450, 3845, -1898, -5093, -4418, -148, 5830, 11094, +13429, 11860, 7229, 1809, -1593, -1334, 2414, 7863, 12565, 14611, 13052, 8326, 2377, -2130, -3498, -1535, +2256, 5541, 6281, 3636, -1756, -7907, -12246, -13026, -9845, -3983, 2156, 5985, 5858, 1779, -4630, -10842, +-14437, -14326, -11209, -6997, -4025, -3677, -5940, -9467, -12017, -11705, -7792, -1254, 5596, 10246, 11206, 8449, +3264, -1893, -4690, -3749, 476, 6113, 10946, 12950, 11416, 7107, 2216, -728, -293, 3353, 8428, 12590, +14203, 12643, 8309, 2909, -1185, -2436, -652, 2763, 5538, 5881, 3098, -2153, -8040, -12246, -12948, -9827, +-4161, 1690, 5272, 5042, 999, -5305, -11520, -15268, -15423, -12624, -8651, -5673, -5001, -6792, -9778, -11908, +-11438, -7538, -1164, 5485, 10091, 11247, 8795, 3964, -885, -3521, -2589, 1494, 6911, 11646, 13774, 12509, +8537, 3821, 815, 1031, 4273, 8932, 12912, 14480, 13064, 8976, 3752, -366, -1894, -582, 2243, 4579, +4666, 1884, -3072, -8553, -12459, -13168, -10341, -5090, 440, 3888, 3738, -7, -5833, -11709, -15408, -15728, +-13266, -9619, -6778, -6003, -7427, -9887, -11505, -10713, -6798, -607, 5736, 10037, 11080, 8732, 4225, -280, +-2741, -1844, 1981, 7131, 11655, 13738, 12649, 9008, 4615, 1777, 1873, 4776, 9044, 12692, 14174, 12824, +9034, 4266, 388, -1115, -12, 2419, 4450, 4354, 1519, -3255, -8441, -12057, -12699, -10050, -5170, -129, +2999, 2741, -798, -6305, -11838, -15449, -16002, -13826, -10574, -7989, -7187, -8231, -10090, -11272, -10241, -6370, +-512, 5413, 9475, 10503, 8483, 4565, 589, -1515, -611, 3009, 7803, 11983, 13908, 12906, 9627, 5567, +2854, 2818, 5345, 9089, 12262, 13535, 12247, 8801, 4460, 912, -545, 257, 2177, 3672, 3279, 453, +-4087, -8902, -12188, -12650, -10065, -5451, -594, 2490, 2395, -875, -6133, -11471, -15032, -15755, -13920, -10949, +-8476, -7579, -8359, -9871, -10719, -9653, -5980, -509, 5040, 8917, 9896, 8005, 4358, 629, -1297, -447, +2963, 7611, 11670, 13690, 12909, 9886, 6152, 3542, 3346, 5602, 9017, 11986, 13277, 12204, 9123, 5182, +1883, 377, 886, 2442, 3522, 2888, 32, -4329, -8819, -11950, -12447, -10112, -5911, -1427, 1433, 1403, +-1584, -6454, -11514, -15037, -15955, -14470, -11826, -9533, -8576, -9003, -10021, -10411, -9080, -5478, -291, 4936, +8660, 9674, 8024, 4691, 1275, -438, 507, 3915, 8440, 12368, 14291, 13527, 10668, 7066, 4524, 4277, +6213, 9260, 11941, 13075, 12051, 9184, 5416, 2114, 491, 699, 1946, 2825, 2091, -694, -4883, -9160, +-12008, -12494, -10303, -6295, -2027, 864, 1034, -1656, -6305, -11306, -14948, -16173, -14972, -12451, -10052, -8795, +-8886, -9595, -9808, -8488, -5045, -142, 4831, 8380, 9419, 7953, 4917, 1702, -20, 732, 3854, 8134, +11995, 14082, 13595, 10947, 7502, 4945, 4446, 6075, 8829, 11402, 12601, 11801, 9288, 5873, 2776, 1065, +953, 1813, 2439, 1669, -924, -4874, -8921, -11683, -12204, -10167, -6386, -2218, 638, 881, -1669, -6188, +-11089, -14810, -16221, -15266, -12955, -10665, -9280, -9095, -9494, -9484, -8184, -4943, -332, 4392, 7900, 9139, +8008, 5267, 2316, 680, 1332, 4227, 8283, 12048, 14199, 13952, 11616, 8345, 5701, 4826, 5920, 8287, +10691, 12029, 11603, 9456, 6280, 3156, 1122, 599, 1059, 1474, 764, -1636, -5276, -9022, -11689, -12338, +-10593, -7066, -3001, 2, 555, -1632, -5905, -10880, -14801, -16482, -15741, -13468, -10981, -9240, -8640, -8716, +-8567, -7306, -4321, -23, 4450, 7845, 9152, 8207, 5686, 2810, 1096, 1596, 4337, 8320, 12102, 14383, +14286, 12049, 8741, 6008, 5000, 5880, 8082, 10442, 11863, 11637, 9719, 6641, 3468, 1247, 406, 623, +948, 321, -1870, -5295, -8958, -11630, -12450, -10944, -7608, -3637, -472, 399, -1445, -5498, -10510, -14766, +-16887, -16551, -14429, -11756, -9571, -8393, -8074, -7773, -6648, -4017, -124, 4099, 7499, 9096, 8612, 6429, +3702, 1854, 2004, 4320, 7996, 11732, 14230, 14511, 12626, 9450, 6483, 5015, 5410, 7242, 9519, 11188, +11409, 9952, 7151, 3972, 1431, 115, -46, 78, -474, -2377, -5469, -8826, -11498, -12439, -11138, -8035, +-4092, -807, 408, -1123, -5074, -10123, -14623, -17112, -17064, -15081, -12295, -9847, -8330, -7709, -7403, -6425, +-4064, -425, 3689, 7138, 8951, 8723, 6772, 4079, 2099, 2013, 4143, 7822, 11708, 14478, 15073, 13355, +10207, 7053, 5258, 5391, 7141, 9538, 11442, 11917, 10593, 7802, 4437, 1665, 182, -114, 21, -398, +-2082, -5000, -8344, -11127, -12270, -11204, -8204, -4296, -941, 405, -1020, -4947, -10159, -14846, -17471, -17536, +-15542, -12668, -9999, -8239, -7470, -7095, -6240, -4079, -626, 3365, 6838, 8805, 8706, 6793, 4027, 1877, +1644, 3704, 7420, 11487, 14484, 15248, 13643, 10461, 7124, 5051, 4933, 6613, 9100, 11248, 12000, 10859, +8141, 4654, 1647, -90, -522, -301, -502, -1920, -4617, -7898, -10771, -12173, -11373, -8488, -4529, -899, +841, -255, -4040, -9416, -14523, -17616, -17977, -16029, -12940, -9913, -7839, -6953, -6722, -6230, -4470, -1282, +2734, 6448, 8740, 8995, 7245, 4375, 1952, 1388, 3243, 6969, 11256, 14597, 15646, 14162, 10893, 7221, +4728, 4295, 5817, 8414, 10822, 11893, 11055, 8341, 4743, 1489, -486, -980, -694, -661, -1796, -4278, +-7526, -10527, -12193, -11642, -8861, -4763, -831, 1249, 432, -3346, -8954, -14421, -17895, -18495, -16591, -13302, +-9994, -7632, -6540, -6373, -6084, -4622, -1684, 2218, 6011, 8569, 9090, 7449, 4543, 1904, 1104, 2802, +6556, 11113, 14777, 16205, 14933, 11616, 7700, 4828, 4032, 5355, 8018, 10656, 12095, 11530, 8937, 5277, +1770, -425, -1070, -786, -580, -1525, -3866, -7133, -10318, -12232, -11976, -9362, -5247, -1133, 1252, 696, +-2969, -8664, -14444, -18265, -19114, -17258, -13811, -10234, -7626, -6433, -6273, -6143, -4882, -2076, 1802, 5751, +8535, 9283, 7830, 4906, 2088, 1009, 2526, 6286, 11015, 14959, 16693, 15577, 12158, 7957, 4703, 3618, +4867, 7665, 10634, 12362, 12007, 9498, 5675, 1967, -419, -1127, -660, -225, -921, -3158, -6551, -10031, +-12350, -12432, -9997, -5827, -1432, 1331, 1059, -2494, -8345, -14405, -18557, -19681, -17851, -14274, -10461, -7626, +-6381, -6347, -6491, -5547, -2917, 970, 5145, 8249, 9334, 8113, 5227, 2311, 1014, 2351, 6077, 10941, +15195, 17225, 16317, 12978, 8622, 5062, 3636, 4667, 7472, 10671, 12696, 12580, 10156, 6275, 2385, -250, +-1123, -692, -133, -629, -2781, -6254, -9977, -12648, -13072, -10876, -6702, -2092, 992, 1060, -2348, -8218, +-14495, -18900, -20161, -18315, -14481, -10331, -7239, -5901, -6040, -6488, -5893, -3501, 429, 4848, 8329, 9742, +8654, 5662, 2463, 850, 1991, 5799, 10965, 15645, 17991, 17221, 13705, 8978, 4961, 3142, 4014, 6914, +10406, 12741, 12827, 10376, 6279, 2066, -826, -1776, -1253, -372, -544, -2474, -5943, -9942, -12943, -13763, +-11816, -7641, -2842, 641, 1033, -2128, -7941, -14379, -19023, -20508, -18708, -14689, -10279, -6896, -5391, -5489, +-6079, -5735, -3570, 229, 4695, 8436, 10122, 9260, 6392, 3084, 1251, 2154, 5833, 11065, 15906, 18529, +17957, 14480, 9582, 5252, 3125, 3764, 6663, 10330, 12941, 13270, 10972, 6853, 2507, -589, -1765, -1320, +-410, -467, -2300, -5795, -9923, -13206, -14316, -12621, -8554, -3589, 125, 850, -2088, -7898, -14466, -19404, +-21176, -19535, -15460, -10747, -7035, -5266, -5262, -5948, -5854, -3982, -327, 4242, 8184, 10244, 9698, 6932, +3583, 1508, 2134, 5596, 10846, 15929, 18849, 18558, 15202, 10187, 5578, 3074, 3409, 6222, 10013, 12911, +13515, 11378, 7302, 2841, -467, -1786, -1392, -376, -235, -1915, -5369, -9673, -13232, -14720, -13323, -9349, +-4375, -448, 477, -2323, -8054, -14724, -19802, -21698, -20049, -15796, -10831, -6838, -4879, -4883, -5735, -5914, +-4258, -675, 3943, 8169, 10527, 10178, 7465, 3980, 1744, 2185, 5591, 10899, 16131, 19237, 19053, 15732, +10585, 5766, 3066, 3270, 6074, 9950, 12956, 13644, 11545, 7442, 2914, -458, -1825, -1440, -406, -240, +-1907, -5369, -9661, -13220, -15329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 193, -89, -2, -52, -55, -80, -96, -100, -84, -67, +-31, 7, 25, 33, 45, 29, 14, 0, -9, 11, 42, 62, 91, 89, 63, 42, +15, -12, -9, -1, 9, 45, 70, 87, 97, 87, 52, 21, -12, -43, -57, -50, +-32, -21, -14, -19, -43, -53, -57, -59, -62, -53, -43, -38, -46, -79, -128, -183, +-224, -271, -328, -360, -318, -301, -523, -589, -98, 612, 1221, 1467, 1200, 571, -151, -644, +-1129, -1846, -1627, -552, -149, -562, -480, 493, 650, -543, -1408, 1115, 5317, 5512, 2275, -1646, +-4027, -2077, 1032, 503, -2749, -6028, -7382, -6266, -4491, -1057, 7024, 13429, 10825, 3777, -3422, -8524, +-7599, -1794, 7109, 12385, 6403, -3316, -7782, -6634, 1950, 13101, 11350, -436, -6831, -4945, 6185, 18622, +18422, 8270, -3930, -16226, -23219, -18776, -7628, 4676, 14601, 19367, 15602, -3584, -25984, -31624, -20739, -4471, +8100, 7874, -1957, -4027, 3961, 10472, 3969, -14621, -25260, -17787, -3358, 11320, 22047, 21600, 14079, 7191, +4443, 169, -12488, -22351, -15925, 4671, 25478, 29815, 14976, -2653, -8903, -6499, -3090, -7960, -18627, -18869, +-5371, 13729, 23021, 11189, -7254, -12518, -4109, 7021, 7759, -4345, -13583, -8543, 6833, 21945, 22068, 7529, +-5160, -5898, 4607, 9854, -2712, -15800, -10322, 7796, 23478, 21539, 1928, -14686, -17523, -6820, 5724, 618, +-13309, -14873, -3705, 10804, 15829, 5379, -6411, -7857, -2122, 6590, 5977, -9002, -20121, -15930, 76, 14399, +11224, -2043, -6718, -1277, 6778, 6536, -6567, -15677, -8717, 5549, 18189, 19566, 7844, -2203, -3725, -387, +849, -6561, -13935, -9045, 3164, 13867, 16192, 5241, -7700, -11428, -6693, 1756, 1695, -8421, -11706, -4098, +4637, 7100, -827, -9899, -9562, -3423, 3080, 3326, -5637, -11166, -4944, 5427, 12577, 12324, 6246, 2692, +3790, 7196, 6865, -3133, -12707, -10250, -851, 8785, 12504, 4630, -4275, -4518, -937, 31, -6204, -15218, +-14552, -2746, 10190, 14127, 6262, -1817, -982, 1923, 2503, 224, -4737, -4796, 1907, 9910, 15925, 14099, +5178, 1135, 3094, 3780, 379, -8410, -14679, -11046, -3252, 2709, 2319, -5173, -10207, -8601, -5453, -3536, +-6403, -11384, -8328, 69, 6079, 9270, 7079, 1913, 214, 1043, 3106, 2187, -4234, -5682, 2344, 11534, +17934, 19039, 13055, 6636, 2804, 438, -772, -4613, -8035, -5658, -1593, 2265, 4395, -367, -7054, -8828, +-7595, -5398, -6034, -9763, -9040, -4023, 749, 4457, 3351, -329, -207, 1484, 3596, 3931, -1278, -4856, +-1337, 5079, 13065, 18076, 13449, 5878, 1880, 520, 698, -2199, -6691, -6116, -2450, 2261, 6178, 3340, +-3675, -8415, -10071, -8287, -7550, -11551, -12435, -7789, -2426, 2879, 3842, 606, -359, 606, 3326, 4737, +-1009, -6959, -4953, 2247, 11669, 17574, 13663, 6212, 724, -2421, -2172, -3098, -5434, -4104, -1013, 3060, +7530, 5103, -2322, -6447, -7365, -6642, -7406, -11537, -12173, -7154, -248, 7184, 10033, 7445, 4746, 2129, +1237, 1233, -2992, -6576, -3220, 4813, 15300, 21961, 17701, 8970, 2337, -2257, -3683, -4598, -5378, -2576, +961, 3258, 4614, 519, -7597, -13062, -14984, -13637, -11701, -12278, -11460, -8154, -4610, 650, 3961, 1409, +-2245, -3883, -1757, 2534, 2425, 523, 3027, 8379, 15633, 21211, 18019, 10425, 4938, 2043, 3344, 4402, +1190, -1047, -534, 1554, 4135, 1336, -6383, -11186, -11641, -8857, -5518, -7452, -11587, -11699, -7435, 854, +6689, 5052, 1462, -446, 810, 4047, 2576, -1414, 96, 6171, 14690, 21299, 17649, 8527, 2382, -612, +-275, -323, -3927, -6267, -5306, -1999, 2067, -569, -9599, -14914, -14659, -11029, -7694, -10677, -15547, -15184, +-9934, -888, 5067, 2880, -414, -725, 1917, 6052, 5389, 2070, 3965, 10412, 18919, 25116, 21750, 13583, +8575, 6276, 6134, 4494, -1289, -5030, -4190, -1059, 2173, -958, -9435, -13741, -13129, -10954, -10023, -14156, +-18267, -16304, -10883, -3280, 2025, 906, -1172, -981, 1549, 4381, 1960, -1777, 1436, 9559, 19050, 26075, +23412, 15451, 10193, 6870, 5508, 3691, -1616, -4911, -3525, -677, 1394, -2037, -9984, -14229, -14543, -13420, +-12372, -15329, -18616, -16701, -11433, -4290, 623, 367, -52, 772, 2575, 5446, 4176, 797, 3480, 11620, +21669, 28812, 26247, 18827, 13478, 8722, 6031, 4310, -383, -3600, -2804, -1101, 608, -1865, -9302, -13850, +-14397, -13639, -12707, -15221, -18213, -16403, -11684, -5407, -490, -470, -1733, -1989, -1053, 1244, 1049, 69, +3814, 10596, 18711, 25242, 23068, 15836, 11167, 8038, 6649, 5344, 330, -4026, -4412, -2373, 1100, 270, +-6782, -12051, -13840, -14553, -14137, -15913, -18316, -16601, -12518, -6576, -823, 251, -1238, -2702, -2302, 1050, +2699, 2281, 5588, 12409, 20401, 26455, 24365, 17527, 12485, 8958, 7993, 7539, 3131, -1499, -2822, -2126, +304, -456, -7113, -12604, -14696, -14979, -13936, -15994, -19586, -18987, -14792, -7522, -138, 1878, 404, -1178, +-939, 2247, 3908, 3401, 6311, 12466, 20268, 27479, 26596, 19059, 12180, 7410, 6321, 6908, 3760, -944, +-3221, -2947, -602, -1664, -8992, -15102, -16543, -15109, -12893, -14689, -18803, -19409, -16127, -9098, -1968, -470, +-2225, -3447, -2047, 2063, 3358, 1678, 3644, 9892, 18542, 26357, 25741, 18813, 12852, 8765, 7932, 8154, +4050, -1180, -2589, -1125, 1590, 557, -6684, -13084, -15076, -14354, -13053, -15423, -19565, -19450, -14652, -6812, +-264, -63, -3109, -4492, -2025, 3200, 5058, 3405, 4864, 10466, 18656, 26178, 25517, 18349, 12290, 8678, +8167, 8454, 4457, -907, -2501, -668, 2145, 280, -8014, -14631, -15580, -13675, -12106, -14751, -19402, -19641, +-15056, -7618, -1295, -694, -3221, -4231, -1558, 3329, 4661, 2733, 4120, 10240, 19070, 26200, 24454, 16414, +10332, 8107, 9151, 9666, 5117, -854, -2828, -994, 1852, 134, -7631, -14009, -15279, -13987, -13177, -16114, +-20846, -21647, -17250, -9444, -2886, -2064, -4415, -5228, -2180, 2785, 4156, 2869, 4958, 11474, 20631, 27451, +25244, 17287, 11320, 9213, 10153, 10162, 5366, -213, -1607, 636, 3501, 1439, -6923, -14112, -15583, -13652, +-12207, -14662, -19046, -19824, -15660, -8652, -3203, -2812, -4867, -5064, -1390, 3572, 4690, 3538, 5489, 11262, +19377, 25222, 22893, 15587, 10117, 8582, 10237, 10658, 6264, 429, -2071, -616, 2002, 312, -6820, -12890, +-14178, -12778, -12579, -16249, -20866, -21402, -16935, -9619, -3932, -3114, -4862, -5175, -1554, 3788, 5434, 4193, +5513, 11066, 19398, 25543, 23779, 16812, 10967, 9012, 10350, 10397, 5909, 141, -2282, -684, 1607, -609, +-7493, -12889, -13733, -12232, -12307, -16161, -20818, -21645, -17069, -8916, -2538, -1487, -3172, -3436, -67, 4395, +5204, 3911, 5554, 11456, 20190, 26183, 23693, 16116, 10176, 8432, 9469, 8842, 4385, -535, -2176, -339, +1866, -431, -7315, -12867, -13741, -12215, -12716, -16833, -21167, -21449, -16416, -8249, -2602, -2571, -5071, -5498, +-1240, 4002, 4914, 3891, 5933, 11801, 19999, 25240, 22398, 15297, 10100, 8845, 10136, 9329, 4440, -695, +-2310, -397, 1791, -435, -7079, -12749, -13956, -12341, -12650, -16848, -21097, -20999, -15587, -7666, -2957, -3484, +-5644, -5393, -596, 5027, 5997, 4634, 6154, 11678, 19951, 25321, 22512, 15199, 9537, 8158, 9750, 9171, +4228, -1021, -2436, 195, 3026, 854, -6096, -11910, -12839, -11078, -11521, -15625, -19674, -19817, -14884, -7259, +-2531, -2866, -5231, -5554, -1066, 4621, 5802, 4713, 6280, 11739, 20139, 25401, 22119, 14504, 8974, 8083, +10245, 9825, 4751, -605, -2093, 494, 3016, 161, -7189, -12741, -13129, -10873, -11251, -15930, -20657, -20935, +-15553, -7387, -2480, -3129, -5928, -6213, -1851, 3336, 4557, 3975, 5720, 10950, 18616, 22727, 19008, 12009, +7459, 7358, 9661, 8876, 3674, -1248, -2435, 138, 2951, 831, -5624, -10585, -10998, -9414, -10600, -15455, +-19603, -19050, -13409, -5653, -1306, -2530, -5803, -6228, -1603, 3993, 5366, 4597, 6123, 11016, 18108, 22120, +18998, 12616, 8291, 7838, 9397, 8229, 3266, -1335, -2255, 513, 3105, 667, -5786, -10951, -11865, -10292, +-10938, -15290, -19224, -18971, -13985, -6577, -2093, -2940, -5863, -6445, -2662, 2261, 3927, 4017, 6256, 11505, +18625, 22273, 18501, 11292, 6448, 6280, 8632, 8284, 3978, -217, -1192, 977, 2940, 538, -5373, -10091, +-10655, -8677, -8923, -13038, -17097, -17164, -12524, -5351, -1088, -2184, -4996, -4966, -386, 5051, 6474, 5496, +6639, 11283, 18166, 21840, 18103, 10890, 6199, 6206, 8620, 8051, 2971, -2047, -3190, -741, 1606, -397, +-6243, -11066, -11640, -9864, -10631, -15311, -19749, -19646, -14318, -6536, -1875, -2797, -5801, -5982, -1343, 4318, +5931, 4845, 5888, 10870, 18163, 22146, 18646, 11520, 6877, 6809, 9139, 8637, 3338, -2095, -2911, 379, +3377, 1487, -5098, -10928, -11722, -9397, -9530, -13931, -18445, -18347, -12678, -4608, -96, -1528, -4945, -5092, +-219, 5495, 6921, 5569, 6373, 11326, 18602, 22280, 18087, 9998, 5030, 5618, 8678, 8257, 2395, -3584, +-4470, -924, 2480, 871, -5740, -11563, -12164, -9845, -10018, -14307, -18602, -18016, -12102, -4468, -428, -2160, +-5802, -5637, -253, 5752, 7198, 5375, 5611, 10452, 17726, 21487, 17536, 9490, 4311, 4871, 8353, 8558, +2903, -3220, -3968, -243, 2996, 1141, -5761, -11804, -12088, -9103, -8762, -13270, -18493, -18391, -12053, -3770, +659, -1197, -5219, -5256, 18, 6148, 8049, 6393, 6246, 10738, 17745, 21258, 17127, 8752, 3367, 3952, +7462, 7932, 2677, -3381, -4266, -476, 3051, 1359, -5860, -12312, -12542, -9268, -8794, -13433, -18906, -18815, +-12200, -3568, 1004, -1401, -6242, -6188, -98, 6871, 9264, 7172, 6431, 10837, 17734, 21136, 16785, 7831, +2462, 4014, 8381, 9070, 3594, -2818, -3614, 418, 3726, 1753, -5612, -12285, -12611, -9103, -8216, -12651, +-18340, -18415, -11747, -3213, 1066, -1716, -6745, -6387, 190, 7377, 9603, 6772, 5265, 9642, 16847, 20288, +15799, 6694, 1405, 3259, 7840, 8673, 3024, -3873, -4604, -1, 3720, 1835, -5868, -12951, -13197, -9308, +-7976, -12032, -17844, -18313, -11706, -2945, 1670, -965, -6058, -5447, 1630, 9097, 11302, 8159, 6247, 10459, +17625, 21046, 16188, 6194, 601, 3162, 8697, 10121, 4252, -3415, -4586, 35, 3972, 2272, -5778, -13309, +-13317, -8936, -7485, -11958, -18678, -19651, -12589, -3164, 1722, -1144, -6740, -6296, 1108, 9107, 11610, 8109, +5566, 9511, 16660, 19974, 14909, 4912, -285, 2805, 8595, 9929, 3507, -4625, -5414, 15, 4385, 2617, +-5820, -13613, -13464, -8721, -7066, -11800, -18789, -19525, -12073, -2582, 2071, -1279, -7181, -6414, 1417, 9516, +12006, 8206, 5154, 8956, 16181, 19496, 14364, 4133, -1149, 2326, 8594, 10244, 4026, -4044, -4801, 823, +5337, 3333, -5645, -13729, -13282, -8113, -6204, -10825, -18036, -19132, -11805, -2251, 2350, -1166, -7232, -6314, +1999, 10467, 12904, 8636, 5108, 8823, 16158, 19384, 13921, 3357, -1934, 2026, 8758, 10320, 3658, -4664, +-5076, 1159, 5825, 3370, -6288, -14768, -14000, -8026, -5536, -10276, -18032, -19380, -11822, -1968, 2612, -1438, +-7993, -6666, 2612, 11488, 13474, 8360, 4379, 8370, 16056, 19064, 12938, 1779, -3409, 1346, 8889, 10680, +3672, -5112, -5600, 882, 5624, 2942, -6847, -14945, -13417, -6983, -4778, -10179, -18432, -19647, -11194, -766, +3232, -1781, -8565, -6585, 3552, 12845, 14522, 8570, 4062, 8308, 16386, 19292, 12794, 1459, -3355, 2145, +9838, 10894, 3187, -5504, -5160, 2158, 6925, 3426, -7256, -15584, -13634, -6607, -4317, -10226, -18865, -19944, +-11119, -435, 3428, -1994, -8734, -6102, 4600, 13700, 14584, 8014, 3531, 8307, 16686, 19078, 11595, -227, +-4494, 2009, 10141, 10766, 2341, -6693, -6110, 1711, 6564, 2626, -8462, -16711, -14245, -6923, -4898, -11131, +-19677, -20232, -10750, 7, 3323, -2354, -8783, -5569, 5747, 15102, 15570, 8421, 3952, 9275, 18224, 20651, +12616, 238, -4020, 2958, 11330, 11566, 2555, -6573, -5502, 2781, 7495, 2822, -8964, -17268, -14361, -6738, +-4884, -11477, -20207, -20546, -10534, 428, 3181, -3208, -9796, -6154, 5689, 15056, 15223, 8093, 3931, 9373, +18019, 19737, 11063, -1340, -5144, 2395, 11118, 11333, 2182, -6979, -5815, 2633, 7420, 2664, -9063, -17092, +-13846, -5952, -4190, -11228, -20305, -20570, -10291, 663, 3063, -3541, -9929, -5798, 6417, 15689, 15447, 8065, +3922, 9504, 18166, 19599, 10549, -2030, -5707, 2148, 11012, 11076, 1906, -6988, -5556, 3030, 7674, 2469, +-9500, -17329, -13767, -5755, -4046, -11223, -20343, -20500, -9998, 1156, 3502, -3215, -9489, -5085, 7375, 16510, +15833, 8265, 4161, 9820, 18557, 19848, 10569, -1947, -5475, 2299, 10904, 10694, 1617, -6765, -4823, 3904, +8240, 2607, -9558, -17362, -13716, -5620, -4071, -11535, -20726, -20797, -10223, 835, 2856, -4258, -10687, -6163, +6540, 15932, 15424, 7949, 3798, 9316, 17992, 19343, 10248, -2076, -5557, 2201, 10661, 10217, 1185, -6843, +-4495, 4654, 9149, 3275, -9063, -16833, -13249, -5252, -3708, -11085, -20070, -20083, -9773, 881, 2627, -4415, +-10534, -5912, 6570, 15669, 15090, 7912, 4139, 9824, 18364, 19356, 10012, -2252, -5566, 2265, 10719, 10221, +1277, -6629, -4497, 4290, 8581, 2843, -9001, -16500, -13157, -5523, -4262, -11674, -20388, -20343, -10316, 66, +1697, -5130, -10786, -5866, 6639, 15591, 14847, 7727, 4078, 9701, 18180, 19206, 10028, -1887, -5092, 2408, +10504, 9994, 1441, -5922, -3590, 4972, 9026, 3439, -7896, -15143, -12146, -5137, -4301, -11517, -19658, -19428, +-9733, 264, 1770, -4754, -10080, -5423, 6557, 15204, 14474, 7638, 4021, 9202, 17333, 18435, 9575, -2121, +-5583, 1390, 9241, 8841, 735, -6194, -3729, 4822, 8888, 3378, -7776, -15075, -12478, -5728, -4775, -11525, +-19211, -18916, -9445, 302, 1728, -4543, -9712, -5303, 6372, 15015, 14624, 8280, 4741, 9456, 17067, 17891, +9195, -2085, -5439, 1303, 8867, 8304, 400, -6206, -3785, 4538, 8578, 3247, -7689, -15003, -12692, -6115, +-5058, -11538, -19103, -19142, -10185, -541, 1252, -4446, -9274, -5086, 6103, 14385, 14207, 8547, 5419, 10016, +17367, 18060, 9626, -1220, -4600, 1849, 9376, 9079, 1615, -4726, -2531, 5492, 9576, 4545, -6140, -13620, +-11894, -5789, -4798, -11124, -18639, -18972, -10473, -1250, 446, -4989, -9731, -5871, 4924, 13078, 12988, 7507, +4210, 8349, 15522, 16410, 8345, -2183, -5651, 444, 7759, 7664, 861, -4894, -2726, 5098, 9333, 4777, +-5388, -12778, -11375, -5443, -4211, -10053, -17207, -17671, -9462, -82, 2177, -2839, -7611, -4184, 6245, 14369, +14409, 8954, 5323, 8967, 15885, 16889, 9175, -1272, -5215, 264, 7242, 7278, 929, -4763, -3126, 4214, +8249, 3691, -6361, -14024, -13253, -7715, -6469, -12012, -18774, -19165, -11126, -1779, 633, -4116, -8659, -5238, +5236, 13734, 14250, 9043, 5270, 8513, 15369, 16967, 9953, -270, -4481, 784, 8025, 8656, 2797, -2865, +-1613, 5400, 9393, 4975, -4973, -12835, -12396, -6930, -5494, -10815, -17640, -18516, -10978, -1749, 830, -3708, +-8364, -5406, 4741, 13166, 13645, 8379, 4287, 7024, 13777, 15744, 9124, -1015, -5549, -709, 6551, 7650, +2285, -3218, -2187, 4615, 8861, 5037, -4481, -12395, -12395, -7164, -5443, -10209, -16660, -17667, -10470, -1318, +1463, -2841, -7621, -5181, 4641, 13284, 14168, 9016, 4531, 6646, 13096, 15140, 8677, -1511, -6300, -1651, +5816, 7476, 2580, -2964, -2373, 4200, 8643, 5161, -4224, -12408, -12797, -7524, -5338, -9591, -15949, -17363, +-10641, -1531, 1689, -2085, -6734, -4679, 4798, 13505, 14757, 9883, 5129, 6662, 12904, 15205, 9123, -868, +-5820, -1354, 6291, 8326, 3654, -1994, -1838, 4378, 8867, 5478, -4046, -12579, -13301, -8072, -5686, -9879, +-16468, -18260, -11766, -2422, 1390, -1988, -6754, -5119, 4068, 12921, 14668, 10176, 5300, 6380, 12340, 14697, +8920, -748, -5754, -1521, 6156, 8430, 4009, -1600, -1660, 4449, 9139, 5984, -3573, -12442, -13494, -8178, +-5201, -8831, -15365, -17637, -11791, -2711, 1277, -1841, -6556, -5075, 4002, 12831, 14512, 9886, 4785, 5605, +11476, 13968, 8415, -1151, -6276, -2216, 5444, 7932, 3816, -1654, -1865, 4070, 8804, 5900, -3309, -12030, +-13269, -8080, -5086, -8660, -15168, -17517, -11685, -2481, 1571, -1661, -6530, -5167, 3961, 13207, 15341, 10725, +5178, 5519, 11227, 13901, 8555, -958, -6215, -2422, 5021, 7594, 3903, -1223, -1520, 4064, 8478, 5454, +-3647, -12310, -13659, -8594, -5546, -8900, -15187, -17570, -11925, -2685, 1616, -1326, -6106, -4920, 4074, 13369, +15662, 11143, 5538, 5730, 11333, 13951, 8520, -1121, -6512, -2773, 4819, 7690, 4256, -783, -1227, 4145, +8507, 5512, -3592, -12251, -13680, -8724, -5726, -8958, -14962, -17155, -11565, -2595, 1449, -1523, -6144, -4859, +4092, 13317, 15577, 11059, 5461, 5610, 11175, 13767, 8301, -1366, -6790, -3081, 4637, 7756, 4525, -485, +-1035, 4303, 8650, 5573, -3597, -12286, -13747, -8848, -5844, -8944, -14784, -17008, -11630, -2893, 957, -1943, +-6273, -4811, 4203, 13393, 15445, 10839, 5314, 5453, 10974, 13518, 8000, -1606, -6873, -3053, 4730, 7867, +4624, -339, -840, 4584, 9098, 6071, -3239, -12119, -13795, -8961, -5830, -8882, -14864, -17273, -11938, -3150, +787, -1989, -6235, -4788, 4109, 13224, 15434, 11121, 5697, 5730, 11102, 13350, 7551, -2027, -7155, -3237, +4556, 7639, 4491, -230, -504, 5144, 9777, 6612, -2944, -11983, -13668, -8751, -5460, -8336, -14197, -16547, +-11303, -2650, 1206, -1603, -5812, -4351, 4511, 13542, 15641, 11296, 5781, 5617, 10716, 12647, 6696, -2774, +-7749, -3812, 3982, 7158, 4280, -98, -333, 5116, 9538, 6235, -3312, -12309, -14023, -9121, -5861, -8806, +-14670, -17028, -11709, -2865, 1151, -1595, -5792, -4368, 4464, 13556, 15809, 11578, 6093, 5832, 10754, 12607, +6721, -2518, -7307, -3426, 4183, 7295, 4621, 567, 439, 5724, 9832, 6310, -3248, -12203, -14017, -9295, +-6208, -9166, -14839, -16997, -11674, -2906, 1050, -1740, -5914, -4453, 4368, 13443, 15615, 11279, 5750, 5523, +10531, 12374, 6477, -2754, -7578, -3808, 3740, 6993, 4750, 1086, 1080, 6213, 10073, 6318, -3252, -12147, +-14088, -9625, -6686, -9506, -14795, -16683, -11370, -2736, 1081, -1688, -5672, -4085, 4719, 13700, 15822, 11471, +5905, 5508, 10262, 11925, 5922, -3258, -7978, -4219, 3309, 6641, 4559, 1084, 1142, 6167, 9893, 6146, +-3327, -12111, -14075, -9893, -7216, -9844, -14615, -16192, -10972, -2597, 1165, -1257, -4792, -3094, 5424, 14016, +15884, 11578, 6182, 5788, 10436, 12099, 6264, -2737, -7498, -3911, 3610, 7192, 5399, 2054, 1982, 6721, +10254, 6472, -3054, -12030, -14371, -10617, -8169, -10702, -15114, -16437, -11289, -3136, 519, -1764, -5099, -3522, +4546, 12823, 14850, 10992, 5888, 5354, 9677, 11225, 5581, -3065, -7612, -4087, 3347, 7048, 5545, 2462, +2374, 6891, 10339, 6635, -2783, -11777, -14303, -10664, -7991, -10080, -14240, -15621, -10697, -2609, 1269, -708, +-3903, -2539, 5035, 12849, 14649, 10820, 5815, 5260, 9415, 10842, 5355, -3056, -7602, -4303, 2921, 6648, +5494, 2831, 2811, 7059, 10219, 6355, -3145, -12170, -14854, -11435, -8779, -10681, -14615, -15950, -11128, -3024, +1103, -636, -3826, -2742, 4494, 12239, 14308, 10851, 5963, 5134, 8920, 10333, 5174, -2810, -7103, -3921, +3041, 6724, 5808, 3439, 3452, 7438, 10349, 6424, -2981, -11955, -14779, -11565, -8946, -10630, -14226, -15339, +-10583, -2579, 1733, 260, -2870, -2042, 4771, 12269, 14320, 10841, 5901, 4941, 8613, 10129, 5267, -2505, +-6932, -4087, 2692, 6641, 6297, 4323, 4228, 7785, 10350, 6341, -2941, -11872, -14979, -12193, -9690, -11074, +-14215, -15134, -10545, -2696, 1615, 181, -3073, -2527, 4000, 11497, 13788, 10474, 5487, 4287, 7746, 9434, +4972, -2541, -6998, -4406, 2251, 6479, 6496, 4580, 4183, 7291, 9670, 5861, -3068, -11863, -15140, -12548, +-9926, -10818, -13410, -14174, -9827, -2177, 2233, 1071, -1931, -1535, 4518, 11650, 13859, 10680, 5747, 4292, +7597, 9534, 5379, -2080, -6802, -4620, 1995, 6591, 6905, 4942, 4235, 6970, 9298, 5741, -3166, -12203, +-15864, -13538, -10746, -11169, -13457, -14296, -10312, -2906, 1695, 947, -1899, -1786, 3828, 10774, 13197, 10412, +5693, 4167, 7341, 9291, 5300, -1989, -6684, -4623, 1969, 6793, 7450, 5719, 4900, 7379, 9738, 6440, +-2302, -11513, -15570, -13420, -10319, -10186, -12064, -12939, -9397, -2354, 2353, 1923, -772, -898, 4120, 10663, +13137, 10578, 5864, 3979, 6755, 8686, 5023, -2049, -6987, -5422, 981, 6089, 7107, 5424, 4289, 6413, +8745, 5686, -2935, -12327, -16754, -14801, -11418, -10763, -12303, -13215, -9873, -2744, 2341, 2235, -451, -896, +3798, 10384, 13282, 11135, 6457, 4273, 6786, 8803, 5506, -1260, -6232, -5011, 1206, 6557, 8001, 6551, +5191, 6810, 8892, 5935, -2585, -12121, -16901, -15163, -11616, -10605, -11941, -12951, -9938, -2976, 2312, 2365, +-576, -1532, 2767, 9446, 12679, 10593, 5714, 3285, 5721, 7961, 4985, -1631, -6700, -5689, 538, 6263, +8261, 7191, 5784, 7039, 8811, 5853, -2476, -11897, -16807, -15204, -11450, -10028, -11090, -12986, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 984, +2575, 8159, 10832, 9620, 8477, 8297, 7087, 5055, 3010, 622, -1614, -3021, -4130, -4925, -3846, -1829, +-871, -1144, -1751, -2628, -4066, -6033, -8656, -11789, -14596, -16264, -16632, -15486, -12504, -7851, -1929, 4752, +11295, 17107, 21875, 25303, 26821, 26108, 22495, 17374, 12591, 8376, 4354, 949, -1425, -2684, -2763, -1892, +-750, 138, 483, -131, -2034, -5076, -8753, -12639, -16249, -19167, -21070, -21591, -20072, -16262, -10899, -4805, +1680, 8247, 14319, 18980, 21471, 21850, 20814, 18461, 14449, 9244, 4012, -261, -3335, -5597, -7001, -7059, +-5797, -4103, -2845, -2275, -2383, -3318, -5367, -8451, -12089, -15576, -18296, -19711, -19555, -17682, -14070, -8882, +-2310, 5059, 12086, 18044, 22579, 25488, 26470, 25405, 22388, 17992, 13169, 8454, 4119, 642, -1668, -2715, +-2607, -1717, -626, 182, 367, -335, -2091, -4932, -8591, -12616, -16361, -19309, -21127, -21518, -19941, -16180, +-10894, -4863, 1581, 8163, 14310, 19053, 20585, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 14860, 21898, 18438, 18579, 16934, 16186, 15046, 14037, +13004, 11952, 10928, 9878, 8854, 7829, 6779, 5755, 4703, 3684, 2624, 1625, 565, -455, -1507, -2530, +-3583, -4586, -5571, -6584, -7570, -8584, -9566, -10587, -11549, -12571, -13554, -14567, -15553, -16565, -17552, -18539, +-19551, -20537, -21551, -22557, -23479, -24718, -25123, -27350, -25988, -30105, 8541, 21908, 17668, 18992, 16729, 16284, +15009, 14048, 13005, 11952, 10930, 9879, 8854, 7829, 6779, 9853, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2277, 3460, 3425, 5629, +5304, 3321, 2693, 5908, 6970, 4358, 2251, 2325, 5624, 1432, -2187, -3644, 246, -739, -4030, -8446, +-4360, -4497, -8716, -14756, -15460, -11359, -13411, -17849, -18365, -11590, -9619, -11194, -17443, -11650, -10267, -12717, +-20844, -20602, -15570, -13395, -18956, -18922, -11763, -6703, -6624, -12558, -6528, -1753, -138, -6055, -3928, 1764, +8787, 3484, 3351, 7783, 13822, 12875, 6593, 8872, 14985, 17281, 11704, 11605, 14716, 21612, 14402, 10943, +10832, 16320, 14195, 8253, 6247, 12846, 14263, 8423, 4123, 4044, 9316, 2265, -3459, -5614, 370, -1083, +-5764, -11797, -5951, -6001, -11378, -18851, -19337, -13918, -16102, -21009, -21199, -13126, -10691, -12215, -18693, -12266, +-10623, -12934, -20845, -20602, -15570, -13395, -18956, -18922, -11763, -6703, -6624, -12558, -6528, -1753, -138, -6055, +-3928, 1764, 8787, 3484, 3351, 7783, 13822, 12875, 6593, 8872, 14985, 17281, 11704, 11605, 14716, 21612, +14402, 10943, 10832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 664, 1951, 3947, 2840, 668, 3847, 6256, 2202, 219, 5950, 9127, +5061, 3182, 5683, 5893, 4668, 4105, 1542, 418, 3497, 2157, -4307, -2319, 6077, 3836, -5063, -3883, +1784, -1447, -6660, -6086, -5604, -6629, -6613, -9736, -11703, -3687, 2540, -6258, -12419, -2314, 3214, -7407, +-11893, -3142, -924, -7282, -7606, -2872, 844, 6081, 6366, -988, 175, 10752, 8920, -2775, 116, 11007, +7071, -1739, 3798, 13303, 13990, 12242, 10641, 8409, 12340, 16644, 8983, 2113, 11356, 17313, 5737, 540, +13865, 20205, 10670, 6404, 10940, 10871, 8268, 6990, 2529, 662, 5530, 3345, -6548, -3459, 8897, 5513, +-7147, -5385, 2432, -1939, -8773, -7886, -7144, -8316, -8166, -11837, -14012, -4349, 2952, -7167, -14019, -2576, +3528, -8017, -12698, -3310, -961, -7472, -7704, -2873, 844, 6081, 6366, -988, 175, 10752, 8920, -2775, +116, 11007, 7071, -1739, 3798, 13303, 13990, 12242, 10641, 8409, 12340, 16644, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10291, 13641, -4104, +5344, 15143, -7235, 18568, -3638, -459, 8492, -17719, 6819, -12122, -9845, 5548, -17601, 10161, -2450, -1221, +17575, -7265, 16549, 3337, -3122, 13802, -14862, 4808, -5804, -14659, 6818, -18091, 3511, 517, -8133, 17322, +-6312, 11788, 9963, -5360, 17257, -9588, 2111, 1541, -17441, 7017, -16036, -3855, 3308, -13816, 14779, -4399, +5385, 15046, -6943, 18108, -3132, -847, 8633, -17564, 6414, -11600, -10322, 5548, -17601, 10161, -2450, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +6901, 2207, 10447, 2226, 6422, -2974, -1527, -7425, -6128, -5437, -3976, 2537, 1506, 9168, 3275, 9057, +-1060, 2743, -7398, -3413, -8899, -3700, -3074, 1168, 5337, 4812, 9001, 2125, 5373, -5132, -903, -10064, +-3112, -7677, 654, 110, 5740, 6433, 5776, 6142, -662, 789, -8277, -3051, -10091, -860, -4532, 5485, +2747, 8474, 5198, 4433, 1496, -3916, -3289, -9388, -2975, -7447, 3131, -734, 9148, 3676, 8672, 1692, +1490, -3608, -6116, -5504, -7739, -765, -3063, 6901, 2207, 10447, 2226, 6422, -2974, -1527, -7425, -6128, +-5437, -3976, 2537, 1506, 9168, 3275, 9057, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 13502, -10412, 5384, -2863, -14298, 15635, 4343, -12203, +-311, -10491, 24, -1692, 3864, -10599, 1831, 1639, -11510, 2503, 9074, 7103, -5619, -7823, -4267, 2476, +-1051, -12707, 10599, 1035, -29835, 8679, -1127, 12680, -13183, 5443, -199, 9411, -7091, 1715, 3536, 8279, +-11296, 7711, 5655, -67, 7697, -8671, 1503, -3002, -5131, -3123, 16224, -11214, 6127, -5632, 616, -7264, +-486, -5587, -2711, -507, 2136, 5544, -1275, -3866, 2531, 6127, -11403, 16543, -3932, -2307, 9596, -4499, +169, 10357, -6271, -1028, 5167, 2033, -7506, 11636, -4019, -3194, 11383, 4384, 5407, 12, -12256, 11708, +-1667, -11734, 12435, 4085, 5940, -12210, -3695, 1924, -5986, 6895, -3547, -7939, 6535, 10075, -4495, 960, +7679, -6690, 1984, 13211, -16294, 6663, 4099, -5936, -11123, 28895, -13815, -1780, 6243, 3479, -12167, 5140, +2599, 8447, 3135, -2227, 4835, 11194, 652, -4739, -3214, 6731, 5056, -1587, -12515, 3105, 23024, -3843, +-1992, 14159, 1323, -16, -3151, 6599, -1616, -11219, 8987, 2724, -18917, 7244, -3515, -12955, 5568, 9774, +-1507, -2576, -7380, 15592, -17976, 4883, -1692, 1986, 40, 9792, -3223, -4212, 14883, -3560, -4167, 12616, +-7027, 5144, 775, -15474, 272, 9452, -6583, 6635, -4678, -2310, 3704, -6368, -1307, 6277, 571, -10610, +-8554, 4880, -288, 4023, 5095, -2939, -16, 55, 12009, -479, -2050, 7672, -8643, 11052, -7615, -12736, +5525, -5642, -4842, -9675, -3112, 1619, -703, 796, 379, -8390, 8135, 2850, -4087, 919, -6870, -2788, +8939, -4518, 3476, 16091, -555, 3763, 2879, -4071, -5484, 9847, -7560, 4085, 2428, -9896, 1439, 1735, +-9079, 176, 9979, -19603, 23095, -2635, -9726, 7046, -7782, -3531, 10760, 671, -11515, 495, 12875, -2827, +115, -903, -274, 8759, -7659, 5156, 705, -235, 1165, -11987, 5644, 2740, -9771, -511, 668, 2660, +-2392, -3750, 6872, 14528, -13094, 5660, -1740, -2271, 267, -1639, -2715, 7408, -1911, -4607, 11424, -5436, +-9340, 22915, -10480, -6899, 3184, 851, 1927, 992, 4880, -5967, -11303, -3663, -4730, -6230, -1199, -6303, +-507, 13709, -3194, 3932, -652, 6644, -6179, 7508, -7524, -10847, -6394, 7697, -7684, 3723, 12087, -828, +5960, 580, 11743, -2631, 659, -12078, 8171, 3347, -2442, 7611, 6708, -858, -5250, 6840, 7968, 5115, +-2824, 11700, 4709, -2708, -6555, -5879, 4240, 7731, -9828, 3524, 9808, -15004, 6843, 340, 6279, -1215, +-6140, -967, 3324, -7390, 9391, 1291, -3299, 3184, -1687, 3404, -4962, 4646, -1404, -8910, 10275, 828, +-1008, -1452, -534, -5931, 4415, -6236, -2727, -8361, 12167, 9635, 2261, -6380, 8739, -2070, -4832, 2747, +-6284, 10792, -295, -8351, 11522, -6735, -16540, -2068, 13154, -751, -7802, 20078, 11406, 3036, -2539, -5936, +3339, -919, -1847, -4675, 6316, 1204, 6428, -315, 3212, -751, -5867, -6916, 19827, -16126, -6613, 9751, +308, 1192, 10820, -5083, 9739, -8338, 140, 18026, -11515, 55, 10715, 2995, -9828, 4921, -4131, 5949, +-4566, 5375, -2615, -1591, -8896, 6624, -7547, -60, 4944, -3200, 10542, 5612, -794, 7544, 92, 5564, +-9810, -8026, 17472, -1543, 6765, -7438, 10667, -12415, 11223, -8238, 11800, 7855, -7763, 3536, 15152, -9858, +9687, -10646, -2155, 17119, 9167, 2464, 3604, -10423, -19927, 2312, 1657, 13076, -2152, 9562, -9967, -1220, +-9839, 12508, -8579, 10567, -1644, 8157, -6236, 8983, 764, -6883, 9842, -2494, -370, 628, 10165, 5461, +10275, -2836, 11200, 5812, -8712, -10403, 16804, 488, -14494, 3729, 9259, 8283, -687, 204, 5539, 787, +-5835, 3319, -7567, 7891, -2804, 1439, -10051, 7871, -6054, -6207, 12100, -1959, 352, 7348, -4376, 2551, +-108, -1911, 5776, -7371, 2243, 4071, 2743, -2467, 8160, 4903, 6476, -19615, 9044, -1687, 16066, 632, +4108, -1706, -5919, 4208, -4691, -6083, -6018, 2400, -1510, -6435, 3829, -6355, 4164, -212, 4108, 10339, +-3050, 11855, -9272, 9992, -12538, -6034, 3347, 6984, -11146, 3647, 3173, 2328, -4967, -4256, -11091, -9486, +10320, -9170, 2535, 6895, -10271, 9664, 5160, -2914, 16039, -15168, 5664, -7554, -3784, 12711, -9700, -808, +5949, 103, 1851, -7686, -8051, 12999, 2795, -6410, -19435, -7171, -5151, 1095, 2015, 6891, 1975, 4388, +513, -5778, 3804, -151, -11538, 1724, 7171, -2316, -1835, -1263, 8967, -4591, 4613, -3536, 1933, 1425, +11048, 937, -1156, -17383, 21192, -11855, 5548, -951, 4411, -11866, 3560, -507, 436, 11155, -2378, 3105, +12372, -6972, 6904, -13039, -5607, 11611, -395, 5040, -5831, -14487, -74, 7296, -11431, 10712, -7975, -4507, +-5680, 2540, 4575, -5347, 10484, -2843, -867, 3132, 2727, -7203, 10492, -10815, -16, -5819, 3540, -4203, +8812, 4639, -880, 4931, 2656, -7756, 7326, 1589, -732, -1918, -2756, 3941, -10263, 19150, -13767, 16836, +-1963, -7896, 6740, -8739, -8219, 13831, -8251, -11180, 4051, -12123, 3255, 6952, 7271, -3451, 2063, -1719, +-2464, -5199, 4090, -11175, -6319, -10995, 19439, 939, -12358, 6756, 1496, 3984, 4468, -671, 10191, -10879, +-10712, 215, -10307, 1783, 4796, -2590, 1591, 3447, -1924, -5459, -7175, 8575, -5879, 6515, -5402, 5133, +5799, -2947, 151, 6432, 15344, -6120, -587, 16191, -1503, -2615, 12999, -18404, 5268, 9712, 4955, -9915, +-384, 2088, -4894, -4702, 5940, 5462, -1603, 2831, 7759, 2939, -3914, 67, -5356, 11624, 431, -1587, +-11595, 6647, -6008, 8479, -9794, -5639, 10863, -2715, -1876, 14648, -1927, 931, 3032, -4443, 9716, 6161, +-6870, 6047, -639, -1368, 5477, -11490, 22863, -8859, 18484, -5879, 1124, -4386, 1981, -15587, -18575, 12452, +267, -176, -791, -6300, 7209, 12550, -3659, 9956, -8427, -7907, 2907, 6788, -13126, 2984, 548, 6268, +-11383, 2920, 6143, -5439, -1364, 2296, 6284, 12363, 131, -4078, 4825, 5780, -9186, 2708, 22372, -12490, +2619, -8155, 1516, -2296, -9520, 12331, 5115, -14888, 13211, -2535, 6881, 7634, -1799, 7132, 44, -3980, +-1963, -960, -2490, 7460, -7531, 18388, -12210, 4067, -2715, -12146, -3816, 6412, 5250, 5288, 8256, -2644, +-7011, -5247, -13619, 6621, 5336, -8322, -9391, 2328, 2704, -3715, 8279, -7547, 11303, -6498, -7608, 3624, +-247, -13456, 1204, 3919, 12404, 4468, -12682, 2107, -219, 937, 311, -3364, 3524, 7512, -9591, -1760, +-3043, -3531, -3818, 11308, -10562, 4147, 2075, -432, 1165, -9630, -1591, 4771, 19, -5199, -9735, 4543, +4536, 1555, -3155, 6688, 5901, -4735, -1003, -3383, 8116, -4247, -2095, 2216, 4071, 4208, 568, -2866, +281, -11934, 4495, -5340, -2763, -1138, -4164, -6950, 12296, -274, -2152, 2049, -771, -2291, -5674, -1015, +4420, 7316, -10651, 13548, 8475, -10931, 3173, 2371, 1664, -2107, 5192, 8128, -11020, 4511, -2583, 835, +-955, -11251, 14671, -1336, 9404, -4055, -5990, 1869, 4507, -3016, -4238, 5019, -274, -2223, 3023, 8183, +-775, -5058, 5380, 4048, -17115, 16112, -4671, 12068, -14131, 10159, 1232, 3551, 3159, -4315, 890, -3919, +985, 2309, 2756, 1715, -1974, 8484, -3955, -9883, 5740, 11472, -5211, -4228, -359, -5931, -1918, -8342, +5060, -2542, -6352, 3408, 13268, -5594, -5895, -2147, 3536, -2695, -2866, -1015, -3522, 1314, 8335, 844, +-596, -3508, -8062, 0, 5388, -1799, -15898, 9587, -7178, -4083, 7032, -4270, -1461, -4260, -308, 4155, +-11180, -436, 2271, -2448, 2216, 8876, -5058, 1876, -979, 2619, -2891, 2344, -741, -7814, 14500, 5872, +6940, 9609, -7314, -2836, 12550, -9482, -6703, 6156, -6332, 2425, 12903, 5548, 3419, -5498, 18430, -6544, +1680, 1831, 1940, 4858, -5931, 4304, -1147, -611, 4076, -6284, 2405, 1911, -6622, 18575, -16314, 2850, +-15198, 14124, 6323, 3955, -8707, -14603, -3843, 14787, -11291, 4529, 13263, 2268, -2863, 2179, -11496, -8260, +-3180, -7387, 6795, -1462, -2063, 13244, 24495, -4842, 6654, 4449, 7911, -951, 816, -1551, -7444, -3695, +-3276, -5566, 8376, -2508, -5332, 12830, -10471, 4597, 13598, -7059, 571, -5671, 2528, 4256, -2291, 2768, +-204, -8226, -1607, 860, -87, 7396, -7150, 9603, 6891, -13750, 2164, -2804, 2380, 7340, -2815, -1591, +-14710, 8026, 3617, -11114, -1740, 8759, -5870, 6400, 6799, 9919, 92, -2988, -11750, 14387, -5566, 2727, +6248, -3219, 64, -3560, -5707, 2034, 1760, -1863, 5204, -1867, 4531, 4064, -2576, 5224, -4962, -6719, +10227, -4604, 4848, -3968, 2236, 15216, -424, -8379, 14017, -7991, -13791, 388, 4623, -6984, -8739, 6931, +5503, 928, -5259, -4607, 4880, 3444, -10998, -2542, -2651, 6451, -4115, -10163, 6907, 11540, 6524, -10624, +411, 9822, -16087, -6883, 12071, 2487, -1359, -11118, -1680, 5767, -1626, 719, 4819, -8171, 9591, 3289, +-1904, -4691, 1092, 3836, 2351, -6850, 7312, 2179, 12684, -11855, 10410, -4212, -240, 7586, -48, 10213, +-5003, -12315, 10427, -7299, -6416, 12087, -12406, -1972, -2836, 5578, -848, 6143, -867, -8727, -122, 668, +-6291, 16440, -10182, -4443, 7351, -1247, -534, -8215, -356, 20962, -2392, 1856, -1462, -5951, 9507, -26764, +5243, 6558, -3180, -6134, 7312, 3068, -15150, 4365, 864, -1706, 4244, 3087, 8948, 2024, -11900, -2683, +5683, 11068, -13694, -4392, 4980, 14619, -8627, -9954, -2547, -3563, 623, 2631, -4511, -15779, -195, 8465, +-231, 1600, -2063, 4613, 8591, -2927, -3280, -15734, 3624, 5092, -871, -2403, 5571, 8807, 5086, 4752, +-6043, 8376, -8472, -4475, 12723, -1683, -3652, 1591, -10635, 4632, -4131, 7155, -17228, 3848, 1391, 3235, +-10523, 4636, 2660, -9808, 4735, 5135, 1728, 5660, -3303, 4308, 11100, -9012, 1584, 169, 5920, -1031, +12859, -5028, 11077, -8467, 1368, 3435, 2817, -11155, -12547, 8295, -7046, -3839, 13311, -7875, -1831, 14940, +1600, 10631, -7663, 4575, -14610, -6464, 9735, 2904, 397, 263, -2403, 12255, -1776, -9154, -12743, 12550, +4983, -6599, 14366, -7975, -7560, 6567, 1608, -5903, 12907, -16283, 9840, -2268, -9071, 99, 12351, 1760, +-6059, -5632, 10288, 6460, 11335, -4639, 5671, 9584, -7283, 12319, 2271, 301, -17826, 10519, -14027, 8910, +-5402, -1204, -4488, 3830, 2391, 4404, -3631, 6059, 848, -6163, 3016, 12964, 755, 17630, 3996, -1954, +14448, -15628, 21096, -14722, -534, -1972, -7458, -507, 5127, -5532, -9992, 8026, 6573, -7198, -3618, 10427, +2808, -1835, -5407, 6088, -11268, 9904, -4948, -6551, 9596, 1735, -11914, -3155, -10770, 7431, -6546, 10590, +-1796, -3132, 2628, 2592, -90, -6850, 11540, -8039, -6891, 3864, 13815, -2310, -10491, 4796, 3016, -7663, +25402, -15239, -9144, 5972, 391, -6535, 8258, -8456, -1163, 15423, -14950, -6264, 707, 1101, 295, 8287, +-15266, 7492, -3351, 2535, -2943, 6808, -5815, -726, 8436, -5019, 1963, 3091, 6628, -491, -4422, -3499, +-548, -5892, -10118, 3303, 2232, 5887, 5366, 1261, 6824, -1427, 3347, -10735, 4996, 5915, -1559, 10535, +3839, -3422, 11187, 2136, 2139, -495, -17604, -1523, -2515, 6856, -17671, -3326, 1503, -1259, 391, 15583, +-6259, 22516, -4855, -2147, 10879, 3893, -6715, -4411, -2407, -7492, -1254, 2599, -3991, 1432, -4123, -9138, +8123, -1364, -9019, -452, -8926, 9308, 1981, -6715, 10966, -11843, 15579, 9031, 3830, 1031, -8630, 832, +-195, -1323, -2186, 1404, 8354, -12064, 7855, 10966, -21935, 10651, -10590, 15840, -2300, 6553, -16014, -215, +12852, -1808, -1815, -12971, 10936, 6688, -12862, -857, -3103, 4270, 3579, -15207, 13619, -2416, 7171, -10911, +-247, -6182, -2660, -1715, 796, 3511, 4164, -3731, -327, -356, -3495, 4616, -760, 3351, 9879, 6891, +-2695, 3964, 5578, -9131, -16014, 13439, 1551, -151, -3576, -2022, -5015, -3934, -3155, 876, -10562, -299, +340, 9512, 9455, -3347, 3187, 6524, -8438, -13919, -514, -1658, -6015, -851, 8392, -8099, 12666, -3720, +-1607, 2216, 6956, -3943, 880, 10309, -12606, 11248, -10606, 17286, -10503, 16306, -14744, 869, 15996, 238, +1780, 5152, -3647, -432, -15143, 295, 15815, -4415, -1163, -4639, -1799, 493, 9397, -4039, 8151, 1001, +-15551, 3734, -147, -6156, 2580, 8256, 1667, -2866, -8158, 263, -1471, 6011, 8964, -4107, 604, 0, +-247, 3385, -4632, 8315, 3077, 3460, -5332, -4604, 21440, -2252, -2635, 6515, -3775, 2743, -11831, 256, +3989, -254, -5803, -4048, 4336, 9956, 2897, -11798, 5576, 1069, 7533, 2387, -2375, 8800, -8650, 2904, +8067, 3012, -6223, 2711, 12386, 2127, 5047, -7114, -6916, 7887, 1753, 3347, 2936, 192, 3511, 1047, +-9135, 2827, 1719, -187, -16820, -4171, 516, -14735, 7547, 6140, -83, 1448, -3223, 11807, -5411, 11754, +2776, -1828, 1796, 919, -1042, -1227, 2337, -13867, 10378, 10280, -8527, -6802, 13359, 14108, 349, 1020, +-322, -1999, 4090, 2145, -13007, -3364, 2460, 343, 2029, -652, 5065, 3543, 4269, -1108, -7994, 160, +-10599, -684, 8883, 2360, -2179, -534, 6496, -3043, 304, -4164, 12344, -808, 3543, -9144, 5079, -5591, +-15868, 13154, -9951, 4791, 8067, 828, 5299, 8067, 5012, 6959, -8543, -299, 4719, -1626, -2163, -5867, +-7592, 5224, -308, -857, 12009, -707, -924, -5774, 775, -16887, -1607, 212, 7586, -7155, -1747, 12, +-1494, 3228, 4449, -18724, 5796, 5744, -12027, 7586, -7659, -2474, -2143, 912, 10339, 3964, 4144, 6920, +-4026, 8655, -3599, -459, 1156, -3996, 5496, 6660, 1869, -15011, 3871, 5760, -302, -21283, 16656, -4730, +1140, 1952, -3551, 2831, 8475, -2050, -8206, -3652, -7380, 7984, -2394, -19563, -408, 11816, 4520, -11435, +8711, -12262, 17071, -12939, -12647, 4481, 8700, -6715, 10432, 8561, 2188, 1576, -2435, -2779, 6539, -5778, +11367, 1184, 2081, -327, 8351, 3228, 8123, -5391, -9799, 5641, -5546, -9144, 956, 767, 6859, -6198, +8513, -6368, -4147, 7772, -1619, -1175, -9626, 15480, -12880, -523, 1343, -2628, -4575, -4662, 4867, -4010, +6104, -4064, -10223, -4716, -3511, -11515, -4572, 4112, 6972, -5967, 8080, -2441, 3896, -16171, 11123, -64, +-8116, 14332, -1115, -3739, 8677, -8527, 2473, 13995, -15038, -842, 905, 4948, -6034, -9356, 1054, -2959, +-3335, 3508, 1870, -9582, 8067, 7451, -9610, 12, 5037, 19799, -6647, -1240, 17383, 8744, -5651, 3068, +-3039, -8014, 1480, 8295, -7574, 7046, 9767, -11423, 4623, -828, -28, 2531, 792, 2179, 2743, -6314, +1963, 8871, -1767, 452, 8301, 1673, -17940, 3848, 8099, 2576, 3796, 7171, 899, -9432, 1236, 4376, +-24695, 11248, -5122, 16711, -2068, 14507, -5674, 5544, -1673, -2419, 561, -896, -1480, -6526, -520, -2743, +5263, -10851, 10571, -1118, -9582, -12210, 13244, -4306, -912, 2376, 2560, 8524, 6583, -10172, 9562, -1947, +-6931, -5468, -7451, 10316, -3276, 8964, 1699, 1680, 35, -16, 4999, -4035, -7244, 14272, -20148, 13400, +-9571, -447, 4463, 2612, 1840, 2088, 10280, -3843, -10576, -7627, 15750, -7775, 4379, -5318, -3023, 2631, +12347, -9414, -1375, 5024, 857, -9974, 6628, -2850, -616, -9350, -7335, 14476, -13007, 5304, 7196, -5942, +4584, 979, -3788, -11715, -14188, 12167, -1776, 4668, -507, -543, -1992, 10359, -4516, -13634, -2403, 11312, +7930, -4450, -4935, 24, -2043, -2068, 11130, -7560, -1108, 7374, 7697, -2847, 10357, -5291, -4363, 7820, +3344, -6252, -5947, 7948, 890, -2702, -935, -6899, 4019, 4317, -12721, 10612, -1047, 3196, 6100, -7560, +-9858, 1523, 8643, -3551, 591, 12623, 1696, 4456, 6467, 2416, 493, -12606, 3125, 8663, -15362, -1755, +2171, -6583, 4780, -12392, -7171, -12, 10799, 2034, -6679, 4108, 8224, 233, 632, -979, 7861, -2460, +-8116, -5942, -1927, -2243, -951, -7287, -939, 12951, -26755, 8800, -9974, -3112, -9530, 89, 2904, -17333, +7855, -2259, -2278, 7045, -4812, -6964, 10760, -2768, 10150, -3262, 11955, 5204, -9723, -2576, 5819, -11234, +12825, 7296, 516, 12568, 9416, 1992, -4283, -979, -1347, -11930, -7800, 8099, -16572, 9719, -9578, -668, +-11451, 14008, -8720, 4504, -7223, 11816, -2070, 96, 3184, -1282, 848, 7611, -8935, -5642, 17816, -6380, +-472, 8080, 7219, -15191, 2783, 2939, -14696, 3633, -395, -5879, 14179, -3775, 5555, -11576, 3989, -3339, +-5999, 7239, -1175, 3540, 2820, -11186, -5594, 10975, -14751, -6870, 379, 4463, 2243, 3339, -9700, -3091, +2264, 4384, -23115, 11339, 2672, -9919, 2179, 2859, 580, 4771, -972, -7271, -3727, 555, -8611, 3796, +4401, 7059, -7444, 5895, 11743, -2939, -7091, -1047, 14079, -13951, 83, 204, -3807, 17447, -3707, 2220, +-1812, -6163, -17375, -8907, 3804, 880, 11405, 1612, -4338, 5876, 8841, 7772, -5270, -3422, -3007, 8347, +-7643, 716, 1261, 2227, 6904, -3750, 11775, 1028, -7399, 1281, 5500, 2371, 13056, -10735, 3508, 816, +-7187, 728, 1448, -9992, -1624, 1275, -10555, 12479, -4103, -6095, -926, 5600, 6316, 2916, -7367, -1455, +-5674, 12618, -2615, -2011, 2312, 4452, -1462, 9543, -10906, -2904, 11823, -4864, 1159, 276, -5311, 4124, +-1683, 6024, 4384, 2223, 3196, -4595, -1295, -1151, -2968, -6134, -215, 4087, -8123, 408, 13363, -5922, +-7275, 3435, -2686, 3476, 1772, 6152, -3955, 7740, -1624, 2168, -19088, -4531, -10298, 14188, -8980, 6719, +-5822, 13691, 219, 4523, 4853, 465, -935, 2868, -456, -3299, 6020, -3454, 9400, -183, -5619, 6107, +-5122, -4507, 308, -7978, 3228, 4575, -1648, -3166, 10548, -2667, 1069, 7984, -7175, 4568, 912, -9263, +6004, 3948, 11289, 7467, -5774, 7415, -1204, 8315, -2084, -5076, -20203, -8951, 5099, -2095, 7292, -2271, +-4719, 5496, 5231, -2047, -322, -12251, -9694, 2275, 2496, -14902, 16408, -8467, 1487, 8524, 5856, 3380, +2849, 1619, 3096, -4174, -16791, 3444, 8267, -8148, -571, 2232, -8003, 14983, 4343, -15038, -972, 9527, +-7618, -12180, 3579, 2207, -10443, 12688, -8212, -2319, -10466, -3094, 5259, -1234, -17956, -1316, 516, 3820, +-8386, 3723, 7991, -7643, 11232, -2303, 2289, -9887, 11396, -12623, -2795, 12550, 5240, -5546, -2252, -302, +-4026, -6959, 11652, 10059, -6631, 5250, 9099, -4942, 11888, -1783, 1268, 5584, -9912, -4083, -507, -3287, +-1959, 835, 3168, 3376, -4935, 3665, -4839, -1462, -1175, -4639, -11155, 17320, -2859, -2020, -311, -9912, +-71, -6950, 1035, 4687, -4099, -12283, 3472, -899, -523, 2136, -7071, 7556, 2152, -4611, 5384, -11344, +-4566, 13523, -1870, -9243, 1967, -7570, 919, -2291, -13584, 14298, -3139, -1404, 9931, 4921, -11747, -5632, +-6779, 6115, -7275, -13719, 7984, -2223, -1722, -7027, 2865, -3919, -4324, 2617, -5031, 6252, -6455, 11127, +1216, -5651, -7848, -4164, -35, 4809, -7258, 6708, -2316, 4304, -3832, 8253, -6111, -12440, 7011, 12228, +-18156, -4996, 3989, 9243, -3016, -4010, -14908, 1512, -1856, -8023, 15162, -2088, -15230, 13603, 6736, -2788, +122, -967, 1731, 2029, -4247, 13131, -138, 2556, -4030, -195, 548, -4459, 792, -7066, 6172, 4764, +-8958, 4784, -7519, 1580, -2441, 8816, 976, 1918, 2619, -14122, -9186, 7572, 2319, -6891, 6127, -6195, +561, 14480, 4568, -741, -6820, 10227, 4796, -9110, 10295, -2599, -11866, -6834, 212, -1883, 3855, 3135, +12255, -7251, 6699, -5687, 3105, 3927, -96, -4556, -8951, -8755, 3975, -4026, 7267, -5199, -3975, -2022, +14548, -14815, -12479, 7251, 6432, 6127, 10108, -5414, 3887, -1895, -1943, 12035, 6182, -6448, 1359, -808, +-4055, 8039, 11556, -3219, 10120, -4199, 9300, 6181, 137, -1090, 10888, -2359, 14038, 4028, 228, -8360, +-14947, 4124, -3380, -2435, -5967, -87, -2499, -4899, 7724, 7476, -10295, 5528, 2947, -8527, 2011, -466, +-9790, -3720, -2136, -1350, 2656, 6409, -12832, -272, 1692, -10204, 8992, 9504, -10507, 8092, -1728, 5484, +-244, 11155, -13523, -7111, 4411, 8948, -7114, 6795, -7458, -1407, 5587, 128, -7868, -1307, 10140, 2040, +2364, -7650, 420, 7560, -9774, -4379, 5968, 14291, 2888, 1740, -2735, -6100, -1844, -16119, 5195, -4842, +-4003, -6400, 8908, -8418, 6091, -5536, -4652, 10143, -1204, -1883, -2412, 16650, -7447, 4723, -1211, 555, +-9815, 7080, -9359, -4711, 2193, -2891, 6553, 1512, 7324, -6567, -1603, -8935, 7007, 6364, -4456, 3228, +15207, -8666, -6751, -1876, 3875, -8196, -839, 5436, -8675, 431, 8160, 199, -3078, -3951, 4244, -1876, +4548, -5523, 3508, 15699, -16107, 16283, -15122, 6767, -4212, -9147, -6343, -14648, 7055, 7595, -10542, -955, +10400, -3143, -707, 19075, -6034, -2252, 6567, -7830, 14635, -12094, -12087, 12395, 1603, 7326, -4591, -9635, +8732, -3592, 896, -6491, -12894, 10403, -13979, 3907, -7602, 12415, -2344, -1231, 3980, -8123, -7779, 10512, +-14747, -3451, 10384, 8536, -299, 3396, -4507, 10459, -7855, -16518, 10952, -10435, 3611, -4331, -876, -3160, +3435, 391, 13992, -10943, 2715, -4855, 1947, -7264, 1076, -2455, 6728, 11556, 7162, -6642, 1323, -171, +-5552, 7264, -8212, 3289, 2033, -1364, -9103, 7326, -158, 2891, 28, 10943, -12502, 4009, -7524, -10731, +3729, -10571, 2072, 17812, -2278, 1475, 18195, -14478, 7191, -15004, -13819, -472, 16672, -14095, -10307, -2615, +2220, -10767, 13848, 2743, 2686, 11000, 10516, 1020, -2111, -10596, 2704, -16216, -4212, 11531, 2596, 7143, +-4627, 5028, -6150, 8306, -4855, 17402, -8630, 7752, -1974, 3845, -8543, 1151, 3312, -4270, 3125, -6708, +2476, -1967, 6747, -6567, 3164, 1455, -9079, 2535, 6476, -4044, 4735, -7422, -4067, 4319, 500, -2988, +3392, -9199, -11442, 5307, -7800, 6515, 5819, -887, -1815, 3502, -18824, 13664, -302, -3511, -7178, 10663, +5776, 11720, -7027, 9767, 5250, -2339, 1507, 3592, -11811, -11364, 16044, -8418, 4883, -6195, -3460, 2088, +1455, -7196, 7943, 5420, 1676, 4424, 3968, 2480, 5227, -3987, -3151, 1475, -1355, 5712, -2008, -14469, +-13874, 1619, 6936, -7772, 2104, 6296, -9495, 13222, -3691, 15250, 3463, -4579, 8424, -3347, -6863, 9840, +-2412, -791, 6603, -823, 6024, -2011, 2743, -1728, 368, -8848, 12570, -11159, 9411, -475, -4352, -996, +2289, -8347, 5988, -9192, -3283, -8759, -4199, 12511, -2136, 6464, -4980, -4408, 3932, 14599, -8267, 15775, +-5835, -11770, 2859, 5963, -9447, 5516, -7647, 14635, 9368, -3962, 5345, -1031, 1837, -712, -5587, 8103, +-11031, 3527, 1860, -3380, 5047, -1974, -2163, 10075, -10175, 8112, -5192, -8732, 18024, -11255, -8434, 14655, +-596, -7695, -4552, 1981, -6307, 1844, -1388, -10131, -3387, 3223, -8139, 13616, -20955, 10608, 3604, 8119, +-8148, 6127, -8238, 3351, 1368, 3720, 11627, -6038, 6524, -5347, -163, -1596, -563, -2483, 4668, -4951, +5436, -1790, -5236, 6984, 4844, 937, -4267, -1954, 9031, -5851, -2441, 6303, -8219, 4319, 2768, -2686, +2296, 4067, 2503, 7032, -4842, -6332, 4892, -2059, -7927, 8561, -555, -794, 5863, 4556, -563, -8679, +-2988, -11711, 8964, -5450, -3891, 15104, -2686, -6546, 12100, -5612, -1828, 6140, -4543, -375, -5407, -9035, +-5919, 4607, 10179, -11423, -3451, 14587, -3078, -215, 691, 6115, -2808, 493, -1600, 5311, -14272, 9555, +-2480, 7437, 2384, -12019, -700, -2875, -2068, 12271, -13135, 4180, 3723, -4662, 5578, -9926, -10583, 3887, +-9723, -12476, 8287, -22234, 14988, -22012, -3203, -552, 696, 9639, 760, -3280, -5755, -7699, 10232, -3731, +-7087, 7485, 1719, 6740, 1648, 15603, -3210, -2596, 15688, -3711, 2824, 5471, -7226, 4844, -6966, 8908, +-4363, -1204, 2473, 8075, 2448, -7859, 12199, 9320, -2412, -479, 9388, -16158, 16162, -19027, 8980, 939, +2569, -1683, 3488, -4659, 8258, -3107, -2735, -10995, -10108, 780, 960, 2136, -12271, 6095, 596, 10147, +7604, -7830, 7699, -4791, 8484, -7071, -10671, 13411, -14551, 5439, 12989, -10223, 1320, -1780, 691, -2776, +1416, -3666, 2763, 6833, 12618, 6268, -2040, 1400, -4768, 1992, 4639, -979, 9151, -2879, 9055, 2227, +-719, 3168, 803, 4880, -5707, 5683, -1407, 1388, -16139, -5847, -746, 5160, -3666, 10868, -8087, 9147, +9835, -4360, 4311, -4306, 7784, -2923, -486, 1544, -2847, -2088, -9723, 1475, 6883, -8007, 7711, 2111, +440, 5375, 5019, -12155, 11888, 500, 1616, -6156, -10051, -675, 12356, -6622, 12360, 963, -3166, 10473, +-1012, 272, 375, -7512, -8379, 10247, -10127, 3048, 4695, -3943, 8411, -2818, -1899, -1323, 6008, -947, +2111, -1108, 6813, -3519, -9243, 7100, 8108, -5356, 3454, -15531, 5299, -11191, -10863, -2403, -5051, 8176, +9047, 28, -1507, -5995, -563, 2596, 4687, 4771, 8119, 5388, -5006, 12431, -2720, -3127, -9170, 4960, +-15955, 11152, -2490, -12787, 6679, -14706, -2323, 2483, -10343, 4488, 3077, 7916, 700, -404, 12971, -2815, +5847, 4340, -13691, 5384, -16217, 17928, -13682, 7768, -4306, -1088, 14279, -7871, -7875, -4914, 1031, 7820, +-9947, 10731, 684, -5819, -3421, 3000, 8720, -9062, -11194, 17142, -3228, -2596, 13144, -6854, -1954, 15312, +-16353, 8513, -167, -5176, 8803, 1500, -4242, 11472, -2580, -8814, -8196, 14950, -4874, 9799, -2715, 9976, +-6956, 1120, -3599, 13578, 1024, -12278, 6719, -555, -4579, 6123, -2576, -2503, 7451, -8067, -16600, 5792, +9561, -10658, 2747, 4556, 8691, -9019, -4871, 9609, -6612, 3331, -8062, -3098, 6724, 1281, -935, -700, +-10776, 6197, 9140, -7791, -8627, 4616, 12016, -8520, -10858, 9072, -4743, 2296, -1339, 6380, 1199, -9739, +-1635, 6603, -839, 1159, 2024, -6613, 3823, 3713, 9691, -896, -1179, 2588, -15667, -13420, 2743, 12267, +-5217, -1667, 5231, 3312, 5249, 828, 6779, -424, -4267, 6779, -1954, -5176, -10646, 11968, 1227, -11059, +3935, -6380, 10198, -10460, 1095, 8272, 2617, 10407, -3951, 6943, -1195, 9888, -5471, -8119, -7244, -794, +35, -3595, 349, -6947, 2756, -912, 4076, -5899, -5915, 53, -6535, 16691, -9411, 9445, 8199, 7148, +3524, -8572, -1906, -6827, -3756, 7586, -9135, -4931, 5231, 8928, -2735, 8112, 4543, 4472, 3627, -700, +-11011, 10774, 780, 8335, -3702, 18446, -7328, -10302, 320, 1651, -1051, 6535, 10492, -2891, 712, 7814, +-5927, -2699, 3919, -5006, -10015, -924, 7884, -8251, -13247, -288, 6368, 9520, 6268, 368, 3269, 5204, +-5083, 869, -4771, -3059, 1692, 11727, -10631, 11148, -5671, -3043, -2335, 1439, -10407, -8714, -1648, 6211, +2255, 131, -4228, -919, 7326, 2136, 2432, -8383, 11807, -20456, 6808, 5812, -15054, -2904, 15059, -17807, +10280, -9475, 13420, -5915, 9671, -4199, -12363, 4805, -9028, 5352, 760, 13003, 2843, -4958, 14008, -2455, +-2720, 2604, -2927, -3640, 3788, 8048, -7103, 684, -5140, 780, 896, 3743, 10352, 677, -1835, 7255, +-12454, 2328, 13140, -19483, 8320, -5580, -1767, -1591, 15364, -14619, 4680, 1885, -864, 4883, -2043, -6066, +6703, 7180, -1812, -4623, -6984, -331, 8344, 3932, -2339, 7747, -14758, -1906, 3830, -12440, 10911, 10856, +-6628, -224, -600, 3339, 7075, 7, -491, 5737, -10838, -563, 14104, -16716, 12967, -6551, 2685, 3729, +-5758, 11667, 963, 2768, 16552, -16150, 3720, 7533, 1851, -3143, -511, -9587, -1302, -4000, -11137, 9088, +-11611, 5516, 1348, -1687, -1231, 7795, -24027, 16547, -5439, 3454, -636, -1040, -3991, 7592, -5484, -3135, +8157, -6034, -6291, 3107, -4135, 4080, 7955, -2576, 3560, -6284, 5452, 890, 5552, -760, 9947, -9006, +-7599, -83, -915, 1788, 4969, -4855, 1184, 3691, 1879, -9395, -3324, 19802, 10049, -13270, -302, 11203, +-11344, 4172, -2171, 1295, 281, -4392, -12135, -926, 3919, -4695, -979, -4504, -2631, -7535, 10663, -14427, +4119, -17796, 5979, -2378, 7032, -7820, 10031, -4894, 8258, 7683, -215, -2070, 725, -1183, 12570, 1680, +-9192, 208, 11059, 1676, 147, 5908, -15091, 12803, -534, 6428, -5744, -3098, -3951, -11635, 4319, -375, +3324, 1136, -2859, -4279, -3048, -1282, -1204, 10311, -9596, -55, 4153, 10795, 3568, -183, 821, -6123, +3859, -1687, 5275, -5372, -7143, -620, 1747, -4611, 7471, 2056, -11667, -3315, -3036, -3531, -342, 15695, +-8000, 5231, -5407, 3772, -9347, -15275, 8044, 1108, -11720, 13317, -10503, -2508, 9571, -11403, 15104, 15056, +-4874, 2015, 13119, -8164, 5815, 3317, -5188, 11100, 5503, -7251, 15371, -2344, -7027, -1436, -4030, -14099, +10956, -2558, -399, 13434, -5063, -11891, 3173, 8026, -11895, 10467, 960, -1906, 2248, 11652, 4212, 343, +-5710, -3816, 9500, 3080, -6307, 4119, -7650, -1240, 131, -4976, -1626, 285, -6703, 7244, 1895, -5870, +12695, 3763, -960, -10790, 5250, -771, 1516, -5266, -726, 1473, 3424, -3219, 4270, -11152, 5372, 3633, +908, 140, -12663, 7800, 7103, -596, -1343, 13031, -2155, 4652, 64, 8832, -9562, 8696, -3775, -2599, +9006, -3827, 5600, 4976, 1687, 0, 7643, -6143, -7868, 10728, -359, -20235, 15412, -12675, 1411, -6072, +816, -2002, 1731, -4880, 1300, -3624, -2323, 3039, -10288, 4728, 2480, 1031, -3299, 11772, -14546, 15576, +-4190, -9463, 5420, 7210, 3576, -10022, 9215, 11556, -10858, 3144, 3376, -6148, 2859, -351, 333, -5815, +24, 19, 131, -7123, 8142, -4914, -103, 2416, -28, 2535, -7422, -4607, -3747, -9195, 468, 411, +-14163, 6024, 3260, -5010, 7779, 10147, -3098, 8547, -2711, 7595, -972, 1432, -1227, 9136, -5054, 6088, +1500, 905, -7454, 1083, 4575, -5111, -3164, 9026, 596, -1619, 908, 204, -18243, 751, 8369, -5443, +-12379, 4960, 11608, -8212, -418, 6972, 596, 2800, 3396, -5092, 7485, 3848, -3652, -40, 14626, -4860, +-7406, 10387, -2327, -7595, 5901, 8552, -1158, 2303, -3711, 3488, -7130, 5291, 2588, -18416, -459, 11406, +1291, 939, -7339, -11971, 14573, -955, -4931, -3932, 8679, 2015, -6656, -4539, -20351, 13680, -9794, -7034, +12787, -5931, -2471, 74, 1837, 6476, 4324, -7704, 9504, 3460, 4883, -16987, 18799, 3228, -5892, 671, +-1060, -7599, 6075, 3096, -17892, -2923, 10981, -14591, 6364, 6197, -1532, 1487, 1054, -5696, 9619, -87, +-463, -3290, 7071, -5927, 12964, -9206, 1523, 6863, 1035, -6590, 4427, 5833, -4190, -3659, 4983, 1020, +-15326, 4536, 4760, -5888, 44, 1028, 1165, -5035, -8244, 11619, -4199, -1375, -7055, -7100, 9192, -1418, +-8000, 7552, 379, 883, 4037, -2982, 4135, -11136, -8279, 1149, -7171, -1003, 691, 6312, 4212, 3823, +7855, -5010, -3788, 17103, -8294, 3176, 8212, -14106, 7283, -1323, 368, 6728, 3527, -10109, 3549, 1500, +-5591, 3196, 4064, -1600, 4880, -9514, 6881, 2897, -8110, -1291, 8189, -8003, -694, -5332, -3175, -4290, +-495, -2319, -5347, 2248, -1118, 11859, 1439, -1047, 691, -13967, 7479, -1215, -2856, 2752, 53, -11316, +5471, 2939, -3688, 4636, -5803, -7699, 10484, -3344, 121, 6056, -8322, -4511, 2483, -10687, -4475, 12632, +-9714, 1432, -2136, -6526, 7556, 9031, 2756, 2708, -2441, -7374, 6692, -5019, -3406, 6567, -7360, 6027, +-375, -7059, 643, 4996, 2252, -507, 1870, 14168, 2563, 3192, 3675, 400, 2920, 445, -2282, 1908, +-4980, 2528, 7836, -1731, 1608, 4709, 857, -5936, 29051, -6111, -2943, -10387, -1992, 53, 9484, -6947, +2724, -5111, 5439, -1015, -8607, 15991, -6507, 2068, -9110, 1801, -4367, 9112, -5183, 6400, 8663, -8878, +2432, 9821, -2214, -2531, -4632, 5767, 3916, 4201, 1724, 5024, 3116, 1639, -9224, 9568, -6239, 1992, +5976, 1591, 4456, -3020, -1532, 3720, 5635, -2047, 6956, -3094, 10548, 308, -2040, 8495, -3444, 1664, +924, 2360, -7319, 17431, -1136, -1060, -3991, -1224, -6450, 10391, -11647, -1963, -4890, 2029, -10015, -534, +-3406, 424, 9883, -4507, -13630, 2740, -1263, -1722, 19704, 4256, 1240, 2907, -7478, -8655, -1220, -1355, +13646, -10172, 5432, 7228, -12654, -12035, -1812, 4531, 5728, -655, 4791, -2624, 1363, -74, -1446, -10699, +-2367, 4712, -17860, 8417, -336, -8007, 3700, 3796, -10134, 2619, 8707, 11184, -935, -7859, -2063, -144, +-2811, -9047, 14183, -4572, 3052, -6195, -2104, -7287, 1772, -15724, 5231, 10063, 4928, 9026, -810, -7747, +-5402, 11827, -4579, -11570, 5439, 9724, -1918, 4051, -5723, 14763, -11171, 13872, -646, 760, 1101, 5760, +-9384, 9696, -1350, 1040, 10227, -2988, -1063, -5427, -13860, -15727, -2171, 2571, 821, -19704, 15955, 3777, +908, -12358, 7045, -1295, 4037, -7903, 5181, 7916, -4851, 7036, -5854, -1619, 7419, -11219, -3372, 8258, +-13860, 4695, -2740, -226, 2000, 14615, -3306, 12290, 4449, -7011, -1282, -3586, -9028, 8132, 4579, -10031, +6881, -5420, -6150, -600, 8630, -9504, 17190, -11959, 488, 1175, 13215, 2508, -67, 4853, 7203, -12855, +15868, -3560, -4142, 4504, 285, -3214, 4228, 7640, 388, 5660, -4434, 6229, -3119, -2489, -7410, 10879, +-13668, 9938, 3087, -4164, -3996, 7016, -10227, -6271, 552, 10378, -2132, -3258, -4887, -4099, 7264, 18591, +-858, 9103, 400, -3087, 11820, -15747, 20811, -12914, 17899, -13562, 7007, 16107, -5844, 1856, -5879, 15052, +-13112, -7428, 7515, -5427, -19300, 13954, -1692, 8087, -13623, 4187, -351, -3634, -7964, 7909, -8810, -7879, +4064, -4335, 2323, 9986, -14183, -8903, 7251, -1291, 14380, -6111, 15651, -11214, 436, 1860, 10815, -15526, +4855, 151, -3682, 4776, 7916, -6571, 7930, 171, 2547, 12255, -13482, 12923, 4712, -1371, 4556, -4552, +-8639, 12312, -7602, 10995, -2248, -11923, 10480, 575, -9568, 7955, 2312, -2200, 3984, 4434, -1439, 700, +4452, 1755, -6738, -4707, 2913, -8848, 1140, -8075, 12896, -12811, 11528, 7184, 3777, 10391, 2337, 108, +5881, -3180, -331, 14019, -7923, 10892, -16306, -2743, 1380, 9236, -992, 7080, -1494, 8016, -4459, -2788, +-2323, 575, -7843, -800, -10639, -5010, 8157, -7175, -3296, 7688, -7175, 2063, 10448, -13970, 4805, 2075, +-4620, 7779, 9659, -7492, 7672, -13894, 5366, -11075, 4556, -3135, -215, 4160, -1624, -90, -5571, 15307, +5760, -7390, 6765, 12700, -8883, 15155, -783, -3880, 3248, 247, 3980, -1731, -8655, -1712, -9224, 6669, +-2911, -3476, 171, 7832, 2268, -2556, 9600, 416, 4988, -6266, -3255, -6483, 12723, 2179, 11608, -9527, +1035, 5455, 3155, -2191, -7207, 1136, -906, 2444, -3611, 3399, -10022, -11426, -3290, 9928, -6450, 6863, +-8684, -219, 4579, 5699, -10343, 13591, -2827, 2196, 1195, 3339, -11900, 9315, 2715, -4563, 14111, -11111, +-1035, 4044, -1972, 179, -4363, -5327, -1742, 4791, 3624, -20308, 4935, 4044, -1927, -13831, -5863, -1655, +6056, 9224, 4420, 5883, -80, 6079, -231, 10815, 4279, -5407, 14384, -15686, -3380, 1069, -1384, 7351, +-9158, 3551, 4172, 4655, -4456, -1227, 2898, 1687, -10742, -5079, 9676, -1635, 3964, -5536, -2063, -15291, +12570, -6091, -3579, 9815, 2849, -8410, 4379, -9678, 7716, 748, 4037, -13523, 1179, 7836, -11741, 9967, +1496, -4196, 8475, 1352, -7506, 10143, -8627, -5744, -2982, -3903, -1175, 11000, 2624, -1462, 7608, -6266, +-1028, -1644, 9136, -14188, -915, -3560, 6998, -6783, -1461, -5799, 7707, -71, -8736, 19628, -4678, 7155, +1755, 6296, 1744, -14143, -8012, 5359, -11686, 4427, 5671, -6907, 14183, -7244, -2959, 16672, -5111, 6316, +11708, -12714, 1284, -2403, -4935, 5892, 871, 10143, 1767, 924, -6483, 11328, 1448, -2355, 10268, -3, +-459, -6423, -2991, 9063, -7492, -8199, 13858, 1272, 8164, 1847, 2943, -8475, -6179, 10444, 9334, -19506, +6319, 9587, 1528, 7299, -12208, 6606, -9999, -979, 3780, -4096, 7813, 10724, 6168, 8871, -8190, 10300, +8980, 1715, -2891, 5031, -2695, 11772, 1352, -3951, 3756, -5899, 9657, -3538, -3435, -1751, -2070, 6931, +-12354, 9131, 6248, -42, 9732, -775, -3372, -2727, -272, 15683, -507, -3502, 9147, -2159, -716, 4208, +-11039, -10954, 12570, -15686, 4295, 4009, -6323, -10350, 2280, 4776, -3290, -1699, -9115, 1981, -3763, -119, +6931, 8764, -1090, 1571, -13812, -4295, 14491, -2015, -800, 96, -1559, 1468, -3798, 15911, -13324, 3228, +459, -4352, -1204, 9651, 1560, 5744, 1788, 11175, -5639, 3000, -10742, 12051, -7690, 10320, -12315, -955, +-2351, 8764, -495, -1967, 3164, -3827, -1528, 4848, 2467, 3531, 1015, -2827, 17456, -7855, 11968, -17832, +4395, 10884, -17112, -5284, 15228, -10346, -3103, 4263, -10391, -3519, 4115, 8508, -2036, -10998, -3187, 4155, +5384, -7667, 705, 13970, -8219, -2542, 6416, 5924, 20055, -5340, -1760, 6556, -5211, 1992, -9810, -4411, +12868, -7807, -13537, 6843, 2011, -4160, -9687, -1664, 8848, -5612, -4267, 11898, 1803, -5400, 4023, 869, +-5003, 1095, -1500, 1632, -7863, -4839, 12656, 4085, 6695, 1195, -607, -4931, 11291, -1095, 2212, -19063, +11540, -16647, -700, -1151, -3770, 2795, 4787, -8543, 13500, 8736, -1863, 7152, 3975, 2255, 2337, 2040, +11348, 9507, -12071, -8828, 6544, 1724, -8775, 13475, -11180, 2943, 552, -2494, 2827, 6872, -15187, -1607, +9488, -3695, 131, 6824, -3798, -8974, 16716, 912, -2063, -6439, 11243, -8082, 6824, -10578, 23207, -17668, +2337, -7544, 6956, 3932, -4078, -5307, 8183, 3192, -6086, 5748, -7779, 2676, -3736, 3223, -2075, -10394, +15649, -8012, 1425, 14692, -6079, 12, -12454, 301, 783, -2494, 2560, -4935, -2770, -1288, 13992, -6535, +-1596, 2212, 3292, 1216, -10731, -11383, 15767, -955, -15285, -2596, 8764, -1562, 5576, -6940, -4247, -935, +-6687, 4388, 8443, 11987, -7903, -7875, -452, 22544, -24358, 16367, 6672, 1856, 1507, -16135, -1108, 6711, +-8980, 9944, -2686, -12135, 1521, 10316, -3615, -3476, 4203, 8896, 9744, -1127, 7296, 963, 2015, -10302, +6875, -2184, -983, 7634, -10856, 2888, 8687, 3855, -3344, -3948, 2416, -4923, -6916, 4057, 6457, 5715, +-6667, 14844, -6555, 10836, -5922, -1931, -8974, -1047, 3568, 6409, -13962, 5471, -3235, -2563, 8643, 3203, +15056, -367, 6344, -5414, -7203, -11731, 20486, -14758, 11316, -7896, -7830, 5596, -2152, -5735, 1763, 9639, +2131, 5243, 12771, 4308, 3289, 3777, 3531, 10676, 4023, 2040, -8164, -3315, -10542, 16107, -4290, -4376, +1879, -5648, 13064, 6515, -5536, 2653, -1063, 35, -1379, -17632, 9377, 9919, -1494, -9199, -1040, -1022, +6375, -9863, 7804, -2991, -7275, 5095, 2512, -7763, 359, -4842, 4825, -3255, 1224, 8351, 3385, -2287, +12903, 7832, 3241, -11455, -8367, 12071, -11843, 5040, -4832, -2483, -288, 4308, -2920, 2984, 896, -2531, +-5083, 751, 5756, -616, -1095, 4858, -10090, 3845, 10724, -10974, 10567, -3914, 6651, 3000, 5012, 1608, +2391, -6400, 4463, -6314, -424, -1220, -15827, 11763, -1379, -254, -475, 17334, -2378, -9224, 1220, -171, +5708, -7303, 11708, 20107, -1494, -2535, -1083, 5593, -3499, -783, -14532, -3280, 1516, 7928, -11519, -771, +2943, 548, 4192, -22195, 3549, -5628, -3770, 5683, -176, 4112, 15920, -11914, -18739, 10295, 4572, -1760, +9555, -2127, -11050, 2975, 6091, -1892, 844, 8668, -4682, -4796, 6336, 6744, 1870, -10646, -1022, 19932, +-4174, -8467, 3501, 3096, 4880, 4735, 2540, -675, -14767, -5179, 48, -9803, 14737, 1589, -459, -7387, +15007, -3720, 8180, -5511, 3502, 3196, 4415, -1063, 5359, -2875, -9006, 4858, -671, 363, -4871, -5334, +-7526, -11007, -5266, 6115, -14147, 6728, 9924, -6223, 7804, 4060, -21611, 10760, -3248, -5347, 8958, 15335, +-14959, -4755, 6216, 1788, -1172, -762, 5056, -1974, 8659, -7636, -4420, 1608, 3743, -4908, 12659, -9398, +-6870, -2136, 6948, -1815, -2991, 3604, -2378, -3488, -6063, 9712, -7203, -1635, 2179, 1986, 7996, 1445, +-14648, 14400, -3180, -3864, 1705, 4408, -5555, 8532, 176, -2907, 3412, -5127, -254, 12967, 11243, -15786, +4848, 11720, -12794, 4536, 7023, -5803, -2898, -3030, 953, -11522, -1466, 5972, -6239, -726, 6852, 657, +6731, -6143, 7977, 915, -7080, 3356, -6163, -8367, 17450, 2788, -17655, 4244, -6327, 6859, 4401, 3337, +-3556, 3549, -2904, -1999, 6496, -176, 609, -11939, 5060, -1632, 7488, -12210, 12447, 5528, -4855, -463, +6464, -10346, 13144, -8916, 1870, -9835, -4880, 11412, -4531, -6735, 4459, 2515, -18168, 15399, -5199, -8235, +-5922, 6891, 3715, 2396, -24103, 11547, -1008, -3200, 6756, -7011, -1972, -4719, 7731, 890, -6287, 424, +9657, -9651, 6277, 6868, 14799, -7168, 2280, 4180, 5127, -4183, -6483, 2788, -2011, 7419, -6811, 6056, +7615, 3804, 2339, -4016, 4848, 9748, -4723, -15474, -4764, -559, -4228, -2827, -6847, -8639, 3551, 4858, +-8723, 9783, -2615, 3511, -2695, -2412, 6072, -1051, -10742, 2932, 11152, 4548, 3488, -6498, -5498, -3271, +-10959, 12173, 14291, -5552, 4858, -4319, -2056, -2339, 1448, 4164, 13598, 6036, -2866, 1780, -10371, -7266, +979, 10309, -7244, 8164, -6972, 4352, 1612, -14523, -1224, 22591, -5642, -10040, 12080, -5058, -2175, 3135, +-4212, 6312, 3364, -6622, 7752, 5776, -11759, 5384, 3941, 1516, 3563, -6651, 3023, 3948, -22201, -880, +4003, 1391, 4771, 1892, 308, 4292, 5028, -3203, 3948, -14236, -4839, 9311, -2063, 3878, -3939, 7813, +-11535, 5908, -331, 276, 4568, 1348, -1384, 11569, 236, -3084, 1696, -1876, -1067, -12011, -19907, 6460, +2464, -4019, 9696, -14250, 15104, -2927, 9596, -559, -7975, 8746, -9475, -3164, -13807, 2148, -327, 4415, +-11659, -4363, 7244, -5315, 4308, 8026, -9108, 12338, -4131, 8190, -11782, 12203, 5963, -2702, 20007, -8060, +-1954, -7747, 6409, -6679, -7830, 16103, 2243, -12999, 5544, -2002, 1879, -3071, -13140, -13678, 600, 4559, +773, -6034, 2701, -2663, -3351, 11734, -19688, -6783, 7219, -11392, 3032, 3592, -14006, -4048, 4096, -122, +1551, -1480, 8436, -1090, 2768, -8980, 11380, -21115, 7652, -2232, 1724, -4775, 359, 3447, -11059, -6802, +4032, -14706, -11599, 7939, -4735, 4646, -2863, 3339, 484, -6783, 4244, 10288, -9370, -2339, 1808, 16679, +-5051, -6924, -1439, -9411, 9671, -1673, -13774, -74, 3269, 4212, -1391, 1591, -5019, 10232, -8999, 8508, +5812, 2972, -9012, -5571, 20262, -8807, -1243, -3788, 2747, 99, 2599, -4092, -5967, 4408, -3563, 7552, +-3166, -1108, 3852, 7978, 6606, 1281, 4433, 3652, -10040, -6170, 5776, -4276, -2515, 844, -195, -7303, +60, -1924, 1220, -5658, -8042, -2248, 1332, 3360, -110, 472, -3739, -13507, 5764, -5304, 10220, -8883, +7745, 5903, -1610, 816, 5856, 3975, -19, 80, -1076, 5352, -5307, 9842, -6498, 8160, -3531, -694, +-1856, 3303, 2972, -7903, -8142, -5144, -9687, -2207, -5176, 12356, 4858, -3421, 5737, 7615, -9015, -2811, +11323, -2866, -5699, -7608, 13739, 179, 4256, -8823, 7804, -4010, -19574, 7592, 9712, -604, 1339, 543, +3119, 1464, 2111, 3319, -9659, 3688, -13987, 13211, -4678, 8841, 2081, 1576, 10760, -2400, -1003, -12515, +1143, 3180, -5163, 7930, 7977, -7615, 3009, 1837, -906, -3016, -5414, 5462, 5792, -8752, 13819, -6195, +4276, -5867, 2727, 3524, -8035, 7528, -3262, -1206, -9520, 4388, -3091, 9484, -2255, -8907, 1820, -138, +552, 616, 2631, 3551, -6102, 3560, 4743, 732, 1179, -507, -6792, -3955, 4800, 1165, -2239, -2268, +9520, -3406, 596, -1375, -167, -7348, 2075, -11490, 12520, -9983, 9703, 285, 55, 1359, -11930, -2375, +972, -10227, 9240, -4579, -1751, 5391, 3135, 8987, -6824, 7964, -6979, 6140, -6271, 9815, -11228, 928, +-247, -10770, 2884, 8360, -8762, -2708, -1940, -3283, -10722, -3823, 19040, -21591, -7772, 11759, -5696, 9543, +-9108, -2934, -716, -12406, 8411, -12363, 1204, 5593, -6840, 3743, 4343, -13434, 10451, 953, -6216, 14352, +2300, 2868, 5559, -5571, -11171, 13366, 3071, -13039, -4295, 17199, -13475, 6364, 1940, -2628, 12720, 60, +-17408, 459, 12107, 400, 2995, -7196, -6303, 4003, 10024, -16511, -808, 2612, 14999, -13331, 15464, -11991, +5927, 1947, -2111, -6327, -6279, 735, 2116, 74, -7592, 3408, -6683, 7440, -12119, 5249, -4087, 8759, +-10282, -12999, -16039, 25451, 2196, -668, 5452, 12791, -6416, -4678, 6827, 2556, 2159, -5715, -8887, -1847, +7634, -8727, 6476, 767, 1359, -14031, -903, 2453, 60, -6134, 9960, -15519, -7659, 3739, -2934, -7743, +-2931, -2214, 7383, 5404, -7312, 16923, -10491, 334, -2107, -7704, 4764, 8575, -11355, 9963, 4928, 4999, +28, -2535, -64, -5356, -9527, 2123, 5044, -6498, 424, -8543, -2278, -6471, 12768, -11542, -4643, 7055, +12488, -4851, -6054, -8664, -947, -2982, 4415, -12287, 6751, -3146, -2982, -2539, 427, -1722, -6594, 2656, +-9839, -4379, 3337, 2179, -15779, 12280, -10587, 21016, -12884, 2617, 8228, -3258, -7374, 9259, 4112, -9530, +5108, -1844, 8768, 204, 9657, 2088, 3280, 3713, -12572, 11474, 10615, -14215, 18908, -23416, 10271, -4516, +2400, 324, -3139, 2872, -2982, 1673, 5815, -17655, -1999, 7107, 2123, 3176, -2435, 6252, 2907, 1095, +-17008, -3791, -587, 17327, -12832, -3454, 372, 3071, 4548, -6156, -6564, -5874, 3207, 6075, -9110, 3595, +4085, -1199, -1003, -1311, 17536, 199, 11392, 1213, 7046, -14822, -6175, -163, -90, -12344, -694, -6095, +1755, 9233, -10712, 7380, -639, 3723, -808, 9259, 6528, -1706, -7403, 1600, 9500, 1179, -1819, 1933, +253, 5728, -2606, 4652, -1567, 4572, -3235, -7650, -11638, -616, -1514, 1699, 8958, -20299, 6924, -1204, +-876, -2866, -10651, 623, 7232, -8883, -6346, 9644, -17408, -926, 11332, 4392, 3020, -8499, 14359, 543, +-3116, -7711, -7939, 7258, -14318, 10320, -5382, -3894, 11255, 1776, 2531, -5783, -13730, -5035, 8999, -4816, +7576, 4931, -8486, -183, 17691, -10307, 260, 2303, 6403, -16846, 4575, 5436, 7928, -2011, -315, -5942, +4183, -8851, -1461, 13623, -5715, 2364, 4536, 527, -5188, 6843, -7251, 340, -2448, -5867, -15175, -199, +-5628, 4251, 2476, 1632, 6558, -1147, -7583, -2535, -4860, -7512, -10906, -924, 11583, -11419, 1911, 611, +-7715, 449, -3315, -443, -495, -11483, 73, 1760, -636, -6535, 5699, -2123, 2309, -2952, 6027, -3319, +1192, 552, 3492, 9808, -10350, 5696, 5723, 8379, -19314, 5979, 5152, 3364, -158, 7891, -2191, 3681, +-12791, 2704, 4452, -21012, -5275, 823, -3791, 2332, -9748, 11891, -2296, -4798, 9259, -16274, -3030, 860, +-8543, -1111, -2344, -7071, 10899, 2268, 1028, 1952, 3688, -3299, 571, 40, 1165, -8759, -4324, 340, +-2451, 5072, -6728, -3116, 1407, -3208, -4935, 6491, -9555, 2120, -4315, -2856, -5899, 11731, -32, -12550, +-10779, 6744, 12527, -1252, 292, -4536, 3804, -8255, 5799, 18314, -2344, -842, -13764, 3579, 10427, -11838, +6915, 11136, 11652, -10108, -2091, 3460, -6170, 1507, -6767, 1664, -1388, 1480, -15410, 15868, -8823, 11708, +-1375, -2759, -2508, 857, 3303, 947, 5480, -8755, 6779, -3779, -3326, 2284, 281, -2132, -1578, 4655, +2300, -963, -10835, -3547, -2111, 1840, 1740, -3007, 5085, 4548, -9015, 1904, -627, 11859, 2856, 11888, +-3866, -5120, -5938, 6127, -11066, -3747, -4019, 13691, 6765, -5498, -8791, -1471, 10362, -5867, -147, 6264, +-6931, 9072, 2227, -4507, 5144, -3036, 35, 6442, -1632, 600, -15506, 7267, -8732, 5227, 3989, 775, +4809, -4536, 1947, 4887, -15079, -6382, 1616, 6929, 4828, -183, -1391, -1298, 9876, -2963, 160, -4447, +-10692, 5740, -2911, 6900, -3903, -1487, -10606, -6218, 67, -443, -6523, -4511, 15811, -2255, -4071, 3659, +4244, -3451, 5507, 247, -7114, 561, -16730, -2879, 5612, 1159, -6027, -6799, 5983, -12299, 11431, -974, +-3547, -1095, -5744, -5356, 14346, -5343, 493, 13482, -3223, -7123, 8035, 16331, -10104, 11243, -6751, 3232, +-7291, -1963, 5076, -1972, 6840, -8130, 3878, 5231, -9452, -23, -12691, 16814, -11471, 4019, -3618, -5407, +4311, 4482, 4331, 2100, -8155, -1870, 2904, -12536, 4616, 228, 3617, 4684, -4180, 5833, -263, -6435, +-5860, 4748, -6834, -13479, 9851, -5903, -3654, -2931, 15811, -367, -322, -1822, -5806, -6868, -6574, 5380, +3791, -3210, -4475, 2376, -4931, -3132, 2708, -12283, 5320, -3151, -7430, -775, 17951, -3894, -6319, 3367, +8491, -3770, 3251, -2686, -6031, 5895, -4632, 4164, 6587, -2474, 12367, -5803, -9135, -732, -7271, -8623, +12011, -12547, 7326, 568, -3606, 712, 5992, 4172, 5152, -7114, 8051, 286, -4942, 8287, -3059, 2704, +-2310, -7823, -7355, 334, -12978, 15611, -99, -2542, -19, -11383, 3324, 1336, -8418, -14027, 1120, -8967, +11836, -5231, -9491, -4099, -9890, -1307, -2856, -8771, 3893, 10760, -9411, -4880, 5060, -475, 5484, -712, +-5450, 4404, -16957, 8864, 9548, 456, 3255, 7499, -7551, 11029, -7898, 5115, -2692, -6891, 8324, -5903, +-9951, 10001, 4249, 5555, 4319, -5691, -6487, -3538, -15355, -3659, 2980, -8611, 5972, -1799, 10300, -8878, +12039, -842, 4360, 9495, -15371, -9370, 7239, -12107, 2268, -2763, -1616, 5516, -3483, 2052, 1088, -4379, +-4755, -8876, 10512, 1995, -4495, 11367, -10166, 5901, -6519, -4164, 4719, 13835, -2635, 4167, 4433, -3723, +-7779, -9575, 3207, -3380, -11426, 8957, -11146, 4584, -1108, 9195, 9131, -10109, -11855, -8110, 7900, -15339, +11052, -2268, -2672, 12415, 420, 7374, -1206, -3959, 6152, -5936, 2503, -3344, -11699, 12556, -23043, 14844, +-1740, -9552, -3050, 4221, -15647, 2425, 10124, -2079, -2519, -2651, -1327, 3385, 4623, -7791, 9623, -3932, +552, -2943, -10712, -10152, -1375, 4743, -13791, 16836, 11872, -11239, 11636, -9042, 552, 11243, 3666, 3777, +-7299, 7839, -6708, -8130, -1838, 4384, 4482, 6635, -6744, -883, 2984, -3599, -3290, -2587, 1820, 4572, +-9808, -10359, -10239, 13539, -5594, 5, 17071, -4990, 5623, 6532, 9156, -7563, 7332, 6505, -2923, -11440, +-1167, 1136, 3476, -2804, 8304, -6371, -7814, 2795, 3576, -7560, -10455, 7784, 9404, 2380, -1507, -5651, +3303, -4620, -8415, 3251, -7927, 3020, -8520, 14332, -611, -1012, 2631, -2954, 6204, 823, -3262, -7782, +4215, -972, 22386, -1475, -4547, -3315, 2920, -17008, 3707, -8215, 3887, 783, 7987, -12023, 4873, -11927, +-2079, 9815, 8283, 3080, -4764, -4215, 15567, 10580, -8554, -5382, -4174, -1336, 3675, 4507, -12932, -4026, +-6699, 10011, 2952, 4559, -2508, -1607, -206, -6744, -1143, 2319, -10915, -4607, 9267, -8939, 6200, -2138, +2955, -3900, 9484, -199, 8475, -4791, -3007, -5054, 5462, 1448, 3068, 744, -2587, 5853, 3688, 3624, +-6435, 5099, -7506, 1468, -183, -1680, 4336, -7235, 7697, 609, -8810, 5167, -7640, -1124, -8739, 6448, +4728, -8983, -8896, -1412, -3948, -851, -115, 7800, -4518, -2695, -9384, -6850, 10339, -4468, 493, -11344, +495, -5927, -235, 6553, 5988, -5552, -5122, 6156, -3556, -3306, 276, -9267, -6555, 3176, 696, -4354, +-9808, -479, 14332, -2580, -14475, 6959, 74, 2772, -2612, -4092, -7879, -274, -6924, 996, 8547, -1870, +584, -3280, -6131, 7936, 12344, -15326, -3691, 3360, 3071, 2604, 452, -4668, 6553, -5990, -11866, 6592, +-7239, -14671, 996, 4835, -5163, 1127, 2136, -3959, -13566, 11194, -10015, 4743, -5751, -6613, 1851, -183, +-6966, 18560, -13190, 1639, -1220, -2104, 6197, 2547, -171, 5931, 6040, -42, 8643, -3923, 5536, -5170, +-8203, -4459, 5935, -2407, 7601, -4475, -3039, 6236, -7579, -2474, 6255, -10343, -5291, 12080, -13812, 3923, +-2211, 4292, -7686, 23250, -4470, 9459, -7264, -6255, 10168, 6088, -8743, 15624, -4702, 1151, -6140, -7971, +-1099, 5304, -16251, 5641, 2000, 2255, 2216, -17155, 4951, -7531, 2868, 8190, 7519, -5851, -15975, 9748, +2168, 122, -2838, 4597, 725, -6284, -5295, 4187, -1350, 6127, -3654, -7159, -2020, 7928, -6279, -3643, +8532, -6679, -11091, 8851, -5359, -3351, 6364, 719, -6676, 10735, 4983, -9283, 1792, -1108, 6931, -11239, +5249, -2743, -775, 3829, 2131, -4092, 4784, -5822, 5240, -13774, 10156, 7843, -3715, -2451, 11583, 16354, +-9096, 5095, -8091, -3839, -3702, 1095, -260, -7171, 828, 4999, 12221, -5575, -10799, 13279, 700, -274, +3511, 5345, -2635, -6008, -14555, 4244, 2503, -1635, -10934, -8939, -951, 16836, -5667, -5628, -3900, 3424, +1992, -2451, -16114, 677, 16820, 1936, 2280, 6567, 632, 2268, 3551, 10933, 1459, 7380, 5819, -7887, +8025, 2692, -5970, 6380, -14038, -1067, 4844, -4151, 2503, -2400, -735, -3827, 5227, -42, 9596, -12711, +-10906, -4107, 912, 2284, 3720, 596, 1879, -18744, 7292, -3399, -1915, 12057, -6011, -9954, 8484, 3691, +3000, -8814, 8283, 13448, -7264, 5104, -299, 8668, -4443, -6676, 8504, -4579, -2884, -9395, 728, -17595, +-96, 14528, -3208, -1603, -2344, 623, 9924, 1503, -9108, 7936, -5083, -9404, 15047, -14532, 8256, -179, +-6956, 3105, -2107, 6428, -12347, 7467, -11219, -1371, 16939, -16647, -2959, -6319, -3151, -4147, 628, -3180, +-2727, 3043, -10706, 10783, 3415, -13962, 2800, 80, 199, 1603, -4552, -1359, 4365, 2015, -1136, 2763, +-1494, -939, 1247, -1815, -9418, 7264, -359, -13190, 7716, -7458, 2735, -4652, 9452, -2460, 15423, -6403, +-3007, 4128, -5826, 4844, 6052, -2319, 1824, 2556, -8630, 10011, 2968, -8736, -302, -5518, -7791, -4030, +803, -9926, 7508, 179, -3502, 18256, -2519, -5527, 18783, -9610, -1674, 281, -7800, -2088, 137, 9821, +-7159, -6307, 5086, 2111, 44, -1616, -3078, -9935, 7326, 2476, 3435, 179, 6820, -3112, -1167, -12107, +584, 7871, -6442, 3800, -2891, -12046, 4896, -3756, 6875, -1079, 4269, -2355, 5448, -13411, -4055, -1019, +-12367, -247, 11136, 755, -8819, -4812, -2606, 1131, -1019, 64, -600, 7319, -775, 6765, 1232, -6532, +-534, -13179, 3980, 2927, 1673, 1199, -2451, 4019, 4420, 6095, 6883, 2492, -6503, -7786, -1227, -9144, +956, 8725, 1227, 4365, 4687, -3615, 13627, -11146, 3453, 449, -5286, -4208, 9774, -5730, 748, 1053, +5008, 4039, 2884, -2278, -14195, 1788, -2804, -3739, 2503, 19280, -2606, 89, 1024, 732, 6394, -6950, +-1143, -4475, -11503, 12447, 3540, 2131, -7143, 2752, 14152, -6054, -935, -5888, 15756, -7291, 10198, -7903, +6915, -11323, 4164, 5600, 204, -5947, 4752, 5824, -5511, -2624, -2207, 5949, 4155, -13087, -939, 14443, +4340, -7291, -7679, 18523, -10731, -2644, 4279, 5607, -144, -13546, -4331, 680, -8755, 11731, 1696, -384, +9170, -4411, 10995, 1972, -1295, 504, -463, -3756, 18562, -17990, -6984, 2040, -1015, -32, 4828, -11180, +1628, -167, -452, 372, 1911, 6505, 2255, 2412, -2303, 8944, -5986, 5751, -12442, 4768, -7779, 5133, +1943, -2808, 657, -1355, 767, 219, -1063, -2088, 4931, -9308, -4315, 3804, 14708, -4299, 3260, -6560, +-3720, 6997, -5179, 5519, -11790, 1352, 10555, 3012, 11072, -7422, 103, -2795, -1234, -6287, -1578, -4064, +-1967, 3107, -6580, 1776, -1224, -5942, 3527, 4424, -3374, -4919, 12980, -5323, -308, -10972, -7622, 4584, +-4727, -10211, -743, 6271, 3020, -10963, 3592, -5999, 4343, -2838, 2836, -12315, 6728, 5347, -4470, -3050, +8388, -8007, 11072, -4306, -12354, 11232, 160, 2275, 2131, 6279, -623, -4495, 8094, -11171, -3135, -1895, +10136, -842, -10439, 9430, -4071, 4591, -7196, -1124, 2464, 1747, 5115, -596, -4007, 3151, 4816, -3267, +-2702, -14256, 2991, -2184, -1234, 9523, -12711, 9651, 4983, -7855, 7292, -447, -3335, 5462, 12704, 3269, +-7599, -1259, -40, -8255, -8983, 6120, -1995, 4832, -10275, -1760, 10984, -363, -3355, -1127, 2788, -14879, +-4739, 696, -7184, 2223, -11711, 6140, -4319, 247, 9928, 6991, -4556, -251, -4874, 5024, 3144, -5356, +12360, 1936, -5671, 5731, 9716, -14648, 16080, -9035, -1559, 7171, -2416, 3100, 4119, 1208, 3624, -12479, +-2824, 11175, -5259, 2428, 2004, 5748, -5879, 0, -8491, 6724, -6314, 11371, -8878, -4160, -3640, -552, +-1268, 4855, 12447, -6546, -5767, -9863, 8780, 215, 4319, -11651, 6065, -5471, 1124, -12406, 5632, -5211, +-3214, -12392, -2914, 6088, -4695, 1812, 3264, 1359, -7328, -2695, 11547, -6198, 4365, -6776, -1658, 9744, +-30172, 16716, -9999, 13935, -2558, 4728, 2243, 11631, -4996, 4627, 11663, -9703, 1936, 883, -575, 2653, +2560, 7479, 13295, -9883, 6717, -13935, -3816, 8964, 1272, -13819, -8782, 4408, -1924, -5092, 8691, 1076, +947, 2692, -5792, 2241, -5566, 3299, -10040, -963, 5455, -2731, -4164, 3207, 8860, 9504, 591, 3460, +-992, -6843, 3255, 1676, 5400, 4645, 8363, 1551, -1555, 3996, 14207, -10152, 7896, -13675, 9388, -42, +3772, -9692, -4270, -9559, -424, -803, 15624, -4155, -7264, 12144, -1224, -2296, -1831, 9445, -1587, -5603, +-6571, 4556, 9543, -9970, 1436, -452, 311, 3476, -1974, 2923, -14019, 6760, 3975, 7535, 1885, -4222, +-479, 2685, -19163, -8563, 7928, 6491, 3029, -8110, 9103, 388, 2148, -2972, -8051, -2143, -2015, -12563, +12328, 8679, -1755, 10975, 3878, -6483, -6515, 13732, -11975, -8431, 7027, -8568, -7018, 14596, -408, 4249, +-4556, -4372, 13131, -7659, 5756, -1288, 5863, 4475, -7563, 2473, 13372, -40, 329, 12935, -4338, -828, +9719, -3604, 281, -8891, 3387, -5299, 6719, -967, 1803, -3547, 3527, -15959, 684, 10637, -8158, 947, +-6535, 7683, -4575, -13463, 2701, 7631, -17691, 2104, -6230, 9648, 6072, -4151, -390, -939, -3048, 12524, +3734, 1388, 7727, -6916, 3151, 4249, 4757, 611, -128, 1692, 12264, -9587, 4892, -20527, 719, -4796, +8212, 9671, -10163, -11934, 16415, 3057, -7387, -5072, -1751, 3125, 436, 3248, -491, 1336, -6824, 6339, +-3855, 5683, 2865, -11307, 6088, -156, -12435, 16395, -14539, -3358, 4231, -7319, 4395, -3675, 2339, 6079, +2715, 7177, 1820, -6532, 700, -6599, -675, 3935, 6496, -19496, 12192, -4627, 4131, -370, -7743, -5819, +10836, -14402, 9828, 2913, -7695, -80, -1359, -302, -1167, 8026, -5051, -4678, -3392, 2193, -530, 7383, +-9983, -2047, 7629, 2405, -4055, -4860, 1329, 2184, -7219, 812, 4224, 2523, 185, 151, -452, -1012, +8980, -7887, 3444, -2186, 5224, -4126, -5555, -8935, -3030, -7896, -7896, 5931, -4231, 1391, 6467, -10163, +7528, -10427, -9863, 4691, -4931, 349, -10198, 12916, -6891, 996, 7316, -10250, -9692, 8520, -6695, -15546, +-1147, -2375, 9308, 6279, -5543, 9915, -7814, -694, -6792, -6403, 18715, 5356, 4719, 3960, 7264, 10184, +1828, -8939, -1391, 7364, 2196, -5035, 2236, -3536, 3903, 195, -4459, -4971, -9667, 8552, -3832, -1548, +4768, 6792, -1060, -2394, -7184, -8299, 2686, -7775, -3248, 4155, -2596, -1359, 1888, -979, -7367, 3020, +-1090, 5680, -2843, -14236, -8187, 16518, -13238, 1591, 2280, 3372, -963, 13427, -5195, -1215, 2131, 6717, +1069, -8814, 5960, 4183, -15455, -11146, 7788, -1519, 8704, 2059, -11146, 7283, 188, -7795, -11007, 18883, +1808, -13653, 1760, 12559, 800, 2476, 4876, 431, -7679, -3695, 9247, -3380, -8000, -2615, 4440, 4931, +-5144, 8244, 3372, -3324, -2768, 16959, -10443, -5423, 3800, 9992, -2879, 4529, -15159, 272, -3078, -8739, +-2088, -623, -19786, -4140, 13203, 11248, -7059, -235, -9671, -1302, -10302, 3611, 5461, 74, 1275, 9867, +1918, -1462, -1988, -6918, 2139, 6669, 2856, 1343, -4516, 18767, -14450, 6336, 4231, -3043, 5671, -12914, +8744, -4352, -2963, -6332, -2275, 7615, -5372, -6236, -1427, -1596, 3608, -3139, 9447, 4500, 1535, -10599, +11155, 7326, -10895, -4735, 15439, 1484, 2020, -8051, -5628, 6907, -5359, -2975, 2473, 5719, -432, 2640, +-2364, 1179, 3640, 12871, -15387, 10712, -11838, -15786, -15724, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9374, -16621, 14277, -6120, 10040, +1220, -862, 10967, -6103, -2727, 230, -17183, 2001, 9509, -19257, 6116, 814, 15691, 12471, 844, 14342, +-347, 197, 9066, -16318, -14993, 3326, -13555, 3676, -9937, 5361, 13528, -6580, 9661, 726, -6536, 11381, +-6229, -20189, 1066, -13365, 4914, -2377, -11565, 10230, -6253, 8036, 7987, -11464, 6930, 9559, -9335, 7335, +-3080, 2645, 5709, -10868, 6638, -12012, 931, 15266, -9180, -4764, 11513, 1958, 12606, 2819, -1009, 7516, +-14566, 6860, -10101, -21638, 9073, -4699, -7889, 5710, -80, 12873, 9699, -5081, 9016, -10383, 1318, 4371, +-24375, -2143, -2422, -4480, 7261, 497, 5174, 13010, -83, 12924, -5661, -3790, 16017, -14952, -1581, -452, +-5170, 6366, -282, -2316, 6440, -4538, 15898, 3088, -18224, 18134, -2450, -848, 4113, -9441, -479, -1947, +-7590, 1260, -14140, -807, 13863, -18629, 6701, 2894, 2269, 12617, -3688, -1721, -2800, -6660, 4120, -11640, +-13751, 13316, -9265, 9243, 7987, 974, 18651, 3826, 4894, 1842, -9644, 7465, -2336, -22538, 8478, -8577, +698, 13440, -7700, 7171, 3041, 6345, 6460, -15848, -2460, 6536, -17751, 1344, -3616, -11111, 8134, -6020, +1699, -3396, -758, 16578, -6870, -6165, 12225, -3278, 6800, 5600, -13516, 6799, -5290, 3347, 1228, -13719, +12505, 5371, -3020, 14815, 2047, 2418, 16018, -10931, -601, -6105, -4375, 5414, -21712, -80, 3997, -4262, +14041, 6383, -6935, 9944, -299, 2083, -9275, -14308, 10616, -17570, -5311, 4388, -5767, 8101, 11368, -6274, +6915, 1306, 8352, 8636, -20757, 12358, -350, -4839, 9141, -6580, -4010, 10811, -2138, 4723, -1319, -2238, +18244, -11572, 5562, 4364, -7017, 9784, -4111, -14243, -1211, -4518, -298, -3156, -12856, 14396, -4129, 7059, +14533, -12618, 6802, 5294, -9056, -5569, -11405, -1357, 2696, -19035, 11317, 2750, -2251, 23400, -5758, 107, +8258, -222, 1613, -10614, -10565, 10716, -11798, 2814, 7196, -13540, 16573, 1554, -1400, 4662, -4712, 7563, +-3261, -12115, 4958, -7029, -2551, 8420, -23068, 4386, 1665, -6049, 6438, -10937, 4163, 5496, -5324, 10025, +-2315, -13801, 18485, -16905, -9243, 485, -9148, 7872, -9535, 1006, 9299, 296, 12251, 13144, -17326, 11145, +-173, -9207, -4201, -16766, 7288, -6543, -3432, 10415, -3688, 4705, 18159, -12395, 4359, 1417, -7548, 6076, +-22451, -1008, -326, -8448, 10310, -4907, -10697, 19387, -4354, -2602, 8236, -12792, 11148, -8636, -1892, 2906, +-13314, 8439, 1186, -20553, 7499, 3463, -2766, 7752, -11060, 11160, 1070, 3565, 14175, -18742, -2066, 13225, +-15455, -7493, -4245, -8425, 11317, -9828, 9227, 9065, -7394, 24113, -8069, -6716, 6276, -10904, -5653, -5853, +-20314, 10646, -2568, 4538, 12773, -19484, 21256, 10907, -12101, 2983, -8210, -2160, 3857, -16754, 328, 1284, +-6172, 15757, -18599, 14102, 10579, -8592, 9517, 749, -4997, 8673, -3283, 141, -4618, -17042, 23668, -11155, +-16894, 18371, -9098, 3129, 9451, -2893, 410, 9271, -799, 4152, -11191, -3804, -217, -13911, 15571, -19398, +3980, 7746, 5020, 953, -9835, 9243, 16219, -11189, -14419, 11595, -20436, 3777, -8326, -5853, 6400, 6518, +16411, -12271, 4119, -2948, 2569, 4442, 12483, -15481, -8346, 8821, -11606, -1325, 4720, -3832, -1885, 14151, +3360, 1968, -4958, 9500, -10810, -18333, 9800, -11879, -748, 5645, 7711, 933, 14260, 17312, 8721, -10682, +5143, 3865, -22675, 7539, -4344, -9291, 5259, 13706, 5849, 6609, 9094, 13683, -6580, -10606, 11927, -18052, +-1173, 1196, -7309, -2412, 10425, 12968, -6448, -2001, 4996, 2324, -13033, 13185, -10788, -1575, 7780, 1653, +2073, -1394, 11268, -3087, -11326, 458, 7332, -16828, 17480, 1193, -3275, 13608, 11863, 8350, -7355, 1309, +-97, -11508, -8367, 9589, -17340, 849, 17131, -352, 7394, 8162, 12862, -10013, -8523, -470, -8512, -11503, +5440, -10402, -7889, 17424, 7189, 8570, -4392, 11824, 1234, -10200, 4316, -1327, -13518, 6351, 5406, -9953, +14785, 4071, 11060, -8628, -193, 7899, -9248, 2531, 5948, -12732, -999, 18472, -4615, 1121, -2517, 2773, +-9988, -10028, 7776, -14228, -275, 5846, 4239, -5192, 9545, 6540, -1303, -12493, -1944, -3683, -14795, 7455, +-7533, -7640, 7338, 18616, -5013, 9408, 7884, -2688, -1688, -5378, 4146, -14707, -2337, 5979, -4388, -7865, +22088, 216, -5354, 9818, -6601, -435, -4518, 3988, -16574, -8278, 2651, 1455, -6659, 1603, 8140, -9678, +1896, 909, -2787, -11576, 7433, -3802, -10337, 4706, 8609, -3012, -7130, 5149, -9470, 926, -560, 1671, +-13652, 2481, 10670, -2077, 233, 7838, 1142, -15957, 6952, -8903, -8331, -4007, 1694, -6492, -6100, 15414, +4881, -712, 1233, 4893, -11254, -2404, 1169, -10926, -13347, 1262, 3869, -10507, 12842, 5720, 288, -1346, +7609, -5344, -6498, 2913, -6112, -9977, -8065, 16179, -6751, 1172, 5188, -1059, -4804, 9888, 2449, -11525, +3654, 2317, 961, -7216, 13966, -1482, -5757, -1339, 3354, -6911, -2624, 10022, -8565, -1859, 6271, 11645, +-7858, 7353, 1060, -10568, -2692, 584, -3447, -14474, 5888, -2340, 328, 3947, 16855, -3272, -1977, 12484, +-6233, -7365, 33, -1158, -19258, -427, 5834, 5792, 93, 11064, 7565, -557, 6584, 142, -4210, -12133, +4369, -7215, -5590, 12623, 5506, -9804, 6897, 11927, -10897, 801, 4371, -1958, -9011, 702, 4900, 4727, +-806, -319, 3340, -2655, 9565, -9011, -427, 10196, 1467, -6212, 7966, 8933, 1008, 8315, -2211, 3548, +-13379, 6318, 1432, -15013, -7983, 11288, 6781, -10104, 18306, 5496, -3620, 692, 11105, -10948, -2886, 4160, +-12495, 5805, -7061, 10439, -824, 6468, 12275, -3027, -6151, 16800, -796, -25336, 12058, -1134, 1206, -6624, +6414, -386, -4027, 3951, 10439, -1544, -4658, 22460, -8868, 1945, 3504, 6730, -7425, -3179, -1438, -6226, +-2265, 6105, 4572, -5915, 14351, 1141, 10861, 6529, 8970, -2978, -4846, 3836, -11494, -11152, -6243, 4273, +-11306, 7833, 6752, 12180, 9639, 8059, 3876, -3391, 5003, -5915, -7667, -11993, -1354, -11071, 304, 4794, +5330, 6219, 8257, 10800, -2859, 10364, 1431, -2066, -9685, -1609, -3808, -4606, -2945, -4212, 4248, 708, +13013, 98, 1870, 10899, 3741, 888, 5894, 2163, -7655, -906, -9001, -4504, -6779, 4532, 1002, -4415, +8941, 11877, 9571, 4442, 11023, -7321, -3343, -6165, -7232, -15513, -7807, -1226, -10483, 6916, 7520, 12263, +6226, 13379, 2916, 1574, -3153, 702, -9182, -16577, 2586, -8022, -459, 5218, 9599, -31, 13424, 11590, +3706, 2118, 1436, 4306, -10629, 1084, -6315, -5470, -7031, -254, -6963, -3396, 10104, 1484, -315, -1972, +8858, -4458, 4755, -769, -7681, -10298, -5183, -4403, -12500, -2998, 1320, 3358, -2486, 16437, 7782, 7529, +10800, 1129, -4881, -3429, -172, -11686, -8150, -7087, 2616, -2418, 8613, 11763, 3157, 9066, 8345, 1677, +-8227, -483, -9699, -13859, -10742, -4714, -5344, -2367, 5140, -4594, 5665, 6324, 8059, -2595, -493, 1431, +-5559, -4572, -639, -1955, -10282, 5914, -1938, 496, 3807, 9657, 4447, 2901, 10015, 6502, 5761, -677, +2637, -11374, -3522, -2057, -2810, -6530, -151, 3797, -1070, 11606, 6723, 6093, 576, 4384, -9698, -7820, +-7096, -9927, -11143, -14270, 3024, -1954, 6404, 7372, 5762, -265, 12237, 3047, -5710, -2119, -7140, -5183, +-9831, 2688, -1459, 1656, 4417, 10117, 1837, 8587, 14161, -86, -67, -630, 3723, -6390, 2804, -1646, +-8998, -3962, 3242, 1323, -3290, 4310, 121, 2916, -1076, 5318, -2193, -2825, 748, -11814, -11675, -4618, +-3452, -13347, -1667, -584, 5768, 5782, 9343, 6649, -2405, 6831, -610, -5166, -7960, -2013, -8203, -5451, +1982, 5907, 6895, 9780, 13275, -1424, 9524, 6013, -159, -7761, -5894, -7326, -6675, -2012, -2739, -1367, +-7956, 10887, -1791, -205, 3965, -708, -5791, -1886, -1803, -7763, -353, -6925, -3999, -14057, 1431, 2650, +-2247, 371, 4710, 5543, 4065, 13279, 2108, 1878, -3452, 2275, -7865, -4289, -1994, -43, -647, -2100, +13327, 8629, 11356, 8069, 2650, -3773, 6594, -10780, -8185, -6786, -11275, -5301, -7086, 3415, -134, 2370, +2585, 6389, -1941, 1261, -4211, -8947, -5648, -11207, -1641, -3087, 2344, -4000, 1742, 4720, 10016, 4556, +3848, 5741, -5137, 9823, 171, 1137, 476, 1071, 313, -3637, -1499, 5079, 4171, -3153, 9312, -1598, +6689, 8684, -1071, -5361, -5399, -3008, -11217, -8154, -7417, -4905, -7182, 3576, 4863, 1660, 8410, 5610, +2654, -8439, 2264, -6932, -10042, -6003, -5675, -6259, 2756, 9987, 1851, 10757, 6421, 14420, 1367, 3720, +1524, -8704, -5282, 666, -4480, -10921, 8239, -1465, 4908, 1408, 11268, 282, 2563, 3336, -817, -397, +-3826, 6102, -11125, -1105, -5604, -2020, -10395, -16, 3510, -801, 11358, 3416, 2525, -1674, 9592, -878, +1615, -9649, -4468, -11143, -3357, 5833, -2300, 9593, 8083, 4828, 268, 17628, 3630, 3932, 1650, -1436, +-7037, -16911, -1234, -3053, 6327, 6636, 10893, -7905, 3576, 11411, 6351, -702, -1170, -4126, -22515, 1491, +-6724, -9784, -83, 3655, 840, -178, 3220, 7602, 4290, 5446, 480, -5334, 5440, -8131, -101, -6264, +-4186, 2367, -9496, 14115, 3586, 3015, 12852, 4613, 5067, 4255, 2117, 4717, -11708, -6266, 20679, -23103, +7499, -7172, -2141, 11032, -11759, 7280, -883, 691, 2603, -6133, -8124, 17773, -18335, -9806, -5724, -14284, +5103, -5364, -487, 3874, -5127, 12706, 17913, -9533, 15782, -5536, -7885, 7742, -19163, 2797, -395, 404, +13221, 1646, 4656, 29395, -4436, 6529, 7966, -16223, 11378, -13958, -6345, -8779, -14472, 12930, 1170, -12621, +16240, 145, 4422, 11329, -13587, 5259, -9421, 6117, 3580, -10796, 1296, 3467, -13299, 4843, -1955, -3343, +18101, -7147, 5137, 5767, 3927, 25468, -5501, -2842, 3965, -9794, 2013, -793, -17908, 4492, -1965, 4949, +9288, -3302, 31521, -834, -132, 4169, -9173, -8524, 2754, -15519, -6472, -11184, 567, 19663, -17670, 20081, +5635, -5260, 8891, -7902, -11554, 2047, -12221, -1742, -9284, -15605, 23539, -10681, 3717, 11398, -3825, 10999, +5410, -7302, 3532, 414, -439, 9849, -19943, 13977, -5900, -2472, 10648, -12852, 6638, 8718, 3579, 1981, +3224, 3126, 16899, -17377, 8010, -10163, -17831, 10233, -14836, -12722, -2459, -899, 9096, 6566, -4471, 28756, +-13202, 964, 4819, -23997, 4026, -4649, -10745, -5758, -6462, 12242, 14805, -4132, 17639, 5680, 405, 18854, +-14311, -752, -890, -7922, 6754, -9069, 3323, 11169, -6479, 9695, 954, -13184, 23379, -11828, -5878, -1004, +-8239, 9131, -9209, -9190, 1402, -10732, -3449, 11498, -27646, 7017, 5147, -1377, 10774, -7444, 13084, -1349, +-6891, 2176, -10018, -11500, 14767, -12955, -3498, 4723, 4300, 25260, -5192, 13498, 7145, -4423, 8991, -4630, +-24133, 5129, -11216, -6397, 6385, -16196, 24460, -5248, 3399, 7831, -8331, 4804, 8652, -25551, -3913, -3285, +-10984, 10862, -17107, 8080, -2869, 1364, 12911, -5634, -6291, 17483, -6297, -366, 4690, -5785, 14501, -14864, +5117, -1667, -14389, 19412, -1325, -10916, 8994, 4222, 7595, 12873, -9414, 12263, -7367, -7956, 7707, -28422, +1974, 3063, -11935, 3733, 2896, 2705, 19428, -5143, 4737, -790, -9905, 14825, -23880, -8359, 1063, -7759, +4276, 4968, -257, 14325, 1356, 9427, 6509, -15587, 18820, -7915, -8769, 796, -2648, 2052, -8557, -1172, +-4195, -9456, 8417, 3173, -18858, 3191, -1759, 15, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -1198, -1176, -1057, -796, -1075, -1344, -2014, +-1893, -740, -202, -146, -768, -2049, -1879, -1578, -614, -64, -733, -1529, -1219, -822, 781, 1349, +-844, -2121, -5126, -2853, 856, 2023, 2193, -1077, -3498, -2902, -2162, 957, 944, -307, -1935, -1621, +-42, 2712, 2734, -655, -3930, -7904, -2863, 2614, 4971, 4034, -2202, -4977, -4230, -2242, 2902, 1744, +78, -2596, -2218, 1838, 4141, 4048, -1104, -6987, -9484, -2327, 5504, 8355, 4446, -3663, -6503, -5672, +-563, 4224, 3026, -257, -3513, -2153, 3502, 4607, 5122, -2144, -8709, -9926, -1612, 7846, 10285, 4534, +-4714, -7390, -6517, 194, 4742, 3119, -131, -3571, -1407, 3724, 2941, 5122, -3855, -8306, -8392, -1044, +9756, 8811, 3448, -5226, -8035, -5846, 1081, 4815, 3260, -757, -3924, -83, 1728, 3294, 3923, -4380, +-6572, -7904, 1117, 9330, 7380, 2453, -5708, -6803, -4622, 2401, 4245, 2362, -1133, -3298, 1184, 395, +3401, 1941, -4043, -5406, -6352, 3038, 8282, 6242, 1254, -6290, -5931, -3907, 3626, 3775, 2482, -2057, +-2618, -27, -1235, 4075, 406, -1762, -5056, -5199, 3765, 6528, 5213, 241, -6254, -4446, -2901, 4019, +2896, 2110, -2458, -1555, -1893, -1087, 3335, 181, -262, -4903, -3244, 3515, 5170, 4332, -1052, -4874, +-3496, -827, 3343, 3200, 989, -2160, -1775, -3774, -485, 2503, 1860, 1467, -4121, -2512, 2136, 3207, +3765, -1501, -2750, -2066, -618, 2575, 2992, 197, -1094, -3823, -4928, 84, 2044, 4458, 1563, -3350, +-2823, 532, 1697, 3025, -1559, -793, -597, -456, 2458, 1886, -772, -537, -6004, -3391, -656, 2635, +5657, 1761, -2466, -2705, -1506, 786, 1401, -97, 1651, 744, -414, 2043, -91, -151, -1947, -6462, +-2586, -1300, 4410, 6183, 2539, -1951, -3168, -3502, 134, -215, 2091, 3387, 1727, 93, 1116, -1078, +-481, -3973, -6273, -1610, -895, 6378, 6258, 2716, -1820, -4627, -4630, -942, -637, 4657, 4702, 2769, +291, -795, -2042, -888, -5450, -3763, -2810, 54, 6847, 6274, 3918, -2024, -6338, -5412, -3003, 905, +6499, 5825, 3778, -716, -2572, -2335, -2781, -5039, -3154, -3033, 2039, 6891, 7645, 3342, -2703, -8412, +-6264, -3874, 2911, 8150, 7286, 3963, -1717, -3487, -3133, -3478, -4874, -2459, -3153, 4065, 7667, 8411, +2829, -4884, -9739, -6700, -3734, 5552, 8892, 8011, 3878, -3534, -3949, -3988, -4599, -3466, -3885, -1671, +4926, 8777, 8631, 1417, -7215, -10613, -7215, -2243, 7244, 9870, 8190, 2679, -5183, -4302, -4879, -4190, +-2795, -4816, 514, 5315, 11065, 7893, -878, -9569, -11417, -5784, 151, 9434, 10084, 7235, 947, -5819, +-3172, -4982, -3595, -4056, -4933, 2275, 6984, 12469, 6552, -3246, -10962, -11465, -4354, 1571, 10584, 9373, +6915, -661, -5757, -3066, -5752, -3590, -5407, -4060, 3988, 9135, 13114, 4405, -6750, -12683, -11385, -2196, +4427, 11777, 8480, 4960, -3050, -5151, -2037, -5255, -3288, -7195, -3086, 5655, 11001, 14061, 1995, -9362, +-13211, -10675, 757, 6280, 11961, 7802, 3227, -3604, -3899, -2320, -4985, -4626, -7388, -789, 8179, 12647, +12681, -2222, -11676, -13110, -7879, 3778, 7831, 10822, 5749, 687, -4360, -2018, -2490, -3803, -6828, -7495, +600, 10394, 13856, 11276, -6720, -13176, -13556, -5541, 6682, 8428, 10222, 3593, -1741, -3904, -1510, -2081, +-3924, -8161, -6924, 3401, 11873, 14788, 7524, -10255, -13435, -12865, -1548, 8776, 8576, 9305, 391, -3050, +-3347, -619, -216, -5129, -8233, -6984, 5801, 13028, 14860, 4024, -12509, -13434, -11154, 1758, 10755, 7991, +7705, -3123, -3847, -2243, 704, 711, -5590, -8970, -5621, 8287, 13271, 14228, -1169, -13932, -12953, -8723, +6203, 10918, 7084, 4535, -6584, -3234, -881, 2357, 595, -7118, -9647, -3484, 10093, 14268, 11916, -5047, +-14874, -12090, -6009, 9134, 10340, 6217, 1506, -8510, -2116, -335, 3938, -39, -7967, -9385, -1041, 10856, +14730, 8375, -7734, -14785, -11229, -2228, 10692, 10243, 5035, -2028, -8949, -1791, 755, 5068, -1380, -7645, +-8733, 1753, 11194, 13946, 4470, -9493, -14575, -8728, 682, 11845, 9101, 3250, -4670, -8944, -931, 1544, +5359, -2577, -8312, -6813, 3594, 12216, 12575, 713, -11336, -14247, -6639, 4216, 12527, 7972, 992, -7923, +-7884, -1128, 3232, 5218, -3469, -8209, -4633, 4860, 12771, 9610, -1995, -12382, -13396, -3745, 6638, 12858, +6734, -1374, -9833, -6753, -956, 4807, 4880, -4728, -6772, -2892, 6651, 12291, 6532, -4375, -12665, -11518, +-267, 8544, 12527, 4783, -4235, -10783, -5839, 257, 6087, 4199, -5791, -5798, -1962, 8229, 11749, 4203, +-5466, -13919, -9884, 2211, 9988, 12888, 2737, -6554, -11218, -5368, 1269, 7031, 2698, -5970, -4763, -133, +9501, 10143, 2219, -7564, -13641, -7767, 4970, 11465, 11927, 166, -8847, -11291, -3692, 2788, 8105, 760, +-6139, -3993, 1407, 10720, 9140, 440, -9241, -14326, -5211, 7447, 13072, 11390, -2367, -10754, -11336, -2611, +4424, 8295, -888, -6312, -3381, 2974, 11736, 7819, -662, -11377, -14029, -3266, 9470, 14529, 9347, -4516, +-12436, -10375, -1098, 5927, 7216, -2466, -6986, -2228, 4117, 12708, 6790, -2305, -12965, -13706, -1116, 11661, +15444, 7657, -6716, -13933, -10057, 961, 6727, 7661, -4158, -6934, -1773, 5406, 13793, 5868, -2979, -15166, +-12916, 413, 13880, 16131, 5926, -7968, -15049, -8693, 1873, 7274, 6867, -5809, -6639, -839, 6937, 14738, +4276, -4734, -16609, -12218, 2953, 15164, 16133, 4001, -9464, -15059, -7666, 2790, 7041, 5910, -7492, -5504, +-989, 8983, 14502, 3290, -6079, -18328, -10970, 4720, 16790, 16212, 2529, -10605, -15898, -6930, 2727, 8000, +5069, -7598, -4446, -491, 10560, 13215, 2037, -7306, -18646, -9206, 6486, 17676, 15829, 747, -11951, -15101, +-5901, 3438, 7764, 3161, -8207, -3799, 1091, 12246, 12489, 132, -9000, -19701, -6972, 7953, 19274, 15126, +-381, -13493, -14856, -5907, 3846, 8447, 1797, -7795, -4079, 1944, 13462, 11343, -669, -10495, -20250, -4821, +8915, 20374, 14181, -2204, -13885, -14318, -5209, 4635, 7601, 383, -7897, -3443, 3828, 14433, 9983, -2090, +-12804, -19783, -2655, 10750, 22140, 13235, -3917, -15218, -14220, -4631, 5997, 7104, -870, -7960, -2513, 5594, +15039, 8271, -3692, -14520, -19164, -244, 11830, 23424, 11482, -5646, -15442, -14259, -2765, 6358, 5538, -2301, +-9125, -852, 7701, 15628, 7131, -6029, -16780, -18457, 1367, 14359, 24332, 10123, -7335, -16473, -13833, -1942, +7366, 4404, -3356, -9109, 168, 9667, 15693, 5587, -7602, -18818, -16838, 3089, 16329, 25184, 8362, -8146, +-17747, -13458, 70, 7388, 4051, -5374, -8791, 2032, 11561, 16163, 3689, -10270, -20110, -15314, 6000, 18917, +24528, 6392, -10603, -17657, -12019, 1814, 7003, 2068, -6977, -7753, 3962, 13371, 15120, 1527, -12610, -20759, +-13380, 7656, 20826, 23667, 5442, -12493, -17919, -10915, 2487, 6818, -54, -7941, -6206, 5689, 15605, 13735, +-1127, -15360, -21440, -10498, 10627, 22639, 22553, 3084, -14244, -17152, -9526, 4053, 5415, -2490, -8481, -3949, +8646, 17724, 11112, -4462, -18016, -21360, -6861, 13745, 23638, 21521, -49, -14877, -16526, -7690, 4356, 3532, +-4254, -8368, -1264, 11450, 18399, 8065, -8299, -20399, -19872, -2924, 16920, 23837, 19411, -3619, -15804, -15394, +-5382, 4659, 1533, -6628, -8000, 1515, 13963, 18695, 4038, -11521, -22432, -17487, 1093, 19194, 23933, 16503, +-6546, -15712, -14481, -2539, 4157, 248, -8370, -7230, 3585, 16223, 18248, 1041, -14205, -23605, -15171, 4901, +21629, 24307, 13709, -8902, -15955, -13444, -642, 3579, -760, -9324, -5781, 6273, 17888, 16929, -2640, -17407, +-23555, -12426, 9353, 22710, 23683, 10021, -10788, -15484, -11559, 391, 2466, -2785, -9846, -3429, 8563, 18892, +13906, -6377, -19112, -22418, -8451, 11893, 22655, 22024, 7107, -10856, -14839, -10016, 301, 990, -3811, -9261, +-963, 10119, 19110, 10537, -8735, -20656, -21010, -5464, 14351, 23620, 20306, 4921, -11571, -14352, -8199, -205, +144, -4984, -8515, 2145, 11872, 19120, 6847, -12257, -21295, -19110, -1165, 16703, 22735, 18134, 2310, -11553, +-13003, -7047, -669, -762, -5970, -6734, 4155, 13069, 17763, 3416, -14462, -21174, -16996, 1564, 17844, 22014, +17160, 926, -11516, -12548, -6945, -1486, -1018, -6227, -3888, 5522, 13594, 15305, 86, -15775, -19992, -14187, +4067, 18020, 20512, 15745, -91, -10647, -11684, -6819, -2508, -1170, -6579, -642, 6380, 14099, 12373, -2873, +-16273, -18422, -11466, 5999, 17572, 19296, 14856, -860, -9721, -11408, -6978, -2776, -1828, -5560, 1627, 6698, +14424, 9087, -4937, -16465, -17374, -8592, 7129, 16832, 19286, 12950, -747, -10217, -10831, -7749, -2848, -2022, +-3777, 3198, 7548, 13243, 6323, -6857, -16392, -15721, -5902, 7675, 16663, 17656, 12177, -1518, -9527, -10316, +-8762, -2112, -2422, -1379, 4500, 7682, 11951, 3195, -7661, -15862, -13338, -3813, 7349, 16560, 15849, 12095, +-1675, -8954, -10167, -9690, -2235, -2431, 1089, 5607, 8185, 9400, 842, -9596, -14539, -11393, -2158, 7744, +15097, 14800, 11350, -2480, -7347, -11287, -9740, -2679, -2199, 3478, 5867, 8145, 7061, -1244, -10385, -13886, +-9120, -966, 8533, 13961, 13825, 9947, -3338, -6862, -11955, -8316, -2533, -579, 4269, 6028, 7506, 5106, +-2561, -10934, -12922, -6855, 385, 9406, 12955, 12620, 8253, -4080, -6624, -11863, -6991, -1525, 733, 4524, +5828, 5859, 4130, -3944, -10503, -11600, -5713, 929, 9528, 12082, 12274, 6407, -4451, -6962, -12175, -5233, +-889, 2257, 3855, 4805, 3697, 3156, -4589, -9264, -10537, -4922, 893, 8767, 11457, 11854, 4969, -4573, +-8078, -11326, -4007, 565, 2998, 3057, 4051, 2219, 2882, -5121, -8592, -9401, -4268, 2175, 8528, 11021, +11156, 2828, -4797, -9061, -9579, -1814, 2774, 3336, 2034, 1918, 1039, 2383, -4570, -6942, -8348, -3561, +1572, 7962, 10650, 10514, 1974, -5549, -9759, -8345, -411, 4875, 3195, 1118, -383, -65, 1753, -3796, +-5583, -7201, -3012, 965, 7189, 10093, 9673, 680, -6564, -9939, -6799, 2017, 6593, 2146, 297, -3486, +-245, 987, -2141, -3712, -6389, -2498, -578, 6537, 9901, 9015, 687, -7439, -9605, -5092, 3552, 8231, +1150, -439, -5107, -944, 851, -1029, -2379, -4597, -2552, -585, 5144, 9638, 7696, 21, -7758, -8965, +-3180, 4933, 8517, 687, -2184, -6473, -1699, 609, 944, -1372, -2831, -3154, -1969, 4074, 8480, 6715, +65, -8190, -7171, -2347, 6512, 7782, -362, -3237, -7438, -2082, 1046, 1935, 144, -1806, -3754, -2721, +3203, 7643, 6181, -726, -7132, -6286, -628, 6953, 6871, -763, -4108, -7667, -2291, 1174, 3067, 1555, +-487, -4093, -3241, 1608, 6419, 5226, -335, -5616, -4485, 277, 6455, 5612, -1050, -3883, -7399, -2780, +980, 3198, 2891, 389, -3684, -4150, 280, 4553, 4470, 575, -3820, -2773, 57, 5500, 4161, -1292, +-3425, -7337, -3157, 629, 3573, 4773, 1186, -3246, -5053, -1297, 2624, 3807, 1084, -1207, -1212, 395, +4075, 2359, -931, -3250, -6658, -2911, 165, 4671, 5866, 1576, -2989, -6637, -2665, 1128, 4185, 3169, +1271, -779, -548, 1705, 2005, -68, -2357, -6227, -3658, -384, 5490, 7234, 2414, -3169, -8175, -4422, +-362, 5039, 5451, 3227, -710, -2311, -28, 1564, 839, -1661, -6235, -4340, -314, 6273, 8442, 2482, +-3849, -9983, -5965, -716, 6000, 7878, 4337, -1285, -4049, -2027, 1892, 1658, -572, -5877, -4773, -647, +6517, 8665, 2834, -4448, -10445, -7540, -519, 6818, 9664, 5392, -2388, -4814, -3459, 2144, 2568, -617, +-5581, -5190, 81, 7632, 8940, 2936, -5944, -11714, -8242, 31, 8596, 11915, 4830, -3209, -7026, -4026, +2951, 3003, 425, -6055, -4943, 519, 7963, 8984, 2184, -7235, -11883, -9226, 2039, 9576, 13037, 3712, +-4788, -7468, -4223, 4203, 3065, 30, -6056, -4739, 1823, 8249, 8699, 861, -8035, -12701, -8178, 3146, +11355, 13675, 2245, -6007, -8636, -3701, 4809, 3459, 37, -5835, -3968, 2912, 8549, 7940, -708, -9138, +-12848, -6654, 5301, 12271, 12989, 165, -6619, -8470, -2149, 4635, 2775, -868, -5634, -1975, 3941, 8499, +6343, -3212, -9339, -12524, -4336, 6862, 11971, 11970, -2102, -6526, -7943, -1374, 4322, 1777, -1942, -4296, +-670, 5803, 7580, 4518, -6063, -9682, -11834, -1295, 8581, 12211, 10040, -4639, -6697, -7292, -287, 4422, +458, -2039, -3678, 1292, 7019, 6560, 2580, -8384, -9556, -10602, 1733, 9630, 11447, 8191, -6433, -5646, +-6260, 241, 3392, -1403, -1816, -2121, 3549, 7294, 5339, -273, -9955, -9435, -8758, 4836, 9824, 10861, +5464, -7984, -4540, -5698, 1115, 2030, -2940, -1349, -912, 5711, 7124, 3702, -2795, -11155, -8824, -6324, +7228, 9959, 9600, 2892, -8553, -3968, -4501, 1385, 831, -3740, -760, 525, 7672, 6252, 2440, -5626, +-11424, -7758, -3434, 8966, 9703, 7535, 1230, -8813, -2379, -3269, 1005, -658, -4578, 0, 2421, 8826, +5725, 685, -7598, -11601, -6280, -851, 10157, 7917, 6014, -841, -7186, -1520, -2172, -336, -2694, -4489, +687, 4872, 9017, 4413, -1731, -9347, -10752, -4196, 1593, 10294, 6063, 4225, -1675, -5745, -182, -2659, +-1800, -4732, -3362, 2221, 7147, 8437, 2999, -4525, -10041, -9790, -1729, 3324, 9871, 4460, 3084, -2165, +-4050, 220, -2056, -3855, -5873, -2836, 3333, 9543, 7730, 1760, -6870, -10783, -8045, 365, 5132, 8801, +2591, 1555, -1868, -2469, 931, -2305, -5872, -6506, -2020, 4811, 11433, 6690, 398, -9613, -10810, -6604, +2885, 6071, 7832, 584, 706, -1307, -1175, 2228, -3626, -7506, -7327, -1477, 7235, 12327, 6191, -1481, +-12251, -10197, -5179, 5645, 7094, 6637, -955, -415, -971, 685, 2925, -3585, -9197, -7400, -1307, 9173, +12776, 5680, -2914, -13784, -9502, -3318, 7625, 7836, 4514, -1947, -1576, 755, 2010, 3164, -4271, -11132, +-7272, -929, 11048, 13158, 5024, -4859, -14849, -9034, -1574, 9183, 8551, 2955, -3061, -2834, 1729, 3130, +4214, -4974, -12629, -7616, -564, 13018, 13789, 4233, -7007, -16113, -8918, 1107, 10898, 9225, 1379, -4700, +-3323, 2865, 4418, 4938, -6096, -13987, -7414, 149, 14918, 13735, 3361, -8375, -17031, -8077, 2639, 12785, +9533, 76, -6241, -4196, 3930, 5620, 6405, -6727, -14637, -8242, 435, 15968, 13978, 3067, -9793, -17554, +-7800, 4204, 14113, 10017, -1210, -7665, -5066, 4870, 6794, 7380, -7763, -15193, -8920, 1079, 16499, 13856, +2633, -10608, -18122, -6876, 4941, 15820, 9717, -2337, -9019, -5541, 6071, 8678, 8251, -8818, -16516, -9925, +2189, 17669, 14775, 1926, -12198, -19076, -6709, 6954, 17310, 9936, -3285, -10978, -5119, 6843, 10469, 8641, +-9930, -16918, -10420, 2843, 18218, 14863, 1708, -13061, -19822, -5936, 7858, 18784, 9523, -4244, -11901, -5023, +7801, 11971, 8210, -10861, -17436, -11205, 4578, 18282, 15232, 1069, -14858, -20089, -5959, 9372, 20605, 9207, +-4606, -13966, -5291, 8360, 12838, 8699, -11583, -18111, -11379, 4607, 19060, 15218, 652, -16114, -20667, -5488, +11021, 21122, 9246, -6092, -14486, -5372, 9482, 14060, 7864, -11801, -18674, -11006, 5583, 18979, 15247, -558, +-17121, -20854, -4938, 13205, 21841, 8942, -7249, -15599, -4671, 10099, 14496, 6938, -12038, -18882, -10061, 5379, +18840, 14502, -1515, -18000, -20478, -4456, 14652, 21141, 8447, -8188, -15848, -3961, 11019, 14581, 6172, -12314, +-19420, -9732, 5396, 18980, 14787, -2330, -18648, -20760, -4121, 16338, 21249, 8287, -9235, -15799, -3381, 11702, +14771, 5301, -12421, -19289, -9077, 5888, 19188, 14006, -3599, -18985, -20434, -2596, 17288, 20498, 7628, -10105, +-15179, -2138, 11836, 14292, 4065, -12537, -18480, -8480, 6583, 18540, 13367, -5422, -19343, -20268, -802, 18496, +19842, 6715, -11631, -14496, -1448, 12277, 13953, 2720, -11996, -18209, -7637, 7034, 17729, 12039, -6919, -19469, +-18834, 832, 18688, 18326, 5164, -11878, -12839, 273, 12313, 12958, 1234, -11753, -17136, -6653, 7133, 16895, +10005, -7715, -19158, -16987, 3125, 18267, 16516, 3077, -12497, -10491, 1307, 12770, 11596, -474, -10947, -16566, +-5296, 7549, 15509, 7442, -8752, -19143, -13865, 4822, 18000, 14016, 834, -12248, -7642, 2480, 12804, 9065, +-1775, -10075, -14887, -3076, 7458, 13288, 4121, -9614, -17812, -9866, 6504, 17032, 10759, -1409, -11644, -4497, +3694, 13003, 6423, -2747, -9401, -13332, -949, 6787, 11598, 980, -10070, -16042, -6457, 8100, 15231, 7027, +-3123, -10278, -1321, 5242, 12668, 4211, -4080, -8582, -11476, 190, 6954, 8512, -800, -10463, -13649, -2969, +8472, 13132, 3702, -4516, -7893, 1524, 6692, 11244, 1477, -4736, -8191, -9013, 1227, 6930, 5116, -2997, +-10642, -10690, 430, 8954, 9894, -119, -6062, -5033, 4145, 8401, 10158, -784, -5808, -7400, -6726, 2820, +6129, 1346, -4593, -10434, -6661, 3507, 8674, 6751, -3481, -6600, -2105, 6847, 9794, 8412, -2744, -6586, +-6280, -4269, 3946, 5107, -1789, -6019, -9639, -3210, 5934, 8176, 3726, -6222, -6726, 564, 8506, 11087, +6603, -3530, -7850, -5484, -2852, 4489, 4507, -4252, -6759, -8603, -1180, 7747, 6358, 1044, -8593, -6322, +3279, 10332, 11733, 5367, -4985, -8745, -4190, -1940, 5258, 2609, -6157, -6288, -7094, 2251, 8156, 4187, +-1743, -10108, -4282, 5823, 12042, 11214, 3530, -6192, -8650, -2062, -370, 5901, 442, -8039, -6638, -5171, +5383, 8989, 2761, -4665, -11332, -2911, 7549, 13833, 10686, 2919, -6861, -8411, -968, -89, 5223, -1477, +-8893, -5731, -3108, 7555, 7894, 307, -7089, -11848, -388, 8901, 14287, 9299, 1089, -6687, -7718, 298, +-190, 3825, -3759, -9000, -4410, -429, 9041, 5999, -2233, -9392, -11219, 2158, 9983, 14787, 7308, 941, +-7073, -6046, 997, -258, 2288, -5382, -8573, -2633, 1799, 10170, 3484, -4170, -11398, -9373, 4540, 11050, +14669, 5372, 428, -6862, -4097, 1535, -408, -251, -6525, -7667, -119, 4586, 9581, 661, -6735, -12250, +-6314, 6343, 12523, 12746, 3777, -176, -6607, -2247, 1811, -1223, -1961, -7691, -6722, 2141, 6426, 8974, +-1998, -8658, -13032, -3768, 7611, 13047, 11666, 2613, -583, -5640, -1287, 2335, -2538, -4116, -7783, -5275, +5534, 8227, 6850, -5000, -11635, -11491, -825, 9338, 13709, 8772, 1663, -1018, -3944, 467, 2012, -4375, +-5873, -8280, -2907, 8048, 9150, 4724, -7814, -13285, -10434, 1729, 10694, 13463, 6654, 304, -1263, -2980, +1703, 1937, -6074, -7259, -8535, -636, 10594, 9193, 1723, -11180, -14413, -7991, 4768, 12815, 12019, 4652, +-2063, -858, -1533, 2837, 1695, -8514, -7991, -7877, 2393, 13324, 7603, -728, -14622, -14247, -4926, 7172, +13938, 9683, 2621, -3062, 306, 333, 3939, 258, -10187, -8960, -6741, 5712, 14645, 6430, -3884, -17146, +-13207, -2364, 9882, 14385, 7808, 587, -4073, 1451, 1219, 4592, -1976, -11525, -8561, -5124, 9393, 14632, +4036, -7447, -19506, -11230, 396, 12260, 14166, 5475, -1125, -4884, 2713, 2109, 4710, -4072, -12722, -8089, +-2706, 12665, 13565, 1558, -11490, -19923, -9262, 3646, 13836, 13288, 3114, -2732, -4736, 4046, 3469, 4151, +-6353, -13345, -7747, 749, 14797, 12682, -1692, -15135, -19800, -6421, 7016, 15297, 11205, 811, -4418, -3419, +5924, 3957, 2342, -8902, -13497, -5337, 4373, 16058, 10284, -5246, -17748, -18490, -3856, 9775, 15683, 9524, +-949, -5345, -2168, 6605, 3502, 440, -10456, -12580, -2504, 7419, 16448, 7570, -9072, -19456, -17195, -312, +12489, 15989, 7032, -2862, -6207, -597, 7749, 3108, -849, -12058, -10968, 3, 10391, 16066, 4384, -12954, +-20511, -15102, 3900, 15207, 15621, 4170, -5092, -6634, 1368, 8737, 2177, -2597, -13300, -8688, 3164, 13119, +14927, 17, -16309, -21518, -12077, 8156, 17139, 15101, 962, -7277, -6938, 2643, 9483, 1516, -3071, -13741, +-6649, 5222, 13838, 13607, -3590, -18614, -21217, -9202, 12167, 18708, 13780, -2134, -9062, -6750, 4782, 9649, +1417, -4773, -13777, -4820, 7308, 15465, 12313, -7404, -20432, -22034, -5064, 15333, 20778, 11980, -5502, -10485, +-6515, 6469, 9654, 1451, -5912, -13271, -3631, 9152, 16072, 10444, -10234, -22435, -21600, -1431, 18446, 22235, +9203, -7515, -12536, -6019, 7776, 9013, 2252, -6693, -12858, -1685, 9693, 17428, 7594, -13575, -24001, -20763, +3525, 21960, 22453, 6581, -11364, -14150, -4989, 9702, 10424, 2648, -8079, -13651, -845, 11442, 18590, 5665, +-16352, -25610, -19551, 8168, 24849, 22871, 3293, -14549, -15588, -3355, 11458, 11637, 2955, -9647, -13767, -364, +12751, 19590, 2805, -17994, -27491, -16666, 12066, 27234, 21810, 171, -17265, -16040, -1858, 13149, 12286, 2577, +-10995, -14405, 643, 14506, 19570, 463, -20224, -28883, -13856, 15431, 28902, 20739, -2769, -19503, -16187, -444, +14369, 13220, 1467, -12116, -14659, 2348, 16193, 18824, -2372, -22483, -28562, -10094, 18907, 29759, 18355, -5878, +-21273, -14738, 1365, 15611, 12943, -461, -12439, -14079, 4831, 17390, 16911, -5231, -24428, -27146, -5885, 21855, +29958, 15139, -8552, -22305, -13085, 3540, 16208, 12381, -2366, -13201, -12629, 6678, 18615, 13943, -7662, -26297, +-24632, -1810, 24117, 28761, 11607, -11077, -22374, -10485, 4870, 16343, 10609, -4243, -12639, -10689, 9070, 17966, +10350, -10031, -26705, -20580, 1564, 25132, 26192, 8406, -12493, -21065, -7763, 5878, 15505, 8290, -6067, -11476, +-8500, 11644, 16937, 7179, -12441, -26928, -16764, 4717, 26217, 23392, 5321, -14266, -19446, -4913, 7138, 14824, +5280, -7546, -10642, -5233, 13691, 14927, 3542, -15281, -25465, -12780, 8100, 25963, 20361, 2225, -15176, -17245, +-2829, 7483, 12897, 2521, -8326, -8059, -2366, 14742, 11384, -68, -17123, -22837, -8884, 10701, 24481, 17192, +-154, -14880, -14292, -1248, 7584, 9931, -31, -8161, -5247, 1183, 14797, 7506, -3239, -18567, -19057, -5112, +13148, 22266, 13489, -2732, -13638, -10946, 1217, 6309, 6469, -2994, -7395, -1605, 4761, 14234, 3382, -7051, +-19202, -15342, -1259, 14728, 19566, 10220, -4379, -12314, -8163, 2354, 4785, 3217, -5423, -5352, 1807, 8037, +11892, -422, -10487, -18428, -11770, 2369, 15141, 16824, 6889, -5274, -10573, -5170, 2960, 3046, -340, -7007, +-3178, 5324, 10495, 9604, -4345, -13413, -17331, -8449, 5893, 15146, 14358, 4143, -5871, -8246, -2883, 3040, +554, -4077, -6982, 84, 9341, 11951, 5425, -7894, -15786, -14927, -4176, 8432, 14560, 11394, 1320, -4752, +-6619, 144, 2420, -2524, -6581, -7293, 3801, 12682, 12347, 2216, -12078, -16624, -12610, -689, 10501, 13152, +8567, -474, -4390, -4055, 1775, 1802, -5347, -9174, -6128, 6501, 15611, 11792, -1039, -15044, -17612, -10628, +3180, 11937, 12863, 5121, -2291, -3789, -1845, 3961, 401, -8018, -10868, -5047, 10422, 17210, 10900, -4276, +-18019, -16821, -8136, 6033, 12974, 11339, 3033, -2735, -3028, 813, 4720, -1331, -10574, -12280, -2883, 13396, +18669, 9731, -7296, -20486, -15838, -6222, 9116, 13156, 9857, 427, -2901, -2075, 3185, 4576, -3464, -12591, +-12570, -277, 15997, 19009, 7516, -10744, -21795, -14413, -3440, 11030, 13008, 7671, -537, -2972, -423, 4928, +3397, -5616, -14272, -11616, 3106, 17745, 18597, 5112, -13298, -21456, -13022, -784, 12019, 13157, 5897, -1104, +-3047, 939, 6608, 1993, -6939, -15164, -10382, 6252, 18282, 18199, 2354, -15849, -21118, -11447, 1577, 13443, +12192, 4470, -2310, -2568, 2542, 7522, 109, -8277, -16137, -8697, 8743, 17980, 17679, -536, -16376, -20288, +-10183, 3226, 13405, 11535, 3884, -2160, -1815, 3513, 6507, -2382, -9227, -14941, -5886, 11116, 16984, 15961, +-3498, -16632, -18840, -8335, 4448, 13259, 10236, 3787, -2148, -820, 4518, 5005, -4097, -9673, -13894, -2571, +11540, 16255, 13230, -5430, -15943, -17826, -6594, 4766, 12654, 9855, 3319, -1981, 69, 4026, 3493, -6140, +-8995, -11849, -245, 11956, 13593, 10750, -7068, -14917, -15713, -5547, 5410, 11603, 9096, 2907, -1285, 892, +3956, 973, -7253, -8848, -9605, 1954, 11447, 12203, 7865, -7087, -14157, -14072, -4956, 5246, 10731, 9771, +2755, 244, 217, 2863, -944, -7943, -6837, -7107, 3216, 10885, 9330, 6033, -6760, -13153, -12363, -4937, +5014, 10560, 10142, 3595, 776, -667, 962, -3083, -7218, -4853, -4244, 3308, 9754, 6174, 5271, -6589, +-11770, -11586, -4313, 4256, 10902, 9716, 3709, 1372, -2092, 100, -4996, -5906, -2637, -2421, 3292, 7482, +3227, 4851, -5893, -10013, -10390, -4414, 3934, 10579, 9678, 4849, 1527, -3187, -1344, -6377, -4521, -652, +-800, 3581, 5049, 1964, 4318, -5154, -8813, -10382, -4094, 3712, 11389, 10148, 5178, 863, -5396, -2513, +-6216, -2391, 1666, -1130, 2582, 2604, 1395, 5049, -4807, -8328, -10508, -4302, 4584, 11903, 10327, 5272, +-1167, -6697, -4002, -5727, -39, 2754, 100, 880, 692, 1174, 4257, -3363, -8854, -9691, -3944, 5571, +12808, 9977, 4569, -3392, -8510, -3188, -4351, 3230, 2989, -1432, -842, -947, 2508, 5237, -3866, -8809, +-10269, -2358, 7449, 12924, 9599, 2395, -5868, -8432, -2672, -1374, 4578, 2145, -2150, -3527, -30, 2815, +5268, -4220, -9547, -9496, -902, 8632, 13755, 8024, 439, -8791, -8443, -893, 1306, 5949, 404, -3987, +-4839, 1118, 4126, 5111, -5374, -10405, -8886, 1291, 10206, 13888, 5825, -2262, -10674, -7313, 1121, 3949, +5665, -1246, -6236, -4957, 2857, 5520, 4326, -6734, -11516, -7415, 3367, 12458, 13523, 3157, -4806, -12623, +-4651, 3149, 6173, 4598, -3331, -7060, -3932, 4213, 6017, 2038, -7521, -11452, -4699, 5934, 13906, 11501, +268, -8243, -12402, -2029, 5937, 7235, 2453, -5939, -7487, -2165, 5907, 5660, -759, -8751, -11189, -1445, +8204, 14753, 8795, -3430, -10932, -11326, 1262, 8854, 7355, 110, -8615, -7434, -493, 7441, 5205, -2488, +-9468, -9965, 871, 10327, 15009, 6310, -5965, -12867, -9463, 3963, 10638, 6938, -2185, -9973, -6018, 1248, +8689, 3547, -4475, -9871, -8054, 4147, 12649, 13876, 3109, -10027, -13665, -7034, 7690, 12005, 5513, -5049, +-11495, -4806, 3033, 8992, 1973, -6406, -9620, -6134, 6661, 13881, 11790, 452, -13376, -13245, -4744, 10085, +12422, 3531, -7035, -11161, -3263, 4873, 7352, 86, -7500, -8838, -3101, 8990, 14418, 10427, -3220, -15226, +-12711, -2572, 12872, 12097, 2334, -8438, -10986, -1336, 5221, 6469, -1106, -8071, -6236, -888, 11035, 13573, +7829, -6067, -16299, -10787, 105, 14325, 11147, 595, -8992, -9799, -80, 5243, 4413, -2102, -7956, -3924, +1795, 11933, 12117, 5199, -9271, -16241, -9891, 2737, 15267, 9848, -197, -9468, -8878, 708, 3041, 3205, +-3163, -5752, -884, 3661, 11840, 9590, 2522, -11505, -15391, -8195, 5277, 15058, 8791, -1491, -8986, -7822, +1123, 1831, 1731, -2984, -3884, 1422, 5423, 10997, 8019, -165, -12919, -14070, -6835, 7562, 14215, 8064, +-1746, -8437, -6767, 219, -139, 1116, -2596, -766, 3649, 6032, 9526, 5209, -2284, -13376, -12837, -5044, +8539, 13307, 7050, -1835, -7962, -6134, -1210, -1660, 477, -1169, 2110, 5372, 6486, 6935, 2926, -4472, +-13312, -10787, -4123, 9402, 12000, 6249, -922, -7632, -5262, -3421, -2730, 543, 726, 5297, 6226, 5931, +4856, 813, -5308, -12398, -9485, -2325, 8401, 11065, 5771, -301, -6050, -6532, -4438, -4084, 1288, 3772, +6726, 7430, 3982, 2565, -616, -6525, -11203, -8653, -2033, 8861, 9789, 6935, 1, -6381, -7462, -7628, +-4099, 2115, 6709, 9440, 6954, 2713, -548, -2483, -6436, -10141, -7351, -1785, 7642, 9681, 7385, 1120, +-6222, -9727, -9254, -4501, 4284, 9802, 10642, 6484, 482, -2536, -3498, -6357, -9440, -6326, -1708, 7696, +9431, 8126, 1482, -6962, -11108, -10496, -4258, 6828, 12056, 12228, 5396, -1207, -4581, -4279, -6202, -8391, +-5490, -1314, 7825, 9252, 9162, 816, -7611, -13089, -11564, -3021, 9381, 14709, 12896, 3738, -3505, -6251, +-4839, -5707, -7700, -5178, -1046, 7734, 9895, 9159, 228, -8992, -14822, -11477, -1414, 11830, 16658, 12436, +2692, -5475, -7975, -5122, -6239, -6239, -4199, 46, 8471, 9184, 9217, -1506, -9905, -15069, -11259, 1170, +13347, 18328, 11893, 1600, -7389, -8998, -6357, -5221, -5417, -2471, 1387, 7914, 9082, 7313, -2381, -10492, +-15087, -9254, 2776, 14777, 18506, 10185, 1099, -9063, -9005, -6964, -5796, -4628, -1986, 2841, 8285, 8518, +5956, -4205, -11041, -14787, -7889, 4359, 15727, 18654, 9911, -166, -10233, -10220, -7728, -5731, -3231, 223, +4230, 7981, 7147, 3604, -4908, -10904, -13706, -5775, 5650, 16076, 18422, 9468, -527, -10939, -11030, -9242, +-5353, -2305, 2442, 5636, 7744, 6095, 1266, -5765, -10860, -12769, -2988, 6067, 17189, 17157, 9184, -1515, +-11675, -11956, -10260, -5417, -801, 4792, 6333, 7388, 3694, -747, -6415, -10739, -10684, -1437, 6448, 17768, +15426, 10337, -3549, -11678, -13857, -10951, -4720, 789, 7046, 6758, 6142, 1761, -3088, -5998, -10254, -8635, +182, 6276, 18515, 14451, 10657, -4211, -12653, -14854, -12135, -3809, 3074, 9095, 7700, 5003, -530, -4801, +-6012, -9349, -6462, 1414, 6790, 18461, 13525, 11132, -5484, -12934, -17024, -12465, -2950, 5901, 10890, 7609, +2794, -2844, -6080, -5160, -8164, -4214, 1378, 7286, 17680, 13728, 11001, -6544, -14205, -18712, -12450, -1317, +8440, 12092, 6773, 818, -5043, -6536, -4235, -7734, -2202, 978, 8197, 17361, 13837, 10721, -7570, -15678, +-19834, -12493, 1595, 10941, 12735, 5959, -2173, -6223, -6733, -3047, -6236, -836, 648, 8891, 16787, 14671, +10066, -8397, -17412, -20849, -11518, 4346, 12945, 12410, 3857, -4477, -6690, -5526, -1863, -5401, -1467, 585, +9226, 17816, 15721, 8804, -10666, -20524, -21295, -9038, 8309, 14638, 11012, 551, -6101, -7545, -3770, -1389, +-5038, -1209, 525, 10541, 18767, 15708, 7679, -14039, -22149, -20912, -5741, 12077, 14990, 9485, -2366, -7068, +-6813, -2119, -839, -5185, -1361, 1150, 11433, 20279, 15015, 5994, -17230, -23152, -19163, -1956, 15028, 13978, +7003, -5093, -7258, -5495, -209, -689, -5604, -1781, 1111, 12912, 21088, 15091, 4305, -20725, -24006, -17631, +2145, 17137, 13128, 4009, -7089, -7574, -3871, 1196, -1117, -5985, -2053, 1230, 15150, 21276, 15032, 1171, +-24097, -23236, -15178, 6753, 17856, 10757, 762, -7971, -7027, -883, 1432, -1457, -7069, -2150, 2110, 17281, +21009, 14903, -3437, -25185, -22817, -11642, 10577, 16823, 9027, -2499, -8423, -6125, 260, 2421, -2193, -7240, +-2172, 2204, 18290, 20526, 14011, -6777, -25677, -21993, -8544, 12446, 15483, 6982, -4529, -8094, -4952, 1205, +2054, -3511, -7384, -2272, 3469, 19177, 20227, 11936, -10352, -25937, -20458, -4647, 13843, 13973, 4539, -6080, +-7323, -3532, 1839, 2165, -5067, -6966, -2146, 4909, 20314, 19537, 9208, -12529, -25702, -17637, -1395, 13978, +12959, 1980, -6402, -6280, -2446, 2568, 1676, -6309, -5563, -2485, 7662, 20297, 18322, 6202, -14405, -24393, +-14141, 1162, 13619, 10159, -554, -6304, -4739, -836, 3399, -7, -7495, -5930, -1962, 9867, 20065, 16632, +2552, -15522, -22778, -10577, 2134, 12431, 7308, -2581, -4969, -3438, 71, 3288, -2281, -7327, -5822, -173, +10886, 19415, 14059, 323, -16260, -20210, -8141, 3691, 11321, 5114, -3536, -4438, -2141, 1269, 3789, -4307, +-7248, -6887, 2440, 12242, 19789, 11544, -2329, -17040, -17873, -5344, 5319, 9896, 2732, -4670, -3260, -1259, +2957, 2621, -5795, -7349, -6522, 5134, 12710, 18863, 7914, -4056, -17599, -14257, -3430, 6433, 7732, 371, +-5020, -2458, -28, 4501, 771, -6493, -8955, -5420, 6906, 13806, 18477, 4501, -6023, -17975, -11668, -1120, +7839, 5978, -1360, -6011, -1516, 1441, 6251, -937, -7060, -10376, -2793, 8495, 15457, 16116, 1089, -7710, +-17274, -7839, 1348, 8724, 3381, -2945, -6759, -243, 3140, 6901, -2702, -7642, -11039, -147, 9366, 16259, +12989, -1343, -8999, -15457, -5134, 3619, 8242, 1212, -4775, -7243, 1120, 5131, 6811, -3752, -9206, -10841, +1504, 10667, 17166, 9886, -3397, -11078, -13715, -2090, 5623, 7943, -1098, -7235, -6412, 2107, 8059, 5965, +-5001, -10575, -10027, 3586, 12829, 16454, 7176, -5789, -11655, -11369, 289, 7604, 6242, -2914, -8291, -5333, +4461, 9512, 4303, -6564, -12387, -8655, 5563, 14893, 15660, 4468, -8373, -12290, -9470, 2862, 8724, 5495, +-5190, -8975, -4928, 6399, 10102, 2954, -7681, -13222, -6682, 7395, 16159, 13409, 1277, -10328, -11901, -6508, +5563, 9215, 3964, -8064, -8824, -4384, 8946, 9892, 1470, -8707, -13522, -4504, 9600, 16275, 11636, -1756, +-11863, -11093, -4610, 7606, 9751, 2056, -8462, -9289, -3265, 10837, 8212, 1033, -10923, -12412, -2266, 11966, +16280, 8714, -5006, -12572, -10193, -1273, 9187, 9441, -592, -9909, -8927, -1282, 12372, 6998, -593, -12320, +-10982, 338, 14368, 14203, 5941, -8713, -11956, -8272, 1653, 10298, 8146, -3011, -9852, -8644, 958, 11776, +5510, -1615, -12762, -8355, 2822, 14977, 12061, 2442, -10640, -10657, -6542, 4421, 10338, 6447, -4628, -9710, +-7647, 3570, 10821, 4499, -3903, -12455, -5531, 5490, 15805, 8970, -791, -11661, -9794, -3337, 6092, 10195, +4215, -6268, -9241, -6196, 5808, 9732, 2886, -5793, -11659, -2684, 8197, 14767, 6091, -4239, -12121, -8228, +-994, 7568, 8985, 2236, -7356, -8766, -4218, 6793, 8648, 709, -7262, -9750, -194, 10359, 12765, 3111, +-6709, -11978, -6498, 1637, 8064, 8459, -372, -7797, -8020, -2366, 8360, 7017, -1115, -7598, -8089, 3367, +11592, 11210, 190, -8922, -11516, -4923, 3944, 8675, 7603, -2007, -8306, -7344, -393, 9026, 5628, -2842, +-8421, -6115, 5963, 12155, 9643, -2213, -10990, -10730, -3510, 6012, 9411, 6065, -3982, -9044, -7119, 2025, +9276, 4862, -3990, -8837, -4288, 7273, 12024, 7868, -4562, -10996, -10616, -1736, 6472, 9285, 5408, -5364, +-8673, -6564, 3930, 9048, 3672, -4967, -8386, -2059, 8704, 11690, 6370, -6179, -11413, -9998, -84, 7286, +10085, 4046, -6402, -9136, -5975, 5553, 8912, 3707, -5330, -8575, -760, 8689, 11171, 5629, -7376, -10797, +-10224, 686, 7734, 10332, 3002, -7478, -9546, -4843, 6521, 9014, 2771, -6189, -8418, 886, 8481, 11305, +3571, -7986, -10721, -10313, 1543, 7722, 10173, 2393, -8729, -9295, -4298, 7245, 9128, 2271, -6565, -8360, +1055, 8126, 11383, 3226, -7181, -11248, -10536, 1460, 7729, 10851, 1690, -8931, -9118, -3852, 8009, 8806, +2694, -7234, -7637, 994, 8578, 11463, 2907, -7152, -12358, -10395, 1246, 8866, 11152, 598, -9136, -9387, +-2557, 8675, 8539, 1988, -8568, -6738, 1140, 9276, 11365, 2580, -7380, -13585, -10645, 924, 9587, 11665, +-207, -8819, -9895, -1989, 8471, 8016, 2551, -9115, -5707, 293, 9409, 11059, 2969, -7254, -14476, -10582, +13, 10812, 11474, -600, -8164, -10602, -447, 7953, 8074, 1026, -9332, -4690, 976, 10211, 11070, 2359, +-8551, -15465, -10573, 884, 12415, 11290, -1152, -8877, -10721, 926, 7894, 8457, -238, -9784, -4301, 1537, +11407, 11480, 1700, -10153, -16454, -10075, 2106, 13705, 10008, -1525, -9569, -9514, 1946, 7143, 8117, -2601, +-8229, -3595, 2570, 12206, 10437, 1395, -11841, -16484, -9880, 3182, 15024, 9202, -1588, -10919, -8388, 2931, +7054, 8360, -4622, -7432, -3778, 3508, 13381, 10270, 1081, -13226, -16930, -9702, 4123, 15204, 8665, -1356, +-10841, -6321, 1995, 7192, 6605, -5727, -5994, -3828, 5749, 14022, 9790, 85, -15433, -16610, -9217, 5742, +15373, 7302, -2019, -10230, -4538, 2788, 6348, 4446, -7147, -5130, -2829, 8452, 14572, 8591, -1761, -17582, +-15989, -8132, 7853, 15116, 6474, -2281, -9787, -3008, 2305, 5776, 2563, -7366, -4506, -1622, 10321, 14641, +8097, -3288, -18704, -15678, -8086, 9443, 14708, 7076, -1969, -9169, -2720, 1186, 5057, 1242, -7369, -3900, +-531, 12814, 15232, 7725, -5805, -20639, -16213, -6613, 11588, 14283, 7539, -2561, -8098, -2134, 342, 4552, +-1394, -7177, -3220, 1538, 15764, 14729, 6376, -9368, -21899, -15664, -3992, 13001, 14230, 7327, -3471, -7434, +-2327, 102, 3685, -2861, -7914, -1864, 3203, 18897, 14359, 4550, -12384, -24032, -14059, -1928, 14690, 14417, +6812, -3983, -6889, -2698, 298, 3149, -5179, -7603, -1870, 6290, 21649, 14031, 2678, -16348, -25479, -12550, +309, 16469, 14806, 6183, -4703, -7385, -2958, 474, 2541, -6407, -7836, -1380, 8900, 23269, 13006, 778, +-19454, -25656, -10933, 1854, 17579, 14874, 5335, -4356, -7793, -2379, -239, 1162, -8072, -7179, -44, 12468, +23709, 11665, -2245, -22663, -24773, -9139, 4060, 18887, 14234, 4598, -5030, -8213, -1766, -201, -395, -9633, +-7317, 1733, 16436, 24389, 10231, -5348, -25493, -24073, -7729, 5694, 20471, 14239, 4384, -5027, -8859, -1354, +-1465, -2332, -9406, -6918, 5246, 18578, 23375, 7892, -8314, -27429, -21592, -7137, 8791, 20868, 13522, 3752, +-6861, -7986, -1579, -1877, -3598, -10713, -5500, 7562, 20440, 22480, 5083, -10990, -28737, -20007, -5931, 10943, +21799, 12442, 3542, -8100, -7472, -1678, -3711, -4599, -11385, -3081, 10875, 21151, 20942, 2054, -13392, -28738, +-18073, -4272, 13415, 21679, 11852, 2798, -8815, -6363, -2432, -4521, -5611, -11573, 166, 12904, 21747, 19041, +-1132, -14952, -28700, -15965, -2372, 14684, 21611, 10929, 2373, -8586, -6148, -3173, -6613, -6750, -10357, 3079, +15323, 21183, 15839, -3808, -17491, -27152, -13647, -153, 16405, 20094, 9736, 1485, -8394, -4592, -4524, -7608, +-8136, -9135, 6812, 16748, 21002, 12636, -5969, -19595, -25111, -11857, 2425, 17882, 18495, 9314, 128, -7514, +-3944, -6479, -8601, -8936, -6712, 10211, 17166, 19547, 9349, -8825, -20117, -23431, -9319, 4307, 18131, 16992, +8355, -129, -7254, -3773, -8743, -9749, -9314, -3660, 12841, 17807, 17299, 6013, -11789, -20260, -21092, -6812, +6362, 18156, 14936, 8576, -1195, -5376, -4853, -11282, -9610, -9202, 798, 15126, 16958, 15266, 1967, -13525, +-19096, -18915, -3817, 7514, 17361, 13865, 7858, -621, -4025, -6653, -13224, -9930, -8282, 6179, 15954, 16523, +12116, -2465, -14215, -18174, -15634, -729, 8149, 16455, 11848, 7306, -331, -3442, -8636, -14924, -9415, -6482, +10267, 15975, 15116, 8741, -6332, -14771, -16740, -12426, 1414, 8573, 14570, 10541, 6683, 990, -3391, -11404, +-16176, -9344, -2812, 14045, 15824, 13172, 3958, -9272, -14457, -15077, -8219, 2999, 8644, 12914, 8993, 7034, +1462, -4128, -13416, -16856, -7709, 575, 16400, 15546, 10658, -26, -11618, -13891, -12788, -4554, 3865, 8821, +10657, 8326, 7259, 2056, -4918, -15481, -16842, -5940, 4360, 18112, 14438, 7840, -4444, -12931, -13056, -10008, +-1234, 4679, 7801, 9153, 7325, 7685, 2112, -6474, -16774, -16416, -3959, 8057, 17942, 13643, 4204, -7657, +-13217, -12411, -6309, 600, 5389, 6489, 7255, 7834, 7734, 2242, -8141, -17607, -15372, -1160, 10897, 18370, +11947, 834, -10521, -13662, -10313, -3466, 3132, 5440, 4845, 7053, 7510, 8576, 892, -10047, -18147, -13962, +2424, 13701, 18567, 9863, -3636, -12915, -14408, -7117, -342, 5282, 4869, 2736, 6719, 6734, 9047, -670, +-11596, -17444, -12189, 5825, 14849, 17284, 7524, -7303, -13685, -14947, -3656, 1239, 7444, 3472, 1427, 6560, +6009, 9705, -2659, -12541, -16706, -10204, 9259, 16126, 15979, 4870, -10705, -15631, -14039, -483, 4476, 9159, +1884, 396, 5179, 6048, 9911, -4184, -12256, -16266, -7321, 11426, 17046, 15494, 1729, -13205, -17787, -12809, +2965, 6774, 10774, -86, -342, 3757, 5732, 9649, -5466, -11171, -15213, -5096, 12698, 17534, 13636, -443, +-16367, -18831, -11099, 5893, 9274, 11005, -1731, -773, 1767, 5833, 8086, -5378, -10395, -13739, -2933, 12842, +17860, 11907, -2037, -18113, -20139, -8930, 7375, 11572, 11636, -2949, -1117, -690, 6143, 6593, -4888, -9405, +-12337, -1171, 13008, 18077, 10069, -3687, -19978, -20428, -6949, 9318, 12776, 11637, -4132, -1713, -1915, 5580, +5853, -4702, -8204, -10382, -221, 13479, 17535, 7909, -5194, -21786, -19987, -4786, 10190, 14486, 10335, -3701, +-2582, -2812, 4380, 3935, -3738, -6790, -8287, 1002, 13293, 16842, 5708, -6578, -23154, -19062, -2558, 10560, +15951, 9354, -3754, -3206, -4307, 3808, 2791, -2750, -4952, -7097, 2112, 13085, 14918, 4554, -8499, -23201, +-17345, -1548, 11733, 15499, 8512, -3012, -4138, -4666, 2169, 1030, -1390, -3935, -4067, 3812, 12364, 13006, +1404, -10196, -22345, -15329, 447, 12027, 14733, 7924, -2868, -4700, -5305, -37, 509, -411, -1927, -1801, +4286, 11549, 10393, 81, -11159, -21261, -13168, 612, 11870, 14617, 7544, -1258, -6265, -6799, -1676, -658, +2435, -226, 837, 4981, 8770, 8549, -2605, -11399, -19146, -11762, 2660, 11213, 13569, 7424, -1639, -6187, +-7967, -3333, -623, 3550, 2054, 3246, 4930, 7192, 5270, -3826, -11704, -16507, -9692, 2532, 10866, 11936, +8028, -1292, -7060, -8755, -5481, -292, 4661, 3815, 6116, 4324, 5200, 2896, -5587, -10477, -14797, -7763, +2509, 9455, 11412, 8081, -796, -6914, -10680, -6731, -650, 6371, 7024, 7667, 4107, 2379, 951, -6057, +-9742, -11923, -7454, 2285, 8277, 11339, 9828, -701, -6997, -13071, -8417, -330, 8101, 10788, 9333, 3477, +-742, -1656, -6623, -8552, -8658, -6840, 2735, 6150, 11268, 9593, -452, -7158, -15132, -9276, -251, 10284, +13726, 10001, 2378, -3778, -3324, -6940, -7410, -5749, -6937, 2546, 4322, 11583, 9921, -34, -7996, -16900, +-10508, 388, 12301, 16493, 10690, 1247, -6474, -4898, -7536, -4953, -3774, -6179, 2814, 1622, 12892, 8891, +1217, -8443, -18926, -10362, 543, 14452, 19197, 10245, 855, -9101, -5902, -7045, -3400, -1995, -6236, 2679, +545, 13660, 8430, 1878, -9653, -20171, -10652, 1296, 16783, 20822, 10186, -422, -10939, -7167, -6947, -1864, +-1486, -4830, 1550, 440, 13775, 7209, 2970, -12251, -20793, -10622, 2107, 19810, 21659, 9790, -2139, -13468, +-7374, -6343, 309, -1097, -4205, -28, 978, 13224, 7289, 3221, -14530, -20765, -10667, 3079, 22265, 21010, +10096, -3779, -14224, -7504, -6026, 1695, -716, -3318, -944, 1407, 12542, 7047, 3109, -16231, -19885, -10532, +4293, 24037, 20083, 10212, -5077, -14838, -7042, -6286, 2408, -509, -2252, -1012, 1857, 11233, 6949, 1428, +-16992, -19023, -10045, 6082, 24056, 19790, 10085, -5461, -14428, -7957, -6155, 2052, 748, -1016, -1102, 2402, +9265, 6758, 729, -17231, -17438, -10777, 7553, 23637, 19911, 10726, -6671, -13734, -9330, -5847, 2410, 1908, +-267, -902, 1802, 8590, 6096, -229, -17012, -17040, -10110, 9075, 23036, 20297, 9479, -6494, -13303, -9745, +-4957, 1467, 3433, -175, -340, 2112, 7407, 5872, -1809, -16564, -16551, -9610, 10071, 21937, 20803, 9094, +-5610, -13535, -10846, -5565, 647, 5302, 241, 306, 1506, 6281, 5663, -3492, -16056, -16816, -8984, 11336, +21301, 21324, 8170, -5777, -14027, -11246, -5328, 1356, 6355, 442, 677, 569, 5641, 4909, -4594, -15232, +-16993, -7318, 12009, 20981, 21162, 7541, -5541, -14723, -11045, -6056, 3013, 6734, 1574, 663, -437, 5159, +3631, -5159, -14606, -16664, -5806, 11835, 20697, 20661, 7095, -5498, -15250, -11175, -6109, 3854, 6851, 2180, +-18, -810, 5434, 2620, -5634, -15145, -16803, -3886, 11815, 21534, 19977, 6395, -6644, -15495, -11326, -4523, +5481, 6620, 2086, -1869, -841, 6056, 1978, -5117, -15990, -16726, -2587, 12029, 22721, 19474, 4908, -7812, +-16095, -11072, -2150, 6483, 7128, 944, -3539, -486, 6148, 1980, -5286, -17304, -16061, -1661, 12485, 23746, +18145, 3832, -9228, -16852, -10423, 637, 6821, 7589, -1771, -4736, 462, 6683, 2284, -6513, -18988, -15222, +-942, 14680, 24361, 16996, 1200, -11457, -17108, -8767, 4186, 7732, 6959, -5122, -5696, 1098, 7733, 3460, +-7773, -19638, -15137, 79, 16727, 25237, 15755, -965, -13615, -17709, -5946, 7303, 9722, 5743, -8582, -6286, +686, 9502, 3397, -8449, -19823, -14608, 1521, 18252, 25088, 13672, -3651, -15257, -17556, -2373, 9850, 10643, +3531, -11857, -6658, 1387, 11142, 3804, -9712, -20123, -14676, 2548, 19949, 24922, 11955, -6251, -17108, -17221, +1460, 12106, 12054, 391, -14475, -7268, 1249, 13405, 3786, -9701, -19715, -14974, 3949, 20130, 24609, 10478, +-8026, -18076, -16583, 4615, 13919, 12789, -2608, -15693, -7573, 1779, 14492, 2989, -9624, -19463, -14003, 5665, +20842, 23253, 8283, -10141, -19155, -14038, 7570, 15721, 11961, -5717, -16284, -7985, 3035, 14860, 2451, -9327, +-18713, -12877, 6683, 20193, 21286, 6038, -11142, -18834, -10687, 9226, 16818, 9719, -8098, -16090, -7781, 4308, +13872, 1665, -8522, -17806, -10695, 7189, 19582, 18790, 4271, -11801, -18389, -6847, 10076, 17975, 6940, -9338, +-15655, -7938, 5842, 12609, 2178, -7975, -16029, -8941, 7437, 18311, 16244, 2900, -11773, -16807, -3323, 10274, +18545, 4014, -10222, -14947, -7598, 7058, 11079, 2315, -7294, -14505, -7725, 7633, 16714, 14117, 1535, -12255, +-14603, -782, 10757, 17637, 1162, -10196, -14195, -6983, 6935, 8680, 2713, -6183, -11950, -6123, 6678, 13900, +11215, 735, -11418, -11307, 978, 10874, 16034, -1746, -9453, -13957, -5160, 6460, 7623, 3309, -5522, -9678, +-5471, 6304, 11636, 9458, 600, -11062, -8033, 1974, 11591, 14040, -4259, -9052, -14347, -3336, 6494, 6893, +3691, -5301, -8936, -3779, 5160, 10478, 6843, -612, -10342, -5091, 3224, 12051, 11067, -5727, -9332, -12960, +-2674, 6410, 5786, 4109, -4564, -7538, -2824, 4104, 8767, 5657, -1456, -8675, -3154, 4039, 12319, 8728, +-6465, -9034, -12537, -1742, 5752, 5776, 4966, -4423, -5839, -2676, 3183, 7429, 4186, -1920, -6929, -1738, +5250, 11315, 6169, -6934, -9843, -10211, -2054, 6259, 4617, 5071, -4414, -4950, -2194, 2310, 6007, 3201, +-2442, -5067, -1172, 6013, 10308, 4509, -7104, -9667, -9130, -2112, 5897, 3978, 5837, -4593, -3256, -2456, +1215, 5226, 2379, -2465, -2851, -1278, 7449, 8409, 2682, -6522, -10156, -6813, -2325, 4943, 4141, 5258, +-3041, -1981, -2805, 459, 3077, 1674, -1800, -869, 62, 7258, 6327, 1184, -6283, -9183, -5306, -2577, +4036, 3992, 4680, -1666, -944, -3043, 54, 1423, 1180, -1256, 163, 861, 6995, 5019, 65, -5911, +-8029, -4395, -2453, 1949, 4140, 3264, 932, -359, -2915, -1248, -297, 1052, 91, 1438, 1422, 5151, +2807, -923, -4539, -5707, -3517, -3308, -847, 3428, 3043, 3924, 430, -2628, -3197, -2209, 602, 1181, +3144, 2519, 3646, 1414, -2459, -2652, -4223, -2923, -4142, -3687, 4218, 3146, 7545, 924, -3468, -5029, +-4191, 1646, 2951, 4887, 2920, 949, -23, -3119, -321, -2286, -2545, -5194, -5958, 3786, 3827, 9839, +1344, -4070, -6993, -4972, 1922, 4390, 6249, 2444, -962, -1975, -3206, 2513, -961, -1898, -7670, -8232, +3135, 5311, 12825, 2553, -4940, -9593, -6918, 2611, 6435, 8226, 2167, -3370, -3338, -3323, 5342, 879, +-2120, -9404, -10821, 2877, 7335, 14693, 3643, -6411, -11297, -7497, 3600, 8185, 9159, 619, -4927, -4448, +-1602, 7851, 1687, -3108, -12023, -12406, 2984, 10049, 16570, 4625, -8522, -13363, -8612, 4811, 10142, 10384, +-852, -6554, -5761, -471, 10238, 2059, -4130, -14432, -13899, 4247, 12301, 18268, 4193, -10587, -14872, -8989, +6637, 11225, 10473, -2713, -7291, -5866, 2058, 10971, 2182, -6576, -15883, -14326, 6322, 14268, 19100, 3042, +-12458, -16084, -8301, 8280, 12445, 10044, -4290, -8146, -4509, 3881, 11714, 1332, -9265, -16677, -14656, 8821, +16226, 19454, 2120, -14141, -16997, -7239, 8839, 13493, 8993, -4918, -8130, -4175, 5248, 11728, 520, -10451, +-17546, -14055, 10660, 16680, 19717, 813, -14889, -17056, -6452, 9332, 13632, 7759, -4814, -7885, -2281, 5742, +11156, -1067, -11932, -17681, -12686, 11969, 17511, 19375, -228, -15833, -17288, -6222, 9926, 13825, 7386, -3953, +-7714, -1254, 5242, 9717, -2024, -12613, -16181, -11295, 12474, 16750, 17699, -600, -15509, -15698, -5853, 9295, +12478, 6574, -2313, -5969, -223, 3816, 7541, -2310, -12320, -14743, -9837, 10987, 16430, 16498, 467, -14461, +-14817, -7162, 7623, 11176, 7860, 160, -3648, -653, 1592, 4700, -2608, -10628, -12528, -8388, 9038, 14719, +15615, 1021, -11844, -13769, -7860, 4996, 9497, 8809, 3445, -1354, -999, -1310, 2054, -2659, -8697, -10066, +-7337, 6697, 12721, 14787, 2827, -8924, -13591, -9419, 1598, 8282, 11033, 6938, 1627, -2521, -4029, -1450, +-1768, -6439, -7477, -6893, 3845, 11053, 14385, 4988, -6338, -13832, -11403, -1957, 8020, 13265, 10943, 3501, +-4412, -7245, -4419, -1345, -3743, -5643, -6154, 1374, 9300, 14439, 6343, -4607, -14384, -13483, -3767, 7970, +15901, 13733, 3881, -6149, -10172, -6045, 26, -851, -4136, -6332, -1159, 7868, 14943, 8519, -2770, -15275, +-15085, -5651, 8965, 18731, 16028, 4344, -8592, -12658, -6454, 1058, 2548, -4249, -6644, -3295, 6858, 16397, +9415, -2167, -16250, -17233, -5868, 9594, 21268, 17606, 3275, -10070, -15076, -6473, 2223, 4253, -4216, -7374, +-5286, 6768, 16982, 10549, -2262, -17321, -18248, -6106, 10714, 23065, 17912, 3013, -12088, -16071, -6600, 3084, +6472, -4365, -7277, -6843, 6278, 17346, 11079, -1893, -18183, -18597, -6474, 12063, 24463, 18087, 3133, -14347, +-16313, -6995, 4960, 7488, -4734, -8010, -8091, 6706, 18010, 10626, -2456, -19718, -18283, -5195, 13563, 25059, +16719, 1910, -16060, -15935, -6212, 6620, 7351, -5309, -9212, -8488, 7743, 17275, 10206, -3668, -20477, -16909, +-4559, 15359, 24133, 16104, 703, -16157, -15473, -5762, 6522, 6658, -5709, -8892, -7234, 8190, 16273, 8677, +-5108, -20501, -15246, -2940, 16349, 23055, 14923, -264, -15518, -14636, -4991, 5958, 5767, -5483, -8287, -5605, +8456, 14787, 6942, -6545, -19339, -13405, -1122, 16198, 21093, 13709, -718, -13894, -14336, -3280, 4346, 5164, +-6003, -7681, -3566, 7861, 13145, 5134, -7963, -17477, -11996, 958, 15587, 19768, 12053, -658, -12773, -13854, +-3124, 2267, 5204, -6106, -5989, -1641, 6614, 11559, 2151, -8879, -15509, -9782, 3563, 14311, 18340, 9906, +-524, -11343, -12363, -3362, 341, 4300, -4722, -3387, 309, 4594, 8437, -383, -8475, -12665, -7037, 4671, +12363, 16454, 8438, 944, -10277, -11248, -4584, -1266, 4094, -3282, -1237, 1564, 2354, 5785, -2691, -8534, +-10180, -4205, 5844, 11681, 14457, 6765, 1393, -10109, -9871, -5359, -1515, 3690, -1787, 196, 1894, 1004, +2970, -4514, -8280, -8068, -1348, 5982, 11057, 12032, 5958, 1543, -8942, -8428, -6075, -2024, 2558, -54, +1756, 2571, -183, -113, -5325, -7751, -5337, 1346, 5553, 10265, 8912, 6371, 1739, -6755, -8122, -6648, +-3813, 2269, 2529, 3282, 3406, -2829, -3013, -6373, -7029, -2116, 2819, 5560, 9024, 7230, 6769, 1578, +-5131, -8375, -7036, -4980, 3060, 3996, 4826, 3047, -4679, -4788, -7007, -6431, 437, 2679, 6251, 7480, +6449, 7056, 1519, -3872, -8859, -7607, -5360, 3401, 5779, 5460, 3081, -6564, -5994, -7761, -4893, 2072, +3071, 6856, 5629, 6580, 6252, 2136, -2906, -8942, -7928, -6237, 4581, 6886, 6172, 2378, -8010, -6915, +-7815, -3438, 3067, 3183, 6625, 4504, 6770, 6227, 2642, -2323, -9688, -8300, -6609, 5709, 7975, 6671, +1098, -9469, -7884, -7734, -1559, 3384, 3919, 5764, 3590, 6622, 5655, 3435, -2250, -9875, -8897, -6977, +6770, 8692, 7715, 214, -10171, -9472, -8224, -555, 3196, 5755, 4846, 3716, 5499, 5334, 4380, -1785, +-9836, -10272, -6623, 7284, 9915, 8475, -1000, -10226, -11555, -7235, -109, 3628, 7236, 3682, 4310, 4298, +5421, 5266, -2066, -9731, -11045, -6526, 8588, 10769, 8874, -1935, -11109, -12630, -6656, 146, 4763, 7870, +2752, 4007, 2771, 5785, 5485, -1661, -9842, -11311, -6289, 8659, 11438, 8510, -1762, -12061, -13390, -6547, +131, 6479, 7814, 3443, 2548, 1597, 5365, 5568, -535, -9664, -11266, -6394, 8355, 12963, 8115, -1083, +-13555, -14235, -6715, 10, 8254, 8292, 4024, 1603, 744, 4908, 6265, -971, -9353, -10599, -6385, 9599, +11945, 8459, -1547, -14389, -13978, -7458, 939, 9475, 8331, 5063, -548, 279, 3455, 6814, -708, -8067, +-9623, -6821, 9596, 10647, 8660, -1053, -14950, -13825, -9358, 1519, 10503, 9805, 5877, -2107, -1411, 1699, +6826, -566, -5224, -9511, -6164, 8602, 9115, 9589, -1898, -14468, -14271, -9923, 3356, 10810, 11344, 4586, +-3265, -3174, 1632, 7199, 360, -3099, -9866, -5407, 7006, 8316, 9950, -2572, -13415, -14480, -9545, 4616, +10318, 11922, 3191, -4070, -3629, 1452, 7482, 573, -1559, -9822, -4358, 5497, 7429, 9356, -3219, -12478, +-14628, -8683, 5669, 10095, 12403, 1923, -4820, -4824, 798, 7040, 2696, -418, -8896, -4461, 3628, 7054, +8534, -2926, -12139, -15016, -7356, 5465, 10817, 12402, 921, -5678, -5675, 568, 7335, 3893, 235, -8358, +-4843, 2427, 6988, 7681, -2390, -12044, -15234, -5873, 5188, 11891, 11446, -781, -6698, -6425, 1084, 8985, +5182, 595, -8471, -6515, 2093, 6203, 8185, -1738, -12677, -14148, -5769, 6048, 12547, 10192, -1028, -8927, +-5959, 955, 9792, 6959, -81, -7679, -7603, 2155, 6114, 7342, -1590, -13673, -12492, -4747, 7036, 12759, +8030, -2514, -9663, -5193, 2077, 11377, 6809, 97, -9255, -7994, 2458, 6037, 8489, -2950, -13707, -11508, +-4353, 9081, 11355, 7272, -4747, -10328, -4422, 3360, 13414, 6464, -764, -10272, -8115, 3525, 6211, 8399, +-4524, -13633, -10399, -2774, 10433, 10341, 5552, -7002, -9731, -3173, 5418, 14707, 5139, -2059, -11930, -7278, +5704, 7041, 8700, -7170, -13377, -9470, -317, 11761, 8978, 2962, -9633, -9037, -1162, 8392, 16298, 3585, +-4147, -13628, -6285, 7536, 7890, 7929, -9828, -13119, -8640, 3421, 12120, 7883, -1018, -12043, -7466, 677, +12570, 16399, 947, -7078, -16124, -3755, 10258, 9380, 7121, -12770, -13457, -7553, 6402, 12624, 6673, -4684, +-13471, -6733, 3799, 15722, 16150, -1678, -10852, -16648, -1273, 12972, 10551, 4510, -15068, -14025, -4838, 8844, +12405, 4075, -8688, -13185, -5242, 8210, 18141, 14502, -5737, -13987, -17069, 3295, 15097, 11937, 1375, -17189, +-13772, -1776, 10520, 12882, 81, -10827, -13425, -2687, 12247, 19727, 12362, -9240, -17122, -15176, 6923, 17099, +11835, -2109, -18307, -12856, 939, 11676, 11520, -3018, -12291, -12048, 905, 15777, 19813, 8639, -13744, -19211, +-12625, 10564, 19598, 10855, -5030, -19404, -11959, 3547, 11583, 10370, -6161, -12449, -10769, 4070, 18350, 18747, +4797, -17607, -19585, -9406, 14252, 20913, 8485, -7744, -20614, -10095, 5093, 12545, 8718, -8603, -12679, -9494, +8117, 19542, 17127, 821, -20719, -18684, -6251, 17628, 20806, 5735, -9669, -20568, -7396, 6106, 11349, 6363, +-10171, -11222, -6857, 11310, 19382, 14286, -3289, -22450, -16794, -2420, 19695, 20026, 3232, -11403, -20191, -5897, +6420, 10680, 4729, -10236, -9910, -4242, 12769, 18275, 11611, -7236, -22476, -15025, 759, 21720, 17977, 1946, +-13414, -19033, -4598, 5994, 10206, 2441, -9105, -8121, -999, 13803, 16143, 7986, -10703, -21432, -12373, 4763, +22410, 15219, 299, -15155, -16469, -3728, 6048, 9038, 250, -7934, -6303, 2498, 13929, 14259, 3749, -12770, +-19638, -9585, 8185, 20972, 13139, -1569, -15538, -14216, -3570, 6076, 7037, -511, -6572, -3546, 4960, 12943, +11034, -487, -13689, -16692, -6110, 10812, 18217, 11127, -4182, -14308, -12872, -3479, 5838, 4960, 434, -5035, +102, 5951, 10875, 7272, -3963, -12789, -13700, -2809, 12422, 15028, 10079, -6735, -12736, -11886, -3374, 5567, +3578, 1113, -2669, 2468, 6987, 8297, 3812, -6615, -11941, -10495, 606, 12875, 12688, 7987, -8164, -11329, +-11550, -2630, 4007, 3517, 2241, -102, 4733, 5859, 5607, 345, -7848, -9346, -7143, 3243, 11911, 10348, +5280, -8360, -11121, -10408, -2288, 3687, 4446, 2957, 2727, 4792, 4844, 2567, -2390, -6983, -7771, -3028, +3993, 10884, 8559, 3076, -8039, -11641, -9630, -2233, 3564, 5859, 4641, 4466, 4390, 2353, -749, -3735, +-6220, -4432, -69, 4821, 8844, 5747, 939, -8388, -10886, -8280, -2238, 3802, 6041, 5993, 5526, 4276, +8, -3125, -4521, -5131, -1413, 2065, 4981, 7362, 2348, 32, -9102, -9611, -7019, -2853, 4817, 6106, +7761, 6226, 3188, -2262, -5030, -4990, -2865, 1144, 3694, 4937, 4598, 369, -1029, -9438, -7413, -7385, +-1991, 4792, 6998, 9625, 6319, 2440, -4811, -6879, -4448, -1505, 4145, 5213, 5391, 2282, -2209, -2849, +-9440, -5686, -6341, -1364, 5092, 7069, 9916, 6133, 1596, -6402, -7543, -4591, 197, 6161, 6246, 5721, +-1472, -3784, -5213, -8257, -4007, -5450, -805, 4859, 6641, 10650, 5526, 1666, -8064, -7745, -4610, 1908, +8089, 7354, 5313, -5005, -4919, -7162, -6092, -2802, -4754, 298, 4271, 7100, 10483, 5092, 1613, -9275, +-7017, -4959, 3624, 9647, 8118, 4855, -7812, -6004, -8190, -4884, -1669, -3992, 1671, 3502, 7199, 9295, +4792, 1167, -9140, -6371, -4996, 4826, 9566, 9371, 3215, -9008, -7336, -9536, -4070, -1018, -1908, 3214, +2999, 6099, 7345, 4710, 1935, -7970, -5667, -5653, 5323, 9809, 10468, 2112, -9705, -8411, -10269, -3289, +-351, 273, 3953, 3149, 4654, 6542, 4841, 1994, -6527, -5863, -4814, 5714, 10042, 11302, 73, -8989, +-10338, -10797, -3190, 849, 2905, 4759, 2247, 3036, 5393, 5580, 2945, -5175, -6522, -4356, 4768, 11138, +11311, -555, -7990, -13225, -10209, -4068, 2965, 4531, 4667, 1656, 1406, 5368, 5864, 3440, -5054, -6973, +-3265, 4680, 12468, 9105, -645, -9125, -14050, -9944, -3622, 5377, 5170, 4632, 2, 320, 5507, 5767, +4923, -5048, -6265, -2853, 3622, 13248, 6858, 1569, -10166, -14296, -10854, -3093, 6758, 6322, 4705, -960, +-117, 5154, 6012, 5389, -4972, -5233, -3551, 3971, 12944, 6600, 2446, -11417, -15481, -11519, -1704, 8467, +6885, 3901, -2366, -37, 5112, 6867, 4953, -5088, -4734, -4418, 5386, 12735, 7065, 2101, -13482, -16813, +-10705, -1, 10802, 7080, 2674, -3043, -724, 5616, 7049, 4274, -4395, -4489, -2960, 6406, 12202, 6635, +587, -15187, -16988, -9425, 2253, 11979, 6763, 1278, -3081, -996, 5997, 6455, 3110, -3203, -4436, -2107, +7550, 10990, 6670, -1781, -16174, -16459, -7990, 4135, 12143, 5657, 167, -3603, -902, 6741, 5920, 2648, +-2417, -5124, -660, 7080, 10856, 6202, -4101, -16542, -16048, -6120, 5529, 11966, 4989, -509, -3840, -783, +6269, 5284, 2614, -1331, -5291, 634, 7050, 10456, 5892, -6610, -16037, -15679, -4200, 6600, 11566, 4021, +-874, -4235, -2, 6090, 4171, 3303, -1295, -4728, 2521, 5510, 11055, 2988, -7587, -15112, -14816, -1664, +6914, 11011, 3496, -1717, -3919, 89, 5450, 3694, 3466, -737, -3597, 3634, 4457, 10777, 197, -7579, +-15013, -13468, 132, 7487, 11165, 2831, -2553, -4771, -293, 4960, 3918, 4671, -884, -1679, 2795, 4472, +8874, -1462, -7109, -14282, -11485, 1485, 7630, 10112, 1986, -3217, -4266, 167, 4061, 4098, 4322, 396, +134, 2156, 4235, 5350, -1422, -7318, -12313, -9807, 2121, 7710, 9100, 1479, -3561, -4395, 374, 3033, +4673, 4451, 1816, 1898, 521, 3666, 1790, -995, -7026, -10289, -7835, 2514, 7356, 7790, 632, -3728, +-4390, 191, 2694, 4938, 4870, 3815, 1457, -95, 1128, 327, -262, -6612, -8321, -6550, 2769, 7452, +5846, 81, -3903, -4248, 1156, 1922, 5514, 4523, 5504, 1705, -246, -301, -1559, -391, -6445, -6086, +-3891, 3323, 7565, 3571, -926, -4312, -4101, 2225, 2085, 5633, 5107, 5887, 1617, -642, -2749, -2073, +-1331, -5489, -3091, -1850, 3886, 5761, 374, -1302, -4063, -2508, 2558, 1149, 5192, 5279, 7277, 1656, +-1331, -5968, -2973, -1881, -3541, 420, -70, 3779, 3658, -2570, -947, -4349, -822, 2529, 551, 5878, +5979, 8263, 1647, -3736, -7758, -3627, -1732, -646, 2860, 1102, 3306, 1115, -4116, -798, -4291, 190, +2204, 822, 6482, 6795, 8169, 1422, -6914, -9251, -4301, -1329, 3051, 4583, 2387, 1457, -2059, -4712, +-977, -3100, 868, 1150, 1189, 6574, 7990, 7943, 514, -9720, -9672, -4657, 125, 5880, 5863, 3038, +-270, -3617, -4770, -1146, -2626, 816, 859, 2828, 7732, 8806, 7171, -1852, -12334, -9261, -4489, 3169, +7885, 6765, 2791, -2361, -4676, -4927, -1685, -1852, 100, 2460, 3520, 9082, 8224, 6205, -4845, -13662, +-8887, -3613, 6174, 9202, 7307, 1466, -4067, -5805, -4407, -1537, -1399, -277, 2866, 5103, 10163, 8127, +4681, -8267, -14132, -8558, -1496, 8849, 9708, 7063, 163, -5279, -5522, -3888, -2116, -1530, -522, 4370, +7437, 10045, 7680, 1354, -10802, -13661, -7535, 1744, 10684, 9724, 6319, -1874, -6121, -5013, -3744, -1418, +-1882, -401, 6140, 7551, 10902, 6707, -1339, -12008, -14298, -5974, 4700, 11839, 10527, 4261, -3341, -7380, +-4552, -2920, -1023, -2154, -414, 7037, 8154, 11519, 5337, -4650, -13111, -14584, -3876, 8422, 12091, 11122, +1472, -5263, -6966, -4555, -1637, -1145, -3072, 1353, 7307, 8738, 11508, 2107, -5874, -13739, -14404, 333, +8863, 12781, 10432, -1743, -4783, -7934, -3313, -999, -1595, -2267, 2160, 7050, 9892, 10406, 151, -7179, +-14953, -12405, 3265, 10056, 13636, 8024, -3705, -5129, -7545, -2376, -496, -2228, -1591, 2809, 6983, 10917, +7932, -1452, -8127, -15906, -8548, 4912, 10740, 13871, 4578, -4221, -5833, -7534, -738, -1030, -1744, -634, +2352, 7575, 9877, 5789, -2058, -9886, -14883, -5916, 5762, 12119, 12614, 2049, -4913, -6758, -6673, 383, +-1146, -992, -359, 1850, 8798, 8047, 4935, -3370, -11476, -12521, -3856, 7864, 12718, 9828, 343, -5740, +-6700, -4456, 243, -354, -1190, -85, 2235, 8757, 5810, 4004, -4688, -10584, -10015, -2260, 8340, 11443, +7734, -362, -5616, -6327, -4043, -296, -359, -462, 554, 3018, 7262, 3060, 2994, -6023, -8580, -7937, +-1024, 9422, 9231, 6237, -1519, -6130, -5772, -3294, 230, 236, -354, 328, 3721, 4719, 2778, 1617, +-6026, -6530, -6971, 1336, 8687, 7458, 4605, -2382, -5019, -4799, -1852, -10, 8, -176, 743, 4441, +2513, 2453, -327, -5044, -4914, -4994, 3144, 7197, 5881, 2994, -3105, -3967, -4353, -314, -314, 728, +-763, 1138, 2948, 293, 2805, -1549, -2555, -4075, -3731, 3793, 5185, 4637, 1664, -3191, -2739, -3384, +342, -692, 796, -1039, 1789, 745, -157, 1996, -1414, -713, -3537, -1825, 3311, 3786, 3511, 309, +-2051, -1980, -1374, 49, -5, 97, -805, 1283, -1448, 21, 1370, 449, 1282, -2711, -1448, 1971, +1744, 3196, -223, -351, -922, -1293, -292, 467, -306, 221, -1314, -3113, 238, 1175, 3477, 1644, +-2048, -2004, 214, 376, 2567, -390, 1326, 223, -1179, 65, -225, -831, 480, -3909, -2146, -724, +2149, 5059, 2047, -1480, -2337, -1918, -225, 1230, 987, 3294, 1075, -1116, 56, -1561, 37, -1149, +-4821, -1896, -1394, 4167, 5940, 2909, -1229, -3153, -3909, -669, -139, 3188, 4589, 1797, -713, -440, +-2019, -79, -3381, -5067, -1378, -978, 6410, 6240, 3067, -1406, -4901, -4860, -1557, -249, 5539, 5417, +2611, -467, -1878, -2417, -579, -4981, -3090, -2902, 217, 6924, 6486, 4109, -1911, -6653, -5542, -3375, +1428, 7030, 6223, 3506, -1314, -3115, -2464, -2581, -4746, -2935, -3069, 2272, 7061, 7842, 3304, -2797, +-8672, -6245, -3959, 3426, 8355, 7432, 3619, -2027, -3694, -3105, -3457, -4722, -2475, -3057, 4300, 7812, +8420, 2631, -5120, -9784, -6620, -3566, 5880, 8878, 7977, 3648, -3408, -2151, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, -543, -187, +3243, 6741, 10623, 13648, 14898, 15049, 12733, 10389, 7257, 4029, 1777, -197, -1883, -3687, -6021, -8716, +-11394, -14124, -14811, -15265, -13712, -10471, -7505, -3623, -1358, 280, 330, -70, -269, 27, 640, 1775, +3143, 3033, 2516, 1582, 337, -350, 600, 3056, 6425, 9866, 13454, 15484, 14981, 14541, 11225, 7764, +4654, 973, -1055, -3738, -5384, -6798, -10065, -11825, -13754, -15839, -15169, -14635, -11002, -7967, -4171, 44, +1345, 2658, 2471, 1908, 1775, 1664, 2701, 3590, 3168, 3304, 2141, 570, 134, 442, 2527, 4642, +8168, 11116, 13093, 13632, 12955, 11101, 7631, 4720, 1268, -1966, -4660, -6758, -8375, -10201, -11721, -12169, +-13332, -13995, -12665, -11429, -8553, -5290, -1490, 1940, 3314, 4521, 4427, 3343, 2930, 2285, 2456, 2795, +2376, 2800, 2349, 1384, 1947, 2330, 3886, 6021, 8513, 10739, 11760, 11849, 10594, 8053, 4211, 1000, +-3016, -6130, -7730, -9562, -10081, -10694, -10810, -11097, -11504, -10920, -9843, -8127, -5018, -1421, 1765, 4106, +5651, 5300, 4511, 3157, 1794, 1641, 870, 1840, 2179, 1932, 2492, 2124, 2693, 3549, 5151, 7793, +9513, 11368, 12039, 10757, 8660, 5354, 1199, -2707, -6469, -8660, -10656, -11568, -11513, -11495, -11280, -10948, +-10393, -9329, -7819, -5223, -1661, 1392, 4306, 6440, 6950, 6547, 5173, 3668, 2180, 958, 742, 948, +986, 2091, 2282, 3265, 3904, 4639, 6469, 7143, 8970, 9199, 9208, 8139, 5605, 3004, -1705, -5204, +-8844, -12009, -12613, -13384, -11592, -10399, -9782, -7283, -8025, -5914, -4700, -2602, 1331, 3123, 7274, 7878, +8219, 7480, 4880, 2996, 719, -41, 153, 603, 1893, 2836, 3227, 3758, 3828, 4656, 5256, 6711, +7332, 7740, 7156, 5115, 2558, -1503, -5044, -8716, -11525, -12693, -13084, -11737, -10309, -8561, -6930, -5839, +-4560, -3289, -1583, 624, 3300, 5893, 7908, 8884, 8488, 6920, 4356, 1529, -385, -1404, -922, 246, +2271, 4036, 4962, 5829, 5208, 5374, 5330, 5325, 5776, 5636, 5054, 2766, -307, -4035, -7991, -11777, +-13794, -14300, -13413, -11481, -8384, -6382, -4320, -2963, -1993, -383, 438, 3493, 5388, 7986, 9831, 9642, +9043, 6285, 3043, 86, -1892, -2015, -730, 980, 3840, 5139, 5059, 5407, 3937, 3350, 2647, 3265, +3508, 3162, 2439, 86, -3178, -7719, -11006, -13948, -15314, -14268, -12381, -9015, -6126, -3816, -1325, -350, +526, 2592, 3733, 6300, 8307, 9821, 10879, 9319, 8010, 4704, 1228, -633, -1801, -1671, -287, 1273, +3167, 4051, 4196, 4247, 3153, 2218, 1613, 1165, 637, 355, -817, -2785, -5430, -8980, -11450, -13744, +-13765, -12219, -9800, -5718, -2712, 380, 2465, 3067, 4402, 4744, 6079, 7714, 9143, 10410, 10026, 8816, +5864, 2185, -800, -2892, -3006, -1854, 199, 2393, 3857, 3959, 3401, 2453, 663, 13, -830, -618, +-1120, -1773, -2999, -5595, -8065, -10900, -12319, -12871, -11941, -9463, -6188, -2911, 511, 3030, 4770, 5888, +6479, 7480, 7842, 9092, 9645, 10144, 9357, 6682, 4232, 472, -2291, -3159, -3481, -1627, 165, 1978, +3149, 2558, 1586, -384, -2449, -3013, -3540, -3195, -2951, -3459, -4555, -6861, -8645, -10633, -11080, -10653, +-8321, -4986, -1577, 2574, 4747, 7017, 8011, 8150, 8777, 8619, 9138, 9713, 9780, 8978, 7050, 3813, +575, -2322, -4904, -4570, -4201, -2325, -291, 764, 2148, -7, -1115, -2468, -4559, -4635, -4574, -4009, +-4085, -4379, -5236, -6537, -8180, -8431, -7940, -7121, -4074, -1331, 2149, 5405, 7462, 9603, 10127, 10154, +9894, 8956, 8359, 7695, 6707, 5272, 3259, 691, -1835, -3886, -5543, -5257, -4705, -2785, -793, 217, +1144, -425, -1363, -2968, -4930, -5000, -5659, -5284, -4719, -5182, -4652, -5766, -6333, -6268, -6389, -4326, +-2272, 1332, 4936, 7951, 10507, 11481, 11770, 10190, 9647, 8287, 7454, 7133, 5730, 4661, 1501, -919, +-3280, -6164, -6368, -6045, -4665, -2664, -1713, -653, -1848, -3263, -4656, -5733, -6329, -6249, -5435, -5209, +-4652, -4788, -4209, -4421, -4502, -2891, -2272, 100, 2315, 4931, 8115, 9643, 11761, 12557, 12179, 10841, +9537, 7482, 5586, 4056, 2601, 842, -1414, -3090, -4845, -6654, -6896, -6244, -5310, -3624, -2757, -2556, +-3497, -4744, -5994, -7191, -7399, -6782, -5852, -4863, -3700, -2848, -2710, -2306, -1603, -435, 1011, 3571, +6506, 9047, 11669, 13345, 13876, 13002, 11520, 9472, 7161, 5005, 3600, 2015, 151, -1532, -3760, -5629, +-7492, -8265, -7758, -6949, -5315, -4368, -4303, -4514, -6144, -6949, -7836, -7858, -7172, -6143, -4655, -3472, +-2087, -1384, -57, 866, 2260, 3830, 5398, 8069, 9795, 12309, 13940, 14554, 14210, 12606, 10550, 7522, +4642, 2083, 110, -2010, -3846, -5257, -7297, -8546, -9564, -9913, -8761, -8500, -6799, -6164, -5611, -5640, +-6188, -6080, -6663, -6115, -5151, -4350, -2460, -653, 1052, 2812, 4157, 5445, 5999, 6967, 8542, 9523, +11612, 13236, 14059, 14390, 12303, 10787, 7133, 3646, 856, -2162, -3828, -5411, -6406, -7409, -8567, -9167, +-9944, -9605, -9270, -8750, -7709, -7458, -6360, -6447, -6037, -5725, -5711, -4671, -3901, -2145, -239, 1237, +4113, 5470, 7368, 8498, 9009, 10143, 10447, 11620, 13158, 14022, 14316, 13365, 11240, 8234, 3590, 697, +-2783, -5180, -5988, -7375, -7510, -8965, -9658, -10429, -11322, -11074, -10752, -9696, -8732, -7733, -7065, -6618, +-6741, -6677, -5587, -4811, -2620, -182, 2329, 5268, 7078, 9375, 10129, 10735, 11753, 12214, 13565, 14324, +15636, 15102, 14410, 12098, 8505, 4909, -18, -2941, -6347, -7933, -9314, -10362, -10648, -11870, -12174, -12727, +-12985, -12586, -11985, -10890, -9179, -7927, -6331, -4946, -4594, -3221, -2517, -946, 1319, 3453, 6923, 9051, +11989, 13270, 14084, 14422, 13677, 14214, 13821, 14443, 14284, 13566, 12223, 8517, 4867, -244, -4627, -8249, +-10479, -11372, -12382, -12038, -12732, -13565, -13888, -14534, -14669, -13691, -11989, -9930, -7779, -5557, -4145, -3307, +-2295, -1063, 503, 2426, 5649, 8183, 10989, 13328, 14617, 15290, 14569, 14510, 13578, 13171, 13137, 12974, +12296, 10808, 7991, 3837, -432, -5430, -8728, -11219, -12134, -11859, -12032, -11505, -12286, -12999, -13774, -14589, +-13890, -12629, -10725, -8098, -6465, -4828, -4161, -3846, -2072, -1282, 1790, 4598, 7744, 11421, 13231, 15853, +16477, 16444, 16615, 15897, 16179, 15754, 15515, 14776, 12808, 9285, 5337, 734, -4797, -8440, -11965, -13623, +-14806, -15403, -14717, -16017, -15644, -16061, -16449, -15596, -14922, -12034, -10256, -7352, -4424, -3023, -1133, -35, +1794, 3569, 5261, 9300, 11586, 14641, 17176, 18121, 18969, 17283, 17045, 15567, 14298, 14142, 12613, 11927, +8955, 5707, 1356, -4196, -8597, -13187, -15520, -16567, -16720, -15693, -15261, -14919, -15651, -16085, -16488, -16055, +-14093, -11576, -7463, -4487, -1819, -142, 527, 1453, 2432, 4793, 8126, 11622, 15625, 18421, 20243, 20425, +19443, 18357, 16309, 15635, 14962, 14210, 13225, 10737, 7073, 1583, -3652, -9401, -14117, -16855, -18224, -18010, +-17892, -16913, -16861, -17296, -17813, -18128, -17066, -15426, -12390, -8050, -4773, -1631, 710, 1729, 2890, 3818, +6188, 9067, 12323, 16336, 19212, 20854, 21563, 20745, 18906, 17085, 15626, 14586, 13788, 12378, 10483, 6591, +1356, -3928, -9843, -14450, -17234, -18771, -18646, -18262, -17437, -17393, -18077, -18156, -18632, -17916, -15799, -12873, +-8673, -5045, -1883, 886, 1587, 3353, 4452, 6513, 9671, 12717, 16945, 19483, 21695, 22425, 21888, 20587, +18823, 17370, 15548, 14151, 12266, 9739, 6382, 1787, -2950, -8499, -13444, -17054, -19933, -20742, -20981, -20269, +-18901, -18417, -17945, -17903, -17592, -16691, -14608, -11277, -7238, -3338, 532, 3365, 4797, 6474, 7371, 9736, +11966, 15485, 19318, 21676, 24016, 23846, 22934, 20585, 18019, 16169, 13666, 12536, 10350, 7776, 3491, -1322, +-6872, -13134, -17423, -20995, -22358, -22445, -21492, -19924, -19710, -19091, -19449, -19438, -18866, -16575, -12705, -8679, +-3289, 490, 4194, 5956, 7207, 8849, 10222, 12629, 16266, 19323, 22702, 24778, 24781, 24562, 21655, 19254, +16693, 13631, 12300, 9368, 7239, 3615, -1398, -6386, -12193, -17206, -20991, -23236, -23583, -22862, -21519, -19875, +-18976, -18980, -19051, -18388, -17060, -13721, -9518, -4327, 488, 3991, 6783, 7594, 8659, 9817, 12076, 15147, +18649, 22450, 24602, 25557, 24536, 22892, 19679, 17039, 14816, 12384, 10802, 7963, 4765, 366, -5161, -10255, +-15968, -20050, -22899, -24197, -24021, -23171, -20938, -20477, -19473, -19697, -19451, -18030, -16531, -11715, -7150, -1850, +3429, 6423, 9038, 10057, 10850, 12741, 15039, 18509, 22551, 25857, 27544, 27800, 25861, 22813, 19299, 15379, +12227, 9654, 6852, 3608, -517, -5454, -11277, -16357, -21374, -24020, -25883, -25480, -24064, -22623, -20128, -19887, +-19241, -18542, -17580, -15290, -11746, -6646, -1828, 3046, 6818, 9341, 10633, 11427, 13294, 14855, 17787, 21645, +24438, 26707, 27323, 25965, 23522, 19857, 16331, 13143, 9909, 7699, 4443, 314, -3740, -9439, -14307, -18965, +-22965, -24652, -25719, -24906, -23724, -21723, -21084, -20157, -19729, -19209, -17306, -14986, -9929, -5090, 520, 5575, +8932, 11455, 12735, 13998, 16051, 18281, 21600, 25334, 27525, 29126, 28484, 26188, 22920, 18231, 14302, 10302, +6599, 3497, -502, -4918, -8952, -14279, -18713, -22417, -25203, -26571, -26814, -25010, -23643, -22046, -20593, -19293, +-18092, -16739, -13285, -10376, -5171, -143, 4482, 9451, 11602, 14480, 15680, 16918, 19136, 20559, 23981, 25961, +27733, 28464, 26513, 24161, 19255, 15039, 9618, 5403, 1898, -1896, -4729, -8675, -11787, -16895, -20555, -24030, +-26395, -26567, -26080, -23351, -21550, -20061, -18280, -18002, -16667, -15155, -12367, -7596, -3168, 2610, 7622, 11268, +14123, 15839, 17535, 18709, 20753, 23431, 25883, 28475, 29420, 29048, 26308, 22294, 17051, 11224, 6692, 1913, +-2197, -4771, -8735, -11829, -15779, -20017, -22934, -26966, -27151, -27531, -26289, -23454, -21974, -19324, -18614, -16763, +-15145, -13027, -8598, -4180, 1629, 6988, 11917, 15368, 17207, 19222, 20075, 21937, 23922, 26129, 28668, 28945, +28957, 26556, 22445, 17471, 12007, 6944, 1843, -2752, -5832, -9902, -13361, -16071, -19294, -22498, -24311, -25833, +-26643, -25858, -24791, -22391, -20923, -18367, -15966, -14625, -11456, -8515, -4804, 18, 4491, 9992, 13860, 17097, +19955, 21257, 22728, 24208, 25939, 27543, 28654, 28959, 27270, 24269, 19313, 14268, 8232, 2223, -2989, -7596, +-11452, -14846, -17359, -19661, -22015, -23935, -25127, -26443, -26381, -25489, -23898, -21646, -18620, -15588, -12735, -10153, +-7097, -4305, -580, 3547, 8477, 12740, 17085, 20632, 22470, 24229, 24788, 25600, 26264, 26715, 27709, 26349, +24649, 20891, 15485, 9506, 2354, -3638, -9163, -13003, -15698, -17336, -18876, -20359, -22281, -23917, -25621, -25659, +-25597, -23740, -21109, -18540, -14704, -12421, -9283, -7013, -4307, -719, 2483, 7463, 11676, 16116, 19577, 21957, +23653, 24456, 25183, 25615, 26213, 26202, 25941, 23544, 20812, 15906, 10500, 4179, -2260, -7776, -12731, -15692, +-18257, -18942, -19764, -20725, -21553, -22962, -23623, -24987, -23996, -22308, -20335, -16063, -13203, -9174, -7080, -4825, +-1581, -76, 4407, 8848, 13453, 18578, 21805, 25208, 25960, 26205, 26328, 26157, 25843, 25721, 25071, 22708, +19154, 13644, 7283, -771, -7927, -13769, -17966, -20461, -20730, -20981, -21143, -22392, -23644, -24719, -26449, -25183, +-22963, -19553, -15486, -11137, -7332, -5272, -3001, -793, 1650, 4986, 9785, 14457, 18510, 21959, 24237, 24946, +25164, 25321, 25343, 24987, 24734, 24041, 21057, 17727, 12911, 6792, -131, -7369, -12551, -17472, -20316, -20936, +-21291, -20884, -21560, -22144, -22324, -24323, -23613, -22019, -19734, -15966, -12170, -7824, -5369, -2963, -603, 1525, +3697, 7801, 11974, 16055, 19914, 22822, 24791, 25226, 25484, 25372, 24717, 23512, 22916, 20550, 17619, 13714, +8166, 2441, -5155, -10962, -16110, -20340, -21120, -21710, -20856, -20255, -20414, -20724, -21860, -22954, -22391, -20617, +-17565, -13142, -9032, -4858, -2676, -919, 1117, 2692, 5626, 10023, 14378, 19605, 22769, 25843, 26966, 26138, +25868, 24485, 23135, 22289, 20458, 18486, 14793, 9367, 3256, -4999, -11588, -17835, -21458, -23019, -22891, -21542, +-20486, -19915, -20262, -20847, -21259, -21311, -19634, -16521, -12887, -8416, -4702, -1751, 522, 1629, 3998, 5640, +9261, 13129, 16861, 21504, 23516, 25993, 25930, 25194, 24219, 21984, 20729, 18689, 16706, 13939, 9581, 4244, +-2517, -9770, -16317, -20734, -23150, -23501, -21417, -19997, -18242, -17967, -18543, -18714, -20132, -18574, -16676, -13346, +-8707, -4988, -1472, 815, 1802, 3459, 4641, 6789, 10554, 14485, 18960, 22343, 25145, 25641, 25236, 23550, +21852, 20176, 17972, 17040, 13920, 10429, 4976, -1423, -8396, -15348, -19827, -22992, -23239, -22641, -20084, -18408, +-17798, -17317, -17607, -17777, -17745, -15664, -12975, -9511, -5686, -2107, 1055, 2484, 3855, 5657, 6657, 9623, +12892, 17205, 20641, 24127, 26203, 26143, 25118, 23011, 20658, 17713, 15611, 12556, 9240, 4252, -1324, -7619, +-14665, -19692, -23377, -24420, -24085, -22177, -18986, -18349, -16289, -16100, -15921, -15368, -14753, -11311, -9289, -5202, +-1063, 1365, 3864, 4902, 6434, 7370, 8820, 12306, 15058, 18776, 22207, 24146, 24938, 23511, 21878, 19427, +16298, 14482, 11258, 8344, 4167, -1065, -6556, -13031, -18034, -21475, -23653, -23205, -21519, -19139, -16914, -15383, +-14224, -14048, -14297, -13379, -12301, -9652, -6615, -2905, 760, 2674, 5150, 5989, 7356, 8571, 11213, 14620, +17700, 21676, 23818, 25374, 24701, 23245, 20786, 17230, 14203, 10500, 6667, 2455, -1910, -7079, -12490, -17223, +-21211, -23988, -24945, -23715, -21403, -18540, -15669, -12839, -11910, -11331, -11088, -10434, -8879, -6520, -2419, 983, +3957, 6763, 7756, 8311, 9077, 10258, 12717, 15548, 19435, 22515, 24161, 24393, 23091, 19968, 16609, 13088, +9226, 5968, 2025, -1666, -6714, -12131, -16538, -20845, -23065, -24054, -22587, -20355, -17932, -15042, -12587, -11049, +-10357, -9295, -8262, -6903, -5004, -2209, 532, 2474, 5156, 6726, 7933, 9353, 10823, 12673, 14701, 17277, +19838, 21214, 22498, 22207, 20377, 17829, 14254, 9829, 4901, 789, -3875, -8003, -12294, -15857, -19245, -22277, +-23222, -23666, -21897, -19071, -15848, -11854, -9377, -7621, -6508, -6871, -5966, -5062, -2798, 73, 3273, 6371, +7771, 9150, 9552, 10428, 11205, 13525, 16341, 18334, 21188, 21703, 21801, 19687, 16911, 13578, 9003, 4990, +544, -3561, -7720, -12033, -15421, -18092, -21298, -21950, -22396, -21261, -19100, -16536, -12009, -9914, -6930, -5163, +-4767, -3929, -3828, -1819, -928, 2324, 4947, 6901, 9120, 9969, 11617, 11544, 13342, 15179, 16080, 18831, +19485, 20269, 18950, 16305, 13560, 8209, 4073, -755, -5074, -8656, -12538, -14796, -17492, -19810, -20468, -21208, +-20260, -18427, -15372, -11521, -8719, -5284, -3599, -3153, -2517, -2872, -1718, -1088, 1169, 3951, 5660, 8166, +9485, 10939, 11495, 12805, 14278, 15499, 17326, 18593, 19557, 18738, 17244, 14205, 9363, 4665, -908, -5534, +-9275, -12773, -14424, -16604, -18078, -19338, -20600, -20176, -19381, -16431, -12649, -8785, -4767, -2582, -1661, -1606, +-2372, -2076, -1552, 612, 3551, 5925, 8756, 10192, 11138, 11549, 11951, 13248, 14541, 16308, 18039, 18882, +18373, 16026, 12827, 7851, 2682, -1763, -6425, -9267, -12068, -13802, -15062, -17103, -17593, -18785, -18745, -17099, +-15469, -11587, -8271, -4826, -1877, -1072, -129, -563, -1408, -593, -102, 1781, 3980, 6743, 8900, 10837, +12153, 12959, 13846, 13953, 15460, 16244, 16851, 17467, 15781, 13454, 9204, 3900, -1145, -6795, -10575, -13338, +-15193, -16008, -16590, -17365, -17893, -17952, -17514, -15583, -12941, -9329, -4880, -2322, 471, 1228, 771, 551, +-420, 503, 1598, 3643, 6939, 9222, 11316, 12804, 12969, 13275, 13311, 13875, 15207, 16004, 16876, 15980, +13187, 8955, 3353, -2480, -7388, -11348, -13623, -14625, -15412, -15369, -16265, -16819, -17162, -17018, -14982, -12306, +-8517, -4635, -1201, 811, 1777, 1814, 953, 629, 769, 2122, 3588, 6027, 8171, 9833, 11574, 12327, +13076, 13789, 14054, 14465, 14812, 14289, 13437, 10834, 7606, 3390, -1660, -5827, -10428, -13167, -15180, -15863, +-15756, -15354, -14917, -14586, -13866, -13546, -11542, -9643, -6370, -2836, -165, 1956, 2328, 2231, 1024, 86, +691, 2029, 4201, 7369, 10326, 12639, 13530, 14244, 14206, 14301, 14563, 15200, 15585, 13915, 12255, 8330, +3365, -1941, -6971, -10822, -13914, -15250, -15747, -15926, -15829, -15612, -15267, -14437, -12944, -11028, -8168, -5708, +-2761, -675, 932, 1543, 1930, 1965, 1579, 2261, 2788, 4448, 5974, 8355, 10645, 12197, 13801, 14355, +15085, 14916, 14889, 14500, 12383, 10632, 6783, 2788, -1668, -6329, -9606, -12863, -14543, -15712, -16050, -15929, +-15971, -14932, -13883, -12199, -10192, -7441, -5058, -2677, -665, 890, 1615, 2304, 2781, 2736, 3604, 3983, +5402, 6682, 8360, 10437, 11733, 13452, 13832, 14583, 14512, 14000, 13225, 11359, 9155, 5416, 2047, -2271, +-6207, -9625, -12098, -13866, -14714, -14776, -14632, -14219, -13691, -12033, -11300, -8944, -7211, -4971, -2688, -1884, +-45, 202, 357, 1028, 971, 1946, 2901, 4403, 6714, 8161, 10291, 12058, 12827, 14341, 14816, 15522, +15597, 14777, 13003, 9545, 5592, 786, -3953, -7631, -10840, -12791, -13836, -14841, -15145, -15475, -14947, -14505, +-12519, -10318, -7627, -5016, -3060, -1050, -823, -42, 429, 458, 1365, 1554, 2439, 3017, 3907, 5117, +6768, 8578, 10787, 12654, 14195, 15160, 15236, 15397, 14186, 12597, 9553, 6362, 2172, -2424, -6227, -9768, +-12594, -14121, -15136, -15246, -15271, -14261, -12665, -11814, -8937, -7330, -5430, -3719, -2422, -1070, -890, 259, +559, 947, 1248, 1479, 2480, 2803, 4463, 6479, 8324, 10783, 12508, 14268, 15038, 14855, 15950, 14547, +13129, 10611, 6731, 2580, -2705, -6841, -10263, -13137, -14158, -14528, -14662, -14282, -14150, -12887, -12044, -10187, +-7832, -5059, -2950, -1315, 217, -282, -81, -439, -23, 120, 840, 2667, 3341, 5137, 6736, 8275, +9914, 11249, 13266, 14490, 15489, 16329, 15713, 13875, 10716, 6348, 1673, -3432, -7449, -10204, -12479, -13282, +-14055, -14315, -14582, -14268, -13130, -11131, -9232, -6178, -3399, -1942, -182, -109, -230, -124, -975, 226, +398, 672, 2286, 1838, 3702, 4278, 6159, 8582, 10008, 12930, 13827, 15112, 15707, 14700, 13759, 10574, +7168, 2848, -2199, -5906, -10159, -12082, -13520, -14528, -13617, -14166, -12999, -12567, -11077, -8911, -7413, -3503, +-1709, 265, 1390, 1084, 660, -759, -670, -537, -312, 1671, 2427, 4238, 5357, 6421, 8374, 9012, +11288, 13045, 14351, 16032, 15398, 14439, 11038, 6783, 2300, -3057, -6644, -9817, -11476, -12378, -13001, -12827, +-13757, -13307, -12580, -11374, -8585, -5633, -2338, -162, 1496, 1714, 748, -614, -1475, -2014, -2095, -532, +498, 1744, 2977, 4021, 5456, 6596, 8751, 10967, 13081, 14772, 16274, 16245, 14691, 11767, 7720, 3013, +-2272, -6236, -9488, -11789, -12707, -13154, -13313, -13287, -13231, -12333, -11311, -8706, -5638, -2558, 304, 1917, +2700, 1596, 342, -962, -2290, -2225, -1127, -430, 1593, 2551, 3772, 5388, 5880, 8251, 9461, 12115, +14080, 15242, 16229, 14572, 12028, 7918, 3347, -1743, -6452, -9245, -11597, -12431, -12933, -12513, -12580, -12740, +-11480, -10408, -8171, -4947, -1698, 1590, 2902, 3716, 2828, 267, -1088, -3037, -2694, -2406, -1268, 1208, +1275, 2803, 3794, 4366, 6498, 7889, 11558, 13880, 15583, 16974, 15517, 12427, 8655, 3676, -937, -5268, +-8534, -9978, -11797, -11945, -12121, -12648, -12403, -12000, -10332, -8180, -5165, -1891, 580, 2180, 2416, 1746, +-94, -1680, -2679, -2849, -2561, -1194, 342, 1506, 2849, 4228, 5838, 7100, 9388, 11665, 13675, 15154, +15795, 14942, 12170, 8852, 4516, -563, -4744, -9013, -11263, -12804, -13430, -12751, -12712, -11693, -10929, -9566, +-8141, -5483, -2921, 139, 2436, 3574, 3389, 1535, -393, -2621, -3867, -3670, -2492, -488, 1528, 3363, +4655, 5534, 6104, 7965, 9785, 12445, 15102, 16144, 16383, 13613, 9799, 4909, -642, -4980, -8544, -10821, +-11646, -12678, -12306, -12838, -12895, -11684, -10868, -7976, -5101, -1595, 1518, 3062, 4540, 3564, 2044, 102, +-1849, -2722, -3518, -2255, -1293, 90, 1957, 2817, 4475, 5421, 6972, 9502, 11215, 14025, 15047, 15536, +13779, 10539, 6855, 1335, -2868, -6744, -9711, -11058, -12412, -12339, -12494, -12619, -11239, -10730, -8035, -5723, +-2897, 478, 1671, 3240, 2757, 1470, -293, -2235, -3309, -4258, -3631, -2281, -500, 1398, 3273, 5039, +6464, 8069, 9976, 12080, 13953, 15596, 16057, 14824, 11904, 8042, 3065, -1897, -6198, -9513, -11757, -13222, +-13943, -13638, -13667, -12518, -10685, -9012, -5534, -3542, -158, 2184, 2543, 3983, 2145, 764, -483, -2965, +-2660, -3655, -2391, -381, 183, 3280, 4250, 6115, 8035, 8796, 11760, 12432, 14237, 15037, 13806, 12248, +8456, 4661, -120, -4807, -8246, -11089, -12985, -13822, -13497, -12940, -12066, -10075, -8451, -5965, -3811, -1397, +1448, 1926, 3423, 2345, 965, -763, -3056, -3826, -4841, -3881, -1966, -44, 2606, 4797, 6643, 8437, +9882, 11756, 13502, 14709, 15502, 15078, 12859, 9886, 5318, 834, -3576, -8184, -10686, -13387, -14753, -14935, +-14638, -13222, -11418, -8767, -5856, -3520, -1169, 832, 1729, 2534, 2242, 1322, 435, -1635, -2655, -3736, +-4064, -2691, -1514, 1354, 4170, 6134, 8864, 10447, 11230, 12745, 13277, 14155, 13963, 12820, 10985, 7133, +2509, -1336, -6759, -10003, -12644, -14617, -14219, -14781, -12693, -11340, -9348, -6481, -4496, -2119, -374, 962, +1679, 1172, 372, -680, -2403, -3430, -4353, -3670, -3025, -1167, 1956, 4308, 7030, 9237, 11535, 12766, +13983, 14953, 15223, 14586, 12861, 10793, 7022, 2679, -1721, -6046, -9928, -13395, -15552, -16241, -16473, -15090, +-12573, -9763, -6799, -4089, -1702, 153, 808, 1907, 2330, 1476, 1548, -167, -1220, -3009, -3786, -2911, +-2065, 720, 3845, 6802, 8718, 10929, 11864, 12518, 13056, 13472, 13913, 11882, 10703, 7618, 3556, -726, +-4836, -8126, -12007, -13859, -15185, -15452, -15096, -13214, -10124, -7410, -4216, -1451, 323, 1113, 728, 710, +-391, -1261, -1723, -2130, -2969, -3188, -2813, -2490, -514, 1780, 5450, 8233, 11390, 14068, 15028, 16079, +15100, 14669, 12696, 10689, 8790, 5372, 1729, -2625, -6765, -11087, -14752, -16743, -17105, -17047, -14355, -11326, +-8471, -5611, -3488, -1493, -953, -541, 308, 186, -183, -129, -900, -1537, -2378, -2183, -1074, 152, +3166, 6477, 9337, 12213, 13837, 14927, 15436, 14679, 14312, 12887, 10655, 8460, 4691, 1089, -3346, -7027, +-10786, -14240, -15958, -17380, -17200, -16172, -13429, -10275, -6858, -3615, -1179, 41, 125, -219, -472, -643, +-919, -251, -619, -410, -679, -437, 858, 2548, 5682, 9147, 12246, 14243, 16028, 15762, 15121, 13311, +11271, 9645, 6509, 4588, 1210, -2587, -6293, -10521, -13410, -16118, -17267, -17011, -15437, -13270, -10041, -6346, +-4444, -1482, -1084, -18, -638, -1039, 17, -1000, -372, -629, -530, -648, -782, 1012, 2929, 5743, +9123, 12747, 14647, 15882, 16351, 15321, 14020, 11306, 9964, 7084, 4177, 1360, -2668, -6115, -10463, -13149, +-15281, -16743, -16323, -15548, -13143, -10958, -7974, -4765, -2674, -653, -144, -90, -255, -1475, -1137, -1555, +-1480, -626, -633, 362, 856, 2732, 5163, 7763, 11448, 14350, 16386, 17495, 17337, 15679, 13101, 10085, +7310, 3980, 815, -1999, -5302, -8990, -12456, -14644, -16991, -17787, -16462, -15092, -11940, -9416, -5878, -3527, +-2406, -614, -1331, -1058, -1034, -1135, -18, -439, 903, 972, 1001, 2432, 3367, 6056, 8810, 11913, +14918, 16596, 17186, 17195, 15256, 13152, 10262, 6895, 3835, -206, -3249, -6643, -10338, -12819, -15286, -16575, +-17070, -16898, -14730, -12901, -9894, -6830, -3755, -1569, -687, 62, -297, -343, -907, 50, 379, 879, +1755, 2199, 2553, 3555, 5140, 7569, 10414, 12781, 15631, 16222, 16726, 15767, 13232, 11069, 7053, 4142, +369, -2860, -5862, -9313, -11302, -13744, -15227, -15869, -15993, -15074, -13464, -11010, -8028, -5689, -3159, -2027, +-1458, -1217, -1251, -663, -149, 999, 2167, 2790, 3561, 4383, 4922, 6314, 8011, 10786, 12775, 15355, +16683, 16522, 16070, 13248, 10747, 6930, 3250, -26, -3709, -6511, -9926, -11964, -13780, -15479, -15921, -15524, +-14709, -13282, -10676, -8267, -5788, -4014, -2086, -1865, -1374, -992, -672, 226, 873, 2664, 3397, 3904, +4989, 5315, 6620, 8068, 10219, 13006, 14714, 16266, 16915, 15601, 14021, 10641, 7361, 3413, -1166, -3968, +-7819, -10521, -12483, -14074, -14848, -15804, -14982, -14473, -13215, -11001, -8767, -5915, -3978, -2061, -921, -619, +-267, -708, 90, 481, 1802, 3023, 4194, 5585, 5878, 7070, 8224, 9378, 11627, 13494, 15602, 16491, +16178, 15221, 12232, 8650, 4623, -231, -4040, -8096, -11034, -12815, -14853, -15029, -15592, -15131, -14467, -13452, +-11680, -9686, -7204, -5027, -2917, -1646, -502, -112, 115, 1026, 1656, 3171, 4349, 5421, 6421, 6518, +7302, 7914, 9271, 10941, 12950, 14952, 15752, 15150, 13568, 10932, 7148, 3691, 125, -3609, -6619, -9852, +-11946, -14065, -15411, -15213, -15222, -13809, -12271, -11300, -8699, -8149, -6111, -4858, -3987, -1850, -1584, 600, +1537, 2363, 4345, 4941, 6201, 7046, 7946, 8843, 9353, 10994, 12078, 13340, 14581, 14993, 13952, 12482, +9672, 6763, 2975, -837, -3842, -7710, -10708, -13334, -15257, -16370, -16755, -15194, -13644, -12135, -9703, -8350, +-6944, -5751, -4559, -3120, -1877, 231, 1891, 3108, 4419, 5488, 6099, 6765, 7555, 8498, 9067, 9628, +10764, 11080, 11762, 12293, 12863, 11951, 10744, 9014, 6037, 2752, -1416, -4602, -8291, -11705, -13180, -14885, +-15134, -15682, -14350, -12837, -11568, -9163, -7024, -5468, -4089, -2984, -2130, -1178, -432, 1533, 2285, 4245, +5185, 6223, 7216, 6804, 7870, 7665, 8321, 9310, 10017, 11452, 11685, 11931, 11419, 9596, 7545, 4994, +2090, -1145, -4077, -7216, -10456, -13080, -14655, -15881, -16126, -14218, -12290, -9983, -7676, -5669, -4295, -3657, +-2615, -1427, -427, 1083, 2597, 4007, 5037, 5529, 6309, 6498, 6862, 7580, 7866, 8694, 8726, 9072, +9251, 9276, 9499, 9172, 8990, 7185, 5471, 2397, -978, -4247, -7695, -10123, -12459, -13537, -14632, -14756, +-14036, -12730, -11254, -9338, -6964, -5616, -3343, -2223, -1103, 372, 892, 2509, 3573, 5098, 6596, 7347, +8587, 8883, 9141, 9259, 9027, 9192, 8514, 8869, 8470, 8282, 7549, 6564, 5270, 3416, 1283, -1681, +-3953, -7413, -10181, -12324, -14160, -14787, -14970, -13254, -11872, -10359, -7662, -6079, -4742, -2974, -1419, -559, +1322, 2072, 3721, 4569, 5406, 6992, 7123, 8294, 9126, 9194, 9527, 9005, 8247, 7950, 6770, 6864, +6619, 5960, 5916, 4334, 2939, 642, -2238, -4448, -7533, -9460, -11511, -12809, -13240, -13610, -12169, -11209, +-9407, -7593, -5752, -3812, -2991, -1021, -120, 1094, 2075, 3345, 4468, 5023, 6126, 6774, 7539, 7840, +8389, 8481, 8058, 7898, 7635, 6993, 6702, 6358, 6040, 5420, 4403, 3222, 1060, -1345, -3808, -6307, +-8959, -10972, -12621, -13832, -13541, -13088, -11338, -9773, -8014, -5965, -4841, -2841, -1742, -231, 1671, 2466, +4245, 5204, 6152, 6811, 7116, 8335, 8065, 9067, 9487, 9056, 8767, 7538, 6851, 5764, 4875, 4923, +3738, 3226, 2177, -216, -1661, -4937, -7041, -8611, -11079, -11421, -12566, -12167, -11708, -10939, -8799, -7589, +-5466, -3716, -1477, 110, 1314, 2793, 2949, 3956, 4295, 5175, 6343, 6632, 8064, 8309, 8213, 8592, +7317, 6914, 5961, 4913, 5110, 4051, 4206, 3574, 2139, 1475, -889, -2154, -4083, -5950, -7085, -9210, +-10347, -11412, -12141, -11554, -10482, -8840, -6462, -4843, -2707, -1452, -177, 1141, 1775, 3307, 3808, 5313, +5896, 6667, 7349, 7347, 8065, 7521, 7768, 7116, 6111, 5466, 4019, 3723, 2780, 2543, 2261, 1327, +672, -715, -1904, -3367, -4933, -6357, -7790, -9370, -10297, -10868, -10697, -9774, -8203, -5902, -4273, -2589, +-821, -40, 902, 1562, 2708, 3413, 4698, 5804, 6808, 7371, 7333, 8049, 6872, 7045, 6410, 5752, +5119, 3949, 3770, 2378, 1413, 1330, 97, -448, -1269, -2204, -2878, -4670, -5410, -6944, -8558, -9450, +-10124, -9691, -8950, -7301, -5161, -3687, -1854, -537, 633, 1530, 1926, 2943, 3638, 4124, 5140, 5777, +6380, 6756, 6953, 6920, 6273, 5717, 4960, 3889, 3027, 2606, 1639, 1276, 939, 316, -91, -871, +-1654, -2340, -3581, -4117, -5573, -7375, -8374, -9193, -9314, -8587, -6876, -5053, -3314, -1773, -444, 539, +1006, 1617, 2243, 3226, 4015, 4956, 5954, 6278, 6450, 6387, 6018, 5630, 4839, 4499, 3416, 2694, +1870, 818, 757, -99, -220, -695, -1170, -1471, -2397, -2667, -3323, -4570, -5789, -6630, -7732, -7902, +-7762, -6913, -5465, -4501, -2202, -1123, 50, 1540, 1558, 2414, 2637, 3644, 4468, 5068, 6644, 6993, +7468, 7099, 6609, 5655, 4201, 3496, 2364, 1525, 744, 206, -540, -1854, -2253, -3040, -3321, -3110, +-2781, -2785, -3496, -4696, -6268, -7303, -8267, -7389, -6264, -4060, -1830, -91, 1375, 1404, 1842, 1760, +1916, 2585, 3677, 4998, 5553, 6502, 6460, 5970, 5321, 4116, 3755, 2600, 1991, 1481, 454, -78, +-962, -1561, -1838, -2731, -2097, -2160, -2303, -1172, -1957, -2218, -3352, -4904, -5597, -6778, -6479, -5779, +-4738, -2728, -1399, 71, 1384, 1713, 2092, 2311, 2257, 2970, 3663, 4681, 6118, 6469, 6687, 6128, +4875, 3777, 2522, 1375, 1162, 298, -151, -240, -1579, -2126, -2970, -3405, -3173, -3115, -1860, -1636, +-2002, -2373, -4128, -5329, -5776, -5980, -4809, -3304, -1395, 308, 1060, 1991, 2199, 1940, 2086, 2190, +2924, 3416, 4450, 5369, 5654, 5203, 4846, 3691, 2344, 1518, 629, 641, -260, -245, -721, -1736, +-2592, -3152, -3326, -3100, -2162, -1155, -100, -612, -1326, -2509, -4732, -4763, -5442, -3995, -2553, -1407, +619, 516, 1070, 825, 793, 1384, 1728, 3016, 4032, 4741, 4993, 5291, 4496, 3842, 3493, 2442, +2214, 1395, 884, 355, -922, -1453, -2429, -3142, -3251, -3243, -2689, -2203, -1472, -975, -1291, -1826, +-2625, -3778, -4302, -4345, -3588, -2446, -1646, 103, 512, 1084, 1436, 1780, 2584, 2231, 3775, 3721, +4131, 4899, 4540, 4914, 4068, 3648, 3110, 1741, 1181, 260, -807, -1256, -2208, -2701, -3367, -3930, +-3501, -3539, -2473, -1573, -875, -296, -859, -1118, -2539, -2876, -2972, -2682, -1176, -422, 829, 924, +1053, 955, 636, 1220, 1671, 2623, 3360, 3954, 4310, 3690, 3629, 2846, 2167, 1932, 1669, 1275, +716, 65, -1136, -2275, -3309, -3512, -3809, -3329, -2348, -1962, -832, -890, -1133, -1453, -2686, -3120, +-3406, -3207, -2357, -1811, -904, -362, -535, 26, 362, 944, 1879, 3154, 4220, 4704, 5321, 5219, +4859, 4268, 3928, 3710, 2974, 2968, 2122, 1220, -65, -1612, -2543, -3890, -4021, -4140, -3947, -3345, +-3007, -2038, -2005, -1771, -1840, -2948, -2870, -3332, -3127, -1865, -1277, 284, 409, 691, 793, 187, +815, 1292, 2723, 4093, 5257, 5828, 5528, 5347, 3833, 3130, 2427, 1957, 1926, 1322, 1552, -154, +-1321, -2405, -4431, -4419, -5219, -4138, -3439, -3083, -1094, -1495, -1266, -1792, -2710, -2788, -3537, -2455, +-1712, -876, 94, -98, -137, -645, -100, 253, 1304, 3103, 4022, 5008, 5337, 5465, 4996, 4369, +4710, 4174, 4020, 3401, 2390, 1271, -498, -1558, -2654, -3507, -3859, -4001, -4030, -3772, -3765, -3206, +-2854, -2793, -2183, -2696, -2276, -2626, -2396, -1550, -1258, -137, 173, 144, 532, 128, 748, 1595, +2097, 3579, 4114, 4262, 4651, 4162, 4038, 3585, 3554, 3704, 2697, 2502, 1635, 386, -728, -1654, +-2024, -2865, -2810, -3061, -3013, -3355, -2878, -2461, -2611, -2219, -2534, -2824, -3207, -3692, -2766, -2769, +-1532, -386, -197, 595, 185, 802, 624, 1506, 3054, 3502, 4509, 4719, 4865, 4351, 4327, 4496, +4225, 3972, 3639, 2810, 1339, 417, -592, -1251, -1678, -2000, -2022, -2727, -3265, -3428, -3787, -3888, +-3915, -3684, -3745, -3886, -4075, -3818, -4017, -3151, -2616, -1830, -343, 119, 1729, 2033, 2746, 3682, +3409, 4271, 4490, 4925, 5352, 5827, 5854, 5805, 4985, 3876, 2989, 1034, 386, -255, -994, -980, +-1801, -2036, -2955, -3946, -4026, -4713, -5015, -4607, -4602, -4671, -3992, -4351, -3728, -3909, -3401, -2475, +-2192, -711, 468, 1423, 2509, 3169, 4109, 3951, 4193, 4229, 4121, 4392, 4549, 5284, 5122, 5214, +4681, 3768, 2686, 1579, 759, 226, -309, -404, -835, -1797, -2412, -3466, -4592, -5251, -5476, -5669, +-5468, -5289, -5282, -5347, -5546, -4957, -4555, -3457, -1175, -178, 1996, 2897, 3758, 4471, 4164, 4894, +4501, 5030, 5362, 5624, 6161, 5750, 5713, 4640, 3961, 2552, 1661, 1433, 268, 251, -585, -1015, +-1923, -3148, -3419, -4874, -5830, -5919, -6242, -6111, -5864, -5129, -5093, -5202, -4293, -4685, -3321, -2308, +-570, 1922, 2516, 4887, 4542, 4665, 4955, 3823, 4991, 4257, 5286, 5674, 4976, 5364, 3818, 3445, +2029, 1705, 2301, 1305, 2013, 1010, 114, -1170, -2672, -2768, -4655, -4608, -4758, -5688, -5510, -6396, +-6275, -6947, -7195, -5940, -5795, -3758, -2691, -544, 1232, 1768, 3842, 3273, 4307, 4667, 4417, 5794, +5348, 5965, 5742, 5056, 5082, 3987, 3599, 3356, 3014, 3270, 3084, 2894, 1971, 818, -447, -1663, +-2807, -4101, -4916, -5636, -6135, -6530, -6750, -7127, -7602, -7689, -7579, -7044, -5338, -3849, -1055, 716, +2495, 3589, 3770, 4518, 3816, 4982, 5199, 5955, 6661, 6411, 6445, 5103, 3908, 3248, 2369, 2950, +3385, 4271, 4487, 3750, 2432, 314, -1583, -3709, -4669, -5505, -6080, -6022, -6804, -7022, -8181, -9044, +-9118, -9328, -7679, -6211, -3580, -815, 1063, 2822, 3447, 3934, 4245, 4390, 5713, 6241, 7041, 7325, +6924, 6133, 4516, 3481, 2815, 2849, 3215, 4011, 4632, 4424, 3290, 1954, 325, -1811, -3007, -4051, +-5257, -5679, -6586, -6678, -7773, -8037, -8209, -9240, -8198, -7472, -6014, -3749, -1810, 880, 1840, 3205, +4101, 4119, 4481, 4770, 5360, 5528, 5877, 5754, 5625, 4410, 4001, 3740, 3280, 4048, 4152, 5234, +5205, 4946, 4366, 2288, 823, -1564, -3750, -5354, -6807, -7491, -8030, -8223, -8542, -9247, -9800, -9684, +-9323, -7645, -5179, -2454, 1011, 2800, 4602, 5122, 4909, 5418, 5359, 6211, 6685, 6780, 6857, 5725, +4439, 3385, 2194, 1820, 2514, 2992, 4292, 4758, 4036, 3367, 1675, -30, -1320, -2946, -4059, -5124, +-6128, -7129, -7965, -8752, -9114, -9479, -8767, -7654, -6478, -4198, -2541, -57, 1750, 3077, 4821, 5393, +5999, 6455, 5903, 5958, 4948, 4640, 3898, 3532, 3312, 2881, 2977, 2756, 3212, 3232, 3603, 3973, +3225, 2892, 2037, 320, -1365, -3222, -4707, -6469, -7535, -8049, -8682, -9022, -8886, -8795, -8107, -7156, +-5737, -3309, -1026, 1266, 3120, 4627, 5466, 5447, 5745, 5633, 5321, 5015, 4659, 4502, 3823, 3618, +3094, 3047, 3356, 3529, 4429, 4578, 4840, 3876, 3166, 1807, 158, -1709, -3445, -4657, -6964, -8078, +-9295, -10020, -9882, -9783, -8457, -7448, -6051, -4526, -2950, -284, 1654, 3854, 6091, 6996, 7549, 7278, +6501, 5507, 3827, 3226, 2296, 2071, 2145, 2117, 2595, 2514, 2972, 2746, 3246, 3105, 3004, 2818, +2396, 1784, -195, -1801, -3828, -5975, -7609, -8229, -8276, -8166, -7230, -6716, -5955, -6027, -4952, -3866, +-2017, 527, 2698, 5582, 5945, 6715, 5854, 4463, 3440, 1669, 2017, 1322, 2000, 2635, 2483, 2960, +2698, 2854, 3147, 3380, 4194, 4645, 4317, 4007, 2545, 366, -2184, -4138, -6169, -7655, -8141, -8054, +-7951, -7766, -6914, -6716, -6043, -4782, -2972, -393, 2044, 4419, 6289, 6690, 6761, 5988, 4485, 3870, +2004, 1728, 1286, 744, 1220, 192, 1025, 415, 1171, 1971, 2619, 4187, 3973, 4918, 4075, 2851, +1116, -1346, -3046, -5058, -6367, -6556, -6852, -6823, -6440, -6423, -6230, -5944, -4913, -3219, -1010, 1845, +3774, 5699, 6176, 5828, 5208, 3788, 2780, 1554, 968, 604, 22, 414, -15, 270, 645, 1242, +2081, 2954, 3842, 4596, 4979, 4009, 3527, 748, -905, -3394, -5294, -6052, -7448, -6536, -6525, -6205, +-5423, -5134, -4637, -3783, -2122, 308, 2445, 4715, 6623, 6613, 6710, 5587, 4048, 2676, 1009, 459, +-726, -1135, -892, -1813, -1264, -1409, -599, 270, 1195, 3004, 3813, 5158, 4896, 4080, 1842, -318, +-2541, -4520, -5011, -5582, -4520, -4514, -3952, -4046, -4845, -4313, -4487, -2362, -15, 2342, 4786, 6048, +6193, 5098, 3901, 2093, 1180, -118, -406, -817, -1782, -1782, -2793, -2500, -2073, -1269, 1045, 2095, +4365, 5594, 6261, 6470, 5011, 3503, 966, -1661, -3472, -5005, -5520, -5228, -4904, -4282, -4118, -4199, +-4307, -4303, -2825, -759, 2165, 4802, 6702, 7477, 6509, 4947, 2891, 1237, -294, -972, -1112, -1739, +-2070, -3128, -3947, -4288, -3784, -2112, 277, 2810, 5061, 6489, 6891, 5723, 3870, 1733, -658, -2226, +-3244, -3718, -3409, -3382, -3020, -3231, -3404, -3738, -3901, -2509, -1198, 1254, 3437, 5149, 5814, 4982, +3968, 2170, 526, -619, -1101, -1947, -2322, -3030, -4128, -4618, -4967, -3651, -2616, 288, 3011, 5224, +7076, 7637, 7024, 5304, 3308, 1096, -614, -2044, -2591, -2939, -2861, -3161, -3196, -3425, -4128, -3885, +-2698, -1519, 902, 2648, 4235, 4492, 3871, 2909, 1523, 286, -345, -924, -1813, -2434, -3662, -4815, +-5442, -5393, -3774, -2025, 977, 3876, 5893, 7447, 7990, 7177, 5867, 3831, 1685, 219, -2138, -3004, +-3992, -4564, -4205, -4283, -3615, -3469, -3178, -1932, -961, 1133, 2471, 3927, 4911, 4862, 4230, 3084, +1957, -98, -973, -2653, -3813, -4695, -6269, -6103, -6290, -5005, -2951, -616, 2620, 4782, 6744, 7842, +7987, 7473, 5974, 4400, 2727, 97, -1595, -3128, -4277, -4633, -4675, -3818, -3889, -2931, -2366, -1360, +-375, 949, 2097, 2663, 3539, 3159, 2931, 1852, 361, -881, -2984, -3759, -4984, -5713, -5309, -5348, +-3890, -2422, -294, 2367, 4496, 6857, 8060, 8650, 8163, 6522, 4689, 2485, 585, -1660, -2533, -3474, +-4059, -4014, -4130, -3675, -3051, -2209, -629, 97, 1427, 2333, 2367, 3027, 2619, 2242, 1235, 6, +-1637, -3419, -4923, -6218, -6695, -6687, -5784, -4283, -2586, -89, 1831, 4020, 6216, 7598, 9024, 8895, +8564, 6565, 4166, 2162, -967, -2543, -4004, -4322, -4573, -4143, -3371, -3158, -2589, -2134, -995, -543, +559, 1448, 1595, 2151, 1393, 1334, -25, -1390, -2789, -4346, -5308, -6250, -5927, -5270, -3947, -2029, +110, 2557, 4339, 6308, 7654, 8660, 8663, 8253, 7283, 5354, 2986, 636, -1676, -3575, -4151, -4615, +-3773, -3240, -2640, -1872, -1984, -1419, -898, -559, 66, 1040, 1093, 1358, 822, -622, -1756, -3997, +-4709, -5553, -6258, -4979, -4479, -2592, -1198, 408, 2585, 4012, 6072, 7742, 9170, 9535, 9315, 8071, +5660, 2975, -311, -2430, -4250, -5137, -4666, -4223, -3313, -2948, -2485, -1931, -2134, -963, -274, 28, +1404, 1301, 1505, 530, -1033, -2033, -4569, -4891, -5767, -5867, -4945, -4358, -2441, -1428, 380, 2327, +4276, 6304, 7963, 9634, 9841, 9327, 7860, 5689, 2815, 173, -1925, -3874, -4625, -4957, -4836, -3922, +-3408, -2058, -1423, -728, 292, 180, 352, 446, 493, 415, 11, -391, -1772, -3016, -4511, -5903, +-6552, -6642, -5314, -3835, -1574, 575, 2435, 4557, 5760, 7535, 8636, 9250, 10085, 8808, 7514, 4977, +1786, -835, -3556, -4198, -4641, -4089, -2713, -1642, -1850, -1351, -1613, -2286, -2054, -1961, -750, -968, +-343, -488, -1852, -3193, -4720, -5571, -6406, -5975, -4908, -3328, -1930, -66, 1941, 3172, 4971, 6720, +8583, 9546, 10376, 10362, 8775, 6808, 3741, 1288, -1506, -3357, -3953, -4928, -4186, -3605, -2841, -1930, +-1637, -815, -1205, -1288, -1215, -1455, -1462, -1222, -1363, -1923, -2890, -4038, -4666, -5670, -5890, -4725, +-3930, -2193, 132, 1957, 4151, 5281, 7254, 8601, 8655, 9987, 9149, 8146, 6357, 3752, 1217, -1489, +-2935, -4376, -4907, -4673, -4063, -3762, -2761, -1947, -1632, -786, -973, -647, -1104, -1654, -1635, -2586, +-2379, -3241, -3360, -3565, -4306, -4332, -4104, -4045, -2739, -572, 1482, 4448, 6279, 8756, 9678, 9535, +9572, 8198, 6813, 5314, 3644, 1860, 110, -2051, -3491, -4961, -5576, -5090, -4639, -2967, -1879, -871, +-185, -769, -1227, -2296, -2958, -2991, -3070, -2784, -2764, -2853, -3225, -4020, -4118, -4059, -3445, -1874, +99, 3026, 4918, 7390, 9062, 9639, 9638, 8703, 7700, 6384, 4788, 3526, 1823, -360, -2274, -3905, +-5035, -5456, -4917, -3917, -2870, -1784, -1310, -1322, -1655, -2010, -2490, -2875, -2741, -2972, -3032, -3469, +-3631, -3903, -4494, -3910, -3624, -2672, -1209, 624, 2989, 4921, 7546, 9314, 10153, 10297, 9149, 7526, +5605, 3983, 2609, 992, 41, -1829, -3255, -4858, -5271, -5747, -5189, -3212, -2393, -348, -663, -229, +-1389, -3311, -3096, -4617, -3968, -3452, -3396, -2592, -3435, -3652, -4099, -4324, -3021, -1498, 948, 4075, +6326, 8814, 10328, 10473, 10338, 8621, 7213, 5956, 4116, 3460, 2067, 487, -881, -3196, -4479, -5716, +-5887, -5232, -4118, -2320, -1780, -1122, -1528, -2439, -3681, -4690, -4482, -4873, -3846, -3266, -3256, -2592, +-3769, -3167, -3236, -2432, -171, 1312, 4502, 6465, 8534, 10355, 10037, 9920, 8011, 6438, 4695, 2676, +1894, 529, -112, -1707, -2812, -4312, -5742, -5518, -5120, -3559, -1704, -134, 715, 451, -585, -2323, +-3996, -5083, -5106, -4859, -4247, -3336, -3284, -3376, -3934, -3554, -2969, -1683, 1079, 3792, 6764, 9257, +10968, 11213, 10115, 8480, 6382, 4712, 2929, 2165, 1407, 128, -1196, -3013, -4550, -6033, -6324, -5474, +-4221, -2068, -420, 314, 1050, -362, -1675, -3098, -4652, -4822, -5296, -4291, -3551, -3419, -2789, -2955, +-3137, -2439, -1457, 574, 2965, 5662, 8835, 10197, 10768, 10449, 8364, 6226, 4109, 2245, 1179, 294, +-289, -769, -2713, -3827, -4887, -6065, -5432, -4327, -2474, -658, 284, 1601, 595, -1126, -2107, -4446, +-5352, -5790, -5509, -4007, -3448, -2707, -2194, -2261, -2460, -1571, -95, 2238, 4804, 8304, 10573, 11181, +11137, 9071, 6634, 3918, 1971, 1394, 454, 718, -255, -1608, -3275, -5347, -5887, -6087, -4583, -2594, +-345, 961, 1511, 549, -1301, -3115, -5073, -5565, -6128, -5024, -4167, -3285, -2678, -2740, -2294, -2528, +-1169, 254, 2565, 5602, 8256, 10360, 10960, 10517, 8402, 6063, 3607, 1525, 492, -439, -723, -1306, +-2342, -3551, -4790, -5180, -4530, -3434, -1544, 307, 1115, 1792, 893, 27, -1470, -3556, -3891, -5334, +-5328, -4947, -5030, -4227, -4022, -3250, -2716, -1651, -178, 1907, 4093, 6816, 9024, 9672, 10452, 8557, +7236, 5030, 2769, 2073, 333, 95, -836, -1709, -2688, -3685, -3876, -3849, -3105, -1671, -643, 385, +866, 464, -259, -1380, -2945, -3575, -4880, -4675, -4836, -4811, -4174, -3951, -3154, -2529, -1356, 90, +1986, 3879, 6509, 8065, 9160, 9480, 7758, 6532, 3951, 2093, 949, -633, -739, -1631, -2431, -2964, +-4031, -4214, -3668, -3171, -1150, 23, 1112, 1981, 1004, 760, -539, -2068, -2592, -3612, -4116, -4263, +-4820, -4316, -4560, -4186, -3096, -2039, -283, 1627, 3923, 5965, 7642, 8694, 8839, 8252, 6622, 5253, +3246, 1722, 296, -1220, -1907, -3025, -3638, -3777, -3828, -3372, -2495, -1647, -648, -241, -10, 327, +366, 491, -144, -672, -1695, -3018, -4063, -4970, -4765, -4514, -3299, -1811, -401, 968, 1663, 3444, +4240, 5415, 6939, 7162, 7502, 6431, 5135, 3071, 800, -803, -2507, -3080, -3120, -3154, -2755, -2538, +-2107, -2049, -1283, -973, -144, 447, 555, 1217, 195, 55, -1062, -2252, -2828, -3993, -4193, -4507, +-4432, -3603, -2741, -1332, 367, 1802, 3671, 5161, 5708, 6867, 6507, 6637, 5737, 4665, 3440, 1346, +-221, -2156, -3546, -4243, -4317, -3896, -3115, -2204, -1281, -1024, -453, 57, -23, 782, 1325, 1392, +1908, 942, 401, -890, -2454, -2912, -4041, -3845, -3319, -2513, -1091, 156, 1471, 2479, 3712, 4022, +4564, 4645, 4438, 4230, 3064, 2269, 1092, -1205, -1863, -3472, -4054, -3432, -3666, -1679, -1367, -306, +703, 148, 934, 367, 611, 1070, 677, 1229, 438, -185, -1131, -2604, -3459, -3719, -3927, -2860, +-1920, -492, 1213, 1773, 3565, 3752, 4073, 4516, 3970, 4189, 3075, 2550, 1395, -217, -1692, -3508, +-4131, -5285, -4666, -4186, -3057, -1500, -987, 730, 777, 1351, 1411, 1157, 1702, 1457, 1946, 2043, +1825, 1212, -118, -1719, -2260, -3391, -3004, -1684, -604, 1194, 1957, 3314, 3400, 2991, 3265, 2571, +2566, 2138, 1755, 1398, -317, -1340, -3004, -4075, -4773, -4563, -3715, -2992, -1741, -687, 149, 556, +1120, 730, 861, 674, 342, 962, 301, 1152, 449, -168, -399, -1598, -1932, -1622, -939, 268, +1957, 2949, 4835, 4351, 4404, 3952, 1819, 1620, -154, 8, -483, -1794, -1930, -3498, -4597, -5432, +-5202, -5009, -3617, -2314, -715, 689, 991, 2000, 1316, 1227, 1574, 992, 1913, 1297, 1781, 1203, +-348, -241, -1162, -1257, -31, 783, 2256, 2679, 3114, 3875, 2815, 3256, 3077, 2209, 2032, 860, +-168, -1169, -3380, -3744, -4906, -5544, -4758, -4781, -3539, -3246, -2392, -1184, -1023, 340, 720, 1248, +1845, 1766, 2260, 1564, 1627, 1309, 1361, 672, 710, 1138, 590, 1388, 2005, 2214, 2921, 3105, +3629, 3740, 3172, 3120, 1292, 375, -1214, -2673, -3387, -4836, -5051, -5677, -5623, -5300, -5045, -4031, +-2968, -2148, -1040, -253, 355, 1128, 1393, 2122, 2131, 2608, 2387, 1945, 1932, 1103, 851, 386, +697, 1476, 1966, 3338, 3938, 4322, 4513, 3933, 3653, 3177, 2492, 1869, 391, -1038, -2713, -4438, +-5775, -6547, -6877, -6659, -5781, -5140, -4172, -3216, -2788, -1843, -1079, -105, 466, 1383, 2076, 2526, +2712, 3164, 2925, 2790, 2582, 2130, 1872, 1433, 2029, 2441, 3430, 3927, 4695, 4883, 4300, 3807, +2809, 1771, 423, -735, -1918, -3391, -4504, -5568, -6304, -6961, -6886, -6264, -5689, -4390, -3156, -1601, +-947, -621, 624, 91, 985, 1433, 1529, 2410, 1736, 2736, 2028, 1748, 1506, 1079, 1375, 1060, +2427, 3211, 4036, 4918, 5367, 5675, 4492, 3823, 2776, 711, -721, -2106, -3214, -4296, -5078, -5329, +-6283, -6678, -6217, -5990, -4805, -3598, -1762, -742, -498, 367, -51, 50, 280, 983, 1813, 1933, +2878, 2624, 2387, 1611, 1258, 1490, 1225, 2740, 3735, 4966, 5751, 6187, 6654, 5517, 4676, 3500, +1476, -338, -2246, -3629, -5209, -6261, -6584, -7322, -7681, -7705, -7102, -6459, -5262, -3043, -1530, -304, +837, 1200, 1164, 980, 1613, 1802, 1765, 2945, 2857, 3249, 2747, 2464, 2256, 1382, 2214, 2761, +4288, 5377, 6658, 7316, 6523, 5706, 3460, 1317, -854, -2999, -3846, -5155, -5721, -6314, -7563, -7888, +-8661, -8571, -7262, -6261, -3513, -1980, -173, 1252, 953, 1971, 1186, 1818, 2082, 2383, 3605, 3579, +4109, 3755, 3312, 2984, 1932, 2275, 2597, 3110, 4366, 5522, 6302, 5814, 5614, 3886, 1403, -786, +-2760, -4079, -5645, -5694, -6365, -7511, -7670, -8687, -8290, -8200, -6509, -3963, -2572, -277, 1170, 1552, +1784, 1566, 1831, 1758, 2080, 3158, 3672, 3896, 4378, 3832, 3273, 2377, 2151, 2650, 2936, 4303, +5770, 6384, 6477, 5694, 4291, 1620, -700, -2342, -4438, -5130, -5966, -6590, -7180, -8247, -8680, -8902, +-8884, -7121, -5455, -2750, -662, 1079, 2662, 2507, 3007, 2747, 2495, 2862, 3527, 4211, 4448, 5148, +4439, 3770, 2547, 2199, 1957, 1631, 3731, 4288, 5393, 5740, 5318, 3924, 1562, -322, -2519, -4142, +-4981, -5720, -6249, -7138, -7940, -8717, -9061, -8646, -7231, -5029, -2591, -360, 1598, 2550, 2560, 2978, +2537, 2771, 3351, 3789, 4773, 4674, 4586, 4117, 2848, 2032, 1840, 1524, 2335, 3169, 3613, 4720, +4101, 4453, 3028, 1496, 575, -1830, -2834, -4332, -5604, -6751, -7922, -8445, -8883, -8727, -8120, -6685, +-5412, -3007, -1053, 919, 2745, 3405, 4262, 3896, 3903, 3872, 3366, 4312, 4526, 4405, 4341, 3201, +2537, 865, 336, 764, 1290, 2442, 3728, 4380, 4791, 3750, 3016, 1613, -519, -1487, -3272, -4679, +-6115, -7063, -7957, -8907, -8674, -8219, -7491, -5796, -3968, -2175, -212, 1707, 3023, 4225, 4516, 4856, +4476, 3898, 4676, 4423, 4788, 4744, 3706, 3057, 908, 201, 7, -323, 1326, 2504, 3702, 4418, +3938, 3463, 1821, 160, -885, -2058, -3788, -4759, -6077, -7598, -8389, -9223, -8571, -8374, -7050, -4734, +-3357, -1457, 511, 1567, 2752, 2925, 3724, 4161, 3750, 4967, 5314, 5110, 4828, 4413, 3474, 2112, +1845, 1529, 1813, 2068, 3093, 3487, 3453, 3532, 3064, 2342, 894, 18, -1732, -3784, -5444, -7370, +-8587, -9521, -9464, -8374, -7884, -6004, -4443, -3466, -1490, -260, 1647, 3295, 4085, 5672, 5544, 5393, +5279, 4534, 4763, 3835, 3551, 3639, 2396, 2030, 1731, 1065, 1137, 1433, 2178, 2742, 3139, 3529, +3479, 1845, 1036, -832, -3818, -5238, -7369, -8329, -8922, -9109, -7933, -7971, -7036, -5495, -5039, -3076, +-1860, 585, 2708, 3657, 5804, 5654, 5609, 5340, 4957, 4733, 3781, 4213, 3788, 3011, 2678, 2299, +2049, 1377, 1831, 2369, 1855, 2764, 2818, 3100, 2502, 1009, 565, -3128, -5335, -7514, -9659, -10051, +-10351, -8394, -7642, -6218, -4855, -4346, -2991, -2250, 127, 2364, 4175, 7024, 7578, 7819, 7147, 5706, +5016, 3004, 3318, 2828, 2260, 2924, 1595, 1714, 899, 249, 1210, 968, 2119, 2849, 3381, 3551, +1768, 874, -2744, -5208, -7466, -9304, -9441, -10105, -8175, -8043, -6851, -5883, -5653, -3997, -3493, -551, +1797, 4380, 7339, 8005, 8922, 7827, 6700, 5631, 3947, 3991, 3391, 2867, 3266, 1501, 1356, 210, +-595, 30, -49, 1432, 2083, 2763, 3396, 2078, 939, -1453, -3996, -6089, -7858, -8317, -8781, -7897, +-7551, -6745, -6315, -6319, -4593, -4133, -1826, 1123, 3329, 6450, 7434, 8617, 8184, 6646, 6474, 4666, +4148, 3888, 2984, 3162, 1858, 1559, 1215, -68, 483, 430, 963, 1395, 2112, 2327, 1748, 369, +-1209, -3754, -6343, -7773, -9323, -9312, -9057, -7831, -6581, -6065, -5184, -4526, -3449, -2072, 663, 3193, +5950, 8145, 8847, 9388, 7510, 6657, 5059, 3583, 3551, 2550, 3217, 2248, 1923, 1399, 309, 39, +-39, 606, 917, 1986, 2208, 2236, 1057, -931, -3191, -6004, -7657, -9009, -9339, -8598, -8044, -6585, +-6195, -5707, -4790, -4164, -2266, 170, 3274, 5883, 7956, 9218, 9058, 8260, 6837, 5832, 4545, 3715, +3414, 2849, 2165, 1474, 1131, 525, 129, 95, 345, 65, 451, 965, 1040, 740, -595, -2067, +-4709, -7041, -8503, -9106, -8993, -7840, -6092, -5091, -4146, -3956, -2863, -2614, -927, 2323, 4583, 7704, +9344, 9872, 9478, 7436, 5499, 3963, 2136, 1739, 1610, 1271, 1586, 948, 774, 188, -631, -263, +-336, -75, 849, 1582, 1368, 1107, -776, -2941, -5835, -8358, -9591, -10696, -9522, -7934, -6560, -5020, +-4375, -3876, -3280, -2117, 614, 2784, 6290, 9121, 10476, 10864, 9894, 7737, 5630, 3370, 2347, 2059, +1743, 2955, 2655, 2730, 2061, 367, -233, -1411, -1109, -192, 755, 2136, 1489, -238, -2715, -6671, +-9427, -11293, -11495, -9812, -8229, -5247, -4427, -3786, -3512, -4074, -2300, -409, 3109, 6812, 9536, 11652, +11532, 10341, 8156, 5291, 3690, 2322, 2082, 2203, 2778, 2785, 2214, 1971, 414, -399, -1228, -1344, +-633, -376, 923, 249, -1360, -3488, -6921, -9313, -11489, -11652, -10492, -8834, -6255, -5127, -3789, -3274, +-3308, -1456, 68, 3192, 6133, 9135, 11722, 11475, 11365, 8871, 6385, 4074, 2257, 1908, 1627, 2509, +3049, 2948, 2858, 1479, 869, -696, -875, -667, -447, 614, 18, -732, -3462, -6578, -9397, -12101, +-12585, -12110, -10007, -7383, -5838, -3705, -2960, -2281, -900, 793, 3772, 6431, 9191, 11888, 12306, 11984, +9949, 7519, 4583, 1848, 961, -61, 551, 1572, 1981, 2939, 1975, 1440, 223, -1093, -788, -1167, +-2, 442, -16, -1617, -4513, -7554, -10749, -12567, -13042, -11540, -9581, -7369, -4985, -3803, -2643, -1602, +236, 2385, 4739, 8297, 10700, 12140, 12601, 11228, 8835, 5790, 3518, 1777, 670, 1283, 2269, 2633, +3324, 2841, 1591, -21, -1026, -1617, -1450, -50, 695, 958, -821, -3311, -7100, -10912, -12914, -13700, +-11928, -9799, -6852, -4300, -3424, -2401, -2054, -1108, 614, 3241, 6692, 9642, 11559, 12602, 10956, 8711, +5708, 2841, 1351, 355, 1404, 2669, 4002, 4667, 4921, 3260, 1339, 376, -1204, -1023, -192, 429, +537, -1593, -3888, -7651, -11892, -13923, -14793, -13710, -11341, -8469, -5354, -4063, -2533, -1233, -297, 2143, +4492, 8110, 10274, 12083, 12639, 10570, 8927, 5502, 3623, 1495, 202, 1450, 1208, 3135, 3486, 4240, +3917, 1782, 1826, -302, -400, -202, 76, 793, -1204, -2660, -5992, -10507, -13064, -15208, -14452, -12926, +-9831, -6081, -4355, -1834, -983, 253, 1632, 3876, 6919, 9361, 12188, 12635, 11732, 9727, 6046, 3464, +641, -320, 312, 893, 2941, 4041, 4444, 3934, 2364, 1209, 100, -594, 546, 997, 1453, 474, +-1790, -5193, -9746, -12876, -15184, -15016, -13821, -10536, -7085, -4962, -2436, -1613, -429, 755, 2655, 5722, +8258, 11198, 12199, 11816, 9974, 6633, 3491, 1036, -350, 52, 1491, 3372, 5547, 5950, 5905, 4235, +2557, 711, -477, -195, -269, 129, -409, -2315, -5374, -9541, -12910, -15626, -16239, -15050, -12276, -8430, +-5224, -2251, -526, 701, 1641, 3408, 5544, 8450, 10816, 12534, 12504, 10478, 7628, 3859, 1021, -543, +-743, 249, 2775, 4442, 5536, 5772, 4109, 2989, 558, 36, 233, 128, 1626, 783, -675, -3440, +-8013, -11612, -14979, -15958, -15263, -13066, -9009, -6125, -3117, -917, 127, 888, 2313, 4283, 6837, 9473, +11288, 11708, 10061, 7758, 4254, 1175, -656, -1000, 211, 2353, 5315, 6537, 7310, 6279, 4463, 2093, +462, 131, 269, 1185, 1215, 8, -3399, -7497, -12541, -16041, -17782, -17662, -14772, -11130, -7294, -4116, +-2029, -492, 546, 2223, 4768, 7768, 10779, 13096, 13651, 12455, 9775, 5869, 2674, 202, -599, 301, +1999, 4484, 6011, 6394, 5420, 3739, 1519, -108, -798, -357, 156, 512, -217, -3062, -6564, -11215, +-14577, -16368, -16622, -14135, -10692, -7133, -3726, -1534, 520, 1329, 2387, 5182, 7094, 10073, 11816, 12482, +11486, 8112, 5296, 1581, -1059, -1945, -1351, 161, 2280, 4569, 5523, 5524, 4563, 3106, 1807, 884, +1021, 1637, 1794, 1477, -655, -4218, -8703, -12969, -15746, -17301, -15906, -12970, -9317, -5672, -3072, -978, +-272, 670, 2688, 5207, 8360, 10841, 12740, 12264, 9993, 6908, 3610, 667, -498, 23, 1535, 3896, +5839, 6843, 6377, 5328, 3409, 1685, 634, 262, 781, 621, 493, -1557, -5100, -8837, -13507, -15760, +-17381, -16152, -12888, -9957, -5539, -2853, -1109, 485, 859, 3236, 5522, 8191, 10849, 11903, 11630, 9211, +6125, 2590, 235, -1554, -674, 404, 2286, 4854, 5440, 6790, 5607, 4788, 3749, 2009, 2090, 1332, +1341, 907, -1113, -3420, -7580, -11259, -14569, -16735, -16396, -14545, -11208, -7686, -3983, -1455, 178, 1474, +2862, 4879, 6828, 9353, 10816, 11151, 9761, 7250, 4354, 1398, -617, -982, 234, 1836, 4747, 6164, +7383, 6817, 5552, 4198, 2628, 1779, 1513, 1724, 1286, 97, -3046, -6751, -11306, -15068, -17219, -17457, +-15019, -12168, -8283, -4797, -2555, -555, 342, 2557, 4516, 7058, 9451, 10866, 11426, 9715, 7473, 4605, +1414, 113, -797, -20, 1574, 3503, 5209, 6205, 6561, 5980, 5213, 3883, 3104, 1984, 1199, 844, +-1101, -3120, -5949, -10274, -12796, -16036, -16778, -15499, -13641, -9469, -6520, -2592, -156, 1117, 3125, 4633, +6518, 7858, 9896, 10545, 9802, 8559, 5905, 3205, 433, -869, -676, 142, 2624, 5412, 7151, 8059, +7500, 6337, 4027, 2272, 1199, 594, 265, -260, -1986, -5289, -9081, -13464, -16813, -18324, -17612, -14588, +-10526, -6181, -2206, 54, 1547, 2537, 3724, 5475, 7482, 9633, 11380, 11365, 9783, 6984, 3396, 233, +-1690, -1427, -83, 2354, 5044, 7002, 7491, 7085, 5730, 4155, 2678, 1800, 1957, 1665, 522, -1540, +-4925, -9099, -13132, -16402, -17401, -16716, -14298, -10515, -7039, -3758, -1262, 316, 1821, 3629, 5861, 8110, +10091, 11021, 10966, 8790, 6187, 3314, 739, -430, -430, 868, 2630, 3952, 5830, 6391, 6014, 5844, +4651, 3623, 2417, 1562, 474, -827, -3259, -5542, -8984, -12344, -14531, -16588, -15989, -14389, -11195, -7380, +-4012, -492, 1644, 3636, 4872, 6484, 7788, 8582, 10041, 9955, 8915, 7272, 4738, 2170, 50, -995, +-425, 580, 2941, 5528, 6938, 7849, 7471, 5519, 3910, 1447, 389, -328, -1360, -1563, -4104, -6716, +-10564, -14612, -16890, -18116, -16309, -12465, -8244, -3406, 34, 2677, 3469, 3934, 5178, 6024, 7865, 9566, +10782, 10161, 7917, 5563, 1770, -957, -1748, -1247, 590, 3256, 6096, 7769, 7735, 7108, 5183, 2936, +1097, -54, -582, -1394, -2414, -4749, -7283, -11559, -14506, -16506, -17333, -14960, -11946, -7250, -3200, -46, +3316, 3914, 5357, 6206, 6795, 8452, 9014, 10008, 9145, 7287, 4901, 1758, -422, -1877, -1275, -71, +2054, 4880, 6347, 7476, 7001, 6022, 4404, 1833, 1135, -405, -1466, -2009, -4048, -5856, -9439, -12469, +-14631, -16468, -14985, -12707, -8736, -4341, -728, 2473, 3735, 4331, 4675, 5048, 5852, 7000, 8154, 8729, +7390, 5691, 3017, 200, -1246, -1390, 134, 2601, 5847, 8314, 9300, 9144, 7419, 4824, 2076, -283, +-1544, -2567, -3076, -4423, -6595, -9378, -13117, -15436, -17007, -16182, -13220, -9309, -3928, -129, 3317, 5319, +5761, 5742, 6135, 6973, 7927, 9091, 9599, 8603, 6137, 3079, 419, -1942, -2425, -970, 837, 3750, +5867, 7180, 7428, 5868, 4128, 1991, -457, -1369, -2655, -3205, -4156, -6176, -8272, -11223, -13410, -14436, +-14240, -11602, -8267, -3886, -105, 2921, 4757, 5076, 5092, 4785, 5258, 6031, 7061, 7594, 7278, 5427, +2862, 483, -1506, -2083, -873, 1364, 4644, 7408, 9267, 9667, 8178, 5616, 2910, -214, -2198, -3613, +-4773, -5238, -7108, -8821, -11048, -13915, -14349, -14680, -12431, -8740, -4719, 311, 3338, 6322, 7214, 7066, +6716, 6067, 6438, 6130, 6953, 6532, 5465, 3755, 834, -949, -3014, -2441, -1016, 1816, 5320, 7648, +8814, 7931, 6033, 2590, -453, -2584, -4460, -4534, -4971, -5428, -6642, -8921, -10786, -12479, -12813, -11048, +-8538, -4228, -22, 3671, 6346, 6677, 6692, 5529, 4839, 4448, 4684, 5313, 5105, 4797, 3013, 1229, +-861, -2470, -1617, -1026, 1739, 4729, 7090, 8488, 7943, 6845, 3895, 606, -1844, -3546, -5466, -5586, +-6213, -7490, -8348, -10293, -10975, -11491, -11006, -8283, -5185, -1268, 2853, 5621, 7323, 7270, 6782, 5577, +4670, 4264, 4506, 4864, 4424, 4219, 2377, 624, -1395, -1898, -1412, 420, 3263, 5757, 7389, 6605, +5740, 2576, -405, -2965, -5218, -5709, -6416, -5995, -6207, -6930, -7627, -8897, -9290, -9120, -7539, -4405, +-1050, 3066, 6196, 7423, 7948, 6969, 4888, 3653, 2776, 2718, 3542, 3918, 4496, 3105, 1530, -154, +-1631, -1433, -447, 2494, 4990, 6604, 7438, 5790, 3057, -265, -3285, -5636, -7294, -7059, -7172, -7089, +-6706, -7341, -7578, -8165, -7202, -5672, -3585, 200, 3066, 6222, 7390, 7807, 7027, 5049, 3634, 2369, +2180, 2201, 2509, 2723, 2177, 949, -594, -1409, -1678, -801, 1251, 3716, 5233, 5980, 5227, 2901, +245, -2789, -4513, -6430, -6540, -6518, -6697, -5703, -6201, -5674, -5616, -5368, -3506, -2611, 332, 2736, +4883, 6473, 6610, 6932, 4737, 3890, 2315, 1398, 1283, 934, 1816, 1603, 1356, 802, 209, -26, +173, 1307, 2727, 3992, 4603, 4350, 3023, 549, -2025, -4324, -6426, -7308, -7916, -7405, -6270, -5554, +-4588, -4056, -3159, -2634, -1515, 299, 2509, 4176, 5896, 6847, 6411, 5334, 3922, 2015, 509, 0, +-230, 377, 816, 1392, 1104, 697, 332, -62, 663, 1317, 2587, 3207, 3263, 2330, 491, -1432, +-3976, -5673, -7128, -7632, -7291, -6576, -5183, -3544, -2305, -958, 291, 670, 2208, 3033, 4395, 5144, +6227, 6535, 5611, 4772, 2740, 1075, -900, -1302, -1288, -810, 405, 733, 995, 262, -317, -219, +-597, 307, 1464, 1191, 1542, 297, -1708, -3489, -5796, -6121, -7160, -6333, -4316, -3437, -989, 511, +1561, 2473, 2763, 3450, 3923, 4156, 4591, 4942, 4504, 3623, 2571, 535, -747, -2476, -3110, -3004, +-2882, -1004, -530, 509, 1307, 720, 1336, 1016, 787, 1602, 1146, 1402, 750, -419, -1501, -3517, +-4489, -5668, -6128, -5582, -4434, -2799, -284, 1587, 3072, 4676, 4533, 5146, 4891, 4234, 4555, 4031, +3657, 3256, 1540, 303, -1537, -3558, -4011, -4450, -3561, -2141, -1203, 243, 79, 265, -139, -861, +-1058, -910, -514, -548, 97, -890, -1248, -2343, -3815, -3466, -3875, -2406, -536, 1732, 4290, 5449, +6576, 6494, 5389, 4099, 2809, 1959, 1326, 1363, 1207, 536, -748, -2518, -4029, -5612, -5594, -4816, +-3241, -1049, 866, 2090, 1766, 1443, -54, -1138, -1744, -1496, -982, -424, -137, -234, -1253, -2671, +-3122, -3735, -2836, -1205, 1078, 3794, 5664, 6787, 7144, 6761, 5315, 4350, 2623, 1782, 895, 98, +47, -1263, -2121, -3472, -4262, -4918, -4908, -4181, -2873, -1108, -70, 763, 572, -890, -1753, -3457, +-3813, -3151, -2866, -740, -433, 125, 56, -851, -651, -527, 829, 3331, 6061, 8348, 10158, 10045, +9114, 7017, 3633, 2063, -539, -1703, -1944, -2873, -3118, -4627, -5696, -6385, -7468, -6876, -5479, -3517, +-892, 1070, 2567, 2527, 1600, -70, -1719, -2946, -3241, -2475, -1640, 47, 318, 524, 223, -836, +-585, -559, 880, 3283, 5596, 8384, 9761, 10285, 9148, 5765, 3561, 279, -2149, -2393, -2896, -2083, +-2478, -3161, -4137, -6479, -7579, -7441, -6552, -3925, -1361, 680, 1795, 415, -1065, -3574, -5311, -5659, +-4708, -2330, -178, 2028, 2625, 2917, 2459, 1965, 2834, 3849, 6278, 8655, 10505, 12093, 11738, 9872, +6966, 3313, -51, -3181, -4828, -5679, -5984, -6389, -6765, -7249, -8543, -8605, -8335, -7039, -4354, -1961, +744, 2129, 2296, 1590, -927, -1947, -3090, -3338, -1428, -236, 1986, 2655, 3214, 3681, 2431, 3144, +3205, 4602, 6188, 7971, 10318, 10298, 9960, 7342, 4475, 540, -3147, -4918, -6356, -6566, -6033, -5745, +-5410, -6498, -7153, -7274, -7617, -5834, -3852, -1028, 1052, 1722, 1702, -793, -3038, -4359, -5314, -3757, +-1703, 1050, 3396, 4424, 5155, 4868, 4433, 4986, 6155, 7865, 10255, 11946, 12810, 11404, 8365, 4811, +-175, -3933, -6648, -7994, -8343, -8222, -7659, -8045, -8375, -9027, -8699, -8065, -6062, -3173, -715, 2058, +2740, 2624, 1084, -1074, -2621, -3289, -2769, -1014, 1007, 2926, 4840, 5115, 5471, 5354, 5585, 6318, +7182, 9191, 10410, 11428, 10021, 7948, 4523, -163, -3377, -6680, -8408, -9198, -9114, -8558, -8438, -8107, +-8047, -7724, -6712, -5234, -3207, -1259, 602, 1538, 1344, 729, -955, -2353, -3036, -3209, -2178, -592, +1389, 3731, 4889, 6288, 7292, 7816, 8687, 9344, 10531, 11157, 11539, 11011, 8896, 5911, 2018, -1829, +-5529, -8306, -9993, -11065, -11306, -11171, -10256, -9584, -8994, -7301, -6166, -4476, -2547, -834, 621, 937, +1744, 540, -250, -1181, -1962, -1195, -914, 1340, 3148, 5028, 6656, 8169, 9009, 9291, 10001, 10238, +10355, 10141, 9599, 8117, 5420, 2322, -784, -4593, -7864, -9900, -11463, -12237, -12041, -10952, -9348, -8367, +-6682, -5204, -4327, -3397, -1717, -1070, 123, 958, 1479, 1068, 42, -638, -1351, -1456, -414, 1913, +3992, 7308, 9215, 10807, 11295, 10924, 11102, 10025, 10068, 9371, 8037, 6518, 3390, 534, -3488, -7073, +-9968, -12068, -12854, -12925, -11601, -9789, -8335, -6508, -5452, -4574, -4128, -3762, -2570, -1734, -241, 641, +967, 645, -461, -1102, -1320, -1205, 1266, 4022, 6898, 10187, 11852, 13328, 13090, 12602, 12081, 10585, +9291, 7336, 5393, 2760, -706, -3769, -7037, -10571, -12567, -14399, -14400, -13842, -12324, -9460, -7665, -5261, +-3794, -2795, -2207, -1903, -932, 84, 1263, 1865, 2444, 1855, 1055, 32, -289, 527, 2723, 5694, +9315, 12280, 13958, 14771, 13691, 12445, 10028, 7807, 6000, 3532, 1545, -343, -3391, -5955, -9304, -12067, +-14140, -15983, -14376, -13376, -10338, -6934, -4597, -2470, -2448, -1776, -2422, -1956, -989, 487, 1945, 2029, +2815, 1207, -20, -438, -226, 1659, 4807, 8490, 12291, 14410, 15611, 15207, 13042, 10972, 7661, 4994, +2555, 297, -1516, -3746, -6293, -8976, -11983, -14428, -15350, -15654, -13854, -10803, -7448, -3734, -1346, 278, +286, -65, -288, 27, 786, 2034, 3872, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 730, 1485, 1735, 1281, -3241, 8679, -9925, 4410, +1116, -2742, 7086, -12593, 10240, -6220, -2219, -1075, -11500, -9400, -1658, -6305, -4384, -592, -10941, -10616, +434, -12984, -2851, -738, -7438, 6641, 132, -205, -464, -601, 16974, 2238, -15790, 12617, 8624, 17584, +-7847, 67, 22052, 6906, -576, 13886, 3838, -1507, 6392, 4012, 37, 3361, -2406, 2140, 21360, -27437, +6921, 20131, -9025, -8933, -7784, 7444, -1838, -21411, -2358, -6372, 7441, 4376, -27437, -3913, 2876, -25893, +2661, -14420, -12604, -5807, 10998, -3652, -27437, -2746, -1611, 11369, -24147, -12902, -1545, -14367, -5945, 7753, +-27437, -10225, -7895, -7258, -8967, -14261, 3496, -6596, -19501, -14047, 208, 9310, -19661, -18104, 1333, -880, +-5440, -10791, -13634, -698, -2729, 5792, -13727, -9864, 11440, -5336, -3422, 5635, 5868, 432, 8548, 1286, +13311, 6222, 13423, 8237, 13763, 15541, 13146, 16905, 14883, 17610, 22297, 6286, 21814, 17293, 21020, 20867, +19923, 15320, 21197, 18566, 19027, 8083, 10907, 30944, 11229, 14931, 16931, 20677, 15951, 15536, 19752, 13551, +23896, 9233, 16842, 26427, 9473, 18520, 15008, 13924, 13191, 22887, 6005, 15782, 8821, 19272, 1386, 12307, +5156, 2532, 8858, 2672, -1705, 1746, -6318, -5502, -3238, -4434, -14141, -5414, -12367, -4018, -16738, -16542, +-8939, -11237, -18957, -11550, -12342, -23173, -9306, -19490, -13076, -17725, -14691, -21653, -11241, -25461, -9696, -16625, +-23077, -14917, -15959, -20841, -16320, -18358, -19243, -17417, -14117, -24408, -14500, -17870, -16601, -20947, -19062, -6769, +-27437, -10506, -12498, -22519, -15002, -15579, -8060, -15654, -16561, -298, -20857, 5825, -8864, -11371, 397, -1247, +-2485, -4441, 3906, 5393, -1832, -3083, 22147, -1296, 12716, 8977, 5295, 23088, 5130, 22441, 6996, 13114, +22176, 20238, 8881, 24926, 15506, 18071, 23173, 15135, 21994, 21866, 18549, 21866, 15950, 19455, 18555, 24857, +17466, 17096, 17635, 12777, 23978, 24431, 1691, 21893, 8253, 15905, 10575, 388, 30779, -10344, 5551, 5914, +2673, 17377, -7607, -1174, -865, -2206, 9933, -11836, -5667, -5393, -1253, -261, -13654, -4301, -9862, -3683, +-11508, -11638, -9026, -9950, -13644, -8133, -16052, -12570, -12016, -11952, -16411, -15804, -14276, -13112, -17061, -15264, +-13811, -18334, -13909, -15397, -9544, -22589, -10488, -18712, -16996, -10974, -15360, -22314, -9344, -17106, -9484, -16283, +-24145, -60, -11820, -21484, -5395, -1825, -18420, 910, -15371, 4800, 3861, -6651, 3021, 998, 7110, -3241, +7335, 6456, -5900, 15134, 1476, 795, 12281, -336, 16780, -1004, 15235, 9261, 3826, 24845, 913, 12543, +12637, 12458, 15851, 10830, 18291, 15409, 16648, 17438, 5268, 17219, 23458, 8575, 22098, 14280, 16987, 19544, +10191, 19243, 21080, 14801, 9113, 20880, 12122, 23894, 6808, 9732, 13874, 17677, 10682, 3278, 6128, 20255, +-1229, 1066, 8995, 14568, -10836, 6795, 10020, -12104, 12886, -891, -14205, 197, 279, 491, -4208, -11533, +-5227, -8778, -9576, -4092, -10553, -16314, -3340, -15239, -8171, -17704, -11099, -11102, -19729, -9401, -14254, -18088, +-13288, -22023, -10231, -17695, -19123, -11830, -16075, -18673, -11446, -17433, -8834, -10989, -20124, -9430, -5653, -2496, +-16025, -23245, 16489, -14450, -7032, -8783, -2846, 3562, -1812, -12077, 8517, -8757, -5326, 664, 9273, -13721, +9068, -8813, -1422, 11470, -6464, 10392, -14316, 20955, -5768, 4420, 4829, -1630, 17946, -704, 8820, 6384, +822, 23190, 2316, 8614, 10299, 17063, 10772, 6545, 18468, 6632, 16404, 19289, 5403, 17336, 14275, 11209, +16775, 6075, 12376, 14421, 9053, 14060, 6674, 5361, 14157, -57, 1181, 9041, -231, -795, 10627, -5525, +-4383, -2573, -3742, 6339, -16223, 1740, -11120, -6403, -10647, -8153, -6329, -9972, -12557, -9352, -17533, 2149, +-17004, -14829, -11022, -17309, -8338, -11570, -16564, -11706, -16294, -18647, -10695, -19488, -9159, -15689, -21249, -17070, +-8444, -21837, -2496, -23452, -17265, -10786, -8920, -13362, -12203, -16828, -13454, -620, -17955, -10155, 555, -13472, +-16601, 6431, -10961, -9408, 3109, -12717, 3053, -11310, 1776, 8232, -7908, 2645, -7000, 16685, -6836, -1057, +11074, 5608, 966, -3955, 9043, 14452, -13903, 14396, 10300, -3064, 15091, -6527, 8118, 16127, -6091, 17972, +-4174, 4544, 16268, -1460, 6216, 7633, 1598, 9646, 10722, -2824, 8813, 9880, -6314, 22711, 2985, 10462, +5567, 3062, 12673, 8585, 8649, 6501, 9039, 5322, 12189, -1141, 16815, -4178, 12725, 473, -1975, 9122, +8430, -169, -4785, 2766, 912, -3912, 6112, -2892, -13846, 1485, -1485, -7267, -6258, -10554, -6915, 31, +-21306, -8961, -3196, -14185, -6818, -18950, -11509, -6735, -11346, -22216, -5262, -16519, -12222, -15606, -2592, -26337, +-6888, -13150, -11928, -20502, -1344, -13112, -16777, -10992, -20443, 9185, -27437, -11658, 8785, -17992, -24213, 14864, +-12005, -17609, 1185, -13030, 5893, -13030, -11988, 6298, 1513, -23343, 15576, -9784, -3344, 1680, -4065, 4351, +-4256, -4283, 4832, -8223, 5033, 9162, -10371, 6668, -6253, 10226, -3067, 9590, 6121, -4635, 7079, 14377, +-2192, -2572, 14029, 8672, -3988, 15012, -1387, 12075, 7291, 1557, 12703, -6166, 13839, 7742, 13921, -50, +3537, 2111, 23249, -2643, 7631, 5816, 13100, 2937, -4223, 11149, 17750, -4109, 5359, 6958, -4049, 21072, +-6686, -2831, 11713, -12580, 12067, -110, -6308, -4093, 13092, -16580, 5690, -9532, -8541, 16011, -27437, -1330, +-5099, 2686, -21539, 2043, -7741, -17318, -4952, -14557, -6564, -12341, -216, -27437, -2936, -5364, -15637, -12302, +-14131, -9137, -12825, -8815, -13251, -6091, -16911, -5514, -11546, -14787, -4054, -14209, -4570, -6562, -14558, -12651, +-2753, -7881, -13330, -10482, -929, -4032, -6616, -14469, -3143, 1394, -11539, 5484, -8839, -6690, 4447, -2318, +-8748, 5436, -640, -5916, 2193, -3862, -2882, 9513, -491, -5108, 106, -2617, 25952, -20447, -1284, 15963, +-9021, 5212, 7559, -723, 4136, 6725, 590, 14109, -1713, 4127, 16189, 1596, -8110, 19521, 10900, 5775, +538, 15089, 8892, 12623, 4353, 20873, -158, 7476, 13842, 15311, -76, 17105, 7748, 7112, 13433, 6487, +12909, -6005, 15786, 7365, 1471, 5723, 6750, -7145, 14665, 1401, -1021, 151, -818, 9416, -7227, -8434, +7157, -9356, 601, -11191, -1671, -12406, 766, -13977, -11136, -1170, -19877, 2890, -14076, -12510, -14010, -5577, +-4055, -25211, -8437, -6332, -15029, -10609, -7750, -15441, -19299, -5639, -16509, -13093, -5722, -15857, -2255, -19485, +-8267, -14939, -7181, -3995, -10632, -13307, -10654, -316, -6904, -11945, -6131, -6624, -1525, -6374, -633, -21785, +12261, -7658, -566, -10900, 12167, -6986, -186, -2434, -1019, 9196, 2541, -3714, -1802, 9229, -1764, 8342, +1843, -2643, 7830, 7226, -12436, 17236, 6858, 106, 4276, -1424, 16072, 470, 758, 5485, 10831, -2776, +7430, 11482, -111, 2569, 3291, 13221, 9307, -2672, 8668, 8455, 6613, 6217, 4945, 7194, 17137, -6472, +8270, 13934, -2441, 9827, 3484, 11839, -1753, 6062, 7712, 1049, 1230, 10988, 3113, -7771, 8089, 6008, +4472, -7772, -6998, 19028, -3209, -8078, 5610, 2186, 2642, -16218, 16576, -13314, -2875, 12061, -19302, 9095, +-14141, 2028, -12604, -4422, 2843, -20637, -468, -13986, -2633, -7301, -8826, -9704, -11710, -7382, -5877, -13756, +-7704, -14821, -3237, -13871, -7786, -8920, -9732, -7118, -11051, -15481, -1284, -1780, -20543, 1876, -12612, 6176, +-17601, -6396, -9636, 5074, -737, -10632, -1284, -4765, -1463, -4221, 1712, 1501, -17101, 6313, 6455, -9273, +-373, -5505, -1150, -4296, 16577, -10271, -6773, 5900, 993, 954, -2677, 4346, -4484, 4890, -593, 655, +6332, -4866, 7359, -5128, 1903, 16228, -9119, 5707, 6732, -3583, 12600, 4837, -5337, 7879, 12025, 1386, +-3158, 19921, -1018, 5205, 4875, 13234, 3575, 1636, 7056, 1803, 16333, 5115, -5238, 15278, 2974, 609, +9145, 1658, 8661, -966, 5844, 3485, -3222, 6899, 7734, -6372, -3187, 8288, -6429, 649, 1360, -7743, +2318, -5732, -2989, 1185, -9802, -12507, 4853, -4307, -13063, -7639, -3174, -9015, -12071, -1581, -7575, -21057, +-2848, -11849, -1524, -10692, -15556, -3191, -9419, -11272, -6333, -3905, -20360, 6005, -9151, -17092, -4034, -4128, +-149, -15196, -1326, -5975, -8080, 4085, -9642, -11514, 11359, -5666, -8850, 113, -4903, 1181, -10562, 524, +10597, -20162, 7274, 312, -15458, 8846, -4430, -3223, -1718, -7335, -4397, 12453, -21928, 9648, -11939, 3203, +4132, -8988, -2627, 2660, 5388, -9599, -538, 10123, -6029, 4708, 37, -5293, 10646, -1663, 4144, 2688, +2540, 2322, -1510, 1950, 9611, 217, 686, -2457, 7813, 7205, 968, -4881, 8067, 4621, 11487, -5020, +603, 11405, 6176, 2573, -344, 895, 8981, -808, 6969, -2622, 5329, -5734, 6001, 6536, -3772, -3592, +7501, -1009, -13491, 19650, -5213, -10068, 7436, -8480, 1502, 5436, -9104, 1428, -8741, -113, -1561, -2817, +871, -7951, -12683, 6702, -6002, -2276, -6011, -16250, 583, 3101, -14755, -4264, -4928, -8372, -5247, 1643, +-12013, -11584, -3046, -5007, -13636, 2100, -12123, -10228, 1954, -11850, -10153, 1724, -12432, -1107, -6399, -9170, +1462, -6781, -19228, 8640, -3056, -12033, -1883, -5171, -304, -8518, 1399, -8328, 277, -1942, -2143, -3388, +-3698, -3943, 6852, -4503, -1252, -10, -5910, 8284, -7253, 8840, -2691, -5789, 12628, -6487, 4320, 2413, +-5186, 4919, 9892, -957, -749, 10068, -3223, 9625, 1377, -182, 15596, -6043, 7612, 5879, 4834, 6814, +-1372, 1334, 11835, 607, 4892, 1128, 7363, 8490, -1028, 5189, 4339, 7907, -720, 2615, 3411, 998, +5329, 7045, -6181, 7109, 1126, 723, -4664, 5284, 899, -4368, 3105, -1968, -1410, -5471, 5709, -5779, +2844, -3912, -1871, -8106, 4531, -3818, -10149, -2164, 1452, -10563, -466, -8137, -1789, -7528, -1273, -11102, +-4174, -2867, -10802, -2448, -8266, -521, -11524, -2241, -12554, -5882, 1701, -12523, -8903, -630, -9088, -7692, +-6380, -8018, -1041, -9283, -9491, -3333, -4008, -6100, -9092, -4391, 1279, -9018, -9665, -3732, -5233, -3257, +-672, -7784, -11012, 2595, -6161, -4708, 643, -12210, 530, -7880, -1390, -839, -9741, 1202, -2478, -5703, +1160, -1150, -4660, 2779, -8180, 7691, 914, -4310, 4878, -1263, -1568, 2166, 8266, -2527, 478, 5542, +9419, -5293, 2171, 11145, -748, 3504, 8512, 1705, 5055, 9234, 1773, 992, 11729, 2306, 876, 9925, +5604, 2512, -642, 7004, 9447, -1524, 4577, 6992, 303, 4004, 4325, 3744, 4085, 994, 3493, 1128, +12315, -5743, 5566, 1140, -315, 3316, 6998, -5568, -1076, -2943, 8792, -3710, -2807, 557, -11072, 12027, +-12055, 478, 695, -8253, -4417, 1800, -8592, -5613, 1208, -8111, -4401, -5192, -9017, -1476, -4397, -13193, +-1022, -7192, -7440, -10091, -5974, -7437, -4708, -8278, -4480, -4632, -12307, -530, -8383, -1760, -8395, -8232, +-1091, -7377, -5800, -4906, -5586, -5120, -5138, -6173, -2288, -6869, -8594, 4321, -6903, -2834, -12083, 2564, +-8439, -846, -3742, -6029, -605, -3106, -1609, -3889, -2494, 871, -7907, 911, 2262, -6298, 9503, -10510, +2475, -4136, 7374, -2935, -627, 4182, -969, 3842, 490, -762, 9732, 1097, -2964, 6513, 7989, -1441, +5198, 3097, 5336, 9929, -1366, 9962, 4127, 4140, 3609, 5415, 6791, 5431, 4605, -790, 8593, 5220, +150, 9497, 2875, -3314, 10490, 5531, -4651, 8237, 4224, 819, 949, 2116, 3390, 3320, -2982, 2310, +2849, 1555, -447, -1167, 1086, 1802, -4389, 3945, -939, -6106, 3693, -5183, 1067, -3641, -1252, -2609, +-4687, -5742, 780, -6983, 246, -2773, -8427, -6375, -5517, -491, -5326, -9191, -7647, 1284, -10209, -2939, +-8860, -6986, -5221, -7284, -3127, -5821, -9575, -5117, -290, -11518, -946, -12683, 235, 477, -14454, 3149, +-8339, -5066, -996, -4221, -2239, -4029, -4000, -3429, -1225, -3882, 3320, -11819, 939, 1208, -5132, 2636, +-1220, -1421, 1614, -2567, -635, 5668, -3671, 261, 3001, 432, 4194, -818, 10483, -12006, 18120, -6628, +4579, 6488, -315, 8509, -16, 6568, 5647, 2030, 2142, 7717, -356, 10790, -261, 5462, 8413, 1120, +3340, 5428, 4327, 6897, -369, -2170, 7658, 5928, -2637, 3797, -974, 4764, 433, 3737, -4463, 5929, +3566, -4991, 5220, 857, -1926, 242, 3286, -6323, 10261, -5326, -5906, 4822, -3240, 3479, -2535, -4963, +-1765, 3351, -4237, -4122, -2088, -1342, -463, -4019, -4620, -5652, 2604, -11612, 917, -2512, -8219, 1555, +-9825, -1287, -1629, -10020, 2312, -6768, -7046, 3846, -16138, 1533, -572, -10085, -3462, -3026, -3485, -9363, +-1343, -558, -8327, -6622, -1497, -1515, -8447, 606, -8664, 153, -3899, -3801, 1821, -12009, 903, 123, +-4579, -1148, -1272, -5359, -3447, 4535, -4164, -3752, -730, -4, -948, -3533, 2672, 354, -3711, 1831, +2739, -7198, 6300, 1375, -7096, 8775, -11456, 10039, -1304, -6029, 9260, -2824, 1584, 486, -3916, 3706, +2519, -4599, 8137, 856, -1510, 1442, 5098, -1158, 5700, 234, 2065, 1920, 2830, 6460, -1238, 2753, +5259, 1290, 1163, 7061, -1914, 2851, 2998, 1647, 3930, -3013, 4288, 4476, -17, -567, 4770, -3029, +6681, -1038, -1015, 4581, 173, -3979, 4915, -1168, 195, 655, -1990, 4489, -7059, 3962, -2752, -3688, +2325, -4956, -3313, 978, -4660, -3335, 1089, -8519, -1707, -4002, -3040, -5283, -6094, -2129, -5891, -2831, +-6271, -7649, -2899, -3339, -7002, -3745, -3882, -3130, -6450, -7066, -1674, -3793, -3117, -7318, -4311, -1889, +-4552, -6006, -1633, -3986, -5539, -151, -4789, -7408, 3946, -4313, -5730, -1034, -855, -4835, 3102, -4386, +-5864, 6953, -8117, 790, -2065, -2898, -426, 3751, -7572, 2809, -1107, 2489, -2917, -4406, 6146, -1380, +-1125, 419, 1342, 1535, 209, -854, 3140, 3000, -1030, 72, 2873, 3184, 431, 637, 6380, -930, +1316, 2664, 1544, 3392, 2802, 392, 1163, 3592, 2907, 2180, 173, 693, 6036, -700, 1241, 3557, +1443, 3123, -2022, 6234, -3732, 4298, -40, 717, 1455, 2507, -2182, -1839, 2091, -1295, 1094, -451, +2461, -1634, -95, -479, -575, 990, 332, -3330, 681, -71, -2987, -1415, -1361, -533, -3774, -1632, +-2394, 1113, -4310, 105, -4996, 937, -5340, -1589, 227, -9438, 4953, -8800, 425, 118, -4232, -4881, +-3937, 3253, -7744, -2339, -4957, -1607, -3467, -4001, -3503, -1555, -5703, -3527, 1230, -6119, -2142, 165, +-8829, 950, -2002, -1053, -630, -7384, -71, 1487, -2102, -1837, -1230, -2286, 535, -1683, 2798, -2409, +-4094, 4655, 1798, -3283, 2915, -845, 901, 362, 1215, 6980, -5072, 4559, 1335, 1114, 5198, -4011, +6490, 2081, 456, 152, 6502, -1601, 3448, 4210, -673, 5008, 1582, 526, 890, 8459, -3019, 1528, +5669, -532, 3291, 1352, 4554, -2124, 4920, 3630, 1909, -1151, 3882, 5189, 3032, -908, 2596, 8765, +-4874, 9218, -608, 3802, 2632, 527, 4881, 3438, -2101, 3955, 1726, 2868, -785, -3637, 9781, -4323, +51, 4018, -2132, 648, -1477, 594, -752, 3038, -7331, 2789, 2626, -4726, 1501, -3395, 2372, -3234, +972, -2687, -818, 564, -2186, -571, -1244, -1993, 2463, -5928, 3105, -298, -3237, -16, -2962, 755, +-1018, -1210, 130, -1555, -1844, 49, -1453, 393, -681, -615, 580, 2203, -3183, -1147, 3185, 1733, +-1862, 1029, -417, 1226, 1684, -3282, 1605, 1902, -2121, -1125, 3727, -1299, 2248, -5176, 5742, 67, +-4645, 3634, 2279, -1252, 1662, 94, -1148, 3019, 1734, 4347, -6218, 4455, -87, 2399, 3585, -1519, +634, 2817, 1093, -191, 4165, -799, 2857, 581, -1280, 4022, 3676, -3248, 4699, 1758, 1522, 2571, +3045, 613, -1057, 6949, 3403, -1607, 4181, 585, 2005, 5996, -1812, 2433, 3522, -236, 3811, 2281, +-120, 3545, -1999, 4182, 3608, 1058, -4312, 1654, 5174, -3041, 3009, -4716, 4469, -417, -1652, -2577, +2856, 228, -2113, -2679, 2257, -169, -1957, 673, -499, -3550, 3478, 835, -4796, 1438, 1808, -1370, +-2648, 2494, 1168, -4365, -731, 6299, -7072, 1633, -377, 2734, -4912, 55, 2692, -84, -6055, 5184, +8, -5029, 6410, -5893, 1331, 3005, -4362, 4147, -3989, 790, -656, 965, 2748, -4031, -2537, 3823, +314, -3725, 1483, 1013, -3317, 2176, -4052, 4504, -1719, -583, 401, -722, -22, 537, 1488, -1140, +464, 1263, -2422, 2732, 1105, -2844, 3731, -4055, 4641, 14, -2518, 1826, 3570, -4035, 4072, 3010, +-4187, 4611, 115, 1128, 4974, -2900, 884, 2936, 2269, 1936, 313, 1238, 1711, 4384, 2941, -1462, +-166, 4163, 4303, 1485, -1746, 6730, 871, 2168, 2052, 826, 6155, -2265, 2050, 5716, -2542, 1599, +5346, -1478, 2076, 1836, -564, 2077, 983, 2188, 350, -606, 1890, -88, -1550, 886, 3416, -1756, +-2093, 988, 1603, -1265, 1336, -1877, -1120, 2003, 698, -2261, -2968, 3522, 1355, -2760, -1177, 960, +-2725, -364, 1967, -5552, 2845, -3393, -1178, 672, -1272, -2963, -1940, 581, -4999, 1595, -2256, -5428, +1385, -596, -3285, -2210, -4093, 2137, -4549, 153, -2397, -275, -2796, -1655, 1722, -3486, -1852, 1884, +-2505, -2592, 1377, 658, 1562, -2760, -653, 2281, -1298, 3973, -2125, 407, 4743, -2425, 2491, 1916, +1715, 1519, 1180, 1624, 4779, -2331, 4459, 3990, -305, 3451, 551, 4543, -17, 3844, 3537, 1965, +4631, -195, 4476, 4028, 2155, 5148, 4916, 347, 1307, 7934, 1822, 2156, 4227, -392, 7217, -378, +3229, 3727, 1560, 4971, -2530, 5054, 2141, 56, 3668, -212, 3064, 1336, 1578, -1227, 2229, -379, +1683, 2241, -3177, 1042, -1592, 5620, -4984, 1999, -2844, -20, 4465, -8042, 3887, 703, -4331, 4194, +-4882, 251, 472, -1398, 1077, -3481, 682, 1522, -2618, -1706, 1107, 823, -737, -2727, -379, 278, +-262, -2657, -1196, 3183, -6289, 1546, -517, -5534, 3631, -3901, -1689, -486, -847, -3432, 876, -363, +-2398, -1422, -2132, -859, 374, -1303, -1051, -1312, -3072, 2397, -786, -1447, -463, 550, -1428, 804, +-317, -1227, 1372, 1187, -465, -1443, 2381, 972, -716, 145, 4178, -3471, 3452, 1378, -444, 3147, +-2798, 6111, 58, -243, 3253, 789, 2106, 1199, 607, 5532, 582, -2043, 8740, -1330, -39, 5299, +1407, 3379, 369, 1397, 3847, 1453, -715, 5577, 104, -1480, 4621, -1838, 5116, -1724, 1898, -605, +1577, -883, 1588, 1698, -1744, 407, 1373, -880, -11, -111, -120, 1028, 1061, -3371, 2461, -98, +541, -844, -1497, 5419, -5598, 865, 2522, -3418, 945, -242, 1751, -21, -3956, 2459, -964, 3856, +-3672, 257, 1753, -1931, 1037, 1483, -1414, -1987, 3626, -2179, 167, 3326, -5217, 4274, -2369, -553, +-446, 171, -343, -781, 1409, -1754, 479, 775, -1379, 643, 254, -1687, 5086, -5392, 3227, -3222, +2909, 1040, -2936, 4184, -2019, -979, 2303, 2692, -1507, 1138, 767, 2015, 1921, 486, 432, 3834, +53, 278, 5336, -470, 2443, -149, 1784, 2136, 162, 3606, 763, 441, -551, 4333, 2127, -2751, +4331, 1123, 2577, 1682, -2029, 3157, 2618, 2137, 134, 1230, 2805, 1089, 365, 4075, -10, 2086, +1435, 2079, -970, 1896, 3732, -3517, 5274, -607, 719, 1267, -349, 1911, -260, 171, 957, -289, +1396, 422, -1262, 2157, -1078, 918, -1358, 1277, 1577, -2333, 2086, -2892, 3700, 165, 327, -2345, +2544, 1773, -1646, 2436, -1706, 3191, -720, 2404, -859, 1618, 392, 3660, -901, 1793, 1871, -139, +2283, -820, 1754, 785, 270, 1485, 938, 1108, 65, -909, 2972, 558, -446, 442, 450, 1772, +-1840, 915, 2011, -1844, 2318, -525, -13, 2195, 1213, -2544, 3789, -702, 1245, 1573, -89, 1908, +2500, -2808, 3916, 1920, -1217, 1870, 4309, -3213, 2847, 1903, 996, 2735, 896, 673, 1876, 2540, +-663, 3182, 1332, 240, 991, 3178, 966, -184, 1657, 3399, 342, -836, 2706, 1921, -605, 952, +389, 2171, -1491, 3523, 585, -791, 1660, 1364, 1029, 957, 306, 1691, 1450, 1926, 2412, -1104, +4703, 432, -728, 6683, -301, -588, 3998, 3243, -350, 2981, 1702, 1412, 4163, -301, 2915, 2899, +-176, 3412, 1254, 3078, 862, 1648, 998, 3661, 261, 3020, 367, 2581, 2079, 304, 153, 1112, +2138, -5, 2087, -1162, 1410, 2398, 60, 37, -105, 1596, 280, 689, 1006, -386, 418, 1443, +786, -855, 690, 261, 892, -110, -16, 796, 105, -558, 1471, -584, 1220, -160, -512, 447, +1093, 847, -575, 1248, -427, 554, 3759, -1900, 2139, 2519, -395, 2235, 1671, 2054, 1333, 2596, +1835, 369, 1739, 3590, 2682, 388, 826, 4655, 297, 1172, 3023, 948, 2226, 2292, 1175, 1102, +1864, -965, 3672, -57, 738, 701, 1476, 1169, 130, 281, 686, 291, -532, 1727, 41, -950, +1426, 814, -344, 2607, -1988, 1491, 1872, -1102, 1508, 402, 1218, 859, -61, 2033, 38, 771, +1460, -315, 2945, -2458, 2774, 722, -56, 139, 374, 2185, -1119, -81, 3135, -1140, 232, 2302, +-1665, 1342, 1172, -10, 849, 1763, -2092, 1358, 2523, -702, -5, 1565, 191, -932, 844, 3184, +-2253, 13, 60, 1857, 143, 1036, -671, -894, 2107, 987, -1570, 914, 547, -282, -532, 2824, +-1792, 1071, 305, 483, 1889, -1764, 3007, -993, 187, 1566, 209, 872, 2855, -1323, 514, 2577, +1100, -120, 633, 2168, 1363, 695, 1021, 92, 2675, 1330, -1180, 4142, -1193, 1224, 2098, 1459, +438, 547, 2692, 66, 1894, 995, -28, 2391, 2179, -990, 2705, 1578, -969, 4217, 1129, 43, +2562, 1675, 1423, 1877, -67, 2620, 2550, -305, 2196, 3111, 445, 2500, 817, 2176, 1227, 3784, +863, -514, 3515, 986, 2541, 1193, 1724, 2026, 1218, 1284, 1556, 1793, -304, 2251, 1397, 1999, +1473, -60, 2857, 722, 1923, 1806, 1153, 1117, 1642, 1653, 533, 1611, 1242, 2047, 153, 2041, +305, 30, 1409, 1021, 484, 862, 266, 814, 1453, -1641, 2103, 588, 50, 1655, -346, 998, +1660, -1162, 1861, 864, 185, 1150, 1305, 777, 1835, -49, 1859, 1423, -40, 2184, 838, 2910, +706, -62, 3131, 2242, 1376, 1657, 746, 4239, 67, 1971, 1775, 1551, 1500, 2828, 895, 2439, +1912, 193, 1978, 2570, 1588, -353, 3252, 1681, -175, 1346, 1916, 1360, 268, 1382, 1184, 224, +1587, -44, 2107, 1523, -566, 2113, 675, 1703, 477, 1414, 1975, 514, 1305, 2039, 853, 1220, +1419, 2024, 1056, 979, 2023, 1647, 2708, -887, 3555, 1455, 701, 2696, 2422, -853, 2816, 1476, +2020, 1575, 1379, 1299, 1881, 1235, 1645, 1412, 281, 2889, -332, 2086, -272, 2048, 1715, -324, +1223, 2177, 849, 401, 1406, 1816, 1032, 713, 978, 1938, 838, 663, 413, 2092, 821, 56, +1205, 1314, 480, 391, 481, 920, 1590, -191, 1306, 820, 555, -104, 2266, -12, 1312, 1012, +528, 746, 1664, 849, 978, 1238, 671, 2375, 772, 397, 2767, -143, 2230, 2400, -291, 3066, +1486, 1092, 2371, 1408, 1368, 2464, 1130, 3108, 495, 1729, 2073, 2233, 500, 1889, 2521, 643, +1931, 1538, 1431, 2313, 424, 1341, 2671, -228, 2349, 810, 1416, 2408, -262, 1884, 1611, 785, +2137, 512, 1120, 2056, -159, 2350, 773, 1781, 1764, 1052, 486, 2843, 319, 1450, 2941, 294, +2386, 1201, 1784, 1126, 2607, 1074, 1843, 1599, 1855, 1020, 2057, 2084, 517, 1791, 1272, 1954, +1252, 866, 2039, 516, 2033, 1238, 877, 831, 727, 1599, 1114, 1138, 640, 842, 1343, 897, +673, 1038, 1128, 1249, 381, 1935, 666, 890, 1320, 719, 1162, 1637, 1654, 1124, 1373, 1303, +1361, 1656, 2069, 959, 1371, 2114, 1458, 1407, 1692, 1968, 1755, 1062, 1996, 2056, 1377, 1920, +1754, 1995, 1196, 2219, 1815, 1542, 1694, 1917, 1795, 1316, 2350, 960, 1803, 1584, 1462, 2269, +501, 1678, 2350, 624, 2118, 1168, 546, 2634, 1419, 528, 1683, 1156, 1801, 1412, 1105, 2157, +930, 1948, 975, 1597, 1426, 844, 2107, 1335, 1188, 1353, 910, 1927, 819, 1488, 1130, 1142, +1518, 533, 2351, 406, 1771, 1362, 887, 1977, 1160, 1196, 1092, 1655, 1392, 921, 1570, 908, +1287, 1130, 1628, 830, 1691, 967, 837, 1524, 1341, 903, 1377, 1376, 530, 1509, 1193, 1124, +804, 1096, 1071, 1418, 589, 1572, 434, 1175, 2143, 500, 704, 2220, 799, 857, 1916, 708, +2139, 723, 2175, 636, 1932, 1954, 1152, 2275, 1057, 2217, 1651, 1919, 2700, 765, 2093, 2497, +1789, 2267, 2088, 2244, 1213, 2648, 2283, 1639, 2060, 2589, 1887, 1969, 2086, 1862, 2637, 1046, +2627, 1663, 2070, 2046, 1010, 2906, 1234, 1528, 2166, 1703, 1053, 2072, 1798, 1386, 1273, 1580, +2615, 1060, 937, 1912, 1444, 1468, 1628, 1324, 1079, 1556, 1366, 1821, 1299, 851, 1624, 1234, +1307, 1684, 734, 1194, 1740, 905, 841, 1451, 1170, 1317, 1119, 977, 1440, 1057, 1048, 963, +1262, 1177, 1146, 703, 1427, 901, 935, 1653, 542, 1077, 1656, 486, 1387, 1401, 633, 1195, +1392, 1245, 1130, 1071, 1395, 1470, 1058, 1478, 1285, 1572, 1317, 1203, 1463, 1481, 1376, 1657, +1370, 1380, 1661, 1820, 1186, 1555, 1803, 1550, 1614, 1754, 2032, 1414, 1670, 1859, 1949, 1611, +2097, 1294, 1909, 2288, 1700, 1828, 1772, 2143, 1819, 1894, 1702, 2166, 1738, 2107, 1697, 1964, +2045, 1653, 2286, 1863, 1826, 1926, 1925, 1901, 2010, 1765, 1831, 1779, 2140, 1607, 1810, 1862, +1792, 1831, 1848, 1727, 1551, 1872, 1836, 1614, 1653, 1776, 1513, 1810, 1534, 1630, 1638, 1592, +1550, 1434, 1792, 1527, 1328, 1705, 1443, 1519, 1648, 1534, 1450, 1595, 1515, 1543, 1517, 1661, +1550, 1416, 1550, 1507, 1591, 1543, 1467, 1383, 1706, 1495, 1379, 1608, 1565, 1546, 1433, 1601, +1459, 1579, 1477, 1516, 1661, 1437, 1614, 1464, 1647, 1627, 1369, 1809, 1443, 1598, 1665, 1489, +1737, 1553, 1664, 1644, 1593, 1642, 1670, 1722, 1636, 1679, 1707, 1709, 1717, 1640, 1676, 1795, +1640, 1687, 1735, 1653, 1691, 1728, 1618, 1725, 1599, 1733, 1692, 1692, 1610, 1627, 1714, 1634, +1634, 1557, 1609, 1708, 1542, 1577, 1641, 1555, 1566, 1578, 1561, 1546, 1521, 1570, 1497, 1485, +1562, 1472, 1486, 1501, 1440, 1450, 1504, 1355, 1504, 1414, 1445, 1304, 1493, 1371, 1343, 1452, +1309, 1378, 1357, 1324, 1352, 1411, 1187, 1354, 1350, 1235, 1325, 1236, 1271, 1268, 1227, 1301, +1178, 1189, 1273, 1203, 1176, 1239, 1168, 1173, 1177, 1164, 1189, 1121, 1154, 1169, 1123, 1123, +1137, 1110, 1117, 1109, 1093, 1103, 1095, 1069, 1078, 1073, 1062, 1062, 1030, 1057, 1045, 1020, +1036, 1014, 1013, 1012, 1006, 986, 986, 974, 986, 959, 962, 960, 942, 940, 933, 926, +916, 918, 912, 884, 908, 884, 881, 877, 860, 861, 863, 843, 844, 838, 821, 823, +815, 813, 795, 795, 784, 782, 771, 765, 759, 751, 743, 737, 735, 722, 710, 711, +704, 695, 689, 682, 675, 668, 661, 649, 650, 639, 628, 628, 619, 611, 601, 599, +590, 584, 574, 570, 562, 556, 547, 540, 536, 527, 521, 513, 507, 500, 490, 487, +477, 472, 464, 457, 451, 443, 437, 429, 422, 415, 408, 401, 394, 387, 380, 373, +366, 359, 352, 345, 338, 331, 324, 317, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21798, -1009, -8978, -24045, -15035, 11524, +11480, 11841, -10235, -26261, -16978, -7314, 19328, 15296, -6622, -13118, -22515, -2762, 19105, 19144, 11137, -7162, +-19772, -5714, 15512, 19817, 18578, -190, -13746, -8108, 730, 21944, 18470, 1435, -9372, -26261, -5346, 8851, +10229, 15683, -15975, -24979, -14292, -2736, 18026, 11314, -6838, -20528, -22693, -3422, 15524, 19575, 6673, -12972, +-17524, -907, 12699, 21404, 20509, -8394, -12419, -7556, 1752, 28249, 15448, 2958, -8184, -20845, -1562, 9568, +17302, 8152, -19474, -20388, -17505, 380, 19334, 8019, -6298, -20839, -23772, -2603, 18629, 12661, 2133, -13715, +-23195, -933, 13384, 24052, 16756, -9518, -10864, -9549, 10019, 25855, 10787, 7498, -15181, -19150, 6336, 11734, +20217, 7232, -16159, -19683, -13746, 3073, 16318, 8895, -11670, -24274, -20109, 349, 15740, 12997, 2920, -21741, +-21829, 438, 8787, 26598, 8635, -13943, -8279, -10375, 14064, 26300, 14686, 3238, -17639, -11207, 4425, 13924, +21175, 2514, -13492, -16966, -11207, 9181, 19721, 3549, -13556, -20490, -24039, 2069, 15372, 8825, 152, -25233, +-18528, 38, 12775, 23823, 1492, -10299, -15785, -11727, 21061, 21125, 13308, 2050, -16877, -6368, 8502, 17588, +19740, 4292, -16915, -17302, -4311, 10533, 19074, 5003, -10489, -23176, -19937, 7073, 10991, 10737, -6019, -31322, +-14083, -5543, 12146, 23766, -1746, -13035, -18388, -5765, 17880, 19671, 13175, -5079, -16051, -5479, 9137, 23398, +21429, 76, -14623, -9746, -4711, 14515, 21715, -965, -8959, -23995, -15035, 11492, 11461, 11784, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31334, +30908, 30200, 29232, 27980, 26478, 24743, 22791, 20619, 18257, 15754, 13088, 10298, 7418, 4497, 1509, -1493, +-4480, -7402, -10281, -13072, -15717, -18244, -20604, -22780, -24729, -26471, -27973, -29221, -30199, -30906, -31338, -31483, +-31336, -30912, -30202, -29234, -27983, -26479, -24745, -22794, -20621, -18260, -15756, -13092, -10300, -7420, -4501, -1513, +1490, 4478, 7400, 10279, 13068, 15715, 18242, 20602, 22775, 24727, 26469, 27971, 29219, 30197, 30904, 31336, +31487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, -2752, 3094, -1392, -4997, -1114, -356, -769, 1125, -1465, 1137, 1053, +675, -10151, 13809, -10343, 6122, -461, -475, 4925, -3897, 8390, -2241, 7848, -8769, 14673, -5723, -1732, +22081, -12641, 9124, 3460, 3955, 3197, 1996, 3129, -4129, 7687, -753, 572, 5239, -695, -3770, 978, +12328, -27572, 26865, -28402, 19609, -14936, 4104, -12184, -2288, 3774, -14144, 3873, -12795, 2194, -8087, -3115, +-9431, 4369, -13960, 647, -5649, -2515, -8041, -2746, -3169, 1995, -975, -5760, -3387, 6496, -8022, 5868, +-4852, 3898, 4560, 3398, -121, 13071, -14, 6204, 12217, -709, 5463, 8865, 10870, -168, 10093, 7211, +1486, 4118, 6136, -3862, 10668, -1617, 3105, 1161, 7787, -2409, -7358, 9369, -3082, -7075, -4183, 3734, +-3511, -16194, -5334, 851, -1862, -18303, -8968, -86, -6208, -6499, -14373, 1466, -6109, -7595, -8920, -2551, +-3098, -10896, -4044, -593, -895, -8168, -661, 172, 165, -1013, -2619, 2672, 4606, 2923, -584, 5868, +8315, 4637, 3857, 15368, 11237, 3747, 12932, 13754, 9677, 3907, 8332, 12853, 8660, 9244, 3668, 5833, +4857, 6551, -6922, -236, 9576, -3211, 1067, -3032, -304, -7881, 1648, -7178, -7790, -10091, -11035, -5576, +-6148, -6737, -17439, -4098, -8859, -7523, -11532, -12980, -9856, -3015, -7935, -6865, -7237, -7493, -1791, -3432, +-2080, -1923, -2930, 1704, 4013, 3306, 4227, 3456, 6731, 3740, 9847, 6236, 12825, 11488, 13238, 16950, +12944, 13161, 13174, 13297, 10445, 13089, 13656, 10723, 6642, 3788, 12409, 1715, 3626, -4289, -1028, 108, +-9022, -1726, -2184, -10900, -12536, -14389, -4822, -20271, -8161, -15274, -11227, -13153, -10613, -15534, -10327, -12831, +-13013, -8309, -9630, -10708, -6441, 859, -2114, -3239, -2974, 2063, -1923, 3609, 4662, 7533, 5185, 11044, +7952, 13706, 7479, 7841, 11158, 13665, 13966, 15612, 21224, 16632, 15772, 12351, 10879, 10298, 12839, 11749, +12978, 10753, 2628, 2575, 1824, -319, -6436, -3682, -4821, -6069, -6568, -14505, -11667, -12409, -12362, -19687, +-22443, -18497, -16652, -15240, -15496, -13556, -11795, -14129, -15703, -15279, -12562, -11269, -5440, -2842, 5675, 1641, +-2145, -1435, 6894, 7175, 6049, 8891, 10861, 16194, 15392, 15127, 14061, 17127, 13009, 15691, 16386, 18695, +17551, 25151, 20677, 17656, 9342, 11586, 9090, 13809, 7276, 10272, 8219, 3589, -4115, -2869, -7704, -12203, +-12348, -15129, -12792, -16212, -17517, -19020, -17864, -26335, -31588, -20866, -23796, -18067, -21037, -10936, -17865, -12546, +-15700, -8106, -11430, -5289, -6194, 3463, 6072, 6831, 9247, 12416, 11430, 8800, 11616, 15696, 16693, 22579, +20539, 23844, 21758, 19240, 13738, 17281, 20589, 17175, 22313, 20428, 18289, 11425, 12986, 5383, 10163, 1088, +3282, 763, 1506, -4802, -3217, -9445, -13016, -19042, -20050, -20063, -23266, -22689, -23453, -24604, -28445, -28692, +-27647, -22744, -21207, -22340, -17335, -16300, -14133, -12013, -6617, -2477, 138, 1895, 6617, 9917, 9216, 14274, +17605, 18063, 20278, 20845, 18752, 21638, 21367, 22689, 23863, 22791, 20402, 20125, 19957, 15860, 15332, 17862, +15003, 10991, 7540, 8629, 4251, 4306, -326, 1247, -2391, -8229, -10194, -9859, -14641, -18808, -17891, -21688, +-23505, -28539, -24609, -25633, -27243, -31344, -19859, -22710, -20405, -16786, -14634, -14963, -12215, -13886, -8257, 668, +3205, 6905, 14850, 13890, 12773, 15812, 15822, 19199, 20266, 20054, 20116, 24239, 21864, 22214, 22260, 22645, +14085, 14027, 14199, 13480, 14369, 16425, 13679, 10855, 3447, -83, 3310, 1013, -140, 1878, 8, -6747, +-8364, -9924, -13314, -15834, -22990, -21494, -22386, -27564, -25889, -21164, -25632, -26988, -20616, -21831, -21190, -18858, +-15426, -13123, -9207, -8657, -5041, 923, 2831, 4772, 12722, 14511, 11859, 17257, 18742, 17175, 21146, 21384, +20053, 21713, 17965, 18305, 22580, 20859, 15969, 17345, 13705, 9985, 12420, 13569, 11723, 9220, 5035, 3671, +3565, 599, 1114, 985, -1589, -6028, -7304, -9975, -13400, -14805, -19067, -19832, -24028, -28033, -25198, -25885, +-29193, -22118, -21798, -20802, -15469, -18367, -16383, -14001, -12749, -10293, -1441, 305, 8258, 11544, 9538, 14062, +14793, 16550, 16186, 19517, 19445, 20606, 20701, 22826, 17818, 17909, 14897, 16502, 14744, 13907, 14498, 14317, +10115, 12665, 9521, 7249, 4830, 3486, 2579, 3017, 1284, 634, 1660, -4867, -3514, -10899, -10172, -17570, +-17215, -19179, -20337, -24390, -23320, -23591, -26519, -27014, -20271, -24187, -21409, -13408, -18185, -12081, -10431, -11200, +-5556, -121, -780, 10663, 12405, 12360, 15757, 14904, 15325, 19129, 18895, 20549, 20966, 19418, 17752, 16865, +18453, 16647, 17107, 14703, 11661, 12467, 12477, 12427, 10777, 9516, 5450, 4582, 2439, 3631, 3466, 954, +134, -2012, -4621, -7240, -10187, -14198, -14884, -19394, -20770, -22511, -26916, -25423, -28368, -29569, -21292, -19981, +-18299, -17284, -19996, -18716, -13730, -11966, -5048, 1252, 5257, 7680, 9459, 12563, 15737, 15652, 16584, 18325, +18333, 19426, 19084, 22482, 21692, 20153, 16820, 12204, 12047, 12292, 13845, 13306, 13833, 9787, 10370, 5779, +4808, 3853, 3654, 1373, 1588, 1227, 1381, -1711, -659, -5430, -7086, -13027, -17683, -18130, -18613, -17862, +-19013, -23769, -25311, -26814, -26492, -20631, -21815, -16001, -15308, -13929, -11982, -12411, -11958, -5863, -2257, 4177, +11316, 12792, 14967, 11957, 14243, 15919, 19333, 15967, 18982, 17138, 20849, 15940, 19957, 14580, 15143, 14361, +12740, 8766, 12241, 9800, 11883, 10902, 7645, 6617, 2923, 758, 2534, 3398, 926, 2108, -3486, -818, +-5422, -6451, -12303, -14737, -19237, -16652, -20186, -22432, -23356, -24042, -27677, -22498, -20744, -24147, -15660, -17188, +-17193, -10356, -11317, -10383, -2088, -2363, 4137, 9718, 10053, 10856, 15713, 15431, 17496, 19917, 18490, 16655, +16848, 19579, 16329, 16584, 13857, 11158, 12529, 12577, 9930, 12493, 10272, 8615, 8765, 6539, 3797, 3764, +2302, 2452, 4024, 2597, 504, -524, -1534, -4057, -3867, -9005, -14348, -14658, -17031, -18091, -18789, -21541, +-23519, -24740, -25473, -19923, -21379, -18890, -16597, -16090, -10680, -13340, -11767, -3893, -2883, 963, 9722, 8288, +13983, 12044, 11865, 13770, 21295, 14339, 19763, 18944, 17831, 18530, 14566, 14313, 12179, 14799, 10598, 14132, +8595, 12741, 9851, 10076, 7035, 7605, 1137, 3541, 264, 4477, 3454, 4543, -900, -1207, -4490, -5665, +-8659, -12156, -14878, -16307, -17693, -21450, -23226, -24587, -26431, -24406, -20701, -20313, -18343, -14174, -17166, -11166, +-8766, -10162, -4232, 1312, -223, 10026, 12490, 9998, 16396, 13596, 14861, 19991, 19680, 14593, 18042, 15365, +14631, 14150, 12669, 9424, 10742, 10131, 9026, 7353, 9732, 6072, 7536, 6641, 5262, 3231, 2655, 192, +4166, 2944, 2805, 1045, -388, -783, -1837, -4150, -7294, -13215, -14553, -15158, -15918, -15783, -19957, -21911, +-22283, -22429, -17036, -17908, -16520, -12713, -14768, -14528, -10967, -8997, -5628, -106, 4120, 8380, 9772, 7830, +9517, 12187, 13693, 16031, 16833, 17046, 15839, 17579, 16693, 11986, 12572, 10660, 10513, 12823, 13915, 12452, +12551, 8127, 7099, 7433, 5284, 2855, 4545, 3297, 4628, 4829, 2179, 1162, -2406, -4854, -5506, -10080, +-13637, -15810, -17127, -16246, -21509, -20576, -24761, -27124, -23669, -22251, -21740, -18822, -17537, -12791, -8647, -6581, +-6502, -1493, -592, 5694, 7370, 15653, 15749, 16959, 16718, 15443, 18663, 20037, 15440, 19435, 16643, 12948, +13511, 11459, 7626, 11456, 7510, 7215, 3056, 3081, 3512, 5634, 6218, 3645, 1405, -56, -1281, -308, +2341, 660, 2661, -1499, -1001, -2702, -4689, -9067, -10800, -14352, -13241, -15495, -18436, -18798, -20411, -17592, +-15150, -13833, -15567, -17531, -16055, -13748, -9978, -6189, -3767, -806, 162, 1350, 5277, 6291, 9630, 10340, +10593, 13861, 16114, 14772, 16186, 14059, 13830, 12703, 10820, 8680, 10861, 10900, 12150, 11231, 8982, 7454, +7639, 7220, 7253, 6407, 4255, 3336, 3370, 3676, 4255, 4222, 1216, -1397, -2628, -3910, -6257, -8734, +-13207, -14704, -15676, -21147, -21922, -21377, -23956, -21835, -17251, -18565, -17017, -16042, -18270, -14827, -7670, -8294, +-825, 125, 1033, 3990, 9264, 8933, 14511, 13898, 18326, 15196, 18961, 14840, 16049, 16995, 14718, 12870, +15433, 8570, 10095, 10028, 6884, 8878, 6144, 5436, 3907, 4596, 3634, 5557, 2819, 2766, 678, 2597, +758, 2148, 1574, 591, -3181, -4574, -8489, -10511, -12522, -13245, -18022, -19631, -19778, -20334, -21630, -17063, +-16660, -15479, -14270, -15764, -14392, -11125, -9108, -5721, -1821, -69, 2340, 5767, 6017, 8053, 13123, 12422, +14481, 14055, 15177, 14330, 16611, 14877, 13771, 14137, 11730, 11268, 10716, 9369, 12740, 8575, 7093, 7123, +5139, 5836, 5338, 3874, 2824, 3856, 1759, 2235, 2522, 937, 65, -762, -5627, -6464, -8807, -11856, +-13820, -16095, -20002, -19556, -21211, -22413, -20587, -19347, -16944, -16851, -16556, -14494, -12053, -11105, -7724, -4229, +492, 4446, 5093, 7831, 10687, 12999, 14516, 15674, 15554, 15957, 16251, 17698, 18080, 16735, 14272, 13118, +9212, 9281, 8058, 8577, 8632, 6264, 5057, 5352, 3956, 3524, 3374, 660, -178, 946, -49, -186, +3436, 445, 767, -1889, -4645, -8413, -8763, -14494, -15386, -16642, -20333, -19462, -17536, -21514, -17302, -14697, +-17193, -15335, -14584, -13635, -9076, -5757, -2571, 588, 2770, 4094, 4839, 9699, 13144, 11189, 14461, 14187, +12648, 17028, 14809, 13635, 17414, 10250, 11551, 8885, 8169, 7754, 9636, 6687, 8370, 5642, 4761, 4193, +3749, 3659, 3662, 2590, 1443, 1583, 1052, 2923, 1346, 2095, -2483, -2285, -6993, -6195, -11019, -11609, +-15594, -16524, -19333, -17226, -19431, -18015, -18569, -17503, -16345, -19619, -14874, -13088, -9762, -5924, -4306, -2901, +3255, 475, 5290, 6885, 10735, 14380, 15665, 13323, 16039, 16208, 15427, 16382, 16295, 14168, 12328, 12362, +10605, 11712, 10978, 8531, 7459, 6899, 4690, 5603, 5130, 3097, 3259, 2242, 1190, 1251, 1166, -653, +-84, -1376, -2947, -5646, -6742, -10009, -12357, -14177, -17424, -19803, -21501, -21525, -20638, -18596, -16208, -15611, +-16005, -14550, -11522, -10467, -6312, -4311, -1499, 1885, 3750, 7779, 11367, 11037, 12932, 13748, 13318, 13276, +14984, 15493, 15294, 16080, 13123, 13307, 10791, 7659, 8683, 6353, 4417, 7969, 5310, 5084, 6071, 4256, +3510, 4139, -1117, -401, 74, -111, 380, 2784, 46, 1211, -707, -4702, -6421, -10021, -12251, -13755, +-16124, -18641, -16427, -18169, -18048, -16604, -14904, -15471, -16970, -15921, -14895, -11384, -5214, -4706, -3239, 2378, +2938, 4457, 7329, 9142, 10197, 14649, 13296, 15833, 16802, 14762, 15697, 16664, 13119, 12279, 11312, 11040, +8298, 10037, 8718, 9417, 6912, 5651, 4586, 4268, 2389, 2679, 1224, 500, 770, 910, 930, -470, +-182, -1384, -3604, -6860, -8984, -11852, -14272, -14850, -17372, -19093, -18319, -18879, -18880, -17493, -16769, -15950, +-13966, -12310, -9968, -5342, -5064, -4152, 950, 2870, 5542, 9214, 10310, 12019, 14277, 13594, 14935, 15648, +13748, 14434, 13422, 11869, 11556, 11614, 11022, 8178, 8902, 5484, 4610, 7366, 3374, 3133, 3819, 3125, +1851, 3918, 446, 847, 1124, -397, -287, 1073, -574, -582, -1738, -3566, -6259, -8541, -11947, -14255, +-17041, -17759, -16878, -17711, -16184, -14289, -14084, -13935, -14441, -12832, -12826, -11679, -9083, -3017, 97, 3980, +6051, 7724, 9825, 9084, 8968, 11436, 12354, 13917, 15286, 13888, 14373, 16225, 14857, 11480, 11850, 8519, +7358, 6867, 4949, 4772, 8287, 7021, 5379, 4343, 2274, 1350, 2476, -803, -654, -15, -782, 246, +313, -1421, -1018, -4054, -9039, -12324, -14627, -15144, -17711, -19531, -19435, -17096, -16710, -14048, -15134, -15860, +-13392, -10235, -11085, -7775, -4951, -1846, 3880, 5498, 5072, 9653, 11348, 11389, 12251, 12507, 14298, 14451, +13652, 12753, 12751, 14119, 12289, 9502, 7260, 6390, 6359, 5921, 5420, 4706, 5861, 4949, 3097, 2938, +1532, 1018, 466, -1187, -364, 1279, 752, 784, 728, -886, -2815, -4406, -8406, -11367, -12398, -14250, +-17169, -15915, -16954, -16481, -14147, -13617, -14752, -13176, -12720, -11388, -11143, -7020, -6742, -3387, 2737, 2150, +5621, 8639, 10237, 10105, 11494, 11688, 10763, 13456, 13771, 10681, 16399, 13736, 13532, 12328, 9287, 7912, +8134, 5311, 5703, 5403, 6624, 3958, 6513, 3894, 2880, 2416, 301, -1285, -466, -197, -640, 510, +-656, -1667, -2487, -5689, -9615, -13023, -15502, -17745, -19868, -18715, -19316, -16543, -12857, -14693, -14055, -11197, +-13499, -10282, -9264, -5977, -2819, 2128, 2218, 6738, 10159, 11001, 11992, 14313, 12207, 14717, 13208, 12510, +12328, 13055, 13012, 12477, 10552, 6513, 6407, 6687, 4678, 3903, 5233, 3461, 2978, 3747, 2573, 1630, +2513, -39, -1163, -813, -708, 212, 1170, -175, -767, -1583, -5115, -8005, -10626, -12186, -14621, -16925, +-16769, -16389, -15321, -11873, -10851, -13061, -11487, -10312, -10562, -8688, -6708, -3856, -702, 2296, 5446, 8281, +10443, 10936, 11002, 10725, 9810, 9729, 10523, 12089, 10996, 11561, 12826, 10557, 9509, 7259, 5274, 4669, +4980, 3256, 5409, 3607, 4249, 6641, 4005, 3129, 3631, 393, -104, 90, -305, 359, 2319, 111, +-1484, -2015, -6846, -8164, -12187, -15317, -18301, -17329, -17415, -17547, -14321, -11296, -15140, -11010, -10747, -13464, +-10343, -7608, -6670, -965, 828, 2259, 7209, 10431, 8782, 12840, 12707, 9049, 12317, 12266, 10238, 12624, +13765, 12494, 11992, 10419, 7554, 7734, 4761, 4842, 5332, 4458, 4043, 4788, 4509, 3614, 4098, 1856, +162, -1407, -1187, -1057, 477, 22, -84, -1747, -3529, -7360, -9093, -12156, -16428, -17835, -18124, -17588, +-15740, -12505, -11805, -13400, -10077, -9451, -9866, -7154, -7502, -5556, -1395, 1476, 5219, 9337, 10288, 11402, +13299, 12553, 10049, 10944, 10227, 8758, 10784, 11187, 10616, 10285, 8521, 7940, 6322, 4146, 2955, 2422, +3095, 2380, 3527, 4801, 4805, 4468, 3075, 1801, 765, 623, 1161, -360, -149, 453, -306, -2604, +-4379, -7513, -10821, -14523, -17089, -17008, -16966, -16165, -13765, -12297, -13762, -11689, -8553, -11814, -9289, -7782, +-8247, -898, -33, 2281, 6007, 8479, 8739, 11300, 12051, 9366, 9066, 12244, 8809, 11671, 10540, 10186, +10582, 10159, 7223, 9592, 6472, 5955, 5777, 4867, 3983, 5267, 5867, 3457, 5372, 2545, 2305, 1279, +905, -203, 237, -12, -1868, -3077, -3691, -8577, -10039, -12242, -16464, -18113, -17032, -17704, -16541, -13499, +-14743, -14233, -8842, -10697, -8886, -6280, -5965, -3304, 32, 719, 4218, 8635, 9156, 11853, 13569, 13193, +12903, 13064, 10725, 8752, 10392, 10849, 9593, 8711, 7068, 8612, 6894, 5622, 4647, 4983, 3033, 2416, +3201, 2112, 2735, 3278, 2008, 767, 469, 1105, 661, 181, -1719, -2360, -2087, -5733, -8591, -10293, +-13590, -16070, -17154, -17147, -16138, -13658, -12389, -13820, -11177, -8954, -9360, -7365, -6143, -5600, -2548, 1501, +1446, 5447, 8852, 9483, 11911, 13829, 9571, 11066, 12405, 8544, 9080, 9783, 8912, 9840, 8010, 7206, +7991, 6267, 5178, 6437, 3949, 2645, 4310, 3968, 3486, 4392, 3391, 1947, 2384, 643, 1084, 1138, +90, -2150, -1934, -3934, -7411, -8432, -10869, -15626, -16328, -16116, -16519, -15055, -12842, -13484, -13178, -9299, +-9278, -8348, -6769, -5099, -5383, 1016, -496, 2834, 6873, 8837, 7797, 13628, 11790, 10572, 12033, 9387, +8533, 9865, 9930, 8070, 10063, 6914, 7980, 7428, 5942, 5627, 7034, 4218, 3848, 4333, 3876, 3143, +4434, 1480, 1914, 1079, 1206, 475, 336, -954, -2483, -2522, -5494, -9104, -10527, -12525, -16580, -16660, +-15597, -16987, -13374, -13031, -15882, -11496, -8741, -9658, -7814, -4044, -6399, -2105, 1059, 1040, 6283, 8504, +7512, 11916, 13167, 9787, 11068, 12630, 9043, 8963, 10286, 8282, 9001, 8164, 6383, 7369, 5741, 3890, +5977, 5499, 2501, 5245, 5566, 3037, 4685, 3377, 1695, 1535, 861, 439, 2057, 552, -2091, -779, +-3114, -6298, -8326, -10489, -15045, -17191, -15921, -15947, -15854, -12493, -13142, -13474, -11541, -8855, -10812, -5844, +-7570, -5352, -1202, 1565, 3415, 6665, 9322, 7087, 11677, 12679, 8762, 10904, 10480, 8820, 10163, 9984, +10073, 9486, 8786, 6133, 7440, 5905, 5441, 5876, 5060, 3160, 5974, 4753, 4658, 4245, 2517, 1978, +1053, 1145, -528, 1293, -661, -2230, -2190, -4805, -7427, -10062, -11998, -16424, -16966, -16687, -16851, -14829, +-13989, -14552, -13272, -6885, -10197, -7090, -6028, -7406, -2715, -1175, 1828, 2890, 8642, 7408, 10637, 12797, +11630, 11708, 12048, 9810, 9042, 9668, 8343, 7940, 8756, 6283, 7571, 6133, 6127, 6369, 4870, 4870, +4244, 4425, 3691, 3644, 2831, 1938, 2404, 1721, 2100, 1517, 1192, -179, -2187, -3189, -5648, -7988, +-10016, -12683, -14965, -15420, -15028, -14697, -12904, -12406, -15252, -12691, -9517, -10534, -7976, -6516, -5909, -2112, +-975, -29, 6171, 5430, 6943, 9091, 11363, 9750, 11036, 11831, 8258, 9982, 9571, 8967, 10071, 7670, +6677, 8776, 6573, 6882, 8543, 6345, 3990, 6154, 3689, 4198, 4443, 2019, 1709, 2928, 38, 1124, +2037, -11, -1647, -1637, -4043, -7095, -8168, -11358, -13969, -15724, -17567, -15677, -15928, -14458, -13697, -15099, +-14031, -7401, -10545, -6255, -6488, -6486, -1340, -321, 3377, 4620, 8913, 6990, 10796, 12420, 10828, 13109, +11527, 9353, 10984, 9466, 10552, 8727, 7872, 6457, 7394, 6355, 6717, 6660, 5372, 5246, 4427, 5385, +4126, 3579, 2095, 1271, 997, 420, 1957, 1172, -265, -636, -2330, -4065, -5214, -9507, -11443, -13842, +-16474, -16202, -15344, -16001, -13683, -12064, -15281, -10425, -9114, -8683, -6765, -6645, -6765, -1480, -11, 2800, +5457, 7450, 8265, 10445, 11473, 10202, 11528, 10658, 8957, 8407, 8700, 9024, 9165, 7871, 6747, 7406, +6643, 6699, 7452, 5419, 4642, 5392, 3995, 4265, 4285, 3146, 1948, 2199, 1079, 1493, 2047, 477, +-1672, -2463, -4795, -5556, -8258, -10904, -12727, -15785, -16386, -14912, -16210, -14931, -12600, -15157, -13884, -6700, +-10537, -6035, -6298, -6703, -2537, 1514, 103, 4860, 6707, 7689, 9076, 12784, 9881, 11592, 12525, 9603, +9654, 9229, 8400, 9203, 8086, 6344, 8182, 6737, 7618, 6238, 7674, 4693, 5321, 5067, 3491, 3692, +2613, 1579, 2108, 724, 1394, 1558, 712, -1063, -2238, -4262, -4829, -7844, -10848, -12080, -14631, -16121, +-14802, -14625, -15288, -12671, -12625, -15523, -7591, -10514, -7297, -6863, -6351, -4212, -165, 1260, 3194, 5175, +7684, 7946, 10870, 11568, 9779, 10808, 10648, 9380, 8063, 10675, 7896, 8142, 7271, 7353, 7268, 8167, +6769, 6741, 6450, 5273, 5099, 5086, 3271, 2757, 2826, 2166, 1409, 1709, 1524, 540, -173, -1964, +-3016, -4104, -7308, -9681, -11382, -13816, -15557, -15061, -15450, -15885, -13249, -13211, -15242, -10507, -8967, -10496, +-5584, -8165, -5885, -247, -644, 639, 4150, 6840, 7206, 10050, 10993, 9944, 11484, 11595, 9673, 10233, +8722, 9760, 8700, 8760, 6959, 8210, 8858, 7602, 8086, 7505, 5931, 5403, 5675, 3539, 3444, 2804, +1554, 1610, 735, 1241, 1268, 716, -1571, -3296, -4212, -6226, -9233, -11176, -14061, -15626, -15735, -15495, +-16356, -14713, -12609, -14851, -13258, -8256, -11677, -6973, -6650, -7281, -2336, -73, 890, 2411, 6160, 6303, +9544, 10896, 10310, 11334, 12459, 10240, 9783, 9384, 9567, 9032, 9320, 6942, 7683, 8596, 8852, 8227, +7242, 6031, 5260, 6041, 3473, 3160, 2752, 1671, 2020, 1306, 995, 1192, 1120, -1025, -2149, -3901, +-5284, -7186, -10678, -12644, -13891, -14700, -14686, -15665, -15428, -12693, -13300, -14225, -8701, -9757, -9436, -5921, +-7762, -5051, -1244, -94, 1476, 5093, 5389, 7219, 10958, 10029, 10196, 12057, 10354, 10391, 10261, 9254, +9312, 8831, 8384, 8369, 9926, 8051, 8445, 8940, 6617, 6317, 6133, 4746, 3256, 3131, 1606, 1590, +2183, 612, 1493, 1521, -360, -1846, -2466, -4900, -7270, -9016, -11443, -13952, -14580, -15235, -15704, -15017, +-14144, -12955, -13772, -12405, -8097, -10392, -6771, -7191, -6856, -1753, -1548, -224, 2950, 5866, 6004, 9415, +9767, 10354, 11067, 11705, 9190, 10821, 7954, 10886, 7836, 9453, 6454, 9489, 9318, 9114, 8810, 7568, +6669, 5938, 5543, 4091, 3023, 2341, 1568, 1971, 1518, 994, 2100, 272, -1335, -2682, -3918, -5689, +-8680, -10370, -13184, -13337, -14721, -15164, -14765, -15130, -12665, -12932, -14289, -8053, -10600, -8018, -6704, -8200, +-3934, -1199, -704, 1482, 4328, 5413, 7809, 10088, 10163, 10159, 12063, 9755, 10281, 8705, 9445, 8916, +8640, 7885, 7843, 8908, 8773, 8553, 8198, 6605, 6315, 5506, 4487, 3309, 1845, 1590, 1617, 1081, +868, 888, 909, -783, -1868, -2876, -4570, -6727, -9130, -10757, -12806, -14245, -14801, -14004, -14785, -13342, +-12217, -14037, -9254, -8234, -9584, -5164, -6782, -6156, -1508, -2036, 19, 2481, 4272, 4707, 9255, 8677, +9756, 11398, 10739, 8926, 9814, 8949, 9172, 7113, 7697, 6301, 7995, 8038, 8183, 8862, 7189, 7039, +6585, 5894, 4058, 3491, 2141, 1121, 799, 878, 289, 1361, -345, -1483, -1629, -4122, -5201, -7227, +-9558, -12177, -13376, -13941, -14552, -14289, -14562, -11187, -14908, -9806, -7633, -9424, -5672, -6559, -7608, -1499, +-3556, -223, 2, 4229, 3027, 8396, 9048, 9255, 10767, 11617, 9156, 9842, 9779, 8622, 7735, 7655, +6549, 7226, 9823, 7714, 8445, 7680, 7233, 6312, 6741, 3597, 2645, 1982, 847, 558, 982, 8, +605, 277, -1354, -1855, -3112, -4996, -6998, -9267, -11319, -12955, -12913, -13886, -14351, -13573, -11719, -13632, +-10028, -7225, -8683, -6539, -5201, -7191, -3065, -1521, -1612, 480, 2925, 3374, 6395, 9756, 8032, 9784, +11133, 9407, 9271, 10001, 8667, 7558, 7560, 6243, 6665, 8677, 7817, 7099, 8097, 6496, 6349, 6469, +4647, 2333, 2245, 758, 301, 415, -111, -212, 398, -1110, -1360, -1708, -3794, -5789, -7223, -10166, +-11339, -12386, -13150, -13859, -13567, -11716, -12521, -10609, -6556, -8424, -6106, -5139, -6774, -3140, -1482, -1641, +480, 2814, 3282, 5965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 6854, 5942, 4621, 1532, -1029, -2824, -6682, -7929, -9258, -10221, -9291, +-7976, -6144, -3898, -1640, 1004, 2522, 3968, 1998, 654, -1316, -4061, -6584, -6962, -7533, -7089, -6222, +-4014, -4938, -2436, -985, 195, 1657, 1960, 335, -1, -3449, -6117, -9107, -10890, -12088, -13475, -13416, +-12207, -9610, -10281, -7427, -5861, -2176, 511, 3375, 1583, 865, -2551, -5658, -7448, -9264, -10678, -10494, +-8753, -8640, -5894, -4999, -2487, -639, -1100, -2817, -5853, -9468, -11906, -13570, -13504, -13642, -11908, -10381, +-7268, -4956, -1706, 878, 1899, 3747, 1615, -1033, -3026, -7567, -9596, -13204, -14842, -15191, -14721, -13477, +-10863, -8077, -2619, 497, 1525, 2450, 855, -1030, -3815, -7013, -10422, -12027, -12631, -11849, -11934, -9852, +-7997, -6902, -7056, -8291, -7083, -8560, -6515, -6436, -5974, -4782, -3924, 53, 1900, 3200, 2559, 876, +-3617, -7416, -11694, -14566, -16317, -18332, -18258, -17164, -13927, -10342, -5140, 227, 2612, 4030, 2788, 1821, +-1595, -4741, -8285, -11315, -13374, -11947, -11522, -8451, -5112, -4647, -4944, -6441, -7715, -8493, -9796, -10288, +-10391, -8927, -6584, -4002, -1637, -738, -1306, -1223, -5293, -7110, -9271, -11033, -12982, -12968, -10747, -9363, +-5092, -3200, -2199, -1590, -523, -2537, -3757, -6471, -11456, -12655, -12447, -10811, -8444, -5245, -5902, -7222, +-8489, -7981, -7804, -8893, -8379, -6984, -3876, -1476, 2148, -152, -3255, -5709, -9998, -11570, -12921, -17059, +-18339, -17462, -14361, -8994, -5444, -1610, -388, -485, -175, -545, -4054, -8021, -9391, -11535, -10288, -8998, +-7920, -7424, -10629, -10203, -11508, -12698, -11914, -8587, -4973, -2018, -1767, -1831, -2497, -3548, -5996, -7779, +-11976, -13823, -13439, -12214, -9093, -6737, -3870, -3956, 487, 977, -2880, -7294, -11070, -10958, -9947, -9349, +-7382, -6124, -6621, -1404, -1547, -2699, -5108, -6489, -2644, -1828, -2375, -4053, -8051, -8519, -7485, -8688, +-7930, -10217, -10646, -7824, -4722, -555, 1100, 2399, 3162, 732, -1678, -4934, -5839, -8514, -8241, -8786, +-8073, -5174, -6899, -6467, -9004, -8483, -5293, -2542, -282, 1172, 2100, 3263, 2887, -2310, -6131, -13024, +-9270, -5870, -6028, -2597, 743, 4563, 4884, 2119, -2732, -7853, -7551, -6284, -3969, -5714, -2541, 1001, +1728, 1303, -2576, -4903, -6847, -5849, -3918, -3716, -2142, -790, -4570, -4572, -8488, -5467, -4835, -2671, +2367, 1875, 2044, -1524, -5823, -8103, -8664, -6353, -6747, -5075, -1002, 507, -1876, -3343, -3408, -3613, +-1141, -2481, -828, -692, 3273, -3288, -8124, -9985, -9339, -5105, -5692, -595, 48, 2781, 3807, -1658, +-5685, -4429, -5194, -5088, -5041, -2206, 514, -1473, -1534, -7755, -7013, -5967, -3522, -1617, -1035, -476, +-4384, -5167, -7011, -6250, -5810, -1719, 890, -431, 127, -3269, -3084, -4837, -7812, -3040, 57, 3743, +-56, -4217, -3337, -5822, -4929, -6914, -1991, 1056, 1059, -4863, -9929, -4847, -934, -3546, -3412, 758, +2316, 3590, -5194, -8695, -7276, -3774, -2818, -2439, 2462, 2213, -1400, -6956, -9065, -4415, 613, 3099, +1359, 3725, -1103, -3053, -2415, -6895, -6168, -97, -2063, 408, -2398, -4495, -4385, -5924, -3242, 1610, +6533, 3596, -3634, -6414, -6427, -4553, -2701, 2200, 2959, 4036, -2487, -2522, -1880, -4753, -5018, -1725, +1387, 2870, -316, -3626, -2590, -1747, 1603, 2426, 2497, -2812, -6461, -7078, -4521, 1902, 5208, 3334, +2281, 2746, -1137, -702, -5136, -2807, 960, 3511, 1476, -79, -5000, -4436, -2527, 4705, 5318, 1817, +-3705, -4857, -4402, -1834, -289, 2951, 1531, 113, -2068, -2573, -8698, -4777, -263, 7326, 6670, 1524, +-5532, -3139, -2975, 2211, 5571, 2125, -2340, -3116, -4689, 2583, 1458, 2893, 67, 3695, -3191, -6775, +-9147, -3238, 4466, 3333, 2006, -175, -5110, -6417, 31, 5646, 1479, -3691, -1367, 301, -858, -3112, +3616, 2914, 2035, -1336, -919, -2686, -4234, 2778, 6209, 618, -7137, -10101, -284, 1869, 2320, 6225, +4355, 649, -4690, -121, 1903, 2761, 1435, 10190, 2389, -5192, -2609, 2787, 11122, 2583, 132, -5088, +-6686, -1067, 4590, 9806, 5465, 828, -1975, -4738, -9801, -2995, 1487, 9231, 2101, -373, -766, -2173, +1803, 5088, 2784, -8250, -9408, -905, 4502, 3388, 11464, 10723, -1753, -6771, -4094, -6502, -6708, 8431, +8746, 1298, -2508, 7010, 4375, -1861, 1342, -2139, -8893, -8462, 7570, 8366, 8022, 9214, 9749, -6164, +-14847, -5310, 1668, 3782, 3405, 8797, 4122, 1571, 842, 2876, -3084, -12760, -1845, 49, -534, 3036, +14344, 4301, -5861, -5618, -2681, -8766, -3302, 9335, 5154, 278, 4693, 8478, -4722, -6414, -625, -1637, +-5810, 4259, 8582, 3634, 953, 3671, -997, -8814, -5267, -968, -176, 2005, 8671, 7061, -2903, -3678, +-2422, -1844, -4809, 2012, 3504, 1327, 3988, 6416, -912, -4309, 977, -3450, -4320, 2337, 9718, 4221, +2323, 189, -4333, -2167, 3583, 1798, 997, 4328, 6478, 851, 1977, 1076, 2507, -237, 468, 2402, +6460, 6054, 7110, 4815, 203, 3176, 5678, 3310, 7601, 9735, 5113, 490, 7937, 3658, 3099, 8234, +2729, 6175, 13354, 10749, 5028, 6296, 2784, 1347, 7888, 12866, 11201, 9169, 5933, 9350, 9483, 12826, +7499, 5676, 7191, 14825, 14007, 14946, 11265, 5538, 1467, 10534, 13928, 13457, 13611, 7153, 5874, 15433, +15602, 1559, 9936, 8118, 9210, 20449, 15158, 9131, 10391, 9043, 6539, 19910, 14888, 11901, 8974, 16834, +14987, 17661, 7438, 6457, 11177, 16541, 15144, 15636, 10135, 7366, 8794, 14877, 17965, 11088, 8032, 9257, +14655, 15182, 7438, 2626, 10032, 13082, 18800, 14806, 8100, 6897, 6382, 8814, 17468, 9929, 6679, 8338, +12978, 12065, 10906, 444, 4062, 14289, 12579, 14495, 8562, -480, 3907, 3486, 11429, 11056, 7512, 7512, +13146, 12480, 7066, -762, 1364, 7599, 13795, 13641, 4443, 453, 1854, 882, 8715, 8523, -837, 7418, +10630, 6068, 7533, -5902, -3553, 12604, 7722, 12470, 7083, -3467, 1766, 2527, 4420, 3671, 1653, 362, +8876, 9889, -545, -2129, -205, 6154, 11798, 9831, -405, 939, 26, -326, 8499, 2293, 1344, 10312, +3610, 5521, 2576, -9601, 4618, 7653, 6378, 7448, 1021, -2692, 5757, 3777, 4079, 9783, 2508, 9042, +8886, 2546, -2385, -1180, 5362, 10301, 12635, 2402, 3084, 4949, 328, 7657, 6440, 1689, 13985, 4548, +9131, 4929, -5222, 6331, 11647, 9103, 13095, 2316, -435, 9711, 398, 9544, 8062, 2933, 15322, 7127, +4287, 4734, -391, 14160, 13682, 12037, 6461, 6021, 7078, 8490, 9306, 7686, 8592, 10289, 11232, 6789, +6788, 1214, 12910, 15568, 11955, 8915, 3558, 7424, 12778, 9762, 12617, 10552, 10534, 9333, 9458, 5983, +9195, 14265, 16998, 13963, 7940, 5359, 4979, 16274, 13306, 19173, 12255, 9029, 11773, 4081, 9275, 12699, +15420, 21662, 16058, 5420, 4088, 2737, 14160, 18302, 17661, 16635, 11313, 7059, 2527, 11473, 11224, 19300, +24823, 13047, 11327, -3094, 162, 17480, 16372, 26700, 17592, 10459, 8724, -60, 7775, 15595, 21251, 26041, +16912, 7386, -3309, 2773, 14273, 24437, 26384, 15071, 16192, 1395, 2218, 9332, 12763, 32291, 25697, 16847, +9475, -6728, 9393, 14600, 23075, 29012, 12474, 14380, 2114, 4686, 8384, 17137, 29773, 25220, 14474, -625, +4313, 9296, 19404, 27716, 19834, 17869, 8229, 2780, 10791, 7727, 28593, 28544, 21036, 9270, -3597, 12026, +14414, 23455, 25324, 17537, 16720, 5427, 5424, 8536, 18329, 30504, 23409, 14888, -742, 7382, 12746, 19432, +24790, 17174, 21307, 9586, 5775, 4764, 12924, 27940, 25915, 16184, 4774, 4208, 12614, 16237, 20040, 18240, +21060, 13695, 6134, 2459, 10770, 22509, 25939, 15165, 10025, 5072, 11968, 14045, 17100, 17755, 18636, 16172, +7582, 5352, 9872, 21139, 23911, 14023, 9948, 8435, 12811, 14857, 12299, 17994, 16787, 16244, 7592, 7397, +11933, 20669, 20549, 12265, 7315, 8684, 14395, 12511, 13054, 15075, 16923, 12910, 5414, 8154, 12319, 22410, +16944, 9008, 6385, 9207, 15199, 12367, 12914, 16434, 14959, 10919, 140, 8715, 15840, 21515, 14652, 6612, +5427, 10506, 11807, 9895, 12413, 15099, 16068, 5926, 1260, 9042, 15372, 21859, 8704, 5912, 7151, 9535, +12954, 6551, 13474, 14672, 13207, 3529, 84, 9115, 18098, 18261, 7953, 3964, 7140, 12757, 8797, 8828, +11886, 15185, 12084, 507, 1726, 9804, 18299, 16677, 1291, 5594, 6571, 12365, 7418, 6768, 12939, 14355, +8291, 451, 2142, 12201, 17264, 9847, 1286, 2387, 8424, 11166, 4785, 8929, 8647, 13159, 3712, 531, +4620, 13088, 14775, 6919, -158, 4221, 7894, 10293, 4617, 8647, 9203, 8485, 1615, 2060, 6109, 13202, +11128, 3288, 726, 4357, 8854, 9586, 4638, 9154, 6038, 5470, -1043, 5550, 7059, 12327, 7896, -22, +1593, 4036, 10226, 7133, 4811, 6751, 5003, 2937, -246, 7390, 8626, 12402, 2913, 680, -328, 7670, +8608, 6988, 5843, 3594, 2794, 2870, 1592, 9465, 8591, 9649, 308, 674, -209, 8626, 7881, 8072, +4630, 2917, 489, 3012, 5236, 10547, 9350, 5407, -2049, 376, 2213, 8144, 8226, 8060, 3327, 1069, +1934, 2196, 8357, 8517, 7008, 2300, -2766, 1689, 3679, 9922, 6293, 6527, -1513, -1493, 1715, 3665, +9489, 7428, 6006, -298, -2841, 3593, 6317, 11316, 6745, 3975, -2373, -692, 4024, 7454, 7708, 7485, +2599, -1926, -1747, 2686, 9699, 10182, 4907, 872, -4130, 2743, 4252, 8516, 4979, 7117, -1904, -876, +-1247, 6133, 11957, 5547, 4043, -5774, -1265, 2026, 5784, 9617, 533, 7925, -4253, -1670, -131, 9333, +10777, 4886, -210, -4374, 838, 5142, 6127, 5792, 5496, 391, -2866, -3575, 4579, 11753, 6345, 3921, +-6044, -1170, 2084, 2867, 8540, 2076, 5757, -4439, -4744, -2094, 7990, 9137, 4519, -4536, -3672, -1513, +3541, 5733, 1967, 7853, -1203, -3278, -6222, 1162, 12620, 3015, 2725, -7646, 1623, -813, 4253, 4040, +4208, 4422, -5324, -7336, -5909, 8817, 6178, 3515, -4997, -2849, -1284, 270, 2405, 1070, 5041, -3761, +-4696, -7680, 646, 10211, 1303, 852, -10043, 2125, -6099, 1760, 1298, 2609, 1715, -6404, -4624, -6044, +7377, 3159, 1798, -8362, -1237, -3276, -2743, 3023, -523, 5057, -7967, -2876, -8029, -984, 7966, -1975, +885, -11326, 4707, -6632, 1456, -175, 1967, -1002, -7865, -4425, -5324, 5506, 576, -780, -7547, -1849, +-1631, -2904, 883, 202, 4198, -6986, -3314, -5164, 2109, 4137, -1376, -1576, -7550, 3341, -4225, 543, +-1040, 2841, -1228, -5402, -5177, -349, 3611, -84, -1688, -5379, -197, 545, -2744, -1187, 80, 2746, +-6943, -4509, -3545, 4723, 1043, -1902, -3807, -3928, 653, -3041, -913, -1852, 3508, -4070, -4656, -4501, +1019, 2248, -947, -2787, -3214, -123, -3535, -2942, -1955, 2483, 43, -5038, -3367, -1480, 3996, -1332, +-2896, -1979, -2097, 63, -4835, -289, -1868, 3491, -7664, -5525, -6082, 1665, -388, -1452, -5231, -3580, +-820, -6397, -1549, -3842, 1401, -632, -7557, -4000, -4878, 2520, -4707, -2361, -3732, -1697, -3084, -3252, +-1344, -3092, 1663, -6839, -3362, -9032, 1586, -5225, -1161, -2412, -4259, -1868, -7315, -677, -3603, -2097, +-2435, -5540, -4096, -5054, -1971, -3949, -2599, -4497, -4393, -6636, -5236, -964, -5624, -1967, -8499, -886, +-9130, -2906, -3091, -5768, 612, -6967, -4136, -11216, -415, -851, -3710, -6105, -5851, -2189, -7943, -2617, +-8719, -2, -5443, -4727, -12084, -7078, 2138, -4217, -3238, -10255, -2879, -7577, -5273, -5737, -5663, -1487, +-6683, -6782, -13309, -3070, -1890, -4343, -8982, -10124, -4343, -6921, -5474, -8526, -3483, -5037, -7199, -14194, +-8454, -3334, -1549, -8630, -9807, -9123, -7211, -7273, -8253, -7505, -2093, -6925, -11190, -12222, -7867, -155, +-4258, -9466, -8389, -12372, -3345, -10059, -5465, -5859, -4036, -7611, -15362, -9007, -5194, -1579, -6400, -10732, +-9630, -8421, -7131, -8209, -5877, -5827, -3712, -13890, -9538, -9219, -2002, -2476, -10202, -7119, -11739, -6428, +-6509, -7539, -1593, -6889, -6488, -11514, -10678, -5635, -2023, -4887, -6946, -11389, -8004, -8083, -7382, -4642, +-4444, -5293, -7475, -12651, -7520, -6141, 520, -6757, -8705, -8137, -7130, -4812, -6973, -4863, -2183, -6576, +-6851, -15592, -5004, -3883, -694, -4311, -9868, -8585, -4737, -6468, -2268, -7039, -2916, -4112, -7867, -12678, +-3312, -6192, 3539, -7571, -7161, -8708, -7119, 292, -7162, -2268, -2793, -3678, -4357, -10339, -1664, -2696, +-1425, -4241, -7681, -5481, -7211, -2904, -3200, -2982, -1329, -3613, -7618, -5576, -3221, -411, 1637, -3952, +-2727, -2981, -4717, 656, -6496, -584, -2860, -947, -5522, -8401, -1602, -2474, 1965, 455, -6102, 1067, +-4338, -475, -3152, -1624, 1521, -1093, -3054, -4053, -2695, -514, 3181, -2831, -339, -2480, -2245, -456, +-4481, 2067, 3323, -593, 111, -7353, -127, -2166, 3099, 1489, -975, -2486, -2317, -4020, -171, -60, +3157, 2678, -2409, -2800, -1062, -2983, 5096, 2131, 1981, -309, -6605, 2073, -3362, 5280, 4362, 511, +-731, -4552, -2165, 1282, 222, 3211, 1214, -1419, -4587, -4009, -1590, 5802, 4478, 4091, -1849, -6502, +1429, -2107, 3910, 1739, 588, 2838, -7614, -2886, -1155, 1852, 9540, -1374, -502, -5167, -3220, 3367, +2727, 2334, 5242, -1810, -2453, -4142, -3570, 3931, 4367, 1508, -789, -7268, -2583, 965, 1124, 5987, +-1801, 1701, -1359, -5554, -967, 1064, 3030, 6245, -5190, -4485, -6765, -1122, 3642, 424, 1705, -975, +-2862, -3997, -3884, -1342, 4652, 2245, -168, -5006, -7782, -192, -337, 2843, 602, -3054, 544, -6040, +-4994, -753, -2801, 3443, 418, -6874, -3290, -8133, 1883, 2791, -1169, 452, -4009, -4738, -3770, -5895, +-2644, 1962, -1057, -820, -7261, -8448, -1456, -1306, -311, -272, -6298, -2736, -3908, -7157, 63, -1811, +227, 1176, -8721, -6908, -4815, -4593, 3126, -3894, -5002, -2111, -8035, -3756, -4753, -4982, 417, -893, +-5287, -3857, -9189, -3510, 1231, -4474, 319, -3106, -8756, -1704, -8660, -6223, 1701, -6858, -824, -5788, +-11148, -155, -8029, -1961, -731, -5255, -1057, -5269, -7495, -5082, -3807, -3019, 1574, -6609, -3166, -6895, +-6436, -5830, -3173, -5902, 1824, -5351, -6686, -4750, -10555, -811, -1825, -3488, -1050, -7032, -7080, -3599, +-9961, -340, -439, -2067, -475, -9059, -8134, -6645, -6081, 985, -905, -4299, -5437, -9065, -5806, -6914, +-535, -806, 1589, -4034, -8427, -8062, -8369, -3952, -41, 1493, -2894, -5092, -10542, -5614, -7383, 715, +929, 2515, -4515, -6986, -10260, -5649, -3106, 2241, 4219, -120, -6081, -8482, -10179, -2880, -1964, 4726, +2173, -4669, -7769, -9306, -7382, -2313, -552, 3365, 4024, -5929, -7307, -13072, -6229, 804, 3459, 5016, +-2020, -9927, -5675, -10501, -1436, -2317, 120, 6788, -3269, -7288, -10721, -13546, 1315, 2582, 5877, 3600, +-11459, -9033, -6178, -6505, 1900, -4374, 3295, 6423, -5236, -9275, -11901, -7888, 5740, 2870, 4280, -4681, +-11395, -9251, -6670, -1756, -1848, -3488, 5348, -39, -5778, -9217, -13055, -3033, 2626, 912, 2571, -7871, +-11281, -5655, -4546, -842, -2438, -3470, 3546, -2115, -5192, -10439, -9709, -3845, -436, 1909, 2375, -7739, +-8916, -8038, -5052, -1684, -5532, -4962, 1148, -551, -3911, -7802, -9339, -8541, -667, 1079, 1284, -3920, +-9876, -9510, -3493, -6420, -4036, -3993, -1292, 2158, -2231, -9743, -10581, -11501, -4583, 2784, 3102, -3123, +-8759, -12511, -8034, -7690, -5523, -2626, -1626, 793, -2761, -10938, -11196, -14199, -6106, 3780, 1897, 1401, +-7819, -13905, -11402, -7237, -6889, -18, -3601, 2593, -4977, -7300, -16128, -12497, -9552, 391, 2660, 1333, +-7389, -10784, -13210, -10538, -3432, -6329, -306, -637, -1176, -5813, -14628, -13798, -9057, -3403, 1844, 3766, +-7809, -6430, -15673, -9765, -6974, -4819, -5243, -57, 1053, -3408, -7294, -14438, -11306, -7425, 1309, 896, +1602, -8045, -10115, -10995, -6262, -6467, -4238, -4935, -588, -1278, -3433, -9087, -11626, -11268, -5216, 1282, +1940, 1231, -7775, -8884, -9217, -5446, -5143, -1354, -3201, -376, -1361, -923, -5532, -10938, -8650, -6786, +-1107, 4197, 871, -7268, -6229, -11604, -5372, -2231, 280, -3230, -1005, -2896, 913, -4330, -4385, -9749, +-9164, -1555, 3562, 1940, -213, -6399, -10223, -6399, -1558, -2046, -503, -1923, -2998, 74, 2015, -2166, +-7232, -9227, -5166, -193, 5484, 3633, 896, -8905, -5755, -6932, -1030, -866, 115, -4219, 1038, 1021, +442, -4234, -8019, -9309, -4668, 2603, 7203, 4729, -1240, -6252, -8415, -6133, 907, 104, 828, 1043, +1767, -148, 2066, -5566, -8356, -6436, -2431, 2534, 8776, 4717, -1900, -6636, -7819, -6679, 4125, -197, +3364, 980, 1221, -1316, 1777, -5076, -4470, -5325, -2488, 2070, 8973, 5471, 79, -6389, -7821, -7068, +2486, 2141, 6281, 1870, 1695, -1544, 982, -4932, -1643, -4330, -3087, 849, 6092, 7372, 2773, -1907, +-7994, -7557, -760, 3901, 3730, 4594, 1516, -216, -2841, -1428, -2373, -2296, -4256, 1497, 1547, 5540, +6279, 2634, -7967, -4857, -3989, -76, 3408, 6180, 2777, -790, 1548, -1709, -2835, 309, -431, -3444, +-572, 3798, 6629, 3017, 2313, -6980, -5799, -4362, 2115, 3360, 5423, 2636, 236, -400, -3634, 472, +140, -158, -2777, 2641, 1151, 4193, 5850, 616, -6263, -4229, -557, -738, 2981, 7291, 3931, -2920, +1643, -2545, -1805, -1391, 4286, -1678, -24, 3403, 2723, 3545, -2155, 2777, -6918, 533, 876, 2648, +3347, 2708, 1069, -1514, -1080, -1277, 379, 1818, 1230, -1878, 3545, 1162, 844, 2964, -313, -366, +-4112, 4071, 67, 1426, 3725, 1489, -1046, -1186, 2678, -609, 390, 2701, 2573, -1796, 2076, 2784, +-517, 1872, 803, 1302, -3590, 2708, 1615, -622, 2033, -196, 77, -76, 3221, 366, 929, 627, +299, 493, 2225, 2104, -1029, 2496, 865, -1368, -219, 3768, 2631, -2742, 1698, 1364, -2488, 1641, +5379, 3249, -4658, 1008, 953, -1187, 209, 6115, 2549, -2385, -369, 140, 123, 865, 4082, 2725, +-1182, -637, -145, 2626, 4204, 2225, 1340, -1941, -1234, -2128, 1940, 5105, 3659, -1329, 24, -381, +-2617, -414, 4932, 3350, 777, -868, 1418, -209, 1018, 2569, 4712, -217, -1965, -947, 1244, 1429, +3203, 1841, 3133, -1469, -2193, 202, 1658, 2678, 1467, 2469, 666, -1919, 226, 1146, 2534, 1005, +1374, 247, 564, -534, 1879, 401, 2315, 2685, 1319, -339, 1442, 263, -2, 782, 1609, 1603, +-1022, -342, 2139, 370, -319, 1151, 2638, 1408, -410, -1226, 927, -349, 193, 3480, 2571, 1680, +-2367, -770, 1023, -267, 289, 2790, 2090, -172, -893, -93, 1285, 1149, 1651, 1777, 933, -1262, +-1274, -178, 743, 1790, 1815, 715, 579, -589, -213, -367, 159, 821, 663, 618, 50, 1603, +1708, -379, -159, 776, 1118, -893, -756, -301, 797, -1301, 896, 2358, 2474, 722, -671, -173, +-746, -137, -1269, 2811, 1705, 1046, -1900, 171, -619, 872, 593, 1067, 678, 644, -2220, -552, +-1354, 984, 2520, 2259, 1237, 994, 939, -1033, -907, -1153, 700, 813, -1155, -233, 688, 1456, +-596, -883, 1124, 1401, 267, -1429, -1574, 125, -714, 289, 517, 2566, 1378, 326, -115, -1319, +-210, -987, -292, 1293, 233, 15, -207, -1284, -18, -226, 1769, 1909, 186, -284, -1532, -1582, +-2654, -2192, 193, 1244, 2392, -371, -1021, -601, -2579, -561, -2182, 291, 1846, -106, -817, -1523, +-1678, -96, -545, 842, 1902, 1511, 445, -2332, -2558, -2132, -1517, -359, 335, 999, 1292, 134, +-1117, -1994, -2033, -271, -183, -321, -420, -958, -2225, -1875, -3156, -1371, -490, 164, 482, 1076, +-985, -574, -2773, -3384, -3050, -2508, -209, 1889, 1344, 1360, -796, -1708, -1176, -2694, -831, 181, +329, 1077, -1682, -2858, -2995, -2432, -1248, -24, -172, 718, 1343, 1507, -1016, -2911, -4700, -3647, +-2329, -2264, -554, -311, 537, 165, -2644, -4021, -2959, -3514, -195, -296, -1462, -950, -2138, -2153, +-1991, -2846, -1825, -439, -359, 773, -1067, 313, -458, -2153, -3128, -5088, -3681, -3584, -1211, 388, +-45, 1316, -412, -4376, -2924, -4665, -3935, -356, -2358, -1702, -992, -2292, -2126, -3910, -4078, -2265, +-2445, -1409, -593, -2644, -873, -552, -1286, -1879, -2923, -5778, -4460, -2364, -790, 506, 84, -421, +-2218, -4241, -2323, -3033, -4555, -1217, -767, -560, 83, -1838, -3802, -3773, -2604, -1698, -3123, -3193, +-3030, -2551, -502, 875, -298, -2057, -3030, -2774, -4238, -5255, -3927, -3821, -1540, 1497, 1538, -519, +-2735, -3466, -3258, -2259, -1296, -178, -736, -1353, -1479, -3122, -2310, -2295, -2117, -1667, -2711, -2841, +-2179, -1620, -356, 716, -205, 62, -1101, -2872, -3972, -5545, -5086, -3012, 391, 626, 1179, -991, +-2404, -3217, -2423, -2251, -2039, -2401, -2027, -790, -322, -39, -831, -1934, -2324, -2052, -2344, -1699, +-2613, -3112, -1961, -1083, -29, 701, -57, -322, -1486, -2054, -2705, -3125, -3075, -3362, -2216, -971, +-844, -432, -534, -1695, -2012, -2470, -2583, -2867, -2614, -1890, -1170, -367, 557, -1100, -2299, -3044, +-3797, -4074, -2488, -1920, -1868, -1848, -774, -893, 48, 716, -422, -1616, -1811, -2812, -3360, -3228, +-3343, -4306, -4402, -2248, -782, 379, 1083, 373, -1811, -2839, -3517, -2937, -2170, -1337, -1238, -2397, +-1432, -1011, -865, -697, -2145, -4000, -5284, -5786, -4874, -2672, -687, -125, -271, 708, 513, 1360, +595, 243, -1654, -3510, -4712, -5177, -5222, -3493, -3005, -2737, -2003, -820, 379, 705, 1268, 493, +-1077, -2633, -2142, -2966, -2005, -1172, -1131, -1491, -595, -147, 144, -855, -2259, -3808, -4635, -5938, +-4154, -2961, -919, 999, 1869, 2067, 3227, 3087, 3323, 2115, 172, -1863, -4610, -4894, -4705, -4188, +-3024, -2105, -1508, -261, 166, 1654, 2817, 3013, 2619, 1559, -200, -468, -1458, -1373, -480, -50, +222, 934, 673, 876, 5, -494, -965, -2339, -2609, -2505, -2187, -1267, -33, 848, 2515, 3884, +4372, 4587, 4146, 3495, 2737, 1203, -93, -1088, -2138, -3149, -3196, -2851, -1825, -675, 558, 1629, +2534, 2841, 3077, 3614, 3921, 3607, 3022, 1964, 1469, 997, 588, 200, 384, -49, -25, -234, +-408, -295, 161, 623, 1091, 1450, 1535, 1511, 1647, 2159, 2426, 2549, 2183, 2200, 1788, 1957, +2316, 1530, 1335, 1500, 1081, 1469, 869, 678, -230, -369, 12, 588, 1015, 1319, 1432, 1545, +1576, 1641, 2068, 2435, 3227, 2569, 2343, 1951, 1745, 1418, 1234, 473, 849, 650, 811, 530, +-230, -49, 135, 461, 1251, 1462, 1462, 2005, 2026, 2261, 1849, 1736, 1622, 1360, 1395, 1043, +233, 183, 226, 301, 661, 494, 910, 1220, 1921, 2347, 1755, 1009, 989, 1137, 1401, 1397, +721, -60, 142, 558, 1015, 931, 634, 33, -251, 72, 190, 207, 428, 690, 1163, 1153, +1043, 1043, 1151, 1445, 1909, 1472, 825, 500, 227, 159, -90, -458, -876, -1209, -1176, -1036, +-738, -292, 197, 487, 605, 675, 700, 719, 783, 1081, 510, 289, -12, 155, 287, 442, +82, -70, -289, -289, -393, -618, -659, -914, -821, -794, -408, -398, -155, -238, -214, -311, +-230, -155, -42, -4, -188, -319, -670, -650, -736, -855, -917, -974, -1236, -1226, -1230, -1036, +-961, -776, -613, -248, -115, 212, 248, 175, 284, 254, 132, 2, -195, -364, -637, -955, +-1254, -1631, -1725, -1926, -2022, -2192, -2278, -1923, -1818, -1561, -1175, -1046, -687, -380, -362, -154, +-83, -199, -115, -234, -400, -462, -687, -560, -806, -773, -924, -913, -1081, -1028, -1265, -1329, +-1301, -1301, -1043, -1122, -1144, -1077, -1238, -1216, -1012, -1087, -1077, -1033, -1029, -1039, -1161, -1203, +-1214, -1062, -886, -708, -636, -653, -756, -940, -967, -1114, -1373, -1398, -1517, -1315, -1448, -1414, +-1446, -1417, -1298, -896, -714, -485, -251, -79, 4, -83, -2, -113, -87, -161, -267, -410, +-550, -702, -866, -1135, -1344, -1559, -1780, -1760, -1733, -1714, -1715, -1743, -1746, -1681, -1442, -1265, +-1011, -855, -697, -584, -459, -415, -425, -322, -217, -199, -142, -234, -128, -178, -200, -339, +-436, -561, -509, -506, -410, -445, -476, -485, -616, -708, -823, -858, -914, -955, -978, -971, +-1062, -1062, -1033, -936, -914, -922, -903, -903, -796, -729, -711, -701, -622, -622, -586, -609, +-538, -507, -538, -537, -565, -626, -663, -610, -637, -519, -551, -523, -485, -473, -431, -393, +-476, -449, -485, -513, -480, -593, -593, -668, -708, -697, -712, -719, -725, -708, -721, -731, +-729, -697, -709, -666, -647, -626, -615, -585, -603, -591, -601, -599, -593, -584, -543, -538, +-548, -567, -586, -608, -610, -605, -608, -605, -599, -606, -616, -615, -613, -666, -660, -681, +-673, -684, -694, -690, -718, -731, -722, -726, -719, -700, -691, -697, -712, -709, -707, -708, +-694, -704, -711, -707, -701, -704, -700, -702, -701, -708, -711, -702, -712, -700, -714, -718, +-728, -733, -728, -735, -731, -745, -750, -752, -759, -760, -763, -770, -773, -814, -708, -1011, +-958, -951, -1343, -1275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -24209, -21133, -18031, -14520, -10393, -6344, -2321, 2159, 6393, 10052, +13649, 16809, 19122, 21120, 22767, 23742, 24433, 25012, 25129, 25003, 24878, 24577, 24078, 23652, 23176, 22552, +21910, 21313, 20630, 20015, 19485, 18812, 17999, 17205, 16140, 14717, 13227, 11597, 9554, 7538, 5589, 3286, +1041, -839, -2918, -5073, -6775, -8683, -10892, -12728, -14587, -16841, -18780, -20482, -22570, -24478, -25906, -27545, +-29107, -29996, -30840, -31563, -31568, -31258, -30943, -29897, -28223, -26611, -24348, -21322, -18228, -14780, -10618, -6505, +-2518, 1890, 6088, 9698, 13294, 16576, 19018, 21016, 22678, 23630, 24281, 24819, 25003, 24932, 24869, 24581, +24078, 23616, 23104, 22480, 21861, 21322, 20653, 19997, 19467, 18794, 18022, 17191, 16203, 14802, 13303, 11673, +9657, 7614, 5697, 3461, 1216, -655, -2729, -4961, -6739, -8571, -10730, -12553, -14358, -16616, -18646, -20365, +-22404, -24316, -25740, -27302, -28869, -29852, -30692, -31509, -31563, -31226, -30858, -29875, -28276, -26656, -24478, -21470, +-18426, -15005, -10896, -6784, -2801, 1598, 5814, 9451, 13016, 16280, 18736, 20774, 22516, 23603, 24236, 24747, +24914, 24797, 24725, 24505, 24083, 23616, 23140, 22458, 21775, 21236, 20608, 20020, 19508, 18848, 17999, 17173, +16194, 14825, 13375, 11812, 9774, 7709, 5809, 3573, 1320, -534, -2550, -4781, -6595, -8427, -10578, -12432, +-14156, -16347, -18412, -20136, -22224, -24177, -25610, -27154, -28685, -29610, -30468, -31339, -31482, -31195, -30903, -29942, +-28259, -26602, -24492, -21596, -18601, -15265, -11188, -7049, -3035, 1342, 5585, 9231, 12751, 16033, 18507, 20563, +22359, 23450, 24128, 24667, 24846, 24747, 24671, 24438, 24007, 23580, 23118, 22449, 21802, 21254, 20585, 19921, +19414, 18807, 18017, 17227, 16253, 14892, 13402, 11871, 9868, 7807, 5922, 3753, 1486, -417, -2411, -4611, +-6424, -8238, -10420, -12315, -14039, -16172, -18224, -19889, -21905, -23930, -25421, -26965, -28550, -29475, -30230, -31047, +-31253, -31024, -30795, -29933, -28299, -26611, -24492, -21406, -18174, -14574, -10393, -6404, -2584, 1509, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10434, +8844, -420, -3214, 5459, 7001, -6944, 11566, -8582, 19057, -8603, -4882, 10478, 2749, -7999, 14240, -10777, +3918, 1894, -5406, 9605, -7447, 5772, -9886, 12665, -8837, -11073, 7277, -2557, -15137, 9591, -16948, 2335, +4150, -26250, 17214, -14066, -3851, 8300, -18101, 11243, 8039, -11235, 10603, -5237, 5329, 957, 7206, -9759, +16498, -849, -4334, 9445, -1748, 3328, 204, 51, 2888, -4988, 1894, 2825, -672, -5732, 14705, -28985, +31237, -25566, 9933, 3348, -13573, 11530, -1656, -3910, 2529, 4805, -10109, 8966, -10778, 13744, -17753, 16457, +-2482, -6232, 16349, -11471, 5628, 2374, -5460, 8193, -9183, 4758, -541, 2507, -4286, 405, 3023, 910, +-514, 2970, -4500, 8954, -3210, 3586, -9324, 21508, -24109, 15654, -10569, 18695, -19416, 15582, -14525, 2645, +1743, -11142, 7900, -4659, -3023, 4167, -11646, 14477, -12114, 4717, -5711, -895, 1664, -6537, 5982, -5242, +1195, 1437, -7897, 14006, -10691, 2960, 386, -3307, 14662, -17742, 20110, -15707, 7340, 3314, -5684, 3418, +8592, -17671, 16367, -9416, 2524, 3867, -5711, 696, 11045, -11850, 8776, -8544, 8170, -4549, -3309, 7728, +-6096, -3726, 15805, -24839, 23740, -13351, -1681, 6035, -2941, -2217, 5093, -3992, -8428, 15231, -11188, 5966, +-244, 1026, -3414, 10744, -9968, 9872, -1496, -1879, 6559, -4728, 8039, -2416, -5902, 9666, -5699, -57, +5915, -15115, 22930, -21815, 11519, -5200, -2829, 5892, -6089, -1314, 3246, 2290, -9693, 2871, -2255, 997, +-2984, -388, -1378, 4410, -6561, 11021, -6770, 3729, -1629, -1823, 10115, -14685, 12930, -3852, -7390, 12555, +-166, -10313, 17758, -11359, -1360, 6772, -3505, 2495, -94, -2757, 6847, -5499, 12892, -10613, 5765, 5169, +-14490, 12209, -7294, 3096, 297, -6576, 1800, 2979, 971, -14287, 26706, -26154, 16439, -1418, -4266, 755, +498, -3585, -1831, 4558, -7158, 772, 3052, -8037, 5586, -4787, 3042, 7051, -13721, 14714, -11287, 6516, +1642, -2545, 1860, -2849, 5595, -3866, -3755, 4822, -485, -3193, -1713, 10122, -19585, 21297, -15557, 8469, +-4534, 1583, 3308, -5439, 3457, 2766, -10888, 10090, -6513, 2571, -2100, -457, 2281, 1683, -1186, 8364, +-10826, 6038, 8107, -13313, 13060, -1440, -6516, 3130, -2128, -2088, 8595, -6443, 2461, -2207, 2857, 645, +801, -356, 1235, -3298, 7680, -7844, 7228, -2097, -6057, 10085, -7021, 4364, -2020, 1949, -4282, -6503, +3391, -415, -384, -563, -8690, 5049, 7585, -11382, 3279, 3729, -7812, 5599, 127, -3326, 2662, 1283, +-7720, 11894, -1493, 1823, 705, 3061, 957, 9448, -15629, 14145, -2043, -5294, 3117, -890, 6891, -6338, +1713, -10159, 15882, -21926, 18511, -16225, 11622, -8821, 3172, -6474, 5110, 1223, -3712, 8806, -13021, 12245, +-5730, -4870, 17008, -26479, 22601, -17340, 14642, -5742, -934, 4467, -3812, 4175, 4170, -7475, 9509, -8357, +6153, -4990, -100, 3256, 4957, -10122, 5786, -1295, -8, 6231, -4313, -2560, -929, 8466, -7597, -2581, +8163, -9318, 4414, -939, -1665, 123, -5379, 5018, -11234, 10453, -8646, 2155, 6701, -14864, 16356, -6754, +7366, 798, 1078, -6334, 12485, -6351, 9528, -6821, -366, 5737, -12104, 7013, -3052, 3642, -2295, -3861, +-1535, 5343, -5040, -4249, 9445, -9616, -2172, 8360, -8868, 12842, -15788, 12340, -1978, 34, 3564, -2807, +-772, 3045, -840, -2199, 5047, -2693, 5126, -2747, -1865, 7534, 903, -2678, 941, -3724, -701, -1127, +5539, -5028, 2095, -362, -997, 2096, -912, -594, 1104, -2272, 4157, -12503, 8915, -655, -9639, 7289, +-2747, 3062, -4593, 924, 3250, -8858, 2494, 15218, -20021, 14111, -6798, 127, 8597, -7636, 7056, 2362, +-9620, 18929, -18898, 11893, -2894, 6930, -12286, 15048, -10640, 1693, 4480, -7482, 927, 5367, -9954, 4960, +-4521, -1602, -703, -1467, 4586, -11169, 7667, -307, -2034, 6555, -10676, 16962, -14885, 7669, -4659, -459, +2194, 7189, -14422, 12994, -1577, -7085, 9284, -8966, 8529, -5645, -2939, 7376, -3753, -4482, 4458, -7238, +9405, -10570, 10379, -7143, 5135, -544, -2531, 3935, 2068, 2810, -10575, 6213, 4715, -11654, 15098, -18593, +20884, -16023, 8695, -6613, 6984, -5777, 519, 1825, -6429, 5571, -6222, 4618, -254, -1414, 7676, -11704, +13030, -7142, 5003, -4368, 1894, 2104, -905, -4041, 7660, -2892, 653, 1636, -3656, 4540, -9358, 12090, +-19048, 12658, -7053, 2408, 28, -5531, 5503, -3384, -865, 10115, -10361, 1222, 6765, -8627, 3186, -4213, +7451, -9343, 6632, -2628, -550, -4797, 12256, -13139, 8699, -3013, 564, -1099, 6149, -5799, 3842, 2532, +-238, -886, 59, 7879, -4591, -5019, 10926, -12165, 8805, -2129, -7151, 9220, -2659, -4254, 11663, -8472, +6848, -7322, 2388, 2524, -125, -5324, 10782, -6538, -5260, 8980, -9322, 12687, -8504, 8609, -6069, -5015, +8864, -6254, -3599, 7846, -9976, 2356, -5140, 8045, -3602, -5594, -113, 8910, -14133, 10684, -7349, -50, +4366, -3449, -3004, 16153, -16123, 15586, -15577, 15777, -13148, 12238, -5922, 4295, -2933, -5948, 11161, -4337, +1907, 239, 997, -3532, 8753, -4744, 3983, -1167, -1702, -1471, 1046, 1393, 1180, -5009, 7047, -7233, +16531, -22471, 18369, -12008, 1135, 1482, -5301, 8430, -10792, 808, 1050, -861, 841, 3576, 2393, -12539, +18128, -23249, 22091, -14046, 8447, -4748, 9537, -11886, 14359, -5163, -636, 9065, -15588, 11597, -3074, -7924, +12179, -9789, 3888, -270, 457, -3280, -32, 3619, -9405, 3483, -1249, -1050, -7466, 7481, -8887, 8988, +-11641, 11452, 3346, -4501, -458, -818, 8262, -1923, -4773, 5527, -9628, 16833, -15949, 7960, 4350, -11267, +14089, -7991, 4615, 2880, -8146, 2372, 7321, -11321, 12213, -10084, 3886, 7814, -12562, 11805, -4705, -871, +2505, -5200, 2543, 2110, -7836, 3, 6850, -8532, -337, 560, -1620, -4286, 9318, -16562, 12770, -13145, +2744, 4141, -3103, -367, 1365, 5344, -4753, 10904, -759, -6977, 12882, -4593, -2358, 7568, -8026, 6188, +2322, -8248, 12009, -7288, 6520, -5592, 5319, -3433, -822, 8922, -10923, 6004, -10439, 8412, 493, 200, +-10036, 12347, -8377, 5572, -13089, 12466, -15971, 10798, -8898, 2251, -2702, 871, -1789, -2138, 1504, -1280, +1665, -9211, 15411, -21625, 16333, -4084, 2739, -3400, 6313, -1416, 7938, 4589, -6481, 12067, -6547, 9453, +-2122, -10739, 16682, -6843, -5779, 10856, -3133, -5490, -131, 3118, -42, -6623, -224, 4190, -4334, -10452, +14286, -6099, -4261, 3246, -2500, -1351, 2141, -3912, 1452, -4753, 2686, 3012, -5229, 2204, -1795, -779, +12284, -15755, 13311, -3080, -7341, 13725, -4204, 3585, -7617, 10199, -7332, 9416, -11384, 12791, -7104, 583, +7466, -11176, 14633, -12606, 4763, 3483, -3415, 5066, -7430, 5634, -7337, 5575, -11316, 16068, -14172, -4070, +8200, -9988, 3178, -283, -6290, 4679, -1811, 7534, -4437, -3716, 8765, -1902, 4308, -4758, 8234, -5023, +-1692, 1951, 6921, -4213, -769, 3871, -1316, -265, 3647, -4312, 5575, -17308, 21654, -21526, 14515, -11500, +11203, -7176, 3836, 1136, -2431, 3909, -10221, 4274, -2179, -1142, 3256, -6389, 3920, 3604, -5872, 2838, +4070, -4567, -798, 5776, -12177, 10521, -8699, 1670, 4378, -8078, 6319, -881, -1190, 6334, -7453, 11506, +-9313, 7899, -3963, -1966, 6029, -154, -2048, -2754, 6969, -4219, 2983, -4502, 4882, -4336, 1709, 154, +-4573, 3558, -5347, 7545, -7845, 7312, -2688, 1650, -2871, 1365, 3714, -5900, 86, 4855, -9829, 6889, +-5174, 6923, -7058, 6348, 374, -11321, 13914, -10856, 6598, -1477, -7020, 6634, 3968, -7165, 9228, -9242, +10289, -4392, 482, 7486, -1435, -5277, 5975, -2480, 253, 454, 2570, -7206, 8315, -5203, -1162, 7429, +-7914, 3856, -2968, -4510, 6041, -10298, 5882, -4161, 3060, -3460, 687, 226, 1009, 4097, -10706, 4749, +226, -3991, 1878, -2652, 4443, 57, -6286, 9606, -5416, -5476, 9945, -1440, -5146, 10868, -13967, 16455, +-8567, 3203, 6850, -3331, 6419, 2882, -5304, 8244, -8533, 9831, -12276, 9246, -1908, -6227, 5573, -4322, +5716, -10260, 9149, -13938, 13864, -12324, -3740, 7693, -6363, 286, -3823, 1695, -647, -1753, -2144, 996, +8612, -17105, 10647, -4346, 2849, -4046, 7233, 1935, -6528, 16425, -19107, 22823, -15178, 5823, -1474, 511, +6215, -938, -3813, 2664, 4757, -641, 5854, -4884, 7525, -1651, -8093, 10182, -4894, 1552, -2910, -5670, +1404, -3311, -1665, -3983, 4979, -11407, 2285, 2775, -8809, 7597, -5101, 738, 1063, -2711, 2542, 5484, +-3619, 4342, -3080, 7893, -6259, 5529, 2434, -25, -4330, 9934, -6706, 8563, -526, 3408, -4772, 7025, +-2817, 2343, -3890, 955, -1320, -11447, 10259, -4141, 795, -4737, 3881, -6457, 7887, -6513, 3938, 2944, +-7582, -3536, 8941, -10405, 10423, -17787, 11059, -5250, 4724, -1445, 3416, -4151, 2136, 297, 2097, 5001, +-4574, 2553, 4305, -8345, 17419, -8238, 3660, 5078, -11048, 5405, 493, -3146, 7531, -8312, -815, 2577, +-4346, 11889, -15795, 15604, -14661, 4269, 1705, -5605, 270, -1465, -3157, -1353, 3360, -2596, 5795, -6775, +-589, 6813, -9334, 11772, -8360, 5209, -5989, 6171, -5337, 11549, -8484, 3353, 1065, -3862, 8065, -2314, +3975, -390, -3828, 11806, -13254, 13331, -1378, -2078, 2545, -3769, 9512, -7757, 1020, 662, -10550, 10815, +-4786, -2606, -6, 672, -2776, -909, 4409, -6711, -2412, 7502, -7029, 962, 3237, -3134, -345, 419, +-6162, 6687, -2998, 5510, 900, -9286, 11451, -4455, 836, -3405, 10816, -7068, 2151, 3280, -3501, -1984, +2402, 532, 674, -734, 2752, -1261, 4267, -3536, -4211, 9634, -11033, 13692, -16076, 17883, -10420, 143, +5250, -5325, -918, 1758, -3870, 2303, -210, -4268, 3062, 1713, -6555, 11615, -12775, 7932, -325, -5636, +2673, -1611, 2243, -1944, -1234, 806, 5801, -3983, 1722, -5112, 3118, 1635, -3636, 4720, -3522, 573, +-1755, 7371, -3144, 364, 2783, -2, 1785, -8460, 5602, 454, -4850, 6203, 594, -2788, 6091, -6792, +4980, -1054, -4923, 9021, -7041, -2473, 4761, -4800, 792, -1282, 1926, 510, -1181, 1291, 3846, -10806, +8523, 420, -7323, 6389, -6939, 4007, 3508, -5548, 4169, 2988, -8319, 6256, -1723, 540, -162, 493, +-7967, 15785, -8878, -532, 4399, -6993, 5939, -3357, 3684, -522, -2340, -944, 7, 3580, -3692, 5713, +-9913, 4301, 2974, -585, -1587, -880, 8704, -10692, 5253, 1351, -2674, -1600, 1681, -764, 217, -893, +388, -2858, 4339, -28, 5374, -2099, -299, -354, 1316, 2374, -2533, 4060, 270, -1456, 8674, -11219, +11506, -5256, -863, 3638, -10382, 7220, -3340, -1248, 714, -2562, 1426, -3817, -3656, 10500, -13953, 3272, +5934, -11224, 3447, -47, -3571, 3772, -4573, 6998, -2856, 9460, -11624, 11978, -12838, 11797, -1603, -3098, +5345, -4787, 1378, 1186, -401, 3182, -1511, 309, 3978, -2871, 6627, -7114, 7511, -4781, 3164, -1663, +2824, -643, 958, -2635, -2272, 3264, 2799, -10826, 2946, -2054, -1412, 1518, -30, -3629, -2374, -1809, +2039, -1212, -5641, 9261, -10696, 6473, -3949, 2887, 6213, -11971, 17937, -17278, 10587, 5149, -4598, 2340, +2596, 1792, -2408, 3991, -2896, -3454, 11906, -17417, 17374, -14099, 2764, -2, 2155, -1443, -2420, 2628, +3016, -2000, -2794, -381, 1763, 2630, -7056, 11675, -12344, 8247, -4715, -2037, 1149, 1432, -5275, 7100, +-8223, 8801, -12711, 10764, -2822, -4671, 6405, -4097, 5294, -5897, 2611, 183, -4894, 14068, -8499, 813, +2144, 3725, -4254, 10508, -12029, 14691, -8447, 430, 7611, -10084, 4919, -2752, -4652, 3784, -5577, 1072, +5953, -17499, 11946, -8229, 41, 3026, -7822, 8527, -8717, 8702, -2034, -1338, -980, 4169, 139, -4249, +12104, -12669, 7488, 405, 1893, 1627, -3287, 11775, -1615, -3962, 5567, -5337, 7991, -4749, 1228, 2938, +-2562, -158, 4582, -6876, 4272, -5643, -4502, 4841, -5539, 3828, -11631, 3329, 629, -10836, 10505, -4589, +-9245, 4354, -7783, 3760, 133, 753, -4707, 4167, 467, -1234, 9080, -1380, -3192, 9965, -8659, 11618, +-881, 1213, 3183, -1070, 3758, 294, -4461, 9764, -5508, 1297, 733, -869, 2071, -3445, -2788, 4804, +-2766, -5158, 6687, -7132, -2236, 1029, -758, -4728, 5604, -8709, 8534, -8490, -701, 4730, -8771, 4373, +4718, -13043, 6167, -517, -980, -606, 1860, 3784, -4428, 5513, -1034, 4865, -3255, 3886, -4831, 9024, +-3905, 5497, -2703, 4210, -4436, 11825, -12775, 7317, -433, -9007, 6430, -1574, -3430, 3469, -4830, 2505, +190, -4067, 6239, -3949, -3416, 4088, -6206, 4714, -3265, -2159, 7306, -6173, 6292, -6279, 2586, -3488, +6109, -1734, -541, 7967, -10510, 8110, -7369, 10289, -6503, 447, 2723, -841, -1949, 372, 4210, -1680, +-7355, 8495, -2638, 20, 5679, -11259, 8418, -1264, -3071, 8305, -6683, 1654, 677, -6436, 5960, -5669, +5010, -8897, 2713, 2978, 902, -7617, 12975, -6993, 1918, -236, 5376, -1621, 3258, -2712, 3345, -2732, +3976, -4989, 5882, -6438, 4607, -1777, -3624, 6910, -8195, 5199, -2989, 1395, -1868, 331, 718, 165, +-779, -4699, 6635, -5066, 2843, 713, -5783, 880, 1254, 3692, -5112, 4272, -4463, 6275, -5648, 5476, +2667, -6384, 3925, -7836, 3293, 199, 2694, 2912, -12916, 8965, -154, -3285, 5337, -3604, 1156, 1402, +1378, 6507, -6750, 1569, -599, -3525, 8961, -4840, -1705, 4888, -13067, 7630, -938, -5354, 9742, -6186, +1530, 3704, -1031, 2916, -1611, 2112, -2253, 6865, -9593, 12174, -4337, -4177, 4174, 1152, -5803, 5237, +-4824, 2184, -4051, 486, -1000, -1721, -3278, 2648, -10699, 4976, 3754, -7792, 900, -291, -2925, 791, +2212, 663, 1326, -5335, 10711, -3503, 5265, 904, 981, 3272, 1174, -3794, 10917, -5775, 2969, -807, +-1966, 8346, -5864, 836, -1006, 2155, 2610, -1404, -3016, 8055, -9671, -1414, 1766, -3987, 604, -2353, +-2180, 289, -7307, 3946, -5896, 4094, -9683, 7507, -4988, 413, 4035, -6527, 1799, 1912, 215, 2003, +2290, -669, 7225, -5137, 2536, 5771, -2320, 2538, 1869, 1447, 4107, 1214, 2543, -4133, 2286, -2764, +3293, -1714, 1133, -4114, -4671, 5362, -11852, 8844, -12552, 6473, -4327, 3166, -3842, 3151, -3943, 1021, +-3612, 7109, -8728, 4017, 4395, -7458, 8813, -7642, 3232, 5519, -9233, 7942, -4762, 4554, -975, -2172, +-589, 8302, -4815, 5173, -1307, 2320, 4545, -5427, 3129, -1065, -3513, 3319, 1794, -4608, 459, 375, +1152, 793, -2047, -1819, 216, -3139, 1476, -2121, -5901, 5253, -4739, -2682, 3738, -4806, 3804, -6755, +1307, 2379, 7942, -6521, 8848, -3288, 1031, 4627, 1234, -1285, 807, 3886, -1932, 671, -280, -2146, +2975, -3125, -1009, 206, 3970, -9317, 6210, -5435, -207, 4765, -6920, 3438, 1363, -7723, 7346, -6406, +1089, -2304, -616, 3885, -3826, 3363, 5282, -9189, 8457, -1809, -4788, 4925, -4795, 5098, -1520, -2218, +2948, -2630, 6915, -3872, 554, 6893, -10341, 14524, -7402, 6818, -3527, -2272, 8335, -3808, 985, -1088, +1327, -9717, 4630, -4177, 1335, -2126, -2747, -4560, 1339, 4426, -3297, -1293, 503, -3541, 6270, -4021, +4070, -1482, -2410, 7475, -3778, 2605, 2369, 2421, -5862, 7879, -2664, 8635, -5097, 1162, 2374, -10655, +15908, -9921, -4078, 11312, -15435, 6433, 2218, -4856, 5250, -6387, -3823, 6106, -2105, 1238, -141, -1593, +6052, -6571, 2339, 3001, -4448, -1588, 1854, -1249, 482, -928, -1758, -733, 1518, -270, 39, 1389, +5528, -2982, -4473, 10674, -10502, 5107, 1501, 2295, -6229, 2377, -3254, 3103, -784, 471, 408, -5633, +5023, 967, -1432, -1515, 3496, -3781, -1676, 1275, -1107, 6343, -10027, 9533, -8490, 7808, -1050, -1317, +5218, -4513, 138, 9547, -5669, 485, 2364, -1913, 6251, -7259, 2960, 4310, -11508, 4681, -5590, -868, +1372, -4705, -604, 1998, -4325, 88, 2936, -1802, 1288, -1983, 779, -3952, 4140, -4695, 3590, 870, +-4346, 3697, -1228, 3248, 1760, -4009, -3089, 5030, 647, 1801, -2610, 3434, 3474, -6673, 6987, 3508, +-5835, 1059, -1462, 6768, -2085, -1975, 1945, 1402, -4656, 2217, -573, 274, -2615, -1000, -1476, -4596, +3988, -6702, 1816, -1549, -420, -5485, 3854, -9058, 4148, 4608, -9320, 7342, -4612, 5141, 1734, 217, +3144, -4660, 3627, 6896, -2092, 3214, -1186, -255, -154, 4854, -5299, 7393, -5292, 1116, 95, 5457, +-3569, 293, 2416, -8859, 6405, -1373, 3013, 318, -6746, 2272, 2534, -2992, 4321, -3525, -31, 2294, +-3970, 740, 1984, -7224, 4538, -2852, -6213, 7559, -7025, 292, -5410, 2954, -4715, 5703, -5056, 2466, +1655, -6601, 7087, 7345, -9307, 11514, -6794, 3478, -1858, 1078, 7569, -6004, 1464, 62, -8486, 10511, +-1098, -5476, 6550, -7567, 3525, 7540, -4558, -209, -1612, -1694, 2838, 1767, -3529, 3275, 749, -9105, +11715, -5388, 2214, 5072, -11055, 6218, 1669, -2674, 5577, -5333, -860, -3735, 1292, 1016, 42, -2616, +-4283, -274, 2571, -1799, -2131, 171, 3366, -4227, 4678, 3726, -2047, 1634, -109, -4756, 8660, -4268, +1805, -3687, -3734, 5442, 1031, -4766, 4536, -2608, 2916, -677, 3220, 3995, -9247, 10996, -5227, -1212, +7037, -6421, 7230, -1729, -4506, 3602, -5447, 3891, -2526, 3909, -3576, 2403, -755, 4203, -5577, 2063, +582, -6048, 1887, -2266, 2305, -3205, -5844, 5641, -7102, 7972, -1373, 1625, -3653, 5878, -1094, -1661, +4980, -1722, -1281, -789, -139, 1679, -4249, 8092, -13300, 6528, 3513, -7187, 1503, 2469, -1671, -4436, +5194, -1466, 5300, -9109, 6176, 4471, -8116, 8186, -4400, -68, 1058, 739, -3, 4807, -1582, -2769, +6731, -5587, 5486, 3061, -5326, 715, 847, -3047, -37, 1430, -3746, 3358, -6967, 8125, -5999, 163, +1702, -3052, 6308, -4986, 4426, -2469, 3479, -8506, 7349, -9449, 3753, -4141, 3447, -3576, 1984, 1467, +-2174, 5236, -5883, -991, 11838, -11815, 7521, -2363, 131, 3062, -6358, 4742, -1986, 648, 1577, -1430, +-4175, 4849, -3329, -532, 700, 3498, 2805, -1196, -342, 3592, -774, -4795, 2582, 2406, -5789, 4931, +311, -7328, 10564, -9761, 11616, -26, -4487, 4327, -4067, 3289, 1882, -7682, 2058, 1088, -3579, -364, +811, -6072, 2169, 2771, -14247, 9776, -2732, -4548, 5006, -4376, 4840, -2325, 710, 5187, -11001, 9482, +-3076, -3947, 6528, -6808, 537, 6714, -3093, 2628, 1743, -730, 158, 380, 6753, -8752, 7782, 1243, +327, 4230, -5037, 7875, -4758, -1931, 5479, -4247, 2658, -1760, -3947, 3404, -4263, 5699, -3590, -3759, +1433, 963, -5044, -692, -4376, 750, 1378, -5861, 5580, -7645, 3424, -3181, 6967, -4705, -2941, 5197, +903, 1649, 589, -527, 1718, -2536, 4539, -3991, 2836, 1175, 427, -449, -931, 2030, -1247, 2054, +-5936, 3686, 2894, -1007, -1668, -4683, 8945, -4092, -3111, 11057, -8015, 745, 3545, -4375, 93, 3256, +-3229, 2349, -1664, -2197, 7846, -11118, 6508, -1014, 454, 52, -2101, 1971, 1101, -7274, 4325, -2581, +-2121, 735, 1207, 2863, -221, -1709, -2281, 6991, -7201, 6532, -6411, 488, -3896, 5665, -3818, -190, +3605, -9465, 7555, -784, 890, 2974, -10294, 3067, 5372, -5164, 5203, 1845, 1542, 122, -4700, 10115, +-4094, -1324, 3709, -3013, 1576, 1065, -5335, 7302, -6836, 2450, 2071, -4388, 5304, -8323, 7779, -6465, +-4776, 8411, -12391, 14360, -14892, 8616, -1974, -4617, 5575, 180, 953, -3917, 8044, -7267, 6822, -1888, +2526, -2067, -2295, -459, 5059, -4918, 1553, 288, -3938, -39, 585, 2831, 3566, -9157, 8825, -3352, +403, 3978, -2643, 1338, -3376, 578, 7841, -2732, -1806, -1762, -2732, 2766, -1104, 5830, -12832, 8355, +-3215, -5098, 8139, -5412, 4298, -2327, -5544, 5667, 2629, -7568, 5401, -4181, 2253, -79, 2887, 2358, +-3837, 6084, -5519, 5777, -4026, 1201, 1873, -3401, 1765, 2066, -4996, 5829, -3978, 2023, -2923, 2159, +537, -2950, 847, 1407, -7459, 4031, 3023, -1886, -726, 408, -2364, 788, -478, -1508, -507, -537, +4345, -7914, 4889, 2398, -1714, -3901, 6033, 406, 396, -3607, 8956, -8855, 1850, 7133, -1269, 6052, +-6409, 2353, 309, 640, -386, -1834, -1346, -944, 449, -1482, -23, -2241, 4918, -9735, 231, 4230, +-4305, -2497, 929, -2214, 6115, -9301, 12954, -7109, 7215, -3237, 1904, -825, 922, 677, 793, -2647, +1417, 6280, -7520, 6653, -1431, -5926, 6460, -5077, 2928, 5381, -10316, 5489, -3958, 2187, 983, -3835, +3202, -1534, -403, 314, -1194, 3491, -1844, -873, 4339, -1524, 1137, -2613, -345, -2890, 522, 3770, +-2572, -5500, 13255, -12877, 5442, -2143, 3455, -1858, -5703, 6430, -149, -4027, 4412, 4172, -5451, 5567, +-6957, 9261, -1680, -2931, 2494, -4996, 1336, -1897, 745, 1031, -2275, 3930, -1784, -3498, 3817, -2087, +-752, -4592, 4258, 1544, -4324, 4199, 248, -2619, 2689, 2718, 2067, -1123, 1995, -7443, 7951, -2769, +-1805, 2635, -4725, 3360, -3284, 5028, -1990, -3128, 1947, -2970, 675, -201, -2023, 4259, -10289, 8062, +-1292, -595, 2600, -4874, 1237, 648, 3061, -1928, -88, -2732, 3510, -3501, 3244, 280, -2945, 4690, +-5740, 3856, 883, 835, -796, -1862, 6556, -10793, 11225, -4368, 4579, -3656, 2383, 1680, -837, -2763, +3709, 573, -4470, 9750, -9317, 724, 1712, -5997, 7124, -8748, 5098, -1472, -1717, -2164, 2022, -5043, +3187, 364, -3946, 7666, -8537, 4142, 858, -5402, 4249, -343, 933, -2204, 2305, 1319, -3270, 3988, +-4720, 6221, -5828, 5830, -3797, 4921, -3857, 2684, -1559, 5001, -4342, -633, 6343, -1729, -62, 2304, +-4389, 8272, -5107, -209, 1680, -259, -291, 336, -4734, 915, -210, -1842, -380, -496, -65, -4652, +1009, 1470, -6313, 2051, -1750, 299, 1443, -4010, 4191, -3, 5649, -5468, 3946, -1264, -1976, 1763, +-1118, 2451, -2066, 4141, -2015, -749, 3561, -568, 4030, -6499, 6642, -6094, -641, 1903, 2487, -8721, +8535, -6058, 7247, -3156, 4734, -4327, 1621, -284, -1437, 3738, -2977, -2377, 3718, -3284, -91, 5757, +-3828, 870, -4244, 1059, 1646, -1486, 1218, -5639, 3161, -487, -3578, 5883, 61, -3235, 3205, 26, +-1086, 3226, -4306, 793, -564, 327, -1408, -2128, 3658, -3478, 1814, -3888, 2955, 784, -2672, 2362, +-3566, 5964, -4736, 2412, 772, -671, 293, 541, 1612, 3527, -3186, 4577, -1268, -832, 257, 569, +1554, -2277, 447, -2435, 1267, -763, -2243, 4554, -6246, 2518, 3240, -8707, 6265, -4486, 1869, 1954, +-2746, 1253, 1021, 1828, 1331, -997, 1249, -2959, 648, -1732, -1390, 839, -1766, 550, -4019, 6149, +-2090, -2325, 823, -207, -4027, 5621, 845, -2063, 2894, -7715, 3966, 4409, 444, -370, -3605, -110, +3963, -2110, 2073, 1862, -6264, 5833, 2298, -5223, 6836, -3265, -2262, 540, -1763, 4395, -3147, -1491, +3923, -4679, 3888, 3327, -7519, 2857, 0, -1103, 987, -294, -1503, -371, 2809, -4907, 936, -525, +2046, -2353, -125, -4312, 2335, -6463, 10406, -6567, -425, 2909, -517, 4216, -818, -2548, 5154, -3384, +1264, -2265, 3643, -2117, 3012, -5199, 949, 2863, 61, 2209, -4940, 3880, -2702, 6407, -3963, 6901, +-9782, 1813, 1070, 3709, -1157, -2887, 1213, 13, -1491, 1753, 2626, -3277, 5005, -7026, 4437, -2392, +2000, -1658, -2410, 1241, -2732, 4085, -3870, 1620, -5204, -328, 5596, -10304, 5330, -1572, -4654, 7773, +-3617, -66, 1501, 5363, -3643, -52, 1097, -205, 4647, -1348, 1118, -3518, 1064, 5594, -2606, 4581, +-115, -2311, 4885, -3443, 2151, 2009, -2159, -1479, 910, -6120, 10942, -7366, -1375, -4736, 3604, 323, +480, 1705, -7501, 942, -2368, 4347, -3196, -1700, 1079, -6161, 5703, 3424, -561, -3081, 774, 5, +551, 2067, -801, 4203, -5577, 2591, 1133, 2621, 1815, -1346, 1886, 1558, 609, -978, -1349, -2907, +-604, 2204, -3736, 3676, -1225, -7037, 8116, -84, -3765, 3997, -2650, 1133, -907, -437, -3857, 2218, +185, -2897, 3440, -2650, -677, 4669, -4118, 253, 3733, -1855, -850, -321, 3925, -4468, 5944, -2140, +-1305, 1228, 3061, -789, -5720, 6000, -2770, -481, 4596, -5402, 3457, -105, 197, 1044, -1398, 606, +-94, 18, -3966, 3760, -5367, 4447, -7138, 1438, 861, -3385, 3479, -1496, 74, 2330, -4040, 5218, +-699, -1292, 2984, 176, -1189, 1353, -1067, -3051, 4496, 220, 1950, -5391, 4851, -3028, 3387, 42, +4685, -5287, 3622, 4312, -4288, 280, 1516, -2978, -422, 3203, -4946, -2029, 6264, -5044, -379, 180, +879, -823, -2267, -430, -986, -1311, 4845, -9073, 2164, 1167, 609, -4880, 624, -606, 1201, -1479, +-1908, 1535, 1848, 590, 868, 1223, 4820, -2124, 4894, -1518, 2252, -1, 5153, -3866, 2320, -4276, +3787, -1036, 1503, -1121, -469, 1699, -1974, 6098, -10371, 10187, -5248, 699, -1904, -2374, -1482, -1695, +-594, -613, 1138, -1549, -1748, 2534, -2634, 2436, -5093, 3469, -1655, -5245, 5116, -3333, -2097, 5216, +-2630, 2126, 1302, 443, 560, -3396, 2858, -2124, 6193, -4107, 1965, 2823, 753, 4608, -1781, 2316, +1809, -2804, -512, -1494, 2442, -1637, -2209, -551, -2881, 5975, 3056, -7972, 2725, -1104, 1690, 69, +-1850, -953, -1799, -3124, 5388, -3177, -1241, 3022, -3963, 3939, -2897, 806, 1780, 789, -5000, -1736, +3880, 1275, -918, -944, -3425, 1154, 5926, -5461, -71, 3573, -1530, 1215, 318, -3438, 5536, 446, +-1378, 5054, -1553, 675, 3254, -2240, 1563, -6077, 4889, 1046, -5340, 3506, -5534, 2455, -3517, -425, +2774, -4322, 3360, 745, -5364, 5544, -3501, 2664, -1685, -1030, -1384, 2551, -1540, 1384, -1714, -521, +1877, 3415, -4674, 4812, -4257, 4919, -1894, 2240, -2330, -600, 6813, -7085, 7085, -5068, 2770, -3812, +-381, 1552, -3907, 3619, -805, -2853, -1053, 6232, -5805, 7893, -5895, -4788, 11035, -10037, 1926, 671, +-7029, 8512, -313, -1133, -1673, -1849, 5304, -4504, 3748, 1453, -3493, 7666, -4153, 1218, 2732, -199, +2453, 86, -1576, 60, 442, -3808, -103, -4148, 8907, -8425, 10273, -12135, 11738, -6904, 4095, -3289, +-1079, 1026, -3773, 4757, -7433, 3784, -1894, -490, 3704, -5045, 6767, -4356, 147, 1412, -1345, 341, +-196, 418, -1558, 2931, 7133, -7648, 173, 1176, -5119, 3167, 3862, -7355, 4390, -4742, 2604, 1157, +4450, -1716, -4844, 9489, -2934, -165, 3084, -5401, -3502, 9179, -6082, 2558, -1888, -3132, 1791, -1632, +3692, -3968, 5588, -4026, 66, 2421, -6075, 7105, -6799, 919, 580, -42, 2984, -1074, -566, 1275, +-2489, 5808, -5956, 4892, -759, -2638, 2790, -1402, 750, -152, 1603, 718, -71, -1504, 2635, -180, +-6402, 4215, -4519, 893, -1077, 4060, -5566, 7306, -9130, 4613, 577, -805, 3444, -6550, 1312, -2529, +-469, 3721, -6959, 5056, 3523, -5504, 4841, 1611, 677, 301, -3215, 5445, 1074, 865, 805, -6499, +9603, -5044, 4211, 3222, -9771, 7608, -3619, -1802, 2267, -5456, 2484, -1374, -2800, 4213, -5495, 6925, +-5688, -3396, 4715, -2698, 1485, -1680, 7, -4195, 5644, -4988, 2046, 1147, -4051, 8263, -5999, 4831, +95, -4032, 3636, 772, -3168, 1821, 2400, -860, -1857, 1933, 287, -648, 4104, -2750, 5217, -4380, +4975, -4591, 153, 5262, -3434, -230, 6259, -6421, -4502, 11400, -16386, 10725, -4114, -8406, 8878, -5570, +1156, -2042, -514, 185, 2446, -2262, 4870, -5732, 4741, -4031, 4432, -3864, -653, 4676, -3720, 4225, +-2613, 2042, 1527, -3144, 4182, -2970, 5664, -1649, -1252, 1033, -2167, 2606, -2201, -1103, 1937, 1431, +1622, -1842, 710, -3096, 4118, -7, -3416, 4140, -1884, 273, 2679, -2500, 1894, -2461, 2716, -4075, +-2194, 1472, -5820, 3992, -2271, -4516, 5557, -1564, -108, 3629, -3675, 2794, -3513, 485, -792, -3067, +5271, -5871, 4155, 3649, -5378, 4885, 3017, -4232, 3634, 187, -2335, 5927, -3505, -650, 1144, 1229, +2339, -2135, 6458, -11375, 10306, -6114, -983, -745, -323, 1729, -2756, 4698, -3904, 4499, -890, -2847, +4681, -5184, 1458, -4530, 928, -4320, -302, -628, 1995, 769, -5280, 4196, -2531, 2713, 2122, -4259, +3820, 2693, -6037, 5675, -3026, 4024, -1921, 2291, -2188, 3762, -2514, 1005, -158, -1281, 3846, -2615, +115, 6077, -10536, 8276, -4186, 844, 2379, -5131, 2320, 423, -1248, 1593, -1409, -26, -4011, 3340, +-743, -1050, 5963, -8321, 4245, 2388, -6402, 8044, -8563, 2039, -2267, -1826, 703, -200, 633, 1006, +-131, 4025, -2102, 2960, -2406, 2504, -1658, -4499, 9527, -7448, 4610, 4792, -8935, 5604, 2372, -4447, +4931, -5110, -2010, -1028, -2752, 6104, -2277, -283, 2833, -3961, 6802, -8094, 5054, -3156, -294, -856, +-496, 3836, -4022, 2363, -1030, 1336, 7234, -8132, 6620, -2480, -6217, 8412, -5658, 377, 1789, -3578, +3822, -3314, 3554, -173, -2844, 2997, -4869, 4680, 560, -2259, -202, -44, -859, 1863, -1225, 2960, +-4452, 5955, -7138, 5989, -9979, 3197, -663, -1359, 942, 2280, -3080, -2626, 4855, 677, -3100, 4186, +-1263, 2230, -921, -44, 1639, -3004, 3626, 771, 2805, -2289, 1999, -884, -1146, 3454, -1365, 534, +1107, -2437, 1573, -5483, 5377, -7565, 6753, -6431, 1781, 1261, -1011, -1858, 866, 566, -4138, 5689, +-2687, -686, 4005, -3610, 3331, 580, -1133, -5024, 2988, 1527, -3498, 481, -2414, -1826, 2062, -1109, +4453, -1821, 3954, -5537, 8049, -5924, 4059, -3420, 1543, -2238, 6002, 2534, -10340, 12911, -10410, 7322, +-811, 578, 393, -4758, 3442, -2112, -2833, 2298, -501, -3377, 5058, -49, -1945, 3360, -7967, 7340, +-3323, 70, -820, -821, 1986, -2378, 2359, 1355, -3140, 4288, -5912, 6358, -8000, 3915, -3723, -5165, +5998, -7574, 6037, -444, -2313, 4976, -4341, 6855, -5137, 2862, -619, 2574, 2586, 95, -3210, 5776, +-2214, 2911, 2548, -4594, 4660, -5553, 2904, -3599, 1201, 216, -3467, 4836, -2819, 1296, -1125, -1811, +645, -3623, 6760, -3707, -4747, 5673, -7568, 8364, -2207, -1534, 2369, -797, -1848, 7628, -6629, 2383, +-2340, -1079, -566, -3008, 8500, -11801, 1613, 4562, -3329, 3618, -2936, 3405, -1855, 454, 3525, -808, +4699, -4565, 2789, -653, -1395, 2110, 2227, -6261, 7984, -8020, 5204, -2264, -383, 1559, -2747, 3634, +-5027, 3798, 1590, -3319, 6454, -6520, 3052, 895, 603, -3628, 1855, -1865, -294, 671, -2502, 4164, +1038, -3445, 5069, -6356, 7079, -8811, 6187, -6531, -105, -844, 637, 1770, -5755, -721, 1670, 4225, +-2446, -923, 1591, -4282, 2499, 6221, -3358, 5473, -1548, 1404, 2552, -3450, -821, 2131, -7171, 8799, +-3602, 2228, -3463, 2136, 1302, -4046, 5842, 778, -1836, 3215, -4029, 1190, -391, -2794, 3744, -803, +-201, 2652, -2165, -257, -3852, 970, -115, -2184, 3473, -3309, 1121, -2173, 1101, -3202, -4007, 7834, +-8505, 3689, 789, -4763, 7136, -6271, -236, 4002, 700, 3108, 1491, -3202, 5470, -1780, 638, 1664, +-1005, 1082, 2066, -1673, -2726, -3139, 6235, -4342, 3050, -3944, 4767, -1981, 1912, 3457, -3830, 2838, +-3668, 5281, -2315, -2497, -1278, 1165, -3241, 4405, -2082, -1063, 933, -3186, -30, -113, -1800, 1084, +-2461, -2635, 3482, -13, -811, -1748, 1931, 957, -2832, 3633, -1743, 4506, -4870, 4665, 1710, -202, +1942, 515, 912, -1196, 4560, -1801, -4919, 4582, -7492, 1330, -514, 2285, -4715, 813, -2364, 2831, +-28, 2524, -2114, -66, 4346, 784, -4771, 2795, -1670, 653, -529, 299, 763, -482, 1266, -1981, +540, -1865, 2909, -1140, -1287, -2270, 7582, -5956, 1150, 3444, -3646, 697, 2451, -2140, -774, 485, +-735, 1538, -5955, 4829, 1899, -277, 3590, -3894, 703, 212, 665, -1917, -3105, -789, -1845, 3614, +-7796, 3762, -115, -4376, 7512, -1986, 2648, 1210, -4054, 5735, -4334, 2504, 4199, -2241, 2819, -4099, +716, 2395, -1272, 1, 881, -1220, -173, -2586, 2340, -2159, 1293, -638, -2865, 7039, -3215, 687, +1995, -5315, 4441, -7882, 9742, -4988, -212, 3111, -4450, 5199, -1351, -622, -469, 354, 3288, -8062, +6300, -7596, 1525, -987, -3967, 2970, 1700, -5862, 8220, -4584, -590, -270, 2138, 2784, -2979, 986, +4316, -1057, 2702, -3619, 3956, 105, -2372, 5044, -10515, 12025, -10487, 2178, 4317, -8292, 12308, -5863, +-1755, 8290, -6237, 4053, -561, -1955, 1748, -1176, -1627, 2528, -2281, 2706, -4916, 3710, -4405, 3038, +-1737, 160, -2237, -3353, 57, 490, -5313, 2752, -4249, 3424, 546, -394, 205, -1967, 2022, 728, +4967, 1212, -3173, 3491, -2125, 6790, -1768, 1327, 1302, -288, -604, -1457, 1249, -3314, 99, -1364, +658, -1665, 4403, -6667, 6367, -961, -5951, 6856, -1863, 5532, -7298, 2018, -590, -8, -535, 2551, +-4845, 4996, -5830, 4862, -3954, 2415, -629, -4627, 2357, -4560, 4107, -919, -4587, 2543, 1212, -1937, +3702, -594, 905, -200, -1620, 2681, -807, 1388, 2271, -1121, 3128, 2984, -1220, 2138, -1322, -1984, +1136, 141, -5373, 4776, -8266, -434, 1854, 726, 2984, -2106, -3516, 4524, -3040, 2798, -178, -776, +1012, -910, 483, 3844, -6058, 3367, 133, -1718, 2829, -2497, 1382, -3823, 4747, -10108, 11757, -6275, +1176, 4345, -8161, 4137, 1877, -2712, 1849, -2465, 3988, -212, -3342, 2442, 302, -42, 284, 1167, +2041, -2805, 3959, -3639, 128, 109, -2662, 2289, -4702, -633, 1966, -6295, 6425, -4656, 3008, -188, +2595, 127, -733, 216, 3728, -3231, 3541, -2589, 507, 3680, 4350, -7088, 2926, -672, -246, 1661, +366, -5423, -148, -168, -1504, 3522, -821, 37, -1156, 834, -3968, 4113, -2325, -6886, 6230, -1978, +-377, 3711, -2581, 377, -972, 856, 5568, -3143, 1658, -5020, 555, 4373, -3178, -1070, 2363, -899, +6154, -4403, -1728, 1408, -185, 2388, -4330, 6255, -1561, 2716, -1078, 2243, -3990, 5156, 234, -2633, +684, -1491, -1528, 3293, -7779, 3619, -4563, 2925, 335, -2814, 4785, -4996, 1717, 1233, -3067, -2459, +5103, -851, -343, -716, -1493, 3828, -3629, 7327, -5015, 582, 370, 852, -519, -936, 787, 521, +-2601, 4245, 356, -351, -885, -1960, -2119, 6695, -335, -3968, 27, 1515, -333, 2847, 2269, -2218, +-3749, 2348, 3720, -511, -1605, -1482, -2067, 473, 2905, -5524, 1615, -2880, 2529, -3753, 3678, -231, +371, -1590, 619, 1358, 572, 2587, -6872, 3939, -2207, 1374, 2716, 1334, -3876, 2063, 1201, -2676, +3149, -2402, 2068, 381, -782, -505, 2363, -3527, 2343, -1234, 2007, -3954, 369, 752, -4845, 2054, +-735, -108, -1067, 585, -1421, 6416, -4330, 2037, 199, -521, 115, 3138, -5712, -929, 6940, -9060, +6513, -2505, -277, 4564, -3064, 4909, -2765, 2329, -1893, 983, -352, 1172, -2261, 2469, -1622, 3037, +-6037, 3013, 427, -5994, 5677, -3231, -3, 97, -1567, -3300, 6659, -2705, 1254, 1428, -5442, 4485, +-4206, 2532, -2091, 2196, -2407, -1118, 4453, 1282, -4284, 2702, 3069, -4256, 8588, -3284, 147, 1573, +-1332, -2291, 2397, -153, -3017, -835, 1104, -5204, 5931, -978, -2611, -2109, 5064, -2655, 1456, -965, +-2454, 1162, -647, -3419, 6371, -5372, 4936, -398, -1763, -35, 3101, -4046, 590, 2119, -161, 1317, +-600, 1481, 3483, -3923, 2475, -2102, 3632, -1955, 1882, -5008, 600, -2512, 2538, 651, 1598, -2044, +-643, 936, -2882, 2325, -1554, 110, -5717, 7984, -6086, 2290, 1021, -2715, -1092, 832, 2306, 967, +2615, -5669, -1311, 7931, -10380, 8141, -4283, 4787, -2989, 1117, 2277, -1998, -2493, 197, 818, -773, +3755, 76, -4778, 5426, -6002, 6682, -977, -51, 3374, -5746, 2465, -3516, 2043, -299, -5185, 5837, +-2750, 6596, -5664, 2455, -2936, 1175, -1791, 4819, -4458, 328, 1656, -3896, 3847, -4710, 7287, -6045, +1108, 4815, -7849, 4026, 3062, -4661, -574, 3338, 1707, -1413, 233, 325, -3222, 6061, -3159, -2217, +2616, -1268, -1268, 789, -1848, -401, 680, -2117, 3627, -1674, 2739, -2233, 1612, -4006, -84, 4243, +-5617, 4834, -2371, 514, -1126, -424, 2480, -444, 1765, 4152, -5669, 715, 2665, -1133, 3221, -2849, +2266, -609, 2563, 928, 125, -3796, -1067, 3093, -1438, 914, -5539, 3312, -2860, 753, -166, 1860, +-2833, 723, 1671, -3352, 3942, -2577, -483, -2290, 3198, -3487, 3937, -1826, -352, 2121, -611, -318, +1791, -2444, -1741, -257, 823, -738, 311, -1906, 2451, -789, 4657, -5495, 6634, -2601, 393, -75, +-2300, 2493, 3241, -5093, 3854, -590, 1487, 1122, -2202, 2737, -2262, 5320, -1458, -6163, 5771, -931, +592, 801, -5281, -440, 3290, -517, -3597, 3532, -9545, 7084, -2424, 2354, 3215, -9959, 5427, -1238, +3646, -2771, -59, -1266, -1574, 1981, 2172, -978, -3323, -4307, 1380, 3138, -2561, 4103, -3119, -992, +2890, 1767, -2058, 357, 1981, 614, 1031, 3501, 1115, -1006, -1540, 352, 3099, 708, 154, -2493, +5668, -9100, 6906, -307, -1052, -769, -1925, 1874, -325, -1879, 1394, -4991, 1857, -1731, 134, -1574, +-274, -1867, 1470, -575, -4151, 5023, -4889, 4836, -2601, 2453, -2672, -1368, 2357, -2585, 2114, 696, +-3210, 9249, -7192, 4170, -1073, 1945, -1884, 3629, 3224, -3492, 1063, 3322, -2887, 7475, -4383, 2548, +-1036, -2146, 2805, -1049, -1940, -7500, 7675, -1297, -952, -1649, -723, -2465, -2509, 6371, -3566, -590, +1256, -999, -3900, 6376, -347, -2916, 2538, -5954, 8404, -5054, 4564, -506, -5507, 1836, 1069, -1046, +2445, -488, -5034, 2252, 2025, -2497, 4567, -5088, 3954, 507, -953, 4552, -2848, -2883, 5727, -3057, +4152, 350, 779, -3177, 2155, 1694, -2774, 2227, -1162, -1437, 753, -399, -2388, 2604, -5127, 2500, +-3488, 577, 3687, -10229, 9586, -4093, 1545, 312, -2396, 1375, 355, 2149, -1732, 978, -1343, 2536, +487, -1186, 1288, 95, -6157, 6351, -3168, 1747, -4618, 2219, -2595, 3220, 3445, -4702, 1501, 1388, +-1382, 3563, -817, -1004, 3486, -2983, 1761, 2644, -1281, 662, -2717, 3443, -944, -1578, 4141, -10215, +5233, 745, -4792, 2131, -1416, -4124, 6200, -4972, 5355, -2090, -1605, 2555, -677, 45, 2495, -3609, +1312, -1115, 4015, -3697, 2424, 924, -3007, 2134, -480, -238, -1850, -755, 3105, -4229, 4332, -3454, +1157, 548, 287, -527, 1058, -429, 1947, -2092, 2671, -2072, -137, 747, -1577, 8204, -5893, 2838, +-4095, 2599, -8, -1922, 299, 18, -1503, -1307, 2259, -4079, 1016, -2095, -80, 3343, -598, 1918, +-2645, 2594, -2071, 3837, 320, 0, 1278, 1131, -2005, 2523, -2697, 3628, -4705, -1645, 2640, -1998, +1428, -2169, -604, -6096, 5556, 202, -4254, 5893, -7002, 2058, 2740, -1688, -275, -1161, 1728, 7, +1036, 2299, -3173, 2732, -2440, 3605, 773, -3793, 5146, -3592, 2177, 933, 186, 1382, -1001, 532, +-516, 409, 527, -1339, -2609, 5068, -1572, -2519, 3265, -123, -2495, 2701, -3202, 582, 1957, -6124, +-289, 529, -4690, 5256, -5330, 2288, -1268, -4587, 5252, -1496, -744, 1344, -1147, 1413, 1408, 1892, +41, -777, 5420, -2435, 3303, -2822, 5873, 453, -3957, 2495, -2553, 275, 1818, -2858, 1237, -2277, +-133, 5910, -6895, 2029, 3483, -7934, 4166, -912, -228, -2199, 3237, -5161, 115, 4592, -2774, 4902, +-5256, -233, 2388, -5003, 5321, -4854, 651, -430, 148, 1278, -2354, 2630, -886, 1823, 108, 628, +-811, -2372, 8380, -10860, 7297, 467, 1012, 2131, -3586, 3806, -818, 5310, -6552, 4292, -4238, -4114, +8803, -9876, 2752, 225, -41, -2805, 1249, -536, -355, 89, -62, -3513, 5451, -3862, 456, 5563, +-5609, 3021, 2039, -3316, 4744, -5340, 3651, -3115, 1343, -818, -1661, 4233, -5640, 4389, -1966, -2082, +8441, -6128, 380, -78, 477, 1204, 1334, 774, -1649, -1062, 471, 5867, -5513, 7143, -8810, 6322, +178, -1579, 1365, -5238, 612, 2861, -3130, 2228, 599, -8115, 1031, 390, 1190, -694, 2790, -6876, +4124, -2329, 2329, 1852, -2010, 3861, -5112, 6140, -3216, 3622, -1278, -1064, -978, 294, 2290, 682, +864, -3186, 333, -1908, 5493, -5202, 2988, -66, -1926, 3661, -1038, -1077, -1234, 3365, -2298, 3622, +-2848, 1698, -840, -1506, -1911, 2640, -4220, 5398, -5246, 2505, -1627, -335, 1907, -2846, 3525, -3329, +1996, -2054, 1496, -606, -900, 3198, -834, 1428, 3275, -3013, -739, 2463, -2495, 4015, -11, -3214, +105, -506, -211, 1128, -211, -182, -1060, -1506, 4175, -3536, -830, 2667, -4801, 1189, 1690, 1445, +-2369, 1718, -2130, 1550, -440, 1368, -277, -3392, 1364, -1549, -514, 3302, -7308, 4234, -5522, 8121, +1538, -57, -863, -3212, 3253, -1503, 6363, -2489, -2315, 2358, 4089, -2085, 3813, 695, -5808, 9611, +-6048, -100, 5106, -7971, 2557, -1836, 241, 546, -318, -3333, -264, -1375, 1120, -4622, -94, -544, +-1932, -1304, 1262, -4883, 5833, -2328, 2828, -2611, 629, 782, -3187, 5581, -5413, 5004, -1401, -1930, +3237, -1092, 3277, -1574, 5320, -4792, 6305, 643, 191, 4160, -3117, 1462, 4162, -2385, 4305, -3230, +1370, 2901, -910, -2686, 389, -4247, 488, 3285, -2973, -280, -5202, 817, -1933, -2537, -612, -3438, +2138, -3852, 2760, -507, -4089, 1178, -1458, 831, -762, 4104, -1736, -769, -575, 2644, 100, 1267, +-1966, 1360, 280, 2299, 221, 13, -1897, 4365, -561, -270, 4487, -2888, 1976, 3908, -1185, -2907, +4877, -2238, 5199, -2192, 1640, 3338, -5199, 5185, -6251, -410, -5, 735, -1613, -1680, 1615, -2252, +-1622, -2718, -447, -1038, 1534, -6469, 933, -420, 1084, 1865, -254, -3278, 3190, -856, 2363, -167, +-1152, 822, -3539, 4986, -3838, 2561, 1411, -1612, 527, 1591, 1485, 817, -1838, -2825, 871, 2763, +-1911, 4342, -1028, -3939, 5178, -637, -682, 4229, -5401, 1879, 730, 1603, -3338, 3631, -3346, -318, +2185, -798, -2245, 609, 314, 1190, -5253, 2713, -2116, -3726, 3958, -633, 638, 3812, -2556, 2693, +-4734, 9138, -7869, 6983, -2923, -167, 201, 2713, -5175, 34, 752, 196, -1635, -972, -263, 1884, +-1891, -1795, 692, -3057, 3612, -2676, -941, -369, 1269, 963, -3678, -2304, 5640, -3313, 2335, 3721, +-6391, 5102, 3992, -5166, 4482, -440, 1239, -1239, 4970, -2795, -2625, 5171, -3518, 1180, 3309, -918, +-2309, 1596, 277, -1540, 2883, 677, -131, -2735, 6731, -8033, 4170, -3900, 396, 1183, -1770, -1390, +-1383, -1583, -811, -941, 1477, -1831, 293, -1971, 1159, -3750, 1747, -1244, -13, 992, -1743, 876, +-637, 740, -1489, 2616, 2256, -2314, 1945, 2853, -1685, 4734, -1424, 309, 186, 1792, -784, 6867, +-2010, -1834, 3505, -7444, 7958, -2673, -1659, -272, 793, 427, 351, -3181, 1592, -1477, 614, 1338, +-3532, 1431, -4661, 873, -4341, 2755, -589, -18, -1807, -1181, 2140, -564, -949, 800, -3052, 3872, +3139, -3347, 2904, -5636, 6887, -944, 400, -1033, 646, -1723, 2652, 20, -1777, 7612, -4214, -1539, +982, 2643, -2267, 4069, -2730, -4446, 5253, -1678, 212, -1254, -165, -366, -1403, 2902, -3193, 1404, +-2781, 1790, -3377, 7293, -4167, -927, 2274, -2013, 1273, 32, 1021, 1932, -3505, 2858, 91, 3067, +-915, -1399, 393, -2476, 4334, -1424, -1132, 418, 2246, -6823, 5827, -1966, -4786, 3748, -5616, 4719, +-6939, 632, 2553, -2647, 2585, -3105, 3050, -332, 2751, -1593, -614, 62, 2799, -2979, 5061, -866, +-1036, 6411, -4641, 2387, 3270, -3697, 1428, -1311, -3793, 5993, -1518, -949, 1127, 1009, -3532, 2179, +345, -2887, -473, 1644, 495, -3227, 2407, -695, -1646, 5217, -5810, 6193, -6323, 420, -84, 442, +-95, -2235, 573, -3322, 2155, 934, -1297, -2784, 4065, -8656, 8064, -743, -1020, 157, 521, 381, +2621, 1787, -3578, -982, 3755, 2216, 1278, 1102, -434, -1390, 3428, -60, -669, 1024, -793, 919, +564, -889, -999, -1552, 2910, -4148, 2351, -1990, -2168, 1590, -2770, 738, -1441, 1393, -1771, -2434, +3219, -435, -1161, -1276, -1554, -236, 3798, -2085, 68, -1906, 2751, -147, 81, -476, -807, 3137, +-3129, 5611, -1736, 2091, -128, -3216, 4242, 686, 1853, 3350, -5783, 2434, -133, -410, 2848, -2592, +-512, -942, 2954, -1500, -811, -153, -1380, 1509, -1414, 1131, -2556, -219, -1276, -699, 433, -302, +825, -2533, 2451, -4109, 3370, -1807, -55, 1821, -2044, 108, -364, 4436, -5617, 2626, 172, -1611, +3842, -1336, -2325, 3784, -1393, 481, 293, 354, 1364, 1065, 309, -1605, 3105, 2679, -4250, 1238, +1852, -3074, 1518, -84, -3600, 2468, 22, -2107, 1641, -674, 3734, -4463, 217, -1311, -2538, 5145, +-5325, 2294, -4702, 2465, 1101, 190, -812, 282, -3464, 3828, -410, 924, -2977, -94, 2036, -3018, +2592, 2073, -313, -1513, -696, 3144, 1719, -347, -125, -2906, 1666, 3200, 13, -1811, 3081, -2531, +3272, 2895, -3794, 2450, -563, -3644, 2882, -1860, -4743, 1207, -4158, 2928, -812, 527, -352, -2295, +856, -572, -180, -1702, 2916, -985, 192, 1695, -304, 827, -2383, 2553, 1271, -503, -165, -658, +-1002, 3152, 2319, -5209, 4840, -2468, 3381, -2737, 2566, -4676, 1372, -544, 88, -839, -173, 317, +-1612, 1532, 667, -509, 1466, 386, -726, 4050, -4160, 4253, -637, -3849, 1388, -811, 103, -2977, +663, -2047, 3794, -4365, 4341, -934, -3023, 2844, -734, -634, -15, 3445, -4166, 5769, -4426, 308, +3794, -7238, 4136, -3682, 5217, -4113, 4017, -4167, 1642, 1356, -1251, 3891, -3154, 2576, -1414, -3498, +2128, -2119, -34, 1615, -2669, 1923, -246, 2020, 158, -1152, 1234, 480, -1101, 2446, 1083, -3355, +5762, -4009, 97, 47, -905, 737, -4700, 3900, -3304, 1208, -21, 526, -3413, 2693, 2058, -1133, +4802, -2823, -265, -729, -1348, 2951, -2763, -212, -380, 388, 1821, 1496, -5765, 5961, -161, -4911, +4293, 1464, -1113, -1859, 1121, -6307, 3817, 910, -4249, 1554, -3268, 6007, -2214, 217, -134, -2272, +1065, 341, 2532, 442, -45, 2025, -3057, 2566, -1603, 1787, -3668, 2786, 0, -1916, 3101, -4501, +1538, -220, 1199, 2395, -2109, 1307, -4035, 2315, 4657, -6251, -878, 3752, -4452, 2794, 1350, -2448, +2131, -411, 13, 590, -521, 3837, -7219, 6572, -170, -1203, -1215, 1845, -3382, -2150, 4196, -5141, +2916, -173, -13, -1292, -1714, 3549, -5232, 1723, 507, -76, 2286, -5572, 5328, -1380, 172, 832, +2810, -5024, 5146, -1282, 372, 718, -297, 723, 3356, -1477, 3369, 37, 1111, -2657, 2135, -1390, +-3273, 2231, -3939, -1120, 2726, -1658, -997, -1130, -2083, 3603, -1128, -1249, -153, -2606, 1542, -691, +680, -2175, 3, 1789, -2843, 4995, -3686, 2071, 774, -1172, 2517, -1086, 4244, -3077, 1813, 537, +2604, -2611, 4526, -4675, 987, 4143, -5955, 6918, -6362, 617, 841, 3736, -6974, 6435, -3056, 762, +858, -1214, 3225, -5239, 2325, 1513, -3939, 1161, 483, -3352, 1050, 629, -1020, -216, 125, 776, +-919, -2471, 1636, -493, 1408, -2815, 2076, 2513, -5560, 2741, -1104, 1272, 30, -483, -1680, -1359, +5534, -4116, 4855, -3828, 331, 2177, -217, 841, 1106, -4749, 2745, 181, -1335, 558, 2391, -2168, +2619, -4655, 3710, 2702, -1582, 47, -1184, 2945, 2411, -3389, -336, 2737, -4501, 942, 3352, -2950, +1419, -23, -4511, 5163, -1855, -2072, 2820, -2649, -3020, 5785, -5534, 1719, -1012, 13, 1596, -1078, +2014, -3472, 1171, -6057, 7390, -938, -4145, 4225, -839, -1518, 1872, 1171, -4484, 1620, 1128, -3075, +253, -1306, 3617, -1150, -558, 1673, -2645, 6092, -2495, -108, 5937, -5786, 6809, -3212, 2818, -624, +-990, 1782, -1104, 478, 493, 595, -5780, 8992, -11726, 8738, -2965, 1306, -3590, -191, -408, 3508, +-521, -4242, 1904, -2534, 3899, -1976, -4394, 5592, -8004, 3282, 1503, -747, 835, -2259, 2697, -923, +526, 1877, -1082, -2262, -2949, 4345, 656, -4240, 1848, -3300, 1016, 4495, -3231, 1942, 1241, -2926, +5512, -69, 1574, -2216, 3098, 2407, -5301, 5451, -885, -2741, 6183, -1676, -15, -5229, 3059, -2731, +-158, -50, 3294, -5265, -55, 6638, -7890, 5300, -2597, -216, 1026, -2277, 1234, -2253, -2148, 277, +2304, -5862, 9353, -3207, -2505, 2797, -2838, 1636, -1075, -1094, 1550, -2009, 4147, -3469, 670, -109, +-273, 1253, -1889, 4261, -3115, 2351, -3406, 4989, -3594, 3004, 4536, -6323, 9238, -5655, 2170, 2628, +-7584, 7289, -6696, 2019, -1034, 1225, -2470, 1626, -2711, 1530, 1200, -3600, 4957, -4499, 338, 1966, +-2597, 454, 2960, -226, -2687, 3453, 968, -3336, 4254, -4661, 1728, 323, -1079, -711, 934, -2401, +972, 2984, -2829, -1595, -177, 3585, -3922, 498, 521, -1654, 3934, -7369, 5252, -2193, 1427, 1796, +-406, -4133, 3423, 1251, -2068, 1016, -1602, 298, 1118, -2198, 2576, 173, 498, 333, -447, 2330, +1234, -2657, 4487, -6400, 5640, -4337, 7478, -3634, 5, 308, -1493, 4702, -3132, 2548, -2293, -1258, +-684, 5042, -7875, 4196, -1602, -66, -1902, -743, 1698, -1343, -5023, 2342, -1130, -1145, 1731, -2323, +283, 1412, 735, -1555, 3408, -2028, -435, 5082, -3988, 3207, -3250, -558, 1224, 4107, -5507, 3792, +-1045, 4903, -1278, -3434, 2054, -614, 3864, -2146, 270, 2426, -1632, -609, 1520, -1137, -243, 3990, +-6304, 2887, 291, -3619, 3439, -1004, -4103, 4620, 648, 162, 1324, -5784, 5154, -6860, 6929, -8077, +-52, 4839, -7680, 1887, 2395, -1191, -1065, 2694, -6347, 6879, -1399, -1923, 3702, -1593, -212, 147, +391, 847, 755, -1479, 1395, 2926, -6372, 5999, -3493, -360, 3702, -112, 1887, -1205, 3697, -4079, +4757, -2659, -124, -1238, 1855, -25, -730, -2240, 3143, -1537, -1315, 1687, -2960, 3282, -2102, -3046, +2791, -4041, 2116, -890, -2306, 2102, -2575, 59, -1164, 3799, -6106, 5658, 444, -4686, 6295, -1860, +1513, 629, -320, 22, 1995, 1154, -1111, -2029, 1471, 1912, -3970, 5091, -180, -2766, 1722, -2628, +1763, 706, -248, -2012, 4999, -2296, 788, -2323, 1214, -1669, -1641, 2119, 1152, -91, -1940, 579, +-3166, 3032, -1322, 71, 3775, -8549, 2805, 2616, -5639, 3290, -6300, 1960, 1610, 694, 1491, -2746, +2965, -123, 2285, -1498, 5965, -3003, 4395, -1482, -749, 4988, -5129, -430, 2941, -4065, 3864, 1036, +-4592, 958, -2858, 1297, 2262, -6622, 7782, -6603, 7238, -3817, -650, 3075, -4913, 2257, 2664, -4959, +-492, 3270, -4783, 5136, -4947, 3493, 2054, -5324, 6164, -4390, 4249, -4380, 299, -545, 1495, -2354, +669, 1592, -5645, 4346, -1403, 3357, -4380, 2833, 2611, -3738, 6353, 161, -3680, 3943, -1676, 1984, +3458, -6745, 2833, -1574, 1152, -2934, -78, 503, -1025, 1568, -3421, 2924, -1571, -1785, 7748, -4184, +-655, 6077, -3682, -1453, 1941, -3589, 2909, -1567, 127, 1525, -1993, 636, 287, -4694, 3460, 5274, +-6414, 4200, -4279, 1034, -142, -496, -1525, 4409, -4742, 2488, -2531, 1742, 614, -5481, 4059, -2944, +3639, -1397, 5199, -4914, -485, 2648, -648, 2189, -2737, 1816, 640, -1634, 777, -2267, 1550, -2723, +6634, -4356, 3750, 2469, -6685, 6731, -2025, -2684, 7432, -7735, 3900, 924, -4550, 4123, -5771, 1669, +716, -674, 1157, -624, -3294, 1345, 119, 976, 1641, -2242, 367, 2160, -3096, 2352, -1339, -1692, +-1209, 1096, 2044, -691, -943, 662, 1646, -2744, 5083, -4496, -685, 3986, -6664, 841, 1433, 657, +-2455, -1528, 1780, 1016, 696, 2975, -2226, -1074, 3171, -995, 2871, 71, -1213, 2962, 1907, -4046, +1777, 3881, -6314, 1542, 1388, -5451, 9455, -6041, -861, 1675, -3212, 4349, -2076, -1007, 32, -1351, +2861, -7671, 5668, -3294, 539, -3501, 3220, 196, -1298, 609, -1377, 3867, -4690, 4172, 2710, -3265, +-262, 180, -648, -75, 976, -1980, 69, -1306, 2553, 786, -7, 1161, -2201, 3743, 2081, 280, +474, -133, -652, 1990, -1579, 6072, -5238, 3736, -1671, -8537, 8243, -1976, -2785, -1525, 2387, -1737, +100, -42, 976, -2369, -57, 4375, -3062, 526, -1212, -1379, 1849, -4615, 2318, 4951, -3168, -2146, +6856, -7007, 6821, -3492, -1671, 464, -987, 1262, -498, -3067, -224, -23, 951, -147, -1873, 2885, +-474, 1679, -1065, 406, -1428, 2759, 246, 2993, -1741, 1237, 820, 2987, -3958, 1971, 1448, -3508, +468, 1784, -933, -3190, 70, 1336, -2411, -1378, 5097, -4356, 2463, -3706, 2010, 3283, -4952, 6399, +-8868, 6343, 750, 908, -768, 1962, -1271, -958, 3206, -6795, 1860, 3140, -9102, 8074, -7317, 1324, +-684, -73, 118, -1268, -2335, 6569, -6758, 3355, -3594, 4313, 2276, -6119, 9237, -6642, 4162, 2167, +-2665, 1739, 1073, -876, 3968, -6423, 7144, -6702, 6591, -946, -2172, 2693, -1626, 991, -4335, 2532, +1428, -5073, 6600, -2819, -4099, 4185, -231, -4694, 9582, -9916, 7510, -2696, -231, 614, -1099, -1171, +-1315, 1269, -348, -3646, 1501, -396, -5459, 2558, -1428, -1060, 2184, -1111, 451, -279, 2257, -2807, +5195, -4059, 6251, 120, -3992, 8825, -7129, 3807, 1174, -1752, 3857, -4422, 7080, 931, -5638, 4491, +-3274, 6075, -3615, -745, 471, -433, -1234, 711, -821, -1201, -986, -4278, 7926, -9523, 4765, -4341, +-2978, 2577, -3905, 3458, -1558, -2814, 3277, -3680, 4157, -4112, 2211, -6799, 6552, -4143, 2192, 3134, +-4605, 4293, 3823, -4569, 7670, -2873, 1118, 1685, 2432, -1130, 1601, -3308, 3781, 1419, 1031, -1487, +1275, -1104, -1978, 888, 2633, -5296, -297, 2848, -4859, 2327, 185, -3100, -298, 619, -5442, 6168, +-6081, 748, 225, -3187, 1956, 1199, -2383, -3051, 4273, 73, -2342, 3317, -2749, 2277, 1133, 598, +1276, -890, 469, -892, 5011, -2844, 1684, 856, 2095, -1716, 2602, -264, -449, 1671, -5141, 6222, +-3885, -2460, 4199, -6469, 4118, -2393, -1229, 3016, -2009, -1980, 156, -589, -657, 1800, -4162, 3738, +-3639, 3789, -2209, -3558, 4593, 924, -2623, 4135, 633, -2717, 4821, -7336, 9779, -2882, -995, 3148, +-626, 1577, -1777, 359, 4317, -7497, 2335, 1530, -3081, 5005, -6890, 3353, 98, -551, 3171, -4513, +2159, -830, -1893, -71, -3046, 2065, -3084, -1140, 2141, 1065, -8222, 7722, -805, -2439, -142, 5901, +-5646, 5401, -1573, 1268, -337, 3932, 289, 1311, -1688, 1747, -1253, 1241, 2213, -7170, 8897, -6232, +3110, -743, 1406, -354, 297, 1961, -6022, 7082, -3466, 411, 973, -5849, 50, 2437, -892, -1939, +3, -4085, 4918, -3910, 1514, -251, -3091, 1995, -2933, 2090, -1170, 2456, 457, -6153, 1766, 2955, +-2590, -306, 628, 284, 1671, 522, 6538, -7825, 4676, 1455, 1540, 2463, -543, -580, 4494, -6527, +5150, -1751, -3120, 6426, -4209, 905, 2041, -3183, 3881, -4670, 1370, -1705, 6192, -9068, 6935, -2448, +-4035, 2338, 590, -5010, 3883, -2454, 178, -1343, -2257, -2102, 3319, -4486, 1611, -3386, 1883, 2398, +-1569, -1067, 517, 1156, -1966, 2843, 410, -1428, -1787, 5086, -1898, 2189, 202, 2223, 653, 1664, +-1408, 4912, -1734, 3119, -3904, 1773, 1825, 983, -2324, -223, 1709, 148, 2933, -5635, 4989, -5383, +-1904, 1878, -3130, 18, 577, -2502, 1831, -5032, 2271, -978, 1891, -7601, 5393, -2863, -740, 2865, +-4418, 2115, -3143, 6246, -2442, 2851, -1208, 3027, -1354, -3110, 5325, -1776, 1605, -1349, 3752, 1317, +-2911, 7102, -5818, 2301, -2374, 1519, 3180, -2731, -371, -3542, 6212, -7826, 4926, -4976, 4162, -2730, +748, -3178, 2904, -451, -1913, 982, 915, -3962, 2938, 1529, -4108, 4675, -5665, 4577, -1765, -628, +3021, -3639, 1544, 1170, -3469, 996, 4933, -4720, 4967, -3555, 3512, 3954, -5381, 2140, -1093, 1293, +-2667, 3272, -3730, -2034, 3052, -143, 233, -1618, 1338, -74, -3152, 3904, -4601, -1970, 3862, -1370, +-3327, 4991, -6319, 3652, -3353, -1199, 3424, 4009, -4583, 3154, -779, 1199, 3651, -352, -59, -2141, +7574, -884, -115, -1540, -3123, 2631, 490, -2882, 617, 1382, -4458, 3025, -3598, 747, 1956, -3687, +1367, 1617, -6080, 7934, -6685, -1099, 2892, -6003, 6515, -2043, -980, 5764, -7487, 5891, -3111, -1681, +3608, -3111, 3740, -3298, 568, 1288, 50, 4203, -2975, -1859, 7738, -7603, 8358, -5252, 2725, -2795, +1389, 4051, -1561, -922, 3904, -2556, -507, 293, -2071, 1338, -3712, 2165, -4550, 1829, 1128, -1703, +-60, -1402, 1133, 1007, -2190, -951, 496, -801, 348, 883, 54, -249, 3847, -2757, 2363, -1734, +5222, -2582, 708, -449, -3541, 7054, -4089, -2313, 5083, -5079, 1991, 2223, -3523, 4206, -3256, -5723, +7400, -3808, -289, 3828, -4318, 6077, -5357, 3361, 1189, -1407, -3302, 4588, -2212, 370, 1419, -1903, +333, -1697, 1910, 21, 689, 2912, -1608, -2386, 5093, -6067, 1709, -977, 2950, -6310, 4026, -3866, +2992, -1995, -507, 464, -4158, 5069, -2217, -5, -1974, 1041, -512, -937, 2813, -1006, 2602, -1302, +1836, 328, 1447, -1671, -248, 4225, -2723, 127, 5466, -3899, 2296, -1829, 1797, 4908, -7364, 3429, +2829, -8835, 6091, -2857, -3576, 3493, -3706, -705, 1971, -900, -4952, 3658, 241, -2587, 2503, -2514, +-2955, 6387, -6358, 3498, -1293, -929, 2281, -1603, 2172, -4379, 1595, -1940, -1566, 2274, -714, -1476, +5686, -1154, -2521, 4281, -181, 1073, 318, -163, 3890, -1487, 93, 860, 1704, -1010, 546, 832, +-1574, -2, 46, 856, -6911, 4322, -4657, 3399, 903, -3363, -4271, 4205, -6361, 2655, 1334, -6750, +5313, -3585, 3578, 197, -2029, 3137, -4220, 1823, 7768, -4467, 5654, -3711, -348, -233, 1930, -1275, +1592, -2359, 191, 5, 5139, -4717, 1297, -967, -16, 2586, -1780, 3181, -1203, -3067, 2823, -1215, +131, 4765, -4012, 2533, 1310, -4875, 2010, 1421, -4484, 1906, -86, -4984, 5648, -2599, -3503, -692, +-64, -2944, 4489, -4011, 2575, 764, -4908, 2587, 4122, -3613, 5775, -2555, -52, 517, 624, 3930, +-3806, -313, 2882, -6807, 5495, 749, -6578, 4696, -4103, -633, 5711, -1807, -1668, 1983, -3804, 1625, +3922, -4524, 4838, -1613, -5557, 9512, -4300, 1988, 2851, -5548, 4567, 1377, -2441, 4346, -3820, -840, +-1734, 1634, -11, 323, -343, -3028, -1602, 2808, -3687, 486, -2155, 2320, -3297, 2029, 3411, -2371, +971, 1079, -2020, 5422, -637, -381, -2841, -188, -263, 2056, -2000, 1036, 469, -629, 2073, -1705, +3613, -6152, 6484, -3493, -1305, 5440, -3008, 2754, -1552, -3086, 2594, -2299, 2034, -1185, 908, -125, +-2240, 875, 3520, -4728, 3050, 842, -5141, 3891, -1038, 2071, -3968, -658, 2036, -3321, 6830, -4151, +1679, -2980, 4758, 325, -2025, 3861, -1940, 148, 249, -134, 2211, -5662, 6382, -8000, 3392, 1892, +-3507, -2277, 3045, -298, -5085, 2815, -1446, 1184, -5573, 5285, 628, -4282, 5754, -4389, 1154, 1500, +170, -2492, 5665, -1944, -2689, 7759, -6676, 2936, 2508, -3474, 4596, -2048, 170, -866, 2281, -1389, +1331, -5330, 8742, -6183, 415, 1390, -609, 3425, -3733, 4102, -2255, 3445, -3963, 1729, -2751, -251, +-3135, 3335, -4649, 3306, -71, -2497, 3324, -3671, -1955, 6087, -4860, 2187, -3205, 863, 1031, -3290, +1902, -1593, -401, 4035, -3614, -1128, 3822, -3748, -1792, 2548, 2514, -1, 3571, -4122, 3216, 4952, +-6919, 5732, -175, -1557, 309, 3699, -4419, 5318, -5383, 5626, 2713, -2638, 5175, -4694, 446, 2800, +-6116, -196, 3138, -5388, 623, -97, -5178, 2101, 326, -9388, 6599, -3220, -3429, 2218, -149, 565, +-3171, 646, 5114, -8076, 7405, -3588, -1537, 3532, -2439, -900, 4514, 500, 1238, 1640, 505, 379, +-1074, 6130, -6701, 4705, 2499, -12, 3925, -3361, 4022, -3294, 1009, 2640, -4267, 3011, -255, -2623, +2223, -4477, 2975, 832, -3395, -391, 481, -4124, -827, -2509, -2271, 556, -3459, 4216, -5639, 3760, +-2393, 2182, -682, -3808, 2877, 3458, -1802, 2839, -3726, 4288, -1462, 1569, 1607, -2582, 2136, 3488, +-1828, 1253, 309, -2097, 1960, -3014, 4175, 1049, -1138, -1180, -2886, 6983, -5426, -1530, 6754, -6406, +593, 3464, -4444, 1460, 2323, -3290, 1291, 1763, -3164, 3588, -6656, 2134, 1084, -389, -1709, -1301, +1201, 2434, -5528, 2721, -401, -3206, 6222, -4189, 2658, 1115, -1004, 235, 4863, -6567, 5628, -897, +-1500, -2969, 2718, -1645, -304, 1684, -4710, 2436, -360, 2369, -1622, -4666, 2589, 1506, -3035, 1673, +1107, 691, -8, -4506, 5204, 2, -1, 1230, -260, 274, -422, 66, 3592, -4232, 1795, -469, +958, 555, -3546, 3699, -4272, -2558, 6460, -8670, 9659, -9147, 5233, -1671, -2849, 5306, -1007, 93, +-357, 590, -2005, 5830, -2684, 2809, -4068, 123, -1937, 6191, -4274, -3430, 5158, -5003, 705, -200, +2815, 1605, -3745, 3895, -4060, 2222, 1500, -2351, -652, -1823, -521, 6046, 4194, -8493, 3428, -2688, +696, 486, 2901, -8091, 5885, -2917, -3234, 4916, -4369, 6520, -4891, -2199, 4797, 1377, -1897, 835, +-1966, 1937, -532, 3438, 1164, -1746, 5121, -3042, 701, -1739, 711, 548, -2836, 657, 1498, -6533, +6555, -2023, -1926, -1527, 1430, 522, -699, -476, 568, -6246, 2568, 503, 51, 104, -742, -2083, +3619, -1436, -1561, 1881, -2769, 4451, -4530, 2272, 1814, -521, 180, -291, 4295, -511, -2934, 7792, +-6196, 574, 6096, -251, 865, -720, 1152, 837, 376, -957, -2223, 948, 323, -3042, -1261, -729, +-2314, 4555, -7911, -1315, 2700, -740, -5951, 1676, 1209, -667, -3934, 7671, -5248, 5653, -2512, 1554, +-1562, 2315, -439, 3200, -3003, -725, 8191, -5553, 5282, -1176, -2823, 2761, -2020, 2201, 3908, -8239, +3227, 46, -2097, 4947, -4901, 1898, -190, -832, 1868, -365, 85, -1852, 1057, 3095, -1693, 2115, +-3134, 618, -3047, 1559, 425, -2955, -3609, 5936, -6843, 4972, -3035, 2158, 728, -8694, 8229, 1276, +-5257, 2010, 3842, -3549, 4250, -4150, 5936, -2096, 726, 2422, -4996, 3923, -3503, -723, 4359, -5776, +5480, -327, -2689, 1341, 73, -786, -3314, 3134, 816, -6787, 5848, -725, -2960, 3574, -492, 3264, +-1892, 1737, -4187, 4204, -778, -2455, 4460, -6319, 3192, -1597, 921, 2018, -5102, 2655, -2469, 461, +1762, -2221, 3172, -5926, 5011, -273, -1165, 2658, -3241, -268, 73, 3420, -2236, 328, -2873, 1806, +-875, 989, 934, -4931, 2950, -3500, 2669, 2072, -638, -6, -1773, 7449, -8185, 6477, -2568, 3949, +-3468, 1016, 2151, -913, -2352, 4535, -2437, 32, 6037, -4985, -1317, 1138, -5048, 6334, -6343, 2587, +-711, -1453, -1375, 2561, -3049, -301, 866, 425, 2043, -5391, 4351, -517, -2890, 3016, 343, -1496, +1288, -768, -153, -865, 1994, -5644, 6000, -6028, 4264, 366, 801, -3324, 3692, -590, 3460, -1858, +-1500, 3196, 550, 2092, -2362, 125, 2448, -1261, 697, 1232, -62, -672, 422, -2868, 747, -476, +-2029, -1554, 822, -2065, -1855, 2, -3, -3857, 2162, -3433, 3559, 1104, -5432, 4753, -28, 3146, +1160, -1453, 1016, -2233, 1797, -599, 299, -1983, 1310, -1103, -396, 2077, -1627, 3274, -4288, 3934, +-604, -4515, 5523, 725, -7117, 6424, -2756, 4660, -3479, 3348, -1220, 134, 1237, -1011, 822, -481, +-390, 711, -1287, 366, 3476, -1606, -1021, -4220, 66, 3632, -3985, 2038, -2678, -2926, 3256, -2775, +2333, 1758, -1936, 2907, -406, 1949, 1307, -2786, 293, -1597, 194, 1569, -3977, 1307, -2293, -550, +-3129, 2199, 463, -2309, 2209, -1687, 4264, -1470, -663, 1974, 881, -1181, 1564, 2344, 618, -685, +2397, -361, -609, 1006, -84, 2521, -1998, -506, -66, -2849, 2807, -3139, 2032, -1860, -860, 3396, +-7487, 3263, -632, -1775, 3663, -3915, 2125, -330, 1945, 748, 752, -370, -430, -81, -2376, 611, +-776, -2076, -51, -2015, 2403, 107, -3040, 45, 390, -1326, 2897, 3231, -2419, 2771, -5039, 3736, +1162, 2640, -492, -3459, -36, 5233, -5688, 6680, -1607, -4021, 3612, 2876, -5446, 5572, -2511, -2984, +705, -1093, 1093, -1465, 686, 167, -2373, 2083, 1894, -5056, 1704, 390, -1655, 2533, -769, -113, +86, 1093, -1373, -478, -1288, 2842, -1768, -22, -4730, 617, -4654, 8266, -4167, -359, 931, 1833, +1031, 2357, -2247, 851, -352, 924, -1608, 1742, 149, 1695, -5614, 1521, 3207, -1584, 1864, -2708, +357, -1019, 4311, -2532, 5893, -6240, -215, 2053, 3025, -893, -1254, -1435, 1117, -2504, 1534, 3069, +-2776, 4272, -3697, 1511, 854, 861, -769, -1933, 253, -2459, 2926, -3106, -335, -2883, -2217, 3094, +-4340, 99, -178, -3935, 5394, -1577, -973, 1300, 3895, 383, -1607, 108, 2199, 2653, 148, 706, +-2252, -330, 5076, -1840, 1152, 2645, -2431, 1966, -776, 1714, 143, -176, -314, -1540, -1981, 4641, +-2473, -1344, -4656, 1087, 1700, 185, 2078, -6169, 994, -1007, 2301, -1278, -2518, 1732, -5234, 4397, +978, 701, -2067, -488, 379, 54, 955, 2162, -803, -1928, 1496, -1070, 3222, 1344, -1892, 3298, +728, 2178, -482, -2499, -1126, -590, 1603, -2545, -389, 665, -5723, 5812, 836, -2092, 1903, -1441, +2066, -786, -1186, -2587, 1108, -328, 511, 156, -1853, 1516, 922, -854, 296, 2671, -714, -735, +-2461, 4238, -2909, 3958, -2429, -244, 288, 1131, 1176, -3869, 1373, -842, -56, 2199, -3153, 2184, +684, -1327, 2362, -2631, 2184, -507, -109, -2470, 1539, -3783, 3881, -5619, -991, 2435, -3687, 2163, +-817, -264, 3493, -2992, 3447, 795, -1237, 4087, -495, -808, 921, -309, -2556, 4216, -769, 2034, +-3245, 2387, -1649, 3793, -744, 4395, -4438, 956, 4147, -2034, -1904, 806, -2062, -1598, 2440, -1650, +-4117, 5003, -4065, 2, -1568, 1103, 209, -2876, -260, -432, -1138, 4797, -6008, 228, 2141, -955, +-3585, 1613, -1561, 1036, -924, -2485, 1244, 1978, 2199, 685, 267, 3917, 548, 1084, 2170, 95, +-332, 3728, -2401, 2264, -2489, 1097, 49, -84, -311, -884, 1078, -719, 1402, -4810, 6159, -1996, +-372, -1860, -505, -1360, -1908, -47, -483, -652, -134, -2761, 2455, -710, 629, -3259, 2374, -1049, +-3210, 1932, -1408, -2973, 3104, -1048, 1850, 173, 1899, -260, -3093, 3958, -2683, 4730, -2741, 1319, +1933, 90, 5199, -2110, 3153, 973, -1127, -1372, 714, 321, -579, -2201, -336, -3416, 3101, 4481, +-6503, 1695, -1378, 1537, 532, -1356, -1028, -1829, -1821, 4318, -2833, 54, 1878, -3437, 2833, -1409, +893, -190, 1537, -4361, -2154, 3222, 938, -595, -1702, -1802, 434, 4616, -3162, 94, 1101, 672, +399, 1099, -2955, 4572, 360, -1482, 4227, -1616, 910, 3457, -2812, 2655, -4529, 2761, 2164, -4553, +1763, -3410, -91, -1601, -2604, 2809, -3885, 2609, 551, -3716, 3927, -1949, 1792, -1253, -369, -2120, +2073, -894, 1908, -2640, 1839, -138, 3231, -2689, 3086, -2948, 2943, -1520, 1994, -1254, -797, 4419, +-2099, 2519, -2456, 2364, -2061, -2645, 2715, -3545, 2575, -622, -2192, -2490, 5102, -2489, 3782, -2087, +-4281, 6085, -4972, -188, 643, -5214, 4370, 1467, -2056, -451, -2042, 3551, -2757, 2233, 1149, -1340, +5956, -2265, -158, 3687, -638, 3511, -1122, -1288, 1367, -1180, -1458, -1093, -3347, 5781, -5274, 6852, +-8028, 7448, -4657, 4114, -3362, -496, 1029, -3280, 1853, -3741, 798, 172, -1424, 2148, -3191, 4429, +-3224, 425, -372, 580, -57, 1012, -125, -595, 2834, 4296, -2866, -2901, 2232, -4055, 314, 5302, +-6223, 3450, -4528, 1996, 1867, 2951, 997, -5179, 7826, -1539, 309, 1496, -3096, -3185, 5156, -2469, +372, -719, -3426, 525, -2126, 1792, -498, 429, 317, -2036, 2445, -4078, 3899, -3621, -226, 317, +-556, 4288, -2931, 423, 1661, -4264, 7756, -7233, 5578, -151, -2175, 3091, -1136, 1152, -117, 1404, +486, 963, -915, 2497, -910, -4439, 2728, -3678, 1753, -3366, 2542, -2721, 4815, -7225, 3187, 1593, +-2252, 3049, -4027, 47, -2407, -1297, 1940, -3173, 1181, 4533, -4962, 3110, 2315, 141, 1755, -2667, +3186, 1843, 1960, -658, -4027, 7273, -3939, 2093, 4684, -7438, 4424, -1191, -2815, 2267, -5582, 2531, +-1070, -2776, 3376, -3701, 5335, -3418, -4410, 3721, -951, 1373, -1777, 1714, -3876, 4433, -5204, 2322, +682, -2650, 5958, -3977, 3261, 454, -2451, 716, 551, -2134, 874, 1319, 36, -1390, 118, -230, +-337, 3507, -1402, 3970, -2344, 3636, -3056, -1220, 5304, -2222, -1509, 5233, -3284, -4311, 6629, -8785, +4932, -1479, -7147, 6556, -3138, -330, -372, -2076, 536, 1273, -459, 3643, -4029, 3125, -2238, 2175, +-2482, -939, 3718, -1912, 1055, 623, -399, 2194, -1656, 1627, -856, 4007, -1742, 878, -435, -2849, +2005, -1545, -2187, 2266, 2228, 449, -1128, 1402, -3093, 4418, -923, -2262, 3434, -497, -648, 2228, +-2083, 2201, -3569, 3561, -4203, -1927, 1743, -4957, 1180, -1059, -2634, 1666, 711, -463, 3551, -1816, +-166, -524, -1295, 606, -3566, 4709, -6140, 4767, 2630, -3146, 1935, 3139, -2328, 2388, 1015, -1772, +3466, -1538, -1094, 478, 1666, 2110, -1317, 4312, -7298, 5828, -2427, -1152, -2226, 346, 1179, -1891, +4475, -4583, 4443, -1088, -2429, 3453, -2761, -108, -3542, -25, -3256, -1714, -62, 711, 1630, -5394, +3338, -1185, 798, 2543, -2548, 2245, 3243, -5194, 5174, -1453, 1722, -408, 1567, -858, 2009, -543, +496, 15, -876, 1569, -890, -1201, 6765, -9039, 5400, -1253, -430, 2102, -3072, -259, 1679, -375, +671, 75, -784, -3447, 1908, -763, -1363, 4723, -5097, 1247, 2570, -5529, 5272, -4767, -207, -2980, +-1379, 243, 1332, -981, 919, -102, 3295, -57, 1790, -679, 2175, -1120, -3468, 6334, -4766, 3440, +4322, -6809, 3445, 4350, -4734, 4514, -4368, -2198, -606, -2320, 3822, -253, -1360, 3224, -4326, 6496, +-6567, 3357, -2080, 420, -1561, -502, 2960, -3886, 2392, -1516, 1842, 4620, -4121, 3111, -413, -5728, +4637, -2015, -985, 1748, -3653, 3357, -2902, 1118, 2584, -4030, 2628, -2970, 3095, 1942, -2058, -391, +803, -1338, 1480, -104, 2698, -3294, 3192, -4239, 3306, -6778, 1292, -380, -1470, 345, 2794, -2933, +-3142, 4053, 1210, -1510, 3303, -1870, 4118, -2367, 452, 1215, -2115, 2793, -124, 2962, -2243, 1504, +51, -1864, 2437, -337, 811, 502, -1661, 432, -5039, 5257, -7637, 6285, -3893, -62, -112, 1161, +-2614, 420, 1734, -4201, 4371, -1264, 59, 2628, -2190, 1806, 777, 493, -5270, 2276, 875, -1583, +-1993, -1336, -1748, 347, 163, 4418, -3323, 4981, -5001, 6283, -3357, 2049, -1325, 612, -897, 3831, +3404, -7773, 8204, -6850, 5137, 107, 985, 713, -5280, 3505, -2236, -1939, 682, 221, -1831, 1408, +2146, -1872, 2219, -5119, 3618, -1608, 469, -1527, -326, 1033, -2674, 2071, 1217, -2372, 3167, -4884, +4999, -5731, 1263, -1144, -5738, 4385, -4754, 2030, 2371, -1785, 2480, -1243, 5508, -4400, 3232, -23, +1569, 2868, 1094, -3098, 4201, -614, 723, 4544, -4398, 2446, -2207, -452, -478, -1011, -109, -2696, +3418, -2136, 442, -895, -1171, 187, -3860, 6217, -2314, -4376, 3794, -5641, 5983, -691, -2109, 1550, +291, -2187, 7292, -5292, 1084, -342, -2901, 768, -4288, 7303, -8033, -1249, 3925, -1161, 1999, -1606, +3182, -1847, 1149, 3304, -308, 3723, -2204, 493, 23, -85, 410, 2652, -4836, 5494, -6360, 3806, +-1538, -444, 194, -454, 600, -1732, 1602, 1739, -2751, 4720, -4623, 2557, 34, 1273, -3337, 1327, +-1925, -46, 517, -2451, 3254, 1050, -2511, 3935, -4538, 5114, -6745, 4912, -4739, -3, -1295, -526, +2563, -4696, -2881, 3192, 3212, -1976, 117, 594, -2907, 579, 6735, -2894, 4727, -554, 776, 2044, +-1807, -2456, 2890, -6166, 6460, -2088, 2009, -3622, 894, 2072, -4283, 4941, 1865, -1704, 2752, -1797, +-1266, 603, -1448, 1159, 921, -236, 1901, -1947, -65, -4137, -2, 381, -2367, 2454, -1844, 982, +-2936, 1587, -2708, -4264, 6399, -6377, 2448, 2478, -5556, 5431, -2886, -2484, 4627, 553, 3243, 1171, +-1757, 4050, -1422, 1196, 1123, -120, 314, 2393, -1012, -3159, -3200, 4894, -3411, 2897, -4747, 4249, +-332, 881, 3227, -2066, 1212, -2637, 5001, -1849, -3161, -915, -612, -1668, 2407, 272, -2887, 2227, +-3692, -99, -273, -1026, -651, -888, -2219, 1239, 2162, -1178, -1732, 1094, 2139, -2169, 2718, -680, +3139, -2747, 3260, 821, 724, 2005, 818, 706, -663, 2790, -477, -4521, 2958, -6571, 1019, -1234, +2199, -3864, 199, -2381, 1966, 153, 3493, -1610, 258, 2625, 2791, -4948, 1681, -471, 1, -982, +200, 250, 520, 351, -595, -1896, -214, 2587, -992, -720, -2567, 5756, -4029, 669, 2896, -2677, +772, 1591, -653, -937, -105, -228, 1074, -5277, 3682, 2494, -444, 3723, -3190, 721, -314, 1397, +-1807, -3559, -1019, -1426, 1610, -5255, 1054, 170, -2954, 5800, -797, 2417, 1242, -3065, 4085, -2557, +808, 4410, -1275, 1775, -3842, 957, 1046, 511, -1213, 976, -715, -34, -2946, 1998, -633, -459, +1304, -3164, 5716, -1625, 223, 2339, -5095, 4220, -7661, 8285, -2464, -2597, 4400, -4738, 4645, -1338, +139, -1302, 187, 3346, -7391, 3909, -4942, 338, -1540, -2780, 1327, 2240, -4228, 5103, -1499, -1632, +-245, 2470, 2500, -2076, 64, 4569, -1025, 2876, -2642, 1813, 2107, -3527, 4850, -9039, 9075, -7996, +1563, 3660, -6848, 9518, -2900, -2601, 7051, -4303, 3403, -849, -464, 74, -146, -1453, 1698, -2383, +2829, -4177, 2568, -3515, 1538, -875, -501, -1155, -4053, -493, 409, -4673, 1632, -3115, 2117, 692, +-156, 414, -1663, 2054, 464, 4960, 1957, -2240, 2145, -418, 4683, 278, 469, 1731, 16, -505, +-1797, 1025, -2463, -697, -1911, 638, -1319, 3665, -5491, 5331, -721, -4738, 5141, -1150, 5528, -6197, +551, -569, -144, -947, 2592, -4574, 3214, -4056, 3784, -3231, 2129, -908, -3784, 1258, -3820, 3633, +-643, -3668, 1521, 1239, -816, 3503, -909, 2374, -1029, -782, 2420, -677, 1534, 1976, -917, 2642, +3594, -768, 1398, -474, -2626, 711, 331, -5076, 3106, -6561, -1884, 1048, 816, 2972, -1889, -3202, +4317, -3298, 3222, -6, -754, 768, -485, -346, 3941, -4814, 1802, 1198, -1806, 1746, -836, 507, +-2848, 2978, -7598, 8800, -4681, 1292, 3380, -6460, 2720, 2320, -2519, 2070, -1970, 2388, 1108, -2611, +1083, 1224, -483, 726, 808, 2067, -2645, 3893, -3278, -585, 963, -2972, 1548, -3934, -1140, 616, +-4044, 4496, -3879, 2648, 311, 2032, 614, -46, -744, 4021, -2507, 2227, -1186, -675, 3280, 3907, +-5067, 1356, -438, 621, 375, 1503, -5747, -537, 78, -1753, 2975, -327, 360, -1331, 579, -3134, +3045, -1461, -6217, 4424, -1103, -325, 3365, -1886, -22, -931, 1646, 4211, -1370, 992, -4576, -163, +3595, -1529, -1751, 2102, -437, 5238, -2960, -1912, 1353, -478, 2417, -3467, 4757, -752, 2676, -1132, +2013, -3338, 3739, 1209, -2357, -585, -1029, -1860, 2653, -6893, 2424, -3481, 1888, 600, -2701, 4046, +-3356, 415, 1660, -2768, -2141, 3894, 236, -42, -1466, -563, 3035, -2456, 6337, -3928, 168, 228, +1081, -200, -1172, 856, 333, -1750, 2620, 1291, -275, -953, -2030, -2101, 5878, 878, -3811, -753, +1428, -270, 3385, 975, -711, -3998, 1375, 3869, -348, -1327, -1830, -2218, 570, 2230, -4393, 401, +-2488, 1884, -3385, 3314, -139, 1321, -2494, 1370, 808, 910, 3284, -6687, 2756, -1131, 658, 3026, +1485, -3408, 1343, 1646, -2696, 3561, -2674, 2233, 108, -769, -502, 1845, -2439, 1106, -588, 1329, +-2825, -294, 856, -4358, 873, -317, 214, -1588, 1123, -2014, 5406, -2194, 836, 303, 75, -375, +3079, -4807, -1971, 6462, -7748, 4931, -1499, -755, 4303, -2109, 4045, -1811, 1913, -1550, 1193, -692, +1200, -1685, 1627, -1443, 2789, -4878, 1390, 1550, -5922, 4332, -1761, -715, 55, -1436, -3458, 5529, +-1331, 687, 1461, -4980, 3958, -3852, 2388, -1721, 1592, -1889, -922, 3111, 2388, -3847, 1695, 3586, +-3661, 7618, -1868, -173, 1188, -759, -2228, 1615, 464, -3154, -793, 570, -4286, 4623, -185, -2117, +-3197, 5030, -2180, 900, -563, -2572, 365, 134, -3692, 5320, -4286, 4351, -656, -1227, -715, 3089, +-3537, 386, 1325, 408, 1460, -653, 2165, 2456, -2129, 1254, -1099, 3100, -1442, 2291, -4753, -183, +-1739, 2091, 1019, 1205, -1401, -1103, 992, -2528, 1663, -1341, 185, -5660, 6736, -4627, 1171, 1170, +-2309, -1441, 743, 2101, 847, 2887, -5308, -1763, 6778, -8544, 6198, -2992, 3875, -1916, 1, 2536, +-1446, -2548, 120, 325, -483, 3185, 797, -4494, 4509, -5073, 5764, -3, -17, 2989, -4450, 1394, +-3152, 1959, -430, -4054, 4524, -2088, 6222, -4660, 1962, -2619, 621, -1443, 4069, -3530, -100, 1058, +-3256, 2798, -3605, 6106, -4888, 561, 4403, -6588, 2664, 3521, -4388, -923, 2854, 2257, -1426, 142, +110, -2873, 5122, -2019, -2373, 1984, -834, -1306, 386, -1267, -873, 738, -2072, 3106, -1059, 2638, +-1724, 1247, -3745, -443, 4133, -4543, 3724, -1824, 598, -1115, -467, 2512, -478, 1902, 4030, -4913, +245, 2425, -895, 2950, -2639, 1834, -104, 2141, 1157, 186, -3571, -1011, 2334, -705, 197, -4707, +2484, -2497, 498, -233, 1889, -2744, 566, 1377, -2745, 3110, -1644, -1179, -1945, 2495, -2824, 3277, +-1238, -483, 2003, -498, 144, 890, -1229, -2689, 46, 895, -1108, 759, -1744, 1970, -658, 4810, +-4967, 5752, -1350, -302, 212, -2372, 2115, 3129, -4031, 2592, -427, 1809, 1016, -1986, 2393, -2223, +5005, -415, -6179, 4671, 47, 99, 801, -4714, -1011, 2904, 115, -3624, 2892, -8360, 5689, -1732, +1801, 3285, -8692, 3978, -587, 3265, -2402, -18, -1487, -1441, 1435, 2325, -614, -3365, -4539, 747, +3105, -2003, 3652, -2605, -921, 2414, 2208, -1792, -36, 2218, 522, 963, 3273, 1634, -1084, -1175, +98, 2577, 1440, -8, -2015, 5034, -8306, 5788, 516, -1012, -710, -1847, 1576, -89, -1658, 1062, +-4428, 968, -1484, -49, -1462, -384, -2189, 1316, -246, -4278, 4574, -4099, 3976, -2309, 2611, -3064, +-1018, 1748, -2222, 1695, 1094, -3425, 9018, -6377, 3137, -113, 1355, -1034, 2868, 3424, -2781, 590, +3357, -2526, 6848, -3464, 2250, -763, -2223, 2484, -866, -1714, -7427, 6741, -634, -572, -2269, -364, +-2427, -2582, 5951, -2960, -914, 1271, -739, -3972, 5428, 493, -3023, 2230, -5534, 7394, -4250, 4135, +-230, -5497, 1534, 996, -986, 2403, -417, -4615, 1383, 2223, -2303, 4462, -4753, 3726, 386, -449, +4031, -1990, -3300, 5387, -2523, 3647, 845, 743, -2955, 1830, 1676, -2369, 1901, -876, -1393, 335, +-260, -2340, 2291, -4240, 1486, -2829, 293, 3324, -9141, 8271, -3424, 1424, 143, -2177, 1215, 309, +2160, -1761, 968, -1205, 2439, 492, -1035, 1012, 212, -5800, 5654, -2829, 1664, -4315, 1736, -2097, +2432, 3838, -4065, 656, 1724, -1215, 3278, -559, -865, 3035, -2388, 1430, 2654, -1184, 817, -2880, +3415, -948, -1564, 3755, -9143, 4172, 837, -4332, 1520, -1131, -3875, 5639, -4300, 4505, -1287, -2005, +2642, -737, 65, 2388, -3229, 1007, -856, 3605, -3392, 2267, 1063, -2684, 1644, -47, -370, -1847, +-700, 2867, -3803, 3919, -3216, 1098, 429, 347, -619, 1068, -638, 2086, -1912, 2204, -1588, -370, +691, -1447, 7798, -5320, 2609, -3818, 2015, 367, -2101, 316, -120, -1208, -1615, 2308, -3720, 760, +-2180, 215, 2994, -287, 1949, -2706, 2630, -1901, 3525, 472, -7, 1442, 1001, -1552, 1964, -2369, +3457, -4407, -1928, 2475, -1802, 1339, -2043, -643, -5955, 4829, 674, -4117, 5183, -6198, 1426, 2631, +-1375, -541, -1002, 1534, 178, 818, 2616, -3043, 2314, -1931, 3086, 978, -3439, 4654, -3274, 2019, +1106, 209, 1466, -934, 527, -498, 430, 411, -1007, -2742, 4756, -1210, -2373, 2795, 207, -2432, +2311, -2744, 86, 2018, -5825, -551, 195, -4496, 4930, -4906, 2076, -1234, -4606, 4925, -1120, -762, +1123, -1004, 1164, 1616, 1826, 205, -789, 5263, -2164, 3192, -2639, 5732, 706, -3796, 2245, -2543, +501, 1574, -2629, 1103, -2348, -23, 5625, -6346, 1582, 3419, -7473, 3666, -768, -219, -2063, 2865, +-4684, -327, 4550, -2415, 4524, -4894, -444, 2259, -4806, 5098, -4645, 347, -207, -120, 1427, -2207, +2340, -624, 1849, -73, 805, -776, -2460, 8185, -10396, 6765, 818, 876, 2218, -3258, 3328, -424, +5040, -6109, 4007, -4185, -3905, 8185, -9266, 2408, 212, -71, -2621, 990, -318, -595, 299, -308, +-3295, 5081, -3521, 366, 5473, -5316, 2751, 2217, -3259, 4419, -4801, 3105, -2765, 1188, -839, -1574, +3958, -5287, 4152, -1802, -2092, 8156, -5539, -37, 83, 345, 1167, 1369, 737, -1511, -1145, 376, +5819, -5268, 6906, -8500, 6012, 270, -1534, 1346, -5020, 311, 2827, -2887, 2063, 689, -7890, 689, +347, 1291, -744, 2804, -6731, 3862, -2144, 2223, 1862, -1809, 3706, -4933, 5878, -2965, 3488, -1165, +-1118, -985, 156, 2400, 669, 975, -3251, 279, -1894, 5357, -4922, 2771, -8, -1873, 3498, -880, +-1053, -1292, 3256, -2160, 3421, -2601, 1561, -813, -1491, -1944, 2606, -4124, 5258, -5106, 2419, -1569, +-404, 1860, -2626, 3246, -3049, 1811, -1980, 1479, -607, -837, 3054, -718, 1385, 3241, -2812, -864, +2461, -2446, 3896, 137, -3197, 8, -556, -149, 1094, -226, -131, -1036, -1544, 4119, -3406, -915, +2610, -4617, 912, 1823, 1377, -2298, 1692, -2134, 1544, -459, 1375, -255, -3357, 1237, -1442, -611, +3313, -7194, 4083, -5417, 8030, 1542, 83, -921, -3183, 3207, -1485, 6302, -2338, -2377, 2309, 4092, +-2000, 3760, 750, -5752, 9459, -5901, -132, 5033, -7879, 2471, -1825, 241, 556, -356, -3288, -288, +-1416, 1155, -4611, -122, -540, -1930, -1356, 1263, -4843, 5723, -2219, 2755, -2558, 614, 752, -3130, +5474, -5315, 4923, -1344, -1920, 3205, -1083, 3289, -1557, 5281, -4690, 6193, 713, 197, 4130, -3067, +1436, 4145, -2357, 4287, -3183, 1336, 2906, -908, -2664, 355, -4216, 459, 3272, -2948, -294, -5195, +803, -1941, -2531, -616, -3445, 2134, -3846, 2746, -498, -4085, 1167, -1455, 829, -762, 4103, -1733, +-769, -575, 2643, 100, 1267, -1966, 1358, 284, 2291, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9343, 6041, 7527, 9494, 3916, 11395, +-8949, 25714, -1687, -6558, 5965, 1730, 4056, 1203, 1680, 2430, -2776, 3184, 6023, -8211, 4869, -9205, +9218, 6701, -6555, -1141, -7228, -3268, -6136, -2045, -3445, 1983, -7621, -2948, 2944, -6406, 276, 18009, +-9986, 13145, -3789, 16304, -3097, -1925, 11706, -3305, 7169, 15967, -9470, 10971, -6556, -9353, 15598, -25817, +27711, -11653, -3302, 794, 11512, -13594, -5161, 18689, -29181, 19981, 7321, -5072, 2755, 5071, -7295, 1921, +1609, -1260, 5698, -407, 9379, -10401, 3820, 11983, -7451, -15185, 14187, 5761, -12966, 3280, 16439, -18311, +4366, 10950, -13782, 7275, -2399, -5386, 1407, 3084, -4019, -5187, 8337, -3517, -9705, 8691, -8993, -2824, +-452, -3948, 2522, -10250, 9931, -11651, -11447, 102, 4758, -8971, -4114, -10589, 399, -7694, 8880, -8709, +-12131, 15816, -22830, 11254, -10323, 5138, 3550, -20530, 17438, -7239, 1431, -5633, 463, 5238, -25286, 11789, +14850, -5643, -12089, 1256, 2706, -5662, -2892, 14517, -9552, -5629, 12595, -1999, 721, -702, 272, 3513, +-3964, 9109, -1055, 3219, 4023, 6897, -12038, 5202, 8133, -8132, -720, 3929, 4081, 315, 5308, 2212, +-20674, 7982, -4239, 4162, -13432, 8883, 6200, -13545, 266, 1381, -9988, -2927, -5152, -11509, 4956, 111, +-3291, -10001, -552, -3421, -15747, 6523, -4634, -18373, 2489, 2989, -15880, 5992, 4197, -15811, 5915, -19271, +6917, -440, -3176, -4235, 6607, -2365, -136, -3084, -933, 6716, -7671, -1022, 7421, 7931, -4864, 7055, +-975, -4650, 7098, -1942, 3045, 10392, -2721, -521, 9941, -2455, -3266, 8312, -1864, 1020, -3597, 12151, +60, -15941, 19769, -3094, -4735, 5761, -145, -1234, 3401, -104, -10094, 5347, 11991, -4230, -3781, -7102, +-30, -6400, 7780, 11, -3578, -6977, 12092, -23092, 203, 6405, 1573, -8801, -12366, 5343, -9656, 17042, +-6133, -19006, 4192, -1066, -12513, -8173, 14417, -5507, -12627, 4779, 9011, -17039, 6422, -4446, -10113, -1121, +4174, 4002, -2827, 8805, -5764, -15080, 8384, 3321, 1419, -4724, 2109, -5863, 355, 6101, 6909, 2376, +-9326, 6720, -12180, 8518, 3832, 5348, -2225, 7923, -1490, -2365, 11894, -3637, -3470, 3054, 1706, 2862, +6490, 1942, -1266, -1130, 237, -2906, 4233, -1162, 427, -610, 1868, 13501, -10051, -4565, 2075, -5842, +-2188, -2586, 5288, -6596, 2976, -1483, -3799, -9082, 1450, -7623, 157, 222, -10641, 10810, 2506, -11776, +3307, -2762, 1094, -13842, 5562, -4649, 9485, -905, 622, 594, -5038, 1122, -12430, 6521, -4056, 5216, +1312, 2467, 3233, -13972, 5280, -8399, 2031, 3537, 7966, -4840, -4989, 16121, -7487, -748, 2444, -107, +-3647, -3280, 8619, -2769, 1770, 19126, -22689, 816, 9913, -8723, 5228, 241, 883, 2641, 514, 4078, +1818, -10694, 2607, 1491, -5614, -4267, 11565, 1294, -18909, 8273, 3304, -10194, 3484, -1529, -10829, 1737, +-2168, 10198, 3669, -10102, 6770, -4792, -5983, 13805, -1803, -10221, 9287, -3429, -3998, 14073, 2773, -11482, +450, -2020, -8124, 12655, -2153, 2035, -7128, -3264, 7027, 2750, -3660, -5581, 956, -4951, 8730, 4741, +-6431, 4578, -5382, -7590, 3998, 3873, -5066, 2724, 4636, -2005, -4212, 3284, 648, 4438, -9619, -2936, +10136, -1052, -371, 816, 3305, -1850, -1703, -3695, -4012, 422, -418, -757, 2129, -2013, -1230, -3806, +-4905, -2216, -2707, -776, -3303, -2634, 5531, 521, -6385, 8087, -2843, -8458, 3731, -150, 2632, -6186, +8531, 2397, 597, 1321, -8352, 1169, 6247, -7996, 6595, 3560, -3617, 11460, -11764, 3863, 6264, -9855, +5239, -4944, 5550, 440, 7073, 4615, -7577, -828, -4751, 1231, 1404, -1315, 7095, 942, -767, 11198, +-11903, -2032, 8269, -18640, 5134, 17193, -6753, -4817, 1194, 1933, -5900, -866, 2054, -1648, -8236, -7108, +14216, -1627, -9186, 7154, -3047, -7664, -1821, 1809, -1965, 6412, -8237, -145, 3782, -5568, 4771, -7973, +1052, -4047, 2813, 636, -530, 7569, -15092, 5220, 3814, -6913, -3591, 1780, 2598, -2955, -2037, 7786, +-392, -7685, -3041, 2186, 369, 2644, 2857, 2167, 3523, -3337, -1721, 4910, 8694, -7155, 3313, 11817, +-8778, 4224, 6354, 327, 4918, -2877, -432, 5203, -2009, 3374, 2082, -7787, 3000, 10261, -3637, -1735, +101, -3750, -2818, 4866, -11230, 4844, 10802, -16187, 3580, -469, -9604, -3738, 6054, -1904, -16375, 7471, +10375, -8569, -5633, 7020, -4866, -16852, 2836, 6175, 340, 2469, -393, -7440, -5807, 8455, -6436, -335, +6015, -6649, 4388, -453, 1094, -690, -1873, 4536, -2758, 958, 2487, -309, 1662, 2640, -1949, 4387, +4902, -6350, -4272, 8498, 2996, 812, 7896, -4459, -3187, 5332, -6397, 3339, 4091, -5436, 1232, 1103, +2764, 3596, -1112, -218, 841, -2827, -4466, 7827, 2780, -10734, 9097, 3946, -6583, 8321, -3284, -11433, +4456, 1612, 624, 491, 4364, -8255, -1988, 3532, -3716, 3827, -9516, 10989, -2302, -13821, 8232, 3786, +-2609, -3432, -2715, -536, -5172, 8033, -6083, -3337, 7173, -11894, 2974, 2625, -7884, -4525, 4805, 5108, +-8013, 13476, 1066, -14434, 9714, 198, -7083, 9887, 6165, -5656, -2061, 9383, 8557, -10029, 5902, 172, +-9417, 11985, 598, 795, 4735, 1777, 446, -4624, 8470, -1049, -4609, 10751, 846, -4746, 4333, 3488, +-3734, 1902, 4257, 520, 778, -1946, 83, 904, 601, -8232, 3722, -2134, -3678, 2992, -5119, -784, +133, 2305, -12517, 167, 7664, -6493, -3640, -9284, 9433, -4485, -7722, 11437, -7843, -6445, 1926, 6688, +-4477, -9677, 4893, 3288, -7928, 5816, 7623, -388, 4180, -6139, 1911, -4576, -1451, 14438, -5767, 5686, +4100, -5173, 2719, 4246, -4434, -2160, 5255, -1688, 4183, -1170, 3081, 8683, -6620, 1244, 3566, 2174, +-334, 1062, 7933, -2050, 2673, -2784, 1036, 3333, -6387, 13742, 955, -7486, 7120, 77, -968, 2717, +-707, -12546, 3221, 9724, -1673, 1761, 5064, -7080, -3664, -1316, -3251, -5651, -129, 5369, -2711, -2591, +9901, -4611, -11437, 4128, -3579, -1354, 3246, -2840, 1495, -3078, -7767, 7832, 3366, -5430, -3050, 1653, +-3855, -1012, 7939, -6410, -2609, 4261, -9986, 5182, -33, 3316, 1407, -7890, 7535, -1844, -4261, -2452, +2171, 393, -3786, 13554, -1700, 631, 8346, -4446, -1984, 2409, 5561, 3229, 605, 49, 5725, 1864, +250, 9796, -2651, 1728, 2792, -8358, 4692, 10827, 1222, -8754, 8824, 8739, -7439, 3476, 3702, -422, +-2542, -5230, 7731, -6429, -5944, 13653, -6600, -5716, 4956, -3680, -1020, -1238, -2463, -2033, 958, -5946, +-3570, 1789, -7496, -1858, 9246, -12244, 3223, 8683, -15539, -5936, 4999, -2067, -6376, 6373, -4181, -4364, +6616, 3449, 5278, -11249, -1316, 8225, -10002, -1855, 14197, -3973, -2179, 11447, -5284, 8467, -298, -6208, +5899, -4507, 6427, -487, 4513, -1311, -7297, 12543, -2651, 220, 7567, -7502, -4956, 1575, 1802, 2755, +4902, -328, -5984, -4655, 8325, 362, 2363, 10181, -8730, -2240, 4641, 2545, -2054, -3495, 2882, 4343, +3438, -6239, 11408, 2090, -12581, 3277, -2334, -4866, 3656, 3649, -2836, 2692, 4853, -5007, -74, -508, +-12782, 1222, 3472, -5269, 10718, -1187, -3340, 4618, -13056, 1048, 9943, -7179, -2175, 4026, -1623, -949, +5580, -8031, -6273, 8260, -8138, 4961, 8493, -12498, 5031, 7362, -11781, 2578, 2538, -7394, 8511, 958, +-3682, 7808, 1217, -150, -4264, -1304, -4112, 189, 3316, 4488, 4705, -3448, 7002, -307, -2746, 5663, +1591, -3376, -1117, 3634, -1981, 6285, 6855, -7075, -2986, 1215, 3168, -5715, 325, 185, -3647, 1554, +-4929, 133, 880, -2234, 4456, -8345, 97, 2767, -3482, 3264, -10824, -1328, 14718, -5810, -6259, 3506, +-4520, 2464, 8547, -3695, 873, -136, -2670, 1248, 2792, 1514, 4136, 1010, -2153, 10791, 4515, -7540, +4624, -534, -5500, 3653, 3405, 3349, 2528, 1672, 2156, -1629, -5367, 1463, -2455, -2468, 3270, -3275, +-1911, 10246, 2002, -13690, -576, 2697, -343, -927, -3198, 3958, -4075, -5214, 2770, 7297, -1564, -8794, +1337, -2971, -1554, 3847, 2122, 3022, -6723, -5229, 918, -2747, 2652, 7638, -3323, -3136, 8458, -10168, +-833, 7530, -10234, -2607, 3212, 1172, -1436, 4072, -171, -2430, 647, -9079, 7418, -713, -6895, 4270, +3436, 2968, 816, 4251, 820, 432, -2360, -4307, 9793, 5183, -3363, 6179, -1505, 107, 10951, -2975, +3255, 1479, -5084, 6338, -75, 11314, 4038, -9330, 5368, -2262, -365, 3710, 2684, 746, -3147, 2774, +4634, -5561, -3396, -2874, -6472, 3472, 3229, -616, -4510, 1247, 647, -13061, 3242, 4353, -13389, 1333, +4125, -8831, 3523, 11437, -7918, -9096, 2862, -10982, -5480, 10456, 807, -7228, 1234, -253, -1993, -4898, +-812, 2541, -2911, 411, 4348, -1320, -3194, 4469, 3202, -3678, 4662, 4015, -4541, 4093, -1691, 5112, +7468, -1111, 3920, -3685, -3265, 8944, 3277, 107, 3988, 2632, 79, 1586, 3891, 4077, -3077, -4065, +2417, 6917, -1015, 2596, 8944, -7239, -1187, 241, -7904, 5561, 2045, -4490, 2001, 2431, 3635, -3351, +-4059, 2373, -5513, 253, 6978, 1908, -12066, 3329, 15101, -15621, -7540, 13714, -6605, -4817, -723, -1992, +1792, 570, -12, -2549, -3537, -6232, -4976, 5475, -2106, 1483, 713, -4953, 1890, -6632, -1235, 4832, +-4388, -185, 2115, -1834, 819, 6377, -5616, 1552, 6122, -13562, 698, 13638, -3711, -3423, 8965, 4155, +-3219, -2542, 3679, 706, -3873, 9870, 3273, -1753, 9482, -3774, -1013, 4585, 876, 3172, 4749, -2576, +-2479, 6999, -167, 2230, 7811, -6798, 1299, 2121, -7915, 3843, 4561, -7151, 6960, 5171, -13522, 4672, +-741, -12617, 4209, 1964, -745, 4796, -6338, -5919, 1937, -7101, -3991, 6891, -4062, -7706, 6662, -1158, +-3203, 6878, -8461, -3638, 1917, -3790, 3851, -3617, 1460, 4798, -1452, 2501, -2495, -2023, -7412, 5067, +7095, -5764, 4845, 1391, -3889, 379, 3420, -63, -2915, -3057, 7146, -2004, 42, 9100, -2237, 4304, +-6232, -7393, 8830, 2417, 5494, 47, 3832, 2276, -8498, 5237, 2200, -1852, -407, 30, 7246, 42, +-1835, 1437, -2083, -3532, -896, -94, -148, 2885, -1078, -1300, 939, -3911, -2780, 4730, -2331, -5792, +2157, -3764, 505, 4585, -6208, 177, 3000, -6778, -298, 3811, -4675, 396, 1997, -3548, 3912, 759, +-10390, 4695, 5090, -9644, 1107, 2889, -2526, 3174, -2395, -1712, 315, -2046, -184, 345, -781, -1538, +-290, 584, 1756, 2088, -3570, -2536, 431, 1334, 3646, -340, 4882, 1278, -2663, 10113, 2506, -8592, +5204, 1151, 694, 12971, -273, -5885, 6261, 6378, -4795, 1088, 6795, -3920, 3720, 5047, -4267, 4738, +-2185, -1315, 1451, -5988, 2550, 691, -3755, 264, -700, -4924, 2424, 4105, -12254, -6126, 7867, -5541, +-4787, 5250, -5457, -2312, -3582, -5013, 9708, -5271, -7601, 1327, -4231, 1755, -2143, 11, -685, -4351, +-3008, -145, 2660, -5724, -2170, 3282, -732, 1123, -4214, -685, 7569, -7558, -2002, 10132, 854, 1040, +85, -1432, 1243, 1513, 2555, 3725, 3460, -3129, 3472, 4016, 3385, 10107, -3201, 40, 1222, -7319, +9026, 9288, -2698, 4149, 3734, -4144, 3752, 455, -3131, 6406, -396, -698, 1662, 198, 592, -1129, +694, -2857, 2719, -3463, -3402, 5431, -2921, -5003, -49, 255, -1417, -1056, -857, -3174, 2627, -2116, +-3938, 871, -7243, -4905, -250, -3731, -50, 1976, -7666, -1735, -670, -4159, 1933, -5880, -5512, 1524, +-5453, -1260, 3752, -2380, -3243, 3032, -2611, -3841, 4346, -2563, -1807, 239, -1916, 7154, 1501, -5007, +9178, -3967, -1259, 14734, -2989, 68, 5519, -4219, 4692, 4783, 3858, 7260, 2343, 283, 3838, 5026, +-773, 3439, 1823, -4773, 5934, 6897, -3, 1341, -1278, 2088, 2675, -2591, 3814, 1464, -785, 515, +-7272, -529, 4603, -55, -1911, 2618, 1675, -4515, 254, -2018, -8679, -2965, -1679, 3301, 1187, -3358, +-2628, -3777, -5214, -3035, 2279, -4723, -5505, 2244, -7437, -1877, 5064, -6376, -363, 691, -4897, 682, +-2369, -4187, 2739, -1534, -1232, -3082, -3781, 4512, 1681, -694, -745, 946, -651, 741, 1890, -8228, +3448, 5440, -6223, 12340, 6011, -6354, 5112, -92, -2489, 4624, 3405, 1496, -919, 2331, 7297, 3737, +343, -482, 3792, -823, -1599, 7555, 1532, 1227, 1464, -4525, 1270, 4053, 2604, 5834, -3211, -4302, +1346, -1623, 3133, -4847, -3851, 1569, -1143, 3376, -5029, -1551, -1189, -3038, 2608, -9937, -1117, 4019, +-7477, -2843, 2431, -351, -2766, -849, 212, 437, -6392, -3113, 3775, -7542, -845, 4400, -3748, 4453, +4942, -9181, 1101, 4356, -8630, 6518, 1614, -7952, 8989, -1110, -6830, 9273, 3202, -5845, -567, 1955, +-42, 3905, -1468, -2499, -1350, -2833, 8032, 1556, -5566, 5125, -404, -4019, 5578, -2277, -2102, 3700, +-2297, -547, 2633, 2783, 1793, -365, 37, -483, 2574, -2833, -2459, 3154, -1303, 1212, 4068, -2737, +3374, 997, -4908, 3350, -562, -2666, 1588, -2402, -2179, -713, 4474, 995, -3768, -928, -763, 2187, +-5311, -3165, 6052, -3866, 2261, -2791, -3240, 9126, -4705, -4413, 6787, -2011, -6069, 4217, 2734, -4218, +2864, -707, -5566, 4568, -315, 81, 4704, -2865, 1358, -2192, -6072, 5797, -2390, -4118, 7793, -2088, +-667, 7175, -2611, -1378, 2015, -2076, -2848, 1808, 2125, -317, 5400, -464, -4450, 5375, 840, -6170, +-3094, -267, -557, 1606, 5137, 1489, -4501, -3600, -319, -4402, 450, 3958, 1342, -919, -2361, -24, +-554, -4861, -3916, 1706, 3221, -3177, 867, 5367, -5833, -4631, 3259, -2058, -2258, 1783, 862, 5259, +2604, -3044, 4719, -1735, -4838, 4080, -457, 2261, 4212, -2811, 1407, 4144, -2865, -807, 2683, -1562, +-1321, -193, 2700, 7619, -5020, -6412, 9443, 1187, -3557, 3645, -3129, -856, 7488, -5634, 628, 8660, +-5336, 114, 685, -2238, 3916, 2444, 828, -1903, -849, -949, -881, 909, -3386, 1913, -167, -2976, +1636, -7082, 4021, 5851, -10909, 4398, 3553, -8217, 1244, -1083, -712, 4910, 1309, -3243, -1473, 2632, +-4337, -1965, 2678, -2294, 2569, 535, 768, 4872, -2864, -2628, 1349, -2449, 474, 580, -3307, 3699, +820, -3315, 755, -1522, -5804, 784, 3803, -2086, 3754, -1665, -3126, 5900, -3811, -135, 6414, -2622, +1025, 1883, -1497, 5990, 6338, -4367, 245, 6029, -2613, -111, 4745, 1642, 603, -758, 2041, 6375, +-2971, -6770, 2395, -2471, 885, 5410, -3265, 4804, -1216, -3064, 4664, -4472, -3388, 1368, 1326, -195, +1417, 5168, -4503, 2243, 2631, -10247, 3972, 4002, -5219, 2119, 3325, 722, -3017, -754, -956, -3548, +-521, -182, 3907, 1243, -1018, -1380, -5251, 3427, 983, -7822, 2082, -1278, -3954, 8061, 1303, -2874, +374, -7799, -1424, 5323, 310, -1487, 3146, 5048, -1700, -14, 2560, -1117, -3673, -2970, 5971, 685, +194, 5704, -5614, -550, 3247, -5309, 6145, 5548, -5267, -1394, 2078, 526, -1067, 2162, -195, -1003, +-236, -2920, 5648, 3729, -7998, 2271, 5769, -4435, 539, 2344, -432, 3091, 1506, 688, 755, -790, +4627, 3680, -4218, -2473, 2640, -1216, 3472, 3118, -5752, 3488, 2431, -3573, 4400, 703, -3517, -1554, +-652, 501, 1231, 2290, -737, -1635, 2466, 2588, -2143, -6693, -1928, 2706, -682, 3847, 3738, -3405, +2158, -1464, -5880, 1830, 180, 3420, 5635, -8456, 734, 4122, -5686, 1566, -1383, -5593, 4019, 6435, +-1524, -397, 3271, -6977, -4640, -489, 162, 6153, -3011, -988, 6079, -4256, -2058, -508, -3017, -1067, +-4119, 3151, 3779, -5148, 2974, 2698, -3224, -2345, -322, 2867, -4434, 3031, 2563, -4788, 7323, 958, +-1777, 1535, -2287, 1964, 3401, 4715, -4361, -2976, 8065, -1033, -767, 1513, -1427, 4636, 1260, 1566, +3546, -4394, 3618, 3819, -5267, 3727, 1820, -1204, 2526, -2538, 660, 6962, 1784, -369, -198, -2250, +-664, -2331, -2937, 4038, 7170, -1802, -2915, -409, -2758, 3548, -1518, -5549, 499, -2479, 2971, 6368, +-2197, -5748, -1422, -587, -4810, 514, -390, 840, -646, -8035, 5278, -527, -6807, 3951, -6502, -3472, +9269, 297, -4027, 487, -3059, -6076, 628, 2709, -249, 1973, -84, -5046, -660, 5971, -587, -2406, +988, -3879, -1790, 5030, 4352, -2538, -3901, 3911, 2431, -624, 902, -1005, 795, 4452, -365, 2343, +8925, -259, 371, 1561, -6397, 8604, 8573, -7220, 2632, 3410, -1862, 4128, 3848, 51, -1674, -831, +3790, -270, -2079, 5630, 1361, -9440, 592, 7906, -2824, 63, -1587, -6595, 6540, 1650, -4314, 4102, +-3583, -3748, 858, -4463, 572, 1398, -3815, 677, 3230, -4158, -5000, 2361, -2216, -4907, -692, -1911, +4538, 1126, -7528, -211, -3178, -7120, -938, -793, 112, 151, -4566, 332, 3056, -6164, -3619, 2128, +-880, 2246, 2686, -521, -1747, 33, 810, 3911, 3459, -2657, -828, 4319, 3968, 1240, 2663, 5816, +-169, -2957, 1165, 2057, 2469, 3860, 3801, -2864, -702, 4612, -1765, 2715, 2957, -6612, 1653, 6571, +-474, -142, -506, -431, 1248, -3219, 55, 8492, -1183, -7896, 4205, 3572, -5350, 2842, 648, -4513, +3851, -1018, -5255, 2262, 867, -4727, -4534, 2249, 2873, -3276, -431, -874, -5407, -3905, 4072, 3190, +-3891, 294, -3321, -4653, 3711, -816, -1042, 1359, -2387, 450, 2849, -809, 937, -520, -4133, 703, +2214, 239, 2289, 1144, -3036, 1832, 1041, -3268, 1218, -3020, 440, 3198, -5153, 2558, 3636, -3196, +-173, -2162, -2580, 7300, 4636, -6649, -17, 5466, -3535, 105, 2020, -801, 4296, -690, -105, 6757, +-93, -629, -1782, -2054, 4909, 844, 42, 5441, -542, -5728, 3360, 2458, -7095, -1624, 2600, -2637, +-1043, -1386, -3889, 2090, -2275, -4692, 2439, -1700, 2004, -2515, -6797, 3114, -1992, -2836, 2871, 499, +-1553, -613, 3764, -1684, -3576, 2029, 2962, -87, -2655, 4102, 701, -3513, 4412, -1980, -1361, 5082, +-708, -261, 2719, 17, -3332, 2867, 4266, -4008, 3769, 4686, -3119, 2153, -310, -2473, 1739, -3009, +-2451, 3227, 1367, 2798, -2201, -6894, -1092, 2075, 997, -1040, -1603, -4073, -3718, 2334, -1694, -836, +4888, -5745, -5333, 1641, 1232, 1036, -3030, -2050, -381, -3131, 40, 2128, -1580, -3842, 1873, 3276, +-1160, -2803, 567, 1243, -3816, -1267, 6684, 2810, -2638, -6, -512, -52, 1628, -12, 1036, -1679, +-3435, 2477, 3947, -536, -1904, 226, 969, -610, 750, 2043, 3063, -2399, -4312, 3811, 1563, 1036, +4835, -1300, -1377, 5223, 266, -835, 3541, 432, -1803, 4469, 5396, -6206, -4587, 5357, 130, -3222, +2928, 6494, -3449, -9123, 4201, 3156, -4007, 3044, -413, -5659, 1252, 2143, -4103, -2147, -1285, -4304, +1270, -1514, -4856, -707, -3253, -2678, -437, -3743, -75, -750, -4657, -2880, -2758, 1175, 243, -1495, +1381, -3224, -1476, 2058, -2145, -3143, 3053, 1873, -2360, 1932, 1942, -1798, -111, -1486, -679, 3713, +117, 5120, 5429, -5209, 967, 931, -2578, 4321, 936, 1845, 3860, 502, 17, 2076, 880, -1375, +2910, -765, 1091, 7473, 170, -3110, 1040, 1113, 17, 2793, 4606, -3423, -6465, 5821, 5273, -4602, +61, 3905, -1844, -5624, -124, 5095, -1728, 983, 1812, -7655, -887, 1060, -70, 1351, -6170, -361, +-681, -4659, 5795, -338, -6003, -2517, -2413, -157, -2055, 1030, -2926, -4921, 4043, -31, -2193, -1942, +-5763, 470, -812, -1771, 1321, -1333, -594, 55, -2565, 464, 2643, -3220, -1455, 3305, -2480, 2307, +6546, -930, 86, -1415, -936, 4561, -1032, 1331, 5767, -1199, 4098, 4233, -3277, 674, 4006, -884, +327, 9234, 1789, -4292, 1566, 1079, 288, -2870, 1234, 6117, -4820, -2277, 3846, 232, -232, -1069, +-817, -1296, -2845, -435, 272, 2314, 3264, -4252, -1181, 1747, -2482, 738, -2166, -1518, 387, -237, +5589, -1969, -2573, 1355, -3695, 2196, 1339, -3774, 1138, 1057, -1785, 1199, 3823, -3377, -4437, 1213, +-263, -1053, -1254, 534, 2405, -3729, -1656, 343, -5695, 2068, 6605, -6584, -6162, 5987, 578, -4003, +4580, -3007, -7884, 1592, 2284, -157, 3558, 2966, -1204, 1325, 1917, -1155, -2533, -1294, 4942, -891, +-2030, 8722, 1117, -5913, -2513, 1113, -33, -2703, 3936, 4772, -4529, -3352, 4166, 4282, -1788, -2792, +327, -995, -1139, 2398, 1581, 885, -3351, -5962, 832, 5117, 1084, -3976, 880, -310, -3640, 154, +2162, 2482, -3728, -2362, 648, -4224, 1765, 4987, 1075, 3242, -1390, -2788, 2927, -1394, -2948, 4322, +4441, 1848, 1002, 1584, 1337, -3650, -4369, 2491, 5825, -615, -3488, -1024, -254, 4599, 4439, -3632, +-4085, -814, 1525, 730, -3397, -867, 2472, -391, -1281, 427, -1855, -2901, -866, -1573, 80, -244, +-3655, 584, -1592, -4107, 900, -181, -722, -663, -323, 1382, 1057, -1940, -2249, 2712, -4450, -7201, +2128, 1954, 2789, 1517, -3910, -1483, -3591, -4330, 3258, -727, -3084, 2533, 827, 2206, -400, -4450, +3693, 3264, -5714, -2451, 5635, 605, -3176, 6528, 2119, -3007, 5378, 2201, -2533, -1454, 257, 4551, +6331, 884, -1884, -12, -43, 1180, 1889, 4329, 8234, -1596, -6698, 4534, 5120, -526, -2507, 1412, +3475, -1477, 4403, 3338, -4679, -804, -620, -983, -3300, -3465, 4584, 2448, -4128, -3609, -534, 420, +-478, -1361, -4494, -4195, -1286, -573, 367, -3757, -6624, 1231, 3158, -2560, -2083, -5612, -6748, -2716, +-567, 2259, 479, -1278, -3472, -2610, 818, -1795, -949, 129, -1735, -152, -1350, -1498, 946, 1169, +1023, -85, -383, 496, 3581, 3900, -2806, -775, 4561, 787, 1524, 281, 744, 4754, 2752, 3583, +1297, -385, 2873, 2156, 519, 454, 1125, 1312, 6567, 4195, -4203, 5155, 6300, -6415, -4318, 4478, +2945, -644, 2565, 4755, 1450, -2085, -819, -1328, -4718, 1722, 4897, -3911, -3443, 2866, 1645, -1545, +-2935, -3191, -809, 1488, 206, -3147, -2986, -1327, -297, -3030, -2104, -309, -4910, -1148, 1201, -3627, +-1040, -253, -5043, -4531, -2833, -4162, 1500, 2989, -1573, -1751, -3587, -436, -880, -3827, 3035, 402, +-4710, 2413, 4897, 151, 835, 716, -996, 2399, 1194, 570, -529, -2224, 1163, 2700, 3876, 2109, +-1885, -884, -111, 988, 2673, 2136, -103, 172, 2538, -770, 2622, 5772, -1313, -2018, 1117, 2320, +3425, 828, 1977, 1799, -3228, -1950, 5397, 5062, -4957, -105, 8921, -3852, -4523, 6259, -800, -5066, +681, 3534, 1767, -776, -2224, -3013, 445, -380, -3466, -1623, -1364, 454, -2404, -3582, 3541, -899, +-3057, 162, -4233, -1461, -1725, -4307, 1641, 437, -1332, 906, 1183, -2183, -3141, 1399, 220, -2063, +-253, 982, 2583, 747, -2054, 551, 1552, -1974, -768, 539, -642, 1532, 2916, -411, -4041, -469, +3324, 1351, -124, 1995, 712, -2607, 791, 1417, -2633, -2005, 3207, -189, -5319, 3138, 2473, -1958, +2696, -2449, 453, 1545, -6663, 1991, 5608, -2094, 747, 2565, 2271, 519, -2953, 1542, 234, -4191, +2721, 5113, 2302, 975, -3187, -702, 3805, -809, -562, 2558, 51, -426, -1834, 2094, 5026, -1942, +-4048, 660, 2798, 725, 3165, 1295, -3511, -1298, -2797, 596, 4712, -692, -791, 1674, -2349, -988, +1783, -1812, -2354, -4777, -1174, 6176, -2845, -4815, 1144, -1501, 858, 2386, -1527, -1955, -2922, -3418, +2476, 2270, -772, 2150, -443, -6210, -3421, 3951, 2006, -1401, 413, -1259, -4389, -1095, 4044, 417, +-2250, 1566, 1688, -1269, -2333, 2391, -42, -4962, -825, 1721, -1220, -536, -397, -4066, 1592, 2643, +-4661, 603, 1050, -2628, 2286, 1387, -285, -407, -2187, 1412, 4584, 802, -732, 1464, 1345, -1230, +-2791, 3211, 5630, 591, 542, 2522, 3004, 417, -1415, 3435, 1525, -2120, 4474, 3726, -3271, -1628, +2363, 4593, -744, -3933, 895, 1726, 378, -12, -780, 1328, 1498, -3628, -922, 1980, -4309, -964, +5445, 1143, -3938, -2797, 38, -3769, -303, 3968, 117, 790, -1601, -1992, 60, 65, -1873, -4451, +-131, -411, -1201, 1973, -1163, -2626, -2272, -3264, -1712, 2633, 1169, -3256, -107, -511, -1641, 911, +-1507, -2604, -404, 334, 1980, 1312, 271, 187, -5231, -2646, 5365, 2006, 1955, 984, -3009, 872, +1290, 2010, 3967, -543, -2349, -1052, 3385, 3898, -900, 3746, 2000, -3759, 693, 3635, 2277, -1074, +-606, 1533, 380, 1910, 3274, 1195, -1927, -496, 3984, 2831, -2991, -1985, 1014, -1083, 3112, 5781, +-890, -4506, -2766, 1040, 1623, 2883, 1168, -3669, 487, 327, -4953, 2620, 3346, -4366, -140, 1707, +-1428, -747, -460, -888, -1201, 1911, -266, -2076, 2576, 591, 941, 60, -3001, 122, -1039, -4590, +-346, 2567, -3326, -775, 1406, -5436, -2067, 1206, 566, 321, -1673, -1199, -2220, -2138, 1855, 946, +-1287, 1128, 2583, -2610, -4028, 289, 202, 1758, 2518, -1061, 2616, 3065, -470, 2161, -117, -1060, +2581, 1187, -543, 2279, 4147, 215, -3152, -262, 2953, 1584, 1248, 777, -625, 921, 159, 841, +642, -3094, -445, 5268, 3951, -682, 721, -149, -1771, -1238, 1675, 7898, -682, -3056, 2290, -3591, +2817, 8346, 1575, -2128, -3786, -1605, 1515, 1978, 2265, 1129, -978, -1522, 2826, 2642, -4497, -4295, +70, -335, 2504, 3518, 448, -3497, -3682, 2494, -413, -1233, 3580, -2175, -3682, 1669, 477, -620, +-514, -3622, -4214, -1925, -139, 3636, 1510, -3673, -3298, -4196, -3103, 682, 1001, -2326, -2703, 1248, +1621, -3087, -4186, -2, -1507, -1518, -382, -440, 2534, -766, -3010, 2705, 4329, 241, -2967, -1291, +2035, 1222, 2696, 6322, 344, -2461, 4342, 2843, -1850, 191, 6025, 5111, -3101, -1586, 3775, 379, +2024, 4577, -685, 200, 1607, 226, 1346, -16, 2091, 3133, 645, -139, 42, -424, 663, 4909, +822, -1786, 3192, 877, -1505, 1289, 150, -993, 820, -866, 874, 2554, -2902, -1487, 1987, 1552, +-2069, -4731, -1462, -804, 2290, 4186, -3243, -4811, -2604, -1300, -599, -2774, -3552, -3334, -3360, 560, +1625, -5146, -5946, -1506, -2214, -3628, -2757, 885, 833, -6275, -4116, 2861, 1076, -1799, -1247, -1650, +-2755, 1933, 3564, 2778, 2340, -5077, -1486, 4125, 1394, 4891, 4495, -267, -402, 3350, 6393, 3655, +-413, -1721, 1234, 4202, 6167, 2038, -135, 7150, 1285, -1610, 4074, -275, -232, 841, 979, 6555, +3847, 145, 2225, 11, -4020, -171, 4577, 1772, -645, 369, -95, 341, 142, 260, 1240, -2098, +-3504, 900, 3283, 1251, -3578, -5016, -3128, -2058, -2747, -2899, -184, -789, -2318, 1718, -1320, -7888, +-2598, -622, -1923, 2119, -622, -3544, -157, 1672, -1636, -4826, -692, -294, -3383, -2386, 819, 499, +-1201, 3423, 1372, -2404, 218, -2567, 1101, 2136, -2303, 3289, -136, -2297, 3039, 626, 2123, 1880, +-1937, -61, 1260, 716, -667, 3156, 4067, 340, 1588, -233, 1351, 4255, 830, 1488, 1370, 2826, +2097, -1265, -978, -853, 2675, 3856, 2686, 1271, -2054, -1480, 1066, -1256, -1113, 2046, -1742, -2588, +1681, 1749, 3270, 297, -5394, -2349, 262, -1937, 720, 1447, -1852, 1612, 427, -477, 2824, -1874, +-887, -361, -3642, 2331, 3094, -1684, -952, -1859, -2196, 3512, 3487, -2359, -3473, -2333, -1186, 1575, +2092, 1203, -279, -4071, -2479, 750, 1489, 691, -2862, -42, 738, -2930, 5, 1266, -1855, -2966, +1437, 5402, 2244, -2256, -170, 2361, -3339, -3720, 1790, 465, 2162, 3151, -2093, 386, 2763, -3619, +-4049, -1662, -405, 1443, 908, 1062, -557, -2169, 450, 896, 172, -182, -1378, 868, -130, -3635, +2448, 3603, -1400, 827, 69, -186, 454, -1093, 144, -789, -26, -86, -1134, 1033, 712, -744, +-240, 858, -854, 21, 3974, 1224, -1807, 808, 3725, 1013, -1846, 1398, 4093, 2627, 2449, 2551, +-2203, -2937, 1359, 1240, 1423, 5008, 3989, -225, -1705, 182, 2046, -248, -300, 3048, -3276, -5726, +4450, 2637, -4036, -2258, -1476, -1378, -2331, -3842, -221, -1644, -4413, -2045, 681, 2078, -846, -3860, +-3979, -1056, 1843, 1147, -1385, -3753, -2210, -741, 2230, 4907, -2405, -4671, -40, -570, -1073, 768, +1683, -629, -5727, -4898, 2845, 4164, -918, -3302, 2, 2255, -2417, -1232, 4882, -1039, -7366, 526, +6863, 1278, -896, 2824, 1006, -1623, 1597, 4769, 308, -432, 1653, 191, 6232, 5620, -767, 2414, +20, -638, 2120, 511, 5722, 4819, -1603, 1427, 2055, 188, 1711, 2842, -218, -557, 2516, -346, +2002, 358, -5578, 2097, 2506, -2899, -890, -712, 552, 1082, -1166, -2002, -2338, -1967, -2862, -2222, +585, -1700, -2634, -288, -1573, -4499, -4456, -28, -1809, -4248, -1471, -3078, -1616, -1098, -3103, -1204, +-2060, -1216, -2326, -5001, 459, 2104, -3267, -3168, 937, -173, -3078, 799, 2901, -2736, -3064, 1048, +4240, 2162, -2943, 2417, 2573, -2076, 2541, 5120, 3954, -98, 2249, 3095, 555, 6395, 1881, -3030, +2262, 3146, 4438, 2705, 488, -582, -1999, 2152, 5425, 2206, -3669, -2192, 1929, 336, 1903, 3258, +325, -1406, -2532, 1395, 3030, -1529, -529, 517, -1087, 988, 280, 1085, 2262, -3176, -3117, 2382, +1106, 178, 837, -2370, -3958, -456, 2579, -642, -2714, -4975, -5332, 729, 759, -1048, -4724, -7515, +-611, -2496, -4342, 2622, -961, -4978, -1907, -1909, -2736, -1018, -1937, -1122, 1222, -1666, 200, 4952, +-204, -1272, 1248, -1540, 2094, 2711, -2728, 1821, 3636, -1104, 505, 2831, 690, 1458, 1834, -1328, +3981, 4028, -2691, 2910, 2106, -2079, 3692, 1373, 589, 4762, 529, 1864, 2293, -2469, 2494, 3445, +1253, 2808, 290, 72, 2363, 2177, -2072, -1018, 2140, -2579, -179, 2276, -1899, -2527, -906, 2829, +-310, -3590, 377, -3671, -4001, 1142, -335, -2136, -3100, -2613, -1226, -105, 576, -1278, -3011, -3811, +-417, 949, -2317, 2494, 3200, -3530, -2470, 2422, 1867, -560, 1830, 80, -3229, 1415, 1997, -126, +-254, -3057, -557, 2917, 654, 613, -1459, -3668, 448, -133, 1951, 2870, -2088, -473, 1325, 2862, +1746, -606, -845, -4218, -300, 3095, 1751, 1120, -3358, -723, 611, -1514, 3156, 1693, -1917, -821, +-2265, -949, 2640, 745, -2560, -1682, 603, -334, -847, -246, 168, -990, -1803, 2590, 2544, -829, +98, -2709, -1931, 3770, 2681, 1312, 409, -2581, -251, 2104, 1408, 703, 1227, 4044, 309, -1318, +2702, 640, 763, 511, 178, 1171, -1027, 2379, 2773, -1263, 390, -242, -1163, -42, -602, -181, +2828, 1449, -1765, 1169, 409, -1859, 1528, 239, -77, 2741, -558, -1453, -671, -484, 783, -845, +-2176, 15, 698, -2769, -2559, -148, -1529, -248, -579, -2164, -2183, -4109, -2, 1489, -2808, -2533, +-3110, -1834, 755, -3147, -2743, 455, -1899, -502, -390, -2638, 2087, 241, -3802, 1476, 2278, -2005, +-1523, 603, 1148, 3139, 1259, -1065, 1394, -533, 611, 4954, 1569, 1016, 2020, 502, -415, -606, +4727, 4929, -1508, -1809, 1187, 3674, 3286, 3022, 1713, -1051, 1994, 3898, 1634, 388, 1312, 2619, +1104, 1694, 1502, 665, 837, -1216, 149, 1777, 1324, 1825, -1434, -3477, 775, 2085, -849, -2886, +-3745, -571, -474, -2699, 626, -896, -2911, -2260, -3848, -2876, -3039, -2250, -1990, -4435, -3907, -1574, +1343, -1078, -5714, -3349, -1051, -106, 1489, -448, -1928, -438, 763, -1940, -4763, 542, 2782, -1712, +790, 3084, -616, -961, 475, -59, 1038, 2147, 2320, 2420, -344, 1657, 3866, -1574, -676, 2358, +1987, 2785, -271, 473, 3958, 3054, 3485, 2012, 812, 2344, 125, -1113, 1780, 4556, 2324, -521, +213, -776, 1890, 3506, -1022, -708, 126, -341, 1110, 622, -93, -1027, -388, 774, -1378, -2760, +-1410, 1116, -272, -3569, 1120, 1427, -3867, -2371, -1855, 974, 3128, -3164, -2009, -233, -3103, 116, +2489, -2831, -4112, 1903, -58, 52, 3255, -3963, -3150, 1373, -2092, -2381, -2439, -1151, 591, -2699, +-370, 3705, -242, -4444, -2425, 688, -1378, -965, 3337, 511, -2501, -282, 2237, 2308, -1068, 1217, +1040, -3664, 2314, 5104, 2141, 3152, -1141, -1445, 3752, 3242, 427, -1802, 151, 3223, 837, -974, +1132, 2439, -1316, -2532, 818, 1761, 1157, -1788, -1582, 865, -1074, -448, 1525, -1233, -3009, 596, +3315, 1113, -161, -1424, -1471, 1657, -1125, -1726, 2094, 431, 677, 941, -988, 2947, 194, -3533, +343, -1355, -2098, 1162, 1852, 803, -1024, -1135, -893, -365, -2086, -2491, 1565, 584, -765, 734, +726, 2116, -38, -1848, 560, -1675, -1996, 2278, 2665, -269, -943, 433, -1720, 842, 2221, -3600, +1575, 3149, -2586, 104, -735, -821, -770, -2260, 2166, -1747, -3881, 3142, 2011, -1841, -1284, -1147, +-46, 37, -1841, -1361, 3426, 2991, -1105, -642, -2225, 66, 2377, -3457, -380, 2734, -1782, 1656, +3383, -1483, -2180, 1036, 321, -3498, -887, 1895, 474, 444, -1042, -961, 921, 772, 690, -1909, +-894, 2643, 546, 940, 1190, -1252, -86, 1351, 3532, 3757, 72, -952, 1711, 985, 20, 3600, +2435, 232, 170, -692, 694, -159, -496, 2591, 1468, -1097, 331, 1282, -427, -943, -1028, -1412, +1550, 2677, -1945, -2467, -871, -3120, -2214, -1731, 121, 1762, -4026, -1642, 2420, -2235, -1579, -534, +-2926, -3143, -1398, 2041, 1060, -1211, -3080, -3418, -136, -460, -1049, -1001, -2597, -801, -1610, -248, +1097, -1848, -508, -2305, -2322, 1312, -1350, -501, 1371, -1111, -1107, 2750, 3894, -2229, -1790, 2628, +880, 2352, 2452, 911, 1721, -1148, 1142, 4620, 1711, 721, 536, 2041, 2253, 1092, 2133, 628, +837, 712, -283, 2234, 1545, 2431, 2811, 444, 2262, 32, -1807, 3645, 1545, -2932, 798, 2931, +1605, -974, -2730, -688, 90, -140, 1062, 1020, -1032, -1101, 800, -365, 710, -1124, -5231, -1628, +-331, -2136, -1829, -2041, -3526, -4013, -884, -278, -2771, -2703, -1337, -2811, -4675, -1042, 309, -1712, +-1505, -3467, -2036, 617, -1548, -140, -163, -1562, 139, -369, 1641, 3579, -1226, -2654, 1079, 902, +409, 1737, 673, 677, 51, -1458, 2562, 3924, -1144, -1197, 3899, 1646, -812, 3376, 1926, -856, +1346, 1830, 2041, 3783, 2728, 642, 1535, 276, 1780, 6113, 2247, -796, -61, 1222, 4401, 2320, +1423, 1339, -1683, 1783, 783, -2032, 2240, 436, -1717, 1001, 1786, -360, -2806, -1673, -2185, -2240, +-1333, -2404, 617, -1325, -2647, 533, -3811, -2597, 1175, -2637, -798, -1925, -5950, 371, 1333, -3319, +-2386, -3405, -1536, 2326, -1033, -3100, -992, -1088, -1564, -52, -528, -80, -115, -2015, 2027, 2758, +-1960, -136, 1693, -598, -1009, 1740, 2619, 793, 1739, 2385, 1150, 185, 12, 2213, 1097, -1242, +1119, 2379, 3044, 2886, -1011, -1477, 2219, 2290, 30, 1764, -387, -3310, 1593, 1203, -1661, -1406, +-1316, 3453, 2243, -1949, 906, -564, -2789, -99, -634, 1330, 3866, -732, -1405, 1166, 486, 1116, +464, -552, 1368, 69, -1657, 3096, 1395, -2033, 2885, -702, -2114, 3982, 572, -332, -725, -4017, +-399, 3320, 1690, -1697, -1316, -1308, -74, 2938, -2143, -3026, 204, -2433, 151, -270, -3155, 505, +-1353, -1554, 1662, -1001, -710, 872, -1163, -2670, -1614, 552, -244, 964, 1821, -272, -1076, -1579, +413, 2289, -1101, -1451, 188, -98, 1455, -370, -3026, -281, 1194, -645, -1333, -1269, -2023, 331, +1401, -847, -660, -1626, 2096, 2697, -4709, -228, 3449, -926, 1222, -74, -2504, 1427, 2299, 624, +1192, 1721, 880, 626, 285, 1955, 4007, -196, -573, 2664, -514, 1190, 3692, 218, 849, 2189, +2602, 3118, 1082, -197, 478, 1779, 1183, 546, 1381, 1881, 2660, -285, -1917, 236, -1544, -756, +1463, -2092, -365, 4396, -457, -3709, -1541, -2565, -2039, 725, -681, -2151, -1133, -2303, -3097, -2119, +-1670, -2622, -4734, -1720, 2033, -1689, -3075, -3053, -5020, -283, 323, -3867, -1139, -300, -448, 1036, +-1104, -2250, -249, 594, -1394, -1150, 336, 1663, 4958, -363, -3150, 3682, 1923, 498, 1929, -1927, +262, 3699, 2746, 3325, 470, 908, 3916, -1397, -1433, 4897, 3449, 160, 2858, 2936, -71, 2984, +2885, 246, 2314, 1713, 1153, 3032, 1392, 605, 967, 199, 144, 902, 799, 1791, 1653, -1344, +-85, 847, -1482, 911, -184, -3625, 657, 701, -865, -496, -3193, -1291, -1664, -2930, -891, -3713, +-3129, 264, -2617, -3147, 1632, -838, -7077, -2703, 1308, -2880, -4602, -3526, -294, 941, -2901, -2287, +-732, -1298, 154, -1244, -2871, -992, 142, 255, 58, 276, 886, 2076, 1554, -543, -1538, -1349, +1709, 3048, 547, 1259, 2122, 703, -385, 133, 2839, 2802, 2707, 2635, 200, 1334, 1325, 340, +2730, 1433, 2500, 4530, 1889, 1018, 839, 1036, 153, -753, 1345, 979, 218, 361, 808, 1672, +648, 51, -2119, -1837, 182, -1221, -385, 213, -163, 340, -1286, -546, 1544, -1738, -2443, -363, +-3149, -2341, 1489, 30, 122, 424, -2762, -1937, 341, -1232, -1053, -3, 245, 1322, -2111, -2350, +2968, -681, -2657, 985, -94, 1921, 1533, -4749, -4169, -89, 1709, 220, -350, 668, -360, 299, +1359, 1648, -560, -2864, -141, -144, -514, 1963, 2690, 1968, -440, -803, 1188, 584, -1683, -1389, +892, 918, -129, 526, 741, -732, -1023, 663, 754, -1477, -391, 1795, -1488, -1434, 2707, 414, +-1445, 994, 1157, 51, 107, -167, -1614, -520, 1428, 502, -1307, 754, 5031, 294, -4448, 2482, +1638, -3656, 1770, 1885, -1728, 793, 1312, -810, -2379, 436, 3890, 919, -257, 1920, -671, -2678, +1451, 628, -1884, 1876, 1832, 456, 896, -2132, -1042, 466, -2097, -374, 985, 955, 1346, -318, +660, 1914, -842, -1997, -1181, -2101, -1563, 2186, 492, -2076, 853, -141, -1279, 958, -949, -2086, +-89, -370, -1570, 37, 951, -1332, -2339, -1511, 333, 685, -1721, -182, 1161, -2451, 144, 2240, +-3393, -4342, -725, 1386, 1471, -741, -1112, -1445, -3053, -1825, 4, 427, 828, -79, -1761, 865, +3974, -836, -2455, 1398, -186, -583, 1281, 1830, 3200, 983, 1057, 3459, 1738, 1770, 1651, 88, +1315, 2739, 2857, 2923, 1299, -1269, 837, 1847, 65, 2507, 2343, -562, -176, 47, 1910, 1839, +454, 1941, 63, -1355, 1416, -223, -2200, 202, -610, -2113, 890, 709, -2966, -1218, 1691, -1458, +-3222, -875, -471, -817, -1835, -2895, -1896, -2977, -1945, 566, -1681, -1290, 1399, -2147, -4759, -931, +-1284, -4235, -548, 515, -617, -781, -2159, -558, -2257, -4036, 914, 1215, -781, 738, -491, -1064, +1992, 576, -1436, 1036, 1092, 759, 833, 675, 2992, 340, -2491, 3268, 3294, -1012, 2102, 1671, +373, 3131, 766, 368, 1895, 86, 970, 2006, 784, 1438, 3190, 809, -679, 3082, 3733, 2075, +-583, -2313, 2861, 3350, 181, 2344, 2375, -202, -610, 250, -332, -704, 359, -1225, -1577, 502, +-745, -1923, -886, -673, -2634, -2724, 0, -606, -3571, -2886, 94, -756, -2679, -983, -1544, -3845, +-2362, -784, 1296, 1038, -4190, -4459, -3063, -2719, 868, -314, -1674, 6, -1309, -50, -478, -2179, +147, -1333, -1381, 2010, 1132, 853, 2532, 86, -1740, 867, 1954, 2176, 1312, -327, 2307, 1825, +-49, 3522, 3283, 142, 2533, 4697, 2470, 1169, 970, 405, 573, 38, 1724, 4919, 2003, -902, +-1262, -1588, 2451, 2739, -1533, 1215, 3090, -2156, -3060, 1082, 759, -745, 1719, 1861, -1847, -1982, +63, -1110, -1324, 660, -241, -676, 1697, 1029, -2045, -1501, 315, -1663, -3013, -1323, -1498, -3504, +-1455, 1679, -1284, -3332, -682, -700, -1312, 58, -1169, -3065, -15, 2551, -754, -2128, 1526, 1852, +297, 1101, -1540, -1899, 1679, 877, 670, 60, -1039, 1898, 362, -2278, 1278, 1597, -46, 570, +-1614, -1510, 2150, -502, -1834, 2811, 2334, -558, -20, 1212, 1349, -1730, -380, 2737, -1850, -1976, +2495, 1779, 1240, 1023, 187, 1033, 228, -2434, -1337, 1334, 1551, 860, -1061, -1403, 800, -840, +-1461, 786, -1353, -784, 2221, -836, -2169, -1445, -1296, 1125, 1358, -465, -160, -368, -2042, -601, +2152, -419, -2745, 912, 4379, 2966, 534, 1002, 1234, -567, 49, 2784, 1148, 1, 4077, 1922, +-3187, -92, 2428, 1784, 3305, 502, -2613, 154, 893, 97, -1251, -2982, 937, 2866, -1139, -1341, +72, -1046, -1802, -2136, -821, 2391, 609, -3310, -2219, 448, 775, -2032, -3356, -300, -300, -2843, +-2106, -1756, -1925, 203, -765, -2011, 355, 455, -126, 526, -2284, -3110, -86, 151, 324, -1005, +-2021, 1654, 175, -2170, 1468, 496, -2831, 318, 2031, -652, -63, 1142, 876, 961, -382, 2050, +3596, 85, 759, 2734, 988, 510, 1285, 787, 2964, 4227, 793, 1088, 3994, 1334, -314, 690, +-195, 1756, 4388, 1947, -690, 554, 2513, 3227, 2087, -1048, -1091, 1584, 2982, 464, -3591, -1198, +1728, -984, -974, 1051, 415, 80, -1352, -3630, -2404, -2467, -2930, -1450, -2194, -800, 318, -3467, +-4373, -2995, -3417, -2806, -2527, -2806, 721, 781, -4896, -5475, -1887, 745, 1540, -1144, -2591, -912, +-984, -2545, -1389, -1366, -360, 3283, 1088, 262, 3146, -567, -1817, 1899, 777, 308, 2298, 1797, +924, 932, 1883, 3833, 3590, 975, 1236, 1641, 611, 2417, 2708, 1936, 4237, 2758, -298, 2303, +4521, 2067, 4, 124, 527, 1452, 2385, 1988, -353, 88, 3330, 1880, -681, 1287, 1481, -582, +-185, -2609, -3303, 2256, 1536, -1896, -810, -343, 232, -886, -3291, -2492, -2145, -2153, 374, -1972, +-3998, 930, -89, -3502, -263, -19, -1595, -1855, -4195, -2844, 306, -611, -1676, -2026, -1579, 1658, +-598, -6263, -2457, 1790, -1243, -2338, -664, -784, -702, 700, 1464, 1823, 1662, -31, 664, 1433, +-117, 1660, 2111, 1505, 3679, 2240, 897, 2215, 1143, 638, 2439, 2629, 1767, 1936, 1963, 2432, +919, -909, 1312, 2613, 1632, 1331, 750, 952, 51, -1729, 275, 300, -1190, 3546, 3771, -2141, +-1744, 52, -2039, -2821, -1453, -461, 1168, 1019, -1113, -574, -2020, -1933, 775, -2250, -1213, 2367, +-701, -611, 440, -2275, -738, 1224, -1327, -2755, -761, 1286, 443, -679, -1560, -1287, -12, 912, +58, -2354, -353, 1463, -1689, -2098, 353, 1213, -728, -2387, -803, 1123, 1627, -491, -2041, 765, +1913, 442, 306, 609, 621, -578, -33, 2843, 2519, 1452, 1256, -655, -1088, 1529, 3499, 1325, +-561, 729, 2344, 2357, -692, -591, 1244, -1352, -1645, -1235, -154, 2846, 477, -1412, 582, -2693, +-3700, 377, -1147, -2815, 1157, 2168, -157, -2159, -3073, 805, 1680, -651, 1840, 1130, -534, 1496, +-780, -2314, 954, 1578, -658, -702, -51, -225, 1243, 368, -1819, -986, -543, 147, 1321, -251, +-126, 1308, -290, -496, 168, -625, 1510, 2156, 929, 266, -108, 1746, 1612, -891, 1001, 4397, +2622, -1315, -1449, 570, -254, -2533, 102, 3566, 264, -2898, -1923, -3230, -2900, 1647, 526, -3477, +-1545, 139, -198, -1036, -3007, -1387, 292, -2779, -3021, -304, -477, -123, -351, -2590, -72, 2010, +-2266, -3213, 120, 1379, 1566, 975, 557, -667, -1777, 107, 911, -98, 573, 2166, 185, -2060, +333, 873, -508, -120, -1470, -888, 1845, 2711, 1812, -557, -793, -453, -767, 2280, 2463, -117, +2464, 2547, 44, 1212, 1886, 781, 533, 1396, 1240, 1529, 2754, 2448, 2495, 749, -216, 1786, +105, -1647, -290, 635, 974, 1038, 776, -227, -1685, -3033, -1566, 1208, 411, 1067, -266, -4290, +-1033, 262, -3643, -2225, 603, 1287, -894, -3980, -2954, -1359, -2201, -3641, -2569, -1232, -924, 579, +-1275, -3774, -1600, -1187, -2252, -1033, -578, -328, -188, -1390, -792, 154, -267, 703, 2110, 712, +34, 1436, -946, -2248, 1295, 2640, 2063, 1032, 1569, 1157, -983, 708, 1845, 609, 1157, 1593, +1293, 1563, 1978, 1580, 1325, 876, 708, 2634, 1610, -135, 1718, 189, 21, 2431, 489, 1797, +1971, -1960, 1033, 2976, 1674, 2397, -63, -1772, 1055, 1913, 58, 519, 1433, -552, -1095, 445, +-385, -2201, -2870, -2348, -812, -1828, -2542, -338, -432, -2806, -3740, -2563, -1088, -1471, -2461, -2803, +-2732, -829, 415, -630, -1459, -2222, -1705, -67, -869, -1043, 841, -459, -2563, -1061, 1161, 865, +209, -1142, -1560, 708, 1415, 923, 970, 1282, 255, -1751, -1092, 652, 2746, 2748, 166, 1408, +2287, 459, 974, -315, -732, 1743, 1525, 2954, 3773, 178, -1553, -330, 202, 552, 1362, 1642, +1519, -715, -1524, 2031, 1280, -676, 190, -695, 496, 1526, -1473, -1754, 909, -871, -3970, -790, +1892, -80, -1540, -1031, -1015, -639, 377, 393, -441, -1252, -913, 374, 698, 281, -193, -770, +-846, 753, 154, -530, 179, -780, -698, 554, 1213, 1201, -1061, -1158, 61, 180, 1398, 729, +-1160, -1700, -397, 2888, 1597, -894, 634, 1772, 1669, 510, -180, 810, 990, -272, -1257, 2495, +4350, -428, -2710, -1560, 40, 168, -291, 699, -305, -2093, -1775, 754, 963, -2275, -1583, 967, +551, -2, -343, 468, 490, -2899, -2656, 1345, 1341, -1575, -2726, -1009, -275, -1290, -1608, -1212, +-1151, -2322, -2660, 70, 1908, -56, -460, 224, -1135, -1009, -248, -520, 353, 651, 1481, 2678, +1551, -232, 534, 1706, 893, 1416, 3242, 3743, 1758, -489, 68, 1856, 2416, 1479, 1463, 2063, +990, 162, 483, 79, 613, 1629, 1273, 1368, 818, 148, 521, 970, -390, -2373, -1065, 1159, +1636, 132, -2150, -599, 954, -910, -928, 1307, 799, -2289, -1911, -42, -823, -1474, -1421, -1110, +-1518, -2216, -1579, -2334, -2553, -1160, -3087, -2253, 501, -3343, -4200, -849, -1287, -1536, 468, 446, +-2084, -2018, -1022, -561, 1002, -92, 88, 1355, 253, 998, 867, 478, 1119, 4, 965, 2382, +2744, 1846, 719, 1997, 753, 1162, 4286, 1471, -1399, -63, 3359, 3900, -275, 6, 1840, 1498, +2801, 3009, 1840, 924, 1519, 1871, 1525, 3240, 2883, -867, -1815, 648, 2426, 1552, 1401, 2466, +-585, -2789, -404, 56, -493, -534, -537, -376, -1253, -1442, -1830, -3370, -4109, -3019, -1473, -1872, +-2212, -3548, -4860, -2287, -949, -1873, -2340, -2212, -772, -1700, -4327, -2815, -393, -2168, -2741, 299, +-646, -1656, 1868, 1039, -1202, -672, 292, 2123, 2019, 1792, 1797, 1476, 1421, 290, 808, 3001, +3260, 1603, 1414, 1632, -840, 281, 2830, 1627, 1765, 3795, 3422, 660, 42, 1954, 2818, 1460, +557, 1097, 1294, 2255, 1806, -1195, 730, 4697, 1128, -3326, -1564, -1014, -580, 2152, 1674, 1062, +52, -2341, -590, -206, -694, 1575, -977, -3053, -112, -3, -1322, -2020, -2883, -949, 367, -2333, +-2468, -68, -529, -1887, -2430, -2180, -1812, -2225, -810, 1036, 158, -1042, 598, -911, -5395, -2976, +2102, 2223, -1146, -1758, 872, 865, 1485, 1421, -1137, -731, 1079, 914, -1747, 86, 4771, 1321, +-913, 2745, 2270, -566, 517, 2120, 977, 1715, 4680, 2544, -1048, 20, 2255, 2119, 1517, 2141, +1603, 20, -341, -746, -534, 280, 1481, 1554, -1458, -1212, 2635, 1463, -1818, -1204, -298, -666, +402, 410, -1172, -689, 591, 842, -791, -2656, 831, 1889, -3660, -2755, 144, 33, 753, -983, +470, 2506, -1368, -3246, -1694, -89, -3, -825, -660, 694, 776, -767, -182, 374, -1300, -796, +706, 1528, -1102, -2434, 1811, 844, -1786, 1528, 1780, 914, 600, -1117, 325, 1914, 2176, 69, +-970, 2305, 1740, -65, -169, -30, 1029, 963, 734, 223, -1181, -777, 635, 60, -2558, 409, +3476, -987, -1861, -585, -1847, 1091, -1101, -4251, 120, 603, -564, 417, -1112, -1169, -1124, -1864, +-966, -638, -1385, -828, -16, -515, -383, 5, 340, -233, -3449, -2057, 2008, 179, -1630, -644, +2041, 3808, -1557, -4255, -763, 750, 1040, 1370, 2104, 2069, 371, -746, -676, 631, 1849, 2852, +1868, 501, 1674, 807, 890, 1162, -1812, -262, 3167, 3053, 2314, 725, 589, 967, -781, 410, +2554, 1377, 390, -1067, -411, 2147, 616, -1486, -922, -574, -269, -538, -1378, -685, -317, -689, +-671, -2591, -2258, 846, -646, -2461, -2169, -3500, -589, 1074, -2941, -1389, 98, -2915, -2334, -1620, +-120, 344, -2101, -1125, 278, -1397, -1608, -392, -680, 26, -362, -2114, 70, -211, -2067, -710, +-162, 588, -465, -1518, 1837, 566, -2948, 1230, 3924, 1973, 1055, -613, 440, 2197, 603, 1725, +2826, 984, 796, 2054, 2265, 1334, 1101, 1516, 1861, 2656, 1992, 1672, 2920, 1997, 222, 1002, +2078, -487, -886, 2361, 1438, 620, 701, -418, 60, -816, -2205, -1703, 653, 1882, -214, -1784, +-1642, -465, -1322, -2122, -1157, -4126, -3453, 1954, 954, -2927, -2082, -790, -3353, -3562, -1337, -1225, +-1784, -1104, -2184, -2724, -622, -2162, -3811, -482, 954, 1057, -502, -2578, -470, 437, -505, 454, +940, 1143, 1079, -2, 814, 2673, 1045, 735, 2277, -585, -242, 3559, 2954, 1436, 468, 867, +1459, -42, 2131, 3177, -61, -48, 1193, -620, 147, 3733, 2696, 334, 138, -104, 414, 129, +-629, -185, 98, 781, 587, -838, 431, 2162, -279, -3746, -2486, 3488, 2820, -3230, -2619, -1644, +-1232, 2136, 600, -3094, -2737, -1028, -5, 353, -868, -2703, -1623, -756, -2918, -2816, 1029, 2314, +-1739, -4171, -1372, -434, -1327, -335, -744, -108, 1213, 1341, 269, -1012, 1370, 1271, -1146, 1166, +2678, 849, -1343, -2201, -608, 2572, 4448, 1079, -1064, 86, 997, 2100, -440, -2005, 1225, 1827, +728, 303, 871, 1030, -1984, -814, 1997, 726, 1234, 1213, -1039, -923, -181, 408, 1431, 731, +-502, 1690, 1985, -867, -400, -1039, -1839, 1174, 220, -1674, 993, 904, -2119, -2619, -248, 995, +-1782, -3270, -2577, -335, 975, -974, -1148, -1784, -1828, 1041, 1205, -750, -3168, -2525, 218, -286, +-840, 1045, 3344, 1731, -491, 374, -446, 446, 3358, 1955, 1041, 377, 461, 1471, -1233, 679, +3811, 361, 1554, 3179, -1093, -1165, 655, -871, -159, 2519, 3248, 1382, -2719, -1501, 2332, -469, +-1177, 1997, 737, -1465, -2417, -1497, 1762, 2146, 349, -1113, -2153, -65, 388, -747, 835, -1579, +-4795, -1779, 1718, 601, -793, -14, -1271, -1844, -1547, -2040, -43, -857, -3164, -949, 1225, 1324, +-217, -1078, 110, -253, -902, 952, 1985, -286, -1453, 1304, 2288, 988, 825, 112, -216, 1442, +3269, 2550, 1187, -515, -1753, 997, 1991, 1278, 2026, 1892, 2058, 718, -978, 1125, 1312, -1788, +-254, 3401, 2801, 1898, -198, -1350, 621, -79, -459, 461, 546, -31, -2127, -1058, 1222, -1078, +-2061, 2213, 1706, -2617, -993, -195, -2215, -2617, -4012, -951, 3109, -512, -3255, -794, 235, -2006, +-3672, -1028, 1610, -503, -1515, -89, -1271, -1157, -557, -2020, -901, 591, 1234, 738, -1449, -1862, +-1607, 13, 805, -1587, -95, 3369, 2331, -1652, -1266, 1738, 679, -1672, -704, 2303, 2200, 2131, +3636, 1234, 539, 906, 400, 1060, 708, 2326, 3439, 292, -921, 803, 2560, 3523, 2000, -2352, +-1160, 5158, 3608, -1846, -702, 690, 11, -428, 425, 1921, 17, -983, -253, -1186, 929, 1612, +-2054, -2906, -1315, -720, 1029, 768, -2200, -2650, -2555, -2095, 555, -1841, -4261, -191, -431, -2955, +-810, 753, 1830, 8, -3337, -1372, -517, -1554, -1248, -1430, -912, 1108, 2655, -825, -2956, 703, +1278, 331, -372, -701, 1285, 1162, -87, -1187, 465, 4401, 2031, -1137, -508, 1508, 3647, 994, +39, 1835, 1241, 2286, 1327, 239, 1517, 1886, 2985, 2055, -557, 189, 856, -947, -1036, 2150, +3884, 2801, -728, -2370, -46, 480, -517, -1123, -3019, -1887, 960, 191, -729, 185, -282, -909, +-2158, -2654, -927, -391, -1562, -1557, -732, -171, -186, -1480, -2663, -86, 1271, 170, 233, -766, +-1619, -694, -772, -250, 524, 1760, 2146, -708, -1540, 0, 443, -30, -1188, -1276, -620, 1309, +3237, 1858, -414, -361, 784, -1139, -1738, 1491, 2123, 1368, 356, -1281, 609, 4047, 2684, -981, +281, 2664, 521, -1536, -92, 1573, 1039, 932, 3317, 3748, 1597, 1262, 335, -2853, -2029, 1846, +3056, 570, -1797, 147, 587, -2210, -1355, -5, -702, -840, -462, -741, -2624, -2797, -3231, -3383, +-148, 362, 668, 603, -2097, -3324, -4554, -3038, 325, 743, 1580, 2001, 39, -1815, -1067, -58, +-482, -1683, -1095, 1966, 1204, -2365, -409, 2784, 2023, 138, 1055, 2234, 1064, -422, -68, 828, +-690, -1104, 909, 1735, 2668, 2370, 897, 1431, 855, -1673, -1428, 2032, 2736, 1360, 2047, 2094, +1783, 81, -1306, 142, 235, 802, 1358, 532, 237, -1529, -1495, 199, 379, 427, 501, -530, +-2586, -2371, -1139, -867, -1847, -2991, -1014, 374, -750, -1135, -170, 425, -2535, -5359, -3769, -943, +-685, 154, 1801, -111, -1163, -537, -1790, -1564, 233, 876, 662, 775, -395, -1810, 111, 1293, +-1014, -1162, 2321, 3205, -405, -2604, 209, 3256, 867, -1028, 2097, 2829, 808, 396, 663, 2509, +2011, -524, -967, -1039, 1143, 3691, 2903, 1954, 1902, 790, -6, 1363, 1148, -465, 491, 1014, +368, 136, 863, 1847, -52, -1157, 456, 710, 304, -821, -2338, -1656, -738, -1042, -305, -680, +-2700, -1974, -465, -2023, -2421, -1867, -2728, -2883, -3164, -2321, 1260, 1116, -2605, -2490, -691, -1095, +-2900, -3047, 961, 2595, 163, -1357, -1385, -285, 396, 6, 197, 939, 855, -624, 114, 660, +-1040, 508, 2879, 2660, 741, 594, 3436, 2307, -1206, -407, 1982, 1873, 1110, 322, 83, 2763, +3798, 431, -195, 1536, 940, -314, -207, 1533, 3012, 1927, 500, -116, -1080, -288, 1488, 1014, +864, 772, -1058, -508, 209, -593, 1088, 1161, -1122, -340, -42, -1088, -878, -2680, -2688, -940, +-2437, -1194, 1253, -226, -2213, -2638, -1721, -1440, -1843, -1617, -431, -717, -4525, -3267, 1134, 344, +-745, -1672, -1670, 603, -469, -2358, -777, 25, -2461, -1104, 3340, 2175, -648, -1806, -1117, 1213, +133, 703, 2432, 306, 349, 1381, 1269, 1217, -87, -555, 1606, 3544, 1901, 753, 1662, 456, +-1211, -784, 2518, 4103, 1836, 521, 660, 168, -196, -309, -443, 617, 1057, 1210, 2886, 647, +-884, 1500, -793, -2259, 1623, 1523, -903, 275, 417, -996, -579, -949, -911, 89, -116, -1223, +-2505, -673, 800, -1994, -3261, -2123, -1951, -1665, -130, 98, -613, -569, -2898, -3755, -1415, -387, +876, 784, 828, 629, -1886, -2184, -1434, 355, 1240, 539, 1597, 943, 198, 564, 450, 808, +-538, 272, 2730, 1999, 448, -555, -1235, 744, 1725, -2008, -351, 4431, 1183, -1064, 958, 483, +-188, 660, 1392, 703, 406, 1178, 1148, 235, 216, 895, -509, -326, 1806, 1260, 1199, 756, +-2586, -2622, -558, 180, 1029, -177, -2398, -1740, -1461, -1133, 582, -601, -1298, 429, -1555, -2654, +672, 1421, -1121, -1733, -1198, 466, 1580, -936, -1740, 245, 1062, 703, -37, 686, 362, -405, +12, -484, 1433, 2577, 796, -136, -581, 684, 1321, 21, -105, 707, 2372, 1412, -821, -185, +-112, -1133, -285, 364, 112, 565, 1050, 405, -402, -2084, -849, 2266, -335, -2538, 21, 461, +346, 570, -813, -1225, 116, -340, -803, 598, 1753, 2157, -817, -2982, 812, 1334, -254, 1573, +647, -337, 958, -555, -1247, 202, 200, -431, -1665, -842, 2008, 542, -1818, -639, -605, -1884, +301, 1370, -1216, -1442, -776, 177, 1679, -910, -794, 2495, 248, -1893, -1137, -422, 745, 400, +408, 1316, 1273, 946, -103, -663, 337, 2609, 1612, -1600, 1157, 4171, 1709, -359, -1175, -1248, +725, 2180, 1433, 1527, 2156, 682, -2544, -3609, -39, 2551, 908, 600, 6, -1693, -1049, -409, +-1635, -2118, -2384, 42, 2794, 291, -1619, 14, -930, -2370, -2551, -1406, 1157, 392, -3019, -2753, +145, 941, -1328, -1344, -207, -642, -452, 35, 960, 1098, -344, -810, -552, 886, 1951, 1584, +841, 8, 386, 1830, 1178, -807, -24, 1969, 2700, 2175, 257, 616, 896, -872, -338, 874, +2023, 2214, -40, -961, 561, 1234, 154, 1684, 1870, -2088, 631, 3626, -1603, -2281, 1328, 732, +-592, -1014, -103, 2576, 2271, -888, -1831, -2257, -323, 1808, -1361, -1611, 2278, 1030, -2316, -2088, +-1291, -1976, -1506, 8, 1113, -817, -2153, -167, -1933, -3876, -781, 349, 269, -517, -1399, -872, +-555, -393, -418, -418, 974, 850, -2210, -1656, 2629, 1321, -745, 547, 564, -1123, -1533, 578, +1486, 965, 2641, 2340, -124, -393, 435, 900, 1565, 379, -269, 2842, 2711, -539, 613, 3007, +1926, -1175, 636, 4485, 3100, 2681, 1662, -526, 811, 172, -130, 1828, 1273, 505, 487, 72, +-757, -2367, -1262, 1135, -2443, -4649, 17, 1476, -1285, -3971, -4970, -2020, 1027, -611, -3096, -1616, +-2049, -2977, -692, -370, 399, 681, -1318, -1061, -1223, -275, 1268, -452, 204, 1405, 151, 1085, +1380, 570, 1076, 570, 32, 900, 271, 190, 1135, -835, -1294, 2225, 1825, 162, -232, -1547, +638, 2772, -52, -1276, 369, 1178, 264, -1022, 264, 932, 310, 2141, 1316, -1076, -260, 1206, +1337, -1093, -346, 3618, 1771, -1596, 475, 1890, -888, -2321, -817, 350, 1027, 414, -1630, -778, +1406, -129, -1560, -142, -221, -2784, -1527, 835, -2396, -3111, 1076, 1545, -1609, -3700, -1114, 1330, +-2030, -3360, -1130, -1354, 365, 849, -2443, -1478, -1011, -2384, -179, 738, 268, 315, -294, -701, +2, 163, 374, 1905, 1486, 1840, 3514, 1273, -328, 803, 1571, 1967, -214, -347, 4758, 4692, +1379, 2100, 381, -1626, 757, 783, -177, 1926, 2414, 1532, 1088, 437, 445, -837, -1408, -460, +-1074, -351, 2180, 2237, -2301, -3968, 703, 2177, 296, -413, -470, -132, -1069, -2033, -350, 432, +-1663, -2660, -2239, -297, 1955, 89, -2166, -2158, -3598, -2398, 318, -1630, -1959, 244, 243, -385, +-3104, -2840, 474, -1895, -2352, -736, -3011, -838, 1674, -845, 197, 2351, -148, -501, 1207, -139, +35, 1538, 1113, 1415, 793, 1452, 3596, 306, 300, 4791, 2335, -499, 260, 1085, 2271, 1595, +570, 2499, 3393, 1104, 459, 765, 1206, 2326, 1083, -59, 40, 1239, 2538, 1110, 933, 712, +-931, -652, 5, -85, -1000, -624, -244, -2579, -2188, -534, -967, 323, -512, -2316, -62, -1807, +-6124, -3743, -1290, -1864, 1064, 1334, -2870, -1415, 867, -1617, -2257, -1441, -534, 1225, -232, -1415, +350, -24, -49, -154, -970, 1862, 1867, -863, -629, 11, 434, 1454, 315, -700, 960, 463, +1337, 3944, 457, -1334, -731, -1483, 741, 781, 628, 3003, 1110, -694, 2317, 3137, 232, -425, +-263, -37, 1532, 1987, 2024, 1865, 1107, 327, 78, 975, 2020, 2237, -351, -1969, 1084, 931, +-1093, -456, -452, 1469, 1045, -1442, -502, -1256, -2930, -1368, -592, -391, 660, -508, -2445, -2260, +-2088, -656, 380, -2018, -1352, -561, -4204, -3646, -1445, -2589, -756, 1272, -957, -1401, -1847, -2537, +-176, -1700, -2808, -21, -627, 1234, 4125, -566, -1746, 1871, -317, -1930, 1957, 4023, 2244, -465, +78, 2633, 507, -271, 3677, 2964, 1997, 2486, 57, 350, 435, -1816, 1210, 3717, 1514, 1087, +1392, 591, 291, -776, 167, 563, -1419, -404, 1070, 30, -3, 628, 313, 228, 1334, -782, +-2442, -6, 89, -725, 578, -295, -1688, -331, -202, -1855, -521, 825, 885, -573, -4288, -2055, +2538, -240, -2569, -1150, -3, -368, -2130, -964, 255, -2955, -3713, -1560, -1357, -8, 949, -1005, +-708, 147, -624, -347, -1436, -2333, -279, 349, 920, 1932, 46, -1234, 685, 785, 799, 2652, +1565, 841, -31, -2040, 2060, 5009, 1399, 1066, 1803, -142, 1464, 2798, 636, 377, 1554, 818, +-727, 1296, 3592, 918, -79, 1969, 172, -617, 1265, 371, -1774, -596, 1122, -344, -1148, -344, +-1413, -1308, -1129, -1195, 390, 195, -2489, -3551, -2092, -573, 1070, 2495, 794, -1478, -1949, 545, +2162, -2394, -3289, 1544, 436, -1492, 102, 13, 1217, 1265, -2459, -2162, 565, 2314, 1856, -149, +551, 297, -1353, -286, 1175, 844, 517, 778, -599, -456, 177, -1520, -846, -154, 783, 2180, +-884, -593, 1318, -673, 350, 1562, -1735, -2697, 153, 134, -1020, 482, 1424, 1777, 902, -1181, +-627, 51, -196, -872, -1478, 1248, 3151, 12, -1894, 777, 759, -1151, 468, 1337, -460, -1275, +617, 936, 365, 2583, 1697, -2023, -2018, -465, 1256, 1938, -347, -2651, -1981, -1279, -620, 507, +-746, -1624, -15, 1091, 353, -831, -735, -1656, -1517, -1095, -1955, 1213, 4034, 1873, -111, -216, +1665, 1445, -1514, -1835, 1412, 4301, 3454, 2397, 1856, -802, -646, 937, 1419, 2487, 1367, -909, +-2445, -1462, 1864, 1232, -608, -390, -894, -638, -188, -1359, -1579, -905, -1579, -1863, -1087, 126, +1486, 812, -1872, -1967, -598, -1874, -1089, 442, -1039, -338, -380, -1049, 676, 129, 277, 1451, +-397, -759, 814, 483, -2185, -2712, -130, 1954, 1925, 98, -688, -14, 47, -211, -2430, -1453, +1945, 389, -353, 1706, 2577, 1889, 542, 505, -469, -1890, -793, 1859, 1692, -232, 2075, 2444, +-290, 753, 936, -578, 1761, 3065, -400, -1104, 759, 420, 160, 526, 1312, 1718, -487, -1226, +1066, 1836, 908, -753, -2334, -574, 2547, 2604, 362, -351, 937, 77, -2467, -1972, -318, -625, +-2381, -3256, -1437, 923, 1688, 316, -1644, -1867, -2554, -3017, -1158, -387, -667, -676, 1192, 1691, +-1150, -1214, -1716, -3857, -323, 2513, 1296, 1036, -598, -2547, -428, 2385, 1697, 78, 1101, 1273, +-445, -1458, -928, 1222, 1651, 299, 454, 668, 1809, 1331, -635, 563, 353, 3, 2334, 1290, +-1066, -478, 1570, 931, 1097, 4222, 2333, -323, 554, -226, 72, 405, 380, 1551, 1101, 1830, +2354, 187, -926, -1349, -2158, -1850, 1328, 1770, 176, 1340, -796, -3262, -3013, -1710, 2504, 1278, +-4333, -3008, 170, -419, -2491, -2287, 565, 89, -1450, 148, 557, -803, -1003, -424, -735, -1001, +244, 456, -140, -761, 116, 1637, -905, -2002, 883, 410, -1080, 98, -89, -1775, -303, 1011, +-1085, -196, 1532, 710, -626, -2110, 1144, 2200, -902, 1273, 1428, 1195, 3763, 1647, -996, -1958, +-804, 795, 555, 1066, 365, 228, 258, -866, 8, 694, 545, -946, -1303, 1532, 1500, 409, +262, -2533, -2732, 496, -126, -151, 3603, 2032, -2802, -1803, 837, -340, -2004, -546, 2460, 456, +-1779, 3172, 3358, -2937, -2530, 141, 588, 1737, 233, -528, 1277, -613, -1693, 1135, 1062, -940, +-717, -1018, -856, 2011, 1438, -1511, -1207, -68, 699, 142, -416, 791, -411, -1296, 245, -379, +-793, 1674, 1115, -2358, -1596, 1746, 2815, 1917, 517, -503, -828, 5, 77, -1105, -1113, 434, +1551, 423, -570, -325, -1235, -1124, -726, -1093, 220, 1006, -753, -2362, -2182, 23, 413, -1012, +-1357, -1005, -739, -1061, -1984, -940, 1105, 222, -2021, -483, 2706, 1744, -1763, -560, 1148, -1487, +-1890, 1162, 2635, -186, -816, 3324, 1853, -521, 1326, 860, 858, 1826, 1187, 1898, 1481, 1398, +3441, 2354, 1201, 2838, 865, -30, 2973, 2224, 515, 1362, 81, -474, 418, 237, 2489, 2681, +584, 914, -1716, -3386, 1009, 2166, -1458, -2789, -181, 1382, -3, -2414, -3640, -2572, -2260, -2150, +180, -837, -2939, -1654, -1506, -680, 81, -722, -136, -2433, -4274, -1752, -675, -436, 111, -1742, +-3001, -1554, -92, -754, -276, 289, -1206, -2156, -2127, 78, 1091, -2501, -2259, 744, 631, 921, +289, -1133, 465, 718, -993, 361, 2224, 1762, 1629, 2141, 2411, 2753, 1995, 169, 248, 2213, +1908, 1227, 2299, 2050, 1280, 1864, 2082, 1181, 1545, 2473, 1345, -305, 710, 1175, 624, 1713, +556, -160, 1157, 291, 573, 1110, -142, -970, -2188, -1415, -961, -996, 1691, 2414, 90, -2214, +-1881, 46, -792, -1751, -701, 750, 355, -2021, -2837, -2718, -2192, 147, 492, -673, -813, -814, +-2436, -3340, -1729, -1492, -2088, -899, -2, 57, -1328, -2055, -2322, -4752, -3715, -283, -878, 468, +2513, 719, 533, -664, -2595, -618, 1753, 1339, 291, 2662, 2748, -80, -46, -1114, 1094, 5625, +3769, 1847, 1190, 1014, 2547, 1813, 1052, 1848, 1790, 1181, 923, 1542, 2866, 3252, 1386, -1592, +-1779, 946, 2252, 63, -1144, -432, -158, 919, 1607, 271, -1828, -2760, -1328, -378, -1098, -710, +592, -753, -2727, -784, 1105, -975, -2682, -2498, -1298, 865, 280, -1490, -1350, -2310, -1483, 337, +-353, 386, 596, -1018, -2141, -3635, -2266, 828, 807, -814, -318, 1165, -22, -220, 1505, 1612, +567, -707, 20, 809, 98, 1165, 998, -886, 72, 896, 398, 538, 220, -12, 730, 417, +-812, -695, -85, 1346, 2023, -1492, -807, 3338, -520, -4742, -1949, 1324, 1290, 582, 1667, 1316, +-239, 1048, 710, -2102, -1066, 1446, 746, -237, 1716, 2289, -547, -1309, -663, -952, 181, 2386, +2920, -158, -2173, -487, -949, -2690, -1064, 1674, 2721, 1515, -647, -1455, -1892, -2434, -1309, 923, +52, -1095, 867, -866, -3302, 495, 2008, -152, -865, -766, 170, 908, 294, 515, 1846, 1560, +794, 1540, 1201, -516, -794, 4, 638, 1949, 2464, 427, -676, 1370, 1954, 244, 712, 388, +-1212, 392, 1890, 398, -282, -629, -2721, -3535, -1841, 930, 2916, 902, -2568, -3517, -4222, -2287, +744, -1624, -3321, -1297, -1003, -455, -1032, -3203, -1498, -849, -3031, -1299, 1600, 591, -902, -585, +380, 1382, 113, 6, 923, -525, 741, 2884, 1618, 107, 592, 2656, 1859, -526, 1508, 3912, +1025, -2046, -76, 552, -562, 2072, 2449, -135, 197, 778, 1092, 703, -443, 1533, 1748, -896, +-435, 579, 30, 1033, 2590, 1212, 435, 1786, 213, 21, 2619, 2365, 1106, -1294, -1247, 3102, +1537, -1117, 764, 982, 561, -657, -3566, -3833, -970, 1712, 982, -1440, -1388, 607, -1628, -4357, +-1994, -3341, -4457, -547, -992, -3129, -2607, -1657, -955, -3232, -4796, -1117, 954, -1939, -2256, -68, +-725, -1105, -591, -1069, -214, 777, 744, 2219, 1638, -1087, -490, -638, -1527, 1479, 3802, 2308, +765, 1042, 2913, 4379, 2111, -1834, -1636, 1748, 3482, 3141, 3102, 3394, 2323, 2167, 2696, 1101, +974, 1758, 633, 872, 2943, 3277, 2619, 2356, 220, -713, 2002, 1435, 218, 367, -2008, -1597, +220, -530, 1437, 2585, -1946, -3792, -288, 1938, 1204, -2334, -5906, -5323, -2728, -552, -233, -2636, +-1344, 1210, -1981, -3674, -1591, -2304, -1822, -300, -736, -746, -244, 1416, 1215, -2674, -1753, 1960, +-22, -1911, -1766, -2491, -1268, 259, 315, 2026, 2880, -71, -863, -306, -2325, -1156, 1023, 294, +459, 1443, 1823, 2094, 1830, 60, -353, 701, -323, -832, 592, 2286, 1885, -1561, -350, 3215, +2178, 1780, 2518, 638, -242, -208, -894, -990, -136, 1857, 2184, 1391, 1416, 327, -1321, -731, +318, -249, 287, 552, -1647, -590, 2059, 967, -188, -307, -1068, -617, -1074, -2448, -1683, -1415, +-172, 2373, 418, -645, 3264, 2702, -2067, -1768, -99, -469, -383, -93, -198, 624, 2302, 2011, +-1095, -1850, -112, 235, 865, 1238, -237, -914, -1083, -1104, 264, 1325, 653, -1691, -1812, 587, +65, -1524, -731, -1912, -4066, -167, 3817, 2240, 310, 400, -602, -2987, -1194, 860, -1514, -605, +1257, -298, 1663, 2583, -1497, -1596, -787, -1761, 215, 353, -170, 202, -2001, -1222, 1020, 1126, +1493, 248, -1930, -2220, -1233, 301, 107, -3082, -2384, 1234, -353, -1076, 1178, 175, -1488, -1980, +-1397, 335, 453, 1091, 2211, 532, -822, 1101, 3059, 2469, 1523, 862, 1859, 3216, 399, -300, +2843, 2858, 2874, 4304, 3091, 1105, 1007, 977, 124, 596, 2839, 1803, -1349, -780, 1041, 1774, +1178, 251, 1014, -698, -2565, -1730, -1701, -1907, -1176, -400, -1204, -1965, -1285, -1263, -3379, -4182, +-1049, -390, -2086, -1346, -1843, -2107, -1074, -1359, -903, -793, -1847, -2005, -2097, -758, 1424, -1424, +-4061, -1605, -1350, -1014, 3295, 2280, -3053, -2913, -40, 478, -1945, -2266, 1886, 1740, -867, 306, +1360, 2931, 1016, -2682, 1368, 2318, -842, 1911, 2888, 603, 749, 3346, 5699, 1575, -1705, 1865, +3293, 1597, 1660, 2732, 1895, 374, 764, 1735, 2266, 2953, 2753, 666, -959, 1069, 2180, 1161, +809, -70, 341, 1073, 839, 1793, 303, -419, -20, -3385, -3129, 215, -810, -2468, -810, -89, +-1153, 76, -1260, -3699, -2176, -2435, -3911, -2950, -96, 628, -3500, -4054, -1681, -2170, -1742, -2803, +-4884, -1899, -1316, -3518, -2150, -1583, -1744, -981, -461, 250, -1243, -1580, 1595, -492, -4251, -30, +3843, 1821, 492, 321, 2059, 3600, 1463, 2020, 3191, 1204, 1595, 3376, 3759, 3135, 2262, 3955, +3746, 763, 2538, 4788, 1132, 116, 2263, 1684, 2035, 436, -1871, 1232, 2184, 1866, 1964, -1635, +-2619, -1477, -1480, -309, -33, -926, -365, 440, -167, -1890, -1557, 729, -1170, -3827, 459, 2298, +-716, -323, 166, -1363, -807, 576, 231, -1376, -1482, -1093, -1911, -60, 808, -3817, -5749, -2857, +-506, 1036, 253, -3706, -4082, -1666, -2423, -2558, -1150, -154, -173, -2023, -840, -129, -1706, 362, +949, -1911, -833, 2334, 3047, 2454, 746, -627, 1224, 3338, 2910, 1277, 890, 1761, 490, -216, +3198, 3810, 1371, 1098, 1094, 2441, 2343, 232, 1878, 930, 55, 3385, 1929, -55, 1504, 710, +297, 716, 998, 1839, 1359, -8, -613, -629, -910, -347, 136, -682, -179, -847, -961, 772, +-1098, -2806, -2513, -1380, 292, -1272, -1373, -538, -3337, -3117, -207, -546, -1890, -1268, -976, -1831, +-1522, -1117, -1095, -1186, 72, 470, -2756, -1507, 2255, 387, -111, -443, -981, 2562, 2420, 222, +188, -123, 1821, 2445, 254, 400, 392, 501, 1548, 266, -300, 1243, 511, 835, 2848, 841, +881, 2849, -347, 401, 3252, 424, -1009, -1229, -877, 539, -135, 720, -334, -2861, -1002, -886, +-2421, -794, 517, -812, -2373, -2247, -590, 1180, -990, -3358, -1562, -1134, -1286, -335, -392, 477, +-297, -744, 521, 381, 1706, -50, -3129, 207, 1645, 1392, 1881, -1091, -2059, 355, 2504, 2674, +570, 970, 2096, -1263, -1607, 2094, 1561, 876, 1999, 613, 656, 1635, 2370, 3240, 262, -1837, +777, 1868, 591, -543, 664, 3562, 1435, -1117, 431, 175, -426, 1544, 393, -794, 2283, 1789, +-1627, -1018, -182, -996, -323, -14, -666, -1883, -2184, -761, -2225, -3060, 1113, 511, -3205, -1800, +-1812, -1762, 954, -1788, -3818, -1371, -798, -708, -2350, -2404, 598, -1104, -1812, 296, -182, -533, +-1799, -2448, -115, 437, 358, -17, -1810, 125, 1917, -937, -717, 747, 178, 1557, 1176, -126, +2274, 3335, 1104, -1731, -983, 4147, 3603, -381, 1387, 2681, 2067, 2513, 2461, 1873, 414, 1694, +4865, 3181, 367, 862, 2017, 2038, 1828, 1238, 1697, 3013, 709, -251, 2608, 2242, 897, -634, +-1918, 1389, 1791, -654, -1859, -3891, -2602, -402, -235, -315, -2079, -3084, -2347, -2718, -3972, -3370, +-2467, -3981, -3964, -1847, -976, -618, -2017, -4953, -4727, -1730, 453, 1092, 180, -807, -747, -1653, +-2613, -1083, 741, 1767, 1442, 291, 1634, 1390, -1155, -506, 1461, 2448, 3204, 3925, 1740, -819, +1977, 2217, -2222, -546, 3808, 3588, 402, -2093, 1377, 4797, 1902, 837, 1569, 810, 862, -208, +551, 3295, 2326, 1094, 842, -615, 409, 1789, 1386, 2321, -729, -2881, 2161, 2051, -1551, -96, +262, 218, -39, -1542, -629, -629, -1890, -1430, -741, 389, 656, -1104, -2266, -1231, 575, 185, +-1156, -2088, -3138, -2145, 427, 1036, -683, -1124, -636, -1226, 167, 1159, -1045, -1729, -1213, -1746, +-1421, -955, -698, -912, -891, 1687, 1650, -1986, -2232, -634, -642, -1487, 381, 2110, 536, 923, +1618, 473, 647, 728, 940, 226, -651, 1076, 3482, 3000, 520, 253, 1648, 3374, 2728, -2219, +-2535, 2176, 1966, -505, 510, 2528, 1247, -1614, -793, 609, 624, 511, -1501, -1885, -772, 248, +874, -1108, -1645, -503, 514, 2066, 345, -1308, -692, -2607, -2132, -334, -661, 634, 1584, -502, +-676, 1535, 582, -1291, 321, -96, -1730, -688, 1244, 2076, 567, 166, 726, -557, -267, -325, +-1080, -223, -381, -587, 1404, 3022, 1108, -19, 2770, 774, -3834, -1881, 1618, 1960, 610, -286, +-720, -1619, 832, 1289, -2207, -130, 2171, -722, -1464, -831, -2580, -3011, 223, 1148, -1308, -335, +2153, 1027, -1522, -2329, -508, 1681, 74, -1781, -1150, 837, 1954, -89, -1061, -267, 477, 136, +-1816, -822, 825, -514, -562, -195, -455, 919, 1976, -573, -2954, -713, 220, -524, 195, -353, +-694, 781, 1923, 881, -651, 1135, 1131, -1937, -525, 2494, 409, -1389, 2543, 3725, 124, 398, +1784, 1382, 1663, 2106, 2314, 1489, 1128, 1554, -502, -2231, -722, 1544, 2798, 2288, 343, -468, +168, -282, -2039, -2730, -1079, 1960, 2322, -481, -1821, -923, -1151, -2396, -2719, -1018, -1061, -1841, +603, -259, -2149, -905, -1862, -3068, -2816, -946, 1152, -975, -2384, -2634, -3429, -1566, -5, -928, +-1849, -1306, -857, -1433, -656, -810, -814, -309, -2854, -2222, 1049, 1138, 296, -84, 495, 561, +1367, 2659, 448, -437, 1042, 1657, 1939, 1797, 2961, 3106, 1069, 2133, 3860, 1795, 563, 1253, +2033, 2301, 2356, 1925, 1178, 1983, 1281, -1183, -909, 958, 3048, 1743, -1139, 783, 1104, -1040, +1088, 1196, -1816, -708, 2152, 216, -2697, -1739, -928, -710, -351, -536, -80, -344, -12, -1312, +-2151, 2050, 202, -4502, -1430, -31, -2797, -2239, -300, -2067, -2316, -85, -1323, -2744, -1976, -1018, +-2339, -3899, -1627, 775, 125, -406, -867, -1921, -1881, -1190, -267, -798, -1073, 939, 1709, 1682, +529, -1117, -670, -487, 955, 1083, -395, 1486, 1169, -313, 1029, 2020, 1688, -468, -56, 3509, +2469, 827, 2000, 1033, 47, 2141, 2783, 1687, 2487, 3020, 2554, 954, -644, 3827, 5794, 300, +-1936, 195, 2521, 2453, 725, 1662, 1548, -391, -62, -1693, -2991, -132, 617, -127, 943, 677, +-1197, -1779, -2205, -4199, -2595, 532, -1698, -1712, -60, -776, -1387, -2846, -2097, 154, -244, -926, +-2586, -3332, 158, 1621, -1933, -2909, -1073, -1051, 61, 110, -1912, -638, 123, -1656, -1241, -43, +1060, 431, -456, 640, 8, 655, 2228, 1575, 236, -461, 1584, 2178, 1040, 3133, 2950, 190, +648, 1116, 1265, 2293, -42, -1607, 1515, 2686, 1641, -202, -1902, -230, 1614, 1501, 1502, -2156, +-4734, 670, 897, -4373, -2408, 2065, 3773, 353, -3072, 42, 121, -2405, -583, 510, 974, 2563, +1285, -1172, -1265, -337, 786, 1605, 243, 122, 1506, 1419, 1001, -1591, -1262, 2106, 194, -365, +1786, 1459, -50, -2231, -1573, -387, 1066, 783, -2743, -701, 1084, -407, 1238, 177, -2272, -1471, +365, 1315, -1364, -2468, 80, -108, -713, 1336, 2051, 340, -682, -1485, -2324, -149, 781, -474, +1317, 1595, -663, -1707, -1582, -218, 1460, 266, -1364, 269, 1204, -263, -1361, -2027, -1045, 112, +163, 1115, -741, -2987, 1020, 2072, -2576, -3142, -1186, 2271, 2344, -3420, -1746, 3039, 772, -542, +-580, -2349, -1177, 1417, 876, 362, 589, 1060, 1563, 12, 737, 3040, 1443, -332, -446, -285, +1592, 3118, 1436, -92, 1571, 2382, 1680, 1705, 923, 668, 1387, 1115, 1208, 2312, 2182, 847, +942, 254, -981, 679, 1579, -144, -2508, -555, 3615, -566, -3668, 555, 97, -2581, 218, 1653, +-1034, -1170, -2070, -3924, -2448, -636, -1185, -3562, -1529, 1795, -1221, -2964, -2837, -3942, -1693, -1014, +-3505, -2294, 216, -240, -772, -793, -2590, -2306, 228, -792, -2272, -720, 1396, 3363, -104, -2657, +2211, 2265, -161, 880, -655, -542, 2599, 2763, 1551, 1009, 1724, 2448, -47, -1073, 3242, 3988, +163, 1816, 2600, 264, 1644, 1061, 802, 2278, 2432, 3250, 2050, 1273, 1913, 526, -1036, -266, +2513, 1527, 1083, 2729, 415, 220, 993, 379, 914, -1821, -1366, 2838, 464, -767, 1492, -552, +-2725, -2626, -1241, -919, -1864, -1192, -1810, -3314, -2431, 505, -761, -5892, -3142, 1257, -2092, -4223, +-3094, -1362, -24, -2956, -4735, -1389, 410, -921, -2136, -2480, -1927, -986, -756, -332, -251, -872, +881, 703, -1501, -1174, -518, 1419, 1777, 117, 1355, 1442, 803, -422, -853, 1963, 3249, 3956, +2608, 279, 1755, 1623, 743, 2219, 2756, 3140, 3303, 2366, 912, 1399, 2773, 495, -1083, 1800, +2817, 442, -223, 1885, 1653, -58, 148, -511, -145, 322, -802, -374, -526, 159, 1353, -353, +-1074, -132, -452, -887, -1030, -1508, -1100, 1184, 631, -1362, -160, -1728, -2675, 20, -2180, -2736, +299, 1269, 1115, -2812, -3561, 707, -773, -3138, -1065, 1157, 1584, -20, -3786, -3983, 619, 1343, +-1297, 463, 893, -460, 609, -43, 825, 840, -2546, -583, 677, -949, 1423, 2525, 741, -698, +-1045, 1125, 1345, -2027, -1031, 1597, 781, 1048, 1105, -424, -407, 591, 178, -921, -2, 1566, +1701, 125, -422, 2090, 1575, -750, 790, 2017, 356, -798, -72, 39, 350, 1224, 48, -307, +1315, 2647, 1032, -2469, -534, 1107, -1378, 1066, 1208, -2084, 575, 554, -4001, -2266, 2537, 2102, +-871, -546, 746, -664, -496, 2165, 536, -1803, 172, 1881, 1699, 297, -2129, -2257, -196, -567, +-698, 1930, 1927, -400, -930, -40, 1247, 434, -1864, -1890, -691, -517, 299, -103, -216, 1157, +-884, -545, 1724, -1229, -1573, 218, -900, -1297, 1066, 2075, -748, -1993, -1346, -1256, -356, -766, +283, 786, -1194, 1212, 1464, -2825, -3220, -666, 405, -611, -422, -33, -1973, -2250, -1434, -798, +-206, -713, 133, 685, 631, 2372, -331, -3544, -47, 1312, -474, 65, 1449, 3264, 2941, 1108, +1196, 1895, 1976, 1324, 673, 694, 3151, 3777, 787, 617, -47, 14, 1728, -126, 1171, 2270, +-796, 353, 1632, 1183, 1318, 1224, 1848, 250, -1451, 643, 255, -1807, -785, -672, -707, 526, +-1018, -1992, 197, 214, -2734, -3201, -1197, -1153, -1362, -1415, -3298, -2579, -1300, -1766, -1430, -1354, +-838, 13, -1781, -2670, -754, -1623, -3243, -387, -33, -191, 1290, -816, -1534, -1269, -1220, 1020, +402, -425, 1188, 533, -431, 1544, 1584, -710, 102, 379, 172, 818, 790, 2789, 668, -3042, +2084, 4501, 191, 309, 984, 262, 2219, 1619, -728, 1070, 2671, 1101, 228, 335, 1971, 3298, +-55, -528, 3200, 2230, 619, -453, -1642, 1731, 1973, -98, 1908, 955, -602, 1265, 436, -1941, +-1272, 178, -1195, -1997, 134, 200, -1519, -1359, -569, -2041, -2381, -317, -1194, -3141, -2029, 942, +634, -2858, -1362, -68, -3358, -2048, 67, -80, 262, -2312, -2822, -1562, -2160, 521, 605, -2915, +-664, 1076, -286, -636, -1223, -22, -48, -1187, 958, 1193, 828, 2828, 976, -554, 1355, 1625, +2072, 1493, -562, 765, 1858, 1447, 2943, 2472, -189, 2886, 4586, -434, -473, 1561, 551, 610, +163, 1791, 4270, 958, -1887, -2234, -1774, 1728, 2411, -328, 1165, 1856, -2418, -2370, 603, -188, +312, 1349, -241, -1514, -1146, -387, -1575, -1449, 225, -863, -365, 2225, 1236, -1527, -1536, -26, +-1403, -2318, 775, 318, -3884, -2148, 1183, -96, -1112, -1114, -448, 638, 378, -605, -1427, -29, +1790, 399, -993, 1504, 2462, 784, 995, -2064, -2469, 2119, 620, 398, 1115, -1380, 928, 1175, +-3036, -1018, 1414, -1129, -844, -94, -1040, 1815, 74, -2231, 1249, -70, -400, 2119, 816, 1132, +-682, -943, 2467, -1303, -2598, 2196, 1713, 185, 605, 479, 1155, 567, -2033, -1996, 67, 1265, +837, -1153, -1406, 432, -228, -1838, -694, -96, 129, 444, -947, -17, -441, -949, 1513, 243, +-638, 526, -1011, -1798, -139, 2010, 85, -2237, 1500, 4018, 1994, 890, 524, -193, 177, 1551, +2513, 1134, 212, 3441, 2064, -3064, -727, 2327, 1249, 3668, 2558, -2348, 145, 1653, -923, -991, +-1461, 120, 2789, -22, -1135, 726, -491, -2398, -2758, -853, 2200, 491, -2498, -1927, -793, -154, +-1470, -3587, -2057, -151, -2277, -3059, -1027, -1359, -1328, -1327, -1818, -51, 570, 420, 315, -2507, +-3017, -461, 345, 1352, 145, -2537, -236, 677, -849, 440, 634, -736, -34, 236, -335, 434, +1048, 665, -38, 172, 2588, 2525, 582, 1185, 1459, 970, 849, 542, 880, 2097, 3025, 1481, +389, 2978, 2182, 6, 427, -972, 1257, 4245, 888, -888, 1501, 3106, 3441, 1948, -1446, -395, +1795, 1122, 570, -1885, -1078, 2060, -30, -257, 1169, -95, 437, -272, -2966, -1477, -395, -2159, +-2266, -1538, -150, 253, -2508, -4075, -2681, -1353, -1754, -3321, -3548, -139, -626, -5250, -4230, -1151, +80, 1066, -891, -3145, -2591, -2098, -3094, -2753, -1190, 51, 1623, 1317, 275, 970, -591, -1543, +189, -200, 443, 2485, 1375, -48, 557, 1738, 2699, 3032, 1946, 1629, 1983, 1045, 1459, 2301, +1995, 4132, 3972, 323, 1930, 5474, 3393, 383, -42, 95, 1416, 2770, 1760, 86, 1314, 2959, +1266, -111, 1808, 2478, -118, -1085, -2406, -2329, 2252, 1317, -1557, -261, -316, 379, 688, -2556, +-3643, -2207, -2542, -1476, -1315, -2026, 1139, -188, -3514, -1132, 110, -526, -1933, -4678, -3356, -92, +234, -1134, -2368, -1442, 1115, -1803, -4912, -555, 622, -2006, -2084, -1548, -1497, -1498, 700, 2110, +1152, 1101, -136, 514, 1270, -356, 1578, 1185, 126, 3349, 3097, 1595, 2072, 802, 266, 2576, +2982, 1364, 1886, 1985, 1877, 952, -133, 2000, 2521, 1767, 2831, 1213, -42, 716, -232, -144, +-478, -124, 4779, 3802, -1679, -791, 180, -2054, -2244, -1151, -720, 988, 949, -1308, -150, -1458, +-2051, 454, -2185, -1122, 2056, -387, -315, -893, -2911, -392, 251, -2287, -1895, 38, 308, 144, +-487, -2839, -2020, 8, 411, -328, -2098, 179, 1019, -1756, -1289, 56, 689, -634, -2215, -550, +1207, 1450, -399, -931, 1559, 1215, 86, 786, 960, 802, -524, -596, 2219, 3313, 2222, 645, +-1340, -1187, 2206, 4064, 1260, -554, 271, 1469, 1746, -787, 190, 2197, -1483, -1538, 163, -514, +1619, 1616, -1087, -931, -2764, -2461, 1464, -886, -3020, 1373, 2078, -1139, -1953, -1785, 486, 552, +-836, 1795, 914, -365, 1395, -1529, -2607, 1334, 1440, -1308, -1299, -337, -362, 928, 72, -1346, +92, -159, -515, 895, 98, -193, 1180, -537, -1130, 745, 81, 1554, 2332, 388, 239, 6, +893, 1450, -576, 1217, 4544, 1575, -2134, -8, 1493, -1067, -2269, 567, 2926, 169, -2706, -2294, +-3128, -1855, 1748, -221, -2952, -569, 609, -543, -1972, -3274, -1104, 730, -2275, -2943, -107, -266, +-242, -154, -2458, -490, 1942, -1810, -2789, -443, 278, 1718, 1269, 112, 353, -310, -409, 24, +-145, 291, 1702, 172, -1925, 622, 1395, 223, -120, -2150, -931, 1572, 1836, 1799, -566, -1048, +390, -530, 963, 2128, 795, 2238, 1412, -371, 1455, 2087, 390, -543, 463, 1340, 2008, 3248, +2845, 2219, 652, -456, 929, 279, -990, -213, 876, 509, 431, 1590, 235, -2026, -3205, -1654, +1418, 440, 352, -726, -4101, -849, 413, -3544, -2033, 1392, 1196, -2004, -4182, -2477, -814, -1517, +-3637, -3123, -571, 234, 900, -660, -3562, -2123, -1265, -2057, -750, -356, 465, 825, -1487, -922, +539, -154, 965, 2689, 698, -39, 1662, -1452, -2027, 2008, 2019, 1736, 998, 1253, 1669, -863, +-139, 814, -154, 955, 1727, 818, 508, 1964, 1926, 969, 413, -61, 1995, 1079, -996, 1442, +716, 377, 1922, -273, 1278, 1945, -1477, 722, 2284, 1187, 1632, -42, -947, 1306, 1938, 231, +511, 1506, -478, -928, 1039, -250, -2041, -2141, -2145, -772, -1653, -2473, 461, 725, -2769, -3988, +-2102, -590, -1079, -2389, -2825, -2259, -868, 802, 479, -1000, -1791, -1772, -474, -745, -1015, 880, +-68, -1774, -986, 643, 1662, 599, -1819, -1810, 747, 1312, 594, 1222, 1784, -223, -2592, -924, +1625, 2719, 2201, -60, 479, 1837, 914, 1251, -526, -1434, 1078, 1575, 3493, 3383, -676, -1684, +-520, -40, -3, 970, 2106, 800, -1716, -1117, 2171, 1197, -664, -240, -715, 345, 844, -1368, +-1925, 77, -605, -3286, -638, 1582, -14, -1020, -1793, -1834, -258, 744, 665, 72, -737, -635, +638, 1031, 380, -15, 3, -314, -17, -176, 275, 730, -103, -160, 315, 963, 1942, -136, +-1303, 13, 381, 1614, 1213, -1198, -1419, 150, 2842, 1481, -1080, 1011, 2417, 1134, -267, -61, +992, 572, -651, -1058, 2521, 4231, -74, -2430, -1771, -543, -599, -747, 561, -218, -1312, -990, +530, 117, -2858, -1568, 952, -211, -849, 44, 1148, 172, -3129, -2490, 1157, 943, -1601, -2508, +-1220, -356, -1324, -1904, -1098, -1189, -2378, -2650, -646, 1803, 1157, -65, -658, -1642, -825, -244, +-668, 365, 662, 1215, 2830, 2150, -188, 470, 1941, 500, 988, 3468, 4145, 2485, -42, 30, +1786, 2441, 2140, 1843, 1321, 565, 420, 749, 373, 768, 1346, 1446, 1817, 777, 415, 902, +749, -694, -2505, -988, 1575, 1997, 306, -1847, -427, 730, -1020, -949, 1575, 1181, -2327, -1809, +222, -1046, -1623, -1141, -1137, -1893, -1959, -737, -2216, -3219, -1303, -2762, -2607, -3, -3265, -4104, +-872, -1368, -1749, -182, -574, -2229, -1899, -1880, -1163, 1033, -80, 78, 709, -307, 1029, 573, +278, 827, -154, 1208, 1614, 2128, 2785, 1556, 1837, 479, 1135, 3789, 1392, -395, 591, 3211, +3503, -84, 398, 1801, 1355, 2586, 3590, 2409, 624, 1917, 2435, 1670, 2982, 2370, -208, -1269, +406, 2755, 1859, 1468, 2560, -300, -2769, -1022, -49, 24, 480, 52, -798, -1083, -1174, -2134, +-2953, -3608, -3368, -1707, -1418, -2128, -3518, -4545, -2866, -1239, -1337, -2634, -2688, -707, -1916, -4553, +-2909, -450, -2160, -3085, -316, -1165, -1827, 1904, 1126, -833, -905, -800, 1427, 2349, 2104, 1416, +1308, 1391, 55, 928, 3017, 3165, 1565, 856, 1162, -534, 794, 2637, 1160, 1898, 4100, 3361, +418, 446, 2121, 1925, 1588, 1309, 1307, 1617, 2279, 1843, -810, 862, 4566, 1287, -2806, -1641, +-1023, 26, 2219, 1359, 1331, 617, -2301, -701, 69, -215, 1702, -1111, -2910, -84, -197, -1231, +-1955, -2589, -587, 134, -2726, -2402, 15, -780, -1674, -2213, -2698, -2107, -1816, -536, 510, -282, +-991, 396, -912, -5171, -3367, 1270, 1987, -772, -1777, 990, 1125, 876, 1071, -582, -637, 611, +772, -1538, 367, 4809, 1488, -319, 2836, 1926, -645, 589, 2357, 1169, 1826, 4676, 2432, -1088, +8, 2382, 2045, 1153, 2186, 1964, 237, -508, -1018, -778, 290, 1662, 1360, -1331, -754, 2431, +1492, -1130, -1297, -849, -526, 564, 466, -711, -258, 863, 495, -1272, -2088, 1312, 1642, -3738, +-2983, -157, 122, 1194, -617, 259, 2138, -1728, -3361, -1436, -393, -359, -634, -746, 255, 617, +-810, -369, 220, -1492, -608, 1340, 1618, -1272, -2451, 1563, 899, -1486, 1417, 1885, 1269, 638, +-877, 700, 1617, 1527, 65, -452, 2477, 1606, 46, 147, -51, 802, 904, 679, 264, -882, +-620, 648, -232, -2864, 725, 3658, -784, -1524, -716, -1586, 1147, -1413, -3898, 333, 456, -573, +543, -746, -968, -1007, -1712, -1045, -711, -1321, -555, 323, -717, -694, 289, 461, -581, -3287, +-1583, 1588, -520, -1415, -400, 1602, 3344, -1729, -4438, -1073, 781, 914, 796, 1913, 1936, 52, +-875, -945, 345, 1590, 2509, 1777, 425, 1597, 893, 664, 840, -1737, -303, 2879, 3029, 2379, +952, 943, 1057, -590, 552, 2442, 1562, 710, -720, -121, 2376, 856, -1431, -552, -98, -188, +-365, -1074, -387, 63, -671, -1179, -2644, -1648, 930, -534, -2248, -2600, -3439, -223, 1002, -2874, +-1392, 34, -3004, -2477, -1417, 40, 285, -2037, -983, 225, -1529, -1541, -253, -872, -205, -160, +-1834, 220, -3, -2039, -1020, -530, 424, -383, -1344, 1617, 262, -2925, 885, 3708, 1912, 629, +-682, 483, 2038, 297, 1280, 2715, 642, 405, 2097, 2119, 1231, 1330, 1433, 1241, 2308, 2125, +1637, 2801, 1941, 203, 1002, 1927, -363, -664, 2275, 1395, 616, 629, -309, 288, -606, -1933, +-1664, 709, 2287, -59, -1784, -1478, -249, -952, -2004, -1092, -3668, -3169, 1982, 1142, -2513, -1531, +-286, -3174, -3560, -1396, -1078, -1415, -1030, -2091, -2576, -579, -1812, -3578, -683, 556, 917, -515, +-2901, -552, 486, -750, 235, 672, 703, 668, -307, 483, 2421, 1036, 517, 1930, -823, -594, +3439, 2959, 1270, 353, 728, 1405, -85, 1857, 3026, -185, -172, 1163, -675, 318, 3938, 2727, +350, -151, -346, 710, 233, -880, -105, 306, 619, 594, -536, 474, 2121, -279, -3642, -2191, +3390, 2734, -2975, -2687, -1653, -1018, 2331, 750, -3190, -2741, -809, 68, 461, -630, -2461, -1498, +-803, -2771, -2368, 1395, 2367, -1868, -4112, -1066, -226, -1294, -218, -560, -75, 1265, 1496, 312, +-1003, 1449, 1270, -1265, 990, 2628, 820, -1582, -2357, -679, 2372, 4352, 1076, -1121, -150, 741, +1893, -863, -2275, 1326, 1764, 381, 149, 849, 918, -1955, -983, 1663, 698, 1296, 1485, -913, +-1169, -181, 367, 1418, 969, -487, 1749, 2128, -1000, -492, -858, -1662, 1157, 191, -1603, 1148, +963, -2164, -2415, -216, 701, -1725, -3088, -2501, -382, 842, -854, -986, -1700, -1580, 1259, 1184, +-884, -3060, -2343, 56, -363, -753, 1128, 3571, 1783, -555, 358, -534, 379, 3202, 1925, 1249, +461, 431, 1367, -1328, 526, 3706, 490, 1542, 3143, -938, -1061, 523, -1267, -215, 2762, 3161, +1492, -2523, -1616, 2363, -477, -1313, 2085, 816, -1566, -2479, -1372, 1926, 2228, 254, -1225, -2102, +-132, 436, -642, 582, -1705, -4737, -1809, 1738, 570, -812, 195, -1260, -2147, -1626, -1997, -135, +-884, -3053, -807, 1187, 1232, -260, -1120, 179, -242, -912, 1030, 1973, -356, -1492, 1249, 2211, +1066, 1045, 149, -344, 1331, 3212, 2526, 1148, -438, -1656, 985, 1895, 1188, 2078, 1949, 2102, +777, -1078, 990, 1379, -1679, -343, 3284, 2727, 1955, 78, -1230, 539, -191, -583, 463, 501, +-70, -1962, -1011, 1169, -1002, -1984, 2288, 1806, -2681, -1076, -136, -2094, -2448, -3876, -919, 3097, +-534, -3229, -638, 315, -2055, -3591, -1011, 1623, -385, -1601, -162, -1290, -1265, -487, -1953, -936, +475, 1087, 772, -1501, -2055, -1657, -3, 712, -1623, 98, 3423, 2085, -1731, -1308, 1578, 663, +-1610, -729, 2240, 2210, 2161, 3594, 1210, 538, 858, 333, 1116, 750, 2221, 3470, 380, -996, +812, 2646, 3514, 1982, -2387, -1141, 5222, 3587, -1807, -610, 638, -7, -291, 486, 1886, 13, +-993, -198, -1117, 929, 1672, -1994, -2876, -1267, -750, 1051, 902, -2147, -2646, -2561, -2151, 500, +-1887, -4276, -169, -425, -2961, -790, 763, 1771, -39, -3398, -1458, -542, -1552, -1238, -1464, -935, +1115, 2593, -849, -2941, 688, 1282, 303, -416, -681, 1355, 1207, -118, -1202, 491, 4373, 2013, +-1070, -499, 1430, 3633, 1049, 69, 1847, 1244, 2258, 1296, 234, 1566, 1918, 2966, 2036, -613, +172, 933, -975, -1087, 2210, 3897, 2793, -698, -2352, -40, 424, -550, -1088, -2995, -1871, 976, +215, -698, 175, -281, -884, -2162, -2682, -918, -351, -1548, -1548, -712, -162, -195, -1492, -2655, +-72, 1253, 163, 254, -761, -1626, -694, -778, -262, 520, 1771, 2145, -722, -1554, -12, 442, +-33, -1206, -1297, -630, 1312, 3224, 1839, -416, -363, 757, -1167, -1754, 1481, 2110, 1362, 353, +-1288, 603, 4038, 2678, -984, 272, 2660, 517, -1534, -89, 1572, 1039, 932, 3317, 3748, 1600, +1265, 337, -2858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, -1, -1, -1, 0, 0, 0, 0, -9, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -9, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-9, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -9, -1, -1, -1, 0, 0, 0, 0, +-41, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -45, -515, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -45, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -45, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -3, -1, -1, 0, 0, 0, 0, +-13, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -515, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-9, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -25091, -1, -2122, 2, 0, 1632, 18198, -13, 29731, -2457, 0, 2, 0, 0, 26198, +-14, 30463, -2457, 26486, 2, 0, 1568, 0, -14, 25635, -1, -2058, 3, 0, 0, 0, +-1, 30719, -1, -2049, 0, 0, 0, 0, -1, -1, -1, -2057, 0, 0, 0, 0, +-1, -1, -1, -2058, 0, 0, 0, 0, -1, -1, -1, -2057, 0, 0, 0, 0, +-1, 26367, -1, -4097, 0, 0, 0, 0, -1, -2305, -1, 32767, 0, 0, 0, 0, +-1, -1, -1, -1, 2, 0, 0, 0, -13, -1, -1, -1, 0, 0, 0, 0, +-1, 26359, -1, -1, 0, 0, 0, 0, -1, 32767, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -2049, 0, 0, 0, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, 26339, -1, -1, 2, 0, 1568, 0, -13, 25635, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, 30463, -1, -1, 0, 0, 0, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, 32767, -1, -1, 0, 0, 0, 0, -1, 26359, -1, -2049, 2, 0, 0, 0, +-14, -1, -1, -2049, 0, 0, 0, 0, -1, 26355, -1, -1, 0, 0, 0, 0, +-1, 26359, -1, -1, 0, 0, 0, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, -1, -1, -6145, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, 26339, -1, -1, 0, 0, 0, 0, -1, 30455, -1, -9, 0, 0, 0, 0, +-1, -1, -1, -2, 0, 0, 0, 0, -1, 26355, -1, -1, 0, 0, 0, 0, +-1, 30463, -1, -2049, 2, 0, 0, 0, -13, 25699, -1, -1, 2, 0, 0, 0, +-14, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 2, 0, 0, 0, +-9, 26355, -1, -2049, 0, 0, 0, 0, -1, 26355, -1, -2057, 0, 0, 0, 0, +-9, -2821, -2313, -2, 0, 0, 0, 0, -1, 26339, -1, -2049, 0, 0, 0, 0, +-1, -1, -1, -1, 2, 0, 0, 0, -13, -1, -1, -6153, 2, 0, 0, 0, +-1, -1, -1, -2, 0, 0, 0, 0, -1, 30719, -1, -2049, 0, 0, 0, 0, +-1, 26355, -1, -2, 0, 0, 0, 0, -9, -1, -1, -1, 2, 0, 0, 0, +-1, -2305, -1, -2057, 0, 0, 1632, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, 30463, -1, -2049, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, 32767, -1, 32759, 0, 0, 0, 0, -1, 30719, -1, -2, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -9, 29931, -1, -2057, 0, 0, 0, 0, +-1, -2049, -1, -2, 0, 0, 0, 0, -1, -1, -1, -2049, 0, 0, 0, 0, +-1, -1, -1, 32767, 0, 0, 0, 0, -1, -1, -1, 26615, 0, 0, 0, 0, +-1, -1, -1, -2186, 0, 0, 0, 0, -1, -1, -1, -2050, 0, 0, 0, 0, +-1, -1, -1, -1025, 0, 0, 0, 0, -1, -1, -1, -8193, 0, 0, 0, 0, +-1, -593, -1, -3, 1, 0, 0, 0, -1, -1, -1, -1025, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, +-1, -1, -1, +}; +struct tsf _tsf = { + .presets = presets, + .shortSamples = shortSamples, + .samplesNum = 523794, + .voices = NULL, + .channels = NULL, + .presetNum = 129, + .voiceNum = 0, + .maxVoiceNum = 0, + .voicePlayIndex = 0, + .outputmode = TSF_STEREO_INTERLEAVED, + .outSampleRate = 44100, + .globalGainDB = 0, + .refCount = NULL, +}; diff --git a/src/libtinysoundfont/LICENSE b/src/libtinysoundfont/LICENSE index 066642da..533da73e 100644 --- a/src/libtinysoundfont/LICENSE +++ b/src/libtinysoundfont/LICENSE @@ -1,5 +1,4 @@ -Copyright (C) 2017 Bernhard Schelling -Based on SFZero, Copyright (C) 2012 Steve Folta (https://github.com/stevefolta/SFZero) +Copyright (C) 2017-2023 Bernhard Schelling (Based on SFZero, Copyright (C) 2012 Steve Folta, https://github.com/stevefolta/SFZero) 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 diff --git a/src/libtinysoundfont/README.ESP8266 b/src/libtinysoundfont/README.ESP8266 deleted file mode 100644 index e88104df..00000000 --- a/src/libtinysoundfont/README.ESP8266 +++ /dev/null @@ -1,40 +0,0 @@ -This is a ported and significantly modified version of TinySoundFont by -Bernhard Schelling. https://github.com/schellingb/TinySoundFont - -TinySoundFont lets you use a SoundFont2 library (sampled MIDI instruments) -to play high quality music with a single #include. - -Porting and modifications done by Earle F. Philhower, III - and released under the GPL v3 or later. - -The changes to allow it to work on the ESP8266 consisted mostly in making -it significantly less memory intensive and speeding up the inner loops by - using fixed point arithmetic instead of floating point. This change to -fixed point lets us use simple integer math, which is massively faster than -the software FP libraries on the ESP8266, but does come at the cost of a -slightly increased noise floor. - -On the memory side, all data structures were converted into a "lazy" -allocation which means that instead of loading the full contents of the -header bits into RAM (which is often WAY more than the 40KB available on -the EPS8266), only those bits needed are loaded, and only when they are -needed. - -Also, instead of loading the entire sample array into memory (i.e. nearly -500MB for a good piano sample), only a very small portion is loaded into a -LRU *cache* area. - -Even with the caching, it was found that SPIFFS, while having great -functionality, was horrbly slow. So I wrote a new "faster" ROM filesystem -called, surprisingly, FastROMFilesystem. -https://github.com/earlephilhower/ESP8266FastROMFS -If you are getting choppy playback, try this new filesytem or using a SD -card (not tested by myself, but it'd be hard top be slower than SPIFFS). -Simply going from SPIFFS to FastROMFilesystem took my testing of -FURELISE.MID and 1MGM.SF2 from 0.5x realtime to 2.5x (i.e. from unusable -stuttering to plenty of time to do other tings on the ESP8266) for the -first 20 seconds or so tested. - --Earle F. Philhower, III - earlephilhower@yahoo.com - diff --git a/src/libtinysoundfont/README.ESP8266Audio.md b/src/libtinysoundfont/README.ESP8266Audio.md new file mode 100644 index 00000000..8eaf58af --- /dev/null +++ b/src/libtinysoundfont/README.ESP8266Audio.md @@ -0,0 +1,43 @@ +# Fixed-point MIDI ROM-wavetable synthesis + +This branch was ported to ESP8266Audio by Earle F. Philhower, III +from the original TinySoundFont by https://github.com/schellingb/TinySoundFont + +Changes include converting a large portion of the operation to fixed-point +arithmetic and adding in a special ROM-mode where the SoundFont can be +stored inside a microcontroller ROM w/o needing a filesystem. This saves +RAM and makes the code faster than having to page in little bits of +waveforms or regions. + +## Building ROM-wavetable structures + +The SoundFont is stored in ROM using the normal C structures TSF uses, so it +requires a conversion from raw SF2 file into a header with structure members. +Do NOT use `xxd` or similar on the SoundFont, it won't work. + +In the `examples` directory, run `build-linux-gcc`to compile the SF2-to-H +converted. Run it as follows: +```` +$ ./dump-linux-x86_64 INPUT.SF2 OUTPUT.H +```` + +For example +```` +$ ./# dump-linux-x86_64 Scratch2010.sf2 scratch2010.h +```` + +## Building the F16P16 tables + +This port implements a few functions that normally require floating point +math with piecewise linear approximations. They are hardcoded in the TSF. +file already, but to regenerate them just run `make_f16p16_tables`. + +## Performance + +On devices that can perform hardware single-precision FP (i.e. the Pico 2, +original ESP32, others) this code can generate up to 44.1khz sounds with +over a dozen simultaneous voices without underflow and leaving some CPU +for other work. + +On devices without an FPU, sample rates of up to 22050hz are possible, +depending on the MIDI and SF2 used. diff --git a/src/libtinysoundfont/README.fastapprox b/src/libtinysoundfont/README.fastapprox new file mode 100644 index 00000000..45d4561c --- /dev/null +++ b/src/libtinysoundfont/README.fastapprox @@ -0,0 +1,3 @@ +Fastapprox borrowed from https://code.google.com/archive/p/fastapprox/ + +3-clause BSD licensed diff --git a/src/libtinysoundfont/README.md b/src/libtinysoundfont/README.md index 7e030eca..28d3995b 100644 --- a/src/libtinysoundfont/README.md +++ b/src/libtinysoundfont/README.md @@ -1,37 +1,37 @@ -# TinySoundFont -SoundFont2 synthesizer library in a single C/C++ file - -## Overview - -TinySoundFont is a software synthesizer using SoundFont2 sound bank files. - -The library is a single C header file so it is extremely simple to integrate in your C/C++ projects. - -```c++ -#define TSF_IMPLEMENTATION -#include "tsf.h" - -... - -tsf* TinySoundFont = tsf_load_filename("soundfont.sf2"); -tsf_set_output(TinySoundFont, TSF_MONO, 44100, 0); //sample rate -tsf_note_on(TinySoundFont, 0, 60, 1.0f); //preset 0, middle C -short HalfSecond[22050]; //synthesize 0.5 seconds -tsf_render_short(TinySoundFont, HalfSecond, 22050, 0); -``` - -The library code is based on [SFZero by Steve Folta](https://github.com/stevefolta/SFZero). - -## Documentation - -The API documentation can be found on [top of the library source code](https://github.com/schellingb/TinySoundFont/blob/master/tsf.h). - -There are also [examples available](https://github.com/schellingb/TinySoundFont/tree/master/examples) which come with a sample SoundFont file and build and play sound on Win32, Win64, Linux and MacOSX with no further dependencies. - -## Dependencies - -C standard libraries for fopen, math and malloc (can be removed by providing custom functions with #defines). - -## License - -TinySoundFont is available under the [MIT license](https://choosealicense.com/licenses/mit/). +# TinySoundFont +SoundFont2 synthesizer library in a single C/C++ file + +## Overview + +TinySoundFont is a software synthesizer using SoundFont2 sound bank files. + +The library is a single C header file so it is extremely simple to integrate in your C/C++ projects. + +```c++ +#define TSF_IMPLEMENTATION +#include "tsf.h" + +... + +tsf* TinySoundFont = tsf_load_filename("soundfont.sf2"); +tsf_set_output(TinySoundFont, TSF_MONO, 44100, 0); //sample rate +tsf_note_on(TinySoundFont, 0, 60, 1.0f); //preset 0, middle C +short HalfSecond[22050]; //synthesize 0.5 seconds +tsf_render_short(TinySoundFont, HalfSecond, 22050, 0); +``` + +The library code is based on [SFZero by Steve Folta](https://github.com/stevefolta/SFZero). + +## Documentation + +The API documentation can be found on [top of the library source code](https://github.com/schellingb/TinySoundFont/blob/master/tsf.h). + +There are also [examples available](https://github.com/schellingb/TinySoundFont/tree/master/examples) which come with a sample SoundFont file and build and play sound on Win32, Win64, Linux and MacOSX with no further dependencies. + +## Dependencies + +C standard libraries for fopen, math and malloc (can be removed by providing custom functions with #defines). + +## License + +TinySoundFont is available under the [MIT license](https://choosealicense.com/licenses/mit/). diff --git a/src/libtinysoundfont/cast.h b/src/libtinysoundfont/cast.h new file mode 100644 index 00000000..60484000 --- /dev/null +++ b/src/libtinysoundfont/cast.h @@ -0,0 +1,49 @@ +/*=====================================================================* + * Copyright (C) 2012 Paul Mineiro * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with * + * or without modification, are permitted provided that the * + * following conditions are met: * + * * + * * Redistributions of source code must retain the * + * above copyright notice, this list of conditions and * + * the following disclaimer. * + * * + * * 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. * + * * + * * Neither the name of Paul Mineiro nor the names * + * of other contributors may be used to endorse or promote * + * products derived from this software without specific * + * prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * + * CONTRIBUTORS "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 COPYRIGHT OWNER * + * OR CONTRIBUTORS 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. * + * * + * Contact: Paul Mineiro * + *=====================================================================*/ + +#ifndef __CAST_H_ + +#ifdef __cplusplus +#define cast_uint32_t static_cast +#else +#define cast_uint32_t (uint32_t) +#endif + +#endif // __CAST_H_ diff --git a/src/libtinysoundfont/fastexp.h b/src/libtinysoundfont/fastexp.h new file mode 100644 index 00000000..383d5ad8 --- /dev/null +++ b/src/libtinysoundfont/fastexp.h @@ -0,0 +1,137 @@ +/*=====================================================================* + * Copyright (C) 2011 Paul Mineiro * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with * + * or without modification, are permitted provided that the * + * following conditions are met: * + * * + * * Redistributions of source code must retain the * + * above copyright notice, this list of conditions and * + * the following disclaimer. * + * * + * * 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. * + * * + * * Neither the name of Paul Mineiro nor the names * + * of other contributors may be used to endorse or promote * + * products derived from this software without specific * + * prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * + * CONTRIBUTORS "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 COPYRIGHT OWNER * + * OR CONTRIBUTORS 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. * + * * + * Contact: Paul Mineiro * + *=====================================================================*/ + +#ifndef __FAST_EXP_H_ +#define __FAST_EXP_H_ + +#include +#include "cast.h" +//#include "sse.h" + +// Underflow of exponential is common practice in numerical routines, +// so handle it here. + +static inline float +fastpow2 (float p) +{ + float offset = (p < 0) ? 1.0f : 0.0f; + float clipp = (p < -126) ? -126.0f : p; + int w = clipp; + float z = clipp - w + offset; + union { uint32_t i; float f; } v = { cast_uint32_t ( (1 << 23) * (clipp + 121.2740575f + 27.7280233f / (4.84252568f - z) - 1.49012907f * z) ) }; + + return v.f; +} + +static inline float +fastexp (float p) +{ + return fastpow2 (1.442695040f * p); +} + +static inline float +fasterpow2 (float p) +{ + float clipp = (p < -126) ? -126.0f : p; + union { uint32_t i; float f; } v = { cast_uint32_t ( (1 << 23) * (clipp + 126.94269504f) ) }; + return v.f; +} + +static inline float +fasterexp (float p) +{ + return fasterpow2 (1.442695040f * p); +} + +#ifdef __SSE2__ddddd + +static inline v4sf +vfastpow2 (const v4sf p) +{ + v4sf ltzero = _mm_cmplt_ps (p, v4sfl (0.0f)); + v4sf offset = _mm_and_ps (ltzero, v4sfl (1.0f)); + v4sf lt126 = _mm_cmplt_ps (p, v4sfl (-126.0f)); + v4sf clipp = _mm_or_ps (_mm_andnot_ps (lt126, p), _mm_and_ps (lt126, v4sfl (-126.0f))); + v4si w = v4sf_to_v4si (clipp); + v4sf z = clipp - v4si_to_v4sf (w) + offset; + + const v4sf c_121_2740838 = v4sfl (121.2740575f); + const v4sf c_27_7280233 = v4sfl (27.7280233f); + const v4sf c_4_84252568 = v4sfl (4.84252568f); + const v4sf c_1_49012907 = v4sfl (1.49012907f); + union { v4si i; v4sf f; } v = { + v4sf_to_v4si ( + v4sfl (1 << 23) * + (clipp + c_121_2740838 + c_27_7280233 / (c_4_84252568 - z) - c_1_49012907 * z) + ) + }; + + return v.f; +} + +static inline v4sf +vfastexp (const v4sf p) +{ + const v4sf c_invlog_2 = v4sfl (1.442695040f); + + return vfastpow2 (c_invlog_2 * p); +} + +static inline v4sf +vfasterpow2 (const v4sf p) +{ + const v4sf c_126_94269504 = v4sfl (126.94269504f); + v4sf lt126 = _mm_cmplt_ps (p, v4sfl (-126.0f)); + v4sf clipp = _mm_or_ps (_mm_andnot_ps (lt126, p), _mm_and_ps (lt126, v4sfl (-126.0f))); + union { v4si i; v4sf f; } v = { v4sf_to_v4si (v4sfl (1 << 23) * (clipp + c_126_94269504)) }; + return v.f; +} + +static inline v4sf +vfasterexp (const v4sf p) +{ + const v4sf c_invlog_2 = v4sfl (1.442695040f); + + return vfasterpow2 (c_invlog_2 * p); +} + +#endif //__SSE2__ + +#endif // __FAST_EXP_H_ diff --git a/src/libtinysoundfont/fastlog.h b/src/libtinysoundfont/fastlog.h new file mode 100644 index 00000000..674f6d16 --- /dev/null +++ b/src/libtinysoundfont/fastlog.h @@ -0,0 +1,144 @@ +/*=====================================================================* + * Copyright (C) 2011 Paul Mineiro * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with * + * or without modification, are permitted provided that the * + * following conditions are met: * + * * + * * Redistributions of source code must retain the * + * above copyright notice, this list of conditions and * + * the following disclaimer. * + * * + * * 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. * + * * + * * Neither the name of Paul Mineiro nor the names * + * of other contributors may be used to endorse or promote * + * products derived from this software without specific * + * prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * + * CONTRIBUTORS "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 COPYRIGHT OWNER * + * OR CONTRIBUTORS 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. * + * * + * Contact: Paul Mineiro * + *=====================================================================*/ + +#ifndef __FAST_LOG_H_ +#define __FAST_LOG_H_ + +#include +//#include "sse.h" + +static inline float +fastlog2 (float x) +{ + union { float f; uint32_t i; } vx = { x }; + union { uint32_t i; float f; } mx = { (vx.i & 0x007FFFFF) | 0x3f000000 }; + float y = vx.i; + y *= 1.1920928955078125e-7f; + + return y - 124.22551499f + - 1.498030302f * mx.f + - 1.72587999f / (0.3520887068f + mx.f); +} + +static inline float +fastlog (float x) +{ + return 0.69314718f * fastlog2 (x); +} + +static inline float +fasterlog2 (float x) +{ + union { float f; uint32_t i; } vx = { x }; + float y = vx.i; + y *= 1.1920928955078125e-7f; + return y - 126.94269504f; +} + +static inline float +fasterlog (float x) +{ +// return 0.69314718f * fasterlog2 (x); + + union { float f; uint32_t i; } vx = { x }; + float y = vx.i; + y *= 8.2629582881927490e-8f; + return y - 87.989971088f; +} + +#ifdef __SSE2__sss + +static inline v4sf +vfastlog2 (v4sf x) +{ + union { v4sf f; v4si i; } vx = { x }; + union { v4si i; v4sf f; } mx; mx.i = (vx.i & v4sil (0x007FFFFF)) | v4sil (0x3f000000); + v4sf y = v4si_to_v4sf (vx.i); + y *= v4sfl (1.1920928955078125e-7f); + + const v4sf c_124_22551499 = v4sfl (124.22551499f); + const v4sf c_1_498030302 = v4sfl (1.498030302f); + const v4sf c_1_725877999 = v4sfl (1.72587999f); + const v4sf c_0_3520087068 = v4sfl (0.3520887068f); + + return y - c_124_22551499 + - c_1_498030302 * mx.f + - c_1_725877999 / (c_0_3520087068 + mx.f); +} + +static inline v4sf +vfastlog (v4sf x) +{ + const v4sf c_0_69314718 = v4sfl (0.69314718f); + + return c_0_69314718 * vfastlog2 (x); +} + +static inline v4sf +vfasterlog2 (v4sf x) +{ + union { v4sf f; v4si i; } vx = { x }; + v4sf y = v4si_to_v4sf (vx.i); + y *= v4sfl (1.1920928955078125e-7f); + + const v4sf c_126_94269504 = v4sfl (126.94269504f); + + return y - c_126_94269504; +} + +static inline v4sf +vfasterlog (v4sf x) +{ +// const v4sf c_0_69314718 = v4sfl (0.69314718f); +// +// return c_0_69314718 * vfasterlog2 (x); + + union { v4sf f; v4si i; } vx = { x }; + v4sf y = v4si_to_v4sf (vx.i); + y *= v4sfl (8.2629582881927490e-8f); + + const v4sf c_87_989971088 = v4sfl (87.989971088f); + + return y - c_87_989971088; +} + +#endif // __SSE2__ + +#endif // __FAST_LOG_H_ diff --git a/src/libtinysoundfont/fastpow.h b/src/libtinysoundfont/fastpow.h new file mode 100644 index 00000000..cd43e507 --- /dev/null +++ b/src/libtinysoundfont/fastpow.h @@ -0,0 +1,82 @@ + +/*=====================================================================* + * Copyright (C) 2011 Paul Mineiro * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with * + * or without modification, are permitted provided that the * + * following conditions are met: * + * * + * * Redistributions of source code must retain the * + * above copyright notice, this list of conditions and * + * the following disclaimer. * + * * + * * 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. * + * * + * * Neither the name of Paul Mineiro nor the names * + * of other contributors may be used to endorse or promote * + * products derived from this software without specific * + * prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * + * CONTRIBUTORS "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 COPYRIGHT OWNER * + * OR CONTRIBUTORS 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. * + * * + * Contact: Paul Mineiro * + *=====================================================================*/ + +#ifndef __FAST_POW_H_ +#define __FAST_POW_H_ + +#include +//#include "sse.h" +#include "fastexp.h" +#include "fastlog.h" + +static inline float +fastpow (float x, + float p) +{ + return fastpow2 (p * fastlog2 (x)); +} + +static inline float +fasterpow (float x, + float p) +{ + return fasterpow2 (p * fasterlog2 (x)); +} + +#ifdef __SSE2__xxx + +static inline v4sf +vfastpow (const v4sf x, + const v4sf p) +{ + return vfastpow2 (p * vfastlog2 (x)); +} + +static inline v4sf +vfasterpow (const v4sf x, + const v4sf p) +{ + return vfasterpow2 (p * vfasterlog2 (x)); +} + +#endif //__SSE2__ + +#endif // __FAST_POW_H_ diff --git a/src/libtinysoundfont/scratch2010.h b/src/libtinysoundfont/scratch2010.h new file mode 100644 index 00000000..d9251863 --- /dev/null +++ b/src/libtinysoundfont/scratch2010.h @@ -0,0 +1,13546 @@ +// Soundfont Header from 'libtinysoundfont/scratch2010.h' +#define TSF_HEADER +#include +static const struct tsf_region preset_0_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_1_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_2_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_3_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_4_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_5_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_6_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_7_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_8_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_9_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_10_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_11_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_12_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_13_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_14_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_15_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_16_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_17_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_18_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_19_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_20_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_21_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_22_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_23_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=58253, .end=64571, .loop_start=62645, .loop_end=64456, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_24_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_25_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_26_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_27_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_28_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_29_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_30_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_31_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_32_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_33_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_34_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_35_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_36_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_37_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_38_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_39_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=22872, .end=29527, .loop_start=29293, .loop_end=29460, + .transpose=24, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=17.999756, .sustain=0.000000, .release=1.200211, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_40_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=143512, .end=153904, .loop_start=147840, .loop_end=151045, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_41_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=143512, .end=153904, .loop_start=147840, .loop_end=151045, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_42_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=143512, .end=153904, .loop_start=147840, .loop_end=151045, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_43_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=143512, .end=153904, .loop_start=147840, .loop_end=151045, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_44_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_45_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=110553, .end=116794, .loop_start=110553, .loop_end=110552, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.400066, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_46_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=46906, .end=52842, .loop_start=52693, .loop_end=52776, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_47_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_48_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_49_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_50_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_51_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_52_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_53_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_54_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_55_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_56_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_57_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_58_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_59_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_60_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_61_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_62_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_63_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_64_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_65_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_66_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_67_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_68_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_69_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_70_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_71_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=37428, .end=38298, .loop_start=38249, .loop_end=38269, + .transpose=-12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_72_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_73_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_74_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_75_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_76_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_77_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_78_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_79_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_80_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_81_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_82_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_83_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_84_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_85_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_86_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_87_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=52873, .end=54494, .loop_start=54396, .loop_end=54437, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_88_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_89_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_90_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_91_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_92_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_93_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_94_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_95_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_96_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_97_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_98_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_99_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_100_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=64602, .end=78229, .loop_start=64728, .loop_end=78181, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_101_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_102_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=29558, .end=37397, .loop_start=29584, .loop_end=37384, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_103_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=121185, .end=140575, .loop_start=130267, .loop_end=138209, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_104_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_105_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_106_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_107_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_108_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_109_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=38329, .end=46875, .loop_start=46803, .loop_end=46844, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=14.996948, .sustain=0.000000, .release=0.500000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_110_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=143512, .end=153904, .loop_start=147840, .loop_end=151045, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_111_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=140606, .end=143481, .loop_start=143363, .loop_end=143446, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_112_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=54525, .end=58222, .loop_start=58148, .loop_end=58189, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=1.500038, .decay=14.996948, .sustain=0.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_113_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=20346, .end=21591, .loop_start=20346, .loop_end=20345, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_114_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=116825, .end=121154, .loop_start=116825, .loop_end=116824, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=1.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_115_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=21622, .end=22841, .loop_start=21622, .loop_end=21621, + .transpose=2, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_116_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_117_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_118_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_119_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.200034, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_120_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_121_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_122_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_123_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_124_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_125_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_126_regions[] PROGMEM = { +{ + .loop_mode=1, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=78260, .end=110522, .loop_start=110319, .loop_end=110486, + .transpose=12, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=21.995850, .sustain=0.000000, .release=0.600105, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_127_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_128_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=153935, .end=154194, .loop_start=153935, .loop_end=153934, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_region preset_129_regions[] PROGMEM = { +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=38, .hikey=38, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=38, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=0, .hikey=36, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=35, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=39, .hikey=39, .lovel=0, .hivel=127, + .group=0, .offset=2876, .end=4283, .loop_start=2876, .loop_end=2875, + .transpose=0, .tune=0, .pitch_keycenter=39, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=42, .hikey=42, .lovel=0, .hivel=127, + .group=0, .offset=4314, .end=4935, .loop_start=4314, .loop_end=4313, + .transpose=0, .tune=0, .pitch_keycenter=42, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=49, .hikey=49, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=49, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=73, .hikey=74, .lovel=0, .hivel=127, + .group=0, .offset=12966, .end=14107, .loop_start=12966, .loop_end=12965, + .transpose=0, .tune=0, .pitch_keycenter=73, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=47, .hikey=48, .lovel=0, .hivel=127, + .group=0, .offset=14138, .end=16555, .loop_start=14138, .loop_end=14137, + .transpose=0, .tune=0, .pitch_keycenter=47, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=45, .hikey=45, .lovel=0, .hivel=127, + .group=0, .offset=16586, .end=19515, .loop_start=16586, .loop_end=16585, + .transpose=0, .tune=0, .pitch_keycenter=45, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=37, .hikey=37, .lovel=0, .hivel=127, + .group=0, .offset=19546, .end=20315, .loop_start=19546, .loop_end=19545, + .transpose=0, .tune=0, .pitch_keycenter=37, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=53, .hikey=53, .lovel=0, .hivel=127, + .group=0, .offset=20346, .end=21591, .loop_start=20346, .loop_end=20345, + .transpose=0, .tune=0, .pitch_keycenter=53, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=76, .hikey=77, .lovel=0, .hivel=127, + .group=0, .offset=21622, .end=22841, .loop_start=21622, .loop_end=21621, + .transpose=0, .tune=0, .pitch_keycenter=76, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=40, .hikey=40, .lovel=0, .hivel=127, + .group=0, .offset=0, .end=1877, .loop_start=0, .loop_end=0, + .transpose=0, .tune=0, .pitch_keycenter=40, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=51, .hikey=52, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=51, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=55, .hikey=55, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=55, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=57, .hikey=57, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=57, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=59, .hikey=59, .lovel=0, .hivel=127, + .group=0, .offset=4966, .end=12935, .loop_start=4966, .loop_end=4965, + .transpose=0, .tune=0, .pitch_keycenter=59, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=60, .hikey=72, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=60, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=80, .hikey=81, .lovel=0, .hivel=127, + .group=0, .offset=20346, .end=21591, .loop_start=20346, .loop_end=20345, + .transpose=0, .tune=0, .pitch_keycenter=80, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=78, .hikey=79, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=78, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=75, .hikey=75, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=75, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=82, .hikey=127, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=82, .pitch_keytrack=0, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=41, .hikey=41, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=41, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=43, .hikey=43, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=43, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=44, .hikey=44, .lovel=0, .hivel=127, + .group=0, .offset=4314, .end=4935, .loop_start=4314, .loop_end=4313, + .transpose=0, .tune=0, .pitch_keycenter=44, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=46, .hikey=46, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=46, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=50, .hikey=50, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=50, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=56, .hikey=56, .lovel=0, .hivel=127, + .group=0, .offset=20346, .end=21591, .loop_start=20346, .loop_end=20345, + .transpose=0, .tune=0, .pitch_keycenter=56, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=54, .hikey=54, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=54, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +{ + .loop_mode=0, + .sample_rate=11025, + .lokey=58, .hikey=58, .lovel=0, .hivel=127, + .group=0, .offset=1908, .end=2845, .loop_start=1908, .loop_end=1907, + .transpose=0, .tune=0, .pitch_keycenter=58, .pitch_keytrack=100, + .attenuation=0.000000, .pan=0.000000, + .attenuationF16P16=0, .panF16P16 = 0, + .ampenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=3.000092, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .modenv={ .delay=0.000000, .attack=0.000000, .hold=0.000000, .decay=0.000000, .sustain=1.000000, .release=0.000000, .keynumToHold=0.000000, .keynumToDecay=0.000000 }, + .initialFilterQ=0, .initialFilterFc=13500, + .modEnvToPitch=0, .modEnvToFilterFc=0, .modLfoToFilterFc=0, .modLfoToVolume=0, + .delayModLFO=0.000000, + .freqModLFO=0, .modLfoToPitch=0, + .delayVibLFO=0.000000, + .freqVibLFO=0, .vibLfoToPitch=0 +} +, +}; +static const struct tsf_preset presets[] PROGMEM = { +{ + .presetName={80,105,97,110,111,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=0, .bank=0, + .regions=preset_0_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=1, .bank=0, + .regions=preset_1_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=2, .bank=0, + .regions=preset_2_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=3, .bank=0, + .regions=preset_3_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=4, .bank=0, + .regions=preset_4_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=5, .bank=0, + .regions=preset_5_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=6, .bank=0, + .regions=preset_6_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=7, .bank=0, + .regions=preset_7_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=8, .bank=0, + .regions=preset_8_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=9, .bank=0, + .regions=preset_9_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=10, .bank=0, + .regions=preset_10_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=11, .bank=0, + .regions=preset_11_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=12, .bank=0, + .regions=preset_12_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=13, .bank=0, + .regions=preset_13_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=14, .bank=0, + .regions=preset_14_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=15, .bank=0, + .regions=preset_15_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=16, .bank=0, + .regions=preset_16_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=17, .bank=0, + .regions=preset_17_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=18, .bank=0, + .regions=preset_18_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=19, .bank=0, + .regions=preset_19_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=20, .bank=0, + .regions=preset_20_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=21, .bank=0, + .regions=preset_21_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=22, .bank=0, + .regions=preset_22_regions, + .regionNum=1 +}, +{ + .presetName={79,114,103,97,110,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=23, .bank=0, + .regions=preset_23_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=24, .bank=0, + .regions=preset_24_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,50,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=25, .bank=0, + .regions=preset_25_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,51,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=26, .bank=0, + .regions=preset_26_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,52,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=27, .bank=0, + .regions=preset_27_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,53,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=28, .bank=0, + .regions=preset_28_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,54,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=29, .bank=0, + .regions=preset_29_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,55,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=30, .bank=0, + .regions=preset_30_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,56,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=31, .bank=0, + .regions=preset_31_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=32, .bank=0, + .regions=preset_32_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=33, .bank=0, + .regions=preset_33_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=34, .bank=0, + .regions=preset_34_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=35, .bank=0, + .regions=preset_35_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=36, .bank=0, + .regions=preset_36_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=37, .bank=0, + .regions=preset_37_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=38, .bank=0, + .regions=preset_38_regions, + .regionNum=1 +}, +{ + .presetName={66,97,115,115,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=39, .bank=0, + .regions=preset_39_regions, + .regionNum=1 +}, +{ + .presetName={86,105,111,108,105,110,32,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=40, .bank=0, + .regions=preset_40_regions, + .regionNum=1 +}, +{ + .presetName={86,105,111,108,105,110,32,50,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=41, .bank=0, + .regions=preset_41_regions, + .regionNum=1 +}, +{ + .presetName={86,105,111,108,105,110,32,51,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=42, .bank=0, + .regions=preset_42_regions, + .regionNum=1 +}, +{ + .presetName={86,105,111,108,105,110,32,52,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=43, .bank=0, + .regions=preset_43_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,49,0,0,0,0,0,0,0,0,0,0,0}, + .preset=44, .bank=0, + .regions=preset_44_regions, + .regionNum=1 +}, +{ + .presetName={80,105,122,122,105,99,97,116,111,32,49,0,0,0,0,0,0,0,0,0}, + .preset=45, .bank=0, + .regions=preset_45_regions, + .regionNum=1 +}, +{ + .presetName={71,117,105,116,97,114,32,57,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=46, .bank=0, + .regions=preset_46_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,57,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=47, .bank=0, + .regions=preset_47_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,49,0,0,0,0,0,0,0,0,0,0,0}, + .preset=48, .bank=0, + .regions=preset_48_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,50,0,0,0,0,0,0,0,0,0,0,0}, + .preset=49, .bank=0, + .regions=preset_49_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,51,0,0,0,0,0,0,0,0,0,0,0}, + .preset=50, .bank=0, + .regions=preset_50_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,52,0,0,0,0,0,0,0,0,0,0,0}, + .preset=51, .bank=0, + .regions=preset_51_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=52, .bank=0, + .regions=preset_52_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=53, .bank=0, + .regions=preset_53_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=54, .bank=0, + .regions=preset_54_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,48,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=55, .bank=0, + .regions=preset_55_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,0,0,0,0,0,0,0,0,0,0,0}, + .preset=56, .bank=0, + .regions=preset_56_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,50,0,0,0,0,0,0,0,0,0,0,0}, + .preset=57, .bank=0, + .regions=preset_57_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,51,0,0,0,0,0,0,0,0,0,0,0}, + .preset=58, .bank=0, + .regions=preset_58_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,52,0,0,0,0,0,0,0,0,0,0,0}, + .preset=59, .bank=0, + .regions=preset_59_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,53,0,0,0,0,0,0,0,0,0,0,0}, + .preset=60, .bank=0, + .regions=preset_60_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,54,0,0,0,0,0,0,0,0,0,0,0}, + .preset=61, .bank=0, + .regions=preset_61_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,55,0,0,0,0,0,0,0,0,0,0,0}, + .preset=62, .bank=0, + .regions=preset_62_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,56,0,0,0,0,0,0,0,0,0,0,0}, + .preset=63, .bank=0, + .regions=preset_63_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,57,0,0,0,0,0,0,0,0,0,0,0}, + .preset=64, .bank=0, + .regions=preset_64_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,48,0,0,0,0,0,0,0,0,0,0}, + .preset=65, .bank=0, + .regions=preset_65_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,49,0,0,0,0,0,0,0,0,0,0}, + .preset=66, .bank=0, + .regions=preset_66_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,50,0,0,0,0,0,0,0,0,0,0}, + .preset=67, .bank=0, + .regions=preset_67_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=68, .bank=0, + .regions=preset_68_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,51,0,0,0,0,0,0,0,0,0,0}, + .preset=69, .bank=0, + .regions=preset_69_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=70, .bank=0, + .regions=preset_70_regions, + .regionNum=1 +}, +{ + .presetName={67,108,97,114,105,110,101,116,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=71, .bank=0, + .regions=preset_71_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=72, .bank=0, + .regions=preset_72_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=73, .bank=0, + .regions=preset_73_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=74, .bank=0, + .regions=preset_74_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=75, .bank=0, + .regions=preset_75_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=76, .bank=0, + .regions=preset_76_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=77, .bank=0, + .regions=preset_77_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,57,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=78, .bank=0, + .regions=preset_78_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,49,48,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=79, .bank=0, + .regions=preset_79_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=80, .bank=0, + .regions=preset_80_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=81, .bank=0, + .regions=preset_81_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=82, .bank=0, + .regions=preset_82_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=83, .bank=0, + .regions=preset_83_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=84, .bank=0, + .regions=preset_84_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=85, .bank=0, + .regions=preset_85_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=86, .bank=0, + .regions=preset_86_regions, + .regionNum=1 +}, +{ + .presetName={76,101,97,100,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=87, .bank=0, + .regions=preset_87_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,49,0,0,0,0,0,0,0}, + .preset=88, .bank=0, + .regions=preset_88_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,50,0,0,0,0,0,0,0}, + .preset=89, .bank=0, + .regions=preset_89_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,51,0,0,0,0,0,0,0}, + .preset=90, .bank=0, + .regions=preset_90_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,53,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=91, .bank=0, + .regions=preset_91_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,57,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=92, .bank=0, + .regions=preset_92_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,52,0,0,0,0,0,0,0}, + .preset=93, .bank=0, + .regions=preset_93_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,54,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=94, .bank=0, + .regions=preset_94_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,53,0,0,0,0,0,0,0,0,0,0,0}, + .preset=95, .bank=0, + .regions=preset_95_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,53,0,0,0,0,0,0,0}, + .preset=96, .bank=0, + .regions=preset_96_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,54,0,0,0,0,0,0,0}, + .preset=97, .bank=0, + .regions=preset_97_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,55,0,0,0,0,0,0,0}, + .preset=98, .bank=0, + .regions=preset_98_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,56,0,0,0,0,0,0,0}, + .preset=99, .bank=0, + .regions=preset_99_regions, + .regionNum=1 +}, +{ + .presetName={83,112,101,99,105,97,108,32,80,97,100,32,57,0,0,0,0,0,0,0}, + .preset=100, .bank=0, + .regions=preset_100_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,55,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=101, .bank=0, + .regions=preset_101_regions, + .regionNum=1 +}, +{ + .presetName={67,104,111,105,114,32,56,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=102, .bank=0, + .regions=preset_102_regions, + .regionNum=1 +}, +{ + .presetName={83,116,114,105,110,103,115,32,54,0,0,0,0,0,0,0,0,0,0,0}, + .preset=103, .bank=0, + .regions=preset_103_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=104, .bank=0, + .regions=preset_104_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,50,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=105, .bank=0, + .regions=preset_105_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,51,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=106, .bank=0, + .regions=preset_106_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,52,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=107, .bank=0, + .regions=preset_107_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,49,48,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=108, .bank=0, + .regions=preset_108_regions, + .regionNum=1 +}, +{ + .presetName={70,108,117,116,101,32,49,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=109, .bank=0, + .regions=preset_109_regions, + .regionNum=1 +}, +{ + .presetName={86,105,111,108,105,110,32,53,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=110, .bank=0, + .regions=preset_110_regions, + .regionNum=1 +}, +{ + .presetName={84,114,117,109,112,101,116,32,49,52,0,0,0,0,0,0,0,0,0,0}, + .preset=111, .bank=0, + .regions=preset_111_regions, + .regionNum=1 +}, +{ + .presetName={66,101,108,108,115,32,49,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=112, .bank=0, + .regions=preset_112_regions, + .regionNum=1 +}, +{ + .presetName={65,103,111,103,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=113, .bank=0, + .regions=preset_113_regions, + .regionNum=1 +}, +{ + .presetName={83,116,101,101,108,32,68,114,117,109,115,0,0,0,0,0,0,0,0,0}, + .preset=114, .bank=0, + .regions=preset_114_regions, + .regionNum=1 +}, +{ + .presetName={87,111,111,100,98,108,111,99,107,0,0,0,0,0,0,0,0,0,0,0}, + .preset=115, .bank=0, + .regions=preset_115_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,32,83,121,110,116,104,32,49,0,0,0,0,0,0,0,0}, + .preset=116, .bank=0, + .regions=preset_116_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,32,83,121,110,116,104,32,50,0,0,0,0,0,0,0,0}, + .preset=117, .bank=0, + .regions=preset_117_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,32,83,121,110,116,104,32,51,0,0,0,0,0,0,0,0}, + .preset=118, .bank=0, + .regions=preset_118_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,32,82,105,100,101,32,49,0,0,0,0,0,0,0,0,0}, + .preset=119, .bank=0, + .regions=preset_119_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,53,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=120, .bank=0, + .regions=preset_120_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,54,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=121, .bank=0, + .regions=preset_121_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,55,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=122, .bank=0, + .regions=preset_122_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,56,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=123, .bank=0, + .regions=preset_123_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,49,57,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=124, .bank=0, + .regions=preset_124_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,50,48,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=125, .bank=0, + .regions=preset_125_regions, + .regionNum=1 +}, +{ + .presetName={80,105,97,110,111,32,50,49,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=126, .bank=0, + .regions=preset_126_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,32,83,121,110,116,104,32,83,80,0,0,0,0,0,0,0}, + .preset=127, .bank=0, + .regions=preset_127_regions, + .regionNum=1 +}, +{ + .presetName={80,111,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=127, .bank=127, + .regions=preset_128_regions, + .regionNum=1 +}, +{ + .presetName={68,114,117,109,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + .preset=0, .bank=128, + .regions=preset_129_regions, + .regionNum=29 +}, +}; +static const short shortSamples[154225] PROGMEM = { +256, -513, 514, -2306, -12542, -21762, -25855, -30208, -29440, -32768, -11518, 7678, -7935, 4096, 14591, +19458, 25598, 28673, 29439, 23810, 25085, 30211, 31229, 22531, 20734, -2559, -13314, -11006, -15104, -11009, -24831, +-26113, -31744, -28158, -26370, -24832, -22014, -13315, -20221, -16898, -13567, -14593, -16894, -6658, -13823, -12544, -768, +-7680, -768, 5632, 5888, 8704, 8448, 11008, 10496, 18175, 22786, 21758, 22530, 18431, 14591, 13057, 16128, +12032, 13568, 15104, 5119, 10754, 10494, 5122, 14333, 9220, -1796, -7420, -12035, -1790, -2050, -254, -515, +-7164, -4099, -8191, -7680, -8449, -7679, -5120, -7681, -12030, -16131, -17405, -14595, -17661, -13826, -17407, -13313, +-16128, -18431, -11010, -9725, -5379, -254, 5120, 8190, 7938, 15615, 15105, 14848, 15871, 12288, 15361, 16127, +12801, 17919, 16897, 17407, 17921, 20479, 19457, 16383, 12034, 10494, 6145, 768, -2817, -2303, -1280, -7937, +-12542, -12546, -8191, -5377, -7423, -1280, -4609, -7679, -8705, -3838, -6403, -7421, -7171, -10238, -7168, -4866, +-7933, -10499, -5629, -5635, -4606, -4609, -6400, -3583, -8705, -12288, -4863, -4097, -4608, -5631, -3586, -1021, +4605, 7682, 12543, 15361, 16638, 20994, 22782, 20738, 21247, 24064, 20225, 14334, 13058, 7167, 6400, 1281, +-1281, -1792, -1279, -1537, -5632, -1791, -8706, -10493, -11523, -16382, -7937, -11520, -7935, -11777, -13312, -11263, +-10242, -9470, -7170, -8445, -6147, -8702, -7682, -5887, -7935, -7682, -6653, -9220, -11260, -4867, -7678, -8705, +-7424, -7168, -3327, 2558, 6914, 8958, 7426, 8447, 9728, 17664, 15104, 13824, 18176, 9984, 11777, 12030, +12290, 11518, 11266, 8958, 6914, 6398, 2050, 1278, 4098, 509, 1028, 764, -4093, -8193, -12289, -14334, +-16898, -14846, -14849, -15359, -14083, -14076, -12548, -8700, -12035, -7935, -7424, -8704, -6657, -9470, -8194, -7166, +-6914, -6911, -7424, -6144, -5888, -3328, -1280, 1792, 4097, 1791, 8449, 7679, 7680, 7169, 4608, 7424, +11263, 8961, 12798, 14852, 13051, 7941, 7932, 5890, 7424, 2815, 5633, 2816, -2048, 1023, -4094, -3332, +-4603, -2563, 512, -3326, -4612, -5371, -5636, -8702, -7169, -4607, -9985, -8703, -6657, -6912, -11518, -13570, +-8192, -8447, -8961, -2046, -10499, -11005, -5891, -8445, -5122, -5887, -4097, -5631, -4864, -4353, -1534, 3581, +-253, 3582, 8194, 7422, 9474, 8446, 10754, 9214, 8450, 8447, 7936, 7169, 5886, 7682, 4351, 3328, +8961, 10750, 9474, 7934, 7938, 2303, -1024, 4352, 2304, -2304, -2303, -4354, -7677, -7171, -6909, -5891, +-7166, -7681, -9984, -12287, -9473, -10495, -4865, -8959, -8962, -6909, -8194, -7935, -7169, -6399, -6401, -6655, +-3585, -3328, -1535, -2561, -2560, 3841, 1791, 9473, 6911, 5632, 7681, 13823, 9473, 11007, 10753, 12031, +12288, 12545, 11007, 4097, 8191, 0, 2305, 3071, 1, 4863, 5377, -3330, -5117, -259, -6910, 2048, +-4354, -2813, -3332, -6908, -4099, -5117, -3076, -1532, 2301, -1789, -2563, 1282, -3585, -1023, 1535, -3583, +-4098, -8189, -6147, -7167, -4094, -6916, -6651, -1541, -4349, 512, 3327, -767, -257, 5120, 2049, 12287, +4097, 13055, 5633, 3583, 8448, 6145, 6142, 6659, 1277, 4611, -3, -3837, 2045, 2306, 4096, 5886, +3075, 7934, 3585, 4864, 2303, 4353, 6144, 7168, 256, 1, 765, 3844, -4612, 260, -3843, -255, +-3840, -5888, 255, -7679, -6400, -5121, -9471, -2304, -6658, -7164, -9988, -6143, -6142, -2819, 1795, -514, +3072, 1537, -3585, 513, 2303, 8449, 7167, 1537, 8704, 4095, 4354, 9213, 9220, 10236, 4100, 6908, +-2045, 5118, 10497, -3840, 4863, 6913, 4352, 9215, 4865, 1023, -2815, -2817, -7680, -1023, 1791, -2558, +-1539, -1534, -2, 2307, 7421, -3325, 4861, -6909, -5380, -5372, -2563, -8957, -258, -4609, -9469, -3, +-7421, -2051, -6911, 257, -1025, 2049, 510, 4098, 2815, 2561, 1279, 6657, 8958, 5890, 3327, 11264, +4097, 5629, 7940, 2556, 3588, 509, -255, -1792, -512, 1537, -1793, -4096, -6656, 1279, -1021, -4611, +3586, -1025, -3073, 4098, 2815, -255, -3842, 6147, 2300, 5125, 3067, 6660, 5373, 5633, -2814, 5372, +-3580, -5379, -5119, -3583, -10242, -9214, -2049, -4863, 511, -3327, -2049, -4607, -3585, -3582, -770, -2814, +-2050, 4097, 4352, 0, 4352, 2048, 2560, 3328, 5632, 2048, 7424, 4352, 512, -256, 0, 4865, +3582, 3330, -2305, 5377, 1023, 2305, 4095, -254, 1277, 1027, 1790, 1281, 1024, -6145, -1535, -1536, +-7425, -1535, -3329, -766, -3587, -3324, -2308, -1789, 1278, -511, -512, -4352, -5376, -6144, -4353, -7166, +-2306, -3838, -5378, -6654, -6146, -254, 3839, 3583, 4611, 765, 5122, 6143, 768, 3073, 1791, 3329, +7678, 7427, 9469, 1539, 8701, 5379, 5373, -3069, 3581, 2, -2048, -4609, -2303, -1, -1535, -1281, +258, -5378, -2559, -8448, 1280, -4608, -3840, -2816, -3072, -257, 2, -5379, -5885, -1794, -4864, -5118, +-7427, 1539, -1283, -509, -4866, -1535, -768, -1793, 1, -1024, -768, -2048, -769, 769, 4096, 3840, +4353, 3325, -2300, 1533, 3330, 1279, 2560, 7425, 1023, 4865, -1281, -1792, 3841, 511, -2048, 2562, +1532, -251, -5, 1540, 1790, -512, -1534, -2819, 514, -5120, -7425, -1790, -6402, -4096, 2050, -3586, +1025, -1024, -4609, 770, -1, -6657, -2046, -3843, -1789, -4865, -4352, 1024, -4864, 511, -2814, -258, +-4607, -2559, -4354, 3330, -3074, 2049, -1535, 1534, 2049, -2816, 2047, 2305, 1280, 6655, 2818, 5630, +4865, 5376, 767, 2562, 511, 5632, 3073, 766, 1537, 256, 2305, 1535, 4096, -2560, 2048, -5376, +-2560, -3584, -4097, -4094, -769, -5634, -4603, -4103, -2808, -5127, -5627, -4099, -5375, -5631, -5890, -3325, +-4867, -5374, -1794, -254, -257, -2303, 3327, -2048, 4353, -1794, 2563, 5629, -510, 2047, 4864, 2561, +767, 4353, 2814, 2562, 3327, 2305, 6143, 2304, 512, 1792, 1792, 513, -258, 514, 2046, 2562, +-514, -1278, 1534, -2046, -2050, -4349, -4868, -2044, -4867, -6911, -2303, -3586, -4606, 255, -6401, -3069, +-4612, -4348, 765, -4862, -1793, -256, 2561, -514, -1789, 3581, -2814, -513, 2816, 1025, -1025, 1, +255, 2305, 4863, -255, 3072, 255, 2817, 3327, 1537, 2048, -257, 3328, 2560, 257, 3840, 3583, +769, -1282, -1533, -258, 257, -1537, -511, -257, -2303, -769, -3071, -2305, -4095, -2049, -2559, -5121, +-3583, 255, -1790, -4099, -1790, -4608, -2050, 516, -773, 516, 1022, -2560, -2047, -2, 771, -260, +1284, -771, -1279, 257, -258, -2303, 4353, 1021, -764, 3068, 1539, 2302, 2049, 3072, 2303, 514, +1277, 259, 766, 2305, 768, 1792, -257, -255, 1279, 1281, -1536, -770, -1788, 1787, -1788, 1022, +0, -2047, -2816, -4865, -2303, -5121, -6400, -1278, -7426, -3838, -259, -3581, -3075, -3580, -5381, -4602, +-774, -2043, -1796, 2306, -3329, -1535, -1, 2050, 764, 3333, 4603, -764, 3582, 6400, 2305, 2815, +2561, 2047, 3585, -257, 257, 2559, -511, -1, -2559, -1280, -769, -1278, -3331, -3837, -3586, -3582, +-5634, -1535, -2816, -2304, -2560, -3073, -3327, 1792, -768, -1793, -510, 509, -508, 764, 2051, 511, +-257, 1538, 255, -1793, -509, -2308, -509, -3073, 1024, -1281, 771, 1788, 4, 252, -252, -1028, +772, 1021, 1793, 1792, 1024, 3072, 5376, 2815, 2561, 3328, 2048, 2559, 2049, 1022, 1284, 2300, +-510, 2815, 3584, -2302, -1027, 771, -772, -764, -515, -2045, 253, 514, 1791, 4609, 2559, 1280, +1, 1535, 770, 1533, -1278, 511, -768, -510, -3, 1026, 767, 0, -767, -256, -1538, 515, +-3075, 1283, -2, 1024, 2305, 766, -765, 2813, 3074, 4862, 1281, 2816, 1791, 2562, 1789, 2307, +3069, 3587, 3837, 3844, 4860, 1283, 1535, 4095, 2051, 2813, 2819, 1789, 514, 766, 1027, -515, +-1278, 1279, 768, 768, 1281, -2, 1026, -2305, 1792, -768, -3583, -3843, 517, -774, -1530, -517, +-1533, -1537, -2049, -2301, -772, 4, -1796, 772, 1021, 1282, 2559, 3072, 2561, -513, 3841, 2047, +3841, 4351, 2816, 3585, -1026, 3843, 1788, 2308, 1788, 516, 2812, 1539, 766, 1025, 512, 256, +-512, -1280, -1025, 1538, -1026, -1278, -1282, -510, -1538, -1277, 1788, 260, -1284, -1788, -2307, -1789, +-771, -510, -2561, -2560, 1, -2049, -767, -769, -1280, -1023, -769, -767, 768, 255, 257, 3071, +1281, 1280, 2303, -254, 1276, 4, -3, 1794, 512, -2, 770, 1279, 256, -255, -1026, -510, +-2305, 513, -1026, 3, 252, -763, -2053, 2819, 0, -769, -1279, -2049, -1536, -1023, 255, -2047, +1024, -1, -1534, -259, -1021, -1025, -1536, -1280, -1536, -2304, -1791, -1282, -1790, -3330, -1789, -1539, +-1022, -1537, 0, -1022, 253, 1795, 253, 770, -257, -1279, -513, 256, -768, -767, -258, 1027, +1020, 260, 253, 1026, 255, -768, 1, -2, -765, -1028, 4, -1794, -2048, -1278, -2307, -1790, +-1025, -512, -1279, -2049, -2047, 1022, 1026, -514, -254, -1026, -1534, -2305, -2304, -2048, -2816, -1280, +-1280, -1791, -259, -507, -774, -762, -1030, -250, -518, -762, -773, -254, -768, -257, 514, 510, +769, 767, 1281, 0, -769, 513, -512, -257, 2, -1283, -1788, -516, -2301, -1538, -511, -1792, +0, -1281, 2, -770, -511, -1537, -510, -514, -1279, -1280, -1281, -1022, -1026, -255, -1281, -1023, +-512, -512, -1792, -1537, -511, -1, 257, 768, -768, -1, -254, -3, 258, -1280, -1281, -255, +-256, 510, -766, -769, -255, -1025, -512, -256, -256, -1023, -1025, -768, -1280, -1023, 254, -1022, +-2, 514, 255, -256, 512, -768, -255, -513, -255, -1, 0, -1022, -514, 257, -512, 255, +-510, -257, -1025, 2, -515, 3, -2, -254, -258, -768, -1535, -1026, -765, -1283, -1533, -515, +-766, -1025, -257, -509, -515, -1022, -513, -1, 2, 254, -254, -514, -511, 0, 0, 0, +256, -1, -254, 254, 770, -2, 514, -2, 514, -514, 514, -514, -766, 253, 4, -3, +1, -256, -513, 1, -511, -515, -1021, -1026, -511, -1024, -257, -767, -1, -767, 256, 512, +-514, 772, -4, -253, 255, 255, 2, 510, 2, -514, 2, -1, -512, -512, -256, -512, +-511, -1, -255, -2, 2, -257, -511, -256, -2, 259, -259, 259, -258, 0, 257, -257, +769, 768, -769, 1, -1, 1, 255, 1, -513, 1, -1, -511, -1, -255, -256, -2, +3, 509, 259, 253, -254, -257, 0, 1, 254, 2, 255, 0, 1, -2, 3, -3, +-253, -259, 3, -258, -255, -768, -768, -1, -254, -770, 1, -256, 0, -1, -254, 254, +0, -510, -258, 257, 256, 767, 257, 768, 511, 257, 256, 511, 769, 0, 255, -254, +253, 259, 254, 1, -513, -767, -257, -255, -257, -256, -511, -257, -511, -2, -254, -1, +-255, -1, -256, 257, 254, -254, 0, -2, -252, -5, 3, 0, 254, 259, -3, 259, +-4, 4, -3, 3, 253, 2, 254, -253, -3, 3, -3, 2, 256, 511, 1, -1, +1, 255, -254, -3, 259, -259, 3, -2, -256, -255, -257, -256, 2, -4, 5, -260, +-254, -257, 0, 1, -1, 1, -1, 0, 257, 255, 0, -256, 256, 256, 1, -2, +2, 254, 1, 1, -1, 0, 0, -256, 0, 1, -1, 0, -256, -256, -1, -253, +-4, -251, -5, 3, -257, -1, 3, 253, 1, 257, -2, 2, -257, 0, 256, 0, +0, 0, -255, -2, -254, -258, 2, -2, 2, -258, 2, -514, -254, -2, 2, -2, +2, -2, -255, 1, -2, 2, -258, 257, 0, 0, -1, 2, -2, 1, 0, -1, +1, -1, -255, 0, -1, 1, -2, -253, -259, -253, -3, 3, -3, -253, -3, 3, +-3, 3, -2, 2, -3, 3, -2, 1, 1, -3, 4, -260, 3, -2, 2, -258, +-255, -256, -257, -254, -258, -255, -256, 0, -256, -257, 2, -3, 4, -260, 2, 0, +-1, 1, -1, 0, -254, -3, 2, -1, 0, -254, -2, -255, -2, 3, -259, 3, +-259, -254, -257, 1, -258, -253, -4, 5, -5, 5, -260, -253, -3, 3, -2, 1, +-256, -1, 1, 0, -1, -254, -3, 4, -4, 4, -3, -255, -255, -257, -256, -255, +-258, 2, -1, 0, -256, -256, -256, 0, -256, 0, 0, 1, -2, 2, -2, -254, +-256, -2, 2, -2, -254, -2, -254, -2, 1, 1, -258, -255, -256, 0, -256, 1, +-258, 2, -2, 2, -2, -254, -1, 0, 0, 0, -256, 0, -255, -258, -254, -257, +-256, -255, -258, -255, -255, -258, -253, -260, -253, -258, -254, -258, -254, -2, -254, -258, +2, -3, 4, -3, 1, 0, -1, 1, 0, -1, 1, -2, 4, -261, 5, -4, +2, -256, -257, -255, -1, 1, -257, 2, -259, 3, -3, -253, -1, -1, -255, -1, +2, -2, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1025, -1021, -1029, -1275, -1541, -2043, -3076, -3324, -4102, -5625, +-7175, -7673, -8198, -9212, -10499, -10493, -12034, -12287, -13313, -13823, -15361, -14846, -14082, -15871, -16896, -17409, +-19455, -16896, -15872, -16385, -16894, -17666, -13567, -19455, -13058, -16127, -15871, -8961, -16127, -12033, -9728, -8193, +-5117, -6403, -4349, -4099, 769, -2048, 768, 2048, 2304, 4864, 4096, 10495, 9730, 7421, 9988, 9724, +14083, 12541, 12291, 14078, 19457, 22784, 23551, 20993, 21247, 22786, 25598, 26370, 26621, 25091, 23549, 26884, +25852, 26371, 25342, 25857, 25600, 25088, 24064, 24576, 24320, 24576, 24065, 23551, 22273, 22015, 21760, 21248, +21761, 20479, 18945, 18687, 18432, 17153, 17407, 16385, 15870, 14851, 14333, 14339, 13822, 12032, 11265, 11775, +11009, 10240, 9215, 9473, 8703, 7681, 7935, 8449, 6910, 6402, 6399, 6656, 5121, 4606, 3585, 769, +2302, 1282, -1, 1536, -2816, -2559, -4610, -6909, -4100, -7164, -9987, -8702, -11777, -10752, -12032, -12543, +-14594, -13822, -14593, -16639, -15873, -16895, -15873, -18176, -17662, -17667, -18940, -18948, -19965, -19458, -20224, -19966, +-20738, -20478, -20738, -21247, -21761, -21758, -22018, -22015, -22272, -22785, -22782, -22275, -23036, -23301, -23291, -23556, +-24061, -24066, -24064, -24062, -24323, -24317, -24322, -24064, -24062, -23811, -23805, -23810, -23295, -22528, -22785, -22527, +-22272, -21760, -21505, -20991, -20737, -19966, -19458, -18943, -18945, -17919, -16896, -16640, -16128, -15360, -14336, -12288, +-11775, -11522, -9726, -10498, -8702, -7681, -7936, -6656, -5888, -6656, -5376, -4095, -3074, -1533, -1795, -1278, +-513, 1, 511, 1281, 1535, 2816, 3329, 3071, 3584, 3841, 4863, 5376, 5121, 5631, 6145, 6400, +6142, 6659, 6398, 6657, 7167, 7425, 7679, 7937, 7935, 8192, 7681, 8446, 8451, 8444, 8708, 8957, +8961, 8450, 8700, 8964, 8701, 8706, 9215, 9473, 8959, 8448, 8961, 8702, 9731, 9468, 9221, 8699, +8964, 8701, 8194, 8703, 9984, 9729, 9471, 9473, 8959, 9473, 9214, 9987, 10238, 9728, 9218, 9981, +10242, 10240, 11006, 10755, 10749, 10755, 10493, 10499, 10749, 10242, 10496, 10495, 10498, 10237, 10498, 10240, +10495, 10497, 10239, 10496, 10497, 10239, 10497, 10239, 10240, 10240, 9984, 9729, 9471, 9216, 9217, 9469, +9220, 8956, 8452, 8701, 8450, 8702, 7681, 7937, 8190, 7682, 6911, 7168, 7425, 7678, 7170, 6399, +6400, 7168, 6913, 6142, 5891, 5884, 6147, 6399, 5888, 5120, 4608, 4864, 5120, 4608, 5119, 4866, +4093, 4100, 4604, 4099, 4094, 4096, 3841, 3328, 3583, 3586, 3069, 2819, 2558, 2305, 2048, 1792, +1536, 1792, 1791, 1794, 1278, 1026, 1534, 1025, 256, 0, 512, 255, 2, -259, -508, -772, +-1021, -1281, -1280, -1024, -1280, -1536, -1535, -1537, -1791, -1793, -2047, -2049, -2816, -3070, -2819, -3068, +-3589, -3579, -4101, -4347, -4100, -4349, -4354, -4863, -5120, -5120, -5632, -5632, -5632, -5631, -6146, -6141, +-6147, -6398, -6145, -5888, -6400, -6655, -6914, -6910, -6658, -7167, -6911, -6915, -7164, -7428, -7165, -7425, +-7424, -7424, -7680, -7936, -7680, -7680, -8191, -8194, -8189, -7940, -7932, -7940, -7932, -7939, -7677, -7939, +-8190, -7681, -7935, -8193, -7935, -7937, -7935, -7680, -7937, -8191, -8449, -8447, -8448, -8449, -8190, -8195, +-8188, -8196, -7933, -7938, -7679, -7936, -7937, -7934, -7683, -7166, -7169, -6911, -6912, -6913, -6399, -6145, +-6142, -5890, -5375, -5120, -4865, -4606, -4354, -4351, -4096, -3584, -3329, -3070, -2562, -2302, -2306, -1791, +-1536, -1024, -1024, -512, -257, 1, 1, -2, 513, 768, 1023, 1026, 1534, 1537, 1791, 2050, +2302, 2561, 2304, 2559, 2817, 2816, 2815, 3074, 3326, 3328, 3330, 3581, 3587, 3837, 3842, 4096, +4095, 4097, 4095, 4352, 4610, 4606, 4865, 4864, 5119, 5122, 5119, 5376, 5376, 5376, 5376, 5633, +5887, 5888, 6145, 6142, 6147, 6141, 6659, 6397, 6914, 7167, 7424, 7169, 7167, 7424, 7680, 7680, +7680, 7680, 7936, 8448, 8448, 8704, 8447, 8450, 8702, 8707, 8700, 9219, 9215, 8959, 9219, 9213, +9474, 9471, 9472, 9472, 9472, 9473, 9471, 9473, 9471, 9472, 9473, 9215, 8961, 8959, 8961, 8958, +8451, 8189, 8194, 7935, 7936, 7680, 7680, 7424, 7168, 7168, 6912, 6912, 6400, 6399, 6402, 5886, +5889, 5632, 5374, 5124, 4860, 4611, 4350, 3840, 3585, 3327, 3074, 3069, 2563, 2557, 2307, 2045, +1795, 1533, 1283, 1278, 1024, 769, 511, 513, 256, 255, 1, -1, -254, -259, -508, -517, +-763, -771, -1279, -1281, -1278, -1539, -1532, -1796, -1789, -2051, -2300, -2309, -2299, -2821, -2556, -2818, +-2815, -3073, -3072, -3584, -3583, -3585, -3839, -4097, -4096, -4351, -4353, -4608, -4351, -4610, -4605, -4611, +-4862, -4866, -4862, -4866, -4862, -4865, -4864, -4864, -4864, -4863, -4865, -4863, -4866, -4606, -4865, -4608, +-4606, -4869, -4602, -4613, -4349, -4608, -4354, -4350, -4354, -4094, -4097, -4096, -4095, -3842, -3838, -3329, +-3328, -3327, -3073, -3071, -2817, -3071, -2816, -2560, -2560, -2305, -2302, -2306, -2302, -2050, -2046, -1794, +-1790, -1538, -1535, -1279, -1282, -1278, -1282, -1279, -1023, -1026, -1022, -770, -766, -770, -510, -514, +-510, -513, -513, -510, -258, -254, -257, -256, -257, -254, -259, -252, -260, -253, -259, -253, +-259, -253, -258, -255, -256, -1, -254, -259, 3, -2, 1, 0, -1, 1, -1, 1, +-1, 1, -1, 1, -2, 3, -2, 0, 1, -2, 3, -2, 1, -2, 2, 256, +255, 257, 255, 256, 257, 255, 256, 257, 511, 257, 511, 512, 513, 510, 514, 511, +513, 511, 512, 512, 513, 511, 513, 766, 771, 766, 769, 767, 769, 767, 769, 767, +768, 769, 767, 769, 767, 768, 769, 766, 772, 764, 771, 766, 769, 767, 770, 766, +770, 766, 769, 767, 770, 767, 767, 770, 765, 772, 765, 770, 766, 770, 766, 770, +510, 514, 510, 513, 512, 512, 511, 514, 509, 516, 509, 513, 512, 256, 512, 256, +256, 256, 256, 256, 256, 256, 255, 258, 253, 260, 252, 258, 256, 255, 258, 254, +1, -1, 2, -2, 1, 0, 0, 0, 0, 0, -1, 2, -1, 0, 0, 0, +-1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, -2, 2, -2, 2, -1, +-1, 1, 0, 0, 0, 0, 0, -1, 2, -2, 2, -1, 0, -1, 3, -4, +4, -4, 3, -2, 2, -2, 2, -3, 3, -2, 1, 0, -1, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1023, -514, -1022, +-514, -1278, 255, 2048, -3584, -12799, -7170, 6402, 6399, -4097, 7939, 765, 6146, -769, -20480, -7679, +9983, 8193, -4098, -5117, -7171, -5373, 6141, 2818, -6402, -510, 5118, 17923, 4093, -5374, -8706, -22014, +-7170, 5123, -515, 7939, 5628, 3076, -772, 261, 2043, -3068, -3588, -2300, -1284, -7932, -3, 3074, +-1794, 3073, 5376, 5376, -768, -3584, -2304, -9728, -3584, 1, -3074, 771, 1788, 3588, 1534, 1792, +-1792, 1280, -512, -4607, -2, -255, -2816, 512, -1280, 256, 3071, -254, -1538, 1, -3329, -2047, +-3584, -4865, 770, 509, 4867, 254, 257, 256, 1280, 256, -1536, 0, -2560, -1280, 512, -2304, +-2304, 257, -258, 1282, -770, -510, -1025, -2304, 513, -1283, -1532, -2052, -765, 1279, 1023, 1794, +-514, -768, -1790, -1282, -2046, -1282, 1, 1280, -1, 258, -1026, 1025, -1024, -1025, -4350, -10754, +-9214, -8962, 24578, 5119, 12800, 6657, -13058, -3582, -13826, -4861, 1789, 12034, 9726, 5634, 7679, -11008, +-15359, -10497, -3071, 7423, 7169, -7426, 3588, 7675, 1029, 3580, 6914, -2561, -1535, -11009, -17920, -15359, +2815, -767, 10239, 17664, 4865, 2303, 4865, -1, -5632, -12287, -20993, -6655, 7935, 9472, -2559, -770, +8451, 4605, 4866, 2304, -11778, -5885, -2820, -2555, -2565, 1029, 2044, 6146, 255, -12544, -2815, 256, +767, 2304, 257, -3330, -3581, -1795, 2306, 3071, 1024, -512, -1536, -8959, -2562, 3, -3588, 2308, +-259, 514, -2049, 0, 2817, 767, -3328, -511, -6658, -6141, -1539, 770, 512, 3071, 2561, -1537, +-3071, -3329, -4607, -4097, -5632, -4350, 253, 1794, 2559, 2560, 2048, -2559, -3585, -2048, 513, -3074, +-4351, -3071, -1795, -508, -4, -509, -1282, -1535, -768, -2305, -2302, -1794, -1535, -768, -1793, -2814, +-1538, -1790, -2563, -2045, -771, -1277, -514, -1023, 511, -2048, -1280, -2303, 255, -1791, -2817, -12544, +-10751, 13311, -511, 16895, 3841, 7168, -9218, -2557, -11523, -14333, -12803, -8445, 12540, 18181, 7931, -9979, +-9988, -1022, -1280, -5122, -16637, 6653, 7683, -14595, 13826, 6143, 9216, 2049, -10498, -15358, -5889, 3840, +6145, -13058, -7677, 1533, 3330, -1537, 2304, 2562, -8451, 514, -11776, -1794, 14339, 1021, -2046, 4352, +4863, -2304, -3584, -4863, -9985, -3326, -7428, -9211, -260, 4098, 10495, 5889, -3841, 2305, -3841, -6400, +-6911, -4097, 1792, 1792, 6145, 2559, 2048, -1279, -1, -5376, -3327, -1026, -3325, -6403, -1278, -1, +-1024, 2048, -1279, -1538, -1789, -516, 1540, 1021, -2814, -2817, 3327, 2563, 1277, -5118, -17665, -1, +-3069, 20989, 6402, 1790, 258, -13058, -14078, 9982, 23041, -13568, -23040, -4096, 1536, 7167, -1790, 8702, +25090, 1535, -5121, 4355, 1532, -8700, -28676, -27900, -20739, -1790, 9215, 24064, 30976, 14080, -3071, 1279, +-7935, -14337, -2560, 3073, -15617, -6143, 3840, 18431, 2305, -4865, 1538, 3837, -11004, -23557, -5116, 15614, +21505, 7424, -512, -26113, -28927, -9216, 10751, 20483, 15612, 14596, -3588, -1276, 4092, -12541, 3327, -8192, +-8192, -6145, -3070, -1026, -5117, -7941, -3579, 2044, 19971, 511, 12542, 19460, -4613, -8955, -14852, -7677, +-2, -13567, -6145, -9470, 3069, 24067, 15614, 6912, 5122, 765, -24573, -14083, -1789, -2818, -2303, 3839, +8449, 3328, 6655, 14337, -3329, -9471, 3584, -6145, -511, -2817, -20991, -13824, 15871, 10753, 5376, 4351, +4610, 1021, -12029, -11010, -11263, -2816, -12289, 9218, 18173, 16387, 15870, 9217, -20480, -21505, -8958, -5378, +-3583, -512, 5120, 13313, 3326, 8194, 11774, -4606, -2561, -9216, 3840, 9472, -3328, -17920, -26367, -12802, +-509, 12541, -510, 16896, 9215, 10753, 7936, -257, 3585, -4352, -8193, -23294, -19203, -5629, 1277, 17667, +32254, 15872, -255, -12545, -24575, -5377, -18687, -9730, 5123, 4094, 17921, 17920, 9471, -10240, -10494, -2563, +-7677, -4098, 4352, -1023, 1278, -6653, 9468, -2300, -12804, -9980, 13308, 19204, 4603, -4091, 11772, -9725, +-3842, -14335, 511, -10750, -6915, 1284, -261, 6149, -3587, 10241, 5121, -1283, -252, 3068, 5892, -5891, +3586, -10498, -9470, -4098, 1537, -2815, 5118, 770, 509, 515, -6146, -9982, -771, 8707, 19198, 10753, +-2816, -7681, -10239, -13056, -13569, -4094, 8190, 9986, 9470, 5889, -9472, -4865, -2302, 2302, 6146, -1282, +-511, -7424, 2303, 5379, -11779, -9471, -2815, 765, 517, 2299, 4100, -3843, 769, 5889, 1791, -1279, +2558, 7426, -4097, -16128, -7679, 2301, 10243, 5119, -5120, -8448, -1536, 4095, 1026, -4098, -5630, 3070, +-254, 1023, -2049, -4606, -5121, 4608, 13057, 8446, -7934, -16896, -2818, 2307, 1533, 515, 4094, 5632, +-6143, -11521, -2047, 2303, 6145, 9214, -2813, -10756, -7676, -13315, 3074, 15358, -254, -2562, 2562, -7681, +-12801, -5373, 7676, 11012, 9981, -766, -7425, -11264, -6912, 0, 6401, 6143, -2816, -2047, 2557, 4612, +3069, -4607, -15615, -11010, 1538, 4350, 5377, 2816, -256, 1793, -3331, -6908, -10244, -4861, 8703, 4351, +1026, -4098, 7426, 1534, 769, -3071, 1277, -3836, -12548, -3069, -9729, -5889, -1534, 2813, 10755, 9215, +5631, 2562, -1794, -2047, -5631, -16899, -6141, -1794, 4609, -1024, -3584, 3070, 5891, 9213, -509, -4611, +-4093, -1796, -5884, -8195, 514, 4863, -1792, -8960, -3839, -1282, 1539, 5372, 6404, 5630, 1792, -4606, +-7940, -6907, -5636, -2301, 254, -3328, 6658, 5374, -766, -3075, -1534, -10753, -1790, 5117, -1021, 4349, +2819, 7678, 4353, -1281, -4095, -5632, -7169, -8447, -6401, -6399, -4865, -4607, -513, 7425, 5632, 8958, +1283, -1794, 513, -6144, 1278, -4093, -4099, -1021, -1026, -6143, -2, -3070, -3330, 2818, 6911, 6400, +-1792, -3584, -3840, -4352, -2816, -1024, -512, -1535, -1025, -3073, -5374, -2306, 6402, 5631, 6912, 3584, +-4352, -8703, -6913, -6399, -4353, -3071, 3071, 4097, 3839, 3329, 1791, -1535, -4098, -2301, -3843, -8958, +-5633, -1280, 4865, 1278, 2562, 4094, 1538, 1534, -3838, -3330, -3583, -8960, -4353, -510, 510, 4098, +2302, 2818, -2563, -2812, -4868, 2052, 509, -4351, 768, -6400, 1024, -256, 2048, 3584, 1281, 1021, +1028, -2052, -8699, -5893, -1021, -4610, -510, -513, 4096, 1792, -2304, 0, -2048, -2816, -1536, -1280, +-1279, 1791, 3072, -1023, -3842, -765, 2813, 2818, -4865, -6144, -4351, -2306, 2818, -2818, -1534, 511, +5632, 1281, -1794, -3582, 510, -2558, -2562, 514, -2050, -6399, -512, 4351, 1538, 1790, 1536, -2557, +-6405, -5882, -5, -1277, -258, 2305, -2816, -2048, 513, -3, 1027, -1794, -1790, -258, 1282, 765, +-1533, -1793, -257, -2814, -1027, -2813, -2818, -2815, -2049, 4097, 4863, 2050, -1282, -5376, -3326, -1540, +-4602, -2822, 1541, 3836, 2563, 510, -4863, -5887, -3074, 258, 1279, -257, 1283, 1277, 1538, -257, +-257, -2301, -5379, -5886, -3329, 2303, 4354, 5375, 2816, -1280, -2560, -3840, -1792, -255, -4610, -2814, +-2817, 512, -1791, -513, 1536, 4865, 2302, 771, -3076, -5884, -7171, -2302, -513, 1280, 256, 3073, +1791, -1535, -1537, -255, -2049, -2047, 1023, -1022, -515, -765, -1027, -2045, -1538, -1023, 1535, -1791, +-2817, -767, 2303, -256, -1791, -2049, -1280, 769, 510, 1026, 1535, -2304, -2815, -1538, -1790, -2050, +514, 254, -1022, -2050, -767, -512, 768, 0, -768, -513, -766, -3073, -2305, -255, 768, 255, +-766, 4093, 1027, -2562, -4095, -1282, -3580, -3589, -251, -516, 1283, 4093, 3843, 1789, -1533, -4354, +-5376, -5375, -4097, 1025, 1278, 515, 1532, 2565, 764, 257, -1023, -513, -1280, -1535, -2818, -2814, +-2050, -2558, -1025, 2048, 1025, -2306, -766, -257, -511, -2, 515, -1028, -2299, -261, 1029, -1542, +-3834, -3845, -764, -2, 1536, 1793, 2303, -1023, -1792, -1, 513, -1024, -769, 1538, -514, -2303, +-2048, -2305, -767, -2304, -1793, -510, -515, 2051, 510, 1, 0, -768, -2305, -1022, -1538, -1790, +-1026, 1, -1792, 256, 1537, 509, -252, -2052, -1020, 1277, 1025, -1023, -2561, -3328, -2304, -1791, +-2, 515, 765, -1278, 0, 255, 1281, 255, -255, -768, 511, -255, -257, -767, -1536, -2049, +-2304, -2303, -1793, 1, -513, -1024, 513, 512, -1, -511, -514, 259, -258, -1023, -1537, -1279, +-257, -767, -1793, -1536, 257, 1280, 511, 1025, -1, -255, -2304, -1537, -1279, -256, -1, 2, +-1283, -1789, -2051, 4, -1284, -2045, -3, 1794, 1024, -512, -1793, -767, -513, -511, 1024, 1022, +-253, -1538, -2303, -3071, -1795, -765, -770, 2, 255, -255, -2, 514, 510, 259, -1796, -1020, +-515, -255, 0, -1, -254, -1794, -2302, -2306, -510, 766, 1026, 510, -253, -772, -764, -1027, +-2302, -1281, 256, 0, -255, -770, 3, 509, 259, 765, 2, -514, -1278, -1792, -1793, -1536, +-1279, -515, 261, 251, -252, 253, -510, 510, 514, -2, -254, -1538, -2303, -2561, -511, 767, +770, -515, -253, -1026, -767, -512, -513, -255, 0, 256, 0, -1281, -2047, -1537, -1278, -258, +258, -259, 2, -768, -768, 512, 512, -1, -766, -1282, -767, -256, 256, -256, -1280, -2049, +-1278, -514, -511, -256, -256, 256, 511, -511, -1280, -513, 514, 510, 513, -256, -513, -1023, +-1280, -1280, -1024, -512, -256, 768, 256, -768, -768, -768, -256, -511, -258, 2, 255, -1, +-509, -771, -767, -767, -514, -510, -257, 0, 256, 0, -256, -511, -513, -256, -256, -256, +-255, -257, -255, -258, -509, -259, -254, 0, -2, -252, -517, -507, -261, -252, -259, -253, +-258, 1, -258, -254, -1, 1, -257, -255, -258, -254, -257, -256, -255, -257, -513, -253, +-259, -254, -256, -258, 3, -3, 3, -259, -253, -258, -256, -254, -259, -253, -259, -253, +-259, 3, -3, 2, -1, 1, -257, -255, -258, -254, -257, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, -512, 768, -768, 1280, +-2305, 5634, 5374, 1, 2816, -2049, 257, -6145, 1282, -6147, 1027, -5634, 3329, -4608, -4608, -1281, +-3326, -2050, -1534, -1282, 2, 4862, 3074, -2818, 1539, 5628, -1276, -260, -252, 2813, -1791, 3585, +4349, 4356, 1020, 7427, 4094, 5377, 512, 255, 1282, 253, -4604, -5, 2821, -516, -5629, -2562, +-4863, -2561, -1023, -4097, -1534, -1539, -1022, -4864, -2562, -5629, -7939, -5118, -4609, 2049, -3329, 4608, +1793, 7423, 1537, 6143, 7169, -1281, 4098, -515, 5890, 4864, 3839, 3330, -2, 4352, 3331, -5, +3077, -2308, 1026, -5120, -1280, -5121, -3070, -1795, -4349, 4861, -1021, -770, 513, -2304, 1790, -2045, +2045, -2557, 5373, 3, -1283, 2563, -3843, 5122, -1, -1023, 4095, -2816, -3072, 1025, -2, -2814, +766, -1278, -513, 3584, 1792, 256, 256, -4352, 513, 255, -3839, -2049, -6657, -4349, -3, -7420, +1787, -2044, 2045, -4094, 3328, -258, 2051, -259, 2562, 2559, 0, -255, -2305, 2048, -255, 3070, +2563, 1021, 3586, 1280, -1, 3841, -769, 1280, 4097, 3839, 256, -254, -2564, 1028, -771, -3327, +1538, -3, -1021, 765, 1539, -3330, -768, 2, -2563, 260, -3844, 1539, -2306, -1279, 1281, -4611, +2052, -3588, -252, -1540, 1284, 4348, -1789, 1279, 1535, 4866, 254, 2562, -2, -1278, 253, -3069, +-258, -2047, 256, -2049, 2817, -2, -2557, 3838, -1791, -769, -255, 1791, -1279, 1023, 2561, -769, +1538, 2813, -1533, 3070, -1791, 767, -2047, 768, -2816, -3840, 1536, -4097, 2306, -4098, 4866, 1022, +-254, 254, 2, 4606, -4606, 509, 1796, -2308, 2563, -770, 1281, -2816, -769, 257, -512, -513, +-2558, -1539, -2556, -1540, 771, -3841, 1278, 1284, 1533, 3841, 1281, 5374, -1534, 3326, -2302, 1534, +-1789, -1795, 2306, -2818, 3329, -3839, 767, -1023, -2, -254, -4610, 770, -1281, -512, 1024, 513, +2302, 258, 1022, 769, -1023, -2, 1538, -2050, -767, 769, 1790, 258, 3582, 257, -512, 3840, +-2816, 1280, 1536, -1536, 769, -770, -1278, -2, -254, -2049, 513, 511, -2816, 2048, 0, -767, +-513, 1, 766, -2557, 2557, -1533, -515, 2562, -4353, 3585, -3073, 1537, 511, -2560, 1793, -1025, +769, -2305, 2049, 1279, -511, 2559, -255, 1791, -2302, 766, 513, -2048, 1279, -766, -2, 1538, +-3073, 1792, 0, 512, 2304, -3583, 3326, -1534, -2, 770, -258, 258, 766, 257, -1537, 1538, +-1282, -1278, 509, -1533, 254, 514, -258, 1, 512, -768, -768, 512, 512, -513, 3074, -3, +-1789, 1278, 0, 257, 767, -1024, -1791, 1534, -509, 765, 515, -1283, 2, -1025, -1022, -2051, +515, -2051, -766, 1536, -514, 3, 509, 515, 509, 3, 1021, -765, 254, 2049, -768, 2048, +0, 1024, -1024, 511, 514, -1282, 2, -513, 255, -510, -771, 260, -3, 257, -1279, 510, +-255, -255, 509, -252, -260, 516, -772, 3, 510, -511, 1024, -256, -1, -254, 254, 2, +-2, 513, 0, 1024, -1280, 1024, 768, -1024, 768, -768, 0, -256, 256, 0, 256, 0, +-1280, 512, -256, -256, 512, 1, -2, 2, -1, 1, 511, 0, 1, 255, 258, -3, +2, 256, -1, 2, -771, 3, -258, -255, -256, -257, -254, -3, 3, -3, 3, 254, +-511, 255, 1, 0, -1, 258, -3, 3, 510, 1, 256, -1, 257, -257, -255, -257, +0, 1, -258, 259, -4, 4, -4, 4, -3, 2, -2, 1, 0, 0, 1, -2, +2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 1, 0, -1, 2, -2, 2, +-2, 2, -2, 1, 1, -2, 2, -2, 1, 0, 0, 0, 0, -1, 1, 0, +0, 0, 0, -2, 4, -4, 4, -4, 3, -2, 2, -2, 1, 0, 0, 0, +0, -1, 2, -2, 1, 0, 0, 0, 0, 0, -1, 2, -3, 5, -6, 6, +-6, 5, -3, 1, 0, -1, 2, -2, 2, -3, 3, -2, 1, 0, -1, 2, +-2, 1, -1, 1, 0, 0, -1, 1, 0, -1, 2, -2, 2, -2, 2, -2, +2, -2, 2, -2, 2, -2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -256, -768, 256, -2817, -1534, -2562, -1534, -2, 3586, +765, 516, 4860, 259, 2303, -512, -1792, 1023, 769, 513, 4094, -3838, -2050, -8447, -5631, 5630, +7682, 6399, -3329, -4094, -770, 1025, -6143, -5379, -6140, 5372, 1284, 2300, 9475, 6399, 4096, -3327, +-4610, -3838, -3074, -3326, -1, -8448, -1536, 3328, -768, 2048, -3839, 3838, 5121, 1281, -1026, 3585, +-1536, 3583, 5634, -1026, -5119, -9985, 1793, 3840, 3584, -3328, 4863, -5630, -1538, -2813, -5892, -7421, +-4097, -3841, 2818, 9726, 6657, 6656, 511, 13569, 8447, 6656, -2558, -11267, -15357, -11523, -18942, -9728, +3070, 2308, 6651, 8197, 15100, 11778, 10495, 9985, 8190, -253, 765, -7677, -12547, -25598, -32768, -23295, +-16640, -13057, 2049, 11520, 29440, 31488, 27648, 25087, 25602, 17918, 2562, -11777, -14848, -18945, -15358, -17666, +-14845, -14339, -14079, -6400, -1536, 1, -5889, 5632, 3073, -5889, -1280, 6914, 3580, 23046, 21754, 9220, +8446, 13312, 4354, -3843, 772, 6907, -8188, -2562, -6656, -21246, -17923, -14077, -14083, -6654, -8705, -6399, +-4353, 4353, 11262, 16386, 3071, 20992, 12288, -1280, -2817, -1278, -6659, -2301, -8963, 2818, -3073, 13312, +11521, -8449, 10240, 17664, 10752, 8449, 8959, -5887, -14338, -16894, -13825, -32767, -17664, -14081, -9471, -10241, +5377, -3328, 11775, 11009, 26368, 20735, 12290, 5118, 19457, 12800, 5888, 8192, -3840, -13056, 767, -2045, +-18180, -16380, -7428, -24317, -19969, -2048, -14847, -8706, 1282, 6398, 1282, 8703, 8192, 23808, 9984, 21760, +2048, 11520, 12800, 5121, 2559, 2304, -5120, -12544, -12542, -10243, -11774, -20738, -510, -5888, -14850, 4354, +3069, 2052, 2045, 5122, 1022, -2303, 11263, 10498, -12547, 8452, 9467, -251, 11260, 1539, 6141, 515, +-5123, -252, -3332, -4606, -4608, -4097, -1534, -5123, -8701, -3842, -4095, -1792, 255, -6398, 253, -2045, +4350, 10752, 2306, 3325, 4611, 7166, 7681, 1023, 8705, -769, -3070, 2046, -4606, -7938, -1280, -7935, +-16384, 767, -6909, -5893, -11004, -8450, 6144, 2306, 8702, 8193, 7936, 20735, -511, 2304, 19456, -2049, +2306, -1794, -6398, 8958, -6655, 769, -16641, -7936, 4352, -11008, 1281, -1537, -16896, -4864, 2560, -5632, +2816, 11264, 3072, 9472, -768, 9472, -512, 5888, 4864, 10496, -5376, 256, -14336, -2816, 6143, -1279, +-4864, -14081, -7422, -5123, -1277, 4094, -6143, 1280, 1535, 8962, -2818, 10242, -4610, 12034, 7934, 3587, +2812, 1796, -1539, -13565, -1539, -6143, -8704, 7168, 10241, 4351, -16128, 17408, -16895, -5122, 9732, 1274, +-13305, 4345, -4858, 8700, -9213, 1534, 13568, -9215, 18943, -8447, 9729, -10243, 12803, -11779, 3586, -18176, +255, -11519, -2049, 8705, -12801, 9472, -9215, 12288, -12289, 18945, -4098, 10755, -4867, 13828, -518, -13818, +7418, -14331, 8189, -8958, 12542, -17407, 2560, -5889, 7170, -11778, 3073, 512, 511, 3073, 6399, 1793, +-7681, 14081, -9217, 3841, -2562, 3842, 767, -6656, 12290, -1284, -8188, -1283, 14082, -11264, 7934, -11005, +-4867, 7427, -259, 6147, -4355, -2813, 11517, -12029, -515, 6914, -12544, 5375, -3327, -4097, 14848, -9215, +7168, 2814, 3843, 7933, -2046, -2304, -6657, -9215, 14335, -10752, -12286, -770, -2814, -771, 9987, -11522, +-2815, -2304, 12287, 2050, 4862, 257, 1792, -6145, 13314, -2050, -1535, 512, -7169, 1, 256, -257, +-1791, -9729, -7168, 15873, -13313, -1024, 5377, 510, 2, -4353, 14335, -6909, 7676, -508, 509, -8446, +10750, 3331, -7171, 11266, -10242, -5630, -2817, 6658, -11267, -6910, -3073, 1536, -14590, 18428, -4859, -6404, +12290, -2048, 6654, -2557, 10237, 3331, -11522, 5889, 10752, -11521, 2305, 1536, -8704, -2817, -5886, 14333, +-12285, 1278, 2305, -1024, -1282, 6147, -1795, -8957, -515, 1282, -8960, 3070, -1277, -3843, 4098, -4352, +13823, -14079, 14591, 1793, -3074, 771, 5373, 1283, 1021, -3326, -3585, 2305, 4095, 5378, 1533, -7421, +5374, -15871, -511, -4099, -8188, -2052, -1021, -11521, 14335, 3842, 4862, -8702, -3330, 9987, 2300, 9732, +-5892, 10755, -1, 13313, -7683, 3332, 3836, -18941, -3329, 1535, -2046, -5378, 12802, -14082, 1282, -6146, +-2302, 2303, -5120, 3329, -15106, 14851, 4861, -4093, 9469, 5635, -6915, 8707, 9725, 515, -8962, 2816, +2817, -1793, -5631, 4607, 1, -7170, 1539, -9475, 770, -10241, -256, 6145, -6914, 5122, -11265, 11776, +-5119, 4606, -5886, 8958, -1278, 13311, -6145, -4349, 8699, -3578, -517, 771, 3583, 2815, -1022, -2050, +5122, -5377, 1792, 4608, -18688, 19200, -16383, -3586, -7934, -3585, 6656, -8191, -2818, 9985, 4609, -2, +16643, -8707, 11009, -5631, 4862, 2307, -12034, 12544, -14847, -5889, 11264, 514, -6659, -254, -1793, -3327, +-11010, 7172, -10501, -6140, 2045, 2050, -7937, 257, 5375, 769, 2302, 515, 13053, -1533, 765, 6403, +2302, -5119, -1537, 3328, -8703, 5888, 767, -6911, 1535, 1537, -11009, -2815, -3072, 7680, -9729, -255, +13567, -14334, 9726, -4095, -5377, 10241, -7425, 6913, 0, -10242, 16387, -4356, -3580, 5629, -253, -4355, +5378, -2050, 13058, -23297, 6401, 6911, -16384, 11264, -8192, 1281, 3838, 771, -3076, -3580, 12029, -9214, +4607, -7424, 13057, -4609, 4865, -8961, 4353, -3585, 8705, -1, 2561, -7937, 11009, -9985, -5120, 2305, +2815, 3329, -12289, 14848, -6398, 4606, 257, 512, -12032, 15359, -9214, 254, -4351, 12033, 4093, -14077, +8445, -765, 7165, -5373, -7427, -3326, 5119, -7424, -1791, -3586, -4862, 10494, -12798, 14590, -3582, 6653, +260, -1028, 10243, -9474, 3330, 510, 5890, -19970, 19713, -11264, 9984, 2816, -9472, -5889, 1794, -2051, +4, -9220, -2301, 8703, -13825, 15362, -11522, 12290, -9730, 4865, 2304, 6656, 4095, -4350, 8190, -15103, +23808, -16641, 14850, -12546, 9218, -6915, 1796, -6404, 5123, -13057, -6913, 6146, -15618, 22273, -15360, -1024, +9216, -6656, 9472, -5376, 5119, 10498, -11779, 260, 10492, -7421, 5886, -7423, -5121, 2561, -2816, 2304, +5120, -12033, -1278, 2046, -5117, 14588, -18173, 7167, -2305, 8451, -9476, 7171, -21762, 24833, -23040, 2048, +5119, -1278, 14334, -5630, 5374, 6401, -3584, 1, 1278, -11519, 13312, -5633, -9982, 8958, -4862, -11010, +10242, -11523, 8196, 2557, 3330, 7679, -7425, 12290, -2561, -8192, 7937, 2302, -6142, 14847, -9216, -3328, +5377, -12034, 9730, -4098, 1, 4352, -2047, -258, -766, 1789, -4093, 8191, -10496, 10240, -5888, 5119, +-4606, -7426, -511, 2048, -2816, 4863, 2050, -8707, 17412, -14852, 13827, -10755, 3331, -13569, 14847, -10239, +5631, -14591, 11520, -3073, -4607, 8703, -13823, 7935, -511, -5377, -511, 11776, -4353, 12033, -4864, 4095, +6658, -10243, 13828, -9476, 7172, -9732, -765, -4098, 9729, -13312, 6912, -6401, 2050, 8189, -10237, 1790, +-5119, 3584, 767, -2815, 5120, 7423, 5890, 253, -4092, 6653, 4609, -2303, -515, -14331, 9467, -5628, +-2051, -12798, 11263, -1024, -6399, 1534, 3586, -4609, 768, 8448, -6400, 12032, -5120, 7681, -12034, 9986, +-4609, -7936, 3840, 4864, -10239, 5631, -7168, 5632, -3072, 10497, -11009, 2817, -3329, 4865, -8448, -1281, +4610, -13059, 9988, -1540, 7939, -10242, 3329, -9216, 7168, -2049, 770, 3838, -7422, 12799, -4608, 8704, +-3328, 8704, -8192, 7169, -1282, -5631, -4864, -4609, -5374, -11010, 11265, -6656, 4095, -7934, 11262, -10495, +14592, -6656, 5889, -1538, 2818, 2046, 3842, 8703, -13824, 8704, -13056, 10496, -10241, 3842, -10498, 770, +1278, 513, 3328, -2560, 7680, -20480, 21503, -12030, 10493, -11260, 3579, -3835, -5380, 9474, 1792, 5119, +-3327, 7424, -10752, 17919, -8190, 2814, -12799, 4609, -2819, 1796, -7428, 3587, -7682, 3585, 5120, -11008, +14335, -9471, 12799, -15102, 14590, -4095, 6912, -9217, 7426, -258, -2047, 10240, -12544, 6912, -1792, -1792, +-1280, -768, 768, 1024, -9472, 1024, -256, -11264, 10240, -3841, -6398, 12286, -2814, 1022, 7681, -9472, +13824, -4096, -2304, 3840, -1024, 256, 512, -9471, 12030, -766, -8961, 12032, -16896, 8705, -9474, 2050, +-4865, 1535, -3069, 9469, -8959, 8961, 7934, -8957, 8445, -4605, 1276, -4604, -9987, 9731, -4611, -6398, +11518, -14078, 17407, 4608, -8960, 7937, -1794, -2301, -1795, -4094, -5633, 2561, -16386, 16643, -6403, 2819, +9726, -13311, 6656, -256, 6400, -2560, -6144, 257, 13311, -5631, 3070, -3838, -9218, 6147, -3843, 9986, +-11521, -256, -9984, 4352, 6144, 4352, -14080, 7167, -1279, 7423, -1534, 2813, -8189, -1539, -1022, 5376, +-7937, 7937, 11007, -9727, -256, 1280, -2305, 2305, -1281, -6142, 510, -5887, 5887, 1, 1535, -2047, +1280, 2303, 12801, -5121, 2561, -12288, 11263, -8447, 4095, -6400, 1025, -7681, 2561, 2814, -7678, 7166, +-11005, 6141, 1026, 7167, -4352, 1025, -9985, 11777, -11522, 14338, -9985, -768, 7425, -6658, -1790, 8703, +-1024, 4353, -11778, 5634, 256, -7938, 1027, -4099, -2046, 4608, -5633, 3073, 6911, -1535, -1793, -6654, +7677, -2557, 8701, -14078, 6912, -7937, 8449, -6657, -2304, 3073, -770, -3837, -3, -2558, -5121, 6400, +-9983, 10495, -511, -2049, 8192, -6143, 4095, 258, -1795, -2301, 3581, -4350, 3071, -3071, -5889, 1537, +511, 6656, -2815, -2305, 10497, -4865, 0, -1534, -5123, -1532, -260, -2557, 2046, -10751, 6912, -10240, +8960, 2816, 4864, -10496, 9215, -1022, 1022, 2306, -3329, -1, -4094, 6398, -1022, 1278, -7422, 7166, +-15102, 13054, -4606, 1022, 1282, -2050, 2, -2562, 2562, -1793, 2048, -16384, 19713, -12802, 11267, -2819, +-2814, -1025, -3327, 1535, -512, -1791, 4863, -5887, -768, 3583, 3329, -3073, -1535, 5376, -4864, 8704, +-7425, 769, 2559, -6911, 3584, -7425, 4097, 5119, 1793, -769, -6399, 7423, -2815, -3328, -3073, 8193, +-12289, 11009, -10241, 3585, -2561, 2305, -769, -4096, 8449, -1024, 511, -767, 3071, -2047, 10239, -2814, +-1539, -1789, 1277, -4349, -2051, -3838, 3327, -8448, 6146, -1795, 6914, -6145, -3839, 2816, -769, 1793, +7424, -5121, 2051, 2811, -1787, 4604, -7421, 10751, -3072, -2305, 4097, -768, -6144, 4608, -9985, 5889, +-8447, 8702, -510, -10499, 3331, 255, 0, -4607, 6910, -3070, -3586, 5122, 1791, 2304, -3839, 9470, +-10493, 7420, 2564, 9213, -18174, 9727, -9472, -6399, 6654, -3070, 2302, -9982, 6143, -5888, 2560, 0, +8448, -19201, 18691, -10500, 7939, -4097, 4095, -8445, 3324, 1540, 2557, -3070, -2305, 7680, -13824, 12032, +-2559, 2047, -6656, 4864, -6656, -5119, 5375, -6912, 7936, -16895, 14847, -9472, 9216, -2303, -1281, 2049, +10495, -6912, 7681, -257, -3838, 4094, -2559, 3839, -9983, 2815, -9982, 9982, -12031, 14591, -17408, 2818, +765, -4349, -2306, 4352, -3070, 4349, 771, -258, 1025, -512, 14080, -7168, -1536, 9216, -5376, 1792, +-2815, 3582, -14334, 12798, -8446, 2303, -767, 253, -7164, 764, -252, 3325, -7679, -1536, 9728, -9216, +12800, -9729, 8194, 3581, -5628, 6908, -7677, 5374, 2561, -6145, -2815, 3072, -1537, 1026, -3076, 3845, +-1285, -763, 2044, -1790, -3585, 5120, -2558, -6915, 11266, -9217, 5377, -2561, -1023, 3326, 1794, -2817, +5889, -6658, 7170, 2559, -12032, 12288, -7935, 1790, 259, -7939, 4354, -4609, -255, 1023, 8449, -6657, +5889, -5377, 6146, -1026, -2304, 2, -4355, 2051, 8446, -7167, 4095, -2815, -5122, 6147, -7171, 9987, +-8707, 6146, -5377, 8961, -5377, 7425, -7425, 2305, -1792, -2049, 8960, -12287, 5374, -7165, 1277, -255, +3584, -4608, -257, 1538, -770, 5633, -2048, 7167, -9471, 6144, -4097, 6146, -14595, 12547, -9730, 7169, +-3329, -1023, 3327, -5631, 2048, -4353, 3585, -4610, 5892, -7173, 11782, -7686, 6149, -7940, 8195, -2, +-3070, 3327, -769, -2046, 1790, 5890, -15618, 12034, -4354, 2306, -9730, 2306, -1282, -4094, 4095, -1792, +-2559, 6654, 770, -4865, 7425, -2049, 1792, -2048, 5633, -2561, 3584, -6912, 1280, 6913, -5889, -1792, +769, -3073, 1536, -1278, -3844, 3077, -4612, 7171, -4866, 2305, 7168, -6656, -256, 2304, -256, 3328, +-4863, -2818, 6658, -7426, 4610, -2561, 4863, -4605, 2556, -1789, -769, -3841, 3586, -1025, -2561, 3074, +-4099, 4100, -3588, 4611, -8705, 4863, 258, 7678, -8703, 11264, -5888, -2560, 3840, -1537, 7938, -10498, +9218, -13057, 7423, -5373, 5884, -10236, 5629, 770, -2305, 1280, -3841, 6146, -10242, 7426, -1025, 7167, +-7678, 7934, -9726, 4095, 3584, -255, -6402, 1026, 2046, -5118, -2049, -1536, 7680, -17153, 17666, -9729, +9472, -255, 1021, -2812, -771, 5634, -2305, -768, -1279, 3326, -12797, 10236, -6652, 4604, -2044, -259, +-3327, 2304, 3071, -3070, 1790, -9471, 13056, -12288, 14848, -8960, 2303, -4606, 5631, -5376, 2305, -1283, +-3324, -1027, 258, 8191, -8192, 3072, -1536, 4864, -4352, 3328, -4096, -1280, 4352, -9473, 9474, -6402, +9730, -7170, -767, 3328, 2816, -4608, 2048, -3585, 3842, -770, -4863, 6144, -5632, 4608, -7936, 1023, +-766, 2302, -4863, 769, 1022, -1279, 7679, -5631, 7168, -512, 4095, -5375, 255, 3585, -1793, -4863, +5119, -1791, -4865, 2048, -3839, -258, -3838, 4607, -6400, -512, 513, 254, -4606, 3326, 9730, -6402, +7427, -259, 3586, -2561, 2816, 769, -2306, 3587, -3331, -3326, -5889, 5119, -4350, -1793, -2305, 1794, +-770, -5887, 6913, -259, 3332, -3332, -1533, 4351, 4863, -4862, 3327, -4353, 6147, 1532, -1533, -513, +-768, -768, -1792, 2048, -3328, 4096, -8447, -1794, 1282, 2046, -1789, -9475, 12034, -2817, 1280, 2049, +-513, -2048, -2304, 3073, -2050, 1282, 3326, 1025, -4352, 5632, -1280, 0, -257, 2562, -7171, -1788, +252, 771, -5378, -1279, 767, -6655, 6655, 4353, -6144, -2306, 1283, 2301, 2307, 1790, -1023, 2303, +-1791, 11263, -7934, 7422, -2560, -4350, -3, 2819, -770, -7167, -2817, -1534, -771, -3581, 6910, -5376, +-767, -2048, 3583, -3070, 6653, 1538, -2048, -1537, 8961, 256, -5121, 3586, -258, -4096, 4610, 1021, +-6653, 4095, -2561, -3070, -3586, 6913, -1024, -7680, 3071, 1539, -4612, -1276, -4, -1021, 1790, 1794, +1790, -5631, 12288, -9728, 6656, -3328, 2304, 1280, -1536, -1535, 3326, -2557, -259, 258, -4353, 5120, +-2559, -3841, 1281, -2305, 256, -5375, 1279, 5122, -4610, -512, 4354, -5123, 6916, 252, -4861, 5119, +-256, 1280, -1536, 1535, 2562, -2818, -3582, 6654, -9471, 5631, -6143, 1280, -2816, 2559, -2046, -1283, +1027, 1279, 4096, -7424, 6399, -5631, 2816, -768, 512, -2560, 4864, -3584, 4608, 1024, 1280, -1023, +-3330, 2818, 510, -6654, 5374, -4863, -4352, 5631, -6910, 1021, -2813, -1539, 2563, -6146, 9217, -3329, +-2303, 4607, 4610, -8195, 10242, -1282, 3843, -7171, 9475, -6147, 4098, -1793, -2304, -3839, -1793, 2305, +-6656, 1790, -2557, -1795, 259, 510, 3328, 513, -1026, -509, -2, 3584, -2815, 2046, 3074, -3585, +2304, -4608, 6912, -3071, -3842, 3074, -2818, 513, -768, 1280, -1792, -1024, 1279, 1281, -3328, 6143, +-7935, -1, 2305, 767, -1791, -257, 3329, -5633, 3585, 1536, -1537, -2815, 5631, -1790, -770, 2561, +1279, -6399, 2048, 3840, -3328, 5631, -7166, 4861, -7932, 5628, -2556, -4, -4092, 2556, -253, -5122, +6913, -7168, 5120, -7169, 13570, -6402, 3585, -2816, 4607, -4094, 3583, 4863, -10494, 6911, -6657, 3331, +-2308, -1788, 509, -2814, -1025, 256, -1535, 1022, 2818, -5633, 9984, -4864, 4096, -1024, -1535, 1535, +1024, -4864, 3584, -511, -5121, 5376, -7679, 6141, -3323, -3334, -251, 765, 1026, 2814, -5374, 5630, +-3326, -1025, 6400, -4608, 2048, 2561, -1282, -2557, 3836, -764, -772, -2811, -518, 6150, -7941, 2818, +-1023, -3843, 3843, 254, -767, 2048, -1537, -1023, 1536, 2815, 257, -4608, 511, 513, -1, 1536, +-510, -4866, 1281, 2559, -2303, 1024, 4608, -5120, 0, 1023, 3, 2556, -3324, 1789, -6399, 4096, +-3584, 4096, -5888, 3584, -1281, 1282, -258, 2818, -3842, 1025, 768, 2816, -1793, -1279, 768, 1279, +-1534, 3069, -3326, -3072, 4607, -6142, 3581, 2, -1792, -769, -766, 2302, 1281, 255, -1279, -1024, +-1025, 5378, -4098, 2305, -3072, -257, 2306, -3330, 2, 6654, -4606, -1026, -766, 6143, -3584, -1024, +-2560, 0, -768, 2304, -5121, 5634, -1538, 514, -3842, 3073, 512, -1792, 2560, -2816, 255, -510, +3583, -3840, 5120, -5121, 5889, -4608, 3072, -2048, -3073, 513, -4865, 6658, -5890, 3329, -1792, 3327, +-254, 2557, -3324, 1788, 3588, -516, -3581, 2302, -2815, 2304, -2560, 1279, -6910, 3326, 769, -2815, +252, 1029, -1539, 513, 2049, 1533, -1533, -1025, -257, 3587, 1275, 774, -2821, 3843, -4866, 5889, +-5632, 3072, -3839, 765, -3581, -2051, 5123, -7170, -2302, 3582, -1279, 255, 1025, 255, 4610, -1026, +513, -1280, -1026, 6404, -4101, 772, 1278, -3072, 1281, 1023, -5119, 2047, -1024, 1, -1538, 1028, +1275, -3068, 509, -2046, 3583, -3071, 511, -2047, 5630, -4349, 4093, -4093, 2302, -512, 2561, -1025, +1281, -1537, 257, -2049, 1536, 258, -3075, 2051, -2307, 2819, -3075, 772, -3333, 3076, -2818, -1535, +767, -2815, 3327, 513, -769, -255, 5375, -3839, 3327, 257, 3071, -5887, 1024, 511, 1281, -3329, +2817, -5120, -257, 3585, -3329, -512, 513, 511, -4095, 511, 2305, -1026, -4093, 3581, -1021, -515, +1282, 1536, -3841, 4609, 2304, -2561, -1535, 3840, -513, -2046, -2, 1793, -1792, -2048, 2560, -4352, +-768, 1280, -4864, 4352, -1793, -1534, 254, -3582, 5629, -253, -4098, 6145, -512, -256, 5119, -254, +765, -2813, -1026, 3841, -768, -513, -2559, -5888, 2559, 258, -2562, -1023, -1536, -3584, 767, -1278, +-1026, 4098, -3586, 3074, 254, 5378, 1279, 256, 0, 2305, 510, 514, -5889, 2048, 2817, -5633, +-256, -2047, -1026, -509, -1283, -3325, 1789, -4606, 4351, -4352, 3074, 3581, -1789, 3069, 2819, -515, +1027, -2563, 2819, 4094, -3840, -1791, 255, -1536, 2561, -5633, 1024, -3583, 1790, -2302, 1535, -769, +-2045, -1796, 2052, 3580, -2045, 1279, -2561, 3074, 766, 769, -1023, 5374, -4094, 4351, -2816, 5120, +-4864, 768, -3583, 1023, -2816, 1280, -4864, 768, 769, -770, -1278, -3074, 1027, -772, 1796, -2052, +-765, 5119, 3583, -1790, -2, 3842, 2046, -1278, -3, 4, 1020, -4092, 508, -3581, 1023, -769, +-7167, 3584, -4097, 6402, -5634, 1281, 0, 4608, -5121, 4866, -2306, 3842, -1537, 2559, -2046, 254, +2818, -258, -766, 255, 3327, -3070, -2050, 2050, -1281, -4096, -768, -2048, -1024, 1280, -255, -258, +-2302, 3583, -1792, 1, 1022, -510, -1, -1279, -1, 4097, 511, -511, 2303, -3326, 5884, -763, +-2565, 773, -3844, 2050, -3073, 257, -257, -2559, -2049, -255, 255, 1281, -1025, -3328, -510, -260, +3844, 2046, -257, 1027, 765, 2049, 2561, -770, 1025, -1279, -2307, 2819, -3586, 2049, -2048, -6913, +4353, -1537, 2306, -3843, -2813, -771, 515, -2, 2561, -3073, 2816, -510, -771, 5892, -3332, 2562, +-1792, -1792, 2560, 3840, 512, -3584, -256, -256, 1280, -2561, 1282, -4610, 514, -2050, -2047, -257, +3073, -3840, -1536, -768, 3071, 3329, -4609, 4098, -2562, 2049, 3072, 512, -256, 768, 1536, -512, +1, -2050, 2050, -5890, 2562, -2, -1022, -2050, -2558, -2306, 1794, -514, 1282, -1025, -1280, 3584, +1, -2, 1282, -1793, 4095, -1534, 2303, 1536, -4352, 2559, -2302, -2561, 1792, -4864, 3071, -2045, +1277, -1022, -3073, 512, 2561, -769, -512, 3329, -3585, 1280, -3327, 2559, 3072, -4863, 3069, -252, +-259, 3586, -3841, -1, 1026, -2818, 2050, -3585, 2047, -254, -4354, -254, 2814, -2047, 7168, -6145, +2306, 2045, -3582, 3327, 1281, -2049, 514, -1795, 2, 2559, -3584, 514, -4611, 1795, 765, -2046, +512, -258, -1789, 2557, -766, -1280, 6143, -5375, 2559, -3840, 5633, 255, -3071, -769, 1793, -258, +2051, -1284, 4, 254, -4096, 2561, -2562, 771, -2819, 515, -4610, 4097, 1536, -4352, 3072, -4864, +8449, -3842, -765, 3069, -2814, 1535, -512, -767, 767, 1280, -4351, 5374, -7677, 7933, -5118, -2561, +1280, 768, 768, -2816, 1793, -2, 1, -2048, 2304, -3839, 3838, -2047, 0, -1536, 4097, -1793, +1279, -1022, 3325, 1796, -3075, 1538, -4097, 2048, -3585, 2818, -1793, -255, -1793, 256, -1280, -255, +-513, -2047, -769, 3841, -257, -1023, 1791, -510, 3070, 2, 765, 1795, -6146, 2049, -2047, -1027, +2563, -1027, -2302, -2047, 1276, 5637, -8454, 3590, -2309, -1020, 1789, 514, 2558, -2558, 1023, -768, +-256, 4608, -256, -5888, 2305, -1027, 2052, -4867, 4097, -1535, -2306, 1025, 1792, -2048, 2560, -2304, +-2560, -1281, 5122, -258, -3838, 1534, 1794, -1025, -769, 1794, -2050, 1025, -1791, 254, 2562, -2, +-255, -4096, 0, 3584, -2816, -1536, -1281, 1538, -258, 3073, -6144, 5887, -4094, 4862, -3583, 3840, +255, -3070, -1539, -509, 4350, -4095, 2303, -5887, 1790, 1795, -2051, -766, -256, 254, 2307, -3331, +2819, 3326, -6912, 6146, -5891, 5379, -1026, -767, -769, -1022, 1277, 2564, -5380, 1283, 1534, -2814, +1022, -766, -2050, 1793, -512, 1535, 514, 2558, -1278, -1539, -2301, 3325, -2557, -2817, 3584, -5376, +2558, -3068, 3323, 262, -3077, 4611, -1538, -1534, 5373, -508, -3332, 2564, -772, -252, -2820, 3588, +-3588, -1789, -2, 3330, -5634, -1022, 3326, -4351, 3328, 768, -2304, 768, 768, 256, 2048, -3072, +6913, -7426, 3330, 2303, -3072, -255, -1025, -1792, 257, -257, 512, 513, -2049, -1279, 3326, -4093, +2813, 3, -2306, 2304, 769, -256, 2303, -4607, 4607, -4607, 1791, 3585, -4353, 1025, 255, -767, +1023, -2303, 511, 1, -2817, 2305, -1024, -2561, 3585, -3841, 1025, -2560, 2304, -1, -2303, 1792, +0, 1536, -1024, 4607, -3326, 1023, -768, -767, 1534, -1279, -1535, -1794, 515, 1277, -510, -1793, +256, -255, 1023, -255, -257, -255, 0, -1, -767, 3327, -1791, 1024, 511, -3839, 5375, -3583, +1279, -2560, 2561, 255, -255, -1025, 3073, -3841, 1025, 0, -2561, 514, -3074, 769, -3328, 5888, +-5632, 4352, -3585, 258, 2046, -1790, 3326, -2814, -1025, 2560, 256, 1537, -2, -2045, 2045, 2, +-769, 513, -1282, -254, -1281, -1793, 3, 764, -1533, -2049, -257, -1022, 1534, -2815, 2304, -1536, +768, 4096, -2048, 5631, 258, -770, 1282, -1538, 2305, -1025, -4607, 1024, -2816, 1535, -3327, -258, +-252, -1285, -1531, 3579, -3068, 2813, -1277, -259, -1278, 6142, -1535, -2303, 2814, -510, 1534, -766, +767, -1024, -1024, 2048, -2303, -1, 513, -2305, -3584, 3073, -1793, 513, -4096, 1791, -511, 1791, +-1279, 255, -2303, 4095, 768, -1535, 1534, -510, 1535, -1792, 2817, -514, -1022, -1281, 2049, -4097, +4864, -3071, -2306, 1539, -3, -1022, -770, -2302, 1022, -253, -3844, 3587, -514, 2050, -2305, 1791, +514, 3070, -1534, 767, -1, 1025, 2560, -3328, 512, 255, -1792, -2815, 2303, -3326, 1789, -6398, +-257, 1792, -2815, 2559, -3839, 1023, 2048, 1792, -255, 2303, -766, -4, 260, 2301, 3074, -2305, +-2304, -768, 1025, -770, 1282, -6146, 1538, -1282, 514, 1022, -1534, 1279, -3585, 1282, 1022, 1538, +-257, -512, -2047, 4093, -1276, 2813, -510, -1537, 1792, -2048, 1537, 254, -253, -2307, 2051, -4355, +3074, -1024, -1793, -2303, 511, -511, 768, -769, -2048, 2561, -2049, 4098, -3075, 2307, -3, -765, +-258, 2561, -3329, 2049, -512, -2049, 2818, -3587, 2819, -4355, 3586, -3072, -1, 513, 511, -512, +-2303, 511, 768, 2561, -4098, 259, -259, 515, 1021, 1795, -2307, 1795, 1022, -511, -1023, -2307, +3075, -3586, 1281, 1024, -3329, 1281, -1024, 0, 1535, -1536, 1025, 1023, -510, 1789, -2558, -513, +769, -1025, -1023, 1023, 769, -2048, 254, -1277, 2557, -510, 511, 256, -1792, 3072, -2048, -1536, +0, 1024, -3072, 256, 1537, 766, 2, -513, -768, 257, 1023, -3584, -1024, -1279, 1535, 257, +-1, 1280, 513, 767, -1279, 1023, 257, 1791, -767, -3585, 1537, -769, 513, -768, -1281, 1, +0, 255, 1794, -2306, -511, -1280, 0, 1280, 2048, -1281, 514, -2306, 2306, 510, -1535, 0, +-1536, 2304, -1, -1022, -1, 1280, -1792, -256, 768, -767, -2, -2301, -1028, -1531, 1018, -763, +2557, -767, 3073, -1794, 1282, 1022, 257, -768, -1792, -1023, 255, 0, -4096, 1023, -509, 1022, +769, 1279, -1024, -1024, 514, -1027, -253, -1282, 2048, -3583, 2047, 1024, 770, -771, -765, -3, +259, -515, 1540, -1285, -763, -4, -509, 766, 1537, -1793, -510, 1022, -1791, 2047, -1535, -2817, +4097, -3073, 2817, 1023, -2047, 766, 259, -1795, 259, -259, -2301, 1533, -1277, 2302, -3327, 1535, +-255, 2048, -1793, 2818, -3842, 1537, -2047, 510, -511, -2304, 1535, -1278, 2303, -3073, 4098, -2819, +1539, -1281, 2815, -1790, -2, 769, -2048, -1, 1025, 255, -2047, 1023, -2816, 1025, -1538, 2307, +-1540, -2811, 2555, -1531, 2043, -1787, 507, -1019, 2300, -2302, 1024, 255, -767, 2303, -1280, 1025, +1279, -511, -1025, -256, -2304, 2817, -4609, -255, -1, -2559, 1791, -254, 253, 2051, 253, 516, +1276, -765, -771, 259, -1538, -254, 1022, 257, 768, -1024, -512, 0, -2048, 1535, -2046, -2, +-510, -1538, 514, 2558, -2558, 1022, -254, 511, 3072, -1536, 768, -1280, 512, -1536, 1536, -1792, +513, -3074, 258, 511, -1536, 769, -3329, 1280, 514, 508, 1285, 3067, -2045, 2048, -1538, -253, +-1795, 2, -1, -2559, 3327, -1535, 510, -1533, 3069, -2813, -1026, 2816, -2560, -511, 255, -1023, +1022, 514, -1282, 2562, -2050, 1794, 1790, -2302, 254, -1534, -1282, 258, -1282, 3, 765, -1533, +2813, -2558, 1792, 767, -1278, -1283, 1795, 254, 769, 256, -2817, 1281, -1792, 1022, -3068, 1020, +259, -1282, 513, 1023, -1022, 509, 2052, -3076, 5123, -3330, 2305, -2048, -512, -513, -254, -2, +-1790, 1023, 255, 514, -2818, 2818, -1793, 512, -256, 768, -1792, 512, -257, -1790, -258, 515, +1532, -1789, 1535, -1536, 769, -258, -254, 1023, -1791, 1791, -1792, 2560, -1792, -1023, -1, 0, +-1279, 2558, -2302, -770, 1282, -3841, 1280, -767, 765, 516, -772, 772, 1277, -766, 1022, -1535, +-2048, 2816, -512, -1, -1535, -1281, 513, -769, -511, 512, -1282, 1540, 763, -508, -258, 2817, +-3585, 513, 1535, -511, 768, -2050, 771, -771, 260, 1275, -2811, -772, 1795, -1282, -1280, 770, +-514, 513, -1536, 1279, -767, 1791, -511, 0, -1281, 1025, 767, -1535, 512, -1793, 2048, -2815, +255, -255, -1792, -2, -254, 255, 2304, -254, -772, -1531, 2043, 772, -2050, 1280, -1535, -257, +513, -1, -1280, -512, 0, 258, -515, 1283, -260, -764, 510, -767, 512, 511, -255, -1280, +767, -1790, -3, 3, -1538, 1536, -510, 1021, 259, -3, 770, 511, -1279, 512, -769, 2049, +-769, -2815, 1024, -1025, 1282, -1283, 516, -516, -253, 767, -2050, -1531, 506, 773, -1539, 1537, +513, 2302, -1791, 769, -514, 1283, -772, -1532, 509, -510, -1, -2560, 1024, -767, -258, 3, +-516, 772, 764, -2555, 507, 3, 254, 1538, -1537, 1281, 511, -257, -254, -258, 1026, -513, +-1024, 0, -768, 0, 0, -1023, -1281, 2816, -2303, -258, 1538, -768, 511, -2048, -256, 512, +513, -769, 0, -257, 2819, -2564, 5, 763, -1020, 1278, -769, -253, -515, 1540, -1796, 2, +-1792, 2047, 2, -2306, 769, -1024, 512, -1793, 1026, -1283, 1283, -1281, 1535, -510, 510, 1793, +-3072, 2048, -768, 1280, -1023, 2557, -2812, 764, -765, -1, -768, -768, 1024, -2816, 511, 770, +-514, -254, -514, -767, 2048, -1024, 768, -1, -1535, 1792, -512, 1023, -767, 767, -767, 256, +254, 771, -515, -766, 768, -1538, 1026, -1281, -512, -1535, 1279, -2304, 1793, -1537, 513, -2, +-765, 2813, -1788, 1019, 4, 254, 513, -1024, 512, -2, 4, -773, -763, 253, -1023, 0, +-768, 1023, -766, -2, -510, 1023, -256, 512, -2048, 0, 256, -255, -259, -508, -4, 260, +1021, -1535, 1536, 0, 767, -254, -2, -767, 256, 767, -1535, 255, -767, -513, -511, 511, +257, -1025, -511, -257, 1537, -257, -255, -1537, 768, 1, 511, -511, -770, 2, 254, 514, +-1281, 1791, -2046, -2, 258, 510, -255, -769, -510, -1538, 514, 765, -253, -1538, 1538, -1793, +3071, -2046, 1278, -254, -1282, 770, 253, 772, -516, -1533, -514, 1, -1, 257, -769, 257, +-1280, 1022, -509, 764, -1275, -4, -254, -512, 2046, -1021, -770, 769, -1280, 255, -511, 1024, +256, -513, -254, -3, 3, -2, -767, -768, 511, -1023, 511, 1, -1280, -1, 258, 253, +515, 1021, -2556, 764, 3, -258, 1025, -1537, 257, -769, 1026, -258, -767, -1, 513, -1536, +768, 256, -1281, 1282, -2562, 1282, -513, 767, -1790, 1022, -510, 767, -1536, 256, 1280, -1280, +1024, -1024, 768, -769, 513, -1792, 2303, -2046, 2044, -2556, 1533, 771, -1539, 2, -1026, 1026, +-1025, 256, -1279, 511, 256, -1024, -256, 1024, -510, -4, -1531, 507, 1540, -771, 3, -1795, +1538, -1537, -256, 257, -513, -257, 3, -772, -252, -3, -254, -513, -255, 2302, -1277, 253, +-1022, 511, -256, -255, 255, 512, -256, 0, -255, -514, 514, -258, -1278, 510, -254, -258, +2, -2, 257, -2304, 1280, -256, 256, 767, 2, -771, -252, 765, 257, -1279, -259, 515, +-1025, 1023, -254, -258, -1278, 510, 514, -1794, 2817, -1280, -512, 768, -256, -769, -255, 1024, +-1792, 512, -257, 769, -2560, 1536, 0, -1025, -511, 2304, -2304, 1279, 770, -3331, 1795, -1282, +1794, -2306, 1538, -770, 257, -1024, 1280, -1024, -1023, 1533, -1788, 1532, -1788, 2044, -2045, -513, +255, 514, -2050, 1793, -256, -1281, 1025, -1536, 2048, -2304, 2559, -767, -1, 258, -2, -1535, +256, 254, -2300, 1276, -510, 768, -1794, 514, 256, -514, -509, 1533, -1022, -1281, 2048, -1791, +-1, 257, -769, 257, -257, 513, 1023, -2048, 1793, -769, -1535, 2559, -1280, 1024, -767, -257, +-511, -770, 259, 765, -2046, -256, 2045, -2555, 763, -252, -258, -768, 0, 1536, -512, -1023, +1535, -2560, 512, 1791, -1021, -260, -507, -6, -251, -3, 258, -513, -1280, 512, 0, 0, +256, -512, -1024, -256, 256, -257, 1282, -1282, 1025, -1537, -511, 2047, -1022, -771, 2, -257, +513, -1, 1, -1025, -511, 1023, 257, -1, 258, -1283, 3, 253, -1534, 767, -1535, -769, +513, -513, 1281, -1537, 1281, -1538, 1027, 1022, 257, -1024, 767, -256, -1279, 1023, 0, -1022, +-1539, 770, -256, 765, -1788, 1789, -2046, 512, 1022, -1279, 1, 511, -767, -1025, 768, 256, +2, -1282, 513, 1023, -768, 1537, -1792, -513, 513, -2, -509, -1283, 514, -257, -1280, 257, +1022, -1278, 1791, -2048, 769, 254, -510, -1282, -254, 255, 256, 256, -768, 256, -255, 254, +-510, 1023, -511, 254, -765, -260, 516, -770, 0, -1791, 1022, 2, -769, -255, 254, 2, +-1, -513, 516, 1018, -1275, -2, 0, 1025, 255, -256, -1023, -513, 769, 766, -1021, -1027, +1283, -2051, 770, 511, 257, -1537, -511, 255, 0, 769, -258, -1533, -515, 2050, -770, 514, +511, -768, 0, 0, 1025, -770, 3, -1796, 773, 252, 258, -512, -1281, 258, -3, 259, +254, -767, -512, -257, -767, 1535, -1279, 767, -1280, -766, 1533, -254, 767, -768, -254, -771, +259, -3, 1026, -2304, 1534, -1533, 253, 1282, -257, -768, -1280, 512, 1, 766, -765, -771, +514, -257, 512, 1, -512, -257, 257, -2, 770, 511, -1791, 254, 770, -770, 258, -514, +-254, -2, -254, 766, -2046, -257, 1024, -1023, -514, 1027, -515, -1022, 255, -511, 1024, -770, +514, -1025, 256, 1538, -771, -1278, 511, 256, -767, 767, -510, -3, -253, -259, 514, -1792, +511, 257, -1281, -255, 1022, -253, -1540, 517, 763, -2045, 1023, 512, -1535, 254, 514, 254, +-1022, 2047, -768, -768, 1280, 512, -1536, -511, 254, -509, -1795, 1282, -1, -768, 1, -258, +-509, 509, 1026, -513, 0, -767, 1535, 256, -1534, 1788, -763, -5, -509, 256, -514, -509, +-3, -1022, -1280, 1279, 1, -2561, 2049, -1280, -257, 1, 768, -1, -1279, 1792, -513, -253, +764, -509, -2, 258, -770, 258, -258, -511, -767, -2, -1023, 256, 0, -1280, 512, -1, +-510, -771, 2052, -1540, 770, -512, 510, 259, 510, 769, -1537, 1280, -510, -258, -767, 767, +-2304, 1025, -1793, 1, -257, 257, -257, -512, 257, -513, 258, 765, -766, -1792, 2815, -2302, +765, 771, -259, -253, 509, 3, -514, 1280, -1279, -1026, 2, 767, -1280, -1023, 1022, -254, +-1281, 1024, -767, -514, 514, -769, 1024, -768, 1, 1278, -766, -1, 1280, -1023, 767, 0, +1, -1024, -258, 1796, -1798, -249, 250, -1276, -514, 768, -767, -769, 257, -1, 1, -1025, +1537, -257, -1280, 1281, 255, 256, 513, -1026, 258, -1, -256, 513, -1538, 3, -772, 5, +-1029, 1027, -769, -1024, 768, -511, 509, -252, -4, 1027, -513, 255, 1282, -2050, 1282, -770, +-510, 254, -1022, 256, -1026, -510, -1, 256, -1790, 1277, -510, 1023, -1280, 1281, -257, 0, +-255, -2, 2, -513, 768, -511, -514, 3, 764, -2043, 1019, 4, -1027, 258, -512, -1, +-1022, 1277, -1021, -514, -511, 1537, -2051, 771, -2, 514, -770, -767, 512, 767, -766, 509, +-509, -258, 769, -513, -255, -1, -767, 255, -1791, 1279, 256, -1535, -1, 257, -2049, 2048, +-1023, -770, 3, -260, 517, 251, -764, 1278, -768, -255, 1022, -766, 1024, -1025, -1279, 1535, +-1280, 257, -257, -1791, 2304, -257, -1536, 770, -1539, 771, -1027, -254, 1281, -1539, 3, -3, +-1022, 1537, -771, -253, -515, 1283, -1026, 257, -256, 511, 258, -1027, 259, 510, 1, -512, +-1025, 770, -770, -511, -1, -510, -770, 1538, -2306, 770, -1, 255, -254, -259, 517, 251, +-765, 766, 768, -1534, 1534, -767, -256, -258, 259, -259, -509, -514, 1025, -1537, -511, 1280, +-1280, 256, -512, -1, -766, 1023, -1024, 768, -769, 1025, 1, -1282, 1538, -1027, -253, 254, +514, -770, 1, 0, -257, 514, -1026, 514, -1026, 514, -515, 516, -1284, 516, -1539, 1281, +-512, -513, 770, -1282, 1538, -1282, 769, -256, 0, -257, 514, -770, 257, 256, -1025, 769, +-2048, 1023, 1, -513, -511, -512, 255, 1, -1025, -768, 1537, -1537, 1025, -258, -253, 252, +4, -3, 2, 255, 1, -258, -1278, 1279, -1536, -255, 254, -1022, 254, 2, -1026, 258, +-258, 2, -1, -1536, 1536, -512, -511, 511, -512, -256, 768, -767, 767, -513, -766, 1278, +-510, -1, 512, -1792, 1280, -512, -512, 768, -1279, -515, 516, -1539, 514, -769, -1025, 1538, +-1538, 1026, -258, -254, 766, -766, 766, 258, -514, -254, 511, -1536, 1281, -1026, -253, -259, +-1021, 252, -763, 507, -1275, -5, 4, 254, -767, 767, 1, -513, 514, -3, 3, -3, +771, -771, 3, -771, 770, -769, -256, -255, -513, -768, 512, -1279, 254, 515, -1283, 1025, +-768, 768, 0, -1024, 768, -513, 3, 252, -253, -2, 513, 0, -511, -3, 4, 252, +-765, 255, -257, -510, -514, 258, -1025, 0, -768, 0, 0, 1, -2, -1022, 1278, -766, +510, -510, 766, -255, 512, -1025, 769, 0, 511, -1023, -513, 1024, -1790, 765, -1789, -259, +2, -512, -256, -513, 769, -2, -765, -3, 2051, -1795, 1283, -259, -510, 767, -511, 256, +-513, -255, -513, 1, -1024, 1023, -1279, -256, 255, -1022, 765, -509, -258, -255, -256, -512, +1023, -1278, 1534, -254, -1794, 1537, -256, 255, -510, 510, -767, -1, -255, 255, -767, -257, +0, -511, -257, -255, -257, -511, 255, -767, 1023, -1023, 255, 257, -257, 1025, -514, 3, +-3, 2, 255, -511, -257, 0, -1279, -258, 771, -1282, 256, -511, -514, 2, -257, 257, +-1, -768, 769, -514, 3, 1276, -508, -258, 257, -1, 1024, -512, -767, -1, -511, 511, +-256, -768, 769, -1281, 0, -256, -257, 2, -769, -256, 0, 256, 255, -510, 254, -254, +766, -254, 510, -510, -2, 257, -768, 512, -256, -512, -512, 512, -1024, 511, -766, -514, +258, -513, -258, -764, 508, -509, -257, -1, 514, -514, 2, 510, -1023, 769, -3, -253, +-2, -511, 256, 512, -770, 258, -1025, 258, -771, 515, -772, 4, -258, 0, -255, -769, +768, -1023, 767, -511, -1, 256, 513, -1281, 514, 253, 259, -3, -1022, 768, -513, 2, +-515, -510, 256, -257, -766, 254, -255, -256, -1, -254, -257, 255, 257, -769, 514, -513, +-1, -512, 2, -259, 516, -516, 515, -514, 257, -257, -511, 255, -254, -3, -509, -259, +2, -256, -513, -255, -769, 257, -513, -255, -1, 2, -3, -509, 509, 3, 1023, -1537, +1538, -1538, 513, 256, -768, -768, 0, -256, -256, -512, 512, -1, -1022, 1022, -510, -258, +1, 256, -768, 512, -256, -768, 256, 0, 512, -512, 256, -512, 0, -256, 512, -768, +256, 0, 0, 0, -1024, 512, -767, -259, 261, -518, -251, 252, -509, -1, -257, -254, +253, -509, 766, -767, -1, 257, -1, -255, 512, -514, 4, -517, -252, -514, 1, -768, +255, -255, 0, -256, 256, 255, -766, 510, 1, 256, -257, -254, -259, 3, 253, -765, +-514, 0, 257, -769, 512, -1022, 252, -508, -2, -512, 257, -257, 0, -1279, 767, 256, +-767, -1, -255, 510, -254, -258, -253, 254, -768, 256, 0, -255, 256, -513, 1, -513, +0, -255, 256, -769, 1, -513, 0, 257, -1025, 512, -256, -256, 512, -256, -257, 2, +-259, 516, -260, -253, -257, -769, 514, 254, -510, -2, -254, -770, 770, -1026, 257, -256, +-512, 256, -256, -257, 514, -514, -254, -2, 2, -258, -255, -255, 765, -1276, 508, 515, +-1282, 1025, -257, -767, -256, -1, -511, 256, -257, 1, -1, -767, 512, -1025, 514, -259, +-253, -2, -256, 2, 510, -1023, 0, 766, -1021, 253, 260, -516, -253, -3, -253, -514, +257, 256, -514, -253, 766, -1280, 513, -2, -1022, 511, -511, -258, 259, -3, -510, 256, +-258, 771, -770, 257, -513, 1, -2, -253, -514, 0, 2, -772, 1028, -514, -256, -255, +-1, -511, 510, -253, -259, -253, -514, 513, -513, 513, -768, -257, 258, -515, 3, -2, +-511, -1, 1, -514, 515, -515, 2, -257, 0, -256, 512, -512, 256, -512, 256, 0, +-768, 512, -512, -512, 512, -256, -256, -1, -510, -258, -255, -1, -256, -511, 511, -256, +-255, 255, 1, -769, 768, 2, -514, 513, -257, -511, -257, -254, 253, 3, -259, -253, +-515, 515, -771, -510, -1, 1, -257, 1, -514, 2, 511, -1023, 511, 1, -2, -509, +-3, -509, 253, -253, -3, -253, -258, 512, -255, 255, -1022, 253, 3, -1028, -507, 764, +-1021, -3, 515, -515, 3, -259, 258, -1024, 1022, 3, -259, -254, 512, -2, -509, 765, +-766, 255, -511, 510, -509, 252, -763, -6, -506, 251, 4, -514, 0, -256, 256, -256, +513, -769, 256, -767, 254, 515, -771, 770, -768, 255, 257, -257, 257, -257, -511, 0, +-513, 258, -258, -1279, 512, -1024, 512, -255, -2, -254, 511, -513, 515, -259, -254, 255, +-1025, 515, -515, 3, -3, -254, -258, 515, -770, 0, 257, -514, 514, -257, -512, 256, +-512, -512, 512, -1025, 770, -514, -255, 1023, -767, 255, 2, -515, 258, -1, -767, 511, +-511, -513, 512, -766, -3, -254, -256, 254, -252, -4, 258, -1024, 511, -510, -2, 258, +-770, 2, 511, -769, 259, -516, -252, 253, -510, -1, -1, 2, -513, 0, -511, 766, +-1023, 513, -258, -510, 510, 2, -514, 258, 255, -768, 256, -511, 254, -253, -515, 2, +-257, 0, -256, -256, -511, 510, -1022, 765, -509, -1, -256, 0, -256, 255, -253, -4, +260, -1028, 772, -516, 516, -516, 3, -1, -256, -512, 512, -769, -509, 253, -1022, 767, +-511, 255, -511, 255, 0, 1, -257, 257, -513, -512, 512, -255, 255, -511, -2, -254, +-257, -511, 511, -767, -2, 3, -771, 515, -515, 258, -512, -258, 259, -258, -512, 513, +-513, 1, -257, -255, 255, 257, -512, -513, 513, -512, -1, -510, -3, 4, -261, 261, +-260, -510, 257, -515, -253, -2, -767, 256, -255, -2, 2, 253, -252, 509, -766, 254, +257, -513, 2, -515, 259, -515, -509, -3, 3, -515, 2, -257, -255, 256, -513, 1, +-1, 257, -512, 256, -1, 2, -258, -255, 0, -257, 258, -770, -254, 254, -255, -512, +512, -768, 257, -770, -255, 512, -768, 256, -511, -514, 257, 257, -258, 2, -1, 256, +0, 0, 257, -514, 2, 254, -510, -513, 1024, -769, -254, -258, -254, -2, -255, 0, +-768, 0, 0, -1, -254, 254, -766, -2, 257, -1, 3, -260, 259, -770, 256, 3, +-4, -765, 254, 1, -256, 255, -255, -257, -510, -3, -253, -515, 3, -2, -768, 1, +-1, 1, -257, 1, 254, -766, 511, -256, -256, -511, 254, -766, -1, 256, -256, -255, +-258, 259, -516, 515, -769, 256, -512, -1, -511, -255, 254, -510, -515, 259, -258, 258, +-258, 2, -2, -255, 512, -769, 258, -258, 2, -258, -254, -258, -254, -257, 0, -256, +1, -258, -254, 255, 0, 1, -258, 2, -2, 3, -515, -254, 510, -510, -1, -256, +1, -258, 2, -257, 0, -512, 256, -512, -256, 769, -770, 258, -514, 1, 1, -258, +-253, -260, -252, 253, -510, -257, 256, -256, -255, -1, 0, 0, 0, -256, 257, -770, +257, -256, -512, 256, -768, -257, 2, -514, 257, -256, -512, 511, -511, 255, 257, -513, +257, -258, -254, 256, -1, -256, -255, -258, 3, -3, -510, -2, -253, -515, 257, -768, +0, 256, -767, 509, -252, 252, -253, -514, 2, -2, 1, 0, -257, -510, 510, -511, +-1, 258, -259, -252, -260, 3, -515, 4, -261, 6, -518, 261, -260, -509, 510, -254, +-258, 1, 0, 256, -512, -256, -1, -254, 510, -254, -258, 1, 0, -257, 258, -258, +-767, 0, -257, 2, -258, -255, 0, -513, 1, 256, -256, 255, 2, -259, 260, -260, +259, -2, -767, 0, 0, -257, 1, -513, -255, 0, -257, 2, -259, 259, -515, -253, +-257, 256, -256, -1, -510, -258, 259, -259, -254, 255, -256, -255, -257, 1, -1, -511, +510, -765, -259, 258, -2, -510, -1, -256, -512, 0, 256, 1, -514, 2, 254, -509, +508, -251, -517, 259, -1, -257, 3, -260, 4, -515, -254, -1, -256, 0, -256, -255, +-1, 257, -257, -256, 1, -257, 0, -256, 1, 255, -767, -1, -1, 3, 509, -510, +-513, 0, 1, -513, 1, -258, -254, -513, -255, 255, -256, 0, -256, -255, 254, -255, +256, -512, 0, -256, 0, -1, 2, -1, -257, -253, -4, 3, -1, -257, -254, -2, +-254, 254, -511, 0, -1, -254, -2, 2, -2, -511, 0, -513, 257, 0, -1, 1, +-257, 256, -255, -258, 259, -516, -251, -6, -506, 251, -509, -1, -512, 257, -258, 259, +-260, 260, -3, -766, 511, -256, 1, -258, -253, -515, 514, -513, -256, -255, -1, 256, +-767, 254, 3, -515, 2, -257, -512, 256, -255, -258, -254, -1, -1, -253, -3, 2, +0, -258, 3, -3, 3, -259, -253, -259, 3, -3, -510, -1, -255, -1, -511, 511, +-512, 1, -2, -254, -1, 0, 0, -513, 1, 0, 0, -257, 1, -257, -255, -1, +-255, -257, 1, -513, -255, -1, -255, 255, -767, -1, -255, -1, 1, -1, 1, -257, +1, -257, 1, -257, 257, -257, -255, -1, 1, -257, 257, -257, -255, -1, -255, -1, +-255, -256, -257, 2, -258, 1, -512, 0, 0, -255, -3, 4, -4, -253, -1, -1, +1, -257, 1, -256, -256, -2, -509, 254, -510, -3, -253, -515, 260, -515, -255, 0, +-256, -256, 0, -256, 0, 1, -258, 2, -2, -254, 511, -256, -255, -2, -254, 255, +-255, -257, 0, -256, -256, 1, -513, 0, -256, -512, 257, -258, 3, -260, -507, 251, +-252, -3, 2, -257, 0, 256, -256, 1, -2, -253, -3, -255, 1, -257, -255, 0, +-257, -256, 2, -516, 5, -4, -509, 254, -511, -1, 1, -256, -1, 2, -259, 3, +-259, 3, -2, 1, -1, -255, 0, -1, 2, -259, 260, -516, 3, -258, -511, 256, +-512, -256, -256, -257, 2, -258, 2, -258, -255, 0, 0, 0, -1, 2, -258, 1, +1, -259, 260, -260, -252, -4, -252, -260, -509, -1, 0, -256, -256, 0, -255, 255, +1, -513, 256, -255, 0, -2, -252, -5, -252, -2, -257, -253, -2, -256, -255, -2, +-254, -256, -1, -255, -258, 2, -513, 1, -257, 1, -1, -255, -1, -255, -257, 1, +0, -257, 2, -4, -252, -2, -256, -254, -4, -508, -3, 3, -515, 3, -259, -253, +-3, -253, -3, 3, -259, 259, -259, 2, -256, -258, 259, -3, -254, -256, -1, -256, +1, -258, 3, -259, -254, -257, -255, -2, 3, -259, 2, -1, 0, 0, 1, -1, +-256, 0, 0, -256, 1, -1, 0, -256, 0, -256, 1, -257, -256, -256, -256, -256, +-511, -2, -254, -2, -255, 0, -256, -257, 258, -259, 3, -2, 1, -256, -1, 1, +256, -512, -1, -255, -257, -255, -256, -1, -255, -1, -255, -1, -254, -4, -251, -261, +261, -260, -254, -256, 255, -255, 0, -1, 2, -2, 1, -256, -256, 0, -256, -256, +-257, 2, -258, -253, -260, -252, -260, -253, -257, 0, 1, -257, 0, -256, 1, -257, +1, -257, 0, 1, -257, 1, -257, 1, -257, 1, -256, -1, -254, -258, -254, -257, +0, -256, 1, -2, -253, -259, 2, -257, 256, 1, -257, -256, 0, 0, 0, -256, +0, -1, -254, -2, -255, 0, -257, -255, -255, -3, -252, -4, 3, -514, 2, -259, +3, -2, -255, 0, 0, -258, 3, -2, -255, 1, -258, 1, -256, -1, 2, -513, +-257, 2, -258, -254, -1, -256, 1, -257, -255, -257, 2, -2, 1, -257, 258, -259, +4, -5, -507, 252, -253, -258, 1, -257, 2, -3, -252, -4, -253, -259, 3, -258, +-255, 0, -257, -255, 0, -257, 1, -256, -1, 2, -259, 3, -258, 1, 0, -1, +-255, -1, -255, -257, 2, -258, -255, -257, 1, -257, -255, -256, -258, -253, -3, 2, +-257, -255, -2, -254, -1, -256, -254, -3, -254, -1, -255, -1, 1, -256, -2, 3, +-3, -510, -1, -255, -2, -253, -3, -254, -257, 0, -255, -257, 1, -257, -255, -1, +-255, 254, -253, -3, 3, -259, 2, -257, 0, -255, -258, 3, -4, 4, -3, -254, +-1, -257, -254, -257, 1, -258, 2, -258, -254, 256, -258, 3, -4, -252, -3, -254, +-1, 0, -255, -2, 3, -4, 4, -259, -255, 1, -1, -256, 1, -259, 3, -257, +-256, 0, -256, -1, 2, -1, -256, -256, -256, 0, -256, 1, -258, -254, -1, -1, +-253, -3, -255, 1, -2, -254, 0, -258, 3, -260, -252, -258, 0, -255, -258, 2, +-256, 254, -253, -3, 3, -259, 3, -3, -253, -3, 4, -517, 4, -259, 2, -257, +1, -1, -255, -1, 1, -257, 1, -1, -254, -3, -252, -4, -253, -2, -255, -257, +-254, -2, -255, -1, 2, -259, 3, -259, 2, -256, -1, 1, -257, 1, -257, 1, +-257, 1, -256, 0, -1, 2, -259, 3, -1, -257, 2, -259, 3, -258, 1, -257, +0, -255, -1, -255, -1, -1, -253, -3, -254, -1, -256, 0, 1, -2, -254, -1, +-256, 1, -2, -254, -1, -256, 1, -257, 1, -1, -256, -254, -3, -252, -261, 4, +-514, 1, 0, -1, -255, -256, 0, -1, -255, 0, -256, 1, -2, -255, 1, -258, +3, -259, 2, -1, 1, -257, -255, -1, -255, -1, -256, 1, -1, -255, -257, 0, +-256, 1, -257, -255, -2, 1, -255, -257, 1, -1, -1, -253, -3, -254, -1, -256, +1, -1, 1, -258, -254, -257, 1, -257, -255, -1, -256, 2, -259, 3, -258, 0, +-255, -256, -1, 2, -258, -255, 0, -257, 2, -258, 2, -258, 1, 0, -1, -254, +-3, -252, -260, 3, -257, -1, -254, -2, -255, -255, -258, 2, -3, -252, -4, -252, +-4, -253, -2, -254, -2, 2, -258, -254, -2, -254, -258, -254, -258, 2, -258, 2, +-257, -1, 2, -258, 2, -2, -255, -1, -255, -257, 1, -1, -255, -2, 3, -259, +-254, -1, 0, -256, -255, -2, -254, -2, -254, -258, 3, -4, 4, -259, 2, -1, +-256, -256, 0, 1, -258, -254, -257, 0, -255, -2, -253, -3, 2, 0, -2, -253, +-3, -254, 0, -1, 1, -257, -255, 0, -1, 2, -259, -252, -260, 3, -258, -255, +-255, -3, -252, -4, 3, -257, -1, -253, -5, 6, -5, -253, -1, -257, 1, -255, +-2, 1, 0, -258, -251, -7, -249, -6, -252, -2, -255, -1, 2, -259, -253, -259, +-254, -255, -3, -252, -260, -254, 1, -2, 2, -1, -256, 0, 0, 0, 0, -256, +0, -256, -256, -1, -255, -256, -257, -254, -3, -253, -258, -255, -1, 1, 0, -1, +2, -3, 4, -4, -253, -2, 2, -258, 2, -258, -255, -256, -1, 1, -256, -257, +2, -259, -253, -2, -254, -2, 2, -3, -252, -4, 4, -4, 2, -256, -1, -254, +-3, -254, 0, -258, -252, -4, 3, -258, 1, -256, -257, 3, -4, -252, -4, 3, +-258, -254, -1, -256, 0, -256, 0, 1, -1, 0, -255, -257, 1, -1, -256, 1, +-258, -253, -3, 2, -257, -257, -254, -1, -256, 1, -2, -254, -1, -1, -254, -258, +2, -257, 0, -256, -1, -255, -255, -2, -254, -259, 3, -258, 2, -2, -255, -257, +-255, -256, -256, 0, 0, -2, 4, -4, -252, -260, 3, -258, 2, -258, 1, 0, +-256, -256, -257, -255, 0, -257, 1, -1, -255, 0, -258, 3, -2, 1, -256, -1, +-255, 1, -259, 3, -2, -255, 0, -256, -1, -254, -3, -253, -2, -255, 0, -257, +-254, -2, 1, 0, -257, 2, -257, -256, -255, -2, -254, -1, 0, -255, -1, 1, +-258, -254, -258, 2, -2, -254, -2, -255, 0, -256, 0, 0, -257, -254, -2, 2, +-258, 1, -256, 0, -256, -256, -1, 2, -258, -255, 0, -1, -255, -255, -4, -250, +-262, 4, -258, 1, -256, -255, -259, 4, -5, -251, -259, 1, 0, -256, -257, 2, +-2, -254, -258, 2, -2, -255, 0, -256, 0, -256, -257, 1, 0, 0, 0, -1, +2, -2, -255, 0, 0, -257, -254, -259, 4, -4, -253, -258, 1, -255, -3, -252, +-4, 3, -257, -1, 2, -2, 1, -1, 2, -3, 3, -258, -256, 2, -259, -252, +-4, -253, -258, -254, -2, -254, -259, -252, -259, -254, -2, 1, -1, 2, -2, 1, +1, -4, -250, -6, 4, -2, -256, 2, -3, -252, -5, 5, -261, -251, -260, 4, +-260, 3, -258, -254, -1, -257, 2, -2, 2, -257, -256, -256, 1, -3, 4, -3, +-254, -1, -257, -254, -258, 2, -258, -254, -1, 0, -256, -256, 0, 0, 0, -256, +0, -256, -1, -254, -2, -254, -2, -254, -1, -256, 1, -1, -256, 1, -257, 1, +-257, 0, -256, 1, -1, -256, -255, -258, 2, -258, 2, -2, -253, -4, 4, -259, +1, 1, -259, 5, -5, 3, -257, -256, 0, 1, -259, 5, -261, -252, -3, -255, +1, -1, 0, -256, 0, 0, -255, -258, -254, -2, -254, -2, 2, -258, 2, -258, +-254, -2, 2, -258, -255, -255, -2, 2, -258, -255, -256, 0, -256, 0, -257, 1, +-256, -256, 0, 0, -257, 2, -258, -254, -2, -254, -2, 2, -258, -254, -258, 2, +-2, -254, -2, 2, -257, 0, -256, -256, 0, 1, -258, 2, -2, -255, -256, -257, +1, -257, 1, -257, -254, -259, -254, 0, -258, -252, -260, -253, -2, 1, -257, 1, +-257, -255, 0, -2, 3, -259, 2, -1, -256, 1, -1, -255, -258, 3, -3, 3, +-259, -254, 0, -257, -255, -257, -256, 2, -3, 3, -259, 3, -258, -254, -2, 1, +-255, -2, 2, -257, 0, -255, -258, 2, -258, 2, -258, 1, 0, -256, -257, 2, +-258, 1, -256, -1, 2, -258, -255, 0, -256, -1, 2, -258, 2, -257, -256, 1, +-2, -253, -3, -254, -257, 0, 1, -257, -256, 1, -258, 3, -2, -256, 1, -1, +1, -1, 1, -1, -255, -1, 1, -1, -255, -1, -255, 0, -1, -255, -1, 1, +0, -256, -1, -255, -1, -254, -259, 4, -5, 5, -260, 3, -2, 1, -1, 1, +0, -256, -256, -1, 1, -257, -254, -258, 1, -256, -1, -254, -258, 1, 0, -257, +3, -5, -251, -4, 3, -3, 3, -3, -253, -2, 0, 0, -255, -1, 1, -256, +-2, -252, -5, -251, -4, -253, -2, 1, 0, -257, 2, -258, 1, 0, -257, 2, +-2, 2, -258, 2, -2, 2, -258, 2, -2, -254, -2, 1, 0, -1, -254, -2, +1, -1, 2, -259, 4, -5, -251, -4, 2, -1, 1, -1, 1, -2, 2, -1, +1, -2, 2, -2, 2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -257, 514, 766, 2, -1537, -1, 3586, -9986, 9218, +-4354, 6146, -4354, 2050, -2562, 2050, -8450, -5118, 14078, -1791, 513, -1794, 2050, -9218, 5377, -6399, +-1795, 10499, 1278, -6143, 4865, -7170, -4350, 4861, -509, -3842, 4866, -1, -5376, 5375, -4606, 254, +4353, -3328, -4352, 4608, 513, -4867, 1284, -1028, -3324, 4861, 2306, 510, 258, -3329, -7936, 1793, +766, -254, 1023, 2304, 769, -1537, -3072, -768, 2816, -1536, -1279, -257, 768, 4608, -769, -3582, +-257, 0, -1792, -3072, 2560, 2304, -1, -2302, 766, -509, -1540, -1021, -2, 1, 769, -258, +-255, -511, -1026, 2, 254, 513, 256, 1537, -2, -1790, -2818, -254, 255, 0, -513, 2051, +1277, -2814, -1538, -1535, 2559, 2, -770, 1281, 512, -769, -2047, -3073, 1, 1792, 0, 0, +1280, 766, -1021, -1539, -2300, -259, 257, -1, 0, 513, -257, -511, -2049, 1, 254, 1794, +-514, -510, 511, 0, -1280, -1024, 0, 513, -3, -507, -262, 518, 1019, -1021, -770, -510, +1021, 4, -1540, -253, 766, -512, -1023, -256, 511, 257, 510, -510, -256, 767, 0, -767, +-1539, -1275, 507, 1027, -1024, 1278, 1, 257, -770, -254, -258, 258, 510, 6146, -14337, 15103, +-7166, 7166, -4095, 1, 253, -508, -9988, -1532, 17148, -4092, 5116, -2556, 253, -9982, 4350, -10494, +5374, 15618, -8194, -4350, 6909, -3836, -6916, 3331, 2303, -3329, 2818, 254, -8191, 10496, -4864, 1280, +2303, -510, -7427, 5891, -1793, -3330, 4101, -4103, 7, 6906, 5, 253, -254, -5634, -1791, -3072, +2560, 2817, 1790, 769, 1280, -3072, -2560, 256, 1792, -512, 1024, -1792, 2048, 4096, -3839, -1026, +-254, -2049, -1024, -1535, 2558, 5379, -1539, -510, -1, -1792, -1791, 254, 2, 1278, 258, -514, +514, -1027, -1020, -260, 1795, 254, 257, 768, -513, -1535, -256, -2305, 1794, 254, 512, 2819, +251, -3322, -1541, -1789, 3071, 1024, -256, 1536, 768, -2304, -2816, -2048, 0, 3584, -768, -1, +770, 511, -2305, 2, -2562, 770, -1281, 1535, -254, 255, -1280, 768, -2560, 767, 514, 766, +-1022, -3, -252, 1019, -4603, 12285, -16384, 6658, 7677, -7420, 9724, -9981, 7421, -5117, -4610, -13054, +20990, 1, 2304, -1280, -1024, -4864, -2304, -8704, 3584, 16640, -7680, -3839, 3069, 6404, -11524, -3325, +5119, 1280, -2304, 3072, -10240, 9472, 1281, -4098, -766, 6654, -10749, 5629, 2818, -9217, 6912, -7167, +-1281, 8193, 1023, 257, 1279, -8959, 4095, -11007, -257, 8961, 1535, 257, 4351, -6143, -3329, 1280, +-1023, -3841, 4096, -1790, 1020, 5893, -3077, -1276, -2563, -3581, -1027, 1027, -1795, 5122, 1279, -1024, +-511, -1282, -4350, -1, -768, 257, 1534, 770, 2303, -2303, -769, -2304, -256, 1, 1280, 2559, +1025, -4098, -1021, -2819, 3, 254, 2304, 2818, 1021, -3581, -3587, -1789, 1790, 257, 0, 2559, +1537, -2560, -2817, -511, 0, 1023, -255, 767, 3073, -4609, 6402, 1789, -24062, 25855, -15104, 14337, +-5889, -768, 4096, -6400, -12544, 8704, 12032, -2559, 7933, -10236, 3324, -4093, -11521, -1537, 24321, -11008, +-6656, 1536, 12288, -5633, -11262, 7934, 2562, -3330, -4607, -3840, 3584, 7936, -1025, -4862, 5629, -3836, +-5635, 11009, -13056, 9728, -7936, -1791, 15102, -1022, -6402, 6658, -11521, 6144, -7167, -8450, 13058, 3071, +-2816, 1537, 3327, -6655, 3070, 1283, -8962, 7424, -3327, -1281, 9216, -4094, 764, -764, -2819, -2558, +1023, -5120, 7168, 768, -512, 1281, -1, -3840, -1792, -1024, 2561, 1022, -1278, 3070, -1534, -1026, +-1791, 1023, 769, -512, 1791, 2, -1028, -1019, -2564, 1283, -258, 0, 4098, -2, 1282, -5378, +0, 2, -2, 1282, 2814, 2561, -1024, -9216, 7936, 5631, -25854, 23550, -9982, 13310, -1278, -6146, +-1790, -1538, -6911, 1280, 10240, -768, 10240, -6145, -1278, -5634, -12286, 10238, 12545, -9984, -4352, 4865, +13310, -8447, -13312, 10751, 1283, -772, -7676, -4100, 4611, 9727, -2816, -2304, 6913, -10498, 3075, 3581, +-12031, 10497, -11010, 2050, 14335, -7168, 0, 3073, -7171, 5381, -7685, -10235, 16123, -764, -5122, 6401, +1280, -4864, 5374, -5629, -5123, 5891, -4866, 3585, 6143, -1279, 3327, -2559, -3584, -2305, 2, -770, +3329, -256, 1536, 1536, -1023, -1026, -3582, 1790, 770, -2305, 1280, 4097, -4610, 1793, -3584, 1535, +2562, -2305, 2303, 770, -3075, -765, -3329, -512, 3841, 765, 3332, -260, 4, -6915, 3586, -4866, +-254, 3838, 258, 11006, 3842, -28930, 20482, -8194, 3841, 2816, -8448, 5121, 1278, -5375, -5120, 13312, +-5375, 5374, -3070, -1794, -6142, -6657, 15360, 2048, -14336, -1791, 10239, 8192, -10753, -4606, 3070, 2563, +253, -12799, 8447, 258, 4351, -3072, 513, 3070, -7679, 4353, -3074, -2301, 6140, -12540, 8957, 13058, +-12033, 256, 513, -3585, 1281, -6146, -3069, 11517, 771, -3075, 3586, -770, -5117, 1277, -3070, 256, +3326, -1534, 4350, 1026, -4096, -2306, -1022, 1021, 2564, -1283, -1022, 3326, -2046, 1278, 1794, -5122, +258, 1535, 512, 3072, -4353, 2818, -513, -512, -2560, -768, 5632, 1281, -1794, 2305, -1024, -4096, +1537, -2818, 770, 2301, 1540, 2044, 4, -515, -4351, 512, 0, -768, 5632, 4352, -12545, 6914, +-2562, 2050, 4606, -5631, -2560, 255, 2051, -4612, 7427, 2557, 1795, 1278, -9470, -3587, 3, 10749, +-5117, -5634, 769, 8959, 1793, -3585, -3839, -513, 4610, -1795, -7933, 509, 6147, 5630, -4607, 4608, +-4353, -766, 6397, -8700, -1540, 2819, -3585, 6655, 10499, -11269, 3845, -515, -3583, -1791, -2563, -1789, +8702, 3585, -1279, 1789, -1533, -1282, -1535, -2816, -257, 2560, 1282, 4350, -512, 257, 254, -3324, +-1539, 256, 513, 767, 3074, -770, 1537, 1536, -3329, -2303, 1279, 1537, 0, -1, 258, 253, +3075, -3074, -767, 3840, -1024, -513, 2, -1282, 769, 1024, -2561, 3841, 1535, -510, -1027, 772, +-2565, -508, 1023, -2, 1540, 2812, -2301, 1279, -1536, -2305, 1794, -258, 2, 511, 1279, 2050, +-1026, -1278, -2, -511, 0, -1, 2, 2558, 1281, -2816, 1791, -1022, 766, -255, 512, -1025, +2561, -1536, -1282, 1540, 763, -1020, 1022, 0, -511, 767, -767, -257, 1537, 255, -2047, 2559, +-255, -1, -255, -1, -1023, 2048, -769, 0, 1025, 256, -257, 514, -3, -1789, 510, 257, +-1, 1282, 509, -253, 1278, -2559, 0, 1536, -1025, 2049, 256, 512, 513, -514, -1279, 256, +255, -253, 1532, 3, -2, 513, -257, -510, -3, 259, -2, 1025, 0, 511, 514, -1282, +1, 0, 256, 0, 1025, -3, 260, -260, -1532, -3, 513, 513, 765, 5, -518, 5, +-1539, 257, -768, 1792, -1, 1539, -517, -1019, 252, -509, -1281, 256, -1, 1538, 1278, -766, +-1, -1, -1534, 510, -510, 511, 1792, 255, 2, -514, 258, -1282, 1025, -1024, 1023, 1282, +-515, 3, 766, 1, 0, -513, -255, 1023, 1282, -771, 515, -3, 259, -2, 1, 511, +513, 1024, -257, 1, 0, -513, -254, -2, 1025, 512, 511, 2, -258, 257, 0, -514, +1027, 510, 513, 255, 1, -1, 1, 0, -1, 769, 768, 255, -510, -259, 260, -4, +3, -770, 1025, 256, 768, -1, 1, -1, 514, -259, 3, 253, 259, 254, 1, 255, +1, -256, -256, 512, 511, -255, 255, -510, 766, 513, -256, -1, 257, 0, 256, -1, +3, 507, 517, 253, 2, -513, 0, 512, 257, -2, 3, 252, 4, 254, -256, 256, +513, 254, 3, -3, 1, 513, -1, 257, 510, 258, -2, 2, 0, -2, 2, 255, +512, 256, 513, -1, 1, -1, 1, 766, 3, 254, 256, 1, 255, 256, 1, 510, +259, -4, 260, 252, 3, -1, 511, 258, 253, 259, 254, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, -254, +-2, -254, -258, -255, -255, -258, -254, -258, -254, -257, -256, -255, -2, -510, -4865, -11008, +-15103, -17153, -17407, -16897, -16127, -13314, -8189, -5635, 1284, 7164, 11522, 13311, 12032, 5377, 2048, -2305, +-6143, 11775, 16641, 20222, 21507, 23549, 23811, 24830, 23552, 18177, 12542, 8707, 4093, 2051, 510, -3071, +-4353, -5887, -7680, -10753, -13566, -16898, -19455, -21759, -23299, -24572, -24068, -24316, -23812, -23805, -23553, -21761, +-20990, -19715, -17661, -13826, -12030, -7427, -5373, -3075, -509, 1534, 2817, 3071, 4354, 3326, 3074, 3582, +2304, 770, 3582, 7683, 11517, 11009, 10496, 7935, 6915, 7165, 7938, 8447, 7423, 5634, 4607, 4096, +1025, 1022, -1279, -1536, -1280, -1023, 1278, 2562, 5630, 6914, 9727, 12288, 13568, 14080, 14080, 12289, +11262, 10241, 8960, 6400, 4096, 3328, 2304, 2560, 6400, 9217, 9214, 11010, 13054, 13826, 11007, 7168, +6144, 4863, 2562, 254, -1534, -2051, -765, 1533, 2564, 2300, 3, -3075, -3069, -3841, -6657, -8702, +-9731, -9469, -9730, -9982, -9986, -12031, -12801, -13055, -13824, -15104, -15361, -16639, -17409, -16894, -17410, -18175, +-18433, -19199, -20224, -18432, -16384, -13825, -12031, -9472, -5888, -3584, -5632, -5377, -3838, -2818, -2302, -1282, +-511, 2816, 4864, 7679, 7426, 7933, 8963, 10238, 14080, 15362, 16893, 15107, 16125, 14851, 14078, 12801, +13312, 13823, 14081, 13568, 14335, 13570, 13566, 11521, 9729, 8956, 7174, 4858, 3589, 3068, 2819, 4605, +6660, 7164, 8962, 9216, 7422, 7940, 8188, 5378, 2303, 2048, 1026, 2557, 2, -1026, -509, -259, +-1533, -3076, -3580, -3074, -4352, -4095, -5378, -5118, -5121, -6655, -6914, -8190, -10242, -9469, -11523, -11006, +-11265, -12032, -10750, -11780, -11003, -9989, -9724, -9219, -7678, -6401, -5376, -2816, -2816, -3584, -2560, -5119, +-5634, -6398, -7681, -9728, -11519, -11009, -13568, -13567, -12546, -13566, -11778, -9726, -8449, -8192, -6656, -5120, +-2304, -2303, 255, 3072, 4609, 5630, 5379, 6908, 8708, 11260, 13060, 14333, 15873, 16897, 17150, 19203, +17405, 17154, 17151, 16896, 16130, 15868, 15108, 14844, 13316, 13053, 11522, 10238, 8961, 7936, 5888, 4096, +2048, 511, 2, -2, -1535, -2047, -2051, -2044, -2820, -253, 510, 1025, 1280, 1023, 1, -1280, +-1282, -1276, -1797, -1275, -2564, -3069, -3074, -4095, -4608, -3329, -4607, -5376, -6401, -6143, -6145, -7423, +-6913, -6655, -6657, -6399, -6401, -6399, -7424, -9729, -10750, -11011, -11773, -11522, -11007, -9728, -10753, -10751, +-9473, -6655, -4097, -2559, -1281, -512, 1025, -2, -510, -1, -1024, -3072, -2560, -4096, -5632, -7680, +-8447, -7682, -6910, -4353, -3840, -2559, -1, -1280, 769, -1, 2049, 3327, 4864, 5633, 7422, 7171, +9468, 9476, 12284, 11267, 12287, 13567, 13570, 14846, 13313, 13824, 15104, 14848, 14592, 13312, 13312, 12032, +10240, 7936, 7681, 8958, 7170, 3327, 3071, 2563, 2556, 1284, 765, -1534, -514, -1534, -514, -1535, +-2048, -2304, -513, -1022, -1795, -3069, -5378, -4352, -5374, -4866, -3839, -5120, -4097, -4095, -4608, -5121, +-5631, -6145, -6399, -6656, -7425, -7679, -9217, -8959, -8960, -8448, -6913, -5887, -7681, -6143, -3585, -4351, +-3841, -4863, -3841, -4351, -5633, -5631, -7168, -5634, -4093, -4354, -4351, -2048, -3073, -2047, -1280, -1280, +-1025, -1279, -3840, -3840, -5120, -3585, -5631, -7424, -6912, -5633, -6143, -4353, -2046, -1027, -253, -259, +1026, -256, 3071, 4098, 4605, 6402, 7935, 9985, 9984, 12799, 12545, 14079, 14336, 13313, 12542, 13315, +12541, 11523, 12285, 9474, 8703, 9985, 10495, 12288, 13313, 13055, 13313, 12031, 11008, 9217, 6399, 5377, +3583, 1025, -257, -2047, -3841, -4351, -5120, -4610, -6396, -6149, -4859, -4356, -5118, -5377, -4608, -5886, +-6915, -8190, -7937, -8961, -7677, -9220, -9980, -8963, -8190, -9218, -8190, -7938, -7677, -7427, -8190, -8193, +-5888, -6400, -6399, -5122, -5373, -6147, -6398, -6657, -6912, -7679, -5890, -5118, -5121, -3327, -2050, -2302, +-1026, 769, 257, -2051, 259, -514, 769, -256, -1281, 1, -513, -1790, -1283, -1020, -517, -2044, +-2, 769, 2304, 2047, 2049, 3071, 2050, 3581, 1796, 2300, 4611, 3838, 3841, 6144, 5632, 7935, +6657, 7679, 8705, 8703, 8705, 8447, 9984, 9730, 9725, 9731, 6909, 8451, 7166, 7426, 5117, 5123, +3070, 4609, 3840, 2814, 5892, 5628, 5123, 5118, 5888, 4610, 4606, 3586, 2046, 3841, 2304, 767, +514, -1027, -1532, -2820, -2557, -2307, -2814, -3072, -4353, -5630, -6403, -6653, -7683, -7934, -7168, -7937, +-9982, -10754, -12544, -11006, -10755, -10748, -11268, -9725, -9475, -9725, -9474, -7935, -6401, -7935, -7168, -3584, +-3841, -3327, -2048, -2560, -768, -2560, -3072, -2048, -1792, -2560, -2048, -2560, -1536, -256, -1024, -512, +-1536, 1023, -254, -2, 769, 1280, 1023, -767, 768, 767, 769, 1791, 1793, 1791, 4609, 4607, +4865, 4095, 4864, 5888, 5377, 5119, 7680, 7425, 6910, 7425, 8961, 9469, 9732, 9469, 9217, 9216, +7936, 8448, 7168, 7935, 8194, 6910, 6402, 5375, 5375, 3842, 3326, 3586, 2302, 2818, 1022, 1282, +1278, 770, 254, 258, -1282, -1278, -1282, -1534, -1538, -2046, -2049, -2816, -3840, -3840, -4351, -5377, +-6143, -5121, -6143, -6144, -6145, -6655, -7169, -7934, -6402, -5887, -6145, -4607, -5376, -3584, -4865, -5119, +-4865, -5631, -6400, -6401, -6654, -6915, -7678, -7169, -7167, -6401, -6143, -4353, -3840, -3327, -2561, -512, +-254, -1284, -763, -517, -508, 1021, 2, -513, -512, -1280, -1281, -254, -770, -255, -257, 257, +1791, 1281, 255, 1280, 1026, 1277, 1027, 1789, 2307, 3070, 4610, 3837, 4610, 4097, 5117, 6916, +5883, 6403, 7681, 7165, 7428, 7419, 6660, 7422, 6658, 7166, 6145, 7167, 7681, 6912, 7168, 7168, +6399, 4353, 4607, 5122, 4094, 4097, 3583, 3329, 2815, 1794, 2813, 1539, 766, 512, 2, 764, +517, 508, -254, -1024, -1025, -3072, -2815, -3329, -5375, -5376, -4865, -6912, -6142, -7170, -7167, -7681, +-8703, -8192, -8449, -8959, -9217, -9214, -7939, -8190, -7937, -6911, -6913, -5888, -6399, -5889, -4864, -5375, +-4354, -4092, -3844, -3582, -3584, -3073, -2558, -1794, -767, -257, 258, 509, 1540, 1275, 772, 1278, +1025, 1024, 511, 1025, 767, 513, 1024, 256, 1280, 2047, 1281, 2816, 3072, 3328, 4095, 3330, +2814, 3073, 2816, 2048, 1535, 2818, 3581, 3076, 4093, 4610, 4606, 5633, 4864, 5121, 4350, 4098, +4862, 4353, 4097, 4350, 3842, 3838, 3330, 3327, 3072, 3585, 3070, 3330, 3839, 3328, 3328, 2817, +2558, 2563, 2557, 2305, 1537, 1022, 771, 1277, 1282, 1023, 1281, 511, 0, -255, -257, -255, +-769, -1535, -1793, -1791, -1794, -3069, -2819, -3837, -3587, -4351, -4351, -4866, -5118, -5377, -5888, -6656, +-7168, -7680, -7936, -7679, -7425, -7423, -6914, -6654, -6401, -5631, -5120, -4609, -4608, -4096, -3583, -3585, +-3070, -3331, -2557, -2819, -3069, -2306, -2560, -1534, -1026, -510, 254, 513, 1023, 1538, 1278, 1537, +2048, 1536, 1791, 2049, 2048, 2303, 2306, 2813, 3075, 2302, 2562, 2301, 2563, 2558, 2817, 3072, +2815, 3585, 3073, 3582, 3586, 4094, 4353, 4096, 4353, 4863, 5376, 5376, 5120, 5120, 4353, 4094, +4098, 3582, 3586, 3327, 3584, 3328, 3072, 2561, 1534, 2050, 1534, 1026, 1791, 1280, 1025, 1534, +258, 1279, 512, -255, -1, -256, 257, -2, -254, -1, -512, -1279, -1537, -1280, -1791, -2305, +-2815, -2816, -2818, -3069, -3074, -3583, -3841, -4864, -4607, -4353, -4095, -4609, -4352, -4606, -5123, -5118, +-5632, -5122, -5885, -5634, -4864, -5119, -4609, -4608, -3839, -3842, -2813, -3331, -2814, -2305, -2560, -2046, +-1539, -1534, -2305, -1535, -2048, -2305, -1279, -1793, -1023, -769, -1023, -1, 257, 255, 1025, 767, +1281, 1023, 1280, 1537, 1278, 2051, 2045, 2307, 3068, 3588, 3581, 3587, 3837, 3587, 4092, 4356, +4349, 4354, 4351, 4096, 3328, 4096, 4097, 3325, 4101, 4090, 4613, 5117, 4353, 4353, 4094, 3585, +3072, 2816, 2304, 2048, 1791, 2306, 2046, 1538, 1534, 1281, 1280, 1536, 769, 1279, 768, 768, +513, 510, -252, -772, -1278, -1536, -1282, -1277, -1794, -1792, -1278, -2307, -2556, -2565, -3067, -3332, +-3581, -3585, -3585, -3838, -3842, -3839, -3583, -3842, -3838, -3586, -3327, -3839, -3843, -3580, -3843, -3839, +-4096, -3841, -4094, -4097, -4096, -4096, -3584, -3583, -3329, -2816, -2303, -2306, -2046, -2049, -1791, -1794, +-1790, -1537, -1280, -1279, -770, -1021, -515, -253, -4, 4, 253, 515, 765, 1282, 1022, 1538, +1791, 1792, 1536, 1280, 1792, 1793, 2046, 2306, 3070, 3586, 3582, 3330, 3326, 3842, 3582, 3585, +3584, 3839, 3586, 3326, 3585, 3584, 3072, 3071, 2818, 2813, 2820, 2812, 2818, 2815, 2817, 3071, +2562, 1788, 1796, 1533, 1282, 1279, 1025, 1278, 1027, 1020, 772, 765, 258, 0, -258, -254, +-513, -255, -512, -257, -511, -513, -1278, -1026, -1023, -1280, -1792, -1793, -1790, -2051, -2300, -2564, +-3069, -3075, -3325, -3842, -3839, -3841, -3839, -4097, -3839, -3586, -3838, -3842, -3581, -3588, -3581, -3331, +-3324, -3076, -3068, -2820, -2813, -2818, -3070, -2818, -2814, -2305, -2305, -1790, -1795, -1789, -1026, -767, +-768, -769, -510, -259, 3, -259, 3, 254, 257, 512, 255, 770, 766, 1026, 1534, 2050, +2302, 2307, 2302, 2304, 2561, 2559, 2561, 2559, 2561, 2559, 2562, 2558, 2818, 2813, 2819, 2814, +2817, 2816, 2815, 2306, 2301, 2564, 2298, 2054, 1788, 1794, 1792, 1534, 1282, 1279, 1280, 1281, +1278, 1282, 1535, 1280, 1281, 1022, 1026, 1023, 512, 513, 254, 259, 253, 258, 255, 257, +-1, -511, -513, -1024, -1023, -1025, -1023, -1281, -1535, -1281, -1536, -1535, -1537, -1791, -1793, -1792, +-2047, -2049, -2047, -2562, -2813, -3075, -3069, -3331, -3582, -3585, -3583, -3585, -3328, -3071, -2818, -2557, +-2307, -2047, -2048, -2304, -2048, -2048, -1793, -1791, -2048, -1793, -2047, -1793, -1791, -1792, -1537, -1535, +-1281, -1022, -770, -512, -254, -259, 3, 254, 256, 514, 765, 1026, 1279, 1537, 1536, 1535, +1792, 1794, 2045, 2051, 2046, 2048, 2306, 2557, 2563, 2557, 2562, 2560, 2814, 2820, 2810, 2566, +2556, 2562, 2560, 2303, 2305, 2048, 2047, 1793, 1791, 1538, 1277, 1283, 1021, 1026, 1024, 767, +769, 768, 510, 259, 253, 259, 254, 257, -1, 0, 1, -258, -509, -515, -510, -514, +-510, -513, -511, -514, -766, -770, -766, -1281, -1280, -1280, -1281, -1278, -1538, -1534, -1539, -1533, +-1794, -1791, -1792, -2049, -1791, -2048, -2049, -1791, -2049, -2047, -2048, -2049, -2046, -2307, -2045, -2050, +-1790, -1794, -1790, -1539, -1532, -1284, -1276, -1539, -1791, -1536, -1536, -1281, -1278, -1281, -1281, -1277, +-1285, -1019, -1027, -1022, -770, -511, -512, -255, -257, 0, 0, 0, 257, 256, 510, 771, +764, 1028, 1277, 1539, 1789, 2050, 2047, 2047, 2051, 2301, 2306, 2048, 2046, 2051, 2044, 2052, +2045, 1794, 1791, 1792, 1792, 1793, 1790, 1794, 1534, 1537, 1537, 1278, 1282, 1022, 1026, 767, +512, 512, 512, 512, 513, 511, 512, 256, 256, 0, 257, 255, 0, 1, -2, -253, +-258, -512, -510, -515, -764, -517, -763, -773, -1018, -1285, -1278, -1536, -1537, -1534, -1794, -1792, +-1790, -1794, -1790, -1794, -1792, -1790, -1794, -1790, -1794, -1791, -1792, -1793, -1534, -1538, -1535, -1536, +-1281, -1535, -1536, -1281, -1278, -1283, -1276, -1284, -1022, -1024, -768, -768, -768, -769, -767, -512, +-512, -512, -512, -257, -254, -514, -509, -260, -253, -257, -256, 0, 1, -2, 258, 511, +512, 512, 769, 766, 771, 1021, 1026, 1279, 1281, 1534, 1795, 1789, 1794, 1791, 1792, 1792, +1793, 1535, 1536, 1537, 1533, 1285, 1276, 1283, 1021, 1025, 1025, 1023, 1025, 766, 771, 764, +772, 765, 514, 511, 257, 254, 258, 256, -2, 259, 253, 2, -1, 1, -257, -255, +-257, -255, -514, -508, -516, -510, -512, -513, -511, -511, -515, -508, -772, -764, -771, -1022, +-1025, -1025, -1278, -1281, -1280, -1280, -1281, -1535, -1535, -1538, -1535, -1280, -1281, -1278, -1282, -1279, +-1280, -1280, -1280, -1281, -1278, -1283, -1020, -1027, -1023, -1024, -1024, -1024, -768, -768, -769, -766, +-514, -510, -513, -257, -254, -258, -254, -257, -256, -256, 1, -2, 2, 255, 257, 254, +259, 252, 517, 507, 516, 509, 769, 769, 766, 770, 767, 767, 1025, 1024, 1024, 1024, +1024, 1023, 1282, 1278, 1282, 1278, 1026, 1023, 1024, 1024, 1025, 1022, 771, 764, 772, 509, +514, 511, 511, 514, 510, 258, 254, 257, 256, -1, 2, -3, 3, -2, 1, -1, +1, -257, -256, -254, -259, -252, -517, -508, -514, -511, -768, -769, -767, -768, -769, -767, +-769, -767, -768, -769, -767, -769, -767, -1025, -1022, -1027, -1022, -1025, -1024, -1023, -1024, -1026, +-1021, -1027, -1022, -768, -769, -767, -769, -767, -513, -511, -513, -512, -511, -513, -511, -513, +-511, -513, -511, -513, -511, -513, -510, -515, -509, -515, -510, -257, -256, -255, -257, -256, +0, 0, 0, 257, 254, 258, 255, 513, 511, 512, 512, 513, 511, 769, 767, 768, +769, 767, 768, 769, 767, 768, 770, 765, 770, 767, 769, 767, 770, 509, 515, 510, +513, 512, 511, 514, 254, 257, 255, 257, 255, 258, 253, 259, -3, 3, -2, 1, +0, -1, 2, -3, 4, -260, 4, -260, -253, -259, -252, -260, -252, -516, -509, -514, +-511, -512, -512, -768, -768, -768, -768, -769, -766, -770, -766, -770, -766, -771, -764, -772, +-765, -770, -767, -768, -768, -769, -767, -768, -768, -512, -512, -513, -511, -512, -513, -511, +-512, -513, -254, -259, -253, -258, -255, -256, -256, -256, -256, -1, 1, -256, -257, 2, +-259, -253, -2, 0, 2, -3, 3, -2, 0, 1, 255, 257, 256, 254, 259, 254, +256, 258, 253, 258, 256, 255, 257, 511, 512, 513, 511, 513, 510, 515, 509, 515, +509, 513, 258, 253, 259, 252, 260, 254, 256, 1, -2, 2, 0, -2, 2, -2, +2, -1, 0, 0, 1, -2, 3, -3, 3, -2, 1, -1, 1, -256, -256, -256, +-256, -256, -257, -254, -257, -256, -255, -514, -510, -513, -512, -512, -512, -511, -514, -509, +-516, -509, -513, -512, -511, -513, -512, -512, -511, -513, -510, -515, -510, -513, -511, -512, +-513, -511, -514, -509, -514, -511, -256, -257, -254, -259, -252, -260, -252, -260, -253, -258, +-254, -258, 2, -2, 1, 0, -1, 2, -2, 1, -1, 1, -1, 1, 0, -2, +3, -3, 259, 253, 258, 254, 259, 253, 259, 252, 260, 253, 258, 255, 256, 257, +254, 259, 252, 260, 253, 258, 255, 256, 1, -1, 1, -1, 1, -1, 1, -1, +1, -1, 1, -2, 2, 0, -1, 1, -1, 1, -1, 2, -3, 3, -2, -255, +-256, -257, -255, -256, -257, -254, -258, -255, -256, -257, -254, -259, -253, -259, -252, -260, +-253, -259, -254, -256, -257, -254, -258, -255, -257, -255, -257, -255, -256, -257, -254, -259, +-253, -258, -256, -255, -257, -255, -256, -258, -253, -259, -254, -257, -255, -257, -255, -258, +-253, -259, -253, -260, -252, -259, -254, -257, -256, -256, -256, 0, 0, 0, -1, 2, +-2, 3, -4, 2, 0, 0, 1, -2, 2, -3, 3, -2, 2, -1, -1, 0, +2, -2, 2, -3, 3, -2, 1, 0, -2, 4, -4, 2, 0, -1, 1, 0, +-2, 2, 0, -2, 3, -2, 0, 1, -1, 0, 2, -2, 0, 2, -3, 3, +-1, -2, 4, -5, 5, -260, -253, -258, -255, -257, -256, -254, -259, -253, -259, -253, +-259, -252, -261, -251, -260, -253, -258, -255, -256, -257, -254, -258, -255, -256, -257, -255, +-256, -257, -254, -258, -255, -256, -257, -254, -258, -255, -255, -258, -253, -260, -252, -260, +-252, -259, -254, -257, -257, -254, -258, -254, -258, -254, -258, -254, -257, -257, -254, -258, +2, -2, 1, 0, 0, -1, 1, -1, 2, -2, 1, -1, 2, -2, 1, -1, +1, -1, 2, -3, 3, -2, 0, 1, -1, 1, 0, -2, 2, 0, -1, 1, +-2, 2, -1, 1, -1, 0, 1, -1, 0, 1, -2, 3, -3, 2, 0, -2, +2, -1, 1, 0, -1, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1280, -4608, -8192, -11776, -16384, +-18688, -17664, -14592, -9216, -6657, -2558, 3581, 7427, 14078, 14850, 17150, 16129, 22783, 27649, 27648, 27905, +26366, 25601, 23808, 21248, 19968, 15105, 7421, 1027, -7937, -9473, -13054, -15875, -18173, -18434, -18943, -19456, +-21248, -24833, -25854, -26626, -26111, -23808, -23041, -20990, -22274, -24574, -25090, -22783, -17921, -14846, -13314, -12798, +-9218, -4095, 768, 8191, 13314, 18174, 20482, 21246, 23553, 24577, 26622, 27138, 25854, 24065, 22017, 20990, +19201, 13824, 10240, 7679, 6147, 5627, 4869, 4348, 3075, 3070, 4097, 4351, 4865, 6143, 5121, 4608, +6654, 8707, 8957, 6403, 3325, 1283, -4, -3323, -7941, -12027, -14341, -14844, -16643, -19198, -18944, -19713, +-20223, -21505, -20479, -20481, -22015, -22530, -22526, -22529, -22015, -21506, -20221, -19204, -20221, -17665, -13824, -6912, +-1535, 2813, 6404, 7933, 12033, 16128, 19200, 20991, 22786, 23550, 24834, 24318, 24577, 25088, 25087, 24066, +23549, 22276, 21756, 21251, 20989, 19203, 16638, 11522, 8190, 6657, 4352, 1792, -768, -4864, -9216, -11008, +-13568, -16384, -15617, -15870, -15618, -14847, -15872, -15361, -14335, -12800, -11777, -12798, -13571, -13053, -11267, -9725, +-8194, -8447, -7936, -8706, -9981, -7939, -8189, -7683, -8701, -7682, -8703, -10753, -10240, -8447, -6144, -4096, +-1792, -1281, -1536, 1282, 3325, 6148, 8188, 11267, 13566, 13057, 13312, 15616, 16896, 16896, 17408, 17920, +16641, 17150, 16643, 17661, 18178, 17407, 16384, 14594, 15357, 15107, 13565, 11267, 8701, 7427, 6396, 3077, +-5, -3324, -6147, -9727, -11263, -13826, -17662, -19201, -19968, -17663, -17153, -17920, -20223, -19970, -19709, -18434, +-16640, -15360, -14336, -12288, -11775, -10498, -8191, -6911, -4866, -2814, -2561, -3073, -509, -515, 1026, 1535, +1792, 2305, 2559, 4865, 7678, 8963, 8958, 8192, 8961, 9471, 9472, 9730, 9981, 11266, 10751, 11777, +12543, 10497, 9727, 12032, 12290, 13053, 13314, 13567, 12288, 11778, 12541, 10499, 8444, 6917, 6139, 4101, +4604, 3842, 1791, 513, -2305, -3584, -5631, -6657, -8703, -11521, -12032, -14591, -15361, -16896, -17406, -16388, +-15868, -16130, -15105, -15356, -15365, -14076, -14083, -12797, -12803, -12284, -10500, -9982, -10239, -9731, -7164, -5892, +-3068, -2820, 516, 2301, 3329, 6913, 7678, 8449, 10497, 12029, 12804, 14076, 15619, 15102, 15362, 15357, +12547, 12798, 12289, 10496, 9216, 9471, 8705, 8959, 8193, 7935, 8449, 8703, 7937, 7935, 6656, 4864, +4097, 2815, 3840, 3072, 2560, -255, -2305, -2560, -4352, -4864, -5631, -7681, -8447, -10753, -10495, -12545, +-13568, -13566, -14595, -13053, -13571, -12029, -12034, -12287, -9729, -9216, -10239, -9216, -9473, -9215, -7937, -7936, +-7679, -7170, -8189, -7682, -4096, -4607, -3841, -2559, -257, 1793, 3071, 5633, 6656, 7167, 9985, 11007, +12288, 13057, 13312, 12543, 12289, 13311, 12289, 13055, 11265, 12288, 11008, 9472, 11519, 9474, 9726, 6914, +8447, 7680, 5376, 6145, 5118, 3586, 2303, 1535, 1027, 765, 259, 253, -1791, -3071, -4098, -5373, +-4867, -7678, -6145, -8449, -10751, -11520, -11008, -12800, -13569, -13823, -14592, -13312, -12544, -13057, -12286, -12546, +-11518, -9986, -9727, -9471, -9987, -8957, -7426, -5375, -4096, -4864, -2817, -1790, 254, 1537, 3328, 5632, +5888, 7681, 8958, 9473, 9728, 11264, 11520, 12032, 12800, 12032, 10240, 11008, 12032, 11008, 10496, 8960, +9215, 9986, 10749, 10499, 8958, 8448, 6913, 7166, 6146, 6144, 4350, 4099, 3837, 1538, 1791, -255, +-1025, -2815, -4864, -5889, -7423, -7170, -9469, -8195, -8957, -10498, -9984, -10751, -11266, -12029, -12034, -12543, +-10753, -11520, -10239, -10497, -10751, -10753, -9216, -8192, -7168, -7936, -7936, -6655, -6146, -6397, -4612, -4605, +-1793, 1280, 1793, 3327, 3327, 4610, 5887, 8704, 9216, 9984, 10240, 10241, 11007, 11008, 11264, 10497, +10239, 9473, 9727, 9728, 9473, 8447, 8705, 7422, 6915, 6396, 7173, 5371, 5379, 5375, 4863, 3331, +4349, 3073, 2304, 2303, 770, 254, -1278, -2050, -3071, -3072, -2817, -5374, -6657, -7168, -8192, -9217, +-9726, -10754, -10494, -10498, -11006, -11010, -10750, -9218, -9470, -8961, -7680, -9727, -8450, -7166, -6657, -5888, +-5376, -5632, -5376, -3328, -3583, -2819, -3837, -2818, 258, 1535, 2559, 1538, 1789, 4356, 5117, 7681, +7937, 8189, 7939, 10494, 9217, 9728, 10496, 8703, 9473, 9727, 8961, 9472, 6400, 6399, 6402, 7677, +6659, 5887, 5631, 4354, 5630, 4608, 3842, 4862, 2817, 2304, 2303, 2561, 1024, 768, -769, -1278, +-2307, -4861, -5377, -5121, -6911, -6912, -7169, -8702, -9219, -10237, -10498, -10495, -10240, -10497, -9983, -10240, +-10497, -9470, -8706, -8191, -7424, -6656, -7168, -6656, -4352, -4864, -3583, -3074, -3582, -1793, -512, 512, +1537, 3070, 3075, 4349, 5377, 6913, 5886, 6914, 7422, 7937, 8448, 7936, 8703, 8194, 8445, 6915, +7421, 7682, 6400, 5631, 6401, 6142, 5635, 4605, 3842, 4351, 3584, 4352, 4353, 4350, 4355, 2300, +3076, 3580, 1540, 1789, 1794, 766, 514, -258, -766, -1794, -3326, -4353, -4865, -5374, -6402, -7166, +-6913, -7424, -8448, -8703, -8962, -8957, -8964, -8699, -8709, -8444, -9219, -8446, -8448, -7937, -7423, -7169, +-6144, -5375, -5889, -4862, -3587, -2557, -1794, -2304, -1278, 1277, 1795, 3070, 4353, 5120, 6911, 6401, +8191, 7170, 7933, 9476, 9467, 9477, 9212, 8450, 7935, 7681, 7167, 7681, 6399, 6144, 5121, 5631, +5377, 3583, 3840, 3585, 2303, 769, 1535, 1536, 1025, 511, 1, -769, 769, -2, -1021, -1283, +-1533, -2051, -2558, -2561, -4352, -3327, -4354, -4350, -4610, -5373, -6660, -6908, -6916, -7420, -6915, -7166, +-6146, -6910, -5634, -6398, -6657, -5120, -6144, -5888, -5376, -4607, -4865, -4864, -4863, -3841, -3583, -2305, +-2303, -1537, -1023, -1, 256, 1025, 2046, 2818, 4607, 4608, 4608, 5888, 7168, 6657, 6910, 7171, +7164, 7429, 8443, 6660, 7677, 8194, 6656, 6911, 6401, 5375, 5121, 5888, 5119, 4610, 3837, 4099, +3582, 1537, 1536, 1023, 1537, 0, 511, 257, -1537, -1791, -2560, -3585, -3839, -4610, -4605, -5379, +-5886, -6657, -6143, -6402, -6397, -6404, -6908, -7171, -6653, -6147, -6141, -5891, -5886, -5632, -5121, -5118, +-4098, -4607, -3583, -3587, -3836, -3331, -3070, -2561, -2047, -1282, -765, -515, -765, 253, 514, 1534, +2051, 2813, 3330, 3583, 4352, 5121, 5118, 5635, 5629, 5635, 6141, 5634, 5632, 6143, 6401, 5887, +5633, 4608, 5119, 5377, 4607, 5378, 3582, 3585, 3839, 3841, 3584, 3071, 2305, 2814, 2051, 1533, +1026, 255, -512, -767, -1282, -1790, -2305, -3071, -3841, -4351, -4610, -5629, -5891, -5885, -6403, -5886, +-6145, -6656, -6143, -5889, -5887, -6145, -5631, -5634, -5629, -5122, -5375, -4608, -4354, -3581, -3587, -3325, +-2563, -2814, -2049, -1535, -1282, -766, -769, 1, 255, 1024, 1792, 2305, 3327, 3073, 3582, 4098, +4606, 5123, 5884, 5636, 5373, 5889, 5633, 5373, 5380, 5373, 5122, 4607, 4863, 4098, 4351, 4352, +3329, 3327, 3583, 3075, 2556, 2564, 2557, 2562, 1279, 1281, 766, 770, -1, -256, -255, -769, +-1280, -2047, -2562, -3070, -3073, -3584, -3839, -4866, -5118, -4609, -4608, -5119, -5121, -5375, -5890, -5885, +-5379, -4606, -5120, -4866, -5118, -4609, -4608, -4095, -4610, -4094, -2818, -3582, -3073, -2816, -2048, -1792, +-1279, -770, 2, 255, 768, 1025, 1790, 2305, 3072, 3329, 3327, 3584, 4608, 4351, 4611, 5117, +4866, 4863, 5376, 4864, 5122, 4861, 4355, 4605, 4354, 3839, 3585, 4096, 3326, 3587, 3581, 2818, +2559, 2561, 2815, 2049, 2047, 1280, 1026, 766, 1, -256, -514, -765, -1793, -2049, -2814, -3587, +-3326, -3840, -4608, -4097, -5118, -4866, -4608, -5118, -5122, -4863, -5119, -4867, -5117, -4610, -4606, -4098, +-4350, -3842, -3582, -3842, -3582, -3330, -2814, -2561, -2305, -1790, -1538, -1278, -1026, -510, -2, 258, +766, 770, 1790, 2050, 2303, 2559, 3074, 3326, 3841, 3841, 3837, 4099, 3838, 4097, 3840, 3839, +3841, 3584, 4096, 3584, 3583, 3842, 4094, 3073, 3073, 3325, 2819, 3071, 2815, 2562, 2557, 2307, +2046, 1538, 1790, 1537, 767, 769, 255, 2, -514, -1534, -2307, -2557, -3074, -3326, -3841, -4608, +-4352, -4351, -4867, -5116, -4611, -5118, -5121, -4865, -4606, -4866, -4605, -4868, -4604, -4099, -4094, -3586, +-3325, -3587, -2813, -2307, -2302, -1793, -1280, -1023, -769, -512, 1, 766, 770, 1023, 1536, 1537, +1790, 2050, 2814, 2563, 3324, 3332, 3068, 3588, 3837, 3842, 3581, 3844, 3324, 3332, 3325, 3328, +3330, 3070, 3074, 2559, 2304, 2559, 2562, 2303, 2305, 2047, 2304, 1792, 2304, 1537, 1279, 2048, +1536, 1024, 512, 512, 0, -257, -511, -1280, -1537, -2046, -2562, -2559, -3073, -3583, -3840, -3840, +-4096, -4097, -4351, -4864, -4609, -4606, -4610, -4863, -4608, -4353, -4095, -3840, -3841, -3583, -3584, -3329, +-2814, -2307, -2045, -1794, -1278, -1025, -768, 0, 0, 257, 766, 1026, 1791, 1792, 2304, 2561, +2302, 2819, 2812, 3331, 3583, 3584, 3329, 3839, 3584, 3584, 3327, 3330, 3327, 3328, 3071, 2562, +3069, 2820, 2300, 2306, 2048, 1791, 1794, 1534, 1538, 1022, 1282, 1278, 770, 767, 769, 255, +1, -2, -253, -515, -765, -1283, -1277, -2052, -2299, -2053, -2555, -3076, -2814, -3073, -3327, -3328, +-3841, -3583, -3585, -3839, -3840, -4096, -3841, -3583, -3585, -3583, -3327, -3330, -3071, -2561, -2303, -2048, +-2049, -1790, -1539, -1276, -1285, -507, -260, 2, 513, 509, 1028, 1276, 1539, 1790, 2049, 2305, +2302, 3074, 2814, 3074, 3326, 2818, 3070, 3074, 3071, 3328, 3072, 3072, 3073, 2558, 2818, 2814, +2306, 2303, 2303, 1793, 1792, 1791, 1538, 1278, 1281, 1279, 1025, 767, 770, 253, 259, 254, +-256, -510, -771, -1277, -1282, -1535, -2305, -2047, -2304, -3073, -3071, -3072, -3329, -3327, -3328, -3329, +-3070, -3330, -3583, -3328, -3329, -3070, -2818, -3071, -2816, -2561, -2559, -2304, -2305, -2047, -2048, -1537, +-1278, -1026, -1023, -768, -512, 0, 1, 510, 770, 766, 1283, 1276, 1796, 1789, 2049, 2305, +2302, 2561, 2816, 2816, 2816, 3072, 2816, 3071, 2818, 2559, 2560, 2305, 2302, 2306, 2047, 2049, +1791, 1793, 1790, 1539, 1533, 1283, 1022, 1024, 1025, 767, 769, 512, 510, 259, -3, 3, +-771, -510, -770, -1277, -1539, -1533, -1795, -2046, -2305, -2304, -2304, -2815, -2817, -2815, -2818, -2814, +-3074, -3069, -2819, -2814, -2817, -2816, -2559, -2561, -2816, -2560, -2304, -2303, -2049, -1792, -1792, -1536, +-1536, -1280, -1024, -512, -256, -1, 258, 509, 772, 1020, 1284, 1531, 1798, 1786, 2053, 2300, +2563, 2302, 2306, 2558, 2561, 2559, 2561, 2560, 2560, 2559, 2305, 2047, 2305, 2048, 1791, 1793, +1791, 1537, 1279, 1538, 1277, 1027, 1021, 771, 509, 515, 510, 257, -1, -255, -257, -511, +-512, -1025, -1279, -1024, -1537, -1534, -1538, -1790, -2050, -2046, -2050, -2303, -2047, -2306, -2302, -2306, +-2559, -2560, -2304, -2304, -2305, -2303, -2304, -2304, -2304, -2305, -2047, -1792, -1793, -1790, -1539, -1533, +-1282, -1279, -769, -767, -513, -511, 0, 255, 257, 767, 769, 1280, 1536, 1535, 1793, 1792, +1791, 2306, 2302, 2305, 2304, 2304, 2304, 2304, 2304, 2303, 2307, 2300, 2308, 2301, 2050, 1791, +1793, 1535, 1537, 1279, 1280, 770, 1021, 771, 510, 512, 257, 255, 1, -256, -257, -511, +-769, -1022, -1283, -1277, -1538, -1791, -1792, -1792, -2049, -2046, -2051, -2044, -2052, -2045, -2306, -2046, +-2306, -2302, -2050, -2046, -2049, -2048, -2048, -1792, -1536, -1535, -1539, -1533, -1538, -1535, -1280, -1024, +-1026, -764, -772, -765, -514, -256, -254, -2, 257, 256, 510, 772, 1020, 1027, 1278, 1537, +1537, 1534, 1794, 1790, 2049, 2049, 2045, 2052, 2045, 2049, 2048, 2047, 1793, 1792, 1791, 1793, +1536, 1535, 1282, 1277, 1283, 1022, 1025, 768, 511, 514, 510, 258, -2, 1, -256, -256, +-256, -512, -768, -1024, -1025, -1278, -1538, -1534, -1793, -1792, -1792, -2048, -2047, -2050, -2045, -2307, +-2046, -2050, -2046, -1794, -1790, -1793, -1793, -1790, -1794, -1534, -1537, -1537, -1279, -1280, -1280, -1023, +-1027, -765, -770, -510, -513, -257, -254, -1, 0, 257, 254, 514, 511, 767, 1027, 1020, +1028, 1277, 1281, 1537, 1534, 1538, 1791, 1792, 1792, 1792, 1792, 1792, 1537, 1790, 1538, 1534, +1538, 1278, 1283, 1277, 1282, 1023, 1024, 769, 767, 768, 513, 254, 258, -2, 2, -1, +-256, -513, -766, -770, -765, -1027, -1023, -1279, -1538, -1533, -1539, -1533, -1795, -1790, -1793, -1791, +-1793, -1791, -2049, -1791, -1793, -1791, -1537, -1536, -1534, -1539, -1533, -1282, -1280, -1279, -1025, -1279, +-1024, -768, -768, -769, -511, -512, -512, -256, -1, 2, 254, 258, 509, 771, 766, 769, +1023, 1025, 1280, 1279, 1282, 1276, 1285, 1533, 1537, 1535, 1538, 1533, 1284, 1276, 1282, 1280, +1279, 1282, 1277, 1027, 1022, 1025, 768, 767, 770, 765, 516, 507, 261, 252, 259, 254, +1, 0, -256, -257, -511, -768, -769, -1022, -1026, -1023, -1281, -1279, -1537, -1535, -1537, -1535, +-1538, -1533, -1540, -1531, -1541, -1533, -1537, -1536, -1535, -1281, -1280, -1279, -1281, -1279, -1025, -1023, +-1025, -767, -769, -767, -513, -511, -513, -256, -256, -255, -2, 3, -4, 259, 255, 512, +512, 769, 767, 768, 1025, 1022, 1282, 1024, 1279, 1280, 1025, 1278, 1282, 1279, 1280, 1025, +1023, 1281, 1022, 1027, 1020, 1029, 1020, 771, 765, 770, 767, 770, 509, 516, 506, 263, +250, 261, -4, 2, -257, -255, -257, -510, -771, -764, -772, -1021, -1025, -1280, -1280, -1279, +-1538, -1534, -1537, -1536, -1536, -1536, -1536, -1536, -1535, -1539, -1532, -1284, -1276, -1283, -1279, -1280, +-1024, -1024, -768, -768, -768, -768, -512, -513, -510, -257, -256, 0, 0, 256, 257, 254, +259, 508, 516, 509, 770, 768, 766, 770, 766, 771, 1021, 1027, 1020, 1028, 1021, 1026, +1022, 1026, 1022, 771, 764, 771, 766, 770, 766, 770, 766, 770, 766, 514, 510, 514, +511, 255, 259, 252, 4, -3, -255, -255, -258, -254, -514, -510, -514, -766, -770, -1022, +-1026, -1022, -1282, -1278, -1281, -1281, -1278, -1538, -1277, -1284, -1533, -1282, -1278, -1281, -1281, -1279, +-1281, -1022, -1026, -1022, -1027, -765, -771, -765, -514, -510, -514, -255, -257, 1, 0, -1, +258, 254, 258, 510, 513, 512, 513, 766, 770, 766, 770, 767, 768, 768, 768, 1024, +1024, 768, 769, 766, 770, 766, 770, 768, 766, 514, 511, 512, 513, 510, 514, 511, +513, 254, 258, 254, 258, 255, 0, 0, 0, 0, -256, -256, -257, -510, -514, -510, +-514, -767, -767, -770, -1022, -1026, -1022, -1026, -1277, -1027, -1277, -1283, -1278, -1280, -1281, -1022, +-1027, -1021, -1026, -1023, -1024, -1025, -767, -769, -767, -769, -767, -513, -511, -513, -255, -257, +-255, -1, 1, 0, -1, 258, 253, 259, 510, 513, 512, 511, 769, 767, 770, 765, +770, 767, 768, 769, 767, 768, 769, 767, 767, 771, 508, 516, 510, 512, 513, 510, +514, 255, 257, 255, 257, 255, 256, 257, 255, 0, 1, -2, 2, -257, -256, -255, +-257, -513, -510, -514, -510, -769, -768, -768, -768, -768, -768, -1024, -1024, -1024, -1023, -1025, +-1024, -1024, -1024, -1024, -1023, -1026, -1022, -1026, -766, -770, -766, -770, -766, -514, -511, -511, +-514, -254, -258, -254, -258, 3, -4, 4, -4, 260, 253, 258, 255, 511, 514, 511, +512, 513, 510, 514, 511, 512, 513, 511, 513, 511, 513, 512, 511, 514, 509, 515, +510, 513, 513, 509, 260, 251, 261, 252, 259, 254, 258, -3, 3, -3, 3, -3, +3, -259, -254, -257, -256, -512, -511, -514, -510, -513, -769, -766, -770, -766, -770, -766, +-770, -766, -770, -765, -772, -763, -773, -764, -770, -768, -767, -769, -768, -767, -770, -765, +-515, -510, -514, -510, -512, -257, -256, -256, -256, 1, 0, -2, 2, -2, 258, 255, +257, 254, 258, 510, 514, 511, 512, 512, 511, 514, 511, 512, 512, 512, 512, 513, +510, 515, 509, 258, 256, 255, 257, 256, 255, 257, 256, 254, 260, -4, 3, -2, +1, -1, 2, -2, -255, -255, -259, -252, -260, -252, -260, -509, -514, -511, -512, -513, +-511, -512, -768, -769, -767, -768, -768, -767, -770, -766, -769, -767, -769, -768, -767, -513, +-511, -513, -512, -512, -512, -512, -511, -513, -256, -256, -256, -255, -257, -256, 1, -1, +1, -1, 1, 254, 259, 253, 259, 253, 258, 255, 257, 255, 512, 513, 511, 513, +511, 512, 513, 511, 513, 255, 257, 255, 257, 256, 255, 258, 252, 261, 252, 3, +-3, 2, -1, 1, -2, 3, -4, 5, -261, -253, -257, -257, -253, -260, -253, -257, +-257, -509, -516, -509, -513, -512, -511, -513, -513, -509, -515, -510, -513, -512, -511, -512, +-513, -512, -510, -515, -509, -514, -512, -511, -512, -514, -509, -260, -252, -259, -254, -257, +-257, -254, -2, 1, 1, -2, 2, -2, 1, 256, 257, 254, 257, 256, 256, 256, +256, 256, 256, 255, 258, 254, 258, 254, 257, 255, 258, 253, 260, 252, 259, 254, +256, 258, -3, 4, -4, 4, -4, 2, 0, -1, 1, 0, -1, -255, -257, -255, +-257, -254, -259, -253, -258, -255, -255, -515, -508, -517, -506, -517, -509, -513, -513, -510, +-513, -512, -512, -513, -510, -513, -512, -512, -513, -511, -512, -512, -256, -256, -257, -255, +-256, -256, -257, -254, -259, -252, -260, 3, -2, 2, -2, 1, 0, -1, 3, -4, +4, -4, 259, 255, 255, 259, 251, 261, 253, 257, 256, 255, 257, 256, 255, 258, +253, 259, 253, 3, -2, 2, -3, 3, -2, 1, 1, -2, 2, -2, 2, -2, +3, -4, -252, -259, -254, -257, -256, -255, -257, -256, -254, -260, -250, -263, -250, -260, +-254, -512, -257, -511, -513, -512, -511, -513, -255, -258, -253, -260, -251, -261, -252, -259, +-255, -255, -258, -253, -259, -254, -258, -253, -260, -251, -261, -252, -3, 2, -1, 1, +-1, 1, -1, 1, -1, 1, -1, 1, 0, -2, 2, -1, 0, 1, -2, 2, +-1, 0, 1, -2, 3, -3, 3, -4, 5, -5, 4, -3, 2, -1, 0, 0, +0, 1, -2, 2, -2, 2, -1, -255, -258, -254, -257, -255, -257, -256, -256, -256, +-255, -257, -256, -256, -255, -258, -253, -259, -254, -257, -256, -256, -254, -259, -254, -257, +-256, -255, -256, -257, -256, -254, -260, -251, -260, -254, -257, -255, -258, -253, -259, -254, +-257, -256, 1, -1, 0, 1, -2, 2, 0, -2, 3, -3, 1, 1, -2, 3, +-3, 2, -2, 1, 1, -2, 3, -4, 4, -4, 4, -3, 2, -2, 2, -2, +3, -4, 4, -4, 3, -2, 2, -2, 1, 0, -1, 2, -2, -255, -257, -255, +-257, -255, -256, -257, -255, -257, -256, -254, -259, -253, -258, -256, -254, -258, -256, -254, +-259, -253, -258, -256, -255, -256, -257, -255, -258, -253, -258, -254, -259, -253, -259, -252, +-259, -255, -255, -258, -254, -256, -259, -251, -5, 4, -2, -1, 3, -3, 3, -3, +2, -1, 1, -1, 1, -1, 1, -2, 2, -1, 1, -1, -1, 2, -1, 0, +1, -3, 4, -3, 1, 1, -2, 2, -2, 1, 1, -2, 2, -3, 3, -2, +2, -3, 3, -2, 2, -258, -255, -256, -255, -258, -254, -258, -255, -256, -256, -256, +-256, -257, -254, -259, -252, -259, -255, -256, -256, -256, -256, -256, -257, -254, -258, -254, +-258, -254, -258, -255, -255, -258, -253, -260, -253, -257, -256, -255, -2, 2, -1, 0, +1, -2, 3, -3, 3, -3, 3, -3, 2, 0, -1, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4608, 3840, -9216, -4607, +-5890, -17150, -18690, -20735, 1024, 12545, 509, 2051, 15614, 2049, 5376, 13311, 2817, -4096, -5888, -1024, +17664, 15103, 6402, 4606, -1277, 1277, 7682, 4094, -1278, -8962, -1534, 9983, 22015, 18179, 1788, 3, +1535, 2048, 5120, -5887, -10242, -12030, -13314, -7678, -11265, -9472, -6400, -8705, -12542, 3326, 10498, 3582, +-10751, -12287, -11778, -10750, -11010, -3582, 254, 4355, 11260, 14084, 8701, -767, 257, -2562, -510, -2305, +6400, 6144, 9473, 5118, 5123, 3069, -7678, -12801, -15359, -8449, -3840, -2559, 255, 1537, -6913, -10240, +-3583, -513, -6655, -5889, 513, -1794, 7682, 21248, 8958, -7933, -3332, 1284, 509, 6146, 13055, 13824, +6401, 2558, 7427, -771, -12542, -13825, -8447, 2559, 5120, 7169, 4863, 2049, -4097, 1024, -255, 7167, +7169, -3841, -2303, 4863, 4353, 5630, 4611, -2051, -7166, -6912, -2306, 259, -515, -1533, 253, 1028, +-5, -3068, -6146, -5631, -5889, -4608, -4351, -1793, -3583, -6913, -10241, -4093, -770, 257, -1025, -1024, +513, 256, -4609, -2559, 5630, -1022, 6912, 7678, 2051, -771, -1534, -1537, -768, 256, 769, 7167, +6913, 4351, 512, 513, 3582, -509, 8702, 5888, 1537, 5118, 1795, 766, -4096, -3327, -3330, -2045, +-1539, 2, 7424, 2302, 1284, -262, -506, -2564, -5630, -10240, -6146, -3326, 2559, 3072, 1538, -3587, +-2558, -3329, -2304, -1790, -5124, -6139, -262, 2310, 4347, 5123, 2814, -1022, -2050, -6142, -4610, 1537, +512, 768, 4864, 6912, 3840, 512, 3328, 1280, 2048, -768, -512, 1024, 0, -1535, 1022, 1794, +1534, 3842, 3839, 2817, -1282, -5630, -5890, -765, -3331, -510, -514, 770, -1, -511, -4098, -5886, +-4609, -256, -255, -2, -1533, 1788, 3076, 2812, 1285, 4859, -1020, -3331, 2, -2049, -3071, -3073, +-511, 2559, 4352, 4353, 2046, -4093, -4100, 1540, -1027, -510, 2303, 1024, 1025, -3329, -767, -1537, +-767, 1023, 1, 1536, 3071, 5121, 1535, -1535, -3328, -1024, -4609, -1535, -4608, -2305, -510, -1795, +3587, -1026, -3328, 3329, -2049, -3840, -2303, -2306, 259, 2301, 3074, 9727, 4097, -2049, 769, 511, +-1535, -1281, -2815, 1022, -1534, -1281, 3329, 4350, 259, -260, -764, -3586, 0, 4097, 3582, 770, +2816, 255, 1537, 1791, 1536, -3582, -4099, -1021, 766, 512, -1535, -1281, -2047, -8448, -1793, -3839, +-1536, -4609, -1277, 1532, -1788, -2819, 2, 511, -1279, 766, 1283, 3581, 1539, 3325, -510, -513, +1792, 769, 1791, 0, 2049, 2814, 3586, 2559, 3327, 3842, -1282, -510, -1794, -1279, -2304, -2561, +513, -1, 1026, -1027, 260, -2564, -2557, -513, -256, 3329, -2561, -1280, 1537, 1535, -767, -513, +512, -1535, 254, -766, -1793, -1280, -511, -2, 2050, 2303, -3328, 257, 2559, 1280, 257, 3070, +-1534, 768, 3070, -3069, 2813, 1282, 1279, -512, 1025, -257, 769, 1791, 1280, 1, 767, -1279, +-1024, 1023, -2815, -257, 4353, 512, -1281, -2303, -2049, -1536, -2558, 2044, -3067, -2565, 772, -1027, +-254, -1025, -2047, -1794, 1794, 511, 769, 2815, 513, -257, 768, 2, 508, -1530, 3065, -762, +251, 516, -771, 3, -259, 514, 1023, -255, -2, -1533, 765, 259, 1277, 258, -2050, 3, +-515, -1534, 1535, 1024, -512, 1025, -514, 515, 765, -510, -1025, -512, -767, -513, -511, 512, +511, 769, 767, -1279, -256, -1, 513, -1537, 257, 0, -513, 1281, 254, 1027, -3, 515, +1021, 514, -258, 258, -1537, -1023, -1026, 514, 254, -765, -1794, 0, -1278, 253, 1026, 1023, +-255, -257, -1022, -3, 258, -513, 257, 1023, 1281, 255, -1023, -257, 258, -772, -251, -4, +-253, -514, 513, 511, -1023, -1, -767, 256, 511, 1, 255, -1279, -1280, -513, 257, -1, +-254, 766, -255, 768, -513, -767, 0, -512, -1024, 255, 770, 510, 1282, 255, -1, 514, +-770, -1022, -1026, -1791, -768, -256, 768, 1024, 255, 514, 510, -1278, -2, -254, -1281, -257, +1794, -259, 1028, -3, -767, 256, -1, -1278, -258, -255, -1024, 511, 770, -771, -253, -514, +-512, -1279, -1281, -511, -769, 0, 257, 255, 513, -1, 1, -256, -257, -255, 766, 516, +-1029, 773, -260, -254, 0, -769, -512, -511, 255, 1025, -513, 256, 0, -767, -257, -257, +-510, -770, -510, -769, -768, -1, 3, -4, 5, -517, -252, -259, -253, -515, -766, -257, +0, 1, 767, 0, -256, 1, -514, -253, -260, -508, -770, 1, 511, -512, 1, -257, +-767, -512, -257, -254, -259, 3, -259, 515, 253, 3, -3, -509, -771, -254, -257, -256, +1, -2, 258, -513, -1, -254, -514, -511, -255, -259, 3, -257, -1, 3, -4, -508, +-259, 1, -256, 0, -255, -258, 1, -256, 0, -256, -512, 0, -257, -254, -3, -253, +-1, -1, 1, -256, -1, 2, -513, -1, -254, -258, 2, -2, -254, -259, 3, -257, +-257, 2, -3, 3, -2, 1, 0, 0, -1, -255, -256, -257, 2, -258, -256, -254, +-2, 1, -256, 0, -1, 2, -2, -255, 1, -2, -255, 0, -1, 2, -258, -255, +0, 0, -1, 1, -257, -255, 0, 0, -258, -253, -259, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1024, 767, -1022, 1022, -1790, +2558, -8190, 8701, -6140, 5884, -3325, -8705, 5888, -4864, 13056, -7681, 7682, 1023, 9984, -9216, -3072, +-1024, -5120, 20224, -6144, -4864, -2048, 5376, 256, -6911, 5887, 513, 3071, 1792, -4350, -9475, 260, +4604, -4350, -2560, 6655, -5887, 1280, 2047, -2559, 768, -1282, 3332, -7684, -1277, 4350, -5375, 3071, +1538, 510, -4095, 8961, -259, 1795, 5630, 513, -1024, -3840, 5376, -4353, 4865, -1025, -4863, 4352, +-6145, 3585, -9985, 4608, -255, 767, -1280, 257, -2306, -1789, -1539, 3585, -2559, 8446, -2045, -4356, +4099, -1, 5888, 1, 5631, -7425, 258, -3586, -1022, -5889, 3839, 2562, -2051, 1539, -2819, -5884, +2299, 1285, -3076, 258, 3840, 2303, -4607, 8705, -2563, 1027, 1277, 3075, 1790, -5374, 6141, -9726, +5375, -5888, 5890, -3331, 4354, -2050, -1534, -1281, 1024, -3840, 3328, 5377, -3585, 768, -1536, 2048, +-4351, 5374, -5118, 3582, -3838, 3583, -3841, -3070, -2, -5118, 1279, 1024, 1, -3585, 5888, -1535, +1535, -1534, 7677, -5630, 5375, 1024, -255, -1281, 1280, -511, -2049, 2048, -3584, 1281, -4609, 3329, +-7682, 2306, 2047, -2048, -767, 765, -3836, -771, 2817, 0, -768, -2049, 4610, -5378, 5633, -256, +255, -1278, 4350, -1791, -4096, 1535, 1, -4096, 2304, -1281, 258, 509, 3588, -2052, -3068, 5116, +-2300, 764, 2563, 2815, -3329, 2, 2301, -2813, -259, -765, -258, -2304, 4866, -3843, -5374, 3840, +-2817, 1282, -1026, 2048, -3071, 3072, 255, 1281, -3330, 3331, 1021, -2813, 4093, -2302, -1281, -767, +-1793, -3071, 1279, -255, 1023, -1023, 1791, -3327, -3585, 3585, -2049, -1279, -1281, 3074, -2819, 1539, +510, 1537, -2560, 6143, -3839, 0, -257, 1025, -3841, 1025, 4351, -9216, 4865, 767, 2048, -5887, +6910, -5373, 1021, 2306, -2049, -1280, -1279, 3327, -5375, 4095, -1024, 513, -769, 4865, -6401, 2560, +-3327, 2558, -4349, 509, 2561, -4863, 3326, 1283, -2562, -513, 2306, -3842, 2051, 766, 1537, -5122, +3073, 1025, -2305, -767, 4607, -4352, 513, 3326, -5374, -1, 1024, 3841, -6401, 4864, -2815, -770, +-254, 2814, -4861, 2302, -1537, 2562, -6402, 5121, 257, -5378, 6145, -3071, 1022, -1791, 3840, -5889, +3330, -3074, 3330, -3330, 3073, 0, -2304, 2816, -2048, 0, 768, 1280, -1279, 766, 514, 510, +-6398, 8191, -6144, 1792, -256, -255, -1537, -1792, 4864, -4351, -1, 3073, -2049, -1279, 3327, -3583, +-1281, 1281, 3328, -4097, 3073, -1025, -767, -1024, 3583, -2303, 256, 2815, -3070, 2557, -1022, 768, +-3329, 2049, 2048, -3330, 1795, 1278, -1792, -2558, 1788, 1029, -3588, 3330, 256, -4354, 2307, 765, +-1789, -258, 1793, -4096, 1278, -509, 1534, -3838, 2302, 2049, -3074, 1027, 3070, -5119, 2304, 1023, +-3839, -769, -255, 2048, -5889, 6145, -1537, -2815, 256, 3327, -3071, 255, 1281, -1793, -255, 2304, +1280, -2561, 3073, -1024, -2049, 514, 4094, -6655, 3584, -769, -767, -1792, 0, 2303, -5374, 6654, +-3838, 1278, -1790, 2559, -1536, -2560, 3841, -2306, -1533, 3068, -2556, -3, 2306, 1279, -4352, 2304, +1025, -2305, -512, -255, -3, -3835, 5115, 4, -3843, 3842, -257, -1536, 768, 256, -2048, 0, +4097, -3842, -767, 3584, -4609, 770, -514, 3073, -5120, 767, 3329, -4865, 1025, 2559, -2047, -769, +3585, -514, -2301, 3069, 3, -3843, 2818, -257, 769, -2561, 5120, -3839, -2049, 2048, -1535, -1538, +515, 3069, -5117, 2044, 2308, -3331, 1538, 256, 255, -1280, 3073, 511, -4608, 4097, 766, -3069, +1789, -254, -1538, -2046, 3583, -4096, 0, 1792, -1280, -2815, 1022, 1026, -3330, 3330, 1535, -6401, +3842, -514, 513, -1536, 1023, 2049, -3840, 4863, -766, -2308, 774, 2809, -3320, -519, 3076, -3842, +1, 1023, 514, -2562, 1793, 2048, -3074, 2307, 1790, -4351, 512, 2559, -1023, -2304, 3839, -3326, +-3587, 5124, -2564, -765, -1026, 2817, -3840, -257, 3585, -3585, -767, 4095, -1279, -2304, 1790, 515, +-2051, 770, 2304, -3330, 1027, 1277, -1022, -2561, 4096, -2558, -1540, 2565, -773, -1020, -1026, 2304, +-3583, -257, 3840, -3071, -257, 2816, -767, -1538, 258, 2814, -5117, 3325, 2, -2818, 1794, 255, +-1278, -2308, 3075, -1537, -1792, 2818, -772, -1532, 764, 1028, -2819, 2, 3071, -2047, -514, 3331, +-1284, -2556, 2558, 1280, -3583, 2814, 2, -2305, 769, -514, 514, -4098, 5122, -3073, -2304, 2560, +-1280, -768, 768, 2305, -2818, 770, 2559, -2048, -256, 2048, -1280, -511, -2, 1538, -3842, 514, +1535, -2560, 1536, -511, -513, -2047, 2814, -509, -1796, 2565, -261, -2044, 1022, 768, -1023, -770, +2818, -3329, 1, 1534, -1790, -514, -254, 1791, -4864, 4097, -1537, -768, 0, 2305, -2049, -1279, +2815, -1792, 1, 1023, 769, -2305, 2048, 1, 254, -1789, 4093, -4351, 512, 1793, -2563, -251, +250, 1284, -4352, 2301, -508, -260, -1021, 2303, -2049, -510, 1278, -511, -2047, 1789, 772, -2564, +2052, -260, 4, -2052, 3331, -3586, 1281, 256, 0, -1281, 513, 1791, -3839, 2815, 1, -2048, +1023, 768, -766, -1283, 1795, -257, -2562, 2564, -1540, -1278, 512, 767, -1535, -768, 2047, -2048, +-254, 1277, -253, -1026, 1024, 258, -1538, 1025, 1280, -2561, 1538, -1, -257, -1534, 2302, -2303, +-512, 1535, -766, -514, -254, 1277, -2557, -770, 2306, -2305, 0, 1279, -766, -770, 770, 511, +-2049, 1281, 768, -1793, 1282, 254, 1, -1536, 2048, -1536, -1024, 1024, -256, -768, 512, 1024, +-2560, 512, 1023, -1278, -258, 1282, -1282, -511, 513, 1021, -2044, 1276, 4, -1027, 514, 510, +-510, -1281, 2049, -769, -1279, 1535, -768, -511, 255, 514, -1283, 2, 1535, -1536, 1, -2, +-253, -771, 258, 1022, -2559, 1537, -257, -1536, 257, 766, -1022, -1025, 2048, -1535, -769, 1280, +-511, -769, 0, 1537, -2050, 514, 768, -1026, 3, 253, 3, -1283, 1538, -257, -1535, 1023, +1, -1282, 515, 253, -767, -767, 1278, -253, -1539, 1026, -514, -1022, 510, 770, -1025, -256, +1280, -1536, 0, 257, -513, -768, 769, 255, -1791, 1023, 0, -1023, -256, 1279, -1536, -256, +1025, -1025, -511, 767, 0, -1279, 766, 515, -1284, -508, 1788, -2300, 765, 257, -256, -1280, +768, 1, -1538, 514, -2, -1022, -2, 1026, -1538, 2, 510, -255, -768, 1023, 2, -1282, +769, -1, -767, -513, 1025, -1280, -257, 513, -258, -1277, 1021, -764, -517, 261, 252, -1022, +256, 767, -766, -259, 515, -3, -765, 1021, -254, -1281, 769, -1, -768, 257, 511, -767, +-513, 1024, -767, -769, 769, -257, -1024, 513, 511, -1023, -1, 513, -770, 4, 507, -252, +-515, 515, -3, -1277, 764, 4, -771, -253, 766, -768, -511, 1023, -767, -512, 511, 1, +-768, 511, 1, -513, -256, 513, -769, -255, 767, -512, -768, 512, 1, -1025, 512, 0, +-768, 256, 256, -511, -514, 770, -770, -254, 254, 2, -770, 1, 512, -1025, 1, 255, +-510, -259, 515, -515, -509, 510, -254, -514, 257, 0, -768, -1, 257, -257, -254, 766, +-511, -257, 256, 2, -515, 258, 512, -1026, 259, -4, -508, -258, 512, -511, -514, 258, +-1, -767, 255, 1, -514, 2, 255, -511, -513, 512, -512, -512, 513, -513, -255, -2, +258, -770, 259, -3, -254, -257, 256, -256, -512, 511, -254, -514, 258, -3, -509, -258, +257, -513, -255, 255, -255, -256, -1, -255, -513, 0, 2, -514, 2, -3, -253, -258, +258, -258, -511, 512, -257, -254, -3, 3, -515, 3, -3, -254, -257, 257, -257, -256, +1, -2, -253, -3, 258, -513, 0, 0, -255, -257, 0, -255, -258, 259, -258, -256, +1, -1, -255, -256, 255, -255, -256, 256, -512, -256, 0, 0, -255, -2, 2, -257, +1, -2, -253, -260, 5, -261, -252, -3, 2, -256, -2, 2, -257, 0, 1, -257, +-256, 0, -255, -258, 2, -2, -254, -2, 2, -258, 2, -2, -254, -259, 4, -260, +-252, -3, 1, -255, -3, -252, -259, -255, 1, -258, -254, -2, -255, -256, -1, 2, +-259, 3, -2, -255, -1, 1, -257, 2, -2, -255, -257, 1, 0, -256, 0, -1, +-255, 0, -1, -254, -258, 2, -258, -254, -2, 1, -255, -2, 2, -257, -1, 2, +-258, -255, 1, -259, -252, -4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -256, 0, 257, -1538, -5886, -5378, -7422, 4863, 7936, +2048, 7167, 10754, 13310, -7934, -5634, -3583, 512, -2816, -2815, -7170, -4350, -769, -15617, -11517, -5891, +-5631, 1281, 4606, 13314, 13567, 12544, 13568, 12289, 13310, 14083, 8700, -1531, -2565, -7163, -8709, -12284, +-10754, -7679, -17153, -13055, -14081, -13567, -9728, -4609, -255, 8959, 9729, 17408, 19456, 17920, 17407, 17921, +18176, 13056, 10496, -769, -7167, -9729, -15358, -16898, -17152, -19199, -20481, -19199, -21248, -12545, -6911, -1025, +5633, 10751, 14081, 17920, 20734, 22276, 23035, 19716, 15614, 9472, 2305, -4864, -13058, -13565, -16899, -21246, +-21249, -20991, -23298, -21757, -16388, -12028, -3843, 3842, 9727, 14592, 16640, 21249, 23550, 23299, 22269, 20995, +15357, 6658, -257, -5888, -12798, -16899, -18174, -20993, -22016, -22271, -22018, -20221, -15108, -6908, 765, 6146, +11519, 16640, 19712, 20992, 24577, 23806, 23554, 18174, 12034, 5119, -3328, -6144, -12800, -16384, -18431, -21505, +-22016, -22528, -21248, -16383, -12290, -5630, 1022, 7426, 11774, 15618, 18942, 20226, 22783, 22784, 20735, 16131, +10492, 2308, -4100, -7677, -12034, -15870, -18178, -20734, -21762, -22271, -18432, -15104, -9215, -4354, 1538, 5886, +11009, 14337, 17406, 19714, 21758, 19969, 17920, 13823, 8194, 2814, -3838, -8194, -10239, -14080, -17664, -18943, +-19714, -20222, -16898, -12030, -6914, -2558, 2046, 3586, 8957, 12547, 15870, 18690, 18431, 17919, 15873, 11776, +6656, 2816, -769, -5374, -9986, -12030, -14082, -17152, -17662, -17155, -13820, -9988, -6141, -3586, 257, 3072, +7168, 10239, 13313, 16384, 16640, 14335, 12545, 10751, 7426, 3838, 1024, -2559, -6146, -9980, -12805, -15099, +-15877, -13308, -11266, -9216, -7167, -4353, -1792, 257, 4095, 7680, 11777, 13566, 12803, 13309, 10755, 10236, +7941, 5371, 2821, 252, -3837, -8194, -10495, -12033, -12287, -12032, -10495, -9219, -7420, -6149, -5371, -1284, +2307, 6142, 9218, 10238, 11266, 11261, 9732, 8957, 8450, 7423, 5375, 1026, -2049, -4864, -7935, -9474, +-10238, -10241, -9215, -8962, -8958, -7682, -5373, -2307, 2, 3839, 5632, 8704, 7936, 8960, 9217, 9727, +9472, 8192, 5888, 2304, 257, -3329, -5376, -6912, -6656, -7936, -8703, -8962, -8958, -8449, -7680, -4608, +-1791, 1534, 2819, 5117, 6146, 6912, 8702, 9219, 9214, 8704, 7170, 3836, 2053, -260, -2046, -2560, +-4866, -6396, -7685, -8956, -9987, -9726, -8448, -5378, -3582, -1537, 256, 2305, 4350, 5122, 7679, 8960, +9473, 8958, 7171, 5372, 4356, 2557, 1537, -767, -2562, -4606, -6913, -8961, -9982, -9218, -8702, -6913, +-5632, -4352, -2048, -511, 1534, 3843, 6653, 8194, 8959, 8193, 8190, 8195, 6141, 5634, 3839, 2305, +-770, -3836, -6405, -7932, -9731, -9725, -9731, -8701, -7171, -6143, -4351, -2562, 2, 3327, 5632, 6656, +8703, 8707, 8956, 8452, 8445, 7937, 5632, 3584, 512, -2304, -5120, -7169, -8703, -9983, -9218, -9471, +-9216, -7937, -5885, -3588, -1276, 1532, 4356, 5628, 7171, 8446, 8962, 9726, 9986, 9213, 7171, 4862, +1793, -1535, -4355, -6141, -7681, -8961, -9726, -9987, -9725, -8961, -7168, -5121, -2815, 512, 2560, 4353, +6141, 7939, 9470, 9985, 10496, 10239, 7938, 5374, 2817, -513, -2815, -4608, -6912, -8704, -9473, -9983, +-9728, -9985, -7935, -5889, -3070, -1026, 1281, 3839, 5377, 7424, 9216, 10495, 10753, 10240, 8191, 5634, +3070, 1281, -1536, -4608, -5888, -7679, -8706, -9981, -9732, -8956, -8195, -6397, -4611, -2046, 254, 2562, +5119, 7168, 8705, 10494, 9986, 9471, 7936, 6401, 3839, 1280, -511, -2818, -4605, -6915, -8702, -9473, +-9216, -9214, -8195, -6654, -5377, -2560, -766, 2045, 4354, 6655, 8449, 8960, 9471, 8961, 8191, 6913, +3840, 1791, 513, -1536, -4098, -6396, -7941, -8444, -8963, -8957, -7939, -6908, -5381, -3323, -772, 1539, +3838, 5633, 7168, 8192, 8448, 8191, 7681, 5888, 4608, 3072, 767, -1023, -3072, -5120, -6400, -7169, +-8190, -7938, -7166, -5891, -5373, -3330, -1279, 512, 2559, 4353, 6144, 6398, 6915, 6654, 6145, 5376, +4607, 3585, 1280, -513, -2046, -3843, -5373, -5889, -6402, -6652, -6405, -5627, -4868, -3325, -2050, 1, +1792, 2815, 4097, 4607, 5377, 5631, 5633, 4863, 4353, 3327, 2049, -1, -1279, -2305, -4095, -4864, +-5120, -5377, -5376, -5375, -4609, -3839, -2048, -769, 257, 1535, 3072, 3330, 4094, 4866, 4862, 5121, +4096, 3327, 2050, 1022, -255, -1535, -2818, -3838, -4354, -4608, -5118, -4866, -4350, -3842, -2816, -1791, +-257, 513, 1791, 2816, 3584, 3841, 4607, 4865, 4606, 3587, 2556, 1797, 252, -510, -1536, -2562, +-3581, -4098, -4608, -4862, -4611, -4093, -3331, -2301, -1027, 3, 766, 1792, 2818, 3581, 4099, 4350, +4610, 4094, 3330, 2047, 1536, 256, -768, -1792, -2816, -3327, -4099, -4604, -4867, -4095, -3583, -3330, +-2046, -1025, -255, 1023, 2048, 3073, 3583, 4353, 4352, 3838, 3331, 3069, 2050, 1023, 0, -767, +-1793, -3072, -3584, -4352, -4608, -4095, -3842, -3325, -2563, -1534, -513, 513, 1535, 2561, 3328, 3839, +4355, 4091, 3845, 3324, 2563, 1535, 768, -257, -1534, -2562, -3326, -3842, -3839, -4353, -4094, -3330, +-2815, -1792, -769, 1, 1023, 2305, 2816, 3328, 3839, 3841, 3583, 3330, 2814, 1794, 1022, 1, +-1280, -2048, -2816, -3583, -3842, -4094, -3842, -3326, -3074, -2046, -1025, -256, 768, 1536, 2303, 2819, +3325, 3330, 3583, 3327, 2818, 2046, 1282, 254, -766, -1794, -2559, -3072, -3585, -3326, -3586, -3070, +-2818, -2302, -1282, -254, 255, 1024, 1793, 2558, 2818, 3327, 3328, 3329, 2559, 2048, 1281, 511, +-512, -1279, -2050, -2558, -2817, -3073, -3069, -3077, -2554, -2054, -1531, -771, 1, 512, 1536, 2048, +2560, 2815, 2818, 2814, 2562, 1790, 1281, 513, -258, -766, -1538, -2046, -2562, -2813, -2820, -2812, +-2307, -2046, -1538, -1022, -258, 514, 1023, 1536, 2049, 2301, 2308, 2300, 2052, 1533, 1026, 765, +4, -516, -1021, -1538, -2047, -2304, -2305, -2559, -2048, -1792, -1536, -1024, -513, 3, 509, 1026, +1535, 1792, 2050, 1789, 1795, 1533, 1027, 765, 259, -258, -767, -1280, -1538, -1790, -2049, -2047, +-1793, -1791, -1282, -1022, -513, -255, 254, 770, 1022, 1282, 1535, 1536, 1280, 1280, 1024, 768, +256, 0, -512, -1024, -1280, -1536, -1792, -1793, -1534, -1539, -1277, -1026, -768, -254, -3, 515, +765, 1026, 1279, 1282, 1277, 1283, 1021, 770, 512, 254, -252, -773, -764, -1283, -1277, -1539, +-1533, -1284, -1276, -1026, -768, -511, -258, 257, 513, 510, 1026, 1023, 1023, 1026, 1022, 770, +510, 258, -1, -513, -765, -1028, -1021, -1281, -1281, -1278, -1281, -1025, -766, -514, -255, 1, +254, 513, 512, 768, 1024, 1024, 768, 767, 514, 254, 1, -256, -513, -767, -769, -1023, +-1024, -1025, -1023, -1026, -765, -515, -253, -259, 3, 253, 514, 511, 767, 771, 765, 770, +511, 512, 257, -1, -255, -513, -767, -769, -1023, -1024, -1025, -1022, -771, -766, -512, -257, +1, 256, 255, 513, 512, 766, 772, 763, 517, 508, 259, -2, -255, -256, -513, -767, +-769, -767, -768, -769, -767, -769, -511, -257, 1, -1, 257, 511, 513, 511, 513, 511, +512, 513, 254, 2, -2, -254, -514, -510, -770, -767, -768, -769, -766, -514, -510, -258, +-255, 0, -1, 258, 510, 514, 510, 513, 512, 512, 257, -2, 2, -257, -256, -512, +-511, -770, -765, -772, -764, -516, -507, -262, -251, -4, 3, 254, 258, 254, 513, 512, +511, 258, 254, 258, -2, -254, -258, -510, -514, -509, -516, -508, -515, -510, -513, -256, +-256, -256, 1, -1, 256, 256, 257, 255, 257, 255, 256, 1, -1, -255, -257, -256, +-511, -513, -512, -510, -515, -510, -513, -256, -254, -259, 2, -2, 2, 255, 257, 254, +258, 255, 0, 0, 1, -2, -253, -260, -252, -259, -510, -512, -513, -256, -255, -257, +-255, -256, -1, 1, -1, 1, -2, 3, -3, 2, -1, 0, 1, -2, -254, -258, +-253, -260, -252, -260, -252, -260, -252, -260, -253, -257, 0, 1, -3, 3, -2, 2, +-1, -1, 2, -3, 3, -3, -253, -258, -255, -257, -255, -257, -254, -259, -253, -258, +-254, -257, 0, 0, 0, 1, -1, 0, 1, -2, 3, -3, 2, -2, 3, -259, +-254, -257, -256, -255, -257, -256, -255, -258, -254, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, -254, -257, -257, -253, -259, +-254, -256, -258, -254, -257, 0, 1, -257, 0, 1, -2, 2, -1, 257, 510, 770, +1279, 1792, 2561, 3326, 4098, 4862, 5890, 6911, 7936, 8961, 9981, 11012, 11518, 11521, 11775, 11776, +11008, 10498, 9981, 9219, 8189, 7170, 6144, 5119, 3841, 2559, 1793, 511, -510, -1283, -2045, -2819, +-3581, -3842, -4607, -4864, -5377, -5631, -6144, -6657, -6910, -7427, -7422, -7936, -8449, -8703, -8960, -9474, +-9469, -9731, -9982, -10240, -10241, -10495, -10754, -10750, -11009, -11007, -11009, -11008, -11007, -10753, -10751, -10753, +-10495, -10496, -10240, -10241, -10239, -9984, -9729, -9470, -9475, -9213, -8962, -8704, -8446, -8195, -7677, -7425, +-7169, -6910, -6658, -6142, -5890, -5630, -5378, -4862, -4609, -4353, -3839, -3584, -3328, -2817, -2558, -2307, +-2045, -1538, -1279, -1024, -512, -256, 0, 256, 768, 768, 1281, 1534, 1794, 2046, 2306, 2559, +2816, 3072, 3327, 3586, 3583, 3840, 4096, 4352, 4607, 4866, 4862, 5121, 5376, 5376, 5630, 5635, +5886, 5889, 6144, 6142, 6403, 6397, 6403, 6398, 6401, 6399, 6401, 6399, 6401, 6400, 6399, 6401, +6400, 6399, 6401, 6143, 5889, 5632, 5375, 4865, 4607, 4097, 3584, 2815, 2305, 1280, 255, -766, +-1794, -2815, -4096, -5120, -6144, -6912, -7424, -7425, -7421, -7172, -6908, -6148, -4860, -3331, -1278, 1022, +3330, 5631, 7681, 9471, 11008, 12545, 13311, 13825, 14335, 14593, 14591, 14337, 14335, 13825, 13566, 12803, +12285, 11778, 11008, 10494, 9986, 9215, 8704, 8194, 7933, 7426, 7167, 6656, 6401, 5887, 5377, 5118, +4867, 4604, 4101, 3580, 3331, 2813, 2562, 2304, 1791, 1538, 1021, 770, 255, 1, -257, -766, +-1027, -1533, -1794, -2047, -2560, -2816, -3073, -3582, -3842, -3839, -4352, -4609, -4863, -4864, -5121, -5375, +-5633, -5630, -5635, -5885, -5891, -6141, -6145, -6145, -6399, -6401, -6399, -6656, -6657, -6654, -6659, -6653, +-6658, -6911, -6911, -6914, -7166, -7170, -7166, -7426, -7421, -7172, -7164, -7171, -7166, -7169, -7169, -7166, +-7169, -7167, -6913, -6912, -6912, -6655, -6657, -6655, -6657, -6655, -6657, -6398, -6402, -6144, -6142, -5891, +-5884, -5636, -5629, -5634, -5374, -5122, -4863, -4864, -4864, -4609, -4350, -4098, -3839, -3841, -3839, -3586, +-3324, -3076, -2814, -2817, -2815, -2817, -2558, -2307, -2045, -2051, -2045, -2051, -2046, -2049, -2048, -2047, +-2050, -2302, -2562, -2814, -3586, -4094, -4865, -5632, -6656, -7425, -8446, -9217, -9472, -9983, -10242, -10494, +-10497, -10240, -9727, -8704, -7426, -5629, -3843, -1533, 766, 3073, 5119, 6913, 8191, 9729, 10752, 11519, +12032, 12545, 12798, 12803, 12797, 12802, 12543, 12288, 11777, 11518, 11011, 10748, 10244, 9981, 9730, 9215, +9216, 8961, 8702, 8451, 8188, 7940, 7677, 7426, 7167, 6912, 6400, 6400, 5888, 5376, 5376, 4864, +4608, 4352, 3840, 3584, 3328, 2816, 2560, 2304, 1792, 1792, 1280, 1024, 768, 512, 0, -1, +-254, -770, -1022, -1026, -1534, -1794, -2046, -2050, -2302, -2562, -2814, -3073, -3328, -3327, -3585, -3840, +-3839, -3842, -4092, -4356, -4605, -4611, -4862, -4864, -5121, -5119, -5377, -5631, -5632, -5889, -5888, -6143, +-6145, -6143, -6401, -6401, -6398, -6402, -6398, -6402, -6399, -6400, -6401, -6398, -6402, -6142, -6145, -6144, +-5889, -5886, -5890, -5630, -5633, -5633, -5374, -5378, -5118, -4866, -4862, -4865, -4864, -4607, -4354, -4094, +-4097, -3840, -3840, -3583, -3585, -3327, -3074, -2814, -2817, -2814, -2819, -2557, -2307, -2045, -2050, -2047, +-1793, -1790, -1794, -1535, -1537, -1279, -1279, -1538, -1534, -1795, -2045, -2305, -2816, -3328, -4096, -5121, +-5885, -6661, -7418, -8198, -8700, -9473, -9986, -10236, -10244, -10238, -9984, -8960, -7681, -6141, -4100, -2045, +255, 2559, 4610, 6398, 7682, 9213, 10243, 11006, 11776, 12290, 12797, 12802, 12800, 12799, 12545, 12288, +12030, 11779, 11262, 11009, 10496, 9983, 9985, 9471, 9217, 9216, 8703, 8705, 8191, 8192, 7938, 7677, +7171, 7165, 6658, 6399, 6145, 5888, 5375, 5376, 4865, 4607, 4353, 3840, 3583, 3073, 2815, 2561, +2303, 1794, 1789, 1283, 1021, 771, 510, 1, 0, -514, -765, -1027, -1277, -1538, -1792, -2047, +-2305, -2559, -2817, -3071, -3074, -3324, -3589, -3835, -3845, -4092, -4355, -4350, -4608, -4865, -4863, -4865, +-4863, -5121, -5374, -5379, -5629, -5634, -5631, -5632, -5633, -5887, -5889, -5887, -5889, -6144, -6143, -6145, +-6144, -6143, -6146, -6142, -6144, -6145, -6143, -5889, -5888, -5887, -5889, -5887, -5888, -5889, -5631, -5633, +-5631, -5633, -5630, -5634, -5631, -5377, -5375, -5121, -5118, -5123, -4861, -4866, -4863, -4865, -4863, -4609, +-4607, -4609, -4352, -4095, -3841, -3840, -3839, -3842, -3582, -3329, -3327, -3073, -3072, -3072, -3072, -2815, +-2818, -3070, -3330, -3583, -4095, -4867, -5628, -6404, -6909, -7681, -8449, -9214, -9986, -10495, -11008, -11520, +-11777, -12030, -11522, -10751, -9472, -7937, -5887, -3840, -1536, 768, 2558, 4611, 6397, 7939, 9214, 10240, +11009, 11775, 12033, 12287, 12544, 12545, 12286, 12035, 11772, 11524, 11005, 10754, 10239, 9984, 9728, 9472, +9216, 8961, 8702, 8451, 8188, 8195, 7935, 7679, 7427, 7164, 6916, 6652, 6404, 6396, 5892, 5629, +5377, 5121, 4606, 4610, 4094, 3842, 3582, 3330, 3071, 2560, 2560, 2049, 1789, 1540, 1276, 771, +767, 511, 258, -2, -254, -515, -1020, -1027, -1278, -1537, -1536, -1792, -2047, -2050, -2045, -2308, +-2556, -2563, -2814, -2817, -2817, -2813, -2820, -2812, -2820, -3068, -3075, -3326, -3330, -3327, -3583, -3586, +-3582, -3586, -3838, -3842, -3839, -3840, -3840, -3840, -4096, -4096, -4096, -4096, -4096, -4097, -4093, -4099, +-4095, -4096, -4096, -4097, -3837, -3844, -3837, -3841, -3841, -3838, -3842, -3582, -3586, -3583, -3328, -3328, +-3072, -2816, -2817, -2814, -2817, -2816, -2817, -2559, -2559, -2305, -2303, -2306, -2047, -2047, -2050, -1789, +-1796, -1788, -2052, -2045, -2049, -1793, -1790, -1795, -2044, -2052, -2300, -2820, -3582, -4096, -4865, -5630, +-6658, -7423, -8193, -8959, -9729, -10495, -11264, -12033, -12543, -12801, -12800, -12030, -11267, -9468, -7685, -5627, +-3333, -1019, 1020, 3330, 5376, 7167, 8448, 9729, 10750, 11267, 11773, 12290, 12287, 12544, 12289, 12030, +11779, 11261, 11011, 10493, 9986, 9727, 9217, 8959, 8450, 8189, 7938, 7424, 7166, 6916, 6652, 6403, +6142, 5889, 5376, 5375, 4866, 4606, 4353, 4096, 3583, 3329, 3072, 2559, 2561, 2303, 1793, 1536, +1280, 767, 769, 255, 1, -256, -513, -767, -1026, -1277, -1539, -1789, -2051, -2302, -2561, -2816, +-2814, -3075, -3070, -3328, -3330, -3581, -3586, -3840, -3838, -3843, -3838, -3841, -3839, -3840, -4097, -4095, +-4098, -4093, -4355, -4349, -4354, -4352, -4351, -4354, -4349, -4610, -4607, -4609, -4608, -4608, -4607, -4865, +-4608, -4608, -4608, -4607, -4609, -4609, -4606, -4610, -4349, -4099, -4093, -4100, -3836, -3843, -3838, -3585, +-3584, -3328, -3071, -3073, -2816, -2816, -2560, -2304, -2047, -2050, -2046, -2050, -1791, -1792, -1537, -1535, +-1536, -1281, -1279, -1025, -1023, -1024, -769, -768, -767, -769, -767, -769, -511, -514, -253, -260, +-251, -517, -764, -1026, -1792, -2303, -2817, -3584, -4350, -5123, -5630, -6657, -7423, -8192, -8961, -9727, +-10241, -10495, -10496, -9985, -9214, -7682, -5887, -4096, -2048, -1, 2306, 4350, 6146, 7678, 9218, 10238, +11266, 11774, 12546, 12798, 13059, 13052, 12803, 12798, 12289, 11776, 11520, 11008, 10751, 9986, 9725, 9220, +9213, 8706, 8191, 7936, 7681, 7167, 7169, 6654, 6403, 6140, 5893, 5371, 5380, 4862, 4607, 4354, +3839, 3585, 3328, 3070, 2562, 2559, 2049, 1791, 1537, 1022, 771, 509, 2, -1, -256, -768, +-1023, -1282, -1533, -1795, -2046, -2305, -2816, -2815, -3073, -3327, -3329, -3584, -3839, -3841, -4096, -4094, +-4356, -4347, -4612, -4606, -4609, -4607, -4609, -4863, -4865, -4864, -4863, -4865, -4863, -4866, -5117, -5123, +-5118, -5121, -5120, -5375, -5377, -5631, -5634, -5374, -5378, -5374, -5633, -5632, -5632, -5631, -5635, -5372, +-5380, -5373, -5377, -5377, -5119, -4865, -4862, -4866, -4863, -4865, -4607, -4352, -4096, -3840, -3841, -3839, +-3583, -3331, -3324, -3076, -2814, -2816, -2817, -2814, -2818, -2560, -2303, -2049, -2046, -2050, -2047, -2049, +-1791, -1793, -1534, -1539, -1277, -1026, -1024, -767, -769, -1023, -1024, -1537, -2047, -2304, -2817, -3582, +-4098, -4862, -5633, -6400, -7167, -8194, -8958, -9473, -10239, -10497, -10495, -10242, -9469, -8195, -6653, -4867, +-2813, -771, 1283, 3326, 5377, 6911, 8193, 9471, 10753, 11519, 12033, 12543, 12801, 12799, 12800, 12800, +12545, 12288, 11775, 11521, 11006, 10755, 10494, 9985, 9727, 9473, 9216, 8959, 8449, 8191, 8193, 7680, +7423, 7169, 6911, 6657, 6399, 6146, 5629, 5378, 5120, 4607, 4609, 4096, 3582, 3588, 3068, 2562, +2304, 1790, 1540, 1020, 770, 512, -1, 1, -513, -1023, -1280, -1793, -2047, -2305, -2559, -2816, +-3072, -3329, -3583, -3840, -3841, -4094, -4098, -4351, -4352, -4609, -4607, -4608, -4609, -4862, -4866, -4863, +-4864, -4865, -4862, -4866, -4862, -4866, -4862, -4866, -5118, -5378, -5374, -5378, -5374, -5633, -5632, -5632, +-5632, -5631, -5634, -5629, -5636, -5628, -5890, -5888, -5887, -5633, -5632, -5631, -5634, -5630, -5633, -5631, +-5377, -5376, -5120, -4864, -4863, -4865, -4608, -4351, -4098, -3837, -3843, -3838, -3842, -3838, -3585, -3583, +-3330, -3071, -2816, -2816, -2816, -2816, -2816, -2816, -2560, -2560, -2303, -2049, -2048, -1791, -1537, -1535, +-1281, -1535, -1793, -2047, -2305, -2816, -3327, -3842, -4350, -5122, -5630, -6658, -7422, -8450, -9215, -9984, +-10496, -11009, -11005, -10757, -10234, -9222, -7675, -5891, -4096, -2045, -5, 2054, 3834, 5637, 7164, 8707, +9983, 10752, 11520, 12032, 12544, 12800, 12801, 12798, 12546, 12287, 11776, 11776, 11264, 11008, 10752, 10240, +9983, 9730, 9469, 9220, 8956, 8707, 8446, 8192, 8194, 7934, 7426, 7166, 7168, 6658, 6397, 6148, +5883, 5637, 5371, 5125, 4860, 4610, 4095, 3841, 3583, 3074, 2813, 2562, 2304, 1790, 1539, 1278, +768, 514, 252, 5, -261, -763, -1029, -1020, -1283, -1534, -2049, -2048, -2304, -2560, -2560, -2815, +-2818, -2814, -2818, -2814, -2817, -3072, -3071, -3330, -3325, -3331, -3325, -3331, -3325, -3586, -3839, -3841, +-3839, -4097, -4094, -4355, -4350, -4609, -4608, -4863, -4866, -4862, -4865, -5120, -5376, -5376, -5631, -5634, +-5630, -5634, -5630, -5633, -5632, -5632, -5633, -5629, -5381, -5371, -5380, -5118, -4863, -4866, -4607, -4609, +-4351, -4096, -4096, -3840, -3841, -3838, -3842, -3838, -3587, -3581, -3330, -3326, -3074, -3071, -3072, -3073, +-3070, -3074, -2815, -2816, -2561, -2302, -2050, -2046, -2051, -2045, -2306, -2558, -2818, -3327, -3841, -4094, +-4866, -5631, -6401, -7167, -7936, -8705, -9726, -10499, -11261, -11779, -12029, -11778, -11263, -10496, -9474, -7677, +-5891, -3838, -2049, 256, 2305, 4094, 5889, 7424, 8960, 9984, 11008, 11519, 12033, 12288, 12544, 12543, +12290, 12029, 11780, 11517, 11009, 11009, 10493, 9988, 9726, 9472, 9217, 8702, 8450, 8191, 7936, 7680, +7425, 7166, 6914, 6654, 6401, 6145, 5886, 5634, 5374, 5378, 4862, 4610, 4606, 4098, 3583, 3584, +3328, 2816, 2560, 2304, 2048, 1792, 1536, 1024, 768, 511, 1, 0, -512, -768, -1024, -1025, +-1278, -1794, -2047, -2048, -2048, -2304, -2560, -2561, -2558, -2563, -2556, -2564, -2557, -2818, -2816, -2814, +-2818, -2559, -2561, -2559, -2817, -2814, -2818, -2814, -2818, -2815, -3072, -3072, -3327, -3330, -3326, -3330, +-3582, -3842, -3838, -3842, -4094, -4097, -4096, -4351, -4353, -4352, -4351, -4354, -4349, -4355, -4350, -4354, +-4350, -4354, -4094, -4097, -3840, -3840, -3584, -3584, -3327, -3330, -3070, -3074, -3070, -3074, -2814, -2818, +-2814, -2818, -2558, -2562, -2558, -2562, -2558, -2562, -2558, -2562, -2302, -2050, -2046, -1793, -1792, -1535, +-1538, -1534, -1793, -2048, -2047, -2562, -2814, -3586, -3838, -4866, -5373, -6148, -7164, -7939, -8959, -9727, +-10497, -11264, -11263, -11522, -11262, -10497, -9471, -8193, -6656, -4864, -2816, -511, 1534, 3586, 5374, 7170, +8446, 9730, 10750, 11522, 12030, 12289, 12545, 12542, 12546, 12286, 12033, 11776, 11520, 11007, 10754, 10237, +9987, 9470, 9216, 8962, 8445, 8195, 7933, 7683, 7165, 7171, 6654, 6401, 6143, 5889, 5631, 5377, +5376, 4863, 4610, 4350, 4097, 3584, 3584, 3072, 2560, 2560, 2304, 1792, 1536, 1280, 768, 512, +0, 0, -512, -768, -1023, -1282, -1534, -2049, -2048, -2302, -2564, -2812, -2819, -3070, -3073, -3072, +-3071, -3330, -3326, -3330, -3327, -3327, -3330, -3326, -3329, -3329, -3069, -3076, -3069, -3073, -3072, -3071, +-3331, -3325, -3586, -3582, -3585, -3840, -3841, -3838, -3842, -3838, -4098, -4095, -4352, -4352, -4608, -4609, +-4607, -4609, -4607, -4608, -4609, -4606, -4611, -4606, -4609, -4351, -4352, -4096, -3842, -3837, -3587, -3325, +-3330, -3071, -2817, -2814, -2819, -2813, -2562, -2558, -2306, -2303, -2049, -2046, -2050, -2047, -2048, -2049, +-2047, -2048, -1793, -1534, -1282, -1278, -1026, -1022, -1026, -1022, -1026, -1022, -1282, -1790, -2050, -2559, +-2817, -3839, -4353, -5119, -6145, -6911, -7937, -8704, -9472, -10240, -10751, -10754, -10750, -10242, -9470, -8194, +-6655, -4864, -3072, -1024, 767, 2818, 4862, 6658, 8189, 9475, 10494, 11266, 11775, 12543, 12801, 12799, +12802, 12798, 12547, 12283, 11781, 11516, 11011, 11006, 10497, 9984, 9728, 9215, 9218, 8701, 8451, 8190, +7680, 7427, 7164, 6915, 6654, 6401, 6144, 5888, 5631, 5378, 5117, 4868, 4604, 4355, 3838, 3585, +3328, 2816, 2559, 2306, 1789, 1539, 1279, 766, 516, -5, -252, -514, -1023, -1025, -1535, -1792, +-2049, -2302, -2562, -2814, -2818, -3070, -3073, -3327, -3330, -3582, -3586, -3582, -3585, -3584, -3585, -3583, +-3584, -3585, -3582, -3587, -3582, -3584, -3585, -3582, -3843, -3836, -3844, -3837, -4098, -4094, -4354, -4350, +-4610, -4607, -4864, -4863, -4867, -5115, -5382, -5370, -5381, -5373, -5633, -5632, -5632, -5631, -5634, -5374, +-5378, -5375, -5120, -4863, -4867, -4860, -4612, -4350, -4096, -3841, -3838, -3842, -3840, -3582, -3330, -3070, +-3074, -2815, -2815, -2818, -2814, -2818, -2815, -2815, -2819, -2556, -2564, -2300, -2052, -2045, -1794, -1535, +-1535, -1282, -1535, -1536, -1793, -2046, -2050, -2559, -2816, -3585, -4351, -4865, -5630, -6659, -7422, -8448, +-9473, -9983, -10241, -10752, -10495, -10241, -9471, -8450, -7165, -5635, -3838, -2050, 2, 2047, 4096, 5889, +7422, 8962, 9982, 11010, 11774, 12034, 12543, 12800, 12801, 12798, 12546, 12287, 12033, 11775, 11521, 11006, +10754, 10239, 9984, 9729, 9469, 9221, 8954, 8453, 8189, 7936, 7683, 7420, 7171, 6911, 6655, 6401, +6401, 6141, 5636, 5372, 5123, 4863, 4608, 4351, 3842, 3581, 3332, 2812, 2563, 2302, 1793, 1536, +1023, 769, 511, 257, 0, -513, -767, -1025, -1279, -1793, -2047, -2049, -2302, -2563, -2557, -2819, +-2813, -2819, -2813, -2819, -2813, -2819, -2814, -2816, -2818, -2813, -2819, -2813, -2818, -2815, -2817, -2815, +-2817, -3071, -3328, -3330, -3581, -3843, -3838, -3840, -3841, -4096, -4351, -4609, -4607, -4864, -4866, -5117, +-5123, -5117, -5379, -5374, -5377, -5375, -5377, -5376, -5375, -5378, -5117, -5123, -4862, -4865, -4608, -4607, +-4354, -4349, -4100, -3836, -3843, -3838, -3586, -3582, -3330, -3327, -3327, -3331, -3324, -3332, -3326, -3328, +-3073, -3070, -2818, -2814, -2562, -2559, -2304, -2047, -2049, -2047, -2050, -2046, -2049, -2047, -2561, -2816, +-3328, -3839, -4609, -5119, -5890, -6910, -7681, -8703, -9473, -10240, -10751, -11266, -11261, -11011, -10238, -9473, +-8447, -6913, -5120, -3327, -1281, 770, 2813, 4610, 6400, 7935, 9217, 10239, 11009, 11775, 12033, 12543, +12544, 12801, 12543, 12288, 12033, 11775, 11520, 11009, 11006, 10499, 9980, 9733, 9467, 9220, 8957, 8450, +8191, 7937, 7678, 7426, 7166, 7171, 6652, 6404, 6396, 6147, 5887, 5375, 5379, 5116, 4612, 4605, +4098, 3839, 3585, 3327, 2817, 2560, 2047, 1793, 1536, 1023, 770, 510, 1, -256, -513, -1022, +-1026, -1279, -1792, -2048, -2049, -2302, -2306, -2558, -2561, -2816, -2816, -2815, -2818, -2813, -2564, -2556, +-2563, -2559, -2560, -2560, -2560, -2560, -2560, -2560, -2560, -2559, -2818, -2813, -2819, -3070, -3329, -3328, +-3583, -3585, -3840, -3839, -4098, -4094, -4353, -4608, -4607, -4866, -4862, -4865, -4864, -4863, -4866, -4862, +-4866, -4862, -4866, -4862, -4609, -4352, -4352, -4096, -3840, -3839, -3841, -3584, -3327, -3329, -3071, -3073, +-2816, -2815, -2817, -2815, -2817, -2815, -2817, -2816, -2815, -2817, -2814, -2563, -2301, -2307, -2045, -2050, +-2046, -1794, -1790, -1795, -1788, -2051, -2047, -2559, -2819, -3325, -4097, -4865, -5629, -6660, -7421, -8449, +-9216, -9983, -10497, -11008, -11263, -11266, -10750, -9985, -8960, -7680, -6144, -4352, -2304, -256, 1792, 3583, +5378, 7167, 8447, 9730, 10750, 11265, 11776, 12287, 12545, 12543, 12545, 12288, 12031, 11778, 11517, 11267, +11005, 10500, 9980, 9987, 9470, 9217, 8704, 8447, 8193, 7935, 7425, 7168, 7166, 6916, 6651, 6405, +6396, 5890, 5633, 5374, 5121, 4864, 4607, 4610, 4094, 3841, 3584, 3071, 2817, 2559, 2049, 1792, +1535, 1025, 768, 510, 4, -261, -507, -1028, -1021, -1538, -1792, -2046, -2051, -2301, -2562, -2816, +-2814, -2819, -2813, -2818, -2816, -2814, -2818, -2816, -2813, -2821, -2810, -2565, -2558, -2559, -2562, -2559, +-2560, -2562, -2812, -2820, -2814, -3073, -3072, -3327, -3584, -3585, -3839, -3841, -4095, -4096, -4352, -4609, +-4862, -4866, -4862, -4865, -4865, -4863, -4864, -4864, -4863, -4867, -4861, -4867, -4604, -4612, -4348, -4101, +-4091, -3845, -3835, -3587, -3327, -3072, -2817, -2814, -2818, -2814, -2819, -2812, -2820, -2813, -2817, -2817, +-2814, -2563, -2557, -2306, -2303, -2047, -2051, -1788, -1796, -1533, -1282, -1279, -1280, -1536, -1792, -2049, +-2303, -2817, -3326, -4098, -4863, -5633, -6654, -7427, -8444, -9220, -9982, -10240, -10753, -10750, -10499, -9981, +-9219, -7933, -6402, -4864, -2815, -1025, 1025, 3071, 4865, 6655, 8193, 9471, 10497, 11263, 11777, 12287, +12545, 12800, 12799, 12545, 12288, 12031, 11779, 11516, 11011, 11006, 10497, 9984, 9729, 9214, 8961, 8704, +8191, 8194, 7678, 7426, 7166, 6913, 6656, 6399, 6402, 6142, 5889, 5376, 5375, 5121, 4608, 4607, +4098, 3837, 3586, 3327, 2817, 2559, 2306, 1789, 1538, 1023, 769, 512, -1, -254, -516, -1018, +-1030, -1531, -1795, -2047, -2304, -2559, -2561, -2816, -2815, -2818, -2813, -2818, -2816, -2815, -2818, -2814, +-2816, -2818, -2814, -2818, -2815, -2559, -2562, -2559, -2560, -2817, -2814, -2818, -2815, -3073, -3327, -3585, +-3583, -3841, -3840, -3839, -4097, -4352, -4352, -4608, -4863, -4865, -4864, -5119, -5123, -5115, -5125, -5116, +-5123, -5119, -5119, -4866, -4862, -4865, -4865, -4605, -4355, -4095, -3839, -3842, -3582, -3329, -3328, -3071, +-3074, -3070, -3074, -3070, -3073, -3072, -3072, -2817, -2814, -2818, -2814, -2817, -2560, -2304, -2305, -2046, +-2050, -1789, -1795, -1535, -1536, -1536, -1792, -2047, -2306, -2814, -3329, -3840, -4608, -5375, -6402, -7165, +-8195, -8958, -9473, -10240, -10495, -10753, -10496, -10240, -9472, -8447, -7169, -5632, -3840, -1791, 254, 2307, +4093, 5890, 7424, 8702, 9987, 10750, 11520, 12033, 12287, 12545, 12544, 12543, 12544, 12289, 11775, 11777, +11264, 11007, 10753, 10239, 9984, 9729, 9216, 8959, 8449, 8191, 8192, 7681, 7423, 7169, 7167, 6657, +6399, 6401, 6143, 5889, 5631, 5378, 5117, 4866, 4607, 4353, 3839, 3584, 3329, 2814, 2563, 2301, +1794, 1535, 1024, 769, 511, 1, -258, -510, -1026, -1021, -1538, -1792, -2047, -2050, -2301, -2562, +-2815, -2817, -2815, -2817, -2815, -2816, -2818, -2813, -2819, -2813, -2818, -2559, -2561, -2560, -2558, -2562, +-2559, -2560, -2562, -2813, -2819, -2814, -3072, -3329, -3583, -3586, -3837, -3843, -3837, -4099, -4350, -4608, +-4866, -4861, -4867, -5118, -5121, -5120, -5120, -5119, -5122, -5117, -5123, -4862, -4866, -4862, -4865, -4863, +-4609, -4352, -4095, -3842, -3837, -3587, -3326, -3073, -3071, -3073, -3071, -3073, -3071, -3072, -3072, -3073, +-2814, -2818, -2814, -2818, -2814, -2562, -2558, -2305, -2048, -2047, -1795, -1787, -1797, -1532, -1795, -2047, +-2047, -2561, -3072, -3839, -4354, -5118, -5889, -6911, -7682, -8445, -9475, -10238, -10497, -10751, -10754, -10492, +-9989, -9213, -7936, -6402, -4860, -2821, -1020, 1021, 3074, 4864, 6654, 8195, 9212, 10244, 11005, 11778, +12031, 12288, 12544, 12544, 12545, 12286, 12035, 11772, 11524, 11005, 11010, 10495, 9984, 9728, 9217, 9215, +8704, 8449, 8190, 7939, 7420, 7172, 7165, 6914, 6655, 6400, 6400, 6145, 5630, 5378, 5375, 5120, +4609, 4607, 4096, 3840, 3584, 3329, 2815, 2561, 2046, 1794, 1535, 1025, 766, 259, -4, -251, +-773, -1020, -1027, -1535, -1790, -2051, -2045, -2307, -2558, -2560, -2561, -2814, -2818, -2814, -2562, -2558, +-2561, -2560, -2559, -2561, -2559, -2305, -2304, -2303, -2305, -2303, -2305, -2560, -2559, -2818, -2814, -3073, +-3329, -3326, -3585, -3584, -3839, -3842, -4095, -4351, -4609, -4864, -4862, -4868, -5115, -5124, -5118, -5121, +-5120, -5119, -4864, -4865, -4863, -4865, -4864, -4863, -4609, -4351, -4097, -3839, -3841, -3583, -3329, -3072, +-3071, -3074, -3069, -3074, -3072, -3071, -3074, -3070, -2816, -2817, -2816, -2815, -2818, -2557, -2563, -2302, +-2049, -2048, -2047, -1794, -1534, -1537, -1536, -1791, -2049, -2304, -2815, -3329, -3839, -4865, -5631, -6657, +-7423, -8449, -9216, -9726, -10243, -10749, -10755, -10750, -10241, -9471, -8449, -7167, -5633, -3840, -2047, -2, +2050, 4095, 5888, 7425, 8702, 9986, 10751, 11520, 11777, 12286, 12546, 12543, 12545, 12286, 12034, 11775, +11776, 11265, 11006, 10498, 10238, 9986, 9470, 9218, 8958, 8450, 8190, 7938, 7679, 7168, 7168, 6912, +6656, 6400, 6401, 6142, 5890, 5374, 5377, 5120, 4608, 4608, 4352, 3839, 3586, 3325, 2819, 2558, +2304, 1794, 1533, 1027, 765, 515, -3, -253, -515, -1021, -1027, -1534, -1793, -2047, -2049, -2303, +-2562, -2558, -2817, -2815, -2818, -2814, -2562, -2558, -2561, -2561, -2558, -2562, -2558, -2306, -2302, -2307, +-2043, -2054, -2298, -2309, -2557, -2818, -2814, -2818, -3069, -3332, -3325, -3585, -3585, -3837, -3844, -4092, +-4356, -4603, -4870, -4858, -5125, -5117, -5121, -5120, -5120, -5119, -4865, -4863, -4866, -4861, -4867, -4861, +-4610, -4351, -4096, -3841, -3839, -3585, -3326, -3075, -3070, -3073, -3071, -3072, -3074, -3070, -3073, -2816, +-2815, -2817, -2816, -2816, -2815, -2563, -2556, -2307, -2046, -2049, -2049, -1791, -1536, -1535, -1538, -1790, +-2051, -2044, -2563, -3071, -3840, -4352, -5119, -5890, -6910, -7682, -8446, -9473, -10241, -10494, -10753, -10752, +-10240, -9729, -8959, -7680, -6400, -4608, -2817, -767, 1280, 3328, 5120, 6655, 8193, 9471, 10242, 11006, +11778, 12029, 12291, 12541, 12547, 12541, 12290, 12032, 11774, 11523, 11004, 10757, 10235, 9988, 9726, 9216, +8961, 8703, 8192, 8193, 7679, 7425, 7167, 7169, 6911, 6657, 6400, 6143, 5889, 5631, 5378, 5374, +4865, 4606, 4355, 4094, 3585, 3584, 3070, 2564, 2556, 2052, 1788, 1283, 766, 770, 255, 1, +-514, -766, -1025, -1279, -1536, -2049, -2047, -2305, -2558, -2562, -2815, -2816, -2817, -2813, -2821, -2811, +-2564, -2556, -2564, -2557, -2563, -2557, -2305, -2305, -2303, -2304, -2304, -2305, -2558, -2563, -2812, -2819, +-3071, -3328, -3328, -3584, -3584, -3840, -3840, -4096, -4352, -4609, -4862, -4866, -4862, -5121, -5121, -5119, +-5120, -5121, -5118, -4866, -4863, -4864, -4865, -4863, -4608, -4608, -4353, -4094, -3843, -3580, -3331, -3327, +-3072, -3073, -3070, -3074, -3070, -3073, -3072, -3072, -3073, -2814, -2818, -2814, -2818, -2814, -2562, -2559, +-2305, -2047, -2048, -1792, -1792, -1537, -1535, -1536, -1792, -2048, -2304, -2817, -3326, -4097, -4865, -5630, +-6658, -7423, -8447, -9218, -9727, -10240, -10497, -10750, -10498, -10239, -9472, -8449, -6910, -5379, -3581, -1795, +259, 2301, 4356, 6139, 7429, 8956, 9986, 10752, 11519, 11777, 12288, 12544, 12543, 12546, 12286, 12034, +11775, 11776, 11264, 11009, 10495, 10241, 9982, 9475, 9213, 8963, 8445, 8194, 7935, 7681, 7167, 7169, +6911, 6656, 6401, 6398, 6147, 5884, 5380, 5373, 5122, 4607, 4608, 4352, 3841, 3583, 3329, 2815, +2561, 2303, 1793, 1535, 1025, 767, 257, -1, -255, -513, -1023, -1025, -1535, -1792, -2049, -2047, +-2305, -2559, -2816, -2817, -2815, -2817, -2815, -2560, -2561, -2558, -2562, -2559, -2560, -2560, -2304, -2304, +-2305, -2303, -2048, -2305, -2303, -2561, -2815, -2817, -3071, -3073, -3328, -3327, -3585, -3583, -3840, -3841, +-4095, -4609, -4863, -4864, -4865, -5118, -5123, -5117, -5122, -5119, -5120, -4865, -4862, -4867, -4861, -4866, +-4863, -4609, -4351, -4098, -3837, -3842, -3584, -3327, -3074, -3070, -3073, -3071, -3073, -3072, -3071, -3074, +-2812, -2821, -2812, -2819, -2813, -2819, -2557, -2563, -2301, -2051, -2045, -2052, -1788, -1538, -1536, -1534, +-1795, -2047, -2047, -2561, -3071, -3840, -4611, -5372, -6146, -6911, -7936, -8705, -9472, -10238, -10498, -10751, +-10752, -10241, -9470, -8706, -7423, -5888, -4097, -2303, -256, 1791, 3586, 5374, 6913, 8448, 9471, 10497, +11264, 11776, 12032, 12287, 12545, 12544, 12288, 12287, 11778, 11773, 11268, 11005, 10753, 10241, 9981, 9476, +9213, 8962, 8447, 8192, 7937, 7679, 7424, 7169, 7166, 6915, 6397, 6402, 6143, 5888, 5632, 5376, +5120, 4865, 4605, 4356, 3836, 3588, 3325, 3073, 2560, 2304, 1792, 1536, 1280, 768, 512, 0, +-1, -510, -770, -1022, -1282, -1790, -2050, -2046, -2306, -2559, -2559, -2819, -2812, -2820, -2814, -2815, +-2563, -2556, -2564, -2557, -2562, -2559, -2560, -2304, -2305, -2303, -2305, -2303, -2304, -2562, -2813, -2819, +-2814, -3072, -3330, -3325, -3586, -3584, -3838, -3843, -4093, -4354, -4607, -4864, -4865, -5119, -5120, -5121, +-5118, -5122, -5119, -5120, -4865, -4862, -4866, -4862, -4866, -4607, -4352, -4096, -3841, -3838, -3587, -3325, +-3329, -3073, -3070, -3074, -3071, -3071, -3075, -3068, -3076, -2812, -2819, -2814, -2818, -2815, -2816, -2560, +-2304, -2304, -2049, -2046, -1794, -1535, -1536, -1536, -1536, -1792, -2048, -2560, -2815, -3586, -4094, -4866, +-5629, -6660, -7420, -8451, -9470, -9986, -10239, -10752, -10752, -10496, -9985, -9215, -7936, -6657, -4863, -3072, +-1025, 770, 2813, 4611, 6398, 7937, 9216, 9983, 11009, 11775, 12032, 12290, 12541, 12547, 12541, 12290, +12031, 11777, 11519, 11009, 11007, 10496, 9984, 9729, 9470, 9219, 8700, 8196, 8188, 7939, 7423, 7167, +7171, 6908, 6659, 6398, 6401, 6144, 5632, 5376, 5375, 4866, 4606, 4610, 4094, 3842, 3582, 3074, +2814, 2562, 2047, 1792, 1281, 1021, 772, 252, 4, -259, -766, -1026, -1278, -1537, -1792, -2048, +-2304, -2559, -2561, -2815, -2818, -2814, -2818, -2814, -2562, -2558, -2561, -2561, -2559, -2560, -2561, -2302, +-2306, -2302, -2051, -2301, -2307, -2557, -2562, -2814, -2819, -3069, -3075, -3325, -3330, -3583, -3841, -3840, +-4094, -4355, -4604, -4869, -4859, -4868, -5117, -5122, -5118, -5122, -5118, -4866, -4863, -4864, -4864, -4864, +-4865, -4862, -4611, -4349, -4098, -3840, -3582, -3587, -3325, -3074, -3072, -3070, -3075, -3068, -3076, -3069, +-3074, -2815, -2816, -2817, -2814, -2818, -2814, -2562, -2559, -2304, -2048, -2048, -1791, -1795, -1532, -1539, +-1534, -1794, -2046, -2306, -2814, -3329, -3840, -4864, -5632, -6400, -7424, -8192, -8960, -9728, -10240, -10496, +-10752, -10496, -10240, -9473, -8446, -7170, -5630, -3842, -1791, 256, 2048, 4096, 5887, 7169, 8704, 9984, +10752, 11263, 11777, 12031, 12290, 12541, 12548, 12283, 12037, 11771, 11524, 11263, 11007, 10498, 10238, 9985, +9473, 9213, 8964, 8444, 8195, 7935, 7679, 7170, 7165, 6914, 6656, 6400, 6399, 6146, 5885, 5379, +5374, 5121, 4607, 4609, 4095, 3841, 3584, 3327, 2817, 2559, 2304, 1794, 1533, 1027, 766, 512, +2, -259, -509, -1027, -1021, -1538, -1791, -2049, -2047, -2305, -2558, -2819, -2814, -2817, -2815, -2817, +-2560, -2559, -2562, -2557, -2563, -2558, -2561, -2559, -2306, -2301, -2051, -2046, -2305, -2303, -2561, -2815, +-2817, -3072, -3070, -3331, -3325, -3586, -3583, -3841, -3839, -4097, -4351, -4608, -4865, -4863, -5121, -5119, +-5121, -5119, -5120, -5121, -5119, -4865, -4863, -4864, -4865, -4863, -4609, -4351, -4096, -3842, -3836, -3589, +-3323, -3077, -3067, -3076, -3068, -3076, -3070, -3072, -3072, -3072, -2816, -2817, -2815, -2816, -2816, -2817, +-2558, -2307, -2045, -2051, -2045, -1795, -1532, -1541, -1532, -1794, -2047, -2048, -2561, -3071, -3840, -4352, +-5120, -6145, -6910, -7938, -8703, -9472, -10240, -10496, -10752, -10753, -10239, -9728, -8705, -7422, -6146, -4351, +-2560, -513, 1537, 3329, 5373, 6916, 8188, 9474, 10497, 11005, 11779, 12031, 12286, 12547, 12542, 12545, +12288, 12031, 11777, 11519, 11009, 10751, 10241, 9983, 9729, 9215, 8960, 8705, 8190, 8195, 7677, 7427, +7164, 7172, 6909, 6658, 6400, 6142, 5890, 5631, 5376, 5121, 4863, 4608, 4353, 4094, 3586, 3583, +3072, 2561, 2303, 2049, 1790, 1282, 768, 510, 259, -3, -511, -766, -1027, -1277, -1795, -2045, +-2051, -2301, -2563, -2557, -2819, -2814, -2817, -2816, -2559, -2561, -2560, -2560, -2559, -2562, -2557, -2563, +-2302, -2306, -2301, -2052, -2299, -2309, -2557, -2817, -2816, -2816, -3072, -3328, -3328, -3584, -3585, -3838, +-3842, -4094, -4354, -4607, -4864, -4863, -4866, -5118, -5122, -5118, -5121, -5120, -4864, -4864, -4864, -4864, +-4864, -4864, -4607, -4355, -4092, -3843, -3838, -3586, -3327, -3328, -3071, -3073, -3072, -3072, -3072, -3072, +-3071, -3073, -2816, -2815, -2817, -2816, -2815, -2818, -2557, -2306, -2304, -2047, -2050, -1790, -1537, -1535, +-1538, -1534, -1794, -2046, -2305, -2816, -3584, -4095, -4865, -5631, -6657, -7423, -8449, -9214, -9987, -10236, +-10756, -10749, -10497, -9985, -9214, -8194, -6654, -5122, -3070, -1282, 769, 2561, 4605, 6404, 7676, 9219, +9982, 11010, 11517, 11779, 12286, 12545, 12544, 12543, 12288, 12033, 11776, 11519, 11009, 11007, 10496, 9986, +9726, 9473, 9215, 8705, 8447, 8194, 7933, 7427, 7166, 7169, 6912, 6655, 6401, 6400, 6144, 5632, +5375, 5378, 4862, 4609, 4609, 4094, 3843, 3581, 3330, 2815, 2561, 2048, 1791, 1538, 1021, 771, +254, 1, -256, -769, -1022, -1282, -1534, -1794, -2047, -2303, -2563, -2555, -2822, -2811, -2819, -2814, +-2817, -2560, -2560, -2560, -2559, -2561, -2559, -2561, -2303, -2305, -2304, -2047, -2304, -2305, -2303, -2561, +-2816, -2815, -3073, -3071, -3329, -3328, -3583, -3841, -3839, -3841, -4352, -4607, -4864, -4865, -4863, -5121, +-5119, -5120, -5120, -5121, -5119, -4864, -4865, -4862, -4867, -4861, -4867, -4606, -4353, -4095, -3841, -3840, +-3584, -3327, -3073, -3072, -3071, -3074, -3069, -3075, -3069, -3074, -3071, -2816, -2817, -2814, -2818, -2815, +-2559, -2562, -2302, -2051, -2045, -1794, -1790, -1538, -1535, -1537, -1791, -2048, -2305, -2814, -3330, -3840, +-4606, -5379, -6397, -7170, -8191, -8961, -9472, -10238, -10499, -10749, -10498, -10240, -9471, -8449, -7168, -5631, +-3841, -2047, -2, 1795, 3836, 5636, 7165, 8450, 9727, 10753, 11263, 11776, 12033, 12286, 12547, 12541, +12290, 12287, 11776, 11777, 11262, 11010, 10750, 10242, 9982, 9474, 9214, 8962, 8446, 8193, 7936, 7680, +7425, 7165, 6916, 6652, 6404, 6397, 6146, 5886, 5635, 5373, 5123, 4861, 4611, 4349, 3843, 3582, +3328, 2818, 2556, 2309, 1788, 1538, 1024, 766, 515, -3, 3, -515, -1021, -1027, -1534, -1793, +-2047, -2049, -2303, -2561, -2560, -2815, -2817, -2815, -2817, -2559, -2561, -2559, -2560, -2561, -2559, -2560, +-2560, -2304, -2304, -2305, -2046, -2306, -2303, -2560, -2816, -2816, -3073, -3071, -3329, -3327, -3584, -3584, +-3841, -3839, -4097, -4351, -4608, -4866, -4861, -5123, -5117, -5123, -5118, -5121, -5120, -4863, -4865, -4864, +-4863, -4866, -4862, -4609, -4351, -4097, -3839, -3842, -3582, -3328, -3073, -3071, -3073, -3072, -3070, -3075, +-3069, -3075, -3069, -2819, -2813, -2819, -2813, -2819, -2813, -2563, -2301, -2307, -2045, -2051, -1789, -1539, +-1533, -1539, -1789, -2051, -2045, -2562, -2815, -3840, -4353, -5118, -5891, -6908, -7684, -8445, -9474, -9984, +-10494, -10755, -10749, -10242, -9727, -8961, -7679, -6400, -4609, -2815, -769, 1280, 3074, 5117, 6658, 8191, +9217, 10239, 11009, 11774, 12035, 12285, 12547, 12541, 12547, 12285, 12034, 11775, 11520, 11009, 10751, 10240, +9985, 9727, 9217, 8959, 8704, 8193, 8191, 7681, 7423, 7168, 7169, 6911, 6657, 6399, 6144, 5889, +5631, 5377, 5119, 4864, 4609, 4351, 4097, 3583, 3585, 3071, 2562, 2557, 2051, 1789, 1283, 767, +768, 255, 1, -512, -768, -1023, -1283, -1532, -2051, -2046, -2305, -2561, -2557, -2819, -2814, -2817, +-2816, -2815, -2561, -2560, -2560, -2559, -2561, -2559, -2561, -2305, -2301, -2307, -2045, -2307, -2302, -2561, +-2559, -2818, -2813, -3076, -3323, -3333, -3581, -3586, -3838, -3842, -4093, -4356, -4605, -4866, -4863, -4864, +-5120, -5121, -5118, -5122, -5119, -5120, -4865, -4862, -4866, -4862, -4866, -4606, -4610, -4350, -3843, -3836, +-3589, -3323, -3332, -3069, -3075, -3069, -3075, -3070, -3071, -3076, -3066, -2823, -2810, -2820, -2814, -2816, +-2818, -2557, -2564, -2299, -2052, -2046, -1792, -1794, -1534, -1535, -1540, -1787, -2052, -2302, -2816, -3585, +-4095, -4865, -5630, -6658, -7422, -8449, -9217, -9726, -10242, -10494, -10754, -10494, -10241, -9472, -8192, -6657, +-5118, -3586, -1533, 508, 2564, 4348, 6148, 7676, 8964, 9980, 11012, 11517, 11778, 12287, 12544, 12544, +12544, 12289, 12030, 11779, 11772, 11267, 11007, 10496, 9984, 9984, 9471, 9218, 8702, 8450, 8190, 7937, +7680, 7168, 7168, 6912, 6656, 6400, 6400, 6144, 5888, 5376, 5376, 5120, 4608, 4608, 4095, 3842, +3582, 3329, 2816, 2558, 2052, 1788, 1539, 1021, 771, 253, 4, -260, -509, -1026, -1023, -1537, +-1790, -2051, -2044, -2308, -2558, -2816, -2817, -2814, -2818, -2815, -2561, -2558, -2563, -2557, -2562, -2559, +-2560, -2306, -2301, -2307, -2045, -2050, -2304, -2303, -2561, -2815, -2817, -3071, -3073, -3327, -3329, -3583, +-3841, -3839, -3842, -4093, -4611, -4862, -4865, -4864, -5119, -5121, -5120, -5120, -5120, -5120, -4864, -4863, +-4866, -4863, -4864, -4864, -4608, -4352, -4096, -3840, -3839, -3586, -3326, -3074, -3070, -3073, -3072, -3071, +-3075, -3068, -3075, -2814, -2817, -2817, -2814, -2817, -2815, -2561, -2560, -2304, -2048, -2046, -1795, -1790, +-1538, -1533, -1538, -1790, -2052, -2044, -2818, -3071, -3840, -4609, -5375, -6144, -7169, -7935, -8705, -9471, +-10240, -10496, -10753, -10495, -10242, -9469, -8450, -7423, -5888, -4098, -2045, -3, 1795, 3582, 5377, 7167, +8449, 9727, 10497, 11264, 11774, 12036, 12283, 12549, 12540, 12290, 12032, 11775, 11778, 11262, 11009, 10752, +10240, 9984, 9473, 9214, 8962, 8447, 8192, 7937, 7678, 7427, 7164, 6916, 6909, 6658, 6399, 6144, +5888, 5633, 5374, 5123, 4861, 4610, 4351, 3840, 3585, 3327, 3073, 2559, 2305, 1791, 1537, 1279, +769, 511, 1, 0, -514, -1021, -1027, -1277, -1794, -2047, -2049, -2303, -2561, -2559, -2817, -2815, +-2817, -2815, -2817, -2559, -2562, -2557, -2563, -2557, -2563, -2558, -2305, -2303, -2306, -2302, -2306, -2303, +-2559, -2819, -2812, -2820, -3069, -3330, -3326, -3586, -3582, -3841, -3840, -4095, -4353, -4608, -4863, -4865, +-5120, -5119, -5121, -5119, -5121, -5119, -4866, -4861, -4868, -4859, -4869, -4859, -4613, -4349, -4097, -3840, +-3839, -3585, -3328, -3071, -3074, -3070, -3074, -3070, -3074, -3070, -3073, -3073, -2814, -2818, -2815, -2815, +-2819, -2812, -2563, -2303, -2304, -2048, -2048, -1792, -1537, -1534, -1538, -1534, -1795, -2045, -2562, -2815, +-3584, -4353, -4862, -5890, -6655, -7681, -8446, -9474, -9982, -10243, -10749, -10755, -10493, -9986, -8959, -7681, +-6399, -4866, -2813, -1026, 1025, 3071, 4865, 6399, 7937, 9216, 10239, 11009, 11775, 12033, 12288, 12543, +12545, 12543, 12289, 12031, 11777, 11519, 11009, 10751, 10496, 9985, 9727, 9473, 9215, 8705, 8191, 8192, +7937, 7422, 7172, 7163, 6916, 6653, 6402, 6399, 6145, 5630, 5379, 5117, 4866, 4608, 4349, 4100, +3837, 3586, 3071, 2816, 2559, 2051, 1789, 1282, 768, 766, 258, -1, -255, -769, -1023, -1281, +-1537, -2045, -2051, -2302, -2560, -2563, -2812, -2819, -2814, -2817, -2816, -2560, -2560, -2560, -2560, -2560, +-2559, -2562, -2301, -2309, -2299, -2050, -2304, -2303, -2563, -2557, -2818, -2814, -3074, -3071, -3328, -3328, +-3585, -3838, -3843, -4092, -4355, -4607, -4864, -4865, -4862, -5122, -5119, -5120, -5121, -5119, -5120, -4865, +-4862, -4867, -4861, -4867, -4604, -4613, -4347, -4101, -3835, -3589, -3323, -3332, -3070, -3072, -3073, -3071, +-3073, -3070, -3075, -3068, -2820, -2814, -2816, -2816, -2817, -2814, -2563, -2557, -2307, -2045, -2051, -1789, +-1795, -1534, -1537, -1536, -1792, -2047, -2306, -2814, -3329, -3840, -4864, -5631, -6659, -7419, -8197, -8957, +-9729, -10241, -10494, -10753, -10496, -10240, -9473, -8446, -6914, -5373, -3587, -1791, 256, 2304, 4097, 5887, +7424, 8704, 9985, 10751, 11264, 11777, 12030, 12291, 12541, 12546, 12287, 12033, 11774, 11523, 11260, 11013, +10492, 9986, 9984, 9471, 9218, 8958, 8449, 8192, 7936, 7425, 7166, 7170, 6911, 6656, 6400, 6401, +6142, 5891, 5373, 5378, 5119, 4609, 4606, 4098, 3838, 3586, 3327, 2817, 2558, 2305, 1792, 1536, +1025, 767, 512, 0, -256, -512, -1023, -1025, -1536, -1791, -2050, -2046, -2306, -2558, -2817, -2816, +-2816, -2817, -2814, -2561, -2560, -2560, -2560, -2559, -2561, -2560, -2560, -2303, -2305, -2047, -2049, -2304, +-2303, -2561, -2815, -2817, -3071, -3073, -3327, -3328, -3585, -3584, -3838, -3843, -4093, -4354, -4864, -4863, +-4865, -5120, -5119, -5121, -5119, -5121, -5120, -4863, -4866, -4860, -4868, -4862, -4865, -4608, -4351, -4097, +-3839, -3841, -3584, -3328, -3072, -3071, -3073, -3072, -3071, -3074, -3069, -3075, -3069, -2819, -2813, -2819, +-2813, -2819, -2558, -2561, -2303, -2049, -2047, -2050, -1789, -1538, -1536, -1535, -1793, -2047, -2048, -2561, +-3072, -3839, -4609, -5376, -6143, -6913, -7936, -8703, -9474, -10238, -10497, -10752, -10752, -10239, -9730, -8702, +-7425, -5888, -4351, -2561, -512, 1537, 3584, 5374, 6915, 8190, 9472, 10499, 11003, 11780, 12030, 12289, +12544, 12543, 12545, 12287, 12033, 11775, 11521, 11007, 10753, 10239, 9985, 9727, 9217, 8959, 8705, 8190, +7939, 7677, 7426, 7168, 7166, 6914, 6399, 6400, 6144, 5889, 5630, 5379, 5117, 4866, 4607, 4351, +4099, 3581, 3331, 3070, 2560, 2305, 2047, 1793, 1280, 767, 513, 255, 1, -513, -767, -1024, +-1281, -1790, -2051, -2045, -2306, -2558, -2562, -2814, -2818, -2814, -2818, -2559, -2560, -2560, -2560, -2559, +-2563, -2556, -2564, -2301, -2306, -2047, -2047, -2307, -2300, -2564, -2813, -2818, -2815, -3073, -3326, -3330, +-3583, -3584, -3841, -3838, -4098, -4351, -4608, -4865, -4862, -5122, -5119, -5120, -5121, -5118, -5122, -4863, +-4864, -4864, -4864, -4863, -4866, -4606, -4354, -4095, -3838, -3844, -3580, -3331, -3070, -3072, -3073, -3071, +-3073, -3071, -3073, -3070, -3075, -2813, -2819, -2814, -2817, -2815, -2817, -2560, -2304, -2303, -2050, -2045, +-1795, -1534, -1537, -1535, -1538, -1789, -2051, -2557, -2819, -3581, -4099, -4861, -5635, -6654, -7424, -8450, +-9213, -9987, -10237, -10754, -10752, -10496, -9983, -9217, -7935, -6657, -4865, -3069, -1027, 769, 2817, 4606, +6402, 7935, 9216, 9984, 11009, 11518, 11778, 12287, 12543, 12547, 12540, 12292, 12028, 11779, 11519, 11008, +11009, 10494, 9986, 9727, 9217, 9215, 8704, 8449, 8191, 7681, 7423, 7168, 7169, 6910, 6658, 6399, +6400, 5889, 5630, 5378, 5374, 4866, 4606, 4610, 4094, 3842, 3582, 3074, 2813, 2563, 2046, 1793, +1536, 1023, 769, 255, 0, -255, -769, -1023, -1282, -1534, -1793, -2048, -2304, -2560, -2560, -2815, +-2818, -2815, -2816, -2816, -2816, -2560, -2560, -2561, -2558, -2562, -2559, -2304, -2305, -2302, -2050, -2303, +-2304, -2561, -2558, -2818, -2815, -3072, -3073, -3326, -3331, -3580, -3844, -3836, -4099, -4351, -4607, -4866, +-4862, -4865, -5120, -5120, -5120, -5120, -5120, -4864, -4864, -4864, -4863, -4866, -4862, -4865, -4608, -4351, +-4097, -3839, -3585, -3328, -3327, -3073, -3070, -3075, -3069, -3075, -3070, -3073, -3071, -3073, -2815, -2817, +-2815, -2817, -2815, -2560, -2561, -2302, -2051, -2045, -1794, -1791, -1536, -1536, -1537, -1791, -2049, -2303, +-2816, -3329, -3840, -4862, -5635, -6397, -7427, -8190, -8960, -9729, -10238, -10498, -10752, -10495, -10241, -9471, +-8448, -7169, -5632, -3839, -2049, 1, 2048, 4096, 5631, 7170, 8702, 9730, 10751, 11264, 11776, 12033, +12286, 12547, 12540, 12292, 12029, 11777, 11777, 11261, 11011, 10494, 10241, 9984, 9471, 9217, 8959, 8449, +8192, 7935, 7682, 7421, 7171, 6909, 6660, 6396, 6403, 6142, 5889, 5632, 5377, 5118, 4610, 4606, +4354, 3839, 3585, 3326, 2818, 2559, 2304, 1793, 1534, 1026, 767, 512, 0, -256, -512, -1024, +-1024, -1536, -1792, -2048, -2048, -2305, -2559, -2560, -2816, -2816, -2817, -2816, -2559, -2561, -2558, -2563, +-2557, -2563, -2557, -2306, -2303, -2304, -2049, -2047, -2304, -2305, -2559, -2816, -2817, -3071, -3073, -3327, +-3328, -3585, -3583, -3842, -3837, -4098, -4351, -4609, -4863, -4866, -5117, -5122, -5119, -5120, -5121, -4863, +-4865, -4863, -4864, -4866, -4861, -4867, -4605, -4354, -4096, -3839, -3841, -3583, -3328, -3074, -3069, -3075, +-3069, -3075, -3069, -3076, -3067, -3077, -2812, -2818, -2816, -2815, -2817, -2560, -2559, -2305, -2048, -2047, +-2050, -1789, -1538, -1536, -1535, -1793, -2047, -2049, -2558, -3075, -3837, -4354, -5119, -5888, -6912, -7680, +-8448, -9472, -10240, -10496, -10752, -10751, -10241, -9728, -8960, -7680, -6144, -4607, -2561, -769, 1283, 3323, +5126, 6651, 8195, 9215, 10239, 11010, 11775, 12032, 12289, 12542, 12547, 12541, 12291, 11773, 11779, 11517, +11011, 10749, 10242, 9983, 9729, 9215, 8961, 8702, 8195, 8189, 7684, 7419, 7172, 7166, 6913, 6656, +6398, 6147, 5885, 5635, 5373, 5122, 4862, 4610, 4350, 4098, 3582, 3586, 3069, 2564, 2299, 2054, +1786, 1286, 763, 515, 255, 0, -511, -769, -1024, -1279, -1537, -2047, -2049, -2303, -2560, -2560, +-2817, -2814, -2818, -2814, -2817, -2561, -2558, -2562, -2558, -2561, -2561, -2558, -2306, -2302, -2050, -2046, +-2306, -2302, -2562, -2815, -2816, -2816, -3072, -3328, -3328, -3585, -3582, -3842, -3839, -4096, -4352, -4608, +-4864, -4865, -4863, -5120, -5121, -5118, -5122, -5119, -5121, -4863, -4864, -4864, -4865, -4863, -4610, -4604, +-4100, -3838, -3840, -3586, -3325, -3330, -3071, -3073, -3071, -3073, -3071, -3072, -3072, -3074, -2813, -2819, +-2813, -2818, -2815, -2818, -2557, -2563, -2301, -2050, -2047, -1794, -1790, -1537, -1535, -1536, -1793, -2048, +-2303, -2817, -3582, -4099, -4860, -5637, -6651, -7427, -8448, -9213, -9733, -10235, -10755, -10751, -10496, -9984, +-9217, -8190, -6657, -5120, -3328, -1281, 770, 2558, 4610, 6398, 7681, 8960, 9983, 11009, 11519, 11777, +12287, 12545, 12543, 12545, 12287, 12033, 11775, 11521, 11263, 11009, 10495, 9986, 9981, 9475, 9213, 8707, +8446, 8194, 7934, 7681, 7168, 7167, 6914, 6654, 6401, 6400, 6143, 5889, 5375, 5377, 4863, 4609, +4607, 4096, 3841, 3583, 3329, 2815, 2560, 2049, 1791, 1537, 1023, 768, 257, -1, -255, -514, +-1022, -1281, -1535, -1794, -2045, -2308, -2300, -2563, -2814, -2817, -2815, -2817, -2816, -2560, -2559, -2561, +-2558, -2564, -2556, -2564, -2300, -2306, -2304, -2048, -2048, -2304, -2304, -2559, -2818, -2814, -3074, -3070, +-3330, -3326, -3586, -3839, -3840, -3841, -4094, -4610, -4863, -4865, -4863, -5120, -5120, -5121, -5119, -5121, +-5118, -4866, -4863, -4864, -4865, -4862, -4866, -4607, -4353, -4094, -3842, -3839, -3585, -3328, -3070, -3074, +-3071, -3072, -3073, -3070, -3075, -3068, -2820, -2812, -2820, -2813, -2819, -2812, -2564, -2557, -2306, -2047, +-2049, -1790, -1795, -1532, -1540, -1533, -1794, -2047, -2304, -2817, -3071, -3840, -4608, -5376, -6401, -7167, +-7937, -8958, -9474, -10239, -10496, -10753, -10494, -10243, -9469, -8450, -7423, -5632, -3841, -2047, -1, 1793, +3839, 5377, 7168, 8447, 9729, 10495, 11265, 11777, 12029, 12292, 12540, 12547, 12286, 12033, 11775, 11778, +11262, 11009, 10752, 10239, 9985, 9472, 9215, 8962, 8446, 8193, 7936, 7680, 7424, 7168, 6912, 6657, +6399, 6400, 6145, 5886, 5635, 5373, 5122, 4863, 4609, 4350, 3843, 3580, 3332, 3070, 2560, 2305, +1790, 1538, 1023, 768, 512, 0, 0, -512, -1024, -1025, -1278, -1794, -2047, -2048, -2305, -2558, +-2562, -2815, -2816, -2816, -2816, -2816, -2560, -2560, -2559, -2561, -2560, -2559, -2561, -2303, -2305, -2046, +-2051, -2300, -2309, -2555, -2820, -2813, -2818, -3071, -3329, -3327, -3584, -3584, -3840, -3842, -4093, -4354, +-4605, -4868, -4861, -5122, -5118, -5121, -5120, -5119, -5121, -4863, -4865, -4863, -4865, -4862, -4866, -4608, +-4350, -4098, -3839, -3841, -3583, -3329, -3070, -3074, -3072, -3070, -3074, -3070, -3073, -3073, -3069, -2819, +-2814, -2817, -2817, -2812, -2821, -2556, -2308, -2045, -2049, -2048, -1792, -1536, -1536, -1536, -1536, -1792, +-2048, -2559, -3074, -3837, -4355, -5117, -5891, -6653, -7682, -8447, -9472, -9985, -10494, -10754, -10750, -10243, +-9981, -8961, -7681, -6398, -4867, -2813, -1026, 1025, 3071, 4866, 6653, 8195, 9213, 10244, 11004, 11779, +12030, 12288, 12547, 12540, 12548, 12284, 12035, 11775, 11520, 11008, 10751, 10498, 9982, 9731, 9212, 9219, +8702, 8194, 8190, 7938, 7422, 7170, 7166, 6913, 6656, 6400, 6400, 5888, 5631, 5377, 5120, 4864, +4607, 4610, 4094, 3585, 3584, 3071, 2561, 2561, 2046, 1794, 1278, 769, 768, 257, -2, -253, +-771, -1022, -1282, -1533, -2052, -2043, -2309, -2557, -2561, -2816, -2816, -2817, -2814, -2562, -2558, -2562, +-2559, -2560, -2560, -2560, -2560, -2304, -2305, -2302, -2050, -2045, -2307, -2558, -2562, -2814, -2818, -3069, +-3332, -3324, -3331, -3583, -3839, -3843, -4092, -4356, -4604, -4868, -4860, -4868, -5116, -5124, -5117, -5121, +-5120, -4864, -4864, -4864, -4864, -4863, -4866, -4862, -4610, -4350, -3841, -3840, -3584, -3328, -3329, -3069, +-3075, -3070, -3074, -3070, -3074, -3070, -3073, -2816, -2816, -2816, -2817, -2814, -2818, -2558, -2562, -2303, +-2048, -2049, -1791, -1536, -1536, -1537, -1534, -1795, -2045, -2306, -2815, -3328, -4096, -4865, -5631, -6657, +-7423, -8448, -9217, -9727, -10241, -10495, -10752, -10497, -10239, -9472, -8448, -6912, -5376, -3585, -1534, 511, +2560, 4352, 5888, 7423, 8962, 9982, 10754, 11263, 11776, 12031, 12291, 12541, 12546, 12287, 12031, 11779, +11517, 11266, 11007, 10495, 9985, 9984, 9471, 9218, 8701, 8450, 8192, 7934, 7427, 7164, 7172, 6910, +6655, 6403, 6396, 6147, 5631, 5376, 5376, 5120, 4608, 4607, 4098, 3837, 3587, 3326, 2817, 2560, +2046, 1795, 1533, 1028, 764, 515, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 256, -4608, -9728, -12544, -14848, -15872, -17408, -17152, -17920, +-20224, -20736, -19456, -19456, -17151, -12546, -7167, -3328, -512, 1792, 5121, 6654, 7170, 11005, 15363, 19967, +21761, 22782, 21762, 20478, 17922, 16895, 14848, 13824, 12290, 12284, 12035, 8959, 4607, 1283, -1796, -5629, +-7938, -9983, -10752, -11521, -11518, -13826, -15871, -18432, -18177, -19199, -17920, -16641, -16383, -15873, -15870, -16387, +-17405, -17411, -16637, -12802, -8702, -5635, -3581, -2, 1281, 3072, 4095, 6146, 9470, 13825, 18432, 22271, +23553, 23040, 22272, 21248, 18176, 16127, 15362, 14078, 13314, 10239, 6400, 1792, -3328, -8448, -11263, -14081, +-16128, -17152, -17408, -17408, -19455, -19970, -20222, -20226, -18943, -16128, -10753, -6398, -2306, 1025, 4607, 4865, +5120, 8448, 12031, 16385, 19967, 21249, 21248, 20992, 17919, 16641, 16383, 13826, 11518, 12546, 12797, 9220, +6908, 1796, -1028, -3324, -8196, -10749, -10497, -11265, -12798, -14851, -17149, -18434, -19199, -20481, -19711, -18433, +-17407, -17921, -16895, -16385, -17920, -16895, -13825, -11007, -7681, -3839, -1537, 514, 2813, 3588, 4092, 5380, +9212, 13828, 18684, 21765, 23290, 24069, 22013, 19457, 16641, 15101, 15107, 14078, 12033, 11007, 7937, 2304, +-2561, -6911, -11009, -13311, -15360, -16896, -16128, -16640, -17664, -18432, -19712, -19967, -18689, -16128, -12544, -7424, +-3327, -514, 2818, 5630, 5889, 6657, 9470, 13826, 17150, 18433, 18689, 19966, 18946, 16383, 15104, 13569, +10494, 11266, 12030, 9218, 6654, 3586, -258, -2046, -5890, -10495, -10495, -10499, -12796, -14596, -15356, -16642, +-17408, -18431, -18690, -18174, -17921, -18431, -17664, -16129, -16127, -15361, -13311, -11776, -7425, -5118, -2562, 513, +2815, 3329, 6400, 7935, 9218, 14076, 17669, 19963, 23301, 22780, 21506, 20480, 17662, 15363, 15358, 13056, +11009, 10750, 6659, 2558, -1280, -6400, -9984, -12031, -15104, -16642, -16638, -16129, -16640, -18175, -19201, -18687, +-17922, -16894, -12546, -8446, -4353, -1025, 2049, 5377, 5629, 4356, 6908, 11267, 15615, 16639, 18179, 19452, +17924, 14589, 14082, 12287, 9472, 9728, 10752, 9216, 6913, 4606, 514, -1793, -5377, -10238, -10241, -8959, +-12801, -13312, -14080, -15871, -16641, -17919, -18690, -18686, -18688, -18434, -17405, -16644, -17148, -16130, -12801, -9981, +-7940, -4860, -1795, 1793, 3841, 4094, 5890, 7678, 9730, 13311, 17664, 19969, 22015, 21504, 21249, 19455, +17153, 15359, 14081, 12799, 11521, 9472, 7167, 3329, -513, -5375, -8705, -11262, -13571, -15101, -14339, -14845, +-16131, -16124, -17669, -18171, -17924, -15357, -12546, -8959, -5889, -2558, 765, 4611, 3326, 3585, 7680, 9982, +12804, 16124, 16900, 18684, 18179, 15614, 14594, 12542, 9474, 10494, 11265, 9984, 8191, 4610, 1790, -255, +-5377, -9983, -8960, -10496, -11264, -11521, -13310, -15619, -16124, -17155, -17918, -18433, -19201, -17918, -17154, -16638, +-17409, -15872, -12543, -10754, -8189, -4611, -1789, 1534, 4353, 4608, 5887, 8450, 9213, 12548, 16636, 18691, +20990, 21761, 20992, 19967, 17153, 14592, 14592, 13311, 10241, 9726, 7427, 3325, 771, -3075, -7677, -8708, +-11772, -14083, -12798, -13057, -15872, -15103, -15362, -17150, -16898, -14591, -12288, -9473, -6398, -3843, -509, 1533, +1539, 2302, 6913, 8959, 10753, 13312, 15871, 16897, 17664, 15103, 13570, 12542, 9985, 9728, 10752, 8703, +6914, 5374, 1793, -511, -3843, -7933, -9730, -9727, -11264, -12033, -13823, -16640, -15872, -15361, -18175, -19457, +-18942, -18946, -18686, -18435, -18173, -16130, -13566, -11777, -9217, -5118, -1795, -253, 1791, 4351, 5122, 7165, +10243, 12797, 15875, 18686, 19200, 19969, 19710, 18947, 16638, 15360, 14848, 12800, 11521, 9983, 7168, 4352, +768, -3583, -6913, -8704, -10496, -12032, -12799, -13058, -14590, -14081, -15105, -16638, -16643, -14333, -11521, -10496, +-7425, -4095, -1536, -512, 768, 1792, 4096, 7169, 8446, 11011, 15356, 16133, 15098, 15622, 14588, 11777, +9986, 10236, 10244, 8445, 7681, 5121, 2815, 512, -2816, -6144, -7680, -9471, -11521, -12289, -12797, -14597, +-16633, -15623, -17147, -19204, -19197, -19713, -19968, -18944, -18176, -16641, -14333, -12036, -8956, -5123, -1790, -257, +1280, 4353, 5887, 9217, 11774, 13059, 16637, 17923, 18173, 19459, 18941, 16898, 17151, 15872, 13826, 13052, +10500, 8445, 7425, 5121, 510, -1790, -5121, -7168, -8703, -9730, -11773, -12035, -12285, -13315, -13566, -14336, +-15361, -14079, -11520, -9986, -7165, -5379, -3838, -1025, 1, -2, 2563, 5884, 7428, 9213, 12034, 13055, +14593, 14079, 13313, 11007, 11008, 11265, 9471, 7937, 7423, 5633, 2815, 1281, -1281, -4351, -6144, -7425, +-9982, -12291, -13308, -14596, -16637, -16387, -17661, -18434, -18430, -19715, -20221, -19971, -19452, -18692, -15869, -13058, +-8703, -6144, -2817, -254, 765, 1540, 4091, 7430, 9977, 12551, 15610, 18437, 18684, 17923, 16126, 15361, +15104, 13567, 13825, 12800, 11007, 10242, 7934, 4353, 511, -2046, -3843, -4092, -7173, -8700, -8449, -9473, +-10239, -11265, -12800, -13310, -12546, -13311, -11264, -8961, -7422, -6914, -4606, -2050, -1789, -515, 2050, 4351, +5888, 8449, 9215, 10753, 12543, 13056, 12545, 11518, 11266, 11007, 9216, 7168, 6400, 4351, 3074, 1790, +-1278, -4354, -5375, -6913, -9727, -11264, -12289, -14335, -14593, -16640, -16895, -15874, -16381, -18691, -18685, -18179, +-18686, -17920, -16385, -13311, -9216, -5378, -3837, -514, 1537, 2304, 4351, 8705, 10495, 11266, 15102, 17921, +19199, 18690, 15869, 15108, 15355, 14085, 13052, 12547, 11774, 10241, 9216, 5887, 1538, -1795, -3069, -3586, +-4864, -6910, -7427, -6652, -7685, -9211, -11269, -12026, -11270, -10746, -11270, -8443, -6915, -5887, -3071, -1539, +-3324, -1285, 5, 3580, 6659, 7678, 9216, 11265, 11775, 11522, 11774, 10241, 10752, 12031, 10498, 7934, +5121, 2561, 1277, 260, -2820, -5373, -6657, -7937, -8190, -11010, -13822, -14594, -14847, -15871, -15875, -16123, +-15879, -16376, -16391, -15867, -16899, -16894, -16130, -13821, -9219, -5886, -2816, -1026, 1282, 2560, 3838, 6403, +8957, 11522, 13823, 17153, 17150, 17411, 15356, 13316, 13054, 11776, 10241, 9471, 9984, 9473, 8447, 5633, +1792, -513, -3071, -3585, -4094, -3842, -5120, -4095, -5889, -6654, -8706, -9983, -9986, -9212, -8709, -7930, +-6149, -4605, -3073, -2049, -2301, -2052, -252, 2045, 5122, 6142, 8962, 9983, 9472, 9472, 9472, 8448, +9985, 11262, 9729, 8192, 6144, 2560, -256, -2560, -4096, -6911, -6658, -7166, -9217, -8704, -11775, -14593, +-15359, -15873, -17663, -17410, -17149, -16131, -16125, -15875, -16125, -16132, -15100, -12803, -8702, -4353, -1535, 254, +2818, 6143, 5888, 7170, 9981, 12546, 15103, 16640, 18433, 17407, 17153, 15358, 12803, 10749, 8962, 7936, +9470, 9986, 7167, 4864, 3329, 510, -2558, -4610, -4861, -4356, -3324, -3331, -3839, -3839, -5378, -7421, +-8707, -7678, -8705, -6144, -4351, -3072, -1794, -1277, -1795, -1021, -515, 2, 2815, 5121, 7423, 9217, +9726, 8451, 7933, 7426, 7423, 8961, 8191, 6400, 6657, 4607, 1024, -3839, -7169, -8447, -8704, -9730, +-10237, -11011, -11261, -12546, -15103, -16129, -19455, -20225, -18687, -17153, -15870, -14595, -15100, -13829, -12540, -12289, +-9217, -4606, -2562, 1280, 4355, 6139, 7429, 9213, 11521, 13312, 15103, 16130, 18174, 17921, 17408, 14591, +12802, 9726, 6913, 6144, 7423, 6913, 6144, 3840, 2304, 255, -1535, -5376, -5120, -3328, -3841, -2814, +-2563, -3324, -3844, -4604, -6916, -6654, -6656, -5376, -3840, -1281, -511, -1026, -2300, -517, 772, 510, +1792, 3841, 4350, 7426, 8192, 7167, 7425, 6399, 5632, 7426, 8445, 6147, 6654, 5377, 1279, -1791, +-6402, -9725, -12034, -10752, -10238, -11780, -13051, -13061, -15100, -17410, -18175, -21249, -20479, -18689, -17407, -16129, +-13567, -13313, -12031, -9985, -7167, -6145, -3583, 511, 5121, 7168, 8446, 9732, 13051, 14854, 15609, 17159, +17402, 17925, 16636, 15362, 12800, 11519, 8449, 8447, 7425, 5632, 4351, 3840, 2561, 1023, -1022, -2563, +-3837, -3587, -2558, -2305, -2559, -2049, -2815, -3841, -3328, -5119, -4866, -4094, -3072, -3329, -1023, -2, +2, -1, 514, 1789, 1539, 3580, 5124, 6654, 7169, 7679, 7681, 6910, 5891, 5373, 7427, 7165, +4354, 2815, 769, -769, -4095, -7682, -11262, -13313, -13823, -14080, -14594, -14590, -14593, -18175, -18432, -17665, +-20223, -21249, -18430, -16131, -15101, -12802, -11519, -8961, -5120, -2815, -1024, 2303, 5376, 6656, 9984, 12545, +14336, 15870, 17410, 18430, 18691, 17149, 15875, 14844, 12036, 10750, 8448, 6914, 5117, 3074, 3584, 3071, +1282, 510, -1791, -2560, -3072, -4864, -5120, -2561, -1790, -770, -1022, -1794, -1278, -3842, -4094, -2818, +-767, -1023, -1, 1280, 1793, 1021, 772, 1021, 2050, 3327, 2816, 4096, 6401, 6142, 6147, 5628, +4356, 3325, 2306, 4350, 4098, 2814, 514, -514, -4095, -6144, -9728, -12544, -14081, -15871, -17153, -16127, +-16384, -16384, -18690, -18684, -18182, -20217, -20742, -17660, -14851, -13565, -10500, -8955, -5381, -2300, -3, 1025, +4608, 6657, 7934, 11011, 15100, 16387, 17151, 19967, 19971, 18173, 16386, 14334, 13058, 11262, 9474, 6655, +5120, 3840, 1792, 2047, 770, -1281, -3840, -3328, -3073, -4607, -4608, -4096, -1280, -1280, -1025, -1534, +-1282, -1023, -512, -513, -510, -2, 513, 2816, 3070, 2563, 2046, 1536, 2562, 4093, 3075, 4093, +5634, 5631, 6145, 5120, 3326, 3843, 2556, 773, 2556, 515, -1538, -1792, -2559, -5888, -7936, -11521, +-13567, -14849, -16895, -17921, -17407, -16897, -18430, -18690, -18688, -18175, -18689, -18173, -16900, -14333, -12291, -9469, +-5378, -1279, 1024, 3583, 5377, 6655, 8705, 11263, 13313, 16127, 17920, 18689, 20734, 20483, 17917, 15617, +13056, 9472, 8705, 5887, 4607, 4610, 3327, 0, 1, -1794, -4606, -5377, -4352, -5119, -4353, -3839, +-3842, -2045, -1795, -1278, -512, -770, -1021, 1278, 1536, 1793, 3071, 4096, 4866, 5629, 4355, 2301, +3330, 2815, 3073, 4094, 4355, 4348, 4357, 3067, 2819, 2303, 1023, -1789, -771, -510, -1793, -4352, +-4352, -5888, -7424, -9984, -13311, -14338, -16127, -17408, -19200, -18944, -17664, -18177, -19199, -17664, -17663, -19458, +-17150, -15106, -13311, -9215, -5890, -2557, 765, 3841, 4865, 7422, 8707, 9469, 11266, 15102, 17922, 17919, +19713, 20222, 18689, 15617, 12542, 11010, 9726, 7169, 6145, 5631, 3327, 1026, -258, -2302, -4097, -5632, +-5632, -5376, -4608, -4096, -4608, -2815, -1538, -1534, -1794, -510, -257, 1536, 2304, 3584, 4865, 5631, +5888, 6912, 5632, 4097, 4608, 4094, 3842, 4606, 4098, 4352, 5374, 3330, 2046, 2562, 511, -1536, +-3328, -3327, -2562, -4094, -6402, -6141, -6404, -9467, -12038, -14330, -14853, -16380, -18179, -19198, -17665, -17152, +-17664, -17151, -16131, -17148, -17155, -14847, -12799, -9219, -5373, -3073, 1279, 4867, 5371, 6661, 8700, 9219, +11007, 13055, 14594, 17150, 17922, 18430, 18177, 17664, 13312, 10752, 9472, 6656, 5376, 5376, 4095, 3331, +2556, 5, -1797, -3325, -6400, -5889, -4607, -5121, -3584, -2302, -1539, -1020, -517, -1787, -1796, 2, +1024, 3072, 5120, 6655, 7425, 7936, 7424, 5632, 4864, 4352, 5120, 4607, 4610, 4094, 3330, 4094, +3842, 1534, -1534, -2050, -4095, -5376, -5121, -4605, -6148, -7421, -7169, -9217, -11774, -13826, -16382, -16641, +-17407, -20482, -22014, -18433, -18175, -18689, -16895, -16897, -17919, -15105, -12543, -10241, -5118, -2306, -511, 4607, +6658, 7166, 9474, 10494, 10754, 13310, 13826, 13823, 16896, 18689, 17918, 16129, 13825, 10495, 8192, 6656, +4607, 3074, 2558, 1538, 1534, 769, -1024, -3841, -5118, -6658, -7166, -6658, -5887, -2560, -1536, -768, +0, -256, -512, 512, 511, 1793, 5376, 7424, 8192, 8702, 9219, 7933, 6147, 5117, 3843, 4605, +4611, 4349, 3586, 3839, 3585, 2047, -1023, -3329, -4608, -6655, -6401, -5887, -6913, -8448, -8703, -8961, +-11264, -13823, -15617, -16640, -17151, -17666, -21246, -22272, -19457, -19967, -19201, -17152, -16638, -15363, -11260, -9220, +-6398, -3072, -513, 2561, 6400, 8959, 9474, 11261, 13570, 15103, 16130, 14845, 15107, 16380, 17156, 16126, +13312, 9985, 9214, 7171, 5373, 3331, 1533, 258, 256, 511, -1791, -2049, -4096, -4606, -6146, -6910, +-6659, -5117, -3841, -2305, -1277, -261, 7, 761, 2309, 2556, 3075, 6399, 8704, 8704, 9472, 9472, +8448, 8191, 6403, 4860, 5380, 4604, 4355, 3326, 2305, 1792, -1, -3326, -4611, -5629, -8707, -8701, +-8706, -9983, -9729, -9727, -11777, -13567, -14336, -16385, -18175, -18432, -19969, -22014, -22275, -21757, -20225, -19712, +-18433, -15615, -12545, -9982, -6402, -2559, -512, 1279, 5377, 8704, 10495, 12289, 13311, 14593, 16128, 15359, +14081, 15103, 15105, 14592, 13824, 12031, 8961, 8192, 5631, 3586, 1278, -511, -256, 255, -511, -2560, +-3072, -5120, -5889, -7166, -7170, -6654, -5634, -3326, -1026, -510, -258, 258, 1790, 1793, 2305, 4605, +7940, 8956, 10499, 10238, 9217, 8703, 8194, 6910, 6145, 5887, 5121, 5120, 3072, 3583, 1537, -2049, +-3839, -5120, -7682, -9213, -9219, -11006, -12032, -10754, -12029, -13571, -13310, -15361, -17920, -17920, -19967, -22785, +-20993, -20734, -21506, -20990, -18944, -16899, -13308, -11011, -7935, -3070, -772, 516, 4093, 7937, 9986, 12540, +14084, 15357, 16642, 16639, 16641, 17150, 16131, 14845, 14082, 12799, 9985, 9214, 7938, 5887, 3584, 2304, +1, 254, 2, -2049, -2049, -3070, -5378, -5886, -4866, -6143, -6400, -5376, -3329, -1022, -514, 514, +2558, 3073, 4864, 4608, 5889, 8701, 10755, 11519, 12543, 9731, 10236, 9475, 8703, 8192, 6400, 3841, +3582, 3074, 2046, 1794, -2561, -3840, -5889, -9214, -11010, -10494, -13825, -12033, -11262, -12290, -14078, -14594, +-17406, -16898, -18943, -22016, -23041, -21247, -21761, -22271, -19968, -16897, -13823, -11777, -9471, -5888, -1792, -768, +1536, 5376, 8704, 10240, 12545, 14334, 15874, 15615, 15360, 15872, 14849, 13054, 12546, 12798, 11778, 9983, +8448, 7169, 5373, 3076, 1021, 1, 1, -514, -1278, -1538, -3326, -4098, -5374, -5890, -6143, -6399, +-3842, -766, -2, 2, 1534, 2051, 3068, 4357, 4091, 6148, 9469, 10754, 11007, 11777, 10751, 9729, +8959, 7936, 5889, 5887, 4353, 3071, 3328, 1793, -2305, -4863, -5889, -8703, -11009, -11775, -14081, -14079, +-12544, -12801, -14591, -15104, -16385, -18943, -17920, -19968, -21504, -20224, -20481, -23294, -21762, -17918, -15873, -13313, +-9982, -6659, -3581, -1, 1279, 4353, 7935, 10241, 11007, 13313, 15103, 15361, 16895, 18176, 15874, 13821, +11523, 10494, 11521, 11263, 9218, 8702, 6658, 4351, 3583, 1282, -514, 2, 510, 258, -514, -2815, +-4352, -3584, -3839, -5890, -3326, -2306, 2, 2303, 2817, 2303, 3584, 3585, 3839, 7424, 8961, 10238, +12291, 12029, 11266, 10494, 9731, 7676, 6660, 5629, 5122, 3327, 1791, 1282, -513, -2303, -5890, -8446, +-11266, -11006, -12545, -14592, -14079, -13826, -14846, -15618, -16381, -17411, -17662, -19458, -21246, -20481, -21504, -24576, +-23040, -17151, -15105, -13824, -10495, -7682, -3325, -3, 770, 2815, 6912, 7424, 9984, 13312, 14593, 14334, +16386, 16894, 14850, 13823, 11264, 8961, 9726, 10498, 8958, 8450, 7935, 5120, 3840, 3072, 0, -512, +0, 257, -258, -766, -2562, -1790, -2561, -3072, -2560, -3073, -1278, 2046, 3330, 3327, 4607, 4354, +4862, 6146, 7167, 9216, 10497, 11007, 11520, 11521, 9982, 8707, 6653, 5890, 5631, 3072, 1537, 1790, +770, -2561, -4608, -7936, -11264, -13055, -13569, -15872, -17407, -16130, -16381, -16643, -15614, -17153, -19200, -18175, +-19202, -20734, -19970, -22526, -24322, -19197, -16644, -15356, -11779, -8702, -6145, -1792, 0, 2048, 5889, 7422, +9218, 11518, 12801, 14081, 16382, 16385, 16383, 15361, 11776, 9473, 8957, 9475, 8701, 9731, 8702, 5633, +5119, 3330, 1277, 515, 509, 2, 768, 511, -1278, -515, -766, -1280, -1537, -2046, -1282, 1537, +3840, 4095, 5378, 4349, 4612, 6396, 7171, 9726, 11009, 11520, 12031, 13314, 11262, 9217, 8961, 8446, +6146, 4863, 3327, 771, 1277, -765, -5379, -6399, -9215, -12802, -12541, -13827, -17406, -16641, -16640, -18687, +-18178, -18174, -19456, -19457, -17919, -19457, -19968, -21246, -23298, -20735, -17152, -16641, -13822, -8194, -5374, -2305, +511, 1794, 3838, 6403, 7421, 10242, 13310, 13570, 13822, 17411, 16636, 14084, 12541, 10753, 8704, 8192, +7424, 8192, 8448, 7424, 5632, 4352, 1792, 1024, 0, -512, 0, 1, -2, 514, -2, -1535, +-2304, -2560, -1280, 0, 2304, 3583, 4354, 4861, 5892, 5116, 7683, 9214, 9729, 11520, 12543, 11777, +13311, 12289, 10752, 10751, 7424, 4609, 3838, 2051, 510, 256, -2815, -6913, -9215, -11265, -13055, -14081, +-17918, -18690, -17663, -19201, -21246, -18434, -18430, -19458, -19967, -19968, -19456, -19969, -23039, -22272, -18177, -15614, +-15107, -11005, -5122, -3070, -2, 2305, 2559, 5121, 6657, 7166, 12033, 14336, 13567, 14594, 16639, 13823, +12802, 11262, 8706, 7423, 7168, 6657, 7422, 7682, 5630, 4610, 3839, 1025, -2, 513, -255, -2, +1794, 1790, 2562, 1791, -256, -512, 511, 1282, 2047, 4864, 5376, 6655, 7425, 6656, 7168, 8448, +8191, 9473, 11264, 11263, 11778, 12286, 10497, 9216, 8704, 5375, 3842, 3582, 1281, 256, -1, -4095, +-6912, -8961, -11518, -13827, -16125, -17923, -17149, -17923, -19197, -20227, -19454, -19713, -20992, -21248, -19967, -20994, +-21245, -22019, -21246, -18177, -16384, -13567, -8705, -4095, -1537, 1281, 3070, 5122, 5886, 8195, 11261, 12546, +13567, 15104, 15361, 16127, 15104, 12545, 9472, 8191, 5889, 5118, 5123, 5374, 5377, 5375, 3841, 1536, +767, -255, -513, 514, 254, 769, 2047, 1793, 2303, 2306, 509, 514, 2304, 2814, 5123, 6142, +7168, 7425, 8959, 8705, 7935, 8704, 10497, 10751, 11778, 12029, 10754, 11007, 9984, 6657, 5119, 4609, +1535, 257, 767, -1792, -6399, -8960, -10496, -12032, -14593, -16383, -17407, -18434, -20222, -21251, -21245, -20225, +-21505, -21757, -20741, -22523, -23300, -22525, -22786, -20478, -16642, -13822, -10242, -5374, -1794, 1282, 4607, 4096, +5120, 7937, 10238, 12290, 14335, 16127, 16130, 16126, 15362, 12030, 9474, 6910, 4097, 4608, 3839, 2050, +3069, 4868, 2555, 1284, -514, -1792, -1278, -771, 2, 1023, 2561, 2559, 3841, 3839, 3841, 2047, +2561, 4607, 6401, 7424, 9727, 9985, 10495, 10752, 9218, 7933, 8963, 9213, 10498, 11263, 11521, 10751, +9217, 7678, 5635, 3325, 1026, 0, -513, -255, -2817, -6399, -7681, -9982, -14339, -15357, -15618, -18175, +-19456, -19457, -19966, -19714, -20478, -20739, -20989, -22529, -23041, -22014, -22531, -20477, -16898, -14335, -12032, -7424, +-4097, -766, 3326, 4610, 4606, 8193, 9983, 11011, 14843, 15366, 15866, 16900, 15359, 11774, 10500, 6396, +4355, 4351, 2815, 1026, 510, 1282, 1023, 1, -2050, -2557, -1796, 4, -3, 769, 2049, 3070, +4098, 4606, 3842, 4606, 4866, 5886, 7938, 9214, 8962, 11262, 11778, 10494, 9729, 8960, 8447, 9986, +10750, 9985, 11264, 9983, 7682, 6910, 5378, 3070, 2562, 1790, -510, -1282, -3326, -7426, -7935, -9984, +-13313, -14846, -15619, -16381, -17155, -19708, -21508, -20989, -20738, -21503, -23552, -23552, -22272, -22017, -22014, -22530, +-19967, -16127, -13314, -11006, -5633, -3073, 3, 4861, 5379, 6909, 8706, 9471, 11777, 15360, 15102, 15363, +14588, 12805, 10236, 7938, 4096, 2558, 2562, 1791, 0, -767, -1282, -767, -1023, -2306, -2046, -1026, +-1791, -511, 1278, 2562, 4095, 4864, 5377, 5630, 6146, 6656, 8190, 8707, 10493, 11779, 11262, 11009, +10495, 9985, 10240, 11007, 9473, 9216, 9216, 9216, 7935, 6657, 5120, 3328, 2560, 1023, -511, -2304, +-3840, -7169, -8703, -8705, -11774, -14595, -15868, -15876, -16893, -19202, -21247, -22017, -20734, -21507, -23805, -24834, +-21759, -21761, -22526, -21763, -21244, -18436, -13053, -9729, -6145, -2557, -516, 3588, 7165, 6657, 7681, 10495, +13057, 14848, 16126, 15619, 14334, 12545, 10240, 7935, 5121, 2559, 513, 1279, 513, -1025, -2815, -2561, +-2047, -2561, -2815, -2817, -1024, 2, 1533, 2051, 4093, 4354, 4607, 6145, 7679, 8704, 9218, 10236, +11781, 12539, 11780, 11518, 11264, 10242, 9725, 10243, 9981, 9474, 7936, 8447, 8450, 5885, 3331, 3070, +3329, 2816, 512, -1792, -3584, -5888, -7680, -8448, -10496, -13567, -14338, -15101, -15619, -17918, -20737, -21504, +-21503, -24066, -25085, -25091, -23038, -22017, -21504, -21247, -21505, -20735, -16641, -12544, -8704, -5120, -2304, 1536, +5375, 6402, 6397, 9475, 12541, 13315, 14334, 15362, 14590, 13312, 11266, 9213, 6404, 2812, 771, 510, +-254, -770, -3070, -4099, -2812, -3075, -3326, -2050, -1790, -2, 2306, 2814, 3841, 5120, 5376, 6912, +8448, 8960, 9727, 12034, 13822, 12547, 11517, 11522, 11262, 11010, 9982, 9218, 10495, 10752, 7936, 7680, +7936, 5376, 2816, 3073, 4094, 3586, 2046, -1023, -2815, -3586, -6142, -9219, -10492, -12035, -13055, -14080, +-15105, -16382, -17153, -19968, -20993, -24062, -25602, -25086, -22273, -21249, -20990, -20226, -22526, -22018, -18174, -15106, +-11519, -4864, -3073, -510, 3838, 5377, 5376, 7936, 11008, 13313, 13566, 14594, 13055, 14592, 14081, 10495, +6401, 5118, 1794, 766, 1795, -259, -1022, -1282, -1790, -3330, -2814, -3073, -2048, 257, 2302, 3842, +2815, 3329, 5375, 6913, 8446, 9475, 9981, 12035, 15100, 13572, 13053, 12291, 12285, 12546, 10750, 9987, +10749, 11523, 10493, 9218, 7167, 4865, 4350, 3587, 4093, 4611, 2557, 2, -513, -1792, -5887, -8194, +-9725, -11011, -11518, -13313, -15873, -15358, -14849, -19199, -21761, -23297, -25855, -25856, -23552, -22528, -22273, -20991, +-22272, -22017, -19455, -17920, -14593, -9214, -4354, -1280, 514, 3070, 5121, 8192, 8446, 9987, 13310, 14849, +14079, 14337, 14079, 11265, 8448, 5119, 3073, 1279, 513, -1280, 0, -1280, -2561, -3326, -4611, -3581, +-1281, -513, 770, 4350, 3841, 4352, 5887, 6658, 6910, 8194, 9470, 12290, 14078, 14337, 13056, 13055, +12802, 12030, 11009, 9471, 9985, 12031, 11777, 9472, 8190, 5891, 4606, 4609, 4351, 2560, 2561, 1792, +1024, -1537, -3840, -7422, -9219, -9724, -11780, -13566, -13824, -14593, -16126, -16642, -20735, -23040, -25089, -24830, +-24834, -24575, -24064, -22528, -21504, -20992, -21248, -19456, -15360, -13311, -8193, -3327, -2049, 1024, 4865, 5888, +8447, 9473, 11007, 12545, 15359, 14337, 13822, 12291, 11262, 6912, 5633, 4607, 3072, 2561, 1791, 1280, +-1278, -2051, -2558, -2561, -1280, 257, -513, 1536, 3841, 3070, 4611, 5884, 6148, 7677, 8706, 9471, +11776, 13568, 13312, 13313, 12799, 12032, 11009, 10494, 9731, 9469, 11010, 10496, 9727, 8193, 7166, 5890, +5887, 4609, 2558, 3841, 2559, 2, -1282, -2047, -6912, -9473, -10238, -11523, -13309, -15362, -16383, -17919, +-19203, -21501, -24578, -24063, -24831, -27138, -26110, -23298, -23550, -21249, -19968, -19967, -16386, -14590, -12289, -7424, +-3071, -514, 3073, 5632, 6912, 8448, 11775, 13058, 12797, 14596, 14331, 13061, 11773, 9474, 7165, 5635, +4094, 2050, 1279, -1, -2814, -3587, -2045, -3330, -3071, -2304, -1281, 1282, 2557, 2307, 2813, 5891, +5886, 7169, 7935, 9473, 11006, 12547, 13820, 14085, 14331, 12291, 11775, 12544, 11265, 9983, 10495, 13315, +13309, 9475, 8445, 7426, 5630, 5122, 5375, 4096, 3840, 768, -1025, -766, -4610, -8702, -9219, -10493, +-12802, -14591, -15104, -15873, -17407, -21505, -24319, -24066, -25597, -27395, -27390, -24576, -24066, -23549, -22531, -20734, +-18432, -15361, -12287, -9985, -5375, -3073, 1025, 6399, 7425, 8191, 10497, 13311, 14336, 14593, 14079, 14848, +13057, 9726, 7939, 6141, 5122, 4351, 2560, 1025, -513, -3584, -4095, -2306, -2814, -4097, -2560, 512, +2305, 2814, 4099, 5373, 6402, 6399, 6657, 8447, 10753, 13822, 14594, 15872, 16127, 13313, 12798, 13571, +12797, 11268, 11003, 11268, 14078, 14080, 10753, 8448, 7167, 6657, 5887, 3329, 2816, 3327, 2562, 253, +-3068, -5381, -7164, -9986, -12032, -13822, -15619, -16126, -17665, -18944, -21247, -23810, -26109, -27396, -28668, -28163, +-25343, -23806, -22276, -21500, -19972, -17916, -14595, -11005, -7683, -4606, -1793, 1792, 6145, 8191, 9217, 10494, +13314, 14590, 13570, 12798, 12545, 12288, 9983, 7170, 4862, 4097, 1792, 255, -1022, -3330, -4606, -4866, +-4606, -3841, -2560, -2047, -769, 256, 2049, 3840, 5630, 5379, 7166, 8704, 10242, 11517, 15106, 15872, +16127, 15361, 14591, 13314, 13565, 12804, 11772, 13571, 14077, 13828, 12028, 10755, 8703, 7679, 5889, 3840, +1792, 3584, 3839, 769, -512, -2816, -8448, -10753, -12542, -15106, -15614, -15106, -17151, -18176, -20992, -24064, +-25599, -26114, -28159, -29696, -27392, -24319, -23298, -22271, -20480, -18944, -15616, -13568, -11009, -6655, -3840, -257, +4354, 6653, 7171, 8702, 10752, 13058, 13052, 12549, 12028, 12034, 10752, 6654, 4867, 3581, 2306, 1791, +1024, -1535, -4097, -5375, -5122, -4093, -3332, -2299, -1029, 773, 3067, 3332, 4350, 5120, 5890, 7933, +9987, 10494, 13825, 16128, 16640, 16128, 15359, 13569, 13055, 13826, 14845, 15107, 16894, 15873, 13055, 13568, +12289, 8704, 7424, 5887, 3840, 5121, 4606, 2051, 765, -2046, -7681, -10497, -12542, -14593, -15360, -16127, +-16642, -17406, -20737, -23295, -25089, -25600, -27392, -28416, -27903, -25346, -23550, -22274, -22015, -19968, -15616, -13056, +-10496, -7168, -5121, -1278, 3326, 4866, 6654, 8194, 9982, 11777, 13312, 12799, 12290, 10750, 9986, 7934, +5122, 2813, 1796, 1276, 1027, -770, -3583, -4608, -5632, -5889, -4351, -3841, -2559, -1, 1794, 3069, +4611, 3581, 4866, 7680, 8191, 9728, 13313, 15103, 15617, 16640, 15614, 15363, 15868, 16132, 15869, 17922, +18687, 16896, 17407, 17410, 13821, 11780, 9213, 6657, 5632, 6143, 4866, 4606, 2049, -2816, -5889, -9470, +-12802, -14591, -15872, -16384, -17408, -19456, -21760, -22784, -25600, -27392, -27904, -28928, -29184, -28160, -25344, -23808, +-21248, -19200, -16384, -12287, -9474, -7934, -4865, -769, 2563, 4604, 7428, 8957, 10242, 12286, 13826, 13566, +12035, 9980, 7940, 5373, 3073, 3584, 2304, 1792, 512, -2305, -6143, -6912, -8193, -8447, -5889, -3839, +-2560, -513, 1025, 1791, 3073, 3072, 3840, 7168, 9472, 11007, 13313, 15615, 17155, 17915, 16133, 15612, +16385, 16898, 18429, 17922, 17920, 18686, 19459, 17404, 14597, 12028, 10499, 8446, 7680, 6145, 6400, 6143, +1282, -2307, -4604, -8453, -11771, -14596, -15357, -15618, -17407, -19713, -19967, -20736, -23552, -26881, -27903, -27649, +-29439, -28160, -25345, -23551, -21505, -19199, -16896, -12801, -10238, -7939, -5629, -2562, 1025, 4608, 5888, 8703, +11778, 12542, 13313, 12800, 11263, 10753, 9728, 5887, 5378, 4094, 1281, 767, 513, -3840, -5633, -7934, +-9475, -8189, -6658, -5887, -3840, -1793, -766, 509, 2308, 3580, 3587, 5631, 7679, 9474, 11005, 13316, +15612, 17155, 16638, 16897, 17152, 17664, 18176, 19200, 18432, 19200, 19456, 18177, 15871, 14080, 11264, 8960, +8704, 5377, 7166, 6145, 2304, -1793, -3838, -7938, -10494, -13058, -15870, -16130, -17406, -19969, -20736, -21247, +-24065, -26623, -26625, -28671, -29441, -28927, -27392, -24577, -22014, -21762, -20478, -15874, -13310, -9218, -7422, -4353, +-768, 2048, 4096, 6143, 8450, 10493, 11779, 12029, 12034, 10752, 7935, 7425, 6911, 4609, 2815, 2306, +-2, -1279, -3840, -7936, -8704, -9216, -8961, -7934, -5635, -4348, -2052, -1021, 511, 1279, 2306, 3838, +4866, 7935, 10240, 12545, 14847, 15872, 16129, 17407, 17409, 17406, 17923, 19197, 19459, 19966, 20480, 19457, +18175, 15873, 13311, 11265, 9471, 7681, 7935, 6400, 3074, 765, -2813, -6402, -7935, -12545, -14846, -16131, +-18685, -20737, -18945, -20990, -23554, -24575, -26624, -27136, -27905, -28414, -28161, -24065, -22782, -23298, -20734, -17665, +-14592, -11519, -8450, -6653, -2308, 1028, 3070, 5888, 7937, 9726, 11523, 13309, 13314, 11262, 9474, 9215, +8960, 7424, 5376, 3327, 514, -1282, -3327, -5631, -7683, -8188, -8964, -8957, -7426, -6654, -4865, -1279, +-515, -1020, 509, 2306, 3072, 5374, 7427, 9981, 12290, 13822, 16386, 17663, 19456, 19457, 20222, 20482, +20478, 19714, 21246, 22274, 20991, 19456, 16385, 13053, 9732, 9725, 8450, 5118, 3330, 765, -1788, -5123, +-7935, -11776, -13824, -15360, -19967, -21762, -20991, -21247, -23810, -23294, -24577, -27136, -28415, -29697, -28672, -25855, +-24065, -24831, -22273, -18687, -16385, -13823, -9474, -6653, -3844, -1275, 1275, 4355, 7935, 7935, 10243, 13308, +13316, 12540, 11012, 8956, 9220, 8188, 4612, 3580, 1539, -770, -2814, -5122, -7935, -9473, -9215, -10497, +-9983, -7169, -6655, -4864, -1281, -1792, -766, 2557, 3075, 3326, 7169, 7680, 10240, 14079, 16129, 17408, +19456, 20480, 22016, 20992, 20224, 20993, 21503, 22528, 22274, 19964, 18181, 15868, 11267, 9726, 8704, 4609, +2559, 2562, -259, -3838, -6657, -10240, -12799, -14849, -19199, -21506, -20221, -21252, -23803, -23301, -23036, -25859, +-27389, -27395, -27390, -27138, -25342, -23552, -20738, -19453, -16900, -13564, -9474, -5888, -3839, -1025, 2048, 4609, +4863, 7424, 9474, 11772, 14084, 13565, 12290, 10496, 8959, 7937, 7167, 3841, 2047, 514, -1283, -3325, +-5890, -6911, -7680, -9473, -10495, -8961, -7422, -5122, -2047, -1280, -1, 1282, 2559, 3839, 5122, 6910, +9473, 12033, 15614, 17922, 18686, 19969, 21760, 19968, 20224, 21504, 22272, 22016, 23039, 21250, 20221, 16644, +12797, 12033, 11264, 7167, 4354, 3327, 2047, -254, -5123, -8444, -11267, -14847, -18944, -19457, -20478, -22018, +-22271, -22015, -22787, -25339, -27655, -27641, -26629, -26109, -25345, -23553, -21758, -20994, -18687, -15104, -12545, -9726, +-5890, -2559, 512, 2303, 3585, 6143, 9473, 11520, 12543, 13313, 12798, 11267, 10237, 8195, 7165, 5634, +2559, 1, -1793, -5375, -6657, -6911, -7936, -8705, -10240, -11519, -8705, -5630, -4868, -2556, -515, -1022, +1791, 2816, 3073, 5887, 8449, 9726, 12546, 15360, 16383, 19969, 21247, 21248, 19969, 20735, 21761, 22783, +21504, 22018, 21500, 18436, 14077, 12546, 12800, 8447, 5632, 4864, 2304, 257, -2049, -6655, -8450, -11006, +-16641, -19967, -18946, -21758, -22530, -21758, -21504, -24066, -25342, -27650, -28414, -26882, -26110, -26113, -24064, -22527, +-21250, -16894, -13057, -10495, -7425, -4095, -2305, 256, 3842, 6909, 8451, 11774, 13568, 13314, 13822, 13056, +11522, 10493, 9220, 6653, 4865, 2560, -1, -2558, -5378, -7678, -9217, -9985, -10494, -11266, -9215, -7423, +-5890, -5119, -3327, -2307, 5, 2042, 3334, 5627, 7940, 10237, 11779, 14333, 16386, 19967, 21248, 22274, +22525, 22786, 23550, 24322, 23039, 22785, 22526, 20738, 17406, 15362, 13823, 10752, 7168, 5376, 2560, 256, +-1024, -5889, -8702, -10498, -15102, -19458, -18687, -20993, -23551, -22783, -23299, -24061, -24579, -26621, -27906, -26111, +-25602, -27389, -23811, -22014, -21761, -18431, -14082, -11261, -7427, -4606, -3073, 513, 3070, 4867, 7678, 10495, +11780, 13563, 13828, 13053, 12034, 11007, 8961, 8447, 5377, 1535, -511, -3329, -5887, -6656, -7937, -9983, +-9985, -10238, -11266, -10494, -8450, -6654, -3842, -1790, -1025, 512, 3586, 4349, 6403, 7934, 9217, 12799, +17154, 19455, 22528, 23296, 23039, 23810, 24574, 24578, 24574, 24066, 24574, 24066, 20734, 15874, 15359, 13312, +9217, 6911, 4352, 1025, -1025, -4351, -8193, -11008, -13823, -19201, -19967, -20738, -23550, -24577, -22272, -23806, +-26116, -25596, -27395, -28926, -26113, -25599, -25346, -22013, -22020, -19708, -13315, -9983, -9214, -4356, -2044, -771, +3073, 6657, 7166, 10498, 13310, 14338, 14590, 14081, 11265, 11261, 9988, 6652, 3843, 1279, -1281, -3070, +-4610, -7166, -10754, -12542, -11266, -11006, -12546, -12030, -8706, -5886, -3073, -1537, -1278, -513, 3584, 5121, +6142, 9218, 10239, 13825, 19967, 22016, 21761, 23551, 23809, 24575, 26881, 26367, 24577, 25087, 25345, 23551, +21505, 17663, 14081, 12798, 9474, 5631, 4352, 1793, -1026, -2046, -6401, -10752, -14080, -17408, -19711, -20225, +-22783, -23554, -24062, -23297, -23551, -25345, -26367, -26625, -26879, -25857, -24575, -22528, -22273, -19455, -14080, -11777, +-9215, -4864, -2817, 2, 3838, 3841, 6144, 9984, 12032, 13313, 15102, 13314, 11007, 10240, 8961, 7167, +5120, 1793, -1025, -2304, -4607, -7937, -10496, -10495, -11009, -11776, -13055, -13057, -10752, -7167, -6146, -4606, +-2305, -512, 1280, 4352, 6400, 6657, 7678, 11010, 17407, 21504, 23041, 23294, 24579, 25085, 25858, 24575, +24577, 25087, 25089, 23550, 22275, 19709, 15362, 13311, 11520, 6913, 3070, 1537, -1023, -3330, -4349, -9732, +-14589, -16898, -19197, -21252, -21244, -23812, -24317, -22785, -24833, -26110, -25347, -25597, -25858, -24576, -23550, -22787, +-21757, -20227, -17149, -12547, -9981, -7939, -3582, -1, 1792, 4609, 6143, 7936, 10496, 12288, 13568, 13825, +12286, 11521, 10752, 9215, 5891, 1788, -765, -3073, -5889, -7934, -9730, -11263, -10496, -11264, -12801, -13567, +-13569, -10239, -7681, -5119, -2562, 259, 1534, 4096, 5890, 6396, 7940, 11774, 17153, 20736, 23295, 24576, +25858, 27134, 26370, 25853, 25346, 25088, 24576, 24063, 22529, 20222, 16386, 13823, 11776, 7424, 3840, 769, +-1282, -2814, -5121, -8448, -12543, -15617, -16639, -19969, -22015, -21760, -22017, -23294, -23300, -23546, -24071, -23289, +-24069, -23293, -20738, -21248, -22271, -20736, -17408, -15360, -11522, -7932, -4356, -1021, 766, 3073, 5375, 6658, +7678, 11777, 13311, 13313, 12288, 11264, 11263, 9216, 5890, 3582, 770, -3075, -4861, -6915, -9212, -10500, +-10493, -10753, -12289, -12798, -13314, -11774, -8961, -6656, -3840, -1025, 1539, 2556, 5892, 7164, 8194, 10496, +15103, 18177, 21504, 24062, 25603, 26621, 26370, 24831, 24577, 24575, 23809, 22783, 22784, 21249, 17151, 13313, +11263, 8192, 3584, 1024, -255, -3074, -4861, -7940, -12284, -12803, -15358, -19201, -19968, -19711, -21249, -22016, +-21503, -21505, -22016, -22272, -23297, -22781, -21508, -21499, -20742, -19451, -19203, -17406, -13057, -9983, -6914, -2557, +-1028, 2054, 4601, 5125, 6654, 9984, 10241, 11263, 13056, 11521, 10239, 9472, 7681, 4351, 1281, -1282, +-3325, -5123, -7421, -9731, -9982, -9729, -11008, -11264, -11520, -12031, -11777, -8960, -6144, -4096, -767, 2046, +5123, 7164, 9221, 9979, 12548, 16125, 19202, 22271, 25089, 26367, 26113, 26623, 26881, 24063, 21761, 21503, +21504, 19457, 18686, 15364, 11770, 9734, 6651, 2307, 768, -1282, -5373, -6402, -8960, -12543, -13057, -14848, +-18686, -19459, -18685, -20738, -22016, -20480, -20735, -19970, -20221, -20483, -20991, -19199, -19458, -19709, -17667, -17150, +-16130, -12029, -7683, -5885, -3587, -1278, 2047, 3585, 4351, 5121, 8447, 11265, 13311, 12544, 11522, 10492, +8453, 6139, 4612, 1277, -766, -3330, -5117, -7427, -9214, -10497, -11008, -10751, -12034, -13053, -12803, -9981, +-7683, -4606, -2562, 771, 2556, 5892, 7933, 9474, 11007, 13824, 16640, 19968, 22272, 24065, 26111, 26368, +25856, 24064, 22016, 21761, 21759, 19967, 19203, 16379, 12294, 9211, 8196, 4349, 257, -1536, -4096, -7424, +-9215, -12290, -12798, -14594, -17406, -19713, -19200, -19456, -20225, -19454, -18690, -18430, -19714, -19967, -19969, -19967, +-20224, -18689, -16894, -18179, -16638, -14080, -9986, -6909, -5378, -4095, -1, 3585, 4095, 5889, 6656, 7935, +9730, 11773, 10499, 9469, 7939, 5374, 4865, 2559, 1, -3329, -4094, -5891, -8445, -9218, -9728, -10495, +-10753, -11518, -12546, -12031, -10497, -7167, -3328, -769, 1538, 4349, 6147, 7933, 10242, 11519, 14336, 18177, +20478, 22530, 25087, 26624, 26113, 24831, 23041, 20479, 19200, 18945, 17919, 15873, 13567, 9472, 7169, 5887, +1024, -1535, -3073, -6912, -9215, -9729, -13055, -14593, -14335, -16897, -17663, -17152, -19969, -20223, -19713, -18687, +-19201, -18175, -18945, -18943, -17409, -16127, -16129, -16383, -15360, -14849, -11006, -7171, -5116, -2820, -1020, 1788, +4355, 3838, 4097, 6145, 7933, 8963, 9982, 8961, 8192, 6655, 4609, 2559, 2, -3074, -5375, -5121, +-6655, -8705, -8702, -9731, -10749, -11267, -11516, -12548, -10749, -8962, -5887, -1280, 1280, 4608, 7424, 8704, +8704, 10496, 13568, 16128, 18944, 22017, 23294, 25090, 24831, 23552, 21760, 20480, 18688, 18176, 16385, 15357, +13316, 10492, 7683, 5118, 2561, -1024, -5376, -7424, -7937, -10750, -12803, -14844, -15363, -15358, -16641, -17408, +-17152, -16640, -18686, -19204, -17403, -16901, -18428, -17154, -16129, -16637, -14852, -16636, -15875, -13822, -11266, -9469, +-7172, -3835, -1285, 1028, 3325, 4610, 3840, 5886, 7170, 7423, 8705, 8703, 7168, 6656, 5888, 3073, +767, -1279, -3842, -4862, -5889, -7424, -10239, -9218, -10750, -11521, -10752, -11264, -11008, -9472, -6656, -3840, +768, 3839, 5379, 7420, 8708, 10748, 13571, 16639, 18176, 21249, 23294, 24066, 24830, 23298, 23038, 22018, +20479, 17152, 15872, 14848, 13824, 10496, 7168, 2816, 768, 257, -3842, -7422, -8194, -11262, -12801, -12800, +-15615, -15873, -15360, -15871, -15362, -16126, -17665, -17408, -16640, -15872, -15616, -15873, -16638, -14594, -13311, -13568, +-15104, -12545, -11006, -7427, -4861, -3841, -1793, 1537, 2559, 3329, 4608, 4351, 5377, 7679, 7938, 7421, +8963, 6910, 4609, 4353, 1534, -1534, -1794, -2302, -3586, -4605, -7683, -9470, -9217, -10752, -11263, -11009, +-10495, -9217, -6655, -3585, 256, 3329, 4607, 6912, 8704, 11008, 13312, 16385, 19966, 21761, 22016, 23552, +23552, 23296, 23041, 22014, 19970, 17151, 14591, 15107, 13308, 8452, 6397, 3330, -1282, -1279, -3840, -9729, +-10494, -11522, -15358, -14338, -15102, -17410, -15102, -14081, -16384, -16639, -17409, -16895, -15873, -14336, -13823, -13825, +-12543, -12545, -13056, -12544, -13055, -13826, -10494, -8194, -5119, -2303, -770, 2, 2046, 2561, 2304, 2304, +4097, 6142, 7937, 7680, 7935, 6658, 4606, 1793, 767, -766, -2050, -2559, -3328, -3584, -5888, -8448, +-9216, -9216, -9983, -11009, -11009, -8701, -5892, -3323, -260, 3074, 4864, 5374, 6659, 9725, 12803, 15102, +16896, 20481, 22782, 23043, 22524, 22788, 22269, 21506, 19455, 17663, 16899, 14588, 12292, 10748, 7427, 2814, +-1277, -3076, -2813, -7937, -11521, -11006, -13826, -15870, -15361, -16384, -16640, -14848, -16640, -16127, -14594, -16638, +-17666, -15102, -13314, -14078, -13058, -11775, -12288, -11776, -12800, -13568, -12032, -9216, -6655, -3330, -1278, -770, +258, 1535, 3327, 2818, 3070, 4098, 6655, 7423, 7426, 6910, 5890, 4608, 2814, 1027, -772, -1276, +-2307, -3838, -3329, -5120, -7935, -8450, -8702, -10498, -9981, -9475, -7678, -4353, -256, 1281, 5119, 5888, +6145, 8446, 12035, 13564, 15620, 19197, 19457, 21249, 22781, 22021, 21498, 21765, 19196, 17923, 17406, 13314, +12029, 11523, 7934, 4352, 1538, -2051, -4604, -5124, -10238, -12032, -13313, -15358, -15874, -13567, -15105, -15871, +-15361, -15359, -15873, -15615, -15361, -15103, -13057, -11263, -12289, -11775, -10496, -11009, -11518, -12034, -13055, -11264, +-7937, -6142, -2818, -1022, -514, -511, 2048, 2816, 2560, 2559, 4865, 6911, 7426, 6910, 6401, 6399, +4609, 2304, 767, 257, -512, -769, -2302, -2819, -5629, -8450, -8703, -7936, -8193, -8446, -7682, -6144, +-2814, 252, 1797, 3580, 5378, 7168, 9983, 12801, 14592, 16640, 19199, 19970, 21502, 21762, 19967, 20224, +20480, 18687, 17154, 13822, 11266, 11519, 8959, 3842, 2558, 1, -4863, -5890, -7422, -11009, -12289, -14078, +-15874, -15102, -14593, -16896, -15104, -13825, -15102, -16130, -13822, -13570, -13310, -11266, -10750, -11010, -8703, -9984, +-10752, -9728, -10496, -11264, -8192, -6400, -5632, -1792, -1792, -1023, 1023, 1792, 2049, 3839, 3840, 5633, +7679, 7424, 6401, 7167, 5632, 3842, 2044, 1797, 1788, 1026, -1, -1535, -3329, -4607, -5889, -7936, +-6912, -6655, -7426, -5885, -3075, -1022, 767, 2816, 3585, 5886, 8707, 10749, 13314, 15615, 16896, 18433, +20223, 20481, 19455, 19457, 19966, 18948, 17147, 15365, 12795, 11779, 9728, 6399, 3585, 767, -2303, -6145, +-6654, -8451, -11261, -14082, -13055, -14848, -15617, -14847, -15872, -16128, -15616, -15616, -15361, -12798, -13314, -12798, +-10753, -8961, -9726, -10754, -10494, -11266, -11007, -11008, -10753, -6910, -4354, -2558, -2306, -511, 0, 512, +512, 2048, 3328, 3840, 6400, 7168, 8192, 6400, 5120, 3840, 3072, 1793, 1278, 2050, 1790, 514, +-2050, -3581, -5891, -8191, -8703, -7682, -6653, -5635, -4094, -2049, 256, 514, 1789, 5379, 7678, 10240, +12802, 15101, 17155, 19710, 19969, 19455, 19969, 19967, 19201, 19200, 17406, 14596, 12539, 11269, 8444, 5890, +4096, 1024, -1792, -4609, -8446, -10499, -10492, -13572, -15357, -15362, -16639, -17153, -14591, -16896, -17664, -15618, +-15612, -15622, -11769, -11526, -10748, -7426, -7936, -9216, -8448, -10495, -11777, -9728, -9984, -9216, -5376, -3839, +-3585, -2048, -1791, -1793, 0, 1794, 1789, 3075, 4350, 6145, 6912, 7424, 5887, 4354, 3581, 2564, +765, 1793, 2048, 767, 2, -1793, -3585, -5118, -6914, -7167, -5887, -5378, -3583, -2815, -770, 770, +2302, 3841, 6912, 7936, 10497, 13822, 15361, 16896, 18432, 18433, 18430, 19715, 19707, 18694, 17915, 15876, +14077, 11778, 9470, 8450, 5118, 3074, 254, -2045, -5636, -8957, -11266, -11007, -12800, -14592, -15617, -16127, +-15616, -15873, -16382, -16387, -15614, -14848, -13568, -12032, -10497, -9215, -9473, -7423, -8960, -11009, -9983, -10496, +-10497, -7423, -5888, -5377, -1790, -1794, -1023, 0, 511, 257, 2304, 3328, 3840, 5888, 7423, 5378, +5374, 4098, 2046, 2818, 2814, 1025, 1791, 2305, 256, -1281, -3072, -5120, -5887, -6656, -7937, -7167, +-4610, -3581, -2562, 257, 1792, 1023, 3841, 7168, 8704, 11776, 14592, 16639, 17921, 19200, 18176, 18688, +19967, 19457, 16895, 16129, 14591, 11520, 10497, 10239, 6401, 3071, 1281, -2049, -5119, -6656, -10497, -11006, +-9731, -12541, -15106, -15870, -16642, -16383, -15361, -16894, -16130, -14334, -14594, -12542, -11266, -11007, -8960, -8704, +-9216, -9984, -9984, -10752, -9728, -8192, -5888, -4608, -2815, -2562, -2558, -258, 770, 254, 1795, 3324, +3844, 5372, 6660, 5885, 5890, 4607, 2816, 3841, 3070, 1027, 1277, 3074, 1791, -512, -3071, -4353, +-5633, -6142, -7170, -7166, -6146, -3839, -2817, -510, 1022, 1024, 2562, 6653, 8451, 10750, 14081, 15360, +16640, 18431, 18689, 17919, 18434, 18942, 18177, 17664, 16382, 13571, 11517, 10244, 8444, 4355, 3069, 2, +-2304, -3329, -7166, -11011, -9213, -11266, -14079, -14592, -14849, -15870, -14850, -15103, -15617, -14079, -15104, -14593, +-11776, -10495, -10497, -8192, -8192, -9727, -9473, -9983, -11521, -9985, -7677, -5635, -3326, -768, -770, 514, +2046, 1282, 1280, 2815, 3329, 5118, 7170, 7423, 7169, 5632, 4607, 2048, 1792, 1281, 1279, 2048, +2561, 255, -2304, -4607, -7170, -8190, -8960, -8450, -5885, -4099, -2557, -1283, -765, -3, 1538, 2559, +5634, 9981, 13827, 15869, 18434, 18687, 17410, 17917, 17155, 16381, 18434, 17151, 16129, 15871, 13056, 9218, +7676, 4612, 1533, 2, -2561, -3327, -4098, -7166, -10241, -10496, -12543, -14850, -15358, -15361, -15359, -15105, +-14336, -15360, -14591, -15105, -15359, -13313, -11520, -10751, -9729, -9216, -9983, -9729, -11007, -12545, -11008, -6911, +-5121, -2047, -257, -1791, -1, 1280, 1025, 2046, 2562, 3071, 5376, 7169, 6655, 6655, 5378, 4350, +3075, 2045, 1282, 1790, 2562, 1279, 1, -3585, -6399, -7937, -7936, -9214, -7938, -6143, -5120, -3073, +-1790, -770, 257, 2303, 3841, 8193, 12029, 14339, 16381, 17922, 17664, 17151, 16385, 15870, 16643, 17661, +17667, 15869, 13315, 11261, 7427, 5886, 4608, 1282, -258, -1022, -2562, -5375, -8960, -11264, -11520, -13312, +-15617, -15870, -14594, -14335, -14848, -14594, -14844, -15364, -16381, -14851, -12798, -11265, -11007, -10240, -7937, -8447, +-11265, -13311, -11009, -7934, -6659, -4605, -1282, 257, 1279, 1793, 1023, 2050, 2302, 2049, 6144, 8703, +8451, 7933, 7170, 6398, 5378, 2559, 2048, 1793, 2046, 1026, -2, -2559, -5376, -7680, -8960, -9728, +-9986, -8188, -5893, -4090, -3845, -3325, -2050, -766, 1789, 6149, 10490, 14086, 15611, 17155, 17662, 17410, +16893, 15620, 15868, 17923, 17406, 16641, 16127, 14082, 9981, 6147, 4094, 513, -511, -514, -1278, -3843, +-5372, -10756, -11515, -12037, -15356, -17412, -15612, -15875, -15358, -14849, -15104, -14592, -14848, -14592, -14592, -12801, +-11262, -11267, -8701, -7426, -10496, -11518, -11011, -9470, -8193, -6400, -5375, -1281, 1, 1022, 1282, 1534, +2050, 3071, 4864, 6145, 7935, 7681, 7166, 7682, 6911, 4864, 4097, 2558, 1794, 1790, 2, -2050, +-3071, -5888, -7168, -8449, -9213, -9220, -8189, -6914, -5631, -5120, -3328, -1024, 512, 3583, 7426, 10750, +13826, 15614, 16386, 17150, 17667, 16892, 16131, 17407, 18943, 17412, 15354, 15110, 11771, 7940, 6396, 3332, +508, 260, -1027, -3326, -4098, -8447, -11519, -11010, -13565, -16643, -16126, -15361, -14848, -13054, -13315, -15614, +-14849, -13568, -14591, -13312, -11010, -10493, -8706, -6655, -8448, -9472, -9985, -10750, -8706, -6398, -5378, -2047, +256, 1792, 2817, 1790, 1025, 2560, 4352, 6145, 7166, 8962, 9471, 9984, 9216, 6144, 5120, 3585, +2046, 1794, 1535, -256, -1792, -3583, -5378, -7934, -9985, -9984, -8959, -7425, -6656, -5631, -5122, -3069, +-3, 514, 4606, 8193, 11265, 13566, 15106, 14846, 15872, 17666, 17149, 16643, 16382, 17153, 16127, 16640, +14849, 9983, 7681, 6399, 2817, 1023, 769, -1281, -2303, -5120, -9473, -10239, -13312, -15616, -16129, -15359, +-14593, -14078, -15106, -14591, -13313, -14335, -14337, -13310, -13059, -12029, -10243, -7933, -8195, -8445, -9475, -11262, +-10241, -9471, -8450, -4861, -1283, 2, 1792, 2303, 1536, 2562, 4349, 4611, 5887, 7935, 8193, 10752, +10751, 8450, 7422, 5377, 3327, 1794, 766, -1023, -512, -1793, -4862, -6401, -7681, -9214, -9218, -8958, +-8706, -6911, -6656, -5888, -2560, -1, 1793, 4607, 7682, 9982, 12800, 14594, 14078, 15106, 15614, 15361, +16384, 17409, 15871, 16896, 16641, 12030, 9731, 9981, 4866, 3327, 2816, 513, -1, -1280, -5887, -7170, +-9725, -14851, -15102, -15874, -15614, -14082, -14078, -15106, -14591, -15360, -16641, -15870, -14594, -13568, -11262, -9987, +-9724, -8452, -9213, -11011, -12029, -10754, -8959, -6144, -3073, -511, 2047, 3585, 3839, 4097, 5119, 5889, +7935, 9985, 10495, 12033, 13311, 11777, 11007, 8705, 4607, 3073, 2047, -767, -513, -1792, -4863, -5634, +-6909, -9987, -10238, -9985, -10496, -8704, -7935, -7937, -6399, -1281, 768, 2817, 5631, 5889, 7935, 11521, +13054, 13315, 15356, 15108, 17662, 19456, 17921, 16638, 16386, 13824, 12542, 11011, 7165, 7171, 6141, 3586, +1792, -770, -5373, -6148, -7420, -12547, -14590, -14593, -15359, -14337, -13568, -15616, -16639, -14848, -15361, -16383, +-15361, -14591, -14081, -11519, -9985, -11006, -8962, -9471, -11520, -11010, -9724, -7940, -5116, -2052, 1538, 4352, +5375, 6146, 6397, 7171, 7934, 8192, 9985, 12287, 13569, 12799, 13057, 12031, 7936, 4098, 2045, -510, +-2304, -2818, -4605, -5379, -6398, -8961, -11007, -11266, -11773, -12036, -10748, -9474, -8704, -5119, -1281, 2049, +4095, 5377, 5887, 8193, 10496, 13056, 13823, 15105, 18431, 19457, 18944, 17664, 16639, 14337, 14336, 12800, +11008, 8704, 7423, 6146, 4095, 1280, -2815, -4354, -5887, -8960, -13568, -14848, -14336, -14336, -14337, -15358, +-16899, -17149, -16641, -16896, -15873, -14846, -15875, -13309, -11777, -11264, -11008, -9984, -9985, -8958, -9217, -8193, +-5118, -2563, 516, 3324, 5380, 6140, 7427, 8702, 9474, 9470, 11010, 12030, 12802, 13566, 13314, 12030, +10498, 6654, 3073, 1279, -767, -3840, -4865, -5887, -7426, -9214, -9216, -10497, -11264, -11519, -11777, -10495, +-8449, -6655, -3329, 1025, 4607, 5120, 6658, 8189, 9474, 11775, 13825, 14847, 17409, 19455, 18944, 18946, +18686, 16385, 13055, 12289, 11775, 9218, 7166, 7680, 4610, 2044, -250, -3846, -6907, -7940, -12542, -13824, +-12801, -14078, -16131, -15612, -16133, -16891, -15876, -17149, -16386, -14591, -15617, -15103, -13056, -12801, -12799, -11265, +-10239, -8960, -8705, -7424, -4606, -1283, 259, 2045, 5890, 8192, 8703, 9729, 11006, 11267, 12285, 12546, +13056, 15102, 13827, 11261, 9986, 7679, 3841, 767, -1535, -4609, -6143, -7169, -8191, -10241, -11007, -12544, +-13313, -13823, -13569, -12287, -9984, -7169, -5119, -1793, 1282, 4606, 6145, 7423, 8449, 10239, 12034, 13821, +16643, 18941, 19203, 19453, 18179, 16637, 14339, 12029, 11524, 9723, 7941, 6907, 5893, 2556, 4, -1285, +-4347, -7428, -10748, -13315, -12799, -12800, -14592, -16127, -14081, -16385, -17918, -16898, -16382, -17154, -16382, -15874, +-14846, -13569, -14849, -13821, -11011, -9470, -9217, -7424, -4607, -2049, 512, 2048, 4864, 7680, 8449, 10238, +11009, 12544, 13056, 13824, 14593, 14846, 14594, 13055, 11008, 8704, 5889, 3070, 2, -3074, -5886, -7938, +-9214, -9986, -11775, -12800, -13567, -14082, -13822, -12802, -11007, -8703, -5890, -3326, -2, 4609, 6400, 7424, +9728, 10240, 10752, 14336, 15871, 17666, 19710, 19202, 18175, 17664, 14847, 12290, 12541, 11524, 9468, 7683, +6142, 3840, 2049, -1, -3328, -6654, -9220, -11004, -11523, -13054, -14081, -15360, -14848, -15872, -15872, -16896, +-15360, -15105, -15358, -15875, -16380, -14596, -13821, -14082, -12543, -11264, -10497, -6654, -4610, -2814, -769, 511, +2562, 5886, 7426, 9727, 11008, 12800, 14081, 14334, 14594, 15102, 14851, 14077, 13058, 9727, 6400, 4609, +767, -2048, -4608, -7423, -9985, -10751, -12290, -13053, -13316, -14587, -16133, -15100, -13827, -11262, -8705, -6143, +-2050, 2307, 4861, 6146, 7935, 10241, 11262, 13315, 16124, 17668, 18942, 19969, 19711, 18177, 17151, 13312, +12546, 12541, 10755, 7678, 6144, 3841, 2048, 1023, -2047, -7425, -9471, -9985, -12030, -13059, -14077, -15362, +-14847, -14849, -16894, -16898, -16382, -15362, -15871, -15360, -15360, -15616, -16128, -13569, -14334, -13315, -10492, -8963, +-6144, -2814, -1795, 4, 3069, 4865, 6400, 9216, 10240, 12032, 14080, 15360, 15873, 16637, 16900, 15612, +14083, 10495, 8959, 6914, 3326, -254, -3331, -5883, -8198, -10235, -12034, -13313, -14078, -15362, -16126, -14849, +-13312, -12545, -9471, -6912, -4608, -768, 3072, 5887, 8705, 10752, 11520, 13825, 17406, 18945, 18432, 19968, +20481, 18430, 17410, 16894, 14594, 12542, 12545, 9472, 6656, 4095, 2562, 509, -765, -4866, -8960, -8959, +-10497, -13055, -14081, -14079, -15106, -15101, -15107, -16637, -16387, -14589, -14851, -14589, -14595, -15101, -15362, -14847, +-13825, -13311, -12289, -9983, -6913, -4606, -1796, -252, 1277, 3842, 6399, 7425, 9470, 11779, 13564, 15109, +16379, 16645, 16635, 16645, 14844, 11779, 9470, 7169, 4608, 1792, -256, -2816, -6401, -9213, -12804, -14589, +-14849, -15873, -15358, -14082, -14334, -13570, -10750, -8962, -6655, -4095, -1538, 3585, 6145, 9214, 11778, 14591, +16895, 18435, 17916, 18180, 19452, 18691, 19455, 18688, 16128, 14592, 13312, 11009, 8958, 4099, 2044, 1797, +-516, -5118, -7424, -8450, -9213, -12290, -15104, -15871, -16641, -16640, -16639, -17409, -17920, -16639, -16642, -15358, +-14593, -16639, -17410, -15357, -14339, -14845, -14594, -10752, -7680, -4607, -3328, -1025, 1, 3070, 5378, 6656, +8446, 10499, 13052, 15620, 18429, 17410, 16895, 16641, 14590, 11778, 9471, 7681, 5632, 3839, 513, -3585, +-6654, -9219, -11773, -14850, -16126, -16898, -17407, -15872, -14337, -14078, -12546, -9214, -8194, -6654, -2818, 770, +4862, 8706, 10751, 12288, 16385, 18174, 18690, 19967, 18689, 17407, 17921, 19199, 17409, 15103, 14081, 13055, +9473, 5376, 1791, 1281, -2, -3581, -6402, -7423, -9729, -11264, -13311, -14593, -15871, -17409, -16896, -16639, +-16897, -16639, -15873, -15360, -15359, -16385, -16894, -15619, -14077, -14595, -15101, -12546, -9216, -6655, -4097, -2814, +-771, 2307, 4861, 6146, 7681, 9212, 12549, 15356, 16899, 17918, 17921, 17920, 17408, 14592, 11520, 8447, +6147, 4349, 2562, -1026, -5374, -7170, -10494, -13313, -15872, -17920, -18432, -17151, -16642, -15102, -13058, -11262, +-8960, -7937, -5120, -3071, 1279, 6401, 9984, 12032, 15103, 17666, 18686, 20738, 18942, 17409, 17664, 18945, +17918, 16130, 15358, 14593, 11778, 7419, 3590, 1275, -1533, -3330, -4862, -5378, -8446, -11778, -13311, -13313, +-14845, -16645, -17146, -17158, -17403, -17411, -16383, -14848, -14848, -15360, -16384, -16128, -15360, -15361, -14846, -12034, +-11262, -9218, -5375, -3841, -2047, 1025, 3837, 4868, 6396, 7170, 10240, 15103, 17410, 17918, 19457, 17919, +16641, 14592, 12031, 9217, 7935, 5633, 3071, 1, -2817, -6910, -10243, -12797, -16131, -18429, -18690, -18686, +-16642, -15359, -14849, -13311, -10751, -8706, -6654, -3330, -1534, 3071, 6400, 10497, 14078, 17667, 19453, 21507, +20990, 18176, 18944, 18176, 16641, 17663, 17409, 15870, 14081, 9472, 6400, 4864, 513, -3842, -4350, -5890, +-8446, -8962, -9726, -11522, -13054, -16386, -18686, -17922, -18943, -19200, -16384, -13824, -15104, -15360, -15616, -15360, +-15872, -15872, -15104, -13568, -11520, -9216, -6400, -2816, -1280, -1, 2562, 4862, 6658, 9214, 12034, 15614, +18946, 19198, 19714, 19967, 18944, 17921, 14847, 12032, 9985, 6911, 3841, 1280, -2562, -6141, -8707, -13309, +-16386, -17152, -18687, -19457, -18431, -17409, -15615, -13826, -12029, -9988, -7163, -4613, -1532, 1278, 5120, 9473, +13311, 17408, 20738, 22014, 20736, 22017, 21502, 18692, 16892, 17154, 17407, 17152, 14850, 9981, 9731, 7165, +2, -3840, -4354, -6652, -8453, -9212, -11267, -11773, -13058, -16895, -17665, -17408, -19711, -19201, -15359, -14850, +-15357, -15619, -16125, -15364, -15356, -16387, -16637, -13826, -12288, -9984, -7936, -5119, -3586, -1789, 1276, 3331, +5887, 9215, 12290, 15871, 17663, 19202, 19966, 19970, 19199, 17919, 16642, 14078, 11010, 7167, 5376, 2816, +-1791, -6659, -8444, -12292, -15613, -16641, -18688, -20224, -19201, -18687, -17919, -15106, -13822, -12546, -8447, -5375, +-3074, 1, 2816, 6911, 11266, 14846, 18945, 20479, 20993, 21760, 21759, 18690, 17917, 17156, 18684, 18178, +16128, 11519, 9986, 8190, 2560, -1023, -3073, -5375, -7169, -8447, -11009, -12032, -13566, -15875, -17149, -17411, +-19454, -19457, -17406, -15363, -15614, -15361, -16895, -16896, -15874, -16382, -17153, -15359, -13056, -10241, -6655, -5633, +-3327, -1025, 1026, 4350, 6913, 9472, 14335, 17410, 19454, 20738, 20990, 20225, 19456, 18943, 18177, 15873, +12285, 8707, 6397, 3586, -1792, -5889, -8448, -11774, -14595, -17405, -18690, -18944, -20222, -20738, -19200, -17406, +-16643, -13309, -9730, -6400, -3071, -1025, 1281, 5631, 9729, 12544, 16382, 19971, 22269, 23299, 22781, 19971, +18429, 18434, 18432, 17918, 16899, 13566, 11265, 9983, 5121, 766, -2301, -4866, -6655, -6913, -10496, -11519, +-13057, -14590, -16643, -17918, -20224, -20736, -18433, -17919, -16897, -16639, -17151, -17155, -15869, -16642, -17406, -16130, +-14335, -10496, -6145, -4606, -2818, -1791, 1536, 3583, 5888, 9218, 14588, 17926, 19962, 22020, 21757, 20483, +19197, 19459, 17917, 16387, 14078, 11521, 9471, 5377, 256, -6144, -9984, -12289, -15103, -16640, -16896, -18689, +-19967, -19457, -21247, -21249, -18687, -16642, -13565, -7939, -3070, -512, 2047, 3840, 6401, 7934, 11267, 16382, +19712, 22273, 23039, 21504, 19969, 18943, 16640, 15873, 15614, 12803, 12285, 12290, 9215, 4352, 513, -1537, +-5887, -8449, -10751, -11265, -12031, -12033, -14847, -16641, -19455, -20225, -19456, -18943, -17922, -17149, -17155, -16382, +-16129, -16640, -16639, -16384, -14594, -10493, -5891, -4093, -3074, 257, 2814, 3331, 6141, 9987, 13309, 19458, +22783, 22528, 24065, 22527, 20736, 20481, 18686, 16130, 15103, 12801, 9982, 7682, 2046, -3326, -8448, -12034, +-14590, -15362, -17150, -17666, -17661, -19716, -20989, -19970, -19455, -18432, -14336, -9217, -4606, -1282, 1025, 4096, +6656, 6656, 9728, 14080, 19200, 21504, 22785, 22525, 20996, 18684, 17412, 15614, 14080, 13056, 12288, 12800, +10240, 5889, 2046, -254, -4609, -7424, -9728, -10752, -11520, -11776, -13055, -15362, -17918, -18433, -18689, -18941, +-17155, -16893, -15874, -16128, -16126, -17667, -17404, -17156, -14076, -9988, -6396, -4356, -1276, 1020, 2563, 3839, +5376, 8448, 12287, 17153, 21248, 23552, 23295, 22785, 22015, 19713, 16640, 15871, 14337, 13823, 11521, 7680, +3583, -1023, -6656, -10497, -13054, -15874, -17151, -17409, -17406, -18947, -19965, -19970, -20736, -19454, -17411, -12541, +-7682, -3327, 0, 4095, 5122, 4605, 7427, 11006, 15106, 19198, 21249, 21247, 21249, 19200, 16895, 16641, +14592, 12031, 12034, 13565, 10755, 7678, 3585, -512, -2305, -6654, -10243, -10492, -11013, -12283, -14339, -16639, +-18176, -18945, -20223, -20224, -19200, -17664, -17664, -17664, -16385, -17662, -17922, -15103, -12031, -8962, -5118, -2563, +3, 2302, 3330, 3838, 4609, 7935, 12545, 17408, 21503, 23042, 24317, 23043, 20734, 17920, 15874, 15357, +14851, 12798, 11264, 9473, 4350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1, 3, -4, 3, -1, -513, -510, -514, -511, -512, +-512, -768, -769, -767, -513, 513, 768, 511, 770, 764, 773, 763, 773, 764, 770, -1, +-1536, -1535, -1280, -1281, -1535, -1537, -1535, -1537, -1535, -1281, 1024, 1793, 1535, 1536, 1537, 1534, +1539, 1533, 1539, 1532, 261, -2309, -2555, -2308, -2302, -2304, -2306, -2301, -2306, -2304, -1790, 1533, +2819, 2302, 2305, 2304, 2303, 2306, 2301, 2307, 2302, 770, -3075, -3580, -3077, -3067, -3076, -3069, +-3074, -3071, -3073, -2559, 1791, 3841, 3072, 3071, 3073, 3071, 3073, 3072, 2815, 3073, 1279, -3839, +-4608, -3841, -3839, -3841, -3839, -3841, -3838, -3843, -3325, 1790, 4865, 3840, 3839, 3585, 3841, 3581, +3844, 3579, 3845, 2044, -4093, -5377, -4608, -4609, -4606, -4611, -4603, -4613, -4349, -4097, 1536, 5632, +4865, 4606, 4354, 4607, 4351, 4610, 4350, 4609, 2816, -4353, -6399, -5377, -5375, -5121, -5375, -5121, +-5120, -5119, -5121, 1025, 6399, 5632, 5377, 5119, 5121, 4863, 5120, 4865, 5119, 3585, -4352, -7425, +-6143, -6145, -5888, -6142, -5635, -5885, -5634, -5888, 769, 7167, 6400, 5890, 5885, 5891, 5629, 5634, +5631, 5633, 4351, -4096, -8191, -6657, -6655, -6402, -6653, -6404, -6651, -6149, -6396, -2, 7680, 7169, +6655, 6400, 6401, 6143, 6145, 6143, 6144, 5377, -3841, -8959, -7425, -7424, -7167, -7426, -6909, -7172, +-6651, -7173, -765, 7935, 7936, 7168, 6913, 6911, 6913, 6655, 6656, 6400, 6146, -3075, -9725, -8196, +-7932, -7683, -7934, -7425, -7679, -7170, -7677, -1795, 8450, 8704, 7678, 7427, 7421, 7427, 7165, 7427, +6908, 6916, -2562, -10240, -8959, -8705, -8192, -8447, -7937, -8448, -7679, -8449, -2815, 8447, 9473, 8191, +8193, 7936, 7935, 7681, 7936, 7423, 7426, -1538, -10751, -9472, -9216, -8705, -8958, -8450, -8959, -8192, +-8961, -3838, 8445, 10243, 8701, 8707, 8445, 8706, 8191, 8449, 7679, 8193, -770, -11261, -10243, -9726, +-9216, -9473, -8959, -9217, -8704, -9215, -4864, 8191, 11009, 9215, 9216, 8961, 8959, 8705, 8703, 8192, +8704, 513, -11521, -11007, -10241, -9728, -9984, -9470, -9731, -9213, -9731, -6142, 7680, 11775, 9729, 9727, +9473, 9471, 8962, 9214, 8705, 9215, 1536, -11519, -11520, -10498, -10237, -10499, -10239, -10238, -9731, -9982, +-7169, 7168, 12289, 10240, 10239, 9728, 9984, 9473, 9727, 8962, 9725, 2562, -11521, -12544, -11006, -10755, +-10749, -10500, -10492, -10243, -10238, -8193, 6400, 13056, 10753, 10750, 10242, 10495, 9984, 9984, 9473, 10238, +3843, -11267, -13054, -11522, -11262, -11265, -11008, -10752, -10752, -10497, -8958, 5630, 13569, 11263, 11009, 10495, +10754, 10238, 10496, 9729, 10495, 5121, -10752, -13825, -11775, -11520, -11520, -11521, -11006, -11011, -10748, -9988, +4611, 13823, 11519, 11266, 10749, 11010, 10496, 10751, 9985, 10495, 6144, -9727, -14082, -12030, -11778, -11517, +-11523, -11006, -11265, -10751, -10497, 3329, 13823, 11777, 11264, 11007, 11009, 10496, 10751, 10242, 10493, 7170, +-8960, -14337, -12031, -12032, -11522, -11773, -11010, -11520, -10494, -10755, 2050, 13568, 12031, 11265, 11007, 11009, +10494, 10756, 10235, 10245, 7932, -7678, -14336, -12033, -12031, -11520, -11777, -11007, -11521, -10496, -11263, 511, +13312, 12288, 11264, 11008, 11008, 10752, 10496, 10240, 10240, 8704, -6399, -14594, -12030, -12033, -11521, -11772, +-11014, -11514, -10501, -11517, -769, 12800, 12544, 11264, 11008, 11008, 10752, 10495, 10498, 10237, 9220, -5380, +-14845, -12291, -12029, -11522, -11775, -11008, -11521, -10495, -11521, -2047, 12544, 12543, 11266, 11005, 11010, 10752, +10494, 10499, 9981, 9730, -3840, -14593, -12287, -12033, -11520, -11775, -11009, -11518, -10499, -11518, -3329, 12032, +12801, 11263, 11264, 11009, 11006, 10498, 10495, 9983, 9986, -2562, -14591, -12544, -12033, -11518, -11779, -11261, +-11523, -10493, -11521, -4352, 11264, 13055, 11265, 11264, 11009, 11007, 10496, 10496, 9984, 10240, -1280, -14080, +-12799, -12034, -11518, -11778, -11263, -11520, -10752, -11520, -5632, 10496, 13311, 11266, 11262, 11010, 11005, 10499, +10750, 9985, 10496, -1, -13823, -12800, -12034, -11516, -11781, -11259, -11524, -10750, -11520, -6657, 9473, 13568, +11263, 11265, 10751, 11009, 10496, 10751, 9985, 10751, 1281, -13313, -13055, -12032, -11521, -11774, -11267, -11517, +-11011, -11261, -7683, 8707, 13566, 11264, 11265, 10751, 11008, 10498, 10749, 9987, 10750, 2305, -12800, -13313, +-12031, -11521, -11775, -11520, -11521, -11007, -11266, -8445, 7421, 13827, 11517, 11267, 10750, 11008, 10498, 10749, +9988, 10748, 3587, -12033, -13825, -12030, -11778, -11774, -11521, -11264, -11008, -11007, -8962, 6147, 13821, 11523, +11262, 10752, 11010, 10492, 10757, 9980, 10754, 4864, -11265, -13823, -12033, -11775, -11520, -11521, -11262, -11266, +-10751, -9727, 5118, 13825, 11777, 11262, 10754, 11007, 10496, 10753, 9983, 10752, 5889, -10241, -14079, -12034, +-11774, -11521, -11519, -11265, -11264, -10752, -10239, 3838, 13827, 11772, 11269, 11004, 11009, 10497, 10751, 9984, +10498, 6653, -9214, -14337, -12031, -12034, -11517, -11780, -11260, -11524, -10748, -10756, 2563, 13567, 12031, 11266, +11006, 11010, 10494, 10753, 10241, 10493, 7428, -8195, -14591, -12031, -12035, -11516, -11779, -11007, -11519, -10499, +-11004, 1021, 13569, 12288, 11263, 11009, 11009, 10750, 10498, 10237, 10243, 8190, -7166, -14594, -12030, -12034, +-11519, -11776, -11008, -11519, -10498, -11262, -3, 13061, 12539, 11267, 11007, 11007, 10755, 10493, 10241, 10240, +8959, -5885, -14852, -12285, -12034, -11519, -11775, -11010, -11520, -10494, -11523, -1276, 12541, 12544, 11266, 11006, +11008, 10755, 10491, 10501, 9981, 9472, -4606, -14338, -12287, -12032, -11520, -11777, -11006, -11522, -10495, -11520, +-2560, 12287, 12802, 11261, 11012, 11005, 10753, 10496, 10495, 9986, 9982, -3326, -14594, -12543, -12032, -11521, +-11774, -11010, -11519, -10496, -11521, -3839, 11520, 12799, 11266, 11261, 11011, 11005, 10500, 10491, 9989, 10235, +-2043, -14085, -12539, -12036, -11517, -11778, -11263, -11521, -10750, -11521, -5121, 10755, 13308, 11267, 11263, 11007, +11011, 10493, 10754, 9982, 10498, -514, -13821, -12803, -12030, -11521, -11776, -11263, -11521, -10751, -11521, -6143, +9982, 12802, 11263, 11265, 10751, 11009, 10493, 10756, 9981, 10498, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -254, -258, 2, -2, 257, +0, -1, 2, -771, -1020, -1028, -765, -258, 0, 258, 509, 1028, 508, -253, -258, -767, +-1536, -1793, -1790, -1538, -1022, -1538, -1279, -1025, -254, 766, 1281, 1280, 1023, 1026, 509, 3, +509, 772, -4, 3, -515, -764, -5, 262, -7, 262, -3, -768, -1278, -2051, -1790, -256, +255, 769, 2303, 2049, 1023, 1026, -3, -2302, -3328, -3074, -2300, -2565, -2813, -2048, -770, 259, +-3, 770, 511, 0, 513, 510, 3, -3, 769, 1793, 2814, 1538, -1, -1280, -1280, 1, +253, 260, 253, -510, -1537, -2560, -1279, -1281, -1024, 0, 1793, 1791, 1537, 1279, 256, -1024, +-2048, -2047, -2049, -1536, -2816, -3328, -2559, -2305, 0, 1024, 1, 510, 259, -4, 5, -5, +-507, 1275, 2565, 2555, 1029, -4, -1021, -2, 1, -257, 258, 765, -508, -517, -763, -1796, +-2557, -1026, 513, 1536, 2304, 511, 257, 0, -1024, -1792, -1793, -2046, -515, -1788, -3076, -2812, +-771, 1, -257, 515, 1020, 260, -4, -1789, -2049, -256, -512, 511, 1537, 1792, 1536, 1025, +-259, 3, 254, 1, 513, 1533, 516, -516, -2301, -2818, -2047, 0, 511, 2306, 2301, 4, +-260, -1533, -2050, -1279, -1024, -513, -510, -1538, -2046, -2563, -2301, -1282, 1794, 1534, 2, -1538, +-2046, -3329, -512, 0, 1793, 3071, 2304, 257, -770, -1534, -1, -256, 768, 512, 2049, -514, +-1533, -1540, 260, 509, 1795, 765, -253, -772, -763, -1541, -1276, -3, 1025, -255, -1794, -2558, +-2305, -2304, -1791, -2, 2051, -3, -2557, -2050, -3071, -1025, 1, -512, -257, 2050, 766, -1534, +-2817, -1536, 1024, 2561, 1790, 1539, 1277, 2, -1793, 256, 1, 1791, 2048, 0, -1024, -256, +-3072, -2815, -1538, 2050, 4350, 1794, -1794, -2045, -3331, -3838, -3329, 1536, 1537, -1025, -2816, -3327, +-3330, -1278, -1281, 512, 2049, 1535, 1536, -1023, -3585, -2816, -766, 1021, 1795, 2045, 258, -3073, +-1023, 1023, 1793, 3070, 5123, 3069, 2562, -1792, -2818, -3325, -3331, -254, 2303, 256, 0, -1791, +-2819, -2299, 250, 5, 509, 1, -255, -2561, -3328, -4864, -2815, -257, -767, -1, 1537, -513, +-3071, -2049, -512, 513, 1023, 1280, 769, -514, -1022, -2, 257, 2304, 4097, 3582, 514, 254, +1282, -1025, -3328, 769, 3838, 259, -3076, -2556, -771, 2, -1025, -1535, -1538, 2, -513, -1280, +-3326, -2563, -1022, -1536, -3074, 514, 1791, -2559, -3840, -1025, -1, -253, -1283, -508, -5, -509, +-2304, -257, 513, 3071, 3841, 3327, 2050, 2301, 1283, -515, -253, 2814, 1537, -512, -1281, -1023, +-1280, -1025, -767, 3072, 2559, -1022, -4099, -4093, -3843, -4093, -1539, -1533, -1539, 2, 0, -4098, +-2558, -1793, -512, -511, 511, 256, 1, -4097, -3839, -1793, 769, 512, 3070, 2564, 1276, 771, +3582, 1536, 1538, 3069, 3331, 2046, 769, -256, -512, -257, -767, 1793, 766, -253, -515, -1022, +-4865, -4607, -1793, -1536, -2559, -770, -2557, -3330, -2560, -1280, -2559, -1537, -2302, -3, -766, -2816, +-1794, -252, -517, -252, 1022, 257, -1, 1793, 2815, 1025, 2560, 2304, 2303, 2817, 3072, 2559, +2050, 1022, 1792, 770, 253, -253, -2, -767, -2304, -3329, -1535, -1793, -2046, -3586, -4607, -2560, +-2048, -2561, -3326, -514, -254, -1793, -3585, -3326, -4354, -766, -1, 512, 1, -514, -3069, -1028, +1797, 3580, 3074, 2559, 2048, 4609, 2815, 1, 1791, 3584, 4354, 5373, 2563, -3, 259, -770, +-2047, -257, 513, -1281, -2303, -4866, -4349, -3075, -3326, -4865, -1793, -510, -1537, -3073, -4861, -3588, +-2044, -2820, -2813, -514, 2, -1281, -2817, -2814, -258, 1281, 2304, 2303, 3073, 4352, 1535, 1281, +2815, 5121, 3839, 3329, 3583, 4610, 2558, 256, 2, 1534, 1537, -256, -1537, -3070, -5122, -3326, +-4355, -5885, -3586, -1790, -3074, -3582, -3587, -4604, -2820, -2812, -2563, -1790, -2818, -4350, -2561, -1536, +-1279, -1, 512, 1, 3326, 4098, 1791, 1537, 2558, 2562, 4863, 4609, 3839, 4352, 2561, 1790, +5379, 5628, 1797, 1018, 262, -2310, -251, -2051, -5119, -5120, -5120, -5377, -3070, -3330, -5118, -4609, +-3584, -3584, -1791, -1794, -4093, -4611, -4093, -5123, -2301, -3, -1533, -2, 1025, 1535, 1793, 2559, +1025, 3071, 4865, 4095, 4097, 5375, 3585, 4095, 6145, 5375, 4865, 4352, 1023, 1281, 768, -257, +-2559, -2817, -4607, -3329, -3327, -5889, -7168, -5631, -4610, -3837, -2563, -3837, -4355, -4862, -4608, -4097, +-2815, -3329, -2560, -1534, -771, -253, 765, 770, 1792, 3838, 3844, 2811, 3588, 3326, 4609, 6144, +7167, 6145, 7679, 5122, 3582, 4097, 3328, 1792, -1, -1021, -2308, -2813, -5378, -5887, -5375, -5378, +-5631, -4609, -5118, -5634, -5887, -5888, -5121, -3582, -3842, -3583, -2816, -3840, -3072, -2048, -1024, -768, +1024, 2048, 3072, 3072, 2048, 1536, 4096, 5121, 6397, 7428, 7420, 6916, 5885, 4865, 5888, 5632, +3072, 1280, 1279, -510, -2562, -4605, -6148, -6141, -4354, -4607, -6144, -6655, -7427, -7165, -5891, -5117, +-4354, -3583, -6401, -6655, -3328, -2817, -2814, -1539, -1020, -4, 2307, 2046, 1538, 1790, 2562, 3837, +5380, 6140, 6660, 7933, 5633, 7169, 9470, 7937, 5889, 4862, 3331, 1788, 516, -1796, -2811, -3077, +-4604, -6146, -7168, -7167, -7937, -7679, -7937, -6399, -4610, -5374, -7169, -7168, -6144, -4352, -3072, -2817, +-1789, -772, -252, -259, 257, 1536, 3072, 3584, 3840, 4352, 5632, 5632, 5120, 7680, 9472, 8960, +7937, 6911, 6912, 4865, 2814, 771, 1021, 258, -769, -3839, -5889, -7168, -8447, -9474, -7932, -6661, +-6140, -6403, -6910, -6912, -7937, -6399, -6145, -3584, -2558, -1539, -2813, -2050, -1792, -254, -4, 1541, +3836, 5378, 4096, 4351, 4353, 6143, 7937, 9984, 9472, 10240, 8959, 7426, 5630, 4353, 3072, 2816, +2559, 2, -2051, -4349, -7170, -8704, -9215, -8449, -7935, -7681, -8191, -7937, -8191, -8705, -7167, -5377, +-4862, -4099, -2557, -3587, -3069, -2051, -1020, -773, 772, 1533, 2818, 4095, 5121, 4862, 6659, 7932, +10243, 9214, 8706, 9982, 9987, 7420, 6403, 5887, 4608, 2561, 1023, -768, -2303, -4865, -6912, -7935, +-8706, -9725, -10755, -11262, -10753, -7168, -5887, -6914, -7422, -6657, -5888, -4351, -3074, -2303, -2559, -2563, +-2044, -771, 257, 513, 2045, 5380, 6908, 8707, 8703, 7424, 7936, 9472, 11519, 10242, 8703, 7679, +6658, 5373, 4611, 3582, 1537, -257, -1791, -4098, -7422, -9472, -11522, -13309, -12804, -10748, -8194, -7168, +-7935, -6913, -6399, -6145, -4096, -3583, -4097, -3328, -2816, -2560, -2559, -2817, -769, 2305, 4864, 6912, +7936, 6656, 6143, 8194, 9982, 10497, 10752, 10495, 8706, 8957, 7940, 6651, 4870, 3577, 2567, 1019, +-2046, -4608, -8961, -12543, -13568, -12033, -12032, -11519, -10497, -8192, -6911, -5890, -6654, -5633, -4096, -3840, +-3840, -4096, -3840, -4352, -3072, -1537, 1282, 3838, 4610, 4862, 6914, 7934, 8449, 9217, 8957, 9988, +11260, 11011, 9983, 9216, 8191, 7169, 7167, 5122, 3326, 770, -3075, -6909, -9475, -11517, -13570, -14590, +-15363, -13821, -11010, -8703, -6656, -4865, -4863, -5633, -4351, -4353, -4351, -4865, -4864, -4351, -2049, 0, +513, 2047, 3841, 6144, 8446, 8195, 8190, 8449, 8448, 9984, 11775, 11522, 10493, 10499, 9726, 8705, +7935, 5377, 3327, 1024, -2047, -6401, -11008, -14335, -15873, -16384, -15871, -13570, -11518, -9728, -6914, -3838, +-3329, -4352, -4607, -4866, -4862, -4353, -4096, -3584, -2560, -1279, 766, 3329, 4608, 5887, 6915, 8188, +9218, 8960, 8447, 9986, 12029, 12035, 11517, 11779, 11007, 8959, 7937, 6656, 4863, 1539, -3332, -8700, +-12548, -14588, -15875, -17406, -16897, -14592, -11775, -9218, -6909, -4355, -4094, -5377, -5120, -4606, -4100, -4091, +-4100, -4094, -2817, -1535, 255, 2050, 4861, 6915, 7677, 7427, 8190, 8961, 9984, 11007, 13057, 12799, +11778, 11774, 11009, 10239, 8961, 7168, 4864, 2047, -2559, -7680, -13057, -16381, -17669, -17147, -16900, -15102, +-12032, -9473, -7678, -6403, -4861, -4099, -3582, -3328, -3841, -4351, -4609, -4608, -3839, -2305, 0, 2048, +3841, 5886, 8195, 9468, 9732, 9469, 11266, 12543, 13057, 12031, 11520, 10752, 11264, 10497, 9727, 8960, +6144, 1535, -2558, -7681, -12544, -16384, -18944, -19968, -18432, -15872, -13569, -11517, -8707, -4607, -2816, -1793, +-2557, -4099, -4607, -4607, -5122, -4861, -4866, -3840, -1024, 2049, 4863, 7938, 8189, 8963, 11261, 12547, +11774, 12033, 11007, 10497, 11776, 11774, 11523, 11773, 11267, 8957, 7170, 3071, -2304, -8446, -13316, -16892, +-19202, -21248, -21503, -19457, -15359, -11009, -5887, -2561, -2046, -2562, -2047, -2816, -3841, -4606, -5890, -6655, +-5631, -3587, -764, 1020, 3331, 6654, 10242, 12542, 13058, 12286, 10241, 11008, 12287, 11778, 11262, 12033, +12032, 12031, 11778, 9470, 6400, 2306, -2050, -6399, -10752, -16386, -22013, -24321, -23297, -19966, -15363, -10749, +-6913, -4096, -2049, -2302, -1538, -2046, -3074, -4606, -5890, -6654, -6401, -4608, -2560, 257, 4606, 8707, +11773, 12290, 11775, 12033, 12542, 11522, 12030, 12034, 11007, 11776, 12800, 12287, 11522, 9983, 7168, 4353, +-3, -5884, -12547, -18175, -22016, -24576, -24833, -21502, -16388, -11002, -7942, -4347, -1029, -252, -514, -1791, +-3328, -5377, -6400, -7679, -7425, -6142, -2306, 1536, 5889, 8703, 11010, 12542, 13057, 13055, 13058, 11005, +10244, 10491, 12037, 12284, 13059, 13054, 12545, 11775, 8961, 4351, -1023, -7169, -12799, -16896, -20993, -24831, +-26112, -23809, -18686, -12291, -6396, -2564, -508, -260, -509, -2050, -3839, -5377, -6910, -7683, -7164, -4613, +-2043, 252, 3074, 7424, 11007, 13570, 13822, 12289, 11519, 10753, 11008, 11520, 12543, 13058, 13822, 14850, +14590, 11777, 7425, 3326, 2, -4354, -11263, -18431, -23555, -27132, -27653, -24827, -19204, -12798, -5888, -1025, +513, -257, -767, -1792, -3584, -5121, -6398, -7682, -7422, -6145, -3584, 256, 3585, 7679, 12032, 13825, +13567, 12033, 10239, 10497, 12030, 12291, 12798, 14080, 14849, 15102, 13827, 12030, 8449, 4350, 2, -4609, +-10751, -18177, -24832, -28160, -27904, -25088, -19712, -12287, -6658, -2558, -258, 257, -511, -1794, -3326, -5122, +-6398, -7426, -7934, -7171, -4349, -514, 3586, 8446, 11777, 14080, 12799, 11522, 11774, 12290, 12287, 12800, +13057, 13566, 14594, 14590, 13826, 12287, 9728, 5888, 1279, -4862, -12034, -18942, -24322, -26879, -26880, -25600, +-21505, -14333, -6917, -2043, -4, -253, 510, 2, -2051, -5628, -7939, -9215, -8960, -7425, -5118, -1282, +3330, 7421, 10244, 12539, 14085, 13820, 12290, 11776, 13055, 12801, 12288, 12799, 14593, 15871, 15105, 13055, +10753, 7167, 1281, -5632, -12545, -17918, -22276, -26619, -28932, -26621, -21249, -14337, -7934, -2306, 1, 1280, +511, -1278, -3586, -5374, -7170, -8191, -7936, -6656, -4352, -1793, 770, 5117, 9732, 13053, 13824, 13570, +13310, 13057, 12543, 12289, 13823, 14594, 15869, 15363, 15101, 13571, 10494, 5377, 0, -5120, -10753, -16894, +-22530, -27390, -29697, -27649, -22269, -14853, -7418, -2053, 3, -1, -1, -254, -2305, -3840, -5887, -7169, +-7936, -7936, -6655, -3585, 2, 4348, 9220, 12797, 14082, 14079, 13057, 12798, 13571, 14076, 13572, 15102, +15615, 15875, 15101, 13570, 10240, 6398, 1026, -4097, -10240, -16382, -23043, -27645, -30211, -27902, -21505, -14847, +-8705, -3072, 513, 767, 0, 1, -2051, -4347, -6149, -7676, -8707, -8191, -6655, -3842, 2, 4350, +9218, 11518, 13057, 14080, 13311, 12801, 13056, 14079, 14081, 15103, 16129, 16383, 15617, 14080, 11263, 6913, +1535, -4607, -10495, -16387, -21245, -25859, -29182, -27904, -22273, -15872, -9215, -4098, -509, 509, 3, -259, +-2301, -4355, -6141, -7426, -8191, -8192, -6912, -4096, -512, 3327, 7937, 11264, 13568, 14080, 13824, 13312, +13311, 14594, 14846, 15361, 16129, 16893, 16132, 13821, 10753, 6656, 1280, -4352, -9472, -15360, -20736, -25344, +-28928, -28672, -24064, -16895, -9219, -3324, 253, 1282, -1, -1024, -2049, -3837, -5891, -7422, -8705, -8193, +-6910, -4609, -1279, 3070, 7938, 11774, 13826, 13567, 13567, 13315, 13308, 14340, 15356, 14851, 15871, 16896, +16385, 14078, 10498, 5631, 1792, -2560, -8192, -14591, -20737, -26623, -29954, -29438, -24322, -17149, -9219, -4349, +-3, 1538, 1790, 2, -2305, -4352, -5887, -7682, -8702, -8706, -7934, -5378, -1790, 3326, 7938, 11774, +13826, 13822, 14338, 14335, 13568, 13056, 13312, 14848, 15616, 16641, 15614, 13570, 10494, 7681, 3329, -1282, +-7933, -14339, -20222, -25089, -29440, -29950, -25858, -18175, -10496, -3841, 258, 1534, 1025, 0, -1536, -3584, +-5376, -7680, -9217, -9470, -8194, -5630, -2305, 2303, 7169, 11776, 14335, 15618, 14590, 12545, 12032, 13566, +14595, 14589, 15620, 15612, 15619, 14845, 12035, 7677, 3331, -1282, -6400, -12542, -19716, -25851, -30212, -30206, +-26113, -18688, -10239, -4353, -255, 1022, 1282, 767, -1023, -3841, -5888, -7168, -8448, -8959, -8704, -6657, +-3071, 1535, 6400, 11521, 14591, 14338, 13566, 13569, 14591, 14593, 13568, 13055, 14850, 16637, 16387, 14846, +12032, 8706, 4350, -767, -6657, -12799, -18945, -25342, -30722, -30207, -25600, -19201, -12286, -5122, 2, 1790, +1793, 768, -512, -2560, -5375, -6915, -8700, -9476, -9212, -7427, -3838, 1277, 6915, 10239, 12545, 14846, +15873, 14591, 13826, 13566, 13569, 14592, 15616, 15871, 15874, 14844, 12805, 9724, 4610, -767, -6148, -12284, +-18691, -24573, -30210, -31999, -28417, -20991, -11520, -4097, -510, 1790, 2561, 1536, 511, -1790, -4866, -7166, +-8962, -9983, -9472, -7424, -4096, 0, 5376, 11008, 14847, 14594, 14334, 14594, 13567, 12287, 13314, 13822, +14594, 15102, 15362, 14846, 13057, 9216, 4607, -767, -5632, -9985, -16127, -24576, -30210, -30716, -27141, -20219, +-12036, -4861, -771, 1539, 2301, 2819, 510, -1535, -4609, -6655, -8194, -8957, -9730, -8703, -5376, 767, +6656, 10498, 12542, 14081, 13312, 12799, 12802, 13054, 12545, 12544, 13311, 14849, 15104, 14335, 12034, 9213, +6146, 1536, -4609, -11519, -17408, -22274, -26364, -29444, -27133, -21249, -12801, -5630, -514, 2050, 2814, 2050, +254, -1790, -4354, -6654, -8450, -9726, -9473, -7424, -4352, 1, 4862, 10242, 13567, 14337, 13823, 13312, +12544, 11776, 11521, 12031, 14080, 15104, 15104, 14336, 13057, 10494, 6658, 1277, -4348, -9988, -15868, -22020, +-27646, -30720, -28673, -22783, -13568, -4865, 258, 2045, 2819, 2046, 257, -1792, -4609, -6911, -8448, -8961, +-9214, -7938, -4607, -256, 4352, 9472, 13312, 14592, 12543, 12035, 12029, 11777, 12032, 14079, 14849, 15361, +15614, 15105, 13824, 10751, 6402, 1534, -2559, -8448, -15616, -23040, -29697, -31743, -28929, -23038, -14338, -5886, +-2, 2818, 3838, 2306, 255, -1536, -3839, -5889, -7680, -9215, -9730, -8190, -5377, -768, 4864, 9216, +12288, 13824, 13056, 11776, 10752, 10751, 12034, 13054, 14593, 15872, 16127, 15106, 13823, 11263, 7937, 3328, +-1792, -8191, -15362, -22527, -28928, -32000, -29696, -23296, -14848, -6656, 0, 3327, 3330, 2046, 770, -770, +-3327, -5632, -8192, -9984, -10496, -8960, -5121, -509, 4092, 8709, 12026, 13062, 12795, 11268, 10749, 12034, +12543, 13057, 13823, 15616, 15873, 15615, 14337, 12031, 8448, 3585, -1281, -7167, -14337, -22273, -29181, -32004, +-29692, -23555, -15358, -7938, -1277, 2044, 3588, 3325, 1794, -514, -2813, -5891, -8189, -9731, -10238, -9217, +-6654, -1283, 3844, 8443, 11268, 12286, 12544, 11778, 12029, 11779, 11517, 12035, 13309, 14083, 15358, 15873, +14592, 12287, 9217, 5119, -255, -6913, -13823, -20737, -27903, -31745, -29951, -24833, -16895, -7936, -257, 3073, +4607, 3585, 2048, -769, -3327, -5889, -7936, -9982, -10755, -9469, -6147, -1534, 3071, 7681, 10752, 13055, +13057, 11519, 10753, 10752, 11519, 12289, 13568, 14080, 15103, 15104, 14849, 13055, 9218, 4606, -1, -5629, +-12803, -20477, -27650, -32000, -31231, -25345, -15871, -7169, -1022, 2557, 4099, 3837, 2563, 254, -2815, -5376, +-7937, -9471, -9985, -9215, -6912, -2817, 2048, 7424, 11009, 12031, 12032, 11776, 10752, 10753, 11775, 12288, +12544, 13824, 14848, 15104, 14337, 12542, 10242, 6654, 1025, -5119, -12290, -20478, -27906, -31742, -30466, -24830, +-16898, -8703, -2048, 2816, 4608, 3840, 2815, 513, -2304, -4864, -7424, -9473, -10751, -9729, -6655, -2304, +2048, 6399, 9985, 12031, 13057, 12288, 10751, 10241, 11520, 12286, 12804, 13307, 14340, 15102, 14849, 13568, +10751, 6913, 1279, -5375, -12288, -19713, -26367, -31233, -31232, -26367, -17665, -8959, -1794, 2819, 4092, 3333, +2044, 1026, -1537, -4096, -7423, -9728, -10241, -8960, -7167, -3585, 1025, 6399, 10752, 13058, 13054, 12032, +9473, 9982, 12035, 12798, 12289, 12543, 13568, 14592, 14849, 14080, 11519, 7169, 2047, -3839, -11008, -18688, +-26625, -31999, -32000, -26625, -17407, -9473, -3071, 1535, 3585, 4095, 3072, 1025, -1537, -4096, -6911, -8961, +-10495, -9985, -7936, -3840, 1281, 6912, 10751, 12033, 12031, 11776, 11009, 11519, 11520, 11266, 11773, 12802, +13567, 14080, 14338, 13053, 11010, 7935, 3841, -2816, -10753, -19199, -26369, -30207, -30209, -26367, -19201, -11262, +-3075, 1795, 4093, 3587, 3069, 1539, -2, -2816, -6142, -9476, -11004, -10755, -7677, -3331, 1283, 5884, +9221, 11515, 12805, 12796, 11266, 10240, 11262, 11267, 11262, 11264, 12033, 13054, 14082, 13567, 12032, 8704, +3328, -2815, -9730, -17662, -25090, -29950, -31490, -27646, -19713, -11265, -4350, 766, 3842, 4607, 4608, 2815, +2, -3330, -7165, -9475, -10495, -9984, -7681, -4094, 255, 5119, 9986, 12030, 12289, 11777, 11261, 11012, +11004, 10755, 10494, 11266, 12798, 13826, 14590, 14337, 12544, 8704, 3584, -1791, -8451, -16892, -25348, -29948, +-31236, -28413, -20994, -12542, -4866, 1282, 3838, 5377, 4352, 2560, 0, -3072, -6400, -8961, -10238, -9986, +-8446, -4866, 2, 4606, 9217, 11777, 12030, 12034, 10495, 10239, 9986, 11007, 11776, 12545, 13054, 13826, +14591, 14080, 12289, 9214, 5378, -769, -8192, -16383, -24577, -29952, -31488, -28415, -21505, -13567, -4865, 768, +4353, 4606, 4099, 3068, 261, -2821, -5884, -8707, -10494, -10241, -8704, -5119, -2, 4611, 8701, 10753, +12033, 11518, 10498, 8959, 9728, 11009, 11263, 12032, 13568, 14848, 15105, 15103, 13312, 10240, 5632, -512, +-7936, -15617, -23806, -29697, -32000, -29696, -22785, -13310, -5121, 257, 3071, 4609, 4095, 2305, 511, -2303, +-5632, -8192, -9985, -9983, -8449, -5375, -512, 4094, 8450, 10751, 11264, 10497, 9727, 9472, 9729, 10751, +12032, 12545, 13312, 14847, 15362, 15357, 13570, 10496, 5631, 2, -7683, -15613, -23042, -29440, -31998, -28931, +-23036, -14340, -5373, 510, 3329, 4864, 4607, 2818, 765, -2556, -5636, -7933, -9986, -10751, -9216, -5632, +-768, 3840, 7936, 10240, 10495, 9730, 9470, 9474, 9726, 10753, 11777, 12030, 13314, 14078, 14849, 14849, +13566, 10242, 6142, 258, -6145, -14080, -22016, -27648, -29952, -28160, -22271, -14338, -6399, 1, 3070, 4610, +4094, 2305, 0, -2048, -5120, -7424, -9472, -9984, -8449, -5375, -1024, 3072, 6656, 9216, 10495, 10241, +9472, 8703, 9218, 10494, 11777, 12544, 13055, 13826, 14333, 14084, 13052, 11011, 6654, 1025, -4864, -12801, +-20990, -27139, -30205, -28674, -23039, -14849, -7167, -514, 3588, 4604, 4098, 3071, 1280, -1278, -4866, -8191, +-9986, -9982, -9216, -6401, -2046, 2300, 6148, 9213, 9987, 10494, 10497, 9215, 9217, 10495, 11265, 11775, +12545, 13567, 14593, 15102, 13315, 10748, 6660, 2301, -3327, -11519, -20226, -27390, -31233, -30208, -24064, -15616, +-7168, -512, 3840, 5120, 4608, 3072, 768, -2048, -5120, -7936, -9472, -10495, -9473, -6911, -2818, 1794, +5887, 9216, 10241, 9982, 10242, 10239, 10240, 10240, 10496, 10751, 12802, 13822, 14594, 15102, 13825, 11264, +7679, 2818, -3074, -11007, -20224, -27648, -30977, -29950, -24322, -16127, -7936, -512, 3839, 5379, 4860, 3331, +510, -2047, -5120, -7680, -9728, -10241, -9726, -6914, -2559, 1792, 5375, 8194, 10238, 11010, 10238, 10498, +10237, 10243, 10750, 11778, 12798, 14337, 14848, 14847, 13826, 11518, 7682, 3070, -2814, -10498, -19455, -27392, +-32000, -30720, -24831, -16386, -7679, -512, 3584, 5889, 6142, 3843, 1020, -2300, -5635, -8446, -9729, -10240, +-9471, -7681, -4351, 511, 5377, 8446, 10243, 11518, 11521, 11008, 9983, 8705, 9472, 11263, 13057, 14336, +15360, 15360, 14335, 11776, 7938, 3326, -2303, -9984, -19202, -27132, -32004, -31742, -25600, -16897, -7422, 511, +5375, 6401, 5888, 4352, 512, -2817, -5886, -8450, -9982, -11011, -10237, -7938, -4606, -2, 4865, 8960, +11263, 11522, 10493, 9475, 9214, 9217, 9216, 10495, 13313, 14591, 15362, 15357, 14083, 11774, 8193, 3840, +-2049, -9727, -18945, -26879, -32001, -31487, -24833, -15871, -7169, 0, 5121, 7423, 6145, 3583, 256, -2558, +-5636, -8443, -10245, -11004, -10755, -8702, -4865, 0, 5120, 8704, 10752, 10753, 10750, 10754, 9214, 8962, +9727, 10752, 12289, 14078, 15362, 15359, 14592, 12033, 8702, 4354, -1281, -9472, -18688, -26367, -31234, -30973, +-25603, -17150, -7681, 0, 5121, 7423, 6913, 3838, 514, -2817, -5632, -8190, -10500, -11772, -11011, -8703, +-4606, -4, 4356, 7933, 11010, 11007, 11008, 10752, 9728, 8704, 9217, 11007, 12545, 14079, 15104, 15873, +15103, 12802, 8446, 3840, -1790, -9219, -17661, -25602, -31487, -31489, -26110, -17410, -7679, 513, 5117, 7172, +6652, 4099, 1022, -2559, -6400, -9217, -10751, -11778, -11262, -8961, -5119, -257, 4352, 8448, 11264, 11777, +11007, 10240, 9985, 9214, 8707, 9212, 11780, 14589, 16129, 16385, 15102, 12546, 8959, 4351, -1022, -8706, +-17918, -26113, -31488, -31488, -25857, -17151, -8191, -2, 5890, 7678, 6145, 3328, 256, -2817, -5630, -8706, +-10750, -11778, -11518, -8962, -5119, -768, 3840, 8192, 10752, 12031, 12034, 10493, 8964, 8444, 9475, 10750, +12033, 14080, 15615, 16130, 15102, 12546, 9214, 4865, -1024, -8192, -16895, -25089, -31233, -32253, -26884, -17659, +-7685, 4, 4349, 6658, 6399, 3841, 767, -2047, -5378, -8445, -11010, -12031, -11264, -8962, -5629, -1026, +4353, 8703, 11521, 11519, 10754, 10237, 9475, 8701, 8451, 9726, 11521, 13823, 15361, 16127, 15106, 12541, +8963, 4862, -511, -7936, -16385, -25086, -30466, -30462, -25859, -18172, -8964, -509, 4862, 6913, 6655, 3841, +768, -2560, -5632, -8449, -10495, -11775, -11522, -9213, -5380, -764, 3581, 7426, 10495, 11776, 11776, 10241, +8702, 7683, 8188, 9988, 12285, 14338, 15870, 16130, 15358, 13058, 9470, 5377, -512, -7681, -15614, -23555, +-29949, -31490, -27135, -18688, -8962, -508, 4348, 6915, 6910, 4096, 2, -2819, -5373, -8195, -10493, -11779, +-11518, -9473, -5888, -1536, 3328, 7936, 10752, 11776, 11519, 10241, 8704, 7424, 8448, 10496, 12799, 14337, +15872, 16384, 15616, 13056, 9471, 5378, -2, -6655, -15616, -24320, -30720, -31999, -26883, -18429, -8706, -510, +4350, 6913, 6143, 3841, 512, -2305, -5631, -8449, -10495, -11521, -11775, -9985, -6143, -1537, 3584, 8193, +10495, 11264, 10497, 9726, 8963, 8956, 9476, 9981, 12290, 14847, 16384, 16384, 15361, 13055, 9728, 5377, +-2, -6909, -16131, -24830, -30465, -31487, -26370, -18173, -8964, -1276, 4349, 7170, 6399, 3584, 257, -2562, +-5630, -8194, -10494, -12033, -11777, -9725, -6149, -1531, 3580, 7427, 10239, 10496, 10495, 10497, 9728, 8704, +9728, 11008, 12543, 14850, 16126, 16385, 15616, 13056, 9472, 5376, 0, -7169, -15869, -23556, -29179, -30725, +-26621, -18945, -9473, -1533, 3581, 6402, 6398, 4098, 510, -2302, -5377, -8192, -10495, -11778, -11773, -9731, +-6398, -2049, 2561, 6655, 9729, 11007, 10752, 10753, 10239, 8960, 9473, 11519, 13056, 14337, 16127, 16640, +15873, 13567, 10241, 5375, -255, -7425, -15359, -23297, -29183, -31233, -27646, -20228, -10748, -2051, 3586, 6400, +6910, 4610, 510, -2558, -5121, -7936, -10752, -12032, -12288, -9984, -6912, -2816, 2559, 7171, 10236, 11524, +11005, 9986, 9982, 9730, 9982, 12802, 14079, 14591, 16130, 17149, 16643, 14078, 10241, 5375, 1, -6912, +-15361, -23550, -29443, -31229, -28162, -20479, -11009, -2046, 3581, 5379, 6141, 4611, 1021, -2045, -5123, -8445, +-10755, -12286, -12544, -10241, -6911, -2305, 2305, 7167, 9730, 11260, 11013, 9979, 9989, 9724, 10242, 12031, +13825, 15104, 16127, 16897, 16382, 14339, 10750, 5888, 258, -6659, -14590, -23297, -29696, -31999, -28161, -20223, +-11009, -2303, 3327, 5889, 6143, 4609, 1280, -1537, -5118, -8450, -11264, -12287, -12545, -10751, -7425, -2815, +2303, 6913, 9727, 10495, 10499, 10237, 9987, 9468, 9732, 11772, 13572, 15357, 16641, 17153, 16638, 14594, +11262, 6659, 253, -6398, -14594, -23295, -29696, -31488, -28672, -20992, -11521, -2559, 3327, 6146, 6398, 4354, +1277, -2045, -5122, -8447, -11008, -12289, -12287, -10497, -6911, -2817, 1536, 5634, 9213, 10499, 10493, 9730, +9472, 9471, 10242, 11518, 13313, 15359, 16898, 17406, 16898, 15102, 11521, 7168, 1279, -5630, -13827, -22268, +-28933, -31483, -28932, -21757, -12290, -3583, 2303, 6146, 6909, 4867, 2046, -1791, -5377, -8191, -10497, -12030, +-12034, -10752, -7423, -3329, 1025, 5376, 8703, 10241, 10239, 9473, 8959, 8961, 9983, 10497, 13568, 15870, +17155, 17661, 17666, 15615, 12544, 7681, 2047, -4607, -12545, -21247, -28417, -31487, -29185, -22527, -13568, -4865, +2049, 5887, 5888, 4354, 1789, -1532, -5125, -7419, -9733, -11259, -11780, -11005, -7682, -3840, 257, 4862, +8451, 9469, 9475, 9213, 8706, 9215, 10751, 11779, 13565, 15618, 17151, 17664, 17152, 15617, 13054, 8706, +3070, -3837, -12035, -20990, -28417, -30977, -29693, -23299, -14078, -5633, 256, 4609, 5630, 4866, 2303, -1024, +-4863, -7681, -9984, -11775, -12289, -11263, -8193, -3839, -1, 4098, 7934, 9729, 9215, 9218, 9470, 9986, +10238, 11008, 13059, 15612, 17155, 17918, 17664, 16130, 13821, 9731, 3838, -2815, -10497, -18943, -26880, -30721, +-29695, -24577, -16383, -7680, -513, 3840, 5632, 4866, 2812, -251, -3589, -7165, -9985, -11520, -12032, -11263, +-8450, -4862, -514, 3330, 6911, 9216, 9728, 9472, 9216, 9472, 10753, 11518, 13058, 14591, 16384, 17920, +18177, 16638, 14083, 9980, 4356, -1540, -9212, -17667, -25855, -30720, -30720, -25600, -17151, -8962, -1790, 3326, +5378, 5119, 2560, 1, -3586, -6398, -9218, -10750, -11522, -11006, -9218, -5630, -1282, 2817, 6656, 8959, +9475, 9980, 9732, 9980, 10499, 11263, 12287, 14339, 15868, 16900, 17660, 16899, 14591, 11008, 6145, -515, +-8189, -16641, -24831, -29953, -30976, -26881, -18686, -10241, -2559, 2558, 5634, 5375, 3584, 513, -2818, -5885, +-8707, -10750, -12289, -11776, -9983, -5889, -1792, 2049, 6143, 9216, 10241, 10238, 9987, 9725, 9986, 11007, +12288, 14081, 16127, 17153, 17663, 17408, 15361, 11775, 6657, -1, -7167, -15105, -23550, -29955, -31230, -27904, +-20481, -11262, -3331, 2050, 4864, 5632, 4096, 1280, -2049, -5630, -8961, -11264, -12288, -11776, -10240, -7168, +-2816, 1791, 5889, 9216, 10495, 10242, 9981, 9731, 9726, 9729, 11264, 13568, 15616, 17664, 18431, 17922, +15870, 12290, 7679, 1279, -5886, -14338, -22782, -29441, -32000, -28672, -21760, -12800, -4095, 2558, 5890, 6654, +4098, 255, -2560, -5631, -8706, -11006, -12033, -12289, -10237, -7172, -2812, 1277, 5889, 9216, 10752, 10496, +9217, 8446, 8962, 9982, 11779, 13564, 15620, 17405, 18433, 17665, 15870, 12802, 8191, 2304, -4608, -13312, +-21759, -28930, -31998, -29698, -22527, -13567, -4866, 1794, 5118, 5889, 4096, 1024, -1791, -4610, -7423, -9985, +-11518, -12034, -10749, -7685, -3322, 762, 5126, 8187, 9475, 9727, 9471, 8962, 9470, 10242, 11774, 14082, +15614, 16641, 17409, 17150, 16130, 13566, 9218, 3326, -3582, -11522, -20223, -26880, -30464, -29696, -23808, -15360, +-6656, -256, 3329, 5117, 4356, 1788, -508, -3075, -6400, -9470, -11267, -12029, -11010, -8191, -4352, -513, +3585, 6911, 9217, 9472, 9471, 9986, 9726, 10241, 11776, 13056, 14080, 16128, 17408, 17665, 16639, 14080, +9984, 4864, -1535, -9217, -17408, -25343, -30210, -30206, -25857, -17663, -8706, -2045, 2300, 5125, 5115, 2820, +-2, -2816, -6143, -8705, -10751, -12032, -11522, -9213, -5635, -1021, 2814, 6656, 9217, 9726, 9731, 9981, +9731, 9981, 10754, 12287, 14081, 16127, 17152, 17409, 16895, 14592, 11009, 5886, -254, -7937, -16129, -24318, +-29698, -30462, -26626, -19454, -11010, -3070, 2302, 4866, 5630, 4098, 1022, -2302, -5378, -8702, -10753, -11777, +-11518, -9473, -6145, -1789, 2044, 5636, 8445, 10242, 10238, 9730, 9727, 8960, 9984, 12032, 13824, 15873, +17150, 17666, 17150, 15362, 11775, 6912, 768, -6400, -14336, -22272, -28927, -31234, -28414, -21506, -12798, -4097, +1793, 5119, 5632, 3841, 766, -2300, -5126, -7929, -9991, -11258, -11525, -9724, -6915, -3069, 1534, 5632, +8448, 9985, 9727, 8961, 9215, 9472, 10753, 12287, 14080, 15873, 17151, 17409, 16895, 15872, 12545, 8191, +2560, -4863, -13058, -21757, -28419, -31231, -29439, -23042, -14333, -5635, 513, 3842, 4860, 3845, 1786, -1018, +-3844, -7166, -9729, -11521, -11773, -10756, -7675, -3846, 517, 4861, 7936, 9474, 9469, 9220, 9468, 10498, +11263, 12033, 13311, 15106, 16893, 17667, 17662, 16385, 13568, 9216, 3583, -3326, -11778, -20223, -27391, -30979, +-29692, -24068, -16125, -7937, -1024, 3841, 5374, 4098, 1791, -512, -3071, -6401, -9216, -11263, -11778, -11261, +-8451, -4606, -257, 3841, 7167, 9217, 10238, 9987, 9725, 9474, 11007, 12545, 13311, 14337, 16382, 17667, +17662, 16385, 14079, 10241, 4863, -2046, -9988, -18427, -26117, -30971, -30724, -26110, -17665, -8959, -2305, 2562, +4861, 5123, 2558, 1, -2816, -6145, -8958, -11011, -12029, -11522, -9215, -5632, -1025, 3329, 6912, 9215, +9730, 9982, 9730, 10238, 9986, 11262, 13058, 14591, 16384, 17408, 17920, 17152, 15105, 11007, 5632, -768, +-8447, -16896, -25089, -30463, -31233, -27391, -19712, -11009, -3071, 2302, 5123, 4861, 3075, -3, -2302, -5377, +-8191, -10753, -11776, -11774, -9731, -6397, -2051, 2307, 6142, 8706, 10236, 9990, 9210, 9221, 10236, 11523, +12798, 14338, 15613, 17155, 17917, 17411, 15358, 12545, 7680, 1279, -6143, -14336, -22529, -28926, -31746, -28926, +-22018, -13055, -5376, 256, 3840, 5120, 4095, 1026, -1538, -4350, -7682, -10239, -11520, -11520, -10241, -7678, +-3587, 771, 5118, 8449, 9472, 9727, 9473, 9727, 9986, 11006, 12801, 14079, 16128, 17154, 18173, 17923, +16382, 13312, 9218, 3581, -3325, -11778, -20735, -28160, -31489, -30718, -25347, -16637, -7938, -1023, 2816, 4607, +3841, 1792, -513, -3582, -6658, -9215, -11264, -12033, -11262, -8706, -4862, -2, 3841, 7424, 10240, 10496, +10240, 10496, 10751, 11266, 12798, 13826, 15359, 16896, 18175, 18178, 17150, 14594, 11007, 5376, -1280, -9216, +-17920, -26368, -31743, -32002, -27902, -19969, -10240, -2816, 1537, 3581, 3588, 2301, 257, -2304, -4864, -7937, +-10494, -11778, -11519, -9728, -6401, -1535, 2816, 6911, 9730, 9981, 9219, 9726, 10753, 11776, 12543, 13569, +14847, 16130, 17149, 17667, 17405, 15363, 12030, 7169, 1023, -6910, -15363, -24316, -30468, -31998, -28415, -21506, +-13566, -5890, -256, 3074, 3838, 3074, 1278, -767, -3841, -6910, -9474, -11519, -11776, -9985, -6654, -2562, +1537, 5376, 8191, 9730, 10238, 10241, 10752, 11264, 12799, 13570, 14333, 15619, 16894, 17409, 17664, 16383, +13057, 8447, 2305, -4608, -13056, -21504, -28416, -32000, -30465, -24574, -16386, -8190, -1794, 2305, 4095, 3841, +2304, -1, -3070, -6659, -9469, -11266, -11518, -10497, -7681, -4094, 254, 4866, 8191, 10240, 10495, 10243, +11004, 11268, 12029, 12801, 13568, 14848, 16639, 17667, 17660, 16388, 13820, 9731, 4094, -2559, -10752, -19712, +-27392, -31745, -31743, -26624, -18945, -10750, -3074, 2050, 3837, 3588, 2556, 516, -2307, -5119, -7936, -10240, +-11521, -10750, -8195, -4604, -259, 3841, 6912, 9727, 10753, 10497, 10237, 11013, 12025, 12295, 13050, 14597, +16124, 17155, 17662, 16897, 14592, 10751, 5121, -1281, -8958, -17411, -25596, -31236, -32253, -28163, -20477, -12546, +-4862, 510, 3329, 3839, 3074, 1022, -1534, -4610, -7423, -9471, -10755, -10748, -8964, -5373, -1281, 2815, +6145, 8448, 9471, 10242, 11005, 11523, 11518, 12289, 13312, 14079, 15362, 16381, 16899, 16126, 14593, 11520, +6911, 512, -6911, -14848, -23041, -29183, -31490, -29694, -23552, -14593, -6144, 0, 3584, 4097, 2814, 1537, +-512, -3328, -6400, -8960, -10497, -10494, -8962, -6143, -2559, 1533, 5892, 8957, 10241, 9728, 9472, 10240, +11520, 12544, 12800, 13569, 15102, 16386, 16894, 16898, 15103, 11776, 7681, 1790, -5118, -13314, -21758, -28928, +-32002, -29950, -23554, -15358, -7426, -1278, 2815, 4095, 3330, 1534, -255, -3071, -5890, -8190, -10498, -10749, +-9731, -6910, -2561, 1793, 5631, 8194, 9213, 9219, 9726, 10753, 11264, 12032, 13056, 13824, 15104, 16128, +16640, 16641, 15358, 12546, 8702, 2818, -4353, -12545, -20990, -27907, -30972, -29699, -24575, -17408, -9217, -2302, +2046, 3330, 3326, 2305, 511, -2046, -5123, -7932, -9989, -10747, -9732, -6654, -3073, 257, 4095, 7169, +9471, 10753, 10495, 10753, 11775, 12545, 12800, 12800, 14079, 15617, 16640, 16639, 15618, 13565, 9219, 3326, +-3071, -10753, -19200, -26367, -31233, -30974, -26115, -18430, -10497, -3583, 1024, 3327, 3841, 2559, 769, -1793, +-4607, -7681, -9472, -10495, -9986, -8189, -4610, -257, 4099, 7421, 9730, 10240, 10494, 11011, 12029, 12034, +12286, 13058, 14335, 15360, 16384, 16640, 15616, 13569, 10237, 4868, -1539, -9470, -18177, -26112, -30976, -31487, +-27393, -19968, -11519, -4098, 1283, 3324, 3333, 2810, 1029, -1282, -4097, -6909, -9476, -11005, -10753, -8448, +-4864, -512, 3584, 7424, 9473, 10750, 10754, 10495, 10751, 12291, 12796, 13316, 14077, 15362, 15871, 16384, +16129, 14334, 10755, 5629, -1022, -8449, -16895, -24833, -30719, -32001, -28159, -20993, -12287, -5120, 0, 2303, +3073, 3071, 1794, -257, -3585, -6655, -9217, -10751, -10496, -8705, -5375, -1024, 3327, 7425, 9727, 9985, +9984, 10495, 11778, 12285, 12547, 12798, 13570, 14590, 15873, 16384, 16128, 14337, 11261, 6659, 255, -7425, +-15870, -24323, -29949, -31490, -28415, -22530, -14588, -6917, -764, 2558, 3841, 3839, 2050, -3, -3325, -6401, +-8961, -10751, -10751, -8706, -5374, -1281, 2560, 5632, 8960, 10496, 11008, 11265, 11262, 12034, 11774, 12546, +13310, 14339, 15612, 16900, 16380, 15108, 12029, 7170, 766, -6142, -14338, -22270, -29186, -31743, -29695, -23554, +-15614, -7939, -1789, 1790, 3842, 3838, 2305, -1, -2559, -5632, -8449, -10239, -10497, -8959, -6145, -2558, +1789, 5635, 8701, 10499, 11006, 11009, 11264, 12030, 12292, 12284, 13058, 14079, 15361, 16383, 16386, 15101, +12034, 7935, 2048, -4863, -13313, -21504, -28671, -32002, -30717, -24835, -16894, -8192, -1538, 2051, 3581, 3587, +2814, 257, -2561, -5631, -8192, -9985, -10495, -9473, -6911, -3072, 1023, 5376, 8449, 10239, 10754, 10749, +11011, 11774, 12290, 12030, 13058, 14334, 15618, 16382, 16130, 15102, 12803, 8700, 3075, -3586, -11519, -20223, +-27649, -31744, -31232, -25600, -17664, -9471, -2561, 1536, 3585, 3582, 2562, 511, -1792, -4863, -7425, -9728, +-10496, -9984, -7679, -3585, 512, 5120, 8192, 9728, 10497, 10750, 11010, 11519, 12288, 12544, 13313, 14334, +15618, 16383, 16384, 15360, 13313, 9214, 3841, -2816, -11008, -19456, -26879, -31490, -31230, -26113, -18688, -10495, +-3841, 257, 2559, 3329, 2559, 1025, -1025, -4095, -7169, -9727, -10754, -9981, -7171, -3838, 255, 4352, +7168, 8960, 10241, 10750, 11779, 12028, 12548, 12541, 13058, 13566, 14851, 15869, 16386, 15615, 13568, 9729, +4350, -2045, -9988, -17915, -25093, -30205, -31233, -27136, -20480, -11776, -4608, 0, 2560, 3584, 3327, 1794, +-770, -4095, -7168, -9473, -10495, -10240, -7681, -4862, -1026, 3073, 7167, 9474, 10749, 10756, 11260, 12035, +12542, 12289, 12543, 13057, 14592, 15872, 16384, 15871, 14081, 10496, 5376, -512, -7937, -16639, -24576, -30464, +-32000, -28417, -21247, -12800, -5377, 2, 2557, 3843, 3582, 1537, -768, -3585, -6910, -9218, -10238, -10497, +-8960, -5375, -1025, 3329, 7167, 9217, 10239, 10753, 11008, 11775, 12033, 12032, 12799, 13826, 14846, 16129, +16897, 16126, 14337, 11264, 6399, 2, -7425, -15873, -24318, -29955, -31741, -28930, -22526, -14082, -6143, 0, +2814, 3843, 3326, 1793, -768, -3586, -6142, -8961, -10751, -10497, -8703, -5633, -1279, 2303, 6401, 9471, +10753, 10496, 10239, 11266, 11774, 12033, 12544, 13568, 15103, 15874, 16637, 16131, 14591, 11518, 7172, 764, +-6398, -14591, -23043, -29693, -32001, -29441, -23294, -14851, -6908, -772, 2564, 3836, 3331, 2047, -256, -3327, +-6146, -8446, -10242, -10493, -9476, -6396, -2052, 2052, 6141, 8705, 10240, 10751, 10753, 11008, 11775, 12290, +12798, 13568, 14849, 16127, 16642, 16126, 14849, 12032, 7423, 1538, -5891, -13820, -22020, -28668, -32003, -29951, +-23551, -15363, -7676, -1540, 1540, 3069, 3073, 2304, -1, -2558, -5634, -8190, -10242, -10495, -8961, -6143, +-2560, 1536, 5632, 8446, 9731, 10238, 10242, 11006, 12289, 12543, 12546, 13054, 14081, 15616, 16383, 16386, +15101, 12290, 7935, 2049, -4608, -12801, -20992, -27903, -31746, -29949, -24322, -16896, -8959, -2817, 1025, 3839, +3841, 2559, 1, -2048, -5121, -7678, -9475, -10237, -9474, -6911, -3072, 1023, 4865, 7424, 9215, 10241, +11008, 11775, 11522, 12285, 12547, 13310, 14338, 15614, 16386, 16381, 15108, 12540, 8708, 2813, -4095, -11775, +-19459, -26619, -30981, -30972, -26626, -18432, -9728, -3071, 1023, 3585, 4095, 2560, 513, -2049, -4864, -7679, +-9730, -10493, -9219, -6911, -3583, 254, 4355, 7933, 9986, 10238, 10753, 11265, 11774, 11779, 12796, 13316, +14076, 15620, 16124, 16132, 15613, 12802, 8703, 2816, -3584, -11263, -19458, -27133, -31491, -30974, -26112, -18434, +-9469, -2819, 1282, 3840, 3838, 2563, 509, -1790, -4865, -7680, -9727, -10241, -9728, -7167, -3842, 258, +4607, 8192, 10241, 10750, 10497, 11009, 11774, 11779, 12540, 13316, 14333, 15618, 16383, 16640, 15361, 12799, +8704, 3329, -3073, -11008, -19967, -27394, -31997, -31235, -25855, -18175, -9474, -2302, 1534, 3586, 4094, 2563, +508, -1789, -4865, -7680, -9471, -10754, -10494, -7937, -3840, 769, 5117, 8197, 9979, 10243, 9726, 10753, +12545, 12542, 12546, 12797, 14084, 15612, 16388, 16380, 15363, 13055, 9472, 4097, -3330, -11775, -20224, -27647, +-31745, -30976, -25600, -17920, -10239, -2817, 2048, 4609, 4095, 2818, 509, -1789, -4866, -8191, -10752, -11521, +-10495, -7424, -3329, 769, 4864, 7679, 9473, 10752, 11007, 10498, 10749, 11780, 12284, 13315, 14334, 15617, +16384, 16639, 16129, 13567, 9473, 3072, -3841, -11519, -19712, -27393, -31742, -31746, -26623, -17919, -8962, -1791, +2816, 4095, 3842, 2558, 513, -2561, -5630, -8450, -10239, -11008, -9985, -7422, -3842, 257, 4608, 8447, +10241, 10239, 10497, 10239, 11008, 12033, 12543, 13313, 14591, 16128, 16897, 17151, 16129, 13311, 8961, 3583, +-3327, -11265, -20223, -27648, -32002, -31740, -26117, -17916, -9474, -1792, 2562, 4349, 3842, 2814, 515, -2307, +-5885, -8451, -10494, -11265, -10239, -7681, -3583, 511, 4865, 7935, 9730, 10237, 9987, 10749, 11011, 12031, +12287, 13057, 14592, 16383, 17411, 17148, 16130, 13313, 9213, 3332, -3587, -11263, -19968, -27392, -32000, -31231, +-26114, -18174, -9473, -2047, 2816, 4863, 4353, 2303, 2, -3075, -5628, -8452, -10493, -11266, -9983, -7681, +-3838, 254, 4353, 7935, 9985, 10239, 10498, 10494, 10752, 11265, 12287, 13569, 15104, 16383, 16897, 17408, +16382, 13572, 9467, 3845, -3076, -11261, -19970, -27391, -31744, -31233, -26366, -18435, -9212, -1795, 2561, 3841, +3581, 1796, -3, -2559, -5375, -8194, -10493, -11011, -10494, -7937, -3839, 256, 4351, 7681, 9983, 10241, +9728, 9983, 11009, 12287, 13057, 13568, 14847, 16385, 16895, 16897, 16128, 13823, 9730, 3837, -3069, -11011, +-19453, -27395, -31996, -31237, -25596, -17410, -9727, -3073, 1537, 3327, 3585, 2304, 510, -2301, -5379, -8445, +-10243, -11261, -10243, -7933, -4099, 2, 4352, 7422, 8708, 9211, 10500, 11006, 12288, 12801, 12800, 13055, +14338, 15869, 17154, 17407, 16130, 14078, 9985, 4351, -2304, -10239, -18945, -26367, -30721, -30976, -26623, -19202, +-11517, -3842, 1280, 4097, 4351, 2816, 2, -2307, -5117, -7683, -9726, -10753, -10495, -8193, -4607, -513, +3073, 6399, 9217, 10751, 11009, 11008, 11519, 11777, 12543, 13570, 14589, 15620, 16635, 16644, 15870, 14081, +10239, 5121, -1282, -8701, -16899, -25086, -30977, -31743, -28161, -20736, -11775, -4098, 1027, 3326, 3583, 2563, +1021, -1021, -4099, -6654, -9474, -10749, -10754, -8959, -5889, -1536, 3329, 7167, 9729, 10495, 9985, 9983, +11009, 12031, 12802, 13052, 13829, 15099, 16133, 16381, 16128, 14337, 10750, 6659, 254, -7167, -15874, -24574, +-30465, -31488, -27903, -21506, -13566, -5889, -1, 3586, 4351, 3072, 1025, -1026, -4095, -7167, -9218, -11006, +-11009, -9217, -5630, -1282, 2817, 6400, 8960, 10752, 10752, 10495, 10242, 10750, 12034, 12799, 13824, 15105, +16638, 17154, 16639, 14848, 11777, 6655, 256, -6655, -14850, -22782, -29185, -31999, -29185, -22271, -13570, -5885, +-3, 2819, 3582, 2561, 766, -1277, -4100, -6907, -9221, -10237, -10498, -8703, -6143, -2563, 2052, 6652, +9219, 9983, 9728, 9985, 10494, 11266, 12287, 12800, 13825, 15615, 16383, 17155, 16893, 14850, 11776, 7422, +1539, -5123, -13566, -22272, -28674, -31229, -29187, -23038, -14593, -7168, -1280, 2561, 3070, 2307, 1020, -1020, +-3587, -6142, -8194, -9982, -10498, -9470, -6657, -2304, 1536, 5375, 8193, 9215, 9474, 10238, 10497, 11520, +12543, 13313, 13824, 15360, 16128, 16640, 16384, 15104, 12289, 8447, 2303, -4862, -12802, -20989, -27395, -30462, +-29187, -23805, -16130, -8191, -2048, 1280, 3071, 3328, 1794, -3, -2812, -5892, -8445, -10498, -11007, -9728, +-6401, -3070, 1021, 4867, 7934, 9728, 10242, 10237, 11012, 11515, 11781, 12283, 13573, 14588, 15619, 16382, +16897, 15871, 13057, 8448, 2816, -3840, -12033, -19967, -26880, -30464, -29440, -24832, -17409, -9214, -1794, 1794, +3070, 2817, 1792, 0, -2816, -5888, -8449, -10239, -10752, -9984, -7169, -3583, 255, 4098, 7166, 9472, +10754, 10494, 10498, 11775, 12799, 13057, 13569, 14846, 16386, 17407, 17407, 15875, 13565, 9473, 3328, -3328, +-11007, -19458, -27134, -31746, -31230, -25601, -18177, -10238, -3586, 1538, 3071, 3071, 2306, 253, -2556, -5635, +-8703, -10496, -11009, -10238, -7682, -4350, -2, 4610, 7934, 9474, 9982, 10754, 11006, 12034, 12542, 12802, +13566, 15105, 16129, 17406, 17409, 16129, 13822, 10243, 4605, -2302, -10497, -19200, -26623, -30977, -31487, -27393, +-19711, -11522, -4094, 1023, 3585, 3839, 2816, 512, -2047, -4865, -7679, -9729, -11007, -10496, -8193, -4863, +-513, 3073, 6912, 9215, 9985, 10239, 10753, 11263, 12033, 12543, 13313, 14591, 16130, 16636, 17156, 16637, +14595, 10749, 5378, -770, -8703, -16895, -24833, -30208, -30975, -27651, -21244, -13058, -5632, 1, 2559, 3073, +2559, 1024, -1023, -3840, -6912, -9473, -10752, -10495, -8704, -5376, -1024, 2303, 5889, 8704, 10240, 10752, +10495, 11010, 12285, 12804, 13307, 14084, 15101, 16131, 16894, 16384, 14593, 11517, 6661, 251, -6652, -14595, +-22782, -28674, -30973, -28420, -22012, -14083, -6910, -1537, 1536, 2560, 2817, 2046, -509, -3076, -6140, -8963, +-10238, -9985, -8959, -6402, -2813, 1276, 5381, 8187, 9476, 9725, 10498, 11263, 12288, 12545, 12798, 13826, +14847, 16128, 16384, 16641, 14846, 12290, 7935, 2304, -4608, -12800, -21504, -27648, -30207, -28674, -23807, -16383, +-9219, -2812, 1020, 2308, 2812, 1795, -2, -2559, -5120, -7937, -10239, -11009, -9982, -6914, -2815, 511, +4353, 7680, 9473, 9726, 10242, 11006, 11778, 12542, 12802, 14078, 15617, 16128, 16896, 16896, 16384, 13823, +9729, 3584, -3328, -11264, -20225, -27390, -30467, -29949, -25346, -18175, -10752, -4608, -2, 2052, 2044, 1539, +-1, -2816, -5888, -8448, -10752, -11008, -10239, -7682, -3582, 254, 4098, 7422, 9730, 10493, 11012, 11517, +12033, 13056, 14335, 14849, 16385, 17405, 18179, 18429, 17155, 14333, 10243, 4093, -2814, -11009, -19455, -27393, +-31487, -31490, -27133, -19971, -11517, -4867, -510, 1791, 2561, 1535, -256, -2815, -5890, -8189, -10244, -11003, +-10245, -7932, -4356, 4, 3582, 6913, 9727, 10240, 10497, 11776, 12287, 12801, 13567, 14849, 16384, 17407, +18177, 18175, 16897, 14592, 10752, 5375, -1279, -9728, -18177, -26366, -31491, -31485, -27906, -21246, -13315, -6141, +-770, 1793, 2047, 1793, 255, -2046, -4867, -7677, -9731, -11005, -10498, -8190, -5123, -1021, 3070, 6657, +9216, 10240, 11007, 11265, 11775, 13057, 13568, 14080, 15360, 16896, 17920, 18176, 17407, 15107, 11773, 6402, +-258, -8446, -17154, -25342, -30721, -32001, -28926, -22018, -14079, -7167, -1795, 1028, 2299, 2310, 762, -1531, +-4612, -7676, -9732, -11005, -10753, -9217, -5630, -1538, 2818, 6654, 9218, 9981, 10755, 12031, 12544, 12544, +13055, 13825, 15104, 16128, 17408, 18176, 17663, 15618, 12286, 6914, 254, -7166, -16130, -24573, -30213, -31738, +-28934, -23290, -15365, -7933, -2561, 511, 2563, 2812, 1028, -1027, -3583, -6655, -9217, -10751, -11010, -9213, +-6148, -2044, 2046, 5888, 8705, 10495, 10496, 11009, 12287, 13057, 12799, 13313, 14591, 15617, 16896, 17408, +17151, 15873, 12800, 7936, 1792, -5632, -14080, -22016, -28928, -31744, -29697, -24574, -17666, -10238, -3587, 260, +2043, 2821, 2301, 1, -2304, -5377, -8447, -10240, -10752, -9729, -6911, -3328, 768, 4608, 7936, 9983, +11011, 11261, 12034, 12544, 13054, 13059, 13822, 14848, 16130, 17404, 17412, 16126, 13568, 9217, 3326, -3583, +-11520, -19968, -27136, -31232, -30977, -26623, -19712, -12289, -5630, -3, 2562, 3329, 2300, 774, -2054, -5116, +-7682, -9471, -10497, -9727, -7680, -4096, -257, 3842, 7421, 9475, 10751, 11520, 11520, 11776, 12800, 13312, +13825, 15358, 16385, 17153, 17406, 16642, 14079, 10495, 4866, -1537, -9217, -17918, -25602, -31230, -32002, -28158, +-21251, -13308, -6916, -1533, 1279, 2303, 2305, 1280, -1025, -3839, -6401, -8959, -9985, -9727, -8450, -4862, +-1025, 3328, 7169, 8703, 9473, 10495, 11264, 12289, 13055, 13570, 13821, 14851, 15869, 16899, 17149, 16643, +14590, 11265, 6399, 1, -7681, -16127, -24321, -29695, -31233, -28159, -22529, -15616, -9214, -3844, 5, 1532, +2306, 1280, -257, -2559, -5376, -7936, -9729, -10239, -8449, -5374, -1538, 2050, 5116, 7173, 8956, 10499, +12030, 12289, 13055, 13570, 13821, 14340, 15356, 16388, 17148, 16899, 15614, 12801, 7937, 1534, -5886, -13827, +-21756, -27907, -31230, -29954, -24830, -17666, -11006, -4865, -512, 1793, 2814, 2050, -2, -2301, -5379, -7934, +-9728, -9730, -8445, -6147, -3070, 511, 4097, 7423, 9472, 10497, 11262, 12290, 12799, 13055, 13315, 14077, +15362, 16382, 17154, 17150, 15619, 12796, 8708, 3069, -3582, -11265, -19713, -26877, -30980, -30715, -26885, -19965, +-12288, -5634, -766, 1279, 2303, 1796, 250, -1786, -4357, -6908, -8707, -9982, -9474, -7422, -4353, -256, +3584, 7168, 9727, 10498, 11006, 11521, 12544, 13056, 13567, 14082, 15614, 16641, 17408, 17408, 16383, 14082, +9981, 4867, -1282, -9470, -18178, -25855, -31233, -31743, -28160, -21505, -14334, -7683, -2813, 510, 2304, 2050, +766, -1023, -3840, -6144, -8704, -9984, -9984, -8448, -5119, -770, 3074, 6910, 8962, 9983, 10752, 11776, +12800, 13056, 13568, 14081, 15102, 16130, 16894, 17410, 16639, 14848, 12032, 6655, 3, -7684, -16380, -24579, +-29951, -30975, -28674, -23550, -16385, -9473, -3837, -260, 1539, 2046, 1282, -257, -2816, -5889, -8702, -10241, +-10495, -8449, -5121, -1533, 1789, 5122, 8191, 10240, 11520, 12288, 13055, 13570, 13822, 14082, 14590, 15105, +16640, 17408, 17152, 15872, 12543, 7170, 767, -5888, -13568, -21761, -28414, -31490, -30462, -25346, -18431, -11264, +-5377, -1022, 1533, 3075, 2302, 513, -2304, -5376, -7937, -9214, -9474, -8702, -6658, -3327, 512, 4608, +7424, 9984, 11007, 12290, 13565, 13571, 13055, 13311, 14081, 15104, 16638, 17156, 16892, 15618, 13056, 8959, +3329, -3584, -12032, -19969, -27391, -30976, -30465, -26878, -20739, -13822, -6912, -1537, 1537, 3071, 2560, 1281, +-1280, -4097, -6911, -8961, -9983, -8960, -6913, -3839, -1, 3328, 6658, 9725, 11523, 12285, 12803, 13053, +12803, 13054, 13569, 14848, 15872, 16640, 17152, 16384, 13824, 9984, 4352, -2047, -9474, -17662, -25346, -30719, +-31743, -28674, -22270, -14594, -7678, -2305, 768, 2560, 2305, 1278, -765, -3844, -6396, -8450, -9472, -9215, +-7682, -5117, -771, 3074, 6912, 9470, 10499, 11261, 12035, 12798, 13312, 13568, 13825, 14591, 16130, 16892, +17412, 16637, 14594, 11007, 6144, 0, -7680, -16384, -24576, -30463, -31746, -29183, -23808, -16897, -9982, -3842, +1, 2048, 2559, 1793, -1, -2558, -5634, -8191, -9729, -9727, -8192, -5120, -1281, 2305, 5887, 8449, +10240, 11519, 12033, 12799, 13313, 13312, 13568, 14336, 15359, 16385, 17153, 16895, 15104, 12288, 7168, 768, +-6399, -14594, -22526, -28930, -31486, -29954, -25342, -18434, -11007, -5120, -768, 1792, 2560, 2048, 0, -2304, +-5120, -7680, -8960, -9215, -7938, -5887, -2560, 1024, 4608, 7680, 9728, 10752, 12288, 12800, 13055, 13314, +13822, 14338, 15358, 16642, 17150, 17153, 15361, 12286, 7938, 2303, -4352, -12287, -20737, -27649, -30974, -30465, +-26879, -20737, -13312, -6399, -1538, 1284, 2810, 2311, 762, -1276, -3842, -6144, -8191, -8961, -8447, -6145, +-3071, 255, 3585, 6911, 9729, 11519, 12289, 12800, 12799, 12802, 13054, 13826, 14590, 15873, 16384, 16384, +15617, 13054, 9474, 3583, -2817, -10237, -18179, -25598, -30720, -32002, -28413, -22018, -14592, -8190, -2563, 515, +2302, 2560, 1793, -257, -2815, -5633, -7679, -8961, -8447, -6657, -4351, -770, 3075, 6653, 8963, 11006, +12544, 13057, 13311, 13313, 13055, 13570, 14077, 15108, 16124, 16131, 15871, 13311, 9730, 4606, -766, -7938, +-16639, -25088, -29952, -31488, -29441, -24062, -17410, -10238, -4099, 259, 2813, 3331, 2813, 514, -2049, -4608, +-6912, -8448, -8959, -7426, -4350, -770, 2050, 5887, 9216, 11265, 11774, 12547, 13053, 12802, 12543, 12289, +13567, 14850, 15868, 16389, 15868, 14339, 11262, 6401, -1, -6910, -14850, -23294, -29186, -31487, -30208, -25601, +-18687, -11521, -4607, 0, 2559, 3072, 2816, 1024, -1279, -4354, -7166, -8706, -8702, -7426, -4863, -1536, +1791, 5378, 8958, 11266, 12542, 12802, 12798, 12802, 12799, 12800, 13057, 14335, 15361, 16127, 16385, 14591, +11009, 6400, 766, -5884, -13829, -22011, -28676, -31998, -30720, -25858, -18685, -11523, -4862, -512, 2558, 3586, +3070, 1026, -1793, -4351, -6402, -8446, -8961, -8192, -5887, -2305, 1792, 5377, 8447, 10241, 11776, 12542, +13314, 12800, 12543, 12290, 13053, 14338, 15616, 16127, 15873, 14591, 11777, 7423, 1793, -5376, -13825, -21758, +-27907, -31229, -30722, -26111, -19712, -12289, -5630, -258, 2561, 3584, 3071, 1281, -1024, -3841, -6399, -8448, +-8962, -7933, -5634, -2304, 1281, 5119, 7937, 10495, 11777, 12543, 13057, 13056, 12798, 12804, 13308, 14084, +15100, 16131, 16126, 14850, 12286, 7938, 2302, -4606, -12546, -20735, -27648, -31744, -31745, -27134, -19970, -12287, +-5632, -513, 2305, 3328, 3071, 1025, -1281, -4094, -6915, -8702, -9216, -8450, -5884, -2565, 1028, 5118, +8192, 9986, 11261, 12035, 12542, 13057, 13056, 12800, 13311, 14081, 15616, 16383, 16386, 15101, 12547, 8446, +2817, -4097, -12031, -20481, -27391, -30977, -30976, -27135, -20738, -13822, -6914, -1278, 1790, 3330, 3070, 1538, +-769, -3329, -6142, -8449, -9216, -8448, -6400, -2817, 3, 3581, 6914, 9981, 11523, 12286, 12802, 12799, +12799, 12545, 13312, 14335, 15362, 16382, 16385, 15616, 13056, 8960, 3072, -3072, -10496, -18432, -25856, -30720, +-32000, -28159, -21762, -14334, -7426, -1535, 1536, 3072, 3073, 1790, -511, -3072, -5889, -7677, -8707, -8447, +-7167, -4611, -508, 3325, 7170, 9470, 11522, 12029, 12036, 12796, 13060, 13052, 13059, 13823, 15359, 16387, +16380, 15364, 12797, 9474, 4863, -1280, -9216, -17664, -25599, -30722, -32254, -28931, -22268, -15108, -7932, -2308, +1027, 2815, 3071, 1794, -2, -2302, -4865, -7168, -8961, -9214, -7683, -4604, -772, 3075, 6654, 9217, +10752, 11775, 12290, 12541, 12548, 12540, 13059, 13822, 14594, 15101, 15620, 15099, 13317, 10492, 5635, -770, +-8447, -16641, -24063, -29185, -30718, -28163, -22780, -15877, -8699, -3076, 515, 2558, 3073, 2816, 1024, -2048, +-5121, -7423, -8705, -8703, -6912, -4353, -1024, 2817, 5886, 8451, 9981, 11267, 12285, 12802, 12544, 12286, +12548, 12540, 13826, 15104, 15615, 15105, 13312, 10495, 5633, -256, -7169, -15103, -22273, -27903, -30721, -28926, +-23555, -17149, -10499, -4094, 256, 2815, 3841, 2816, 1022, -1532, -4612, -6909, -8449, -8704, -7168, -4608, +-1536, 2049, 5631, 8192, 10752, 12287, 12547, 12029, 12290, 11775, 11775, 12290, 13566, 14850, 15614, 15361, +13823, 10754, 6141, 259, -6403, -13822, -21504, -27904, -31233, -29951, -25089, -17663, -10496, -3585, 769, 3583, +4097, 3327, 1281, -1281, -4351, -6913, -8191, -8449, -7935, -5633, -2047, 1792, 5886, 9219, 11005, 11779, +12030, 11521, 11519, 11521, 12032, 12543, 13570, 14845, 15620, 15100, 13828, 11004, 6659, 1022, -5887, -13568, +-21759, -28674, -31999, -30209, -25087, -17920, -10240, -3585, 769, 3071, 3841, 3327, 1537, -1025, -3838, -6659, +-8958, -9217, -8191, -5633, -1790, 2300, 5637, 8698, 11015, 11770, 12036, 12285, 12034, 11519, 11776, 12289, +13566, 14595, 15357, 15362, 14335, 11520, 6656, 1025, -5890, -13565, -21764, -28668, -32004, -30460, -25603, -18687, +-11007, -3842, 1283, 3837, 4610, 3839, 2048, -1023, -4354, -6909, -8450, -8960, -8191, -5635, -1787, 2044, +5634, 8447, 10752, 12033, 12543, 12032, 11776, 11521, 11519, 12032, 13568, 14848, 15617, 15359, 13824, 11264, +6912, 769, -5890, -13309, -21252, -28155, -31493, -31229, -26369, -18944, -11006, -3843, 1026, 4094, 4611, 3325, +1539, -514, -3584, -6143, -7681, -8448, -7935, -5889, -2560, 1025, 4862, 8706, 11263, 12544, 12801, 12030, +11522, 11519, 11776, 12289, 13054, 14338, 15102, 14850, 13567, 11264, 7168, 1537, -5123, -12795, -20741, -27900, +-32002, -31744, -26880, -19455, -11009, -3839, 767, 3841, 4607, 3841, 2047, 1, -3073, -5886, -7938, -8703, +-7936, -6145, -3070, 510, 4866, 8702, 11265, 11776, 12031, 12289, 12289, 12029, 12035, 12286, 13057, 14080, +14848, 15104, 14080, 11520, 7680, 2304, -4096, -12031, -20482, -27902, -31745, -31232, -26880, -20479, -12290, -4861, +-3, 3074, 4351, 4096, 2817, -1, -3071, -5889, -7936, -9215, -8961, -6399, -2561, 1281, 4607, 7425, +10239, 11521, 12031, 12546, 12797, 12547, 12286, 12033, 13056, 14079, 15105, 15359, 14082, 12030, 8450, 2557, +-4093, -11779, -19708, -26372, -30717, -30978, -27135, -20736, -13568, -6656, -1024, 2816, 4352, 4352, 2305, 254, +-2814, -5634, -8190, -9218, -8190, -5634, -3070, -2, 3841, 7168, 9984, 11777, 12543, 13311, 13058, 12542, +12034, 12287, 13056, 13824, 14848, 15616, 14847, 12547, 8444, 2820, -3075, -10751, -18687, -26114, -30461, -31491, +-28413, -22531, -14078, -6657, -512, 2818, 4092, 4356, 2557, 2, -3072, -5890, -7678, -8193, -8447, -6657, +-3328, 1, 3582, 7427, 10237, 11523, 12540, 12804, 12541, 12547, 12286, 12288, 13057, 14335, 15617, 15615, +14336, 12290, 8958, 3841, -2561, -9984, -18175, -25600, -30977, -32255, -28929, -22272, -14335, -6913, -767, 2558, +4099, 3836, 2052, -2, -2560, -5630, -7939, -8959, -8447, -6657, -3839, 0, 3838, 7426, 10495, 11777, +12032, 12287, 12544, 12033, 12031, 12545, 13311, 14337, 15103, 15106, 14846, 12545, 8704, 3840, -2560, -9983, +-18178, -26110, -30977, -31488, -27648, -20479, -13058, -6142, -513, 2560, 3329, 3327, 2303, 2, -3073, -5888, +-7935, -8962, -8958, -6913, -3328, 513, 4607, 7680, 9217, 10751, 11777, 12287, 12288, 12544, 12545, 12543, +13057, 14079, 15105, 15615, 14593, 12543, 8961, 3840, -2817, -10495, -18945, -25855, -30209, -30975, -27394, -20477, +-13315, -6654, -1025, 2560, 4097, 3583, 2048, -255, -3074, -5885, -8195, -9470, -8961, -6144, -2559, 255, +3585, 6911, 9729, 11263, 12033, 12287, 12289, 12031, 12032, 12290, 13053, 14082, 15359, 15359, 14852, 12795, +8965, 3067, -3325, -9984, -18178, -25597, -30723, -31742, -27649, -20480, -12799, -6145, 0, 3073, 4350, 3586, +2303, -256, -3328, -6400, -8448, -9217, -8702, -6914, -3838, -1, 4351, 7426, 9470, 11522, 12287, 12032, +11776, 12544, 12288, 12288, 13313, 14334, 15618, 16127, 14848, 12545, 8447, 3328, -2559, -10497, -18943, -25857, +-30719, -32001, -28160, -20735, -12290, -5117, 253, 3842, 4862, 3585, 1537, -1026, -3838, -6402, -8448, -9470, +-8962, -6654, -3074, 1, 3839, 7682, 9982, 11010, 12031, 12031, 11265, 11776, 12032, 12544, 13824, 15103, +15618, 15870, 15105, 12544, 8703, 3330, -3074, -10239, -18432, -26113, -31231, -31743, -28163, -20732, -12036, -4605, +255, 3583, 4354, 3582, 1794, -513, -3328, -6400, -8448, -9216, -8703, -7169, -3841, 259, 4348, 7684, +9981, 10753, 10752, 11777, 12030, 11778, 11775, 12288, 13312, 14592, 15616, 15873, 15103, 12544, 9216, 3840, +-2559, -10242, -18430, -26369, -30976, -30975, -26882, -20222, -12033, -5376, -255, 2815, 4096, 3841, 1791, -256, +-3072, -5888, -8191, -9473, -9215, -7170, -3838, 255, 3840, 7169, 9215, 10753, 11519, 12032, 12032, 12032, +11777, 12030, 13058, 14334, 15105, 15360, 14847, 13058, 9214, 4097, -2560, -9985, -18175, -25600, -30465, -30974, +-27138, -20479, -13057, -5886, -3, 3332, 4348, 4099, 2814, 1, -3072, -6400, -8704, -9729, -9215, -7168, +-4097, 2, 4094, 7170, 9214, 11265, 12032, 11775, 12035, 11772, 11780, 11517, 12545, 14080, 15361, 16126, +15107, 12797, 9218, 4095, -2560, -10239, -17921, -25344, -30207, -31234, -27901, -20740, -12539, -5637, 4, 3582, +4864, 4097, 2303, 0, -3327, -6145, -8448, -9472, -8959, -7170, -4094, -513, 3072, 6913, 9982, 10754, +11519, 12032, 12032, 11519, 11522, 11774, 12546, 13565, 14595, 15358, 15105, 12800, 9216, 4607, -1278, -8450, +-16127, -24319, -30210, -31486, -28162, -22014, -14338, -6910, -1025, 3072, 4609, 4861, 3331, 767, -2560, -5375, +-7683, -8957, -8962, -7934, -5122, -1022, 2813, 5891, 8703, 11519, 12290, 12029, 11778, 11776, 11519, 11266, +11773, 13314, 14848, 15359, 14849, 13055, 9729, 5632, 0, -7425, -15103, -22529, -28926, -32002, -29183, -23040, +-15360, -7681, -1791, 2047, 4609, 4608, 3071, 769, -1793, -4864, -7167, -9217, -9727, -8192, -5378, -1789, +2558, 6657, 9472, 10752, 11007, 11267, 11516, 11268, 11260, 11780, 12541, 13570, 14590, 15106, 15102, 13570, +11007, 6655, 514, -6402, -14334, -22530, -28926, -31234, -29183, -23551, -16387, -8444, -2308, 1283, 3070, 3841, +3072, 1535, -1022, -4611, -7676, -9220, -9213, -7938, -4863, -1280, 2303, 5378, 8189, 10499, 11006, 11265, +11776, 12543, 12289, 12287, 12546, 13054, 14081, 15103, 15105, 13823, 11265, 6655, 1025, -5889, -13055, -20994, +-27390, -30977, -29952, -24575, -17410, -10494, -4610, 2, 3327, 4096, 4096, 2047, -766, -3841, -6400, -8192, +-8960, -7680, -5631, -2817, 1025, 5375, 7936, 9218, 11261, 12547, 12542, 12544, 12034, 11517, 11778, 13312, +14591, 15361, 15104, 14078, 11523, 7421, 2050, -4097, -12287, -20482, -26877, -30212, -30461, -26370, -19197, -11779, +-4862, 255, 3584, 4353, 3327, 1537, -769, -3583, -6145, -8191, -8960, -8449, -5630, -2307, 515, 4094, +7681, 10240, 11264, 11775, 12034, 11517, 11523, 12030, 12545, 13312, 14591, 15106, 15358, 14337, 12032, 8191, +2307, -3845, -11002, -19206, -26618, -30981, -30973, -26625, -19713, -11773, -5124, -509, 2559, 3839, 3586, 2045, +-253, -3075, -6140, -7940, -8701, -8194, -6399, -3327, 254, 4097, 7680, 9984, 11265, 11517, 12036, 12027, +11782, 11514, 12293, 13052, 14083, 14846, 15105, 14336, 11775, 8193, 3071, -2814, -10243, -18429, -25858, -30463, +-30464, -26625, -20478, -12802, -5630, -514, 2561, 3840, 3840, 2048, -1, -2814, -5122, -7423, -8704, -8450, +-6652, -3332, 3, 3326, 6656, 9474, 10493, 11011, 12030, 12545, 12544, 12030, 12291, 13310, 14337, 14848, +14847, 14081, 12288, 8959, 3842, -2307, -9724, -17668, -24829, -29698, -30207, -26879, -21250, -14590, -7427, -1532, +1789, 3330, 3582, 2817, 512, -2047, -5121, -7424, -8448, -8447, -6658, -4094, -513, 2561, 5888, 8958, +11522, 12543, 12544, 12546, 12541, 12035, 11773, 12802, 13823, 14593, 14848, 14590, 12547, 9213, 4354, -1536, +-8449, -15872, -23294, -29188, -31484, -29442, -23296, -16383, -8705, -2304, 2049, 3838, 4098, 3071, 769, -1537, +-4607, -7170, -8445, -8707, -7677, -5379, -1790, 2047, 6144, 9218, 11260, 12804, 12797, 12546, 12544, 12030, +12035, 12797, 13827, 14845, 15363, 14845, 13316, 10236, 5891, 254, -6399, -14591, -23042, -28925, -31492, -29948, +-24579, -17150, -10240, -4098, 515, 3581, 4098, 3327, 1025, -1025, -4095, -6658, -8445, -8962, -8190, -5635, +-2045, 1790, 5122, 8447, 10239, 12290, 13311, 13057, 12287, 12032, 12032, 12802, 13821, 14595, 15356, 15109, +13564, 11267, 7165, 1282, -5377, -13311, -20993, -27648, -30719, -30465, -26111, -18946, -11518, -5121, 1, 2815, +3840, 3329, 1791, -511, -3329, -6143, -8449, -8958, -8196, -5883, -2820, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -513, 1283, 1788, -1021, -1538, +-1024, 514, -1026, 1281, 6144, -5633, -4351, -2304, -9216, -7168, -4096, -3073, -7166, -5633, -4096, -3072, +-2817, 2050, 1278, -1534, 510, 1794, 510, 3841, 9217, 9214, 7938, 6398, 6401, 8961, 7167, 10752, +10497, 10750, 15363, 15357, 13571, 11517, 12803, 12030, 14081, 9471, 3073, 9983, 8449, 2047, -1024, -6655, +-3330, -3325, -4611, -7422, -7682, -6142, -6401, -7679, -12290, -11517, -15875, -15101, -17923, -16894, -16385, -20223, +-13313, -13568, -19200, -17920, -14336, -15104, -13824, -14593, -14590, -13314, -12287, -5888, -4096, -8961, -3838, -514, +-2559, -3584, -5121, -3583, 1, -515, -765, -2307, -2045, 3326, 1, -11777, -8448, -5119, -8449, -12287, +-13313, -11007, -10241, -9983, -8192, -5889, -11518, -15363, -11516, -8196, -5117, -5890, -7679, -3328, -513, -510, +-3074, -2814, 4605, 15874, 16640, 12288, 16128, 22016, 23550, 18436, 18684, 21251, 23551, 23551, 19201, 18944, +20479, 20226, 17918, 15105, 14591, 17153, 15360, 11008, 13824, 14335, 9730, 8701, 7429, 6138, 2565, -2307, +-1534, 510, -254, -2051, -4861, -7170, -1790, 766, -3327, -5377, -4095, -2816, -8961, -13054, -6659, -4348, +-7428, -7421, -7683, -6909, -5890, -6143, -6912, -6401, -5375, -5376, -6145, -6911, -2304, -3328, -11009, -12542, +-8450, -7422, -12545, -18945, -17406, -9217, -6656, -12544, -17408, -17407, -15618, -14846, -15874, -16639, -11774, -8452, +-9724, -11011, -10239, -8191, -6402, -2814, 510, 4610, 6910, 9474, 13054, 12289, 10239, 13569, 15616, 15359, +14593, 12799, 13056, 15105, 16127, 13569, 9215, 8193, 13310, 14594, 10496, 8702, 8963, 10748, 10500, 7421, +3330, 255, 2560, 6145, 4606, 259, 765, 1794, 1791, 3841, 3839, 2816, 4097, 5630, 3076, -1796, +-3327, 2050, 2812, -762, -2310, -764, -3, 259, -1283, -3069, -3586, -3583, -2049, -511, -2049, -4094, +-3586, -4863, -6144, -7937, -12286, -16130, -15871, -13056, -12033, -14591, -15872, -17409, -17663, -21249, -23807, -20480, +-18433, -17407, -17921, -18431, -17408, -14592, -15617, -15614, -11523, -6396, -2052, -1021, 510, 4098, 4350, 3842, +5630, 7681, 6145, 5118, 6659, 9468, 9219, 6399, 3840, 2561, 5887, 7680, 2816, 257, 3583, 6400, +4353, 510, -2557, -3587, -2047, -2815, -2307, -2555, -4357, -5884, -5636, -4092, -1539, -1533, -2820, -1276, +253, -2301, -5635, -6143, -2303, -1025, -4863, -8193, -3840, 1281, -1025, -6143, -7425, -3582, -3, -510, +-4609, -4864, -511, 1792, -258, -5373, -8708, -7676, -9219, -11518, -10497, -9472, -9728, -10496, -12289, -14078, +-17410, -18174, -15618, -13567, -13056, -14080, -14848, -13569, -11774, -11779, -12027, -8711, -3065, -518, -507, 765, +6657, 9473, 7934, 7682, 7935, 9473, 11263, 11521, 10494, 9987, 11773, 12035, 9214, 7681, 6655, 6145, +5887, 7937, 8703, 5634, 2813, 1283, 766, -768, -1534, -1282, -1535, -3584, -5889, -6143, -4609, -2815, +-1537, -3071, -3842, -3325, -3587, -3838, -6145, -6145, -6652, -6917, -6396, -3587, -4094, -7680, -9217, -6400, +-4095, -6145, -8702, -10243, -6398, -2305, -2560, -6142, -8963, -9214, -9473, -11520, -13567, -12545, -10752, -11263, +-13058, -13822, -15105, -16896, -17407, -16130, -15102, -13570, -13566, -13314, -13565, -13060, -12797, -9986, -6910, -4353, +-2560, -1280, 3327, 7939, 8700, 7428, 8957, 13058, 14334, 13826, 12030, 11779, 15101, 17155, 16636, 13828, +12541, 12290, 12031, 12544, 12801, 11519, 9729, 7935, 7168, 6657, 4351, 2561, 3071, 3073, -2, -3326, +-3073, 1024, 3072, 768, -1792, -512, 2049, 2302, -1534, -4609, -4096, -1535, -1281, -3072, -3583, -3074, +-4605, -5123, -4350, -5634, -7167, -8703, -7937, -5376, -3328, -4865, -7421, -8963, -8702, -9986, -13822, -14081, +-11263, -11010, -13054, -14594, -14078, -15617, -17920, -18943, -16130, -14846, -14338, -15358, -17410, -16125, -13827, -13311, +-12287, -9475, -7164, -5124, -2044, 1276, 3331, 4862, 7169, 10239, 13570, 13310, 11265, 12032, 14079, 16641, +17664, 16127, 15362, 15102, 14850, 14334, 14337, 12800, 13313, 12543, 10752, 9984, 9472, 9473, 7935, 6912, +4607, 1539, 1276, 3332, 5116, 3843, 2047, 3329, 6142, 6914, 4606, 2, -1, 2560, 3073, 510, +-1278, 254, 2305, 1025, -1026, -2558, -3586, -4606, -4354, -5118, -4354, -2558, -2562, -4862, -7426, -8702, +-9986, -11262, -11266, -11006, -11010, -11262, -12802, -13309, -14852, -17660, -17924, -15612, -13826, -16384, -16384, -16383, +-15106, -15100, -16389, -15356, -11522, -7680, -5374, -4611, -2813, -3, 2819, 5117, 7938, 10239, 10752, 11520, +11777, 14078, 14595, 13564, 14084, 14844, 15876, 14845, 13826, 13567, 13823, 12802, 9983, 8448, 10753, 12286, +10242, 6911, 5120, 4608, 3073, 2303, 1792, 1536, 1280, 2560, 4096, 4097, 4093, 1539, 767, 1280, +2304, 1024, -1025, -1022, 1022, 3074, 766, -1534, -2561, -2050, -4348, -6404, -6397, -4353, -2561, -4350, +-7170, -9215, -10241, -11774, -12803, -12796, -11524, -10493, -12035, -14333, -15363, -16636, -17412, -16893, -16386, -15872, +-16895, -17408, -16129, -15614, -16898, -18944, -16894, -12035, -8958, -8448, -7682, -5116, -772, 1539, 2813, 4099, +7165, 9732, 11260, 11523, 13310, 13568, 12801, 12544, 12543, 13825, 15103, 15616, 14849, 13567, 11265, 9728, +9983, 12033, 12031, 8450, 7166, 7682, 7422, 3841, 512, -256, 1280, 2304, 2304, 2559, 2562, 3583, +2047, 514, -2, 514, -514, -1791, -1536, -1, 2306, -3, -1277, -2562, -3839, -5120, -6401, -6399, +-5377, -5375, -7168, -8705, -10494, -12292, -14587, -15621, -14075, -12292, -13566, -15616, -16129, -16383, -17409, -18944, +-19967, -18945, -17151, -18689, -18431, -18177, -17663, -18945, -19454, -17666, -15102, -14082, -12798, -9730, -6141, -2308, +-1020, -515, 1025, 5121, 8189, 8707, 10750, 13057, 13568, 12543, 10241, 11774, 13827, 17917, 17155, 15869, +14850, 14079, 12288, 12289, 12798, 12290, 9982, 10242, 12287, 10240, 5632, 2304, 2304, 4865, 4094, 3074, +3071, 3584, 4865, 3326, 1794, 1279, 1792, 769, -1026, -510, 1278, 3074, 1790, 257, -255, -1795, +-3324, -5124, -5374, -4095, -5123, -6653, -8449, -11265, -13566, -15874, -16128, -14334, -14594, -15870, -16642, -17407, +-17153, -18175, -20736, -21505, -19198, -18691, -18685, -20227, -20477, -18946, -18943, -20225, -19200, -17919, -16641, -14079, +-11522, -7421, -4355, -3070, -2305, -767, 1790, 4867, 7420, 9989, 12539, 12292, 9981, 9986, 11775, 14081, +15358, 15618, 16640, 16894, 16643, 14332, 12548, 13053, 13314, 12287, 11775, 11778, 11262, 8449, 6401, 5630, +5378, 5119, 3584, 3072, 5633, 6911, 5377, 3071, 3329, 4094, 2051, 2301, 2562, 3327, 4864, 3328, +3073, 2559, 1536, -512, -2047, -2050, -1789, -1540, -4604, -7939, -9982, -12290, -14847, -16128, -15359, -16642, +-17918, -17922, -16894, -18177, -19968, -22016, -22015, -20737, -20479, -21762, -22014, -21762, -19965, -20740, -21244, -20739, +-19454, -18434, -17406, -14338, -9981, -5891, -4350, -4610, -3326, -513, 3584, 6144, 7680, 8448, 9729, 10750, +12033, 12288, 11008, 11008, 13311, 15874, 17405, 16643, 14846, 14849, 14080, 13823, 12545, 11519, 11777, 11776, +10750, 8707, 8445, 8707, 6396, 5637, 5115, 6916, 7422, 5887, 4867, 5886, 3328, 2561, 1790, 2562, +3839, 5120, 3840, 2816, 1793, 1534, 514, -3, 516, 765, -509, -3587, -4863, -7167, -9985, -13311, +-14848, -14850, -14845, -16642, -17664, -18174, -18946, -19455, -20223, -20995, -20476, -20483, -20991, -20992, -19456, -20480, +-21760, -22272, -19969, -19454, -20226, -19455, -16127, -12035, -8956, -7428, -6396, -4099, -1278, 1790, 3074, 4095, +6401, 8447, 9729, 10495, 10497, 10751, 10241, 12031, 14594, 14589, 15618, 15103, 16640, 16641, 14591, 13312, +13313, 12286, 12547, 11261, 10242, 9215, 8449, 7935, 6657, 6654, 7171, 7421, 6659, 5885, 4354, 3839, +2817, 1024, 2302, 4610, 5119, 3840, 3073, 2302, 1026, 2303, 1536, 2560, 1536, 1, -2306, -2813, +-5636, -8700, -12547, -14334, -14849, -15616, -18175, -19714, -20477, -19716, -19963, -21253, -21244, -20484, -21244, -22019, +-21245, -20483, -20222, -21249, -21248, -20478, -20483, -19197, -18434, -16639, -13824, -12544, -10496, -6913, -3071, -1280, +0, 512, 2816, 4863, 6401, 8191, 9217, 11264, 12543, 11521, 12031, 12288, 13058, 14077, 15362, 16639, +17153, 15616, 14335, 13314, 12796, 11269, 11004, 10754, 11009, 9981, 8450, 8192, 7679, 8705, 8448, 6911, +7170, 6654, 4865, 3072, 1536, 3072, 4352, 4864, 3584, 2048, 768, 2304, 2816, 2560, 2816, 3072, +2048, 1024, -1023, -3843, -6652, -8964, -11004, -13315, -15103, -17665, -19198, -19458, -20222, -20995, -21758, -20736, +-20737, -21759, -22785, -22784, -21503, -20481, -21504, -23807, -23042, -20989, -18435, -18173, -18179, -16894, -15104, -12800, +-9472, -5633, -2815, -1793, -766, 1278, 2817, 4096, 5888, 7167, 10242, 12542, 11522, 10494, 10753, 10496, +11265, 13055, 15104, 16639, 16130, 14847, 15104, 13313, 11774, 10242, 10751, 10751, 11011, 9469, 9217, 9217, +10493, 10245, 7930, 7685, 7421, 5634, 5119, 4352, 4352, 5376, 5377, 3838, 3586, 3071, 2303, 2051, +3068, 4100, 4604, 3587, 2303, 512, -767, -3586, -6398, -8449, -10496, -12800, -15103, -17410, -18174, -18945, +-20225, -20989, -19971, -19455, -20479, -21250, -20477, -19971, -20222, -20993, -22271, -21505, -20223, -18689, -17919, -17153, +-16383, -14849, -14335, -11520, -7681, -4863, -2817, -767, -1, 769, 767, 2816, 4609, 6654, 8963, 9213, +9218, 10239, 8704, 9217, 9470, 12290, 15103, 15104, 14080, 14080, 14592, 13313, 11007, 9983, 11522, 10750, +10499, 9469, 10753, 11264, 11008, 9472, 8448, 7935, 8194, 6399, 5631, 5634, 5117, 5380, 4861, 4098, +4350, 3073, 2305, 3326, 4867, 5885, 5122, 4351, 3072, 1537, -513, -2560, -4350, -6148, -9212, -12035, +-14590, -16897, -17408, -18687, -20226, -20477, -19460, -18940, -19714, -19712, -19712, -20224, -20480, -19455, -19457, -19968, +-18688, -17664, -16639, -15361, -14592, -14335, -13569, -10752, -6655, -4098, -2557, -1027, -766, -2, 259, 2045, +3843, 5884, 6660, 8189, 8194, 7935, 7680, 7424, 9473, 11773, 12805, 13819, 13572, 14333, 13826, 11263, +9985, 10239, 10496, 10753, 11262, 11523, 12285, 12290, 9983, 8959, 8963, 7933, 7938, 7424, 6910, 6146, +5630, 5123, 4605, 4354, 3327, 3584, 3841, 5118, 5634, 5631, 4865, 4351, 3328, 2048, 1, -1281, +-3072, -6399, -9730, -12285, -13827, -15358, -17665, -18944, -18943, -18690, -18941, -17667, -17918, -18945, -19457, -19453, +-18691, -18686, -18689, -18432, -17152, -15616, -14591, -14082, -13566, -13058, -11518, -8962, -6142, -3842, -2046, -1026, +-1021, -260, 260, 765, 2049, 3585, 6142, 7939, 6653, 6914, 6655, 6911, 8452, 9979, 12037, 13052, +13570, 13567, 12802, 10750, 9985, 9471, 9986, 11006, 11778, 12541, 12547, 11007, 10240, 9727, 8706, 8702, +8706, 7934, 7425, 6400, 5376, 4864, 5119, 3841, 4352, 4351, 4866, 5374, 5120, 4866, 4861, 4611, +3582, 2049, 512, -1280, -3841, -5631, -8192, -11009, -13565, -16132, -17405, -17922, -18175, -18432, -17920, -17920, +-17921, -17919, -19200, -18945, -17918, -17666, -17151, -16896, -15616, -14592, -14336, -12799, -12802, -12541, -10755, -8702, +-6401, -3840, -2559, -2817, -2047, -1026, 3, -4, 772, 2813, 4610, 5631, 6144, 6144, 5888, 5376, +6400, 8704, 9984, 11520, 12544, 12800, 11263, 9986, 8958, 9218, 9982, 11265, 12288, 12544, 11776, 11520, +10751, 9730, 9214, 8962, 8702, 8450, 7678, 6402, 5630, 4866, 4350, 5122, 5119, 5376, 5377, 5629, +5124, 5117, 5635, 5116, 3844, 2301, 1026, -1024, -2818, -4606, -7680, -10498, -13308, -15109, -16380, -17154, +-18175, -17921, -17151, -16641, -16895, -18176, -18689, -17919, -16641, -16638, -16386, -15614, -15106, -14590, -12802, -12029, +-11780, -11259, -10245, -8700, -6402, -4608, -3583, -2817, -2047, -1537, -1535, -1026, 2, 1279, 3327, 4099, +4860, 5124, 3837, 4097, 5632, 7424, 8704, 10240, 11264, 11264, 11009, 9726, 8962, 9214, 10242, 11519, +11777, 11775, 12032, 11521, 10750, 9987, 9213, 9218, 9471, 8959, 7939, 6653, 5377, 4865, 5374, 5378, +5887, 5119, 5379, 5885, 5634, 5886, 5122, 4607, 4097, 2815, 1535, 3, -2052, -4092, -6915, -9726, +-12289, -13824, -15360, -16384, -17408, -17664, -16384, -16127, -16641, -17152, -16896, -16128, -15872, -15360, -14848, -14336, +-14336, -12801, -11263, -10753, -10495, -10497, -9471, -7937, -6400, -4351, -3585, -3071, -2305, -1791, -2306, -2045, +-1027, 514, 1536, 2814, 4099, 3581, 2817, 3585, 4606, 5891, 7421, 8706, 9982, 10754, 9983, 9473, +8958, 9218, 9983, 10752, 11265, 11518, 11779, 11260, 10756, 10236, 9732, 9980, 9477, 9211, 7940, 6908, +6403, 5887, 5888, 5632, 5376, 5632, 5888, 6144, 5888, 5632, 5376, 5376, 4352, 3072, 1793, 254, +-1022, -3330, -6398, -8705, -11007, -13058, -14078, -15618, -16637, -16387, -15870, -15105, -15872, -16127, -15618, -15102, +-14849, -14079, -13570, -13566, -12546, -11262, -10242, -9982, -9986, -9726, -9474, -8703, -6401, -5374, -4354, -3327, +-3073, -3070, -3330, -3070, -2307, -1021, 510, 2562, 3582, 2561, 2560, 3072, 3840, 5119, 6146, 8190, +9730, 10494, 10241, 9984, 9471, 9474, 10237, 10755, 11518, 12033, 12287, 12289, 11263, 11009, 10240, 9983, +9985, 9471, 8449, 7423, 6401, 6399, 6401, 5887, 5632, 6145, 6143, 6145, 5887, 5632, 5888, 5633, +4607, 3585, 2303, 1023, -254, -2816, -4866, -7421, -9731, -11519, -13055, -14594, -15870, -15616, -14594, -14590, +-15106, -14590, -14593, -14336, -13311, -12802, -12542, -12290, -11262, -10241, -9471, -8961, -8960, -9472, -9472, -8191, +-6913, -5630, -5124, -4092, -3587, -3838, -4353, -3840, -3583, -2562, -254, 1278, 1793, 1792, 1792, 2047, +2818, 3582, 5122, 7166, 8962, 9726, 10242, 9727, 9472, 9473, 9983, 11008, 11521, 12031, 12544, 12545, +11775, 11009, 10495, 10497, 10495, 9985, 9216, 7679, 7169, 7167, 6657, 6400, 6399, 6401, 6399, 6144, +5889, 6143, 5888, 5634, 4860, 3845, 3067, 1797, 252, -1534, -3840, -6145, -8447, -10240, -11777, -13823, +-14848, -14337, -13823, -13825, -13567, -13569, -13824, -12799, -12290, -11773, -11524, -11260, -10243, -9470, -8449, -7936, +-8447, -9217, -9215, -8194, -7421, -6659, -5629, -4611, -4349, -4868, -4603, -4868, -5118, -3328, -1282, 259, +1022, 1025, 1024, 1279, 1537, 2560, 4607, 6402, 8445, 9475, 9726, 9729, 9472, 9470, 10243, 10494, +11521, 12288, 12543, 12289, 11776, 11008, 10752, 10496, 10752, 10496, 9217, 8191, 7937, 7166, 6659, 6397, +6402, 6655, 6401, 6142, 6403, 5883, 5894, 5626, 5125, 4093, 3329, 2304, 767, -767, -2816, -5376, +-7681, -9214, -11266, -13566, -14082, -14078, -13825, -13567, -13569, -13568, -13566, -13060, -12282, -11783, -11514, -10756, +-10239, -9726, -8451, -7934, -8706, -9469, -9219, -8445, -7683, -6910, -5377, -4863, -4865, -4607, -4609, -5119, +-5122, -3581, -1539, 3, 766, 1024, 1282, 1021, 1539, 2557, 3843, 6142, 7937, 9215, 9729, 9471, +9473, 9727, 9730, 10493, 11523, 12029, 12547, 12542, 11777, 11263, 10497, 10752, 11262, 10499, 9725, 8706, +7935, 7169, 6655, 6400, 6657, 6398, 6403, 6654, 6400, 6144, 6145, 5886, 5124, 4347, 3844, 2813, +1538, -1, -2304, -4863, -6657, -8703, -11266, -13054, -14082, -14077, -13570, -13569, -13565, -13827, -13565, -12803, +-12542, -12033, -11518, -11011, -10750, -9729, -8448, -8191, -8705, -9472, -9215, -8450, -8446, -6657, -5888, -5376, +-4864, -4353, -4861, -5380, -5373, -4098, -1792, -510, 509, 1027, 765, 1026, 1023, 2048, 3584, 5377, +7679, 8961, 9470, 9474, 9471, 9473, 9727, 10240, 11008, 11777, 12286, 12547, 12028, 11012, 10493, 11266, +11264, 10751, 9728, 8961, 8447, 7169, 6655, 6656, 6657, 6655, 6657, 6654, 6146, 6143, 6144, 5889, +5118, 4610, 4094, 3075, 2045, 515, -2052, -3836, -5890, -8192, -10750, -12803, -13821, -14082, -13824, -13310, +-13826, -14079, -13568, -13056, -12800, -12288, -11521, -11518, -10754, -9725, -8453, -8187, -8964, -9214, -9215, -8963, +-8189, -6915, -6142, -5633, -4862, -4611, -4861, -5635, -5630, -4096, -2560, -513, 257, 511, 769, 769, +1021, 1539, 3070, 4865, 7168, 8447, 8961, 9472, 9216, 9470, 9475, 9981, 11267, 11774, 12544, 12801, +11775, 11010, 10749, 11267, 11262, 10753, 10240, 9471, 8449, 7424, 6912, 6656, 6655, 6657, 6912, 6656, +6400, 6400, 6399, 5890, 5629, 4868, 3836, 3587, 2558, 769, -1024, -3072, -5120, -7425, -10238, -12034, +-13566, -13825, -13568, -13568, -13824, -13568, -13567, -13569, -12800, -12287, -11777, -11775, -11265, -9727, -8705, -8703, +-8961, -9216, -9471, -9216, -8194, -7421, -6659, -6142, -5121, -4351, -5121, -5631, -5633, -4607, -2818, -1277, +-4, 517, 507, 516, 765, 1282, 2559, 4608, 6401, 8190, 9219, 9213, 9474, 9216, 9470, 10242, +10751, 11521, 12800, 12543, 11776, 11009, 11007, 11265, 11263, 11009, 10495, 9728, 8705, 7935, 7169, 6655, +6656, 6913, 6911, 6657, 6655, 6656, 6146, 6141, 5635, 4861, 4354, 4096, 3070, 1282, -257, -2304, +-4351, -6914, -9471, -11776, -13312, -13568, -13312, -13824, -13568, -13823, -13826, -13566, -13058, -12030, -12032, -12290, +-11006, -9474, -8958, -8961, -8704, -9471, -9475, -9212, -8451, -7422, -7169, -5888, -4864, -4608, -5120, -5887, +-5889, -4864, -3328, -1536, -255, 0, 254, 515, 509, 1027, 2301, 4099, 6141, 7683, 8702, 9472, +8961, 9215, 9472, 9729, 10494, 11778, 12798, 12546, 11519, 11008, 11007, 11266, 11261, 11268, 10749, 9985, +8960, 7935, 7169, 6656, 6656, 6911, 6657, 6655, 6658, 6397, 6659, 6397, 5635, 4862, 4608, 4353, +3326, 1539, -4, -1531, -3846, -6138, -8709, -11517, -12800, -13570, -13566, -13569, -13824, -13566, -13826, -13823, +-12801, -12031, -12545, -12286, -11010, -9983, -8961, -8702, -8707, -9212, -9988, -9213, -8450, -7934, -7426, -6142, +-5121, -4608, -5376, -5888, -5631, -5121, -3583, -1794, -766, -1, 513, 255, 513, 766, 1795, 3837, +5378, 7168, 8702, 8963, 8957, 9218, 9472, 9726, 10499, 11773, 12802, 12287, 11520, 11009, 11007, 11264, +11264, 11264, 11009, 10239, 9473, 8446, 7171, 6652, 6917, 6652, 6914, 6912, 6654, 6659, 6654, 6400, +5633, 5119, 4865, 4607, 3328, 2049, 510, -1277, -2819, -5374, -8449, -10752, -12544, -13056, -13312, -13567, +-13570, -13822, -14082, -13567, -12543, -12802, -12797, -12292, -11259, -9990, -9466, -8709, -8956, -9730, -9728, -9215, +-8705, -8192, -7423, -6402, -5117, -4866, -5376, -5888, -6143, -5378, -3580, -2566, -762, -5, 260, 254, +256, 513, 1790, 3330, 5120, 6911, 8193, 8959, 8960, 9217, 9215, 9217, 10495, 11776, 12544, 12288, +11521, 11263, 11009, 11006, 11266, 11518, 11010, 10495, 9728, 8192, 7168, 6912, 6656, 6912, 7168, 6912, +6656, 6656, 6913, 6398, 5635, 5373, 5122, 4351, 3841, 2559, 770, -259, -2301, -4610, -7679, -10241, +-12031, -12801, -13567, -13569, -13311, -14081, -14335, -13313, -12799, -12801, -13055, -12289, -11518, -10498, -9470, -8707, +-8957, -9474, -9471, -9215, -8706, -8703, -7936, -6657, -5631, -5120, -5121, -5887, -5888, -5378, -4349, -2563, +-1277, -258, 257, 0, 0, 256, 1281, 2558, 4611, 6653, 7939, 8445, 8962, 9215, 8960, 8961, +10494, 11779, 12540, 12292, 11517, 11265, 11009, 11006, 11522, 11519, 11263, 11011, 9980, 8708, 7677, 6913, +6656, 6913, 7166, 6915, 6652, 6916, 7165, 6146, 5887, 5632, 5121, 4863, 3840, 2816, 1537, -2, +-1534, -4098, -7167, -9728, -11264, -13057, -13310, -13058, -13568, -14079, -14337, -13311, -13056, -13314, -13053, -12547, +-11773, -10755, -9213, -8963, -9213, -9474, -9728, -8958, -8963, -8701, -7938, -6912, -5631, -4865, -5375, -5889, +-6143, -5634, -4605, -3075, -1790, -513, 1, -1, 0, 256, 1024, 2305, 4095, 6145, 7422, 8194, +8959, 8961, 8703, 8961, 10239, 11777, 12287, 12033, 11774, 11267, 11005, 11266, 11263, 11520, 11521, 11007, +10240, 8961, 7935, 6913, 6912, 7167, 7169, 6655, 6913, 7167, 6913, 6399, 5889, 5631, 5377, 4863, +4096, 3073, 2047, 513, -512, -3586, -6397, -8707, -11005, -12546, -13055, -13057, -13567, -14337, -14079, -13312, +-13569, -13056, -12799, -12801, -12031, -10752, -9474, -8957, -9475, -9726, -9217, -9216, -9215, -8961, -8448, -6912, +-5631, -5378, -5374, -5889, -6144, -5630, -4867, -3582, -2048, -769, -255, -1, 0, 2, 510, 1793, +3839, 5632, 6914, 8190, 8961, 8960, 8447, 8706, 10238, 11778, 12030, 12290, 11774, 11265, 11008, 11008, +11264, 11776, 11776, 11263, 10498, 9469, 8196, 6908, 7172, 7164, 6915, 6910, 7169, 7168, 6912, 6656, +6143, 5634, 5374, 4866, 4607, 3327, 2307, 1533, -509, -2819, -5374, -7937, -10496, -12287, -12545, -13056, +-13824, -14336, -13824, -13823, -13570, -13054, -13058, -12798, -12290, -11005, -9475, -9471, -9471, -9474, -9469, -9218, +-9217, -9214, -8449, -7168, -5887, -5378, -5630, -6145, -6144, -5888, -5120, -3839, -2305, -1023, -514, -254, +-1, 1, 255, 1792, 3329, 5119, 6657, 7935, 8705, 8447, 7938, 8701, 10243, 11261, 12035, 12029, +11522, 11519, 11008, 10753, 11262, 11522, 11774, 11523, 11004, 9732, 8188, 7428, 7166, 7168, 6657, 7166, +7170, 7166, 6914, 6655, 6400, 5888, 5631, 5377, 4353, 3582, 3074, 1790, 1, -2048, -4352, -7425, +-10238, -11523, -12029, -13058, -13823, -13825, -14079, -13826, -13309, -13314, -13056, -13310, -12548, -10747, -9989, -9468, +-9474, -9472, -9471, -9217, -9472, -9471, -8706, -7421, -6147, -5629, -5636, -6140, -6147, -5885, -5379, -4095, +-2559, -1282, -765, -259, 2, -258, 2, 1278, 3075, 4349, 6146, 7679, 8448, 8192, 7937, 8446, +9730, 11263, 12032, 12032, 11777, 11262, 11011, 10749, 11266, 11519, 11521, 12031, 11265, 9983, 8193, 7679, +7168, 6914, 6908, 6917, 7419, 7172, 6909, 6914, 6398, 5891, 5886, 5376, 4608, 3840, 3585, 2048, +511, -1279, -3585, -6910, -9731, -10749, -12035, -13053, -13570, -14079, -13824, -13826, -13309, -13059, -13565, -13570, +-12543, -11009, -9983, -9729, -9726, -9475, -9213, -9475, -9470, -9472, -8962, -7421, -6403, -5630, -5632, -6146, +-6141, -6147, -5630, -4352, -3074, -1789, -771, -510, -256, -257, 0, 1025, 2559, 3841, 5887, 7681, +8191, 7938, 7676, 8197, 9980, 11012, 12028, 12034, 11776, 11520, 10752, 11007, 11266, 11261, 11780, 12283, +11525, 10236, 8963, 7933, 7684, 6907, 6661, 7164, 7170, 7168, 7167, 6913, 6400, 6144, 6143, 5377, +4607, 4353, 3840, 2304, 1023, -255, -3074, -6398, -8449, -10496, -11519, -12802, -13567, -13824, -14081, -13822, +-13314, -13311, -13825, -13567, -12801, -11263, -9985, -9983, -9729, -9472, -9215, -9217, -9727, -9728, -8962, -7934, +-6656, -5890, -5884, -6149, -6396, -6403, -5630, -4609, -3583, -2305, -1280, -511, -514, -509, -3, 770, +1791, 3584, 5633, 7167, 7936, 7681, 7423, 8193, 9470, 11010, 11518, 12034, 12031, 11520, 10752, 11008, +11008, 11009, 12031, 12288, 11777, 10494, 9219, 8445, 7426, 6911, 6913, 6911, 7169, 7423, 7425, 6911, +6657, 6399, 6146, 5373, 4867, 4862, 3840, 2562, 2045, 3, -2563, -5373, -7939, -9726, -11264, -12545, +-13056, -13823, -14082, -13822, -13312, -13570, -13822, -13825, -12801, -11261, -10499, -10239, -9983, -9475, -9211, -9478, +-9722, -9733, -9213, -7937, -6913, -6142, -5889, -6144, -6400, -6400, -5889, -4862, -3841, -2560, -1536, -768, +-768, -512, 0, 256, 1280, 3072, 5376, 6912, 7680, 7424, 7169, 7934, 9218, 10750, 11523, 12285, +12034, 11518, 11265, 11009, 10751, 11007, 12289, 12544, 11776, 10752, 9728, 8447, 7682, 7166, 7170, 6910, +7170, 7422, 7426, 6910, 6658, 6910, 5890, 5374, 5634, 4862, 4098, 3326, 2305, 769, -1793, -4864, +-6912, -8960, -11008, -12031, -13057, -13824, -14080, -13568, -13311, -13569, -14079, -13826, -12798, -11521, -10752, -10496, +-9983, -9474, -9469, -9476, -9725, -9985, -9217, -8189, -7171, -6398, -6145, -6400, -6400, -6399, -6145, -5119, +-4097, -2816, -1535, -1282, -765, -771, -253, -3, 1026, 2559, 4865, 6912, 7167, 7169, 6910, 7939, +8958, 9985, 11775, 12032, 11776, 11778, 11261, 11011, 10237, 11010, 12031, 12545, 12032, 11263, 10241, 8702, +7939, 7422, 7169, 6911, 7169, 7679, 7169, 6911, 7169, 6655, 5890, 5884, 5381, 4859, 4101, 3580, +3074, 1023, -1279, -3584, -6401, -8703, -10241, -11518, -12802, -13566, -14083, -13565, -13314, -13822, -14082, -14079, +-13056, -11777, -11006, -10754, -9983, -9728, -9473, -9214, -9731, -9980, -9476, -8445, -7169, -6401, -6398, -6145, +-6656, -6399, -6145, -5631, -4353, -3072, -1790, -1283, -1021, -770, -512, 1, 512, 2303, 4353, 6399, +6913, 6655, 7169, 7423, 8449, 10240, 11264, 11775, 11776, 11778, 11262, 10498, 10239, 11007, 12034, 12287, +12288, 11776, 10497, 8958, 7938, 7679, 6911, 6915, 7420, 7172, 6908, 7427, 7167, 6656, 6145, 5886, +5634, 4863, 4352, 4097, 3326, 1539, -259, -2814, -5633, -7937, -9725, -11268, -12540, -13827, -13823, -13567, +-13314, -13822, -14338, -14078, -13058, -12029, -11268, -10748, -10243, -9982, -9473, -9472, -9984, -10240, -9728, -8448, +-7423, -6659, -6397, -6659, -6653, -6657, -6145, -5887, -4609, -3327, -2303, -1539, -1276, -773, -763, -259, +1, 1536, 4352, 5887, 6402, 6653, 6659, 7167, 8447, 9987, 11260, 11523, 11775, 12031, 11523, 10493, +10498, 11007, 11776, 12544, 12545, 12031, 10753, 9214, 8706, 7678, 6914, 7423, 7424, 7168, 7424, 7423, +7170, 6398, 6146, 6142, 5634, 4862, 4610, 4350, 3586, 2302, 1, -2304, -4864, -7424, -8960, -10754, +-12541, -13313, -13569, -13310, -13314, -14079, -14335, -14083, -13308, -12291, -11518, -11010, -10495, -9985, -9470, -9219, +-9981, -10243, -9470, -8704, -7682, -6909, -6403, -6653, -6658, -6655, -6401, -5887, -5120, -3584, -2816, -1793, +-1278, -1027, -763, -774, -251, 1532, 3843, 5630, 6147, 6396, 6660, 6909, 7938, 9726, 11011, 11261, +12035, 12285, 11522, 10750, 10242, 10751, 11521, 12287, 12800, 12032, 10752, 9984, 8705, 7422, 7426, 7423, +7167, 7170, 7423, 7680, 7425, 6398, 6403, 6398, 5632, 5121, 4863, 4610, 3838, 2560, 769, -1537, +-4350, -6402, -8448, -10495, -12033, -13310, -13571, -13053, -13315, -14333, -14594, -14335, -13313, -12286, -12035, -11260, +-10756, -9981, -9474, -9727, -9984, -9983, -9731, -8955, -7943, -7160, -6920, -6649, -6916, -6655, -6400, -6145, +-4862, -4098, -2558, -2306, -1534, -770, -1022, -1283, -252, 1276, 3331, 5119, 5887, 6146, 6142, 6401, +7937, 9470, 10241, 11265, 12029, 12293, 11514, 10501, 10493, 10754, 11263, 12543, 12802, 12031, 11520, 10241, +8702, 7682, 7423, 7424, 6912, 6913, 7678, 7682, 6910, 6658, 6655, 6144, 5888, 5376, 5120, 4865, +4095, 3328, 1537, -770, -3325, -5635, -7678, -9729, -11775, -13058, -13309, -13059, -13566, -14081, -14592, -14079, +-13569, -12799, -12033, -11520, -10751, -9985, -9471, -9729, -9983, -9985, -9983, -8961, -8191, -7169, -6911, -6914, +-6653, -6915, -6653, -6403, -5374, -4096, -3329, -2559, -1537, -1023, -1281, -1534, -771, 1026, 2816, 4350, +5891, 6142, 5632, 6401, 7679, 8961, 9983, 11009, 12287, 12288, 11266, 11004, 10245, 10235, 11524, 12285, +12546, 12543, 11776, 10496, 9216, 8192, 7936, 7424, 6656, 7423, 7682, 7422, 7170, 6910, 6657, 6400, +5632, 5632, 5376, 5120, 4607, 3586, 1790, 2, -2562, -4863, -6656, -8960, -11520, -12800, -13056, -12801, +-13566, -14338, -14335, -14336, -13824, -13057, -12030, -11780, -11002, -10246, -9723, -9476, -9982, -10241, -9982, -9475, +-8188, -7685, -7163, -6916, -6909, -6659, -6910, -6401, -5375, -4353, -3839, -2817, -1535, -1282, -1534, -1793, +-766, 510, 2304, 4353, 5631, 5377, 5375, 6145, 7423, 8450, 9469, 11267, 12029, 12035, 11774, 11009, +9983, 10241, 11263, 12033, 12799, 12800, 12033, 10751, 9217, 8702, 8194, 7167, 6913, 7423, 7680, 7681, +7167, 7168, 6657, 6143, 6145, 5632, 5374, 5123, 4862, 3840, 2562, 253, -2045, -3842, -6143, -8449, +-11007, -12289, -12543, -13056, -13570, -14077, -14339, -14334, -13825, -13055, -12545, -11776, -11264, -10239, -9473, -9983, +-9986, -10238, -9985, -9216, -8703, -7682, -7166, -6913, -6913, -6910, -6914, -6398, -5377, -4864, -4096, -3072, +-1791, -1281, -2047, -1793, -1024, 1, 2047, 3841, 5119, 5376, 5121, 6142, 7170, 7934, 9475, 11005, +11778, 12286, 12034, 10751, 10240, 10240, 11008, 12033, 12542, 13058, 12286, 10754, 9727, 9215, 8194, 7422, +6914, 7422, 7681, 7424, 7423, 7169, 6655, 6402, 6141, 5636, 5372, 5379, 4862, 4609, 2815, 771, +-1029, -3067, -5124, -8189, -10498, -11776, -12287, -13057, -13567, -14081, -14592, -14335, -14081, -13312, -12799, -12289, +-11263, -10497, -9984, -9727, -10240, -10241, -9983, -9473, -8703, -7936, -7425, -6910, -6915, -7164, -6915, -6400, +-5885, -5124, -4604, -3075, -1790, -1794, -1790, -2049, -1536, -255, 1534, 3842, 4863, 4608, 5376, 5888, +6400, 7681, 9214, 10498, 11775, 12288, 12034, 11004, 10244, 10238, 11008, 11522, 12797, 13059, 12285, 11267, +10237, 9475, 8446, 7169, 7423, 7424, 7426, 7421, 7427, 6909, 6914, 6655, 6145, 5886, 5379, 5373, +5378, 4607, 3328, 1281, -257, -2047, -4609, -7424, -9727, -11010, -12029, -12546, -13312, -14079, -14594, -14845, +-13827, -13566, -13056, -12289, -11519, -10753, -10240, -9983, -10240, -10240, -9985, -9471, -8705, -8191, -7680, -6913, +-7167, -7425, -7167, -6401, -5888, -5886, -4611, -3070, -2305, -1792, -2047, -2049, -1791, -769, 1537, 3583, +4097, 4607, 5377, 5631, 6145, 7167, 8705, 10238, 11523, 12285, 12035, 11005, 10498, 10239, 10496, 11777, +12800, 13054, 12291, 11516, 10756, 9725, 8450, 7679, 7424, 7424, 7681, 7678, 7170, 7167, 6912, 6400, +6400, 5888, 5633, 5374, 5634, 5117, 3588, 1533, 258, -1026, -3838, -6657, -8960, -10751, -11521, -12544, +-13055, -14081, -14592, -14590, -14083, -13821, -13315, -12542, -11777, -10751, -10497, -10239, -10241, -10496, -9983, -9729, +-8960, -8190, -7684, -7163, -7173, -7420, -6915, -6398, -6401, -5632, -4864, -3327, -2563, -2299, -2054, -2299, +-2563, -1023, 1281, 2814, 3841, 4608, 4864, 5376, 5889, 6910, 8194, 9727, 11519, 12291, 11772, 11269, +10491, 9987, 10495, 11520, 12801, 13054, 12546, 11775, 11264, 9985, 8703, 8192, 7425, 7679, 7681, 7424, +7423, 7169, 6912, 6655, 6401, 5887, 5633, 5632, 5886, 5379, 3837, 2307, 1021, -509, -3075, -5885, +-8195, -9982, -11264, -12033, -13056, -14079, -14594, -14589, -14339, -13822, -13568, -12802, -11773, -11267, -10493, -10242, +-10494, -10243, -10237, -9730, -9215, -8704, -7681, -7166, -7682, -7423, -7169, -6655, -6401, -6142, -4866, -3583, +-2817, -2047, -2048, -2816, -2816, -1025, 514, 2302, 3586, 4351, 4863, 4866, 5631, 6400, 7681, 9471, +11264, 12033, 12030, 11523, 10749, 9987, 10237, 11266, 12543, 12800, 12545, 12542, 11267, 10236, 8964, 7933, +7682, 7679, 7936, 7681, 7422, 7170, 6911, 6656, 6401, 6142, 5378, 5886, 6146, 5375, 4096, 2816, +1792, -1, -2301, -4868, -7420, -9476, -10749, -11522, -12798, -13826, -14591, -14592, -14336, -14080, -13824, -13056, +-12288, -11264, -10496, -10496, -10495, -10498, -9982, -9730, -9726, -8450, -7678, -7426, -7679, -7424, -6913, -6654, +-6658, -6399, -5120, -4353, -3071, -2048, -2305, -3070, -2818, -1536, 258, 1789, 3075, 4094, 4352, 4865, +5375, 5889, 7424, 9215, 10753, 11775, 12033, 11775, 10753, 9727, 9984, 11521, 12031, 12800, 12800, 12545, +11773, 10757, 9466, 8198, 7932, 7682, 7678, 7682, 7423, 7425, 6655, 6912, 6656, 5888, 5888, 6145, +6398, 5377, 4352, 3584, 2560, 512, -1536, -3840, -6656, -8704, -9984, -11264, -12288, -13824, -14336, -14591, +-14594, -14335, -13824, -13312, -12288, -11519, -10755, -10492, -10756, -10236, -10244, -10237, -9730, -8702, -7937, -7680, +-7937, -7422, -6913, -7168, -6911, -6147, -5628, -4612, -3068, -2307, -2558, -3330, -3071, -1535, -1, 1536, +2816, 3584, 4352, 4608, 4864, 5631, 6914, 8702, 10497, 11519, 12289, 12032, 10495, 9986, 10237, 11010, +11776, 12543, 12802, 12542, 12033, 11007, 9729, 8448, 7935, 7939, 7676, 7683, 7678, 6913, 6912, 6913, +6654, 5891, 5628, 6403, 6399, 5632, 4609, 4095, 2815, 1282, -514, -3325, -5891, -7935, -9472, -10752, +-12288, -13312, -14080, -14593, -14334, -14338, -14079, -13312, -12801, -11518, -11011, -11004, -10757, -10491, -10243, -10239, +-9728, -8704, -7936, -8192, -7936, -7425, -7165, -7172, -6909, -6658, -5888, -4606, -3331, -2300, -2821, -3323, +-3077, -2299, -516, 1027, 2557, 3332, 4091, 4356, 4605, 5122, 6400, 8190, 9730, 11518, 12290, 11775, +10751, 9986, 10238, 10753, 11777, 12286, 12801, 12800, 12287, 11522, 9982, 8962, 8189, 7684, 7932, 7939, +7423, 7167, 7170, 7166, 6402, 5631, 5888, 6400, 6144, 5632, 5121, 4095, 3328, 2049, -3, -2300, +-5124, -7165, -8706, -10495, -11777, -13055, -14081, -14335, -14593, -14591, -14081, -13824, -12798, -12035, -11516, -11269, +-10748, -10499, -10494, -10497, -9727, -8705, -8448, -8447, -7938, -7422, -7425, -7168, -6911, -6657, -6400, -4863, +-3074, -2813, -2819, -3325, -3331, -2558, -769, 512, 2049, 3328, 3838, 4355, 4348, 5124, 6398, 7424, +9474, 11516, 12292, 11773, 11010, 9983, 10240, 11008, 11520, 12288, 12544, 13056, 12800, 11264, 10240, 9216, +8449, 7933, 8197, 8186, 7429, 7165, 7425, 7168, 6144, 5887, 6146, 6398, 6146, 5885, 5123, 4606, +3586, 2559, 767, -2047, -4353, -6398, -8194, -9726, -11523, -13053, -13571, -14588, -14597, -14587, -14597, -13819, +-12804, -12285, -11779, -11261, -10755, -10493, -10754, -10495, -9472, -8961, -8703, -8449, -8191, -7425, -7422, -7171, +-6909, -7171, -6398, -4864, -3586, -2813, -3075, -3582, -3328, -2562, -1277, 253, 1539, 3069, 3843, 3837, +4098, 4863, 5632, 6913, 9214, 11266, 12030, 11777, 10753, 10237, 9987, 10494, 11521, 11776, 12800, 13054, +12547, 11774, 10753, 9472, 8447, 8192, 8193, 7936, 7167, 7169, 7423, 6912, 6146, 6142, 6144, 6402, +6140, 5893, 5372, 4611, 4094, 3072, 1025, -1025, -3582, -5634, -7423, -9218, -11005, -12546, -13823, -14337, +-14336, -14847, -14593, -14079, -13313, -12288, -12031, -11521, -10752, -10750, -11012, -10491, -9733, -8956, -8707, -8446, +-7937, -7935, -7426, -6909, -7171, -7422, -6401, -5376, -3839, -3074, -3326, -3585, -3584, -2816, -1537, 1, +1281, 2813, 3587, 3581, 4098, 4607, 5121, 6654, 8962, 11006, 12034, 11775, 11008, 10240, 10240, 10752, +11009, 11774, 12801, 13056, 12799, 12034, 11006, 9729, 8447, 8705, 8703, 7938, 7421, 7683, 7422, 6914, +6398, 6146, 6398, 6145, 6401, 6141, 5380, 4861, 4353, 3584, 1791, -511, -2816, -4864, -6912, -8704, +-10240, -12032, -13312, -14079, -14593, -14847, -14848, -14081, -13055, -12800, -12289, -11262, -11010, -11007, -11264, -10753, +-9727, -9472, -8960, -8448, -8192, -8193, -7423, -7424, -7424, -7424, -6912, -5376, -3841, -3326, -3331, -3836, +-3844, -3068, -2052, -509, 1278, 2561, 3072, 3584, 3839, 4098, 4606, 6145, 8448, 10496, 11519, 11778, +11006, 10241, 10240, 10495, 11009, 11776, 12800, 13055, 12801, 12544, 11519, 9730, 8958, 8961, 8448, 7935, +7681, 7936, 7679, 6658, 6397, 6403, 6397, 6403, 6398, 6145, 5631, 5122, 4861, 4099, 2301, 3, +-1794, -4095, -6145, -7936, -9982, -11523, -13054, -13825, -14335, -14848, -14849, -13824, -13567, -13057, -12543, -11521, +-11007, -11265, -11263, -10753, -10240, -9471, -8705, -8703, -8705, -7935, -7681, -7167, -7680, -7681, -6911, -5633, +-4095, -3327, -3586, -4095, -3841, -3327, -2560, -768, 768, 2048, 2815, 3329, 3840, 3583, 4354, 5886, +7681, 9984, 11520, 11519, 10754, 10495, 10240, 10241, 10494, 11521, 12545, 12799, 13057, 12798, 11266, 9982, +9475, 9213, 8706, 7935, 7936, 8193, 7422, 7171, 6653, 6403, 6396, 6660, 6653, 6146, 5632, 5374, +5378, 4350, 2818, 767, -1279, -3330, -5119, -7424, -9216, -11264, -12544, -13313, -14590, -14850, -14591, -14080, +-13824, -13313, -12541, -11780, -11260, -11523, -11263, -11007, -10242, -9470, -8961, -8960, -8704, -8193, -7421, -7429, +-7930, -7942, -7163, -5891, -4351, -3585, -3839, -3840, -4096, -3841, -2815, -1281, 257, 1535, 2560, 3329, +3327, 3329, 3839, 5375, 7171, 9725, 11011, 11261, 11010, 10750, 10243, 9981, 10499, 11517, 12289, 12800, +13312, 12545, 11518, 10242, 9982, 9473, 8449, 8189, 8195, 7935, 7424, 6912, 6656, 6399, 6402, 6655, +6655, 6147, 5628, 5635, 5376, 4606, 3331, 1277, -510, -2561, -4607, -6400, -8962, -10493, -12035, -13310, +-14336, -14850, -14589, -14339, -13822, -13569, -12544, -11776, -11775, -11522, -11517, -11011, -10494, -9730, -8957, -8963, +-8957, -8194, -7424, -7679, -7938, -7933, -7426, -5887, -4609, -3840, -3839, -3841, -4095, -4097, -3071, -1281, +1, 1023, 2561, 3071, 3073, 3327, 3330, 4604, 6917, 9212, 10754, 11009, 11004, 11013, 10237, 9984, +10753, 11262, 12035, 12798, 13312, 13057, 11519, 10752, 10241, 9470, 8707, 8446, 8448, 8192, 7680, 6913, +6655, 6400, 6399, 6914, 6655, 6144, 5889, 5629, 5636, 4861, 3586, 1791, 0, -1792, -3839, -6146, +-8445, -9988, -11516, -13059, -14078, -14849, -14336, -14336, -14591, -13570, -12797, -12036, -11771, -11782, -11770, -11269, +-10492, -9730, -9216, -9216, -8959, -8194, -7677, -7427, -8190, -8449, -7424, -6143, -4610, -4093, -3843, -3838, +-4353, -4096, -3072, -1791, -514, 1027, 2300, 2820, 3069, 3074, 3072, 4350, 6659, 9213, 10243, 11006, +11265, 10495, 10241, 9983, 10497, 11008, 11774, 13059, 13565, 12546, 11776, 11005, 10501, 9467, 8964, 8445, +8450, 8191, 7680, 7425, 6655, 6401, 6655, 6657, 6655, 6145, 5887, 5889, 5631, 5121, 4095, 2305, +511, -1024, -3328, -5375, -7425, -9472, -11007, -12546, -14077, -14338, -14591, -14593, -14590, -13827, -13052, -12292, +-11774, -12032, -11777, -11519, -10497, -9728, -9471, -9473, -8960, -8447, -7682, -7677, -8195, -8446, -7425, -6144, +-5119, -4098, -3582, -4097, -4608, -4095, -3330, -2302, -769, 512, 2049, 2815, 3073, 2815, 2817, 3839, +6401, 8191, 9985, 10752, 11007, 10754, 10237, 10242, 10240, 10495, 11777, 13055, 13313, 12542, 12035, 11517, +10498, 9727, 8960, 8961, 8446, 8195, 7933, 6914, 6399, 6399, 6659, 6909, 6658, 6143, 5887, 5890, +5886, 5378, 4351, 2816, 1279, -510, -2307, -4604, -6917, -8443, -10500, -12542, -13825, -14335, -14593, -14847, +-14593, -14080, -13054, -12547, -12285, -12035, -12286, -11521, -10496, -9983, -9474, -9725, -9220, -8444, -7684, -7932, +-8451, -8446, -7681, -6656, -5376, -4095, -3842, -4349, -4355, -4094, -3841, -2560, -1023, 255, 1536, 2561, +3071, 2304, 2561, 3838, 5634, 7679, 9472, 10752, 11008, 10495, 10243, 10492, 9988, 10236, 11779, 13055, +13056, 12544, 12288, 11776, 10752, 9728, 9472, 8960, 8704, 8447, 7938, 7421, 6660, 6396, 6659, 6910, +6400, 6146, 6142, 5889, 5888, 5376, 4607, 3330, 1789, 260, -1796, -4093, -5890, -7679, -9984, -12032, +-13313, -14078, -14594, -14847, -14592, -13824, -13313, -12542, -12291, -12540, -12292, -11772, -10756, -9981, -9729, -9728, +-9215, -8450, -7677, -7940, -8444, -8196, -7932, -6915, -5374, -4354, -4095, -4352, -4352, -4352, -4095, -2819, +-1276, -4, 1540, 2813, 2818, 2302, 2306, 3583, 5121, 7167, 9472, 10497, 10751, 10497, 10751, 10241, +9727, 10240, 11777, 12798, 12804, 12538, 12551, 11769, 11014, 10236, 9474, 9216, 8959, 8705, 7936, 7167, +6402, 6654, 6657, 6656, 6655, 5890, 6141, 6147, 5886, 5633, 4863, 3585, 2303, 770, -1283, -3325, +-5122, -7423, -9472, -11521, -13055, -13824, -14593, -14591, -14592, -14337, -13310, -12803, -12285, -12546, -12543, -11776, +-10754, -10236, -9988, -9981, -9474, -8192, -7934, -8194, -8447, -8448, -8193, -7167, -5632, -4352, -4097, -4350, +-4355, -4604, -4100, -3069, -2050, -510, 1279, 2559, 2562, 2045, 2308, 3069, 4609, 6656, 8960, 10240, +10496, 10751, 10754, 10238, 9731, 10235, 11525, 12284, 12803, 12799, 12543, 12033, 11007, 10241, 9728, 9472, +8959, 8961, 8191, 7169, 6655, 6401, 6911, 6913, 6399, 6145, 6143, 6145, 6143, 5889, 4863, 3842, +3069, 1028, -516, -2557, -4610, -6399, -9215, -11009, -12545, -13822, -14082, -14846, -14849, -14337, -13566, -12802, +-12542, -12801, -12801, -12029, -11012, -10236, -10243, -10238, -9218, -8446, -8194, -8190, -8449, -8704, -8448, -7424, +-5631, -4866, -4350, -4097, -4608, -4607, -4098, -3582, -2306, -766, 1023, 2304, 2304, 2048, 2048, 2817, +4094, 6401, 8705, 9727, 10496, 11008, 11008, 9985, 9471, 10496, 11264, 12289, 12799, 12800, 12801, 12030, +11267, 10493, 9986, 9471, 9473, 8959, 8192, 7425, 6654, 6659, 6909, 6658, 6399, 6400, 6145, 6142, +6402, 5631, 5120, 4353, 3326, 1793, 0, -1792, -3583, -5891, -8188, -10500, -12028, -13315, -14334, -14850, +-14845, -14595, -13821, -13059, -12798, -12801, -12799, -12288, -11009, -10495, -10497, -10239, -9472, -8704, -8449, -8190, +-8450, -8959, -8448, -7169, -6142, -5122, -4351, -4353, -4607, -4608, -4353, -3838, -2819, -1021, 1022, 1792, +2050, 2302, 2049, 2303, 3841, 5887, 7938, 9214, 10240, 11010, 10749, 9987, 9726, 10241, 11264, 12031, +12545, 13056, 13055, 12034, 11518, 10753, 9984, 9727, 9474, 9214, 8450, 7422, 6657, 6912, 6911, 6658, +6655, 6143, 6402, 6398, 6145, 5889, 5117, 4868, 3581, 2049, 512, -1025, -2814, -5122, -7679, -9985, +-11519, -13056, -14080, -14849, -15102, -14595, -13820, -13059, -12798, -13058, -13310, -12034, -11261, -11011, -10751, -10239, +-9473, -8959, -8449, -7937, -8702, -8960, -8705, -7680, -6400, -5121, -4349, -4611, -4606, -4611, -4348, -4099, +-3326, -1025, 511, 1538, 2047, 2049, 1791, 1792, 3328, 5632, 7425, 8702, 10243, 11004, 10500, 9980, +9731, 10238, 11010, 11518, 12545, 12799, 12801, 12287, 11522, 10749, 10243, 9981, 9730, 9472, 8447, 7425, +6911, 6657, 6911, 6913, 6399, 6401, 6143, 6401, 6143, 5633, 5375, 5121, 4095, 2305, 1023, -255, +-2049, -4351, -6914, -9213, -11266, -12544, -13822, -14853, -15097, -14598, -14076, -13314, -13056, -13823, -13313, -12287, +-11521, -11263, -10753, -10238, -9730, -8959, -8192, -8193, -8958, -8961, -8705, -7934, -6658, -5375, -4607, -4610, +-4607, -4352, -4609, -4606, -3330, -1535, -1, 1281, 2047, 2048, 1281, 1791, 3329, 5120, 6654, 8450, +9984, 10751, 10754, 9982, 9729, 10240, 10752, 11775, 12290, 12798, 12801, 12544, 11775, 11009, 10240, 9983, +10241, 9728, 8703, 7682, 6910, 6914, 6910, 6658, 6654, 6402, 6399, 6400, 6145, 5886, 5890, 5119, +4352, 2817, 1535, 0, -1535, -3842, -6398, -8449, -10496, -12031, -13569, -14336, -14848, -14848, -13823, -13313, +-13311, -13825, -13313, -12285, -12035, -11518, -10753, -10496, -9983, -8961, -8192, -8448, -8703, -9218, -8957, -8196, +-6907, -5381, -5116, -4867, -4349, -4611, -4861, -4611, -3838, -1792, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, 256, 256, 1024, +-1791, -3586, -3582, -4355, -4860, -5123, -5630, -5634, -6655, -6400, -7680, -1792, 3840, 2816, 3584, 3072, +3584, 3072, 3584, 3072, 3584, 3583, 3586, 3582, 3842, 3582, 3841, 3072, 2816, 2816, 2815, 2818, +2814, 2818, 2814, 3074, 2302, 3074, 2302, 3074, 1790, 3842, -4865, -10496, -7680, -8447, -7939, -7932, +-7940, -7933, -7936, -7170, -8447, -3584, 4863, 3074, 3839, 3583, 3842, 3582, 3585, 3585, 3581, 3587, +3070, 3585, 3072, 3583, 3072, 3074, 3069, 3076, 2812, 3074, 2304, 4351, 4354, 4862, 3841, 5119, +3841, 5119, 3073, 5888, -3586, -16380, -14598, -15354, -14596, -14591, -13567, -18178, -23294, -21761, -23297, -16894, +13310, 13570, 13310, 13570, 12799, 13313, 12543, 12799, 12035, 12540, 11525, 12027, 11268, 11518, 10752, 11520, +10497, 11262, 9988, 10747, 9733, 10492, 9218, 9984, 8447, 9986, 7935, 9727, 7681, 10496, 1791, -22270, +-22274, -23039, -23040, -22273, -23039, -23041, -23294, -23042, -23294, -21762, 9217, 14848, 12032, 13569, 11518, 13314, +11518, 12546, 11263, 12032, 10496, 11519, 9986, 11261, 9988, 10747, 9732, 10494, 9216, 9985, 8703, 9728, +8449, 9215, 7937, 8703, 7681, 8447, 7169, 8447, 4865, -20481, -23295, -22273, -23039, -22529, -21759, -23041, +-22271, -22529, -20479, -23297, 3074, 16126, 10753, 13567, 11265, 13311, 11265, 12544, 10751, 11521, 10494, 11523, +9981, 10755, 9981, 10498, 9727, 9985, 9215, 9729, 8703, 9216, 8449, 8703, 7937, 7935, 7936, 7681, +7934, 7171, 7932, -16380, -23300, -22268, -23300, -22525, -22530, -23295, -22528, -23297, -20991, -23296, -2817, 16385, +10496, 13568, 10752, 12800, 10751, 12034, 10495, 11519, 10498, 10750, 9986, 10495, 9984, 9983, 9730, 9725, +9221, 9210, 8709, 8700, 8706, 7936, 8447, 7681, 8447, 7169, 8446, 6403, 9725, -12030, -23297, -21761, +-23293, -22532, -22524, -23300, -22525, -23042, -20478, -23298, -8447, 16128, 10751, 13314, 11262, 12545, 11264, 11519, +10754, 11261, 10755, 10751, 10495, 9986, 9982, 9985, 9984, 9216, 9728, 8704, 9216, 8448, 8704, 7936, +8704, 7168, 8449, 6654, 8706, 5887, 9984, -6655, -23298, -22269, -23299, -22270, -22273, -23296, -22527, -23297, +-21248, -23296, -14848, 14081, 11519, 12801, 11518, 12034, 11519, 11265, 11263, 10752, 10752, 10497, 10494, 9986, +10494, 9730, 9983, 9216, 9727, 8451, 9724, 7940, 9213, 7937, 8705, 7166, 8705, 6656, 8704, 5888, +9728, -512, -23297, -22270, -23298, -23038, -22530, -23038, -22531, -23292, -21251, -23295, -19712, 11263, 13313, 12032, +12544, 11519, 12033, 11263, 11521, 10495, 11265, 9982, 10755, 9726, 10496, 9217, 9982, 8706, 9728, 8447, +9728, 7936, 9216, 7937, 8703, 7680, 8448, 7169, 8447, 6401, 8702, 1794, -22273, -23040, -23296, -22528, +-22272, -22272, -22273, -23039, -23040, -23041, -23038, 6398, 14594, 11261, 13316, 11260, 12548, 10749, 12034, 10494, +11522, 9982, 10754, 9727, 10496, 9216, 9984, 9216, 9985, 8703, 9729, 8446, 8706, 7934, 8450, 7936, +7934, 7682, 7935, 7167, 7682, 5887, -18944, -23295, -22274, -23294, -22274, -23037, -23043, -22526, -23297, -22272, +-23295, 1023, 15617, 10495, 13312, 10753, 12542, 10499, 12029, 10498, 11263, 9983, 10755, 9980, 10500, 9725, +9986, 9215, 9729, 8702, 9218, 8447, 8705, 8447, 7936, 7936, 7937, 7935, 7168, 7936, 6400, 7936, +-14591, -23298, -22270, -23298, -23038, -22530, -23294, -22274, -23294, -21762, -23294, -4866, 16130, 10494, 13570, 10751, +12544, 10752, 12032, 10752, 11265, 10495, 10751, 9987, 10491, 9990, 9979, 9731, 9726, 9217, 8703, 8707, +8443, 8709, 7932, 8451, 7679, 8447, 6657, 8448, 5887, 9986, -10755, -23293, -21762, -23295, -23040, -22529, +-23039, -21760, -23296, -21761, -23294, -10755, 15363, 10750, 13313, 11264, 12031, 11265, 11519, 10754, 10750, 10497, +10496, 10495, 9986, 9982, 9730, 9982, 9217, 9728, 8704, 9216, 7937, 8701, 7941, 8697, 7176, 8697, +6662, 8699, 5635, 9982, -5117, -23299, -22270, -23042, -22525, -22532, -22523, -22533, -23292, -21763, -23295, -16127, +13310, 12034, 12543, 12032, 11521, 11518, 11267, 11517, 10755, 11262, 10496, 10754, 9982, 10497, 9728, 9982, +8707, 9981, 8451, 9725, 7938, 9215, 7680, 8704, 7168, 8448, 6657, 8447, 5888, 9216, -768, -23295, +-22273, -22272, -23296, -22527, -23298, -22269, -22275, -22527, -23295, -20993, 9728, 13314, 11516, 12804, 11261, 12034, +10751, 11520, 10497, 11263, 9984, 10752, 9728, 10496, 9217, 9983, 8704, 9984, 8448, 9728, 7936, 9217, +7935, 8704, 7680, 8448, 7168, 7938, 6652, 8452, 3836, -20220, -23299, -22270, -23042, -22270, -22530, -23038, +-22529, -22528, -21760, -23296, 4864, 14848, 10752, 13312, 10751, 12547, 10748, 12036, 10493, 11521, 9986, 10748, +9732, 10494, 9728, 9986, 9213, 9731, 8701, 9219, 8446, 8705, 7936, 8447, 7937, 7936, 7679, 7682, +7677, 7171, 6654, -17663, -23296, -22273, -23295, -22272, -23041, -23039, -22272, -23297, -21758, -23299, -766, 16128, +10495, 13570, 10750, 12800, 10754, 12029, 10500, 11516, 9987, 10750, 9986, 10495, 9727, 9986, 9215, 9729, +9215, 9216, 8704, 8448, 8450, 7932, 8453, 7675, 7940, 7165, 8450, 6399, 9217, -14081, -23295, -21249, +-23039, -22273, -23040, -22527, -21761, -23040, -21247, -23298, -6398, 16127, 10496, 13312, 10752, 12545, 10750, 11523, +10749, 11266, 10495, 10753, 9983, 9985, 9983, 9728, 9729, 9215, 9216, 8705, 9214, 8450, 8703, 7935, +8451, 7165, 8450, 6655, 8448, 5888, 9984, -8448, -23296, -22272, -23295, -22530, -23039, -23296, -22528, -23296, +-21759, -23298, -12030, 14846, 11522, 12799, 11520, 12033, 11518, 11523, 11261, 10754, 10751, 10497, 10494, 9988, +9979, 9732, 9981, 9218, 9728, 8447, 9217, 7934, 9219, 7678, 8705, 7167, 8704, 6657, 8703, 5889, +9983, -3584, -23295, -22274, -22525, -23299, -23037, -22530, -22271, -22273, -20991, -23297, -17663, 12032, 12544, 12031, +12034, 11517, 11523, 11262, 11521, 10496, 11263, 9986, 10750, 9729, 10496, 9215, 9986, 8702, 9730, 8446, +9730, 7934, 9217, 7681, 8702, 7170, 8702, 6657, 8448, 6401, 9214, 770, -23298, -22527, -23040, -22528, +-22271, -22274, -23039, -22272, -21761, -23037, -20484, 7939, 14078, 11265, 13312, 11264, 12544, 10752, 11520, 10496, +11520, 9984, 10753, 9726, 10499, 9213, 9986, 8702, 9731, 8445, 9219, 8445, 8706, 7935, 8448, 7682, +7933, 7682, 7935, 7168, 7937, 4863, -20479, -23298, -21758, -23042, -22270, -23041, -23040, -21760, -21249, -21245, +-23300, 3076, 15357, 10498, 13311, 10752, 12545, 10494, 12034, 10495, 11520, 9985, 10750, 9730, 10495, 9728, +9985, 9215, 9728, 8705, 9215, 8448, 8705, 8446, 8451, 7932, 7940, 7932, 7684, 7933, 6658, 7934, +-16382, -23298, -21758, -23041, -23039, -23298, -23037, -21763, -23294, -20992, -23297, -2815, 16128, 10495, 13570, 10750, +12801, 10751, 12033, 10495, 11522, 9981, 10754, 9982, 10499, 9724, 9989, 9210, 9222, 9211, 8708, 8701, +8450, 8447, 7936, 8449, 7678, 8451, 6652, 8452, 5885, 9730, -12033, -23296, -22271, -23297, -22528, -22527, +-23041, -21759, -22273, -21759, -23297, -8703, 15616, 10751, 13313, 11264, 12543, 11266, 11518, 10753, 11263, 10497, +10496, 9984, 9984, 9982, 9731, 9981, 9220, 9724, 8706, 9215, 8449, 8703, 7937, 8703, 7169, 8703, +6657, 8703, 5889, 9984, -6657, -23295, -22273, -23039, -22529, -22272, -22527, -22529, -23294, -21764, -23291, -14853, +14084, 11518, 12800, 11522, 12029, 11522, 11263, 11265, 10751, 10753, 9982, 10499, 9981, 9987, 9214, 9984, +8705, 9726, 8451, 9214, 7937, 9214, 7682, 8703, 7169, 8446, 6658, 8446, 5891, 9724, -1789, -23298, +-23037, -22531, -20990, -20994, -23039, -21759, -23042, -23038, -23297, -18944, 10752, 13312, 11520, 12544, 11520, 12032, +11264, 11520, 10496, 11264, 9984, 10752, 9983, 10498, 9214, 9985, 8704, 9983, 8449, 9727, 7937, 9216, +7935, 8705, 7678, 8451, 7166, 8449, 6400, 8703, 2305, -21761, -23040, -22526, -23043, -22524, -23302, -23034, +-23044, -23039, -23038, -23044, 6404, 14589, 10754, 13311, 10753, 12543, 10752, 11521, 10495, 11264, 9986, 10748, +9732, 10493, 9218, 9983, 8704, 9728, 8703, 9218, 8446, 8706, 7934, 8449, 7935, 7937, 7680, 7935, +7169, 7679, 5889, -18944, -23297, -22271, -23041, -22271, -23041, -23039, -22529, -23039, -22272, -23297, 769, 16127, +10497, 13568, 10752, 12800, 10752, 12031, 10499, 11516, 9988, 10749, 9986, 10495, 9728, 9984, 9216, 9729, +8703, 9217, 8703, 8704, 8448, 7936, 7937, 7679, 7936, 7168, 7936, 6400, 8448, -14848, -23296, -21760, +-23296, -21760, -22272, -23040, -22273, -23295, -21761, -23294, -4866, 16129, 10495, 13312, 10753, 12543, 10753, 11520, +10494, 11267, 10493, 10755, 9981, 9987, 9981, 9987, 9725, 9218, 9215, 8705, 8703, 8448, 8705, 7935, +8448, 7681, 8446, 6659, 8446, 5888, 9728, -9215, -23298, -22269, -23043, -22527, -23039, -22274, -22269, -23299, +-21759, -23295, -11266, 15363, 11261, 13314, 11262, 12034, 11263, 11521, 10751, 11264, 10753, 10495, 10497, 9983, +9985, 9727, 9985, 9216, 9727, 8449, 9215, 7937, 8704, 7679, 8705, 7167, 8449, 6656, 8703, 5633, +9984, -5121, -23294, -22531, -23293, -23042, -23038, -23042, -22271, -23296, -21761, -23294, -16898, 13314, 12030, 12545, +12032, 11519, 11522, 11262, 11265, 10751, 11266, 10493, 10755, 9982, 10496, 9730, 9982, 8704, 9986, 8445, +9731, 7933, 9218, 7935, 8704, 7169, 8703, 6656, 8705, 5886, 9730, -257, -22527, -22529, -23039, -22529, +-22528, -22271, -22274, -23292, -22533, -22523, -20485, 9732, 13566, 11521, 12799, 11265, 12030, 10755, 11518, 10496, +11265, 9982, 10755, 9725, 10498, 9215, 9985, 8703, 9730, 8444, 9733, 7931, 9221, 7932, 8707, 7677, +8451, 7165, 7939, 6653, 7939, 3582, -20223, -23041, -23039, -23297, -22527, -22272, -22528, -22528, -23297, -22527, +-23297, 4865, 14849, 10749, 13315, 10749, 12546, 10752, 12031, 10497, 11519, 9985, 11263, 9985, 10495, 9729, +9983, 9217, 9982, 8706, 9215, 8448, 8705, 7933, 8452, 7932, 7939, 7679, 7679, 7682, 7166, 6658, +-17666, -23294, -22274, -23038, -23042, -22270, -23042, -22270, -22529, -21760, -23296, -1024, 16129, 9982, 13571, 10748, +12548, 10494, 12032, 10497, 11519, 9984, 10753, 9983, 10497, 9727, 9984, 9217, 9727, 8705, 9215, 8704, +8449, 8446, 7939, 7933, 7683, 7934, 7168, 7937, 6399, 9218, -13315, -23293, -21762, -23295, -22528, -22529, +-23295, -21248, -23041, -20990, -23298, -7679, 16384, 10495, 13570, 11262, 12545, 10751, 12033, 10751, 11265, 10495, +10752, 9985, 9982, 9986, 9983, 9728, 9218, 9212, 8708, 9213, 8451, 8701, 7938, 8447, 7168, 8449, +6655, 8448, 5889, 9982, -8446, -23297, -22272, -23039, -22530, -23037, -23300, -22524, -23300, -21756, -23299, -12798, +14847, 11264, 12801, 11518, 12034, 11263, 11521, 11263, 10752, 10753, 10494, 10499, 9981, 9987, 9725, 9986, +9215, 9729, 8448, 9215, 7937, 9215, 7937, 8703, 7169, 8704, 6655, 8705, 5887, 9984, -3583, -23296, +-22273, -23039, -22529, -23295, -23297, -22526, -23298, -22271, -23296, -18433, 12033, 12544, 12032, 12031, 11522, 11517, +11267, 11518, 10754, 11262, 9985, 10751, 9729, 10496, 9216, 9983, 8704, 9729, 8448, 9727, 7937, 9214, +7682, 8703, 7169, 8446, 6659, 8445, 6402, 8703, 1025, -23041, -23295, -23041, -23295, -22529, -22527, -22273, +-22528, -23039, -23298, -22269, 7933, 14082, 11263, 12800, 11264, 12545, 10751, 11521, 10495, 11520, 9985, 10751, +9729, 10495, 9216, 9985, 8703, 9985, 8447, 9728, 8449, 9214, 7939, 8702, 7680, 8450, 7676, 7941, +7164, 7939, 4861, -20221, -22275, -20989, -22530, -23039, -22528, -22529, -23039, -23041, -22270, -23299, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, +-5888, -2304, 16127, 19970, 14335, 2304, -10495, -15362, -15358, -10497, -1535, 2303, -6399, -8193, 1793, 5631, +1280, -11518, -7939, 5379, 10237, 2, -3584, 3071, 10754, 7933, -252, -8965, 518, 5882, -506, 251, +3842, 10752, 16128, 4607, -4605, -5, 773, -4868, -7933, -9986, -766, 10494, 1025, -4352, -1792, -1280, +-4864, -11520, -19199, -6658, 2819, -771, -3070, 2048, 5374, 5123, -6658, -11520, -1278, 6397, 1282, -512, +4607, 14593, 15104, 6143, -2047, 1792, 7168, 255, -2302, 3069, 10243, 14334, 7937, -1536, 2815, 3073, +-6145, -11262, -11010, -5887, 3840, -2561, -6141, 764, 2051, -4866, -9726, -17409, -9728, -2303, -7170, -6654, +2559, 5632, 5633, -1793, -8448, -1792, 2560, -3328, -3328, 4096, 12032, 14591, 8705, 3840, 7167, 8961, +-1, -3071, 1536, 9215, 11520, 8705, 3071, 8194, 7676, -2811, -10501, -9724, -7427, -1022, -4866, -6653, +1277, 4610, -3585, -8192, -14847, -12802, -6909, -12292, -12796, -1539, 2561, 3840, 1280, -4608, -511, 1790, +-5374, -5633, 2049, 7935, 13057, 10239, 7681, 11520, 11775, 2049, -1537, 1, 5888, 8191, 7425, 5631, +11777, 12543, 3585, -5121, -5887, -6145, -4863, -7681, -9727, -1025, 4354, -2307, -6397, -9730, -10496, -7934, +-14595, -17662, -6400, -1, 0, 513, -2818, 1282, 4096, -5122, -9469, -1027, 3331, 8445, 7683, 7933, +15107, 17662, 7426, 1789, 2051, 5373, 5379, 3326, 3585, 11776, 15359, 8194, -258, -1279, -2561, -4607, +-9216, -12288, -5377, 2049, -1793, -5119, -5633, -6911, -6657, -15103, -21248, -12801, -3582, -3331, -2300, -2820, +3076, 7420, -1276, -9988, -3836, 509, 4609, 3841, 4349, 14339, 19966, 11778, 5118, 4609, 6655, 5889, +1024, 512, 10496, 17151, 12546, 4605, 2308, 2556, -1533, -9985, -14849, -8702, -515, -2557, -7426, -4607, +-2816, -3074, -11773, -19971, -15101, -7171, -9214, -8193, -4352, 2817, 7423, 257, -8449, -2560, 1025, 767, +1, 767, 11521, 19710, 13315, 8190, 10240, 10754, 6909, -510, -1793, 7937, 13311, 8449, 4863, 7167, +9987, 4349, -6654, -12800, -7682, -2814, -5889, -9216, -3839, 255, -1024, -9983, -17410, -14333, -8707, -14078, +-15362, -8445, -3, 5122, -1, -6912, -512, 2817, -2050, -5118, -3073, 6400, 16384, 12033, 9470, 14594, +15359, 10497, 3070, -510, 6910, 11778, 7680, 6911, 10496, 13057, 8958, -1789, -8707, -6142, -4609, -8703, +-12033, -6912, 0, 0, -5631, -12033, -11520, -8959, -15618, -19197, -12803, -5373, 253, -509, -5379, 515, +3837, -2557, -5891, -5373, 508, 9732, 7934, 7680, 16385, 18430, 14081, 7937, 2815, 6657, 9982, 4354, +5118, 10499, 14333, 12546, 5375, 0, 257, -3074, -8957, -12291, -7933, -3331, -3326, -6913, -8191, -7937, +-7935, -15873, -20736, -15871, -10753, -7423, -5889, -6144, 256, 5377, -1281, -4608, -3839, -1282, 3586, 3583, +3328, 13825, 18174, 15362, 12799, 9217, 8702, 9986, 3070, 3586, 9727, 12800, 12288, 9728, 5888, 6911, +2050, -6403, -10236, -8708, -5885, -5634, -7423, -6401, -4607, -5632, -11777, -17405, -16389, -14586, -14854, -12538, +-8965, -3068, 2557, -1279, -3583, -1538, -1534, -2050, -1278, -1026, 8962, 15358, 13825, 15105, 15870, 13314, +13055, 5631, 3330, 9215, 11008, 10497, 12030, 10497, 11520, 8191, -1021, -5380, -6396, -7684, -8445, -9218, +-7167, -3328, -4865, -8958, -14082, -14335, -14848, -17153, -18431, -14080, -8961, -2302, -3074, -3839, -769, -255, +-3328, -3328, -4097, 3073, 9983, 9986, 12286, 17410, 16637, 16388, 10237, 5633, 9985, 11005, 8197, 10748, +11777, 14081, 13821, 5381, 763, -252, -4355, -8446, -10241, -9728, -4608, -4352, -7168, -9471, -10498, -12542, +-16898, -20990, -18434, -14079, -8959, -7682, -7166, -2050, 1025, -2304, -4352, -5888, -1792, 4352, 4608, 5888, +14336, 17409, 17662, 14850, 9214, 11778, 12799, 7168, 7936, 11520, 13824, 16128, 9984, 5631, 6402, 2558, +-4350, -7938, -9983, -5889, -5118, -7682, -8702, -6914, -8447, -13056, -19712, -19969, -16894, -14339, -13564, -11012, +-4605, 1022, -2304, -5118, -5123, -3068, -4, -1277, -1027, 8707, 15869, 15876, 15612, 13058, 14847, 14849, +7679, 5377, 10750, 12546, 14847, 12033, 9983, 12544, 9729, -257, -4607, -6913, -5630, -5123, -8701, -8706, +-3327, -4608, -8704, -15362, -18172, -16644, -15869, -18433, -16130, -9725, -3330, -2815, -5376, -4608, -3074, -1533, +-3331, -4093, 2558, 10241, 11774, 13060, 13563, 16133, 17147, 11268, 5630, 9984, 11521, 12798, 11779, 10237, +13571, 14844, 5637, 251, -1788, -3330, -4096, -8190, -9731, -4094, -2561, -7168, -10750, -14083, -13821, -15363, +-19966, -19968, -13569, -8447, -6657, -7424, -5119, -2049, -1535, -5121, -6144, -1535, 5374, 6915, 8957, 11779, +16125, 17667, 14077, 7938, 10239, 11264, 10754, 10493, 10754, 13823, 17408, 10754, 5373, 3843, 509, -2301, +-6402, -9983, -5889, -3070, -6146, -7679, -9472, -10753, -12799, -18432, -21249, -16638, -13058, -10752, -9727, -6657, +-2559, -1024, -4865, -6911, -4609, 257, 1792, 3328, 7936, 14079, 17665, 15872, 11008, 12544, 12800, 9983, +8450, 9469, 13316, 17148, 13571, 9470, 9473, 6144, 1280, -4352, -8705, -6910, -3586, -6910, -7426, -6910, +-7426, -9471, -15104, -20480, -17664, -16128, -15873, -14335, -10240, -5120, -1536, -5121, -6911, -4864, -2048, -2048, +-1536, 2559, 10242, 14846, 14594, 13310, 14850, 15870, 12290, 8446, 8962, 12286, 15618, 14335, 11264, 13313, +11518, 6658, 255, -4352, -5375, -3330, -7422, -8194, -5887, -4607, -6658, -11006, -16899, -16381, -16129, -18688, +-18688, -14080, -8961, -4862, -6657, -7425, -4349, -2564, -4349, -5633, -2048, 5120, 10497, 11261, 11780, 14844, +17668, 14333, 9729, 9216, 12288, 14080, 13312, 11520, 15104, 15873, 11774, 5377, 1280, -768, -767, -6146, +-8447, -5633, -3582, -5378, -8190, -13058, -13311, -13824, -18945, -21246, -17665, -13569, -9213, -8965, -8698, -4869, +-3325, -6145, -7936, -5120, -256, 4353, 5118, 8450, 14078, 17922, 15103, 11521, 10237, 12804, 12540, 11012, +10492, 15107, 18175, 15871, 10242, 7677, 5380, 3068, -3068, -7684, -5372, -2820, -4348, -5636, -8189, -8705, +-9472, -16640, -20992, -19201, -16638, -14594, -12799, -12288, -6400, -2817, -6142, -8450, -7423, -4608, -512, -769, +1795, 9468, 15876, 15100, 13059, 11774, 14081, 13568, 9984, 8191, 12290, 17149, 17155, 13310, 12289, 11776, +8959, 2305, -4353, -4863, -2560, -3842, -6141, -5636, -4859, -4612, -10751, -17919, -18434, -17150, -17921, -17408, +-16384, -10751, -4610, -5630, -8706, -7166, -6145, -4864, -5120, -4864, 2048, 10241, 11774, 12034, 13310, 15105, +15361, 10750, 7426, 9727, 14847, 15362, 14334, 14338, 16639, 14848, 9216, 1536, -1024, -512, -2560, -6144, +-5632, -3584, -2048, -5120, -11519, -14850, -14590, -17665, -20224, -19711, -16385, -9727, -7425, -9472, -8192, -5376, +-6399, -6914, -8446, -5122, 2562, 6911, 7424, 11264, 14593, 16382, 14339, 9725, 9218, 12543, 13312, 12288, +13057, 16126, 18178, 15103, 8704, 4097, 3071, 769, -3841, -5888, -3839, -1794, -2300, -6405, -10236, -10755, +-13054, -18945, -21248, -19711, -14849, -11264, -11264, -10240, -5632, -5119, -7682, -9726, -8706, -3070, 1022, 1794, +5374, 12034, 15358, 15105, 11520, 9983, 12802, 12798, 10498, 11005, 15108, 18429, 17665, 13057, 9981, 8708, +4861, -1278, -4865, -3841, -2046, -2562, -4863, -6399, -6146, -8703, -15617, -19711, -19200, -17408, -15360, -15105, +-13310, -7169, -5120, -7679, -9474, -9214, -6400, -3586, -3581, -259, 7682, 12287, 13569, 12286, 12035, 14333, +13314, 8959, 9473, 13310, 16642, 16895, 14848, 14082, 14589, 10242, 3071, -1792, -2047, -1537, -2815, -4866, +-4349, -2820, -4348, -11267, -15614, -17410, -17406, -18433, -18944, -16384, -10240, -6912, -8447, -9218, -7934, -6658, +-6398, -7682, -5375, 2305, 7423, 9472, 10752, 12800, 15616, 14594, 9468, 8708, 12029, 14082, 14591, 14337, +15870, 18179, 15357, 8195, 3069, 1283, -3, -2814, -5377, -4351, -1281, -2303, -6914, -11262, -12801, -14848, +-18431, -20738, -19454, -14082, -10494, -10754, -9726, -7426, -6143, -7423, -9731, -8957, -2561, 1790, 3589, 7161, +11783, 15099, 15362, 11008, 9471, 12033, 12544, 11775, 12802, 15358, 19457, 18176, 12799, 8963, 7164, 3588, +-1029, -4603, -3844, -765, -1026, -4350, -6916, -7931, -10758, -15610, -20228, -20222, -16897, -14080, -13823, -12289, +-8448, -6400, -7679, -9984, -10241, -6144, -3072, -2047, 1279, 7682, 12285, 14338, 11775, 10752, 12802, 12541, +10243, 10749, 13314, 17407, 18432, 15617, 13311, 12801, 9215, 3329, -1281, -2559, -769, -1279, -3585, -4607, +-4609, -6399, -11009, -16384, -18432, -17920, -17151, -17408, -15362, -11261, -8196, -8444, -9986, -10240, -8191, -6401, +-6655, -4097, 1537, 7166, 10755, 11005, 11523, 13821, 13571, 10236, 9477, 11259, 14596, 16894, 15872, 15617, +16896, 14079, 8450, 3325, 515, 254, -511, -3071, -3331, -1532, -2564, -6397, -11777, -14336, -16128, -17407, +-19458, -18430, -14082, -10238, -9729, -10239, -9730, -8191, -7936, -9471, -8706, -3326, 1790, 5378, 7423, 9984, +13567, 14338, 11006, 9218, 10495, 12543, 14338, 14077, 15364, 18429, 18178, 13310, 8706, 5119, 3584, 1025, +-2562, -3070, -514, -254, -2562, -6910, -9730, -11518, -14850, -18943, -19711, -16898, -13053, -12035, -11775, -9983, +-7938, -7934, -10497, -11007, -7682, -3069, -516, 2309, 6139, 11268, 13565, 11522, 9215, 10496, 11776, 12032, +11520, 13313, 17661, 19460, 16380, 13059, 10495, 7936, 4352, -513, -2302, -2, 514, -1026, -3327, -5376, +-6912, -10752, -16128, -18432, -17409, -15870, -14594, -13822, -11265, -8193, -7934, -9730, -11262, -9986, -6910, -5378, +-2558, 1278, 7169, 10752, 11008, 9984, 11264, 11776, 10495, 9473, 11264, 14847, 18178, 16893, 15619, 14846, +12545, 8448, 2815, -254, 254, 258, -769, -1793, -2045, -2564, -5884, -11779, -15358, -16129, -16896, -17152, +-16639, -13570, -9726, -8450, -9982, -10497, -9984, -8704, -8959, -7938, -3838, 2046, 6658, 8447, 9216, 11519, +12289, 10496, 8447, 9218, 12029, 15107, 15358, 15616, 17410, 16382, 12802, 7167, 3071, 2050, 1279, -1024, +-1534, -260, 4, -2307, -7166, -11009, -12544, -15103, -17666, -18686, -16386, -12286, -10241, -10752, -10496, -9216, +-8704, -9983, -10753, -7936, -2815, 1279, 3841, 6912, 10238, 12803, 11262, 9217, 8705, 10493, 12291, 12798, +13825, 17152, 18687, 16385, 12287, 7938, 5885, 3843, -3, -1278, -256, 511, 2, -3331, -6653, -8195, +-11261, -15874, -18431, -17665, -15359, -13057, -13056, -11262, -8963, -8445, -10243, -11773, -10499, -6909, -4098, -1535, +2304, 7424, 11263, 11266, 9470, 9217, 10240, 10752, 10240, 11519, 15362, 18429, 17924, 15612, 13315, 10749, +7683, 2302, 1, 0, 1023, 257, -1024, -2817, -3839, -6912, -12033, -16127, -17152, -16897, -15871, -15360, +-13313, -9983, -8704, -9729, -11262, -11266, -9471, -7936, -6657, -2814, 2301, 7172, 9212, 9731, 10238, 11009, +9983, 8962, 9469, 12547, 15870, 17152, 16898, 16637, 15363, 12029, 7171, 3069, 1795, 1278, 256, 1, +-770, -510, -2561, -7679, -11521, -14080, -15616, -16895, -17408, -16129, -12543, -10241, -10239, -10753, -10751, -10242, +-9981, -10499, -7933, -2819, 1794, 5118, 7427, 9469, 11522, 10752, 8958, 8451, 10237, 13058, 14591, 15616, +17409, 17918, 16386, 12030, 7426, 5374, 3330, 1278, 1, 1, 510, 258, -3329, -6913, -9470, -12289, +-15360, -17663, -17666, -14847, -12287, -11778, -11005, -10243, -9982, -10241, -11776, -11263, -7681, -3584, 1, 3071, +6912, 10241, 10750, 9219, 8444, 9220, 10237, 11521, 12546, 15611, 18182, 18170, 15878, 12282, 9733, 7164, +3331, 1023, 512, 1279, 1538, -514, -3070, -4609, -7680, -11776, -15615, -17154, -16127, -14848, -14079, -12546, +-9981, -9477, -9722, -11525, -12029, -9985, -7679, -5633, -1791, 2303, 7168, 9474, 9213, 8963, 9469, 9474, +9471, 9984, 12801, 16126, 17921, 17152, 15872, 14080, 11264, 6912, 3072, 2047, 1794, 1789, 772, -260, +-765, -3074, -7423, -11776, -14849, -15614, -15619, -15613, -14594, -11775, -9984, -9473, -10494, -11523, -11005, -10243, +-9726, -6656, -2561, 2305, 6143, 7425, 8447, 9729, 9471, 8448, 8450, 9725, 13058, 15359, 16128, 16896, +16641, 15102, 11522, 6910, 4354, 3070, 2050, 1022, 514, 766, 1, -2817, -6911, -9984, -12801, -14847, +-16385, -16383, -14081, -11518, -10499, -10236, -10500, -10493, -10754, -11519, -10239, -7170, -2814, 1022, 4097, 6656, +9473, 9982, 8706, 7934, 8449, 10241, 12287, 13568, 15617, 17406, 17410, 14847, 11520, 8193, 5887, 3584, +1537, 1021, 1285, 1786, 6, -2822, -5626, -8710, -12026, -15110, -16890, -15622, -13563, -12548, -11261, -10498, +-9727, -9984, -11521, -12287, -10240, -7424, -4096, -768, 3071, 6914, 8959, 8448, 8192, 8192, 8704, 9728, +10496, 12800, 15872, 17408, 16639, 14595, 12283, 9990, 6394, 3076, 1534, 1537, 2047, 1281, -257, -1791, +-4097, -7680, -11775, -14849, -15616, -15103, -14593, -13568, -11262, -9732, -9468, -10498, -12032, -11263, -10241, -8704, +-5630, -1795, 3074, 6399, 7425, 7935, 8192, 8704, 8192, 8193, 9726, 13314, 15614, 16386, 16126, 15362, +13823, 10496, 6145, 3582, 2818, 2303, 1536, 769, 254, 2, -3330, -7678, -11266, -13821, -14596, -15868, +-15620, -13052, -11011, -9469, -9987, -11262, -11266, -11005, -11012, -9979, -6405, -2044, 2301, 4866, 6655, 8448, +8705, 8190, 7426, 7679, 10240, 12801, 14334, 15617, 16641, 16639, 14337, 10239, 6912, 5121, 3328, 2047, +1025, 1280, 1535, 1, -3328, -6657, -9726, -12291, -15101, -16387, -15356, -13060, -11261, -10498, -10495, -10241, +-10495, -11777, -12287, -10240, -6913, -2559, 255, 3329, 6911, 8705, 8192, 7423, 7170, 8189, 9987, 11261, +13316, 15868, 17411, 16894, 14081, 11008, 8448, 5887, 3330, 1790, 1537, 2560, 2047, 2, -2306, -4862, +-8451, -12029, -15107, -16125, -14593, -13313, -12030, -11011, -9981, -9730, -11006, -12546, -12286, -10498, -7678, -4353, +-768, 3072, 6656, 7936, 7424, 7168, 7424, 8192, 8960, 10240, 13311, 16130, 17150, 16642, 14335, 12543, +9730, 5887, 3327, 2563, 2556, 2819, 1536, 509, -763, -3589, -7932, -11778, -14592, -14847, -14592, -14081, +-12287, -10497, -9215, -9728, -11521, -12287, -11777, -10752, -8958, -5891, -1277, 3069, 5634, 6911, 7425, 7679, +7425, 7423, 7681, 10240, 13311, 15361, 16384, 16383, 15617, 13568, 9727, 6401, 4352, 3327, 3073, 2304, +2048, 2047, 258, -3074, -7166, -10754, -13055, -14592, -15360, -14080, -12032, -9984, -9472, -10240, -11008, -11264, +-12031, -11778, -9982, -6146, -1789, 1788, 4100, 6396, 7427, 7679, 6912, 6399, 7938, 10238, 12290, 14077, +15875, 16895, 16384, 13568, 9727, 7426, 5119, 3583, 2562, 2301, 2820, 2557, 257, -2560, -6144, -9216, +-12288, -14593, -15357, -13572, -11771, -10502, -9979, -10243, -10239, -11263, -12289, -12288, -9727, -6658, -2814, -1, +3584, 6400, 7169, 6910, 6402, 6654, 7938, 9214, 11011, 13564, 15876, 16893, 15874, 13311, 11008, 8449, +5631, 3329, 2559, 2816, 3584, 2306, 509, -1277, -4610, -8448, -12030, -14339, -14334, -13312, -12289, -11007, +-9985, -9215, -9985, -11519, -12546, -11517, -9986, -7423, -4353, -511, 3583, 5890, 6397, 6659, 6654, 6913, +7424, 8191, 10497, 13569, 15613, 16388, 15611, 14341, 12029, 8705, 5632, 3583, 3329, 3328, 2816, 2303, +1537, -513, -3838, -8194, -11518, -13315, -13821, -14082, -12799, -11007, -9730, -9215, -10496, -11521, -12030, -11778, +-11006, -8450, -5118, -770, 2818, 4607, 6144, 6912, 6912, 6400, 6656, 7936, 10496, 12800, 14592, 15872, +16127, 15362, 12286, 8961, 6144, 4351, 3330, 2814, 2817, 2815, 2049, -1, -3583, -7424, -10241, -12799, +-14337, -14079, -12801, -11008, -9727, -9729, -10495, -11009, -12032, -12288, -11519, -9217, -5631, -1538, 1026, 4094, +5890, 6655, 6656, 6145, 6397, 7940, 9724, 11780, 14077, 15873, 16385, 15102, 12546, 9726, 7169, 4864, +3584, 2560, 3328, 3327, 2305, 0, -2817, -6142, -9731, -12541, -14338, -14079, -12800, -11521, -10494, -10242, +-9983, -10752, -12289, -12543, -11776, -9472, -6400, -3328, 255, 3585, 5632, 6144, 6144, 5888, 6655, 7426, +8703, 11263, 13570, 15870, 16130, 15103, 13312, 10752, 7681, 5118, 3586, 3327, 3584, 3328, 2305, 767, +-1536, -5120, -8704, -12288, -13310, -13572, -13052, -12035, -10751, -9471, -9730, -11005, -11779, -12287, -11776, -10240, +-7679, -4098, 1, 2817, 4862, 5891, 6140, 6403, 6143, 6656, 8193, 10750, 13057, 15104, 15873, 15357, +14084, 11515, 8197, 5629, 3841, 3840, 3328, 3328, 3071, 1795, -516, -4348, -8196, -11005, -12801, -13824, +-13312, -12032, -10496, -9472, -9984, -10752, -11519, -12033, -12032, -11007, -8450, -4862, -1025, 1793, 4351, 5632, +6145, 6143, 5633, 6399, 7937, 9983, 12545, 14591, 15873, 16127, 14592, 11520, 8961, 6142, 4611, 3836, +3332, 3837, 3586, 2303, 0, -3583, -6913, -9984, -12288, -13568, -13055, -12033, -10495, -9730, -9726, -9984, +-11010, -12028, -12293, -11260, -8962, -5376, -2302, 1022, 3841, 5631, 5889, 5632, 5375, 6146, 7422, 9218, +11518, 14082, 15870, 16130, 14334, 12289, 9472, 6912, 4863, 3585, 3584, 4095, 3842, 2557, 259, -2306, +-5886, -9218, -12286, -13058, -13055, -11776, -10752, -9984, -9471, -9730, -10750, -12290, -12030, -11521, -9215, -6658, +-3069, 508, 3332, 5117, 5633, 5633, 5631, 6144, 6401, 8702, 11011, 13821, 15619, 15869, 14851, 13054, +10240, 7425, 5119, 3841, 4095, 4097, 3838, 3075, 1278, -1279, -5120, -8705, -11263, -12544, -12800, -12288, +-11008, -9984, -8960, -9471, -10754, -11518, -12034, -11518, -9985, -7680, -3584, 0, 2560, 4608, 5377, 5630, +5378, 5374, 5889, 8192, 10497, 13310, 14849, 15615, 15361, 13312, 10496, 7679, 5377, 4351, 4097, 3840, +3839, 3840, 1793, -769, -4351, -7681, -10497, -12285, -12804, -12284, -11012, -9725, -9474, -9470, -10498, -11263, +-12032, -12033, -10749, -7940, -4348, -1028, 1796, 4093, 5379, 5629, 5122, 5119, 5889, 7679, 9986, 12285, +14338, 15616, 15359, 13570, 10750, 8193, 5887, 4609, 3840, 3839, 4353, 3839, 2305, -258, -3581, -6916, +-9980, -12291, -12798, -12290, -11006, -9986, -9470, -9474, -9982, -11010, -12030, -12289, -11009, -8445, -5380, -2044, +1278, 3840, 5121, 5375, 4864, 4864, 5633, 6910, 9474, 11775, 14080, 15872, 15360, 13824, 11520, 8962, +6140, 4868, 4094, 4096, 4610, 4093, 2562, 256, -2561, -6143, -9473, -11775, -12546, -12284, -11269, -10491, +-9732, -9214, -9984, -11009, -12030, -12547, -11261, -9218, -6399, -2816, 512, 3327, 4610, 4862, 4865, 5120, +5120, 6400, 8449, 11261, 13828, 15101, 15362, 14335, 12032, 9216, 6657, 4863, 4353, 4351, 4352, 4097, +3071, 1026, -1794, -5375, -8961, -11007, -12288, -12289, -11774, -10499, -9469, -9219, -9982, -11008, -12033, -12287, +-11777, -10239, -7169, -3582, -3, 2563, 4093, 4867, 4862, 4609, 4608, 6143, 7937, 10751, 13313, 14591, +15617, 14591, 12545, 9728, 7166, 5379, 4861, 4099, 4606, 4609, 3583, 1793, -1025, -4607, -7681, -10495, +-12032, -12290, -11772, -10502, -9466, -9475, -9728, -10751, -11777, -12288, -12287, -10497, -7680, -4352, -767, 1790, +3587, 4861, 4609, 4353, 4606, 5635, 7420, 10244, 12285, 14594, 15615, 14848, 12800, 10496, 7681, 6142, +4611, 4604, 4611, 4863, 4095, 2307, -260, -3581, -6658, -9727, -11520, -12288, -11776, -10497, -9726, -9218, +-9471, -10240, -11264, -12288, -12288, -11008, -8448, -5120, -1791, 1022, 3331, 4605, 4353, 4352, 4352, 5377, +6910, 9218, 11773, 14340, 15100, 15107, 13310, 11009, 8448, 6656, 4863, 4609, 4864, 5120, 4607, 2562, +509, -2556, -6147, -8958, -11010, -11774, -11522, -10750, -9985, -8959, -9217, -9984, -11264, -12288, -12287, -11009, +-8960, -5888, -2304, 513, 3071, 4097, 4351, 4351, 4099, 4861, 6403, 8702, 11519, 13826, 15103, 15104, +13569, 11518, 8962, 6911, 5376, 4864, 4865, 5119, 4608, 3329, 1279, -1791, -5121, -8191, -10497, -11519, +-11521, -10751, -9729, -8959, -8962, -9725, -11011, -12029, -12035, -11518, -9729, -6399, -3329, 1, 2303, 3585, +4351, 4097, 4095, 4353, 5888, 8191, 11010, 13053, 14594, 14848, 13823, 12034, 9469, 7170, 5887, 5121, +4863, 5120, 4609, 3839, 1792, -1022, -4357, -7418, -9732, -11006, -11520, -10755, -9723, -8966, -8697, -9479, +-10490, -11524, -12030, -11777, -9984, -7167, -3841, -511, 1535, 3584, 4098, 4093, 3843, 4093, 5378, 7936, +9983, 12545, 14335, 14849, 14079, 12289, 9982, 7683, 6141, 5123, 4862, 4864, 5121, 4095, 2304, -254, +-3331, -6653, -9219, -11006, -11265, -11008, -9983, -9218, -8702, -9218, -10238, -11522, -12286, -12034, -10750, -7938, +-4605, -1283, 1026, 3071, 3841, 3840, 3583, 4097, 5119, 6914, 9470, 12033, 14079, 14849, 14335, 12545, +10495, 8193, 6400, 5375, 4865, 5119, 5121, 4352, 2559, 257, -2816, -5633, -8959, -10754, -11262, -11008, +-10241, -9214, -8964, -9212, -9987, -11261, -12290, -12031, -11009, -8703, -5633, -2302, 509, 2820, 3324, 3843, +3326, 3841, 4608, 6400, 8703, 11522, 13309, 14596, 14332, 13058, 11008, 8704, 6656, 5376, 5120, 4863, +5379, 4348, 3332, 1021, -2047, -5119, -8193, -10240, -11008, -11263, -10243, -9466, -8711, -8954, -9989, -11260, +-12035, -12286, -11521, -9472, -6400, -3071, -3, 2052, 3068, 3587, 3327, 3583, 4098, 5629, 8195, 10750, +12802, 14334, 14337, 13312, 11520, 8960, 6912, 5888, 5120, 5120, 4864, 4864, 3840, 1793, -1026, -4350, +-7426, -9726, -11010, -11262, -10498, -9471, -8703, -8963, -9469, -10754, -12031, -12543, -12035, -9980, -7172, -3837, +-769, 1279, 2818, 3326, 3329, 3328, 3584, 5375, 7681, 9983, 12290, 14078, 14338, 13822, 11522, 9470, +7681, 5888, 5376, 5120, 5376, 5119, 4097, 2303, -255, -3585, -6656, -9215, -11010, -11005, -10244, -9468, +-8707, -8703, -9471, -10498, -12030, -12545, -12289, -10494, -7682, -4862, -1538, 1026, 2558, 3074, 3071, 3071, +3587, 4860, 6916, 9213, 12034, 13823, 14336, 13824, 12033, 10239, 7936, 6145, 5375, 5120, 5377, 5374, +4611, 2813, 515, -2820, -5628, -8707, -10238, -10753, -10496, -9727, -8706, -8701, -8963, -10238, -11776, -12290, +-12541, -11011, -8446, -5377, -2048, 513, 1790, 3075, 2813, 2818, 3327, 4352, 6145, 8959, 11265, 13311, +14337, 13823, 12545, 10495, 8193, 6655, 5633, 5376, 5631, 5377, 4863, 3585, 1280, -1792, -5120, -8193, +-9726, -10754, -10239, -9471, -8706, -7934, -8962, -9983, -11264, -12288, -12288, -11265, -9215, -5888, -2560, 0, +1791, 2818, 2814, 2817, 3073, 3837, 5891, 8190, 10752, 13058, 13822, 14081, 12800, 11007, 8706, 6909, +5891, 5630, 5634, 5630, 5377, 4095, 1793, -768, -4353, -7167, -9217, -10494, -10243, -9469, -8450, -7935, +-8704, -9729, -11006, -11778, -12542, -11522, -9726, -6146, -3327, -512, 1280, 2304, 3072, 2560, 2815, 3841, +5376, 7679, 9986, 12285, 13827, 14334, 13057, 11263, 9217, 7423, 6145, 5631, 5634, 5885, 5635, 4349, +2306, -256, -3585, -6654, -8963, -10237, -10244, -9468, -8707, -8189, -8451, -9214, -10754, -11774, -12545, -11775, +-9985, -7167, -4096, -1281, 1025, 2048, 2560, 2560, 2560, 3583, 4865, 6912, 9472, 12032, 13567, 14081, +13055, 11522, 9727, 7679, 6401, 5376, 5631, 5890, 5886, 4865, 3072, 255, -2814, -6146, -8446, -9987, +-9981, -9473, -8961, -8190, -8194, -9214, -10499, -11772, -12293, -12025, -10248, -8185, -4870, -1786, 250, 1797, +2300, 2563, 2815, 3071, 4354, 6397, 8964, 11259, 13318, 13562, 13573, 12028, 9987, 7934, 6402, 5886, +5633, 5888, 5632, 5120, 3841, 1022, -2046, -5378, -7934, -9474, -10237, -9732, -8956, -8196, -8189, -8962, +-10238, -11522, -12286, -12034, -11006, -8450, -5631, -2303, -258, 1283, 2045, 2050, 2559, 2560, 4097, 5887, +8448, 11010, 12540, 13572, 13565, 12290, 10239, 8192, 6657, 5886, 5635, 5629, 5890, 5376, 3838, 1283, +-1794, -4863, -7681, -9472, -9983, -9729, -8703, -8194, -7934, -8961, -9983, -11266, -12286, -12033, -11263, -8449, +-5888, -2816, -255, 1280, 2047, 2305, 2302, 2562, 3840, 5631, 7937, 10239, 12289, 13824, 13310, 12291, +10493, 8451, 6910, 5888, 5634, 5628, 6149, 5372, 4099, 1789, -1277, -4354, -7168, -9214, -9988, -9467, +-8964, -8190, -8193, -8448, -9472, -11264, -12031, -12290, -11006, -8962, -6142, -3329, -512, 1024, 2049, 2047, +2305, 2558, 3586, 5120, 7423, 9985, 12287, 13313, 13312, 12544, 10751, 8706, 7166, 5890, 5374, 5889, +5632, 5632, 4352, 2048, -513, -4094, -6915, -8700, -9731, -9471, -9215, -8195, -7933, -8449, -9473, -11005, +-12035, -12030, -11266, -9214, -6658, -3581, -1028, 772, 1789, 2050, 2303, 2559, 3330, 4863, 7424, 9472, +11776, 13055, 13314, 12798, 11009, 8960, 7167, 6145, 5631, 5633, 5888, 5631, 4609, 2559, -255, -3329, +-6398, -8451, -9725, -9730, -8959, -8448, -7936, -8448, -9216, -10496, -11776, -12032, -11520, -9728, -6911, -4099, +-1276, 508, 1795, 2302, 2050, 2301, 3076, 4604, 6658, 9216, 11263, 13057, 13567, 12801, 11263, 9217, +7422, 6146, 5631, 5377, 5887, 5632, 4864, 2817, -1, -2816, -5888, -8448, -9472, -9727, -8962, -8190, +-7939, -8189, -8961, -10240, -11520, -12032, -11776, -9728, -7424, -4609, -1534, 511, 1535, 2050, 2045, 2307, +3070, 4097, 6399, 8705, 11263, 12801, 13311, 12801, 11519, 9473, 7679, 6400, 5377, 5887, 5633, 5631, +4864, 3329, 510, -2301, -5636, -7931, -9221, -9724, -9218, -8448, -7934, -7939, -8958, -9985, -11263, -12033, +-11519, -10241, -7935, -4865, -2047, -1, 1282, 2046, 2050, 2302, 2817, 3840, 5888, 8192, 10752, 12288, +13055, 13058, 11518, 9729, 7937, 6397, 5891, 5374, 5633, 5631, 5121, 3583, 1025, -2048, -4866, -7421, +-9219, -9470, -9472, -8450, -7933, -7939, -8702, -9473, -11007, -12034, -11773, -10755, -8189, -5379, -2557, -4, +1285, 2043, 2308, 2045, 2562, 3839, 5632, 7937, 10238, 12035, 13308, 13060, 11773, 9986, 8191, 6401, +5630, 5378, 5630, 5890, 5119, 3840, 1279, -1534, -4354, -7166, -8962, -9471, -9472, -8449, -7934, -7938, +-8191, -9729, -10752, -11775, -11776, -10754, -8445, -5892, -2811, -517, 1028, 2045, 2050, 2303, 2560, 3585, +5119, 7423, 9731, 12028, 12804, 12797, 12033, 10241, 8190, 6659, 5629, 5634, 5630, 5634, 5375, 4097, +1791, -769, -4093, -6915, -8446, -9474, -9214, -8705, -7936, -7679, -8194, -9470, -10753, -11520, -11776, -10751, +-8962, -6397, -3332, -765, 767, 1792, 2049, 2302, 2562, 3326, 4866, 7166, 9474, 11518, 12802, 13054, +12290, 10494, 8450, 6910, 5890, 5631, 5375, 5634, 5374, 4353, 2305, -515, -3581, -6146, -8447, -9472, +-9473, -8703, -7936, -7680, -8192, -8961, -10239, -11520, -11776, -11265, -9215, -6657, -3839, -1024, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, +-513, -1022, -1026, -1022, -1026, -1535, -3329, -3326, -3331, -3324, -3845, -6139, -4357, -508, 3838, 8449, +7167, 6144, 6145, 7166, 10244, 7931, 5636, 5630, 5632, 8449, 7935, 3840, 3841, 2814, 2819, -515, +-8958, -9474, -5119, 2816, 8961, 3838, -2815, -7169, -8959, -6144, -9473, -11774, -11268, -11771, -8964, -10750, +-15360, -11777, -8959, -5633, -7934, -15875, -14589, -4354, 8448, 21506, 19198, 11777, 8959, 9473, 17664, 17664, +13568, 13055, 10241, 12544, 13567, 8449, 10240, 10752, 10239, 2817, -11777, -16383, -10241, 2818, 13053, 7171, +-5123, -14590, -18177, -11775, -13569, -15359, -13569, -15359, -13569, -13568, -19199, -13568, -7168, -3329, -5631, -16897, +-18687, -8448, 7167, 23298, 22014, 13057, 8448, 7167, 16897, 19200, 15359, 14594, 11262, 11777, 14592, 9471, +10242, 12541, 11267, 4350, -10751, -17664, -11777, 512, 13058, 8958, -3327, -13569, -18176, -12542, -13058, -15871, +-13569, -15360, -14079, -13568, -19201, -15359, -8449, -4352, -5119, -16384, -19714, -10237, 4349, 21507, 23293, 14082, +8959, 6657, 15360, 19198, 15363, 14589, 11779, 11261, 14594, 10240, 10239, 12545, 11263, 6144, -8446, -17666, +-13055, -1537, 11265, 10239, -2046, -11778, -18686, -13571, -12540, -16388, -13564, -15364, -15357, -13058, -18686, -16386, +-8958, -5122, -3839, -14080, -19713, -11774, 1534, 19202, 23806, 15361, 10240, 6143, 13570, 19198, 15874, 15358, +13057, 10752, 14592, 11264, 8960, 12544, 11263, 7171, -6148, -16380, -13571, -3838, 9471, 11264, 0, -10240, +-18176, -14591, -11778, -16382, -13570, -14079, -15359, -12546, -17662, -17665, -10240, -6144, -3840, -12544, -19712, -13568, +-512, 15871, 24322, 16893, 11267, 7166, 11777, 19200, 15871, 15362, 13565, 10243, 13566, 11778, 8958, 11778, +11261, 8452, -3844, -15869, -14082, -6142, 6654, 11777, 1535, -7934, -16386, -15870, -11778, -16383, -14080, -13569, +-16382, -13058, -16382, -18179, -10748, -7940, -4349, -10754, -19198, -14082, -2815, 12544, 23296, 17664, 11776, 7935, +10242, 18686, 15873, 15872, 15359, 10754, 13054, 13058, 8958, 11777, 11264, 8448, -1536, -14079, -13569, -7168, +3840, 11263, 3843, -6147, -15357, -16387, -11775, -15871, -14082, -12542, -16385, -13568, -15360, -18176, -11264, -8448, +-5632, -8960, -18177, -14590, -4354, 8450, 22014, 19201, 13568, 10240, 9472, 17665, 16381, 14597, 15866, 10757, +11262, 13568, 9473, 11262, 11266, 8447, 513, -11777, -13569, -7933, 508, 10244, 5117, -3838, -11778, -16894, +-12546, -15870, -15361, -11264, -16384, -15360, -13568, -18176, -12543, -8962, -7166, -7938, -16382, -14593, -5632, 5632, +19200, 19200, 14080, 11264, 8448, 15872, 15872, 14591, 17665, 12544, 10240, 14080, 10240, 11263, 11778, 8446, +2050, -10242, -12543, -7935, -2051, 7172, 6141, -1535, -8959, -16386, -13567, -15359, -16386, -10750, -15361, -16897, +-13566, -16898, -13054, -8961, -8961, -7935, -15360, -15360, -6144, 2048, 15871, 19202, 15357, 14084, 9468, 14596, +16381, 13569, 18176, 14080, 8448, 13056, 11264, 11264, 12543, 7938, 2814, -7934, -11778, -7167, -4351, 3838, +6147, -3, -6142, -15361, -14080, -15359, -16896, -10241, -13567, -18690, -13566, -16385, -13567, -8961, -10751, -8962, +-13565, -14595, -6142, -1, 11264, 18689, 15358, 15874, 11262, 12547, 15868, 12548, 18172, 16899, 8448, 11263, +11777, 11263, 13056, 8449, 3328, -6145, -10751, -5632, -4354, 3, 5117, 514, -3329, -12543, -15363, -15356, +-18180, -10749, -10753, -19712, -15872, -15360, -13568, -8960, -11263, -10241, -12544, -14079, -5634, -509, 6653, 15873, +15361, 17662, 14083, 11261, 14593, 11265, 16895, 19713, 9471, 9473, 12543, 11264, 13569, 8447, 2817, -4353, +-8961, -3838, -3329, -3327, 2046, 1026, -514, -8445, -14595, -15357, -19203, -11773, -7938, -19200, -18175, -14081, +-13567, -8449, -11775, -12545, -12544, -13567, -5122, 2, 2815, 11777, 14591, 17665, 17662, 12546, 13567, 10752, +14593, 22015, 11776, 7169, 11263, 11776, 14593, 10239, 2817, -3840, -7937, -2047, -1024, -5121, -1534, -2, +1, -4352, -13569, -15358, -19713, -14592, -6145, -16382, -20994, -15357, -13572, -7933, -10754, -14590, -13570, -13566, +-5122, 1025, 512, 7167, 11778, 16894, 20482, 14590, 12545, 10241, 12541, 22788, 15868, 6659, 10238, 12545, +14592, 11775, 2818, -3843, -7933, -1027, 2051, -5122, -5631, -2049, 1025, -1, -9470, -15363, -19709, -16387, +-5629, -13057, -22017, -16895, -13057, -7936, -8958, -16387, -15869, -13571, -5117, 3324, 516, 2813, 8451, 15358, +22017, 18174, 13059, 8957, 10243, 21502, 19712, 7169, 7167, 11264, 14594, 13564, 3844, -4355, -7935, -511, +5631, -2817, -8958, -6147, 3, 2815, -5121, -14079, -20480, -19201, -6655, -8960, -22017, -20479, -13568, -7169, +-7166, -15875, -18685, -15362, -5631, 5120, 2815, -1022, 3326, 11777, 22016, 22015, 14082, 7933, 7171, 19198, +23297, 10751, 5633, 10751, 15873, 15872, 5631, -5119, -8449, -511, 8447, 1538, -10755, -11261, -3331, 3843, +-3, -10748, -19716, -20989, -8962, -6142, -19203, -23293, -15362, -6655, -5631, -14084, -20987, -18180, -6653, 6141, +5635, -1539, -1532, 7932, 20994, 25087, 18177, 8447, 5121, 15359, 25088, 15361, 5119, 7168, 14593, 16895, +8448, -4351, -10754, -2046, 10239, 7168, -8959, -16386, -7933, 3324, 3844, -6147, -18686, -22785, -11775, -4354, +-15357, -24323, -18686, -7936, -4354, -11260, -22022, -22010, -8964, 6658, 9472, -2, -6141, 1021, 17667, 26621, +22786, 9472, 3328, 11775, 24322, 19709, 7171, 5631, 14080, 18176, 11265, -2050, -11773, -4355, 10754, 12543, +-3839, -18689, -14079, -2, 6147, -515, -15869, -23811, -15357, -4355, -10750, -23296, -22785, -8959, -2817, -8960, +-20480, -25599, -13058, 5634, 13054, 3841, -8448, -5120, 13056, 26624, 27135, 13570, 2046, 7938, 21503, 22784, +10752, 2816, 10752, 18177, 14078, 514, -13058, -8446, 9470, 16385, 2816, -18176, -20992, -4352, 6143, 4354, +-10753, -23809, -17662, -6146, -7933, -19715, -25598, -13058, -2046, -6144, -18177, -27903, -18178, 2819, 14589, 8451, +-7170, -11263, 6144, 23295, 29441, 19200, 2816, 5120, 18175, 23810, 15358, 3841, 7936, 17663, 15874, 3838, +-11775, -11264, 7167, 18690, 9470, -13567, -25600, -10753, 3842, 7933, -4349, -22018, -20479, -8961, -6655, -15361, +-25599, -16897, -2048, -3839, -14593, -27134, -23299, -509, 14589, 13059, -3330, -15358, -1026, 19201, 30207, 25089, +5632, 2816, 14591, 22785, 19200, 6143, 4354, 15869, 16899, 7166, -8959, -14592, 3327, 19201, 14591, -7167, +-26625, -17663, 510, 8451, 1021, -18686, -20993, -10752, -7167, -11778, -23805, -21508, -4347, -2822, -11258, -25605, +-27133, -6145, 13569, 15870, 1538, -15362, -7934, 13568, 28414, 28930, 9471, 1024, 11265, 20479, 21504, 10241, +2814, 13571, 17661, 10242, -5633, -15872, -1023, 17663, 19200, 1, -25090, -23805, -4356, 7173, 6139, -13564, +-22787, -13566, -8449, -10240, -20991, -24321, -7935, -1537, -8960, -22783, -30209, -11263, 11264, 17663, 7170, -13570, +-13567, 7936, 25088, 31231, 14595, 1020, 8451, 18174, 22017, 14080, 3328, 10751, 17666, 11774, -1534, -15874, +-4351, 15873, 20990, 6658, -20481, -27136, -9471, 5118, 8450, -8449, -20991, -14081, -8960, -8960, -17664, -25600, +-11264, -1536, -6656, -19200, -30721, -16383, 8448, 18176, 11264, -10240, -16897, 2050, 21502, 31745, 19200, 2815, +6658, 15870, 20994, 17661, 4355, 7934, 16898, 13055, 1023, -14591, -8960, 13056, 21504, 11264, -15360, -28928, +-14592, 1536, 10240, -3327, -20482, -15869, -10755, -9470, -14593, -25600, -15358, -2051, -5629, -16387, -30205, -20994, +4352, 17665, 14079, -5631, -18689, -2815, 17663, 31232, 23297, 3838, 5635, 14589, 20482, 19199, 6656, 6657, +16383, 14593, 3839, -13055, -11265, 10241, 22016, 14591, -10238, -28931, -18173, -514, 9473, 0, -18177, -16383, +-10752, -9472, -13056, -23809, -17663, -3329, -4350, -13570, -28416, -23806, 1021, 16899, 15870, -1536, -18687, -6145, +14594, 29438, 26625, 6143, 3841, 13056, 19200, 20480, 8448, 5119, 14594, 14590, 5634, -10753, -13569, 6658, +20991, 17664, -6143, -28418, -20990, -3329, 8960, 2817, -16898, -18174, -10754, -9470, -11778, -23293, -20484, -4349, +-3841, -11777, -27134, -27138, -2814, 15870, 16897, 1024, -18176, -8960, 12544, 28415, 28418, 8446, 3330, 12541, +19203, 20990, 10240, 3843, 14587, 15877, 7932, -8958, -14592, 3839, 20481, 18688, -2817, -27134, -22787, -4350, +8448, 4351, -15358, -19202, -11264, -9471, -10753, -22015, -22016, -5634, -3325, -10756, -25596, -28419, -5630, 14592, +17662, 3330, -16386, -10749, 11261, 27907, 29437, 10242, 2048, 11262, 19203, 21501, 11266, 2815, 13056, 16385, +8958, -6654, -15874, 1026, 19198, 19202, -2, -25598, -23298, -5119, 7937, 5630, -14589, -20484, -11773, -8961, +-10752, -21503, -23810, -6653, -2819, -9470, -23809, -29440, -8447, 13056, 17663, 4354, -15875, -11773, 10238, 26626, +30718, 11266, 1533, 10755, 19198, 22017, 11263, 2817, 13055, 17666, 10749, -5118, -16384, -1025, 17667, 19196, +1027, -24322, -23806, -5122, 7170, 6143, -13568, -22016, -13056, -7937, -10238, -20994, -24319, -7936, -2049, -8958, +-23300, -30202, -10759, 11783, 16890, 5636, -14082, -11263, 10752, 27135, 31234, 12541, 1027, 10238, 20481, 22784, +11775, 2049, 11264, 17663, 11266, -3330, -16383, -3328, 16384, 19199, 1027, -23300, -22780, -3844, 7940, 5629, +-13566, -22784, -13058, -6654, -9473, -21504, -25598, -8963, -1535, -8447, -22785, -30208, -11775, 10237, 15876, 5629, +-13054, -10754, 11266, 27134, 30210, 13055, 1024, 10240, 20993, 22782, 11267, 2044, 11268, 18173, 12545, -2815, +-15874, -4350, 14591, 18175, 1026, -22018, -22013, -3332, 7172, 5628, -13564, -23812, -14588, -6149, -8954, -21509, +-25597, -9474, -1535, -8448, -21504, -28928, -13568, 8448, 15359, 5122, -11266, -8959, 12544, 27136, 29440, 13056, +1023, 9473, 22017, 23294, 10754, 2046, 11266, 18686, 13058, -1539, -14588, -6147, 12546, 16383, 512, -20480, +-19712, -1535, 7935, 3841, -14081, -23808, -14591, -5121, -8959, -22785, -25087, -10753, -2047, -7937, -20991, -27905, +-14079, 5632, 13567, 3842, -8963, -6141, 13053, 27140, 27900, 13059, 2046, 8960, 22786, 23294, 10241, 2815, +10753, 18175, 13570, -514, -13567, -7168, 10239, 14594, -2, -18174, -17666, -1023, 7168, 2047, -14078, -23810, +-15871, -4352, -8961, -22782, -24322, -11262, -3329, -7936, -20479, -26113, -15359, 3327, 11265, 3328, -6657, -3327, +14079, 26625, 26623, 13058, 3325, 9476, 23291, 23300, 9470, 3841, 11265, 18173, 14082, 0, -11776, -7937, +7170, 12541, -1021, -15873, -14081, 2, 6654, 1, -14079, -22786, -16382, -4353, -9472, -22783, -22785, -11776, +-4351, -8448, -19713, -23807, -15361, 513, 8960, 2815, -4352, 1, 14592, 26623, 24321, 13054, 5634, 9472, +22782, 22018, 8446, 3842, 10240, 16894, 14082, 1022, -9470, -8449, 3841, 10238, -1533, -13572, -10747, -4, +5634, -1536, -14593, -21503, -16897, -5119, -9472, -22784, -21504, -13057, -6143, -8449, -18687, -22016, -15361, -2047, +6655, 1537, -1536, 3327, 14593, 25087, 22017, 13056, 7167, 10241, 22015, 22017, 8448, 6143, 11265, 15871, +14081, 2048, -7169, -8447, 1024, 7167, -2814, -10754, -7935, 513, 3837, -3836, -14083, -20478, -17665, -6144, +-10241, -22782, -20482, -13566, -7937, -8448, -17665, -19711, -15361, -5630, 3838, 1026, 1022, 7169, 15359, 24321, +20479, 13571, 9468, 10243, 21502, 20993, 8449, 7166, 10754, 14591, 13568, 2817, -5121, -8448, -2047, 3838, +-3325, -7940, -4347, 507, 2820, -5635, -14079, -18687, -18177, -6655, -10753, -21503, -18690, -14589, -9475, -8957, +-16386, -17664, -15359, -8449, 1024, 513, 2815, 10240, 15362, 22012, 19205, 13051, 11269, 10747, 20484, 20478, +8448, 8449, 11263, 13568, 13570, 3836, -3323, -7941, -5116, 1022, -3328, -5119, -1025, 512, 1026, -7172, +-14076, -16899, -18174, -8449, -10752, -20991, -18177, -15359, -11266, -8958, -15361, -15359, -15361, -11264, -1024, 1, +5118, 13059, 15868, 21508, 17662, 13568, 14080, 11264, 19200, 19201, 8447, 9472, 11264, 12544, 13056, 5120, +-1023, -7170, -7935, -1535, -3842, -3325, 1532, 1028, 508, -7932, -13571, -15358, -18178, -9470, -10754, -19710, +-16386, -15359, -13568, -9473, -14590, -13571, -14589, -13570, -3839, 0, 6654, 15876, 15867, 19717, 16379, 13060, +15869, 12546, 17663, 18688, 8960, 10752, 11263, 11266, 13055, 5632, 1024, -6145, -9471, -4352, -4352, -1536, +3840, 1023, -1022, -8962, -14079, -14080, -18176, -11776, -11264, -19712, -15872, -15360, -15360, -10752, -13568, -11775, +-14082, -15358, -6658, -1022, 7934, 17666, 16894, 18690, 15358, 13058, 16893, 13060, 16381, 17666, 10238, 11265, +12544, 10240, 12544, 6656, 2815, -5118, -11266, -6655, -5119, -2, 6658, 1534, -1534, -9473, -13567, -12546, +-16893, -12547, -11774, -18177, -14592, -15360, -16383, -11265, -13056, -10751, -13571, -16892, -8963, -1534, 8447, 19712, +17663, 17666, 14590, 13058, 18175, 14591, 15873, 16896, 10239, 11778, 13055, 8959, 11266, 7166, 3842, -3329, +-12544, -8960, -6143, 1023, 8448, 2817, -2818, -10238, -14593, -11776, -16384, -14080, -11776, -18177, -14589, -15364, +-18172, -11779, -12543, -10240, -11776, -18176, -11776, -3328, 8447, 20994, 18685, 15875, 14078, 12545, 19200, 15870, +14595, 16381, 10755, 13053, 13571, 8958, 11264, 8449, 5631, -1535, -13056, -11778, -6652, 1019, 10246, 3834, +-2811, -10244, -14077, -10754, -15359, -15360, -12544, -16897, -13567, -14080, -18689, -13055, -11776, -8962, -11260, -18692, +-14078, -4352, 8446, 22019, 19709, 15874, 13566, 11779, 19197, 16898, 14590, 15361, 10752, 12544, 14081, 8445, +10244, 8444, 5635, -513, -13056, -13567, -7938, 1026, 10750, 5634, -3329, -10752, -14592, -10752, -14592, -16385, +-13566, -16386, -13566, -13570, -19199, -14592, -11776, -8959, -10242, -18687, -16384, -6145, 7171, 22012, 20996, 15356, +13059, 11262, 19202, 18174, 14594, 14590, 11265, 13055, 14594, 8958, 9474, 8446, 7169, 1024, -11776, -15360, +-8959, 510, 11266, 7167, -3329, -10237, -14596, -10236, -13571, -16383, -14080, -16384, -13568, -13056, -19712, -15361, +-11773, -8965, -8954, -18182, -18171, -7940, 6147, 22014, 22018, 15869, 13060, 11259, 19206, 19194, 14085, 14076, +11267, 12542, 15361, 8960, 8447, 8961, 7167, 2817, -11265, -16383, -10753, -511, 11263, 8449, -2049, -9471, +-15361, -10239, -12545, -16383, -14594, -15869, -13571, -11774, -19202, -16382, -12545, -8960, -7936, -17665, -19198, -9473, +4352, 21504, 23296, 15871, 13059, 10236, 18179, 20479, 14590, 14084, 11260, 12547, 15869, 10243, 8445, 8962, +7936, 3839, -9471, -16897, -11775, -1538, 11268, 10235, -1532, -8962, -15359, -10753, -11262, -16388, -15354, -15878, +-14075, -11779, -18688, -18174, -12546, -8959, -7168, -16385, -20478, -11266, 2817, 20480, 25087, 16385, 13057, 10237, +17667, 21502, 15361, 13567, 11265, 11776, 15871, 10753, 7935, 8961, 7935, 5634, -7939, -17661, -13570, -3327, +10240, 11264, -1, -7935, -14592, -11264, -10752, -16385, -15870, -15874, -14591, -11264, -18177, -18687, -13568, -10241, +-6655, -15360, -20994, -13566, 512, 18175, 25602, 17661, 13058, 10239, 15873, 21504, 15871, 13569, 11775, 11264, +15873, 11263, 7169, 8959, 7936, 6144, -5632, -16895, -14594, -5117, 8444, 13059, 1022, -7935, -14592, -12544, +-10240, -15873, -16383, -15873, -15358, -11266, -16383, -19712, -13569, -10750, -6658, -13567, -20992, -14592, -1537, 15874, +26110, 19201, 13569, 10749, 14595, 22014, 16897, 13568, 12543, 11265, 15871, 13058, 7933, 8962, 8447, 7169, +-3328, -16385, -15360, -6655, 6654, 13059, 2813, -6142, -13569, -13056, -8960, -15360, -16383, -15362, -15358, -11265, +-15360, -19712, -14592, -11264, -7168, -11776, -20480, -16384, -3328, 13056, 25088, 19712, 14081, 11261, 13060, 21501, +17666, 13567, 13055, 10754, 14590, 13571, 7932, 8964, 7933, 7170, -1536, -15362, -15869, -8451, 3842, 13056, +4351, -5120, -12542, -14084, -9467, -14596, -16382, -15361, -16383, -11777, -14079, -19713, -15359, -11777, -7934, -10756, +-19708, -16899, -5630, 10239, 24321, 20990, 14595, 11773, 12546, 20479, 18689, 14078, 14084, 11259, 14085, 14587, +8452, 8957, 8450, 7168, 1023, -13056, -15871, -8961, 1025, 12544, 6654, -3324, -10757, -14075, -9477, -13564, +-16386, -14591, -16384, -13057, -13055, -19713, -15360, -12542, -8963, -9468, -18693, -18172, -7171, 6659, 22013, 22018, +15871, 13056, 11266, 19196, 19204, 14077, 14593, 11265, 12542, 15363, 8957, 8449, 8449, 6141, 2054, -11272, +-15353, -10244, -1023, 10753, 8446, -1534, -8449, -14592, -10752, -12544, -16383, -13570, -16381, -14595, -12541, -18691, +-16382, -13056, -10753, -8958, -16899, -18173, -8451, 3331, 19197, 22787, 16382, 14592, 11265, 17663, 19201, 14592, +15359, 13057, 11263, 15362, 10237, 8963, 9470, 6145, 3328, -8961, -14591, -10240, -3328, 7935, 8962, -3, +-6140, -13572, -11772, -11780, -16380, -13572, -15356, -16387, -11775, -17664, -16385, -12542, -11778, -8958, -15363, -18172, +-8964, 1027, 15870, 22785, 17664, 15872, 12543, 15874, 19709, 14595, 15358, 14080, 10242, 14077, 11267, 8445, +10243, 5629, 3331, -6658, -14079, -9472, -5121, 4353, 8960, 1023, -3839, -11777, -12543, -11777, -16383, -13570, +-13565, -17667, -13053, -16387, -16893, -11778, -13567, -10240, -14081, -18174, -9474, -1023, 11264, 21503, 17666, 16894, +14082, 14077, 19203, 14589, 15875, 15870, 10241, 13056, 12543, 8962, 11261, 6148, 2812, -4349, -12545, -8961, +-5630, -2, 7937, 2048, -1536, -8961, -13566, -11778, -16383, -13568, -11777, -18175, -15360, -15361, -16895, -11777, +-13567, -11777, -13567, -17665, -10240, -2046, 7165, 19203, 18173, 18179, 16381, 13060, 18171, 14598, 14586, 17669, +10748, 10755, 13054, 9473, 11775, 7170, 2813, -3325, -11266, -7936, -5118, -2051, 5634, 2816, -1, -5631, +-13569, -11776, -16384, -14080, -10240, -17663, -16385, -14080, -16384, -11776, -13568, -14079, -13058, -16382, -10241, -2049, +3331, 14589, 17665, 17665, 19198, 13570, 15871, 14591, 14082, 19198, 13058, 8958, 12545, 10240, 12544, 8959, +2050, -2818, -10239, -6656, -3328, -4352, 2048, 2816, 511, -2045, -11780, -13564, -16387, -15870, -8962, -15870, +-19713, -15359, -16385, -11264, -11776, -15872, -14080, -16383, -10753, -1536, 1024, 10239, 15874, 17663, 21504, 15873, +14590, 14082, 13055, 20480, 15873, 8447, 11264, 10752, 13057, 11262, 2051, -2819, -8959, -6143, -514, -4349, +-2052, 1028, 1021, 1026, -8449, -13568, -16385, -16382, -7938, -12542, -20993, -16385, -15359, -11264, -10752, -16384, +-15871, -15874, -10750, -514, 513, 5633, 13054, 15874, 22782, 18689, 14080, 13056, 11264, 19199, 19714, 8445, +8452, 10236, 13059, 13566, 3841, -3328, -8449, -5630, 1534, -3326, -5634, -1534, -2, 2817, -4352, -13568, +-16895, -18178, -8958, -8962, -20479, -19711, -15874, -11262, -8449, -16385, -18686, -16385, -11264, 513, 1534, 1538, +8447, 14080, 22784, 22785, 14591, 11777, 10239, 18176, 23297, 11263, 7169, 9472, 13056, 15359, 6145, -3841, +-8447, -5632, 3839, 514, -7939, -6141, -1538, 3841, 0, -10752, -16897, -19198, -10242, -6142, -18178, -22015, +-16896, -11264, -7167, -14082, -20990, -18690, -11774, 1023, 3840, 0, 3328, 10239, 21506, 25598, 17666, 11262, +8449, 15360, 24320, 15872, 5632, 7168, 11776, 15872, 9472, -3329, -9470, -6146, 5122, 5118, -6655, -10752, +-5121, 3842, 3838, -6655, -16896, -20992, -12544, -4353, -14078, -23810, -19711, -11775, -6147, -11260, -20996, -22013, +-13570, 514, 6654, 514, -1538, 5633, 18688, 27135, 22018, 11261, 6659, 12542, 24321, 20480, 7167, 4354, +11261, 17667, 13054, -1023, -10752, -7936, 5119, 9474, -3330, -13567, -10752, 1024, 7168, -1535, -15362, -21502, +-15362, -4350, -9474, -22782, -23298, -13566, -5122, -8446, -19714, -25086, -16385, 0, 8960, 3329, -4354, -509, +14589, 27137, 26625, 14591, 5120, 8961, 22013, 23812, 10749, 2818, 7934, 16898, 15358, 2051, -11780, -10748, +3837, 13057, 2048, -14080, -16384, -2816, 7167, 3840, -10751, -22784, -17665, -5631, -6146, -19710, -25601, -16383, +-5121, -6143, -16385, -26623, -20993, -2815, 10751, 7169, -3841, -6654, 8445, 25091, 29437, 19202, 5120, 5631, +19201, 25599, 15873, 2815, 5121, 15870, 16899, 6141, -10237, -13571, 1538, 14591, 8449, -10753, -20991, -8961, +5632, 7169, -5121, -21503, -20481, -7936, -4352, -15360, -26623, -20993, -6144, -3840, -13056, -26112, -25598, -6147, +10754, 11264, -1026, -10749, 1022, 20992, 30723, 24315, 7172, 3326, 15873, 25599, 20481, 5631, 1536, 13570, +18173, 10242, -6656, -15873, -1535, 14592, 13566, -5117, -22786, -15358, 2814, 8961, 1023, -18175, -22016, -10240, +-3841, -10750, -24324, -25083, -8965, -2810, -9478, -23803, -28933, -11260, 8958, 14082, 2814, -11774, -6147, 15363, +28926, 28929, 11265, 1022, 11777, 23296, 23295, 10242, -2, 10242, 17662, 13058, -2818, -16383, -6144, 13568, +17664, 1536, -20992, -22016, -2816, 8448, 6143, -13055, -23808, -13568, -5120, -7937, -20478, -27907, -13053, -2817, +-7169, -19709, -30724, -16381, 6655, 15872, 7937, -10241, -11776, 8448, 26113, 31743, 16384, 1537, 8958, 20995, +24318, 14591, 1027, 6652, 17669, 14587, 1540, -15363, -10238, 11264, 19197, 8453, -16389, -25595, -8453, 5636, +8957, -7165, -22786, -15360, -6143, -6146, -16382, -28417, -16896, -3327, -5634, -16382, -30210, -22014, 2815, 15872, +11776, -6143, -15874, 2051, 22013, 31746, 22015, 2817, 5630, 18179, 23805, 19202, 3328, 3327, 15361, 15359, +5633, -12544, -13569, 7170, 19197, 13059, -10753, -27905, -14590, 2814, 10240, -1533, -20485, -17658, -7941, -6142, +-12544, -26625, -20991, -5632, -4353, -13055, -28416, -26114, -1532, 14587, 14598, -1542, -16891, -3844, 17667, 30718, +26626, 6141, 4355, 15870, 22784, 21507, 6650, 2054, 14076, 15874, 8448, -9473, -15359, 3839, 19201, 16383, +-4351, -26625, -19199, -1025, 8961, 2814, -17662, -18177, -8959, -6657, -10240, -23808, -23807, -7169, -3839, -10754, +-25598, -28418, -6141, 13054, 15872, 2816, -16384, -8959, 13055, 27904, 29440, 9472, 2817, 13567, 20991, 22786, +10239, 1024, 11265, 15870, 10241, -6142, -16387, 2, 17663, 18688, 1025, -24321, -22784, -4351, 7167, 5634, +-14084, -19707, -10757, -7163, -8964, -20989, -26114, -10239, -3841, -8959, -22784, -30209, -10750, 11261, 16899, 6141, +-14077, -11778, 8960, 25601, 30718, 13059, 2814, 12545, 20479, 23297, 13055, 1026, 10238, 15874, 11262, -3326, +-16386, -3326, 15871, 19200, 5120, -21504, -25088, -7168, 6145, 7934, -10750, -20482, -11262, -7169, -7936, -19200, +-27136, -11776, -3839, -7938, -20478, -30722, -14590, 8958, 16899, 8956, -11772, -14596, 6147, 23807, 31232, 15872, +2048, 10240, 19200, 23296, 15360, 1024, 7936, 15873, 12542, 2, -16386, -6143, 14081, 19711, 7936, -19199, +-26627, -8956, 5118, 8448, -8447, -20994, -12541, -7171, -7166, -17666, -27133, -14083, -3838, -6658, -18174, -30721, +-17664, 6656, 16384, 10752, -10240, -15873, 3841, 22784, 31743, 18178, 2813, 8962, 19200, 23295, 16385, 1535, +6657, 15872, 13568, 1535, -15359, -8448, 12288, 19712, 9471, -16382, -27138, -10749, 4348, 8963, -6657, -21504, +-14079, -7169, -6656, -16383, -27649, -16384, -3839, -6145, -16895, -30465, -19712, 4353, 16383, 11265, -7937, -16383, +3328, 22016, 32256, 20223, 2818, 7934, 19202, 23806, 17410, 2046, 4866, 15870, 14593, 3328, -14593, -10750, +9981, 19716, 10747, -15099, -27140, -10749, 4349, 9475, -5635, -21501, -15107, -6142, -6144, -15874, -28413, -17412, +-3836, -5634, -16384, -29950, -22019, 2818, 15871, 11265, -6657, -15871, 2815, 22017, 31744, 20991, 2817, 6655, +19201, 24319, 17410, 2045, 3843, 15869, 15363, 4350, -13568, -12287, 8447, 19201, 10751, -13567, -26626, -10749, +4861, 9474, -4866, -22525, -16899, -6653, -6148, -15100, -28419, -19197, -4354, -4865, -15101, -29956, -23292, 1021, +14594, 11262, -5630, -14594, 3330, 23294, 32257, 21504, 2816, 6144, 19200, 24832, 17408, 2048, 3840, 16384, +16384, 5632, -13056, -13568, 6656, 18175, 9985, -13056, -25345, -9470, 5629, 8963, -4865, -22529, -17406, -6146, +-5118, -15873, -28416, -19200, -4351, -4353, -15360, -28927, -23810, 3, 13566, 10752, -4351, -13057, 3841, 23295, +31232, 21504, 3840, 5633, 19198, 25602, 17661, 2819, 3327, 15872, 16384, 5631, -11774, -13570, 4355, 16892, +8963, -12289, -23808, -8959, 6142, 8450, -5633, -22783, -19201, -6656, -4351, -16385, -27903, -19713, -5119, -4352, +-15362, -28413, -23812, -3323, 11772, 9475, -3843, -10749, 5629, 24323, 31230, 20992, 4354, 5629, 19203, 26110, +16896, 2817, 3839, 15873, 17663, 6145, -10753, -13568, 2817, 15358, 7939, -11778, -20992, -7168, 7169, 7166, +-6652, -22021, -19196, -6147, -4349, -16388, -27130, -19718, -6139, -4356, -15358, -27136, -22784, -4353, 10242, 8446, +-3327, -7168, 7167, 24322, 30206, 19713, 5632, 5632, 19201, 26110, 15874, 3326, 4355, 14589, 17666, 6654, +-9470, -13570, 3, 13053, 6146, -10754, -17662, -6146, 6659, 5629, -7934, -20993, -19712, -7167, -4353, -17664, +-25599, -19202, -7933, -5635, -15358, -25601, -22784, -7168, 7168, 6657, -2049, -3328, 8449, 24318, 28418, 19199, +7168, 7168, 19200, 26112, 14592, 3841, 5630, 14594, 16895, 6656, -7935, -11778, -1534, 10240, 4350, -10238, +-13569, -4353, 6147, 3836, -8956, -19715, -19710, -7938, -5118, -18178, -24319, -18687, -8963, -6140, -15365, -23803, +-20995, -8959, 5120, 5632, -1537, 2, 10238, 23810, 27134, 18177, 8960, 7935, 17667, 24828, 14083, 5118, +6656, 13058, 16382, 7170, -6147, -10749, -4354, 7169, 2816, -8961, -10238, -3330, 5633, 2816, -9473, -18173, +-19204, -8957, -5633, -18177, -22782, -18178, -10750, -6657, -15360, -22016, -19712, -11265, 1538, 3838, 3, 3836, +11267, 22782, 25602, 16894, 11266, 8958, 16898, 24318, 13569, 6143, 8450, 12285, 15876, 7162, -4345, -8966, +-6141, 3841, 1020, -7932, -6146, -1536, 4354, 1020, -10747, -16389, -18683, -10756, -6143, -18174, -21508, -16892, +-12290, -7936, -15359, -20482, -18174, -13057, -1023, 2046, 1027, 7164, 13060, 22013, 24322, 15872, 13054, 10242, +15870, 23298, 13055, 7168, 8961, 11262, 15361, 7168, -2816, -7167, -7938, 513, 0, -6144, -3327, -2, +3330, -2, -10749, -15364, -18171, -11781, -7164, -18179, -19710, -16385, -14080, -8959, -14593, -18687, -16385, -14592, +-4352, 1025, 1535, 10241, 14591, 20480, 22784, 15361, 14591, 11777, 15358, 21507, 13052, 8453, 10236, 10754, +14079, 7168, -1023, -5633, -8959, -2817, -1535, -5121, 1, 1023, 2049, -1537, -11775, -13569, -17663, -13569, +-8447, -17665, -19199, -15872, -15873, -10750, -14083, -16893, -15362, -16383, -7167, -515, 2819, 13054, 16385, 19713, +21502, 14593, 15871, 13570, 14590, 20481, 13055, 8960, 11777, 10239, 13056, 7937, 510, -3838, -10242, -6142, +-3329, -4351, 2814, 2817, 1025, -2050, -11773, -12292, -16381, -14593, -8960, -16896, -18176, -14593, -16382, -11777, +-13568, -15872, -13568, -16896, -10752, -2047, 2814, 14595, 17660, 18692, 19709, 14594, 16383, 15361, 14078, 18691, +13053, 10242, 13056, 9470, 11267, 7933, 1538, -2049, -10752, -8447, -4354, -3326, 4350, 3842, -1, -3327, +-11778, -11774, -15361, -15872, -10750, -16388, -16891, -13573, -17660, -13570, -13568, -15358, -13059, -17662, -13056, -3841, +2818, 15870, 19201, 18175, 19201, 14079, 17666, 16893, 14083, 17660, 13060, 10749, 14082, 9471, 10752, 8448, +2816, 0, -10752, -10752, -6145, -3326, 6142, 5633, -1, -3839, -11776, -10752, -13569, -16382, -11778, -16382, +-16386, -13055, -18176, -14591, -13571, -13564, -11781, -17658, -15366, -6139, 2811, 17669, 20989, 17664, 17665, 13566, +17667, 18174, 13568, 15873, 13054, 10755, 14589, 9474, 9472, 8447, 3841, 1022, -10238, -13056, -7937, -3327, +7166, 7170, -1, -4351, -12289, -10752, -12288, -16895, -13569, -15871, -15873, -12288, -18175, -16385, -13567, -13569, +-10751, -17665, -17664, -7935, 2046, 17667, 22782, 17665, 16895, 13057, 17663, 19201, 14080, 15359, 13058, 11261, +15875, 10237, 8451, 8445, 4355, 2813, -8958, -14593, -9471, -3330, 7939, 8956, 4, -5123, -11774, -10753, +-11264, -16384, -14080, -15871, -15361, -11775, -18178, -17661, -14083, -13054, -9472, -16386, -18685, -9475, 1026, 17663, +23808, 17664, 15872, 13057, 17662, 20482, 14590, 14082, 12287, 11264, 15872, 10752, 7937, 8446, 5122, 3326, +-7934, -15874, -11263, -4352, 7936, 10752, 512, -5121, -11774, -10754, -10239, -16384, -15360, -15360, -15360, -11265, +-17662, -18690, -14591, -13056, -8961, -15870, -19715, -11774, -1, 16384, 24833, 18174, 15874, 13055, 16384, 21504, +15360, 13568, 12289, 11263, 15872, 11776, 7169, 8446, 5635, 4349, -6141, -16387, -13053, -5123, 7171, 11774, +1025, -5632, -11777, -11263, -8961, -15871, -16385, -15871, -15361, -11264, -16383, -19713, -15359, -13057, -8960, -14591, +-20993, -13567, -1024, 15358, 25602, 19199, 15359, 13060, 15866, 22021, 16380, 13060, 12285, 11266, 15871, 13055, +7171, 8445, 6147, 5630, -3840, -16383, -14593, -6655, 6144, 13055, 2817, -4353, -11263, -11265, -8446, -15362, +-16383, -15873, -15359, -10752, -15361, -19710, -15875, -13565, -8962, -13567, -20992, -15361, -3327, 13567, 25602, 20478, +15362, 13053, 14595, 22014, 17666, 13055, 12288, 11264, 15872, 14080, 7168, 7937, 6142, 5634, -2049, -15360, +-15359, -7937, 5120, 13569, 4351, -4351, -11265, -11775, -8449, -14079, -17666, -16382, -16385, -11264, -14591, -20481, +-16384, -13567, -8962, -11775, -20991, -16897, -5120, 11264, 25599, 21506, 15871, 13056, 14592, 22015, 18690, 13055, +12289, 11263, 15359, 14594, 7934, 7939, 6654, 6144, 0, -14080, -16384, -8959, 2816, 13566, 6147, -3331, +-10238, -12289, -7935, -13057, -17663, -15873, -15871, -11264, -13569, -20480, -16895, -13568, -8960, -10752, -19713, -18175, +-6656, 8959, 24321, 22784, 15871, 13058, 13054, 20993, 19711, 13570, 12286, 10754, 14591, 15871, 8450, 7167, +6656, 5633, 1022, -13055, -16895, -10754, 1026, 13055, 7935, -3326, -8961, -13568, -8448, -11776, -17665, -16381, +-16388, -12285, -11778, -19710, -18178, -14590, -10754, -9471, -19200, -19713, -8958, 6143, 22783, 23809, 16383, 14081, +13055, 20481, 20479, 14081, 13056, 11262, 14083, 16381, 9475, 7166, 7169, 5631, 2818, -10755, -16893, -11779, +-1022, 11264, 9471, -1535, -7937, -13055, -8960, -10753, -16895, -15873, -16383, -13568, -11265, -19199, -18177, -14591, +-11265, -8960, -17664, -19711, -10754, 3331, 20476, 24836, 17660, 14595, 12287, 18687, 21506, 14590, 13057, 11265, +12286, 16385, 10240, 7168, 7168, 5632, 3840, -8960, -16383, -11778, -3325, 9469, 10754, -1, -6143, -12289, +-10238, -10243, -16382, -15873, -16383, -14592, -10752, -18176, -18690, -14588, -12292, -8957, -16385, -20482, -11772, 1020, +17667, 24830, 18177, 15871, 13058, 17662, 21506, 15358, 13569, 12289, 11773, 16388, 11260, 7171, 8447, 5632, +3839, -6143, -15873, -12287, -5120, 7168, 11263, 1025, -4354, -11261, -10754, -8959, -16384, -15873, -15359, -15872, +-11265, -16383, -19200, -14593, -13567, -9473, -14591, -19713, -12287, -1538, 14083, 24316, 19205, 16379, 13572, 15870, +21504, 15873, 13567, 13056, 10754, 14589, 13059, 7933, 8963, 5629, 3842, -3840, -15361, -12287, -6657, 3840, +11266, 2813, -3325, -9475, -11772, -8965, -15355, -15877, -14075, -16388, -11774, -15361, -19200, -14591, -14593, -10752, +-13568, -19712, -13568, -3328, 10240, 22784, 19712, 16896, 15360, 14592, 20480, 16384, 14080, 14592, 11265, 13567, +14080, 8448, 9472, 5633, 3327, -2048, -13568, -11776, -7168, 513, 10237, 4356, -1540, -7933, -12290, -9471, +-14592, -15872, -13568, -16896, -14081, -13566, -18690, -14590, -14593, -12289, -12286, -18691, -13565, -4354, 6145, 20480, +20479, 17666, 17661, 14083, 19198, 17665, 13568, 15872, 11263, 11266, 14077, 8964, 10236, 7172, 2811, -1019, +-11780, -11261, -6658, -2815, 7167, 5632, 1, -4353, -11775, -10752, -13570, -16381, -11779, -16382, -15873, -13567, +-18177, -14079, -13569, -14592, -12287, -17666, -14077, -4354, 2817, 15871, 20481, 17663, 19201, 14591, 17665, 17663, +13569, 17663, 13569, 10240, 13567, 10241, 10239, 8961, 2816, -512, -9473, -10750, -5635, -4349, 3838, 5634, +510, -1534, -10754, -11775, -13568, -16384, -11264, -15359, -18178, -13566, -16898, -14591, -13055, -16386, -13566, -16386, +-14591, -4352, 512, 11775, 19201, 17663, 20482, 15869, 15875, 17661, 13059, 17662, 15873, 9472, 12287, 10753, +10752, 11264, 2816, -512, -7937, -10238, -3841, -4352, 0, 4352, 1024, 1025, -7937, -12288, -13568, -16384, +-10752, -11776, -19200, -15360, -16384, -14592, -11264, -16385, -15357, -16389, -14586, -4358, 6, 7162, 16390, 16889, +21511, 19194, 14598, 15867, 12290, 16896, 19198, 10244, 10236, 10755, 10749, 13059, 3837, -1533, -7170, -8960, +-2046, -3332, -3323, 2044, 1026, 2047, -3840, -12287, -14081, -17663, -11777, -9471, -19201, -18176, -15871, -14593, +-10239, -15872, -18178, -16381, -15363, -4349, 510, 2816, 12290, 15869, 21508, 22013, 15360, 14594, 11774, 15874, +22015, 12287, 8449, 10241, 11261, 14596, 6652, -2044, -6660, -8956, -1028, -509, -6145, -1537, 2, 3326, +514, -10755, -14589, -17666, -12287, -6656, -16897, -20478, -16387, -14076, -8964, -14077, -19714, -18175, -15360, -4353, +1538, 1021, 7171, 13054, 20481, 24831, 17665, 13055, 10754, 14077, 22787, 15869, 7171, 8447, 10238, 14596, +10236, -1532, -7939, -8959, 0, 2816, -5631, -6145, -2047, 2814, 3842, -7169, -15359, -18689, -14080, -5631, +-13569, -22014, -19204, -14588, -8451, -11261, -20482, -20480, -16384, -4352, 3841, 1023, 2048, 8961, 18174, 26626, +21504, 13054, 9475, 12285, 23298, 20479, 8449, 6143, 9472, 15361, 13054, 2, -8961, -8960, 1, 6142, +-3326, -9474, -6142, 1023, 6656, -1536, -13568, -19713, -16382, -5634, -8958, -21506, -22015, -15873, -7934, -8451, +-19196, -23300, -18174, -5632, 5631, 2817, -1024, 3839, 14593, 26623, 25601, 15359, 8449, 9471, 20993, 23807, +11265, 3839, 7169, 14591, 15873, 3327, -8959, -11265, -1023, 8959, 1538, -10755, -11773, -1538, 7168, 2819, +-10756, -19709, -18177, -6145, -5629, -18692, -24317, -18178, -7935, -6143, -16386, -24831, -20993, -7934, 6653, 5636, +-1540, -1533, 9471, 24319, 28418, 19198, 7170, 7166, 18689, 26113, 15870, 3842, 4350, 13570, 17663, 7167, +-7934, -13570, -2814, 10750, 7169, -8960, -16384, -7168, 5630, 7171, -5635, -19708, -20484, -8958, -3328, -14593, +-25598, -22018, -8959, -4352, -12288, -24320, -25600, -10752, 6143, 9474, -3, -6140, 2812, 20995, 30206, 23809, +8960, 3840, 14591, 26114, 20478, 6146, 1021, 11268, 18173, 11266, -4353, -15362, -5628, 10236, 11780, -3843, +-19199, -13569, 2818, 8958, 514, -16897, -22784, -11264, -2816, -10240, -23807, -25601, -11776, -3328, -8960, -22783, +-28418, -15358, 5119, 11776, 3329, -8450, -3838, 15871, 28929, 28414, 13058, 2814, 11266, 23807, 23808, 10240, +0, 7937, 17663, 14592, 1, -15362, -8958, 8959, 15361, 2815, -18175, -19713, -1536, 8450, 5630, -11776, +-23806, -14595, -3837, -6146, -19712, -28415, -16385, -3840, -6143, -18177, -30207, -20480, 2046, 13571, 8445, -7165, +-10242, 8960, 26625, 31232, 18174, 2818, 7934, 21506, 26111, 15872, 512, 3840, 16384, 15872, 3840, -13568, +-13056, 6657, 17662, 8451, -13571, -23807, -7935, 6655, 8960, -6143, -22786, -16383, -5632, -4351, -15363, -28412, +-20484, -5117, -4354, -14078, -28930, -25086, -1537, 13567, 11779, -3332, -14076, 1533, 22018, 31231, 23297, 4350, +4354, 18174, 25090, 20479, 3840, 1024, 14080, 16384, 8449, -10754, -15870, 2815, 17665, 13568, -7169, -25599, +-14593, 2817, 10240, 0, -19712, -19713, -7935, -4352, -10752, -26112, -25088, -7936, -3840, -10751, -26114, -28926, +-7169, 11776, 14592, 1025, -15363, -5115, 16890, 30214, 27899, 8452, 2813, 15874, 23807, 23297, 7935, 1, +11262, 16899, 11261, -6142, -16896, -1026, 16387, 16892, -508, -24323, -20477, -1028, 8964, 5117, -15871, -20991, +-8962, -4351, -8447, -22786, -27134, -10754, -3839, -8448, -22785, -30718, -11779, 10243, 15870, 5633, -13568, -10753, +11265, 27136, 30720, 13056, 1536, 11776, 22016, 23808, 12544, -512, 7937, 15870, 12546, -1538, -16894, -5122, +14594, 18686, 5122, -20994, -24318, -6146, 6657, 7937, -10755, -21499, -11270, -5627, -6659, -18687, -28415, -14595, +-4348, -7172, -18685, -31233, -16897, 6658, 15870, 9473, -10751, -14594, 6145, 23808, 31231, 17666, 2814, 10242, +20477, 24324, 15867, 517, 5629, 15872, 13570, 1533, -15357, -8962, 11777, 19199, 9473, -16385, -26623, -9473, +4353, 8959, -6143, -20993, -13055, -6146, -6141, -15363, -28413, -17668, -5116, -6148, -16380, -30211, -20991, 3840, +15872, 12544, -6656, -16384, 1536, 20992, 31232, 20992, 3328, 7936, 19200, 23807, 19202, 2814, 3329, 14592, +14079, 4353, -13568, -11778, 8964, 19195, 13061, -11781, -27131, -13572, 2819, 9469, -2813, -19714, -14590, -6658, +-6143, -13569, -27134, -20483, -6140, -5636, -13565, -28930, -23807, 512, 14591, 14082, -3331, -16892, -1540, 18691, +30717, 23810, 5120, 6655, 17664, 23297, 20477, 3845, 2043, 13572, 14588, 6660, -11268, -13564, 6654, 18687, +14594, -7939, -27132, -15875, 1027, 9468, 3, -19202, -16382, -7169, -6144, -11264, -26624, -22785, -7165, -5125, +-11770, -27142, -26620, -2050, 14081, 14592, -1024, -16897, -3839, 16896, 30208, 26112, 6144, 5120, 16895, 23298, +22014, 5633, 1024, 13055, 15361, 8448, -9473, -15359, 3839, 18177, 15872, -5121, -27134, -17666, 1, 9473, +1533, -18172, -17668, -7932, -5123, -10750, -25602, -23807, -7936, -4352, -10752, -26624, -28417, -5118, 13054, 15362, +1022, -16382, -5634, 15874, 29438, 27905, 7168, 3841, 15871, 23295, 22018, 7166, 3, 11772, 15876, 9469, +-7933, -16387, 1537, 17665, 15871, -3327, -26113, -18176, 1, 9472, 2815, -18175, -19713, -8447, -5120, -9473, +-25087, -25601, -8959, -4353, -10239, -25601, -29439, -7937, 11777, 15359, 2049, -15361, -6142, 15870, 29440, 28418, +8444, 2822, 15865, 23814, 23292, 7938, -1, 11777, 16895, 10752, -6655, -16898, 3, 16382, 15872, -2048, +-25087, -18178, 515, 9469, 3330, -17665, -20480, -8447, -3841, -9471, -24321, -26623, -8960, -3329, -9471, -25088, +-30209, -9471, 10751, 14593, 2816, -14081, -6144, 16385, 30207, 28417, 8958, 2051, 14589, 24323, 23293, 7938, +-1024, 10751, 17665, 11263, -5631, -17664, -2049, 15361, 15871, -2047, -23809, -18174, 1020, 10245, 2811, -17659, +-22020, -9470, -3841, -9471, -24321, -27135, -10753, -3327, -9472, -23809, -30206, -11266, 8962, 14078, 2817, -12544, +-5120, 17664, 30208, 28414, 9476, 2812, 14595, 25086, 23296, 7937, -513, 11265, 18175, 12545, -4354, -16893, +-3843, 14082, 14590, -2045, -22787, -16381, 2045, 10241, 2049, -17666, -22014, -9474, -3326, -9474, -24318, -26626, +-10751, -3328, -9472, -23808, -29440, -12545, 7170, 13054, 2049, -10752, -3328, 17664, 30208, 27904, 10240, 2817, +13566, 25602, 22783, 7936, 1, 10238, 18178, 12543, -4353, -16382, -5634, 11777, 13568, -3329, -19711, -15361, +2817, 9471, 1025, -17664, -22786, -10748, -2820, -10237, -24321, -25601, -11262, -3842, -9470, -23297, -28416, -13567, +5630, 11266, 1535, -7936, -1023, 18687, 30209, 26623, 10753, 3838, 14083, 26110, 22017, 7168, 1022, 10244, +18172, 12546, -3328, -15361, -6654, 9470, 11265, -3329, -17663, -12545, 3330, 8958, 1, -16897, -22015, -11777, +-3326, -10755, -23804, -24324, -11773, -4354, -10239, -22784, -26624, -14593, 2818, 9470, 1025, -5121, 1537, 19199, +29442, 25085, 11266, 5120, 13055, 25089, 21503, 7168, 2049, 10240, 17663, 12545, -3329, -13568, -7934, 6653, +9475, -3843, -14590, -10240, 3327, 8449, -1537, -16383, -20992, -12544, -3328, -11265, -23807, -22784, -13056, -5632, +-10752, -22017, -24318, -15362, 1, 7167, 1025, -2048, 4351, 19201, 28415, 23296, 11778, 7165, 13058, 25087, +20480, 7169, 3839, 10241, 16382, 12546, -2050, -11261, -8451, 3330, 7167, -4352, -11775, -7170, 2819, 7165, +-3326, -15872, -19714, -13565, -4355, -11774, -22785, -21503, -14081, -7168, -10750, -20996, -22780, -16387, -2815, 5634, +1020, 1028, 7932, 19203, 27903, 22016, 13057, 8958, 12545, 23297, 19710, 7171, 5628, 10245, 15866, 11782, +-1541, -8957, -8961, 1, 5118, -4350, -8962, -4351, 2817, 5630, -4350, -14594, -18175, -14593, -5118, -12546, +-22014, -19714, -15360, -8446, -10755, -20476, -20484, -16382, -6144, 2814, 516, 3324, 10242, 18176, 26111, 20482, +13566, 11265, 12544, 22015, 18690, 7934, 7937, 9473, 14589, 11268, -5, -6650, -8967, -2809, 2811, -4349, +-5634, -1536, 2049, 3840, -6145, -14078, -16899, -15868, -7173, -13051, -21508, -18173, -15874, -10750, -11267, -19197, +-18691, -16893, -8962, 1026, 509, 6147, 13053, 18179, 25085, 19203, 14589, 13058, 12543, 20480, 18176, 8449, +9470, 10243, 13053, 11266, 510, -4350, -8961, -5631, -1, -4352, -3328, 1024, 1537, 2814, -6654, -13057, +-15361, -16382, -8450, -13055, -20479, -16387, -16380, -11780, -11772, -18179, -16382, -16385, -11775, -1537, 512, 7938, +15869, 17667, 22782, 18176, 14593, 14591, 13056, 19202, 17661, 8962, 10751, 10240, 11266, 11261, 1026, -2817, +-8960, -8446, -2051, -4350, -513, 3328, 1025, 1022, -7934, -13057, -14080, -16382, -10244, -13564, -19715, -15358, +-16385, -14078, -11780, -17659, -15365, -16381, -14081, -3839, -1, 9473, 17662, 17667, 22013, 17667, 15869, 16899, +13054, 17665, 16383, 10240, 12545, 10751, 10753, 10751, 2817, -513, -7935, -10753, -4351, -5121, 514, 5630, +1026, 510, -7935, -11776, -12544, -16383, -11778, -13566, -18178, -14078, -16385, -15360, -13056, -16384, -13568, -16383, +-16386, -6142, -2, 10755, 19709, 17666, 20478, 16386, 15871, 18177, 13567, 15871, 15875, 10236, 13060, 11261, +8961, 10240, 3328, 512, -6656, -11777, -6654, -5123, 2052, 7164, 1026, -1024, -8449, -11774, -11266, -16383, +-13569, -13567, -18176, -13568, -16385, -16895, -13569, -15871, -13056, -15362, -18173, -8963, -1022, 11263, 21505, 18687, +19201, 15870, 15875, 19709, 14595, 15357, 15362, 10751, 14080, 12544, 8449, 10238, 3842, 2046, -5631, -13567, +-8962, -6143, 2817, 8958, 2050, -1537, -8449, -11773, -10243, -16382, -14594, -14078, -16898, -12541, -15876, -18172, +-14084, -15356, -11779, -14591, -19199, -11266, -1534, 11263, 22784, 19200, 17665, 15870, 15362, 20479, 15872, 14081, +14590, 10754, 14590, 13058, 7934, 8962, 4350, 2818, -3842, -14079, -11264, -6144, 2816, 10752, 3328, -2048, +-8960, -11776, -8961, -15358, -15873, -14592, -16384, -11776, -15361, -19197, -15364, -15356, -11267, -13567, -19712, -13568, +-3328, 10752, 23296, 20480, 17664, 15360, 14592, 20992, 16897, 13566, 14082, 11262, 14595, 14077, 7938, 8447, +5632, 3841, -2817, -14079, -13569, -7935, 2814, 11266, 4351, -2815, -8961, -11776, -8448, -14080, -16383, -15361, +-16384, -11775, -14081, -19711, -15873, -15360, -11262, -12547, -19709, -15875, -4350, 10240, 23807, 21505, 16896, 14591, +14593, 21503, 18177, 13056, 13055, 11265, 14592, 14591, 7937, 8446, 5634, 4352, -513, -13567, -15361, -8960, +1025, 12543, 5633, -2817, -8447, -11777, -7935, -13569, -16896, -15359, -16385, -11775, -13057, -19712, -16383, -15362, +-10749, -11267, -19709, -17666, -6144, 8448, 23296, 22785, 16383, 14593, 14078, 20993, 19201, 13054, 13058, 11262, +14593, 15872, 8448, 7168, 5631, 4353, 512, -13056, -15872, -9472, 512, 12544, 7169, -2050, -7933, -11780, +-7932, -11780, -17660, -16387, -16382, -12546, -11775, -19713, -18174, -15361, -11264, -10753, -19199, -19200, -7936, 6656, +23296, 23808, 16897, 14590, 13570, 20991, 20480, 13569, 12542, 11266, 14079, 16384, 8961, 7166, 6658, 5631, +2048, -11264, -16895, -11266, -1021, 11772, 8964, -1539, -7934, -11777, -7936, -10751, -17665, -16384, -16384, -12543, +-11265, -19199, -18689, -15360, -11775, -9473, -18175, -19712, -10242, 4355, 21501, 25091, 17662, 14593, 13056, 19712, +21504, 14079, 11778, 11262, 13058, 16895, 10240, 6656, 6656, 5119, 3330, -9474, -16894, -11779, -2045, 11262, +10753, -512, -7169, -11775, -8961, -9471, -16897, -16895, -16384, -13569, -10751, -18177, -19712, -15870, -12546, -8959, +-16897, -20991, -11776, 2048, 19711, 25600, 18178, 15358, 13058, 19197, 22018, 15359, 12545, 11263, 13057, 17662, +11266, 6655, 7168, 5633, 3838, -7934, -16898, -13566, -4353, 9472, 11776, 1024, -6144, -11776, -8960, -8960, +-16383, -16898, -16382, -14081, -10753, -16893, -19716, -15869, -13569, -8961, -15870, -20993, -13568, 0, 17663, 26114, +19199, 15360, 13056, 17663, 22018, 15871, 12543, 11266, 11774, 16898, 12543, 6655, 7170, 5118, 4354, -5633, +-16384, -14080, -6144, 7167, 13059, 2044, -5115, -11270, -10747, -8451, -15359, -16895, -16386, -15358, -10753, -15872, +-20480, -16384, -14079, -9474, -14077, -20995, -15358, -2049, 14592, 25601, 20479, 15873, 13566, 15875, 22013, 16898, +13056, 12542, 11266, 16383, 14080, 7169, 7166, 5122, 5118, -3326, -15362, -14591, -7168, 5120, 13056, 3839, +-3839, -10241, -11262, -7938, -14591, -16897, -15871, -15873, -11263, -14592, -20481, -16383, -14593, -10751, -13057, -20479, +-15872, -4354, 11267, 25085, 20995, 16381, 14595, 14589, 22019, 18173, 13058, 13055, 10754, 14589, 14594, 7167, +7937, 5631, 4354, -1028, -14074, -14599, -8442, 1532, 12546, 5632, -2817, -8447, -11777, -7936, -13567, -16897, +-15359, -16385, -11776, -13055, -19714, -16381, -15363, -11773, -11779, -19709, -16387, -6140, 7163, 22789, 22012, 16899, +15870, 14081, 20479, 19202, 13565, 13571, 11262, 13570, 15870, 8449, 8448, 6144, 3840, 0, -11777, -14590, +-8962, -510, 10750, 7169, -1536, -6145, -11775, -8959, -12547, -16892, -14596, -16381, -14082, -12543, -19200, -16385, +-15358, -13570, -11263, -18688, -16897, -7166, 4349, 20484, 22780, 17667, 16894, 14081, 19201, 19198, 13569, 14592, +11776, 11776, 15872, 9471, 8450, 7166, 3329, 1024, -10241, -14078, -8962, -3327, 7936, 7936, 0, -3840, +-11264, -9472, -11264, -16385, -13566, -15874, -15358, -11777, -18177, -16382, -14594, -14590, -11265, -16896, -17664, -7936, +1024, 15872, 22016, 17664, 18176, 14593, 17662, 19202, 14078, 15361, 13569, 10750, 14595, 10748, 8451, 8446, +2817, 1024, -7936, -13569, -7934, -4354, 4353, 8448, 1023, -2046, -9474, -11262, -10754, -16382, -13570, -14591, +-17664, -13056, -16384, -16896, -13569, -15871, -12545, -15870, -17665, -8449, 2, 11773, 21508, 18684, 19203, 16383, +15871, 19202, 14077, 15875, 15871, 10239, 13570, 11261, 8964, 10237, 3842, 1022, -6142, -12545, -7168, -5631, +510, 7170, 2047, 0, -6656, -11776, -10752, -16384, -13568, -12545, -18174, -14083, -15357, -16387, -12542, -16384, +-14081, -15359, -17666, -8445, -1539, 7171, 18686, 18176, 19714, 18685, 14595, 18174, 14593, 14591, 17665, 10752, +11263, 11778, 8957, 11268, 5116, 4, -4356, -11260, -6147, -4350, -1, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0, -512, -768, -768, +-769, -766, -770, -766, -770, -766, -771, -764, -771, -766, -769, -769, -766, -1282, -4606, -10241, +-10497, -3837, 2300, 5380, 5117, 3586, 2302, 515, -3, -509, -1027, -1023, -1279, -1026, -1021, -1027, +-1279, -1023, -1282, -1277, -1028, -1020, -1283, -1278, -1281, -1279, -1282, 515, 8189, 12802, 12544, 9726, +5635, 1789, -509, -2307, -3581, -4355, -4350, -4865, -11007, -18689, -21502, -19716, -15612, -11011, -7933, -4866, +-3072, -2048, -1279, -1537, -255, -2, -3326, -10498, -15869, -15364, -11772, -7940, -4605, -1794, 2, 1279, +1279, 2306, 3070, 2818, 2815, 2560, 2816, 2817, 2302, 1282, 1535, 1280, 1280, 1024, 1280, 1537, +1535, 1536, 1280, 2304, 12288, 26368, 32001, 29438, 22018, 14079, 7423, 1795, -1539, -3838, -4865, -6144, +-5631, -6913, -7423, -7681, -6911, -5889, -5887, -5889, -5887, -5889, -5887, -5889, -6142, -5892, -6395, -12805, +-19196, -20483, -17917, -14083, -9981, -6403, -4350, -2816, -1537, -1023, -1537, -1023, -4608, -12289, -16383, -15618, +-11773, -7938, -4096, -1280, 256, 1281, 1535, 2817, 2814, 2819, 2813, 3331, 8445, 15107, 18173, 15875, +11773, 7939, 4606, 2304, 514, -259, -1277, -1283, -1277, -1538, -1535, -1537, -1279, -1537, -1535, -1280, +-1280, -1537, -1534, -1539, -1532, -1540, -2300, -7684, -11005, -5889, -1, 2817, 3072, 2816, 1279, 258, +-259, -1277, -1538, -1279, -1281, -1535, -1536, -1537, -1534, -1538, -1535, -1280, -1281, -1535, -1280, -1537, +-1278, -1538, -1279, -1536, 2303, 9217, 13568, 12544, 9216, 5376, 1536, -513, -2301, -3333, -4602, -4613, +-8700, -16643, -20734, -19969, -16385, -12541, -8451, -5886, -3841, -2560, -1280, -1536, -1280, 0, 1, -3585, +-10752, -15616, -15361, -12029, -8451, -4862, -1793, -1, 1282, 1279, 1791, 3074, 2813, 3075, 3070, 3074, +3069, 2051, 1277, 1283, 1022, 1537, 1280, 1536, 1535, 1537, 1280, 1535, 7426, 23038, 32001, 31488, +25599, 17153, 9216, 3583, -511, -3073, -4863, -6145, -6144, -6143, -7426, -7678, -6913, -5888, -6144, -5888, +-6144, -5888, -6143, -5890, -6142, -6146, -6142, -6913, -13824, -19455, -19970, -17918, -13825, -9984, -6911, -4354, +-2814, -1538, -1277, -1283, -3326, -10754, -16126, -16641, -13311, -9217, -5120, -2303, -2, 1284, 1275, 2564, +3070, 2816, 3330, 2813, 4611, 10750, 16386, 18173, 15363, 11263, 7423, 4355, 1788, 3, -512, -1539, +-1531, -1542, -1274, -1285, -1276, -1283, -1534, -1537, -1536, -1279, -1281, -1536, -1535, -1793, -1535, -2560, +-3073, -2815, -1792, -513, 2, -1027, -1532, -1284, -1533, -1538, -1534, -1537, -1536, -1536, -1537, -1278, +-1537, -1281, -1278, -1538, -1534, -1538, -1535, -1536, -1280, -1280, -1535, -1283, -1019, 5114, 11781, 13821, +12033, 8192, 4096, 1023, -1277, -2564, -4092, -4356, -7165, -15105, -20481, -21245, -17924, -13821, -9730, -6655, +-4351, -3074, -1534, -1282, -1534, -2, 3, -259, -4350, -11010, -15102, -15105, -12287, -8193, -4864, -1791, +-257, 1280, 1537, 2046, 3331, 3069, 3073, 3073, 2815, 3073, 1791, 1535, 1539, 1278, 1537, 1280, +1534, 1283, 1534, 1281, 6400, 18431, 29441, 31487, 26113, 19200, 10751, 4866, 509, -2557, -4354, -5631, +-6144, -6144, -6144, -6144, -6145, -6143, -6144, -6144, -6144, -6145, -6143, -6145, -6143, -6145, -6143, -5890, +-7677, -14339, -19966, -20481, -17921, -13565, -9987, -6653, -4355, -2814, -1281, -1279, -2561, -9471, -15873, -17664, +-14335, -10242, -6397, -2563, -510, 1023, 1536, 2816, 3329, 3070, 3075, 3324, 3333, 6651, 14852, 19196, +18691, 14592, 10495, 6145, 3070, 1281, 1, -1281, -1535, -1538, -1534, -1538, -1278, -1538, -1535, -1792, +-1537, -1534, -1539, -1533, -1282, -1791, -1279, -1539, 2819, 4862, 1026, -2818, -4862, -4610, -4862, -4610, +-3326, -3330, -3070, -3329, -2560, -1536, -1792, -1536, -1536, -1535, -1794, -1534, -1538, -1534, -1538, -1277, +-1540, -1532, -1795, -1535, -1536, 769, 8191, 14081, 14335, 11007, 7171, 2301, 2, -2305, -3327, -4610, +-6654, -13826, -21246, -23041, -20224, -16128, -11520, -7680, -5119, -3331, -2299, -1286, -1786, -517, 3, -1, +-256, -4864, -13311, -16642, -16126, -12802, -8447, -4608, -2048, -256, 1535, 1537, 2047, 3329, 3328, 3327, +3073, 3327, 3073, 1535, 1538, 1533, 1539, 1534, 1281, 1536, 1535, 2050, 8958, 18689, 28160, 31999, +28162, 21501, 13314, 6911, 1537, -1793, -4095, -5633, -6400, -6400, -6656, -6399, -6401, -6655, -6657, -6656, +-6399, -6401, -6655, -6400, -6401, -6399, -6657, -5631, -4608, -8193, -16383, -21249, -21503, -18433, -13567, -9473, +-5886, -4355, -2301, -1282, -2304, -8701, -16133, -18171, -15363, -11008, -6398, -2819, -510, 769, 1789, 3075, +3325, 3330, 3072, 3327, 3329, 3583, 10752, 18433, 19967, 16897, 12799, 8193, 4607, 2049, 512, -513, +-1535, -1536, -1793, -1533, -1540, -2045, -1794, -3327, -3072, -3328, -2304, -1536, -1792, -1537, -1790, -2, +7938, 14078, 6657, -3328, -9728, -11264, -9728, -8192, -6401, -5118, -3586, -3326, -3585, -2817, -1534, -1795, +-1532, -1796, -1533, -1794, -1535, -1536, -1793, -1535, -1536, -2048, -1792, -1792, -1793, -1022, 6142, 14850, +16893, 14852, 9212, 4868, 1276, -1789, -3073, -4608, -6144, -14336, -24576, -26368, -23807, -18434, -12798, -8705, +-5888, -4096, -2559, -1539, -2300, -1027, 2, -1, 0, -768, -7680, -16895, -20481, -18175, -13314, -8190, +-4097, -1024, 513, 1790, 1538, 3070, 3842, 3325, 3844, 3581, 3841, 2304, 1535, 2049, 1536, 1536, +1791, 2050, 1789, 4611, 14591, 21247, 26626, 31998, 31233, 24321, 16893, 9220, 2813, -1022, -4354, -5886, +-7425, -7424, -7423, -7426, -7678, -7425, -7424, -7424, -7424, -7424, -7424, -7168, -7680, -7425, -7422, -5633, +-5632, -5632, -9985, -19455, -24320, -23808, -19968, -14848, -9730, -6652, -4357, -2299, -1540, -7678, -17153, -20735, +-18432, -13569, -8703, -4097, -1023, 1024, 1536, 3071, 3585, 3583, 3585, 3327, 3840, 3329, 6911, 16640, +22017, 21245, 16901, 11771, 7684, 4093, 1538, 255, -1024, -1791, -1794, -1789, -1795, -2045, -2051, -1790, +-1793, -1791, -1792, -1793, -1791, -1537, -1790, 1277, 10499, 16382, 14849, 2049, -9731, -16125, -15874, -13823, +-10752, -7937, -6142, -4611, -3325, -3842, -2815, -1536, -1792, -1792, -1793, -1790, -1794, -1790, -1793, -1793, +-1791, -1792, -1792, -1792, -1536, -1793, 770, 9470, 15874, 16895, 13055, 7938, 4093, 4, -2308, -3580, +-5124, -11517, -20994, -26111, -24833, -20222, -15106, -10239, -7168, -4608, -3072, -1536, -2305, -1278, -1, 0, +0, -1, -765, -8452, -17916, -20484, -18429, -14081, -8961, -4350, -1794, 2, 1791, 1535, 2562, 4094, +3843, 4092, 4100, 3836, 1795, 2046, 1793, 2048, 1792, 2048, 2047, 7937, 18175, 24066, 25342, 29186, +31486, 27905, 21504, 12799, 6146, 510, -3327, -5888, -7168, -8704, -8192, -8704, -8448, -8191, -8450, -8701, +-8452, -8700, -8451, -8702, -8450, -8446, -7938, -6398, -6401, -6401, -6655, -12544, -21760, -27903, -27138, -22271, +-16128, -11264, -6911, -4866, -3069, -7172, -17659, -23045, -22268, -16899, -11518, -5633, -2047, 768, 2046, 3843, +4093, 4355, 4094, 4097, 4351, 4098, 4861, 13571, 23294, 25601, 22016, 16895, 11521, 6655, 2818, 510, +-510, -1794, -1791, -2048, -1793, -1790, -2306, -2047, -2049, -2047, -2050, -1789, -2051, -1790, -2049, 4607, +15618, 19966, 18178, 9726, -6143, -19968, -23809, -21502, -17410, -13055, -9216, -7168, -4864, -4096, -4352, -2561, +-2046, -2050, -2046, -2050, -2303, -2049, -2046, -2050, -2046, -2051, -2045, -1794, -2047, -2048, -1281, 6914, +17406, 19970, 17406, 11266, 5886, 1538, -1282, -3838, -4866, -11519, -23808, -29953, -28671, -23296, -16897, -12287, +-7936, -4609, -3070, -1795, -2301, -1026, 1, 0, -2, 3, -2, -2560, -12031, -21762, -23806, -19457, +-13312, -7936, -3583, -769, 1024, 2304, 2049, 3839, 4097, 4351, 4353, 4096, 2559, 2048, 2049, 1792, +2304, 1791, 4353, 14079, 23809, 25344, 21247, 22273, 27136, 27391, 21250, 13309, 6403, 510, -3327, -5632, +-7425, -8446, -8450, -8447, -8448, -8448, -8449, -8702, -8706, -8703, -8704, -8705, -8703, -8703, -6914, -6399, +-6656, -6401, -6398, -6914, -15103, -26624, -30465, -26622, -20739, -14845, -9218, -5887, -4096, -6913, -18686, -25090, +-23806, -17923, -11004, -6405, -1530, 1530, 2565, 4349, 4097, 4095, 4354, 4350, 4354, 4351, 4863, 11010, +23038, 27905, 25856, 19712, 13056, 7424, 3583, 1281, -256, -1793, -2302, -2307, -2301, -2306, -2303, -2305, +-2303, -2304, -2048, -2304, -2305, -2302, -2, 13315, 22780, 21764, 15612, 8963, -2305, -18944, -28672, -28928, +-24833, -18431, -13313, -9727, -7169, -4351, -4609, -2816, -1791, -2306, -2046, -2305, -2303, -2050, -2301, -2308, +-2299, -2053, -2044, -2307, -2302, -2049, -2303, 1791, 13825, 21246, 21250, 15615, 9217, 3583, 0, -3327, +-4610, -9982, -23297, -31488, -31999, -26114, -19454, -13569, -9216, -5887, -4098, -2046, -2306, -1022, -1, -1, +2, -3, 3, -1, -2561, -13823, -23809, -24831, -20224, -14337, -8447, -4098, -510, 1535, 2560, 1792, +3840, 4351, 4611, 4348, 4611, 2814, 2049, 2048, 2048, 2048, 8192, 20480, 27392, 26368, 19713, 15870, +21763, 25853, 23810, 17663, 10240, 3841, -1281, -4863, -6913, -8192, -9471, -9217, -9215, -9216, -9217, -8958, +-9475, -9213, -9218, -9215, -8960, -8961, -7678, -6914, -6911, -6657, -7167, -6912, -7425, -16895, -27904, -30209, +-27647, -20992, -14593, -9726, -5890, -6399, -17920, -24832, -25344, -19968, -12800, -7681, -2814, 1023, 2304, 4352, +4864, 4608, 5121, 4862, 4610, 4606, 4098, 6654, 17409, 26880, 27647, 23297, 16639, 11009, 6144, 2303, +513, -1026, -2301, -2050, -2047, -2306, -2301, -2308, -2043, -2053, -2044, -2051, -1790, -2049, 5377, 18687, +22529, 19455, 13569, 6655, 1536, -8703, -23810, -30461, -29700, -24572, -18178, -13057, -8958, -6402, -4607, -3838, +-2052, -2301, -2305, -2049, -2046, -2050, -2047, -2303, -2305, -2049, -2046, -2051, -2300, -2564, -2301, -771, +8196, 19452, 22531, 18429, 12291, 6142, 1537, -1792, -4097, -8702, -20995, -30717, -32003, -27133, -20738, -14335, +-9473, -5887, -3841, -2047, -2304, -1793, 1, -1, 2, -3, 3, -3, 3, -4610, -16127, -23808, +-24833, -19711, -13313, -7679, -3328, -768, 1791, 2561, 2047, 4097, 4608, 4607, 4609, 4607, 3074, 1790, +2049, 3328, 13567, 24834, 27391, 23551, 17411, 11004, 13828, 20989, 23042, 19966, 12546, 6143, 257, -3073, +-5888, -7168, -8959, -8961, -9216, -9216, -8960, -9215, -9218, -8958, -9218, -9214, -8961, -9472, -7936, -6400, +-7167, -6657, -6911, -6658, -6910, -8193, -17407, -27649, -29952, -26623, -20481, -14847, -9473, -7679, -16129, -24319, +-25089, -20991, -15105, -8447, -3841, 257, 2047, 3584, 4608, 4352, 4864, 4353, 4606, 4354, 4606, 4609, +9728, 21248, 27647, 26114, 20478, 14336, 8450, 4349, 1539, -2, -1536, -2303, -2050, -2044, -2053, -2043, +-2053, -2044, -2307, -2301, -2050, -1279, 8448, 18431, 20993, 17663, 11522, 5630, 258, -3075, -12029, -25602, +-30206, -28930, -24574, -18179, -13308, -9477, -6138, -4613, -4349, -2050, -2047, -2048, -2048, -2049, -2302, -2050, +-2047, -2047, -2051, -2045, -2306, -2047, -2304, -1792, 2046, 13827, 20478, 20481, 16128, 9727, 5121, 512, +-2304, -5120, -16128, -27648, -30720, -27903, -21762, -15870, -11010, -7678, -5121, -3328, -2048, -2304, -257, 3, +-3, 2, -2, 2, -2, 4, -5125, -16124, -24067, -24317, -19202, -13312, -7423, -3842, -509, 1533, +2306, 2046, 3842, 4863, 4352, 4864, 3073, 1790, 2563, 6653, 17666, 26623, 27648, 22785, 15359, 9729, +7423, 14592, 20993, 20991, 16641, 9472, 3327, -1023, -4608, -6658, -7933, -9474, -9214, -9218, -9215, -9217, +-9214, -9473, -9473, -9470, -9218, -9471, -7423, -6915, -7164, -6916, -6909, -6914, -7166, -6659, -9725, -18947, +-27645, -30466, -26624, -20479, -14081, -9728, -16127, -24578, -26109, -23811, -17405, -10499, -4862, -512, 1790, 3075, +5118, 4608, 4865, 4607, 4864, 4609, 4606, 4355, 5885, 15363, 25852, 28164, 24317, 17922, 12288, 7422, +3587, 509, -254, -2048, -2306, -2045, -2306, -2304, -2559, -2306, -2046, -2048, -2306, 1795, 13820, 20483, +20479, 15616, 9216, 3840, -512, -3840, -5888, -15616, -27648, -32000, -30208, -24064, -18432, -13568, -9472, -6400, +-4864, -3840, -2304, -2305, -2558, -2306, -2302, -2562, -2047, -2304, -2305, -2301, -2309, -2043, -2308, -2045, +-1026, 7938, 18685, 21251, 19198, 13569, 7937, 2814, -767, -3841, -13822, -26626, -30975, -29696, -23554, -17404, +-12548, -7933, -5635, -3325, -2051, -2556, -772, 3, -2, 256, 2, -3, 3, -3, -254, -6401, +-17920, -23552, -23295, -19201, -12544, -7679, -2818, -253, 1533, 2562, 2047, 3841, 4863, 4353, 4863, 3073, +3071, 10752, 21505, 27647, 25857, 19967, 13569, 7166, 4355, 7165, 16642, 21504, 18430, 12548, 6651, 1285, +-2053, -5884, -6914, -8447, -9729, -8960, -9472, -9215, -9474, -9470, -9730, -9470, -9217, -9217, -7421, -6660, +-6908, -6659, -6911, -7166, -7172, -7164, -6660, -9213, -20993, -29440, -29951, -25090, -18942, -14082, -16383, -24831, +-28162, -24830, -18690, -11774, -5634, -1022, 1278, 3329, 4609, 4606, 4611, 4861, 4609, 4609, 4606, 4611, +4350, 10240, 21249, 27646, 27138, 20992, 15103, 9217, 4864, 1535, 2, -1282, -2303, -2048, -2305, -2301, +-2307, -2303, -2560, -2049, -2302, 5887, 17152, 21249, 19454, 13058, 7679, 2049, -1537, -4351, -6402, -8445, +-18179, -28670, -32001, -28672, -23551, -17153, -12288, -8448, -6144, -4352, -2559, -2306, -2558, -2049, -2049, -2046, +-2305, -2304, -2303, -2049, -2048, -2304, -2303, -2305, -2303, 1791, 13313, 20735, 20993, 17407, 10753, 5119, +514, -2307, -11005, -24322, -30464, -29950, -24066, -18175, -12545, -8191, -5633, -3583, -2049, -2560, -767, -1, +0, 1, -1, 0, 1, -2, 2, -512, -7938, -19197, -23812, -22524, -17924, -11516, -6403, -2814, +-2, 1793, 2305, 2045, 4356, 4860, 4868, 4605, 5122, 14846, 25346, 28159, 24320, 18177, 11519, 6400, +2561, 3070, 11779, 19709, 20482, 15615, 8960, 3841, -514, -3838, -6656, -6914, -8701, -9476, -9213, -9217, +-9216, -9216, -9472, -9217, -8959, -9215, -7171, -6652, -6917, -6907, -6915, -6911, -6912, -6657, -6911, -6400, +-11265, -21247, -29185, -28927, -24064, -18176, -18177, -26111, -28416, -26624, -20480, -12545, -6398, -2051, 772, 2555, +4612, 4606, 4609, 4608, 4607, 4609, 4607, 4610, 4605, 5635, 15358, 25856, 28162, 24318, 18689, 12544, +7422, 3586, 767, -255, -2305, -2303, -2050, -2046, -2049, -2303, -2049, -2559, -513, 10241, 19712, 20991, +17153, 10751, 5121, 256, -3073, -4606, -6915, -6909, -9986, -20735, -30208, -32257, -27902, -21507, -15869, -11010, +-7679, -5375, -3587, -2045, -2307, -2045, -2049, -2304, -2049, -2047, -2049, -2046, -2306, -2303, -2304, -2304, +-2305, -766, 7421, 18692, 20989, 18945, 13824, 7936, 2559, -510, -8450, -21502, -29185, -29441, -24830, -19459, +-12796, -9219, -5886, -4098, -2303, -2304, -511, -2, 1, 0, 0, 0, 1, -2, 2, -2, +-1022, -9985, -20224, -23295, -21506, -15870, -11010, -6398, -1793, -1, 2050, 2558, 2306, 4094, 4865, 4095, +7169, 18688, 26367, 27137, 22528, 16126, 10244, 4860, 1795, -259, 4867, 15613, 19715, 18430, 12801, 6910, +1283, -2307, -5117, -6658, -7167, -9217, -8959, -9216, -9217, -8959, -9472, -9217, -9471, -8961, -6655, -6913, +-6911, -6913, -7168, -7167, -6657, -6911, -6913, -7168, -6655, -12801, -23551, -29441, -28159, -22529, -20991, -27393, +-30719, -27905, -20734, -13572, -6907, -2052, 515, 3327, 4862, 4612, 4604, 4612, 4348, 4356, 4605, 4354, +4350, 4610, 10750, 21763, 27644, 26372, 20732, 13571, 8446, 4354, 1278, 2, -2050, -2302, -1793, -2048, +-2048, -2559, -2049, -2302, 2558, 15873, 21760, 20223, 14850, 7679, 2815, -1277, -4357, -6651, -6659, -6910, +-8450, -12287, -24833, -31998, -31745, -26368, -19456, -13825, -9470, -6401, -4608, -2816, -2048, -2305, -2045, -2052, +-2300, -2052, -2045, -2305, -2049, -2303, -2304, -2305, -2302, -1794, 2560, 14593, 22527, 21762, 15869, 10242, +4096, 255, -7422, -21762, -29695, -29696, -24832, -18177, -13310, -8706, -5630, -3586, -1791, -2048, -256, 0, +1, -2, 2, -2, 3, -2, 1, 0, -2, -2301, -12802, -22270, -24578, -20222, -14338, -9214, +-4353, -1281, 1026, 2302, 1794, 2815, 4607, 4354, 11262, 23042, 27646, 25346, 19198, 12547, 7164, 3588, +765, -1022, -1, 9984, 18944, 19201, 14846, 8962, 3839, -512, -3327, -5890, -6398, -7681, -8959, -8706, +-8957, -8708, -8699, -8453, -9213, -7425, -6656, -6399, -6657, -6657, -6653, -6660, -6395, -6405, -6396, -6403, +-6655, -6399, -13569, -24832, -28416, -25857, -24318, -28929, -32000, -29697, -22527, -14337, -7934, -2050, 1, 2560, +4351, 4097, 4352, 4095, 4097, 4096, 4351, 4354, 4350, 4353, 5631, 14593, 24320, 26368, 23040, 16895, +11777, 6912, 3072, 512, -513, -2303, -2048, -2049, -2046, -2050, -2047, -2048, 5120, 16128, 19968, 18176, +12288, 6657, 1534, -2302, -4354, -6142, -6657, -6912, -9217, -8445, -13060, -24317, -30209, -29441, -24317, -18436, +-12797, -8706, -6142, -4354, -2047, -1792, -2049, -2045, -2052, -2301, -2051, -1534, -1536, -1280, -2305, -2047, +-2305, -1791, -256, 6655, 17665, 21504, 18944, 13824, 7936, 2816, -2816, -16384, -26368, -28928, -25088, -19456, +-13568, -9472, -5889, -3838, -2050, -2302, -1282, 2, -2, 1, 1, -3, 5, -6, 6, -5, +2, 1, -4098, -13309, -21764, -23549, -19202, -13822, -8449, -3840, -1280, 768, 2304, 1792, 2816, 5120, +13312, 24064, 26880, 24320, 17920, 11520, 7168, 2815, 770, -770, -2046, 4350, 13569, 19455, 17922, 12542, +6913, 1535, -1535, -3840, -6144, -6400, -7169, -8959, -8703, -8706, -8702, -8193, -8960, -7424, -5888, -6144, +-6144, -6399, -6402, -6142, -6402, -6142, -6146, -6142, -6145, -5888, -7168, -14336, -22785, -25853, -24836, -29436, +-32516, -29692, -22531, -16126, -8449, -3584, 258, 2044, 3588, 3837, 3842, 3839, 3840, 3840, 3840, 4096, +3584, 3840, 3584, 7169, 16382, 22274, 21759, 17664, 12545, 7678, 4355, 1533, 258, -1025, -2048, -2047, +-2050, -1534, -1537, -1024, 6145, 14590, 16898, 14591, 9728, 4865, 254, -1790, -3842, -5629, -5380, -6141, +-7681, -7169, -7421, -12547, -20991, -24831, -23810, -19454, -15105, -10752, -7168, -4608, -3328, -1537, -1790, -1794, +-2046, -1282, 1, 0, 0, 0, 0, 1, -2, 2, -257, 1792, 9473, 16383, 17920, 14081, +9215, 5120, 1, -11266, -20478, -24065, -20993, -16893, -11781, -8186, -5381, -3581, -2050, -1535, -1535, -2, +2, -2, 1, 0, 0, 0, 0, 0, -1, 1, 1, -3843, -13308, -18948, -18685, -15106, +-10750, -6146, -2815, -512, 1279, 1793, 2048, 4607, 12545, 20735, 22529, 19199, 14338, 9213, 5122, 2303, +256, -511, -2049, -512, 6656, 14592, 15872, 13825, 8446, 4098, 510, -2302, -4353, -5632, -5376, -6656, +-7424, -7424, -7424, -7424, -7168, -5375, -5634, -5630, -5633, -5632, -5631, -5634, -5630, -5377, -5375, -5377, +-5632, -5376, -5375, -6145, -14591, -21761, -24575, -29441, -31999, -30465, -24575, -16641, -9983, -4353, -255, 1535, +3073, 3839, 3328, 4864, 5632, 5120, 3841, 3582, 3586, 3581, 3332, 4092, 11268, 18685, 22529, 20225, +15358, 10241, 5888, 3327, 1026, -2, -1534, -1795, -1789, -1794, -1791, -256, 7423, 14850, 16638, 13313, +8448, 3839, 257, -2304, -4097, -5630, -5378, -6399, -7168, -6912, -7425, -6910, -13570, -21758, -23298, -22014, +-17666, -13053, -9219, -5886, -4097, -2815, -1537, -1535, -1537, -1535, -1, 1, -1, 0, 1, -2, +2, 0, -2, -254, 3327, 12287, 15875, 14844, 11012, 7165, 1794, -7425, -17152, -20224, -18943, -15362, +-11261, -7683, -5119, -3583, -1794, -1534, -1793, -1, 2, -1, 0, 0, 0, 0, 1, -2, +2, -2, 2, -2, -5118, -13314, -17662, -16897, -12800, -8959, -5378, -2046, -257, 769, 1536, 4351, +13057, 18943, 20225, 16895, 12289, 7679, 4610, 1789, 258, -770, -1534, -1537, 1280, 8449, 13822, 13826, +9982, 6402, 2047, -511, -2562, -4093, -5124, -4859, -5892, -6654, -6401, -6655, -6145, -4862, -4867, -5117, +-5123, -5117, -5122, -4863, -4865, -5119, -4865, -5119, -5121, -4863, -4865, -4862, -6404, -14842, -20743, -26617, +-32005, -30206, -24832, -16641, -10239, -5376, -1281, 1281, 2816, 3327, 2818, 4348, 5125, 4860, 4866, 3327, +3072, 3329, 3327, 3072, 5376, 12800, 19201, 19454, 16386, 12287, 7937, 4607, 2048, 513, -769, -1536, +-1791, -1794, -1533, -3, 8194, 14334, 15106, 11519, 7168, 2817, -258, -2557, -4099, -5117, -4612, -6395, +-6661, -6652, -6146, -6656, -6911, -14082, -20734, -21761, -19712, -15615, -11266, -7934, -5633, -3585, -2302, -1282, +-1534, -1538, 2, -2, 1, 1, -2, 2, -2, 1, 0, 0, 768, 6400, 13312, 16384, +13568, 9728, 5119, -5118, -15106, -19454, -18690, -15103, -11264, -7936, -5377, -3327, -2304, -1280, -1535, -2, +2, -1, 1, -1, 1, -1, 2, -3, 3, -2, 1, -1, -767, -6657, -14335, -16897, +-15616, -11519, -7681, -4352, -1279, -2, 1026, 4607, 12543, 18691, 18684, 15364, 11004, 6659, 3839, 1535, +259, -260, -1789, -1537, -1536, 3073, 10494, 13314, 12031, 8705, 4607, 1025, -1025, -2814, -4100, -4603, +-4357, -4859, -6148, -6142, -5377, -4351, -4609, -4607, -4609, -4350, -4355, -4605, -4611, -4606, -4607, -4611, +-4606, -4608, -4610, -4605, -4355, -7422, -15105, -24319, -32000, -31745, -26624, -18687, -12290, -6140, -2564, 258, +1791, 2816, 2817, 3839, 4865, 4350, 4867, 4093, 2819, 3070, 2817, 2815, 3073, 6400, 14079, 18434, +17661, 13826, 9984, 6399, 3329, 1023, 1, -769, -1536, -1279, -1793, 1282, 7933, 13314, 13567, 10241, +6400, 2815, -255, -2561, -3583, -4608, -4353, -5887, -6145, -6143, -6145, -6142, -5891, -7421, -14339, -19710, +-20225, -17407, -13312, -9729, -6656, -4352, -2815, -1793, -1279, -1538, -510, -1, 0, 1, -1, 1, +-1, 1, -2, 4, -4, 1284, 8700, 13827, 14590, 11778, 7678, -1023, -12288, -17152, -16896, -14336, +-10753, -7167, -4864, -3328, -2048, -1280, -1792, -512, 1, -2, 3, -4, 4, -3, 2, -1, +-1, 3, -4, 4, -4, -1788, -7684, -14076, -16387, -14078, -11009, -6912, -3584, -1279, -1, 3072, +11777, 17662, 18435, 15613, 11522, 7167, 4096, 1793, 255, -511, -1537, -1279, -1537, -767, 4351, 10753, +13823, 11265, 7679, 3841, 1024, -1538, -3069, -4100, -4602, -4358, -4860, -6146, -5375, -4096, -4352, -4097, +-4350, -4353, -4353, -4350, -4354, -4350, -4353, -4353, -4350, -4354, -4350, -4098, -3581, -3332, -7932, -18435, +-28670, -30977, -27136, -20481, -14077, -8452, -3324, -260, 1282, 2560, 2560, 3328, 4352, 4095, 4098, 4350, +3330, 2558, 2817, 2816, 2817, 2813, 6916, 12795, 16644, 15870, 12801, 8960, 5119, 3073, 766, 3, +-770, -1535, -1280, -514, 5379, 11262, 12801, 10752, 6911, 3073, 256, -2049, -2815, -4097, -4095, -5120, +-5632, -5377, -5631, -5632, -5889, -5374, -6914, -14079, -18176, -18177, -15615, -11776, -8449, -5631, -3585, -2303, +-1281, -1280, -1279, -1, 1, -1, 0, 1, -1, 1, -1, 1, 0, -1, 1281, 7423, +12546, 13054, 10753, 3840, -6657, -13566, -14850, -12798, -9986, -7422, -5122, -3326, -2306, -1278, -1282, -1022, +-1, 0, 0, 0, 0, 1, -2, 2, -1, 0, 1, -2, 2, -257, -1792, -7935, +-13570, -14589, -13059, -9214, -6145, -3072, -1024, 769, 6910, 13827, 16892, 15363, 11775, 7936, 4608, 2560, +512, 0, -1279, -1282, -1023, -1535, -770, 4098, 9727, 12543, 10242, 7166, 3586, 510, -1534, -2818, +-3838, -4354, -4094, -4610, -5630, -5377, -4095, -4097, -4096, -4095, -4098, -4092, -4101, -4091, -4101, -4092, +-4355, -4094, -4098, -4093, -4100, -3067, -3334, -11002, -24581, -31740, -30722, -24576, -17407, -11009, -5632, -1790, +253, 2051, 2814, 2816, 4098, 4094, 4098, 4095, 4096, 2816, 2560, 2561, 2815, 2816, 2561, 6142, +12803, 16380, 15619, 12543, 8704, 5121, 3070, 1026, -2, -1021, -1284, -1276, 2301, 8963, 12797, 11778, +8702, 4866, 1791, -768, -2560, -4096, -4096, -4608, -5632, -5632, -5633, -5630, -5634, -5630, -5121, -8193, +-14334, -18434, -17918, -15105, -11264, -7936, -5119, -3586, -2557, -1284, -1532, -1028, 4, -3, 2, -1, +0, 0, 1, -2, 3, -2, 0, 1025, 7166, 12546, 13312, 7679, -2304, -9983, -12802, -12029, +-9731, -7421, -5122, -3328, -2048, -1280, -1279, -1280, -1281, 0, 0, 1, 0, -1, 1, -1, +2, -2, 0, -1278, -1283, -1277, -1027, -2814, -8448, -13826, -15101, -12291, -8958, -5888, -3075, -1020, +2813, 11010, 15871, 16127, 13058, 9470, 5890, 3071, 1536, 256, -768, -1536, -1279, -1537, -1279, -1281, +3072, 9985, 12288, 10751, 7425, 3839, 1026, -1282, -2559, -4097, -4351, -4096, -4097, -4607, -4864, -4097, +-4095, -4097, -4095, -4096, -4097, -4095, -4098, -4092, -4100, -4093, -4098, -4095, -4096, -4352, -3840, -6144, +-17664, -29183, -32002, -28414, -20994, -14078, -8194, -3325, -516, 1028, 2556, 2563, 3583, 4352, 4097, 4094, +4098, 3839, 2560, 2817, 2815, 2816, 2561, 2558, 5378, 12543, 16640, 15873, 12543, 8960, 5632, 3072, +1024, 1, -770, -1535, 0, 6144, 11776, 12544, 10240, 6656, 3072, 256, -1791, -3329, -4351, -4354, +-5630, -5633, -5631, -5377, -5632, -5375, -5633, -5375, -8193, -15616, -18175, -17921, -14334, -10756, -7419, -4869, +-3324, -2049, -1027, -1274, -775, 7, -6, 4, -2, 1, 0, -1, 1, -1, 2, -3, +259, 6397, 12291, 11517, 3331, -5379, -10238, -10753, -8960, -6911, -4609, -3328, -2048, -1279, -1281, -1279, +-1026, 3, -3, 3, -3, 2, -1, 0, -255, -1281, -1535, -1282, -1277, -1283, -1277, -1282, +-2815, -9984, -14849, -15615, -12289, -8958, -5378, -2815, -1, 6913, 14592, 17152, 15103, 11521, 7679, 4609, +2303, 769, -1, -1024, -1535, -1281, -1535, -1282, -1534, 2815, 9474, 12797, 11522, 8191, 4097, 1023, +-767, -2562, -3837, -4355, -4350, -4353, -5376, -5375, -4097, -4352, -4352, -4352, -4352, -4351, -4353, -4352, +-4352, -4352, -4352, -4351, -4354, -4350, -4097, -4608, -11775, -24322, -31998, -31489, -26111, -18177, -11520, -5887, +-2305, 1, 1535, 2816, 2817, 3327, 4609, 4095, 4096, 2817, 2815, 2816, 2817, 2815, 2817, 2814, +2562, 4606, 11779, 16381, 16897, 13824, 9984, 6144, 3328, 1279, 1, -768, -1537, 2818, 9725, 13316, +12284, 8963, 4862, 1793, -768, -2560, -4352, -4353, -5119, -5889, -5630, -5890, -5888, -5887, -5634, -5884, +-5893, -9980, -16643, -19453, -18179, -14589, -11011, -7422, -4608, -3586, -2300, -1284, -1534, -512, -2, 3, +-2, 0, 1, -2, 3, -3, 3, -4, 4, 510, 5888, 11010, 7420, -1019, -6661, -8444, +-7427, -5886, -4609, -3072, -2048, -1024, -1280, -1280, -1536, -767, 255, 1, -1, 0, 1, -1, +-766, -1539, -1277, -1540, -1276, -1538, -1280, -1535, -1282, -4094, -10241, -15104, -15360, -12287, -8706, -5118, +-2818, 1794, 10239, 15361, 16382, 13827, 10237, 6402, 3327, 1281, 255, -511, -1537, -1280, -1535, -1537, +-1279, -1537, 1025, 8703, 12289, 12031, 8962, 4862, 1538, -771, -2301, -3842, -4350, -4354, -4351, -4353, +-4094, -4099, -4349, -4355, -4349, -4354, -4352, -4351, -4353, -4351, -4352, -4354, -4348, -4356, -4349, -4610, +-9472, -18174, -26882, -31486, -28162, -22783, -15361, -8958, -4610, -1022, 766, 2305, 3072, 2560, 3328, 4607, +4353, 3328, 2816, 3072, 2815, 3073, 3072, 2816, 2816, 2816, 4352, 10751, 15875, 17148, 14596, 10492, +6659, 3838, 1538, 254, -1023, -512, 5887, 11778, 13566, 11009, 7681, 3582, 2, -1793, -3584, -4351, +-5122, -6142, -5890, -6142, -5890, -5886, -6146, -5887, -6144, -5888, -10496, -17920, -19968, -18688, -14591, -10753, +-7680, -4863, -3073, -2048, -1279, -1537, -767, 0, -1, 1, -1, 1, -1, 2, -3, 3, +-2, 0, 2, 4093, 5890, 1792, -2305, -4351, -4608, -4097, -3071, -2560, -1281, -1535, -1280, -1537, +-1278, -1539, -1277, -1538, -1535, -1536, -1281, -1279, -1280, -1281, -1535, -1280, -1537, -1535, -1536, -1281, +-1534, -1282, -4608, -12286, -16387, -15613, -12291, -8701, -4611, -2046, 4606, 13570, 16639, 16384, 12545, 8958, +5378, 3071, 768, 1, -1281, -1536, -1535, -1537, -1536, -1279, -1793, 0, 7681, 12286, 13059, 9725, +5891, 2301, 2, -2560, -3585, -4351, -4353, -4607, -4353, -5887, -4609, -4352, -4607, -4609, -4352, -4607, +-4610, -4605, -4611, -4349, -4611, -4350, -4609, -4607, -8705, -16127, -21505, -27392, -29183, -25858, -19709, -13827, +-7678, -3585, -256, 1025, 2303, 3072, 2818, 2812, 3077, 3067, 2820, 3069, 2819, 3069, 2818, 2815, +2816, 3073, 2815, 3584, 8961, 14847, 16897, 15615, 11776, 7425, 4095, 1793, 256, -770, 1283, 7933, +13314, 13311, 10240, 6145, 2047, -512, -2816, -4607, -4865, -6144, -6400, -6400, -6144, -6143, -6402, -6398, +-6402, -6398, -6658, -12799, -19967, -22018, -20222, -16386, -12030, -7938, -5629, -3843, -2303, -1280, -1792, -256, +1, -1, -1, 2, -2, 2, -1, 0, 1, -2, 2, -258, -1789, -2050, -1792, -1535, +-1794, -1789, -1027, 259, -259, 2, -1, 1, -1, 0, -512, -2047, -1793, -1791, -1794, -1790, +-1793, -1792, -1791, -1793, -1792, -1791, -1538, -2045, -1795, -2045, -1796, -6908, -15106, -19968, -19455, -14849, +-10496, -5887, -1537, 8704, 18177, 20991, 19456, 14337, 9726, 6146, 2558, 770, -258, -1534, -1794, -1790, +-1794, -1790, -1794, -1790, -769, 6911, 14595, 16124, 13060, 8701, 4098, 255, -2560, -4096, -5375, -5378, +-5630, -5633, -6656, -5887, -5379, -5884, -5635, -5629, -5378, -5377, -5373, -5635, -5885, -5634, -5376, -5375, +-9217, -18943, -24065, -26624, -31230, -32004, -28155, -20741, -14332, -7938, -3328, 1, 1790, 3330, 3839, 3585, +3839, 3584, 3584, 3584, 3585, 3583, 3585, 3583, 3328, 3585, 3583, 3584, 3841, 8958, 17155, 20733, +19457, 15104, 10495, 5890, 2814, 513, -257, 3841, 13311, 16897, 15615, 11009, 5375, 1281, -1793, -4096, +-5375, -6146, -7420, -7685, -7677, -7681, -7425, -7421, -7427, -7422, -7169, -8192, -15104, -22784, -24831, -22274, +-17661, -12804, -8956, -5891, -4350, -2561, -1792, -2303, -769, 1, -1, 1, 0, -2, 4, -6, +7, -6, 4, -2, -3584, -10751, -8449, -2047, 2048, 3583, 3841, 2303, 2049, 768, -1, 1, +-2, 4, -4, -1021, -2051, -1790, -2048, -2048, -2049, -1790, -1794, -1791, -1793, -1535, -1792, -1792, +-2048, -1793, -2046, -2050, -7934, -17666, -21501, -19971, -15102, -9985, -6656, 257, 12031, 20736, 22017, 18430, +14082, 8447, 5120, 1792, 256, -768, -2048, -1791, -1794, -1790, -2049, -2048, -1791, -1538, 5379, 14588, +17925, 15356, 10753, 5634, 1276, -2044, -4098, -5888, -6399, -5889, -6144, -5888, -6143, -6145, -6144, -6144, +-6144, -6144, -6143, -6402, -5887, -6144, -5888, -5888, -7935, -18435, -25851, -27398, -27130, -30725, -31996, -28419, +-20734, -13569, -7424, -2559, -1, 2048, 3841, 4095, 3840, 4097, 4094, 4098, 3839, 4353, 4094, 4099, +4092, 4100, 3837, 4099, 4093, 3842, 7166, 17154, 22783, 22017, 18175, 12288, 7425, 3326, 771, -3, +6658, 16383, 18944, 16128, 10241, 4862, 258, -2561, -5121, -5885, -7428, -8444, -7939, -8447, -8447, -8450, +-8446, -8450, -8191, -8448, -8961, -18173, -26117, -26875, -24579, -18687, -13568, -9472, -6145, -4093, -2564, -1788, +-2308, -1020, -3, 2, -1, -1, 3, -3, 2, -1, -1, 3, -2051, -12286, -18689, -12544, +-256, 7169, 9470, 8194, 6399, 4352, 2561, 1278, -254, 254, 3, -3, -1278, -2050, -1791, -2047, +-1794, -2045, -1796, -2044, -1795, -1790, -1792, -2306, -1789, -2050, -2047, -2048, -2305, -9215, -18944, -22785, +-20479, -15873, -10750, -5634, 2561, 14335, 22016, 22530, 18173, 13571, 7933, 4354, 1279, 1, -1282, -2045, +-2052, -2044, -2051, -2047, -2048, -1793, -2046, 2045, 12547, 17917, 16899, 12285, 6915, 2301, -1278, -3328, +-5633, -6398, -6147, -6142, -6145, -6143, -6145, -6143, -5889, -5888, -6143, -6402, -6398, -6401, -6400, -6400, +-7168, -16384, -25856, -28415, -25346, -24062, -29185, -30464, -26879, -19714, -12542, -6657, -2304, 769, 2557, 4099, +4350, 4354, 4350, 4609, 4352, 4351, 4610, 4349, 4612, 4348, 4868, 4605, 4610, 3583, 2303, 5378, +15615, 23809, 24319, 21247, 14850, 9726, 4866, 2046, 1025, 10496, 19455, 20482, 16638, 10498, 4350, -511, +-3585, -6142, -6914, -8702, -9219, -8958, -9216, -9218, -9213, -8707, -8702, -9217, -8960, -11263, -20993, -28672, +-30207, -26625, -20735, -14337, -9728, -6655, -4353, -2558, -1796, -2556, -515, 259, -2, 0, 0, 1, +-1, 2, -3, 2, -2048, -10497, -21246, -24579, -14846, 1024, 11519, 15874, 13821, 10498, 6655, 4097, +2047, 257, -1, 0, -1023, -2561, -2303, -2305, -2047, -2049, -2047, -2048, -2049, -2559, -2305, -2047, +-2305, -2303, -2305, -2303, -2049, -2816, -11008, -20223, -25345, -22527, -16898, -11262, -6145, 4609, 18431, 25089, +23807, 18945, 13312, 8703, 4097, 1023, 1, -1793, -2303, -2049, -2303, -2049, -2047, -2049, -2047, -2304, +-1, 11265, 18687, 19201, 15360, 9214, 3844, -773, -3323, -4868, -6909, -6914, -6654, -6658, -6910, -6657, +-6655, -6914, -6909, -6660, -6651, -6661, -6908, -6915, -7166, -14081, -25600, -30208, -27904, -21760, -21504, -27135, +-29698, -25854, -19458, -12030, -6401, -1792, 1024, 2560, 4352, 4608, 4352, 4352, 4352, 4352, 4864, 4608, +4865, 4606, 4354, 4606, 4610, 4094, 2050, 2046, 3586, 11774, 22529, 25344, 22527, 17410, 11519, 5887, +2306, 2814, 12545, 19969, 19965, 14852, 9213, 3073, -1535, -4354, -6143, -7680, -9216, -8960, -9215, -8963, +-8956, -8964, -9212, -8963, -9215, -8703, -11265, -21504, -29439, -30210, -26366, -20224, -14594, -10237, -6915, -4606, +-2817, -2047, -2561, -1278, 253, 3, -2, 0, -254, -3, 3, 254, -1280, -8447, -19457, -26367, +-25345, -14591, 3583, 16641, 19711, 18433, 14080, 9216, 5631, 3073, 1279, -254, 254, -766, -2306, -2302, +-2306, -2302, -2307, -2556, -2308, -2557, -2562, -2303, -2304, -2306, -2300, -2309, -2299, -2564, -2814, -13056, +-24064, -27137, -24319, -17921, -11774, -5378, 7169, 21759, 26881, 25088, 18943, 13057, 7423, 4097, 512, -513, +-2303, -2560, -2305, -2303, -2304, -2305, -2558, -2562, -2304, -1534, 7678, 18177, 21248, 17663, 12545, 5632, +768, -2304, -4865, -7166, -7427, -7165, -7170, -7423, -7168, -6912, -7169, -7423, -7425, -7423, -7168, -7168, +-7169, -13055, -24833, -31999, -30976, -25602, -18685, -19970, -26624, -29439, -26114, -19197, -12291, -6910, -1793, 1280, +2818, 4861, 4611, 4861, 4867, 4862, 4866, 4862, 4865, 4864, 4352, 4865, 4605, 4868, 3580, 2052, +2557, 2818, 9726, 19714, 26879, 26112, 20481, 13311, 7680, 4097, 5119, 14848, 22018, 21245, 15362, 8703, +2816, -1791, -5377, -7168, -8704, -9984, -9728, -9983, -9730, -9726, -9730, -9726, -9729, -9728, -9216, -12288, +-24320, -30975, -31745, -27648, -20992, -14848, -9983, -6657, -4863, -2817, -2047, -2048, -1793, 1, 0, -1, +2, -2, 1, -1, -767, -6400, -17665, -26110, -26371, -20989, -12033, 3839, 17410, 23806, 22274, 17662, +11522, 7422, 3842, 2046, 1, 256, -512, -2560, -2305, -2558, -2306, -2302, -2050, -2303, -2048, -2303, +-2563, -2300, -2308, -2556, -2564, -2302, -2304, -3584, -13824, -24320, -27138, -24060, -17668, -11517, -5122, 8961, +22016, 26880, 24320, 18176, 12032, 6656, 3328, 1024, -1023, -2562, -2302, -2562, -2302, -2306, -2303, -2304, +-2560, -2305, -2558, 3837, 15107, 21502, 19456, 13570, 7933, 2819, -1538, -4608, -6399, -7424, -7169, -7423, +-7169, -7424, -7167, -7169, -6911, -7425, -7167, -7170, -6909, -10500, -22011, -30725, -31996, -27651, -20734, -15106, +-16894, -25089, -27649, -25597, -18436, -11773, -5633, -1281, 1282, 2814, 4610, 4863, 4608, 4608, 4608, 4865, +4607, 4865, 4863, 4608, 4353, 4863, 4609, 2047, 2305, 2559, 2305, 4864, 16382, 25603, 26878, 22529, +15872, 10239, 5377, 6656, 17407, 22018, 21501, 15363, 7935, 1791, -2302, -5635, -7421, -9219, -9980, -9732, +-9725, -9730, -9728, -9470, -9474, -9727, -9984, -9473, -13054, -24834, -31998, -31746, -27902, -20994, -15102, -10242, +-6654, -5122, -2558, -2306, -2302, -2306, -255, 0, -1, 2, -2, 1, -1, -4351, -14336, -24577, +-27135, -23041, -16383, -9728, 3071, 17665, 25342, 24835, 19965, 14339, 8957, 5378, 2814, 258, -2, -766, +-2306, -2047, -2304, -2048, -2305, -2302, -2051, -2301, -2306, -2046, -2051, -2300, -2564, -2301, -2305, -2561, +-4094, -14338, -23807, -27392, -23809, -17406, -12035, -5117, 9470, 22273, 26880, 23551, 17665, 11520, 6400, 3327, +258, -1282, -2814, -2306, -2558, -2051, -3835, -4870, -4602, -4613, -4860, -4355, 2, 11263, 19968, 20737, +16639, 9728, 4353, -258, -3581, -5380, -7165, -7426, -7166, -7170, -7422, -7426, -7167, -7168, -7169, -7166, +-7170, -8958, -18947, -29436, -32261, -28923, -22788, -16125, -11522, -14847, -23809, -27136, -24062, -17923, -11260, -5380, +-1533, 1278, 2561, 4864, 4609, 4606, 4354, 4607, 5120, 4864, 4864, 4352, 5121, 4607, 4864, 3584, +2049, 2303, 2304, 2048, 3072, 11777, 22271, 27137, 23806, 17922, 11262, 6914, 9216, 19198, 22531, 19964, +14084, 7165, 1539, -2819, -5886, -6913, -8960, -9983, -9473, -9471, -9474, -9469, -9476, -9468, -9475, -9726, +-9473, -13312, -24832, -31232, -31488, -26880, -20224, -14848, -10240, -6656, -4865, -2559, -2304, -2560, -2560, -769, +257, -256, 0, 0, 0, -2305, -11518, -22530, -26878, -23810, -17662, -11522, -6398, 2303, 16128, 25856, +26625, 22782, 16130, 11519, 6656, 3329, 510, 2, -770, -2302, -2049, -2305, -2301, -2307, -2301, -2307, +-2302, -2306, -2301, -2306, -2303, -2561, -2304, -2559, -2049, -4863, -14849, -24576, -27135, -23554, -16637, -11267, +-2558, 12798, 23810, 25854, 21506, 15871, 9984, 5633, 2302, 1, -2047, -2562, -2557, -2307, -2559, -4864, +-4608, -4608, -4608, -4609, -4863, -2048, 6655, 17154, 20989, 17411, 12285, 5379, 766, -2303, -4864, -6913, +-7167, -7169, -7166, -6914, -7167, -7169, -7167, -6912, -7168, -7680, -15617, -27134, -32002, -30206, -24066, -17919, +-12032, -8704, -12801, -21759, -26113, -23038, -16898, -10496, -5119, -1281, 1794, 2558, 4353, 4863, 4353, 4863, +4865, 4607, 4866, 4604, 4869, 4604, 4866, 3841, 2301, 2564, 2301, 2305, 2561, 2558, 7427, 19452, +25860, 25341, 19714, 13822, 8962, 14078, 22274, 24063, 19199, 12802, 5375, 256, -3584, -6145, -8190, -9474, +-9470, -9729, -9473, -9470, -9730, -9727, -9727, -9730, -9726, -9473, -13824, -24576, -31232, -31232, -26879, -20226, +-14078, -9730, -6654, -4866, -2814, -2050, -2558, -1793, -1, 2, -2, 2, -1, -769, -7678, -19715, +-26621, -25089, -19201, -12798, -7427, -3581, 2046, 13569, 24319, 26882, 25085, 18435, 12797, 7939, 3837, 1284, +-6, -506, -2308, -2046, -2560, -2306, -2302, -2305, -2303, -2049, -2304, -2303, -2561, -2303, -2305, -2303, +-2561, -2303, -5122, -15101, -25347, -26365, -23555, -16638, -11521, -255, 15615, 24065, 24832, 20479, 14594, 8701, +4611, 1278, -254, -2307, -2301, -2050, -2303, -4352, -4864, -4609, -5118, -4610, -4863, -4608, -3072, 2559, +14851, 20731, 19717, 14333, 7937, 2816, -1280, -4097, -6142, -7426, -7167, -7423, -7426, -7166, -7170, -7423, +-7167, -7426, -13566, -24834, -31998, -31746, -26879, -19712, -13825, -8958, -6915, -12029, -22018, -25343, -22529, -16895, +-10753, -5631, -1537, 1537, 2303, 4609, 5119, 4864, 4864, 4609, 4863, 4865, 4862, 5122, 4607, 4609, +3327, 2048, 2304, 2049, 2304, 2302, 2051, 4348, 15621, 25339, 26373, 22011, 15364, 11774, 18432, 24321, +23551, 18432, 11265, 4606, -509, -4612, -6908, -8707, -9727, -9727, -9730, -9214, -9729, -9728, -9728, -9728, +-9471, -9729, -9472, -13823, -24834, -31486, -31489, -26880, -20223, -13825, -9472, -5888, -4351, -2818, -2045, -2308, +-2301, -769, 0, 0, 0, 0, -4863, -16642, -24830, -26370, -20990, -14337, -8704, -4352, -511, 1278, +10242, 22270, 28162, 26111, 20737, 14335, 8960, 4864, 1793, -2, -252, -2310, -2298, -2053, -2300, -2306, +-2304, -2303, -2306, -2301, -2306, -2304, -2302, -2564, -2555, -2309, -2299, -4869, -15868, -25091, -26622, -23553, +-16640, -10239, 3070, 17155, 24061, 23554, 18431, 12289, 7679, 3329, 1023, -1024, -2559, -2304, -2306, -2557, +-4612, -4347, -4613, -4603, -4614, -4346, -4613, -3836, -2, 11519, 19458, 19966, 15106, 9215, 4351, -509, +-3588, -5372, -6916, -6652, -6916, -7164, -7171, -6911, -7167, -6915, -10493, -21250, -30206, -32002, -27391, -21504, +-15105, -9982, -5891, -4605, -11522, -21247, -24064, -22017, -16640, -10239, -5121, -1791, 767, 2049, 3582, 5123, +4349, 4611, 4350, 4609, 4607, 4609, 4351, 4609, 4351, 2304, 2306, 2045, 2563, 2300, 2564, 2302, +3073, 11263, 20992, 25601, 22784, 16639, 15616, 22017, 25855, 23554, 16638, 9728, 3074, -1539, -5117, -6913, +-8960, -9729, -9214, -9475, -9468, -9476, -9212, -8964, -9469, -9218, -9472, -9214, -13570, -25855, -30720, -30210, +-25596, -19716, -13309, -9474, -6143, -4609, -2814, -2051, -2301, -2306, -256, 258, -3, 3, -2818, -13311, +-23297, -25598, -21762, -16127, -10496, -4865, -1534, 1022, 2561, 9216, 20223, 27138, 26878, 21762, 15870, 9729, +5632, 2304, 512, -512, -2304, -2049, -2046, -2306, -2303, -2304, -2306, -1789, -1795, -2045, -2051, -2046, +-2305, -2303, -2050, -2045, -4867, -16381, -24578, -25856, -21758, -16643, -8957, 6397, 19458, 24064, 20991, 16129, +9983, 5633, 2303, 1, -1281, -2303, -2048, -2562, -4349, -4867, -4349, -4867, -4350, -4610, -4349, -4611, +-4350, -1794, 8707, 18173, 19715, 16892, 11012, 5373, 3, -3075, -5117, -7171, -6909, -7171, -6910, -6913, +-7167, -7169, -8959, -18177, -28416, -32255, -28930, -22781, -16388, -11004, -7171, -4862, -4608, -11267, -20988, -24067, +-21758, -15873, -10240, -4864, -1536, 1024, 1792, 2816, 4864, 4352, 4351, 4353, 4609, 4606, 4610, 4606, +3841, 2048, 2048, 1792, 2304, 2048, 2560, 2304, 2560, 2304, 8959, 19459, 24829, 22785, 18176, 20223, +25602, 26622, 21505, 14592, 7168, 1792, -2560, -5889, -7678, -9218, -8957, -9220, -8957, -9218, -9214, -9217, +-8960, -9216, -9216, -9471, -8962, -13565, -24835, -29950, -29440, -24578, -18429, -13315, -9470, -5889, -4351, -2561, +-2048, -2303, -2306, -765, 254, -257, -1276, -9990, -20986, -25348, -22527, -17662, -11268, -6140, -1796, 4, +1532, 2308, 6653, 17665, 26624, 26623, 22274, 16126, 10754, 6398, 2817, 512, -512, -2304, -2560, -2305, +-2047, -2304, -2304, -2304, -2305, -2302, -2306, -2302, -2306, -2047, -2047, -2306, -2302, -5122, -16126, -24578, +-25343, -21247, -16131, -4604, 10492, 20228, 22269, 18945, 13312, 8447, 3842, 1278, -254, -1795, -2301, -2050, +-3070, -4610, -4352, -4606, -4610, -4350, -4610, -4351, -4607, -4354, -1534, 6655, 16384, 19201, 16638, 11267, +5628, 773, -2309, -4859, -6405, -7164, -6660, -6907, -6661, -7163, -7685, -14588, -25859, -31998, -30209, -24575, +-17921, -12287, -8193, -5632, -3582, -3074, -11264, -20735, -23553, -21247, -15104, -9729, -4863, -1281, 1025, 2303, +3330, 5118, 4353, 4607, 4353, 4351, 4867, 4859, 4868, 3070, 1792, 2562, 2045, 2563, 2045, 2051, +1789, 2307, 1790, 6656, 18690, 24318, 23297, 20736, 26367, 29698, 26367, 19712, 12032, 4608, -512, -4096, +-6400, -8191, -9217, -9217, -9214, -8962, -9214, -9218, -9471, -8960, -9216, -8960, -9473, -8703, -13825, -25599, +-29952, -29185, -24320, -18175, -13057, -9215, -5889, -4095, -2305, -2303, -2049, -1792, 1, -1, -255, -6657, +-18432, -25344, -23807, -18945, -12799, -7425, -2816, 1, 1279, 2304, 2561, 6655, 15872, 25345, 27391, 23296, +17153, 11263, 6401, 3071, 513, -1, -1535, -2560, -2049, -2303, -2560, -2305, -2046, -2306, -2303, -2048, +-2304, -2304, -2304, -2048, -2304, -2304, -6656, -16640, -24575, -25601, -21248, -14336, 1, 15103, 20993, 19967, +15361, 10751, 6402, 2814, 257, -1536, -2562, -2045, -2050, -2559, -4609, -4351, -4610, -4605, -4100, -4348, +-4355, -4606, -4354, -2558, 4607, 15871, 19715, 18172, 12292, 6397, 1538, -2050, -4349, -6660, -6907, -6917, +-6908, -7171, -7678, -12288, -23298, -31229, -31747, -26365, -19970, -14592, -10238, -5891, -4349, -2049, -3073, -11262, +-20738, -23806, -21505, -15359, -9986, -5118, -1538, 1026, 2303, 2816, 4864, 4352, 4608, 4608, 4864, 4608, +4608, 3584, 2048, 2304, 2304, 2304, 2047, 1793, 2048, 2047, 2818, 1789, 6659, 16638, 24577, 24320, +26367, 32001, 32000, 25343, 17666, 9213, 2562, -1536, -5633, -6911, -9217, -9215, -9217, -9215, -9217, -8959, +-9217, -9215, -9217, -9471, -9217, -9215, -8705, -13823, -25857, -30463, -29697, -24831, -18432, -13313, -9215, -6145, +-4095, -2048, -2049, -2303, -1025, 257, -1, -4351, -14849, -24319, -24833, -20735, -14594, -8701, -3843, -766, +1023, 2303, 2562, 4607, 5376, 14592, 25344, 27135, 23810, 17662, 12034, 7678, 3585, 512, -513, -2046, +-2050, -2303, -2048, -2049, -2047, -2048, -2048, -2049, -2047, -2049, -2047, -2049, -2046, -2307, -2301, -6914, +-15872, -24063, -24576, -20993, -10751, 6143, 17408, 19969, 16895, 12544, 7169, 4094, 1027, -260, -2044, -2051, +-2046, -1793, -2561, -4350, -4355, -4348, -3844, -4093, -4610, -2560, -2047, -2304, -2049, 3842, 13053, 18947, +16638, 12033, 6912, 2559, -1278, -3330, -5375, -6400, -6145, -6142, -6402, -8959, -17664, -27137, -28414, -25858, +-19454, -14082, -9727, -6144, -4096, -2304, -1791, -2818, -10239, -18944, -21249, -19454, -13825, -8704, -4865, -1278, +766, 2050, 1790, 4098, 4351, 4352, 4096, 3840, 3840, 4353, 3070, 1793, 2049, 2047, 2048, 1792, +2048, 2048, 2049, 2047, 1792, 3840, 14848, 21248, 24577, 30207, 32000, 28929, 20990, 12803, 5373, 2, +-3328, -5889, -7680, -8703, -8193, -8191, -8449, -8192, -8191, -8193, -8448, -8448, -8448, -8448, -8447, -8450, +-13310, -23554, -27646, -26881, -22784, -16639, -12034, -7933, -5635, -3838, -1793, -1792, -2048, -1279, -1, -2560, +-10495, -20227, -22779, -19717, -14588, -8962, -4608, -1278, 253, 2051, 1790, 4097, 4352, 5120, 12544, 20992, +24832, 21760, 16640, 11264, 6657, 3326, 515, -4, -1788, -2308, -2045, -2048, -2051, -2044, -2052, -2044, +-2051, -2046, -2050, -2046, -2049, -2048, -1792, -2048, -6400, -14847, -22274, -23294, -18177, -4097, 10243, 16637, +16385, 13313, 8702, 4866, 1791, 0, -1025, -2045, -1796, -2045, -2049, -2306, -4092, -4099, -4095, -3840, +-3841, -3838, -2050, -2045, -1795, -2302, 2303, 12799, 17667, 17149, 12546, 6911, 2304, -1535, -3585, -5119, +-6145, -5888, -6143, -7426, -14845, -24835, -28670, -25858, -21246, -15362, -10494, -7170, -4863, -3071, -2050, -1789, +-2564, -9725, -17665, -19968, -17664, -12544, -8193, -4094, -1026, 1025, 1791, 1792, 3585, 3839, 3584, 3840, +3584, 3585, 2302, 1537, 1792, 1792, 1536, 1537, 1789, 1540, 1532, 1539, 1534, 1538, 3581, 11012, +17660, 24323, 29182, 28161, 22271, 15362, 8445, 2563, -1026, -4096, -5374, -6659, -6910, -6913, -6655, -6657, +-6654, -6915, -6909, -6915, -6653, -6914, -6654, -6913, -6657, -11007, -18944, -22272, -21759, -17666, -13054, -9730, +-6398, -4354, -2814, -1794, -1534, -2050, -1023, -768, -6401, -14078, -18946, -17150, -13058, -8702, -4866, -2046, +-257, 1280, 1537, 2558, 3330, 3326, 3842, 9727, 17152, 20225, 17662, 13569, 9217, 5374, 2563, 765, +-255, -1535, -1794, -1790, -1537, -1536, -1536, -1535, -1538, -1534, -1793, -1793, -1534, -1538, -1791, -1792, +-1793, -4863, -13056, -18433, -18175, -10754, 1539, 10494, 12033, 10751, 7936, 4609, 2048, 511, -511, -1793, +-1535, -1537, -1534, -1794, -1535, -2816, -3329, -3326, -2818, -1279, -1792, -1280, -1793, -1534, -2051, 1540, +10237, 14337, 13823, 10242, 5630, 2306, -514, -2815, -4096, -5120, -4864, -5377, -9982, -18433, -23553, -22782, +-18690, -14334, -9730, -6909, -4613, -2810, -1541, -1533, -1537, -2305, -8445, -15364, -17404, -15107, -11519, -7423, +-3587, -1019, 506, 1798, 1274, 2821, 3580, 3331, 3326, 3330, 3325, 1795, 1533, 1539, 1534, 1793, +1535, 1537, 1792, 1792, 1535, 1792, 1281, 3328, 11520, 20735, 30208, 32001, 27647, 18946, 11774, 4608, +1, -2817, -4863, -6400, -6656, -6657, -6654, -6659, -6653, -6658, -6655, -6400, -6657, -6399, -6401, -6656, +-6910, -6659, -11261, -19203, -21502, -20736, -16386, -11773, -8451, -5886, -3840, -2306, -1534, -1538, -1534, -1281, +-4351, -12802, -17150, -16641, -13312, -8958, -5124, -2043, -5, 1284, 1533, 2306, 3071, 3073, 3070, 3586, +10493, 16645, 18171, 15620, 11261, 7169, 4096, 1280, 257, -769, -1536, -1280, -1537, -1534, -1537, -1280, +-1536, -1536, -1281, -1279, -1536, -1536, -1280, -1537, -1279, -1793, -5631, -13311, -17667, -12541, -1026, 7425, +9216, 8192, 5632, 3583, 1282, -3, -765, -1538, -1278, -1539, -1276, -1284, -1277, -1537, -1537, -1534, +-1282, -1534, -1282, -1534, -1282, -1535, -1280, -1536, 3841, 11774, 13826, 12030, 7938, 3840, 254, -1533, +-3076, -4348, -4611, -4350, -7937, -16640, -21504, -20992, -17153, -12797, -8965, -5882, -3845, -2301, -1281, -1537, +-1278, -1, -2816, -9983, -15874, -16382, -12801, -8448, -4863, -2050, -253, 1277, 1539, 2045, 3330, 2815, +3073, 2815, 3073, 2303, 1537, 1279, 1537, 1278, 1283, 1533, 1538, 1535, 1537, 1278, 1539, 1276, +5124, 17918, 29441, 32000, 27135, 18945, 11007, 4610, -2, -2814, -4610, -5887, -6144, -5889, -6910, -7682, +-6143, -5887, -5892, -5882, -5894, -5883, -5892, -6141, -6146, -6398, -6402, -12031, -19456, -21248, -18431, -14337, +-10241, -6398, -4354, -2814, -1537, -1280, -1281, -1278, -3074, -11775, -16896, -16130, -13052, -8452, -5117, -1794, +1, 1279, 1281, 2815, 3073, 2816, 3071, 2817, 4863, 12289, 17664, 18175, 14338, 9726, 5889, 2816, +1024, 0, -1281, -1535, -1280, -1536, -1536, -1282, -2046, -3071, -3075, -2812, -1797, -1276, -1538, -1279, +-1537, -1535, -1793, -5888, -13823, -13570, -4349, 3325, 5890, 5887, 4608, 2305, 767, 1, -1025, -1535, +-1281, -1534, -1539, -1533, -1282, -1535, -1280, -1280, -1281, -1279, -1537, -1535, -1537, -1279, -1281, -1535, +-769, 5120, 12033, 13310, 10755, 6653, 3330, 255, -1792, -2815, -4097, -4352, -5887, -13313, -19711, -20481, +-17664, -13310, -9475, -6397, -4099, -2813, -1794, -1279, -1537, -511, 0, -2560, -9729, -14846, -15106, -12287, +-8192, -4865, -1791, -256, 766, 1539, 1534, 2817, 2816, 3071, 2817, 3071, 2050, 1278, 1282, 1278, +1281, 1280, 1536, 1536, 1280, 1279, 1282, 1535, 1535, 10498, 25086, 32001, 29441, 22013, 13571, 7166, +1793, -1536, -3585, -5375, -5888, -5633, -5887, -7169, -7423, -6401, -5631, -5889, -5887, -5889, -5631, -5890, +-5629, -5635, -5629, -6403, -12542, -18944, -20225, -17408, -13311, -9218, -6141, -4098, -2816, -1536, -1279, -1539, +-1531, -8965, -15612, -15875, -13311, -8960, -5376, -2304, -256, 1024, 1280, 2303, 2818, 2814, 2817, 3072, +2559, 5890, 14078, 17410, 16381, 12547, 8190, 4609, 2304, 255, -255, -1280, -1537, -1278, -1283, -1533, +-1282, -2559, -2816, -3073, -1535, -1792, -1793, -1023, -1536, -1280, -1536, -1792, -6913, -10494, -5634, 2, +2815, 2815, 2051, 507, 5, -1028, -1533, -1281, -1281, -1278, -1027, -1276, -1284, -1533, -1281, -1281, +-1278, -1282, -1279, -1280, -1280, -1536, -1536, -1281, -1534, -2, 7171, 12540, 13060, 9725, 6145, 2560, +0, -1792, -3071, -4098, -4863, -11775, -18946, -20478, -17922, -14335, -10240, -6912, -4865, -3071, -1793, -1023, +-1537, -767, -1, 1, -3073, -10238, -15363, -15101, -12290, -8191, -4864, -1792, -1, 1026, 1534, 1538, +3071, 2816, 3073, 2814, 3075, 2301, 1283, 1533, 1283, 1533, 1283, 1278, 1025, 1536, 1535, 1537, +1024, 5631, 19714, 30461, 31747, 25854, 17665, 10496, 4607, 1, -2304, -4097, -5887, -6145, -6142, -6147, +-5885, -6148, -5883, -5892, -5885, -6147, -6142, -5889, -5887, -6144, -5890, -5885, -6403, -12798, -18945, -19968, +-18175, -14338, -10237, -7173, -4346, -3076, -1535, -1279, -1283, -6652, -14083, -16894, -15105, -11264, -6911, -3329, +-1024, 769, 1279, 1537, 2816, 3071, 3073, 3072, 3071, 2817, 7680, 14847, 17666, 16381, 12547, 8702, +4865, 2560, 254, -252, -1285, -1275, -1285, -1275, -1540, -2557, -3075, -2814, -3072, -2817, -3070, -2563, +-1277, -1282, -1279, -1281, -2303, -2817, -2815, -1537, -1280, -1535, -1281, -1279, -1281, -1536, -1280, -1535, +-1538, -1533, -1539, -1534, -1537, -1536, -1280, -1536, -1536, -1535, -1282, -1534, -1282, -1535, -1535, -1794, +-1278, -1538, 1538, 9215, 13568, 12800, 9472, 5633, 1790, -254, -1794, -3326, -4354, -9470, -17154, -20990, +-19970, -15870, -12034, -8190, -5378, -3326, -2305, -1280, -1280, -1280, 1, -1, 0, -3072, -11008, -15104, +-15103, -12290, -8446, -4866, -1791, -256, 1023, 1538, 1277, 2819, 3069, 2819, 3070, 2816, 1282, 1533, +1284, 1532, 1539, 1278, 1538, 1534, 1282, 1534, 1538, 4862, 15106, 25854, 30722, 27646, 20994, 13310, +6402, 1791, -1536, -3327, -5378, -6142, -5889, -6144, -6143, -6145, -6144, -6143, -6402, -6142, -6401, -6144, +-6399, -6401, -6400, -6399, -5634, -6654, -14081, -20480, -21248, -18432, -14592, -10240, -6911, -5123, -2812, -1796, +-1532, -5635, -13566, -17922, -16894, -13314, -9215, -4352, -1536, 257, 1278, 2049, 3583, 3330, 3326, 3586, +3326, 3329, 3840, 11776, 18688, 19712, 17664, 12800, 8449, 4606, 2050, 254, -510, -1794, -1534, -1794, +-1535, -2816, -3584, -3584, -3584, -3584, -3840, -2048, -1535, -1794, -1533, -1540, -1532, 2813, 5378, 1023, +-3072, -5376, -5120, -5632, -5120, -3328, -3328, -3585, -3582, -3330, -1790, -1538, -1790, -1538, -1790, -1794, +-1790, -1794, -1534, -1538, -1534, -1537, -1793, -1789, -1796, -1787, -1541, 4612, 12797, 16387, 14078, 9472, +5378, 1020, -1019, -3589, -3836, -9218, -18176, -24063, -24321, -19711, -15104, -10753, -6911, -4865, -3070, -2050, +-1535, -1537, -767, 255, 2, -515, -5374, -12800, -18177, -17407, -14080, -9473, -5887, -2305, -254, 1022, +1794, 1533, 3331, 3582, 3330, 3581, 3331, 1790, 1793, 1536, 1534, 1795, 1790, 1793, 1535, 1793, +1535, 7425, 16640, 25087, 32001, 31743, 25344, 18177, 11007, 3841, -257, -3584, -5119, -6914, -7165, -7171, +-7165, -7171, -6910, -6913, -6912, -6911, -6913, -6911, -7169, -7424, -7167, -7169, -5887, -5376, -8449, -16126, +-22275, -23549, -20226, -15615, -11007, -7426, -4862, -3330, -1279, -5120, -12800, -18431, -18946, -14846, -10243, -5884, +-2307, 2, 1535, 2048, 3328, 3585, 3583, 3585, 3327, 3329, 3327, 6913, 14847, 19713, 19712, 16383, +11266, 7165, 3588, 1276, 3, -1282, -1791, -1535, -1794, -1791, -3328, -3841, -3327, -3584, -3585, -3838, +-3587, -3581, -1795, -1789, -1282, 5120, 12802, 8956, -1531, -8708, -11518, -10752, -9218, -6909, -5890, -4352, +-3583, -3841, -3839, -2048, -1537, -1791, -1792, -1793, -2046, -2050, -1791, -2048, -2048, -1792, -2048, -1793, +-1791, -1792, -1793, -254, 9214, 16641, 17408, 13823, 9217, 4352, 511, -2046, -3843, -8189, -17922, -25855, +-27392, -23297, -17918, -12546, -8959, -5888, -3841, -2559, -1793, -2047, -1538, 2, -1, 0, -256, -5889, +-16126, -20225, -19200, -15360, -10241, -5374, -2561, -255, 1534, 2050, 1790, 3330, 4095, 3840, 4096, 3072, +2048, 2048, 1791, 2049, 2048, 2048, 1792, 1792, 3071, 11010, 20222, 23554, 29183, 32000, 28929, 22527, +13824, 6401, 1535, -2559, -5120, -6914, -8189, -7938, -7935, -7937, -7935, -7937, -7935, -8193, -7935, -7936, +-7937, -8191, -7682, -8189, -6915, -5630, -6144, -10242, -18174, -25345, -25600, -21759, -16897, -11264, -7935, -5376, +-3074, -4094, -12800, -19969, -21502, -17667, -12798, -7168, -3329, -255, 1535, 2305, 3840, 3838, 3843, 3837, +3843, 3838, 4097, 4352, 10752, 20223, 22786, 20733, 16132, 10748, 6403, 3070, 769, -257, -1790, -1794, +-2047, -1793, -2047, -4097, -4095, -4097, -3839, -4097, -3839, -3841, -3072, -2046, -515, 7683, 16126, 16641, +5376, -7936, -15104, -16384, -14848, -12033, -9470, -6658, -5630, -3842, -3583, -3840, -2049, -1790, -2051, -2044, +-2052, -2045, -2050, -1791, -1793, -1791, -2049, -1791, -2049, -1791, -1793, -2047, 3327, 12545, 18175, 16898, +12030, 6913, 2304, -513, -3070, -5890, -15359, -24321, -27903, -24320, -19969, -14335, -9985, -6656, -4350, -2819, +-1789, -1795, -1790, -513, 1, -1, 0, -1280, -8191, -17409, -21503, -20738, -16126, -10753, -5631, -2305, +-256, 1537, 2302, 1795, 3069, 4355, 4093, 3330, 1791, 2305, 2048, 2303, 2049, 2047, 2048, 2049, +4607, 15617, 24319, 25089, 25598, 30978, 31487, 26369, 18431, 10497, 3838, -1277, -4867, -7166, -8449, -9472, +-9215, -9473, -9216, -9215, -8962, -9213, -9219, -9469, -9220, -9211, -9477, -9211, -7173, -6908, -6915, -6909, +-11523, -23038, -29953, -29440, -24831, -18689, -13312, -8703, -5378, -4862, -12800, -23041, -25343, -21506, -15358, -9729, +-5119, -1025, 1280, 2816, 4865, 4862, 4610, 4607, 4607, 4611, 4349, 4353, 6401, 17918, 25346, 26367, +21760, 15616, 9984, 5376, 2305, -2, -1278, -2562, -2302, -2561, -2049, -2558, -3842, -4350, -4098, -2559, +-2305, -2303, -2049, -2303, 1791, 12544, 20225, 20735, 13056, -2559, -17922, -23037, -22787, -19197, -14595, -11005, +-7938, -6655, -4352, -4608, -3840, -2049, -2301, -2308, -2556, -2308, -2046, -2303, -2306, -2302, -2305, -2049, +-2046, -2306, -2301, -2563, 2, 9215, 18433, 20736, 16383, 11265, 5119, 514, -1795, -4861, -15618, -27136, +-30718, -28675, -23294, -16896, -12034, -7676, -5636, -3326, -2304, -2305, -2303, -1280, 255, -255, -1, 1, +-1280, -9217, -20224, -23295, -21506, -16124, -10757, -6396, -2051, 258, 2047, 2560, 2049, 3071, 4608, 4865, +3325, 1796, 2301, 2050, 2047, 1791, 2305, 2560, 9216, 18944, 25599, 24577, 20991, 23554, 28158, 26369, +20480, 13055, 6146, 510, -3838, -5889, -7936, -9472, -8960, -9215, -9217, -9471, -9217, -9215, -9216, -9474, +-9725, -9219, -9213, -8963, -6909, -7171, -6910, -7169, -6912, -13823, -23809, -30463, -29442, -23805, -17923, -12541, +-7938, -5632, -11775, -21250, -26365, -23555, -17405, -11267, -5118, -1281, 1025, 2559, 4609, 5119, 4609, 4863, +4609, 4863, 4352, 4609, 5374, 13058, 24575, 27904, 25344, 19455, 13059, 7676, 4100, 1021, -255, -2304, +-2304, -2305, -2045, -2307, -2303, -2560, -4609, -4861, -3331, -2046, -2049, -2560, 4865, 17151, 22017, 20479, +14082, 4605, -12029, -24835, -29182, -26368, -21505, -16640, -11775, -8194, -6141, -4611, -5117, -2564, -2300, -2563, +-2301, -2306, -2303, -2049, -2559, -2560, -2561, -2303, -2048, -2048, -2561, -2046, -2307, 4355, 16638, 22017, +20224, 14336, 8703, 2817, -768, -4097, -12797, -26373, -31995, -30980, -26366, -19711, -13827, -8956, -6148, -4349, +-2562, -2558, -2562, -766, 254, 2, -2, -254, 254, -2815, -12032, -22016, -24832, -22529, -16639, -10753, +-5118, -1795, 259, 2301, 2307, 2302, 3073, 5118, 4356, 2299, 2309, 2300, 2305, 2305, 2303, 3841, +13567, 25089, 27135, 24064, 18177, 17663, 23809, 26623, 22784, 16129, 8959, 2305, -2561, -5632, -7423, -9217, +-9983, -9217, -9727, -9729, -9983, -9473, -9728, -9471, -9985, -9727, -9985, -9216, -7423, -7425, -7167, -6914, +-7422, -7426, -14589, -25859, -30974, -29698, -23806, -17154, -11774, -7681, -11775, -22529, -26879, -25345, -18943, -12288, +-6400, -1792, 1280, 2047, 4609, 4864, 4608, 4608, 4607, 4865, 4864, 4863, 4609, 8192, 20223, 27394, +27133, 22531, 16381, 10244, 5883, 2308, 254, -1536, -2558, -2051, -2558, -2561, -2304, -2303, -2561, -2303, +-2305, -2048, -2815, -257, 10752, 20481, 21503, 17920, 11009, 5374, -3838, -18689, -28928, -30976, -26112, -20991, +-15106, -11005, -8196, -5372, -4612, -3835, -2310, -2298, -1797, -2557, -2305, -2305, -2302, -2306, -2302, -2306, +-2303, -2048, -2304, -2048, -2048, 255, 11522, 20223, 21759, 17666, 11261, 5380, 509, -2047, -9984, -24577, +-31487, -31232, -26112, -19200, -13568, -9729, -6398, -4354, -2558, -2049, -2304, -511, -1, -256, 1, -2, +3, -2, -3071, -14081, -24064, -25855, -21505, -15615, -8961, -4351, -769, 769, 2559, 2049, 2304, 4351, +5122, 4350, 2050, 2303, 2303, 2563, 2300, 7941, 21243, 28419, 26879, 21247, 14339, 9725, 16641, 23552, +23808, 17663, 10498, 3582, -1535, -5121, -7166, -7938, -9726, -9474, -9472, -9726, -9730, -9214, -9474, -9727, +-9984, -9473, -9727, -8448, -6912, -7424, -7169, -6910, -7171, -7164, -7940, -17661, -29186, -31999, -28672, -21760, +-15617, -9982, -12034, -22271, -28415, -25859, -19708, -12035, -6655, -1791, 1534, 2818, 4607, 4351, 4611, 4604, +4612, 4604, 4867, 5119, 4863, 5634, 14845, 26371, 29182, 25089, 18432, 11776, 6399, 3074, 765, -1020, +-2564, -2044, -2308, -2301, -2306, -2047, -2304, -2048, -2305, -2559, -2305, 4865, 17407, 22017, 19967, 13825, +7422, 1539, -1540, -11004, -24579, -31486, -30978, -25854, -19714, -13822, -10241, -7680, -5120, -4351, -2562, -2302, +-2305, -2048, -2047, -2305, -2305, -2045, -2308, -2300, -2307, -2302, -2306, -2301, -2308, -1789, 5630, 17410, +22015, 20225, 14333, 8452, 3068, -508, -7171, -21246, -30721, -31488, -27392, -20224, -14847, -9985, -6144, -4096, +-2560, -2303, -2561, -768, 1, -2, 3, 253, 3, -3, 2, -4608, -15361, -24318, -24835, -20989, +-14594, -9214, -4354, -767, 1024, 2817, 2301, 2308, 2300, 2563, 2303, 2047, 2305, 2304, 3584, 12800, +24320, 27903, 24834, 18430, 12033, 6912, 9727, 17666, 22269, 19970, 13568, 7166, 1539, -2051, -5885, -7171, +-8446, -9729, -9728, -9470, -9219, -9470, -9729, -9471, -9729, -9470, -9731, -8701, -7170, -7168, -6909, -7173, +-7163, -7428, -7165, -7939, -17661, -28675, -31230, -27136, -21249, -15359, -13313, -21760, -27903, -27649, -21758, -14852, +-7675, -3332, 258, 2047, 3840, 4865, 4608, 4863, 4608, 4608, 4865, 4863, 4865, 4350, 9475, 19709, +27395, 27645, 22018, 16383, 9985, 5888, 2047, 1, -1537, -2559, -2048, -2305, -2302, -2563, -2300, -2564, +-2301, -2305, -1281, 8962, 19198, 21505, 17409, 12286, 5633, 256, -3328, -5888, -14335, -27139, -31996, -30468, +-25853, -19202, -13567, -9472, -6656, -4865, -3839, -2049, -2303, -2305, -2303, -2304, -2305, -2303, -2306, -2302, +-2305, -2303, -2305, -2559, -2305, -2560, 513, 12031, 20737, 22016, 17407, 11521, 5632, 767, -4351, -17409, +-28415, -30977, -27902, -21762, -15872, -10239, -7169, -4863, -2816, -2049, -2304, -767, -1, 0, 257, -2, +3, -3, 2, -2, -5117, -17411, -24062, -24065, -19713, -13821, -7939, -3582, -1026, 1025, 2560, 2305, +2559, 2303, 2305, 2304, 2560, 2305, 7166, 17410, 26367, 27648, 22785, 15871, 9984, 4866, 2813, 12035, +18941, 20739, 16893, 10500, 4347, -507, -4100, -6141, -7171, -9213, -9731, -9468, -9989, -9467, -9477, -9468, +-9474, -9471, -9985, -8191, -7169, -7167, -7168, -7169, -7167, -7168, -7425, -7166, -8450, -18687, -28672, -31233, +-26623, -20736, -16896, -22272, -28673, -28415, -23552, -16640, -9472, -3841, 2, 1790, 3841, 4864, 4607, 4866, +4606, 4610, 5118, 4610, 5119, 4608, 5633, 14335, 24576, 28417, 25086, 19714, 13055, 7936, 3841, 766, +-254, -2305, -2304, -2048, -2304, -2304, -2047, -2561, -2304, -2304, 2049, 14078, 21251, 21245, 15618, 9471, +3073, -1025, -3840, -6144, -8192, -17151, -28930, -31998, -30978, -25086, -19202, -13054, -9730, -6654, -4865, -3329, +-2045, -2052, -2300, -2308, -2301, -2305, -2304, -2560, -2560, -2304, -2304, -2048, -2304, -2304, -1536, 6400, +17408, 22528, 20224, 15616, 8704, 3072, -1791, -15106, -26622, -31745, -28929, -22781, -16388, -11517, -7682, -5119, +-3328, -2048, -2817, -1535, 0, -1, 2, -2, 1, 0, -1, 1, -768, -6913, -17919, -24577, +-24320, -19199, -12801, -7936, -3071, -513, 1536, 2561, 2302, 2306, 2559, 4865, 3327, 3072, 10496, 22272, +28928, 26881, 20734, 14338, 7934, 3841, 1024, 4353, 15101, 20484, 18940, 13572, 7421, 1793, -2049, -5374, +-6914, -7934, -9986, -9471, -9984, -9728, -9984, -9728, -9472, -9217, -9726, -8194, -7167, -7424, -7169, -7422, +-7170, -7167, -7168, -7424, -6911, -9730, -21758, -30210, -30462, -25346, -19966, -24322, -31230, -30723, -25597, -17667, +-10492, -4100, -509, 1790, 3841, 5120, 4608, 4864, 4608, 4609, 4606, 4866, 4862, 4866, 4607, 9473, +21758, 28674, 27903, 22017, 15615, 8961, 4862, 1283, -2, -1791, -2817, -2303, -2305, -2047, -2305, -2047, +-2049, -1535, 7679, 19200, 21505, 18174, 11779, 5373, 515, -3331, -5117, -6404, -6908, -9474, -19711, -29952, +-32001, -27391, -21249, -15359, -11265, -7167, -4864, -3842, -2301, -2050, -2047, -2049, -2047, -2050, -2043, -2054, +-2043, -1796, -2045, -2306, -2302, -2051, -2300, 2044, 13571, 21503, 21247, 16130, 10494, 4865, 1, -12290, +-25598, -29698, -27135, -21503, -15363, -10492, -6916, -4605, -2562, -2046, -2306, -510, -2, 1, 0, 0, +0, 1, -2, 2, -2, -1023, -8960, -19455, -24322, -22270, -16642, -10750, -6146, -2046, -1, 2048, +2049, 2046, 1794, 3839, 4353, 4863, 15360, 25344, 27648, 22785, 16639, 10752, 6144, 1792, -255, 1023, +8960, 17919, 20227, 15100, 8709, 3834, -762, -3590, -6138, -6918, -8187, -9219, -8960, -8958, -8962, -9215, +-8959, -8963, -8701, -7170, -6654, -6914, -6654, -6913, -6657, -6653, -6661, -6651, -6915, -6654, -10754, -21758, +-28163, -27645, -23042, -25855, -31744, -31233, -26111, -18177, -11006, -5123, -509, 1278, 3585, 4607, 4609, 4607, +4353, 4352, 4607, 4353, 4352, 4350, 4612, 5116, 14083, 23806, 27137, 23552, 17408, 11775, 6913, 3584, +768, -256, -2049, -2302, -2307, -2300, -2052, -2045, -2306, 2, 10494, 19202, 20479, 16127, 9986, 3839, +0, -2559, -5377, -6657, -6654, -7937, -11264, -20223, -29443, -30716, -26628, -21244, -15363, -11007, -7424, -4864, +-3584, -2048, -2304, -2304, -2048, -2304, -2304, -2304, -2304, -2304, -2304, -2048, -2049, -2046, -2562, -1022, +6398, 16129, 20992, 18688, 14336, 8192, 2560, -7680, -21504, -28416, -27648, -22783, -16642, -11518, -7426, -5374, +-3329, -1791, -2306, -1278, -2, 2, -1, 0, 0, 1, -2, 2, -1, 1, -1026, -9469, +-19972, -22268, -20739, -15359, -9983, -5122, -2046, -2, 1537, 2561, 2046, 2562, 3839, 7680, 17664, 24832, +25088, 20225, 14334, 8962, 4606, 1026, -258, -2046, 3326, 13058, 17407, 16384, 12289, 6142, 1538, -1793, +-4096, -6143, -6146, -7677, -8963, -8190, -8194, -8446, -8449, -8447, -7425, -5888, -6655, -6402, -6397, -6147, +-6397, -6404, -6140, -6403, -6141, -6403, -5886, -10242, -21502, -25857, -25087, -26882, -31229, -32004, -27644, -19459, +-12542, -6401, -2047, 511, 2305, 4095, 4097, 4095, 4098, 4093, 4099, 4093, 4098, 4095, 4096, 3841, +8190, 17154, 24318, 24321, 19456, 14336, 8448, 5120, 1536, 256, -1280, -2047, -2051, -2044, -2308, -1788, +-2307, 2050, 13053, 18692, 17404, 13060, 7421, 2305, -1024, -3840, -5376, -6400, -5888, -7936, -8448, -10495, +-20994, -26878, -27393, -24064, -18431, -13057, -9216, -6143, -4098, -2813, -1795, -2045, -2051, -2302, -2305, -2047, +-1793, -2047, -2050, -2045, -1796, -2044, -1795, -1791, 2049, 10750, 17922, 19199, 15872, 10240, 5633, -3586, +-16893, -24323, -25341, -22019, -16638, -11777, -7935, -5121, -3584, -1791, -2305, -1024, 257, -2, 3, -2, +0, 1, -2, 3, -2, 0, 1, -2562, -10494, -19201, -21504, -19967, -14081, -9216, -4608, -1535, +-1, 2049, 1790, 1795, 3325, 10755, 20477, 25858, 22783, 18433, 12799, 7936, 3584, 1281, -257, -1791, +-769, 6912, 15873, 17151, 14336, 9217, 4095, 1, -2561, -5120, -6143, -6145, -7935, -8449, -7936, -8192, +-8191, -8449, -6911, -5889, -6401, -5885, -5891, -5885, -5890, -5888, -6143, -5632, -5889, -5630, -5890, -5887, +-11520, -20225, -23807, -26368, -31233, -32255, -27137, -21247, -13313, -6655, -2562, 3, 2301, 3587, 3581, 3842, +3582, 3587, 3581, 3587, 3581, 3586, 3583, 3329, 4094, 10755, 17661, 19971, 18173, 14083, 9213, 5635, +2813, 515, -259, -1532, -1540, -1533, -1794, -1535, -1792, 4096, 12543, 15874, 13821, 9220, 4604, 1283, +-1795, -3325, -4867, -5117, -5378, -6656, -6655, -6656, -10242, -17661, -22531, -22014, -18688, -14593, -9728, -6655, +-4610, -3325, -1795, -1534, -1537, -1536, -1791, -513, 0, 0, 0, 1, -1, -256, -1536, -1535, +-258, 4355, 12541, 15874, 15104, 10750, 6403, -515, -11518, -18945, -20736, -17663, -13826, -9726, -6657, -4352, +-3071, -1538, -1790, -1281, 0, 1, 255, 1, -1, 1, -1, 1, 0, -1, 2, -3, +-3326, -10752, -16641, -17662, -15363, -10750, -6400, -3329, -1022, 253, 1795, 1534, 3584, 10753, 18175, 20737, +17920, 13823, 8960, 5632, 2305, 768, -768, -1537, -1791, 1278, 9476, 13564, 13570, 10496, 5631, 2049, +-1280, -3073, -4351, -5376, -4865, -6910, -7169, -6912, -6912, -7168, -5377, -4861, -5124, -5117, -4865, -5377, +-5374, -5122, -5375, -5376, -5121, -5118, -5122, -5375, -5376, -11777, -18942, -24322, -30718, -32002, -27903, -20992, +-13824, -7680, -3327, -258, 1282, 3070, 3586, 3071, 3840, 3840, 3072, 3327, 3074, 3326, 3329, 3584, +3327, 5377, 13823, 19457, 19967, 16129, 11775, 7680, 3841, 1790, 259, -1027, -1790, -1537, -1791, -1537, +-1023, 6399, 13312, 15362, 12286, 7937, 3583, 257, -2048, -3584, -5120, -4865, -5630, -6914, -6654, -6658, +-6655, -11008, -18945, -22015, -20992, -17153, -12543, -8705, -5887, -3840, -2817, -1535, -1536, -1536, -1536, 0, +-1, 2, -1, 0, 1, -2, 2, -2, 3, 508, 7685, 13562, 14342, 12283, 8708, 2045, +-8190, -15873, -18432, -16127, -12801, -8960, -6143, -4098, -2557, -1539, -1278, -1281, 1, -1, 0, 1, +-1, 1, 0, -2, 2, -1, 0, 1, -257, -3328, -11008, -15616, -15359, -13058, -8958, -5378, +-2558, -513, 512, 1536, 3327, 10754, 17150, 18946, 15870, 11522, 7422, 4098, 1790, 258, -514, -1534, +-1537, -1024, 4353, 11006, 12802, 11263, 7936, 3584, 257, -1537, -3328, -4352, -4864, -4608, -5631, -6146, +-6142, -6146, -4606, -4610, -4606, -4866, -4606, -4610, -4606, -4610, -4607, -4608, -4608, -4608, -4608, -4353, +-4350, -5122, -11775, -20225, -28414, -32003, -28412, -22021, -15867, -8964, -4350, -1025, 1025, 2303, 3329, 3071, +3585, 4607, 4352, 3073, 3070, 3075, 3070, 2816, 3074, 3324, 7940, 15614, 18176, 16898, 13053, 8962, +5375, 2816, 769, -2, -1021, -1539, -1278, -1793, -1, 7427, 13309, 13570, 10751, 6911, 2563, -260, +-2556, -3587, -4606, -4609, -6145, -6142, -6145, -6143, -6402, -6142, -11522, -18430, -20225, -19200, -15104, -11263, +-8194, -5117, -3587, -2302, -1537, -1536, -1535, -514, 3, -3, 2, -2, 2, -2, 2, -1, +0, 1, 3070, 10753, 14081, 13567, 10240, 4353, -5634, -14334, -17409, -16129, -12798, -9474, -6398, -4354, +-3070, -1794, -1279, -1792, -513, 2, -2, 1, -1, 1, 0, -1, 2, -4, 5, -4, +3, -514, -4608, -12287, -15617, -14847, -11777, -8191, -4865, -2047, -257, 769, 4351, 11521, 17406, 17923, +14845, 10499, 6908, 3587, 1535, 255, -254, -1282, -1279, -1792, 256, 7679, 12290, 12030, 9473, 5632, +2304, -256, -2304, -3329, -4606, -4354, -4606, -4610, -4607, -4352, -4352, -4353, -4350, -4355, -4349, -4353, +-4609, -4350, -4354, -4351, -4351, -4355, -4604, -4356, -4349, -3842, -6142, -13827, -25853, -32003, -30718, -25088, +-17409, -10496, -5375, -1793, 513, 1791, 3073, 2559, 3841, 4352, 4607, 4098, 2814, 2817, 2815, 2818, +3070, 2818, 4605, 10499, 16126, 17410, 14334, 11009, 6912, 4095, 1794, 254, -254, -1281, -1281, -1534, +1022, 8706, 13311, 12800, 9985, 5886, 2562, -257, -2304, -3839, -4354, -4350, -5633, -5888, -5887, -5890, +-5886, -5889, -6399, -12034, -18173, -19715, -17662, -13825, -10240, -6911, -4609, -3328, -1791, -1281, -1535, -1025, +1, -1, 2, -3, 3, -2, 0, 2, -3, 3, 253, 5891, 11773, 13826, 12288, 7423, +-2815, -12288, -16130, -15356, -12292, -9469, -6402, -4095, -2816, -1793, -1023, -1536, -257, 1, -1, 1, +0, -1, 1, -1, 2, -2, 1, 0, 0, 0, -1280, -6145, -13310, -15105, -14592, -11008, +-7168, -4096, -1791, -1, 4096, 11777, 16895, 17153, 13823, 9984, 6145, 3583, 1281, -1, -768, -1536, +-1536, -1279, -1282, 2562, 9214, 12034, 11262, 8450, 4350, 1025, -767, -2819, -3836, -4612, -4348, -4355, +-4351, -4351, -4354, -4350, -4353, -4352, -4352, -4351, -4354, -4350, -4353, -4351, -4353, -4351, -4354, -4349, +-4355, -3325, -3075, -7678, -20481, -31231, -32257, -27904, -20223, -13313, -7166, -3331, -253, 1277, 2563, 2814, +3328, 4354, 4093, 4354, 4095, 2817, 2559, 2817, 2815, 2817, 2815, 5890, 12541, 16386, 16128, 13055, +9218, 5886, 3073, 1023, 257, -768, -1280, -1281, 1537, 8703, 12545, 12031, 8961, 5119, 1537, -769, +-2304, -3584, -4351, -3841, -5631, -5634, -5885, -5891, -5885, -4611, -4093, -7170, -13055, -18176, -18689, -15871, +-12032, -8961, -5886, -3587, -2557, -1282, -1279, -1280, 0, -1, 2, -2, 1, 0, -1, 2, +-2, 2, -2, 1025, 7680, 12543, 13314, 10237, 1028, -8452, -14077, -14082, -11776, -8702, -6147, -4092, +-2564, -1533, -1282, -1535, -1024, -1, 1, -1, 2, -2, 1, -1, 1, 0, 0, 0, +-1, 1, -1024, -1793, -7167, -13057, -15103, -13313, -9728, -6399, -3329, -1279, 3583, 11520, 15873, 15871, +13058, 8957, 6147, 3069, 1027, -3, -764, -1540, -1276, -1540, -1277, -1026, 4866, 10495, 12288, 10495, +6914, 3325, 259, -1282, -2815, -3840, -4354, -4093, -4356, -4091, -4100, -4094, -4353, -4096, -4351, -4353, +-4352, -4351, -4098, -4349, -4355, -4094, -4353, -4095, -4354, -3325, -2820, -4347, -13574, -27130, -32005, -30461, +-23297, -16128, -9728, -4608, -1023, 766, 2563, 2812, 3076, 4094, 4352, 4353, 4350, 3330, 2816, 2815, +3073, 3070, 2819, 2813, 6915, 13053, 16642, 15360, 12287, 8449, 5375, 2816, 769, -1, -767, -1537, +1025, 7423, 12545, 12542, 9474, 5631, 2305, -257, -2047, -3587, -4347, -4101, -5628, -5635, -5630, -5632, +-5633, -5374, -4099, -4605, -7170, -14334, -18690, -18430, -15361, -11521, -8189, -5380, -3580, -2051, -1022, -1538, +-510, -1, 0, 1, -2, 2, -1, 0, 0, 1, -2, 3, 1276, 8708, 13052, 12548, +5373, -4862, -11265, -13057, -11005, -8708, -6396, -3843, -2815, -1791, -1282, -1277, -1283, -767, 2, -4, +5, -4, 1, 2, -3, 3, -3, 3, -771, -1533, -1283, -1277, -1795, -8445, -13827, -15101, +-13059, -9726, -6144, -3329, 2, 7933, 14595, 16126, 14082, 10493, 6916, 4092, 2051, 510, 1, -1280, +-1281, -1279, -1282, -1276, -772, 4099, 10237, 12546, 10495, 7169, 3072, 255, -1278, -2819, -4093, -4354, +-4351, -4352, -4097, -4094, -4099, -4093, -4355, -4094, -4352, -4354, -4350, -4097, -4096, -4095, -4097, -4351, +-4354, -4349, -4100, -4092, -9218, -20480, -29951, -32002, -27390, -19714, -13054, -6913, -3328, -255, 1278, 2562, +2815, 3328, 4353, 4350, 4354, 3839, 2816, 2817, 2813, 2820, 2813, 2817, 3073, 7166, 13314, 16638, +15618, 12542, 8706, 5118, 2818, 766, 2, -1026, -510, 4862, 11265, 12800, 11008, 7168, 3328, 255, +-1279, -3073, -4350, -4099, -5373, -5890, -5632, -5630, -5636, -5883, -5124, -4094, -4864, -8449, -14847, -18944, +-18433, -15103, -11264, -8193, -5374, -3331, -2301, -1283, -1278, -513, 0, 1, -1, 0, 0, 1, +-2, 3, -3, 2, 0, 1279, 8193, 13055, 9729, 0, -7424, -10241, -9727, -7937, -5886, -4098, +-3071, -1537, -1279, -1536, -1536, -769, 1, -1, 2, -3, 3, -3, -253, -1538, -1280, -1535, +-1281, -1535, -1281, -1535, -1281, -2815, -9472, -15106, -15613, -13314, -9471, -5633, -2559, 4094, 12548, 16636, +16387, 12541, 8706, 5631, 2817, 512, -1, -511, -1538, -1278, -1792, -1537, -1535, -770, 4355, 10749, +13058, 11264, 7679, 3841, 511, -1535, -3072, -4096, -4609, -4350, -4355, -4604, -4612, -4605, -4609, -4610, +-4605, -4611, -4605, -4355, -4605, -4611, -4606, -4609, -4608, -4607, -4608, -4353, -7423, -15873, -25855, -32000, +-30721, -25087, -17921, -10750, -6147, -1788, 507, 1797, 2813, 3073, 3072, 4352, 4351, 3074, 2814, 3074, +3071, 3071, 2817, 3071, 2818, 3071, 6143, 14338, 17148, 16646, 13563, 9220, 5629, 3073, 769, -2, +-1276, 1787, 9220, 13565, 13058, 9727, 5632, 1536, -767, -2818, -4606, -4610, -4862, -6145, -5888, -6144, +-5888, -6143, -6146, -5885, -4612, -5115, -9221, -16892, -19970, -19199, -15617, -11518, -8195, -5373, -3842, -1791, +-1280, -1536, -1, 1, -1, 1, 0, -1, 1, -1, 1, -1, 0, 1, 1279, 7937, +10495, 4096, -3071, -7169, -7935, -6913, -5376, -3839, -2817, -1535, -1537, -1536, -1535, -769, 1, -1, +1, 0, -1, 1, -513, -1790, -1538, -1535, -1281, -1535, -1536, -1536, -1536, -1025, -3326, -11011, +-15868, -16132, -13565, -9218, -5887, -1280, 8191, 15106, 17150, 14593, 11008, 7168, 4097, 2047, 256, -511, +-1538, -1277, -1539, -1534, -1537, -1280, -1792, 3329, 11006, 13314, 12030, 8194, 4351, 1025, -1281, -2559, +-4097, -4864, -4607, -4608, -4609, -4606, -4868, -4860, -4867, -4605, -4611, -4606, -4610, -4606, -4609, -4608, +-4352, -4608, -4863, -4610, -6397, -14340, -20732, -27395, -30718, -28417, -22528, -16127, -9474, -4094, -1281, 1024, +2560, 3328, 3071, 3074, 3071, 3072, 3072, 3071, 3073, 3329, 3326, 3074, 3070, 3329, 3072, 6144, +13568, 18176, 17919, 14337, 10240, 6144, 3328, 1024, -256, 512, 6400, 13056, 14848, 12288, 8192, 3584, +0, -2048, -4097, -4862, -5122, -6655, -6656, -6657, -6399, -6912, -6656, -6656, -5633, -4863, -5888, -11520, +-18176, -21504, -20481, -15870, -11778, -8446, -5378, -3327, -2048, -1537, -1790, -2, 1, 1, -3, 4, +-4, 3, -1, -1, 1, 0, 0, 511, 5633, 4607, 2, -3843, -5117, -4867, -3581, -3074, +-1792, -1279, -1792, -1537, -1535, -1537, -1536, -510, 254, -767, -1537, -1279, -1794, -1276, -1541, -1532, +-1538, -1537, -1277, -1540, -1532, -1539, -1534, -4609, -12543, -17154, -16894, -13313, -9727, -4864, 2815, 13056, +18177, 17151, 13569, 9727, 6145, 3327, 769, -1, -767, -1793, -1279, -1793, -1535, -1793, -1535, -1281, +3072, 10241, 14335, 12801, 9215, 4864, 1025, -1281, -2815, -4353, -4864, -4863, -4865, -4608, -4863, -4865, +-4864, -4863, -4865, -4863, -4865, -5120, -4863, -4864, -4865, -4863, -5122, -4861, -5890, -13056, -19711, -22785, +-27135, -28673, -26111, -19970, -13564, -7941, -3580, -259, 1282, 2559, 3328, 3072, 3328, 3073, 3326, 3329, +3072, 3328, 3585, 3326, 3329, 3328, 3071, 3074, 4861, 12803, 17918, 18177, 15614, 11010, 6910, 3587, +1533, 2, 2303, 10240, 14849, 14079, 10753, 6144, 2047, -1022, -3074, -4607, -5120, -6400, -7168, -6912, +-6912, -6656, -7168, -6912, -7169, -6398, -5377, -6401, -13310, -21507, -23805, -21761, -17153, -12798, -8706, -6142, +-3842, -2047, -1792, -1792, 1, -3, 4, -4, 3, -2, 1, 0, 0, -1, 1, 0, +-1024, -1792, -1793, -2046, -2051, -252, -3, 1, 0, 0, 0, 0, 0, 0, 0, 256, +-1023, -2051, -1788, -1796, -1789, -2049, -1793, -2046, -1795, -2045, -2050, -2047, -1792, -1793, -2047, -1793, +-6655, -16642, -21245, -20482, -16127, -11265, -3840, 7425, 18431, 22017, 19200, 14591, 9729, 5375, 2817, 767, +-255, -1793, -1791, -1793, -2047, -1793, -2048, -1790, -2051, 1539, 11774, 16896, 16386, 12030, 7425, 2303, +-767, -3072, -5120, -6145, -5887, -5633, -5887, -6144, -6145, -5887, -5888, -6145, -5887, -5888, -5889, -5886, +-5890, -5886, -5890, -5886, -6658, -14078, -22786, -26366, -26114, -29949, -32003, -28159, -22015, -14082, -7677, -3330, +257, 2047, 3841, 3839, 3842, 3838, 4097, 4095, 3841, 3839, 4098, 4094, 4097, 3840, 4095, 3841, +3841, 4349, 13316, 20989, 22273, 19456, 13824, 8448, 4608, 1792, 256, 6144, 15104, 18432, 15872, 10753, +5374, 1282, -2050, -4349, -5891, -6653, -8195, -7934, -8193, -7679, -8193, -7935, -7937, -7935, -8192, -6145, +-8191, -16385, -23806, -26626, -24063, -18945, -13823, -9472, -5889, -4095, -2049, -1791, -1793, 1, 0, -1, +1, -1, 1, -1, 2, -4, 5, -5, -764, -8194, -12031, -5889, 1, 3327, 4097, 3839, +2049, 1791, 1, -1, 0, 1, -2, 2, -1025, -2048, -1791, -1793, -1793, -2046, -2050, -2045, +-1795, -1790, -1794, -2046, -1794, -2302, -2050, -2045, -2052, -7932, -16900, -22525, -20737, -16383, -11522, -1790, +12030, 20226, 21504, 18942, 13570, 8959, 5120, 1537, -2, -509, -2563, -2046, -2305, -1792, -2047, -2048, +-2050, -2302, -1, 10753, 18175, 18689, 14847, 8960, 3841, -2, -2813, -4866, -6656, -6655, -6914, -6653, +-6403, -6653, -6659, -6654, -6657, -6655, -6657, -6655, -6401, -6912, -6655, -6913, -6655, -13569, -24831, -29442, +-27134, -25601, -29951, -32001, -28671, -21251, -14076, -7427, -2815, 257, 2302, 4353, 4096, 4607, 4610, 4606, +4354, 4606, 4353, 4609, 4350, 4354, 4350, 4609, 4353, 4862, 4354, 12286, 22273, 24832, 22271, 17154, +11262, 6145, 2816, 2814, 11523, 18686, 20225, 16384, 10495, 4353, -768, -3585, -5887, -6656, -8449, -8958, +-8963, -8957, -8963, -8957, -8963, -8958, -8961, -8448, -6911, -9985, -18688, -27905, -29437, -25603, -20221, -14083, +-9727, -6656, -4351, -2561, -1792, -2047, -258, 3, -3, 2, 0, -1, 1, -1, -255, 0, +-257, -6655, -18177, -18431, -7681, 4097, 8959, 9217, 8191, 5888, 3585, 2047, 257, -1, 1, -1, +0, -2046, -2307, -2045, -2307, -2302, -2048, -2304, -2306, -2045, -2307, -2046, -2304, -2051, -2300, -2051, +-2302, -1794, -9471, -20736, -24576, -22271, -17154, -11263, 257, 15614, 22786, 22271, 18432, 12288, 7424, 3840, +1280, 1, -1795, -2300, -2052, -2301, -2049, -2304, -1536, -2305, -2559, -1536, 8192, 17408, 19455, 16641, +10239, 4866, 510, -2046, -4354, -6399, -6911, -6658, -6653, -6659, -6398, -6657, -6912, -6911, -6913, -6911, +-6658, -6910, -6657, -6911, -6657, -11008, -23295, -29953, -29183, -24321, -22784, -27903, -30209, -26624, -20479, -13570, +-6910, -2049, 512, 2816, 4608, 4864, 4609, 4607, 4608, 4864, 4608, 4864, 4865, 4606, 4866, 4863, +4351, 4354, 2814, 3585, 10241, 21758, 26882, 25087, 19711, 13058, 7935, 3328, 4865, 14845, 21251, 21503, +16128, 9984, 3327, -1535, -4608, -6912, -7680, -9729, -9726, -9474, -9726, -9730, -9726, -9729, -9729, -9726, +-9730, -8190, -10497, -21760, -30464, -32000, -27647, -21250, -15102, -10753, -7168, -4607, -2817, -2048, -2047, -258, +3, -3, 2, -1, 1, -1, 1, -1, 0, -4606, -16643, -25853, -22786, -7679, 7423, 14850, +15613, 12804, 8956, 5891, 3582, 1281, -1, 2, -3, -1021, -2819, -2301, -2050, -2304, -2304, -2303, +-2305, -2303, -2561, -2304, -2303, -2305, -2559, -2305, -2303, -2049, -3327, -11777, -22271, -26625, -23808, -18431, +-9985, 3840, 18945, 24573, 23044, 18173, 12034, 7423, 3327, 258, -514, -2045, -2051, -2047, -2304, -2048, +-2047, -2305, -2560, -2304, -2559, 5119, 16641, 20735, 19201, 13311, 6657, 1791, -1791, -4352, -6402, -7677, +-7171, -7166, -7168, -7425, -7167, -7424, -7425, -7679, -7168, -7424, -6912, -7423, -6658, -9726, -22018, -30718, +-31489, -26624, -20480, -20224, -26112, -29951, -26370, -19710, -12545, -6401, -1789, 1020, 2820, 4861, 4609, 4865, +4606, 4865, 4864, 4864, 4865, 4862, 4865, 5119, 4866, 5118, 3586, 2045, 2563, 6910, 18433, 26368, +26624, 21247, 14594, 8702, 4610, 7167, 17664, 22784, 20224, 14592, 8193, 1534, -2558, -5377, -6913, -8958, +-9987, -9725, -10241, -9472, -9728, -9985, -9471, -9984, -9984, -9984, -9471, -12034, -22014, -30978, -31743, -27391, +-21250, -15358, -10242, -6655, -4864, -2817, -2302, -2563, -253, -2, 1, -1, 1, -1, 1, -1, +1, -2817, -14336, -24319, -26369, -20479, -5377, 11008, 18944, 19201, 16383, 11776, 7168, 4353, 2046, 515, +-259, 2, -1537, -2048, -2047, -2561, -2303, -2305, -2304, -2559, -2561, -2048, -2303, -2305, -2303, -2305, +-2560, -2303, -2560, -3073, -12800, -23039, -26370, -23548, -17925, -9467, 6651, 19973, 24828, 22019, 16638, 11009, +6656, 2816, 257, -1027, -2557, -2305, -2305, -2558, -2306, -2303, -2303, -2563, -2044, -2308, 2308, 14589, +20481, 19968, 14849, 8958, 2819, -772, -3836, -6148, -7420, -6916, -7420, -7428, -7165, -7170, -7424, -7422, +-7171, -6909, -7170, -7424, -7167, -8448, -18689, -29183, -32001, -27647, -22273, -15359, -16897, -24831, -27137, -25088, +-18431, -11778, -5629, -1283, 1538, 3071, 4864, 4864, 4865, 4863, 4609, 4862, 4866, 4607, 4608, 4609, +4862, 4867, 4861, 2818, 2558, 2307, 5372, 14597, 24570, 27398, 22268, 16898, 10495, 6912, 10496, 19201, +22526, 20227, 14077, 6658, 1279, -2817, -5885, -7171, -9214, -9729, -9728, -9727, -9729, -9728, -9471, -9730, +-9981, -9731, -9725, -9476, -12027, -23813, -30971, -31748, -26879, -20223, -14593, -9983, -6401, -4096, -2560, -2303, +-2561, -512, 0, 1, -1, 2, -3, 2, 256, -1536, -11264, -22271, -26627, -23036, -17155, -4094, +12799, 22016, 23296, 18689, 14079, 8960, 5376, 2817, 767, 2, -3, -2045, -2307, -2301, -2306, -2303, +-2048, -2048, -2304, -2305, -2047, -2304, -2304, -2304, -2560, -2304, -2304, -2560, -3841, -13567, -24064, -26879, +-23043, -16893, -6915, 9219, 21502, 24321, 20735, 15105, 10239, 5633, 2047, 1, -1281, -2815, -2305, -2559, +-2561, -2304, -2303, -2304, -2562, -2300, -2566, 7, 9721, 18950, 20988, 16387, 11006, 3840, 0, -3583, +-5633, -7423, -7425, -7423, -7169, -7167, -7170, -7165, -6914, -7167, -7424, -7169, -7167, -7424, -15873, -27390, +-32002, -29951, -23552, -16897, -11774, -14850, -24063, -26880, -23809, -17919, -11008, -5121, -1534, 1534, 3073, 4864, +4864, 4864, 5120, 4608, 4864, 4865, 4862, 4610, 4862, 4867, 4861, 3842, 2047, 2304, 2305, 3071, +11265, 22272, 27135, 23809, 18431, 11777, 7936, 13311, 21505, 23807, 19713, 12287, 5633, 511, -3071, -6401, +-8191, -9729, -9726, -9475, -9725, -9474, -9727, -9984, -9729, -9727, -9472, -9728, -9217, -13055, -24320, -31745, +-31230, -26115, -20477, -13826, -9727, -6657, -4350, -2051, -2301, -2562, -1024, 2, -259, 3, -2, 1, +-1, -255, -8192, -19968, -26112, -24577, -18943, -13312, -3328, 12032, 22784, 24575, 21762, 16126, 11522, 6910, +3586, 1534, 1, 1, -1794, -2302, -2306, -2303, -2048, -2304, -2560, -2305, -2302, -2562, -2559, -2304, +-2305, -2302, -2050, -2559, -2304, -4865, -14847, -24065, -26879, -22529, -17151, -5633, 10496, 21761, 23806, 20227, +14332, 8964, 4605, 1794, -1, -1536, -2817, -2302, -2306, -2046, -2049, -2049, -2302, -2306, -2558, -2050, +-2047, 5889, 17150, 20739, 17916, 12803, 6654, 1794, -2049, -4096, -6400, -7168, -7168, -7168, -7168, -7423, +-7426, -7165, -7172, -7165, -7425, -6912, -13312, -24831, -31490, -30974, -25090, -18686, -12801, -9472, -14079, -22530, +-25854, -22530, -16894, -10241, -5120, -768, 1536, 2816, 4865, 4607, 4608, 4864, 4865, 4862, 4356, 4346, +4614, 4604, 4866, 4352, 2302, 2307, 2301, 2307, 2558, 6913, 18687, 25857, 25343, 19969, 13823, 9729, +16127, 23296, 23298, 18429, 11778, 5120, -258, -3836, -6148, -8446, -9728, -9472, -9472, -9472, -9473, -9471, +-9984, -9728, -9472, -9216, -9728, -9217, -14078, -24322, -30462, -30466, -25598, -19202, -13822, -9474, -6143, -4096, +-2048, -2048, -2304, -769, 2, -3, 260, -5, 5, -4, -5373, -17921, -25601, -25855, -19712, -14081, +-7934, -2051, 10244, 23291, 26630, 23546, 18436, 12799, 7679, 3586, 1790, 1, 0, -2049, -2302, -2306, +-2047, -2049, -2303, -2305, -2559, -2304, -2049, -2303, -2306, -2302, -2305, -2302, -2307, -2559, -4863, -16386, +-25596, -26629, -21757, -14593, -2048, 14081, 23039, 23296, 18432, 12800, 7680, 3841, 767, -256, -2304, -2304, +-2304, -2303, -2050, -2302, -2050, -2558, -2306, -2302, -1795, -2812, 2812, 15108, 21244, 19458, 13824, 6911, +1793, -1537, -4350, -6148, -7419, -7173, -7421, -7168, -7426, -7166, -7169, -6912, -7424, -6911, -11522, -23549, +-32003, -31486, -25602, -19454, -12801, -7935, -5377, -13312, -23808, -26112, -21759, -15106, -8958, -3841, 1, 1791, +3585, 4862, 4611, 4861, 4611, 4605, 4610, 4864, 4863, 4865, 4607, 4608, 2305, 2047, 2305, 2303, +2305, 2046, 4610, 15359, 25088, 26368, 21761, 15102, 12546, 19198, 25346, 23808, 17919, 10752, 3584, -1535, +-5121, -7167, -8449, -9471, -9473, -9983, -9473, -9727, -9473, -9727, -9472, -9473, -9470, -9732, -8955, -14085, +-27131, -31748, -30718, -25345, -18432, -12542, -8451, -5630, -3585, -2304, -2302, -2307, -254, -1, 0, 1, +-1, 1, -3073, -15615, -25089, -26623, -22273, -15102, -9219, -4092, -517, 7684, 22014, 27392, 25602, 21244, +14340, 8957, 4609, 2305, 254, 2, -2049, -2305, -2046, -2561, -2304, -2303, -2050, -2046, -2305, -2304, +-2559, -2561, -2303, -2306, -2301, -2564, -2299, -4868, -16895, -25343, -26882, -22526, -15360, -1539, 14340, 23037, +22786, 17662, 12290, 6910, 3330, 767, -257, -2301, -2052, -2301, -2305, -2049, -2045, -2308, -3068, -2564, +-2300, -2564, -2812, -3, 9730, 18943, 20736, 16384, 10752, 3841, -2, -3070, -4866, -7422, -7169, -6912, +-6912, -7169, -7166, -7169, -6913, -6910, -9474, -20735, -30208, -32000, -28929, -22014, -15362, -10239, -6144, -4608, +-11776, -21761, -24831, -21504, -16129, -9469, -3845, -764, 1534, 2305, 4608, 4864, 4350, 4611, 4605, 4868, +4860, 4867, 4862, 4864, 4098, 2046, 2306, 2047, 2303, 2305, 2303, 2562, 9727, 22271, 27137, 24063, +17665, 16384, 23040, 27134, 23811, 17406, 9729, 2817, -1539, -4861, -7426, -9215, -9728, -9472, -9728, -9472, +-9984, -9473, -9981, -9732, -9724, -9219, -9982, -9474, -14078, -26625, -31743, -31234, -25342, -18947, -14076, -9219, +-6399, -4608, -2561, -2303, -2304, -257, 1, 0, -1, 2, -1283, -11261, -22018, -26878, -23298, -17918, +-11011, -5628, -2052, 3, 5119, 17151, 25858, 27390, 23553, 17152, 11519, 6658, 3070, 769, -1, -1279, +-2560, -2048, -2305, -2303, -2305, -2047, -2304, -2305, -2303, -2305, -2047, -2048, -2561, -2303, -2304, -2305, +-5630, -17155, -25340, -26628, -22525, -14850, 1, 16384, 22272, 20991, 16386, 11517, 6404, 2813, 514, -514, +-2559, -2304, -2559, -2561, -2048, -2816, -4864, -4351, -5121, -4609, -4349, -2052, -2555, 5371, 17155, 19711, +17921, 12031, 6656, 1793, -2306, -4093, -6403, -7422, -7169, -6912, -7167, -7170, -7166, -7169, -7935, -16641, +-27135, -32002, -29437, -24067, -17405, -12803, -7933, -4867, -4605, -11779, -21757, -24578, -21247, -16129, -9471, -4352, +-1024, 2047, 2050, 3838, 5121, 4609, 4606, 4610, 4607, 4608, 4864, 4608, 4864, 3328, 2049, 2301, +2308, 2300, 2052, 2300, 2051, 6910, 17154, 25342, 25090, 19710, 20738, 26366, 28418, 24062, 16386, 8703, +2304, -2559, -5633, -7936, -9471, -9730, -9469, -9475, -9470, -9729, -9472, -9727, -9474, -9726, -9217, -9728, +-9216, -14592, -26879, -31490, -30718, -25089, -18432, -13055, -8962, -5630, -4096, -2306, -2301, -2307, -766, 0, +-2, 3, -259, -7165, -19715, -25853, -24323, -19453, -13059, -7933, -3075, 3, 1534, 4865, 14335, 24321, +28415, 24834, 18686, 12801, 7679, 4097, 1023, 2, -1026, -2559, -2304, -2305, -2047, -2560, -2304, -2560, +-2049, -2302, -2306, -2558, -2049, -2305, -2046, -2562, -2046, -6657, -17152, -25599, -26626, -22526, -13057, 3840, +17409, 22270, 19715, 14845, 9218, 5118, 2050, -2, -2045, -2564, -2045, -2562, -2046, -3842, -4862, -4354, +-4606, -4609, -4096, -2815, -1794, -2813, 2301, 14594, 19199, 19200, 14080, 7937, 2558, -1278, -3842, -5631, +-7423, -7170, -7422, -7170, -7166, -6914, -7677, -13828, -24060, -30979, -30206, -25602, -18941, -13571, -8701, -5891, +-3582, -3329, -11775, -21248, -24066, -20733, -15363, -9214, -4097, -1024, 1280, 2305, 3838, 4866, 4350, 4354, +4606, 4609, 4864, 4607, 4354, 2813, 2051, 2302, 2305, 2303, 2562, 2557, 2308, 2044, 4612, 14076, +22276, 24571, 21254, 23802, 28934, 27642, 22020, 14334, 6657, 1536, -2817, -5887, -7936, -9473, -9215, -8960, +-8961, -9214, -9218, -9215, -9215, -8963, -9212, -8964, -9212, -8707, -14079, -25600, -29696, -29184, -23808, -17664, +-12544, -8448, -5121, -4351, -2304, -2048, -2304, -1536, 255, -254, -3, -4604, -15620, -24061, -23810, -19711, +-13568, -8449, -3838, -770, 1537, 2048, 3839, 11522, 20734, 26626, 24575, 18943, 13058, 8445, 4612, 1789, +2, -515, -2301, -2050, -2303, -2048, -2306, -2045, -2306, -2048, -2303, -2050, -2045, -2051, -2558, -2305, +-2303, -2305, -6655, -15873, -24319, -25089, -20478, -8963, 7172, 17916, 20739, 16638, 12033, 7680, 3584, 1280, +-512, -2049, -2047, -2303, -2051, -2044, -4101, -4603, -4612, -4860, -4357, -4602, -3590, -2555, -2308, 3, +10751, 17920, 18432, 15104, 8704, 3584, 1, -2818, -4862, -6657, -6913, -6653, -6916, -6652, -6916, -11260, +-20996, -28924, -30212, -26621, -20481, -14336, -9472, -6400, -4096, -2047, -3330, -11006, -20738, -23295, -19967, -14594, +-8958, -4098, -1535, 1024, 1792, 2816, 4864, 4352, 4608, 4352, 4352, 4352, 4864, 3584, 1792, 2303, +2306, 2302, 2306, 2302, 2049, 2048, 2048, 3072, 11264, 20480, 23809, 23806, 29442, 31999, 28672, 20736, +12801, 5374, -510, -3841, -6400, -8191, -9217, -9217, -9213, -9219, -9213, -8963, -8702, -8961, -9215, -8961, +-8959, -9217, -8959, -14849, -25087, -29441, -27647, -23297, -17408, -11262, -7939, -5374, -3329, -2304, -2303, -2305, +-768, 257, -1, -2304, -12287, -21505, -24063, -20481, -14592, -9471, -4865, -1279, 767, 2048, 2049, 3582, +8450, 19199, 24321, 24063, 19456, 13569, 8958, 5124, 2300, 515, -514, -2303, -2048, -2048, -2048, -2304, +-2048, -1792, -2048, -2304, -2049, -1790, -1794, -2046, -2050, -2047, -2304, -6400, -15873, -23038, -23042, -17662, +-5122, 9217, 16896, 16896, 14336, 8960, 5631, 2818, 254, -766, -2306, -2302, -2306, -1791, -2048, -2817, +-4350, -3074, -3838, -4099, -3837, -2051, -2045, -2050, -1535, 7679, 16641, 17407, 14849, 9471, 4608, 256, +-2559, -4352, -6145, -6400, -6655, -6657, -6399, -8704, -16897, -26110, -29186, -26623, -20737, -14846, -10242, -6911, +-4353, -2815, -1537, -3326, -10500, -19196, -22275, -18942, -13568, -8449, -4096, -1534, 1021, 2052, 2556, 4099, +4094, 4098, 4094, 4097, 4096, 4352, 2303, 2049, 2304, 2048, 2048, 2048, 2047, 1794, 1790, 2050, +2303, 7936, 17664, 23040, 26880, 32001, 31742, 25858, 17918, 10755, 3068, -1276, -4612, -6141, -8193, -8704, +-8704, -8448, -8448, -8704, -8704, -8703, -8706, -8446, -8450, -8446, -8449, -8704, -14592, -24577, -28926, -26626, +-21758, -16642, -11262, -7683, -5116, -3587, -2046, -2050, -2046, -258, 3, -1284, -8700, -19203, -22782, -20993, +-16128, -10496, -5887, -1794, 2, 2302, 2050, 3583, 4608, 6400, 17152, 24063, 23811, 19708, 14851, 9471, +4863, 2051, 252, -1021, -2305, -2048, -2047, -2050, -2046, -2050, -1790, -1793, -2048, -1792, -1792, -2048, +-2047, -1795, -1788, -1796, -5884, -16643, -22527, -22529, -15358, -2, 12290, 16381, 14595, 10750, 6914, 3837, +771, -3, -1788, -2052, -1789, -1795, -2044, -1796, -1789, -2051, -1789, -1794, -1790, -1795, -1789, -1795, +-1789, -1027, 5635, 13310, 15873, 14080, 9471, 4354, 510, -1791, -3583, -5379, -5884, -5379, -5631, -6144, +-12032, -20993, -25854, -24066, -19455, -14849, -10239, -6656, -4609, -2815, -1537, -1535, -2560, -9217, -16895, -19201, +-16638, -12290, -7424, -3582, -1027, 771, 1790, 1536, 3329, 3840, 3583, 3842, 3581, 3843, 2814, 1537, +1792, 1535, 1794, 1790, 1537, 1536, 1535, 1794, 1790, 1794, 5631, 15103, 20994, 28414, 32002, 28926, +22786, 14077, 6915, 1278, -2047, -4864, -6401, -7935, -7425, -7679, -7424, -7425, -7167, -7424, -7425, -7422, +-7427, -7421, -7170, -7679, -7681, -12799, -20993, -24830, -23043, -18685, -13826, -9983, -6656, -4352, -2817, -1790, +-1794, -1791, -512, -257, -5630, -13827, -19709, -19203, -15614, -10753, -6143, -2561, -255, 1534, 1794, 2815, +3841, 3327, 5632, 13312, 19969, 20990, 18178, 13055, 8959, 5122, 2558, 258, -513, -1792, -1536, -1792, +-1791, -1793, -1791, -1793, -1791, -1794, -1790, -1793, -1791, -1793, -1791, -1794, -1789, -5378, -14848, -20478, +-20227, -9980, 3324, 11266, 13311, 11010, 7933, 4612, 2043, 260, -770, -2303, -1793, -2047, -1536, -1538, +-2044, -1796, -1790, -1792, -1793, -1791, -1791, -1539, -1789, -1537, -1793, 4354, 13309, 15875, 14078, 9474, +5118, 1281, -1281, -3326, -4865, -5632, -5632, -5632, -9472, -18688, -25087, -24834, -21246, -16130, -11775, -7936, +-4608, -3329, -1790, -1794, -1791, -2304, -9985, -17406, -18689, -16385, -11774, -7170, -3583, -1279, 509, 1797, +1530, 2821, 3836, 3331, 3582, 3586, 2814, 1537, 2048, 1535, 1538, 1789, 1796, 1531, 1541, 1788, +1795, 1790, 1536, 4866, 13821, 23043, 31230, 32001, 27392, 19199, 10497, 4864, 0, -3072, -5121, -6911, +-7168, -7169, -7166, -7170, -6912, -7167, -7169, -7167, -7167, -7171, -7166, -6912, -7169, -7165, -12548, -20221, +-23554, -22271, -18175, -13057, -9216, -6400, -4352, -2560, -1536, -1792, -1792, -1024, -3584, -11520, -17921, -19198, +-15875, -11517, -6657, -3073, -510, 1022, 1792, 1794, 3326, 3329, 3585, 4605, 12291, 19198, 19969, 17664, +13056, 8447, 5121, 2559, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, -256, -256, -257, -253, -260, -252, -516, -509, -514, -510, -514, +-511, -768, -512, -256, 0, -1, -254, -513, -512, -256, -1, 514, 510, 258, -2, -254, +-769, -1025, -1534, -1794, -1534, -1281, -1536, -1792, -1536, -512, -256, 256, 256, 512, 1537, 2046, +1282, -514, -2301, -2563, -1279, 256, 768, 256, -255, 253, 771, 1534, 1282, -2, -766, -770, +-767, -512, -1024, -2047, -2306, -2047, -1025, -766, -770, 770, 1790, 1025, -1025, -1278, 253, 2307, +3327, 2303, 514, -1027, -1533, -1794, -2046, -1794, -1023, -511, 509, 2565, 1786, 517, 253, -1278, +-769, 2048, 2048, 768, -768, -1535, -770, -509, -515, 2, 1791, 3840, 4609, 2047, 1, 2303, +3328, 2049, 255, -3071, -7169, -11776, -13567, -12801, -13822, -14596, -12796, -10243, -4861, -2, -512, -1024, +-255, 1279, 4609, 5886, 4098, 511, -1792, -3328, -3072, -3583, -6658, -7165, -4868, -1276, 3325, 4098, +3071, 3840, 5889, 7934, 8194, 5887, 3327, 1794, 2559, 3328, 2049, -2306, -3070, 3071, 10241, 15359, +13312, 7169, 7422, 12290, 15615, 17152, 14336, 10496, 6143, 1538, -2050, -5887, -9217, -11263, -8192, -4097, +-6399, -9729, -12287, -13313, -11263, -9216, -9474, -11260, -10502, -6649, -4870, -3836, -3330, -1791, 767, 4097, +7680, 8448, 8192, 9728, 12543, 13570, 12286, 8194, 2046, -3326, -6402, -9215, -12544, -15361, -17662, -15874, +-12030, -8962, -4862, -3842, -3839, -1024, 2047, 3586, 2558, -511, -3584, -6145, -7423, -9216, -9473, -7678, +-6403, -4349, -3587, -253, 3070, 5633, 10239, 13314, 11004, 7173, 5372, 7170, 8449, 5884, 2309, -517, +2308, 8445, 11778, 9470, 7171, 8445, 9729, 12032, 15360, 14593, 10750, 6401, 2560, -1792, -6400, -8192, +-9217, -7935, -5376, -5632, -8192, -9728, -8450, -7420, -9220, -10492, -9475, -7935, -6912, -6401, -8191, -9984, +-7681, -3582, -1539, -1277, -1027, -254, 4096, 8959, 12289, 13567, 11008, 8194, 6397, 2818, -768, -4354, +-7677, -10243, -10495, -9215, -7170, -5373, -4867, -4607, -4095, -2818, -510, 511, 256, 1, -3841, -8192, +-10751, -11265, -10495, -10497, -9727, -8448, -8705, -7422, -2050, 4609, 7680, 7679, 6402, 7166, 11778, 14846, +12545, 9727, 8194, 7935, 9727, 11522, 11518, 9986, 8446, 9730, 12542, 14082, 16127, 15104, 11777, 9214, +5890, -514, -5374, -6913, -7680, -9472, -11008, -11008, -9216, -9984, -10240, -10240, -11264, -9983, -7170, -5885, +-7427, -10238, -10753, -9727, -7170, -5373, -5891, -4606, -3329, 256, 4608, 7681, 9471, 9985, 8959, 7424, +4610, 2301, 515, -514, -3583, -8193, -9215, -8448, -7425, -5118, -4611, -5373, -4354, -1023, 4096, 6143, +3329, -1280, -4609, -6911, -9985, -12031, -14337, -14078, -13315, -13821, -11267, -5118, 1280, 6654, 8963, 9981, +10243, 9981, 12290, 13823, 12544, 11266, 10494, 9472, 8962, 9212, 9221, 7164, 7938, 10496, 13054, 14850, +16383, 16896, 13824, 8961, 5630, 2818, 1023, -2304, -6399, -8704, -9474, -6653, -5380, -5627, -7683, -9472, +-9214, -8196, -8187, -9476, -13054, -14080, -12801, -11006, -10755, -12797, -12035, -8957, -4866, 1025, 3584, 6656, +11262, 12547, 11261, 9219, 6910, 4865, 4351, 3840, 1025, -3329, -7423, -6913, -5119, -7425, -9214, -8451, +-5629, -514, 4097, 4608, 2047, -1023, -4608, -7681, -8703, -9729, -13567, -16385, -16895, -14849, -11775, -8193, +-2558, 1021, 2563, 5373, 7427, 8446, 8961, 8704, 6911, 5889, 7424, 6911, 5635, 5372, 5891, 7934, +7938, 8703, 12800, 16895, 18690, 18173, 14084, 10492, 8963, 8190, 4608, -254, -4098, -6399, -5632, -5121, +-6143, -7168, -9729, -8702, -5379, -6141, -8707, -11773, -13826, -12543, -10497, -11519, -13826, -13309, -12290, -9728, +-6143, -3585, 512, 5377, 8958, 11011, 9725, 6914, 7423, 8704, 7169, 4095, 256, -2303, -2817, -3071, +-5121, -7423, -8193, -7423, -3584, 2046, 5891, 4862, 769, -2561, -2816, -4095, -6401, -10495, -13825, -15615, +-15105, -13567, -12289, -7424, -2047, 511, 3841, 7679, 9984, 10240, 8705, 7935, 8449, 7935, 5889, 5375, +6145, 4863, 4865, 4863, 4353, 8447, 13568, 17152, 18176, 15872, 14849, 14846, 12802, 9982, 5122, -770, +-3838, -3841, -4352, -5375, -7426, -10238, -9218, -5629, -5635, -7421, -9219, -11006, -11265, -10495, -10753, -11263, +-13057, -13312, -11263, -9217, -8447, -5633, 1025, 5631, 7682, 7933, 6403, 7934, 9985, 7425, 5374, 4353, +2816, -257, -1278, -2050, -5631, -10752, -14336, -10752, -4097, 2, 3070, 2306, -257, 512, -255, -4098, +-6910, -9217, -11008, -12799, -13058, -12030, -9217, -6656, -3840, 2048, 5632, 7168, 10240, 11520, 12288, 12288, +9728, 8703, 7938, 7422, 6146, 3839, 1535, 2050, 5118, 8706, 12798, 14850, 14589, 15877, 17402, 15877, +13821, 9985, 3841, -2, -2046, -4353, -7680, -10495, -11266, -10750, -9217, -8959, -8194, -8189, -9988, -8956, +-7426, -10240, -12031, -12545, -12544, -13055, -13057, -12544, -9727, -2305, 2817, 5375, 6912, 7169, 8447, 8449, +7934, 8707, 5885, 2819, 2046, 1280, -1023, -5120, -10497, -15870, -15107, -10237, -7170, -4607, -2560, -1281, +513, -1537, -3070, -3075, -6141, -9731, -11005, -12546, -14592, -13822, -9988, -5627, -516, 3074, 5631, 8960, +11777, 13823, 13569, 11775, 12032, 13313, 12543, 10753, 6911, 3328, 3073, 5118, 7171, 8700, 10756, 11516, +12804, 15356, 15364, 13821, 11777, 8192, 5632, 1536, -3840, -7168, -9985, -12798, -12546, -9727, -9473, -9215, +-8193, -8190, -6146, -5631, -8448, -8705, -8446, -9474, -10750, -13314, -14078, -12034, -8446, -3075, 3331, 5886, +4865, 6400, 8447, 8960, 9986, 7933, 6147, 8189, 8450, 6911, 2048, -5631, -9986, -11005, -11268, -9981, +-6913, -5377, -3837, -1028, -253, -2305, -4608, -6144, -6656, -7937, -11774, -15106, -16383, -14336, -8960, -4608, +-2561, 770, 5117, 8452, 10748, 11524, 10493, 11522, 14334, 13825, 12800, 9216, 4865, 3838, 5122, 6654, +7426, 7423, 8705, 12543, 14848, 13825, 14847, 15362, 12029, 11011, 7676, 1541, -3332, -8189, -11522, -11776, +-10751, -11265, -11264, -9470, -7683, -7165, -7427, -7933, -7171, -9212, -11012, -9725, -12290, -15870, -15362, -13054, +-7682, -1279, 2817, 4094, 5634, 8190, 10498, 10750, 8451, 8700, 11524, 11516, 9476, 6652, 772, -6147, +-9471, -11008, -11520, -11520, -10495, -6914, -2046, -2, -1278, -3073, -3840, -3327, -3074, -7934, -12545, -15360, +-16128, -12799, -9218, -7421, -3844, 1283, 4095, 6399, 8706, 9470, 11009, 13568, 14334, 15363, 11261, 5891, +6654, 6400, 5121, 5888, 6655, 7938, 10494, 12545, 13569, 14589, 16132, 16124, 16643, 14078, 8449, 2816, +-4096, -7937, -9470, -13571, -13308, -10500, -10493, -11266, -9214, -6914, -6398, -6915, -8444, -9732, -9980, -12291, +-15103, -17407, -18178, -14078, -8449, -4863, -769, 4097, 6142, 6403, 8189, 9475, 9981, 11266, 13311, 13312, +11776, 5632, 256, -4096, -8192, -11009, -14335, -15360, -12033, -7678, -5379, -4093, -3330, -4095, -3585, -2814, +-6147, -9468, -12804, -15870, -15360, -14849, -12030, -6914, -3839, -769, 2562, 3581, 4868, 9212, 13315, 14334, +15105, 14080, 11007, 10241, 8191, 5889, 6400, 6143, 7936, 10241, 11263, 11778, 11773, 13059, 16381, 18947, +16381, 12547, 10237, 5634, -769, -5632, -9727, -10754, -10238, -11266, -11518, -9985, -7680, -5375, -4610, -6142, +-6401, -6400, -9472, -13056, -13568, -15615, -16642, -14079, -9728, -2816, 1536, 2816, 4608, 6401, 6910, 8450, +10750, 13058, 15103, 14849, 10238, 7426, 4095, -1536, -5375, -9730, -12798, -11522, -9982, -8194, -5886, -4098, +-2558, -1795, -2812, -4100, -4860, -8452, -12797, -14338, -16126, -16130, -10239, -5889, -3583, -1792, -1024, 2047, +6657, 11008, 13055, 13569, 14336, 14335, 12801, 9983, 8193, 6144, 3839, 6401, 10239, 8962, 6142, 6913, +8960, 12032, 14337, 14589, 13827, 12542, 9475, 3836, -2301, -7939, -9981, -10498, -13566, -14083, -12285, -11523, +-9213, -5378, -3582, -4610, -6655, -8193, -8959, -10240, -14336, -17664, -17921, -15359, -8449, -3071, -256, 2304, +2559, 3330, 6910, 9729, 12288, 14592, 15872, 15360, 13311, 10753, 5375, -253, -5637, -9211, -11013, -13564, +-13314, -9727, -8193, -6399, -4097, -3839, -4865, -4607, -5121, -8703, -13569, -17408, -17663, -13313, -9215, -6913, +-5888, -4864, -1536, 3328, 6913, 11006, 13570, 13566, 14850, 16894, 15106, 9982, 6657, 6401, 7934, 9729, +8448, 7679, 6913, 6656, 9983, 12802, 13566, 16129, 17407, 14594, 10238, 5889, 0, -5377, -7678, -9986, +-11519, -14592, -15104, -10496, -6400, -4609, -3838, -5634, -5885, -5636, -7421, -11010, -15359, -18943, -19970, -15103, +-7679, -3842, -1278, -1026, 258, 3326, 5890, 9726, 12545, 14081, 17150, 18178, 15614, 11009, 7425, 2559, +-3327, -7425, -10752, -13567, -13057, -11263, -8449, -6655, -6401, -5888, -3839, -2817, -4863, -10753, -15360, -16128, +-14079, -12290, -9725, -7939, -8702, -7169, -1280, 3329, 6655, 8961, 10752, 14591, 16898, 15868, 12805, 9468, +7427, 8190, 9985, 8958, 8963, 8445, 5636, 5883, 8709, 11772, 14339, 15614, 16641, 15616, 11265, 5374, +257, -2560, -6145, -10749, -14596, -16637, -13825, -10240, -7423, -5379, -5372, -5635, -4862, -4865, -6400, -12031, +-17665, -20736, -18432, -12800, -7423, -4354, -4094, -2818, 258, 2302, 3842, 8189, 11780, 14332, 17155, 17151, +14847, 11778, 8445, 4100, -1284, -6653, -11010, -12031, -11520, -9472, -8704, -9472, -6400, -2049, -2046, -2818, +-5886, -11265, -15105, -14590, -11778, -10239, -10752, -11264, -8960, -5375, -2562, 1538, 4350, 7426, 12799, 15872, +15617, 14334, 12290, 9983, 8192, 9729, 11518, 11266, 9215, 6656, 6145, 6655, 7424, 10241, 13566, 16642, +17407, 14080, 10496, 7169, 3582, -1023, -6400, -10752, -15104, -15871, -12547, -8956, -6403, -5887, -5631, -3842, +-2301, -2308, -5884, -14340, -18941, -18177, -15105, -12030, -7939, -5629, -5122, -3327, -1536, 255, 3330, 6397, +10499, 14078, 14593, 15105, 13820, 12293, 9724, 4611, -2818, -7423, -9473, -11518, -12802, -12287, -11521, -9215, +-6144, -2561, -766, -4867, -10237, -12290, -13311, -13057, -12030, -11523, -11772, -11268, -8445, -6914, -4351, 512, +4607, 8194, 11517, 14595, 16638, 13825, 10239, 9217, 10495, 11521, 10752, 10239, 8449, 6655, 4866, 3838, +6658, 10749, 13572, 15356, 15619, 13822, 11521, 8192, 5120, -1, -6911, -12289, -15359, -15361, -12286, -8195, +-7933, -7682, -3327, 255, 513, -1536, -7936, -13568, -16641, -16638, -13826, -10495, -7936, -6144, -4864, -3840, +-2304, -257, 3074, 8701, 12036, 12540, 14595, 17149, 17155, 14846, 10496, 5890, 253, -4861, -8195, -10749, +-12802, -14335, -12800, -8450, -5117, -2562, -3072, -6910, -9219, -10494, -12033, -12288, -11262, -9987, -10494, -10753, +-9984, -6655, -2562, -253, 3837, 9218, 13566, 16130, 15103, 12289, 11775, 11009, 11006, 12035, 12285, 10498, +7680, 5118, 4098, 4095, 5888, 8960, 12289, 13310, 14082, 14334, 11777, 9729, 6654, 2, -7170, -12287, +-14847, -14594, -13310, -11778, -9725, -6403, -2814, 254, 2, -3330, -8445, -14084, -17149, -15874, -14079, -11520, +-8704, -6912, -7424, -8193, -4606, -2, 2562, 5118, 8193, 12032, 14848, 15872, 17408, 14848, 10240, 7680, +3328, -1791, -6658, -10749, -14339, -14079, -10239, -7682, -6397, -5635, -5630, -6658, -9726, -13058, -12286, -11521, +-11008, -11008, -12033, -12030, -9985, -7681, -4862, -3, 5380, 8956, 13059, 15358, 14593, 12544, 11008, 12543, +13825, 13568, 13567, 11266, 7934, 6145, 5632, 5375, 6657, 9984, 11519, 12546, 14334, 15361, 14079, 11009, +6399, 770, -5379, -10494, -13569, -14847, -13826, -12029, -8964, -5372, -1539, 1026, -258, -3582, -7426, -12798, +-16129, -15360, -11776, -8705, -9469, -9987, -8958, -7170, -5118, -2050, 1026, 2814, 6914, 12030, 14338, 16126, +16386, 14079, 12800, 10496, 6401, -1, -7424, -11262, -11268, -11003, -11013, -9212, -6402, -5375, -6145, -8447, +-11265, -12031, -12545, -11775, -10753, -11007, -12545, -13312, -11520, -7679, -4866, -1277, 4093, 9218, 12542, 13826, +13054, 11011, 11005, 13057, 14080, 13567, 12290, 10238, 7425, 5120, 5375, 5634, 5630, 6913, 8704, 12544, +14848, 14593, 13310, 10243, 7421, 2561, -4607, -9473, -13566, -16131, -15102, -11265, -7423, -5121, -2047, 1023, +1537, -2817, -8959, -12801, -13822, -13059, -9981, -9474, -10750, -10498, -9982, -7938, -5630, -4097, -2047, 1534, +6658, 11007, 13568, 13826, 14333, 16386, 16384, 12799, 6657, -512, -5633, -8446, -11010, -11007, -9472, -7936, +-7169, -6142, -5635, -7677, -11010, -12031, -11264, -9984, -10753, -11775, -13056, -13825, -12030, -8962, -5631, -768, +5375, 9986, 11262, 12545, 12544, 11776, 12800, 14080, 15359, 15361, 12544, 10240, 8191, 6913, 6143, 4097, +3583, 5889, 9727, 11777, 13312, 14334, 13315, 11005, 8962, 4352, -2561, -10751, -14848, -14082, -13820, -12548, +-7933, -4097, -769, 1538, 255, -4352, -9471, -11523, -12284, -10755, -9726, -10241, -10752, -11008, -9216, -7424, +-8192, -6911, -2562, 2818, 6398, 8449, 10241, 12541, 15620, 17148, 15619, 12799, 7423, 1, -5632, -7937, +-8958, -10755, -11005, -8962, -6911, -5889, -7167, -8705, -11006, -11778, -9215, -9216, -10497, -11007, -13312, -13825, +-12798, -9731, -5629, -1539, 3587, 7678, 9473, 10495, 10497, 11008, 12800, 14592, 15359, 13314, 12542, 11778, +9726, 7682, 5374, 4098, 4094, 5634, 9727, 12288, 11776, 12033, 13311, 13569, 9471, 3585, -3073, -9726, +-14083, -15870, -15104, -12289, -8190, -3587, -510, 511, -511, -4097, -7935, -9730, -9214, -8705, -9983, -9730, +-8702, -8962, -9725, -10500, -8956, -5124, -1532, 1022, 3839, 7170, 9727, 12032, 15617, 17663, 17152, 12289, +6399, 2048, -3327, -6401, -8447, -10496, -10242, -8445, -7170, -7680, -8702, -9987, -11005, -10754, -9728, -8959, +-9729, -12287, -13825, -13823, -12546, -9470, -5889, -1280, 3584, 6144, 7424, 8961, 11006, 12546, 12798, 13827, +14333, 14338, 13822, 13315, 11773, 7426, 4351, 4864, 5888, 7424, 8704, 10240, 11777, 14078, 15361, 14080, +10751, 5123, -2052, -8956, -13827, -15871, -14591, -11778, -7934, -3585, -1024, -1279, -2306, -4606, -6658, -8191, +-9728, -10496, -7937, -6655, -9472, -10753, -11007, -9985, -8447, -6401, -2559, 254, 1795, 4861, 8450, 12543, +15871, 17922, 16382, 12035, 7676, 2820, -2053, -5626, -8452, -9983, -9983, -9219, -8445, -8960, -10499, -11516, +-11523, -9728, -8701, -8965, -10746, -12805, -13820, -14852, -13309, -9217, -4864, -2047, 510, 4098, 7167, 8704, +10753, 12799, 13056, 12289, 13822, 16642, 16128, 13310, 9987, 6909, 6146, 5887, 5377, 5631, 6913, 9215, +12289, 13823, 15617, 15615, 12545, 5887, -767, -7681, -14079, -15361, -14079, -11009, -6911, -5121, -3840, -1792, +-1279, -2817, -7168, -9216, -7936, -7167, -6913, -7680, -8704, -11007, -11521, -9472, -7680, -5888, -3584, -2047, +254, 4098, 8958, 13058, 15870, 17666, 16894, 13315, 9468, 4612, 508, -4092, -7170, -8193, -8957, -8452, +-8956, -11011, -11518, -10754, -9982, -9986, -9213, -8452, -11004, -14340, -15356, -14082, -11776, -9471, -5889, -2815, +-1025, 2305, 6399, 9729, 11007, 10753, 11263, 13568, 15873, 16895, 15617, 12799, 9728, 9216, 7169, 5375, +5632, 5377, 5887, 8192, 10498, 14076, 15621, 15355, 12549, 6908, -1277, -9731, -13309, -13059, -12029, -11011, +-9726, -6145, -2815, -2049, -2816, -4608, -7423, -8193, -7168, -5631, -6657, -7935, -9985, -11520, -10239, -8705, +-7424, -6656, -5888, -3839, -514, 3074, 7678, 12290, 15358, 16642, 16126, 13571, 9725, 6146, 767, -3071, +-4609, -6143, -7681, -9215, -10240, -11009, -12031, -12034, -9726, -8449, -8448, -9471, -12034, -14846, -15362, -13054, +-10754, -7934, -6914, -5374, -1282, 3074, 6910, 8962, 8445, 9988, 12540, 14339, 16126, 16642, 15613, 13060, +11003, 9221, 7421, 6401, 4865, 4093, 5636, 7933, 9986, 13311, 17152, 18432, 13312, 5121, -1538, -6142, +-9986, -12030, -12034, -11262, -9474, -5630, -3330, -2813, -3332, -5371, -7173, -6653, -5120, -5122, -6652, -9221, +-10491, -10245, -9723, -8708, -7933, -8193, -6913, -4863, -2304, 2303, 7938, 11518, 14081, 16128, 16639, 14594, +9981, 6659, 3582, -255, -3583, -4866, -6655, -9728, -11520, -12544, -12800, -11776, -9984, -7679, -7938, -11519, +-13313, -14590, -13569, -11776, -10496, -9985, -8702, -4610, -510, 2301, 5123, 6910, 8193, 10239, 12032, 14081, +16127, 16385, 15103, 12801, 11775, 9729, 7166, 5379, 5117, 4611, 2813, 4355, 10749, 15875, 17917, 16898, +12031, 6145, 767, -4351, -8193, -10752, -11775, -11266, -8957, -6403, -4094, -3841, -5631, -6401, -5375, -5121, +-4351, -5377, -8191, -8960, -9473, -9727, -9473, -8703, -8705, -9471, -8961, -6143, -2305, 1025, 5119, 11521, +14335, 15617, 15616, 14335, 11778, 7677, 4611, 2046, -1023, -4097, -7167, -9473, -12542, -14339, -13053, -10500, +-8187, -7173, -9979, -12548, -13054, -12545, -11775, -11776, -11265, -9727, -7169, -4095, -1536, 2047, 4353, 5888, +7679, 9985, 12544, 14336, 14848, 16383, 16129, 13312, 11264, 10496, 9471, 6914, 4349, 1539, 2046, 5888, +10754, 15101, 16642, 14848, 11774, 6659, 1277, -2813, -7170, -9984, -11006, -9987, -7932, -5892, -5373, -5890, +-6143, -5120, -4864, -4097, -4862, -5634, -7166, -9218, -8447, -7936, -8960, -9471, -9730, -8959, -8959, -7938, +-4093, 252, 5379, 9470, 12803, 14588, 14595, 13566, 11265, 8448, 6143, 3073, 511, -2303, -5888, -10753, +-14591, -13825, -11775, -9729, -8959, -10240, -11777, -12030, -12547, -13309, -13315, -12285, -10754, -9982, -7682, -3839, +-1281, -255, 3583, 7169, 7935, 8961, 11775, 14336, 16129, 15870, 14083, 13566, 13313, 12543, 10497, 6143, +2561, 1536, 2303, 5889, 11008, 14335, 15106, 14333, 11011, 6910, 2305, -2560, -6145, -8959, -8960, -7937, +-7935, -7169, -6398, -6403, -6140, -5125, -2811, -3075, -5119, -6143, -6147, -6908, -7939, -8446, -8193, -8448, +-9472, -9472, -9471, -8450, -4606, 254, 4865, 8960, 12288, 13312, 13567, 14081, 12032, 9472, 7680, 6400, +3839, -1278, -7426, -11775, -13055, -12547, -11005, -11010, -10495, -9983, -11011, -12541, -12547, -12284, -13572, -12542, +-9728, -8193, -7422, -5890, -2560, 1026, 3326, 4866, 6654, 9473, 12543, 14594, 14590, 14081, 14592, 15102, +15108, 13564, 10243, 6142, 2049, 1536, 3072, 6143, 10498, 13054, 13569, 13569, 11260, 6918, 1785, -2297, +-4614, -7163, -8452, -7934, -7681, -8703, -8960, -7169, -5374, -4611, -4349, -4355, -4605, -5634, -6143, -6400, +-7681, -8191, -7681, -8191, -9216, -10497, -10750, -8962, -5120, -510, 3837, 7427, 10494, 12545, 13055, 12544, +11522, 11772, 11269, 9211, 3588, -2562, -6400, -10239, -12546, -12030, -11778, -11518, -11522, -10494, -10755, -12285, +-14082, -14592, -12286, -10499, -9724, -9476, -8189, -5122, -2559, -768, 1024, 3584, 7168, 9472, 11519, 13057, +13056, 14080, 15360, 15871, 15873, 13567, 9986, 5630, 2562, 2558, 3841, 5632, 9215, 12802, 14334, 12545, +9984, 6655, 2305, -1792, -4097, -4606, -6146, -8191, -8960, -8960, -7937, -6398, -5122, -4607, -4096, -4096, +-4353, -4351, -4865, -6654, -7426, -6910, -6658, -7935, -10240, -11008, -10497, -8958, -5378, -1279, 2559, 7426, +10237, 10499, 10494, 12289, 14336, 13824, 12799, 10242, 4862, -766, -5378, -7422, -9985, -11777, -12030, -11522, +-9727, -9983, -12035, -13821, -14594, -13055, -11777, -11775, -10753, -8959, -7681, -5887, -4097, -2047, 767, 4353, +6655, 8449, 10239, 11777, 12799, 14081, 16127, 17409, 15616, 12543, 9985, 7167, 3841, 2048, 3584, 6399, +8961, 11264, 13056, 11776, 8192, 4864, 1536, -511, -1794, -3582, -6145, -8192, -8959, -8706, -7933, -6403, +-5630, -5377, -5376, -3839, -3585, -5120, -5887, -6401, -6399, -6146, -6910, -8961, -10239, -10497, -11008, -10239, +-6145, -767, 3328, 4862, 6915, 8701, 9986, 12288, 14591, 16129, 14079, 9728, 5633, 1536, -3073, -6910, +-10500, -12026, -11526, -10492, -10498, -11263, -12288, -13313, -13823, -13313, -12543, -11008, -9473, -8191, -7681, -7167, +-4865, -1535, 1022, 4099, 6654, 7936, 8705, 10750, 13570, 15616, 15615, 16384, 16128, 13568, 10240, 7169, +4350, 2818, 3582, 6146, 9470, 11523, 11516, 9988, 7420, 4867, 3071, 768, -512, -2561, -5886, -7937, +-8704, -8447, -7683, -6908, -6403, -5630, -4097, -3584, -4352, -4863, -4609, -4863, -6657, -6912, -6399, -7936, +-10753, -12542, -12291, -8957, -5122, -1535, 1792, 3328, 4096, 6144, 9728, 13312, 15360, 14848, 13312, 11776, +8192, 2816, -2560, -6656, -9472, -10751, -11266, -11518, -11266, -12030, -12546, -14078, -14850, -13823, -11776, -9985, +-9215, -8704, -8193, -7934, -5634, -1279, 2304, 3583, 4866, 6654, 8706, 11005, 13059, 14846, 16129, 15873, +15356, 13830, 10490, 7430, 3579, 2307, 4350, 6914, 8958, 9731, 9980, 8195, 6399, 5632, 3585, 2046, +258, -1793, -4863, -7425, -7679, -8193, -8702, -6659, -5629, -5635, -5629, -4354, -2815, -3585, -5376, -5631, +-5121, -5375, -6657, -8704, -11776, -13311, -11777, -8191, -4097, -1279, -1025, -511, 2303, 6657, 9983, 11777, +13824, 15359, 15105, 13055, 9217, 3840, -768, -4353, -7935, -9984, -11009, -10495, -10752, -12289, -13566, -14082, +-14847, -13824, -10753, -8702, -8962, -9982, -9730, -6910, -3842, -1023, 1536, 2816, 4096, 6145, 8958, 11010, +13823, 14591, 14852, 16378, 16902, 14587, 11011, 6911, 4863, 4610, 6142, 8450, 8702, 8449, 8191, 7426, +6397, 5379, 3582, 2049, 767, -767, -3841, -6911, -8448, -7425, -6400, -7166, -7172, -6138, -4615, -3579, +-3330, -4096, -4862, -4867, -4095, -4351, -6657, -10495, -13313, -13055, -9729, -5887, -4608, -4609, -3839, -1281, +1793, 4608, 7424, 10239, 13313, 15615, 15106, 12541, 9475, 5886, 257, -4608, -6913, -8959, -10497, -11262, +-11266, -12543, -15360, -16386, -14588, -12548, -10749, -9986, -10495, -10753, -9470, -6914, -3838, -770, 258, 766, +2562, 5887, 8703, 11011, 12284, 13572, 15101, 16896, 16899, 13563, 10246, 7163, 5890, 6657, 8189, 8196, +7165, 6401, 7424, 7423, 5378, 3839, 3840, 3840, 2048, -1024, -4096, -5631, -6402, -7166, -7425, -7424, +-7167, -6145, -4608, -3327, -3586, -4861, -4356, -2556, -1795, -4094, -8449, -12033, -12542, -10498, -7934, -6145, +-5888, -5888, -3584, -2049, -254, 3070, 6914, 10494, 12801, 14848, 16127, 14338, 11005, 6915, 2814, -2303, +-5889, -7423, -8961, -9727, -11777, -14847, -16385, -15871, -14336, -12289, -11007, -10241, -11518, -11267, -8444, -5381, +-3068, -1538, -767, 255, 3329, 6655, 8961, 10239, 12289, 14335, 16128, 17153, 16383, 13057, 8959, 7937, +9215, 8961, 7679, 6913, 7423, 7426, 5886, 4864, 4609, 4351, 4609, 3584, 1791, -511, -2818, -4861, +-6146, -6143, -7425, -7936, -7168, -5630, -4611, -5630, -5376, -3841, -2304, -1278, -2308, -6139, -9731, -11264, +-10495, -9729, -8447, -6401, -5887, -6145, -6143, -3585, -1280, 1537, 5119, 8705, 11263, 13824, 15105, 14846, +12035, 7933, 2818, -1537, -3584, -5119, -7681, -10240, -12800, -15871, -16898, -15614, -13825, -12545, -12029, -12549, +-12026, -10501, -7932, -5123, -3839, -2816, -1535, 511, 2561, 5630, 7938, 9471, 12033, 15103, 17152, 16385, +13312, 11774, 11012, 9979, 9221, 8957, 9217, 8448, 7424, 5888, 5376, 4607, 4610, 4606, 4354, 3582, +2048, 2, -1538, -2815, -5120, -6913, -6655, -6145, -5887, -5889, -6399, -6144, -4098, -1533, -259, -1790, +-3584, -5889, -9215, -11009, -10240, -8446, -7428, -6395, -5892, -6398, -6400, -4865, -2048, 1026, 4093, 6914, +9727, 13825, 15871, 14593, 12030, 8194, 4351, 1281, -1281, -3583, -7169, -10496, -14079, -15873, -16127, -15105, +-14080, -14079, -13569, -12543, -12034, -10237, -7939, -5118, -4096, -3330, -1532, 763, 2308, 3838, 6657, 10496, +13566, 14852, 15099, 14341, 13563, 11524, 10238, 9985, 10496, 10751, 9728, 8449, 6912, 5375, 4098, 4348, +4612, 4094, 3328, 3074, 2556, 1284, -771, -3582, -5633, -5887, -4865, -5120, -8192, -8704, -7168, -5119, +-3329, -1793, -765, -1540, -4092, -6659, -8702, -9985, -9472, -8192, -6655, -5378, -6653, -8451, -7678, -5121, +-3071, -1025, 1793, 5119, 9217, 13055, 14850, 14589, 11522, 8959, 6145, 3327, 1025, -2050, -6654, -11521, +-13823, -14593, -15359, -15362, -14846, -13824, -14338, -13308, -11013, -9469, -8193, -6144, -3840, -2303, -2306, -1534, +510, 4098, 7678, 10754, 12799, 14591, 15107, 14076, 12036, 11517, 11009, 11265, 12029, 12292, 11004, 8195, +6399, 5631, 4609, 3840, 3840, 3072, 3072, 4351, 3842, 1022, -2302, -2818, -2046, -3074, -4862, -6658, +-8703, -8447, -6658, -4862, -2562, -766, -1026, -2301, -3588, -5884, -8707, -9470, -8449, -6143, -5890, -6397, +-7172, -7931, -7173, -5628, -4099, -2302, 511, 4609, 8703, 12289, 13822, 13059, 11262, 9473, 8704, 6143, +2049, -2304, -6401, -9726, -13058, -14590, -15107, -15869, -16643, -15357, -13570, -13311, -12800, -11010, -7678, -4865, +-3583, -4352, -3586, -1790, 1023, 4097, 7168, 10750, 13315, 14077, 14083, 13309, 11522, 10496, 11519, 12801, +13055, 12545, 10751, 8450, 7165, 6403, 4350, 1793, 2304, 3840, 4352, 3840, 1536, -512, -1025, -510, +-1282, -2814, -5121, -7681, -9214, -8450, -6398, -4354, -2814, -1282, -1022, -2050, -4350, -6658, -8190, -8450, +-7422, -6402, -5886, -6145, -6656, -6911, -7171, -6140, -5123, -3326, -513, 4096, 8191, 9987, 11260, 11780, +11773, 11522, 9727, 7168, 3072, -1536, -5631, -8449, -11263, -13826, -16126, -16642, -15102, -14592, -15106, -15102, +-12802, -9214, -6402, -5374, -4611, -4860, -4612, -2301, 766, 3329, 7167, 10754, 13565, 14084, 13307, 12037, +10492, 11267, 13310, 14336, 13057, 12543, 12033, 10496, 8446, 5124, 2299, 2053, 3324, 4099, 3582, 2306, +1021, 4, 764, 1539, -2, -2815, -5632, -7680, -8704, -8192, -6400, -4096, -2304, -1280, -1024, -2559, +-4610, -6142, -7169, -7936, -7167, -5890, -5374, -6145, -6400, -6398, -7429, -7929, -6663, -3578, -516, 2306, +5631, 7681, 8959, 10752, 12801, 13055, 11008, 7169, 3069, 4, -3075, -7167, -12288, -15105, -15103, -15360, +-15873, -16383, -16384, -15362, -12797, -8706, -6656, -6398, -5635, -5373, -5122, -3582, -3, 3076, 6652, 11267, +13311, 12544, 11008, 10496, 11520, 12288, 12800, 12800, 13824, 14848, 13824, 10496, 7167, 4610, 2814, 2817, +3584, 3583, 2049, 512, 767, 1794, 2558, 2049, 512, -2049, -5374, -7682, -8447, -7679, -5634, -3071, +-2048, -1538, -1532, -2307, -4351, -5888, -6401, -6399, -6656, -5888, -4608, -4352, -6145, -7678, -8194, -7934, +-6402, -3839, -768, 1279, 3074, 5118, 8450, 12286, 14080, 12802, 10493, 8709, 6394, 2564, -2305, -6914, +-10748, -13316, -13821, -14593, -16641, -17406, -16386, -14846, -11522, -8446, -6658, -6143, -5887, -5379, -5116, -3844, +-765, 4094, 8706, 11006, 11010, 10495, 11519, 11778, 11007, 10752, 12289, 14078, 15618, 15871, 14336, 10752, +7169, 4606, 4355, 3836, 3077, 1531, 260, -3, 1026, 2047, 2560, 2560, 1024, -2304, -6143, -8194, +-7934, -6914, -5630, -3586, -2301, -2308, -2299, -3077, -4092, -5635, -6910, -6913, -6143, -4865, -4096, -4863, +-6401, -7935, -8960, -7937, -5632, -3326, -2819, -2556, 508, 4611, 8189, 10499, 12285, 12292, 10748, 9986, +6912, 2046, -2300, -6149, -9723, -12293, -13819, -15876, -17918, -18177, -16640, -14335, -11776, -9217, -7167, -5634, +-5885, -7170, -7423, -3840, 1279, 5121, 7680, 8960, 10495, 11010, 11006, 10242, 9726, 10241, 12544, 15615, +17154, 16126, 13825, 10752, 7935, 6401, 5632, 3584, 1536, 511, 257, -256, 768, 3072, 4352, 3584, +767, -2045, -5124, -7420, -6915, -5374, -4609, -3583, -2818, -1789, -1795, -2302, -4097, -5888, -6143, -5890, +-4862, -3585, -2816, -4095, -7682, -8702, -6913, -5632, -5631, -5121, -4864, -3584, 1, 3839, 6912, 9472, +12032, 12801, 12287, 10752, 7936, 3584, -767, -4610, -7678, -11265, -14336, -17151, -18178, -18174, -17409, -15872, +-12287, -8193, -6399, -7169, -8448, -8191, -6145, -2559, 1279, 4609, 6656, 8446, 10499, 11005, 9731, 8190, +8193, 10495, 13313, 16383, 16897, 15359, 13313, 11519, 9473, 7167, 4865, 3327, 769, -1280, -1537, -510, +1277, 2819, 4862, 3585, 512, -3329, -5375, -5888, -5889, -5375, -5121, -4351, -2816, -2049, -2303, -2817, +-4350, -6659, -6910, -4352, -2562, -2556, -3845, -5884, -7170, -6400, -5375, -5378, -6398, -6401, -5631, -4097, +-1536, 2048, 5632, 8961, 11519, 13056, 13056, 11265, 8190, 4866, 1790, -1791, -6911, -11010, -13567, -16128, +-18433, -19710, -18178, -14335, -11008, -8448, -8193, -8446, -9218, -7934, -5122, -2302, 766, 4354, 6910, 9473, +10497, 9726, 8194, 7166, 8961, 11520, 13824, 15616, 16641, 15870, 13826, 12543, 11008, 8448, 5888, 2560, +-255, -2050, -2302, -1282, 1537, 4352, 4608, 2303, -766, -2307, -3837, -5634, -5632, -4863, -5377, -4863, +-2561, -1536, -2559, -4609, -6399, -6913, -4864, -2560, -2303, -3842, -4862, -5633, -5632, -5632, -5120, -5633, +-6397, -6660, -6909, -5889, -3329, 259, 3836, 7940, 11004, 12292, 11261, 10753, 9473, 6653, 2309, -2053, +-5117, -8706, -13311, -17151, -19201, -19456, -16640, -13313, -10493, -9476, -9212, -9475, -9470, -7938, -5886, -3330, +2, 4351, 8192, 9216, 8193, 7934, 7427, 7165, 8450, 11519, 13824, 15106, 15869, 15619, 14845, 13827, +12285, 9475, 6142, 2817, -1024, -3586, -2557, 509, 2051, 3581, 3843, 2045, -1022, -2561, -3072, -4351, +-5633, -5888, -5119, -3330, -1533, -1795, -4350, -6145, -5888, -4351, -3074, -2301, -2820, -3067, -3845, -4604, +-4612, -4604, -4099, -4861, -5635, -6399, -7167, -6914, -4606, -257, 4607, 6914, 8703, 11008, 12800, 12032, +9728, 6913, 3839, 1023, -2813, -8195, -13821, -17668, -19196, -17924, -16123, -13061, -11260, -10755, -10238, -9218, +-8958, -9218, -7166, -3073, 1535, 5377, 7680, 8447, 7682, 6653, 6659, 7166, 8961, 11265, 12797, 14340, +15868, 15875, 15359, 14847, 14082, 10750, 6146, 1789, -1789, -3842, -2559, 256, 2303, 3073, 2047, 513, +-513, -1022, -2819, -5118, -6145, -5376, -3327, -1792, -2562, -4093, -5891, -5886, -5120, -4609, -3071, -2561, +-2559, -3073, -3839, -4097, -4607, -4610, -3837, -3076, -5116, -8195, -8958, -7170, -4094, -770, 2050, 4863, +8192, 11264, 12288, 11265, 9470, 8195, 6652, 2820, -2308, -8445, -14081, -17665, -17917, -16900, -15869, -14337, +-12033, -10493, -9988, -10237, -10497, -10240, -6912, -2303, 1789, 5125, 7419, 6916, 5886, 6145, 6911, 6657, +8191, 11009, 12288, 13055, 14592, 16129, 16383, 16129, 15103, 11520, 6401, 1535, -2559, -3330, -1277, 509, +1794, 1280, 1534, 1539, 765, -1022, -3841, -5376, -4607, -3074, -2046, -2561, -3585, -4862, -5634, -5887, +-4864, -3585, -3838, -3074, -1791, -2304, -4096, -5377, -3839, -2305, -1790, -3329, -5633, -7935, -7937, -6398, +-4867, -2813, 510, 4609, 7680, 9470, 10755, 10493, 9987, 9726, 8704, 3841, -2817, -8191, -12801, -16127, +-17153, -16895, -15872, -13826, -11517, -10499, -11006, -11264, -11521, -10752, -6911, -1281, 2304, 4354, 6140, 6916, +5629, 5634, 6400, 7423, 8704, 9472, 11009, 12799, 14337, 16126, 17153, 17665, 16127, 11520, 5632, 511, +-1534, -1794, -1278, -515, -253, 1278, 2305, 1792, -257, -2815, -3585, -3583, -3072, -2049, -1534, -2819, +-4604, -5125, -4602, -5126, -5627, -4356, -2813, -1538, -2558, -3842, -4863, -4096, -2049, -1534, -2306, -3582, +-4866, -6655, -8193, -7166, -5379, -3324, 252, 4098, 6144, 7422, 8707, 10751, 12030, 11779, 8701, 3842, +-1792, -6914, -11774, -15360, -16642, -16381, -15364, -13820, -11010, -11263, -12289, -12799, -12289, -10239, -6144, -1792, +2304, 4864, 5632, 5376, 5376, 6400, 6656, 7424, 7936, 8960, 10240, 11775, 14338, 16894, 19202, 18943, +15871, 11011, 5884, 2308, -3, -2046, -2818, -1279, 512, 1536, 1536, 767, -1023, -3073, -3327, -2049, +-1279, -2048, -2561, -3071, -3585, -4607, -5632, -6144, -5121, -3327, -2304, -2817, -4351, -3840, -3585, -3327, +-2048, -1281, -2047, -2817, -4351, -6656, -8448, -8193, -6144, -3327, -257, 1794, 3070, 5120, 8961, 11775, +11777, 11520, 9471, 4353, -1025, -6143, -10753, -15359, -17153, -16128, -14591, -13057, -12288, -12543, -13314, -13566, +-13057, -10239, -5889, -1279, 2046, 3587, 4350, 4865, 5632, 5887, 6657, 7424, 7167, 7425, 8704, 11007, +14850, 18429, 19458, 17919, 15360, 12546, 8190, 3072, -511, -1794, -2301, -1026, 769, 1791, 257, -1537, +-2559, -2305, -2047, -1793, -1791, -2049, -1791, -1793, -4095, -6145, -5631, -4608, -4097, -3583, -2560, -3073, +-3581, -3588, -3325, -2561, -1793, -765, -771, -2047, -3839, -6914, -8446, -6657, -4352, -3071, -2562, -510, +1791, 4864, 8705, 11519, 12288, 11521, 9471, 5889, 767, -5375, -11008, -14081, -15102, -14850, -13568, -12541, +-12549, -13050, -14086, -14331, -12804, -9469, -5378, -1279, 1791, 3073, 3839, 4610, 5630, 6913, 7422, 6915, +5374, 5378, 8446, 12801, 15360, 17408, 18688, 18432, 16384, 13312, 8705, 3837, -764, -2052, -765, 254, +1026, -3, -1533, -2307, -1790, -1792, -3073, -2048, -767, -770, -1789, -3587, -4862, -5632, -5121, -4095, +-4353, -3839, -3329, -3582, -3587, -3837, -3843, -3069, -771, 771, -259, -2557, -4867, -6397, -6914, -5631, +-4864, -4353, -4351, -2561, 258, 4605, 7939, 9726, 11520, 12033, 10239, 6145, 512, -5378, -9981, -13315, +-14589, -13826, -13056, -13310, -13570, -14335, -15104, -14593, -12799, -9471, -5379, -1532, 1275, 1796, 2302, 4865, +7680, 7679, 5889, 4351, 4609, 5888, 8960, 12287, 14850, 16637, 18180, 19196, 17924, 14076, 8963, 3070, +257, 512, 768, 255, -1022, -771, -1276, -2308, -2301, -2306, -1791, -512, 256, -768, -2561, -3583, +-4608, -4864, -4608, -4353, -4862, -4099, -2812, -3077, -4860, -4865, -3074, -1276, 763, 1028, -515, -2557, +-4867, -5373, -4611, -5117, -5634, -6143, -5376, -3330, 4, 3068, 6147, 9726, 11778, 12029, 10244, 6396, +771, -4865, -9216, -11777, -12798, -13058, -12542, -13826, -14334, -14850, -15615, -15872, -13569, -8190, -4610, -3072, +-1790, 765, 3843, 6142, 7680, 6914, 4350, 3585, 4352, 6143, 8961, 11263, 13570, 15870, 19457, 20991, +17664, 12801, 8448, 5119, 2561, 1279, 512, -255, -769, -1023, -2560, -3329, -3071, -2049, -1024, 2, +509, -1533, -2818, -2816, -3327, -4353, -5120, -4862, -3586, -2815, -3841, -4607, -5121, -4606, -3074, 257, +1024, 510, -1276, -2821, -3067, -3076, -3838, -4864, -5890, -6141, -5635, -4093, -1282, 2049, 5631, 9217, +11775, 12289, 10495, 6401, 1023, -4607, -7937, -9472, -11264, -12543, -12544, -12289, -14847, -16898, -16636, -14597, +-11259, -8196, -5886, -4352, -2050, 1794, 5119, 6913, 7423, 6143, 3587, 3836, 5892, 6654, 7168, 9985, +13824, 17662, 19971, 19454, 16897, 13056, 9727, 6401, 3328, 2303, 1794, 253, -508, -1797, -3836, -4098, +-2559, -1024, -258, -253, -1028, -1019, -1541, -2556, -3843, -4607, -4863, -4098, -3326, -3842, -4350, -5634, +-5630, -3842, -1535, -255, -2, -510, -1025, -2305, -2301, -2563, -3327, -4607, -6146, -6397, -6403, -5375, +-2559, 1023, 4353, 8192, 11774, 12035, 8701, 5378, 1023, -3328, -7167, -9218, -9982, -10755, -12284, -14340, +-16892, -17412, -15613, -13826, -12030, -9474, -7422, -5890, -2302, 2558, 5634, 6142, 5378, 4863, 4608, 4353, +4350, 4611, 6397, 10755, 14333, 16898, 18688, 19198, 16643, 13565, 10242, 7167, 4609, 3583, 2817, 1278, +-1533, -4099, -4349, -3075, -2301, -1283, -1021, -515, -254, -256, -1281, -3070, -3844, -4347, -4101, -2811, +-3588, -4862, -6145, -5632, -4606, -3587, -1789, -515, 3, -258, -767, -1024, -2049, -2047, -2303, -4355, +-6397, -6402, -6655, -6400, -4353, 256, 4865, 8192, 10495, 11520, 9472, 5632, 1281, -2817, -5633, -6142, +-7427, -10492, -13059, -15103, -16896, -16897, -14847, -13055, -12290, -11519, -8704, -4865, -766, 2815, 4095, 5121, +6143, 6146, 4350, 3073, 3071, 4354, 7166, 10497, 13824, 17152, 18432, 18688, 17151, 13826, 10239, 7935, +7427, 5883, 3078, 250, -2555, -3843, -3839, -3327, -2307, -1788, -1028, -253, 255, -256, -2048, -3071, +-3330, -2558, -2562, -3838, -4609, -5376, -5888, -5121, -3839, -3584, -2049, -511, 255, -512, -511, -1, +-768, -1791, -2305, -3071, -5377, -7936, -8191, -7169, -4351, -513, 3328, 6913, 10238, 11010, 8190, 4098, +1023, -1536, -3329, -4607, -6400, -10496, -13824, -15873, -16126, -15362, -14590, -14851, -14333, -11522, -7934, -4866, +-1791, 1024, 4352, 5888, 6400, 5375, 3586, 2815, 2816, 4609, 7421, 9731, 13311, 16639, 18691, 18171, +15877, 13053, 11265, 10752, 8704, 6144, 3328, 0, -2560, -3328, -3839, -3330, -3327, -2047, -258, 258, +-513, -1025, -1790, -2305, -1792, -1023, -2817, -4608, -4608, -4863, -5633, -5375, -3840, -2561, -2560, -1535, +-1, 258, -1, -258, -254, -1, -511, -2816, -6401, -7936, -7423, -7169, -5887, -1281, 3329, 7167, +9473, 9215, 6401, 3071, 1025, -513, -768, -3071, -7426, -11517, -14083, -14079, -14334, -15876, -16379, -15621, +-13564, -11523, -8701, -5379, -2558, 1023, 4353, 6398, 5635, 4093, 3330, 2816, 3070, 4098, 5632, 9471, +13569, 16382, 17411, 16124, 15109, 13563, 12547, 11519, 9984, 6401, 2815, 512, -1792, -4095, -4352, -3841, +-3071, -1537, -256, 2, -1539, -2045, -771, -766, -1538, -1789, -2820, -4348, -5636, -5372, -4867, -5118, +-4610, -3838, -3073, -1024, 256, -767, -514, 771, 1532, 515, -514, -2559, -5376, -7168, -8449, -8190, +-5634, -1535, 3328, 6912, 8449, 7166, 4354, 3070, 2819, 2813, 258, -4097, -7681, -9981, -11523, -13566, +-15104, -15875, -16380, -15363, -13566, -11777, -9216, -6400, -2047, 2046, 4354, 5374, 5122, 4607, 3584, 2560, +2304, 3583, 6915, 9980, 13316, 15868, 15875, 15103, 15104, 15104, 13824, 12543, 10755, 7676, 3843, 1022, +-2047, -4352, -4864, -3328, -2049, -1534, -1539, -1020, -1284, -1532, -260, 259, -257, -1536, -3328, -4864, +-4864, -4351, -5378, -5630, -4098, -3070, -2049, -1792, -1024, 0, 768, 1536, 1536, 1024, 256, -2047, +-4866, -7678, -9217, -8704, -5887, -770, 4099, 6141, 5123, 3837, 4354, 4863, 4097, 2303, -767, -3586, +-6397, -8707, -11006, -13569, -15361, -16125, -15876, -15100, -14595, -13055, -10240, -5889, -2046, 767, 3840, 5376, +5120, 3840, 2816, 2049, 1534, 3842, 7679, 9984, 12033, 14079, 14848, 14848, 15360, 15361, 14335, 12544, +11520, 9216, 4609, -1, -2559, -3842, -4606, -3584, -2562, -2557, -2051, -2302, -2817, -767, 766, 514, +-1281, -2048, -2560, -3840, -4608, -5631, -5377, -4608, -4096, -3584, -2815, -2304, -1025, 0, 1024, 1793, +2303, 2050, 765, -1022, -4353, -8704, -10238, -7939, -3581, 253, 2307, 3070, 3073, 3839, 4864, 5122, +3581, 1795, -3, -2301, -4867, -7933, -11267, -13565, -14595, -15101, -16386, -16383, -14592, -12802, -10237, -6402, +-2046, 510, 3584, 5633, 5119, 3074, 1790, 1792, 2562, 4348, 7685, 9724, 11010, 12288, 14590, 15107, +14077, 14850, 15103, 14593, 12799, 9217, 4606, 1026, -1793, -3840, -4095, -2561, -2304, -3328, -3839, -2817, +-767, -1, 0, 1, -257, -1279, -3073, -4352, -4863, -5121, -4863, -4866, -4350, -3585, -3327, -2561, +-1024, 512, 1537, 1791, 3073, 3839, 2305, -1793, -6400, -8959, -8705, -6143, -2817, -1023, 255, 1281, +2559, 4096, 4610, 4093, 3332, 2300, 1283, -1538, -4862, -7170, -9982, -12546, -14335, -15360, -16384, -16896, +-14849, -13055, -11009, -7167, -3073, 1280, 3328, 4609, 4351, 2048, 1281, 2302, 3842, 4862, 6658, 8703, +10497, 12542, 13313, 13056, 14336, 15873, 15870, 15361, 13568, 10240, 5377, 766, -1790, -2307, -2300, -3074, +-4097, -3837, -3332, -2300, -1283, -510, 510, 770, -257, -1792, -2815, -3843, -4860, -5123, -4605, -4100, +-4860, -4612, -3324, -1794, -1537, -1021, 764, 3332, 5373, 4354, 1022, -3070, -6658, -7934, -7169, -4608, +-3072, -2816, -1024, 1280, 2304, 2560, 3328, 4352, 3584, 2816, 1536, -1280, -4096, -6912, -8704, -12032, +-14848, -15616, -16384, -16640, -15872, -13824, -11264, -7936, -2559, 1534, 2818, 3327, 2304, 1537, 2302, 2818, +3327, 4352, 6912, 8704, 9728, 11009, 12030, 13058, 13823, 15105, 16639, 16641, 13566, 9219, 4862, 1793, +-256, -1537, -3072, -3839, -4096, -4608, -4352, -3329, -1278, 253, 516, 508, 3, -1537, -3329, -3582, +-4099, -4349, -4867, -5373, -4610, -3840, -2815, -3585, -3583, -769, 2561, 5375, 5889, 4096, -258, -4092, +-5124, -5630, -5888, -5121, -3839, -2304, -1537, 1, 1280, 1536, 2560, 4095, 3842, 2301, 1285, -6, +-3067, -5891, -8192, -11517, -13827, -15102, -15873, -16384, -16384, -14590, -11523, -6653, -1794, 513, 1791, 2305, +2047, 2049, 1792, 2559, 4097, 5375, 6145, 8447, 9985, 10239, 10753, 12032, 14334, 16387, 17405, 15874, +13311, 9728, 6401, 3326, 514, -1025, -2049, -3836, -4870, -4859, -4355, -3071, -1279, 1022, 1025, 1024, +-512, -1792, -1792, -2560, -3840, -5121, -5119, -4096, -3840, -3839, -4610, -5119, -3328, 256, 4864, 6144, +5121, 3070, 3, -2564, -4349, -4609, -5120, -4864, -3327, -2305, -2559, -1281, 256, 1537, 2304, 3327, +3073, 2303, 1793, 256, -2304, -4866, -8189, -11011, -12541, -14082, -16383, -17921, -17151, -14336, -9985, -6654, +-3331, 260, 1533, 1282, 1279, 1792, 2305, 2814, 3587, 5117, 7427, 7934, 8192, 8449, 9727, 12802, +14846, 16386, 16638, 16386, 13310, 9730, 6910, 4098, 1534, -510, -2307, -3837, -5378, -5631, -5120, -3072, +-257, 514, -3, 3, 255, -513, -1790, -3075, -4349, -5121, -3840, -2817, -3838, -6402, -6654, -4865, +-2305, 1282, 4863, 5375, 4354, 2814, 770, -2050, -3839, -3840, -3840, -3840, -3328, -3329, -2815, -1793, +-510, 510, 1793, 2048, 2046, 2563, 2302, 769, -2304, -5377, -7423, -8705, -12031, -15617, -17151, -17921, +-16895, -14337, -10495, -6145, -3072, -1023, -257, 769, 1279, 1280, 1537, 2302, 4610, 6655, 6400, 6400, +7168, 8448, 9984, 12288, 14848, 16128, 16641, 15614, 13569, 11008, 7936, 4608, 2304, 511, -1535, -4864, +-6401, -5630, -3843, -2813, -1282, -255, 0, -1, 1025, 255, -2815, -4353, -3839, -2817, -2559, -3330, +-5629, -7682, -7167, -4096, -1281, 1538, 4350, 5122, 4605, 2820, 252, -1533, -2306, -2815, -3329, -3071, +-3329, -3839, -2816, -2050, -509, -3, 3, 1278, 2816, 3329, 1790, -254, -1536, -3586, -5885, -8708, +-11773, -14592, -17665, -17920, -16639, -13826, -9469, -6915, -4349, -2051, 259, 508, -252, 509, 2307, 3837, +5633, 5889, 5886, 6147, 6652, 7939, 9983, 12800, 14337, 15102, 16386, 15870, 13570, 10495, 8192, 6913, +3837, 516, -2052, -5116, -6147, -5118, -3842, -3326, -2562, -510, 1022, 1282, 511, -1536, -3584, -3328, +-1792, -1279, -2818, -4862, -6914, -7422, -6401, -4096, -1024, 2047, 3842, 4862, 3842, 2302, 769, -1024, +-1536, -1793, -2046, -3075, -3837, -2819, -2301, -2306, -2047, -1537, 256, 1537, 1791, 2049, 1279, 512, +-1279, -2817, -5119, -7937, -11520, -16128, -18175, -17153, -15871, -13825, -10240, -7168, -4095, -2306, -1278, -1537, +-512, 768, 2304, 4352, 5632, 5888, 5376, 5120, 6912, 8449, 9470, 11523, 14333, 15362, 15615, 15104, +13313, 11007, 9728, 8192, 4352, 0, -2560, -4096, -5121, -5374, -4609, -4096, -2303, 254, 1538, 1023, +-1024, -2559, -2049, -1279, -769, -1536, -3583, -5633, -7678, -7683, -6398, -3328, -513, 1537, 3584, 4351, +3585, 1791, 768, 769, -256, -1794, -2302, -2049, -2304, -3071, -3073, -2817, -2557, -1283, -253, 253, +1282, 1791, 769, 0, -2, -1021, -4355, -8189, -12291, -15357, -17155, -17661, -16387, -13309, -9987, -6653, +-4611, -3070, -2304, -2049, -1535, 1023, 3841, 4351, 4609, 5376, 5375, 4866, 6397, 8195, 9470, 11777, +14080, 15359, 14338, 14333, 14083, 13054, 11265, 7936, 4607, 1538, -1539, -3324, -5125, -6139, -5891, -3840, +-766, 509, 516, -772, -1789, -1794, -1279, -512, -257, -1278, -3843, -6653, -7683, -7165, -6146, -3583, +-257, 2560, 3074, 2557, 3331, 3069, 1795, 253, -510, -1024, -770, -1277, -2819, -3070, -2561, -3071, +-3074, -1789, -772, 4, -4, 4, 765, 1537, 768, -1537, -4606, -7938, -11519, -15616, -17665, -17150, +-15362, -13567, -9728, -5888, -5121, -4862, -3843, -2301, -1026, 1025, 3584, 4095, 4609, 5375, 4864, 5121, +5631, 7681, 10239, 11776, 12800, 13312, 14081, 14847, 14848, 13569, 10749, 7941, 5371, 2820, -259, -3582, +-6402, -6397, -5123, -2303, -1023, -514, -510, -1538, -2046, -1282, 258, 766, -511, -1792, -3840, -6656, +-8448, -7680, -5120, -2560, -257, 1282, 1790, 3329, 3585, 2045, 1027, 766, 514, -2, -510, -1026, +-1791, -2816, -3584, -3327, -2050, -1278, -1538, -1790, -1281, 769, 1279, 769, 767, -512, -4095, -8193, +-11263, -14849, -17920, -17407, -14850, -12030, -8961, -6912, -5887, -5377, -4353, -2558, -1026, 770, 2814, 4353, +4864, 4095, 4098, 4605, 6147, 8446, 9985, 10496, 11007, 12545, 14847, 15361, 14592, 12799, 10753, 9215, +6913, 3328, -1025, -4351, -5632, -5889, -4351, -2048, -1026, -1787, -2311, -1530, -1283, -768, 514, 1022, +256, -1535, -5120, -7937, -7935, -6401, -4608, -3071, -769, 1025, 2302, 2564, 2555, 2053, 1531, 517, +508, 771, 510, -255, -2303, -3330, -2559, -1792, -2560, -3072, -2048, -2560, -1792, 255, 1282, 1021, +772, -515, -3071, -7424, -11777, -15358, -17153, -16640, -13824, -11009, -9214, -7937, -6401, -5630, -4610, -3326, +-1281, 1536, 3328, 4353, 4095, 3328, 4096, 5634, 7677, 8451, 8701, 9474, 11007, 13825, 14847, 14337, +13567, 13312, 12545, 10239, 7937, 4095, -1024, -4607, -5122, -4350, -3072, -2307, -2299, -2053, -2045, -1792, +-1538, 2, 2303, 2048, 1, -2817, -5375, -6658, -7421, -6659, -4862, -2816, -770, 259, 1790, 2305, +2559, 1793, -1, 1537, 2304, 1024, -1, -510, -1538, -2302, -1794, -1534, -2563, -3324, -3587, -2559, +-1535, -771, 772, 1276, 1027, 255, -3073, -7678, -12545, -15617, -16126, -15362, -13567, -11263, -9474, -7679, +-7168, -6400, -5632, -3584, -512, 1792, 3072, 3073, 2558, 3075, 5116, 6916, 6909, 6658, 8447, 9984, +11008, 12801, 13567, 13568, 13312, 13569, 13567, 11265, 7679, 2816, -1535, -3073, -4096, -3839, -3586, -2557, +-2307, -3326, -3586, -2301, -515, 1539, 1789, 1538, -257, -3071, -5121, -7167, -7425, -5631, -4353, -3839, +-1537, 1537, 1791, 1025, 1279, 1281, 1535, 1792, 2050, 1533, 3, -770, -512, -766, -1283, -2045, +-2819, -3581, -3842, -2816, -2559, -1538, 258, 1791, 2048, 256, -3583, -8194, -12286, -14593, -15360, -14846, +-13315, -11005, -8707, -8446, -8191, -7171, -5885, -2819, 514, 1280, 1279, 2049, 3327, 4352, 5121, 6142, +6660, 6906, 8199, 9977, 11526, 12028, 12546, 12799, 14081, 15615, 14080, 11009, 7423, 3329, 256, -2818, +-3581, -2562, -2303, -3072, -3842, -4348, -3332, -1533, -2, 1024, 2562, 2046, -1535, -3840, -4865, -6142, +-7171, -6908, -4868, -2557, -1026, 512, 769, 1023, 513, 1535, 2560, 2304, 1792, 1280, 257, -1, +256, 1, -1027, -2299, -2821, -3323, -4101, -4348, -3330, -1535, 511, 2305, 2047, -767, -3840, -7938, +-12028, -14085, -15099, -14597, -12541, -9985, -9471, -10240, -9473, -7167, -4866, -2556, -1284, 3, 766, 1793, +3327, 4354, 5117, 5635, 5886, 7424, 9217, 10239, 10241, 10496, 12032, 13823, 15105, 15103, 14337, 11776, +7680, 3584, -1, -1791, -1025, -1790, -3330, -4094, -4098, -4351, -4097, -1279, 1280, 2048, 2047, 1025, +-769, -3071, -5377, -6398, -6915, -6397, -4098, -2047, -769, -255, -2, 515, 766, 2048, 2561, 2047, +1536, 1025, 1535, 1281, 256, 255, -767, -1793, -2303, -4096, -5377, -4863, -3072, -1536, 767, 2562, +1022, -1022, -3841, -7681, -12030, -14593, -14080, -12288, -11520, -11008, -11008, -10495, -8706, -6910, -4610, -3070, +-1793, -1023, -2, 2306, 3582, 3843, 3837, 5122, 7167, 7936, 8448, 8961, 8959, 10497, 12030, 13571, +14845, 15619, 14846, 10496, 6658, 4094, 1793, -256, -1024, -1536, -2816, -4864, -5888, -4608, -3071, -1282, +770, 2047, 1535, 771, -516, -3324, -5636, -6908, -6916, -5372, -3844, -2300, -1027, -1278, -513, 768, +1281, 1534, 2051, 1789, 1282, 2047, 1792, 513, 1022, 1026, 254, -1278, -2817, -4608, -5888, -4864, +-2560, -1024, 256, 1537, 1790, -254, -4866, -9214, -12033, -13055, -12290, -12030, -11777, -11519, -11265, -10495, +-8705, -5887, -4865, -4352, -2815, -769, 1024, 1536, 2304, 3072, 4096, 6143, 7170, 7166, 7938, 8958, +8450, 9470, 12034, 14590, 15619, 15101, 13570, 11007, 7424, 4097, 2815, 1793, -1, -1534, -3587, -5373, +-5634, -4607, -2816, -1280, 512, 1792, 2559, 1281, -768, -3072, -5632, -6656, -5377, -4350, -3586, -2302, +-2050, -1534, -1, 768, 769, 1022, 1795, 2045, 1795, 2045, 1794, 1535, 2049, 2047, 1537, -1282, +-3581, -4612, -4860, -4611, -3582, -1537, 1024, 2305, 1534, -2045, -5635, -8701, -11266, -11776, -11775, -11521, +-12542, -12546, -11007, -9473, -8191, -6912, -6145, -4607, -2049, -255, -256, 511, 2304, 3329, 4095, 5889, +7423, 7937, 6910, 6659, 8446, 9985, 11776, 14335, 15361, 14848, 12543, 9730, 7166, 5377, 4352, 2559, +513, -2304, -4353, -5118, -5634, -4607, -2816, -1793, 514, 2302, 2562, 767, -1281, -3838, -5890, -5630, +-4353, -4607, -4098, -2814, -2049, -1024, -511, 255, 512, 769, 1534, 2050, 1279, 768, 1537, 3070, +3074, 2558, 514, -1281, -2560, -4351, -5890, -5374, -3074, -509, 1021, 1795, 508, -3069, -6657, -8704, +-9727, -11010, -11774, -12545, -13056, -11520, -9983, -9986, -9470, -7937, -5376, -4095, -3329, -1536, 0, 0, +769, 2815, 5376, 6400, 6912, 6913, 6655, 6912, 7936, 9984, 12289, 14335, 15616, 14337, 11519, 9729, +8447, 6912, 5378, 3581, 772, -2309, -3580, -4866, -5632, -4606, -3331, -1534, 1280, 2815, 2305, 0, +-2049, -3326, -4610, -4863, -5119, -4098, -3837, -3076, -1276, -1027, -1022, -257, 769, 1534, 1539, 509, +514, 1791, 3073, 3071, 2817, 2815, 1793, -768, -3328, -5120, -5889, -5375, -2560, 256, 1280, 1280, +-1280, -4353, -6142, -7427, -9212, -11779, -12799, -12032, -11521, -11774, -11522, -9983, -8960, -8193, -6143, -4096, +-2561, -2302, -1539, -509, 1022, 3329, 5632, 6399, 6401, 6400, 6143, 5890, 7422, 10753, 12800, 14080, +14336, 12544, 11008, 10239, 9218, 7166, 5889, 3840, 512, -1537, -3070, -4866, -5887, -5376, -3073, 1, +1280, 2047, 1537, -257, -2047, -3073, -3839, -4866, -4861, -4355, -3069, -2306, -2049, -2046, -514, 1026, +1024, 509, 259, 1278, 1282, 1791, 2815, 3585, 3840, 3585, 2046, -510, -3586, -5118, -5889, -4096, +-1024, 769, 254, -1278, -1794, -3069, -5379, -7934, -9730, -10751, -11774, -12292, -11515, -11270, -11515, -10499, +-9470, -7681, -5632, -4096, -3329, -3325, -2308, -508, 1020, 3587, 5887, 6399, 6146, 6142, 5121, 5632, +8448, 11263, 12546, 13310, 12801, 12032, 11008, 10751, 9730, 8190, 5634, 4094, 2049, -1025, -3839, -5376, +-5889, -5119, -2305, 257, 1023, 1537, 511, -511, -1536, -3073, -4606, -5122, -3839, -3584, -3841, -3582, +-2562, -1022, -258, 1, 511, 1, 511, 769, 767, 1537, 3070, 4099, 4349, 4099, 2813, -1022, +-4865, -5887, -4097, -2047, -1794, -1022, -257, -1024, -2303, -3586, -5373, -7939, -9981, -10755, -11518, -11520, +-11265, -11775, -12033, -11007, -8705, -7423, -5889, -4096, -4351, -3841, -2559, -1281, 1024, 3840, 5889, 6142, +5379, 4860, 5123, 6655, 9216, 11521, 12543, 11776, 11777, 12287, 11777, 10495, 9729, 8447, 6913, 4863, +2560, -767, -3841, -5375, -5633, -3328, -1279, -257, 770, 1532, 1541, 251, -2044, -3074, -3328, -3839, +-3841, -3839, -3841, -3071, -1792, -768, -512, 256, 511, 3, 252, 516, 1277, 1281, 2561, 5374, +6913, 4609, 765, -1531, -3334, -4090, -3077, -2045, -1281, -1024, -767, -1026, -2302, -3329, -5632, -8446, +-9732, -9980, -10754, -11264, -11519, -12033, -11775, -10496, -8705, -7423, -5888, -4865, -4606, -4610, -3582, -769, +1792, 3839, 5378, 5374, 4098, 3838, 5889, 7935, 9473, 10751, 11265, 11519, 12033, 11520, 11007, 10497, +9728, 8703, 7939, 5884, 2563, -1794, -4094, -4610, -4350, -4099, -2301, -2, 1025, 1024, 511, -1279, +-2049, -2559, -3328, -3841, -4351, -4097, -3583, -3329, -2046, -515, -253, -771, -254, 1024, -258, -1020, +-261, 2053, 4604, 5890, 6143, 3585, 768, -1281, -2815, -3328, -2561, -1790, -2052, -1275, -515, -1023, +-2560, -4353, -6654, -8450, -8959, -9728, -10753, -11774, -12034, -12030, -11778, -10751, -8193, -6654, -6145, -6144, +-5376, -5377, -3838, -514, 2562, 3583, 4352, 3584, 3840, 5120, 6401, 7935, 9217, 10495, 11008, 11521, +11776, 11519, 10753, 9727, 10753, 10752, 8191, 5121, 2303, -767, -2817, -4351, -4608, -3586, -1277, 254, +513, 511, 1, -258, -1532, -2821, -2556, -3075, -4606, -4353, -2559, -1793, -2048, -1791, -258, 515, +253, -253, -1795, -1533, 509, 3331, 5117, 5890, 5631, 3073, 511, -512, -1536, -2304, -2047, -2049, +-1536, -1024, -512, -1535, -3329, -4863, -6146, -7422, -9218, -9725, -10243, -11773, -12547, -12030, -11521, -9983, +-7937, -6655, -6401, -6911, -6913, -5375, -2562, 2, 1535, 2817, 2815, 3329, 3838, 4867, 6910, 7681, +8703, 10497, 11520, 11264, 10239, 10241, 10239, 11265, 11265, 9981, 8195, 5629, 2819, -2, -3326, -4610, +-3327, -2305, -1535, -255, 1022, 258, -771, -508, -772, -2300, -3588, -3837, -3585, -3073, -3069, -3076, +-2813, -770, 514, 255, -768, -1793, -2302, -1793, 1024, 3841, 5118, 5378, 4607, 2816, 1281, -257, +-1024, -2048, -2560, -1024, -511, -770, -1022, -1538, -3326, -5122, -6142, -7682, -8958, -9473, -10753, -11518, +-12291, -12796, -11012, -8957, -7170, -7167, -8192, -7937, -6655, -4608, -2560, 0, 1536, 1024, 2048, 3584, +4352, 4864, 5888, 7680, 9984, 10752, 10752, 9983, 9729, 10240, 11264, 11264, 10239, 10497, 8959, 5378, +2045, 3, -2563, -3837, -3074, -1791, -1025, -767, -513, 1, 256, -2, -1533, -3075, -3325, -2563, +-3070, -3841, -3328, -3072, -1791, -2, 770, -2, -1790, -2817, -2560, -768, 1791, 4098, 4607, 4352, +4096, 3583, 1281, -256, -768, -1537, -1278, -771, -509, -514, -1279, -2304, -3585, -4863, -6401, -7678, +-8450, -9471, -10752, -12801, -13566, -11778, -9727, -8960, -7936, -8193, -8958, -8451, -6396, -3843, -2303, -1281, +2, 1278, 2306, 2813, 3331, 4350, 6146, 9213, 10242, 9471, 9985, 10496, 9727, 9728, 11009, 11520, +11007, 10241, 8703, 6145, 2559, -510, -2307, -2557, -2050, -1535, -2048, -1024, 512, 768, 0, -1023, +-1538, -2302, -2561, -2560, -3583, -4354, -3838, -2050, -254, 511, 767, -766, -3074, -3070, -1538, 257, +1793, 3582, 4611, 4860, 4356, 3068, 1540, 253, -766, -770, -510, -258, -254, -770, -1023, -2048, +-3840, -5632, -5888, -6656, -8193, -10238, -11778, -12798, -12802, -11006, -9218, -8190, -8961, -9729, -8702, -7426, +-5630, -3840, -3074, -1790, 511, 1792, 1025, 1278, 3842, 5375, 6656, 8705, 9726, 9986, 9215, 9472, +9728, 9985, 10751, 11265, 11263, 10752, 8705, 5120, 1790, 258, -513, -2048, -2302, -2052, -1275, -262, +262, 252, -765, -1283, -1278, -1793, -2559, -3328, -4097, -4608, -3326, -772, 517, 508, -766, -2304, +-2817, -2559, -1536, -2, 1795, 3325, 4099, 4606, 4097, 2558, 1027, 254, 257, 0, -514, 3, +510, -255, -1792, -2816, -4096, -4864, -5889, -6655, -8448, -11264, -13056, -12544, -11521, -10239, -8960, -9473, +-10750, -9219, -7677, -7682, -6655, -4609, -2303, -1537, -766, -3, 515, 1533, 3074, 5376, 7167, 8450, +9213, 8963, 8958, 9729, 9216, 9471, 10753, 12288, 11775, 9730, 7678, 5122, 2813, 1027, -514, -1791, +-2303, -1282, -255, -256, -257, -254, -514, -1023, -769, -1023, -2817, -4350, -5123, -3837, -1794, 0, +257, -256, -1281, -2558, -2563, -2557, -1282, 2, 1277, 3587, 4605, 3843, 2814, 2560, 1537, 511, +-256, 514, 1020, 517, 507, 4, -1794, -3584, -3326, -3587, -5374, -6913, -9727, -12546, -12541, -11011, +-10494, -11009, -10241, -9470, -9473, -9472, -8959, -7426, -6142, -4097, -2560, -2047, -1026, -510, 0, 1279, +3841, 5886, 6914, 8191, 9730, 9725, 8962, 8447, 9216, 10754, 11773, 12290, 11263, 9216, 7681, 6143, +3329, 1022, -509, -1283, -1535, -767, -2, -254, -770, -767, -257, 257, -512, -2049, -4095, -5121, +-4351, -3072, -1280, -1, 1, -1024, -1536, -2049, -3071, -3328, -1537, 770, 2301, 2819, 3582, 4097, +2816, 2047, 1537, 512, 255, 1282, 2045, 1283, 510, -511, -2560, -2561, -1791, -2560, -5632, -8960, +-10241, -11006, -11522, -11262, -11010, -10239, -9984, -9728, -9985, -9982, -8451, -7420, -5892, -3581, -2305, -2305, +-2302, -1281, 255, 1795, 3068, 5380, 7421, 8705, 9473, 8958, 7938, 8446, 10241, 11009, 11518, 11522, +10494, 9218, 7679, 5632, 3584, 1024, -511, -514, -254, -1, -512, -1023, -1027, 260, 1020, 260, +-772, -2813, -4867, -4861, -3586, -1791, -1537, -767, 255, -255, -2049, -3072, -2814, -2563, -1534, 767, +1536, 2305, 3583, 3585, 2303, 1281, 1023, 514, 765, 2307, 2814, 1025, -1024, -1537, -511, -513, +-1791, -3841, -6399, -8449, -9984, -11263, -11778, -11006, -10497, -10752, -10495, -10242, -10494, -10753, -9216, -6911, +-5122, -4350, -3586, -2557, -2307, -1533, -260, 515, 2816, 5887, 7938, 8189, 8194, 7935, 8449, 9215, +10241, 11006, 11523, 11006, 10496, 9728, 7937, 5630, 2564, 763, 772, 765, 259, -515, -1021, -1026, +-512, 1026, 1533, 259, -2306, -3584, -3582, -4611, -3837, -1794, -767, -257, 257, -769, -2814, -3074, +-2304, -2303, -1281, 513, 1791, 2560, 3328, 3585, 2302, 258, -1, 1792, 3072, 2816, 1793, -2, +-253, 508, 516, -770, -1792, -3583, -6658, -8702, -9985, -10495, -11265, -11264, -10240, -9728, -10751, -11010, +-10750, -10242, -8190, -6658, -5631, -4864, -3072, -2560, -2561, -2303, -1536, 1023, 3842, 5885, 7426, 7680, +7679, 7680, 8449, 9727, 10241, 10751, 10753, 11262, 11523, 9726, 7169, 4864, 3071, 1793, 1280, 1536, +0, -1793, -1534, -2, 1026, 766, 1026, -259, -2556, -3333, -4091, -4612, -3069, -1283, -253, -259, +-510, -1280, -2561, -3070, -2307, -1789, -1538, -255, 2048, 3583, 3330, 2302, 1, 0, 2047, 3074, +2814, 2049, 1280, 1023, 259, 763, 1029, -260, -2302, -4351, -6146, -8704, -10495, -11009, -11263, -10496, +-9728, -10754, -11773, -11522, -10751, -9728, -8705, -7423, -5632, -4096, -3584, -3585, -3583, -3328, -1280, 1279, +3586, 5629, 6660, 6653, 7169, 8447, 9218, 8958, 9986, 11262, 11777, 11520, 11008, 9472, 5888, 4096, +4095, 3330, 1534, 770, -514, -1535, -256, 768, 1279, 1025, 1024, -512, -2817, -4351, -4097, -3583, +-2816, -1281, 1, -257, -1279, -1793, -2302, -2307, -2813, -3074, -1535, 1280, 3328, 3071, 1537, 768, +768, 1280, 2047, 2816, 2562, 1278, 1282, 1533, 1539, 1533, 1027, -258, -1791, -3840, -6657, -9471, +-10753, -10750, -10242, -10239, -11264, -11265, -11262, -11266, -10751, -10240, -8704, -6656, -4608, -4353, -4350, -4353, +-4607, -3586, -510, 2046, 3330, 4351, 6144, 7168, 7425, 7934, 9218, 8702, 9474, 11519, 12801, 11519, +9984, 7937, 6143, 5121, 4607, 3073, 1023, 257, -257, -511, -512, 1023, 2305, 1534, 515, -771, +-2557, -4098, -4352, -3072, -1791, -769, -767, -1281, -768, -512, -1790, -3844, -3836, -1794, 512, 1794, +2557, 2050, 768, 255, 1282, 2045, 2051, 2301, 1795, 1533, 2051, 2045, 2051, 1789, 1794, 1023, +-1279, -4609, -7423, -8705, -9728, -9727, -10497, -11007, -11009, -11007, -11776, -12033, -11262, -10243, -8701, -6402, +-4095, -4609, -5886, -5124, -3835, -2822, -1018, 1787, 2820, 3837, 5633, 7424, 7423, 7426, 7934, 8961, +11008, 12543, 12546, 10750, 9217, 8192, 6912, 5376, 4352, 3327, 1537, 0, -256, -256, 511, 1794, +2302, 1794, 510, -1278, -3841, -4351, -3074, -2047, -2303, -2306, -765, 764, -253, -1794, -2814, -4098, +-3071, -768, 1023, 2050, 1790, 1025, 512, 1024, 1280, 1791, 1538, 1277, 2052, 2043, 1540, 1790, +2304, 2817, 2559, 1024, -2047, -4866, -6398, -8193, -9728, -9983, -10242, -11006, -11266, -11006, -11778, -13055, +-12032, -9473, -7422, -6402, -5119, -5632, -6401, -5631, -3584, -2561, -1534, 509, 2051, 4093, 5891, 6654, +6145, 6144, 8191, 10497, 11265, 11774, 11523, 10493, 9218, 8190, 7170, 5632, 4351, 3073, 1022, 514, +0, 254, 1027, 2300, 3588, 1789, -1021, -2308, -2300, -3076, -3324, -3075, -2559, -1279, 511, 257, +-1025, -2816, -3839, -3329, -2047, -1, 1537, 1279, 769, 1023, 1282, 1020, 1284, 1534, 1793, 1792, +1791, 1280, 1282, 3070, 3841, 3327, 2561, 1024, -1791, -4867, -6140, -7429, -9466, -10501, -9724, -9988, +-11260, -12036, -12540, -13059, -11518, -8706, -7165, -6404, -6396, -6403, -5886, -5122, -3582, -3329, -2304, 0, +3072, 4608, 4608, 5376, 5887, 6914, 9214, 10754, 11518, 11777, 11264, 10495, 9474, 8702, 7681, 5632, +4352, 3071, 1793, -513, -511, 1536, 2815, 3329, 2302, 771, -260, -1275, -2308, -3326, -3841, -3329, +-1533, -3, 515, -3, -1535, -3328, -3583, -2049, -1279, -1, 768, 512, 1025, 1279, 769, 255, +1280, 2305, 1534, 770, 1023, 1280, 1792, 3072, 4608, 3584, 1793, 1022, -1022, -4097, -6400, -7935, +-9216, -9473, -9471, -10241, -12031, -13057, -13566, -12547, -10493, -8706, -7423, -7680, -7169, -5630, -5123, -5373, +-5121, -3841, -1790, 765, 2562, 3328, 3840, 4608, 5631, 7168, 9217, 11008, 11264, 10751, 11265, 11007, +9218, 7934, 7425, 6656, 4607, 2050, -2, -255, 1023, 2306, 2813, 2564, 1787, 1541, 508, -1276, +-2564, -3581, -4098, -2559, -256, 257, -2, -1022, -2818, -3326, -2562, -1790, -1793, -256, 1024, 1280, +256, 513, 1535, 1023, 1282, 2047, 1024, -255, 254, 1794, 2559, 3584, 4097, 3839, 2817, 1278, +-1278, -4097, -6655, -7681, -8192, -8704, -9215, -10498, -13053, -14084, -13052, -11267, -10494, -9473, -8447, -7425, +-6399, -5890, -6398, -6656, -5377, -3327, -1281, 256, 2049, 2814, 2563, 3837, 6147, 7677, 8706, 10239, +11520, 11777, 11007, 9729, 9215, 9216, 8449, 6398, 3331, 765, 770, 1023, 1537, 2303, 2817, 2303, +2305, 2304, 255, -1790, -3331, -4349, -3330, -1023, 256, -2, -1534, -1281, -1792, -3071, -3075, -1532, +-772, -252, 1020, 1026, 0, 768, 1536, 2047, 1537, 767, 1, -1, 768, 2049, 2815, 3328, +4096, 4608, 3584, 1280, -1024, -4352, -6399, -6658, -6654, -7682, -9982, -12033, -13056, -12799, -12034, -11774, +-11266, -9981, -7683, -6654, -6914, -6910, -6401, -6655, -5377, -2816, -767, -2, 771, 1534, 3073, 3839, +5376, 7168, 9474, 11261, 12035, 11261, 9986, 10752, 11006, 9731, 7933, 5379, 2558, 1537, 1535, 1536, +1536, 2306, 2557, 2819, 3325, 2818, -1, -3071, -3841, -2303, -2048, -1281, 1, -257, -1535, -1793, +-2302, -2819, -2814, -1280, -257, 257, -1, 0, 513, 1279, 2048, 2049, 511, 0, 1, -1, +512, 1793, 2558, 3331, 4862, 5376, 3841, 1023, -2047, -4097, -4863, -5377, -6398, -8963, -11261, -11523, +-12028, -13060, -13054, -12033, -11007, -9728, -7937, -6912, -7168, -7679, -7680, -6145, -4608, -3071, -1537, -766, +254, 1793, 2048, 2559, 5378, 7934, 9730, 10494, 10753, 10240, 10752, 11776, 11264, 9216, 6912, 4609, +2814, 1538, 2047, 1537, 511, 1537, 3839, 4353, 3071, 1281, -769, -2814, -3331, -2044, -1541, -1019, +-515, -511, -1024, -2305, -2815, -2560, -2048, -768, 0, -769, -767, 512, 1279, 1539, 1788, 1283, +254, 1, 0, 0, 256, 767, 2818, 4605, 5892, 5628, 2819, -259, -1533, -2050, -3583, -5633, +-6911, -8448, -10241, -11519, -12289, -12799, -13311, -12546, -10239, -8960, -7936, -7680, -8192, -7937, -6655, -5887, +-5379, -3325, -1282, -768, -254, 253, 1027, 3070, 5889, 8191, 8704, 8962, 10493, 11011, 11773, 12546, +11775, 8961, 5888, 5375, 3841, 2048, 1023, 770, 1534, 3072, 4355, 4603, 2821, 765, -1024, -2302, +-2562, -2047, -1023, -515, 4, -260, -1789, -2817, -2304, -1793, -1278, -770, -766, -770, -255, 1024, +1793, 1534, 1282, 1022, 770, 255, -256, -512, -1280, 1024, 4096, 5888, 5376, 4096, 2816, 1280, +-512, -1792, -3327, -5122, -6910, -8193, -9729, -11262, -12546, -13822, -13570, -11519, -9729, -9471, -8960, -8193, +-7935, -7937, -7423, -6401, -4863, -2561, -1023, -1536, -2050, -509, 1533, 3330, 5632, 7935, 7937, 8447, +10496, 12544, 12545, 11775, 10496, 8705, 7166, 5634, 3327, 1537, 255, 769, 2559, 3840, 4354, 4349, +2307, 765, -510, -2049, -2816, -1279, -257, 0, -512, -1279, -2306, -2557, -2051, -1278, -1281, -1792, +-1023, -513, 256, 1536, 1793, 1022, 771, 1789, 1538, -513, -2048, -1791, -2, 2051, 4093, 5122, +4607, 3840, 3072, 1792, 256, -1280, -3328, -5120, -6144, -7168, -9983, -12291, -13051, -13318, -12793, -11526, +-10749, -9984, -8962, -7933, -8450, -9216, -7679, -5377, -4095, -3329, -2303, -2305, -2816, -767, 2047, 3841, +4608, 5630, 7171, 9213, 11011, 12285, 12292, 11260, 10755, 9725, 7426, 5121, 2557, 771, 253, 1795, +2814, 3585, 4351, 4097, 2815, 257, -1280, -1793, -1791, -768, -2, -508, -1540, -2046, -1792, -2049, +-1791, -1280, -2049, -2303, -1024, 511, 769, 255, 769, 2048, 2303, 2049, 256, -1537, -2302, -1282, +514, 2046, 4098, 4607, 3841, 4094, 4099, 2301, 2, -1281, -2305, -3837, -5379, -7678, -10497, -12288, +-12544, -12543, -13058, -12285, -9730, -9216, -9472, -9215, -9218, -8957, -7170, -4865, -3325, -3331, -3838, -3328, +-1793, 256, 2049, 3071, 3841, 5376, 8190, 9730, 11007, 12032, 12033, 12030, 11522, 10239, 7424, 4352, +2560, 1280, 1024, 1793, 3070, 4354, 4350, 4098, 2558, -253, -1283, -766, -513, -256, 1, -769, +-1792, -1792, -1023, -1282, -2046, -2817, -1793, -766, -258, 2, -257, 256, 2303, 3074, 2302, 1538, +-514, -2303, -2304, -256, 1023, 1794, 2814, 4098, 4607, 4351, 3843, 2044, 4, -259, -767, -3327, +-6402, -7934, -9730, -11775, -13056, -13057, -12541, -11524, -9980, -9220, -9981, -10498, -9982, -8193, -6400, -4609, +-4606, -5122, -4350, -2817, -1281, -510, 510, 1793, 2817, 5630, 7937, 9217, 10237, 11268, 12541, 12545, +11520, 9984, 6912, 4096, 2303, 1282, 766, 1537, 3839, 4609, 4351, 3330, 1533, -253, -1026, -255, +512, -513, -1534, -1282, -1022, -769, -1280, -2560, -3072, -1793, -766, -1282, -1278, -771, -509, 1021, +2819, 3582, 1792, 1, -1281, -1791, -1792, -513, 257, 1023, 2817, 4863, 4866, 3325, 2820, 2556, +1539, -3, -1277, -3074, -5374, -7938, -9471, -11777, -13055, -13056, -11777, -10495, -10241, -10238, -11267, -11005, +-8706, -6911, -6144, -5633, -5631, -5119, -3843, -2301, -1282, -1279, -255, 1789, 4100, 5116, 7172, 8957, +10241, 12033, 13566, 12803, 11516, 9732, 7165, 4354, 1791, 1024, 1536, 2561, 4351, 5376, 4096, 2048, +1024, 768, 769, 1021, -251, -1286, -506, 251, -509, -1537, -1792, -2047, -2049, -1280, -767, -1794, +-2045, -1027, 770, 2047, 3328, 3073, 1278, -510, -258, -766, -1794, -1535, 512, 2304, 3072, 3839, +4098, 4093, 3588, 2812, 2306, 512, -769, -2559, -4608, -7425, -9727, -12288, -13057, -11775, -10497, -10751, +-11265, -11775, -11265, -9984, -8448, -7168, -6912, -6911, -5378, -4094, -3585, -3071, -2305, -1792, -255, 1790, +3331, 4093, 6402, 8703, 10752, 12032, 13057, 13567, 12032, 9729, 7166, 4098, 1536, 1279, 2049, 3839, +5120, 4353, 2304, 2047, 2561, 1792, 255, 2, -2, 1, 1, -3, -1020, -2308, -2045, -1281, +-1281, -1278, -1794, -2303, -2560, -257, 2050, 2302, 2305, 2304, 1791, 769, -1280, -1793, -1790, -1026, +513, 1792, 2559, 3074, 3838, 3586, 3326, 3073, 1792, 767, 258, -1282, -4607, -8191, -10755, -11516, +-11780, -11005, -10753, -11520, -12544, -11776, -10240, -9728, -8959, -7938, -7678, -6658, -4862, -4098, -4094, -3841, +-2560, -1280, -512, 768, 2560, 4096, 5889, 8446, 10242, 12031, 13056, 13313, 12031, 9984, 6913, 2559, +1280, 2561, 3583, 3329, 3327, 3328, 2816, 2561, 2302, 1283, -3, -510, 510, 514, -258, -510, +-1538, -2302, -1282, -510, -1026, -2559, -3327, -2307, -764, -5, 1286, 2555, 2819, 2558, 1537, -256, +-1536, -1536, -1536, -769, 514, 1278, 2050, 3069, 4099, 4094, 2818, 2302, 2561, 2303, 1026, -1282, +-5118, -8962, -10238, -9986, -10238, -11010, -11518, -12034, -12542, -11266, -9982, -9730, -9727, -8447, -6915, -5884, +-5636, -4861, -4097, -3585, -2302, -1538, -1023, 768, 2047, 3330, 5886, 8449, 9984, 11263, 14082, 14590, +12290, 8702, 5378, 3838, 3074, 3582, 3842, 3071, 3072, 3840, 3840, 2816, 1792, 1279, 514, 766, +1538, 1278, -511, -1792, -1280, -257, -510, -1026, -2047, -2816, -2562, -1788, -1284, 4, 1531, 2821, +2811, 2565, 1276, -509, -1539, -1277, -771, -766, -257, 1280, 2561, 3071, 3585, 3326, 2562, 3070, +4098, 3583, 768, -2559, -5634, -7934, -8706, -9214, -9985, -11776, -12543, -11778, -11519, -11519, -11010, -10494, +-9730, -8191, -7168, -6656, -5633, -4606, -4867, -3836, -2308, -2046, -1535, -259, 2052, 3324, 4354, 6913, +10237, 13059, 14591, 13823, 11010, 7422, 5888, 4866, 3582, 3074, 3070, 3074, 3325, 3587, 3839, 2304, +769, 766, 1794, 1791, 768, -512, -1024, -1024, -255, -258, -1278, -1538, -2047, -2816, -2816, -2048, +-1280, 255, 2050, 3581, 3076, 1788, 771, 255, -770, -1532, -1028, -1277, -514, 1793, 2560, 2560, +1792, 2304, 3327, 4353, 4865, 3326, 2, -3330, -4863, -6400, -7936, -9216, -10752, -11776, -11519, -11779, +-12284, -11779, -10750, -10497, -9984, -8449, -7165, -7172, -6397, -4865, -3840, -4096, -3584, -2049, -1278, -1, +1024, 1792, 3584, 7424, 11776, 13824, 13823, 12546, 10750, 8194, 6397, 5123, 4094, 2817, 2816, 3840, +4095, 3586, 2302, 1538, 1534, 2562, 2302, 1027, -4, 4, -516, -508, -259, -255, -1023, -1795, +-2043, -2566, -3579, -2563, -511, 769, 2302, 3075, 2556, 1540, 1277, 770, -769, -1792, -1791, -514, +771, 1533, 2306, 1024, 1022, 2819, 4605, 5123, 4605, 2306, -513, -2047, -3841, -6399, -7937, -8959, +-9985, -11262, -11523, -11516, -11780, -12285, -11009, -9985, -9727, -9216, -7937, -6398, -5634, -4864, -4862, -4867, +-3325, -1282, -767, -1280, -1025, 1280, 4610, 8190, 11522, 13565, 13315, 11773, 10755, 8959, 6911, 4867, +3323, 3076, 4351, 4608, 3072, 2304, 2046, 2563, 2558, 2561, 2048, 1023, 1, 511, 513, -256, +-257, 258, -515, -1533, -2307, -3325, -3330, -2047, 256, 1535, 1794, 2302, 3074, 2558, 1537, 257, +-1282, -2045, -772, 516, 1020, 1028, 253, 2, 2047, 4352, 4864, 4609, 3838, 2819, 253, -2046, +-3585, -5631, -7937, -8959, -9474, -10493, -12034, -12287, -12033, -11775, -11009, -10495, -10497, -9215, -7425, -6142, +-6147, -6653, -5123, -3326, -2561, -2046, -2051, -2558, -1794, 1538, 5120, 8702, 11266, 12030, 12546, 12544, +11518, 8706, 5631, 4608, 4609, 4607, 4097, 3583, 2817, 1535, 2304, 3074, 2556, 1797, 1532, 1026, +512, -2, 259, -3, 3, 510, -255, -2048, -3586, -3325, -2563, -1532, -5, 773, 1275, 2821, +3324, 2307, 1277, -510, -2049, -1022, 1021, 1027, -260, -764, -3, 1026, 2303, 3841, 5118, 4611, +3581, 2819, 1022, -1792, -3583, -5376, -6912, -8192, -9474, -11005, -12035, -12029, -11266, -11520, -12287, -11521, +-9471, -8449, -7679, -7425, -7422, -6147, -4605, -2819, -2301, -2818, -3838, -3843, -1278, 2303, 5378, 7421, +9987, 12797, 13315, 12286, 10496, 8193, 6143, 5377, 5632, 5119, 3585, 3071, 3073, 2559, 2818, 2813, +2819, 2045, 2051, 1789, 515, -3, 514, 1024, 1022, 515, -1027, -2814, -3072, -2561, -2560, -1535, +-258, 515, 1789, 3843, 3837, 1794, -257, -768, 1, 255, 257, 255, -512, -1023, -2, 1538, +2559, 3841, 4607, 4608, 4097, 2557, 1029, -1541, -3580, -4354, -5888, -8447, -10241, -10751, -11009, -11519, +-12032, -12545, -12286, -10499, -9469, -8706, -8448, -8191, -7424, -5888, -3329, -2303, -3842, -4860, -4356, -2812, +-1285, 1029, 4348, 7427, 10494, 13058, 13053, 11524, 9468, 8450, 7169, 6398, 5633, 4865, 3324, 3077, +3068, 2819, 2302, 2817, 2815, 2305, 1791, 769, -256, 767, 1794, 1277, 1028, -5, -1531, -2564, +-2557, -2049, -2561, -2815, -1025, 1793, 3327, 3073, 2560, 1022, -253, -3, 771, 1021, 2, -513, +-767, -1024, -2, 1283, 2556, 3332, 4606, 5375, 3844, 1786, 773, -770, -2048, -4352, -6912, -8448, +-9216, -9727, -11011, -12284, -12547, -12799, -11775, -10243, -9212, -9475, -10238, -8706, -6142, -4610, -3838, -3841, +-4353, -4862, -4098, -3070, -2305, 255, 4098, 7934, 10498, 12030, 12033, 10752, 9471, 8962, 7934, 6400, +5634, 4349, 3843, 3325, 2562, 2048, 2558, 3331, 3068, 1795, 1024, 510, 515, 1020, 2308, 2045, +3, -1027, -765, -1283, -2558, -3584, -3330, -2045, -2, 2559, 3076, 2299, 1284, 766, 768, 769, +1280, 768, -512, -769, -511, -512, -512, 768, 2560, 4095, 4866, 4093, 3076, 2556, 1796, -4, +-2557, -4610, -5886, -7426, -8446, -9219, -11005, -13058, -13054, -11011, -10237, -10498, -10495, -10496, -9474, -7421, +-5378, -4607, -4608, -4354, -3837, -4610, -4607, -4096, -2561, 513, 4864, 8192, 10495, 11266, 11261, 10755, +10238, 9473, 7680, 6911, 6401, 5376, 3583, 2817, 2815, 3073, 3072, 3583, 3073, 1535, 257, 1024, +2560, 2303, 1537, 1280, 768, 513, -2, -1279, -3328, -4097, -2814, -769, 768, 2559, 2817, 2047, +1026, 1535, 1791, 1282, 1021, 515, 255, -257, -1022, -1539, -253, 1790, 3329, 3328, 3583, 4353, +4096, 2815, 1793, 0, -2817, -4862, -4866, -6144, -8189, -10500, -12028, -12292, -11517, -10498, -10493, -11780, +-11517, -10498, -8958, -7426, -6141, -5125, -4602, -3846, -4347, -5379, -5375, -4864, -2561, 1025, 4864, 7167, +8962, 10750, 11265, 10496, 9471, 8962, 8447, 7167, 5890, 5118, 3586, 2303, 2815, 3842, 3837, 2565, +1530, 1029, 1276, 2051, 2047, 1536, 1024, 1280, 1793, 510, -765, -2308, -3836, -3843, -2302, -258, +1026, 1534, 1538, 1534, 2050, 1534, 1026, 1022, 1281, 1281, -258, -1790, -1539, -509, -3, 1284, +2812, 2819, 3069, 4099, 4605, 3075, 765, -766, -2305, -3072, -4095, -6146, -9213, -11267, -11263, -11007, +-11010, -11261, -12035, -12286, -11265, -10241, -9213, -7940, -6140, -5380, -4093, -3841, -5376, -6656, -6400, -4352, +-1792, 513, 3838, 7171, 9212, 9732, 10749, 10755, 9213, 8962, 9215, 8192, 5890, 3837, 3330, 3584, +3838, 4100, 3067, 1541, 1531, 2053, 2043, 1541, 1531, 1541, 1788, 2306, 2048, 767, -1535, -3328, +-3840, -2817, -1278, -259, 260, 1020, 2307, 1790, 769, 1279, 2049, 2047, 1280, 769, -257, -1791, +-1025, 256, 769, 766, 1795, 2812, 4101, 4860, 4098, 2046, 258, -257, -766, -2307, -4350, -7169, +-9472, -9727, -10241, -10751, -11010, -11774, -12034, -12030, -11008, -10498, -9726, -8194, -5886, -4096, -4353, -5631, +-5633, -6399, -6400, -4865, -2046, 766, 3329, 6656, 8960, 9728, 9728, 9983, 10242, 9982, 9473, 7424, +5119, 4354, 4605, 4610, 3840, 3327, 2306, 2045, 2050, 2047, 1793, 1280, 1279, 1793, 2815, 3329, +2304, -256, -2305, -2558, -2307, -2812, -2052, 260, 1021, 1025, 1536, 1536, 1280, 2048, 2815, 2562, +1279, 0, -769, -767, -513, 3, -259, 2, 2046, 3841, 4864, 4353, 3071, 1536, 1535, 1282, +-258, -2558, -4867, -7164, -8453, -9211, -9476, -10238, -11776, -12033, -11264, -11774, -12546, -11263, -9217, -7423, +-5888, -4608, -4608, -5633, -6654, -6659, -6141, -5377, -2562, 517, 3577, 6407, 8187, 8195, 9214, 10497, +11008, 9984, 8193, 6397, 5380, 5115, 5126, 4091, 3586, 2817, 2301, 2308, 2300, 2051, 1022, 258, +1789, 3587, 3326, 2049, 1536, -257, -2047, -2817, -3071, -2561, -1534, -3, 771, 765, 515, 1022, +2049, 2816, 3071, 1793, 512, 255, 2, -2, -511, -1280, -1025, 770, 3070, 3842, 3837, 2820, +2556, 2563, 2047, 1535, -254, -3074, -5631, -5889, -7422, -9218, -10239, -10241, -10751, -11777, -12286, -12548, +-12539, -11268, -8957, -6914, -5887, -5121, -5119, -5888, -6656, -6913, -6910, -5636, -2299, 1276, 3330, 5120, +6398, 8451, 10237, 11011, 10750, 9217, 7935, 7169, 6400, 5632, 5375, 4353, 2815, 3073, 4096, 3071, +1538, 1021, 1027, 1534, 2562, 3326, 3585, 2560, 1536, 0, -1792, -3073, -2558, -2049, -513, 258, +-2, 2, 511, 1792, 2816, 3072, 2049, 1022, 1027, 1276, 772, -772, -1789, -1282, 257, 1537, +3069, 3587, 2814, 2305, 3072, 3840, 2560, 768, -512, -2048, -4352, -6144, -7424, -8704, -9472, -9984, +-10753, -11774, -12802, -12798, -12546, -10750, -8706, -7422, -6145, -5121, -4861, -5891, -7422, -8192, -6914, -4605, +-1795, 514, 2047, 3842, 6909, 8963, 9725, 10754, 10240, 8447, 7425, 7934, 7427, 5629, 4099, 4093, +4098, 3839, 3328, 2305, 1023, 768, 1281, 2046, 2819, 3580, 3588, 2813, 1538, -769, -2560, -2815, +-2050, -1022, -513, -1023, -1025, -256, 1536, 2561, 2302, 1283, 1532, 2308, 1790, 768, 257, -1281, +-2048, -1022, 1021, 2051, 1789, 2050, 2816, 3327, 3330, 3068, 2565, 1019, -251, -2052, -4350, -6144, +-7169, -8191, -8961, -9471, -10752, -12289, -13055, -12800, -11776, -10752, -9217, -7166, -5378, -4862, -5378, -7423, +-8704, -7680, -6144, -4609, -2558, -258, 1538, 3582, 6914, 9470, 9986, 9215, 8960, 9217, 8702, 7939, +6653, 5378, 4863, 4864, 4609, 3839, 3072, 2048, 1024, 1025, 1278, 2050, 3070, 4097, 3842, 2812, +771, -1282, -2046, -1794, -765, -1028, -2045, -1793, 0, 1024, 1281, 1790, 2050, 1535, 2049, 2815, +2560, 513, -1537, -1279, -769, 0, 768, 1281, 1534, 2563, 3068, 3075, 3327, 3328, 2560, 1537, +-2, -2046, -3841, -5888, -6655, -7168, -8449, -9983, -11009, -12287, -12800, -12545, -12286, -11524, -8699, -5636, +-5373, -5891, -6653, -7683, -8445, -7426, -5631, -4352, -3584, -1792, 1536, 4607, 6914, 8190, 8706, 9214, +9730, 9469, 8451, 7421, 6404, 5629, 5634, 5373, 4612, 3836, 2820, 2045, 770, 766, 1283, 2300, +3845, 4604, 4354, 1535, -512, -511, -513, -1279, -1792, -1793, -1791, -1282, 258, 1280, 1023, 514, +1532, 2821, 3324, 2818, 1280, -258, -508, -516, -253, -2, 512, 1282, 1790, 2049, 2816, 3327, +3329, 3583, 3073, 1792, -257, -2303, -3841, -5120, -5374, -6915, -8958, -9984, -10241, -11775, -13568, -13570, +-12284, -10500, -8189, -6146, -5632, -6654, -8194, -7935, -7425, -6912, -6398, -5890, -4095, -1280, 1790, 4357, +5882, 7429, 8444, 9219, 9727, 8959, 8194, 7164, 6662, 6139, 5378, 5120, 4606, 3588, 2556, 1795, +254, -255, 1536, 4095, 4610, 3581, 2563, 1533, 516, -5, -251, -1285, -2300, -2306, -1023, -1, +257, -1, 0, 1026, 2557, 3330, 2816, 1791, 1025, 255, -511, -512, -256, -257, 257, 1280, +1792, 1792, 2559, 3074, 3326, 3841, 3072, 767, -1279, -1536, -3073, -4863, -6145, -6911, -7682, -9213, +-10754, -12287, -13824, -13825, -12287, -9472, -7169, -6654, -6914, -7679, -7424, -7169, -7679, -7424, -7425, -6143, +-3840, -1281, 1281, 3328, 5375, 7425, 8960, 9215, 9473, 8960, 7935, 7169, 7168, 6656, 5375, 5378, +5629, 4612, 2044, 260, 252, 1283, 2559, 3839, 4098, 3070, 2049, 2048, 1792, 1023, -767, -1793, +-2047, -1025, -255, -513, -768, -255, 1023, 1792, 3074, 3325, 2819, 1789, 1283, 509, -253, -2, +257, 0, 767, 1537, 1279, 1537, 2559, 4098, 4093, 3331, 2301, 1283, -2, -1792, -3071, -4097, +-5631, -6144, -7170, -8701, -11011, -13565, -14339, -12797, -10755, -8701, -7938, -7680, -7423, -6913, -6911, -7169, +-7935, -8450, -7421, -5379, -3837, -1795, 1026, 2815, 4865, 7167, 8961, 8702, 8451, 8957, 8706, 7167, +5888, 6145, 6910, 6658, 5374, 3586, 1279, -1, 771, 2044, 3331, 3583, 3071, 2819, 3068, 3075, +1534, -254, -1281, -1025, -767, -769, -767, -1280, -1280, -1, 1281, 1791, 3073, 3072, 2304, 1535, +1537, 512, -513, -510, 253, 771, 253, 2, 1279, 2305, 2815, 3585, 3582, 3330, 2559, 1281, +-1, -1535, -3329, -4351, -4865, -4863, -6657, -9471, -12288, -13569, -13311, -12033, -10495, -9216, -8960, -7937, +-6655, -6657, -7422, -7682, -8190, -8451, -7421, -5378, -4094, -2562, 2, 3070, 5378, 6142, 7426, 8958, +9219, 8445, 7425, 6656, 6399, 7171, 7421, 6658, 4862, 2305, 767, 770, 2047, 2559, 2562, 2301, +3586, 3840, 3584, 2815, 1026, -259, -253, -257, -1025, -1022, -1281, -1536, -1024, 256, 1536, 2304, +2304, 3072, 3328, 1792, 511, 257, 513, 254, 1, -1, 1, 512, 1279, 2305, 3071, 3329, +3327, 3328, 2817, 1791, -511, -2305, -3072, -3071, -3329, -4607, -6913, -10495, -12546, -12541, -12547, -12285, +-11010, -9472, -8703, -7681, -6911, -6912, -7937, -8704, -8191, -7425, -7423, -6913, -4608, -2047, 255, 2561, +4351, 6400, 8193, 8958, 8962, 7680, 6910, 6659, 7421, 8450, 8191, 5889, 3327, 2305, 1792, 1791, +2049, 1791, 2049, 3328, 4351, 4097, 3071, 2050, 1277, 3, -259, 3, -514, -1535, -2049, -1023, +-513, -255, 1024, 2558, 3331, 3070, 2304, 1537, 1279, 1024, 770, 508, 261, -261, 5, 763, +1796, 2301, 2307, 3325, 4099, 3837, 2818, 1023, -1280, -2303, -1538, -1534, -3073, -5376, -7680, -9984, +-11776, -12544, -12032, -11776, -11520, -9727, -7682, -7422, -7682, -7678, -7682, -7934, -8449, -8704, -8192, -6400, +-4352, -2560, -767, 1790, 4098, 6655, 8449, 9215, 7937, 6398, 6914, 7936, 8702, 8707, 6908, 4868, +3838, 3327, 2306, 1279, 1281, 2048, 2815, 3584, 4098, 4094, 2818, 1534, 1537, 1280, 512, -512, +-1024, -1025, -1534, -1539, -1021, 254, 1793, 2560, 2815, 2561, 2048, 1535, 1282, 1277, 1027, -258, +-511, -1, 257, 767, 1280, 1537, 2302, 4098, 4863, 3584, 1536, -256, -511, -769, -1279, -1281, +-3072, -5886, -8451, -9469, -11010, -12543, -12801, -12031, -10497, -9215, -8449, -7935, -7425, -6911, -7682, -8701, +-8964, -8443, -7685, -6397, -4609, -3328, -1536, 1280, 4864, 7168, 7936, 7423, 6146, 6398, 7938, 8958, +8449, 7424, 6657, 5887, 4352, 2816, 2048, 1537, 1022, 2051, 3580, 3844, 3581, 3074, 2815, 2560, +1793, 1023, 513, -1, -512, -1534, -2051, -1534, -769, 513, 2047, 2817, 2302, 1794, 2303, 2049, +1535, 1280, 513, -257, 1, 767, 769, -1, 257, 2303, 3841, 4351, 4098, 3069, 1027, -259, +258, 511, -254, -1794, -3326, -5124, -7163, -9476, -11772, -12547, -12032, -11261, -10757, -9722, -8453, -7678, +-7424, -7425, -7935, -8960, -8961, -8191, -7168, -6657, -5631, -4353, -1535, 2305, 5629, 6404, 5884, 5891, +6910, 7682, 7678, 8706, 8446, 7681, 6656, 5888, 4864, 3072, 1280, 1279, 2050, 2814, 3331, 3580, +3844, 3581, 3073, 2049, 2046, 1794, 767, 256, -769, -1790, -2306, -1278, -2, 1025, 1791, 2305, +2048, 2303, 2561, 2816, 1535, 258, 508, 1028, 509, 3, -258, 1, 766, 2562, 4350, 4611, +3325, 1795, 1021, 1026, 1022, 258, -513, -1279, -2561, -5121, -7677, -9731, -11005, -12035, -11774, -11265, +-10751, -9729, -8191, -7426, -7421, -7940, -8700, -8963, -8446, -7681, -7424, -8192, -7167, -3842, -253, 2302, +4097, 5119, 5632, 5890, 6653, 7684, 8188, 7939, 7934, 7937, 7167, 5891, 3836, 2307, 2046, 1793, +1792, 2816, 3583, 3586, 3325, 3331, 2813, 2307, 2302, 2049, 1023, -256, -1279, -1793, -2047, -769, +513, 1279, 768, 1793, 2815, 3073, 2047, 1792, 1280, 1024, 1280, 1025, 510, -510, -1282, -254, +1791, 3840, 4095, 3074, 2558, 2306, 1534, 513, 768, 768, 256, -1024, -2817, -5374, -7682, -9469, +-10756, -11773, -12035, -11516, -10499, -9470, -7681, -7169, -8446, -9217, -8448, -7423, -7682, -8702, -9217, -8449, +-6654, -3587, -252, 2301, 3329, 4095, 4865, 6400, 6913, 7166, 7682, 8445, 8708, 7933, 6914, 5631, +3840, 2560, 2048, 2048, 2304, 2816, 3328, 3584, 3072, 2816, 2816, 2816, 2560, 2560, 1536, -768, +-2048, -1279, -770, -766, -258, 514, 1535, 2304, 2817, 2558, 2307, 1533, 1538, 1791, 2049, 1023, +-767, -1537, -255, 1280, 2303, 3329, 3583, 3330, 2813, 2051, 1533, 1027, 1278, 1281, 510, -1021, +-3076, -4858, -7431, -8954, -10245, -11773, -12801, -11519, -9218, -8190, -8706, -8958, -8705, -7935, -7426, -7678, +-8705, -9727, -9985, -8703, -6146, -3069, -770, 768, 2818, 4349, 5123, 5374, 6401, 7168, 7679, 8706, +8702, 8194, 6910, 5633, 4096, 2816, 1792, 2304, 2815, 2817, 3328, 3584, 2816, 2303, 3329, 3839, +3330, 1790, 257, -256, -1025, -1278, -1282, -1023, -512, 511, 1538, 2558, 3073, 1536, 1279, 2050, +3070, 2561, 1024, -257, -767, -768, 0, 1023, 2306, 3068, 3589, 3068, 2051, 1533, 1539, 1533, +1539, 1534, 768, -1535, -3329, -4351, -6400, -9217, -11776, -12543, -11522, -10237, -9475, -9214, -9473, -8960, +-8448, -7424, -7168, -8192, -9983, -10754, -9470, -8193, -6400, -3583, -1538, 514, 2303, 3585, 4607, 4865, +5630, 7171, 7934, 8193, 8703, 8193, 6399, 4866, 4093, 2563, 1789, 2050, 3071, 3329, 2815, 2305, +2814, 3587, 3837, 3330, 2559, 1537, 766, -253, -772, -763, -1285, -1533, -257, 1536, 2305, 2046, +1281, 1793, 2303, 3073, 3071, 1791, 515, -515, -509, -771, -255, 1537, 2814, 2819, 3324, 2820, +1788, 1284, 1533, 2562, 2047, 1024, -256, -768, -1792, -4351, -7170, -9726, -11266, -11263, -10751, -9986, +-9725, -10244, -9724, -8195, -7166, -7169, -7936, -8959, -9729, -10240, -9471, -7938, -6398, -4097, -1279, 767, +1792, 3328, 4609, 5119, 5888, 7169, 8447, 8705, 8447, 7937, 6911, 5121, 3327, 2560, 3073, 3328, +3070, 2563, 2557, 3074, 3327, 3584, 4097, 3839, 2304, 1280, 1281, 767, -768, -1792, -1792, -511, +767, 1536, 1793, 1278, 1539, 2812, 2820, 3069, 2818, 2048, 509, -507, -517, -252, 510, 1791, +2820, 3579, 2564, 1790, 1792, 2305, 2559, 2048, 1282, 1533, 1282, 255, -1792, -4606, -7682, -9983, +-10241, -9984, -9983, -10752, -10753, -9983, -8961, -7680, -6910, -7428, -8700, -9219, -9726, -10497, -9984, -7936, +-6144, -4352, -2048, 256, 1792, 2560, 3584, 4864, 6144, 6656, 7936, 8704, 8960, 7936, 5889, 4349, +3844, 3580, 3075, 3071, 3071, 2305, 2048, 2815, 3841, 4096, 3070, 2819, 2814, 2305, 1535, 1, +-1794, -1788, -517, 261, 251, 772, 1278, 1281, 1792, 2303, 3329, 3327, 2562, 1534, 513, -768, +-1281, -510, 1022, 2561, 2559, 2049, 1792, 2559, 2561, 2047, 1793, 1535, 1282, 1788, 2053, 507, +-2555, -5636, -7422, -8961, -9471, -9985, -10495, -11521, -11008, -9470, -8451, -7933, -7171, -7677, -8707, -9981, +-10243, -10238, -9729, -8704, -6400, -4095, -2305, -512, 769, 2303, 3585, 4096, 4863, 7169, 8704, 8960, +8191, 7170, 5885, 4611, 3838, 4097, 3584, 2559, 1794, 2302, 3074, 3583, 3839, 3074, 3071, 3840, +3841, 2301, 517, -517, -1020, -1027, -766, 255, 513, 511, 769, 1535, 2305, 2816, 3072, 3072, +2815, 1537, -256, -1279, -258, 1026, 1533, 2051, 2303, 2304, 2304, 3072, 2559, 1538, 1022, 1794, +2814, 2818, 2046, 2, -3073, -5376, -6656, -7680, -9215, -10242, -11006, -11010, -10750, -9473, -7936, -7425, +-7422, -7682, -8702, -9474, -10238, -10754, -9727, -7937, -6143, -5120, -2817, -254, 1021, 1539, 2558, 4097, +5888, 7167, 8705, 9216, 7936, 6656, 5887, 5377, 4863, 4098, 2813, 2052, 2555, 3334, 3322, 2821, +2813, 3842, 4350, 4098, 3326, 2050, 511, -768, -768, -255, 253, 4, 252, 515, 1278, 1281, +1792, 3327, 4097, 3839, 2305, 511, -255, -513, 258, 1277, 1283, 1022, 2049, 3072, 3071, 2562, +1790, 1282, 1278, 2817, 3584, 3072, 1280, -768, -2560, -4607, -6402, -7422, -8963, -10236, -11267, -11006, +-9986, -8959, -8192, -7936, -7168, -7680, -9217, -10239, -10496, -9984, -9984, -8960, -6657, -4351, -2816, -1024, +0, 1024, 2048, 4095, 6146, 7678, 8706, 8191, 6912, 6656, 6656, 5888, 4353, 2815, 2817, 3070, +3074, 2559, 2560, 2818, 3324, 4100, 4605, 4354, 3327, 1280, 512, 257, -257, -768, -256, 256, +257, -258, 258, 1534, 2561, 3585, 4094, 3074, 1278, 257, 512, 257, 510, 513, 1024, 1279, +2563, 3324, 2819, 1278, 769, 1536, 2303, 3329, 3584, 2816, 1280, -769, -2559, -4096, -5376, -7680, +-9473, -10494, -10499, -10748, -10756, -9214, -7424, -7169, -7935, -8448, -8961, -9726, -10754, -10495, -10240, -8705, +-6654, -4610, -3071, -1792, -769, 258, 1789, 4356, 6652, 7684, 7164, 7170, 7936, 7424, 6401, 5118, +4097, 3583, 3330, 2814, 2818, 2814, 2050, 2558, 3842, 4862, 4354, 3582, 2818, 2047, 768, -256, +0, 0, 1, 254, -254, -514, 258, 2303, 3839, 4098, 3582, 2562, 1534, 769, 767, 513, +0, 0, 1280, 2559, 3073, 2559, 1794, 1278, 1282, 2045, 2820, 3836, 3844, 2044, 771, -2, +-1533, -3843, -6143, -7168, -8705, -10493, -11524, -10492, -9732, -8445, -7937, -7425, -7935, -8191, -8962, -10238, +-10754, -10751, -9984, -8704, -6655, -4354, -3070, -3075, -2044, 252, 2820, 4604, 5634, 6401, 7677, 7940, +7675, 7173, 6396, 5123, 4094, 3841, 3839, 3074, 2045, 2051, 2814, 3329, 3839, 4353, 4607, 3586, +2813, 2051, 509, 2, 512, 766, 3, -771, -1022, -513, 1025, 2814, 3843, 3580, 2564, 2301, +2307, 1277, 514, -257, -256, 769, 1791, 2305, 2815, 2560, 1281, 510, 1539, 2813, 3330, 3071, +2817, 2815, 1537, -514, -1534, -3072, -5377, -7423, -9473, -10752, -10750, -10244, -9723, -8966, -7930, -7428, +-7678, -8705, -9216, -9984, -11263, -11521, -9984, -7935, -6145, -5375, -5121, -3327, -1281, 257, 2304, 3839, +5634, 6397, 7427, 7934, 7938, 6654, 5634, 5374, 5121, 3841, 3325, 2564, 2045, 2050, 2814, 3330, +3838, 4610, 4607, 3840, 2304, 1281, 1022, 1026, 1023, 512, -512, -1792, -1024, 512, 1792, 2816, +3071, 2818, 3070, 3074, 2046, 769, 0, -256, -256, 1024, 2559, 3329, 1792, 1023, 1282, 1278, +1792, 2561, 3327, 3586, 3069, 2307, 1533, 514, -768, -3074, -5373, -7683, -8958, -9985, -11008, -10238, +-9219, -8446, -8193, -7679, -7425, -7935, -9473, -11519, -11777, -10239, -8961, -7935, -7169, -6144, -5119, -3841, +-1791, 255, 1793, 3070, 5123, 6909, 7426, 7424, 7166, 6403, 6141, 5890, 5119, 4096, 3072, 2561, +2302, 2051, 2557, 3842, 4863, 5121, 4607, 3329, 1791, 1792, 2050, 2045, 1283, -259, -1534, -1281, +1, 767, 1537, 2047, 3074, 3325, 3075, 3326, 2561, 768, -512, -1, 1282, 2045, 2307, 2303, +1791, 1538, 1021, 1282, 2049, 2813, 3588, 3068, 2563, 2557, 2051, 766, -1023, -2816, -5121, -7423, +-9217, -10238, -9987, -9724, -9989, -8955, -7427, -6399, -7168, -9216, -10497, -10750, -10498, -10239, -8704, -8192, +-7936, -6657, -4862, -3587, -2301, -513, 1279, 3330, 5373, 6660, 7164, 6915, 6910, 7169, 6400, 5632, +5119, 4097, 3072, 2304, 1792, 1792, 3072, 4352, 4864, 4864, 3584, 2561, 2302, 2818, 3069, 1284, +-3, -510, -769, -1025, -510, 1022, 1283, 1789, 2818, 4094, 4098, 2815, 1025, -1, 0, 769, +1278, 2051, 2300, 2309, 1531, 516, 1276, 2052, 2301, 2562, 2815, 3071, 3330, 2559, 2048, 1281, +-258, -2814, -5633, -7423, -8449, -9471, -10753, -10751, -9216, -7681, -7423, -6657, -7935, -9728, -10753, -10496, +-10494, -9988, -9723, -8708, -7935, -6654, -5379, -4094, -3073, -1279, 1278, 3331, 4860, 6149, 6650, 6919, +7161, 6661, 6142, 5631, 5124, 4091, 2820, 1790, 1281, 2047, 3585, 5118, 4612, 3323, 3076, 3582, +3328, 3074, 2556, 1795, 0, -1025, -511, -258, 2, 0, 1022, 2563, 3837, 4354, 3328, 2046, +1282, 511, 0, 769, 2046, 2562, 2046, 1282, 1023, 1536, 1792, 1792, 2304, 3073, 3326, 3074, +2814, 3586, 3326, 1282, -1282, -2814, -4610, -6910, -8707, -9980, -10756, -10236, -8451, -7167, -6912, -7680, +-8704, -9472, -10240, -9984, -9984, -10240, -9728, -8704, -7680, -6912, -5888, -4608, -3071, -770, 1539, 3068, +4612, 5885, 6658, 6656, 6910, 6658, 6399, 6144, 5634, 3837, 1794, 1024, 2302, 3587, 3837, 4354, +4096, 3583, 3329, 3583, 4096, 3585, 2304, 1023, 258, 253, 3, -515, -764, 252, 1795, 3070, +3841, 4096, 3328, 2304, 768, 256, 1280, 1791, 2050, 1791, 1535, 1538, 1278, 769, 1280, 2560, +2303, 2050, 2558, 3585, 3839, 3586, 2557, 1283, -515, -2302, -4096, -6912, -9474, -10493, -10244, -9467, +-8196, -7421, -7426, -8448, -8704, -9215, -9985, -10238, -10499, -10238, -9473, -8703, -8193, -7679, -6401, -4863, +-3328, -1281, 1026, 2813, 4099, 5630, 6401, 6144, 6143, 7425, 7679, 6401, 4095, 2817, 2046, 2051, +2556, 3332, 3837, 3587, 3324, 3332, 3837, 4354, 3840, 2558, 1794, 1535, 768, -255, -1025, -1024, +-511, 254, 1795, 3325, 4354, 4095, 2560, 1025, 1023, 1281, 1023, 1536, 2305, 2303, 1281, 767, +1281, 1791, 1538, 1789, 1795, 2301, 3074, 3840, 3839, 3072, 2305, 1790, 259, -1795, -4094, -7426, +-9470, -10241, -9472, -8703, -7938, -7422, -7938, -8189, -8452, -9212, -9988, -10236, -9987, -9727, -9471, -8962, +-8446, -8194, -6655, -4864, -3584, -2304, 512, 3328, 4351, 4610, 5118, 6145, 7168, 7679, 7170, 5885, +4099, 2814, 2049, 2560, 3583, 3585, 3073, 2813, 3587, 4350, 4353, 3840, 3327, 3073, 2559, 1537, +767, -255, -513, -1280, -1279, 766, 3075, 3837, 3330, 3071, 2561, 1535, 769, 1279, 1792, 2306, +2045, 1539, 1278, 1280, 1794, 1789, 1283, 1278, 2049, 2816, 3328, 3839, 3586, 3069, 3076, 2300, +515, -1794, -4864, -7422, -9218, -9215, -8960, -8449, -8190, -7426, -7422, -8194, -8702, -9218, -10239, -10496, +-9728, -9472, -9983, -9731, -8701, -7682, -7166, -6401, -4096, -1280, 767, 2306, 3327, 4352, 5376, 6656, +7424, 7936, 7169, 5118, 3330, 2814, 3073, 3328, 2816, 2816, 2815, 3585, 4095, 3841, 4096, 4095, +3841, 2815, 2306, 2302, 1280, -1022, -1540, -1275, 252, 1026, 2559, 3585, 3583, 2817, 2046, 1283, +1277, 1795, 2302, 1792, 1281, 1535, 1537, 1536, 1792, 1024, 1023, 1538, 2302, 3074, 3070, 3330, +3327, 3840, 3583, 3074, 765, -2555, -5126, -7163, -8708, -9213, -8706, -8447, -8192, -7681, -7423, -8193, +-9215, -9472, -9217, -9728, -10239, -10241, -9470, -8963, -8957, -8962, -7935, -5889, -3583, -1536, 256, 1535, +2817, 3327, 5378, 7165, 8195, 7677, 5891, 4350, 3841, 3327, 3073, 2303, 2561, 3072, 2814, 2819, +3581, 4610, 3840, 3327, 3585, 4095, 3328, 1793, 255, -766, -1539, -1022, 256, 1278, 2820, 3579, +3076, 2045, 1795, 1789, 2051, 2046, 1792, 1537, 1536, 2046, 2052, 1531, 1284, 1278, 1280, 1794, +2557, 2818, 2559, 3073, 4096, 4352, 4095, 3072, 769, -2305, -4863, -6657, -7936, -8959, -8706, -7935, +-7424, -7680, -8192, -8447, -8450, -9215, -9984, -10240, -9983, -9218, -9470, -9986, -9726, -9217, -7937, -6141, +-3843, -1534, -513, 255, 1795, 3837, 6403, 7677, 7426, 6399, 6401, 5119, 3585, 3327, 3585, 2816, +2303, 2305, 3583, 4097, 3840, 3839, 3841, 4095, 4609, 4352, 3071, 1793, 511, -768, -1535, -769, +768, 2305, 3070, 2819, 2557, 2050, 2302, 2563, 2045, 1539, 1789, 2050, 2047, 2305, 2302, 1282, +766, 1538, 1792, 1790, 2050, 2302, 2306, 3327, 4608, 5121, 4350, 2562, 255, -1793, -4861, -7172, +-8187, -8454, -7930, -7941, -8445, -7937, -7680, -8192, -9215, -9986, -9727, -9728, -9728, -9728, -9728, -9985, +-10239, -9472, -7936, -5377, -3327, -2817, -2303, -257, 2562, 4349, 5636, 6907, 7428, 6398, 5377, 5121, +4350, 3585, 2815, 2305, 2305, 3070, 3330, 3070, 3073, 3328, 3840, 4096, 4353, 4094, 3074, 1278, +-254, -1537, -1280, -256, 1280, 2304, 2047, 2562, 2558, 2306, 2302, 2561, 1536, 1536, 2048, 2561, +2302, 1794, 1535, 1023, 1283, 1532, 2052, 2044, 1027, 1790, 3073, 4096, 4864, 4863, 4353, 3328, +1023, -2302, -4867, -6141, -7170, -7934, -8450, -7935, -7424, -7424, -7680, -8448, -9217, -9726, -9730, -9726, +-9218, -8959, -9985, -11263, -10752, -8449, -6655, -6144, -4865, -3326, -2050, -511, 2048, 4352, 5888, 6400, +6400, 6144, 5888, 5375, 4354, 3070, 2562, 2814, 2817, 3072, 2815, 3074, 3070, 3586, 4094, 4609, +4863, 4865, 3328, 767, -511, -513, -511, 255, 1537, 1791, 2049, 2560, 2815, 2817, 2303, 1793, +2048, 2304, 2303, 2817, 2560, 1535, 1282, 1534, 2050, 2046, 1282, 766, 1537, 2305, 3070, 3586, +4862, 5889, 4865, 2814, 258, -2051, -4093, -5889, -7168, -7937, -7678, -7427, -7420, -7683, -7680, -8190, +-9731, -9981, -8705, -7937, -9215, -10496, -11008, -10753, -9983, -8704, -7168, -6144, -5377, -4095, -2560, -1, +2817, 4350, 5123, 5885, 6659, 6910, 6143, 5123, 4093, 3330, 3072, 3071, 3073, 2815, 3073, 3071, +2561, 3328, 4863, 5378, 5117, 4355, 2302, 514, -771, -253, 254, 513, 768, 1536, 2303, 2562, +2813, 2819, 2046, 1538, 2046, 2818, 3069, 2563, 1534, 1537, 2048, 2303, 1538, 1534, 1793, 1536, +1279, 1537, 3073, 4606, 5634, 5630, 4353, 2817, 766, -1535, -4609, -5887, -6655, -7683, -8189, -7427, +-6654, -7424, -8961, -9470, -9219, -8445, -8452, -8699, -9987, -10495, -11009, -10752, -9471, -8192, -7424, -7169, +-6399, -4609, -2047, -1, 1793, 3840, 4863, 5889, 6911, 6401, 5376, 4863, 4354, 3326, 3074, 3071, +3071, 2819, 2556, 2308, 3069, 3586, 5120, 5886, 5122, 3326, 2050, 1023, 0, -256, 0, 511, +1027, 1532, 2308, 2812, 2819, 1791, 1536, 2304, 2816, 2559, 2051, 2043, 2309, 2044, 1540, 1789, +2049, 1792, 1279, 770, 511, 2303, 3842, 4606, 5121, 5632, 4863, 2562, 510, -1278, -3330, -5887, +-7168, -7168, -6656, -6656, -7424, -8449, -8958, -8706, -8447, -8192, -8193, -8958, -9986, -11263, -11008, -9728, +-9216, -8704, -8193, -7934, -6657, -4352, -2304, -768, 1535, 3586, 5118, 5889, 6401, 6397, 5891, 4862, +4097, 3841, 3581, 3587, 3326, 2561, 1793, 2045, 3588, 4860, 5635, 5630, 4609, 3583, 2050, 765, +516, 251, -251, -5, 1284, 2558, 2816, 2050, 1789, 2306, 2816, 2303, 2560, 2306, 2556, 2565, +2044, 1537, 2305, 3071, 2304, 1025, 766, 1025, 1281, 1789, 3588, 5372, 5891, 5118, 4609, 3327, +1537, -1536, -4352, -5888, -6145, -5887, -6400, -7168, -7679, -8451, -8957, -8706, -7679, -7679, -8706, -9727, +-10752, -11009, -10238, -9474, -9727, -9472, -8705, -7679, -6657, -5118, -3074, -767, 1279, 2816, 4867, 5883, +6150, 6137, 5639, 4091, 3842, 4096, 3839, 3586, 2302, 1537, 1535, 2306, 3326, 4865, 5631, 5377, +4096, 2816, 2303, 1537, -1, -767, -1, 1026, 1533, 1795, 1789, 2051, 2301, 2307, 1789, 2307, +2813, 2818, 1791, 1281, 2304, 2815, 2560, 2306, 2045, 1284, 252, 259, 1278, 2818, 4093, 4867, +5118, 5633, 5375, 3585, 510, -2045, -4098, -5376, -5888, -5887, -6401, -7423, -8449, -8704, -8447, -7682, +-7165, -8195, -9470, -10241, -10240, -10240, -10240, -10240, -9728, -9727, -9217, -7937, -6911, -5376, -3328, -1024, +1024, 3071, 4610, 5886, 6401, 5632, 4607, 4610, 4862, 4609, 4096, 3071, 2049, 1279, 1026, 2813, +4611, 5117, 4866, 4864, 4863, 3841, 2559, 769, -1, 258, 765, 1027, 1022, 1793, 2561, 2045, +1795, 2302, 3074, 2815, 2304, 2048, 2303, 2307, 2301, 2818, 2815, 2816, 1537, 255, 257, 1023, +1792, 2306, 3325, 5123, 5885, 6147, 5373, 3331, 510, -1791, -3328, -4353, -4863, -5120, -6656, -7936, +-8704, -7936, -7169, -7422, -8194, -8446, -9218, -9983, -9985, -9982, -10242, -9982, -9731, -9725, -8963, -8444, +-7172, -5373, -3843, -1789, 765, 3075, 5117, 5635, 5373, 5378, 5375, 4609, 4863, 5121, 3839, 2048, +1281, 1535, 2560, 3329, 3839, 4096, 4864, 5889, 4862, 3075, 1789, 1282, 767, 257, 255, 1537, +1791, 1280, 1538, 1788, 2310, 2553, 2822, 2300, 2562, 2304, 1535, 1793, 3072, 3583, 3073, 1791, +1281, 767, 770, 1020, 1284, 2045, 3586, 5375, 6144, 6143, 5123, 3068, 260, -2052, -2812, -3076, +-4349, -6146, -7423, -7936, -7936, -7424, -7425, -7679, -8193, -8702, -9217, -9472, -9985, -9983, -9984, -9984, +-9984, -9985, -9215, -8193, -7422, -6403, -4349, -1539, 770, 2815, 4353, 5119, 4609, 4606, 4867, 5629, +5378, 4863, 2817, 1791, 1792, 2049, 2047, 2305, 3839, 5376, 5378, 4605, 4355, 3326, 2048, 770, +509, 514, 1280, 1278, 1027, 1277, 1794, 2047, 2047, 2562, 3326, 2818, 1791, 1791, 2306, 2814, +3330, 3327, 2560, 1793, 1534, 1026, 511, 256, 1281, 2302, 3586, 5630, 6914, 6398, 4353, 2048, +256, -768, -1792, -3072, -4865, -6398, -7426, -7679, -7424, -7425, -7422, -7683, -8189, -8707, -9213, -9730, +-9472, -9727, -10497, -10495, -9729, -9471, -9473, -8960, -7679, -6657, -4351, -1793, 768, 3073, 3839, 3841, +4095, 4864, 6145, 6143, 4608, 3841, 3582, 2562, 1279, 1536, 2048, 3329, 4094, 4611, 5372, 5636, +4605, 3074, 1536, 1534, 1282, 1023, 768, 1537, 1534, 1282, 1279, 2048, 2816, 3072, 2816, 2048, +1792, 2047, 3074, 3070, 3074, 2814, 2817, 2048, 1280, 768, 512, -1, 770, 2302, 4866, 6654, +6913, 5632, 3840, 2304, 1280, 0, -1281, -3070, -4866, -6142, -6658, -6911, -7424, -6913, -6910, -7683, +-8445, -8451, -8701, -9219, -9725, -10243, -10238, -10242, -10238, -9985, -9728, -9472, -8704, -7169, -4606, -1026, +1281, 1536, 2303, 3841, 5120, 5376, 5631, 5378, 5117, 4099, 2814, 1538, 1278, 1794, 2045, 2564, +4092, 5380, 5372, 4611, 3838, 2818, 2046, 1282, 1021, 1539, 1279, 1280, 1024, 1024, 1791, 2818, +3071, 2559, 2051, 2044, 2051, 2303, 2559, 3075, 3068, 2820, 2556, 2308, 1788, 772, -516, -509, +767, 3328, 5375, 6146, 5886, 4865, 3585, 3069, 1796, -4, -1533, -2562, -4862, -6146, -6654, -6658, +-6654, -7169, -7680, -7935, -8193, -8704, -8959, -9473, -9984, -9983, -10242, -10494, -9985, -9472, -10496, -10752, +-9216, -6400, -3840, -1793, -510, 1023, 2559, 3842, 4349, 5123, 5887, 5887, 4609, 3584, 3071, 2306, +1278, 1025, 2304, 3328, 4351, 5122, 5374, 4866, 3838, 2818, 1790, 1537, 1536, 1792, 1023, 515, +763, 1541, 2044, 2306, 2560, 2303, 2049, 2047, 2048, 2817, 2815, 2817, 2815, 3072, 3329, 2815, +1281, 0, -1026, -253, 2045, 4098, 5120, 5374, 5891, 5117, 4354, 3326, 2307, 1021, -1277, -3075, +-4606, -5633, -6143, -6657, -6911, -7425, -7167, -7681, -8448, -8703, -8194, -9213, -9987, -10238, -9473, -9216, +-9983, -11010, -11517, -10243, -8446, -6657, -4607, -2305, -255, 1022, 1795, 3325, 5123, 5373, 5378, 5631, +5120, 4097, 2815, 1792, 1280, 1537, 2302, 3587, 4348, 5123, 5631, 4864, 3072, 2559, 2562, 2301, +1797, 1017, 774, 765, 1025, 1535, 2306, 2557, 2563, 1791, 1790, 2307, 2813, 2307, 2814, 2817, +3327, 4097, 4351, 2560, 513, -513, -255, 1023, 2304, 4096, 5377, 5631, 5376, 5121, 4606, 3843, +2813, 770, -1537, -2816, -3839, -5377, -6144, -6143, -6401, -7168, -7680, -7679, -7425, -7679, -9217, -9983, +-9729, -8959, -8961, -9983, -11008, -11009, -11007, -10497, -8959, -6401, -4352, -2815, -1281, 513, 2047, 3584, +4352, 5121, 5631, 5633, 5118, 3586, 2303, 1792, 1281, 1278, 2050, 3839, 5120, 5120, 4609, 3838, +3586, 3326, 2818, 2047, 1791, 1282, 510, 513, 1537, 2301, 2052, 2301, 2050, 1791, 2048, 2816, +2560, 2049, 2047, 3585, 4606, 4354, 3327, 1793, 255, -767, -258, 1026, 2559, 3840, 4865, 4606, +5378, 5886, 5122, 3838, 2306, 1023, -1024, -3072, -4351, -4866, -5374, -6401, -7424, -7422, -6660, -6653, +-7937, -9216, -9471, -8961, -9217, -9213, -9220, -9980, -11011, -11774, -11521, -9985, -8702, -6913, -5120, -3584, +-1536, 255, 1794, 2814, 4353, 5632, 5887, 5377, 4863, 3842, 2557, 1284, 763, 1541, 3068, 4099, +4350, 4609, 4608, 4095, 3586, 3582, 3073, 2304, 1280, 767, 514, 1022, 2049, 2560, 1791, 1537, +2304, 2815, 2561, 1792, 1535, 2049, 2815, 4353, 4607, 4097, 3070, 1539, -259, -510, 767, 1792, +2560, 3585, 4606, 5378, 5631, 5120, 5120, 4352, 3072, 768, -1279, -2306, -2813, -4612, -6396, -6916, +-6140, -6147, -6910, -7681, -8192, -8704, -8960, -8960, -8447, -8449, -9216, -10239, -11266, -11518, -10753, -9728, +-8703, -7426, -5374, -3586, -2302, -513, 1280, 3072, 4352, 4864, 5376, 5888, 5120, 3328, 1792, 1280, +1279, 2050, 3070, 4098, 4350, 4097, 4352, 4352, 3840, 3839, 3073, 2047, 770, 765, 1795, 2044, +1541, 1275, 1797, 2300, 2818, 2560, 1791, 1281, 1791, 2305, 3327, 4865, 5119, 4097, 2047, 769, +254, 259, 510, 1537, 2560, 3839, 4609, 4607, 5377, 6143, 5890, 3837, 2050, 1023, 0, -1791, +-3841, -5119, -5634, -5886, -6145, -6144, -6911, -7682, -8446, -8961, -8704, -8191, -7939, -8700, -9987, -10494, +-11265, -11265, -11263, -10495, -8963, -7164, -5892, -4349, -2562, -255, 1024, 2304, 3840, 5376, 5888, 5376, +4352, 2817, 1278, 1026, 1534, 2305, 3072, 3840, 4095, 3841, 3839, 4609, 4607, 3585, 2303, 1537, +1279, 1793, 1791, 1026, 1021, 1795, 2301, 2819, 2557, 2307, 1789, 1026, 1280, 3070, 4611, 5117, +4609, 3074, 2300, 1540, 253, -255, 769, 2047, 2304, 2816, 3840, 5631, 6403, 5884, 4867, 4094, +3072, 1538, -3, -1789, -3587, -4606, -5121, -5631, -5633, -5888, -7167, -8193, -8703, -8449, -7935, -7937, +-8446, -8962, -9470, -10498, -11519, -11520, -11008, -9983, -9474, -7935, -6144, -4352, -3072, -1280, 512, 2304, +4352, 5633, 5885, 5125, 4090, 2822, 1532, 1025, 2049, 2814, 3075, 3325, 3331, 4093, 5123, 5118, +4097, 2816, 2303, 2306, 1790, 1281, 1024, 1279, 1538, 1790, 2817, 3327, 2817, 1536, 512, 1023, +2561, 3839, 4097, 4608, 4863, 3842, 2045, 515, 509, 1283, 766, 769, 1792, 3328, 4608, 5631, +5633, 5376, 5121, 4606, 3073, 1792, 0, -1791, -3586, -4607, -4864, -4863, -5377, -6656, -7680, -8192, +-7935, -8193, -8447, -7938, -7933, -8963, -10238, -10753, -11008, -11519, -11265, -10495, -9474, -7934, -6401, -4607, +-3841, -2047, 255, 2305, 4095, 5377, 5888, 4863, 3329, 2048, 1535, 2050, 2557, 2307, 2046, 2561, +3839, 4609, 4608, 4096, 3583, 3073, 2559, 2306, 2046, 1538, 1022, 514, 1021, 2564, 3324, 2563, +1279, 768, 1024, 1536, 1792, 3328, 5120, 4864, 3840, 2560, 1793, 1533, 1028, 252, 259, 1022, +2305, 3328, 4352, 5120, 5632, 5632, 5376, 4608, 3841, 2047, 0, -2303, -3330, -3325, -3843, -4862, +-5889, -6400, -7168, -8191, -8193, -7679, -7681, -7936, -8447, -9216, -10241, -10495, -11008, -11776, -11520, -10752, +-9216, -8192, -6912, -5632, -4096, -2048, 0, 2304, 4607, 5634, 5374, 3842, 2558, 2306, 2557, 2052, +1788, 1796, 2300, 3331, 4093, 4611, 4607, 4351, 3586, 3069, 3075, 3071, 2047, 770, 254, 1794, +2814, 2561, 2304, 2304, 1792, 767, 513, 1280, 3328, 4608, 4607, 4097, 3840, 3327, 2563, 1532, +770, 257, 765, 1284, 2301, 3329, 4608, 5120, 5376, 5632, 5888, 5632, 3585, 1534, 2, -1282, +-2559, -3582, -3588, -4604, -5635, -6655, -7679, -7937, -7935, -7169, -7424, -7935, -8448, -8960, -9729, -10751, +-11521, -11519, -11009, -10238, -9475, -8189, -7172, -5884, -4867, -2813, 253, 3331, 4606, 4863, 4355, 3837, +3331, 3071, 2302, 1795, 1789, 1795, 2302, 3074, 4093, 4611, 3838, 3329, 3840, 4351, 3330, 1789, +1027, 1021, 1283, 1790, 2305, 3071, 3073, 2048, 511, 257, 1023, 2305, 3584, 4095, 4098, 4348, +4101, 3580, 2562, 1536, 1022, 515, 253, 1283, 2813, 3330, 3583, 4608, 5889, 6399, 6144, 5120, +3584, 1792, 0, -1024, -2304, -2816, -3328, -4352, -6144, -6913, -7166, -7170, -7422, -7426, -7679, -7680, +-8193, -8958, -9986, -10751, -11264, -11265, -11519, -10495, -9219, -8444, -8196, -7421, -5377, -2305, 770, 2559, +3584, 4097, 4093, 4100, 3324, 2820, 2557, 1793, 768, 1792, 3072, 3840, 3328, 3328, 3840, 4609, +4350, 3329, 2560, 2048, 1280, 769, 1021, 2307, 3069, 3331, 2302, 1025, 255, 769, 1535, 2305, +2816, 3840, 4607, 4354, 3838, 3842, 2815, 1280, 256, 512, 1280, 1537, 2046, 2817, 3584, 5120, +6144, 6401, 5885, 4868, 3580, 1284, -4, -764, -1539, -2302, -3586, -5118, -5889, -6655, -6914, -7422, +-7682, -7165, -7171, -7678, -8449, -8961, -9470, -10754, -11773, -11779, -10750, -9730, -9471, -9727, -9474, -7422, +-4610, -2303, 256, 2304, 3584, 3839, 3841, 4351, 4098, 2814, 1281, 1023, 2049, 2815, 2817, 2560, +3327, 3842, 4093, 4354, 4096, 3583, 2818, 1534, 513, 1024, 1791, 3330, 3326, 2306, 1534, 1281, +513, 510, 1538, 2814, 3330, 3839, 4353, 4863, 4608, 3072, 2305, 1279, 1025, 1023, 1280, 1281, +2047, 3072, 3841, 5119, 6145, 6656, 6143, 4864, 3073, 1791, 770, 253, -1278, -2561, -3583, -4352, +-5633, -6655, -7169, -7167, -7168, -7169, -7422, -7427, -7933, -8707, -10493, -11523, -11517, -10499, -10238, -10496, +-10753, -9983, -9217, -7680, -4863, -1793, 257, 1534, 2306, 3839, 4864, 4352, 2815, 2050, 1790, 1795, +2043, 1797, 2300, 2819, 3071, 3583, 3842, 4349, 4611, 3838, 1793, 767, 1281, 1791, 2305, 2559, +3073, 2559, 1537, 511, 1025, 1279, 1537, 2303, 2817, 4095, 4865, 4863, 3841, 2815, 2305, 1792, +1279, 1026, 1021, 1283, 1790, 2817, 3840, 5631, 6657, 6655, 5633, 4095, 3329, 2559, 1281, -1, +-767, -2048, -3329, -4863, -5888, -6401, -6654, -7170, -7679, -7424, -6657, -6654, -8195, -9980, -10501, -10748, +-10498, -10495, -10240, -10497, -11007, -11265, -9727, -6912, -4609, -2815, -1281, 1024, 3329, 4351, 3840, 3329, +2814, 2050, 2046, 1794, 1535, 2303, 2562, 2302, 2562, 3583, 5119, 5122, 4095, 3072, 2049, 1278, +1282, 2048, 3070, 3076, 2555, 2052, 1278, 1281, 1024, 767, 1280, 2304, 3585, 4352, 4862, 4354, +3838, 3074, 2303, 1792, 1280, 1280, 1024, 1024, 1024, 2816, 4608, 5889, 6397, 6149, 5626, 4870, +3580, 2562, 1535, 768, -255, -2049, -3839, -4609, -4863, -6144, -7425, -7423, -6657, -6143, -6400, -7681, +-8447, -9472, -10497, -10495, -9985, -9727, -10752, -11777, -11774, -10500, -8698, -7430, -5372, -3330, -767, 1792, +2816, 3328, 3583, 3586, 3069, 1795, 1790, 2305, 2304, 1534, 1283, 2045, 3075, 4094, 4864, 4865, +3839, 2561, 1536, 1279, 2049, 2815, 2817, 2559, 2561, 2047, 1793, 1279, 513, 767, 1280, 2561, +3838, 4355, 4605, 4609, 3841, 3070, 2562, 2560, 1789, 1028, 253, 514, 2048, 3326, 4866, 5886, +6146, 6399, 5632, 4096, 3583, 3330, 2559, 767, -1021, -1797, -2554, -3845, -5629, -6657, -6657, -6653, +-6148, -6140, -6147, -7422, -9217, -10240, -9728, -9215, -9729, -10752, -11520, -12032, -11264, -10239, -9730, -8190, +-5890, -3070, -1025, 768, 2560, 3841, 3326, 2562, 2559, 2560, 2305, 2046, 1538, 1279, 1793, 2302, +3330, 4607, 5121, 4350, 3074, 1790, 1538, 2047, 2303, 2562, 2558, 2561, 2561, 2301, 1283, 510, +513, 1025, 1278, 2561, 3840, 4608, 4608, 3841, 3838, 3330, 3326, 2562, 1279, 256, 512, 1023, +1794, 2814, 4866, 6142, 6401, 5376, 5119, 5122, 4606, 3073, 1792, 767, 258, -1282, -2815, -4096, +-5377, -6398, -6914, -5887, -5120, -5633, -6910, -8195, -9212, -8964, -8701, -9217, -10753, -11263, -11007, -11266, +-11774, -11265, -9729, -7934, -6401, -3840, -1023, 1278, 2562, 2815, 2816, 3072, 3072, 2560, 2304, 2048, +1279, 1026, 1278, 2561, 4097, 4861, 4612, 3836, 2563, 2302, 2306, 2046, 2049, 2560, 3071, 3074, +2558, 2050, 1533, 772, 508, 515, 1791, 3072, 4096, 4095, 3841, 4096, 4608, 4351, 3074, 2045, +1540, 763, 260, 511, 2304, 4096, 5119, 5121, 5632, 6144, 5887, 5122, 4094, 3586, 2558, 1280, +258, -769, -2305, -4349, -6149, -6395, -5891, -4863, -5377, -6653, -7941, -8186, -7686, -8700, -9217, -9473, +-9981, -10757, -11516, -11778, -11519, -11008, -9984, -8962, -6141, -3331, -1022, 768, 1790, 2564, 2811, 2821, +2811, 2820, 2302, 1281, 512, 767, 1793, 3328, 4350, 4355, 4093, 3587, 3070, 2304, 1792, 2304, +2561, 2815, 2817, 3070, 2818, 2303, 1024, 256, 257, 1278, 2563, 2812, 3076, 3581, 4353, 4609, +4094, 3842, 3583, 2560, 768, -255, 254, 1538, 2559, 3072, 4353, 5630, 5890, 5887, 5888, 5121, +4350, 3074, 2558, 2051, 1277, -254, -3074, -5374, -5890, -4862, -4865, -5377, -6142, -6658, -7167, -7680, +-8192, -8448, -8704, -9473, -10495, -10753, -11262, -11523, -11773, -11778, -10495, -8449, -6400, -3839, -1537, 514, +1277, 2050, 2559, 3073, 3327, 3073, 1534, 514, 512, 1279, 2304, 3072, 3840, 4097, 3839, 3073, +2814, 2050, 2047, 2305, 2303, 2560, 3329, 3582, 2819, 1533, 514, 511, 1281, 1535, 1792, 2561, +3582, 3842, 3839, 4097, 5374, 4611, 3068, 1539, 767, 511, 515, 1277, 2305, 3328, 4608, 5376, +5633, 5886, 5890, 5119, 3584, 3329, 3838, 3074, 767, -2048, -3583, -4098, -4605, -4867, -5374, -5377, +-5888, -6654, -7427, -7677, -7682, -8191, -8960, -9473, -9727, -10496, -11264, -12032, -12288, -12033, -10750, -8963, +-6397, -3842, -1535, -512, 511, 1537, 3071, 3841, 3071, 2048, 1025, 768, 766, 1539, 2301, 3330, +4096, 4094, 3587, 3069, 2818, 2559, 2048, 1536, 2560, 3584, 3584, 3072, 2048, 1791, 1537, 511, +769, 1792, 2560, 2558, 2562, 3584, 4606, 5124, 5115, 4100, 2814, 1537, 1023, 513, 767, 1537, +2559, 3073, 4096, 5631, 6657, 5888, 4863, 4098, 4862, 5122, 4351, 2048, 256, -1280, -2815, -3841, +-4352, -4352, -4864, -5632, -6399, -6658, -6910, -7427, -7676, -8452, -8700, -8964, -9725, -10498, -11262, -12034, +-12542, -12290, -11263, -8704, -5888, -4352, -2816, -1281, 514, 2301, 3331, 3325, 2563, 2046, 769, 511, +513, 1535, 2817, 3328, 3583, 3329, 3839, 3585, 2559, 1537, 1791, 2817, 3327, 2817, 3071, 3329, +2304, 1279, 770, 1021, 1538, 1536, 1790, 2052, 2811, 4100, 4861, 5123, 4861, 4100, 2810, 1287, +762, 1284, 1279, 1022, 1540, 3068, 5378, 6144, 5375, 4609, 4864, 5119, 5633, 4863, 4096, 2561, +255, -1535, -2817, -3327, -3841, -4350, -5123, -5884, -5892, -6397, -6914, -7422, -7939, -8188, -8452, -9213, +-9474, -9983, -11265, -12543, -13056, -12288, -10241, -8447, -6656, -5121, -3582, -1539, 516, 2043, 2820, 3070, +2561, 1280, 255, 512, 1282, 2045, 1795, 2557, 3842, 4352, 3327, 2305, 2303, 2047, 1796, 2556, +3075, 3581, 3330, 2559, 1794, 1277, 1282, 1535, 1280, 1025, 1534, 2306, 2815, 3841, 5119, 5632, +4865, 3327, 2561, 2559, 2049, 767, 1, 767, 2561, 4352, 4863, 4864, 4866, 4862, 5378, 5630, +6144, 5378, 4094, 2049, 256, -1025, -2047, -3073, -3839, -4609, -4863, -5377, -5888, -6399, -6913, -7168, +-7679, -8193, -8191, -8449, -8704, -10496, -12031, -13057, -12800, -11775, -10242, -9214, -7425, -5377, -3582, -1794, +514, 2302, 3330, 2557, 1283, 1022, 1537, 769, 509, 1283, 2301, 3331, 3581, 3587, 3325, 2563, +2045, 2050, 2047, 2817, 3839, 3586, 2814, 2305, 2048, 1791, 1537, 1280, 1279, 1281, 1023, 1537, +3327, 4865, 5374, 4610, 4095, 4097, 3840, 2303, 769, -1, 513, 1791, 3074, 4094, 4609, 4607, +4609, 5120, 5631, 6401, 6143, 5377, 3839, 2049, 766, -765, -2051, -2813, -3586, -4352, -4863, -5633, +-5631, -6145, -6654, -7683, -7677, -7683, -7422, -7937, -9215, -11265, -12030, -12547, -12541, -12035, -10749, -8962, +-7423, -6401, -4094, -1027, 1283, 1789, 2050, 2047, 2049, 1278, 515, 509, 770, 1536, 2558, 3075, +3326, 3585, 3072, 1791, 1537, 2048, 2816, 3327, 3074, 3070, 3073, 2560, 1792, 1792, 1792, 1536, +512, 0, 1280, 3071, 4098, 4350, 4353, 4863, 5120, 4609, 3328, 1790, 770, 510, 1026, 2303, +3328, 3840, 4096, 3841, 4605, 5380, 6140, 6404, 5885, 5121, 3840, 2560, 767, -254, -1539, -2300, +-3588, -4350, -4865, -5119, -5377, -6399, -7170, -7678, -7168, -6657, -7424, -8703, -9473, -10495, -12288, -13057, +-12287, -11264, -10753, -10495, -8704, -6144, -3584, -1537, 257, 1280, 2047, 2050, 1534, 769, 512, 767, +1025, 1280, 2559, 3330, 3838, 2818, 2045, 1795, 2045, 2307, 2558, 3073, 3583, 2818, 2045, 2051, +2813, 2819, 1534, 258, -2, 1024, 2306, 2813, 3332, 3837, 4864, 5378, 5117, 4099, 2815, 1279, +513, 512, 1791, 2561, 3072, 3326, 3332, 4348, 4867, 5630, 6145, 6399, 6145, 5119, 3841, 2559, +1537, 255, -1280, -2559, -3842, -3838, -3586, -4606, -6145, -6655, -6914, -6654, -6914, -6910, -6913, -7936, +-9984, -11520, -12032, -12031, -12033, -12033, -11773, -10500, -8443, -6404, -4094, -2049, 257, 1535, 1793, 1535, +1536, 1025, 510, 3, 765, 2049, 3073, 3070, 3074, 2814, 2306, 1790, 1539, 2556, 3332, 3325, +2306, 2302, 2818, 3326, 2819, 1789, 514, 255, 767, 1282, 1534, 2049, 3074, 3836, 5124, 5628, +5378, 4097, 2558, 1026, 1023, 1535, 2050, 2558, 2818, 3070, 3586, 4094, 4866, 5630, 6402, 6399, +6144, 4864, 3840, 3073, 1791, -256, -1792, -2303, -2561, -3583, -4353, -5120, -5631, -6913, -7423, -6657, +-6143, -6145, -7167, -8960, -10241, -10751, -11264, -12033, -12542, -12291, -11773, -10499, -8957, -6915, -4093, -1795, +-509, 765, 1795, 2046, 1280, 258, -3, 771, 1278, 1793, 2560, 3327, 3073, 2048, 1280, 1792, +2816, 3072, 2816, 2304, 2305, 3070, 3586, 3070, 2306, 1534, 1026, 1022, 1026, 1023, 1536, 2048, +3072, 4353, 5630, 5890, 4863, 3328, 2305, 1534, 1537, 1792, 2048, 2304, 2560, 2816, 3328, 3840, +5119, 6402, 6398, 5890, 5630, 5890, 4862, 2818, 1535, 511, -766, -2050, -2558, -3074, -4094, -5123, +-6652, -7172, -6397, -5890, -5888, -6654, -7938, -8703, -9472, -10497, -11519, -12032, -12289, -12542, -12290, -11008, +-8703, -6657, -4607, -2560, -257, 1280, 1281, 767, 513, 512, 255, 258, 1277, 2563, 3326, 2817, +2048, 1535, 2048, 2818, 2556, 2309, 1787, 2563, 3071, 3584, 3328, 2816, 2048, 1280, 1281, 1022, +1282, 766, 1026, 2046, 3587, 5117, 5890, 5630, 4354, 3071, 2561, 2047, 1536, 1793, 2558, 2563, +1789, 2306, 3583, 5120, 5376, 5377, 6398, 6657, 6401, 5630, 4354, 3327, 2047, 514, -769, -1280, +-1791, -2818, -4350, -5889, -6656, -5887, -5635, -5884, -6147, -6398, -7426, -8447, -9728, -10239, -11010, -12031, +-13056, -12799, -11778, -10494, -9474, -7422, -4353, -2048, -257, 515, 1019, 1030, 250, -507, -516, 770, +2304, 2558, 2307, 1789, 1794, 2304, 2814, 2307, 1789, 2051, 2045, 2819, 3326, 3585, 3071, 2561, +1790, 2052, 1531, 1028, 510, 512, 770, 2300, 4100, 5118, 5121, 5375, 4353, 3071, 1792, 1793, +2558, 2051, 1789, 1794, 2046, 2818, 3582, 4098, 5119, 5888, 6656, 6657, 6398, 5890, 4607, 3328, +1281, 511, 0, -255, -1793, -3583, -4865, -5376, -5631, -5889, -5887, -5632, -5889, -6911, -7681, -8192, +-8703, -9985, -11262, -12547, -12542, -12801, -12544, -11518, -9475, -7166, -5120, -3073, -766, 1022, 1281, -1, +-511, -768, 768, 1791, 2049, 1790, 1795, 2046, 2304, 2561, 2302, 2051, 1534, 1792, 2561, 3070, +3330, 3071, 2817, 2559, 2561, 2302, 1538, 255, -512, 257, 1278, 2306, 3839, 5376, 5633, 4606, +3587, 3069, 3074, 2816, 2047, 2050, 2046, 2049, 2048, 2560, 3328, 4096, 5120, 5632, 6143, 6915, +7164, 6147, 4351, 2559, 2050, 1791, 768, -768, -1792, -3072, -4607, -5634, -5630, -5122, -5118, -5889, +-6400, -6400, -6912, -7936, -8960, -10239, -10754, -11773, -13060, -13053, -12545, -11264, -9727, -7937, -5376, -2304, +1, 510, 3, -772, -508, 253, 1026, 1279, 1536, 1536, 1792, 2305, 2559, 2305, 1791, 1536, +1793, 2047, 2817, 3327, 2816, 2561, 3071, 3585, 2815, 1793, 1279, 513, 0, -1, 1025, 3071, +4609, 4863, 4610, 4348, 4100, 3582, 3329, 2560, 2302, 2306, 2047, 1537, 2047, 3073, 3582, 4099, +4349, 5635, 7166, 7425, 6399, 5122, 4351, 3583, 2562, 1790, 1026, -2, -1791, -3841, -4606, -4610, +-5119, -5377, -5631, -5632, -5376, -6401, -7167, -7937, -8703, -9729, -11007, -12545, -12799, -12801, -12543, -12033, +-10495, -7937, -4350, -2307, -1020, -773, -1019, -772, -253, 510, 769, 767, 1025, 1535, 2050, 2301, +2562, 2048, 1022, 1283, 2301, 2817, 2562, 2301, 2818, 3071, 3072, 2817, 2815, 2048, 1025, -513, +-512, 257, 1790, 3586, 4094, 4609, 4865, 4606, 4097, 3328, 3327, 3075, 2556, 1539, 1278, 2306, +2558, 2562, 2558, 3586, 5374, 6658, 6909, 6917, 6394, 5381, 4093, 3585, 3328, 2817, 1021, -764, +-2307, -3071, -4095, -4865, -5377, -5374, -5122, -5630, -5889, -6400, -6656, -7168, -8703, -10242, -11261, -11779, +-12285, -13314, -13568, -12543, -10241, -7423, -4352, -2562, -2045, -1539, -1021, -515, 3, 508, 773, 507, +772, 1789, 2562, 2047, 1535, 1283, 1788, 2052, 2045, 2050, 2302, 2818, 2558, 2819, 3325, 3586, +3071, 1536, 1, -513, 1, 1023, 2050, 2813, 4356, 4604, 4355, 3838, 4098, 4350, 3586, 2558, +2050, 2302, 2561, 2048, 1792, 2048, 2816, 3839, 5122, 6398, 7426, 6910, 5633, 4864, 4608, 4608, +3584, 2304, 767, -254, -1538, -3071, -4352, -4609, -4863, -4864, -5378, -5885, -5636, -5372, -6403, -7678, +-8706, -9471, -10496, -11520, -12799, -14082, -14079, -12032, -9472, -7168, -4863, -3074, -2558, -1794, -1022, -257, +1, -513, -256, 768, 2048, 2049, 1791, 1793, 1790, 1794, 1534, 1538, 2046, 2305, 2305, 2046, +2562, 3326, 4098, 3581, 2309, 1018, 261, -259, -255, 768, 2304, 3583, 3586, 3838, 4353, 5120, +4607, 3585, 2816, 2815, 2818, 2302, 2048, 2050, 1789, 2051, 2558, 4353, 5887, 6914, 6654, 6145, +5632, 5887, 5378, 4606, 3842, 2815, 1792, 0, -2049, -2813, -3332, -4091, -5126, -5371, -5379, -5118, +-5121, -5632, -6656, -7680, -7935, -8449, -9984, -12031, -13570, -14333, -13827, -12030, -9473, -6912, -5375, -4353, +-2816, -1279, -770, -766, -769, -256, 513, 1022, 1282, 1790, 1794, 1790, 1539, 1277, 1538, 2047, +2048, 1281, 1279, 2049, 3327, 3841, 3583, 3328, 2305, 1022, -510, -769, 512, 1537, 2301, 2564, +3580, 4356, 4861, 4353, 4096, 3584, 3328, 2817, 2814, 2562, 2302, 1538, 1023, 1792, 3328, 4865, +5886, 5891, 6140, 6660, 6397, 5378, 5375, 5120, 4608, 2817, 1278, -254, -1281, -2304, -3071, -4354, +-5118, -5121, -4607, -4609, -5376, -6143, -6657, -6654, -7427, -8446, -9985, -12287, -14081, -14591, -13058, -11005, +-9475, -7933, -5891, -3838, -2560, -1793, -1535, -1281, -767, -256, 256, 767, 1537, 1791, 1537, 1025, +1278, 2049, 2047, 1536, 1025, 1536, 2047, 2304, 3073, 3838, 4355, 3325, 1795, 253, 259, 509, +771, 1278, 1793, 3072, 3839, 4353, 4608, 4863, 4354, 3582, 3585, 3584, 3583, 2818, 1534, 770, +1534, 2818, 3582, 4354, 5630, 6402, 6398, 6146, 5886, 6146, 5886, 5634, 4349, 2820, 1276, 515, +-513, -2305, -3838, -4610, -4351, -4352, -4607, -5122, -5629, -6148, -6396, -6146, -6400, -8446, -11011, -13054, +-13569, -13567, -12545, -11774, -10243, -8190, -6145, -4095, -3329, -2303, -1537, -1280, -1279, -513, 257, 1279, +1281, 767, 1025, 1535, 1793, 1536, 1279, 1281, 1279, 1024, 1025, 2559, 4097, 4352, 3838, 2306, +1279, 769, 255, 1, 766, 1027, 1789, 2563, 3838, 4353, 4864, 4094, 3587, 3838, 4609, 4095, +2816, 1792, 1537, 1279, 1536, 2304, 3584, 4608, 5632, 5889, 6142, 5634, 6142, 6658, 6143, 4864, +3840, 3327, 2306, 767, -1280, -2560, -3329, -4094, -4098, -4094, -4610, -5631, -6144, -5632, -5121, -5631, +-6913, -9215, -11264, -12545, -13311, -13825, -13312, -12031, -10240, -8193, -6655, -4609, -3327, -2561, -2815, -2048, +-1024, 255, 513, 511, 770, 1278, 1281, 1279, 1537, 1791, 1537, 1024, 255, 768, 2306, 3325, +3844, 4092, 3330, 2559, 1538, 766, 257, 511, 769, 768, 1536, 3327, 4097, 3840, 3583, 3842, +4350, 4353, 4096, 3839, 2817, 2048, 1535, 1282, 1533, 2564, 4091, 4869, 5116, 5378, 5632, 6911, +6658, 6142, 5889, 5376, 4607, 3842, 2302, 770, -1025, -2816, -3072, -3073, -3582, -4353, -5632, -5887, +-5378, -4606, -4609, -5632, -7168, -8960, -10751, -12545, -13568, -13568, -12800, -12032, -10496, -8448, -5888, -4351, +-4099, -3580, -2564, -1532, -771, -511, 257, 766, 1026, 510, 1026, 1791, 2304, 1537, 765, 260, +509, 1282, 2303, 3072, 3840, 3841, 2815, 2048, 1793, 1278, 771, -259, 2, 1279, 2560, 3073, +3326, 3586, 3838, 4355, 4605, 4610, 4350, 3842, 3071, 2049, 767, 1024, 2305, 3327, 3586, 4093, +4867, 5885, 6147, 6398, 6401, 6143, 5633, 5631, 5120, 4097, 2302, 258, -1282, -1790, -2051, -2813, +-4099, -5374, -5376, -4865, -4351, -4608, -4866, -5629, -7170, -9215, -11008, -12289, -13055, -13824, -13569, -12544, +-10239, -8193, -6656, -5887, -4354, -3325, -2818, -2305, -1021, -259, 259, -1, 254, 516, 1532, 2051, +1534, 769, 256, 0, 256, 1024, 2560, 3327, 3331, 3068, 3076, 2813, 1537, 769, -258, -254, +511, 1536, 2048, 2560, 2816, 3585, 4095, 3840, 4096, 4609, 4862, 3586, 2046, 1282, 1535, 1792, +2303, 2818, 3581, 4100, 4860, 5635, 6143, 6144, 5887, 6146, 6141, 6404, 5629, 3585, 1536, -1, +-255, -768, -2049, -3582, -4611, -4861, -5378, -5120, -4606, -3843, -4604, -5892, -7421, -8706, -10239, -12031, +-13826, -14078, -13058, -11774, -10498, -8701, -6916, -5885, -4865, -4097, -3069, -1796, -764, -771, -766, -513, +512, 1280, 1536, 1792, 1793, 510, -254, -2, 1025, 2048, 2559, 2818, 3326, 3586, 3581, 2819, +1534, 257, 1, 765, 1027, 1277, 2052, 2812, 3331, 3070, 3329, 4608, 5376, 5375, 4354, 3581, +2564, 1788, 1795, 2046, 2305, 2559, 3330, 4349, 5123, 6142, 6144, 5889, 6143, 6913, 7680, 6911, +4864, 3329, 2302, 1539, 509, -766, -1793, -3072, -4352, -5120, -5120, -4096, -3584, -4352, -4864, -5376, +-6401, -8447, -10753, -12542, -13570, -13567, -13312, -12033, -10238, -8450, -7167, -6400, -5632, -4096, -2815, -2051, +-1533, -1026, -766, -513, 512, 1792, 2304, 1537, 767, 1, -2, 515, 1021, 1539, 1789, 2563, +3836, 4101, 3067, 1796, 1278, 768, 257, -1, 512, 1794, 2044, 2052, 2301, 3074, 4096, 4862, +5122, 4863, 4096, 3073, 2558, 2050, 2047, 2048, 2048, 2305, 3325, 4867, 5375, 5119, 4866, 5886, +7168, 7426, 7165, 6147, 5118, 3841, 2560, 1535, 770, -258, -2303, -4096, -4608, -4607, -4354, -4094, +-4354, -4094, -4353, -5119, -6914, -8702, -10497, -12032, -13311, -14081, -13056, -11519, -10242, -9214, -7937, -6656, +-5631, -4354, -3070, -2049, -1792, -2047, -1538, -254, 1023, 1792, 1792, 1024, 0, 256, 512, 255, +257, 768, 2303, 3330, 3582, 3329, 3072, 2303, 1026, 253, 260, 508, 1283, 1278, 1537, 1791, +2305, 3328, 4608, 4864, 5119, 4609, 3839, 3075, 2811, 2821, 1788, 1283, 1790, 3072, 4097, 4352, +4096, 4352, 5631, 6656, 6915, 7420, 7172, 6139, 4869, 3836, 3332, 2555, 1029, -1028, -2557, -3586, +-4095, -4353, -4351, -4096, -3585, -3327, -4352, -5121, -6143, -8193, -10496, -12542, -13059, -13309, -12547, -11518, +-10496, -9218, -8444, -7173, -5371, -3844, -2813, -2562, -2303, -2304, -768, 512, 1536, 1280, 1023, 770, +1023, 256, -512, -256, 512, 1280, 2304, 2816, 3583, 3587, 2811, 1798, 762, 261, 765, 1281, +1281, 1278, 1283, 1533, 2306, 3584, 4863, 5121, 4607, 4097, 4351, 4097, 3327, 1793, 1279, 2049, +3070, 3331, 3325, 3843, 4349, 4867, 5374, 6656, 7425, 7423, 6401, 5632, 5119, 4864, 4097, 2304, +767, -766, -1795, -3326, -4352, -4353, -4094, -4098, -3839, -3584, -3585, -4606, -6658, -8702, -10498, -12542, +-13314, -13054, -12547, -11773, -11010, -10239, -8705, -7166, -5124, -3834, -3846, -4093, -3071, -1539, -508, 252, +515, 1021, 1284, 1019, 261, -260, -253, -2, 257, 1279, 2050, 3071, 3583, 3330, 2301, 1539, +1023, 512, 1024, 1023, 1025, 512, 768, 1537, 3070, 4097, 4097, 3838, 4355, 5116, 4612, 3325, +2306, 2047, 2049, 2047, 2817, 3070, 3587, 3325, 3843, 4862, 6145, 7167, 7169, 6654, 6147, 6398, +5889, 4863, 3840, 2816, 1281, -513, -2048, -3072, -3584, -4352, -4352, -3839, -3330, -3070, -3330, -4351, +-6400, -8448, -10752, -12033, -12798, -12546, -12031, -12032, -11777, -10494, -8194, -6399, -5377, -5118, -4610, -3582, +-2306, -1791, -768, 0, 768, 1280, 1280, 511, 258, -2, -254, -258, 257, 1536, 2304, 3328, +3328, 3071, 2306, 1278, 1026, 1278, 1537, 1024, 256, 0, 1537, 2559, 2816, 3072, 4097, 4862, +5379, 5117, 4354, 3583, 2560, 2049, 2303, 2560, 3329, 3070, 2818, 3071, 4352, 5632, 6400, 6400, +6912, 7169, 6909, 6403, 5886, 5633, 4353, 2814, 1536, -255, -1793, -3070, -3587, -4093, -4099, -3581, +-3074, -2559, -3073, -4094, -6402, -8959, -10752, -11521, -11518, -12034, -12798, -13058, -11519, -9472, -7936, -6912, +-5888, -5376, -4352, -3584, -2816, -2305, -766, -3, 772, 1019, 1029, 764, 259, -514, -511, -513, +257, 1535, 2562, 3326, 3329, 2303, 1280, 1794, 2045, 1795, 509, 3, 510, 1025, 1278, 1795, +2301, 3075, 4350, 4865, 5119, 4864, 4097, 2815, 2050, 2301, 2818, 3071, 2305, 2304, 2815, 3585, +4351, 5121, 6144, 6654, 6659, 6909, 6659, 6653, 6146, 5374, 4354, 3071, 1280, 0, -1536, -2816, +-3839, -4097, -4096, -3584, -2559, -2049, -2559, -4609, -7168, -8703, -9474, -10749, -12035, -12798, -13313, -12288, +-11007, -9729, -8448, -7423, -6145, -5375, -4865, -4095, -3073, -1792, -767, -2, 514, 1023, 1023, 515, +-260, -508, -1028, -765, 510, 2050, 3070, 2562, 2046, 2050, 2559, 2303, 1538, 766, 769, 513, +766, 770, 1278, 1538, 2302, 3074, 4094, 5378, 5631, 4352, 3329, 2814, 3331, 3068, 2820, 2557, +2562, 2303, 2816, 3584, 4609, 5375, 5888, 6400, 6912, 6913, 6911, 7168, 6656, 5889, 4862, 3587, +2044, 260, -1538, -2304, -3584, -4607, -3841, -2559, -1793, -2048, -3326, -5123, -6653, -7427, -9213, -10754, +-12287, -12801, -12799, -12545, -11262, -9731, -8701, -7426, -6656, -6142, -5123, -4093, -3074, -2303, -1025, 2, +509, 771, 1022, 770, -514, -1535, -1280, 0, 1279, 1794, 2045, 2052, 2556, 2818, 2560, 1791, +1283, 1275, 773, 508, 771, 766, 770, 766, 2050, 3838, 5121, 5120, 4608, 4352, 3584, 3584, +3328, 3072, 2815, 2050, 2301, 2308, 2812, 3843, 4607, 5375, 5890, 6142, 6658, 6911, 6912, 6656, +6913, 5886, 4611, 3324, 2307, 766, -1278, -3329, -4609, -4094, -2819, -1789, -2050, -2815, -3584, -4353, +-5887, -7425, -9215, -10753, -12030, -12803, -12796, -12292, -11005, -9729, -8704, -7936, -6911, -6146, -5374, -4354, +-3070, -2305, -1535, -514, 769, 1536, 769, -513, -1535, -1538, -509, 253, 515, 1022, 1793, 2304, +2304, 2303, 2306, 1790, 1026, 766, 1026, 1279, 255, 2, 254, 1538, 2815, 4096, 4608, 4865, +4350, 4099, 3837, 3586, 3327, 3073, 2559, 2305, 1791, 2303, 3075, 3581, 4354, 5120, 5886, 5890, +6399, 6912, 7681, 7168, 6654, 5635, 4861, 4354, 3072, 510, -2301, -3587, -3582, -3073, -2560, -2303, +-2562, -2558, -3330, -4350, -5889, -7425, -8958, -11010, -12287, -12799, -12802, -12029, -11268, -9980, -8964, -8188, +-7939, -6654, -5378, -4606, -4098, -3326, -1538, 258, 1534, 770, -2, -1022, -1026, -766, -770, 2, +766, 1026, 1278, 2306, 2814, 2562, 1790, 1282, 1535, 1536, 1280, 512, -256, -256, 512, 1791, +3074, 3838, 4098, 4349, 4355, 3838, 4097, 3839, 3585, 3071, 2305, 2559, 2304, 2305, 3070, 4099, +4605, 5122, 5120, 5887, 6913, 7679, 7680, 6658, 6142, 6657, 6399, 4865, 2304, -256, -2305, -2814, +-2818, -2814, -2306, -2046, -2049, -2561, -3070, -3842, -5119, -7423, -9219, -10493, -11778, -12799, -12800, -11777, +-11006, -10243, -9724, -8708, -7165, -6146, -5630, -5635, -4604, -2563, -511, 257, 509, 260, -259, -1022, +-1025, -768, -512, -511, -1, 1025, 1790, 2563, 2044, 1796, 1533, 1794, 2047, 1792, 1024, -256, +-511, -2, 1026, 1791, 3072, 3841, 4095, 4097, 4350, 4355, 4093, 3842, 3584, 3070, 2563, 2046, +1792, 2560, 3329, 4095, 4098, 4349, 5378, 6655, 6913, 6912, 6399, 6657, 7423, 7681, 6400, 4351, +2050, -2, -1535, -2816, -2560, -2304, -2304, -2304, -2048, -2048, -2816, -3840, -5120, -6656, -8703, -10754, +-12030, -12289, -12032, -11519, -11521, -11008, -9471, -7938, -7165, -7171, -6910, -5633, -4095, -2305, -512, 257, +255, -255, -769, -768, -767, -1025, -1024, -511, 510, 1539, 2045, 2050, 1534, 1538, 2047, 2304, +2048, 1280, 513, -258, -766, -2, 769, 1793, 2815, 3328, 3841, 4094, 4353, 4353, 4350, 4355, +4092, 3076, 2045, 2049, 2818, 3068, 3332, 3069, 3585, 4866, 6141, 6658, 6399, 6145, 6655, 7682, +7932, 7685, 6396, 4611, 2046, 1, -1025, -2047, -2560, -2561, -2303, -2049, -2047, -2305, -2814, -3331, +-4861, -6915, -9470, -10752, -11009, -11519, -12289, -12287, -11520, -10241, -8959, -8449, -7934, -7682, -7166, -5635, +-3837, -2050, -1023, -255, -259, 4, -260, -508, -1028, -1276, -1283, -254, 1024, 1277, 1540, 1534, +1791, 1796, 2299, 2563, 2048, 1278, 258, -257, -256, 257, 1023, 1792, 2560, 3329, 3583, 3585, +4094, 4611, 4605, 4099, 3069, 2563, 2557, 3075, 3069, 2562, 2304, 3070, 4355, 5372, 5636, 5629, +6147, 6397, 7170, 7935, 8449, 7936, 6400, 4351, 2562, 509, -1021, -2050, -2302, -2051, -2045, -2307, +-2301, -1538, -1535, -3329, -5375, -7169, -8446, -9474, -11007, -12288, -12545, -12285, -11267, -9983, -8959, -8706, +-8702, -8449, -7169, -5374, -4097, -2049, -1278, -770, -255, 256, -256, -1280, -1535, -1537, -769, 2, +510, 1026, 767, 1023, 1537, 2048, 2559, 2562, 1533, 770, 256, -257, -510, -2, 1024, 2050, +2813, 2819, 3327, 3839, 4610, 5118, 4610, 3326, 2819, 3325, 3330, 2559, 2048, 2049, 2559, 3328, +4608, 5120, 5376, 5377, 5630, 6658, 7421, 8451, 8447, 7680, 6144, 4607, 2306, 255, -769, -1279, +-1792, -2816, -2815, -2051, -1021, -1026, -2302, -3586, -5375, -6656, -8193, -9726, -11011, -12285, -12546, -11520, +-10494, -9987, -9469, -9474, -9472, -8702, -6915, -5373, -4354, -3071, -1536, -513, 1, -257, -1023, -1793, +-1535, -1281, -512, 0, 257, 511, 257, 1023, 2048, 2305, 2559, 2049, 1535, 769, -1, -767, +-513, 256, 1281, 2047, 1793, 2047, 3585, 4863, 4865, 4352, 3839, 3841, 4095, 3585, 3071, 2305, +1791, 2304, 3074, 3837, 4611, 4862, 4608, 5121, 6144, 6911, 7682, 8445, 8706, 8192, 6399, 4098, +2301, 1539, -2, -1279, -2303, -2563, -1788, -1283, -1023, -1279, -2307, -3580, -4611, -5887, -7936, -9985, +-11263, -12032, -12032, -11009, -10239, -10242, -10237, -9986, -9216, -8191, -7169, -5888, -4607, -3073, -1279, -513, +-511, -769, -1279, -1792, -1538, -766, -257, -256, -255, 254, 770, 1279, 1792, 2305, 2559, 2304, +1794, 252, -763, -260, 514, 1024, 767, 768, 2049, 3071, 4097, 4351, 4096, 3841, 4095, 4353, +4095, 3584, 2816, 2049, 2046, 2819, 3580, 4100, 4092, 4100, 4605, 5121, 5633, 6654, 8195, 9213, +8707, 7420, 6148, 4861, 3330, 1535, -256, -1536, -2305, -2046, -1282, -1279, -1280, -1536, -2049, -3326, +-4354, -5887, -7936, -9985, -11263, -11775, -11266, -11007, -10752, -10754, -10747, -9734, -9211, -8707, -7679, -6144, +-4608, -2817, -1278, -769, -768, -1537, -1790, -1538, -1278, -1025, -769, -1022, -513, 0, 512, 1024, +1536, 2816, 2816, 1792, 512, 0, 256, 512, 512, 256, 256, 1280, 2561, 3326, 3842, 4094, +4097, 4097, 4606, 4610, 4094, 3074, 2301, 2307, 2558, 2818, 3070, 3842, 4093, 4355, 4094, 4609, +6145, 7678, 8449, 8704, 8447, 7426, 6398, 5633, 3584, 1280, -257, -1535, -1793, -1535, -1280, -1281, +-1535, -1793, -1792, -2559, -3841, -6143, -8193, -10240, -10752, -10752, -11262, -11267, -11006, -10754, -10238, -9984, +-9473, -8959, -8193, -6399, -4352, -2560, -1537, -1022, -1282, -1790, -1281, -1281, -1278, -1538, -1022, -513, +-768, -1024, 0, 1280, 2305, 2558, 2050, 1022, 514, 767, 512, 0, -257, -254, 254, 1538, +2558, 3329, 3328, 3328, 4096, 4608, 5119, 4354, 3582, 3075, 2812, 2308, 2301, 2818, 3840, 3838, +3843, 3582, 3585, 4864, 6655, 7937, 8192, 8447, 8449, 8191, 7169, 5632, 3327, 1281, -513, -1023, +-1280, -1280, -1537, -1534, -1538, -1022, -1026, -2047, -4352, -6399, -8194, -9470, -10242, -10495, -11007, -11010, +-11006, -10497, -10240, -10240, -9984, -9472, -7936, -6143, -4098, -2814, -2305, -1792, -1280, -1280, -1792, -1536, +-1278, -773, -763, -1284, -1789, -769, 768, 2048, 2304, 1792, 1536, 1024, 1025, 1023, 257, -258, +-766, -258, 771, 2044, 2308, 2301, 2818, 3839, 4608, 4351, 4610, 4350, 3586, 2814, 2561, 2304, +2815, 3586, 3837, 3331, 3070, 3073, 4353, 5117, 6660, 7420, 8195, 8447, 8960, 8703, 7171, 5371, +3077, 1276, 259, -258, -1023, -1537, -2048, -1534, -515, -253, -1027, -2302, -4608, -6145, -7678, -8707, +-9981, -10755, -11005, -10754, -10751, -10240, -10497, -11006, -10755, -9468, -7684, -6141, -4865, -3329, -2302, -1538, +-1534, -2049, -2048, -1024, -767, -1025, -2048, -2047, -1537, 1, 1024, 1791, 1537, 1280, 1535, 1537, +1536, 1023, -510, -1027, -253, 509, 515, 1021, 1794, 2303, 3073, 3839, 4353, 4607, 4864, 4610, +3581, 2563, 2558, 2816, 3586, 3582, 3329, 2816, 2815, 3586, 4606, 5378, 6142, 7169, 7937, 8701, +9476, 8956, 7171, 5118, 3330, 2302, 1025, -512, -1280, -1792, -1536, -512, 0, -256, -1280, -2560, +-4096, -5887, -7426, -8702, -9986, -10750, -10753, -10240, -10240, -11008, -11264, -11263, -10499, -9212, -8195, -6655, +-4607, -3075, -2044, -2563, -2302, -2050, -1022, -769, -1279, -2050, -2302, -2050, -1277, -2, 1024, 1025, +767, 1537, 2304, 1791, 770, 254, -255, -256, -1, 514, 766, 1025, 1791, 2305, 3072, 3328, +4607, 4865, 4608, 3839, 3074, 2557, 3075, 3582, 3585, 3328, 2815, 2817, 3071, 3841, 4352, 5119, +5633, 6910, 8707, 9470, 9472, 8449, 7166, 5379, 4093, 2562, 1023, -512, -1279, -1281, -1024, -255, +255, 1, -1281, -2303, -3585, -5375, -7169, -8959, -9984, -9985, -9727, -9985, -10751, -11265, -11006, -11011, +-10749, -9730, -8192, -5886, -4098, -3327, -3328, -2817, -1791, -1281, -767, -1025, -1791, -2561, -2304, -1024, +-511, -258, 258, 766, 1538, 2046, 2050, 1534, 769, 256, 0, -256, -256, 256, 768, 1025, +1534, 1793, 2817, 4094, 5123, 4861, 4354, 3582, 3330, 3583, 3584, 3841, 3582, 2818, 2559, 3072, +3328, 3584, 3584, 4608, 5633, 7423, 8960, 9473, 8958, 7939, 7165, 5890, 4351, 2561, 767, -511, +-1282, -1021, -515, -253, -259, -509, -1027, -1789, -3331, -5886, -7681, -8704, -8959, -9473, -9727, -10497, +-10496, -10751, -11265, -11775, -11265, -9471, -7425, -6143, -4865, -4352, -3839, -2817, -1278, -771, -1278, -2048, +-2304, -2048, -1792, -1281, -1278, -770, 2, 1279, 1792, 1793, 1533, 1284, 765, 258, -257, -511, +-1, 255, 515, 508, 772, 2045, 3585, 4353, 4862, 4611, 3836, 3331, 3839, 3839, 3586, 3326, +3074, 3070, 3073, 3071, 3073, 2816, 3327, 4610, 6398, 7937, 8447, 9218, 8958, 8707, 7932, 6404, +4349, 2563, 765, -253, -514, -256, -510, -515, 4, 252, -254, -2048, -4097, -5630, -6914, -7679, +-8961, -9727, -9472, -9472, -10241, -11263, -11777, -12031, -11009, -8959, -7169, -6399, -5889, -5120, -3583, -2304, +-1537, -1279, -1793, -2047, -1792, -1792, -1793, -1791, -1281, -511, 256, 1023, 1536, 1794, 2045, 1283, +509, -254, -256, 255, 257, -2, -254, -1, 769, 2303, 3840, 4352, 4096, 3841, 3583, 3840, +4097, 4094, 3586, 3071, 3072, 3585, 3583, 2816, 2560, 2560, 3328, 4865, 6398, 7426, 8446, 8705, +8960, 8959, 8194, 6397, 4099, 2301, 1026, 256, -513, -768, -767, -2, 1027, 253, -1022, -2306, +-3325, -5123, -6654, -7682, -8702, -8962, -9214, -9218, -10495, -12032, -12288, -11520, -9984, -8961, -7935, -7424, +-6400, -4607, -3075, -2301, -2050, -2047, -2047, -1795, -1788, -2052, -2045, -2050, -1279, -512, -1, 770, +1789, 2051, 1533, 771, 510, 1, 256, 511, 1, -512, -513, 1, 1279, 2561, 3583, 3841, +3583, 3584, 4097, 4351, 3841, 3583, 3329, 3583, 3841, 3839, 3073, 2559, 2049, 2559, 3586, 5117, +6147, 7165, 7939, 9214, 9473, 9471, 8193, 6143, 4353, 3327, 1793, 0, -1025, -511, -1, 514, +766, 257, -513, -1791, -3072, -5121, -6911, -7937, -7935, -7937, -8703, -9985, -11519, -12289, -12031, -11008, +-9985, -9727, -8705, -7679, -5889, -4607, -3585, -3071, -2305, -2048, -1791, -2050, -2301, -2307, -2046, -2305, +-1792, -1023, -1, 1280, 1537, 1534, 1027, 253, 258, 767, 512, 1, -513, -1023, -769, 513, +1791, 2817, 3328, 3327, 3841, 4351, 4353, 3840, 3327, 3585, 3583, 4097, 4095, 3585, 2816, 2047, +2306, 2813, 3586, 4865, 5629, 6660, 8444, 9731, 9471, 8703, 7938, 6910, 5121, 3073, 1534, 2, +-258, 2, 510, 514, 510, 514, -2, -1534, -3331, -5373, -6658, -6911, -6656, -7425, -8959, -10497, +-11519, -11521, -11263, -11009, -10495, -10240, -8961, -7423, -6145, -5119, -3840, -2817, -2558, -2051, -2045, -2050, +-2047, -2560, -2560, -2561, -2303, -1024, 512, 1024, 1024, 767, 258, 510, 1026, 766, 514, -514, +-1278, -1282, 1, 768, 1536, 2048, 2815, 3586, 3837, 4099, 3838, 3329, 3328, 3583, 4353, 4096, +3839, 3074, 2045, 2051, 2814, 2817, 3072, 4352, 5887, 7682, 8445, 9220, 9467, 9221, 8444, 7170, +5120, 2814, 1539, 765, 258, -1, 0, 514, 1022, 1024, 1, -2049, -4351, -5376, -5633, -5887, +-6657, -7935, -9473, -10494, -10755, -11006, -11520, -11521, -10750, -9987, -8702, -7937, -6399, -5120, -3842, -3069, +-2563, -2557, -2306, -1535, -2304, -2817, -3071, -3073, -2047, -511, 509, 515, 510, 256, 513, 1023, +1281, 768, -513, -1024, -1024, -511, 0, 511, 1025, 1791, 3073, 3840, 3584, 3839, 3585, 3328, +3583, 4354, 4605, 3843, 3326, 2817, 3072, 2559, 2305, 2304, 3327, 4354, 6141, 7171, 8190, 8961, +9728, 9471, 8449, 6655, 4609, 3072, 1792, 768, -1, -510, 510, 1538, 1790, 1026, -513, -2560, +-4096, -4352, -4608, -5632, -7168, -8193, -9214, -9986, -10751, -11264, -11521, -11263, -10753, -9983, -9216, -7937, +-6398, -5124, -4091, -3589, -2811, -2309, -1788, -1795, -2814, -3329, -3328, -2816, -1279, -257, 257, -2, +3, 509, 1284, 1276, 1026, 0, -769, -766, -514, -766, -258, 257, 1024, 1792, 3328, 4096, +3583, 3074, 3069, 3844, 4092, 4355, 4095, 3839, 3587, 3324, 2820, 2045, 1795, 2301, 3586, 4607, +5632, 6914, 8189, 9475, 10237, 9731, 8189, 6659, 5373, 3843, 2046, 513, -257, 256, 1281, 2560, +1791, 257, -1282, -2301, -2819, -3582, -4609, -5633, -6909, -7685, -8955, -9731, -10751, -11008, -11264, -11265, +-11006, -10242, -9214, -7425, -6401, -5885, -4612, -3836, -2563, -1791, -1792, -2304, -3072, -3840, -3072, -2049, +-1278, -514, -510, -770, 258, 1022, 1282, 1023, 768, 1, -514, -766, -769, -768, -767, -258, +1282, 2815, 3072, 3072, 3072, 3072, 3584, 4097, 3838, 4099, 4092, 4356, 4093, 3074, 2303, 1792, +2048, 2817, 3326, 4098, 5119, 6912, 8704, 9472, 9729, 9214, 8451, 7420, 6148, 3837, 1538, -1, +512, 1281, 2047, 1793, 1023, -256, -1023, -1793, -2558, -3586, -4352, -5374, -6402, -7679, -8703, -9987, +-10236, -11011, -11519, -11776, -11264, -10241, -9214, -8195, -6908, -6148, -5117, -3330, -2303, -2048, -2303, -3074, +-3838, -3330, -2303, -1790, -1540, -1276, -1027, -254, 255, 1024, 1280, 769, 255, 257, -1, -512, +-1279, -1537, -767, 511, 1793, 2303, 2305, 2560, 3071, 3329, 3840, 3583, 3842, 4350, 4609, 4609, +3581, 2819, 2559, 2559, 2306, 2302, 2817, 3841, 5630, 7425, 8448, 9216, 9216, 9472, 9472, 7679, +5635, 3069, 1281, 1024, 1535, 2051, 2045, 1794, 1022, 257, -767, -1794, -2558, -3074, -4094, -5121, +-6656, -7424, -8192, -9216, -10240, -11008, -11520, -11776, -10752, -9984, -9215, -8450, -7677, -6403, -4861, -2818, +-2048, -2302, -3075, -3580, -3332, -3070, -2561, -2047, -2048, -1792, -769, 256, 769, 511, 770, 509, +770, 767, 0, -1023, -1537, -1023, -1, 769, 1279, 1793, 2303, 2817, 3328, 3326, 2819, 3582, +4352, 4610, 4604, 4100, 3582, 3072, 2817, 2303, 1793, 1536, 2559, 4352, 5890, 7166, 7937, 8704, +9982, 10500, 9724, 7426, 4864, 2815, 1793, 1791, 1792, 2049, 1791, 2049, 1023, 257, -769, -1280, +-2047, -3073, -4094, -5123, -6398, -6913, -7935, -9473, -10495, -11521, -11775, -11521, -10752, -9983, -9985, -9471, +-8193, -6143, -4097, -3326, -2819, -3069, -3843, -3581, -3074, -3070, -3075, -2557, -2563, -1789, -771, -253, +-2, 257, 255, 1025, 767, -254, -1026, -1535, -1536, -768, -256, 0, 768, 1792, 2561, 2815, +2304, 2561, 3327, 4097, 4608, 4607, 4097, 3840, 4096, 3583, 2818, 1789, 1284, 2044, 3331, 4606, +5377, 6400, 7936, 9472, 10752, 10495, 8963, 6908, 4868, 3581, 2305, 1792, 2049, 2046, 2051, 1532, +772, -3, -510, -1025, -1791, -3074, -3837, -4867, -5630, -6657, -7680, -9215, -10498, -11517, -11012, -10747, +-10501, -10493, -10496, -9474, -7677, -5379, -4094, -3329, -3327, -3329, -3072, -3071, -2818, -3069, -3330, -3072, +-2048, -1279, -1026, -509, -259, 514, 1278, 1282, 255, -512, -767, -770, -766, -1025, -511, 255, +1281, 2046, 2307, 2045, 2307, 2813, 3843, 4093, 4355, 4093, 4355, 4861, 4611, 3326, 2049, 1535, +1793, 2558, 3331, 3837, 4354, 6399, 8447, 10243, 10748, 10500, 8957, 6914, 5119, 3840, 2560, 2561, +2814, 2563, 2044, 1540, 1277, 769, 0, -768, -1536, -2559, -3843, -4092, -4868, -6397, -7937, -9473, +-10494, -10498, -10495, -10752, -11009, -11518, -10754, -9215, -7168, -5376, -4353, -4094, -3842, -3327, -3072, -3073, +-3327, -3585, -3326, -2563, -1789, -1794, -2047, -1025, 1, 1023, 1025, 513, 252, -252, -770, -1024, +-1533, -1285, -507, 764, 1283, 1790, 1282, 1790, 2561, 3584, 3327, 3585, 4096, 4607, 5122, 4860, +3845, 2811, 2053, 2044, 2562, 2047, 2561, 3070, 4354, 6655, 8704, 9984, 10753, 10237, 8708, 6908, +4867, 3839, 3584, 3072, 2560, 2559, 2050, 1534, 1282, 1023, 0, -768, -2048, -2560, -3071, -3585, +-4864, -6399, -8193, -9216, -9726, -9988, -10491, -11013, -11772, -12035, -10493, -8963, -7166, -6146, -5117, -4611, +-3581, -3075, -3326, -3841, -3839, -3329, -2558, -2564, -2810, -2310, -1788, -514, 257, 512, 257, 765, +260, -260, -1021, -1793, -1792, -768, 1, 509, 516, 765, 1538, 2047, 2559, 2818, 2815, 3328, +4353, 5374, 5121, 4352, 3584, 2816, 2816, 2560, 2047, 1794, 2045, 3075, 4606, 6657, 8704, 10495, +10754, 9725, 8451, 6909, 5123, 4349, 3843, 3325, 2819, 2301, 2307, 2301, 1795, 1022, 2, -1026, +-1535, -1536, -2048, -3328, -4864, -6657, -7935, -8448, -8962, -9725, -10755, -11774, -12033, -11264, -9983, -8705, +-7424, -6655, -5122, -3581, -3587, -3582, -3584, -3586, -3069, -2564, -3068, -3331, -2814, -2305, -1536, -512, +-255, 254, 771, 1020, 516, -515, -1534, -1281, -1024, -256, 1, 254, 258, 1278, 2050, 2047, +2304, 2304, 3072, 4095, 5122, 5118, 4611, 4092, 3843, 3582, 3073, 2049, 2045, 1539, 1790, 2817, +4864, 6911, 9217, 10495, 10498, 9726, 8194, 6910, 5889, 4864, 4095, 3330, 2559, 2560, 2815, 2561, +1536, 768, -255, -770, -511, -1024, -2049, -3838, -5378, -6654, -7170, -7935, -8704, -9729, -11518, -12034, +-11519, -11264, -10496, -9473, -8190, -6147, -4605, -4354, -4351, -4096, -3584, -3329, -3071, -3585, -3582, -3330, +-2559, -2049, -1791, -1281, -254, 509, 1026, 768, -258, -1276, -1285, -1019, -773, -1019, -772, -254, +512, 1535, 1538, 1278, 1281, 2303, 3841, 4352, 4352, 4607, 4610, 4349, 4099, 3583, 3070, 2307, +1534, 1025, 1536, 2559, 4865, 7167, 9217, 9983, 9986, 8957, 7939, 7421, 6147, 4861, 3843, 3069, +2819, 3326, 3072, 2305, 1279, 1, -1, 257, -256, -770, -2300, -4100, -5373, -5890, -6399, -7424, +-8960, -10495, -11010, -11263, -11776, -11521, -10750, -9218, -7423, -5888, -5377, -5118, -4611, -3837, -3330, -3327, +-3840, -3841, -3327, -3072, -2817, -2558, -2307, -1277, 254, 769, 512, -513, -766, -770, -1023, -1280, +-1281, -1535, -767, 253, 1283, 766, 768, 1026, 1789, 2563, 3581, 4098, 4864, 4606, 4611, 4605, +4355, 4094, 3585, 2303, 1281, 1024, 1280, 2815, 5378, 7422, 8962, 9470, 9473, 9215, 8451, 7420, +6148, 4604, 3586, 3841, 3582, 3586, 2815, 1791, 770, 254, 770, 766, 2, -1281, -3073, -3838, +-4354, -4863, -6400, -7680, -8705, -9470, -10243, -11261, -12035, -11517, -10242, -8447, -7169, -6655, -5632, -4864, +-4351, -3586, -3582, -3842, -3837, -3331, -3069, -3332, -3580, -3331, -2046, -769, 0, 257, -257, -768, +-512, -511, -1537, -2047, -2049, -1023, -258, 259, 252, 261, 508, 1027, 1789, 2563, 3582, 4352, +4354, 4605, 4867, 4862, 4865, 4351, 3329, 2046, 771, 765, 1539, 3325, 5378, 7423, 8704, 9217, +9727, 9473, 8703, 7169, 5887, 4610, 4349, 4100, 4348, 3587, 2559, 1279, 770, 1279, 1280, 513, +-770, -1790, -2305, -2816, -3839, -5122, -6397, -7428, -7932, -9220, -10748, -11779, -11518, -11009, -9984, -8960, +-7935, -6914, -5629, -4612, -4092, -4099, -4095, -3583, -3331, -3324, -3587, -4095, -3839, -2818, -1534, -1025, +-768, -768, -255, -2, -766, -1281, -2048, -2048, -1535, -770, -253, -3, 258, -1, 257, 1023, +2049, 2559, 3329, 3839, 4097, 4351, 4609, 5119, 5121, 4351, 3072, 1537, 256, 767, 1793, 3583, +5120, 6914, 8190, 9218, 9725, 9218, 8448, 6911, 5378, 4861, 5122, 4864, 4351, 3073, 2048, 1791, +1793, 1535, 1026, 253, -765, -1027, -1533, -3074, -4351, -4865, -5375, -6144, -7937, -9727, -11009, -11518, +-11266, -10495, -9985, -9215, -7937, -6654, -5635, -4861, -4610, -4608, -3838, -3075, -3069, -3843, -4349, -3843, +-3325, -2307, -2045, -1539, -1021, -514, 0, -511, -1281, -1792, -2046, -2051, -1278, -768, -258, -254, +-1, 1, 255, 1025, 2046, 2819, 3326, 3584, 4097, 4607, 5377, 5887, 5632, 4353, 2815, 1281, +1023, 1536, 2305, 3583, 5121, 6655, 8193, 9727, 9985, 9215, 7680, 6402, 6141, 6146, 5631, 5120, +3841, 2816, 2558, 2563, 2044, 1284, 765, 515, -3, -1022, -2050, -3071, -3583, -4098, -4862, -6402, +-8447, -9472, -10241, -10751, -11008, -11009, -10238, -8963, -7420, -6404, -6141, -5634, -5119, -3839, -3074, -3326, +-3842, -4351, -4095, -3586, -3326, -3330, -2815, -1792, -1023, -514, -510, -1027, -1788, -2308, -2044, -1796, +-1533, -1026, -510, -769, -512, -257, 257, 1024, 1793, 2559, 2815, 3074, 3582, 4866, 6143, 5888, +5376, 4097, 2559, 1537, 1024, 1534, 2051, 3070, 4352, 6658, 8701, 9731, 9214, 8192, 6913, 6655, +6657, 6143, 5121, 4351, 3585, 3583, 2817, 2047, 1537, 1279, 1025, 767, -254, -1539, -2302, -2560, +-2817, -3582, -4866, -6400, -7934, -8962, -9982, -10754, -11518, -11266, -9727, -8448, -7680, -7167, -6659, -5628, +-4357, -3579, -3843, -4095, -3840, -3840, -3840, -3841, -3838, -3330, -2814, -1537, -1025, -766, -1026, -1534, +-2050, -2302, -2050, -1789, -1284, -1021, -1025, -1025, -765, -772, 260, 1277, 1794, 1790, 2050, 2815, +4096, 5120, 5889, 5886, 4866, 3582, 2562, 2047, 1280, 1280, 1536, 2817, 5119, 7424, 8960, 8960, +8194, 7932, 7940, 7421, 6657, 5890, 5116, 4612, 4349, 3585, 2561, 2045, 2052, 1789, 1538, 510, +-767, -1280, -1536, -1791, -2050, -3327, -5119, -5891, -7163, -8710, -9980, -11266, -11007, -10240, -9216, -8706, +-8189, -7171, -6141, -5122, -4607, -4097, -4095, -3841, -3839, -3840, -4097, -4094, -3843, -3325, -2563, -1533, +-1027, -765, -1538, -2048, -2303, -2050, -2045, -1539, -1021, -1027, -1278, -1536, -1026, 3, 766, 1024, +1282, 1533, 2051, 3070, 4608, 5633, 6144, 5632, 4864, 4095, 3329, 2304, 1536, 512, 1280, 3584, +5888, 7167, 8194, 8191, 8191, 8451, 7931, 7173, 6397, 5889, 5633, 5117, 4099, 3070, 3073, 2560, +2560, 2303, 1026, -3, -509, -770, -1023, -1537, -2815, -3585, -4095, -5121, -7167, -9217, -10495, -10753, +-10240, -9983, -9728, -9217, -8448, -7167, -6145, -5375, -4864, -4354, -3837, -3843, -3837, -4354, -4350, -4355, +-4093, -3330, -2304, -1789, -1541, -1532, -1795, -2302, -2561, -2559, -1794, -1535, -1536, -2048, -1792, -1792, +-1024, -1, 259, 508, 515, 766, 2049, 3072, 4609, 5630, 5377, 5376, 5376, 4864, 3329, 1533, +516, 508, 2307, 4095, 5631, 6914, 7422, 8449, 8704, 7936, 7424, 7169, 6910, 6401, 5889, 4606, +3842, 3583, 3327, 3074, 2559, 1536, 513, 254, 258, -513, -1279, -2049, -2048, -2303, -3586, -5372, +-7429, -8956, -9731, -9982, -10241, -10495, -9729, -8959, -7937, -7168, -6399, -5633, -4863, -4609, -3840, -3839, +-3841, -4351, -4609, -4351, -4098, -3324, -2821, -1788, -1539, -1790, -2305, -2816, -2560, -2049, -1790, -1538, +-2047, -2304, -2049, -1279, -513, 1, 256, -1, 1, 1279, 2561, 3584, 4351, 4866, 5629, 6147, +6142, 4610, 2558, 1026, 765, 1796, 2556, 3587, 5375, 6655, 7682, 8189, 7939, 7678, 7426, 7677, +7172, 6395, 5381, 4604, 3843, 4094, 3841, 3072, 2047, 1537, 1535, 1025, -1, -767, -1281, -1023, +-1281, -2047, -3841, -5375, -7169, -7935, -9217, -9982, -10243, -9725, -9474, -8959, -7936, -7425, -6398, -5890, +-5118, -4098, -3583, -3841, -4094, -4355, -4348, -4612, -4094, -3328, -2305, -2047, -2048, -2305, -3071, -2816, +-2305, -1791, -2048, -2049, -2559, -2561, -2047, -768, -513, -511, -769, -511, 512, 1535, 2305, 3071, +3585, 5120, 6656, 6655, 5633, 4095, 2562, 1534, 1282, 1533, 2308, 3837, 5634, 6910, 7425, 7680, +7680, 7681, 7933, 7939, 7422, 6145, 5120, 5119, 4865, 4352, 3584, 2816, 2559, 2305, 1536, 512, +-255, -514, -255, -256, -1536, -2303, -3585, -4864, -6655, -8193, -8959, -9473, -9984, -9726, -9219, -8446, +-8193, -7679, -6656, -5633, -4864, -4351, -3841, -3839, -4353, -4607, -4865, -4607, -3842, -2558, -2049, -2304, +-2559, -2818, -3070, -2818, -2045, -2051, -2302, -2818, -2814, -2049, -1279, -769, -1024, -1279, -1025, 256, +769, 1022, 1539, 2557, 4099, 5885, 6657, 6146, 5116, 4100, 2813, 2050, 1280, 1791, 2817, 4351, +5889, 6911, 6913, 7167, 7681, 8191, 8193, 7423, 6400, 6145, 5886, 5378, 4863, 3840, 3586, 3325, +3075, 2045, 1027, 254, 1, 0, -257, -510, -1027, -2044, -3589, -4859, -6149, -7676, -8963, -9725, +-9730, -9216, -9216, -8704, -8191, -7681, -6912, -5631, -4866, -4349, -3844, -3837, -4609, -5120, -4863, -4355, +-3325, -2818, -2303, -2560, -3072, -3329, -2558, -2306, -2047, -2304, -3073, -3070, -2050, -1535, -1280, -1793, +-1535, -1280, -257, 1, 0, 254, 1284, 2812, 4610, 5632, 6399, 6145, 5376, 4095, 2817, 1791, +1024, 1793, 3327, 4609, 5375, 5889, 6398, 7426, 7935, 8193, 7680, 7166, 6914, 6655, 6145, 5119, +4608, 4352, 4352, 3585, 2815, 1792, 1281, 510, 3, 253, 259, -258, -1024, -2046, -3075, -4604, +-6148, -7677, -8706, -9214, -9218, -9214, -9217, -8704, -8191, -7682, -6909, -5635, -4605, -3587, -4094, -4353, +-4863, -5122, -4862, -3842, -3071, -2815, -2818, -3583, -3585, -2815, -2560, -2304, -2816, -3329, -3071, -2560, +-2049, -2302, -2306, -2047, -1024, -513, -766, -770, -255, 256, 1536, 3328, 4608, 5632, 6400, 6400, +5633, 3838, 2051, 1532, 1796, 2813, 3587, 4093, 4611, 5628, 7173, 7419, 7684, 7422, 7424, 7682, +7421, 6147, 5629, 5379, 5118, 4610, 4349, 3843, 2814, 1537, 1024, 767, 513, 0, 255, 1, +-768, -1281, -2814, -4611, -6142, -7168, -8193, -8959, -9216, -8961, -8959, -8961, -8448, -7422, -6659, -5373, +-4355, -3838, -4097, -4352, -5120, -4864, -4095, -3330, -3069, -3333, -3834, -3589, -2812, -2563, -2559, -3328, +-3584, -3071, -2562, -2559, -2816, -2561, -2301, -1540, -1021, -770, -1279, -1024, -768, 511, 1538, 2814, +4354, 6142, 6913, 6656, 5376, 3328, 2304, 2303, 2562, 2814, 3073, 3840, 5119, 6146, 6654, 6914, +7421, 7683, 7933, 7171, 6910, 6401, 5631, 5377, 5631, 5121, 4351, 3586, 2814, 1794, 1278, 1026, +510, 514, 510, 514, -257, -1535, -2818, -4095, -5888, -7168, -7679, -8449, -8449, -8703, -8959, -8962, +-8446, -7682, -6399, -5120, -4096, -3840, -4609, -5118, -5122, -4095, -3583, -3586, -3839, -4095, -3587, -2556, +-2819, -3070, -3586, -3583, -3329, -3070, -3073, -3072, -3329, -2814, -2051, -1276, -1539, -1534, -1538, -1533, +-773, 6, 763, 2819, 5119, 6656, 6912, 5888, 4352, 3584, 3329, 2814, 2050, 2302, 3330, 4351, +4864, 5632, 6400, 6912, 7425, 7678, 7682, 7166, 6658, 6143, 5888, 5632, 5632, 5120, 4352, 3328, +2816, 1791, 1026, 510, 769, 513, 765, 516, -260, -1277, -2562, -4094, -5634, -6654, -7426, -7935, +-8447, -8962, -8958, -9218, -8446, -7426, -5885, -4868, -4348, -4867, -5631, -5119, -4098, -3837, -4356, -4349, +-4098, -3582, -3329, -3328, -3328, -3585, -3837, -3332, -3068, -3587, -3326, -3585, -3328, -2560, -2047, -2050, +-1789, -1796, -1532, -1539, -1535, -1023, 1022, 3587, 5372, 6147, 5887, 5632, 5121, 4094, 3074, 2558, +2562, 2815, 3584, 4352, 4864, 5376, 6401, 6910, 7682, 7678, 7682, 6911, 6400, 6400, 6401, 5885, +5636, 5117, 4610, 3839, 2816, 1793, 1022, 771, 1020, 772, 1022, 768, 0, -1024, -2560, -3839, +-5122, -6397, -6916, -7420, -8195, -8702, -9217, -9471, -8449, -6656, -5119, -5122, -5373, -5378, -4608, -4350, +-4099, -4093, -4355, -4349, -3586, -3326, -3330, -3583, -3841, -3839, -3328, -3329, -3582, -3842, -3583, -3584, +-2817, -2559, -2304, -2048, -1537, -1279, -1793, -2560, -2302, -260, 1796, 3325, 4866, 5632, 5886, 5379, +4862, 3584, 2818, 2557, 2819, 3070, 3329, 4096, 4607, 5377, 6399, 7425, 7680, 7423, 7426, 6909, +6659, 6398, 6401, 6144, 5887, 5377, 4608, 3840, 2815, 1793, 1279, 770, 766, 1281, 1023, 1025, +256, -1281, -2303, -3585, -4863, -5889, -6399, -6913, -7935, -9472, -9729, -8703, -7681, -6655, -5889, -5887, +-5633, -4863, -4609, -4352, -4351, -4354, -4349, -3843, -3582, -3585, -3840, -3839, -3586, -3581, -3588, -3836, +-4099, -3839, -3583, -3330, -3582, -3329, -2048, -1280, -1535, -2306, -2814, -2817, -1792, -255, 1534, 3074, +4607, 5889, 5886, 5379, 4604, 3844, 3070, 2817, 3071, 3073, 3070, 3586, 4608, 5375, 6400, 6657, +6910, 7171, 7165, 6914, 6655, 6400, 6401, 6398, 5891, 5372, 4612, 3581, 2562, 1790, 1027, 764, +1284, 1276, 1284, 1021, 258, -770, -2558, -3842, -4350, -4866, -5887, -7168, -8704, -9472, -8961, -7934, +-7427, -6908, -6404, -5885, -5122, -4862, -4866, -4606, -4866, -4095, -3840, -3584, -3840, -3839, -3842, -3583, +-3072, -3585, -4349, -4100, -3580, -3844, -4349, -4353, -3841, -2558, -1794, -1790, -2049, -3073, -3070, -2818, +-2046, -769, 1536, 3073, 4607, 5632, 5888, 5120, 4353, 3583, 3328, 3329, 3069, 2820, 3068, 3844, +4604, 5635, 6143, 6911, 7170, 6910, 6913, 6657, 6398, 6402, 6398, 6402, 5886, 5633, 4865, 3581, +2308, 1787, 1540, 1278, 1025, 1535, 1793, 1279, 0, -1535, -2818, -2813, -3330, -4608, -6399, -7938, +-8701, -8706, -8191, -8193, -7679, -7170, -6397, -5379, -5117, -5123, -5118, -5121, -4608, -3583, -3586, -4350, +-4097, -3584, -3327, -3842, -4094, -4098, -3582, -3586, -3838, -4610, -4862, -4353, -3072, -2560, -2048, -2049, +-2557, -3331, -3326, -3074, -2047, -512, 1280, 3073, 4605, 5379, 5118, 4865, 4352, 4352, 3839, 3329, +3071, 3074, 3326, 3841, 4863, 5633, 6144, 6656, 6911, 6657, 6399, 6657, 6400, 6398, 6404, 6907, +6660, 5630, 4608, 3841, 2559, 1792, 1026, 1020, 1796, 2301, 2050, 767, -256, -1280, -1279, -2049, +-3072, -4863, -6658, -7421, -7938, -8191, -8449, -7936, -7679, -7169, -5887, -5121, -5632, -5631, -5122, -4350, +-4097, -4352, -4095, -4097, -3584, -3839, -3842, -4350, -4096, -3330, -3581, -4355, -4862, -5121, -4864, -3839, +-3073, -2303, -2050, -2301, -2819, -3326, -3585, -3072, -2303, -770, 1538, 3326, 4098, 4863, 4864, 4864, +4352, 4352, 3585, 3070, 2818, 3071, 3329, 3838, 4866, 5886, 6147, 6141, 6658, 6910, 6402, 6399, +6400, 6400, 6913, 6655, 6400, 5888, 5121, 3838, 2564, 1019, 1284, 1789, 2307, 2301, 1539, 509, +-254, -1, -767, -2049, -3071, -4866, -6141, -6915, -7421, -8195, -8702, -8449, -7168, -6399, -6402, -6142, +-5633, -5120, -4607, -4354, -4606, -4353, -3583, -3585, -3840, -4351, -4354, -3837, -3330, -3584, -4095, -4609, +-5120, -5118, -4868, -4091, -3076, -2558, -2560, -2562, -3069, -3843, -4349, -3586, -2303, -513, 1281, 2815, +3841, 4352, 4863, 4865, 4351, 4097, 3840, 3583, 2817, 3071, 3585, 4096, 4863, 5378, 5885, 6660, +6652, 6403, 6142, 6401, 6656, 6656, 6655, 6913, 6912, 6144, 4864, 3327, 1793, 1536, 2304, 2561, +2302, 1794, 1277, 772, 253, 259, -772, -2045, -3586, -4349, -5123, -6654, -7682, -8190, -7938, -7421, +-6916, -6909, -6658, -5887, -5376, -5120, -5121, -4863, -4353, -3838, -3586, -4095, -4353, -4350, -3842, -3582, +-3586, -3838, -4354, -5373, -5636, -5116, -4866, -4352, -3327, -2562, -2557, -2819, -3582, -4097, -4353, -3581, +-2051, -766, 767, 2559, 3842, 4351, 4609, 4863, 4608, 4352, 3840, 3329, 3326, 3330, 3582, 3842, +4863, 5888, 6401, 6142, 6146, 6399, 6401, 6399, 6145, 6399, 6657, 7679, 7169, 5887, 4096, 3074, +2557, 2563, 2557, 2562, 2047, 1025, 1279, 1537, 767, 0, -768, -2047, -2562, -3581, -5379, -6910, +-7681, -7679, -7426, -7677, -7426, -6656, -6142, -5636, -5627, -5635, -5120, -4095, -3585, -3839, -4096, -4097, +-4607, -4353, -3583, -3328, -3586, -4092, -4357, -5115, -5636, -5374, -4864, -4097, -3070, -2051, -2558, -3584, +-4098, -4349, -4355, -3326, -2305, -768, 769, 2046, 3074, 4095, 4608, 4865, 4350, 4097, 3840, 3584, +3329, 3070, 3586, 4350, 5122, 5631, 5632, 5889, 6399, 6657, 6143, 5376, 6146, 7165, 7938, 7679, +6912, 5378, 3837, 3073, 3328, 2816, 2561, 2047, 1792, 1792, 2049, 1279, 768, -255, -257, -1023, +-2305, -4096, -5375, -6401, -6911, -7169, -7680, -7679, -6913, -6400, -6398, -6147, -5886, -5633, -4863, -4353, +-3583, -3842, -4350, -4097, -4096, -4095, -3586, -3326, -3842, -4606, -4610, -5373, -5892, -5627, -4613, -3581, +-2817, -2561, -3070, -3585, -4353, -4607, -4352, -3329, -2046, -770, 256, 1794, 3325, 4100, 4348, 4611, +4606, 4352, 4098, 3325, 2819, 3070, 4097, 4607, 4864, 5121, 6143, 6401, 6143, 5632, 5633, 5375, +6657, 7680, 8191, 7682, 6141, 4867, 4094, 3841, 3328, 2559, 2049, 2047, 2304, 2305, 1535, 1281, +767, 768, 257, -1025, -2559, -3841, -4607, -5889, -6912, -7423, -7170, -7165, -6659, -6399, -6144, -6400, +-5889, -5117, -4612, -4093, -3842, -4351, -4607, -4354, -3839, -3583, -3587, -3324, -3588, -4094, -5119, -5890, +-5887, -5377, -4608, -3838, -2819, -2813, -3331, -4093, -4867, -4605, -4354, -3840, -2558, -1027, 260, 2044, +3075, 3581, 4099, 4606, 5121, 4095, 3328, 3585, 3839, 3584, 3840, 4352, 4864, 5633, 6398, 6146, +5630, 5121, 5121, 6142, 7171, 8188, 7940, 6909, 6146, 5631, 4864, 3842, 3069, 2562, 2558, 2563, +2301, 1539, 1277, 1537, 1537, 511, 0, -767, -2050, -3325, -4355, -5630, -6658, -6910, -6657, -6399, +-6657, -6400, -6655, -6401, -5887, -4865, -4351, -4353, -4351, -4353, -4352, -4094, -4100, -3580, -3331, -3070, +-3584, -4609, -5632, -5887, -6145, -5631, -4353, -3583, -3073, -3070, -3587, -4350, -4865, -4863, -4609, -4095, +-2817, -768, 513, 1279, 2817, 4095, 4609, 4351, 4609, 4095, 4097, 3839, 3841, 3583, 3584, 4353, +5375, 6145, 6399, 5888, 4865, 4863, 5633, 6911, 7168, 7681, 7422, 6915, 6653, 5890, 4351, 3328, +3584, 3329, 2815, 2305, 2047, 1792, 1793, 1791, 1537, 768, -1, -510, -1795, -3325, -4610, -5630, +-6402, -6398, -6147, -6141, -6658, -6654, -6658, -5887, -5376, -4865, -4350, -4098, -3839, -4096, -4353, -4351, +-3584, -3329, -3327, -3329, -3583, -5121, -5887, -6144, -6145, -5374, -4099, -3581, -3330, -3838, -3587, -4093, +-4866, -5119, -4352, -3585, -2815, -1536, -256, 1280, 2815, 3842, 4094, 4099, 4349, 4354, 4094, 3842, +3583, 3329, 3583, 5120, 6144, 6145, 5630, 4867, 4604, 5124, 6397, 6402, 6910, 7427, 7932, 7429, +6139, 5124, 4861, 4099, 3581, 3331, 2557, 2051, 2045, 2307, 1789, 1539, 1533, 1027, 509, -253, +-1539, -3070, -4608, -5377, -5631, -5888, -6145, -6654, -6914, -6654, -6146, -5886, -5634, -4862, -4098, -4350, +-4098, -4351, -4608, -4352, -3584, -3072, -3072, -3329, -4094, -5378, -6397, -6403, -5630, -5377, -4608, -3840, +-3328, -3583, -4097, -4863, -5122, -5119, -4351, -4098, -3069, -2051, -254, 1279, 2560, 3329, 3839, 4096, +4609, 4863, 4097, 3327, 3073, 3327, 4609, 5887, 6145, 5376, 4863, 4865, 5118, 5123, 5373, 6403, +7165, 7427, 7677, 6915, 5885, 5635, 5118, 4098, 3581, 3075, 2813, 2308, 2300, 2051, 1789, 1539, +1790, 1537, 1023, -255, -1793, -3583, -4352, -4610, -5372, -6149, -6395, -6405, -6907, -6916, -6397, -5890, +-5376, -4607, -4353, -4352, -4607, -4354, -4350, -4354, -3582, -2562, -2815, -3841, -4863, -5632, -6144, -6401, +-6143, -5633, -4606, -3842, -3583, -4096, -4608, -4864, -4864, -5376, -4864, -4352, -3584, -2048, -256, 1024, +1792, 3072, 3584, 4352, 4863, 4610, 3326, 2562, 3326, 4610, 5373, 5380, 5628, 5380, 5116, 5123, +4862, 4866, 5631, 6655, 7426, 7166, 7170, 6911, 6144, 5632, 5120, 4353, 3583, 3328, 2816, 2560, +2305, 2046, 1794, 1790, 2306, 2046, 514, -514, -1534, -2818, -3838, -4354, -4606, -5378, -5886, -6145, +-6656, -7167, -6146, -5373, -5124, -4604, -4099, -4094, -4609, -4864, -4351, -3586, -2814, -2818, -3070, -4097, +-4864, -5376, -6400, -6655, -5890, -5118, -4610, -4094, -4098, -4350, -4610, -4605, -5380, -5373, -5378, -4606, +-3586, -2045, -260, 516, 1020, 2564, 4348, 4868, 4093, 3586, 3071, 3072, 3840, 4609, 4862, 5379, +5629, 5379, 4605, 4354, 4607, 5121, 5888, 6655, 7169, 7167, 7170, 6910, 6146, 5630, 5122, 4350, +3586, 3582, 3074, 2302, 1795, 1788, 2051, 2047, 2047, 1538, 510, -766, -1538, -2558, -3587, -4093, +-4353, -5120, -6144, -6400, -6401, -6397, -6404, -5628, -4867, -4606, -4354, -4862, -5122, -4607, -3839, -3330, +-3071, -2815, -2818, -4095, -5119, -6146, -6654, -6657, -5632, -5119, -4865, -4352, -4095, -4353, -4863, -4865, +-5375, -6145, -5375, -4098, -3070, -2305, -1792, -255, 1278, 3330, 4095, 3841, 3326, 3075, 3325, 3587, +3838, 4608, 5376, 5633, 5376, 5118, 4355, 4348, 4868, 5118, 5632, 6656, 7169, 7166, 7171, 6908, +6404, 5373, 4866, 4607, 4096, 3329, 2815, 2304, 2049, 2303, 2561, 2303, 2048, 1793, 1023, -255, +-1538, -2046, -2817, -3583, -4354, -4861, -5892, -6395, -6661, -6907, -6149, -4859, -4357, -4603, -4612, -4860, +-4869, -4347, -3588, -3069, -2817, -2305, -3070, -4354, -5631, -5887, -6402, -6398, -5889, -5120, -5120, -4864, +-4096, -3839, -4610, -5630, -6146, -5630, -4866, -4351, -3839, -3330, -1790, 254, 2049, 2817, 3582, 3586, +3327, 3328, 3328, 3584, 4097, 5119, 5633, 5375, 5376, 4864, 4352, 4097, 4863, 5376, 5632, 6144, +6912, 7168, 6912, 6656, 6145, 5374, 5122, 4862, 4354, 3327, 2815, 2563, 2300, 2308, 2556, 2563, +2302, 1538, 766, -254, -1026, -1790, -2563, -3580, -3844, -4348, -5891, -6655, -6656, -6400, -5632, -4863, +-4866, -5118, -5121, -4864, -5119, -4610, -3582, -2561, -2560, -2816, -3329, -4350, -5633, -5888, -5888, -6145, +-6142, -5889, -5120, -4096, -4097, -4350, -5890, -6142, -5635, -5117, -5379, -5117, -4354, -3327, -1793, 257, +1791, 2562, 3326, 3585, 2815, 2817, 3328, 3840, 4352, 5376, 5888, 5376, 4864, 4864, 4609, 4607, +4608, 5120, 5632, 6400, 7169, 7422, 6657, 6400, 6399, 5889, 5376, 4863, 4098, 3325, 2562, 2560, +2303, 2562, 2813, 2563, 1790, 1793, 1279, 0, -1023, -1537, -2047, -2817, -3584, -4863, -6146, -6397, +-6147, -5630, -5377, -5120, -4352, -4863, -5122, -5118, -4610, -4351, -3584, -2560, -2304, -2816, -3840, -4609, +-5118, -5634, -6142, -6657, -6401, -5374, -4354, -4350, -4866, -5375, -5632, -5377, -5118, -5378, -5888, -5374, +-4356, -3323, -1796, 258, 1792, 2558, 2819, 3069, 2819, 2558, 3073, 4095, 4610, 5118, 5633, 5376, +4864, 4864, 4609, 4350, 4354, 5119, 5888, 6400, 6657, 6911, 6656, 6657, 6654, 6147, 5373, 5378, +4351, 3072, 2817, 2814, 2818, 2559, 2816, 2561, 2302, 1795, 764, 4, -1026, -768, -1534, -2564, +-4092, -4610, -5631, -6145, -6144, -5376, -5119, -4865, -4864, -4863, -5378, -5373, -4868, -4093, -3074, -2301, +-2563, -3326, -3586, -4095, -5120, -6399, -6658, -6653, -5891, -4862, -4608, -5122, -5373, -5123, -5118, -5633, +-5888, -5631, -6145, -5888, -4864, -3072, -1791, -1, 1537, 2302, 2307, 2301, 2307, 2558, 3328, 4097, +4864, 5119, 5377, 5631, 5121, 4608, 4095, 4096, 4609, 5375, 5889, 5888, 6654, 6916, 6395, 6405, +6652, 6403, 5630, 4865, 4096, 3328, 2559, 2818, 2558, 2561, 2816, 3072, 2304, 1024, 512, 255, +-253, -516, -1277, -2305, -3841, -4862, -5634, -5887, -5887, -5379, -5116, -4868, -4861, -5377, -5888, -5632, +-4096, -3328, -3071, -2818, -2813, -2820, -3068, -4099, -5886, -6914, -6654, -5890, -5630, -5633, -5120, -5121, +-5374, -5378, -4862, -5633, -5889, -6142, -6402, -5887, -5119, -3330, -1790, -2, 1281, 1792, 1793, 1790, +2306, 2814, 3330, 4095, 4608, 5121, 5886, 5634, 4607, 4097, 4095, 4097, 4350, 5378, 5888, 6143, +6144, 6400, 6657, 6655, 6914, 6397, 5378, 4607, 4353, 3584, 2816, 2560, 3071, 3330, 3070, 2817, +2305, 1278, 1026, 510, 257, -512, -1280, -2304, -3585, -4606, -5122, -5888, -5630, -4611, -4349, -4866, +-5376, -5631, -5377, -4864, -3839, -3841, -3584, -2814, -1796, -2300, -3586, -4863, -5632, -6400, -6146, -5629, +-5378, -5631, -5375, -5379, -5374, -5377, -5120, -5630, -6147, -6397, -6403, -6397, -5123, -3325, -1539, -253, +766, 1280, 1282, 2045, 2563, 2814, 3072, 4354, 5118, 5633, 5632, 5631, 4866, 4350, 4353, 4352, +4863, 5377, 5888, 5887, 5890, 6653, 7171, 6653, 6404, 6396, 5891, 5117, 3844, 3324, 2820, 3068, +3331, 3326, 3074, 2559, 2047, 1282, 1022, 1025, 513, -258, -767, -1791, -3330, -4606, -5122, -5119, +-4607, -4353, -4608, -5633, -5630, -4866, -4605, -5124, -4605, -3585, -2817, -2045, -1795, -2559, -4095, -5122, +-5631, -5887, -5890, -5886, -5889, -5889, -5630, -5378, -5374, -5377, -5121, -5630, -6402, -6654, -6914, -6654, +-5123, -3068, -1796, -765, 511, 1024, 1279, 1537, 1792, 2560, 3329, 4094, 5376, 5377, 5376, 5375, +4610, 3838, 4352, 4866, 5118, 5121, 5120, 5887, 6401, 6400, 6911, 6913, 6911, 6657, 5888, 4606, +3843, 3581, 3075, 3069, 3587, 3326, 2817, 2303, 2048, 1537, 1024, 1024, 767, 1, -769, -2046, +-3842, -4863, -4608, -3841, -4606, -4866, -5119, -4865, -5118, -4867, -5117, -5123, -4606, -3329, -2303, -1793, +-1791, -2818, -4094, -5121, -5120, -5631, -5889, -5888, -5887, -6146, -5630, -5377, -5376, -5119, -5122, -5630, +-6657, -7168, -6912, -5887, -4866, -3325, -1795, -766, 255, 1025, 1024, 1279, 1793, 2559, 3585, 4352, +5631, 5890, 5629, 4868, 4860, 4611, 4606, 4609, 4864, 4863, 5633, 5888, 5887, 6401, 6911, 7169, +6912, 6655, 5889, 4607, 3585, 3584, 3583, 3329, 3583, 3329, 2815, 2305, 2303, 1793, 1023, 1537, +1791, 768, -1279, -2561, -3327, -3841, -4095, -4097, -4606, -4867, -4605, -4610, -5118, -5378, -5375, -5120, +-4097, -2557, -1797, -1788, -2050, -2815, -4096, -4609, -5119, -5632, -5889, -6143, -6145, -6142, -6147, -5373, +-4611, -5118, -5632, -6146, -6910, -7425, -6911, -6146, -5117, -3587, -2046, -1025, -257, 259, 765, 770, +1278, 2561, 3840, 5119, 5634, 5374, 5122, 4861, 5122, 4607, 4098, 4607, 4607, 4865, 5120, 5632, +5888, 6144, 6912, 7424, 6912, 6144, 5376, 4351, 3842, 3837, 4099, 3326, 3329, 3583, 3073, 1790, +1282, 1791, 2048, 2305, 1534, 2, -1282, -2046, -2561, -3328, -3840, -4095, -4355, -4603, -4102, -4858, +-5381, -5885, -5378, -4862, -3842, -2558, -1794, -2047, -2560, -3073, -3838, -4867, -5117, -5378, -5887, -6400, +-6657, -6399, -6143, -5122, -4862, -5378, -6143, -6399, -7170, -7677, -7428, -6397, -5122, -3838, -2561, -1280, +-512, -256, 0, 257, 1534, 2818, 4094, 4354, 5119, 5631, 5378, 5118, 4866, 4607, 4352, 4351, +4866, 4862, 4866, 5375, 5887, 6146, 6909, 7428, 6652, 5636, 5117, 4866, 3838, 3586, 3583, 3841, +3840, 3071, 2049, 1535, 1793, 2559, 2305, 2047, 1281, 0, -770, -1534, -2562, -3325, -4098, -3839, +-3841, -4095, -4353, -4606, -5634, -5887, -5121, -4350, -3586, -2559, -1793, -1791, -2560, -3072, -3585, -4352, +-4863, -5120, -5888, -6912, -6658, -6141, -5890, -5374, -5122, -5375, -6401, -6910, -7426, -7679, -7168, -6401, +-5631, -3841, -2047, -1025, -1023, -1024, -257, 513, 1535, 2561, 3839, 4609, 5119, 5377, 5376, 4862, +4867, 4861, 4610, 4608, 4863, 4609, 4351, 4864, 6146, 6654, 6657, 6911, 6657, 6144, 5376, 4607, +3842, 4094, 4609, 4096, 3326, 2564, 2044, 2050, 2561, 2813, 2563, 1533, 1283, 766, -510, -1282, +-2303, -3073, -3582, -3331, -3068, -3588, -4605, -5122, -5631, -5888, -5120, -4097, -3070, -2306, -1790, -2050, +-2814, -3330, -3326, -3842, -4606, -5633, -6144, -6656, -6400, -6144, -5631, -5121, -4864, -5887, -6657, -6912, +-7168, -7679, -7681, -6655, -4866, -3583, -2816, -1792, -1791, -1538, -510, 254, 1282, 2303, 3584, 4609, +4862, 5635, 5372, 4868, 4605, 5122, 4863, 4608, 4352, 4352, 4608, 5632, 5889, 6398, 6658, 7166, +6658, 5375, 4865, 4350, 4354, 4607, 4608, 4097, 2814, 2562, 2303, 2560, 2305, 2559, 2561, 1791, +1537, 1023, -255, -1536, -2561, -2814, -3075, -3069, -3075, -3837, -4866, -5375, -5632, -5890, -5373, -3843, +-2813, -2562, -2303, -2561, -2559, -2817, -3071, -4096, -4865, -5631, -6144, -6913, -6398, -5635, -5374, -5632, +-5632, -5633, -6398, -7171, -7677, -7938, -7679, -6401, -4863, -3584, -3073, -2303, -2048, -1794, -1020, -5, +1029, 2300, 3586, 4608, 5118, 5123, 4862, 5120, 5122, 5116, 4612, 4094, 4352, 4609, 4607, 4863, +5891, 6652, 7172, 7165, 6401, 5121, 4606, 5122, 5375, 4864, 4353, 3838, 3074, 2559, 2816, 2818, +2299, 2566, 2554, 2310, 1788, 1026, -257, -1280, -2304, -2047, -2561, -2559, -2817, -3583, -4609, -5374, +-5636, -5371, -4612, -3582, -3071, -2819, -2301, -2050, -2559, -2816, -3073, -3583, -5120, -6144, -6401, -6399, +-6401, -5887, -5376, -5377, -5375, -5376, -6401, -7679, -8193, -7935, -7424, -6144, -4865, -3838, -3331, -2813, +-2306, -1791, -1024, -256, 1024, 2303, 3842, 4349, 4356, 5116, 5635, 5375, 4863, 5122, 4861, 4612, +4349, 4354, 4350, 5122, 6143, 7425, 6911, 6144, 5888, 5120, 5121, 5118, 5379, 4603, 4102, 3578, +3333, 2557, 2817, 2561, 2558, 2561, 2816, 2560, 1536, 768, -257, -1278, -1794, -2046, -2306, -2303, +-2560, -3584, -5120, -5632, -5120, -4864, -4608, -3584, -2816, -2559, -2562, -2302, -1793, -2304, -3071, -3842, +-5374, -5889, -5888, -6144, -6400, -6144, -5376, -5120, -5376, -5888, -6912, -7936, -8449, -7934, -7425, -6144, +-5119, -4355, -3837, -2816, -2818, -2557, -1795, 2, 1279, 2305, 3327, 4097, 4607, 5121, 5375, 5377, +5119, 5120, 5121, 4351, 3841, 3840, 4606, 5378, 6655, 6912, 6403, 5627, 5636, 5630, 5376, 5634, +5374, 4608, 4098, 3837, 3331, 2815, 2302, 2564, 2556, 3075, 2814, 2562, 1534, 1026, -259, -1276, +-1795, -1279, -1025, -2046, -3075, -3580, -4356, -5374, -5120, -4609, -4095, -3584, -3073, -2558, -2307, -1533, +-1538, -2303, -3328, -4097, -4863, -5889, -6142, -6658, -6399, -5889, -5374, -5122, -5374, -6146, -7423, -8191, +-8194, -7678, -7170, -6655, -5120, -4096, -4096, -3840, -3073, -2559, -1792, -256, 767, 2049, 2815, 4354, +4862, 4865, 5119, 5377, 5632, 5375, 4865, 3839, 3329, 4096, 5120, 5886, 6404, 6395, 6150, 5626, +5637, 5884, 5635, 5630, 5120, 4610, 4094, 3841, 3328, 2559, 2306, 2813, 2820, 2811, 3078, 3066, +1541, 252, -509, -515, -1021, -771, -1021, -1794, -2816, -3839, -4610, -5118, -4865, -4351, -4354, -4094, +-3329, -2559, -1793, -1535, -1795, -2299, -3076, -3837, -4866, -5632, -6144, -6399, -6401, -5630, -5123, -5118, +-6144, -6913, -7423, -7937, -8703, -7936, -7168, -6401, -5376, -4606, -4355, -4349, -3587, -2558, -2048, -1025, +513, 1791, 2816, 3842, 4349, 4611, 5374, 5889, 5888, 5119, 4353, 3584, 3584, 4352, 5119, 5889, +5887, 5890, 5886, 5888, 5890, 5885, 5635, 5118, 5376, 5122, 4093, 3587, 3326, 2816, 2306, 2557, +3331, 3582, 3329, 2559, 1538, 510, 1, -256, -513, -511, -767, -1795, -3324, -4100, -4606, -4607, +-4611, -4860, -4612, -3838, -3072, -2305, -2046, -1539, -1534, -2305, -3071, -3585, -4607, -6145, -6656, -6143, +-5633, -5632, -5375, -5377, -6144, -6911, -7682, -8446, -8705, -8192, -6912, -6144, -5631, -5122, -4606, -4354, +-3838, -3073, -2304, -1024, 768, 2049, 2559, 3328, 4097, 5118, 5635, 6142, 5632, 4610, 3837, 3587, +4094, 4608, 5378, 5629, 5379, 5630, 6145, 5631, 5377, 5631, 5633, 5376, 5118, 4868, 4603, 3589, +2812, 2306, 2560, 3071, 3585, 3327, 3073, 2303, 1280, 513, -2, 3, -3, -254, -1025, -2047, +-2817, -3070, -3843, -4605, -4866, -4606, -4353, -4097, -2814, -2050, -1790, -2049, -1537, -1790, -2562, -3838, +-5121, -5888, -6144, -5889, -5373, -5635, -5373, -5380, -6141, -7425, -8192, -8447, -8450, -7935, -6911, -6657, +-5887, -5122, -4607, -4351, -4353, -3326, -2308, -764, 509, 1538, 2048, 3070, 4610, 5374, 5891, 6141, +5378, 4093, 3843, 4095, 4608, 4608, 5120, 5632, 5632, 5377, 5630, 5634, 5632, 5374, 5379, 5373, +5635, 5118, 4353, 3583, 2817, 2560, 2816, 3071, 3586, 3581, 3075, 2046, 1281, 512, 767, 769, +255, -511, -1025, -1791, -2561, -3327, -3585, -4095, -4865, -4607, -3842, -3325, -3074, -2303, -1793, -1279, +-1282, -1532, -2821, -4091, -4868, -5630, -6144, -5889, -5375, -5120, -5122, -5628, -6661, -7420, -8194, -8192, +-8190, -7939, -7421, -6146, -5631, -5120, -5121, -5118, -4866, -3071, -2049, -1023, 0, 1023, 1793, 2815, +4865, 6144, 5887, 5377, 5119, 4609, 4096, 4095, 4609, 4863, 5121, 5119, 5378, 5629, 5890, 5632, +5631, 5634, 5629, 5890, 5631, 5121, 4096, 3327, 2817, 2558, 2819, 3325, 4099, 3325, 2306, 1535, +1536, 1025, 766, 770, 511, -512, -1024, -1280, -2048, -3072, -3840, -4352, -4609, -4350, -3842, -3583, +-3071, -2307, -1276, -1027, -1278, -1794, -3070, -3841, -4863, -5633, -5888, -5888, -5119, -4866, -5373, -6147, +-6911, -7678, -8196, -8188, -8451, -8191, -6911, -6145, -6144, -6144, -5632, -5120, -4863, -3329, -2303, -1538, +-1278, -1, 1792, 3586, 4605, 5378, 5376, 5118, 4610, 4351, 4096, 4609, 4608, 4606, 4866, 5375, +5632, 5632, 5633, 5375, 5376, 5889, 6142, 5890, 5631, 5119, 4354, 2814, 2562, 3070, 3841, 3584, +3583, 3074, 2558, 1537, 1536, 1535, 1282, 766, 513, 0, -257, -767, -2047, -3075, -3580, -3845, +-4091, -4355, -4095, -3584, -2816, -2049, -1022, -771, -1020, -1795, -2559, -4096, -5121, -5630, -5377, -5376, +-4864, -5120, -5889, -6141, -6403, -7678, -8449, -8704, -8192, -7679, -7169, -6144, -6143, -6146, -6141, -5378, +-4352, -3327, -3074, -2301, -1538, 257, 1791, 3328, 4609, 5375, 5377, 4863, 4864, 4353, 4607, 4352, +4353, 4607, 4865, 5375, 5376, 4865, 5119, 5633, 5376, 5374, 6147, 6397, 5635, 4349, 3843, 3325, +3075, 3326, 3840, 3842, 3068, 2565, 2043, 2308, 2045, 1795, 1276, 772, 765, 513, -254, -1028, +-2043, -2821, -3323, -3845, -4092, -4611, -4094, -3328, -2562, -2046, -770, -766, -1026, -1534, -2817, -4352, +-5120, -4865, -5119, -5119, -5122, -4862, -5379, -6141, -7169, -7681, -8703, -8960, -8193, -7166, -6659, -6910, +-6912, -6658, -5884, -5125, -4603, -3845, -3580, -2819, -1533, -2, 2048, 3842, 4605, 4867, 4861, 4867, +4862, 4865, 4095, 4097, 4607, 5122, 4860, 5125, 5372, 5379, 4606, 5121, 5632, 5888, 6399, 6147, +5627, 4614, 3578, 3333, 3581, 3842, 4094, 3330, 2814, 2563, 2813, 2306, 1791, 1537, 1535, 1281, +1279, 769, -256, -1025, -1535, -2304, -3073, -3582, -3842, -4350, -3842, -3071, -2560, -1793, -510, -258, +-1023, -2303, -3076, -3835, -4868, -5373, -5121, -5122, -5117, -5122, -5375, -6145, -7167, -8449, -8703, -8193, +-7679, -7169, -7423, -7169, -6912, -6398, -5891, -5117, -4610, -4608, -4095, -3330, -1789, -3, 2307, 3324, +3845, 4859, 5381, 5115, 4612, 4862, 4609, 4351, 4353, 4862, 5123, 5374, 5120, 4866, 4861, 5123, +5886, 6401, 6656, 6143, 5122, 4093, 3587, 4093, 4099, 3837, 3586, 3327, 3328, 3072, 2817, 2302, +1795, 1788, 1795, 1535, 1536, 768, 1, -771, -1019, -2054, -3066, -3589, -3580, -3843, -4094, -3585, +-2047, -1281, -768, -511, -770, -2045, -2819, -4094, -4354, -4862, -5121, -5120, -4608, -4609, -5375, -6656, +-7936, -8448, -8449, -7935, -7681, -7422, -7683, -7421, -6914, -6399, -5889, -5120, -5119, -5377, -4606, -3075, +-1534, -257, 1537, 3070, 4100, 4346, 4871, 5113, 4870, 4603, 4100, 4350, 4608, 5121, 5118, 5123, +4861, 4611, 4349, 5122, 6143, 6656, 6145, 5376, 4862, 4100, 4090, 4102, 3836, 3330, 3583, 3584, +3072, 2816, 2561, 2047, 1791, 2050, 2302, 1794, 1279, 1280, 768, -512, -1536, -1792, -2560, -3328, +-4096, -4352, -3839, -3074, -2046, -770, -510, -514, -1278, -2050, -2559, -3328, -4609, -5118, -4866, -4351, +-4097, -4863, -5887, -7170, -7934, -7939, -8190, -8191, -7682, -7678, -8195, -7677, -6914, -5886, -5890, -6143, +-5632, -5121, -4606, -3587, -1789, -258, 1281, 2816, 3839, 4609, 5119, 4866, 4606, 4353, 4608, 4607, +4866, 5374, 5377, 4864, 4095, 4354, 4862, 5634, 6398, 6145, 5632, 5376, 5120, 4609, 4093, 4099, +3838, 3585, 3585, 3837, 3331, 2557, 2307, 2558, 2049, 1792, 1790, 2051, 1789, 1027, 253, -253, +-771, -1533, -2563, -3325, -4098, -4095, -3840, -2561, -1534, -1026, -767, -768, -768, -1792, -2816, -3841, +-4606, -4610, -3838, -3841, -4352, -5120, -5889, -7166, -7937, -7936, -7680, -7937, -8446, -8450, -7678, -7170, +-6655, -6400, -6144, -5888, -5888, -5633, -5119, -3584, -2049, -511, 1023, 2561, 3839, 4096, 4865, 4863, +4352, 4097, 4350, 4867, 5373, 5378, 4863, 4096, 3841, 4606, 5378, 5632, 5886, 5890, 5375, 5120, +5121, 4863, 4096, 3584, 3841, 4094, 3587, 3325, 3074, 2815, 2305, 1791, 2049, 2303, 2048, 1794, +1533, 1027, 765, 3, -771, -1278, -2561, -3840, -4351, -3840, -3587, -2555, -1798, -1019, -769, -2, +-509, -1795, -3326, -3841, -4095, -4097, -4096, -3327, -4353, -5632, -6911, -7169, -7423, -7681, -8192, -8447, +-8705, -8190, -7938, -7424, -6654, -6403, -6397, -6914, -6399, -5889, -5119, -4096, -2305, -766, 765, 2307, +3582, 4353, 4864, 4608, 4095, 4097, 4863, 5633, 5376, 4864, 4350, 4100, 4091, 4613, 5373, 5633, +5632, 5632, 5887, 5378, 4863, 4351, 4354, 4094, 3841, 3584, 3839, 3586, 3070, 2305, 2304, 2303, +2306, 2046, 2305, 2048, 1535, 1026, 1022, 513, -257, -1535, -2561, -3582, -3843, -3582, -3329, -3071, +-2049, -510, -3, -509, -1026, -1791, -3328, -4096, -4096, -3329, -3326, -3842, -4862, -5634, -6399, -6656, +-7424, -7680, -8192, -8449, -8703, -8192, -7425, -7166, -7170, -6655, -6657, -6911, -6656, -6145, -5374, -4099, +-2813, -1282, 257, 2559, 3841, 4351, 3841, 3840, 4351, 4609, 5118, 5635, 5374, 4353, 3839, 4353, +4607, 4610, 4862, 5377, 5888, 5632, 5632, 5376, 5120, 4864, 4097, 4095, 4096, 4097, 3582, 3330, +3071, 2304, 2305, 2302, 2562, 2301, 2308, 2044, 1796, 1788, 1795, 1022, -511, -1791, -2307, -3068, +-3844, -4093, -3329, -2305, -1790, -514, 2, -2, -1278, -2563, -3324, -3331, -2815, -3071, -3587, -4092, +-4612, -5628, -6403, -6654, -7169, -7936, -8448, -8447, -8706, -7933, -7428, -7164, -6915, -6655, -6911, -7171, +-6909, -6146, -5374, -5122, -3582, -1282, 768, 2306, 3581, 3843, 3582, 3585, 4351, 5377, 5375, 5120, +4610, 4606, 4353, 4096, 4095, 4609, 5375, 5377, 5632, 5888, 5631, 5121, 4607, 4609, 4351, 4354, +4350, 4097, 3583, 3073, 2815, 2561, 2559, 2560, 2818, 2301, 1539, 2044, 2564, 2301, 1283, 766, +0, -1280, -2303, -3073, -3583, -3585, -3328, -2303, -1025, 257, 254, -765, -1795, -2302, -2817, -3072, +-2815, -2817, -3328, -4096, -4607, -5378, -5885, -6660, -7420, -8196, -8701, -8706, -8702, -8193, -7424, -6913, +-7422, -7681, -7424, -6912, -6912, -6656, -6143, -5122, -3583, -1280, 1023, 2306, 2558, 2818, 3326, 4353, +4863, 5122, 5119, 5377, 4862, 4097, 4096, 4353, 4094, 4611, 4860, 5380, 5629, 5633, 5633, 5117, +4612, 4349, 4610, 4350, 4354, 4351, 3841, 2559, 2559, 2819, 2813, 2307, 2045, 2050, 2304, 2302, +2307, 2301, 1794, 1024, -1, -1023, -1792, -2562, -4093, -4099, -3069, -1538, -768, 257, -1, -766, +-1539, -2301, -2307, -2557, -2562, -3071, -3584, -4097, -4608, -4862, -6146, -6910, -7170, -8191, -8961, -8957, +-7940, -7677, -7682, -7423, -7424, -7168, -7169, -6910, -7171, -7165, -6914, -5375, -3072, -1025, 513, 1280, +2048, 3072, 3327, 4097, 4864, 5376, 5120, 5119, 4865, 4351, 4354, 4093, 4355, 4349, 4867, 5373, +5634, 5119, 5632, 5121, 4606, 4354, 4863, 4864, 4352, 3584, 3328, 3328, 3072, 2817, 2558, 2306, +2302, 2305, 2305, 2558, 3074, 2303, 1535, 1026, 510, -510, -2049, -3328, -3840, -3584, -2559, -1026, +-253, -3, -254, -1024, -1794, -2045, -1795, -2302, -2816, -3074, -3325, -4099, -4862, -4865, -5631, -6657, +-7934, -8451, -8445, -8450, -8192, -7934, -7939, -7933, -7427, -6909, -6914, -7167, -8192, -7681, -6655, -4864, +-3328, -1280, -256, 1024, 1535, 2818, 3582, 4097, 4864, 5375, 5121, 4864, 4863, 4609, 4095, 4097, +4351, 4353, 4607, 5121, 5631, 5377, 4863, 4608, 4866, 5117, 4867, 4605, 4099, 3837, 3587, 3069, +2818, 2815, 2561, 2046, 2051, 2556, 2820, 2558, 2560, 2305, 2047, 1536, 769, -769, -2303, -3584, +-3585, -3071, -2049, -511, -256, -513, -767, -768, -1537, -1791, -2049, -1791, -2305, -2814, -3586, -3584, +-3838, -4867, -5884, -7171, -7935, -8448, -8449, -7934, -7938, -8446, -8194, -7166, -6659, -6908, -7428, -8188, +-8195, -7935, -6655, -4866, -3326, -2050, -254, 510, 1282, 2558, 3585, 4096, 4352, 5120, 5375, 4866, +4349, 4612, 4348, 3844, 3836, 4355, 5118, 5378, 5118, 4610, 4861, 5380, 5116, 4868, 5116, 4866, +4096, 3584, 3584, 3584, 3071, 2561, 2304, 2304, 2560, 2560, 2815, 2562, 2814, 3074, 2559, 2047, +1026, -514, -2558, -3329, -3072, -2304, -1536, -1024, -256, -256, -767, -1026, -1278, -1026, -1535, -2048, +-2560, -2559, -2817, -3329, -3582, -4610, -6142, -7424, -7682, -7678, -7937, -8704, -8447, -8193, -7679, -6913, +-6655, -7168, -7938, -8444, -8452, -7934, -6656, -4865, -3583, -2560, -1282, 258, 1536, 2302, 3330, 4351, +4863, 4868, 5114, 5126, 5115, 4612, 3838, 3840, 4610, 4861, 4866, 4864, 5118, 4868, 4860, 5122, +5375, 5377, 4607, 4353, 4351, 4096, 4097, 3583, 2817, 2303, 2560, 2560, 2561, 2559, 2561, 2558, +2818, 3071, 3328, 2305, 254, -1022, -2305, -2817, -2813, -2307, -1278, -513, -513, -509, -516, -508, +-1027, -1023, -1535, -2050, -2557, -2564, -2045, -2561, -3839, -5376, -6402, -6911, -7424, -7935, -8704, -8961, +-8960, -7936, -7423, -6912, -6914, -7421, -8452, -8955, -8452, -7678, -6913, -5631, -4353, -2816, -1535, -257, +768, 2305, 3326, 3842, 4352, 5117, 5636, 4861, 4353, 4353, 4094, 4099, 4094, 4863, 4866, 4606, +4355, 4862, 5120, 5120, 5376, 4609, 4351, 4609, 4606, 4354, 3582, 3331, 2813, 2306, 2302, 2562, +2558, 2051, 2300, 2820, 3580, 3844, 3069, 2050, 767, -1024, -2304, -2559, -2306, -1533, -1284, -763, +-261, -508, -515, -254, -257, -1280, -2047, -2050, -1789, -1795, -1790, -2817, -4095, -5377, -5887, -6656, +-7681, -8190, -8707, -8701, -8705, -7937, -6910, -6915, -7420, -7939, -8446, -8450, -8447, -7935, -6914, -5374, +-4354, -3327, -1791, -2, 1025, 1792, 2816, 4351, 4865, 5120, 5120, 5121, 4350, 4353, 4097, 4350, +4610, 4863, 4352, 4353, 4607, 5119, 5379, 4860, 4869, 4859, 4868, 4606, 4865, 4351, 3585, 2815, +2562, 3070, 2817, 2303, 2050, 2046, 2562, 3070, 3585, 4097, 3327, 1792, 257, -770, -2046, -2305, +-2047, -1026, -1021, -1028, -763, -5, 4, -258, -768, -1791, -1793, -1536, -1023, -1281, -2048, -3072, +-3839, -5121, -5631, -6401, -7168, -8447, -8960, -8961, -8191, -7168, -6913, -7167, -7425, -7935, -8704, -8960, +-8450, -7421, -7427, -6396, -4613, -3068, -1794, -768, 514, 1789, 2818, 4096, 4863, 5121, 5375, 4865, +4351, 4097, 4606, 4866, 4351, 4096, 4352, 4608, 4863, 4866, 5118, 4865, 4609, 4606, 4865, 4864, +4607, 3587, 3324, 3332, 3068, 2563, 2304, 2046, 1794, 1790, 2562, 3582, 3843, 3836, 3587, 1790, +2, -1026, -1534, -1794, -1534, -1537, -1536, -1024, -255, 511, 0, -767, -1282, -1277, -1283, -1022, +-1025, -1280, -2303, -3073, -3840, -4607, -5122, -6653, -8195, -8957, -8707, -8701, -8195, -7421, -6659, -7420, +-8196, -8445, -8450, -8703, -8704, -8193, -7422, -6403, -4861, -3586, -2304, -1022, 252, 1028, 2557, 3843, +4861, 5122, 4607, 4608, 4866, 4605, 4355, 4349, 4099, 4349, 4355, 4349, 5122, 4864, 4606, 4354, +5119, 5375, 5122, 4606, 4354, 3838, 3330, 3070, 3329, 2817, 2046, 1794, 1791, 2048, 2561, 4094, +4354, 4095, 3072, 1536, 1, -770, -765, -1284, -1789, -1793, -1024, -256, 256, 256, -256, -768, +-1280, -1025, -766, -514, -766, -1794, -2559, -2561, -3070, -4355, -5629, -6403, -7677, -8962, -8959, -8193, +-7680, -7167, -7425, -7422, -7939, -8190, -8705, -8959, -8961, -8191, -7425, -6655, -5377, -3584, -2559, -1793, +-255, 1535, 3072, 4096, 4352, 4609, 4606, 4610, 4606, 4609, 4608, 4096, 3584, 4096, 4608, 4863, +4354, 4350, 4866, 4606, 4866, 5373, 5123, 4606, 3841, 4096, 3583, 3585, 3328, 2814, 2051, 1534, +1537, 2304, 3071, 4608, 4865, 3840, 2560, 1536, 767, 1, -769, -1534, -1794, -1278, -771, -253, +253, 259, -770, -1279, -1025, -255, -512, -1025, -1279, -1280, -1793, -2558, -2819, -3837, -5634, -6911, +-8448, -8705, -8447, -8193, -7679, -7425, -7422, -7426, -8190, -8706, -8703, -8960, -9216, -8704, -7679, -6402, +-5118, -4610, -3583, -1792, -256, 1280, 2560, 3840, 4096, 4352, 4608, 5120, 5120, 4352, 3841, 4094, +4354, 4093, 4612, 4349, 4098, 4094, 4610, 5118, 5121, 5120, 4863, 4354, 4094, 3841, 4095, 3585, +3327, 2561, 1535, 1025, 1535, 2817, 3839, 4352, 4097, 3327, 2816, 2049, 1023, -255, -1024, -1537, +-2047, -1280, 0, 512, -512, -768, -512, -513, -509, -260, -252, -516, -1022, -1536, -1280, -1793, +-2303, -4097, -5887, -7425, -7679, -8449, -8703, -8193, -7679, -7425, -7423, -7936, -7681, -8191, -8960, -9473, +-9471, -8449, -7423, -6912, -5633, -4863, -3584, -2561, -255, 1535, 2305, 2816, 3840, 4607, 4865, 4864, +4863, 4354, 3837, 4355, 4606, 4353, 4352, 3840, 4096, 4095, 4610, 5118, 5121, 4864, 4864, 4351, +3841, 4095, 4096, 4097, 3071, 2048, 1025, 1279, 2304, 3329, 3839, 4096, 4353, 3839, 2817, 2559, +1536, 1, -1537, -1535, -769, -256, 1, -1, 1, -257, -511, -257, 1, -1, -255, -1024, +-1026, -509, -515, -1533, -2818, -4096, -5631, -7169, -7936, -8446, -7940, -7931, -7940, -7678, -7169, -7167, +-7937, -8703, -8961, -8960, -9216, -8447, -7425, -6912, -6655, -5635, -3836, -2307, -766, 766, 1795, 2813, +3586, 4607, 4864, 4608, 4353, 4095, 4097, 4351, 4352, 4097, 3582, 3843, 3837, 4098, 4607, 5120, +5121, 4863, 4352, 3840, 4097, 4863, 4865, 3582, 2050, 1791, 1281, 1279, 2304, 3585, 3838, 3842, +3839, 4352, 3841, 2302, 1026, -258, -766, -770, -510, -257, -1, 2, -515, -508, -260, 259, +-2, -511, -768, -513, -255, -257, -766, -1282, -2559, -4352, -6146, -6908, -7685, -7931, -8452, -8189, +-7426, -7168, -7423, -7168, -7937, -8959, -9473, -9215, -8704, -8449, -8191, -7681, -6910, -5635, -3837, -2306, +-1024, 259, 1787, 2821, 3836, 4610, 4608, 4607, 4610, 4605, 4612, 4348, 4355, 4094, 3842, 3583, +3584, 4096, 4864, 5633, 4863, 4096, 4353, 4862, 4867, 4861, 4610, 3839, 2049, 1278, 1538, 2303, +2560, 2817, 3326, 4098, 4606, 4610, 3327, 2048, 768, 0, -769, -510, -2, 257, -256, -513, +-255, 255, 257, -1, 0, 1, -513, -255, -257, 256, 0, -1280, -3072, -3839, -5378, -6910, +-7682, -8191, -8448, -8448, -7681, -6910, -7170, -7935, -8448, -8960, -9472, -8960, -8705, -8959, -8704, -7937, +-6909, -5637, -4091, -2820, -1790, 0, 1535, 2817, 3840, 4351, 4609, 4607, 4609, 4864, 4351, 4354, +4349, 4099, 3070, 3330, 4350, 4866, 4861, 4868, 4604, 4356, 4349, 5121, 5633, 5118, 4098, 2815, +2048, 1792, 1793, 1790, 1795, 2812, 3844, 4348, 4612, 4605, 3329, 2305, 509, 4, 252, 258, +1, -515, -508, -5, 5, -261, 5, 252, -510, -769, -255, 255, 257, 255, -255, -1281, +-2814, -4098, -5118, -6658, -7678, -8450, -8189, -7940, -7164, -6916, -7677, -8193, -8704, -8704, -8960, -8706, +-9212, -9219, -8958, -7938, -6911, -5888, -4863, -3586, -2046, -2, 1538, 2558, 3330, 4095, 4608, 4097, +4094, 4866, 5119, 4352, 3584, 3329, 3582, 3587, 4092, 4612, 4604, 4099, 3839, 4096, 4864, 5887, +5378, 4349, 3589, 3066, 2309, 1788, 1283, 1534, 2049, 2560, 3583, 4865, 4863, 4352, 2817, 1279, +1281, 767, 1, -257, 2, -2, -511, -256, 256, 512, 1, -3, -252, -259, 2, 510, +769, 256, -256, -1279, -2307, -3581, -5121, -6913, -8189, -8452, -7933, -7681, -6912, -7168, -7936, -8192, +-8448, -8448, -8960, -9216, -9472, -9216, -8704, -7680, -7168, -6656, -5376, -3328, -2048, -769, 1026, 2814, +3586, 3326, 3841, 4352, 5120, 5120, 4864, 4351, 3586, 3069, 3332, 3836, 4611, 4350, 3840, 3586, +4093, 5124, 5372, 5379, 5117, 4611, 3837, 3076, 2555, 2053, 1787, 1285, 1531, 3077, 4603, 4869, +4347, 3844, 3070, 1793, 1024, 1022, 770, 255, -255, -1, 256, 256, 513, 510, 2, -258, +-255, 1, 254, 1027, 764, 260, 253, -767, -1791, -3586, -5374, -7169, -7936, -7936, -7423, -7426, +-7422, -7425, -7680, -7935, -7937, -8447, -9473, -9727, -9218, -8701, -8962, -8447, -7425, -6143, -5889, -4351, +-2560, -258, 1284, 2043, 2821, 3324, 3843, 4606, 5121, 5376, 4864, 3584, 3072, 3328, 4352, 4609, +4094, 3842, 3583, 4096, 4609, 4863, 5376, 5633, 5119, 4353, 3583, 3840, 2817, 1278, 771, 1533, +2562, 3327, 4351, 4867, 4348, 3588, 2813, 2306, 1535, 1024, 1024, 257, 0, 255, 257, 510, +771, 253, -254, -256, -2, 515, 509, 769, 769, 511, 513, -1, -1535, -3842, -5373, -6660, +-7675, -7429, -7164, -7426, -7937, -7677, -7428, -7932, -8707, -8958, -8961, -9472, -9727, -9474, -8958, -8450, +-7934, -7425, -6144, -4351, -2562, -767, 513, 1790, 2563, 2812, 4099, 5118, 5378, 4862, 3841, 3584, +3583, 4098, 4094, 3841, 3840, 3840, 3327, 3586, 4606, 5378, 5119, 4608, 4864, 5121, 4094, 3075, +2045, 1282, 767, 1536, 2561, 3583, 4608, 4609, 4094, 3587, 3069, 2562, 1790, 1538, 767, 256, +0, 512, 768, 769, 254, 257, -255, -258, 514, 510, 257, 768, 1280, 1280, 767, 1, +-1792, -4352, -5632, -6401, -6911, -7424, -7680, -7168, -6913, -7423, -7680, -7936, -7936, -8705, -9214, -9474, +-9215, -8704, -8961, -8959, -8192, -7425, -6143, -4353, -2304, -511, 255, 768, 1793, 3326, 4867, 5373, +4866, 4094, 4355, 3837, 3586, 4096, 4350, 3843, 3069, 3073, 3842, 4349, 4354, 4607, 4864, 5120, +5122, 5116, 4100, 3069, 2050, 1024, 1023, 1537, 2814, 3842, 4351, 4354, 4093, 3586, 3326, 2818, +2047, 1280, 769, 511, 513, 1023, 1023, 515, -2, 257, 255, 0, 256, 257, 254, 771, +1789, 2307, 1277, -509, -2051, -3324, -5125, -6395, -6916, -7165, -7170, -7423, -7680, -7425, -7422, -7683, +-8701, -8962, -9215, -8960, -9473, -9216, -9215, -9217, -8959, -8193, -6400, -4095, -2305, -2047, -1280, 511, +2562, 3325, 4099, 4862, 4865, 4095, 3585, 4352, 4352, 4095, 3584, 3074, 3070, 3585, 4095, 4097, +4352, 4608, 5119, 5377, 5631, 5121, 4096, 2559, 1538, 1021, 1028, 2044, 3075, 3582, 3586, 4095, +4095, 3586, 3582, 3074, 1790, 1025, 1023, 1026, 766, 768, 769, 511, 1, 255, 513, 254, +-508, -262, 1030, 1787, 2052, 1790, 1024, 0, -1792, -3840, -5120, -5888, -6401, -7165, -7685, -7418, +-7174, -7163, -7683, -7934, -8706, -8957, -9219, -9214, -8961, -8961, -9469, -10243, -9214, -7169, -5633, -4606, +-3586, -2302, -1282, 258, 2301, 3844, 4348, 4356, 3836, 3843, 4350, 4354, 4094, 3330, 3070, 3074, +3070, 3585, 3584, 3839, 4098, 4606, 5377, 5632, 5630, 5380, 3836, 2051, 1535, 1279, 1282, 2302, +3073, 3329, 3582, 4098, 4350, 4097, 3329, 2302, 2050, 1278, 1025, 1537, 1278, 771, 252, 516, +765, 771, -3, -510, -257, 512, 1025, 1791, 2048, 2561, 1278, -254, -1793, -3073, -4349, -5892, +-6652, -7171, -7166, -6913, -7168, -7167, -7170, -7677, -8963, -9214, -8449, -8192, -9216, -9984, -10239, -9729, +-8960, -7680, -6144, -5119, -4096, -3073, -1536, 770, 2557, 3587, 3582, 4096, 4099, 4860, 4611, 4350, +4097, 3328, 3328, 3584, 3584, 3072, 3583, 3586, 3582, 4610, 5630, 5633, 5632, 4864, 3584, 2048, +1023, 1537, 1792, 2048, 2304, 3327, 3585, 3839, 4354, 4094, 3329, 2303, 2050, 2046, 2050, 1278, +769, 512, 1281, 1534, 770, 509, 260, -4, 4, 252, 1539, 2302, 2561, 2305, 1278, 1, +-1280, -3072, -4864, -5632, -6145, -6910, -7426, -6654, -6403, -6908, -8197, -8698, -8198, -8443, -8195, -8703, +-9472, -9984, -10497, -9725, -8708, -7164, -6404, -5885, -4865, -3072, -768, 768, 2048, 3072, 3329, 3838, +4866, 4863, 4352, 4353, 4094, 3330, 3327, 3584, 3584, 3072, 2817, 3326, 3842, 4606, 5890, 6399, +5632, 4097, 3070, 2050, 1535, 1536, 1793, 2046, 2306, 3071, 3840, 4608, 4352, 3328, 2560, 2816, +2816, 2048, 1280, 1279, 1538, 1278, 1281, 1281, 1021, 260, -3, -510, -258, 1026, 2046, 2050, +2559, 2560, 1792, 0, -1536, -2304, -3840, -5888, -6656, -6656, -6400, -6656, -7168, -7936, -8192, -8192, +-7936, -7936, -8192, -8704, -9984, -10752, -10240, -8959, -8450, -7934, -7170, -6654, -5121, -2816, -1024, 255, +1537, 2816, 3583, 4098, 4604, 4868, 4606, 3840, 3841, 3838, 3586, 3327, 3585, 2814, 2562, 3070, +4354, 5375, 5887, 5891, 5117, 4098, 2815, 2048, 2048, 1794, 1277, 1282, 2303, 3840, 4352, 3841, +3326, 3586, 3326, 2818, 2559, 2048, 1536, 1792, 1536, 1024, 1793, 1790, 1026, -2, -254, 254, +258, 766, 2049, 3072, 2816, 2047, 1794, 1021, -509, -2563, -4605, -5634, -6143, -5889, -6399, -6657, +-7166, -7683, -8445, -7939, -7420, -7683, -8704, -9470, -10244, -10490, -9477, -8957, -8961, -8706, -7933, -6658, +-5119, -3328, -1537, 1, 1279, 2305, 3839, 4097, 4351, 4353, 4351, 3841, 3839, 4098, 3837, 3330, +2559, 2305, 2560, 3327, 4353, 5631, 6146, 5630, 4609, 3584, 3583, 3074, 1534, 769, 1536, 2303, +3073, 3584, 3583, 3586, 3582, 3585, 3071, 2818, 2814, 2050, 1277, 1283, 2046, 2049, 1536, 1023, +770, 253, -509, -258, 770, 1790, 2305, 2816, 2560, 2816, 2560, 1024, -1281, -2815, -4352, -5376, +-5632, -5633, -6399, -7168, -7681, -7934, -7938, -7423, -7168, -8193, -9470, -9986, -9727, -9728, -9729, -9727, +-9472, -9217, -8447, -6657, -5119, -3842, -2045, -514, 768, 2305, 3582, 4098, 4608, 4094, 3842, 4095, +4351, 4099, 3837, 2818, 2559, 2048, 2048, 3585, 5119, 5377, 5119, 5376, 4864, 4353, 3326, 2051, +1020, 1284, 1789, 2050, 2559, 3328, 3840, 3584, 3073, 3583, 3840, 3073, 2045, 2053, 1786, 1797, +2045, 1793, 2048, 1535, 770, -259, -252, 508, 1027, 1278, 1794, 2814, 3074, 3326, 2817, 1024, +-1025, -2813, -3844, -4605, -5122, -5375, -6400, -7680, -8192, -7681, -6911, -7169, -7679, -8448, -9217, -9727, +-9473, -9471, -9984, -9729, -9726, -9219, -8188, -6916, -5629, -3843, -2557, -1026, 769, 2303, 3841, 3839, +4097, 4095, 4353, 3839, 4353, 4608, 3840, 2304, 1792, 2048, 3072, 4096, 4609, 4863, 5377, 5887, +5376, 4097, 2815, 2305, 1535, 1280, 1538, 2812, 2821, 2811, 3076, 3581, 3842, 3839, 3329, 2815, +2561, 2047, 1537, 1791, 2305, 2559, 1793, 1023, 513, 255, 1, 254, 771, 1277, 2051, 3069, +3842, 3582, 2819, 765, -1278, -3074, -3582, -3586, -4605, -6147, -7167, -7679, -7682, -7165, -6915, -7422, +-8193, -8959, -9217, -9471, -9729, -9727, -9985, -10240, -9984, -9471, -8449, -7167, -6146, -4863, -2816, -767, +511, 2049, 3327, 3584, 3329, 3583, 4097, 4607, 4866, 4093, 2563, 1789, 2051, 2558, 2817, 3072, +4351, 5378, 5374, 5378, 5118, 4097, 2560, 1792, 1280, 1792, 2304, 2047, 2306, 2813, 3332, 3324, +3331, 3582, 3586, 2557, 1796, 1787, 2309, 2556, 2818, 2304, 1534, 772, 507, 260, -2, 1, +767, 1538, 2301, 3587, 4606, 3841, 2047, 257, -1025, -1791, -2560, -3586, -5117, -6402, -7168, -7166, +-6915, -6910, -7167, -7684, -7931, -8452, -8957, -9218, -9215, -9728, -10496, -10239, -9474, -9214, -8962, -7678, +-6401, -5120, -3328, -1281, 514, 2302, 2818, 2814, 3073, 4097, 5374, 5378, 4095, 3583, 3331, 2556, +1796, 2045, 2818, 3583, 4352, 5120, 5889, 5886, 5122, 3582, 2562, 2302, 2050, 1790, 1794, 2558, +2817, 2816, 3072, 3584, 4096, 3839, 3329, 2560, 2048, 2303, 2817, 2814, 2307, 2303, 2046, 1284, +762, 519, 251, -254, 257, 1533, 3332, 4605, 4353, 3329, 1790, 514, -2, -1022, -2049, -3840, +-5121, -6142, -6403, -6652, -6916, -6653, -6914, -7935, -8449, -8190, -8450, -9215, -9728, -9985, -10238, -10242, +-10238, -9474, -8959, -7936, -7168, -5632, -3840, -768, 1025, 1022, 1538, 2814, 3842, 4606, 4866, 4607, +4352, 3328, 2560, 1792, 2048, 2304, 2560, 3329, 4606, 5890, 5630, 5122, 4607, 3840, 2816, 2048, +2049, 2047, 1792, 2048, 2048, 2561, 3326, 4098, 4094, 3074, 2559, 2560, 2560, 2561, 2814, 3074, +2558, 2050, 1792, 1534, 1026, 254, -766, -513, 512, 2560, 3841, 4351, 4096, 2816, 1791, 1539, +509, -1022, -2306, -3583, -5120, -6144, -6143, -6146, -6654, -6914, -7422, -7426, -7678, -8450, -8446, -9217, +-9472, -9728, -10240, -10752, -9728, -8959, -9473, -9216, -7680, -5120, -2816, -1279, -258, 769, 1792, 2815, +3587, 4347, 5126, 4858, 3845, 3325, 3073, 2305, 1534, 1538, 2558, 3842, 4606, 5378, 5630, 5122, +4350, 3329, 2560, 2048, 2303, 2050, 1533, 1283, 2046, 3073, 3328, 3840, 3582, 3075, 2557, 2307, +2559, 3071, 3073, 2815, 2560, 2562, 2813, 2051, 1021, 2, -769, -256, 1792, 3329, 3582, 3843, +3836, 3076, 2557, 1794, 1023, -512, -2560, -4095, -4866, -5630, -5889, -6400, -6912, -7167, -7170, -7421, +-8195, -8191, -7935, -8962, -9981, -10243, -9470, -9474, -9726, -10497, -10496, -8704, -6913, -5373, -3588, -1789, +-258, 513, 1280, 3071, 4352, 4610, 4350, 4609, 4351, 3585, 2560, 1791, 1281, 1791, 2561, 3841, +4605, 5379, 5886, 4865, 3840, 3328, 3328, 2816, 2048, 1536, 1280, 1792, 2304, 3072, 3584, 3584, +3328, 2560, 2559, 3074, 3070, 2817, 2816, 2560, 2815, 3330, 3069, 1795, -2, -1023, -513, 513, +1791, 3074, 3837, 3843, 3581, 3586, 3328, 2559, 1281, -769, -2303, -3329, -4095, -5377, -5887, -5888, +-6145, -6910, -7427, -7420, -7171, -7679, -8960, -9984, -9472, -9215, -9473, -10241, -10749, -10500, -9980, -9475, +-7422, -5377, -3839, -2818, -1277, 252, 1797, 2812, 3586, 4352, 4862, 4867, 4350, 3329, 2303, 1793, +1535, 1537, 2560, 3839, 5121, 5120, 4863, 4353, 4096, 3840, 3327, 2305, 2048, 1791, 1282, 1789, +2819, 3069, 3332, 3067, 2821, 2556, 2818, 3329, 3069, 2052, 2300, 3331, 4095, 3840, 2816, 1280, +0, -768, 0, 1024, 2304, 3072, 3584, 3584, 3840, 4352, 3327, 2050, 1022, -254, -1794, -3583, +-4608, -4864, -5375, -6402, -7166, -7169, -6400, -6656, -7680, -8960, -8959, -8961, -9217, -9470, -9474, -10238, +-11010, -11263, -10495, -8706, -7422, -5890, -4607, -3072, -1536, 256, 1280, 2303, 3586, 4605, 4868, 4604, +4099, 3326, 2305, 1280, 1023, 1793, 3328, 4095, 4610, 4862, 5121, 4352, 4095, 3841, 3584, 2303, +1538, 1278, 1281, 1792, 2815, 3330, 2814, 2306, 3070, 3586, 3070, 2562, 2046, 2562, 3070, 4098, +4350, 3586, 2559, 1024, -512, -512, 768, 1536, 2049, 2558, 3585, 4353, 4349, 4099, 3838, 3072, +1538, -259, -2302, -2817, -3328, -4607, -6401, -6399, -6146, -6142, -6913, -7423, -7937, -8448, -8959, -8705, +-8447, -8962, -9726, -10497, -11263, -11010, -9981, -8963, -8190, -6400, -4866, -3325, -2050, -512, 1026, 2557, +3842, 4096, 4863, 5121, 4351, 2816, 1538, 1021, 1539, 2045, 3330, 4096, 4350, 4355, 4605, 4610, +4351, 4096, 3328, 2049, 1022, 1283, 2301, 2562, 2559, 2560, 2561, 3071, 3585, 3327, 2305, 2303, +2305, 2559, 3586, 4605, 4611, 3581, 1539, 510, 257, 511, 513, 1280, 2047, 3073, 3583, 3841, +4352, 5120, 4351, 2561, 768, 255, -766, -2562, -4095, -5120, -5632, -6145, -6142, -6146, -6655, -7424, +-8193, -8447, -8448, -7936, -8192, -9473, -10238, -10754, -11006, -10753, -10496, -9727, -7937, -6400, -5119, -4097, +-2304, -255, 767, 2048, 3585, 5118, 5378, 4862, 4099, 2556, 1540, 1276, 1795, 2558, 3074, 4093, +4099, 4094, 4353, 5120, 4863, 3585, 2559, 1793, 1792, 2303, 2306, 1789, 2051, 2558, 3072, 3074, +3325, 3075, 2302, 1280, 2049, 3327, 4608, 4609, 4094, 2562, 2046, 1027, 252, 4, 1020, 1795, +1792, 2046, 3330, 4862, 5378, 4607, 3584, 2815, 2050, 510, -766, -2305, -4096, -4608, -5376, -5632, +-5632, -6143, -7170, -7934, -8450, -7935, -7936, -7937, -8958, -9474, -9983, -10752, -11264, -11008, -9984, -9215, +-8706, -7165, -5380, -3836, -2563, -1022, 510, 2051, 3836, 5124, 5373, 4609, 3585, 2558, 1538, 1279, +2047, 2818, 3069, 3332, 3581, 4353, 5375, 5377, 4351, 2818, 2558, 2305, 2304, 1791, 2049, 2048, +2047, 2562, 3582, 3842, 3070, 2049, 1024, 1792, 3072, 4096, 4096, 4352, 4351, 3330, 1533, 516, +764, 1282, 1024, 767, 1793, 3072, 3838, 4868, 4604, 4354, 4095, 3073, 2304, 1024, -513, -2559, +-3841, -4863, -4864, -4866, -5373, -6659, -7422, -7936, -7682, -7934, -8193, -7936, -8190, -9731, -10494, -10754, +-10749, -10754, -10495, -9728, -8706, -7421, -5634, -4351, -3328, -1536, 511, 2306, 3837, 5123, 5117, 4355, +3070, 1793, 1534, 2050, 2559, 2305, 2047, 2816, 4096, 5121, 4863, 4353, 3838, 3075, 2557, 2307, +2301, 1794, 1279, 1025, 1791, 3329, 3839, 2816, 1793, 1535, 1793, 2048, 2559, 3840, 5122, 4604, +3334, 2554, 1796, 1278, 1024, 258, 253, 1028, 2043, 3077, 4091, 4614, 4858, 4612, 4350, 3584, +2818, 1277, -766, -2817, -3583, -3585, -4096, -5376, -5888, -6399, -7169, -7936, -7680, -7424, -7424, -8192, +-8703, -9730, -10494, -10754, -11007, -11263, -11010, -9982, -8450, -7678, -6402, -5118, -3586, -1791, 257, 2302, +4354, 5374, 4866, 3326, 2562, 2303, 2560, 2049, 1534, 1794, 2303, 3585, 4351, 4864, 4864, 4609, +3583, 3328, 3329, 3071, 2048, 1025, 767, 2305, 3327, 3073, 2815, 2817, 2047, 1281, 1023, 2049, +3582, 4867, 4605, 4098, 3583, 3072, 2305, 1535, 769, 254, 770, 1279, 2048, 3073, 4095, 4864, +4865, 4863, 5376, 4865, 2814, 771, -514, -1791, -3073, -3583, -3841, -4863, -5633, -6655, -7424, -7681, +-7423, -7169, -7423, -8192, -8449, -8959, -9729, -10751, -11264, -11520, -10753, -9727, -8960, -7680, -6656, -5633, +-4350, -2306, 258, 3326, 4353, 4352, 3839, 3329, 3328, 2815, 2049, 1536, 1535, 1794, 2557, 3331, +4606, 4866, 3838, 3329, 4096, 4352, 3328, 2048, 1280, 1280, 1536, 2048, 2560, 3328, 3328, 2303, +1026, 1021, 1796, 3067, 3845, 4348, 4099, 4349, 4099, 3326, 2306, 1278, 1024, 257, 511, 1537, +2815, 3329, 3327, 4353, 5375, 5632, 5378, 4093, 2819, 1022, -511, -1537, -2558, -3075, -3580, -4868, +-6141, -6914, -7167, -7168, -7168, -7424, -7680, -7936, -8448, -9216, -9985, -11006, -11010, -11262, -11266, -9983, +-8704, -7936, -7680, -6912, -4865, -1789, 1021, 2562, 3326, 3842, 4095, 3841, 3071, 2816, 2304, 1537, +767, 1793, 3327, 3840, 3585, 3328, 4095, 4864, 4608, 3585, 2816, 2303, 1536, 1280, 1536, 2562, +3581, 3586, 2559, 1281, 1023, 1280, 2049, 2814, 3331, 4349, 4609, 4097, 3582, 3586, 2558, 1026, +254, 770, 1278, 1793, 2049, 2813, 3845, 4858, 5638, 5882, 5125, 4605, 2817, 1025, -514, -1023, +-1792, -2817, -3838, -5122, -5887, -6400, -6657, -7166, -7170, -6911, -7168, -7937, -8702, -9218, -9982, -11011, +-11773, -11522, -10495, -9471, -9219, -9469, -8706, -6654, -4097, -1792, 255, 2306, 3326, 3586, 3582, 4098, +3582, 2305, 1024, 1023, 1795, 2811, 2565, 2812, 3330, 4097, 4349, 4612, 4092, 3843, 2814, 1537, +769, 1022, 2050, 3582, 3585, 2560, 2049, 1790, 1026, 1278, 2050, 3071, 3328, 3841, 4350, 4867, +4093, 3074, 1791, 1024, 1025, 1279, 1025, 1279, 1792, 2817, 3839, 5122, 5884, 6405, 5627, 4356, +2558, 1281, 511, -255, -1536, -2817, -3838, -4866, -5888, -6654, -6914, -6910, -6914, -7167, -7424, -7681, +-7934, -8962, -10495, -11520, -11265, -10239, -9984, -10497, -10239, -9728, -8961, -7167, -4609, -1535, 256, 1280, +2559, 3841, 4863, 4098, 2557, 1795, 1533, 2050, 1791, 1793, 2304, 3071, 3329, 4095, 4097, 4608, +4864, 3583, 1794, 765, 1540, 2045, 2562, 3070, 3330, 2558, 1283, 765, 1282, 1535, 2048, 2304, +3328, 4096, 4865, 4863, 3583, 2819, 2300, 1541, 1275, 1027, 1024, 1278, 1795, 2813, 3842, 5375, +6400, 6401, 5118, 3843, 3069, 2306, 768, -258, -1278, -2304, -3586, -4860, -5893, -6396, -6403, -6910, +-7425, -7167, -6657, -6656, -8704, -9984, -10495, -10498, -10749, -10500, -10492, -10499, -11006, -11009, -8960, -6400, +-4095, -2561, -1023, 1279, 3584, 4097, 3839, 3329, 2559, 2049, 1791, 1537, 1279, 2049, 2303, 2305, +2559, 3841, 5120, 4607, 3585, 2815, 1793, 1280, 1279, 2305, 3072, 3071, 2562, 2045, 1539, 1534, +1281, 1024, 1279, 2561, 3584, 4607, 4866, 4350, 3841, 3072, 2304, 1536, 1280, 1024, 1280, 768, +1280, 3073, 4862, 5891, 6140, 5891, 5376, 4606, 3331, 2045, 1282, 255, -767, -2561, -4095, -4608, +-5122, -6398, -7424, -7169, -6655, -6145, -6913, -7677, -8707, -9726, -10753, -10752, -9984, -9727, -10754, -11774, +-11521, -10239, -8449, -7168, -5120, -3071, -514, 2051, 3069, 3586, 3583, 3583, 2818, 1790, 1794, 2303, +2048, 1537, 1534, 2562, 3583, 4353, 5119, 4864, 3585, 2047, 1281, 1023, 2303, 2818, 2814, 2562, +2558, 2050, 1790, 1026, 766, 1025, 1536, 3072, 3841, 4350, 4610, 4606, 3585, 2816, 2304, 2304, +1536, 767, 1, 512, 2047, 3330, 4605, 5635, 6142, 6145, 5376, 3839, 3585, 3071, 2049, 256, +-1281, -1790, -2563, -4349, -6146, -6655, -6912, -6401, -6143, -5888, -6401, -7678, -9475, -10237, -9474, -9216, +-9726, -11011, -11772, -12036, -11005, -10243, -9725, -8194, -5375, -2816, -1025, 1026, 2814, 3585, 3328, 2559, +2562, 2559, 2304, 2049, 1533, 1284, 1789, 2563, 3581, 4866, 4862, 3843, 2558, 1792, 1794, 2045, +2307, 2557, 2820, 2556, 2563, 2046, 1025, 513, 765, 1028, 1788, 3076, 4092, 4868, 4604, 3844, +3837, 3329, 3329, 2301, 1028, 252, 515, 1279, 2303, 3586, 5373, 6403, 6141, 5380, 5116, 5122, +4096, 2558, 1283, 765, 2, -1537, -3328, -4607, -5633, -6912, -6655, -5890, -5374, -6145, -7423, -8961, +-9216, -8960, -8704, -9728, -10751, -11009, -11009, -11261, -11523, -11005, -8963, -7677, -5635, -3068, -260, 1539, +2814, 2561, 2816, 2816, 2815, 2562, 2045, 1795, 1022, 1024, 1538, 3325, 4610, 4863, 4352, 3329, +2303, 2304, 2304, 2048, 2304, 2561, 3070, 2819, 2300, 1796, 1277, 770, 512, 1022, 2306, 3583, +4096, 4097, 3839, 4095, 4355, 3580, 2564, 1788, 1283, 510, 257, 768, 2815, 4353, 4863, 5121, +5631, 5889, 5631, 4609, 3839, 3329, 2047, 1024, 257, -1026, -2814, -4865, -6400, -6400, -5631, -4610, +-5630, -7170, -8190, -7937, -7935, -8961, -9472, -9471, -9985, -11008, -11519, -11778, -11261, -10754, -9984, -8191, +-5378, -2558, -513, 1024, 2049, 2559, 2817, 2815, 3073, 2815, 2304, 1281, 511, 769, 2303, 3841, +4351, 4096, 3841, 3326, 2563, 2046, 1792, 2305, 2558, 2818, 2816, 3071, 2560, 1793, 767, 1, +512, 1791, 2817, 3071, 3329, 3839, 4610, 4605, 3843, 3580, 3333, 2044, 259, -2, 768, 2050, +2557, 3587, 4862, 5889, 5888, 5887, 5633, 4863, 4097, 3071, 2305, 1792, 767, -1023, -3840, -5633, +-5631, -4865, -5119, -5888, -6401, -6911, -7426, -7933, -8451, -8445, -8707, -9726, -10497, -11008, -11007, -11777, +-12032, -11519, -10242, -7934, -5377, -3071, -770, 771, 1532, 2309, 2556, 3074, 3327, 2560, 1281, 256, +511, 1537, 2559, 3329, 3839, 4098, 3581, 2819, 2558, 2048, 2306, 2302, 2305, 2560, 3327, 3330, +2302, 1025, 256, 768, 1536, 1535, 2049, 3072, 3839, 3842, 3837, 4354, 5376, 4351, 2561, 1535, +768, 769, 1024, 1791, 2817, 3838, 4867, 5630, 5889, 6143, 5633, 4607, 3329, 3584, 3839, 2818, +-2, -2560, -3837, -4356, -4604, -5124, -5374, -5376, -6145, -7166, -7683, -7678, -7680, -8450, -8957, -9474, +-9983, -10752, -11265, -12031, -12033, -11774, -9987, -8188, -5637, -3068, -1282, -255, 1023, 1793, 3327, 3585, +2815, 1792, 1025, 511, 1025, 1791, 2561, 3326, 4099, 3838, 3329, 3071, 2817, 2559, 1793, 1792, +2814, 3588, 3579, 2565, 1788, 1538, 1024, 255, 770, 1789, 2564, 2555, 2821, 4091, 4869, 5116, +4867, 3837, 2562, 1535, 769, 512, 1023, 2049, 2815, 3329, 4608, 6144, 6912, 5631, 4609, 4352, +5120, 5120, 3840, 1535, -255, -1791, -3331, -4092, -4356, -4605, -5122, -5887, -6656, -6656, -7169, -7423, +-7936, -8448, -8959, -8964, -9979, -10756, -11516, -12292, -12540, -12292, -10493, -7938, -5376, -3838, -2306, -767, +1023, 2561, 3327, 3073, 2303, 1793, 767, 513, 768, 1791, 2817, 3583, 3585, 3583, 3586, 3325, +2050, 1279, 2048, 3073, 3327, 2816, 3329, 2814, 2050, 767, 768, 1025, 1534, 1795, 2045, 2307, +3325, 4354, 5120, 5119, 4609, 4095, 2305, 1023, 1026, 1277, 1282, 1024, 2047, 3842, 5886, 5888, +5122, 4606, 4866, 5373, 5635, 4862, 3586, 1790, -255, -2049, -2814, -3587, -4092, -4612, -5373, -5634, +-6143, -6400, -7168, -7680, -7937, -8190, -8706, -9470, -9730, -10495, -11776, -13056, -13056, -12033, -9726, -7939, +-6141, -4610, -2815, -768, 1023, 2305, 2815, 2817, 2304, 1023, 258, 766, 1537, 2048, 2047, 2818, +4094, 4098, 3070, 2305, 2304, 2048, 2048, 2560, 3328, 3583, 3331, 2299, 1542, 1018, 1285, 1533, +1025, 1024, 1791, 2562, 3069, 4355, 5374, 5377, 4608, 2816, 2559, 2305, 1792, 255, 258, 1278, +3330, 4606, 5121, 5120, 5120, 5121, 5374, 5890, 5886, 5122, 3583, 1536, 1, -1282, -2301, -3075, +-4094, -4609, -4864, -5376, -6143, -6658, -6910, -7426, -7935, -8192, -8448, -8449, -9214, -11010, -12543, -13056, +-12544, -11264, -9984, -8704, -6912, -4863, -3074, -1022, 1022, 2818, 3071, 2304, 1025, 1278, 1282, 767, +768, 1793, 2815, 3584, 3585, 3326, 2818, 2302, 1794, 1791, 2304, 3073, 3837, 3331, 2559, 2304, +2049, 1790, 1281, 1024, 1280, 1280, 1024, 2048, 3840, 5376, 5376, 4096, 4097, 4095, 3328, 1792, +512, 0, 1025, 2046, 3586, 4094, 4865, 4608, 4863, 5378, 5886, 6401, 6145, 4861, 3332, 1788, +516, -1028, -2300, -3076, -3836, -4356, -5117, -5635, -5885, -6146, -7167, -7680, -7937, -7680, -7422, -8195, +-9980, -11524, -12285, -12546, -12287, -11520, -10241, -8447, -7168, -6145, -3071, -257, 1537, 2046, 2051, 2301, +1795, 1021, 515, 764, 1028, 2046, 2817, 3072, 3582, 3842, 2814, 1796, 1532, 2306, 3071, 3328, +3073, 3071, 2816, 2049, 1534, 1795, 2044, 1540, 508, 260, 1789, 3330, 4095, 4095, 4354, 4863, +5120, 4097, 2814, 1281, 513, 510, 1282, 2302, 3329, 4097, 4095, 4096, 4863, 5634, 6399, 6401, +5887, 4864, 3584, 2048, 513, -513, -1791, -2817, -3840, -4352, -4864, -4863, -5633, -6911, -7425, -7680, +-6911, -6913, -7679, -8961, -9726, -11266, -12799, -13056, -12034, -11004, -10756, -10238, -7937, -5376, -3071, -769, +769, 1534, 2307, 2045, 1283, 510, 512, 769, 1023, 1793, 2815, 3585, 3582, 2819, 2045, 2050, +2047, 2303, 2563, 3325, 3586, 2815, 2047, 2306, 2814, 2307, 1021, 2, 255, 1280, 2305, 2815, +3584, 4097, 4863, 5632, 5121, 3839, 2560, 1281, 510, 1026, 2047, 2817, 3070, 3075, 3324, 4612, +5117, 5890, 6398, 6659, 5885, 4867, 3324, 2052, 1021, -254, -1536, -2818, -3837, -3843, -3838, -5377, +-6655, -6913, -6656, -6912, -6912, -6911, -6914, -8446, -10499, -11517, -12034, -11775, -12032, -12032, -11521, -9983, +-7680, -5377, -3326, -1026, 768, 1794, 1790, 1537, 1536, 1023, 513, 257, 1278, 2562, 3070, 3073, +2817, 2558, 2050, 1278, 1794, 2814, 3587, 3068, 2308, 2300, 3075, 3327, 2559, 1283, 508, 515, +1021, 1539, 1790, 2562, 3326, 4353, 5375, 5633, 5120, 3840, 1791, 1025, 1278, 1795, 2301, 2562, +2815, 3329, 3583, 4352, 5376, 6145, 6656, 6399, 5889, 4606, 3844, 3067, 1285, -772, -2046, -2304, +-2817, -3839, -4608, -5121, -5887, -7169, -7167, -6401, -5886, -6403, -7677, -9475, -10493, -11011, -11516, -12293, +-12539, -12293, -11259, -9988, -8446, -5888, -3329, -1279, -1, 1281, 1791, 1794, 766, -254, 254, 769, +1536, 2048, 2816, 3584, 2816, 1792, 1279, 2050, 2813, 2820, 2556, 2051, 2558, 3329, 3328, 2815, +1794, 1277, 1027, 1021, 1027, 1278, 1537, 2302, 3331, 4861, 5635, 5630, 4353, 2815, 2049, 1280, +1535, 1794, 2046, 2306, 2558, 3073, 3328, 4351, 5634, 6653, 6147, 5886, 5889, 5887, 4353, 2303, +1026, 254, -1279, -2048, -2817, -3070, -4354, -5375, -6656, -6912, -6144, -5376, -5889, -6911, -8192, -8705, +-9470, -10755, -11774, -12032, -12290, -12541, -12035, -10493, -7938, -5887, -4097, -1792, 514, 1533, 1283, 766, +768, 513, -1, 513, 1535, 2818, 3324, 2565, 1788, 1794, 2303, 2817, 2559, 2050, 2045, 2562, +3328, 3583, 3074, 2557, 1795, 1277, 1027, 1278, 1025, 768, 1279, 2304, 4097, 5375, 5633, 5376, +4094, 3074, 2303, 2048, 1537, 2047, 2560, 2561, 2047, 2560, 4096, 5121, 5374, 5635, 6652, 6660, +6141, 5378, 4094, 2818, 1535, -255, -1026, -1278, -1794, -3070, -4865, -6400, -6399, -5634, -5630, -5890, +-6398, -6657, -7680, -8960, -9984, -10241, -11005, -12293, -13306, -12806, -11515, -10499, -8958, -6657, -3840, -1536, +-256, 512, 1280, 1024, 256, -768, -1, 1025, 2559, 2561, 2304, 1535, 2050, 2301, 2563, 2045, +1796, 2044, 2307, 3070, 3586, 3582, 3073, 2304, 2048, 2048, 1281, 766, 514, 511, 1279, 3074, +4607, 5120, 5377, 4861, 4355, 2814, 1794, 2302, 2818, 2046, 1793, 1792, 2303, 3074, 3582, 4354, +5118, 6146, 6399, 6655, 6402, 5374, 4611, 2813, 770, 254, 2, -513, -2304, -4096, -5120, -5376, +-5888, -6144, -5633, -5374, -5890, -7167, -7936, -8193, -9214, -10754, -11775, -12544, -12544, -12800, -12543, -11010, +-8702, -6402, -4094, -2305, 0, 1025, 1022, -254, -770, -510, 1023, 1793, 1790, 1538, 1791, 2048, +2305, 2303, 2048, 1794, 1533, 1794, 2815, 3328, 3073, 3072, 2558, 2307, 2300, 2052, 1278, 0, +-256, 769, 1791, 2562, 4349, 5634, 5632, 4351, 3330, 2813, 3075, 2814, 2049, 1791, 1793, 2047, +2305, 2815, 3842, 4860, 5637, 5883, 6405, 7165, 6912, 5377, 3583, 2306, 2045, 1539, 253, -1021, +-2051, -3581, -4867, -5886, -5633, -5119, -5377, -5887, -6402, -6398, -6913, -8447, -9217, -10496, -11007, -12290, +-13053, -13059, -12029, -10755, -9214, -7168, -4609, -1534, 253, 259, -258, -766, -514, 513, 1024, 1280, +1792, 1280, 2048, 2560, 2560, 2048, 1791, 1538, 1790, 2305, 3073, 3325, 2563, 2558, 3073, 3328, +2304, 1535, 1025, 256, 0, 255, 1793, 3840, 4863, 4866, 4606, 4353, 4097, 3582, 3074, 2558, +2306, 2303, 1792, 1536, 2304, 3071, 3842, 4094, 4866, 6142, 7425, 7167, 6146, 4861, 4100, 3068, +2307, 1534, 768, -511, -2817, -4095, -4865, -4864, -5119, -5634, -5630, -5378, -5629, -6660, -7420, -8196, +-8701, -9984, -11522, -12798, -12802, -12798, -12289, -11776, -9983, -6658, -3582, -1537, -769, -765, -1028, -764, +-4, 771, 1022, 770, 1022, 1537, 2048, 2304, 2559, 1538, 1021, 1539, 2558, 2561, 2303, 2306, +3069, 3331, 3070, 2817, 2560, 2047, 514, -514, -511, 768, 2559, 3842, 4350, 4609, 4864, 4607, +3842, 3326, 3074, 3070, 2050, 1278, 1538, 2303, 2559, 2563, 2557, 4097, 5632, 6655, 6658, 6910, +6146, 5117, 4099, 3326, 3073, 2560, 767, -1279, -2561, -3326, -4099, -5117, -5378, -5375, -5120, -5633, +-6142, -6403, -6652, -7429, -8955, -10244, -11261, -11523, -12541, -13314, -13311, -11777, -9472, -6143, -3585, -2047, +-1793, -1280, -767, -514, 2, 511, 511, 515, 1020, 2052, 2557, 2049, 1280, 1279, 1794, 2046, +1794, 2046, 2561, 2816, 2815, 3074, 3582, 3586, 2814, 1026, -2, -510, 254, 1538, 2302, 3330, +4606, 4867, 4348, 4099, 4351, 4096, 3329, 2303, 2048, 2305, 2559, 2049, 1791, 2306, 3325, 4610, +5631, 6913, 7423, 6658, 5629, 4866, 4607, 4608, 3329, 2047, 512, -511, -2050, -3582, -4353, -4608, +-4864, -5120, -5632, -5631, -5378, -5630, -6913, -8192, -8960, -9985, -10494, -11778, -13054, -14082, -13566, -11265, +-8705, -6398, -4353, -2816, -2303, -1794, -766, 0, -1, -512, 0, 1280, 2049, 1791, 1793, 1535, +1792, 1537, 1535, 1536, 2305, 2302, 2306, 2048, 2815, 3840, 4352, 3329, 1791, 769, 254, -254, +-2, 1283, 2813, 3842, 3839, 3839, 4610, 4862, 4354, 3327, 2816, 2816, 2560, 2303, 1794, 2046, +2050, 2047, 3071, 4866, 6398, 6914, 6399, 5887, 5890, 5629, 5124, 4348, 3331, 2558, 1280, -510, +-2307, -3069, -3330, -4608, -5118, -5123, -5117, -4866, -5119, -5888, -7168, -8193, -8190, -8963, -10493, -12546, +-13823, -14337, -13311, -11264, -8449, -6399, -5122, -4094, -2303, -1026, -767, -768, -770, 4, 508, 1028, +1277, 1537, 1536, 1535, 1281, 1280, 1535, 2049, 1791, 1281, 1534, 2563, 3581, 3587, 3582, 3072, +2305, 511, -510, -258, 1025, 2048, 2304, 2816, 3839, 4610, 4862, 4354, 4093, 3587, 3070, 2817, +2560, 2559, 2049, 1280, 1023, 2306, 3837, 5380, 5884, 6146, 6144, 6654, 6147, 5374, 5376, 5121, +4094, 2563, 765, -510, -1793, -2560, -3327, -4865, -5120, -4864, -4352, -4864, -5888, -6400, -6657, -6654, +-7682, -8703, -10496, -12801, -14590, -14081, -12545, -10495, -9216, -7424, -5376, -3328, -2049, -1535, -1537, -1022, +-515, 4, 250, 1031, 1786, 1797, 1532, 1026, 1535, 2050, 2046, 1537, 1023, 1537, 2303, 2562, +3581, 4355, 4350, 3072, 1026, 254, 257, 511, 769, 1279, 2050, 3069, 4098, 4352, 4607, 4610, +3837, 3331, 3325, 3331, 3326, 2305, 1279, 1024, 2049, 3071, 3841, 4607, 6144, 6400, 6401, 6143, +6145, 6142, 5891, 5372, 3844, 2302, 1280, 257, -1025, -2816, -4095, -4609, -4352, -4351, -4865, -5119, +-5633, -6143, -6145, -5888, -6911, -8960, -11777, -13311, -13825, -13311, -12545, -11519, -9729, -7424, -5374, -3844, +-3067, -2309, -1531, -1541, -1275, -516, 515, 1533, 1027, 766, 1281, 1792, 1792, 1535, 1282, 1533, +1284, 1020, 1539, 3070, 4097, 4097, 3070, 2049, 1279, 769, 0, 256, 768, 1279, 2050, 3069, +3844, 4604, 4612, 3837, 3329, 4095, 4354, 3838, 2562, 1790, 1537, 1536, 1792, 2815, 3843, 5115, +5638, 5883, 5891, 5630, 6402, 6654, 5890, 4607, 3839, 3074, 1791, 0, -1792, -2816, -3840, -4351, +-4098, -4094, -4866, -5886, -6145, -5632, -4864, -5888, -7423, -9730, -11773, -12804, -13565, -13568, -12802, -11262, +-9729, -7681, -6141, -4355, -2815, -2559, -2562, -1790, -769, 256, 256, 256, 768, 1280, 1280, 1280, +1535, 1795, 1532, 515, 254, 1026, 2559, 3329, 3838, 3841, 3073, 2047, 1281, 510, 259, 509, +514, 768, 2046, 3587, 4350, 3840, 3841, 3840, 4351, 4354, 3837, 3587, 2558, 1794, 1278, 1282, +1790, 3074, 4351, 5120, 5120, 5377, 6142, 6915, 6652, 6148, 5885, 5378, 4351, 3328, 1792, 257, +-1793, -2816, -3070, -3076, -3835, -4869, -5884, -5890, -5120, -4607, -4865, -6400, -7935, -9474, -11262, -12801, +-13824, -13312, -12799, -11777, -10240, -7935, -5634, -4350, -3840, -3330, -2045, -1283, -766, -258, 259, 1020, +773, 763, 1284, 2045, 2051, 1532, 773, 251, 516, 1790, 2560, 3329, 4095, 3840, 2816, 2048, +1537, 1279, 512, -256, 511, 1795, 2813, 3329, 3329, 3837, 3845, 4347, 4612, 4348, 4099, 3583, +2816, 1793, 766, 1282, 2814, 3331, 3837, 4354, 5119, 5888, 6145, 6399, 6401, 5887, 5633, 5375, +5120, 3585, 1791, -255, -1793, -2047, -2305, -3072, -4606, -5635, -5628, -4868, -4606, -4608, -5121, -5886, +-7682, -9983, -11520, -12545, -13311, -13824, -13568, -11776, -9473, -7678, -6402, -5374, -3842, -3071, -2559, -2050, +-766, -257, -1, 3, 252, 772, 1789, 1793, 1280, 768, 256, 256, 511, 1794, 3070, 3586, +3069, 3076, 3068, 2564, 1533, 257, -256, 0, 1024, 1793, 2302, 2562, 3070, 3842, 4094, 4098, +4351, 4864, 4608, 3328, 1792, 1281, 1534, 2050, 2302, 3074, 3583, 4351, 5123, 6140, 6403, 6399, +6144, 6145, 6398, 6402, 5119, 3073, 1022, 2, -257, -1023, -2561, -4096, -4608, -4864, -5119, -4865, +-4095, -4098, -4606, -6402, -7934, -9217, -10752, -12799, -14083, -14076, -12548, -11516, -9987, -8191, -6656, -5376, +-4608, -3840, -2817, -1278, -771, -509, -770, 1, 768, 1279, 1538, 1789, 1284, -4, -509, 254, +1282, 2046, 2562, 2814, 3329, 3584, 3329, 2302, 1025, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, 256, 256, 512, 256, 0, +1023, 770, 510, 257, 0, 1535, 2050, 510, 513, 0, 511, 1025, 512, -513, -1535, -768, +-1282, -2557, -4099, -4605, -4099, -4606, -4097, -5888, -7422, -6659, -6910, -5121, -6399, -8193, -8446, -7939, +-6653, -6402, -5375, -4864, -5121, -4606, -4354, -4350, -5635, -6397, -4611, -4861, -4865, -5122, -5885, -6147, +-6142, -4608, -3074, -4094, -5121, -6399, -5377, -5120, -5888, -7168, -6655, -5633, -5120, -6144, -5375, -5633, +-4607, -5377, -6912, -4863, -2561, -1791, -3073, -2815, -1281, -1023, -2049, -2047, -1025, 1, -1, 2561, +4607, 5376, 5121, 5886, 6915, 6397, 7170, 7679, 8448, 8448, 8448, 7681, 6910, 5890, 5118, 4097, +4096, 3328, 4352, 5119, 4098, 2813, 3, -1026, 1, 0, 1024, 2559, 3842, 4093, 4100, 4092, +4612, 5373, 3841, 1280, 0, -1279, -3074, -5886, -7426, -7167, -5887, -5122, -5631, -7168, -7169, -4862, +-1282, 1281, 4352, 8447, 12546, 15102, 17922, 20990, 23042, 25854, 29442, 31742, 32002, 31998, 30722, 29694, +28674, 28158, 27394, 24062, 22530, 18943, 13824, 11520, 9216, 7168, 3073, -769, -4352, -9984, -15872, -21503, +-24833, -27392, -29184, -29952, -30976, -30975, -31490, -32254, -30722, -28670, -26114, -24574, -23041, -23296, -24319, -23811, +-22780, -19971, -16895, -12799, -9731, -8700, -5379, -1278, 1534, 2050, 2045, 1285, 250, -250, -1030, -2554, +-3078, -2043, -260, 3, -1, -512, -1536, -2817, -5118, -6914, -6654, -6146, -6910, -8450, -8958, -11265, +-12800, -12800, -11520, -9728, -8447, -6657, -4096, -2048, -512, 1024, 2560, 4352, 6401, 8701, 11011, 12030, +13826, 14846, 15617, 16639, 18434, 20479, 22016, 21504, 19456, 18176, 18177, 18943, 18432, 16897, 12543, 7168, +3841, 1022, -4094, -9473, -12544, -16640, -20735, -23554, -25086, -23810, -22782, -22017, -20992, -19455, -17923, -16380, +-16131, -16382, -17153, -16640, -14592, -11264, -8192, -5632, -2304, 0, 2048, 5375, 8194, 9725, 9732, 9468, +10242, 11520, 11519, 10498, 8957, 8451, 8958, 10241, 10239, 10241, 9215, 7682, 4861, 2307, -3, -1021, +-1538, -2047, -2817, -3839, -5121, -4607, -2816, -1025, 1, 2047, 4609, 7680, 10239, 11777, 13055, 14081, +15616, 16896, 19198, 20740, 22267, 23301, 24061, 23040, 21506, 19710, 18177, 17664, 16639, 15362, 14077, 12548, +10748, 8195, 5887, 3583, 1, -4096, -8705, -13054, -17666, -22271, -25856, -27649, -28926, -29443, -29437, -30465, +-31233, -31230, -30210, -29183, -29696, -30464, -31745, -31741, -29957, -27387, -24067, -19967, -16640, -13825, -11519, -9216, +-6400, -3585, -1279, 0, 768, 767, 770, 765, 1539, 1534, 2305, 2304, 1536, 1535, 512, 1, +-2305, -4862, -7171, -8958, -9985, -10495, -10497, -10495, -9985, -8447, -6145, -3839, -2050, -765, 1533, 4099, +5885, 7426, 8958, 11010, 13567, 16128, 18177, 19966, 22529, 23041, 22269, 21508, 21245, 21249, 21760, 22271, +22273, 22017, 20989, 19460, 18172, 17411, 16126, 14338, 12542, 9731, 6140, 1796, -1539, -3838, -6145, -8192, +-9984, -11776, -13568, -14847, -15106, -15102, -15106, -15102, -15106, -15358, -16130, -16638, -16897, -15616, -14336, -12032, +-9728, -7679, -5889, -4608, -3839, -3074, -2557, -2563, -3325, -3331, -3326, -3328, -3074, -2045, -1794, -1280, +-1279, -2050, -2813, -3331, -3582, -3329, -4609, -6141, -7428, -7932, -8195, -8959, -9472, -9729, -9214, -8193, +-6400, -3841, -1535, 0, 1280, 2560, 4095, 6913, 10240, 12544, 13824, 14847, 15105, 16127, 16898, 16894, +16897, 17151, 17921, 17664, 17407, 16642, 15613, 13828, 12284, 10756, 10493, 9217, 7169, 4350, 770, -3074, +-7166, -9730, -11517, -13316, -15101, -16897, -18177, -18173, -17923, -18174, -19201, -19968, -20736, -21759, -22017, -21760, +-21760, -21248, -19968, -17919, -16131, -14332, -11268, -8957, -8193, -6913, -5630, -3586, -2302, -2306, -2302, -2305, +-1536, -767, -2, 769, 1281, 1791, 2305, 2046, 2306, 2046, 2307, 2557, 1794, 511, -768, -1279, +-1538, -2302, -2817, -1791, -1, 2305, 4095, 4865, 5376, 6400, 8191, 10242, 12285, 13828, 14588, 15363, +16126, 16129, 16639, 17409, 17919, 18177, 17664, 17406, 17923, 19197, 19715, 19197, 16899, 16124, 16132, 16125, +15363, 12285, 8194, 4606, 2818, 510, -2045, -4868, -7419, -8197, -8957, -9729, -9728, -9727, -9985, -11008, +-12800, -14848, -17408, -20223, -23042, -25854, -28674, -30206, -29442, -28670, -27137, -26624, -25599, -23810, -22014, -19969, +-17919, -16385, -14336, -12799, -11777, -10240, -8959, -7426, -5885, -4355, -3326, -1793, -1024, 1, 767, 1280, +2561, 3326, 3330, 2814, 1538, -1, 0, 768, 3328, 6144, 8705, 9215, 9984, 12033, 14591, 17153, +17407, 17408, 17920, 18689, 18942, 18690, 17663, 17408, 16385, 16126, 16897, 17921, 19455, 20736, 20738, 19452, +18947, 19712, 21758, 23043, 22269, 19714, 16128, 13311, 11009, 8447, 6657, 4608, 2047, 1, -768, -1537, +-2047, -2560, -3329, -3070, -3330, -5375, -8448, -12288, -16128, -18944, -21760, -24576, -26625, -28158, -28930, -29694, +-30466, -31487, -31745, -31230, -30467, -30205, -30211, -30205, -29442, -28927, -28417, -27903, -26113, -23039, -19969, -17151, +-16128, -15361, -13823, -11777, -10239, -9728, -9729, -9727, -9728, -9729, -8703, -5889, -2303, 768, 2559, 4609, +8448, 13567, 17153, 18944, 20224, 21504, 23295, 24578, 24573, 23812, 22524, 21763, 21247, 20991, 21506, 21757, +21508, 19709, 17410, 16894, 18177, 20224, 22016, 22273, 20990, 19458, 17919, 16640, 15616, 14849, 13566, 11267, +9725, 8962, 8958, 8963, 8189, 7170, 6912, 6398, 5636, 3323, 516, -3330, -8191, -12288, -15618, -18173, +-20994, -23039, -24321, -25343, -26625, -26878, -26882, -25855, -25345, -25599, -25601, -25599, -25600, -25601, -25600, -24831, +-21761, -18431, -15616, -13570, -11261, -8451, -5629, -3330, -1791, -1025, -512, -510, -1026, -256, 1026, 3068, +4613, 5884, 8449, 11522, 15101, 18434, 20479, 21761, 22527, 23040, 23041, 22526, 21251, 19709, 17666, 15871, +14848, 14849, 15103, 13824, 11521, 8958, 7427, 7421, 8451, 9213, 9986, 9984, 9727, 8706, 7934, 7169, +6400, 5120, 4096, 2817, 2303, 1791, 1283, 1276, 1028, 1278, 1792, 2049, 1279, -512, -3839, -7938, +-11773, -15875, -19454, -22272, -25090, -27389, -29442, -30976, -31743, -30977, -29950, -29442, -28671, -28161, -28159, -28416, +-28929, -28927, -27905, -25598, -23043, -20221, -17922, -14336, -11006, -7427, -4349, -1795, 3, 1022, 1537, 2047, +2816, 4097, 5375, 6657, 8191, 9984, 12801, 15871, 18689, 20991, 23040, 24577, 25343, 25345, 24575, 23297, +21759, 19456, 17153, 15615, 14850, 14332, 13061, 10748, 8450, 7168, 7167, 7425, 8448, 9726, 11267, 12286, +12802, 13309, 13827, 13565, 13060, 12284, 11524, 11260, 10756, 10236, 9475, 9215, 9216, 9216, 9217, 8958, +6402, 3071, -769, -5630, -10242, -14847, -18432, -21760, -24577, -27391, -29440, -30466, -30204, -29700, -28669, -27905, +-27137, -26623, -27392, -28160, -28161, -27902, -26627, -25085, -23042, -20735, -17921, -14591, -11521, -8703, -5632, -3073, +-1535, -769, 2, 509, 1283, 1534, 2049, 2303, 3585, 5119, 7170, 8958, 11265, 13568, 15871, 17154, +17918, 17666, 16895, 15615, 13571, 11772, 10756, 9980, 9732, 8701, 7427, 6140, 5635, 5630, 6402, 8192, +9981, 11781, 13050, 14341, 15357, 15873, 15872, 15616, 14848, 14079, 13058, 12798, 12289, 11776, 11263, 11266, +11519, 11775, 11522, 9982, 7937, 4352, 0, -4353, -9214, -13058, -16383, -19711, -23043, -25596, -27140, -27645, +-27649, -26625, -25598, -24322, -24063, -24065, -24574, -25603, -25596, -25605, -25083, -24324, -23037, -20994, -18943, -16129, +-13822, -11011, -8701, -6658, -5120, -3839, -2561, -1535, -770, -253, -4, 772, 2301, 4097, 6144, 8448, +11008, 13312, 15615, 17410, 18686, 18690, 17406, 15618, 13566, 12546, 11518, 11266, 10495, 9472, 8192, 7424, +7424, 7937, 9470, 11523, 12796, 14083, 15615, 16639, 17667, 18173, 18177, 17408, 16384, 15616, 14848, 14336, +13312, 12799, 12290, 12029, 12292, 12795, 12037, 11516, 8963, 5631, 1534, -2557, -6658, -10751, -14847, -18179, +-22013, -24579, -26365, -27138, -27135, -26112, -25345, -24831, -25088, -25856, -26624, -27392, -27905, -27903, -27903, -27139, +-25852, -24068, -21500, -18949, -16122, -13831, -11769, -9988, -8448, -6910, -5378, -4351, -3583, -3586, -3070, -2050, +-254, 1790, 4099, 6652, 9220, 12028, 15108, 17661, 18689, 18945, 17918, 16642, 15358, 14337, 14080, 13312, +12544, 11264, 9983, 8961, 8704, 9216, 10240, 11264, 12031, 13058, 14078, 15362, 16126, 16642, 16382, 15875, +15100, 14597, 13819, 13572, 13310, 12800, 12802, 12798, 12800, 13569, 13055, 11778, 9725, 6659, 3069, -1022, +-4864, -8961, -12542, -16643, -19709, -22787, -24829, -25601, -25601, -25598, -25602, -25855, -26625, -27646, -28931, -29692, +-30468, -31229, -31746, -31232, -29951, -27904, -25344, -22784, -19713, -17663, -14849, -12287, -9729, -6911, -4865, -3071, +-1793, -767, -2, 1283, 3324, 5125, 7164, 9474, 12032, 14846, 17154, 19200, 19710, 19203, 18173, 17154, +15871, 14849, 14334, 13314, 12030, 10753, 9217, 8958, 8961, 9216, 9728, 10240, 10496, 11264, 12287, 13315, +13564, 14084, 14333, 14337, 14336, 14591, 15362, 15870, 16898, 17406, 18177, 18688, 19456, 19712, 19456, 18432, +15872, 12544, 8448, 3841, -514, -5118, -9474, -14078, -18433, -22016, -24320, -26112, -26880, -27392, -28160, -28929, +-29950, -30723, -31485, -32003, -32253, -32259, -32253, -31236, -29179, -26885, -24059, -21508, -18941, -16642, -14079, -11520, +-8960, -6144, -4352, -2560, -1536, -512, 256, 1535, 3075, 4604, 6404, 8444, 10755, 13055, 14592, 15616, +15104, 14080, 12800, 11264, 9727, 8450, 7166, 5889, 4608, 3584, 3072, 3329, 4093, 4868, 5629, 6146, +6911, 7936, 8961, 9983, 10752, 11264, 11776, 12289, 12798, 13827, 15356, 16644, 17916, 18948, 19709, 20738, +21503, 21247, 21250, 20222, 17666, 14590, 11009, 6911, 2562, -1538, -5887, -10752, -14850, -18428, -20484, -22269, +-23554, -24831, -25857, -27135, -27649, -28671, -29185, -29950, -30211, -30205, -29442, -27647, -25089, -22270, -19970, -17151, +-14847, -12291, -9981, -7426, -5375, -3329, -2047, -768, -1, 514, 1532, 2564, 3582, 4865, 6400, 8703, +10752, 12289, 13567, 14081, 13568, 12287, 10753, 9214, 7939, 6654, 5377, 4095, 2561, 1791, 1282, 1533, +2050, 2560, 3327, 4098, 4861, 5890, 6912, 7935, 8962, 9982, 10497, 11520, 12544, 14080, 15616, 17152, +18687, 19970, 20990, 21762, 22526, 22785, 22272, 20480, 17664, 14592, 10752, 6656, 2048, -2560, -7424, -11776, +-15872, -18688, -20992, -22784, -23809, -25086, -26370, -27134, -27906, -28671, -29440, -30208, -30721, -30463, -28929, -27391, +-24832, -22529, -19967, -17665, -15615, -13569, -11520, -9215, -7169, -5631, -4097, -2817, -1789, -771, 3, 509, +1282, 2559, 4353, 6399, 8193, 9727, 10753, 11008, 11007, 10496, 9729, 8704, 7679, 6658, 5372, 3845, +2812, 2818, 2816, 2815, 3841, 4608, 5630, 6403, 7422, 8449, 9727, 10497, 11263, 11778, 12285, 13059, +13822, 15104, 16642, 18173, 19971, 21502, 22528, 23553, 24319, 24321, 23295, 21504, 19201, 15870, 12035, 7933, +3330, -1281, -5887, -9985, -14079, -16897, -18943, -20992, -22528, -24065, -25343, -26113, -26878, -27906, -28927, -29441, +-29695, -29441, -27903, -26369, -24831, -22785, -20991, -19201, -17408, -15359, -13312, -11265, -9471, -7682, -6141, -4866, +-3839, -2816, -2305, -1790, -1026, 1, 1792, 3584, 5631, 7170, 8703, 9471, 10243, 9979, 9477, 8701, +7681, 6145, 4606, 3329, 2304, 1536, 1537, 2302, 3074, 4350, 5122, 6655, 7680, 8960, 9728, 10752, +11264, 11519, 12289, 12800, 13824, 15360, 17151, 18945, 20992, 22785, 24319, 25600, 26112, 26112, 24576, 22785, +20223, 17152, 13313, 8702, 3843, -1027, -5374, -9729, -13055, -16129, -18688, -20479, -22274, -23805, -24579, -25343, +-25855, -26882, -27646, -28417, -28160, -27391, -26370, -24830, -23554, -21758, -20225, -18432, -16895, -15106, -13309, -11267, +-9470, -7425, -5887, -4097, -3326, -2564, -2043, -1541, -251, 764, 2050, 3839, 5377, 7167, 8449, 9471, +9729, 9727, 8962, 7933, 6659, 5118, 3329, 1792, 255, 1, 0, -1, 1026, 2046, 3073, 4351, +5121, 6143, 7170, 7934, 8193, 8703, 9473, 10239, 11522, 13053, 14851, 17149, 19202, 21247, 23297, 24574, +25347, 25341, 24578, 23039, 20992, 17921, 14335, 10241, 5374, 770, -3329, -7167, -10497, -13824, -16639, -18433, +-20222, -21507, -22525, -23298, -24576, -25342, -26115, -26109, -26115, -25342, -24577, -23296, -22015, -20482, -18942, -17665, +-16128, -14336, -13312, -11264, -9471, -7938, -6398, -5378, -4350, -3585, -3072, -2048, -1024, 0, 1281, 3071, +4352, 5888, 7168, 7937, 8191, 7936, 7424, 6400, 5121, 3326, 1794, 254, -511, -1280, -1537, -1278, +-515, 4, 1276, 2306, 3072, 4351, 5122, 5886, 6657, 7680, 8448, 9983, 11522, 13309, 15620, 17916, +20483, 22782, 24833, 26368, 26880, 26880, 26623, 25345, 23551, 20227, 17149, 13057, 8704, 4352, 256, -3583, +-7169, -10495, -13057, -15103, -16897, -18431, -19712, -20994, -22525, -23811, -24573, -24579, -24830, -24577, -23553, -22781, +-21508, -20220, -18947, -17663, -16128, -14847, -13570, -11774, -10241, -8704, -7423, -6657, -5888, -5119, -4352, -3842, +-2814, -2049, -1024, 258, 1789, 3074, 4094, 4866, 4862, 5122, 4607, 3583, 2562, 1021, -509, -1794, +-2815, -3329, -3327, -3073, -2047, -1025, 0, 1025, 2048, 3071, 3841, 4607, 5377, 6400, 7935, 9730, +11262, 13313, 16128, 18943, 22017, 24576, 26623, 28161, 29184, 29438, 29187, 27901, 25603, 22526, 18689, 14336, +9982, 5635, 1022, -2815, -6912, -9729, -12544, -14591, -16385, -17919, -19457, -20735, -22017, -23039, -24064, -24065, +-24062, -24066, -23295, -22016, -21248, -20225, -18942, -17667, -16381, -15105, -13569, -11775, -10497, -9215, -7936, -7168, +-6145, -5631, -4608, -4097, -3326, -2307, -1021, -2, 1794, 2813, 3843, 4093, 4867, 5118, 4098, 3837, +2307, 1021, 3, -1026, -1791, -2560, -2561, -1790, -1283, -509, 510, 1282, 2045, 2563, 3326, 3585, +4609, 5628, 6918, 8697, 10503, 12539, 15618, 18432, 21503, 24321, 26368, 28415, 29441, 30208, 29695, 28417, +26111, 23297, 19200, 15103, 10753, 6143, 2050, -2306, -5887, -9216, -11777, -14078, -16130, -17919, -19712, -21249, +-22527, -23552, -24577, -25087, -25089, -24575, -23808, -22785, -21759, -20737, -19455, -18176, -16897, -15359, -14081, -12799, +-11521, -10239, -9216, -8193, -7422, -6403, -5629, -4866, -4094, -3074, -1791, -512, 768, 1792, 2560, 3327, +3330, 3326, 3330, 2815, 1792, 768, -512, -1280, -2303, -2561, -2560, -2048, -1280, -255, 511, 1536, +2048, 2560, 3328, 4097, 4863, 6144, 7424, 9216, 11009, 13054, 16386, 19198, 22273, 25345, 27901, 29699, +30974, 31745, 31232, 29951, 27905, 25088, 21247, 17154, 12541, 7939, 3326, -767, -4097, -7678, -10755, -13054, +-15361, -17663, -19713, -21247, -22529, -23552, -24318, -25091, -24830, -24065, -23296, -22527, -21505, -20480, -19455, -18178, +-17150, -15873, -14592, -13311, -12290, -11006, -9985, -8960, -7936, -6913, -6143, -5120, -4096, -3073, -1790, -772, +261, 1021, 1793, 2561, 2557, 3331, 2815, 2304, 1280, 255, -766, -1793, -2559, -3075, -3324, -2821, +-2298, -1541, -509, -2, 513, 1023, 2050, 2814, 3841, 5120, 6655, 8194, 10494, 13058, 16126, 19714, +22526, 25601, 27905, 30206, 31490, 31742, 31234, 29693, 27396, 24572, 20483, 16127, 11519, 6913, 2560, -1281, +-5119, -8192, -11009, -13566, -15875, -17661, -19971, -20989, -22274, -23038, -23555, -23805, -23043, -22781, -21505, -20481, +-19455, -18176, -17154, -15868, -14853, -13563, -12292, -11517, -10242, -9215, -8193, -7166, -6146, -5374, -4610, -3838, +-2818, -1790, -1025, -256, 257, 1023, 1536, 1793, 2558, 2307, 1533, 1026, 254, -766, -1794, -3070, +-3842, -4095, -4096, -4097, -4095, -3073, -2559, -1793, -1022, -260, 517, 1531, 3076, 4350, 6144, 8192, +10496, 13313, 16126, 19714, 22526, 25345, 27905, 29694, 30722, 30718, 29698, 28158, 25602, 22270, 18435, 13821, +9474, 4606, 514, -3330, -6653, -9476, -12284, -14594, -16385, -18174, -19458, -20478, -21248, -21506, -21502, -21250, +-20478, -19458, -18174, -17154, -15870, -14849, -13825, -12798, -11522, -10750, -9985, -8959, -8450, -7422, -6401, -5632, +-4863, -4098, -3327, -2303, -1538, -1022, -257, -2, 772, 764, 772, 1533, 769, 768, 255, -254, +-1282, -2558, -3586, -4606, -5378, -5886, -5890, -5886, -4866, -4350, -3585, -2817, -1790, -770, 1, 1536, +3071, 4353, 6655, 8449, 11007, 13825, 17150, 19971, 23037, 25858, 27903, 29440, 29953, 29951, 28929, 27135, +24576, 21249, 16895, 12801, 8191, 3585, -1, -3327, -6913, -9727, -12033, -14079, -15873, -17151, -18434, -19197, +-19715, -19965, -19971, -19197, -18179, -17148, -15877, -15099, -14084, -13053, -12290, -11519, -10497, -9983, -9217, -8703, +-8449, -7680, -7168, -6656, -5887, -5121, -4609, -3838, -2818, -2046, -1282, -767, -769, -766, -770, -767, +-769, -1023, -1536, -2560, -3584, -4609, -6143, -6911, -7938, -7933, -7940, -7932, -7428, -6652, -5635, -4863, +-3840, -2561, -1022, 254, 1793, 3840, 5887, 8451, 11004, 14340, 17148, 20996, 23806, 26880, 29185, 30974, +31746, 31743, 30465, 28670, 26114, 22783, 18688, 14081, 9727, 5376, 1793, -1793, -5119, -7681, -9983, -12034, +-13821, -15107, -16381, -17155, -17662, -18177, -17920, -17151, -16385, -15615, -14593, -13824, -13055, -12290, -11517, -10755, +-9982, -9729, -8960, -8960, -8447, -7938, -7677, -6916, -6396, -5379, -4606, -3585, -2304, -1280, -512, 0, +0, 256, 0, -1, 1, -512, -1281, -2302, -3586, -4863, -6400, -7681, -8702, -9218, -8958, -9219, +-8700, -8197, -7674, -6661, -5630, -4351, -3331, -1533, -2, 1793, 4096, 6656, 9216, 12543, 15361, 18944, +22783, 25602, 27902, 29441, 30464, 30464, 29439, 27906, 25341, 21764, 18172, 14082, 9985, 5884, 1798, -775, +-4090, -6148, -8702, -10496, -12546, -13821, -15108, -16123, -16900, -17150, -17153, -16896, -16127, -15616, -15106, -14333, +-13571, -13054, -12288, -11523, -10747, -10501, -9724, -9987, -8958, -8962, -8189, -7683, -6910, -6145, -5120, -3839, +-2561, -1535, -257, 1, 511, 768, 770, 765, 3, -2, -768, -2046, -3331, -4350, -5633, -6911, +-7681, -8191, -7938, -8190, -7937, -7424, -6912, -6143, -5122, -4093, -2819, -1022, 511, 2305, 4607, 6913, +9984, 13311, 16129, 19968, 23295, 26370, 28413, 29955, 30718, 30722, 29694, 27905, 25344, 22528, 18433, 14334, +10497, 6145, 2814, 3, -3075, -5631, -7935, -9986, -12030, -13313, -14848, -15871, -16642, -17149, -17155, -16893, +-16387, -15869, -15363, -15101, -14082, -13823, -13056, -12546, -11772, -11269, -10491, -10756, -9982, -9728, -8961, -8447, +-7937, -6911, -5632, -4609, -3582, -2307, -1789, -1026, -767, -768, -768, -1024, -1536, -2048, -2816, -3583, +-4610, -5629, -6659, -7422, -7937, -7936, -7935, -7681, -7168, -6656, -5632, -4863, -3586, -2558, -1026, 514, +2302, 4097, 6400, 8960, 11520, 14592, 17663, 21250, 24318, 27138, 28926, 30466, 30975, 30975, 29698, 28158, +25602, 22016, 18429, 15108, 10748, 6916, 3326, 256, -2560, -5377, -7422, -9728, -11778, -13309, -14596, -15869, +-16641, -16896, -16640, -16895, -16386, -15614, -15106, -14591, -14079, -13314, -12798, -12034, -11519, -11008, -10496, -10496, +-10497, -9727, -9729, -9470, -8706, -8192, -6911, -5889, -5118, -4354, -3583, -3329, -3327, -3329, -3327, -3329, +-4095, -4353, -4864, -5631, -6401, -7168, -7935, -8706, -8702, -8705, -8704, -7935, -7425, -6657, -5629, -4867, +-3581, -2307, -510, 1023, 2818, 4606, 6912, 9473, 12544, 15359, 18434, 22013, 25091, 27646, 29442, 30973, +31748, 31484, 30212, 28668, 26371, 23038, 19458, 15103, 11263, 7938, 4350, 769, -2047, -4610, -7167, -8960, +-10753, -12542, -13826, -14847, -15617, -15871, -15617, -15103, -14593, -13823, -13313, -12287, -11521, -11007, -10241, -9470, +-8707, -7933, -7938, -7936, -7934, -7938, -7934, -7427, -6908, -6661, -5883, -5379, -4608, -4094, -3330, -3583, +-3329, -3583, -4353, -4350, -5122, -5376, -6143, -6657, -7166, -7682, -8447, -8961, -8703, -8960, -8449, -7935, +-7424, -6912, -6144, -5377, -4351, -3072, -1792, 0, 1279, 3330, 5374, 7682, 10494, 13313, 16640, 19712, +22784, 25087, 27138, 28158, 29186, 28669, 27651, 25854, 23298, 20222, 16897, 12800, 8704, 5376, 1535, -1534, +-4354, -6654, -8962, -10751, -12800, -14336, -15360, -16641, -17151, -17151, -16899, -16124, -15364, -14590, -13824, -12800, +-12033, -11006, -10242, -9216, -8446, -7683, -7166, -7424, -7425, -7423, -7426, -6654, -6402, -6141, -5379, -4606, +-3586, -3071, -2303, -1794, -1789, -2564, -2812, -2564, -3324, -3844, -4092, -4867, -5118, -5890, -5629, -6660, +-6652, -6659, -5630, -5889, -5631, -4866, -4350, -3329, -2559, -1538, 2, 1534, 3074, 5119, 7424, 9983, +12802, 15870, 19713, 22784, 25855, 28418, 30461, 31491, 31742, 31489, 30464, 28159, 25346, 21757, 17667, 13821, +9219, 4863, 767, -2303, -5377, -8191, -10497, -12542, -14595, -16125, -17411, -18173, -18946, -18687, -17922, -17405, +-16387, -15356, -14340, -13566, -12545, -11775, -11009, -9982, -9219, -8701, -8962, -8703, -8961, -8703, -8961, -8702, +-8962, -8703, -7937, -6911, -6144, -5121, -4862, -4867, -4861, -4866, -4864, -4861, -5125, -5882, -5638, -6908, +-6657, -7169, -7933, -7941, -7930, -7942, -7675, -7940, -7164, -6915, -6654, -5634, -4862, -3842, -2557, -771, +514, 2559, 4864, 7424, 10496, 13824, 17409, 20734, 24066, 26622, 28674, 30207, 30720, 30465, 29439, 27392, +25088, 21761, 17919, 13824, 9985, 5886, 2307, -771, -3839, -6399, -8705, -10496, -12287, -13314, -14334, -14849, +-15360, -14847, -14338, -13310, -12290, -11006, -9985, -9216, -8192, -7168, -6144, -5120, -4352, -3840, -3840, -3840, +-4096, -4864, -4864, -4864, -4864, -4864, -4352, -3583, -3074, -2302, -1793, -1792, -1791, -1793, -2049, -2812, +-3078, -3834, -4357, -5373, -5889, -6656, -7168, -7936, -7936, -8959, -8705, -8959, -8705, -8959, -8705, -8191, +-7425, -6654, -5634, -4095, -2561, -767, 1535, 4098, 6910, 10497, 13824, 17407, 20481, 23040, 24832, 26623, +26882, 26621, 25347, 23550, 20993, 17664, 13824, 11007, 6146, 2557, -764, -4355, -6654, -9474, -11518, -13057, +-14591, -15873, -16639, -17154, -16893, -16130, -15104, -14079, -12801, -11519, -10240, -8961, -7935, -6657, -5630, -4610, +-4095, -3072, -3073, -3070, -3330, -4094, -4099, -4092, -4100, -4092, -3331, -2814, -2050, -1022, -769, -1024, +-766, -1028, -764, -1539, -2302, -3073, -3839, -4866, -5630, -6658, -7422, -8449, -8704, -9473, -9725, -9732, +-9724, -9732, -9724, -8963, -8446, -7169, -5888, -4351, -2305, 1, 2303, 5633, 8960, 13054, 16899, 20733, +24323, 26877, 29443, 30716, 31749, 31228, 29953, 28162, 25085, 21763, 17661, 14083, 9724, 5381, 1019, -2043, +-5125, -7932, -9987, -11774, -13569, -14335, -15361, -15359, -15361, -14336, -13567, -12289, -11007, -9985, -8703, -7425, +-6655, -5377, -4607, -3585, -3071, -3329, -3071, -3072, -3585, -4863, -5377, -6143, -6657, -6399, -5632, -5122, +-4348, -4101, -3068, -3330, -3071, -3585, -4350, -4611, -5373, -6146, -7167, -7937, -8959, -9985, -10751, -11521, +-12288, -13055, -13058, -13054, -13057, -13056, -13055, -12034, -11262, -9985, -8704, -6656, -4864, -2303, 254, 3587, +7419, 11014, 15099, 19204, 22013, 25345, 27393, 28926, 29698, 29439, 28160, 26113, 23550, 20482, 16383, 12544, +8706, 4093, 770, -2049, -4865, -7421, -9218, -10752, -11775, -13058, -13054, -13057, -12800, -12031, -11009, -9728, +-8447, -7169, -6143, -4864, -3841, -2815, -2048, -1025, -1022, -1026, -1022, -1026, -2047, -2816, -3584, -4352, +-4352, -4096, -4352, -3841, -3071, -2816, -2048, -2048, -2048, -2049, -2814, -3330, -3839, -4608, -5631, -6401, +-7423, -8193, -8961, -9725, -10243, -11005, -10754, -11008, -10751, -11010, -10493, -9732, -8955, -7429, -6141, -4609, +-2304, 1, 2815, 5632, 8960, 12800, 16384, 19713, 22526, 24835, 26877, 28161, 28672, 27648, 26113, 24319, +21504, 17920, 14081, 9727, 5377, 1535, -1791, -5121, -7679, -9985, -12286, -13827, -14845, -15875, -16637, -16643, +-15613, -15107, -14078, -13056, -11777, -10495, -9217, -8448, -7422, -6402, -5119, -4352, -3585, -3326, -3330, -3838, +-4610, -5375, -6143, -6915, -6908, -6915, -6143, -5632, -4864, -4352, -3328, -3328, -3328, -3328, -3328, -3584, +-4608, -4864, -5888, -6400, -7680, -8191, -9218, -9726, -10497, -10751, -10752, -10754, -11005, -10755, -9726, -8960, +-7681, -6399, -4865, -2817, -254, 2048, 5119, 8961, 12543, 16639, 20227, 23549, 26626, 28928, 30974, 31747, +31741, 31234, 29440, 27135, 23809, 20479, 15617, 11263, 7169, 2559, -1023, -4865, -7679, -10497, -12287, -14081, +-15359, -15872, -16384, -16129, -15615, -14848, -13313, -12286, -11010, -9983, -8447, -7427, -6140, -4867, -3583, -2815, +-2049, -1279, -1025, -2048, -2303, -3329, -3584, -4607, -4866, -4861, -4355, -3326, -3329, -2304, -2303, -2305, +-2304, -2303, -2305, -3327, -4097, -4864, -5887, -6913, -7935, -8961, -9983, -10754, -11773, -12291, -12029, -12291, +-12030, -12033, -12032, -11263, -10241, -8960, -7679, -5634, -3325, -771, 2306, 5631, 9217, 12798, 16642, 19966, +23042, 25087, 26879, 27906, 28157, 27652, 26108, 24068, 21244, 17667, 13822, 9730, 5630, 1537, -1792, -5120, +-8192, -10496, -12545, -14078, -15362, -15870, -15618, -15870, -15618, -14590, -13570, -12286, -11010, -9726, -8449, -6911, +-5889, -4352, -3071, -1793, -1022, -514, 1, -513, -1022, -1283, -2300, -2308, -2301, -2306, -2303, -2304, +-1536, -1024, -1281, -1022, -1282, -1023, -1279, -2306, -2815, -3840, -4864, -6144, -6912, -8448, -9473, -10238, +-10753, -11522, -12284, -12036, -12029, -12033, -12033, -11006, -10243, -8700, -7684, -5629, -3586, -766, 1789, 5380, +8699, 12294, 15866, 18949, 21756, 24067, 25599, 26623, 26881, 26368, 25088, 23040, 20480, 17407, 14082, 10238, +6402, 2813, -253, -3586, -6399, -8704, -10754, -12541, -13571, -14589, -15362, -14847, -14081, -13311, -12289, -11262, +-10242, -8959, -7680, -6401, -5119, -3584, -2049, -1022, -2, 1, 0, -1, 2, -1283, -1789, -2819, +-2557, -2818, -2559, -2818, -2557, -2819, -2556, -2821, -2556, -3587, -4349, -4866, -6143, -6913, -8448, -9983, +-11265, -12287, -13312, -14850, -15357, -16131, -17149, -17154, -17152, -17407, -16386, -15869, -15107, -13054, -11777, -9472, +-6911, -3074, 514, 4608, 9214, 13827, 17917, 22274, 25857, 28669, 30723, 31997, 31747, 31742, 30465, 28416, +25087, 21250, 16893, 12803, 7934, 3586, -514, -4350, -7426, -10751, -13311, -14851, -16124, -17411, -17663, -16384, +-15616, -14593, -12798, -11266, -9727, -8192, -6401, -4862, -3074, -1279, 0, 1792, 3072, 3072, 3071, 3074, +2047, 1024, 0, -1280, -1536, -2816, -3071, -3074, -3070, -3074, -3071, -2815, -4097, -4864, -4608, -5888, +-6911, -7937, -8960, -10496, -11519, -13058, -14078, -14850, -15871, -15872, -15872, -17153, -16894, -15619, -16125, -15106, +-14078, -12802, -11006, -8962, -6143, -2816, 512, 4609, 8959, 13055, 17410, 21246, 24835, 27133, 28930, 30206, +30209, 29952, 28159, 26115, 23292, 19203, 15613, 11267, 6654, 2562, -1282, -4862, -8195, -11260, -13828, -15612, +-16899, -17407, -17408, -16640, -15360, -14080, -12289, -11006, -9219, -7677, -5634, -4096, -1791, -257, 1536, 3073, +4095, 4865, 4607, 4097, 2814, 1796, 507, -506, -1542, -2300, -3330, -2815, -4608, -4609, -4863, -4608, +-4865, -4351, -5889, -6144, -7166, -7939, -8958, -10497, -11520, -12543, -13313, -14336, -14336, -15871, -15873, -15872, +-15872, -15872, -15871, -14593, -13823, -12802, -11006, -8961, -5888, -2558, 508, 4613, 8955, 13316, 17149, 20994, +23807, 26369, 28158, 28674, 28671, 28417, 26879, 24832, 21761, 18430, 14595, 10493, 6146, 2048, -2049, -5887, +-8960, -12034, -14333, -16130, -17663, -17408, -17665, -17407, -16129, -14847, -13569, -11519, -9984, -8193, -6654, -4099, +-2557, -258, 770, 2813, 3075, 4349, 3843, 3070, 2816, 1025, -1, -1280, -2304, -3327, -3841, -5119, +-4866, -5118, -4865, -5119, -4865, -5120, -4864, -5375, -6658, -6909, -8195, -8959, -9983, -11010, -12029, -12291, +-13822, -13825, -14080, -13823, -14082, -14077, -14084, -14076, -13571, -11775, -10495, -7938, -5375, -1792, 2560, 6400, +11008, 15616, 19711, 23555, 26620, 28676, 30716, 31748, 31741, 30722, 28671, 26624, 23552, 19712, 15615, 11267, +6396, 1540, -2308, -6653, -11010, -14079, -16384, -18944, -19456, -20992, -19712, -19200, -18176, -16384, -14847, -12801, +-11263, -9218, -7166, -5121, -3071, -1281, 768, 1537, 3071, 3329, 3583, 2304, 1281, -1, -1278, -2818, +-3839, -5121, -5119, -6656, -7168, -6912, -6913, -6911, -5377, -5118, -5378, -5119, -5889, -7168, -6654, -8195, +-8701, -9219, -10749, -10498, -12031, -12289, -12288, -12287, -12289, -12287, -12289, -12287, -12289, -10752, -9471, -6913, +-4095, -1025, 3073, 6911, 11264, 15362, 19965, 22788, 25851, 28165, 29692, 29956, 30205, 29441, 27649, 25086, +21506, 17919, 14592, 9985, 5630, 1026, -3074, -7422, -11009, -14591, -16898, -18685, -19460, -20731, -19717, -19196, +-18179, -16382, -14848, -12801, -11776, -9215, -7682, -5629, -3586, -1791, -256, 1535, 1537, 1791, 1537, 1792, +511, -511, -1793, -2815, -4354, -5117, -6148, -7163, -6916, -6910, -6913, -6911, -6913, -6910, -5635, -4861, +-5891, -7164, -6915, -6910, -7938, -8958, -8706, -10237, -10499, -10494, -10497, -10496, -10751, -12290, -10749, -10500, +-10492, -8963, -7679, -5120, -2560, 513, 4863, 8705, 13054, 17154, 20736, 24319, 27137, 28928, 30207, 29953, +30207, 29696, 27649, 25088, 21758, 17923, 14588, 9989, 5627, 1028, -3074, -7168, -11006, -14340, -17148, -18947, +-20477, -21250, -21248, -20479, -19202, -17918, -16384, -14849, -12799, -11265, -9215, -7680, -5632, -3584, -2304, -768, +1, -2, 2, -1, -1279, -2049, -3327, -4354, -5630, -6912, -6913, -8447, -8961, -8703, -8961, -7935, +-6913, -6911, -6912, -6913, -6911, -6913, -6912, -7166, -8707, -8701, -8450, -9728, -10495, -10498, -10493, -10498, +-10495, -10497, -10496, -10495, -9729, -8447, -7169, -4352, -1791, 1279, 5377, 9471, 13568, 17921, 21503, 24577, +27392, 29439, 30209, 31743, 30722, 29437, 27907, 25853, 22530, 18944, 15358, 11523, 7164, 3075, -1025, -5120, +-9472, -12031, -15362, -17150, -18690, -19455, -19455, -18945, -17664, -16384, -15360, -13824, -12287, -10754, -8958, -7170, +-5374, -3585, -2047, -514, 2, -2, 3, -3, -510, -1793, -2559, -4097, -4863, -5889, -6911, -7169, +-8703, -8705, -8702, -8451, -6909, -6915, -6910, -6912, -6914, -6909, -8450, -8960, -8447, -9474, -10494, -10497, +-10495, -10498, -12030, -12289, -12289, -12285, -12292, -12284, -10754, -9984, -7935, -5889, -3071, -257, 3841, 7423, +11521, 15359, 18944, 21761, 24063, 26113, 26623, 28160, 27137, 26112, 24575, 22273, 19711, 16129, 12800, 9214, +5635, 1533, -2045, -5635, -9214, -12289, -14591, -16640, -17665, -17407, -17409, -17663, -16639, -15106, -13823, -12032, +-10241, -8446, -6657, -4609, -2558, -1026, 257, 1280, 2304, 3328, 3584, 2815, 1538, 1534, 2, -258, +-2047, -2815, -4354, -5118, -5378, -5118, -6914, -6398, -5122, -5118, -5121, -5120, -5888, -7168, -6912, -6912, +-8447, -8962, -8446, -9473, -10497, -10493, -10500, -10492, -10498, -11520, -12543, -11009, -10496, -9982, -7939, -6141, +-3330, -512, 3074, 6398, 9985, 13568, 16639, 19201, 21504, 22783, 23810, 24830, 23809, 22784, 21504, 19200, +16640, 13568, 10496, 7425, 3838, 258, -3073, -6400, -9471, -12033, -14848, -15871, -17409, -17664, -17663, -16129, +-15104, -13567, -12290, -10750, -8961, -7168, -5632, -3328, -1280, 0, 1281, 2814, 3586, 3583, 3327, 3586, +2814, 1538, 767, -256, -1536, -3073, -4350, -5378, -6399, -7423, -6914, -7167, -6912, -7169, -7166, -7169, +-7424, -8960, -8959, -8963, -8955, -10501, -10748, -10755, -10750, -10754, -10750, -10753, -10753, -10749, -10756, -11005, +-10498, -8959, -7680, -5376, -2816, 256, 4096, 7680, 11008, 14081, 17663, 19968, 22529, 23550, 24579, 25597, +23809, 23808, 21759, 19714, 17150, 14849, 11519, 7937, 5119, 1282, -1795, -4861, -8706, -11007, -13312, -14849, +-16383, -16641, -16639, -15104, -14593, -13055, -11521, -9983, -8193, -6143, -4352, -2560, -513, 1025, 2047, 3585, +3584, 3584, 3583, 3841, 3327, 1793, 1024, -257, -1791, -3328, -4865, -5886, -7427, -7421, -8962, -9471, +-9216, -9473, -9215, -9473, -9470, -11011, -11261, -11522, -11264, -12542, -13571, -13053, -13314, -13311, -13313, -13311, +-13568, -13313, -13566, -12547, -11516, -10500, -8701, -6402, -3582, -514, 3331, 6908, 9988, 13820, 16900, 19965, +22018, 23294, 24835, 25341, 23810, 23038, 21761, 19713, 17663, 14848, 11520, 8448, 5121, 1791, -1280, -4607, +-7681, -10494, -12803, -15102, -15617, -15615, -15617, -15615, -15362, -13822, -12545, -10752, -9471, -7682, -5373, -3844, +-2044, -259, 770, 2047, 1792, 1792, 1793, 1790, 2050, 767, -256, -1279, -2817, -3840, -5375, -6658, +-8189, -7682, -9215, -9985, -9728, -9983, -9985, -9982, -9987, -9981, -9986, -9984, -9983, -9985, -9982, -9987, +-9981, -9988, -9979, -9989, -9980, -9986, -9983, -9985, -8959, -7425, -5887, -3072, -769, 2562, 5886, 9474, +13310, 16641, 19712, 22272, 24321, 26110, 26626, 26365, 26628, 25340, 23556, 21756, 18947, 16382, 13057, 9728, +6400, 2816, -256, -4097, -7167, -10240, -12800, -15360, -16384, -17153, -18686, -17923, -16380, -16388, -14844, -13828, +-12285, -10497, -8960, -7168, -5888, -4353, -3581, -1795, -2046, -1794, -2046, -1795, -2811, -4102, -4347, -5892, +-6909, -8450, -9727, -10497, -11775, -12545, -12287, -12289, -12287, -12289, -12286, -12291, -12285, -12290, -12287, -12032, +-10241, -10239, -10241, -10239, -10240, -10242, -10238, -9986, -8190, -8193, -8192, -8191, -6402, -5373, -3075, -1277, +1534, 4865, 8191, 11778, 15357, 18435, 21501, 24067, 26621, 26882, 28415, 28416, 26882, 26876, 24581, 22779, +19972, 17918, 14592, 11778, 8190, 5633, 1535, -1279, -4609, -7679, -10240, -12033, -14335, -14337, -15871, -16641, +-14335, -14848, -13570, -12540, -11268, -9469, -8194, -6656, -5119, -4096, -3329, -1790, -2051, -1789, -2051, -2302, +-4096, -3841, -5375, -6401, -7680, -8703, -10241, -11263, -12802, -12542, -12545, -12543, -12545, -12543, -12546, -12541, +-12547, -12285, -10499, -10493, -10499, -10494, -10496, -9729, -8191, -8449, -8192, -8446, -8195, -8445, -6402, -6399, +-5888, -4097, -2303, -257, 2050, 4862, 7937, 11263, 14337, 17663, 20226, 22525, 24579, 25597, 25347, 25341, +25346, 24319, 22273, 20991, 18432, 15617, 12541, 9732, 6909, 3842, 255, -2817, -5631, -8448, -11264, -13568, +-15105, -16383, -17152, -16641, -17407, -16128, -14849, -13566, -12291, -10494, -8960, -7424, -6144, -4352, -4097, -2815, +-1792, -2304, -1792, -2817, -4351, -3840, -5633, -6398, -7683, -8701, -10242, -10752, -12286, -13059, -12541, -12802, +-12544, -12799, -12545, -13055, -12032, -10497, -10751, -10497, -10751, -10752, -8960, -8449, -8446, -8451, -8444, -6660, +-6396, -6404, -6396, -6148, -4092, -4099, -1790, -1, 2816, 5120, 8705, 11263, 14593, 17919, 20225, 22782, +24579, 25853, 25860, 25852, 25858, 25599, 23809, 21760, 19711, 17154, 14588, 12293, 8956, 5635, 2813, 3, +-3587, -6141, -8450, -11263, -12801, -13823, -15361, -14847, -15104, -14849, -13311, -12289, -11007, -9984, -8448, -6913, +-5631, -4097, -4350, -3330, -1791, -2049, -3839, -4353, -4094, -5635, -6397, -7427, -9214, -10496, -11776, -12801, +-13567, -15361, -15103, -15103, -15107, -15100, -15108, -15100, -15108, -15101, -14850, -12798, -13058, -12799, -13057, -12031, +-10497, -10751, -10753, -10751, -10754, -9981, -8196, -8955, -7685, -6396, -4611, -2302, -1, 2816, 5634, 8957, +12291, 15101, 18179, 20734, 23298, 24062, 25857, 26112, 26112, 24832, 23809, 22783, 20736, 18944, 16384, 14593, +11263, 8961, 6398, 3586, 511, -1280, -4352, -5887, -8193, -8448, -9984, -10751, -11009, -9471, -8706, -8190, +-6657, -5631, -4354, -2814, -2049, -1281, 2, -2, 2, -1, -1281, -2046, -2818, -4349, -4867, -6910, +-7938, -9726, -11008, -12545, -13310, -15108, -15356, -15106, -16127, -17664, -17409, -15615, -15105, -15358, -15107, -15357, +-15106, -15359, -15104, -13313, -12799, -13056, -13057, -13054, -13059, -12796, -10756, -11005, -10498, -8702, -7426, -5119, +-2816, 0, 2816, 5888, 8703, 11522, 14590, 17410, 19198, 20737, 22017, 21758, 21763, 22012, 20995, 19454, +18690, 16382, 15106, 12798, 10753, 8192, 6399, 3586, 1278, -767, -2560, -4353, -6142, -6913, -8706, -8700, +-8709, -8699, -6659, -6400, -4606, -4100, -2555, -1540, 2, 0, -1, 1, 0, -1, 1, -1280, +-2048, -3329, -4861, -6148, -7677, -9217, -10753, -12286, -13314, -14846, -15618, -15102, -16131, -17661, -17410, -17662, +-16642, -15104, -15359, -15360, -15360, -15361, -13566, -13059, -13052, -13060, -11261, -10754, -11006, -10754, -11006, -8962, +-8703, -7680, -5376, -4096, -1280, 768, 3584, 6400, 9473, 12287, 14593, 16639, 18945, 19711, 21505, 22016, +21759, 21762, 19709, 19458, 17920, 15871, 14338, 12542, 10496, 8193, 6143, 3841, 2048, 255, -1535, -3329, +-4608, -6399, -6144, -6657, -7679, -5888, -6657, -5885, -4356, -3837, -2049, -1792, 1, -2, 2, -2, +2, -2, -254, -1794, -2302, -4099, -4861, -6658, -7678, -9217, -10497, -12287, -12801, -14590, -14594, -15870, +-16899, -16636, -16901, -16635, -16900, -16381, -16898, -15871, -14337, -14591, -14592, -12801, -12287, -12288, -12545, -11006, +-9987, -10237, -10242, -8447, -7936, -6656, -5377, -3326, -1027, 516, 3324, 5380, 8188, 10755, 13054, 15106, +16638, 18178, 18174, 19458, 20734, 18945, 18177, 18173, 16644, 15357, 14081, 12544, 10240, 8960, 6657, 5374, +3074, 1534, 2, -1281, -3329, -3837, -5124, -6141, -5889, -5889, -5886, -4098, -3838, -3330, -1534, -2050, +1, 1, -2, 2, -2, 1, -1535, -1793, -3072, -4096, -5120, -6400, -7424, -9216, -9728, -11264, +-11776, -13313, -13567, -13568, -15104, -15616, -15361, -15615, -15360, -15617, -14590, -13314, -13311, -13568, -12289, -11263, +-11520, -11521, -9726, -9475, -9469, -9730, -8191, -7425, -7423, -5634, -4604, -2820, -1021, 510, 2560, 4865, +6912, 9215, 11010, 12798, 14337, 15360, 16895, 16897, 16896, 16895, 17153, 15615, 14849, 13823, 12544, 11265, +9726, 8451, 6910, 5376, 3585, 2048, 511, -254, -1539, -2812, -3588, -3837, -5378, -5375, -4865, -3327, +-3841, -3326, -2050, -1535, -1793, -1535, -1792, -1536, -1792, -1536, -2561, -3583, -3840, -5121, -6141, -7173, +-8186, -9223, -10490, -11011, -12287, -12544, -12801, -14336, -14334, -14339, -14078, -14337, -14079, -14337, -13567, -12290, +-12541, -12035, -10750, -10497, -10495, -8961, -8704, -8959, -8450, -6910, -7169, -6656, -5375, -4609, -3072, -2048, +-512, 1025, 2814, 4355, 6396, 7940, 10237, 11266, 13054, 13826, 14590, 15618, 15615, 15360, 15617, 14847, +13824, 13568, 12034, 11517, 9987, 8957, 7682, 6400, 5119, 4097, 2558, 1539, 253, -509, -1538, -1791, +-3329, -3328, -3328, -3327, -2561, -1535, -1538, -1534, -1538, -1534, -1538, -1534, -1538, -1790, -3329, -3328, +-4608, -5376, -6401, -7677, -8195, -9471, -9984, -11264, -11519, -12545, -13312, -13057, -13310, -13056, -13057, -13055, +-13058, -13055, -13055, -13058, -11517, -11268, -11260, -9476, -9724, -9220, -8189, -7938, -8191, -6911, -6146, -6399, +-5121, -4350, -3075, -2300, -773, 5, 1789, 3329, 4864, 6399, 7937, 8961, 10493, 11012, 12029, 12800, +12547, 12795, 12549, 12541, 12289, 11008, 10751, 9729, 8960, 7935, 7170, 6141, 5379, 4094, 3073, 2048, +1023, 2, -2, -1534, -1539, -1533, -1537, -1536, -1280, -1536, -1281, 2, -2, 1, 1, -2, +-511, -1536, -1537, -2558, -3330, -4351, -5119, -5891, -6908, -7684, -8701, -9217, -10496, -10241, -11262, -12034, +-11773, -12036, -11773, -11778, -11774, -11776, -11779, -11773, -11778, -10495, -10239, -9986, -8703, -8960, -8448, -7425, +-7166, -7170, -5886, -5889, -4864, -4096, -3583, -2305, -1535, -1, 1025, 2304, 3583, 5121, 6144, 7424, +8192, 9215, 9985, 9984, 9728, 10496, 10495, 9730, 9982, 9986, 9726, 8449, 8192, 6912, 6655, 5634, +5374, 4098, 3581, 2563, 1534, 1281, 256, -1, 1, 0, 0, -1, 1, 0, -1, 2, +-2, 1, 0, 0, -1, 2, -770, -1278, -2050, -3071, -3840, -4609, -5373, -6403, -6911, -7935, +-8451, -9467, -9477, -10747, -10757, -10747, -11781, -12027, -11780, -12029, -11778, -10751, -10496, -10497, -9727, -8960, +-9217, -8702, -7682, -7936, -7678, -6402, -6655, -5888, -5121, -4607, -3840, -3072, -1793, -1023, -1, 1025, +2304, 3327, 4353, 5376, 6142, 6915, 7677, 7683, 8957, 8707, 8956, 8709, 8700, 8706, 8703, 7680, +7424, 7681, 6143, 6400, 5633, 4862, 4354, 3582, 2819, 2301, 2050, 1023, 1280, 1025, 1279, 1024, +1280, 1025, 1278, 1026, 1279, 1023, 1283, 1020, 1283, 254, 2, -514, -1278, -2050, -2814, -3586, +-4350, -5378, -6142, -6658, -7679, -8191, -8706, -9469, -9220, -10493, -10497, -10495, -10497, -10496, -10495, -10498, +-10493, -9475, -9214, -9474, -8446, -7938, -8189, -7683, -6654, -6914, -6398, -5633, -5632, -4607, -4354, -3581, +-2820, -2044, -1028, 3, 511, 1535, 2306, 3070, 3841, 4608, 5631, 5377, 6400, 6655, 6657, 6399, +6913, 7680, 6399, 6656, 6400, 6657, 6655, 6145, 5118, 5634, 4607, 4352, 3840, 3072, 3329, 2559, +2049, 2047, 2048, 2049, 2047, 2049, 2047, 2049, 2047, 2049, 2048, 2047, 1281, 1023, 513, 0, +-768, -1281, -2302, -3075, -3581, -4611, -5118, -5888, -6400, -7169, -7680, -8192, -8191, -9216, -9217, -9215, +-9218, -9212, -9221, -8955, -9221, -8956, -7938, -7935, -7937, -7168, -6911, -6913, -6144, -5888, -5888, -4863, +-4865, -4352, -3839, -3330, -2813, -2052, -1276, -770, 1, 767, 1536, 2048, 2560, 3329, 3839, 4352, +4864, 4864, 5632, 5633, 5630, 5634, 5630, 5635, 5628, 5637, 5626, 5382, 4603, 4611, 4607, 3841, +3582, 3586, 2558, 2562, 2815, 2304, 1536, 1792, 1792, 1792, 1793, 1789, 1540, 1788, 1540, 1789, +1026, 767, 255, 3, -516, -1275, -1797, -2556, -3332, -4092, -4611, -5118, -5633, -6144, -6655, -6914, +-7678, -7937, -7680, -8192, -8703, -8706, -8445, -7683, -7678, -7681, -7423, -6657, -6911, -6400, -5633, -5887, +-5377, -4862, -4867, -4092, -4101, -3323, -3076, -2558, -2049, -1535, -1024, -1, 1, 766, 1283, 1789, +2307, 3070, 3072, 3841, 3839, 4096, 4865, 4607, 4864, 4609, 4606, 4610, 4606, 4611, 4604, 4612, +4604, 3843, 3838, 3842, 3070, 3073, 2816, 2047, 2306, 2046, 2305, 1792, 1280, 1536, 1279, 1281, +1536, 1280, 1536, 1024, 511, 514, -2, 2, -769, -1280, -1792, -2304, -2816, -3327, -3841, -4352, +-4864, -5120, -5632, -5887, -6401, -6400, -6400, -7168, -7167, -6914, -7165, -6660, -6141, -6401, -6144, -5632, +-5632, -5377, -4606, -4866, -4094, -4098, -3838, -3329, -3073, -2558, -2306, -1790, -1537, -1024, -512, 0, +0, 768, 1024, 1536, 1792, 2048, 2560, 2816, 3328, 3072, 3584, 3841, 3839, 3841, 3838, 3843, +3837, 3587, 3838, 3584, 3841, 3326, 3075, 3069, 2819, 2301, 2562, 2047, 1793, 1791, 1793, 1792, +1535, 1025, 1024, 1023, 1026, 1021, 1027, 510, 513, 256, -1, -255, -768, -1025, -1535, -1792, +-2305, -2558, -3075, -3325, -3586, -3839, -4352, -4353, -4351, -5121, -4863, -4864, -4865, -4864, -4864, -4863, +-4865, -4862, -4355, -4349, -4099, -3582, -3585, -3583, -3072, -3073, -2560, -2560, -2304, -2047, -1537, -1280, +-1023, -770, -509, -3, 3, 253, 515, 765, 1026, 1536, 1535, 2049, 1792, 2046, 2308, 2299, +2309, 2300, 2307, 2814, 2817, 2816, 2815, 2562, 2302, 2305, 2304, 2303, 2306, 1790, 1794, 1789, +1796, 1275, 1286, 1274, 1285, 1276, 1283, 765, 771, 766, 769, 511, 257, 255, 2, -3, +-252, -516, -1020, -1284, -1532, -1796, -2043, -2309, -2300, -2819, -2814, -3073, -3327, -3073, -3584, -3583, +-3585, -3583, -3584, -3586, -3326, -3072, -3073, -3070, -2819, -2558, -2560, -2560, -2049, -2303, -1793, -1791, +-1536, -1282, -1022, -1024, -770, -509, -515, -255, 1, -2, 258, 256, 510, 514, 767, 1024, +1025, 1279, 1281, 1279, 1282, 1533, 1539, 1533, 1539, 1534, 1537, 1536, 1535, 1538, 1533, 1540, +1531, 1541, 1276, 1027, 1022, 1025, 1024, 1024, 767, 770, 766, 770, 767, 768, 512, 513, +254, 258, -2, 2, -1, -256, -513, -511, -767, -1025, -1024, -1280, -1281, -1533, -1539, -1790, +-1793, -2047, -1794, -2045, -2051, -2045, -2050, -2048, -2047, -2049, -1791, -1792, -1793, -1791, -1537, -1535, +-1537, -1279, -1281, -1023, -1024, -769, -767, -513, -511, -512, -257, -255, -2, 3, -3, 3, +-4, 4, 253, 258, 256, 510, 515, 509, 514, 512, 512, 767, 769, 766, 771, 766, +769, 767, 769, 768, 767, 769, 768, 511, 770, 510, 513, 513, 510, 514, 510, 514, +254, 259, 253, 258, 254, 2, -1, 1, -1, 1, -2, 3, -3, -254, -256, -257, +-511, -513, -512, -511, -513, -512, -767, -514, -766, -769, -768, -767, -770, -510, -513, -512, +-511, -513, -512, -510, -259, -254, -256, -258, -253, -258, -255, -1, 1, -2, 2, -1, +1, -1, 0, 0, 0, 0, 1, -2, 2, -1, 0, 1, -1, -1, 3, -3, +4, -4, 2, -1, 0, 2, -2, 1, -1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, -768, -1280, -2048, -2816, +-3329, -2814, -1026, 1, -767, -3588, -7163, -9476, -9981, -9473, -8449, -6654, -4866, -3582, -3074, -3582, +-3330, -2814, -1794, -510, 511, 3327, 5890, 8189, 9476, 9468, 9219, 9470, 10497, 11008, 10495, 9218, +8445, 7939, 6909, 4867, 3070, 1793, 2047, 3841, 5376, 6655, 7425, 8448, 9472, 10752, 11008, 10240, +8961, 7422, 5634, 3070, 2, -2049, -2304, -1280, 256, 767, 770, -258, -2047, -4096, -5633, -6399, +-7425, -9215, -11521, -13823, -14593, -13056, -10751, -9473, -8704, -7679, -5377, -2048, 1, -769, -3839, -8449, +-13312, -17663, -21249, -25855, -29186, -29437, -27139, -24574, -23297, -23040, -22782, -21507, -20221, -19459, -19198, -17920, +-15616, -13056, -10496, -7682, -3580, 2300, 7940, 13052, 16899, 20222, 24322, 28157, 30212, 28924, 25603, 22270, +19457, 17920, 15616, 13824, 12287, 13313, 15104, 17920, 20480, 23040, 26112, 27392, 26368, 24320, 22272, 20992, +20480, 19968, 19456, 19200, 19712, 20992, 21504, 19968, 17151, 13827, 10236, 6149, 1275, -4349, -9985, -15360, +-19967, -24834, -28670, -31490, -31486, -29442, -26367, -23296, -20736, -18176, -16385, -16383, -18176, -21760, -24063, -25347, +-25341, -25858, -26621, -26371, -24830, -22787, -20732, -19460, -19196, -19460, -19196, -19716, -20734, -22017, -22271, -21248, +-20480, -19713, -18688, -15103, -9216, -2817, 2305, 6399, 10241, 14080, 18175, 21248, 21761, 20735, 18945, 17919, +17152, 16897, 17407, 19201, 22271, 25600, 27393, 28671, 28929, 28671, 27137, 23806, 20995, 18684, 17924, 17661, +17666, 16894, 17410, 18942, 21505, 23553, 24062, 23554, 22526, 20994, 18686, 13827, 6909, -766, -8193, -14592, +-19455, -22017, -22272, -21247, -19969, -18688, -17920, -17152, -15615, -14337, -14336, -16128, -18433, -19709, -19716, -18428, +-17668, -17918, -17920, -16385, -14334, -13059, -12797, -13570, -14847, -16641, -18432, -20735, -23040, -24320, -24321, -24575, +-24321, -22526, -19713, -14848, -9728, -5376, -2048, 512, 3584, 5120, 5120, 3328, 1536, 1536, 3840, 6912, +9217, 11518, 13826, 16126, 18434, 19456, 19966, 19459, 18940, 18692, 16894, 14593, 12800, 12542, 11779, 10493, +9475, 9725, 13059, 18173, 22786, 26367, 27905, 28671, 28417, 27390, 24835, 21245, 17411, 14077, 11778, 8448, +5630, 3587, 2044, 516, -1539, -5118, -8705, -11009, -13310, -15618, -18942, -21249, -22273, -21501, -19716, -18428, +-17411, -15871, -13568, -10495, -8962, -8446, -8962, -9983, -11776, -15105, -19198, -23554, -27135, -30208, -31745, -31743, +-30464, -25857, -19967, -15104, -12289, -12031, -11520, -10497, -9471, -9217, -9983, -11008, -11008, -9473, -7167, -4352, +-1793, 514, 4349, 7684, 11516, 14595, 16894, 18945, 18432, 16383, 13826, 12542, 12801, 13824, 14847, 15617, +17409, 20733, 23812, 25852, 25859, 24574, 23298, 22270, 21506, 19966, 18177, 16896, 16639, 17922, 19198, 19970, +20478, 20738, 19710, 16642, 12286, 8194, 4094, 3, -6147, -12286, -17409, -20993, -22013, -22275, -22014, -22017, +-19969, -15614, -10754, -6399, -3840, -3073, -3838, -6146, -9983, -14592, -18176, -20224, -21504, -22783, -24067, -24572, +-23556, -22268, -21507, -21246, -21506, -20990, -19714, -17918, -17154, -17406, -16898, -15871, -14081, -12286, -9987, -7164, +-3332, 2, 2816, 4607, 5378, 6142, 5377, 4351, 2817, 1279, 1025, 2559, 4864, 7425, 9470, 13059, +17916, 22788, 25852, 26116, 24829, 22273, 19969, 17150, 14338, 11774, 9986, 9214, 9731, 11004, 13316, 16636, +20485, 23290, 24837, 24573, 24065, 22785, 20478, 15617, 8193, 766, -4862, -8450, -10751, -12288, -12800, -12288, +-11008, -9729, -8959, -9216, -9985, -10238, -10243, -9981, -9987, -8957, -7682, -6143, -5633, -6400, -6911, -6913, +-7423, -9473, -13312, -17407, -20737, -23039, -24577, -26879, -28417, -28415, -25600, -21248, -16129, -10751, -6145, -2046, +510, 2561, 3071, 2561, 1024, -1282, -5116, -8709, -11515, -12036, -9981, -7683, -5116, -2821, 6, 3322, +7172, 9726, 11521, 12544, 13823, 15617, 16895, 17154, 16126, 15618, 14845, 13827, 12542, 11778, 12542, 14081, +15360, 15872, 15361, 14589, 13315, 11518, 9218, 6911, 5632, 6400, 7936, 8703, 8706, 7933, 7171, 5631, +3582, 515, -2819, -6910, -10240, -12801, -14336, -15615, -14849, -12800, -9215, -6658, -3325, 509, 5123, 8701, +9474, 7423, 2817, -1793, -6911, -12546, -19197, -24835, -28926, -30977, -30209, -27901, -23300, -17916, -11780, -7163, +-3846, -2041, -1031, -506, -773, -2044, -3586, -4351, -4353, -3584, -3584, -4608, -6144, -6400, -6145, -5119, +-4353, -5119, -5633, -5631, -4865, -3584, -2303, -1, 3585, 8704, 15102, 20995, 26110, 30209, 30463, 28161, +22270, 16131, 10749, 6914, 3582, 514, -1027, -509, 2047, 6399, 10241, 13312, 14590, 15619, 16125, 15619, +13565, 10243, 6140, 1540, -3331, -8446, -12032, -14338, -14845, -15107, -14846, -13824, -11777, -8190, -3843, -1277, +-3, 3, 1022, 1281, 1280, -1, -2302, -3843, -5117, -6658, -8959, -12543, -15875, -17916, -19973, -21243, +-21764, -19709, -17410, -14335, -11776, -9985, -7678, -5379, -2557, -1026, -256, 514, 2045, 3587, 4094, 2816, +-255, -4609, -8703, -11777, -13823, -14082, -12541, -9219, -4605, -2, 4864, 10497, 16639, 22529, 26367, 27904, +27905, 27391, 25344, 22016, 15872, 9472, 4097, 510, -1790, -2306, -2303, -1280, 1281, 3583, 6400, 7679, +7937, 7424, 6144, 4608, 2304, 512, -1, 2, -2, 2, -1026, -1790, -2818, -4606, -7682, -12030, +-15618, -17150, -16130, -13823, -11008, -7936, -3584, 768, 5631, 8705, 10752, 11008, 9472, 5632, -1, -6142, +-12290, -17406, -22786, -26366, -28674, -27134, -22018, -14847, -7680, -2049, 1794, 4861, 6914, 6911, 4865, 1791, +-511, -3074, -4605, -5891, -7166, -7937, -7424, -6655, -5889, -4608, -3071, -770, 515, 2045, 3586, 5375, +8961, 13055, 16641, 18687, 19969, 21504, 22272, 22015, 19457, 14591, 9217, 4352, -1, -3326, -6403, -8702, +-9729, -9472, -7934, -5634, -2303, 1280, 4863, 7169, 8448, 8703, 8451, 7676, 5635, 2302, -1791, -5888, +-9217, -12287, -14593, -16894, -18947, -18429, -16131, -12030, -6912, -1281, 4097, 9215, 13057, 14335, 13824, 12033, +9215, 5121, -1, -5632, -11264, -14847, -17410, -18942, -19969, -18944, -16639, -12546, -8958, -6145, -4608, -3327, +-2049, -1280, -510, -3, 259, 1277, 1794, 2303, 2817, 2560, 2047, 513, -1026, -4093, -6403, -7421, +-6915, -5630, -4353, -2560, 2049, 8190, 16130, 23038, 28418, 31231, 32000, 29184, 23040, 15104, 6657, -1025, +-8192, -14080, -17408, -17152, -14591, -9986, -5374, -1282, 1794, 6143, 9216, 9984, 9216, 6913, 4095, 1537, +-258, -2557, -5636, -8188, -10242, -10496, -11006, -11524, -12027, -12804, -13053, -12803, -11261, -8962, -5119, -768, +2815, 6401, 9216, 12543, 15617, 15616, 13567, 7682, 1021, -5629, -11266, -17406, -22274, -25086, -25603, -23292, +-19204, -14332, -9732, -4861, -1282, 1281, 3328, 4863, 6401, 7679, 7425, 4863, 1537, -1794, -4862, -7425, +-9216, -10751, -10242, -7678, -4097, -256, 2817, 6143, 9472, 13826, 18428, 22276, 25086, 26880, 27905, 26878, +23809, 18689, 12799, 6656, 1280, -3840, -7937, -10493, -11012, -8956, -7427, -6398, -5634, -4349, -3076, -1275, +-261, 4, 766, 1793, 2560, 3071, 2817, 1536, -768, -4609, -8959, -13312, -16640, -18176, -18176, -16641, +-14334, -11266, -6399, -511, 4606, 9218, 12285, 14339, 15102, 14593, 12288, 6911, 1, -7168, -14081, -20222, +-24322, -25599, -24320, -20481, -15102, -9986, -4607, -512, 1536, 2304, 1023, 1, -257, 1, 1024, 2047, +2049, 1279, 768, 514, -3, -1022, -2817, -4351, -4608, -4098, -2301, -515, 2051, 5629, 9987, 14589, +19203, 25085, 29186, 31744, 30719, 26368, 20481, 13567, 5888, -1022, -8452, -14332, -17155, -16638, -13825, -9984, +-5888, -1792, 1537, 4606, 5634, 5630, 4865, 3841, 2301, 772, -772, -2301, -4865, -7168, -10496, -13824, +-15872, -16896, -15871, -14082, -12286, -9730, -6141, -2308, 1540, 4860, 6659, 8190, 9730, 10750, 11011, 9212, +6659, 2302, -2814, -8961, -15103, -19714, -22014, -22018, -20477, -17923, -14846, -11266, -7166, -3842, -2046, -1026, +-510, 254, 2049, 3583, 4353, 3840, 2816, 1024, -1026, -3581, -6147, -7164, -6916, -5374, -2816, 255, +4610, 10493, 16131, 20990, 25089, 28159, 30465, 31231, 29441, 24831, 18433, 11262, 4611, -1284, -7420, -12035, +-14846, -14849, -13056, -10240, -6912, -3840, -1023, 255, 257, -2, 2, 511, 1025, 511, 257, -2, +2, -257, -2047, -5633, -10239, -14594, -17150, -18177, -17920, -16128, -13311, -9217, -3841, 1538, 6909, 12036, +15869, 18434, 18429, 16131, 12286, 6657, 256, -7169, -14847, -21505, -24830, -24836, -22780, -19459, -16126, -11264, +-6146, -1790, -2, 770, 767, 512, 256, 0, -256, -1023, -1794, -3326, -4610, -4606, -4865, -4096, +-2560, -1279, -258, 514, 2815, 6143, 10499, 14589, 18178, 21503, 25088, 28672, 29953, 28670, 24834, 18942, +12546, 5375, -1280, -7424, -11776, -14336, -14848, -14591, -13313, -10239, -6402, -3070, -514, 1027, 2558, 4097, +5374, 5379, 4093, 2051, -258, -3840, -7935, -12544, -16896, -20225, -21247, -20737, -18430, -14849, -10241, -4607, +1024, 6400, 10752, 14848, 17664, 19968, 19455, 17154, 12799, 7424, 2304, -3841, -10750, -16642, -20479, -21760, +-20225, -17662, -15362, -13312, -11006, -10243, -9213, -8706, -6912, -4350, -1283, 1283, 3069, 5379, 6653, 6659, +5373, 2051, -1283, -4349, -5635, -6142, -5633, -4863, -3073, 1, 4350, 10243, 15869, 21506, 25855, 29952, +31489, 30719, 26880, 19969, 11774, 2819, -5891, -12798, -16641, -17920, -16896, -14592, -11775, -7682, -3070, -2, +1281, 512, -256, -1024, -769, -254, -3, -508, -2053, -3835, -6149, -8699, -11267, -13311, -14592, -15361, +-14335, -12544, -8960, -4608, -257, 3586, 6910, 10753, 15360, 19967, 23554, 24574, 22785, 18688, 13055, 5377, +-3072, -12032, -19456, -24065, -25342, -24579, -22012, -18180, -13822, -10240, -7424, -5377, -3326, -1027, 1026, 3072, +4607, 5377, 5375, 4609, 2048, -1793, -6143, -9217, -10239, -9728, -7424, -4865, -2046, 1277, 5123, 9470, +13313, 16639, 19713, 22271, 23553, 23039, 20993, 17663, 13313, 7679, 1280, -5118, -10499, -12797, -12546, -12032, +-10751, -8961, -7423, -5888, -5378, -5629, -5378, -5376, -4350, -2563, -509, 1534, 3329, 3327, 1026, -2818, +-7935, -13056, -16641, -18429, -17924, -16124, -12036, -5373, 1791, 8704, 14081, 18942, 22530, 25599, 27649, 27646, +24066, 18942, 11779, 3325, -5374, -13826, -20990, -25090, -27134, -26625, -23808, -19200, -13823, -8962, -6653, -6659, +-6142, -4865, -3071, -514, 1283, 3069, 4354, 5631, 6143, 4611, 1788, -1276, -4612, -7165, -8961, -8961, +-7935, -5376, -2304, 1280, 5887, 11521, 17151, 22786, 27133, 28931, 28926, 26881, 22527, 16384, 8705, -256, +-8193, -13055, -15362, -15614, -14849, -13056, -10240, -6655, -4098, -2558, -2305, -2304, -2815, -3330, -4093, -3843, +-4094, -3840, -5890, -9212, -13317, -16636, -18178, -17920, -17150, -15107, -11261, -5891, 514, 7167, 13056, 17665, +21502, 23811, 25340, 25091, 23550, 20481, 15104, 8703, 513, -7425, -15102, -19715, -22782, -23552, -23296, -22016, +-19200, -15617, -13054, -11266, -9470, -6914, -3327, 768, 4863, 8193, 10239, 11265, 9471, 6400, 1794, -2307, +-6653, -9475, -11518, -11264, -8961, -4862, 509, 6147, 11005, 16387, 22013, 26882, 30719, 31233, 29183, 24320, +17921, 11262, 4355, -2307, -8190, -12288, -14594, -15357, -13827, -12286, -10240, -8961, -9471, -10753, -11776, -11518, +-10498, -8703, -7168, -5122, -2812, -772, 4, -516, -3837, -7682, -11007, -12800, -13568, -13569, -12030, -9475, +-5117, -2, 5633, 11520, 17662, 23043, 26877, 28931, 28670, 25856, 20481, 12287, 2050, -9475, -18685, -24579, +-26876, -26371, -24575, -21504, -16385, -11518, -7170, -4095, -2817, -2302, -1027, 515, 2813, 5122, 7424, 7934, +6148, 3067, -763, -4613, -6907, -8197, -9467, -9477, -7932, -5379, -1790, 1535, 5631, 9730, 14334, 20226, +25087, 28927, 30465, 28927, 25090, 19710, 11778, 3325, -3581, -9474, -12799, -14080, -14592, -14080, -12544, -11521, +-11518, -12290, -13054, -12803, -11005, -8706, -5630, -2562, -511, 1023, 1025, 0, -3584, -8192, -12289, -15103, +-15872, -14336, -10753, -5630, -3, 4868, 9724, 13571, 17662, 21249, 23552, 24320, 23039, 19458, 15357, 9988, +2300, -5373, -13313, -19457, -22526, -22019, -19964, -16899, -13311, -10495, -8963, -8701, -8449, -8193, -7165, -5380, +-2813, 255, 4096, 7168, 8960, 7935, 4098, -1, -3584, -6657, -8447, -9985, -9982, -8193, -4865, -510, +4605, 9732, 15100, 19972, 25085, 29441, 31744, 31488, 28415, 22786, 13821, 4612, -3332, -9725, -13315, -15614, +-16640, -15361, -12543, -9217, -6399, -5889, -7167, -8961, -9728, -9727, -9217, -7423, -5632, -3586, -2045, -1795, +-3069, -4610, -7167, -9729, -11263, -11776, -10752, -8192, -4608, -1024, 2047, 5378, 9215, 13312, 16898, 19452, +20739, 19968, 18430, 14851, 9214, 1792, -6399, -14081, -19200, -21759, -21761, -19711, -16385, -12543, -9473, -7168, +-6399, -5121, -3327, -1538, 3, 1533, 3330, 5375, 6656, 5889, 3070, -510, -4609, -7424, -8959, -8705, +-7167, -4354, -765, 3068, 7173, 12028, 16642, 21247, 25088, 27137, 27647, 26624, 24576, 20736, 15105, 7934, +515, -5124, -8956, -11523, -13310, -14081, -13824, -13823, -12801, -13311, -14081, -14336, -14591, -14337, -12800, -9983, +-6401, -3071, -258, 2, -770, -2814, -5376, -7682, -9982, -12033, -12800, -11519, -7681, -2816, 1537, 5887, +10240, 14593, 18686, 22019, 23805, 23298, 19967, 14848, 7681, -1, -7936, -14591, -18945, -21504, -21503, -19202, +-15101, -10243, -6141, -4099, -3837, -3842, -3583, -3073, -1791, -768, 255, 2306, 4605, 5123, 4861, 2818, +255, -1279, -3072, -3842, -4093, -3843, -2813, -1538, 256, 3330, 7677, 13572, 19196, 23810, 26880, 28159, +27649, 24319, 19201, 11519, 2305, -5120, -10498, -14077, -15107, -15102, -14336, -12801, -11263, -10240, -9729, -9215, +-8960, -8449, -7678, -7426, -5886, -3843, -2300, -2564, -3836, -6659, -9215, -10752, -11520, -11776, -10751, -8194, +-5630, -2562, 257, 3584, 6912, 10496, 14336, 17663, 20225, 21504, 21247, 17922, 13309, 5891, -1795, -8190, +-13568, -17153, -18687, -17921, -16383, -13312, -10496, -9729, -9982, -10242, -10238, -8962, -6398, -3585, -256, 2561, +4606, 4865, 3840, 1792, -511, -2817, -4865, -6399, -6144, -4096, -1024, 2048, 5375, 8450, 12030, 16641, +21760, 27135, 30466, 31742, 29953, 26368, 20479, 12290, 3838, -3583, -10496, -14593, -15871, -15104, -13056, -10496, +-8449, -8447, -9216, -10497, -11262, -11010, -11262, -10754, -8959, -6144, -3072, -767, -514, -3070, -5633, -7936, +-9727, -10498, -10237, -10244, -8700, -6403, -3838, -769, 2560, 6912, 11520, 15616, 19200, 22272, 23295, 22530, +18430, 10241, 1024, -7937, -15103, -19711, -22019, -22268, -19715, -15870, -12034, -8445, -6660, -6651, -6405, -6652, +-5891, -4862, -2560, -2, 1795, 3325, 2817, 1025, -1, -1535, -3073, -3841, -3070, -1537, 768, 3841, +5886, 7682, 9726, 12546, 15871, 20225, 23806, 26114, 27134, 25859, 22781, 17154, 10494, 3074, -3585, -8960, +-13055, -15107, -14588, -12804, -11260, -10244, -10493, -11266, -11775, -10496, -9729, -8191, -6400, -4353, -2303, -769, +-1023, -2560, -5121, -8447, -11264, -13314, -13820, -12549, -9467, -5891, -2559, 255, 3841, 7423, 11778, 15102, +17921, 19455, 20480, 19714, 16894, 11777, 5120, -2561, -10239, -15360, -18689, -19455, -17920, -15361, -12543, -10241, +-8703, -8449, -8447, -8962, -9469, -8962, -6911, -3073, 768, 3841, 4863, 4353, 3071, 1536, 0, -1024, +-2303, -2817, -2047, -514, 1794, 4863, 8193, 11519, 15616, 19969, 24319, 28161, 30208, 29950, 26114, 19711, +11520, 2818, -4356, -10235, -15365, -18172, -18691, -16893, -14851, -12029, -11267, -10750, -10240, -10497, -9727, -9217, +-8447, -7424, -5633, -4094, -3330, -3327, -3584, -5120, -6912, -8448, -8960, -8449, -6142, -3842, -1790, -258, +1282, 4350, 8705, 13057, 16894, 19714, 22015, 23295, 21762, 18175, 11519, 3331, -4611, -12286, -18433, -21248, +-21759, -19970, -17662, -15361, -14336, -12799, -11266, -9727, -7935, -6146, -3838, -1281, 1279, 3075, 3580, 2564, +765, -766, -2561, -3840, -4352, -3328, -1536, 1, 1535, 3584, 6400, 9471, 13059, 17149, 20482, 23295, +25855, 26628, 24571, 20484, 14077, 6914, 512, -3584, -8193, -10239, -11777, -12031, -12032, -11777, -12286, -13315, +-14077, -14851, -14845, -13570, -11776, -8447, -4865, -2559, -1793, -2047, -3074, -4349, -5123, -6910, -8705, -8960, +-8447, -6401, -4095, -1281, 513, 3327, 7425, 12287, 17154, 21246, 24321, 25088, 23294, 18948, 11771, 3590, +-4101, -11774, -17920, -20737, -21247, -18944, -15105, -12031, -11008, -10497, -10239, -9728, -8962, -7676, -6660, -4861, +-1794, 513, 2559, 3586, 3070, 1793, 512, 0, -512, -1, 1025, 1792, 2049, 1791, 2048, 4095, +7427, 11516, 15876, 19966, 24063, 26884, 27898, 25606, 20219, 12803, 5119, -1279, -7169, -11263, -14082, -15102, +-14593, -14079, -14081, -14336, -14080, -14335, -13825, -13056, -11776, -9473, -6909, -5379, -4351, -4864, -6401, -7422, +-8706, -9471, -9728, -8705, -6655, -3329, -511, 1023, 2818, 4349, 6659, 8957, 12035, 14845, 18179, 20478, +21249, 19200, 14334, 7938, 1536, -4865, -10239, -14849, -17408, -17406, -15875, -13821, -12547, -11774, -12033, -12542, +-11779, -9981, -7428, -3323, 251, 4101, 6395, 7427, 6911, 5633, 3328, 767, -767, -2050, -1533, -258, +1025, 2304, 3327, 5121, 7679, 11265, 14847, 18433, 21247, 23296, 24065, 22271, 18688, 13313, 6398, 2, +-5889, -9984, -12031, -12034, -11262, -11522, -12285, -13059, -14078, -14594, -15102, -15873, -16128, -15104, -12288, -8448, +-5119, -3074, -2814, -3074, -3582, -4610, -5118, -5378, -4862, -4354, -3583, -2560, -1280, 256, 2816, 4864, +7935, 11523, 15100, 18437, 20731, 20227, 16895, 11520, 4865, -2305, -8959, -15106, -18685, -19716, -18940, -16642, +-14336, -12543, -11522, -10494, -9472, -8449, -6911, -4865, -2047, 511, 2305, 3327, 4098, 4606, 3841, 2815, +1536, 1282, 1534, 3073, 4608, 5119, 5633, 5887, 6657, 8447, 10498, 13309, 16387, 19454, 20993, 21248, +20224, 17152, 13056, 8704, 3841, -1281, -5120, -7935, -9986, -11006, -12288, -14082, -15869, -16643, -16383, -15871, +-14081, -12287, -9473, -6911, -4865, -3583, -2816, -3073, -4094, -5890, -7423, -7936, -7681, -6399, -5120, -3841, +-2302, -259, 2051, 4349, 7171, 9214, 11010, 13310, 14850, 14590, 12545, 8449, 3326, -1789, -6659, -10239, +-12799, -13825, -14079, -13313, -12800, -12288, -12543, -12033, -12287, -12545, -11520, -9472, -5887, -1794, 1539, 3581, +5122, 5887, 6400, 6401, 6143, 5120, 4352, 4096, 3841, 3327, 3584, 3584, 4352, 6144, 9217, 12798, +16643, 20476, 22277, 22523, 21252, 17917, 13826, 9471, 4609, -1, -4096, -6399, -7682, -8446, -9729, -11520, +-13056, -14336, -15104, -14848, -14080, -13056, -12032, -10240, -8960, -7424, -6400, -5631, -5634, -5373, -5636, -5116, +-3587, -2046, -769, -511, -770, -1277, -772, 4, 1533, 4098, 6399, 9216, 11777, 12799, 12544, 10241, +6654, 2563, -2051, -6653, -9987, -12029, -12547, -12542, -12801, -13311, -13313, -13055, -12545, -11776, -9983, -7682, +-4093, -771, 1794, 3327, 4096, 3841, 3326, 2562, 2046, 2050, 2559, 3584, 4352, 4864, 5375, 5379, +5885, 6913, 7937, 9213, 11524, 13821, 16642, 17918, 17665, 15360, 12287, 9474, 6141, 3331, 765, -1021, +-2819, -4350, -6400, -8705, -11007, -13569, -15615, -16897, -17151, -16384, -13569, -10239, -7424, -4866, -3325, -2306, +-1536, -1277, -2053, -2556, -2562, -2047, -1280, -513, -512, -510, -515, 3, 1277, 3075, 5885, 8450, +10240, 10750, 10499, 8701, 5890, 1791, -2303, -6914, -9981, -11267, -10749, -9731, -8958, -8704, -9217, -9727, +-9985, -10496, -10750, -9986, -8703, -5889, -3071, -768, 767, 1794, 2557, 2564, 2556, 2819, 3581, 4610, +5376, 5887, 4866, 4348, 3845, 3835, 4101, 5372, 7682, 10496, 13311, 15874, 17406, 16897, 15360, 13055, +9731, 6141, 2305, -512, -3073, -5118, -7169, -8704, -10497, -12031, -13312, -14081, -14334, -13827, -11773, -9473, +-7169, -5375, -4353, -3583, -2815, -2306, -2559, -2304, -1793, -767, 256, 1279, 1794, 2302, 2304, 2050, +1533, 1284, 2044, 3075, 4606, 5633, 5888, 5376, 3840, 2048, 255, -1790, -4098, -5630, -6402, -6911, +-6912, -6913, -7678, -8450, -9471, -10496, -11010, -9980, -8709, -6395, -3845, -1787, -5, 1284, 2046, 2304, +1537, 1023, 1024, 1537, 2559, 3328, 3584, 3585, 3582, 4355, 5629, 7169, 8705, 10494, 12035, 13309, +13825, 13569, 12799, 10752, 7937, 4862, 2306, 511, -512, -2048, -3839, -6145, -8704, -10752, -12031, -13570, +-14845, -15107, -14846, -13057, -10496, -7935, -5890, -3837, -2051, -510, 256, 1022, 1795, 2301, 2562, 2560, +2046, 1795, 1020, 516, -4, 261, 762, 2309, 4093, 5377, 5378, 5372, 3844, 2556, 1029, -773, +-2812, -5123, -5886, -5888, -5890, -5886, -6402, -6910, -7169, -7680, -7680, -7424, -6400, -4864, -3584, -2816, +-2048, -1536, -1024, -512, 0, 513, 1278, 2562, 4351, 5376, 5889, 5886, 5122, 4607, 4097, 4094, +4867, 6140, 7428, 8957, 9730, 10239, 9728, 8960, 7681, 5886, 4099, 2300, 772, -771, -2559, -4607, +-7426, -9726, -11265, -12801, -13566, -13314, -12030, -10242, -8191, -5888, -4352, -2304, -1281, -1023, -769, -254, +-3, 771, 1534, 2304, 1793, 1535, 1025, 1024, 1023, 1025, 1024, 1535, 2306, 3070, 3330, 3070, +2562, 1022, 2, -1538, -2047, -2048, -2048, -2049, -2047, -2305, -3327, -4353, -5631, -7169, -8960, -9727, +-9473, -8191, -6400, -4609, -3327, -2304, -1025, -254, 509, 1028, 1788, 2819, 4095, 5118, 5635, 5630, +5121, 4352, 3327, 3073, 4351, 5634, 7421, 8963, 9469, 9475, 9214, 8449, 6911, 4865, 2815, 1025, +-256, -1025, -1791, -2816, -4353, -6142, -7939, -9469, -10499, -11260, -11012, -9981, -8706, -7424, -6142, -5122, +-3838, -2817, -2306, -1532, -516, 516, 2044, 3075, 3838, 3586, 2814, 2049, 1024, -1, -510, -514, +2, 765, 1796, 2299, 2566, 2042, 1541, 509, -511, -1279, -2051, -2043, -2054, -2554, -3333, -4349, +-5376, -6402, -7678, -8193, -8193, -7166, -5634, -4095, -2560, -1537, -1023, -512, -513, 2, 510, 1793, +3328, 4608, 5889, 6142, 6914, 6654, 5890, 5119, 4608, 4096, 4608, 5120, 5633, 5631, 5633, 5119, +4352, 3585, 2559, 1793, 1279, 513, -1, -512, -1792, -3327, -5121, -7167, -8961, -10496, -11007, -10241, +-9215, -8194, -6653, -4866, -3328, -1791, -1027, -764, -515, 3, 252, 1027, 1790, 1794, 1791, 1280, +1024, 512, 513, 766, 1026, 1279, 1281, 1535, 1792, 1536, 1025, 255, -767, -1538, -1790, -1537, +-1280, -1279, -1538, -2302, -3073, -3840, -4863, -6146, -6910, -7169, -6656, -5887, -4866, -4094, -3074, -1790, +-1026, 2, 1022, 2562, 4094, 5378, 6398, 6658, 6910, 6402, 5375, 4353, 3583, 2816, 3072, 3842, +4093, 4612, 4860, 4354, 4096, 3583, 2562, 1534, 1024, 1, -768, -1536, -2561, -3583, -4609, -5631, +-6656, -7425, -7679, -7425, -6911, -6145, -5374, -4867, -4093, -3587, -3069, -2306, -1536, -767, -1, 1281, +1792, 2559, 2817, 3072, 2303, 1794, 1022, 513, 0, 0, -1, 2, -514, -255, -512, -1, +-255, -255, -3, 3, -2, 0, -253, -1028, -2301, -3586, -4863, -5889, -6397, -6148, -5629, -5121, +-4354, -3581, -2306, -1535, -1024, -512, -1, 769, 2047, 3586, 4606, 5122, 5374, 4865, 4609, 4350, +4354, 3838, 4098, 4094, 4098, 3839, 3584, 3328, 2561, 1789, 1029, 507, 260, 253, 259, -3, +-510, -1537, -2304, -3583, -4865, -6144, -6911, -7169, -6912, -6399, -5890, -5118, -4609, -3840, -3071, -2049, +-1024, -255, 511, 1537, 2048, 2559, 2561, 2303, 1793, 768, -1, -255, -258, 2, 0, -1, +1, -1, 0, 1, -257, -767, -769, -767, -512, -258, -253, -771, -1021, -1794, -2815, -3586, +-4093, -4098, -4095, -3841, -3584, -3327, -3329, -2814, -2820, -2300, -1539, -254, 1024, 2814, 4355, 5629, +6146, 6399, 5889, 5118, 4099, 3325, 2818, 2815, 2816, 2816, 2561, 2302, 2307, 2044, 1539, 1023, +1024, 1024, 1024, 767, 3, -772, -1788, -3076, -4349, -5377, -6144, -6399, -6146, -5887, -5120, -4352, +-3584, -3327, -2819, -2812, -2820, -2044, -1027, 2, 766, 1282, 2047, 2305, 2302, 2050, 1534, 770, +256, -2, 3, -4, -252, -259, -510, -769, -1024, -1023, -769, -511, -258, 3, 253, 259, +-3, -509, -1539, -3069, -4099, -4605, -4866, -4607, -4097, -3840, -3327, -2816, -2049, -1535, -770, 2, +512, 1791, 3073, 4350, 5123, 5373, 5123, 4349, 3842, 3328, 3071, 3073, 2815, 2560, 2562, 2301, +2307, 1789, 1282, 512, -2, 3, -3, 2, -257, -768, -1023, -1537, -2559, -3330, -3837, -4355, +-4605, -4354, -4607, -4096, -3841, -3582, -3330, -3326, -2818, -2303, -1280, -256, 512, 1536, 2304, 2816, +2816, 2560, 2048, 1024, 256, 1, -514, -766, -1026, -767, -512, -512, -512, -512, -513, -255, +-1, 2, -258, -255, -768, -1281, -2046, -2563, -3325, -3586, -3327, -3584, -3329, -2815, -2561, -2303, +-2048, -1793, -1535, -769, 1, 768, 1791, 2818, 3581, 4355, 4861, 4611, 4350, 3841, 3071, 2817, +2303, 1793, 1280, 767, 513, 255, 257, 255, 257, 511, 513, 766, 770, 510, 259, -515, +-1278, -2305, -3072, -3583, -3585, -3583, -4096, -3584, -3585, -3071, -2816, -2305, -2302, -1794, -1279, -768, +-1, 513, 1280, 1536, 2047, 1793, 1536, 1280, 1024, 767, 513, 0, 1, -258, -511, -769, +-1022, -1282, -1023, -1024, -513, -510, -514, -511, -512, -768, -1024, -1536, -2304, -2559, -2818, -2814, +-2817, -2816, -2559, -2562, -2558, -2305, -1791, -1025, -255, 511, 1537, 2303, 3073, 3584, 3840, 3839, +3329, 2815, 2305, 2048, 1535, 1281, 1024, 1023, 769, 511, 513, 512, 511, 514, 765, 771, +766, 257, -1, -511, -1025, -1535, -2304, -2561, -2560, -2559, -2561, -2559, -2560, -2561, -2815, -2817, +-2815, -2561, -2303, -1281, -512, 258, 1020, 2053, 2299, 2564, 2302, 2048, 1538, 1278, 768, 257, +-2, -509, -770, -1023, -1025, -1024, -1023, -769, -511, -256, -1, 1, -1, -255, -1024, -1793, +-2047, -2561, -2559, -2560, -2305, -2047, -1793, -1535, -1280, -1281, -1279, -1281, -768, -255, 256, 1022, +1538, 2303, 2304, 2562, 2556, 2308, 2045, 2050, 1792, 1533, 1284, 1021, 771, 254, 0, -256, +1, 0, 256, 256, 510, 516, 508, 259, -2, -768, -1534, -2050, -2303, -2560, -2561, -2559, +-2304, -2305, -2301, -2308, -2301, -2050, -1535, -1024, -257, 258, 766, 1537, 1791, 2049, 1791, 1538, +1277, 1027, 765, 259, -2, 0, -255, -257, -511, -768, -769, -767, -769, -511, -513, -255, +-257, -255, -513, -767, -1282, -1533, -1795, -1533, -1795, -1534, -1282, -1533, -1539, -1278, -1536, -1538, +-1278, -770, 3, 253, 1027, 1789, 2306, 2303, 2305, 2303, 2049, 1792, 1535, 1025, 767, 512, +258, 254, 1, -1, 0, 1, 256, 255, 257, 255, 257, -1, -511, -768, -1281, -1790, +-2051, -2300, -2308, -2044, -1796, -1533, -1538, -1278, -1538, -1534, -1283, -1022, -512, -256, 255, 513, +1279, 1537, 1791, 1793, 1535, 1281, 767, 513, -1, -254, -515, -766, -1280, -1281, -1279, -1025, +-767, -513, -255, -1, 0, 2, -3, 2, -512, -769, -1278, -1283, -1533, -1282, -1534, -1281, +-1281, -1023, -1024, -1024, -768, -512, -257, 2, 510, 770, 1278, 1538, 1535, 1537, 1535, 1537, +1535, 1281, 1280, 1023, 769, 511, 257, -1, 1, -1, 1, -1, 1, -1, 1, 0, +-257, -510, -771, -1277, -1282, -1535, -1536, -1793, -1534, -1539, -1533, -1539, -1533, -1538, -1279, -1025, +-512, 1, -1, 512, 769, 1022, 1282, 1279, 1024, 769, 510, 258, -1, -255, -513, -511, +-770, -765, -771, -766, -513, -256, 1, -1, 0, 0, 0, -256, -511, -770, -766, -770, +-767, -768, -769, -509, -517, -507, -772, -765, -769, -513, -255, 0, -1, 514, 766, 1024, +1282, 1533, 1539, 1534, 1537, 1279, 1281, 767, 513, 256, -1, 1, -257, -255, 0, -1, +1, 256, 255, 257, 0, -257, -510, -1026, -1024, -1278, -1283, -1276, -1285, -1019, -772, -766, +-768, -769, -767, -512, -258, 4, -5, 5, 251, 261, 252, 514, 255, 256, 258, 254, +1, -1, 0, -254, -514, -766, -770, -766, -514, -510, -258, 2, -1, 0, 1, -2, +2, -257, -512, -511, -514, -510, -513, -512, -512, -767, -770, -765, -771, -510, -257, 1, +-1, 257, 768, 766, 1028, 1019, 1028, 1022, 768, 770, 765, 770, 511, 513, 254, 3, +-3, 3, -3, 1, 1, -1, 1, -1, -1, -254, -513, -768, -768, -768, -769, -767, +-768, -513, -510, -514, -511, -769, -511, -768, -512, -513, -255, 0, 255, 257, 511, 513, +256, 256, 254, 259, -2, 0, 2, -259, -254, -513, -511, -513, -511, -258, -254, 0, +-1, 1, -2, 3, -3, -253, -515, -510, -513, -768, -511, -513, -255, -258, -253, -259, +-252, -261, -251, -5, 5, -4, 2, 255, 512, 514, 509, 514, 767, 768, 513, 511, +512, 257, 255, 0, 1, -1, 1, -1, 0, 1, -1, 1, -1, 1, -1, 0, +-256, -255, -514, -509, -516, -507, -518, -506, -517, -252, -259, -254, -257, -255, -1, 0, +1, -2, 4, -5, 4, -2, 0, 2, -2, 0, 2, -4, 5, -4, -254, -256, +-258, -253, -3, 2, -1, 1, -1, 1, -1, 0, -255, -257, -255, -257, -256, -255, +-257, -256, -255, -257, -256, -255, -258, 2, -1, -1, 3, -3, 258, 254, 257, 257, +255, 256, 256, 256, 257, -1, 0, 1, -1, 1, -1, 0, 1, -1, 0, 1, +-1, 0, 0, 1, -2, -254, -257, -256, -255, -257, 0, 0, 1, -1, 1, 0, +-2, 2, 0, -1, 2, -2, 0, 1, 0, -1, 2, -2, 0, 2, -2, 1, +0, -1, 1, -1, 2, -2, 1, 0, -1, 2, -2, 1, 1, -2, 2, -2, +2, -2, 3, -4, 4, -2, 0, 1, -1, 0, 2, -2, 1, 0, -1, 1, +-1, 1, 0, -1, 1, -2, 3, -2, 1, 0, -1, 2, -2, 1, 1, -2, +2, -2, 1, 0, -1, 2, -2, 2, -2, 1, -1, 3, -4, 5, -5, 3, +0, -2, 3, -3, 2, 0, -1, 0, 1, -1, 1, 0, -2, 3, -2, 1, +0, -1, 2, -3, 3, -3, 4, -4, 3, -3, 3, -2, 1, -1, 1, -1, +1, 0, -1, 1, -1, 1, -1, 2, -3, 4, -4, 3, -2, 1, 1, -3, +4, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, -1280, -2817, -2814, -1282, -1278, -1282, -1279, -1280, -1280, -1280, 0, 0, 1280, 0, +1, -2, 3, -3, -1278, -1280, -1282, -1277, -1282, -1279, -1281, -1280, 1, 0, -1, 1, +-2, 3, -2, 2, -3, 3, -2, -1280, -1278, -1283, -1277, -1282, -1279, -1282, -1276, -1286, +-1273, -2823, -1274, -1283, -1279, -1, 1, 1279, 1282, 1278, 1282, 1278, 1, 0, 0, -1279, +-1282, -1279, -1281, -1278, -2817, -2816, -1280, -1280, 0, -1280, -1280, 0, 0, 0, -1, 1, +0, -1, -1279, -1281, 1, -1, -1279, -1282, -1276, -1285, -1275, -1284, -1278, -1280, -1282, -1276, +-4, 4, 1276, 1283, 1278, 1282, 1279, 0, 1, -2, -1278, -1281, -1280, -2816, -1280, -1280, +-1279, -1282, 1, 1, -2, 2, -2, 2, -1, 1, 1278, 2, -1, 1, -1, 1, +-1281, -2815, -1280, -1281, -1280, -1278, -1282, -1278, -1282, -1279, 0, 0, 1280, 1280, 1280, 1281, +1279, 1280, 1, -2, -1278, -1281, -1279, -1282, -1277, -1284, 4, -4, -1276, -1284, -1276, -3, +1, 1, -2, 1, 1, -1283, -1275, -1285, -1277, -1282, -1279, -1279, -1282, -1278, -1282, -1279, +-1279, -1282, -1278, -1282, -1279, 0, 0, 0, 0, 1280, 1280, 1280, 0, -1280, -1279, -1281, +-1280, -1279, -1282, -1278, -1280, -2, 3, -1284, -2811, -2821, -1276, -1283, -1278, -1281, 0, 0, +-1280, -1280, 0, 0, -1280, -1279, -1282, -1277, -1283, -1277, -1283, -1277, -1282, -1279, -1280, -1, +1, -1, 1, 1279, 1282, 1276, 5, -1285, -1276, -1282, 0, -1279, -1281, -1279, -1281, 0, +2, -3, -1276, -2821, -1276, -1282, -1278, -2, 1, -1280, -1281, -1278, -2, 0, 2, -1283, +-1278, -1280, -1282, -1277, -3, -1278, -1281, -1280, -1280, 0, 1281, -1, 0, 0, 1279, 1282, +-1, -1, 2, -3, 3, -1, -1281, -1279, -1, 1281, 1280, 0, -1280, -2817, -2815, -2816, +-1280, 1, -2, 1, 1, -1283, 5, -6, 5, -1283, -2815, -1279, -2, 2, -1282, -1279, +-1280, -1280, -1280, 0, 1280, 1279, 2, -2, 1, 1, -2, 2, -1, 0, -1280, -1279, +-2, 2, -1, 1280, 2817, 2815, -1, -1277, -1284, -1276, -2818, -1281, -1277, -1284, -2812, -1283, +-2814, -2818, -1278, -2, -1277, -1283, -1278, -1282, 2, -1281, -1280, -1278, -4, 2820, 1277, 2, +-1, 1, 1278, 1282, -1, 0, -1279, -1, -1280, -1279, -1281, -1280, -1279, -1, 1281, 1279, +0, -1279, -4354, -2813, -2819, -1277, -3, -1278, -2817, -2815, -1280, -1281, -1279, -1281, -2814, -1283, +-1277, -1282, -1279, -1280, -1280, -1, 2, 1278, 1281, 0, 0, 0, 1, -2, 1282, -2, +-1278, -1281, -1279, -2817, -2816, -2816, -1280, 2, -3, 1283, -3, -1278, -2817, -1279, -1281, -1279, +-1, 1, -1281, -2815, -2817, -1279, -2817, -2815, -1280, -1, 1, -1281, -1279, -1280, -1281, 1, +1279, 1281, 2815, 1281, -1, 1, -1281, 0, 1281, 1278, 2, -1, -1, 3, -1284, 3, +-1, 1280, 1280, 1, -2, -1278, -2817, -4352, -4352, -1279, -1282, -2813, -2820, -2812, -2819, -2814, +-1281, -1280, -1280, 0, 1281, 1278, 2, -1282, 2, -2, 2818, 4350, 2818, 1279, 0, 1, +-2, -1278, -1281, -1280, 1, -1, 0, -1280, -1279, -2, 2818, 2815, 2816, 2816, 2817, -3, +-2811, -2821, -2812, -2820, -2812, -4355, -4350, -4353, -4352, -2816, -2815, -1282, -1277, -3, 1283, 1276, +5, -5, 1284, 1277, 1282, 2815, 2817, 4351, 2816, 1281, -1, -1279, -1280, -1, 1281, -1, +-1279, -1280, -1280, -1282, 1283, 4349, 4355, 2814, 0, 1281, -1, -2814, -4355, -4349, -4355, -5886, +-5888, -5889, -7423, -7424, -4353, -1279, -1280, -1281, 1282, 2814, 1281, -1, 1, 1279, 2818, 4350, +2817, 2815, 2817, 1279, 2, 1277, 1284, -4, 3, -3, -1278, -1281, -1278, -2818, -1279, 2815, +4353, 4352, 0, -1280, -1280, -4352, -4351, -2818, -2814, -7425, -8959, -7425, -5887, -7425, -5887, -2817, +-1279, -1280, -1, 2817, 2815, 1281, 0, -1, 2817, 4350, 4355, 2814, 1280, 2, -1284, 4, +-3, 2, -1, 0, 0, -1280, 0, 1280, 0, 1280, 5888, 7423, 2817, -1, -2814, -4355, +-5886, -4353, -4351, -5888, -8961, -8959, -7424, -7424, -8961, -7422, -2819, -2812, -1284, 4, 2811, 2822, +1273, 1287, 4346, 5893, 5884, 4355, 2814, 1281, -1, -1280, 1, 1280, -1, 0, 0, 1, +-1281, 1, 1279, 1280, 2817, 5887, 5889, 2815, 1281, -1281, -4350, -2818, -1279, -4353, -8959, -10496, +-10496, -8960, -8960, -8960, -7425, -4351, -2816, -1281, 2, 1277, 1283, 2814, 5888, 5889, 5886, 5891, +5886, 2817, 1279, 0, 0, 1, 1279, 1, -1282, -2814, -2817, -1280, 1281, -1, 1281, 4351, +4353, 2815, 1282, 1278, 1, -1281, -2815, -4352, -4353, -7423, -10497, -10496, -8959, -8962, -8957, -5891, +-4349, -2819, -2814, -1281, 1, -1, 4353, 7422, 4355, 2812, 5892, 5885, 4354, 2815, -1280, -1280, +1280, 1281, 1278, -1277, -2819, -2813, -3, 1283, 1277, 2819, 4350, 2817, -1280, -1281, -1278, -1283, +-1277, -2818, -4351, -7424, -10496, -10497, -8959, -8960, -8961, -8959, -4352, -2818, -4348, -2821, 4, -3, +2818, 7423, 7425, 4350, 2819, 2813, 2819, 2813, 1283, -1283, 3, -3, -1277, -2, 0, -2814, +-2820, 1285, 4348, 4355, 2814, 1281, -1281, -1279, 1280, 1280, -1280, -4353, -5887, -5888, -7425, -7422, +-8963, -10493, -10498, -8959, -5889, -4351, -4353, -4351, -1281, 1, 1280, 5887, 8961, 7424, 2815, 1282, +2813, 5892, 4347, 1285, -4, 2, -1280, -1281, 1, -1281, -2815, -1280, 2815, 5890, 5885, 2819, +-2, -1279, 1, 1278, 1, -2816, -4353, -5886, -7425, -8961, -8958, -8962, -8959, -8961, -8958, -5890, +-4350, -2818, -1279, -1, 1281, 4351, 8962, 8958, 5889, 2815, 2817, 4351, 5889, 4351, 2817, -1, +-4351, -2817, 0, 1281, -1, -2815, -1, 2817, 4351, 2817, 0, -1281, 1, 2816, -1, -2815, +-4352, -5889, -5887, -5889, -7423, -8960, -8960, -8961, -8959, -7425, -5887, -4352, -1281, 2, 2813, 4355, +5886, 7425, 5887, 4354, 4349, 4356, 2812, 4354, 4352, 2814, -1276, -4356, -1278, -1281, 1, -1, +2, 1277, 4355, 2814, 1, 0, 1279, 1281, -1281, -1278, -1283, -4349, -5891, -8958, -10497, -10495, +-8961, -8959, -8962, -8958, -8961, -5888, 1, 1279, 2816, 4353, 5886, 5890, 2815, 4353, 5886, 4355, +4348, 2820, 4349, 2817, 1281, -1282, 2, 1278, 1, 1, 1278, 1282, 1278, 1, -1280, 0, +0, 1280, 0, -1280, -1281, -2815, -4352, -7424, -10496, -10496, -8961, -7422, -8962, -8959, -8959, -5891, +4, 2811, 4357, 4348, 4356, 4347, 2820, 2813, 2818, 2816, 4351, 4353, 1279, 1280, 2, -3, +1283, 1278, 1, 0, 1279, 2818, 2813, 1283, -2818, -2815, 0, 1280, 1279, -1278, -2818, -4351, +-5888, -2817, -4350, -8961, -8960, -8960, -8960, -7425, -7421, -7427, -1278, 2815, 2816, 7423, 8962, 5886, +2817, 1, 1277, 2820, 2812, 4355, 1278, -1278, -1282, -1278, 2814, 5890, 2814, 2, -3, 2820, +4349, 2818, -2, -2814, -2, 3, -3, 1, 1, -2818, -5886, -4353, -5889, -8957, -8964, -8957, +-8961, -8961, -8958, -7425, -1280, 2816, 4352, 7424, 10496, 8961, 4349, 1284, -3, 1281, 4353, 4350, +1282, -1282, -2814, -2817, 1281, 5887, 4352, 1, -1, 2817, 2815, 1280, 1, 0, -1, 0, +0, 1, -1, -1279, -4354, -4350, -5889, -8959, -8962, -10493, -10500, -10492, -8963, -8958, -2816, 1278, +4355, 7420, 8965, 8956, 7426, 1280, -1282, 1284, 4347, 4357, 1276, -1277, -2818, -2815, -1280, 2815, +4354, 1277, 4, 1276, 2818, 1280, -1, 2, 1278, 1, -1281, -1278, -3, 3, -2818, -4352, +-4351, -7426, -7422, -8961, -12032, -12032, -10497, -7422, -2818, 1282, 4351, 5887, 7426, 8958, 7425, 2816, +-1280, 1280, 4353, 4350, 1281, -1279, -2818, -2813, -2819, 1282, 5887, 2816, 1, 1279, 2816, 0, +-1279, 1279, 2817, -1, -1280, -2815, -1281, -1279, -2817, -2816, -4351, -5889, -7423, -7425, -8960, -10495, +-8961, -5887, -1281, 2817, 5887, 7425, 8959, 8961, 7424, 1279, -1278, -4, 2821, 4348, 2819, -1281, +-4354, -5885, -2819, 1284, 5884, 5891, 2814, 1281, 1280, 0, -2816, 1279, 4354, -2, -1278, -2817, +-2816, -1280, -1279, -1282, -4350, -5890, -7422, -8962, -10494, -12035, -10493, -7426, -1280, 2818, 5885, 7427, +8958, 10497, 8960, 4352, 0, 1280, 1280, 2816, 1281, -1282, -2814, -4353, -4352, 1, 4350, 4354, +2816, 2814, 2, -1281, -1280, 1, 1279, -1279, -1281, -2815, -2818, -1277, -1283, -1278, -2817, -4352, +-5887, -7426, -12030, -13570, -12030, -7425, -2816, 1281, 7423, 8959, 8963, 7421, 7426, 5887, 1280, 0, +1281, 4350, 1283, -2820, -4348, -5891, -4350, -1, 2816, 4353, 2814, 1282, -1282, -2814, -4353, -1280, +1280, 0, -2815, -4354, -4350, -2817, -1281, 3, -2820, -5884, -7427, -7423, -8961, -13566, -12034, -5886, +-1282, 1281, 7424, 8959, 8962, 8958, 7426, 5886, 1282, -1283, 1284, 4348, 1284, -2819, -4351, -5888, +-4353, -1278, 2815, 4351, 4354, 4350, 1, -2816, -4353, -1279, 1280, -1281, -2815, -5889, -5887, -2818, +4, 1276, -1278, -4352, -7426, -7420, -8965, -13563, -13572, -7421, -2818, 1281, 4351, 8961, 12031, 8961, +8959, 5889, 1279, 1281, 1279, 2817, 2816, -2817, -5886, -5891, -4349, -1282, 1281, 4351, 4353, 2815, +0, -2815, -2818, -2814, -1, -1280, -2815, -4354, -5886, -4353, -1280, 2817, 1279, -2816, -5888, -7424, +-8960, -12032, -12031, -7427, -2813, 1278, 5890, 10494, 12033, 10496, 8959, 5891, -4, 3, 1279, 2816, +1281, -2818, -7422, -7426, -5885, -1284, 1285, 2810, 4358, 2811, 1283, -1282, -2813, -2820, -1275, -2822, +-4347, -2819, -4350, -4354, -1277, 4348, 2820, -1283, -4351, -7423, -8961, -10495, -12034, -7422, -2818, -1277, +2813, 8962, 10495, 8960, 7425, 5886, 1282, -1, 1280, 1281, 1278, -2814, -7425, -7423, -2818, -1278, +-2, 2818, 4351, 4353, 1278, -1279, -4351, -4355, -2811, -4358, -4346, -4357, -5885, -5889, -1280, 2817, +4350, 2, -4353, -5888, -7424, -12032, -12032, -7423, -1282, 1, 2816, 7424, 10496, 10496, 8960, 5888, +1280, 1280, 0, 0, 1, -2818, -5885, -7428, -4348, -1283, 2, 1279, 4352, 2817, 1279, -1280, +-2815, -4354, -5885, -5890, -4352, -4351, -5890, -4349, -2819, 2818, 5887, 1280, -2816, -4351, -7425, -10495, +-10498, -7422, -1282, 1282, 2815, 7423, 8962, 10494, 8962, 5886, 2817, 2816, 1280, 1, -1, -2816, +-7424, -8960, -5888, 1, -2, 2, 2814, 2818, -1, -1281, -1277, -2820, -5884, -5890, -5888, -4351, +-4352, -2818, -1277, 2814, 5888, 4354, -2, -2815, -5888, -8961, -10494, -5891, -1276, 1276, 2819, 4351, +7423, 8962, 7422, 5890, 4350, 2817, 1280, 0, -1281, -2814, -5891, -7421, -4355, -1278, -1280, -2, +2819, 2812, 4, -2819, -2815, -2815, -5890, -5886, -5889, -7425, -5886, -4354, 1, 2817, 5885, 5891, +2814, -1279, -4352, -8960, -8960, -5888, -1280, 2815, 4354, 4350, 7426, 8959, 7423, 5890, 4350, 2818, +2814, 2, -2818, -4349, -5892, -7420, -5891, -2814, -2817, -1279, 1278, 1283, -1283, -4350, -2816, -2818, +-5886, -7425, -7424, -7423, -5890, -2815, 0, 4352, 5887, 7426, 5885, 3, -4354, -7423, -7425, -5887, +-1280, 2815, 4354, 2813, 5891, 7422, 7425, 5887, 4353, 4351, 2817, 1279, -1280, -2815, -4353, -7423, +-4353, -2816, -2816, -1279, -1, -1280, -2816, -4352, -2816, -2816, -5888, -8960, -7424, -8960, -5888, -2816, +1, 4350, 5891, 8957, 7425, 1281, -4354, -5885, -5892, -4348, -1284, 2820, 5884, 4355, 4350, 5889, +7424, 5888, 4352, 5887, 4354, 1277, -1276, -2819, -4351, -5888, -2816, -2817, -4350, -1282, -1279, -2816, +-4353, -4351, -4353, -4351, -7425, -10495, -8961, -8959, -7425, -4351, -1281, 2817, 7424, 8960, 8959, 4354, +-1283, -4349, -4354, -2815, -2816, 2815, 5890, 5885, 5891, 5886, 7425, 7424, 5887, 5889, 5888, 2815, +-1279, -2817, -4351, -4353, -4351, -2817, -2814, -1283, -1276, -4357, -4347, -4356, -4348, -4356, -7421, -10499, +-10494, -8960, -7425, -4351, -2817, 1281, 7422, 8963, 10494, 7426, 1279, -2817, -4351, -2816, -1280, 1281, +5886, 7425, 5888, 4351, 5889, 5887, 5889, 7424, 7423, 4353, -1, -2815, -2817, -2815, -4353, -4351, +-2816, -1281, -2815, -5889, -7424, -5886, -4355, -4349, -8963, -12030, -12032, -8962, -7421, -4355, -2814, 1280, +7422, 7427, 8957, 7427, 2813, 2, -1281, -2816, -1278, -4, 4357, 7419, 5893, 4347, 5892, 5886, +5888, 5890, 7421, 5890, 0, -2817, -2815, -1281, -2815, -4352, -4353, -2815, -4353, -5887, -7424, -8962, +-5885, -5891, -8957, -13570, -13568, -10495, -7425, -5886, -5890, 1281, 7423, 7425, 7424, 8960, 4351, 1281, +0, -1281, -1278, -3, 2819, 4349, 5891, 5886, 5889, 5888, 5887, 4353, 7424, 8959, 2817, -2816, +-2816, 0, -1280, -2818, -2813, -2819, -4349, -7427, -8957, -8964, -7419, -5894, -8955, -15107, -15102, -12033, +-8960, -5888, -5888, -1279, 5886, 7426, 7422, 8962, 5887, 2816, 2817, 1278, -1278, -2, 1282, 4351, +5888, 5889, 4349, 5892, 5884, 4355, 5887, 7423, 4355, -5, -1276, 1279, -1280, -2816, -2816, -2818, +-4348, -7428, -8957, -10497, -8961, -5886, -8963, -16637, -15106, -12031, -10496, -7425, -5887, -1281, 5888, 5889, +5887, 7424, 7425, 2814, 2818, 2815, 0, 1, 1279, 2816, 4353, 7423, 4353, 4351, 5888, 4353, +4350, 7427, 7421, 2, -1280, 1278, 3, -2819, -2813, -2818, -4351, -7425, -10496, -10495, -8962, -7421, +-8963, -15102, -16641, -12033, -10494, -7425, -5888, -2815, 4350, 5890, 5886, 7426, 7423, 4351, 4355, 4348, +1283, -1, 1280, 1279, 2819, 7419, 5894, 4346, 5893, 5885, 4353, 7424, 8959, 2817, 0, 1280, +2816, -1, -2815, -4353, -5886, -7425, -8961, -10495, -8961, -8959, -8960, -13569, -16639, -12033, -10495, -8961, +-7424, -2815, 2814, 5891, 4350, 5888, 5889, 4350, 4354, 5888, 4351, 1281, 1278, 1282, 1280, 5887, +5889, 4351, 5888, 5890, 4349, 5892, 8955, 4356, -2, 1281, 2817, 1277, -2813, -4354, -5887, -7424, +-10497, -12031, -10496, -7425, -8958, -12035, -15101, -13571, -8957, -8962, -5887, -2816, 1278, 4355, 2814, 4352, +5889, 5887, 5888, 5890, 4348, 1284, 1276, 1284, -1284, 2820, 5885, 2817, 5888, 4351, 2818, 4350, +8962, 7422, 2817, 2817, 4349, 2820, -1283, -5887, -8959, -7427, -8957, -12033, -10496, -8960, -10497, -12030, +-15106, -15102, -8962, -7423, -5888, -4353, -1278, 2814, 4353, 4352, 4351, 5890, 5886, 5890, 4350, 2817, +2816, 1279, -1278, 1278, 5888, 4354, 5885, 4354, 2815, 4353, 7423, 8961, 4350, 2818, 2815, 4352, +0, -5888, -8960, -8960, -10497, -12031, -12032, -8960, -8960, -12032, -13569, -13566, -10498, -7423, -5887, -2818, +-1278, 2814, 2817, 2816, 4353, 7422, 5890, 4350, 5889, 4353, 2814, 1282, -1282, 2, 4349, 4356, +4348, 2819, 2815, 2815, 5890, 8958, 5890, 4351, 4352, 4352, 1280, -4352, -8959, -8961, -10495, -12034, +-12030, -10497, -10495, -12032, -12034, -13565, -10498, -5887, -5888, -1281, 2, 2814, 2818, 1278, 2818, 7422, +7426, 5887, 5887, 7427, 4348, 1284, -3, 1281, 1281, 2814, 4354, 4351, 2815, 2818, 4350, 7425, +5888, 4352, 4351, 4354, 2813, -4349, -8961, -10497, -10494, -12034, -12031, -10496, -10496, -12032, -12031, -12034, +-10495, -4352, -2816, -2815, -2, 1282, 1279, 1279, 2819, 7420, 8965, 7419, 7427, 7423, 5888, 1281, +-1, 1280, 1281, 1278, 2818, 2814, 2818, 2815, 2816, 4352, 5888, 5888, 4352, 2817, 1278, -2814, +-8961, -10497, -10493, -12035, -12030, -10497, -12032, -13568, -12031, -10497, -10495, -4354, -1278, -1281, 0, 1281, +1277, 4, 1277, 5889, 8961, 7421, 7428, 8957, 8961, 2817, -1, 2816, 2817, 1278, 2819, 2814, +1280, 2816, 2817, 2814, 4356, 7419, 5892, 2813, 1282, -2817, -10495, -12032, -10498, -12029, -13571, -12030, +-10496, -13570, -12029, -10499, -8958, -2817, 1280, 1, -2, 1283, -3, 2, 1279, 5888, 7425, 7423, +8961, 10494, 10499, 5886, 1, 4352, 2815, 1281, 2817, 2814, 1282, 2814, 2817, 1280, 4352, 7424, +7424, 2815, 1281, -2816, -8960, -12032, -10496, -10496, -13568, -13568, -8960, -12032, -13568, -10495, -7427, -2813, +1278, 2817, 1280, 1279, 0, -1279, 1280, 4350, 7427, 8957, 8963, 8958, 10497, 8959, 2818, 4350, +4353, 1280, 2816, 2816, 1280, 2816, 2816, 1, 1279, 5888, 7424, 4352, 1281, -2817, -8959, -13570, +-12029, -10500, -12027, -15110, -12026, -12036, -13566, -10497, -7425, -2814, 1279, 2816, 1280, 2815, 2, -2817, +0, 4351, 7426, 7422, 7427, 8956, 10500, 8957, 4354, 5887, 5888, 1281, 2815, 1281, 1278, 2818, +1279, 1, 1279, 2817, 5886, 4355, 1277, -4350, -10497, -15104, -13567, -10497, -10496, -15104, -13567, -12033, +-13568, -12031, -7426, -2813, 1278, 4353, 2815, 1280, -1279, -4353, -1278, 2813, 7426, 5887, 5888, 8961, +10495, 8961, 7422, 7426, 5886, 1283, 1277, 1282, 2815, 2816, 0, 0, 0, 1281, 4351, 4353, +2814, -2814, -10497, -13568, -13566, -10499, -8958, -13569, -15104, -15103, -15105, -12031, -7425, -2816, 1281, 2815, +4354, 2812, -1275, -4357, -2811, 2811, 7428, 7422, 5889, 8960, 10494, 8963, 7422, 8961, 7423, 2816, +1281, 1279, 2817, 2815, 0, 0, 1, 1279, 1281, 2815, 2816, -2815, -10497, -13568, -12031, -10497, +-8959, -10497, -13567, -15105, -15103, -12033, -7422, -1282, 1281, 2816, 2815, 4354, -2, -4351, -4352, 1279, +7425, 7424, 5887, 7425, 10495, 8960, 7425, 10495, 8961, 2815, 1281, 1279, 2817, 2815, 1281, -1, +0, 2, -4, 2821, 2810, -2810, -8965, -13564, -12035, -10494, -8961, -10496, -12031, -13570, -15102, -12034, +-8958, -1282, 2817, 2815, 4353, 4351, 1281, -4353, -4352, 1, 5887, 8960, 7425, 5887, 8961, 10495, +8960, 10497, 10495, 5889, 1279, 1, 1279, 2818, 1277, -1278, -1281, 1, -1280, 0, 1278, -1277, +-8963, -12029, -12035, -10493, -8962, -8959, -10496, -13569, -16639, -15103, -10499, -1276, 5885, 2816, 1282, 4350, +1281, -4352, -4353, -1279, 4351, 7426, 7421, 5892, 8956, 10499, 8958, 12034, 13566, 7426, 1277, 1284, +-3, 1281, 1280, -1282, -2812, -3, -2815, -2816, -2, -2812, -7428, -10492, -12036, -10494, -8960, -8960, +-10496, -12032, -15105, -15103, -10496, -2817, 4355, 4348, 1283, 4350, 1281, -4351, -4353, -1280, 2816, 4352, +8961, 8958, 7427, 8957, 8962, 10495, 15104, 10496, 4352, 1281, -2, 1282, 2814, 1, -2816, -1280, +-1280, -2817, -2814, -4354, -7423, -8960, -10497, -10494, -8962, -8959, -8960, -10496, -13568, -16640, -12033, -2815, +4353, 5886, 1281, 2816, 1279, -4350, -2818, -1279, -1, 2818, 7421, 8963, 8958, 7425, 8959, 12033, +15104, 13568, 5888, 1279, 1, 1280, 2816, -1279, -2818, -2814, -1282, -4350, -5889, -5888, -7424, -8960, +-8960, -8959, -8962, -8959, -10496, -10497, -12030, -15106, -13567, -2816, 4351, 5890, 4350, 2817, 1, -4355, +-2812, -3, -1279, 1280, 5888, 12032, 8960, 5888, 7424, 10495, 15105, 15104, 8959, 2818, -1283, 2, +2815, 1, -2817, -2815, -2818, -4349, -7427, -7422, -7424, -7426, -7421, -7427, -8957, -8963, -8958, -8961, +-10495, -13568, -13570, -5886, 2815, 5889, 5888, 1279, -1279, -4353, -2815, 0, -1281, -1278, 5885, 12034, +12032, 5887, 5889, 10495, 16640, 18178, 12029, 2819, -1283, 3, 2813, 1282, -2816, -4354, -4348, -5894, +-8954, -8965, -7420, -7427, -5886, -5890, -8957, -8964, -8956, -8963, -10495, -13568, -12032, -5889, 1283, 5884, +5892, 1276, -1277, -2818, -2814, -1, -1280, -1280, 4352, 10496, 12032, 7424, 4352, 8960, 16640, 19712, +13567, 5890, 1278, -1279, 1281, 2813, -1277, -4355, -5884, -7428, -8956, -10501, -8956, -7426, -5887, -5888, +-7425, -8959, -8960, -8961, -10494, -12035, -12029, -5890, -1279, 4352, 5888, 1279, -2815, -2817, -1279, 0, +-1281, -2815, 4351, 12034, 13565, 8963, 4349, 7427, 16637, 19715, 15102, 7425, 2816, -1281, 1, 2816, +-1, -4350, -7426, -8959, -8960, -12033, -10495, -8960, -4354, -4349, -5890, -7424, -8958, -8963, -8958, -10496, +-10498, -4349, -1283, 2818, 4352, 2815, -2815, -4353, -1280, 1, -1281, -2815, 2815, 10497, 13566, 10499, +5884, 5893, 16635, 19716, 16637, 10498, 4351, 0, 1, 2815, 2816, -2816, -7424, -10495, -10498, -12029, +-12036, -8956, -5891, -4350, -4353, -5887, -8961, -8960, -8959, -10497, -10495, -5889, 1, 1279, 2817, 2816, +-2817, -5886, -1282, 1281, -1280, -1281, 2818, 10494, 13569, 12031, 7425, 5887, 15106, 19709, 18179, 12030, +5890, 1278, 2, 1278, 2818, -1282, -7422, -12034, -13566, -12034, -12030, -8962, -5886, -4354, -4350, -5890, +-7422, -8962, -7422, -10498, -10494, -5890, 2, -1, 1280, 1280, -2816, -5887, -2817, 2817, -2, -1278, +2815, 8961, 12032, 12031, 7425, 5887, 13569, 18176, 18176, 13568, 8959, 4354, -2, 1281, 2817, 1277, +-5884, -12036, -15101, -13570, -13567, -10496, -4353, -2815, -4353, -5888, -7423, -7425, -8959, -10498, -10493, -5892, +-1276, -1283, -1278, -2, -2814, -7426, -4351, 1281, 1277, -1277, 2815, 7422, 12036, 12028, 10499, 7423, +10495, 18177, 16640, 13568, 10496, 5888, 1279, 1281, 2815, 1282, -4355, -10493, -16643, -15102, -13569, -12032, +-5888, -2816, -4352, -5887, -5890, -7422, -7426, -10494, -8961, -5888, -2816, -1280, -1279, -2817, -4352, -7424, +-5888, -1280, 1281, -1282, 1282, 7423, 10496, 10496, 10497, 8958, 10499, 16636, 16644, 13565, 12034, 10495, +4351, 1283, 1276, 1284, -1283, -10494, -16641, -16640, -15104, -12032, -7423, -4353, -5888, -7424, -5888, -5888, +-7423, -8961, -8960, -5888, -4351, -2818, -4349, -2819, -4351, -7422, -7428, -2812, 1277, 2, 1279, 5889, +8958, 10498, 10495, 10496, 10496, 13568, 15104, 13568, 13568, 12031, 7426, 1278, 1281, 2816, -1, -7422, +-16642, -18175, -15104, -12033, -8958, -5890, -5887, -7423, -5890, -4349, -7428, -8956, -7427, -5886, -5889, -4352, +-4352, -4351, -5890, -7422, -7426, -4350, 1279, 1280, 1280, 5888, 8961, 10495, 12032, 10496, 10496, 13569, +13567, 12032, 13568, 15104, 10496, 2817, 1279, 2816, 2817, -4354, -13565, -18179, -16638, -12032, -8961, -5887, +-8961, -7423, -5889, -4350, -7427, -8957, -5890, -4351, -5888, -5889, -5887, -5889, -5886, -7427, -5884, -5893, +6, 1274, 1285, 4348, 8963, 8959, 10496, 12033, 10494, 12034, 12030, 12034, 12031, 15105, 12030, 5891, +1277, 1283, 4350, -2816, -12031, -18177, -16639, -12032, -8961, -7422, -10498, -8960, -5887, -4353, -5886, -7426, +-5887, -2816, -4353, -5886, -7427, -7421, -7426, -5887, -5888, -5889, -1279, 1279, 0, 4353, 7423, 8961, +10495, 12033, 12031, 10497, 8959, 10496, 12034, 16637, 13571, 7421, 2819, 2813, 4354, 0, -8961, -16639, +-16641, -10496, -8959, -8961, -12031, -10498, -5885, -2820, -4348, -7427, -7422, -2818, -2814, -7425, -7424, -8959, +-8963, -5884, -4355, -5886, -4353, 0, 1, 2814, 7427, 8957, 8962, 12032, 13566, 8962, 7423, 8961, +12031, 15105, 15102, 8963, 4349, 2819, 4349, 1282, -5889, -15103, -16641, -10496, -7423, -10498, -13565, -12035, +-7422, -4353, -4352, -5887, -7425, -2815, -2817, -7424, -8959, -10496, -10497, -5887, -2817, -5887, -4352, 0, +-2, 1283, 7421, 10499, 8958, 12033, 15103, 8961, 5887, 7424, 10497, 13567, 15105, 10495, 5889, 4351, +2817, 1279, -2815, -12032, -15104, -8961, -7423, -10496, -15104, -15104, -8961, -4351, -4352, -5888, -7424, -2816, +-1280, -7424, -10496, -12032, -13568, -7423, -1282, -4350, -5890, -1279, -1280, 0, 4352, 10495, 8962, 12029, +15107, 8959, 4351, 5890, 10494, 12033, 13568, 12031, 8961, 5888, 4351, 1281, -1281, -8959, -13569, -8959, +-5889, -8959, -13569, -15103, -10496, -5889, -4351, -4354, -5885, -4354, -2816, -5887, -8962, -13565, -13571, -8958, +-2818, -2813, -4355, -2813, -1284, -1276, 2813, 10498, 10496, 10495, 15104, 10497, 2814, 4354, 7424, 10494, +12035, 12028, 12035, 8959, 4352, 2816, 0, -5889, -10494, -8962, -5887, -8960, -13569, -16639, -12032, -7425, +-2814, -2819, -5884, -4356, -1277, -4354, -7422, -12033, -15105, -10495, -2816, -1280, -2815, -2818, -2815, -1281, +2, 7422, 12035, 12029, 13569, 12033, 4350, 2819, 5885, 8963, 10493, 12035, 13566, 10497, 5887, 4353, +1279, -2814, -5890, -5887, -5888, -8961, -13566, -16642, -15102, -8962, -4350, -2818, -5886, -4353, -1280, -2816, +-7424, -10496, -13568, -12032, -5888, -2816, -1280, -1281, -2814, -2819, 4, 4348, 10498, 13569, 13565, 12035, +5886, 1281, 4352, 5887, 10497, 12032, 13568, 13568, 5887, 4353, 1280, -1280, -1281, -4351, -4353, -7423, +-12033, -15103, -15106, -10493, -4355, -2814, -4352, -5889, -1280, -4350, -7428, -8955, -12036, -13566, -7425, -2816, +-1280, 1280, -2815, -4354, 2, 4350, 7425, 13569, 15102, 10498, 7422, 1282, 1278, 4354, 10494, 12034, +12031, 13569, 8958, 4353, 2817, -1281, 1, -1281, -4352, -7424, -10495, -13570, -16637, -12034, -5887, -4353, +-4352, -5887, -2817, -4350, -5891, -7421, -10499, -13566, -8960, -4353, -1279, 1279, -1279, -5889, -1279, 2815, +4353, 12031, 15105, 12031, 7425, 1279, -1280, 1281, 8959, 12034, 12029, 13571, 10494, 5889, 2817, -2, +1282, 1278, -2814, -5889, -8960, -12032, -16641, -13566, -5890, -4351, -4352, -4353, -4350, -4354, -5887, -5888, +-7424, -12033, -10494, -5890, -1279, 1281, 1278, -5887, -4352, 1279, 4354, 10495, 13567, 12034, 8957, 2820, +-1284, 3, 7422, 12033, 12032, 13568, 12031, 7425, 2816, 1279, 2818, 1277, -1277, -5890, -8959, -12032, +-16640, -13568, -5889, -4350, -5891, -2812, -4356, -4349, -5890, -5887, -5888, -8961, -8959, -7425, -2814, 1278, +1281, -2816, -4353, 2, 4350, 7426, 12030, 12034, 7422, 2818, -2817, -1280, 4352, 8960, 12032, 12032, +12032, 8960, 2815, 2817, 4351, 2818, -3, -4350, -7425, -10496, -15102, -13571, -7421, -4356, -7419, -4356, +-2813, -4354, -4351, -5888, -5888, -7424, -8961, -8958, -4354, 2, 2813, -1276, -4357, 5, 2812, 5890, +10496, 12031, 8961, 2815, -1279, -1281, 2817, 7424, 10495, 12033, 12031, 8961, 2816, 2816, 4351, 2817, +1280, -2816, -7425, -8959, -13569, -15102, -8962, -4352, -7423, -5889, -4351, -5889, -5888, -5887, -5890, -5885, +-7427, -8958, -7425, -1280, 1281, -1, -2816, -1279, 1279, 4353, 7423, 10496, 8960, 2817, -1281, -1280, +1, 5886, 8963, 12029, 12034, 8959, 2816, 2817, 5887, 2816, 1281, -1282, -7422, -8962, -10494, -13569, +-10496, -5888, -5889, -7422, -4353, -4352, -5888, -5889, -5886, -4354, -5887, -8960, -8961, -2815, 1280, -1, +-1279, 0, -2, 2819, 5886, 8961, 7423, 2817, -1281, -1278, -1283, 4355, 7421, 10499, 12029, 8962, +2816, 2814, 4356, 4346, 1286, -1284, -7422, -8960, -8961, -10496, -8959, -5889, -4351, -7424, -4354, -2814, +-5888, -5889, -4351, -4353, -4352, -7422, -8963, -2813, 1277, -1278, -1280, 1279, 1281, 1280, 5886, 7427, +5885, 2819, 1278, -1280, 1, 4351, 7425, 8959, 12033, 10496, 4351, 2817, 4351, 4353, 2816, -1281, +-7423, -8960, -7425, -10495, -8961, -5887, -5888, -7425, -4352, -2814, -5891, -5885, -2818, -2816, -4351, -5889, +-8959, -2816, 0, -1282, 3, 2814, 1282, -2, 4352, 5890, 2814, 1281, 1280, -1, 1, 2816, +4352, 5887, 10498, 10494, 4353, 2817, 4350, 4354, 1278, 1, -5888, -7424, -5888, -8961, -8959, -4352, +-5888, -7425, -4351, -2816, -5889, -5886, -1283, -2813, -5889, -7425, -7423, -2817, -1279, -1280, -1, 2817, +2815, 1, 1279, 4353, 1279, 1, -1, 0, 1281, 2815, 4353, 4351, 8960, 10497, 5887, 2817, +2815, 2817, 1279, 1, -4353, -7423, -7425, -8959, -7425, -4352, -5887, -7425, -5887, -2818, -4350, -5889, +-1279, -2817, -5888, -7424, -7423, -2817, -1279, -2817, 1280, 4353, 2815, 1281, -1, 2817, -1, -1279, +-1, 1282, 1278, 2817, 2815, 2818, 7422, 8962, 5886, 4353, 2817, 1277, 1284, -1285, -4346, -5893, +-7421, -8962, -7423, -4352, -5889, -5886, -5891, -2812, -4356, -5886, -1280, -1, -4350, -7426, -7423, -2816, +0, -1280, 2816, 4352, 4351, 1282, -2, 1282, -1282, -2815, -1280, 0, 2815, 4354, 2814, 1283, +5884, 7428, 7420, 5892, 2814, 1279, 4, -2822, -2810, -4356, -7422, -7425, -4351, -4353, -5886, -5891, +-5885, -4355, -2812, -2820, -1277, -3, -2813, -7426, -5887, -1280, -1, -1279, 2816, 5888, 4352, 2815, +2, -2, -1278, -2817, -2817, -1277, 2812, 4355, 2815, 2816, 2816, 5888, 8960, 7423, 4354, -3, +-1277, -4353, -2817, -1279, -5888, -7425, -5885, -4356, -4348, -5892, -5885, -4353, -2817, -1277, -1284, 4, +-1284, -7421, -5889, -1281, 3, -3, 4354, 5887, 5888, 4352, 2, -3, -1278, -4353, -4352, -2815, +2815, 4352, 2816, 2817, 2814, 4354, 7422, 8962, 5886, 2, -2818, -4351, -2816, -1281, -4350, -7426, +-5886, -4354, -5886, -5890, -4350, -4354, -4350, -1, -1280, 0, -1281, -5886, -5889, 1, -2, 2, +4351, 5888, 4352, 2816, 1280, 1, -1, -4353, -7422, -4354, 1281, 4352, 2815, 2818, 1278, 1281, +5887, 10497, 5887, 1, -4353, -5887, -2817, -1279, -2817, -5887, -5889, -5887, -4353, -5887, -5889, -4351, +-2817, -1278, -1283, -1277, -1283, -5885, -5890, 1281, 1280, -1, 2817, 5888, 4351, 2817, 2815, 1281, +0, -4353, -8959, -5890, 1283, 4350, 4353, 4352, 2815, 1281, 5888, 10496, 8959, 2, -5890, -5886, +-2818, -1279, -2816, -4352, -5888, -5889, -5886, -7425, -5889, -2814, -2819, -1276, -3, 1, -2816, -5888, +-4352, 1281, 2814, 1282, 2815, 5888, 4353, 2815, 2816, 1280, 1281, -2818, -8956, -7430, 5, 2813, +4354, 4352, 2814, 1, 5889, 10494, 8963, 1277, -7423, -7423, -4353, -1280, -1279, -4354, -5886, -5889, +-7423, -7426, -5885, -2820, -1276, -1284, 4, -4, -2812, -5891, -4352, 1282, 2814, 2818, 2814, 5889, +4351, 1282, 2814, 2818, 1277, -2812, -7428, -8957, -4354, 1282, 4349, 4357, 2810, 5, 2812, 10498, +10496, 4352, -7425, -8958, -4355, -2813, -1282, -2815, -5888, -7424, -10497, -8958, -5890, -2815, 0, -1281, +2, -2, -2815, -5889, -4350, 1278, 2817, 4352, 4351, 5890, 4350, 1281, 1280, 2816, 2816, -1280, +-5889, -8958, -5890, -1278, 4350, 5889, 4352, 0, 2817, 8957, 12036, 5885, -7422, -8961, -5888, -2816, +1, -1281, -5888, -8959, -12034, -8958, -5890, -2814, -1, -1280, 1280, -1, -2815, -4352, -2816, 1280, +4351, 4352, 5890, 5885, 2820, 2811, 1284, 2815, 1278, -1277, -4355, -8958, -8960, -2817, 4352, 5889, +4350, 1282, 1279, 7425, 12031, 8960, -4352, -8959, -7425, -4351, -1, 0, -2815, -8960, -13570, -10492, +-5893, -2811, -5, 4, 1278, 0, -4350, -4355, -1278, 1279, 2817, 5886, 7428, 5884, 2818, 2815, +1280, 2817, 1279, -1279, -1282, -7421, -12035, -5886, 4351, 7424, 4353, 2815, 1280, 5889, 12030, 10499, +-4, -7420, -8963, -5886, -2, 1282, -2818, -8957, -13571, -13566, -7426, -1277, -4, 5, 1275, 1283, +-2816, -2818, -1277, -3, 2818, 4351, 7425, 7422, 2819, 1277, 1283, 2813, 1282, -1281, 0, -4350, +-13572, -10491, 1275, 7428, 4349, 1282, 1279, 4353, 12031, 10497, 1279, -5887, -8961, -7422, -1282, 2818, +-1281, -10497, -13566, -13569, -8961, -2813, -1284, 4, 1277, 1, -2816, -1280, 0, 0, 2816, 4352, +5889, 7422, 4353, 1280, 1280, 1281, -1, -1281, 2, -2818, -12030, -15105, -1280, 5888, 4352, 1280, +0, 2816, 10496, 10495, 4353, -2815, -7427, -7421, -2819, 4354, 1280, -8960, -13569, -15103, -12033, -4352, +-1278, -3, 2820, -4, -2814, -1280, -1, 2, 2814, 4353, 2816, 5887, 7426, 2814, 1281, -1, +1, 0, 0, -1280, -8961, -15102, -5890, 2818, 2814, 1282, -2, 1282, 7422, 10498, 5886, -1278, +-5890, -7423, -4352, 2815, 1282, -7426, -12031, -15104, -13569, -7422, -1282, 1281, 2816, 1280, -2816, -2816, +0, 1280, 4352, 2817, 1278, 4354, 7423, 4353, 1280, -1, -2816, 2, -3, -1276, -5893, -12027, +-8964, 3, 1278, 2817, 1279, 2818, 7421, 8964, 8955, 5, -5892, -5885, -4354, 1281, 2815, -5887, +-10497, -13567, -15104, -10497, -4352, 1, 2815, 2818, -1283, -4349, -2818, 2817, 5887, 4353, 1279, 1282, +5885, 7426, 4351, 0, -4351, -2, 2, -2818, -4350, -8961, -8961, -2814, -1283, 1284, 1277, 2817, +5888, 7423, 8962, 2814, -4351, -4352, -2817, 2, 1278, -4351, -8960, -12033, -13566, -10499, -5884, -1284, +2819, 4350, 0, -2814, -4354, 1, 5888, 5886, 2820, -4, 4355, 8958, 7425, -1, -4351, -1281, +1, -2816, -4353, -5887, -7426, -4350, -1281, 1, 1279, 2816, 5889, 7422, 10499, 4348, -4348, -4354, +-2816, 2, -4, -5884, -7426, -8960, -13567, -12033, -7424, -2814, -4, 4356, 2813, -1278, -4353, -1280, +4353, 5886, 4354, -1, 2816, 8962, 10492, 2820, -4354, -2816, -1279, -2818, -4350, -4353, -5888, -4351, +-2819, -2812, 1276, 4356, 5885, 5889, 7424, 5888, -1280, -4352, -2816, -1281, -1277, -5892, -7420, -7428, +-12029, -13569, -8959, -4354, -1278, 2814, 4354, 1280, -2818, -1278, 2815, 5888, 4353, 1278, 1282, 5887, +10497, 5886, -2815, -4351, -2818, -2813, -4356, -2813, -4353, -4353, -2814, -2818, 1, 2817, 4350, 5889, +5889, 5884, 5, -4355, -1278, -1282, -2815, -5889, -5887, -5888, -8960, -13569, -8958, -5891, -1278, 1279, +2817, 1279, -1279, -1, 2816, 4352, 2816, 2816, 1280, 5888, 10496, 7423, 2, -4355, -4350, -4352, +-4354, -2812, -2820, -2814, -1, -2815, -1280, 2816, 2815, 5889, 5888, 4352, 0, -2816, -1280, 0, +-4352, -5888, -5888, -7424, -8960, -12033, -10494, -7426, -2814, 1277, 2820, 1276, 3, 1278, 2817, 2817, +2814, 2817, 2816, 4352, 8961, 8959, 2816, -2816, -5888, -4352, -4351, -2817, -1280, -1280, 1280, -1280, +-1280, 1280, 1280, 5889, 7422, 4354, -1, -1280, 1281, 1278, -4349, -5892, -5884, -7427, -8957, -10499, +-10494, -8962, -4350, 1279, 2817, -1, 1280, 4353, 4351, 2816, 1281, 2814, 2818, 4352, 8959, 8961, +2814, -1278, -4353, -4351, -5888, -4354, -1278, -1, 1280, 1, -2, 3, -4, 2821, 4347, 4355, +0, -1282, 2819, 2814, -4353, -5885, -5892, -7420, -8963, -10493, -10499, -10493, -5891, 1281, 4354, 1277, +3, 4350, 5889, 4350, 4, 1274, 2823, 4346, 7429, 7420, 2819, -3, -2812, -5892, -5885, -5890, +-2815, 0, 1280, 1280, 1279, 1, -2816, 1279, 4355, 2811, 6, -1286, 2821, 4349, -1279, -5887, +-7426, -7421, -8963, -10494, -10497, -12031, -7424, -1, 2817, 1280, -1, 4355, 7419, 4357, 1277, 1, +2817, 5885, 7427, 7422, 1281, 1280, -2, -4348, -4357, -5883, -4356, 2, 2816, 1280, 2816, 0, +-2817, -1278, 1279, 2816, 0, -1280, 1280, 5889, -2, -4350, -7425, -7424, -8959, -12034, -12030, -12033, +-5888, -1279, 1278, 2818, 1278, 1282, 7423, 5888, 2816, 1280, 1280, 4352, 7424, 7424, 1280, 0, +1280, -2816, -5888, -4352, -4352, -1280, 2817, 2815, 4352, 1280, -2816, -2815, -1, 1281, -2, -2813, +-3, 5890, 4352, -2818, -7421, -8963, -8958, -12032, -12033, -12031, -7425, -1280, 1, 2816, 2815, 1281, +4350, 5890, 4352, 2815, 2817, 2815, 5889, 5888, 1279, 1, 1280, 0, -4351, -4355, -5885, -1282, +2818, 4351, 4351, 1281, -2815, -2818, -2814, -2, 1281, -2815, -1281, 4352, 5888, 0, -7424, -10495, +-10497, -10496, -12032, -12033, -7421, -1284, 5, 2810, 4357, 2813, 2817, 5890, 5884, 5892, 4349, 2817, +2817, 5886, 1281, -1279, 1277, 1284, -1284, -4350, -5888, -2816, 0, 4352, 5887, 2818, -1281, -2816, +-2816, -1281, 1282, -2817, -2816, 2817, 5885, 2820, -4356, -10493, -12033, -12033, -12031, -12031, -7427, -1276, +-5, 1284, 2815, 4351, 2818, 2813, 5891, 7422, 5889, 2815, 2817, 4351, 1281, -1, 1, 1279, +0, -2815, -4353, -2815, -1, 2816, 5889, 4352, -1, -2815, -2817, -2815, -1281, -2814, -2819, 1284, +5884, 4355, -1282, -10495, -13567, -13570, -12030, -12034, -8958, -4354, 1282, 2814, 2818, 2814, 1282, 1278, +5890, 10494, 8962, 4350, 1282, 2814, 2818, -2, -1279, 0, 1280, -1280, -2816, -1280, -1, 2, +4349, 4356, 1276, -2813, -4354, -4351, -4352, -4352, -2817, 1282, 2814, 4353, 1280, -8961, -13567, -13568, +-13569, -12031, -8960, -5889, 2817, 4351, 1281, 1279, 1282, -4, 2820, 10493, 10498, 4351, 1280, 1280, +2816, 1, -2818, -1278, 1278, 2, -1282, 2, 1278, 2, 1279, 4351, 1283, -1284, -4348, -4355, +-5887, -5887, -2817, 1280, 1280, 2816, 2816, -5887, -13570, -13567, -13567, -13570, -10494, -5890, 2816, 5891, +1275, 5, 2813, 1280, 1283, 10492, 12036, 7420, 2820, 1277, 2819, 1277, -2814, -4354, 2, -1, +-1280, 1281, 4350, 2, -2, 2818, 2815, 0, -4351, -2817, -5888, -7423, -2818, 1282, 1279, 2817, +4350, -4349, -13572, -13564, -15107, -13566, -10497, -5888, 1281, 5887, 2817, 0, 1279, 1281, 1279, 8961, +12032, 8960, 4351, 1281, 2814, 1283, -2818, -4352, -1278, 1277, 1282, 1280, 5886, 2819, -2, 1281, +1279, 0, -2816, -2815, -5888, -8961, -4352, 1, 1278, 1283, 2814, -2816, -10495, -12034, -13565, -15107, +-12030, -7426, 1, 4353, 2815, 1280, 1280, 1280, 1280, 7425, 12030, 10498, 5887, 4352, 2817, 2814, +-1279, -5888, -4352, 1280, 2816, 1279, 4354, 2814, 2, -1, -1, 3, -2820, -4348, -4355, -8958, +-5890, -1278, 1278, 1282, 1279, -2816, -8960, -10495, -12033, -16639, -13569, -7423, -1, 2818, 2814, 1280, +2, -3, 1283, 5887, 10494, 10500, 5884, 5891, 5887, 2815, -1278, -7426, -7422, -2, 4354, 1278, +2818, 4351, 2816, 0, 0, 1, -2818, -4350, -2817, -5888, -7423, -2818, 1282, 2815, 1, -2817, +-7423, -8962, -10493, -13571, -13565, -8962, -2816, 2817, 2815, 1280, 1, -1, 2816, 4353, 7422, 8962, +7423, 5888, 7424, 4353, -2, -5886, -8961, -1280, 4353, 2814, 2818, 4350, 4354, 1278, 2, -1282, +-4351, -4352, -1, -4350, -8962, -4351, 1, 1277, 1284, -4356, -8957, -7425, -8960, -13568, -12032, -8961, +-5886, -2, 4354, 2814, 2, -3, 2820, 4348, 7427, 7422, 7424, 5890, 7422, 7425, 1279, -2815, +-7425, -2814, 4349, 1283, 1277, 4355, 4350, 1281, -1, -1279, -5889, -5887, -1281, -2816, -7422, -5891, +2, -1, 0, -2815, -7425, -7424, -8959, -12034, -10493, -8963, -7421, -2818, 2817, 4351, 1, -1281, +1282, 5886, 7425, 7424, 7423, 5890, 7421, 7427, 4350, -1279, -7425, -2815, 2815, 2818, -3, 4354, +4351, 1280, 2, -2, -5886, -7427, -1278, -1280, -7424, -5888, 0, -1282, -1276, -1284, -7421, -8962, +-8959, -10496, -8960, -7425, -8958, -5891, 4, 5884, 1283, -1282, 1281, 4352, 7424, 7423, 5890, 4350, +5890, 7423, 5888, 1281, -5890, -2814, 2815, 2817, -1, 2816, 5889, 2815, 0, 1281, -4354, -8958, +-2817, -1280, -5888, -4351, -3, -2812, -1284, -1276, -5892, -7420, -7428, -10492, -8963, -5887, -7423, -7427, +-2811, 5883, 2820, -2, -1, 4355, 7420, 7428, 5886, 5888, 4353, 5886, 5890, 2814, -2813, -2819, +1282, 2815, 1280, 1281, 4351, 4353, -1281, 1, -2816, -7425, -4350, -1283, -4348, -2820, 4, -2820, +-2813, -1282, -2815, -7424, -8961, -10495, -8961, -5888, -4351, -8961, -5887, 2814, 4355, 1276, 1285, 4347, +7428, 7422, 7424, 5889, 4351, 4353, 4351, 4353, -1, 0, 1281, 2815, 1281, 1279, 2816, 4352, +1, -1281, -1279, -5890, -5885, -2819, -4350, -2816, -2, -2813, -4355, -2814, -1281, -5887, -10497, -10495, +-8961, -5888, -4351, -8962, -7421, 1277, 4355, 4349, 1282, 2814, 5890, 7423, 7425, 7422, 5891, 2812, +2821, 2812, 1282, 1279, 2816, 2817, 1279, 1, 1279, 4352, 1281, -2817, -2815, -2817, -5888, -4351, +-2817, -1278, -1284, -2811, -4357, -4347, -4, -4351, -10494, -12034, -8959, -5888, -4354, -7421, -7426, -1279, +2816, 4351, 2818, 2812, 4358, 5881, 7431, 8955, 7426, 2815, 2817, 1280, 1279, 2817, 2815, 2817, +1280, -1, 1, 2815, 2817, -1, -4350, -2819, -4349, -4355, -1278, -1, -1280, -4351, -4353, -4352, +-1279, -2818, -8958, -13569, -8960, -5886, -5892, -5883, -7429, -2812, 1278, 5889, 4351, 1282, 2813, 5891, +8959, 12031, 7426, 2813, 2819, 1278, 1282, 5886, 5889, 2816, 0, -1280, 0, 0, 2817, 1278, +-4350, -4353, -4352, -5886, -1284, 1284, -2819, -5885, -4355, -4350, -1280, -2817, -7423, -13569, -10495, -5889, +-5886, -5892, -5884, -2818, 1280, 5889, 4351, 1280, 1, 4351, 8960, 12033, 8959, 4353, 2815, 1, +1278, 5891, 5885, 4355, 1277, -1278, -1281, 1, 1279, 1280, -4351, -4354, -4350, -7425, -2816, 2817, +-1281, -5888, -7424, -4352, -1279, -2817, -7424, -13567, -10497, -5888, -7422, -5892, -4347, -2821, 4, 4349, +5890, 1279, 1, 1278, 7426, 10495, 10495, 5891, 2812, 1285, -5, 4356, 7420, 4356, 1278, -1280, +-2815, -1281, 0, 1, -2818, -5886, -5889, -5888, -4352, 2815, 2, -5890, -8959, -5887, -1283, -2813, +-7426, -12031, -12032, -8960, -5889, -7422, -4354, -2815, 1, 4349, 5892, 2813, 2, -1, 5888, 12032, +8961, 5886, 4354, 2814, 1282, 4351, 5888, 4352, 1281, -2, -2814, -2818, -1278, -2817, -1280, -4351, +-5890, -4350, -4354, 2, 1279, -2815, -8962, -7422, -2818, -2813, -5891, -10494, -10497, -10496, -7423, -7426, +-4349, -2820, 4, 4350, 5888, 2817, -1, 0, 4353, 10495, 8960, 7425, 5887, 4352, 2816, 4352, +5889, 4350, 2818, -2, -1277, -2819, -2813, -4356, -2812, -2819, -5885, -4355, -4350, -2817, -1, -1278, +-7425, -8960, -4352, -2816, -5889, -8957, -8964, -10492, -8964, -5884, -4355, -2814, -1281, 2816, 7424, 4352, +0, 1, 2814, 7426, 8958, 7425, 5888, 5888, 4352, 5888, 5888, 4351, 1282, -2, 2, -1281, +-1280, -4352, -2815, -1281, -4352, -4351, -4353, -4351, -1280, -2, -5886, -8960, -7425, -4351, -7424, -7426, +-7421, -12034, -8959, -5888, -4353, -1278, -3, 2819, 5886, 4353, 2816, 1279, 2817, 5887, 5890, 7421, +7427, 8958, 5888, 5890, 5885, 5891, 1278, -1280, 1, -1280, -2817, -4351, -4353, -2816, -1278, -2819, +-4349, -5892, -4348, -2, -2815, -5888, -8962, -8958, -7425, -5887, -5889, -10495, -10498, -4349, -2820, -1277, +-1, 1280, 4352, 5888, 4351, 2817, 2816, 4351, 4353, 5888, 7422, 10499, 10494, 7425, 7424, 5887, +1281, -1280, 0, 1280, -2817, -5886, -5890, -4350, -1283, -1277, -4354, -7422, -4354, -2815, -2816, -4353, +-7422, -10498, -8958, -5890, -5887, -8961, -10494, -4355, -2812, -1284, 3, 1278, 2816, 5890, 5885, 4356, +2812, 2819, 1279, 4351, 5890, 10494, 13570, 8959, 7424, 5889, 2814, -1277, -4, 2820, -1283, -5887, +-7423, -4354, -1278, -1281, -4353, -5886, -5890, -4350, -2817, -4353, -7422, -12034, -10494, -7426, -5886, -7426, +-8959, -4353, -1278, -2818, 2, 1278, 2816, 5890, 7422, 5890, 4349, 1283, -2, 2818, 4350, 10497, +15103, 10498, 7422, 7426, 4349, 4, -1284, 2820, -3, -5887, -8960, -5888, -2815, -1282, -4350, -5890, +-5886, -5889, -4353, -4351, -5888, -10495, -12034, -8959, -7425, -5886, -7425, -4352, -1281, -2815, -1280, 1280, +2816, 4351, 7425, 7424, 5887, 1282, -3, 1283, 2815, 8960, 16640, 13568, 7424, 5888, 4353, 1278, +2, 2814, 1282, -5890, -10494, -7426, -2815, -1281, -5886, -4355, -5885, -7427, -4349, -4354, -7423, -10497, +-12031, -10497, -8959, -5889, -5887, -4352, -1281, -1279, -1280, 1278, 2819, 4349, 7427, 8958, 7425, 2815, +1, 1280, 1279, 7425, 16640, 16640, 8960, 5887, 4354, 2814, 1282, 2814, 2817, -4353, -10494, -8962, +-2815, -2816, -7424, -5889, -4350, -8962, -7422, -4353, -5888, -8960, -12032, -12032, -10496, -5888, -2816, -2817, +-1278, -1283, -2813, 1278, 4353, 4352, 7424, 8960, 8959, 2818, -2, 1282, -1, 5888, 13567, 16642, +12029, 4356, 2812, 2819, 2814, 4353, 2815, 1, -7425, -10495, -5889, -4351, -5890, -5885, -5891, -8958, +-8961, -4352, -5887, -10497, -12031, -12033, -10495, -7425, -2815, -1281, -2815, -1281, -2815, -1280, 2815, 4353, +5887, 7425, 8960, 4351, 1, 1279, 1282, 5886, 12033, 15104, 12031, 5889, 2816, 4352, 4352, 5888, +4351, 1281, -5888, -10497, -7422, -5890, -5887, -7425, -5887, -7425, -10494, -5890, -5887, -10496, -10497, -12031, +-8960, -8961, -4350, -3, -1276, -1284, -2812, -1285, 1285, 4348, 5891, 7422, 8961, 5887, 1, 1279, +1281, 4351, 8961, 12031, 13569, 7423, 2817, 4351, 5889, 7423, 5888, 2817, -2817, -8958, -8964, -5883, +-5894, -7418, -7428, -8958, -10497, -5888, -5887, -10498, -10494, -10498, -7422, -7424, -4354, 2, -1283, -1276, +-1283, -1278, -1, 4351, 7426, 7422, 8962, 5887, 2815, 1282, 2815, 4351, 7427, 10492, 13572, 8957, +2818, 2815, 5889, 7423, 7424, 4352, -1279, -7425, -10495, -5890, -5885, -8963, -8958, -8960, -10499, -7418, +-7430, -10491, -10500, -10494, -7425, -7423, -5889, 1, -1, -1279, -1281, -1280, -1280, 1281, 5887, 8960, +7425, 5887, 4352, 2816, 4353, 5886, 5892, 7418, 12037, 10494, 4351, 2819, 5884, 7428, 7420, 5891, +-2, -5886, -10497, -7424, -5889, -10494, -12034, -10493, -10500, -8957, -8961, -8960, -10496, -10496, -7424, -5887, +-5890, -1278, -1281, -1279, -1, 0, -2816, 1, 4351, 7424, 4353, 4350, 5891, 4348, 2820, 4349, +5891, 4349, 8962, 10495, 5888, 2817, 5888, 8958, 8963, 7421, 1282, -4353, -8959, -7425, -4352, -10495, +-15106, -12030, -10497, -10497, -10494, -10498, -10494, -10498, -5886, -4354, -5887, -1279, -1282, -1277, -1283, -1279, +-1280, 0, 2816, 5888, 4352, 4351, 4353, 5887, 5889, 4351, 4353, 2816, 5887, 10497, 8959, 2817, +4352, 8960, 8959, 7425, 1280, -4353, -5886, -7427, -5884, -8964, -16637, -13570, -10494, -12034, -12030, -10498, +-10494, -10497, -5888, -2815, -2819, -1276, -4, -1276, -1283, -1279, 0, 0, 2816, 4351, 2819, 4349, +5891, 7420, 7428, 4349, 4355, 2813, 4354, 8959, 10497, 4351, 4352, 8961, 10495, 7425, 1279, -1280, +-4352, -5887, -4353, -7423, -15105, -15104, -12031, -13569, -13567, -8961, -8959, -10496, -7425, -2816, -2815, -1281, +2, -1282, -1279, -2817, 2, 1277, 2820, 2813, 1281, 2817, 5885, 8964, 8956, 4356, 2812, 2820, +2812, 7428, 10493, 7425, 7425, 8958, 10498, 8959, 1279, -1278, -4354, -4350, -4354, -7422, -13570, -16639, +-15104, -16641, -13566, -8962, -8959, -10497, -8959, -2817, -1278, -1283, 2, 0, -2818, -2812, -5, 4357, +4347, 1285, -1284, 1283, 4350, 8960, 10498, 5885, 1284, 1276, 1282, 4352, 10495, 7426, 7421, 8963, +8957, 8963, 2814, -1280, -2815, -2817, -2815, -7425, -10495, -15105, -18175, -19714, -15101, -8963, -8957, -8963, +-8958, -2816, -1282, -1277, 1277, 3, -2819, -5885, -1283, 4355, 4349, 1282, -1281, 1, 4351, 8961, +10494, 7427, 2812, 1284, 1278, 2816, 8961, 8959, 8960, 10497, 8959, 8961, 4352, -1281, -2815, -1281, +-2816, -5886, -10500, -13563, -19717, -21244, -16642, -10496, -8960, -7423, -7425, -4350, -1283, -1278, 1279, 1281, +-2816, -5889, -2815, 4351, 5888, 2817, -1281, -1279, 4351, 8960, 10496, 7425, 4351, 1281, 2814, 4355, +7421, 10499, 10493, 10498, 8959, 8961, 4350, -1277, -1283, -1278, -2817, -5888, -8959, -13569, -19712, -21248, +-16639, -12034, -8957, -5891, -7423, -4351, -1281, -1279, 1279, 1280, -1280, -5886, -4354, 1281, 5887, 4352, +1, -2816, 2816, 8959, 8960, 7424, 5890, 2814, 1281, 2815, 7424, 10498, 10494, 10498, 8958, 8961, +5887, 2, -1281, 0, -2816, -5889, -7423, -13567, -21250, -21246, -16642, -12031, -8960, -5889, -5886, -4354, +-1279, -1281, 1, 1279, -2814, -5891, -2814, -1, 4352, 5889, 2814, -1278, 1279, 5889, 10494, 8963, +5884, 2821, 1276, 2819, 5886, 10497, 12032, 8959, 7426, 10494, 7426, 1278, 1, 1, -2819, -5884, +-7428, -13565, -22785, -22785, -18175, -12032, -8960, -7424, -7425, -5886, -1282, -1277, -4, 1284, -2820, -5884, +-4355, -1278, 2815, 5888, 2816, -1280, 2816, 4352, 7425, 10495, 7424, 2817, 2814, 4355, 5885, 8962, +10496, 10495, 8962, 10493, 5891, 1277, 1284, -5, -1275, -5892, -8957, -13571, -21245, -22787, -19710, -12032, +-8962, -7421, -5891, -5885, -1284, -1276, -1283, 1282, -1280, -4354, -4349, -1283, 1282, 5886, 2819, 1277, +4354, 1279, 2815, 8963, 8956, 4356, 2813, 4354, 5886, 8962, 10495, 8960, 10497, 10494, 5891, 2813, +1282, -1, 0, -2814, -7427, -15102, -21249, -22784, -19711, -12033, -8960, -7424, -7423, -7426, -2813, -4, +4, -3, -1278, -4354, -4350, -2817, 1280, 4352, 2816, -1, 5891, 2812, 3, 5887, 8960, 5887, +5890, 7421, 5892, 7421, 10497, 10496, 12032, 8959, 5890, 2814, 2818, 1279, 1280, -1280, -7424, -16640, +-21248, -21248, -18176, -12032, -8960, -7424, -7424, -7425, -2814, -3, 4, -1284, -2813, -2818, -2815, -2816, +0, 4352, 2816, 1280, 4353, 5886, 1283, 2812, 5891, 7423, 5888, 7425, 5886, 7426, 8958, 10497, +12033, 10493, 4356, 2813, 2817, 1280, 1279, 1, -7423, -16642, -21247, -21248, -18176, -12032, -7424, -7424, +-5887, -5890, -4350, -1, 0, 1, -2818, -2814, -1281, -4352, -2815, 1278, 2818, -1, 2817, 5887, +1281, 1278, 4356, 7420, 7427, 7422, 5889, 7424, 8960, 10495, 12033, 10495, 5890, 2813, 1283, 1277, +2817, 2, -7427, -16637, -21251, -21246, -16641, -12030, -7426, -7423, -7425, -5887, -4352, -1280, -1281, -1278, +-2819, -2813, -1282, -1279, -1281, 2, 1278, 2816, 4354, 5885, 2819, 1278, 4353, 7423, 8961, 7423, +5889, 7424, 7423, 8961, 12032, 10495, 5890, 4350, 1281, 0, 2815, 1281, -7425, -16638, -21250, -22783, +-18177, -12031, -7424, -7424, -7424, -4352, -2817, -1278, -1282, -1279, -2816, -2816, -1, -1279, -2817, -2814, +-2, 2818, 4350, 5889, 2817, 1279, 4352, 7424, 8960, 7424, 5888, 7424, 7424, 8960, 12032, 8959, +4354, 4350, 2818, 1278, 2817, 2816, -5888, -15104, -19712, -22785, -19711, -12032, -8960, -8960, -7424, -4353, +-1279, -1280, -1280, -2816, -4353, -2815, -1, -1279, -1280, -2816, -2817, 2817, 5887, 4353, 1281, 1278, +5889, 8959, 8961, 7424, 4351, 4353, 7423, 8961, 10495, 8961, 4350, 4355, 4350, 2816, 2818, 2813, +-4349, -13571, -18174, -21249, -19711, -13568, -8961, -10496, -8960, -4352, -2815, -1, -1279, -2818, -5886, -2818, +1282, -1, -1280, -2816, -2816, 1280, 4352, 4352, 1279, 1282, 5885, 8964, 10492, 7427, 2813, 2818, +7423, 8962, 12029, 10499, 5885, 2818, 4351, 4353, 2815, 1281, -4353, -10495, -16641, -19710, -21250, -13567, +-8961, -12030, -10498, -2814, -2818, -1279, 1, -2818, -4351, -4353, 2, 1278, -1278, -2819, -2813, -3, +2819, 4349, 2818, 1279, 4352, 8961, 10494, 7427, 2813, 1282, 5887, 10496, 12032, 8962, 5884, 2820, +4349, 7426, 2815, 0, -4352, -8960, -13567, -18178, -19711, -15103, -10498, -12030, -10498, -4351, -2816, -2816, +0, -1280, -2815, -4354, -2814, 1278, 2, -2817, -1280, 0, 1280, 1280, 2816, 2816, 4352, 8960, +12033, 7421, 2820, -4, 2820, 8956, 12035, 10495, 5887, 1282, 1278, 5888, 5890, -3, -4349, -8962, +-13567, -15105, -18175, -15105, -12031, -13569, -12031, -4352, -1281, -1278, -3, -1277, -2818, -2815, -4351, -2, +1282, -1282, -1279, 1, -1282, 3, 2813, 4353, 4352, 8961, 13567, 8960, 1280, 0, 1, 5887, +10496, 10497, 5886, 1282, 1279, 5887, 5892, -5, -2813, -7425, -12033, -15101, -16643, -13567, -12032, -13568, +-12032, -5888, -1280, -1281, 2, -3, -1276, -2821, -4347, -2821, 1284, -2, -1279, -1, -1279, -1282, +1283, 5885, 5891, 7422, 12032, 8960, 1282, 1277, 3, 2813, 8962, 12032, 8960, 1279, 2, 4350, +5889, 2817, -1282, -7422, -12034, -15102, -15105, -13567, -13570, -13567, -13567, -8961, -2815, -1282, 2, -1, +1, -1281, -2816, -2816, 1, 1279, 1, -2, -1278, -2817, 1, 5886, 7427, 7420, 12037, 8956, +2818, -1, 0, 1282, 7422, 12033, 8959, 2817, -1, 2818, 4349, 4355, 1278, -7424, -13566, -13571, +-13565, -12034, -12031, -13569, -13567, -10498, -4348, -1284, 2, 1279, 0, -1279, -1281, -4351, -2817, 1281, +-1, 0, -1279, -2817, -1278, 4348, 8965, 8956, 10498, 8960, 1278, 3, -3, 3, 5886, 12033, +10494, 2819, -3, 1283, 4350, 5888, 2817, -5890, -12029, -12036, -13564, -12035, -10494, -13569, -15105, -12029, +-5892, -2811, 1275, 2820, 1278, 1, -1282, -2813, -2818, 1282, 1277, -1277, -2819, -1277, -1281, 2815, +8961, 10496, 8959, 7426, 2814, 1281, 0, -1, 4354, 10493, 10499, 5886, 1, -1280, 2815, 5889, +5888, -2816, -12032, -13569, -13567, -12033, -10494, -12034, -13567, -12032, -8961, -4351, 1280, 1279, 1282, 1278, +1, -2816, -2817, 1282, 1278, -1279, -1281, -1278, -1283, 1283, 7422, 12033, 10495, 7425, 1278, 3, +-1282, -1280, 2816, 8961, 10494, 5891, 1277, -1278, -1, 5889, 7423, 1, -8960, -12034, -13565, -13571, +-10493, -8963, -13566, -13569, -10495, -5889, 1, 1278, 1283, 1278, 1280, -2814, -2819, 1283, 1278, 0, +-1278, -1283, -1277, 1277, 7427, 12030, 10497, 5888, 2814, 3, -1282, -1279, 1279, 7426, 10493, 7428, +1276, -1277, -2, 4354, 7422, 2819, -5892, -8956, -12036, -13565, -10498, -7422, -10497, -13569, -10495, -7425, +-1279, 1280, 1279, 2817, 4351, 2, -2819, 1283, 2813, -1277, -1281, -1281, -1278, -2, 5889, 10496, +10496, 5888, 1281, -2, -1279, -2816, 1280, 5888, 8960, 7423, 2817, -1280, -1, 4354, 7422, 5888, +-2814, -7427, -12028, -13572, -12029, -8963, -8957, -13570, -12031, -10497, -4352, 1281, 1280, 4351, 5889, 1279, +-2816, 1281, 4351, 1, -1, 1, -2, 1283, 4350, 8961, 10495, 7425, 1280, -1280, -1280, -2816, +-1, 4354, 7423, 7424, 2816, -1280, -1280, 4352, 7425, 5886, 2, -4354, -10495, -15104, -12032, -8960, +-7425, -12031, -12033, -10494, -5891, -1277, -3, 2818, 7424, 4351, -2815, -1281, 4352, 2817, -1, -1279, +-1, 1281, 4352, 7424, 10496, 7423, 1282, -1282, -1278, -2817, -1280, 2816, 5888, 5888, 4352, -1280, +0, 4351, 7426, 5886, 1282, -2818, -8958, -15106, -12031, -10495, -8961, -10496, -13567, -12034, -7422, -2817, +-1280, 2816, 7424, 4352, -1280, -1280, 2816, 2815, 1282, -1282, 1, 2816, 4351, 5890, 8958, 7425, +1280, -1281, -1279, -2816, -2817, 1282, 2813, 5891, 4350, -1280, -1278, 4349, 7427, 5886, 1280, 2, +-7426, -15102, -12034, -12031, -10496, -8960, -10496, -12032, -8960, -4352, -2816, 1279, 7426, 5886, 1, -1280, +1280, 2816, 1280, -1280, -1, 2819, 4348, 4356, 7421, 7425, 1281, -3, -1276, -2819, -1279, 1, +2814, 5890, 4351, 0, -1279, 4350, 5891, 5885, 2818, 1279, -5888, -13567, -12033, -12031, -10498, -8958, +-8961, -12032, -8959, -4354, -2815, 0, 5888, 5887, 1282, -3, 1282, 2816, 2815, 1, -1, 2817, +4351, 2817, 4351, 5889, 1279, 2, -1283, -1277, -1282, 0, 1283, 2812, 2819, -2, 1, 4352, +7424, 5888, 2816, 1280, -4352, -10496, -12032, -12031, -12034, -10494, -8962, -10494, -10497, -5888, -2816, 0, +4352, 5888, 4352, 2817, 1278, 2818, 2815, 1281, 0, 2815, 5888, 2817, 2816, 4352, 1280, -1, +1, -1281, -1279, -1280, -1, 1282, 2812, 1284, 1277, 4355, 7422, 7424, 4353, 1279, -1279, -8961, +-10496, -12032, -13567, -10497, -8960, -10495, -10498, -5886, -4354, -1278, 2815, 4352, 5889, 4350, 2819, 2813, +1282, 1279, 1280, 2818, 5885, 2819, 1278, 1281, 0, -1, 1, -1280, -1281, -1278, -1283, -1277, +-2, 2816, 2817, 4351, 7425, 7424, 4351, 1281, -1282, -5884, -10501, -12027, -13572, -12029, -10498, -10495, +-8960, -5889, -2814, -2818, 1282, 4351, 5888, 7424, 2816, 1280, 1281, 1279, 1280, 2817, 4349, 2821, +-5, 4, -3, 2, -2, -1277, -2820, -1276, -1283, -4350, -1281, 2816, 4353, 5886, 5891, 5884, +5892, 2813, 2, -4353, -7424, -10495, -12034, -12030, -10497, -10496, -8959, -7426, -4350, -2817, -1280, 2816, +5888, 8960, 5888, 1280, 1280, 1280, 1281, 4350, 5890, 2815, -1279, -1281, -1279, -1281, 1, 0, +-1281, -1278, -2819, -4349, -2819, 1283, 4350, 5889, 5888, 4351, 4353, 2815, 1, -1280, -7424, -10497, +-12031, -12033, -10495, -12033, -10495, -7425, -5887, -2817, -2816, 1281, 5887, 10496, 7425, 1278, 2818, 2815, +1281, 4351, 4353, 2815, 0, -2814, -2819, -2813, -2, 1281, -1, -1279, -4353, -7423, -4352, -2, +4356, 7418, 5894, 4348, 4354, 2815, 1281, -1282, -5885, -8963, -10494, -12033, -10495, -12033, -10495, -8961, +-5888, -2814, -2819, 1283, 5885, 8962, 10496, 2814, 1283, 2813, 1282, 5887, 5888, 1280, 1, -2818, +-4350, -4353, 0, 1281, 1278, 3, -4355, -8958, -5889, 0, 4353, 7423, 5888, 4353, 4350, 2818, +1280, -1, -4351, -5889, -8959, -12033, -12030, -12035, -12029, -8962, -5888, -4350, -4356, 4, 5886, 7424, +10497, 5887, 2816, 2817, 1278, 5890, 7423, 2816, 1, -2817, -4352, -4351, -1282, 2819, 2814, 1, +-4352, -8961, -7423, -1, 4354, 4350, 5890, 4349, 4355, 2814, 1282, 1278, -2814, -4354, -7422, -10498, +-12029, -13572, -13563, -10502, -7419, -7427, -5886, -1, 5888, 5888, 8960, 7424, 2817, 2814, 2819, 5885, +5891, 2813, 1283, -2, -4352, -5886, -1283, 4355, 5886, 1, -4352, -7425, -8959, -2816, 2816, 2816, +4351, 5890, 4350, 1281, 2815, 1281, -2816, -2816, -4353, -10496, -12031, -12032, -15105, -12030, -7427, -7421, +-5891, -1277, 7422, 5889, 7424, 8958, 5891, 4350, 1281, 2815, 5889, 4351, 0, -1279, -4354, -5886, +-1281, 4352, 7425, 2813, -2812, -7428, -7420, -2819, 2817, 1280, 4352, 5888, 2816, 1279, 2818, 2814, +-1278, -1282, -2814, -7425, -10496, -12032, -15104, -13567, -8962, -8958, -7426, -1278, 5887, 7424, 5887, 8962, +8958, 4354, 2814, 2817, 5888, 5888, 1280, -1280, -2816, -7424, -2816, 4352, 5889, 4350, -1277, -5892, +-7420, -2819, 1282, -1281, 1280, 5888, 2817, 1278, 2819, 2812, 4, -4, -1276, -5891, -10494, -12034, +-13567, -13568, -12032, -8960, -7425, -1279, 4352, 5888, 5887, 8961, 10495, 7426, 2814, 2817, 4351, 5889, +1280, -1280, -2816, -7424, -2817, 2818, 5885, 4356, -1284, -5885, -7426, -2815, 0, -2818, 3, 4349, +2819, 1278, 2817, 2814, 1283, -3, -1277, -2818, -7423, -12033, -13568, -15102, -13570, -10495, -7424, -1281, +2817, 4352, 5887, 7425, 10496, 8959, 4354, 4349, 4356, 5883, 2821, -1283, -1279, -5888, -4352, 1279, +4354, 4350, 1, -4352, -7425, -2814, -1282, -2814, -2, 4353, 4353, 1278, 2818, 2815, 2816, 1, +-1282, -1279, -5888, -12032, -13567, -13570, -15102, -12035, -7420, -2820, 1284, 2812, 4356, 4348, 8964, 10492, +5891, 2814, 2817, 4352, 4352, -1281, -1278, -4354, -4351, 1280, 2816, 4352, 0, -2816, -4353, -2814, +-2818, -4350, -4355, 1284, 4348, 2819, 2814, 1281, 1280, 0, -1280, 0, -1281, -10495, -13568, -13568, +-16640, -13568, -7425, -2815, 0, 2815, 5890, 4350, 7425, 12032, 8960, 5888, 2816, 2816, 2816, -1279, +-1281, -2816, -2815, -2, 1282, 2815, 1281, -2818, -2813, -2820, -2812, -5891, -7422, -1, 4352, 2816, +2816, 2817, 1278, 2, -1283, 4, -3, -7422, -12034, -12030, -16642, -15102, -7425, -2816, -1280, 2817, +5885, 4357, 5883, 12035, 10495, 5888, 2817, 2815, 4352, 1, -1281, -1279, -1281, 1, 1279, 2817, +1279, -1279, -1280, -2817, -2816, -4351, -8962, -2812, 4347, 4356, 4349, 2818, 1280, -2, 3, -4, +2820, -4355, -12030, -13569, -15104, -15104, -7424, -1280, -2816, 0, 4351, 4354, 4350, 10498, 13567, 7423, +2817, 2816, 4351, 1283, -1284, 2, 1279, 1, 0, 1279, 1281, -1281, -1279, -2816, -4354, -5884, +-8964, -5885, 1278, 5889, 4352, 2816, 1279, 2, -2, 1282, 2814, -1278, -8962, -12030, -15106, -15103, +-8959, -2819, -2812, -1284, 4356, 4349, 4354, 7422, 12034, 8960, 2814, 1283, 2813, 1282, -2816, -1281, +2816, 1282, -3, 3, 1278, 0, -2815, -1280, -4353, -7422, -8964, -7420, -3, 5890, 5887, 2817, +1278, 2, -1282, 1281, 2817, -2, -5886, -12033, -15105, -15102, -8962, -2815, -4352, -2816, 2816, 4352, +4352, 5887, 12034, 10494, 5890, 1278, 1281, 2816, -1280, -2816, 4351, 2817, -1281, 2, 1278, 2, +-2819, -1277, -4355, -8956, -8964, -8957, -4355, 5891, 7421, 1283, -4, -1275, -1285, 1285, 2811, 2820, +-2819, -10493, -15106, -13568, -10495, -4353, -4351, -4353, 1, 2815, 2817, 5887, 10497, 10495, 7425, 2815, +1, 2816, -2, -2813, 2812, 4357, -4, -1278, 1280, -1, -2815, -1, -4351, -8960, -8961, -8958, +-5890, 2816, 7426, 2812, 6, -1286, 4, 1278, 2816, 4354, -2, -8959, -12033, -13567, -10497, -5886, +-4354, -4351, -1280, 1279, 4353, 5888, 8960, 8960, 7423, 4353, 0, 1279, 1281, -1280, 1279, 4354, +-3, -1277, 2814, 1281, -2816, -1280, -4353, -10495, -10497, -8958, -7427, 1283, 7420, 2820, -1283, -1278, +-1, 0, 1280, 4352, 1280, -5887, -10497, -12032, -10496, -7424, -4351, -4353, -2815, -2, 2818, 7423, +8960, 8961, 7422, 4354, -1, 0, 2817, -2, 2, 4351, 1281, -2817, 1281, 2815, -1279, -1281, +-2815, -10497, -12031, -8961, -7423, -1281, 4352, 2818, -2819, -2813, -3, 1283, 1278, 4354, 2813, -4349, +-7426, -8958, -10498, -8959, -4352, -2816, -2816, -2817, 1281, 7423, 8962, 8957, 7427, 4349, 3, -2, +2817, 1278, 3, 2813, 1283, -1282, 1280, 2817, -2, -1277, -4355, -10493, -12035, -8958, -7425, -2815, +2816, 2814, -1277, -4356, -1275, 1275, 1285, 2811, 4356, -2819, -5886, -5889, -10496, -10495, -5890, -2813, +-4355, -2814, -2, 7425, 7425, 8959, 7425, 2814, 1, -1279, 2814, 2819, 1276, 2820, 1277, -2815, +1, 2814, 1282, -1281, -4352, -8959, -12034, -8958, -5889, -4352, 1, 1278, 1282, -2817, -1281, 1282, +1278, 2818, 4350, 1, -4352, -4353, -7423, -10496, -7426, -4348, -4356, -4350, -1280, 5886, 8963, 10494, +7425, 2815, 1, -1281, 2817, 4351, 2817, 1279, 1281, -1, 0, 1281, 1279, 1, -4353, -8960, +-10495, -10497, -5887, -5889, -2815, -1, 2, -1283, -1277, 1277, 1283, 2814, 4352, 1282, -4, -2811, +-5892, -10494, -7424, -4354, -4349, -5891, -2813, 4349, 7427, 10492, 7428, 2813, 3, -1283, 2818, 5887, +2816, 1282, 1277, 3, -2, 1280, 1281, 1279, -2815, -7425, -10495, -10498, -7421, -5892, -4348, -1283, +2, -1281, 0, 1281, 1279, 2816, 4353, 2815, 1281, -1281, -4351, -7425, -5887, -4352, -4354, -5884, +-4357, 2821, 7420, 8963, 7422, 1281, -1, -1278, 1277, 4355, 4350, 1281, 2816, 1279, -1278, -3, +1283, 1278, -1278, -7426, -8958, -8963, -7421, -7426, -5886, -1281, -1280, -1281, 1282, 2814, 1282, 1278, +2818, 2814, 1282, -2, -4351, -4352, -4352, -5888, -5889, -5887, -4352, 0, 5888, 8959, 7424, 2818, +-2, -1279, 0, 2814, 4355, 1278, 4352, 2818, -1283, -2814, 1280, 2814, -1277, -5890, -8960, -7422, +-5891, -7421, -7426, -2815, -2817, -2815, 2816, 4351, 1282, 1277, 2819, 4350, 2816, 1, -2816, -1280, +-2817, -5888, -7424, -7423, -5889, -1279, 5886, 8962, 7422, 1282, 1278, 2, -1, 1280, 4352, 2816, +4351, 2819, -3, -2815, 0, 2815, -1278, -5890, -7422, -7426, -5887, -7424, -7425, -4350, -2818, -2814, +2814, 5889, 1280, 1279, 2818, 4351, 2815, 2, -2819, 4, -4, -4348, -8964, -8957, -7425, -1280, +4352, 7424, 5888, 1281, 1279, 2816, -1280, 1, 2814, 2819, 5885, 4354, -1, -2816, -1279, 2815, +-1280, -4351, -5890, -7420, -5893, -5884, -7427, -4349, -5890, -2815, 4351, 5889, 2816, 1279, 2818, 4350, +4353, 0, -1281, 1281, 2816, -2817, -8959, -10497, -7423, -2817, 4353, 5887, 5889, 1279, 2817, 4352, +-1, -1279, 1279, 2817, 4352, 4351, 1281, -2817, -2815, 0, -1, -2815, -5889, -7423, -7424, -5889, +-5887, -5888, -5889, -2814, 2814, 5889, 2817, 4349, 4355, 2815, 2816, 1280, 0, 2815, 4354, -1, +-7424, -12031, -10498, -2814, 2814, 4355, 5884, 1284, 1276, 5891, 1278, -1279, -1, 1282, 2814, 4353, +2815, -2815, -1280, -1280, -1281, -1279, -4352, -7424, -7425, -5887, -5889, -5886, -5890, -2815, 4351, 5889, +2816, 4351, 4354, 2813, 2819, 1278, 1280, 4354, 4349, 1283, -7426, -12032, -10494, -4355, 1283, 2814, +4353, 1280, 1279, 4354, 1277, -1277, -1282, 1282, 1278, 4353, 4352, -1281, -1277, -2820, -2812, -3, +-2814, -7425, -7424, -5888, -5887, -5889, -5887, -2818, 2818, 5886, 4354, 5887, 4352, 1280, 2816, 2816, +4352, 4352, 5888, 1280, -5887, -10498, -12030, -7426, -1278, 2814, 2818, 2814, 1282, 2814, 1281, -1280, +-2816, 0, 1281, 1277, 2820, -4, -1276, -4355, -5887, 0, -1280, -7424, -7424, -5889, -5887, -5888, +-5889, -4350, 1277, 5891, 5885, 4354, 2815, 1, 1279, 2816, 5889, 7422, 5890, 1278, -4350, -8961, +-10496, -8960, -2817, 1282, 4350, 1281, 1279, 2817, 1279, -1278, -4355, -1278, 1279, 1, 1280, -1, +1, -2816, -5889, -2815, -1281, -4350, -7426, -4351, -5889, -5887, -4352, -4353, 1, 7423, 10497, 5887, +1, -1281, 1282, 2813, 7427, 7422, 5889, 1280, -4352, -8960, -10495, -8962, -4350, -2, 2817, 1281, +1278, 1283, 1276, -1277, -2818, -2815, 0, 0, -1, 2, -1282, -1278, -4354, -4351, -2816, -2816, +-7424, -5889, -4351, -5888, -4353, -4350, -3, 8962, 12033, 5884, -1274, -1286, 1285, 2812, 7426, 8960, +5887, 1281, -2817, -8960, -10495, -8961, -5888, -1279, 2814, 2819, -4, 1284, 1277, -1278, -2818, -2814, +-1282, -1278, -2818, -2814, -1283, 4, -1284, -4349, -4353, -2817, -5886, -5891, -4349, -4354, -4351, -4351, +-1283, 8963, 15102, 7425, -1280, -2816, 1280, 4353, 7422, 8962, 4350, 1282, -1281, -8960, -10495, -8962, +-5886, -4354, 1282, 4351, 0, 1, 1278, 1, -2815, -5890, -2814, -1281, -2816, -4352, -4351, -2, +2, -4353, -4351, -4353, -7423, -7426, -2814, -1281, -2815, -4352, -1281, 8961, 16639, 8962, -1282, -2814, +1278, 2817, 5889, 8958, 5890, -2, -1278, -7426, -12030, -10498, -5887, -4352, -1, 2817, 1, -1283, +1283, 1277, -2814, -7423, -5891, -1277, -2819, -5885, -5890, 1, 1279, -2815, -4353, -4351, -8961, -7423, +-2817, 1, -1, -4351, -2817, 8961, 16639, 10497, 1279, -2815, 1279, 1281, 4351, 8960, 7425, -1, +-1279, -4353, -12032, -10495, -7426, -2812, 1275, 2820, -1283, -1279, 1282, -3, -1277, -7427, -7422, -4353, +-4352, -7423, -5889, -1280, 0, -1280, -1280, -4352, -8960, -7424, -2817, 2, 1278, -1279, -1280, 7423, +15105, 12031, 4354, -1283, 1283, 1277, 4354, 7423, 5889, 2815, 1, -4353, -10496, -12031, -7426, -2813, +-3, 2818, -1282, -1277, 1277, 2, -1281, -4352, -8959, -5888, -5889, -7423, -4352, -1, -1278, -1282, +1, -2816, -10497, -8958, -1282, 1281, 2815, 2, -3, 5891, 13565, 13570, 5888, 1278, 1283, 2813, +2818, 5887, 5889, 4351, 1281, -1281, -8959, -12032, -8961, -2815, -1, 2817, -1280, -2817, 2, -1283, +-2814, -4353, -7424, -7422, -5890, -7423, -4354, 3, -1283, -1277, -2, -2815, -10497, -8959, -2817, 1280, +4353, 2815, 2816, 5888, 12031, 13570, 8958, 4355, 2812, 2819, 2815, 4351, 4354, 4351, 2816, -1280, +-7423, -10499, -7420, -4355, -1279, 2816, 1281, -2818, -1277, -1284, -2812, -4355, -7422, -8961, -7424, -8959, +-5889, -1280, 1, -1281, -1279, -2817, -10495, -8962, -2813, -3, 4354, 4351, 4352, 5889, 10495, 13568, +12032, 7425, 4350, 2819, 2813, 2818, 1278, 1283, 2812, 4, -7428, -10493, -7425, -4352, -1279, 2813, +2820, -1285, -2810, -2821, -2812, -4356, -7421, -10498, -8959, -8959, -5891, -2813, -2, -1279, -2816, -4352, +-8961, -8958, -5891, -1276, 4348, 7428, 5884, 5891, 10495, 13567, 12034, 10494, 5889, 4352, 4352, 2816, +0, -1, 1282, 1278, -4351, -8960, -8961, -4350, -1282, 2816, 4353, -1, -2815, -4353, -4352, -2816, +-7424, -10496, -8960, -7424, -7424, -4353, 2, -2, -2815, -5888, -8960, -8961, -4350, -2819, 4355, 8959, +7423, 7425, 10496, 13568, 13568, 12032, 7423, 5890, 5886, 4354, -1281, -2817, 2, 1278, -2814, -7425, +-7424, -4352, -2815, 1279, 5888, 1281, -1281, -5887, -7425, -2816, -5888, -12031, -10498, -7421, -7427, -4350, +-1281, 0, -1280, -4351, -8961, -10495, -5889, -2816, 2817, 8959, 10497, 7422, 8962, 13567, 15105, 13567, +8961, 7422, 7426, 4351, 0, -4351, -4352, -2, -1277, -5891, -7422, -5888, -2817, 1281, 5887, 2817, +-2, -5885, -8963, -4350, -5889, -12032, -12032, -8959, -7426, -5886, -2817, -1281, -1277, -4356, -8956, -10499, +-7422, -1281, 2816, 7424, 8961, 8959, 10497, 12031, 15105, 15102, 10499, 7421, 7427, 5885, 3, -4356, +-5883, -2821, -1276, -4355, -4350, -5889, -4351, -2, 7426, 4350, 2, -4353, -8960, -7424, -5889, -10494, +-12034, -8958, -7426, -7422, -2819, -2813, -1282, -4351, -8960, -10498, -10493, -2819, 2819, 5886, 8960, 10497, +10495, 12033, 15104, 15104, 10496, 7424, 8959, 7426, 1278, -2814, -7426, -7422, -2818, -2814, -4354, -4351, +-4351, -1282, 4353, 5889, -2, -4349, -8963, -8959, -8959, -8961, -12032, -10495, -7426, -7421, -4355, -2814, +-2818, -2813, -7428, -8955, -12037, -4348, 4350, 4351, 5890, 10494, 10498, 12032, 15102, 15106, 10493, 7428, +7421, 8962, 4351, -1280, -7423, -8962, -5885, -2820, -2812, -2819, -2814, -1281, 2816, 5888, 2817, -1281, +-7423, -8962, -8958, -8961, -10495, -10497, -7423, -8961, -5887, -2818, -2813, -4355, -7420, -8965, -12028, -5890, +2817, 2816, 4351, 10497, 12032, 10496, 15104, 16639, 12034, 7422, 8962, 8959, 5888, 1, -7426, -10495, +-8960, -4351, -2818, -1277, -1284, 3, 1279, 4351, 4354, 1279, -4352, -8960, -12032, -10496, -8960, -10496, +-7424, -8959, -8962, -4350, -2818, -4350, -7425, -8960, -10496, -7423, 1278, 2818, 2814, 7426, 10494, 12034, +15102, 16642, 13567, 7424, 8960, 8960, 7425, 2815, -5887, -12033, -12032, -5887, -2817, -1279, -1281, 1, +1278, 1283, 2813, 2819, -3, -7421, -13571, -12028, -8965, -8956, -7426, -8960, -10494, -5891, -1278, -4352, +-7426, -8957, -10500, -5884, 1277, 2818, 1278, 5890, 10494, 12033, 15104, 16640, 13568, 7425, 7421, 8964, +8957, 4354, -2817, -10496, -12031, -8961, -4352, -1279, -1282, 3, 1276, 1284, -3, 2818, 2815, -5888, +-13568, -13568, -8959, -8962, -7421, -8964, -12028, -7427, -1278, -4353, -7424, -8959, -10497, -5887, -1, 1281, +-1, 2817, 7424, 10496, 16639, 16641, 13567, 7426, 7422, 8961, 8959, 5890, -1, -7425, -13566, -10499, +-5883, -2822, 6, 1275, 1283, 1279, 0, 1280, 4352, -1280, -12032, -13568, -10496, -8960, -7424, -7424, +-12033, -10495, -2816, -4353, -8958, -8963, -8957, -4354, 1280, 2818, -3, 1283, 5886, 10496, 16642, 18174, +13569, 7424, 7423, 8961, 8960, 5888, 2816, -5888, -12032, -10497, -5885, -4356, -2812, 2813, 2818, -2, +-1277, 1277, 5891, 1277, -8958, -13569, -10496, -8959, -7425, -7423, -10498, -10494, -4354, -5886, -8960, -7426, +-8958, -4354, 2, 2815, 1, -2, 2819, 8957, 15107, 18173, 13571, 7422, 7425, 8960, 8960, 5887, +2818, -2819, -8957, -12034, -5887, -5889, -4351, 2815, 2817, 1279, -1279, 1279, 4353, 2815, -4350, -13571, +-12030, -8961, -7424, -8959, -10497, -10497, -7421, -7428, -8957, -7425, -8960, -2816, 0, 2816, 1280, 1, +1278, 7426, 13566, 18178, 15102, 7426, 7423, 8960, 8961, 5886, 4354, -1, -5887, -10497, -5887, -5889, +-7423, 0, 4351, 2817, 0, 1280, 4352, 2816, -2817, -10494, -10497, -8961, -7421, -8965, -8955, -7427, +-7423, -8960, -8960, -7425, -7422, -2818, 1, 1280, 1279, -1278, -3, 5891, 12029, 16642, 15104, 7422, +7426, 8959, 8961, 5887, 4353, 1279, -4352, -7421, -7429, -5882, -7430, -1275, 2813, 1282, 1278, 2818, +4350, 2818, -1282, -7422, -10498, -8958, -7426, -8959, -10495, -7427, -7420, -10500, -8957, -7425, -7425, -2814, +-2, 1, 1280, 0, -1281, 4354, 10493, 13571, 13567, 8959, 7426, 8957, 8963, 5887, 4351, 2818, +-1283, -4349, -4354, -5887, -7425, -5887, -1, 2818, 1276, 2821, 2811, 1284, -1282, -5888, -8959, -7425, +-7423, -8961, -8959, -7425, -7423, -10497, -8959, -7425, -4351, -1281, 2, -3, 1283, -3, 3, 4351, +8959, 10498, 12029, 10499, 7422, 8962, 8958, 5890, 5886, 4353, 1280, -1281, -2814, -5890, -7423, -5889, +-1279, 2815, 2817, 2815, 2817, 1279, -1278, -4355, -7421, -7427, -8957, -8963, -8957, -7427, -7422, -12033, +-12033, -5885, -2820, -1276, -1284, -1276, -4, 1284, 1276, 2820, 5885, 8961, 8961, 10495, 10496, 8961, +8958, 7426, 5887, 4352, 2816, 1280, 0, -5888, -8961, -5886, -2819, 1284, 2813, 2817, 1280, 0, +1, -2817, -5888, -7424, -8959, -8962, -8958, -8962, -7422, -10497, -12033, -7423, -1280, -1280, -1279, -1282, +-1278, 1278, 4354, 2815, 4352, 5889, 7422, 10498, 12030, 8962, 8959, 7423, 4354, 5886, 4353, 2816, +1279, -4351, -7424, -7425, -4350, -3, 4355, 4350, 1281, -1281, 1, -1281, -4350, -7427, -8958, -7426, +-8957, -8962, -7424, -8959, -12034, -5886, 0, -1281, -2816, -2815, -1282, 1283, 5885, 2819, 2812, 4357, +4347, 8964, 12029, 10498, 8959, 5889, 4351, 5888, 5889, 5886, 2819, -2819, -5886, -8961, -4351, -1282, +1283, 2812, 1284, -1282, -1281, -1277, -2820, -7420, -10499, -7423, -8960, -10495, -7426, -8958, -10498, -7422, +-2817, 0, -1279, -4355, -2811, 1275, 5892, 4349, 1, 2816, 4352, 5888, 10496, 10496, 7424, 5887, +2818, 4349, 5891, 7422, 4353, 0, -4353, -10495, -7425, -2814, 1277, 1284, 1275, -1276, -1281, -1282, +-1275, -7430, -8956, -7425, -8961, -10494, -8962, -7423, -7425, -7422, -2819, -1277, -2819, -4350, -2817, 1281, +5886, 4355, -3, 1282, 4351, 4352, 8961, 10495, 8961, 4351, 2816, 4353, 7422, 8963, 4349, 1282, +-1281, -8960, -8959, -2817, 0, 1, -1, -1279, -2817, -1279, -1281, -5887, -8960, -7426, -7421, -10499, +-8957, -7425, -5889, -5887, -4353, -1279, -2816, -2816, -2816, -1, 4353, 4351, 1282, 1277, 4354, 4351, +7425, 10495, 8961, 5886, 2818, 4351, 7424, 8962, 5884, 2820, -4, -7420, -10499, -5886, -2817, -1280, +0, 0, -4352, -2815, -2, -2814, -7426, -7422, -7426, -10495, -8961, -5886, -4354, -5887, -4353, -2815, +-4352, -2816, -2816, -1, 1282, 2815, 1280, 1281, 2814, 2818, 5887, 8960, 8961, 5886, 2818, 4350, +8961, 10496, 7424, 4352, 1280, -4353, -10494, -5890, -2814, -2818, -1278, -1282, -2814, -4354, 2, -2817, +-7424, -7424, -8960, -8960, -8959, -4353, -2816, -5887, -5890, -4350, -4353, -2816, -2815, -1282, -1278, -2, +2818, 2814, 2817, 4352, 4352, 5888, 7423, 4354, 2813, 4356, 7420, 10500, 10493, 5889, 2816, -1280, +-7424, -5887, -2819, -1276, -2820, -2812, -4356, -4349, -2, -1278, -5889, -7424, -8960, -8960, -8960, -4351, +-1281, -5887, -7425, -5888, -5887, -2817, -1279, -1281, -2815, -2817, 2817, 4351, 2817, 5886, 4355, 4349, +5890, 5887, 2816, 2816, 5889, 10494, 12034, 7423, 4352, 1280, -4352, -5888, -2816, -1279, -2819, -7420, +-5892, -2813, 1278, 1, -4352, -7424, -10497, -8959, -7424, -5889, -2815, -4353, -10495, -7425, -5887, -4353, +-2816, -2814, -4355, -2814, 1280, 2814, 2820, 5883, 4356, 2814, 4353, 5888, 2815, 2817, 5887, 10498, +15101, 10500, 4347, 2821, -1284, -2813, -2818, -1278, -4355, -8956, -7428, -1277, -2, 2, -4354, -5886, +-12034, -10495, -5888, -5889, -2815, -4352, -8961, -10495, -5889, -4351, -4353, -2815, -4352, -5889, -1278, 2813, +4355, 5886, 4353, 1280, 2816, 5886, 4355, 2813, 5891, 8958, 15104, 13569, 5888, 4352, 2815, 1, +-1280, 0, -2816, -10497, -10494, -2818, 1282, 1278, -2814, -7426, -13566, -10498, -5885, -5892, -4347, -4358, +-8955, -10499, -7423, -4352, -5888, -4352, -4352, -4353, -2814, 1277, 4357, 5882, 2822, -6, 1285, 4348, +4355, 2815, 4352, 8960, 15103, 15106, 8959, 4353, 4351, 2816, 1281, 1279, -2816, -12031, -12033, -2816, +0, 1280, 0, -7424, -13568, -12032, -7424, -4351, -4354, -5886, -5889, -8959, -8961, -5888, -5887, -4354, +-2813, -2820, -2811, -5, 4355, 5886, 4354, -1, 1280, 4352, 4351, 4354, 4350, 7426, 15102, 15106, +10494, 4354, 5886, 5891, 5885, 4354, -2816, -12034, -12029, -4355, 1282, 2815, 1281, -5889, -12032, -12032, +-7424, -4352, -4351, -7426, -7422, -8961, -8960, -7423, -5891, -4347, -2822, -2809, -1288, 7, 2810, 4357, +2813, 1282, 1278, 4353, 4352, 4352, 4352, 7424, 13567, 15105, 12032, 5887, 5890, 8958, 8961, 5887, +-2814, -12035, -13564, -5891, 1, 2817, 2813, -4349, -12034, -13566, -10498, -4351, -4352, -7425, -7422, -7426, +-8959, -8960, -7425, -2813, -2820, -2812, -1284, 3, 1279, 2815, 2818, 1278, 1, 2816, 4352, 4351, +4354, 5885, 12035, 13566, 12033, 8960, 7423, 8961, 10496, 7423, -1278, -10499, -13565, -8962, -1279, 1281, +2813, -2812, -12037, -13563, -12036, -5885, -4354, -7423, -7425, -7423, -7426, -10494, -7425, -2815, -2817, -4352, +-1280, 0, 1281, 2815, 1281, 1279, 1, 1279, 4353, 5887, 5890, 5885, 10500, 13563, 12037, 10492, +8963, 8959, 12031, 8962, -2, -7423, -13568, -10496, -2817, 1282, 2813, -1277, -10498, -13567, -12033, -7423, +-4353, -7422, -8963, -8957, -7427, -8958, -8960, -4353, -1279, -2817, -1279, 1279, 1282, 1277, 3, 1278, +1281, 1279, 4354, 5884, 5894, 7418, 10501, 12028, 12034, 12032, 10496, 10496, 13568, 10496, 2815, -4350, +-10498, -12030, -4354, 1281, 4351, 1, -10496, -15104, -13569, -8959, -5889, -7423, -8960, -8960, -8961, -8958, +-7426, -4351, -1280, -2817, -2814, -2, 1, 0, -1, 1, -1, 1281, 2816, 5887, 4353, 7423, +10498, 12029, 10500, 12027, 10501, 10493, 12032, 10498, 4350, -2815, -7423, -10499, -7421, -1, 4351, 3, +-8964, -15101, -16641, -10496, -7423, -7426, -10494, -10497, -8959, -7425, -5887, -5890, -2813, -1283, -1277, -2, +1, -1281, 1, -1, 1, 1280, 2815, 4354, 4350, 5888, 12033, 12032, 10495, 10498, 12029, 12034, +13568, 8959, 4353, -1, -5888, -8959, -7424, -1282, 4354, -2, -8957, -13571, -16638, -13570, -7422, -7425, +-12032, -13568, -10495, -7426, -5886, -5889, -2816, -1279, -1, -1280, -1279, -2818, -2814, -1, 0, 1281, +2814, 4354, 4351, 7424, 12033, 12030, 8963, 10493, 13570, 15103, 12033, 8959, 5889, 1279, -4351, -7425, +-5887, -2817, 2816, 1281, -7425, -13567, -18177, -15104, -8959, -7426, -12029, -15108, -12028, -7427, -4351, -4352, +-2816, -1, 1282, -3, -2813, -2818, -2815, -1281, 1281, 1280, 1279, 4354, 2814, 5889, 12032, 12031, +8962, 12030, 15105, 16639, 13569, 7423, 5889, 2815, -1280, -4351, -4353, -1279, 1280, 1279, -4351, -13568, +-18176, -16640, -8960, -7425, -13566, -16641, -13568, -8960, -4352, -2817, -2814, -1281, 2816, 0, -2816, -2816, +-2816, -1279, 2814, 1282, 1280, 2814, 4355, 5885, 10498, 10495, 8960, 12033, 15103, 16640, 13568, 7425, +5887, 2817, -1, -1280, -2815, -1280, -1, 1282, -4355, -12029, -18178, -18174, -10499, -7421, -13570, -18175, +-15103, -10499, -7421, -4354, -1279, -1, 2817, -1, -2815, -2816, -4354, -2814, 2815, 2816, 1, 2815, +4353, 5886, 8962, 10495, 10497, 12032, 15102, 16643, 13565, 7427, 4349, 1283, -2, 0, -1278, -4, +-1275, -5, -2812, -10499, -18173, -19715, -12030, -7425, -13568, -19711, -16642, -13566, -8961, -2815, -1281, 1, +2814, 2, -2816, -2817, -5887, -4354, 1283, 1277, 3, 1277, 4354, 4352, 4351, 7424, 12033, 13568, +16639, 18178, 13564, 5893, 2812, 2819, 1277, 1282, 1279, 1281, -1, -1279, -2818, -8958, -16641, -21248, +-13568, -7423, -12034, -18174, -18178, -15102, -12033, -4353, 1282, 1277, 1284, -3, -1279, -2816, -5889, -5886, +-2, 2818, -2, 1281, 4352, 5888, 2816, 5887, 12034, 15102, 16641, 19712, 13567, 7426, 1278, 1281, +1280, 2815, 2818, 4350, 1, -1281, -2815, -8961, -15102, -19714, -15103, -8961, -10495, -16640, -18176, -18176, +-13568, -4353, 1282, 2813, 2820, 1276, -1277, -2, -4351, -5889, 2, 1276, 1285, 2812, 5890, 4352, +1279, 4353, 12031, 16641, 18175, 19713, 15103, 5890, 1277, 3, 1277, 2818, 4352, 5887, 2817, -1281, +-2815, -8960, -13569, -16639, -15105, -10495, -10496, -15105, -18175, -19713, -16639, -5888, 1279, 1281, 2815, 2818, +-3, 3, -1282, -5887, -2816, 1280, 1279, 2818, 5886, 4353, 1281, 2814, 10498, 15102, 18177, 21248, +16640, 5887, 2, -2819, -1277, 4349, 4355, 5886, 4353, -1281, -2815, -10497, -13566, -13571, -15100, -12037, +-10491, -13571, -18175, -21247, -18179, -7420, -3, 1283, 2812, 4357, -5, 4, -3, -4350, -5889, 1, +2814, 4354, 5887, 2816, 1, 2814, 7426, 13567, 19713, 21247, 16640, 7424, 1, -2816, -1281, 4353, +5887, 4353, 4352, 1280, -2817, -10494, -12035, -10493, -12034, -13567, -12032, -12033, -16639, -22784, -18176, -7424, +-1280, 0, 2816, 5889, 1278, 3, 1276, -2813, -7425, -1280, 2817, 4350, 5889, 2816, 0, 2817, +7423, 12031, 19715, 22780, 16644, 7421, 2, -4353, -2816, 2817, 5886, 5891, 5885, 2817, -2815, -10498, +-12029, -8964, -10492, -12036, -12028, -13572, -16636, -21252, -18172, -7427, -2815, 0, 2816, 4352, 2817, 2813, +1283, -1282, -7422, -2817, 2815, 4353, 7424, 2816, -1279, 1278, 5889, 12032, 19712, 21248, 18177, 8958, +1283, -4356, -2812, 2813, 5891, 5886, 7425, 4351, -2815, -8960, -10497, -8958, -10499, -12029, -12034, -13567, +-16641, -21247, -18177, -7423, -4353, -1280, 2817, 4351, 4353, 4351, 2816, 0, -4351, -2817, 1281, 4351, +7424, 4353, -1280, -1, 4354, 12029, 18179, 19710, 18178, 8958, 1281, -4353, -4351, -1, 4354, 7422, +7424, 4353, -2817, -7423, -7424, -7425, -8959, -10497, -12031, -15104, -16640, -19713, -18175, -10497, -4350, -2818, +1282, 2813, 4355, 5886, 4353, 0, -4353, -4351, -1280, 4351, 7426, 5885, -1277, -1282, 2817, 12032, +15104, 18175, 18178, 10493, 1283, -2818, -5887, -1281, 2817, 5887, 5888, 2817, -2817, -7423, -7425, -7424, +-8960, -10495, -10497, -15103, -16641, -19712, -19712, -12031, -2817, -2815, -1281, 1280, 2818, 5885, 4355, 1278, +-1280, -4351, -2816, 1279, 7426, 7421, 2, -1280, 1279, 8961, 13567, 16641, 18175, 12033, 2814, -1278, +-4353, -4352, 2816, 5888, 5888, 2817, -1282, -7422, -5890, -4350, -8960, -10498, -12029, -15107, -15102, -16641, +-21247, -13569, -4351, -1282, -1278, 1279, 2817, 4351, 5888, 2817, 1278, -2813, -4355, 2, 7423, 7424, +1281, -1, 2816, 5889, 10495, 15105, 16639, 10496, 2817, 0, -4353, -5887, 1278, 5890, 4352, 2815, +-1280, -4351, -5890, -4349, -5891, -8958, -12033, -16639, -15105, -13567, -19713, -15103, -5888, -1, -1278, 1278, +1281, 2816, 5887, 5890, 2814, -1279, -4353, -2815, 5888, 7424, 1279, 1281, 2816, 2816, 7425, 13566, +15106, 12030, 4354, 1279, -2816, -5888, -1280, 4352, 5889, 2813, 4, -2820, -4348, -4355, -4350, -8962, +-12030, -16641, -13568, -12031, -18178, -16638, -7426, -1278, -1, 1280, 1280, 1280, 5888, 7424, 4352, 0, +-2817, -2814, 4349, 5892, 2812, 2819, 4349, 2819, 4351, 10495, 13570, 10493, 4355, 1278, 1, -2816, +-2816, 1279, 4353, 4352, -1, -2814, -2819, -2813, -4354, -7422, -10498, -15103, -13568, -12033, -16638, -15106, +-8958, -2817, 0, 1280, 1280, 0, 4352, 8961, 4350, 2, -1282, -1279, 2817, 4351, 4351, 4354, +5885, 2821, 2811, 7427, 12031, 8959, 2818, -1, 1280, -1279, -2818, -1278, 1278, 4354, 1279, -1280, +-2815, -2818, -5886, -5890, -8958, -15106, -15101, -12036, -15101, -13569, -8960, -5888, -1280, 0, 1280, 0, +2816, 7423, 5890, 2815, -1, -1277, -5, 2821, 4349, 7426, 7423, 4352, 1281, 4350, 8963, 7421, +2818, 1279, 1280, 0, -1279, -1283, -1275, 2811, 1283, -2, -1278, -2818, -5885, -7428, -8957, -13569, +-13569, -13566, -13571, -12029, -8962, -7423, -2816, -2, 2819, -3, 1283, 7422, 5888, 4353, 1279, -1279, +-1, 2817, 4351, 8961, 7424, 4350, 2819, 2814, 5888, 4353, 2815, 0, 1282, 1277, 2, -2817, +-1280, 2816, 2817, 1278, 3, -2820, -4348, -7428, -8956, -10499, -13566, -15105, -12032, -10495, -8962, -7422, +-4352, -1281, 1281, 1279, 1280, 5889, 7423, 4353, 2815, 1280, 1281, 2814, 4355, 8956, 8964, 7421, +2818, 1279, 2816, 2816, 1280, -1279, -1, 1280, 1, -1281, -1280, 2, 2812, 4356, 1278, -1280, +-5887, -7426, -10494, -8962, -10494, -13569, -13569, -10494, -8961, -7424, -4351, -2819, 4, 1277, 1282, 4351, +7424, 4353, 1278, 1282, 2814, 2819, 4349, 10499, 8957, 7426, 5888, 1278, 2819, 1277, -1278, -1280, +-1, 1281, 1279, -1280, -1279, -1280, 1279, 4354, 4349, -1277, -5890, -8959, -10496, -8961, -8959, -12032, +-13569, -10494, -8962, -8959, -5889, -1279, 0, -1, 2817, 2815, 5889, 4352, 1279, 2816, 4352, 1281, +4351, 8961, 10495, 7424, 5889, 2814, 1283, 1277, -2813, -2819, -1278, 1279, 1281, 0, -1, -1280, +1281, 5887, 5889, -1, -5887, -10497, -10495, -7425, -8960, -10494, -12035, -10493, -8962, -8959, -8960, -2817, +0, 2, 1277, 2819, 5885, 4354, 1279, 2817, 5887, 2816, 2817, 7422, 10499, 7421, 5890, 2814, +1282, 1278, -2814, -5890, -2815, 1280, 1281, 1278, 1, -1281, 2, 5887, 7425, 2813, -5884, -12035, +-10494, -7425, -7424, -10496, -12031, -12033, -10495, -10497, -8960, -4352, 1, -1, 1281, 2814, 4354, 2815, +0, 2817, 7422, 5890, 4352, 7422, 10498, 7422, 4354, 4351, 2816, 1280, -4352, -7424, -4352, 1280, +1280, -1, 1282, -2, 2, 7422, 8961, 4352, -4352, -13568, -12032, -7424, -5888, -7424, -12032, -12033, +-10494, -10498, -8959, -5888, -1, 1, 0, 2816, 4352, 2815, 1, 2815, 7426, 7423, 5887, 5890, +10493, 7428, 4348, 4356, 4349, 2817, -2816, -7424, -7424, -1279, 1278, 1281, 1281, 1278, -1278, 4350, +10498, 7423, -1280, -12031, -12035, -8955, -5893, -4348, -10499, -12030, -12033, -12032, -10495, -5889, -1280, 1, +-2, 2819, 2813, 1282, -1, 2816, 7425, 8959, 5889, 5886, 8963, 7421, 4354, 4351, 4352, 2816, +-1279, -5890, -8958, -4354, 1, 1280, 2816, 1280, 0, 2816, 10496, 10496, 0, -12032, -13568, -10495, +-5890, -4350, -8962, -12030, -13569, -13568, -10496, -7424, -2816, 1, 1278, 2818, 1278, 2, 1279, 2817, +5886, 8962, 8958, 7427, 7421, 5890, 4351, 4352, 4354, 2813, -1277, -5891, -10494, -7424, -1282, 2820, +1275, 1284, 1278, 2815, 8963, 12029, 2818, -8961, -13568, -12031, -7426, -2813, -4356, -10491, -15109, -16636, +-12034, -5888, -2814, -4, 1285, 2811, 1284, -1283, 1281, 4354, 5884, 8965, 8954, 8966, 7419, 5893, +4347, 4357, 5883, 1285, -4, -2813, -8962, -12031, -4352, 2815, 2818, 1277, 1283, 1277, 7427, 12029, +5891, -5891, -12030, -13569, -7423, -2817, -2815, -8960, -15105, -16639, -13569, -7423, -2816, 0, 1279, 4353, +1279, -1279, 1279, 4353, 4351, 8961, 8959, 8961, 7423, 4353, 4351, 4352, 5889, 1278, 3, -3, +-7422, -13570, -7422, 1278, 4354, 1278, 2, 1278, 7425, 12031, 7425, -1280, -8961, -12031, -8960, -1281, +1, -7425, -15103, -18177, -15103, -7426, -2813, -1283, 1282, 2815, 1279, 3, 1276, 2820, 4349, 7426, +8959, 8960, 7424, 4353, 2815, 2817, 2815, 1280, 1, -1, -4352, -15103, -12034, 2, 4350, 2817, +1, -3, 5891, 10494, 8961, 1281, -5891, -10493, -10498, -2814, 2815, -2817, -13566, -16641, -16640, -10495, +-4354, -1278, 1279, 2816, 1, -1281, 1, 2814, 4355, 7421, 7427, 5885, 7426, 7423, 2816, 2817, +1278, 3, 1276, 4, -2819, -12030, -13569, -4352, 2817, 2815, 1281, -2, 2819, 8958, 8961, 2815, +-4351, -8961, -8958, -4354, 2816, -1278, -12034, -15104, -16638, -13572, -5884, -1282, 1281, 2815, 1, -2819, +-1276, 1278, 4352, 5890, 4348, 2819, 5887, 7424, 4353, 2815, 0, -1280, 1281, -1, -1279, -7426, +-13565, -7428, 5, 1276, 1282, 0, 2814, 7426, 8959, 5889, -2816, -5889, -5888, -4351, 1279, 1, +-8961, -12031, -15105, -15103, -8962, -2813, 1277, 4355, 2814, -2816, -2816, -1280, 4352, 5890, 4349, 1281, +2816, 7424, 7425, 4351, -1280, -2816, 0, 1, -2818, -4349, -10500, -8956, -1284, 4, 1277, 1281, +4352, 5887, 8961, 8961, -3, -4349, -4354, -2815, 1280, 1279, -5887, -10496, -12032, -13568, -8961, -4350, +-3, 4355, 2814, 2, -2818, -4350, 1278, 5889, 5889, 1278, 1282, 5887, 8960, 5888, -1280, -4352, +0, 0, -4352, -4352, -7425, -7422, -2818, -1278, 1279, 2816, 4352, 5889, 8959, 8960, 1281, -4354, +-4349, -2819, 2, -1282, -7421, -7427, -10493, -13572, -12028, -5890, -2815, 1279, 4352, 1280, -1279, -4353, +1281, 5887, 5888, 2817, -2, 4355, 10493, 8963, -3, -4349, -1283, -1277, -2819, -4349, -4355, -5885, +-4355, -2813, -1283, 1283, 4349, 5890, 5887, 7425, 4352, -2817, -4351, -2818, -1277, -1282, -5887, -7424, +-7425, -12031, -12033, -7423, -4352, -1, 2818, 4349, 3, -2818, -1280, 4354, 5886, 4354, 1278, 2817, +8960, 10496, 2816, -4352, -4351, -2818, -4350, -4354, -2814, -4353, -2816, -2816, -2816, 1281, 4351, 4352, +5889, 7422, 4354, -1282, -2813, -1283, -1278, -2817, -5889, -5886, -5890, -10495, -12031, -8962, -4350, -1282, +2816, 2818, -2, -1279, 1, 2813, 4356, 2812, 1283, 1278, 7426, 10494, 5890, -1281, -5889, -4350, +-4354, -4351, -1279, -2818, -2814, -2, -2814, -3, 2820, 4349, 5890, 5887, 4351, -1278, -2817, 1, +-1280, -4354, -5886, -7425, -7423, -10497, -13568, -10496, -5888, -1279, 2814, 2817, 0, -1, 1282, 2814, +2817, 2816, 2816, 1279, 5890, 10493, 7428, -4, -4349, -5890, -4351, -4352, -1281, -1279, -1281, 1282, +-1282, 1, 1279, 1281, 5887, 5890, 2813, -1276, -1285, 1285, -4, -5886, -5888, -5888, -7424, -8960, +-12033, -10494, -7426, -1277, 2813, 2817, 1, 1278, 4354, 4351, 2816, 1281, 2814, 2818, 5886, 8962, +7422, 1282, -2818, -4351, -4352, -5890, -4348, -1284, 3, 1278, 1, -1, 2, -3, 4355, 4350, +4353, -1280, -1281, 4353, 0, -5889, -5886, -5891, -7421, -10498, -12031, -10496, -8962, -4348, 2811, 4357, +-4, 1282, 5888, 5888, 2815, 1, 1279, 4354, 5886, 7426, 5885, 1283, -3, -2813, -5890, -5887, +-4353, -1279, -1, 1280, 1281, 1279, -1279, -2816, 2815, 4352, 2817, -1, -1280, 4353, 2814, -2814, +-5889, -7424, -7424, -10497, -10494, -12033, -10496, -4351, 1278, 2818, 1278, 1283, 4349, 7427, 4349, 2, +-2, 2819, 5884, 7429, 5883, 1284, 1277, -1278, -4354, -4349, -5891, -2814, 1279, 2816, 1281, 1280, +-1282, -2813, -4, 2821, 1275, -1276, -1282, 2817, 4351, -1280, -5888, -7423, -7425, -10494, -12035, -12030, +-12033, -4351, -1280, 1279, 2817, 1279, 2817, 7423, 5889, 2815, 1280, 2817, 4350, 7427, 5885, 1, +1280, 1280, -4351, -5890, -4350, -4354, 1, 2817, 2813, 2820, -4, -2812, -2820, 3, 1278, 1, +-2816, 1279, 5890, 2813, -4348, -8964, -8956, -10501, -12027, -12036, -12028, -4356, 3, -3, 2819, 2814, +2817, 5887, 5890, 4349, 2819, 2813, 2819, 5886, 5889, 1280, -1, 1281, -1281, -4352, -4350, -4355, +3, 2813, 4354, 4352, -1, -2814, -2819, -1276, -5, 5, -2819, 2, 5887, 4352, -1280, -8960, +-10495, -12034, -12029, -12035, -12029, -4356, 4, -3, 2818, 4352, 2814, 4354, 5886, 5889, 5889, 4351, +1279, 4353, 4351, 2, -2, 1281, 1279, -2815, -4352, -4352, -1281, 1281, 5888, 5887, 1282, -1283, +-2813, -2819, -1276, -5, -4348, -1282, 4352, 5889, 1279, -7423, -12033, -12031, -12033, -12032, -10495, -5889, +-1280, 1, 2815, 2816, 2817, 2813, 4356, 7421, 7427, 5884, 2820, 2812, 4356, 1277, -1279, 1, +1278, 2, -2818, -4350, -1281, 0, 4352, 5888, 2816, -1279, -2817, -2816, -2816, -1280, -4351, -2817, +2816, 5888, 2816, -4352, -12030, -13572, -13564, -12035, -12030, -7424, -2816, 1278, 2819, 2814, 2817, 1280, +2815, 7425, 10496, 7423, 2817, 1279, 2817, 1279, -1279, -1280, 1279, 1281, -2817, -2815, 0, 0, +1280, 4351, 4354, -3, -4348, -4356, -4349, -4354, -4351, -1281, 1281, 2816, 4351, -1279, -10497, -15103, +-13568, -13569, -12031, -8960, -2816, 4352, 2815, 1282, 2813, 1284, -3, 5888, 12034, 8957, 2819, 1278, +1281, 2815, -1278, -2818, -1279, 1279, -1278, -1282, 1282, 1278, -1279, 2816, 4352, 1279, -2815, -4353, +-4351, -7424, -5889, -1279, 1278, 1283, 4349, 1284, -8965, -15099, -13573, -15100, -12034, -8959, -4352, 4350, +4354, -1, 1281, 2816, 1278, 4354, 12031, 12032, 5890, 1276, 1285, 2811, 4, -4354, -2816, 1281, +-1, 1, 2815, 2817, -1, 1281, 2815, 1281, -1281, -4351, -4353, -7424, -7422, -1283, 1284, 1276, +2819, 2814, -7422, -13570, -13566, -15105, -13568, -8959, -4354, 2818, 5887, 1280, 1, 1279, 0, 2817, +10495, 12033, 7423, 2817, 1279, 2817, -1, -4352, -4351, -1280, 1278, 1282, 2815, 5888, 1281, -1, +1279, 1283, -3, -4350, -2817, -7424, -8960, -2815, -2, 1282, 2814, 1282, -4353, -12033, -12030, -15106, +-15102, -10498, -5886, 1278, 4353, 2816, 0, 1280, 1280, 2816, 8959, 12034, 8958, 5890, 2814, 2818, +1278, -2814, -7426, -2814, 2815, 2816, 2817, 4350, 2818, 0, -2, 3, -4, -4348, -4355, -5885, +-8964, -4348, -4, 1285, 1275, 1284, -4355, -8958, -10496, -13569, -16639, -12033, -5888, 1282, 4349, 2819, +1277, 2, 0, 2815, 7424, 10496, 8961, 5887, 5889, 5887, 2816, -2815, -7425, -5888, 2817, 4352, +1279, 4354, 4350, 1280, 2, -2, -1278, -4354, -2814, -2818, -7422, -5890, -1279, 1280, 1280, 0, +-4352, -8961, -8958, -12034, -15102, -12033, -7424, -1280, 2816, 2816, 1281, -1, 0, 2816, 5888, 8961, +8958, 5890, 5886, 7426, 4352, -1282, -7422, -7425, 1280, 4353, 1279, 2816, 4353, 2814, 1282, -1, +-1281, -5885, -2820, 3, -5890, -7422, -2818, 1282, 2814, 1, -5888, -8960, -7424, -10496, -13568, -12032, +-8960, -4352, 1280, 4352, 1281, -1282, 2, 2814, 5890, 7423, 8959, 7427, 5885, 8962, 5886, 1282, +-4353, -7423, -1, 4352, 1281, 2816, 5887, 4353, -1, 0, -1277, -7428, -4349, -1, -4354, -8956, +-2819, 1, 1, -2, -4351, -7423, -7426, -10494, -12034, -10495, -8960, -7424, -1280, 4351, 4353, -1280, +-1280, 2816, 5887, 7426, 7422, 5891, 5884, 8963, 7423, 4352, -2816, -8960, -1280, 4351, 1282, 1277, +4355, 4349, 1282, 0, -1282, -8957, -5892, 4, -2819, -7422, -4354, 2, -1282, 2, -2817, -7425, +-8958, -8962, -10494, -8961, -7423, -8962, -4349, 2813, 5890, -1, -1280, 1281, 5887, 7425, 7422, 5890, +5887, 7424, 7425, 5886, 2, -7426, -1278, 2815, 2816, 0, 4351, 5890, 2815, 0, 0, -7424, +-7425, -1278, -2818, -5887, -2816, 0, -2818, -1276, -2820, -5886, -7423, -7427, -10493, -7426, -5887, -7425, +-7422, -3, 5892, 2813, 1, 1279, 5890, 7423, 7424, 5889, 5886, 5890, 5887, 4351, 1283, -4355, +-1279, 1281, 2814, 2, 2815, 5887, 2819, -1283, 2, -4353, -7423, -2818, -1277, -4356, -2812, -1283, +-2814, -2818, -1278, -4354, -8958, -10498, -10495, -7424, -4352, -5888, -8959, -2819, 4356, 4348, 1283, 1279, +4351, 7426, 7422, 7425, 5889, 4349, 4355, 4350, 2817, 1, -3, 1284, 2812, 3, 1279, 4351, +4355, -3, -1279, -2815, -7426, -4349, -2819, -4350, -1281, -1280, -2815, -4354, -1278, -2816, -7426, -10493, +-10499, -8958, -4352, -4353, -8959, -5889, 2817, 4351, 2817, 1278, 4354, 5887, 7424, 7425, 7422, 4354, +2815, 4352, 1281, 1278, 2819, 2813, 2819, -3, 2, 2816, 4351, 1281, -2816, -2817, -4350, -5890, +-2814, -2818, 2, -1282, -2815, -4352, -2816, 0, -5888, -12033, -12030, -8963, -4348, -4356, -8958, -7423, +-3, 4355, 4349, 1283, 2814, 4354, 7421, 8963, 10494, 5889, 2816, 2815, 1282, 2814, 4353, 2815, +1282, -2, 2, 1278, 2817, 2816, -2815, -4354, -2814, -5890, -4350, -1282, 3, -2820, -4348, -4356, +-4349, -1281, -4352, -12032, -13568, -8961, -5886, -5890, -7423, -7425, -1279, 2815, 5890, 2813, 1282, 2816, +5886, 10499, 12029, 5890, 2815, 2816, 1280, 2817, 5887, 4352, 2816, -1, -1278, -2, 1282, 2815, +-1281, -5886, -4355, -5885, -5889, 0, 1279, -2814, -5890, -4350, -2818, -1280, -4350, -10498, -15102, -8962, +-5887, -5888, -5888, -5889, -2814, 2814, 5890, 4350, 1281, 1280, 4351, 10498, 12030, 7425, 4353, 2814, +2, 2815, 5888, 5888, 4354, 1276, -2811, -1285, 4, 1277, 3, -5891, -4350, -4353, -7423, -2, +2820, -2822, -7418, -7429, -2812, -3, -4350, -10497, -13569, -8958, -5890, -7422, -5889, -4352, -2817, 1282, +5886, 4354, 1278, 1, 2816, 8959, 12034, 8957, 4354, 2815, 1281, 1280, 5887, 5889, 2814, 1283, +-1282, -2815, -1281, 1, -1281, -4351, -5889, -4351, -5889, -2815, 2815, -1280, -7423, -8960, -4353, -1279, +-2817, -8960, -12030, -10499, -7421, -7427, -7422, -4353, -2816, 1, 5887, 5888, 1281, -1, 1280, 8962, +12028, 8965, 5884, 4355, 2814, 1281, 5888, 5887, 4354, 1278, 1, -2815, -1283, -1276, -2819, -1279, +-4352, -5888, -4351, -4354, 3, -4, -4348, -8963, -5885, -2819, -4349, -7428, -10491, -10501, -8956, -7426, +-7423, -4353, -2816, 0, 5888, 5890, 1277, 2, 1278, 5890, 10494, 8962, 7423, 5887, 4354, 2814, +5890, 5886, 4353, 1280, 0, -1279, -2818, -2814, -4354, -1278, -4353, -5888, -4352, -4352, -2816, 1280, +-2815, -8962, -8958, -2818, -2814, -7425, -8960, -10496, -10496, -7423, -5889, -4352, -2816, 0, 5889, 7423, +2817, -2, 3, 4349, 8962, 8959, 7425, 5887, 5889, 4351, 5888, 5889, 4351, 1281, -1, -1279, +-1282, -2813, -4354, -2816, -2814, -4355, -4349, -4354, -4352, -1279, -1281, -7423, -10497, -7423, -5889, -7424, +-7423, -8961, -12031, -7424, -4353, -4351, -1281, 2, 4349, 5891, 4350, 1281, 1281, 4350, 5888, 7426, +7422, 8962, 8959, 5887, 5890, 7421, 4355, -2, 2, -2, -1280, -4351, -4353, -4351, -2816, -2817, +-2814, -4355, -5886, -2816, -1, -4349, -7429, -8955, -8964, -7421, -5890, -7423, -12033, -8959, -4352, -2817, +-1279, 0, 2815, 5889, 5887, 4353, 1279, 2818, 4349, 4355, 7421, 7426, 12031, 8961, 7423, 7424, +5889, 1279, -1280, 1281, -2, -4350, -5890, -5886, -2818, -1278, -2818, -4351, -7424, -4353, -2814, -2819, +-4348, -8964, -12029, -7426, -5887, -5889, -10494, -8963, -4348, -2820, -1277, -2, 2817, 4352, 5888, 5888, +4352, 2815, 1282, 2814, 5890, 7422, 12033, 12032, 8960, 8960, 5887, 1282, -1282, 1281, 1280, -2817, +-7422, -5891, -4348, -1285, -1274, -4358, -7419, -5891, -2814, -2818, -4350, -8962, -12030, -10497, -7425, -5886, +-7426, -8959, -2815, -1282, -1279, 1280, 1279, 2819, 7420, 7427, 4350, 4353, 1281, 1278, 4354, 5886, +12034, 15103, 8960, 7425, 7422, 2818, -1281, 0, 2817, -1281, -7425, -8957, -5892, -1275, -2821, -5884, +-5890, -7425, -5885, -4355, -4350, -7424, -12035, -12027, -8966, -5882, -5893, -7420, -2819, -1279, -2816, 0, +2817, 2814, 5890, 7422, 7426, 4351, 0, 1, 1278, 2819, 12029, 18178, 12031, 7425, 5887, 2817, +-1, 1281, 2815, 1, -7425, -10495, -7425, -1280, -2815, -5889, -4351, -7426, -7422, -2818, -4349, -7428, +-12028, -12035, -10494, -7425, -5888, -5888, -4352, -1279, -1282, -1278, 1279, 2815, 5891, 8956, 8963, 5887, +1281, 1279, 1281, 2815, 10496, 18178, 15102, 8961, 5888, 4350, 1284, 2812, 4355, 1278, -5888, -10494, +-7426, -2814, -4354, -7423, -4352, -5888, -10496, -5889, -4351, -7424, -10496, -12032, -10497, -8959, -5888, -2816, +-2816, -1281, -2815, -2817, 1282, 4349, 5892, 7419, 8965, 7420, 1282, 1281, -3, 1284, 7421, 15105, +16640, 10496, 4352, 2816, 2817, 4350, 4354, 2814, -1279, -10495, -10497, -4353, -4350, -5890, -5885, -5891, +-10495, -7424, -4353, -7421, -10500, -12029, -10498, -10495, -7424, -1281, -1279, -2816, -2817, -2814, -2, 2817, +4352, 7424, 8960, 8961, 2814, 1281, 1281, 1278, 7427, 13564, 16644, 10493, 4353, 2818, 4348, 4356, +5886, 4351, 3, -7427, -10494, -7425, -5888, -5888, -7424, -5887, -8962, -8958, -4354, -7422, -10497, -12032, +-10495, -8962, -8957, -1284, 4, -1283, -2813, -2819, -1279, 1281, 4350, 5890, 8958, 10498, 4350, 2, +1278, 2817, 5889, 10493, 13571, 13566, 5890, 2814, 4353, 5887, 7426, 5886, 1282, -4354, -10494, -8962, +-5886, -5890, -7422, -7425, -8961, -10494, -4354, -7422, -12034, -12030, -10498, -7422, -8962, -2814, -2, -1277, +-1284, -1277, -1282, 1, 5888, 7424, 8960, 8960, 5888, 1279, 2818, 2814, 5891, 8956, 12035, 13566, +7425, 2816, 4352, 7423, 7426, 7422, 2817, -2816, -8960, -8959, -5890, -7422, -10498, -8959, -8959, -10498, +-7422, -7425, -12033, -10493, -8964, -7420, -7427, -4350, 0, -1281, -1280, 1, -1282, 3, 2813, 7426, +8958, 7427, 5884, 4356, 2813, 4354, 5887, 7424, 8961, 12030, 8963, 4349, 2818, 7423, 7424, 8961, +4350, -2814, -7425, -10496, -5888, -5888, -12032, -12032, -10496, -10497, -8959, -8960, -10497, -12030, -8962, -5887, +-5888, -4353, 2, -1282, -1278, -1, -1280, -2816, 0, 5889, 7423, 4352, 5889, 4350, 4356, 4347, +5892, 4350, 5888, 10498, 10493, 5890, 2815, 7425, 8959, 8961, 5886, 2, -5889, -8960, -7423, -5890, +-12030, -15106, -12030, -10497, -10496, -10496, -10496, -12032, -8959, -4354, -4350, -4353, -1279, -1281, -1279, -1282, +-1277, -1283, 3, 4349, 7427, 4349, 4355, 5885, 5891, 4350, 4353, 4352, 4351, 8962, 10494, 7425, +2816, 5887, 8963, 10491, 5893, -4, -4349, -7426, -5887, -5889, -12031, -16641, -13567, -12033, -12031, -12032, +-10497, -10495, -8961, -4351, -2816, -2817, -1279, -1, -1279, -1280, -1282, 3, 1277, 2818, 4352, 2815, +4352, 5889, 8959, 5889, 4351, 2817, 2814, 5891, 10494, 8960, 4354, 5884, 10501, 10491, 5893, -4, +-2814, -5888, -5890, -5885, -10499, -16638, -15105, -12032, -15103, -13570, -8958, -8961, -10496, -5887, -2818, -2814, +-1281, 0, -1279, -2818, -1277, -3, 2818, 2815, 1280, 1281, 4351, 5889, 8958, 8962, 4351, 2816, +2817, 4350, 8962, 10495, 7424, 7424, 8961, 10494, 7428, 1274, -1274, -4356, -4351, -4350, -8964, -15099, +-16645, -16636, -16643, -13566, -8960, -8962, -10493, -7427, -1278, -1280, -2, 3, -1283, -2814, -2817, 1280, +4353, 4351, 0, -1280, 2816, 5888, 10497, 10495, 4352, 1281, 1278, 1282, 5888, 10495, 7425, 8959, +10496, 10497, 7423, 1281, -2817, -2816, -2816, -4352, -8960, -12031, -15106, -18174, -19713, -13568, -8959, -8962, +-8957, -7427, -2814, -2816, -1282, 1284, -5, -4348, -5891, 3, 5885, 4355, -3, -1278, 1279, 5889, +8959, 10496, 5889, 1278, 1283, 2814, 4352, 10497, 8958, 8963, 10493, 8962, 7424, 2815, -2815, -2817, +-1280, -4351, -7425, -10494, -16643, -21245, -21251, -15102, -10496, -8961, -7423, -7425, -2815, -1281, -1278, 1278, +1, -2816, -5889, 2, 5886, 5889, 1280, -1280, -1280, 5888, 10495, 10497, 7424, 2816, 1280, 2816, +4351, 8961, 10496, 10496, 10496, 8959, 8961, 2816, -2816, -1281, -1278, -4355, -5885, -10497, -16641, -21246, +-21250, -16639, -12032, -7424, -5888, -7425, -2814, -1283, -1277, 1278, 1281, -2816, -5888, -2818, 2820, 7420, +4356, -3, -1279, 4353, 8959, 8960, 7425, 5887, 1281, 1280, 4350, 8963, 12029, 12035, 10493, 8963, +8957, 4354, -1281, -1280, -1278, -4355, -5886, -8961, -16640, -22782, -21251, -16638, -12034, -7421, -5890, -7423, +-4354, -1278, -1280, 1280, 1279, -4351, -5890, -2813, -2, 5889, 5887, 1281, -1282, 2819, 7421, 10499, +8957, 4354, 1279, 1281, 4351, 7425, 12031, 12033, 8959, 8961, 10495, 5890, -3, 2, -1281, -2815, +-5888, -8961, -16640, -24319, -22786, -16637, -12036, -8956, -7427, -7423, -5887, -1283, -1276, -4, 1283, -2817, +-5889, -4350, -2, 4353, 5889, 1278, 1, 2816, 4352, 8961, 10494, 5890, 2814, 2818, 4352, 7422, +8962, 12031, 10495, 10499, 10492, 4355, 1279, 1280, 0, -2815, -5891, -8956, -16643, -22782, -22785, -18176, +-10495, -8962, -7422, -7426, -5886, -1282, -1279, -1, 1281, -2816, -4353, -2815, -1281, 2817, 5888, 1279, +1281, 4352, 1280, 4352, 10495, 7425, 2816, 4352, 5888, 7423, 8962, 10494, 10498, 10494, 10497, 5889, +2813, 1284, -3, 1, -2816, -10497, -18174, -22785, -24320, -18176, -10497, -8958, -5890, -7423, -5888, -1281, +2, -3, 3, -2818, -4351, -4353, -1279, 2815, 4354, 1278, 1280, 5889, 1279, 1281, 7424, 8959, +5889, 5887, 7425, 5887, 8961, 10496, 12031, 12033, 8959, 4353, 2816, 2815, 1281, 1279, -2816, -10494, +-19715, -22781, -22787, -18174, -12033, -8959, -7425, -7423, -7425, -1279, 1279, 1, -1280, -2817, -2815, -2817, +-2815, 1280, 4351, 2816, 1280, 5889, 4351, 1281, 2814, 7426, 7423, 5888, 7425, 7422, 8962, 10495, +10496, 12033, 8959, 4351, 2818, 2814, 1282, 1279, -1280, -10496, -19712, -22784, -21248, -16640, -10496, -7424, +-7424, -5888, -5889, -2814, -2, 2, -2, -2816, -2815, -2816, -4353, -1278, 2812, 2820, 1277, 4354, +5888, 1279, 1281, 5887, 7425, 7424, 7423, 5890, 7421, 8964, 10492, 12035, 10494, 5889, 2816, 1280, +1279, 2817, -1280, -10496, -19713, -22782, -21251, -15100, -10499, -7424, -7422, -7426, -5886, -2817, -1281, -1279, +-1280, -4352, -2816, -1281, -1279, -1281, 2, 2814, 2817, 4352, 5887, 2817, 1280, 4351, 7426, 8957, +7427, 5885, 7427, 7422, 10496, 12033, 8958, 5891, 4350, 1281, 1278, 2818, -1, -10495, -18177, -21248, +-22784, -16639, -10497, -7423, -8962, -7422, -4353, -2816, -1279, -1281, -2816, -2815, -1281, 0, -1279, -2817, +-1280, 1282, 4349, 4355, 5886, 2816, 2818, 5885, 8963, 8959, 7424, 5888, 7424, 7424, 8960, 13568, +8961, 4350, 5891, 2812, 1284, 4349, 1281, -10496, -18175, -21250, -22781, -18180, -12029, -8961, -10496, -7424, +-4351, -1282, -1278, -1282, -2814, -4354, -1278, -3, -1276, -1284, -2813, -1282, 4353, 5887, 4354, 1277, +1283, 7422, 8961, 8959, 5890, 4349, 5891, 7421, 10499, 12030, 8961, 4351, 4353, 4351, 1281, 2815, +1281, -7424, -15105, -19711, -22785, -19710, -12035, -8958, -10497, -7423, -4352, -1281, 0, -1279, -4353, -5886, +-1282, 1281, -1280, -1280, -2816, -2816, 2816, 5888, 4352, 1280, 2816, 7424, 10496, 10496, 5887, 2818, +4350, 7426, 10495, 12032, 8960, 4352, 2816, 5888, 4353, 2814, 2, -5891, -13565, -18178, -21246, -19715, +-12029, -10499, -12028, -8964, -2813, -2818, 1, -1280, -2816, -4352, -4352, 1279, 1282, -1283, -2813, -2818, +0, 4354, 4349, 1283, 1277, 5891, 10493, 10499, 5886, 2817, 2815, 7425, 12031, 12033, 8959, 5889, +2815, 4353, 5886, 2819, -1284, -5883, -10501, -15101, -19713, -19712, -13567, -12033, -13568, -8959, -2817, -2815, +-1280, -1, -2815, -4352, -4353, -1279, 2816, -1281, -2814, -1283, 3, 1277, 2819, 2814, 2816, 5889, +10495, 12033, 7423, 1281, -1, 4353, 10495, 12033, 8960, 4352, 1278, 2819, 7421, 4355, -1281, -5890, +-10493, -15107, -16637, -18179, -13565, -12035, -13566, -10497, -2815, -2817, -1280, 0, -1280, -2815, -4353, -2815, +1278, 1282, -2817, -1280, 1, -1281, 1281, 2815, 4353, 5887, 10497, 13568, 5887, 1281, 0, 1279, +7425, 12032, 10494, 4356, -5, 2820, 7422, 4352, -1279, -2817, -8959, -13570, -16637, -16644, -13563, -13572, +-15102, -12033, -4351, -1281, -1279, 1279, 2, -1283, -4349, -4355, -1277, 1278, -1279, -1, 1, -1281, +-1279, 2815, 5889, 7424, 8959, 13569, 7424, 1280, 1279, 2, 4350, 10498, 12031, 5887, 2, 1279, +5888, 5889, 1278, -2814, -8961, -13568, -15103, -16641, -13568, -13567, -13570, -12030, -7425, -2816, -1279, -2, +1282, -2, -2813, -4356, -2812, -4, 1284, -4, 5, -2822, -2810, 1275, 7427, 7423, 8960, 12032, +7424, 1280, 1, -3, 2820, 8956, 12035, 7423, 1280, 0, 2816, 4352, 2815, -1278, -8962, -13567, +-15103, -13571, -12028, -13572, -13564, -13571, -8958, -2818, -1278, -1, 1281, -1, -1280, -2816, -4351, -1281, +1281, -1, -1279, -2817, -2815, -1, 5889, 8959, 8961, 10496, 7423, 1280, 1, -1281, 1282, 8958, +12031, 8963, 2813, 3, 1278, 4352, 5888, 1281, -7425, -12031, -13569, -13568, -12031, -12033, -13568, -15104, +-10496, -5888, -1280, 1281, 2814, 1282, -2, -1278, -2818, -1277, 1277, 2, -1281, -1280, -1279, -2, +4354, 10494, 10499, 8957, 5890, 1278, 1282, -1281, 1, 5886, 12034, 8958, 4354, -1281, 0, 2815, +5890, 4350, -5886, -12033, -13569, -13565, -12035, -10493, -12034, -15104, -12031, -7424, -2817, 1282, 1278, 1281, +1280, -1, -2815, -1280, 1279, 1281, -1280, -1281, -1278, -1284, 2821, 10492, 12035, 10494, 5888, 1281, +0, -1281, 1, 4351, 10497, 10495, 5889, -1, -2815, 1280, 7423, 5889, -2818, -10493, -12035, -13564, +-13573, -10492, -10498, -15104, -13567, -10498, -4349, 1277, 1283, 1276, 2820, 1278, -2816, -1279, 2815, 1280, +-1278, -1283, -1277, -1283, 2818, 8959, 12033, 8959, 5888, 1280, 1, -1282, -1277, 4348, 8964, 10493, +5890, -2, -1278, 1279, 5888, 7424, 0, -7425, -10493, -12036, -13565, -10498, -8959, -12032, -13568, -10497, +-5887, 0, 1279, 1282, 4350, 2817, -1280, -2816, 2816, 1281, -1282, -1278, -1281, -1280, 1281, 7423, +12032, 10497, 4350, 1283, -3, -2814, -1281, 2816, 7425, 8959, 5889, 1279, -1280, 1, 5887, 8961, +4351, -4352, -8959, -13570, -13565, -12035, -8958, -10497, -13568, -12032, -8959, -2818, 1283, 1277, 4354, 4351, +0, -2815, 2815, 4353, -1, 0, 1, -1, 1281, 5887, 8960, 10498, 5885, 3, -1283, -1277, +-2818, 1281, 5887, 7424, 7426, 1278, -2815, -1, 4353, 7423, 4353, -1281, -5887, -13569, -15103, -12034, +-8957, -8964, -12027, -12037, -10492, -4354, -1, 4, 4347, 7428, 1278, -2816, 1, 4351, 2816, 2, +-3, 2, 1280, 4351, 8962, 10493, 5890, 0, -1280, -1280, -2816, -1, 4354, 5887, 5887, 2818, +-1282, 2, 5887, 7424, 4352, 0, -4352, -12032, -15104, -12031, -10498, -8958, -12033, -13569, -10494, -5889, +-1280, -1280, 4352, 7423, 2819, -2820, 3, 4350, 2817, 1, -1283, 1283, 2813, 4356, 5885, 8962, +5886, 1, -1280, -1280, -2815, -1282, 1283, 4348, 7427, 2815, -2816, 2, 5884, 7428, 5884, 1284, +-1283, -10494, -15106, -12031, -12032, -8961, -10494, -12034, -12031, -7424, -4352, -1281, 2818, 8958, 4354, -1281, +-1280, 2816, 2817, -2, -1278, 1279, 4352, 4353, 4350, 7426, 5887, 1280, 0, -1281, -2813, -1284, +5, 2811, 5891, 4351, -1279, -2, 4356, 7419, 4357, 2812, 2, -8960, -13569, -12030, -13570, -10495, +-8960, -10497, -12030, -7427, -4349, -2818, 2818, 7422, 5889, 1279, 1, 2816, 2816, 1279, 2, -3, +4355, 4350, 2816, 5889, 5888, -1, 2, -1284, -1275, -1284, 3, 1278, 2817, 2815, 1, 1280, +5887, 7426, 5886, 2816, 2, -5892, -12026, -12038, -13564, -12034, -8959, -8960, -12032, -8961, -4351, -2815, +1278, 5890, 5886, 4353, 1281, 1277, 2819, 2814, 1281, -1, 4354, 4348, 1285, 2811, 4357, -4, +3, -1283, -2813, -1283, 3, -2, 1281, 2815, 1280, 2817, 5886, 7428, 5882, 4359, 1273, -4346, +-10500, -10494, -13568, -13570, -10493, -10498, -12031, -8961, -4351, -4353, 1, 4352, 5887, 5889, 2816, 2815, +2817, 1280, 1279, 1282, 4350, 5889, 1280, 1279, 1281, -1, 1, -1, -1279, -1281, -1279, -1282, +-1277, 1277, 2819, 2815, 5886, 7427, 7421, 2819, 1277, -1277, -8962, -10496, -12031, -13570, -10493, -10499, +-12029, -8963, -4349, -4355, -2813, 2813, 4356, 7419, 5892, 2814, 1281, 1279, 1281, 2815, 4353, 5887, +1281, -1281, 2, -3, 2, 0, -2817, -1279, -1281, -2815, -4353, 2, 2812, 4357, 5883, 5893, +5884, 4355, 1278, -1280, -5886, -8963, -10493, -13570, -12032, -10495, -12033, -8960, -7423, -4353, -2817, 4, +2810, 7430, 8955, 4355, 1280, 2814, 1282, 2814, 4354, 4351, 2816, -1279, -1283, -1275, -6, 1286, +-1284, -1278, -1281, -4352, -4352, -1279, 2815, 5889, 7422, 5891, 5885, 4354, 1280, -3, -2810, -8967, +-12027, -13570, -12033, -12029, -12035, -8959, -7424, -4352, -2817, -2814, 2814, 7425, 10496, 5887, 1281, 2816, +1279, 2818, 5885, 4355, 2814, 1, -2816, -2816, -1281, 2, 1278, 1, -1279, -5891, -7420, -4356, +1283, 5886, 7425, 5888, 4352, 4352, 2816, 1279, -1278, -7426, -8958, -12034, -12030, -10498, -12031, -10495, +-8963, -4348, -2819, -2814, 2815, 5888, 10496, 8960, 1282, 2813, 2819, 2812, 5892, 4350, 1280, 2, +-2820, -4347, -2821, 5, 2812, 1283, -2, -5887, -8961, -4351, 1280, 4352, 7423, 5889, 4351, 4354, +2814, 2, -1282, -4351, -5887, -10499, -13563, -12037, -12029, -12033, -8961, -5886, -4354, -4350, 1278, 5890, +8957, 10500, 4348, 2819, 2814, 2816, 7425, 5888, 1279, 1, -2817, -5888, -4351, -1, 4352, 2818, +-1283, -5886, -8961, -5887, 1279, 4353, 5888, 5887, 4353, 4351, 2817, 1280, 0, -4353, -4351, -8961, +-12030, -12035, -13565, -13570, -10495, -5888, -7425, -4351, 1280, 5887, 5890, 10494, 5889, 2816, 2815, 2818, +5886, 5889, 2815, 1, -1281, -5887, -5889, 1281, 5887, 4353, -2, -4349, -8963, -7422, 0, 2814, +2819, 4349, 5890, 2815, 1281, 2815, 1280, -2814, -2819, -5885, -10499, -12030, -13569, -15103, -12033, -7423, +-7425, -5887, 1278, 7426, 5888, 8959, 7426, 5884, 4355, 2815, 4353, 5887, 4352, 0, -1280, -5887, +-5890, 2, 5886, 5890, 1278, -4350, -8962, -7423, -1280, 2816, 1280, 5888, 5887, 2818, 1278, 4354, +1278, -1278, -1283, -2812, -8965, -12026, -13574, -15099, -13572, -8957, -8962, -5887, 1279, 7425, 5888, 7424, +10495, 7425, 4351, 2817, 4352, 5887, 4353, 0, -1281, -4351, -7425, 1, 5887, 5889, 2814, -2813, +-7427, -7422, -1281, -1, -1278, 2815, 5887, 2819, 1275, 4357, 1277, 1, 0, -1281, -7422, -10498, +-13566, -15106, -13566, -10497, -8960, -5887, 1278, 5891, 5885, 5890, 10495, 10496, 5888, 2816, 4352, 5888, +5887, 2, -1283, -4348, -7428, -1278, 4352, 5887, 2818, -2818, -5888, -5886, -1282, -1279, -2816, 1280, +5887, 2818, 1277, 4356, 2812, 3, -1282, -1279, -2816, -8961, -13567, -13569, -15103, -13569, -10495, -7425, +1, 4351, 4352, 5889, 8959, 10497, 7424, 4350, 4355, 4350, 5889, 1279, -1279, -2817, -5887, -2817, +2817, 4351, 4353, -1280, -5890, -5885, -2819, -1277, -2818, 1281, 4351, 2817, 1279, 2817, 2815, 1282, +-1283, 3, -1283, -7422, -13568, -13569, -15103, -15104, -12034, -7421, -1282, 1281, 4351, 4353, 5887, 10497, +10495, 4352, 2816, 2817, 5887, 2816, -2816, -2815, -5889, -2815, 1279, 2816, 2818, -3, -4350, -4352, +-2817, -2815, -5890, -2814, 2815, 4353, 2815, 2816, 1280, 1280, 1, -1282, 3, -4356, -12028, -13571, +-13567, -16639, -12034, -5886, -1281, 1279, 4354, 5887, 4351, 8962, 12029, 7427, 4351, 2815, 4353, 2815, +-1279, -1280, -2817, -2815, 1280, 1280, 2816, -1, -2815, -2816, -2816, -2816, -5888, -5889, 1281, 4352, +2815, 2818, 2813, 1283, -3, -1276, -4, -1278, -10495, -12035, -13564, -16644, -13565, -4353, -1280, 0, +4352, 5887, 2818, 7422, 12034, 10495, 5888, 2816, 4352, 2816, -1279, -1281, -1279, -1281, 0, 1281, +2815, 1, -2817, -1279, -2817, -2815, -5889, -8959, -1, 4354, 4349, 4354, 2816, 1278, 3, -3, +1283, 1277, -7422, -12034, -13566, -16640, -15106, -5886, -1282, -2814, 1278, 4354, 4350, 5890, 12031, 12031, +5890, 2814, 2818, 4350, 2, -1282, 2, 1278, 1, 0, 1280, 1280, -1281, -1278, -2818, -4351, +-5888, -8962, -4349, 4351, 5887, 4353, 2815, 1281, 0, 0, 1279, 2817, -2817, -10494, -13570, -16638, +-15106, -5887, -2816, -4352, 0, 4352, 4352, 4352, 10496, 12032, 7424, 2816, 1280, 2816, 1280, -2815, +-1, 2816, 1, -2, 1283, 1277, -1278, -1281, -1279, -5889, -7423, -8962, -5885, 1277, 7426, 5888, +1278, 1283, -1283, 2, 2816, 2814, -1278, -7425, -13568, -16639, -15105, -7424, -2815, -4354, -1278, 2815, +4353, 4351, 8960, 12032, 8961, 4351, 1281, 1279, 1280, -2815, -1281, 4353, 1279, -1280, 0, 1281, +-1281, -2815, -1282, -5887, -8959, -10498, -8957, -1283, 7425, 5889, 1278, 2, -1281, 0, 1280, 2817, +1278, -5886, -13570, -15102, -13569, -8960, -4352, -4352, -2816, 1281, 4350, 4354, 7422, 10498, 8958, 5891, +1276, 1284, 2812, -1277, -1281, 4352, 2815, 2, -2, 2817, -1280, -2817, 1, -5887, -10498, -8959, +-8961, -4351, 5888, 7424, 1279, 1, -1281, 1, 1280, 2815, 2817, -2816, -10497, -13566, -13570, -10495, +-5888, -4352, -4351, -1283, 1283, 4350, 7425, 8961, 8957, 7428, 2811, 5, 2812, 1283, -1281, 2815, +4353, -1280, -1280, 2817, -2, -2815, -1280, -5889, -10494, -8961, -8960, -5888, 2815, 7426, 1278, -2813, +-1283, 1, 1281, 2814, 4354, 0, -8961, -12032, -12031, -10498, -5886, -4353, -4352, -2815, 1278, 4354, +7422, 8962, 8959, 7424, 2817, -1282, 1282, 2815, -1280, 1281, 4350, 2, -1282, 2817, 1281, -2818, +-1278, -5890, -12030, -10498, -8958, -7425, 0, 5889, 1279, -2816, -1279, -2, 1282, 1279, 4353, 1279, +-5887, -8961, -10496, -10494, -7426, -4351, -2816, -2817, -1279, 2817, 8957, 8963, 8958, 5889, 2816, -1281, +1281, 2815, 1281, -1, 2817, -1, -1279, 2815, 1281, -1280, -1281, -5887, -10497, -12031, -8960, -5888, +-1281, 2816, 2817, -2817, -2814, -3, 1282, 1279, 4353, 2815, -4351, -5889, -7423, -10497, -8959, -4354, +-2813, -4355, -2813, 2813, 7426, 8959, 8961, 5888, 2815, -1279, -1281, 2817, 2816, 1279, 2817, -1, +-1279, 1278, 2818, 1279, -1279, -5890, -10494, -12033, -8960, -5887, -4354, 1282, 1279, 1, -2818, -1278, +1278, 1282, 4350, 4353, -1280, -4353, -5886, -8963, -10493, -5890, -4351, -4352, -4352, 0, 7425, 8958, +10498, 5887, 1280, -1279, -1, 2816, 4353, 1278, 1282, -1, 0, 0, 1281, 1278, 2, -5889, +-8960, -12032, -8959, -5890, -4350, -1281, 1, -1, -1279, -2, 2819, 1278, 2816, 4354, 1277, -1277, +-2818, -7423, -10497, -7422, -4355, -5885, -5890, -1280, 5890, 8957, 10498, 5887, 1280, 2, -2, 2815, +4355, 2813, 2820, 1276, 2, -1, 1281, 1280, 1279, -4351, -8961, -10494, -8962, -7422, -5891, -2813, +-2, 2, -1282, 2, 2813, 1283, 2814, 4353, 2816, -1, -1279, -5889, -8959, -5889, -4351, -5889, +-7424, -2816, 4352, 8960, 10496, 5888, 1280, -1281, -1278, 2813, 4355, 2814, 2818, 2814, 2, -1283, +3, 1278, 1281, -2816, -7425, -8959, -8960, -7425, -7422, -4355, -1277, -1281, -1280, 1280, 1279, 1281, +2816, 2816, 2816, 1279, -1279, -4352, -4352, -5888, -5888, -5889, -5886, -4353, 2817, 7422, 10498, 5886, +1282, 0, -1282, 1282, 4351, 2816, 2818, 4348, 1284, -2819, -1277, 2813, 2819, -2819, -7422, -8960, +-7426, -7420, -7428, -5886, -1280, -2818, -1276, 4348, 2818, 1279, 1281, 2816, 4351, 2817, -1282, -2813, +-1282, -2816, -5887, -7425, -7423, -4353, 1280, 5889, 8959, 5889, 1279, 1281, -1, 0, 2816, 4353, +2815, 4353, 2814, -1278, -2817, 1281, 2815, -2815, -5889, -8960, -7423, -5889, -7423, -7424, -2817, -4352, +-1279, 4352, 4351, 1282, 1276, 4356, 4351, 2815, -1279, -2817, 1281, 0, -5889, -8959, -8961, -5886, +-2, 4353, 7424, 5888, 0, 2815, 1282, -1282, 3, 2813, 4353, 5887, 2818, -2, -4350, -2, +2817, -1280, -4353, -7422, -7426, -5887, -7424, -7424, -4353, -5887, -1280, 4351, 4354, 2813, 2818, 2816, +4352, 2816, -1281, -1279, 2815, 2817, -4352, -10496, -10496, -7425, -1279, 4352, 7424, 4353, -2, 4354, +4351, 0, 1, 2814, 2818, 5886, 2818, -2, -2814, -1283, 1284, -1284, -4349, -5889, -7425, -7422, +-5890, -5886, -5890, -5886, -1282, 4354, 4350, 2818, 4350, 4353, 4352, 2815, 2, 1278, 2817, 4351, +-1279, -10496, -12033, -8959, -1282, 2819, 4349, 4356, -5, 2820, 4350, 1, -1280, 0, 2816, 4352, +4352, 1280, -2816, -1280, -1280, -1280, -1280, -5887, -7426, -7422, -5890, -5885, -5891, -5886, -1282, 5890, +4351, 2816, 5889, 2813, 2820, 2813, 1281, 2816, 4351, 4354, -1282, -8958, -12034, -10495, -2816, 2815, +4354, 4350, 1282, 2814, 4353, -1, -1279, -1, 1281, 2815, 4353, 2814, -1278, -1281, -4352, -1279, +-1, -4352, -8959, -7425, -5888, -5887, -5889, -5887, -1281, 4353, 5887, 4352, 5889, 2816, 1278, 2819, +2813, 4354, 5887, 4352, 0, -7423, -10498, -12030, -5890, 3, 2812, 2820, 1276, 1284, 2814, 0, +-2816, -2815, 1279, 2, 1277, 2819, -1283, -1277, -4353, -4352, 0, -2817, -7423, -7424, -5888, -5888, +-5889, -5886, -2818, 2818, 7421, 5892, 4348, 1284, -3, 2817, 4353, 5886, 7426, 4351, 0, -5888, +-8959, -12034, -7421, -1283, 2817, 2817, 1279, 1280, 1281, 1278, -2813, -4355, 3, 1277, 2, 1280, +-2, 4, -4356, -5886, -1281, -2815, -5889, -7422, -4354, -5888, -5886, -4355, -2812, 2812, 8962, 8960, +4351, 2, -2, 1280, 4353, 7424, 7424, 4352, -1, -5887, -8961, -10494, -8962, -2815, 1281, 4349, +1283, 1278, 2818, 1279, -2816, -2816, -1280, 0, 1, -2, 2, -1282, -1279, -4352, -2816, -2816, +-4353, -7423, -5888, -4353, -5887, -4354, -4349, 1278, 10497, 12030, 2818, -1281, 1, 1279, 4352, 8961, +7423, 4353, -1, -5888, -10494, -10499, -7421, -5891, 2, 4352, 2815, 1, 1279, 1281, -1281, -2814, +-2819, -1277, -1282, -2815, -2816, -1280, 0, -2817, -4350, -4354, -4351, -5888, -5889, -2815, -4352, -4354, +-4349, 1276, 12037, 13564, 4354, -2817, -1279, 1278, 4355, 8958, 8960, 2818, -4, -4347, -10501, -10492, +-8963, -5886, -2817, 2817, 2814, -1278, 1279, 1280, -1279, -4354, -5886, -2817, -1280, -2816, -5888, -2816, +1, -1282, -4350, -4355, -4348, -7428, -5884, -1283, -1279, -4352, -4353, 2, 13567, 16639, 5891, -2820, +-1276, 1277, 4353, 7425, 8959, 2816, 1, -1282, -8958, -12032, -8961, -5887, -2817, 1281, 2815, -1278, +-3, 2819, -3, -4349, -7427, -4349, -1283, -2814, -7424, -4354, 3, -4, -4348, -4355, -5886, -8962, +-5887, -1280, 1, -1282, -4350, -2, 12034, 16639, 8961, -1281, -1280, 1281, 1279, 5888, 10497, 4351, +1, -1281, -7424, -12032, -10495, -5889, -1279, 1279, 1281, -1281, 0, 1281, -1, -2815, -8961, -7424, +-2816, -4351, -7426, -4350, -2, -1278, -1281, -1280, -5888, -10496, -5888, -1280, 1280, 1280, -2816, 0, +10495, 16642, 10494, 1281, 0, 1280, 2816, 5888, 8959, 5890, 1278, -1278, -5891, -12029, -12034, -5887, +-1280, 1279, 1281, -2817, -1279, 1279, 1, -1281, -5887, -7425, -5887, -5889, -7423, -2817, 1, -1281, +-1279, 0, -5889, -12031, -7425, -1279, 2815, 2817, -1, 1281, 8959, 15105, 12031, 4353, 1279, 2817, +2815, 4353, 5887, 5890, 2812, 1285, -4357, -10491, -12036, -7422, -2816, 1278, 2819, -2819, -1278, 0, +-1282, -2813, -4355, -8958, -7425, -7423, -7426, -2813, -3, -1278, -1281, 0, -4352, -12032, -7423, -1281, +2816, 4352, 2816, 2816, 7425, 13566, 13569, 7424, 4352, 2816, 2815, 2818, 4349, 4355, 4350, 1281, +-2817, -8958, -10499, -7421, -2818, 1, 4352, 0, -2816, -1280, -1280, -2816, -4352, -8959, -8962, -8958, +-8962, -4350, -2, -1278, -1281, -1281, -5886, -10498, -7422, -2817, 1279, 5890, 4350, 4355, 5885, 12034, +13566, 10498, 5887, 4352, 2817, 2814, 1282, 1279, 2816, 2816, -1279, -8962, -10494, -7426, -2814, -1, +4352, 1281, -2818, -2814, -2817, -4352, -5887, -8961, -10495, -8961, -8959, -5890, -1277, -3, -1277, -2820, +-5884, -10499, -7422, -4354, 1, 5888, 7424, 5888, 5887, 12033, 13567, 12033, 8960, 5888, 4351, 4353, +2815, 1, 0, 2815, 2, -5891, -8957, -7427, -4349, -2, 2816, 4353, -1, -2816, -4351, -4353, +-4352, -8959, -12034, -8957, -7427, -7421, -2819, 2, -1, -2815, -5889, -10495, -7425, -4351, -1281, 5889, +8960, 7423, 7425, 12031, 13569, 13568, 10496, 7424, 5886, 5892, 2812, -1276, -2819, 0, 1282, -4354, +-7422, -7426, -4351, -1280, 2816, 5888, 1280, -2816, -7424, -5888, -2815, -8961, -12032, -10496, -7424, -5888, +-4351, -1281, -1, -2814, -5891, -10493, -8961, -4353, -1278, 4349, 10500, 8956, 7428, 10492, 13571, 15102, +12034, 8957, 7427, 7422, 4353, -1280, -4353, -2816, 2, -2819, -5884, -7429, -5884, -1282, 2817, 5887, +2817, -1282, -7421, -7426, -4351, -7425, -12031, -12033, -8959, -7424, -4352, -2817, -1278, -1282, -5886, -10498, +-10495, -5888, -1280, 2817, 8958, 8962, 8958, 10498, 13566, 15106, 13567, 10496, 7424, 7423, 4354, -1282, +-4351, -5887, -1282, -1279, -4352, -5888, -5888, -2815, 2813, 7428, 2813, -1279, -5888, -8961, -5886, -7426, +-12031, -12032, -8961, -7422, -5891, -2813, -2819, -1276, -5892, -8957, -12034, -8959, -1280, 2816, 5888, 8960, +10496, 10495, 12034, 16638, 15106, 10494, 7426, 8958, 5890, -2, -4350, -8961, -5888, -2815, -4353, -4352, +-4351, -4354, 3, 5885, 4355, -1284, -4348, -8963, -8958, -8961, -10496, -12032, -8959, -7426, -7422, -4353, +-2815, -1282, -4350, -7426, -10494, -10496, -1281, 4352, 4353, 7422, 10500, 12027, 12037, 16635, 15108, 10494, +7425, 8960, 7423, 2817, -2816, -8961, -8958, -4355, -2813, -2817, -2817, -2814, -1282, 4353, 5888, 1280, +-2816, -7424, -10496, -10496, -8960, -10495, -8962, -7422, -8962, -5887, -2815, -2818, -5886, -7426, -8959, -12032, +-2816, 4351, 2818, 5886, 10497, 12032, 12031, 16642, 15102, 10497, 7423, 8961, 8959, 4354, -1283, -8957, +-12035, -7422, -2817, -1279, -1281, -1279, -1, 1280, 4353, 2815, 1, -5889, -10495, -12033, -8960, -8960, +-8959, -7425, -8959, -7426, -4350, -2817, -5888, -8959, -8962, -12029, -4355, 2818, 1279, 4352, 8960, 12033, +13566, 16643, 16636, 12036, 7421, 8963, 8956, 7428, 1277, -7422, -12033, -10496, -4352, -1280, -1280, -1281, +2, 1279, 1279, 2817, 2815, -2815, -10496, -13568, -10498, -8957, -8964, -7419, -8964, -10494, -4353, -1280, +-5887, -7425, -8959, -10497, -4352, 1281, 1279, 1280, 7425, 10495, 13569, 16639, 16640, 12032, 7425, 8959, +8960, 7425, 2813, -5883, -12038, -12027, -7427, -2816, -1278, -1282, 1281, 1280, -1, 1281, 2816, 1279, +-7422, -13571, -12029, -8962, -7423, -7423, -10500, -12026, -5894, -1275, -5891, -7424, -8958, -10498, -2815, 1281, +1277, 3, 4350, 8962, 13566, 18177, 16639, 12033, 7425, 7421, 8963, 8956, 4357, -1284, -10494, -13569, +-8960, -4351, -2818, 3, 2813, 1282, 0, -2, 2818, 4352, -4354, -13565, -13571, -10494, -8960, -7425, +-8959, -13570, -8957, -1282, -5887, -8960, -8961, -8959, -2816, 1279, 1281, 0, 2816, 7423, 12033, 18175, +16641, 12032, 7422, 7428, 8955, 7429, 5883, 4, -7426, -13567, -8961, -4352, -4352, -1279, 4351, 2817, +-1, -1280, 2816, 5889, -1281, -10496, -13566, -10500, -8956, -7427, -8959, -10495, -8961, -4353, -7422, -8961, +-7424, -8960, -2816, 1279, 1282, -2, 1, 4352, 12032, 16640, 18175, 12033, 7423, 7426, 8958, 7426, +5886, 1281, -4352, -12032, -10496, -5888, -5888, -2816, 2816, 2817, -2, -1278, 2815, 4352, 1281, -7425, +-13567, -10498, -8957, -7427, -8958, -10496, -10499, -5883, -7429, -8956, -8963, -7422, -1282, 1282, 2815, 0, +1, 2814, 8961, 16641, 18174, 12034, 5887, 7423, 8962, 7422, 5889, 4352, -1280, -8961, -10494, -5891, +-7420, -5892, 2819, 4350, 1282, -2, 2818, 5886, 2818, -5890, -12030, -10497, -7424, -7423, -10498, -8958, +-7425, -8961, -10494, -8961, -7423, -7426, -1279, 1279, 1282, -1, -1280, 1280, 7424, 13568, 18176, 13568, +5888, 7424, 10497, 8957, 5891, 4350, 1, -5888, -8961, -5887, -7425, -5887, 0, 2815, 1281, 1279, +2817, 4352, 1279, -2815, -8961, -10496, -7422, -7426, -8959, -8961, -7424, -8959, -10496, -7424, -7424, -5889, +-1279, 0, 1280, 1280, 0, -1, 5891, 12029, 15105, 13568, 7423, 7427, 8956, 8963, 5886, 4353, +1281, -2818, -4350, -4354, -7422, -7426, -4350, 1279, 2817, 1278, 2817, 2816, 1280, -1279, -7426, -8959, +-7424, -7424, -8960, -8959, -7426, -8958, -12034, -8959, -7423, -4354, -1277, -4, 4, 1276, 4, -3, +5890, 8959, 12032, 12033, 8958, 8963, 8957, 8962, 5887, 5887, 2820, -5, -2812, -2819, -7422, -7425, +-4352, 1, 2814, 2819, 2813, 1281, 1, -1281, -5887, -7426, -8958, -8961, -8959, -8961, -5888, -7424, +-13567, -10498, -5885, -1284, -2811, -1285, -1276, -3, 1283, 1277, 4355, 7421, 8963, 10494, 12033, 10495, +8961, 8959, 5889, 5887, 4353, 2815, 1280, -1279, -7425, -7423, -5889, -1280, 2817, 2815, 2817, 0, +-2, -1276, -4357, -7419, -8963, -8959, -8960, -8960, -7424, -7423, -10498, -10494, -4354, -1279, -1279, -1282, +-1278, -1282, 2817, 4352, 2816, 4352, 5887, 7426, 12030, 12034, 8958, 8961, 5888, 4351, 5890, 4350, +2818, -2, -5887, -7424, -7424, -4351, 1278, 4354, 2815, 0, -1279, -2, -2814, -5889, -8960, -8960, +-7424, -8960, -8961, -7422, -10498, -12030, -4354, 2, -1282, -2814, -2818, -1279, 2817, 5885, 2820, 2812, +4354, 5889, 10492, 12038, 8953, 7431, 5882, 4356, 5886, 5889, 5887, 1281, -2817, -7423, -8961, -4351, +-2, 2819, 2813, 2, -1281, -1279, -1281, -2815, -8962, -8958, -7424, -10497, -8959, -7425, -8960, -10496, +-5887, -1282, 2, -2817, -4353, -1278, 2814, 7426, 2814, 2, 2813, 4356, 7420, 12035, 8958, 7425, +4352, 4351, 5889, 5887, 5889, 2816, -1280, -5889, -10495, -5888, -1280, 1280, 1280, -1, -1278, -1282, +1, -2816, -8961, -8959, -7424, -10497, -10494, -8963, -7420, -7428, -5884, -2820, -1277, -2818, -4350, -1282, +2818, 5886, 4353, -1, 2818, 4349, 5891, 10494, 10496, 7426, 4349, 2818, 5888, 8959, 7426, 2813, +3, -4354, -10495, -7424, -1281, 1, -1, 2, -1283, -2813, -1282, -1279, -7424, -8960, -5889, -8958, +-10498, -8958, -7426, -5886, -5890, -2814, -1282, -2814, -2818, -2814, 1278, 4354, 4350, 3, 2811, 4358, +4347, 8964, 10494, 8959, 4354, 2815, 5889, 8959, 8960, 4352, 2816, -1279, -8962, -8958, -4354, -2814, +-1282, 3, -1284, -4349, -1281, 0, -4351, -8962, -7423, -8960, -10495, -8962, -4350, -4354, -5887, -4351, +-2818, -4350, -2817, -2816, 1, 1278, 2819, 1277, 1282, 4352, 4350, 7426, 8959, 7423, 4355, 2812, +5892, 10492, 10500, 5884, 4355, 1278, -7423, -10496, -4352, -2817, -1279, -1280, -1281, -4350, -2818, 1281, +-4352, -7424, -7424, -8959, -8963, -8956, -4356, -2812, -7427, -5887, -4352, -4352, -2816, -2816, -1280, -1279, +1277, 2820, 2812, 2819, 4351, 5887, 7426, 7421, 4356, 2812, 4355, 8958, 10497, 8960, 5887, 2818, +-4354, -8959, -5888, -2818, -1277, -2818, -4350, -4354, -2816, 1281, -2818, -7420, -7428, -8958, -8960, -7426, +-4349, -2819, -7421, -7426, -5887, -5889, -2815, -1280, -1281, -4350, -1284, 4357, 2811, 4357, 5884, 4354, +4351, 5889, 5887, 2817, 4351, 7424, 12033, 12030, 5890, 4351, 0, -5888, -5888, -2816, -1280, -4351, +-7426, -4350, -1281, 1280, -1279, -5889, -7424, -12032, -8960, -7423, -5889, -1279, -7426, -10494, -5889, -5887, +-4352, -2818, -2813, -4355, -2813, 2814, 2816, 4353, 5888, 2815, 2818, 4349, 5891, 2814, 4353, 7423, +12034, 15101, 8963, 4349, 1283, -1282, -2816, -2815, -1281, -5887, -10496, -5889, -1279, 1280, -1, -4351, +-7425, -12031, -8960, -5889, -5886, -2819, -5885, -10498, -8960, -5886, -4355, -4349, -4354, -5888, -4350, -3, +2819, 4350, 5889, 2816, 1280, 2815, 5890, 4350, 4354, 7422, 10498, 15103, 12032, 5888, 4352, 1281, +-1, -1279, -1282, -4350, -12033, -8960, -1280, 1280, 0, -2816, -8961, -13566, -8963, -5885, -5890, -2816, +-5886, -10499, -8958, -5888, -4353, -5887, -4353, -4351, -4352, -1280, 1279, 5889, 5888, 2815, 2, 2813, +4356, 2811, 2821, 5883, 12036, 15103, 13566, 7427, 4349, 4355, 2814, 1280, 1, -5888, -13569, -10494, +-1284, 1284, 1278, -1279, -8961, -13566, -10500, -5883, -4356, -4350, -5888, -7425, -10494, -7426, -5887, -5889, +-2814, -2818, -2815, -2816, 0, 4352, 5887, 2817, 0, 1280, 4351, 4353, 4351, 4354, 10493, 15108, +15099, 8965, 4348, 5891, 5887, 4351, 2817, -5889, -13566, -10498, -2815, 1279, 2816, 2, -8963, -13565, +-12034, -7424, -4351, -4353, -7423, -7425, -8959, -8961, -7424, -5887, -2818, -2813, -2819, -1278, 1279, 4353, +4350, 2819, 1276, 1285, 4348, 4354, 4351, 4352, 8961, 15102, 13570, 10495, 5888, 7425, 8958, 8962, +4351, -5888, -13567, -12034, -4349, -3, 2818, 1279, -7423, -13570, -13565, -8963, -4350, -4352, -7425, -7423, +-8960, -8962, -8956, -5893, -1275, -2821, -2812, -1282, 0, 2817, 2814, 2819, 1277, 3, 2813, 4354, +4351, 4353, 7423, 13569, 13567, 12033, 7423, 7424, 10497, 10495, 5889, -4353, -12031, -13569, -7424, 1, +2815, 2817, -5889, -13568, -13568, -10495, -4352, -4353, -7423, -7426, -7421, -8962, -10495, -5888, -1281, -2815, +-2816, -1281, 1, 1280, 2816, 1279, 1, -1, 2818, 4350, 5890, 5885, 7427, 12030, 13569, 12031, +10498, 8958, 10498, 12030, 7425, -1280, -8960, -13567, -8962, -1277, 2812, 2819, -4353, -12032, -15104, -12032, +-5889, -4349, -7428, -8957, -8962, -7422, -8962, -7422, -2819, -1277, -2817, -1281, 1282, 1277, 1283, -1, +1279, 1282, 1277, 4355, 5887, 5887, 7426, 10494, 12033, 12032, 12032, 8959, 10498, 13566, 8961, 0, +-5889, -12030, -10498, -1279, 1280, 4351, -2815, -12032, -15105, -13566, -7427, -5885, -7427, -8958, -8960, -8961, +-8959, -7425, -2816, -1278, -2818, -1279, 1279, 1, 0, 0, 0, 1279, 1281, 4352, 5888, 4352, +8959, 12033, 12031, 10497, 12032, 10495, 12033, 13567, 8961, 2815, -4352, -8959, -10497, -4351, 1279, 4352, +-1279, -12034, -15101, -15107, -8958, -7424, -8962, -10493, -10498, -8960, -7422, -5892, -4346, -1286, -1276, -1282, +0, 1, -1280, -1, 1, 1279, 1280, 4354, 4349, 4355, 7421, 12035, 12029, 10500, 12027, 12037, +13563, 12036, 7422, 4353, -2817, -7424, -8959, -5889, 1, 4351, -1280, -10495, -15105, -16639, -12033, -7423, +-8962, -12028, -13573, -10491, -5893, -5884, -5890, -2815, -1, 1, -1281, -1279, -2817, -1279, -1, 1281, +1279, 2816, 4353, 4350, 8962, 12031, 10496, 10497, 12031, 13568, 15104, 12033, 7423, 4353, -1, -5888, +-7423, -5890, -1278, 4350, 2, -8961, -15105, -18173, -13572, -7420, -8963, -13566, -15105, -12032, -7423, -4353, +-4351, -2818, 1, 1281, -1281, -2815, -2818, -2814, -2, 1283, 1277, 2818, 4351, 2817, 7422, 12035, +10492, 10501, 12028, 15106, 16639, 12032, 7425, 5888, 1280, -1281, -4351, -4353, -1279, 2816, -1, -7423, +-15105, -18175, -15105, -8959, -8961, -15103, -16641, -12031, -7424, -4353, -2816, -2815, -1, 2818, -3, -2813, +-2819, -4350, 0, 2814, 1283, 1277, 2818, 4351, 7425, 12030, 10499, 10492, 13573, 16636, 16643, 12029, +5890, 5887, 2816, 2, -2820, -2811, -1285, 3, -1, -5888, -13567, -19713, -16640, -8959, -8961, -16639, +-18177, -13567, -8960, -5888, -2817, -1279, -1, 2819, -4, -2812, -2821, -4347, -1283, 2817, 1280, 0, +2816, 4352, 5889, 8957, 10500, 12028, 13572, 16637, 16642, 12029, 5891, 2814, 1282, 1278, 1, -1280, +-1, -1278, -2, -4351, -13567, -19714, -19711, -8959, -7426, -16638, -19713, -15105, -12030, -7425, -2816, -1280, +1280, 2816, -1280, -2816, -2816, -5888, -2815, 2814, 1282, -1282, 1282, 5887, 4352, 5888, 8961, 12030, +13570, 18174, 18178, 12031, 5889, 2815, 2816, 1280, 1280, 1281, 1279, -1280, -1280, -4352, -12032, -19712, +-19712, -10496, -7423, -13571, -18172, -18180, -15100, -10499, -2814, 1278, 1282, 1278, 2, -1281, -2816, -5888, +-4352, 1280, 1280, 0, 2816, 5888, 4352, 2816, 7423, 13570, 15102, 18177, 19713, 12030, 5890, 1279, +1279, 1282, 2815, 4351, 2819, -4, -1276, -4356, -10492, -16644, -19709, -13569, -8960, -12032, -16640, -18177, +-16638, -12034, -1278, 2814, 2817, 2816, -1, -1278, -1282, -4351, -4353, 1281, 1279, 1282, 2813, 5891, +4349, 1283, 5886, 13569, 16640, 18175, 19714, 13566, 4353, 0, -1, 1282, 2814, 4352, 4353, 1279, +-1279, -4352, -10499, -15100, -18179, -13566, -10496, -12035, -16636, -19715, -19710, -15105, -2816, 2816, 1280, 4353, +2814, 3, -3, -2815, -5886, -1284, 1285, 1276, 4354, 5888, 2815, 1281, 4352, 12031, 16641, 19711, +21249, 13568, 4351, -1279, -2817, 1, 4351, 4353, 5887, 2817, -1280, -4353, -12031, -13569, -15103, -15104, +-12033, -12030, -15107, -19709, -22787, -15101, -4354, 1281, 1279, 4353, 4351, 2, -2, -1280, -5886, -4356, +1285, 2811, 4357, 5883, 1284, -3, 4353, 8961, 15103, 21248, 21249, 13566, 5891, -1283, -4349, -4, +5892, 5886, 5888, 4354, -3, -5886, -12033, -12031, -12033, -13567, -13569, -12032, -13567, -19713, -22784, -15103, +-5889, -1280, 1, 4351, 4352, 1281, 1279, 1280, -4351, -5889, 1, 2815, 4353, 5887, 1280, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +1, -514, -511, -512, -768, -1023, -1793, -2817, -3838, -5122, -6397, -6915, -3582, 766, 4610, 6398, +5891, 4349, 2049, 513, -1, -768, -1023, -1282, -1022, -257, 512, 769, 510, 514, 766, 770, +255, -512, -512, -512, 1, -2, 514, 1023, 1280, 1025, 1023, 1024, 769, 255, 0, -255, +-258, 3, -3, 2, -2, 259, 508, 773, 506, 517, 253, 514, 511, 512, 256, 1, +-2, 259, -4, -251, -261, 4, -3, 514, 1022, 1026, 510, 514, 255, 255, 2, -515, +-765, -769, -769, -1022, -1283, -1020, -516, -509, -513, -769, -1021, -1539, -1790, -2050, -2558, -3074, +-4349, -6147, -6142, -3329, 769, 4351, 6657, 6399, 4608, 2562, 765, 4, -516, -766, -769, -768, +-511, 0, -1, 513, 766, 771, 765, 258, 256, 254, 259, -3, 258, 255, 513, 766, +770, 767, 513, 511, 512, 513, 254, 260, 251, 261, 252, 258, 256, 254, 516, 508, +3, -3, 3, 253, 516, 764, 771, 766, 1, -256, -513, -253, -4, 516, 1276, 515, +255, 0, 0, 1, 255, 1, -770, -1534, -2050, -2045, -1795, -1533, -1283, -1023, -1023, -1027, +-1276, -2052, -2813, -3585, -4097, -5630, -6147, -4861, -1026, 3329, 6655, 7681, 6144, 3839, 1537, 255, +-256, -511, -514, -509, -514, -512, -255, -2, 259, 510, 256, 0, 1, 255, 256, 513, +765, 772, 765, 769, 1024, 1280, 768, 512, 256, 255, 2, -2, 2, 254, 258, 254, +513, 512, 512, 512, 256, 0, 0, 0, 256, 256, 256, 256, 256, 256, 513, 511, +512, 0, -768, -767, -1, 769, 1022, 1539, 1789, 1282, 511, -1, -765, -1027, -1790, -1793, +-1792, -1792, -2047, -2818, -3837, -5891, -8702, -11521, -12800, -9727, -3329, 4097, 9982, 12291, 11261, 8195, +4349, 1282, -768, -1793, -2047, -1537, -1024, -767, -1, 513, 1279, 1280, 769, -1, -511, -1025, +-1024, -511, -1, 769, 1279, 1537, 2046, 2307, 2301, 1795, 1277, 515, -2, -511, -769, -767, +-513, 2, -3, 2, 255, 513, 1023, 1025, 766, 514, 256, -2, 3, -259, -254, -512, +-258, -253, -3, 514, 767, 768, 769, 254, 3, 508, 772, 1021, 770, 255, 0, 1, +-257, 1, -1, -511, -1025, -1535, -2305, -3326, -4867, -6397, -8707, -11518, -14593, -13568, -6143, 4095, +11008, 13056, 10751, 7426, 4350, 2307, 764, 3, -770, -1022, -1026, -766, -258, 257, 512, 255, +1, 0, -258, -253, -259, 2, 255, 768, 1281, 1535, 2049, 2047, 1793, 1279, 769, 511, +258, -3, 4, -4, 3, -258, 1, 0, 257, 509, 516, 508, 516, 252, 260, 252, +4, -3, 1, -255, -514, -509, -260, 4, 252, 515, 1022, 1025, 768, 511, 513, 1023, +1537, 1280, -1, -511, -1024, -769, -767, -512, -513, -766, -1283, -2557, -4098, -6143, -8192, -11009, +-13823, -14336, -7937, 2049, 9984, 12799, 11521, 8191, 4864, 2049, 255, -511, -513, -512, -255, -257, +0, 1, -2, 3, -3, -254, -257, -256, 1, 510, 1026, 1535, 1792, 1792, 1792, 1792, +1792, 1024, 768, 255, 2, -2, 2, -2, 1, 0, -1, 3, -4, 260, -4, 259, +511, 512, 768, 512, 512, 256, 0, 0, -256, -256, -256, -257, 2, -2, 2, 510, +770, 1022, 1026, 1022, 770, 767, 1024, 513, -2, -766, -1282, -1277, -771, -766, -1538, -2815, +-4352, -6656, -10752, -16641, -20990, -15106, -767, 11775, 16641, 15616, 11263, 6657, 2559, 1, -1537, -1792, +-1535, -1026, -766, -258, 1, 513, 766, 513, 0, -513, -766, -770, -255, 257, 1277, 2052, +2300, 2307, 2047, 2048, 1792, 1280, 768, 256, 1, -2, 2, -257, 0, 0, 0, 0, +256, 256, 255, 514, 510, 513, 511, 513, 256, 256, -1, -255, -512, -513, -254, -258, +1, 256, 511, 770, 766, 770, 766, 513, 513, 510, 258, -2, -767, -512, -256, -1, +-511, -1537, -2558, -4099, -5885, -7938, -11007, -17407, -21251, -12285, 3327, 14847, 17922, 15102, 9986, 5118, +1537, -1024, -1792, -2047, -1538, -1278, -1026, -765, -3, 514, 767, 256, 1, -513, -511, -257, +1, 1023, 1793, 2304, 2048, 2047, 2050, 2046, 1793, 1280, 511, 257, 0, -1, -255, -257, +-256, 1, -1, 1, 255, 257, 511, 257, 512, 255, 769, 511, 513, 0, -1, -511, +-514, -765, -514, -512, 2, 252, 773, 1020, 771, 510, 257, 255, 1, 0, -256, -512, +-513, 1, -1, 258, -2, -1278, -2818, -4607, -6400, -8193, -11006, -16387, -19452, -11012, 3075, 13822, +16641, 14335, 9986, 5630, 1537, -512, -1537, -1534, -1538, -1279, -1280, -769, 2, 254, 258, 253, +-253, -514, -766, -2, 257, 1279, 1793, 2047, 2050, 2046, 2306, 2302, 1792, 1282, 510, 258, +-1, -1, -254, -3, 3, -1, 0, 0, 255, 513, 0, 1, -2, 514, 510, 770, +255, 0, -255, -514, -510, -512, -514, -509, -260, 260, 765, 1027, 1020, 772, 509, 2, +-1, -1, 2, -1, 0, 0, 256, 0, -768, -2048, -3327, -4865, -6912, -10239, -16387, -22012, +-16131, -510, 12543, 17663, 15873, 11264, 6656, 2560, -256, -1792, -1791, -1539, -1276, -1539, -1022, -258, +258, -2, 2, -258, -511, -768, -512, 0, 768, 1536, 2048, 2047, 2050, 2303, 2304, 2304, +1536, 767, 515, -4, 4, -4, 3, -2, 2, -2, 1, 0, -1, 257, 256, 255, +513, 512, 767, 514, 254, 0, -255, -769, -767, -769, -512, -512, 1, -1, 512, 1024, +1280, 1025, 511, 1, -2, -253, -515, -253, -2, 512, 769, 254, -765, -2050, -3839, -5633, +-8448, -12800, -21246, -22530, -8959, 7935, 17409, 18175, 14081, 8704, 4352, 767, -1535, -2305, -1791, -1536, +-1280, -1025, -510, -3, 771, 511, -1, -511, -1024, -1025, -766, -2, 1024, 1794, 2045, 2307, +2046, 2306, 2302, 2050, 1277, 771, 511, -1, 3, -260, -254, 1, -3, 4, -4, 3, +-2, 257, 255, 514, 510, 770, 766, 769, 257, -2, -510, -514, -766, -769, -768, -512, +0, 255, 515, 1020, 1028, 765, 258, -1, -256, -511, -513, -255, -1, 512, 513, -1, +-767, -2049, -4096, -6143, -9218, -15614, -24321, -19712, -2303, 12543, 18687, 16898, 12031, 7169, 2815, -256, +-2047, -2306, -1789, -1539, -1278, -769, -257, 259, 509, 257, -255, -1026, -1021, -772, -253, 510, +1282, 2047, 2048, 1791, 2050, 2045, 2308, 1789, 1025, 513, 254, 2, -257, -256, 1, -1, +1, -2, 2, 256, 255, 258, -3, 258, 511, 769, 1023, 769, 255, 1, -513, -767, +-769, -511, -513, -254, -258, 1, 256, 511, 769, 513, 253, 4, -4, -509, -514, -254, +-3, 516, 507, 6, -774, -2555, -4612, -6910, -11008, -19201, -26366, -15618, 3585, 16639, 19457, 15616, +10496, 5631, 1793, -768, -2048, -2049, -1535, -1280, -1025, -510, -3, 259, 509, 3, -514, -1023, +-1025, -1023, -257, 514, 1533, 2051, 2046, 2049, 2047, 2305, 2304, 1792, 767, 513, -1, 2, +-257, -256, -1, 2, -3, 4, -4, 4, 252, 259, 254, 257, 513, 766, 769, 769, +254, 3, -516, -765, -513, -512, -256, 0, -1, 2, 254, 514, 254, 258, -3, 3, +-2, -254, -258, 2, 509, 516, 764, 3, -1025, -3073, -4861, -7172, -11005, -20994, -28415, -14593, +5890, 18430, 20226, 15869, 9730, 4864, 1023, -1021, -2053, -2043, -1796, -1021, -771, -252, 252, 516, +508, 2, -767, -1282, -1278, -1026, 1, 512, 1536, 2048, 2047, 2050, 2046, 2306, 2047, 1280, +768, 256, 257, -2, 3, -3, 2, -2, 2, -1, 0, 0, 1, -2, 3, 253, +514, 1023, 1024, 1024, 513, -1, -512, -511, -514, -510, -513, -512, -255, -2, 259, 508, +516, 253, 1, 2, -4, -508, -771, -510, -257, 256, 513, 511, 0, -1791, -3586, -6142, +-10497, -21504, -30720, -16128, 5632, 18944, 20480, 15615, 9730, 4862, 1282, -1283, -2045, -2049, -1537, -1023, +-513, 1, 256, 511, 256, 2, -515, -1021, -1282, -768, -254, 510, 1536, 2051, 1787, 1542, +1530, 1797, 2044, 1283, 766, 513, 0, -1, -255, -1, 1, 256, -1, 1, -1, 1, +-1, 1, -1, 0, 256, 513, 767, 769, 511, 0, -255, -257, -254, -259, -253, -259, +2, 0, -2, 259, 509, 258, -2, 2, -2, -253, -772, -509, -2, 513, 1024, 768, +0, -1536, -3328, -5888, -9984, -20992, -30207, -16385, 5632, 18433, 19965, 15364, 9469, 4866, 1278, -1022, +-2050, -2046, -1281, -1024, -512, -256, 256, 512, 513, -2, -765, -1284, -1533, -770, -254, 766, +1538, 2046, 1794, 1534, 1538, 1790, 1793, 1280, 768, 513, 254, 2, -258, -254, -1, 0, +0, 1, 255, 0, 0, 0, 0, 1, 255, 768, 769, 1022, 514, 255, 0, -255, +-258, -254, -258, -254, -1, 0, -1, 3, -3, 259, 253, 258, 0, -513, -767, -513, +0, 257, 1023, 768, 1, -1794, -3327, -5631, -9218, -19966, -31490, -17919, 4608, 18689, 20479, 15615, +9730, 4862, 1282, -1281, -2304, -2048, -1280, -768, -256, 1, 254, 258, 254, 2, -770, -1278, +-1537, -1024, -256, 511, 1538, 2047, 1792, 1536, 1279, 1793, 2048, 1536, 768, 255, 258, -259, +-252, -4, 3, -2, 1, 0, -1, 2, -3, 3, -3, 3, 510, 769, 1023, 1025, +767, 258, -258, -512, -254, -259, -253, -2, 1, -1, 2, -2, 1, -1, 2, -2, +2, -2, -512, -509, -260, 3, 766, 768, 2, -1538, -3583, -5888, -9218, -19709, -31234, -18175, +4352, 18686, 20739, 15869, 9475, 4862, 1281, -1025, -2047, -2049, -1534, -1026, -255, 0, 511, 514, +509, 3, -514, -1280, -1279, -1025, -255, 512, 1534, 2307, 2301, 1796, 1276, 1539, 1791, 1535, +770, 510, 258, -257, -255, -258, 2, -2, 2, 256, 255, 0, 1, -2, 3, -3, +258, 512, 767, 1026, 1021, 514, 0, -1, 2, -258, -255, -513, -255, -1, 0, 257, +255, 257, -257, -512, -256, -255, -514, -253, -3, 258, 767, 513, -2, -1533, -3587, -5886, +-9472, -18690, -29693, -18691, 2819, 17149, 19970, 15871, 9984, 5378, 1788, -763, -2053, -2045, -1280, -771, +-250, -7, 518, 507, 516, -3, -765, -1283, -1790, -1281, -767, 255, 1536, 2304, 2560, 2049, +1534, 1539, 1788, 1540, 765, 514, 255, 0, -255, -2, 3, -3, 2, -1, 256, 257, +-2, 3, -3, 3, 253, 515, 765, 771, 766, 256, 2, -259, -252, -4, 3, -2, +1, 0, 0, -1, 2, 254, 1, 0, -1, 1, -512, -769, -511, -1, 257, 512, +-1, -767, -2561, -4608, -7166, -13315, -27645, -26371, -5118, 13056, 20479, 17921, 12542, 7171, 3325, 3, +-1538, -2048, -1535, -1025, -767, -256, -1, 513, 512, -1, -510, -1283, -1277, -1026, -255, 255, +1537, 2047, 2305, 1792, 1279, 1281, 1791, 1793, 1023, 770, 509, 3, -258, -255, -1, 1, +-1, 257, 256, 254, 3, -3, 3, -2, 1, 255, 513, 512, 767, 513, 256, -2, +-253, -259, -253, -259, 3, -4, 5, -5, 517, 507, 5, -4, -254, -257, -1024, -1023, +-769, 1, 510, 770, 254, -254, -2305, -4353, -7422, -13571, -27644, -27396, -5629, 13054, 20737, 17920, +12287, 6914, 3326, 1, -1535, -2050, -1535, -768, -257, 2, 511, 511, 513, -1, -510, -1538, +-1535, -1280, -513, 259, 1531, 2309, 2557, 2050, 1278, 1282, 1534, 1538, 1279, 768, 768, 256, +-255, -258, 3, -3, 2, 255, 256, 257, -1, 1, -2, 3, -4, 260, 509, 513, +513, 766, 258, -2, 3, -3, 2, -1, 0, 2, -2, 0, 1, 255, 1, -256, +-513, 1, -257, -511, -513, 1, 255, 768, 257, -257, -2048, -3839, -6914, -11005, -24579, -30463, +-11263, 9471, 20481, 19455, 14080, 8193, 4095, 770, -1283, -2045, -1795, -1022, -513, 1, 255, 768, +513, 254, 2, -1025, -1280, -1535, -769, -257, 770, 2047, 2560, 2306, 1788, 1284, 1533, 1538, +1279, 769, 767, 257, -1, -512, 1, -2, 2, -1, 256, 257, 254, 2, -2, 2, +-2, 2, 510, 513, 768, 768, 512, -1, 1, -1, 2, -2, 1, 0, 255, 257, +256, 255, 2, -258, -511, 0, 0, -257, -766, -514, 2, 509, 260, -261, -1531, -3331, +-5376, -8190, -17155, -30205, -20739, 1539, 16894, 20224, 16385, 10751, 5888, 2049, -770, -1790, -1794, -1278, +-770, -255, 256, 511, 513, 256, -1, -767, -1281, -1278, -1026, -255, 767, 2049, 2561, 2302, +1538, 1022, 1282, 1535, 1536, 1024, 1025, 510, 2, -257, -1, 2, -1, 0, 256, 256, +512, 0, 0, 0, 0, 256, 512, 512, 512, 768, 512, 256, 0, 0, 0, 0, +1, -2, 2, -2, 2, -2, 2, -2, 3, -4, 4, -515, -510, -257, 257, 511, +513, -1, -1022, -2818, -4607, -7168, -13058, -27900, -27395, -4863, 13824, 20992, 18176, 12288, 6912, 3073, +-1, -1791, -1794, -1277, -771, -253, -3, 514, 256, 255, 1, -514, -1277, -1284, -1274, -519, +262, 1532, 2306, 2560, 2046, 1284, 1019, 1286, 1785, 1031, 1017, 776, 248, 6, -260, 2, +0, -1, 257, 255, 257, -1, 1, 0, -1, 1, 255, 513, 511, 769, 766, 260, +-6, 7, -8, 8, -7, 5, -2, -1, 259, -4, 3, -257, 0, 0, 256, 0, +-257, -253, -5, 6, 250, 5, -772, -2556, -4100, -6653, -10498, -24318, -29698, -10238, 9982, 19969, +18945, 13822, 7938, 4094, 513, -1279, -2050, -1533, -1028, -765, -257, 0, 513, 511, 0, -255, +-1026, -1021, -1027, -509, -3, 1282, 2303, 2561, 2304, 1535, 1025, 1535, 1537, 1279, 770, 765, +516, -4, -254, 0, -1, 2, -3, 3, 253, 259, -3, 3, -3, 2, 255, 512, +513, 767, 512, 512, 1, -2, -253, -3, -254, -1, 1, 255, 257, 256, 255, 1, +-257, -255, 0, -1, -256, 1, 0, 255, 257, -1, -768, -2046, -4099, -6141, -9219, -17917, +-29955, -15358, 4863, 16641, 20223, 15361, 10239, 5121, 1791, -1023, -1536, -1537, -766, -771, 3, -2, +513, 256, -1, 1, -513, -1022, -1027, -1021, -3, 771, 2302, 2561, 2559, 1793, 1279, 1281, +1791, 1536, 1025, 767, 769, -2, -254, -258, 2, -1, -1, 257, 512, 256, 0, -1, +1, -1, 257, 511, 512, 770, 765, 515, -3, 3, -3, 3, -259, -253, -2, 1, +255, 256, 513, 511, 1, -513, -511, -1, -255, -257, 1, 512, 767, 514, -3, -1277, +-3075, -4861, -7681, -14081, -28926, -25860, -3579, 14076, 20739, 17918, 12289, 6911, 3073, -257, -1791, -2048, +-1281, -1023, -257, 1, 511, 257, 255, 1, -257, -768, -1022, -1027, -253, 509, 1538, 2304, +2559, 2049, 1279, 1281, 1791, 1792, 1281, 1023, 769, -1, -512, -255, -1, 0, 258, 253, +515, 253, 2, 0, -1, 2, 253, 260, 508, 514, 768, 768, 512, 0, -1, 2, +-258, -254, -3, 4, -3, 258, 511, 255, -253, -259, -253, -3, 2, -1, 1, 512, +511, 769, -2, -765, -2562, -4351, -6912, -11010, -24572, -30469, -11003, 9981, 20737, 19456, 14079, 8194, +4095, 512, -1280, -2048, -1536, -1024, -512, 0, 256, 256, 256, -1, -254, -771, -1021, -1026, +-511, 0, 1279, 2305, 2560, 2303, 1282, 1278, 1537, 1792, 1279, 1026, 1022, 514, -2, -255, +1, -2, 3, 253, 257, 257, 255, 1, -1, 0, 256, 257, 510, 514, 767, 768, +256, 1, -3, 5, -261, -253, -257, 0, 256, 257, -2, 2, -1, 0, 1, -2, +2, -1, 1, -1, 257, 510, 258, -513, -1792, -3583, -5889, -8704, -19968, -30975, -17666, 4611, +18172, 19971, 15359, 9984, 5377, 1789, -765, -2050, -1791, -1280, -769, -254, -3, 259, 253, 3, +-1, -514, -1021, -1027, -765, -1, 1022, 2051, 2302, 2305, 1537, 1278, 1537, 1792, 1535, 1026, +1022, 514, -2, -255, 0, -1, 1, 0, 255, 513, 256, -1, 2, -3, 3, 254, +513, 512, 511, 770, 509, 3, -2, 1, 0, -257, -256, 2, -2, 257, 256, 255, +1, -256, -2, 4, 252, 3, -259, 2, 512, 767, 1025, -2, -765, -2818, -4350, -6915, +-13309, -28418, -26623, -4863, 13310, 20225, 17921, 12541, 7172, 3325, 1, -1792, -2049, -1534, -1026, -510, +-2, 0, 2, 254, 2, -3, -765, -770, -511, -255, 510, 1536, 2306, 2301, 1796, 1021, +1281, 1791, 1793, 1280, 1023, 1026, -2, -255, -256, 0, -1, 2, 254, 258, 255, -1, +2, -2, 2, 255, 256, 512, 513, 765, 773, 251, 4, -2, -1, -253, -260, 5, +251, 260, -3, 2, -1, -256, -255, -2, 259, 253, 3, -3, 258, 767, 1025, 511, +-511, -2305, -4095, -6145, -10496, -24319, -30466, -11773, 8701, 19714, 19199, 14335, 8707, 4605, 515, -1284, +-2044, -1538, -767, -513, 1, -2, 3, 253, 2, -1, -767, -770, -766, -257, 1, 1279, +2049, 2302, 1795, 1021, 1026, 1535, 1793, 1278, 1026, 1022, 514, -1, 0, -256, 0, 0, +256, 256, 255, 2, -2, 1, 0, 255, 257, 512, 510, 772, 763, 261, -4, -253, +-258, -512, -510, -2, 2, -2, 0, 2, -2, 2, -258, 1, -1, 258, -2, 2, +-3, 3, 765, 1283, 510, -511, -2560, -3841, -6655, -14337, -29439, -25599, -3075, 14340, 20219, 16900, +11775, 6655, 3073, 0, -1538, -1533, -1283, -766, -769, -511, -257, 1, -2, 2, -2, -509, +-514, -256, 1, 510, 1283, 1789, 1795, 1277, 1027, 1789, 2051, 1790, 1280, 1026, 509, 3, +-2, -255, -1, 2, -3, 4, 252, 259, -2, 1, 0, -1, 258, 510, 769, 1023, +770, 509, 4, -5, -252, -515, -765, -515, 2, -1, -1, 259, 252, 3, -257, -1, +3, 252, 3, -2, 2, 254, 1026, 1278, 770, -257, -2048, -3328, -5631, -10753, -25343, -29953, +-9983, 9983, 19456, 17921, 13311, 7937, 4095, 512, -1024, -1792, -1280, -1024, -511, -513, -512, -256, +0, 1, -1, -256, -512, -255, -2, 514, 1278, 1793, 1793, 1022, 769, 1280, 1792, 1792, +1280, 1024, 767, 259, -4, -252, -259, 1, 1, -2, 259, 253, 3, -3, 2, -1, +1, 256, 511, 769, 1023, 513, 256, -1, 1, -512, -513, -510, -3, 3, 254, 1, +0, -1, -255, 0, 255, 513, -1, 1, 0, -1, 514, 1277, 1283, 254, -1023, -2816, +-4864, -8193, -19967, -31745, -18174, 3582, 17409, 19455, 15361, 9984, 5376, 1791, -767, -1793, -1534, -1026, +-768, -511, -513, -254, -1, 254, 3, -2, -511, -511, -3, 3, 767, 1535, 1539, 1275, +773, 1277, 2050, 2558, 1794, 1278, 769, 257, -2, -254, -257, -256, 1, -1, 0, 256, +257, -2, 3, -3, 2, 255, 512, 1024, 1024, 1025, 254, 3, -259, -511, -511, -514, +-254, 0, 254, 3, 254, 0, 1, -257, 257, 512, 255, 1, -257, -255, 255, 1025, +1279, 513, -512, -2306, -3838, -6657, -13823, -27392, -24321, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, 1, 0, 0, 0, +0, 0, 0, 0, -1, 2, -2, 2, -2, 1, 0, -1, 1, 0, -1, 2, +-2, 1, 0, 0, 0, 0, 0, -255, -258, 2, -2, 2, -1, 0, -1, -254, +-515, -508, -260, 2, -1, 0, 1, -257, -255, -2, 514, 511, 257, -1, 0, 0, +1, 511, 1024, 1024, 769, -2, -253, -516, 3, -1, 255, 258, -3, -509, -771, -509, +-258, -1, 3, -3, 3, -514, -1024, -768, -255, -257, -767, -513, -256, 1, -2, 2, +-1025, -1535, -1280, -257, 256, 1026, 1533, 1283, 510, 1, -257, 2, 252, 516, 510, 0, +-1023, -1793, -1536, -1024, -1535, -2049, -1536, -767, -514, -765, -514, 512, 1282, 765, 260, 251, +2052, 3582, 3073, 1023, -255, -1025, -511, 1279, 2305, 2047, 1537, 1279, 514, 509, 1027, 765, +3, -514, -1279, -3328, -4353, -3071, -1280, -1281, -2558, -3843, -5118, -5120, -3584, -1793, -511, -770, +-2300, -2820, -1276, 251, 1541, 2556, 2052, -260, -1021, -2, 769, 2049, 3838, 4609, 2559, 2, +-1026, -1790, -1794, -767, 512, 512, -1, 514, 766, 513, 256, 255, -255, -769, 1, 1023, +513, -514, -1533, -1028, 261, 763, 1284, 3070, 2560, -1535, -5377, -6143, -5888, -2305, 1024, 2305, +1023, -1279, -4609, -7679, -6658, -3325, -259, 2050, 511, -2560, -4351, -2817, -512, 512, 2048, 3328, +2305, -2, -510, 254, 513, 1025, 2302, 1026, -1026, 2, 1790, 1026, -1282, -2303, -2559, -1794, +2, 1022, 770, -1026, -2302, -3074, -3326, -2817, -2048, -768, -767, -2049, -3072, -3328, -3328, -4351, +-4353, -2816, -1792, -2049, -766, 1278, 3842, 5886, 5633, 3840, 2560, 2560, 2559, 2562, 3070, 2562, +510, 1025, 512, -1793, -3838, -3586, -1535, -512, -512, -257, -254, -2050, -3582, -4610, -4862, -4098, +-3070, -1793, -3072, -4096, -6400, -10495, -10242, -7421, -3587, 769, 2049, 766, -510, 1791, 7423, 9731, +9468, 8196, 5117, 2049, 1793, 3838, 4355, 3325, 3074, 1023, -2815, -4865, -4095, -769, 1025, 1279, +1, -4864, -7937, -7423, -4609, -3328, -3070, -1027, -765, -3075, -4605, -4867, -4861, -4354, -2048, 514, +254, -1279, -1281, -1279, -3329, -6398, -4866, -767, 2303, 5889, 7935, 6914, 4605, 3075, 1534, 513, +1023, 1281, 0, -512, -1792, -2817, -3838, -2562, -1790, -1794, -255, 1025, 2302, 3329, 1025, -770, +-510, -1793, -4096, -3584, 257, 4094, 3843, -2051, -11262, -16898, -11774, -258, 5378, 3582, 514, -1538, +-3070, -2, 9218, 14079, 13568, 9728, 2304, -4096, -6144, -3840, -768, 768, 1535, 258, -4099, -8444, +-7684, -4349, -2563, -3324, -4357, -5371, -3332, -1022, -512, -2818, -5629, -5891, -4605, -2562, -768, -767, +-2049, -3071, -2560, -1, 769, 511, 1025, 1023, -1023, -2048, -513, 3585, 7423, 11777, 12800, 8448, +2302, -1532, -3332, -3069, -1, 1535, 514, 1021, 3, -3075, -4093, -1538, 256, 256, 0, 1536, +5633, 4863, -512, -3071, -5378, -8701, -9219, -6653, -2307, 1283, 509, -8446, -20480, -24322, -16894, -4096, +3839, 2817, -257, 0, 4097, 8703, 12033, 14334, 14851, 12285, 7170, -2, -4862, -2562, 4867, 8957, +5377, 768, -1536, 0, 2305, 765, -2812, -6148, -7165, -4866, -766, 254, -2047, -4864, -6144, -8192, +-9215, -8707, -8957, -7425, -7937, -7677, -6404, -5117, -3075, -1276, -516, -764, -1796, -2813, -1538, 4098, +12286, 17153, 17408, 12800, 4097, -2818, -4863, -2561, 770, 2558, 4611, 5116, 515, -3586, -4095, -3071, +254, 4609, 5632, 2048, -768, -1023, -2819, -4349, -6146, -8191, -5632, 0, 1023, -5375, -12289, -17664, +-23038, -21763, -9469, 3837, 7426, 3327, -4863, -5377, 6401, 18686, 20483, 17661, 16387, 13309, 5635, -515, +-2557, -259, 6146, 10239, 5889, -2305, -7423, -6657, -5119, -4865, -5120, -5886, -5635, -5628, -5637, -6651, +-9988, -11517, -8194, -5119, -3328, -4096, -7425, -9215, -8960, -6657, -5118, -5379, -2301, 1534, 4353, 1792, +-1025, -254, 2301, 6147, 11005, 14850, 14335, 11008, 8961, 5119, 0, -2304, -2305, -3325, -2306, 2305, +4094, 258, -1, 1793, -1536, -2049, 1536, 2049, 2046, 4355, 2558, -2816, -6399, -9218, -11006, -3841, +768, -5887, -13570, -17150, -18946, -18429, -11268, -1788, -1283, -1790, -3073, -2303, 7934, 20227, 22268, 15108, +8957, 8194, 4607, 1024, 769, 2302, 7171, 9981, 4099, -3331, -7421, -5635, -3325, -3074, -4863, -7424, +-7425, -6399, -5889, -8446, -11523, -11005, -6147, -2558, -2561, -5120, -10495, -11777, -8704, -5120, -3328, -512, +2817, 1534, 770, -514, -2558, -1, 5119, 8194, 10750, 13314, 13311, 9727, 7682, 4350, -767, -3328, +-2816, -1792, -768, 2815, 4866, -2, -2303, -1535, -3586, -3583, 1536, 3582, 3844, 5885, 4865, -3072, +-9474, -11004, -10500, -5116, -2052, -9213, -15618, -19454, -22274, -20734, -13058, -3327, -1792, -2560, -2304, 511, +9474, 18685, 19716, 14333, 13825, 16640, 10495, 4867, 4349, 4098, 6910, 8706, 6142, 1794, -258, 2, +-1026, -5886, -9219, -10493, -9730, -9471, -7424, -7681, -12799, -13568, -9217, -5375, -5633, -8447, -13569, -14847, +-13312, -11266, -7677, -1540, 4357, 5627, 4357, 251, -3836, -1539, 3330, 7934, 12803, 18941, 20994, 18431, +14079, 8194, 1022, -4350, -3585, -2048, -512, 2560, 4096, -511, -5377, -5888, -7680, -8192, -767, 3839, +3328, 5888, 7169, -1026, -11261, -15363, -13054, -4609, 1793, -7426, -18173, -18691, -19966, -22785, -18687, -5890, +2819, 4092, 3331, 3327, 10495, 20227, 22781, 18434, 15869, 17156, 13308, 5892, 4861, 4610, 3326, 3331, +1276, -3324, -7428, -6396, -4612, -4860, -7172, -9469, -11522, -11007, -8448, -8705, -11519, -12032, -8705, -5374, +-4355, -5885, -10242, -14847, -15360, -12033, -7935, -4097, 1282, 4861, 4867, 2558, -1792, -2558, 3582, 11520, +17666, 21757, 21764, 18428, 13827, 7934, 513, -3840, -1024, 2303, 1026, 1278, 2817, -1280, -4097, -510, +-1538, -3327, 2560, 8447, 7426, 6910, 5377, -3584, -14081, -16382, -14338, -8959, -2304, -5889, -18686, -23554, +-25599, -28673, -23551, -8705, 2561, 3839, 769, -1, 3841, 16639, 28417, 26624, 18687, 16641, 14847, 9985, +4351, 2561, 5375, 8448, 7937, 3582, -2046, -5121, -4864, -4608, -6912, -9984, -9727, -8706, -7421, -8196, +-10748, -13059, -13309, -10754, -6911, -4352, -7938, -14076, -15876, -13309, -10242, -6656, -766, 3581, 6147, 7165, +5378, 2304, 6142, 12290, 13823, 14080, 18433, 20734, 17154, 10494, 2307, -3331, -4606, -2050, -2302, -3073, +1, 510, -1022, -1, 1, -4353, -3072, 2561, 3328, 3839, 4097, -1, -9471, -14080, -14081, -12544, +-6399, -6401, -15616, -20991, -19457, -20736, -19198, -9731, 1026, 3071, 768, 2, 3325, 14082, 27903, 30464, +21505, 14078, 13058, 10751, 6913, 6910, 9731, 10749, 8706, 3328, -2306, -7421, -6402, -3583, -4608, -10241, +-14079, -13825, -10750, -9987, -11517, -13058, -13055, -9728, -6914, -5885, -8706, -15871, -17664, -15105, -11263, -6656, +-513, 4354, 5886, 7169, 5376, 2816, 3328, 7679, 11522, 14333, 18948, 22268, 20739, 14334, 6657, -1281, +-4863, -2561, 1, -257, 769, 2815, 769, -1, 1, -3072, -6401, 2, 4350, 3330, 3582, 2562, +-4354, -14077, -15364, -14588, -9731, -5886, -12544, -19714, -19198, -18945, -20224, -14591, -1025, 4351, -253, -2307, +1538, 11519, 25088, 28672, 22273, 15103, 14848, 14593, 9470, 7427, 8958, 8192, 5377, 1023, -3327, -7680, +-8962, -5885, -5123, -10237, -16131, -15870, -10497, -8447, -10497, -15359, -16897, -13311, -6145, -2559, -4353, -11776, +-18687, -16897, -11007, -7169, -1792, 6145, 9983, 8961, 7679, 3841, 511, 5121, 12287, 15361, 18943, 23809, +23551, 16897, 9216, 2046, -3581, -3331, -252, -516, -1534, -513, 0, -766, -2563, -5118, -7169, -255, +5631, 4353, 2559, 2049, -4609, -14846, -20226, -18943, -13311, -6915, -8699, -16389, -19965, -22272, -24322, -18685, +-7171, 1794, 2559, 1024, 4096, 11776, 22529, 29183, 25088, 17663, 17666, 17663, 13569, 8703, 8704, 9473, +7167, 1281, -3585, -5886, -5635, -3581, -4354, -9728, -15869, -16645, -12539, -8452, -8702, -13568, -17409, -14591, +-8961, -5887, -5632, -9729, -16383, -17152, -12801, -7935, -2304, 3583, 7938, 6910, 4097, -1, -1534, 4605, +12547, 17150, 20480, 23810, 23037, 17155, 8190, 1025, -3841, -4863, -1793, -766, -1794, 1, 511, -2047, +-2560, -3328, -5377, -1023, 6399, 7682, 5118, 3585, -1793, -13311, -19713, -17151, -10753, -4351, -5376, -15361, +-23552, -26112, -26879, -20737, -9215, 2559, 5376, 1537, 1535, 6656, 17152, 27648, 27648, 22272, 19201, 18174, +14338, 8701, 7940, 8188, 6149, 3323, 1283, -1537, -4352, -3839, -4098, -9213, -15108, -16892, -14339, -10750, +-9985, -13312, -17408, -16639, -10497, -6656, -6144, -9215, -16129, -19200, -15615, -9730, -4862, -1, 5888, 7937, +5631, 4096, 2560, 5889, 13567, 18689, 20223, 21504, 23809, 20991, 14081, 6143, -511, -3585, -2047, -1537, +-2815, -1793, -511, -2048, -2306, -2557, -5379, -4093, 2814, 4609, 0, -769, -1535, -8705, -15103, -15616, +-11776, -7169, -8191, -16130, -24828, -23300, -21501, -20227, -11518, -1, 6146, 1789, -3325, 1277, 13058, 27135, +32001, 25343, 17921, 15103, 13824, 11265, 8190, 9474, 9470, 6915, 2812, -2300, -5636, -6140, -4611, -5886, +-11265, -14848, -14335, -12034, -11262, -14081, -16384, -16127, -12290, -6910, -4866, -4862, -12545, -19968, -18944, -12288, +-6655, -1025, 4864, 8449, 6909, 4357, 2299, 1796, 7934, 13056, 15361, 18431, 22784, 22785, 16895, 9729, +2047, -2816, -4352, -3328, -3584, -2048, 768, 1280, 512, -513, -3326, -5890, -254, 4350, 1794, -2, +1795, -1796, -12285, -17410, -17407, -13311, -6914, -10750, -19714, -21246, -19969, -20992, -17919, -7170, 2563, 3325, +2, 256, 9470, 24066, 31999, 27905, 19711, 16897, 17918, 14594, 10752, 9727, 8193, 6911, 5120, -255, +-6145, -8447, -6401, -6399, -9985, -15104, -16639, -14082, -11261, -12291, -15870, -19202, -16127, -8447, -4610, -4862, +-10498, -17663, -19456, -13824, -6400, -1792, 3071, 6914, 7934, 6146, 2558, 1281, 5888, 11776, 15360, 19199, +24833, 25599, 19714, 10750, 3584, -2303, -4610, -3581, -2050, -1024, 769, 2047, -768, -2302, -4099, -7678, +-3840, 4095, 4353, 3327, 4608, 2, -10499, -18429, -19971, -17150, -9216, -6401, -15103, -21505, -23040, -25343, +-22273, -12287, -258, 4099, 1788, 1029, 5371, 17924, 30206, 30208, 22274, 18941, 18692, 15612, 11267, 9982, +7682, 5887, 5631, 2050, -3842, -6910, -5121, -4608, -9472, -15616, -16640, -15360, -13056, -11775, -13826, -18430, +-17922, -10238, -4609, -4095, -7938, -15871, -20479, -17921, -10751, -3330, 3330, 8447, 9729, 6399, 1024, -1280, +3073, 11008, 16383, 20993, 24830, 25859, 20733, 11779, 3837, -2302, -4352, -2050, -1021, -2564, -1532, -771, +-3325, -4099, -3838, -6145, -3840, 3841, 5118, 1282, 2303, 1280, -7680, -17152, -18175, -14338, -8190, -4866, +-13566, -23297, -25343, -26881, -24319, -13825, -512, 4097, 0, -1537, 3073, 14591, 29185, 31999, 24321, 19198, +19460, 17148, 12035, 10237, 9987, 7422, 6146, 4350, -767, -6144, -6144, -2816, -5888, -14337, -18943, -17408, +-13569, -11774, -13570, -18176, -19198, -14083, -6909, -4354, -6399, -14848, -21504, -19456, -12800, -6656, -768, 4352, +6912, 5888, 3840, 1023, 2817, 10495, 16385, 18943, 21504, 24832, 23552, 17409, 10238, 3330, -1538, -1278, +-258, -2046, -3842, -1790, -513, -1280, -256, -2304, -3327, 1790, 4355, -4, 3, 2816, -1026, -13053, +-18180, -15612, -10755, -7677, -13570, -22528, -24319, -24833, -23295, -16897, -5887, 511, -256, -2047, 1534, 11267, +24316, 31748, 27644, 20228, 18173, 16898, 11774, 9730, 10238, 10499, 8700, 5123, -1, -4864, -6143, -3330, +-4863, -9727, -15106, -15869, -12803, -11006, -12801, -16128, -16639, -13313, -7424, -4607, -5634, -11261, -18179, -18430, +-12801, -6911, -2049, 2049, 6398, 7427, 5117, 2818, 2303, 6912, 12544, 15105, 18174, 22531, 24572, 19460, +11261, 4611, -1027, -3326, -2561, -2304, -3070, -515, 770, 0, -2, -1533, -5379, -3069, 2814, 3072, +2305, 4607, 769, -9985, -16895, -17921, -14335, -7425, -6656, -15615, -21505, -21760, -22016, -18943, -9473, -768, +2817, 1790, 1283, 5117, 17154, 30463, 31488, 21249, 15870, 15363, 13564, 11525, 11771, 11524, 8701, 6146, +2303, -3327, -6658, -5373, -4355, -7678, -12288, -13571, -13307, -13317, -12284, -14082, -16640, -16639, -10497, -5119, +-3841, -6400, -14335, -18433, -14847, -8961, -3327, 2302, 7938, 9215, 6656, 3841, 1534, 4610, 11007, 15104, +17408, 21248, 23808, 19969, 11774, 6402, 766, -2303, -1792, -1536, -2816, -1536, 767, -255, -256, -513, +-5118, -5378, 1537, 4351, 2305, 3584, 3072, -6656, -16129, -15614, -13570, -9470, -7426, -13310, -20481, -21248, +-22271, -21507, -12539, -773, 2052, -515, -1023, 3073, 13311, 26367, 32002, 24062, 16386, 16383, 16383, 14337, +12801, 13309, 9476, 5628, 3331, -1026, -6399, -6145, -1534, -3330, -11263, -16896, -16129, -14078, -13314, -14335, +-16384, -17153, -13054, -6146, -3582, -6146, -14078, -20738, -18686, -11778, -5630, 1279, 6912, 7681, 5630, 3843, +2045, 2818, 8960, 14590, 16899, 19966, 23553, 22784, 16639, 10497, 4608, -512, -1536, -769, -2047, -1792, +768, 1279, -254, -771, -3325, -5890, -1536, 3586, 1789, 771, 2814, -1279, -12801, -18687, -16641, -11519, +-7168, -11010, -19196, -21252, -20734, -22272, -17666, -5372, 2812, 1539, -771, 2051, 10494, 22529, 30464, 27390, +20227, 17661, 18179, 14590, 9984, 9729, 9727, 6913, 3840, -1, -3838, -6147, -3836, -4101, -9466, -15366, +-16891, -14595, -12543, -13312, -16384, -16897, -13054, -7170, -5374, -5634, -9982, -17154, -18430, -12546, -6142, -2562, +3075, 7676, 7172, 5372, 4612, 3581, 5889, 11520, 15103, 17665, 22016, 23552, 18942, 11523, 5373, -510, +-3328, -2050, -1789, -3075, -509, 2301, 1027, -1027, -3070, -5633, -2815, 2303, 2561, 2046, 4354, 511, +-10752, -18176, -18432, -15359, -9730, -9470, -15618, -20735, -22783, -23297, -19969, -8445, 508, 772, -771, 2050, +8702, 17154, 27647, 31232, 23041, 17919, 17152, 14849, 10495, 8449, 9727, 8449, 4607, 1536, -2047, -5121, +-4607, -3329, -6912, -14079, -16129, -13823, -12032, -11778, -14845, -17155, -15869, -10243, -6397, -5379, -8445, -14850, +-18175, -14849, -9214, -5122, 1025, 7424, 8447, 6146, 4607, 3839, 6146, 11006, 14593, 16384, 20224, 23039, +19713, 11776, 6911, 1538, -2563, -3070, -1792, -2818, -2044, 1020, 1027, -770, -1791, -4352, -4864, 1280, +4096, 1536, 3328, 3584, -5632, -17151, -19458, -16126, -11010, -8446, -13826, -19454, -19458, -19454, -21250, -14079, +-2304, 4864, 3327, 770, 4605, 14339, 25598, 32001, 26623, 18945, 16127, 14082, 9725, 7939, 9212, 8198, +5370, 2821, -773, -5628, -6402, -4607, -6145, -11520, -15871, -15873, -14079, -12289, -12543, -15617, -17407, -14337, +-8447, -5121, -5119, -10497, -17919, -17153, -11264, -6911, -1025, 6145, 10239, 8961, 7422, 5635, 4861, 8962, +13311, 15360, 17920, 21760, 22016, 16128, 9728, 3584, -2816, -3584, -2047, -2818, -2557, 1789, 3330, 766, +-1533, -4355, -6142, -1537, 3071, 1795, 2813, 3842, -2561, -14080, -19455, -18690, -14589, -10243, -11773, -16643, +-19198, -19713, -21760, -16383, -3585, 3840, 3073, 510, 2819, 12029, 23554, 31230, 28418, 19199, 16128, 15361, +12030, 8193, 7169, 8190, 6915, 4349, 2, -5890, -7166, -3329, -2815, -8962, -15102, -15618, -13310, -11777, +-12289, -15358, -17410, -15101, -8195, -4351, -4863, -8962, -16637, -18179, -12287, -6400, -2560, 3584, 9216, 9727, +6913, 5375, 5378, 9214, 13057, 14336, 15871, 19202, 20477, 16131, 10238, 4609, -1024, -3073, -2304, -2815, +-3841, -766, 2813, 771, -516, -2811, -5892, -2813, 2814, 2048, 770, 3326, 1281, -8961, -18431, -20224, +-16896, -11776, -11265, -16126, -19714, -19198, -19970, -16894, -6657, 2049, 2302, 2, 2046, 9731, 18941, 29698, +31999, 23551, 17155, 15100, 11780, 6397, 5122, 8446, 8450, 4350, 258, -3329, -6401, -5118, -3841, -7937, +-14334, -15874, -13567, -11263, -10754, -13311, -16640, -16640, -12287, -6914, -5118, -7426, -13822, -16897, -14080, -9984, +-6401, 2, 6142, 9217, 7168, 5886, 5892, 7420, 10755, 12029, 12803, 16894, 20482, 18430, 11265, 7168, +1023, -4606, -4867, -3069, -2818, -511, 3071, 3073, -2, -1276, -5124, -6141, -2, 2817, 2047, 4354, +3837, -6140, -18436, -22269, -18690, -13567, -9984, -13825, -17662, -18178, -19966, -20482, -12031, 513, 5629, 2820, +2044, 7684, 16637, 25857, 30208, 26111, 19202, 15102, 12033, 7424, 5119, 6658, 6654, 4609, 1024, -2560, +-6144, -6399, -4099, -6140, -12036, -15612, -15875, -13567, -12287, -13826, -17406, -18434, -13822, -7426, -4093, -4355, +-10238, -17409, -16896, -11263, -6914, -1533, 6653, 11779, 9982, 7936, 6657, 6399, 9473, 12800, 13823, 16384, +20737, 19711, 13569, 6911, 512, -3840, -3583, -1025, -512, 1, 3070, 3075, -514, -2816, -4606, -5124, +-1018, 2554, 1541, 2555, 4357, -2308, -15358, -20224, -19202, -16637, -12035, -13054, -17154, -18429, -19459, -19967, +-15615, -4355, 3588, 4093, 3585, 5377, 11774, 22017, 30720, 29695, 20739, 15612, 14339, 8957, 4611, 5374, +7169, 6655, 3584, 1026, -3843, -7166, -4353, -4351, -9984, -15361, -15615, -13057, -12543, -12544, -14337, -17406, +-15618, -9728, -5118, -4098, -7935, -14848, -17665, -12543, -7423, -2819, 4099, 8957, 9731, 8446, 6401, 6143, +8960, 12801, 15103, 15873, 17407, 18689, 13568, 7679, 2306, -2562, -3327, -768, -512, -2816, -1279, 2045, +3, -2050, -2558, -4097, -3073, 770, 1533, 1285, 4091, 2052, -9220, -19708, -20484, -17916, -13571, -13311, +-16127, -16898, -17407, -18687, -16899, -6653, 3839, 4095, 1026, 3069, 9474, 17919, 27906, 31997, 24322, 15871, +13568, 10498, 4861, 3843, 6141, 6914, 3584, -512, -2817, -5630, -4356, -2810, -7430, -15099, -18180, -15100, +-11780, -10236, -11781, -15610, -17414, -13307, -8195, -5887, -7167, -12547, -15614, -13311, -8962, -6142, -1026, 5888, +8450, 7678, 7425, 7936, 9470, 12036, 13563, 13573, 14588, 17410, 15360, 10495, 6145, 1791, -2303, -2561, +-2047, -3585, -3583, 1023, 2817, 767, -1024, -5630, -6148, -507, 3067, 2052, 2814, 2560, -5119, -16641, +-21503, -20993, -16383, -12288, -14592, -17153, -16639, -16385, -17406, -11265, 1791, 6657, 2560, 512, 5888, 15361, +25598, 31490, 27647, 18176, 13825, 11007, 5889, 2302, 3331, 6653, 5634, 767, -3328, -6655, -6913, -5120, +-6656, -11776, -15616, -14848, -11775, -9475, -11260, -16388, -19453, -14850, -8190, -4098, -3582, -7426, -13054, -13570, +-9470, -7938, -4095, 4352, 10496, 10752, 9728, 10239, 10497, 10495, 11522, 12030, 13825, 17920, 17407, 12034, +7165, 3075, -2562, -5119, -2816, -2305, -3071, 1279, 4610, 1278, -2047, -5120, -7169, -2558, 2814, 1281, +1280, 4607, 2, -13059, -21757, -23043, -20221, -14082, -12287, -14080, -15873, -16126, -16387, -14076, -2308, 5892, +5628, 3843, 6654, 14082, 22014, 28929, 29695, 22785, 16896, 13824, 7679, 2049, 1536, 5119, 5634, 2813, +-253, -4610, -7678, -5378, -4606, -9987, -15612, -15108, -11772, -10500, -11260, -14851, -18431, -16383, -9218, -4606, +-3841, -5376, -11520, -15359, -12290, -7422, -4097, 2559, 9731, 12029, 11010, 9470, 8961, 9984, 12288, 13312, +13568, 15359, 16386, 13309, 7939, 4094, -511, -3328, -2049, -1790, -3075, 3, 4350, 2817, 0, -1792, +-4097, -4094, -770, 770, 1278, 5889, 4353, -7937, -20736, -24064, -21249, -17150, -13313, -12800, -13568, -14336, +-16129, -16126, -7426, 3329, 6656, 5375, 6657, 11775, 17665, 25855, 32000, 27394, 19196, 14085, 9468, 3330, +1535, 4864, 7425, 5119, 1537, -2049, -5376, -5631, -4097, -7424, -14079, -16385, -12288, -9726, -9476, -12027, +-16901, -18172, -14851, -9213, -5891, -4861, -7683, -12541, -11779, -8189, -6658, -1023, 6656, 10751, 11010, 10494, +9986, 10494, 12546, 14334, 13057, 13824, 16639, 15618, 10238, 5120, 770, -3076, -2042, -518, -2043, -1028, +3586, 4352, -256, -2816, -4096, -5121, -1791, 1791, 1282, 3838, 3585, -5121, -17664, -22783, -20737, -17151, +-12545, -12543, -14081, -14335, -15872, -15873, -8958, 3069, 9476, 6908, 4100, 7420, 15364, 24572, 31492, 29693, +20226, 13822, 9730, 3326, 2, 1791, 5632, 4352, 1024, -2560, -5633, -6910, -5634, -6398, -12034, -15871, +-14336, -11009, -8958, -9986, -14847, -19199, -17154, -9727, -4609, -2814, -4610, -10238, -12290, -8703, -6912, -3329, +5123, 11004, 11524, 10236, 10755, 12031, 13056, 13824, 12799, 11778, 14078, 14081, 9727, 5633, 3071, -511, +-2305, -768, -1535, -3329, 513, 4095, 1793, -1025, -2047, -4096, -3073, 769, -1, 1, 2816, -1, +-12544, -22527, -22786, -20477, -16643, -15102, -16641, -15103, -13314, -14078, -11265, 0, 9729, 8190, 3075, 6141, +15363, 24317, 30979, 30205, 23299, 15870, 12289, 7168, 0, -770, 4100, 6395, 3333, -1283, -4607, -6912, +-5632, -5889, -11262, -17154, -16126, -11778, -8958, -9218, -14846, -20738, -19710, -12289, -6144, -4352, -4608, -9984, +-13055, -9474, -6910, -5378, 1282, 10750, 13826, 12031, 11775, 13570, 14078, 13826, 11775, 9728, 12544, 15616, +12801, 7678, 4867, -4, -4348, -4355, -3838, -3841, 0, 5632, 5376, 512, -3072, -6144, -6145, -2303, +-768, 1535, 5378, 3325, -8189, -20739, -26621, -25858, -21247, -16385, -14079, -13057, -13822, -15618, -12288, -2302, +6141, 7171, 5373, 8451, 15869, 22786, 28927, 31232, 25600, 18945, 14590, 8195, 1020, -1276, 2557, 6402, +3584, -259, -3835, -5637, -4860, -5123, -12287, -18687, -16642, -12030, -9474, -8446, -11778, -19710, -22018, -15102, +-8706, -6398, -5379, -7164, -11012, -10237, -7681, -6657, -1278, 7934, 13314, 11774, 11266, 13567, 14080, 14080, +13824, 12543, 12547, 14845, 13569, 7681, 3325, 516, -2052, -1789, -1282, -3070, -258, 4353, 3840, -769, +-2046, -3331, -4349, -1026, 514, -2, 3841, 4351, -6399, -20225, -25343, -23552, -20225, -17151, -16385, -14848, +-13823, -15872, -14849, -5375, 6656, 10750, 6915, 6398, 12033, 20480, 27392, 31999, 28930, 21501, 14851, 7935, +-257, -3070, 1278, 5377, 3840, 768, -1281, -6143, -7423, -5892, -7930, -15366, -18171, -13060, -9982, -9216, +-10497, -16127, -21761, -18688, -10751, -6658, -4862, -5377, -8960, -10753, -8446, -6658, -2815, 5376, 11775, 13057, +12288, 13054, 14083, 15101, 15362, 13311, 12288, 13569, 13055, 7680, 3584, 768, -2560, -1535, -2, -1534, +-2562, 2306, 5118, 770, -1793, -3072, -4607, -2306, 2, -257, 1793, 4094, -2814, -16386, -24318, -25089, +-21760, -18176, -16383, -15618, -14846, -15105, -16383, -9984, 4094, 12291, 10492, 6405, 9468, 16642, 22783, 30209, +31742, 24835, 16637, 10242, 3583, -3072, -2816, 4097, 6655, 3583, -1021, -4611, -7422, -7169, -6912, -12544, +-17406, -15620, -10748, -9220, -10236, -15876, -21244, -19715, -13055, -7168, -4352, -4096, -8192, -11008, -8705, -7677, +-5380, 3075, 11262, 13313, 13313, 14078, 15105, 14336, 14848, 13312, 10496, 11264, 13567, 9731, 4604, 2307, +-769, -2050, 4, -1284, -4093, -258, 5377, 3840, 0, -2560, -4353, -4351, -2816, -2304, -512, 3840, +1279, -9982, -22018, -26622, -26370, -21758, -17922, -14334, -12033, -13057, -14078, -12034, 2, 11263, 12031, 8450, +8190, 14082, 20479, 26112, 31744, 28416, 19968, 11265, 4606, -1533, -3845, 1286, 6907, 4868, -770, -5377, +-7422, -7937, -8192, -11262, -16644, -15867, -12549, -9980, -8450, -12287, -19969, -22014, -16642, -10239, -6144, -3585, +-4350, -8961, -7936, -6656, -7168, -1536, 8192, 13568, 13312, 13312, 16128, 15872, 14592, 13311, 10242, 9469, +12547, 11006, 5121, 1536, 511, -1023, -513, -254, -2562, -2046, 3325, 4355, 510, -1790, -3330, -5118, +-3843, -2556, -1540, 2563, 3070, -6143, -19201, -26367, -27648, -24322, -19452, -15622, -12538, -11012, -12030, -12289, +-5376, 8192, 13313, 9214, 6915, 12284, 19972, 26108, 30212, 28669, 20739, 13309, 8450, 1279, -3840, -767, +4863, 4609, -1, -4095, -7681, -8448, -6399, -7937, -15103, -17921, -14079, -10242, -8957, -10499, -16893, -22787, +-19709, -11779, -6910, -4352, -3585, -6911, -9216, -6401, -6399, -3072, 5632, 12800, 13823, 13057, 14848, 15872, +15104, 13823, 12033, 10240, 12031, 11778, 6398, 2306, 510, -1791, -1279, -2, -2046, -3074, 1538, 5630, +2306, -1795, -4092, -4868, -3326, -2816, -3585, 769, 4095, -1536, -14591, -24833, -27391, -26881, -22528, -16895, +-12033, -11007, -14337, -13824, -7167, 4607, 13056, 12033, 9470, 13315, 18940, 22276, 27133, 31490, 27391, 18176, +9985, 3583, -3839, -4609, 2561, 6655, 1793, -3329, -5119, -7681, -7679, -8192, -13825, -18174, -16387, -11516, +-8964, -9724, -15619, -22270, -22785, -15105, -9981, -5635, -3326, -5121, -7680, -7168, -6912, -5632, 2304, 11008, +14080, 14080, 15104, 17664, 15872, 15105, 15103, 12033, 11006, 11523, 8701, 3075, 509, -1277, -2052, 517, +-5, -2300, 509, 5634, 3583, -2047, -4353, -3840, -4351, -2818, -2557, -771, 3074, 767, -11264, -25343, +-28673, -26367, -22018, -18173, -15363, -12797, -12291, -12541, -10756, 5, 14332, 17410, 12032, 9214, 14339, 20990, +26881, 31232, 28415, 19201, 11519, 5121, -1792, -5889, -767, 4607, 3072, -1791, -5377, -7936, -8959, -8194, +-11006, -16897, -18176, -13311, -9218, -8190, -12289, -20736, -24320, -19456, -11520, -6656, -2304, -1280, -5888, -7168, +-5633, -5887, -1536, 8447, 14850, 14590, 15105, 17919, 18177, 17407, 15874, 10494, 6913, 8703, 8705, 4864, +2048, 1280, -257, 1, 0, -3585, -3326, 2558, 5377, 1280, -1024, -2816, -4608, -4864, -4864, -4607, +766, 2306, -6402, -18174, -26369, -28929, -28926, -22785, -16384, -12543, -10754, -10751, -9214, -1795, 9475, 15101, +12290, 10752, 14847, 19969, 24832, 30207, 29954, 22014, 14081, 8192, 767, -6142, -4354, 3329, 5375, 1, +-4097, -7422, -8707, -7422, -9985, -16639, -18944, -14081, -9984, -8959, -10496, -16897, -25087, -23041, -13823, -8449, +-5119, -2561, -4863, -5633, -4096, -4863, -3073, 5889, 13567, 14592, 14081, 16895, 19201, 17407, 14593, 10751, +8193, 9983, 10753, 6143, 1537, 511, -1279, -2304, -1025, -1791, -2560, 2815, 7682, 3326, -3072, -5374, +-6403, -6140, -4356, -3837, -3, 4866, -768, -16640, -28161, -31231, -29442, -23805, -16899, -11772, -11013, -12027, +-12293, -7420, 5118, 16130, 16893, 13059, 13565, 19203, 23807, 27902, 30979, 27134, 18176, 8706, 765, -5629, +-6658, 1280, 5889, 1535, -4607, -7424, -8705, -9471, -9984, -14593, -19198, -16643, -11772, -9476, -8701, -14850, +-24318, -26371, -18684, -12037, -7932, -2817, -1793, -5119, -6144, -5890, -5117, 1533, 11523, 15613, 14595, 15613, +18690, 17919, 16384, 14593, 11519, 9473, 9471, 6400, 769, -513, -767, -513, 1281, 1278, -1533, -3, +4098, 2303, -3072, -4095, -3585, -4352, -3071, -4098, -4349, -3, -2302, -13313, -24832, -28671, -27649, -25088, +-20480, -16384, -14591, -14593, -13056, -7680, 4864, 17664, 19200, 13056, 10496, 16384, 22016, 26112, 30464, 28928, +19711, 9986, 2302, -4095, -7936, -2048, 5376, 3328, -3329, -7935, -9471, -9729, -9471, -11266, -17150, -18177, +-13567, -9217, -7936, -12799, -22273, -27392, -22271, -12545, -7167, -2817, -512, -3584, -5119, -4865, -5631, -770, +9218, 14590, 14083, 14588, 19716, 20220, 17924, 15613, 10498, 5631, 6143, 6659, 2556, 4, 1534, 511, +258, 255, -3072, -3327, 2302, 6402, 1534, -3070, -3329, -3328, -4864, -6400, -6657, -1534, 1791, -6656, +-19712, -28416, -29440, -27647, -23554, -19198, -14081, -11776, -12287, -10242, -510, 13822, 19971, 15612, 11013, 14842, +21766, 23803, 27140, 30205, 25858, 16383, 7168, -512, -7167, -5122, 3330, 6142, 2, -5633, -7168, -8448, +-8704, -11776, -17919, -20226, -15357, -10243, -8702, -9217, -17152, -26112, -25087, -16642, -11006, -7682, -3326, -2819, +-3325, -2306, -4096, -4094, 4093, 12290, 14848, 14334, 17155, 20989, 19458, 16639, 12289, 8703, 7680, 8448, +4608, 0, 0, 0, -513, 514, -515, -2045, 1790, 6657, 2815, -2558, -4611, -5116, -5637, -5115, +-5636, -1533, 2558, -1535, -14849, -26110, -29954, -29439, -24321, -18943, -15872, -13568, -11521, -8959, -3585, 6402, +18174, 20225, 13823, 11265, 17663, 25090, 27902, 29698, 26109, 17411, 8446, 2562, -4609, -7937, -1022, 4862, +1281, -6143, -7682, -8958, -9473, -10242, -14844, -19203, -17662, -11521, -7937, -7421, -12037, -23546, -28678, -20987, +-12291, -7679, -2817, -510, -2051, -4092, -4100, -4094, -1, 9729, 15104, 15104, 15359, 19456, 20737, 18943, +15361, 9984, 6142, 6915, 5373, 1539, 510, 1024, 513, 1280, 512, -3072, -1793, 3585, 4864, 1023, +-2302, -3331, -4861, -6146, -6143, -6401, -1279, 767, -8446, -22018, -28671, -29697, -29183, -23295, -17154, -12287, +-11265, -12030, -7938, 1538, 14078, 20737, 17664, 14592, 18175, 22530, 24574, 27138, 28670, 23041, 12032, 4864, +-768, -6656, -4609, 3074, 4094, -2558, -8450, -9726, -9474, -9470, -11265, -17408, -19711, -14082, -9213, -8707, +-10238, -18432, -28162, -26364, -16646, -10490, -5636, -766, 0, -1538, -1790, -4097, -3327, 4863, 12544, 13825, +15615, 19458, 21245, 19970, 17151, 11521, 7167, 7169, 7166, 2562, -769, 0, 1, -1, 1792, 1, +-2817, 1537, 6143, 2561, -3329, -4351, -4097, -4864, -5630, -6916, -4859, 763, -3068, -16899, -27390, -29184, +-29186, -26365, -18947, -13310, -10241, -11775, -11521, -4095, 8703, 20992, 22785, 18431, 17152, 20225, 21759, 22785, +25855, 27136, 19969, 9983, 1536, -6399, -8449, -2047, 4350, 2050, -4098, -7678, -9474, -11006, -11778, -16126, +-19714, -17407, -11007, -7682, -7422, -12546, -23806, -27906, -19710, -13569, -10497, -3326, 1534, 1282, -2, -1278, +-3587, 260, 9981, 14338, 15358, 17666, 21246, 22274, 19455, 15104, 9985, 6398, 7682, 4862, 2, -1025, +768, 513, 1790, 1794, -1793, -1792, 3329, 4606, 2, -2305, -2816, -4095, -6146, -8958, -8961, -2305, +1027, -7940, -22012, -29444, -30460, -30211, -23806, -14593, -10753, -10494, -10496, -6658, 1283, 14844, 26116, 24061, +18179, 17660, 19972, 21757, 26370, 29696, 25342, 14851, 3837, -2558, -6912, -5121, 1794, 4349, -1789, -7171, +-9982, -11263, -11011, -12285, -16643, -19454, -15616, -9984, -6657, -7423, -15617, -26367, -27648, -19968, -12545, -4862, +1533, 2563, 1278, 1, -1792, -3329, 3586, 12285, 14851, 15614, 18945, 22273, 21756, 18438, 13562, 7941, +5373, 5376, 1026, -1538, 1, 768, 767, 2562, 1278, -3583, -512, 4864, 2560, -1792, -1536, -513, +-3581, -7428, -9469, -7425, -513, -1790, -13826, -24063, -27647, -28674, -28414, -20738, -12542, -9985, -8960, -8703, +-2818, 7426, 20735, 26112, 20481, 17150, 22018, 24575, 24321, 24318, 23810, 19710, 12035, 3069, -4094, -7170, +-3583, 3072, 3584, -3839, -10754, -11518, -10499, -11516, -14339, -18175, -19199, -13314, -7166, -6402, -11519, -21504, +-28159, -23043, -15100, -9475, -3838, 1022, 3330, 3582, 770, -3329, -1280, 7681, 14335, 16383, 18178, 22271, +25601, 22271, 15616, 9216, 5889, 6143, 5121, 2047, 769, 1536, 1022, 772, 763, -1531, -4356, 1282, +6655, 2562, -1284, -507, -2821, -9468, -12547, -11518, -7169, 1025, -769, -16128, -27904, -31231, -32001, -27647, +-15362, -7934, -7169, -6912, -4351, 767, 10496, 23296, 26113, 21246, 19971, 23805, 25090, 21504, 20479, 20481, +17151, 8960, 770, -5123, -5372, -773, 1797, -1541, -8955, -11779, -9215, -8447, -12291, -17149, -18945, -17921, +-11773, -6405, -6395, -12291, -22015, -26112, -20737, -13822, -8706, -2047, 3583, 6146, 4350, 770, -2306, 1025, +11008, 14847, 14594, 17406, 22530, 24062, 18945, 13312, 7680, 4351, 4354, 2558, -254, -514, 1026, 766, +770, 767, -256, -2048, 2304, 5121, -258, -2813, -260, -2813, -10497, -12032, -8704, -3328, -512, -7936, +-23296, -30720, -29696, -28159, -21761, -11263, -5634, -8958, -9985, -3583, 4351, 16384, 26880, 26369, 21502, 21250, +22526, 22018, 19711, 22527, 21250, 13823, 5121, -2049, -5376, -5375, -1281, 769, -3585, -10496, -12799, -10753, +-9984, -14080, -18177, -20222, -17410, -10494, -6914, -8703, -14848, -24065, -26110, -19714, -13311, -6912, 767, 7169, +7680, 4095, -511, -2048, 2303, 10753, 15871, 16385, 19199, 24065, 23551, 18689, 13055, 6656, 2049, 2047, +2561, -1, -1023, 2303, 1537, 767, 256, -2814, -3587, 1795, 2557, -1789, -2050, 1537, -2816, -12545, +-13822, -10242, -4863, -4352, -13824, -25089, -29438, -27651, -27133, -20738, -10751, -6913, -8446, -7683, -509, 8958, +21760, 29953, 26368, 20735, 21249, 22527, 20992, 19713, 19968, 17407, 9473, 1791, -3840, -7166, -5379, -1022, +-1, -6144, -12799, -13824, -11778, -12541, -16131, -19709, -20482, -15103, -8704, -7170, -9980, -16644, -24573, -24322, +-16383, -10497, -6142, 1790, 7937, 8704, 5120, 767, -1535, 3583, 12290, 16126, 16385, 21503, 26881, 23551, +16385, 9983, 2560, -1535, -2, 770, -2, 771, 1788, -252, -1539, -2814, -5890, -4606, 1534, 3331, +-3, 770, 766, -7678, -15362, -15102, -10497, -3584, -3583, -14339, -25851, -29702, -29434, -27908, -19710, -8961, +-3584, -4096, -4863, -1, 12289, 25854, 30722, 24831, 19456, 21248, 22529, 19198, 16899, 17148, 14596, 7164, +517, -4101, -6908, -3332, 771, -770, -8702, -13570, -13567, -12800, -13057, -15102, -18947, -19965, -13570, -7167, +-7168, -10241, -16894, -24323, -22268, -14340, -8700, -3844, 3076, 7677, 6658, 2047, -1280, -512, 6400, 14081, +16127, 17664, 21504, 23296, 19456, 14081, 9214, 3330, -2, 1026, 510, -766, 1022, 258, -1538, -1022, +-1026, -3838, -770, 4098, 2302, -1535, 0, -513, -8446, -13314, -13056, -9214, -3843, -5885, -18690, -28927, +-28672, -25857, -22015, -13057, -5118, -3074, -5631, -4352, 2560, 15104, 27904, 30719, 23810, 18943, 20480, 20224, +15615, 13570, 14078, 11779, 6908, 1539, -3073, -6400, -3840, 1, -2306, -10750, -13826, -13310, -12545, -12544, +-15104, -19200, -19456, -11775, -5634, -5630, -9985, -17920, -23807, -20226, -12541, -6148, -508, 4861, 7426, 6142, +4099, 764, 772, 8190, 14079, 16643, 17916, 22275, 24063, 19456, 14080, 7423, 1025, -1793, -1278, -2051, +-1789, -3, 1283, -258, -256, -1279, -5122, -2045, 2046, 768, 1, 4094, 1794, -9984, -16642, -15357, +-12291, -7422, -8192, -16897, -24063, -24321, -24575, -21505, -11774, -3331, -1278, -1792, 254, 6916, 17147, 28932, +31997, 24323, 18686, 18432, 16129, 13311, 13569, 14592, 11519, 6913, 2047, -3327, -7425, -4606, -1283, -4862, +-11521, -14335, -12801, -13056, -14335, -15874, -18174, -17921, -12801, -6397, -5379, -8446, -14849, -20224, -17663, -11009, +-5376, 513, 5886, 9219, 8189, 4354, 1791, 2304, 9216, 14593, 17150, 20483, 24573, 23809, 16641, 9726, +4867, -515, -1533, -1027, -2302, -2049, 257, 255, -767, -514, -2301, -5636, -2043, 3834, 3078, 1786, +4102, -5, -12540, -17411, -14590, -11521, -7423, -9986, -18173, -23555, -23294, -23809, -19968, -8447, 767, 768, +-1536, 0, 6400, 18177, 30718, 32002, 22014, 16385, 17152, 16896, 14080, 13823, 13313, 8703, 5122, 2302, +-3071, -7424, -5121, -1279, -4864, -13313, -17662, -16130, -14336, -14079, -15617, -17406, -17666, -12032, -5631, -3840, +-7169, -16381, -21765, -18427, -11268, -5116, 2301, 7170, 7422, 5121, 3841, 1791, 3329, 10238, 15618, 17663, +20993, 24831, 22785, 16126, 9731, 3580, -763, -1541, -1020, -2307, -1534, 1023, 768, -512, -1280, -4095, +-5890, -510, 3583, 1536, 1025, 2813, -3068, -15107, -19965, -16900, -11005, -7169, -12800, -20735, -22019, -21500, +-23043, -16382, -3329, 3071, 1282, -1025, 3072, 12545, 24829, 32004, 27133, 19969, 18177, 18941, 14340, 9981, +10242, 9727, 6400, 3329, -513, -5119, -6401, -3583, -5121, -11519, -16385, -17408, -14848, -12800, -14848, -17663, +-17410, -12542, -7170, -5630, -6401, -11776, -18943, -18945, -12031, -5889, -1792, 3840, 8192, 6913, 5630, 4354, +3582, 6913, 12800, 16127, 18946, 23294, 24577, 18688, 11520, 4863, -1277, -3332, -1788, -2051, -3070, -1, +2304, 768, -1280, -3840, -5887, -1538, 3073, 2304, 2303, 4610, -1026, -13311, -19712, -18944, -15104, -9728, +-10752, -17408, -22272, -23807, -24578, -19453, -6916, 1028, 509, -510, 3072, 10238, 19714, 29951, 31743, 22532, +18426, 17926, 14843, 10243, 8959, 9984, 8192, 3841, 1022, -2814, -5889, -4608, -3328, -8447, -15618, -16894, +-14338, -12542, -12801, -15872, -18176, -15872, -9983, -6401, -5888, -9728, -16640, -19200, -14848, -9216, -4608, 2304, +8192, 8447, 5889, 4608, 3839, 6657, 12288, 15360, 17151, 21505, 24062, 19203, 11262, 6401, 767, -3071, +-3073, -2303, -3329, -1536, 1025, 1023, -1023, -2049, -4864, -4352, 2049, 3839, 1281, 3582, 2818, -7681, +-18432, -19711, -16130, -10750, -9217, -15617, -20221, -19972, -20220, -21252, -12540, -772, 4867, 3070, 1025, 5888, +15872, 27391, 32257, 25343, 18433, 15872, 13568, 9471, 8193, 9215, 7937, 4864, 2304, -1537, -6398, -6402, +-4351, -6656, -12545, -16126, -15617, -13824, -12033, -13311, -16384, -17152, -13312, -7937, -4863, -5376, -12033, -18175, +-16384, -10496, -6145, 2, 7166, 10497, 8704, 6911, 5122, 5374, 9730, 13821, 15364, 18172, 22020, 20988, +15107, 8703, 2304, -3071, -3586, -2046, -3329, -2048, 2305, 2815, 0, -1790, -4611, -6141, -770, 2816, +1794, 3070, 3585, -4608, -15873, -19711, -18433, -14079, -10497, -12799, -17409, -19200, -20222, -22019, -14846, -1793, +4353, 2815, 2, 4093, 13827, 25342, 31744, 27138, 18686, 16641, 15615, 11521, 7679, 7170, 7933, 6915, +3837, -1021, -6658, -7167, -3073, -3327, -10497, -16126, -15875, -13309, -12035, -12797, -16387, -18173, -14594, -7679, +-4609, -5375, -10497, -17919, -18177, -11519, -6145, -1791, 4606, 9731, 9469, 6402, 5119, 5888, 9985, 13567, +15104, 16641, 19967, 20737, 15871, 9729, 3838, -1532, -3077, -2043, -3075, -3840, 2, 2813, 771, -770, +-3070, -5891, -2044, 3068, 1539, 1278, 3073, 0, -11009, -19710, -20227, -16637, -11778, -12031, -17152, -20225, +-19967, -20737, -16126, -4866, 2561, 1792, -1, 3073, 11008, 21247, 31234, 31998, 22785, 16895, 15106, 11262, +6146, 5374, 8961, 8448, 3584, 0, -3584, -6912, -4865, -3838, -9218, -15359, -16128, -13313, -11262, -11266, +-14590, -17410, -16639, -11775, -6915, -5372, -8452, -14844, -17156, -13821, -10242, -5376, 770, 7166, 9473, 6912, +6143, 5633, 7679, 11009, 12287, 13825, 17920, 21246, 17667, 11005, 6659, 254, -4863, -4609, -3071, -2817, +1, 3583, 2304, 2, -1539, -6141, -5634, 1024, 2818, 2046, 4610, 3071, -8193, -19711, -22272, -18433, +-13054, -10243, -14845, -17922, -18688, -20479, -20225, -10239, 1535, 5376, 2049, 2559, 8961, 18430, 27394, 30206, +25346, 18687, 14848, 11264, 6912, 5120, 6657, 6654, 4097, 257, -3074, -6397, -6148, -3581, -6914, -12798, +-15875, -15356, -13317, -12283, -14595, -17664, -18175, -12545, -6655, -4096, -5121, -11519, -17665, -15871, -10497, -6399, +-257, 7681, 11520, 9215, 7681, 6143, 6656, 9730, 12797, 13827, 16893, 20738, 18943, 12289, 5887, 1, +-3841, -3583, -1025, -767, -1, 3329, 2559, -767, -3073, -4863, -4609, -256, 2561, 1535, 2817, 4095, +-4095, -16898, -19965, -18947, -15869, -11522, -14080, -17407, -18689, -19712, -19710, -14083, -2558, 3839, 3841, 3839, +6145, 13055, 23553, 31232, 28671, 19457, 15359, 13569, 7424, 4608, 5887, 7425, 6143, 3073, 512, -4865, +-6910, -4098, -4607, -11009, -15871, -15104, -12800, -13056, -12801, -15102, -17667, -15356, -8964, -5373, -4610, -9214, +-15874, -17407, -12032, -6913, -2301, 5372, 9731, 9727, 8192, 6401, 6142, 9474, 13566, 15362, 15871, 18176, +18433, 13054, 6658, 1022, -3070, -3585, -511, -770, -3070, -258, 1794, -770, -2302, -2819, -4604, -2820, +1283, 1278, 1281, 4351, 770, -11267, -20477, -20737, -17409, -13310, -13571, -16637, -16897, -17664, -18944, -16128, +-4865, 4611, 3836, 1283, 3839, 10751, 19970, 29438, 32002, 23295, 15360, 13568, 9728, 4352, 4097, 6655, +6656, 2816, -768, -3583, -5889, -3840, -2816, -8703, -16130, -18429, -14596, -11516, -10499, -12030, -16642, -17150, +-12290, -7933, -5892, -7676, -13315, -16126, -12801, -8192, -5376, 1, 6655, 8448, 7681, 7678, 8450, 9726, +12546, 13823, 13312, 15104, 17407, 14850, 9726, 5890, 766, -2815, -2304, -2305, -3839, -3072, 1791, 2818, +510, -1535, -6145, -5375, 1, 3069, 2051, 2814, 2050, -7170, -18174, -21507, -20476, -15363, -12287, -15360, +-17151, -16642, -16637, -17156, -9468, 3068, 6148, 2045, 770, 6911, 16896, 26624, 31745, 26110, 17154, 13567, +10240, 5377, 2046, 4098, 6910, 4866, -2, -3838, -7170, -6398, -5122, -7422, -12546, -15871, -14080, -11008, +-9472, -11521, -16895, -18689, -13823, -7168, -3842, -3837, -8195, -13565, -13315, -8957, -7683, -2813, 5629, 11010, +10495, 9473, 9983, 10496, 10496, 11520, 12032, 14080, 17665, 16637, 11268, 6652, 2307, -3585, -4865, -2302, +-2306, -2814, 2046, 4353, 256, -2816, -5888, -6912, -1537, 2818, 765, 2052, 4348, -1533, -14594, -21759, +-22272, -19456, -13313, -12286, -14338, -15870, -15874, -16127, -12543, -259, 5892, 5116, 3843, 7423, 15103, 23042, +28925, 28932, 21243, 16133, 13051, 6661, 1531, 2052, 5118, 5633, 2047, -768, -5119, -7424, -5119, -5122, +-11007, -15616, -14335, -11009, -10240, -11263, -15617, -18687, -15616, -8450, -4349, -3586, -5887, -12288, -15361, -11007, +-6913, -3583, 3840, 10239, 12033, 10496, 9215, 8961, 10240, 12543, 13314, 13566, 15617, 16383, 12545, 7168, +3328, -1281, -3327, -1537, -1791, -2816, 511, 4353, 2560, -513, -2046, -4099, -3837, -515, 771, 2045, +6147, 3069, -9725, -21507, -23806, -20481, -16383, -12801, -13055, -13569, -14336, -16127, -15105, -5375, 4096, 6398, +5123, 7421, 12548, 18429, 26881, 32000, 26367, 17667, 13565, 8193, 2560, 1536, 5888, 7169, 4350, 1281, +-2560, -5632, -5120, -4351, -8450, -14846, -15617, -11776, -9471, -9729, -12799, -17153, -17664, -14079, -8449, -5375, +-4865, -8191, -12545, -11007, -7937, -5888, 1, 7935, 11009, 11008, 10238, 9730, 10751, 12801, 14079, 12801, +14078, 16643, 14590, 9216, 4353, -1, -3583, -2048, -768, -2305, -510, 4351, 3840, -768, -2816, -4353, +-5117, -1027, 1538, 1534, 4353, 3073, -6915, -18940, -22531, -20478, -16386, -12287, -12801, -14078, -14594, -16127, +-15617, -7167, 4607, 9473, 6143, 3841, 8191, 16640, 25857, 31742, 28419, 19197, 13314, 8958, 2307, -4, +2308, 5885, 4098, 255, -2816, -5888, -6912, -5375, -6913, -12800, -16128, -14080, -10495, -8962, -10493, -15875, +-19710, -16128, -8962, -4350, -2561, -5119, -11264, -12289, -8192, -6911, -2305, 6658, 11518, 11521, 10239, 11265, +12288, 13312, 13569, 12542, 12289, 14592, 13823, 9218, 5631, 2815, -765, -2053, -507, -2052, -3070, 1537, +4350, 1281, -768, -2305, -4350, -2562, 1025, 0, 511, 3074, -1283, -14333, -22530, -22528, -19711, -16130, +-15101, -16643, -14334, -12801, -14080, -9984, 1793, 9726, 7427, 2813, 7426, 16382, 24578, 30462, 28930, 21502, +14849, 12032, 5887, -767, 0, 4608, 5888, 2304, -1793, -5118, -6402, -5118, -5890, -12031, -16640, -14848, +-11009, -8446, -9731, -15100, -20228, -18173, -10754, -5375, -3840, -5120, -10241, -12031, -8448, -6401, -4350, 2813, +11267, 12798, 11266, 11517, 12804, 13052, 13059, 10495, 9215, 12546, 15102, 11266, 6654, 4098, -514, -4350, +-3842, -3327, -3585, 515, 6140, 4612, -5, -3324, -6402, -5118, -2050, -511, 2048, 5375, 2050, -9731, +-20989, -25601, -24064, -19456, -15360, -13313, -12542, -13314, -14846, -10498, -510, 6398, 6657, 5120, 8959, 16386, +22782, 28674, 29694, 23553, 17408, 13055, 6914, -2, -766, 3325, 5891, 2557, -764, -4101, -5372, -4610, +-5376, -13054, -17923, -15357, -11267, -8701, -8195, -12541, -19458, -20224, -13311, -7937, -5887, -5121, -7680, -10752, +-9215, -7168, -5889, 0, 8705, 12799, 11010, 11005, 13059, 13565, 13572, 13052, 11779, 12285, 14595, 12031, +6399, 2818, -3, -2044, -1796, -1532, -2820, 259, 4350, 3074, -770, -2046, -3330, -4351, -512, 512, +512, 4352, 3328, -8192, -20992, -24577, -22269, -19204, -16379, -15878, -14075, -13826, -15617, -13566, -3329, 7680, +9985, 6910, 6913, 13313, 21246, 28162, 31486, 27650, 20478, 14082, 6397, -1277, -2562, 2306, 5630, 3842, +-3, -1533, -6658, -7422, -5890, -8702, -16642, -17919, -12288, -9728, -9472, -11008, -17152, -22017, -17151, -10241, +-6143, -4609, -5631, -9473, -10496, -8192, -6400, -1791, 6911, 12289, 12798, 12035, 13309, 14082, 15359, 15104, +13058, 12029, 13826, 12543, 6656, 3330, 253, -2558, -1025, 1, -2049, -2047, 3326, 4866, -1, -2304, +-3070, -4612, -1788, -3, -254, 2304, 3839, -4607, -18177, -24831, -24832, -20993, -17918, -16131, -15357, -14594, +-15359, -16128, -7681, 6145, 12543, 9729, 6655, 10496, 17665, 23807, 30977, 30718, 23298, 15103, 9217, 2559, +-3584, -1791, 5119, 6402, 2813, -1533, -5378, -7679, -6913, -7678, -13570, -17150, -14594, -10239, -9472, -10752, +-16640, -21249, -18942, -11779, -6653, -4098, -4607, -8961, -10751, -8194, -7932, -4357, 4612, 11774, 13312, 13057, +14336, 14846, 14340, 14843, 12548, 10238, 11521, 13056, 8959, 4352, 2049, -769, -1791, -1, -1536, -3840, +769, 5374, 3075, -516, -2813, -4609, -4353, -2558, -2305, 0, 3841, 253, -12284, -22787, -26878, -25601, +-20735, -17410, -13310, -11778, -12798, -14081, -10752, 2048, 11776, 11776, 7936, 8448, 14848, 20992, 27136, 31488, +26880, 18432, 10240, 3840, -2048, -3584, 2560, 7168, 3840, -1537, -5629, -7684, -7932, -7940, -11774, -16640, +-15103, -12035, -9468, -8709, -13564, -20481, -21506, -15612, -9221, -5883, -3332, -4862, -8960, -7424, -6657, -6655, +-1, 9473, 13569, 12797, 13571, 16126, 15617, 14336, 12543, 9730, 9982, 12546, 10494, 4097, 1280, 256, +-769, -254, -514, -2814, -1282, 4097, 3840, 0, -1792, -3584, -5121, -3582, -2562, -1023, 3072, 2303, +-8190, -20994, -26623, -27393, -23807, -18944, -15361, -12799, -11265, -12799, -12289, -3327, 9982, 13059, 8957, 7426, +13823, 21504, 27393, 31231, 28672, 19969, 12798, 7427, 253, -4094, -1, 5120, 4097, -1026, -4862, -8193, +-8704, -6655, -9474, -16638, -18433, -13823, -9986, -9470, -11777, -19200, -23806, -19204, -11004, -6659, -4349, -4099, +-8190, -9473, -6912, -6399, -2049, 7424, 13824, 14593, 13566, 16131, 16636, 15620, 14333, 12035, 10749, 12803, +11773, 6146, 2304, 254, -2300, -1029, 4, -2563, -2558, 2559, 5889, 1790, -2301, -4355, -5117, -3075, +-3070, -3329, 1793, 4096, -3329, -17407, -26114, -28669, -27394, -22271, -16641, -11775, -11521, -14847, -13569, -5631, +6655, 14081, 11775, 9985, 14335, 19968, 23297, 28670, 32003, 26621, 17154, 8959, 2304, -4863, -3842, 3843, +6653, 515, -3587, -5117, -8196, -7419, -8708, -14846, -18433, -15872, -10751, -8960, -10241, -16384, -22783, -21761, +-14336, -9214, -5124, -3323, -5893, -7677, -6913, -6911, -4866, 4099, 11773, 14082, 13567, 15873, 17663, 15361, +15359, 14336, 11521, 11007, 11521, 7424, 2558, 515, -1539, -1789, 509, 3, -2306, 1536, 5889, 2558, +-2557, -4099, -3838, -4098, -2301, -3075, -254, 3582, 2, -13569, -26624, -28672, -25856, -20992, -17663, -14850, +-12030, -12034, -12798, -9729, 2049, 15103, 17152, 11009, 9727, 15105, 21759, 27905, 31232, 27135, 17921, 9983, +4096, -2814, -5892, 261, 5115, 2052, -2306, -5631, -8193, -8960, -8447, -12032, -17665, -17663, -12546, -8958, +-8448, -13313, -21760, -24319, -18178, -10493, -5891, -1789, -2051, -6654, -7169, -5631, -5633, -512, 9473, 15103, +14593, 15359, 17919, 18178, 17151, 15105, 9471, 6656, 8960, 8192, 4097, 2046, 1282, -514, 258, -257, +-3839, -3074, 3330, 5375, 513, -1280, -2818, -4606, -5121, -5119, -4097, 1536, 1536, -8192, -19967, -26882, +-29183, -28672, -22016, -16128, -12288, -11009, -11006, -8706, -255, 11008, 15359, 11779, 11260, 16131, 20990, 26369, +31488, 30208, 20992, 13055, 7938, -259, -6909, -3586, 4353, 5119, -767, -5121, -7935, -9217, -7680, -11263, +-18434, -19453, -13572, -10236, -9475, -11519, -19456, -26624, -22784, -13312, -8705, -5119, -3072, -5377, -5887, -4096, +-5377, -2047, 7679, 15104, 15106, 14844, 18437, 19452, 17922, 14848, 10494, 8707, 10749, 10755, 5373, 1283, +509, -1790, -2305, -767, -2049, -2559, 4095, 7937, 2559, -3583, -5633, -6655, -5889, -4351, -3841, 1025, +5118, -3070, -19457, -29951, -32001, -29952, -23296, -16383, -11777, -11263, -12545, -12288, -6399, 7167, 17153, 16896, +13055, 14337, 20735, 24833, 29184, 31744, 26368, 16895, 7425, 0, -6400, -5888, 2304, 5887, 258, -5378, +-7423, -8959, -9475, -10237, -15874, -19711, -15872, -11520, -9473, -9214, -16387, -25340, -25604, -17405, -11522, -6911, +-2560, -2305, -5374, -6147, -6141, -4865, 3071, 12547, 15867, 14342, 15867, 18948, 17660, 16132, 14077, 11266, +8959, 9471, 5378, 255, -256, -1023, -258, 1538, 767, -1792, 1025, 4607, 1536, -3584, -4095, -3585, +-4351, -2817, -4352, -3840, 1, -3586, -15357, -25859, -28927, -27648, -24576, -19711, -16129, -14848, -14592, -12544, +-6143, 7166, 18690, 18687, 12545, 11007, 17664, 23040, 27137, 30719, 27904, 18433, 8958, 1539, -4867, -7679, +-767, 5886, 2562, -4097, -8704, -9728, -9727, -9218, -11774, -17921, -18176, -12799, -8706, -7934, -14337, -23551, +-27394, -20989, -11524, -6652, -2051, -1022, -4353, -5376, -5376, -5888, 1, 10238, 15106, 13822, 15363, 20221, +19970, 17918, 15362, 9471, 5376, 6401, 6398, 1538, -2, 1539, -3, 514, -1, -3583, -2562, 3587, +6140, 516, -3586, -3072, -3327, -4866, -6654, -6402, -765, 1276, -8700, -21251, -29183, -29695, -27394, -23039, +-18687, -13570, -12030, -12289, -9472, 1280, 15873, 20223, 14849, 11263, 16129, 22526, 24068, 27899, 29957, 24828, +15106, 6143, -1791, -7681, -4095, 4606, 5890, -1025, -6143, -7682, -8702, -8962, -12542, -18690, -19966, -14594, +-9727, -8704, -10497, -18686, -26882, -24063, -15617, -10495, -6912, -3329, -2815, -3585, -2304, -4350, -3331, 5634, +13311, 15105, 14079, 17922, 21245, 19203, 16126, 12034, 8190, 8193, 8447, 3586, -2, 3, -260, -510, +768, -769, -1534, 2815, 6655, 1793, -3329, -4606, -5634, -5631, -5377, -5376, -510, 2558, -3071, -16897, +-27136, -30206, -28931, -23805, -18691, -15613, -13314, -11263, -8705, -2816, 8193, 19711, 19712, 13569, 12031, 19200, +25857, 28670, 29442, 25087, 15872, 7680, 1536, -5376, -7679, 254, 5378, -2, -6910, -7938, -9213, -9732, +-10747, -15878, -19706, -17157, -10748, -7683, -7934, -13825, -25344, -28671, -19714, -11773, -7171, -2301, -515, -2301, +-4356, -4347, -4356, 1538, 10752, 15615, 15105, 16896, 20223, 20481, 18688, 14592, 8960, 6145, 6909, 4612, +1020, 516, 765, 769, 1280, 0, -3328, -1279, 4094, 4354, 254, -2814, -3841, -5120, -6143, -6403, +-5884, -771, 1, -10495, -23555, -29437, -30466, -28670, -22274, -16126, -12034, -11518, -12034, -7167, 3328, 15872, +20992, 16896, 14591, 18946, 23038, 25089, 27649, 28670, 21762, 10751, 4351, -1790, -7170, -3838, 3838, 3329, +-3585, -8959, -9729, -9727, -9729, -12032, -18431, -19457, -13568, -8959, -8962, -10494, -20225, -28672, -25087, -15873, +-10239, -4610, 2, -256, -1537, -2046, -4355, -2301, 6399, 13311, 14337, 16128, 19712, 21505, 19710, 16385, +10496, 7168, 7168, 6912, 1792, -768, 0, 0, 512, 2048, -768, -2561, 2562, 6398, 1538, -4098, +-4351, -4352, -4865, -5886, -6658, -4095, 768, -4864, -18945, -27902, -29698, -29439, -25088, -17920, -12545, -10238, +-12291, -10749, -2562, 10753, 22015, 22272, 17922, 17406, 20481, 22014, 23299, 26109, 26628, 18683, 8964, -3, +-7422, -8192, -769, 4353, 1024, -5122, -8188, -9989, -10747, -12291, -16894, -19714, -16638, -10242, -7421, -7939, +-14077, -25092, -27132, -18946, -13312, -9471, -2562, 1538, 1022, -254, -2050, -3582, 1790, 11266, 14334, 15617, +18689, 22013, 22021, 18939, 14339, 8959, 6400, 7168, 4097, -257, -1280, 769, 511, 2049, 1536, -2562, +-1277, 4093, 4099, -258, -2559, -3072, -4097, -6400, -9214, -8195, -1532, 509, -9728, -23551, -29696, -30464, +-29695, -22274, -13823, -10240, -10752, -9984, -5632, 2816, 17152, 26112, 23040, 17664, 17921, 19966, 22018, 26878, +29442, 23807, 13312, 2816, -3328, -7168, -4607, 2558, 3841, -2816, -7936, -9983, -11009, -11009, -12542, -16898, +-19197, -14851, -9215, -6144, -8193, -16893, -26884, -26365, -18946, -11775, -3584, 1792, 2559, 1026, 254, -2559, +-2815, 5118, 13313, 14336, 15359, 19714, 22526, 21249, 17919, 12802, 6910, 5377, 5120, 511, -1534, -2, +769, 1024, 2815, 514, -3587, 4, 5372, 1794, -2303, -1283, -509, -4098, -7680, -9469, -6405, 5, +-3588, -15869, -25090, -27391, -28673, -27646, -19203, -12541, -9475, -8957, -7938, -1791, 9472, 22527, 25346, 19198, +17665, 22528, 24320, 24321, 24318, 23297, 18944, 10496, 2049, -5121, -7168, -2559, 3583, 3072, -5119, -11010, +-11262, -10240, -12034, -15358, -18689, -17921, -11773, -6659, -6911, -12544, -22784, -28159, -21762, -14078, -8707, -2812, +1277, 3585, 3072, 0, -3328, 0, 8960, 15103, 16386, 18430, 23297, 25600, 21504, 14592, 8192, 5631, +6146, 4606, 1794, 766, 1537, 1024, 768, 768, -2304, -4352, 2304, 6400, 1792, -1536, -768, -3840, +-10495, -12545, -11007, -6146, 2050, -2561, -18175, -28673, -31487, -32001, -25599, -13824, -7426, -7164, -6917, -3579, +1788, 12291, 24317, 25347, 20477, 20739, 24574, 24576, 20736, 20481, 20479, 15873, 7678, 3, -5635, -5117, +-4, 1284, -2562, -9727, -11521, -8448, -8960, -13310, -17411, -19198, -17152, -11010, -5884, -6917, -13564, -23298, +-26111, -19713, -13055, -7681, -1024, 4097, 6142, 3586, -1, -2560, 2049, 11775, 14848, 14593, 18431, 22785, +23296, 17918, 12291, 6910, 4097, 4095, 2048, -511, -257, 1026, 764, 773, 764, -766, -1793, 3329, +4607, -1022, -2307, 3, -3843, -11261, -11778, -7680, -2558, -1027, -10237, -24834, -30207, -29185, -27134, -20226, +-9983, -5376, -9729, -9214, -2562, 5889, 18432, 27135, 25346, 20989, 21508, 22779, 21253, 19964, 23299, 19967, +12543, 3842, -2819, -5373, -5121, -768, 512, -4352, -11264, -12543, -10242, -10750, -14594, -18686, -19969, -16384, +-9472, -6912, -9216, -16128, -24576, -25600, -18943, -12290, -5629, 1788, 7428, 7165, 3330, -1025, -1792, 3584, +11776, 15872, 16640, 19968, 24064, 22784, 17664, 12288, 5632, 1281, 2046, 2050, -770, 2, 2303, 1280, +769, -2, -3582, -2817, 2304, 1793, -2561, -1535, 1535, -4352, -13055, -13569, -9471, -4353, -5119, -15617, +-26367, -29185, -27392, -26367, -18945, -9728, -6911, -8706, -7166, 511, 10751, 23298, 30206, 25346, 20222, 21506, +22270, 20482, 19711, 19968, 16385, 8447, 769, -4353, -7167, -5121, -511, -769, -7167, -13569, -13312, -11520, +-12800, -16127, -19713, -19968, -13568, -7936, -7424, -11008, -17920, -25088, -23295, -15362, -9983, -4608, 3072, 8960, +7936, 4352, -1, -1022, 4606, 13314, 15870, 16641, 22528, 26368, 22529, 15358, 8449, 1280, -1792, 256, +768, -1, 1026, 1533, -509, -1794, -2815, -6144, -4098, 2306, 2815, 0, 1026, -4, -8956, -15620, +-14588, -9987, -2813, -4355, -16637, -26883, -29949, -29186, -27390, -18178, -7935, -3839, -4354, -4349, 1532, 14595, +27902, 30978, 23806, 19713, 22271, 22529, 18943, 16898, 17148, 14341, 6395, -252, -5378, -6911, -2561, 1281, +-1794, -9981, -14083, -14077, -13315, -14078, -16129, -20479, -20481, -13055, -7169, -7679, -11521, -19454, -26115, -22781, +-14082, -8702, -2817, 4351, 8450, 6142, 1538, -1537, -1, 8194, 15614, 17410, 18942, 23553, 24831, 19969, +14080, 8703, 2817, -1, 1281, 511, -256, 770, -3, -1788, -773, -1788, -4354, 1, 4864, 1535, +-1791, 255, -1278, -9987, -14333, -13570, -8959, -3584, -7938, -22013, -31235, -30205, -27394, -22272, -12287, -4609, +-3584, -6143, -3841, 4352, 18433, 31230, 32002, 24576, 19965, 22276, 20733, 16130, 14336, 14334, 11778, 6399, +1025, -4353, -6399, -3329, 0, -3583, -12289, -14590, -14083, -13054, -13824, -16129, -20991, -19968, -11266, -5372, +-6405, -11515, -20485, -25852, -20483, -12030, -5632, 255, 5376, 7936, 6400, 3585, -2, 1795, 9980, 15620, +17661, 19714, 24575, 25345, 19967, 14337, 6911, 1, -1792, -1537, -2047, -1537, 513, 1279, -767, -257, +-2047, -5377, -1279, 2047, 513, 512, 4351, 513, -11008, -16641, -15102, -11522, -7423, -8703, -18690, -24062, +-24322, -24062, -20225, -10240, -2560, -1536, -1536, 1025, 7933, 18436, 29692, 30979, 22783, 17920, 17664, 15616, +12800, 13312, 14337, 11007, 6143, 1282, -4354, -7423, -4095, -1794, -5887, -12031, -14339, -12541, -13058, -14335, +-15871, -18178, -17151, -11776, -5632, -5375, -8962, -16126, -20226, -16893, -9987, -4350, 1278, 6402, 9470, 7426, +4094, 1026, 2813, 9987, 15102, 16897, 20736, 24831, 22785, 15360, 8959, 3841, -768, -1537, -1278, -2307, +-1533, 510, 2, -770, -511, -2561, -5887, -768, 4096, 2559, 1793, 4095, -1791, -13825, -17151, -14081, +-10494, -7427, -11005, -19458, -23551, -23296, -23808, -18689, -6654, 1021, 260, -1796, 4, 7932, 19971, 31742, +30977, 20737, 16126, 17410, 16638, 13826, 13822, 12802, 8191, 4863, 1283, -3587, -7422, -4353, -1279, -5889, +-14334, -17667, -16126, -14591, -14339, -15868, -17924, -17406, -11007, -4867, -4349, -8706, -17663, -22016, -17665, -9983, +-3329, 3329, 7680, 6911, 5121, 3327, 1793, 4096, 11519, 15873, 18175, 22273, 25344, 21759, 15105, 8959, +2817, -1281, -1279, -1025, -2559, -1026, 1283, 508, -508, -1539, -4862, -5634, 2, 3582, 1026, 1279, +2304, -4864, -16640, -19711, -16130, -10237, -7428, -14076, -21506, -22016, -22271, -22786, -14846, -2048, 3326, 771, +-515, 4098, 14335, 26880, 32001, 26367, 19456, 18432, 18689, 13566, 9986, 10494, 9218, 5631, 2559, -1535, +-5632, -6400, -3584, -5889, -12542, -17154, -17150, -14594, -13055, -15104, -18177, -16894, -11778, -6655, -5632, -6914, +-12796, -19460, -18173, -11010, -5376, -1021, 4859, 8454, 6650, 5637, 4093, 3585, 7680, 13567, 16386, 19710, +24065, 24320, 17662, 10244, 3580, -2301, -3586, -1791, -2561, -3070, 254, 2305, 0, -1537, -4350, -5891, +-764, 3068, 2052, 2556, 4355, -2562, -14591, -19712, -18177, -14078, -9219, -11518, -17920, -22530, -23292, -24069, +-17404, -5378, 1281, -1, -511, 3839, 11265, 20479, 30464, 29952, 20737, 17662, 17154, 13822, 9474, 8959, +9728, 7423, 3331, 764, -3323, -5893, -4092, -3843, -9471, -15360, -15616, -13056, -11776, -12545, -15871, -17153, +-14591, -8961, -5887, -5632, -10241, -16639, -17922, -13309, -8194, -3839, 3071, 8449, 7935, 5377, 4096, 4095, +7426, 12542, 14849, 16896, 21504, 22783, 17155, 9980, 5380, -3, -3071, -2815, -2306, -3325, -1028, 1284, +509, -1279, -2303, -5379, -3581, 2814, 3073, 1279, 4097, 1535, -9472, -18943, -18946, -14845, -9731, -9726, +-15873, -19968, -19199, -20481, -19967, -10498, 2, 4863, 2048, 1282, 6908, 17412, 28414, 31488, 23554, 17405, +15619, 12542, 8705, 8192, 9216, 6911, 4354, 1534, -2302, -6402, -5887, -4352, -7424, -13055, -16387, -15357, +-13570, -12030, -13314, -16638, -17155, -12540, -7172, -4861, -6147, -13053, -18434, -15615, -9984, -5377, 1025, 7679, +10241, 8447, 6914, 4862, 5889, 10496, 14079, 15617, 18689, 22013, 20483, 14079, 7935, 1026, -3843, -3069, +-2305, -3329, -1534, 2813, 2052, -4, -2301, -5378, -5631, 0, 3071, 1538, 3581, 3075, -6403, -16892, +-19461, -17915, -13060, -10238, -13312, -17921, -18942, -20738, -21758, -12802, -510, 4350, 2307, -3, 5122, 15103, +26880, 32001, 25855, 17920, 16385, 14847, 10752, 7425, 7422, 7938, 6400, 3069, -2043, -7174, -6395, -2563, +-4094, -11522, -16382, -15362, -13055, -12032, -13312, -16640, -18176, -13312, -6657, -4606, -5378, -11519, -18432, -17408, +-10241, -5630, -770, 5633, 10240, 9215, 6146, 4862, 6145, 10752, 14079, 15106, 17150, 20737, 20481, 14590, +8962, 3071, -2304, -3071, -2305, -3328, -3839, 254, 2562, -1, -1024, -3840, -5888, -768, 3328, 1280, +1279, 3330, -1026, -12542, -19970, -19966, -15618, -11263, -12544, -17920, -20224, -19712, -20224, -14593, -3582, 3070, +1537, 1, 3837, 12547, 22526, 32001, 30465, 21246, 16641, 14847, 10242, 5375, 5888, 8959, 7682, 2813, +-763, -4357, -6654, -4095, -4610, -9983, -15615, -15618, -12798, -11008, -11267, -14588, -17155, -15870, -10497, -6144, +-5632, -9216, -15361, -16638, -12802, -9471, -4607, 1533, 7684, 8956, 6659, 5886, 5891, 8444, 11012, 12283, +13830, 18683, 20740, 16380, 9987, 5886, -509, -5379, -4351, -3072, -2560, 256, 3585, 2045, -252, -2051, +-6142, -4866, 1537, 2559, 2307, 5116, 1540, -10500, -20734, -21759, -17411, -12284, -10500, -15870, -17919, -18691, +-20733, -19202, -8447, 2816, 5376, 1792, 3072, 10241, 19454, 28162, 30206, 24579, 18172, 14853, 10746, 6150, +5371, 6659, 6399, 3840, 0, -3840, -6656, -6144, -4096, -7679, -13826, -16383, -15360, -13313, -12541, -15108, +-18428, -18181, -11770, -6150, -4091, -5891, -13055, -18431, -15618, -9727, -5888, 768, 8704, 11776, 9216, 7680, +6400, 6911, 10497, 13569, 14334, 17922, 21501, 18436, 11516, 5380, -515, -4352, -3069, -771, -767, 513, +3581, 2307, -1537, -3328, -5120, -4352, 255, 2562, 1279, 3584, 3585, -6402, -18174, -20225, -19199, -15361, +-11520, -14591, -17921, -18943, -19969, -19712, -13055, -769, 4609, 3839, 3841, 6655, 14849, 25599, 32000, 27906, +18429, 15620, 13052, 7170, 4608, 6144, 7680, 5376, 2816, 0, -5632, -6656, -3840, -5632, -12288, -16128, +-14849, -13053, -13317, -13306, -15878, -17916, -14594, -7935, -4864, -4608, -10241, -16895, -17409, -11006, -6146, -1278, +6398, 9984, 9474, 7934, 6402, 6909, 10498, 14080, 15616, 16383, 18689, 18174, 12547, 6142, 0, -3582, +-3076, -252, -1539, -2814, 0, 2046, -1277, -2308, -3068, -4611, -2046, 1535, 1024, 2048, 4608, -513, +-13310, -20995, -20732, -17157, -13051, -14340, -17150, -16896, -17921, -19199, -15360, -2817, 5121, 2815, 1537, 4863, +12033, 21247, 30721, 31230, 21763, 15100, 13316, 8957, 4098, 4350, 6914, 6398, 1794, -1282, -3582, -6146, +-3582, -3329, -9985, -16893, -17924, -14076, -11011, -10494, -12801, -16896, -16640, -11520, -7423, -6146, -8446, -14081, +-15872, -12032, -7679, -5122, 1026, 7167, 8448, 7681, 7678, 8450, 10239, 12800, 13569, 13566, 15874, 17663, +14080, 9217, 4863, 256, -2816, -2304, -2304, -4095, -2306, 2306, 2558, 258, -2306, -6398, -4866, 771, +3069, 2050, 3071, 1024, -8959, -19201, -21760, -19711, -14594, -12542, -15874, -17406, -16642, -17150, -16898, -7679, +4609, 6141, 1540, 1276, 8452, 18429, 28162, 31999, 25344, 16640, 13313, 9726, 4611, 2045, 4354, 6911, +4096, -511, -4353, -7423, -6401, -5119, -7937, -13311, -15872, -13570, -10748, -9733, -12795, -17924, -18685, -13058, +-6399, -3328, -4097, -9470, -14339, -12797, -8962, -7423, -1537, 7425, 11263, 10498, 9726, 10241, 10496, 10752, +11776, 12289, 15103, 18431, 16386, 10238, 6147, 1533, -4094, -4610, -2303, -2815, -2305, 2816, 3840, 0, +-2815, -6146, -6654, -514, 3074, 767, 2559, 4610, -3074, -16638, -22529, -22528, -18944, -13056, -12544, -14848, +-16384, -16128, -16384, -11520, 1024, 6144, 4864, 3840, 8448, 16640, 24576, 30208, 28672, 20736, 16384, 12287, +5890, 1278, 2306, 5885, 5124, 1532, -1533, -5889, -7426, -4604, -6149, -12283, -16387, -14335, -11009, -10495, +-12033, -16382, -18946, -14848, -7422, -4099, -4093, -6914, -13312, -15359, -10498, -6653, -2819, 5123, 11260, 12036, +10493, 9475, 9213, 10754, 13055, 13568, 14081, 16383, 16385, 12030, 6914, 2814, -1789, -3331, -1534, -2305, +-2816, 1537, 4607, 2048, -511, -2305, -4607, -3585, 1, 510, 2563, 6909, 1794, -12033, -23040, -24063, +-20482, -15870, -12801, -13312, -13823, -14851, -16379, -14341, -3836, 5117, 6401, 5121, 7935, 13568, 19713, 28415, +32001, 25343, 17409, 12799, 7425, 2048, 2047, 6145, 7167, 3841, 511, -3071, -6144, -5122, -4605, -9219, +-15613, -15362, -11263, -9473, -9727, -13313, -17663, -17665, -13311, -7937, -5119, -5121, -9215, -13057, -10495, -7681, +-5631, 1280, 8703, 11010, 11005, 10244, 10236, 10755, 13311, 14079, 12547, 14588, 16900, 14076, 8452, 3836, +-253, -3329, -1537, -767, -2305, 257, 4607, 3330, -1283, -3069, -4611, -4605, -259, 1795, 1533, 4355, +2301, -8701, -20227, -22526, -20226, -15613, -12035, -13053, -14339, -14591, -16382, -14851, -5374, 6143, 9472, 5378, +4092, 9476, 17916, 27140, 31998, 27136, 17664, 12801, 8190, 1539, -3, 3074, 5887, 3585, -1, -3584, +-6143, -6657, -5120, -7422, -13572, -15867, -13317, -9980, -8963, -11262, -16896, -19202, -15101, -7939, -3583, -2815, +-5889, -11520, -11263, -7937, -6400, -1023, 7423, 11776, 11266, 10236, 11269, 12539, 13316, 13566, 12288, 12289, +14590, 13315, 8444, 5125, 2043, -1532, -1795, -510, -2561, -2559, 1790, 4098, 767, -1280, -2559, -4354, +-2046, 1279, -256, 513, 2815, -3072, -15871, -22785, -21759, -18945, -15615, -15106, -16125, -13571, -12798, -14081, +-8704, 3584, 9984, 5888, 2815, 8195, 17147, 25862, 30458, 27909, 19964, 14083, 11006, 4610, -1283, 259, +4862, 5634, 1534, -2048, -5119, -6656, -4864, -6657, -12799, -16384, -14080, -10241, -7935, -9985, -16126, -20226, +-16895, -9472, -4865, -3838, -5378, -11007, -11775, -7939, -6396, -3844, 3843, 12031, 12543, 11010, 11774, 13058, +13310, 13057, 10240, 9472, 13313, 14845, 10499, 6143, 3840, -1536, -4608, -3584, -3584, -3071, 1278, 6146, +3839, -768, -3583, -6402, -4863, -1535, -259, 2565, 5370, 517, -11779, -22527, -25857, -23550, -18946, -14590, +-13570, -12799, -14081, -15102, -9474, 769, 7168, 6655, 5377, 9984, 17663, 23809, 29951, 29953, 23039, 17409, +12799, 5888, -256, -511, 4094, 6147, 2300, -1533, -4609, -5632, -4608, -6400, -14592, -18688, -15104, -11009, +-8958, -8706, -14078, -20994, -20735, -12801, -7678, -5891, -5628, -8453, -11004, -9475, -7421, -5635, 1282, 9982, +13314, 11263, 12033, 14078, 14082, 14334, 13570, 12543, 13056, 14848, 11776, 5888, 2305, -514, -2046, -1538, +-1791, -3071, 1022, 4866, 2558, -1534, -2050, -4094, -3842, 2, -2, 514, 4862, 2562, -10753, -22784, +-25087, -23042, -19197, -16644, -16379, -14596, -14334, -16385, -13313, -1276, 8955, 9988, 6397, 7425, 14593, 22527, +29183, 32002, 27134, 19713, 13056, 5375, -2047, -2048, 2815, 5377, 3072, 255, -2303, -7168, -7170, -5884, +-9989, -17403, -17156, -11518, -9729, -9216, -12031, -18177, -22015, -16129, -9216, -5888, -4607, -6146, -9981, -10499, +-8190, -6145, -512, 7680, 12544, 12801, 12543, 13312, 14337, 15357, 15109, 12796, 12290, 14078, 11778, 6143, +3329, -256, -2563, -764, -3, -2302, -1280, 4094, 4098, -256, -2306, -3325, -4611, -1278, 0, -1, +3074, 3325, -6397, -19715, -25084, -23812, -20477, -17666, -15872, -15358, -14851, -15613, -15619, -5630, 7679, 12545, +8704, 6655, 11521, 18174, 24579, 31230, 29953, 22016, 14335, 8193, 1535, -4095, -769, 5890, 6142, 1792, +-2046, -5379, -7677, -6402, -7936, -14079, -17408, -13825, -9983, -9217, -11264, -17406, -21507, -18174, -10753, -6144, +-4095, -4609, -9471, -10753, -8191, -7681, -3327, 6144, 12287, 13314, 13310, 14594, 14846, 14082, 14846, 12033, +9984, 12032, 12800, 7936, 3839, 1281, -1281, -1279, -1, -2303, -3585, 1537, 5631, 2560, -767, -3073, +-4607, -4096, -2562, -2301, 254, 4097, -769, -14079, -23809, -27135, -25089, -20224, -16895, -13057, -12288, -13055, +-14337, -9471, 4094, 12290, 11263, 7936, 9473, 15871, 21759, 27907, 31740, 26116, 17405, 8961, 3072, -2816, +-3072, 3584, 7167, 3073, -2304, -6144, -7681, -7934, -8451, -12796, -17412, -14844, -11524, -9469, -8962, -14590, +-21506, -21502, -14849, -8961, -5374, -3074, -5630, -9217, -7425, -7165, -6404, 1540, 10493, 14081, 12801, 14078, +16642, 15615, 14336, 12800, 9729, 10238, 12802, 9470, 3842, 1279, 1, -1025, -257, -765, -3076, -507, +4604, 3074, -258, -2046, -3841, -5119, -3329, -2304, -512, 3840, 1536, -9984, -22271, -27138, -27134, -23298, +-18430, -15105, -11776, -11263, -12546, -11773, -1283, 11266, 12800, 7935, 8193, 14847, 21760, 27650, 30461, 26883, +18429, 11779, 6397, -510, -3840, 766, 5380, 3323, -1531, -5380, -8445, -7938, -6399, -9984, -16640, -17152, +-12800, -9729, -9214, -12034, -19198, -23042, -17151, -9984, -6144, -3841, -4095, -8448, -8705, -6142, -6147, -510, +8192, 13567, 13569, 13312, 15615, 15874, 14845, 13315, 11263, 10240, 12543, 11009, 4863, 2050, -2, -2559, +-770, -253, -2562, -2048, 3586, 5373, 771, -2818, -4351, -4609, -2814, -3075, -2301, 2045, 3587, -5123, +-18430, -25857, -27392, -25599, -20737, -15360, -11007, -11778, -14589, -12547, -3581, 7933, 13314, 10495, 9729, 14591, +19458, 22524, 28165, 30204, 24579, 15102, 7681, 1279, -4862, -2818, 4609, 5631, 1, -3585, -5374, -7939, +-7165, -8962, -15103, -17920, -14081, -10239, -8448, -10496, -16896, -22528, -19969, -12542, -8451, -4348, -3588, -5884, +-7428, -6397, -6657, -3585, 5378, 11775, 13567, 13571, 15357, 16641, 14593, 14846, 13570, 10752, 10750, 10754, +6399, 2048, 257, -1794, -1534, 767, -512, -2048, 2047, 5890, 1535, -3073, -4093, -3845, -3835, -2307, +-2559, 257, 3326, -1279, -15616, -26880, -27648, -25088, -19968, -16897, -13822, -12035, -12284, -12292, -8445, 4606, +16385, 16385, 10494, 10498, 16637, 22788, 28668, 31237, 25851, 16643, 9215, 3327, -3838, -5377, 1536, 5120, +1536, -3072, -6143, -8706, -8958, -8706, -13054, -18433, -17152, -12032, -8960, -8960, -14849, -23294, -24578, -17151, +-9728, -5633, -1535, -2560, -6913, -6911, -5888, -5633, 514, 11006, 15616, 14850, 16125, 18691, 18430, 17665, +15103, 8962, 7166, 9218, 7933, 3843, 1790, 1025, -512, 511, -767, -4352, -2305, 4097, 4864, 255, +-1535, -3328, -5121, -5118, -5123, -3326, 2048, 254, -10237, -21763, -28159, -29950, -28419, -21246, -15616, -12034, +-11004, -11012, -8189, 1278, 12802, 15358, 11522, 11774, 16897, 21504, 27392, 31743, 29185, 19712, 12287, 7169, +-1537, -7167, -2305, 4866, 4349, -1533, -5378, -8191, -8704, -7681, -12286, -18947, -18429, -13058, -9983, -9216, +-12033, -20223, -26369, -20991, -12033, -7679, -4097, -3071, -5633, -5631, -4097, -5118, -515, 9219, 15101, 14851, +14846, 18689, 19455, 17152, 13569, 9983, 8448, 10753, 10239, 4609, 1023, 257, -2050, -2044, -773, -2299, +-1796, 5122, 7424, 1278, -4349, -5635, -6653, -5635, -4350, -3329, 1792, 4609, -5121, -21247, -29954, -31741, +-28676, -21755, -14853, -11261, -11265, -12287, -11777, -4351, 9214, 17411, 16126, 12545, 14848, 20991, 24833, 28927, +30721, 24576, 15359, 6145, -770, -6910, -4864, 3583, 5121, -769, -5887, -7682, -8957, -9475, -10748, -16389, +-18684, -14595, -11262, -8704, -9474, -17405, -25602, -24320, -16126, -10499, -5885, -1795, -2557, -5634, -5886, -6147, +-3838, 4351, 13057, 15359, 14338, 16125, 18947, 16893, 15874, 13568, 10495, 9218, 9214, 4353, -1, -511, +-768, 0, 1536, -1, -1791, 1536, 4351, 770, -4098, -3839, -3841, -4095, -2817, -4606, -3330, 257, +-4609, -16896, -26879, -28672, -27393, -24062, -19203, -15869, -14594, -14591, -12032, -4865, 9218, 19710, 18178, 11517, +11523, 18431, 23551, 28162, 31485, 27395, 17406, 7937, 768, -5889, -7423, 255, 5633, 1535, -5118, -9219, +-9981, -10499, -9469, -13314, -18943, -17921, -12800, -8703, -8705, -15871, -25089, -27904, -19711, -10754, -6141, -1539, +-1277, -4867, -5117, -5635, -5373, 1534, 11777, 15359, 13825, 16640, 21248, 20223, 17922, 15101, 8963, 5375, +6911, 5890, 1277, 259, 1533, 259, 509, -254, -4353, -1792, 4352, 5888, 1, -3586, -3326, -3842, +-5374, -6913, -5887, 254, 258, -11265, -23552, -30207, -30210, -27390, -22786, -18430, -13313, -12288, -12544, -8704, +3840, 17665, 19966, 14082, 11519, 17920, 23297, 25086, 29186, 30975, 24064, 13569, 5118, -3069, -8196, -2812, +5629, 5122, -2049, -6655, -7938, -8957, -9475, -13822, -19713, -20223, -13824, -9985, -8703, -11265, -20479, -27649, +-23551, -15106, -10493, -6402, -2816, -3071, -3330, -2558, -4865, -2303, 7167, 14337, 15103, 14848, 18946, 21756, +19205, 15356, 11266, 7936, 8703, 8193, 2815, 1, 0, -257, -254, 765, -1533, -1282, 3841, 6655, +1025, -3585, -4863, -5632, -5634, -5629, -5379, 2, 2304, -5121, -19711, -28417, -31231, -28672, -23296, -18433, +-15614, -13058, -11006, -7938, -1534, 10749, 20740, 19452, 12803, 13054, 20994, 27133, 29443, 29950, 24320, 15106, +6910, 769, -6912, -7169, 1281, 5119, -1023, -7168, -8193, -9470, -9730, -11519, -16896, -19969, -16383, -10495, +-7682, -8446, -15362, -27135, -28416, -18688, -11008, -6656, -1792, -768, -2816, -4352, -4351, -3586, 2818, 12287, +15872, 15105, 17407, 20992, 20737, 18430, 14083, 8700, 6404, 7165, 4098, 766, 1026, 1023, 512, 1280, +-768, -3584, -256, 4608, 4096, 1, -2818, -3839, -5632, -6144, -6399, -5634, 258, -1026, -13055, -25087, +-30210, -30718, -28418, -21503, -15872, -11776, -12032, -11777, -5886, 5118, 17409, 21248, 16384, 15360, 20224, 23808, +25855, 28418, 28926, 20737, 9985, 3325, -3581, -7170, -2559, 4608, 2815, -4607, -9472, -9728, -9984, -9729, +-13311, -19200, -18944, -12544, -8704, -8961, -11774, -22273, -29440, -24064, -14848, -9472, -3839, -2, -509, -1539, +-2301, -4611, -1535, 7681, 13567, 14592, 16897, 20478, 21506, 19711, 15872, 10241, 6910, 7683, 6396, 1029, +-773, 259, -1, 768, 2049, -1025, -2048, 3584, 6400, 769, -4097, -4351, -4353, -5119, -6145, -6655, +-2816, 766, -6908, -21252, -28925, -29698, -29440, -24319, -16896, -12288, -10496, -12802, -9981, -515, 13572, 23036, +22018, 17663, 17921, 20991, 22528, 23810, 26877, 26115, 17662, 7680, -1022, -8193, -7169, 2, 4606, 2, +-5890, -8446, -9986, -11262, -12801, -17664, -19968, -16128, -9728, -7423, -8450, -15614, -26627, -26620, -17668, -12797, +-8706, -1024, 1794, 1022, -256, -2302, -3331, 3075, 12285, 14850, 15872, 19199, 22273, 21758, 18435, 13821, +8195, 6909, 7171, 3325, -509, -770, 769, 512, 2303, 1025, -2561, -510, 4861, 3588, -1028, -2558, +-3327, -4611, -6909, -9474, -7935, -512, 0, -12032, -25088, -30465, -30719, -29441, -20990, -13058, -10495, -10753, +-9984, -4606, 4604, 18949, 26619, 22276, 17661, 18690, 20479, 22785, 27647, 29696, 22528, 11521, 1535, -4094, +-7171, -3325, 3581, 3331, -3586, -8191, -10752, -11521, -11263, -13313, -17919, -19201, -13822, -8964, -6139, -9221, +-18684, -28418, -26112, -17919, -10752, -2562, 2563, 2301, 1026, -256, -3074, -2558, 6398, 13826, 15103, 16129, +20734, 22786, 20991, 17408, 12289, 6654, 5635, 4605, -254, -1538, 258, 767, 1024, 2816, 0, -3327, +1279, 5121, 1022, -2302, -1025, -1023, -4865, -8192, -9727, -5634, 259, -4612, -18172, -25859, -28158, -29186, +-27134, -18178, -11774, -9474, -8958, -7426, -511, 11520, 24319, 25090, 18943, 18687, 23553, 25087, 24321, 24320, +23296, 18175, 9473, 767, -5887, -6912, -1537, 4352, 2049, -6401, -11519, -11010, -10750, -12546, -16125, -19459, +-17918, -10754, -6398, -7425, -13824, -24318, -28419, -20734, -13313, -8191, -2305, 1793, 3839, 3073, -256, -3841, +1024, 9985, 15359, 16896, 19201, 24063, 25600, 20737, 13822, 7937, 6146, 6140, 4356, 1277, 1026, 1535, +769, 767, 512, -2815, -3841, 3585, 6399, 769, -1281, -767, -4610, -11005, -12547, -10749, -4867, 2306, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +97, 576, 1650, 3022, 5013, 7006, 8581, 9209, 8528, 6303, 2484, -2622, -8404, -14079, -18671, -21609, +-22337, -20472, -16053, -9330, -997, 8096, 16718, 23671, 27915, 28832, 25818, 19255, 9863, -983, -11811, -20995, +-27168, -29396, -27244, -20939, -11106, 619, 12521, 22648, 29280, 31181, 27992, 19995, 8700, -4266, -16594, -26315, +-31665, -31701, -26391, -16693, -4003, 9610, 21568, 29884, 32683, 30065, 22136, 10212, -3252, -15875, -25398, -30089, +-29156, -22859, -12408, 217, 12724, 22573, 27988, 27602, 21809, 11834, -633, -12583, -22000, -27144, -26922, -21451, +-12059, -301, 11487, 20709, 25585, 25166, 19776, 10569, -783, -11644, -19628, -23505, -22471, -16968, -7791, 2920, +12723, 19626, 22152, 19796, 12982, 3374, -7105, -16028, -21467, -22496, -18537, -10791, -646, 9722, 17846, 22310, +21710, 16353, 7334, -3250, -13035, -19941, -22610, -20491, -14027, -4631, 5675, 14575, 20174, 21241, 17566, 10044, +654, -8566, -15547, -18648, -17481, -12351, -4531, 4245, 11799, 16281, 16896, 13320, 6655, -1560, -9265, -14540, +-16358, -14283, -8777, -1192, 6665, 12849, 15949, 15169, 10659, 3543, -4446, -11381, -15798, -16568, -13500, -7360, +435, 8059, 13904, 16529, 15267, 10545, 3423, -4341, -11105, -15270, -15904, -12977, -7152, 176, 7370, 12860, +15435, 14452, 10349, 4038, -2969, -9024, -12889, -13739, -11483, -6800, -746, 5292, 10012, 12267, 11664, 8499, +3584, -1919, -6766, -9829, -10593, -8910, -5303, -635, 3961, 7427, 9040, 8440, 5855, 1971, -2264, -5851, +-7955, -8165, -6404, -3203, 702, 4363, 7013, 8029, 7223, 4836, 1333, -2450, -5679, -7612, -7894, -6520, +-3702, -158, 3413, 6259, 7827, 7792, 6265, 3610, 383, -2699, -5002, -6141, -5927, -4535, -2368, 187, +2393, 3940, 4499, 4037, 2731, 998, -777, -2154, -2839, -2698, -1840, -547, 848, 1980, 2529, 2312, +1438, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, +}; +struct tsf _tsf = { + .presets = presets, + .shortSamples = shortSamples, + .samplesNum = 154225, + .voices = NULL, + .channels = NULL, + .presetNum = 130, + .voiceNum = 0, + .maxVoiceNum = 0, + .voicePlayIndex = 0, + .outputmode = TSF_STEREO_INTERLEAVED, + .outSampleRate = 44100, + .globalGainDB = 0, + .refCount = NULL, +}; diff --git a/src/libtinysoundfont/tsf.h b/src/libtinysoundfont/tsf.h index be47f663..04edfab9 100644 --- a/src/libtinysoundfont/tsf.h +++ b/src/libtinysoundfont/tsf.h @@ -1,2143 +1,2557 @@ -/* TinySoundFont - v0.8 - SoundFont2 synthesizer - https://github.com/schellingb/TinySoundFont - no warranty implied; use at your own risk - Do this: - #define TSF_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - // i.e. it should look like this: - #include ... - #include ... - #define TSF_IMPLEMENTATION - #include "tsf.h" - - [OPTIONAL] #define TSF_NO_STDIO to remove stdio dependency - [OPTIONAL] #define TSF_MALLOC, TSF_REALLOC, and TSF_FREE to avoid stdlib.h - [OPTIONAL] #define TSF_MEMCPY, TSF_MEMSET to avoid string.h - [OPTIONAL] #define TSF_POW, TSF_POWF, TSF_EXPF, TSF_LOG, TSF_TAN, TSF_LOG10, TSF_SQRT to avoid math.h - - NOT YET IMPLEMENTED - - Support for ChorusEffectsSend and ReverbEffectsSend generators - - Better low-pass filter without lowering performance too much - - Support for modulators - - LICENSE (MIT) - - Copyright (C) 2017, 2018 Bernhard Schelling - Based on SFZero, Copyright (C) 2012 Steve Folta (https://github.com/stevefolta/SFZero) - - 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 TSF_INCLUDE_TSF_INL -#define TSF_INCLUDE_TSF_INL - -#ifdef __cplusplus -extern "C" { -# define CPP_DEFAULT0 = 0 -#else -# define CPP_DEFAULT0 -#endif - -//define this if you want the API functions to be static -#ifdef TSF_STATIC -#define TSFDEF static -#else -#define TSFDEF extern -#endif - -// The load functions will return a pointer to a struct tsf which all functions -// thereafter take as the first parameter. -// On error the tsf_load* functions will return NULL most likely due to invalid -// data (or if the file did not exist in tsf_load_filename). -typedef struct tsf tsf; - -#ifndef TSF_NO_STDIO -// Directly load a SoundFont from a .sf2 file path -TSFDEF tsf* tsf_load_filename(const char* filename); -#endif - -// Load a SoundFont from a block of memory -TSFDEF tsf* tsf_load_memory(const void* buffer, int size); - -// Stream structure for the generic loading -struct tsf_stream -{ - // Custom data given to the functions as the first parameter - void* data; - - // Function pointer will be called to read 'size' bytes into ptr (returns number of read bytes) - int (*read)(void* data, void* ptr, unsigned int size); - - // Function pointer will be called to skip ahead over 'count' bytes - int (*tell)(void* data); - - // Function pointer will be called to skip ahead over 'count' bytes (returns 1 on success, 0 on error) - int (*skip)(void* data, unsigned int count); - - // Function pointer will be called to seek to absolute position - int (*seek)(void* data, unsigned int pos); - - // Function pointer will be called to skip ahead over 'count' bytes - int (*close)(void* data); - - // Function pointer will be called to skip ahead over 'count' bytes - int (*size)(void* data); -}; - -// Generic SoundFont loading method using the stream structure above -TSFDEF tsf* tsf_load(struct tsf_stream* stream); - -// Free the memory related to this tsf instance -TSFDEF void tsf_close(tsf* f); - -// Stop all playing notes immediatly and reset all channel parameters -TSFDEF void tsf_reset(tsf* f); - -// Returns the preset index from a bank and preset number, or -1 if it does not exist in the loaded SoundFont -TSFDEF int tsf_get_presetindex(const tsf* f, int bank, int preset_number); - -// Returns the number of presets in the loaded SoundFont -TSFDEF int tsf_get_presetcount(const tsf* f); - -// Returns the name of a preset index >= 0 and < tsf_get_presetcount() -TSFDEF const char* tsf_get_presetname(const tsf* f, int preset_index); - -// Returns the name of a preset by bank and preset number -TSFDEF const char* tsf_bank_get_presetname(const tsf* f, int bank, int preset_number); - -// Supported output modes by the render methods -enum TSFOutputMode -{ - // Two channels with single left/right samples one after another - TSF_STEREO_INTERLEAVED, - // Two channels with all samples for the left channel first then right - TSF_STEREO_UNWEAVED, - // A single channel (stereo instruments are mixed into center) - TSF_MONO -}; - -// Thread safety: -// Your audio output which calls the tsf_render* functions will most likely -// run on a different thread than where the playback tsf_note* functions -// are called. In which case some sort of concurrency control like a -// mutex needs to be used so they are not called at the same time. - -// Setup the parameters for the voice render methods -// outputmode: if mono or stereo and how stereo channel data is ordered -// samplerate: the number of samples per second (output frequency) -// global_gain_db: volume gain in decibels (>0 means higher, <0 means lower) -TSFDEF void tsf_set_output(tsf* f, enum TSFOutputMode outputmode, int samplerate, float global_gain_db CPP_DEFAULT0); - -// Start playing a note -// preset_index: preset index >= 0 and < tsf_get_presetcount() -// key: note value between 0 and 127 (60 being middle C) -// vel: velocity as a float between 0.0 (equal to note off) and 1.0 (full) -// bank: instrument bank number (alternative to preset_index) -// preset_number: preset number (alternative to preset_index) -// (bank_note_on returns 0 if preset does not exist, otherwise 1) -TSFDEF void tsf_note_on(tsf* f, int preset_index, int key, float vel); -TSFDEF int tsf_bank_note_on(tsf* f, int bank, int preset_number, int key, float vel); - -// Stop playing a note -// (bank_note_off returns 0 if preset does not exist, otherwise 1) -TSFDEF void tsf_note_off(tsf* f, int preset_index, int key); -TSFDEF int tsf_bank_note_off(tsf* f, int bank, int preset_number, int key); - -// Stop playing all notes (end with sustain and release) -TSFDEF void tsf_note_off_all(tsf* f); - -// Returns the number of active voices -TSFDEF int tsf_active_voice_count(tsf* f); - -// Render output samples into a buffer -// You can either render as signed 16-bit values (tsf_render_short) or -// as 32-bit float values (tsf_render_float) -// buffer: target buffer of size samples * output_channels * sizeof(type) -// samples: number of samples to render -// flag_mixing: if 0 clear the buffer first, otherwise mix into existing data -TSFDEF void tsf_render_short(tsf* f, short* buffer, int samples, int flag_mixing CPP_DEFAULT0); -TSFDEF void tsf_render_float(tsf* f, float* buffer, int samples, int flag_mixing CPP_DEFAULT0); - -// Higher level channel based functions, set up channel parameters -// channel: channel number -// preset_index: preset index >= 0 and < tsf_get_presetcount() -// preset_number: preset number (alternative to preset_index) -// flag_mididrums: 0 for normal channels, otherwise apply MIDI drum channel rules -// bank: instrument bank number (alternative to preset_index) -// pan: stereo panning value from 0.0 (left) to 1.0 (right) (default 0.5 center) -// volume: linear volume scale factor (default 1.0 full) -// pitch_wheel: pitch wheel position 0 to 16383 (default 8192 unpitched) -// pitch_range: range of the pitch wheel in semitones (default 2.0, total +/- 2 semitones) -// tuning: tuning of all playing voices in semitones (default 0.0, standard (A440) tuning) -// (set_preset_number and set_bank_preset return 0 if preset does not exist, otherwise 1) -TSFDEF void tsf_channel_set_presetindex(tsf* f, int channel, int preset_index); -TSFDEF int tsf_channel_set_presetnumber(tsf* f, int channel, int preset_number, int flag_mididrums CPP_DEFAULT0); -TSFDEF void tsf_channel_set_bank(tsf* f, int channel, int bank); -TSFDEF int tsf_channel_set_bank_preset(tsf* f, int channel, int bank, int preset_number); -TSFDEF void tsf_channel_set_pan(tsf* f, int channel, float pan); -TSFDEF void tsf_channel_set_volume(tsf* f, int channel, float volume); -TSFDEF void tsf_channel_set_pitchwheel(tsf* f, int channel, int pitch_wheel); -TSFDEF void tsf_channel_set_pitchrange(tsf* f, int channel, float pitch_range); -TSFDEF void tsf_channel_set_tuning(tsf* f, int channel, float tuning); - -// Start or stop playing notes on a channel (needs channel preset to be set) -// channel: channel number -// key: note value between 0 and 127 (60 being middle C) -// vel: velocity as a float between 0.0 (equal to note off) and 1.0 (full) -TSFDEF void tsf_channel_note_on(tsf* f, int channel, int key, float vel); -TSFDEF void tsf_channel_note_off(tsf* f, int channel, int key); -TSFDEF void tsf_channel_note_off_all(tsf* f, int channel); //end with sustain and release -TSFDEF void tsf_channel_sounds_off_all(tsf* f, int channel); //end immediatly - -// Apply a MIDI control change to the channel (not all controllers are supported!) -TSFDEF void tsf_channel_midi_control(tsf* f, int channel, int controller, int control_value); - -// Get current values set on the channels -TSFDEF int tsf_channel_get_preset_index(tsf* f, int channel); -TSFDEF int tsf_channel_get_preset_bank(tsf* f, int channel); -TSFDEF int tsf_channel_get_preset_number(tsf* f, int channel); -TSFDEF float tsf_channel_get_pan(tsf* f, int channel); -TSFDEF float tsf_channel_get_volume(tsf* f, int channel); -TSFDEF int tsf_channel_get_pitchwheel(tsf* f, int channel); -TSFDEF float tsf_channel_get_pitchrange(tsf* f, int channel); -TSFDEF float tsf_channel_get_tuning(tsf* f, int channel); - -#ifdef __cplusplus -# undef CPP_DEFAULT0 -} -#endif - -// end header -// --------------------------------------------------------------------------------------------------------- -#endif //TSF_INCLUDE_TSF_INL - -#ifdef TSF_IMPLEMENTATION - -// The lower this block size is the more accurate the effects are. -// Increasing the value significantly lowers the CPU usage of the voice rendering. -// If LFO affects the low-pass filter it can be hearable even as low as 8. -#ifndef TSF_RENDER_EFFECTSAMPLEBLOCK -#define TSF_RENDER_EFFECTSAMPLEBLOCK 64 -#endif - -// Grace release time for quick voice off (avoid clicking noise) -#define TSF_FASTRELEASETIME 0.01f -#if !defined(TSF_MALLOC) || !defined(TSF_FREE) || !defined(TSF_REALLOC) -# include -# define TSF_MALLOC malloc -# define TSF_FREE free -# define TSF_REALLOC realloc -#endif - -#if !defined(TSF_MEMCPY) || !defined(TSF_MEMSET) -# include -# define TSF_MEMCPY memcpy -# define TSF_MEMSET memset -#endif - -#if !defined(TSF_POW) || !defined(TSF_POWF) || !defined(TSF_EXPF) || !defined(TSF_LOG) || !defined(TSF_TAN) || !defined(TSF_LOG10) || !defined(TSF_SQRT) -# include -# if !defined(__cplusplus) && !defined(NAN) && !defined(powf) && !defined(expf) && !defined(sqrtf) -# define powf (float)pow // deal with old math.h -# define expf (float)exp // files that come without -# define sqrtf (float)sqrt // powf, expf and sqrtf -# endif -# define TSF_POW pow -# define TSF_POWF powf -# define TSF_EXPF expf -# define TSF_LOG log -# define TSF_TAN tan -# define TSF_LOG10 log10 -# define TSF_SQRTF sqrtf -#endif - -#ifndef TSF_NO_STDIO -# include -#endif - -#define TSF_TRUE 1 -#define TSF_FALSE 0 -#define TSF_BOOL char -#define TSF_PI 3.14159265358979323846264338327950288 -#define TSF_NULL 0 - -#ifdef __cplusplus -extern "C" { -#endif - -typedef char tsf_fourcc[4]; -typedef signed char tsf_s8; -typedef unsigned char tsf_u8; -typedef unsigned short tsf_u16; -typedef signed short tsf_s16; -typedef unsigned int tsf_u32; -typedef char tsf_char20[20]; - -#define TSF_FourCCEquals(value1, value2) (value1[0] == value2[0] && value1[1] == value2[1] && value1[2] == value2[2] && value1[3] == value2[3]) - -// Samples cache, number and sample count -#define TSF_BUFFS 16 -#define TSF_BUFFSIZE 512 - -struct tsf -{ - struct tsf_preset* presets; - struct tsf_voice* voices; - - unsigned int fontSamplesOffset; - unsigned int fontSampleCount; - struct tsf_channels* channels; - float* outputSamples; - - int presetNum; - int voiceNum; - int outputSampleSize; - unsigned int voicePlayIndex; - - enum TSFOutputMode outputmode; - float outSampleRate; - float globalGainDB; - - struct tsf_hydra *hydra; - - // Cached sample read - short *buffer[TSF_BUFFS]; - int offset[TSF_BUFFS]; - int timestamp[TSF_BUFFS]; - int epoch; -}; - -struct tsf_stream_cached_data { - int buffs; - int buffsize; - struct tsf_stream *stream; - unsigned int size, pos; - unsigned char **buffer; - unsigned int *offset; - unsigned int *timestamp; - unsigned int epoch; - unsigned int hit; - unsigned int miss; -}; - -static int tsf_stream_cached_read(void* v, void* ptr, unsigned int size) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - unsigned char *p = (unsigned char *)ptr; - - while (size) { - if (d->pos >= d->size) return 0; // EOF - for (int i=0; i < d->buffs; i++) { - if ((d->offset[i] <= d->pos) && ((d->offset[i] + d->buffsize) > d->pos) ) { - d->timestamp[i] = d->epoch++; - // Handle case of epoch rollover by just setting low, random epochs - if (d->epoch==0) { - for (int i=0; ibuffs; i++) d->timestamp[i] = d->epoch++; - } - unsigned int startOffset = d->pos - d->offset[i]; - unsigned int len = d->buffsize - (d->pos % d->buffsize); - if (len > size) len = size; - TSF_MEMCPY(p, &d->buffer[i][startOffset], len); - size -= len; - d->pos += len; - p += len; - d->hit++; - if (size == 0) return 1; - i = -1; // Restart the for() at block 0 after postincrement - } - } - - int repl = 0; - for (int i=1; i < d->buffs; i++) { - if (d->timestamp[i] < d->timestamp[repl]) repl = i; - } - int readOff = d->pos - (d->pos % d->buffsize); - d->stream->seek(d->stream->data, readOff); - d->stream->read(d->stream->data, d->buffer[repl], d->buffsize); - d->timestamp[repl] = d->epoch++; - d->offset[repl] = readOff; - d->miss++; - d->hit--; // Avoid counting this as a hit on next loop that returns data - // Don't actually do anything yet, we'll retry the search on next loop where it will notice new data - } - return 1; -} - -static int tsf_stream_cached_tell(void* v) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - return d->pos; -} - -static int tsf_stream_cached_size(void* v) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - return d->size; -} - -static int tsf_stream_cached_skip(void* v, unsigned int count) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - if ((d->pos + count) < d->size) { - d->pos += count; - return 1; - } - return 0; -} - -static int tsf_stream_cached_seek(void* v, unsigned int pos) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - if (pos < d->size) { - d->pos = pos; - return 1; - } - return 0; -} - -static int tsf_stream_cached_close(void* v) -{ - struct tsf_stream_cached_data *d = (struct tsf_stream_cached_data*)v; - free(d->timestamp); - free(d->offset); - for (int i = d->buffs - 1; i >=0; i--) free(d->buffer[i]); - free(d->buffer); - int ret = d->stream->close(d->stream->data); - free(d); - return ret; -} - -/* Wraps an existing stream with a caching layer. First create the stream you need, then - call this to create a new stream. Use this new stream only, and when done close() will - close both this stream as well as the wrapped one. */ -TSFDEF struct tsf_stream *tsf_stream_wrap_cached(struct tsf_stream *stream, int buffs, int buffsize, struct tsf_stream *dest) -{ - struct tsf_stream_cached_data *s = (struct tsf_stream_cached_data*)TSF_MALLOC(sizeof(*s)); - s->buffs = buffs; - s->buffsize = buffsize; - s->stream = stream; - s->size = stream->size(stream->data); - s->pos = stream->tell(stream->data); - s->buffer = (unsigned char **)TSF_MALLOC(sizeof(*s->buffer) * buffs); - s->offset = (unsigned int *)TSF_MALLOC(sizeof(s->offset) * buffs); - s->timestamp = (unsigned int *)TSF_MALLOC(sizeof(s->timestamp) * buffs); - s->epoch = 0; - s->hit = 0; - s->miss = 0; - for (int i=0; ibuffer[i] = (unsigned char *)TSF_MALLOC(buffsize); - s->offset[i] = 0xfffffff; - s->timestamp[i] = 0; - } - dest->data = (void*)s; - dest->read = &tsf_stream_cached_read; - dest->tell = &tsf_stream_cached_tell; - dest->skip = &tsf_stream_cached_skip; - dest->seek = &tsf_stream_cached_seek; - dest->size = &tsf_stream_cached_size; - dest->close = &tsf_stream_cached_close; - return dest; -} - - -#ifndef TSF_NO_STDIO -static int tsf_stream_stdio_read(FILE* f, void* ptr, unsigned int size) { return (int)fread(ptr, 1, size, f); } -static int tsf_stream_stdio_tell(FILE* f) { return ftell(f); } -static int tsf_stream_stdio_size(FILE* f) { int p = ftell(f); fseek(f, 0, SEEK_END); int e = ftell(f); fseek(f, p, SEEK_SET); return e; } -static int tsf_stream_stdio_skip(FILE* f, unsigned int count) { return !fseek(f, count, SEEK_CUR); } -static int tsf_stream_stdio_seek(FILE* f, unsigned int count) { return !fseek(f, count, SEEK_SET); } -static int tsf_stream_stdio_close(FILE* f) { return !fclose(f); } -TSFDEF tsf* tsf_load_filename(const char* filename) -{ - tsf* res; - struct tsf_stream stream = { TSF_NULL, (int(*)(void*,void*,unsigned int))&tsf_stream_stdio_read, (int(*)(void*))&tsf_stream_stdio_tell, (int(*)(void*,unsigned int))&tsf_stream_stdio_skip, (int(*)(void*,unsigned int))&tsf_stream_stdio_seek, (int(*)(void*))&tsf_stream_stdio_close, (int(*)(void*))&tsf_stream_stdio_size }; - #if __STDC_WANT_SECURE_LIB__ - FILE* f = TSF_NULL; fopen_s(&f, filename, "rb"); - #else - FILE* f = fopen(filename, "rb"); - #endif - if (!f) - { - //if (e) *e = TSF_FILENOTFOUND; - return TSF_NULL; - } - stream.data = f; - res = tsf_load(&stream); - //fclose(f); - return res; -} -#endif - -struct tsf_stream_memory { const char* buffer; unsigned int total, pos; }; -static int tsf_stream_memory_read(struct tsf_stream_memory* m, void* ptr, unsigned int size) { if (size > m->total - m->pos) size = m->total - m->pos; TSF_MEMCPY(ptr, m->buffer+m->pos, size); m->pos += size; return size; } -static int tsf_stream_memory_tell(struct tsf_stream_memory* m) { return m->pos; } -static int tsf_stream_memory_size(struct tsf_stream_memory* m) { return m->total; } -static int tsf_stream_memory_skip(struct tsf_stream_memory* m, unsigned int count) { if (m->pos + count > m->total) return 0; m->pos += count; return 1; } -static int tsf_stream_memory_seek(struct tsf_stream_memory* m, unsigned int pos) { if (pos > m->total) return 0; else m->pos = pos; return 1; } -static int tsf_stream_memory_close(struct tsf_stream_memory* m) { (void)m; return 1; } -TSFDEF tsf* tsf_load_memory(const void* buffer, int size) -{ - struct tsf_stream stream = { TSF_NULL, (int(*)(void*,void*,unsigned int))&tsf_stream_memory_read, (int(*)(void*))&tsf_stream_memory_tell, (int(*)(void*,unsigned int))&tsf_stream_memory_skip, (int(*)(void*,unsigned int))&tsf_stream_memory_seek, (int(*)(void*))&tsf_stream_memory_close, (int(*)(void*))&tsf_stream_memory_size }; - struct tsf_stream_memory f = { 0, 0, 0 }; - f.buffer = (const char*)buffer; - f.total = size; - stream.data = &f; - return tsf_load(&stream); -} - -enum { TSF_LOOPMODE_NONE, TSF_LOOPMODE_CONTINUOUS, TSF_LOOPMODE_SUSTAIN }; - -enum { TSF_SEGMENT_NONE, TSF_SEGMENT_DELAY, TSF_SEGMENT_ATTACK, TSF_SEGMENT_HOLD, TSF_SEGMENT_DECAY, TSF_SEGMENT_SUSTAIN, TSF_SEGMENT_RELEASE, TSF_SEGMENT_DONE }; - -struct tsf_hydra -{ - struct tsf_stream *stream; - int phdrOffset, pbagOffset, pmodOffset, pgenOffset, instOffset, ibagOffset, imodOffset, igenOffset, shdrOffset; - int phdrNum, pbagNum, pmodNum, pgenNum, instNum, ibagNum, imodNum, igenNum, shdrNum; -}; - -union tsf_hydra_genamount { struct { tsf_u8 lo, hi; } range; tsf_s16 shortAmount; tsf_u16 wordAmount; }; -struct tsf_hydra_phdr { tsf_char20 presetName; tsf_u16 preset, bank, presetBagNdx; tsf_u32 library, genre, morphology; }; -struct tsf_hydra_pbag { tsf_u16 genNdx, modNdx; }; -struct tsf_hydra_pmod { tsf_u16 modSrcOper, modDestOper; tsf_s16 modAmount; tsf_u16 modAmtSrcOper, modTransOper; }; -struct tsf_hydra_pgen { tsf_u16 genOper; union tsf_hydra_genamount genAmount; }; -struct tsf_hydra_inst { tsf_char20 instName; tsf_u16 instBagNdx; }; -struct tsf_hydra_ibag { tsf_u16 instGenNdx, instModNdx; }; -struct tsf_hydra_imod { tsf_u16 modSrcOper, modDestOper; tsf_s16 modAmount; tsf_u16 modAmtSrcOper, modTransOper; }; -struct tsf_hydra_igen { tsf_u16 genOper; union tsf_hydra_genamount genAmount; }; -struct tsf_hydra_shdr { tsf_char20 sampleName; tsf_u32 start, end, startLoop, endLoop, sampleRate; tsf_u8 originalPitch; tsf_s8 pitchCorrection; tsf_u16 sampleLink, sampleType; }; - -#define TSFR(FIELD) stream->read(stream->data, &i->FIELD, sizeof(i->FIELD)); -static void tsf_hydra_read_phdr(struct tsf_hydra_phdr* i, struct tsf_stream* stream) { TSFR(presetName) TSFR(preset) TSFR(bank) TSFR(presetBagNdx) TSFR(library) TSFR(genre) TSFR(morphology) } -static void tsf_hydra_read_pbag(struct tsf_hydra_pbag* i, struct tsf_stream* stream) { TSFR(genNdx) TSFR(modNdx) } -//static void tsf_hydra_read_pmod(struct tsf_hydra_pmod* i, struct tsf_stream* stream) { TSFR(modSrcOper) TSFR(modDestOper) TSFR(modAmount) TSFR(modAmtSrcOper) TSFR(modTransOper) } -static void tsf_hydra_read_pgen(struct tsf_hydra_pgen* i, struct tsf_stream* stream) { TSFR(genOper) TSFR(genAmount) } -static void tsf_hydra_read_inst(struct tsf_hydra_inst* i, struct tsf_stream* stream) { TSFR(instName) TSFR(instBagNdx) } -static void tsf_hydra_read_ibag(struct tsf_hydra_ibag* i, struct tsf_stream* stream) { TSFR(instGenNdx) TSFR(instModNdx) } -//static void tsf_hydra_read_imod(struct tsf_hydra_imod* i, struct tsf_stream* stream) { TSFR(modSrcOper) TSFR(modDestOper) TSFR(modAmount) TSFR(modAmtSrcOper) TSFR(modTransOper) } -static void tsf_hydra_read_igen(struct tsf_hydra_igen* i, struct tsf_stream* stream) { TSFR(genOper) TSFR(genAmount) } -static void tsf_hydra_read_shdr(struct tsf_hydra_shdr* i, struct tsf_stream* stream) { TSFR(sampleName) TSFR(start) TSFR(end) TSFR(startLoop) TSFR(endLoop) TSFR(sampleRate) TSFR(originalPitch) TSFR(pitchCorrection) TSFR(sampleLink) TSFR(sampleType) } -#undef TSFR -enum -{ - phdrSizeInFile = 38, pbagSizeInFile = 4, pmodSizeInFile = 10, - pgenSizeInFile = 4, instSizeInFile = 22, ibagSizeInFile = 4, - imodSizeInFile = 10, igenSizeInFile = 4, shdrSizeInFile = 46 -}; - -#define TGET(TYPE) \ -static struct tsf_hydra_##TYPE *get_##TYPE(struct tsf_hydra *t, int idx, struct tsf_hydra_##TYPE *data) \ -{ \ - t->stream->seek(t->stream->data, t->TYPE##Offset + TYPE##SizeInFile * idx); \ - tsf_hydra_read_##TYPE(data, t->stream); \ - return data; \ -} - -TGET(phdr) -TGET(pbag) -//TGET(pmod) -TGET(pgen) -TGET(inst) -TGET(ibag) -//TGET(imod) -TGET(igen) -TGET(shdr) -#undef TGET - -typedef int64_t fixed32p32; -typedef int32_t fixed30p2; -typedef int32_t fixed24p8; -typedef int32_t fixed16p16; -typedef int32_t fixed8p24; - - - -struct tsf_riffchunk { tsf_fourcc id; tsf_u32 size; }; -struct tsf_envelope { float delay, attack, hold, decay, sustain, release, keynumToHold, keynumToDecay; }; -struct tsf_voice_envelope { float level, slope; int samplesUntilNextSegment; short segment, midiVelocity; struct tsf_envelope parameters; TSF_BOOL segmentIsExponential, isAmpEnv; }; -struct tsf_voice_lowpass { double QInv, a0, a1, b1, b2, z1, z2; TSF_BOOL active; }; -struct tsf_voice_lfo { int samplesUntil; float level, delta; }; - -struct tsf_region -{ - int loop_mode; - unsigned int sample_rate; - unsigned char lokey, hikey, lovel, hivel; - unsigned int group, offset, end, loop_start, loop_end; - int transpose, tune, pitch_keycenter, pitch_keytrack; - float attenuation, pan; - struct tsf_envelope ampenv, modenv; - int initialFilterQ, initialFilterFc; - int modEnvToPitch, modEnvToFilterFc, modLfoToFilterFc, modLfoToVolume; - float delayModLFO; - int freqModLFO, modLfoToPitch; - float delayVibLFO; - int freqVibLFO, vibLfoToPitch; -}; - -struct tsf_preset -{ - tsf_char20 presetName; - tsf_u16 preset, bank; - struct tsf_region* regions; - int regionNum; -}; - -struct tsf_voice -{ - int playingPreset, playingKey, playingChannel; - struct tsf_region* region; - double pitchInputTimecents, pitchOutputFactor; - double sourceSamplePosition; - fixed32p32 sourceSamplePositionF32P32; - float noteGainDB, panFactorLeft, panFactorRight; - unsigned int playIndex, loopStart, loopEnd; - struct tsf_voice_envelope ampenv, modenv; - struct tsf_voice_lowpass lowpass; - struct tsf_voice_lfo modlfo, viblfo; -}; - -struct tsf_channel -{ - unsigned short presetIndex, bank, pitchWheel, midiPan, midiVolume, midiExpression, midiRPN, midiData; - float panOffset, gainDB, pitchRange, tuning; -}; - -struct tsf_channels -{ - void (*setupVoice)(tsf* f, struct tsf_voice* voice); - struct tsf_channel* channels; - int channelNum, activeChannel; -}; - -static double tsf_timecents2Secsd(double timecents) { return TSF_POW(2.0, timecents / 1200.0); } -static float tsf_timecents2Secsf(float timecents) { return TSF_POWF(2.0f, timecents / 1200.0f); } -static float tsf_cents2Hertz(float cents) { return 8.176f * TSF_POWF(2.0f, cents / 1200.0f); } -static float tsf_decibelsToGain(float db) { return (db > -100.f ? TSF_POWF(10.0f, db * 0.05f) : 0); } -static float tsf_gainToDecibels(float gain) { return (gain <= .00001f ? -100.f : (float)(20.0 * TSF_LOG10(gain))); } - -static TSF_BOOL tsf_riffchunk_read(struct tsf_riffchunk* parent, struct tsf_riffchunk* chunk, struct tsf_stream* stream) -{ - TSF_BOOL IsRiff, IsList; - if (parent && sizeof(tsf_fourcc) + sizeof(tsf_u32) > parent->size) return TSF_FALSE; - if (!stream->read(stream->data, &chunk->id, sizeof(tsf_fourcc)) || *chunk->id <= ' ' || *chunk->id >= 'z') return TSF_FALSE; - if (!stream->read(stream->data, &chunk->size, sizeof(tsf_u32))) return TSF_FALSE; - if (parent && sizeof(tsf_fourcc) + sizeof(tsf_u32) + chunk->size > parent->size) return TSF_FALSE; - if (parent) parent->size -= sizeof(tsf_fourcc) + sizeof(tsf_u32) + chunk->size; - IsRiff = TSF_FourCCEquals(chunk->id, "RIFF"), IsList = TSF_FourCCEquals(chunk->id, "LIST"); - if (IsRiff && parent) return TSF_FALSE; //not allowed - if (!IsRiff && !IsList) return TSF_TRUE; //custom type without sub type - if (!stream->read(stream->data, &chunk->id, sizeof(tsf_fourcc)) || *chunk->id <= ' ' || *chunk->id >= 'z') return TSF_FALSE; - chunk->size -= sizeof(tsf_fourcc); - return TSF_TRUE; -} - -static void tsf_region_clear(struct tsf_region* i, TSF_BOOL for_relative) -{ - TSF_MEMSET(i, 0, sizeof(struct tsf_region)); - i->hikey = i->hivel = 127; - i->pitch_keycenter = 60; // C4 - if (for_relative) return; - - i->pitch_keytrack = 100; - - i->pitch_keycenter = -1; - - // SF2 defaults in timecents. - i->ampenv.delay = i->ampenv.attack = i->ampenv.hold = i->ampenv.decay = i->ampenv.release = -12000.0f; - i->modenv.delay = i->modenv.attack = i->modenv.hold = i->modenv.decay = i->modenv.release = -12000.0f; - - i->initialFilterFc = 13500; - - i->delayModLFO = -12000.0f; - i->delayVibLFO = -12000.0f; -} - -static void tsf_region_operator(struct tsf_region* region, tsf_u16 genOper, union tsf_hydra_genamount* amount, struct tsf_region* merge_region) -{ - enum - { - _GEN_TYPE_MASK = 0x0F, - GEN_FLOAT = 0x01, - GEN_INT = 0x02, - GEN_UINT_ADD = 0x03, - GEN_UINT_ADD15 = 0x04, - GEN_KEYRANGE = 0x05, - GEN_VELRANGE = 0x06, - GEN_LOOPMODE = 0x07, - GEN_GROUP = 0x08, - GEN_KEYCENTER = 0x09, - - _GEN_LIMIT_MASK = 0xF0, - GEN_INT_LIMIT12K = 0x10, //min -12000, max 12000 - GEN_INT_LIMITFC = 0x20, //min 1500, max 13500 - GEN_INT_LIMITQ = 0x30, //min 0, max 960 - GEN_INT_LIMIT960 = 0x40, //min -960, max 960 - GEN_INT_LIMIT16K4500 = 0x50, //min -16000, max 4500 - GEN_FLOAT_LIMIT12K5K = 0x60, //min -12000, max 5000 - GEN_FLOAT_LIMIT12K8K = 0x70, //min -12000, max 8000 - GEN_FLOAT_LIMIT1200 = 0x80, //min -1200, max 1200 - GEN_FLOAT_LIMITPAN = 0x90, //* .001f, min -.5f, max .5f, - GEN_FLOAT_LIMITATTN = 0xA0, //* .1f, min 0, max 144.0 - GEN_FLOAT_MAX1000 = 0xB0, //min 0, max 1000 - GEN_FLOAT_MAX1440 = 0xC0, //min 0, max 1440 - - _GEN_MAX = 59, - }; - #define _TSFREGIONOFFSET(TYPE, FIELD) (unsigned char)(((TYPE*)&((struct tsf_region*)0)->FIELD) - (TYPE*)0) - #define _TSFREGIONENVOFFSET(TYPE, ENV, FIELD) (unsigned char)(((TYPE*)&((&(((struct tsf_region*)0)->ENV))->FIELD)) - (TYPE*)0) - static const struct { unsigned char mode, offset; } genMetas[_GEN_MAX] = - { - { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, offset ) }, // 0 StartAddrsOffset - { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, end ) }, // 1 EndAddrsOffset - { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_start ) }, // 2 StartloopAddrsOffset - { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_end ) }, // 3 EndloopAddrsOffset - { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, offset ) }, // 4 StartAddrsCoarseOffset - { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToPitch ) }, // 5 ModLfoToPitch - { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, vibLfoToPitch ) }, // 6 VibLfoToPitch - { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToPitch ) }, // 7 ModEnvToPitch - { GEN_INT | GEN_INT_LIMITFC , _TSFREGIONOFFSET( int, initialFilterFc ) }, // 8 InitialFilterFc - { GEN_INT | GEN_INT_LIMITQ , _TSFREGIONOFFSET( int, initialFilterQ ) }, // 9 InitialFilterQ - { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToFilterFc ) }, //10 ModLfoToFilterFc - { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToFilterFc ) }, //11 ModEnvToFilterFc - { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, end ) }, //12 EndAddrsCoarseOffset - { GEN_INT | GEN_INT_LIMIT960 , _TSFREGIONOFFSET( int, modLfoToVolume ) }, //13 ModLfoToVolume - { 0 , (0 ) }, // Unused - { 0 , (0 ) }, //15 ChorusEffectsSend (unsupported) - { 0 , (0 ) }, //16 ReverbEffectsSend (unsupported) - { GEN_FLOAT | GEN_FLOAT_LIMITPAN , _TSFREGIONOFFSET( float, pan ) }, //17 Pan - { 0 , (0 ) }, // Unused - { 0 , (0 ) }, // Unused - { 0 , (0 ) }, // Unused - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayModLFO ) }, //21 DelayModLFO - { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqModLFO ) }, //22 FreqModLFO - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayVibLFO ) }, //23 DelayVibLFO - { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqVibLFO ) }, //24 FreqVibLFO - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, delay ) }, //25 DelayModEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, attack ) }, //26 AttackModEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, hold ) }, //27 HoldModEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, decay ) }, //28 DecayModEnv - { GEN_FLOAT | GEN_FLOAT_MAX1000 , _TSFREGIONENVOFFSET( float, modenv, sustain ) }, //29 SustainModEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, release ) }, //30 ReleaseModEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToHold ) }, //31 KeynumToModEnvHold - { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToDecay) }, //32 KeynumToModEnvDecay - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, delay ) }, //33 DelayVolEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, attack ) }, //34 AttackVolEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, hold ) }, //35 HoldVolEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, decay ) }, //36 DecayVolEnv - { GEN_FLOAT | GEN_FLOAT_MAX1440 , _TSFREGIONENVOFFSET( float, ampenv, sustain ) }, //37 SustainVolEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, release ) }, //38 ReleaseVolEnv - { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToHold ) }, //39 KeynumToVolEnvHold - { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToDecay) }, //40 KeynumToVolEnvDecay - { 0 , (0 ) }, // Instrument (special) - { 0 , (0 ) }, // Reserved - { GEN_KEYRANGE , (0 ) }, //43 KeyRange - { GEN_VELRANGE , (0 ) }, //44 VelRange - { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_start ) }, //45 StartloopAddrsCoarseOffset - { 0 , (0 ) }, //46 Keynum (special) - { 0 , (0 ) }, //47 Velocity (special) - { GEN_FLOAT | GEN_FLOAT_LIMITATTN , _TSFREGIONOFFSET( float, attenuation ) }, //48 InitialAttenuation - { 0 , (0 ) }, // Reserved - { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_end ) }, //50 EndloopAddrsCoarseOffset - { GEN_INT , _TSFREGIONOFFSET( int, transpose ) }, //51 CoarseTune - { GEN_INT , _TSFREGIONOFFSET( int, tune ) }, //52 FineTune - { 0 , (0 ) }, // SampleID (special) - { GEN_LOOPMODE , _TSFREGIONOFFSET( int, loop_mode ) }, //54 SampleModes - { 0 , (0 ) }, // Reserved - { GEN_INT , _TSFREGIONOFFSET( int, pitch_keytrack ) }, //56 ScaleTuning - { GEN_GROUP , _TSFREGIONOFFSET(unsigned int, group ) }, //57 ExclusiveClass - { GEN_KEYCENTER , _TSFREGIONOFFSET( int, pitch_keycenter ) }, //58 OverridingRootKey - }; - #undef _TSFREGIONOFFSET - #undef _TSFREGIONENVOFFSET - if (amount) - { - int offset; - if (genOper >= _GEN_MAX) return; - offset = genMetas[genOper].offset; - switch (genMetas[genOper].mode & _GEN_TYPE_MASK) - { - case GEN_FLOAT: (( float*)region)[offset] = amount->shortAmount; return; - case GEN_INT: (( int*)region)[offset] = amount->shortAmount; return; - case GEN_UINT_ADD: ((unsigned int*)region)[offset] += amount->shortAmount; return; - case GEN_UINT_ADD15: ((unsigned int*)region)[offset] += amount->shortAmount<<15; return; - case GEN_KEYRANGE: region->lokey = amount->range.lo; region->hikey = amount->range.hi; return; - case GEN_VELRANGE: region->lovel = amount->range.lo; region->hivel = amount->range.hi; return; - case GEN_LOOPMODE: region->loop_mode = ((amount->wordAmount&3) == 3 ? TSF_LOOPMODE_SUSTAIN : ((amount->wordAmount&3) == 1 ? TSF_LOOPMODE_CONTINUOUS : TSF_LOOPMODE_NONE)); return; - case GEN_GROUP: region->group = amount->wordAmount; return; - case GEN_KEYCENTER: region->pitch_keycenter = amount->shortAmount; return; - } - } - else //merge regions and clamp values - { - for (genOper = 0; genOper != _GEN_MAX; genOper++) - { - int offset = genMetas[genOper].offset; - switch (genMetas[genOper].mode & _GEN_TYPE_MASK) - { - case GEN_FLOAT: - { - float *val = &((float*)region)[offset], vfactor, vmin, vmax; - *val += ((float*)merge_region)[offset]; - switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) - { - case GEN_FLOAT_LIMIT12K5K: vfactor = 1.0f; vmin = -12000.0f; vmax = 5000.0f; break; - case GEN_FLOAT_LIMIT12K8K: vfactor = 1.0f; vmin = -12000.0f; vmax = 8000.0f; break; - case GEN_FLOAT_LIMIT1200: vfactor = 1.0f; vmin = -1200.0f; vmax = 1200.0f; break; - case GEN_FLOAT_LIMITPAN: vfactor = 0.001f; vmin = -0.5f; vmax = 0.5f; break; - case GEN_FLOAT_LIMITATTN: vfactor = 0.1f; vmin = 0.0f; vmax = 144.0f; break; - case GEN_FLOAT_MAX1000: vfactor = 1.0f; vmin = 0.0f; vmax = 1000.0f; break; - case GEN_FLOAT_MAX1440: vfactor = 1.0f; vmin = 0.0f; vmax = 1440.0f; break; - default: continue; - } - *val *= vfactor; - if (*val < vmin) *val = vmin; - else if (*val > vmax) *val = vmax; - continue; - } - case GEN_INT: - { - int *val = &((int*)region)[offset], vmin, vmax; - *val += ((int*)merge_region)[offset]; - switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) - { - case GEN_INT_LIMIT12K: vmin = -12000; vmax = 12000; break; - case GEN_INT_LIMITFC: vmin = 1500; vmax = 13500; break; - case GEN_INT_LIMITQ: vmin = 0; vmax = 960; break; - case GEN_INT_LIMIT960: vmin = -960; vmax = 960; break; - case GEN_INT_LIMIT16K4500: vmin = -16000; vmax = 4500; break; - default: continue; - } - if (*val < vmin) *val = vmin; - else if (*val > vmax) *val = vmax; - continue; - } - case GEN_UINT_ADD: - { - ((unsigned int*)region)[offset] += ((unsigned int*)merge_region)[offset]; - continue; - } - } - } - } -} - -static void tsf_region_envtosecs(struct tsf_envelope* p, TSF_BOOL sustainIsGain) -{ - // EG times need to be converted from timecents to seconds. - // Pin very short EG segments. Timecents don't get to zero, and our EG is - // happier with zero values. - p->delay = (p->delay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->delay)); - p->attack = (p->attack < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->attack)); - p->release = (p->release < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->release)); - - // If we have dynamic hold or decay times depending on key number we need - // to keep the values in timecents so we can calculate it during startNote - if (!p->keynumToHold) p->hold = (p->hold < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->hold)); - if (!p->keynumToDecay) p->decay = (p->decay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->decay)); - - if (p->sustain < 0.0f) p->sustain = 0.0f; - else if (sustainIsGain) p->sustain = tsf_decibelsToGain(-p->sustain / 10.0f); - else p->sustain = 1.0f - (p->sustain / 1000.0f); -} - -static void tsf_load_preset(const tsf* res, struct tsf_hydra *hydra, int presetToLoad) -{ - enum { GenInstrument = 41, GenKeyRange = 43, GenVelRange = 44, GenSampleID = 53 }; - // Read each preset. - struct tsf_hydra_phdr phdr; - int phdrIdx, phdrMaxIdx; - for (phdrIdx = presetToLoad, get_phdr(hydra, phdrIdx, &phdr), phdrMaxIdx = presetToLoad + 1 /*hydra->phdrNum - 1*/; phdrIdx != phdrMaxIdx; phdrIdx++, get_phdr(hydra, phdrIdx, &phdr)) - { - int sortedIndex = 0, region_index = 0; - struct tsf_hydra_phdr otherPhdr; - int otherPhdrIdx; - struct tsf_preset* preset; - struct tsf_region globalRegion; - for (otherPhdrIdx = 0, get_phdr(hydra, otherPhdrIdx, &otherPhdr); otherPhdrIdx != phdrMaxIdx; otherPhdrIdx++, get_phdr(hydra, otherPhdrIdx, &otherPhdr)) - { - if (otherPhdrIdx == phdrIdx || otherPhdr.bank > phdr.bank) continue; - else if (otherPhdr.bank < phdr.bank) sortedIndex++; - else if (otherPhdr.preset > phdr.preset) continue; - else if (otherPhdr.preset < phdr.preset) sortedIndex++; - else if (otherPhdrIdx < phdrIdx) sortedIndex++; - } - - preset = &res->presets[sortedIndex]; - TSF_MEMCPY(preset->presetName, phdr.presetName, sizeof(preset->presetName)); - preset->presetName[sizeof(preset->presetName)-1] = '\0'; //should be zero terminated in source file but make sure - preset->bank = phdr.bank; - preset->preset = phdr.preset; - preset->regionNum = 0; - - struct tsf_hydra_phdr phdrNext; - get_phdr(hydra, phdrIdx + 1, &phdrNext); - - //count regions covered by this preset - struct tsf_hydra_pbag pbag; - int pbagIdx, pbagEndIdx; - for (pbagIdx = phdr.presetBagNdx, get_pbag(hydra, pbagIdx, &pbag), pbagEndIdx = phdrNext.presetBagNdx; pbagIdx != pbagEndIdx; pbagIdx++, get_pbag(hydra, pbagIdx, &pbag)) - { - struct tsf_hydra_pbag pbagNext; - unsigned char plokey = 0, phikey = 127, plovel = 0, phivel = 127; - get_pbag(hydra, pbagIdx + 1, &pbagNext); - struct tsf_hydra_pgen pgen; - int pgenIdx, pgenEndIdx; - for (pgenIdx = pbag.genNdx, get_pgen(hydra, pgenIdx, &pgen), pgenEndIdx = pbagNext.genNdx; pgenIdx != pgenEndIdx; pgenIdx++, get_pgen(hydra, pgenIdx, &pgen)) - { - if (pgen.genOper == GenKeyRange) { plokey = pgen.genAmount.range.lo; phikey = pgen.genAmount.range.hi; continue; } - if (pgen.genOper == GenVelRange) { plovel = pgen.genAmount.range.lo; phivel = pgen.genAmount.range.hi; continue; } - if (pgen.genOper != GenInstrument) continue; - if (pgen.genAmount.wordAmount >= hydra->instNum) continue; - struct tsf_hydra_inst inst, instNext; - get_inst(hydra, pgen.genAmount.wordAmount, &inst); - get_inst(hydra, pgen.genAmount.wordAmount+1, &instNext); - struct tsf_hydra_ibag ibag; - int ibagIdx, ibagEndIdx; - for (ibagIdx = inst.instBagNdx, get_ibag(hydra, ibagIdx, &ibag), ibagEndIdx = instNext.instBagNdx; ibagIdx != ibagEndIdx; ibagIdx++, get_ibag(hydra, ibagIdx, &ibag) ) - { - struct tsf_hydra_ibag ibagNext; - get_ibag(hydra, ibagIdx + 1, &ibagNext); - struct tsf_hydra_igen igen; - int igenIdx, igenEndIdx; - unsigned char ilokey = 0, ihikey = 127, ilovel = 0, ihivel = 127; - for (igenIdx = ibag.instGenNdx, get_igen(hydra, igenIdx, &igen), igenEndIdx = ibagNext.instGenNdx; igenIdx != igenEndIdx; igenIdx++, get_igen(hydra, igenIdx, &igen)) - { - if (igen.genOper == GenKeyRange) { ilokey = igen.genAmount.range.lo; ihikey = igen.genAmount.range.hi; continue; } - if (igen.genOper == GenVelRange) { ilovel = igen.genAmount.range.lo; ihivel = igen.genAmount.range.hi; continue; } - if (igen.genOper == GenSampleID && ihikey >= plokey && ilokey <= phikey && ihivel >= plovel && ilovel <= phivel) preset->regionNum++; - } - } - } - } - - preset->regions = (struct tsf_region*)TSF_MALLOC(preset->regionNum * sizeof(struct tsf_region)); - tsf_region_clear(&globalRegion, TSF_TRUE); - - // Zones. - for (pbagIdx = phdr.presetBagNdx, get_pbag(hydra, pbagIdx, &pbag), pbagEndIdx = phdrNext.presetBagNdx; pbagIdx != pbagEndIdx; pbagIdx++, get_pbag(hydra, pbagIdx, &pbag)) - { - struct tsf_region presetRegion = globalRegion; - int hadGenInstrument = 0; - struct tsf_hydra_pbag pbagNext; - get_pbag(hydra, pbagIdx + 1, &pbagNext); - struct tsf_hydra_pgen pgen; - int pgenIdx, pgenEndIdx; - - // Generators. - for (pgenIdx = pbag.genNdx, get_pgen(hydra, pgenIdx, &pgen), pgenEndIdx = pbagNext.genNdx; pgenIdx != pgenEndIdx; pgenIdx++, get_pgen(hydra, pgenIdx, &pgen)) - { - // Instrument. - if (pgen.genOper == GenInstrument) - { - struct tsf_region instRegion; - tsf_u16 whichInst = pgen.genAmount.wordAmount; - if (whichInst >= hydra->instNum) continue; - - tsf_region_clear(&instRegion, TSF_FALSE); - struct tsf_hydra_inst inst, instNext; - get_inst(hydra, whichInst, &inst); - get_inst(hydra, whichInst + 1, &instNext); - struct tsf_hydra_ibag ibag; - int ibagIdx, ibagEndIdx; - for (ibagIdx = inst.instBagNdx, get_ibag(hydra, ibagIdx, &ibag), ibagEndIdx = instNext.instBagNdx; ibagIdx != ibagEndIdx; ibagIdx++, get_ibag(hydra, ibagIdx, &ibag)) - { - // Generators. - struct tsf_region zoneRegion = instRegion; - int hadSampleID = 0; - struct tsf_hydra_ibag ibagNext; - get_ibag(hydra, ibagIdx + 1, &ibagNext); - struct tsf_hydra_igen igen; - int igenIdx, igenEndIdx; - for (igenIdx = ibag.instGenNdx, get_igen(hydra, igenIdx, &igen), igenEndIdx = ibagNext.instGenNdx; igenIdx != igenEndIdx; igenIdx++, get_igen(hydra, igenIdx, &igen)) - { - if (igen.genOper == GenSampleID) - { - struct tsf_hydra_shdr shdr; - get_shdr(hydra, igen.genAmount.wordAmount, &shdr); - - //preset region key and vel ranges are a filter for the zone regions - if (zoneRegion.hikey < presetRegion.lokey || zoneRegion.lokey > presetRegion.hikey) continue; - if (zoneRegion.hivel < presetRegion.lovel || zoneRegion.lovel > presetRegion.hivel) continue; - if (presetRegion.lokey > zoneRegion.lokey) zoneRegion.lokey = presetRegion.lokey; - if (presetRegion.hikey < zoneRegion.hikey) zoneRegion.hikey = presetRegion.hikey; - if (presetRegion.lovel > zoneRegion.lovel) zoneRegion.lovel = presetRegion.lovel; - if (presetRegion.hivel < zoneRegion.hivel) zoneRegion.hivel = presetRegion.hivel; - - //sum regions - tsf_region_operator(&zoneRegion, 0, TSF_NULL, &presetRegion); - - // EG times need to be converted from timecents to seconds. - tsf_region_envtosecs(&zoneRegion.ampenv, TSF_TRUE); - tsf_region_envtosecs(&zoneRegion.modenv, TSF_FALSE); - - // LFO times need to be converted from timecents to seconds. - zoneRegion.delayModLFO = (zoneRegion.delayModLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayModLFO)); - zoneRegion.delayVibLFO = (zoneRegion.delayVibLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayVibLFO)); - - // Fixup sample positions - - get_shdr(hydra, igen.genAmount.wordAmount, &shdr); - zoneRegion.offset += shdr.start; - zoneRegion.end += shdr.end; - zoneRegion.loop_start += shdr.startLoop; - zoneRegion.loop_end += shdr.endLoop; - if (shdr.endLoop > 0) zoneRegion.loop_end -= 1; - if (zoneRegion.pitch_keycenter == -1) zoneRegion.pitch_keycenter = shdr.originalPitch; - zoneRegion.tune += shdr.pitchCorrection; - zoneRegion.sample_rate = shdr.sampleRate; - if (zoneRegion.end && zoneRegion.end < res->fontSampleCount) zoneRegion.end++; - else zoneRegion.end = res->fontSampleCount; - - preset->regions[region_index] = zoneRegion; - region_index++; - hadSampleID = 1; - } - else tsf_region_operator(&zoneRegion, igen.genOper, &igen.genAmount, TSF_NULL); - } - - // Handle instrument's global zone. - if (ibagIdx == inst.instBagNdx && !hadSampleID) - instRegion = zoneRegion; - - // Modulators (TODO) - //if (ibag->instModNdx < ibag[1].instModNdx) addUnsupportedOpcode("any modulator"); - } - hadGenInstrument = 1; - } - else tsf_region_operator(&presetRegion, pgen.genOper, &pgen.genAmount, TSF_NULL); - } - - // Modulators (TODO) - //if (pbag->modNdx < pbag[1].modNdx) addUnsupportedOpcode("any modulator"); - - // Handle preset's global zone. - if (pbagIdx == phdr.presetBagNdx && !hadGenInstrument) - globalRegion = presetRegion; - } - } -} - -static void tsf_load_samples(int *fontSamplesOffset, unsigned int* fontSampleCount, struct tsf_riffchunk *chunkSmpl, struct tsf_stream* stream) -{ - // Read sample data into float format buffer. - unsigned int samplesLeft; - samplesLeft = *fontSampleCount = chunkSmpl->size / sizeof(short); - *fontSamplesOffset = stream->tell(stream->data); - stream->skip(stream->data, samplesLeft * sizeof(short)); -} - -static void tsf_voice_envelope_nextsegment(struct tsf_voice_envelope* e, short active_segment, float outSampleRate) -{ - switch (active_segment) - { - case TSF_SEGMENT_NONE: - e->samplesUntilNextSegment = (int)(e->parameters.delay * outSampleRate); - if (e->samplesUntilNextSegment > 0) - { - e->segment = TSF_SEGMENT_DELAY; - e->segmentIsExponential = TSF_FALSE; - e->level = 0.0; - e->slope = 0.0; - return; - } - /* fall through */ - case TSF_SEGMENT_DELAY: - e->samplesUntilNextSegment = (int)(e->parameters.attack * outSampleRate); - if (e->samplesUntilNextSegment > 0) - { - if (!e->isAmpEnv) - { - //mod env attack duration scales with velocity (velocity of 1 is full duration, max velocity is 0.125 times duration) - e->samplesUntilNextSegment = (int)(e->parameters.attack * ((145 - e->midiVelocity) / 144.0f) * outSampleRate); - } - e->segment = TSF_SEGMENT_ATTACK; - e->segmentIsExponential = TSF_FALSE; - e->level = 0.0f; - e->slope = 1.0f / e->samplesUntilNextSegment; - return; - } - /* fall through */ - case TSF_SEGMENT_ATTACK: - e->samplesUntilNextSegment = (int)(e->parameters.hold * outSampleRate); - if (e->samplesUntilNextSegment > 0) - { - e->segment = TSF_SEGMENT_HOLD; - e->segmentIsExponential = TSF_FALSE; - e->level = 1.0f; - e->slope = 0.0f; - return; - } - /* fall through */ - case TSF_SEGMENT_HOLD: - e->samplesUntilNextSegment = (int)(e->parameters.decay * outSampleRate); - if (e->samplesUntilNextSegment > 0) - { - e->segment = TSF_SEGMENT_DECAY; - e->level = 1.0f; - if (e->isAmpEnv) - { - // I don't truly understand this; just following what LinuxSampler does. - float mysterySlope = -9.226f / e->samplesUntilNextSegment; - e->slope = TSF_EXPF(mysterySlope); - e->segmentIsExponential = TSF_TRUE; - if (e->parameters.sustain > 0.0f) - { - // Again, this is following LinuxSampler's example, which is similar to - // SF2-style decay, where "decay" specifies the time it would take to - // get to zero, not to the sustain level. The SFZ spec is not that - // specific about what "decay" means, so perhaps it's really supposed - // to specify the time to reach the sustain level. - e->samplesUntilNextSegment = (int)(TSF_LOG(e->parameters.sustain) / mysterySlope); - } - } - else - { - e->slope = -1.0f / e->samplesUntilNextSegment; - e->samplesUntilNextSegment = (int)(e->parameters.decay * (1.0f - e->parameters.sustain) * outSampleRate); - e->segmentIsExponential = TSF_FALSE; - } - return; - } - /* fall through */ - case TSF_SEGMENT_DECAY: - e->segment = TSF_SEGMENT_SUSTAIN; - e->level = e->parameters.sustain; - e->slope = 0.0f; - e->samplesUntilNextSegment = 0x7FFFFFFF; - e->segmentIsExponential = TSF_FALSE; - return; - case TSF_SEGMENT_SUSTAIN: - e->segment = TSF_SEGMENT_RELEASE; - e->samplesUntilNextSegment = (int)((e->parameters.release <= 0 ? TSF_FASTRELEASETIME : e->parameters.release) * outSampleRate); - if (e->isAmpEnv) - { - // I don't truly understand this; just following what LinuxSampler does. - float mysterySlope = -9.226f / e->samplesUntilNextSegment; - e->slope = TSF_EXPF(mysterySlope); - e->segmentIsExponential = TSF_TRUE; - } - else - { - e->slope = -e->level / e->samplesUntilNextSegment; - e->segmentIsExponential = TSF_FALSE; - } - return; - case TSF_SEGMENT_RELEASE: - default: - e->segment = TSF_SEGMENT_DONE; - e->segmentIsExponential = TSF_FALSE; - e->level = e->slope = 0.0f; - e->samplesUntilNextSegment = 0x7FFFFFF; - } -} - -static void tsf_voice_envelope_setup(struct tsf_voice_envelope* e, struct tsf_envelope* new_parameters, int midiNoteNumber, short midiVelocity, TSF_BOOL isAmpEnv, float outSampleRate) -{ - e->parameters = *new_parameters; - if (e->parameters.keynumToHold) - { - e->parameters.hold += e->parameters.keynumToHold * (60.0f - midiNoteNumber); - e->parameters.hold = (e->parameters.hold < -10000.0f ? 0.0f : tsf_timecents2Secsf(e->parameters.hold)); - } - if (e->parameters.keynumToDecay) - { - e->parameters.decay += e->parameters.keynumToDecay * (60.0f - midiNoteNumber); - e->parameters.decay = (e->parameters.decay < -10000.0f ? 0.0f : tsf_timecents2Secsf(e->parameters.decay)); - } - e->midiVelocity = midiVelocity; - e->isAmpEnv = isAmpEnv; - tsf_voice_envelope_nextsegment(e, TSF_SEGMENT_NONE, outSampleRate); -} - -static void tsf_voice_envelope_process(struct tsf_voice_envelope* e, int numSamples, float outSampleRate) -{ - if (e->slope) - { - if (e->segmentIsExponential) e->level *= TSF_POWF(e->slope, (float)numSamples); - else e->level += (e->slope * numSamples); - } - if ((e->samplesUntilNextSegment -= numSamples) <= 0) - tsf_voice_envelope_nextsegment(e, e->segment, outSampleRate); -} - -static void tsf_voice_lowpass_setup(struct tsf_voice_lowpass* e, float Fc) -{ - // Lowpass filter from http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/ - double K = TSF_TAN(TSF_PI * Fc), KK = K * K; - double norm = 1 / (1 + K * e->QInv + KK); - e->a0 = KK * norm; - e->a1 = 2 * e->a0; - e->b1 = 2 * (KK - 1) * norm; - e->b2 = (1 - K * e->QInv + KK) * norm; -} - -static float tsf_voice_lowpass_process(struct tsf_voice_lowpass* e, double In) -{ - double Out = In * e->a0 + e->z1; e->z1 = In * e->a1 + e->z2 - e->b1 * Out; e->z2 = In * e->a0 - e->b2 * Out; return (float)Out; -} - -static void tsf_voice_lfo_setup(struct tsf_voice_lfo* e, float delay, int freqCents, float outSampleRate) -{ - e->samplesUntil = (int)(delay * outSampleRate); - e->delta = (4.0f * tsf_cents2Hertz((float)freqCents) / outSampleRate); - e->level = 0; -} - -static void tsf_voice_lfo_process(struct tsf_voice_lfo* e, int blockSamples) -{ - if (e->samplesUntil > blockSamples) { e->samplesUntil -= blockSamples; return; } - e->level += e->delta * blockSamples; - if (e->level > 1.0f) { e->delta = -e->delta; e->level = 2.0f - e->level; } - else if (e->level < -1.0f) { e->delta = -e->delta; e->level = -2.0f - e->level; } -} - -static void tsf_voice_kill(struct tsf_voice* v) -{ - v->playingPreset = -1; -} - -static void tsf_voice_end(struct tsf_voice* v, float outSampleRate) -{ - tsf_voice_envelope_nextsegment(&v->ampenv, TSF_SEGMENT_SUSTAIN, outSampleRate); - tsf_voice_envelope_nextsegment(&v->modenv, TSF_SEGMENT_SUSTAIN, outSampleRate); - if (v->region->loop_mode == TSF_LOOPMODE_SUSTAIN) - { - // Continue playing, but stop looping. - v->loopEnd = v->loopStart; - } -} - -static void tsf_voice_endquick(struct tsf_voice* v, float outSampleRate) -{ - v->ampenv.parameters.release = 0.0f; tsf_voice_envelope_nextsegment(&v->ampenv, TSF_SEGMENT_SUSTAIN, outSampleRate); - v->modenv.parameters.release = 0.0f; tsf_voice_envelope_nextsegment(&v->modenv, TSF_SEGMENT_SUSTAIN, outSampleRate); -} - -static void tsf_voice_calcpitchratio(struct tsf_voice* v, float pitchShift, float outSampleRate) -{ - double note = v->playingKey + v->region->transpose + v->region->tune / 100.0; - double adjustedPitch = v->region->pitch_keycenter + (note - v->region->pitch_keycenter) * (v->region->pitch_keytrack / 100.0); - if (pitchShift) adjustedPitch += pitchShift; - v->pitchInputTimecents = adjustedPitch * 100.0; - v->pitchOutputFactor = v->region->sample_rate / (tsf_timecents2Secsd(v->region->pitch_keycenter * 100.0) * outSampleRate); -} - -short tsf_read_short_cached(tsf *f, int pos) -{ - static int hits = 0; - static int misses = 0; -// static int call =0; -// call++; -// if ((call % 88000) ==0) printf("Hit: %d, Miss: %d, Ratio: %f\n", hits, misses, (double)hits/(double)(misses+hits)); - - for (int i=0; ioffset[i] <= pos) && ((f->offset[i] + TSF_BUFFSIZE) > pos) ) { - f->timestamp[i] = f->epoch++; - if (f->epoch==0) { - for (int i=0; itimestamp[i] = f->epoch++; - } - hits++; - return f->buffer[i][pos - f->offset[i]]; - } - } - int repl = 0; - for (int i=1; itimestamp[i] < f->timestamp[repl]) repl = i; - } - int readOff = pos - (pos % TSF_BUFFSIZE); -// for (int i=0; ibuffer[repl][i] = i; } - f->hydra->stream->seek(f->hydra->stream->data, readOff * sizeof(short)); - f->hydra->stream->read(f->hydra->stream->data, f->buffer[repl], TSF_BUFFSIZE * sizeof(short)); -//static uint32_t *bp = NULL; if (!bp) bp = (uint32_t*)malloc(512); -//printf("off=%08x, buff=%p, len=%08x\n", readOff * sizeof(short), bp, TSF_BUFFSIZE); spi_flash_read(0x0000, bp, 512/4-4) ; - f->timestamp[repl] = f->epoch++; - f->offset[repl] = readOff; - misses++; - return f->buffer[repl][pos - readOff]; -} - -static void tsf_voice_render(tsf* f, struct tsf_voice* v, float* outputBuffer, int numSamples) -{ - struct tsf_region* region = v->region; - float* outL = outputBuffer; - float* outR = (f->outputmode == TSF_STEREO_UNWEAVED ? outL + numSamples : TSF_NULL); - - // Cache some values, to give them at least some chance of ending up in registers. - TSF_BOOL updateModEnv = (region->modEnvToPitch || region->modEnvToFilterFc); - TSF_BOOL updateModLFO = (v->modlfo.delta && (region->modLfoToPitch || region->modLfoToFilterFc || region->modLfoToVolume)); - TSF_BOOL updateVibLFO = (v->viblfo.delta && (region->vibLfoToPitch)); - TSF_BOOL isLooping = (v->loopStart < v->loopEnd); - unsigned int tmpLoopStart = v->loopStart, tmpLoopEnd = v->loopEnd; - double tmpSampleEndDbl = (double)region->end, tmpLoopEndDbl = (double)tmpLoopEnd + 1.0; - double tmpSourceSamplePosition = v->sourceSamplePosition; - struct tsf_voice_lowpass tmpLowpass = v->lowpass; - - TSF_BOOL dynamicLowpass = (region->modLfoToFilterFc || region->modEnvToFilterFc); - float tmpSampleRate = f->outSampleRate, tmpInitialFilterFc, tmpModLfoToFilterFc, tmpModEnvToFilterFc; - - TSF_BOOL dynamicPitchRatio = (region->modLfoToPitch || region->modEnvToPitch || region->vibLfoToPitch); - double pitchRatio; - float tmpModLfoToPitch, tmpVibLfoToPitch, tmpModEnvToPitch; - - TSF_BOOL dynamicGain = (region->modLfoToVolume != 0); - float noteGain = 0, tmpModLfoToVolume; - - if (dynamicLowpass) tmpInitialFilterFc = (float)region->initialFilterFc, tmpModLfoToFilterFc = (float)region->modLfoToFilterFc, tmpModEnvToFilterFc = (float)region->modEnvToFilterFc; - else tmpInitialFilterFc = 0, tmpModLfoToFilterFc = 0, tmpModEnvToFilterFc = 0; - - if (dynamicPitchRatio) pitchRatio = 0, tmpModLfoToPitch = (float)region->modLfoToPitch, tmpVibLfoToPitch = (float)region->vibLfoToPitch, tmpModEnvToPitch = (float)region->modEnvToPitch; - else pitchRatio = tsf_timecents2Secsd(v->pitchInputTimecents) * v->pitchOutputFactor, tmpModLfoToPitch = 0, tmpVibLfoToPitch = 0, tmpModEnvToPitch = 0; - - if (dynamicGain) tmpModLfoToVolume = (float)region->modLfoToVolume * 0.1f; - else noteGain = tsf_decibelsToGain(v->noteGainDB), tmpModLfoToVolume = 0; - - while (numSamples) - { - float gainMono, gainLeft, gainRight; - int blockSamples = (numSamples > TSF_RENDER_EFFECTSAMPLEBLOCK ? TSF_RENDER_EFFECTSAMPLEBLOCK : numSamples); - numSamples -= blockSamples; - - if (dynamicLowpass) - { - float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; - float lowpassFc = (fres <= 13500 ? tsf_cents2Hertz(fres) / tmpSampleRate : 1.0f); - tmpLowpass.active = (lowpassFc < 0.499f); - if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, lowpassFc); - } - - if (dynamicPitchRatio) - pitchRatio = tsf_timecents2Secsd(v->pitchInputTimecents + (v->modlfo.level * tmpModLfoToPitch + v->viblfo.level * tmpVibLfoToPitch + v->modenv.level * tmpModEnvToPitch)) * v->pitchOutputFactor; - - if (dynamicGain) - noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.level * tmpModLfoToVolume)); - - gainMono = noteGain * v->ampenv.level; - - // Update EG. - tsf_voice_envelope_process(&v->ampenv, blockSamples, tmpSampleRate); - if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, tmpSampleRate); - - // Update LFOs. - if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); - if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); - - switch (f->outputmode) - { - case TSF_STEREO_INTERLEAVED: - gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; - while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) - { - unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); - float inputPos, inputNextPos; - inputPos = (float)(tsf_read_short_cached(f, pos) / 32767.0); - inputNextPos = (float)(tsf_read_short_cached(f, nextPos) / 32767.0); - // Simple linear interpolation. - float alpha = (float)(tmpSourceSamplePosition - pos), val = (inputPos * (1.0f - alpha) + inputNextPos * alpha); - - // Low-pass filter. - if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); - - *outL++ += val * gainLeft; - *outL++ += val * gainRight; - - // Next sample. - tmpSourceSamplePosition += pitchRatio; - if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); - } - break; - - case TSF_STEREO_UNWEAVED: - gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; - while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) - { - unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); - float inputPos, inputNextPos; - inputPos = (float)(tsf_read_short_cached(f, pos) / 32767.0); - inputNextPos = (float)(tsf_read_short_cached(f, nextPos) / 32767.0); - - // Simple linear interpolation. - float alpha = (float)(tmpSourceSamplePosition - pos), val = (inputPos * (1.0f - alpha) + inputNextPos * alpha); - - // Low-pass filter. - if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); - - *outL++ += val * gainLeft; - *outR++ += val * gainRight; - - // Next sample. - tmpSourceSamplePosition += pitchRatio; - if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); - } - break; - - case TSF_MONO: - while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) - { - unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); - float inputPos, inputNextPos; - inputPos = (float)(tsf_read_short_cached(f, pos) / 32767.0); - inputNextPos = (float)(tsf_read_short_cached(f, nextPos) / 32767.0); - - // Simple linear interpolation. - float alpha = (float)(tmpSourceSamplePosition - pos), val = (inputPos * (1.0f - alpha) + inputNextPos * alpha); - - // Low-pass filter. - if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); - - *outL++ += val * gainMono; - - // Next sample. - tmpSourceSamplePosition += pitchRatio; - if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); - } - break; - } - - if (tmpSourceSamplePosition >= tmpSampleEndDbl || v->ampenv.segment == TSF_SEGMENT_DONE) - { - tsf_voice_kill(v); - return; - } - } - - v->sourceSamplePosition = tmpSourceSamplePosition; - if (tmpLowpass.active || dynamicLowpass) v->lowpass = tmpLowpass; -} - - -void DumpF32P32(char *name, long long x) { - printf("%s = %08x.%08x\n", name, (int32_t)((x>>32)&0xffffffff), (int32_t)(x&0xffffffff)); -} -static void tsf_voice_render_fast(tsf* f, struct tsf_voice* v, short* outputBuffer, int numSamples) -{ - struct tsf_region* region = v->region; - short* outL = outputBuffer; - short* outR = (f->outputmode == TSF_STEREO_UNWEAVED ? outL + numSamples : TSF_NULL); - - // Cache some values, to give them at least some chance of ending up in registers. - TSF_BOOL updateModEnv = (region->modEnvToPitch || region->modEnvToFilterFc); - TSF_BOOL updateModLFO = (v->modlfo.delta && (region->modLfoToPitch || region->modLfoToFilterFc || region->modLfoToVolume)); - TSF_BOOL updateVibLFO = (v->viblfo.delta && (region->vibLfoToPitch)); - TSF_BOOL isLooping = (v->loopStart < v->loopEnd); - unsigned int tmpLoopStart = v->loopStart, tmpLoopEnd = v->loopEnd; - //double tmpSampleEndDbl = (double)v->sampleEnd, tmpLoopEndDbl = (double)tmpLoopEnd + 1.0; - //double tmpSourceSamplePosition = v->sourceSamplePosition; - fixed32p32 tmpSampleEndF32P32 = ((fixed32p32)(region->end)) << 32; - fixed32p32 tmpLoopEndF32P32 = ((fixed32p32)(tmpLoopEnd + 1)) << 32; - fixed32p32 tmpSourceSamplePositionF32P32 = v->sourceSamplePositionF32P32; - struct tsf_voice_lowpass tmpLowpass = v->lowpass; - - TSF_BOOL dynamicLowpass = (region->modLfoToFilterFc || region->modEnvToFilterFc); - float tmpSampleRate, tmpInitialFilterFc, tmpModLfoToFilterFc, tmpModEnvToFilterFc; - - TSF_BOOL dynamicPitchRatio = (region->modLfoToPitch || region->modEnvToPitch || region->vibLfoToPitch); - //double pitchRatio; - fixed32p32 pitchRatioF32P32; - float tmpModLfoToPitch, tmpVibLfoToPitch, tmpModEnvToPitch; - - TSF_BOOL dynamicGain = (region->modLfoToVolume != 0); - float noteGain, tmpModLfoToVolume; - - if (dynamicLowpass) tmpSampleRate = f->outSampleRate, tmpInitialFilterFc = (float)region->initialFilterFc, tmpModLfoToFilterFc = (float)region->modLfoToFilterFc, tmpModEnvToFilterFc = (float)region->modEnvToFilterFc; - else tmpSampleRate = 0, tmpInitialFilterFc = 0, tmpModLfoToFilterFc = 0, tmpModEnvToFilterFc = 0; - - if (dynamicPitchRatio) pitchRatioF32P32 = 0, tmpModLfoToPitch = (float)region->modLfoToPitch, tmpVibLfoToPitch = (float)region->vibLfoToPitch, tmpModEnvToPitch = (float)region->modEnvToPitch; - else { - double pr = tsf_timecents2Secsd(v->pitchInputTimecents) * v->pitchOutputFactor; - fixed32p32 adj = 1LL<<32; - pr *= adj; - pitchRatioF32P32 = (int64_t)pr, tmpModLfoToPitch = 0, tmpVibLfoToPitch = 0, tmpModEnvToPitch = 0; - } - - if (dynamicGain) noteGain = 0, tmpModLfoToVolume = (float)region->modLfoToVolume * 0.1f; - else noteGain = tsf_decibelsToGain(v->noteGainDB), tmpModLfoToVolume = 0; - - while (numSamples) - { - float gainMono; - int blockSamples = (numSamples > TSF_RENDER_EFFECTSAMPLEBLOCK ? TSF_RENDER_EFFECTSAMPLEBLOCK : numSamples); - numSamples -= blockSamples; - - if (dynamicLowpass) - { - float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; - tmpLowpass.active = (fres <= 13500.0f); - if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, tsf_cents2Hertz(fres) / tmpSampleRate); - } - - if (dynamicPitchRatio) { - pitchRatioF32P32 = tsf_timecents2Secsd(v->pitchInputTimecents + (v->modlfo.level * tmpModLfoToPitch + v->viblfo.level * tmpVibLfoToPitch + v->modenv.level * tmpModEnvToPitch)) * v->pitchOutputFactor * (1LL<<32); - } - - if (dynamicGain) - noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.level * tmpModLfoToVolume)); - - gainMono = noteGain * v->ampenv.level; - short gainMonoFP = gainMono * 32767; - - // Update EG. - tsf_voice_envelope_process(&v->ampenv, blockSamples, f->outSampleRate); - if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, f->outSampleRate); - - // Update LFOs. - if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); - if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); - - while (blockSamples-- && tmpSourceSamplePositionF32P32 < tmpSampleEndF32P32) - { - unsigned int pos = (unsigned int)(tmpSourceSamplePositionF32P32>>32); - short val = tsf_read_short_cached(f, pos); - int32_t val32 = (int)val * (int)gainMonoFP; - - *outL++ += val32>>16; - if (f->outputmode != TSF_MONO) *outR++ += val32>>16; - - // Next sample. - tmpSourceSamplePositionF32P32 += pitchRatioF32P32; - if (tmpSourceSamplePositionF32P32 >= tmpLoopEndF32P32 && isLooping) - tmpSourceSamplePositionF32P32 -= (tmpLoopEndF32P32 - tmpLoopStart + (1LL<<32)); - } - - if (tmpSourceSamplePositionF32P32 >= tmpSampleEndF32P32 || v->ampenv.segment == TSF_SEGMENT_DONE) - { - tsf_voice_kill(v); - return; - } - } - - v->sourceSamplePositionF32P32 = tmpSourceSamplePositionF32P32; - if (tmpLowpass.active || dynamicLowpass) v->lowpass = tmpLowpass; -} - - - - -TSFDEF tsf* tsf_load(struct tsf_stream* stream) -{ - tsf* res = TSF_NULL; - struct tsf_riffchunk chunkHead; - struct tsf_riffchunk chunkList; - struct tsf_hydra hydra; - int fontSamplesOffset = 0; - unsigned int fontSampleCount = 0; - - if (!tsf_riffchunk_read(TSF_NULL, &chunkHead, stream) || !TSF_FourCCEquals(chunkHead.id, "sfbk")) - { - //if (e) *e = TSF_INVALID_NOSF2HEADER; - return res; - } - - // Read hydra and locate sample data. - TSF_MEMSET(&hydra, 0, sizeof(hydra)); - hydra.stream = stream; - while (tsf_riffchunk_read(&chunkHead, &chunkList, stream)) - { - struct tsf_riffchunk chunk; - if (TSF_FourCCEquals(chunkList.id, "pdta")) - { - while (tsf_riffchunk_read(&chunkList, &chunk, stream)) - { - #define GetChunkOffset(chunkName) (TSF_FourCCEquals(chunk.id, #chunkName) && !(chunk.size % chunkName##SizeInFile)) \ - { \ - int num = chunk.size / chunkName##SizeInFile; \ - hydra.chunkName##Num = num; \ - hydra.chunkName##Offset = stream->tell(stream->data); \ - stream->skip(stream->data, num * chunkName##SizeInFile); \ - } - if GetChunkOffset(phdr) - else if GetChunkOffset(pbag) - else if GetChunkOffset(pmod) - else if GetChunkOffset(pgen) - else if GetChunkOffset(inst) - else if GetChunkOffset(ibag) - else if GetChunkOffset(imod) - else if GetChunkOffset(igen) - else if GetChunkOffset(shdr) - else stream->skip(stream->data, chunk.size); - #undef HandleChunk - } - } - else if (TSF_FourCCEquals(chunkList.id, "sdta")) - { - while (tsf_riffchunk_read(&chunkList, &chunk, stream)) - { - if (TSF_FourCCEquals(chunk.id, "smpl")) - { - tsf_load_samples(&fontSamplesOffset, &fontSampleCount, &chunk, stream); - } - else stream->skip(stream->data, chunk.size); - } - } - else stream->skip(stream->data, chunkList.size); - } - if (!hydra.phdrNum || !hydra.pbagNum || !hydra.pmodNum || !hydra.pgenNum || !hydra.instNum || !hydra.ibagNum || !hydra.imodNum || !hydra.igenNum || !hydra.shdrNum) - { - //if (e) *e = TSF_INVALID_INCOMPLETE; - } - else if (fontSamplesOffset == 0) - { - //if (e) *e = TSF_INVALID_NOSAMPLEDATA; - } - else - { - res = (tsf*)TSF_MALLOC(sizeof(tsf)); - TSF_MEMSET(res, 0, sizeof(tsf)); - res->presetNum = hydra.phdrNum - 1; - res->presets = (struct tsf_preset*)TSF_MALLOC(res->presetNum * sizeof(struct tsf_preset)); - TSF_MEMSET(res->presets, 0, res->presetNum * sizeof(struct tsf_preset)); - res->fontSamplesOffset = fontSamplesOffset; - res->fontSampleCount = fontSampleCount; - res->outSampleRate = 44100.0f; - res->hydra = (struct tsf_hydra*)TSF_MALLOC(sizeof(struct tsf_hydra)); - TSF_MEMCPY(res->hydra, &hydra, sizeof(*res->hydra)); - res->hydra->stream = (struct tsf_stream*)TSF_MALLOC(sizeof(struct tsf_stream)); - TSF_MEMCPY(res->hydra->stream, stream, sizeof(*res->hydra->stream)); - - // Cached sample - for (int i=0; ibuffer[i] = (short*)TSF_MALLOC(TSF_BUFFSIZE * sizeof(short)); - res->offset[i] = 0xfffffff; - res->timestamp[i] = -1; - } - res->epoch = 0; - } - return res; -} - -TSFDEF void tsf_close(tsf* f) -{ - struct tsf_preset *preset, *presetEnd; - if (!f) return; - for (preset = f->presets, presetEnd = preset + f->presetNum; preset != presetEnd; preset++) - TSF_FREE(preset->regions); - TSF_FREE(f->presets); - TSF_FREE(f->voices); - if (f->channels) { TSF_FREE(f->channels->channels); TSF_FREE(f->channels); } - TSF_FREE(f->outputSamples); - f->hydra->stream->close(f->hydra->stream->data); - TSF_FREE(f->hydra->stream); - TSF_FREE(f->hydra); - for (int i=0; ibuffer[i]); - TSF_FREE(f); -} - -TSFDEF void tsf_reset(tsf* f) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - for (; v != vEnd; v++) - if (v->playingPreset != -1 && (v->ampenv.segment < TSF_SEGMENT_RELEASE || v->ampenv.parameters.release)) - tsf_voice_endquick(v, f->outSampleRate); - if (f->channels) { TSF_FREE(f->channels->channels); TSF_FREE(f->channels); f->channels = TSF_NULL; } -} - -TSFDEF int tsf_get_presetindex(const tsf* f, int bank, int preset_number) -{ - const struct tsf_preset *presets; - int i, iMax; - for (presets = f->presets, i = 0, iMax = f->presetNum; i < iMax; i++) - if (presets[i].preset == preset_number && presets[i].bank == bank) - return i; - return -1; -} - -TSFDEF int tsf_get_presetcount(const tsf* f) -{ - return f->presetNum; -} - -TSFDEF const char* tsf_get_presetname(const tsf* f, int preset) -{ - if (f->presets[preset].regions == NULL && preset >= 0 && preset < f->presetNum) tsf_load_preset(f, f->hydra, preset); - return (preset < 0 || preset >= f->presetNum ? TSF_NULL : f->presets[preset].presetName); -} - -TSFDEF const char* tsf_bank_get_presetname(const tsf* f, int bank, int preset_number) -{ - return tsf_get_presetname(f, tsf_get_presetindex(f, bank, preset_number)); -} - -TSFDEF void tsf_set_output(tsf* f, enum TSFOutputMode outputmode, int samplerate, float global_gain_db) -{ - f->outputmode = outputmode; - f->outSampleRate = (float)(samplerate >= 1 ? samplerate : 44100.0f); - f->globalGainDB = global_gain_db; -} - -TSFDEF void tsf_note_on(tsf* f, int preset_index, int key, float vel) -{ - short midiVelocity = (short)(vel * 127); - int voicePlayIndex; - struct tsf_region *region, *regionEnd; - - if (preset_index < 0 || preset_index >= f->presetNum) return; - if (vel <= 0.0f) { tsf_note_off(f, preset_index, key); return; } - if (f->presets[preset_index].regions == NULL) tsf_load_preset(f, f->hydra, preset_index); - - // Play all matching regions. - voicePlayIndex = f->voicePlayIndex++; - for (region = f->presets[preset_index].regions, regionEnd = region + f->presets[preset_index].regionNum; region != regionEnd; region++) - { - struct tsf_voice *voice, *v, *vEnd; TSF_BOOL doLoop; float lowpassFilterQDB, lowpassFc; - if (key < region->lokey || key > region->hikey || midiVelocity < region->lovel || midiVelocity > region->hivel) continue; - - voice = TSF_NULL, v = f->voices, vEnd = v + f->voiceNum; - if (region->group) - { - for (; v != vEnd; v++) - if (v->playingPreset == preset_index && v->region->group == region->group) tsf_voice_endquick(v, f->outSampleRate); - else if (v->playingPreset == -1 && !voice) voice = v; - } - else for (; v != vEnd; v++) if (v->playingPreset == -1) { voice = v; break; } - - if (!voice) - { - f->voiceNum += 4; - struct tsf_voice *saveVoice = f->voices; - f->voices = (struct tsf_voice*)TSF_REALLOC(f->voices, f->voiceNum * sizeof(struct tsf_voice)); - if (!f->voices) { - f->voices = saveVoice; - printf("OOM, no room for new voice. Ignoring note_on\n"); - return; - } - voice = &f->voices[f->voiceNum - 4]; - voice[1].playingPreset = voice[2].playingPreset = voice[3].playingPreset = -1; - } - - voice->region = region; - voice->playingPreset = preset_index; - voice->playingKey = key; - voice->playIndex = voicePlayIndex; - voice->noteGainDB = f->globalGainDB - region->attenuation - tsf_gainToDecibels(1.0f / vel); - - if (f->channels) - { - f->channels->setupVoice(f, voice); - } - else - { - tsf_voice_calcpitchratio(voice, 0, f->outSampleRate); - // The SFZ spec is silent about the pan curve, but a 3dB pan law seems common. This sqrt() curve matches what Dimension LE does; Alchemy Free seems closer to sin(adjustedPan * pi/2). - voice->panFactorLeft = TSF_SQRTF(0.5f - region->pan); - voice->panFactorRight = TSF_SQRTF(0.5f + region->pan); - } - - // Offset/end. - voice->sourceSamplePosition = region->offset; - voice->sourceSamplePositionF32P32 = ((int64_t)region->offset)<< 32; - - // Loop. - doLoop = (region->loop_mode != TSF_LOOPMODE_NONE && region->loop_start < region->loop_end); - voice->loopStart = (doLoop ? region->loop_start : 0); - voice->loopEnd = (doLoop ? region->loop_end : 0); - - // Setup envelopes. - tsf_voice_envelope_setup(&voice->ampenv, ®ion->ampenv, key, midiVelocity, TSF_TRUE, f->outSampleRate); - tsf_voice_envelope_setup(&voice->modenv, ®ion->modenv, key, midiVelocity, TSF_FALSE, f->outSampleRate); - - // Setup lowpass filter. - lowpassFc = (region->initialFilterFc <= 13500 ? tsf_cents2Hertz((float)region->initialFilterFc) / f->outSampleRate : 1.0f); - lowpassFilterQDB = region->initialFilterQ / 10.0f; - voice->lowpass.QInv = 1.0 / TSF_POW(10.0, (lowpassFilterQDB / 20.0)); - voice->lowpass.z1 = voice->lowpass.z2 = 0; - voice->lowpass.active = (lowpassFc < 0.499f); - if (voice->lowpass.active) tsf_voice_lowpass_setup(&voice->lowpass, lowpassFc); - - // Setup LFO filters. - tsf_voice_lfo_setup(&voice->modlfo, region->delayModLFO, region->freqModLFO, f->outSampleRate); - tsf_voice_lfo_setup(&voice->viblfo, region->delayVibLFO, region->freqVibLFO, f->outSampleRate); - } -} - -TSFDEF int tsf_bank_note_on(tsf* f, int bank, int preset_number, int key, float vel) -{ - int preset_index = tsf_get_presetindex(f, bank, preset_number); - if (preset_index == -1) return 0; - tsf_note_on(f, preset_index, key, vel); - return 1; -} - -TSFDEF void tsf_note_off(tsf* f, int preset_index, int key) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum, *vMatchFirst = TSF_NULL, *vMatchLast = TSF_NULL; - for (; v != vEnd; v++) - { - //Find the first and last entry in the voices list with matching preset, key and look up the smallest play index - if (v->playingPreset != preset_index || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE) continue; - else if (!vMatchFirst || v->playIndex < vMatchFirst->playIndex) vMatchFirst = vMatchLast = v; - else if (v->playIndex == vMatchFirst->playIndex) vMatchLast = v; - } - if (!vMatchFirst) return; - for (v = vMatchFirst; v <= vMatchLast; v++) - { - //Stop all voices with matching preset, key and the smallest play index which was enumerated above - if (v != vMatchFirst && v != vMatchLast && - (v->playIndex != vMatchFirst->playIndex || v->playingPreset != preset_index || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE)) continue; - tsf_voice_end(v, f->outSampleRate); - } -} - -TSFDEF int tsf_bank_note_off(tsf* f, int bank, int preset_number, int key) -{ - int preset_index = tsf_get_presetindex(f, bank, preset_number); - if (preset_index == -1) return 0; - tsf_note_off(f, preset_index, key); - return 1; -} - -TSFDEF void tsf_note_off_all(tsf* f) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - for (; v != vEnd; v++) if (v->playingPreset != -1 && v->ampenv.segment < TSF_SEGMENT_RELEASE) - tsf_voice_end(v, f->outSampleRate); -} - -TSFDEF int tsf_active_voice_count(tsf* f) -{ - int count = 0; - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - for (; v != vEnd; v++) if (v->playingPreset != -1) count++; - return count; -} - -TSFDEF void tsf_render_short(tsf* f, short* buffer, int samples, int flag_mixing) -{ - float *floatSamples; - int channelSamples = (f->outputmode == TSF_MONO ? 1 : 2) * samples, floatBufferSize = channelSamples * sizeof(float); - short* bufferEnd = buffer + channelSamples; - if (floatBufferSize > f->outputSampleSize) - { - TSF_FREE(f->outputSamples); - f->outputSamples = (float*)TSF_MALLOC(floatBufferSize); - f->outputSampleSize = floatBufferSize; - } - - tsf_render_float(f, f->outputSamples, samples, TSF_FALSE); - - floatSamples = f->outputSamples; - if (flag_mixing) - while (buffer != bufferEnd) - { - float v = *floatSamples++; - int vi = *buffer + (v < -1.00004566f ? (int)-32768 : (v > 1.00001514f ? (int)32767 : (int)(v * 32767.5f))); - *buffer++ = (vi < -32768 ? (short)-32768 : (vi > 32767 ? (short)32767 : (short)vi)); - } - else - while (buffer != bufferEnd) - { - float v = *floatSamples++; - *buffer++ = (v < -1.00004566f ? (short)-32768 : (v > 1.00001514f ? (short)32767 : (short)(v * 32767.5f))); - } -} - -TSFDEF void tsf_render_float(tsf* f, float* buffer, int samples, int flag_mixing) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - if (!flag_mixing) TSF_MEMSET(buffer, 0, (f->outputmode == TSF_MONO ? 1 : 2) * sizeof(float) * samples); - for (; v != vEnd; v++) - if (v->playingPreset != -1) - tsf_voice_render(f, v, buffer, samples); -} - -TSFDEF void tsf_render_short_fast(tsf* f, short* buffer, int samples, int flag_mixing) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - if (!flag_mixing) TSF_MEMSET(buffer, 0, (f->outputmode == TSF_MONO ? 1 : 2) * sizeof(short) * samples); - for (; v != vEnd; v++) { - if (v->playingPreset != -1) - tsf_voice_render_fast(f, v, buffer, samples); - yield(); - } -} - - -static void tsf_channel_setup_voice(tsf* f, struct tsf_voice* v) -{ - struct tsf_channel* c = &f->channels->channels[f->channels->activeChannel]; - float newpan = v->region->pan + c->panOffset; - v->playingChannel = f->channels->activeChannel; - v->noteGainDB += c->gainDB; - tsf_voice_calcpitchratio(v, (c->pitchWheel == 8192 ? c->tuning : ((c->pitchWheel / 16383.0f * c->pitchRange * 2.0f) - c->pitchRange + c->tuning)), f->outSampleRate); - if (newpan <= -0.5f) { v->panFactorLeft = 1.0f; v->panFactorRight = 0.0f; } - else if (newpan >= 0.5f) { v->panFactorLeft = 0.0f; v->panFactorRight = 1.0f; } - else { v->panFactorLeft = TSF_SQRTF(0.5f - newpan); v->panFactorRight = TSF_SQRTF(0.5f + newpan); } -} - -static struct tsf_channel* tsf_channel_init(tsf* f, int channel) -{ - int i; - if (f->channels && channel < f->channels->channelNum) return &f->channels->channels[channel]; - if (!f->channels) - { - f->channels = (struct tsf_channels*)TSF_MALLOC(sizeof(struct tsf_channels)); - f->channels->setupVoice = &tsf_channel_setup_voice; - f->channels->channels = NULL; - f->channels->channelNum = 0; - f->channels->activeChannel = 0; - } - i = f->channels->channelNum; - f->channels->channelNum = channel + 1; - f->channels->channels = (struct tsf_channel*)TSF_REALLOC(f->channels->channels, f->channels->channelNum * sizeof(struct tsf_channel)); - for (; i <= channel; i++) - { - struct tsf_channel* c = &f->channels->channels[i]; - c->presetIndex = c->bank = 0; - c->pitchWheel = c->midiPan = 8192; - c->midiVolume = c->midiExpression = 16383; - c->midiRPN = 0xFFFF; - c->midiData = 0; - c->panOffset = 0.0f; - c->gainDB = 0.0f; - c->pitchRange = 2.0f; - c->tuning = 0.0f; - } - return &f->channels->channels[channel]; -} - -static void tsf_channel_applypitch(tsf* f, int channel, struct tsf_channel* c) -{ - struct tsf_voice *v, *vEnd; - float pitchShift = (c->pitchWheel == 8192 ? c->tuning : ((c->pitchWheel / 16383.0f * c->pitchRange * 2.0f) - c->pitchRange + c->tuning)); - for (v = f->voices, vEnd = v + f->voiceNum; v != vEnd; v++) - if (v->playingChannel == channel && v->playingPreset != -1) - tsf_voice_calcpitchratio(v, pitchShift, f->outSampleRate); -} - -TSFDEF void tsf_channel_set_presetindex(tsf* f, int channel, int preset_index) -{ - tsf_channel_init(f, channel)->presetIndex = (unsigned short)preset_index; -} - -TSFDEF int tsf_channel_set_presetnumber(tsf* f, int channel, int preset_number, int flag_mididrums) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - int preset_index; - if (flag_mididrums) - { - preset_index = tsf_get_presetindex(f, 128 | (c->bank & 0x7FFF), preset_number); - if (preset_index == -1) preset_index = tsf_get_presetindex(f, 128, preset_number); - if (preset_index == -1) preset_index = tsf_get_presetindex(f, 128, 0); - if (preset_index == -1) preset_index = tsf_get_presetindex(f, (c->bank & 0x7FFF), preset_number); - } - else preset_index = tsf_get_presetindex(f, (c->bank & 0x7FFF), preset_number); - if (preset_index == -1) preset_index = tsf_get_presetindex(f, 0, preset_number); - if (preset_index != -1) - { - c->presetIndex = (unsigned short)preset_index; - return 1; - } - return 0; -} - -TSFDEF void tsf_channel_set_bank(tsf* f, int channel, int bank) -{ - tsf_channel_init(f, channel)->bank = (unsigned short)bank; -} - -TSFDEF int tsf_channel_set_bank_preset(tsf* f, int channel, int bank, int preset_number) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - int preset_index = tsf_get_presetindex(f, bank, preset_number); - if (preset_index == -1) return 0; - c->presetIndex = (unsigned short)preset_index; - c->bank = (unsigned short)bank; - return 1; -} - -TSFDEF void tsf_channel_set_pan(tsf* f, int channel, float pan) -{ - struct tsf_voice *v, *vEnd; - for (v = f->voices, vEnd = v + f->voiceNum; v != vEnd; v++) - if (v->playingChannel == channel && v->playingPreset != -1) - { - float newpan = v->region->pan + pan - 0.5f; - if (newpan <= -0.5f) { v->panFactorLeft = 1.0f; v->panFactorRight = 0.0f; } - else if (newpan >= 0.5f) { v->panFactorLeft = 0.0f; v->panFactorRight = 1.0f; } - else { v->panFactorLeft = TSF_SQRTF(0.5f - newpan); v->panFactorRight = TSF_SQRTF(0.5f + newpan); } - } - tsf_channel_init(f, channel)->panOffset = pan - 0.5f; -} - -TSFDEF void tsf_channel_set_volume(tsf* f, int channel, float volume) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - float gainDB = tsf_gainToDecibels(volume), gainDBChange = gainDB - c->gainDB; - struct tsf_voice *v, *vEnd; - if (gainDBChange == 0) return; - for (v = f->voices, vEnd = v + f->voiceNum; v != vEnd; v++) - if (v->playingChannel == channel && v->playingPreset != -1) - v->noteGainDB += gainDBChange; - c->gainDB = gainDB; -} - -TSFDEF void tsf_channel_set_pitchwheel(tsf* f, int channel, int pitch_wheel) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - if (c->pitchWheel == pitch_wheel) return; - c->pitchWheel = (unsigned short)pitch_wheel; - tsf_channel_applypitch(f, channel, c); -} - -TSFDEF void tsf_channel_set_pitchrange(tsf* f, int channel, float pitch_range) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - if (c->pitchRange == pitch_range) return; - c->pitchRange = pitch_range; - if (c->pitchWheel != 8192) tsf_channel_applypitch(f, channel, c); -} - -TSFDEF void tsf_channel_set_tuning(tsf* f, int channel, float tuning) -{ - struct tsf_channel *c = tsf_channel_init(f, channel); - if (c->tuning == tuning) return; - c->tuning = tuning; - tsf_channel_applypitch(f, channel, c); -} - -TSFDEF void tsf_channel_note_on(tsf* f, int channel, int key, float vel) -{ - if (!f->channels || channel >= f->channels->channelNum) return; - f->channels->activeChannel = channel; - tsf_note_on(f, f->channels->channels[channel].presetIndex, key, vel); -} - -TSFDEF void tsf_channel_note_off(tsf* f, int channel, int key) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum, *vMatchFirst = TSF_NULL, *vMatchLast = TSF_NULL; - for (; v != vEnd; v++) - { - //Find the first and last entry in the voices list with matching channel, key and look up the smallest play index - if (v->playingPreset == -1 || v->playingChannel != channel || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE) continue; - else if (!vMatchFirst || v->playIndex < vMatchFirst->playIndex) vMatchFirst = vMatchLast = v; - else if (v->playIndex == vMatchFirst->playIndex) vMatchLast = v; - } - if (!vMatchFirst) return; - for (v = vMatchFirst; v <= vMatchLast; v++) - { - //Stop all voices with matching channel, key and the smallest play index which was enumerated above - if (v != vMatchFirst && v != vMatchLast && - (v->playIndex != vMatchFirst->playIndex || v->playingPreset == -1 || v->playingChannel != channel || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE)) continue; - tsf_voice_end(v, f->outSampleRate); - } -} - -TSFDEF void tsf_channel_note_off_all(tsf* f, int channel) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - for (; v != vEnd; v++) - if (v->playingPreset != -1 && v->playingChannel == channel && v->ampenv.segment < TSF_SEGMENT_RELEASE) - tsf_voice_end(v, f->outSampleRate); -} - -TSFDEF void tsf_channel_sounds_off_all(tsf* f, int channel) -{ - struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; - for (; v != vEnd; v++) - if (v->playingPreset != -1 && v->playingChannel == channel && (v->ampenv.segment < TSF_SEGMENT_RELEASE || v->ampenv.parameters.release)) - tsf_voice_endquick(v, f->outSampleRate); -} - -TSFDEF void tsf_channel_midi_control(tsf* f, int channel, int controller, int control_value) -{ - struct tsf_channel* c = tsf_channel_init(f, channel); - switch (controller) - { - case 7 /*VOLUME_MSB*/ : c->midiVolume = (unsigned short)((c->midiVolume & 0x7F ) | (control_value << 7)); goto TCMC_SET_VOLUME; - case 39 /*VOLUME_LSB*/ : c->midiVolume = (unsigned short)((c->midiVolume & 0x3F80) | control_value); goto TCMC_SET_VOLUME; - case 11 /*EXPRESSION_MSB*/ : c->midiExpression = (unsigned short)((c->midiExpression & 0x7F ) | (control_value << 7)); goto TCMC_SET_VOLUME; - case 43 /*EXPRESSION_LSB*/ : c->midiExpression = (unsigned short)((c->midiExpression & 0x3F80) | control_value); goto TCMC_SET_VOLUME; - case 10 /*PAN_MSB*/ : c->midiPan = (unsigned short)((c->midiPan & 0x7F ) | (control_value << 7)); goto TCMC_SET_PAN; - case 42 /*PAN_LSB*/ : c->midiPan = (unsigned short)((c->midiPan & 0x3F80) | control_value); goto TCMC_SET_PAN; - case 6 /*DATA_ENTRY_MSB*/ : c->midiData = (unsigned short)((c->midiData & 0x7F) | (control_value << 7)); goto TCMC_SET_DATA; - case 38 /*DATA_ENTRY_LSB*/ : c->midiData = (unsigned short)((c->midiData & 0x3F80) | control_value); goto TCMC_SET_DATA; - case 0 /*BANK_SELECT_MSB*/ : c->bank = (unsigned short)(0x8000 | control_value); return; //bank select MSB alone acts like LSB - case 32 /*BANK_SELECT_LSB*/ : c->bank = (unsigned short)((c->bank & 0x8000 ? ((c->bank & 0x7F) << 7) : 0) | control_value); return; - case 101 /*RPN_MSB*/ : c->midiRPN = (unsigned short)(((c->midiRPN == 0xFFFF ? 0 : c->midiRPN) & 0x7F ) | (control_value << 7)); return; - case 100 /*RPN_LSB*/ : c->midiRPN = (unsigned short)(((c->midiRPN == 0xFFFF ? 0 : c->midiRPN) & 0x3F80) | control_value); return; - case 98 /*NRPN_LSB*/ : c->midiRPN = 0xFFFF; return; - case 99 /*NRPN_MSB*/ : c->midiRPN = 0xFFFF; return; - case 120 /*ALL_SOUND_OFF*/ : tsf_channel_sounds_off_all(f, channel); return; - case 123 /*ALL_NOTES_OFF*/ : tsf_channel_note_off_all(f, channel); return; - case 121 /*ALL_CTRL_OFF*/ : - c->midiVolume = c->midiExpression = 16383; - c->midiPan = 8192; - c->bank = 0; - tsf_channel_set_volume(f, channel, 1.0f); - tsf_channel_set_pan(f, channel, 0.5f); - tsf_channel_set_pitchrange(f, channel, 2.0f); - return; - } - return; -TCMC_SET_VOLUME: - //Raising to the power of 3 seems to result in a decent sounding volume curve for MIDI - tsf_channel_set_volume(f, channel, TSF_POWF((c->midiVolume / 16383.0f) * (c->midiExpression / 16383.0f), 3.0f)); - return; -TCMC_SET_PAN: - tsf_channel_set_pan(f, channel, c->midiPan / 16383.0f); - return; -TCMC_SET_DATA: - if (c->midiRPN == 0) tsf_channel_set_pitchrange(f, channel, (c->midiData >> 7) + 0.01f * (c->midiData & 0x7F)); - else if (c->midiRPN == 1) tsf_channel_set_tuning(f, channel, (int)c->tuning + ((float)c->midiData - 8192.0f) / 8192.0f); //fine tune - else if (c->midiRPN == 2 && controller == 6) tsf_channel_set_tuning(f, channel, ((float)control_value - 64.0f) + (c->tuning - (int)c->tuning)); //coarse tune - return; -} - -TSFDEF int tsf_channel_get_preset_index(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].presetIndex : 0); -} - -TSFDEF int tsf_channel_get_preset_bank(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? (f->channels->channels[channel].bank & 0x7FFF) : 0); -} - -TSFDEF int tsf_channel_get_preset_number(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->presets[f->channels->channels[channel].presetIndex].preset : 0); -} - -TSFDEF float tsf_channel_get_pan(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].panOffset - 0.5f : 0.5f); -} - -TSFDEF float tsf_channel_get_volume(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? tsf_decibelsToGain(f->channels->channels[channel].gainDB) : 1.0f); -} - -TSFDEF int tsf_channel_get_pitchwheel(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].pitchWheel : 8192); -} - -TSFDEF float tsf_channel_get_pitchrange(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].pitchRange : 2.0f); -} - -TSFDEF float tsf_channel_get_tuning(tsf* f, int channel) -{ - return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].tuning : 0.0f); -} - -#ifdef __cplusplus -} -#endif - -#endif //TSF_IMPLEMENTATION +/* TinySoundFont - v0.9 - SoundFont2 synthesizer - https://github.com/schellingb/TinySoundFont + no warranty implied; use at your own risk + Do this: + #define TSF_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + // i.e. it should look like this: + #include ... + #include ... + #define TSF_IMPLEMENTATION + #include "tsf.h" + + [OPTIONAL] #define TSF_NO_STDIO to remove stdio dependency + [OPTIONAL] #define TSF_MALLOC, TSF_REALLOC, and TSF_FREE to avoid stdlib.h + [OPTIONAL] #define TSF_MEMCPY, TSF_MEMSET to avoid string.h + [OPTIONAL] #define TSF_POW, TSF_POWF, TSF_EXPF, TSF_LOG, TSF_TAN, TSF_LOG10, TSF_SQRT to avoid math.h + + NOT YET IMPLEMENTED + - Support for ChorusEffectsSend and ReverbEffectsSend generators + - Better low-pass filter without lowering performance too much + - Support for modulators + + LICENSE (MIT) + + Copyright (C) 2017-2025 Bernhard Schelling + Based on SFZero, Copyright (C) 2012 Steve Folta (https://github.com/stevefolta/SFZero) + + 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. + +*/ + +#pragma GCC push_options +#pragma GCC optimize ("O2") + +#ifndef TSF_INCLUDE_TSF_INL +#define TSF_INCLUDE_TSF_INL + +#ifdef TSF_SAMPLES_SHORT +#include "fastpow.h" +#include "fastlog.h" +#define TSF_POWF fastpow +// Following have almost no impact on performance but can be used if your chip's implementations are bad. +//#define TSF_EXP fastexp +//#define TSF_LOG fastlog +#endif + +#ifdef __cplusplus +extern "C" { +# define CPP_DEFAULT0 = 0 +#else +# define CPP_DEFAULT0 +#endif + +//define this if you want the API functions to be static +#ifdef TSF_STATIC +#define TSFDEF static +#else +#define TSFDEF extern +#endif + +// Define this to disable any load infra and use a precompiled SF2 header +#ifdef TSF_CONST_FILE +#define TSF_CONST const +#else +#define TSF_CONST +#endif + +// Define this to use 16 fixed point samples instead of floating point +//#define TSF_SAMPLES_SHORT + +// The load functions will return a pointer to a struct tsf which all functions +// thereafter take as the first parameter. +// On error the tsf_load* functions will return NULL most likely due to invalid +// data (or if the file did not exist in tsf_load_filename). +typedef struct tsf tsf; + +#ifndef TSF_CONST_FILE +#ifndef TSF_NO_STDIO +// Directly load a SoundFont from a .sf2 file path +TSFDEF tsf* tsf_load_filename(const char* filename); +#endif + +// Load a SoundFont from a block of memory +TSFDEF tsf* tsf_load_memory(const void* buffer, int size); +#endif + +// Stream structure for the generic loading +struct tsf_stream +{ + // Custom data given to the functions as the first parameter + void* data; + + // Function pointer will be called to read 'size' bytes into ptr (returns number of read bytes) + int (*read)(void* data, void* ptr, unsigned int size); + + // Function pointer will be called to skip ahead over 'count' bytes (returns 1 on success, 0 on error) + int (*skip)(void* data, unsigned int count); +}; + +#ifndef TSF_CONST_FILE +// Generic SoundFont loading method using the stream structure above +TSFDEF tsf* tsf_load(struct tsf_stream* stream); +#endif + +// Copy a tsf instance from an existing one, use tsf_close to close it as well. +// All copied tsf instances and their original instance are linked, and share the underlying soundfont. +// This allows loading a soundfont only once, but using it for multiple independent playbacks. +// (This function isn't thread-safe without locking.) +TSFDEF tsf* tsf_copy(tsf* f); + +// Free the memory related to this tsf instance +TSFDEF void tsf_close(tsf* f); + +// Stop all playing notes immediately and reset all channel parameters +TSFDEF void tsf_reset(tsf* f); + +// Returns the preset index from a bank and preset number, or -1 if it does not exist in the loaded SoundFont +TSFDEF int tsf_get_presetindex(const tsf* f, int bank, int preset_number); + +// Returns the number of presets in the loaded SoundFont +TSFDEF int tsf_get_presetcount(const tsf* f); + +// Returns the name of a preset index >= 0 and < tsf_get_presetcount() +TSFDEF const char* tsf_get_presetname(const tsf* f, int preset_index); + +// Returns the name of a preset by bank and preset number +TSFDEF const char* tsf_bank_get_presetname(const tsf* f, int bank, int preset_number); + +// Supported output modes by the render methods +enum TSFOutputMode +{ + // Two channels with single left/right samples one after another + TSF_STEREO_INTERLEAVED, + // Two channels with all samples for the left channel first then right + TSF_STEREO_UNWEAVED, + // A single channel (stereo instruments are mixed into center) + TSF_MONO +}; + +// Thread safety: +// +// 1. Rendering / voices: +// +// Your audio output which calls the tsf_render* functions will most likely +// run on a different thread than where the playback tsf_note* functions +// are called. In which case some sort of concurrency control like a +// mutex needs to be used so they are not called at the same time. +// Alternatively, you can pre-allocate a maximum number of voices that can +// play simultaneously by calling tsf_set_max_voices after loading. +// That way memory re-allocation will not happen during tsf_note_on and +// TSF should become mostly thread safe. +// There is a theoretical chance that ending notes would negatively influence +// a voice that is rendering at the time but it is hard to say. +// Also be aware, this has not been tested much. +// +// 2. Channels: +// +// Calls to tsf_channel_set_... functions may allocate new channels +// if no channel with that number was previously used. Make sure to +// create all channels at the beginning as required if you call tsf_render* +// from a different thread. + +// Setup the parameters for the voice render methods +// outputmode: if mono or stereo and how stereo channel data is ordered +// samplerate: the number of samples per second (output frequency) +// global_gain_db: volume gain in decibels (>0 means higher, <0 means lower) +TSFDEF void tsf_set_output(tsf* f, enum TSFOutputMode outputmode, int samplerate, float global_gain_db CPP_DEFAULT0); + +// Set the global gain as a volume factor +// global_gain: the desired volume where 1.0 is 100% +TSFDEF void tsf_set_volume(tsf* f, float global_gain); + +// Set the maximum number of voices to play simultaneously +// Depending on the soundfond, one note can cause many new voices to be started, +// so don't keep this number too low or otherwise sounds may not play. +// max_voices: maximum number to pre-allocate and set the limit to +// (tsf_set_max_voices returns 0 if allocation failed, otherwise 1) +TSFDEF int tsf_set_max_voices(tsf* f, int max_voices); + +// Start playing a note +// preset_index: preset index >= 0 and < tsf_get_presetcount() +// key: note value between 0 and 127 (60 being middle C) +// vel: velocity as a float between 0.0 (equal to note off) and 1.0 (full) +// bank: instrument bank number (alternative to preset_index) +// preset_number: preset number (alternative to preset_index) +// (tsf_note_on returns 0 if the allocation of a new voice failed, otherwise 1) +// (tsf_bank_note_on returns 0 if preset does not exist or allocation failed, otherwise 1) +TSFDEF int tsf_note_on(tsf* f, int preset_index, int key, float vel); +TSFDEF int tsf_bank_note_on(tsf* f, int bank, int preset_number, int key, float vel); + +// Stop playing a note +// (bank_note_off returns 0 if preset does not exist, otherwise 1) +TSFDEF void tsf_note_off(tsf* f, int preset_index, int key); +TSFDEF int tsf_bank_note_off(tsf* f, int bank, int preset_number, int key); + +// Stop playing all notes (end with sustain and release) +TSFDEF void tsf_note_off_all(tsf* f); + +// Returns the number of active voices +TSFDEF int tsf_active_voice_count(tsf* f); + +// Render output samples into a buffer +// You can either render as signed 16-bit values (tsf_render_short) or +// as 32-bit float values (tsf_render_float) +// buffer: target buffer of size samples * output_channels * sizeof(type) +// samples: number of samples to render +// flag_mixing: if 0 clear the buffer first, otherwise mix into existing data +#ifndef TSF_SAMPLES_SHORT +TSFDEF void tsf_render_short(tsf* f, short* buffer, int samples, int flag_mixing CPP_DEFAULT0); +#else +// The short render needs space for a long (32b) for all samples, so pass in a buffer of 2x the expected size. Only the first `samples` samples will be valid on return +TSFDEF void tsf_render_short_2x_buffer(tsf* f, short* buffer_2x, int samples, int flag_mixing CPP_DEFAULT0); +#endif +TSFDEF void tsf_render_float(tsf* f, float* buffer, int samples, int flag_mixing CPP_DEFAULT0); + +// Higher level channel based functions, set up channel parameters +// channel: channel number +// preset_index: preset index >= 0 and < tsf_get_presetcount() +// preset_number: preset number (alternative to preset_index) +// flag_mididrums: 0 for normal channels, otherwise apply MIDI drum channel rules +// bank: instrument bank number (alternative to preset_index) +// pan: stereo panning value from 0.0 (left) to 1.0 (right) (default 0.5 center) +// volume: linear volume scale factor (default 1.0 full) +// pitch_wheel: pitch wheel position 0 to 16383 (default 8192 unpitched) +// pitch_range: range of the pitch wheel in semitones (default 2.0, total +/- 2 semitones) +// tuning: tuning of all playing voices in semitones (default 0.0, standard (A440) tuning) +// flag_sustain: 0 to end notes that were held sustained and disable holding sustain otherwise enable it +// (tsf_set_preset_number and set_bank_preset return 0 if preset does not exist, otherwise 1) +// (tsf_channel_set_... return 0 if a new channel needed allocation and that failed, otherwise 1) +TSFDEF int tsf_channel_set_presetindex(tsf* f, int channel, int preset_index); +TSFDEF int tsf_channel_set_presetnumber(tsf* f, int channel, int preset_number, int flag_mididrums CPP_DEFAULT0); +TSFDEF int tsf_channel_set_bank(tsf* f, int channel, int bank); +TSFDEF int tsf_channel_set_bank_preset(tsf* f, int channel, int bank, int preset_number); +TSFDEF int tsf_channel_set_pan(tsf* f, int channel, float pan); +TSFDEF int tsf_channel_set_volume(tsf* f, int channel, float volume); +TSFDEF int tsf_channel_set_pitchwheel(tsf* f, int channel, int pitch_wheel); +TSFDEF int tsf_channel_set_pitchrange(tsf* f, int channel, float pitch_range); +TSFDEF int tsf_channel_set_tuning(tsf* f, int channel, float tuning); +TSFDEF int tsf_channel_set_sustain(tsf* f, int channel, int flag_sustain); + +// Start or stop playing notes on a channel (needs channel preset to be set) +// channel: channel number +// key: note value between 0 and 127 (60 being middle C) +// vel: velocity as a float between 0.0 (equal to note off) and 1.0 (full) +// (tsf_channel_note_on returns 0 on allocation failure of new voice, otherwise 1) +TSFDEF int tsf_channel_note_on(tsf* f, int channel, int key, float vel); +TSFDEF void tsf_channel_note_off(tsf* f, int channel, int key); +TSFDEF void tsf_channel_note_off_all(tsf* f, int channel); //end with sustain and release +TSFDEF void tsf_channel_sounds_off_all(tsf* f, int channel); //end immediately + +// Apply a MIDI control change to the channel (not all controllers are supported!) +// (tsf_channel_midi_control returns 0 on allocation failure of new channel, otherwise 1) +TSFDEF int tsf_channel_midi_control(tsf* f, int channel, int controller, int control_value); + +// Get current values set on the channels +TSFDEF int tsf_channel_get_preset_index(tsf* f, int channel); +TSFDEF int tsf_channel_get_preset_bank(tsf* f, int channel); +TSFDEF int tsf_channel_get_preset_number(tsf* f, int channel); +TSFDEF float tsf_channel_get_pan(tsf* f, int channel); +TSFDEF float tsf_channel_get_volume(tsf* f, int channel); +TSFDEF int tsf_channel_get_pitchwheel(tsf* f, int channel); +TSFDEF float tsf_channel_get_pitchrange(tsf* f, int channel); +TSFDEF float tsf_channel_get_tuning(tsf* f, int channel); + +#ifdef __cplusplus +# undef CPP_DEFAULT0 +} +#endif + +// end header +// --------------------------------------------------------------------------------------------------------- +#endif //TSF_INCLUDE_TSF_INL + +#if defined(TSF_IMPLEMENTATION) || defined(TSF_HEADER) + +#ifdef TSF_SAMPLES_SHORT +#if defined(ARDUINO_ARCH_RP2040) && defined(PICO_RP2350) +#elif defined(PICO_RP2350) || defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32H4) || defined(CONFIG_IDF_TARGET_ESP32P4) // per https://developer.espressif.com/blog/2025/10/cores_with_fpu/ +#define TSF_RENDER_EFFECTSAMPLEBLOCK 64 // FPU +#else +#define TSF_RENDER_EFFECTSAMPLEBLOCK 256 // No FPU, can't run the analog oscillators too often +#endif +#endif + +// The lower this block size is the more accurate the effects are. +// Increasing the value significantly lowers the CPU usage of the voice rendering. +// If LFO affects the low-pass filter it can be hearable even as low as 8. +#ifndef TSF_RENDER_EFFECTSAMPLEBLOCK +#define TSF_RENDER_EFFECTSAMPLEBLOCK 64 +#endif + +// When using tsf_render_short, to do the conversion a buffer of a fixed size is +// allocated on the stack. On low memory platforms this could be made smaller. +// Increasing this above 512 should not have a significant impact on performance. +// The value should be a multiple of TSF_RENDER_EFFECTSAMPLEBLOCK. +#ifndef TSF_RENDER_SHORTBUFFERBLOCK +#define TSF_RENDER_SHORTBUFFERBLOCK 512 +#endif + +// Grace release time for quick voice off (avoid clicking noise) +#define TSF_FASTRELEASETIME 0.01f + +#if !defined(TSF_MALLOC) || !defined(TSF_FREE) || !defined(TSF_REALLOC) +# include +# define TSF_MALLOC malloc +# define TSF_FREE free +# define TSF_REALLOC realloc +#endif + +#if !defined(TSF_MEMCPY) || !defined(TSF_MEMSET) +# include +# define TSF_MEMCPY memcpy +# define TSF_MEMSET memset +#endif + +#if !defined(TSF_POW) || !defined(TSF_POWF) || !defined(TSF_EXPF) || !defined(TSF_LOG) || !defined(TSF_TAN) || !defined(TSF_LOG10) || !defined(TSF_SQRT) +# include +# if !defined(__cplusplus) && !defined(NAN) && !defined(powf) && !defined(expf) && !defined(sqrtf) +# define powf (float)pow // deal with old math.h +# define expf (float)exp // files that come without +# define sqrtf (float)sqrt // powf, expf and sqrtf +# endif +# define TSF_POW pow +#ifndef TSF_POWF +# define TSF_POWF powf +#endif +#ifndef TSF_EXPF +# define TSF_EXPF expf +#endif +#ifndef TSF_LOG +# define TSF_LOG log +#endif +# define TSF_TAN tan +# define TSF_LOG10 log10 +# define TSF_SQRTF sqrtf +#endif + +#ifndef TSF_NO_STDIO +# include +#endif + +#define TSF_TRUE 1 +#define TSF_FALSE 0 +#define TSF_BOOL unsigned char +#define TSF_PI 3.14159265358979323846264338327950288 +#define TSF_NULL 0 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef char tsf_fourcc[4]; +typedef signed char tsf_s8; +typedef unsigned char tsf_u8; +typedef unsigned short tsf_u16; +typedef signed short tsf_s16; +typedef unsigned int tsf_u32; +typedef char tsf_char20[20]; + +#ifdef TSF_SAMPLES_SHORT +#include +typedef int64_t fixed32p32; +typedef int32_t fixed30p2; +typedef int32_t fixed24p8; +typedef int32_t fixed16p16; +typedef int32_t fixed8p24; +#endif + + +#define TSF_FourCCEquals(value1, value2) (value1[0] == value2[0] && value1[1] == value2[1] && value1[2] == value2[2] && value1[3] == value2[3]) + +struct tsf +{ + TSF_CONST struct tsf_preset* presets; +#ifndef TSF_SAMPLES_SHORT + TSF_CONST float* fontSamples; +#else + TSF_CONST short* shortSamples; +#endif + int samplesNum; + struct tsf_voice* voices; + struct tsf_channels* channels; + + int presetNum; + int voiceNum; + int maxVoiceNum; + unsigned int voicePlayIndex; + + enum TSFOutputMode outputmode; +#ifndef TSF_SAMPLES_SHORT + float outSampleRate; +#else + int outSampleRate; +#endif + float globalGainDB; + int* refCount; +}; + +#ifndef TSF_CONST_FILE +#ifndef TSF_NO_STDIO +static int tsf_stream_stdio_read(FILE* f, void* ptr, unsigned int size) { return (int)fread(ptr, 1, size, f); } +static int tsf_stream_stdio_skip(FILE* f, unsigned int count) { return !fseek(f, count, SEEK_CUR); } +TSFDEF tsf* tsf_load_filename(const char* filename) +{ + tsf* res; + struct tsf_stream stream = { TSF_NULL, (int(*)(void*,void*,unsigned int))&tsf_stream_stdio_read, (int(*)(void*,unsigned int))&tsf_stream_stdio_skip }; + #if __STDC_WANT_SECURE_LIB__ + FILE* f = TSF_NULL; fopen_s(&f, filename, "rb"); + #else + FILE* f = fopen(filename, "rb"); + #endif + if (!f) + { + //if (e) *e = TSF_FILENOTFOUND; + return TSF_NULL; + } + stream.data = f; + res = tsf_load(&stream); + fclose(f); + return res; +} +#endif + +struct tsf_stream_memory { const char* buffer; unsigned int total, pos; }; +static int tsf_stream_memory_read(struct tsf_stream_memory* m, void* ptr, unsigned int size) { if (size > m->total - m->pos) size = m->total - m->pos; TSF_MEMCPY(ptr, m->buffer+m->pos, size); m->pos += size; return size; } +static int tsf_stream_memory_skip(struct tsf_stream_memory* m, unsigned int count) { if (m->pos + count > m->total) return 0; m->pos += count; return 1; } +TSFDEF tsf* tsf_load_memory(const void* buffer, int size) +{ + struct tsf_stream stream = { TSF_NULL, (int(*)(void*,void*,unsigned int))&tsf_stream_memory_read, (int(*)(void*,unsigned int))&tsf_stream_memory_skip }; + struct tsf_stream_memory f = { 0, 0, 0 }; + f.buffer = (const char*)buffer; + f.total = size; + stream.data = &f; + return tsf_load(&stream); +} +#endif + +enum { TSF_LOOPMODE_NONE, TSF_LOOPMODE_CONTINUOUS, TSF_LOOPMODE_SUSTAIN }; + +enum { TSF_SEGMENT_NONE, TSF_SEGMENT_DELAY, TSF_SEGMENT_ATTACK, TSF_SEGMENT_HOLD, TSF_SEGMENT_DECAY, TSF_SEGMENT_SUSTAIN, TSF_SEGMENT_RELEASE, TSF_SEGMENT_DONE }; + +struct tsf_hydra +{ + struct tsf_hydra_phdr *phdrs; struct tsf_hydra_pbag *pbags; struct tsf_hydra_pmod *pmods; + struct tsf_hydra_pgen *pgens; struct tsf_hydra_inst *insts; struct tsf_hydra_ibag *ibags; + struct tsf_hydra_imod *imods; struct tsf_hydra_igen *igens; struct tsf_hydra_shdr *shdrs; + int phdrNum, pbagNum, pmodNum, pgenNum, instNum, ibagNum, imodNum, igenNum, shdrNum; +}; + +union tsf_hydra_genamount { struct { tsf_u8 lo, hi; } range; tsf_s16 shortAmount; tsf_u16 wordAmount; }; +struct tsf_hydra_phdr { tsf_char20 presetName; tsf_u16 preset, bank, presetBagNdx; tsf_u32 library, genre, morphology; }; +struct tsf_hydra_pbag { tsf_u16 genNdx, modNdx; }; +struct tsf_hydra_pmod { tsf_u16 modSrcOper, modDestOper; tsf_s16 modAmount; tsf_u16 modAmtSrcOper, modTransOper; }; +struct tsf_hydra_pgen { tsf_u16 genOper; union tsf_hydra_genamount genAmount; }; +struct tsf_hydra_inst { tsf_char20 instName; tsf_u16 instBagNdx; }; +struct tsf_hydra_ibag { tsf_u16 instGenNdx, instModNdx; }; +struct tsf_hydra_imod { tsf_u16 modSrcOper, modDestOper; tsf_s16 modAmount; tsf_u16 modAmtSrcOper, modTransOper; }; +struct tsf_hydra_igen { tsf_u16 genOper; union tsf_hydra_genamount genAmount; }; +struct tsf_hydra_shdr { tsf_char20 sampleName; tsf_u32 start, end, startLoop, endLoop, sampleRate; tsf_u8 originalPitch; tsf_s8 pitchCorrection; tsf_u16 sampleLink, sampleType; }; + +#ifndef TSF_CONST_FILE +#define TSFR(FIELD) stream->read(stream->data, &i->FIELD, sizeof(i->FIELD)); +static void tsf_hydra_read_phdr(struct tsf_hydra_phdr* i, struct tsf_stream* stream) { TSFR(presetName) TSFR(preset) TSFR(bank) TSFR(presetBagNdx) TSFR(library) TSFR(genre) TSFR(morphology) } +static void tsf_hydra_read_pbag(struct tsf_hydra_pbag* i, struct tsf_stream* stream) { TSFR(genNdx) TSFR(modNdx) } +static void tsf_hydra_read_pmod(struct tsf_hydra_pmod* i, struct tsf_stream* stream) { TSFR(modSrcOper) TSFR(modDestOper) TSFR(modAmount) TSFR(modAmtSrcOper) TSFR(modTransOper) } +static void tsf_hydra_read_pgen(struct tsf_hydra_pgen* i, struct tsf_stream* stream) { TSFR(genOper) TSFR(genAmount) } +static void tsf_hydra_read_inst(struct tsf_hydra_inst* i, struct tsf_stream* stream) { TSFR(instName) TSFR(instBagNdx) } +static void tsf_hydra_read_ibag(struct tsf_hydra_ibag* i, struct tsf_stream* stream) { TSFR(instGenNdx) TSFR(instModNdx) } +static void tsf_hydra_read_imod(struct tsf_hydra_imod* i, struct tsf_stream* stream) { TSFR(modSrcOper) TSFR(modDestOper) TSFR(modAmount) TSFR(modAmtSrcOper) TSFR(modTransOper) } +static void tsf_hydra_read_igen(struct tsf_hydra_igen* i, struct tsf_stream* stream) { TSFR(genOper) TSFR(genAmount) } +static void tsf_hydra_read_shdr(struct tsf_hydra_shdr* i, struct tsf_stream* stream) { TSFR(sampleName) TSFR(start) TSFR(end) TSFR(startLoop) TSFR(endLoop) TSFR(sampleRate) TSFR(originalPitch) TSFR(pitchCorrection) TSFR(sampleLink) TSFR(sampleType) } +#undef TSFR +#endif + +struct tsf_riffchunk { tsf_fourcc id; tsf_u32 size; }; +struct tsf_envelope { float delay, attack, hold, decay, sustain, release, keynumToHold, keynumToDecay; }; +struct tsf_voice_envelope { unsigned char segment, segmentIsExponential : 1, isAmpEnv : 1; short midiVelocity; float level, slope; int samplesUntilNextSegment; struct tsf_envelope parameters; }; +#ifndef TSF_SAMPLES_SHORT +struct tsf_voice_lowpass { double QInv, a0, a1, b1, b2, z1, z2; TSF_BOOL active; }; +struct tsf_voice_lfo { int samplesUntil; float level, delta; }; +#else +struct tsf_voice_lfo { int samplesUntil; fixed16p16 levelF16P16, deltaF16P16; }; +#endif + +struct tsf_region +{ + int loop_mode; + unsigned int sample_rate; +#ifdef TSF_SAMPLES_SHORT // In flash, ESP8266 only can read 32b w/o help + unsigned int lokey, hikey, lovel, hivel; +#else + unsigned char lokey, hikey, lovel, hivel; +#endif + unsigned int group, offset, end, loop_start, loop_end; + int transpose, tune, pitch_keycenter, pitch_keytrack; + float attenuation, pan; +#ifdef TSF_SAMPLES_SHORT + fixed16p16 attenuationF16P16, panF16P16; +#endif + struct tsf_envelope ampenv, modenv; + int initialFilterQ, initialFilterFc; + int modEnvToPitch, modEnvToFilterFc, modLfoToFilterFc, modLfoToVolume; + float delayModLFO; + int freqModLFO, modLfoToPitch; + float delayVibLFO; + int freqVibLFO, vibLfoToPitch; +}; + +struct tsf_preset +{ + tsf_char20 presetName; +#ifdef TSF_SAMPLES_SHORT // In flash, ESP8266 only can read 32b w/o help + tsf_u32 preset, bank; +#else + tsf_u16 preset, bank; +#endif + TSF_CONST struct tsf_region* regions; + int regionNum; +}; + +struct tsf_voice +{ + int playingPreset, playingKey, playingChannel, heldSustain; + TSF_CONST struct tsf_region* region; +#ifndef TSF_SAMPLES_SHORT + double pitchInputTimecents, pitchOutputFactor; + double sourceSamplePosition; +#else + float pitchInputTimecents, pitchOutputFactor; + fixed24p8 sourceSamplePositionF24P8; +#endif + float noteGainDB; +#ifndef TSF_SAMPLES_SHORT + float panFactorLeft, panFactorRight; +#else + fixed16p16 panFactorLeftF16P16, panFactorRightF16P16; +#endif + unsigned int playIndex, loopStart, loopEnd; + struct tsf_voice_envelope ampenv, modenv; +#ifndef TSF_SAMPLES_SHORT + struct tsf_voice_lowpass lowpass; +#endif + struct tsf_voice_lfo modlfo, viblfo; +}; + +struct tsf_channel +{ + unsigned short presetIndex, bank, pitchWheel, midiPan, midiVolume, midiExpression, midiRPN, midiData : 14, sustain : 1; +#ifndef TSF_SAMPLES_SHORT + float panOffset, gainDB, pitchRange, tuning; +#else + fixed16p16 panOffsetF16P16; + float gainDB, pitchRange, tuning; +#endif +}; + +struct tsf_channels +{ + void (*setupVoice)(tsf* f, struct tsf_voice* voice); + int channelNum, activeChannel; + struct tsf_channel channels[1]; +}; + +#ifdef __cplusplus +# undef CPP_DEFAULT0 +} +#endif + +#endif // IMPL || HEADER + +#ifdef TSF_IMPLEMENTATION +#undef TSF_IMPLEMENTATION + +#ifdef __cplusplus +extern "C" { +# define CPP_DEFAULT0 = 0 +#else +# define CPP_DEFAULT0 +#endif + +#ifndef TSF_SAMPLES_SHORT +static double tsf_timecents2Secsd(double timecents) { return TSF_POW(2.0, timecents / 1200.0); } +#else +static float tsf_timecents2Secsd(float timecents) { return TSF_POWF(2.0f, timecents / 1200.0f); } +#endif +static float tsf_timecents2Secsf(float timecents) { return TSF_POWF(2.0f, timecents / 1200.0f); } +static float tsf_cents2Hertz(float cents) { return 8.176f * TSF_POWF(2.0f, cents / 1200.0f); } +static float tsf_decibelsToGain(float db) { return (db > -100.f ? TSF_POWF(10.0f, db * 0.05f) : 0); } +static float tsf_gainToDecibels(float gain) { return (gain <= .00001f ? -100.f : (float)(20.0 * TSF_LOG10(gain))); } +#ifdef TSF_SAMPLES_SHORT +static const size_t tsf_db2gain_sz = 57; +static const fixed16p16 tsf_db2gain_in [] PROGMEM = {-6553600, -5898240, -5242880, -4587520, -3932160, -3276800, -2621440, -1966080, -1310720, -1245184, -1179648, -1114112, -1048576, -983040, -917504, -851968, -786432, -720896, -655360, -589824, -524288, -458752, -393216, -327680, -262144, -196608, -131072, -65536, 0, 65536, 131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, 655360, 720896, 786432, 851968, 917504, 983040, 1048576, 1114112, 1179648, 1245184, 1310720, 1376256, 1441792, 1507328, 1572864, 1638400, 1966080, 2293760, 2621440, }; +static const fixed16p16 tsf_db2gain_inv [] PROGMEM = {6553, 6553, 6553, 6553, 6553, 6553, 6553, 6553, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 13107, 13107, 13107, 0, }; +static const fixed16p16 tsf_db2gain_out [] PROGMEM = {0, 2, 6, 20, 65, 207, 655, 2072, 6553, 7353, 8250, 9257, 10386, 11654, 13076, 14671, 16461, 18470, 20724, 23253, 26090, 29273, 32845, 36853, 41350, 46395, 52057, 58409, 65536, 73532, 82504, 92572, 103867, 116541, 130761, 146716, 164618, 184705, 207243, 232530, 260903, 292738, 328458, 368536, 413504, 463959, 520570, 584090, 655360, 735325, 825049, 925720, 1038675, 1165413, 2072430, 3685360, 6553600, }; +static const size_t tsf_gain2db_sz = 85; +static const fixed16p16 tsf_gain2db_in [] PROGMEM = {0, 1, 1, 2, 3, 5, 8, 12, 19, 28, 43, 64, 96, 144, 217, 326, 489, 734, 1102, 1652, 2479, 3719, 5579, 8368, 9205, 10125, 11138, 12251, 13477, 14824, 16307, 17937, 19732, 21704, 23875, 26263, 28889, 31778, 34956, 38451, 42296, 46527, 51179, 56297, 61927, 68120, 74931, 82425, 90667, 99734, 109707, 120678, 132747, 146021, 160623, 176686, 194354, 213790, 235169, 258686, 284554, 313010, 344311, 378742, 416616, 458278, 504106, 554516, 609968, 762460, 953075, 1191344, 1489179, 1861475, 2326844, 2908555, 3635693, 4544617, 5680771, 7100964, 8876205, 11095256, 13869070, 17336338, 21670422, }; +static const fixed16p16 tsf_gain2db_inv [] PROGMEM = {-2147483648, -2147483648, -2147483648, -2147483648, -2147483648, 1638400000, 1092266624, 655360064, 436906656, 297890880, 204800000, 131072008, 89775328, 59041452, 39479512, 26319680, 17522994, 11681996, 7801906, 5197145, 3463847, 2309232, 1539849, 5132029, 4667808, 4239064, 3857329, 3504598, 3187549, 2897258, 2634082, 2393572, 2177276, 1978743, 1798462, 1635537, 1486751, 1351536, 1228646, 1117027, 1015275, 923171, 839236, 762845, 693575, 630517, 573168, 521078, 473697, 430647, 391493, 355884, 323554, 294133, 267384, 243085, 220987, 200895, 182632, 166031, 150935, 137216, 124740, 113401, 103090, 93719, 85200, 77453, 28165, 22532, 18025, 14420, 11536, 9229, 7383, 5906, 4725, 3780, 3024, 2419, 1935, 1548, 1238, 990, 0, }; +static const fixed16p16 tsf_gain2db_out [] PROGMEM = {-6553600, -6159034, -5928227, -5764468, -5533661, -5302855, -5093532, -4877512, -4636805, -4399493, -4168687, -3943660, -3708994, -3480758, -3249094, -3018287, -2787481, -2556421, -2325445, -2094864, -1864058, -1633201, -1402362, -1171578, -1117319, -1063087, -1008799, -954564, -900295, -846054, -791802, -737554, -683283, -629044, -574788, -520521, -466273, -412021, -357767, -303512, -249261, -194998, -140748, -86496, -32238, 22013, 76266, 130522, 184775, 239030, 293284, 347538, 401794, 456047, 510301, 564557, 618811, 673065, 727319, 781573, 835827, 890082, 944335, 998590, 1052844, 1107098, 1161353, 1215607, 1269861, 1396883, 1523904, 1650927, 1777948, 1904970, 2031992, 2159014, 2286036, 2413058, 2540080, 2667102, 2794124, 2921145, 3048167, 3175189, 3302211, }; +static const size_t tsf_sqrtf_sz = 8; +static const fixed16p16 tsf_sqrtf_in [] PROGMEM = {0, 1310, 3276, 6553, 13107, 19660, 26214, 32768, }; +static const fixed16p16 tsf_sqrtf_inv [] PROGMEM = {3276800, 2184533, 1310720, 655360, 655359, 655360, 655360, 0, }; +static const fixed16p16 tsf_sqrtf_out [] PROGMEM = {0, 9268, 14654, 20724, 29308, 35895, 41448, 46340, }; + + +static fixed16p16 tsf_interpolate_16p16(fixed16p16 db, const fixed16p16 *inx, const fixed16p16 *outfcn, const fixed16p16 *delbainv, const int elements) { + if (db < inx[0]) { + return outfcn[0]; + } + if (db >= inx[elements - 1]) { + return outfcn[elements - 1]; + } + int i; + for (i = 0; i < inx[elements - 2]; i++) { + if (inx[i + 1] > db) { + break; + } + } + fixed32p32 x_a = db - inx[i]; + fixed16p16 fb_fa = outfcn[i + 1] - outfcn[i]; + fixed32p32 out = x_a * fb_fa; + out >>= 16; + out *= delbainv[i]; + out >>= 16; + out += outfcn[i]; + + return out; +} + +static inline fixed16p16 tsf_decibelsToGainF16P16(fixed16p16 db) { return tsf_interpolate_16p16(db, tsf_db2gain_in, tsf_db2gain_out, tsf_db2gain_inv, tsf_db2gain_sz); } +static inline fixed16p16 tsf_gainToDecibelsF16P16(fixed16p16 gain) { return tsf_interpolate_16p16(gain, tsf_gain2db_in, tsf_gain2db_out, tsf_gain2db_inv, tsf_gain2db_sz); } +// Valid from 0...0.5 only since that's the max PAN will use it +static inline fixed16p16 tsf_sqrtF16P16(fixed16p16 v) { return tsf_interpolate_16p16(v, tsf_sqrtf_in, tsf_sqrtf_out, tsf_sqrtf_inv, tsf_sqrtf_sz); } +#endif + +#ifndef TSF_CONST_FILE +static TSF_BOOL tsf_riffchunk_read(struct tsf_riffchunk* parent, struct tsf_riffchunk* chunk, struct tsf_stream* stream) +{ + TSF_BOOL IsRiff, IsList; + if (parent && sizeof(tsf_fourcc) + sizeof(tsf_u32) > parent->size) return TSF_FALSE; + if (!stream->read(stream->data, &chunk->id, sizeof(tsf_fourcc)) || *chunk->id <= ' ' || *chunk->id >= 'z') return TSF_FALSE; + if (!stream->read(stream->data, &chunk->size, sizeof(tsf_u32))) return TSF_FALSE; + if (parent && sizeof(tsf_fourcc) + sizeof(tsf_u32) + chunk->size > parent->size) return TSF_FALSE; + if (parent) parent->size -= sizeof(tsf_fourcc) + sizeof(tsf_u32) + chunk->size; + IsRiff = TSF_FourCCEquals(chunk->id, "RIFF"), IsList = TSF_FourCCEquals(chunk->id, "LIST"); + if (IsRiff && parent) return TSF_FALSE; //not allowed + if (!IsRiff && !IsList) return TSF_TRUE; //custom type without sub type + if (!stream->read(stream->data, &chunk->id, sizeof(tsf_fourcc)) || *chunk->id <= ' ' || *chunk->id >= 'z') return TSF_FALSE; + chunk->size -= sizeof(tsf_fourcc); + return TSF_TRUE; +} + +static void tsf_region_clear(struct tsf_region* i, TSF_BOOL for_relative) +{ + TSF_MEMSET(i, 0, sizeof(struct tsf_region)); + i->hikey = i->hivel = 127; + i->pitch_keycenter = 60; // C4 + if (for_relative) return; + + i->pitch_keytrack = 100; + + i->pitch_keycenter = -1; + + // SF2 defaults in timecents. + i->ampenv.delay = i->ampenv.attack = i->ampenv.hold = i->ampenv.decay = i->ampenv.release = -12000.0f; + i->modenv.delay = i->modenv.attack = i->modenv.hold = i->modenv.decay = i->modenv.release = -12000.0f; + + i->initialFilterFc = 13500; + + i->delayModLFO = -12000.0f; + i->delayVibLFO = -12000.0f; +} + +static void tsf_region_operator(struct tsf_region* region, tsf_u16 genOper, union tsf_hydra_genamount* amount, struct tsf_region* merge_region) +{ + enum + { + _GEN_TYPE_MASK = 0x0F, + GEN_FLOAT = 0x01, + GEN_INT = 0x02, + GEN_UINT_ADD = 0x03, + GEN_UINT_ADD15 = 0x04, + GEN_KEYRANGE = 0x05, + GEN_VELRANGE = 0x06, + GEN_LOOPMODE = 0x07, + GEN_GROUP = 0x08, + GEN_KEYCENTER = 0x09, + + _GEN_LIMIT_MASK = 0xF0, + GEN_INT_LIMIT12K = 0x10, //min -12000, max 12000 + GEN_INT_LIMITFC = 0x20, //min 1500, max 13500 + GEN_INT_LIMITQ = 0x30, //min 0, max 960 + GEN_INT_LIMIT960 = 0x40, //min -960, max 960 + GEN_INT_LIMIT16K4500 = 0x50, //min -16000, max 4500 + GEN_FLOAT_LIMIT12K5K = 0x60, //min -12000, max 5000 + GEN_FLOAT_LIMIT12K8K = 0x70, //min -12000, max 8000 + GEN_FLOAT_LIMIT1200 = 0x80, //min -1200, max 1200 + GEN_FLOAT_LIMITPAN = 0x90, //* .001f, min -.5f, max .5f, + GEN_FLOAT_LIMITATTN = 0xA0, //* .1f, min 0, max 144.0 + GEN_FLOAT_MAX1000 = 0xB0, //min 0, max 1000 + GEN_FLOAT_MAX1440 = 0xC0, //min 0, max 1440 + + _GEN_MAX = 59 + }; + #define _TSFREGIONOFFSET(TYPE, FIELD) (unsigned char)(((TYPE*)&((struct tsf_region*)0)->FIELD) - (TYPE*)0) + #define _TSFREGIONENVOFFSET(TYPE, ENV, FIELD) (unsigned char)(((TYPE*)&((&(((struct tsf_region*)0)->ENV))->FIELD)) - (TYPE*)0) + static const struct { unsigned char mode, offset; } genMetas[_GEN_MAX] = + { + { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, offset ) }, // 0 StartAddrsOffset + { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, end ) }, // 1 EndAddrsOffset + { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_start ) }, // 2 StartloopAddrsOffset + { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_end ) }, // 3 EndloopAddrsOffset + { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, offset ) }, // 4 StartAddrsCoarseOffset + { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToPitch ) }, // 5 ModLfoToPitch + { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, vibLfoToPitch ) }, // 6 VibLfoToPitch + { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToPitch ) }, // 7 ModEnvToPitch + { GEN_INT | GEN_INT_LIMITFC , _TSFREGIONOFFSET( int, initialFilterFc ) }, // 8 InitialFilterFc + { GEN_INT | GEN_INT_LIMITQ , _TSFREGIONOFFSET( int, initialFilterQ ) }, // 9 InitialFilterQ + { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToFilterFc ) }, //10 ModLfoToFilterFc + { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToFilterFc ) }, //11 ModEnvToFilterFc + { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, end ) }, //12 EndAddrsCoarseOffset + { GEN_INT | GEN_INT_LIMIT960 , _TSFREGIONOFFSET( int, modLfoToVolume ) }, //13 ModLfoToVolume + { 0 , (0 ) }, // Unused + { 0 , (0 ) }, //15 ChorusEffectsSend (unsupported) + { 0 , (0 ) }, //16 ReverbEffectsSend (unsupported) + { GEN_FLOAT | GEN_FLOAT_LIMITPAN , _TSFREGIONOFFSET( float, pan ) }, //17 Pan + { 0 , (0 ) }, // Unused + { 0 , (0 ) }, // Unused + { 0 , (0 ) }, // Unused + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayModLFO ) }, //21 DelayModLFO + { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqModLFO ) }, //22 FreqModLFO + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayVibLFO ) }, //23 DelayVibLFO + { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqVibLFO ) }, //24 FreqVibLFO + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, delay ) }, //25 DelayModEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, attack ) }, //26 AttackModEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, hold ) }, //27 HoldModEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, decay ) }, //28 DecayModEnv + { GEN_FLOAT | GEN_FLOAT_MAX1000 , _TSFREGIONENVOFFSET( float, modenv, sustain ) }, //29 SustainModEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, release ) }, //30 ReleaseModEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToHold ) }, //31 KeynumToModEnvHold + { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToDecay) }, //32 KeynumToModEnvDecay + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, delay ) }, //33 DelayVolEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, attack ) }, //34 AttackVolEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, hold ) }, //35 HoldVolEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, decay ) }, //36 DecayVolEnv + { GEN_FLOAT | GEN_FLOAT_MAX1440 , _TSFREGIONENVOFFSET( float, ampenv, sustain ) }, //37 SustainVolEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, release ) }, //38 ReleaseVolEnv + { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToHold ) }, //39 KeynumToVolEnvHold + { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToDecay) }, //40 KeynumToVolEnvDecay + { 0 , (0 ) }, // Instrument (special) + { 0 , (0 ) }, // Reserved + { GEN_KEYRANGE , (0 ) }, //43 KeyRange + { GEN_VELRANGE , (0 ) }, //44 VelRange + { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_start ) }, //45 StartloopAddrsCoarseOffset + { 0 , (0 ) }, //46 Keynum (special) + { 0 , (0 ) }, //47 Velocity (special) + { GEN_FLOAT | GEN_FLOAT_LIMITATTN , _TSFREGIONOFFSET( float, attenuation ) }, //48 InitialAttenuation + { 0 , (0 ) }, // Reserved + { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_end ) }, //50 EndloopAddrsCoarseOffset + { GEN_INT , _TSFREGIONOFFSET( int, transpose ) }, //51 CoarseTune + { GEN_INT , _TSFREGIONOFFSET( int, tune ) }, //52 FineTune + { 0 , (0 ) }, // SampleID (special) + { GEN_LOOPMODE , _TSFREGIONOFFSET( int, loop_mode ) }, //54 SampleModes + { 0 , (0 ) }, // Reserved + { GEN_INT , _TSFREGIONOFFSET( int, pitch_keytrack ) }, //56 ScaleTuning + { GEN_GROUP , _TSFREGIONOFFSET(unsigned int, group ) }, //57 ExclusiveClass + { GEN_KEYCENTER , _TSFREGIONOFFSET( int, pitch_keycenter ) }, //58 OverridingRootKey + }; + #undef _TSFREGIONOFFSET + #undef _TSFREGIONENVOFFSET + if (amount) + { + int offset; + if (genOper >= _GEN_MAX) return; + offset = genMetas[genOper].offset; + switch (genMetas[genOper].mode & _GEN_TYPE_MASK) + { + case GEN_FLOAT: (( float*)region)[offset] = amount->shortAmount; return; + case GEN_INT: (( int*)region)[offset] = amount->shortAmount; return; + case GEN_UINT_ADD: ((unsigned int*)region)[offset] += amount->shortAmount; return; + case GEN_UINT_ADD15: ((unsigned int*)region)[offset] += amount->shortAmount<<15; return; + case GEN_KEYRANGE: region->lokey = amount->range.lo; region->hikey = amount->range.hi; return; + case GEN_VELRANGE: region->lovel = amount->range.lo; region->hivel = amount->range.hi; return; + case GEN_LOOPMODE: region->loop_mode = ((amount->wordAmount&3) == 3 ? TSF_LOOPMODE_SUSTAIN : ((amount->wordAmount&3) == 1 ? TSF_LOOPMODE_CONTINUOUS : TSF_LOOPMODE_NONE)); return; + case GEN_GROUP: region->group = amount->wordAmount; return; + case GEN_KEYCENTER: region->pitch_keycenter = amount->shortAmount; return; + } + } + else //merge regions and clamp values + { + for (genOper = 0; genOper != _GEN_MAX; genOper++) + { + int offset = genMetas[genOper].offset; + switch (genMetas[genOper].mode & _GEN_TYPE_MASK) + { + case GEN_FLOAT: + { + float *val = &((float*)region)[offset], vfactor, vmin, vmax; + *val += ((float*)merge_region)[offset]; + switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) + { + case GEN_FLOAT_LIMIT12K5K: vfactor = 1.0f; vmin = -12000.0f; vmax = 5000.0f; break; + case GEN_FLOAT_LIMIT12K8K: vfactor = 1.0f; vmin = -12000.0f; vmax = 8000.0f; break; + case GEN_FLOAT_LIMIT1200: vfactor = 1.0f; vmin = -1200.0f; vmax = 1200.0f; break; + case GEN_FLOAT_LIMITPAN: vfactor = 0.001f; vmin = -0.5f; vmax = 0.5f; break; + case GEN_FLOAT_LIMITATTN: vfactor = 0.01f; vmin = 0.0f; vmax = 14.4f; break; + case GEN_FLOAT_MAX1000: vfactor = 1.0f; vmin = 0.0f; vmax = 1000.0f; break; + case GEN_FLOAT_MAX1440: vfactor = 1.0f; vmin = 0.0f; vmax = 1440.0f; break; + default: continue; + } + *val *= vfactor; + if (*val < vmin) *val = vmin; + else if (*val > vmax) *val = vmax; + continue; + } + case GEN_INT: + { + int *val = &((int*)region)[offset], vmin, vmax; + *val += ((int*)merge_region)[offset]; + switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) + { + case GEN_INT_LIMIT12K: vmin = -12000; vmax = 12000; break; + case GEN_INT_LIMITFC: vmin = 1500; vmax = 13500; break; + case GEN_INT_LIMITQ: vmin = 0; vmax = 960; break; + case GEN_INT_LIMIT960: vmin = -960; vmax = 960; break; + case GEN_INT_LIMIT16K4500: vmin = -16000; vmax = 4500; break; + default: continue; + } + if (*val < vmin) *val = vmin; + else if (*val > vmax) *val = vmax; + continue; + } + case GEN_UINT_ADD: + { + ((unsigned int*)region)[offset] += ((unsigned int*)merge_region)[offset]; + continue; + } + } + } + } +} +#endif + +#ifndef TSF_CONST_FILE +static void tsf_region_envtosecs(struct tsf_envelope* p, TSF_BOOL sustainIsGain) +{ + // EG times need to be converted from timecents to seconds. + // Pin very short EG segments. Timecents don't get to zero, and our EG is + // happier with zero values. + p->delay = (p->delay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->delay)); + p->attack = (p->attack < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->attack)); + p->release = (p->release < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->release)); + + // If we have dynamic hold or decay times depending on key number we need + // to keep the values in timecents so we can calculate it during startNote + if (!p->keynumToHold) p->hold = (p->hold < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->hold)); + if (!p->keynumToDecay) p->decay = (p->decay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->decay)); + + if (p->sustain < 0.0f) p->sustain = 0.0f; + else if (sustainIsGain) p->sustain = tsf_decibelsToGain(-p->sustain / 10.0f); + else p->sustain = 1.0f - (p->sustain / 1000.0f); +} + +static int tsf_load_presets(tsf* res, struct tsf_hydra *hydra, unsigned int fontSampleCount) +{ + enum { GenInstrument = 41, GenKeyRange = 43, GenVelRange = 44, GenSampleID = 53 }; + // Read each preset. + struct tsf_hydra_phdr *pphdr, *pphdrMax; + res->presetNum = hydra->phdrNum - 1; + res->presets = (struct tsf_preset*)TSF_MALLOC(res->presetNum * sizeof(struct tsf_preset)); + if (!res->presets) return 0; + else { int i; for (i = 0; i != res->presetNum; i++) res->presets[i].regions = TSF_NULL; } + for (pphdr = hydra->phdrs, pphdrMax = pphdr + hydra->phdrNum - 1; pphdr != pphdrMax; pphdr++) + { + int sortedIndex = 0, region_index = 0; + struct tsf_hydra_phdr *otherphdr; + struct tsf_preset* preset; + struct tsf_hydra_pbag *ppbag, *ppbagEnd; + struct tsf_region globalRegion; + for (otherphdr = hydra->phdrs; otherphdr != pphdrMax; otherphdr++) + { + if (otherphdr == pphdr || otherphdr->bank > pphdr->bank) continue; + else if (otherphdr->bank < pphdr->bank) sortedIndex++; + else if (otherphdr->preset > pphdr->preset) continue; + else if (otherphdr->preset < pphdr->preset) sortedIndex++; + else if (otherphdr < pphdr) sortedIndex++; + } + + preset = &res->presets[sortedIndex]; + TSF_MEMCPY(preset->presetName, pphdr->presetName, sizeof(preset->presetName)); + preset->presetName[sizeof(preset->presetName)-1] = '\0'; //should be zero terminated in source file but make sure + preset->bank = pphdr->bank; + preset->preset = pphdr->preset; + preset->regionNum = 0; + + //count regions covered by this preset + for (ppbag = hydra->pbags + pphdr->presetBagNdx, ppbagEnd = hydra->pbags + pphdr[1].presetBagNdx; ppbag != ppbagEnd; ppbag++) + { + unsigned char plokey = 0, phikey = 127, plovel = 0, phivel = 127; + struct tsf_hydra_pgen *ppgen, *ppgenEnd; struct tsf_hydra_inst *pinst; struct tsf_hydra_ibag *pibag, *pibagEnd; struct tsf_hydra_igen *pigen, *pigenEnd; + for (ppgen = hydra->pgens + ppbag->genNdx, ppgenEnd = hydra->pgens + ppbag[1].genNdx; ppgen != ppgenEnd; ppgen++) + { + if (ppgen->genOper == GenKeyRange) { plokey = ppgen->genAmount.range.lo; phikey = ppgen->genAmount.range.hi; continue; } + if (ppgen->genOper == GenVelRange) { plovel = ppgen->genAmount.range.lo; phivel = ppgen->genAmount.range.hi; continue; } + if (ppgen->genOper != GenInstrument) continue; + if (ppgen->genAmount.wordAmount >= hydra->instNum) continue; + pinst = hydra->insts + ppgen->genAmount.wordAmount; + for (pibag = hydra->ibags + pinst->instBagNdx, pibagEnd = hydra->ibags + pinst[1].instBagNdx; pibag != pibagEnd; pibag++) + { + unsigned char ilokey = 0, ihikey = 127, ilovel = 0, ihivel = 127; + for (pigen = hydra->igens + pibag->instGenNdx, pigenEnd = hydra->igens + pibag[1].instGenNdx; pigen != pigenEnd; pigen++) + { + if (pigen->genOper == GenKeyRange) { ilokey = pigen->genAmount.range.lo; ihikey = pigen->genAmount.range.hi; continue; } + if (pigen->genOper == GenVelRange) { ilovel = pigen->genAmount.range.lo; ihivel = pigen->genAmount.range.hi; continue; } + if (pigen->genOper == GenSampleID && ihikey >= plokey && ilokey <= phikey && ihivel >= plovel && ilovel <= phivel) preset->regionNum++; + } + } + } + } + + preset->regions = (struct tsf_region*)TSF_MALLOC(preset->regionNum * sizeof(struct tsf_region)); + if (!preset->regions) + { + int i; for (i = 0; i != res->presetNum; i++) TSF_FREE(res->presets[i].regions); + TSF_FREE(res->presets); + return 0; + } + tsf_region_clear(&globalRegion, TSF_TRUE); + + // Zones. + for (ppbag = hydra->pbags + pphdr->presetBagNdx, ppbagEnd = hydra->pbags + pphdr[1].presetBagNdx; ppbag != ppbagEnd; ppbag++) + { + struct tsf_hydra_pgen *ppgen, *ppgenEnd; struct tsf_hydra_inst *pinst; struct tsf_hydra_ibag *pibag, *pibagEnd; struct tsf_hydra_igen *pigen, *pigenEnd; + struct tsf_region presetRegion = globalRegion; + int hadGenInstrument = 0; + + // Generators. + for (ppgen = hydra->pgens + ppbag->genNdx, ppgenEnd = hydra->pgens + ppbag[1].genNdx; ppgen != ppgenEnd; ppgen++) + { + // Instrument. + if (ppgen->genOper == GenInstrument) + { + struct tsf_region instRegion; + tsf_u16 whichInst = ppgen->genAmount.wordAmount; + if (whichInst >= hydra->instNum) continue; + + tsf_region_clear(&instRegion, TSF_FALSE); + pinst = &hydra->insts[whichInst]; + for (pibag = hydra->ibags + pinst->instBagNdx, pibagEnd = hydra->ibags + pinst[1].instBagNdx; pibag != pibagEnd; pibag++) + { + // Generators. + struct tsf_region zoneRegion = instRegion; + int hadSampleID = 0; + for (pigen = hydra->igens + pibag->instGenNdx, pigenEnd = hydra->igens + pibag[1].instGenNdx; pigen != pigenEnd; pigen++) + { + if (pigen->genOper == GenSampleID) + { + struct tsf_hydra_shdr* pshdr; + + //preset region key and vel ranges are a filter for the zone regions + if (zoneRegion.hikey < presetRegion.lokey || zoneRegion.lokey > presetRegion.hikey) continue; + if (zoneRegion.hivel < presetRegion.lovel || zoneRegion.lovel > presetRegion.hivel) continue; + if (presetRegion.lokey > zoneRegion.lokey) zoneRegion.lokey = presetRegion.lokey; + if (presetRegion.hikey < zoneRegion.hikey) zoneRegion.hikey = presetRegion.hikey; + if (presetRegion.lovel > zoneRegion.lovel) zoneRegion.lovel = presetRegion.lovel; + if (presetRegion.hivel < zoneRegion.hivel) zoneRegion.hivel = presetRegion.hivel; + + //sum regions + tsf_region_operator(&zoneRegion, 0, TSF_NULL, &presetRegion); + + // EG times need to be converted from timecents to seconds. + tsf_region_envtosecs(&zoneRegion.ampenv, TSF_TRUE); + tsf_region_envtosecs(&zoneRegion.modenv, TSF_FALSE); + + // LFO times need to be converted from timecents to seconds. + zoneRegion.delayModLFO = (zoneRegion.delayModLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayModLFO)); + zoneRegion.delayVibLFO = (zoneRegion.delayVibLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayVibLFO)); + + // Fixup sample positions + pshdr = &hydra->shdrs[pigen->genAmount.wordAmount]; + zoneRegion.offset += pshdr->start; + zoneRegion.end += pshdr->end; + zoneRegion.loop_start += pshdr->startLoop; + zoneRegion.loop_end += pshdr->endLoop; + if (pshdr->endLoop > 0) zoneRegion.loop_end -= 1; + if (zoneRegion.loop_end > fontSampleCount) zoneRegion.loop_end = fontSampleCount; + if (zoneRegion.pitch_keycenter == -1) zoneRegion.pitch_keycenter = pshdr->originalPitch; + zoneRegion.tune += pshdr->pitchCorrection; + zoneRegion.sample_rate = pshdr->sampleRate; + if (zoneRegion.end && zoneRegion.end < fontSampleCount) zoneRegion.end++; + else zoneRegion.end = fontSampleCount; + + preset->regions[region_index] = zoneRegion; + region_index++; + hadSampleID = 1; + } + else tsf_region_operator(&zoneRegion, pigen->genOper, &pigen->genAmount, TSF_NULL); + } + + // Handle instrument's global zone. + if (pibag == hydra->ibags + pinst->instBagNdx && !hadSampleID) + instRegion = zoneRegion; + + // Modulators (TODO) + //if (ibag->instModNdx < ibag[1].instModNdx) addUnsupportedOpcode("any modulator"); + } + hadGenInstrument = 1; + } + else tsf_region_operator(&presetRegion, ppgen->genOper, &ppgen->genAmount, TSF_NULL); + } + + // Modulators (TODO) + //if (pbag->modNdx < pbag[1].modNdx) addUnsupportedOpcode("any modulator"); + + // Handle preset's global zone. + if (ppbag == hydra->pbags + pphdr->presetBagNdx && !hadGenInstrument) + globalRegion = presetRegion; + } + } + return 1; +} +#endif + +#ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H +static int tsf_decode_ogg(const tsf_u8 *pSmpl, const tsf_u8 *pSmplEnd, float** pRes, tsf_u32* pResNum, tsf_u32* pResMax, tsf_u32 resInitial) +{ + float *res = *pRes, *oldres; tsf_u32 resNum = *pResNum; tsf_u32 resMax = *pResMax; stb_vorbis *v; + + // Use whatever stb_vorbis API that is available (either pull or push) + #if !defined(STB_VORBIS_NO_PULLDATA_API) && !defined(STB_VORBIS_NO_FROMMEMORY) + v = stb_vorbis_open_memory(pSmpl, (int)(pSmplEnd - pSmpl), TSF_NULL, TSF_NULL); + #else + { int use, err; v = stb_vorbis_open_pushdata(pSmpl, (int)(pSmplEnd - pSmpl), &use, &err, TSF_NULL); pSmpl += use; } + #endif + if (v == TSF_NULL) return 0; + + for (;;) + { + float** outputs; int n_samples; + + // Decode one frame of vorbis samples with whatever stb_vorbis API that is available + #if !defined(STB_VORBIS_NO_PULLDATA_API) && !defined(STB_VORBIS_NO_FROMMEMORY) + n_samples = stb_vorbis_get_frame_float(v, TSF_NULL, &outputs); + if (!n_samples) break; + #else + if (pSmpl >= pSmplEnd) break; + { int use = stb_vorbis_decode_frame_pushdata(v, pSmpl, (int)(pSmplEnd - pSmpl), TSF_NULL, &outputs, &n_samples); pSmpl += use; } + if (!n_samples) continue; + #endif + + // Expand our output buffer if necessary then copy over the decoded frame samples + resNum += n_samples; + if (resNum > resMax) + { + do { resMax += (resMax ? (resMax < 1048576 ? resMax : 1048576) : resInitial); } while (resNum > resMax); + oldres = res; + res = (float*)TSF_REALLOC(res, resMax * sizeof(float)); + if (!res) { TSF_FREE(oldres); stb_vorbis_close(v); return 0; } + } + TSF_MEMCPY(res + resNum - n_samples, outputs[0], n_samples * sizeof(float)); + } + stb_vorbis_close(v); + *pRes = res; *pResNum = resNum; *pResMax = resMax; + return 1; +} + +static int tsf_decode_sf3_samples(const void* rawBuffer, float** pFloatBuffer, unsigned int* pSmplCount, struct tsf_hydra *hydra) +{ + const tsf_u8* smplBuffer = (const tsf_u8*)rawBuffer; + tsf_u32 smplLength = *pSmplCount, resNum = 0, resMax = 0, resInitial = (smplLength > 0x100000 ? (smplLength & ~0xFFFFF) : 65536); + float *res = TSF_NULL, *oldres; + int i, shdrLast = hydra->shdrNum - 1, is_sf3 = 0; + for (i = 0; i <= shdrLast; i++) + { + struct tsf_hydra_shdr *shdr = &hydra->shdrs[i]; + if (shdr->sampleType & 0x30) // compression flags (sometimes Vorbis flag) + { + const tsf_u8 *pSmpl = smplBuffer + shdr->start, *pSmplEnd = smplBuffer + shdr->end; + if (pSmpl + 4 > pSmplEnd || !TSF_FourCCEquals(pSmpl, "OggS")) + { + shdr->start = shdr->end = shdr->startLoop = shdr->endLoop = 0; + continue; + } + + // Fix up sample indices in shdr (end index is set after decoding) + shdr->start = resNum; + shdr->startLoop += resNum; + shdr->endLoop += resNum; + if (!tsf_decode_ogg(pSmpl, pSmplEnd, &res, &resNum, &resMax, resInitial)) { TSF_FREE(res); return 0; } + shdr->end = resNum; + is_sf3 = 1; + } + else // raw PCM sample + { + float *out; short *in = (short*)smplBuffer + resNum, *inEnd; tsf_u32 oldResNum = resNum; + if (is_sf3) // Fix up sample indices in shdr + { + tsf_u32 fix_offset = resNum - shdr->start; + in -= fix_offset; + shdr->start = resNum; + shdr->end += fix_offset; + shdr->startLoop += fix_offset; + shdr->endLoop += fix_offset; + } + inEnd = in + ((shdr->end >= shdr->endLoop ? shdr->end : shdr->endLoop) - resNum); + if (i == shdrLast || (tsf_u8*)inEnd > (smplBuffer + smplLength)) inEnd = (short*)(smplBuffer + smplLength); + if (inEnd <= in) continue; + + // expand our output buffer if necessary then convert the PCM data from short to float + resNum += (tsf_u32)(inEnd - in); + if (resNum > resMax) + { + do { resMax += (resMax ? (resMax < 1048576 ? resMax : 1048576) : resInitial); } while (resNum > resMax); + oldres = res; + res = (float*)TSF_REALLOC(res, resMax * sizeof(float)); + if (!res) { TSF_FREE(oldres); return 0; } + } + + // Convert the samples from short to float + for (out = res + oldResNum; in < inEnd;) + *(out++) = (float)(*(in++) / 32767.0); + } + } + + // Trim the sample buffer down then return success (unless out of memory) + if (!(*pFloatBuffer = (float*)TSF_REALLOC(res, resNum * sizeof(float)))) *pFloatBuffer = res; + *pSmplCount = resNum; + return (res ? 1 : 0); +} +#endif + +#ifndef TSF_CONST_FILE +static int tsf_load_samples(void** pRawBuffer, TSF_CONST float** pFloatBuffer, TSF_CONST short ** pShortBuffer, unsigned int* pSmplCount, struct tsf_riffchunk *chunkSmpl, struct tsf_stream* stream) +{ + #ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H + // With OGG Vorbis support we cannot pre-allocate the memory for tsf_decode_sf3_samples + tsf_u32 resNum, resMax; float* oldres; + *pSmplCount = chunkSmpl->size; + *pRawBuffer = (void*)TSF_MALLOC(*pSmplCount); + if (!*pRawBuffer || !stream->read(stream->data, *pRawBuffer, chunkSmpl->size)) return 0; + if (chunkSmpl->id[3] != 'o') return 1; + + // Decode custom .sfo 'smpo' format where all samples are in a single ogg stream + resNum = resMax = 0; + if (!tsf_decode_ogg((tsf_u8*)*pRawBuffer, (tsf_u8*)*pRawBuffer + chunkSmpl->size, pFloatBuffer, &resNum, &resMax, 65536)) return 0; + oldres = *pFloatBuffer; + if (!(*pFloatBuffer = (float*)TSF_REALLOC(*pFloatBuffer, resNum * sizeof(float)))) *pFloatBuffer = oldres; + *pSmplCount = resNum; + return (*pFloatBuffer ? 1 : 0); + #else + // Inline convert the samples from short to float + float *res, *out; const short *in; + (void)pRawBuffer; + *pSmplCount = chunkSmpl->size / (unsigned int)sizeof(short); + *pFloatBuffer = (float*)TSF_MALLOC(*pSmplCount * sizeof(float)); + if (!*pFloatBuffer || !stream->read(stream->data, *pFloatBuffer, chunkSmpl->size)) return 0; + *pShortBuffer = (short*)TSF_MALLOC(*pSmplCount * sizeof(short)); + memcpy(*pShortBuffer, *pFloatBuffer, chunkSmpl->size); + for (res = *pFloatBuffer, out = res + *pSmplCount, in = (short*)res + *pSmplCount; out != res;) + *(--out) = (float)(*(--in) / 32767.0); + return 1; + #endif +} +#endif + +static int tsf_voice_envelope_release_samples(struct tsf_voice_envelope* e, float outSampleRate) +{ + return (int)((e->parameters.release <= 0 ? TSF_FASTRELEASETIME : e->parameters.release) * outSampleRate); +} + +static void tsf_voice_envelope_nextsegment(struct tsf_voice_envelope* e, short active_segment, float outSampleRate) +{ + switch (active_segment) + { + case TSF_SEGMENT_NONE: + e->samplesUntilNextSegment = (int)(e->parameters.delay * outSampleRate); + if (e->samplesUntilNextSegment > 0) + { + e->segment = TSF_SEGMENT_DELAY; + e->segmentIsExponential = TSF_FALSE; + e->level = 0.0f; + e->slope = 0.0f; + return; + } + /* fall through */ + case TSF_SEGMENT_DELAY: + e->samplesUntilNextSegment = (int)(e->parameters.attack * outSampleRate); + if (e->samplesUntilNextSegment > 0) + { + if (!e->isAmpEnv) + { + //mod env attack duration scales with velocity (velocity of 1 is full duration, max velocity is 0.125 times duration) + e->samplesUntilNextSegment = (int)(e->parameters.attack * ((145 - e->midiVelocity) / 144.0f) * outSampleRate); + } + e->segment = TSF_SEGMENT_ATTACK; + e->segmentIsExponential = TSF_FALSE; + e->level = 0.0f; + e->slope = 1.0f / e->samplesUntilNextSegment; + return; + } + /* fall through */ + case TSF_SEGMENT_ATTACK: + e->samplesUntilNextSegment = (int)(e->parameters.hold * outSampleRate); + if (e->samplesUntilNextSegment > 0) + { + e->segment = TSF_SEGMENT_HOLD; + e->segmentIsExponential = TSF_FALSE; + e->level = 1.0f; + e->slope = 0.0f; + return; + } + /* fall through */ + case TSF_SEGMENT_HOLD: + e->samplesUntilNextSegment = (int)(e->parameters.decay * outSampleRate); + if (e->samplesUntilNextSegment > 0) + { + e->segment = TSF_SEGMENT_DECAY; + e->level = 1.0f; + if (e->isAmpEnv) + { + // I don't truly understand this; just following what LinuxSampler does. + float mysterySlope = -9.226f / e->samplesUntilNextSegment; + e->slope = TSF_EXPF(mysterySlope); + e->segmentIsExponential = TSF_TRUE; + if (e->parameters.sustain > 0.0f) + { + // Again, this is following LinuxSampler's example, which is similar to + // SF2-style decay, where "decay" specifies the time it would take to + // get to zero, not to the sustain level. The SFZ spec is not that + // specific about what "decay" means, so perhaps it's really supposed + // to specify the time to reach the sustain level. + e->samplesUntilNextSegment = (int)(TSF_LOG(e->parameters.sustain) / mysterySlope); + } + } + else + { + e->slope = -1.0f / e->samplesUntilNextSegment; + e->samplesUntilNextSegment = (int)(e->parameters.decay * (1.0f - e->parameters.sustain) * outSampleRate); + e->segmentIsExponential = TSF_FALSE; + } + return; + } + /* fall through */ + case TSF_SEGMENT_DECAY: + e->segment = TSF_SEGMENT_SUSTAIN; + e->level = e->parameters.sustain; + e->slope = 0.0f; + e->samplesUntilNextSegment = 0x7FFFFFFF; + e->segmentIsExponential = TSF_FALSE; + return; + case TSF_SEGMENT_SUSTAIN: + e->segment = TSF_SEGMENT_RELEASE; + e->samplesUntilNextSegment = tsf_voice_envelope_release_samples(e, outSampleRate); + if (e->isAmpEnv) + { + // I don't truly understand this; just following what LinuxSampler does. + float mysterySlope = -9.226f / e->samplesUntilNextSegment; + e->slope = TSF_EXPF(mysterySlope); + e->segmentIsExponential = TSF_TRUE; + } + else + { + e->slope = -e->level / e->samplesUntilNextSegment; + e->segmentIsExponential = TSF_FALSE; + } + return; + case TSF_SEGMENT_RELEASE: + default: + e->segment = TSF_SEGMENT_DONE; + e->segmentIsExponential = TSF_FALSE; + e->level = e->slope = 0.0f; + e->samplesUntilNextSegment = 0x7FFFFFF; + } +} + +static void tsf_voice_envelope_setup(struct tsf_voice_envelope* e, const struct tsf_envelope* new_parameters, int midiNoteNumber, short midiVelocity, TSF_BOOL isAmpEnv, float outSampleRate) +{ + e->parameters = *new_parameters; + if (e->parameters.keynumToHold) + { + e->parameters.hold += e->parameters.keynumToHold * (60.0f - midiNoteNumber); + e->parameters.hold = (e->parameters.hold < -10000.0f ? 0.0f : tsf_timecents2Secsf(e->parameters.hold)); + } + if (e->parameters.keynumToDecay) + { + e->parameters.decay += e->parameters.keynumToDecay * (60.0f - midiNoteNumber); + e->parameters.decay = (e->parameters.decay < -10000.0f ? 0.0f : tsf_timecents2Secsf(e->parameters.decay)); + } + e->midiVelocity = midiVelocity; + e->isAmpEnv = isAmpEnv; + tsf_voice_envelope_nextsegment(e, TSF_SEGMENT_NONE, outSampleRate); +} + +static void tsf_voice_envelope_process(struct tsf_voice_envelope* e, int numSamples, float outSampleRate) +{ + if (e->slope) + { + if (e->segmentIsExponential) e->level *= TSF_POWF(e->slope, (float)numSamples); + else e->level += (e->slope * numSamples); + } + if ((e->samplesUntilNextSegment -= numSamples) <= 0) + tsf_voice_envelope_nextsegment(e, e->segment, outSampleRate); +} +#ifndef TSF_SAMPLES_SHORT +static void tsf_voice_lowpass_setup(struct tsf_voice_lowpass* e, float Fc) +{ + // Lowpass filter from http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/ + double K = TSF_TAN(TSF_PI * Fc), KK = K * K; + double norm = 1 / (1 + K * e->QInv + KK); + e->a0 = KK * norm; + e->a1 = 2 * e->a0; + e->b1 = 2 * (KK - 1) * norm; + e->b2 = (1 - K * e->QInv + KK) * norm; +} + +static float tsf_voice_lowpass_process(struct tsf_voice_lowpass* e, double In) +{ + double Out = In * e->a0 + e->z1; e->z1 = In * e->a1 + e->z2 - e->b1 * Out; e->z2 = In * e->a0 - e->b2 * Out; return (float)Out; +} +#endif +static void tsf_voice_lfo_setup(struct tsf_voice_lfo* e, float delay, int freqCents, float outSampleRate) +{ + e->samplesUntil = (int)(delay * outSampleRate); +#ifndef TSF_SAMPLES_SHORT + e->delta = (4.0f * tsf_cents2Hertz((float)freqCents) / outSampleRate); + e->level = 0; +#else + e->deltaF16P16 = (4.0f * 65536.0f * tsf_cents2Hertz((float)freqCents) / outSampleRate); + e->levelF16P16 = 0; +#endif +} + +static void tsf_voice_lfo_process(struct tsf_voice_lfo* e, int blockSamples) +{ + if (e->samplesUntil > blockSamples) { e->samplesUntil -= blockSamples; return; } +#ifndef TSF_SAMPLES_SHORT + e->level += e->delta * blockSamples; + if (e->level > 1.0f) { e->delta = -e->delta; e->level = 2.0f - e->level; } + else if (e->level < -1.0f) { e->delta = -e->delta; e->level = -2.0f - e->level; } +#else + e->levelF16P16 += e->deltaF16P16 * blockSamples; + if (e->levelF16P16 > 1 << 16) { e->deltaF16P16 = -e->deltaF16P16; e->levelF16P16 = (2 << 16) - e->levelF16P16; } + else if (e->levelF16P16 < -(1 << 16)) { e->deltaF16P16 = -e->deltaF16P16; e->levelF16P16 = -(2 << 16) - e->levelF16P16; } +#endif +} + +static void tsf_voice_kill(struct tsf_voice* v) +{ + v->playingPreset = -1; +} + +static void tsf_voice_end(tsf* f, struct tsf_voice* v) +{ +#ifndef TSF_SAMPLES_SHORT + // if maxVoiceNum is set, assume that voice rendering and note queuing are on separate threads + // so to minimize the chance that voice rendering would advance the segment at the same time + // we just do it twice here and hope that it sticks + int repeats = (f->maxVoiceNum ? 2 : 1); + while (repeats--) +#endif + { + tsf_voice_envelope_nextsegment(&v->ampenv, TSF_SEGMENT_SUSTAIN, f->outSampleRate); + tsf_voice_envelope_nextsegment(&v->modenv, TSF_SEGMENT_SUSTAIN, f->outSampleRate); + if (v->region->loop_mode == TSF_LOOPMODE_SUSTAIN) + { + // Continue playing, but stop looping. + v->loopEnd = v->loopStart; + } + } +} + +static void tsf_voice_endquick(tsf* f, struct tsf_voice* v) +{ +#ifndef TSF_SAMPLES_SHORT + // if maxVoiceNum is set, assume that voice rendering and note queuing are on separate threads + // so to minimize the chance that voice rendering would advance the segment at the same time + // we just do it twice here and hope that it sticks + int repeats = (f->maxVoiceNum ? 2 : 1); + while (repeats--) +#endif + { + v->ampenv.parameters.release = 0.0f; tsf_voice_envelope_nextsegment(&v->ampenv, TSF_SEGMENT_SUSTAIN, f->outSampleRate); + v->modenv.parameters.release = 0.0f; tsf_voice_envelope_nextsegment(&v->modenv, TSF_SEGMENT_SUSTAIN, f->outSampleRate); + } +} + +static void tsf_voice_calcpitchratio(struct tsf_voice* v, float pitchShift, float outSampleRate) +{ +#ifndef TSF_SAMPLES_SHORT + double note = v->playingKey + v->region->transpose + v->region->tune / 100.0; + double adjustedPitch = v->region->pitch_keycenter + (note - v->region->pitch_keycenter) * (v->region->pitch_keytrack / 100.0); + if (pitchShift) adjustedPitch += pitchShift; + v->pitchInputTimecents = adjustedPitch * 100.0; + v->pitchOutputFactor = v->region->sample_rate / (tsf_timecents2Secsd(v->region->pitch_keycenter * 100.0) * outSampleRate); +#else + float note = v->playingKey + v->region->transpose + v->region->tune / 100.0f; + float adjustedPitch = v->region->pitch_keycenter + (note - v->region->pitch_keycenter) * (v->region->pitch_keytrack / 100.0f); + if (pitchShift) adjustedPitch += pitchShift; + v->pitchInputTimecents = adjustedPitch * 100.0f; + v->pitchOutputFactor = v->region->sample_rate / (tsf_timecents2Secsd(v->region->pitch_keycenter * 100.0f) * outSampleRate); +#endif +} + +#ifndef TSF_SAMPLES_SHORT +static void tsf_voice_render(tsf* f, struct tsf_voice* v, float* outputBuffer, int numSamples) +{ + TSF_CONST struct tsf_region* region = v->region; + TSF_CONST float* input = f->fontSamples; + float* outL = outputBuffer; + float* outR = (f->outputmode == TSF_STEREO_UNWEAVED ? outL + numSamples : TSF_NULL); + + // Cache some values, to give them at least some chance of ending up in registers. + TSF_BOOL updateModEnv = (region->modEnvToPitch || region->modEnvToFilterFc); + TSF_BOOL updateModLFO = (v->modlfo.delta && (region->modLfoToPitch || region->modLfoToFilterFc || region->modLfoToVolume)); + TSF_BOOL updateVibLFO = (v->viblfo.delta && (region->vibLfoToPitch)); + TSF_BOOL isLooping = (v->loopStart < v->loopEnd); + unsigned int tmpLoopStart = v->loopStart, tmpLoopEnd = v->loopEnd; + double tmpSampleEndDbl = (double)region->end, tmpLoopEndDbl = (double)tmpLoopEnd + 1.0; + double tmpSourceSamplePosition = v->sourceSamplePosition; + struct tsf_voice_lowpass tmpLowpass = v->lowpass; + + TSF_BOOL dynamicLowpass = (region->modLfoToFilterFc || region->modEnvToFilterFc); + float tmpSampleRate = f->outSampleRate, tmpInitialFilterFc, tmpModLfoToFilterFc, tmpModEnvToFilterFc; + + TSF_BOOL dynamicPitchRatio = (region->modLfoToPitch || region->modEnvToPitch || region->vibLfoToPitch); + double pitchRatio; + float tmpModLfoToPitch, tmpVibLfoToPitch, tmpModEnvToPitch; + + TSF_BOOL dynamicGain = (region->modLfoToVolume != 0); + float noteGain = 0, tmpModLfoToVolume; + + if (dynamicLowpass) tmpInitialFilterFc = (float)region->initialFilterFc, tmpModLfoToFilterFc = (float)region->modLfoToFilterFc, tmpModEnvToFilterFc = (float)region->modEnvToFilterFc; + else tmpInitialFilterFc = 0, tmpModLfoToFilterFc = 0, tmpModEnvToFilterFc = 0; + + if (dynamicPitchRatio) pitchRatio = 0, tmpModLfoToPitch = (float)region->modLfoToPitch, tmpVibLfoToPitch = (float)region->vibLfoToPitch, tmpModEnvToPitch = (float)region->modEnvToPitch; + else pitchRatio = tsf_timecents2Secsd(v->pitchInputTimecents) * v->pitchOutputFactor, tmpModLfoToPitch = 0, tmpVibLfoToPitch = 0, tmpModEnvToPitch = 0; + + if (dynamicGain) tmpModLfoToVolume = (float)region->modLfoToVolume * 0.1f; + else noteGain = tsf_decibelsToGain(v->noteGainDB), tmpModLfoToVolume = 0; + + while (numSamples) + { + float gainMono, gainLeft, gainRight; + int blockSamples = (numSamples > TSF_RENDER_EFFECTSAMPLEBLOCK ? TSF_RENDER_EFFECTSAMPLEBLOCK : numSamples); + numSamples -= blockSamples; + + if (dynamicLowpass) + { + float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; + float lowpassFc = (fres <= 13500 ? tsf_cents2Hertz(fres) / tmpSampleRate : 1.0f); + tmpLowpass.active = (lowpassFc < 0.499f); + if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, lowpassFc); + } + + if (dynamicPitchRatio) + pitchRatio = tsf_timecents2Secsd(v->pitchInputTimecents + (v->modlfo.level * tmpModLfoToPitch + v->viblfo.level * tmpVibLfoToPitch + v->modenv.level * tmpModEnvToPitch)) * v->pitchOutputFactor; + + if (dynamicGain) + noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.level * tmpModLfoToVolume)); + + gainMono = noteGain * v->ampenv.level; + + // Update EG. + tsf_voice_envelope_process(&v->ampenv, blockSamples, tmpSampleRate); + if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, tmpSampleRate); + + // Update LFOs. + if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); + if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); + + switch (f->outputmode) + { + case TSF_STEREO_INTERLEAVED: + gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; + while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) + { + unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); + + // Simple linear interpolation. + float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); + + // Low-pass filter. + if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + *outL++ += val * gainLeft; + *outL++ += val * gainRight; + + // Next sample. + tmpSourceSamplePosition += pitchRatio; + if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); + } + break; + + case TSF_STEREO_UNWEAVED: + gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; + while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) + { + unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); + + // Simple linear interpolation. + float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); + + // Low-pass filter. + if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + *outL++ += val * gainLeft; + *outR++ += val * gainRight; + + // Next sample. + tmpSourceSamplePosition += pitchRatio; + if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); + } + break; + + case TSF_MONO: + while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) + { + unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); + + // Simple linear interpolation. + float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); + + // Low-pass filter. + if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + *outL++ += val * gainMono; + + // Next sample. + tmpSourceSamplePosition += pitchRatio; + if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); + } + break; + } + + if (tmpSourceSamplePosition >= tmpSampleEndDbl || v->ampenv.segment == TSF_SEGMENT_DONE) + { + tsf_voice_kill(v); + return; + } + } + + v->sourceSamplePosition = tmpSourceSamplePosition; + if (tmpLowpass.active || dynamicLowpass) v->lowpass = tmpLowpass; +} +#else +static void tsf_voice_render_short(tsf* f, struct tsf_voice* v, int32_t* outputBuffer, int numSamples) +{ +#ifdef ESP8266 + static unsigned int smps = 0; + if (++smps > 20000) { + yield(); + smps = 0; + } +#endif + TSF_CONST struct tsf_region* region = v->region; + TSF_CONST short* input = f->shortSamples; + int32_t* outL = outputBuffer; + //short* outR = (f->outputmode == TSF_STEREO_UNWEAVED ? outL + numSamples : TSF_NULL); + + // Cache some values, to give them at least some chance of ending up in registers. + TSF_BOOL updateModEnv = (region->modEnvToPitch || region->modEnvToFilterFc); + TSF_BOOL updateModLFO = (v->modlfo.deltaF16P16 && (region->modLfoToPitch || region->modLfoToFilterFc || region->modLfoToVolume)); + TSF_BOOL updateVibLFO = (v->viblfo.deltaF16P16 && (region->vibLfoToPitch)); + TSF_BOOL isLooping = (v->loopStart < v->loopEnd); + fixed24p8 tmpLoopStartF24P8 = v->loopStart << 8; +// fixed24p8 tmpLoopEndF24P8 = v->loopEnd << 8; +// unsigned int tmpLoopStart = v->loopStart, tmpLoopEnd = v->loopEnd; + fixed24p8 tmpSampleEndF24P8 = region->end << 8; + fixed24p8 tmpLoopEndF24P8 = (v->loopEnd + 1) << 8; +// double tmpSampleEndDbl = (double)region->end, tmpLoopEndDbl = (double)tmpLoopEnd + 1.0; + fixed24p8 tmpSourceSamplePositionF24P8 = v->sourceSamplePositionF24P8; +// double tmpSourceSamplePosition = v->sourceSamplePosition; + //struct tsf_voice_lowpass tmpLowpass = v->lowpass; + +// TSF_BOOL dynamicLowpass = (region->modLfoToFilterFc || region->modEnvToFilterFc); + float tmpSampleRate = f->outSampleRate; //, tmpInitialFilterFc, tmpModLfoToFilterFc, tmpModEnvToFilterFc; + + TSF_BOOL dynamicPitchRatio = (region->modLfoToPitch || region->modEnvToPitch || region->vibLfoToPitch); + + fixed16p16 pitchRatioF16P16; +// double pitchRatio; + float tmpModLfoToPitchD16, tmpVibLfoToPitchD16, tmpModEnvToPitchD16; + + TSF_BOOL dynamicGain = (region->modLfoToVolume != 0); + float noteGain = 0, tmpModLfoToVolumeD16; + +// if (dynamicLowpass) tmpInitialFilterFc = (float)region->initialFilterFc, tmpModLfoToFilterFc = (float)region->modLfoToFilterFc, tmpModEnvToFilterFc = (float)region->modEnvToFilterFc; +// else tmpInitialFilterFc = 0, tmpModLfoToFilterFc = 0, tmpModEnvToFilterFc = 0; + + if (dynamicPitchRatio) pitchRatioF16P16 = 0, tmpModLfoToPitchD16 = (float)region->modLfoToPitch * (1.0f / 65536.0f), tmpVibLfoToPitchD16 = (float)region->vibLfoToPitch * (1.0f / 65536.0f), tmpModEnvToPitchD16 = (float)region->modEnvToPitch * (1.0f / 65536.0f); + else pitchRatioF16P16 = 65536.0f * tsf_timecents2Secsd(v->pitchInputTimecents) * v->pitchOutputFactor, tmpModLfoToPitchD16 = 0, tmpVibLfoToPitchD16 = 0, tmpModEnvToPitchD16 = 0; + + if (dynamicGain) tmpModLfoToVolumeD16 = (float)region->modLfoToVolume * 0.1f * (1.0f / 65536.0f); + else noteGain = tsf_decibelsToGain(v->noteGainDB), tmpModLfoToVolumeD16 = 0; + + while (numSamples) + { +// float gainMono, gainLeft, gainRight; + fixed16p16 gainMonoF16P16, gainLeftF16P16, gainRightF16P16; + int blockSamples = (numSamples > TSF_RENDER_EFFECTSAMPLEBLOCK ? TSF_RENDER_EFFECTSAMPLEBLOCK : numSamples); + numSamples -= blockSamples; + +// if (dynamicLowpass) +// { +// float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; +// float lowpassFc = (fres <= 13500 ? tsf_cents2Hertz(fres) / tmpSampleRate : 1.0f); +// tmpLowpass.active = (lowpassFc < 0.499f); +// if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, lowpassFc); +// } + + if (dynamicPitchRatio) + pitchRatioF16P16 = 65536.0f * tsf_timecents2Secsd(v->pitchInputTimecents + (v->modlfo.levelF16P16 * tmpModLfoToPitchD16 + v->viblfo.levelF16P16 * tmpVibLfoToPitchD16 + v->modenv.level * tmpModEnvToPitchD16)) * v->pitchOutputFactor; + + if (dynamicGain) + noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.levelF16P16 * tmpModLfoToVolumeD16)); + +// gainMono = noteGain * v->ampenv.level; + gainMonoF16P16 = (noteGain * v->ampenv.level) * 65536.0f; + + // Update EG. + tsf_voice_envelope_process(&v->ampenv, blockSamples, tmpSampleRate); + if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, tmpSampleRate); + + // Update LFOs. + if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); + if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); + + switch (f->outputmode) + { + case TSF_STEREO_INTERLEAVED: +// gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; + gainLeftF16P16 = (gainMonoF16P16 * v->panFactorLeftF16P16) >> 16; + gainRightF16P16 = (gainMonoF16P16 * v->panFactorRightF16P16) >> 16; + while (blockSamples-- && tmpSourceSamplePositionF24P8 < tmpSampleEndF24P8) + { + fixed24p8 pos = (unsigned int)tmpSourceSamplePositionF24P8; +// fixed24p8 nextPos = (pos >= tmpLoopEndF24P8 && isLooping ? tmpLoopStartF24P8 : pos + (1 << 8)); + +// // Simple linear interpolation. +// float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); +#ifdef ESP8266 + fixed16p16 val = pgm_read_word(&input[pos >> 8]); +#else + fixed16p16 val = input[pos >> 8]; +#endif + + // Low-pass filter. + //if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + // Do saturating adds for each channel + fixed16p16 smp; + + // No clipping because it eats 20% of the performance on the M0+ Pico! + + smp = *outL; + smp += (val * gainLeftF16P16) >> 16; +// if (smp > 32767) smp = 32767; +// else if (smp < -32768) smp = -32768; + *outL++ = smp; + + smp = *outL; + smp += (val * gainRightF16P16) >> 16; +// if (smp > 32767) smp = 32767; +// else if (smp < -32768) smp = -32768; + *outL++ = smp; + +// *outL++ += val * gainLeft; +// *outL++ += val * gainRight; + + // Next sample. + tmpSourceSamplePositionF24P8 += pitchRatioF16P16 >> 8; + if (tmpSourceSamplePositionF24P8 >= tmpLoopEndF24P8 && isLooping) tmpSourceSamplePositionF24P8 -= (tmpLoopEndF24P8 - tmpLoopStartF24P8 + 1); + } + break; + + case TSF_STEREO_UNWEAVED: +#if 0 + gainLeft = gainMono * v->panFactorLeft, gainRight = gainMono * v->panFactorRight; + while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) + { + unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); + + // Simple linear interpolation. + float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); + + // Low-pass filter. + if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + *outL++ += val * gainLeft; + *outR++ += val * gainRight; + + // Next sample. + tmpSourceSamplePosition += pitchRatio; + if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); + } + break; +#endif + case TSF_MONO: +#if 0 + while (blockSamples-- && tmpSourceSamplePosition < tmpSampleEndDbl) + { + unsigned int pos = (unsigned int)tmpSourceSamplePosition, nextPos = (pos >= tmpLoopEnd && isLooping ? tmpLoopStart : pos + 1); + + // Simple linear interpolation. + float alpha = (float)(tmpSourceSamplePosition - pos), val = (input[pos] * (1.0f - alpha) + input[nextPos] * alpha); + + // Low-pass filter. + if (tmpLowpass.active) val = tsf_voice_lowpass_process(&tmpLowpass, val); + + *outL++ += val * gainMono; + + // Next sample. + tmpSourceSamplePosition += pitchRatio; + if (tmpSourceSamplePosition >= tmpLoopEndDbl && isLooping) tmpSourceSamplePosition -= (tmpLoopEnd - tmpLoopStart + 1.0); + } +#endif + break; + } + + if (tmpSourceSamplePositionF24P8 >= tmpSampleEndF24P8 || v->ampenv.segment == TSF_SEGMENT_DONE) + { + tsf_voice_kill(v); + return; + } + } + + v->sourceSamplePositionF24P8 = tmpSourceSamplePositionF24P8; + //if (tmpLowpass.active || dynamicLowpass) v->lowpass = tmpLowpass; +} +#endif + +#ifndef TSF_CONST_FILE +TSFDEF tsf* tsf_load(struct tsf_stream* stream) +{ + tsf* res = TSF_NULL; + struct tsf_riffchunk chunkHead; + struct tsf_riffchunk chunkList; + struct tsf_hydra hydra; + void* rawBuffer = TSF_NULL; + TSF_CONST float* floatBuffer = TSF_NULL; + TSF_CONST short* shortBuffer = TSF_NULL; + tsf_u32 smplCount = 0; + + if (!tsf_riffchunk_read(TSF_NULL, &chunkHead, stream) || !TSF_FourCCEquals(chunkHead.id, "sfbk")) + { + //if (e) *e = TSF_INVALID_NOSF2HEADER; + return res; + } + + // Read hydra and locate sample data. + TSF_MEMSET(&hydra, 0, sizeof(hydra)); + while (tsf_riffchunk_read(&chunkHead, &chunkList, stream)) + { + struct tsf_riffchunk chunk; + if (TSF_FourCCEquals(chunkList.id, "pdta")) + { + while (tsf_riffchunk_read(&chunkList, &chunk, stream)) + { + #define HandleChunk(chunkName) (TSF_FourCCEquals(chunk.id, #chunkName) && !(chunk.size % chunkName##SizeInFile)) \ + { \ + int num = chunk.size / chunkName##SizeInFile, i; \ + hydra.chunkName##Num = num; \ + hydra.chunkName##s = (struct tsf_hydra_##chunkName*)TSF_MALLOC(num * sizeof(struct tsf_hydra_##chunkName)); \ + if (!hydra.chunkName##s) goto out_of_memory; \ + for (i = 0; i < num; ++i) tsf_hydra_read_##chunkName(&hydra.chunkName##s[i], stream); \ + } + enum + { + phdrSizeInFile = 38, pbagSizeInFile = 4, pmodSizeInFile = 10, + pgenSizeInFile = 4, instSizeInFile = 22, ibagSizeInFile = 4, + imodSizeInFile = 10, igenSizeInFile = 4, shdrSizeInFile = 46 + }; + if HandleChunk(phdr) else if HandleChunk(pbag) else if HandleChunk(pmod) + else if HandleChunk(pgen) else if HandleChunk(inst) else if HandleChunk(ibag) + else if HandleChunk(imod) else if HandleChunk(igen) else if HandleChunk(shdr) + else stream->skip(stream->data, chunk.size); + #undef HandleChunk + } + } + else if (TSF_FourCCEquals(chunkList.id, "sdta")) + { + while (tsf_riffchunk_read(&chunkList, &chunk, stream)) + { + if ((TSF_FourCCEquals(chunk.id, "smpl") + #ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H + || TSF_FourCCEquals(chunk.id, "smpo") + #endif + ) && !rawBuffer && !floatBuffer && chunk.size >= sizeof(short)) + { + if (!tsf_load_samples(&rawBuffer, &floatBuffer, &shortBuffer, &smplCount, &chunk, stream)) goto out_of_memory; + } + else stream->skip(stream->data, chunk.size); + } + } + else stream->skip(stream->data, chunkList.size); + } + if (!hydra.phdrs || !hydra.pbags || !hydra.pmods || !hydra.pgens || !hydra.insts || !hydra.ibags || !hydra.imods || !hydra.igens || !hydra.shdrs) + { + //if (e) *e = TSF_INVALID_INCOMPLETE; + } + else if (!rawBuffer && !floatBuffer) + { + //if (e) *e = TSF_INVALID_NOSAMPLEDATA; + } + else + { + #ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H + if (!floatBuffer && !tsf_decode_sf3_samples(rawBuffer, &floatBuffer, &smplCount, &hydra)) goto out_of_memory; + #endif + res = (tsf*)TSF_MALLOC(sizeof(tsf)); + if (res) TSF_MEMSET(res, 0, sizeof(tsf)); + if (!res || !tsf_load_presets(res, &hydra, smplCount)) goto out_of_memory; + res->outSampleRate = 44100.0f; +#ifndef TSF_SAMPLES_SHORT + res->fontSamples = floatBuffer; +#else + res->shortSamples = shortBuffer; +#endif + res->samplesNum = smplCount; + floatBuffer = TSF_NULL; // don't free below + } + if (0) + { + out_of_memory: + TSF_FREE(res); + res = TSF_NULL; + //if (e) *e = TSF_OUT_OF_MEMORY; + } + TSF_FREE(hydra.phdrs); TSF_FREE(hydra.pbags); TSF_FREE(hydra.pmods); + TSF_FREE(hydra.pgens); TSF_FREE(hydra.insts); TSF_FREE(hydra.ibags); + TSF_FREE(hydra.imods); TSF_FREE(hydra.igens); TSF_FREE(hydra.shdrs); + TSF_FREE(rawBuffer); TSF_FREE(floatBuffer); + return res; +} +#endif + +TSFDEF tsf* tsf_copy(tsf* f) +{ + tsf* res; + if (!f) return TSF_NULL; + if (!f->refCount) + { + f->refCount = (int*)TSF_MALLOC(sizeof(int)); + if (!f->refCount) return TSF_NULL; + *f->refCount = 1; + } + res = (tsf*)TSF_MALLOC(sizeof(tsf)); + if (!res) return TSF_NULL; + TSF_MEMCPY(res, f, sizeof(tsf)); + res->voices = TSF_NULL; + res->voiceNum = 0; + res->channels = TSF_NULL; + (*res->refCount)++; + return res; +} + +TSFDEF void tsf_close(tsf* f) +{ + if (!f) return; + if (!f->refCount || !--(*f->refCount)) + { +#ifndef TSF_CONST_FILE + struct tsf_preset *preset = f->presets, *presetEnd = preset + f->presetNum; + for (; preset != presetEnd; preset++) TSF_FREE(preset->regions); + TSF_FREE(f->presets); +#ifndef TSF_SAMPLES_SHORT + TSF_FREE(f->fontSamples); +#else + TSF_FREE(f->shortSamples); +#endif +#endif + TSF_FREE(f->refCount); + } + TSF_FREE(f->channels); + TSF_FREE(f->voices); +#ifndef TSF_SAMPLES_SHORT + TSF_FREE(f); +#endif +} + +TSFDEF void tsf_reset(tsf* f) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) + if (v->playingPreset != -1 && (v->ampenv.segment < TSF_SEGMENT_RELEASE || v->ampenv.parameters.release)) + tsf_voice_endquick(f, v); + if (f->channels) { TSF_FREE(f->channels); f->channels = TSF_NULL; } +} + +TSFDEF int tsf_get_presetindex(const tsf* f, int bank, int preset_number) +{ + const struct tsf_preset *presets; + int i, iMax; + for (presets = f->presets, i = 0, iMax = f->presetNum; i < iMax; i++) + if (presets[i].preset == (tsf_u32)preset_number && presets[i].bank == (tsf_u32)bank) + return i; + return -1; +} + +TSFDEF int tsf_get_presetcount(const tsf* f) +{ + return f->presetNum; +} + +TSFDEF const char* tsf_get_presetname(const tsf* f, int preset) +{ + return (preset < 0 || preset >= f->presetNum ? TSF_NULL : f->presets[preset].presetName); +} + +TSFDEF const char* tsf_bank_get_presetname(const tsf* f, int bank, int preset_number) +{ + return tsf_get_presetname(f, tsf_get_presetindex(f, bank, preset_number)); +} + +TSFDEF void tsf_set_output(tsf* f, enum TSFOutputMode outputmode, int samplerate, float global_gain_db) +{ + f->outputmode = outputmode; + f->outSampleRate = (float)(samplerate >= 1 ? samplerate : 44100.0f); + f->globalGainDB = global_gain_db; +} + +TSFDEF void tsf_set_volume(tsf* f, float global_volume) +{ + f->globalGainDB = (global_volume == 1.0f ? 0 : -tsf_gainToDecibels(1.0f / global_volume)); +} + +TSFDEF int tsf_set_max_voices(tsf* f, int max_voices) +{ + int i = f->voiceNum; + int newVoiceNum = (f->voiceNum > max_voices ? f->voiceNum : max_voices); + struct tsf_voice *newVoices = (struct tsf_voice*)TSF_REALLOC(f->voices, newVoiceNum * sizeof(struct tsf_voice)); + if (!newVoices) return 0; + f->voices = newVoices; + f->voiceNum = f->maxVoiceNum = newVoiceNum; + for (; i < max_voices; i++) + f->voices[i].playingPreset = -1; + return 1; +} + +TSFDEF int tsf_note_on(tsf* f, int preset_index, int key, float vel) +{ + short midiVelocity = (short)(vel * 127); + unsigned int voicePlayIndex; + TSF_CONST struct tsf_region *region, *regionEnd; + + if (preset_index < 0 || preset_index >= f->presetNum) return 1; + if (vel <= 0.0f) { tsf_note_off(f, preset_index, key); return 1; } + + // Play all matching regions. + voicePlayIndex = f->voicePlayIndex++; + for (region = f->presets[preset_index].regions, regionEnd = region + f->presets[preset_index].regionNum; region != regionEnd; region++) + { + struct tsf_voice *voice, *v, *vEnd; TSF_BOOL doLoop; +#ifndef TSF_SAMPLES_SHORT + float lowpassFilterQDB, lowpassFc; +#endif + if (key < (int)region->lokey || key > (int)region->hikey || midiVelocity < (int)region->lovel || midiVelocity > (int)region->hivel) continue; + + voice = TSF_NULL, v = f->voices, vEnd = v + f->voiceNum; + if (region->group) + { + for (; v != vEnd; v++) + if (v->playingPreset == preset_index && v->region->group == region->group) tsf_voice_endquick(f, v); + else if (v->playingPreset == -1 && !voice) voice = v; + } + else for (; v != vEnd; v++) if (v->playingPreset == -1) { voice = v; break; } + + if (!voice) + { + if (f->maxVoiceNum) + { + // Voices have been pre-allocated and limited to a maximum, try to kill a voice off in its release envelope + int bestKillReleaseSamplePos = -999999999; + for (v = f->voices; v != vEnd; v++) + { + if (v->ampenv.segment == TSF_SEGMENT_RELEASE) + { + // We're looking for the voice furthest into its release + int releaseSamplesDone = tsf_voice_envelope_release_samples(&v->ampenv, f->outSampleRate) - v->ampenv.samplesUntilNextSegment; + if (releaseSamplesDone > bestKillReleaseSamplePos) + { + bestKillReleaseSamplePos = releaseSamplesDone; + voice = v; + } + } + } + if (!voice) + continue; + tsf_voice_kill(voice); + } + else + { + // Allocate more voices so we don't need to kill one off. + struct tsf_voice* newVoices; + f->voiceNum += 4; + newVoices = (struct tsf_voice*)TSF_REALLOC(f->voices, f->voiceNum * sizeof(struct tsf_voice)); + if (!newVoices) { f->voiceNum -= 4; return 0; } + f->voices = newVoices; + voice = &f->voices[f->voiceNum - 4]; + voice[1].playingPreset = voice[2].playingPreset = voice[3].playingPreset = -1; + } + } + + voice->region = region; + voice->playingPreset = preset_index; + voice->playingKey = key; + voice->playIndex = voicePlayIndex; + voice->heldSustain = 0; + voice->noteGainDB = f->globalGainDB - region->attenuation - tsf_gainToDecibels(1.0f / vel); + + if (f->channels) + { + f->channels->setupVoice(f, voice); + } + else + { + tsf_voice_calcpitchratio(voice, 0, f->outSampleRate); + // The SFZ spec is silent about the pan curve, but a 3dB pan law seems common. This sqrt() curve matches what Dimension LE does; Alchemy Free seems closer to sin(adjustedPan * pi/2). +#ifndef TSF_SAMPLES_SHORT + voice->panFactorLeft = TSF_SQRTF(0.5f - region->pan); + voice->panFactorRight = TSF_SQRTF(0.5f + region->pan); +#else + voice->panFactorLeftF16P16 = tsf_sqrtF16P16( (1<<15) - region->panF16P16); + voice->panFactorRightF16P16 = tsf_sqrtF16P16( (1<<15) + region->panF16P16); +#endif + } + + // Offset/end. +#ifndef TSF_SAMPLES_SHORT + voice->sourceSamplePosition = region->offset; +#else + voice->sourceSamplePositionF24P8 = region->offset << 8; +#endif + + // Loop. + doLoop = (region->loop_mode != TSF_LOOPMODE_NONE && region->loop_start < region->loop_end); + voice->loopStart = (doLoop ? region->loop_start : 0); + voice->loopEnd = (doLoop ? region->loop_end : 0); + + // Setup envelopes. + tsf_voice_envelope_setup(&voice->ampenv, ®ion->ampenv, key, midiVelocity, TSF_TRUE, f->outSampleRate); + tsf_voice_envelope_setup(&voice->modenv, ®ion->modenv, key, midiVelocity, TSF_FALSE, f->outSampleRate); + +#ifndef TSF_SAMPLES_SHORT + // Setup lowpass filter. + lowpassFc = (region->initialFilterFc <= 13500 ? tsf_cents2Hertz((float)region->initialFilterFc) / f->outSampleRate : 1.0f); + lowpassFilterQDB = region->initialFilterQ / 10.0f; + voice->lowpass.QInv = 1.0 / TSF_POW(10.0, (lowpassFilterQDB / 20.0)); + voice->lowpass.z1 = voice->lowpass.z2 = 0; + voice->lowpass.active = (lowpassFc < 0.499f); + if (voice->lowpass.active) tsf_voice_lowpass_setup(&voice->lowpass, lowpassFc); +#endif + // Setup LFO filters. + tsf_voice_lfo_setup(&voice->modlfo, region->delayModLFO, region->freqModLFO, f->outSampleRate); + tsf_voice_lfo_setup(&voice->viblfo, region->delayVibLFO, region->freqVibLFO, f->outSampleRate); + } +//#ifndef TSF_SAMPLES_SHORT + return 1; +//#else +// return voicePlayIndex + 1; +//#endif +} + +TSFDEF int tsf_bank_note_on(tsf* f, int bank, int preset_number, int key, float vel) +{ + int preset_index = tsf_get_presetindex(f, bank, preset_number); + if (preset_index == -1) return 0; + return tsf_note_on(f, preset_index, key, vel); +} + +TSFDEF void tsf_note_off(tsf* f, int preset_index, int key) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum, *vMatchFirst = TSF_NULL, *vMatchLast = TSF_NULL; + for (; v != vEnd; v++) + { + //Find the first and last entry in the voices list with matching preset, key and look up the smallest play index + if (v->playingPreset != preset_index || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE) continue; + else if (!vMatchFirst || v->playIndex < vMatchFirst->playIndex) vMatchFirst = vMatchLast = v; + else if (v->playIndex == vMatchFirst->playIndex) vMatchLast = v; + } + if (!vMatchFirst) return; + for (v = vMatchFirst; v <= vMatchLast; v++) + { + //Stop all voices with matching preset, key and the smallest play index which was enumerated above + if (v != vMatchFirst && v != vMatchLast && + (v->playIndex != vMatchFirst->playIndex || v->playingPreset != preset_index || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE)) continue; + tsf_voice_end(f, v); + } +} + +#if 0 +// Less than 0.5% speed difference seen w/fast +/** + * Stops all voices with the given playing index. If no key provided or if -1, fallbacks to tsf_note_off + */ +TSFDEF void tsf_note_off_fast(tsf* f, int preset_index, int key, int playIndex = -1) +{ + if (playIndex < 0) { + tsf_note_off(f, preset_index, key); + } else { + playIndex--; + for (struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; v != vEnd; v++) { + if (v->playIndex == playIndex && v->playingPreset == preset_index && v->playingKey == key && v->ampenv.segment < TSF_SEGMENT_RELEASE) { + tsf_voice_end(f, v); + } + } + } +} +#endif + +TSFDEF int tsf_bank_note_off(tsf* f, int bank, int preset_number, int key) +{ + int preset_index = tsf_get_presetindex(f, bank, preset_number); + if (preset_index == -1) return 0; + tsf_note_off(f, preset_index, key); + return 1; +} + +TSFDEF void tsf_note_off_all(tsf* f) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) if (v->playingPreset != -1 && v->ampenv.segment < TSF_SEGMENT_RELEASE) + tsf_voice_end(f, v); +} + +TSFDEF int tsf_active_voice_count(tsf* f) +{ + int count = 0; + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) if (v->playingPreset != -1) count++; + return count; +} + +#ifndef TSF_SAMPLES_SHORT +TSFDEF void tsf_render_short(tsf* f, short* buffer, int samples, int flag_mixing) +{ + float outputSamples[TSF_RENDER_SHORTBUFFERBLOCK]; + int channels = (f->outputmode == TSF_MONO ? 1 : 2), maxChannelSamples = TSF_RENDER_SHORTBUFFERBLOCK / channels; + while (samples > 0) + { + int channelSamples = (samples > maxChannelSamples ? maxChannelSamples : samples); + short* bufferEnd = buffer + channelSamples * channels; + float *floatSamples = outputSamples; + tsf_render_float(f, floatSamples, channelSamples, TSF_FALSE); + samples -= channelSamples; + + if (flag_mixing) + while (buffer != bufferEnd) + { + float v = *floatSamples++; + int vi = *buffer + (v < -1.00004566f ? (int)-32768 : (v > 1.00001514f ? (int)32767 : (int)(v * 32767.5f))); + *buffer++ = (vi < -32768 ? (short)-32768 : (vi > 32767 ? (short)32767 : (short)vi)); + } + else + while (buffer != bufferEnd) + { + float v = *floatSamples++; + *buffer++ = (v < -1.00004566f ? (short)-32768 : (v > 1.00001514f ? (short)32767 : (short)(v * 32767.5f))); + } + } +} + +TSFDEF void tsf_render_float(tsf* f, float* buffer, int samples, int flag_mixing) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + if (!flag_mixing) TSF_MEMSET(buffer, 0, (f->outputmode == TSF_MONO ? 1 : 2) * sizeof(float) * samples); + for (; v != vEnd; v++) + if (v->playingPreset != -1) + tsf_voice_render(f, v, buffer, samples); +} +#else +TSFDEF void tsf_render_short_2x(tsf* f, short* buffer, int samples, int flag_mixing) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + int32_t *buffer32 = (int32_t *)buffer; + if (!flag_mixing) TSF_MEMSET(buffer, 0, (f->outputmode == TSF_MONO ? 1 : 2) * sizeof(short) * samples * 2 /* We sum in 32bs then downsample here to 16b to minimized saturation calcs */); + for (; v != vEnd; v++) + if (v->playingPreset != -1) + tsf_voice_render_short(f, v, buffer32, samples); + for (int i = 0; i < samples * 2; i++) { + int32_t t = buffer32[i]; + if (t > 32767) buffer[i] = 32767; + else if (t < -32768) buffer[i] = -32768; + else buffer[i] = t; + } +} +#endif + +static void tsf_channel_setup_voice(tsf* f, struct tsf_voice* v) +{ + struct tsf_channel* c = &f->channels->channels[f->channels->activeChannel]; + v->playingChannel = f->channels->activeChannel; + v->noteGainDB += c->gainDB; + tsf_voice_calcpitchratio(v, (c->pitchWheel == 8192 ? c->tuning : ((c->pitchWheel / 16383.0f * c->pitchRange * 2.0f) - c->pitchRange + c->tuning)), f->outSampleRate); +#ifndef TSF_SAMPLES_SHORT + float newpan = v->region->pan + c->panOffset; + if (newpan <= -0.5f) { v->panFactorLeft = 1.0f; v->panFactorRight = 0.0f; } + else if (newpan >= 0.5f) { v->panFactorLeft = 0.0f; v->panFactorRight = 1.0f; } + else { v->panFactorLeft = TSF_SQRTF(0.5f - newpan); v->panFactorRight = TSF_SQRTF(0.5f + newpan); } +#else + fixed16p16 newpan = v->region->panF16P16 + c->panOffsetF16P16; + if (newpan <= -(1 << 15)) { v->panFactorLeftF16P16 = 1 << 16; v->panFactorRightF16P16 = 0; } + else if (newpan >= 1 << 15) { v->panFactorLeftF16P16 = 0; v->panFactorRightF16P16 = 1 << 16; } + else { v->panFactorLeftF16P16 = tsf_sqrtF16P16( (1<<15) - newpan); v->panFactorRightF16P16 = tsf_sqrtF16P16( (1<<15) + newpan); } +#endif +} + +static struct tsf_channel* tsf_channel_init(tsf* f, int channel) +{ + int i; + if (f->channels && channel < f->channels->channelNum) return &f->channels->channels[channel]; + if (!f->channels) + { + f->channels = (struct tsf_channels*)TSF_MALLOC(sizeof(struct tsf_channels) + sizeof(struct tsf_channel) * channel); + if (!f->channels) return TSF_NULL; + f->channels->setupVoice = &tsf_channel_setup_voice; + f->channels->channelNum = 0; + f->channels->activeChannel = 0; + } + else + { + struct tsf_channels *newChannels = (struct tsf_channels*)TSF_REALLOC(f->channels, sizeof(struct tsf_channels) + sizeof(struct tsf_channel) * channel); + if (!newChannels) return TSF_NULL; + f->channels = newChannels; + } + i = f->channels->channelNum; + f->channels->channelNum = channel + 1; + for (; i <= channel; i++) + { + struct tsf_channel* c = &f->channels->channels[i]; + c->presetIndex = c->bank = 0; + c->pitchWheel = c->midiPan = 8192; + c->midiVolume = c->midiExpression = 16383; + c->midiRPN = 0xFFFF; + c->midiData = c->sustain = 0; +#ifndef TSF_SAMPLES_SHORT + c->panOffset = 0.0f; +#else + c->panOffsetF16P16 = 0; +#endif + c->gainDB = 0.0f; + c->pitchRange = 2.0f; + c->tuning = 0.0f; + } + return &f->channels->channels[channel]; +} + +static void tsf_channel_applypitch(tsf* f, int channel, struct tsf_channel* c) +{ + struct tsf_voice *v, *vEnd; + float pitchShift = (c->pitchWheel == 8192 ? c->tuning : ((c->pitchWheel / 16383.0f * c->pitchRange * 2.0f) - c->pitchRange + c->tuning)); + for (v = f->voices, vEnd = v + f->voiceNum; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel) + tsf_voice_calcpitchratio(v, pitchShift, f->outSampleRate); +} + +TSFDEF int tsf_channel_set_presetindex(tsf* f, int channel, int preset_index) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + c->presetIndex = (unsigned short)preset_index; + return 1; +} + +TSFDEF int tsf_channel_set_presetnumber(tsf* f, int channel, int preset_number, int flag_mididrums) +{ + int preset_index; + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (flag_mididrums) + { + preset_index = tsf_get_presetindex(f, 128 | (c->bank & 0x7FFF), preset_number); + if (preset_index == -1) preset_index = tsf_get_presetindex(f, 128, preset_number); + if (preset_index == -1) preset_index = tsf_get_presetindex(f, 128, 0); + if (preset_index == -1) preset_index = tsf_get_presetindex(f, (c->bank & 0x7FFF), preset_number); + } + else preset_index = tsf_get_presetindex(f, (c->bank & 0x7FFF), preset_number); + if (preset_index == -1) preset_index = tsf_get_presetindex(f, 0, preset_number); + if (preset_index != -1) + { + c->presetIndex = (unsigned short)preset_index; + return 1; + } + return 0; +} + +TSFDEF int tsf_channel_set_bank(tsf* f, int channel, int bank) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + c->bank = (unsigned short)bank; + return 1; +} + +TSFDEF int tsf_channel_set_bank_preset(tsf* f, int channel, int bank, int preset_number) +{ + int preset_index; + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + preset_index = tsf_get_presetindex(f, bank, preset_number); + if (preset_index == -1) return 0; + c->presetIndex = (unsigned short)preset_index; + c->bank = (unsigned short)bank; + return 1; +} + +TSFDEF int tsf_channel_set_pan(tsf* f, int channel, float pan) +{ + struct tsf_voice *v, *vEnd; + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + for (v = f->voices, vEnd = v + f->voiceNum; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel) + { +#ifndef TSF_SAMPLES_SHORT + float newpan = v->region->pan + pan - 0.5f; + if (newpan <= -0.5f) { v->panFactorLeft = 1.0f; v->panFactorRight = 0.0f; } + else if (newpan >= 0.5f) { v->panFactorLeft = 0.0f; v->panFactorRight = 1.0f; } + else { v->panFactorLeft = TSF_SQRTF(0.5f - newpan); v->panFactorRight = TSF_SQRTF(0.5f + newpan); } +#else + fixed16p16 newpan = v->region->panF16P16 + (fixed16p16)(pan * 65536.0f) - (1 << 15); + if (newpan <= -(1 << 15)) { v->panFactorLeftF16P16 = 1 << 16; v->panFactorRightF16P16 = 0; } + else if (newpan >= 1 << 15) { v->panFactorLeftF16P16 = 0; v->panFactorRightF16P16 = 1 << 16; } + else { v->panFactorLeftF16P16 = tsf_sqrtF16P16( (1<<15) - newpan); v->panFactorRightF16P16 = tsf_sqrtF16P16( (1<<15) + newpan); } +#endif + } +#ifndef TSF_SAMPLES_SHORT + c->panOffset = pan - 0.5f; +#else + c->panOffsetF16P16 = (fixed16p16)(pan * 65536.0) - (1 << 15); +#endif + return 1; +} + +TSFDEF int tsf_channel_set_volume(tsf* f, int channel, float volume) +{ + float gainDB = tsf_gainToDecibels(volume), gainDBChange; + struct tsf_voice *v, *vEnd; + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (gainDB == c->gainDB) return 1; + for (v = f->voices, vEnd = v + f->voiceNum, gainDBChange = gainDB - c->gainDB; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel) + v->noteGainDB += gainDBChange; + c->gainDB = gainDB; + return 1; +} + +TSFDEF int tsf_channel_set_pitchwheel(tsf* f, int channel, int pitch_wheel) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (c->pitchWheel == pitch_wheel) return 1; + c->pitchWheel = (unsigned short)pitch_wheel; + tsf_channel_applypitch(f, channel, c); + return 1; +} + +TSFDEF int tsf_channel_set_pitchrange(tsf* f, int channel, float pitch_range) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (c->pitchRange == pitch_range) return 1; + c->pitchRange = pitch_range; + if (c->pitchWheel != 8192) tsf_channel_applypitch(f, channel, c); + return 1; +} + +TSFDEF int tsf_channel_set_tuning(tsf* f, int channel, float tuning) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (c->tuning == tuning) return 1; + c->tuning = tuning; + tsf_channel_applypitch(f, channel, c); + return 1; +} + +TSFDEF int tsf_channel_set_sustain(tsf* f, int channel, int flag_sustain) +{ + struct tsf_channel *c = tsf_channel_init(f, channel); + if (!c) return 0; + if (!c->sustain == !flag_sustain) return 1; + c->sustain = (unsigned short)(flag_sustain != 0); + //Turning on sustain does no action now, just starts note_off behaving differently + if (flag_sustain) return 1; + //Turning off sustain, actually end voices that got a note_off and were set to heldSustain status + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel && v->ampenv.segment < TSF_SEGMENT_RELEASE && v->heldSustain) + tsf_voice_end(f, v); + return 1; +} + +TSFDEF int tsf_channel_note_on(tsf* f, int channel, int key, float vel) +{ + if (!f->channels || channel >= f->channels->channelNum) return 1; + f->channels->activeChannel = channel; + if (!vel) + { + tsf_channel_note_off(f, channel, key); + return 1; + } + return tsf_note_on(f, f->channels->channels[channel].presetIndex, key, vel); +} + +TSFDEF void tsf_channel_note_off(tsf* f, int channel, int key) +{ + unsigned sustain; + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum, *vMatchFirst = TSF_NULL, *vMatchLast = TSF_NULL; + for (; v != vEnd; v++) + { + //Find the first and last entry in the voices list with matching channel, key and look up the smallest play index + if (v->playingPreset == -1 || v->playingChannel != channel || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE || v->heldSustain) continue; + else if (!vMatchFirst || v->playIndex < vMatchFirst->playIndex) vMatchFirst = vMatchLast = v; + else if (v->playIndex == vMatchFirst->playIndex) vMatchLast = v; + } + if (!vMatchFirst) return; + for (sustain = f->channels->channels[channel].sustain, v = vMatchFirst; v <= vMatchLast; v++) + { + //Stop all voices with matching channel, key and the smallest play index which was enumerated above + if (v != vMatchFirst && v != vMatchLast && + (v->playIndex != vMatchFirst->playIndex || v->playingPreset == -1 || v->playingChannel != channel || v->playingKey != key || v->ampenv.segment >= TSF_SEGMENT_RELEASE)) continue; + //Don't turn off if sustain is active, just mark as held by sustain so we don't forget it + if (sustain) + v->heldSustain = 1; + else + tsf_voice_end(f, v); + } +} + +TSFDEF void tsf_channel_note_off_all(tsf* f, int channel) +{ + //Ignore sustain channel settings, note_off_all overrides + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel && v->ampenv.segment < TSF_SEGMENT_RELEASE) + tsf_voice_end(f, v); +} + +TSFDEF void tsf_channel_sounds_off_all(tsf* f, int channel) +{ + struct tsf_voice *v = f->voices, *vEnd = v + f->voiceNum; + for (; v != vEnd; v++) + if (v->playingPreset != -1 && v->playingChannel == channel && (v->ampenv.segment < TSF_SEGMENT_RELEASE || v->ampenv.parameters.release)) + tsf_voice_endquick(f, v); +} + +TSFDEF int tsf_channel_midi_control(tsf* f, int channel, int controller, int control_value) +{ + struct tsf_channel* c = tsf_channel_init(f, channel); + if (!c) return 0; + switch (controller) + { + case 7 /*VOLUME_MSB*/ : c->midiVolume = (unsigned short)((c->midiVolume & 0x7F ) | (control_value << 7)); goto TCMC_SET_VOLUME; + case 39 /*VOLUME_LSB*/ : c->midiVolume = (unsigned short)((c->midiVolume & 0x3F80) | control_value); goto TCMC_SET_VOLUME; + case 11 /*EXPRESSION_MSB*/ : c->midiExpression = (unsigned short)((c->midiExpression & 0x7F ) | (control_value << 7)); goto TCMC_SET_VOLUME; + case 43 /*EXPRESSION_LSB*/ : c->midiExpression = (unsigned short)((c->midiExpression & 0x3F80) | control_value); goto TCMC_SET_VOLUME; + case 10 /*PAN_MSB*/ : c->midiPan = (unsigned short)((c->midiPan & 0x7F ) | (control_value << 7)); goto TCMC_SET_PAN; + case 42 /*PAN_LSB*/ : c->midiPan = (unsigned short)((c->midiPan & 0x3F80) | control_value); goto TCMC_SET_PAN; + case 6 /*DATA_ENTRY_MSB*/ : c->midiData = (unsigned short)((c->midiData & 0x7F) | (control_value << 7)); goto TCMC_SET_DATA; + case 38 /*DATA_ENTRY_LSB*/ : c->midiData = (unsigned short)((c->midiData & 0x3F80) | control_value); goto TCMC_SET_DATA; + case 0 /*BANK_SELECT_MSB*/ : c->bank = (unsigned short)(0x8000 | control_value); return 1; //bank select MSB alone acts like LSB + case 32 /*BANK_SELECT_LSB*/ : c->bank = (unsigned short)((c->bank & 0x8000 ? ((c->bank & 0x7F) << 7) : 0) | control_value); return 1; + case 101 /*RPN_MSB*/ : c->midiRPN = (unsigned short)(((c->midiRPN == 0xFFFF ? 0 : c->midiRPN) & 0x7F ) | (control_value << 7)); return 1; + case 100 /*RPN_LSB*/ : c->midiRPN = (unsigned short)(((c->midiRPN == 0xFFFF ? 0 : c->midiRPN) & 0x3F80) | control_value); return 1; + case 98 /*NRPN_LSB*/ : c->midiRPN = 0xFFFF; return 1; + case 99 /*NRPN_MSB*/ : c->midiRPN = 0xFFFF; return 1; + case 64 /*SUSTAIN*/ : tsf_channel_set_sustain(f, channel, (int)(control_value >= 64)); return 1; + case 120 /*ALL_SOUND_OFF*/ : tsf_channel_sounds_off_all(f, channel); return 1; + case 123 /*ALL_NOTES_OFF*/ : tsf_channel_note_off_all(f, channel); return 1; + case 121 /*ALL_CTRL_OFF*/ : + c->midiVolume = c->midiExpression = 16383; + c->midiPan = 8192; + c->bank = 0; + c->midiRPN = 0xFFFF; + c->midiData = 0; + tsf_channel_set_volume(f, channel, 1.0f); + tsf_channel_set_pan(f, channel, 0.5f); + tsf_channel_set_pitchrange(f, channel, 2.0f); + tsf_channel_set_tuning(f, channel, 0); + return 1; + } + return 1; +TCMC_SET_VOLUME: + //Raising to the power of 3 seems to result in a decent sounding volume curve for MIDI + tsf_channel_set_volume(f, channel, TSF_POWF((c->midiVolume / 16383.0f) * (c->midiExpression / 16383.0f), 3.0f)); + return 1; +TCMC_SET_PAN: + tsf_channel_set_pan(f, channel, c->midiPan / 16383.0f); + return 1; +TCMC_SET_DATA: + if (c->midiRPN == 0) tsf_channel_set_pitchrange(f, channel, (c->midiData >> 7) + 0.01f * (c->midiData & 0x7F)); + else if (c->midiRPN == 1) tsf_channel_set_tuning(f, channel, (int)c->tuning + ((float)c->midiData - 8192.0f) / 8192.0f); //fine tune + else if (c->midiRPN == 2 && controller == 6) tsf_channel_set_tuning(f, channel, ((float)control_value - 64.0f) + (c->tuning - (int)c->tuning)); //coarse tune + return 1; +} + +TSFDEF int tsf_channel_get_preset_index(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].presetIndex : 0); +} + +TSFDEF int tsf_channel_get_preset_bank(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? (f->channels->channels[channel].bank & 0x7FFF) : 0); +} + +TSFDEF int tsf_channel_get_preset_number(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->presets[f->channels->channels[channel].presetIndex].preset : 0); +} +#ifndef TSF_SAMPLES_SHORT +TSFDEF float tsf_channel_get_pan(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].panOffset - 0.5f : 0.5f); +} +#endif +TSFDEF float tsf_channel_get_volume(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? tsf_decibelsToGain(f->channels->channels[channel].gainDB) : 1.0f); +} + +TSFDEF int tsf_channel_get_pitchwheel(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].pitchWheel : 8192); +} + +TSFDEF float tsf_channel_get_pitchrange(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].pitchRange : 2.0f); +} + +TSFDEF float tsf_channel_get_tuning(tsf* f, int channel) +{ + return (f->channels && channel < f->channels->channelNum ? f->channels->channels[channel].tuning : 0.0f); +} + +#ifdef __cplusplus +} +#endif + +#endif //TSF_IMPLEMENTATION + +#pragma GCC pop_options diff --git a/src/spiram-fast.h b/src/spiram-fast.h index ce568873..721d958b 100644 --- a/src/spiram-fast.h +++ b/src/spiram-fast.h @@ -1,23 +1,23 @@ /* - spiram-fast - Fast, hardcoded interface for SPI-based RAMs, allowing DIO + spiram-fast - Fast, hardcoded interface for SPI-based RAMs, allowing DIO mode to be used and speeding up individual SPI operations significantly. - Copyright (c) 2020 Earle F. Philhower, III All rights reserved. + Copyright (c) 2020 Earle F. Philhower, III All rights reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -30,216 +30,217 @@ #ifndef ESP32 class ESP8266SPIRAM { - private: - typedef struct { - volatile uint32_t spi_cmd; // The SPI can change this behind our backs, so volatile! - uint32_t spi_addr; - uint32_t spi_ctrl; - uint32_t spi_ctrl1; // undocumented? Not shown in the reg map - uint32_t spi_rd_status; - uint32_t spi_ctrl2; - uint32_t spi_clock; - uint32_t spi_user; - uint32_t spi_user1; - uint32_t spi_user2; - uint32_t spi_wr_status; - uint32_t spi_pin; - uint32_t spi_slave; - uint32_t spi_slave1; - uint32_t spi_slave2; - uint32_t spi_slave3; - uint32_t spi_w[16]; // NOTE: You need a memory barrier before reading these after a read xaction - uint32_t spi_ext3; - } spi_regs; - spi_regs *spi1 = (spi_regs*)&SPI1CMD; - - // The standard HSPI bus pins are used - static constexpr uint8_t cs = 15; - static constexpr uint8_t miso = 12; - static constexpr uint8_t mosi = 13; - static constexpr uint8_t sck = 14; - - uint32_t spi_clkval; - uint32_t csPin; - bool swCS; - - typedef enum { sio = 0, dio = 1 } iotype; - static constexpr iotype hspi_mode = sio; - - static constexpr int read_delay = (hspi_mode == dio) ? 4-1 : 0; - - void spi_init() - { - pinMode(sck, SPECIAL); - pinMode(miso, SPECIAL); - pinMode(mosi, SPECIAL); - pinMode(csPin, swCS ? OUTPUT : SPECIAL ); - spi1->spi_cmd = 0; - GPMUX &= ~(1 << 9); - spi1->spi_clock = spi_clkval; - spi1->spi_ctrl = 0 ; // MSB first + plain SPI mode - spi1->spi_ctrl1 = 0; // undocumented, clear for safety? - spi1->spi_ctrl2 = 0; // No add'l delays on signals - spi1->spi_user2 = 0; // No insn or insn_bits to set +private: + typedef struct { + volatile uint32_t spi_cmd; // The SPI can change this behind our backs, so volatile! + uint32_t spi_addr; + uint32_t spi_ctrl; + uint32_t spi_ctrl1; // undocumented? Not shown in the reg map + uint32_t spi_rd_status; + uint32_t spi_ctrl2; + uint32_t spi_clock; + uint32_t spi_user; + uint32_t spi_user1; + uint32_t spi_user2; + uint32_t spi_wr_status; + uint32_t spi_pin; + uint32_t spi_slave; + uint32_t spi_slave1; + uint32_t spi_slave2; + uint32_t spi_slave3; + uint32_t spi_w[16]; // NOTE: You need a memory barrier before reading these after a read xaction + uint32_t spi_ext3; + } spi_regs; + spi_regs *spi1 = (spi_regs*)&SPI1CMD; + + // The standard HSPI bus pins are used + static constexpr uint8_t cs = 15; + static constexpr uint8_t miso = 12; + static constexpr uint8_t mosi = 13; + static constexpr uint8_t sck = 14; + + uint32_t spi_clkval; + uint32_t csPin; + bool swCS; + + typedef enum { sio = 0, dio = 1 } iotype; + static constexpr iotype hspi_mode = sio; + + static constexpr int read_delay = (hspi_mode == dio) ? 4 - 1 : 0; + + void spi_init() { + pinMode(sck, SPECIAL); + pinMode(miso, SPECIAL); + pinMode(mosi, SPECIAL); + pinMode(csPin, swCS ? OUTPUT : SPECIAL); + spi1->spi_cmd = 0; + GPMUX &= ~(1 << 9); + spi1->spi_clock = spi_clkval; + spi1->spi_ctrl = 0 ; // MSB first + plain SPI mode + spi1->spi_ctrl1 = 0; // undocumented, clear for safety? + spi1->spi_ctrl2 = 0; // No add'l delays on signals + spi1->spi_user2 = 0; // No insn or insn_bits to set + } + + // The SPI hardware cannot make the "command" portion dual or quad, only the addr and data + // So using the command portion of the cycle will not work. Concatenate the address + // and command into a single 32-bit chunk "address" which will be sent across both bits. + void spi_writetransaction(int addr, int addr_bits, int dummy_bits, int data_bits, iotype dual) { + // Ensure no writes are still ongoing + while (spi1->spi_cmd & SPIBUSY) { + delay(0); } - // The SPI hardware cannot make the "command" portion dual or quad, only the addr and data - // So using the command portion of the cycle will not work. Concatenate the address - // and command into a single 32-bit chunk "address" which will be sent across both bits. - void spi_writetransaction(int addr, int addr_bits, int dummy_bits, int data_bits, iotype dual) - { - // Ensure no writes are still ongoing - while (spi1->spi_cmd & SPIBUSY) { delay(0); } - - spi1->spi_addr = addr; - spi1->spi_user = (addr_bits? SPIUADDR : 0) | (dummy_bits ? SPIUDUMMY : 0) | (data_bits ? SPIUMOSI : 0) | (dual ? SPIUFWDIO : 0); - spi1->spi_user1 = (addr_bits << 26) | (data_bits << 17) | dummy_bits; - // No need to set spi_user2, insn field never used - __asm ( "" ::: "memory" ); - if (swCS) { - pinMode(csPin, OUTPUT); - digitalWrite(csPin, LOW); - spi1->spi_cmd = SPIBUSY; - while (spi1->spi_cmd & SPIBUSY) { delay(0); } - digitalWrite(csPin, HIGH); - } else { - spi1->spi_cmd = SPIBUSY; - // The write may continue on in the background + spi1->spi_addr = addr; + spi1->spi_user = (addr_bits ? SPIUADDR : 0) | (dummy_bits ? SPIUDUMMY : 0) | (data_bits ? SPIUMOSI : 0) | (dual ? SPIUFWDIO : 0); + spi1->spi_user1 = (addr_bits << 26) | (data_bits << 17) | dummy_bits; + // No need to set spi_user2, insn field never used + __asm("" ::: "memory"); + if (swCS) { + pinMode(csPin, OUTPUT); + digitalWrite(csPin, LOW); + spi1->spi_cmd = SPIBUSY; + while (spi1->spi_cmd & SPIBUSY) { + delay(0); } + digitalWrite(csPin, HIGH); + } else { + spi1->spi_cmd = SPIBUSY; + // The write may continue on in the background } + } - uint32_t spi_readtransaction(int addr, int addr_bits, int dummy_bits, int data_bits, iotype dual) - { - // Ensure no writes are still ongoing - while (spi1->spi_cmd & SPIBUSY) { delay(0); } - - spi1->spi_addr = addr; - spi1->spi_user = (addr_bits? SPIUADDR : 0) | (dummy_bits ? SPIUDUMMY : 0) | SPIUMISO | (dual ? SPIUFWDIO : 0); - spi1->spi_user1 = (addr_bits << 26) | (data_bits << 8) | dummy_bits; - // No need to set spi_user2, insn field never used - __asm ( "" ::: "memory" ); - if (swCS) { - pinMode(csPin, OUTPUT); - digitalWrite(csPin, LOW); - } - spi1->spi_cmd = SPIBUSY; - while (spi1->spi_cmd & SPIBUSY) { delay(0); } - __asm ( "" ::: "memory" ); - if (swCS) { - digitalWrite(csPin, HIGH); - } - return spi1->spi_w[0]; + uint32_t spi_readtransaction(int addr, int addr_bits, int dummy_bits, int data_bits, iotype dual) { + // Ensure no writes are still ongoing + while (spi1->spi_cmd & SPIBUSY) { + delay(0); } - public: - ESP8266SPIRAM() - { - /* noop */ + spi1->spi_addr = addr; + spi1->spi_user = (addr_bits ? SPIUADDR : 0) | (dummy_bits ? SPIUDUMMY : 0) | SPIUMISO | (dual ? SPIUFWDIO : 0); + spi1->spi_user1 = (addr_bits << 26) | (data_bits << 8) | dummy_bits; + // No need to set spi_user2, insn field never used + __asm("" ::: "memory"); + if (swCS) { + pinMode(csPin, OUTPUT); + digitalWrite(csPin, LOW); } - ~ESP8266SPIRAM() - { - end(); + spi1->spi_cmd = SPIBUSY; + while (spi1->spi_cmd & SPIBUSY) { + delay(0); } - void readBytes(uint32_t addr, void *destV, int count) - { - uint8_t *dest = (uint8_t*)destV; - while (count > 0) { - int toRead = std::min(count, 64); - spi_readtransaction((0x03 << 24) | addr, 32-1, read_delay, toRead * 8 - 1, hspi_mode); - __asm ( "" ::: "memory" ); - uint32_t work[16]; // FIFO image in RAM that we can byte address - int toCopy = (toRead + 3) / 4; // make sure all 32b values updated - for (auto i = 0; i < toCopy; i++) { - work[i] = spi1->spi_w[i]; - } - memcpy(dest, work, toRead); - count -= toRead; - dest += toRead; - addr += toRead; - } + __asm("" ::: "memory"); + if (swCS) { + digitalWrite(csPin, HIGH); } - - void writeBytes(uint32_t addr, const void *srcV, int count) - { - const uint8_t *src = (const uint8_t *)srcV; - while (count > 0) { - uint32_t work[16]; // FIFO image in RAM that we can byte address - int toWrite = std::min(count, 64); - memcpy((void *)work, src, toWrite); - int toCopy = (toWrite + 3) / 4; // make sure all 32b values updated - - // Ensure the last SPI is done so we don't overwrite unsent data - while (spi1->spi_cmd & SPIBUSY) { delay(0); } - for (auto i = 0; i < toCopy; i++) { - spi1->spi_w[i] = work[i]; - } - spi_writetransaction((0x02 << 24) | addr, 32 - 1, 0, toWrite * 8 - 1, hspi_mode); - count -= toWrite; - src += toWrite; - addr += toWrite; + return spi1->spi_w[0]; + } + +public: + ESP8266SPIRAM() { + /* noop */ + } + ~ESP8266SPIRAM() { + end(); + } + void readBytes(uint32_t addr, void *destV, int count) { + uint8_t *dest = (uint8_t*)destV; + while (count > 0) { + int toRead = std::min(count, 64); + spi_readtransaction((0x03 << 24) | addr, 32 - 1, read_delay, toRead * 8 - 1, hspi_mode); + __asm("" ::: "memory"); + uint32_t work[16]; // FIFO image in RAM that we can byte address + int toCopy = (toRead + 3) / 4; // make sure all 32b values updated + for (auto i = 0; i < toCopy; i++) { + work[i] = spi1->spi_w[i]; } + memcpy(dest, work, toRead); + count -= toRead; + dest += toRead; + addr += toRead; } - - void begin(int freqMHz, int cs_pin) - { - if (freqMHz >= 40) { - spi_clkval = 0x00001001; - } else if (freqMHz >= 30) { - spi_clkval = 0x00002001; - } else if (freqMHz >= 20) { - spi_clkval = 0x00041001; - } else if (freqMHz >= 10) { - spi_clkval = 0x000c1001; - } else if (freqMHz >= 5) { - spi_clkval = 0x001c1001; - } else { - spi_clkval = 0x009c1001; + } + + void writeBytes(uint32_t addr, const void *srcV, int count) { + const uint8_t *src = (const uint8_t *)srcV; + while (count > 0) { + uint32_t work[16]; // FIFO image in RAM that we can byte address + int toWrite = std::min(count, 64); + memcpy((void *)work, src, toWrite); + int toCopy = (toWrite + 3) / 4; // make sure all 32b values updated + + // Ensure the last SPI is done so we don't overwrite unsent data + while (spi1->spi_cmd & SPIBUSY) { + delay(0); } - csPin = cs_pin; - swCS = csPin != cs; - - // Manually reset chip from DIO to SIO mode (HW SPI has issues with <8 bits/clocks total output) - digitalWrite(csPin, HIGH); - digitalWrite(mosi, HIGH); - digitalWrite(miso, HIGH); + for (auto i = 0; i < toCopy; i++) { + spi1->spi_w[i] = work[i]; + } + spi_writetransaction((0x02 << 24) | addr, 32 - 1, 0, toWrite * 8 - 1, hspi_mode); + count -= toWrite; + src += toWrite; + addr += toWrite; + } + } + + void begin(int freqMHz, int cs_pin) { + if (freqMHz >= 40) { + spi_clkval = 0x00001001; + } else if (freqMHz >= 30) { + spi_clkval = 0x00002001; + } else if (freqMHz >= 20) { + spi_clkval = 0x00041001; + } else if (freqMHz >= 10) { + spi_clkval = 0x000c1001; + } else if (freqMHz >= 5) { + spi_clkval = 0x001c1001; + } else { + spi_clkval = 0x009c1001; + } + csPin = cs_pin; + swCS = csPin != cs; + + // Manually reset chip from DIO to SIO mode (HW SPI has issues with <8 bits/clocks total output) + digitalWrite(csPin, HIGH); + digitalWrite(mosi, HIGH); + digitalWrite(miso, HIGH); + digitalWrite(sck, LOW); + pinMode(csPin, OUTPUT); + pinMode(miso, OUTPUT); + pinMode(mosi, OUTPUT); + pinMode(sck, OUTPUT); + digitalWrite(csPin, HIGH); + delay(100); + digitalWrite(csPin, LOW); + delay(1); + for (int i = 0; i < 4; i++) { + digitalWrite(sck, HIGH); + delay(1); digitalWrite(sck, LOW); - pinMode(csPin, OUTPUT); - pinMode(miso, OUTPUT); - pinMode(mosi, OUTPUT); - pinMode(sck, OUTPUT); - digitalWrite(csPin, HIGH); - delay(100); - digitalWrite(csPin, LOW); delay(1); - for (int i = 0; i < 4; i++) { - digitalWrite(sck, HIGH); - delay(1); - digitalWrite(sck, LOW); - delay(1); - } - digitalWrite(csPin, HIGH); + } + digitalWrite(csPin, HIGH); - // Set up the SPI regs - spi_init(); + // Set up the SPI regs + spi_init(); - // Enable streaming read/write mode - spi1->spi_w[0] = 0x40; - spi_writetransaction(0x01<<24, 8-1, 0, 8-1, sio); + // Enable streaming read/write mode + spi1->spi_w[0] = 0x40; + spi_writetransaction(0x01 << 24, 8 - 1, 0, 8 - 1, sio); - if (hspi_mode == dio) { - // Ramp up to DIO mode - spi_writetransaction(0x3b<<24, 8-1, 0, 0, sio); - spi1->spi_ctrl |= SPICDIO | SPICFASTRD; - } + if (hspi_mode == dio) { + // Ramp up to DIO mode + spi_writetransaction(0x3b << 24, 8 - 1, 0, 0, sio); + spi1->spi_ctrl |= SPICDIO | SPICFASTRD; } + } - void end() - { - pinMode(csPin, INPUT); - pinMode(miso, INPUT); - pinMode(mosi, INPUT); - pinMode(sck, INPUT); - } + void end() { + pinMode(csPin, INPUT); + pinMode(miso, INPUT); + pinMode(mosi, INPUT); + pinMode(sck, INPUT); + } }; @@ -248,120 +249,114 @@ class ESP8266SPIRAM { #include class ESP8266SPIRAM { - private: - uint8_t csPin; - uint32_t freq; - - // The standard HSPI bus pins are used - static constexpr uint8_t miso = 12; - static constexpr uint8_t mosi = 13; - static constexpr uint8_t sck = 14; - - public: - ESP8266SPIRAM() - { - /* noop */ - } - ~ESP8266SPIRAM() - { - end(); - } - void readBytes(uint32_t addr, void *destV, int count) - { - uint8_t *dest = (uint8_t *)destV; - SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); - pinMode(csPin, OUTPUT); - digitalWrite(csPin, LOW); - uint32_t cmd = (0x03 << 24) | (addr & ((1<<24)-1)); - SPI.transfer((uint8_t)(cmd >> 24)); - SPI.transfer((uint8_t)(cmd >> 16)); - SPI.transfer((uint8_t)(cmd >> 8)); - SPI.transfer((uint8_t)(cmd >> 0)); - while (count--) { - *(dest++) = SPI.transfer((uint8_t)0); - } - pinMode(csPin, OUTPUT); - digitalWrite(csPin, HIGH); - SPI.endTransaction(); +private: + uint8_t csPin; + uint32_t freq; + + // The standard HSPI bus pins are used + static constexpr uint8_t miso = 12; + static constexpr uint8_t mosi = 13; + static constexpr uint8_t sck = 14; + +public: + ESP8266SPIRAM() { + /* noop */ + } + ~ESP8266SPIRAM() { + end(); + } + void readBytes(uint32_t addr, void *destV, int count) { + uint8_t *dest = (uint8_t *)destV; + SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, LOW); + uint32_t cmd = (0x03 << 24) | (addr & ((1 << 24) - 1)); + SPI.transfer((uint8_t)(cmd >> 24)); + SPI.transfer((uint8_t)(cmd >> 16)); + SPI.transfer((uint8_t)(cmd >> 8)); + SPI.transfer((uint8_t)(cmd >> 0)); + while (count--) { + *(dest++) = SPI.transfer((uint8_t)0); } - - void writeBytes(uint32_t addr, const void *srcV, int count) - { - const uint8_t *src = (const uint8_t *)srcV; - SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); - pinMode(csPin, OUTPUT); - digitalWrite(csPin, LOW); - uint32_t cmd = (0x02 << 24) | (addr & ((1<<24)-1)); - SPI.transfer((uint8_t)(cmd >> 24)); - SPI.transfer((uint8_t)(cmd >> 16)); - SPI.transfer((uint8_t)(cmd >> 8)); - SPI.transfer((uint8_t)(cmd >> 0)); - while (count--) { - SPI.transfer((uint8_t)*(src++)); - } - pinMode(csPin, OUTPUT); - digitalWrite(csPin, HIGH); - SPI.endTransaction(); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, HIGH); + SPI.endTransaction(); + } + + void writeBytes(uint32_t addr, const void *srcV, int count) { + const uint8_t *src = (const uint8_t *)srcV; + SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, LOW); + uint32_t cmd = (0x02 << 24) | (addr & ((1 << 24) - 1)); + SPI.transfer((uint8_t)(cmd >> 24)); + SPI.transfer((uint8_t)(cmd >> 16)); + SPI.transfer((uint8_t)(cmd >> 8)); + SPI.transfer((uint8_t)(cmd >> 0)); + while (count--) { + SPI.transfer((uint8_t) * (src++)); } - - void begin(int freqMHz, int cs_pin) - { - csPin = cs_pin; - freq = freqMHz * 1000000; - - SPI.begin(); - - // Manually reset chip from DIO to SIO mode (HW SPI has issues with <8 bits/clocks total output) - digitalWrite(csPin, HIGH); - digitalWrite(mosi, HIGH); - digitalWrite(miso, HIGH); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, HIGH); + SPI.endTransaction(); + } + + void begin(int freqMHz, int cs_pin) { + csPin = cs_pin; + freq = freqMHz * 1000000; + + SPI.begin(); + + // Manually reset chip from DIO to SIO mode (HW SPI has issues with <8 bits/clocks total output) + digitalWrite(csPin, HIGH); + digitalWrite(mosi, HIGH); + digitalWrite(miso, HIGH); + digitalWrite(sck, LOW); + pinMode(csPin, OUTPUT); + pinMode(miso, OUTPUT); + pinMode(mosi, OUTPUT); + pinMode(sck, OUTPUT); + digitalWrite(csPin, HIGH); + delay(100); + digitalWrite(csPin, LOW); + delay(1); + for (int i = 0; i < 4; i++) { + digitalWrite(sck, HIGH); + delay(1); digitalWrite(sck, LOW); - pinMode(csPin, OUTPUT); - pinMode(miso, OUTPUT); - pinMode(mosi, OUTPUT); - pinMode(sck, OUTPUT); - digitalWrite(csPin, HIGH); - delay(100); - digitalWrite(csPin, LOW); delay(1); - for (int i = 0; i < 4; i++) { - digitalWrite(sck, HIGH); - delay(1); - digitalWrite(sck, LOW); - delay(1); - } - digitalWrite(csPin, HIGH); - - pinMode(sck, SPECIAL); - pinMode(miso, SPECIAL); - pinMode(mosi, SPECIAL); - pinMode(csPin, OUTPUT); - - // Enable streaming read/write mode - SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); - pinMode(csPin, OUTPUT); - digitalWrite(csPin, LOW); - SPI.transfer((uint8_t) 0x01); - SPI.transfer((uint8_t) 0x40); - pinMode(csPin, OUTPUT); - digitalWrite(csPin, HIGH); - SPI.endTransaction(); - pinMode(csPin, OUTPUT); - digitalWrite(csPin, HIGH); - } - - void end() - { - pinMode(csPin, INPUT); - pinMode(miso, INPUT); - pinMode(mosi, INPUT); - pinMode(sck, INPUT); - SPI.end(); } + digitalWrite(csPin, HIGH); + + pinMode(sck, OUTPUT); + pinMode(miso, INPUT); + pinMode(mosi, OUTPUT); + pinMode(csPin, OUTPUT); + + // Enable streaming read/write mode + SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0)); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, LOW); + SPI.transfer((uint8_t) 0x01); + SPI.transfer((uint8_t) 0x40); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, HIGH); + SPI.endTransaction(); + pinMode(csPin, OUTPUT); + digitalWrite(csPin, HIGH); + } + + void end() { + pinMode(csPin, INPUT); + pinMode(miso, INPUT); + pinMode(mosi, INPUT); + pinMode(sck, INPUT); + SPI.end(); + } }; #endif // ESP32 -#endif \ No newline at end of file +#endif diff --git a/tests/astyle_core.conf b/tests/astyle_core.conf new file mode 100644 index 00000000..720ee1b7 --- /dev/null +++ b/tests/astyle_core.conf @@ -0,0 +1,32 @@ +# Code formatting rules for Arduino examples, taken from: +# +# https://github.com/arduino/Arduino/blob/master/build/shared/examples_formatter.conf +# + +mode=c +lineend=linux +style=java + +# 4 spaces indentation +indent=spaces=4 + +# also indent macros +#indent-preprocessor + +# indent classes, switches (and cases), comments starting at column 1 +indent-col1-comments + +# put a space around operators +pad-oper + +# put a space after if/for/while +pad-header + +# if you like one-liners, keep them +keep-one-line-statements + +attach-closing-while +unpad-paren +pad-oper +remove-comment-prefix +add-braces diff --git a/tests/astyle_examples.conf b/tests/astyle_examples.conf new file mode 100644 index 00000000..f3b77f2c --- /dev/null +++ b/tests/astyle_examples.conf @@ -0,0 +1,44 @@ +# Code formatting rules for Arduino examples, taken from: +# +# https://github.com/arduino/Arduino/blob/master/build/shared/examples_formatter.conf +# + +mode=c +lineend=linux + +# 2 spaces indentation +indent=spaces=2 + +# also indent macros +#indent-preprocessor + +# indent classes, switches (and cases), comments starting at column 1 +indent-classes +indent-switches +indent-cases +indent-col1-comments + +# put a space around operators +pad-oper + +# put a space after if/for/while +pad-header + +# if you like one-liners, keep them +keep-one-line-statements +add-braces + +style=java +attach-namespaces +attach-classes +attach-inlines +attach-extern-c +indent-modifiers +indent-namespaces +indent-labels +#indent-preproc-block +#indent-preproc-define +#indent-preproc-cond +unpad-paren +add-braces +remove-comment-prefix \ No newline at end of file diff --git a/tests/build-ci.sh b/tests/build-ci.sh new file mode 100755 index 00000000..ceaa04d0 --- /dev/null +++ b/tests/build-ci.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +set -e +set -o pipefail + +outdir=$1; shift +offset=$1; shift +fqbn=$1; shift +werror=$1; shift + +mkdir $outdir +rm -f *.elf + +# Get initial list and shift off to the starting point +sketches=$(find ~/Arduino/libraries/ESP8266Audio/examples -name "*.ino" | sort | tr '\n' ' ' | cut -f$offset -d " ") + +# Iterate over sketches +while [ $(echo $sketches | wc -w) -gt 0 ]; do + sketch=$(echo $sketches | cut -f1 -d " ") + echo "::group::Compiling $(basename $sketch) for $fqbn into $outdir" + if [ 0"$werror" -gt 0 ]; then + ./arduino-cli compile -b "$fqbn" -v --warnings all \ + --build-property "compiler.c.extra_flags=-Wall -Wextra -Werror -Wno-ignored-qualifiers" \ + --build-property "compiler.cpp.extra_flags=-Wall -Wextra -Werror -Wno-ignored-qualifiers -Wno-overloaded-virtual" \ + --build-path "$outdir" "$sketch" || exit 255 + else + ./arduino-cli compile -b "$fqbn" -v --warnings all --build-path "$outdir" "$sketch" || exit 255 + fi + mv -f "$outdir"/*.elf . + echo "::endgroup::" + # Shift out 5 + if [ $(echo $sketches | wc -w) -gt 5 ]; then + sketches=$(echo $sketches | cut -f6- -d " ") + else + sketches="" + fi +done + +echo "::group::Final Sizes" +size ./*.elf +echo "::endgroup::" diff --git a/tests/common.sh b/tests/common.sh index c54e6757..518d7db8 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -1,100 +1,27 @@ #!/usr/bin/env bash -#set -x # echo on - -function print_size_info() -{ - elf_file=$1 - - if [ -z "$elf_file" ]; then - printf "sketch data rodata bss text irom0.text dram flash\n" - return 0 - fi - - elf_name=$(basename $elf_file) - sketch_name="${elf_name%.*}" - # echo $sketch_name - declare -A segments - while read -a tokens; do - seg=${tokens[0]} - seg=${seg//./} - size=${tokens[1]} - addr=${tokens[2]} - if [ "$addr" -eq "$addr" -a "$addr" -ne "0" ] 2>/dev/null; then - segments[$seg]=$size - fi - - - done < <(xtensa-lx106-elf-size --format=sysv $elf_file) - - total_ram=$((${segments[data]} + ${segments[rodata]} + ${segments[bss]})) - total_flash=$((${segments[data]} + ${segments[rodata]} + ${segments[text]} + ${segments[irom0text]})) - - printf "%-28s %-8d %-8d %-8d %-8d %-8d %-8d %-8d\n" $sketch_name ${segments[data]} ${segments[rodata]} ${segments[bss]} ${segments[text]} ${segments[irom0text]} $total_ram $total_flash - return 0 -} - -function build_sketches() -{ - set +e - local arduino=$1 - local srcpath=$2 - local build_arg=$3 - local build_dir=build.tmp - mkdir -p $build_dir - local build_cmd="python3 $arduino/$BUILD_PY -p $PWD/$build_dir $build_arg " - local sketches=$(find $srcpath -name *.ino) - print_size_info >size.log - export ARDUINO_IDE_PATH=$arduino - for sketch in $sketches; do - rm -rf $build_dir/* - local sketchdir=$(dirname $sketch) - local sketchdirname=$(basename $sketchdir) - local sketchname=$(basename $sketch) - if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then - echo "Skipping $sketch, beacause it is not the main sketch file"; - continue - fi; - if [[ -f "$sketchdir/.test.skip" ]]; then - echo -e "\n ------------ Skipping $sketch ------------ \n"; - continue - fi - echo -e "\n ------------ Building $sketch ------------ \n"; - # $arduino --verify $sketch; - echo "$build_cmd $sketch" - time ($build_cmd $sketch >build.log) - local result=$? - if [ $result -ne 0 ]; then - echo "Build failed ($1)" - echo "Build log:" - cat build.log - set -e - return $result - fi - rm build.log - #print_size_info $build_dir/*.elf >>size.log - done - set -e -} +set -ex function install_libraries() { mkdir -p $HOME/Arduino/libraries - cp -a $TRAVIS_BUILD_DIR $HOME/Arduino/libraries/ESP8266Audio + cp -a $GITHUB_WORKSPACE $HOME/Arduino/libraries/ESP8266Audio git clone https://github.com/earlephilhower/ESP8266SAM $HOME/Arduino/libraries/ESP8266SAM - git clone https://github.com/earlephilhower/ESP8266FastROMFS $HOME/Arduino/libraries/ESP8266FastROMFS - git clone https://github.com/Gianbacchio/ESP8266_Spiram $HOME/Arduino/libraries/ESP8266_Spiram - # Following libs are not to be tested, just used. - rm -rf $HOME/Arduino/libraries/ESP8266_Spiram/examples - rm -rf $HOME/Arduino/libraries/ESP8266FastROMFS/examples } function install_ide() { local ide_path=$1 - wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz + wget -q -O arduino.tar.xz https://downloads.arduino.cc/arduino-nightly-linux64.tar.xz tar xf arduino.tar.xz mv arduino-nightly $ide_path + export PATH="$ide_path:$PATH" +} + +function install_esp8266() +{ + local ide_path=$1 + mkdir -p $ide_path/hardware cd $ide_path/hardware mkdir esp8266com cd esp8266com @@ -103,85 +30,128 @@ function install_ide() # Set custom warnings for all builds (i.e. could add -Wextra at some point) echo "compiler.c.extra_flags=-Wall -Wextra -Werror $debug_flags" > ../platform.local.txt echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror $debug_flags" >> ../platform.local.txt + echo "mkbuildoptglobals.extra_flags=--ci --cache_core" >> ../platform.local.txt echo -e "\n----platform.local.txt----" cat ../platform.local.txt git submodule init git submodule update - python3 get.py - export PATH="$ide_path:$ide_path/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/bin:$PATH" + python3 get.py -q + export PATH="$ide_path/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/bin:$PATH" popd -# cd .. -# mkdir espressif -# cd espressif -# git clone https://github.com/espressif/arduino-esp32 esp32 -# pushd esp32/tools -# git submodule init -# git submodule update -# python3 get.py -# export PATH="$ide_path:$ide_path/hardware/espressif/esp32/tools/xtensa-esp32-elf/bin:$PATH" -# popd + cd esp8266 } -function run_host_tests() +function install_rp2040() { - pushd host - make - make clean-objects + local ide_path=$1 + mkdir -p $ide_path/hardware + cd $ide_path/hardware + mkdir pico + cd pico + git clone https://github.com/earlephilhower/arduino-pico rp2040 + pushd rp2040/tools + # Set custom warnings for all builds (i.e. could add -Wextra at some point) + echo "compiler.c.extra_flags=-Wall -Wextra -Werror $debug_flags" > ../platform.local.txt + echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror $debug_flags" >> ../platform.local.txt + echo -e "\n----platform.local.txt----" + cat ../platform.local.txt + git submodule update --init + cd ../pico-sdk + git submodule update --init + cd ../tools + python3 get.py -q + export PATH="$ide_path/hardware/pico/rp2040/system/arm-none-eabi/bin:$PATH" popd + cd rp2040 } +function install_esp32() +{ + local ide_path=$1 + pip install pyserial + pip3 install pyserial + mkdir -p ~/bin + pushd ~/bin + wget -q https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_64bit.tar.gz + tar xvf arduino-cli_latest_Linux_64bit.tar.gz + export PATH=$PATH:$PWD + popd + arduino-cli core install --additional-urls https://espressif.github.io/arduino-esp32/package_esp32_index.json esp32:esp32 +} function install_arduino() { # Install Arduino IDE and required libraries - echo -e "travis_fold:start:sketch_test_env_prepare" - cd $TRAVIS_BUILD_DIR - install_ide $HOME/arduino_ide $TRAVIS_BUILD_DIR + cd "$GITHUB_WORKSPACE" + install_ide "$HOME/arduino_ide" "$GITHUB_WORKSPACE" which arduino - cd $TRAVIS_BUILD_DIR + cd "$GITHUB_WORKSPACE" install_libraries - echo -e "travis_fold:end:sketch_test_env_prepare" } -function build_sketches_with_arduino() +function skip_esp32() { - # Compile sketches - echo -e "travis_fold:start:sketch_test" -# build_sketches $HOME/arduino_ide $TRAVIS_BUILD_DIR/libraries "-l $HOME/Arduino/libraries" - build_sketches $HOME/arduino_ide $HOME/Arduino/libraries "-l $HOME/Arduino/libraries" - echo -e "travis_fold:end:sketch_test" + local ino=$1 + local skiplist="" + # Add items to the following list with "\n" netween them to skip running. No spaces, tabs, etc. allowed + read -d '' skiplist << EOL || true +/MixerSample/ +EOL + echo $ino | grep -q -F "$skiplist" + echo $(( 1 - $? )) +} - # Generate size report - echo -e "travis_fold:start:size_report" - cat size.log - echo -e "travis_fold:end:size_report" +# ESP8266 CI infra +function skip_sketch() +{ + local sketch=$1 + local sketchname=$2 + local sketchdir=$3 + local sketchdirname=$4 + + if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then + echo "Skipping $sketch (not the main sketch file)" + fi + if skip_ino "$sketch" || [[ -f "$sketchdir/.test.skip" ]]; then + echo "Skipping $sketch" + fi } -set -e +if [ "$BUILD_MOD" == "" ]; then + export BUILD_MOD=1 + export BUILD_REM=0 +fi +export cache_dir=$(mktemp -d) if [ "$BUILD_TYPE" = "build" ]; then - export BUILD_PY="hardware/esp8266com/esp8266/tools/build.py -b generic -s 4M1M -v -k " install_arduino - build_sketches_with_arduino + install_esp8266 "$HOME/arduino_ide" + source "$HOME/arduino_ide/hardware/esp8266com/esp8266/tests/common.sh" + export ESP8266_ARDUINO_SKETCHES=$(find $HOME/Arduino/libraries/ESP8266Audio -name *.ino | sort) + # ESP8266 scripts now expect tools in wrong spot. Use simple and dumb fix + mkdir -p "$HOME/work/ESP8266Audio/ESP8266Audio" + ln -s "$HOME/arduino_ide/hardware/esp8266com/esp8266/tools" "$HOME/work/ESP8266Audio/ESP8266Audio/tools" + mkdir -p /home/runner/work/ESP8266Audio/ESP8266Audio/tools/xtensa-lx106-elf/bin/ + ln -s $HOME/arduino_ide/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/bin/xtensa-lx106-elf-size /home/runner/work/ESP8266Audio/ESP8266Audio/tools/xtensa-lx106-elf/bin/. + build_sketches "$TRAVIS_BUILD_DIR" "$HOME/arduino_ide" "$HOME/arduino_ide/hardware" "$HOME/Arduino/libraries" "$BUILD_MOD" "$BUILD_REM" "lm2f" elif [ "$BUILD_TYPE" = "build_esp32" ]; then - #export BUILD_PY="hardware/espressif/esp32/tools/build.py -b esp32 -v -k " - #install_arduino - #build_sketches_with_arduino - sudo apt-get update - sudo apt-get upgrade -y python - sudo pip install --upgrade pip - sudo pip install --upgrade 'urllib3[secure]' - export ide_path=$HOME/arduino_ide install_arduino - export FQBN="espressif:esp32:esp32:PSRAM=enabled,PartitionScheme=huge_app" - export GITHUB_WORKSPACE="$TRAVIS_BUILD_DIR" - export GITHUB_REPOSITORY="$TRAVIS_REPO_SLUG" - source $ide_path/hardware/espressif/esp32/.github/scripts/install-arduino-ide.sh - source $ide_path/hardware/espressif/esp32/.github/scripts/install-arduino-core-esp32.sh - build_sketches "$FQBN" "$HOME/Arduino/libraries" 0 1 -elif [ "$BUILD_TYPE" = "host_tests" ]; then - # Run host side tests - cd $TRAVIS_BUILD_DIR/tests - run_host_tests + install_esp32 "$HOME/arduino_ide" + export testcnt=0 + for i in $(find ~/Arduino/libraries/ESP8266Audio -name "*.ino"); do + testcnt=$(( ($testcnt + 1) % $BUILD_MOD )) + if [ $testcnt -ne $BUILD_REM ]; then + continue # Not ours to do + fi + if [[ $(skip_esp32 $i) = 1 ]]; then + echo -e "\n ------------ Skipping $i ------------ \n"; + continue + fi + arduino-cli compile --fqbn esp32:esp32:esp32 --warnings all $i + done +elif [ "$BUILD_TYPE" = "build_rp2040" ]; then + install_arduino + install_rp2040 "$HOME/arduino_ide" + source "$HOME/arduino_ide/hardware/pico/rp2040/tests/common.sh" + build_sketches "$HOME/arduino_ide" "$TRAVIS_BUILD_DIR" "-l $HOME/Arduino/libraries" "$BUILD_MOD" "$BUILD_REM" fi - diff --git a/tests/host/Makefile b/tests/host/Makefile index 6a6eb821..c25430cc 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -1,4 +1,3 @@ -all: mp3 aac wav libmad=../../src/libmad/decoder.c ../../src/libmad/frame.c ../../src/libmad/bit.c ../../src/libmad/stream.c ../../src/libmad/fixed.c \ ../../src/libmad/timer.c ../../src/libmad/layer3.c ../../src/libmad/synth.c ../../src/libmad/huffman.c ../../src/libmad/version.c @@ -21,19 +20,23 @@ libhelix_aac=../../src/libhelix-aac/decelmnt.c ../../src/libhelix-aac/dct4.c ../ ../../src/libhelix-aac/trigtabs.c ../../src/libhelix-aac/fft.c ../../src/libhelix-aac/pns.c ../../src/libhelix-aac/sbrfreq.c \ ../../src/libhelix-aac/sbrside.c ../../src/libhelix-aac/sbrhfadj.c ../../src/libhelix-aac/buffers.c ../../src/libhelix-aac/bitstream.c \ ../../src/libhelix-aac/noiseless.c ../../src/libhelix-aac/imdct.c ../../src/libhelix-aac/aacdec.c ../../src/libhelix-aac/sbrhfgen.c \ -../../src/libhelix-aac/sbrqmf.c ../../src/libhelix-aac/huffman.c ../../src/libhelix-aac/sbr.c ../../src/libhelix-aac/sbrimdct.c +../../src/libhelix-aac/sbrqmf.c ../../src/libhelix-aac/huffmanaac.c ../../src/libhelix-aac/sbr.c ../../src/libhelix-aac/sbrimdct.c libflac=../../src/libflac/md5.c ../../src/libflac/window.c ../../src/libflac/memory.c ../../src/libflac/cpu.c ../../src/libflac/fixed.c \ ../../src/libflac/format.c ../../src/libflac/lpc.c ../../src/libflac/crc.c ../../src/libflac/bitreader.c ../../src/libflac/bitmath.c \ ../../src/libflac/stream_decoder.c ../../src/libflac/float.c +libflac=../../src/libflac/md5.c ../../src/libflac/window.c ../../src/libflac/memory.c ../../src/libflac/cpu.c \ +../../src/libflac/fixed.c ../../src/libflac/format.c ../../src/libflac/lpc.c ../../src/libflac/crc.c \ +../../src/libflac/bitreader.c ../../src/libflac/bitmath.c ../../src/libflac/stream_decoder.c ../../src/libflac/float.c -CCOPTS=-g -Wunused-parameter -Wall -m32 -include Arduino.h -CPPOPTS=-g -Wunused-parameter -Wall -std=c++11 -m32 -include Arduino.h + +CCOPTS=-g -Wunused-parameter -Wall -m32 -include Arduino.h -Wstack-usage=300 +CPPOPTS=-g -Wunused-parameter -Wall -std=c++11 -m32 -Wstack-usage=300 -include Arduino.h .phony: all -all: mp3 aac wav +all: mp3 aac wav midi opus flac mod mp3: FORCE rm -f *.o @@ -49,13 +52,39 @@ aac: FORCE rm -f *.o echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./aac +flac: FORCE + rm -f *.o + gcc $(CCOPTS) -DUSE_DEFAULT_STDLIB -c $(libflac) -I ../../src/ -I ../../src/libflac -I. + g++ $(CPPOPTS) -o flac flac.cpp Serial.cpp *.o ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioFileSourceID3.cpp ../../src/AudioGeneratorFLAC.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. + rm -f *.o + echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./flac + +mod: FORCE + rm -f *.o + g++ $(CPPOPTS) -o mod mod.cpp Serial.cpp ../../src/AudioFileSourcePROGMEM.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioGeneratorMOD.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. + rm -f *.o + echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./mod + wav: FORCE rm -f *.o g++ $(CPPOPTS) -o wav wav.cpp Serial.cpp ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioGeneratorWAV.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. rm -f *.o echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./wav +midi: FORCE + rm -f *.o + g++ $(CPPOPTS) -o midi midi.cpp Serial.cpp ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioGeneratorMIDI.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. + rm -f *.o + echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./midi + +opus: FORCE + rm -f *.o + find ../../src/libopus -name *.c -exec gcc $(CCOPTS) -DUSE_DEFAULT_STDLIB -c \{\} -I ../../src/ -I. \; + g++ $(CPPOPTS) -o opus opus.cpp Serial.cpp *.o ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioGeneratorOpus.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. + rm -f *.o + echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./opus + clean: - rm -f mp3 aac wav *.o + rm -f mp3 aac wav midi opus flac mod *.o FORCE: diff --git a/tests/host/aac.cpp b/tests/host/aac.cpp index a9a99b93..fd7a3a03 100644 --- a/tests/host/aac.cpp +++ b/tests/host/aac.cpp @@ -3,13 +3,15 @@ #include "AudioOutputSTDIO.h" #include "AudioGeneratorAAC.h" +#define AAC "../../examples/PlayAACFromPROGMEM/homer.aac" + int main(int argc, char **argv) { (void) argc; (void) argv; - AudioFileSourceSTDIO *in = new AudioFileSourceSTDIO("jamonit.aac"); + AudioFileSourceSTDIO *in = new AudioFileSourceSTDIO(AAC); AudioOutputSTDIO *out = new AudioOutputSTDIO(); - out->SetFilename("jamonit.aac.wav"); + out->SetFilename("out.aac.wav"); void *space = malloc(28000+60000); AudioGeneratorAAC *aac = new AudioGeneratorAAC(space, 28000+60000); diff --git a/tests/host/flac.cpp b/tests/host/flac.cpp new file mode 100644 index 00000000..2d7110da --- /dev/null +++ b/tests/host/flac.cpp @@ -0,0 +1,24 @@ +#include +#include "AudioFileSourceSTDIO.h" +#include "AudioOutputSTDIO.h" +#include "AudioGeneratorFLAC.h" + +#define AAC "gs-16b-2c-44100hz.flac" + +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + AudioFileSourceSTDIO *in = new AudioFileSourceSTDIO(AAC); + AudioOutputSTDIO *out = new AudioOutputSTDIO(); + out->SetFilename("out.flac.wav"); + AudioGeneratorFLAC *flac = new AudioGeneratorFLAC(); + + flac->begin(in, out); + while (flac->loop()) { /*noop*/ } + flac->stop(); + + delete flac; + delete out; + delete in; +} diff --git a/tests/host/gs-16b-2c-44100hz.flac b/tests/host/gs-16b-2c-44100hz.flac new file mode 100644 index 00000000..17713214 Binary files /dev/null and b/tests/host/gs-16b-2c-44100hz.flac differ diff --git a/tests/host/midi.cpp b/tests/host/midi.cpp new file mode 100644 index 00000000..5d67b510 --- /dev/null +++ b/tests/host/midi.cpp @@ -0,0 +1,30 @@ +#include +#include "AudioFileSourceSTDIO.h" +#include "AudioOutputSTDIO.h" +#include "AudioGeneratorMIDI.h" + +#define MIDI "../../lib/midi-sources/furelise.mid" +#include + +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + AudioFileSourceSTDIO *midifile = new AudioFileSourceSTDIO(MIDI); +// AudioFileSourceSTDIO *sf2file = new AudioFileSourceSTDIO(SF2); + AudioOutputSTDIO *out = new AudioOutputSTDIO(); + out->SetFilename("midi.wav"); + AudioGeneratorMIDI *midi = new AudioGeneratorMIDI(); + + midi->SetSoundFont(&_tsf); + midi->SetSampleRate(22050); + + midi->begin(midifile, out); + while (midi->loop()) { /*noop*/ } + midi->stop(); + + delete out; + delete midi; + delete midifile; +// delete sf2file; +} diff --git a/tests/host/mod.cpp b/tests/host/mod.cpp new file mode 100644 index 00000000..18da2ce3 --- /dev/null +++ b/tests/host/mod.cpp @@ -0,0 +1,26 @@ +#include +#include "AudioFileSourcePROGMEM.h" +#include "AudioOutputSTDIO.h" +#include "AudioGeneratorMOD.h" + +#include "../../examples/PlayMODFromPROGMEMToDAC/enigma.h" + +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + + AudioFileSourcePROGMEM *file = new AudioFileSourcePROGMEM(enigma_mod, sizeof(enigma_mod)); + AudioOutputSTDIO *out = new AudioOutputSTDIO(); + out->SetFilename("mod.wav"); + AudioGeneratorMOD *mod = new AudioGeneratorMOD(); + + mod->begin(file, out); + // The MOD plays forever, so only run for ~30 seconds worth + for (int i=0; i<10000; i++) mod->loop(); + mod->stop(); + + delete out; + delete mod; + delete file; +} diff --git a/tests/host/opus.cpp b/tests/host/opus.cpp new file mode 100644 index 00000000..861e833d --- /dev/null +++ b/tests/host/opus.cpp @@ -0,0 +1,25 @@ +#include +#include "AudioFileSourceSTDIO.h" +#include "AudioOutputSTDIO.h" +#include "AudioGeneratorOpus.h" + +#define OPUS "../../examples/PlayOpusFromLittleFS/data/gs-16b-2c-44100hz.opus" + +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + + AudioFileSourceSTDIO *file = new AudioFileSourceSTDIO(OPUS); + AudioOutputSTDIO *out = new AudioOutputSTDIO(); + out->SetFilename("opus.wav"); + AudioGeneratorOpus *opus = new AudioGeneratorOpus(); + + opus->begin(file, out); + while (opus->loop()) { /*noop*/ } + opus->stop(); + + delete out; + delete opus; + delete file; +} diff --git a/tests/host/pgmspace.h b/tests/host/pgmspace.h new file mode 100644 index 00000000..e69de29b diff --git a/tests/host/test_8u_16.wav b/tests/host/test_8u_16.wav new file mode 100644 index 00000000..b5827409 Binary files /dev/null and b/tests/host/test_8u_16.wav differ diff --git a/tests/host/wav.cpp b/tests/host/wav.cpp index f428fd2b..15ed3a7c 100644 --- a/tests/host/wav.cpp +++ b/tests/host/wav.cpp @@ -16,7 +16,6 @@ int main(int argc, char **argv) wav->begin(in, out); while (wav->loop()) { /*noop*/ } wav->stop(); - out->stop(); delete wav; delete out; diff --git a/tests/restyle.sh b/tests/restyle.sh new file mode 100755 index 00000000..0597ad75 --- /dev/null +++ b/tests/restyle.sh @@ -0,0 +1,4 @@ +#!/bin/bash +find ./src -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" \) -a \! -path '*api*' -a \! -path '*libespeak-ng*' -a \! -path '*libopus*' -a \! -path '*libtinysoundfont*' -exec astyle --suffix=none --options=./tests/astyle_core.conf \{\} \; +find ./examples -type f -name "*.ino" -exec astyle --suffix=none --options=./tests/astyle_examples.conf \{\} \; + diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..b02acdc0 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,16 @@ +Publishing New Releases +======================= + +First, update the version number throughout the repo and push the change: + + ./tools/makever.py --version X.Y.Z + git commit -a -m "Update version" + git push + +Then tag it + + git tag X.Y.Z + git push origin X.Y.Z + +Then on the GH web interface it will generate a draft release from that tag +that can be released if proper through the GUI. diff --git a/tools/makever.py b/tools/makever.py new file mode 100755 index 00000000..d077cad6 --- /dev/null +++ b/tools/makever.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +import sys +import struct +import subprocess +import re +import os +import os.path +import argparse +import time +import shutil +import json + +def main(): + parser = argparse.ArgumentParser(description='Version updater') + parser.add_argument('-v', '--version', action='store', required=True, help='Version in X.Y.Z form') + args = parser.parse_args() + + major, minor, sub = args.version.split(".") + # Silly way to check for integer x.y.z + major = int(major) + minor = int(minor) + sub = int(sub) + + # library.properties + with open("library.properties", "r") as fin: + with open("library.properties.new", "w") as fout: + for l in fin: + if l.startswith("version="): + l = "version=" + str(args.version) + "\n" + fout.write(l); + shutil.move("library.properties.new", "library.properties") + + # package.json + with open("library.json", "r") as fin: + library = json.load(fin); + library["version"] = str(args.version); + with open("library.json.new", "w") as fout: + json.dump(library, fout, indent = 4); + shutil.move("library.json.new", "library.json") + + # src/ESP8266AudioVer.h + with open("src/ESP8266AudioVer.h", "w") as fout: + fout.write("#pragma once\n") + fout.write("#define ESP8266AUDIO_MAJOR " + str(major) + "\n") + fout.write("#define ESP8266AUDIO_MINOR " + str(minor) + "\n") + fout.write("#define ESP8266AUDIO_REVISION " + str(sub) + "\n") + fout.write('#define ESP8266AUDIO_VERSION_STR "' + str(args.version) + '"' + "\n") + +main()